From 22b0cc9ff2b0da3e0d2a0955d88680138b6f1fec Mon Sep 17 00:00:00 2001 From: Daniel King Date: Fri, 19 Jan 2018 12:16:04 -0500 Subject: [PATCH 01/83] Update FastaSequenceIndex.java --- src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java index 3668fe6718..2b3a4857b3 100644 --- a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java +++ b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java @@ -225,7 +225,7 @@ public int size() { /** * Hold an individual entry in a fasta sequence index file. */ -class FastaSequenceIndexEntry { +public class FastaSequenceIndexEntry { private String contig; private long location; private long size; From 6e512617fe140885b25b21adc10fb13d74f4ecf2 Mon Sep 17 00:00:00 2001 From: Daniel King Date: Wed, 24 Jan 2018 13:41:19 -0500 Subject: [PATCH 02/83] move FastaSequenceIndexEntry to a separate file and make it public --- .../reference/FastaSequenceIndex.java | 125 ------------- .../reference/FastaSequenceIndexEntry.java | 167 ++++++++++++++++++ 2 files changed, 167 insertions(+), 125 deletions(-) create mode 100644 src/main/java/htsjdk/samtools/reference/FastaSequenceIndexEntry.java diff --git a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java index 2b3a4857b3..e9907b2de8 100644 --- a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java +++ b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java @@ -221,128 +221,3 @@ public int size() { return sequenceEntries.size(); } } - -/** - * Hold an individual entry in a fasta sequence index file. - */ -public 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/FastaSequenceIndexEntry.java b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndexEntry.java new file mode 100644 index 0000000000..a57f09ee5a --- /dev/null +++ b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndexEntry.java @@ -0,0 +1,167 @@ +/* + * 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.io.OutputStream; +// import java.io.PrintStream; +// import java.nio.file.Files; +// 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; + +/** + * Hold an individual entry in a fasta sequence index file. + */ +public 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(); + } +} From 13acfcc9fdcf438ebfc98ed606b57a5f2e4a99fd Mon Sep 17 00:00:00 2001 From: Daniel King Date: Wed, 24 Jan 2018 13:42:12 -0500 Subject: [PATCH 03/83] cleanup --- .../reference/FastaSequenceIndexEntry.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndexEntry.java b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndexEntry.java index a57f09ee5a..f8bbf4e157 100644 --- a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndexEntry.java +++ b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndexEntry.java @@ -24,23 +24,6 @@ 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.io.OutputStream; -// import java.io.PrintStream; -// import java.nio.file.Files; -// 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; - /** * Hold an individual entry in a fasta sequence index file. */ From 88edbf3e906666f22aa1e759d91208296ab503f9 Mon Sep 17 00:00:00 2001 From: Anton Mazur Date: Thu, 25 Jan 2018 19:03:58 +0300 Subject: [PATCH 04/83] Added filters to output of VariantContext.toString() #833 (#1074) adds filter status to VariantContext.toString() closes #833 --- .../variant/variantcontext/VariantContext.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantContext.java b/src/main/java/htsjdk/variant/variantcontext/VariantContext.java index 6def89ef9c..a45c9ea167 100644 --- a/src/main/java/htsjdk/variant/variantcontext/VariantContext.java +++ b/src/main/java/htsjdk/variant/variantcontext/VariantContext.java @@ -1448,32 +1448,35 @@ public String toString() { } public String toStringDecodeGenotypes() { - return String.format("[VC %s @ %s Q%s of type=%s alleles=%s attr=%s GT=%s", + return String.format("[VC %s @ %s Q%s of type=%s alleles=%s attr=%s GT=%s filters=%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()); + this.getGenotypes(), + String.join(",", commonInfo.getFilters())); } private String toStringUnparsedGenotypes() { - return String.format("[VC %s @ %s Q%s of type=%s alleles=%s attr=%s GT=%s", + return String.format("[VC %s @ %s Q%s of type=%s alleles=%s attr=%s GT=%s filters=%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()); + ((LazyGenotypesContext)this.genotypes).getUnparsedGenotypeData(), + String.join(",", commonInfo.getFilters())); } public String toStringWithoutGenotypes() { - return String.format("[VC %s @ %s Q%s of type=%s alleles=%s attr=%s", + return String.format("[VC %s @ %s Q%s of type=%s alleles=%s attr=%s filters=%s", getSource(), contig + ":" + (start - stop == 0 ? start : start + "-" + stop), hasLog10PError() ? String.format("%.2f", getPhredScaledQual()) : ".", this.getType(), ParsingUtils.sortList(this.getAlleles()), - ParsingUtils.sortedString(this.getAttributes())); + ParsingUtils.sortedString(this.getAttributes()), + String.join(",", commonInfo.getFilters())); } // protected basic manipulation routines From 9d724c3a2dfd6928ea24a91443cd7f2bf6eb6c09 Mon Sep 17 00:00:00 2001 From: Daniel Cameron Date: Wed, 31 Jan 2018 04:10:05 +1100 Subject: [PATCH 05/83] Performing CIGAR and sequence length only when both the read sequence and the CIGAR exists. (#1075) When bwa reports split read alignments it only includes read sequence for the primary alignment record. Omitting the read sequence at the supplementary alignment reduces the file size without loss of information as the read sequence can be reconstructed from the supplementary alignment records from primary alignment and the supplementary alignment CIGAR. --- src/main/java/htsjdk/samtools/SAMRecord.java | 2 +- src/test/java/htsjdk/samtools/ValidateSamFileTest.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/htsjdk/samtools/SAMRecord.java b/src/main/java/htsjdk/samtools/SAMRecord.java index fd8cd7c31e..c53387ca03 100644 --- a/src/main/java/htsjdk/samtools/SAMRecord.java +++ b/src/main/java/htsjdk/samtools/SAMRecord.java @@ -2101,7 +2101,7 @@ public List isValid(final boolean firstOnly) { if (firstOnly) return ret; } - if (getCigar().getReadLength() != 0 && getCigar().getReadLength() != getReadLength()) { + if (getReadLength() != 0 && getCigar().getReadLength() != 0 && getCigar().getReadLength() != getReadLength()) { if (ret == null) ret = new ArrayList<>(); ret.add(new SAMValidationError(SAMValidationError.Type.MISMATCH_CIGAR_SEQ_LENGTH, "CIGAR covers " + getCigar().getReadLength() + " bases but the sequence is " + getReadLength() + " read bases ", diff --git a/src/test/java/htsjdk/samtools/ValidateSamFileTest.java b/src/test/java/htsjdk/samtools/ValidateSamFileTest.java index 7602f05464..a7a218c802 100644 --- a/src/test/java/htsjdk/samtools/ValidateSamFileTest.java +++ b/src/test/java/htsjdk/samtools/ValidateSamFileTest.java @@ -420,6 +420,16 @@ public void testCigarOffEndOfReferenceValidation() throws Exception { 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 + public void testCigarNoSeqValidation() throws Exception { + final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder(); + samBuilder.addFrag("name", 0, 1, false); + samBuilder.iterator().next().setReadBases(SAMRecord.NULL_SEQUENCE); + samBuilder.iterator().next().setBaseQualities(SAMRecord.NULL_SEQUENCE); + final Histogram results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE); + Assert.assertNull(results.get(SAMValidationError.Type.MISMATCH_CIGAR_SEQ_LENGTH .getHistogramString())); + } @Test(expectedExceptions = SAMFormatException.class) public void testConflictingTags() throws Exception { From 8b8d961580db0f274db3b5b3d87b95f65320b5d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B3mez-S=C3=A1nchez?= Date: Wed, 31 Jan 2018 17:17:05 +0100 Subject: [PATCH 06/83] Implement SeekableStream.available (#1077) * Implement SeekableStream.available() This is a necessary workaround for a bug in GzipInputStream that relies on available() as a proxy for eof. See https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7036144# We recommend that no uses this new method. * Add tests for compatibility with GZIPInputStream * closes #898 --- .../seekablestream/SeekableStream.java | 22 +++ ...eStreamGZIPinputStreamIntegrationTest.java | 145 ++++++++++++++++++ .../seekablestream/SeekableStreamTest.java | 18 ++- 3 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 src/test/java/htsjdk/samtools/seekablestream/SeekableStreamGZIPinputStreamIntegrationTest.java diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableStream.java index 99a53f68df..9d2a82093c 100644 --- a/src/main/java/htsjdk/samtools/seekablestream/SeekableStream.java +++ b/src/main/java/htsjdk/samtools/seekablestream/SeekableStream.java @@ -89,6 +89,28 @@ public void readFully(byte b[]) throws IOException { } } + /** + * The return value of this method is unusable for any purpose, and we are only implementing it + * because certain Java classes like {@link java.util.zip.GZIPInputStream} incorrectly rely on + * it to detect EOF + * + *

If {@code eof() == true}, 0 bytes are available. Otherwise, available bytes are the + * difference between the length of the stream ({@link #length()}) and the current position + * ({@link #position()}. + * + * @return {@code 0} if the end of the file has been reached or the length cannot be determined; + * number of bytes remaining in the stream otherwise. + */ + @Override + public int available() throws IOException { + if (eof()) { + return 0; + } + final long remaining = length() - position(); + // the remaining might be negative if the length is not available (0) + return (remaining < 0) ? 0 : (int) remaining; + } + /** * Mark the current position of the stream. * diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamGZIPinputStreamIntegrationTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamGZIPinputStreamIntegrationTest.java new file mode 100644 index 0000000000..6ef70f08e1 --- /dev/null +++ b/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamGZIPinputStreamIntegrationTest.java @@ -0,0 +1,145 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2018 Daniel Gomez-Sanchez + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT 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.HtsjdkTest; +import htsjdk.samtools.util.BlockCompressedInputStream; +import htsjdk.samtools.util.BufferedLineReader; +import htsjdk.samtools.util.LineReader; +import htsjdk.samtools.util.TestUtil; +import htsjdk.variant.variantcontext.Allele; +import htsjdk.variant.variantcontext.VariantContext; +import htsjdk.variant.variantcontext.VariantContextBuilder; +import htsjdk.variant.variantcontext.writer.VariantContextWriter; +import htsjdk.variant.variantcontext.writer.VariantContextWriterBuilder; +import htsjdk.variant.vcf.VCFHeader; +import htsjdk.variant.vcf.VCFHeaderLineType; +import htsjdk.variant.vcf.VCFInfoHeaderLine; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Random; +import java.util.zip.GZIPInputStream; + +/** + * Tests for the integration between {@link SeekableStream} and {@link GZIPInputStream}. + * + *

{@link GZIPInputStream} has a confirmed bug, that it relies on the {@link InputStream#available()} + * method to detect end-of-file, which is unsafe given its contract (see the Oracle's bug tracker + * issue https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7036144#). + * + *

Previous implementations of {@link SeekableStream} didn't implement {@link InputStream#available()}, + * returning always 0 (see https://github.com/samtools/htsjdk/issues/898). This test confirm that if + * the method is not implemented, a premature end-of-file can be detected prematurely. + * + * @author Daniel Gomez-Sanchez (magicDGS) + */ +public class SeekableStreamGZIPinputStreamIntegrationTest extends HtsjdkTest { + private static final String TEST_CHR = "1"; + private static Collection alleles = Arrays.asList(Allele.create("A", true), Allele.create("C")); + private static String RANDOM_ATTRIBUTE = "RD"; + + + private static File createBgzipVcfsWithVariableSize(final int firstRecordAttributeLength, final int nSmallRecords) throws Exception { + final VariantContext longRecord = new VariantContextBuilder("long", TEST_CHR, 1, 1, alleles) + .attribute(RANDOM_ATTRIBUTE, generateRandomString(firstRecordAttributeLength)) + .make(); + final File tempFile = Files.createTempFile("test" + firstRecordAttributeLength + "_" + nSmallRecords, ".vcf.gz").toFile(); + try (final VariantContextWriter writer = new VariantContextWriterBuilder() + .setOptions(VariantContextWriterBuilder.NO_OPTIONS) + .setOutputFile(tempFile) + .setOutputFileType(VariantContextWriterBuilder.OutputType.BLOCK_COMPRESSED_VCF) + .build()) { + writer.setHeader(createTestHeader()); // do not write the header + writer.add(longRecord); + for (int i = 2; i <= nSmallRecords + 1; i++) { + final VariantContext smallRecord = new VariantContextBuilder("short", TEST_CHR, i, i, alleles).attribute(RANDOM_ATTRIBUTE, ".").make(); + writer.add(smallRecord); + } + } + return tempFile; + } + + + private static VCFHeader createTestHeader() { + final VCFHeader header = new VCFHeader(); + header.addMetaDataLine(new VCFInfoHeaderLine(RANDOM_ATTRIBUTE, 1, VCFHeaderLineType.Character, "random string")); + return header; + } + + private static String generateRandomString(final int length) { + final Random random = new Random(TestUtil.RANDOM_SEED); + final StringBuilder builder = new StringBuilder(length); + for (int i = 0; i < length; i++) { + // generate number from 0 to 9, and append to the builder + builder.append(random.nextInt(10)); + } + return builder.toString(); + } + + @DataProvider + public Iterator compressedVcfsToTest() throws Exception { + final List data = new ArrayList<>(); + final int nSmallRecords = 1000000; + for (int firstRecordLength = 1000; firstRecordLength <= 10000; firstRecordLength+=1000) { + data.add(new Object[]{createBgzipVcfsWithVariableSize(firstRecordLength, nSmallRecords), nSmallRecords+1}); + } + return data.iterator(); + } + + @Test(dataProvider = "compressedVcfsToTest") + public void testWrappedSeekableStreamInGZIPinputStream(final File input, final long nLines) throws Exception { + try (final LineReader reader = new BufferedLineReader(new GZIPInputStream(new SeekableFileStream(input)))) { + for (int i = 0; i < nLines; i++) { + Assert.assertNotNull(reader.readLine(), "line #" + reader.getLineNumber()); + } + Assert.assertNull(reader.readLine()); + Assert.assertEquals(reader.getLineNumber(), nLines); + } + } + + @Test(dataProvider = "compressedVcfsToTest") + public void testConsistencyWithBgzip(final File input, final long nLines) throws Exception { + try (final InputStream gzIs = new GZIPInputStream(new SeekableFileStream(input)); + final InputStream bgzIs = new BlockCompressedInputStream(input)) { + int bgz = bgzIs.read(); + while (bgz != -1) { + Assert.assertEquals(gzIs.read(), bgz); + bgz = bgzIs.read(); + } + Assert.assertEquals(gzIs.read(), bgz); + } + + } +} diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamTest.java index 1a7a5b9858..d19f6b074f 100644 --- a/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamTest.java +++ b/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamTest.java @@ -25,7 +25,7 @@ package htsjdk.samtools.seekablestream; import htsjdk.HtsjdkTest; -import org.junit.Assert; +import org.testng.Assert; import org.testng.annotations.Test; import java.util.Random; @@ -65,6 +65,22 @@ public void testResetUnmark() throws Exception { Assert.assertEquals(stream.read(), current); } + @Test + public void testAvailable() throws Exception { + // initiate random stream + final int length = 100; + final SeekableStream stream = getRandomSeekableStream(length); + // check that available returns the length + Assert.assertEquals(stream.available(), length); + // consume the stream + for(int i = 1; i < length + 1; i++) { + Assert.assertNotEquals(stream.read(), -1); + Assert.assertEquals(stream.available(), length - i); + } + // once consumed, no stream available + Assert.assertEquals(stream.available(), 0); + } + private static SeekableStream getRandomSeekableStream(final int size) { // generate random array final byte[] array = new byte[size]; From 5c8de555ae4cbbb06e819f8f922c114a09cbb511 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B3mez-S=C3=A1nchez?= Date: Mon, 5 Feb 2018 18:54:46 +0100 Subject: [PATCH 07/83] Add DeleteOnExitPathHook to register java.nio.Path for deletion (#1037) * Add DeleteOnExitPathHook to register java.nio.Path for deletion, this closely mirrors the equivalent java built in `DeleteOnExitHook` but uses paths instead of files. --- .../java/htsjdk/samtools/util/IOUtil.java | 31 ++------- .../util/nio/DeleteOnExitPathHook.java | 63 +++++++++++++++++++ .../java/htsjdk/samtools/util/IoUtilTest.java | 15 ----- 3 files changed, 68 insertions(+), 41 deletions(-) create mode 100644 src/main/java/htsjdk/samtools/util/nio/DeleteOnExitPathHook.java diff --git a/src/main/java/htsjdk/samtools/util/IOUtil.java b/src/main/java/htsjdk/samtools/util/IOUtil.java index 26aaa1f4aa..7f6bfac420 100644 --- a/src/main/java/htsjdk/samtools/util/IOUtil.java +++ b/src/main/java/htsjdk/samtools/util/IOUtil.java @@ -31,6 +31,7 @@ import htsjdk.samtools.seekablestream.SeekableHTTPStream; import htsjdk.samtools.seekablestream.SeekableStream; import htsjdk.tribble.Tribble; +import htsjdk.samtools.util.nio.DeleteOnExitPathHook; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -353,34 +354,12 @@ public static Path getDefaultTmpDirPath() { } /** - * Deletes on exit a path by creating a shutdown hook. - */ - public static void deleteOnExit(final Path path) { - // add a shutdown hook to remove the path on exit - Runtime.getRuntime().addShutdownHook(new DeletePathThread(path)); - } - - /** - * WARNING: visible for testing. Do not use. - * - * Class for delete a path, used in a shutdown hook for delete on exit. + * Register a {@link Path} for deletion on JVM exit. * - * @see #deleteOnExit(Path) + * @see DeleteOnExitPathHook */ - static final class DeletePathThread extends Thread { - - private final Path path; - - DeletePathThread(Path path) {this.path = path;} - - @Override - public void run() { - try { - Files.deleteIfExists(path); - } catch (IOException e) { - throw new RuntimeIOException(e); - } - } + public static void deleteOnExit(final Path path) { + DeleteOnExitPathHook.add(path); } /** Returns the name of the file minus the extension (i.e. text after the last "." in the filename). */ diff --git a/src/main/java/htsjdk/samtools/util/nio/DeleteOnExitPathHook.java b/src/main/java/htsjdk/samtools/util/nio/DeleteOnExitPathHook.java new file mode 100644 index 0000000000..ae2a0dd46f --- /dev/null +++ b/src/main/java/htsjdk/samtools/util/nio/DeleteOnExitPathHook.java @@ -0,0 +1,63 @@ +package htsjdk.samtools.util.nio; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; + +/** + * Class to hold a set of {@link Path} to be delete on the JVM exit through a shutdown hook. + * + *

This class is a modification of {@link java.io.DeleteOnExitHook} to handle {@link Path} + * instead of {@link java.io.File}. + * + * @author Daniel Gomez-Sanchez (magicDGS) + */ +public class DeleteOnExitPathHook { + private static LinkedHashSet paths = new LinkedHashSet<>(); + static { + Runtime.getRuntime().addShutdownHook(new Thread(DeleteOnExitPathHook::runHooks)); + } + + private DeleteOnExitPathHook() {} + + /** + * Adds a {@link Path} for deletion on JVM exit. + * + * @param path path to be deleted. + * + * @throws IllegalStateException if the shutdown hook is in progress. + */ + public static synchronized void add(Path path) { + if(paths == null) { + // DeleteOnExitHook is running. Too late to add a file + throw new IllegalStateException("Shutdown in progress"); + } + + paths.add(path); + } + + static void runHooks() { + LinkedHashSet thePaths; + + synchronized (DeleteOnExitPathHook.class) { + thePaths = paths; + paths = null; + } + + ArrayList toBeDeleted = new ArrayList<>(thePaths); + + // reverse the list to maintain previous jdk deletion order. + // Last in first deleted. + Collections.reverse(toBeDeleted); + for (Path path : toBeDeleted) { + try { + Files.delete(path); + } catch (IOException | SecurityException e) { + // do nothing if cannot be deleted, because it is a shutdown hook + } + } + } +} diff --git a/src/test/java/htsjdk/samtools/util/IoUtilTest.java b/src/test/java/htsjdk/samtools/util/IoUtilTest.java index f4e31024f2..51fd76986a 100644 --- a/src/test/java/htsjdk/samtools/util/IoUtilTest.java +++ b/src/test/java/htsjdk/samtools/util/IoUtilTest.java @@ -352,21 +352,6 @@ private List createJimsFiles(final String folderName, final List f return paths; } - @DataProvider - public Object[][] pathsForDeletePathThread() throws Exception { - return new Object[][] { - {File.createTempFile("testDeletePathThread", "file").toPath()}, - {Files.createFile(inMemoryfileSystem.getPath("testDeletePathThread"))} - }; - } - - @Test(dataProvider = "pathsForDeletePathThread") - public void testDeletePathThread(final Path path) throws Exception { - Assert.assertTrue(Files.exists(path)); - new IOUtil.DeletePathThread(path).run(); - Assert.assertFalse(Files.exists(path)); - } - @DataProvider public Object[][] pathsForWritableDirectory() throws Exception { return new Object[][] { From 2b8919b50479c1046cae80be6dd766b3db7424eb Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Thu, 8 Feb 2018 15:32:22 -0500 Subject: [PATCH 08/83] re-enable reading bam files from pipes (#1085) * re-enable reading bam files from pipes fixing an issue that prevented reading a bam file from an unseekable file, ex: a unix pipe fixes #1083 which was introduced by #1077 this only fixes the case where the bam is being opened as file, a similar issue exists for Paths (#1084) support for reading pipes as paths has never worked --- .../htsjdk/samtools/SamInputResource.java | 30 ++++++--- .../htsjdk/samtools/SamReaderFactoryTest.java | 63 ++++++++++++++++-- .../resources/htsjdk/samtools/example.bam | Bin 0 -> 10166 bytes 3 files changed, 79 insertions(+), 14 deletions(-) create mode 100644 src/test/resources/htsjdk/samtools/example.bam diff --git a/src/main/java/htsjdk/samtools/SamInputResource.java b/src/main/java/htsjdk/samtools/SamInputResource.java index a039e5aa3f..b17f2276cf 100644 --- a/src/main/java/htsjdk/samtools/SamInputResource.java +++ b/src/main/java/htsjdk/samtools/SamInputResource.java @@ -33,17 +33,12 @@ 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.io.*; import java.net.MalformedURLException; -import java.net.URISyntaxException; import java.net.URL; import java.nio.channels.SeekableByteChannel; import java.nio.file.FileSystemNotFoundException; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.function.Function; import java.util.function.Supplier; @@ -90,7 +85,9 @@ public String toString() { } /** 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)); } + 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) { @@ -269,12 +266,27 @@ public URL asUrl() { @Override public SeekableStream asUnbufferedSeekableStream() { - return lazySeekableStream.get(); + //if the file doesn't exist, the try to open the stream anyway because users might be expecting the exception + //if it not a regular file than we won't be able to seek on it, so return null + if (!fileResource.exists() || fileResource.isFile()) { + return lazySeekableStream.get(); + } else { + return null; + } } @Override public InputStream asUnbufferedInputStream() { - return asUnbufferedSeekableStream(); + final SeekableStream seekableStream = asUnbufferedSeekableStream(); + if (seekableStream != null) { + return seekableStream; + } else { + try { + return new FileInputStream(fileResource); + } catch (FileNotFoundException e) { + throw new RuntimeIOException(e); + } + } } @Override diff --git a/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java b/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java index c244f3c8b4..5822f6b3ab 100644 --- a/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java +++ b/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java @@ -7,11 +7,6 @@ import htsjdk.samtools.seekablestream.SeekableHTTPStream; import htsjdk.samtools.seekablestream.SeekableStreamFactory; import htsjdk.samtools.util.*; -import java.net.URI; -import java.nio.ByteBuffer; -import java.nio.channels.SeekableByteChannel; -import java.nio.file.Paths; -import java.util.function.Function; import htsjdk.samtools.util.zip.InflaterFactory; import org.testng.Assert; import org.testng.annotations.DataProvider; @@ -23,12 +18,17 @@ import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; +import java.nio.ByteBuffer; +import java.nio.channels.SeekableByteChannel; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.*; import java.util.function.BiFunction; +import java.util.function.Function; import java.util.zip.Inflater; public class SamReaderFactoryTest extends HtsjdkTest { @@ -536,4 +536,57 @@ public void testSamReaderFromMalformedSeekableStream() throws IOException { countRecords(reader); } + @Test(singleThreaded = true, groups="unix") + public void testWriteAndReadFromPipe() throws IOException, InterruptedException, ExecutionException, TimeoutException { + final File fifo = File.createTempFile("fifo", ""); + Assert.assertTrue(fifo.delete()); + fifo.deleteOnExit(); + final Process exec = Runtime.getRuntime().exec(new String[]{"mkfifo", fifo.getAbsolutePath()}); + exec.waitFor(1, TimeUnit.MINUTES); + Assert.assertEquals(exec.exitValue(), 0, "mkfifo failed with exit code " + 0); + + ExecutorService executor = null; + try { + executor = Executors.newFixedThreadPool(2); + final File input = new File(TEST_DATA_DIR, "example.bam"); + final Future writing = executor.submit(writeToPipe(fifo, input)); + final Future reading = executor.submit(readFromPipe(fifo)); + Assert.assertEquals(writing.get(1, TimeUnit.MINUTES), reading.get(1, TimeUnit.MINUTES)); + } finally { + if (executor != null) { + executor.shutdownNow(); + } + } + } + + private static Callable readFromPipe(File fifo) { + return () -> { + try (final SamReader reader = SamReaderFactory.makeDefault().open(fifo)) { + return (int)reader.iterator().stream().count(); + } catch (Exception e) { + Assert.fail("failed during reading from pipe", e); + } + throw new RuntimeException("Shouldn't actually reach here but the compiler was confused"); + }; + } + + private static Callable writeToPipe(File fifo, File input) { + return () -> { + int written = 0; + try { + try (final SamReader reader = SamReaderFactory.makeDefault().open(input); + final SAMFileWriter writer = new SAMFileWriterFactory().setCreateIndex(false) + .setCreateMd5File(false) + .makeBAMWriter(reader.getFileHeader(), true, fifo)) { + for (SAMRecord read : reader) { + writer.addAlignment(read); + written++; + } + } + } catch (final Exception e) { + Assert.fail("Failed during writing to pipe", e); + } + return written; + }; + } } diff --git a/src/test/resources/htsjdk/samtools/example.bam b/src/test/resources/htsjdk/samtools/example.bam new file mode 100644 index 0000000000000000000000000000000000000000..18b96c15cc0bc682f3e8df2aa21efb63136d9ee1 GIT binary patch literal 10166 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 Date: Tue, 13 Feb 2018 20:54:45 -0500 Subject: [PATCH 09/83] aesthetic changes only (#1087) --- src/main/java/htsjdk/samtools/BAMRecord.java | 8 ++-- .../java/htsjdk/samtools/BAMRecordCodec.java | 38 +++++++++------- .../htsjdk/samtools/SAMRecordSetBuilder.java | 45 ++++++++++++------- .../htsjdk/samtools/SamFileValidator.java | 11 ++--- .../htsjdk/samtools/BAMCigarOverflowTest.java | 1 - .../htsjdk/samtools/BAMFileWriterTest.java | 4 +- 6 files changed, 60 insertions(+), 47 deletions(-) diff --git a/src/main/java/htsjdk/samtools/BAMRecord.java b/src/main/java/htsjdk/samtools/BAMRecord.java index 14b6295954..f24febd4ba 100644 --- a/src/main/java/htsjdk/samtools/BAMRecord.java +++ b/src/main/java/htsjdk/samtools/BAMRecord.java @@ -244,7 +244,7 @@ public int getReadNameLength() { public Cigar getCigar() { if (mRestOfBinaryData != null && !mCigarDecoded) { final int cigarOffset = readNameSize(); - final ByteBuffer byteBuffer = ByteBuffer.wrap(mRestOfBinaryData, cigarOffset, cigarSize()); + final ByteBuffer byteBuffer = ByteBuffer.wrap(mRestOfBinaryData, cigarOffset, cigarSize()); byteBuffer.order(ByteOrder.LITTLE_ENDIAN); super.initializeCigar(BinaryCigarCodec.decode(byteBuffer)); mCigarDecoded = true; @@ -334,7 +334,7 @@ private byte[] decodeBaseQualities() { private String decodeReadName() { // Don't include terminating null - return StringUtil.bytesToString(mRestOfBinaryData, READ_NAME_OFFSET, mReadNameLength-1); + return StringUtil.bytesToString(mRestOfBinaryData, READ_NAME_OFFSET, mReadNameLength - 1); } private byte[] decodeReadBases() { @@ -344,7 +344,7 @@ private byte[] decodeReadBases() { final int basesOffset = readNameSize() + cigarSize(); try { return SAMUtils.compressedBasesToBytes(mReadLength, mRestOfBinaryData, basesOffset); - } catch ( final IllegalArgumentException ex ) { + } catch (final IllegalArgumentException ex) { final String msg = ex.getMessage() + " in read: " + getReadName(); throw new IllegalStateException(msg, ex); } @@ -362,7 +362,7 @@ private int cigarSize() { } private int basesSize() { - return (mReadLength + 1)/2; + return (mReadLength + 1) / 2; } private int qualsSize() { diff --git a/src/main/java/htsjdk/samtools/BAMRecordCodec.java b/src/main/java/htsjdk/samtools/BAMRecordCodec.java index e363a5b95b..afcddb3fe6 100644 --- a/src/main/java/htsjdk/samtools/BAMRecordCodec.java +++ b/src/main/java/htsjdk/samtools/BAMRecordCodec.java @@ -55,26 +55,33 @@ public BAMRecordCodec clone() { return new BAMRecordCodec(this.header, this.samRecordFactory); } - - /** Sets the output stream that records will be written to. */ + /** + * Sets the output stream that records will be written to. + */ @Override public void setOutputStream(final OutputStream os) { this.binaryCodec.setOutputStream(os); } - /** Sets the output stream that records will be written to. */ + /** + * 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. */ + /** + * Sets the input stream that records will be read from. + */ @Override public void setInputStream(final InputStream is) { this.binaryCodec.setInputStream(is); } - /** Sets the input stream that records will be read from. */ + /** + * 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); @@ -126,8 +133,8 @@ public void encode(final SAMRecord alignment) { 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.writeUByte((short) (alignment.getReadNameLength() + 1)); + this.binaryCodec.writeUByte((short) alignment.getMappingQuality()); this.binaryCodec.writeUShort(indexBin); this.binaryCodec.writeUShort(cigarLength); this.binaryCodec.writeUShort(alignment.getFlags()); @@ -144,20 +151,20 @@ public void encode(final SAMRecord alignment) { 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); + 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. + // that it is spec'ed as a uint. this.binaryCodec.writeInt(cigarElement); } try { this.binaryCodec.writeBytes(SAMUtils.bytesToCompressedBases(alignment.getReadBases())); - } catch ( final IllegalArgumentException ex ) { - final String msg = ex.getMessage() + " in read: " + alignment.getReadName(); + } catch (final IllegalArgumentException ex) { + final String msg = ex.getMessage() + " in read: " + alignment.getReadName(); throw new IllegalStateException(msg, ex); } byte[] qualities = alignment.getBaseQualities(); @@ -178,22 +185,21 @@ public void encode(final SAMRecord alignment) { * 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. + * a record. */ @Override public SAMRecord decode() { int recordLength = 0; try { recordLength = this.binaryCodec.readInt(); - } - catch (RuntimeEOFException e) { + } 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(); diff --git a/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java b/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java index 4e7b2c9c25..d77e2de2f9 100644 --- a/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java +++ b/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java @@ -70,7 +70,7 @@ public class SAMRecordSetBuilder implements Iterable { 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; @@ -175,15 +175,20 @@ public void setReadGroup(final SAMReadGroupRecord readGroup) { } } - /** Returns the accumulated list of sam records. */ - public Collection getRecords() { return this.records; } + /** + * Returns the accumulated list of sam records. + */ + public Collection 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 */ + /** + * 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)) { @@ -192,7 +197,9 @@ public void addRecord(final SAMRecord record) { this.records.add(record); } - /** Returns a CloseableIterator over the collection of SAMRecords. */ + /** + * Returns a CloseableIterator over the collection of SAMRecords. + */ @Override public CloseableIterator iterator() { return new CloseableIterator() { @@ -202,13 +209,19 @@ public CloseableIterator iterator() { public void close() { /** Do nothing. */} @Override - public boolean hasNext() { return this.iterator.hasNext(); } + public boolean hasNext() { + return this.iterator.hasNext(); + } @Override - public SAMRecord next() { return this.iterator.next(); } + public SAMRecord next() { + return this.iterator.next(); + } @Override - public void remove() { this.iterator.remove(); } + public void remove() { + this.iterator.remove(); + } }; } @@ -242,7 +255,7 @@ private SAMRecord createReadNoFlag(final String name, final int contig, final in } rec.setAttribute(SAMTag.RG.name(), READ_GROUP_ID); - if(useNmFlag){ + if (useNmFlag) { rec.setAttribute(SAMTag.NM.name(), SequenceUtil.calculateSamNmTagFromCigar(rec)); } @@ -255,7 +268,7 @@ private SAMRecord createReadNoFlag(final String name, final int contig, final in } if (!recordUnmapped || this.unmappedHasBasesAndQualities) { - fillInBasesAndQualities(rec, qualityString, defaultQuality); + fillInBasesAndQualities(rec, qualityString, defaultQuality); } return rec; @@ -306,7 +319,6 @@ public SAMRecord addFrag(final String name, final int contig, final int start, f 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 @@ -343,7 +355,6 @@ 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 @@ -359,7 +370,7 @@ public void addPair(final String name, final int contig, final int start1, final end1.setAlignmentStart(start1); end1.setReadNegativeStrandFlag(false); end1.setCigarString(readLength + "M"); - if(useNmFlag) end1.setAttribute(ReservedTagConstants.NM, 0); + if (useNmFlag) end1.setAttribute(ReservedTagConstants.NM, 0); end1.setMappingQuality(255); end1.setReadPairedFlag(true); end1.setProperPairFlag(true); @@ -379,7 +390,7 @@ public void addPair(final String name, final int contig, final int start1, final end2.setAlignmentStart(start2); end2.setReadNegativeStrandFlag(true); end2.setCigarString(readLength + "M"); - if(useNmFlag) end2.setAttribute(ReservedTagConstants.NM,0); + if (useNmFlag) end2.setAttribute(ReservedTagConstants.NM, 0); end2.setMappingQuality(255); end2.setReadPairedFlag(true); end2.setProperPairFlag(true); @@ -569,6 +580,8 @@ public SAMFileHeader getHeader() { return header; } - public void setReadLength(final int readLength) { this.readLength = readLength; } + public void setReadLength(final int readLength) { + this.readLength = readLength; + } } diff --git a/src/main/java/htsjdk/samtools/SamFileValidator.java b/src/main/java/htsjdk/samtools/SamFileValidator.java index 013b40b6f5..9da9eb04e8 100644 --- a/src/main/java/htsjdk/samtools/SamFileValidator.java +++ b/src/main/java/htsjdk/samtools/SamFileValidator.java @@ -244,8 +244,7 @@ private void validateSamFile(final SamReader samReader, final PrintWriter out) { try { if (indexValidationStringency == IndexValidationStringency.LESS_EXHAUSTIVE) { BamIndexValidator.lessExhaustivelyTestIndex(samReader); - } - else { + } else { BamIndexValidator.exhaustivelyTestIndex(samReader); } } catch (Exception e) { @@ -344,7 +343,7 @@ private void validateSamRecordsAndQualityFormat(final Iterable samRec } - if ((qualityNotStoredErrorCount++ < MAX_QUALITY_NOT_STORED_ERRORS) && record.getBaseQualityString().equals("*")){ + if ((qualityNotStoredErrorCount++ < MAX_QUALITY_NOT_STORED_ERRORS) && record.getBaseQualityString().equals("*")) { addError(new SAMValidationError(Type.QUALITY_NOT_STORED, "QUAL field is set to * (unspecified quality scores), this is allowed by the SAM" + " specification but many tools expect reads to include qualities ", @@ -457,7 +456,6 @@ private boolean validateCigar(final SAMRecord record, final long recordNumber, f return valid; } - private boolean validateSortOrder(final SAMRecord record, final long recordNumber) { final SAMRecord prev = orderChecker.getPreviousRecord(); boolean isValidSortOrder = orderChecker.isSorted(record); @@ -593,8 +591,7 @@ private void validateHeader(final SAMFileHeader fileHeader) { addError(new SAMValidationError(Type.MISSING_PLATFORM_VALUE, "A platform (PL) attribute was not found for read group ", readGroupID)); - } - else { + } else { // NB: cannot be null, so not catching a NPE try { SAMReadGroupRecord.PlatformValue.valueOf(platformValue.toUpperCase()); @@ -631,7 +628,7 @@ private void addError(final SAMValidationError error) { switch (error.getType().severity) { case WARNING: - if ( this.ignoreWarnings ) { + if (this.ignoreWarnings) { return; } this.numWarnings++; diff --git a/src/test/java/htsjdk/samtools/BAMCigarOverflowTest.java b/src/test/java/htsjdk/samtools/BAMCigarOverflowTest.java index 8f91c64485..5f8f3b24f3 100644 --- a/src/test/java/htsjdk/samtools/BAMCigarOverflowTest.java +++ b/src/test/java/htsjdk/samtools/BAMCigarOverflowTest.java @@ -26,5 +26,4 @@ public void testCigarOverflow() throws Exception { //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/BAMFileWriterTest.java b/src/test/java/htsjdk/samtools/BAMFileWriterTest.java index 3bb46e6f77..f624621c4b 100644 --- a/src/test/java/htsjdk/samtools/BAMFileWriterTest.java +++ b/src/test/java/htsjdk/samtools/BAMFileWriterTest.java @@ -174,7 +174,7 @@ 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 + // 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); @@ -195,7 +195,6 @@ public void testNegativePresorted() throws Exception { Assert.fail("Exception should be thrown"); } - /** * A test to check that BAM changes read bases according with {@link SequenceUtil#toBamReadBasesInPlace}. */ @@ -219,7 +218,6 @@ public void testBAMReadBases() throws IOException { writer.addAlignment(originalSAMRecord); } - final BAMFileReader reader = new BAMFileReader(new ByteArrayInputStream(baos.toByteArray()), null, true, false, ValidationStringency.SILENT, new DefaultSAMRecordFactory()); final CloseableIterator iterator = reader.getIterator(); iterator.hasNext(); From 7a382771732b6512c07f674f2d6a6858072f0f44 Mon Sep 17 00:00:00 2001 From: Alexey Philippov Date: Wed, 21 Feb 2018 19:09:07 +0300 Subject: [PATCH 10/83] throw a clear exception if writing vcf without a header set #1008 (#1090) * throw an IllegalStateException with a clear message if add() is called on a VCFWriter that hasn't had the header set yet. * previous behavior would throw a confusing exception that didn't make it obvious what the problem was * fixes #1008 --- .../variantcontext/writer/VCFWriter.java | 8 +++++--- .../writer/VCFWriterUnitTest.java | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java index 442567b9fd..593f3619c0 100644 --- a/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java +++ b/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java @@ -219,9 +219,11 @@ public void close() { 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)); + if (this.mHeader == null) { + throw new IllegalStateException("Unable to write the VCF: header is missing, " + + "try to call writeHeader or setHeader first."); + } + write(this.vcfEncoder.encode(this.doNotWriteGenotypes ? new VariantContextBuilder(context).noGenotypes().make() : context)); write("\n"); writeAndResetBuffer(); diff --git a/src/test/java/htsjdk/variant/variantcontext/writer/VCFWriterUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/writer/VCFWriterUnitTest.java index ff0a14c751..09b1f52c92 100644 --- a/src/test/java/htsjdk/variant/variantcontext/writer/VCFWriterUnitTest.java +++ b/src/test/java/htsjdk/variant/variantcontext/writer/VCFWriterUnitTest.java @@ -363,5 +363,25 @@ public void testModifyHeader() { 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"); } + + + /** + * + * A test to check that we can't write VCF with missing header. + */ + @Test(dataProvider = "vcfExtensionsDataProvider", expectedExceptions = IllegalStateException.class) + public void testWriteWithEmptyHeader(final String extension) throws IOException { + final File fakeVCFFile = File.createTempFile("testWriteAndReadVCFHeaderless.", extension, tempDir); + metaData = new HashSet<>(); + additionalColumns = new HashSet<>(); + final SAMSequenceDictionary sequenceDict = createArtificialSequenceDictionary(); + final VCFHeader header = createFakeHeader(metaData, additionalColumns, sequenceDict); + try (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.add(createVC(header)); + } + } } From ae57c1054709d86460805a24710924fe4aaa7929 Mon Sep 17 00:00:00 2001 From: Nils Homer Date: Sun, 4 Mar 2018 20:54:38 -0700 Subject: [PATCH 11/83] Bug fix: SamLocusIterator.accumulateIndels printed a newline to stdout --- src/main/java/htsjdk/samtools/util/SamLocusIterator.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/htsjdk/samtools/util/SamLocusIterator.java b/src/main/java/htsjdk/samtools/util/SamLocusIterator.java index dc6745f5d6..49c8a6a659 100644 --- a/src/main/java/htsjdk/samtools/util/SamLocusIterator.java +++ b/src/main/java/htsjdk/samtools/util/SamLocusIterator.java @@ -137,7 +137,6 @@ void accumulateIndels(SAMRecord rec) { 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(); From 673eaf750806c663c1fb2fe59eb3a3bfda77153c Mon Sep 17 00:00:00 2001 From: Peter van 't Hof Date: Wed, 7 Mar 2018 07:32:59 +0100 Subject: [PATCH 12/83] Adding check on validator on VCFHeadLineCount (#1093) * Adding check on validator on VCFHeadLineCount * Added exception for flags * Adding some testing --- .../variant/vcf/VCFCompoundHeaderLine.java | 5 +++- .../variant/vcf/VCFHeaderLineUnitTest.java | 25 ++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/main/java/htsjdk/variant/vcf/VCFCompoundHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFCompoundHeaderLine.java index 4d8c3447fc..481ca924a2 100644 --- a/src/main/java/htsjdk/variant/vcf/VCFCompoundHeaderLine.java +++ b/src/main/java/htsjdk/variant/vcf/VCFCompoundHeaderLine.java @@ -202,9 +202,12 @@ protected VCFCompoundHeaderLine(String line, VCFHeaderVersion version, Supported } private void validate() { + if (type != VCFHeaderLineType.Flag && countType == VCFHeaderLineCount.INTEGER && count <= 0) + throw new IllegalArgumentException(String.format("Invalid count number, with fixed count the number should be 1 or higher: key=%s name=%s type=%s desc=%s lineType=%s count=%s", + getKey(), name, type, description, lineType, count)); 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)); + getKey(), name, type, description, lineType)); if (name.contains("<") || name.contains(">")) throw new IllegalArgumentException("VCFHeaderLine: ID cannot contain angle brackets"); if (name.contains("=")) diff --git a/src/test/java/htsjdk/variant/vcf/VCFHeaderLineUnitTest.java b/src/test/java/htsjdk/variant/vcf/VCFHeaderLineUnitTest.java index 02cde53109..e04d3c69c8 100644 --- a/src/test/java/htsjdk/variant/vcf/VCFHeaderLineUnitTest.java +++ b/src/test/java/htsjdk/variant/vcf/VCFHeaderLineUnitTest.java @@ -25,7 +25,6 @@ public void testEncodeVCFHeaderLineWithUnescapedQuotes() { assertEquals(encodedAttributes, expectedEncoding); } - @Test public void testEncodeVCFHeaderLineWithEscapedQuotes() { @@ -40,4 +39,28 @@ public void testEncodeVCFHeaderLineWithEscapedQuotes() { assertEquals(encodedAttributes, expectedEncoding); } + @Test(expectedExceptions = { IllegalArgumentException.class }, expectedExceptionsMessageRegExp = "Invalid count number, with fixed count the number should be 1 or higher: .*") + public void testFormatNumberExeptions() { + new VCFFormatHeaderLine("test", + 0, + VCFHeaderLineType.Integer, + ""); + } + + @Test(expectedExceptions = { IllegalArgumentException.class }, expectedExceptionsMessageRegExp = "Invalid count number, with fixed count the number should be 1 or higher: .*") + public void testInfoNumberExeptions() { + new VCFInfoHeaderLine("test", + 0, + VCFHeaderLineType.Integer, + ""); + } + + @Test + public void testNumberExceptionFlag() { + // Should not raise an exception + new VCFInfoHeaderLine("test", + 0, + VCFHeaderLineType.Flag, + ""); + } } From 4245d9db31468f4c137f649b2ab11028ed4ab694 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Tue, 17 Apr 2018 12:23:03 -0400 Subject: [PATCH 13/83] FTP tests moved to separate test target (#1104) * Move ftp tests into a separate "ftp" test group * adding a new travis matrix entry for ftp tests that is allowed to fail * excluding ftp tests from gradle test target, adding testFTP target * we currently expect the ftp tests to fail on travis for the foreseeable future, they should be rewritten --- .travis.yml | 15 ++++++++++++++- build.gradle | 11 +++++++++++ .../java/htsjdk/samtools/util/ftp/FTPClient.java | 7 ++++--- .../seekablestream/SeekableFTPStreamTest.java | 5 +++-- .../htsjdk/tribble/AbstractFeatureReaderTest.java | 2 +- .../htsjdk/tribble/util/ParsingUtilsTest.java | 6 +++--- .../htsjdk/tribble/util/ftp/FTPClientTest.java | 1 + .../htsjdk/tribble/util/ftp/FTPUtilsTest.java | 2 +- 8 files changed, 38 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index a1c1b2bcfb..45bc976612 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,20 @@ cache: jdk: - oraclejdk8 - openjdk8 -script: ./gradlew test jacocoTestReport; +matrix: + fast_finish: true + allow_failures: + - env: TEST_TYPE=FTP + include: + - jdk: oraclejdk8 + env: TEST_TYPE=FTP +script: + - if [[ $TEST_TYPE == "FTP" ]]; then + ./gradlew testFTP jacocoTestReport; + else + ./gradlew test jacocoTestReport; + fi + after_success: - bash <(curl -s https://codecov.io/bash) - echo "TRAVIS_BRANCH='$TRAVIS_BRANCH'"; diff --git a/build.gradle b/build.gradle index 2cffacb19a..90acd383da 100644 --- a/build.gradle +++ b/build.gradle @@ -100,11 +100,22 @@ test { tags { exclude "slow" exclude "broken" + exclude "ftp" if (System.env.CI == "false") exclude "sra" if (!OperatingSystem.current().isUnix()) exclude "unix" } } dependsOn findScalaAndJavaTypes + +task testFTP(type: Test) { + description = "Runs the tests that require connection to a remote ftp server" + tags { + include "ftp" + exclude "slow" + exclude "broken" + } +} + task testSRA(type: Test) { description = "Run the SRA tests" jvmArgs += '-Dsamjdk.sra_libraries_download=true' diff --git a/src/main/java/htsjdk/samtools/util/ftp/FTPClient.java b/src/main/java/htsjdk/samtools/util/ftp/FTPClient.java index 3af6debc64..c26bb6023e 100644 --- a/src/main/java/htsjdk/samtools/util/ftp/FTPClient.java +++ b/src/main/java/htsjdk/samtools/util/ftp/FTPClient.java @@ -190,9 +190,10 @@ public void closeDataStream() throws IOException { // } catch (InterruptedException e) { // // } - dataStream.close(); - //} - dataStream = null; + if( dataStream != null) { + dataStream.close(); + dataStream = null; + } } diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableFTPStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableFTPStreamTest.java index 4dfc8b78b6..81105ab467 100644 --- a/src/test/java/htsjdk/samtools/seekablestream/SeekableFTPStreamTest.java +++ b/src/test/java/htsjdk/samtools/seekablestream/SeekableFTPStreamTest.java @@ -36,6 +36,7 @@ * @author Jim Robinson * @since 10/3/11 */ +@Test(groups = "ftp") public class SeekableFTPStreamTest extends HtsjdkTest { @@ -44,13 +45,13 @@ public class SeekableFTPStreamTest extends HtsjdkTest { static byte[] expectedBytes = "abcdefghijklmnopqrstuvwxyz\n".getBytes(); SeekableFTPStream stream; - @BeforeMethod + @BeforeMethod() public void setUp() throws IOException { stream = new SeekableFTPStream(new URL(urlString)); } - @AfterMethod + @AfterMethod() public void tearDown() throws IOException { stream.close(); } diff --git a/src/test/java/htsjdk/tribble/AbstractFeatureReaderTest.java b/src/test/java/htsjdk/tribble/AbstractFeatureReaderTest.java index 3a5b77269d..f9135968d2 100644 --- a/src/test/java/htsjdk/tribble/AbstractFeatureReaderTest.java +++ b/src/test/java/htsjdk/tribble/AbstractFeatureReaderTest.java @@ -67,7 +67,7 @@ public void testVcfOverHTTP() throws IOException { assertFalse(localIterator.hasNext()); } - @Test + @Test(groups = "ftp") 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(); diff --git a/src/test/java/htsjdk/tribble/util/ParsingUtilsTest.java b/src/test/java/htsjdk/tribble/util/ParsingUtilsTest.java index c974790ddf..d6e5d62148 100644 --- a/src/test/java/htsjdk/tribble/util/ParsingUtilsTest.java +++ b/src/test/java/htsjdk/tribble/util/ParsingUtilsTest.java @@ -153,12 +153,12 @@ public void testInMemoryNioFileDoesNotExist() throws IOException{ tstExists(file.toUri().toString(), false); } - @Test + @Test(groups = "ftp") public void testFTPDoesExist() throws IOException{ tstExists(AVAILABLE_FTP_URL, true); } - @Test + @Test(groups = "ftp") public void testFTPNotExist() throws IOException{ tstExists(UNAVAILABLE_FTP_URL, false); } @@ -198,7 +198,7 @@ public void testInMemoryNioFileOpenInputStream() throws IOException{ tstStream(file.toUri().toString()); } - @Test + @Test(groups = "ftp") public void testFTPOpenInputStream() throws IOException{ tstStream(AVAILABLE_FTP_URL); } diff --git a/src/test/java/htsjdk/tribble/util/ftp/FTPClientTest.java b/src/test/java/htsjdk/tribble/util/ftp/FTPClientTest.java index 6b77f913ef..10a4236ff0 100644 --- a/src/test/java/htsjdk/tribble/util/ftp/FTPClientTest.java +++ b/src/test/java/htsjdk/tribble/util/ftp/FTPClientTest.java @@ -16,6 +16,7 @@ * @author Jim Robinson * @since 10/3/11 */ +@Test(groups="ftp") public class FTPClientTest extends HtsjdkTest { static String host = "ftp.broadinstitute.org"; diff --git a/src/test/java/htsjdk/tribble/util/ftp/FTPUtilsTest.java b/src/test/java/htsjdk/tribble/util/ftp/FTPUtilsTest.java index 87000ee143..a22a897ea0 100644 --- a/src/test/java/htsjdk/tribble/util/ftp/FTPUtilsTest.java +++ b/src/test/java/htsjdk/tribble/util/ftp/FTPUtilsTest.java @@ -15,7 +15,7 @@ */ public class FTPUtilsTest extends HtsjdkTest { - @Test + @Test(groups ="ftp") public void testResourceAvailable() throws Exception { URL goodUrl = new URL("ftp://ftp.broadinstitute.org/pub/igv/TEST/test.txt"); From a5be9f282cff850aff500d5efaceed370d6bf7a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B3mez-S=C3=A1nchez?= Date: Tue, 17 Apr 2018 20:29:50 +0200 Subject: [PATCH 14/83] upgrade jacoco version to 0.8.0 (#1102) --- build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.gradle b/build.gradle index 90acd383da..464b153b04 100644 --- a/build.gradle +++ b/build.gradle @@ -19,6 +19,11 @@ repositories { mavenCentral() } +// JaCoCo version +jacoco { + toolVersion = "0.8.0" +} + jacocoTestReport { group = "Reporting" description = "Generate Jacoco coverage reports after running tests." From e266accbeb063b13cce38eb928c488a77c7936aa Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Tue, 17 Apr 2018 15:07:54 -0400 Subject: [PATCH 15/83] improve documentation in SAMRecord (#1036) * improving documentation for (is|set)(Supplementary|Secondary) methods --- src/main/java/htsjdk/samtools/SAMRecord.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/htsjdk/samtools/SAMRecord.java b/src/main/java/htsjdk/samtools/SAMRecord.java index c53387ca03..e010d9bd5e 100644 --- a/src/main/java/htsjdk/samtools/SAMRecord.java +++ b/src/main/java/htsjdk/samtools/SAMRecord.java @@ -975,14 +975,14 @@ public boolean getNotPrimaryAlignmentFlag() { } /** - * the alignment is secondary (a read having slipt hits have multiple alignment records). + * @return whether the alignment is secondary (an alternative alignment of the read). */ public boolean isSecondaryAlignment() { - return (mFlags & SAMFlag.SECONDARY_ALIGNMENT.flag) != 0; + return (mFlags & SAMFlag.SECONDARY_ALIGNMENT.flag) t!= 0; } /** - * the alignment is supplementary (TODO: further explanation?). + * @return whether the alignment is supplementary (a split alignment such as a chimeric alignment). */ public boolean getSupplementaryAlignmentFlag() { return (mFlags & SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag) != 0; @@ -1080,14 +1080,14 @@ public void setNotPrimaryAlignmentFlag(final boolean flag) { } /** - * the alignment is secondary (a read having slipt hits have multiple alignment records). + * set whether this alignment is secondary (an alternative alignment of the read). */ public void setSecondaryAlignment(final boolean flag) { setFlag(flag, SAMFlag.SECONDARY_ALIGNMENT.flag); } /** - * the alignment is supplementary (TODO: further explanation?). + * set whether this alignment is supplementary (a split alignment such as a chimeric alignment). */ public void setSupplementaryAlignmentFlag(final boolean flag) { setFlag(flag, SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag); From 447f82e03fae70e30aa6c2880c6542711c3a73d3 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Tue, 17 Apr 2018 15:34:39 -0400 Subject: [PATCH 16/83] fix compilation error caused by typo (#1106) fixes error introduced in #1036 --- src/main/java/htsjdk/samtools/SAMRecord.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/htsjdk/samtools/SAMRecord.java b/src/main/java/htsjdk/samtools/SAMRecord.java index e010d9bd5e..3fa1e9eaba 100644 --- a/src/main/java/htsjdk/samtools/SAMRecord.java +++ b/src/main/java/htsjdk/samtools/SAMRecord.java @@ -978,7 +978,7 @@ public boolean getNotPrimaryAlignmentFlag() { * @return whether the alignment is secondary (an alternative alignment of the read). */ public boolean isSecondaryAlignment() { - return (mFlags & SAMFlag.SECONDARY_ALIGNMENT.flag) t!= 0; + return (mFlags & SAMFlag.SECONDARY_ALIGNMENT.flag) != 0; } /** From b754c693c320ab77797e593774b9eaa0b48363ff Mon Sep 17 00:00:00 2001 From: Jay Carey Date: Tue, 1 May 2018 10:27:22 -0400 Subject: [PATCH 17/83] Add a check prior to final sort to adjust file buffer size given the amount of memory we have left. Added debugging messages that estimate the size per record for further tweaking if needed. Use java 8 parallel sort. english better --- .../samtools/util/SortingCollection.java | 88 ++++++++++++++----- .../java/htsjdk/samtools/util/StringUtil.java | 14 +++ 2 files changed, 78 insertions(+), 24 deletions(-) diff --git a/src/main/java/htsjdk/samtools/util/SortingCollection.java b/src/main/java/htsjdk/samtools/util/SortingCollection.java index 46b84c117b..3190a3b902 100644 --- a/src/main/java/htsjdk/samtools/util/SortingCollection.java +++ b/src/main/java/htsjdk/samtools/util/SortingCollection.java @@ -26,7 +26,6 @@ import htsjdk.samtools.Defaults; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -58,7 +57,7 @@ * to compress temporary files. */ public class SortingCollection implements Iterable { - + public static final Log log = Log.getInstance(SortingCollection.class); /** * Client must implement this class, which defines the way in which records are written to and * read from file. @@ -99,9 +98,6 @@ public interface Codec extends Cloneable { /** Directories where files of sorted records go. */ private final Path[] 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. */ @@ -139,6 +135,7 @@ public interface Codec extends Cloneable { * @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 */ + @SuppressWarnings("unchecked") private SortingCollection(final Class componentType, final SortingCollection.Codec codec, final Comparator comparator, final int maxRecordsInRam, final Path... tmpDir) { if (maxRecordsInRam <= 0) { @@ -153,6 +150,7 @@ private SortingCollection(final Class componentType, final SortingCollection. this.codec = codec; this.comparator = comparator; this.maxRecordsInRam = maxRecordsInRam; + this.ramRecords = (T[])Array.newInstance(componentType, maxRecordsInRam); } @@ -164,7 +162,28 @@ public void add(final T rec) { throw new IllegalStateException("Cannot add after calling iterator()"); } if (numRecordsInRam == maxRecordsInRam) { + // sample every 100 files written. + long startMem = 0; + boolean printRecordSizeSampling = files.size() % 100 == 0 && Log.getGlobalLogLevel() == Log.LogLevel.DEBUG; + if (printRecordSizeSampling) { + // Garbage collect and get free memory + Runtime.getRuntime().gc(); + startMem = Runtime.getRuntime().freeMemory(); + } + spillToDisk(); + + if (printRecordSizeSampling) { + //Garbage collect again and get free memory + Runtime.getRuntime().gc(); + long endMem = Runtime.getRuntime().freeMemory(); + + long usedBytes = endMem - startMem; + log.debug(String.format("%d records in ram required approximately %s memory or %s per record. ", maxRecordsInRam, + StringUtil.humanReadableByteCount(usedBytes), + StringUtil.humanReadableByteCount(usedBytes / maxRecordsInRam))); + + } } ramRecords[numRecordsInRam++] = rec; } @@ -215,45 +234,42 @@ public void setDestructiveIteration(boolean destructiveIteration) { /** * Sort the records in memory, write them to a file, and clear the buffer of records in memory. */ + @SuppressWarnings("unchecked") public void spillToDisk() { try { - Arrays.sort(this.ramRecords, 0, this.numRecordsInRam, this.comparator); + Arrays.parallelSort(this.ramRecords, 0, this.numRecordsInRam, this.comparator); + final Path f = newTempFile(); - OutputStream os = null; - try { - os = tempStreamFactory.wrapTempOutputStream(Files.newOutputStream(f), Defaults.BUFFER_SIZE); + try (OutputStream os + = tempStreamFactory.wrapTempOutputStream(Files.newOutputStream(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.toUri() + ". 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 Path newTempFile() throws IOException { - return IOUtil.newTempPath("sortingcollection.", ".tmp", this.tmpDirs, TMP_SPACE_FREE); + /* The minimum amount of space free on a temp filesystem to write a file there. */ + return IOUtil.newTempPath("sortingcollection.", ".tmp", this.tmpDirs, IOUtil.FIVE_GBS); } /** @@ -396,7 +412,7 @@ class InMemoryIterator implements CloseableIterator { private int iterationIndex = 0; InMemoryIterator() { - Arrays.sort(SortingCollection.this.ramRecords, + Arrays.parallelSort(SortingCollection.this.ramRecords, 0, SortingCollection.this.numRecordsInRam, SortingCollection.this.comparator); @@ -448,19 +464,43 @@ class MergingIterator implements CloseableIterator { private final TreeSet queue; MergingIterator() { - this.queue = new TreeSet(new PeekFileRecordIteratorComparator()); + this.queue = new TreeSet<>(new PeekFileRecordIteratorComparator()); int n = 0; - for (final Path f : SortingCollection.this.files) { - final FileRecordIterator it = new FileRecordIterator(f); + log.info(String.format("Creating merging iterator from %d files", files.size())); + int suggestedBufferSize = checkMemoryAndAdjustBuffer(files.size(), Defaults.BUFFER_SIZE); + for (final Path f : files) { + final FileRecordIterator it = new FileRecordIterator(f, suggestedBufferSize); if (it.hasNext()) { this.queue.add(new PeekFileRecordIterator(it, n++)); - } - else { + } else { it.close(); } } } + // Since we need to open and buffer all temp files in the sorting collection at once it is important + // to have enough memory left to do this. This method checks to make sure that, given the number of files and + // the size of the buffer, we can reasonable open all files. If we can't it will return a buffer size that + // is appropriate given the number of temp files and the amount of memory left on the heap. If there isn't + // enough memory for buffering it will return zero and all reading will be unbuffered. + private int checkMemoryAndAdjustBuffer(int numFiles, int bufferSize) { + // garbage collect so that our calculation is accurate. + Runtime.getRuntime().gc(); + + // 90% of free memory to allow for some overhead. + final long freeMemory = (long) (Runtime.getRuntime().freeMemory() * 0.90); + // use the floor value from the divide + final int memoryPerFile = (int) (freeMemory / numFiles); + + if (bufferSize > memoryPerFile) { + log.warn(String.format("Default io buffer size of %s is larger than available memory per file of %s.", + StringUtil.humanReadableByteCount(bufferSize), + StringUtil.humanReadableByteCount(memoryPerFile))); + return memoryPerFile; + } + return bufferSize; + } + @Override public boolean hasNext() { return !this.queue.isEmpty(); @@ -507,12 +547,12 @@ class FileRecordIterator implements CloseableIterator { private final Codec codec; private T currentRecord = null; - FileRecordIterator(final Path file) { + FileRecordIterator(final Path file, final int bufferSize) { this.file = file; try { this.is = Files.newInputStream(file); this.codec = SortingCollection.this.codec.clone(); - this.codec.setInputStream(tempStreamFactory.wrapTempInputStream(this.is, Defaults.BUFFER_SIZE)); + this.codec.setInputStream(tempStreamFactory.wrapTempInputStream(this.is, bufferSize)); advance(); } catch (IOException e) { diff --git a/src/main/java/htsjdk/samtools/util/StringUtil.java b/src/main/java/htsjdk/samtools/util/StringUtil.java index a885ba2dbf..acdf869f60 100644 --- a/src/main/java/htsjdk/samtools/util/StringUtil.java +++ b/src/main/java/htsjdk/samtools/util/StringUtil.java @@ -606,4 +606,18 @@ public static boolean isWithinHammingDistance(final String s1, final String s2, } return true; } + + /** + * Takes a long value representing the number of bytes and produces a human readable byte count. + * @param bytes The number of bytes to create a human readable string for. + * @return A human readable string of the number of bytes given. + */ + public static String humanReadableByteCount(long bytes) { + if (bytes < 1024) { + return bytes + " B"; + } + + int exp = (int) (Math.log(bytes) / Math.log(1024)); + return String.format("%.1f %sB", bytes / Math.pow(1024, exp), "kMGTPE".charAt(exp - 1)); + } } From 205776519b8c3b3b7133cc4f34f8176b02868cb5 Mon Sep 17 00:00:00 2001 From: Jay Carey Date: Tue, 1 May 2018 11:09:05 -0400 Subject: [PATCH 18/83] Review changes. --- src/main/java/htsjdk/samtools/util/SortingCollection.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/htsjdk/samtools/util/SortingCollection.java b/src/main/java/htsjdk/samtools/util/SortingCollection.java index 3190a3b902..2681fcb69a 100644 --- a/src/main/java/htsjdk/samtools/util/SortingCollection.java +++ b/src/main/java/htsjdk/samtools/util/SortingCollection.java @@ -150,7 +150,6 @@ private SortingCollection(final Class componentType, final SortingCollection. this.codec = codec; this.comparator = comparator; this.maxRecordsInRam = maxRecordsInRam; - this.ramRecords = (T[])Array.newInstance(componentType, maxRecordsInRam); } @@ -480,7 +479,7 @@ class MergingIterator implements CloseableIterator { // Since we need to open and buffer all temp files in the sorting collection at once it is important // to have enough memory left to do this. This method checks to make sure that, given the number of files and - // the size of the buffer, we can reasonable open all files. If we can't it will return a buffer size that + // the size of the buffer, we can reasonably open all files. If we can't it will return a buffer size that // is appropriate given the number of temp files and the amount of memory left on the heap. If there isn't // enough memory for buffering it will return zero and all reading will be unbuffered. private int checkMemoryAndAdjustBuffer(int numFiles, int bufferSize) { From f598f58dc73b52f9167e974d3870d8db9b653877 Mon Sep 17 00:00:00 2001 From: Jay Carey Date: Tue, 1 May 2018 11:38:28 -0400 Subject: [PATCH 19/83] Review changes. Code reformat. --- .../samtools/util/SortingCollection.java | 130 +++++++++--------- 1 file changed, 67 insertions(+), 63 deletions(-) diff --git a/src/main/java/htsjdk/samtools/util/SortingCollection.java b/src/main/java/htsjdk/samtools/util/SortingCollection.java index 2681fcb69a..b4fcff6848 100644 --- a/src/main/java/htsjdk/samtools/util/SortingCollection.java +++ b/src/main/java/htsjdk/samtools/util/SortingCollection.java @@ -49,15 +49,16 @@ * 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 implements Iterable { - public static final Log log = Log.getInstance(SortingCollection.class); + private static final Log log = Log.getInstance(SortingCollection.class); + /** * Client must implement this class, which defines the way in which records are written to and * read from file. @@ -65,23 +66,28 @@ public class SortingCollection implements Iterable { public interface Codec 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. */ @@ -95,7 +101,9 @@ public interface Codec extends Cloneable { Codec clone(); } - /** Directories where files of sorted records go. */ + /** + * Directories where files of sorted records go. + */ private final Path[] tmpDirs; /** @@ -129,15 +137,15 @@ public interface Codec extends Cloneable { /** * 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 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 + * @param tmpDir Where to write files of records that will not fit in RAM */ - @SuppressWarnings("unchecked") private SortingCollection(final Class componentType, final SortingCollection.Codec codec, - final Comparator comparator, final int maxRecordsInRam, final Path... tmpDir) { + final Comparator comparator, final int maxRecordsInRam, final Path... tmpDir) { if (maxRecordsInRam <= 0) { throw new IllegalArgumentException("maxRecordsInRam must be > 0"); } @@ -150,7 +158,9 @@ private SortingCollection(final Class componentType, final SortingCollection. this.codec = codec; this.comparator = comparator; this.maxRecordsInRam = maxRecordsInRam; - this.ramRecords = (T[])Array.newInstance(componentType, maxRecordsInRam); + @SuppressWarnings("unchecked") + T[] ramRecords = (T[]) Array.newInstance(componentType, maxRecordsInRam); + this.ramRecords = ramRecords; } public void add(final T rec) { @@ -233,14 +243,13 @@ public void setDestructiveIteration(boolean destructiveIteration) { /** * Sort the records in memory, write them to a file, and clear the buffer of records in memory. */ - @SuppressWarnings("unchecked") public void spillToDisk() { try { Arrays.parallelSort(this.ramRecords, 0, this.numRecordsInRam, this.comparator); final Path f = newTempFile(); try (OutputStream os - = tempStreamFactory.wrapTempOutputStream(Files.newOutputStream(f), Defaults.BUFFER_SIZE)){ + = tempStreamFactory.wrapTempOutputStream(Files.newOutputStream(f), Defaults.BUFFER_SIZE)) { this.codec.setOutputStream(os); for (int i = 0; i < this.numRecordsInRam; ++i) { this.codec.encode(ramRecords[i]); @@ -255,8 +264,7 @@ public void spillToDisk() { this.numRecordsInRam = 0; this.files.add(f); - } - catch (IOException e) { + } catch (IOException e) { throw new RuntimeIOException(e); } } @@ -303,12 +311,11 @@ public void cleanup() { /** * 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 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 - * + * @param tmpDir Where to write files of records that will not fit in RAM * @deprecated since 2017-09. Use {@link #newInstance(Class, Codec, Comparator, int, Path...)} instead */ @Deprecated @@ -324,12 +331,11 @@ public static SortingCollection newInstance(final Class componentType, /** * 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 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 - * + * @param tmpDirs Where to write files of records that will not fit in RAM * @deprecated since 2017-09. Use {@link #newInstanceFromPaths(Class, Codec, Comparator, int, Collection)} instead */ @Deprecated @@ -339,10 +345,10 @@ public static SortingCollection newInstance(final Class componentType, final int maxRecordsInRAM, final Collection tmpDirs) { return new SortingCollection(componentType, - codec, - comparator, - maxRecordsInRAM, - tmpDirs.stream().map(File::toPath).toArray(Path[]::new)); + codec, + comparator, + maxRecordsInRAM, + tmpDirs.stream().map(File::toPath).toArray(Path[]::new)); } @@ -350,9 +356,9 @@ public static SortingCollection newInstance(final Class componentType, /** * 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 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 SortingCollection newInstance(final Class componentType, @@ -367,17 +373,17 @@ public static SortingCollection newInstance(final Class componentType, /** * 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 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 + * @param tmpDir Where to write files of records that will not fit in RAM */ public static SortingCollection newInstance(final Class componentType, - final SortingCollection.Codec codec, - final Comparator comparator, - final int maxRecordsInRAM, - final Path... tmpDir) { + final SortingCollection.Codec codec, + final Comparator comparator, + final int maxRecordsInRAM, + final Path... tmpDir) { return new SortingCollection(componentType, codec, comparator, maxRecordsInRAM, tmpDir); } @@ -385,17 +391,17 @@ public static SortingCollection newInstance(final Class componentType, /** * 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 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 + * @param tmpDirs Where to write files of records that will not fit in RAM */ public static SortingCollection newInstanceFromPaths(final Class componentType, - final SortingCollection.Codec codec, - final Comparator comparator, - final int maxRecordsInRAM, - final Collection tmpDirs) { + final SortingCollection.Codec codec, + final Comparator comparator, + final int maxRecordsInRAM, + final Collection tmpDirs) { return new SortingCollection(componentType, codec, comparator, @@ -412,9 +418,9 @@ class InMemoryIterator implements CloseableIterator { InMemoryIterator() { Arrays.parallelSort(SortingCollection.this.ramRecords, - 0, - SortingCollection.this.numRecordsInRam, - SortingCollection.this.comparator); + 0, + SortingCollection.this.numRecordsInRam, + SortingCollection.this.comparator); } @Override @@ -449,7 +455,7 @@ public void remove() { * 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 @@ -468,11 +474,10 @@ class MergingIterator implements CloseableIterator { log.info(String.format("Creating merging iterator from %d files", files.size())); int suggestedBufferSize = checkMemoryAndAdjustBuffer(files.size(), Defaults.BUFFER_SIZE); for (final Path f : files) { - final FileRecordIterator it = new FileRecordIterator(f, suggestedBufferSize); - if (it.hasNext()) { - this.queue.add(new PeekFileRecordIterator(it, n++)); - } else { - it.close(); + try (final FileRecordIterator it = new FileRecordIterator(f, suggestedBufferSize)) { + if (it.hasNext()) { + this.queue.add(new PeekFileRecordIterator(it, n++)); + } } } } @@ -515,9 +520,8 @@ public T next() { final T ret = fileIterator.next(); if (fileIterator.hasNext()) { this.queue.add(fileIterator); - } - else { - ((CloseableIterator)fileIterator.getUnderlyingIterator()).close(); + } else { + ((CloseableIterator) fileIterator.getUnderlyingIterator()).close(); } return ret; @@ -532,7 +536,7 @@ public void remove() { public void close() { while (!this.queue.isEmpty()) { final PeekFileRecordIterator it = this.queue.pollFirst(); - ((CloseableIterator)it.getUnderlyingIterator()).close(); + ((CloseableIterator) it.getUnderlyingIterator()).close(); } } } @@ -553,8 +557,7 @@ class FileRecordIterator implements CloseableIterator { this.codec = SortingCollection.this.codec.clone(); this.codec.setInputStream(tempStreamFactory.wrapTempInputStream(this.is, bufferSize)); advance(); - } - catch (IOException e) { + } catch (IOException e) { throw new RuntimeIOException(e); } } @@ -595,6 +598,7 @@ public void close() { */ class PeekFileRecordIterator extends PeekIterator { final int n; // A serial number used for tie-breaking in the sort + PeekFileRecordIterator(final Iterator underlyingIterator, final int n) { super(underlyingIterator); this.n = n; From 5192ca920f85138fa5af153b45d4f02c5681be2a Mon Sep 17 00:00:00 2001 From: Jay Carey Date: Tue, 1 May 2018 12:33:43 -0400 Subject: [PATCH 20/83] Change cause premature close. --- .../java/htsjdk/samtools/util/SortingCollection.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/htsjdk/samtools/util/SortingCollection.java b/src/main/java/htsjdk/samtools/util/SortingCollection.java index b4fcff6848..e5463f0629 100644 --- a/src/main/java/htsjdk/samtools/util/SortingCollection.java +++ b/src/main/java/htsjdk/samtools/util/SortingCollection.java @@ -474,10 +474,11 @@ class MergingIterator implements CloseableIterator { log.info(String.format("Creating merging iterator from %d files", files.size())); int suggestedBufferSize = checkMemoryAndAdjustBuffer(files.size(), Defaults.BUFFER_SIZE); for (final Path f : files) { - try (final FileRecordIterator it = new FileRecordIterator(f, suggestedBufferSize)) { - if (it.hasNext()) { - this.queue.add(new PeekFileRecordIterator(it, n++)); - } + final FileRecordIterator it = new FileRecordIterator(f, suggestedBufferSize); + if (it.hasNext()) { + this.queue.add(new PeekFileRecordIterator(it, n++)); + } else { + it.close(); } } } From 73bf89c945122a4070f06a4929c5271a95baeac0 Mon Sep 17 00:00:00 2001 From: Kirill Volkov Date: Tue, 1 May 2018 21:55:52 +0300 Subject: [PATCH 21/83] Add support for long reference sequences (#980) * Add support for long reference sequences * Refactor validation checks * Replace checking reference dictionary length with reference sequence length --- .../java/htsjdk/samtools/BAMRecordCodec.java | 25 ++++-- src/main/java/htsjdk/samtools/SAMRecord.java | 52 ++++++++++-- src/main/java/htsjdk/samtools/SAMUtils.java | 8 ++ .../htsjdk/samtools/SAMRecordUnitTest.java | 67 ++++++++++++++++ .../java/htsjdk/samtools/SamSpecIntTest.java | 74 +++++++++--------- .../samtools/inttest_large_coordinates.bam | Bin 0 -> 342 bytes .../samtools/inttest_large_coordinates.sam | 26 ++++++ 7 files changed, 202 insertions(+), 50 deletions(-) create mode 100644 src/test/resources/htsjdk/samtools/inttest_large_coordinates.bam create mode 100644 src/test/resources/htsjdk/samtools/inttest_large_coordinates.sam diff --git a/src/main/java/htsjdk/samtools/BAMRecordCodec.java b/src/main/java/htsjdk/samtools/BAMRecordCodec.java index afcddb3fe6..8df15d208e 100644 --- a/src/main/java/htsjdk/samtools/BAMRecordCodec.java +++ b/src/main/java/htsjdk/samtools/BAMRecordCodec.java @@ -24,6 +24,7 @@ package htsjdk.samtools; import htsjdk.samtools.util.BinaryCodec; +import htsjdk.samtools.util.Log; import htsjdk.samtools.util.RuntimeEOFException; import htsjdk.samtools.util.SortingCollection; @@ -35,11 +36,15 @@ * Class for translating between in-memory and disk representation of BAMRecord. */ public class BAMRecordCodec implements SortingCollection.Codec { + private final static Log LOG = Log.getInstance(BAMRecordCodec.class); + private final SAMFileHeader header; private final BinaryCodec binaryCodec = new BinaryCodec(); private final BinaryTagCodec binaryTagCodec = new BinaryTagCodec(binaryCodec); private final SAMRecordFactory samRecordFactory; + private boolean isReferenceSizeWarningShowed = false; + public BAMRecordCodec(final SAMFileHeader header) { this(header, new DefaultSAMRecordFactory()); } @@ -120,12 +125,9 @@ public void encode(final SAMRecord alignment) { } int indexBin = 0; - if (alignment.getReferenceIndex() >= 0) { - if (alignment.getIndexingBin() != null) { - indexBin = alignment.getIndexingBin(); - } else { - indexBin = alignment.computeIndexingBin(); - } + if (alignment.getAlignmentStart() != SAMRecord.NO_ALIGNMENT_START) { + warnIfReferenceIsTooLargeForBinField(alignment); + indexBin = alignment.computeIndexingBinIfAbsent(alignment); } // Blurt out the elements @@ -181,6 +183,17 @@ public void encode(final SAMRecord alignment) { } } + private void warnIfReferenceIsTooLargeForBinField(final SAMRecord rec) { + final SAMSequenceRecord sequence = rec.getHeader() != null ? rec.getHeader().getSequence(rec.getReferenceName()) : null; + if (!isReferenceSizeWarningShowed + && sequence != null + && SAMUtils.isReferenceSequenceCompatibleWithBAI(sequence) + && rec.getValidationStringency() != ValidationStringency.SILENT) { + LOG.warn("Reference length is too large for BAM bin field. Values in the bin field could be incorrect."); + isReferenceSizeWarningShowed = true; + } + } + /** * Read the next record from the input stream and convert into a java object. * diff --git a/src/main/java/htsjdk/samtools/SAMRecord.java b/src/main/java/htsjdk/samtools/SAMRecord.java index 3fa1e9eaba..24c0ffe0ff 100644 --- a/src/main/java/htsjdk/samtools/SAMRecord.java +++ b/src/main/java/htsjdk/samtools/SAMRecord.java @@ -26,8 +26,10 @@ import htsjdk.samtools.util.CoordMath; import htsjdk.samtools.util.Locatable; +import htsjdk.samtools.util.Log; import htsjdk.samtools.util.SequenceUtil; import htsjdk.samtools.util.StringUtil; +import htsjdk.samtools.util.BinaryCodec; import java.io.Serializable; import java.lang.reflect.Array; @@ -104,6 +106,8 @@ * @author mishali.naik@intel.com */ public class SAMRecord implements Cloneable, Locatable, Serializable { + private final static Log LOG = Log.getInstance(SAMRecord.class); + public static final long serialVersionUID = 1L; /** @@ -1581,6 +1585,24 @@ int computeIndexingBin() { return GenomicIndexUtil.regionToBin(alignmentStart, alignmentEnd); } + + /** + * Gets indexing bin if it is present otherwise compute it. + * @param alignment to compute indexing bin for. + * @return indexing bin. + */ + public int computeIndexingBinIfAbsent(final SAMRecord alignment) { + if (alignment.getIndexingBin() != null) { + return alignment.getIndexingBin(); + } else { + return getUshort(alignment.computeIndexingBin()); + } + } + + private int getUshort(int value) { + return value & (int) BinaryCodec.MAX_USHORT; + } + /** * @return the SAMFileHeader for this record. If the header is null, the following SAMRecord methods may throw * exceptions: @@ -2083,13 +2105,25 @@ public List isValid(final boolean firstOnly) { if (firstOnly) return ret; } - if (this.getAlignmentStart() != NO_ALIGNMENT_START && this.getIndexingBin() != null && - this.computeIndexingBin() != this.getIndexingBin()) { - if (ret == null) ret = new ArrayList<>(); - 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 (this.getAlignmentStart() != NO_ALIGNMENT_START) { + final SAMSequenceRecord sequence = getHeader() != null ? getHeader().getSequence(getReferenceName()) : null; + if (sequence != null && SAMUtils.isReferenceSequenceCompatibleWithBAI(sequence)) { + if (getValidationStringency() != ValidationStringency.SILENT) { + if (getReferenceName() != null) { + LOG.warn(String.format("%s reference length is too large for BAM bin field. %s record bin field value is incorrect.", + getReferenceName(), getReadName())); + } else { + LOG.warn(String.format("Reference length is too large for BAM bin field. %s record bin field value is incorrect.", + getReadName())); + } + } + } else if (isIndexingBinNotEqualsComputedBin()) { + if (ret == null) ret = new ArrayList<>(); + 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 (getMateReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME) && @@ -2124,6 +2158,10 @@ public List isValid(final boolean firstOnly) { return ret; } + private boolean isIndexingBinNotEqualsComputedBin() { + return this.getIndexingBin() != null && this.computeIndexingBin() != this.getIndexingBin(); + } + /** * Gets the source of this SAM record -- both the reader that retrieved the record and the position on disk from * whence it came. diff --git a/src/main/java/htsjdk/samtools/SAMUtils.java b/src/main/java/htsjdk/samtools/SAMUtils.java index 6d24f00e8b..408ff121f9 100644 --- a/src/main/java/htsjdk/samtools/SAMUtils.java +++ b/src/main/java/htsjdk/samtools/SAMUtils.java @@ -1236,4 +1236,12 @@ public static List getOtherCanonicalAlignments(final SAMRecord record } return alignments; } + + /** + * Checks if reference sequence is compatible with BAI indexing format. + * @param sequence reference sequence. + */ + public static boolean isReferenceSequenceCompatibleWithBAI(final SAMSequenceRecord sequence) { + return sequence.getSequenceLength() > GenomicIndexUtil.BIN_GENOMIC_SPAN; + } } diff --git a/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java b/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java index e9b599b353..135d5a321d 100644 --- a/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java +++ b/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java @@ -33,7 +33,10 @@ import java.io.*; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Optional; public class SAMRecordUnitTest extends HtsjdkTest { @@ -568,6 +571,70 @@ public void testInvalidAlignmentStartValidation() { Assert.assertTrue(validationErrors != null && validationErrors.size() == 1); } + @DataProvider + public Object [][] binFieldValidationData() { + return new Object[][]{ + {1519, 4681, 51, 16571, false}, + {1519, 4685, 51, 16571, true}, + {16500, 4681, 51, 16571, true}, + {100000, 4687, 1000, 500_000_000, false}, + {300000000, 44, 1000000, 500_000_000, false}, + {300000000, 100000, 1000000, 500_000_000, true}, + + {100000, 4681, 1000, 1000_000_000, false}, + {100000, 4681, 10000, 2000_000_000, false}, + }; + } + + @Test(dataProvider = "binFieldValidationData") + public void testBinFieldValidation(final int alignmentStart, + final int bin, + final int readLength, + final int referenceLength, + final boolean isErrorExpected) { + final SAMRecord sam = createSamRecordWithHeaderAndBin(alignmentStart, bin, readLength, referenceLength); + + final List errorList = sam.isValid(false); + + final boolean hasError = Optional.ofNullable(errorList) + .map(Collection::stream) + .map(stream -> stream.anyMatch(error -> error.getType() == SAMValidationError.Type.INVALID_INDEXING_BIN)) + .orElse(false); + Assert.assertEquals(hasError, isErrorExpected); + } + + private SAMRecord createSamRecordWithHeaderAndBin(final int alignmentStart, + final int bin, + final int readLength, + final int referenceLength) { + final SAMRecord rec = createSamRecord(alignmentStart, readLength); + rec.setIndexingBin(bin); + + final String referenceName = "Sheila"; + rec.setReferenceName(referenceName); + + final SAMFileHeader header = createHeaderWithOneReference(referenceName, referenceLength); + rec.setHeader(header); + + return rec; + } + + private SAMRecord createSamRecord(final int alignmentStart, final int readLength) { + final SAMRecordSetBuilder recordsBuilder = new SAMRecordSetBuilder(); + recordsBuilder.setReadLength(readLength); + return recordsBuilder.addFrag("test", 0, alignmentStart, false, false, readLength + "M", null, 2); + } + + private SAMFileHeader createHeaderWithOneReference(final String referenceName, final int referenceLength) { + final SAMSequenceRecord sequenceRecord = new SAMSequenceRecord(referenceName, referenceLength); + final List records = Collections.singletonList(sequenceRecord); + final SAMSequenceDictionary dict = new SAMSequenceDictionary(records); + final SAMFileHeader header = new SAMFileHeader(dict); + final SAMReadGroupRecord groupRecord = new SAMReadGroupRecord("1"); + header.setReadGroups(Collections.singletonList(groupRecord)); + return header; + } + // ----------------- NULL header tests --------------------- @Test diff --git a/src/test/java/htsjdk/samtools/SamSpecIntTest.java b/src/test/java/htsjdk/samtools/SamSpecIntTest.java index 2ebc24e701..58dcb79d23 100644 --- a/src/test/java/htsjdk/samtools/SamSpecIntTest.java +++ b/src/test/java/htsjdk/samtools/SamSpecIntTest.java @@ -27,6 +27,7 @@ import htsjdk.HtsjdkTest; import htsjdk.samtools.util.CloserUtil; import org.testng.Assert; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.File; @@ -35,50 +36,49 @@ import java.util.List; public class SamSpecIntTest extends HtsjdkTest { - 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"); + private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools"); - @Test - public void testSamIntegers() throws IOException { - final List errorMessages = new ArrayList(); - 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); + @DataProvider(name = "testSamIntegersTestCases") + public Object[][] testSamIntegersTestCases() { + return new Object[][]{ + {"inttest.sam"}, + {"inttest_large_coordinates.sam"} + }; + } - 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()); - } - } + @DataProvider(name = "testBamIntegersTestCases") + public Object[][] testBamIntegersTestCases() { + return new Object[][]{ + {"inttest.bam"}, + {"inttest_large_coordinates.bam"} + }; + } - CloserUtil.close(samReader); - samWriter.close(); - bamWriter.close(); - Assert.assertEquals(errorMessages.size(), 0); - bamOutput.deleteOnExit(); - samOutput.deleteOnExit(); + @Test(dataProvider = "testSamIntegersTestCases") + public void testSamIntegers(final String inputFile) throws IOException { + final File input = new File(TEST_DATA_DIR, inputFile); + final SamReader samReader = SamReaderFactory.makeDefault().open(input); + + tryToWriteToSamAndBam(samReader); } - @Test - public void testBamIntegers() throws IOException { - final List errorMessages = new ArrayList(); - final SamReader bamReader = SamReaderFactory.makeDefault().open(BAM_INPUT); + @Test(dataProvider = "testBamIntegersTestCases") + public void testBamIntegers(final String inputFile) throws IOException { + final File input = new File(TEST_DATA_DIR, inputFile); + final SamReader bamReader = SamReaderFactory.makeDefault().open(input); + + tryToWriteToSamAndBam(bamReader); + } + + private void tryToWriteToSamAndBam(final SamReader reader) throws IOException { 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()) { + final SAMFileWriter samWriter = new SAMFileWriterFactory().makeWriter(reader.getFileHeader(), true, samOutput, null); + final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeWriter(reader.getFileHeader(), true, bamOutput, null); + + final List errorMessages = new ArrayList<>(); + for (SAMRecord rec : reader) { try { - final SAMRecord rec = iterator.next(); samWriter.addAlignment(rec); bamWriter.addAlignment(rec); } catch (final Throwable e) { @@ -87,7 +87,7 @@ public void testBamIntegers() throws IOException { } } - CloserUtil.close(bamReader); + CloserUtil.close(reader); samWriter.close(); bamWriter.close(); Assert.assertEquals(errorMessages.size(), 0); diff --git a/src/test/resources/htsjdk/samtools/inttest_large_coordinates.bam b/src/test/resources/htsjdk/samtools/inttest_large_coordinates.bam new file mode 100644 index 0000000000000000000000000000000000000000..b88e777337152eb9ee579e9f3b13bc33ec424150 GIT binary patch literal 342 zcmb2|=3rp}f&Xj_PR>jWc?`uxUs6jF6A}tO6g=elyxHiA@l&2}+qKSWpVQa!^nF;w z!S{sc+h(qF9%s*ZKKa6^WzfK&%&gb0Q10h1uI(>=E+KyPmOnLmZVN2mIPe6XRVd1u zX3DUg?GJZ6&=z?#>rOE&o$SbU$UwwJom+fY(L={oTh|`#GGSb3t@wa7N&N0CW|glJ z>ug$HE|CRWIz$$1(wr-KU|} Date: Tue, 1 May 2018 15:28:13 -0400 Subject: [PATCH 22/83] Review cleanup --- .../samtools/util/SortingCollection.java | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/htsjdk/samtools/util/SortingCollection.java b/src/main/java/htsjdk/samtools/util/SortingCollection.java index e5463f0629..f166568197 100644 --- a/src/main/java/htsjdk/samtools/util/SortingCollection.java +++ b/src/main/java/htsjdk/samtools/util/SortingCollection.java @@ -66,15 +66,11 @@ public class SortingCollection implements Iterable { public interface Codec 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); @@ -133,7 +129,7 @@ public interface Codec extends Cloneable { private boolean destructiveIteration = true; - private TempStreamFactory tempStreamFactory = new TempStreamFactory(); + private final TempStreamFactory tempStreamFactory = new TempStreamFactory(); /** * Prepare to accumulate records to be sorted @@ -324,7 +320,7 @@ public static SortingCollection newInstance(final Class componentType, final Comparator comparator, final int maxRecordsInRAM, final File... tmpDir) { - return new SortingCollection(componentType, codec, comparator, maxRecordsInRAM, Arrays.stream(tmpDir).map(File::toPath).toArray(Path[]::new)); + return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, Arrays.stream(tmpDir).map(File::toPath).toArray(Path[]::new)); } @@ -344,7 +340,7 @@ public static SortingCollection newInstance(final Class componentType, final Comparator comparator, final int maxRecordsInRAM, final Collection tmpDirs) { - return new SortingCollection(componentType, + return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, @@ -367,7 +363,7 @@ public static SortingCollection newInstance(final Class componentType, final int maxRecordsInRAM) { final Path tmpDir = Paths.get(System.getProperty("java.io.tmpdir")); - return new SortingCollection(componentType, codec, comparator, maxRecordsInRAM, tmpDir); + return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, tmpDir); } /** @@ -384,7 +380,7 @@ public static SortingCollection newInstance(final Class componentType, final Comparator comparator, final int maxRecordsInRAM, final Path... tmpDir) { - return new SortingCollection(componentType, codec, comparator, maxRecordsInRAM, tmpDir); + return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, tmpDir); } @@ -402,7 +398,7 @@ public static SortingCollection newInstanceFromPaths(final Class compo final Comparator comparator, final int maxRecordsInRAM, final Collection tmpDirs) { - return new SortingCollection(componentType, + return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, @@ -472,7 +468,7 @@ class MergingIterator implements CloseableIterator { this.queue = new TreeSet<>(new PeekFileRecordIteratorComparator()); int n = 0; log.info(String.format("Creating merging iterator from %d files", files.size())); - int suggestedBufferSize = checkMemoryAndAdjustBuffer(files.size(), Defaults.BUFFER_SIZE); + int suggestedBufferSize = checkMemoryAndAdjustBuffer(files.size()); for (final Path f : files) { final FileRecordIterator it = new FileRecordIterator(f, suggestedBufferSize); if (it.hasNext()) { @@ -488,7 +484,8 @@ class MergingIterator implements CloseableIterator { // the size of the buffer, we can reasonably open all files. If we can't it will return a buffer size that // is appropriate given the number of temp files and the amount of memory left on the heap. If there isn't // enough memory for buffering it will return zero and all reading will be unbuffered. - private int checkMemoryAndAdjustBuffer(int numFiles, int bufferSize) { + private int checkMemoryAndAdjustBuffer(int numFiles) { + int bufferSize = Defaults.BUFFER_SIZE; // garbage collect so that our calculation is accurate. Runtime.getRuntime().gc(); @@ -501,7 +498,7 @@ private int checkMemoryAndAdjustBuffer(int numFiles, int bufferSize) { log.warn(String.format("Default io buffer size of %s is larger than available memory per file of %s.", StringUtil.humanReadableByteCount(bufferSize), StringUtil.humanReadableByteCount(memoryPerFile))); - return memoryPerFile; + bufferSize = memoryPerFile; } return bufferSize; } From 1aaba3dd054c4776323106e122c7faeff78dcd0f Mon Sep 17 00:00:00 2001 From: Pierre Lindenbaum Date: Tue, 14 Mar 2017 10:41:07 +0100 Subject: [PATCH 23/83] avoid unecessary garbage creation when writing VCF * adding a new method VCFEncoder.write which write a VCF line directly to an Appendable instead of having to create a String first. * this avoids unecessary String creation while writing VCFs by directly writing the vcf line to an appendable instead of creating a String first * updating VCFWriter to use VCFEncoder.write(outputWriter) instead of outputwriter.write(VCFEncoder.encode()) --- .../variantcontext/writer/VCFWriter.java | 3 +- .../java/htsjdk/variant/vcf/VCFEncoder.java | 286 ++++++++++-------- 2 files changed, 163 insertions(+), 126 deletions(-) diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java index 593f3619c0..a01d301df6 100644 --- a/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java +++ b/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java @@ -223,7 +223,8 @@ public void add(final VariantContext context) { throw new IllegalStateException("Unable to write the VCF: header is missing, " + "try to call writeHeader or setHeader first."); } - write(this.vcfEncoder.encode(this.doNotWriteGenotypes ? new VariantContextBuilder(context).noGenotypes().make() : context)); + if (this.doNotWriteGenotypes) this.vcfEncoder.write(this.writer,new VariantContextBuilder(context).noGenotypes().make()); + else this.vcfEncoder.write(this.writer,context); write("\n"); writeAndResetBuffer(); diff --git a/src/main/java/htsjdk/variant/vcf/VCFEncoder.java b/src/main/java/htsjdk/variant/vcf/VCFEncoder.java index 0605b73b9f..e39d13ecdc 100644 --- a/src/main/java/htsjdk/variant/vcf/VCFEncoder.java +++ b/src/main/java/htsjdk/variant/vcf/VCFEncoder.java @@ -1,5 +1,6 @@ package htsjdk.variant.vcf; +import htsjdk.samtools.util.RuntimeIOException; import htsjdk.tribble.util.ParsingUtils; import htsjdk.variant.variantcontext.Allele; import htsjdk.variant.variantcontext.Genotype; @@ -9,6 +10,7 @@ import htsjdk.variant.variantcontext.VariantContext; import htsjdk.variant.variantcontext.writer.IntGenotypeFieldAccessors; +import java.io.IOException; import java.lang.reflect.Array; import java.nio.charset.Charset; import java.util.ArrayList; @@ -64,46 +66,65 @@ 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."); + /** encodes a new Variant context as VCF + * @return the VCF line + */public String encode(final VariantContext context) {try { + final StringBuilder stringBuilder = new StringBuilder(1000); + write(stringBuilder,context); + return stringBuilder.toString(); + } catch (final IOException error) { + throw new RuntimeIOException("Cannot encode variant", error); } + } - 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); + /** + * encodes a new Variant context as VCF, writes it to a java.lang.Appendable + * + + * @param vcfoutput the java.lang.Appendable + * @param context the variant + * @return the java.lang.Appendable 'vcfoutput' + * @throws IOException + */ + public void write(final Appendable vcfoutput, final VariantContext context) throws IOException { + if (this.header == null) { + throw new NullPointerException("The header field must be set on the VCFEncoder before encoding records."); - // 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); +} + // CHROM + vcfoutput.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(); + vcfoutput.append(alt); + + for (int i = 1; i < context.getAlternateAlleles().size(); i++) { + altAllele = context.getAlternateAllele(i); + alt = altAllele.getDisplayString(); + vcfoutput.append(','); + vcfoutput.append(alt); + } + } else { + vcfoutput.append(VCFConstants.EMPTY_ALTERNATE_ALLELE_FIELD); + } + + vcfoutput.append(VCFConstants.FIELD_SEPARATOR); + + // QUAL + if ( ! context.hasLog10PError()) vcfoutput.append(VCFConstants.MISSING_VALUE_v4); + else vcfoutput.append(formatQualValue(context.getPhredScaledQual())); + vcfoutput.append(VCFConstants.FIELD_SEPARATOR) + // FILTER + .append(getFilterString(context)).append(VCFConstants.FIELD_SEPARATOR); // INFO final Map infoFields = new TreeMap<>(); @@ -114,32 +135,32 @@ public String encode(final VariantContext context) { 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 genotypeAttributeKeys = context.calcVCFGenotypeKeys(this.header); - if (!genotypeAttributeKeys.isEmpty()) { - for (final String format : genotypeAttributeKeys) - if (!this.header.hasFormatLine(format)) - fieldIsMissingFromHeaderError(context, format, "FORMAT"); + writeInfoString(infoFields, vcfoutput); + + // FORMAT + final GenotypesContext gc = context.getGenotypes(); + if (gc.isLazyWithData() && ((LazyGenotypesContext) gc).getUnparsedGenotypeData() instanceof String) { + vcfoutput.append(VCFConstants.FIELD_SEPARATOR); + vcfoutput.append(((LazyGenotypesContext) gc).getUnparsedGenotypeData().toString()); + } else { + final List 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); + vcfoutput.append(VCFConstants.FIELD_SEPARATOR); + vcfoutput.append(genotypeFormatString); - final Map alleleStrings = buildAlleleStrings(context); - addGenotypeData(context, alleleStrings, genotypeAttributeKeys, stringBuilder); - } - } + final Map alleleStrings = buildAlleleStrings(context); + appendGenotypeData(context, alleleStrings, genotypeAttributeKeys, vcfoutput); + } + } - return stringBuilder.toString(); - } + + } VCFHeader getVCFHeader() { return this.header; @@ -175,28 +196,28 @@ private void fieldIsMissingFromHeaderError(final VariantContext vc, final String + " 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(); + @SuppressWarnings("rawtypes")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; } @@ -244,14 +265,29 @@ static boolean isMissingValue(final String s) { return (countOccurrences(VCFConstants.MISSING_VALUE_v4.charAt(0), s) + countOccurrences(',', s) == s.length()); } - /* - * Add the genotype data + /* + * Add the genotype data + */ + public void addGenotypeData(final VariantContext vc, final Map alleleMap, final List genotypeFormatKeys, final StringBuilder builder) { + try { + appendGenotypeData(vc,alleleMap,genotypeFormatKeys,builder); + } catch (final IOException err) { + throw new RuntimeIOException("addGenotypeData failed",err); + } + } + + /** + * Add the genotype Data to a java.lang.Appendable + * @param vc the variant + * @param alleleMap + * @param genotypeFormatKeys + * @param vcfoutput VCF output + * @throws IOException */ - public void addGenotypeData(final VariantContext vc, final Map alleleMap, final List genotypeFormatKeys, final StringBuilder builder) { - final int ploidy = vc.getMaxPloidy(2); + private void appendGenotypeData(final VariantContext vc, final Map alleleMap, final List genotypeFormatKeys, final Appendable vcfoutput) throws IOException {final int ploidy = vc.getMaxPloidy(2); - for (final String sample : this.header.getGenotypeSamples()) { - builder.append(VCFConstants.FIELD_SEPARATOR); + for (final String sample : this.header.getGenotypeSamples()) { + vcfoutput.append(VCFConstants.FIELD_SEPARATOR); Genotype g = vc.getGenotype(sample); if (g == null) g = GenotypeBuilder.createMissing(sample, ploidy); @@ -263,12 +299,12 @@ public void addGenotypeData(final VariantContext vc, final Map a 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; + writeAllele(g.getAllele(0), alleleMap, vcfoutput); + for (int i = 1; i < g.getPloidy(); i++) { + vcfoutput.append(g.isPhased() ? VCFConstants.PHASED : VCFConstants.UNPHASED); + writeAllele(g.getAllele(i), alleleMap, vcfoutput); + } + continue; } else { final String outputValue; @@ -327,40 +363,40 @@ else if (intValues.length == 1) // fast path } } - 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 infoFields, final StringBuilder builder) { - if (infoFields.isEmpty()) { - builder.append(VCFConstants.EMPTY_INFO_FIELD); - return; - } + for (int i = 0; i < attrs.size(); i++) { + if ( i > 0 || genotypeFormatKeys.contains(VCFConstants.GENOTYPE_KEY)) { + vcfoutput.append(VCFConstants.GENOTYPE_FIELD_SEPARATOR); + } + vcfoutput.append(attrs.get(i)); + } + } + } + + /* + * Create the info string; assumes that no values are null + */ + private void writeInfoString(final Map infoFields, final Appendable vcfoutput) throws IOException { + if ( infoFields.isEmpty() ) { + vcfoutput.append(VCFConstants.EMPTY_INFO_FIELD); + return; + } boolean isFirst = true; for (final Map.Entry entry : infoFields.entrySet()) { if (isFirst) isFirst = false; - else builder.append(VCFConstants.INFO_FIELD_SEPARATOR); + else vcfoutput.append(VCFConstants.INFO_FIELD_SEPARATOR); - builder.append(entry.getKey()); + vcfoutput.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()); - } - } - } - } + if ( ! entry.getValue().isEmpty()) { + final VCFInfoHeaderLine metaData = this.header.getInfoHeaderLine(entry.getKey()); + if ( metaData == null || metaData.getCountType() != VCFHeaderLineCount.INTEGER || metaData.getCount() != 0 ) { + vcfoutput.append('='); + vcfoutput.append(entry.getValue()); + } + } + } + } public Map buildAlleleStrings(final VariantContext vc) { final Map alleleMap = new HashMap(vc.getAlleles().size() + 1); @@ -374,10 +410,10 @@ public Map buildAlleleStrings(final VariantContext vc) { return alleleMap; } - private void writeAllele(final Allele allele, final Map 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); - } + private void writeAllele(final Allele allele, final Map alleleMap, final Appendable vcfoutput) throws IOException { + final String encoding = alleleMap.get(allele); + if ( encoding == null ) + throw new RuntimeException("Allele " + allele + " is not an allele in the variant context"); + vcfoutput.append(encoding); + } } From 941fdf32c8ecbb7e018aec58b6a497c3b545e2b7 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Tue, 1 May 2018 15:48:30 -0400 Subject: [PATCH 24/83] improving documentation and formating in VCFEncoder --- .../variantcontext/writer/VCFWriter.java | 7 +- .../java/htsjdk/variant/vcf/VCFEncoder.java | 310 +++++++++--------- 2 files changed, 165 insertions(+), 152 deletions(-) diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java index a01d301df6..1d0234680c 100644 --- a/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java +++ b/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java @@ -223,8 +223,11 @@ public void add(final VariantContext context) { throw new IllegalStateException("Unable to write the VCF: header is missing, " + "try to call writeHeader or setHeader first."); } - if (this.doNotWriteGenotypes) this.vcfEncoder.write(this.writer,new VariantContextBuilder(context).noGenotypes().make()); - else this.vcfEncoder.write(this.writer,context); + if (this.doNotWriteGenotypes) { + this.vcfEncoder.write(this.writer, new VariantContextBuilder(context).noGenotypes().make()); + } else { + this.vcfEncoder.write(this.writer, context); + } write("\n"); writeAndResetBuffer(); diff --git a/src/main/java/htsjdk/variant/vcf/VCFEncoder.java b/src/main/java/htsjdk/variant/vcf/VCFEncoder.java index e39d13ecdc..96dd104ae9 100644 --- a/src/main/java/htsjdk/variant/vcf/VCFEncoder.java +++ b/src/main/java/htsjdk/variant/vcf/VCFEncoder.java @@ -66,65 +66,73 @@ public void setAllowMissingFieldsInHeader(final boolean allow) { this.allowMissingFieldsInHeader = allow; } - /** encodes a new Variant context as VCF - * @return the VCF line - */public String encode(final VariantContext context) {try { - final StringBuilder stringBuilder = new StringBuilder(1000); - write(stringBuilder,context); + /** + * encodes a {@link VariantContext} as a VCF line + * + * Depending on the use case it may be more efficient to {@link #write(Appendable, VariantContext)} directly + * instead of creating an intermediate string. + * + * @return the VCF line + */ + public String encode(final VariantContext context) { + try { + final StringBuilder stringBuilder = new StringBuilder(1000); + write(stringBuilder, context); return stringBuilder.toString(); } catch (final IOException error) { - throw new RuntimeIOException("Cannot encode variant", error); + throw new RuntimeIOException("Cannot encode variant", error); } - } + } - /** - * encodes a new Variant context as VCF, writes it to a java.lang.Appendable - * + /** + * encodes a {@link VariantContext} context as VCF, and writes it directly to an {@link Appendable} + * + * This may be more efficient than calling {@link #encode(VariantContext)} and then writing the result since it + * avoids creating an intermediate string. + * + * @param vcfOutput the {@link Appendable} to write to + * @param context the variant + * @return the java.lang.Appendable 'vcfOutput' + * @throws IOException + */ + public void write(final Appendable vcfOutput, final VariantContext context) throws IOException { + if (this.header == null) { + throw new NullPointerException("The header field must be set on the VCFEncoder before encoding records."); + } + // CHROM + vcfOutput.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(); + vcfOutput.append(alt); + + for (int i = 1; i < context.getAlternateAlleles().size(); i++) { + altAllele = context.getAlternateAllele(i); + alt = altAllele.getDisplayString(); + vcfOutput.append(','); + vcfOutput.append(alt); + } + } else { + vcfOutput.append(VCFConstants.EMPTY_ALTERNATE_ALLELE_FIELD); + } - * @param vcfoutput the java.lang.Appendable - * @param context the variant - * @return the java.lang.Appendable 'vcfoutput' - * @throws IOException - */ - public void write(final Appendable vcfoutput, final VariantContext context) throws IOException { - if (this.header == null) { - throw new NullPointerException("The header field must be set on the VCFEncoder before encoding records."); + vcfOutput.append(VCFConstants.FIELD_SEPARATOR); -} - // CHROM - vcfoutput.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(); - vcfoutput.append(alt); - - for (int i = 1; i < context.getAlternateAlleles().size(); i++) { - altAllele = context.getAlternateAllele(i); - alt = altAllele.getDisplayString(); - vcfoutput.append(','); - vcfoutput.append(alt); - } - } else { - vcfoutput.append(VCFConstants.EMPTY_ALTERNATE_ALLELE_FIELD); - } - - vcfoutput.append(VCFConstants.FIELD_SEPARATOR); - - // QUAL - if ( ! context.hasLog10PError()) vcfoutput.append(VCFConstants.MISSING_VALUE_v4); - else vcfoutput.append(formatQualValue(context.getPhredScaledQual())); - vcfoutput.append(VCFConstants.FIELD_SEPARATOR) - // FILTER - .append(getFilterString(context)).append(VCFConstants.FIELD_SEPARATOR); + // QUAL + if ( ! context.hasLog10PError()) vcfOutput.append(VCFConstants.MISSING_VALUE_v4); + else vcfOutput.append(formatQualValue(context.getPhredScaledQual())); + vcfOutput.append(VCFConstants.FIELD_SEPARATOR) + // FILTER + .append(getFilterString(context)).append(VCFConstants.FIELD_SEPARATOR); // INFO final Map infoFields = new TreeMap<>(); @@ -135,32 +143,32 @@ public void write(final Appendable vcfoutput, final VariantContext context) thro final String outputValue = formatVCFField(field.getValue()); if (outputValue != null) infoFields.put(field.getKey(), outputValue); } - writeInfoString(infoFields, vcfoutput); - - // FORMAT - final GenotypesContext gc = context.getGenotypes(); - if (gc.isLazyWithData() && ((LazyGenotypesContext) gc).getUnparsedGenotypeData() instanceof String) { - vcfoutput.append(VCFConstants.FIELD_SEPARATOR); - vcfoutput.append(((LazyGenotypesContext) gc).getUnparsedGenotypeData().toString()); - } else { - final List genotypeAttributeKeys = context.calcVCFGenotypeKeys(this.header); - if ( ! genotypeAttributeKeys.isEmpty()) { - for (final String format : genotypeAttributeKeys) - if ( ! this.header.hasFormatLine(format)) - fieldIsMissingFromHeaderError(context, format, "FORMAT"); + writeInfoString(infoFields, vcfOutput); + + // FORMAT + final GenotypesContext gc = context.getGenotypes(); + if (gc.isLazyWithData() && ((LazyGenotypesContext) gc).getUnparsedGenotypeData() instanceof String) { + vcfOutput.append(VCFConstants.FIELD_SEPARATOR); + vcfOutput.append(((LazyGenotypesContext) gc).getUnparsedGenotypeData().toString()); + } else { + final List 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); - vcfoutput.append(VCFConstants.FIELD_SEPARATOR); - vcfoutput.append(genotypeFormatString); + vcfOutput.append(VCFConstants.FIELD_SEPARATOR); + vcfOutput.append(genotypeFormatString); - final Map alleleStrings = buildAlleleStrings(context); - appendGenotypeData(context, alleleStrings, genotypeAttributeKeys, vcfoutput); - } - } + final Map alleleStrings = buildAlleleStrings(context); + appendGenotypeData(context, alleleStrings, genotypeAttributeKeys, vcfOutput); + } + } - } + } VCFHeader getVCFHeader() { return this.header; @@ -181,7 +189,7 @@ private String getFilterString(final VariantContext vc) { else return VCFConstants.UNFILTERED; } - private String formatQualValue(final double qual) { + private static 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()); @@ -191,33 +199,34 @@ private String formatQualValue(final double qual) { 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."); + + " 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."); } - @SuppressWarnings("rawtypes")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(); + @SuppressWarnings("rawtypes") + 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; } @@ -265,16 +274,16 @@ static boolean isMissingValue(final String s) { 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 alleleMap, final List genotypeFormatKeys, final StringBuilder builder) { - try { - appendGenotypeData(vc,alleleMap,genotypeFormatKeys,builder); - } catch (final IOException err) { - throw new RuntimeIOException("addGenotypeData failed",err); - } + /* + * Add the genotype data + */ + public void addGenotypeData(final VariantContext vc, final Map alleleMap, final List genotypeFormatKeys, final StringBuilder builder) { + try { + appendGenotypeData(vc,alleleMap,genotypeFormatKeys,builder); + } catch (final IOException err) { + throw new RuntimeIOException("addGenotypeData failed",err); } + } /** * Add the genotype Data to a java.lang.Appendable @@ -284,27 +293,27 @@ public void addGenotypeData(final VariantContext vc, final Map a * @param vcfoutput VCF output * @throws IOException */ - private void appendGenotypeData(final VariantContext vc, final Map alleleMap, final List genotypeFormatKeys, final Appendable vcfoutput) throws IOException {final int ploidy = vc.getMaxPloidy(2); + private void appendGenotypeData(final VariantContext vc, final Map alleleMap, final List genotypeFormatKeys, final Appendable vcfoutput) throws IOException {final int ploidy = vc.getMaxPloidy(2); - for (final String sample : this.header.getGenotypeSamples()) { - vcfoutput.append(VCFConstants.FIELD_SEPARATOR); + for (final String sample : this.header.getGenotypeSamples()) { + vcfoutput.append(VCFConstants.FIELD_SEPARATOR); Genotype g = vc.getGenotype(sample); if (g == null) g = GenotypeBuilder.createMissing(sample, ploidy); - final List attrs = new ArrayList(genotypeFormatKeys.size()); + final List attrs = new ArrayList<>(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, vcfoutput); - for (int i = 1; i < g.getPloidy(); i++) { - vcfoutput.append(g.isPhased() ? VCFConstants.PHASED : VCFConstants.UNPHASED); - writeAllele(g.getAllele(i), alleleMap, vcfoutput); - } - continue; + writeAllele(g.getAllele(0), alleleMap, vcfoutput); + for (int i = 1; i < g.getPloidy(); i++) { + vcfoutput.append(g.isPhased() ? VCFConstants.PHASED : VCFConstants.UNPHASED); + writeAllele(g.getAllele(i), alleleMap, vcfoutput); + } + continue; } else { final String outputValue; @@ -363,40 +372,40 @@ else if (intValues.length == 1) // fast path } } - for (int i = 0; i < attrs.size(); i++) { - if ( i > 0 || genotypeFormatKeys.contains(VCFConstants.GENOTYPE_KEY)) { - vcfoutput.append(VCFConstants.GENOTYPE_FIELD_SEPARATOR); - } - vcfoutput.append(attrs.get(i)); - } - } - } - - /* - * Create the info string; assumes that no values are null - */ - private void writeInfoString(final Map infoFields, final Appendable vcfoutput) throws IOException { - if ( infoFields.isEmpty() ) { - vcfoutput.append(VCFConstants.EMPTY_INFO_FIELD); - return; - } + for (int i = 0; i < attrs.size(); i++) { + if ( i > 0 || genotypeFormatKeys.contains(VCFConstants.GENOTYPE_KEY)) { + vcfoutput.append(VCFConstants.GENOTYPE_FIELD_SEPARATOR); + } + vcfoutput.append(attrs.get(i)); + } + } + } + + /* + * Create the info string; assumes that no values are null + */ + private void writeInfoString(final Map infoFields, final Appendable vcfoutput) throws IOException { + if ( infoFields.isEmpty() ) { + vcfoutput.append(VCFConstants.EMPTY_INFO_FIELD); + return; + } boolean isFirst = true; for (final Map.Entry entry : infoFields.entrySet()) { if (isFirst) isFirst = false; else vcfoutput.append(VCFConstants.INFO_FIELD_SEPARATOR); - vcfoutput.append(entry.getKey()); + vcfoutput.append(entry.getKey()); - if ( ! entry.getValue().isEmpty()) { - final VCFInfoHeaderLine metaData = this.header.getInfoHeaderLine(entry.getKey()); - if ( metaData == null || metaData.getCountType() != VCFHeaderLineCount.INTEGER || metaData.getCount() != 0 ) { - vcfoutput.append('='); - vcfoutput.append(entry.getValue()); - } - } - } - } + if ( ! entry.getValue().isEmpty()) { + final VCFInfoHeaderLine metaData = this.header.getInfoHeaderLine(entry.getKey()); + if ( metaData == null || metaData.getCountType() != VCFHeaderLineCount.INTEGER || metaData.getCount() != 0 ) { + vcfoutput.append('='); + vcfoutput.append(entry.getValue()); + } + } + } + } public Map buildAlleleStrings(final VariantContext vc) { final Map alleleMap = new HashMap(vc.getAlleles().size() + 1); @@ -410,10 +419,11 @@ public Map buildAlleleStrings(final VariantContext vc) { return alleleMap; } - private void writeAllele(final Allele allele, final Map alleleMap, final Appendable vcfoutput) throws IOException { - final String encoding = alleleMap.get(allele); - if ( encoding == null ) - throw new RuntimeException("Allele " + allele + " is not an allele in the variant context"); - vcfoutput.append(encoding); - } + private static void writeAllele(final Allele allele, final Map alleleMap, final Appendable vcfOutput) throws IOException { + final String encoding = alleleMap.get(allele); + if (encoding == null) { + throw new RuntimeException("Allele " + allele + " is not an allele in the variant context"); + } + vcfOutput.append(encoding); + } } From 143c9fe9d974b70dd34c1591f42a73d9d8a03ac0 Mon Sep 17 00:00:00 2001 From: Jay Carey Date: Wed, 2 May 2018 09:40:25 -0400 Subject: [PATCH 25/83] Profiled approximate file overhead instead of a flat % when calculating memory needed per file. --- .../samtools/util/SortingCollection.java | 69 +++++++++++++++---- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/src/main/java/htsjdk/samtools/util/SortingCollection.java b/src/main/java/htsjdk/samtools/util/SortingCollection.java index f166568197..772466d99a 100644 --- a/src/main/java/htsjdk/samtools/util/SortingCollection.java +++ b/src/main/java/htsjdk/samtools/util/SortingCollection.java @@ -131,6 +131,8 @@ public interface Codec extends Cloneable { private final TempStreamFactory tempStreamFactory = new TempStreamFactory(); + private final boolean sampleRecordSize; + /** * Prepare to accumulate records to be sorted * @@ -141,7 +143,8 @@ public interface Codec extends Cloneable { * @param tmpDir Where to write files of records that will not fit in RAM */ private SortingCollection(final Class componentType, final SortingCollection.Codec codec, - final Comparator comparator, final int maxRecordsInRam, final Path... tmpDir) { + final Comparator comparator, final int maxRecordsInRam, + final boolean sampleRecordSize, final Path... tmpDir) { if (maxRecordsInRam <= 0) { throw new IllegalArgumentException("maxRecordsInRam must be > 0"); } @@ -157,6 +160,7 @@ private SortingCollection(final Class componentType, final SortingCollection. @SuppressWarnings("unchecked") T[] ramRecords = (T[]) Array.newInstance(componentType, maxRecordsInRam); this.ramRecords = ramRecords; + this.sampleRecordSize = sampleRecordSize; } public void add(final T rec) { @@ -167,10 +171,9 @@ public void add(final T rec) { throw new IllegalStateException("Cannot add after calling iterator()"); } if (numRecordsInRam == maxRecordsInRam) { - // sample every 100 files written. + long startMem = 0; - boolean printRecordSizeSampling = files.size() % 100 == 0 && Log.getGlobalLogLevel() == Log.LogLevel.DEBUG; - if (printRecordSizeSampling) { + if (sampleRecordSize) { // Garbage collect and get free memory Runtime.getRuntime().gc(); startMem = Runtime.getRuntime().freeMemory(); @@ -178,7 +181,7 @@ public void add(final T rec) { spillToDisk(); - if (printRecordSizeSampling) { + if (sampleRecordSize) { //Garbage collect again and get free memory Runtime.getRuntime().gc(); long endMem = Runtime.getRuntime().freeMemory(); @@ -320,7 +323,7 @@ public static SortingCollection newInstance(final Class componentType, final Comparator comparator, final int maxRecordsInRAM, final File... tmpDir) { - return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, Arrays.stream(tmpDir).map(File::toPath).toArray(Path[]::new)); + return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, false, Arrays.stream(tmpDir).map(File::toPath).toArray(Path[]::new)); } @@ -344,10 +347,47 @@ public static SortingCollection newInstance(final Class componentType, codec, comparator, maxRecordsInRAM, + false, tmpDirs.stream().map(File::toPath).toArray(Path[]::new)); } + /** + * 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 + * @param sampleRecordSize If true record size will be sampled and output at DEBUG log level + */ + public static SortingCollection newInstance(final Class componentType, + final SortingCollection.Codec codec, + final Comparator comparator, + final int maxRecordsInRAM, + final boolean sampleRecordSize) { + final Path tmpDir = Paths.get(System.getProperty("java.io.tmpdir")); + return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, sampleRecordSize, 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 sampleRecordSize If true record size will be sampled and output at DEBUG log level + * @param tmpDir Where to write files of records that will not fit in RAM + */ + public static SortingCollection newInstance(final Class componentType, + final SortingCollection.Codec codec, + final Comparator comparator, + final int maxRecordsInRAM, + final boolean sampleRecordSize, + final Path... tmpDir) { + return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, sampleRecordSize, tmpDir); + } /** * Syntactic sugar around the ctor, to save some typing of type parameters. Writes files to java.io.tmpdir @@ -361,9 +401,8 @@ public static SortingCollection newInstance(final Class componentType, final SortingCollection.Codec codec, final Comparator comparator, final int maxRecordsInRAM) { - final Path tmpDir = Paths.get(System.getProperty("java.io.tmpdir")); - return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, tmpDir); + return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, false, tmpDir); } /** @@ -380,8 +419,7 @@ public static SortingCollection newInstance(final Class componentType, final Comparator comparator, final int maxRecordsInRAM, final Path... tmpDir) { - return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, tmpDir); - + return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, false, tmpDir); } /** @@ -402,8 +440,8 @@ public static SortingCollection newInstanceFromPaths(final Class compo codec, comparator, maxRecordsInRAM, + false, tmpDirs.toArray(new Path[tmpDirs.size()])); - } /** @@ -489,12 +527,15 @@ private int checkMemoryAndAdjustBuffer(int numFiles) { // garbage collect so that our calculation is accurate. Runtime.getRuntime().gc(); - // 90% of free memory to allow for some overhead. - final long freeMemory = (long) (Runtime.getRuntime().freeMemory() * 0.90); + // There is ~20k in overhead per file. + final long freeMemory = Runtime.getRuntime().freeMemory() - (numFiles * 20 * 1024); // use the floor value from the divide final int memoryPerFile = (int) (freeMemory / numFiles); - if (bufferSize > memoryPerFile) { + if (memoryPerFile < 0) { + log.warn("There is not enough memory per file for buffering. Reading will be unbuffered."); + bufferSize = 0; + } else if (bufferSize > memoryPerFile) { log.warn(String.format("Default io buffer size of %s is larger than available memory per file of %s.", StringUtil.humanReadableByteCount(bufferSize), StringUtil.humanReadableByteCount(memoryPerFile))); From b0a7a3f2c8c0db13572eb8542ccad2b204caafb0 Mon Sep 17 00:00:00 2001 From: Jay Carey Date: Wed, 2 May 2018 09:55:29 -0400 Subject: [PATCH 26/83] Review changes. --- .../samtools/util/SortingCollection.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/htsjdk/samtools/util/SortingCollection.java b/src/main/java/htsjdk/samtools/util/SortingCollection.java index 772466d99a..cec8a74c93 100644 --- a/src/main/java/htsjdk/samtools/util/SortingCollection.java +++ b/src/main/java/htsjdk/samtools/util/SortingCollection.java @@ -131,7 +131,7 @@ public interface Codec extends Cloneable { private final TempStreamFactory tempStreamFactory = new TempStreamFactory(); - private final boolean sampleRecordSize; + private final boolean printRecordSizeSampling; /** * Prepare to accumulate records to be sorted @@ -140,11 +140,12 @@ public interface Codec extends Cloneable { * @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 printRecordSizeSampling If true record size will be sampled and output at DEBUG log level * @param tmpDir Where to write files of records that will not fit in RAM */ private SortingCollection(final Class componentType, final SortingCollection.Codec codec, final Comparator comparator, final int maxRecordsInRam, - final boolean sampleRecordSize, final Path... tmpDir) { + final boolean printRecordSizeSampling, final Path... tmpDir) { if (maxRecordsInRam <= 0) { throw new IllegalArgumentException("maxRecordsInRam must be > 0"); } @@ -160,7 +161,7 @@ private SortingCollection(final Class componentType, final SortingCollection. @SuppressWarnings("unchecked") T[] ramRecords = (T[]) Array.newInstance(componentType, maxRecordsInRam); this.ramRecords = ramRecords; - this.sampleRecordSize = sampleRecordSize; + this.printRecordSizeSampling = printRecordSizeSampling; } public void add(final T rec) { @@ -173,7 +174,7 @@ public void add(final T rec) { if (numRecordsInRam == maxRecordsInRam) { long startMem = 0; - if (sampleRecordSize) { + if (printRecordSizeSampling) { // Garbage collect and get free memory Runtime.getRuntime().gc(); startMem = Runtime.getRuntime().freeMemory(); @@ -181,7 +182,7 @@ public void add(final T rec) { spillToDisk(); - if (sampleRecordSize) { + if (printRecordSizeSampling) { //Garbage collect again and get free memory Runtime.getRuntime().gc(); long endMem = Runtime.getRuntime().freeMemory(); @@ -359,15 +360,15 @@ public static SortingCollection newInstance(final Class componentType, * @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 sampleRecordSize If true record size will be sampled and output at DEBUG log level + * @param printRecordSizeSampling If true record size will be sampled and output at DEBUG log level */ public static SortingCollection newInstance(final Class componentType, final SortingCollection.Codec codec, final Comparator comparator, final int maxRecordsInRAM, - final boolean sampleRecordSize) { + final boolean printRecordSizeSampling) { final Path tmpDir = Paths.get(System.getProperty("java.io.tmpdir")); - return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, sampleRecordSize, tmpDir); + return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, printRecordSizeSampling, tmpDir); } /** @@ -377,16 +378,16 @@ public static SortingCollection newInstance(final Class componentType, * @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 sampleRecordSize If true record size will be sampled and output at DEBUG log level + * @param printRecordSizeSampling If true record size will be sampled and output at DEBUG log level * @param tmpDir Where to write files of records that will not fit in RAM */ public static SortingCollection newInstance(final Class componentType, final SortingCollection.Codec codec, final Comparator comparator, final int maxRecordsInRAM, - final boolean sampleRecordSize, + final boolean printRecordSizeSampling, final Path... tmpDir) { - return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, sampleRecordSize, tmpDir); + return new SortingCollection<>(componentType, codec, comparator, maxRecordsInRAM, printRecordSizeSampling, tmpDir); } /** From 8b63854db9edf73cf255735f33d9193afc3e54ff Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Mon, 7 May 2018 15:09:41 -0400 Subject: [PATCH 27/83] renaming IoUtilTest and minor refactoring (#990) * renaming IoUtilTest -> IOUtilTest for consistency since the class it's testing is IOUtil * minor refactoring and cleanup in the tests --- .../util/{IoUtilTest.java => IOUtilTest.java} | 57 ++++++++----------- 1 file changed, 25 insertions(+), 32 deletions(-) rename src/test/java/htsjdk/samtools/util/{IoUtilTest.java => IOUtilTest.java} (89%) diff --git a/src/test/java/htsjdk/samtools/util/IoUtilTest.java b/src/test/java/htsjdk/samtools/util/IOUtilTest.java similarity index 89% rename from src/test/java/htsjdk/samtools/util/IoUtilTest.java rename to src/test/java/htsjdk/samtools/util/IOUtilTest.java index 51fd76986a..3c0d027d7c 100644 --- a/src/test/java/htsjdk/samtools/util/IoUtilTest.java +++ b/src/test/java/htsjdk/samtools/util/IOUtilTest.java @@ -54,7 +54,7 @@ import java.util.Collections; import java.util.List; -public class IoUtilTest extends HtsjdkTest { +public class IOUtilTest extends HtsjdkTest { private static final Path TEST_DATA_DIR = Paths.get ("src/test/resources/htsjdk/samtools/io/"); @@ -66,11 +66,11 @@ public class IoUtilTest extends HtsjdkTest { 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 systemUser; private String systemTempDir; - - private FileSystem inMemoryfileSystem; + private FileSystem inMemoryFileSystem; @BeforeClass public void setUp() throws IOException { @@ -78,7 +78,7 @@ public void setUp() throws IOException { existingTempFile.deleteOnExit(); systemTempDir = System.getProperty("java.io.tmpdir"); final File tmpDir = new File(systemTempDir); - inMemoryfileSystem = Jimfs.newFileSystem(Configuration.unix());; + inMemoryFileSystem = Jimfs.newFileSystem(Configuration.unix());; if (!tmpDir.isDirectory()) tmpDir.mkdir(); if (!tmpDir.isDirectory()) throw new RuntimeException("java.io.tmpdir (" + systemTempDir + ") is not a directory"); @@ -90,7 +90,7 @@ public void tearDown() throws IOException { // reset java properties to original System.setProperty("java.io.tmpdir", systemTempDir); System.setProperty("user.name", systemUser); - inMemoryfileSystem.close(); + inMemoryFileSystem.close(); } @Test @@ -123,27 +123,25 @@ public void testGetCanonicalPath() throws IOException { File tmpDir = new File(tmpPath, userName); tmpDir.mkdir(); + tmpDir.deleteOnExit(); File actual = new File(tmpDir, "actual.txt"); + actual.deleteOnExit(); ProcessExecutor.execute(new String[]{"touch", actual.getAbsolutePath()}); File symlink = new File(tmpDir, "symlink.txt"); + symlink.deleteOnExit(); ProcessExecutor.execute(new String[]{"ln", "-s", actual.getAbsolutePath(), symlink.getAbsolutePath()}); File lnDir = new File(tmpDir, "symLinkDir"); + lnDir.deleteOnExit(); ProcessExecutor.execute(new String[]{"ln", "-s", tmpDir.getAbsolutePath(), lnDir.getAbsolutePath()}); File lnToActual = new File(lnDir, "actual.txt"); + lnToActual.deleteOnExit(); File lnToSymlink = new File(lnDir, "symlink.txt"); - + lnToSymlink.deleteOnExit(); 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 @@ -190,24 +188,19 @@ public void slurpTest() throws FileNotFoundException { public void testFileType(final String path, boolean expectedIsRegularFile) { final File file = new File(path); Assert.assertEquals(IOUtil.isRegularPath(file), expectedIsRegularFile); - if (null != file) { - Assert.assertEquals(IOUtil.isRegularPath(file.toPath()), expectedIsRegularFile); - } + Assert.assertEquals(IOUtil.isRegularPath(file.toPath()), 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); - if (null != file) { - Assert.assertEquals(IOUtil.isRegularPath(file.toPath()), expectedIsRegularFile); - } + Assert.assertEquals(IOUtil.isRegularPath(file.toPath()), expectedIsRegularFile); } @Test public void testAddExtension() throws IOException { Path p = IOUtil.getPath("/folder/file"); - List fileSystemProviders = FileSystemProvider.installedProviders(); Assert.assertEquals(IOUtil.addExtension(p, ".ext"), IOUtil.getPath("/folder/file.ext")); p = IOUtil.getPath("folder/file"); Assert.assertEquals(IOUtil.addExtension(p, ".ext"), IOUtil.getPath("folder/file.ext")); @@ -299,7 +292,7 @@ public void testDeletePathLocal(final List fileNames) throws Exception { @Test(dataProvider = "fileNamesForDelete") public void testDeletePathJims(final List fileNames) throws Exception { - final List paths = createJimsFiles("testDeletePath", fileNames); + final List paths = createJimfsFiles("testDeletePath", fileNames); testDeletePath(paths); } @@ -312,7 +305,7 @@ public void testDeleteArrayPathLocal(final List fileNames) throws Except @Test(dataProvider = "fileNamesForDelete") public void testDeleteArrayPathJims(final List fileNames) throws Exception { - final List paths = createJimsFiles("testDeletePath", fileNames); + final List paths = createJimfsFiles("testDeletePath", fileNames); testDeletePathArray(paths); } @@ -332,19 +325,19 @@ private static List createLocalFiles(final File tmpDir, final List final List paths = new ArrayList<>(fileNames.size()); for (final String f: fileNames) { final File file = new File(tmpDir, f); - file.createNewFile(); + Assert.assertTrue(file.createNewFile(), "failed to create test file" +file); paths.add(file.toPath()); } return paths; } - private List createJimsFiles(final String folderName, final List fileNames) throws Exception { + private List createJimfsFiles(final String folderName, final List fileNames) throws Exception { final List paths = new ArrayList<>(fileNames.size()); - final Path folder = inMemoryfileSystem.getPath(folderName); + final Path folder = inMemoryFileSystem.getPath(folderName); if (Files.notExists(folder)) Files.createDirectory(folder); for (final String f: fileNames) { - final Path p = inMemoryfileSystem.getPath(folderName, f); + final Path p = inMemoryFileSystem.getPath(folderName, f); Files.createFile(p); paths.add(p); } @@ -356,12 +349,12 @@ private List createJimsFiles(final String folderName, final List f public Object[][] pathsForWritableDirectory() throws Exception { return new Object[][] { // non existent - {inMemoryfileSystem.getPath("no_exists"), false}, + {inMemoryFileSystem.getPath("no_exists"), false}, // non directory - {Files.createFile(inMemoryfileSystem.getPath("testAssertDirectoryIsWritable_file")), false}, - // TODO - how to do in inMemmoryFileSystem a non-writable directory? + {Files.createFile(inMemoryFileSystem.getPath("testAssertDirectoryIsWritable_file")), false}, + // TODO - how to do in inMemoryFileSystem a non-writable directory? // writable directory - {Files.createDirectory(inMemoryfileSystem.getPath("testAssertDirectoryIsWritable_directory")), true} + {Files.createDirectory(inMemoryFileSystem.getPath("testAssertDirectoryIsWritable_directory")), true} }; } @@ -411,10 +404,10 @@ public void testAssertDirectoryIsWritableFile(final File file, final boolean wri @DataProvider public Object[][] fofnData() throws IOException { - Path fofnPath1 = inMemoryfileSystem.getPath(level1); + Path fofnPath1 = inMemoryFileSystem.getPath(level1); Files.copy(TEST_DATA_DIR.resolve(level1), fofnPath1); - Path fofnPath2 = inMemoryfileSystem.getPath(level2); + Path fofnPath2 = inMemoryFileSystem.getPath(level2); Files.copy(TEST_DATA_DIR.resolve(level2), fofnPath2); return new Object[][]{ From b0f70ec5aff286adc34ce0c6e5d056d9931a27ee Mon Sep 17 00:00:00 2001 From: Yossi Farjoun Date: Mon, 7 May 2018 16:28:15 -0400 Subject: [PATCH 28/83] Brings htsjdk up to spec with regards to long cigars Long cigars (with more than 64k) cannot be natively encoded into BAM. The SAM-spec has adopted a workaround for this case which puts the long cigar into the CG tag (only in BAM) and places a "sentinel" cigar of the form xSyN (where x is the length of the read and N is the length of the reference it covers) in the CIGAR. This PR implements this workaround and tests various interactions between the cigar and the attributes. --- src/main/java/htsjdk/samtools/BAMRecord.java | 108 ++++- .../java/htsjdk/samtools/BAMRecordCodec.java | 52 ++- .../htsjdk/samtools/SAMBinaryTagAndValue.java | 2 +- src/main/java/htsjdk/samtools/SAMRecord.java | 13 +- .../htsjdk/samtools/SAMRecordSetBuilder.java | 46 +- src/main/java/htsjdk/samtools/SAMTag.java | 1 + src/main/java/htsjdk/samtools/SAMTagUtil.java | 1 + .../htsjdk/samtools/SAMValidationError.java | 8 +- .../htsjdk/samtools/SamFileValidator.java | 22 +- .../htsjdk/samtools/BAMFileWriterTest.java | 399 ++++++++++++++++-- .../BAMCigarOverflowTest/cigar-64k.sam.gz | Bin 0 -> 442073 bytes 11 files changed, 585 insertions(+), 67 deletions(-) create mode 100644 src/test/resources/htsjdk/samtools/BAMCigarOverflowTest/cigar-64k.sam.gz diff --git a/src/main/java/htsjdk/samtools/BAMRecord.java b/src/main/java/htsjdk/samtools/BAMRecord.java index f24febd4ba..5374b18400 100644 --- a/src/main/java/htsjdk/samtools/BAMRecord.java +++ b/src/main/java/htsjdk/samtools/BAMRecord.java @@ -28,6 +28,7 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; +import static htsjdk.samtools.SAMTag.CG; /** * Wrapper class for binary BAM records. @@ -39,6 +40,28 @@ public class BAMRecord extends SAMRecord { */ private static final int READ_NAME_OFFSET = 0; + /** + * Constant for converting between the number of operators in a Cigar and the length + * of the int[] array needed to represent it in the BAM format + */ + static public final short CIGAR_SIZE_MULTIPLIER = 4; + + /** + * Maximal number of cigar operators that can be represented normally in the cigar part of the bam record. + * Records that have larger cigars will have their Cigars encoded to int[] and placed in the CG tag in the attributes (BAM only) + * This should happen upon encoding. In place of the Cigar a sentinel value will be placed SN + *

+ * When a BAM record is decoded, the sentinel cigar informs of the existance of the CG tag, which is decoded and removed. + * The sentinel value is then replaced with the actual cigar (in memory). + */ + public final static int MAX_CIGAR_OPERATORS = 0xffff; + + public final static int MAX_CIGAR_ELEMENT_LENGTH = (1 << 28) - 1; + /** + * Number of operators in "Sentinel" cigar xSyN + */ + private final static int LONG_CIGAR_SENTINEL_LENGTH = 2; + /** * Variable-length part of BAMRecord. Lazily decoded. */ @@ -203,6 +226,12 @@ protected void setAttribute(final short tag, final Object value, final boolean i */ @Override public void clearAttributes() { + // If there's a long cigar, the CG might be "hiding" in the attributes, and + // if the original attributes haven't been parsed yet, we will lose the long cigar. + // by "getting" the cigar prior to clearing the attributes, we protect against that. + if (!mAttributesDecoded) { + getCigar(); + } mAttributesDecoded = true; mBinaryDataStale = true; super.clearAttributes(); @@ -248,6 +277,11 @@ public Cigar getCigar() { byteBuffer.order(ByteOrder.LITTLE_ENDIAN); super.initializeCigar(BinaryCigarCodec.decode(byteBuffer)); mCigarDecoded = true; + + if (getCigarLength() == LONG_CIGAR_SENTINEL_LENGTH && isSentinelCigar(super.getCigar(), getReadLength())) { + extractCigarFromCGAttribute(super.getCigar()); + } + 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()); @@ -256,6 +290,72 @@ public Cigar getCigar() { return super.getCigar(); } + /** + * Checks to see if the provided Cigar could be considered the "sentinel cigar" that indicates + * that the actual cigar is too long for the BAM spec and should be taken from the CG tag. This + * was introduced in SAM v1.6. + */ + static boolean isSentinelCigar(final Cigar cigar, final int readLength) { + // There's an implicit assumption here there readLength == length of read in cigar, unless readLength==0 + return cigar.numCigarElements() == 2 && + cigar.getCigarElement(1).getOperator() == CigarOperator.N && + cigar.getCigarElement(0).getOperator() == CigarOperator.S && + (cigar.getCigarElement(0).getLength() == readLength || readLength == 0) ; + } + + + /** + * Long cigars (with more than 64K operators) cannot be encoded into BAM. Instead a sentinel cigar is + * placed as a placeholder, and the actual cigar is placed in the CG tag. This method + * extracts the CIGAR from the CG tag and places it into the (in memory) cigar. + */ + private void extractCigarFromCGAttribute(final Cigar sentinelCigar) throws IllegalStateException { + final int[] cigarFromCG = (int[]) getAttribute(SAMTagUtil.getSingleton().CG); + + if (cigarFromCG == null) return; + + // place the integer array into a buffer so we can decode it + final ByteBuffer byteBuffer = ByteBuffer.allocate(cigarFromCG.length * CIGAR_SIZE_MULTIPLIER) + .order(ByteOrder.LITTLE_ENDIAN); + byteBuffer.asIntBuffer().put(cigarFromCG); + + // decode cigar + final Cigar decodedCigar = BinaryCigarCodec.decode(byteBuffer); + + // Sanity check + if (decodedCigar.numCigarElements() <= MAX_CIGAR_OPERATORS) { + throw new IllegalStateException(String.format( + "Only Cigar with > %d operators should be placed in CG tag. Found %d operators. \n Here's the Cigar:\n%s", + MAX_CIGAR_OPERATORS, + decodedCigar.getCigarElements().size(), + decodedCigar.toString())); + } + + if (decodedCigar.getReferenceLength() != sentinelCigar.getReferenceLength()) { + throw new IllegalStateException(String.format( + "Sentinel cigar and %s cigar should have the same reference length. Found %d and %d.\n Here's the Cigar:\n%s", + CG.name(), + sentinelCigar.getReferenceLength(), + decodedCigar.getReferenceLength(), + decodedCigar.toString())); + } + + if (decodedCigar.getReadLength() != sentinelCigar.getReadLength() ) { + throw new IllegalStateException(String.format( + "Sentinel cigar and %s cigar should have the same read length. Found %d and %d.\n Here's the Cigar:\n%s", + CG.name(), + sentinelCigar.getReadLength(), + decodedCigar.getReadLength(), + decodedCigar.toString())); + } + + //used initializeCigar instead of setCigar so as to not clobber the indexingBin. + initializeCigar(decodedCigar); + + // remove CG attribute. + setAttribute(SAMTagUtil.getSingleton().CG, null); + } + /** * Avoids decoding CIGAR in order to get length. */ @@ -308,11 +408,17 @@ 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); + + // if there's a CG tag, we should getCigar() so that the CG tag has a chance of turning into the CIGAR + if (hasAttribute(CG.name())) { + getCigar(); + } } private byte[] decodeBaseQualities() { @@ -358,7 +464,7 @@ private int readNameSize() { } private int cigarSize() { - return mCigarLength * 4; + return mCigarLength * CIGAR_SIZE_MULTIPLIER; } private int basesSize() { diff --git a/src/main/java/htsjdk/samtools/BAMRecordCodec.java b/src/main/java/htsjdk/samtools/BAMRecordCodec.java index 8df15d208e..b269eaa9f5 100644 --- a/src/main/java/htsjdk/samtools/BAMRecordCodec.java +++ b/src/main/java/htsjdk/samtools/BAMRecordCodec.java @@ -32,6 +32,8 @@ import java.io.OutputStream; import java.util.Arrays; +import static htsjdk.samtools.SAMTag.CG; + /** * Class for translating between in-memory and disk representation of BAMRecord. */ @@ -105,12 +107,21 @@ 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(); + // if cigar is too long, put into CG tag and replace with sentinel value + if (alignment.getCigarLength() > BAMRecord.MAX_CIGAR_OPERATORS) { + + final int[] cigarEncoding = BinaryCigarCodec.encode(alignment.getCigar()); + alignment.setCigar(makeSentinelCigar(alignment.getCigar())); + alignment.setAttribute(CG.name(), cigarEncoding); + } + + // do not combine with previous call to alignment.getCigarLength() as cigar may change in-between 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; + int blockSize = BAMFileConstants.FIXED_BLOCK_SIZE + alignment.getReadNameLength() + 1 + // null terminated + cigarLength * BAMRecord.CIGAR_SIZE_MULTIPLIER + + (readLength + 1) / 2 + // 2 bases per byte, round up + readLength; final int attributesSize = alignment.getAttributesBinarySize(); if (attributesSize != -1) { @@ -124,6 +135,8 @@ public void encode(final SAMRecord alignment) { } } + // shouldn't interact with the long-cigar above since the Sentinel Cigar has the same referenceLength as + // the actual cigar. int indexBin = 0; if (alignment.getAlignmentStart() != SAMRecord.NO_ALIGNMENT_START) { warnIfReferenceIsTooLargeForBinField(alignment); @@ -151,7 +164,7 @@ public void encode(final SAMRecord alignment) { this.binaryCodec.writeBytes(variableLengthBinaryBlock); } else { if (alignment.getReadLength() != alignment.getBaseQualities().length && - alignment.getBaseQualities().length != 0) { + 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); @@ -183,6 +196,33 @@ public void encode(final SAMRecord alignment) { } } + /** + * Create a "Sentinel" cigar that will be placed in BAM file when the actual cigar has more than 0xffff operator, + * which are not supported by the bam format. The actual cigar will be encoded and placed in the CG attribute. + * @param cigar actual cigar to create sentinel cigar for + * @return sentinel cigar xSyN with readLength (x) and referenceLength (y) matching the input cigar. + */ + public static Cigar makeSentinelCigar(final Cigar cigar) { + // in BAM there are only 28 bits for a cigar operator, so this a protection against overflow. + if (cigar.getReadLength() > BAMRecord.MAX_CIGAR_ELEMENT_LENGTH) { + throw new IllegalArgumentException( + String.format( + "Cannot encode (to BAM) a record with more than %d cigar operations and a read-length greater than %d.", + BAMRecord.MAX_CIGAR_OPERATORS, BAMRecord.MAX_CIGAR_ELEMENT_LENGTH)); + } + + if (cigar.getReferenceLength() > BAMRecord.MAX_CIGAR_ELEMENT_LENGTH) { + throw new IllegalArgumentException( + String.format( + "Cannot encode (to BAM) a record that has than %d cigar operations and spans more than %d bases on the reference.", + BAMRecord.MAX_CIGAR_OPERATORS, BAMRecord.MAX_CIGAR_ELEMENT_LENGTH)); + } + + return new Cigar(Arrays.asList( + new CigarElement(cigar.getReadLength(), CigarOperator.S), + new CigarElement(cigar.getReferenceLength(), CigarOperator.N))); + } + private void warnIfReferenceIsTooLargeForBinField(final SAMRecord rec) { final SAMSequenceRecord sequence = rec.getHeader() != null ? rec.getHeader().getSequence(rec.getReferenceName()) : null; if (!isReferenceSizeWarningShowed @@ -202,7 +242,7 @@ private void warnIfReferenceIsTooLargeForBinField(final SAMRecord rec) { */ @Override public SAMRecord decode() { - int recordLength = 0; + final int recordLength; try { recordLength = this.binaryCodec.readInt(); } catch (RuntimeEOFException e) { diff --git a/src/main/java/htsjdk/samtools/SAMBinaryTagAndValue.java b/src/main/java/htsjdk/samtools/SAMBinaryTagAndValue.java index 0778190b25..331843822a 100644 --- a/src/main/java/htsjdk/samtools/SAMBinaryTagAndValue.java +++ b/src/main/java/htsjdk/samtools/SAMBinaryTagAndValue.java @@ -202,7 +202,7 @@ else if (value instanceof float[]) { public SAMBinaryTagAndValue getNext() { return this.next; } - /** Inserts at item into the ordered list of attributes and returns the head of the list/sub-list */ + /** Inserts an 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."); diff --git a/src/main/java/htsjdk/samtools/SAMRecord.java b/src/main/java/htsjdk/samtools/SAMRecord.java index 24c0ffe0ff..1b5c5a95c8 100644 --- a/src/main/java/htsjdk/samtools/SAMRecord.java +++ b/src/main/java/htsjdk/samtools/SAMRecord.java @@ -835,6 +835,12 @@ public int getCigarLength() { return getCigar().numCigarElements(); } + /** + * For setting the Cigar string when changed. Note that this nulls the + * indexing bin, which would need to be recomputed on write (if needed). + * To avoid clobbering the indexing bin, use {@link #initializeCigar} + * + */ public void setCigar(final Cigar cigar) { initializeCigar(cigar); // Change to cigar could change alignmentEnd, and thus indexing bin @@ -842,7 +848,8 @@ public void setCigar(final Cigar cigar) { } /** - * For setting the Cigar string when BAMRecord has decoded it. Use this rather than setCigar() + * For setting the Cigar string when BAMRecord has decoded it. + * Use this rather than {@link #setCigar} * so that indexing bin doesn't get clobbered. */ protected void initializeCigar(final Cigar cigar) { @@ -1488,6 +1495,8 @@ public void clearAttributes() { /** * Replace any existing attributes with the given linked item. + * + * NOTE: this method is intended to only be called from subclasses. */ protected void setAttributes(final SAMBinaryTagAndValue attributes) { mAttributes = attributes; @@ -1505,7 +1514,7 @@ protected SAMBinaryTagAndValue getBinaryAttributes() { */ @Override public String getContig() { - if( getReadUnmappedFlag()) { + if (getReadUnmappedFlag()) { return null; } else { return getReferenceName(); diff --git a/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java b/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java index d77e2de2f9..8bdddb146b 100644 --- a/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java +++ b/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java @@ -65,6 +65,8 @@ public class SAMRecordSetBuilder implements Iterable { private int readLength = 36; + private boolean useBamFile = true; + private SAMProgramRecord programRecord = null; private SAMReadGroupRecord readGroup = null; private boolean useNmFlag = false; @@ -134,6 +136,16 @@ public SAMRecordSetBuilder(final boolean sortForMe, final SAMFileHeader.SortOrde } } + /** + * Determine whether the class will use a bam (default) or a sam file to hold the + * records when providing a reader to them. + * + * @param useBamFile if true will use a BAM file, otherwise it will use a SAM file to hold the records. + */ + public void setUseBamFile(final boolean useBamFile) { + this.useBamFile = useBamFile; + } + public void setUnmappedHasBasesAndQualities(final boolean value) { this.unmappedHasBasesAndQualities = value; } @@ -334,11 +346,20 @@ private void fillInBasesAndQualities(final SAMRecord rec, final String qualitySt } } + /** If the record contains a cigar with non-zero read length, return that length, otherwise, return readLength + */ + private int getReadLengthFromCigar(final SAMRecord rec) { + return ( rec.getCigar() != null && + rec.getCigar().getReadLength() != 0 ) ? rec.getCigar().getReadLength() : readLength; + } + /** * Randomly fills in the bases for the given record. + *

+ * If there's a cigar with read-length >0, will use that length for reads. Otherwise will use length = 36 */ private void fillInBases(final SAMRecord rec) { - final int length = this.readLength; + final int length = getReadLengthFromCigar(rec); final byte[] bases = new byte[length]; for (int i = 0; i < length; ++i) { @@ -530,10 +551,10 @@ private void fillInBasesAndQualities(final SAMRecord rec) { /** * 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. + * If there's a cigar with read-length >0, will use that length for reads. Otherwise will use length = 36 */ private void fillInBasesAndQualities(final SAMRecord rec, final int defaultQuality) { - final int length = this.readLength; + final int length = getReadLengthFromCigar(rec); final byte[] quals = new byte[length]; if (-1 != defaultQuality) { @@ -557,23 +578,22 @@ public SamReader getSamReader() { final File tempFile; try { - tempFile = File.createTempFile("temp", ".sam"); + tempFile = File.createTempFile("temp", this.useBamFile ? ".bam" : ".sam"); + tempFile.deleteOnExit(); } 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); + try(final SAMFileWriter w = this.useBamFile ? + new SAMFileWriterFactory().makeBAMWriter(this.header, true, tempFile) : + new SAMFileWriterFactory().makeSAMWriter(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; + return SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(tempFile); } public SAMFileHeader getHeader() { diff --git a/src/main/java/htsjdk/samtools/SAMTag.java b/src/main/java/htsjdk/samtools/SAMTag.java index fa2572834d..41a6047773 100644 --- a/src/main/java/htsjdk/samtools/SAMTag.java +++ b/src/main/java/htsjdk/samtools/SAMTag.java @@ -32,6 +32,7 @@ public enum SAMTag { BC, BQ, CC, + CG, CM, CO, CP, diff --git a/src/main/java/htsjdk/samtools/SAMTagUtil.java b/src/main/java/htsjdk/samtools/SAMTagUtil.java index 0266b0eac6..fa69d8c3d1 100644 --- a/src/main/java/htsjdk/samtools/SAMTagUtil.java +++ b/src/main/java/htsjdk/samtools/SAMTagUtil.java @@ -70,6 +70,7 @@ public class SAMTagUtil { public final short FZ = makeBinaryTag(SAMTag.FZ.name()); public final short SA = makeBinaryTag(SAMTag.SA.name()); public final short MC = makeBinaryTag(SAMTag.MC.name()); + public final short CG = makeBinaryTag(SAMTag.CG.name()); private static SAMTagUtil singleton; diff --git a/src/main/java/htsjdk/samtools/SAMValidationError.java b/src/main/java/htsjdk/samtools/SAMValidationError.java index 3fb3a60b07..55cb71a0b9 100644 --- a/src/main/java/htsjdk/samtools/SAMValidationError.java +++ b/src/main/java/htsjdk/samtools/SAMValidationError.java @@ -226,7 +226,13 @@ public enum Type { MISMATCH_FILE_SEQ_DICT, /** Base quality is not stored for the read. */ - QUALITY_NOT_STORED(Severity.WARNING); + QUALITY_NOT_STORED(Severity.WARNING), + + /** A duplicate Sam tag was found in a record. */ + DUPLICATE_SAM_TAG, + + /** The CG Tag should only be used in BAM format to hold a large cigar */ + CG_TAG_FOUND_IN_ATTRIBUTES; public final Severity severity; diff --git a/src/main/java/htsjdk/samtools/SamFileValidator.java b/src/main/java/htsjdk/samtools/SamFileValidator.java index 9da9eb04e8..6001d89bca 100644 --- a/src/main/java/htsjdk/samtools/SamFileValidator.java +++ b/src/main/java/htsjdk/samtools/SamFileValidator.java @@ -389,15 +389,33 @@ private void validateReadGroup(final SAMRecord record, final SAMFileHeader heade } /** - * Report error if a tag value is a Long. + * Report error if a tag value is a Long, or if there's a duplicate dag, + * or if there's a CG tag is obvered (CG tags are converted to cigars in + * the bam code, and should not appear in other formats) */ private void validateTags(final SAMRecord record, final long recordNumber) { - for (final SAMRecord.SAMTagAndValue tagAndValue : record.getAttributes()) { + final List attributes = record.getAttributes(); + + final Set tags = new HashSet<>(attributes.size()); + + for (final SAMRecord.SAMTagAndValue tagAndValue : attributes) { if (tagAndValue.value instanceof Long) { addError(new SAMValidationError(Type.TAG_VALUE_TOO_LARGE, "Numeric value too large for tag " + tagAndValue.tag, record.getReadName(), recordNumber)); } + + if (!tags.add(tagAndValue.tag)) { + addError(new SAMValidationError(Type.DUPLICATE_SAM_TAG, + "Duplicate SAM tag (" + tagAndValue.tag + ") found.", record.getReadName(), recordNumber)); + } + } + + if (tags.contains(SAMTag.CG.name())){ + addError(new SAMValidationError(Type.CG_TAG_FOUND_IN_ATTRIBUTES, + "The CG Tag should only be used in BAM format to hold a large cigar. " + + "It was found containing the value: " + + record.getAttribute(SAMTagUtil.getSingleton().CG), record.getReadName(), recordNumber)); } } diff --git a/src/test/java/htsjdk/samtools/BAMFileWriterTest.java b/src/test/java/htsjdk/samtools/BAMFileWriterTest.java index f624621c4b..3860a75029 100644 --- a/src/test/java/htsjdk/samtools/BAMFileWriterTest.java +++ b/src/test/java/htsjdk/samtools/BAMFileWriterTest.java @@ -24,17 +24,16 @@ package htsjdk.samtools; import htsjdk.HtsjdkTest; +import htsjdk.samtools.metrics.MetricsFile; import htsjdk.samtools.util.CloseableIterator; -import htsjdk.samtools.util.CloserUtil; import htsjdk.samtools.util.SequenceUtil; 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.*; +import java.util.ArrayList; +import java.util.List; /** * Test that BAM writing doesn't blow up. For presorted writing, the resulting BAM file is read and contents are @@ -60,50 +59,69 @@ private SAMRecordSetBuilder getRecordSetBuilder(final boolean sortForMe, final S * @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 it = samReader.iterator(); - while (it.hasNext()) { - bamWriter.addAlignment(it.next()); - } - bamWriter.close(); - it.close(); - samReader.close(); + try (final SamReader samReader = samRecordSetBuilder.getSamReader()) { + samReader.getFileHeader().setSortOrder(sortOrder); + try (final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(samReader.getFileHeader(), presorted, bamFile); + final CloseableIterator it = samReader.iterator()) { + while (it.hasNext()) { + bamWriter.addAlignment(it.next()); + } + } + } if (presorted) { // If SAM text input was presorted, then we can compare SAM object to BAM object verifyBAMFile(samRecordSetBuilder, bamFile); } + + final File tempMetrics = File.createTempFile("CGTagTest", ".validation_metrics"); + try ( + final SamReader samReader = SamReaderFactory.makeDefault().open(bamFile); + final OutputStream outputStream = new FileOutputStream(tempMetrics); + final PrintWriter printWriter = new PrintWriter(outputStream)) { + + new SamFileValidator(printWriter, 100).validateSamFileSummary(samReader, null); + } + + final MetricsFile validationMetrics = new MetricsFile<>(); + validationMetrics.read(new FileReader(tempMetrics)); + + Assert.assertNull(validationMetrics.getHistogram().get("ERROR:CG_TAG_FOUND_IN_ATTRIBUTES")); } - private void verifyBAMFile(final SAMRecordSetBuilder samRecordSetBuilder, final File bamFile) { + private void verifyBAMFile(final SAMRecordSetBuilder samRecordSetBuilder, final File bamFile) throws IOException { + try (final SamReader bamReader = SamReaderFactory.makeDefault().open(bamFile); + final SamReader samReader = samRecordSetBuilder.getSamReader()) { + verifySamReadersEqual(samReader, bamReader); + } + } + + private void verifySamReadersEqual(final SamReader reader2, final SamReader reader1) { - 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 it = samReader.iterator(); - final CloseableIterator bamIt = bamReader.iterator(); - while (it.hasNext()) { - Assert.assertTrue(bamIt.hasNext()); - final SAMRecord samRecord = it.next(); - final SAMRecord bamRecord = bamIt.next(); + reader2.getFileHeader().setSortOrder(reader1.getFileHeader().getSortOrder()); + Assert.assertEquals(reader1.getFileHeader(), reader2.getFileHeader()); - // SAMRecords don't have this set, so stuff it in there - samRecord.setIndexingBin(bamRecord.getIndexingBin()); + try (final CloseableIterator samIt1 = reader1.iterator(); + final CloseableIterator samIt2 = reader2.iterator()) { + while (samIt2.hasNext()) { + Assert.assertTrue(samIt1.hasNext()); + final SAMRecord samRecord1 = samIt1.next(); + final SAMRecord samRecord2 = samIt2.next(); - // Force reference index attributes to be populated - samRecord.getReferenceIndex(); - bamRecord.getReferenceIndex(); - samRecord.getMateReferenceIndex(); - bamRecord.getMateReferenceIndex(); + // SAMRecords don't have this set, so stuff it in there + samRecord2.setIndexingBin(samRecord1.getIndexingBin()); - Assert.assertEquals(bamRecord, samRecord); + // Force reference index attributes to be populated + samRecord1.getReferenceIndex(); + samRecord2.getReferenceIndex(); + samRecord1.getMateReferenceIndex(); + samRecord2.getMateReferenceIndex(); + + Assert.assertEquals(samRecord1, samRecord2); + } + Assert.assertFalse(samIt1.hasNext()); } - Assert.assertFalse(bamIt.hasNext()); - CloserUtil.close(samReader); } @DataProvider(name = "test1") @@ -136,12 +154,11 @@ public void testNullRecordHeaders(final String testName, final SAMRecordSetBuild 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); + try (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); } @@ -227,4 +244,304 @@ public void testBAMReadBases() throws IOException { Assert.assertEquals(recordFromBAM.getReadBases(), SequenceUtil.toBamReadBasesInPlace(originalSAMRecord.getReadBases())); } + @Test(dataProvider = "longCigarsData") + public void testClearAttributesDoesntVoidLongCigar(final int numOps) throws Exception { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); + + builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); + + //encode as BAM into ByteArray + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (final BAMFileWriter writer = new BAMFileWriter(baos, null)) { + writer.setHeader(builder.getHeader()); + builder.getRecords().forEach(writer::addAlignment); + } + + //read from ByteArray + final BAMFileReader reader = new BAMFileReader(new ByteArrayInputStream(baos.toByteArray()), null, false, false, ValidationStringency.SILENT, new DefaultSAMRecordFactory()); + final CloseableIterator iterator = reader.getIterator(); + iterator.hasNext(); + final SAMRecord recordFromBAM = iterator.next(); + + //clear attributes before explicitly accessing cigar or attributes + recordFromBAM.clearAttributes(); + + // see that cigar is unscathed + Assert.assertNotNull(recordFromBAM.getCigar()); + Assert.assertFalse(BAMRecord.isSentinelCigar(recordFromBAM.getCigar(), recordFromBAM.getReadLength())); + } + + @Test(dataProvider = "longCigarsData") + public void testSetCigarRemovesCgTagWhenNoLongerLong(final int numOps) throws Exception { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); + final SAMRecord frag1 = builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); + + frag1.setCigarString(String.format("%dM", cigar.getReadLength())); + testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); + } + + @Test(dataProvider = "longCigarsData") + public void testSetCigarRemovesCgTagWhenStillLong(final int numOps) throws Exception { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); + final SAMRecord frag1 = builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); + final List cigarOperatorsForTest = getCigarOperatorsForTest(numOps); + + cigarOperatorsForTest.add(CigarOperator.H); + final Cigar cigar2 = Cigar.fromCigarOperators(cigarOperatorsForTest); + + frag1.setCigar(cigar2); + testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); + } + + @Test(dataProvider = "longCigarsData") + public void testSetCigarStringRemovesCgTagWhenNoLongerLong(final int numOps) throws Exception { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); + + final SAMRecord frag1 = builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); + + frag1.setCigarString(String.format("%dM", cigar.getReadLength())); + testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); + } + + @Test(dataProvider = "longCigarsData") + public void testSetCigarStringRemovesCgTagWhenStillLong(final int numOps) throws Exception { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); + + final SAMRecord frag1 = builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); + + final List cigarOperatorsForTest = getCigarOperatorsForTest(numOps); + cigarOperatorsForTest.add(CigarOperator.H); + final Cigar cigar2 = Cigar.fromCigarOperators(cigarOperatorsForTest); + + frag1.setCigarString(cigar2.toString()); + testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); + } + + @Test(dataProvider = "longCigarsData") + public void testBinNotNullWhenLargeCigarIsLoaded(final int numOps) throws Exception { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); + + builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); + + final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION); + bamFile.deleteOnExit(); + + try (final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(builder.getHeader(), false, bamFile)) { + for (final SAMRecord record : builder.getRecords()) + bamWriter.addAlignment(record); + } + + try (final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(bamFile)) { + reader.iterator().forEachRemaining(samRecord -> { + samRecord.getCigar(); + Assert.assertNotNull(samRecord.getIndexingBin()); + }); + } + } + + @DataProvider + public Object[][] longCigarsData() { + return new Object[][]{ + {1}, + {10}, + {100}, + {1_000}, + {10_000}, + {BAMRecord.MAX_CIGAR_OPERATORS - 1}, + {BAMRecord.MAX_CIGAR_OPERATORS}, + {BAMRecord.MAX_CIGAR_OPERATORS + 1}, + {100_000}, + {1_000_000} + }; + } + + private final static CigarOperator[] operatorsToUse = new CigarOperator[]{CigarOperator.M, CigarOperator.D, CigarOperator.M, CigarOperator.I}; + + @Test(dataProvider = "longCigarsData") + public void testLongCigarsOneRead(final int numOps) throws Exception { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); + + builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); + testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); + } + + @Test(dataProvider = "longCigarsData") + public void testLongCigarsZerolengthRead(final int numOps) throws Exception { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); + + final SAMRecord sam = builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); + sam.setReadBases(new byte[]{}); + sam.setBaseQualityString(""); + // in htsjdk only secondary alignments are allowed to have read-length zero (doesn't validate otherwise) + sam.setSecondaryAlignment(true); + + testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); + } + + private List getCigarOperatorsForTest(final int numOps) { + final List operators = new ArrayList<>(numOps); + for (int i = 0; i < numOps; i++) { + operators.add(operatorsToUse[i % operatorsToUse.length]); + } + operators.add(CigarOperator.M); + return operators; + } + + @Test(dataProvider = "longCigarsData") + public void testLongCigars(final int numOps) throws Exception { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + final Cigar cigar = Cigar.fromCigarOperators(getCigarOperatorsForTest(numOps)); + + builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); + builder.addPair("pair1", 0, 1, 100_000, false, false, cigar.toString(), cigar.toString(), true, false, 30); + + testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); + } + + @DataProvider + public Object[][] sentinelCigarData() { + return new Object[][]{ + {1, 0, 1}, + {0, 1, 1}, + {0, 0, 0}, + }; + } + + @Test(dataProvider = "sentinelCigarData", expectedExceptions = IllegalStateException.class) + public void testWrongCGTagCigars(final int readOffset, final int refOffset, final int cigarOpsOffset) throws Exception { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + final List operators = getCigarOperatorsForTest(BAMRecord.MAX_CIGAR_OPERATORS + cigarOpsOffset); + final Cigar cigar = Cigar.fromCigarOperators(operators); + final int[] cigarEncoding = BinaryCigarCodec.encode(cigar); + + final Cigar sentinelCigar = BAMRecordCodec.makeSentinelCigar(cigar); + final List sentinelCigarElements = new ArrayList<>(2); + + sentinelCigarElements.add(new CigarElement( + sentinelCigar.getCigarElement(0).getLength() + readOffset, + sentinelCigar.getCigarElement(0).getOperator())); + sentinelCigarElements.add(new CigarElement( + sentinelCigar.getCigarElement(1).getLength() + refOffset, + sentinelCigar.getCigarElement(1).getOperator())); + + final String sentinelCigarString = new Cigar(sentinelCigarElements).toString(); + + builder.addPair("pair1", 0, 1, 100_000, false, false, sentinelCigarString, sentinelCigarString, true, false, 30); + + final SAMRecord frag = builder.addFrag("frag1", 0, 1, false, false, sentinelCigarString, null, 30); + frag.setAttribute(SAMTag.CG.name(), cigarEncoding); + + final List pairOfReads = builder.addPair("pair1", 0, 1, 100_000, false, false, cigar.toString(), cigar.toString(), true, false, 30); + for (final SAMRecord rec : pairOfReads) { + rec.setAttribute(SAMTag.CG.name(), cigarEncoding); + } + + final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION); + bamFile.deleteOnExit(); + + try (final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(builder.getHeader(), false, bamFile)) { + for (final SAMRecord record : builder.getRecords()) + bamWriter.addAlignment(record); + } + + try (final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(bamFile)) { + reader.iterator().forEachRemaining(SAMRecord::getCigar); + } + } + + @Test(dataProvider = "longCigarsData") + public void testNoCGTagCigars(final int numOps) throws Exception { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + final List operators = getCigarOperatorsForTest(numOps); + final Cigar cigar = Cigar.fromCigarOperators(operators); + + builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); + builder.addPair("pair1", 0, 1, 100_000, false, false, cigar.toString(), cigar.toString(), true, false, 30); + + final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION); + bamFile.deleteOnExit(); + + try (final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(builder.getHeader(), false, bamFile)) { + for (SAMRecord record : builder.getRecords()) + bamWriter.addAlignment(record); + } + + try (final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(bamFile)) { + reader.iterator().forEachRemaining(rec -> Assert.assertFalse(rec.hasAttribute(SAMTag.CG.name()))); + } + } + + @Test(dataProvider = "longCigarsData", expectedExceptions = AssertionError.class) + public void testMisplacedCGTag(final int numOps) throws Exception { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + builder.setUseBamFile(false); + + final List operators = getCigarOperatorsForTest(numOps); + final Cigar cigar = Cigar.fromCigarOperators(operators); + + final SAMRecord record = builder.addFrag("frag1", 0, 1, false, false, cigar.toString(), null, 30); + record.setAttribute(SAMTag.CG.name(), "Ceci n'est pas une pipe!"); + + final List pairOfReads = builder.addPair("pair1", 0, 1, 100_000, false, false, cigar.toString(), cigar.toString(), true, false, 30); + for (final SAMRecord rec : pairOfReads) { + rec.setAttribute(SAMTag.CG.name(), "Ceci n'est pas une pipe!"); + } + + testHelper(builder, SAMFileHeader.SortOrder.coordinate, true); + } + + @Test + public void testRealDataLongCigar() throws Exception { + final File samFile = new File("src/test/resources/htsjdk/samtools/BAMCigarOverflowTest/cigar-64k.sam.gz"); + final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION); + bamFile.deleteOnExit(); + + try (final SamReader samReader = SamReaderFactory.make().open(samFile); + final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(samReader.getFileHeader(), true, bamFile); + final CloseableIterator it = samReader.iterator()) { + while (it.hasNext()) { + bamWriter.addAlignment(it.next()); + } + } + try (final SamReader samReader = SamReaderFactory.make().open(samFile); + final SamReader bamReader = SamReaderFactory.make().open(bamFile)) { + + verifySamReadersEqual(samReader, bamReader); + } + } + + @Test + public void setAttributeOnBamRecord() throws IOException { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + + builder.addPair("test", 0, 100, 150, false, false, null, null, true, false, 30); + + //encode as BAM into ByteArray + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (final BAMFileWriter writer = new BAMFileWriter(baos, null)) { + writer.setHeader(builder.getHeader()); + builder.forEach(r -> r.setAttribute("xx", "Testing123")); + builder.forEach(writer::addAlignment); + } + + //read from ByteArray + final BAMFileReader reader = new BAMFileReader(new ByteArrayInputStream(baos.toByteArray()), null, false, false, ValidationStringency.SILENT, new DefaultSAMRecordFactory()); + + for (final SAMRecord rec : (Iterable) reader::getIterator) { + + //clear attribute before explicitly accessing cigar or attributes + rec.setAttribute("xx", null); + Assert.assertNull(rec.getAttribute("xx")); + } + } } + + diff --git a/src/test/resources/htsjdk/samtools/BAMCigarOverflowTest/cigar-64k.sam.gz b/src/test/resources/htsjdk/samtools/BAMCigarOverflowTest/cigar-64k.sam.gz new file mode 100644 index 0000000000000000000000000000000000000000..fe46bbe058b237f69c63de766dce209b4f542aaf GIT binary patch literal 442073 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𝔪w82 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 z�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

VsTtG9 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 F6#%Ty_{;zR literal 0 HcmV?d00001 From 1bbd3cf3885d897b03fdb5369cc6bb4736c52538 Mon Sep 17 00:00:00 2001 From: Nils Homer Date: Mon, 7 May 2018 14:07:59 -0700 Subject: [PATCH 29/83] Fix typos and add defaults to javadoc in Defaults --- src/main/java/htsjdk/samtools/Defaults.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/htsjdk/samtools/Defaults.java b/src/main/java/htsjdk/samtools/Defaults.java index 317a0e78cd..749dcdf9c7 100644 --- a/src/main/java/htsjdk/samtools/Defaults.java +++ b/src/main/java/htsjdk/samtools/Defaults.java @@ -37,24 +37,24 @@ public class Defaults { */ 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. */ + /** Compression 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. */ + /** The output format of the flag field when writing SAM text. Ignored for reading SAM text. Default = DECIMAL */ 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 + * this == BUFFER_SIZE (Default = 128k). */ 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). + * writing SAM files (ex. CRAM). Default = null. */ public static final File REFERENCE_FASTA; @@ -62,36 +62,38 @@ public class Defaults { * Expected format: ,[,] * 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 + * Default = "". */ 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 + * Enabling this is not necessarily a good idea, since this process often fails. Default = false. */ 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. + * Default = "https://www.ebi.ac.uk/ena/cram/md5/%s". */ 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 + * in case such native libraries are not found locally. Default = false. */ public static final boolean SRA_LIBRARIES_DOWNLOAD; /** - * the name of the system property that disables snappy + * The name of the system property that disables snappy. Default = "snappy.disable". */ public static final String DISABLE_SNAPPY_PROPERTY_NAME = "snappy.disable"; /** - * Disable use of the Snappy compressor + * Disable use of the Snappy compressor. Default = false. */ public static final boolean DISABLE_SNAPPY_COMPRESSOR; From adf428f970a73cfc467bcbc3eb6343a74abff7b5 Mon Sep 17 00:00:00 2001 From: Tom White Date: Tue, 15 May 2018 19:30:27 +0100 Subject: [PATCH 30/83] Make BlockCompressedFilePointerUtil.makeFilePointer public (#1116) * make a previously package protected method public and add a new overload * partially addresses #1112 --- .../samtools/util/BlockCompressedFilePointerUtil.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/htsjdk/samtools/util/BlockCompressedFilePointerUtil.java b/src/main/java/htsjdk/samtools/util/BlockCompressedFilePointerUtil.java index 634534c0a2..878a0e7438 100644 --- a/src/main/java/htsjdk/samtools/util/BlockCompressedFilePointerUtil.java +++ b/src/main/java/htsjdk/samtools/util/BlockCompressedFilePointerUtil.java @@ -58,12 +58,20 @@ public static boolean areInSameOrAdjacentBlocks(final long vfp1, final long vfp2 return (block1 == block2 || block1 + 1 == block2); } + /** + * @param blockAddress File offset of start of BGZF block. + * @return Virtual file pointer that points to the start of a BGZF block. + */ + public static long makeFilePointer(final long blockAddress) { + return makeFilePointer(blockAddress, 0); + } + /** * @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) { + public static long makeFilePointer(final long blockAddress, final int blockOffset) { if (blockOffset < 0) { throw new IllegalArgumentException("Negative blockOffset " + blockOffset + " not allowed."); } From c3ea1098ebecbd48d6e9f78fcbc4b08dceb1dac1 Mon Sep 17 00:00:00 2001 From: Yossi Farjoun Date: Tue, 22 May 2018 16:42:13 -0400 Subject: [PATCH 31/83] Fix regression regarding pipeing (#1124) * Extended SamReaderFactoryTest.testWriteAndReadFromPipe to be more comprehensive. * Fixes piping so it passes the test. * We can pipe bams again! --- .../htsjdk/samtools/SamInputResource.java | 8 +- .../htsjdk/samtools/SamReaderFactoryTest.java | 328 +++++++++--------- 2 files changed, 174 insertions(+), 162 deletions(-) diff --git a/src/main/java/htsjdk/samtools/SamInputResource.java b/src/main/java/htsjdk/samtools/SamInputResource.java index b17f2276cf..fb7aa47d63 100644 --- a/src/main/java/htsjdk/samtools/SamInputResource.java +++ b/src/main/java/htsjdk/samtools/SamInputResource.java @@ -38,6 +38,7 @@ import java.net.URL; import java.nio.channels.SeekableByteChannel; import java.nio.file.FileSystemNotFoundException; +import java.nio.file.Files; import java.nio.file.Path; import java.util.function.Function; import java.util.function.Supplier; @@ -91,7 +92,12 @@ public static SamInputResource of(final File 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)); + + if (Files.isRegularFile(path) && Files.exists(path)) { + return new SamInputResource(new PathInputResource(path)); + } else { + return of(path.toFile()); + } } /** Creates a {@link SamInputResource} reading from the provided resource, with no index, diff --git a/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java b/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java index 5822f6b3ab..93222dce25 100644 --- a/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java +++ b/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java @@ -1,6 +1,7 @@ package htsjdk.samtools; import htsjdk.HtsjdkTest; +import htsjdk.samtools.SAMFileHeader.SortOrder; import htsjdk.samtools.cram.ref.ReferenceSource; import htsjdk.samtools.seekablestream.ISeekableStreamFactory; import htsjdk.samtools.seekablestream.SeekableFileStream; @@ -22,10 +23,7 @@ import java.nio.channels.SeekableByteChannel; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.*; import java.util.function.BiFunction; import java.util.function.Function; @@ -50,9 +48,10 @@ public void variousFormatReaderInflatorFactoryTest() throws IOException { final String inputFile = "compressed.bam"; final int[] inflateCalls = {0}; //Note: using an array is a HACK to fool the compiler class MyInflater extends Inflater { - MyInflater(boolean gzipCompatible){ + MyInflater(boolean gzipCompatible) { super(gzipCompatible); } + @Override public int inflate(byte[] b, int off, int len) throws java.util.zip.DataFormatException { inflateCalls[0]++; @@ -68,13 +67,14 @@ public Inflater makeInflater(final boolean gzipCompatible) { final File input = new File(TEST_DATA_DIR, inputFile); try (final SamReader reader = SamReaderFactory.makeDefault().inflaterFactory(myInflaterFactory).open(input)) { - for (final SAMRecord ignored : reader) { } + for (final SAMRecord ignored : reader) { + } } Assert.assertNotEquals(inflateCalls[0], 0, "Not using Inflater from InflateFactory on file : " + inputFile); } private int countRecordsInQueryInterval(final SamReader reader, final QueryInterval query) { - final SAMRecordIterator iter = reader.queryOverlapping(new QueryInterval[] { query }); + final SAMRecordIterator iter = reader.queryOverlapping(new QueryInterval[]{query}); int count = 0; while (iter.hasNext()) { iter.next(); @@ -97,22 +97,22 @@ private int countRecords(final SamReader reader) { private static SeekableByteChannel addHeader(SeekableByteChannel input) { try { - int total = (int)input.size(); - final String comment = "@HD\tVN:1.0 SO:unsorted\n" + - "@SQ\tSN:chr1\tLN:101\n" + - "@SQ\tSN:chr2\tLN:101\n" + - "@SQ\tSN:chr3\tLN:101\n" + - "@RG\tID:0\tSM:JP was here\n"; + int total = (int) input.size(); + final String comment = "@HD\tVN:1.0 SO:unsorted\n" + + "@SQ\tSN:chr1\tLN:101\n" + + "@SQ\tSN:chr2\tLN:101\n" + + "@SQ\tSN:chr3\tLN:101\n" + + "@RG\tID:0\tSM:JP was here\n"; byte[] commentBuf = comment.getBytes(); - ByteBuffer buf = ByteBuffer.allocate(total + commentBuf.length); - buf.put(commentBuf); - input.position(0); - while (input.read(buf)>0) { - // read until EOF - } - buf.flip(); - return new SeekableByteChannelFromBuffer(buf); + ByteBuffer buf = ByteBuffer.allocate(total + commentBuf.length); + buf.put(commentBuf); + input.position(0); + while (input.read(buf) > 0) { + // read until EOF + } + buf.flip(); + return new SeekableByteChannelFromBuffer(buf); } catch (IOException x) { throw new RuntimeException(x); } @@ -122,9 +122,9 @@ private static SeekableByteChannel addHeader(SeekableByteChannel input) { public void testWrap() throws IOException { final Path input = Paths.get(TEST_DATA_DIR.getPath(), "noheader.sam"); final SamReader wrappedReader = - SamReaderFactory - .makeDefault() - .open(input, SamReaderFactoryTest::addHeader, null); + SamReaderFactory + .makeDefault() + .open(input, SamReaderFactoryTest::addHeader, null); int records = countRecords(wrappedReader); Assert.assertEquals(10, records); } @@ -192,11 +192,14 @@ public void samRecordFactoryTest(final String inputFile) throws IOException { 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); + 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) + @Test(expectedExceptions = IllegalStateException.class) public void samRecordFactoryNullHeaderBAMTest() { final SAMRecordFactory recordFactory = new DefaultSAMRecordFactory(); recordFactory.createBAMRecord( @@ -215,7 +218,6 @@ public void samRecordFactoryNullHeaderBAMTest() { null); } - /** * Unit tests for asserting all permutations of data and index sources read the same records and header. */ @@ -235,7 +237,7 @@ public void samRecordFactoryNullHeaderBAMTest() { @DataProvider public Object[][] composeAllPermutationsOfSamInputResource() { - final List sources = new ArrayList(); + final List sources = new ArrayList<>(); for (final InputResource.Type dataType : InputResource.Type.values()) { if (dataType.equals(InputResource.Type.SRA_ACCESSION)) continue; @@ -282,22 +284,23 @@ private InputResource composeInputResourceForType(final InputResource.Type type, } } - final Set observedHeaders = new HashSet(); - final Set> observedRecordOrdering = new HashSet>(); + final Set observedHeaders = new HashSet<>(); + final Set> observedRecordOrdering = new HashSet<>(); @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 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); + try(final SamReader reader = SamReaderFactory.makeDefault().open(resource)) { + LOG.info(String.format("Reading from %s ...", resource)); + final List slurped = Iterables.slurp(reader); + final SAMFileHeader fileHeader = reader.getFileHeader(); + reader.hasIndex(); + reader.indexing().hasBrowseableIndex(); + + /* 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"); } @@ -311,7 +314,6 @@ public void openPath() throws IOException { 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)) { @@ -322,41 +324,40 @@ public void openPath() throws IOException { } } - final Set> observedRecordOrdering1 = new HashSet>(); - final Set> observedRecordOrdering3 = new HashSet>(); - final Set> observedRecordOrdering20 = new HashSet>(); + final Set> observedRecordOrdering1 = new HashSet<>(); + final Set> observedRecordOrdering3 = new HashSet<>(); + final Set> observedRecordOrdering20 = new HashSet<>(); @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."); + try(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) @@ -395,50 +396,52 @@ public void queryStreamingPathBamWithFileIndex() throws IOException { @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); + 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(); + 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); - } - } - + @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); + 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);}, + (cramURL, indexURL) -> { + return SamInputResource.of(cramURL).index(indexURL); + }, true, 3); } @@ -453,8 +456,7 @@ public void testCRAMReaderFromURLStream() throws IOException { return SamInputResource .of(streamFactory.getStreamFor(cramURL)) .index(streamFactory.getStreamFor(indexURL)); - } - catch (IOException e) { + } catch (IOException e) { throw new RuntimeIOException(e); } }, @@ -466,18 +468,22 @@ public void testCRAMReaderFromURLStream() throws IOException { 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); + (cramURL, indexURL) -> { + return SamInputResource.of(cramURL); + }, + false, + 11); } - @Test(expectedExceptions=RuntimeIOException.class) + @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); + (cramURL, indexURL) -> { + return SamInputResource.of(cramURL).index(new File("nonexistent.bai")); + }, + true, + 3); } private void getCRAMReaderFromInputResource( @@ -495,8 +501,8 @@ private void getCRAMReaderFromInputResource( final SamReader reader = factory.open(getInputResource.apply(cramURL, indexURL)); int count = hasIndex ? - countRecordsInQueryInterval(reader, new QueryInterval(1, 10, 1000)) : - countRecords(reader); + countRecordsInQueryInterval(reader, new QueryInterval(1, 10, 1000)) : + countRecords(reader); Assert.assertEquals(count, expectedCount); } @@ -512,18 +518,18 @@ public void testSamReaderFromSeekableStream() throws IOException { 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); + try (final SamReader reader = factory.open(SamInputResource.of(samURL))) { + Assert.assertEquals(countRecords(reader), 10); + } } - @Test(expectedExceptions=SAMFormatException.class) + @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 @@ -531,62 +537,62 @@ public void testSamReaderFromMalformedSeekableStream() throws IOException { 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); + try (final SamReader reader = factory.open( + SamInputResource.of(new SeekableFileStream(samFile)))) { + countRecords(reader); + } } - @Test(singleThreaded = true, groups="unix") - public void testWriteAndReadFromPipe() throws IOException, InterruptedException, ExecutionException, TimeoutException { + @DataProvider() + Object[][] trueFalse() { + return new Object[][]{{true}, {false}}; + } + + @Test(dataProvider = "trueFalse", singleThreaded = true, groups = "unix") + public void testWriteAndReadFromPipe(final boolean usePath) throws IOException, InterruptedException, ExecutionException, TimeoutException { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(false, SortOrder.unsorted); + for (int i = 1; i <= 5000; ++i) { + builder.addPair("q" + i, 0, i, i); + } + final File fifo = File.createTempFile("fifo", ""); Assert.assertTrue(fifo.delete()); fifo.deleteOnExit(); - final Process exec = Runtime.getRuntime().exec(new String[]{"mkfifo", fifo.getAbsolutePath()}); + final Process exec = new ProcessBuilder("mkfifo", fifo.getAbsolutePath()).start(); exec.waitFor(1, TimeUnit.MINUTES); Assert.assertEquals(exec.exitValue(), 0, "mkfifo failed with exit code " + 0); ExecutorService executor = null; try { - executor = Executors.newFixedThreadPool(2); - final File input = new File(TEST_DATA_DIR, "example.bam"); - final Future writing = executor.submit(writeToPipe(fifo, input)); - final Future reading = executor.submit(readFromPipe(fifo)); - Assert.assertEquals(writing.get(1, TimeUnit.MINUTES), reading.get(1, TimeUnit.MINUTES)); - } finally { - if (executor != null) { - executor.shutdownNow(); - } - } - } + executor = Executors.newSingleThreadExecutor(); + final Future future = executor.submit(() -> { + try (final SAMFileWriter writer = new SAMFileWriterFactory() + .setCreateIndex(false).setCreateMd5File(false).makeBAMWriter(builder.getHeader(), true, fifo)) { - private static Callable readFromPipe(File fifo) { - return () -> { - try (final SamReader reader = SamReaderFactory.makeDefault().open(fifo)) { - return (int)reader.iterator().stream().count(); - } catch (Exception e) { - Assert.fail("failed during reading from pipe", e); - } - throw new RuntimeException("Shouldn't actually reach here but the compiler was confused"); - }; - } - - private static Callable writeToPipe(File fifo, File input) { - return () -> { - int written = 0; - try { - try (final SamReader reader = SamReaderFactory.makeDefault().open(input); - final SAMFileWriter writer = new SAMFileWriterFactory().setCreateIndex(false) - .setCreateMd5File(false) - .makeBAMWriter(reader.getFileHeader(), true, fifo)) { - for (SAMRecord read : reader) { + int written = 0; + for (SAMRecord read : builder) { writer.addAlignment(read); - written++; + written += 1; } + return written; + } + }); + final SamInputResource res = usePath ? + SamInputResource.of(fifo.toPath()) : + SamInputResource.of(fifo); + + int count = 0; + try (final SamReader in = SamReaderFactory.make().open(res)) { + for (SAMRecord rec : in) { + Assert.assertEquals(rec.getReadName(), "q" + rec.getAlignmentStart()); + count += 1; } - } catch (final Exception e) { - Assert.fail("Failed during writing to pipe", e); } - return written; - }; + + Assert.assertEquals(count, builder.size()); + Assert.assertEquals(count, future.get().intValue()); + } finally { + if (executor != null) executor.shutdownNow(); + } } } From a4ea695fabc92a1292dcac076ab74b4754566a21 Mon Sep 17 00:00:00 2001 From: Yossi Farjoun Date: Tue, 22 May 2018 22:11:05 -0400 Subject: [PATCH 32/83] - added some text (#1126) --- .../htsjdk/samtools/SamInputResource.java | 9 +- .../htsjdk/samtools/SamReaderFactoryTest.java | 102 +++++++++--------- 2 files changed, 59 insertions(+), 52 deletions(-) diff --git a/src/main/java/htsjdk/samtools/SamInputResource.java b/src/main/java/htsjdk/samtools/SamInputResource.java index fb7aa47d63..5554f73175 100644 --- a/src/main/java/htsjdk/samtools/SamInputResource.java +++ b/src/main/java/htsjdk/samtools/SamInputResource.java @@ -96,7 +96,14 @@ public static SamInputResource of(final Path path) { if (Files.isRegularFile(path) && Files.exists(path)) { return new SamInputResource(new PathInputResource(path)); } else { - return of(path.toFile()); + // in the case of named pipes and other non-seekable paths there's a bug in the implementation of + // java's GZIPInputStream which inappropriately uses .available() and then gets confused with the result + // of 0. For reference see: + // https://bugs.java.com/view_bug.do?bug_id=7036144 + // https://github.com/samtools/htsjdk/pull/1077 + // https://github.com/samtools/htsjdk/issues/898 + + return of(path.toFile()); } } diff --git a/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java b/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java index 93222dce25..e68052effa 100644 --- a/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java +++ b/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java @@ -543,56 +543,56 @@ public void testSamReaderFromMalformedSeekableStream() throws IOException { } } - @DataProvider() - Object[][] trueFalse() { - return new Object[][]{{true}, {false}}; - } - - @Test(dataProvider = "trueFalse", singleThreaded = true, groups = "unix") - public void testWriteAndReadFromPipe(final boolean usePath) throws IOException, InterruptedException, ExecutionException, TimeoutException { - final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(false, SortOrder.unsorted); - for (int i = 1; i <= 5000; ++i) { - builder.addPair("q" + i, 0, i, i); - } - - final File fifo = File.createTempFile("fifo", ""); - Assert.assertTrue(fifo.delete()); - fifo.deleteOnExit(); - final Process exec = new ProcessBuilder("mkfifo", fifo.getAbsolutePath()).start(); - exec.waitFor(1, TimeUnit.MINUTES); - Assert.assertEquals(exec.exitValue(), 0, "mkfifo failed with exit code " + 0); - - ExecutorService executor = null; - try { - executor = Executors.newSingleThreadExecutor(); - final Future future = executor.submit(() -> { - try (final SAMFileWriter writer = new SAMFileWriterFactory() - .setCreateIndex(false).setCreateMd5File(false).makeBAMWriter(builder.getHeader(), true, fifo)) { - - int written = 0; - for (SAMRecord read : builder) { - writer.addAlignment(read); - written += 1; - } - return written; - } - }); - final SamInputResource res = usePath ? - SamInputResource.of(fifo.toPath()) : - SamInputResource.of(fifo); - - int count = 0; - try (final SamReader in = SamReaderFactory.make().open(res)) { - for (SAMRecord rec : in) { - Assert.assertEquals(rec.getReadName(), "q" + rec.getAlignmentStart()); - count += 1; - } - } - - Assert.assertEquals(count, builder.size()); - Assert.assertEquals(count, future.get().intValue()); - } finally { - if (executor != null) executor.shutdownNow(); - } + @Test(singleThreaded = true, groups = "unix") + public void testWriteAndReadFromPipe() throws IOException, InterruptedException, ExecutionException, TimeoutException { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(false, SortOrder.unsorted); + for (int i = 1; i <= 5000; ++i) { + builder.addPair("q" + i, 0, i, i); + } + + for (final boolean usePath : CollectionUtil.makeList(true, false)) { + + final File fifo = File.createTempFile("fifo", ""); + Assert.assertTrue(fifo.delete()); + fifo.deleteOnExit(); + final Process exec = new ProcessBuilder("mkfifo", fifo.getAbsolutePath()).start(); + exec.waitFor(1, TimeUnit.MINUTES); + Assert.assertEquals(exec.exitValue(), 0, "mkfifo failed with exit code " + 0); + + ExecutorService executor = null; + try { + executor = Executors.newSingleThreadExecutor(); + final Future future = executor.submit(() -> { + try (final SAMFileWriter writer = new SAMFileWriterFactory() + .setCreateIndex(false) + .setCreateMd5File(false) + .makeBAMWriter(builder.getHeader(), true, fifo)) { + + int written = 0; + for (final SAMRecord read : builder) { + writer.addAlignment(read); + written += 1; + } + return written; + } + }); + final SamInputResource res = usePath ? + SamInputResource.of(fifo.toPath()) : + SamInputResource.of(fifo); + + int count = 0; + try (final SamReader in = SamReaderFactory.make().open(res)) { + for (final SAMRecord rec : in) { + Assert.assertEquals(rec.getReadName(), "q" + rec.getAlignmentStart()); + count += 1; + } + } + + Assert.assertEquals(count, builder.size()); + Assert.assertEquals(count, future.get().intValue()); + } finally { + if (executor != null) executor.shutdownNow(); + } + } } } From 442029c5bd9278d5352c5966ffdf0395843a5664 Mon Sep 17 00:00:00 2001 From: Tom White Date: Fri, 25 May 2018 18:09:36 +0100 Subject: [PATCH 33/83] seeking within SeekableBufferedStream's buffer reuses the existing buffer (#1121) * Previously seeking on a SeekableBufferedStream would always perform a seek on the underlying stream and create a new buffer afterwards. * Now, any seek that falls within the existing buffer moves within the buffer without performing an expensive seek operation on the underlying stream. This is a performance improvement when making many repetitive seek calls that fall close to each other. * part of #1112 --- .../SeekableBufferedStream.java | 33 ++++++++++++- .../SeekableBufferedStreamTest.java | 47 +++++++++++++++++++ 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java index 0c89b0166d..be71a6b8bd 100644 --- a/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java +++ b/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java @@ -46,6 +46,20 @@ int getBytesInBufferAvailable() { if (this.count == this.pos) return 0; // documented test for "is buffer empty" else return this.buf.length - this.pos; } + + /** Return true if the position can be changed by the given delta and remain in the buffer. */ + boolean canChangePos(long delta) { + return this.pos + delta >= 0 && delta < getBytesInBufferAvailable(); + } + + /** Changes the position in the buffer by a given delta. */ + void changePos(int delta) { + int newPos = this.pos + delta; + if (newPos < 0 || newPos > this.buf.length) { + throw new IllegalArgumentException("New position not in buffer pos=" + this.pos + ", delta=" + delta); + } + this.pos = newPos; + } } @@ -80,16 +94,31 @@ public long skip(final long skipLength) throws IOException { return retval; } else { final long position = this.position + skipLength; - seek(position); + seekInternal(position); return skipLength; } } @Override public void seek(final long position) throws IOException { - this.position = position; + if (this.position == position) { + return; + } + // check if the seek is within the buffer + long delta = position - this.position; + if (this.bufferedStream.canChangePos(delta)) { + // casting to an int is safe since the buffer is less than the size of an int + this.bufferedStream.changePos((int) delta); + this.position = position; + } else { + seekInternal(position); + } + } + + private void seekInternal(final long position) throws IOException { wrappedStream.seek(position); bufferedStream = new ExtBufferedInputStream(wrappedStream, bufferSize); + this.position = position; } @Override diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java index 8de587327a..55adfdffee 100644 --- a/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java +++ b/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java @@ -32,6 +32,7 @@ import java.io.IOException; import java.net.URL; +import static htsjdk.samtools.seekablestream.SeekableBufferedStream.DEFAULT_BUFFER_SIZE; import static org.testng.Assert.assertEquals; public class SeekableBufferedStreamTest extends HtsjdkTest { @@ -123,6 +124,52 @@ public void testSkip() throws IOException { } } + @Test + public void testSeek() throws IOException { + final int bufferSize = 20000; + final int startPosition = 250000; + final int length = 5000; + + final int[] RELATIVE_SEEK_OFFSET = new int[]{-bufferSize*2, -bufferSize, -bufferSize/2, -length, -length/2, -1, + 0, 1, length/2, length, bufferSize/2, bufferSize-1, bufferSize, bufferSize*2}; + + for (final int seekOffset : RELATIVE_SEEK_OFFSET) { + try (SeekableStream unBufferedStream = new SeekableFileStream(BAM_FILE); + SeekableBufferedStream bufferedStream = new SeekableBufferedStream(new SeekableHTTPStream(new URL(BAM_URL_STRING)), bufferSize)) { + byte[] buffer1 = new byte[length]; + unBufferedStream.seek(startPosition); + int bytesRead = unBufferedStream.read(buffer1, 0, length); + Assert.assertEquals(length, bytesRead); + + byte[] buffer2 = new byte[length]; + bufferedStream.seek(startPosition); + bytesRead = bufferedStream.read(buffer2, 0, length); + Assert.assertEquals(length, bytesRead); + + Assert.assertEquals(buffer1, buffer2); + + unBufferedStream.seek(startPosition + seekOffset); + bytesRead = unBufferedStream.read(buffer1, 0, length); + Assert.assertEquals(length, bytesRead); + + Object internalBuffer = bufferedStream.bufferedStream; + bufferedStream.seek(startPosition + seekOffset); + bytesRead = bufferedStream.read(buffer2, 0, length); + Assert.assertEquals(length, bytesRead); + Object newInternalBuffer = bufferedStream.bufferedStream; + if (seekOffset >=0 && seekOffset < bufferSize) { + Assert.assertSame(internalBuffer, newInternalBuffer, + "Internal buffer should have been reused for seek offset " + seekOffset); + } else { + Assert.assertNotSame(internalBuffer, newInternalBuffer, + "Internal buffer should not have been reused for seek offset " + seekOffset); + } + + Assert.assertEquals(buffer1, buffer2, "Error at relative seek offset " + seekOffset); + } + } + } + private int reallyRead(final byte[] bytes, final SeekableBufferedStream in) throws IOException { int read = 0, total = 0; do { From b2bfb32316072349b3f15cc1bc26900d0162b742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B3mez-S=C3=A1nchez?= Date: Mon, 28 May 2018 23:18:56 +0200 Subject: [PATCH 34/83] Support for block-compressed indexed FASTA references (#1014) * HTSJDK can now read and query block compressed fasta files that have a .fai and .gzi index with them. * Extract AbstractIndexedFastaSequenceFile Extract a common class for indexed FASTA sequence file, to use a different random-access like BlockCompressedInputStream instead of SeekableByteChannel. In addition, the IndexedFastaSequenceFile throws for block-compressed references. * Add BlockCompressedIndexedFastaSequenceFile New class for indexed FASTA reference sequences to support block-compressed input. In addition, the factory method was updated to return the new class in the case of block-compressed files. --- .../AbstractIndexedFastaSequenceFile.java | 235 +++++++++++++++++ ...ockCompressedIndexedFastaSequenceFile.java | 118 +++++++++ .../reference/IndexedFastaSequenceFile.java | 237 +++--------------- .../ReferenceSequenceFileFactory.java | 50 +++- ...AbstractIndexedFastaSequenceFileTest.java} | 53 ++-- .../ReferenceSequenceFileFactoryTests.java | 21 ++ ...iens_assembly18.trimmed.nogzindex.fasta.gz | Bin 0 -> 335008 bytes ..._assembly18.trimmed.nogzindex.fasta.gz.fai | 2 + ...apiens_assembly18.trimmed.noindex.fasta.gz | Bin 0 -> 335008 bytes 9 files changed, 485 insertions(+), 231 deletions(-) create mode 100644 src/main/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFile.java create mode 100644 src/main/java/htsjdk/samtools/reference/BlockCompressedIndexedFastaSequenceFile.java rename src/test/java/htsjdk/samtools/reference/{IndexedFastaSequenceFileTest.java => AbstractIndexedFastaSequenceFileTest.java} (85%) create mode 100644 src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nogzindex.fasta.gz create mode 100644 src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nogzindex.fasta.gz.fai create mode 100644 src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta.gz diff --git a/src/main/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFile.java new file mode 100644 index 0000000000..fb0037509f --- /dev/null +++ b/src/main/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFile.java @@ -0,0 +1,235 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Daniel Gomez-Sanchez + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT 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.FileNotFoundException; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Iterator; + +/** + * @author Daniel Gomez-Sanchez (magicDGS) + */ +abstract class AbstractIndexedFastaSequenceFile extends AbstractFastaSequenceFile { + + /** + * 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 indexIterator; + + protected AbstractIndexedFastaSequenceFile(final Path path) throws FileNotFoundException { + this(path, new FastaSequenceIndex(findRequiredFastaIndexFile(path))); + } + + protected AbstractIndexedFastaSequenceFile(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); + reset(); + if(getSequenceDictionary() != null) { + sanityCheckDictionaryAgainstIndex(path.toAbsolutePath().toString(),sequenceDictionary,index); + } + } + + protected static Path findRequiredFastaIndexFile(Path fastaFile) throws FileNotFoundException { + Path ret = findFastaIndex(fastaFile); + if (ret == null) throw new FileNotFoundException(ReferenceSequenceFileFactory.getFastaIndexFileName(fastaFile) + " not found."); + return ret; + } + + protected static Path findFastaIndex(Path fastaFile) { + Path indexFile = ReferenceSequenceFileFactory.getFastaIndexFileName(fastaFile); + if (!Files.exists(indexFile)) return null; + return indexFile; + } + + /** + * 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 sequenceIterator = sequenceDictionary.getSequences().iterator(); + Iterator 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() ); + } + } + + public FastaSequenceIndex getIndex() { + return index; + } + + /** + * Gets the next sequence if available, or null if not present. + * @return next sequence if available, or null if not present. + */ + @Override + public final ReferenceSequence nextSequence() { + if( !indexIterator.hasNext() ) + return null; + return getSequence( indexIterator.next().getContig() ); + } + + /** + * Reset the iterator over the index. + */ + @Override + public final void reset() { + indexIterator = index.iterator(); + } + + @Override + public final boolean isIndexed() { + return true; + } + + /** + * Retrieves the complete sequence described by this contig. + * @param contig contig whose data should be returned. + * @return The full sequence associated with this contig. + */ + @Override + public final 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. + */ + @Override + public final 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 = getIndex().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(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 sequence file into the given buffer, + * starting at the given file position. + * + * @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 + */ + protected abstract int readFromPosition(final ByteBuffer buffer, long position) throws IOException; +} diff --git a/src/main/java/htsjdk/samtools/reference/BlockCompressedIndexedFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/BlockCompressedIndexedFastaSequenceFile.java new file mode 100644 index 0000000000..e30b5ed9db --- /dev/null +++ b/src/main/java/htsjdk/samtools/reference/BlockCompressedIndexedFastaSequenceFile.java @@ -0,0 +1,118 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Daniel Gomez-Sanchez + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT 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.seekablestream.SeekablePathStream; +import htsjdk.samtools.util.BlockCompressedInputStream; +import htsjdk.samtools.util.GZIIndex; + +import java.io.BufferedInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * A block-compressed FASTA file driven by an index for fast lookups. + * + *

Supports two interfaces: the ReferenceSequenceFile for old-style, stateful lookups and a direct getter. + * + * @author Daniel Gomez-Sanchez (magicDGS) + */ +public class BlockCompressedIndexedFastaSequenceFile extends AbstractIndexedFastaSequenceFile { + + private final BlockCompressedInputStream stream; + private final GZIIndex gzindex; + + public BlockCompressedIndexedFastaSequenceFile(final Path path) + throws FileNotFoundException { + this(path,new FastaSequenceIndex((findRequiredFastaIndexFile(path)))); + } + + public BlockCompressedIndexedFastaSequenceFile(final Path path, final FastaSequenceIndex index) { + this(path, index, loadFastaGziIndex(path)); + } + + public BlockCompressedIndexedFastaSequenceFile(final Path path, final FastaSequenceIndex index, final GZIIndex gziIndex) { + super(path, index); + if (gziIndex == null) { + throw new IllegalArgumentException("null gzi index"); + } + if (!canCreateBlockCompresedIndexedFastaSequence(path)) { + throw new SAMException("Invalid block-compressed Fasta file"); + } + try { + stream = new BlockCompressedInputStream(new SeekablePathStream(path)); + gzindex = gziIndex; + } catch (IOException e) { + throw new SAMException("Fasta file should be readable but is not: " + path, e); + } + } + + private static GZIIndex loadFastaGziIndex(final Path path) { + try { + return GZIIndex.loadIndex(GZIIndex.resolveIndexNameForBgzipFile(path)); + } catch (final IOException e) { + throw new SAMException("Error loading GZI index for " + path, e); + } + } + + private static boolean canCreateBlockCompresedIndexedFastaSequence(final Path path) { + try (final InputStream stream = new BufferedInputStream(Files.newInputStream(path))) { + // check if the it is a valid block-compressed file + if(BlockCompressedInputStream.isValidFile(stream)) { + // check if the .gzi index exits + return Files.exists(GZIIndex.resolveIndexNameForBgzipFile(path)); + } + } catch (IOException e) { + return false; + } + return false; + } + + @Override + protected int readFromPosition(final ByteBuffer buffer, final long position) throws IOException { + // old position to get back + final long oldPos = stream.getFilePointer(); + try { + final long virtualOffset = gzindex.getVirtualOffsetForSeek(position); + stream.seek(virtualOffset); + final byte[] array = new byte[buffer.remaining()]; + final int read = stream.read(array); + buffer.put(array); + return read; + } finally { + stream.seek(oldPos); + } + } + + @Override + public void close() throws IOException { + stream.close(); + } +} diff --git a/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java index 5c318782e1..68f20b6e3d 100644 --- a/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java +++ b/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java @@ -24,44 +24,31 @@ package htsjdk.samtools.reference; -import htsjdk.samtools.Defaults; import htsjdk.samtools.SAMException; -import htsjdk.samtools.SAMSequenceDictionary; -import htsjdk.samtools.SAMSequenceRecord; +import htsjdk.samtools.util.BlockCompressedInputStream; import htsjdk.samtools.util.IOUtil; -import java.io.Closeable; +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.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 { +public class IndexedFastaSequenceFile extends AbstractIndexedFastaSequenceFile { /** * 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 indexIterator; - /** * Open the given indexed fasta sequence file. Throw an exception if the file cannot be opened. * @param file The file to open. @@ -78,7 +65,7 @@ public IndexedFastaSequenceFile(final File file, final FastaSequenceIndex index) * @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)))); + this(file, new FastaSequenceIndex((findRequiredFastaIndexFile(file == null ? null : file.toPath())))); } /** @@ -87,19 +74,16 @@ public IndexedFastaSequenceFile(final File file) throws FileNotFoundException { * @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 { + super(path, index); + try (final InputStream stream = IOUtil.maybeBufferInputStream(Files.newInputStream(path))) { + // check if the it is a valid block-compressed file + if (BlockCompressedInputStream.isValidFile(stream)) { + throw new SAMException("Indexed block-compressed FASTA file cannot be handled: " + path); + } this.channel = Files.newByteChannel(path); } catch (IOException e) { - throw new SAMException("Fasta file should be readable but is not: " + path, e); + throw new SAMException("FASTA file should be readable but is not: " + path, e); } - reset(); - - if(getSequenceDictionary() != null) - sanityCheckDictionaryAgainstIndex(path.toAbsolutePath().toString(),sequenceDictionary,index); } /** @@ -111,178 +95,40 @@ public IndexedFastaSequenceFile(final Path path) throws FileNotFoundException { this(path, new FastaSequenceIndex((findRequiredFastaIndexFile(path)))); } - @Override - 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 = ReferenceSequenceFileFactory.getFastaIndexFileName(fastaFile); - if (!Files.exists(indexFile)) return null; - return indexFile; - } - - private static Path findRequiredFastaIndexFile(Path fastaFile) throws FileNotFoundException { - Path ret = findFastaIndex(fastaFile); - if (ret == null) throw new FileNotFoundException(ReferenceSequenceFileFactory.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 sequenceIterator = sequenceDictionary.getSequences().iterator(); - Iterator 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. - */ - @Override - 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. + * @deprecated use {@link ReferenceSequenceFileFactory#canCreateIndexedFastaReader(Path)} instead. */ - @Override - public ReferenceSequence getSequence( String contig ) { - return getSubsequenceAt( contig, 1, (int)index.getIndexEntry(contig).getSize() ); + @Deprecated + public static boolean canCreateIndexedFastaReader(final File fastaFile) { + return canCreateIndexedFastaReader(fastaFile.toPath()); } /** - * 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. + * @deprecated use {@link ReferenceSequenceFileFactory#canCreateIndexedFastaReader(Path)} instead. */ - @Override - 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())); + @Deprecated + public static boolean canCreateIndexedFastaReader(final Path fastaFile) { + try (final InputStream stream = new BufferedInputStream(Files.newInputStream(fastaFile))) { + if (BlockCompressedInputStream.isValidFile(stream)) { + return false; } - - // Reset the buffer for inbound transfers. - channelBuffer.flip(); + return (Files.exists(fastaFile) && + findFastaIndex(fastaFile) != null); + } catch (IOException e) { + return false; } - - 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 { + @Override + protected int readFromPosition(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 { @@ -296,33 +142,6 @@ private static int readFromPosition(final SeekableByteChannel channel, final Byt } } - /** - * Gets the next sequence if available, or null if not present. - * @return next sequence if available, or null if not present. - */ - @Override - public ReferenceSequence nextSequence() { - if( !indexIterator.hasNext() ) - return null; - return getSequence( indexIterator.next().getContig() ); - } - - /** - * Reset the iterator over the index. - */ - @Override - 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/ReferenceSequenceFileFactory.java b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java index 654706819d..ed1c233444 100644 --- a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java +++ b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java @@ -24,10 +24,17 @@ package htsjdk.samtools.reference; +import htsjdk.samtools.SAMException; +import htsjdk.samtools.util.BlockCompressedInputStream; +import htsjdk.samtools.util.GZIIndex; import htsjdk.samtools.util.IOUtil; +import java.io.BufferedInputStream; import java.io.File; import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; import java.nio.file.Path; import java.util.HashSet; import java.util.Set; @@ -118,18 +125,49 @@ public static ReferenceSequenceFile getReferenceSequenceFile(final Path path, fi // this should thrown an exception if the fasta file is not supported getFastaExtension(path); // 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); + if (truncateNamesAtWhitespace && preferIndexed && canCreateIndexedFastaReader(path)) { + // TODO: change for IOUtils.isBlockCompressed (https://github.com/samtools/htsjdk/issues/1130) + try (final InputStream stream = new BufferedInputStream(Files.newInputStream(path))) { + return (BlockCompressedInputStream.isValidFile(stream)) ? + new BlockCompressedIndexedFastaSequenceFile(path) : new IndexedFastaSequenceFile(path); + } catch (final IOException e) { + throw new SAMException("Error opening FASTA: " + path, e); } } else { return new FastaSequenceFile(path, truncateNamesAtWhitespace); } } + /** + * Checks if the provided FASTA file can be open as indexed. + * + *

For a FASTA file to be indexed, it requires to have: + *

+ * + * @param fastaFile the reference sequence file path. + * @return {@code true} if the file can be open as indexed; {@code false} otherwise. + */ + public static boolean canCreateIndexedFastaReader(final Path fastaFile) { + // this should thrown an exception if the fasta file is not supported + getFastaExtension(fastaFile); + + // both the FASTA file should exists and the .fai index should exist + if (Files.exists(fastaFile) && Files.exists(getFastaIndexFileName(fastaFile))) { + // open the file for checking for block-compressed input + try (final InputStream stream = new BufferedInputStream(Files.newInputStream(fastaFile))) { + // if it is bgzip, it requires the .gzi index + return !BlockCompressedInputStream.isValidFile(stream) || + Files.exists(GZIIndex.resolveIndexNameForBgzipFile(fastaFile)); + } catch (IOException e) { + return false; + } + } + return false; + } + /** * Returns the default dictionary name for a FASTA file. * diff --git a/src/test/java/htsjdk/samtools/reference/IndexedFastaSequenceFileTest.java b/src/test/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFileTest.java similarity index 85% rename from src/test/java/htsjdk/samtools/reference/IndexedFastaSequenceFileTest.java rename to src/test/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFileTest.java index d352a03312..be01a315c6 100644 --- a/src/test/java/htsjdk/samtools/reference/IndexedFastaSequenceFileTest.java +++ b/src/test/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFileTest.java @@ -38,9 +38,10 @@ /** * Test the indexed fasta sequence file reader. */ -public class IndexedFastaSequenceFileTest extends HtsjdkTest { +public class AbstractIndexedFastaSequenceFileTest extends HtsjdkTest { 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_BGZ = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.trimmed.fasta.gz"); private static File SEQUENCE_FILE_NODICT = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.trimmed.nodict.fasta"); private final String firstBasesOfChrM = "GATCACAGGTCTATCACCCT"; @@ -56,7 +57,8 @@ public Object[][] provideSequenceFile() throws FileNotFoundException { { new IndexedFastaSequenceFile(SEQUENCE_FILE) }, { new IndexedFastaSequenceFile(SEQUENCE_FILE_NODICT) }, { new IndexedFastaSequenceFile(SEQUENCE_FILE.toPath()) }, - { new IndexedFastaSequenceFile(SEQUENCE_FILE_NODICT.toPath()) }}; + { new IndexedFastaSequenceFile(SEQUENCE_FILE_NODICT.toPath()) }, + { new BlockCompressedIndexedFastaSequenceFile(SEQUENCE_FILE_BGZ.toPath())}}; } @DataProvider(name="comparative") @@ -69,11 +71,20 @@ public Object[][] provideOriginalAndNewReaders() throws FileNotFoundException { 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()) },}; + new IndexedFastaSequenceFile(SEQUENCE_FILE.toPath()) }, + new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile( + SEQUENCE_FILE_BGZ), + new BlockCompressedIndexedFastaSequenceFile( + SEQUENCE_FILE_BGZ.toPath())}, + new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile( + SEQUENCE_FILE_BGZ, true), + new BlockCompressedIndexedFastaSequenceFile( + SEQUENCE_FILE_BGZ.toPath())} + }; } @Test(dataProvider="homosapiens") - public void testOpenFile(IndexedFastaSequenceFile sequenceFile) { + public void testOpenFile(AbstractIndexedFastaSequenceFile sequenceFile) { long startTime = System.currentTimeMillis(); Assert.assertNotNull(sequenceFile); long endTime = System.currentTimeMillis(); @@ -83,7 +94,7 @@ public void testOpenFile(IndexedFastaSequenceFile sequenceFile) { } @Test(dataProvider="homosapiens") - public void testFirstSequence(IndexedFastaSequenceFile sequenceFile) { + public void testFirstSequence(AbstractIndexedFastaSequenceFile sequenceFile) { long startTime = System.currentTimeMillis(); ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chrM",1,firstBasesOfChrM.length()); long endTime = System.currentTimeMillis(); @@ -98,7 +109,7 @@ public void testFirstSequence(IndexedFastaSequenceFile sequenceFile) { } @Test(dataProvider="homosapiens") - public void testFirstSequenceExtended(IndexedFastaSequenceFile sequenceFile) { + public void testFirstSequenceExtended(AbstractIndexedFastaSequenceFile sequenceFile) { long startTime = System.currentTimeMillis(); ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chrM",1,extendedBasesOfChrM.length()); long endTime = System.currentTimeMillis(); @@ -113,7 +124,7 @@ public void testFirstSequenceExtended(IndexedFastaSequenceFile sequenceFile) { } @Test(dataProvider="homosapiens") - public void testReadStartingInCenterOfFirstLine(IndexedFastaSequenceFile sequenceFile) { + public void testReadStartingInCenterOfFirstLine(AbstractIndexedFastaSequenceFile sequenceFile) { final int bytesToChopOff = 5; String truncated = extendedBasesOfChrM.substring(bytesToChopOff); @@ -133,7 +144,7 @@ public void testReadStartingInCenterOfFirstLine(IndexedFastaSequenceFile sequenc } @Test(dataProvider="homosapiens") - public void testReadStartingInCenterOfMiddleLine(IndexedFastaSequenceFile sequenceFile) { + public void testReadStartingInCenterOfMiddleLine(AbstractIndexedFastaSequenceFile sequenceFile) { final int bytesToChopOff = 120; String truncated = extendedBasesOfChrM.substring(bytesToChopOff); @@ -153,7 +164,7 @@ public void testReadStartingInCenterOfMiddleLine(IndexedFastaSequenceFile sequen } @Test(dataProvider="comparative") - public void testFirstCompleteContigRead(ReferenceSequenceFile originalSequenceFile, IndexedFastaSequenceFile sequenceFile) { + public void testFirstCompleteContigRead(ReferenceSequenceFile originalSequenceFile, AbstractIndexedFastaSequenceFile sequenceFile) { ReferenceSequence expectedSequence = originalSequenceFile.nextSequence(); long startTime = System.currentTimeMillis(); @@ -171,7 +182,7 @@ public void testFirstCompleteContigRead(ReferenceSequenceFile originalSequenceFi } @Test(dataProvider="homosapiens",expectedExceptions=SAMException.class) - public void testReadThroughEndOfContig(IndexedFastaSequenceFile sequenceFile) { + public void testReadThroughEndOfContig(AbstractIndexedFastaSequenceFile sequenceFile) { long startTime = System.currentTimeMillis(); try { sequenceFile.getSubsequenceAt("chrM",16500,16600); @@ -186,7 +197,7 @@ public void testReadThroughEndOfContig(IndexedFastaSequenceFile sequenceFile) { } @Test(dataProvider="homosapiens",expectedExceptions=SAMException.class) - public void testReadPastEndOfContig(IndexedFastaSequenceFile sequenceFile) { + public void testReadPastEndOfContig(AbstractIndexedFastaSequenceFile sequenceFile) { long startTime = System.currentTimeMillis(); try { sequenceFile.getSubsequenceAt("chrM",16800,16900); @@ -201,7 +212,7 @@ public void testReadPastEndOfContig(IndexedFastaSequenceFile sequenceFile) { } @Test(dataProvider="comparative") - public void testLastCompleteContigRead(ReferenceSequenceFile originalSequenceFile, IndexedFastaSequenceFile sequenceFile) { + public void testLastCompleteContigRead(ReferenceSequenceFile originalSequenceFile, AbstractIndexedFastaSequenceFile sequenceFile) { ReferenceSequence expectedSequence = originalSequenceFile.nextSequence(); while( !expectedSequence.getName().equals("chr20") ) expectedSequence = originalSequenceFile.nextSequence(); @@ -222,7 +233,7 @@ public void testLastCompleteContigRead(ReferenceSequenceFile originalSequenceFil @Test(dataProvider="homosapiens") - public void testLastOfChr20(IndexedFastaSequenceFile sequenceFile) { + public void testLastOfChr20(AbstractIndexedFastaSequenceFile sequenceFile) { long startTime = System.currentTimeMillis(); ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chr20", CHR20_LENGTH - lastBasesOfChr20.length()+1, @@ -239,7 +250,7 @@ public void testLastOfChr20(IndexedFastaSequenceFile sequenceFile) { } @Test(dataProvider="comparative") - public void testFirstElementOfIterator(ReferenceSequenceFile originalSequenceFile,IndexedFastaSequenceFile sequenceFile) { + public void testFirstElementOfIterator(ReferenceSequenceFile originalSequenceFile, AbstractIndexedFastaSequenceFile sequenceFile) { ReferenceSequence expectedSequence = originalSequenceFile.nextSequence(); long startTime = System.currentTimeMillis(); @@ -257,7 +268,7 @@ public void testFirstElementOfIterator(ReferenceSequenceFile originalSequenceFil } @Test(dataProvider="comparative") - public void testNextElementOfIterator(ReferenceSequenceFile originalSequenceFile, IndexedFastaSequenceFile sequenceFile) { + public void testNextElementOfIterator(ReferenceSequenceFile originalSequenceFile, AbstractIndexedFastaSequenceFile sequenceFile) { // Skip past the first one and load the second one. originalSequenceFile.nextSequence(); ReferenceSequence expectedSequence = originalSequenceFile.nextSequence(); @@ -279,7 +290,7 @@ public void testNextElementOfIterator(ReferenceSequenceFile originalSequenceFile } @Test(dataProvider="comparative") - public void testReset(ReferenceSequenceFile originalSequenceFile, IndexedFastaSequenceFile sequenceFile) { + public void testReset(ReferenceSequenceFile originalSequenceFile, AbstractIndexedFastaSequenceFile sequenceFile) { // Skip past the first one and load the second one. ReferenceSequence expectedSequence = originalSequenceFile.nextSequence(); @@ -306,4 +317,14 @@ public void testMissingFile() throws Exception { new IndexedFastaSequenceFile(new File(TEST_DATA_DIR, "non-existent.fasta")); Assert.fail("FileNotFoundException should have been thrown"); } + + @Test(expectedExceptions = SAMException.class) + public void testBadInputForIndexedFastaSequenceFile() throws Exception { + new IndexedFastaSequenceFile(SEQUENCE_FILE_BGZ); + } + + @Test(expectedExceptions = SAMException.class) + public void testBadInputForBlockCompressedIndexedFastaSequenceFile() throws Exception { + new BlockCompressedIndexedFastaSequenceFile(SEQUENCE_FILE.toPath()); + } } diff --git a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileFactoryTests.java b/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileFactoryTests.java index 5d827f8904..56921750f6 100644 --- a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileFactoryTests.java +++ b/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileFactoryTests.java @@ -12,6 +12,7 @@ */ public class ReferenceSequenceFileFactoryTests extends HtsjdkTest { public static final File hg18 = new File("src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta"); + public static final File hg18bgzip = new File("src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta.gz"); @Test public void testPositivePath() { final ReferenceSequenceFile f = ReferenceSequenceFileFactory.getReferenceSequenceFile(hg18); @@ -38,6 +39,26 @@ public class ReferenceSequenceFileFactoryTests extends HtsjdkTest { Assert.assertTrue(f instanceof IndexedFastaSequenceFile, "Got non-indexed reader by default."); } + @Test public void testBlockCompressedIndexed() { + final ReferenceSequenceFile f = ReferenceSequenceFileFactory.getReferenceSequenceFile(hg18bgzip, true); + Assert.assertTrue(f instanceof BlockCompressedIndexedFastaSequenceFile); + } + + @DataProvider + public Object[][] canCreateIndexedFastaParams() { + return new Object[][] { + {hg18, true}, + {hg18bgzip, true}, + {new File("src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta"), false}, + {new File("src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta.gz"), false}, + {new File("src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nogzindex.fasta.gz"), false} + }; + } + + @Test(dataProvider = "canCreateIndexedFastaParams") + public void testCanCreateIndexedFastaReader(final File path, final boolean indexed) { + Assert.assertEquals(ReferenceSequenceFileFactory.canCreateIndexedFastaReader(path.toPath()), indexed); + } @DataProvider public Object[][] fastaNames() { diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nogzindex.fasta.gz b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nogzindex.fasta.gz new file mode 100644 index 0000000000000000000000000000000000000000..aa8ef591b0750b572d7255bfa43ba44504b9f1a7 GIT binary patch literal 335008 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¨>F(s)c;}L1L$R z&y>%s1I3=}c#v2*f$;)|%OS&r&`-YugC_(GskVK?{5&itR#wiSmP@?%H#jWa5LZ+Z z95w=sGXf5<&<+8(WbRgCzi2B!9@!!5Y&$%Zu7j-_QHjg}i)5mu=(-x@J3ezfK7l&V zAa81*Db8X$xa^VO#nN^)^=^1gD~cgR2XXK7=-4Jed{BMtMMn$umO*h(hczf9h6=~k zD$5#2kBhD7%P@4NPR2*d$y~E5Md%$4n2es`m?Z= zQeT-y!zSwh7OW9mX-e|APHkr<1^pla1`_PdLb%6VE!YDw?6HynKB0*=Y@*6pMH=Hs zy!YhBecM$aiQmGKk`mc6mYQi4R+j7;nuioCudNlac{6 zk=7wiI6y>tC_##)F<5j~veGGw`R~YLZL&%qh8tKfl0F|0X48lG^SZN9_)P%|!s^?{ zGE}nBHB(74CCg75anwR3^{>pj5eH`4(dn)-#?V5YWKs6G3?*Np{5Iw!;zH zvy%w9d$Ijf%~nM|^)3iJvLl*O>15eJvJEC|a^Q_b#H)kc^~#Tl^d z`vATn3G(w7y(H|a0dx)voJom2k`UTf+lX8*oUa`WmVCaL_hfg8W*g;tTH7@Bv=)2$ zSe5ukX+GSYUS93{QoRDRP#+a)=mGG|x7E!PNil}6Dm6wy~gP`G1vdK#)9kdFv`XAyd zGckV4lu`XODd@WI zYz_O|>}_Y2+eLq85vV=j_Tv(HdX&OW`p?|iTbR}(7UZL12h9hq+MUawnQqH6tLzE& zq4#P2f78^XDZvhlQ!p|P)2SBA(qOs@U<$4q>f4mQ^N{dG#+dNcdP0N~O!o9Ji_C#l zSW>URr^hgAKXy_a0EaA)ppbDPYa_{62aYf_$Ky_;sAmgdm_Mn}R7{GB49!4l0oPlV z_|^h?9r<8%w#@Vk{@m34wW;x*Md(5y_B4xEiuK;hhZ9$UF?oRBJWfWLz$7#wr^&tC z&tA^3Izr~${zwDU>^xgLLxuj*-3^2pj4at8mPgI#M4gecG;)pT`$_s0VA@Lf$0@~D zF%~J{MwmpF?!p)}%1p9Egr+Bk0zO5MOOm_{^pql$laijXm{0EW29=1w3~*V4k|3+Q z1mj$2T?Q~D>S)rGe#jHx9l{4qCDCHfg%9+as8%<9GbmkD@Qsyg&RnCrUdV6AA6DW{ zGu2NE9wYZCTMAJFo@qD>F#SCxE1L5VW{?>O0}Ez2KSS9*vCdTV!4&MqJzXkHU^N69 zxJaGX$}f}egf27b@&jiBe7Z7&JyWT)pX3$6yqcQy#?4)R~x$4xOpacVmJOpHD z;@mtZ)DH^~YgHr01dU|uWW3_}l1>%tczHH_NbFXSU!s{zg$Cb@l4;3@f0IQmsc9@PhdA&zm>82n zFUx^KHAPr{lZd+frNJ<J&?I!OVO!n{pnoqy66XBiYY`smTZE=cf zDfKT|Bb-{23$0XD(V@8FzE0!3OGz0GGE_cQg=3p@r&)@9Q{<0ZRRq**<8%Aelu#5Q zAim;Ri+4V0N0p6rn^(4awBU+BBAK07m6Y@P-vFW?9yJUChDYEIM$1lGclJPRHtAH> zRO!`_{r8Ycquud2sG$QYmULa&$*5T@>J>M;Z{8_YqOy{trDOtyD(|A{rIH<6=-Tqc zuf3{gjK+Fb_P4A_vNKcJFHE^wO<`b4dCW0vD|69W^U4PdCgX4RO}df~<7hllDaAd} zaHbtSS#|)X-W~DJZ2_(-s?t)KAr_#--0{4!^_d03*V1$=&nuGogUw@Le?&3{GUbcSdq*<; zk08d7D`S}QuOKF3pf{WM$Ma{(iv@VIc}bm(C*Ee%y6`k?fWYM$9|2}n zX6e)Jn*9LKhvC5Lm1gHYjWYCIR~mLdj3X#G&ZE%O8CH7<08c%NODgMCJ4Wk9EF}G( z?Y`a8I&-ffW**ugsNF9}0Lz?9MBg)LRMkjwX(R{nYc*p!qo6Uc&mn^jL^n&d9lVckLaQVCv z#?@`ZS7!*=N|T;p$n1i``ae|*&~kRWv#Fex=*o}!s@k>F{zZw+O;eB`U`+nXz++K%*ASG$KlFbAmju4t|FDVCd2c})aM<|gzrUS(lJ;8GAny;&ewEE3-{DqflD6ZA&RdeG3>EQh(I zUvi!)oVf2hE2yrcyUs!nc+rN+`YL9~?K~3ZY1Ga>HdjB!u-&hx&d|&Am~{-P1vE{L z{mP9Jp0;OpRKy#V^#DdGrRqR4J>$DbO9r}m%C^OjfZgY^=y(G9E0Hm7?cnsbqnJ~@ zCwUq0H9 zLNG+Q0TeT82a`2!^?FqsiLq(jaI_2+F-3ec*4e^}eW95?{mj?_4p%CKH{zVrD^4B>86QcBDFsigctFV&mD$y04l2 zMyI6kDTki1pCv!0S8!Nb5M&Dq#*n;Qi5cy~i;z-R%a)+|4-$F4l_4W3+Hxw}6V-PB zA)tiVQ?fMY!L9(5^rRLWBzK*9C zPCge{(ErbD%C)FlO z^{i1USW;N9*7FY;8FVE@W_+m=NBs=>GmoM?3po1hDJYFywfbWjQr^hvrqu8{qS2#1 zMLNBoY-x!`lFA~xT@x$I)CKSCEs3?c*1 z;!X-V-em~Vy2mp?2(pej8tKr7f=bxz)F;BP4+*}J9RWDqOwL^AF{c4lR@)emjBKDd zdP+RyqW}g|!4G!{lsCo^mBw>WlxuX357VB=;gWPzZaGvs$12sXMv~>m1HW1ZXdpaf*gW4!g4y%Imemd!*%?)*}fOD0{I={v^1QQ(kI7%4| z?&PU6PnF60VYC?-vrY%=otM}&+Ft1e2pR*6V55cj!ph|ok>ZN zO#fME@{3`5v`a}am802-tFBVjsx=9r+d}@HHI<7{BAh#X(NG;wV-7!vmqE z>F+rVilJD#r37Oav|lQwg93>VcLO zxiLh8uT(Q^QgKRj{F${h3r$iP%A2S;oLSgt@t#p@2J!;61|QY}i%2akL6#5>tfHjmEbc*{-4~ z^>%2*GBlaF;)pc4qGE=rs1`Do-vFpAm!sCTUI*1?acBrLmEze}a6T#G*_{Nj6Zurh z_$a5k2l&3dtMBpK-L zHL9dAF{-Ch)8xjgxmfp)VT}{rSwuugd&To^u6(vCg-A5avI;7DV{(MULaL+9ox1zgB~Z?jJG?@#$gS zVd$zqE;S)KDz<9kr_@p1g0WdNQ}2wq4@bup-cYx6T#*^`bcVXZsSs*y!?jK5Pud|{ zs!)p~Nt=p+OP!yY4iAr(rmY#d!;n=tRxrtW9v-Eh;=X7NW#bvZ)DHh6O?RYC4|SKs zz_Ppm*KSdUA7QkVuJ5GFY138{pwCsx6&5;Y zwU%V=eOOA)PD*vzw#|^wj`ii~&ZAI-c0idI-B%_;$#Gp(tUaE#eOLnftr?nT*S1UA z>UPyPMK+)NDoMigguE+5To_Vvug_-zm$J%E6q*N3=ox+igo*t269NkxeB#n=KTGNc zm8_!;Me;^v$PgPcporX)T&wcnRhu0p#dq=ikj5i3I54fjeWZ+J?utCJ!c-EvDHuxA zBM~e09&5CyA-H^e5UfeoM4HlS+OCtRYqI?2OH~ukyO#8p)D2k;si$TwHKoyq#x`z8 zpW}>W@h53;3T$3xx^RzoCf~Q3;8suiefEmPt6G*8-4`W?F3*hRiR-9ojc&C$6-hA& zMD&%qm2c5kN*5zp1y}T}bN;aNU1(?$sZhezZs#{24B4=ltb#i=WWkiB@3K?jm%^cn zOtcjEAcCm!cO~inR5PI-N@a*{rt-|+%jdQTNVLL?UUnO@(_&R~qb}!Cj>aVl7o~>g zKqrS5yl_*^@55)xvfa7EFO2@Ja^~~1lmWo(+Xx4|atyXvhC8%M&mt^P@a%?a?bpv# zvg<+?^%!HVKMH+dky0Mpf8>%8+m!X>k~6X7|3EJ?hl^|`bIBu*o!_bC{1(Tapgc@h z=`TufEgjnY0x#B|^4K2q%P)Cs3@n9X9a0)3VJyohObL6TD2tK@fpW3|81W*`w8b#`Vig=qx#h-{9_%cbr?zNBt72U*|$0N8dSVquegOMk#M*^r2L&K zzZzi$v^Ac=@(QJN_w{ybO?S(QkZfig+7Jf#o#-x&nVaUcwwm2`krWw& zR8S;4K`@iB{;j%}n9V-=Mll!oa>UEE8vf%2RECx#I@2?HZ9WB<+MU!RBl|=AyT7ws z>ho@h6&?kDC3BE>e5oI3m%L^CxTHr>UT~*k?@A&DZ{sMn3?$+ueO&pL1H|99#XBV= zO4piK>AGt`)VGr#GziGHxk*KkC~1V~BZLn7b4A4!PSqfsLK-u}kR#@0KcQGO)-y16 z{n`1L<#iMGvq@B=xCoHQl@zN3n#RIoceSTWwfn*ar^0ZzB)Dk$VJm}rc&2uxyjVdV z2_ey+uzz7CJkbif=5#%dYcM(*4mBRFV-EVqRMlpIneYsp$^PHd0Y-_ z^TyPe)nhqZE@0yA+{ky9LY{2ovNoDA% z5nzdWuv?x~AW+iLphUm{?rnM1;V&p7%^apccO0sE0%Sk60Q56RT`6g{R7(W@ zL*#ZPVUcGX6-di9)t*E&kg=18q?qtN+qP;xd1Q@sikQudiWHLNmg#OJUD9i2IqeiG zHIruZq3dLDq~aPA3qPw&c{x~`QAI)|w-7>#`fGZ#%nkQt<7zG-0%~7cuHDPZ3!X-- zQ8|HK01iq#iAeyYWs>Yc*m-hd{6ekiVuRC8q5<678Cnhfx&h(LYC|FH6R40=Oev zK;O0i2vVYk0yt9fGEYG&t!svjo)W6p1tfgaUkAqX=zhHQ*E?JYts#~g!K}RQDhEc2 zL)Pf24MfArFj?Ro=W^8jB~)BJ+Hig%CnQ z@BCF1{)cGi=hODe|HQoz83zshhP^0N-~Vb7ERJF%=k6R6)myAJ%gzGbELbV;b1I{t zK0PiowV-PL9b1HkWe8Oc1Ex7MV4~(*(KTJDxMvU}>TY^UUgL+#gE|t;VF#-?OV3Ig z6tvNNEM{XV5|)OxvCBYD0Q=r4HQ$@VkhCBcQ{dAY4H{cowW`^-fb`Dv1JJurK#*Y< z@}i83t4|6fMZ4^xM>ZOPt0{UK<-?pB_7YQt$|y3Jnn21OiX|ie>mk>$oq9yQT|zEb zOM|#QhINI>-?Ai9J6L)4X*)GoKA*uu%aw&&SuuO?vm|w{OjW=D+Id13kKL*USDX{i zeV;^%3$4n_ua;ExeQ=ViX5MmH1QNL{2@=IFj`A%KQ1^f}Ll|Ss{28E*w{fTEZRTtE zyJ968B2992=7S&vpJ!N>qSsnk;RvCZKq&?&LjEEAte!`C?obwIan@9&p!w~}AY~x+jZe}m`T@^7?<}tG`x59QR z_`+PRyfL*`WN7>81@pNN5%Ed8(S=A+VU|HC6o z=Q<*PON*F$Z;g@$3Kl3vh=>~Y9Lg)w-nN0(jK(X64VY!4)+ zN=JA-Q#VpzdkQOX2GT#!c$ia7ag(hLgLf%XxGA)0N>xe5?*zZ(r^8f&nt;a@55LI| zATlaS2eNEZ(@J81l>U|!D0vmw+WUYt71jZC9;hfE29qG2D03y)06MJtrTC6xi%E_W zTObuJdbeAOz~X>Al^~`g^{x3f17I1=!(4m!dq@JLFDyv>0zlt7 z{foFEGM9JZ;xWMAC1tO|#S#khFq^~RUlEB5ozgb7c_tf_szsyBS8ZFCwv8;b;v8H^ zm)_+a-bDgDijVEMq%Bh{sYk)8E4Hs77MSiO3^%A zcXD(GUg6Ry#%NjzK#Urg{;B%aB7m;8dcf@b)oLN)EU@8KK%;w-> zNrb3;zbe$NM}mdjzSAL4d|;(!%Vm6JXZ_1&4k*qV7kVY4%cVxe&!xpTswGchjUcJK znMH$tz6X<3WN3go4el|u$*HuA@3}gsBs%%ibVuRlQA0uHsgJ8tohp}tu?&>Eh#A^r z-|gvQVHR6*oGndhCEcRwMG{#8hb`ykK1AVxLTe^l`@4%MIcEe$JSx_^ovEofyeowQ zVN)`rV;?t{`Q;Kjz-|>NyhPgYpCv&;=j*-_v`xWUo#f7*_xzDtLa#gFCTS(^KhcFq0>bj+IdiIsn>5Y1#JloFH~-yavO+ zp(<}4_t4U;0&1&F#qMNOA%~M-D@Nb2_Q_*wP4ii`GM8rnIh8hufQE4L{Dv|0hxxzp zSqeGPFI;xnl&fTTQ^Zisw{Pmi^gyXR55EA6=j^h4G<&p!(mGT*B!Jx%K$I(&mYNJ7 zyNubq6DVfsqNo>Jhz~b+`ooN;6xRKANsL}q57gu`qYn*Y<)-<&58r-YX@d^IDerH@ zR<7)Imu?>qU)v*Qgl@|}St;!2VAa}{kIQVSmv(#OND`>N5<~*7A$+`&KTQe^TSvD$ zGzJ1z++^zZ!ejmh>8opQ>|h-OO<`P@|Dk{*{=!KaUbb-iHn$dwi zoYyWZY*;0!yN?%lfx%~p;MMFAT$3o@v^hJep1BuB#KfdIB;1$h!IwlFh7k^f`2?Fd z37@FjWG-&U*~Bxn70qIw%Idm|sw&|e6G#*mJWs}=JD|DT7B?xSI3XGqEPgZf?WbHp z1fk5VauR7m^#_pNX@T;8;(9`+0RI30ABzYC000000RIL6LPG)o=uwrOO_t;=&u#n6 zibaD7Faeeuo&fV-H_+a~j?Ap*dv8`%R{liT7=v_lbR^F?=epKC*XQH@{F`fD*ER2Q z?H}zg=k@vNwd#nE&Y#+9+aI5w);ek%{quv`KVSFHZ_D`nrgvUdd;9$Q^G*Hy=JVBP zah%Uv_ZRyRpLfNvK5zZ}pnP6FczfN)+lOfTy`LZKPor~^TH`$}4*L1m_DlAg`)53D z#M^rOy6#i&W9{$j@L>B*pR>ey>mK?Z_Gd6-A9!ER=gfP=ZN$*`)x}Fcuj%{DwKC*A zoX;={W7*@56UHDL1KDr>9B}Nj)c9?WPrU#0+Y+xGF|Iu$E#_dqG5*9)#~xa5akcwA z9OZM2@|m^xdcCXO0cxsSqZf9AHA7<}JLYQ)I)CGA(l4D1VGkb6@1>0@A( znHir6>oLM5_*IW8$jv;7m zTM>Tud{t(Tr9NB^Jyud>@5i03-u&DhH8$zKNuL!~F&2CbmUnE5eZ0NMuq}J>$Gb5~ zds+43F5(UQ2O^Rs`>)9JFW8Wui@MzqPSYUhd8?Hp#fZ_lA zsB~^8egKc*d|~MO_AJeXqDhW>@%dbMaa_>;L9dUgsrtaUK;7UmjeD+2*guS;UJg4M z$L>tSp1W|I$GeQUxy5zkU^`PDGZjWPRz5e#^^f(7L6o>P`sJQBIW}SZbcA=U%yehy z;Ys!oOPud>AvjGgEpB;z8S=8dJ{mBl4+N8=I} z-!H$7%@&hb)|E?VzbTeu?9AAmtp8ZdOwInl#?%1o+dMQtHjov^5MZH&pU`@QZ^iQQ z#YVk2Y(e!9LJ+1jqLhXkAWXp>#W!(g-1B~`VGU-mkM!$chQJD8gd@5E^+uEgzzJ6? z9tU8L7|((3RkReqqV(D|uQ-GX>WKINe;2b5Ha+ZbV5c6hDa=e9$hiot6yP5ilddA+ zRK*ByG*pRc_)W}K>p9mrI;JEhadfdgVNR(8EIBz0vKdLH*U&ZlzAl#EUNYbfu*1kE z<`5jhyfFKSLt#!d;C%ObCR3iG8 zal4za5{SlL?m%fz%9iy?Lo3&oUl*;KDTaX(~pN5XqDH& z^AtR3vOWtp>_5JbHE4hzN9z0!0t_(U2#>T~W3#1~i#U-)@bY{`vaE0O!Y`d|RC z3Z5eO>u}heprM4B8^>72t!^?FPH!Xl;N0<&Fv1&qLMRL)y}149A^6-fxQx@*4DxEk zl9k{qe8wRB9IV7K4n?)^CuYxZV+3Rt4o5iGG{kW@;-{F4Fp2wkEO3_argy?8^bCoI z3o9}EAfz;&t|N)9@B_tjz|U|A@x~p82;2EO*en z^L&*s7+R1yWe#Gc;-7n3fUq!m;~TrEXPnv39gO|9r=>8z7?Rir$B4*2zh zu*kj%378JTJIF0o&~eTqJ>ouAsWNkw^T?NQS;U-S7FhaSIx>*Y1~jo!xa)lT~ z$2tZO1~?&dZ!c2ftO9+^>u%TQ@?)q4mzDG?OuW9P>n2)Sr|#OrQ?bGvXdqR??D!cg zKJMdyay#rOo2ev;O=#{*w6*D1W7R@W4=x)JSOU?3@%nI*;3LLE#qDe2$Z-+Pc_?fZ zJRLkqGUAvBxQTFh&&w*bL-C%3*RIV)08L&yd?Kr{x^6$?i(qzbFBu>ABzUb-^C&-vrCBgR2$cRKT$a~maPC@A8I#~s&iGvp$Ok9_r9AZSuKxp}aGnIuwIYef03TqwTf`)m*_Z^!C$x*HV+*e+@5x3yx znJ~d^%oBHPqoEiD^w1du#K@Va>-xH35fbmXb`|c}`-YJ*xN@Ofm&QCuul4>Yudi}F+eqTvV3&a_?NAmGvm9Lb z9`?_5$6GI!-8{=K;*GV=vMWJ6e6Kne-MxN{=`6a4fId^cZcm0xxL4{|W>zC^aIm*pllN2+s8+g)ZjFK=7Kc zK#-hJc~e7Vg(d_~4CKxQ|D6WwCxSL$S-llKjXE9p3Yc89E%z zI%G|m?q4FpnrOaZ?0e!E`1BF!*^#VCdC26E^hR&TT;l}Ey9C|@DKu!8!r=kI^~E|s z1DOjQ94y(MCVgKzSsk26Yo>4f;YiOvz%1c}O>XTZNcdw(d2&+{6#Hbv21dc;lqKjR zlq*$G5so!p4Ywo9k(ujyoM%9;X3o9B@jJhu0OFm<@qqut&_j3us0msg%nB&40QoLG z#9;@1I&Q=Xq&BBd;98StVj#qZhG8OUQ}s26@;ON{E&wiYBlk>oLtudpNp$lpAhg~i zOfdgu`mZNH7)YVN>;q{i@xgw5$xtnGae;y!;BP2R>`0nAlhuLr#kZe>VClm0Cu{tl zmZ6YFc+$mF2Kx`YU}gYofj z{9=q5XyAmj3-`+|tfY%y+z>8!ne+}X{)GeHFd#;_-@NTk>V;f%0?k-``Q$+^9*K|na z_ermZfrZ~8IE)msZbi2lo_Q!8X(n|t-`t=Slm8z&x)J+d2w4vq(s>y?4W6tfoZOJ1 z3`1nWVMBG0ShAbZ9_pHK4i&~}2j4`;B>CkvYs!`gcqN~uKBQMS699R4$Cd7{49D2t$_d=K&+^u1%_CrEk6#^ni)|0_(Hj$(d=DdkH0 zP!-bjni4k%E0;xt&FYsRZ+pbgNB2_&bBb{Ih6JEgPgCDUj8k9~hYO37!FKhL%dn;b zFcui;$&KO)*zjO!aBPx1F18`JRQo-dH||OiZbSkhNRROEPR~Mup(tXZTiADndsZ}A zYZ)V53+J9p=j$J*PsJBVAGQ}_lg%BnE7c`z8Lv_{twa2LB07(TPS$c`7xkYRM{^nMi7>Cel2W)aVR2>Yjw0^sDjhXc^ho6bkLUWKF@B zyS>R{!=MIw1?c1fB2FRQTqLsVQR69<>Vou|Ax-xMZOC@+FhNmhV(R4MPi9$qxSp&L zGAd24R4K%rHa2v&?cns2sFJ$6@!dr&#`?>7rv_7%#C$ZEc<=IG?mJ!UqrqHX{<};U z!QX3BFvOEoBoOF<}Iv=6Z&aq#?U;a-@TR)U1Y=*N^{KizbrL4-rT+Vt zimKSUC5Zz37MQPjoC*`T6wzkRV@egOIV{w8%2&v+o?M5!DmmQb{uWf2 z`=I=-KzMJ217g?DT~Lk`8FuI;N%{t{_gZJ)r0$^n)<&@hjv6^aJ@iN~)+zV%ykBv_ z3&Rr0{Kl|>Vq=dKVeF$uzFz+b0dfkFvR5Ja7G}(|h`wYK_;hxr)`S2kW8*!}@KwNK z^c3G>>4exXYXYQR`!1AcBIjdE{xly)fOY4|OU9ri9C#V#D;zK8V?OX-z!H~H4r8|v zNG_F^T}iZim;8usZGg8!?!@}Ujn?jV8@d$^gIgU68Qkz&*IUgzlVF6-Itdw^I!;*< ziQ|UH=pQK!&n|thfPX)U=YmW1QQY~?m{9YnjKmUjg*ApAwCn%#T=J2_xwz=n( z{v}p+xR-S{R=JMG|9Uk3e@BPwxE6!Ma)E2F8`%7pZ<$I~UlM<)+`{=Jn&*qlz1&;> zq4Y0sH`54ly@dY%{%Fo48rQ!xlkDgpy!eT+kvsi6%>G>~@zX$+FUjPY%Ip4TwZtpT zE-%UCdU@%Wyz^Zzai4mLy$8!zw7ninrAF#CnJ+u#-;Xh9y(+heWOF?v#r+<2F2ldF zM&D!=J6pnNz8IJJm7FYSXTLH=zoM^qu4}!5uku7+Zk`v@c2Y*K=G8@pR9t5(zk#B1Xx+@C zA1-bNxWBlY_wRw6&G0pjAc|i(wKY#k(gRu7*$OZD@E*(2GQWg^Kj>h^-oHqv>6ZK@ z6#PR#Jl{@-T~JP%DE9M%R^J~|&-)*hBqaAiLx(EKC?h}c>nWxiau+oH_D>?!6Og?P4&upyM8aMQf%!aL|RGp z#zMzLee*43Ij^@Cq1>kHU)%j9jQFLD__8`>{ge5TSq+}*ek|bq*qrk4PfHXRg9Bh= zbec&c6;vaYS368Fu}s8{QYK?FZWUA}oCAewgUnVDt|3<^4w0QfiUr}&aVuuLOj8Dd z2nQ9aw655)qo$IwP}MHS*ol2=|F~H9b9kbt(YU7j`j#3dF0g)hL0n@!!#XbGmiy9l zEwu|6q@{(h1SDK6$4O%`Z(*B1mSCl|PGdC6mS*Bi~vZ>t-xELpVqPQnrVtuG7$+bWWqV2?6^`eA(^ zrr;#yPlo=LsQ*kJeycpr;=fXuk&~E2C{Mxb1LCfKgShJp#9co@+#jiu`wI+FaP&jm zUY_}z4+wYD{bI{SOUSNF#m^sWPL}VbLE039OR290%i{4O!HmabiZl?uy#dh z$RBy8WsULrMN{P{_JkonM4*XMKZzFh^}v{^pzk>J?Mh3si>Hcp+o^>tZ2seaR0rEj zZi}g=%U{krHCBrh#ZA>1+cgr??6Jb`y601jHZ7G)9~Cw&1UGUElqZH6;`;Ta7>mVv zjakK+pw79NcW}`TP%eS=m4AOh{}l#CV*M*oU5v?yQU6T6OfxID5$pwGyRzglo$%kO zm-R}$e1ZS+_Q1Dey(u^NGySqC7rO|)Wvjlt@clFW@{HsVNRfU?=$})_4W%^lN*fP> z!uaELkzSAJCWgUGe}yvNQ$Gp%FO%Jyp~?N3@F#ZJ{GR#iA7NK{lzKnXO@Gh)NqVh2 zbFp*&7xIZ6{uOTtehPN(N?CvUOOV(IilEy?+AJx`J(>exmDMt zj5UY!V~Q?}_jgdbGomKKSEx16+^EcBbHoH$WEHivlcLE@j%#jHwR1Dzu=#fyefV4s zno)Lyz_)f7mIafOT7slU<7E348FwJ+DiOw<`bIO5d?I1kC?^4JHglS&?aHWGOi3x9 z1yzPRq$Dg8$@VAG?4QtxVhX}Ov#9a9Cpk7!e@=3=_Dm;5LLgEZR$y7KSVy*-7?w7r zBL9@GQ}USAk!IfGOA@wZ>nJ0!^hSkVgEW=f35Rw1N>J(n%sv$b$_Ynm^+QE1_Kr*= zg((!!)ssqS)mkxgwPeK`r6hw!5(qP!dcRTHP$x+Kq}887gSS1)@^1yw<+!{#PrgW) z{FnJyXER4c_f|x$A7N+MU3Mj@eqif;A3>e6tk6i$lxb;wr8>SnbEYk>@>rGik{e*g z?)guD7c#GsW+k=Sm$0gttYgmA%vLf{siP^cpA9Qinx#P@QfC?0Q@=Ehkf7Ud$WJws zUM)*=Ylf3am%zKYa7$|{Y=)I0l$NzrYbRA7RER&#b}ywJ;v%#UQQ~I6YGq~TfE`s$ zv)E*>{BojO%t(+snM6NgA}gV@ee}8U zo0NJgqH2`KQ(QTepm8-ls~1ugjdnRI>@5M!reo@MEJi(SrZx7|KO$c#*5X1DqDIV9Utn09u)$J=G^Hn77M?cV)U8~(VCKehsP?!bvyBsnfdgkWFQJ2y@%GgQ!z6eN`_U%*BPDBQ*v>7hP{bxb88WsOC{pbf1l zNEisaH217VBunEd4`#x;jHI$3ysmesr*f=$e)~l26^6qf0xAEc1px~o=ajXq%^|+3 zBJ$jAWI6liw}0g%o?Pc0;jJ;_ipvK|q%LSEN%zC9bAe0HM|(GdX`` zI`@1O#)^Rlf&$X2F2VxfE@H&siGNEMw+&2+GOna5<6a;>(WUh?C@qwx9Uq&8z!WQL zg|g;&DA}vFLBIhQL3=ZWA}AY8dFOG|u8gA)tl_J0VdE%V>r>?iy6Bc%V$-w5-@eq;crl->tq~q!Ro}Mf^S5>{-soLfL`{UqW&YjAY^6;=v-PHct zMp#x6iJj2|(gG}8Eb|HiQlH2W$vVY&!~i}(!M{bPpoM`%uS-gj$2mc+i?l1+rdT=s z6kxaTRT&J?uZ))?ipuL8>CNjnNs4_H#8p<{T9uK8xMg^mmDgmtT7M$C2n-OKe&?ue zBy?6Z%qKcfP7yNI>s`5#Y-J#R4a@pTD zhpfmyFN=vXXJ!paL>=%F7c4t0%OO%HH7N0Rayh4zAjoGTvlM$RdPhNY(tOOcJjNU< zYG!LRez=gxL_@JF+Ga$7?KZuEd0V!_tHH)cKUW$Kq0evK{tbdWGGny2YczPFRl+tL zoo=vx(SQZ5+X{jd+BSgA&WjQu)UY+sr^t}dA>O-R%{QOFB{&pWan2CuGANE05k4?d zJ7Yvp-{Q<0y@PZbS7?-DJs!q@rnb$h$~Z=8Cx~ku?(a^q9+HJi|9K_Z9a@4|g#}#! zOY+V<0wo`p@8g(oV(|?%K39;YQG^5?yMyQq#5o*qjS~}pwNrMvC#*+9#YRIJ?pTsY zIp+I}VISknQE92Pk9*p^*(j3p_6O<3Z5Ya9W5%OzMaxD+mZJ3dNvmp)QYD=K$E2Yr zx$@gEOjq2JnwJraI2LSU9rm6zkG;{~v$MR#g)J3uU1SVep&x|NGfO`jeXw)P86Z<4 zwfIWfEleCb{Tn*GWYX7k5;m9Op_2xcES)4+(=2b21p;T<6DzoQ^w04|O=np0URxHs zL>ROEbM5JrFk}|4v|(rq{|0}cQ&M7I#;eYvpYoiPDz=K0X|dE{R5Q0V3x+yirrNpS zZ6l$vP^8C3xn1nbYR1pEoz}`M+A7|u3avXNFqKm(2c{Dqx~Fp4PcdfIggFI|(+ zF6*-F9~o~b*i-cBnMR=e;xN>aPC`V1Oy{C@D>SZmCLI@vyoX(fq0$i%2r{y`b!Z=@ zu28IgZs#vam-&TPo?{V+{wBJf`~nK-s~KF?cCdB8tWp!oRzj#IJvC^pREKF=``)B} zCqnvSX##OcvSz6ok566Vwbs*9E;TeNXqxQwX?as6O_KbvxWU+;5H9L&str?QogWcXcIR_pdG+l-0%`;W8p~7Bp7-f6^$ZcKbwq}B;m!fbd>~9Iy-}#yQ zoh^xo?iNR(9*g>_S7M7pLo<*i`PLKOhyNwDXd~;}%niE6>w4#I?#s&7nLY0)g)Rx2 z*6(#DnA@)=IvyD-`(+`vu00b6XC)-I%J#XnCe1Tkc8wlOeLS^zN1`>9YgL=`Waa83 z!6<(eyqsk7(fPmoOQ_|Hj3~F|mxkrP%2ihuyI9$E{iUP*5@8$-#!E(9{-vXxDV+YL zBCtAqOMleTf9d?cH7q2JLsEbgh`dCs?QRJYUv(k)?o5Y^+w+Qm#GY08-? z)S7G7RT-?48C0Y?we-jd&b}=8_?t}{N*iRyGjqAz`s1OL{l(5JtfR|C#!^)Ez#T^Q zL{Jk;by5%bSr#QO0px$*nQ@OS`eoE0PLL(a-0gmOIhlGqi2=cqK*_$gGK4<~T{(8!c^+Bt-A74rQLN)3YVmjvOZkNHEV@k<|5zJ(f7 zoyPrJr|~rk@`dI4r5JgH8pK}L$nKdZHRC!gLwo*~13p@@U#`g782;J0OpYUc(Gyvy z&6)Sx6{V29AhG+a*U?i3_(!j!IM44c*l#`HBc~Lse3f)u1$FChMcbvE^3E6~MI^5e zJ1HbZZc~H$B7AO=C;?cm?=@I}Cr4x=h`L|&)B3u-;rP6}g&a14+;zSBg+NFq2ByD( z`Gp!uX^P}E1(!C1?Mx&>sGzx6bZjB?*}p3Z%Mi0*rrD#c_K96_+tNXg_fwI3O=Wac z8)X!6OpJ13cbdEXjxb?fdOnsQQf!W-2f3|`n`z z;665iXdAQS7?Eu8k_$n?)Sx_ay$ff_eO_Q6e|KX7@W(f$ed~yoj%|zhdHzp-uyqr8 zHO<==L75(2?}1wTRz#ryQcr;d5FOPjUgM=NVc?(!LcuuQ_ShIKOzM;}E?KFb#=%jQFf~s?-;c*wDeb|L#aGj6 zEdtt^Gq1Ui!Q7%=ttmgbv}xk&xFWqGYWS4s&e)QdQh3v#!C-?GZvVaG$4oHHpz+={ z5SNVl6Sk$IcBNDvR|wZr&?$Y#kLd+Z4aBl<7fbNQ5QR)NV+*`CI!Dawb*CEJh}L~! zCT6qD${KHKIU?$veAZb_$}XLEHc71S$O5Bl;Mpd(*h1n9sdvbA4^ORizC(41%|=c< zbIg_r$Xl-4yoV45Yg(kha|5D4);3?dauOS?!ljOFUq#_v6u>yGEIOU#LjdYIuOw`@ z(bqbdaLQ5M$%l|7num3i7>O$>!tewnvI&zlxSqPhV}6ym?l;g?06W5VkQ#Mi$0>BW zI>8BZe9tr6SWT5CSpTqm;6Tl18aT2Ck?m)BaeE~S;wlM-GIvEJc=Jm=S|M0WJ^5w4 znFS|Ts*8{T*fVx<5!WAU>kqEvv6@)sIc1PGUN8*rui&~&CbFU!6cfhh=Z z2j9~)CIQ_|S*&!+ebB3>dLCvz=A($LNvy52eVqg7qP*qTv%4ZYP`>=qK|CU=>$wVI zbv6x|1mAYV+F9MF3`CWY!(ikuf**rbzZqj=RzoX92F~^4s`?yOMy0f z7{_tRc4ruNU)j%SAElf#5jwM=HToGW&%BC7czT%yDF^Q9KNmXesmH$0M$af5xEObZ zBD^U|6=vgJl32Y(a=6piw)1fh*z{{AC}3>_nnn?RWgLEsm*OI}qle+RYgqN&EBn0N|FjcLuv!OKy=+>@uW4BRCY)M>b zih}X~RD5TJ4`^Fr`NGb!>I!g%lW~(Zm)xoeV!)W=TVl7z3>A#otq*$oN;nr0x8oqw zTcx{+3VT^D?)PgpnKZLC8K*5RM7(B)Mt6$zmTn52e;PF}f-|qQqVQo};*C4KGxpA* z%jsi5x#h_n?}!dS6MK&Bd`So2c@+$ke7+%G9J!b!d#`Bb!u|82nXYjb;WaQnlVi&OfdV4zr?wFXj+HJ3s@MJH+@_ZDN*^=DiTQtQ zt1{VN7+TRRsL|jkk=V35l)?uPAg1k_iQw2{By7$mzV&kn@QAMIzb!NIOv~kMZpl7?I9<2C%;M*WlK zSArli-^+N&B?zB0v+hv#hZKaBiHk_ASZD@LkplEEru%{=T>?e@BrvbcjAk@{61Dfr zAR|qdUMxf9aCDG~Gs93Bxy&ubiUIT-XENAw+~&IMr(M5ZabeN8Lo+e-oe7lhgGccF9Q{h#YPs*` z^$@bjQ@l=5<~&@(GN;D2iRBis{17Z|FCxepE*3NiOA_I_eA=9+CMzRIA!%;4vXZ^? z-Yn(Zw-SN-&a4kB1G_>@TQISgL827LWki!G3uX%x2IdPEv0NE_t~6pRvGbMmi)`BU z+NNP|!rch@^xe~7@RkEllb%^Pef;!3U*do;3OIvxOS1=8eO9}&qZ{VC=oh#X&a5G_ z;2g5j#Ud9DXJL$yc!K*(fB-PRv5o%FRW7j+Htd?OA1 zOmwb%>*l9ssz}9%%JoK>1#;FTlwz~pS8`*)8C;q$Vr&8y&_OaTm+^jH9;D2QEon#+ z4t$zgyfSu>E??OC3`iJWnTc&M`j;@mt!#EW2W9{ztk@y&Tn?Qaz?C^8c?r~e=Q$sA z?V@6}G@Ev0vBI#@`RT7Zl+UQDZWLHVSr~#GD@A;``N*!fbjcbmpYoAKQt`WJ(1c3V zD$45f9IYSEs!fXuDaxU)B&wW7w!)=$m5xpbMXakDrx4NRCrFOsF}ER5MV8vLilS#B zU{6(;Tg}tmGXwE$dn3l22{ThM)XT zbC{MT`b&Tb?UX0nK)6u$Al-!!gJ2jI!7emU-IH@`) z+6lS!_)RE^-58L+ZjyPwVCh^j?3uPssieS&2yG?uzBPQ2M}fO37_WI029C~tYwMNV zlipKSjH39KX1P};gy7k8lAKNRugOTp>=Zom(o=z-ZYgZCP~;b|r1OB_xhRtN=5RrJ z-vuM-A?0Ze{qKzL$QmhXP!Cn@=U21YGR*|7(QKzgH1wV|OW((N_37YHZK$0EZoZ_3 zOY@ms(-15}sf?r(ijt>DYyrTh`yzDbjgh{mh+8A7n)57!ndoILT&yaF!%Bhp;CZs^0h+G0BSBloQMztPA<-q-7)H4&o8hX_(hX*i65K4FqG>`-qMWn%8^WI4DOeF*v)v$ zN)lVaf2;XtoImj(Wx5w+9i@WIEPl#zSawA&Gf$*xhfV}l2PMyJHNTJ@1ST1$s}LOE)Li}k})Nm#v{b+{HA z(=xN$t0ce!1=NKWtQ7Q7!OO!|@@V#rIOWMy@&Y#EVY59k5+dK{S+zYcrP{bQn3I*Cg1LA@KaF zEt;u{1@&CH#INf~y@ZL(UY81%W(ue3&xyMq<_L!s=^h^J#%7hVcuk+?jeTbtF5w@X z!I4(nW)tq20p$AU^dSiWPrOF$^c@oZ06^Il{r;WEAfNI&bZ@}vRHCmOqxm-1uO4KgD-gVu3Yj3&$pIxwKd zjzB%VHdTAklcnbaw&<3vczPtrw`!XzVMF(5cvOsZyNxAqh0T_)oC5nzgVW*A<8vAI z5VD&TEq$sl+UHHmJGVr_!KW^O8Thg@dryl!e_-S=fAQ@qd+ttu#cG z1e8?uB@lergF0m*GvoSvDOVpj%Cc9Lb{u6?pnW0trOi$gLHCu zJhv;GZ_zQ{Rv6v3Dt79MVbj9PUIQb!4*R5J-FnNuBDBA6Ji}}7^go)0*u%sYJ_%u= zPz-*FU2;v@7@&%#ZOYP5O9OUV;$$yi(19rMb`zW#1VQNypJCjSUb1n$;F1R^dnb*{ z>1<^~6#LrPeFRkI1J)?zE7@0(j!#7FY<*7Evvt(ze&q8gcXJc*ypOm#oq1}uWQYa> zL(*!vx5fX(hlhWzQTfb?o{V!0rJp$NK62c`#tl<{k~Jrco9{3VX8X$2*$O!_`}TKy zi#rIleFYfz4bm@^G` zx4l|By+Uc1Wx1whEW1GyMU~kb$98d=U0dMM(y-zwd;oQ<`!Z|~l878w9z7niO84}) zv8H!OO|m?5yp<%VLKpEdXwbyMrHYRPNii*d;X9LfBf>|0nQWHORy6i#DVS62IC@k@Eet zyw%oWRbw1BrAVeX`?LBOtYI9S7dvc5nNRx&j};GtAN5jlc?&N+=I!Zom9iTeA6wFwEkc{2B@{DPyIL6*UCN-r-F0puu`In32 zTIn#wigZ4p?U{WkkKIUz0>=Sq8&SJKyBtnAov^AMAFFPR43N!|xN%Ioh9O`@Hhp8E z^>$h?$eC2z;L4QP=P+({vCN!~12o*term~7f4<5@@b@2|w3GkNAFsYw^I&#;Ba5Xn zG9Ct>IS$!PQyrmU%J}n6?c&mah3hENy4;hv}67}dKk+XIjsaxgthTAldp$~WvONy;tuVC(&$P|fMUz}ljC zL>t3y8-X~w={KW{2p#NGMt9q!3B$;gY?+$Pm$+El!H(>;%!E}^X(KaPg~lBtI~Mht zz43g$1i&XByGkiJSh~g|oJs$kh0FYBk3E2Q_34vRY0_(_<0KxKcbmY>o}RR)vg2*H zd0_XRZW7YmQ;aN zb}#CB_=sRQs+~4F-F@x!j0HF|M$}c>;W7@ht%vG17lNDUwgn={CH-Gm7$bkI<+Xio zHQq5FTF+ea$^yt#O>naIMuAvxH50in&7ihMEE!{C57g|1Cz~Vvf<7R7mfCh@J9iZY zRd}9#A@iIHIcRom8(!rP1y4+f4~QtH!bZJikFtW=DFGp#>@=CcznMx)bC%iU_!V1whKQ&t}2V*zd1-A%@j zLF~3L1(VZ#5vz>>)iCxn);P4Y+~A{P?erM7Z^0L1a|uIwn(Ag!QqLbeXL!$&ES3Z4 z+0oF4W>k>@%d_U5V$~Mxw~^u?*ESL?X7jp{T|$)g;J8~3+Y~qYC_5OB9KBt(`%zQT zgtL{N=&ZXNDvXP_q*fd5+da>Y?qTEN+2*1zWAutQ!e%7u!k4g1*uOOUHF5(dC19wW zNUEW~aFF{lc4axuG%Gf~rY?-}2-jfo5(U%GFvMjw`-%25BXDIc{ZQsQYpxU5X&Lr+ zBu$uH-Eb?ZryqND2kik)nTzD=! zmN*+ev3N@ATJt%gD$-idkR0@lnYU@%AT&4DU`>^jpD{2$hE0w~k|><2X9Ua5i1xEp zQGrXARWNw!X?;HW>p!4H(JZ{FZ<5^P&+TaV3Xs|aNSmWDKQBV`bT9L2!4hYHA4e{7D|e>DLl~UGKWAquht2I*U{gV#zqvP6^A0ZAkX2GXb`R9Dt@qHZpy zgllJ;jtCaFk?q%7I?^Hj4v!lV9Sbaty?3e_CXWY+VMqun@N@-~tO6M%R!2rgK44&N52vbcP0nF5`%vw7|MMT zgQ*j{=3j}yugoA~hue+A_fmQQ;;JG?Y*Yd31ZEH*Vbd2p+x#H~X3=azCFI_>zoB zv_FavbOzAlQD23^US08{7|DV=>gw;e%3!_{_R9i>V_xnjbFX0V(L3B%4$$-qPpR;&822MBbPFti+ZKm}DpCwB}z! zf+ay0ir7@i9U>FN5Xto1hYp<-WpX9ZX;q~}=HbV@eVQtjzmvo925Aiq@4$)Nmj(O4HD=+tXj>iolRts!C}G^)Ia70)z`b>0 zEnCmfgG(yV8e}hOs!4_1Nm5F?Gug4+LXSo6#z4Z9i6Esl3HD}^B$qknsP=rOCM2J# zja0QrKe;bk%>)_Nf*7NDkE_WD@tX;sqotZ)3yj|#JVC8RV)7btK0__p z;XNh8lkFh5FjPXv)7T_TEo1p zYNKTq5H$TcSTTlG3j_I}kgDcmMTW*XpEA?%|}zItmv{OCvVq|0U4R24!X7-xj7e; zpa4!jQxUHvod;{q+P?A6jl_T4ia%U?QTG|usBx;Y!DE(-Re zI4e~)S+I0u#5c9gFBviT@K%9ylQt(5nb%BZ`jw*k`wVEUKeVsq`dRz;QZ7&6{R=cl zD6L5Njt;U4t)WC&YBh00My+zVcu2EaQOxmVi(BFVbB*E~MU!mAbU$s^V?ZC7!5~nT zgp;rW2aO~MSp%`UkDzXh6KmH4*M_+%K`ojKGbSyX@gE5X20&`rUFFa9D492??2Q8O z2>rIR2!dO{g?%sQg`K0igLIk|S+i6RN8S!cbHn8ifODL*`-VodVD_t=&-j zV5+Oa;*;Dxt-?jt+_reI8wBa0zp%Q?!nxZxKMO|DnJ;yKmz5CH>a{DQ=d&kmn08qN zb`fA*@g#ZnBr#hyG$9HkG7Npwopp`3{j0)~+!UVJ>t@+5gj&{VA!=5`O%-pG^V8@f z3v8~`I)yhT&Rt2185#y8P~}~!bQ0z}#p@$AC!ln62)bGJO_i3H#wIUqxG-AoQ}K#w zUhcB|R>5Yo6s1|K@*pD9$H5#Bn#->Yk0LcyUwEKpsw&8knxRDQ$mXsxy+j@(7O>e+ z1GxcmY)^VV#!=Mm2&>PGB?%j!Ql3zKZKW)%`)u=J#$G}V_YSik5RoS!!*4s9iW#aS zpZC_%hM6%#=I+T9i&)AEn4{*l z?IE50Gw<9?54@9w*yp-LK{#CIS4HSRYTwV0=J|$O> z)6+t$96F5wUJbTwg?L|E1`;YeU^khbH6126GM4*uc`kok)nj@O&Ly} znm4Tt{+@Yyn!acM#a_yV3QU1aN-A9)KZO%B(s$vB-#;`8Cq4DbY+gDp^uZgkcISGY_DP!SWR0jxSvJ|ioRc-8tHONwijz5_ zM1~#?^N-AtDXLi6cNVHl%OB|uRX}$I}0;Y%-Lz!xmymkJxk(_lqnja=8WQtEdUKA)x+T9C`~4P3*J}eN1;`$-CtSjWNH{UdfN_!M1DM7h{kn^842lF zp=_{A$ajH;78U;2D5;NU(9IH_=FLrZqq^vbcAE~OC=}(|dU_t#ScjN|>WWC2`&(H$ zl?QTWfgfD`NK~G=gUo}-#ifva*8&rK6V`L5#z~B^(uR2VQYkTG7e?oAQn|OiEbSVE zP=e}g(a%MfK8@|(-NkB~nbu)4^QUkF!@2B^SaXzdb?OYlKRCtigC=QGpAaNsAn4Cv zA&L=$sxTaN)<%#oR8iDqerwN`BFI!D9O&I!DaBJ&?`E#@^9ySor@f4Q)YvkKJhO)7 zvN&CSAto{UfzD}zhGiRHH2wm$4MG(Fa9csMT0KsmGwI4{q8Swa?ZSvwa!< zS^Jq?z_L5tU%@4SjfUmysJA{wG<73o`$HaM{A}?3AL0G47}Gum#l3gi2j*8pnt#NY z5#W~}L1xDIv@QOVwRXqE0e3DEE=m!@oG ze-+lkL>@LXa-Y(lK2Jd=GzZ`oyZpCw4M}~jtu!8WxnJxHcz6|F%q6? z0$ECSG(oCEP@C)0XdxI^?UIr7czVP+Viqv`(4<){y$Z{56uHx|7Iy-Dy2aTSW7)_S zdog26`aS#g=7h`UJ-L;xD{l*nd0$y^f5Qsgx#d%3cUce4E70c6J8x(q24Fg7>cQZs z<~lQJpS0VaLpPPQW!a*_Yi8yI6xSs{Lv{^#!?DDK7I#?y!1OLU!~NgGErpfRFtY-7 zrYswjoD%n}a5vvIfj*ZtcJlCdtZiFo%uITRUz-^#VK-Bvh&|(oYijgagz3eUTenv! zNorImEKOxXNxJh0vzm#Fc5-dQ{%_6dR1#w*e5BKRQ+eMg zR|!Epsz>!d#ay5QG~N#t)F37jUMuRzL|A}zrLD?DYO`)*L@aam5&Z4sJ0+ zk!zW^`eh$gXEs+ob=YO(CU8xi?h)R&Qc~8lAbhGb6)r2H| zJ8I+%Wp@Q1%fiBh;Id52gRLarOfy7vnVIpOi#0aQEbGbMLKZ1`0ncZxF=?J=2{S^K zr^LgQ3B;1OATM;}i>tMRBbR){l(7yhQ;IqA;4*>U)`()ep#&sdt*M5SZ)~s1)x(o< zH$voZV(VzHn`Ga}jIUIfgQ-N@BsE8Bd0xV}=3LdII*6H6z!`8Oh+=qF+Z?dQ!ho*y zwgTr2)eZ#~eIIYrjJGav3YL)Hi}QI4>h@a|J$zWk$>3iUv+)yqGR$-dIk-!^eXCH# z!0$oBA!_C_=bn~rD2$5PEQ%H7bRuFigqEfxEnbm~k+*Ng&83C`elS)UO! zN2I^xXVLShOmmk?Aa#TEtk8^j!)j6Df9Q=uMy;9_gH=JohTJDbDe5#c*%-U1unjCC zC2g-@OIjKQqHCt+R;w^Hjii2s!!fhklld}b3r{etrATX8)Fus6ahV$=h*r32eszqb zM6{%ZS2mfXbHie)jGvQ0?&jkpzG}DHTumw?r;196kmNj4wsBOWaTTRz8liS|RgMvU zrsf*yS~k~8+?0|pYRQRb&Y>mECfnXda{94C_fjZay!md}$INy3w;t5UKc9gVbnVH` zC>eUUEs`3}4f&m%$$ZrW*cwh(rkT*ad_@>W zHiR}`O$WbY3H+?DD)5=jJYWp~N z*I4w_YN_J~8KE-?0&$4LhLhfseodYcj#k4`6UUEeJ&}$IY=Vz!$2Q@HnsQ^c^fp*1 zN|2k3znKUni@8iB_tTFJC6J}pM?5hw@Jc8;S}ycAx>f|i7;l6^FI=o&<`s>~GGvyESaFfOJURkvk>)tFcHObA* zAQr4vA(KtOw3DvH7ZFhP6pWorX*s9+_aY#P3JJW-3qzlOdQURIw#nsnb3OG3G!j(7iD=Efc}Diqf89dr(AX6T-Zv zxHX}f!FH>sG9-(kB7IiLlz}*o3apz#SDrQO;-KL-%&9HX+_n$ETosL^vqz(R!9# z44n~?=~2q5IZzMMLLb&m%>kkZ+P6mXwo*$FsU838ndga&C>MmUq3ow++P0_ZR6?hb zIdxWrxR~AGt;phj?NJ7V#+rd_V*%~d;xMov^vjYj_7ytca0sa7Q|HVR)9Eai&5Iq|JU^DMr2i(&cNOO>0kmf z;Hz>8j@--h*9ShQVHw3+(Mt>Ietm>K{ud{0L!J7BRz#o?6jRAm!v$Ta5_dgmtXoyp zB_3Q-T2b>Y+YNt1b@?65gORtev~{o6XJE%0i)3V~x4O`?C>&@)Y*dq`c)lpy3VzoP z*fii9_?7YKl`@Ws+f!1sV;HBEY8Idf47^V`!C`L%Tcy`5eNtkIe&<`^jmcEUcyi3vqf+Ev&@>{{l$mPkG|}fsbs-ANc6VL)U$p@n?dF z1kxqTE#dvtHNO)`OxS&A^>ZeW<{t^9lRi57&=Qc1l%U$GNNr^>6~nqyB5EEhL%U)q z1<5Dw0JNXt3&B;*QnT39=(i7~xBM3ex3)6;ExaOI)Y3g4NeUy5qT3YAogWUg#w^N#D} z&Y#>rJw#M>Z#5nXD{|eW+t)HjW%Au*;C#I<4j1a$XEvurAK9`b>6m5h{$<)R0+YzO zXPwjOFdNsqW|A!S9ocj2%#rTcY=yJAX$@I&+9f3@1t7sIi6qsDNfdWkh1AK*=!<8Y zy2>yoswskKEtxeW1WWOV6pzXr!m>#jOuQPUM7eTKwNErso)d#{CzBN%7832;EprvB z5UKG6om*qBZ!(>NuXDqLd|L1%*5lWa@E+W3(9|{37FlIn9w4rBv@Q}-)~l|lrKhAM zsHHv-X1Nt%5P1-y2t#6#(NIQcdmqpuHNvHRCDM9Uil9(7u`wvdWb800bZhH06EOLZ zkyGjbx!$TEcmVcChNp!*iG;w(HjH|re`360C$O}q5$F~3D+~n2U}!C2TU}*P%#@`7 zCOVopKP>DdVK~2v% zPb@WH0)$LGdTEVhvVl^vK<(USxGu>Z?g)3kzmw7^R7}x7<_`X4>qRAOb}Qc){lK)R?+;O#0R<2 z0H@Jz}EIiRGym&-9_Oq-nr@OkzC($>eHkbj&bdYOr=HE;Hlp ztk>KbX-?yI6leC}Tg15{IPNPco6d~Yp5$b7sOv`A#Khd7E^|7B5ce-m46RiB_Y*>h z`PQkj2+y3H*b+#TYi1?x;lvOvg&Vq7J_T@vTH2;MiZ+T60=%*1(HVKg_8_v&r~*&K zX3+pPaWL6fV3)a;aWZlmT^4!soIm;sC2*|UFZ3j{itY%$FBiddx8vEtwd;&K_iPRE_kZuv-Dnbe^V*dQPXUg2T z^YN5N5jr;)g$LCGU>I^9WOHU}1S5wUjp?UBlYdvrno={c04Wv@pj(Piv|J}P;zxu) zA~|Gn6V1^?tZ_<0>8HQQLfuCklZ}adVh2}}T0-v1UVxNT+(%7TT7?x&=2C5Dtp<;!R7%WFTK_0jC|u2{Rd~1gnop_1{kv3Q zU-MI|@G90YX1KCcVf|gIP_jJHACc(G-cAbRO!}?){{Z@@yE*{>001A02m}BC00030 z1^_}s0sxOvjh#u7EGy4#`^*aS1{3fJU^JKj^S2jhE#V$<@_z3>WoAZ&gUYQfd0&0> z`T5<)>T8xh=jZ>m##;09qxJc|e||E?{CvNEeSXwGPapfIpD#Z@Uh&1}ffDcY`O)XK z`-`#Pre62w*HzoyKL6Hw*SppIt9^cYeSX;5{rRSq`gvwNdfh&F#k2SG@A~}U z^Wf*-{q)Zh_CK|Je$?W*`|YlHZTr0G6`y#0mNUj@p>upzxtF(p#l`H){9N-GpVh|Y z#`;H(^?#oHc|qSh)O%j!=Ov$ai#OQUS@vUW;pYdRZ)Utz-#f71e1GESi@D!&KeXTR z^Yz}E{(13=Et~O^yi+;)^Q;{^k?5q~E;L=Q#J$_gX(sD9z)H(?i|1Xyoa|na9c1tEr$NC0o%-NRmIh z;y~l-ZayGBBcv)%+QW{Q_+q!Awe?@WLK@=V72>=Pu&gmd==b68NA^i>y_=ly7Lc${ zTTVi7wy5m$|Cp~5N-?(Pg+guJ-_PO+D%%#qkg<4E1@7~bGUHvgHo82&*!mp;yI(N3 z4(^W`*uNfY?OV3@XR^jv;r{OP|JwhJ_@psiN|+j#vbH|QTDFMBT3pxXpDhk;_3v%N z6l3D ze+y>(#tUA!hPZ$*cA*tD%xUwPwQ7n#)-yKX3g^J(qLT3)KgM1f=U}(vO6yg^KV0!6 z`~mC3BYTJ~yihw{SBKon{Ty?};KydUkDP3atBPG{_%_y5Vu9hBZv55$`93mEkhq{; zxp^F_+gmCpnvsDEYKTloXIx9X#0!qdZvUW!Tdc~~-mvZ0ZhU7fg200PZn)4&^s@bP z%OD0{)O4=xMw&t#*n~WC!o?Z}uqya*jUm6WMMgqicwE4(>ovqI%Kd$#N$jWF9IhTy zje76MV@7zq{~IOZpN_d25&KMHzpee#SSiAt2*5FGVIDs2W@7cU6yZm8eerW192t5> zkUGL@t+9i+n@jfhZCr4Ft-Z2$>0T~`p;QhEEs8_E2r)0rO$b>0heU@|?33C;avOEM z_O%&IH02}>3gOtLvHJX9LRfEu7s9UlQu0HKP|wTMAdZl;-7gMhNX^F%qI4lf<{0TT zm3SpCLgqUxU>HrpwfIp@_1^M?$lltv8@((cIPn?r`FBR@6^HAqmDigf90e!4scCj& zb(-v!HVbcjg$+&V#zuZ*`^wWxj}gnik#9FT7N&WL;4;4ZyqNvGQ1);w1e0bP;T$lr zgs$zzDtz9%V45!s?se_3d~LrLPIRY89mh=CxD2I8Xv!qD+|F>j#}WQ{MRppQ5q@%! zBIJ+vlRp2I#ZNPJo68iolf>v^@v395u>)kGX znuM)T$%rcB(n!|^c}id8n-S}(qbn~f!i5rWS@`Np~4$CiXf?W`h9 zK{)7YN~LAN7=&(ymANW17RuN{6!C41XQxLCr@ya<7h_$>UR#E;Sm;P@8?nKoC47(3 z4{wLZH&|*BJzYe+p@bN-w%rj)@y_T%hZ^b|O36EM(L~`P`G!#Y7n-+SECE-1Ge}?-6~xA4l7!IB<{IYBP#VEeu(c8 z9pd=+UKF?LCjNXG!$hVsL%B6$1X&FmcB5eNZjA*r0~W#z9f6_Eg&fA`hxKeI5^)xx zXElYw%yR`q#){ltS&0*?>7Q_c#B0}O?v)W8K`nqnghj>utR(xS1mX%h8Y8y)ghhsX z@yQ(C@ytH|M&@{FJ|SFXsQ=!Oa=*@VFU2({6jV_er6wGt$!Y|yH`%Fp6A()XpCTJ4 z9WvQK7ZQAGTyu5D%~0{`*JU~pe(P$=aKjmHmEYGK(!uB8!&}BD04@MB^_Y^+zvSVw zM8Y;P?#t+F4A3oI1|~c**6>u}E_M`HA|(wpYXBPVR1e6&#PUHe!VM7{M#5UciIE`k zhbNn{j!am`3%yvGuay_Ae0K*NWd!cs^H^6z)I<%$_#gxkONbUn)V{a5OyU(bYa@^$I}zO*#&F{Q;31z6 zE8v?Gz!PNT3lRyKLcCUrS0bn-#PJ&xSt((E;A008Sx3TF;35H#2}&tp%GW{1h{Zr= zH<-3UtRDFytclOzQ(1E$BI_F*E67*>6B0>KD4xj{&iF`T$XU7?fRZgT06##$zc9Y) zBt;Rxf$vAK7kE%ai-n`5-a+^n;=iN8mGN4D((!x7LtQ+w^n~RjUR;V#W`9%?mLf2X zG3NkJDj`?wWNb<7@W@S$PZx-aa?A=4oJvG5d{Auj06Ob)zERY!9U3cjRy(xg?Lo=s zOZ(T4_OEj~GXz)^^+1>LNyB$eDd{~+Cl89&k?Sohg>uHfwkTyKHZE)tN4657>ybYv zd=~L^$cja)5Uh|{ZPAMCgaB6bv6BHjCxed0KV%6jx6sXF$9A!cJX|d%sSg!>=joxe zz{62EA`jm$MlkmCP?kY`jf^D`0~BNdCrg7{&#1 zpWG>p_KY*)_@mB!45Ax8(X7x-3}xw}7y%3#eS|B+sZ5ny#Z~mNFSDRd14W#RhR{@yhUj)j7TupTHgA^k;WOkxNMqC{` z;5F^MtVH$&VnhNTDK-nHaQudm*_c~!wY03FoA_C+vVf(4dxF+aIQES)-_$68=^J3p z4fe{p#^2jStv(s=O|h%SaS0w|#p9-A0yv^F-l8te1am_j*L5=FmTU>Wy{UoUCdr;b zQUIcY0(4=e>R`^mQeX`huqelh!|d#a{KO(mmZq|_`=BBL{!-2dxZOW3mvthbaSoj) zAWb56AY@{|K+PMKsz(5#o{NFHZ}IMC&8!K@HNN5ii(4EYYi^e)J5q8#MdO<^@V1&) zOH)-FCkR!gCKh(xhmaD9xljja%Uw<_Atjp<+11>^xZ1|{g6PM!#rYNy%M|zIL^OFY z>ge4>aXicro?0{;sHnt0 z{RsW0=59q2jmYC|n$fCdyQubSgDwigT$gWn2`Oqx+%9ps!UtZ*=!y@5NnKRsDC#5( z3ADO*s@yd-QIm)rv~~=);7XWEsZa2z)U4pv#7hrn34;<^Cn|_AT4UW+V8OH7$}a}x zK^Xv$$tS0H`y?9NIYxhKbP!aCvsVUJPq=TC6xrksU<$>BIWl@08I1HN(ZGirbuWU? z8Ob+3d>-s4BDa;%ez%bLUWnO1aHS@}cc#tqCBCEm{*LyuK1f}X6s#Kse*g8qWOAcO$Wm-6OOI&zSBBOxHpx zY*8`}fU<3;h)Q0Yuogf^=TtuVGiYEWopH)kR%5}?ZaW4M^r8b6h#{85=Hzpl`NaDO zYKvMW3K*$%9L*{TL(NQ668Sj9tKJW^M3(qji?ZD^!oRE)Rp|kEuGjDM?UreF1ju`J zcJ!>5>k#)fF-{0!n0)m>r52p)l@~jcN}OoI$m>3Z*NMo(p9Zt)u7`$TlwDz(W~Gekt)=Emi;=(Yq;^}-fq{tKxG+Y^ zuE5(%!^wJ2tC`ynP8JCUva)KjU9F!PKU?L4qd^qApIoY>9)rG`^-G>}WuA6oqX5TxI9AsSPK3cWhS?q188_~Kb?y%oHc(aQ#B#4Pa$cm&M!_6#c!m4SKCyCw# z4lZNLo%UPJhfK!xlF_IRXStVr`5Uguk(!CG&z>*bM?05KJ8Ai%@VR{9b1nQ zn;@76p^ivdN_}aWqr;@Qq4Xhu*X2hcoYqP2OdDG;iurZthUnq79sxoaTo?yt!c%;z znJ)pLkOMD4EE{Ytvqm{yrKPwal6(s>$~s}vDzZdP)*r>|`=}m?Yjb(Wgur-_$VCor zWxE!mjVcsGeqBlD8+;9^63uGlof;RRR5Cv5Ls+<>ge0oNIcL&u_Hk`Ui$Z#}YvsxU zeD!L9a#B9xGn;vIxt}EJww`$>O+bj}dY9IT*|80!y;%rtSY(<#t6c!RRuO=)fzJbF zCa{Vihk7-E$PV$ExC_;LlBZq(!;JSK1@^m!w0k0-P&=r91hb=>V&Um@rmSTCoAbZtarF zS2dcZMJgxKe;ooBUYVqrV7y>{F7-&91tM4gLG4PWWxz!ZZVaBIq#Ru^D*%H0)S7NS zUV5d^6c)IlonIP?khx3VxIQSAm_10K3xiwkOCSNangV%caH1N~Mg#12>34$Sb)VW` z|7`+@;>;iply}jG)rl2ZZ1Nb^-#i8$v36#e86hv0SEzS`?$(4*6N#(s;8{XJWW6P+ zdD2YjN0WW236eUC2oWjJ>Qf|bX%N`nP!Fw@aNm{GY8iA_`e#5Rh!A)qxYPfyvt-NmA3PlanVQ)GM%keFO6N|O=T3c>jB5LS{|svt|o7NiN_m@PpyLK;Zq zu+ahQHAyyS2D)BOK%(c>`%|vUScQ0T2<=VLhaMEK03+yewHVwXb%0v*`4DA>tPbf; zU>O=|xY_H)TUc-2f|}ByBS67^Fjby*hzZ$oD^$4-QVA|u5}wRPWuCbNhZ0~~Nk-_x zo{$uT7_6JFbL9i>!F;$c0pW~nz=&lZ#*kYRYA*$*TW3B^!te!L<+I!UV9g>jUBZr( zpZRyB%lr(=1^KBp@(0o##+7cZD%&s;zOhZ3OSjAwtSFiG{mNCs*KFJ$izJirtD zb(fo#Sm2MNWq}>+Yaebwy?{pmyf~}Gr2x7{m*2q=ikKH!0~ED6CN^kJ!9JlhUNDa& zZ=iT33}c7QIl7=qap`ns2lD4LID^8uEUV}#O8o&cXHuRZMX-{%kS@wR+yl6TOIppN zZc-;^iUTKE#NCvVo&gcGk}kJF8er%^qH-H$MgeV)ew`*#6zvk8IyPWRr`SI&{V>Qn z&w}KZMk6HsFgv)^DT8FfSb`VnjDV>rS?B-Na|e@C!mlzOVxcCU3IP7}i3ca48(xFu z1y_oiK*Ih1AFt8%8qv-RTShFH1`lX?|KT-~FoI$XA!d3}Ugdyg(~Ij&$GslMUH+pd z)Kf>nq^CZ#jLyh`GLH?12$MR1f}^F&<6A3tp5re|E>l0O-WQ=&wpj@7E|Hun8Ax+^ z>SS5XQaD&!kOSet&3X8heDo^)e2P{wj629D`6ofb#J5`t;KK{%9-7>Wo1c)HNd|b z_^KhJ9UARSUeeN7$CZb|S>sU@HxXKK<@p#O0Doy$*#<_zQ!5-ofYB$5v&k!Iv2i~8 zT?fNQqTdV9-7;obxqqC?G8RAy6nq8YTsgA0Z5RY6){NMlYUm1`r^YHtb@h2%=PW)~ zXl2QLG>D2V+=m18EJ@%~lTwDZ59Zz9JlSABCkf45H;S50$M{MHUYzQcR8Tf*SWKbS zj=~S3FlFn_arUKCp2$jCxSzv8q}auz1o@6Jo?)n=BT*%*QiJHo-ne2mt{79~inE$z zRM9DWhO02wA>9MTYspbt4n1x7sjhO|av2@n68cdsaut)~Xf>9k&4gG)Zb;v4NphTYs$f zXO%vqh%PILOqI|uwu^AVK7{>M5hOYuUsuO!SH`=#JLuLXo!fd&kr@S(crBZ!8D7$l zcbB06zdM5UF;c@Lnod!2b?dYukpSnr@M5X%qh})pKB^lLWhTGUB6KsJ2rH~h>-i)C z=oON;&bufE!aSKK^mX{~PyCfO$aKaF!ml8dU>(C4lWT) zhruityS8j*iuhWhmntc#d=fo`ugks;x6ObGATK^*go~wZ=9nCN7s9_ieI4UPnZ0QO7LP4*AVM5>65!=e#Z(*uH7?2Jy%R~xqWR=d zn3%D?gd=66yoCdKnqo;tPDeb(0gi@d^g)>skNzVaBX#-E0HqJ@Y@ob_!{y;#UR^%~ zE%qNpu)rvhG6#nubp*W-!Zw1za;LVe5O@R5sbCI_pMA1^NYGkmhf(tTG=dh+O|TrIocO}ay~lNGp}X0 ze)X$-Z_``Es1wr6ddq~YA>1NeJJPrRryEZV5s{IGRzGnt626QLTa+(@zYB}+hD5i3 zEFSUY6ZC5|n0hn5P(5>NxyB-ae5QA!{Xa36uN}ce66f5fFTgV>S|^EaiPDYd*|kps~kI$9j_Zby@7% zo~Hl0zt?i+*K#6Z)BDA|Ay4jcf7-W|DdT^6zfryw)o1$&-^=({Pm8&IyZ|vt@7RC5 zqhpY!rQo^a?Z3R^pW1tV9c=3J$yhpyyg*A+DFg=mT77??X>s{P4#Xfm>6vr9?BL4~ zc8|6gwXnr(r^rB0i#XC_{{8}?`Le$+O%%u=4kVvmnXBw&dlfU+bL`=GMJro zGz#py&bDMBvZNY4AZ!Za>PfFgjl@o{{&BkHkG_S+xST%Wf7B!}sA2`IAJ@Ec(^c|U zvG1kNon>3?d*tlBkS{sw$349CIjiAEpW_@yqWQNI?pjWes4^EeF(a^=>}?`kd~trF zD*CeBJ$HAbk3YupZM*RVX)IrI|j>+3QyqWnMpuJ-0_pIjU-nFA6p zS%Y$zWvJNB16d{~Qr_$~RjicEH4g+O?mhAg5uh$JzKjIYz-@9=J!MjAtD|!uK04Iy z=_b6AvgYi$`251yyxVzCSCV5H=4Nx+B{7T{Ot(##cQlxu;iFg1mCWgv(Ax6+E=dP4 zAftEiq8p7q((^UTNV1rVh8@{*9^Ph-LxZ|x*j)|;tu{Tf*84hiV5i>ge@cbU5BGeK4>4Ve52CT|jpUrzwIvtQdE* zRs25w>AG!1NJ?Rqtt`bK-1^R0mxuSrWGH)To!*!XR$IF4YGh1O%aNl_D$HJKw$1M3 zt0m3*mLu3=PF%}FZuad~J9wF}nuOP&vDn+VH}_UNEA6hZ$xJz~df06_KCLAtPb)BE zN$n{}nmp@=tt6}4N2TIcdt6IZiJCm>meWMDvq5FKWV3@YLRKwT4#JecbJ<4%W?NsLKVmmfsd=?T&(EI~QVQ!tCl%@tbW z<~Q)}*JNg?TQhUwa4lunlXEJ;2_b_|11-v^TW^-u2v&#Hz5&8BUiEh3zE_D%)`>ru z51}sOSs(B^R)RF^z@iTkuw>)X6h!}BcmL+qjdyjvtS?nfkUc0})y;%2TOFRB(~s@Q zZI98m^Z1PUyJ||Hq;A@0XzoBrZhGX?u19Zp&A9{ZbXwS7QeD6%`DYKm9rjNLf0ITH zpPZ^4rix9AAWi~p`CD zN!DDaRRC{p^GUPLFDaRQo^CcEOYJdrfaC*?cZDW}CxW&D zZvUU$4ul721L0wBV)Kdxf|+9clSI-y&sb6t9>r&_(xO-y$)&JJ)lG3Gia&+>fjVYBk!vfxCzWF+1(&KO z(b`PV34=pIl4(c)4%R$|6Z<(xs!?fTM#<6QyQEIVPQ-`&qu)i5F5Xi!ylP0jNgq76M$?=DTO}VH-iLxiU znN5WMvB8R`7{JkEb7C{@p&U=k_n4*U|tiE65dto#XJfh?PUL9&T5te=|G5(4T; zBP=4s{e?4Nu)c~;E3uTP<`f9cK{Z!mIIM$D?GMz@PwgZjSt=+8KuVlpK1HWDB)hEE z@4M%Z|{*E~p%=-sZI z8(q)XtHyMt?7Vcha{ff@ZgG}xea7WvN7@6((VWWQABQN#_LGzuNmmcu{jbaywhxUb zQh;MyVvw~Xr34|Wpi_P(@wRQ7wkF$&T%dBX#dclg|4x+k7AO&(lN58HaYGTos>EYz zM)HCWwOTQZX3v`Maz`UELRcAN%v};r6KNtUbP?;WZ!_)cQB~W7TlR&L7N;=U-AcE! zXhMrFMh76;Bwnf2_(gx$?oW*%ct6d z%@X{umXo_VwgwR5);K9R73({qC;aJOO<|g2d{@cRZ}^pXTEuU|yyFi_`5->|{3>rw zIl(&7?crnfuZg-}cNzL^3zK5re;MXIeHiPGcxngh$B7a5@&6qE`|eYsQV-UY9JGN> zR@<1HI#tumhJ?4^R%CHIoAj!k+m}t4098%i5iTz)8u7b1J*}Yd)_Fw~>scYU?#2!V=zVA`59Id0FxnfkhxMnD= zrWT;>jFs1Zv@-;+vd%&SIvwG7lx*nFsGALY;9(N{{i|Sav+GkJjebcw_HN+=8Z57L zZL~0lMzogYtvd};js;N>aifmDxQYLZFg6dJK@d;7C)Z>fyMV-Pn`!}MWDBsULUq6x zcS5tdafu}F-z7;6?~TYN(454;CV++AT9NS27c(bpCU>Ufeat(~E8D88Kp;WHRn9O# z&_dSt%tWeMeC%o%W1Y%%#~oOlmVe)8Fk^0X&NgUS49$-rIw`lqR&Fs}g&f!!q}|Do zg7Xf_k0yEWAWxy4tP5}4>qA)U_05FSuo%@Iy{y#jSQ*9AcVigP?BA%FuS^rC*dxYET%vN0vx^tm zN)IegNO}4A+KpmxHCts8Hu)R{jHAU zON&Dk<4iJ2FrjG0*dvDsBq;4=aC8JB)oBY?g;JO!z!F=GtaoLBvp>oF$RuL)q}B9p zIdx_?!=elm&%iSRQAB18guEq|;MaQyR4k)s!~vZOQ9ZD0)~%fKa0+}^-XY}}dJK|N z&tfZ$Wi1Ze;W097yM=V`GYO>S07dsrN0oQ%h?y+bX)NC$%}!qkVQufW{_Jmv`&Y4; zV|W;Oayhiok4E_4?fTq;ury$~W5D3R;2Q5y;pf)G}D8 zSx&dUer2X~#|=5}E7Ly{UJa2l?#&h%hg+Q*qa`sqsmDA?fFAQ-c6=Y-B3{1ufouLj zfL<$^Z;I(*E0*ABW;XIK1A4)*3KZ&xx7NK4fR%_BLlEKkMx&l!q@#o7SDM!sA@G0G zSp{^=O_b(Gm@vD6_oHW;0^s5yfjyB zmdyt^Ie0{YOyVGom`{pJiwNm3Wv;ICe`dmttnq2p29>H z%r8@JLnf2B44Pjm800du+$Z7Vh5-cRx3C{ELA}LqF9&cHUqW*3Nr6QjxHxg=#2M~8 zYC+rGoEwhEe(S|!-Z4Sycy&OLx{=`RNI%#lhn{rTynO)0`#X55ZU&34uyFRHMR@h# zH-z=|PQn4oLY#Cb@D|b-0HR(D*=vGprX$Y{CYuP)CDL-`FhP$+bP+R>Cn7)y3Ml`j zR%vZ&pNeuI*Lp%*VbdmSL6%M|qzGt30ILtgYbtnWsshvrc97Y3d3ZO#I#*(^npu2m zyN(PcG3X;3-WM2jIHKjNJu?$Slo+cCZ_&iu=A_~<&BWVu<0eJ9T@a5*V}ZrO%ok^7 z5#!z>QdKC_5E{7!%e`cU>=(V}K4K$pU4^24wJ(T-6oc&Mf(O`6ER!?M1Xr${+L%7% zKK2YIOFgLc?G&SvVq6khRDV7`^XrjSuSM+VN9LB^7y&^DUghbr|$uG zD~^*3Oq01B{q4;WIvBxPEl(f0wq#^i53 zEF4EN|2y3=zBTV7@r{5NQSc!Oek!=*w}Lyf>mq3uLBY02X_?*1U%$@mW%%S{|g zuP8{4qI^7&Bs{_zkY?R7_*}4Ssat^mwWGw^UaDpI5rqTz1mo^#<>Y^vIiuMCGn!y* z8RC)5*>WGT#~>dh*wK8U{V1J*;7QFHSLsYq!je```K25y` zP=Fg?t;LRk4O}9%apA>+;w9AI9vhPEX}qctIPTZ*xXAs#TTV`H2EK&YD#fKqVA;2N zTeKZgG}&&n_qI0NQlWt%2-f4Y$mkMrzcUKSV9|V!!tHJKs|x(@z||;7?wHyF=oW}Wv*5vosTq@P%u1YRpFi8NglOm5KCrjUenFIpPC z$#wgM3X+jCX-fJY?O}X!R&n>LlW+s;gy|fR1_#-pQEf!2Wn>E|I13aFfN8i~b855B z5Qb=1-iD^o+0U4WE`>D=7)-dCZL~S62+kMgszB6b-4$6R?>Sq*uAo8pCgg9K z-(CG)ewO>9I-F&v?8_XN7HZEO5amo^nU)fgSa&LB7_#50r%8<}R{ zCvIG5ZRqR6`77htp%+*BnP&6x9V@vQE19|QhnYB;dlQF<-R~}9NugvON_Qm7@GPV7 zBgPT$+nwQ(@4$kOw;AbP_Ops-sTK}>!m=+Fy@X|+jnXUKN)R*V$iY1JB@D^2psfI= zEX|H#wr11Lbpk6ZS3T7;36&#T79<8wnlQrA`J=~HVucd2l^UoN9k;Y!RB%iSxgKAR zNqyi=v+rFVaJ+57s@Vmbe)=!RG-UU#Jn_kGdR9In?mO);{P9hB-(77@mlN?lEj(AeH^N*Cw17(zRk?u!8G}vS%L66EWb!0XTn2Ip9>GjP@2##g1`b2 zK%i`3o)I+xy1>kBEK8aX%uo)!j>VG>y{hp?Js|C60&r%3U5|+yON;C?eG=s1u{@TD(XHsB}h-5g(3FT$doq zElY$jJioCak1Q{eGG7JXz@jXuEQzBP?Q?8gRE?Wcg1z1Z{CTStsbyq#Cs!l~u2AU5 zf{X&bEb<&3TAXEIuF(U%nGo!wZylj22k_G1vp7( zozVteG{yNP#-=u;F$f6XOK026_F8EavVksBYj9*h)9XI1g&TlBE_fu5aVCQE<}r@) z2ZS?EKr+%>J~YM$ycx3)B^h03|I{1A$)=?_4v*2gT}*4UX(Ijbv%N`NlsvzF$@k>} zbnF7?{}31Fzr9nSIiyC3=A=P@_$Ne1o3E@jp$KjfTWSK}m(b&#a2`ic6Ekng3A(e; z5Q=e#a;MPX9U+qTU@@nO*j#e9wqjU?Rp9`PtzTi7xVc91+-`F8{ZT~#@Kpc2O%p|d zyb{`buUs#z!eDhI^`ho2kgl5OKUj^8)> zcO6vXDs`tT`J`7aGrox3Zb^Uvno5=-mlg-xEKFHYvV%9ckKRVuMP2NlFcTtEMHBD1 zY3;tySTNX-wC<~Uf9NZzVX<8SFB@Sv)9s+Cv+uq@Su2A016M5}sD*GLORjB#mve6#ynT5jCm$&IF?! zy@)9OSm;@=o1kc5fLBA9!2O6f2!Fs>F9o_vFyXKcGY#{X@tcL4)cLeV6@Kv5Bwj~3 z6()E~0|Z7a-9guQgDz@8!*1^&4pf!ES&Ks4b3jgNuuzYv2^nxa~_H0JQ++)&;;XyIPi*OT7-?*=pFb$x%0#jqgJ^(HX~mFdlvg z@0g*=&T%+fj>RI%nU-g0dM%k^N&vvyf|KCLJNZpk?AJPRR$xPBaOBC${)297GYOz& zpUihUSX{9hvjUDX^%}CU`pgd62P_lz2pFua+?hqpMj$m09cZ_%-tST^W;BkiSQ4j- z->Q>QY9%ukqy*;b(~O)&&uCTe`N=Yix-F^V%suH(PrssXQHV5!pkr4>n`z`o#?j24 ziS!3IilI5rz*uuD4;TvONvtxXKwXNw9&h?opGpX1l`z2GVz)sU_2!+yG^Oq!{(qf> zh?tf7zq2W1!zJl6romhp3z@@U6DZW&##jV1$B0`SC@p_@0yQFodRV6IPD@RaYb9yh zZ3}k!l!q#Xno|{{7=_7xNUK$@6dV-Feq@oX+t>uwH#OLd=|=}B7U1V}k%yqcI0)#B z<^rW##xrrd#4M}SWNTQHzYM^_Fk9olZODe6QY^M;e`_Yd^|Y$PyBVojwq-}*!W%(l zS|vDj`o^boGWyJ>bgKmM@`45~rd%-}W7w>3bAV$CKuwl)o5&1`-vEmMP?1#S44lCr zwcc|sQ<{PvH}G4SI1EIf$Rsc`QTLq&#devgvLSM0j6%Y< z^Ykf>%%?|oT8{yvaa*uc?J7^=L87cnWH~`(Sg3lZ7dOv!0g3DPdg!S^$Vy6 z<bKdd*%*h+dj_or{%FfgIA_i&g_OC z@1{p;O8dRb996c1tchkpy~-RsBOnqrp4K3pX-b`os^013Ulu9&VHTlQ)(V3NZEHVO zuyGJ~Pat7%fc=Ev-9qN9?<<(gNhG!pjAUI~Ay_NPncZC=i1R~@pC*M0s|LrOT5d2H zqD&iA;D`x<;Pfup9LtOvZV({$p2Grr-Z)0G^)j}c)*(ms^DsSpp7|j{e%!ug4WRZ! z*|4}nvCX*+VSckcX#bEnj1R;ubZTDRAu(9>X+dl{Z6jQO)j>9g55v0(2xw#-Edb4ysld}(^RjEIAT+OA+oyc`KTEMC8uz{=Ig zYha$x$|q57k$AP@)(2f+59xfGtLUDvuKfU`7GO5wign6-@3vWj=+yYBCT&K)c&dGX)Is{wpj!i-4YzLJ@BDx`5DJlPiU z-2uLI;w6ii4|JMO`wKcvo*HJqJmk0R_x@tRb#c>o!}lS!CK&&jl3T~hNu2ThmpHPs{?+;3CsNb*H=m>iNq_t!dqhh462?@bp* zZYz$71hCw9HXgwdyAv~pISd0mNxe0zLZpWUDw;@8O~Sif!K9K9N7ui<97$j}LB;fh z6Q}Oq-{AzXL%3M!PQn7}L_dZ9WkpyvXiqX}JW~8rL-T2PwqEfBfy8>eY?5VSn4s@Q zu{q@1<4i7;6<`LV z{acjO9)0g5e^+UURw>9=AIKsZ&vbhveY{xztRiG!hHS0VVVdok?M}vLU<^I(Up8mxlKWdsyj5Kib+rX87ES$WhFGCv!?zaszx>Mhcpb$#F8bM!e`|GC_p${+BUa}p&Cqi&dGNQ%i|&bnCuJRXbzq(YEDZ23%Pmq!{o#>fuVfGIBl8_*^= z#FWeVX~JJjz_G?4(>UO-i+a77c$FZXpg{7H_bugYEWc07ShF-B?<4-x$pq%u4@;AH z8{^sqm?#K5gm97cW}O71)}nTU2g0}|av0@Pn&1fJE?`;KZOyLU#Yit%0y!(;mR2G> zk^Zt->I^OdUb5A~|7pkqr{9L!Fz+ zeFP5x+1LRM=@P>Zr_m4Ls@R4wpvfHitR*qmnpu?>=M$>v&L4_IOG6P~#(Nbz-jk`8 z1Y)?DavNqsl*vZ~T#F9-l{nr=v$2+U?80e7H6WCDS!%*Z4L55M&2Z5Kjj0L09EU0x{I<2*Sgp+|CwhabJmY{PgtEq_Fph9V#WdO2%gk}~&a z7C@@rPvyf4$NY8h@L~J0Gg-jY=!(z=Vsvz?iARoCAW#0RX6%&~Dg#P>q7i~bZ1WMc zG!|o+Q;pFNo)ti6xp4} zTu$+@nUN@}9#SR6>l7yfg!wng{t809_OK)rIm~_qM1F$Mr76$W6QQMG6u;AKg4;-$ zPlomrgpMc6F7Gt^i9s_;{f$A_K>I!RwiECi1;|#1-R9Zv zo)x?_yZQC&@8`{~pVrjzbf=n{3(?7KbbaqGgQKf~d;TDF-{i(`fbJh|A{Gk7;2E+=hNx!tYs{CKM7> zqx^$82D#NK1zbBq1p{2klGD=XA-eb^-_cr21nZ+)-brTBJSx(8qyO|_<;#i9$B7Z( zcr4>s;o*hH&Xg0pK)U!7C|++EWv(+$OQ5*_1r%%YUU%B+4^TYcKykt-UqJEt2Plqo zW#MYS#dBrvo)IhP)EpUcj-h(YtN2Cinc`+V5;D*YbEvXv z{`s`0NVm9$K)M3zP(4$~bhwL8!v6VYA)&=chsqy`ZgMpyk(0ok&WDYmMfHe~APYL%x+LY=*Aw?6RP0 z9L=GhqR27Z!FJN=0yG(91V znVIAiXjCz9urr^KbwQBfC9!IXF**5eM)FOdNDMH>Q<&*p1Yi(55DtWru+G)X%#d)b zBekhyeg!cC3x|e9zBHEb&f`?4g&u$d6De2Ca+X!uNvk^Q_k@ef5EawQYqR-ti3fGK z6&bjuGZb@JvI>S-fiM$3_;?IH2uUQA2tiEqJrkcvq<+Gco7AgNzC-|dCsHk*yYd~@ z$V?m=D7wOU%;?G9*9X?emY)qVP>Q>@X1!h>9DZo&T(LmOBqA@H+Ty4JFExId+^9WD z4zJ8SoC_q32s~37=BXnfe2Qd)MzikaGhw*xWQRBoutzB%<1d z{-WIA`}g-y$_@=KnW%xL7i)Hjz6U`&SO>7|oz;EO0GOm)+bW8KdgS9Zp0Z&7r8mFp5kU3zn%mVU~o^unGpl*(tmaj~R&C zkbFITStm*!`4yqsq@_(SdF~;L2ThqmcMX6rpyM!Gh&f81nI{emr4Vh{gh$U$cCf^u zW7(#P2|Z!ZyLSzmsaG@qLnUL^4P4Cvc+3Pc){9bi2?iuwLTT%v!4R+%Wt=r|jIomu*jF%X7CYvH4E=ZJXEd8m z0J3j+(J!WXUoy|kYFtKos0{ALKeKDQ^H?&{h8ePsll|V7@*fpT-GoIA4>5LcWTe}@ z+jdd|{$*sWuQB86>n<}HZ?AuT|E3B(FCa+>-TMNsSIIRU@w0vtfXoy!mF(Ok{5w-f zLg51BT&FfY6T&eNpHaMiSv@bpUjn#zLGptsUKFYn_2*#_(4X{W;`C2JI5kS$;EKxp z=PCK(^c*H@559zZ-{PtMub$_~D@NDx`Rr*PNpx%E%Cc8##<&~` zaj`&VkPl&h+2PnwqhTCr&>HB%Z<_s*j0Kv+gL~T?hg7|RBD9L+JaChl=#VQlyC<0Y zDM^Qxr@OVBJ}3j5yUR8^RSQ(#mQw(5OHt3J`^30JisO>gKxR=y(5NzCO1fbSeh0X~ zK0jJc?LeSWi7F`#;hyN~VhDfR7i6Zqm4K`r;|BQ+gE+DH|;=R{Fp0lyx>t9an`IEEK z&iu|TzVXS{d`w72794PB8g$YtPFEKZnfrqPO^Gj=%k_Eocg;)>sPGvP16{(&uXY$9 zr&r5H)kf3e1v}}?*S)xJ!kweX&_)|tcCGYYrrRX&8EI5X~ z$w?N)73=L8Yyine*bprsgrR2OT>-#x%$2Fp=T$d1UXb+&m*94~oPl3$Ig65(N7xuJ z1#HE-^VY!LEGjzCgw#$AZG_R!ilfbJUC+8q2(!fbj&IT1$YT2f5{>A}`108OgFytW z{Q}SX`e!h}ATkf1Js%9>4W6%=;Q1qBNru(Kb@IqT-)5kgKGA(>EVYdJO3#EH=#D>HSx ztG!*3R;o&7u)qS~RP>;5U&zrP5L^RiX&3^@m?nlp+aCf|mXO(6Cx}FkS4ImwM6{{f zkILGBq>v{Vkp6grm^tk!m_0WSX3GM2D6a~zSQGdYrF1wBQ3Q%YH8{9fQ7?knQ<+x~ z;Za~kmoqe`=;u@LEkx}kVdCp}ClF7>(JT(zPVf`qBLcOw^Ku`Et|QMHSZ%AXLl~}q z><}FSNeSuTQQ?JOfDd5;a41QkP|YJR9-ZxR^Kcc?Ei}Il)ICLN?TweglnEzz|YjWSmzdr zJO7S##C1JPbQ_MQEvO|mu8*vwJ^EAC$yJML`;vYty>ndyJsv~N6k4vrRy3aGBkrxa^lZMi=k56~qjrPPyp zhiNIjo&o8Oo2WVV!dP7_GyNUNd6>m=kX>^)Yf&S?k!TO@N{1u(%;T5M9Fa*>=;!v~ zL5?GpqO06qaXU`yW}05i;V@~*Tjn*GsyQgfF*M$b#r$R`WzhQW?1~2zOvby=-qQ+x z+qxbz(|C3>$)hLLP9z7E(CAvtPA_JwTp2P$WlfI16U#r(AAeh}c?=^|ftAG(y%ZQ% zL>j0l)Ggj(0?J3EFAj#k5IB!BBc=qb9QD!#4nvxN z@djpXBtS1(lwm%p{W^i4OPyWNR59VT2%_Tll%tK8W%{7^rwC#kAzcy?RCK90tuc@P zrxHF6bh-3|v+EXD0)d&MLEss~=5_3Lc&)6BgMKDdZ|dGfEwL&~IBoZo%?B|(5NOsc zX2QQKvw3PmK7nh-)1 z(`?31&?6J=LQe;fv#{xYsodOQZxyGe+lvr_0z-I7GiNH(5=XVgGd(Za1r;rFg2-;v z8PbZbvjM(Of>IxL)f)bjd^xO$JI!4qUE-0?mFlt57g&HKv%+H}(qY-cKqC5@QEExD zS*#{RquX58ao505n6==&jGDJO;Vz0aMQk%$PP9TEoN6)>YZ^Tn8p39n+fKC~)X@Tg zKwDPc6VObG1L=u&e8z3)_bJ|vrvCG}gpskj@v#km1Buq+IhOc()WQ+iF6cdvu+IyHx&Q&=Rk1p|8+B#bH zpfK1gd|uu#ffwJG1E!oenZm~B4iyeq@4Y@~KP4`L85fLWXA)z30NzQP0pg;Z|npzc7y?ec27C7#7-f7P^Fo} z$#EA`#GE1M5TU(I+~Oj8oSd<;U#vDdUQCDUP&MZFU3g9k1vZILZYXEe37(iE++&!+?RK75L8sXTbdyn_no5`Pj^}y`fh7h%W1K z*Njkd`d++`=ei?SmT~sNRZe}4i6h1IV$f>fJQLtJkm8cTf%2_nnMBx9x;&Nhk|}!$stkDj zGDIIqYvEFgtCiHVC|D<321h&7qtC1)@i8%^J)_wnAQADeo!E(A`StQW;={Io1{idQ zdsep-HhV?UPdQXTp{zr_lGVThXTk?F%bWnZWD(M1yuYM}OUwe=L5*xB)CkJE-`~FQ zT^)2t#r@CU^ib4D&XC_XpRmlNW{rLTgKsE5>4eFBN*;U+bom48cp(hHm`1Sk@V6GV z*#8rh-xKNpbCRK3mcgIvizWO8=8v-wjxLZm#AvylGjRr!ODasUfHfZuq(qHEh7Dxo z*{_-1Uk_o7LfU*pfZ9zr`Rgmo=TF!hXOed@uIWRX&Fp(>Zc8f(3#!tOpANd#-dE=C zfJ?xvGe8!SW?W}Kce3@5$obZMG_kArv4Fz+|5?S$Q7m>SfRxj3OHf^M__KV8Lo~|b z!ZP=M6&F?(7fJ&7Nx(9@lcv;vM>HhAF#H$YFQ=67P!#5i?*w-V==5FVC|?YPQ%3;B zNru92>x&hlS$-%(60Nh8Kw?D9F_W^DDfI(U|IdFNQNleIrJFFI$vY{W!68p5$DJka zJ4cGvnzoI^p(J#4GA&SBXNG=$pUUrv7y7imUnEiX6D=(cC_n`(fl}l%xkw+-3zb(a z7smVvmxu>4@Q@h0WVv?=xd1BYR?PL2GYvUw?1EggwcE+^k^@SD$!5Ea`BV;Qu2O#( z1d~%8wKI{?abJWhZ^da)Zc=eGj~d)wB5KZK;x>AAsGH+sr(V{^mWr=Gv8~SP7!QMB z&R5jYUqMH5nIF?rzQT@EVtH)O{2~y1M;-KtY7a(M1|Qq=L>==t>JXuM#nTv{`7%CG z7?2@)3Pxo$Hkb42zi~ZErt#V!)RX#EpS=o_Gb9K^Pmj+sap3%%T7oy++-1 z#0s}1_o3m0^UzH}#;^wY`J}L6&OpsuL&CN*0oPIU$9(mYhQ8Bt?zYX$(3V(B)%=l+ zU(Ut9O$l=b#0JN!XPl<c^^%7QK7M#Aa zu_4}uH@qJ>!{N|m=uF3ET-6ybTfqQp&P7in)voH?i#rPk)%#Ukj-II){j75#WWd{| z?Fn8uBOMIx;uahGoeJWAb1Q9JQ0Rui%AS2rv+_4+%IB$m-d3OIIZr(C>dIR_Z~Z*YGv}C}@9`ne=RKe2OYi41 z>Um#1FOE+vEtOX@2j`s6*v7f_xSAHD+hf>Utb_RdIj_$=e?Iy% zh@Ub1{5fMiK7;ldpEIyAcArrkpI?7|F`16(Z$G0QFCXXW_?mMu`e*3R%Ra9;$3G)< z2D^V>Ux_tvF5rw#b1Y)CKbPDpLl)z5{ySGvx%kg3&zsL0jQ=Ww;zYzUnbNr%m+BFV*meprh)y5~pzU*;c{XKe(NrlBwfayNSKs3+*$DF)IZ;HFrS!&{;^^0{MXNuXDZHa#hS*x%%xGW9%Vq>dCt$J<$|ht+|JsoJUS2J>|&!H3&a_o3p#K1QXfB)wcEpj#lnu! zh)w;}`*rqT2?upHSsdb+vWh#2D{rq^t=JPD)HsLoZ~@0|v-evIC&9lTUn>?Oo8WkX zv$k2)F0NQDXBWi(-@70;flK{k>{f9XEOtRGYD{CerrZMW!eix+v&VLcL*y2izqi1S zg?f(v*A6IHWIia)o-G@va86+5P93qYzfWV9+yIju8QV7ea>HDm!3+z*7UQu- zB^(K}ai;d+<>4{UvW+Qb#h?FUicj`joQ?mqW`YJOjbG#6X-Aj@O>=@rH7) za5#x))1ON_<8Ve`wc9m#XH7lhxI;Vo1?QLLOMSU;wnCTFdWBYaIhGte|J(uU4s!hhBOx9 zIrtgFGum8bIEP%ROt)+GdX0U(MhwU&i2GiwBi8D6_+pFRQ;3rd7Z>M!F0R}m3Wswp zmnmN?h`5|M8n5B^v9~{O-mx-tK8tJNbe;M!F)9oSt0+Ejem;2-bcS2Zg|Ko1j}u;T z_%lkLJA3vs&odUtjuYn82BFxD1s@-~!cm@K(H?D0pTN7*u#DzyR zJjpe}utc&GQD1mk^Q!))MBO~<#P@{h#G$4PxWq7xwS;$W5o!9Zx0_m>_rzg|O^^Rg zPk4-T>EumjPv>*bSw+Oidx>6K*Fi_3(TPlpabjFbCsN7Kqm$QRvJJx-Wim6`j~J%K^gJfRF)4-Ip0Xq(J>9IV9m_Q=%E%+E^xkK8mx)7KY;`QqF|s2Z=Enw*5jC7Oxl)YZ=V6Iq zB+2e3L$#ZI$F-8Yda>0X81ceNH{qOrWSK!yUigpri;Zt6C#LF`#k>G?G+FRfCWK(6EMPAfT@tolLe6doVDF^ zUbSYCq_OK``Xh7K2$~eI6dsJh^CTukP9ITh5Bm(5)$3~_`Xe}Stfz17m`|2|PwT}( z>|{L;2^&yCi#G#8km}dw!OgB>yG1JbM9v4u5kH;hO5$gvh25d4ezGp(0j`T@dJe|t zlOsQ?;%~a(_HFg6ryu9j!c?$f&z78lA~3lw(ydo!c`)5$5;c*Kv!p&z?}}s^+n;0a z*j8bTFhF6J0{zp~9T&?fcZUKLQg7=_;pZMvAI9aFoN{5so(DXO3=p*A4QeILc@h$3 z+4Xj&D&~oSYXR*cJbDVkSB zMiXxy8>iSzrRt&d!Q zLEt^+sd=6;*Q10Nzvy9X3eZH6MuJGOrGz-y?@wTW56+ndi4VXM9TTZNN?^zX#>Odn z@+SkoW3U2?OhntT{f2)L-32o9l!zH)1Br}^B^wJ?pAmWGECPA%2chBV2GG z8K(UEhFn%9KVMpRI30pShRf0ndf>}nJ+&pjJTWVA1?_q?*vzYIov2DMz2nN z0k+gAcWn9todeTyCKNQkC7#cc2w1)+0LeGpZCnQd17}kigC^u3pI-ut)Ri_bj1@+b z5Wy^qpBap^iD;ph#wLiYRA3+GMN%R*S~n?6_MkHfG1?Gl={<$^T{n^Q5@xsb&BD4* z5#Wz47CZU#q%j-l!^9FVfI3|<>{eO)A89-B>(GJdegaodmSlB;lZ|U|4Gju7%GE ziBlUCkTP}cwvZw z4{~>cP%Vx_wb zrhsjS1(xeeCMvA58C+bo$ogaSOTKvCRM-$bjcCQ#F*=RC5?55+Au)Ekqw-*=Vq1I> z&m6kmP%LwRxPsX4XS5q!j7j%{ISM1qba#kM!q&z_1l{pDVCh&z&RQv@sI=DGP0EjT)%k8ojl~rMDCjy zB4!iv$BQ3^)lu!*ks5U2NrBm(Ex{X&7mushT}BMTeYnd{c2n`>mF?dMmcS7pZ=|Qm zOfv?+n-}@fkKaa$%ltiRgCe`ur<_ugVE3&c?g#D7qisT27YOn)>kAe4+J-R#htfP|H;uIN| z*uhjJfj{7ERsv6v*dO$9!G}UInEq_zf^iA3fl2I_5Ugn_ui6PHI#$z-~AfUPGLy*FcQ~wEjGJ z@`#hlnE&$+z(>rlB!*J2GYQ27foSA`<_;ecJCA6=z$P}#R0nWOMZxMNM7_*bc2AX7 zO}Ug}K{#OmoI;=gy&JZD26-#1%REWq-q)l?qim6}NL>KjFe`f}ytRkC?@kI@u&!L< zF}#|<>H7#OXr&z#Nj|YB1Xqkgeki|RDmA^p$+;Q-hKE19YKiX6 zcP@rH#Z4T*<{Ih*IL$Dty3}5a~D!E3*!Qi(`7n&>jkb@0?0ylEWNhYAY6)N&FZC1|V^T5OXFzve;jV zFvHX1?L4WUw_EwT;-q!e{0iI6;a4m?pYjw?21 zFev1^$$d_hGHRZdgo4|Ap)DdLJiro(<4T-0Bk=$-lq!TfJU*w8w*-^{d-U|1 zg`|r8Nv-Y)0V4bWfG54&qgk+zw~8&(V?UOWwS7_77sqjXW^Mnj8))eU!9v^>Ze7D@O{ zrg-lrq1L-FalvoVFT_t$@jI;F8+0S7!ghtl5GPa!_f65!-FWI3| zScO*&+)Zr3JVll_#|>vfiue8waaku||3$-tA_dH*(;aEkJbiVKbkc zpfH$}xl^14fN}HQc!*e51tKnzard2^@z-JRWnA}CoCJ=U$+2)x!Y0B@_cOM}r4ahP zCuc0g|5$i{bKw^j!Zx7MdaZ=$?vXjyb+13qc{nnIV12&-t|I^QuO(&z;3X*^8I!uv$j!$w!AvSFbIf*A}z%6lU03o{gdP;HGA4WaH@qAjrJ zx;n6&qYuN57;FZLXvmE@6}^7;Utc9dvb;7J7wV&4P2^4?dmML~7M9;i_E(nhmU94s z2(|{19Yb_*&oQr<{RH1kN80*?QU4ILFJh8oRQEsi96!bES0b!nZl$*3KD(xhrkOO- zKO*;)Y0rUc2?arj06YOnquwARGu5SpE2&so5k9&Y2#mu%`Fq1j6jH29Ltc`WVo(qI zv`6L=ME9Q`d+LG^@d0&M3{f5-5uTRf4LZEYFc1prQN_QYi(sFk;6(T`G$qqsLr7E+cyBp|53+;2@r>!^4BBhbk>M_Qo~H0K_9AjeDV{k56OqdLs_lXQekukt6ut)oE1>Y@@& zpZ4`d05USOoq{JAiIV;o9}F%qf0R^S7yM5}WkCxpACx|L|DrO9^^;l@iU{TSc+d1t zFT9h>9KW4#nHYw@ys(+zfBM_Q#p-P5t*U&Q0-!T|9~yj>JnvQ>wH+FT84c zO!dCz14w-l@C6rp%}2b$dXJryELLp(=4B!(x^V4(S?skG5oU4LYc@8Pgi{{mze1~m z{ww*&Bn1_?oIxrEl(}v;Na0*YL?h)t;DbqCLX#J`Km$Dd$Q)Ww%dliMm&ec10tM+#n7UoKT;CMR+6SrNCzcC=TKq&%p~%5rqXqZz~ni)T?S3eYbAOd8K9GIauBR~sx5bvI4Y5rHLW zhb5v{UDT|P?yVb zhTmmhvRHa$=YLZ`9k=PzxHu?PK$fJwgsR>@tU6)Z%N=cD<3mNb;)R>Sy?DI$Z7+rL z{x0a$o(m?|%R?=mP$#DKYxUH-ddhz;pRd((m2E#)Plcm{nDWf>3ch}Ne}1nc_^Ovh zTYvn?flOO<$)jUG%DP05K@_>YgbXHrV8MnMv8erq?H?H!Z|jjvHioh4)r|WXuz82j zYHj(E1(b$deqsS9cqsqNLVO;E<10bITT`9dI7sO14AAkD=6hYhA*d=gz3wL=*0#~nM*~8P0gez z;GYQyMaq z|Ffi1DKpEDQxdclm0SM}5RpU{x*)J%#d>p9rXGI`!C-&Go}Q-)dE9t=Y|-s8TuspT z7$=C8xiWr$)Wm@8sGlcv!&QKwZ{W-!EzU|1xBn~>q^*cx>=}eB?v!%W+j*uZ##4#J z3po`bDv&jGriRc*zU45k>N>@#k=>3Kp-6x^En2p#XoSh8Id`B(aa&BRvgrdt%%f zWY@&0OHjz_?o71-iV2>#xG^GyjeHSgH7P7UZe)I@G;tuAxD?caesQoby5cW{9N0Ck z45@hce?r7!>HendkYh2R2I9?ol2op&}!Gv~7 zf5*Fxrh}-792{pUYbg6#x+PJhgpng~#ZzU(dTpFZnI|#*$bn`Gg3H8NBmW9f7_xFX zEkAZCY5}QAx6e}?-?I$WWj^B2J16B020g7QB0P|5MMigR2iVuulpqj^L0e+RFbf+8 zdX`rCD!ns}NfJ$C3!^(oSlh#f z7yN$fAXx!yjH%HaPGatx`F`Rb0Z!;nN?7b4{@@4PGX9Nl%)}41_)mzFNQ@3_CFSw$ zF^C3Hj-OYrm-6@vYH8%CLl+)Y^9V7@e38jvdXe=2E=V?qZe(vG2(%UW!D(~ATYtJLXCmP{$-rauvl4S$;mB(acPd0=V)6(H6w6h)u#AB&9l)^+UIPezvPk6k zDwG^P3-y4AEYShtg9JorSK4)iDhh0&muzs zPa7`Q{#A=eURF%l)Z+$^5bFD;HpP}0HJSw?^S3A-xRyR#DZjNO02B|QZp0gnvr+2{ zYeW{AdB5dBHETM%#ec0^Zb;pFz$J~Moveeepv=O;)>c-ldb;`wD!Bq6C@5K<6t2Rf zJ(*$&v7Cv6%NyyxH)d$3nUMcb3X;|m9Db%^pGgK1Cb&%xq{W<$&{t~?DmZtQE+ zJ*)?r>PyPrndyz2JFnDw5w4vlE}^lF-@a$|%&{`j`P^23#$dE3%5s?D<~0!KrzG|3>xSE6L}9%nz~ z+=bGA!}_35Uy0JhKYnM@k!P zH;dZo6M+d5^(V^aRNE7F`}&5jL~a^Te>-kZfX)?=$yDV2!q9%=X>)YIkfDfYW{glW zV_fMAN0PuWnH%-x?)H&*)N&n5Rc=LozwJ2Cx_1%Ols%T$Av3yG@zaI<4`y@oI zqw866W#_6a_Js3mRAA#!)H+fn9Ui0GmZMsdX=f-9YpSr(@v%ZxV-2;;H{^qvCK)CJ zOXx+qT}xw>JIj<1K_1S|ny)?9cq5)wt$w3{LSPCJAlPRd8YXdD5eZ9cK7!kLb%22Z zke9D4N*J%yDB3*GsS~?6707bQSo2UBPNV|_u+!LXIxt%{B{+8PY3=!&yN;&h$NNu!|3E@VMqTe3}k5+zsJTq9Vc)@`0;@pQEd zEq~~jK@V3Oy*;W$3tG`oka?JHaA<+N6lMv_I*`Sky}{^2Gvosx!V|Fd6-r& z(s%olptj6Df0$o;n$)|}i1QI+#Gy*de!wWxN-Vcjq0Ryv63vka(GX=J8ZMivK~kICm2c$H zyks|R%f2r(?ukn2DiRyeKau|?ITuI=oL=cU)kl;eTR>V5=eRRZzv=SOL?-%#G`g52 zWC%z0AWSqs3r7;>iChe{0HNO=q(vizT?=nV(OUh=QCX{YJNi6us-DERbsU3+H+E2BC7bJ4+_6KRHqqktxZSbV}(m${vq{A79*8qin@$@zy6fOO}@WIhTdt@nORQuOMF|*0QQ7&w;CqHc8vEg&)HSmPSaQPUi=bH!tz? z3(5Q8boL)e-sZGPZzd_oe7%limt^JmR!teQl^?_Rmv-6GxcNsb?&uT@Uuh^iN4DZV zhjk&^&7rn*84<9TCo783UxePlPA>MIxuJmC4}}2edc#grza*~HX}@PvEC8?61kfd- z$A&K8cSHl^>qN+JoHsO3VBd~e1Q%s3)j=b%X-Su?lRf{~$$O=G`FksWt-TVDGNMl5JWNcc z_hQtEnKemj?^&{#yyM|Ao`yJ_lP@*Dpeu`RUm0vPINk(c&c}LJ)o_mkjj40J%ZjE{!_7_N4!%J{ zgb5Fv>7uJYlj5@63!X_P=!TEuhah))n!@YB-Mq^`L{{rP&962o#H2jV|H}7ffR(ua zP(##|36fc)w~NkYxJ|1xvpHI|K}hx|iPS=>;%Qd9J;7sCGkxu03Ke((9L^-HO$%xb8p4JaZoe4u%8 zm#)kFH4aK;HX$5PPA@DRsJ2LS#SSiAm!xBRfgV39mZ#NgkHVVzc6{x5!OR=H9#fdh z(^Tr>QA~wL^wh04&1&QTyq}VdlH0AjIQ3kU=zCuKgjJTQ4)*4&-YAI(e24kT+Np^PEOOj(qkp{f zme!hI-dSzM9DjcQ=UdBmM~x9KcZgL`F=bZ=O`+}4xUaO$+o7Cfba|3n`fQq_WaJo^ z5$=w6$~pxGIOGDg(&5$&pCitJ>JqdL7f-4C={au41NXVv24Llrwa?rUA{qpzg8ON) z!U$JdPj&2LL*Ua}hz~XISP3zcM8T9LTew9Tf^8sz-&RA#R8fbDa~cupJC{4D;6*Tj z-z2|S88p)upMY$}4T5IEB4X((ybui<8Aav=R2$O@+*f!)^0KB>uct+_H&?yA`fQ4% zG065>_?nFO#2$s0E2G?~#in6kKT`Y0_r8A41x9hYD7A!B(;{H1sZPx!qK$~kh1;{A z%Zu*rX^euikAA(?g>ZiH&1r6#bRw$w1xZv4dSp7GKunu~Rxt&fO1Gx^RRSdG2n<6Z z@zmJ3^_Zr!G8(!`bQoFb>W+MZ>~iQkIt19}Y7I(O$_uF4C`=%=-2TDBnlM8W7n{Jw zg&V6&QZ@ou1UPJE>=T~_vtXoy4y{UTNx3f3B(byHfCX6Il;=FSI& zDL7AC^=~m=HbGJ3aqBoJ$SL9Ywnjq)kYGPt#a<}_a0-Va>GuAX5{A%(1@Kv_GMsw0bm*3Daw_&YNh{^=3G{|127ztS^2Px+=vek3u; zvoFZ8%r#6M!p4@r5v%$Cx_Kg$)8$FlA3Vu_6aGc|bSi~2iE;eDMQ~SOA796-1a$ch z*-o`G>HJa%5fB+FTmTJ2_^3_r;ODDZ?%C}eX)_h;x~MfJHtIe4_3BUvN|8o20$KMj za-_hQDh`+!Am)TT|wEWS%-{ZZc9#Cq9#4Ql?kC%h(55ks)4$vj%Z_ zVzMnZgGu@%4EbwX2+mFrXDn%Xr3GBw9*}lFB-AHDZyD+zWc`tV#Qq>IYgxc0RoE!O zwN$reW4@<6nW}UJU>?NIvRFEBM;yUpi^xb5YJ098s~W*N1}NKlwiMAN5^J}(cd9YJ zEliB5$zQUUilt5Gzi z9j2b>_R`u49i{?f3mVk2r0bimp`p?-q04DgD;?cH*Qo+Ib`u&isszMi@&An@0SopI0&~*-f2^1ANU|9};q)KIX_jAbx}o*|fYbAH0)6}! zVA(k?umhO1LEHyst4h0U!`mtQm4K(1tfByFaZpAL+y59=kY=!+!e}O2^NrG}0VRh) zeNq;+zdQR>q2SX!GKMzHK@hVAU5}+Ho29W>0-rb4?mhR|0zoKN+k;VKM#s+2j|Jqf zUMXqMj#W>!4Uuh!I(IH=$)81nLR(fXL>Q{9SWERKJyPAX&3rjp;`di51$jZoRnp5` z6hnh6E|f`S$*l4x*1G=&n?`N{Tv55OSAeSHhFyujf1zD7d5Yx;lwWXHqFKiNFVY{& zYA4#onU(nkcYz$EVfao0_vm|wFJ{Jo?v~6SYk`?pt6~y=d%yit4b4gISA-4rDY}2W?j~Sbq5;^`rTu0Uy=+|#QwND~UwreJz>-efW0hUCmLm_EwEi27&`yw?B=#u;q zNkR8GsH8K=BhBOBie$s-mXKnHjv8TPdS(E!uXKklcAc040Ik>}jAaPd&~9|W`EeOd z5oJngPA_T{Fg10J%>L)Q%DYMR(M%QB4cX6z2<98!$Y?+7aA|}v#+COd)ZJ*CBZwQa z`kLZ(>t5b{hUHxuAwt50szc5495=sAe1|MUw?pE#N1`T-Hd$o?fpl#$KqQ)?O-d-o zE-q;;cFA^>28lHx>Sk+eitB2|IxIeu|5B~;j$2t~4SPlG>4sKvX};oMM|~C21M&#Q zZNJPw0&s4AM}5c~XPPhtlN2P(tO2p$B;2&MDHquZpwAq1berBjeR5~ZK@NKd{jyMO)Um8gkdL0i z5UZrgU|IeR^S*9RP@GOSFEFQsv@JGr+7PFa)8ZsfPM(!&8uZbOc4ubh{51xli& zsNL11H;TfI>>toGac{abQNbN*mZ#Qm;~dDAwaoc`pkMO0pyZxwEVL_abW zD>ZA3Xsl#cC6agqto8vZ^)@|dO5(`+TCWLwa?>;ADAE-5+#)OQ|BR|&YR+F>M&>tH z__k%-&u`1jIW@ZiR65fu3>_C<;hCUJDVqVL{P|pm>5^iuGRf zoyl-9AiM;E^X|N#AG*E3;wCdHYDLal*3otG5&?AB!Mr2Z<2{ktu}6;CEZfULBbYlnwU{8%69KrHUEA~8NE_sW z#6{w(xo*H!34T%4X-fnNVj2MVxV;(=yK*LiX3qan0R9;zD#Kad1N?Y!6H>MV^0b7z z#kvWAGh{}FEL;^uwU)%HSK3kbM^ueMYpjfbv)Fqk9u^@^Dz_||j3>KItX`Vw={636 zEePCGKGVXYWVe&6f3gUvX93@nKw^oxdD0cp9ozbc$F+WG7db3X-~=>48!d%R%(<-& zYt^oqPvyPr08yf+X=7fqS>%(QlI;clv~*FFp>oHofNMj@k^7GwCg#hsQ0UR}`>S`L zoHr5N_cL9HVWG2Y9$tn+2qhoWi)!RU86MfOKfh>?Ub4n>VJtX}OoH1;kJF646-{x2p!Z zGxSb7c0Ny!!Lp2pqb#8xc?7${11WR_V)#H zFQ6tB!Aor0VYj#C7r96Lclw7JztaZzhG($rJsS-oC6G7+#O*X6>*=R5Q*c-nojKC# zhE#B{P|K6RtrT}fB!)hqO8@~TYG|CEpkJu%scs~U+mkL)5t`93zwT)lEaspm0fyp6 zyFJgOCNyXcp}%>noCt@sd9q4RrYD@8AJ;Ijp-hW6db*4UA~NEKo*5m{KXcGC1Wuhk z)>)hYF5=7^pUj2b_(|~Rl5A=Q ztMSHT2tJYKe%1aD`Oih^_%L6JHGjogW>aN|;n1Q|PS}Z(2Z0dN^zVv92rGO7unUz+yfNmi?hgsaZ)@$QOt=X%GT3rWeIT zi7!&drKD&@`QImrPa>rEl1c_oYqFqXd>sG~ia|8`KHUnJB-MV;reuIBn%()c28 z>qQu6iobuA9ITgw+F5asVAuXxad2-=si<+nIR5kXm=RWFXJF68p4tcl9`8_%$;-Iv z%sU2!YIsL1+UKMfd(?~iqjbT|HL0T-4LUZ!#cTK7bsjWBtBndT{xOvY-g#bdb+Uz@{^Nic?C*paCQ8FSREG4%f>+NY(Rn6SU zzheE1PKAuQTfF*uaxq`6v*DH;WAxJp$N2n*1a2joE+nPs5b9-$5QG6LrU9A?RNNDY z%FTx4P?d+3aKLsDKNO9rjoB-+4!dwo>aya^^%i)a(XI&+*v&cCS|zZm@~nCvp%noe zvRLwAhk`{+-fXPUg~%Y#*-vz$DOU^6wuH!SSFx3FwL;jIzwrM+x~V&Po`V z(MV5Rpuz_hBGN~MpeHtf^obp6!xdEGH7Vd0kwJcnAT*z!b{cS{iUtyx*5-|6$~~Va zgNmo+t~Y=}e4Ldt4;e=#WUe(KADD`SL?2RC12hl~5m>{9ax($!oW&6})9kOX?a8ZC zq#K$z^Og+Wsw6ujp+O_dF{T2=IdND+P2UqE^aaA0fUA#+ZDN_8J>3sl(cI|_s3}9! zPVA@J@427)+^ZH6gO&qo||kTIw$YTfE@IdTa7t9o^a;`@He7ePll3a zG2n`YZH-Qdtg2Emb3xq~Hf}N!-Ig5%jJ_qt%`53D*R#`H((El&hOSiakQV2oX^IYd zkI-XFh=ILL{+j}f(ymUUJ~A*Z{aoZJhDo}GmN&-;Y)Gm`$g>4)|FDvqe)=H*j~hSU z<}GVyo8c@9By3EHyjuGdO(Tjk#151vNKMpC1m&phlG$Gw4MO)WOJL|j5k<9^(79Z` z2(~>G-X=J#rCR^%qte$D@8tVSs8Fy_)8q}jD zKDO_sSFva;Sb%q{#yY`a=zN|?%9@oK)x5E~+N{V*bMS(FPdb-_GB@*kn!*q(@wi^^ z5qpZ2ce$N*`-hQ$K9!2B3GW%;677`oZ`4$xs|*GO&w4&M9w+^nEK%qMIkU*EG81h9 zT{h)KoWTR=Y}SVa`Du?fqH}{l17Pk_@dzQs4oa^S6Uy!qw16d4b4VjKTNc{Fe_SeL_yU^5w-BY@bclcT`#ds}lys^|MSGgjb93 z5geYC|Ck!N$l`5bRG0xqltTr+?YPG{GrX}>pXSPWw0yiXpEz$Qeco$uO)NBc@f?q0 zUHEIS|E!U?Ge@pT!{~scYIT9}dg_1C-dRjAgLAL9TPc^=INyJt#+LQ>6Uw7@G}egM zcC#H75f29hjPS=AA+xI{Rxx})!bALEF7u?=f$Qr8>(7IL1UPHYX?HN?fSD~1WtR-b*k(Qw!a7sI*j` z(enaL0%~eY1gDoeUTKoZ)TGhJglt(f>)vXM)~Lh_aPc*f@kgy>^wO%>^9)rmxu(lR zL!_1v+$@jS4o`UuqC?G%`AyglC&LQ~pY%cz#=s8Rk;)h=GmK{O#LK(1)aM*a6^^=? zf;L4<)d~>0rDeRF(6h!zrQ*>fjMYC7d^E^o&mfF99=B(39 z@bS6cKG__|79;BN+>8k#p^2eAO=KvE5rZTcQ8ibVtU{vLH!*^zJ_&=| z<`FfMv}T&X%sHOb#c6CR>6lyk^(_w+a?3QLT^m>vW`LYeB~O+kO`+pa#ryGrQ*Dt{LLjqQkUhseLT`@=^On0d}~?>uT*7Sgdo|3Wsie4^a_! z7rDNcb@B|9|8Zvy>%%RaN`)Nkqm9H7KC$L9=N&XG&(b)=gcfql?6?3l_VPDmsJ!wk-P-}96&($|-&1EA55G}$Gr)whK^-A5IBvL_u1ZE>0ywxzR zB|M9@YRS|ad1M;gMg09_tIxPSL3&oRKCaRyzO?enN{TYFxyw+gq<%Qvh^%r7vyxS|Q0afwt?WN2<*%ZZ zlArlUn;eRwez)=ZYGPOZqkv*2C|Ie4{^QT>Y5L>Od>^krALZk+{&>OnbK}S3)8X%( zjB@K>Q$AWH40^`9Z>(Jn0fFo(spxqt1Cij@3RLCW)?8&k7dt&9AvFs?fb2D_-qAGD z;MSGaS*N^hHyn58-BRNS--Fktx=edQ{RISzxg+kOqzqOev&2D9eNq>6?K+#L%p{ik zxn^Vvlc-`_QMWV7pxzb7xMNotD#Rjj*P~W2!jg})e$z@XA{$i6vAqj&L^k^N6_(NO zWfxvpeh#^=D({e*6y2|}vijcwl96a$8o-f-LzvOy+$mYW{%~3eD6BazWDrNN3ed7H zc9n7jyQ{d*IqzEl4`WK@!xdwP_&fWVM949|DuXjFwIYbLkS)wmzsRx6TH)@{RZN;-*BA-^|=Av!sYdst1X zNg13$IGv7aYS$9M+wKo;x*%G2gTTy|MC@okIoNMAbwx~-Vd+%D&qW*4qp=gAQ^iW* z+&PD0-z>x~Vbb@N`g_J1*)zQ>8K=07-clYoGnf_rZVNV&dbu{VZ5>xT+tLF z_DSf5{s4C!GJat#Tr0@ zLm+o ztnWI><|@TNXzpJvjmEsfu?XVSsak5bEnxX^B5zBhX{VCUH%BW~M3yVG@Xvs0;WxW9 z*^?R|x%X_ckho;CTu4S1qP%@DCy_a;8>?w%`T@))6`C>W?awkg%5`db? z+k`cI%Lw9{Y*sW$!z>~g_Y}R6!`D;!^!cCyHbZeYm0)^C!K(4&oOVW0aZZJZVP9N> z6Jc|0`hHCJ>yL3H$8aFM`G^f{y5a7Z!2gwPJgH4A#>RP1f8(=IHO zon0y;Tv^sSRV3J`Lx6eJ=rp1Gimn@d&*vC#`#a2gp=vrCRhSPZgbC4i8=p_z))bg5 zPAF}s#`d@b3(*u{VUg&#W6%+y2=}kLJux82_RQD^2y^mgO`#0pOAZVB{NMn zKy>ovqnNzq?E?sS2VE|R7hUs4+%ynkCk8~_lT5=8X02OOOT%-uCQ4ha-RRzfuloBZ zXEhr(oh1y1Gt|Scky?NOzD+8zbg1}20(2oGDigqdy!y`@O1e%wkllhaUCpt%7`vKy zngK+^wag>*wdPa%CIy+@PM=JiZx?=>ObDR47=dWmvZf&`RD}diTNPQ8k?$p{pN8wk z)-(0~CaKgXa4+N`K%h@fkU*u-ZSqDSCkAlPyyE4UWLghpUjt5%c-O3oX_I#-n;e_; z$tp~g*h@l&*m+5CgwM8}VHp`1!yM%q_%*GxSl>+oZxLk4OhC|ZDIuJ9u}q~tKZ+np zrpk9ZVD$2)12=k^t&2*pf~j7pAL z9z7GyTeyT!RHzaEawXh zSmbqv#>z#&4HXDAb@^v@3R;C*vQtxZ`lt}d6HzE%YpRHqY+k)|Pf3A2PUP&=5>=z$ zcl8uv9O~t+(zaz0tW>)EqQwzN5CR-;C=NKihf>b^WWi&eH;YbLiq$Tnp;`a+7**LmPkAl zbKEOI=$!d%H%IUT%^wuQDT6II@YZsM03PZqVrlGIX1HcMk@)be$N1ua)i!dW1cHw& zKn=ohh}uQ#M)wK&Swf&KhPreCKl*Oth6i^@TbcKIqoO{6G~<(sQ4J{x7YwdON-m$iA+gkh7Fs(B_U}ze}_(kM@qG`zj%a8+}CJI zw+b(chlxqANvox$DmTR|CovVuq* zXOqf~N|0vSWe$9|v;Y+aGhG?FjaOoQmj^?zF3Gcg@|ek{z8u0uC?f)VIfU_&9^V`R zUL?W)nVOcr=+rduntDcn8Nzqm6DhusGtvD?s7mmfA3559&S0fQQ1Bg<6oN0|*QPT#O8yj+|fN7mi5lliF zZCSS!1q-EhOqGln){b4seFxJj&D3^{eAV3d#m?81P2Pmednc7O!OQPffR#BfT{BS$ zGx|7W^fV<^B4N#sB5+T&%t)ypRM>WiifPbd%FH7rvpjp2Oy(TggJ6w75%$h`UU$qk z+#GG+2N5%j$%f(|1(qMZp2Bdo?1`swC}bSKR=?{tcWN%o1CepdxW#md-rY=cOxQ-v#P=MV?O6heIApD zO>@&sly!OR=a6Gk)aQzwDdo~J4e_(3?f^RNbX+v*btFV$36#;u^_+DDg!QOwL7HF_ zv}sE}LI`Tj#YIjQSso`7)@YPVp*b2v75cA(_3oV#Dj~`UsrD)Cic<4t)EptjmqpmXc7D|-3hCF~ zIM^fkWyo-DeL(gN83J`}B2y9gqBY4vwWRI9hV0vw1#hG;i8oX#zyVC2Y?F-3p}idi z8eQuN%tM(5j9|6z7g9qI8F=! zSgaMJV+OF=El;AeZ@A7_Oe*BCdMdz>>J(@(QW7^SCIFlh`H)-{J2n&f74ithPaY-} zR?N978g)-oQB#1r+J`wdWF@US_ z`~?#d3Bk8S$SkrA1HQ6v)H2D~(vHZ~*jU5N9j8WUmOXZ2d4JXzau-3ObigFo%(GhO zIY+il)7)h@l`f!L39Gq-1VMJm;EgU7#1uxNz%Onl%FW=hL+Nlp)2yR3>hwl|EOv05 zW?c$Su&I)$RDz^3saH$?!;;yHys1;7`Yoa)kJ_Wt5iC4Bch&N_>%r2&qT+08lev#S z<*g~cwRI5qmL}qN4E}D}Ct3?TLf6|km&$dvvhXw?y>PU#2xKe^dt9ZVY#=AjVm0i_Y<~xxObWxE%?}d3( z2KL-?7WpAn@3zFU>kKV)N|$`l5jsZ@5!liuLM~-xU33(f)|6~yHO`ay&8;|AqtT$x zHU1Qg8yr`&N$*j0H4;z|nVq^1EJvdLxn+-^EU;|y^-rqR9>n%7A<&3e3hcnmPqTEY zK@ad^6?|5|<`u+gE8J*31tmQ@1fT%Sm_J*3SlAS!P0zy!{-O8kBU{5x@P8X@c3KE= zhNY#nhSzlOpm)C^g4;`SV7)9dcT^%@-SsvN3pc`6`UoFEO|P=#hgp* z=bJ_@nL7NYk$odHG8&a{RcScH^2$m*U$wjQn??q|{6|x2eN~D|yFnsk4QXRf9a7zP z9Z1kMLn-~JDC86hWxEo8&(z$)Yeo{ z5DT(A+&_x77`LO#AMS? zM)&$)94t_qG|G)C6G`0LY7^&~NOOXDOtQUUh{Wk!o{C@!cp%Wngp(D>n0}5c3{fPv z?{VWIiMMwe>n)&;w(hFlH?quaAU={f3;HEQ*#_n@UC-6qKG|?hVv?2s@}n&}TGi`$ zg~l?$vXwFAPmvLUKU7>9`mlPn<;~_BJu}uSq%?2RzA}MFEw8CalzfV+vRc1PMMS*b zmJ-gZ{InG@otYIMtHO3rNBL}4oiQ{uWr$=}#+Q%^>~YuePDD(ogUt8Xu$5Wy&4s5L zoD5klnwZ)IG35hkp|na`WhXKlNYgM>C!`%}M#Q8;fTMv(!STvgF6x>C-p*>AqhRkk zl&I}*Dny&klbkgBRo3UZRqx0*y7#3!l8|Q4&~^)XZSdE#r$XbvuQJUJJ0(HM(^0_m zZST7@VsJ#p1#+e!{0On=orqfu!SxJ=zLi_9SFlq&p?XDc^5y}H3FOjAY+Zt`Mm_a9Su+|x42PbHE>m+{6xni zBGS(NYZP4IOPTh=&;>U24uCeF-giMA{>A*z4Dk^?v*SZYh76m zI+>E}G}&qVU@6~7Mp@Ga{sixUSt#o#8YB>fUsBe#l4F`8)Jw{kk;NrK%U~nq;IrDv(74s+RIe#d3dYMshYLQK^L}_{m0I z-5Xilf_J*$(%~ny@2%U=rPDz1vJJJb^?l<4osX>dmu%1YrHt=@>k?n;_GXF%_j30b zZh@zJYv1|G_C#G@KetR^En{MuBiSxL^o8R_hHt=i%Xp|j7;p6hC^Ns1Z&Z{pw#e>I zCBl_hon8sCpv&GC1hNAI1Re5Uyg4@QNR_Y4Iq(v0?K>_nxwwUST5PX19-ub?ct9y# zP$RQ46~Ut!9M`)HTSSbs-wEOt$MXv`$C{Oz|}xr)HUG6{QX*83(oXPuFPA#UcGsc@K~YHO(arrJHbf9o(T@2ICVK^SNGy{P;i zSKm7LNzEg$TNZXa6A5pvMFC8mZ@@JT}|=kUW=Db`N5`u zDZFgT?@se4SSOG8-4h@I*;h?7E|+q}6LBMDL@e?;a5(9Tp$mpw%2>nn0|fc+irg&s zi&Gt6DwdyL1z1CM0%mIOtXx57Fs~}t6Vs%ul4-?G9B~?DICH9*q!!6doHA+?wxs<8 zyTh8ss$v{>g58XddFfh(C`JuIDs7gz(xJL?0xKda9Lw~D(_(iKtMVaA z9OCT-^P~>de3CS3n|^lNgMr5QR47nO-lC*uwZA|?rVUo5SezuG0Ja$THhgDCX9-q; z{87y$?6h}!17GEaOjFqg;Yq&>YzF2qEpzKCZXDHq7Z7`r!Y3~NJSG#2z1oy?f&p0u*!>#k* z?x~U0|E5(+Yeq36PVi)2FKiyMGaVrYPEs!Z6f{jc!ID=E@`k}^(P3ytW+^kgBncG1 z27)F&_lVc%C@W(JD5#^Z*hQIKHA8e8J;)Tbr3G%Yt+NUd%Tyd@}5-jxj4zJs9eA`2GpylT~% z)z%w{7Z%oN4TF}vF43G}ccd*Dtp#~4JO+0$f1_jQ=l0Im;88@!KA)Tmj#$jkpIX5A zR#%vGf5T$stGq&b8J|O`j0=;MIj#{SpFkuxj}~0`HPSzE$njlAqL?d|XU3zsM*qL{ETM4t5f}@Y=9upvW4DrhEYRASh%CWElK8mzMIg=AjRsBY{{R6NfBOLc001A02m}BC000301^_}s z0sv)Hjh#udEGdv|=j;k$zy{a=!hj91fBAu(V?^A{tg8RoxY2mH(^#XbX1?Y;`O|9?Il@BBQzAKdTb@xwbPY4x10gw8S{we;Cs{f%m(#&eV+M@%;*2lfP6-4 z+~@mebnbwCp7@Me?{Tg7)MK*ll*GD;Gh>$T1n;=6dnJ39cy`~@-Z7prAo1#*w|hpP z*T$WqdMBy37LPw)*hYzIyp!~qrqAizbGYaHIn8=M!W-*7-#fE+8t>;nzdn!4ozc(5 z+&5It|8v3d#OK%Nc=sp1uEh_nd7RI$5|85~`u)y$;q%4yj@kY2{i^Ca;FjU zvKFUUR3|P6XcLqK_JDAAW7ClxpU&6D6H66oumxJHjToyGK#OKL-q8uz% z-sg{8$N+}UZGg*XO(yZb!;{Cv;nckyh8`>MKwYHVUo z!*{%=^7n`j*Dxo!Py4%u#e4$3~CIU@Mil z7I$uc`xl!ua`S6F8V_T;Uc*>wWsPAUT+1;kv5GKSpGC#P?$?IhZyz&sS87-;28uVu zhvRfP@O2%r#AB^r(^K!ps2DEKF)TWUtZU=PuZ7O2Lt?#=EhPHRV{;=c$}S46k*{&2PtA;w}k5&M-mlL$T| zPL0DD^{3>o|}cdjJ^x2cSVA+W-KcGS&jWxJ@mk7eEz>HoJC(2@h`bU#N>0b$5%$&u??oX~`M(FcjiA<7J$Yt+X^^-(8X8IEhhf{i)VQj3=GapCC zRO~b_u@-hD?cp;{dYf2_E|IV}*BG$LcBFwU*2sEUoUwai5#WJh4Y17bJja?2Ac0@; zu6vZF`!a0~d}3ly0YqQ`2j%yN|9Vrnrn}oGn{o%N5xepfU2mK-ljaajOi7GwxCO$7@O6>MM=tq^GT71w zZvbS%mSv-C-1;*~cb@Khiza_*z0dVAks_o8J?Zwnj+rxl2kba+Oy)g!WNRzGG}h0` zFeEUK$(yd}jlGIHVO%+77I@e-mTveQ2Q8e-XJf={-pj+>U}0i^g*{0KWkog_YsA;* zH3k~lIO%3GjM+E$eGxQC8iB!exrHdL=VSnQkhAi=8#s(n2s5_9wN`*>SZ0GM{}-|e zI}~AB_@~TR$(LiQz@O5(U=Oe$j7FrpX44D_fXyxm8L{3YfQxV7_y9&=S)O4;7GbYG zqrH|Zi7zlr$j8eal-ECFjYJR`kwHX?>+Ssens{9`OBz5Y;UL5BgAavs4?`Py7Wrvw z7^;A?NCFA%ZuG}L7_l-)haxlRAcGNAMbbm&R)LM;D?0EJ4@zUgBYDTd>$<~-W9|(_ zw3PbnYqxXl9mDGg(sSeNfYD+}g#Xzff;!V(h?uk+C#(XS#!)7kV`mC!ynoC28ci%A zYYYnxp!q$mXTf=I`I>ML;@IY#mG+y^Ano@QLB8g)yp#He{XSv8&(^vf2I~Adk%Hl6 z|L@E_2ssYhbh=_W#a{z{P48QOVMaF4t_$uOw`F*m#yp4VZprU2)+WenST5WoPB=W? z5qKi;DZle5WJ?m{$Z;_~FYq4u*}RK{h&awNuIig$O>i(>&iys=7l3vF)+XuwEJ@Dz z9QSZc5W990d<$a7*cPm27|m@&&-ZOCG^Wz1@0|+Pqj1j0j1h!-V(H?VgB#e-<{p-C z1ZbbN?V2Zfcx1rN*kEthr5VPIAefAx1jJSW{bNUi$`C`xehttdEJ6Spz{EFe2pEs- z3lor7g4=k!JP`ySk_y1{3TP^vJ46=(unUkdj&bq6h@!&FkN4xv=-N%?<0-HKa9*zB z{Qb2F1HNPfA+upI=9oAEfZkob+=M5SEHb}>r-`6)_Y>e_D1STNZEQKHx?mRD| zK4Ma)90#!{UMBzsf`84I(R(2i1O{No#M*~;Il1bWAJ-WK-Qv~ z-DA_MSk-5Y%lP>fmb-?#sMRdIexuznl1&KL6NG@URK)o8<>9&kv+w#qo(_^3fn7-g z0MY=2iX5+J-tqU}^PTO_JZ~-2mU!Y7C)}v}XTn!ZcuYWfGtPw1e@-|9z0dqR&^Mf4 zWgDg*C){Lc=cz`Z3P?Yl@jR387%yS_o$>RX@3ZsW-}w$}QQmpX-}w#}?#?%4QS7D` zo_|h|&iK(<3E=$8f!LCas2Z2a~UY?Oiy&OWX+JJ~TdwlAsm?r3b{Mp3}^t(DWqO5oebV$6wJ8-`Nn7AU!f$hk5t@Hbc?-AbEkJBVR zJASh^f}=3+bLHejC_=g|jTomHW@xj!^W-4&MzDm9Ap*J7hF%^ zy@@=_=oJ?~`@?0MP$D^t1Z7LoCF#2!lv8YsG2}z#Y{JFKfhMxv*%`43uQ!t^Bb6Fe zhbaImrWpu5dY1B0uVEB0HUoUd8BKN zV=0;?0XUGqv3`D$@cBi;-;%srV>HjHI23V}L`fdT$5WV;P*xM^>%`kE!as4*cAY0m zYJ!+SWOzh!3?oe}%@IP{+huq@lLn+Tb-@vxlRpF4V45~|KK^DxI>ApdM`FGK5rEKa zgD5x*BI1{3Jk;YQJ*GG!G#S+A<`3T$S?PH}JFp_TXxNDpcvzs1hQ;8M41Mxr?o?Ljes9#9vYCIR80mUl9f5qrQztSea}43~oYc=>=`fIl zz%`eb@&ni2F)TOO0{AphUo-X`d<6_i%g~73dGVq6V?YyZ2h>FnZa7G_7CupBYUInv zF@pZ9?5Ud8CrH6&b}avb1$(?#?WIbN$N_dG85u%LSNAyABpf9%gHC;K@YkO={Ok4l zeM9;0cl^HPe|QJ1(f{&}|Kan=6_xi6!TL!!M{4wPn+N6pc{QQS-*^1;^Z(;J%J(hj z|2W3KUoCH+6I!>vFxH9}9Fg zz+&eOknBB0QOOl@+$v#uw`gey3G!O=99Y}B&b+deByjTgn*lX@o}*fVASBkx)o~KA z6jmoDywQ;H=_YV8=m7`{xG!aegrB??Zm@9d6YeSOWcai`QZX^0dF$_=7BhR9vYK)# zNYcpc35+7LA2CzN7%Fs3@sFz;QrARkrQR!bF{;|eQ5twiHm8Ajk#vJeC4$SbZANRv3}~w2 z%-}#j-we##1bVAy)V_n=(|L&j{TTI&hqcVkD|71aaE-X78&fw-3++YfXLdsx-~5N{)pi4nsr zCmdIET2(p3LYzN*?3V1B(5@1?N&g)<5r|MJMxb9n>>|l7jTb>%LLE%gN^&$2sT=AO zmX;|V@lW_W2~2P>lG|-izT__p6s~~EPO?Aci0UGi0qOq1Si=h zM08R+R8=900Y;n*D%jZ&uH0Ds0EnoBVs*3bQ;!_rUp12MBUM4+iAG?6;EJk8BmW%= zfqM!GV+*PnK)ZPjQR%7~Bdpf;jxcrPfJiLBKUBk?DUwlA5`Oh2!;|lz<%4`@o}Ucu z%fHO9+yA2SS1v#4m&Z?iRp&C_ZnH=JWdej|C>BQ&F5hI$-B6Oy7h?WlS@yrUASm*$ z(yZ)h-u8#hj}&S_C;-k7SfT~V^Nh7Em-aH=g^iv~YLb=VD59H>nJrbJT6J*0nP;ZI zKU*6hHU}5hNc<>u5{~*zxm22&fAMUAhn+9amMP(69ryMGRR)2&PP$hGxc6;E>0iT769Ey$VjwzG2MaNfa=T*9 zVioE)Oc`EX%mAnm2(FWnlaN%vG~tz>=aV(WtkR_pU$laq$S)xp@NM#1qkPz5h zMGOo@Zom?izq=d@Ea9GL>nsFA`u( znN{R7!B=m+GlqXb*pq3Yr;{$m@+F76_si_2nj&z#0}K2o2%2eacQWt$7o;Qc3r2Vr zH?2VbSH-n|f*`?6WF)B!yrI;;0-l(&Z^W}uut5d=gG(=%`D1<5PssC2`HOf$Exq&l zVf*(FXZ?jmREZr$3-_98YV&ImjwToDq${yJUM&T?|CfJE{biX?d?*<}iCl1M)1lOj zp|xQUL1-Ac$hyyCh=R{}YnT;t=9j@G5MCvzbUlo0G0qTK6|UqUCqD`c)a6b5ZH{VtiisLOI0k60Kz(CpfK`ce?T9dy(&?bkVgzk0|s@0eI%igv`SBJV8)KwxxUI%eW@qkiWCWnK?0ldHzTFl1JG3YzBUw{ zhD8bH(;^<`?j&IsG}X$qSBcd~w8jHJL=~P09Wlfueufr%z`G1R@-Ry_<8E0PgK5UO zgx!8Rh4$6PXR=P*JCx_wm+;*$DG^V91|I$Fh6_|o0D4bwmo=aegNQNn((ybJR>2%@h0N|;xK^^*vtDU=#r);a&GgNDjy!20%ym2-*7l-eKnOqu z0aiMa1o75son^#pvt&N8oa3t(#hV*GJS zpG4H!0hP44mH=z~YN3WC{ZGnp76{F8r7tsUM4ma$>Go4np@!g|X_)}C5RfV8iZk~*dnQyWWdWp&8`i8ClzsNLmEcg9hm z5GzFwLP~MolLFHq@KLmg-evSNEw)-KNNhN6()mCihp9+l&sj>G#iZi4O2_={FnBJ~ z62pSGo2@`eYl(ok9~QpHGQ+K*5oc3_-o# z5+meP1lTG6li=%W5UhT#DaUJB#}!kWX+unWF=ebhdHSXbFLl9I^z{tBI;edO;slOrbnB^0{zzMsPT`P9l^Vk+&Yi{z@7q@i1ezjD*9MMc|Yf z3R+Q2WO3n5N_yr_E}69h1iCa{nsofcI#k$4iOW~`dW=5nnG{gf2gn1vJuriz9Agl6+*S2eCO^#NuORrI zWcfj)GA%j#7c+UPHRwTW*Q)51lv4lcJMG4u?Vp&~soGSGzJUITIrkG^xN^MyDu!aTs3Kl)pWcNV` zdbWu>C?W?CW}XWMWiFp`I^2+pPfQQT1R2iAd@oWkm0f@Y{!c7HGA%PLSj7g2a-qGm z!sKKeA=>V4oGFe~-7F(?(F!JFTa!Z^Hpu~5cxKmJ6?_v0rX)13f`uiShgXF+NnctQ;>FR5$A&vPRL*oePi8b=H03k zr?fw?psMr*&w>G*S;T`a!aL*sKc6DY)UA;33`+J&Q13LWFyH&aYZ|iNQz{1omMp>j z@St7CUPkf9@LO4DW(!OPCP)mpB-y9tS=r;txX-J3I!&RV1)VD56^2?gNYEFc+!eqo zni-^UG9_j_GSl$DWQTz;20NZg1D0bE~ay1CC~CDn@ClV)jSW zTI{`@nuHet%I|IDu%sGEIOY)|ts>=%g-~+et5;9>5aYq;!h{mTI(yQZWpaKjDI)#0y2fv-Gn>rQ03i{sw#E>&@0?d!;FA0 zqDa0CqV;TwK}ef0JlzUx330dOAGR|$#@D@{j8IlmuSW|iF!gosMQf_D&jjH=-FsN9 zo$h__RsIGV>))!tbnpAiyZU-iPQUJ5KJ`CP$oWu6dE2OR`X}wmFNX+u1A3TOUSPM7 zUeKAiOA{RjO@gDKIm-C$t%4l>vIzOV>9OYU+)>;$8j(_;W3R!asf))QWmSYf5C?!4O5q+fk6 zs$YT-to*34t6rOcNKsJf^lV)7x=~oS;Jn9ZlMGq2(CliGIG=1>Wor(zy&?Z)YbaDP zt((<-8NSHus$z6XHffd>d1tY!%1C*h>ZgG!`?bkv(CIEWHKN7V8wkDP?9sEso>#?6 zDL+xo-SFEbl0HsKE4sf_N5=O*C_iWy_BvD@3EyoZuag#3M-YIMP{bBIk01v6g^-!j ziz7e-+Jd7(>kZ%*nFh|FEO9;KA&wFj?;$Q>PNLzY|>A0Q%(MDu17N?Q?v6j1=bu zw4J%6s^cgX_$Ha5ePm&$fKhB*I+YNwQBNS`;FGmQ?;So*Bp4d8-ed@hD^j7NlnLN~>t!9yukrTBEty|?p4dC5PIy4#uLKRv> zg#bf=X|Vzc&6@2V1;^1BwRE+Q)l7b~m7Zx^RzX=B8DJ<>1J;?8a6RS%-O&CmNRmN^ zKAK8+MIT7zkKD+Kszv$_0K@a@0t^b>D3{x_EnusbJKqs4#0lNp8s!~CY}K`At24RK z@d#LSz15aqjeQy6LA8Y1FH(NOK|SQ%l5)$~xSEN4SHuVMi=w!vqFeZ0IdWCD(p-4e z^;UBtd+3N-&IRVJpn@R~k{RyO-W1!AZzaL3T8YIk&1ES@*R=y>niio2;k>rE<=YT`kNR?ndZZrL=5AfP0fM=Uo0;GSes>JyDw_A(yHYZbE| zsJyQEA_>&syp+l+bqYp^01=cljbqxv5YAB5(XyQlV*hI}En-D!x+F{&@ZCwg8@w2N z5)3y$s4dD=%sy6XicmfX+p~0qG7+Lw6f0rUqk=CB@a@NgwHz;VQ?bOBRA>;hQ8Zdm z9D=k<(c4zL6!ZMt;YxTQI$E&^ju`wF!2j7NGGId3CsB)oqFBHJQX<-$xE|-L&vk8E zErigx&{U#YCx);|pV^WtuF6hPjmMiJXe^naT9l74VkZ71P&xJ76Ne$ENi)G@WoQSu zl2}y#Yve|N-jzg$w=V$~(H|k}%+W8k`X&6clM3Nc?Z!UE&@i%kI0*|kPRizhP#58h z>|=0A(K8L1ARLS8i@!AumL1y#3yZL&Q;*pB(#VR!n4x2eEK4yH)Xo<1f(bTB#nTab z&UF8PRh^RnJu>hxy*o8fQ|v*mXr@}>k;y6f*l1Qt_Il8hOlNMU=gA%fmeu%92&NMJ zpSYILSDMn zRM`u*D$*tkCQeopX9-72*9eu!5e8*=VL8#9JjFvK-yR7`Isj9*f1?03;7YR*@=#k? zve#FZa@;epiV4PJ>T#alE1MmK8094Ns{~+*9fA=}fxm_5W*yDNoz(K6dX^+BNwhRW zvLvX9G2VJPMOV1}Fw>MuI)ky7CjkBDMw}| zjK+@51XDx6E*1vdskPn7PU4iz3#M{N=5yvCUBSDAvooK4B=YSj3^|_#?T8{eF1p}y zmsy7#H;{V`Q~mUgkHFRrGjvSY7OVi ziS|+QO#0`GSCWmg?~&Zv^oi2r>v<{AYR!zMFsCXlvf&Yz%_`ib*w1)tiF;ui@q$dPF z1VI4TwF~M&HO8^2B>%z~9Ge(zxM2DBq!XXgFE<&x_dYCX#`XV4siQJi9dD{bZ1ZVc z8A%y3pRdq=YqnP=oF_v|*nLgQoZnhtGUIRvnRxAtrCI0fD+1nd0kNwx&riw0q1w{5 za#T$2{oQkfT6B+C8R(v!*2*8w$rwWBekKTXqFdYNmr_44KAIaTB};`Gn8Z$fETK<{ z=dqcQdM)X0Ej~$pTKw}E3ET)k zHJGvpbf|Afv`IZ{21m&XTAD!FQKt<+D^?_BdQTa=cjw5vYS`adS-_V!TFTURzO%=UKZcjzfkDger@!J-O^To<`0O5uSh}UqqZ#2 z8APfarYdiESAyqp!39t(W89xybj?2n%<~6v{Fk1@fN3UL@Lzfo1Hs2Jod~7=DO?3) zeZm%5JL``ZZfdj)3lsSK%3A&cpVJz^uWGfVY!y}UAK>$Uk+ty7@(Vb=qDunUwYMqco1a-rn|o?obr3RNxuJ&r>h#uvz@lwg{k<9)1FQD!#^V1 zRN;UDiqr0Yob*ab^la%P!VYTSg->CzYzto!HP^=RkE!}2mzvF0;Ii@&KU{FA&bJ!V?ku7;DqHm4pfr)rss*RF}tn8UY*?damq7B0kfbW)*61$A?njWE!Fhd<~P_nL) zQ9(uqTo}Y@YVVLMwDzP}YC22muNuKcGV;lNc2yfAcf4m2GlHJPkSms2O^efeKB`%K zWK^mUCO%9!>(Ob&A_r2t9h*ekUVk-gVtL$e&x!KQ2w29`l2mH4XzbFne^_WEkqt$t zp`t{di%6)yqTXRUwmUDSXARph`eZ>j-<^^c$(^qyZecy!S1jYHK6=Kmtl6%VKY1^z z>YXi>7W8c9fIvsdklQIid1V*z$d&|3U0Tiet4pfvA+=VTb1Z)BDrYKRiwKJ;ZP`$w zHvtP&K%QoYyCF^tk!kj~$aY-)@m@LFtkYO@Wn|2oeHX2RHWzVKJ!6ap!*ML`Q}*Mv zDJO#_6JvAapT8*^ozYh+;RaKo_RIj$z8(1ty!meAi;VzQKd933U7V+zhpI|6ksq|8 zg{h8;2hLC*g@74Knxc#&MyUw<9a6vTyOZrIJps0lY}GL`t9H73W+FW;Y1Cun>-JPmWTv9B(W#K!{jIQD91rY-EycCcVJUyCYn1KlaqhJ^opH(9^-=&wvF9L^Bla z`k?!7X>YV*LsTQTY+k^kZr?pwo0A$^$c5JQP%mUwm)d$(5f7D}T7%AKkg~FE0-+&q_Knfo$2Ex16t~IA)EB|^ zZ`!YOVHpY;a~oEaoYvcZPbAK<=mE0~pyvv0xfxSy?%|rw;nZu;+w&>TLVURAjW={Ttdsn?r8i+qwG3V&Ac&hskGB(sh51S`c*x}{K@ATjdeo`eJtX;0^aR|@5L zA7|U5Cz?wxib@g39&wV1@OUOy3FTD)jHfND4WLZ&oW>(6TSMPExzm?60 z8U7MNfiCX{7ajT;h$aPJ)dgbj&>RU%_@Yws5fGG!puqlAna!Qi~Nuc=OSv5!r2{ z4mkcs!bh@2f1B{Ck$aVDM*z$vsAd!5w&ohT8c>X~Vk#t-NSq^@`n~xB%~qnN)1uv-sb{f8V?s2i`P7pID+7WZpciH{(bHn=u9J3O2r6Dm9nyVvU@}o$!>Oc zz&evYvt1%o9hvfwMU+fI8NzNz0gUy9ffGDn>ksiBo3!`D3*6ZmDu?E&=HuTO;2y3Z zT^J+@%_P+nZ9D`*JWjBrGm_lr+u$Mdv95ZTTol|*VX&z60IVW4%JSfm@ct_o4j#1H z$pfF%jC`Vk?-48gMaDoea4W`VHWDEy?r71ACVrUuD~{{=WX-rgJ#l8{BV6oo{^ef` zpe2^LS|fd%U@4j(qkT`irg3HT?@w9FwnW&{ipaCZtw48{A#8Q$Z-adK?EOTqC+|BH z_caQ+!pbuC+)}8Iu~y5f2e>zQ&-k-?6WqZxtPr9gGuU7{nsVkyswe? zG2h(H>Bn1BQc$Yco5Xfx~R?>@W*NijsTglv(AdmNKP{AER7Qfgbq)C|~*O zaCbA;#w+^#y1^hpHno!I^0F!|6_`7lHpo!RN~}hob>x4DP*-Y%Qam(wvfHnwjkXZ$ zt8slx3US)mp2JkKc3fHz=X;t06TS%jGG!t%3B?dTmv`?WgDK=VMiY;XEvWh}Yi0#2#*Aiv)m73GN z0?o8&C{HB-?A1}FZ{c{7VpmVHA4>UJ5)Ub19KA^s^P&T)mB@g)*hEE=ixq)Y0@-_7 zt6WXD?nZh`)G-z!Jnl%?5L7@@lGJ}#mjc8n>M#8Okjnj}49DS+)Dh)+4$J_EOcA{~ z0cl`QObrx-nxoWiL|6MEJ5ORTGW|-{hHL`{x_gmqvk zhm_(KS6s7c0n(kNQd3z%Y6>!p7QiP(UJW{`q0U_ZVM&?<&QMp&l3Nt#JRSbD6z5oT zPm{ToZBkBZy^(Gz{l<&T6e7_%3%%#cnij+B`Rbf3X-oN+HIg&#g%ya)y=T|Z`{jbh z4Z;$|TCQnVV#f6Q6%9?SqTt=`7;f!T%Cu~AwCvqN?*Iy1>>%5#w8#J*s_pg3u%Hbv z^f5*(wgR*z0?+2K3w;omqo!7lbEOYm?1pG$-Gob1i#L>Q5DtF6LPg<|FXBm$x6wmC zyr(JSwl*rI>?gBRwTWA)I1;Z{kbzFh+CfTccIHNU>=d?>(e0VlTWZu%RB@7sd_Rxf zkBU*u*#e2nngfX!MT&#CxJi&Oiq@YH3l{@wX?xK8_8ezm(G=8F$p;Rz_b zYR`IqW=w)NiB3Tmhz=GBywXEj($cp27|Y*(yFMNkxGE-SCO8-@HYdvlexRaJ5rc?0 zOsP5P>$EJwml29!h@M16Pq(52&N<5DQfMnvk%g|L)P^!(+n_Y1XS%162KdvuP$x>h zGst-!lN3qW5UgtN!~N%5Q@lEKNIlh0qh)GjXWN)p3vuh9fJ6(UjOcGrT!?b;^~VYT zRF-=8rCKKzEh_M1Wk#{|gl%IpRaMl2I@)vOssKrDzLJ6UwB}+O-JI+*u@tzgUv+9i z9#lYW@COJkkuiQA)r15(nR`vu7b_bu&0yD%*AO8RZevO|qm)q3?4~Cy{{$%@x~-)L z&!qKj7IV^v>9FID+cTdncOq<{*q1BEkV#1G>eh6jKpP((8?6DL&BM) zH$^w}d!BO5(4%Xs-On(mibvEfvX-^Je7YroqNNItQQPyqnJ5aDkNQHlDiNKD<_I<+ zK9iV$EE@bCXa^A=5}0Z)(1;91j<(q@rb*Pe%JCW9)GWZ3XlOP=kUYlGJOGKDmfR=F z-DDzoPf1cZtA0{Cm9~=^G$5-#V)`D&z-@1|g>5#^!r%ZL{UXIsa#y9rSSLLWV1SsF z@UDYezmQluDg3jMfhm_fuN#Eqzk7UlRR*~cd*<&)Y+6Of3bvTE)&$|QP4|W6$9Gu_ zsG9Lao&ZgtQ_Y|pXbEsWv=uSV-|6B^^Q#{pqgick^Z?TmLjeY;qH)1l z&mDy!q z>d}F8l#i$>&y^ZxDEn83Pg%!$!%5v0N;xZ}Ekv7H@?v8Ekrko=1fUciP0RT3UqDDi zh=;z9Q*qy&*4%lfMm_6108U#=HXe>$yG;ZJ?1+toof#R>h?R!>4v#Q04ucu*Pf$*7 zGsx(gAS?OWTyx(h_uq-pNm76lhgui<=f|cccOF^v!CB#tGImi1jgzL7R85fDT-1a*d*8 zD5Ak5%d9@g|3(J2f8)~5wyfH;@vI=cfGHz$9F`=mAa%6~`aWz~5z0Hp_y7A(c~O4L zYw0gq!r>=5g7jsWON8C#T+Jki8AxBmbhOnz51+w z6gH$gs6WwNR)lmz4EI-;3ki6kWa+qAr@>Bw+O9cME<+BZcp|`>tGgxf98nr$Ok}0t zqCcY l#5li>SEWzh>OYBDYYo-bBlv@?j)+Omp94n$Ml(jP&dc!|-e-P`ZqlJ#7_Pr`AW-?!5H#9ky8<%gCzlLMAWx~W)i@qcbF6C|kC zma0o5S-m^Culu3NDW=FPooB4^(sC;^1qwjgXsLW_Ezia2h~bSLP-@0Key15l<_NuI zz=G*zy*7Mb@rG)zdnlPrl{4(*)30Ae&wwiSdqE^qe<6`fKD!fT2x)>D5hlxzJB)wL z8`)b`SjHlG_Jt^W7>*%>i7%nXD6!kb)Vf0XZZ%j-5Hwa|dAxix(obV%jEQ4wAl~eN zlhIL;gF5>)+{&8D05yY3utU&93LzP{?A4JKGVi_v79Go)eSsT_UM$4udw~GBgv1fLcnFzFCvz$L?6n} z3&o}SL!4qt44H*eSpafdFTyIBnbx#xfCJ`tA`VGxH_A0kcEoz?>%-N1dygLS-7;9| z39O} znpDx7mbQfe^Zx8WyQcIke#wX?0X_UAW@colC38n)kbr~2 zxUAP0hERk19zL-IpP?+~DouaVKclXnj9RBYJT2HM1I6pBsvM`8m_h8wFt@SoGiek0 ziEpbGu$bScuWF_XAjU0}L)4s|bRgkT%JGFn;^Z0EfBl~S_+9?_#QP1FBB<V?Kmc52@^eJ zO7atWLB3^_i~+j!Nru-P?epya78{j+K0yaE5ixdZIO-QE;e8^pC~f3>M#{8@%UH9g zuyAD1`n+*OfG+w6;8Yje$fyDPDRkNtGH-H`sR{GYY-L*1~=Gde>6I533WwBXe)UW@f|JaQ{8ya!!yYuG(eX_ zZ`ve!yJo&QHLW%Cg|Ag-H5HA9?%WWbtx%t@5ao&>pgF2dY$(DWNY0k@vVl!AQ#W|k zIYB-|;5tlCtQI1u;D)aTenUK0MY&WYHQ(RLB6RcV2fn!$gUOpDFi3leD_I6*VJxAV{4QS||Jl&N(BD+aOtt~C;PZPL z)Hr~r>nt(9am}xkdVAACdxGy}i=3xIemr2b{NXhr*ZA3!Hc=G)lMG8+Y8S3 zo*j4RUDj#8Mnm)43CMcsKC}H>p1}J?MmII{b}{64m|nM`xOduT-a(0G z&8>rB8>Ze-7u)MkPLT)Ely{-?UTu8REnbYxO;>v>byB03+VZYt%|Iw|;BNg!p*n;m zoiSV%37Ef&DSP6$!phn+Y%Z01;BxMTD1=clUmRZU_i z5lBPM`bF}@coV%zis4Iw2($gLkQ~D#7hDUzA%)_l_bk3cC-Fu7pd<95GIv!t0q;;W zT~c|99fo<y z8WUEw$T6Bdn7e>}h3Rn+tCCDgaRs|$l-Gvs-+5QcpPnCiU!H$?=+ zX?Ltl#;zY&$P?A6e}29D+9;Xbse@K3W~VkAY83l5?WAwK!H%-b*ARs+f!R<43TKsU z0J48NYRu%0?4z=>HSWw(TmF>yND^W|BN)IBtqaqj@+Mh^+dr&+msEY+8YyLFUjz2p za`0Pd5tv;=`UPbXC~@mIF~vPwu73oO4qoKGd3& zMMikZl|+`9pKpQ;=WrW6e{E%afyvO$m>bFb?M9dZ)jZs&ab>?2%5^|_fOc#ME0X!z ziP5C5%<~m|rC5K_8T4DhVvobajg`+)bW*bGqV3PTgWz<-r)Vlsh?)#T7-MKQp`QUs z1wh!XYnoOo?9fIyW)QC0Rk=?1->5Z9E!GUTe;_4sP#}d zBWp7QY_xHtFbRRB*5Rmuw>yfR(CK!b0)7yQgdTo6N4}bQdtgS@Tin2p7L&$>CpFJ> zd|i3JM|(gf3%sx-XR4V-(wbXL@Ugx~Rx+V3{Insp3__@w#)y-^i>D;%e3wNysCa8riKJ zv8zHCI+;s578xHyUCetOFOG~T!Zp-jCI%7U=-zYzC^QRylxlp#B&Qf|sCQ@M*{%Q296r{YRK)o-9^E zT+{5zCyWO$1!q=M*J>OoSVgErKb>L}-^4ctVRph}9X+x+)nfuHuu~!RNmLe#W}lpz zfZkJyWZW*~TXe{RO{QbjWPhmV1XZrp26vfEm701r^C93)aSD|W>AjhX^yE#c02$B6 z?pTs)Cn_=p?#M+1=Zz2!xo)vEb=u*U;un}7d^|P4+1ZsQ+jdhcPuMxFOL;;Z$^*vGSpm-{2$1M156Q}?B`cLD)N!tJM zUYXbCzK}Kga(UyM%8HrCmK-B>C%`A@OCJ}~UKqUS+#W(QynZn>KXd&vG`FHG-aLQW z@nu|o7;W3}F}nZ9T_!DZ2#a2%;HT~QBJk&9|JjbuV1@p6MN|J@{q2?k*`NM)=;bJE zvc26(iT*cZ7|&okeyXXEP(|WZGBz7E)jl>Hfr3`&WTlm=`mW-nBq=8}VA$8w@DlhM zteg6VQM;z3R7=X#v$9bMz%^kq(BN7lbNYMUC1qd)Kxv5VfIz>HLeHENGc8%W}`m*JQCMw4Yg~Mh|YgIZFjw8E5Ck zMbv@p{M}1}(n)(38-h`L;(c;$flQ1L3Ws?T#WPxo>KGNrI3qL_cu)NrN|wMNM(*d) zT1wMi^)+s7JY1qb(M3r-BWu%}HODQ}e-V2n0=h)RYDL+AxRXWzkNZH7p&iGR*Hlvm z-~fiL$VkSbr|?*SyCp*?;1&*{jHIO{JG^{6UGItl>aYlENc={GKzFD6eHouc1;NX_ z*EeXh<}ce6o+$sz!s?YbeV|S?EDF&qDZ@8x-^Tmg6lrCqkzwwZdjG|5sF52ZK_+_d z5Dck62{4VgC2Ro~o(wAo%*!s8kVk(0WDyqD3_-BRI5OIgQjW#|U#M#!3#f1yYPB>p zAX0Ut#Elz@3@MW@Sw=PvI+|pVFqIg==Px&oSy{SD_Pk&JZkzzYJBGl2C%1Mecn|Ad zwm+PwmtEO~+v=)tTU35hIy0X`KW1NI+`4HhbGG##OJB19mhxsBS%-x)5r*Gc?`mxz z_Kn+N7uv;=DD2el?v=34E3BrI$fC@iTzD5O8-<2j4~$8nA19^U`?cjKdnC6|QOq%) zuY8IYTAY*gsJXHta0T<#-`sSyQZmSQ!q*5pE%p`2IaI#*JQ54 zjSdYBLPN86HYnKHe1zKH45qR|2#CyJD*SnQ;v8GR6QEG_9)@~a2baBh>BAdY*&8sk zwq+2Iy-0FDK@WEKt<-#q%ghDXm`%WKLiWMRYu^1o z?mWNx@$8nctvLS`cuj9EBWlGyDu$cKd(H6M@yON$TH$~)ov7P+E{@o1z{z-niBWTJ`YEi0L+D_yzvXSRJQRmgs^QKv-3oR zQpVz7S&1pk+s={Nry-u(6j?~ZL}Vjj|K+Y*`hW6RZoL%@E4n9zN#TVG+*r4BP|rGe zam;S`%GR>vICkAVosy(fY`zrW{oYgY563W9+Os>L<#jmEOa^oLIEL5ZeEy^|b`~!y zL(+feGD{SA302Xx+tnMLj?865J~Nj&<}$BW_p24z-=H`9GH)4$f95hX`+p=ELTqE& z`b&cBpTCpog}TY{tf@sOW@{zE{kR2zf(r~p6|F})t}rIUg_!E{g379uG}1(7GXxL> zbXrDy%()R@f0R^{rKri*OY|mbH&oN!p9%~@EWHGi0J(w~9#&5bzL5)plL$6JxPE^B z)$emVa;-82+)O5Sd5r|c=3gsuXq@?al{_rQM=PwaK-&9D>IkJ3vH{wLPe@+j53vy5 zv#fWXQ%hlfgWJeO4K|N!*kajnKX>yVyNhuqQ-dMFaWbZJ5r*@Rdvf&sU`%?84uN3$YLKf=Oq!WdCo+_lvWy!X>>h?N`Kt*q!jY11=tDY7mmoGTln01}qMGdGnxZGk~Ql6O6=bqk6ElhZUd=N&2^V-IibFHi-H>Oybbg&Exdn!3Uu@bfe07CLu zKoa;B?M4ybGOsXOkO&|rczwK*L0R%oQ6suo%g1cBYJj1{&;sy7e;Pp`ha&ngGBg&M zVrF{Mk*KbbZl>CszRV~S5e$KTbC;W8g4v0t0~2sT#1GL-P{S<#?8~vI5rwG8Fb};) za2U%^3bO=`;P!y6h?F;PJ_eDdA>k!as%T{FxWZ85F<%h*ygls*ql*`YbLNdiW~Rhn zZ-2gFhrK$&dlY%4z26dgamV@#p=K!h{kQy84*Y-o*(OL4KKfw(Rb`xPv-yu8#XHE6 z;1`zVHk*IZJ-4UK7)4%}?IYlN;)dB7q(~F4@87=Yar>VE`W=LT19Sc$^#A%9TD3k-h%7F$!3WC z?)^*X6kmUL)ovL&HnSB>B67p=BMYNQQ3!N|fBsgkR3)tGbS3W;Yk}w!8b?5ElXmDm zTdh`;!_+4u;jf7n1Nlj6hN5zB8>q^7pS<9u2m24`J?{P|r!~FR@dCErGr5$5;mk?d zI|;L5@Z(m@4Ye{c9O-pOA}fk}@6cLPmKTI*U)kcTyTkpAEV4c+4 zBn`u}yvvhsI>3_V1^WR4ail1P(}iqX)Htgf>+==bfuNpk(;@J%umq{Bg(t9>slOWk zp2RZTJE(L?1`?5iep=$6Nf>H5DKW5^H`4baNvvdWs0dT+SS1ROY?_Zkq1=gyjo}qz z@{`#G|8NU~@n>T#3BE{Bn5~)kQ1(SjL|ApoZ6bUZWqfo`+ev?$8=4h3%P{)O)^|J9SuHS<27rDbN*{{4*@XxKyDW534`J0wh(~AuWE(AG zO8C;HhQ{=$q>#?YfQU<78WxBCXqjS3#>Ge!szD=m!(OFDS~3gXR(Feeg)!Uon7YaL ztg;(b0d@CgQB-yhNR!%0jbAFiBBLWdImv6g3eL$p+a0|=x97B--~B+zw~_iTXZsLx zL4jmz5hxHyiV3E_#n$o937LWhAjYz6KvXm#gBi_19d1MkbeJ>oK$Rv+yN#E;7CvnI z&2vo0##A9;pRdIV+@StIRpcm;AaOhcvLyEm6;~3w>{!s;EtydkhV~)jbEh6-8o*C9 zp6>Uvv$@!f05eAu{oCaDnZm6kn~c)T)R)B1{3hy|j!7a-fkU~&T$U3Ig?@lLceGdo z;qVHBt&CEQFj{;7jVM*GLZNkJ1~p#pT3;!L8vXj^8G6XhUvUfeJC^h-*~z;Tc*~LA zleY+08aJ94)(ntC%LS)E!CmuW7l8?6szanu9czCjk3Og`E3XOandenXD!wIyQ5TU# zmbfK77mREFDv`nrbw$RN8ZE@m#2AP2{ zOLXSo^pr?A{pi?SCohtV8)hdzXC={)apCgfq}Vx4xQT@q%(n*L2>vP#mKeZ=dPHwC z|1j{twyB~{-)yW%kcPT=D>FI?)B_-@qBba(6j6lmD zYZeb9F(p7*2_Pg_tl};PKdwE&Ueqz121eA`LDF>I@)|R43s(5MY)BUO*i}z)Co}6cDDGS$Wjw<-48tAEsd%&x7L^ zfOjI8)GbLlB*U{#-oEu7{jt;mrrDs)Cbx3T1EZ5tSG0v$(1+UWR%&L)#xzsf>TC^0 zt0$Q|l*a6%Xv08?P&4p@(@UKUxNU5B(qx>Mba`QO_9sWSIqgVYv(|g000(^>0^8D3 zviGf9B#qXX4FOO%MgAYnvM@!?_$G{)x@zI=s=&@dnD#a5;@g?KhXdRw=LEC1J(|xH zi(o~C1t^kznKi2BP#C*hSJUGd)FhK9FNr~z_WHLi`eV3VDW>*-&2gt4q#KJQ!K?^w z>i_;-z7MBD1c)jFrej@(D2+RILODkp2KBZplH$mamiQFN1^KZ7Yd}=g;S{!8T;S4F zYJT9ke-mVbu5Bbn8Hwb6D*R3gj>80NyO)Tuk!XZ;h1r4N6cw%|)M3jp)2|;?fHOT$)+(-2bT+`xqi;iY=7POE2HAYd!l496YnR-_PBU^u2Skzq$61PT^=WrY<&K;ppJDj6WZJ} zB?nJ{g9Pim{CH>Dja^*8Rmx|8HUe=aOk+`i*0FoFwnpENJ5q-ZmQr6nQ9IjOolLeF!i=2WdlJfpf0L1#*z zV&~WoFiq36$j@X+Z$S7jnVX%T2EH&4fC%v^lFcM)&JZXPkQ^K=}<;cu!!p| zsFff#nLxgn&PVG@Oj&kXk3R~v?NrU&11V6;f^x4pHEJnSMCauQPsO8{ebp`oR^F%) zq~d>-sQs3{!w%0Z&)<)xc^b9J>JUlL=$hItY!1f2SETkiOJUfEsCR1AQgVgwjhm>* zSnrh*IP;&Wl4H8?CXjw6=`-#krG%L+ZWN=BPXxgv%iGx!TrTfm8eq-Rme^VV<$=)& zxze1LJ{+nYicviT;$&l@p_@s zH8Y8@7X>8TF(twL-cT&~XLS%1u00YP!wN;4ydu;MOv*m^)L)&jT5l zgpO@kbDLfSaVX|#p$!0RYKBm{(gbmc_6DMg;5{L41o;6K*8Zf&J&TlR-UYf4{BwJl zwp{XPu%`*LXV1h2*hvW(y2Qd&RHbcT&siFvK-zx6NvFz=i+gr!bU|z%hfDRB9dy*% zRaLj4U5NVU`l`spbE*v|tPA7;&6OH`1JFZc55%7GhmqIG$N`cFyaW0Q1JR#kc-OMm zU$N84Hc3Y-EUaW4;!OANrDix!H(@`nUf6i)B(qQW|epx3RQW z^78;aghn7FdbMJPXIca`YzR!2_dLxzooVEJyMz#HotMsJ=9h~>T37oA5D1r9wm?UM zD#@P0xr#~wg+0Hi9A$DV&~1W8h>&xBOlPHJi95IP%L!gGGgE^-1GLC7mLEU+3+BOG zBc3SVmAj|tIpN_^eaD~>uO3kv7i8J)o@A>xxixSMPKZzn0mB=LBL-+(=&qVmj`u!_ zZMvKRQ%3ph!yU%a=^Zrs@4VSC#!zRadq1Rb5pPhBabQC`Yvm+7^tAzxT6ll&my{R# z1aj~9zA)`KN;Bg5iP8$mz{)60QS#OTu)<%I_L6dXUH`!`6lkf0c)iF_Jj5cCj=WRUiE0OMSMw9w5az)TLvx=M{N zL{I|A=8z~HeEDHF*nlP4dkpE06*tsx#tLIVcEV4@)=AW`Fjhi;m=t#BhU{W1CT6qJ zQmA%`gDyZa6LbKWkS{uvxqs36h+WK`39jZ7TV)t{KMVvT8n?t-!zvjR*y>~?3t|9q z3({)#2>bm0f2%bhm;nC(03VA81ONa4009360763o07z1mok?=#xUxj&*cFTeZU7sA zVSo)_|MoB9oB(+xRn_~-Or>-?l4zoF_XxJD*4FOpx?1~utM#sTyV`w!9=_`RdEoPV zy+2={r(5|ve%H4Dw$In+Me)-6+Q08t-=BZ`=Xl`We?E_WKI8LbD{a4;mwjHn54AsJ zA38of&LIBPD}LQiRR1gcvs=99bF!Z|?!Wi`#QnoQ>l&YUa}70~zV}-{A6Z(wcc1q@ z%IEPGFNiCzaSr?0_~5#)#`k?5y{@uPIL@cW7456um+281nSCBtj6=g%(ANT3)0gQLvEe^gvDo*9TmtUp#`S~;YoO6ve`ucpIYt1qCW1pWtPk(;f-#*Wd z+2i}%FC8TwAD>tE@p)jsIG*Tz?bq#xMm*E!`1N>so)}{vr0@66{Zab>pO5~W%#06+ z|5uz%kF%a-@x$70`~2BQ{+#va{qgF3MxVc&|Guo*yC?YhZ(sB0WL6v~J~}RF?FaVP zK1htnhz}W`U*dIZT-ROpSh95Y%8L1EITe}XkTUw zV+`3I!#y8;4?>LP9?Cr{pV5x-W03Zk^TmAbM?1gG7(PCC#?znol)Z%Zn8sZ1Loi!2 zzW4aMXKBXdju9(wA8yZD*&jLfv9DORVKhFAKlabP2brDXQ0!5>b0*GIG0^c;Ob!FR z-*(3!UtwYPj~8ZXzrTbD;lcgEZlXBY9dFGy?VsZ0Vplh9SYwuI?8ca!IBu+mFj|#) z-p}t}W9#jW^w}7DZ^aTFG1{>O_bkm=wmrtI#~xj=EBCYe9iL|yuo%=4J0o^C6B`F$ zU$fWus54Rf<$HPVQ;Wsc;(J)<#-*}|uUPu6`3ioHF)NrZMm&t(#c*!>n!_C9cr0)1 zj%#01*{jaIz86X?sI)zMSAYJSZ08XMDr^BmGzz96E-6;nh=Gg$dR%<0xbAw3A=@AS z8H%w@uQPI0&XV(wU9Bb!Lj%^J}#{Hagnj5A z^7=ok{vyKISAN&Lc#c&_T4MYn1d45OPFcrG6mv0j4$$7uaU_=G6`|C{i0PsInT>YU zG~#hpERq;x=I4q}xEceoFQl^0_%EWvu(W$Ol?+JM&`A!TUIhJ}NCeZjB7ogf6&F#i zh^6zoWANhW+hh??!~^Zlv~4F*HNxt<#Bz2mM_LuHy_#zwF1tNJpQC~Q&y5i~x<-(Q zDZ64>w;UY~r3Y&fmVfqhyH-TY!+$@%GV3yE(UX{Sg&B%a16L95>O?p5D{*2lyN=}Z zx4cuXu`;uoW>(>y{>ZGz1WKj^E28)n*+QJ^GH8r2sDCGj@$KWQ%&?qMPiPHNL{B)9 zi+EeCmb)2X7Tv)a#TepnPmyY0X0-(Otr=3sn)pl=OFi}yu7ymD{a@2-u!tH98{71m z=g%)a!zhxKX^d^;#*;o6UykEWPz=`=fm;Mzk$92%@lSJl-zT<-XrjcVt{)Kvsn0Zu zBW&35O*o-pY%{m7B2*ah12IiErdeMx%`~QQ*L~h!NV#Ht{W$&(oELfj&xmFa(Ud;U z37&{%y(5=6oldOV-;qls-~4d?-LLWajMZ!W*E8lk$Y|r=jU;Y?nLCF0#&nQ<>@+dW zU<-E>{uBg7Q>~xG9bX9*-C|3X6erR_@uTa~Z5tjPP-ffY#FL1RM623ebQgwAIG>8M ztLa-KGtHNfu!bQj>9YwMYC7M`v_DS=%OpUQiEQyR4c;#IgdXS8dN$q4MTpjPFeUZ~ zU{+kUuel8h3C2hf(*M^SgmU6gQgxh7m~S&coSN>WRx|9IBXhk3MaDa%CLoDnFPGrc z#9VeP+-GCNx*g_EEbmMN!WK_5$f0p2dnAl2%k{fIYs6+4nLLerF+f=)4y2Zm#O(xS zTYc;%$H8btuiqmFG#!>nR{15C9FB3RqB+iU|B1NCkHt`Az>JqDF z;~DnUC!)#_6O^;0Pppkx-8pHI6*%aCO5ltU14fD{)B!@;2tfm!0!32%bg2&f|fq!F=ri6rzXTQ=+Y;Jj3<(XEQ zjJFdFB=D1ICT9~%u1vhXdFJ}E)&N0_`^q$PJ^xDn0HFE#Vj%rU0Fu~ec#rUr1~&@~ z5MY@zO)zkgL}BusvjJ?<^?(I%a0aexfFbbA)p!ac&>nt?LEmRn4*U|xHt+~Pv1TG6 z1V;i2&Efrgl>lmnpwGw{fzWAyG|%*IF%=v%%s~MJigg!}-k$P6oCT|AKwQLRF}CEO zJCXlHy@_#w$?vHdWTAavWiqad@Un+NS`kvOvX3tg#KOXwaXy3CybEkIWpNT=9Lpe@ zj8QXg-0=tjpV1d-Cs|@;`-b}|VOyF`QDbCchv5iwlC~*)%fV&KZE)R)!3nuR6+s%W z00r)LiA8}a#!2AZ3B}1(?hNY9ldDkelcV`@wUx|zFH?!Q3^*6PYdcqV>-xzOuI=0f zO3f5Wxk!$}(^WE^yW4cG~eu0}p4KmfZ034oiwO=g}TC43}&m5E>a&P)R@v+;-+ zPGZ{PeFQ{7IVEC;GX|Tex{sVPFut3lOxWUMw*lLhiNO-2);OKeZL+Dg*d0h~z!eZh zgYNf}B@NP!G1yMA-LPqq?i4v494?q_l1hDQJRU37!E9rf1mzTl4TIIO0Y=zk%%s0G z-q0e)3l)*wiOj1a~B8J&26D8P9%E!JthItsq^j6o<>{sT2Hwth(=qvN1 zk(?uDzB`H-u;6HGq74-QF@t+zWnxu9Mx&xv6b%9jvr(`a!M2{)OX(T30lVIrNd&vw6 zymmQm^{~uhF`W$mz%iIsftVojW`PS_$#cVV{NlOAfD%?C6IunL`wNCS=dobB;UYYb zabIZJv!8(8+_Ao0Jrqe4k1DPrm1}u0i@xF?YyD|j)`kFmQ&J2gtgp{unO3dS{j*?_f z)5p%vUH&>fci;fhy$xvzsrvDF8vG&~AVDnVYbMeA`M-2SdB!L)0HHkJBNX}If!L+} z<{6wMuq0P(aFAFfFYRz^RVwff=iW|`oerTUH;C0tcnf+-jZ1_MMXwZ}C7+~kWLGavpY|xaULnz2uMwur!)~Zf`U9X)NFjnBX>x`=T@Uqs`M2{Ih>OW8-QhawoCQI z4d%8#un3AnlP0h8CNiWFpEd7E^K7~#3lKAK%7xz|5CQ>K!d*@cF zhh`3JcAxeQfGDGfN;9%kZB6J@i1K@SX(ytr^k-A;lF3-)DqYuzXGKyWM!H{Fa8HQ| z#jAS;2Y?!@LXtOp6xcvqQ;~aBp2;Xx+}Vx1?s6kncShQSYlEf|Pz{|^xG_LafApt_ z?G>a(DEpZzIrOlA1g7;8t|c-iioZ@EdMAUwaZlwE6~;GZ0FZ}~Q#95_1(glRgM8s* zJ;CH#6N5*GLxkQkWl&rQqX4BE^IYW#h_p|P94D7-@s)tFUHISwN=0J56mn`3K}* zb-`a-jAGKN4Q|RUZ$Bb!>#Z-0afbYfT@^1e8XH)uHIJN8dZ2^!5?w|*u`Nj-iROnI z4Z^|PCUUyZHZ?GB<)>GZsRkjFlf{?vdtlPRXJG@t=&Pe`PFs7UVf4K6i*( z)r_V`p70a?0#+}Tun|L+PzoY)291a@KyRi%A%35tt#Y2w<{6}c_JT1d@iaL*wJfT{ z0|eFToXLKj3~GMZ=B26z%$ayG+0vdI^O;X34C53hy$ zaxp}N(+!#y%r}{`OuZ7+2q+|99N?au*HFZzGjW{9L3Qe>ef z$n>5C6e0ys!(qOLc!m8p6YwSfBk)9~FhcK4YSh`(BNP*eP!66!@+^Ki&ianAEU^sc zx@*cNZ@)Dnc--Kvyb@~ll9niG%kPZ+?-VS=n^R|-LV=WO#bzyvHD&zGpPn3q=u##m zoHcYv9IB}2B-%5#y8`qzJqjxR?@urP`SJhq>4ghP8SstvqM@NC+kqh=UIGRbe2tK~ zT_j~0^@Qt=fN6(EVROi=<>qG832Z`ONNg}(^kZH#^4oVDIQEBNYy2uP1H!pOkj1tM&nA+;U$8d%hC`v{(RQ9DEXCIMX%#h zKo8tY`9rmADkU#yAIZ=8n_-uWuM?j&S0|Y{YI`mfe)~d@B(v>SwB2w$2K4X;@=At&E=C4BDl^{9?3l=+%$Yeh^^=++Y#To3<&62(y0c36tzvNI6HcpUE(5*hCy-SvjRK+6k zRt1EjCBp6{Pz$0-e;#`3w8ftK-DkT!u)e7mg zDnb)h!1HN>-tqDx8je}4^~jiSkJ5~h;@X>4F%7^rw9M%~QO~(}!Gq;mF#I*4MQGW* zCCLQ?ehTYz0coK|CE&`klUs@#SSuFERa0Hv()?k!qxLW30mlQlYai&*hZ%}zD)Icg zPnBv-jZPBqxL9E611u@*NsVk1mQJM^*yGNm3hW-)DG!rJA{tv@z>6eNY7)_0Xr;!f ze_e_fI6_CKHIsING3@HLB7rIh7m#F__rAZ9Syrd2QcP;OJlt}CHgd~j9%V#_R8Aqk zm`!9m<;Yb2R{HOhexjQj)>V4k4cGQeIX%lCHPnfg{NR>>_Df#sLoG|{{xh>YtajUZ z)l5Cgp=%@66-VzW&|E9Cc+mI7HRmWo@O82@@S1lLPKqo82SRg{xPov)DKNi^Z7-xO zu(Yh8eQ_oAE%0kojlgT7{TeQm_iM`Y{8H7#3l9vnEXa^ZbIcinTq@%_{#ZUd zje@d2SmtzgJLId?sFPXm<SlH5}* zp@27wC0Nwoy4+Bjj_+y-1+g$=zjV2WKn~!gjFgA|sQ(PmL|ty2mHZ2|SB&6BA9Hqq z)G!RLh$+H3;==gHN{>%3s8`r{S@q*QsTYNWTWQ{ultQzCnxwu$b_|)-a&~*_g9Uzo z*g{XjYbgBcXII8HV6i;h-EjCR7?#0JPTWyZdY8ka#fF9+skV? z3!N>=bRHEoUL^O>$}+ZmvjdJ?cct5k#oY^ng*8rvOi#5Q_~uHp1RB;?ma^k9@{ma5 z)=cYxn;Y(~fv{l-fQNp!C@tiY-fM-=oT=ZQu&fG>sbN5j0@=6nKk-@|ZO}f$?LIRxV~MDabQkPvRJ7Wi#|1ojH}Ce zX#FV94`0uRZg;a%w6gjE{g-rr@duXvEPljCo77a`vgEDjA%_%tX=ZpTCfPL?Sg-3~ z4DnGmg!1?7_%QGq;?s*M*jX$kDWfMikIjl@qz#)1`~$6Od@jXtv3At|7eIMr?#o!n z8V7uOy+<+v%Y%$>6iH0+1X_tJ6o7gpRs;~5K=A4^7veoza-$;7LkwcVBP zxTpt93EpB!Fdof?VNoI0T2c{kk*X4sIGK+>Kyk(MtnHC@+LDHqPUj`k7`pmF$q2@w zNOmrDQ9b%EB-cMv%{y(~;MzM1#FYYolmn;U603b1{-gspzD%2M$UdB=+sd2eZs1R9cI-sQ!X} zOR1o|O2z{doeG>+kRXpD5kYNy@;wF_P|(C2AZ$a?(6`Oz0qR zW!Y-6)bsm;uk;LfM8CS_iyg9QkW8=Vx`GZv!k|))9y*>O*ah-Fa@Ow?o*Gq zUk}2xD?x6n8h4(`&N3Ob)MzLHw6@gX1T|hHXp?|=T0VdfJ@s|CilzQVBCwm3$vIDLo{d8lP*^i;SJTc%)1i}yNfcoChxPseO z)L=J|Ia4Q?dSKF8k95?gK1C)vdjrX^)KsL@+Xi#g4%3LIN{tnI_yGG;pdz||XP>Z^ z_#VWrDC!l+I&=dU1V`x-p=U?I0FjL=L3m0Hp(TQ@bCm{2MN?EsllAVsc6e;n|2R$S6*AUg>%`(n+2<4}Xi z+1|mX&D8l0HsR3wgt;3AmBXHCz#NH9u95N1JcV57T2_i|h{N3Q;%1975r7c@7Tt3~ zOMPV}%;3#4!D1{*`tR^F7M-j_VNTdRqPAc4vu?2`JdEg>n0@Bah4R?-y`(CPQxan& z#RgavSvn#WJ|=hB2pwcni0veoK@&x=e!HPa$ejueH)~%uJ~! zZa8*qH|*94Gyb!f(}!qC1Q|%qyqh9$1Rb$556rk``461&-x|$Le3kg!_*wh^0F8g( zjB~<2!v!Ead7p@R^y@?tXAEUinXd)_D@#EP0K4H?x*&q-2WTwzAYhoJDZm@Yi^7rF zA?8^5c*!5A)d6HPWd>W&^<}DP(;d|0)z^>i0q*u1;yj2XOmSjIxAexUl zA<8+f>~kyKeOKvWT;46i1$m9^AmuQrh^i`NjD@b2B4`VrLe-)4Iu7~bTNO@UFty1g zYdS;w61}v-m$noTSO#(*UANbq`VGz_*z8j2Mitj{r8!W~fBs7v_=b1Qa)WZOlblYK z_$*UFV}x*u8o^-!ZMOj=Pa7Z%gk&>SmPZMhU|R1d44)lGNAi%F;(j3%eAb(`=UY$F zXc+F|79PpW&BtGBV`if4dVplc!nqrTvw0Kem}xIeqt*Uugn>|^8_WO#BD)n#PO!4m z?`57J1nt5^eRdU9{afUbS|nK06big_x;F&`l+{L`xXVrj*&is@TH1e$NeBwBRQ>9b z3$g~Qe`AHFDj{1L$m1L0DfNgoT`XHt&L~-a-5C!O@EH_7&DA0d*s``qU_-2iBFY_k z@iX-jF#X6B$lM7;;_b<3d)jBzu2Xff|rcQ%o@mepyyew*chiK!WixbG22NmKVrq{$IHs%CTW^eljqKdxKa1f3zLH9ju zMHwfV4uoA8mPbRQ-9m1@-k54%Rv2?eG0(g z%CtUG2m3fiNNKIH7skaT(j1El3{X7F<-}By<|tB7N;=ENF3zMCfL?eUHR*dB?oz~n;nHS)t(UVE; zp$xokbG2z)sh`HLcs`F{O zjmj^DvstXGD6~eU=5<7(xHw&5JrcrZSa99;=5C64cOkJNIqJ{Uc&n2~fwrGqNmV7v zzXEaXDM`qjS+iwAwDPH?;aUe7JB7qBH7Th-;AXsVnvY`{4%Qb1X_(wO(+JBKxSusCeIPai2{1GZj~umAut4#zBh^)j*en+VI-)`VI^=HWN7^jj0%*d9 zh!U$B?s%+J7jf=B4IH_a>Cr{p9sokkWaLu5Sld%hzz(<&pOQ$SKPQ+?6@6^`qG%LL za#?Po_EZ_9lIS}-$JPuqOEs>$vVE49*`Bdec1{(5(P>zyXg+2kDj#PxC_3g!(s%=+ z+}aV8^jUdLB8VKB4AM4;VJx$Jn+wIh2IyXDs;+Cxe4u5e^IbFIO^cbKC%+Ws$5stE za-R=L-XRmCB&3!hL}YY5LG>kodEzHF8XJ)yDK_d%#B8G#*stp>s3YaB`J)xN*gb*g zC^IfCCla@QW#v#a2@xr_4B$FF8m=&a&53VWf|U65WnF_t&E=Dd`gYON^s@8?8UwX> z{_GgD{_-4BAYblGNKz-QF8xj)LoKGy;}-XV84Em2xr8L*8mVDg<7k9bkr0-x1dj_8 z4iU}pLjsjfVEJ$vP-XccYeDeQgqerT*(LW=DXeppl z!0iaYUo48h6~4E#3X3M=7!V8(wIJ^qHsZ>bwvmvRD6+u|->-U@B z9agPE0$CnY1$5(+GLpD7La`P%gHn%qsd>$&$kvbK`!2yLmu(A3E13riny$;v=XcV4 zH!URKAFLdSszsW=aB`%rEsLDm6BEX6@C?NBBKG8dR=3F3)$RoG?pAZ`@Gyo-cUpsL zHQRM|o6uX@pad|k!&6;$D~jrurroRt(kRJHtH|XZ?T-cMK|!aW4ufhQG!EoyB(v=K z8hMCpeSAWQQS9NQJcy>ANMUSnBxL>dukQ9aK>C*vY7Q`TT#Ou9jXA@}67&!$NSl+4 zf!R+(IAxn)!##1uON6S0i>)p}7e*pBS9X!6h*MgQK;bisk%$7%8%*Z@H-qnH;wiXd z*rmZIn7*Oe6o5>t`Tml}RqZsSn~R~{H{W~&_sKW+E~*KQYs>YbsBvVFdHCk}@Xd$j z^^RiMA%TW#Jteh@OdrAhNI{c=`*WTl%;K#EcKo#|5;g?E__D2d4sJ=x+sr*p8_^0Ndzt$9B}e>(@nM3#4B*V z6m-f+lL*zUe5qM-bwxwe>sTu*=2S9Jo_Z;&ImV(UMZWDe9JQ$=ma;t`*tn4Uq@Nn% zIDxR9G8k5nH9h-y{~OQ0ltTo{OaYE*B#}CH$|hK_ut)v09$kF-!4tg+t0Omf!3CQT46~*0#{NIz@;2s>s+s7 zf&hMDG^&hvHA1|jEG#P)Tei0_jU|jDAoM03;7F$K(LU!O!FA?{Y7-7sbp~{OF@PnR zw}ISgWd1pm0u&i@*CHh`CxlvDFA7lJ?Wr_41mLgpDByH|Gk~c_7Btfvm~E9!UB(#TA2mW; z0~y_VdS^}Jcr|t-c{_PLLn8*hkkr?e0E)tt&@6TJO9}F$aQGZ= zg(_gnGP3#xox{Y@&1I>UQON2^t@QyktHVT_U_H!?JFsNk*fef}E}xLiDY-~GLnStv ziy~s)?JHtT0r)zOrh!#9YynHm(W6<>a#t?(^aJ`Ly>$j2d$moq6X6M>n1f1_nc@{9 zG}7&5Ql@tL07Zz@NsT^F5^kSV<`Qv0Rz(rCAmVixz*0|xg_BR%<-vURe5=PqTa>A~ z)*acBEeFb>#23iOu-rZ(fo&vhE-!wk%uK4$JR3~u&bs}Yc|_bJH|1frKayh?-SXBb z)}*#}S{sBiE$UZEY2qm8V7SR#90y}W-Rx~qIop`ljg3xhcY6S7<+v@A8fvRW1QZ*T zOhOa)lF=1BAr@)rNx|8oI6tI6msudXF2Ly9%+hWrHdD~pg!?4HEL_X^Q_oM$dlEIQ z&|MKPb^nY=zWps9`2YM~em>xz`Tb|ipO4I`Ko)Q6-KH!I7+;dnj+>nC5PpP`B?2rX zV?cv|uKo()&wYo(%$G;1IZ~UZ2}ET3^Q*t&c~5&J%4o*(d%L5TK$ z4(L;SpS^EB4>5fu+lO73t!PBq9u-LR^}U3nNVI9)5;yR>25*u{dO!s*NbMwf z=mCo18ybe2em9q`|9BA5SQQ8vJI1hm@68(RM!VEu*h)Y ze&NPi-gL}nBiYI3DATS>!3#k5xo=5D!E$-P^dLM_gwk5g9IEOx?j$N*i##7!(!{Mx zCO)ww=|Jl{2}xP+)su#Ubp`C?yV*3y4j{4b>Ye+L6H$6}Kh($#wdhs=ozGtxteQq3 zeIQgxobwg;5kJ6qLs+MgC!wX_dZ! zr%!zuUgKaboqPdY3>Gv(w6c1_S5rL;bxKL8?9a#q8yJ^7G?+42Af5qE!}IH)(K3d+ zN2&Tw{7YhCe++ z^~gaN<1g`cf{WSdQnBL?Y>{yUsf)QPUXQi!Lv7{!3QX2_VA2ycEI(nxOameEtjT&u z8Bdu?FJECs=!5@)4f_*itfx$+^r3cpRAM*LN_3x*$1&uVxPgoC8_?xEd1NdmE}4vO zCARs>bD(lUH-t7y`SePn4Ak-9kBD(BtJD_kjv3(0CcR1pegMTYpIM2<#Z;C9iM(*) z;arZyi4hVVoVYucfw;=9&3}N2$6FInY@88dro5|nR1s3>c*-9wM6#rMvw<{Zq%0lE^AG z5K~o1%E=xa@WIzs;vj5{@lW@h&r*QL()X-C*~cm)r7~|*D-bAm1Z#8qLvZdEeIeEnnkBnrh@-c&DImQ0x<59J2H@9Z9`mnsrY20mYE+-sZ$mc zOW38%R4M7m0uva&(i1OKk)L~_+nJaM5BV|6A%{IWDIj;9er9YwFpZg_H9S;5P``TJ zS+Zbesv4WhsDqRxwqV9mZU9k>1lwLU)VEKveg{NiVYTG)n;P;;;u8FGYDlvaB3Ve~ zMq4dkADq}lUsWHDUY9i`iX`?DYKg~(_!PO4C{t5_S?;_QocV}sm&xGC32S15P2s{m z^@5_5tDtLX$Q>kMfU~&`>}3nA|9~w#a3o)al2Vn0si;U<%ZZQT`++e??NRM)o?MPNy%AYNtVC-Ork=gCF z-As!wZ%kCxC+|f8RRxbDt6`K#fKsp>L@6mWf(yg2TeXPxfGVDmUcN*utEN0F4fHWa z5c-!_u8Fp8M$a^2016iD??QMzvs6)e#nKZ^1EwMXs`=`fJc&cD3?5MB=N~W0sVE5?2dA}MVX3VprS=uY_%PEJV$>LCoa#xrp-X$t z)*g-Gh(0=wgR}M@{~m2ertf9^Z~52wk}H!ravQyYv-<{yset$bhL5&`MKel9?Z31g zqh~XL2;fLuVx=4?xMWpaR^8zVM`FRmT)(v);f{-ELMYd5r)ZY4pnR8YKBmb@*LN#N z?n!<<<aY?v68t(>8xodzu(Q zjA+3<_ZwM%O6gP)E5HDnBIg&_6vk`dV`}ZOuIdY9$wc08XLv$duNDzG1@GX7M^j_Gf zQ(oY$Ugo~?zGLdPS_<+g@;_27jvSy<*3O~3Na2RM4SKTj+IsNxa;Jk7v_B=X8CkSE z=z+*nZ4)txPNEtL9bcMt7QCq?QK>quaTApk`gyi@dU$o6S2lDGADKn<7cmK*J)KTX znorH9ikF~K>=axr&V)1!~|!wVQ5!=s9LEeSc^kGB#XrC ztpc+s>_H{e3`X#)*50KmA?8Fa6F7aTDK%|b`2%qPty?c|IZJ2tQ?P_SiE<%v+Io}6 z{r!i)<#bpHFG*d-O0DA`(A88MFwm-*pl(Z|{mvMEDmjc1Zd^zs&zzYtQ5d)Ajo0mz z)wA`)!1QG%MFAOk>Hx|l*e^N=ix;)9SWvWGa2|N9D^O*u(smml0NkL+TF-LiF;N2r01# zoenjk=s-p$g9qa!`1wPGG%YA9LL@zNz#l(2fS|xAcDwLcU_%HqPQbRhg|Um%VFf5& z7mUXDh)T^=;Tlejevs>BF%aKpR;oteQD_-Mx_*M9K2NKPk%8w|7}XJrF6rudnxthM z#i9@I9w&`}Pyi)r1ikH+(jn9#BS8)qR3_ny%lNdh?C;r6Inr>Lz!<4kaQjjWJW%{2 zo+*UKq8q9ng^oib2lN4wIjD_CixpK)a5Z3rz=6v-n~9wY+>P}h1F>yO;6(t4!;r=* zF(EKcgeYyA(%Ukts15@o5DihBB)%JCD>x(Qtu-o~n48~dvD1LdVy-SFWoX!q6eEb6 zB2UYn9m3?O{@nZ1aQjE&kMh?2jn|fgCUGIBz$$kfk=MSR@gG|bMfidH++oA?sAon& zmk@4cQM0E+J0|Pjb*Lrx*Tho9TqGzs-X<$gYbBVo`){9WnMh#Xa4BUY*ejOdflIMO z<$D09TCy+OIrI4(KP*<%0(bMjA>hZ}e!-Bi(y|{{lOv2v7}3X-t?@6Df?1mLn`!$>^I$)deo9M&TAzsgsCfG*SA;5uNVgO+rqr*;``H%X_>}bNRgYK zn(#7B)isl`{IcXFOIU*IPJlydy{Q~GW)^ocT{s=rB=D;}*J{n50~<2(Hsa4v*CGpo zy)564QJwTyoXdU&R>{gWb>T@^unZJ(v0)h^(<G zEWe>_$gs+-%iUg3%ipIH=vB34Zm983n|)7W=}B1q4jTU;tg^I&(J7kXAB0s#jq6|k z($u-s`V3*|zllh($c5j3@g7<@uaR+AS?Ic}mgEjeZDhi1w2o?1wDjFhAw) z!!=5n(ePRggIe|6vFtiIE%_$!fem~@*NgJjf{fZF(KMAOMKF?vXGD-tR_+I@jJwP^ z@w!;1PZJp0zb&GnWmBjmszy%yQIT|@uBF3RU6pmDgMF>uf6k${x4!1C#je4b44Chc zANb2h_9w%6`^YEfDX(o~JkXCcfdKF4uF1HCdz+7!jt1E8U-!fl_LWCYlR3%yb59Ie z-gK{lZx1JNJoO%t(f#38Uk(;+cxi*g?cm`iKeyk-Iefrh1`k8`Vd)U<@cHE&(0k{IDQ-7~UH17>*(>~j+v;-*|y?4ANXWmcQ zvaieg{jfrRudJgf=crT|M!gMRQr_h;5D@ za5;QdIW^(cnzWokRxsUqpQ*2OHfTI%zoF}S$?fufmFDGC3q2|k<%XOANF{tt0R=Q= zm15L}S{H5`oB$AkUYqv<18-NuNhw6$)cW9_>34z=Rht$5fVQ&lpEs^}Hnk@|w}UtVUJYUhKj|*X<;e&mo&NwpB^FJr2;*(hsm% z_>l=IT@zr}W=6nbqwtylS>*|`iQT|Zx-ahlR-$l{Nyh7>{iI{!9ZPAY_|$w!YVdJG zoyl5uc*nbrOnbHkrN}nn{EPDUBQQsURx;6FBh^gEex^#AsA^lPt%Cm~EsZz(i$Fr= zD8wh^j0Pw2jEOXlPKEtU#3(5^l8bpna^eL`UzZ_&Hw8uvcL2ggpeRrvW!kf*t(#y6 zfVf6NN?>Y|99*RfTJKXNyc%`c! zv0CW2`_~+NQ!FR!PnGw2!v6A}gJ%+wV;Mc;_`d@Gk~mo^SAGTlzmwq(UKy5T{V@s7 zL4VCb>h50u_Gy2HZ%sHc0eKjMF^)2UXn%sLp3y9TnhFOJ)JTj~shr3YmMYWTjY<)z zr;ZuqkE4gRn`wzT8S*N|b0B!f3&l>zODBi!s;*PGjix)b_o2E>%zmv*^@cWlnQ*Xb z98h_nnJQ{h(eW*3F&W`Qki*DA04Xm((-;Qn9@cKIXQMNjZ4Bd`?mtSTnjI)%{i{*{ zUAXlbE+QPrkn1P{aj}FK<@09dl+d8miR@&Wo2SI47nzONAHelX)SjUt(3qx2VR2AI{884$tdu8I$kB}+Jq>{=fCuOdr*2FP;3UsE5Z>24eU42-#{guipRqCl! z8t@X3zRSt;HhP^JTpHuq&(iGaQZjIX*4?Sr*l7a6FZG(0TH}_t)3EyZQBxc-03mF_ zm!0ahQx}I?BBF0F9s*{?eEd?>OWqV89hHij&L%?Y9h{BSZ|mO*5}twP2W#*mMaJ;ncphudkidl15ueG=+e zsdrrum(c9K_^N+ZT&V;EOK>vdQ<8@orCb;S-C<23PcBIvkD_~%(v z=>OZF{`@KLU;G0Xf;N^jWd);!$n?4GT3~}PR7(|U)opM_VsyHDSy_MOozM#n3QnF` z?^jPW;SgXEdMDg+aBiU{xvB~4-Uwz)p`=Cf>DqXq2 zYR>Yi7HgV_B7KTt4m!-m=K4Hg#54f&GCo>I`Z?BVTg@$~rWSWRS`^*vdR=UPI{YEg z?PV!G4c7!{j3$DBa&|=qpK&J?hbtvAm`+5JxYIfYk$U5X5dA>08F4N0stg#U$$j1& z^O3Ib!k)U0ppYL$K*U+oa)^nvbf`Rmyi zX2qPZ6?VP|BkCH2Igis zmV&TFSehq}8(gs5^8Q<9;_YI^BR{`)+q_IeNv4yH9-&#Ns3`?HRC%g&9%jUBz|;fc z0YU(b*&q(IMm)LqL;?tH^3s_6faNg^3E3MncQOjIQ-#1*1xb!XE~&z&`?^8Qi{g8v z>l2q11k&F!~>m2PhQpHi!u*+n?XPF%OsRIHb^<(4Mn^m$5E04Qi+>_1V99_#8 zmxt#qe@Sh|52+1`wuk2(Z&gSCPF?3abrn7MQyf?x8uyVZ&7V@6zbLEJR>(O2OXm8e zw9$vfX}_d4uDu`V!A#p{2G#Y!!9Oc$P|+xP#VEQCd)FDH0g8pR%Aplk&J*IknKCnx z!8`$MIm2J(aK$JEFfUJ&$fcTb0i`oth&1<{B90t^q3-l-t|7IJF&LJR>P<)TaJU;|Epb){ zHa@MenYqMg5t7<#d386(3JHTp5XS}U$T{Vu`q)a#thdy7P4nehT$x6bXd2nJK(R!T zvZKk@k5{nHl5rX97`Q~WjYAMWuUlllAa1k_H_?2S$x*}fgsHpA#|h|M=JE9-_121U zyWKaAeq@fG5+EXvqJ$H3vBZ%$uOq@syo_MfOPS= z#OWi0dQ%`JuNndu>+rhcla;}&{8WM=8H3z}47nv^zIlIO>B&I!spZJcsg#RhBxDl$ z&l}n?&p743b(t7)J)DS~Cc3OlWgcgt9%`I(L>k48d_P;JPyaxl*CAULG7SCL(tSi! zT+)BA==F^Mq;}|no{&Jc~&y!LrYPKatCU|e*t>qkHJXjZ~jmS6Nis)64jKoST)B7pKU z1Rw?L0>fY6_54zDMRxO5s_;v${8B4}CB6s*?`yQy-*V-*Y~>vS;9r(^d3-Cm-rvXh zwXdA+C)g}KSLawdk5FPne5!(MHC(&TH1MPLsjc&Tfqb7GmfJQ5ZDNKXIJlv*fVa`t7o8!-5{ippMN%ZwU zg7u$U^@qIdOO*NEspY4!{i~g@%Bx@dw0yA4Y#C@74+>_~>@RDDWOJl|HZ}PHv zekxx>nNhR3CHCL2ZYZY%2a1;$))fIm&llzv@9C~dFOi{X(w0JKvbS8f7F!=Xl6zKG z$G~8JD~IU;-k^>x;wdxc)U>WlX5*7$^b3&P)Hrl;u%s=fjz!waSYvPz0!#f>o$PdU zQHoQXY-F|ODZ`uKVLI*L60g8HOS6M?05#(2-U!_iZ8f>zV;py6Heqy3#S>QNwP{ zP$o>nW$i*biJa-3E@l~|Mi3_vr}>_lTN!I11APOyFMAOyEc>3FfNlP%;{Ki7mw(Cb zGst`-+9$WiUX-5(V|^KnU##>@gR<8}`K3pl+4M@szS6{GZoj&bTi)&=ZFK&(@}a}7 zcB6~lkBNzZhOi_#&2g}m5j~TuILkXY72BYT7xC6_gSmc4BVvurWbsWwN-0m6N(srkLSO9}0dv z>`C}vKoHFk*8GkF^>Y0B$ZmPhn_`Ob4o81Xm4OCE47B0|)fxTxOV}%L(vviZ^O6o`Ot;Q9 zHmuFGf12}WV326{2_H{7no&bmKmxx>ji*gygd&Io5#bzx!d~WUraI8n{A(e2--Mp# zE5nD!c=cnv))?Q*;N3HA{;FGc`??J$`!R(c-2Ly*fTzC_lV>3ib7x*szU$yv+A~6LJU6`Sr_84+MHLhE=77>|(v#%~XUU41)t(863OnV|$iF$ve5iNr2qd zF(-s*V0y;VH(HBhBbL}fC|za(nypz^jq?- z5_E+^nce8(-%@uFwD}@e%+hVa@gdD6#18GLG>VWqjDEs6lVAx;ZDw!Q1?5Mm5FUGg z0S>2iiuPr`mmxaH%9JL8)U)NU#)x_@8+qZz>`S=pyW_x9- z0a!8IUKrZ~N)|?Bu{_NI{)cbn`7w>pSE?}j&s3osgY>uupVl=MhNr=ONT_nq;HWcI zFoZ8N!@KYZe7J89clpOHs(NM$g(U~Gq0EZYgdLos8YVQ06yB34f3+Tc@)Zm#bI4h| z$F?wBgpED%&X}J40hXTBDIyacPG5sTwen<*vnZ-_B@yJ&#)hNsO0W31(UTM!gcO}^Y(E%ygHqbrIbn^1=xXY3P1xpb2;}H(0pX>}7c%{A+imA=}IQ zIG}Z6m3qs=&%nZpq=x4-EQ*_7HLKB^#Wmbm?V?zxAtk)*LPUX< z6{)uE!F{O%PT9;oBTzxS_y zJ>L`e{PT&|ch;o8@59rkYS#is(b5rmlVy@l_Y;{f^cX3qS$M}00nHGPHfo*nfHRpc z?F&-A5NIuRLyMWo{ep50qp?n`6I&`p+9oS;d-9niF}YC0anRFYo>&K5kMRq2M+^ zU_;}p6x015KoHrP&=N6j#poMm>+!BPdu*mC99d5mCOPK9svzsHz@r&zBl{HOO zZo3??Tv5v3r^Bpm45>QK8s01KAVU9!MqfLX#x{LymPqe=cD>4QxmgMIx(cxKriNF# zN~)(rZ(6c;Gvmcu*)atf<3$9l{sS-hI67hsv)Axf+;cUdv)&Iu|C1j&t==9Q>$_{m z4>rC($W8Fizun-UMD8CveEBC0*H4&aJ$M<*e+{|V_qQIth-#42B-lapo@Oa$FSI|r zAHDo-zs2mL6Pbedj=8CG$eQs&?J(=`$|B;{vI$SiYThV4ui5|7vTeF*P+@UuZFxsF zYiu^~ylPgLbCOZa(XOMqzD_?*ip$x=6t-32lPiNnS~oU7GpjwUTt?F$(cIm?Np7GZPIQ=)G`MYx30z4sweqW&|#My_OX-Bo_w&h6zmh~5$w z`0Y4~o`agN|LJya$8pS(w{ufa`!n5r@?B}pb?)B=7mLF;-Gy&{WEk#&*J(WIZh6jQ zKKX9mRW3Z&6g$ggngC@FROtc)NtLi?1L}xTghmjI=PBX3eao7pnFeX63MTpMRNISO zO&0&leKVK9jQ? ziLDFQOCn4GUun-NJD7O+=m|;?KSAjak;NqK1caIRh&@5(hKh_e%qAjMUS=sGro%(U zYANIJud<~hSxBj8hB~5Il^q7PfzTY;SYk}95-)RQI1T7OGB(BZuG|UB0SZdat(M}2 zsTBrt$BMg1hHCTE#aO3jrJ50Dm>bK5xK&)qjsun?QszWK*lChs_uJd(fWoG*o>z81 z2xvH)?~=`O2SSX#fAGNUpHlB?Z51UzWY_!Ffw!jG0OZE(*`mX~ z9@QrJR(xs93te?>rE6Im1yxtt&1m6#d1Rah$#~(0)b({$*ZTUJhkX!pV+!|VmHtG; zn9E_Z!A&j|ERc63J1;gE%CtYsW&g`uN&r39vZT3uTg(1FQEC;WvW|=(>{)r4%S;Rs zA6)+h4^mQ*T#kv{&o758!Roa{Q_Jtn#L&F2mxGD)V5Z<k92V|*sF0X6FMAS)|ArC#FkH&!I%wrVyvoNleT3n zCj-H3)l(*(f4HZhJ!Teowov#ZMq8|vQpu-QsrQ%Kse3f42j5C z-Ee@rNX-o1R$l1z*^$y6L=jVbijUru)9|YM0?-VMX+4L9?qAwRW2P|N(dgr4yVB4m zZ8eUeu9aN=Xc7EIy0IdV_->rHQ6;8GrWY!$7PpWeTyV)%_%o277if=slUv zku{UnE_C%I0+dTWks;GFk>7~I@gdAWg+gMD6Jc9&9~G zQ7u!k0k%>B&^WqC@{K3{;?ZzWmzagO64V;~XpH!?O3 zGR6)3aBoK^*6C+pJBW13HQVmh>_AuQX#|&dErGlCtpG|uwZHW=qOSA_1Twk^;u^p2 z=ao#S3q98D@dJrY3DJ!LpfeYTwH5&&>x=(Tq1*fEY_BTaN-hn3^*`S);ygnVi$dN-Ice8n1CJbeU)NPUjg zCEQMUkvJB<6!i|KIbx2_U)Dk1RLQm1uFP`;qh(y;{*q0pnQeH~ZkP|+`A6&};qw^D za#|?Cw74X3yz$~2rA`H5YI$47aIuLOiK^RO$7ONJZ5kH%!7&^AUkN(Rdm+Yli8ezg z`z6eXrOX0p-s@?4NL&@k1OO_8?8vp+KYVSk# z!S9cG?c=JEPyM%lSfBF#;^Fm&lkRixGql~z_h;|#s!zV!Q6Ks26YN*spKOQRHsJlq z_x{{xU-MIq^IT80_qly9joBTzPf`7{n|;-_*C*1K*Q-Y6e$M5;U#wxHKi{AE?DjlY ztCsFdtM*;h!a5-Xw14`l_tX(%E~;&@LNvwfeXEsxI3pRdd5pdz^V!9rXV9{n<~QzSV`+p^r_hk>wLO zbIon0%)WSDdms5Uro&x>{G6{YM!Y)r@hr~ztNLzV(DlCN{T5pE{<3=JeU0z7?Y|Fw zd2!SpjG7U<bsSa|I?>Fquc^v&cMfOa1@zGcHZ!L_MORoBDPm_l( z+D+p$)fLxWv$EQ`KlwdL9?o<-!K*7-mVSh-sY|XI`mp$)cQB~M$|cq;dk9-B?we1k zg+P!apww8`HP^t`S!?#yA$QHrJ)0g5Fh?=WGE>!ajZnsP`$}Z+!pR=X<}@-ftN@w7m~_zy1CH-0`m7xj&9i*=O%Nu)RNL?MV0z zaqoZHervDKn)|<5@v&MmcZ^&#`u)Og@jl@opzc7qKY73SZcv5x>m@o0f~d8?(jnzD z{uQ#?eNu2uJk$0q2qT9Q{hk`qJIQMY1BTD3YmNkdkWzsQx54RkChtDD5$P&DeO836 z2H1(?4BxLh^&=X(0c}7NCegj8$jyc2(|}%_g9KjD)74Yc_#yn7>Is}gGLX@exm&rh zu>wRY2S(f{Ti;}#n$r)YxBDp^qgZh*@+Enm>7QxMTjrZk}yerYYo**IHNLV*51jW`r^$p$jeqXz4 zE)dKs06t`e>+uYkTm13rY8c;W=wjK|o9d01^XV!yvDXp{bofoJguQfnd*h2)-@Sia z$fLl-UXFV$k6OdE-1a)F^|yG(`{*`m;kuglTAZ%j_ZqCY&gr zDc9%rf~7;Sd+y;f`2Y2&-H3zwfYu-SQ*}< zNfG(ceP{tcYo8zf&*T0)tYs=zLIm^Ij5WD1lAyz9_fN&IK{vNfsH`D0unzi|gA94^ z!KmoH|DP3>-@kSMtiB{(^4$V-u061Oe0!a=4jH^Q_iOJ@u7mgM#OsRV`(*Ww`azv> zznM|m5qtkLciaxVWmfDHRbtsc$d5XqyA%8?y6@SzQSTY)*_mF;Qx{mS2{~#KRTG$* z)$*OIn0J+QNITWoxtwIXW9#boMej9o=6>Uyb=kFg3WpDK-lTt4^}-&8I&^nvox0iU zdjtUUqXu$ctbePkc2=qtIx8FQ^S?W6UwW<5RfiVT-&a~ocz;;sx$4u(u${Kms%w+f zOL`>@?!nsmjj&Ql=DJNhK=BG}@1RdQDn1ATzd=@zq)je-^^(5B9E(J?efCGtaS_*1 z6CNO45y~sbmsFUv)b7{$S%d`vBRG$EPj0+Dr(yb4{8_?zABJ@SnE-teAD)v3C7ADP zmOYZD$&2?T1%ch(PcqRfscK*ACf`@6IxVckL;l$9s08>CQb;{HtQBZ@o|k-GZbGso z3CPXNmzT+7C)Ea-zEya@a;9UtC%E87bYS@Slm@`RPOJFrB2zCTR*fH7E0@hrTLDzZ z_MGBDC%S_xibCEZPe**C-s_emnAUY_|}| zRhYg62bfAtkxL%9zJApj-r=W~*-F&dYp=}(2Ch|Rys1UESL&Dqhzh&IrCSNCe%|Vp zwfNZ>E@*=F`rubV?MN{1gx-qF1|s4taGIpdi3+9z;%Q{H>ix;KgAc7{Y!GiV_&K3u z{bV(aYZIN45i{aA+z2!D!zjAD^+b+v53rtB`TMIeg;EqCz0X`3Uzwq{kv6e>NVJ% zew##UzVN)n-bo|susslMBxu*s`%ee*EDq)KGbF$xnaa+R0J0nouBz8|BjI4Pda7Qk zxmvlj7aD@xRIndvM5}s2z~{O8N=k%BZE93=e2}NQA68gzIB9yFs9xKR15H*(H2SU@ zkE89O5@6V@@$RXAj8$DkLt(1r)LkQU?Is#Yg#x# zY5*3UIsgZ?PSsVk($-LVg2C1wM=OZ|NR5(~HMbbID7w_fjx7yn`dIut!rGIkZ^Sv)Rq_ zGfKNWI#6q&lrnCg09~tdj#lG6qEOVV?zQwgp>Haw{u`l3Ngef4Li8X+5BL-7t-d}X z`V*vEhY;1!Po~yh3v0o0&T^rBV`b{>|Jxvu*pRp3<&CPkSA)IQdrO{rDTE+9620S&eAM3(%-(Mx3_Qh7dFS-D2l z=trgD0e8kRQ5<;%mlhY6>%I?e>TUdem69JtzAj(2@e%gz4w$fBUI{toJp?$jizp<|}?A_3;-S$wRb27$*_%W&Hyz9Y_8hJH_y zN{n^l3Vu#(Pywrd2eo3Ch*==DJt7T={z6iqw*gt&i5D`%rM^rKziKjF4SnNMiY_q> zefZKFxp0gaIVKYx;vTA!k8AzkFZ{&9hBaBsX?t*qGH5Rlw;r7c@s3vWpr$Bk-s;xq zK^NLnDOIJ=#82RZUQ&X(DqSEYYUSG}feQzv&hsGX0_#8Mm@_p!zEcm@k9$%Vv9+Ay=I&h_PW@5#8dMK8AH% zo|qGl9$x83tPS_;@AlhZmi3FZo-^lkHJDS5bXMDStHSBx1LQh%B_+w5K7> z>FdE5-z_69cTCPHT>5f8YcSqOe;Amj*jWm;$nj2`b)Z6lQ@Dk^O0%OFnNSQ^K7_d_ zPBpx!UG>8Ts$Mf5iE&+~QQ%V{`bp}nAiDdJ3WpcLvRudtyH`}piw-)J4P)K3}rAmn6QIaHr}qISG5QY)`kFo zRLJJk#u-SvP~$CKGKzXZwT58KC1*{oBOw|KHA%Js_Qs4hT(Gap!n*9Fe%;ish{QGk zYaV?l$n-9#jpp81KW{w=5`11Ae>6WQ7{T1lh31{_hE!ES~Pg`V!TEQIm$|L@|4!i z48v#j)TIq|`zhx$oM@eNtxe8em%FdO7FXG+%yiUwNL!D*&Qc!7hLI;jkQ%P)I-s&w z(^k1e-EcZb*4J{C)iQifPZcSB8w7c%4g{R#U2}jWdDM@IyrZ0f6hI%qdMAOEV~45@ z^nB;%YWCE2X4qDI5aUMmx9uw%OR}_DMIZ2S;cG7z`n2LBuVXEDRgm4Ijmbl2lU!Q>x*6=xFu_YbucH&7=>4FWWaKm#!R_vxe2IBKXU=<6YkG! zHK$H8m}f-`pCA-xVxnAhD9%ndi^Qm`@|6>CbE-$<2$B*snR=_h@*Tjm`xb$x`}+E% zgq4&~3uCgziJF7c60BwfLsEi8%6dC(7vvC6>RKG!RG z^n5Hmc`geo9xKL>6mF__?yt_5r_w@e!n7E0onCfrHNQQd!kEC`mo^a%QJV%0-|Ef$ zygmH%1<^}EY)y@qBM=Yw!4ygb)m3I!su&7dpP{I7o98o8!W%hVU21#cQS&)y=AT*) z%M(>Bv~eVgRGL1P{=BU1da%21z}BZr1zN56kB1V z6%n;%%ocq^N>QwzqL}J(mNS6+kOuSM!*4$+=Fs&iEO~uZ!Jfs{UX-R;8ioP{?atP|^n`B18gq7naXKF8~X60)_hP7tqEOO$j zN^>j3-*N4A-YreWRDaz{x8@q;?o!rEIJDl4rpK>+G}~20U#Vocm2KJ+h2qiTzjT35 zVUtyVhUZK1ct^!{KcC+HlwG(Xh1$R8KIOn<1igU@z4Vy2Kb7>+K`FFSZmP15%Ywz) zUSLW(#ms`5=R$F#Y=Vwr*MnH@u8iTA)KMa`x`E=cit)LuEw?AEn|!Y-Mc9{eTQcfp zzGK%5J799vFQ(b9aHu$I{X{BJBhHe3FViL!4CJ!HFztmo;w((5WFfszx%`s?)KC2g zr9T#U-nY%ZJ~gRy88wHD(UFyFrnXa34xV_P)NC@L__jdjV=)l2{Qke*EJ}9oLGaz{ z04OV3PUUi;u3gFUqP&2`Tc5?UdMMimPS>=t+E7Psf6>fHrXotuBHYf8A5BHt4zQT4 zCFnGB);gK0QVhz=DPs=HrO2yaZntV_rlqU51xmz+`}3b8l5+W%TCck+bPy@zSl0tiECgt^jCC?EO0TUi8(@h@H&hW0OH&#bgC9?>H9M`Y)>@j;^>P`$oK-~6 zOE?Lf#l}DSK3iS*2K`pTTG>60=z^|eajz9Q5OnZvo#w}NO7S0dMHqZvSL&$1dbbdr zYFjqYU73UhvuktKovPgXQ`U?}q8(zyPE8r%_;RR{QC`x8`%Ycg>%<8@?uq^KvJm#7@x;XV$x z2WeI6ZB#FQIqp_g4x}8baZ1OsDD$J^wKe+>!yUZ)sfij$*$RTHiu2UCPHQoyC6zO! zQ6Kqp9r0nDX7+9TSUmbe;Oyt(zI^v+6ovj2$FC>-_>!7D2H+GNh8aB;bEow3YOyF^ z+HBYBIsyLr1o1~}@^!R?r$`wA_vblt%Ewdwea80Vl!OXc6&dVi3qx|ib-8V@)=o2t zx$og6A!Id?_+DYgnVM3-OCtJMmwn|kNNC!(z=U|D=E$ANTCocqt=HFvwCA&mIFz*c z#A-Yhh?Q((G(SN!0Tf{6*SS(c!%d>YN#$B!maJ-W>VrdcAHyC5_hqiiezW`FyX$d3 zl_eWWDZm8E?66ZG9a?KNA1muf=GkQU0Opk;WVO3M784M7VRo&Mpayio-k%iZ2w>e7 zM!1q7VpbK9I{unE=CU$z4vQUj#ge&USQ@tDH$3w~s1VH1*xjlWrtPXri}iXO*Qsei z#zkq3f5Pdf6-w=7d!op2laU*bpd3AQlu2g$GG?dtap{~)MR|TwWoR=d;mkm@{|8L+ z*uC~ssiH(VXeCC?IQuY$HF3TCs?a=CZT&^d98;fisz)tr1eUz7c~P*ZrxNOmUf@aU z6sX`cGH$V0Mw5J77K+C$GJNXYy9#>vB?h0NvAnS{tr5#FF9EWOFkNgK=@`FCXMM#X ztZSe1Ln&wU-QgswaVShOB0}pTep{2@y7-7kx{T&+eCgr>lIY?V+4Ct!5g!&>Znff< zNjfdb;`09VNS%|Ts%!rd#3u!5wDC`mw8($$5cpw|TGjX^h^MrybnojrT6j6%pKm_@ zDe&tB(7ipPx_0qyw$(?d9nkU!5N>wBv+vmgq8E=}MQ`F7>3ddFU0s$ECRZCWYQ2`h zN12?(y8~_@Fxm?a*Estb_aAtz|VaexikEYk7*oVPD&fjI3h8o>-7= zM&VRi@NFKeESk=;G?h4j*u+MonbqzJZcJ8UQnzBeDxx);mnQkY__oYz9Ncrnw`rcL ze*)2$X%50|-=_JWMWsD<+c*{FM4`RCfU1hGy8rRJ?tgw9bLx&$s@zuMIOukKEb~L7 zC@vi-Q~cDFwtv9wie=7L-D#Vk!QXqYc7C2PgK7v`A!cdUn1m3nl(Vv7tI}#!*HTWA znWQ(5%BWqeVS092b&TP*&Q`1bv7#ph9erfE_H{N{VO7>>H0v^`Sy`Zl#o&_!QZ7NW zx+URMQ6sQ+6BMyY)pzw6XeqlwMmpswErkiVncVs$kVHBv z2%k9l!(*VhA{)}o3ja)LW%NG^F3#*}XFpn)_y1jzoa(4|#&}&>SXHjjQzc9Au-er; zugl-vOxld?97ReSadlI`PWIFbXE|4*A<C;jPwfCFBU_OM zTUG3+SglXx12I@cTPN{TX#(O&%Y+=pUo832j~>4i>gNpJIn`;+eM0|%yz1rxL0;ob zEmJ{T^VlNeRHp@X9^~~;bz1dC8%yYQVBoKotdts@@-(K;7M5!KM^w8n*p;$E1+X8b zY0Uc32*&-h$0eI$Kgfy$sKx=g0Fo!Q6$^+tvTc=85H|J{7<1jNQ=L|mqfzHLEf<>e z?2EEEraKMB_yp`FFl=~P7QQ6Mvh#_2*#rHcVm%0}vlFB^Rqv_XVNy{x73XI~G^He+ zohs$g^>pl{paagxOdI_y!S%H*mZa1e8BV4dw8*ytLPfw4EHRcFXSUW09w4`<%aV#x z*kU9aCIupLAqG-xZDTJC(%mI+a+DyZdkJ+4Mbetv$pD_4v$GnLi~48UfEtzsb?{K4 zWjAWgOqN9-cgy#(aj}lBVo^=hHIDpkVa!}#HDPkft}nY!*b*l!`{FD2LZ_`2)}>Yy zR1po@|055hR&|chuzJ0@bLIyRbCMGc*k19826H49>=`zv-YkOTzfJkKT2&&}pstAs z^ZZ$Hdu3w7kg!sjGz$UN-21Hfp2G7J;lKWwE+A2_Wu)CgPs|6l)SJM71x{4mWoo}{C8_d&FU;zY6TqbIV9iKdUPv%FT4 z?!$k8@oj~2^ppSo*;J<(cKFY-Xc#NP+KNMgR*HuEpPTBI`>&cH)|%lU*#EKd`Aghy zRG5JLDxYOlIDd$M1woo0iEo~n9)`vCf;G=Rh=VkL z0L_*8IzFjok0;ttkBjvO&IIUNg4;g|-^L_hO%uz?CgNXM(*+f%nQaht@12Ez_hy48 z!qm`wQauxUr7|5R)y@_UIf(j`@Ke1T8?tat4UJ8oD{N z9r{F7JEpk;Meppa4GRa|lxWJ79?QtHQUX+yT8vcPWE6qG?G(%Dgy;ZdLZR7S4O3wm zh~WmZN^~X^=hFJIG3Og#^xw><%~XK>QHu@7_{Dqx8`ZFOz)ohQU~+!uSf~>;+nvvfdb4E-3^%0oW*ttF;9jTC7_HGa@m03-2 z!m9_MubQnUGdasxfkP78i7Y>r51EG}40j#n&592azf!f9lX8_?#FK=H+=Sq~#>5gT z^v<5|ZfL7Tq)EkO?I*vfR&|M8#q)-QbTsuO$08`yyP=|)=5pPzn;FIiY+A`xBmovM zMSaVX!7g>HI{nW1dk|2~Duj1%(EL&k%VjYp)leBMmgIy2ktN-QNwZ+q6ywTVS_s<; z+EGmGxcDn|9u9bAB(9)}QBtsCT>)&DS+PK0(8QjQ1|cjTgZO3M(lq6vGwi)mA4L=(9dqZe6se{z92*U!od)LbK> z(QD*5A}Zm!)#4s*4U|Hdw`{8HnPAkrAZ&kLqtjI>VAY)p2=u&Mr2N+dfu(J#{|*nE z=eCk)zoGQ>%!mhA>#eOHhmG7z&JQ7-=UZJbAardDW8EcUFd!&;W~q@`(c^JMf@ov8 zQ=ci^?PN$PhA2Hvq>lP&UX5vmcv<1^DMO%1^PhQrk$ zcuV>8QVX;50%t1>X?oO+L6;@a(mdyR1-Hr;F_F*=_-1J?Ba5;MxfUQ4VvY3$B;hhO z`I+bERi)K=3>2@~ERf_;bwk~103v=r3hl74uHFhg1!;l`y@^e@8`(phVAYWrRt&>W7-Q#jOwcyIvK;9_ zI_L)4#lBdums%m9W$R%$Inn*e4cZ$AVH&8VP6j-FOWe&oUDk!zGH+dfFVUrgQ6_DDl zkK|F;?5v!C_0DG4VIYqbewg#|&UTkIBUCN*IkH`rs3$-ta9MFN=9#A@n(9Ys-q8ti zVRJ zYAQsSw)uH?!Ob)UC8a=g9N<;Jp8nW54f0R-bQ>i%ILnn8C1kUPmEkb@dA<2lf4 z+o|l+CsqhdMG-2(JzOpv`%qgs;60R%R^LNMN%{fyN} zxI%3zE-5#)h)W5~v{H$C%;G_p@_vlXTS8<04e zE`26W^d7J!9cevl%E8rtQL0o8ud%Vi6QqETONl};yIP$!wH&pj7BA;Ps_D7}CFQFdx{!^$g zwX0UuFQuMdHq-y1)062-as97i6LtDhNr@pJogNhMYj1)ZY#fc9-};Z97;z-MHDmiO z+CowBBkYM0phW)o{@}u4{j=o3cVa~p$+fI1whk9UQ4_Oax`BIea6m0Y-H~~_LaHsi zC|cL1Li#$`dBouvfmL#dsm+#Hh`e*s=;{%DF$sb7;tDC`%53$Mdl-=AI_fJ#QXqKF zrohOoY@~o5x#C!6PH~wy;8~O+r|jUcrN=vn5h$C(cr~Ni20C`c^8sXLeJ<9zHQY1c z$(h9x)kV?2t`aYL(A0SXz!J|J7laz?ME8|jrH^5P;iv^MA6Xs5v!y?iTo89q=`QXd z4bvTzp_siRVH7rQE1uEE9n9qT*BwMltMT8{t!Z2S@DIn)d-Q{(D+W43bUhP9Dq^7R z0fgWgnQg2v)WTzhwS1UCbmYLL``hKB-&WWX>o>&%$bniavR=?oAHS@yuI1x}w00h&v;pqnf?c|7V0qn*otJsi)Yk+{e#u zxw>klHLXaHBb8>Oe>hbfnwmRJ5sY(ZX+^DEUJX4Dn=QeO<4f4kD0CL0fQIZbPa(x}#(fu1Hq+0L^{X~6 zNw(TgPPQ~RTx(4Zx&jBnrv{FjC|{wzhCEc*+Q&)(74i`uxkJEn`|ulYPsnB<9xui7 zM_S$RbE@+nnR7EeV%#wPcRsifeNf{A$2IjkN*Qsjj%E?p`HhYF?A&# zbvrC%48t-pc?f`X^M(_%Cz*i?SMDDMZR#qzL@+95mb_scA`A)d#xM&;p1$ zHsiBr#e;_^2~iV7A6)AQw)3dW7)dBntYuDF9j52ABAP2UJ9j=4ixe*guW8O>0F+m; ziGZrG###mZpr7U5#YJ^%<)BBipfh82{q~Mol{LWvn2s~6%(HdCu@xRMVY?0k#+OHy zsi}{J55P)~T6r+eT3;x9WlA*rZ^WKh5enofO9VM%OyZa=X#bb3ICEK*7IzctMrbjO zlI#SalN8JRRxN}XOtfD4gX1)KFI(vM?KU27@R56V_yj~Bq3V-hbI+;Tw{&r+ZxqYC^ zcTz0X^W!nOdwdERRw@DzEf|{ta2;t$2r|JjORb-3&ZQr+;HKO`)~I8+ib~-4t;o;E zMYJHXSEB2Rd&meTWzB|T5w4p@2JwtdZbV#n!11 zFGaG6LnFE}@5P+)JvFaus#&Gglacku3@vJ_x{Ey(fho&thNNIE6S+RnGXAaOM}cC= zDx+yPj94#9Cf%Zm;P@U{+w@oGYMS*jzq;T@f(2SQs}Y)MkgVwJy=$lTQa1+ZjL#3< zSUtv`wfPkQ0i~2hDjDm0WgYy-YpWjLB7mS4;`cFP&d<+AqTrEthMU6x01EKH*ASPb zLKAG?>z2DQ_eUoG7>6^WypDq`Qa51$M53O-g(m=_gh^46Em^$G)56G&m|JYXiE+$z zW~udt$tY%q-lf3RAx^%2BKoi>u8Xp)ML1?h6}*pWaa2(85&uVz9TK&|R+cih1K`ve zDvj(&e_9TSlnhg~t=GN~Rp zb*gywcmys=)JMRbPgKJE1m35yIkXD|XP7_;!OD)@q&K8xHK!q->B^0YXh6t9)My5R zsnpmAwFlmSW}B!}L|3P1nuZ-w+|&_Y0NN2Gb}BZcE6b-mjyMi|u6UqBpj-_zjB~!O zBhn(>sY!OiPEpt%*3;FFX0&&*J1Von=UN|e(%fL`Tqk(;AU3Rs#DK0#&Y;u09`H!` zu!^XwV0cI95nI^m1baFvjo5eDbf(1Mp@m|rp%Oq^18!;b|M<}`9o8M88PT!C7vl`L z;HRH3JOO%yaom3VIqesb#W$~ZcsD=4YGGRZ4gWP%cjai1on&q)IxuJoqRsjRVvq_Ru50v>j)7(Z?OFb_ zDjfQV2t*qrWiFAyvDu6@2B)%|;@P?Un60OXN!_}ePMC>=*2$ACJ0Y%*j{rJi1a-NU zVWOKf>Y@;e&kI5=#kbj&+Gu8UN;);fdU4X?lkCPH?X?_^~vz+jreaoOkoQKrCD zMtf~#;wG4y<6CYnA~EwW3wijL;Hb>Ri~$rA{P~isFPT+IB>&+McgP zB7ULBHbEbTV3|y3m`;{%klXI8n90ZT+BsAG(9v-FM^PMQMZnO6>MLjJN$Mtc#p@Np zdXC!Kc39-s57$KEsgsa4l6mF|gsv(rC6RvoqBu>T3Yf0hq|G}W=LBZuzuBd64zz{k zXxju5=*B)xPmv3=#6&l`xVgZal(4IQaG`UhZ)>XRJGw4 zX_gI<{66|h4_Ie1wPK4yTAo49DXvl7_668oZ<+^E5mJ_{&iE_$ zCX#sH>>jjdILsqv#z?5{*kS}r9ztrRqbYr5VooKzC1k+s?HZK5Vi;>!4JJ5q#5^T0 za=|Dniviso+WHBrNU&%dECqZ7(}Bvs=s~|rU$P$`g7B?sQIn(qvE~aC;dqWb7E?tx z)&+=%Xf>0%>HwycS%H!e@Mxb|0)1)bjLbga*rjY)ox)T>Clf;WchiDuT5i9v?`~-Q%pa}5u zrBE!I+oz%q4@Iin$Cc0HeF6D;CeGw3HjF-%w$}BgP1DMBRuA)GSaAmjU$JM(xNQMK zgejfWD3YW_Qek30oj(vwYw-tb_pF^|j`UjN0uU#)1*|{>`b3VCnps`SGIGr#m=KuQ z^F5Ps25X=2l_E#HNA~&FhGxvpo`l3g% z6qlv>c38ks7tfs5j{|)eT3CS~xFv6bCJvG5$>YkpS>Ho5wI)JS@LQ@W!us*0vBEkg zO=6B}@-~?(h>+lo+cGoaOG5^g8raFTx7ZFn`d3$9KPnQYVvG_wP~oH|x$scukVX&k z=M;bs16F*8;V$GJmAfRq(ML>0fc?m&1_X$MTi(P6j+F*l4_@n!i(-8ZhN$;%@)=F%$w z;})z~3gQ}Rhk$5qv;f^13Y5c} zVt^p30-*{=$apKkc3I@nwZ^&<+EK)+{i2FtaalK{C8#S;1e+T}z%Gnq)stjBvSM|* zaSZPJ|x@#(_U*njA)To;n82fnCjBoACPK4Jo?A8W4JFB_NY$AyG5ej+84+jC&x;gT*+fbh@JRVT=cnqZr#w_XFX0Tb1;A3yn){{?W-?Z zI?(9{jp!n9)Vt|iJ@6E=!?PAU!@pEWmc&A{PZm84OEa8qRDBrnY^(!)4B)IPmq-_7 z27}fKy`8jmdty*XEa8Me<7LZ;{mE<*gvnQu7vwY3yxe6eiwo>aaF|_zMGZxNvM_6x zP@qJ@&!!&T!tE!?0ewQCU?7MbmQwXl$T{=jjTpb8cASW?Qt%%54rt_RvCyiw)wX4l z6YRr|3_U@#C?%_mdMR;|SLL9ksJFBnr{x@>RU=SqaEEu8b*R5Mdj(fHZ!+nX9H?Yj zBL|{bM3jkfFxH3gxQ}Ip!!&54@+xGT0b(@^ zELPu8iDT^Rgho%=tuZ42{UcUHPmW?&34OZNH!kwROmN zMym2|cp;?T4hT8u(pEi-H5|5u?zw`V`pk`l`~M3vD+~G8jf5vtQm!mE1LlxObr6c6 zq z0XJOx|M54yJE&wCS^I-fZ=zlyKm<;$7YPzEv2LIUhC>_e0ubd(vZ;)3N-0@NfH-iv zum+8nc-O;40CKBpwH9J^g{P*1JZC1k&PTL?Bha}@iLEGIZA5^D^1(CXVhmeEaWX=Y z?5~%kbu1p54U=GDkW+&sm`oiE+2xX5eK947*aqEqA9`4`V1@+L#WtGpzlcfyHTxM^ zL{o9X*Yp>L&hr2ha zkmxc<1@n`fAO-y(DK}38pH0Z*)CDW)&R6A`k8p%*G-Eul5Qm-;K_M^!R5CMzRWQ8w z4*ryZPJ@Tc3Q%MbPh)%pt0v?lGeb`hA{BaYKCFA_<~ktXYKN7=eyaE2*i*p>q#!q2 z@$DDD6@oro#EwqKz?uhmGS*X3xB8`S#&0#^r$F}9mdvT{M-q@ek8V#El#d;C0$2f8C?j^M~b`a=_;>&d{UnH7w@)BLk? zYBC=d+jZvAVokFM6(eL@n}pn3a&4a<59L6Dt_zZYNT>8Uu=lL6AYHf|T_yRu3^@ zjAB?>4e-x4Gq(TPu`F1IC}~v;JG2H)!a=(164jx)n~0BLT|aTJY{-9z1X^!ImWtNs z@|>ws6w21JkXuAm4WU||iKp}oqUeE-xVWo-ROA(NpiS}GQf?c^QdsA(@2Ie##5GY{ z3{Qf>Fb5|eO zXT?C%`cgww7H8E=7W!;KPgO!! zJ2e~okTYVzGFrRZg~s7b>MO36eQ9kS>nyBgDctE4Q@0020X(oo3&hdc;@yu3vy6Q- zk(J4{cJVk*kkQ~gyCJcf=-xie#9*bv?rRITr!e@I?=D(Paq_f1@UF*wdIgQgk1nf}P;qnZ`QqgC<^yca( zk-%bW8Q><*8Q;PNO9F=QQRqn}4Sr-+gL2H0pE3Z>om$VPs(y03DQ#x5XUJS~dUv4S zWkE=cfpz9{(oOVbrwD>~4M4JF|L7B>ah9P%=rUJz69llfYAa%U8b4Suc1|+Q3M^#) z!H4SU1!qpu>S2ys%34z`q#&E1qsFUlC6kOOypj?`^F=r0y5QB;%glXKs&(A!8LA-Y z<#IAOf}mwUV#_0uwy$%kHP2*;)xo(mBb*_%=JwDj6gz$`$(eVPBTD*I9ja@dpMD-X zcdTwqB9I7fm}u#&x^W6KhVIEqtUz*{>MjbB42SiK>@`x*?ZIy0QtR*-Sk1_^?v+ND zck)MDoBDW(ku3in)6P>ZQ^v;IBmh^$FvKo`$^iQ0)e{;_-p$oU1RNjU-xcP8f>{j{ zo!R<6pM^|4z({r&D+VQlbBL+YQJJi9O$NAp!RIn%9ea4miq~D&)=ZMbM5j+;+M%~* zt|fEHDnck`a;_lOAi4qM?F6(XD~wo;ANx0b=6&9Is(a2ZBj z+)Bvl~Ne@|$7O+aIo5R|l${UOy1(s|St9+HB#!nJ@kLPW^~3ip@hU zu{yNH1EH@&+SiW`?WaTa+-qh6#tv!kKS+Cebfrgo?fL#D z?M~a@r2R9rkoI6tbMB{qdFOYhR@3GucXQ4m0tDqzJ+;OMntT=RN+E;CA@T{pf=S5vBo!lIOJrfSm1?j|Q;Vtrrrj`pp?x!* z+Hsm@SUSYN>ty)K3{Vk9)-2|pX{IC+;;>W;J{H|W>6d&{c%u+t@ozBoq6gZXY`XcPWl4Z2mVUZEKM^( zFW})4**4aIm?_zN7zyPY2A1ULVR`w&LCNe(u%B`jP`Tj2HBj*k4W8{nNypea4#0AW zuppBXAZAQnSaro|dVhv?=HGM0gIeE@Yoe1anX#q#YE zk{lMtPFy^KYqOHtf#)tR7BS%}3g>xc%E4%N)wqhVQCrpDx~{0Pq^rZ${0CS-L|0Ee zB3Xij41o<&FpiM-XT}i=+1#B7{^QR&REx|xg7@oL5xcLLOk?RQg)>y~;<=Q?tedBF zp;>$XVFzQV#~%DXBlD~nr^qVS4JBu+uP}&zGb#VMPEL2UDkrn^TK67m%q)%j1B791 ztGp5y3qA%x@ad{Ap-Da80GmI}8Wa(piZ_MWCH*(1%GByGIJzrlSRc0Zh{v)R!@3dJ z=@G24bQZ|CkbeDS0AfI$zvfz*;ev}eSErT*245j&f&c}%S-j#ES?6cH60bY_7CIOf z%iK9u%5p&x^r+~8j1eqB_p=$(h}zwE@!!bc%a=y1|J2I36U6$JB|n*p-K>I@*bDw+ z0BU+xgq~4B;uUMzz+zB=qg`kYRM77*ho1MPjAJrR>EHAwDggwZn_kpAx;B-U>8t|q zK`f{PT9=>yNSV2Q^{q&hZo1 zH#GqrwYB0Wc9QddP?PncCXzjF+++LxrX~jDkUcpP9l%}fdk=3#MXJ-yo(T|IvQiNu zF0LK9sVJ#?_Ep&icY52m@w;~s$9^Qy{o+4v^;e~TZP#|}`i-leY-s`EF67uH8v937 ze^fQdzA0@z+NkbIdq2&J!dKljaNkgHzj9p$WC1tZ>&?z)@o$4s=W5sHLL zuH<5&gZsjEA>+Q5_HfU;deV{&*pF3;Hu3A<{`Jp~yV`%VCK8%eb=4V!>za%^_~}Xm%%FdVdVFmx%UjC8mJyUd({n$uX@uy{#7?Jt|!n| z5z(v8^VA&O6RFi<_fsW9b!X(KNVdhl(~{3%MC;nBGb$KREg}RNItIE86scHI0nq$7 z3Z;_-xld9`ZWyvdUNxcwBTEQu&T^cE1z}y-WD)thA-G%C31_gVd9?0`q}CG!p{MS} zq3WSEi^5!Fx~6y!k?HFQN|XBMVbh0LTF_0i%E;~P@*Jm48XYnwE{WO$$ziP>l(<-! zwP=DhJ)P`XKP9dT5=Ub!WH!Jtx}I3c$W&k*S*B>qle?Yw#9I=UqO;O749eQ>j@+Dk zr*cCV2^>O(@R%;GwdNI^N;#Nr-59_!GRSNKhhj19rb2i|%z;Q!A9gT`O0&fS`ETeb zuH|O7(REjAdwx%iKp#=H1$_gxpLh@|vdmDudi$U#rQ10o$IUp9SPMOE(*`;^Nigpk zhqT5Zn6c0^zaj~-J5@5>Ch`=!K#z5MHyb`JR*8fft|j{gBInyTlRaRR== zc>hcFOc@NW9}gmLAakvKlSMbGhD^!)XdmS#gpA^lerU$8=gOBB9O zI%(vBy#pZ64Y(`#)}t+{>#SH@!5ctu*Z1$YwCA-*$XRz7q|}eDG`?0fOKGOKj$7i- zuny2*TUgMPZJ+W%;a{iXfKQv+ z8qx%;1J#PKvW0v#mC3;S+{7KC$c*M*9YnQDtjuEW1icQv*=- zPCj+2iX&mv)nspfE)m|j*2z_71UI)usjWF#W#^MrN-GC6b4scJ(j&r(v{rcnWj$0p zp?59qUy4He$ZQ?Z0?|fuUk+C~jhQnNW9p{lloewNaO~RQyFENiv#O2R$x_(Yn;btc zW2F*pY;q`6JGkh?9p~EeEsCC9g1yui_BSmukVt|IHx`feER6DcfJYaV&h@)M&D}O~ zE*unCy*KDw1+1^<<}WB31a#-|53dcSUM%4YFwSY}6L~O1osW|3OXf8lG|cOK^A$0d zQXR~hP;?*(S!nEXr?K)prwBs{nIGrv3;C{3q-r1Q?I+-*EG#7G8~K7B3ee!y|6>%b z@0i(tTW=0xJ$CDVurV(7C-SXuvAeL{JbI)4))>D04t{mN;8=xi_s{Ly`rE$0NvAJu zL>rwhmw|thRf|P82vci)C#&%zS*dS1(PuqI@6+{wLWOytM_^#;YT?q5_;Yt;I)8Hb zZ`N_J5FdH^zRAhW>VGof$R;>1_Wl0!+O%Wm@ATwjbZZ3_&!~+D7mv@~fA3c)>-B1I z$`|X%o1NEf?gbIyhfi%$s1viBVc!z}HmGpJ^kT<8ZKZC4UwaiOMwrC`toi4gzpRJHWa5RM`2{;TNe+<0;BTZQ8tdiRRHUzmCt zrYcu62yUJNYJeO>XH_*GQrk)eK)o>Ji-rENYuw;GXQTqFYb!mE`1$l~!FnmlM88IQ z8iJs@^LLkAq7K-6rF22#hy$U?fw$AR=Rt)zNfAYe#@lh)0oUnr4^?Il^d*$u(G8d~ zNT1^8=`A-L-Mh7cyVlnRqv79l8f6IG@-3E3^9#d{CT#LIaY-?Un9+4r)_cme+Uv?j zrR(AW7YI)ZT=f$a2Gp^7CI)+zN)JP=s`rp@OVOw(5drFTvmaLpqx7=8dr6kmw;xA!d%#QR0>W_( z`p~jhHK-Q$bv2iN^%5JCFQa;0nU77cu+LGK7k{4)doeKewwqCV-E}b!Z+=xSi2`|5 zM0vHxz0uW)d6|NV92prj{ST)0#0Nx+iWQ5Ax9J0N8V1>$BO zWd*(QmFeDqvpOr_dQTQKmHzb$N$xyk{$&%cE6;X$|I;3%S@Y*}U*{Ki@^voZRhz;| z(EM&|{_}g~tJ3u&jf@jJY4|t!F16%?BtN=-{ospykE4bEAm8Ab^$&ns>`LpuN{&Ll zr}huz`+p(HAMCsNkW^sd5AJO@J?NKDLBLF0Fgv;@;J#K0TD84x?s`D*uNt*lV=wmh zKhKrjmzRr(K*Vel`@F7qcroPum!O^3f1>)j zY2*>K2T9_$pdAapf6(yGBD4J*mLH+SrrF>iBe>{T|ok?0^1JEa}zkV1)h)BK%zZNzFh6qlM3N zUq1nY)^`AcV|KP7Yr=OP-(tDSJd0B&&|5>8!kOo8Z8H;N&8-R&_Z4p9q}v$a)oK;L*i&s9#3TXX zUWe?|w-2DZK=oCS`Kf#u;qQ8!&;$_@;cWuGfG&WOcO)U$5Z@|ykR_jUFOf>qK#U9Y zUTxTb<`!^NvaIm*h%YV@^w-@A+yI2 zO&=9dD;iN`?nOAQuqk@rV%yEt?v|`yzbeZ>sB`Q3pF;EYpDTAw|Nl}=KDkaE`Kw-e zPpU!&|8n>5SoYx^QB96t*#7YgPpVsgraFmxxdM%?y8jPS$@n3a6wqroM7m<`Io*?;pQs?(M8k3$diDU50CEsUtlnm zTwsF%221t7WO)Ub0}OukT6X&W7MQAS4N?9UxIRbDD1K2$K92jI*FF)pi0?*@Z1$g|}Jw#YMo>W3-00=T51~QP^sU{H3t9;k+0J z1ofXF=nrW#v!eZ+f`7aEnRg#~jd|Dp1N!tI(C6pOgWbHxwq0t$1!@ZE%cZ1pP(?V? z4(Zlo7Urm1Phip@K}=AB79!PX=vd(Nk5nXBH+T&MBPD^|;Z?%H4Xjdz!d*i6LAwyY zttQ!1w6f%@vS%Gkreuzy7F|5Ca;KXY&#siISDlJADNns7G_NauTyDhv_L5bTU>@bC z$IQ%$SyH5_hdZCt>#bT)VeMvRD(z@^i0Q2paAQ$YXV z%{rv6x!!*)gV&{G2Jd@?H4|+fUaYn>U_p8qbV7lToo8goDAYMk`mJ=0!Yg-Z_^q@8 zGnVhr$&c(B&fIQqF2j}jA_|Mq39S{qw}jm%Pb6(XA-j(*s##Bo5;^@@$0Qypo~#)5 zd|Ai{dm@DGvw--aXYfIrzMXnh?AT6CS1lAN_r0%)U(C?;vA&fObK0cwd zOD~E5HL>>?np_$&lo}!Pmrw8>@OXPt%i0NoUMRm=)JJ!{uXwr@Hi`Tw@+CsHBhkhO ztdN&7ZH4m^UF!3w;S2@tsm2jsthk>TqZ9pd)r7BNspA)xW^gIQAl^|>r$YWj!BP>> zB6-yI-m5CbM(Z#qkW06IqyTKUD%cGqcmhqD1jWPv=*q5@DS?g*+OX7$YGoemMv?_0 z<2=->%QP$hq~oOhHOw>5H9CdpJ+(@BCLmRO3Ca<=GqAg!RVpS02wu@jZ8U&!z2rHn zG%pla#LJiWv63oS0-59xtMz`uPf94hv??kaR6XT=hUz|nb5GOD=xsEtT!o;SF#l+F zSg&cN<13G6z8`hZB5&=1uzV#H($dL6RRj8p5PBJicW&FEmuEbKCLiLbq)yfQ!GJcW z(12=6ds4-@{}N3g5JH2*8EQF}_3?!OCwEhgC3xl-u;YyHIzfygAPUW@l#j5dIKmFX zApxtC#uHt}ubRAbaYyJ$y$QFP8x|W3-Rxzhfs1t|tTMN$l(O^Vjp{S9~5KSf9X1$X~&^1p??_N)BqXnp3xAM)dGg4)nqewDEfd?es~f;P3F z)>Ku#wf1pzx3Be7eWv_iDBPv5YJSxoq{RcX>0YIx$dkWyyrnp#aTePal6C3~*Hp_oeO^7+ zhVx)34Q6kPmUs15m4SBM;5D>1xyRC!rs+CUQJX#>+c22eeN2?yw#F=#chEJd9n&>s zzl(`O^?=FJ%v;BFrQKi1!}&;0WVUfct0B9uK;v6CrA&Ylq@Wz?Vv-A(829Uy3kZs# z0+NRNkqF4bU&lEsktMhAy;5{<{CMf>h3^qZP`Lb(jB(`@1@U<{ylUDN{BGFCd{c>g zJvOg&v6nv4hw*Spq>+bh0FPecW;X%(m1OVOs`M1h<*`dtLQRv!tMuMtc9gR5Sl00% z_tDQUti|ULq;`}0Oo#i!B6H-fmAHLcVlVedR77sHjSC`A<^XCL^ic1ZK2bvVX&cVr zCCij@OV2QVO|NH9MOf;y<(=0~Oy-!>XDz zc%;Vc3wm0;*{ZIrR8frY*Q=u20lod0?ENsD4&JZ3gshdgX7m$Ul8%QU89l$2vY2|d zkq`efczFvA0x)~M_J=i!IXl~zbs1=& z`airTII^OJMKKk62Nen37z{ieX1r5|CMYFa^QRH--I_$6q>VZ_?j>ax2elC>T5~RM zKN~yEEpthaAD4$kqHBJ+Y|#KqT)`Iyebx1^J_RnPl#n|GGa*L&p5z}}VnHq~S*OBfaKGN)B`z!e)ksr+npcx?sUkwu zdsMv{+dAu<92bMS;o<*{^ z8*6;pFw0Ntw@vm`oQV>qk;HxdU@p|hFRItGVFtH9M30YhH}*F4$y6kCh+*^waPfhabKV|JW&o<)HQDK)M+T2TrJkm8Q5 zhutNYz7AWvkn~;@t6{H`a+UW;RPVLauA^vOx^QPR9U&KsO7p!q9*GWj5JRtOOm8cP z+(VTV%jcPOk<>0ytc20@PQ&Dt)I(m+D@8oXg?`&Eg@oOl>r3A{+SL000Nsm{asdAT z03VA81ONa4009360763o08dnny-AWBxzcny$F3k4U<25Iiw}GQzJGZEJ4X>g7VrN( zvMQMw84VnbHL7an?|Wa*_4)sK-uv_Y=l}QF|K4psc)y?DKJRnyFQ2dXbJf!xp8I*^ z^UVE{&)0W9`T6{FT~B+jYd`RLxSnwBCw%_fZ?<3j`MA&T>vQ*K-Jf4y`@he>_tom% z-~ETL`S*TmI1cxHea*Xv#%Q0^ZJk_p{nwpZ(Z=eqH~|bbQBr@mW{B`l+3>KkhU3#z^>teU(?OCnKp5TwVchS(jaV zD*TtvBjFep4^pU)$#+>f!xagVF4V>iphZJ}05hXl<{$!aYgN$=K_E*IBJo zRp)e1<362xnK)y29sZklc<=T&W3@(4y}Q#_OaHP%YP0QktCM@z$9-P>I*k3bj!rC9 zorAroZym9H$o7!-C$Z1or?DOD3Na*gjo6zPa28ZO$ z4t;B{l*wWAdq1_O4*gpOtp>cueKAw-wk`E8UesOFP$zzG!ggacuu=7bx(w!UPfUG% zYunfEE8|g@x7xNrdozsB4%h~2@3Fn#_I}wrV4JDWgSEeA{c6?E``@+=Ti-jZ_Db#I zzULP^dSedvB41?_Y6jkN0w2@+;3S^Qox)zJ^KooQU86g$F0V|@p0J1C?u}PR{JSo- zKVHq@b#WkT33%D${v}>;p{`kB-vvq;@b?de? zf6rbj9Ljy&&fOj7g%8n`?8PcS@M@nw@7v0^y`I)G&U@#wC=X|yfA61xlmWi#NHWb8 z3GC%yv0pu94W1qK9AAFbNZxV zUS@V%^&J-MMQar?)Z}CF_bO-2>hW5h?Fq^@8)DQu^|sx?{_V#Ttg_#0+x5LM$_1=4 z@%tt9x?1|)%iqk;CfU!al_PxnW0kM}vC3B&o4vRHTxFi{5`t*g>Kj%$UijXRx4m9} ztnz!jC@YNXtp)s!qwLDIB;O?>Sh#f9ze{*Is=6%f;`YxEYlwg6e7bU&)aR_-^Y;qw zI1KywSrdj^=H&lzIO5zYtf(uiv+Zar7>!FxbfKGN)@mg8b~iPyGWFNbeBDn%DI#?S z@OaIMC1MbNm$GhRxD9Vg=aTHtiY8m{SXoDC*r9q z2f58S_EPPsdt$bTNB)%|UCEFLBI>_ZI}isrWy~ao&KF0a@^5AtO_7D5>YrmGiCa~Wl zYzt4oOprs68;tEiYC`Joblm&!&2j-#kFno#a4PB$@qA~z)`qE`HR$dE{CEt0-q8dX zinFR~AFcvn#40CLbIl?AWHAT+gCZrI;9oe;M2++ z43?=AyzW;U*w)5swdKmj?6)tAP;c=0OF%>hKlQ};VtzX+WabllR*>tTwSv0kS-Dr| zeVO0S4?AS85AJ-kXMi}aw&LVscn;I-HSO0l zVfiN}AweO`$NF()W{|HLz)K2pnfX*!)-IxC62K%mIQM!zFL*CPn8!4OWTn-Wmea>z zC%ZWz^W#&^V|g!duU632H^)wxTI+lN;jI4lT00tYQNZ;8>2xo`dQ9i-j1v3elUjU* zp1(d5_wfD?RIj4SiZz>|bfTt9pXGS(e~h~ZUH-HQFmBB6#BzTikr%t|`Ueu(0GWUy zfBfu|c<7`Me;|?g*$P|>8Mw0|Uq}1?I@+L0akM)!AoNS1l-arebhM1&ZxC{$QfDXu zA^ycZjRV<=5&Wr;Gd!e?={_>zft#ZCit7Iv~Ny&Qqt!qC9Rl^vuaSAWTgPa zlams5|Cy2!ehb>vK**pNNc)E0eo(E=Bl>B^N$UUpovk#`OwyIT!9^RjyNSLFUHr*g z7-;)DW%=eVI{_^RRB?tlPEejsKvV8@F5!hvPDz|Gh}Fuufl3TRX^_R1u%n#w38l-` zE@P~3k_z5QK=*m58NBq`JP(VHIeJA=L6TlTXYiX^&Dz_qh>Ca{dHt&my#R%7@P_&= zDCizu>IE*YsFf^f zdF_KRB~WzVJjQqNdiF)4{4S<6-33FCV~?b-3YmHPL59^whCYqX2hm~0N0poTU8RG3 zvuaBLX(TB$s3hz+nCk~kUljq4qXZy|G0Z)wqHq=oj&$E1vugMeeAwJ*Z zDekvzL@NVx<4@o;F!tDtEvPVzThZz9Vg2DmZd$fW5a(4<{&vUD(mZ<@{kzXq-T z+$TM+$b4o_KmRmPBbRq2f9fO)*p6C85NmO3{d9Y-fUNN`K%`#}{eHPZgNhf>wBTA_ zf*b!oGT}d5P{aMlEBuuS|2XK|u-?WgxPJLNkmI1+AF)E5VZ~PaRlie4 zf&u7W8PICo1Gk`ND)n-+c8FHI%s-H(9afwWIybM6QFDVLY)2>$75P@Ag_S_o8UVj>-&Syxzayd`Rnq&7;CHF{0n9ca7T_X zO)#;Iq+HrC(SSlsYegWx%DTYXmcuJQ)*(Q)DQP{Pb0>!dRCOL2g1E8fYs7i(wX77P z83LI)0X<@a3L!Vu@kHftLDgE8%4m;kcJQ2+p{9IRRNm5vOuIsAY3t6 z!sf%`6>wCsXTh61d$G86S>Q+P;#t?RI+KCZ*m&3wIO2kVQ!Cb~;SjU3kFt&{&?}KX zK_wd#bwPb3Lt)=>mHT=Id#1CuK?!;1StIQ%Fo7TY+ktWsQ5`fE$;kqE^$@asaD3$n zg)*1N@H1f`i4{~Y!_I8Co=GRx9nuDF-NoJ>ytkiS`3T3NCK)7ka=3?i&={3V!mR+V z-*@v+*OR%kn+(gu+f*YMXh7&}qGBqJm-BWoP z=8T|ig(Gfeb|X5Znu|b=V!mv0k8HNs=RI1M9OQKf{2HJTy!Yw3s~s!lvLA0rY%2Qi zX8_~K3d)@VtS-~0C7ILAh@flO3?A-oaxkGGbx9uJ3Mg7Zh0h&?^FiEn8{O1eU4ne$ zPyw*$8{fu2Bi7=OcijolD=F?EIv5Bd>Pb7Vsv(k`{vUs@-@g_0mIUJa!0*q`c`7QA z=RCr{?fQAB_E6AMw}l#@rFP-I6C`fT038Lh_o^~`v!^TaLRLhc#``U)l2#s0U(w@d zMA?_luWSL9i+mqgzO1Ld&SVlOQ%>pzViuwS0(rnaw5DC;)sNvO4n=%7XF9Rz+;E*~#xz*YW1+4s27ckLl4Otl#8=jLoJuOoO$EQ*EzQ0HqMwtt5D zNN@m#aE#`ZbXmXA8JNTN7zw<3q8(xi{F(u`$Ut!$G2gucn(o0G@`NLB$92H8i%f*H zJfy5-b30gSXpB1`8t{IBtnD&2Ef$5C{0@zQkPz_gQAl{O{;j%HaRp5G znz&zzDc@)nc#YQmHe`R>rNWi4hd=9lA>6AOTL8VD{Yui>m)emMkT>DlFKCLS;ZDxw zQEQ0c5NBygZ*oIPW6)6Pp;rX5zWZ2`!{o3SVAYHaQlaMKhUR!5)q&^$1H*_7!_$!I zzA;PJec<$C3g1dl-Y<86@>Rf4_<)@0J{A+j8CTI>=^?qT7nRWk%9GSJ8b?)Umx|f; zX3I(N6u^D`Oiv}WV)79~KCFbS5oo%(`V%VPH7CzhAF6@8YHt#@IYiMdB6JG{ITNVL zUdX05g4aq1!w@M^V|~49Gf=PMD6L5{+Z94lXyizeU>QUa; znF88)kFqYnQiW1%c24BJjtK?*ak|d&KmHuD>qn&VFNp>Si?G7;mx#SNm6iA&)p&rZ zXuaRe*pjR^CMLLuxcH8dDA zwj~?lhuNPiQ&-=Y5G5p)In_H z*3ngPe3;c}T=T8s&t;~@32pEt(dWS9t)-d{G)ei25vI{)Z4#>m>dcbnO=y?`92Dvq zhPvShKDSD1ig&F?C>rs^r6BRkjoyHX23vJF+j||h^Kyz`UjPWs`joo=3RUP?Z4fyw zyyXEn6G_4pnaCQ#gX7cSVvXwVJ5oQ?`9R=T$i*jW)TAqwl(Fv+?kf=ooW)37-8&%O2*gBbOWw9iSABO}}fj}yvlG{-H zA_{w-BXKC@I9i6Xd-vIz;uP=U!B2IIWesKB8awZ{AKmuPbr4Sk@L%Ef8z~5{SbJWy50cY>;+c*$FZ5Dw#EDO&UAgpj; z9E?enxyy`Cfv+q~xi_?QYZ{ddezjQGmdce4*jA8ZvW;Y~5JKS$Fh&8~x{NkVSh=n; zaY>RLPHlsKJ%QxgXP_wVN(-h1U&G;apon_TVB0o;F!6HqhY>pV13k~^GC6Td7OT9V zf;{PlWhB-!rOP^zpzcgWEo~_r6jUw|4Fg6P0*HT5MN;^qN+@H%D|tT(5qKjwgMPsN z&<=@8%42wyk$IOmVI$E)pai!k{W5_TP)ZV z4V>_JJs}unHnppP=RwA%!#=?ix%wcmQpb)Eqbn;FdD%13R)SmJGjziEVm(7+JFEp< zGl8M>%i_==I{9L9ncf4|1tnr}MWu|^fq$@iJyP2x9Q!Q}gLERSIFV`1W#{l0FBMZM zz@-WH4YuiBB8GJ_^GLKgFdFl|&cnvWbro%d#!@(Z_5^!j2Vg;0AMfb`quDF#J48{XE8=qf((Ojyp0ZR9TDNw_s+sbiD3!kvSde-$jgcVmK{>U~b}wIb&f!FEio)Yt zf|!t#awfHt71TEcy|vfXrB)yW7PF8!L3LMm(_mMQ4|hjZGt#>fKxFclT!+oZXf_qGoAwF1a$G_Fe?Cj$daE_1V3NhKaVw@ ziChiz@O>*IBWnN5I9R46((`Cp_NyAW;;WYEP2?3}B2>%$^b@kL6{k@7Gwy4WF^!z} z>8d4L88Wd0@i`Roh;p8^JZoNW|3Ha@g9akGDZ$>j=OuIXhVVpgdC<%PHi4($+ZDM~ z1b7E2qbBU}GX%M00tGF@<-LLt6mz_oTXxqUAM)HkpGB3&MOAvGMx0LEhB(AYOlPV* z`&5G2wSFKpU=n8E)6;r<>LS-oJ+YR#3uh1wW$|X{lBM&TVgE^8hvCh{t~B9Q(-^W~ z>mo<6`~W09kC7KvB3dS9nr$aO^!kt^tfZN^i(wAZj4Itp(P51x4$H<-*^Ed=^J3KMu-Eq!O?JmT(|`qcLL&NuU#iF;E~B#F6k;;XD?W!9=8iz%mV76Z)-h+_z5LM0md3B2&R0LeT9c@wq}NJzGK&%MAf% z1y^@bg;i-*yQqOegGf|kN(Ws0hhb6he5-syMSWqJ&?rrcLUC_{B75^GF9gZTEWiQe zYoI?hUr{ND6Cb>(n{S+N+HyL^$~7<9fXvYvVg3y72zdlq`iZpHPiP#F!Xz5E?Wy3W zDxGnY1iB&YWH6PS(aJ(@9AY#y$ry;YMI3+rB)@49-~w-xqOF;5Vj%H% zzfMb*9qTqjL$r{8u<0Vr5pCwpIY9$!P=JHu{U(b9=n3>}2}N1A`Ji}2I{;%PTf&ti zfaJ{n#)P4*HFp0jRrU=znxtVT?<6B+N=A_L(G%0o*3UI0hi1CMCK-&f>+o^)a5bf3 z`+XBxhW5?G{g&i)B&H(~4|JK?tawQ9F4zs}(fYoRarY>c**I)4S3POgWa8IJEt5)5 z<<>1#_;TfAx=@@@LSF^;K@4ieIEyfh@AUqx8_V7Ur1cCmipuhfFn!O_l$s{LM%hu-l7Xz zqBuGGLw{@93b0}hj>#e#D!X5wHs{&S(`GxEwvKQc_LB1dRnA=xFvSv#!v3Jsb+ThBa6KS@XC>t1pc^XCP@bAB~tr-R;5GjkN4t zvbs&%sFonV?IjjX(23^88BX*>)I|`5Av6l!Lu@FWlZtW@hU~#HrWl5b$4OjpTg^51 zv~<6n3Q)RhLsBnl#RX4!3=BpTDxx5ZsMK+lqX9e;q_5cXi}i{B#kM3Cg>&P`*f&Ho z*$ysQG*{2gHEA$;TZaznGo=P|qH!%hL}hD;WD3`xZ|5Hypj~N0xPRFK+-rrT%?>f^#)tu|J#<`21(8W$=aEkL zm4n!)#nF4h!bO2-^$?BzxZD-fV+}Q>-NG0MCDjfc3@g*$9SYZK>Xs#J>qL@7rQubV z(W4?iEY%tTr3!1Jwtwb>R+Iq?5%*Y`aQ1wvZ|a>YSa*kEYE4|$jMn}0go=s4h^!V+ z;)P&Ba3R`~S23RDB1m+m8|%zr^~NKhCZ6w^Ns8?T2!@3Pg@W9wY_<^kPMa8tgHGxA z`|bCE0IbR;fv^z3y;TWfpMzKF&2@@kDHlp%wea{|d$U%si3|NETG$ z!C@0uvPQYs_Oj!JS}IMp$p#HIY-+JbOyFug#+6RMh~lqQqQ4ZKBS${f=hbh>rZ%0D zfoU@Voo*0-P9Y0ha|wvF6ZT{1mf@RjG=*&Av<=f4l@DqfRd(-4%BVUbW`Cwovd=Ix z(B^emC>owgdh_lERXMgZ{Vq(v+YHJP$C{LDW+WI(BKKq@LR$Ji?O#x^yhTrXvxbcL z2oSUhd!6PyiD%a${bbyU%ubLekG740bsZ-MGHY5tS=fl_qt2R83WUZAAdIGA@p5lY zpHHU;e8E~kt_`i4{bVVvx9e-Ve>|d`&wX%O#I{JVX)qAIraXDH{h%l);U;^?*nDVu z6Mz!kAzOBN$*UJLk4u?SV$BS3m?jLAnWV+5yJ^`WhV6tG<*RV%(k99e$jUIuY-5|X zq+(n}(v^f5Et=EAa6RwyZ54WlGW(Apj8B!%;;_U(O1-Oc}KMQ}&hc0YIOZ=ebNTD>mQ zy5VA1*~areiMItBM>KcchH>rhRs?#;gi8if1RT9XI=;xv>DGoAuQa8F5-6b&%p7VJo47}$4Rg<|gXT%&ar>{=Tq8wN0{8RSxp0b~`uA|XUI zoEi>HXNB0UjLnm#ewQ!S@bk(ig%-CqUUeL`Mlyc`Df6N5Q^pEJEuTZwLpIv%!}Xb^ zivpOeYO4C!&8euPbqfV>xeWl-OX;q8Dd@NK`^7(`e$I1JwS%MqsLTcpieh>@DIAtc^va5%7o+l&^}1nk&%I?6&+Mu^os=4Dl_(tALDVzw)+V z?n3BGWUX6Jm+2lWcxx#Td$J`{qi#PKGlfNjIP*>??MHxvrihelN~|mQRpx8P!-ymo zb`QkswqBMpmx<^sdz7 zkvg9~s-@7f_lxz&m1DeVfn=$l71Y;hN%g!?<%V=UxluKM5F|0Zu8o}BYp&qKz(eBz zd3(Xzp$fz6gX&FF@$p-ud_@Cu(}cTmKZH8n-Y3cE)@su$C*~n`>tw572Da$<_Bg1k z>e#i25l2*yWP8Yz>AlkpyDDE0&syu?L*q@yis#S2g#ju&o6vG7Zv-W1T&O>i3Bj7I zDR;9>c~#?ro_bVH0_Quc(cZ6q+hYqfRf4Y=QKIXMYJAWRiukVl;%#Igl=5ijQ=ywl z|K85PdQspfY6mTGe+c2&ZugZMwc5;&^#2tJK*c51;hoy}$D~!O{s<50p=12*cvK^6 z3de8X>(u=(5$H!jVO8OBM&3KMw{; z0|@5urs&k72d(Q%jI9Qldc~u3q!|K@jW6r)-xTIQR_EPm7-gD#nFTjeo}3n@p2%Na z&&ye{w3VGi2wb-&ddy5LTzw25PZ{>7f5wxmp&N1Ydu6(?~l#f;p3x*^R?M3sLo4XtA)P4{@_W&hJC6`Yo6bW3~*%wm19kB!f&m7+Nuzp zS6WXqR$IU*FTE`2v8@q}M++wr3&G-QIr$LZ$KFJb3|BAQmq)hIXibQy5!~qrG-`b~FRz@LSS)En`**z-f;KmYPkax{g86&Zi zh?++Y*_5Ec0IYzufp)t}if{NWLs=5kCaK(ig78oTXdtXbn(=}3%jiVH!L9X4#ROa+hz9^siib?|QW9bp@w1y%a;xs2LyiSjR zD|k=+u9f+C-ZUA(RAOr?!g;@h38Vpqki~9qNys+}et*9H^DjEeRA6#bq^#@m-i|(& zYPez;%C5$!l(WBE3S;mZiB{hvULZ-Y*!dkwat~q`)t*%!-yCNeXsfsE@yrN#RCxyD*U;=dh6A5T1i!qiXiusdwAnJHrgX4C#(I-B70~pv)PB8zzZGS8^ zQ8CFSXx*3>q3>Hnj%WYT^Z&R1ac)4?zC9rdgM89}$CN@C>v2!f>fjaIXvPs=(&4t` z;STBWd&4bZedJ)9Hn%Oh6(8NUJ{p*1V?{cIXccKFwiON(oM2Gms?pplbzRXD_h|MY zvFf&4@?pog*@19{OGOK?MtDCo4OQp9lyO*zI6*@=E_8_c`fA#3}OQ6yyisq1Y?z7Ng^MW<4aF0EUx@R3ncggL%wmTBcf1#jW zPA!;Lf@i=t78w8oDCq*(au@imFOp>ArrQBk+XFO?3a7y;U}N zHCq&s;wa0x-lQN8$BF8%ZI+duU?U!}yJ594WTfKwp}AfYhJk-3ktHq_iN0UsXP3j z37LgIH)I#L!Ga$JRd}6s@vZAkAIi&^Bq@_O%qF0{6Lz{h*P)6)FkrX6;T2%olV)0v zRn!kRkMk1Wi{8`}mS|(3eQTW``hH!hx&}NukeqG51UeoACE{%ovwUZ6}1|6A{8@RRMo zv@`;SKRbpQe!>Bl5a^=e8siEW68Mxg_+h01xbE;ObcUx|{4p%|pwGwo;-k^Tgt6w!LL)R(;k-xJNdQ7~;_`j0#6i{C%lv0QT< znnQ|5=;6JiGWEeLM7KMiZxpy-%LLI=_PZ(e zQPsi02ibU(wFXDUH-qc|KebD$KmZ%?^;IMh17?I%I;;gAOzTQZ1 zLXu#`Ykxzt#k1dcST9Z)iA|+CX!%dxQ~xz<$k83j-%cwdehYt7zY<`v?zCe-KP{E& z=XF4l6hl-6!lLXWsY77~i@ImK!Obv>2xZrbG}*kv44-VR*_EUB>}9rbUDuF&DjaSB z6qt+DF=@*>zup7oI*k6sn}-5pk?RpOg0k)J{gPB}$aVD;4r4H8^2|vi6x2Jt2NZT8 zK(h0>NV%=pr@pLCZ5!$Im>MZSi&y|8LY7Wg4wZCo3$0kX6R!votxyT~Ocx}XDS)=&P0ur@$hw?0?KT|;6il60bQ?aALT?7#Cb;4o1 z;rC!UW51QKj-0BL;&cpn)~(?1%G5z8ybd*6tY z)zp~6yhMH2Z6a?mUooSvwlH0?IHlq?xIfzG^n>PnimFdko3 z(6v80dNrzq4i^(kG^*=QUji<{J)zgHfV)n`^V@~jV6$?`1YE34MMGt~T{DuQ&$nPi zK$!qb%W}7G-2oSvee4mkCQ)n?&6+A|%G`KAWoeX@)uyMWVS4YIuIi@jHYQx1jYqF6 zUJRv_3^q9}%=R<}iTnH)Wv7gu!M^S-@FI}Bs>XH&jJT6iDNdL5rZDTaWzZe>UV&mG z=~L`%pc#ZfmK1S^E0&fu1)5$KF+6nGc}XWfPa9fL_-PP8l;uOBqqmh(dhEUkHl};o zX$rmRv{7cQ+l<_4D5(M@w{~P{8xFmdUMD@(eK4Y8l-?|M4BanSCsn7s8^Vd1vd1dh zPEqT$(#$HTsrjTZQ#0tnKt$YfCnpZe;xH{mw%`A)WJhb}T+GHYRiJc5`XpLGek%w~ zkPi-IQd;+Zi4GZAfVT>g4|_B##6dT4&?W24i#d#UwwLHfcI&+xt}G-xsAV41gY7m8 zH`7Nn@Md@4%KR1B@YF{NYKzM*DQNQf2Y&L60R)`6!Zyj{u?azFY$AV|!z6nm_eU{6 zZc462>PI`Q=Q6Q@`|}ErX%oUK77F%{oVfr*%=3LkH$e*eCX2+q2m(Pg8ipI80nxqgGsmA1vkV0`lAl5fyf21jDY)6L;hT$Mk0@S6}D{q&~D2& zz#|hrpYYh`+jn$YHDLl4CBgm=iFt>_RJbbebeu6O_OLylUm7!T@$;3uye6|pBIDO4 z68(y&;cjYLWisC@`GGKqgRTVS!iUGHJy-IR`|LURX7sj#nTQBQL*C~*R!#yascJE# zJdsohf^U78!jpm<*$FC9^5iSC{o1AOrKXBz{J>}ecXtYJ?z2?j<8J>0;MbjMwH&VQ zZ63tt`H=)EW5znMD_X?+GFToapK&Ei1=M{N_gto)-pYiH51#fauyeQG0;&fu<^;WJ zXf6$=;}m|0J}p&SEQzTm@K@uA-Ung>zr*X@ve_r*6SAXlY0vhp)nWAkuucLhf?NnB z6Dp*6QRSqJ=rQ?5@0Z5DDR@_#xqj%eWzTY4?DAz+-VnyuZ(9GRe&M%C5b5p#)db57 z*CfVMG8n1qxP1mF8*Dwxj=&-oRJDgFt{EMj@H!Sq9pQZo@BQo0xBplmM9J}QD$G2Y zd_!O9ayLgvp*Hxv{}fVWATd9h!h)zDKlLJJyDXCVH9t7EsP@0(d|P60@Lvadeg9OZ z9J7#OCAG~hFo?f@J&>PAL=xOSREjTI--^wUFRmp9vSgfB?l!GP%w{cACXTL%?X;4C z1tzleMBZXD*P{RuzY7yy*WZ+>ykXNx1265o)Ig3EQky$yW+O4=>{HGZ@&)6pDiA*h zb`LxB7MO-BezZohUSir|L~hhC0B`ypl;aRl@3$~RDYsX0L*E$_xF7agaBuTR#4fg8 z7#+mP%I1CD;Z{ko!v2P}`IS&2r#@;a44i8rNGvAk zO(ZM=Q*%a`*FZm(6}aQnnOcK8O#%9;aRH95>@$tHtO~RL!m?4oFyUG00y8YpTl8>9 zv!T>rnI54z0vDXgQ_Vnw_R+XUv52`T0-PW^Q+;w>YT4r4At6bbFyN$fhVaCCG&$s$ z%(&k2a)(_pre(*X#xxNdQASvjjNc%GDoj5TK%lmylgdTY$7cboe{1yW@0Ns2ULhXJ@TGyHiRZ{)F7D)5HYxb?x8;)`&7w|U~h?@;_mu%s8UraJiRN*q_NfV(`xojKMr zaKYnINu^v8eISC|`eZfIL&>u`X7DHf#lnn;iD{&_kYKA4T4{j;D6yh;stK6ZrdnDF zn33C)3sm=SPop|2da5MF`Nuyk#T~!5*izX;J{v;+i3_`}5MinAqw!b&@l%fk{fhqN zZ$`hQe2>Ln&u!8rRc7!X@j=RwZar}+S)Kz-{K4!?+$+PcHB@4Ai2X*C_@>Mx+5$7I zqb>M+=`%A5lvq556q!mk(JtE)Ekmia(MTu^4BM7H5QnCZGF;%V2vP-_ii?@&p!T9) z*b!spsE<$$^-A|%Plr~TXVs@Ql;$&q8SZG1#O>ufGd#KN;JZcPNIqqwp(nUDz+o^%n=D%b=x9wpgK*g)B*W?GFa3L~YS zST64&QDbS{jj{B85OWq-_ash))oP$FVZW=r3G(VeG}U8SM!j;M&VihIs*5z{X<>(Y zD!sA0bXes{HM#a;G5qHjZ3U|lWqvJ*Bd}vUQQcBJbbYJY2<$6h_H%6IB|T76*V)g@ zPR~olbTcP~VJN$&x#i`gt=_9mwqQsa%%-N*&A-f7_P-bU`N;3ClU@O?M-ncU@FjpQ8e&{T*Hf0;1#F(z6XG_Nx{h%C=Gm+ zNxzi;-G{FKyrzHu9EH8jNgg-X_iuaN|Kl&P=$mD)j+r97nzZG5q$l`$P-=1kBUq6K8Y>?gui4yxk1o6RX4~e zy2zGM`mn1*_x?i6|Bgv0S#db2{~;f+H=w;`lDaE{=zQ`3SWuB+@^4jtPvZEH&|am?@jS;2&Uuir$DC7lxIM-6G;js z_2dj}!1Og(N{S};O`t?|ri;!Pk$LnKdvU;cqz}`Q`s9&XRdzjz$VgGxuqeijdwimI@ujZ* z7kB<7e&K@O`)CT^Afy^t#R)^n5&nl@Mj?Z;LZ0B?TMo9 zfzp1$TftKihJv9asyn<@3vuGo}Jx`j_Ku%j2a|PsTS7a;DVJSKx zLy5#ZszBsy3NfE5sx?P5nz+t3x{r?Y3KOrzxY+59+8m_r${1d26s~;vJb)p`zn#`y zgi;aecA`@|ISgr!Ks^FMwl&*$7?L$gX+N%tQCmS z`u?fE5J;^p)L??l5su}W0X!$~#(28OBeXiV>G6$$yZ}4p7ED#vv{4@fCi{1CqsB04 zGu&jrFOJZRdfvcjL5XpyrWFAJjF&sHwxLLw*$SJ7q!P7!GS30$Gj%sjzX z*~zt%`$GNJT8>O6lyE)VXmAiP`A~ydRk)jZmi*Y0ih9}RbvPpYm!Rv?&)!gD`4)@1 zj9E79k6--xHX!C;2lWnry-};=R*^m!1PDU>rMr0^z0VK3(5QbP3|cE-z92`}S#~pB zxU)%ROHqq#gXwODjkVH>a610Ee~tH^;|kVIYf6x1tsM+4~Cr>bs&ag1!Z9SdcmO5;CaAXlbSE;Mr& z@*F>xvY0B{A(1mtJsmnv{S^~!75INLs7;W0lgLo$n-2tA7xUZuO^_nXZ zzMLAlkjN*pVN$17avWS zx*V&?C1KtovP#aoKZiKXN=@`mChLhBYlp4$ z_rlS+4@n)q=B^*W-S9{18<5<%r}Yrx%g~~}zF*io0u&h~&uXDu?cbc@CALjplhB?o zAm1IGOnZfq73&AwPJ@6;J$$|0;S|*yx5Knwhgdw=&zEY&sR$XQdH}~nj>!?=zT4_FnCga?BG62jmdZRIj+h543LtQ zFp|^dLU;!b7OXEQ?G-7zrE6)^p(uf-f6dMTl1!?sYbAxYtz3KFl=t3hk4q|`D1xj_ zRYPd2qQRqPN6>6N2rqt5`Nw0~j=;KwBM%$mx>I#_L=?OFM*HhEr|eB8j*o;Pk1KIlqmm5hB5-qb$0+{Z~J<}iC##a=k%Fe21)K2 z5xb$pi_;9U(A5!?uhq+mC5}VtduSIrgMJE=F%07iF|FJnXK7_+xkIy&b^K`5J1959 zF~3yy3mTdz1;YL_pgMDCF!qW)N?Bq*pF83b3t$VPW`!@I=z1Cz1nB+4AlvPmx>Wp5 z-CgKSPc(Kc$NPEWjWy(ccUlg;55$iJWwmJ_@~sK@Ml)d&n97dOtU9Aid$AKFcPB{F zVNS6R*9~{aj`02%G)@>Q;U!Na7AV?d20+-qzrM9be;(5Rbw=+$&M0M`|KXbcuQU2{ zINSGhrWWP@|KV(3w&zHt>d%o-=yd)y^UXws6v5*)r^VMEzVsR4B=@u*vg0IJNf2<3 zn2hpTH(VrFen086brlJMk9uR(uH11;wnH^h2+E79uEG;rbWYVTN>%auzA5p0^*9xC z+-6q{sZt|?dR#MFSLli1y{H%9Ee!ziO;^CznnBDflAFQUIe|F zoi412dyjJ#RK0E3w(T~$M-S?K0=b_F28M-CrX5kFku9ppxM7}%TH}^E8&+|Qm}4A`S9&lV zq*i5(lVQoDpVyez@y!l|Rzz?GPC}Z@b+&R1+hy>-@Q-87^SIgeoF|%RTjicz)cp(@ z9wG>(b~VllLx;6fA_@z9dr3>VL6GVgkBEkn`7c_gusOL&ILh2qe_BFDrS;rl}Ot5h=K)2=uvAXvobepC^Wg)&(Z3S3*{dGIgZZ-=}lg{eJV1 zN+lJ!7F?;0#BOW1g{YDhm9HdD^nhl8==+0;(JqpqUn}l$Nhlwzv4gY5yXPiDVF(400!9g(W;! z`SZabNP~$&y2}Dn`SW3XLqrXL2%R+;mFFv^1)cIkE(Nw=NFEj}@BTpUVOiD;WyNew z4=JT8{A!b39NfCNky;YjN5($7bE+VfTxDMy_d>3yaye{KaODj3(EBEsv_b*FfBW`* zO*UoAilf^Bn+(7sxmST&Q}#F1{3+^@-8Fy?pFEWPBo}K(H%N$X#fev8Dnopzkl>rZ zj3%Tq4%PGhI-@`wUZ6*vj+*`~rPl2A-A54*FOS@XPY>>iMRSfZ#Q;YI>kFPq-*?zdLfH+z*w2_@>PwM0>lnvIq7A{;@0*b*|zz z>@KR^BK#Y-)S`YtpJHrzQ*l&*e5neF@gzz1pGKuEfr^&SoG$r=ZmpsXRtc>FI=~~% zT9%%ykiyBEG5tV06E}CKk1I*;8ablOiJP@=t12MLSo*`Y$oYi8Ru^lyI4a ze|uFll+iEl@Zb5M0zbP;{eVa9q=Em&Xx{&(fr>v%?|I0rA85u*xgShSY1U~nF~(i8 zb5MdO-4!mHMx+*|s$c-)zxPVup6xkeJyl5R3i) znlWCHv0b2<*C`FEyQ(96vwG^XEuLVs#3n^Sk8jV|o~OC47NRn#iRXaXGzlQvT>NRLYm9Y`ELgiESR+3TdVh`;^u-*^Yj;w76hltB3?Gx8K+E6dN%MH%D@#;yj zcdmPBOi2Fivte1(D~|revNTS%>Z&I&P#QvEGq3cVuL3Z)DMG7Py(sk|7X49*wO_*p zo($(C4U?N+9mCs0o!4YzdqveGfcqCkUsZ)n2!zy!=cBOe!;gqEzxT-2B%7n&Aqhhu zWt4oDCctO}EA_$qb&dV9j+S%_axWOBXqpu{N4>7uy6QY%5kISC!{~xL!~oki^L>N8 z)sOAf7nZ&I9C>ofaza8^)UfC)p07%GLt2629u1OZn3YQ1SE_MUbzismac#*q6^Ja+ zawjfK)FAjI&>8|4iN4zkB|XN;w^!aTp=jRT716>}5ZA*&#-8+(*VpzN(Ks{>4yZ6%f`2l0T5 z@^L$z^<3mU|jC$>9g0S)nfncmIp4F&?PHFZ6^|GS_W80R?-L zChbn-km?Vl)qCtORz4|F*c<9@;=z_I>>t9X6mAmZjRo~w-nh|SD_?IrYXJ(3v%4ze zTSEbPM`K&DrysXaD6amM&@Od~hWY*A3VKP-QSC1`(dp$dIbdMsD^#?}UV)}*1VA7_ zp3QbueZgJ3vE}cV#JMSjgP?(!Db!m~^|^l9IbA&d$``}Vmc;9ks=v-15U$s10xC$Z zz%y4uwpadHKA4VJbTO0s(SkizsJs+6+m!02rzy{YF}D0+8^69nmQBk53=z7vYFiRr zv7tX%IrsxYIWYtKb#MxRFWN9!HB}3YM^-6{Sm&CKJVJ)UXh=<|B%dXz<{az5rXDH~ z%>-MmM^{8N9iw}|yrZRB;j_;etEjg0ZKlon+(cBu&R-FoyGKpjNT_2TG*UT>cq$qP zG&m~JdPRduHfJJ2Vk&2@t7Y(~VOln1<#rr4Rp)nMZiX0Z*A1(B2;1}n+o!(nB(M4j zceNBoD5+WpZUGa9t17Stt<*TYF-D%Z*yn$0kFe{6csPdvjF&={8H=FCd<2F#q;8M- zGwN;yVJLvH0ui#^8Nwk(T%_pc+ zPIVx4bcBE;m)D&D{{^0Yll?!!J;!f0k|C6%fg4RPQoM157W7tVjF8P<|;F zE!rnx*|XI~{4qF78;aS9On4ArR5Y5eU?*GeLa}Eh<&^?Iw1jw0i6^z3eiu1Fg5KY# zH;h3NeZ$^v`X#{}yfyev9WB)I-Tkr5sy#a(wHRK`p*1LedV7?eU8WFP9SjpSP{IPK17G#+R~yAj#SQ^|gs+UR^)hHO*m zE>@2>mPIg3LXONQmMxVw7;X__SggySX#&JzH`1SGS&FIW4D@Z#M=q$2nGfbAqh7oU zQ$S8od$2~RC{`$8O1cb%au|trST>UmZ1{-$YG}f;w+XEVW~vP=rTO8E3S=bvJo4aq zHq8W)K@>c=km;1`c8Gns{(?)!j0OngfW`o`M3&#UVuZ#cMKxk(hj%pw^&#zi3bcBj zy-sE$V1Y-_KMI~So%vJ_V^c@6i$gRL5XCldj!M;`C$d1^S-5W^u)mUeLe*9JXTdQ2bl6IwZ3{2*Lo z44Bqckv>^SKNH)(nQCamDbZ)hgzmU{bp+4=hql0GCZG&zSE<0t+vA5CyQQ9|5f1NR z0pK!zF;?(`>&F)3+_e%TDB-aBP4ZW~3j4S~_nO`kLe7gHGB;#8WY?UAe&C+{_N`}< z2zS(B{m6)C-c0d6=vO5o?LJMaNFbiH{J-9`g)f{ef<&aNxX-2}8lA_j9tC}IxCkXu zkLBu5^d0rdS2$~$re2p-{7~o5tj2I;tYN%mh#y zEIcB-{x!rv9YAqYcHOKF!1BbyROAnf-LWX0j?m-+zDK3LXh9WAs42vt&nSn0s3TGg zZo2fu3cS1MSSQZpEfrL?*)1-fCU)R;D9a^gKn;M{g(B*|M!?0uLDcXRIMS8G7kG2c z%9<}#KlE#Yw?k99PRgw6P`_dkF3O$(7CUZ(z}c6!*g zq@&85;Vwi}fe#uUp-)-bWgv2b`i8Vqdqi)9PrN$LE)GshiSDGe;|Q}N;R=oYqLKeQ-g*=*!4 z<{L+I+h7rn9&VSyh1)y*q^lq`|J(Fx81E<-LN?zHFBC0hp{ZZ0PiQtqgarP1U5YNb ze}l1=*@{vrWo^k|B`OG_1F9%y{AM*dSLBl5D+;=z=nTFolUN zg0xaN+&`7CHq}I%VPhFc{3lTXOVWahWCKzeOJotinY}`{>Dx|haPBuz7wdXiQD;4! z2sL#>Pp=!J~pZ{>bKs*kn|3k z(OxV1*t6F;2ha1SztZc;!0~(R3MUCB#8uv>)aI7DMegxB)pX)AWaH*n_rn@RQ~?@+ zpo0!y^;;CthPeCFnp%*Qf!#;xj->w0H8~Zo6VYe8oaHB~AOEBWxLrr7i>6}oPCa#_ z{*kbddALfdnL37>+fH0i(nfXcvn#iuxB1{3GU8D$enWP{sauwADdpDC$aNdPmZbjX zwp-juo#us)IwuMzx)!R$Iyw%fHVw5K_FvL9tE-0v^WYo0Y z{~y!fn-u{6001A02m}BC000301^_}s0sxp)m7PhF3toU1fM9_O;QrDM zdr#pWRn`6FXH`Z_)i2xJAN{<0fBf_7eT+W#*LwTtb)?Uiwf5Wg*SU}TdHY&z?9rxq;pyv|K36^Vq4%YH{%_-)bJS&xen0!q_1@QY<>sgNeLnx) z@Abaz^UePE-mkv<-}m0%Kl|tV{=8>@*)N~BUC;i_{@Xt9yWjo6hwrY>IX@rRFYPa% zBYoby-}^cB=g;TY_08wS=W3U?R^u{iY{odZuz$G+cZ+~0M=<{cf`SY2j&oF(4ZV%Z0=DHh$ z_tx;;HB0;3yJqOFdED=>Pkny7XZYE_e)jmcyVe7X;Pd&XzTXr2)THbmn3{d8&(~Tn z`-Go&eiq4|`}%OL1g87*$(woSBzOJ1=lpY~eS-b5r*Y97buYYq!t3S)b54XP$+*pydh@n1WgBlbz}!-piAPTpfhuwVGRZ@SD_(#>^Lcgi7VR#u&?ZoCffu33YFeZDq-s^em^ zwq4vSd*AjpO#5O+oul){ZRN^}wX#CXJvi8>=V1AEm3^!0`uw?S?S59tXP) zkZq^9{e47+yN+1qqRev)YTx&~@2rF&N)Bz35@?zoaW9_-9`CcyZk3Xsl`dn6f^d;pquDWKO$bO~n858x? zP{dH}16+*(c&{=(bzA%0Z*B3XeA-)EejoG3puKgh&)-(Z!@glp%8t}~u$TKId$@0o z?=R|IWy8t>-Nzu+NpzBLY+P(|c~WfHXS6Yum{#TupZJuita;?ByzR2jWlTS3=3eU3 zV`^`l^Q&i$zpWqNx|cGAcRBaErh4u6Q*63gD|MY0E2o?_BeB>#2HgVr&9V>|1){R)qZ8or?Wmxuk zcI;I_(Z`0Bk(wPBn=q<;cJ0ja`JbgsS!_ zn|5EWA6?F8P}tm=lfCP&da;(@{o$ zbwWpe*cUR(0nK*2`r@lM<^nByKCt*)jh9*LtW8XOFW0*C&Od*)g{sw4<6A$}2HYF2 zF{QPn>V3C!PQd1**1ju4P@A@l)Qd6Tgt#&z+`5NF3c!x4xZpS~uD;dCV!F#4^>I9L z_n%JKTfT1+#m;hZjq#WjZLHdlN(#r$=&W!%1h*(yvQ zgbaB6%1d&{#FD-X_ips?iAlbpQpFLj8U8RsM3}20#8LZ*Ad5t_Hq*d15 zIIJeEVx9!byrF{UWk~H6Omb_je_M6243t?R>8~GkEF8rO$4$4%pKJAu*!*5Waaqwy ze8_;Y+oVxuq|a0SnVbdB{h0h-wG(Ug5T(~f8{9K1mW{!BA_5x3f{VpDw#m_$86(!+ zGLwx}uVGxr`mGb1m$R$`u&k#$;q$iU#vO#nYs_zs@ZC<|n4NPhvf;+%<=O{ve)-XL zqGqfq$xej+&rR-$B=iEwDyum# z5TDCVP+sG`Ok?wTZ3(7Hrw0tE&SY})KFQQf z%goI_A@i$Ay`FD!qo*$vu@VTf8}IZcZvfr_jl4mIDm%S09ghdDB+tl}^Hws`E>an@ z+6r9n`)B%Y0keWa_unfB*iOpCpX%dRPUved7*$2cfR|)xqF1d3iNGB&iUCT3UWuKT ze_grWy06cNpNjvv@|z=8SWnbnIoXRB`g!@TtoLr)E`C1B)Rb#`FJU9erVsGFC+>yaC@HD7;L=3y%Kz56_HI!@f@gj9$)texbu|Y(LG6 zmQgaHWJNI$Y4Dt-G!0AmB@i2!*RToBNqbIZcO{j+$W!Vu3!UK@Nf3dtwn#I z9S!wmoVF4ekZ?(F1V<$3D;LT?djJ|U&|MD&VAhRH1LeTQAh~AKi@?7TK&+Lpk%eO9 z-bq!8m;iC^j%V%d2Cc!FNXZH1UB7N$I1b`HcJRKcHoFLo=@M>;gdEsrCLHUzhk)Fz z=fu7Qw^G|<4+9xFqqI!=S*|1PW~0p_xH?0La*v5REr{I;UzMwBz*8amq`W^!pW&rO2JkjN(j z)Fe+sFtZDIt$s@dRp7zGzH0eCH`vg1$^N`x6w*L-|5v$_<*a>;cNb(S?7KqjWo~9x zh}B`e43b%56BeHLZ2U-O!r+M9>0#mf7p!7WS!I54BV`-i=)$ld+A&%*^vJ zBWJrb5RDb!YXGN`GA>iCLvc*VM-0uzhG2@iNoN-yN|4wC(3s-Y7?c_R53??r8oQAW#&&RQPi2*$45k8p|pkTk710Zi@uM*Eo5*~5_&XqY95iZzlU zSuv4{x`#1(M(VrOf`BmOEz6RV@~Nv#J7JKVMHz$FNbr^}ZSNb_;{q70ZTE;roZmdP zG?!~x6spOBu|$gm8$t#FL5oc^M=%OHRd_3>c+V7z$Ky*$T|&>CVn zb#cTZ5Sid;9YICq{hjcpk#%;7qa(DaNhkXYB3S(T0RZ=}u%5!K!o?lD7YtXE5?4Wj z&8}LF1d;oOvRX56=Nv4TKx3@IvkrG07QXNhyxH#Ix~4R(IDi(pz%-AIAr~IbXSv&d%Mw>d)O`N#?;d07ZiW3P$#z3ZPO*E2hX2S$^HJaS!MWm0N--4Q|ngNLMMa)Q*tr|O(Z%F zlDR`Epj|PtVT9UE1cr2n{!>qph`tOU*wHND1?Eg$(tx@MmB!^)L(p&@0r<6otm7iFPIEJ&<6z6nz<42UTk&xT%Jvu< zvDMaSM8#~PAz82INsvMQChXtcru!|8FcjZZXJ2s=Y@u))!V+c7{M>y3V#S2qrWY&Ello*(14F0;!%AxMNRZ5X{MR9>3|r07x!AAu-d!js z#PSOl{QUgYc!n&+FEtUmlN#&#$4S-^ADBE5Ase13QUJ%&b`b%?#W4>3L~a1*Vh_V*X}qazGR*4BkarL64?Pah4(&TCq0P z_c}+6jyc<}TEs8@g@JGVjNwz#HEIMN)opSzQB=ZozC}=dCZj1qyGjgC@c?@6`xS#P z936cJqJe_spHiA0)kn>2+3=%lE4BuqI+DB>l4q}gEk}MKZmuIrS1I|bx_$GtG;=Bt z3jeuwRRpwQ;iivN-pjIjiV-dv_fY^=Jn#!a{5E7`C>}1VE%Z0kUXt&2nN#&%AAd{P#?1TyV>S2#;Gg=E9?O5u!1ZX zV@w>my0l81-r$o{oth!_8lfUI?3g>H2azjb`S{p4Bc9Yq5CD!ufKf?FPcF^JfHz4?|0_3>4%kEj$0c(6U_n%jYN<4y*jWHK!%EChu6L_< zuqjqmzHVM6rFC9}N^k1cUX@5{Xs}_i6RD*{Fn(3hK#|Kw?f*hAH(Wk9hv4SA??``M z)jlV_N#P%uM@zVxEh);NPhBH2$rVsD*;O9sn;Of+eEkR@5*RSxN&^?j!4y8tjNd{>J=pj3w(d`+;2n1C~)egA2gfj!KD&WKC zE;8R>tKzCvQZc_5JI}-kP%e47VYJUE;C7pr^Y@y1_yh$sT>xzv>f?7-i$()%b-YxW z>LG8`AS{9S`*&$6+{b!1UQ-bo%-x6Js2UIshbC zjzmmhMF}4vUCHWHjgU-Em1F3QreWQZiQG~?C<%b$71mjf-b3=kGg6&e$>i~BocgtoGUiS3u8Vk!2jG+wwN2u@ZM1~V+9i1T*>uV%9C*L~5 zr}lG%KBv3@nFp>6|DQ@FmrbE>eT3#n{XyfH{ZMryxica{1ZEP+cq5bW(uV=*^SdSW zx_plmlTt?kf{vi}eaWlv4phuqBJ$qv(cC5nyHZ>-OD{fG++Sz9Fd~s)=P>$AV*9CF~q0wQG}YA}*v;>`5^U zv_^DLg0=9Ry&-qd;Vyynp5540!f^NzhtCT|YW_IbbtxPbfv|R5Pl@#Y4#rT0#E&Xs zJF?u?xnD*}1X5SZQ!HWGo}m2}YUlyY29u$; zbD3&YsXB^S@*9dWs;bUgyvbK-({a(c1e#Ax{#IA*wgfK7QTYm=QT8nuX6uj3)hvv~;N_DVIZteg|lxl;zPR5hRs$ zLHqzrK(oJnRbv3G%eRvJHgz+RJaS`z=NkaIRz<72kLyk#^PVDz*T9#4DPO~sSp4(x zcAW|m0=<2{FRzDVEeF!GZI6(?I-^LQ%CSTV3JY&Kc05sEU%$1}gq0wogPN14r-;Tz z5OtSN%Kxy4Z&O(L+Op=dtl|sLiF(w|FvGYg;&>2$(^y8+Y=t$5&I>mII`7g?@z+z8 zAg~olRH7E=!^DxQ|L-TUYh6IY!Xg3Pb6}oe?7|`*GVugbW&T)U6|#?Y0>EkiCum)u zF0;LLgbvW85CU>(B=PHuiD?(}(EtNv7Tbn}0#bLvfx3zlB2u#|7-Ypx=2i0h?4~fQ zWKzq3v7kpkfo&y~X+3(8NvbK^KTih5&P1v)!c-9xHh}G^%_rK_67X4R_7O$`2CY0r zTSB3N97CVf53x~4Es9ihNeBOwbBDXR(~3!Q>7vmRNt2|{A*`gWT-zsMsqRgWC2@3* zxRY#vBx^>i$5K@(yy@WeT=wfigeSYo=@}fiX7jqOTea0N~GvzKQgcA34vLw_mYDai#DPgmZgG$ znLWsD`072J4cnA0CsO;F#9KFRH=b976C4su`r~ej#w1G>7cUP)0i)rrm5nt{P*7$2 z+XFgx)CWtgSneJ$ajaxLLS~h$wIsL>BU26;(v>nw@F8YhQErr=PEi@MM}vZ;D;z%( z^dpRhZtE3$GD~U`hZ0pN3=zH%q)2kYC+!Fjoc}&~ONwr;a75xWa$wXJm}WGicH#a) z^vM*;DFtV{PhBq%btNcovr$kGmg``3vSVJx7r_qtQXi%<(Cswe??L{K3nZB#aI^@T z{m@=2>~xg32p`p0QX-a5^2$R?oO-=sW0xgONB%RBxT%EcJqVznC9bwDJMdx41PjJk z5gw{>9X;tq|E?MP0m7>Z_+c|6=&1a-1x8*kN~_*7 zlP73o0${DM$(ezu`PKvFBqI3=Hj;CNf4OD)r0&e)F^E^QjJOKaUn{NMI+aPOF*($7 zpiU^{gMX73ydm-4CoRn?&iuk0fEQO`25;Vy{dT8P+%m^2hZJbIM00m-|M}dh@s|C( zviQVcPY=4xVAZ)RuL0G#j;4}EYc~i)+QCIAb78}b@GZN=@TCEn)AaZzG9yF_`_|fH z%QG2SA#D@gZ(+Q+ugg?Eu8H*o&!v3)PJ4lL3oxI)FUvm}*k&s2``)vlmFfs>zu{XM zGOwnIgLBRA0jSLn{gxJVWbx#c_12b*UpN?aoNLU2K8r;{nM(P6&jh1pQg8gt3#$n8 zTrCA2llw$#`yVLO?ABI`#%q4=&JC`^2H7<=-cSVZL=E#LgU_+M|7*73DEG#@5?gisbxM&-d5x@8K&h(+0Eh=M(VU(KPn2qH`o^(v&n|P|a!NjyY5I}W5u(PUd7Q|9RH+)ZRYgBq6^?DWzAI!W%>@=i@tcL(w~rs053 zZzwqf!CSWOew*x>ptgD_z4QA6QUL;Aaj%FJz>5)N;-8#HEggXYX#3-_-K=|&Jb+S? zcdtU4)1+gci?C&?XFaRGCE}SX?%fz!>TC$p_i!NY;mNK#oW;+UvVyNr-|8WZPk=Wp zdtAsm<9}bMYzTU;bPIaWZPI}Cxuq3>gWGG4HwoBw*GR z#C_#2k77Wgo9m8jf{)9>q+QchIYy$T`wECi#A|5%XipyD#YDnodU?nDeq$};fY%Sy zVYt>O?aSb-n&}L0jk!wT9x(}RsX|7<`dk$mJg%cU@T(;Vf|+(Xcek>xYo{upS@FFo z!kvU|)J zqW>0iiG(k^1H?UgjMkyKxbFf5#7@_dbrAP*brB@gn;LA;vKhb(mRo;D%72NqQ?Hcw z^yUyD@rFB3ZhFx~7xl|&i&j>?yvx-97)@_!wR=AYE_?4I*}nDdiZZu3XyL@c8F18i za+diUpyPH~d%S&7H2bYx9NCiezI+`n8|zG}Wec}$^a~`tEIP3#2uU{vsBHWr+;1|6 z*0iWaVq+mK>vfXhSY15Bl&?gZ6=${x#ZdsUbakN<4V?O&)L6`eeoa`T$g=G-k;W5B zJ&9%&lMqG_c2wtYJB|())jSN7^pP|ZNEwp1QkGQ7W3}iUwTBLIKT;2t6Po3Xlzy(C z`YMa7az3;L`P0wxj;*M3E1XOMHy{^AI46ELz9SHQU@>Zq0`D%we-Qm*ScXL~M~z6_ zHSLB{EeWiz8R7XR8Ya0b#XX0XKqWXVVMfiPc|jWcA5zEw?gd2xp-S)_ZXGjaiGWs= zd0U)J=`H+Efu>dhrQ*`M@@2dUPdC+xP0e&47Rk>tm4~HPCrQFpoFWw{+@bkZW$s-` z8fzv^&w8)TO$h%Ist1SBQ*Xi^O#Vs)uI%F2fa{<&w|aB3=kmFA80V=3^Jrv1u=>WO$AZt z7+zth6JtDD#klr2kF2?qjwVPj+%ii7On^7ICD@;cMbq%U>}vAG;>=8ZfSzhp-xEAl zS3V1A5S5;ANSuL_zX&q~CKL@9`gj?%P~>+#vF(}8&>}1Yy^0+pwVuT=SQp-GKI>;_Z1>9k9XYxWIzIMp-Wmvskfm_gq3Mr7pUfzsbWLyKs?dwGe|<`Uj9B+OD2Yh=KU5YT?fl!!LguI zkz1)01YaJLa8RM^{rM5|b;*dPV5+zqoqmGmiR}-8-ck6XOrbxHUc6J~G@}8iEQ9DB zuPZZn6plyFjH7Jm4+zaG{0ODE&r6_+ZN_%Ku}V(?OXO^()1NW>aKSp zGf3UTjBLZ`lhW26fkVU_Byna9lt7%kS>06`m-Ylsc>*fF!IBfzJG}Z0#dI$y^KGUq zU4Cajx*lT|LHTrqtlCzY$P-rk4bjDhukHQ7Hy}Eu9#97Ji-+lrA1l2cvDAQtwH)Xo zEK0KXbFP=8MRjpB#XQXihu}ZArWvDu-B%oo-sDNn68-ZP-H?!GdBp|*08|MEbfvE2 zO=bQqx5HJ4*F0ao>M}5R0~5V!OD{y&(Mo@z>UaC+modExf&tqkQzu$SP~6Q}hGM#k zuq$Lf>JbEW-$FLqouuekk;sVBv=WpP(;i0sYz#8n+WrSAvVrVf9b`k_;&q9@fYEA3 z@kh5LA@2F+5DhE*hDW{c#F9GO*TyvKMWqQAb%zYIZVYQ7@Z2-#D8LnZ4=MyuDQ(fizU9JxkSokn zR8SXPv#w&WFrjAU^h^QB6a=Q^Be=vc%k1fyQ1o8|fMJ>NdupiYXhQx;EnQzW&;h)d zB|0)2TU20C!OR#)L{xUSER#5RNJ+d%sQrglZ3<9UG%BZ{@SBJi$=K{>Fi(OLk=i$Z zMW|^fghkzF&2Q@__-NV;8&5NN8_h%K+{Zk=7{i8X5~joq3npWO(ntSAkN6sxm%DD) zI2r!mzl$XD``3)}=f#$9^8U4CJ%zU%2!)8<`v(VUXGlj%HU&495kP^7HlU045$J@c zJoaxtymdOzbsGgylVtgdWtu>UJ2I$vqHqeJ&2G8o=>Ju%ITYhn4@9He@sCz`I7)kH zP{Wimt~pW=+Xxsb_fKgO(4;>iSnxJ^h{%b=2T3?P@)~&g-RA^ zKrfADpR*+*@jiOSVq)-Aw-VO!RZl2^WZh6i+EJ0^z33!cl`^9D93iY&4a{MXDcwM} zm>Oqvq3xg{2Vz*@Kx0L|tZcArN_r}`=uh$mloiN(%5e?=$~;YRFqn&nQwnMb?#zQ| zXh2XT=+u_d=v81EDN&7hAdi$`dFEwP5!XLK@_xMyWoM`L2^Kf1j$4vMrBK){vYM7) z%b4SOlI+7fDY|;D14&$8N}r^xyxpm?zfCmA@n314FARLY3I$u#DOW`JrMlvo3*ssd zx%8W`=@llM(K7cQs#tnKm7M)>x^h_n_bQ<-W6&+<)YFch!o;q}0`2<#8D}H$VHRGj zobmbhmBju`WRVB8m#S9>JxVb;5FusCdayye(r~&yPuIh?Jkl3>LqECVX}VEPWG-Wh zyjGt$)*dEKZ!!+8p>T$}suTk_I(vD>Cq}-SFLe6H!Y=J2tj$wQhTutL~g&=6ECC0TNH zk1~=kLHt~9N!e^!lRN3pbqej1sXU$pU6F2u&E|pl+8cTsP5r;-j6zr+f-6rhZ$f!^%{+% zL~aS{-c+-_NlEWew!+6EkkkYPtlURwCTAhYQy4%=h`A7B7SIO!x8K~z9mKDrn{b)D z0-=wjw2&@Cx(k(VM(fHL1|4<)$Q4-~4Cs~QOfkxhgr!2|-(&&nW0SjnkcJd&RLdZ? zX~nwHj!D6+vpp=dBQ3L1BP~Xz@yZGAy12+X1!xGskvwD8cXevYL!^I((R5;$VL41t zi5~c7XolF)a%{M7&$rU{Au%IlCqFcc2?;w>96kgqC#k~>ITsX$-%N9ifG{Hgi=ri& zGxMB;jTW%b$2AAF+h3O^v<>K_?-~gnDGL1IZb}uZ@VEwvVmaS_IKs8kH-PgLkxMZ| zF3lPncw_<&r)Eh^pTEs?1`ht;zc<8=^l^oHqg4Hb)j~<@v}}nGr1kl+>+L^k-?6T}{x?KI1U2)myv zg&UV#*^?5=vh@hj!8jVO><*Z8^rq3YL_%`eltcw^nfVrNl=kbgA5+;s(Bj+TWB3T+ zu?hv+@o5-+M&uP|4E|)94mC};7IF(G?^6@Qee2W2&5|*r)Oru!1o0E*M1)aE6nD9A z?ul$lo?r2IL3J%aB*6;WsOLaP(fPzX-}({oqn3tM#NStlBSsjp!}UhCpzJ4nUOR!v zui|c9gl4%?uCn_XCjN8*ibR3MO3|7}n+qx0ph>a6y<#ZYQW;ztm zraEp`Ta~URVo}T{Br^LYEfL4aRD6T8>xS_7wl=6As9UV->Mni6vX4IQ@T7twV2EJv1D4hKbgV()8!g zYf}r;yi2t5HH`;bFFXu2#?N({!u;2Ds^TSSs3(jsyP|y6^-kpPbqd`K2^Khr#`+MS z)v|IO3x<%e#Op9-QRUwxAC-P3{rP4Ta32DjboE)<{(2^eRox>htSA{wmV|fy`RC1Z z2jN#Wba$+@{33H$EZos)PD5P}+7gX^Hgn6>+{Ec_+T)tg!hbWRo>y(dJ z!`J1_WxGuPxH@7i#M(uu(EnM@GPq( z)L9?0EQR%paHc13M0CULZ5&PII0MIoWrG_XZ4yY=QKTqw60U}(z3tA zDM<`MTERN_sxqwr;ETAY2EtfOGDjWTDBX~fpV3d;wg0}DrURUsjSpA~)TTb?dkCgy zg0lTrxPq>Ri)GN6p9+~_VTZZFfN7edttm|LC(PjhPHbl>_oztatI#yXyO}HC>6SuF zo*^J5)oo?RiNN<{k(ns~PeS(2Q>1bsGq5E84ndE8I%ACx7Hq=VmJmkB5pzHlfmEJ$ zsf{^R5vpEo>_TOB0x8_{aqM)@8j{V+c3XSE2>B&sy0^9$dhsMXRc z7PJh4nJS11^T7V>KJCf$rLpRVrk~u21{M?@MRCTy0gkSexsq?BM!yl1iU~u@AK714s-p_Ee`68p(8CrfSXis~>q&JMMK|-#DK}s)9IG>rLP)Mj-|L zp2whC2nK4;sjXWm%w-ogXg+>anca|0*Zr^PARKE|b`24<6CF&w@NaamClRl^R@xr7 z)e}8RaZu$y3{#MK=0aTXmh4;pr=>>xYIqQ+|AYtYga_SOx3zM@gA*kX){H~@{QjBg zL;xYs385csKtE=D^wZ~$P-88fM_Gg>oLX@*_CzfQdyH$E);s|M+jyzK@gO<`GM&WT zebDu42L||3>*d^+S`H|ug}I%fTDZebATH&=C+G0_81x&7v1QN)zP9KIBGcLZJe!va zfu#txp_^q6?qSsDARz*Q zSVjc&P+8~LftYp_8_ z`gK`Bvu#h?CQsgO{5+In$cM{@WTBZ@8Xz<#fHy7!1WnCS%;5AuO#gr_Uwznt4X1O= zURc15xYwoEB~YIA6y~ER@3vv!O=31Zp&zj>A#`_&yP297v+LFX{I^+8_;`!C;^arEmjFS~muFieb(QTt_#0C5i5S*bodrVgZ3q-()?8 z7;G?6`1{2+K=p%3a1F#+)r_<(LRY8>SCN3`!ON9P{)$)wZ=Cj1m^5HYcIjp%_p0JLs3!C>SKFXpEQ6+5}ZllI~;=F4sG*{)Q)>3s{ zo;86dlzHveZdAvb8({h?N`h`jw`fGhh^oM&asf<339SfYE3?q(u%B=-KRQl^KXK8d zbD10{i=j^yCH=eZ)=DqmakhR*LJ%f6RV%>=G-cQR$OJIa3v&U;vUE&lU9~H{^KPb% zT|&V!h(Q*SK4Y=WOrsp_Yz)Z*nRrt+0Q|i%h8)Nsp|To|t<*ya`$wwQqLQkxchCNs zb+gM!@9ve{L1cpXz586?5Z~lcU_VQV8E5*jG06zQ3|1k#X&^_%WBQeag?KrW2alRnTPxwP%`Fg|!WdpX( zpcd~|l4`e=BqoZMfw;GSR)B&2Vva->S|5c4k{bfL;s4vzG)+Sv@QHbR(lDOtvS)`| z!IBIK8a8kr$G(MwR5FJL?+H%7yUM!wI5uG3rLFCv5dr{+hH8bKMa4c^Jv!iO z_}rQJRcwh}KM$6H(O)_OWr|&IJoTp|x^dM=J=#PH(sbnsiwIQ_Zp7%tIudLvlxezD z@y>W=6-A|eH1!S4h)15L$dJ*?x&y&7ag*LLfbsSo zR{0LF6^4v3XsSd43@TC!?g!(+fQ(r9 z^%dQYl`N)<5n+DjFZ=ny{fol{OV|=r2EGBjVb5)m*bd5E;mqCk? z2iEwpM2o6{(oOx86uk5#W!X_W<949o#ce6ooBA62?wtaa2a>YbzjkWZB{S{TXwrU* zxI!o2%O#{$YZ`&GNX2HX`0eY!6m%`vC$C5^PA7^%IhvSv${5K zc`RTq;98u`F!;vi^K_vooR$!d5cRM*Y9Q!X&8{M*n~3)QbC4B4`>>Z{YCY>gp-_`2 zU?-cmvE9ARX=r=!haM%4Pb8Mjgx4a?4_wjp>&7khA;bUKLS}WSQq<<&BT<}Dog7=h z)qP1V-fAGSG06^>7$Q@Qhb>2^i7cU2pf9^FNM$Ech%+>7i6IXLS$Bw zY#U@SB^SIcIB}{VB$@%rzGjGV#(HKLccvW`cK|EI*P_nhu)yxC`b9 zFaq0UVG3djSCqu7$KH`*%A)qj8I1c<)Zb;k%5gUGM47X(f>}!Hoq|I;rwr^DAz|kU zEMqtbMs%WRL@xmr*?44XE)$=d(3A1j_oYnEL#jjA#d9G+=$Dfz`fFX^QN%;1>LQHjB5TnvSp>d?dM*j zDps*{OHADBNEb__x^9Af zGlbowdkNn~x!@&GQsAGLSkE+jOn{k0OpA6BvwYvgrQ_fF9swCv;=n0s@t10=O`Dc} z|C9s~o*rzRp8`Qo`5K_hB*w#`I)>J7xRP~9KQM)=O{g4V8XtHiV))Te87Lo3Q2oSn zjb#1gccy|+e2ReRlxon)6Y;gNe#X<;0viw*Gv>Y`1UJQcBPtV!}iC+d?S@If&^|FIqX@J-I{l6HypP>FbyVjQ zl&(DKI#P#!Fl<#)@m^`*V5P;KK_MMQWk#T->^ON@J;PpQ3M4tyanMnso?&ve<;f_xn+B}jO~=TGVue6%lYMrXobVD8(a}0w_J2{?N1OJC z%HD@>VC7+?S-Mi$3&!p&dNE*6vRPo@DG6n)YUtCI2!VSRQahVN-O!iI=G0-cEO_q* z-*E-U98{ZOuiVp<&>T9u|I*oFo(69XC{uW?tIY_Ty{1{gK?BS1F0EY)5hEjH^e6Q6 zpKSK%ve`aiJao1wBV6@{ZS0tFA4!RQx#_FcZmWv#=Q)kGrJEDgq=d(A2+!#`*zU7= zU%MIjrqf@o_KHfD(;K4XI?eFSci8mj6l2l4P2)w6QDct%Q?o1l>BmCzr~-oQr=OOW zS9G?N;M8SDTYjg-1HsZIihtkkbj$?3EhyyqL_@Z-qNP-7BR%k3#v+N5htimH~aaI|xPey|qV2 zmH#0k^F@GSQwNg<^E(1Kfbfck8W=Q+ZShUQ@t0m9r{dy0ong;>`i!3%z&8}oon}22 z4&(vTNQ`fxq8;hK?y?gTKN6D*IxKLxAy7BAE%b4S1I%!FD^)d9v<}+7T+J67D1~z4 zs#Li>CJlt#ZagN}h(9?;{nO;ozE5@tFsl~MZ0bopGX)m3b=i%qAK9L1rA;5!m(CGV z1&PB#g@a_H#G;8p$DwSETEA!yu^N_g8R!**f>H;HCtQAH`zzyzN!Ff!wdpM!r=pM* zF^K5SUUfY1fdDEYLM``Z6U{WH0m6Q*`!f|vohC`l^IE=rwdXy%UrMvsL@PIMt8zk0 zVoI%TxEccX%UurWZMEU^t$qoBnF}w|UD6*S7vV~dLSKMK1!UE!d_Ffuit$Kfn!vE5 z1cqLd%;f2P9LgmXqllTB%-9V6t|3%g)F;l769E(M6r|=AHj5pDpI={ z$j^o@&}1Zn2P)zdNg;{ovjEFuH&zH_ymWPs++~;~)FL}l{-~$=;z_l+p&rp@|E~lN z9uDNXmS`)BI1DuUf7fw17Ummhb#}1RPR>RyxO#+|V*T^9b@--iSe<$t(}E!*b)mQ~ zG^rBEXkYfUO~u9g@NJ#zoMHTj$>lK9Ie(IkWkwp{QEmGXoK^*d3cRkyK2=2Fv`dbR zyu-wP#Uh2UNjL`i41*{YIC*|m48S6~W|b*&Ks{|92!=~O&OH-YV%F23_6aYAis33(A9YhZ`z#K|w)mP|)9^EVT~`B{8u-$vK6`lm$0U= zGGkex#xurWahJ)Kl$gbTS$lUF;iXOwME3{#-)nn{=Z+Bk!Q@@Zp!I7dV_5>x``@+> zCLI1|xiMCxXniJIO05UWjj8fY!^IgNpzsLFB(zbjOB@A7J6%POy8`pTwxEWl=#)4P z#(!_3<_8oEaCtDC=o`Aa$z@jgBdwd%KhJP1>Z~Hvo-zzVSqEntN+}yVn@T|Oa(1L7rQ}on}P9{ z@sd92fa#FH0(pR3&J=9_h}30eJ;NeI4y%vcoD&0p#Qozo0=yfN>&ILzty??Drz6)-Pz1Y7&}I>Wb()+P0y11_WS5 zx9I|g7przyK$Y4`O&;C|TJ5+=cIIJZS_me|Y|xaobcGM177$r18EJIZgGIwLPrLfYdaTv5At(clnY5ii2@Z2ZkNn*cZKlEw+8!5*R z4|;XrL%*DP*XkgT7~RH#c@PQQUBU8)6jYFfu$5Z2>#{oxc-8w=t5yoxKtq7P;ZWb_ z$%E|>!rYck`?f+8>&1Ff?L)CNh{JW-7um~<#fi2htzfT6b6H(??nFeMr`9~u7O&ZD z+B4MoNP#2IdGGTSHPdd}exka0UnRL1xc8;q#%qdfjzB2>u51*TPJBNIgl!mX47kb>&DNLIQAkCe5=y-E4Zo`@n`rs$n4$%NzK?d^v`3J{W<5ZgHA zprykTRm@5LJPi-0Dn~z9k3hK}deYk)C2fmAtf`A-#|GuQpFEW?4bT9a1VWwtEA6Ch zlXdZ+D53A#kY!GIW`qDgmItXl8U_24+wQ%p+V1o-j>1Ek0{zVZ$1g=4QkAq&q?qpF zkvDLUca*BnO9IxX)h{d{z#(n7Q;>wKwh``q9V_1~MO)F5bv*~60N4&8&e5c?OVQAL zV<_dmFl^JXce8Yh+E_3EBBHrF-~`<>u94L^R@atjr`ZqqZ@p6G`EYTQw5JC&JFGp6 zybIAL)LGDM(qRL=H)#-rTsJumWH9u95Re;{Dn(F_%=xfr#ELUn+(=jm>CL9CGS5^m z@qY7(kgKTZNL|d^vpXtSHwDqbhL5c)n+MMt9J>bt+GEm45wfX|j1THG{{V0drdkEW ztS(+`d!k6eWvNr8bSAz>`^)9*EcQU!eL6m&k*9ABAMiQaD_2b!D9^|}PxheGlAQrz z#3jh=W|RmMJwSCLd~gi(XhI76m{2^IPg0V4yYC;Yx*bvk|AHsBCDi9vYRce9g*767 z+Xis0yuAOjV~di5l+)|9u`#!+d?V|(c)ZxqCd%$~RMe^z{RS&okp`x#LaB!l(^+jB zGa@^h5o@RzlK7UQY0J=m9CQyvW&~Lkv=KCjBB=IN6Uj8(!)nxFTbXIsw_{ODPU|QWl-HVjONMT{66HOw2roJP{mA@w<=wF%B>XwIH6}TGC{{1UG zfY}Jvp++EPXtq;PP|?PqS2_>Ps%(smZk#@TBdWQQcmH9;@_0PNaXJgFcM08p#ONQmNKBh~hav3}Kd z`9&%WYLTo1{@3IW;kIri85!JIKhF;v5<=Bw6UYE;ye_2k@G?Lpe;XIK){K06qOK(t zS((LGPEoZU5M=JdA|;p~pz{d1nNVU*_&ddRceYx;Sf3Y_QbiS4u_*Z&3M{ z7Tb?wlD|s`dFRu1RQhHL#?(TulYb29C{ zdq-M7fXv>MRL!3I8rVNsn{c^8>=8DhVQ9uHz}6!OeLtn{fYwHzF)qZv6?;Yj2Evw_ zcO?BZW$1AgQvDc-y|$HQ^_(7v9l^z+ua;4JQ0^L*h8564cQd~-I|jK&!!^9UE+aRq z#mJg6xLOkqHKQ|?lAHkfffNf5L*F@-6wBI5fFmhhiojsFrvlOaLSr=43(6q%7}|5w zti0K?2pHX#4BO?nthO?M=cZ5l_kKMt^*Ui+5R;lyFL+~4pObq$k884xsSDcjfSbv{Dyc1A(MS}JZ@xClbf<^kJJ zN@eer8H?AYv9b2z_xtr`dB#edyM!vrdvldD*-EO6byro93pin+h=YX9p#@n2e09pV z6`$2A9XH?uR?K4Zgdf080S4N6haq zEp`P2Ayldk5v)tpwCI=X^ep>*a>r|L0y_(c#M72u!0@3e0^(aZ4Fx3+TfA&jF8WFP zu;=@nyF69>&f!er?E1?Y@|1}0!-09V2@F0y#LoH;o;dR6=7QytQ&Q1el_21Tw_-Uk z$JaZrkAtA1r_1kN#bx&qpjvoyJ&F{sARsEiVJTi=t*Qm4zQ@v&Jj&6Em@9xXH*=*! zDCfFc+6MnX-!@M6pZ88pjk4JHxs+e!@oGGE3$42ChM$Zj$?y~OJuCYGOoOM1mXDnE zsMmqyUePqxnkxQQmvEV65-<`x92B#hi(7amZz|W_;#QU^3y}j3O^#HjVB^?z!@@K z7Sl30SSe!xXKh2#524IF0c5SMsa_C3Dq1dpHG~;x1jkoG)xje=_}d_OBg;VYXT=^w zu4tY0D#PS@nOyk&9BQ4$iZZkcSVD}vaa>elsY<9x5>&m6PVm^($={?@hw^B7tg1YH z0r4JbB41^m_SSe#DW(iAWfO{)wV?1Sj|+gO&fL^cyuaKK)N!r52gbP$_k`yuzuT_& z{CwxjW#0o_6_ea$c42wImg%CDI?(j$=ZVVCkv{DI+bLS*GQEgALla6V z^v8`B8in*tWMKVQid+q;E(5@Nzcpd($VW-`UE!l88H9|MyIpyv13rQ6DdGYqT<}iU z<}TW(eo+x|u1?_*vYOjy@ZyOLM^gUi4)fTaD-Bd&RAs_-YBjR$PMmjLA?vN66Jq2? zwCJ|ghm)^)K3%h-wtNwvzo`pM-Lua+{XUhrQOtV>g}?Jqo&?7iF)>3;r!5EyoI9~o zntow>5dE-u?uSPtTl2E-kfe}j_QyyHUoE zcJ|f*JW+IDI{;cD7*q<=(|)!zTStiDhN&Vx^`Q~(_JDa6=|eaodguWtdK6cXyU40Z z2Y{q_rJ320>(|qn1(*LrYF$4AOv!yT{xHi8F6lbY&mpV=ndXLS89j^K+F>1_( z(hG2WEds}$*=$TkWlwEjIHs(c$R}g7f*kT`nPbPaS4S(^3o#DyP(C*M`l>Y6zs}SC zKThic4%MN*mH%;e-1a z51_=RbiGCTxHhw5XjEgcFhKkJ=hA_lGE&W&f2ZcDH5Df#ubc2%i zh(*}jJf-57Laeb0g{Y%iUj`9biuG}7XoehOS%&Y0NPn+znFjWUP~>Ub=tvyS%Lh+f zD&KG00a3RubY3%19W#{6+fBe;8rMnQ(>4N5>Jj}Zs3TC5Ur)6?sy;ipRgO)^vN~{m zM`6Q#r9a#2Lp821&IHyen`LQ%JrWQRUe9|LSs8=pvcZvkaD)7mm#k}B#l>n|73p9r z%7PYT90y}MJB>q$C7NiXyByb2Wx(YVaL?9gaV4T+w0fgq-6Pn0g-8p)b_J7qb^Y)0 z{zdR1tq~M_75Q`1>DgPL7$h8zj)&B=@hN>xE~S+Z%~qZ#aHpcp!rF{ciYWuJksm|A zeFc-g^Wo=IvV@i_0P(fO%VYP0D@81~n6_*Qk;fy40%O`PJJCJ#TqwUHp!cSAUslY0 zx#;WDkX_vr&@^_4P%QbbXug#Nbb#+2eJZG1ItL!$7X=;0qXU&3ZA6rcRXd1RG_#G< zNf^0$p3W$%j~N;;C=xr?8<47E?`zGC;OuIup2t4+dz71c-e9fvlR11g+fpcy${|73 zLYZI5bowaTd5~s@$n$R>WSd=frkzK!^UF7pZAyvgAI2Qs=|NV_~LW% ze98C7(%?2P-(rU}I$PhY+xIyTVLf3Sq%aLagl6F{(=vM>@9i$l(q zfH@%_g)1uptj^;edK6hCWrW*2@(_vrGW>&LE3HUjXj_0oA_Npr{L366*UHJV9Y{e5 zxGScj%Bf31502RZMZzrAof15al}Mi0yFtwn5+xww^J=~2@7SqHY>`s6bxJ9gQaiVm zS3}M_RN^gBjCu>@e@42(1v>JI*(Brt@i%&>HWec}fs<^5h8;h_%8F$11S^x|`&aMu zNAx>+Zp|2q|Bl{C30Xs5I@ItIBdjB;O}JuI_*e7W+h5V|{1N>wi%W=B{!8=QzTt{- z(+OABjPlBe^=BZ#RT!|rx}D@iCNm;TlD`p65;Fe}VW3o`0RI30ABzYC000000RIL6 zLPG)ou2ikPOOoWc5^Oogt{@m-1K0qC18#u(mv-1W3iqg+?{yD4t1{BVKXeiw`>3iJ zujhK7x82uuzxQ?D?|XlKzn<%PJ`bMf^W^o^E1%cj&yW4e=c)ak&!7FHecpHPx4-*c zcfI#|>c{^1Io#*npW|Nd{`uw)kJ@|fkMH01XRhn>zRxM`FWBF6?N|3Jby`oo_4Cg6 z-RJZZ$$fe)99)&zo0$cK_VpJ2*_|oId}L{bHN- z^4wpwf7W?%&igF)8GeTHt-o)L_#XVvaD0Bd8#A#l_}WubqxAW^M`Hh56Yw&M3~bHV z{`7OTJzD!yZ~eOmw1)WefzNxdd%v=0Y=3UAfjuep>i&GI5A30TXWxU`KmXUip9i0- ztyB2S%6@yz+&)Ps=WaD?`yA?O_I2GCZ}@y~{kuO_XTDG4x%N7`E>_sXSa671WcBWA zzw4@HQj7JzYYp7b<0agmr&^8G%c88qux{(q~8ul=-IQPl!U+NOZXJgD-LbWmW^8aju&#D@G zKfGMsKGe1#4$z+WI>76L>uGiNFR$@Bi;9KDx_&sTx~LlT+9^+6^HnxvzgAyZQ(UKC zD{EiZ<y@67I5L@9`8^0=C%R7qy@y&FBh|iyqv)v%TW*NXWMRL`=#<}+Yha6 zd}qzZDnBwNkIOF4daicWVpmOU^_aCF5uP@(MSZj0tKYo6GzWQ_3pXIssNzDC|PweyQ z<;QWui$Tb$-448Vz#g#PGgNCPlqtt>;}|f>w|?RM`i0M<_O;2F+84|FwHR>^*oM7y zU$*vkbb7Zko)-ZMR!OsoS1jL9=IqBevl|Wp%F>l(y;-39T6h<}q2YS8cl!z- zY~(r73apr+H+v6XeYN{*IN3ftU(2QfsXfX&UUH$-^4YWVnXy*8zh+|Frfn8R&G6zE zY)9Flnvk+dlZpJSutn6=Yd!8DY7k5H$uEAQOws;runzVBIY7q0YHzFn3}Zdh%Zk+# zwJo+Wn-vZ2*A3q|fyUF5W7pFax{b20`{yWwT8~EkGwacQOWTj*xcZLsdWDK*Q1?b1 zJzK8!Yn?q`P`heyovh_qFIUvbM#v5>V_ciJKEE&N6S%U^G4ee>%e3zaV!PLeYNVK| zx}JT_b>zB;RpVXXRfFBRlJdW^Oc7RxKzMtM{dA3I&B7SIQdYm*Q)Yu__OW}-;GSpJ zLd{;ivmVrea9^{GSAFGRXqcBhM{Q}^h`DPdmzy2ifUDczVBlTDTgzlGlDU`#zPe_+ zPQPPzcrt^Hr(*~j0q*Q17K5>6fXaZC^{%1BwCXAA+#26=V&$cot8G)}eUH>yWqms% zU#oDRX2U1fHLxu_>$-f7xX+<8Ia6!CXSVMZwqLK|s^MJa)@!XV4Ci7*_k+&0ELPl} zsyd%K#{NL>tmfK)y{-{&TYvxl*ZAl9^WXcQ$NoN#Z6@e{8fgK}{9i%)e@!CU-&3}^ zX`HW$uZ;IFyb0+Oa8z_f=x*TNVw|zebqW6p-2a@23CfOo^%BqV67L`5{FKSx-lRf= zZ{U6r(2((9=l*ZluC3mw*6n|v)4spIeE#ljRZ~}stfp@-&oYN)eU_$pztl!Q zYo<&^&30`~R$(^a#H@B#d&THY6QGH}$W9k!?cUn#!+nkwWJ%7?uBxwFljI5iM8sTk zRC!j#N86WP$vp7Eja0b8wzr~Pyb~U!qM^kvwaYrYV~3@mL$pF7i2L&3d44mXo!?c6 zSU)Q!e9M#W73K;8qo{zCSd*aCl%|pc^PB5UrrC&W6Eqr7JQXZqLU0|y5r(F-9BV7T zQu`Mt)|rjHY1zi(M0ePz&&#^#(QsjF#pIrFf0cDz%<9rT^^+^?Q)-+9Wp+s?Xq8v^}HVn5?5LA*We3Y=6MTxKEEv1{kMo5$83DD=>-`ANKN9 zge?nyj+w3H>G#y13L;rSbt(JYKi|B~;q+jb-+hW0Nqi~}qxMG4T#WG8z>;HF8-S>M zRWLyu#1_I}vlVsGYok)^m6=17!^QHGZ;`OoO!gljX5hA^8X zLLXf7-1Fs?fsYlB>DRjg@tk_Y0?zg~yOM_P-8m-E7>?%t#=Tn41(i?RW{6!|>xM;i zygy+GLpL&Tow3tU3X>Mn3JjSMDKh1gptgzM> zq3zhG&9%j0=sYT!|GJSp`}}#fou}`Ay_rJ*IsH6)@!nPt15X#ekZ<^X?jMKU;pvV5 znGYtI;mH=R4X~If<8#9#VzY|$yIANlES}5I32&i;V2<6B^%S{eO@?SLj*bfh)dPX9 z^gD>b$4q{X){;mZ%$6{h&}6!4dgUW}BrxE8eyvs<`*dg^PinG&R#*dl2JtX}+|dwm z<|Iib{9DsldAWD{4DM?rIw}xtZb%1XXgz`s|Dq^~TD3P7=`UkqMw(|wzN2hANkyMA z?45l!_cssSa`$sXBgD7)4^uLi2m!}w^LU|=45w>VGCZ}F@E3;o?$73&*Rj@c50mZ~ z=WD}~W*MyRx3?sCU<8w3#qiq9(ANktF!E)|KWn=X56}ui8i$H~8!+C~Wt9Wqznwn| zd?u<33@SEvWkZVfJV4Kd^gNAU9zvCRMA%ZOq8RJrf&KdgBn;xZe`j$_bL`J~`8972 z{2uIX;hrg^zm^Zdy-A;2Cse=iEd_PH{&5c*=Jg>Ftns zqi!6qKG-o^i{OFawniHZW>{8n{#bFQ)4`b9L8C(;j8WI@MQ1C{Z!)=pGzcCHw+V>w z#{i0})n&7ll1&5n>XyeE-xKhk=H>Ktc78daVRBmNK^?HZxd5nF2J42e!aac73G$L? z5kv=HeoaU>le2^Q9dCoV-|k{ivnw%xT%dr?nCpNGd#bXQf^~G)8_CoPYQ=SXky@iB zU`Eur5`H>j8uNtVVF{-|d*Ss>cRk> zkHs4AKW3Y7ozWxatEJO3a;s%KiYvyQ9jMO7frAr8*1MZmirq=j|T9nPjXZFo>!-HF|WDwp_CZM!-yZ)th2HjM3={Y9kCLpQ$p z!Z2|Cyiox74!xh>3zfKUKpN9o0ET*B%ZrD-@r8Q63<5S~o-fD&H@x%nO&sU@`tzRW zUcU5x&)YY5BfWfoUp&9(IdbmzJbv?f`#I|UbH+@J;P4Iu`G5y5l<3{?4h-`)E_cy) zWcYa8w|H{79^(Z$%Lin=EDtWcqTJ^`+$oq(Slm}9UrzjE@>+3FSDC;Ij{1_Zm5PPx z$H~VM7WKK2xMIMrqok-W3C;qI34@8k;72PUS^-RP8I7Bb+(au79CbJtv>QzBE&f^3 z6*j-d<$5&OJV4iR9m5@Qfh5R2ct2Ji9fu4_yPfy0OZJ<#CFY{;<)nqEo@a0J>gf1I1!}CZkxo3X%qx zW+89zrzI7Dfkl^-j1Iz2>3J-DF7jbx_<0{+M>M(HZ zH?k%yd5zHpj?3uXkMKO=rDxOT0Bf7x7R?$#s4BEIV*qD{rm1)CnQV!5U_N9(rbMRk zE4X2gB2D)8E^!$|DLSZ9Bvp9%K1sp=2-WnPWl zJJtbojvXJ8fnFX+s`;|XhT07bOpxm8#ZK-30)kBR<5DNUnO@y{bL5=7+2yxhsu2x$-u zBD5-BhGmP&LDZ87WItWJ9ek*g$e;i2UxM%cec|V~f4xI?@PFU%?}L09 z#PeVKKYon=y!={RUS9&OUPzqFsn(Jz-uRZ+1Ou%x-V?X7eMCd1QnOU1^%X9=A0>1~ zzebl&9_+7Z#H$j@58|wgsQdkF#B;6X?#gIiB4-3rD?Zz7hM~2M>7XRe9FgehlX9aX>*j3Y+3{N%6-)zo8n)r=bPcF z(ET%DsDQ60s=-%%Il}epmBuM6ivAHRS=vWMRx=2XTpW>IMew75CAGtNW|UGA zFQj7zK!<^zs5+Jm!3ZLEu(M)~fTepPsV;M-!0HR)Ekv`B$9?%%lGNTO{#eD;pJIY@o{!|!EihL& zRO38@N}YetU-YiE(x-X!3c}IgiNie?`sSKrMNiYUTIxuZ37S3++JaF^E(b@lq6wKu zhgY_yad|x`F^Zd8g+)M8D-JxFf(TUTDJ=TD(7@6$H+({&-VBS2VNf&h{W%J*g=7LA z24)E0LvFETWaki~AF^k&nbVXZFvf@31s+nW2cuag3U=8zO#E9;)|2mnmWS9s(dd** zCY=~9JOh^O*qe|?xPCx0#YW#uv#jUp8J(ffJS3ShHn__AW~O-mMzYWMC6ti2Q{xWf z2K;0>5exij2@lOV?m$tB^n!S^Y-@Mo_uooTE+MU3M8ISe1t-}p>P^ACVpWQ;{v@Js z8sLr{1M9Vc_Qi;LvfEuE9g{ zW@*>sjD|E}WjAmV2q$_}+jS{sg=3v{H$+s_A#74pf)q`OQ%K~JG!!6WF#pV4t*T~v zDZJzQUFe}j0Kj-Uii)01JyXF~;SfHKORYoA^O-vB{MwJuxrr(KfCgg7^Qc=)plik* zGOSEn;ZDQ9xEt6|;gXIhX^LIfMruYgD=WKfkHr~7I+a%;{ZKVQL69a~L|24(_hkY@ zQX?6{z9zj7q{4IEBm0eL^b6rnD-B+x!oVLjB4Wji1 z+S{j{YQx*QM3Si6FFQoWo1lOU=cPK8eCe^W?~0cehO-3aG451dL2SNjP+rS&2tlnq z1EvLiy!cYKBZU?f=xhwoh~f%TiIt&*QX1>MzfQ2~mhk2c>tJYS`RUP{!1IZ;5oOMU z8O_oe=qQG(RBf6fMMO?M0uciPT_sX5%QS=cN%Pq+8Ti}6)rk3Y3 z7we?3017E<4>bhk`sIkn4Q{v*wj6s$fs`ADu!04#2-` zRi)Sg0)B+$srm_SU*RJ(mw3{3^xW?sJvYn9Jf1yuQ+RkMle&(u{0=^BUFu~R3I3q4 zy!}I2ekF{w{D>$niTqbmUZt&6RrR;_s z8hDFUqDM$79ZSrYQ^0aqc@}T-qGf`qKBcd(>p-;H420Nea)?BEY7$)B?>H%=O=JzY`F`yBU zU6TT)Rk&yQrt(DHxUHL0lQ|lXcZcC<{mR9Tctc0huR*IcRn{1ls^cceXvRxtV6Yw* zuMk}+P?@YHC0ly|w4NEv?66Yw@i<+KR`g>=X%#ZBGxmm3i`5++*?{&)=scx%_e``* zl0mfV%aIchRqU~nj+memheg2_{f+_MOqlx`@*cGY&|H*eE8T z>TQU}P#i7sHLX>vk$DW#2yz;29SR}==><#)MR@St7nDwn4|2X;D#-~q^a~ZCfVP2A zfUAj_ys8#TUF)b=12F|z?CkLUA*`M9{}-IZT4&vi74J7N0wRz1D;z1bKwhZTD;F#` z(D*IJ;wMucOC-xtjbx=X@s=&n_-(-Z3UUjUdLC#ZfG_dI zRkrPkT*TYg4N$y=LjaJ71T3x?Sp?XHMy(t=tUhnV{y|YV8-ifzgc=D!t){G~xE2K) ziU)%Hm)f9KQdt3185O?(*QR=^P%H-o2~U33QAmNI)M}n1Yxum{b4K9Y(o+V{modf_ zRCm|WnLO~jI2UOMn}GDUESEKI&tnx>wHUeXlt)`H|0WX#ZwK6##$h>vB(^sqCsD;a z+X$H9j5ZS!fOTUFa@tQ(vR4z zM|U)u+{eNxVNH5;^GI*;B%g=rf#UdXP2A^Ssc>6CtN<0}4>B)9tJw8?B^59%N1%A< zcR8B^$l|Ocj#VN%n$XS|vDqQ|E#yy(RW>`3j9P=1A`*r`Z&@O4D|Pw-*gFz|Xg7Cu zvtDz~N;ofFV)9P50?gaZ?y%YEgsWWx#Nqr>OYpv zz9d!vzFM}j+c9mdFlp?h0GCaUu49suk!~9n7V*cn-N>-6XhQzyOvp*v^#riC69>jk z_*>gn66>PZYv^u<4(%gtXjE9&&J}TZub;C~2J_sp5eIO%;h^e};O39o#0OH%7m*YW zq7a<>3{rYv8M0l1!Jbrtm@A=ofh_At|3Gm@0u*VV%1vo~k(MuyjeBlpLGwb+b%(iC z_>_(^mU6&+70vdjL49Ez6gfrvQi{4^^q9UM5#KkijMGNO-KEhh1dk4lm|7sP5~8up ztCk8W!k2^6j**bxo-YI0TcV!k7DVo?&6;X?sQiq;rgw48#Wt>b$)0Lko>2xN1Tw!} zJ9?2DS?hb?8!RnZF@zHn@n+oLv#{6?P(XE%b{)Y<9oL`%ca91G8C%dQ1OWgyEgQeu zygc|M0Nk#IQzBYL=*aRJmPoO@1Z@h(94X{gh3#1N9t3ephsMu>{(41*2D8N!zaX{s}p`NEm5jo>~ z^kAJB*VKkUo->X?DD@0|hZPPOpk+T%)eJjHLfy@BE2NvW04Y2SdoU&QseI{?aCeCI zKs*!`=S9DO|C}8*~1YW>cZIb!KO&oR_o?xr| zk7z*QJnc%z#{qFkZ`#T9Lsm#UC=eng!m&LX5i$YP zNp1oxG7&>hjI`!x5(a@{E&g!#4H02B7x-m+A%&d~8hVVoMJ ziw#>V;5bQ!W+3sn9px<#6AYG2WVLBoH$soY-Vw4r2H#_!R6uQXZJ*TZ|VsrRPv;@B1kx&BoaD8 z1xqVy6Nr!h93n z0#$T%(G~S3QBn=Fq%g~BG+Fq9G*Us!Om_)c>@l@3D@ML7ZL6KLs)UImI&ohJ?kjSM z>+zNAPAjpZkRN+!U-rC}PM{a^m1NH!Gnkq9zj%v^^bH(9C8Ub1V9-*h)?d6n6g2Uvjg`8egw5w{7rjs9tlSzMOLxzie-RhA9(V>% z?EWCFN~yz8Wt-iChGBnr2+X+c1m4Gw+M;_H^3iV4(-lIaF;U&oMRlfXn652zxsqOy z-8Ds|%j|C+YD`9gow&$EmIWTQU8+QiLy0@7;s6WoE9K6rsztO^oF)bC`4+M}CvDn# z2uz4TYXs@351Ss7<2mSpmmvYhC4S<{4JY3s0R>cNizumvmWtvNTm=OjTwc{b-y$2h zFft7^rr9ueS{R@_pl+lboxT0b<32bsH>V|Fum1T`PQW+c8>05)5N6!CXbR&(Q5nm4 zu2I_7H(wUT947Mq#y(-YA3u4A)PDTtN-iKH89LAMk{o;GExy`yWEl5LKmCj1Er&^P zU-_T9Ae*-5t|=rv?QjEEi23Lq$rqWwhofKeqgszf>Zuw4Sk4&c78_?lWEE&F%jPr{ z2+S4*FV>`h^=ZQ>N<(}?N>5TR<3?~OaHO~GHeMq0ib4_ioX%C!s1jEyJy>Bcb#z41 zB>f0l6_2oM%-^TMt>Gwua5}Bhm!V;m<*!{#FDEPYeaW*vbhZzbSZqI9 zmQyktY?*~~eRVK3vWGO=6WlIKLvQ6REZulvN=j-suw|a-)VUSPYz@cfUx~kgr6yn! z2ph7CVbUtBvtjw*!pVjPSi1eZOd*GL7{p=~%70k{d z*${FPH+RJekUP0zG=S;*Ay4JJ4jC{oqea=9y^BYIY1Y`xFCs~MT_Yz0nI#Y-b_=1^ ztXSP2eD3riAq1sdn9?J-(U)EJCVoMwPmR+np+mPny`VRL2!s<=KG#OA$25CJ2NRb(>HpA(%%P#MA+Ama2oD z?9Q5p&|EX%frShOWr9YsODo4fUQ@sU2VMa%hM4D)4Uri0Oxq93jpf4pnUt7{%^}-` zjS^9wE%*d>9L9-M-;`ShE$1NaT$wg5c9@C@tmIrsqADftU-%x<-X`r7=%8Q`p`1ro zz&0^IpK(`%w44Ttscl$B39;%U_r^$x(XoJ)m$Wz}W^#H5CGtpSIs)<~vb=?*|{ilRidvBQD49C1o#hQ`Dit7Dy4mKv#<2E0Q%&g^5cZ;CquJa~@T-2m+@N74_K39`zAPXTJbh{b=rrE;0*_ZwRsk z#LrV;92}iPb?IlEo!r7w!?B-hQOztV zV}&nnFsZ4ElUOrp7dC2R8~_bEl3;8t7vi*xAsm4)Wx)!PAk^0&!JFZob4rt<-4QC6 z`RC@86Am+B7e)XqbEeE75yJ9CQ4hr^kmVyp4(1ThPl7|Tm$ZMdSDH0~f_ARK!q(VV zMa8f=0N+E2);CAcabh$udKD=CYg7e&Ze~zWheaAaq)Dz{xC48vwxm}0a2XbZ0)Dbw z7b7``!G^eT*Q}<_lR7%7P+)^MNqG|gWJskRe80g%)$}#r`Xm{>qoBJ_#5-ecWXsrm z1r+xx&cP$hBbZ^PF@3OXJ<0}eXwq#zJ60mv8C1xM(=Vbo&M*dCqspoOC>nkMsaR@h zuBrS$)Aoa`0~5L_1YJ+;jnM=_B8|Y!?s%K)(XuW;k#9;o{(5T6e?K=ke>F34NoIiH9*qfce)r}N_AeT_x47p42%K1ApycsUm;g&op&#H z_IPD1#T%?mdNe$E0LlEeFdvr{TnOW!=)nB z_CK-m`zKabsCvr9Z>w}ERZpaB(a^tc-TLM9E}M-K#6Imbd;w4Y-(dOuZ`7WoZl^{^ zl?HBLuuQ$K_ijzQmCI;Zglc!${E3#|M9WsD)W2$dx|?EPTleN^dFkZHhJ91Ed5%$YY}HiCE{FF zLZKvN&O3r7Xf~s+ubmoV_K8=g>QjB}PzOmVoCP<6;^{Xd2Zjk79%aBzWXw_y2e9&N1iioI3hXT?Jw_kEgV@4qcVNPW`v1()wU&YS=9 z(f4lue){j<`{(b^!7j4cf4uPf!N0#>=e;dYUjK)K{J!}-=X=}#?Hh03_^;Rhe;Tmw z319zva{oFvo^SuR6MO$&0N_xby3(-xy(w`zf8YCyN4_TKSH1*I>BsMIXG`0D5~Lyu z>?V&SI7`Av#hh$(^EON*V6}M>DkBF>nq9k0egA=ktE8f48EW!AFwiZ3aG&u0@SUL0 zyN(XTo_=uFP2hkgyJ3Yl7Z)5jqY851+|2_Lvv);iDA8i~I=#1-%y(f13VqD@Mil5H zwuo$N7`S;NG`!&+0yD@ek+tp;WDZ(+Ak`)xm&B$>USe@5ELclSL#_}!kC31F0`90g za}0zqE0~{I#0u~*wB2@+0a`6y@*4~)YwE{5Yc$7CNLSxj`C=)S))cNMl{*i+^eg$Q z@avJM5lFU)&dFv$J%nk@e()SVGM8GlNi>_hI>lLpwyQmH4o$4_Qj{5jh$sHVj0)vLG~Mu|@M7x$-;|fsyu*KTm}n%L!D0JQNep z)5$;thFm$~G6U8jq?IV6n|t*R)uRgjzU<3hy=!e31ipEJqTBoXHb{V2I$HlnEW1&N zWE%Q&rzcb9W%9O^dsuJ^dj!p4hq}OkR7gdGX|7%PL!}wMM z2o}H-h00B;Ocgisl*P|C9z#ct-M}PnOhD}7C4Kc;D5c)v3cqNE-K6)`d8Ewh5h1Xqipy0nt1Ou+qqkX%uQ+y8=^d5}l&NRJGZa;t+#T{NymIVrZnlTiCKp;zqBSxoqa|dzo(ps%9 zG+9k5><03rD~N@&r*N(PsB3OFCllmcqOYKc*7W$kH1+MMA=v@91#OYtJn@6ymNMV^ z-iF&FJ3+u~eedIgRQJBA?&Zz*7pXnKV*ywe^P$?r z`Z0(i_Gtpf__p-ZgUvChU*YqjA{pTqLK9Y4Mq>b(y+xp;C;%um_jSwtx9a^MzsRsErA;bn;8lNZHGs$=fhg*m`XJm6iMR{HYvI4a8NNGtsDGO6J zkTO(6YCmk;C3^nWA*Qk)vW!NOW-duOLe?=&B8L$0r2zdSsbv)3zSgxlc)x`VjEG>cJB$L^UbB z+HCGG22RBay4~koD()J`^oUfW_q@N|G_JJc5D8D$$tMkBDa^i=i&ht}1n_xu9TlHJ z7?j(7B1AM?Pnw$$#Rs@Km~@YNLZO&wb7v^&H>7c@M6Rq-v}aUX0Ci9uI<1Bu1@C~x zs^Fesnpp+WQAI62qDQG;w(MN1HG$+vE6yPSRn8aIQpc)|ss&by&{KVOR0^zY$^tc~ z%UfI#N4Drs@1LLiFwXq>`{%hMQ$0`KfBt^oo5S%pPqcfFNkrOT-RSqX&*K9$DT1JY znSycb$fC9utsNsaS4KM$lA~gqRkp1}Injd%35kYDHA>)*pwH z2%e`lF*O8eXp)o#?-(oC6#~{J$&M^<9UD38R-pPnYr2@@euAyCj4JqtlKr7>6)045pP+0l>mQ7l2q(kWruRP9-bskqANs z<+}Bi+|GD`AwTyU82A-<02R=6-R517VQ#Cq@V{NJBD%lLV4?e-KVcx{1w>zz9>jsF zS|I2_U(>&`Wm+1I)q-0ga;@1mq!`q?VwrnC+F9Y`QFa^9aaw*3!d`F>qmc>bDj<9nlJz?mqALAAiuXf)U)M>wQm)s%?jU4pFuSfR1GXOa!A} z;%_o^K?Go*SJd;iV4X793VJy|lA~%GIg-Ie=foPQuq1Hh#A>Tpm(6LgV2avg9ZG55 zx%oj+;E-oh;3pcd`=GEwq!B2{t|&Q+wl3)c3KM;J>V|(!PB4vXFc=W4Pvp;(KwS{+ zcXU<-?*Luwk5-x%)d!nfEFtkGvX;w2nifPQVW#KDXx|q6+)6TTP{d?^?H*?2M4m(| z3@x*x6m8flWRaX#h*x*pK2r7vQ-^f=CcNepg{=hSjhoxIhuf{NCqlD3d4CaIfw0H% zJS7T7AdBubrs7ab)?myNKkL)#Q%yxQk!o`3rF_Y#Cn}FIQ{Y%@3SKe^opFw27Y1RS zI>ji-;AJL}evoh8eG2BTD5pgDpi>;TQPB^5%H!@MkG$s^ESw@IksMM3d?Mc&)J0e5?;Z&Uep>v9teBLk4@mfopaKucU?i_bY zIRLt@YBT&i36)+?lRh7O6^zX#?(q4vvh-CYQb@2XDw zeN`zDe8ETBc*hKq;90>-OJ^9qpO8WmGG+0<@L5T=Nx1L{yf)w{7@D}=q z3TP1GnR<>c@eR&8)#OVxqTh~2Z6Q*KPAB>9P~wiYA{ZOSDuBfF>T1#97LcIF56&5w z%3va-IvMLu$^;w4;Og>W&ZEj(%gCu>&+0kDpUoNpnh_Fxy)kx4WIss$D^TxJt45jR zf$tBpkM&V8c>r}&x)&_+g<2HhPkk`b&S*9d!2kX)z~6ol{%BDF_W?HFHPO>l~IEYi0J%&r1o#yo*fo~CO>kT z7b`CX&U6*OP%f0sY|%4J%L^u`qo$Zta?u*AEKxtX)*kIKQn4{D9ssZqUME#V^0AN% zElX9Vcfu11QJiHLQC-8DPok7i)pDe*iem4tm>|45eU_qKxfu(c+AVnB3^Poj_0EI~ zl+Uw6F;IuTCV$~ZP$VxG7!)bP{zP}7NYUXCQt&XU{7X5-axIr3U?YsF7GM=Vy!4`ZAyfBe@ay@S$LBd? zj7oc?g=t|>KlD33y8paz{r=v70$)QuY`5|b+aH*KzTks5(vo_zUD3!;610C^whT^P zuxc_85a=6TXu)c_rBk&^MoM{(4d2LTM!?GENGjF;iSruT`byP|?^^ zM@GVpc^yhW@!(-Ed9i`r0y!DwiVdw4#we%7Tw^t;Ly*+u-hLQnz-a|+Sd?|{xpkt4 za&!t%nOJ}`bh%}osI;lP1tyO8<%;Pw{xV`AWILPtRJzeU1hnRTg;m-c7iSjmJZ2a0 zir3-z#Q}|ut52DC3p<=`xZggElhtEKE9YTqnO7t0{GJ4Q<*60kW+Ke%!5mbzr2Q=Z zQCCPy#0x7=0eby~uqqo5c9T5+9wr%o%5bCqwlbjyl@$+LJ8v?1Yv#AmMh=W9Wn? zq>F}-akp-E$DT8~3&uoq<&(_d^w<>RPP z`c+SP)JFJKVrKZz@+sM6Wj;Ka_ZewMS}prDn2-AJvGD zlD8Vv`^n|scyz=5>#~u?_T=roj;ifCBpu3`HzvH!T7F{a0SAY4GM(BEvIv z7wb^t`>3qoD;0p6irpn;+4%9eGNB>0$W!!XwYu4Tp@QagXMCS_=NKhRZMXK-AO_1_#3c>Ig7 z0*-y*tE%PLfjOQdxV$fm^PVp(1D=RYYVTp&5$Ar{_6j8cLa!gT{r*BSEuu@N;w!y; z{~$AT@lmX;}0G>}1H4 zKR{5gCN?m*5FICVUnlGZW1Zd77q(j2(`KX`sFg!vdEvQ=F6wDzp=hZBkSc5#s)#Ag za?i}5TmS$wR8!iG?EjmjMhKgw%5RU1*#mUj7>CI{abipOwrpCk(nvF7F;9UTpbmje z?ZDR4TftTX=3DhAw4t#CEGK}?MWrU1HCE~W{C}mYn_X3z?7>C14g1-Fkv#tZqqls9 zn@`0vSV{YlJiD~B`>rnzdDm^r2u;3#Xr;ivi0E}JMY)Sep8xEzD|@V6{)#gXBKqGw zRtW9?0HQ7RBG2s*I)Y@EP{G%atkBV~2&750jv(S?aM!6lFHrm3v+A-MrU>I3!TT%G zaT0srI)fyIHE)D*0(GSu5~@Q{uRdhYT2wwONuYINFsFr&HQgQ}`jq)->w)5lkvmu& zp+!I1M{9(TlvYM*@G^Q&Fe4{Dr$_3BkAXMUZXem1{ZbGcQM6fGoEV}a<0gh?ka$)- z$@ZJj@T*R~9L0hzc@k7Nk|i0a`pkX8%BZuR6vOXM3Q0ll01?7>_Cdd}LerF{M;o)f zBz!W`aKaA-qy3QR)ai4(c$h6hKYFE$I? zQY`O5SXVW&p6K(G-K0%OVpQ;oBcTbiTxajSUxo@Ayv8Yh?IS(FC9k5-t_?K2#f3W{ zRpyp%utSsNhmE~M&PL*OTZ+OQy;SX8lBm!7onmpq`mWa-uYwt<4M{P}66UHPD0G(K z%>qmtDx^n}$`q?k6x2u#^Dk{NB@~+MTrvY0k&(HHJn8_vrpD#r8UZujZdi9_VR+JMb+A!=g%gO5;G)J1;nhP}t%z;c zFJlp%L*bs0hn3Vz=YL|eY+k^H5w>d|oK8o02t#W4Hxtt+ z6i8M{8TY9#3&YDQ!W^5^$$$ERQw!74&=Bd7kAG3mL+>y-}oT=SsM%^bJOG`=9l9`INS(PN=Cts$Le$ zTkNgOQw^^=Pa;x~P-d$Xn}ZCf6w?(4H{Iz^yyd?=GLZXirI3vHCF8U_6DL zhX6shpTRot%Mc7_FC}ft_7YTAj9QY-C2+2}txwHdV%9;HMhx=))6Awt9qmQLR$j~g z7fy2Wa}U)s~A~IlB7p zDf1GEq4JGWo3QvWVdW6uw*49~OASq}Q2a&>?zFGb^tK)cr8&uGr1!PSHm8i7}Rcs6+>BDBJ*!&&vg)H;R%y~xh(D|w1O=NBeud& zNtjR^Dd1{6NzxL#tzQyf)fTTWf7K5Q1rXbj#b3>Bf{YUl1et#>-VwU(25=`Mze}WG z4)7yIdF;1PQ~R7c!&hZC@4ITMtVc0}MrsPIG>KH1Uf=|?O!Q<;w9QcWjppNhBUkkF z?^AKciI&u!E1@3uQTthV=Or#886+?vhzJnUXbkz}E%XUMgHniRZa{LUl+N=B;(Djj zMtzi$HdpY=SRD;%MyKj-yb$3O}6g)MvrUtLHiyNbN!muf+ zU`pF9p&k9ehMYmCyt^84nXs+H6io>n$%}d;esiTlW?o47E={?h(;b!WBfWK}2sjlz zC$(zcN8@Mei?pabcmMvp_5f7obow43&ApF|*(p2(XTU~|P6lmlZB2DGLwEv+ztI|B zVF1zT!F+lHw0;!UW!_8@s&eAtN^#lD|co!@sp)*dCV<&=tT4n;u+X zpJ#*p0{N7jx)GSfGM$pPZ~=#!`RwN&etAI=UGEiMjViUcflGY?qxy2w1qfb76t$|V z?*Lk!ahf~|Kotpsbrb?b35D7O?DUr9k}3~-xKFbMJfA(N%!wC?JXcSR0+Fo=(}L8j zU4>d`3i5bB2=YUrgV~dV7k1)J!ijN%hMUqrwkO$wH(d(#%Cod7xCWjMj5%pPPWT*m zwN8oWR8_r7JZ=K(2?P%gIwBr4gd{et7M-dP5YmB}*gzk#YM)nl=Gvo(PM+#$ zCExev7C$s>Nbn%~ab?SE{A;y01O=}?PAclLq~i49xg-|V5rWBF&5FOrvM+FzdjM8I zslP<*!Hq|zp7K?xrweP~X15U&UL)51jzI4Ae!uLml8qL=y)StZs-W(+5XWhQO))r8 z?{1R4KB>|CYSOtCY`~vA4Q~b{+Q}&SYUqnihz8>Z-Fu&0YbRA%GZJ_uniWUxwr5pT z;7+1egW845r*F$d4H7P_sLVHXFO+%^<5aBNM)e?=Fdub#_0@ED`ua`7i&s~8=*b@v zRmR}GX(ban^oK>Y#qa;HsE5O;iz!LSpGX-6r&j-Pr=Z@6iy%#@$o-z)(U}k<*9r~k zc*vU*BDW*PFcvXR4u|_+HM_bHN^q)uPNX-XR#DulT=?Gpl>|#B;nm$d++M~+;ZpUvF-6Js$Z|5*jJ-B_#c-AkeDA zKdVUp7Uw<^(YHEwE|wYaw>?7b7=pM@(%0J%l(N7pt|SA999DHLU;DhuAijEC=yG0x zZ7iWH6I-{GyDo`0cSl4xRwJe_(|0i;wAk1D{CT0CzMbK}pW?Pz9`dczu4l_)5u1L+ zMp*%`!UAz@qTCW%as0s(NX?@%T6QX5%iGwLCAvZysL`;1x+! zd!m?m#n?5!36iw7uaH9e74XfhmG|VutQqG@N{#Pf+^(G8L!|#kWy#3Ah8HMzQd)4m zaV?K^(?)E&cRZfXVFYEFf}OJ=cB0tvAAJSe#cv2!pLZGBtXkiJ2bU z>>D=x#Relu;`K{P_6xQKVKyYMA<{g@sbW>&0Zw;HSV?2pWPDQ{f?x}v^5nx Dnj|g7m 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 I000000M+8LNdN!< literal 0 HcmV?d00001 diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nogzindex.fasta.gz.fai b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nogzindex.fasta.gz.fai new file mode 100644 index 0000000000..04a438b940 --- /dev/null +++ b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nogzindex.fasta.gz.fai @@ -0,0 +1,2 @@ +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.gz b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta.gz new file mode 100644 index 0000000000000000000000000000000000000000..aa8ef591b0750b572d7255bfa43ba44504b9f1a7 GIT binary patch literal 335008 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¨>F(s)c;}L1L$R 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 Dnj|g7m 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 I000000M+8LNdN!< literal 0 HcmV?d00001 From 8d4121c5a14dc87a68f28647825b0bf70b09dfd4 Mon Sep 17 00:00:00 2001 From: Yossi Farjoun Date: Wed, 30 May 2018 11:48:55 -0400 Subject: [PATCH 35/83] Remove Files.exist from the .of(Path) method in SamInputResource (#1128) * According to @drozen: "This operation is expensive over certain NIO filesystems (eg., takes on the order of seconds over GCS), so forcing it at reader creation time could potentially add hours to the wall-clock time of a task that needed to access many bams over GCS." --- .../htsjdk/samtools/SamInputResource.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/htsjdk/samtools/SamInputResource.java b/src/main/java/htsjdk/samtools/SamInputResource.java index 5554f73175..017a649c78 100644 --- a/src/main/java/htsjdk/samtools/SamInputResource.java +++ b/src/main/java/htsjdk/samtools/SamInputResource.java @@ -38,6 +38,7 @@ import java.net.URL; import java.nio.channels.SeekableByteChannel; import java.nio.file.FileSystemNotFoundException; +import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.util.function.Function; @@ -93,17 +94,22 @@ public static SamInputResource of(final File file) { /** Creates a {@link SamInputResource} reading from the provided resource, with no index. */ public static SamInputResource of(final Path path) { - if (Files.isRegularFile(path) && Files.exists(path)) { - return new SamInputResource(new PathInputResource(path)); - } else { - // in the case of named pipes and other non-seekable paths there's a bug in the implementation of - // java's GZIPInputStream which inappropriately uses .available() and then gets confused with the result - // of 0. For reference see: - // https://bugs.java.com/view_bug.do?bug_id=7036144 - // https://github.com/samtools/htsjdk/pull/1077 - // https://github.com/samtools/htsjdk/issues/898 + // in the case of named pipes and other non-seekable paths there's a bug in the implementation of + // java's GZIPInputStream which inappropriately uses .available() and then gets confused with the result + // of 0. For reference see: + // https://bugs.java.com/view_bug.do?bug_id=7036144 + // https://github.com/samtools/htsjdk/pull/1077 + // https://github.com/samtools/htsjdk/issues/898 + + // This still doesn't support the case where someone is creating a named pipe in a non-default + // file system and then using it as input and passing a GZIPed into the other end of the pipe. + // To work around this bug, we fall back to using a FileInputResource rather than a PathInputResource + // when we encounter a non-regular file using the default NIO filesystem (file://) + if (path.getFileSystem() == FileSystems.getDefault() && !Files.isRegularFile(path)) { return of(path.toFile()); + } else { + return new SamInputResource(new PathInputResource(path)); } } From d3d7a6e0f5a4d43e2aeef07dd2ff008b87f69bb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B3mez-S=C3=A1nchez?= Date: Wed, 30 May 2018 22:56:05 +0200 Subject: [PATCH 36/83] SAMFileWriterImpl extensibility improvements (#913) * make some SAMFileWriterImpl methods protected instead of package private to enable their use in subclasses * add new method writeHeader(SAMFileHeader) and deprecate writeHeader(String) --- .../java/htsjdk/samtools/CRAMFileWriter.java | 8 +++-- .../htsjdk/samtools/SAMFileWriterImpl.java | 32 ++++++++++++++----- .../java/htsjdk/samtools/SAMTextWriter.java | 5 +++ 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/main/java/htsjdk/samtools/CRAMFileWriter.java b/src/main/java/htsjdk/samtools/CRAMFileWriter.java index 2da917f60e..2f96293264 100644 --- a/src/main/java/htsjdk/samtools/CRAMFileWriter.java +++ b/src/main/java/htsjdk/samtools/CRAMFileWriter.java @@ -116,8 +116,12 @@ protected void writeAlignment(final SAMRecord alignment) { @Override protected void writeHeader(final String textHeader) { - cramContainerStream.writeHeader( - new SAMTextHeaderCodec().decode(BufferedLineReader.fromString(textHeader),fileName != null ? fileName : null)); + writeHeader(new SAMTextHeaderCodec().decode(BufferedLineReader.fromString(textHeader),fileName != null ? fileName : null)); + } + + @Override + protected void writeHeader(final SAMFileHeader header) { + cramContainerStream.writeHeader(header); } @Override diff --git a/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java b/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java index 31a8604dc8..c92d9746f0 100644 --- a/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java +++ b/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java @@ -28,6 +28,7 @@ import java.io.File; import java.io.StringWriter; +import java.util.function.Supplier; /** * Base class for implementing SAM writer with any underlying format. @@ -105,14 +106,14 @@ protected SAMFileHeader.SortOrder getSortOrder() { * before spilling to disk. Must be called before setHeader(). * @param maxRecordsInRam */ - void setMaxRecordsInRam(final int maxRecordsInRam) { + protected void setMaxRecordsInRam(final int maxRecordsInRam) { if (this.header != null) { throw new IllegalStateException("setMaxRecordsInRam must be called before setHeader()"); } this.maxRecordsInRam = maxRecordsInRam; } - int getMaxRecordsInRam() { + protected int getMaxRecordsInRam() { return maxRecordsInRam; } @@ -121,13 +122,13 @@ int getMaxRecordsInRam() { * for spilling to disk. Must be called before setHeader(). * @param tmpDir path to the temporary directory */ - void setTempDirectory(final File tmpDir) { + protected void setTempDirectory(final File tmpDir) { if (tmpDir!=null) { this.tmpDir = tmpDir; } } - File getTempDirectory() { + protected File getTempDirectory() { return tmpDir; } @@ -144,11 +145,8 @@ public void setHeader(final SAMFileHeader header) sortOrder = SAMFileHeader.SortOrder.unsorted; } header.setSortOrder(sortOrder); - final StringWriter headerTextBuffer = new StringWriter(); - new SAMTextHeaderCodec().encode(headerTextBuffer, header); - final String headerText = headerTextBuffer.toString(); - writeHeader(headerText); + writeHeader(header); if (presorted) { if (sortOrder.equals(SAMFileHeader.SortOrder.unsorted)) { @@ -243,9 +241,27 @@ public final void close() /** * Write the header to disk. Header object is available via getHeader(). * @param textHeader for convenience if the implementation needs it. + * @deprecated since 06/2018. {@link #writeHeader(SAMFileHeader)} is preferred for avoid String construction if not need it. */ + @Deprecated abstract protected void writeHeader(String textHeader); + /** + * Write the header to disk. Header object is available via getHeader(). + * + *

IMPORTANT: this method will be abstract once {@link #writeHeader(String)} is removed. + * + *

Note: default implementation uses {@link SAMTextHeaderCodec#encode} and calls + * {@link #writeHeader(String)}. + * + * @param header object to write. + */ + protected void writeHeader(final SAMFileHeader header) { + final StringWriter headerTextBuffer = new StringWriter(); + new SAMTextHeaderCodec().encode(headerTextBuffer, header); + writeHeader(headerTextBuffer.toString()); + } + /** * Do any required flushing here. */ diff --git a/src/main/java/htsjdk/samtools/SAMTextWriter.java b/src/main/java/htsjdk/samtools/SAMTextWriter.java index 70dd4a229a..8d9f9a91b2 100644 --- a/src/main/java/htsjdk/samtools/SAMTextWriter.java +++ b/src/main/java/htsjdk/samtools/SAMTextWriter.java @@ -198,6 +198,11 @@ public void writeHeader(final String textHeader) { } } + @Override + protected void writeHeader(final SAMFileHeader header) { + new SAMTextHeaderCodec().encode(out, header); + } + /** * Do any required flushing here. */ From c19f9f73af0bdee912b4480fef403cd48a989c7b Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Thu, 31 May 2018 11:32:46 -0400 Subject: [PATCH 37/83] removing new finals in AbstractIndexedFastaSequenceFile (#1135) * A number of methods that were previously non final when they were defined in IndexFastaSequenceFile were made final when they moved to AbstractIndexedFastaSequenceFile This was an overlooked API change that causes problems for existing subclasses of IndexedFastaSequenceFile * removing final from all newly final methods except for isIndexed() --- .../reference/AbstractIndexedFastaSequenceFile.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFile.java index fb0037509f..fa77314af6 100644 --- a/src/main/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFile.java +++ b/src/main/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFile.java @@ -121,7 +121,7 @@ public FastaSequenceIndex getIndex() { * @return next sequence if available, or null if not present. */ @Override - public final ReferenceSequence nextSequence() { + public ReferenceSequence nextSequence() { if( !indexIterator.hasNext() ) return null; return getSequence( indexIterator.next().getContig() ); @@ -131,7 +131,7 @@ public final ReferenceSequence nextSequence() { * Reset the iterator over the index. */ @Override - public final void reset() { + public void reset() { indexIterator = index.iterator(); } @@ -146,7 +146,7 @@ public final boolean isIndexed() { * @return The full sequence associated with this contig. */ @Override - public final ReferenceSequence getSequence( String contig ) { + public ReferenceSequence getSequence( String contig ) { return getSubsequenceAt( contig, 1, (int)index.getIndexEntry(contig).getSize() ); } @@ -158,7 +158,7 @@ public final ReferenceSequence getSequence( String contig ) { * @return The partial reference sequence associated with this range. */ @Override - public final ReferenceSequence getSubsequenceAt( String contig, long start, long stop ) { + 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)); From f007ed3fd9fa4ecefb24730ab28f360a78348365 Mon Sep 17 00:00:00 2001 From: Tom White Date: Tue, 5 Jun 2018 18:13:45 +0100 Subject: [PATCH 38/83] Add an optimised version of CramContainerIterator (#1129) * Add an optimised version of CramContainerIterator that only reads the header for each container. * addresses part of #1112 --- .../build/CramContainerHeaderIterator.java | 32 +++++++++++ .../cram/build/CramContainerIterator.java | 26 ++++++--- .../samtools/cram/io/InputStreamUtils.java | 25 ++++++++ .../CramContainerHeaderIteratorTest.java | 57 +++++++++++++++++++ .../cram/io/InputStreamUtilsTest.java | 32 +++++++++++ 5 files changed, 165 insertions(+), 7 deletions(-) create mode 100644 src/main/java/htsjdk/samtools/cram/build/CramContainerHeaderIterator.java create mode 100644 src/test/java/htsjdk/samtools/CramContainerHeaderIteratorTest.java create mode 100644 src/test/java/htsjdk/samtools/cram/io/InputStreamUtilsTest.java diff --git a/src/main/java/htsjdk/samtools/cram/build/CramContainerHeaderIterator.java b/src/main/java/htsjdk/samtools/cram/build/CramContainerHeaderIterator.java new file mode 100644 index 0000000000..4c3264596a --- /dev/null +++ b/src/main/java/htsjdk/samtools/cram/build/CramContainerHeaderIterator.java @@ -0,0 +1,32 @@ +package htsjdk.samtools.cram.build; + +import htsjdk.samtools.cram.common.Version; +import htsjdk.samtools.cram.io.CountingInputStream; +import htsjdk.samtools.cram.io.InputStreamUtils; +import htsjdk.samtools.cram.structure.Container; +import htsjdk.samtools.cram.structure.ContainerIO; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Iterate over CRAM containers from an input stream, and unlike {@link CramContainerIterator} only + * the header of each container is read, rather than the whole stream. As a result, the container block + * data is *not* populated, including the compression header block and slices. + * + * This class is useful when you are not interested in the contents of containers, for example when indexing container + * start positions. + */ +public class CramContainerHeaderIterator extends CramContainerIterator { + + public CramContainerHeaderIterator(final InputStream inputStream) throws IOException { + super(inputStream); + } + + protected Container containerFromStream(final Version cramVersion, final CountingInputStream countingStream) throws IOException { + final Container container = ContainerIO.readContainerHeader(cramVersion.major, countingStream); + InputStreamUtils.skipFully(countingStream, container.containerByteSize); + return container; + } + +} diff --git a/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java b/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java index a38e6b8dce..5fcf83f5a6 100644 --- a/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java +++ b/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java @@ -1,5 +1,6 @@ package htsjdk.samtools.cram.build; +import htsjdk.samtools.cram.common.Version; import htsjdk.samtools.cram.io.CountingInputStream; import htsjdk.samtools.cram.structure.Container; import htsjdk.samtools.cram.structure.ContainerIO; @@ -14,21 +15,21 @@ */ public class CramContainerIterator implements Iterator { private CramHeader cramHeader; - private InputStream inputStream; + private CountingInputStream countingInputStream; 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; + this.countingInputStream = new CountingInputStream(inputStream); + cramHeader = CramIO.readCramHeader(countingInputStream); + this.offset = countingInputStream.getCount(); } void readNextContainer() { try { - final CountingInputStream cis = new CountingInputStream(inputStream); - nextContainer = ContainerIO.readContainer(cramHeader.getVersion(), cis); - final long containerSizeInBytes = cis.getCount(); + nextContainer = containerFromStream(cramHeader.getVersion(), countingInputStream); + final long containerSizeInBytes = countingInputStream.getCount(); nextContainer.offset = offset; offset += containerSizeInBytes; @@ -42,6 +43,17 @@ void readNextContainer() { } } + /** + * Consume the entirety of the next container from the stream. + * @param cramVersion + * @param countingStream + * @return The next Container from the stream. + * @throws IOException + */ + protected Container containerFromStream(final Version cramVersion, final CountingInputStream countingStream) throws IOException { + return ContainerIO.readContainer(cramHeader.getVersion(), countingStream); + } + @Override public boolean hasNext() { if (eof) return false; @@ -70,7 +82,7 @@ public void close() { cramHeader = null; //noinspection EmptyCatchBlock try { - inputStream.close(); + countingInputStream.close(); } catch (final Exception e) { } } diff --git a/src/main/java/htsjdk/samtools/cram/io/InputStreamUtils.java b/src/main/java/htsjdk/samtools/cram/io/InputStreamUtils.java index 3d1c96da9e..7a62752dc9 100644 --- a/src/main/java/htsjdk/samtools/cram/io/InputStreamUtils.java +++ b/src/main/java/htsjdk/samtools/cram/io/InputStreamUtils.java @@ -77,4 +77,29 @@ public static void readFully(final InputStream inputStream, final byte[] b, fina n += count; } } + + /** + * Skip the specified number of bytes from the {@link InputStream}. + * @param in the input stream to skip bytes from + * @param length the number of bytes to skip + * @throws IOException as per java IO contract + * @throws EOFException if there is less than length bytes in the stream + */ + public static void skipFully(final InputStream in, final long length) throws IOException { + long amt = length; + while (amt > 0) { + long ret = in.skip(amt); + if (ret == 0) { + // skip may return 0 even if we're not at EOF. Luckily, we can + // use the read() method to figure out if we're at the end. + int b = in.read(); + if (b == -1) { + throw new EOFException( "Premature EOF from inputStream after " + + "skipping " + (length - amt) + " byte(s)."); + } + ret = 1; + } + amt -= ret; + } + } } diff --git a/src/test/java/htsjdk/samtools/CramContainerHeaderIteratorTest.java b/src/test/java/htsjdk/samtools/CramContainerHeaderIteratorTest.java new file mode 100644 index 0000000000..14d9f26d7c --- /dev/null +++ b/src/test/java/htsjdk/samtools/CramContainerHeaderIteratorTest.java @@ -0,0 +1,57 @@ +package htsjdk.samtools; + +import htsjdk.HtsjdkTest; +import htsjdk.samtools.cram.build.CramContainerHeaderIterator; +import htsjdk.samtools.cram.build.CramContainerIterator; +import htsjdk.samtools.cram.structure.Container; +import htsjdk.samtools.cram.structure.CramHeader; +import htsjdk.samtools.seekablestream.SeekableFileStream; +import htsjdk.samtools.util.Iterables; +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +public class CramContainerHeaderIteratorTest extends HtsjdkTest { + @Test + public void test() throws IOException { + final File cramFile = new File("src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram"); + CramHeader expectedHeader; + List fullContainers; + try (SeekableFileStream seekableFileStream = new SeekableFileStream(cramFile)) { + CramContainerIterator iterator = new CramContainerIterator(seekableFileStream); + expectedHeader = iterator.getCramHeader(); + fullContainers = Iterables.slurp(iterator); + } + CramHeader actualHeader; + List headerOnlyContainers; + try (SeekableFileStream seekableFileStream = new SeekableFileStream(cramFile)) { + CramContainerHeaderIterator iterator = new CramContainerHeaderIterator(seekableFileStream); + actualHeader = iterator.getCramHeader(); + headerOnlyContainers = Iterables.slurp(iterator); + } + Assert.assertEquals(actualHeader, expectedHeader); + Assert.assertEquals(fullContainers.size(), headerOnlyContainers.size()); + for (int i = 0; i < fullContainers.size(); i++) { + Container fullContainer = fullContainers.get(i); + Container headerOnlyContainer = headerOnlyContainers.get(i); + Assert.assertEquals(headerOnlyContainer.containerByteSize, fullContainer.containerByteSize); + Assert.assertEquals(headerOnlyContainer.sequenceId, fullContainer.sequenceId); + Assert.assertEquals(headerOnlyContainer.alignmentStart, fullContainer.alignmentStart); + Assert.assertEquals(headerOnlyContainer.alignmentSpan, fullContainer.alignmentSpan); + Assert.assertEquals(headerOnlyContainer.nofRecords, fullContainer.nofRecords); + Assert.assertEquals(headerOnlyContainer.globalRecordCounter, fullContainer.globalRecordCounter); + Assert.assertEquals(headerOnlyContainer.bases, fullContainer.bases); + Assert.assertEquals(headerOnlyContainer.blockCount, fullContainer.blockCount); + Assert.assertEquals(headerOnlyContainer.landmarks, fullContainer.landmarks); + Assert.assertEquals(headerOnlyContainer.checksum, fullContainer.checksum); + Assert.assertEquals(headerOnlyContainer.offset, fullContainer.offset); + // unpopulated fields + Assert.assertNull(headerOnlyContainer.blocks); + Assert.assertNull(headerOnlyContainer.header); + Assert.assertNull(headerOnlyContainer.slices); + } + } +} diff --git a/src/test/java/htsjdk/samtools/cram/io/InputStreamUtilsTest.java b/src/test/java/htsjdk/samtools/cram/io/InputStreamUtilsTest.java new file mode 100644 index 0000000000..8f96bc6e15 --- /dev/null +++ b/src/test/java/htsjdk/samtools/cram/io/InputStreamUtilsTest.java @@ -0,0 +1,32 @@ +package htsjdk.samtools.cram.io; + +import htsjdk.HtsjdkTest; +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +public class InputStreamUtilsTest extends HtsjdkTest { + + @Test + public void testSkipFully() throws IOException { + byte[] data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 }; + // use a BufferedInputStream with a small buffer to check that skipFully will fill the buffer as needed + InputStream in = new BufferedInputStream(new ByteArrayInputStream(data), 4); + InputStreamUtils.skipFully(in, 6); + Assert.assertEquals(in.read(), 6); + Assert.assertEquals(in.read(), 7); + Assert.assertEquals(in.read(), -1); // EOF + } + + @Test(expectedExceptions = EOFException.class) + public void testSkipFullyPastEOF() throws IOException { + byte[] data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 }; + InputStream in = new BufferedInputStream(new ByteArrayInputStream(data), 4); + InputStreamUtils.skipFully(in, 10); + } +} From 497a0f3d86ea48c767ae932828b6ee69f5d6254e Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 5 Jun 2018 13:52:56 -0400 Subject: [PATCH 39/83] made VariantContextWriterBuilder.determineOutputTypeFromFile public (#1066) * made VariantContextWriterBuilder.determineOutputTypeFromFile public instead of protected --- .../variantcontext/writer/VariantContextWriterBuilder.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java index e9038e9868..27041f786f 100644 --- a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java +++ b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java @@ -467,8 +467,11 @@ else if (STREAM_TYPES.contains(this.outType)) * 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. + * + * @param f A file whose {@link OutputType} we want to infer + * @return The file's {@link OutputType}. Never {@code null}. */ - protected static OutputType determineOutputTypeFromFile(final File f) { + public static OutputType determineOutputTypeFromFile(final File f) { if (isBCF(f)) { return OutputType.BCF; } else if (isCompressedVCF(f)) { From 85d2b8d4b098906f70fe4113c46b0b1c026b44b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B3mez-S=C3=A1nchez?= Date: Tue, 5 Jun 2018 20:53:47 +0200 Subject: [PATCH 40/83] Add utilities for checking block-compressed files in IOUtils (#1132) * Move AbstractFeatureReader.hasBlockCompressedExtension to IOUtil and deprecate old version * Add IOUtil.isBlockCompressed method --- .../htsjdk/samtools/SamFileValidator.java | 8 +- ...ockCompressedIndexedFastaSequenceFile.java | 11 +- .../reference/IndexedFastaSequenceFile.java | 8 +- .../ReferenceSequenceFileFactory.java | 10 +- .../java/htsjdk/samtools/util/IOUtil.java | 105 ++++++++++++++++++ .../htsjdk/tribble/AbstractFeatureReader.java | 49 +++----- .../tribble/TribbleIndexedFeatureReader.java | 5 +- .../java/htsjdk/tribble/bed/BEDCodec.java | 3 +- .../htsjdk/tribble/index/IndexFactory.java | 11 +- .../writer/VariantContextWriterBuilder.java | 2 +- .../java/htsjdk/samtools/util/IOUtilTest.java | 62 +++++++++++ .../tribble/AbstractFeatureReaderTest.java | 49 +------- .../java/htsjdk/tribble/bed/BEDCodecTest.java | 3 +- .../VariantContextWriterBuilderUnitTest.java | 4 +- 14 files changed, 214 insertions(+), 116 deletions(-) mode change 100644 => 100755 src/main/java/htsjdk/samtools/util/IOUtil.java mode change 100644 => 100755 src/main/java/htsjdk/tribble/AbstractFeatureReader.java diff --git a/src/main/java/htsjdk/samtools/SamFileValidator.java b/src/main/java/htsjdk/samtools/SamFileValidator.java index 6001d89bca..31aab8d4ad 100644 --- a/src/main/java/htsjdk/samtools/SamFileValidator.java +++ b/src/main/java/htsjdk/samtools/SamFileValidator.java @@ -208,10 +208,8 @@ public boolean validateSamFileVerbose(final SamReader samReader, final Reference } public void validateBamFileTermination(final File inputFile) { - BufferedInputStream inputStream = null; try { - inputStream = IOUtil.toBufferedStream(new FileInputStream(inputFile)); - if (!BlockCompressedInputStream.isValidFile(inputStream)) { + if (!IOUtil.isBlockCompressed(inputFile.toPath())) { return; } final BlockCompressedInputStream.FileTermination terminationState = @@ -227,10 +225,6 @@ public void validateBamFileTermination(final File inputFile) { } } catch (IOException e) { throw new SAMException("IOException", e); - } finally { - if (inputStream != null) { - CloserUtil.close(inputStream); - } } } diff --git a/src/main/java/htsjdk/samtools/reference/BlockCompressedIndexedFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/BlockCompressedIndexedFastaSequenceFile.java index e30b5ed9db..43aff7126f 100644 --- a/src/main/java/htsjdk/samtools/reference/BlockCompressedIndexedFastaSequenceFile.java +++ b/src/main/java/htsjdk/samtools/reference/BlockCompressedIndexedFastaSequenceFile.java @@ -28,6 +28,7 @@ import htsjdk.samtools.seekablestream.SeekablePathStream; import htsjdk.samtools.util.BlockCompressedInputStream; import htsjdk.samtools.util.GZIIndex; +import htsjdk.samtools.util.IOUtil; import java.io.BufferedInputStream; import java.io.FileNotFoundException; @@ -83,16 +84,12 @@ private static GZIIndex loadFastaGziIndex(final Path path) { } private static boolean canCreateBlockCompresedIndexedFastaSequence(final Path path) { - try (final InputStream stream = new BufferedInputStream(Files.newInputStream(path))) { - // check if the it is a valid block-compressed file - if(BlockCompressedInputStream.isValidFile(stream)) { - // check if the .gzi index exits - return Files.exists(GZIIndex.resolveIndexNameForBgzipFile(path)); - } + try { + // check if the it is a valid block-compressed file and if the .gzi index exits + return IOUtil.isBlockCompressed(path, true) && Files.exists(GZIIndex.resolveIndexNameForBgzipFile(path)); } catch (IOException e) { return false; } - return false; } @Override diff --git a/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java index 68f20b6e3d..0c8dfacb8b 100644 --- a/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java +++ b/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java @@ -75,9 +75,9 @@ public IndexedFastaSequenceFile(final File file) throws FileNotFoundException { */ public IndexedFastaSequenceFile(final Path path, final FastaSequenceIndex index) { super(path, index); - try (final InputStream stream = IOUtil.maybeBufferInputStream(Files.newInputStream(path))) { + try { // check if the it is a valid block-compressed file - if (BlockCompressedInputStream.isValidFile(stream)) { + if (IOUtil.isBlockCompressed(path, true)) { throw new SAMException("Indexed block-compressed FASTA file cannot be handled: " + path); } this.channel = Files.newByteChannel(path); @@ -108,8 +108,8 @@ public static boolean canCreateIndexedFastaReader(final File fastaFile) { */ @Deprecated public static boolean canCreateIndexedFastaReader(final Path fastaFile) { - try (final InputStream stream = new BufferedInputStream(Files.newInputStream(fastaFile))) { - if (BlockCompressedInputStream.isValidFile(stream)) { + try { + if (IOUtil.isBlockCompressed(fastaFile, true)) { return false; } return (Files.exists(fastaFile) && diff --git a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java index ed1c233444..437f53ce4d 100644 --- a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java +++ b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java @@ -126,10 +126,8 @@ public static ReferenceSequenceFile getReferenceSequenceFile(final Path path, fi getFastaExtension(path); // Using faidx requires truncateNamesAtWhitespace if (truncateNamesAtWhitespace && preferIndexed && canCreateIndexedFastaReader(path)) { - // TODO: change for IOUtils.isBlockCompressed (https://github.com/samtools/htsjdk/issues/1130) - try (final InputStream stream = new BufferedInputStream(Files.newInputStream(path))) { - return (BlockCompressedInputStream.isValidFile(stream)) ? - new BlockCompressedIndexedFastaSequenceFile(path) : new IndexedFastaSequenceFile(path); + try { + return IOUtil.isBlockCompressed(path, true) ? new BlockCompressedIndexedFastaSequenceFile(path) : new IndexedFastaSequenceFile(path); } catch (final IOException e) { throw new SAMException("Error opening FASTA: " + path, e); } @@ -157,9 +155,9 @@ public static boolean canCreateIndexedFastaReader(final Path fastaFile) { // both the FASTA file should exists and the .fai index should exist if (Files.exists(fastaFile) && Files.exists(getFastaIndexFileName(fastaFile))) { // open the file for checking for block-compressed input - try (final InputStream stream = new BufferedInputStream(Files.newInputStream(fastaFile))) { + try { // if it is bgzip, it requires the .gzi index - return !BlockCompressedInputStream.isValidFile(stream) || + return !IOUtil.isBlockCompressed(fastaFile, true) || Files.exists(GZIIndex.resolveIndexNameForBgzipFile(fastaFile)); } catch (IOException e) { return false; diff --git a/src/main/java/htsjdk/samtools/util/IOUtil.java b/src/main/java/htsjdk/samtools/util/IOUtil.java old mode 100644 new mode 100755 index 7f6bfac420..4174b341fa --- a/src/main/java/htsjdk/samtools/util/IOUtil.java +++ b/src/main/java/htsjdk/samtools/util/IOUtil.java @@ -64,9 +64,11 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Scanner; +import java.util.Set; import java.util.Stack; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -105,6 +107,8 @@ public class IOUtil { public static final String DICT_FILE_EXTENSION = ".dict"; + public static final Set BLOCK_COMPRESSED_EXTENSIONS = Collections.unmodifiableSet(new HashSet(Arrays.asList(".gz", ".gzip", ".bgz", ".bgzf"))); + private static int compressionLevel = Defaults.COMPRESSION_LEVEL; /** @@ -1153,4 +1157,105 @@ public static List filesToPaths(Collection files){ public static Path addExtension(Path path, String extension) { return path.resolveSibling(path.getFileName() + extension); } + + /** + * Checks if the provided path is block-compressed. + * + *

Note that using {@code checkExtension=true} would avoid the cost of opening the file, but + * if {@link #hasBlockCompressedExtension(String)} returns {@code false} this would not detect + * block-compressed files such BAM. + * + * @param path file to check if it is block-compressed. + * @param checkExtension if {@code true}, checks the extension before opening the file. + * @return {@code true} if the file is block-compressed; {@code false} otherwise. + * @throws IOException if there is an I/O error. + */ + public static boolean isBlockCompressed(final Path path, final boolean checkExtension) throws IOException { + if (checkExtension && !hasBlockCompressedExtension(path)) { + return false; + } + try (final InputStream stream = new BufferedInputStream(Files.newInputStream(path), Math.max(Defaults.BUFFER_SIZE, BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE))) { + return BlockCompressedInputStream.isValidFile(stream); + } + } + + /** + * Checks if the provided path is block-compressed (including extension). + * + *

Note that block-compressed file extensions {@link #BLOCK_COMPRESSED_EXTENSIONS} are not + * checked by this method. + * + * @param path file to check if it is block-compressed. + * @return {@code true} if the file is block-compressed; {@code false} otherwise. + * @throws IOException if there is an I/O error. + */ + public static boolean isBlockCompressed(final Path path) throws IOException { + return isBlockCompressed(path, false); + } + + /** + * Checks if a file ends in one of the {@link #BLOCK_COMPRESSED_EXTENSIONS}. + * + * @param fileName string name for the file. May be an HTTP/S url. + * + * @return {@code true} if the file has a block-compressed extension; {@code false} otherwise. + */ + public static boolean hasBlockCompressedExtension (final String fileName) { + String cleanedPath = stripQueryStringIfPathIsAnHttpUrl(fileName); + for (final String extension : BLOCK_COMPRESSED_EXTENSIONS) { + if (cleanedPath.toLowerCase().endsWith(extension)) + return true; + } + return false; + } + + /** + * Checks if a path ends in one of the {@link #BLOCK_COMPRESSED_EXTENSIONS}. + * + * @param path object to extract the name from. + * + * @return {@code true} if the path has a block-compressed extension; {@code false} otherwise. + */ + public static boolean hasBlockCompressedExtension(final Path path) { + return hasBlockCompressedExtension(path.getFileName().toString()); + } + + /** + * Checks if a file ends in one of the {@link #BLOCK_COMPRESSED_EXTENSIONS}. + * + * @param file object to extract the name from. + * + * @return {@code true} if the file has a block-compressed extension; {@code false} otherwise. + */ + public static boolean hasBlockCompressedExtension (final File file) { + return hasBlockCompressedExtension(file.getName()); + } + + /** + * Checks if a file ends in one of the {@link #BLOCK_COMPRESSED_EXTENSIONS}. + * + * @param uri file as an URI. + * + * @return {@code true} if the file has a block-compressed extension; {@code false} otherwise. + */ + public static boolean hasBlockCompressedExtension (final URI uri) { + String path = uri.getPath(); + return hasBlockCompressedExtension(path); + } + + /** + * Remove http query before checking extension + * Path might be a local file, in which case a '?' is a legal part of the filename. + * @param path a string representing some sort of path, potentially an http url + * @return path with no trailing queryString (ex: http://something.com/path.vcf?stuff=something => http://something.com/path.vcf) + */ + private static String stripQueryStringIfPathIsAnHttpUrl(String path) { + if(path.startsWith("http://") || path.startsWith("https://")) { + int qIdx = path.indexOf('?'); + if (qIdx > 0) { + return path.substring(0, qIdx); + } + } + return path; + } } diff --git a/src/main/java/htsjdk/tribble/AbstractFeatureReader.java b/src/main/java/htsjdk/tribble/AbstractFeatureReader.java old mode 100644 new mode 100755 index 511084ef51..958135fe05 --- a/src/main/java/htsjdk/tribble/AbstractFeatureReader.java +++ b/src/main/java/htsjdk/tribble/AbstractFeatureReader.java @@ -18,6 +18,7 @@ package htsjdk.tribble; +import htsjdk.samtools.util.IOUtil; import htsjdk.tribble.index.Index; import htsjdk.tribble.util.ParsingUtils; import htsjdk.tribble.util.TabixUtils; @@ -57,7 +58,9 @@ public abstract class AbstractFeatureReader implement private static ComponentMethods methods = new ComponentMethods(); - public static final Set BLOCK_COMPRESSED_EXTENSIONS = Collections.unmodifiableSet(new HashSet(Arrays.asList(".gz", ".gzip", ".bgz", ".bgzf"))); + /** @deprecated use {@link IOUtil#BLOCK_COMPRESSED_EXTENSIONS} instead. */ + @Deprecated + public static final Set BLOCK_COMPRESSED_EXTENSIONS = IOUtil.BLOCK_COMPRESSED_EXTENSIONS; /** * Calls {@link #getFeatureReader(String, FeatureCodec, boolean)} with {@code requireIndex} = true @@ -170,52 +173,28 @@ public static void setComponentMethods(ComponentMethods methods){ } /** - * Whether a filename ends in one of the BLOCK_COMPRESSED_EXTENSIONS - * @param fileName - * @return + * @deprecated use {@link IOUtil#hasBlockCompressedExtension(String)}. */ + @Deprecated public static boolean hasBlockCompressedExtension (final String fileName) { - String cleanedPath = stripQueryStringIfPathIsAnHttpUrl(fileName); - for (final String extension : BLOCK_COMPRESSED_EXTENSIONS) { - if (cleanedPath.toLowerCase().endsWith(extension)) - return true; - } - return false; - } - - /** - * Remove http query before checking extension - * Path might be a local file, in which case a '?' is a legal part of the filename. - * @param path a string representing some sort of path, potentially an http url - * @return path with no trailing queryString (ex: http://something.com/path.vcf?stuff=something => http://something.com/path.vcf) - */ - private static String stripQueryStringIfPathIsAnHttpUrl(String path) { - if(path.startsWith("http://") || path.startsWith("https://")) { - int qIdx = path.indexOf('?'); - if (qIdx > 0) { - return path.substring(0, qIdx); - } - } - return path; + return IOUtil.hasBlockCompressedExtension(fileName); } /** - * Whether the name of a file ends in one of the BLOCK_COMPRESSED_EXTENSIONS - * @param file - * @return + * @deprecated use {@link IOUtil#hasBlockCompressedExtension(File)}. */ + @Deprecated public static boolean hasBlockCompressedExtension (final File file) { - return hasBlockCompressedExtension(file.getName()); + return IOUtil.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 + * @deprecated use {@link IOUtil#hasBlockCompressedExtension(URI)}. */ + @Deprecated public static boolean hasBlockCompressedExtension (final URI uri) { String path = uri.getPath(); - return hasBlockCompressedExtension(path); + return IOUtil.hasBlockCompressedExtension(path); } /** @@ -240,7 +219,7 @@ public static boolean isTabix(String resourcePath, String indexPath) throws IOEx if(indexPath == null){ indexPath = ParsingUtils.appendToPath(resourcePath, TabixUtils.STANDARD_INDEX_EXTENSION); } - return hasBlockCompressedExtension(resourcePath) && ParsingUtils.resourceExists(indexPath); + return IOUtil.hasBlockCompressedExtension(resourcePath) && ParsingUtils.resourceExists(indexPath); } public static class ComponentMethods{ diff --git a/src/main/java/htsjdk/tribble/TribbleIndexedFeatureReader.java b/src/main/java/htsjdk/tribble/TribbleIndexedFeatureReader.java index 8603431de8..ae847a74ac 100644 --- a/src/main/java/htsjdk/tribble/TribbleIndexedFeatureReader.java +++ b/src/main/java/htsjdk/tribble/TribbleIndexedFeatureReader.java @@ -25,6 +25,7 @@ import htsjdk.samtools.seekablestream.SeekableStream; import htsjdk.samtools.seekablestream.SeekableStreamFactory; +import htsjdk.samtools.util.IOUtil; import htsjdk.samtools.util.RuntimeIOException; import htsjdk.tribble.index.Block; import htsjdk.tribble.index.Index; @@ -250,7 +251,7 @@ private void readHeader() throws IOException { PositionalBufferedStream pbs = null; try { is = ParsingUtils.openInputStream(path, wrapper); - if (hasBlockCompressedExtension(new URI(URLEncoder.encode(path, "UTF-8")))) { + if (IOUtil.hasBlockCompressedExtension(new URI(URLEncoder.encode(path, "UTF-8")))) { // TODO: TEST/FIX THIS! https://github.com/samtools/htsjdk/issues/944 // TODO -- warning I don't think this can work, the buffered input stream screws up position is = new GZIPInputStream(new BufferedInputStream(is)); @@ -324,7 +325,7 @@ public WFIterator() throws IOException { final InputStream inputStream = ParsingUtils.openInputStream(path, wrapper); final PositionalBufferedStream pbs; - if (hasBlockCompressedExtension(path)) { + if (IOUtil.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)); diff --git a/src/main/java/htsjdk/tribble/bed/BEDCodec.java b/src/main/java/htsjdk/tribble/bed/BEDCodec.java index 2ee4be7e6d..7433c350d1 100644 --- a/src/main/java/htsjdk/tribble/bed/BEDCodec.java +++ b/src/main/java/htsjdk/tribble/bed/BEDCodec.java @@ -23,6 +23,7 @@ */ package htsjdk.tribble.bed; +import htsjdk.samtools.util.IOUtil; import htsjdk.tribble.AbstractFeatureReader; import htsjdk.tribble.AsciiFeatureCodec; import htsjdk.tribble.annotation.Strand; @@ -229,7 +230,7 @@ private void createExons(int start, String[] tokens, FullBEDFeature gene, @Override public boolean canDecode(final String path) { final String toDecode; - if (AbstractFeatureReader.hasBlockCompressedExtension(path)) { + if (IOUtil.hasBlockCompressedExtension(path)) { toDecode = path.substring(0, path.lastIndexOf(".")); } else { toDecode = path; diff --git a/src/main/java/htsjdk/tribble/index/IndexFactory.java b/src/main/java/htsjdk/tribble/index/IndexFactory.java index 6007cf194c..10866b88af 100644 --- a/src/main/java/htsjdk/tribble/index/IndexFactory.java +++ b/src/main/java/htsjdk/tribble/index/IndexFactory.java @@ -429,7 +429,7 @@ public FeatureIterator(final File inputFile, final FeatureCodec(); blockCompressedIndices = new ArrayList(); - for (final String extension : AbstractFeatureReader.BLOCK_COMPRESSED_EXTENSIONS) { + for (final String extension : IOUtil.BLOCK_COMPRESSED_EXTENSIONS) { final File blockCompressed = File.createTempFile(TEST_BASENAME, IOUtil.VCF_FILE_EXTENSION + extension); blockCompressed.deleteOnExit(); blockCompressedVCFs.add(blockCompressed); @@ -102,7 +102,7 @@ public void testSetOutputFile() throws IOException { 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) { + for (final String extension : IOUtil.BLOCK_COMPRESSED_EXTENSIONS) { final File file = File.createTempFile(TEST_BASENAME + ".setoutput", extension); file.deleteOnExit(); final String filename = file.getAbsolutePath(); From 34dbda7b9ec82863f197e2de1d734fe033d0782c Mon Sep 17 00:00:00 2001 From: Tom White Date: Wed, 6 Jun 2018 17:59:40 +0100 Subject: [PATCH 41/83] Make BAMFileWriter public to expose code to write a BAM header to a stream. (#1119) --- src/main/java/htsjdk/samtools/BAMFileWriter.java | 9 +++++++-- .../java/htsjdk/samtools/BAMFileWriterTest.java | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/htsjdk/samtools/BAMFileWriter.java b/src/main/java/htsjdk/samtools/BAMFileWriter.java index 95a26b42f7..0a77b5b89f 100644 --- a/src/main/java/htsjdk/samtools/BAMFileWriter.java +++ b/src/main/java/htsjdk/samtools/BAMFileWriter.java @@ -40,7 +40,7 @@ /** * Concrete implementation of SAMFileWriter for writing gzipped BAM files. */ -class BAMFileWriter extends SAMFileWriterImpl { +public class BAMFileWriter extends SAMFileWriterImpl { private final BinaryCodec outputBinaryCodec; private BAMRecordCodec bamRecordCodec = null; @@ -200,7 +200,12 @@ protected static void writeHeader(final BinaryCodec outputBinaryCodec, final SAM writeHeader(outputBinaryCodec, samFileHeader, headerString); } - protected static void writeHeader(final OutputStream outputStream, final SAMFileHeader samFileHeader) { + /** + * Write a BAM file header to an output stream in block compressed BAM format. + * @param outputStream the stream to write the BAM header to + * @param samFileHeader the header to write + */ + public static void writeHeader(final OutputStream outputStream, final SAMFileHeader samFileHeader) { final BlockCompressedOutputStream blockCompressedOutputStream = new BlockCompressedOutputStream(outputStream, null); final BinaryCodec outputBinaryCodec = new BinaryCodec(blockCompressedOutputStream); writeHeader(outputBinaryCodec, samFileHeader); diff --git a/src/test/java/htsjdk/samtools/BAMFileWriterTest.java b/src/test/java/htsjdk/samtools/BAMFileWriterTest.java index 3860a75029..ab6daa8c99 100644 --- a/src/test/java/htsjdk/samtools/BAMFileWriterTest.java +++ b/src/test/java/htsjdk/samtools/BAMFileWriterTest.java @@ -25,6 +25,8 @@ import htsjdk.HtsjdkTest; import htsjdk.samtools.metrics.MetricsFile; +import htsjdk.samtools.util.BinaryCodec; +import htsjdk.samtools.util.BlockCompressedInputStream; import htsjdk.samtools.util.CloseableIterator; import htsjdk.samtools.util.SequenceUtil; import org.testng.Assert; @@ -542,6 +544,20 @@ public void setAttributeOnBamRecord() throws IOException { Assert.assertNull(rec.getAttribute("xx")); } } + + @Test + public void testWriteHeader() throws IOException { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate); + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BAMFileWriter.writeHeader(baos, builder.getHeader()); + baos.close(); + + try (BinaryCodec binaryCodec = new BinaryCodec(new DataInputStream(new BlockCompressedInputStream(new ByteArrayInputStream(baos.toByteArray()))))) { + SAMFileHeader samFileHeader = BAMFileReader.readHeader(binaryCodec, ValidationStringency.STRICT, null); + Assert.assertEquals(samFileHeader, builder.getHeader()); + } + } } From 55debe20b4870581c88e0b1f4e8726f41b94f5a4 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Wed, 6 Jun 2018 15:07:28 -0400 Subject: [PATCH 42/83] adding test for IOUtil.isBlockCompressed (#1141) * adding tests for IOUtil.isBlockCompressed --- .../java/htsjdk/samtools/util/IOUtilTest.java | 33 ++++++++++++++++++ .../resources/htsjdk/samtools/io/example.bam | Bin 0 -> 10166 bytes .../resources/htsjdk/samtools/io/ipsum.txt | 9 +++++ .../htsjdk/samtools/io/ipsum.txt.bgz | Bin 0 -> 1200 bytes .../samtools/io/ipsum.txt.bgz.wrongextension | Bin 0 -> 1200 bytes .../io/ipsum.txt.bgzipped_with_gzextension.gz | Bin 0 -> 1200 bytes .../resources/htsjdk/samtools/io/ipsum.txt.gz | Bin 0 -> 1174 bytes 7 files changed, 42 insertions(+) create mode 100644 src/test/resources/htsjdk/samtools/io/example.bam create mode 100644 src/test/resources/htsjdk/samtools/io/ipsum.txt create mode 100644 src/test/resources/htsjdk/samtools/io/ipsum.txt.bgz create mode 100644 src/test/resources/htsjdk/samtools/io/ipsum.txt.bgz.wrongextension create mode 100644 src/test/resources/htsjdk/samtools/io/ipsum.txt.bgzipped_with_gzextension.gz create mode 100644 src/test/resources/htsjdk/samtools/io/ipsum.txt.gz diff --git a/src/test/java/htsjdk/samtools/util/IOUtilTest.java b/src/test/java/htsjdk/samtools/util/IOUtilTest.java index 321b59287b..dd73fa79d2 100644 --- a/src/test/java/htsjdk/samtools/util/IOUtilTest.java +++ b/src/test/java/htsjdk/samtools/util/IOUtilTest.java @@ -34,6 +34,7 @@ import java.nio.file.Paths; import java.nio.file.spi.FileSystemProvider; +import htsjdk.samtools.BamFileIoUtils; import htsjdk.samtools.SAMException; import org.testng.Assert; import org.testng.annotations.AfterClass; @@ -487,4 +488,36 @@ public void testBlockCompressionExtension(final String testURIString, final bool public void testBlockCompressionExtensionStringVersion(final String testURIString, final boolean expected) { Assert.assertEquals(IOUtil.hasBlockCompressedExtension(testURIString), expected); } + + @DataProvider + public static Object[][] blockCompressedFiles() { + return new Object[][]{ + {TEST_DATA_DIR.resolve("ipsum.txt"), true, false}, + {TEST_DATA_DIR.resolve("ipsum.txt"), false, false}, + {TEST_DATA_DIR.resolve("ipsum.txt.gz"), true, false}, + {TEST_DATA_DIR.resolve("ipsum.txt.gz"), false, false}, + {TEST_DATA_DIR.resolve("ipsum.txt.bgz"), true, true}, + {TEST_DATA_DIR.resolve("ipsum.txt.bgz"), false, true}, + {TEST_DATA_DIR.resolve("ipsum.txt.bgz.wrongextension"), true, false}, + {TEST_DATA_DIR.resolve("ipsum.txt.bgz.wrongextension"), false, true}, + {TEST_DATA_DIR.resolve("ipsum.txt.bgzipped_with_gzextension.gz"), true, true}, + {TEST_DATA_DIR.resolve("ipsum.txt.bgzipped_with_gzextension.gz"), false, true}, + {TEST_DATA_DIR.resolve("example.bam"), true, false}, + {TEST_DATA_DIR.resolve("example.bam"), false, true} + }; + } + + @Test(dataProvider = "blockCompressedFiles") + public void testIsBlockCompressed(Path file, boolean checkExtension, boolean expected) throws IOException { + Assert.assertEquals(IOUtil.isBlockCompressed(file, checkExtension), expected); + } + + @Test(dataProvider = "blockCompressedFiles") + public void testIsBlockCompressedOnJimfs(Path file, boolean checkExtension, boolean expected) throws IOException { + try (FileSystem jimfs = Jimfs.newFileSystem(Configuration.unix())) { + final Path jimfsRoot = jimfs.getRootDirectories().iterator().next(); + final Path jimfsFile = Files.copy(file, jimfsRoot.resolve(file.getFileName().toString())); + Assert.assertEquals(IOUtil.isBlockCompressed(jimfsFile, checkExtension), expected); + } + } } diff --git a/src/test/resources/htsjdk/samtools/io/example.bam b/src/test/resources/htsjdk/samtools/io/example.bam new file mode 100644 index 0000000000000000000000000000000000000000..18b96c15cc0bc682f3e8df2aa21efb63136d9ee1 GIT binary patch literal 10166 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 O00RI3000000001Gn@h?7 literal 0 HcmV?d00001 diff --git a/src/test/resources/htsjdk/samtools/io/ipsum.txt.bgz.wrongextension b/src/test/resources/htsjdk/samtools/io/ipsum.txt.bgz.wrongextension new file mode 100644 index 0000000000000000000000000000000000000000..c24ec20578d3ab26fe87f90db5b883efe66e1242 GIT binary patch literal 1200 zcmV;h1W)@PiwFb&00000{{{d;LjnMk1XWhsj@&j3ea~0$1C05HqG^EuP0%7p-#M~o zmW3>Nbs6mE_fV8{6V> zC;1@tMt|odkzPK~f34I+v4y}l`q!5#_ZCo&9j)?=Qi^Q0=th6G;ygXrNsuCi@K%U} zyti@Siv!+}&s<3#Rln`6%TmRW z%X}9dqmT67@CGX+3RB@-d|ZfWOF^6WW1#(wv#*)$tQ-B)q@Ycbl~Q)n|GB^b)LM?b zoM*pd!zfSwsl&YaxMrWRbVq3cM!MxjKX~g%W+|BUk%6*c-i1n98BJlZj2Bkq!Oa2T zLP7361Jj>=J)7-~^pm64ZUJ||iQ4&sM~-$Mf(I&nmJaKL5#-5>H&g~nPrOy^RS*zJ zuNa!Et=#C3DrmT~Hvji}C~wQ59ul09SBx0t{&xP7c>D6@50AFRp zG#Kz67(ePoEWY&?ZU4n1kB7L=ss=1qddpQAu|)^$jXdRjb1CltMKuUJ02k0^88Co@ zn!I&oXKyOT#w#l-+*BhfsaFeotE`BAOrx3Ft{$e*q3kP=ELz%!kfLxSt+Et_*0(*&O;CLOOn*uZ#f z?$3>x=}Yy@<$a9)9yKx+Kbq%+`SITY@~BMloEB7_FLhy(gD8=r1Ym zryeGu=QT6jJVSG1(|{(9GB&h5NLzXy9@4i4UeHS9s#MzTIo&f4n+`u??&0$YlW_@5 zM5Z_Zg2R1Y2M8wZBhVGbb0+h-T{g>U!0zMDB<5JA+~|&Vu?M}HP3yy+I@NJE5APZJ zY{?5pvYh)e85HziHujjWE-E_YOmpsr&H}JS%d+S4F83IG5fiwFb&00000{{{d;LjnLB O00RI3000000001Gn@h?7 literal 0 HcmV?d00001 diff --git a/src/test/resources/htsjdk/samtools/io/ipsum.txt.bgzipped_with_gzextension.gz b/src/test/resources/htsjdk/samtools/io/ipsum.txt.bgzipped_with_gzextension.gz new file mode 100644 index 0000000000000000000000000000000000000000..c24ec20578d3ab26fe87f90db5b883efe66e1242 GIT binary patch literal 1200 zcmV;h1W)@PiwFb&00000{{{d;LjnMk1XWhsj@&j3ea~0$1C05HqG^EuP0%7p-#M~o zmW3>Nbs6mE_fV8{6V> zC;1@tMt|odkzPK~f34I+v4y}l`q!5#_ZCo&9j)?=Qi^Q0=th6G;ygXrNsuCi@K%U} zyti@Siv!+}&s<3#Rln`6%TmRW z%X}9dqmT67@CGX+3RB@-d|ZfWOF^6WW1#(wv#*)$tQ-B)q@Ycbl~Q)n|GB^b)LM?b zoM*pd!zfSwsl&YaxMrWRbVq3cM!MxjKX~g%W+|BUk%6*c-i1n98BJlZj2Bkq!Oa2T zLP7361Jj>=J)7-~^pm64ZUJ||iQ4&sM~-$Mf(I&nmJaKL5#-5>H&g~nPrOy^RS*zJ zuNa!Et=#C3DrmT~Hvji}C~wQ59ul09SBx0t{&xP7c>D6@50AFRp zG#Kz67(ePoEWY&?ZU4n1kB7L=ss=1qddpQAu|)^$jXdRjb1CltMKuUJ02k0^88Co@ zn!I&oXKyOT#w#l-+*BhfsaFeotE`BAOrx3Ft{$e*q3kP=ELz%!kfLxSt+Et_*0(*&O;CLOOn*uZ#f z?$3>x=}Yy@<$a9)9yKx+Kbq%+`SITY@~BMloEB7_FLhy(gD8=r1Ym zryeGu=QT6jJVSG1(|{(9GB&h5NLzXy9@4i4UeHS9s#MzTIo&f4n+`u??&0$YlW_@5 zM5Z_Zg2R1Y2M8wZBhVGbb0+h-T{g>U!0zMDB<5JA+~|&Vu?M}HP3yy+I@NJE5APZJ zY{?5pvYh)e85HziHujjWE-E_YOmpsr&H}JS%d+S4F83IG5fiwFb&00000{{{d;LjnLB O00RI3000000001Gn@h?7 literal 0 HcmV?d00001 diff --git a/src/test/resources/htsjdk/samtools/io/ipsum.txt.gz b/src/test/resources/htsjdk/samtools/io/ipsum.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..8546c04a1a1059028fd4cddb30e74fdffc6c5582 GIT binary patch literal 1174 zcmV;H1Zn#piwFoS*%n&>18Hz`b!{$mcys_&R@;u;HVl2wSMURj`G=xufdEa=B1qpk zvSyZrEO~Vq?C1ATlx#1sNHDfUk>@7=m9pPR_R=<5Q%ISLRN~Fogvm~@{Cf7Y_{k|f41U0J=jT*B8Bi) zh=aVhao~#s-jL5+Ngq|e?XAq}-`P7KxzI~0d)iZJK6^rgXl|jsg_lImv_zhlEFPyVUHy!p6hpRsgDX#qyMqurPnDvo?vS8kYN?I9BVX%xBR^-9W z0pUVH?mh$4pME`??Tz%4qt|W$cfg6-`GQA|b{~QVDt(p?>x2>H$%{8s21-x7RqRy| z5J;~Wnyanc=#MIBxU)9@_j)LA%b^|;oRL?I80G$U{*rk6^5x`1r>^M8rYn`fVwLD* zZ4n%KJ&+ovJ_^_~1)hDuAm`}kJ`_UN>nwSrZ`l3x8C58B!J94=Ij9sU0(BsVmA|SI z>_6~lyr>R8RHvc8G^x?X&(3wqwMqp@9UykDZG~h1wa|;RpnV>j>^xKMm<;`_iX{MF zWy3TW@E#aH>P0NR^%iaa#Uqc0xX-EvELVEVRT;5G2kebJ<$ZH0?*K(L2s;25&}JDh zfPtnmBVLD1Sw6=;x zz|==Q5%xfMOY73d8u>Nw?!sS`##0e}Mq3qAoMeBCUA05H32P80tzPySk-623oeHNe zJ+q*Nn#IAO78xD9Mfv*dGIc=Vr$8&111$aKqi1cSJw*kkrseF~qH;V|8W(4V$_oCJ zhms%wrG5ocLy*+0*^jhX37^~~jgrfT17PzkUy2clOnywEfAOQ0wp1;Bn)8(rM6^e%e6jXz|BlNn&4 zP5R%=?XJj61WiJfdrN57vL>uW_m3Wa^Deq1%8Ja^fbCm?Jex)_T#Oj4nsvP=mp14x zDek8pCZXpwGu%8wb7RwhCXO;Tv^_{$dLACqw+3F&O600k+U+^rGY^{%KV$CU^9Yl1 z2~0$$H~@mfeO?C$Cha586~=QW^SNC%%W1&w%O%pT zckB_GHU(}h?LY&J0HdCGh_2N+1Q1y+HdoEYF09Kp(WhKEnp~S4u|HTn$+W<jyUh`sgC*Spi)~pzf&)^G3tcIxhD5G>iFbs$*UR o=N)!NDvW=tx2_5R05c>^e*gdg literal 0 HcmV?d00001 From ccc9259c4f266a72a196dc841c200ea667a5eb8f Mon Sep 17 00:00:00 2001 From: Chris Norman Date: Wed, 6 Jun 2018 15:18:48 -0400 Subject: [PATCH 43/83] Fix reading a CRAM with an index from a non-File Path. (#1125) --- .../htsjdk/samtools/SamReaderFactory.java | 12 +++++++- .../htsjdk/samtools/SamReaderFactoryTest.java | 30 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/main/java/htsjdk/samtools/SamReaderFactory.java b/src/main/java/htsjdk/samtools/SamReaderFactory.java index 132e576008..372c5a3a11 100644 --- a/src/main/java/htsjdk/samtools/SamReaderFactory.java +++ b/src/main/java/htsjdk/samtools/SamReaderFactory.java @@ -406,7 +406,17 @@ public SamReader open(final SamInputResource resource) { referenceSource = ReferenceSource.getDefaultCRAMReferenceSource(); } if (sourceFile == null || !sourceFile.isFile()) { - primitiveSamReader = new CRAMFileReader(bufferedStream, indexFile, referenceSource, validationStringency); + final SeekableStream indexSeekableStream = + indexMaybe == null ? + null : + indexMaybe.asUnbufferedSeekableStream(); + final SeekableStream sourceSeekableStream = data.asUnbufferedSeekableStream(); + if (null == sourceSeekableStream || null == indexSeekableStream) { + primitiveSamReader = new CRAMFileReader(bufferedStream, indexFile, referenceSource, validationStringency); + } else { + sourceSeekableStream.seek(0); + primitiveSamReader = new CRAMFileReader(sourceSeekableStream, indexSeekableStream, referenceSource, validationStringency); + } } else { bufferedStream.close(); primitiveSamReader = new CRAMFileReader(sourceFile, indexFile, referenceSource, validationStringency); diff --git a/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java b/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java index e68052effa..87372f47f0 100644 --- a/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java +++ b/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java @@ -1,5 +1,8 @@ package htsjdk.samtools; +import com.google.common.jimfs.Configuration; +import com.google.common.jimfs.Jimfs; + import htsjdk.HtsjdkTest; import htsjdk.samtools.SAMFileHeader.SortOrder; import htsjdk.samtools.cram.ref.ReferenceSource; @@ -21,6 +24,8 @@ import java.net.URL; import java.nio.ByteBuffer; import java.nio.channels.SeekableByteChannel; +import java.nio.file.FileSystem; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; @@ -486,6 +491,31 @@ public void testCRAMReaderFromURLBadIndexFile() throws IOException { 3); } + @Test + public void testCRAMReaderWithCRAIFromNonFilePath() throws IOException { + final File cramFile = new File(TEST_DATA_DIR, "cram/cramQueryWithCRAI.cram"); + final File cramIndex = new File(TEST_DATA_DIR, "cram/cramQueryWithCRAI.cram.crai"); + final File referenceFile = new File(TEST_DATA_DIR, "cram/human_g1k_v37.20.21.10M-10M200k.fasta"); + + try (final FileSystem jimfs = Jimfs.newFileSystem(Configuration.unix())) { + final Path jimfsCRAM = jimfs.getPath("acram.cram"); + final Path jimfsCRAI = jimfs.getPath("acram.crai"); + + Files.copy(cramFile.toPath(), jimfsCRAM); + Files.copy(cramIndex.toPath(), jimfsCRAI); + + final SamReaderFactory factory = SamReaderFactory.makeDefault() + .referenceSource(new ReferenceSource(referenceFile)) + .validationStringency(ValidationStringency.SILENT); + + // force SamReaderFactory through the CRAM code path for a CRAM with an index that can't be rendered as a file + try (final SamReader cramReader = factory.open(jimfsCRAM)) { + final SAMRecordIterator samIt = cramReader.query("20", 1, 1, false); + Assert.assertNotNull(samIt); + }; + } + } + private void getCRAMReaderFromInputResource( final BiFunction getInputResource, final boolean hasIndex, From 0d8e1c6c2b8da46b3c44db5032150fe23ab83610 Mon Sep 17 00:00:00 2001 From: Yossi Farjoun Date: Wed, 6 Jun 2018 15:25:19 -0400 Subject: [PATCH 44/83] Fixed bug where GL field overrides PL field #1097 (#1098) * fixed bug where GL field overrides PL field. When GL and PL are inconsistent, and GL is "after" PL, the resulting genotype has the wrong PL value. * fixes #1097 * updated testng 6.9.9 -> 6.13.1 --- build.gradle | 2 +- .../htsjdk/variant/vcf/AbstractVCFCodec.java | 7 +- .../java/htsjdk/utils/ClassFinderTest.java | 2 +- .../variant/vcf/AbstractVCFCodecTest.java | 93 ++++++++++--------- .../htsjdk/variant/test_withGLandPL.vcf | 49 ++++++++++ 5 files changed, 108 insertions(+), 45 deletions(-) create mode 100644 src/test/resources/htsjdk/variant/test_withGLandPL.vcf diff --git a/build.gradle b/build.gradle index 464b153b04..1a68161f76 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,7 @@ dependencies { testCompile "org.scala-lang:scala-library:2.12.1" testCompile "org.scalatest:scalatest_2.12:3.0.1" testRuntime 'org.pegdown:pegdown:1.4.2' // Necessary for generating HTML reports with ScalaTest - testCompile "org.testng:testng:6.9.9" + testCompile "org.testng:testng:6.13.1" testCompile "com.google.jimfs:jimfs:1.1" } diff --git a/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java b/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java index 8a55a19462..8710922103 100644 --- a/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java +++ b/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java @@ -680,6 +680,7 @@ public LazyGenotypesContext.LazyData createGenotypeMap(final String str, alleleMap.clear(); // cycle through the genotype strings + boolean PlIsSet = false; for (int genotypeOffset = 1; genotypeOffset < nParts; genotypeOffset++) { List genotypeValues = ParsingUtils.split(genotypeParts[genotypeOffset], VCFConstants.GENOTYPE_FIELD_SEPARATOR_CHAR); @@ -718,8 +719,12 @@ public LazyGenotypesContext.LazyData createGenotypeMap(final String str, gb.AD(decodeInts(genotypeValues.get(i))); } else if (gtKey.equals(VCFConstants.GENOTYPE_PL_KEY)) { gb.PL(decodeInts(genotypeValues.get(i))); + PlIsSet = true; } else if (gtKey.equals(VCFConstants.GENOTYPE_LIKELIHOODS_KEY)) { - gb.PL(GenotypeLikelihoods.fromGLField(genotypeValues.get(i)).getAsPLs()); + // Do not overwrite PL with data from GL + if (!PlIsSet) { + gb.PL(GenotypeLikelihoods.fromGLField(genotypeValues.get(i)).getAsPLs()); + } } else if (gtKey.equals(VCFConstants.DEPTH_KEY)) { gb.DP(Integer.valueOf(genotypeValues.get(i))); } else { diff --git a/src/test/java/htsjdk/utils/ClassFinderTest.java b/src/test/java/htsjdk/utils/ClassFinderTest.java index e6f1a9e40d..6d34a053bf 100644 --- a/src/test/java/htsjdk/utils/ClassFinderTest.java +++ b/src/test/java/htsjdk/utils/ClassFinderTest.java @@ -1,7 +1,7 @@ package htsjdk.utils; import htsjdk.HtsjdkTest; -import org.junit.Assert; +import org.testng.Assert; import org.testng.annotations.Test; /** diff --git a/src/test/java/htsjdk/variant/vcf/AbstractVCFCodecTest.java b/src/test/java/htsjdk/variant/vcf/AbstractVCFCodecTest.java index 9f81547ed2..78a3c63160 100644 --- a/src/test/java/htsjdk/variant/vcf/AbstractVCFCodecTest.java +++ b/src/test/java/htsjdk/variant/vcf/AbstractVCFCodecTest.java @@ -12,49 +12,58 @@ import java.io.File; import java.util.List; +public class AbstractVCFCodecTest extends VariantBaseTest { + @Test + public void shouldPreserveSymbolicAlleleCase() { + final VariantContext variant; + try (final VCFFileReader reader = new VCFFileReader(new File(VariantBaseTest.variantTestDataRoot + "breakpoint.vcf"), false)) { + variant = reader.iterator().next(); -public class AbstractVCFCodecTest extends VariantBaseTest { + } + // 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() { + final List list = VCF3Codec.parseAlleles("A", Allele.SPAN_DEL_STRING, 0); + } + + @Test(expectedExceptions = TribbleException.class) + public void TestSpanDelParseAllelesException() { + final List 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); + } - @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 list = VCF3Codec.parseAlleles("A", Allele.SPAN_DEL_STRING, 0); - } - - @Test(expectedExceptions = TribbleException.class) - public void TestSpanDelParseAllelesException(){ - List 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); - } + @Test + public void testGLnotOverridePL() { + final VariantContext variant; + try (final VCFFileReader reader = new VCFFileReader( + new File("src/test/resources/htsjdk/variant/test_withGLandPL.vcf"), false)) { + variant = reader.iterator().next(); + } + Assert.assertEquals(variant.getGenotype(0).getPL(), new int[]{45, 0, 50}); + } } diff --git a/src/test/resources/htsjdk/variant/test_withGLandPL.vcf b/src/test/resources/htsjdk/variant/test_withGLandPL.vcf new file mode 100644 index 0000000000..5f0e5e7a6f --- /dev/null +++ b/src/test/resources/htsjdk/variant/test_withGLandPL.vcf @@ -0,0 +1,49 @@ +##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 downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false BQSR=null quantize_quals=0 disable_indel_quals=false emit_original_quals=false preserve_qscores_less_than=6 defaultBaseQualities=-1 validation_strictness=SILENT remove_program_records=false keep_program_records=false unsafe=null num_threads=1 num_cpu_threads=null num_io_threads=null num_bam_file_handles=null read_group_black_list=null pedigree=[] pedigreeString=[] pedigreeValidationType=STRICT allow_intervals_with_unindexed_bam=false generateShadowBCF=false logging_level=INFO log_to_file=null help=false input=[(RodBinding name=input source=/broad/hptmp/ami/tmp/CEUTrio_UG_Both_WG/CEUTrio.HiSeq.WGS.b37.listindel.unfiltered.vcf)] recal_file=(RodBinding name=recal_file source=/broad/hptmp/ami/tmp/CEUTrio_UG_Both_WG/CEUTrio.HiSeq.WGS.b37.listindel.recal) tranches_file=/broad/hptmp/ami/tmp/CEUTrio_UG_Both_WG/CEUTrio.HiSeq.WGS.b37.listindel.tranches out=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub no_cmdline_in_header=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub bcf=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub ts_filter_level=95.0 ignore_filter=null mode=INDEL filter_mismatching_base_and_quals=false" +##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 useOriginalQualities=false BQSR=null quantize_quals=0 disable_indel_quals=false emit_original_quals=false preserve_qscores_less_than=6 defaultBaseQualities=-1 validation_strictness=SILENT remove_program_records=false keep_program_records=false unsafe=null num_threads=1 num_cpu_threads=null num_io_threads=null num_bam_file_handles=null read_group_black_list=null pedigree=[] pedigreeString=[] pedigreeValidationType=STRICT allow_intervals_with_unindexed_bam=false generateShadowBCF=false logging_level=INFO log_to_file=null help=false variant=[(RodBinding name=variant source=CEUTrio.HiSeq.WGS.b37.listsnp.recalibrated.filtered.vcf), (RodBinding name=variant2 source=CEUTrio.HiSeq.WGS.b37.listindel.recalibrated.filtered.vcf)] out=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub no_cmdline_in_header=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub bcf=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub genotypemergeoption=UNSORTED filteredrecordsmergetype=KEEP_IF_ANY_UNFILTERED multipleallelesmergetype=BY_TYPE rod_priority_list=null printComplexMerges=false filteredAreUncalled=false minimalVCF=false setKey=set assumeIdenticalSamples=true minimumN=1 suppressCommandLineHeader=false mergeInfoWithMaxAC=false filter_mismatching_base_and_quals=false" +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##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=null useOriginalQualities=false BQSR=null quantize_quals=0 disable_indel_quals=false emit_original_quals=false preserve_qscores_less_than=6 defaultBaseQualities=-1 validation_strictness=SILENT remove_program_records=false keep_program_records=false unsafe=null num_threads=1 num_cpu_threads=null num_io_threads=null num_bam_file_handles=null read_group_black_list=null pedigree=[/broad/hptmp/ami/tmp/CEUTrio.ped] pedigreeString=[] pedigreeValidationType=STRICT allow_intervals_with_unindexed_bam=false generateShadowBCF=false logging_level=INFO log_to_file=null help=false variant=(RodBinding name=variant source=/broad/hptmp/ami/tmp/CEUTrio_UG_Both_WG/CEUTrio.HiSeq.WGS.b37.snps_and_indels.recalibrated.filtered.vcf) DeNovoPrior=1.0E-8 FatherAlleleFirst=false out=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub no_cmdline_in_header=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub bcf=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub filter_mismatching_base_and_quals=false" +##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_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=250 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false BQSR=null quantize_quals=0 disable_indel_quals=false emit_original_quals=false preserve_qscores_less_than=6 defaultBaseQualities=-1 validation_strictness=SILENT remove_program_records=false keep_program_records=false unsafe=null num_threads=2 num_cpu_threads=null num_io_threads=null num_bam_file_handles=null read_group_black_list=null pedigree=[] pedigreeString=[] pedigreeValidationType=STRICT allow_intervals_with_unindexed_bam=false generateShadowBCF=false logging_level=INFO log_to_file=null help=false genotype_likelihoods_model=INDEL p_nonref_model=EXACT pcr_error_rate=1.0E-4 noSLOD=false annotateNDA=false min_base_quality_score=17 max_deletion_fraction=0.05 cap_max_alternate_alleles_for_indels=false min_indel_count_for_genotyping=5 min_indel_fraction_per_sample=0.25 indel_heterozygosity=1.25E-4 indelGapContinuationPenalty=10 indelGapOpenPenalty=45 indelHaplotypeSize=80 noBandedIndel=false indelDebug=false ignoreSNPAlleles=false allReadsSP=false ignoreLaneInfo=false reference_sample_calls=(RodBinding name= source=UNBOUND) reference_sample_name=null sample_ploidy=2 min_quality_score=1 max_quality_score=40 site_quality_prior=20 min_power_threshold_for_calling=0.95 min_reference_depth=100 exclude_filtered_reference_sites=false heterozygosity=0.0010 genotyping_mode=DISCOVERY output_mode=EMIT_VARIANTS_ONLY standard_min_confidence_threshold_for_calling=30.0 standard_min_confidence_threshold_for_emitting=30.0 alleles=(RodBinding name= source=UNBOUND) max_alternate_alleles=3 dbsnp=(RodBinding name=dbsnp source=/humgen/gsa-hpprojects/GATK/bundle/current/b37/dbsnp_135.b37.vcf) comp=[] out=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub no_cmdline_in_header=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub bcf=org.broadinstitute.sting.gatk.io.stubs.VariantContextWriterStub debug_file=null metrics_file=null annotation=[] excludeAnnotation=[] filter_mismatching_base_and_quals=false" +##contig= +##contig= +##contig= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA12878 +chr1 6870 . C T 11.04 . AC=1;AF=0.500;AN=2;DP=16;FS=6.990;MQ=39.29;MQRankSum=-1.036;QD=0.69;ReadPosRankSum=-2.383;SOR=3.258;FractionInformativeReads=0.625;R2_5P_bias=31.099 GT:AD:AF:DP:GQ:PL:GL:GP:PRI:SB:MB 0/1:6,4:0.400:10:45:45,0,50:-4.55,0.00,-5.00:7.864e-02,9.214e-01,4.618e-06:0.00,34.77,37.77:3,3,0,4:4,2,1,3 \ No newline at end of file From 0aff433ee95fe109e8d216e09a99d9673652f64a Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Thu, 7 Jun 2018 10:54:22 -0400 Subject: [PATCH 45/83] restoring SRA support by updating the backing library (#1142) * the underlying ngs-java library that supplies SRA support required updating in order to continue connecting to the SRA servers * fixes SRA tests and restores support * update ngs-java 1.2.4 -> 2.9.0 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1a68161f76..f4cbb34a1a 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ dependencies { compile "org.xerial.snappy:snappy-java:1.1.4" 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" + compile "gov.nih.nlm.ncbi:ngs-java:2.9.0" testCompile "org.scala-lang:scala-library:2.12.1" testCompile "org.scalatest:scalatest_2.12:3.0.1" From efefdd0ed3cf2e068d4b0f4f66d966a1342c3865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B3mez-S=C3=A1nchez?= Date: Fri, 8 Jun 2018 17:21:33 +0200 Subject: [PATCH 46/83] update FastqRecord.toString javadoc to warn users of future behaviour change (#952) * try to encourage downstream tools to avoid FastqRecord.toString for serializing records * Add test for completely null FastqRecord --- .../java/htsjdk/samtools/fastq/FastqRecord.java | 14 +++++++++----- .../htsjdk/samtools/fastq/FastqRecordTest.java | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/main/java/htsjdk/samtools/fastq/FastqRecord.java b/src/main/java/htsjdk/samtools/fastq/FastqRecord.java index 9fbcd39124..4439c0d51b 100755 --- a/src/main/java/htsjdk/samtools/fastq/FastqRecord.java +++ b/src/main/java/htsjdk/samtools/fastq/FastqRecord.java @@ -101,7 +101,7 @@ public String getReadHeader() { /** * Get the read name * - * @return the read name + * @return the read name (may be {@code null}). */ public String getReadName() { return readName; @@ -110,7 +110,7 @@ public String getReadName() { /** * Get the DNA sequence * - * @return read sequence as a string of ACGTN=. + * @return read sequence as a string of ACGTN= (may be {@code null}). */ public String getReadString() { return readString; @@ -128,7 +128,7 @@ public byte[] getReadBases() { /** * Get the base qualities encoded as a FASTQ string * - * @return the quality string + * @return the quality string (may be {@code null}). */ public String getBaseQualityString() { return baseQualityString; @@ -155,7 +155,7 @@ public int getReadLength() { /** * Get the base quality header * - * @return the base quality header + * @return the base quality header (may be {@code null}). */ public String getBaseQualityHeader() { return qualityHeader; @@ -228,7 +228,11 @@ public String toFastQString() { } /** - * Returns {@link #toFastQString()} + * Returns {@link #toFastQString()}. + * + * WARNING: This method will be changed in the future for a simpler representation of the object. + * For code relying on the formatting as a FASTQ String, please refactor your code to use + * {@link #toFastQString()}. */ @Override public String toString() { diff --git a/src/test/java/htsjdk/samtools/fastq/FastqRecordTest.java b/src/test/java/htsjdk/samtools/fastq/FastqRecordTest.java index 9a47a86889..1e0225b570 100644 --- a/src/test/java/htsjdk/samtools/fastq/FastqRecordTest.java +++ b/src/test/java/htsjdk/samtools/fastq/FastqRecordTest.java @@ -1,6 +1,7 @@ package htsjdk.samtools.fastq; import htsjdk.HtsjdkTest; +import htsjdk.samtools.SAMRecord; import htsjdk.samtools.util.TestUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -162,6 +163,22 @@ public void testEmptyString() { //Note: this does not blow up now but it will once we enforce non empty seqLine } + @Test + public void testEmptyRecord() { + //Note: this does not blow up now but it will once we enforce non empty fields + final FastqRecord record = new FastqRecord(null, (String) null, null, null); + // assert how null is handled + Assert.assertNull(record.getReadName()); + Assert.assertNull(record.getReadString()); + Assert.assertNull(record.getBaseQualityString()); + Assert.assertEquals(record.getReadBases(), SAMRecord.NULL_SEQUENCE); + Assert.assertEquals(record.getBaseQualities(), SAMRecord.NULL_QUALS); + // copy the FastqRecord to check that equals and hashCode is working for the null read without blow up + final FastqRecord copy = new FastqRecord(record); + Assert.assertEquals(record, copy); + Assert.assertEquals(record.hashCode(), copy.hashCode()); + } + @Test public void testNotEqualQuals() { final String seqLine1 = "GATTACA"; From 5eb8ee3164684ab9b09bdd38faa4e1b581c024e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B3mez-S=C3=A1nchez?= Date: Mon, 11 Jun 2018 21:15:36 +0200 Subject: [PATCH 47/83] Make SamReader.Type methods public (#1144) --- src/main/java/htsjdk/samtools/SamReader.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/htsjdk/samtools/SamReader.java b/src/main/java/htsjdk/samtools/SamReader.java index 08f93ec179..2f558c23cf 100644 --- a/src/main/java/htsjdk/samtools/SamReader.java +++ b/src/main/java/htsjdk/samtools/SamReader.java @@ -43,13 +43,13 @@ public interface SamReader extends Iterable, Closeable { /** Describes a type of SAM file. */ public abstract class Type { /** A string representation of this type. */ - abstract String name(); + public 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(); + public abstract String indexExtension(); static class TypeImpl extends Type { final String name, fileExtension, indexExtension; @@ -61,7 +61,7 @@ static class TypeImpl extends Type { } @Override - String name() { + public String name() { return name; } @@ -71,7 +71,7 @@ public String fileExtension() { } @Override - String indexExtension() { + public String indexExtension() { return indexExtension; } From 336fa5c23bc2c2d80edcc063b51432dc5772ab7f Mon Sep 17 00:00:00 2001 From: Yossi Farjoun Date: Mon, 11 Jun 2018 15:15:59 -0400 Subject: [PATCH 48/83] Yf sam locus and reference base iterator (#1137) - New iteration capability for iterating by locus, getting pileup and reference base at the same time This is a simple class that combines the capabilities of SAMLocusIterator and ReferenceFileWalker. - Also made AbstractLocusInfo implement Locatable since it's trivial to do so. --- .../SamLocusAndReferenceIterator.java | 115 ++++++++++++++++++ .../samtools/util/AbstractLocusInfo.java | 17 ++- .../samtools/util/AbstractLocusIterator.java | 8 +- .../samtools/util/SamLocusIterator.java | 7 +- .../SamLocusAndReferenceIteratorTest.java | 56 +++++++++ .../samtools/reference/simpleSmallFile.sam | 8 ++ 6 files changed, 203 insertions(+), 8 deletions(-) create mode 100644 src/main/java/htsjdk/samtools/reference/SamLocusAndReferenceIterator.java create mode 100644 src/test/java/htsjdk/samtools/reference/SamLocusAndReferenceIteratorTest.java create mode 100644 src/test/resources/htsjdk/samtools/reference/simpleSmallFile.sam diff --git a/src/main/java/htsjdk/samtools/reference/SamLocusAndReferenceIterator.java b/src/main/java/htsjdk/samtools/reference/SamLocusAndReferenceIterator.java new file mode 100644 index 0000000000..ec8d0e01b5 --- /dev/null +++ b/src/main/java/htsjdk/samtools/reference/SamLocusAndReferenceIterator.java @@ -0,0 +1,115 @@ +/* + * The MIT License + * + * Copyright (c) 2009-2018 The Broad Institute + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT 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.IterableOnceIterator; +import htsjdk.samtools.util.SamLocusIterator; +import htsjdk.samtools.util.SequenceUtil; + +import java.util.List; + +import static htsjdk.samtools.util.SamLocusIterator.*; + +/** + * Iterator that traverses a SAM File and a ReferenceFile, accumulating information on a per-locus basis. + * Only loci that are covered by the input reads are returned. + * Duplicate reads and non-primary alignments are filtered out. + * Iterator element holds both pileup (in the form of a LocusInfo object) and the reference base + * + * @author Yossi Farjoun + */ +public class SamLocusAndReferenceIterator extends IterableOnceIterator { + + private final ReferenceSequenceFileWalker referenceSequenceFileWalker; + private final SamLocusIterator locusIterator; + + /** + * Constructor that takes a {@link ReferenceSequenceFile} and a {@link SamLocusIterator}. + * The inputs must have equal {@link htsjdk.samtools.SAMSequenceDictionary SAMSequenceDictionary}s and an {@link IllegalArgumentException} + * will be thrown otherwise. + * + * @param referenceFile + * @param locusIterator + * + * @throws IllegalArgumentException if arguments have non-equal {@link htsjdk.samtools.SAMSequenceDictionary SAMSequenceDictionary}s + */ + public SamLocusAndReferenceIterator(final ReferenceSequenceFileWalker referenceFile, final SamLocusIterator locusIterator) + throws IllegalArgumentException { + if(!SequenceUtil.areSequenceDictionariesEqual( + locusIterator.getHeader().getSequenceDictionary(), + referenceFile.getSequenceDictionary())) { + throw new IllegalArgumentException("reference and locus iterator have difference dictionaries." + + locusIterator.getHeader().getSequenceDictionary().toString() + + referenceFile.getSequenceDictionary().toString()); + } + this.referenceSequenceFileWalker = referenceFile; + this.locusIterator = locusIterator; + } + + @Override + public boolean hasNext() { + return locusIterator.hasNext(); + } + + @Override + public SAMLocusAndReference next() { + final LocusInfo locus = locusIterator.next(); + final ReferenceSequence referenceSequence = referenceSequenceFileWalker.get(locus.getSequenceIndex(), locus.getSequenceName(), + locus.getSequenceLength()); + + //position is 1-based...arrays are 0-based! + return new SAMLocusAndReference(locus, referenceSequence.getBases()[locus.getPosition() - 1]); + } + + /** Small class to hold together + * a {@link LocusInfo} and the reference base over that locus. + */ + public static class SAMLocusAndReference { + public LocusInfo getLocus() { + return locus; + } + + private final LocusInfo locus; + + public byte getReferenceBase() { + return referenceBase; + } + + private final byte referenceBase; + + public SAMLocusAndReference(final LocusInfo locus, final byte referenceBase) { + this.locus = locus; + this.referenceBase = referenceBase; + } + + /** + * Getter + * @return The {@link RecordAndOffset} that overlap this locus. Extracted + * from the {@link LocusInfo}. + */ + public List getRecordAndOffsets() { + return locus.getRecordAndOffsets(); + } + } +} diff --git a/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java b/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java index d699dce8f5..c4bbbaebb2 100644 --- a/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java +++ b/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java @@ -40,7 +40,7 @@ * @author Darina_Nikolaeva@epam.com, EPAM Systems, Inc. * */ -public class AbstractLocusInfo implements Locus { +public class AbstractLocusInfo implements Locus , Locatable { /** * Reference sequence, to which the reads are aligned. **/ @@ -145,4 +145,19 @@ public int size() { public boolean isEmpty() { return getRecordAndOffsets().isEmpty(); } + + @Override + public String getContig() { + return getSequenceName(); + } + + @Override + public int getStart() { + return getPosition(); + } + + @Override + public int getEnd() { + return getPosition(); + } } diff --git a/src/main/java/htsjdk/samtools/util/AbstractLocusIterator.java b/src/main/java/htsjdk/samtools/util/AbstractLocusIterator.java index bbfb416f8c..9f5134f627 100644 --- a/src/main/java/htsjdk/samtools/util/AbstractLocusIterator.java +++ b/src/main/java/htsjdk/samtools/util/AbstractLocusIterator.java @@ -147,6 +147,13 @@ public abstract class AbstractLocusIterator overlapDetector = new OverlapDetector<>(0, 0); + overlapDetector.addAll(intervalList.getIntervals(), intervalList.getIntervals()); + + for (final SamLocusAndReferenceIterator.SAMLocusAndReference samLocusAndReference : samLocusAndReferences) { + // The sam file only has coverage in the intervals that are within 'intervalList', and there the coverage should + // be exactly 2 since there are two overlapping, paired reads. This is what this test is testing: + Assert.assertEquals(samLocusAndReference.getRecordAndOffsets().size(), overlapDetector.overlapsAny(samLocusAndReference.getLocus()) ? 2 : 0, "Position:" + samLocusAndReference.getLocus().toString()); + + // all the reads are equal to the reference...this is what this test is testing. + for (final SamLocusIterator.RecordAndOffset recordAndOffset : samLocusAndReference.getRecordAndOffsets()) + Assert.assertTrue(SequenceUtil.basesEqual(samLocusAndReference.getReferenceBase(), recordAndOffset.getReadBase()), "Record: " + recordAndOffset.getRecord() + " Position:" + samLocusAndReference.getLocus().toString()); + } + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testSamLocusAndReferenceIteratorMismatch() { + final File reference = new File(TEST_DATA_DIR, "reference_with_trailing_whitespace.fasta"); + final File samFile = new File(TEST_DATA_DIR, "simpleSmallFile.sam"); + final ReferenceSequenceFile referenceSequenceFile = new FastaSequenceFile(reference, false); + final ReferenceSequenceFileWalker referenceSequenceFileWalker = new ReferenceSequenceFileWalker(referenceSequenceFile); + + final SamReader samReader = SamReaderFactory.makeDefault().open(samFile); + final SamLocusIterator samLocusIterator = new SamLocusIterator(samReader); + final SamLocusAndReferenceIterator shouldThrow = new SamLocusAndReferenceIterator(referenceSequenceFileWalker, samLocusIterator); + } +} diff --git a/src/test/resources/htsjdk/samtools/reference/simpleSmallFile.sam b/src/test/resources/htsjdk/samtools/reference/simpleSmallFile.sam new file mode 100644 index 0000000000..f37fe2525d --- /dev/null +++ b/src/test/resources/htsjdk/samtools/reference/simpleSmallFile.sam @@ -0,0 +1,8 @@ +@HD VN:1.0 SO:coordinate +@SQ SN:chrM LN:16571 UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb +@SQ SN:chr20 LN:1000000 UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta M5:b4eac854d70893986ac578c53c2324f1 +@RG ID:62A40.2 PL:illumina PU:62A40AAXX101028.2 LB:Solexa-45345 DT:2010-10-28T00:00:00-0400 SM:RRBS885 CN:BI +62A40AAXX101028:2:93:3981:7576 99 chrM 1 60 36M chrM 1 0 GATCACAGGTCTATCACCCTATTAACCACTCACGGG AAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBB RG:Z:62A40.2 +62A40AAXX101028:2:93:3981:7576 147 chrM 1 60 36M chrM 1 0 GATCACAGGTCTATCACCCTATTAACCACTCACGGG BBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA RG:Z:62A40.2 +62A40AAXX101028:1:93:3981:7576 99 chr20 8401 60 60M chr20 8401 0 tgatctgtgcacaccactatccaaccgatcccgaggctccaccctggccactcttgtgtg AAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAABBBBBBBBB RG:Z:62A40.2 +62A40AAXX101028:1:93:3981:7576 147 chr20 8401 60 60M chr20 8401 0 tgatctgtgcacaccactatccaaccgatcccgaggctccaccctggccactcttgtgtg BBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBAAAAAAAAAAAAAAAAAAAA RG:Z:62A40.2 From 71c5a69cfbcc0b5bbf2c6f18b294900e649ea1ac Mon Sep 17 00:00:00 2001 From: Tom White Date: Tue, 12 Jun 2018 16:04:58 +0100 Subject: [PATCH 49/83] Add method to load tribble index from a stream. (#1145) part of #1112 --- .../htsjdk/tribble/index/IndexFactory.java | 22 ++++++++++++++----- .../java/htsjdk/tribble/index/IndexTest.java | 8 +++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/main/java/htsjdk/tribble/index/IndexFactory.java b/src/main/java/htsjdk/tribble/index/IndexFactory.java index 10866b88af..1c9aee1df0 100644 --- a/src/main/java/htsjdk/tribble/index/IndexFactory.java +++ b/src/main/java/htsjdk/tribble/index/IndexFactory.java @@ -162,7 +162,7 @@ public static IndexType getIndexType(final BufferedInputStream is) { * @param indexFile from which to load the index */ public static Index loadIndex(final String indexFile) { - return loadIndex(indexFile, null); + return loadIndex(indexFile, (Function) null); } /** @@ -174,18 +174,30 @@ public static Index loadIndex(final String indexFile) { * {@link java.nio.file.Path} */ public static Index loadIndex(final String indexFile, Function indexWrapper) { + try { + return loadIndex(indexFile, indexFileInputStream(indexFile, indexWrapper)); + } catch (final IOException ex) { + throw new TribbleException.UnableToReadIndexFile("Unable to read index file", indexFile, ex); + } + } + + /** + * Load in index from the specified stream. Note that the caller is responsible for decompressing the stream if necessary. + * + * @param source the stream source (typically the file name) + * @param inputStream the raw byte stream of the index + */ + public static Index loadIndex(final String source, final InputStream inputStream) { // Must be buffered, because getIndexType uses mark and reset - try (BufferedInputStream bufferedInputStream = new BufferedInputStream(indexFileInputStream(indexFile, indexWrapper), Defaults.NON_ZERO_BUFFER_SIZE)) { + try (BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream, Defaults.NON_ZERO_BUFFER_SIZE)) { final Class indexClass = IndexType.getIndexType(bufferedInputStream).getIndexType(); final Constructor ctor = indexClass.getConstructor(InputStream.class); return ctor.newInstance(bufferedInputStream); } catch (final TribbleException ex) { throw ex; - } catch (final IOException ex) { - throw new TribbleException.UnableToReadIndexFile("Unable to read index file", indexFile, ex); } catch (final InvocationTargetException ex) { if (ex.getCause() instanceof EOFException) { - throw new TribbleException.CorruptedIndexFile("Index file is corrupted", indexFile, ex); + throw new TribbleException.CorruptedIndexFile("Index file is corrupted", source, ex); } throw new RuntimeException(ex); } catch (final Exception ex) { diff --git a/src/test/java/htsjdk/tribble/index/IndexTest.java b/src/test/java/htsjdk/tribble/index/IndexTest.java index 2764f2800e..61b8962533 100644 --- a/src/test/java/htsjdk/tribble/index/IndexTest.java +++ b/src/test/java/htsjdk/tribble/index/IndexTest.java @@ -19,6 +19,7 @@ import org.testng.annotations.Test; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.file.FileSystem; @@ -59,6 +60,13 @@ public void testMassiveQuery(final int start, final int mid, final int mid2, fin 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); } + @Test() + public void testLoadFromStream() throws IOException { + LinearIndex index = (LinearIndex)IndexFactory.loadIndex(MassiveIndexFile.getAbsolutePath(), new FileInputStream(MassiveIndexFile)); + List sequenceNames = index.getSequenceNames(); + Assert.assertEquals(sequenceNames.size(), 1); + Assert.assertEquals(sequenceNames.get(0), CHR); + } @DataProvider(name = "writeIndexData") public Object[][] writeIndexData() { From 52ec0827b679c250fc75954289e12c777fffd050 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Tue, 12 Jun 2018 12:06:09 -0400 Subject: [PATCH 50/83] making public static fields in SamReader.Type final (#1146) * there were a number of fields that should be constants but were not * this technically breaks compatibility, but it's very unlikely that anyone is actually relying on setting these fields --- src/main/java/htsjdk/samtools/SamReader.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/htsjdk/samtools/SamReader.java b/src/main/java/htsjdk/samtools/SamReader.java index 2f558c23cf..e0c147b934 100644 --- a/src/main/java/htsjdk/samtools/SamReader.java +++ b/src/main/java/htsjdk/samtools/SamReader.java @@ -81,10 +81,10 @@ public String toString() { } } - 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); + public static final Type SRA_TYPE = new TypeImpl("SRA", "sra", null); + public static final Type CRAM_TYPE = new TypeImpl("CRAM", "cram", "crai"); + public static final Type BAM_TYPE = new TypeImpl("BAM", "bam", "bai"); + public static final Type SAM_TYPE = new TypeImpl("SAM", "sam", null); } /** From 8b55de6295be65a1bdd5b97e1c5143eef01f2902 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Thu, 14 Jun 2018 16:45:55 -0400 Subject: [PATCH 51/83] Add new class VCFHeaderReader (#1148) * adding a new class VCFHeaderReader to read a VCFHeader from a stream without knowing in advance if the file is VCF or BCF, or compressed or not. * part of #1112 --- .../htsjdk/variant/utils/VCFHeaderReader.java | 61 +++++++++++++++++++ .../variant/utils/VCFHeaderReaderTest.java | 46 ++++++++++++++ .../corrupt_file_that_starts_with_#.vcf | 3 + 3 files changed, 110 insertions(+) create mode 100644 src/main/java/htsjdk/variant/utils/VCFHeaderReader.java create mode 100644 src/test/java/htsjdk/variant/utils/VCFHeaderReaderTest.java create mode 100644 src/test/resources/htsjdk/variant/corrupt_file_that_starts_with_#.vcf diff --git a/src/main/java/htsjdk/variant/utils/VCFHeaderReader.java b/src/main/java/htsjdk/variant/utils/VCFHeaderReader.java new file mode 100644 index 0000000000..b274c29e42 --- /dev/null +++ b/src/main/java/htsjdk/variant/utils/VCFHeaderReader.java @@ -0,0 +1,61 @@ +package htsjdk.variant.utils; + +import htsjdk.samtools.SamStreams; +import htsjdk.samtools.cram.io.InputStreamUtils; +import htsjdk.samtools.seekablestream.SeekableStream; +import htsjdk.tribble.Feature; +import htsjdk.tribble.FeatureCodec; +import htsjdk.tribble.FeatureCodecHeader; +import htsjdk.tribble.TribbleException; +import htsjdk.variant.bcf2.BCF2Codec; +import htsjdk.variant.bcf2.BCFVersion; +import htsjdk.variant.vcf.VCFCodec; +import htsjdk.variant.vcf.VCFHeader; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.zip.GZIPInputStream; + +/** + * Utility class to read a VCF header without being told beforehand whether the input is VCF or BCF. + */ +public final class VCFHeaderReader { + + private VCFHeaderReader(){} + + /** + * Read a VCF header from a stream that may be a VCF file (possibly gzip or block compressed) or a BCF file. + * After successfully reading a header the stream is positioned immediately after the header, otherwise, if an + * exception is thrown, the state of the stream is undefined. + * + * @param in the stream to read the header from + * @return the VCF header read from the stream + * @throws TribbleException.InvalidHeader if the header in the file is invalid + * @throws IOException if an IOException occurs while reading the header + */ + public static VCFHeader readHeaderFrom(final SeekableStream in) throws IOException { + final long initialPos = in.position(); + byte[] magicBytes = InputStreamUtils.readFully(bufferAndDecompressIfNecessary(in), BCFVersion.MAGIC_HEADER_START.length); + in.seek(initialPos); + if (magicBytes[0] == '#') { // VCF + return readHeaderFrom(in, new VCFCodec()); + } else if (Arrays.equals(magicBytes, BCFVersion.MAGIC_HEADER_START)) { + return readHeaderFrom(in, new BCF2Codec()); + } + throw new TribbleException.InvalidHeader("No VCF header found in " + in.getSource()); + } + + private static InputStream bufferAndDecompressIfNecessary(final InputStream in) throws IOException { + BufferedInputStream bis = new BufferedInputStream(in); + // despite the name, SamStreams.isGzippedSAMFile looks for any gzipped stream (including block compressed) + return SamStreams.isGzippedSAMFile(bis) ? new GZIPInputStream(bis) : bis; + } + + private static VCFHeader readHeaderFrom(final InputStream in, final FeatureCodec featureCodec) throws IOException { + InputStream is = bufferAndDecompressIfNecessary(in); + FeatureCodecHeader headerCodec = featureCodec.readHeader(featureCodec.makeSourceFromStream(is)); + return (VCFHeader) headerCodec.getHeaderValue(); + } +} diff --git a/src/test/java/htsjdk/variant/utils/VCFHeaderReaderTest.java b/src/test/java/htsjdk/variant/utils/VCFHeaderReaderTest.java new file mode 100644 index 0000000000..cc2c5b7545 --- /dev/null +++ b/src/test/java/htsjdk/variant/utils/VCFHeaderReaderTest.java @@ -0,0 +1,46 @@ +package htsjdk.variant.utils; + +import htsjdk.HtsjdkTest; +import htsjdk.samtools.seekablestream.SeekableFileStream; +import htsjdk.tribble.TribbleException; +import htsjdk.variant.vcf.VCFHeader; +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; + +public class VCFHeaderReaderTest extends HtsjdkTest { + @DataProvider(name = "files") + Object[][] pathsData() { + + final String TEST_DATA_DIR = "src/test/resources/htsjdk/variant/"; + return new Object[][]{ + {TEST_DATA_DIR + "VcfThatLacksAnIndex.bcf"}, + {TEST_DATA_DIR + "VcfThatLacksAnIndex.vcf"}, + {TEST_DATA_DIR + "VcfThatLacksAnIndex.vcf.bgz"}, + {TEST_DATA_DIR + "VcfThatLacksAnIndex.vcf.gz"}, + }; + } + + @Test(dataProvider = "files") + public void testReadHeaderFrom(final String file) throws IOException { + VCFHeader vcfHeader = VCFHeaderReader.readHeaderFrom(new SeekableFileStream(new File(file))); + Assert.assertNotNull(vcfHeader); + } + + @DataProvider + public Object[][] invalidFiles(){ + return new Object[][] { + { new File("src/test/resources/htsjdk/samtools/empty.bam")}, + {new File("src/test/resources/htsjdk/variant/corrupt_file_that_starts_with_#.vcf")} + }; + } + + @Test(dataProvider = "invalidFiles", expectedExceptions = TribbleException.InvalidHeader.class) + public void testReadHeaderForInvalidFile(File file) throws IOException { + VCFHeaderReader.readHeaderFrom(new SeekableFileStream(file)); + } +} diff --git a/src/test/resources/htsjdk/variant/corrupt_file_that_starts_with_#.vcf b/src/test/resources/htsjdk/variant/corrupt_file_that_starts_with_#.vcf new file mode 100644 index 0000000000..340e78a6e1 --- /dev/null +++ b/src/test/resources/htsjdk/variant/corrupt_file_that_starts_with_#.vcf @@ -0,0 +1,3 @@ +# +is not +a vcf \ No newline at end of file From 9ea0a030855a7304d3a51fafd14aa91370fbe4d0 Mon Sep 17 00:00:00 2001 From: Tom White Date: Fri, 15 Jun 2018 22:07:51 +0100 Subject: [PATCH 52/83] new method CRAMFileReader.createIndexIterator (#1120) * added a new method CRAMFileReader.createIndexIterator get reads overlapping intervals in a cram file, analogous to BAMFileReader#createIndexIterator * part of #1112 --- .../java/htsjdk/samtools/CRAMFileReader.java | 43 +++++++++++++------ .../samtools/CRAMFileCRAIIndexTest.java | 23 ++++++++++ 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/main/java/htsjdk/samtools/CRAMFileReader.java b/src/main/java/htsjdk/samtools/CRAMFileReader.java index a7a40889c4..889ac4c290 100644 --- a/src/main/java/htsjdk/samtools/CRAMFileReader.java +++ b/src/main/java/htsjdk/samtools/CRAMFileReader.java @@ -466,6 +466,32 @@ void enableFileSource(final SamReader reader, final boolean enabled) { iterator.setFileSource(enabled ? reader : null); } + /** + * Prepare to iterate through SAMRecords that match the intersection of the given intervals and chunk boundaries. + * @param intervals the intervals to restrict reads to + * @param contained if true, return records that are strictly + * contained in the intervals, otherwise return records that overlap + * @param filePointers file pointer pairs corresponding to chunk boundaries for the + * intervals + */ + public CloseableIterator createIndexIterator(final QueryInterval[] intervals, + final boolean contained, + final long[] filePointers) { + return new CRAMIntervalIterator(intervals, contained, filePointers); + } + + // convert queries -> merged BAMFileSpan -> coordinate array + private static long[] coordinatesFromQueryIntervals(BAMIndex index, QueryInterval[] queries) { + ArrayList spanList = new ArrayList<>(1); + Arrays.asList(queries).forEach(qi -> spanList.add(index.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(); + } + private class CRAMIntervalIterator extends BAMQueryMultipleIntervalsIteratorFilter implements CloseableIterator { @@ -475,9 +501,12 @@ private class CRAMIntervalIterator extends BAMQueryMultipleIntervalsIteratorFilt SAMRecord nextRec = null; public CRAMIntervalIterator(final QueryInterval[] queries, final boolean contained) { + this(queries, contained, coordinatesFromQueryIntervals(getIndex(), queries)); + } + + public CRAMIntervalIterator(final QueryInterval[] queries, final boolean contained, final long[] coordinates) { super(queries, contained); - long[] coordinates = coordinatesFromQueryIntervals(getIndex(), queries); if (coordinates != null && coordinates.length != 0) { try { unfilteredIterator = new CRAMIterator( @@ -493,18 +522,6 @@ public CRAMIntervalIterator(final QueryInterval[] queries, final boolean contain } } - // convert queries -> merged BAMFileSpan -> coordinate array - private long[] coordinatesFromQueryIntervals(BAMIndex index, QueryInterval[] queries) { - ArrayList 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 void close() { if (unfilteredIterator != null) { diff --git a/src/test/java/htsjdk/samtools/CRAMFileCRAIIndexTest.java b/src/test/java/htsjdk/samtools/CRAMFileCRAIIndexTest.java index b919c46191..b9c10334a6 100644 --- a/src/test/java/htsjdk/samtools/CRAMFileCRAIIndexTest.java +++ b/src/test/java/htsjdk/samtools/CRAMFileCRAIIndexTest.java @@ -304,6 +304,29 @@ public void testQueryInterval() throws IOException { reader.close(); } + @Test + public void testQueryIntervalWithFilePointers() 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)}; + BAMFileSpan fileSpan = BAMFileReader.getFileSpan(query, reader.getIndex()); + final CloseableIterator iterator = reader.createIndexIterator(query, false, fileSpan.toCoordinateArray()); + 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); From 3a20218c52038925ef01ca760daaa90dbb30d60b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B3mez-S=C3=A1nchez?= Date: Mon, 18 Jun 2018 20:43:22 +0200 Subject: [PATCH 53/83] Add SAMFileWriterFactory methods that take referenceFile as a Path(#1005) * Add SAMFileWriterFactory methods that accepta java.nio.Path as the referenceFile * this allows you to use CRAM with a Path for the reference --- .../htsjdk/samtools/SAMFileWriterFactory.java | 68 ++++++++++++++++++- .../samtools/SAMFileWriterFactoryTest.java | 18 +++++ .../htsjdk/samtools/SAMIntegerTagTest.java | 2 +- 3 files changed, 84 insertions(+), 4 deletions(-) diff --git a/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java b/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java index a137efd530..f4df7b4691 100644 --- a/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java +++ b/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java @@ -467,6 +467,21 @@ public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presor * */ public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presorted, final Path outputPath, final File referenceFasta) { + return makeWriter(header, presorted, outputPath, null == referenceFasta ? null : referenceFasta.toPath()); + } + + /** + * + * Create a SAM, BAM or CRAM writer based on examination of the outputPath 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 outputPath 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 outputPath + * + */ + public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presorted, final Path outputPath, final Path referenceFasta) { if (null != outputPath && outputPath.toString().endsWith(SamReader.Type.CRAM_TYPE.fileExtension())) { return makeCRAMWriter(header, presorted, outputPath, referenceFasta); } @@ -487,6 +502,21 @@ public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presor * @return CRAMFileWriter */ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final OutputStream stream, final File referenceFasta) { + return makeCRAMWriter(header, stream, null == referenceFasta ? null : referenceFasta.toPath()); + } + + /** + * 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 Path referenceFasta) { // create the CRAMFileWriter directly without propagating factory settings final CRAMFileWriter writer = new CRAMFileWriter(stream, new ReferenceSource(referenceFasta), header, null); setCRAMWriterDefaults(writer); @@ -506,7 +536,7 @@ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final OutputStr * */ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final File outputFile, final File referenceFasta) { - return createCRAMWriterWithSettings(header, true, outputFile.toPath(), referenceFasta); + return createCRAMWriterWithSettings(header, true, outputFile.toPath(), null == referenceFasta ? null : referenceFasta.toPath()); } /** @@ -522,7 +552,7 @@ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final File outp * */ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final Path outputPath, final File referenceFasta) { - return createCRAMWriterWithSettings(header, true, outputPath, referenceFasta); + return createCRAMWriterWithSettings(header, true, outputPath, null == referenceFasta ? null : referenceFasta.toPath()); } /** @@ -555,6 +585,38 @@ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final boolean p * */ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final boolean presorted, final Path output, final File referenceFasta) { + return createCRAMWriterWithSettings(header, presorted, output, null == referenceFasta ? null : referenceFasta.toPath()); + } + + /** + * 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 outputPath 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 Path outputPath, final Path referenceFasta) { + return createCRAMWriterWithSettings(header, true, outputPath, 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 output 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 Path output, final Path referenceFasta) { return createCRAMWriterWithSettings(header, presorted, output, referenceFasta); } @@ -573,7 +635,7 @@ private CRAMFileWriter createCRAMWriterWithSettings( final SAMFileHeader header, final boolean presorted, final Path outputFile, - final File referenceFasta) { + final Path referenceFasta) { OutputStream cramOS = null; OutputStream indexOS = null ; diff --git a/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java b/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java index 9abf93200b..e30c3dc45e 100644 --- a/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java +++ b/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java @@ -347,6 +347,24 @@ public void testMakeWriterPath(String extension) throws Exception { } } + @Test(dataProvider="bamOrCramWriter") + public void testMakeWriterPathAndReferencePath(String extension) throws Exception { + final String referenceName = "hg19mini.fasta"; + try (FileSystem jimfs = Jimfs.newFileSystem(Configuration.unix())) { + Path outputPath = jimfs.getPath("testMakeWriterPath" + extension); + Files.deleteIfExists(outputPath); + final SAMFileHeader header = new SAMFileHeader(); + final SAMFileWriterFactory factory = createWriterFactoryWithOptions(header); + final Path referencePath = jimfs.getPath(referenceName); + Files.copy(new File(TEST_DATA_DIR, referenceName).toPath(), referencePath); + + int nRecs; + try (final SAMFileWriter samWriter = factory.makeWriter(header, false, outputPath, referencePath)) { + nRecs = fillSmallBam(samWriter); + } + verifyWriterOutput(outputPath, new ReferenceSource(referencePath), nRecs, true); + } + } @Test public void testMakeCRAMWriterWithOptions() throws Exception { diff --git a/src/test/java/htsjdk/samtools/SAMIntegerTagTest.java b/src/test/java/htsjdk/samtools/SAMIntegerTagTest.java index 3fa38df62c..c211d32878 100644 --- a/src/test/java/htsjdk/samtools/SAMIntegerTagTest.java +++ b/src/test/java/htsjdk/samtools/SAMIntegerTagTest.java @@ -348,7 +348,7 @@ private void testRoundtripIntegerAttribute(final Number value, final FORMAT form w = new SAMFileWriterFactory().makeBAMWriter(header, false, baos); break; case CRAM: - w = new SAMFileWriterFactory().makeCRAMWriter(header, baos, null); + w = new SAMFileWriterFactory().makeCRAMWriter(header, baos, (File) null); break; default: throw new RuntimeException("Unknown format: " + format); From 72818a014c24b10280de66e38ce2efb3f4c09a81 Mon Sep 17 00:00:00 2001 From: Tom White Date: Mon, 18 Jun 2018 20:27:35 +0100 Subject: [PATCH 54/83] Allow ReferenceSequenceFileFactory to load from streams (#1123) * Add a method to open a ReferenceSequence by passing a FASTA and it's index as SeekableStreams * This is useful for clients that are using filesystems that don't have an nio.Path provider available but can produce a stream * part of #1112 --- .../reference/AbstractFastaSequenceFile.java | 43 ++++++++---- .../AbstractIndexedFastaSequenceFile.java | 14 +++- .../samtools/reference/FastaSequenceFile.java | 36 ++++++++-- .../reference/FastaSequenceIndex.java | 27 ++++--- .../reference/IndexedFastaSequenceFile.java | 15 ++++ .../ReferenceSequenceFileFactory.java | 50 +++++++++++++ .../ReadableSeekableStreamByteChannel.java | 70 +++++++++++++++++++ .../AbstractIndexedFastaSequenceFileTest.java | 23 ++++-- .../reference/FastaSequenceFileTest.java | 26 +++++++ .../reference/FastaSequenceIndexTest.java | 9 ++- 10 files changed, 274 insertions(+), 39 deletions(-) create mode 100644 src/main/java/htsjdk/samtools/seekablestream/ReadableSeekableStreamByteChannel.java diff --git a/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java index 9c5360c1d6..701d421515 100644 --- a/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java +++ b/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java @@ -32,6 +32,7 @@ import htsjdk.samtools.util.IOUtil; import java.io.File; +import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; @@ -41,6 +42,7 @@ */ abstract class AbstractFastaSequenceFile implements ReferenceSequenceFile { private final Path path; + private final String source; protected SAMSequenceDictionary sequenceDictionary; /** @@ -57,20 +59,13 @@ abstract class AbstractFastaSequenceFile implements ReferenceSequenceFile { */ AbstractFastaSequenceFile(final Path path) { this.path = path; + this.source = path == null ? "unknown" : path.toAbsolutePath().toString(); 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(); + try (InputStream dictionaryIn = Files.newInputStream(dictionary)) { + this.sequenceDictionary = ReferenceSequenceFileFactory.loadDictionary(dictionaryIn); } catch (Exception e) { throw new SAMException("Could not open sequence dictionary file: " + dictionary, e); @@ -78,6 +73,18 @@ abstract class AbstractFastaSequenceFile implements ReferenceSequenceFile { } } + /** + * Constructs an {@link AbstractFastaSequenceFile} with an optional sequence dictionary. + * @param path Fasta file to read. Also acts as a prefix for supporting files. + * @param source Named source used for error messages. + * @param sequenceDictionary The sequence dictionary, or null if there isn't one. + */ + AbstractFastaSequenceFile(final Path path, final String source, final SAMSequenceDictionary sequenceDictionary) { + this.path = path; + this.source = source; + this.sequenceDictionary = sequenceDictionary; + } + protected static File findSequenceDictionary(final File file) { if (file == null) { return null; @@ -111,6 +118,11 @@ protected Path getPath() { return path; } + /** Returns the named source of the reference file. */ + protected String getSource() { + return source; + } + /** * Returns the list of sequence records associated with the reference sequence if found * otherwise null. @@ -122,12 +134,15 @@ public SAMSequenceDictionary getSequenceDictionary() { /** Returns the full path to the reference file. */ protected String getAbsolutePath() { + if (path == null) { + return null; + } return path.toAbsolutePath().toString(); } - /** Returns the full path to the reference file. */ + /** Returns the full path to the reference file, or the source if no path was specified. */ public String toString() { - return getAbsolutePath(); + return source; } /** default implementation -- override if index is supported */ @@ -137,13 +152,13 @@ public String toString() { /** default implementation -- override if index is supported */ @Override public ReferenceSequence getSequence( String contig ) { - throw new UnsupportedOperationException("Index does not appear to exist for " + getAbsolutePath() + ". samtools faidx can be used to create an index"); + throw new UnsupportedOperationException("Index does not appear to exist for " + getSource() + ". samtools faidx can be used to create an index"); } /** default implementation -- override if index is supported */ @Override 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"); + throw new UnsupportedOperationException("Index does not appear to exist for " + getSource() + ". samtools faidx can be used to create an index"); } } diff --git a/src/main/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFile.java index fa77314af6..331c93bbc7 100644 --- a/src/main/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFile.java +++ b/src/main/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFile.java @@ -69,6 +69,18 @@ protected AbstractIndexedFastaSequenceFile(final Path path, final FastaSequenceI } } + /** + * Initialise the given indexed fasta sequence file stream. + * @param source The named source of the reference file (used in error messages). + * @param index The fasta index. + * @param dictionary The sequence dictionary, or null if there isn't one. + */ + protected AbstractIndexedFastaSequenceFile(String source, final FastaSequenceIndex index, SAMSequenceDictionary dictionary) { + super(null, source, dictionary); + this.index = index; + reset(); + } + protected static Path findRequiredFastaIndexFile(Path fastaFile) throws FileNotFoundException { Path ret = findFastaIndex(fastaFile); if (ret == null) throw new FileNotFoundException(ReferenceSequenceFileFactory.getFastaIndexFileName(fastaFile) + " not found."); @@ -192,7 +204,7 @@ public ReferenceSequence getSubsequenceAt( String contig, long start, long stop startOffset += readFromPosition(channelBuffer, indexEntry.getLocation()+startOffset); } catch(IOException ex) { - throw new SAMException("Unable to load " + contig + "(" + start + ", " + stop + ") from " + getAbsolutePath(), ex); + throw new SAMException("Unable to load " + contig + "(" + start + ", " + stop + ") from " + getSource(), ex); } // Reset the buffer for outbound transfers. diff --git a/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java index 744d797732..2016b7010f 100644 --- a/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java +++ b/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java @@ -26,12 +26,15 @@ import htsjdk.samtools.Defaults; import htsjdk.samtools.SAMException; +import htsjdk.samtools.SAMSequenceDictionary; import htsjdk.samtools.SAMSequenceRecord; +import htsjdk.samtools.seekablestream.SeekableStream; import htsjdk.samtools.util.FastLineReader; import htsjdk.samtools.util.IOUtil; import htsjdk.samtools.util.StringUtil; import java.io.File; +import java.io.IOException; import java.nio.file.Path; /** @@ -42,6 +45,7 @@ public class FastaSequenceFile extends AbstractFastaSequenceFile { private final boolean truncateNamesAtWhitespace; + private final SeekableStream seekableStream; private FastLineReader in; private int sequenceIndex = -1; private final byte[] basesBuffer = new byte[Defaults.NON_ZERO_BUFFER_SIZE]; @@ -56,9 +60,21 @@ public FastaSequenceFile(final File file, final boolean truncateNamesAtWhitespac public FastaSequenceFile(final Path path, final boolean truncateNamesAtWhitespace) { super(path); this.truncateNamesAtWhitespace = truncateNamesAtWhitespace; + this.seekableStream = null; this.in = new FastLineReader(IOUtil.openFileForReading(path)); } + /** + * Constructs a FastaSequenceFile that reads from the specified stream (which must not be compressed, i.e. + * the caller is responsible for decompressing the stream). + */ + public FastaSequenceFile(String source, final SeekableStream seekableStream, SAMSequenceDictionary dictionary, final boolean truncateNamesAtWhitespace) { + super(null, source, dictionary); + this.truncateNamesAtWhitespace = truncateNamesAtWhitespace; + this.seekableStream = seekableStream; + this.in = new FastLineReader(seekableStream); + } + /** * It's good to call this to free up memory. */ @@ -88,9 +104,17 @@ public ReferenceSequence nextSequence() { @Override public void reset() { this.sequenceIndex = -1; - this.in.close(); - this.in = new FastLineReader(IOUtil.openFileForReading(getPath())); - + if (getPath() != null) { + this.in.close(); + this.in = new FastLineReader(IOUtil.openFileForReading(getPath())); + } else { + try { + this.seekableStream.seek(0); + } catch (IOException e) { + throw new SAMException("Problem seeking to start of stream during reset", e); + } + this.in = new FastLineReader(this.seekableStream); + } } private String readSequenceName() { @@ -100,7 +124,7 @@ private String readSequenceName() { } final byte b = in.getByte(); if (b != '>') { - throw new SAMException("Format exception reading FASTA " + getAbsolutePath() + ". Expected > but saw chr(" + + throw new SAMException("Format exception reading FASTA " + getSource() + ". Expected > but saw chr(" + b + ") at start of sequence with index " + this.sequenceIndex); } final byte[] nameBuffer = new byte[4096]; @@ -111,11 +135,11 @@ private String readSequenceName() { } nameLength += in.readToEndOfOutputBufferOrEoln(nameBuffer, nameLength); if (nameLength == nameBuffer.length && !in.atEoln()) { - throw new SAMException("Sequence name too long in FASTA " + getAbsolutePath()); + throw new SAMException("Sequence name too long in FASTA " + getSource()); } } while (!in.atEoln()); if (nameLength == 0) { - throw new SAMException("Missing sequence name in FASTA " + getAbsolutePath()); + throw new SAMException("Missing sequence name in FASTA " + getSource()); } String name = StringUtil.bytesToString(nameBuffer, 0, nameLength).trim(); if (truncateNamesAtWhitespace) { diff --git a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java index e9907b2de8..06aa2007dc 100644 --- a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java +++ b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java @@ -31,6 +31,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.nio.file.Files; @@ -66,7 +67,19 @@ public FastaSequenceIndex( File indexFile ) { */ public FastaSequenceIndex( Path indexFile ) { IOUtil.assertFileIsReadable(indexFile); - parseIndexFile(indexFile); + try (InputStream in = Files.newInputStream(indexFile)) { + parseIndexFile(in); + } catch (IOException e) { + throw new SAMException("Fasta index file could not be opened: " + indexFile, e); + } + } + + /** + * Build a sequence index from the specified input stream. + * @param in InputStream to read from. + */ + public FastaSequenceIndex(InputStream in) { + parseIndexFile(in); } /** @@ -124,12 +137,10 @@ public boolean equals(Object other) { /** * 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. + * @param in InputStream to parse. */ - private void parseIndexFile(Path indexFile) { - try { - Scanner scanner = new Scanner(indexFile); + private void parseIndexFile(InputStream in) { + try (Scanner scanner = new Scanner(in)) { int sequenceIndex = 0; while( scanner.hasNext() ) { // Tokenize and validate the index line. @@ -154,10 +165,6 @@ private void parseIndexFile(Path indexFile) { // 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); - } } diff --git a/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java index 0c8dfacb8b..52307ea56d 100644 --- a/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java +++ b/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java @@ -25,6 +25,9 @@ package htsjdk.samtools.reference; import htsjdk.samtools.SAMException; +import htsjdk.samtools.SAMSequenceDictionary; +import htsjdk.samtools.seekablestream.ReadableSeekableStreamByteChannel; +import htsjdk.samtools.seekablestream.SeekableStream; import htsjdk.samtools.util.BlockCompressedInputStream; import htsjdk.samtools.util.IOUtil; @@ -95,6 +98,18 @@ public IndexedFastaSequenceFile(final Path path) throws FileNotFoundException { this(path, new FastaSequenceIndex((findRequiredFastaIndexFile(path)))); } + /** + * Initialise the given indexed fasta sequence file stream. + * @param source The named source of the reference file (used in error messages). + * @param in The input stream to read the fasta file from. + * @param index The fasta index. + * @param dictionary The sequence dictionary, or null if there isn't one. + */ + public IndexedFastaSequenceFile(String source, final SeekableStream in, final FastaSequenceIndex index, SAMSequenceDictionary dictionary) { + super(source, index, dictionary); + this.channel = new ReadableSeekableStreamByteChannel(in); + } + /** * @deprecated use {@link ReferenceSequenceFileFactory#canCreateIndexedFastaReader(Path)} instead. */ diff --git a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java index 437f53ce4d..3e216b715a 100644 --- a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java +++ b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java @@ -27,6 +27,11 @@ import htsjdk.samtools.SAMException; import htsjdk.samtools.util.BlockCompressedInputStream; import htsjdk.samtools.util.GZIIndex; +import htsjdk.samtools.SAMFileHeader; +import htsjdk.samtools.SAMSequenceDictionary; +import htsjdk.samtools.SAMTextHeaderCodec; +import htsjdk.samtools.seekablestream.SeekableStream; +import htsjdk.samtools.util.BufferedLineReader; import htsjdk.samtools.util.IOUtil; import java.io.BufferedInputStream; @@ -166,6 +171,35 @@ public static boolean canCreateIndexedFastaReader(final Path fastaFile) { return false; } + /** + * Return an instance of ReferenceSequenceFile using the given fasta sequence file stream, optional index stream, + * and no sequence dictionary + * + * @param source The named source of the reference file (used in error messages). + * @param in The input stream to read the fasta file from. + * @param index The index, or null to return a non-indexed reader. + */ + public static ReferenceSequenceFile getReferenceSequenceFile(final String source, final SeekableStream in, final FastaSequenceIndex index) { + return getReferenceSequenceFile(source, in, index, null, true); + } + + /** + * Return an instance of ReferenceSequenceFile using the given fasta sequence file stream and optional index stream + * and sequence dictionary. + * + * @param source The named source of the reference file (used in error messages). + * @param in The input stream to read the fasta file from. + * @param index The index, or null to return a non-indexed reader. + * @param dictionary The sequence dictionary, or null if there isn't one. + * @param truncateNamesAtWhitespace if true, only include the first word of the sequence name + */ + public static ReferenceSequenceFile getReferenceSequenceFile(final String source, final SeekableStream in, final FastaSequenceIndex index, final SAMSequenceDictionary dictionary, final boolean truncateNamesAtWhitespace) { + if (truncateNamesAtWhitespace && index != null) { + return new IndexedFastaSequenceFile(source, in, index, dictionary); + } + return new FastaSequenceFile(source, in, dictionary, truncateNamesAtWhitespace); + } + /** * Returns the default dictionary name for a FASTA file. * @@ -186,6 +220,22 @@ public static Path getDefaultDictionaryForReferenceSequence(final Path path) { return path.resolveSibling(name.substring(0, extensionIndex) + IOUtil.DICT_FILE_EXTENSION); } + /** + * Loads the sequence dictionary from a FASTA file input stream. + * + * @param in the FASTA file input stream. + * @return the sequence dictionary, or null if the header has no dictionary or it was empty. + */ + public static SAMSequenceDictionary loadDictionary(final InputStream in) { + final SAMTextHeaderCodec codec = new SAMTextHeaderCodec(); + final BufferedLineReader reader = new BufferedLineReader(in); + final SAMFileHeader header = codec.decode(reader, null); + if (header.getSequenceDictionary().isEmpty()) { + return null; + } + return header.getSequenceDictionary(); + } + /** * Returns the FASTA extension for the path. * diff --git a/src/main/java/htsjdk/samtools/seekablestream/ReadableSeekableStreamByteChannel.java b/src/main/java/htsjdk/samtools/seekablestream/ReadableSeekableStreamByteChannel.java new file mode 100644 index 0000000000..054de42a51 --- /dev/null +++ b/src/main/java/htsjdk/samtools/seekablestream/ReadableSeekableStreamByteChannel.java @@ -0,0 +1,70 @@ +package htsjdk.samtools.seekablestream; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.NonWritableChannelException; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.SeekableByteChannel; + +/** + * A class to wrap a {@link SeekableStream} in a read-only {@link SeekableByteChannel}. + */ +public class ReadableSeekableStreamByteChannel implements SeekableByteChannel { + + private final SeekableStream seekableStream; + private final ReadableByteChannel rbc; + private long pos; + + public ReadableSeekableStreamByteChannel(SeekableStream seekableStream) { + this.seekableStream = seekableStream; + this.rbc = Channels.newChannel(seekableStream); + } + + @Override + public int read(ByteBuffer dst) throws IOException { + int n = rbc.read(dst); + if (n > 0) { + pos += n; + } + return n; + } + + @Override + public int write(ByteBuffer src) throws IOException { + throw new NonWritableChannelException(); + } + + @Override + public long position() { + return pos; + } + + @Override + public SeekableByteChannel position(long newPosition) throws IOException { + // ReadableByteChannel is not buffered, so it reads through + seekableStream.seek(newPosition); + pos = newPosition; + return this; + } + + @Override + public long size() { + return seekableStream.length(); + } + + @Override + public SeekableByteChannel truncate(long size) { + throw new NonWritableChannelException(); + } + + @Override + public boolean isOpen() { + return rbc.isOpen(); + } + + @Override + public void close() throws IOException { + rbc.close(); + } +} diff --git a/src/test/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFileTest.java b/src/test/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFileTest.java index be01a315c6..555245ae65 100644 --- a/src/test/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFileTest.java +++ b/src/test/java/htsjdk/samtools/reference/AbstractIndexedFastaSequenceFileTest.java @@ -26,6 +26,7 @@ import htsjdk.HtsjdkTest; import htsjdk.samtools.SAMException; +import htsjdk.samtools.seekablestream.SeekableFileStream; import htsjdk.samtools.util.CloserUtil; import htsjdk.samtools.util.StringUtil; import org.testng.Assert; @@ -33,16 +34,18 @@ import org.testng.annotations.Test; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; /** * Test the indexed fasta sequence file reader. */ public class AbstractIndexedFastaSequenceFileTest extends HtsjdkTest { - 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_BGZ = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.trimmed.fasta.gz"); - private static File SEQUENCE_FILE_NODICT = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.trimmed.nodict.fasta"); + private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/reference"); + private static final File SEQUENCE_FILE = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.trimmed.fasta"); + private static final File SEQUENCE_FILE_INDEX = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.trimmed.fasta.fai"); + private static final File SEQUENCE_FILE_BGZ = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.trimmed.fasta.gz"); + private static final 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" + @@ -75,11 +78,19 @@ public Object[][] provideOriginalAndNewReaders() throws FileNotFoundException { new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile( SEQUENCE_FILE_BGZ), new BlockCompressedIndexedFastaSequenceFile( - SEQUENCE_FILE_BGZ.toPath())}, + SEQUENCE_FILE_BGZ.toPath()) }, new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile( SEQUENCE_FILE_BGZ, true), new BlockCompressedIndexedFastaSequenceFile( - SEQUENCE_FILE_BGZ.toPath())} + SEQUENCE_FILE_BGZ.toPath()) }, + new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile(SEQUENCE_FILE.getAbsolutePath(), + new SeekableFileStream(SEQUENCE_FILE), new FastaSequenceIndex(new FileInputStream(SEQUENCE_FILE_INDEX))), + new IndexedFastaSequenceFile(SEQUENCE_FILE.getAbsolutePath(), new SeekableFileStream(SEQUENCE_FILE), + new FastaSequenceIndex(new FileInputStream(SEQUENCE_FILE_INDEX)), null) }, + new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile(SEQUENCE_FILE.getAbsolutePath(), + new SeekableFileStream(SEQUENCE_FILE), new FastaSequenceIndex(new FileInputStream(SEQUENCE_FILE_INDEX)), null, true), + new IndexedFastaSequenceFile(SEQUENCE_FILE.getAbsolutePath(), new SeekableFileStream(SEQUENCE_FILE), + new FastaSequenceIndex(new FileInputStream(SEQUENCE_FILE_INDEX)), null) }, }; } diff --git a/src/test/java/htsjdk/samtools/reference/FastaSequenceFileTest.java b/src/test/java/htsjdk/samtools/reference/FastaSequenceFileTest.java index a7462dbec4..8013ba9e69 100644 --- a/src/test/java/htsjdk/samtools/reference/FastaSequenceFileTest.java +++ b/src/test/java/htsjdk/samtools/reference/FastaSequenceFileTest.java @@ -24,6 +24,8 @@ package htsjdk.samtools.reference; import htsjdk.HtsjdkTest; +import htsjdk.samtools.seekablestream.SeekableFileStream; +import htsjdk.samtools.seekablestream.SeekableStream; import htsjdk.samtools.util.StringUtil; import org.testng.Assert; import org.testng.annotations.Test; @@ -83,4 +85,28 @@ public void testTrailingWhitespaceWithPreexistingSequenceDictionary() throws Exc Assert.assertEquals(StringUtil.bytesToString(referenceSequence.getBases()), "TCGATCGA"); } + + @Test + public void testStream() 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(); + try (SeekableStream seekableStream = new SeekableFileStream(fasta)) { + final FastaSequenceFile fastaReader = new FastaSequenceFile(fasta.getAbsolutePath(), seekableStream, null, true); + final ReferenceSequence referenceSequence1 = fastaReader.nextSequence(); + Assert.assertEquals(referenceSequence1.getName(), chr1); + Assert.assertEquals(StringUtil.bytesToString(referenceSequence1.getBases()), sequence + sequence); + // try to reset and re-read the first sequence + fastaReader.reset(); + final ReferenceSequence referenceSequence2 = fastaReader.nextSequence(); + Assert.assertEquals(referenceSequence2.getName(), chr1); + Assert.assertEquals(StringUtil.bytesToString(referenceSequence2.getBases()), sequence + sequence); + } + } } diff --git a/src/test/java/htsjdk/samtools/reference/FastaSequenceIndexTest.java b/src/test/java/htsjdk/samtools/reference/FastaSequenceIndexTest.java index c6fa1384ac..e2aa0acf29 100644 --- a/src/test/java/htsjdk/samtools/reference/FastaSequenceIndexTest.java +++ b/src/test/java/htsjdk/samtools/reference/FastaSequenceIndexTest.java @@ -32,6 +32,7 @@ import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.nio.file.Files; @@ -51,7 +52,9 @@ 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()) } }; + { new FastaSequenceIndex(sequenceIndexFile.toPath()) }, + { new FastaSequenceIndex(new FileInputStream(sequenceIndexFile)) } + }; } @DataProvider(name="specialcharacters") @@ -59,7 +62,9 @@ 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()) } }; + { new FastaSequenceIndex(sequenceIndexFile.toPath()) }, + { new FastaSequenceIndex(new FileInputStream(sequenceIndexFile)) } + }; } @Test(dataProvider="homosapiens") From 96ce8fb7cd28d416bff06a106d1a93ccea52ef54 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Tue, 19 Jun 2018 11:16:28 -0400 Subject: [PATCH 55/83] deprecating overloads makeCRAMWriter with mixed Path/File (#1150) * Deprecating overloads of SAMFileWriterFactory.makeCRAMWriter and .makeWriter that took a mix of Path and File as inputs. These were needed when we supported Path for the CRAM but not the reference. * Removing one overload that seems redundant and hasn't been in any htsjdk release yet. --- .../htsjdk/samtools/SAMFileWriterFactory.java | 34 +++++++------------ .../htsjdk/samtools/CRAMComplianceTest.java | 2 +- .../samtools/SAMFileWriterFactoryTest.java | 2 +- 3 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java b/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java index f4df7b4691..1fb0b89e89 100644 --- a/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java +++ b/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java @@ -452,7 +452,7 @@ public SAMFileWriter makeSAMOrBAMWriter(final SAMFileHeader header, final boolea * */ public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presorted, final File outputFile, final File referenceFasta) { - return makeWriter(header, presorted, null == outputFile ? null : outputFile.toPath(), referenceFasta); + return makeWriter(header, presorted, null == outputFile ? null : outputFile.toPath(), null == referenceFasta ? null : referenceFasta.toPath()); } /** @@ -464,8 +464,9 @@ public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presor * @param outputPath 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 outputPath - * + * @deprecated since 6/18, use {@link #makeWriter(SAMFileHeader, boolean, Path, Path)} instead */ + @Deprecated public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presorted, final Path outputPath, final File referenceFasta) { return makeWriter(header, presorted, outputPath, null == referenceFasta ? null : referenceFasta.toPath()); } @@ -550,9 +551,12 @@ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final File outp * @param referenceFasta reference sequence file * @return CRAMFileWriter * + * @deprecated since 6/18, prefer {@link #makeWriter(SAMFileHeader, boolean, Path, Path)} for creating bam/cram writers + * however {@link #makeCRAMWriter(SAMFileHeader, boolean, Path, Path)} is the direct replacement for this method */ + @Deprecated public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final Path outputPath, final File referenceFasta) { - return createCRAMWriterWithSettings(header, true, outputPath, null == referenceFasta ? null : referenceFasta.toPath()); + return makeCRAMWriter(header, true, outputPath, null == referenceFasta ? null : referenceFasta.toPath()); } /** @@ -568,7 +572,7 @@ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final Path outp * */ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile, final File referenceFasta) { - return makeCRAMWriter(header, presorted, outputFile.toPath(), referenceFasta); + return makeCRAMWriter(header, presorted, outputFile.toPath(), null == referenceFasta ? null : referenceFasta.toPath()); } @@ -583,25 +587,13 @@ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final boolean p * @param referenceFasta reference sequence file * @return CRAMFileWriter * - */ - public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final boolean presorted, final Path output, final File referenceFasta) { - return createCRAMWriterWithSettings(header, presorted, output, null == referenceFasta ? null : referenceFasta.toPath()); - } - - /** - * 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 outputPath where to write the output. Must end with .sam, .bam or .cram. - * @param referenceFasta reference sequence file - * @return CRAMFileWriter + * @deprecated since 6/18, prefer {@link #makeWriter(SAMFileHeader, boolean, Path, Path)} for creating bam/cram writers + * however {@link #makeCRAMWriter(SAMFileHeader, boolean, Path, Path)} is the direct replacement for this method * */ - public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final Path outputPath, final Path referenceFasta) { - return createCRAMWriterWithSettings(header, true, outputPath, referenceFasta); + @Deprecated + public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final boolean presorted, final Path output, final File referenceFasta) { + return makeCRAMWriter(header, presorted, output, null == referenceFasta ? null : referenceFasta.toPath()); } /** diff --git a/src/test/java/htsjdk/samtools/CRAMComplianceTest.java b/src/test/java/htsjdk/samtools/CRAMComplianceTest.java index cede96f45e..ff9bdc0e76 100644 --- a/src/test/java/htsjdk/samtools/CRAMComplianceTest.java +++ b/src/test/java/htsjdk/samtools/CRAMComplianceTest.java @@ -392,7 +392,7 @@ private void writeRecordsToPath ( // tests to fail since it can change the order of some unmapped reads - this is allowed // by the spec since the order is arbitrary for unmapped. try (final SAMFileWriter writer = new SAMFileWriterFactory() - .makeWriter(samHeader, true, targetPath, referenceFile)) { + .makeWriter(samHeader, true, targetPath, referenceFile.toPath())) { for (SAMRecord rec : recs) { writer.addAlignment(rec); } diff --git a/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java b/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java index e30c3dc45e..adc3de7fc2 100644 --- a/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java +++ b/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java @@ -337,7 +337,7 @@ public void testMakeWriterPath(String extension) throws Exception { Files.deleteIfExists(outputPath); final SAMFileHeader header = new SAMFileHeader(); final SAMFileWriterFactory factory = createWriterFactoryWithOptions(header); - final File referenceFile = new File(TEST_DATA_DIR, "hg19mini.fasta"); + final Path referenceFile = new File(TEST_DATA_DIR, "hg19mini.fasta").toPath(); int nRecs; try (final SAMFileWriter samWriter = factory.makeWriter(header, false, outputPath, referenceFile)) { From 38a24d550f96bc89366fc54497c44812ef145059 Mon Sep 17 00:00:00 2001 From: kachulis <39926576+kachulis@users.noreply.github.com> Date: Thu, 21 Jun 2018 09:42:37 -0400 Subject: [PATCH 56/83] Additional unit tests for IOUtil (#1149) * Additional unit tests for IOUtil --- .../java/htsjdk/samtools/util/IOUtilTest.java | 203 +- .../samtools/io/dictionary_english_short.dic | 4563 +++++++++++++++++ 2 files changed, 4756 insertions(+), 10 deletions(-) create mode 100644 src/test/resources/htsjdk/samtools/io/dictionary_english_short.dic diff --git a/src/test/java/htsjdk/samtools/util/IOUtilTest.java b/src/test/java/htsjdk/samtools/util/IOUtilTest.java index dd73fa79d2..5338b7320c 100644 --- a/src/test/java/htsjdk/samtools/util/IOUtilTest.java +++ b/src/test/java/htsjdk/samtools/util/IOUtilTest.java @@ -27,6 +27,7 @@ import com.google.common.jimfs.Configuration; import com.google.common.jimfs.Jimfs; +import java.io.*; import java.net.URI; import java.nio.file.FileSystem; import java.nio.file.Files; @@ -42,25 +43,21 @@ 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.lang.IllegalArgumentException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; +import java.util.Random; +import java.util.stream.Stream; + public class IOUtilTest extends HtsjdkTest { private static final Path TEST_DATA_DIR = Paths.get ("src/test/resources/htsjdk/samtools/io/"); + private static final Path TEST_VARIANT_DIR = Paths.get("src/test/resources/htsjdk/variant/"); private static final Path SLURP_TEST_FILE = TEST_DATA_DIR.resolve("slurptest.txt"); private static final Path EMPTY_FILE = TEST_DATA_DIR.resolve("empty.txt"); private static final Path FIVE_SPACES_THEN_A_NEWLINE_THEN_FIVE_SPACES_FILE = TEST_DATA_DIR.resolve("5newline5.txt"); @@ -74,6 +71,7 @@ public class IOUtilTest extends HtsjdkTest { private String systemUser; private String systemTempDir; private FileSystem inMemoryFileSystem; + private static Path WORDS_LONG; @BeforeClass public void setUp() throws IOException { @@ -86,6 +84,18 @@ public void setUp() throws IOException { if (!tmpDir.isDirectory()) throw new RuntimeException("java.io.tmpdir (" + systemTempDir + ") is not a directory"); systemUser = System.getProperty("user.name"); + //build long file of random words for compression testing + WORDS_LONG = Files.createTempFile("words_long", ".txt"); + WORDS_LONG.toFile().deleteOnExit(); + final List wordsList = Files.lines(TEST_DATA_DIR.resolve("dictionary_english_short.dic")).collect(Collectors.toList()); + final int numberOfWords = 300000; + final int seed = 345987345; + final Random rand = new Random(seed); + try (final BufferedWriter writer = Files.newBufferedWriter(WORDS_LONG)) { + for (int i = 0; i < numberOfWords; i++) { + writer.write(wordsList.get(rand.nextInt(wordsList.size()))); + } + } } @AfterClass @@ -520,4 +530,177 @@ public void testIsBlockCompressedOnJimfs(Path file, boolean checkExtension, bool Assert.assertEquals(IOUtil.isBlockCompressed(jimfsFile, checkExtension), expected); } } + + @DataProvider + public static Object[][] filesToCompress() { + return new Object[][]{ + {WORDS_LONG, ".gz", 8}, + {WORDS_LONG, ".bfq", 8}, + {TEST_VARIANT_DIR.resolve("test1.vcf"), ".gz", 7}, + {TEST_VARIANT_DIR.resolve("test1.vcf"), ".bfq", 7} + }; + } + + @Test(dataProvider = "filesToCompress") + public void testCompressionLevel(final Path file, final String extension, final int lastDifference) throws IOException { + final long origSize = Files.size(file); + long previousSize = origSize; + for (int compressionLevel = 1; compressionLevel <= 9; compressionLevel++) { + final Path outFile = Files.createTempFile("tmp", extension); + outFile.toFile().deleteOnExit(); + IOUtil.setCompressionLevel(compressionLevel); + Assert.assertEquals(IOUtil.getCompressionLevel(), compressionLevel); + final InputStream inStream = IOUtil.openFileForReading(file); + try (final OutputStream outStream = IOUtil.openFileForWriting(outFile.toFile())) { + IOUtil.transferByStream(inStream, outStream, origSize); + } + final long newSize = Files.size(outFile); + if (compressionLevel <= lastDifference) { + Assert.assertTrue(previousSize > newSize); + } else { + Assert.assertTrue(previousSize >= newSize); + } + previousSize = newSize; + } + } + + @DataProvider + public static Object[][] badCompressionLevels() { + return new Object[][]{ + {-1}, + {10} + }; + } + + @Test(dataProvider = "badCompressionLevels", expectedExceptions = {IllegalArgumentException.class}) + public void testCompressionLevelExceptions(final int compressionLevel) { + IOUtil.setCompressionLevel(compressionLevel); + } + + @DataProvider + public static Object[][] filesToCopy() { + return new Object[][]{ + {TEST_VARIANT_DIR.resolve("test1.vcf")}, + {TEST_DATA_DIR.resolve("ipsum.txt")} + }; + } + + @Test(dataProvider = "filesToCopy") + public void testCopyFile(final Path file) throws IOException { + final Path outFile = Files.createTempFile("tmp", ".tmp"); + outFile.toFile().deleteOnExit(); + IOUtil.copyFile(file.toFile(), outFile.toFile()); + Assert.assertEquals(Files.lines(file).collect(Collectors.toList()), Files.lines(outFile).collect(Collectors.toList())); + } + + @Test(dataProvider = "filesToCopy", expectedExceptions = {SAMException.class}) + public void testCopyFileReadException(final Path file) throws IOException { + final Path outFile = Files.createTempFile("tmp", ".tmp"); + outFile.toFile().deleteOnExit(); + file.toFile().setReadable(false); + try { + IOUtil.copyFile(file.toFile(), outFile.toFile()); + } finally { //need to set input file permission back to readable so other unit tests can access it + file.toFile().setReadable(true); + } + } + + @Test(dataProvider = "filesToCopy", expectedExceptions = {SAMException.class}) + public void testCopyFileWriteException(final Path file) throws IOException { + final Path outFile = Files.createTempFile("tmp", ".tmp"); + outFile.toFile().deleteOnExit(); + outFile.toFile().setWritable(false); + IOUtil.copyFile(file.toFile(), outFile.toFile()); + } + + @DataProvider + public static Object[][] baseNameTests() { + return new Object[][]{ + {TEST_DATA_DIR.resolve("ipsum.txt"), "ipsum"}, + {TEST_DATA_DIR.resolve("ipsum.txt.bgz.wrongextension"), "ipsum.txt.bgz"}, + {TEST_DATA_DIR.resolve("ipsum.txt.bgzipped_with_gzextension.gz"), "ipsum.txt.bgzipped_with_gzextension"}, + {TEST_VARIANT_DIR.resolve("utils"), "utils"}, + {TEST_VARIANT_DIR.resolve("not_real_file.txt"), "not_real_file"} + }; + } + + @Test(dataProvider = "baseNameTests") + public void testBasename(final Path file, final String expected) { + final String result = IOUtil.basename(file.toFile()); + Assert.assertEquals(result, expected); + } + + @DataProvider + public static Object[][] regExpTests() { + return new Object[][]{ + {"\\w+\\.txt", new String[]{"5newline5.txt", "empty.txt", "ipsum.txt", "slurptest.txt"}}, + {"^((?!txt).)*$", new String[]{"Level1.fofn", "Level2.fofn", "example.bam"}}, + {"^\\d+.*", new String[]{"5newline5.txt"}} + }; + } + + @Test(dataProvider = "regExpTests") + public void testRegExp(final String regexp, final String[] expected) throws IOException { + final String[] allNames = {"5newline5.txt", "Level2.fofn", "example.bam", "ipsum.txt.bgz", "ipsum.txt.bgzipped_with_gzextension.gz", "slurptest.txt", "Level1.fofn", "empty.txt", "ipsum.txt", "ipsum.txt.bgz.wrongextension", "ipsum.txt.gz"}; + final Path regExpDir = Files.createTempDirectory("regExpDir"); + regExpDir.toFile().deleteOnExit(); + final List listExpected = Arrays.asList(expected); + final List expectedFiles = new ArrayList(); + for (String name : allNames) { + final Path file = regExpDir.resolve(name); + file.toFile().deleteOnExit(); + file.toFile().createNewFile(); + if (listExpected.contains(name)) { + expectedFiles.add(file.toFile()); + } + } + final File[] result = IOUtil.getFilesMatchingRegexp(regExpDir.toFile(), regexp); + Assert.assertEqualsNoOrder(result, expectedFiles.toArray()); + } + + @Test() + public void testReadLines() throws IOException { + final Path file = Files.createTempFile("tmp", ".txt"); + file.toFile().deleteOnExit(); + final int seed = 12394738; + final Random rand = new Random(seed); + final int nLines = 5; + final List lines = new ArrayList(); + try (final PrintWriter writer = new PrintWriter(Files.newBufferedWriter(file))) { + for (int i = 0; i < nLines; i++) { + final String line = TEST_STRING + Integer.toString(rand.nextInt(100000000)); + lines.add(line); + writer.println(line); + } + } + final List retLines = new ArrayList(); + IOUtil.readLines(file.toFile()).forEachRemaining(retLines::add); + Assert.assertEquals(retLines, lines); + } + + @DataProvider + public static Object[][] fileSuffixTests() { + return new Object[][]{ + {TEST_DATA_DIR.resolve("ipsum.txt"), ".txt"}, + {TEST_DATA_DIR.resolve("ipsum.txt.bgz"), ".bgz"}, + {TEST_DATA_DIR, null} + }; + } + + @Test(dataProvider = "fileSuffixTests") + public void testSuffixTest(final Path file, final String expected) { + final String ret = IOUtil.fileSuffix(file.toFile()); + Assert.assertEquals(ret, expected); + } + + @Test + public void testCopyDirectoryTree() throws IOException { + final Path copyToDir = Files.createTempDirectory("copyToDir"); + copyToDir.toFile().deleteOnExit(); + IOUtil.copyDirectoryTree(TEST_VARIANT_DIR.toFile(), copyToDir.toFile()); + final List collect = Files.walk(TEST_VARIANT_DIR).filter(f -> !f.equals(TEST_VARIANT_DIR)).map(p -> p.getFileName()).collect(Collectors.toList()); + final List collectCopy = Files.walk(copyToDir).filter(f -> !f.equals(copyToDir)).map(p -> p.getFileName()).collect(Collectors.toList()); + Assert.assertEqualsNoOrder(collect.toArray(), collectCopy.toArray()); + } } + diff --git a/src/test/resources/htsjdk/samtools/io/dictionary_english_short.dic b/src/test/resources/htsjdk/samtools/io/dictionary_english_short.dic new file mode 100644 index 0000000000..0916263a75 --- /dev/null +++ b/src/test/resources/htsjdk/samtools/io/dictionary_english_short.dic @@ -0,0 +1,4563 @@ +A +Abietineae +Acanthurus +Achromobacter +Acropora +Addison +Adullam +Aetomorphae +Agelacrinites +Ahmadabad +Akontae +Albizzia +Alemannic +Alhambresque +Almira +Altica +Ambocoelia +Ammiaceae +Amphisile +Anamnia +Andalusia +Angers +Anisoptera +Anselmian +Anthropopithecus +Aonian +Apluda +Aptiana +Arara +Arcos +Argonaut +Arlene +Arthrodira +Asclepius +Aspidoganoidei +Asuri +Atractaspis +Aurantium +Avernal +Azteca +Bacillarieae +Bakersfield +Balnibarbi +Bannock +Barotse +Basuto +Bdelloura +Belialic +Bennet +Bernardina +Betty +Bilin +Blackstone +Bodo +Bombus +Borromean +Bourignonist +Brahminic +Brevirostrines +Brontosaurus +Bube +Bulgaric +Bute +Caca +Cairo +Callianassa +Calyptratae +Campbellism +Cantabrigian +Caracas +Caridomorpha +Carpophaga +Cassytha +Catonic +Celastrus +Cephalacanthidae +Cercospora +Chaenomeles +Chamaesiphonaceous +Chartres +Cheney +Chimakuan +Chloe +Christdom +Chrysidella +Cicuta +Cixiidae +Clematis +Cnidoscolus +Coelebogyne +Collybia +Comptometer +Conopidae +Coraciiformes +Coropo +Coueism +Crimean +Cryptodira +Cummins +Cyathophyllum +Cynodon +Cytherea +Dailamite +Danite +Dasyatidae +Decemberish +Demeter +Derotrema +Dianthus +Dicynodontia +Dinornis +Diprotodontia +Dode +Donnelly +Doxantha +Dschubba +Dutch +Ecaudata +Eden +Einstein +Eleutheria +Ely +Enchytraeidae +Entamoeba +Epicurism +Eretrian +Erythraea +Eteoclus +Euglandina +Eurindic +Evan +FPC +Farmington +Ferae +Filipiniana +Flamandize +Forestiera +Frankify +Freya +Funariaceae +Gaertnerian +Galli +Ganodus +Gaulle +Genesiac +Gerbillus +Geullah +Gino +Glomerella +Godiva +Goode +Gradgrindish +Greenblatt +Grubstreet +Guesdist +Gyges +Hackett +Halcyoninae +Hamitoid +Harold +Haversian +Heiltsuk +Hellenize +Henry +Herniaria +Heteromeri +Hibernicize +Hippidion +Hittite +Holomyaria +Honshu +Hubbard +Hussite +Hydrodictyon +Hypnos +Iapygian +Idaic +Illyrian +Indologue +Ionization +Isabelline +Israelite +Itylus +Jacunda +Japanophile +Jennifer +Jim +Jorgenson +Juglans +Jutlander +Kalwar +Kashmirian +Kenai +Khattish +Kirby +Knoxian +Koppers +Kruger +Kyrie +Laguerre +Lancelot +Laridae +Lauraceae +Leighton +Leonine +Leptophis +Leucothoe +Ligurian +Linet +Lithuanian +Lodowick +Lophiidae +Loyolite +Lula +Lychnic +MIT +Macrocentrus +Maenalus +Maiidae +Malebolge +Manchurian +Maorilander +Marguerite +Marsilia +Mastigopoda +Maybird +McDowell +Mediterraneanism +Meistersinger +Mellivora +Mentha +Merula +Metaurus +Micraster +Milesian +Minoress +Mithraistic +Mohammedanization +Monachi +Mononchus +Montpelier +Morrenian +Mru +Murzim +Mycosphaerella +Mystacocete +Nabalitic +Naomi +Navajo +Negroize +Neogene +Nesokia +Nice +Nipissing +Nordicize +Notogaeic +Nyctaginaceae +Ochozoma +Ods +Oleacina +Onchidiidae +Opimian +Origenical +Orthocarpus +Osphromenidae +Ottawa +Oyana +Pakawan +Palestinian +Pandean +Paphian +Parinarium +Pasquino +Paulinistically +Pedimana +Peltandra +Perameles +Perognathus +Petrarchist +Phalangida +Phegopteris +Philotria +Phronimidae +Physoderma +Picuris +Pipil +Placoides +Platyhelminthes +Pliosauridae +Podophthalmata +Polonia +Polyporaceae +Populist +Powell +Prionodesmacea +Prosobranchiata +Protosphargis +Psittacidae +Ptilota +Purdue +Pyrodine +Quakerishly +RCA +Ramistical +Rastaban +Reki +Rhamnales +Rhodian +Richfield +Roccella +Romescot +Roth +Rumford +Rymandra +Sabine +Sahadeva +Salol +Samsonian +Saoshyant +Sarigue +Saurodontidae +Scaphitidae +Schneiderian +Sclerodermatales +Scotsmen +Seasan +Seljukian +Septembrist +Serrano +Shakespeareana +Shemu +Shoshonean +Sifatite +Simonist +Siphonata +Siwash +Smectymnuan +Sokulk +Sopherim +Spaniardo +Sphaeriidae +Spioniformia +Squatinoidei +Steatornis +Steve +Strickland +Stylops +Suliote +Svetambara +Sylviinae +TV +Tagliacozzian +Tamias +Tapijulapane +Tartarized +Tchetchentsish +Teleostomi +Terebridae +Tetrodon +Thamudic +Theresa +Thoracostei +Tibetan +Tinoceras +Tocharic +Toromona +Trachymedusae +Tribulus +Trinucleus +Trochodendraceae +Tubificidae +Turbinellidae +Tursha +Tyrannosaurus +Ugrian +Uniat +Uropeltidae +Valencia +Variolaria +Veneres +Vespertiliones +Virgil +Voss +Wahl +Wapato +Webb +Westminster +Wiley +Witumki +Xanthidium +Xiphura +Yankeeland +Yoruban +Zamenis +Zenobia +Zolaistic +Zygophyllaceae +abacas +abastardize +abdias +aberdevine +abietic +ablastemic +abnormals +aborigine's +abrasions +abscise +absoluteness +abstentions +abterminal +abysmally +acanthine +acatastasia +acceptance +accidently +accommodations +accountableness +accultural +accustoms +acescents +acetomorphine +acetylization +achloropsia +acicularly +aciliated +acocotl +acquaintance +acraze +acrocephalous +acronically +acrylonitrile +actinometers +activin +aculeolus +ad-nauseum +adat +addlehead +adenase +adenoneure +adherescent +adipopexis +adjunct +administer +admittedly +adonis +adpress +adsorption +aduncity +adverbiation +advisor's +aegean +aerie +aerogen +aerophilatelic +aesthetic's +affectibility +affirmation's +affraying +aforetime +afterfame +afterrake +afwillite +agateware +ager +aggravations +agistor +agnations +agoraphobic +agriculture +aguinaldo +aidman +aion +airier +airspeeds +ajowans +alabaster +alarmism +albification +albuminuric +alcoholic +alderwoman +alepole +alfaje +algidity +alibied +alike +aliveness +alkane +allassotonic +allemand +alliterate +allogamous +allorrhythmic +allows +alma-mater +alnagership +alp +alright +alternations +altun +alvar +amalgamates +amasty +ambassage +ambitious +ambrotype +ameliorativ +americium +amidate +aminoacetal +amman +ammonolyze +amongst +amp +amphibryous +amphiploidy +amphorette +amputee +amygdalate +amylosynthesis +anacephalaeosis +anaerobically +anagyrine +analphabet +anankes +anarchal +anathematizes +ancestries +ancistroid +androgametangium +anecdotes +anepithymia +angaries +angiocarpic +angiosperm +angolans +anhalamine +anilities +animators +anisogenous +anklejack +annelid +announce +annunciates +anomalonomy +anorexia +anspessade +antasthmatic +anteflexion +antepasts +antetemple +anthoecologist +anthracomancy +anthropolater +anthropophysiography +antiantidote +anticapital +anticlactic +anticourt +antidotes +antifebrile +antigraph +antiking +antimasque +antimoniureted +antioptionist +antiperistatically +antipolygamy +antiquarians +antirevolutionaries +antisilverite +antisubmarine +antitoxin's +antivivisectionist +antrustionship +aorists +apathic +aphakia +aphoria +apicifixed +aplome +apocynaceous +apologias +apoplastogamous +apostolate +appallingly +appellant +appertainment +applicabilities +apposer +apprenticeship +approvedness +apsides +aquarial +arab +araliad +arbitrationist +arbutus +archangel's +archdruid +archfriend +archines +archmagician +archprimate +arctangent +arecas +arfvedsonite +argled +arianist +aristocratism +armamentarium +armored +aromas +arrantly +arrisways +arsenhemol +arsonous +arteriostenosis +arthromere +articulatenesses +artocarpeous +asarum +asceticism +ascyphous +ashless +asmalte +asperous +aspirate +assarion +assenters +asshead +assister +asst +astasia +asthmatoid +astral +astrologian +aswim +atamascos +athalamous +athletocracy +atmocautery +atomizing +atriocoelomic +attacks +attendress +attiring +attritive +audience +augen +auletic +auresca +aurophore +ausu +authoritatively +autobusses +autocrator +autogauge +autoist +automobile's +autoplast +autosite +autotrophic +auxocardia +avenalin +avianize +avitaminosis +avoyer +awearied +awreck +axised +ayegreen +azofier +azoxazole +babbled +baby +bache +backbonelessness +backlands +backslidden +backwardness +bacteriolysis +badge +baga +bagworm +bain +baking +balas +balers +ballate +ballpark's +balsamer +banana +bandit's +banging +bankruptlike +bantering +barbacou +barbicans +barefit +baria +barmaids +baronetcies +barras +barroom +baryte +basest +basihyoid +basketball +bassos +bateaux +bathybic +batster +battleship's +bavoso +bayoneting +beadings +beamster +bearishly +beau's +bebed +becharm +becolor +bed +bedells +bedlamism +bedrivels +bedward +beekeeper +beevish +befogged +begari +beglamour +beguile +behint +bekerchief +beld +belion +bellmaking +belonging +bemata +bemuse +beneceptive +benevolentness +bentwoods +benzoates +benzoxyphenanthrene +beprose +beret +bern +besagne +beshaming +besmile +bespatter +bestayed +bests +bethanking +betrayers +bevel +bewidow +beys +biallyl +bible's +bibliotaphic +bicircular +bicyclists +biethnic +bigamous +bigotish +bilberries +biliverdic +billowiness +bimethyls +binna +biochore +biographic +bionomy +biostatics +bipedality +birched +birdy +birthright's +bishopess +bisters +biti +bitumed +biznagas +blackfellows +blacktail +blamelessly +blankness +blastogranitic +blauwbok +bleaters +blennometritis +blesboks +blindling +blitzbuggy +blockmaking +bloodred +bloop +blowhard +bluebelled +bluer +blunker +boanergism +boatings +bobo +bodewash +bog's +bohea +boldo +bolshevists +bombers +bondmen +bonita +boobyalla +bookland +boomdas +bootful +boraciferous +boreism +borrowable +bosquet +botchery +bottlenecks +bouk +bouquets +bovinely +bowlegs +boxinesses +brabant +brachistochronous +brachyuranic +bradypod +braids +brake +branchiostegous +brashier +brattles +brayera +breadman +bream +brecken +bret +briarberry +bridally +bridlers +brightly +brininesses +britches +broadhorn +brogue +bromeliad +bromopnea +bronchorrhea +brooding +brothels +browpost +brunets +brutalized +bubblies +bucketed +buckwheatlike +buffable +buggered +bulbaceous +bull +bullfoot +bullwort +bummest +bundook +bunnymouth +burdener +burgherdom +burkite +burntness +bursts +bushlands +bust +butene +buttermonger +butylates +bwanas +byrnies +cabaletta +cabinetwork +cache +cacodylic +cactaceous +cadew +caesarian +cagmag +cakemaker +calandria +calcigerous +calculi +calibogus +calix +callosum +calorizer +calycanth +cambaye +cameramen +campanologer +campions +canal +cancellus +candle +caner +cannabinol +cannonproof +canorousness +cantilevering +canvasser +capellet +capitalizes +cappadine +capshore +captivating +caracols +caravels +carbonado +carburate +cardaissin +carding +cardiorenal +careful +carid +carminic +carnotite +carpal +carpolith +carroming +cartilagineous +carvel +cascaron +cashbook +cassavas +castigable +casuistically +catalecta +catamiting +catatonias +catechist +caterer +catheter +catling +cattleman +caulescent +causeless +cavalier +cavil +ceaseless +cee +celestialness +cellblock +cementations +censorious +centerless +centralizations +centrolineal +cephalocele +ceraceous +cercarias +cerebromeningitis +ceriph +certiorate +cervuline +cetolog +chaetopterin +chair +chalcidid +challengers +chamfrons +chancellories +changer +chapah +chaptalize +charcoals +charladies +charter +chasteningly +chattingly +cheapened +checkoff +cheeping +cheetah +chelonin +chemoreceptivities +cherishingly +chetah +chias +chickenwort +chiffonade +chilenite +chimars +chinchy +chippage +chiroplasty +chisellike +chladnite +chlorinators +chlorophyllan +choel +cholecystectomy +cholesteremia +chondritis +chondrule +chordata +chorioids +chorussing +chrismon +chromatolysis +chromocyte +chromotype +chronometrical +chrysolite +chufas +chunters +churner +chymic +ciceros +cilioscleral +cinel +cinnamonic +circuitable +circumaxillary +circumlocution's +circumspectness +cirrocumulus +cited +citrinous +civilizer +claimer +clamp +clapperclaw +clashingly +clastics +clavial +clays +clearwater +clemencies +clerkships +cliffside +clinching +clinopyroxene +clitoridectomies +clockwatching +clomping +clostridial +cloudlets +clubbable +clumsiness +cnicin +coadjutator +coagulometer +coamings +coastings +cobalt +cobstone +coccothraustine +cockatoos +cockneyess +coconut's +codelight +codlings +coeline +coenduring +coercionary +cofeature +cogeneric +cognizers +coherent +coiler +coinsurer +colcothar +colicystopyelitis +collatable +college's +collinearly +colloquium +colometry +colophony +colory +coltsfoot +colytic +combinational +comediennes +comic +comme +commentation +commissary +commonalties +communicates +compactible +compartmental +compendium +complacence +complex +compliments +compotator +comprizes +computerization +concealed +conceptism +conchal +concludable +concreting +condensability +condole +conductus +confecting +confessionals +confirmations +conformate +confutations +conglobe +congresswomen +conjecturalist +conjurement +connexus +conquering +consecution +conservatories +consisting +consortium +constipating +constructionally +consultor +containers +contemptibly +contiguities +continuousness +contractively +contrapone +contravention +controversional +convect +converging +conveyances +convolved +cookery +cooniness +copaibas +copiable +coppersmith +coprophagan +copyholds +coracovertebral +cordelle +coregence +coriparian +cornein +corning +coronach +corporate +correctant +corridored +corrupter +corticous +coryphee +cosinesses +cosmopolitanize +costeaning +costumiers +cotingoid +cottontop +couldst +countdown +counteravouchment +countercurrent +counterfeited +counterlatration +counterpassion +counterquarterly +counterside +counterterrors +counting +courap +courtyards +covenantor +cowages +cowleech +coxcombicality +cozily +cracklier +cragginess +cranelike +crankcase +crapulousness +cravenhearted +crea +creational +creditor's +creirgist +creolism +cressed +crewing +crimeproof +cringed +crispened +critiqued +croft +crooner +crosscurrented +crossways +crow +crucial +cruller +cruors +crutch +crypta +cryptolog +crystallogenical +cubanite +cubododecahedral +cudgelers +culex +culprits +culverts +cumulated +cupay +cuproiodargyrite +curatorship +curiae +curmurring +cursive +curvatures +cushiony +customizers +cutization +cwierc +cyanol +cycads +cyclohexyl +cycloses +cylindromatous +cynanthropy +cyprian +cysticolous +cystospasm +cytolytic +czaritzas +dacryoadenitis +dactylus +dagga +daincha +dalk +damme +damselfish +danegeld +daphnioid +darkeys +dartoic +datableness +daubster +dawdlingly +dayman +deaconize +deadwood +dean's +deathrate's +debauchees +debriefings +decadrachma +decants +decatyl +decenary +dechlorinate +decipherability +declarers +decoic +decongestant +decoying +decrypted +dedication +deemphasizes +deface +defecter +deferentitis +defines +deflorations +deforms +degasify +degraduation +dehumidifying +deintellectualization +delabialize +delete +delightingly +deliver +deluders +demarcation +demiatheism +demilance +demisangue +democratical +demonised +demoralizing +denationalize +deniable +denotationally +dentatocillitate +dentosurgical +deoperculate +depas +depicting +deplump +depositor's +depressible +deputatively +deregulation +dermal +dermatorrhagia +dernier +desaurin +desecrate +desexualization +desilvers +desmohemoblast +desperacy +despumate +destructions +detainable +determinably +detinet +detruncation +deutonymph +developmentally +deviltries +devotee's +deweylite +dextrogyrous +dhooly +diacetylene +diagnoses +dialed +dialyzate +dianoetical +diapophysis +diastoles +diazoanhydride +dicast +dichromatic +dictator +didder +diem +diffeomorphic +diffused +digged +dignitarial +diiodo +dilatometer +dilutent +dimidiate +dimyaric +dinitrophenol +dioestrum +dioxy +diplasiasmus +diplomatists +diprotodont +directiveness +dirtplate +disaffirmative +disappointed +disassociation +disbuds +discerpibility +disclosed +discommender +discontentment +discouragement +discretions +disdainfully +disemploy +disenthralled +disfranchisements +disgustful +dishonesties +disincarnation +disinterestednesses +dislimning +dismemberments +disoperculate +dispassioned +dispersement +displode +disprivilege +disquietedness +disrobers +disseizing +dissettlement +dissociative +distale +distills +distrain +disturbance's +dita +dittied +divergently +dividedly +divisural +djebels +docimology +doctrinarily +dodecasyllable +dogdoms +doglegs +doitrified +doll +doltishness +domineer +donenesses +dool +doorweed +dormin +dorsocaudal +dosses +doubledamn +doughboys +doven +downcoming +downrightly +dowse +drabness +dragging +draine +drapers +drawknot +dreamfully +dreidls +driftage +drisk +dromedarian +dropper's +drownded +druith +drusy +dubash +duckfoot +duds +duikers +dulse +dumper +dungier +duodenocholedochotomy +duplicating +durion +dustlessness +dwayberry +dynametrical +dysacousis +dysmorphism +dystrophy +earlike +earthier +easel +ebb +eccentrate +echea +eclamptic +economy's +ectocondylar +ectozoa +edema +edifier +educatory +effacers +effigial +eflagelliferous +eglateres +eider +eisodic +elaborative +elastomeric +electable +electroanalysis +electrodynamic +electrolyzable +electrophoric +electrotest +elegit +eleutherophyllous +eliminant +elmier +eluants +elytrocele +emasculating +embays +embleming +embosture +embroilment +embuia +emetically +emmenagogue +empanels +emplaces +emptive +emyd +enanthem +encarpus +encephalotome +encl +encoronet +encup +endearing +endoblast +endoenteritis +endophasic +endosmometer +endowers +energies +enflagellation +engarment +englut +engrossingly +enisling +enlightener +ennobled +enquiries +enrut +ensilages +ensued +enter +enteromycosis +enthrallment +entocnemial +entophytically +entrapping +enumeration +environmental +enzymotic +epanorthotic +ephebos +epibranchial +epicoracoid +epidermophytosis +epigonic +epimanikia +epiphytic +episcotister +epistolizable +epitheliomatous +epizoicide +epyllion +equianchorate +equimolar +equisetic +eradiate +eremitish +ergostat +erminee +errancies +eruditeness +erythrocytorrhexis +escalin +escheats +eskers +espaliered +essaying +esteem +estivator +esugarization +ethanols +ethide +ethnographically +ethynyls +eucalypti +eudaimonia +eulogist +euphemian +eupnoeic +eutaxic +evaluative +evaporite +eventuated +evictees +evocatively +exact +examinationism +excandescence +exceptiveness +excitements +excommunicant +exculpatory +executant +exempted +exhalents +exhorter +existing +exogenetic +exorcisory +exotoxins +expecters +expenditures +expiations +explications +exponentially +expounds +expungers +exsuccous +extenuatory +extine +extracapsular +extraessentially +extraperiodic +extraterrestrials +extrication +exultingly +eyeglasses +eyewinker +facade +facings +factotum +faeces +faineants +fairyology +falcopern +falsettist +familistical +fanfares +fantast +farced +farls +farsightedly +fascistization +fastuousness +fatigable +fauces +favaginous +fayles +featherback +febricant +federated +feels +felinity +feloniously +femininity +fendillate +ferfathmur +fernleaf +ferrocerium +fertilizer +festooning +fettered +feverous +fibration +fibrofatty +fice +fiddlesticks +fieldish +fiftieths +figurize +filename's +fillable +filmy +finalis +finfish +finises +firearmed +firelocks +firmed +fishery +fissility +fitch +fixature +flaccidity +flagonet +flamelet +flanky +flashier +flattening +flavid +flea +fleeciest +fleshpots +flickery +flinting +flittern +flockmaster +floorless +florida +flotative +flowerpecker +flugelman +flung +fluoridize +flushness +fluxility +flyting +fod +fogram +folia +folksong +fondnesses +fools +footloose +foozlers +forbearingness +fordless +forecar +foredevised +foreguidance +forelay +forepassed +forescript +forespeed +foretelling +forfairn +forgiver +formagen +formers +formulize +fort's +fortuitus +fossilation +foulish +fourgons +foxed +fractionalized +fraik +frangipane +fraternally +freaked +freeing +freight +frescoed +fri +friendliness +frill's +frithbot +frocklike +frondeur +frosh +frowners +fruit +frustrates +fuddled +fuguing +fullface +fumaryl +functionality +fungible +funnily +furfurole +furores +fusc +fustians +fuzz +gable +gaels +gainlier +galactorrhea +galera +gallet +gallon's +galvanist +gambe +gamesmanship +gammy +ganglia +ganoid +garage +gardy +garnet +garrotting +gasiform +gasterosteoid +gastroduodenoscopy +gastropancreatic +gat +gaudiness +gauzewing +gayish +gearings +geisha +gelees +gemmier +genealogic +generations +geniculum +genro +gentlest +geodaesia +geologian +geophones +geoty +germanization +gerontophilia +gesticulation +gharry +ghostliest +gibbetting +gifts +gigmanic +giltcup +gingering +gipons +girns +gizzern +gladiatorism +glamouring +glasshouse +glazing +glenlike +gliosa +globigerine +glomerulose +glossarize +glossopodium +glub +glummest +glycan +glycolysis +gnarr +gnetaceous +goalposts +gobiiform +godlier +goglet +goldfishes +gombos +gongman +gonophs +goodwilly +gooseherd +gorgeted +gosmore +gouged +governmentish +grabouche +gradometer +grains +gramophonical +grandma +grannom +grape's +graphs +grasswards +grave +gravitationally +greases +greenbone +greenthumbed +gressorial +grievous +grimier +gripper +grittiness +groomers +grotesquely +groundworks +growlers +gruelers +grumpish +guam +guarder +gudefather +guffaw +guilefully +gulches +gumboil +gundi +gunrooms +gurniad +gutsier +guydom +gymnogenous +gynecologists +gypsophily +gyrons +hability +hackbolt +hadjis +haffit +hagiarchy +hairband +hairtail +halcyons +halisteresis +halluces +haltere +hamiform +hampshirite +handcuffing +handles +handstroke +hangworm +haplodonty +haranguers +hardfern +harebottle +harman +harnessing +harsh +haslet +hatcheling +hatter +hausens +haviours +haycap +hazed +headhunts +headrope +healthier +heartening +heat +heavenly +hecatomb +hedgeberry +heel +heightened +helianthic +heliolatrous +hellbent +helmetmaker +helter-skelter +hematidrosis +hematometry +hemialbumose +hemifacial +hemiparasitic +hemitrope +hemoglobic +hemorrhaging +hencoops +hep +hepatopneumonic +heptarchic +herbariums +hereat +hereticize +hermitess +heroinism +hes +heterization +heteroecism +heterology +heteroproteide +heterozygosis +hexadactylic +hexane +hexiological +hiccuping +hierarchial +higginsite +hightailing +hills +hindsaddle +hippiatric +hippopod +hirsuteness +histogeny +historiographic +hiveward +hobble +hocusses +hoghide +hoking +holiness +holmgang +holomorphy +holts +homeliness +homesickly +hommock +homoeomorphy +homograft +homophobia +homovanillin +honeymooned +honors +hook +hoopstick +hoplonemertine +horizontically +hornsman +horrifies +horseplay +hose's +hostie +hoti +houseboy +houseminder +how +hubb +huffily +hulloes +humblebee +humidifying +humorology +hungered +hurlbarrow +husbanded +hustlers +hyalobasalt +hydatoscopy +hydrazine +hydrocephalies +hydroforming +hydromania +hydrophilid +hydrorachis +hydrotherapy +hygiastic +hylobatic +hymnic +hypapophysial +hyperboles +hypercycle +hyperfunction +hypermetamorphism +hyperoxide +hyperridiculous +hyperthermy +hyphening +hypoacid +hypoconule +hypogea +hyponasty +hypoploidy +hypostomous +hypothyroid +hypsoisotherm +hysterogenous +iatrochemical +icequake +ichthyologies +iconoclasticism +idaho +identifications +idiogenesis +idioticon +idoloclastic +ignifying +ijolite +iliotrochanteric +illimitation +illuminational +illuvium +imbalances +imbosoms +imitativeness +immedicable +imminences +immortalizable +immuration +impanate +impassionate +impedances +imperatorious +imperishability +imperturbed +implacableness +implied +importable +impostress +impredicable +impressiveness +impropriety +impugns +inaccessibilities +inadvisedly +inapplication +inaugur +incalculably +incase +inchoately +inciters +incoalescence +incommunicado +incomprehensiveness +inconsecutiveness +incontrolled +incorrigibly +incrimination +inculture +indamins +indefinable +indentured +indiadem +indifferentistic +indirubin +indistinctiveness +indoctrinates +inducedly +indults +inebrious +inembryonate +inerts +inexpectant +inextricable +infaunas +infernality +infiltrating +inflames +inflows +infrabestial +infrapubian +infuriately +ingestion +ingrowth +inheres +inia +injectable +inkles +inmeshes +innovated +inodorously +inositols +inquisitively +inscenation +insecurely +insheathe +insistently +insouling +inspoken +instigatingly +instructed +insufficient +insurgency +intarsist +intelligence +intensifier +interangular +intercalm +intercitizenship +interconnection +interdependently +interfaith +interfuse +interjacency +interleaver +interlunar +intermessenger +intermuscular +internuncios +interplait +interpreters +interrenalism +interseamed +interstage +intertragian +interventional +interzygapophysial +intitules +intracanonical +intraglobular +intransitives +intratarsal +intrinsicality +introspectionism +intuition's +inures +invasions +invermination +invests +invited +involvements +iodinating +ioniums +irascibleness +iridocele +ironflower +irradiations +irreducibility +irremediableness +irresolutions +irrigating +isallobar +isepiptesis +isoamylene +isochores +isodontous +isohel +isomerize +isopleth +isostemony +isovalerone +italic +itinerant +jabbering +jackets +jaculated +jailbait +jambs +japanizing +jarool +jaundicing +jaypie +jeez +jemmy +jermonal +jetport +jibbah +jillions +jinket +jobbernowlism +jog +joist +jonathan +jouked +jowing +jubilance +judicatories +jugulate +jumbly +jungly +jurels +justifiably +juxtaterrestrial +kagus +kalam +kamaainas +kans +karosses +kashima +kathode +kecking +keepering +kelpie +kenoticist +keratoleukoma +kernel +ketogen +keying +khankah +kibitka +kidnapper +killed +kiloword +kindredness +kingcob +kinkly +kirned +kitcheny +kjeldahlize +klystron +kneecaps +knighthood +knoll's +knowledgement +koeberliniaceous +koller +koppie +kotwalee +kremlins +kubba +kurrajong +kylix +labialize +labors +lacepiece +laciniation +lacrym +lactonize +ladify +laevoduction +laicality +lakeweed +lambies +lamentingly +lampads +lancelike +landladyship +landslips +languishing +lanthana +lapel +lapsing +largen +larsenite +laryngotome +lassoers +lateralis +lathesman +latrias +laughful +laurel's +laves +lawsuit +lays +leaden +leafy +learners +leatherworking +lecithins +leechkin +legaleses +leggings +legitimizes +leisureful +lene +lenticulare +lepidoid +leptocephalid +lessened +letterspace +leucocytosis +leukomas +levigated +lexically +libations +liberia +lice +lichting +lienic +liferenter +lightbrained +lightwort +likelihood +limans +limewort +limnologist +linages +linemen +linguatuloid +linkwork +lioncel +lipochrome +lippiest +liquidy +listen +lites +lithographical +lithotomous +littlenecks +liverheartedness +loaches +loathsomely +lobscouser +locellus +locoed +lodesman +logbooks +logium +loined +loners +longitude +lookdowns +looten +loranthaceous +lors +loudened +lousiness +loverwise +lowth +lubricative +lucking +luggageless +lumberman +lumpier +lungees +lupinine +lushest +luteciums +luxuriated +lymnaean +lymphomas +lyretail +maar +mach +macilency +macroclimate +macromolecules +macrotome +madeiras +maegbote +magi +magnesic +magnetotelephone +maharajrana +maidy +mainour +majestious +malacanthine +malapertness +malcontentedness +malexecution +malinstitution +malnourishment +maltol +mammectomy +manageableness +mandamused +manducate +mangers +manienie +manito +mannitic +manslaughtering +mantuamaker +manuscript +marabouts +marceline +margeline +mariner +markmoot +marooner +marse +martensitic +marvelling +masher +massages +masterer +mastitis +matadors +materialities +matmaker +matronism +maturish +mauther +maximises +maysin +meadowbur +meanie +meatiest +mechanotherapy +median +medicinableness +mediopectoral +meebos +megagametophyte +megameter +megrim +melanger +melassigenic +melismas +melodies +melosa +memo +menagerie +meningococcal +menotyphlic +menthone +mercaptole +mercuriate +meristele +merohedrism +mesalike +meshier +mesocaecum +mesomyodian +mesoscutellum +messages +metabolical +metafulminuric +metallicity +metamerically +metaphorist +metarhyolite +metatitanate +meteorographic +methine +methylpentose +metrical +metrophotography +mezcals +mica +microbars +microclimate +microdose +micrography +micrometrically +microphotography +microscope's +microsublimation +midbrain +midmandibular +midweek +migratations +mildnesses +milk +millenniarism +millimeter +millrace +mimers +minatorially +minerva +miniconventions +minimizers +ministerialness +minorate +minutiose +mirish +misadventures +misappraise +misbegan +miscalling +misclasses +miscookery +misdemeanor +miseducates +misexplication +misgovernment +misinferred +misky +mismanager +misogynism +mispick +mispursuit +misrepute +missioning +misstopped +misthrift +mistrustful +miswords +mitral +mizzentopman +mobil +modal +modernizers +modulations +moiety +molarities +molests +moloid +moments +monarchianism +moner +mongolian +monk's +monobrominated +monoclinally +monody +monographers +monometer +monophthongization +monoptote +monosulphide +monotypes +montanic +mooched +moonless +moorflower +moping +moravia +morg +moroc +morphographical +mortality +mortuary +mossers +mothership +motorable +motto +mounds +mousehawk +mouzouna +moyo +mucket +mucronate +mudless +muggers +mulctatory +mullite +multicultural +multihearth +multinodous +multipolar +multisulcated +multurer +mundanity +muntjaks +murk +muscadels +musculotendinous +musiclike +muskwood +mustermaster +muth +mutualities +mycetoid +mydriasis +myeloneuritis +myocarditic +myoneme +myotics +myristicaceous +mystagogically +mythogenesis +myxoenchondroma +nacarat +naiad +nakedness +nannandrium +naphthanthracene +narcissistically +naringin +nasalization +nassellarian +nationalizing +naturedly +nautics +navvies +neat +necessarily +necrolatry +nectarium +needy +neglective +neighborstained +nenta +neomenian +neothalamus +nephritis +nepote +nervosity +netherworld +neuralist +neurocele +neurologists +neuropsych +neurotrophic +nevi +newsmagazines +nibble +nicknack +nidificational +niggerfish +nightmary +nikethamide +nineteenth +nisse +nitroaniline +nitty-gritty +nobless-oblige +nocuousness +noggins +nombles +nomophylax +nonactionable +nonalcoholic +nonaqueous +nonautomated +nonbusiness +nonchampion +noncollaborative +noncomputation +noncongratulatory +noncontrastable +noncrushable +nondegenerate +nondeterminately +nondisfigurement +noneducation +nonenforcements +nonevanescent +nonextensive +nonfictional +nonfuturity +nonhearer +nonimpregnated +nonintellectually +nonjurorism +nonmalicious +nonmineralogical +nonnescience +nonorthographical +nonpenal +nonplushed +nonprimitive +nonprotractile +nonrecess +nonremembrance +nonresuscitation +nonsale +nonsensify +nonsludging +nonstationary +nonsummons +nonteetotaler +nontribal +nonutterance +nonvitrified +noonday +normalize +northward +nosism +notaeum +notharctid +notorieties +novate +novice +nubbling +nucleolus +nugatoriness +numbingly +nummulite +nursekin +nutmeat +nybbles +o +oat +obeisance +obituary +oblateness +obliterator +obscenely +observatories +obstinative +obtrusive +ocarina +occlusions +oceanographer +ochronosis +octapla +octogenarians +octuplex +oddnesses +odontolcous +odso +oersted +offerable +offlet +ogive +oilfield +okays +olecranon +oliganthous +oligopyrene +oloroso +omentotomy +omnigraph +omnivarious +onanistic +oneiroscopic +onomatologist +ontosophy +oogenesis +oophoromalacia +opacous +opera's +operose +ophthalmite +opiliaceous +opisthognathism +opposite +opsonification +optimisms +opuscules +orant +orbitolite +orchidist +ordinal +orfrays +organogold +orgue +originals +ornateness +ornoite +orpins +orthodiazine +orthonitroaniline +orthostichous +oscella +osculum +osotriazole +ostariophysous +osteoderm +osteophagia +ostracized +otherwhiles +otomassage +oud +outasks +outblot +outbuilds +outclimb +outdispatch +outerwear +outflare +outglared +outhold +outlandishly +outloved +outpasses +outpractice +outran +outroaring +outsells +outsizes +outspoke +outstrive +outthinks +outvoices +outwile +ouzos +oven's +overalled +overbaked +overblows +overbuilds +overchannel +overcomer +overcontribute +overculture +overdepress +overdoses +overeducated +overexercise +overfamed +overflexion +overfunctioning +overgown +overhated +overhung +overinfluencing +overkeenness +overleave +overlove +overmelodied +overnight +overperemptory +overpowering +overprosperous +overreaction +overrighteous +oversaturated +oversentimentally +oversimply +overspacious +oversteps +oversubscribes +overtask +overtip +overtwine +overwears +overworship +ovisac +owerword +oxaluric +oxidates +oxyacids +oxyhaloid +oxyterpene +ozonide +pachalics +pachypodous +packman +padlike +paganish +pahlavi +paintier +palaeichthyic +palaeolithoid +palagonitic +palatorrhaphy +paleocrystal +paleophysiology +palimony +pallet +palmatisect +palosapis +paltriness +pampootee +pancratiastic +panderer +panelist +panickier +pannikin +pansideman +panterer +pantometry +paolo +papermouth +pappescent +parabaptism +parachute +paradisean +paragastrular +parakeratosis +parallelopipedon +parameterizing +paranuclear +paraplectic +parasite's +paratactic +parazonium +pardoners +parergic +parietosplanchnic +parlay +parochine +paroophoritis +parricidism +parsonlike +participant +partitions +parvirostrate +passados +passir +pasteurizer +pastural +patellofemoral +pathfinders +pathos +patricianhood +patron's +patties +pauperize +pavlov +payably +peacemaker +peaking +peasantry +pechs +pectoralgia +pedalier +pedestalled +pedimental +pedunculation +peetweet +pejorative +pellas +pelted +penalising +pendragonship +penicillinic +pennet +penseful +pentadecane +pentangle +penthiophene +peonage +pepperweed +peracids +percepts +percussively +perfecter +perforator +periangitis +pericecitis +peridermal +perigynial +perineal +perionyx +peripherophose +perishables +peristoma +peritrochium +perlaceous +permittivity +peroratory +perplex +persevered +personating +persuadingly +perturbed +perviability +pestiferously +petechiate +petrifier +pets +pewful +phaenogamian +phalangitic +phansigar +pharmaceutic +pharynges +phasers +phengitical +phenotypically +philanthropically +philodemic +philoprogenitive +philters +phlegma +phocoid +phoneticohieroglyphic +phonophotoscope +phosphid +phossy +photocombustion +photogastroscope +photolithography +photophily +photospherically +photovisual +phrenicocostal +phthalide +phylae +phyllophyte +physicalistic +physiognomic +physoclistous +phytology +phytotomist +piazza +pickaway +picktooth +pictogram +piebaldism +pieridine +pigeons +pigpen +pilaws +pilimiction +pilocarpine +pimpernels +pinchbugs +pinfold +pinkest +pinning +pintado +piped +pipper +pirogue +pisiforms +pit's +pithecomorphism +pituitaries +placated +placodont +plagues +plaitwork +planforms +planners +plantule +plasmon +plataleine +platings +platycephalous +plaudite +playlets +pleasance +plebiscitary +plemyrameter +pleonal +pleurite +plexal +plinks +plotty +plucker +plumbing +plumpened +pluralizes +plushy +pneomanometer +pneumoderma +pneumotherapy +poco +podiums +poecilonymy +pogey +pointedly +poker +polars +policewoman +politicizing +pollinating +poltfooted +polyaxone +polyclona +polyfoil +polygraph +polymaths +polynome +polyphagous +polypodiaceous +polysepalous +polysynthesism +polyvinylidene +pomologically +ponderosa +pontificates +poon +poplar +populi +porismatically +porpentine +portass +portionize +pory +possessedly +postamniotic +postclavicular +poster +postformed +postindustrial +postmesenteric +postpathological +postsacral +postumbilical +potatory +potherb +potstick +poulp +pouter +poxvirus +praecornu +pragmatists +pranksome +praya +preachiest +preadministrator +prealcoholic +preapperception +preballoting +prebudgetary +preceded +precessions +precised +precognize +preconcealed +preconfusedly +precontractive +precredit +predazzite +predeliver +predestinationism +predict +prediscontinuation +prediversion +preeminently +prefaced +prefertilization +preformative +pregnancies +prehensorial +preimpressive +preinscription +preissuance +prelawfulness +preludize +prememorandum +premoistened +prenebular +preoccupate +prepackaged +prepersuasive +prepossessingness +prepuces +preregister +prerich +presbyterians +presence's +presetting +presoak +pressurage +prestos +presuperfluity +pretangibly +preterintentional +pretorture +preutilization +preverb +preweigh +pricker +priesting +primero +primp +principle +priorly +privater +proaesthetic +probabilities +problems +proceeding +procivism +proconstitutional +proctocystotomy +procurement's +prodromus +proettes +professionless +profligacy +prognathi +progressism +projections +proletarianization +prologuize +promiscuousnesses +prompters +pronic +propaedeutical +propendent +prophoric +propolises +proprecedent +propylitization +prorsal +prosecutrices +prosodal +prosperation +prostrated +protectant +protensive +prothetical +protocoling +protomala +protopodite +protovillain +protuberantial +proverbiology +provivisectionist +proximo +prurigos +psammocarcinoma +pseudimago +pseudobulbil +pseudodementia +pseudographia +pseudomantist +pseudonymuncule +pseudopupal +pseudostalagmite +psiloceratan +psychanalysis +psychoepilepsy +psychomotility +psychosomatic +pteridium +pterygomalar +pub +pucellas +pudginess +pugging +pulers +pulmonarian +pulsate +pulvination +punched +punditries +punks +pupil +purchase +purin +purporting +pursier +pushier +putchen +putties +pycnosporic +pyla +pyopneumocyst +pyrans +pyriformis +pyrography +pyrophone +pyrrhotist +qere +quadrates +quadrifoliate +quadripolar +quadruplicature +quaked +quanta +quarrelingly +quartic +quatral +queechy +quenchless +questionableness +quickens +quietness +quincuncially +quinolyl +quinquesyllabic +quintroon +quislings +quizzing +quotients +rabbity +racemous +racisms +radiability +radicle +radiography +radiostereoscopy +raffe +ragger +railleries +rainstorms +rallentando +ramicorn +ramped +ranchos +ranging +rantipole +rappelled +rarety +raspings +ratfish +rationalizer +rattlejack +rave +ravishments +razzed +reaccompanies +reactionarism +reading +reafflict +realizingly +reanimated +reappraised +reascend +reassignments +reattraction +rebarbarization +rebestowal +reboundingness +rebunker +recampaign +recash +receptacles +recharged +reciprocations +reclaimant +recoct +recollects +recompenses +reconciliable +reconnaissance +reconsult +recopyright +recrated +recruiting +rectocystotomy +recurs +redate +redeclaration +redelivery +redetention +redirects +redistricting +redowas +reduced +reed +reelected +reenforcement +reestimating +refashioned +referrible +refix +reflexology +reforged +refractionate +refrigerations +refusers +regathering +regimenal +reglazing +regreen +regularly +reharmonization +rehousing +reimbush +reinclude +reinforcers +reinstalls +reintrenched +reitbuck +rejudging +relast +relay +reliable +relime +relocator +remanence +remedies +remindful +remittors +remord +remurmur +renegers +renominates +renumbered +reoperate +repacked +repasted +repent +rephase +repledge +repoint +repot +representor +reproachableness +reprography +republicanization +repurification +requisitionist +rerival +rescaling +resection +resentful +reshaping +resides +resinfiable +resizer +resolvedness +respade +respoke +restaging +restir +restrap +resubmission +resupplying +resyntheses +retardence +rethrash +retimed +retirements +retractively +retreats +retrocession +retrolabyrinthine +retrusible +reunitedly +revanches +revengeless +reversal +revictualed +revisualize +revolubility +rewardableness +rewins +rhabdomes +rhatanies +rheumarthritis +rhinolithic +rhizomorphic +rhodospermin +rhymes +riatas +ribspare +rickettsialpox +ridge's +riffler +righthanded +rikshaws +rinch +ringster +ripening +rishi +rituality +riverwash +roadman +robed +rocheted +rockweed +roentgenologically +rokeage +romanced +romping +roofwise +root +roping +roseine +rosolios +rotatory +rotundifoliate +roughish +roundline +rouths +rowiness +rubbernecking +rubify +rudder's +ruffer +rugs +rumbustical +rumples +runlet +ruralise +russify +rutherfordium +sabadine +sabots +saccharogalactorrhea +sachemship +sacrificature +sadden +saeter +sagamen +saguran +sainted +salamandarin +salicylaldehyde +sall +salpas +salted +salubriously +salviol +samisens +sanctifiableness +sandbanks +sandra +sanguine +sanjaks +saphena +sapped +sarabands +sarcomatoid +sarges +sartor +satchel +satirised +saturdays +saugh +sautoir +savories +sawmills +sayyids +scaffolds +scalewing +scampi +scantling +scapulospinal +scariness +scatomancy +scelidosaur +sceptry +schepen +schizocarpic +schlepped +scholarless +schoolkeeping +schuits +scillain +sciotherically +sclerencephalia +scleroskeleton +scolecid +scooters +scorekeeping +scotogram +scouthering +scraighing +scratchably +scree +screwless +scrimpit +scrives +scrounged +scrupulosities +sculduddery +scummy +scutcheoned +scyphi +seaconny +seambiter +seas +seawater +secessionists +secretest +secularism +sedentariness +sedums +seemer +segmenting +seisable +seizures +selenion +seligmannite +semball +semiantiministerial +semicarbazone +semicomical +semicyclic +semidried +semifloret +semihot +semimembranosus +seminole +semiparameter +semipronation +semiruin +semisolid +semitheological +semola +senectitude +sensationalistic +sensive +sentimentalists +separatum +septendecimal +septship +sequesters +serdabs +serglobulin +serioline +serological +serpentiferous +serrirostrate +servilities +sesquisulphide +settaine +severalize +sexangularly +sextets +shabbed +shadoof +shagreen +shalloons +shameworthy +shantey +sharers +shastri +shay +shedder +sheepshear +shelduck +sheltron +sheriffess +shielders +shilfa +shining +shipper +shirtmaker +shoalest +shoepac +shooting +shopworker +shorthander +shoupeltin +showily +shrewlike +shrinking +shucker +shuteye +sialostenosis +siciliana +side +sideronym +sidlingly +sigher +sigmatism +signifer +sikhara +silicified +silkiest +siltier +silverwork +simoleon +simplificative +sinarchism +single +sinistrodextral +sinuatedentate +siphonoglyphe +sires +sissyism +situate +sizeable +skats +skellat +skew +skiepper +skims +skippy +skivvies +skunkish +skyscraper's +slaister +slantways +slaty +sleazy +sleepwalker +slewing +slim +slipforming +slithered +sloke +slotted +slubberer +slumberers +slushiest +smaltines +smeariness +smifligation +smithydander +smoodger +smudginess +snagbush +snapbag +snatches +sneesh +sniffled +snitchers +snoop +snout's +snowmobiles +snuffles +soapers +sobproof +sociocentrism +sockman +sofa's +soilages +solarising +solecist +solfeggi +solifidianism +solomon +solvolysis +somebodies +somnambulism +sonderclass +sonnetting +soothsaid +sopor +sordidity +sororicidal +sosoish +soum +sourdines +southernly +sowable +spacesuits +spaewoman +spaniards +sparing +sparsile +spatling +spealbone +specification +spectator +spectroradiometry +speedier +spellers +spermatid +spermoduct +sphaerosome +spherical +sphinxianness +spicks +spigot +spinal +spinnakers +spinulescent +spiriferous +spirling +spitter +splashingly +splendourproof +splenoptosis +splotchier +spokeswomanship +spongewood +spookery +sporadical +sporophyll +sporule +sprag +spreeuw +springtail +sprug +spurgalling +spy +squaloid +square +squattocratic +squeg +squinnied +squirrelling +stabilizing +stadia +stagging +staircases +stalkable +stampable +standings +stapedial +starchedly +starnie +stash +statical +statures +staying +steamed +steedlike +steeples +stele +stenchion +stenter +steppingstones +stereographer +stereotelemeter +sternebrae +stet +stibblerig +stickseed +stigmatizer +stime +stinkhorn +stipulatory +stocah +stockpots +stolelike +stomatograph +stoneless +stooled +storage +storms +stovehouse +strafes +straitening +strangulated +straticulate +strawless +streek +strepitous +strewment +stridulent +stringing +strobilate +strongfully +strouthocamelian +strung +stuccoer +stuffings +stunsle +sturniform +stylistics +styraxes +subadult +subarcuate +subbrachycephalic +subcheliform +subcommunities +subcorporation +subdefinitions +subdivine +subencephalon +subfalcial +subgenual +subhyoidean +subitaneous +subkingdom +sublimes +submental +submountain +suborbitar +subpenaing +subprocess +subrent +subscription +subshrubs +subspecifically +substitutions +subteen +subtilizer +subtriplicated +subvassal +succedaneous +succorer +suckered +sudor +suffixation +sugarcoated +suicidism +sulfacid +sulfogermanate +sulk +sulphatize +sulphogermanic +sulphovinic +sultans +summerhouses +sumptuous +sundogs +sunroofs +superabundances +superarctic +supercatastrophe +superconsecrated +supereconomy +superexcellently +superflux +superhumans +superinsist +supermagnificent +supernotable +superperson +superremuneration +superseminate +superspecialize +supersweet +supervisee +supplementally +supposableness +supraciliary +supranaturalism +supratrochlear +sure +surgeoness +surpeopled +surrogate's +suscept +suspiration +suturation +swaggy +swanhood +swarthness +sweal +sweetbriers +swelltoad +swimminess +swinking +swithly +swordlet +syconid +syllogistical +symbiotism +symmorphism +symphyogenesis +synagogical +synaxis +synclinore +syndetical +synergism +synonymes +syntheses +syphilized +systatic +tabaret +tablelike +tabu +tachyglossal +tackling +taenian +taguan +tailorhood +tajes +tald +talking +tallywalka +tamaricaceous +tampala +tangent's +tanistic +tannometer +taotai +tapings +tarantism +targetlike +tarpaulins +tarsus +taryard +tasteably +tattler +taurus +tautozonal +taxably +taxonom +teacheress +teapoys +teashops +technicological +tedded +teeters +tehsildar +teledendrion +telemetrist +telephony +telethermometry +teliosporic +teloteropathic +tempered +temporize +tenacity +tenderling +tenets +tenorites +tentaculocyst +tenurial +teratological +teredos +terminative +terp +terrenely +terrorist's +tessellates +testiculated +tetanizing +tetrachloroethylene +tetragrammatonic +tetrapharmacal +tetrasubstituted +teughly +thairms +thalthan +thar +theater's +theer +themelet +theolatrous +theophany +theory +therefore +thermantic +thermogenic +thermoreceptor +thesaurus +thiazoline +thight +thinkingpart +thionation +thirsted +tholed +thoracostracous +thoroughwax +thrashers +threefold +thrillers +thrombocytes +throwbacks +thulia +thunderheads +thwacks +thymuses +thyroparathyroidectomize +tibourbou +tickweed +tidyism +tigerkin +tile +timaraus +timeliness +tinampipi +tinglier +tinseling +tipcats +tipup +titaness +titillation +tittuppy +toadstool +tochered +toff +toiletted +tolerances +toluides +tomcats +toned +tonights +tonsured +toothbrush's +topchrome +topman +toprope +tordrillite +torolillo +torridness +tortuosity +tostication +totipotential +tougheners +tousche +towerwork +towny +toxigenicities +toytown +trachelomastoid +trachytoid +trade +traducianistic +traguline +trait's +tramp +tranquillest +transcending +transfashion +transformingly +transire +translocate +transmontane +transpirative +transpour +transvenom +trapezoidiform +traumaticine +travestiment +treasured +treeless +trembly +trendy +trestles +triangle +tribe +tributorian +trichites +trichorrhexic +tricksiness +tricycle +trifacial +triglochid +trihemiobol +trilling +trimetrical +trinitroresorcin +trioxazine +tripinnatifid +tripped +trisected +tristichs +tritocerebral +triunsaturated +trochiform +trogs +tromple +trophochromatin +tropophil +troublously +troweling +truculencies +trumperiness +trunnions +truthiness +trytophan +tuba +tuberculinization +tubiporid +tuckahoes +tugui +tumblings +tunbellied +tunket +turbaned +turboprops +turjaite +turniplike +turricular +tussle +tutster +twank +twelfthly +twilled +twirl +twitty +tymbals +typewrited +typic +tyrannically +tzardoms +udometries +ulcerated +ulsterette +ultraenthusiastic +ultramicrotome +ultrasonogram +umbellets +umbrellalike +unabject +unaccord +unactively +unadorn +unaffrightedly +unallegorical +unamo +unanswerable +unapposite +unarisen +unassailable +unattainableness +unavailingly +unbalanceable +unbeaded +unbegun +unbenumb +unbinds +unblooming +unborn +unbraved +unbruised +unbush +uncanned +uncasing +uncereclothed +uncharily +unchiselled +uncircumscribable +uncleaned +unclogs +uncoffle +uncomely +uncompassable +uncompromisingly +unconditionately +unconglobated +unconsolable +uncontentable +unconventionality +uncorrect +uncourting +uncredulous +unctiousness +uncuth +undebilitated +undecorously +undefrauded +undemonstrative +underagent +underbreathing +underclassmen +underdead +underestimations +undergaoler +underhang +underletter +underminer +underpier +underqualified +underscript +undersill +understay +underteacher +underverse +undescried +undethronable +undignify +undiscolored +undismounted +undissuade +undivisible +undoubtedness +undrossy +undying +uneffectible +unemancipated +unenchant +unennobled +unepauleted +unescapably +uneverted +unexcommunicated +unexpectable +unexpressibly +unfactitious +unfarced +unfeather +unfertile +unfingered +unflavored +unfocused +unforeseenly +unfortunates +unfrictioned +unfulsome +ungamboling +ungentlewomanlike +unglobular +ungovernably +ungreen +unguidably +unhallowing +unharnesses +unhearty +unhid +unhonest +unhumbled +uniaxial +unidentifiably +uniformization +unimaginative +unimpelled +unimuscular +uninerved +uninitiation +unintellectual +uninterruption +uninweaved +uniquity +unitarism +universes +unjoyously +unkindest +unlaboring +unlawed +unlettable +unlimitable +unloath +unlovingness +unmakable +unmarine +unmeasurably +unmenstruating +unmighty +unmistrusted +unmollifying +unmovability +unmysticize +unneglected +unnoted +unobstinate +unomitted +unoriginality +unpacifiable +unparallelable +unpassing +unpedigreed +unperiodical +unpetal +unpimpled +unplayable +unpoetize +unpossessively +unpredict +unpreservable +unprobated +unpromised +unprosperousness +unpulleyed +unqualifiable +unquitted +unravished +unreceivable +unred +unregainable +unreliableness +unrenownedness +unreproachableness +unresolved +unretracted +unrhythmic +unrippled +unrotund +unrustling +unsampled +unsatisfyingly +unschematized +unscrutinizing +unsee +unseparate +unshakably +unshelve +unshrivelled +unsimplify +unslammed +unsmokified +unsoiledness +unsorry +unspeculating +unspontaneously +unstaid +unstealthy +unstonable +unstrip +unsubsided +unsuitably +unsurcharge +unswathed +unsystematic +untar +untemptability +untheatrical +unthrones +untiring +untownlike +untransmissible +untripped +untumefied +ununderstandably +unvalidating +unveracious +unvisibly +unwading +unwasted +unweelness +unwigged +unwits +unwoundableness +upalley +upbuild +updarted +upgaze +upholstered +uploadable +upraisers +uprushing +upsplash +upsurging +upturned +uranate +urase +ureameter +ureterolithic +urethroscopical +urinocryoscopy +urogenic +uroseptic +urushic +usneas +uswards +utilitarianize +utterly +vacates +vacual +vagina +vaguer +valeramide +valkyrie +valueless +vanadiate +vanishment +vaporizer +variatious +variolovaccine +vasculose +vasotrophic +vaudevillist +vectorially +vegetativeness +veinwise +velocities +vendibility +venery +venosities +ventriloqual +venules +verberate +verek +verite +vermonter +versable +versipel +vertigo +vesiculose +vestigiary +vetivers +vials +vibromassage +vicine +victualless +viewings +vilayets +villanously +vinculation +vinic +violater +viperishly +virginship +virtuefy +visceroskeletal +visioned +visuoauditory +vitiable +vitrioline +vivider +vizircraft +vociferates +voiturette +volitiency +volume +volvent +vortices +vowelizing +vulcanologist +vulvas +waddying +waffs +wagoned +wainwrights +wakefully +walkway +walter +wandoo +wanton +wardman +warlikely +warps +wart's +washings +wasteland +watchingly +waterier +waterweed +wave +waxchandler +waymaker +wealthmaking +weasands +weaves +wedgy +weeper +weighmen +welcomed +welsh +werewolves +wetchet +whamming +whatnots +wheelmaking +whelpling +wherrying +whiffs +whinestone +whippy +whirrs +whistles +whitesmith +whizbang +whooplas +whup +widdie +wieldy +wiglets +wilfully +wills +windbreaks +window +wineglass +wingtip +winterdykes +wirebird +wisconsinites +wiskinky +witcraft +withinward +wittings +woddie +wolfskin +wombstone +wonting +woodhacker +woodsilver +woollier +wordable +workbox +workwise +worricow +worthinesses +wracker +wreak +wretched +wristlets +wrongheadedly +wurtzilite +xanthine +xanthyl +xeranthemum +xiphiplastron +xylogen +yabbering +yakka +yappy +yashmacs +yday +yeld +yenning +yetis +yobi +yokeless +youngest +yowt +yuppie +zamias +zax +zeiss +zested +zillionth +zinkenite +zoacum +zoned +zoogeographic +zoometries +zoophytography +zorilla +zygomatic +zymogens From c380053190616dc804d49d2a95cb2c629bd66fe2 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Mon, 25 Jun 2018 16:09:29 -0400 Subject: [PATCH 57/83] Fixes for CachingBAMFileIndex (#1156) * Fixes for CachingBAMFileIndex * There were several bugs in CachingBAMFileIndex that were caused by incorrect use of a WeakHashMap. Simplifying the code by removing the WeakHashMap and replacing it with a single cached value. This shouldn't have any negative impact on performance because only the most recently accessed contig was available from the HashMap anyway. * fixed #1127, an issue where cache hits in contigs with indexes higher than 127 could result in null values being returned incorrectly * fixed a memory leak where we never released contigs with indexes 0 -> 127 from the cache --- .../htsjdk/samtools/CachingBAMFileIndex.java | 52 ++++---- .../samtools/CachingBAMFileIndexTest.java | 123 ++++++++++++++++++ 2 files changed, 149 insertions(+), 26 deletions(-) create mode 100644 src/test/java/htsjdk/samtools/CachingBAMFileIndexTest.java diff --git a/src/main/java/htsjdk/samtools/CachingBAMFileIndex.java b/src/main/java/htsjdk/samtools/CachingBAMFileIndex.java index 5597832c21..4a1a264d92 100644 --- a/src/main/java/htsjdk/samtools/CachingBAMFileIndex.java +++ b/src/main/java/htsjdk/samtools/CachingBAMFileIndex.java @@ -29,7 +29,6 @@ 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 @@ -37,8 +36,13 @@ */ class CachingBAMFileIndex extends AbstractBAMFileIndex implements BrowseableBAMIndex { - private Integer mLastReferenceRetrieved = null; - private final WeakHashMap mQueriesByReference = new WeakHashMap(); + // Since null is a valid return value for this index, it's possible to have lastReferenceIndex != null and + // lastReference == null, this is effectively caching the return value null + private Integer lastReferenceIndex = null; + private BAMIndexContent lastReference = null; + + private long cacheHits = 0; + private long cacheMisses = 0; public CachingBAMFileIndex(final File file, final SAMSequenceDictionary dictionary) { super(file, dictionary); @@ -110,7 +114,7 @@ public BAMFileSpan getSpanOverlapping(final Bin bin) { final int firstLocusInBin = getFirstLocusInBin(bin); // Add the specified bin to the tree if it exists. - final List binTree = new ArrayList(); + final List binTree = new ArrayList<>(); if(indexQuery.containsBin(bin)) binTree.add(indexQuery.getBins().getBin(bin.getBinNumber())); @@ -139,35 +143,31 @@ public BAMFileSpan getSpanOverlapping(final Bin bin) { * 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. + * @return The index information for this reference or null if no index information is available for the given index. */ @Override 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; + // This compares a boxed Integer to an int with == which is ok because the Integer will be unboxed to the primitive value + if(lastReferenceIndex!=null && lastReferenceIndex == referenceIndex){ + cacheHits++; + return lastReference; } - // 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; - } + // If not attempt to load it from disk. + final BAMIndexContent queryResults = query(referenceIndex,1,-1); + cacheMisses++; + lastReferenceIndex = referenceIndex; + lastReference = queryResults; + return lastReference; + } + + public long getCacheHits() { + return cacheHits; + } - // Not even available on disk. - return null; + public long getCacheMisses() { + return cacheMisses; } } diff --git a/src/test/java/htsjdk/samtools/CachingBAMFileIndexTest.java b/src/test/java/htsjdk/samtools/CachingBAMFileIndexTest.java new file mode 100644 index 0000000000..e810b25aea --- /dev/null +++ b/src/test/java/htsjdk/samtools/CachingBAMFileIndexTest.java @@ -0,0 +1,123 @@ +package htsjdk.samtools; + + +import htsjdk.HtsjdkTest; +import htsjdk.samtools.util.IOUtil; +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class CachingBAMFileIndexTest extends HtsjdkTest { + + /** + * test case to reproduce https://github.com/samtools/htsjdk/issues/1127 + * this tests for a bug that was hidden on human data pre-hg38 due to a weird interaction between WeakHashMap Integer interning + */ + @Test + public void testCachingBamFileIndextest() throws IOException { + try(final CachingBAMFileIndex index = getIndexWith200Contigs()) { + Assert.assertNotNull(index.getQueryResults(1)); + System.gc(); + //contig 1 is never garbage collected because Integer(1) is interned by the jvm and never garbage collectable + Assert.assertNotNull(index.getQueryResults(1)); + + Assert.assertNotNull(index.getQueryResults(128)); + System.gc(); + //contig 128 is garbage collected and hits the bug because 128+ is not interned + Assert.assertNotNull(index.getQueryResults(128)); + } + } + + private static CachingBAMFileIndex getIndexWith200Contigs() throws IOException { + List contigs = IntStream.range(1, 200) + .mapToObj(i -> new SAMSequenceRecord(String.valueOf(i), 1000)) + .collect(Collectors.toList()); + final SAMSequenceDictionary dict = new SAMSequenceDictionary(contigs); + final SAMFileHeader header = new SAMFileHeader(dict); + header.setSortOrder(SAMFileHeader.SortOrder.coordinate); + + final SAMFileWriterFactory writerFactory = new SAMFileWriterFactory().setCreateIndex(true); + final File outBam = File.createTempFile("tmp", ".bam"); + try(final SAMFileWriter writer = writerFactory.makeWriter(header, true, outBam, null)){ + IntStream.range(1,200).mapToObj(i -> { + final SAMRecord record = new SAMRecord(header); + record.setReadName("name" + i); + record.setReferenceName(String.valueOf(i)); + record.setReadUnmappedFlag(false); + record.setAlignmentStart(1); + record.setCigarString("20M"); + return record; + }).forEach(writer::addAlignment); + } + + final File indexFile = new File(outBam.getParent(), IOUtil.basename(outBam) + BAMIndex.BAMIndexSuffix); + indexFile.deleteOnExit(); + outBam.deleteOnExit(); + return new CachingBAMFileIndex(indexFile, dict); + } + + @Test + public void testCacheHitsAndMissesTheExpectedNumberOfTimes() throws IOException { + try(final CachingBAMFileIndex index = getIndexWith200Contigs()) { + index.getQueryResults(1); + assertCacheStats(index, 0, 1); + + index.getQueryResults(1); + assertCacheStats(index, 1, 1); + + index.getQueryResults(150); + assertCacheStats(index, 1, 2); + + index.getQueryResults(150); + assertCacheStats(index,2,2); + + index.getQueryResults(150); + assertCacheStats(index,3,2); + + index.getQueryResults(1); + assertCacheStats(index, 3, 3); + + index.getQueryResults(1); + assertCacheStats(index, 4, 3); + + index.getQueryResults(1000); + assertCacheStats(index,4,4); + } + } + + @Test + public void testNullResultIsCached() throws IOException { + try(final CachingBAMFileIndex index = getIndexWith200Contigs()) { + BAMIndexContent queryResults = index.getQueryResults(1000); + Assert.assertNull(queryResults); + assertCacheStats(index, 0, 1); + + queryResults = index.getQueryResults(1000); + Assert.assertNull(queryResults); + assertCacheStats(index, 1, 1); + + queryResults = index.getQueryResults(1); + Assert.assertNotNull(queryResults); + assertCacheStats(index, 1, 2); + + queryResults = index.getQueryResults(1000); + Assert.assertNull(queryResults); + assertCacheStats(index, 1, 3); + + queryResults = index.getQueryResults(1000); + Assert.assertNull(queryResults); + assertCacheStats(index, 2, 3); + } + } + + private static void assertCacheStats(CachingBAMFileIndex index, int hits, int misses) { + Assert.assertEquals(index.getCacheHits(), hits, "cache hits didn't match expected"); + Assert.assertEquals(index.getCacheMisses(), misses, "cache misses didn't match expected"); + } + +} \ No newline at end of file From c4dbf4a918f7b3a6e55634e94579572fdcdd89fd Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Wed, 27 Jun 2018 11:55:20 -0400 Subject: [PATCH 58/83] fixing spelling Indeces -> Indices (#1157) * deprecating getPLIndecesOfAlleles and getGLIndecesOfAlternateAllele and replacing them with correctly spelled but otherwise identical functions --- .../java/htsjdk/tribble/index/AbstractIndex.java | 2 +- .../variantcontext/GenotypeLikelihoods.java | 15 ++++++++++++++- .../variant/variantcontext/VariantContext.java | 12 ++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/main/java/htsjdk/tribble/index/AbstractIndex.java b/src/main/java/htsjdk/tribble/index/AbstractIndex.java index ac90e5d2ba..04752eb76f 100644 --- a/src/main/java/htsjdk/tribble/index/AbstractIndex.java +++ b/src/main/java/htsjdk/tribble/index/AbstractIndex.java @@ -142,7 +142,7 @@ public boolean equalsIgnoreProperties(final Object obj) { } if (!chrIndices.equals(other.chrIndices)) { - System.err.printf("equals chrIndeces: this %s != other %s%n", chrIndices, other.chrIndices); + System.err.printf("equals chrIndices: this %s != other %s%n", chrIndices, other.chrIndices); return false; } diff --git a/src/main/java/htsjdk/variant/variantcontext/GenotypeLikelihoods.java b/src/main/java/htsjdk/variant/variantcontext/GenotypeLikelihoods.java index 605f2985f5..ddaaf55e3e 100644 --- a/src/main/java/htsjdk/variant/variantcontext/GenotypeLikelihoods.java +++ b/src/main/java/htsjdk/variant/variantcontext/GenotypeLikelihoods.java @@ -567,13 +567,26 @@ public static GenotypeLikelihoodsAllelePair getAllelePairUsingDeprecatedOrdering } /** - * get the PL indexes (AA, AB, BB) for the given allele pair; assumes allele1Index <= allele2Index. + * get the PL indices (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 + * @deprecated 7/18 use {@link #getPLIndicesOfAlleles(int, int)} instead */ + @Deprecated public static int[] getPLIndecesOfAlleles(final int allele1Index, final int allele2Index) { + return getPLIndicesOfAlleles(allele1Index, allele2Index); + } + + /** + * get the PL indices (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[] getPLIndicesOfAlleles(final int allele1Index, final int allele2Index) { final int[] indexes = new int[3]; indexes[0] = calculatePLindex(allele1Index, allele1Index); diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantContext.java b/src/main/java/htsjdk/variant/variantcontext/VariantContext.java index a45c9ea167..1f884d30a4 100644 --- a/src/main/java/htsjdk/variant/variantcontext/VariantContext.java +++ b/src/main/java/htsjdk/variant/variantcontext/VariantContext.java @@ -1722,12 +1722,20 @@ public List getAlleleIndices(final Collection alleles) { .collect(Collectors.toCollection(() -> new ArrayList<>(alleles.size()))); } + /** + * @deprecated 7/18 use {@link #getGLIndicesOfAlternateAllele(Allele)} instead + */ + @Deprecated public int[] getGLIndecesOfAlternateAllele(Allele targetAllele) { + return getGLIndicesOfAlternateAllele(targetAllele); + } + + public int[] getGLIndicesOfAlternateAllele(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); + return GenotypeLikelihoods.getPLIndicesOfAlleles(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 From c4912e9c08beffda92785285f6c481d6aeaf2a27 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Wed, 27 Jun 2018 11:55:42 -0400 Subject: [PATCH 59/83] update to gradle 4.8 (#1154) * updating gradle, plugins, and test dependencies * Upgrading our version of gradle and our test dependencies. This is a move towards supporting building under java 9/10 although some issues remain. gradle 3.2.1 -> 4.8 shadow plugin 1.2.3 -> 2.0.4 scalatest plugin 0.15 -> 0.22 gitversion plugin 0.5.1 -> 0.11.0 testng 6.13.1 -> 6.14.3 scala-library 2.12.1 -> 2.12.6 scalatest 3.0.1 -> 3.0.5 pegdown 1.4.2 -> 1.6.0 updating the gradle wrapper task definition because the way we were doing it has been deprecated removing jacoco version specification so we stay up to date automatically * bumping to 4.8.1 --- build.gradle | 24 +++++++++-------------- gradle/wrapper/gradle-wrapper.jar | Bin 52928 -> 54417 bytes gradle/wrapper/gradle-wrapper.properties | 3 +-- gradlew | 23 ++++++++++++---------- 4 files changed, 23 insertions(+), 27 deletions(-) diff --git a/build.gradle b/build.gradle index f4cbb34a1a..7753a6f386 100644 --- a/build.gradle +++ b/build.gradle @@ -10,20 +10,15 @@ plugins { 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.maiflai.scalatest' version '0.15' + id 'com.palantir.git-version' version '0.11.0' + id 'com.github.johnrengelman.shadow' version '2.0.4' + id 'com.github.maiflai.scalatest' version '0.22' } repositories { mavenCentral() } -// JaCoCo version -jacoco { - toolVersion = "0.8.0" -} - jacocoTestReport { group = "Reporting" description = "Generate Jacoco coverage reports after running tests." @@ -43,10 +38,10 @@ dependencies { compile "org.tukaani:xz:1.5" compile "gov.nih.nlm.ncbi:ngs-java:2.9.0" - testCompile "org.scala-lang:scala-library:2.12.1" - testCompile "org.scalatest:scalatest_2.12:3.0.1" - testRuntime 'org.pegdown:pegdown:1.4.2' // Necessary for generating HTML reports with ScalaTest - testCompile "org.testng:testng:6.13.1" + testCompile "org.scala-lang:scala-library:2.12.6" + testCompile "org.scalatest:scalatest_2.12:3.0.5" + testRuntime 'org.pegdown:pegdown:1.6.0' // Necessary for generating HTML reports with ScalaTest + testCompile "org.testng:testng:6.14.3" testCompile "com.google.jimfs:jimfs:1.1" } @@ -131,9 +126,8 @@ task testSRA(type: Test) { } } -task wrapper(type: Wrapper) { - description = "Regenerate the gradle wrapper" - gradleVersion = '3.2.1' +wrapper { + gradleVersion = '4.8.1' } // This is a hack to disable the java 8 default javadoc lint until we fix the html formatting diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 6ffa237849ef3607e39c3b334a92a65367962071..758de960ec7947253b058ff79c88ce51f3abe08a 100644 GIT binary patch delta 37353 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 delta 35793 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 NX;K92ug#tK>n}!K9xMO= diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f08cd01bf2..2d80b69a76 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Fri Jan 20 17:10:11 EST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-all.zip diff --git a/gradlew b/gradlew index 9aa616c273..cccdd3d517 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -154,16 +154,19 @@ if $cygwin ; then 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=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then cd "$(dirname "$0")" fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" From 8767e64f75697340bd9040d24249b950c96f433c Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Mon, 2 Jul 2018 16:20:49 -0400 Subject: [PATCH 60/83] adding position to SAMRecord.toString() (#1158) * SAMRecord.toString previously only said if it was mapped or not, now it includes the position if it is mapped --- src/main/java/htsjdk/samtools/SAMRecord.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/htsjdk/samtools/SAMRecord.java b/src/main/java/htsjdk/samtools/SAMRecord.java index 1b5c5a95c8..3146f6b48a 100644 --- a/src/main/java/htsjdk/samtools/SAMRecord.java +++ b/src/main/java/htsjdk/samtools/SAMRecord.java @@ -2311,7 +2311,7 @@ public String toString() { builder.append(" unmapped read."); } else { - builder.append(" aligned read."); + builder.append(String.format(" aligned to %s:%d-%d.", getContig(), getAlignmentStart(), getAlignmentEnd())); } return builder.toString(); From e6d5c29408ebd4d029f884c24eb8785c15fa623f Mon Sep 17 00:00:00 2001 From: Steve Huang Date: Wed, 4 Jul 2018 15:36:55 -0400 Subject: [PATCH 61/83] fix an copy-paste error in VCFHeader (#1160) --- src/main/java/htsjdk/variant/vcf/VCFHeader.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeader.java b/src/main/java/htsjdk/variant/vcf/VCFHeader.java index 00ed26ee04..c5cab7434b 100644 --- a/src/main/java/htsjdk/variant/vcf/VCFHeader.java +++ b/src/main/java/htsjdk/variant/vcf/VCFHeader.java @@ -246,16 +246,16 @@ public List getFilterLines() { } /** - * @return all of the VCF FILTER lines in their original file order, or an empty list if none were present + * @return all of the VCF ID-based header lines in their original file order, or an empty list if none were present */ public List getIDHeaderLines() { - final List filters = new ArrayList(); + final List lines = new ArrayList(); for (final VCFHeaderLine line : mMetaData) { if (line instanceof VCFIDHeaderLine) { - filters.add((VCFIDHeaderLine)line); + lines.add((VCFIDHeaderLine)line); } } - return filters; + return lines; } /** From e0bf651c3122190134d0ea72b940b59567f0a31e Mon Sep 17 00:00:00 2001 From: Yossi Farjoun Date: Mon, 9 Jul 2018 16:17:35 -0400 Subject: [PATCH 62/83] Yf locatable all the things (#1159) - Wrote constructors to take Locatable as input when appropriate. - Deprecated strangely named methods - Extra javadoc etc. --- .../samtools/util/AbstractLocusInfo.java | 2 +- .../java/htsjdk/samtools/util/Interval.java | 116 +++++++++++------ .../variantcontext/VariantContext.java | 2 +- .../htsjdk/variant/vcf/VCFFileReader.java | 120 +++++++++++++----- .../samtools/util/IntervalListTest.java | 6 +- .../tribble/index/IndexFactoryTest.java | 3 +- 6 files changed, 169 insertions(+), 80 deletions(-) diff --git a/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java b/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java index c4bbbaebb2..95150e0c51 100644 --- a/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java +++ b/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java @@ -40,7 +40,7 @@ * @author Darina_Nikolaeva@epam.com, EPAM Systems, Inc. * */ -public class AbstractLocusInfo implements Locus , Locatable { +public class AbstractLocusInfo implements Locus, Locatable { /** * Reference sequence, to which the reads are aligned. **/ diff --git a/src/main/java/htsjdk/samtools/util/Interval.java b/src/main/java/htsjdk/samtools/util/Interval.java index 51e91270af..8eabcbc432 100644 --- a/src/main/java/htsjdk/samtools/util/Interval.java +++ b/src/main/java/htsjdk/samtools/util/Interval.java @@ -44,23 +44,29 @@ public class Interval implements Comparable, Cloneable, Locatable { * 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 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 {@link Locatable}. + */ + public Interval(final Locatable locatable) { + this(locatable.getContig(), locatable.getStart(), locatable.getEnd()); + } + /** * 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 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 - * + * @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; @@ -70,63 +76,90 @@ public Interval(final String sequence, final int start, final int end, final boo this.name = name; } - /** Gets the name of the sequence on which the interval resides. + /** + * 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(); } - + 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 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 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 the name of the interval, possibly null. + */ + public String getName() { + return this.name; + } - /** Returns true if this interval overlaps the other interval, otherwise false. */ + /** + * 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())); + 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 (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. */ + /** + * 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); + 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. */ + /** + * 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); + (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; } + /** + * 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. */ + /** + * 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); + 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. */ + /** + * Counts the total number of bases a collection of intervals. + */ public static long countBases(final Collection intervals) { long total = 0; for (final Interval i : intervals) { @@ -136,7 +169,6 @@ public static long countBases(final Collection intervals) { return total; } - /** * Sort based on sequence.compareTo, then start pos, then end pos * with null objects coming lexically last @@ -149,8 +181,7 @@ public int compareTo(final Interval that) { if (result == 0) { if (this.getStart() == that.getStart()) { result = this.getEnd() - that.getEnd(); - } - else { + } else { result = this.getStart() - that.getStart(); } } @@ -158,12 +189,14 @@ public int compareTo(final Interval that) { return result; } - /** Equals method that agrees with {@link #compareTo(Interval)}. */ + /** + * 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; + Interval that = (Interval) other; return (this.compareTo(that) == 0); } } @@ -182,8 +215,11 @@ public String toString() { @Override public Interval clone() { - try { return (Interval) super.clone(); } - catch (CloneNotSupportedException cnse) { throw new SAMException("That's unpossible", cnse); } + try { + return (Interval) super.clone(); + } catch (CloneNotSupportedException cnse) { + throw new SAMException("That's unpossible", cnse); + } } @Override diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantContext.java b/src/main/java/htsjdk/variant/variantcontext/VariantContext.java index 1f884d30a4..46b124496d 100644 --- a/src/main/java/htsjdk/variant/variantcontext/VariantContext.java +++ b/src/main/java/htsjdk/variant/variantcontext/VariantContext.java @@ -25,6 +25,7 @@ package htsjdk.variant.variantcontext; +import htsjdk.samtools.util.Locatable; import htsjdk.tribble.Feature; import htsjdk.tribble.TribbleException; import htsjdk.tribble.util.ParsingUtils; @@ -215,7 +216,6 @@ * asking for a fully decoded version of the VC. * * - * @author depristo */ public class VariantContext implements Feature, Serializable { public static final long serialVersionUID = 1L; diff --git a/src/main/java/htsjdk/variant/vcf/VCFFileReader.java b/src/main/java/htsjdk/variant/vcf/VCFFileReader.java index 64b66da4f3..da61822890 100644 --- a/src/main/java/htsjdk/variant/vcf/VCFFileReader.java +++ b/src/main/java/htsjdk/variant/vcf/VCFFileReader.java @@ -1,3 +1,27 @@ +/* + * 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.variant.vcf; import htsjdk.samtools.SAMFileHeader; @@ -92,8 +116,7 @@ public VCFFileReader(final File file, final File indexFile, final boolean requir * Returns the SAMSequenceDictionary from the provided VCF file. */ public static SAMSequenceDictionary getSequenceDictionary(final Path path) { - final SAMSequenceDictionary dict = new VCFFileReader(path, false).getFileHeader().getSequenceDictionary(); - return dict; + return new VCFFileReader(path, false).getFileHeader().getSequenceDictionary(); } /** @@ -135,7 +158,7 @@ public VCFFileReader(final Path path, final Path indexPath, final boolean requir * 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 path + * @param path a VCF * @return */ public static IntervalList toIntervalList(final Path path) { @@ -152,9 +175,12 @@ public static IntervalList toIntervalList(final Path path, final boolean include * 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 + * @param file a VCF + * @return an {@link IntervalList} + * + * @deprecated since July 2018 use {@link #toIntervalList(Path)} instead */ + @Deprecated public static IntervalList fromVcf(final File file) { return toIntervalList(file.toPath()); } @@ -165,15 +191,18 @@ public static IntervalList fromVcf(final File file) { * * @param file * @return + * @deprecated since July 2018 use {@link #toIntervalList(Path, boolean)} instead */ + @Deprecated public static IntervalList fromVcf(final File file, final boolean includeFiltered) { return toIntervalList(file.toPath(), includeFiltered); } /** - * 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). + * Converts the underlying VCFFileReader 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 on un-named intervals. Will use the "END" tag in the INFO field as the end of the interval + * (if exists). * * @return an IntervalList constructed from input vcf */ @@ -182,49 +211,64 @@ public IntervalList toIntervalList() { } public IntervalList toIntervalList(final boolean includeFiltered) { - - //grab the dictionary from the VCF and use it in the IntervalList - final SAMSequenceDictionary dict = getFileHeader().getSequenceDictionary(); - final SAMFileHeader samFileHeader = new SAMFileHeader(); - samFileHeader.setSequenceDictionary(dict); - final IntervalList list = new IntervalList(samFileHeader); - - int intervals = 0; - for (final VariantContext vc : this) { - 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; + return toIntervalList(this, includeFiltered); } /** * 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). + * 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 + * + * @deprecated since July 2018 since use {@link #toIntervalList(VCFFileReader)} instead */ + @Deprecated public static IntervalList fromVcf(final VCFFileReader vcf) { return fromVcf(vcf, false); } /** * 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). + * 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 toIntervalList(final VCFFileReader vcf) { + return toIntervalList(vcf, false); + } + + + /** + * 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 + * + * @deprecated since July 2018 since use {@link #toIntervalList(VCFFileReader, boolean)} instead + */ + @Deprecated public static IntervalList fromVcf(final VCFFileReader vcf, final boolean includeFiltered) { + + return toIntervalList(vcf, includeFiltered); + } + + /** + * Converts a {@link VCFFileReader} 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 toIntervalList(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(); @@ -235,8 +279,8 @@ public static IntervalList fromVcf(final VCFFileReader vcf, final boolean includ 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) + final Integer intervalEnd = vc.getCommonInfo().getAttributeAsInt(VCFConstants.END_KEY, vc.getEnd()); + if (VCFConstants.EMPTY_ID_FIELD.equals(name) || name == null) name = "interval-" + (++intervals); list.add(new Interval(vc.getContig(), vc.getStart(), intervalEnd, false, name)); } @@ -281,6 +325,16 @@ public CloseableIterator query(final String chrom, final int sta } } + /** + * Queries for records overlapping the {@link Locatable} specified. + * Note that this method requires VCF files with an associated index. If no index exists a TribbleException will be thrown. + * + * @return non-null iterator over VariantContexts + */ + public CloseableIterator query(final Locatable locatable) { + return query(locatable.getContig(), locatable.getStart(), locatable.getEnd()); + } + @Override public void close() { try { diff --git a/src/test/java/htsjdk/samtools/util/IntervalListTest.java b/src/test/java/htsjdk/samtools/util/IntervalListTest.java index 4dbd03902a..526ff75151 100644 --- a/src/test/java/htsjdk/samtools/util/IntervalListTest.java +++ b/src/test/java/htsjdk/samtools/util/IntervalListTest.java @@ -482,7 +482,7 @@ public void testFromVCF(final String vcf, final String compInterval, final boole final File compIntervalFile = new File(compInterval); final IntervalList compList = IntervalList.fromFile(compIntervalFile); - final IntervalList list = invertVCF ? IntervalList.invert(VCFFileReader.fromVcf(vcfFile)) : VCFFileReader.fromVcf(vcfFile); + final IntervalList list = invertVCF ? IntervalList.invert(VCFFileReader.toIntervalList(vcfFile.toPath())) : VCFFileReader.toIntervalList(vcfFile.toPath()); compList.getHeader().getSequenceDictionary().assertSameDictionary(list.getHeader().getSequenceDictionary()); @@ -513,7 +513,7 @@ public void testFromVCFWithPath(final String vcf, final String compInterval, fin final File compIntervalFile = new File(compInterval); final IntervalList compList = IntervalList.fromFile(compIntervalFile); - final IntervalList list = invertVCF ? IntervalList.invert(VCFFileReader.fromVcf(vcfFile)) : VCFFileReader.fromVcf(vcfFile); + final IntervalList list = invertVCF ? IntervalList.invert(VCFFileReader.toIntervalList(vcfFile.toPath())) : VCFFileReader.toIntervalList(vcfFile.toPath()); compList.getHeader().getSequenceDictionary().assertSameDictionary(list.getHeader().getSequenceDictionary()); @@ -661,6 +661,6 @@ public void changeHeader() { public void testContigsAbsentInHeader() { String vcf = "src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFNoContigLines.vcf"; final File vcfFile = new File(vcf); - VCFFileReader.fromVcf(vcfFile); + VCFFileReader.toIntervalList(vcfFile.toPath()); } } diff --git a/src/test/java/htsjdk/tribble/index/IndexFactoryTest.java b/src/test/java/htsjdk/tribble/index/IndexFactoryTest.java index 59038cf2a1..414e66358a 100644 --- a/src/test/java/htsjdk/tribble/index/IndexFactoryTest.java +++ b/src/test/java/htsjdk/tribble/index/IndexFactoryTest.java @@ -209,8 +209,7 @@ public void testCreateLinearIndexFromBCF(final File inputBCF) throws IOException // we don't have an externally generated index file for the original input, so iterate through each variant // and use the generated index to query for the same variant in the indexed copy of the input final VariantContext vcOrig = originalIt.next(); - final Interval queryInterval = new Interval(vcOrig.getContig(), vcOrig.getStart(), vcOrig.getEnd()); - final Iterator tmpIt = tmpReader.query(queryInterval.getContig(), queryInterval.getStart(), queryInterval.getEnd()); + final Iterator tmpIt = tmpReader.query(vcOrig); Assert.assertTrue(tmpIt.hasNext(), "Variant not returned from indexed file"); final VariantContext vcTmp = tmpIt.next(); Assert.assertEquals(vcOrig.getContig(), vcTmp.getContig()); From 5168c798166b61f1a823d06159db820f21c94cf9 Mon Sep 17 00:00:00 2001 From: Tom White Date: Mon, 6 Aug 2018 19:18:25 +0100 Subject: [PATCH 63/83] Fix CRAM container offset calculation (#1167) --- .../samtools/cram/build/CramContainerIterator.java | 2 +- .../samtools/CramContainerHeaderIteratorTest.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java b/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java index 5fcf83f5a6..159de03f90 100644 --- a/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java +++ b/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java @@ -29,7 +29,7 @@ public CramContainerIterator(final InputStream inputStream) throws IOException { void readNextContainer() { try { nextContainer = containerFromStream(cramHeader.getVersion(), countingInputStream); - final long containerSizeInBytes = countingInputStream.getCount(); + final long containerSizeInBytes = countingInputStream.getCount() - offset; nextContainer.offset = offset; offset += containerSizeInBytes; diff --git a/src/test/java/htsjdk/samtools/CramContainerHeaderIteratorTest.java b/src/test/java/htsjdk/samtools/CramContainerHeaderIteratorTest.java index 14d9f26d7c..5f8be41179 100644 --- a/src/test/java/htsjdk/samtools/CramContainerHeaderIteratorTest.java +++ b/src/test/java/htsjdk/samtools/CramContainerHeaderIteratorTest.java @@ -4,6 +4,7 @@ import htsjdk.samtools.cram.build.CramContainerHeaderIterator; import htsjdk.samtools.cram.build.CramContainerIterator; import htsjdk.samtools.cram.structure.Container; +import htsjdk.samtools.cram.structure.ContainerIO; import htsjdk.samtools.cram.structure.CramHeader; import htsjdk.samtools.seekablestream.SeekableFileStream; import htsjdk.samtools.util.Iterables; @@ -52,6 +53,15 @@ public void test() throws IOException { Assert.assertNull(headerOnlyContainer.blocks); Assert.assertNull(headerOnlyContainer.header); Assert.assertNull(headerOnlyContainer.slices); + // try to read a container from the offset to check it's correct + try (SeekableFileStream seekableFileStream = new SeekableFileStream(cramFile)) { + seekableFileStream.seek(headerOnlyContainer.offset); + Container container = ContainerIO.readContainer(actualHeader.getVersion(), seekableFileStream); + Assert.assertEquals(container.alignmentStart, fullContainer.alignmentStart); + Assert.assertEquals(container.alignmentSpan, fullContainer.alignmentSpan); + Assert.assertEquals(container.nofRecords, fullContainer.nofRecords); + Assert.assertEquals(container.checksum, fullContainer.checksum); + } } } } From 57442bb7adfc7f50c83d93690a0eab329e0453ee Mon Sep 17 00:00:00 2001 From: Tom White Date: Tue, 4 Sep 2018 16:57:53 +0100 Subject: [PATCH 64/83] Fix a bug where invalid bytes in BufferedInputStream's buffer were being accessed. (#1175) Only bytes up to BufferedInputStream's `count` field in its internal buffer are valid; this change ensures accesses are limited to this range. --- .../SeekableBufferedStream.java | 8 ++++---- .../SeekableBufferedStreamTest.java | 19 ++++++++++++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java index be71a6b8bd..8a1f1d5521 100644 --- a/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java +++ b/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java @@ -43,19 +43,19 @@ private ExtBufferedInputStream(final InputStream inputStream, final int 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; + return this.count - this.pos; } /** Return true if the position can be changed by the given delta and remain in the buffer. */ boolean canChangePos(long delta) { - return this.pos + delta >= 0 && delta < getBytesInBufferAvailable(); + long newPos = this.pos + delta; + return newPos >= 0 && newPos < this.count; } /** Changes the position in the buffer by a given delta. */ void changePos(int delta) { int newPos = this.pos + delta; - if (newPos < 0 || newPos > this.buf.length) { + if (newPos < 0 || newPos >= this.count) { throw new IllegalArgumentException("New position not in buffer pos=" + this.pos + ", delta=" + delta); } this.pos = newPos; diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java index 55adfdffee..f6e0b69899 100644 --- a/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java +++ b/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java @@ -29,10 +29,10 @@ import org.testng.annotations.Test; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; -import static htsjdk.samtools.seekablestream.SeekableBufferedStream.DEFAULT_BUFFER_SIZE; import static org.testng.Assert.assertEquals; public class SeekableBufferedStreamTest extends HtsjdkTest { @@ -127,15 +127,28 @@ public void testSkip() throws IOException { @Test public void testSeek() throws IOException { final int bufferSize = 20000; + final int filledBufferSize = bufferSize / 2; final int startPosition = 250000; final int length = 5000; + class LimitedSeekableFileStream extends SeekableFileStream { + LimitedSeekableFileStream(File file) throws FileNotFoundException { + super(file); + } + @Override + public int read(byte[] buffer, int offset, int length) throws IOException { + // only return a fraction of the buffer size (this is allowed by the read contract) to ensure that + // BufferedInputStream's internal buffer is not filled, and so some of its contents are not valid + return super.read(buffer, offset, Math.min(length, filledBufferSize)); + } + } + final int[] RELATIVE_SEEK_OFFSET = new int[]{-bufferSize*2, -bufferSize, -bufferSize/2, -length, -length/2, -1, 0, 1, length/2, length, bufferSize/2, bufferSize-1, bufferSize, bufferSize*2}; for (final int seekOffset : RELATIVE_SEEK_OFFSET) { try (SeekableStream unBufferedStream = new SeekableFileStream(BAM_FILE); - SeekableBufferedStream bufferedStream = new SeekableBufferedStream(new SeekableHTTPStream(new URL(BAM_URL_STRING)), bufferSize)) { + SeekableBufferedStream bufferedStream = new SeekableBufferedStream(new LimitedSeekableFileStream(BAM_FILE), bufferSize)) { byte[] buffer1 = new byte[length]; unBufferedStream.seek(startPosition); int bytesRead = unBufferedStream.read(buffer1, 0, length); @@ -157,7 +170,7 @@ public void testSeek() throws IOException { bytesRead = bufferedStream.read(buffer2, 0, length); Assert.assertEquals(length, bytesRead); Object newInternalBuffer = bufferedStream.bufferedStream; - if (seekOffset >=0 && seekOffset < bufferSize) { + if (seekOffset >=0 && seekOffset < filledBufferSize) { Assert.assertSame(internalBuffer, newInternalBuffer, "Internal buffer should have been reused for seek offset " + seekOffset); } else { From 4902ee9e5e4f4d7847d16d7cd6c077da4c46076c Mon Sep 17 00:00:00 2001 From: JP Martin Date: Tue, 4 Sep 2018 09:04:00 -0700 Subject: [PATCH 65/83] VCFWriter accepts Path (#1134) * VCFWriter accepts Path The benefit of this change is that a Path can point to files on the cloud (e.g. via GCloud's NIO Filesystem Provider for Google Cloud Storage). --- .../java/htsjdk/samtools/BAMFileWriter.java | 4 +- .../java/htsjdk/samtools/BamFileIoUtils.java | 3 +- .../util/BlockCompressedInputStream.java | 2 +- .../util/BlockCompressedOutputStream.java | 50 +- .../java/htsjdk/samtools/util/IOUtil.java | 10 + .../tribble/index/tabix/TabixIndex.java | 2 +- .../variantcontext/writer/BCF2Writer.java | 14 + .../writer/IndexingVariantContextWriter.java | 50 +- .../variantcontext/writer/VCFWriter.java | 19 + .../writer/VariantContextWriterBuilder.java | 97 +- .../VariantContextWriterBuilderUnitTest.java | 858 ++++++++++-------- 11 files changed, 704 insertions(+), 405 deletions(-) diff --git a/src/main/java/htsjdk/samtools/BAMFileWriter.java b/src/main/java/htsjdk/samtools/BAMFileWriter.java index 0a77b5b89f..3aee3898d7 100644 --- a/src/main/java/htsjdk/samtools/BAMFileWriter.java +++ b/src/main/java/htsjdk/samtools/BAMFileWriter.java @@ -78,7 +78,7 @@ protected BAMFileWriter(final OutputStream os, final File file, final int compre } protected BAMFileWriter(final OutputStream os, final String absoluteFilename, final int compressionLevel, final DeflaterFactory deflaterFactory) { - blockCompressedOutputStream = new BlockCompressedOutputStream(os, null, compressionLevel, deflaterFactory); + blockCompressedOutputStream = new BlockCompressedOutputStream(os, (Path)null, compressionLevel, deflaterFactory); outputBinaryCodec = new BinaryCodec(blockCompressedOutputStream); outputBinaryCodec.setOutputFileName(absoluteFilename); } @@ -206,7 +206,7 @@ protected static void writeHeader(final BinaryCodec outputBinaryCodec, final SAM * @param samFileHeader the header to write */ public static void writeHeader(final OutputStream outputStream, final SAMFileHeader samFileHeader) { - final BlockCompressedOutputStream blockCompressedOutputStream = new BlockCompressedOutputStream(outputStream, null); + final BlockCompressedOutputStream blockCompressedOutputStream = new BlockCompressedOutputStream(outputStream, (Path)null); final BinaryCodec outputBinaryCodec = new BinaryCodec(blockCompressedOutputStream); writeHeader(outputBinaryCodec, samFileHeader); try { diff --git a/src/main/java/htsjdk/samtools/BamFileIoUtils.java b/src/main/java/htsjdk/samtools/BamFileIoUtils.java index b5c587acc0..fddcf41240 100644 --- a/src/main/java/htsjdk/samtools/BamFileIoUtils.java +++ b/src/main/java/htsjdk/samtools/BamFileIoUtils.java @@ -15,6 +15,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.nio.file.Path; import java.util.List; public class BamFileIoUtils { @@ -86,7 +87,7 @@ public static void blockCopyBamFile(final File inputFile, final OutputStream out // 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); + final BlockCompressedOutputStream blockOut = new BlockCompressedOutputStream(outputStream, (Path)null); IOUtil.transferByStream(blockIn, blockOut, remainingInBlock); blockOut.flush(); // Don't close blockOut because closing underlying stream would break everything diff --git a/src/main/java/htsjdk/samtools/util/BlockCompressedInputStream.java b/src/main/java/htsjdk/samtools/util/BlockCompressedInputStream.java index c358506db2..7a1a3d9cce 100755 --- a/src/main/java/htsjdk/samtools/util/BlockCompressedInputStream.java +++ b/src/main/java/htsjdk/samtools/util/BlockCompressedInputStream.java @@ -610,7 +610,7 @@ public enum FileTermination {HAS_TERMINATOR_BLOCK, HAS_HEALTHY_LAST_BLOCK, DEFEC * @throws IOException */ public static FileTermination checkTermination(final File file) throws IOException { - return checkTermination(file == null ? null : file.toPath()); + return checkTermination(IOUtil.toPath(file)); } /** diff --git a/src/main/java/htsjdk/samtools/util/BlockCompressedOutputStream.java b/src/main/java/htsjdk/samtools/util/BlockCompressedOutputStream.java index a1fc6c80ab..c03acd354f 100644 --- a/src/main/java/htsjdk/samtools/util/BlockCompressedOutputStream.java +++ b/src/main/java/htsjdk/samtools/util/BlockCompressedOutputStream.java @@ -29,6 +29,7 @@ import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; +import java.nio.file.Path; import java.util.zip.CRC32; import java.util.zip.Deflater; @@ -111,7 +112,7 @@ public static DeflaterFactory getDefaultDeflaterFactory() { // 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 Path file = null; private long mBlockAddress = 0; @@ -161,8 +162,17 @@ public BlockCompressedOutputStream(final File file, final int compressionLevel) * @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); + this(IOUtil.toPath(file), compressionLevel, deflaterFactory); + } + + /** + * 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 Path path, final int compressionLevel, final DeflaterFactory deflaterFactory) { + this.file = path; + codec = new BinaryCodec(path, true); deflater = deflaterFactory.makeDeflater(compressionLevel, true); log.debug("Using deflater: " + deflater.getClass().getSimpleName()); } @@ -178,6 +188,17 @@ public BlockCompressedOutputStream(final OutputStream os, final File file) { this(os, file, 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(OutputStream, File, int, DeflaterFactory)} to specify a custom factory. + * + * @param file may be null + */ + public BlockCompressedOutputStream(final OutputStream os, final Path 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. @@ -186,6 +207,14 @@ public BlockCompressedOutputStream(final OutputStream os, final File file, final this(os, file, compressionLevel, defaultDeflaterFactory); } + /** + * 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 Path file, final int compressionLevel) { + this(os, file, compressionLevel, defaultDeflaterFactory); + } + /** * Creates the output stream. * @param os output stream to create a BlockCompressedOutputStream from @@ -194,10 +223,21 @@ public BlockCompressedOutputStream(final OutputStream os, final File file, final * @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(os, IOUtil.toPath(file), compressionLevel, deflaterFactory); + } + + /** + * 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 Path file, final int compressionLevel, final DeflaterFactory deflaterFactory) { this.file = file; codec = new BinaryCodec(os); if (file != null) { - codec.setOutputFileName(file.getAbsolutePath()); + codec.setOutputFileName(file.toAbsolutePath().toUri().toString()); } deflater = deflaterFactory.makeDeflater(compressionLevel, true); log.debug("Using deflater: " + deflater.getClass().getSimpleName()); @@ -283,7 +323,7 @@ public void close() throws IOException { 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() || !Files.isRegularFile(this.file.toPath())) return; + if (this.file == null || !Files.isRegularFile(this.file)) return; if (BlockCompressedInputStream.checkTermination(this.file) != BlockCompressedInputStream.FileTermination.HAS_TERMINATOR_BLOCK) { throw new IOException("Terminator block not found after closing BGZF file " + this.file); diff --git a/src/main/java/htsjdk/samtools/util/IOUtil.java b/src/main/java/htsjdk/samtools/util/IOUtil.java index 4174b341fa..ea30e0671d 100755 --- a/src/main/java/htsjdk/samtools/util/IOUtil.java +++ b/src/main/java/htsjdk/samtools/util/IOUtil.java @@ -1137,6 +1137,16 @@ public static List getPaths(List uriStrings) throws RuntimeIOExcep }).collect(Collectors.toList()); } + /* + * Converts the File to a Path, preserving nullness. + * + * @param fileOrNull a File, or null + * @return the corresponding Path (or null) + */ + public static Path toPath(File fileOrNull) { + return (null == fileOrNull ? null : fileOrNull.toPath()); + } + /** Takes a list of Files and converts them to a list of Paths * Runs .toPath() on the contents of the input. * diff --git a/src/main/java/htsjdk/tribble/index/tabix/TabixIndex.java b/src/main/java/htsjdk/tribble/index/tabix/TabixIndex.java index d7cc31cef6..6c27b363e2 100644 --- a/src/main/java/htsjdk/tribble/index/tabix/TabixIndex.java +++ b/src/main/java/htsjdk/tribble/index/tabix/TabixIndex.java @@ -215,7 +215,7 @@ public TabixFormat getFormatSpec() { */ @Override public void write(final Path tabixPath) throws IOException { - try(final LittleEndianOutputStream los = new LittleEndianOutputStream(new BlockCompressedOutputStream(Files.newOutputStream(tabixPath), null))) { + try(final LittleEndianOutputStream los = new LittleEndianOutputStream(new BlockCompressedOutputStream(Files.newOutputStream(tabixPath), (Path)null))) { write(los); } } diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Writer.java b/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Writer.java index cf578d8069..07b2d0d41e 100644 --- a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Writer.java +++ b/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Writer.java @@ -26,6 +26,7 @@ package htsjdk.variant.variantcontext.writer; import htsjdk.samtools.SAMSequenceDictionary; +import htsjdk.samtools.util.IOUtil; import htsjdk.samtools.util.RuntimeIOException; import htsjdk.tribble.index.IndexCreator; import htsjdk.variant.bcf2.BCF2Codec; @@ -49,6 +50,7 @@ import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -128,12 +130,24 @@ class BCF2Writer extends IndexingVariantContextWriter { public BCF2Writer(final File location, final OutputStream output, final SAMSequenceDictionary refDict, final boolean enableOnTheFlyIndexing, final boolean doNotWriteGenotypes) { + this(IOUtil.toPath(location), output, refDict, enableOnTheFlyIndexing, doNotWriteGenotypes); + } + + public BCF2Writer(final Path 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) { + this(IOUtil.toPath(location), output, refDict, indexCreator, enableOnTheFlyIndexing, + doNotWriteGenotypes); + } + + public BCF2Writer(final Path 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); diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/IndexingVariantContextWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/IndexingVariantContextWriter.java index fa3f6ba54c..264f7beb92 100644 --- a/src/main/java/htsjdk/variant/variantcontext/writer/IndexingVariantContextWriter.java +++ b/src/main/java/htsjdk/variant/variantcontext/writer/IndexingVariantContextWriter.java @@ -26,6 +26,7 @@ package htsjdk.variant.variantcontext.writer; import htsjdk.samtools.SAMSequenceDictionary; +import htsjdk.samtools.util.IOUtil; import htsjdk.samtools.util.LocationAware; import htsjdk.samtools.util.RuntimeIOException; import htsjdk.tribble.index.DynamicIndexCreator; @@ -40,20 +41,21 @@ import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; +import java.nio.file.Path; /** * this class writes VCF files */ abstract class IndexingVariantContextWriter implements VariantContextWriter { private final String name; - private final File location; + private final Path 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) { + private IndexingVariantContextWriter(final String name, final Path location, final OutputStream output, final SAMSequenceDictionary refDict) { this.name = name; this.location = location; this.outputStream = output; @@ -73,6 +75,20 @@ private IndexingVariantContextWriter(final String name, final File location, fin */ protected IndexingVariantContextWriter(final String name, final File location, final OutputStream output, final SAMSequenceDictionary refDict, final boolean enableOnTheFlyIndexing) { + this(name, IOUtil.toPath(location), output, refDict, enableOnTheFlyIndexing); + } + + /** + * 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 Path location, final OutputStream output, final SAMSequenceDictionary refDict, + final boolean enableOnTheFlyIndexing) { this(name, location, output, refDict); if ( enableOnTheFlyIndexing ) { @@ -92,6 +108,21 @@ protected IndexingVariantContextWriter(final String name, final File location, f */ protected IndexingVariantContextWriter(final String name, final File location, final OutputStream output, final SAMSequenceDictionary refDict, final boolean enableOnTheFlyIndexing, final IndexCreator idxCreator) { + this(name, IOUtil.toPath(location), output, refDict, enableOnTheFlyIndexing, idxCreator); + } + + /** + * 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 Path location, final OutputStream output, final SAMSequenceDictionary refDict, + final boolean enableOnTheFlyIndexing, final IndexCreator idxCreator) { this(name, location, output, refDict); if ( enableOnTheFlyIndexing ) { @@ -144,7 +175,7 @@ public void close() { if (indexer != null) { indexer.setIndexSequenceDictionary(refDict); final Index index = indexer.finalizeIndex(locationSource.getPosition()); - index.writeBasedOnFeatureFile(location); + index.writeBasedOnFeaturePath(location); } @@ -180,6 +211,17 @@ public void add(final VariantContext vc) { * @return */ protected static final String writerName(final File location, final OutputStream stream) { - return location == null ? stream == null ? DEFAULT_READER_NAME : stream.toString() : location.getAbsolutePath(); + return writerName(IOUtil.toPath(location), stream); + } + + /** + * 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 Path location, final OutputStream stream) { + return location == null ? stream == null ? DEFAULT_READER_NAME : stream.toString() : location.toAbsolutePath().toUri().toString(); } } diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java index 1d0234680c..742b1c8929 100644 --- a/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java +++ b/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java @@ -26,6 +26,7 @@ package htsjdk.variant.variantcontext.writer; import htsjdk.samtools.SAMSequenceDictionary; +import htsjdk.samtools.util.IOUtil; import htsjdk.samtools.util.RuntimeIOException; import htsjdk.tribble.index.IndexCreator; import htsjdk.variant.variantcontext.VariantContext; @@ -43,6 +44,7 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; +import java.nio.file.Path; /** * this class writes VCF files @@ -86,6 +88,14 @@ public VCFWriter(final File location, final OutputStream output, final SAMSequen final boolean enableOnTheFlyIndexing, final boolean doNotWriteGenotypes, final boolean allowMissingFieldsInHeader, final boolean writeFullFormatField) { + this(IOUtil.toPath(location), output, refDict, enableOnTheFlyIndexing, doNotWriteGenotypes, + allowMissingFieldsInHeader,writeFullFormatField); + } + + public VCFWriter(final Path 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; @@ -96,11 +106,20 @@ public VCFWriter(final File location, final OutputStream output, final SAMSequen final IndexCreator indexCreator, final boolean enableOnTheFlyIndexing, final boolean doNotWriteGenotypes, final boolean allowMissingFieldsInHeader, final boolean writeFullFormatField) { + this(IOUtil.toPath(location), output, refDict, indexCreator, enableOnTheFlyIndexing, + doNotWriteGenotypes, allowMissingFieldsInHeader, writeFullFormatField); + } + + public VCFWriter(final Path 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 diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java index 0ee68c5f80..2325000a77 100644 --- a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java +++ b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java @@ -39,7 +39,11 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.IOException; import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.OpenOption; +import java.nio.file.Path; import java.util.EnumSet; /* @@ -119,7 +123,7 @@ public enum OutputType { private SAMSequenceDictionary refDict = null; private OutputType outType = OutputType.UNSPECIFIED; - private File outFile = null; + private Path outPath = null; private OutputStream outStream = null; private IndexCreator idxCreator = null; private int bufferSize = Defaults.BUFFER_SIZE; @@ -154,9 +158,20 @@ public VariantContextWriterBuilder setReferenceDictionary(final SAMSequenceDicti * @return this VariantContextWriterBuilder */ public VariantContextWriterBuilder setOutputFile(final File outFile) { - this.outFile = outFile; + return setOutputPath(IOUtil.toPath(outFile)); + } + + /** + * Set the output file for the next VariantContextWriter created by this builder. + * Determines file type implicitly from the filename. + * + * @param outPath the file the VariantContextWriter will write to + * @return this VariantContextWriterBuilder + */ + public VariantContextWriterBuilder setOutputPath(final Path outPath) { + this.outPath = outPath; this.outStream = null; - this.outType = determineOutputTypeFromFile(outFile); + this.outType = determineOutputTypeFromFile(outPath); return this; } @@ -181,7 +196,7 @@ 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) + if (this.outPath == null || this.outStream != null) throw new IllegalArgumentException("Cannot set a file type if the output is not to a file."); this.outType = outType; @@ -197,7 +212,7 @@ public VariantContextWriterBuilder setOutputFileType(final OutputType outType) { */ public VariantContextWriterBuilder setOutputVCFStream(final OutputStream outStream) { this.outStream = outStream; - this.outFile = null; + this.outPath = null; this.outType = OutputType.VCF_STREAM; return this; } @@ -211,7 +226,7 @@ public VariantContextWriterBuilder setOutputVCFStream(final OutputStream outStre */ public VariantContextWriterBuilder setOutputBCFStream(final OutputStream outStream) { this.outStream = outStream; - this.outFile = null; + this.outPath = null; this.outType = OutputType.BCF_STREAM; return this; } @@ -387,13 +402,14 @@ boolean isOptionSet(final Options option) { /** * Validate and build the VariantContextWriter. * - * @return the VariantContextWriter as specified by previous method calls + * @return the VariantContextWriter as specified by previous method calls, + * optionally applying the specified OpenOptions. * @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 Options.INDEX_ON_THE_FLY is specified and no reference dictionary is provided. * @throws IllegalArgumentException if Options.INDEX_ON_THE_FLY is specified and a stream output is specified. */ - public VariantContextWriter build() { + public VariantContextWriter build(OpenOption... openOptions) { VariantContextWriter writer = null; // don't allow FORCE_BCF to modify the outType state @@ -410,13 +426,14 @@ else if (STREAM_TYPES.contains(this.outType)) OutputStream outStreamFromFile = this.outStream; if (FILE_TYPES.contains(this.outType) || (STREAM_TYPES.contains(this.outType) && this.outStream == null)) { try { - outStreamFromFile = IOUtil.maybeBufferOutputStream(new FileOutputStream(outFile), bufferSize); + outStreamFromFile = IOUtil.maybeBufferOutputStream(Files.newOutputStream(outPath, openOptions), bufferSize); } catch (final FileNotFoundException e) { - throw new RuntimeIOException("File not found: " + outFile, e); + throw new RuntimeIOException("File not found: " + outPath, e); + } catch (final IOException e) { + throw new RuntimeIOException("File not found: " + outPath, e); } - if (createMD5) - outStreamFromFile = new Md5CalculatingOutputStream(outStreamFromFile, new File(outFile.getAbsolutePath() + ".md5")); + outStreamFromFile = new Md5CalculatingOutputStream(outStreamFromFile, IOUtil.addExtension(outPath, ".md5")); } switch (typeToBuild) { @@ -426,7 +443,7 @@ else if (STREAM_TYPES.contains(this.outType)) 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); + writer = createVCFWriter(outPath, outStreamFromFile); break; case BLOCK_COMPRESSED_VCF: if (refDict == null) @@ -434,13 +451,14 @@ else if (STREAM_TYPES.contains(this.outType)) else idxCreator = new TabixIndexCreator(refDict, TabixFormat.VCF); - writer = createVCFWriter(outFile, new BlockCompressedOutputStream(outStreamFromFile, outFile)); + writer = createVCFWriter( + outPath, new BlockCompressedOutputStream(outStreamFromFile, outPath)); 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); + writer = createBCFWriter(outPath, outStreamFromFile); break; case VCF_STREAM: if (options.contains(Options.INDEX_ON_THE_FLY)) @@ -471,21 +489,28 @@ else if (STREAM_TYPES.contains(this.outType)) * @param f A file whose {@link OutputType} we want to infer * @return The file's {@link OutputType}. Never {@code null}. */ - public static OutputType determineOutputTypeFromFile(final File f) { - if (isBCF(f)) { + public static OutputType determineOutputTypeFromFile(final Path path) { + if (isBCF(path)) { return OutputType.BCF; - } else if (isCompressedVCF(f)) { + } else if (isCompressedVCF(path)) { return OutputType.BLOCK_COMPRESSED_VCF; - } else if (isVCF(f)) { + } else if (isVCF(path)) { 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); + try { + final Path canonicalPath = path.toRealPath(); + if (!canonicalPath.equals(path)) { + return determineOutputTypeFromFile(canonicalPath); + } + } catch (java.nio.file.NoSuchFileException nsf) { + // toRealPath failed because the "real" file couldn't be found. + // We do nothing, just continue with the original path. + } catch (IOException x) { + throw new RuntimeIOException(x); } - else if (f.exists() && !f.isFile() && !f.isDirectory()) { + if (Files.exists(path) && !Files.isRegularFile(path) && !Files.isDirectory(path)) { return OutputType.VCF_STREAM; } else { return OutputType.UNSPECIFIED; @@ -493,31 +518,31 @@ else if (f.exists() && !f.isFile() && !f.isDirectory()) { } } - private static boolean isVCF(final File outFile) { - return outFile != null && outFile.getName().endsWith(IOUtil.VCF_FILE_EXTENSION); + private static boolean isVCF(final Path outPath) { + return outPath != null && outPath.getFileName().toString().endsWith(IOUtil.VCF_FILE_EXTENSION); } - private static boolean isBCF(final File outFile) { - return outFile != null && outFile.getName().endsWith(IOUtil.BCF_FILE_EXTENSION); + private static boolean isBCF(final Path outPath) { + return outPath != null && outPath.getFileName().toString().endsWith(IOUtil.BCF_FILE_EXTENSION); } - private static boolean isCompressedVCF(final File outFile) { - if (outFile == null) + private static boolean isCompressedVCF(final Path outPath) { + if (outPath == null) return false; - return IOUtil.hasBlockCompressedExtension(outFile); + return IOUtil.hasBlockCompressedExtension(outPath); } - private VariantContextWriter createVCFWriter(final File writerFile, final OutputStream writerStream) { + private VariantContextWriter createVCFWriter(final Path writerPath, final OutputStream writerStream) { if (idxCreator == null) { - return new VCFWriter(writerFile, writerStream, refDict, + return new VCFWriter(writerPath, 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, + return new VCFWriter(writerPath, 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), @@ -525,14 +550,14 @@ private VariantContextWriter createVCFWriter(final File writerFile, final Output } } - private VariantContextWriter createBCFWriter(final File writerFile, final OutputStream writerStream) { + private VariantContextWriter createBCFWriter(final Path writerPath, final OutputStream writerStream) { if (idxCreator == null) { - return new BCF2Writer(writerFile, writerStream, refDict, + return new BCF2Writer(writerPath, writerStream, refDict, options.contains(Options.INDEX_ON_THE_FLY), options.contains(Options.DO_NOT_WRITE_GENOTYPES)); } else { - return new BCF2Writer(writerFile, writerStream, refDict, idxCreator, + return new BCF2Writer(writerPath, writerStream, refDict, idxCreator, options.contains(Options.INDEX_ON_THE_FLY), options.contains(Options.DO_NOT_WRITE_GENOTYPES)); } diff --git a/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java index 4c7f325dfd..3ea0d292e0 100644 --- a/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java +++ b/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java @@ -1,41 +1,51 @@ /* -* 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. -*/ + * 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 com.google.common.jimfs.Configuration; +import com.google.common.jimfs.Jimfs; 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.Tribble; import htsjdk.tribble.util.TabixUtils; import htsjdk.variant.VariantBaseTest; import htsjdk.variant.variantcontext.writer.VariantContextWriterBuilder.OutputType; -import htsjdk.variant.vcf.VCFUtils; +import htsjdk.variant.vcf.VCFHeader; +import java.nio.file.FileSystem; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; import org.testng.Assert; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; @@ -47,363 +57,501 @@ 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 blockCompressedVCFs; - private List blockCompressedIndices; - - @BeforeSuite - public void before() throws IOException { - dictionary = createArtificialSequenceDictionary(); - vcf = File.createTempFile(TEST_BASENAME, IOUtil.VCF_FILE_EXTENSION); - vcf.deleteOnExit(); - vcfIdx = Tribble.indexFile(vcf); - vcfIdx.deleteOnExit(); - vcfMD5 = new File(vcf.getAbsolutePath() + ".md5"); - vcfMD5.deleteOnExit(); - bcf = File.createTempFile(TEST_BASENAME, IOUtil.BCF_FILE_EXTENSION); - bcf.deleteOnExit(); - bcfIdx = Tribble.indexFile(bcf); - bcfIdx.deleteOnExit(); - unknown = File.createTempFile(TEST_BASENAME, ".unknown"); - unknown.deleteOnExit(); - - blockCompressedVCFs = new ArrayList(); - blockCompressedIndices = new ArrayList(); - for (final String extension : IOUtil.BLOCK_COMPRESSED_EXTENSIONS) { - final File blockCompressed = File.createTempFile(TEST_BASENAME, IOUtil.VCF_FILE_EXTENSION + extension); - blockCompressed.deleteOnExit(); - blockCompressedVCFs.add(blockCompressed); - - final File index = new File(blockCompressed.getAbsolutePath() + TabixUtils.STANDARD_INDEX_EXTENSION); - index.deleteOnExit(); - blockCompressedIndices.add(index); - } + 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 blockCompressedVCFs; + private List blockCompressedIndices; + + @BeforeSuite + public void before() throws IOException { + dictionary = createArtificialSequenceDictionary(); + vcf = File.createTempFile(TEST_BASENAME, IOUtil.VCF_FILE_EXTENSION); + vcf.deleteOnExit(); + vcfIdx = Tribble.indexFile(vcf); + vcfIdx.deleteOnExit(); + vcfMD5 = new File(vcf.getAbsolutePath() + ".md5"); + vcfMD5.deleteOnExit(); + bcf = File.createTempFile(TEST_BASENAME, IOUtil.BCF_FILE_EXTENSION); + bcf.deleteOnExit(); + bcfIdx = Tribble.indexFile(bcf); + bcfIdx.deleteOnExit(); + unknown = File.createTempFile(TEST_BASENAME, ".unknown"); + unknown.deleteOnExit(); + + blockCompressedVCFs = new ArrayList(); + blockCompressedIndices = new ArrayList(); + for (final String extension : IOUtil.BLOCK_COMPRESSED_EXTENSIONS) { + final File blockCompressed = File.createTempFile(TEST_BASENAME, IOUtil.VCF_FILE_EXTENSION + 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"); + @Test + public void testSetOutputFile() throws IOException { + final VariantContextWriterBuilder builder = new VariantContextWriterBuilder() + .setReferenceDictionary(dictionary); - 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"); + 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"); - for (final String extension : IOUtil.BLOCK_COMPRESSED_EXTENSIONS) { - final File file = File.createTempFile(TEST_BASENAME + ".setoutput", extension); - file.deleteOnExit(); - final String filename = file.getAbsolutePath(); + 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"); - 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"); - } + for (final String extension : IOUtil.BLOCK_COMPRESSED_EXTENSIONS) { + final File file = File.createTempFile(TEST_BASENAME + ".setoutput", extension); + file.deleteOnExit(); + final String filename = file.getAbsolutePath(); - writer = builder.setOutputFile(bcf).build(); - Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFile BCF String"); + 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(bcf.getAbsolutePath()).build(); - Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFile BCF File"); + 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"); } - @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"); + writer = builder.setOutputFile(bcf).build(); + Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFile BCF String"); - // 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.setOutputFile(bcf.getAbsolutePath()).build(); + Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFile BCF File"); + } - 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 testDetermineOutputType() { + Assert.assertEquals(OutputType.VCF, VariantContextWriterBuilder.determineOutputTypeFromFile(this.vcf.toPath())); + Assert.assertEquals(OutputType.BCF, VariantContextWriterBuilder.determineOutputTypeFromFile(this.bcf.toPath())); + Assert.assertEquals(OutputType.VCF_STREAM, VariantContextWriterBuilder.determineOutputTypeFromFile(new File("/dev/stdout").toPath())); + for (final File f: this.blockCompressedVCFs) { + Assert.assertEquals(OutputType.BLOCK_COMPRESSED_VCF, VariantContextWriterBuilder.determineOutputTypeFromFile(f.toPath())); } - @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 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)); + link.toFile().delete(); } - - @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"); + catch (final IOException ioe) { + throw new RuntimeIOException(ioe); } + } - @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 testSetOutputFileType() { + final VariantContextWriterBuilder builder = new VariantContextWriterBuilder() + .setReferenceDictionary(dictionary) + .setOutputFile(unknown); - @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)); - } - } + 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"); - @Test(expectedExceptions = IllegalArgumentException.class) - public void testInvalidImplicitFileType() { - new VariantContextWriterBuilder() - .setReferenceDictionary(dictionary) - .setOutputFile("test.bam") - .build(); - } + writer = builder.setOption(Options.FORCE_BCF).build(); + Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFileType FORCE_BCF set -> expected BCF, was VCF"); - @Test(expectedExceptions = IllegalArgumentException.class) - public void testSetInvalidFileType() { - new VariantContextWriterBuilder() - .setReferenceDictionary(dictionary) - .setOutputFile("test.bam") - .setOutputFileType(VariantContextWriterBuilder.OutputType.VCF_STREAM) - .build(); - } + // 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"); - @Test(expectedExceptions = IllegalArgumentException.class) - public void testInvalidSetFileTypeForStream() { - new VariantContextWriterBuilder() - .setReferenceDictionary(dictionary) - .setOutputStream(new ByteArrayOutputStream()) - .setOutputFileType(VariantContextWriterBuilder.OutputType.VCF) - .build(); - } + 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"); - @Test(expectedExceptions = IllegalArgumentException.class) - public void testUnsupportedIndexOnTheFlyForStreaming() { - new VariantContextWriterBuilder() - .setReferenceDictionary(dictionary) - .setOutputStream(new ByteArrayOutputStream()) - .setOption(Options.INDEX_ON_THE_FLY) - .build(); - } + 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"); - @Test(expectedExceptions = IllegalArgumentException.class) - public void testUnsupportedDefaultIndexOnTheFlyForStreaming() { - new VariantContextWriterBuilder() - .setReferenceDictionary(dictionary) - .setOutputStream(new ByteArrayOutputStream()) - .build(); + 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(expectedExceptions = IllegalArgumentException.class) - public void testRefDictRequiredForVCFIndexOnTheFly() { - new VariantContextWriterBuilder() - .setOutputFile(vcf) - .setOption(Options.INDEX_ON_THE_FLY) - .build(); + } + + @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 testRefDictRequiredForBCFIndexOnTheFly() { - new VariantContextWriterBuilder() - .setOutputFile(bcf) - .setOption(Options.INDEX_ON_THE_FLY) - .build(); + } + + @Test + public void testIndexingOnTheFlyForPath() throws IOException { + final VariantContextWriterBuilder builder = new VariantContextWriterBuilder() + .setReferenceDictionary(dictionary) + .setOption(Options.INDEX_ON_THE_FLY); + + try (FileSystem fs = Jimfs.newFileSystem("test", Configuration.unix())) { + final Path vcfPath = fs.getPath(vcf.getName()); + final Path vcfIdxPath = Tribble.indexPath(vcfPath); + try(final VariantContextWriter writer = builder.setOutputPath(vcfPath).build()) + { + //deliberately empty + } + + Assert.assertTrue(Files.exists(vcfIdxPath), + String.format("VCF index not created for %s / %s", vcfPath, vcfIdxPath)); + + final Path bcfPath = fs.getPath(bcf.getName()); + final Path bcfIdxPath = Tribble.indexPath(bcfPath); + try(final VariantContextWriter writer = builder.setOutputPath(bcfPath).build()){ + //deliberately empty + } + Assert.assertTrue(Files.exists(bcfIdxPath), + String.format("BCF index not created for %s / %s", bcfPath, bcfIdxPath)); + + for (int i = 0; i < blockCompressedVCFs.size(); i++) { + final File blockCompressed = blockCompressedVCFs.get(i); + final File index = blockCompressedIndices.get(i); + + final Path blockCompressedPath = fs.getPath(blockCompressed.getName()); + final Path indexPath = fs.getPath(index.getName()); + + Assert.assertFalse(Files.exists(indexPath)); + try(VariantContextWriter writer = builder.setOutputPath(blockCompressedPath).setReferenceDictionary(dictionary).build()){ + //deliberately empty + } + Assert.assertTrue(Files.exists(indexPath), String + .format("Block-compressed index not created for %s / %s", blockCompressedPath, indexPath)); + + // Tabix does not require a reference dictionary. + // Tribble does: see tests testRefDictRequiredForVCFIndexOnTheFly / testRefDictRequiredForBCFIndexOnTheFly + Files.delete(indexPath); + try (VariantContextWriter writer = builder.setReferenceDictionary(null).build()){ + //deliberately empty + } + Assert.assertTrue(Files.exists(indexPath), String + .format("Block-compressed index not created for %s / %s", blockCompressedPath, indexPath)); + } } - - @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(singleThreaded = true, groups = "unix") + public void testWriteToFifo() throws IOException, InterruptedException, ExecutionException { + long length = testWriteToPipe(this::innerWriteToFifo); + // length>0 means we wrote to the named pipe, so all is well. + Assert.assertTrue(length>0, + "VariantContextWriterBuilder did not write to the named pipe as it should."); + } + + private void innerWriteToFifo(String pathToFifo) { + // Do not enable INDEX_OF_THE_FLY because that is not compatible with writing to a pipe. + final VariantContextWriterBuilder builder = new VariantContextWriterBuilder() + .clearOptions() + .setReferenceDictionary(dictionary); + + Path vcfPath = Paths.get(pathToFifo); + VariantContextWriter writer = builder.setOutputPath(vcfPath).build(); + writer.writeHeader(new VCFHeader()); + writer.close(); + } + + @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 } - - @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 + } + + @Test + public void testStdOut() { + final VariantContextWriter writer = new VariantContextWriterBuilder().setOutputFile("/dev/stdout").clearOptions().build(); + OutputStream s = ((VCFWriter) writer).getOutputStream(); + Assert.assertNotNull(((VCFWriter) writer).getOutputStream()); + Assert.assertNotEquals(((VCFWriter) writer).getStreamName(), IndexingVariantContextWriter.DEFAULT_READER_NAME); + } + + @Test(expectedExceptions = java.util.concurrent.ExecutionException.class) + public void demonstrateTestWriteToPipeDoesNotHang_1() throws Exception { + testWriteToPipe((str) -> { + throw new RuntimeException("oops"); + }); + } + + @Test(expectedExceptions = java.util.concurrent.ExecutionException.class) + public void demonstrateTestWriteToPipeDoesNotHang_2() throws Exception { + long x = testWriteToPipe((str) -> {try{Files.write(Paths.get(str), "hello world".getBytes());}catch(IOException ex){}; throw new RuntimeException("oops");}); + } + + + /** + * Create a named pipe, call "codeThatWritesToAFilename" with the name as argument, + * consumes the output as it's being run and returns the number of bytes that were output. + * + * This only works on Unix. Use this decoration for the tests that use it: + * @Test(singleThreaded = true, groups = "unix") + */ + private static long testWriteToPipe(final Consumer codeThatWritesToAFilename) throws IOException, InterruptedException, ExecutionException { + final File fifo = makeFifo(); + + // run the code in a separate thread + ExecutorService executor = Executors.newFixedThreadPool(2); + try { + final Future writeResult = executor.submit(() -> { + try { + codeThatWritesToAFilename.accept(fifo.getAbsolutePath()); + } catch (Exception x) { + // Print to the console to aid debugging, in case the exception doesn't surface. + x.printStackTrace(); + throw(x); } - } + }); + + // drain the pipe with the output. + final Future readResult = executor.submit(() -> { + try(final InputStream inputStream = Files.newInputStream(fifo.toPath(), StandardOpenOption.READ)) { + int count = 0; + while (inputStream.read() >= 0) { + count++; + } + return count; + } + }); - @Test - public void testStdOut() { - final VariantContextWriter writer = new VariantContextWriterBuilder().setOutputFile("/dev/stdout").clearOptions().build(); - OutputStream s = ((VCFWriter) writer).getOutputStream(); - Assert.assertNotNull(((VCFWriter) writer).getOutputStream()); - Assert.assertNotEquals(((VCFWriter) writer).getStreamName(), IndexingVariantContextWriter.DEFAULT_READER_NAME); + // done. If it was in error, the line below will throw the exception. + writeResult.get(); + return readResult.get(); + } finally { + executor.shutdownNow(); } + } + + private static File makeFifo() throws IOException, InterruptedException { + // make the fifo + final File fifo = File.createTempFile("fifo.for.testWriteToPipe", ""); + Assert.assertTrue(fifo.delete()); + fifo.deleteOnExit(); + final Process exec = new ProcessBuilder("mkfifo", fifo.getAbsolutePath()).start(); + exec.waitFor(1, TimeUnit.MINUTES); + Assert.assertEquals(exec.exitValue(), 0, "mkfifo failed with exit code " + 0); + return fifo; + } + } From e637281ed6a7d7bd9de5426f7770a56d12a3e991 Mon Sep 17 00:00:00 2001 From: Tom White Date: Tue, 4 Sep 2018 17:54:08 +0100 Subject: [PATCH 66/83] Expose VCFCodec version and header fields. (#1176) --- .../htsjdk/variant/vcf/AbstractVCFCodec.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java b/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java index 8710922103..dcb4352c95 100644 --- a/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java +++ b/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java @@ -228,7 +228,22 @@ protected VCFHeader parseHeaderFromLines( final List headerStrings, fina return this.header; } - /** + /** + * @return the header that was either explicitly set on this codec, or read from the file. May be null. + * The returned value should not be modified. + */ + public VCFHeader getHeader() { + return header; + } + + /** + * @return the version number that was either explicitly set on this codec, or read from the file. May be null. + */ + public VCFHeaderVersion getVersion() { + return version; + } + + /** * 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 From 16704e6886d87f357c63cfd0c9fc23cf091bbe6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B3mez-S=C3=A1nchez?= <7352559+magicDGS@users.noreply.github.com> Date: Tue, 4 Sep 2018 22:45:54 +0200 Subject: [PATCH 67/83] Use quality header and SAMTag.CO in FastqEncoder (#912) * when converting SamRecord -> FastqRecord write the SAM CO tag as the quality header * add an optional mechanism to record FastqRecord's quality header into the SamRecord when converting Fastq->SamRecord --- .../htsjdk/samtools/fastq/FastqEncoder.java | 38 ++++++++++++++++++- .../samtools/fastq/FastqEncoderTest.java | 32 +++++++++++++++- 2 files changed, 68 insertions(+), 2 deletions(-) mode change 100644 => 100755 src/main/java/htsjdk/samtools/fastq/FastqEncoder.java mode change 100644 => 100755 src/test/java/htsjdk/samtools/fastq/FastqEncoderTest.java diff --git a/src/main/java/htsjdk/samtools/fastq/FastqEncoder.java b/src/main/java/htsjdk/samtools/fastq/FastqEncoder.java old mode 100644 new mode 100755 index fdbd02dccf..ae181c4294 --- a/src/main/java/htsjdk/samtools/fastq/FastqEncoder.java +++ b/src/main/java/htsjdk/samtools/fastq/FastqEncoder.java @@ -26,9 +26,13 @@ import htsjdk.samtools.SAMException; import htsjdk.samtools.SAMFileHeader; import htsjdk.samtools.SAMRecord; +import htsjdk.samtools.SAMTag; +import htsjdk.samtools.TextTagCodec; import htsjdk.samtools.util.SequenceUtil; import java.io.IOException; +import java.util.Map; +import java.util.function.BiConsumer; /** * Codec for encoding records into FASTQ format. @@ -91,13 +95,27 @@ public static FastqRecord asFastqRecord(final SAMRecord record) { if(record.getReadPairedFlag() && (record.getFirstOfPairFlag() || record.getSecondOfPairFlag())) { readName += (record.getFirstOfPairFlag()) ? FastqConstants.FIRST_OF_PAIR : FastqConstants.SECOND_OF_PAIR; } - return new FastqRecord(readName, record.getReadString(), null, record.getBaseQualityString()); + return new FastqRecord(readName, record.getReadString(), record.getStringAttribute(SAMTag.CO.name()), record.getBaseQualityString()); } /** * Converts a {@link FastqRecord} into a simple unmapped {@link SAMRecord}. */ public static SAMRecord asSAMRecord(final FastqRecord record, final SAMFileHeader header) { + return asSAMRecord(record, header, (s, r) -> {}); + } + + /** + * Converts a {@link FastqRecord} into a simple unmapped {@link SAMRecord}. + * + *

This method allows to pass a {@link BiConsumer} to add the information from the record in + * a customizable manner. + * + * @param record object to encode. + * @param header header for the returned object. + * @param custom function to customize encoding. Note that default information might be overriden. + */ + public static SAMRecord asSAMRecord(final FastqRecord record, final SAMFileHeader header, final BiConsumer custom) { // construct the SAMRecord and set the unmapped flag final SAMRecord samRecord = new SAMRecord(header); samRecord.setReadUnmappedFlag(true); @@ -107,7 +125,25 @@ public static SAMRecord asSAMRecord(final FastqRecord record, final SAMFileHeade samRecord.setReadName(readName); samRecord.setReadBases(record.getReadBases()); samRecord.setBaseQualities(record.getBaseQualities()); + custom.accept(record, samRecord); return samRecord; } + /** + * Encodes the quality header into the comment tag (use in {@link #asSAMRecord(FastqRecord, SAMFileHeader, BiConsumer)}. + * + *

Note that all tabs present in the quality header are replaced by spaces. + */ + public static final BiConsumer QUALITY_HEADER_TO_COMMENT_TAG = (record, samRecord) -> + samRecord.setAttribute(SAMTag.CO.name(), record.getBaseQualityHeader().replaceAll("\t", " ")); + + + public static final BiConsumer QUALITY_HEADER_PARSE_SAM_TAGS = (record, samRecord) -> { + final String[] tokens = record.getBaseQualityHeader().split("\t"); + final TextTagCodec codec = new TextTagCodec(); + for (final String token: tokens) { + final Map.Entry tagValue = codec.decode(token); + samRecord.setAttribute(tagValue.getKey(), tagValue.getValue()); + } + }; } diff --git a/src/test/java/htsjdk/samtools/fastq/FastqEncoderTest.java b/src/test/java/htsjdk/samtools/fastq/FastqEncoderTest.java old mode 100644 new mode 100755 index c367397a30..65b83a2945 --- a/src/test/java/htsjdk/samtools/fastq/FastqEncoderTest.java +++ b/src/test/java/htsjdk/samtools/fastq/FastqEncoderTest.java @@ -26,6 +26,7 @@ import htsjdk.HtsjdkTest; import htsjdk.samtools.SAMRecord; import htsjdk.samtools.SAMRecordSetBuilder; +import htsjdk.samtools.SAMTag; import org.testng.Assert; import org.testng.annotations.Test; @@ -46,13 +47,15 @@ public void testAsFastqRecord() throws Exception { testRecord(record.getReadName() + FastqConstants.SECOND_OF_PAIR, FastqEncoder.asFastqRecord(record), record); record.setSecondOfPairFlag(false); testRecord(record.getReadName(), FastqEncoder.asFastqRecord(record), record); + record.setAttribute(SAMTag.CO.name(), "Comment in SAM tag"); + testRecord(record.getReadName(), FastqEncoder.asFastqRecord(record), record); } private void testRecord(final String expectedReadName, final FastqRecord fastqRecord, final SAMRecord samRecord) { Assert.assertEquals(fastqRecord.getReadName(), expectedReadName); Assert.assertEquals(fastqRecord.getBaseQualities(), samRecord.getBaseQualities()); Assert.assertEquals(fastqRecord.getReadBases(), samRecord.getReadBases()); - Assert.assertNull(fastqRecord.getBaseQualityHeader()); + Assert.assertEquals(fastqRecord.getBaseQualityHeader(), samRecord.getStringAttribute(SAMTag.CO.name())); } @Test @@ -65,12 +68,39 @@ public void testAsSAMRecord() throws Exception { testConvertedSAMRecord(FastqEncoder.asSAMRecord(fastqRecord, samRecord.getHeader()), samRecord); fastqRecord = new FastqRecord(samRecord.getReadName() + FastqConstants.SECOND_OF_PAIR, samRecord.getReadBases(), "", samRecord.getBaseQualities()); testConvertedSAMRecord(FastqEncoder.asSAMRecord(fastqRecord, samRecord.getHeader()), samRecord); + fastqRecord = new FastqRecord(samRecord.getReadName() + FastqConstants.SECOND_OF_PAIR, samRecord.getReadBases(), "Quality header comment", samRecord.getBaseQualities()); + // default method does not include the comment header + testConvertedSAMRecord(FastqEncoder.asSAMRecord(fastqRecord, samRecord.getHeader()), samRecord); + // test with qualityHeaderToComment=true populates the CO tag + samRecord.setAttribute(SAMTag.CO.name(), fastqRecord.getBaseQualityHeader()); + testConvertedSAMRecord(FastqEncoder.asSAMRecord(fastqRecord, samRecord.getHeader(), FastqEncoder.QUALITY_HEADER_TO_COMMENT_TAG), samRecord); + } + + @Test + public void testAsSAMRecordParsedTags() throws Exception { + final String bc = "ACTG"; + final String rg = "sample1"; + final int fi = 1; + final String customTag = "ct"; + final char ct = 'a'; + final String tags = String.format("%s:Z:%s\t%s:Z:%s\t%s:i:%d\t%s:A:%c", + SAMTag.BC, bc, SAMTag.RG, rg, SAMTag.FI, fi, customTag, ct + ); + final SAMRecord samRecord = new SAMRecordSetBuilder().addFrag("test", 0, 1, false, false, "10M", null, 2); + final FastqRecord record = new FastqRecord(samRecord.getReadName(), samRecord.getReadBases(), tags, samRecord.getBaseQualities()); + final SAMRecord converted = FastqEncoder.asSAMRecord(record, samRecord.getHeader(), FastqEncoder.QUALITY_HEADER_PARSE_SAM_TAGS); + testConvertedSAMRecord(converted, samRecord); + Assert.assertEquals(converted.getAttribute(SAMTag.BC.name()), bc); + Assert.assertEquals(converted.getAttribute(SAMTag.RG.name()), rg); + Assert.assertEquals(converted.getAttribute(SAMTag.FI.name()), fi); + Assert.assertEquals(converted.getAttribute(customTag), ct); } private void testConvertedSAMRecord(final SAMRecord converted, final SAMRecord original) { Assert.assertEquals(converted.getReadName(), original.getReadName()); Assert.assertEquals(converted.getBaseQualities(), original.getBaseQualities()); Assert.assertEquals(converted.getReadBases(), original.getReadBases()); + Assert.assertEquals(converted.getStringAttribute(SAMTag.CO.name()), original.getStringAttribute(SAMTag.CO.name())); Assert.assertTrue(converted.getReadUnmappedFlag()); } } \ No newline at end of file From 85580fca3c5a22e60f742894c7bdea2050cdb84d Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Thu, 6 Sep 2018 11:42:07 -0400 Subject: [PATCH 68/83] restore no-args VariantContextWriterBuilder.build() (#1177) * restore no-args VariantContextWriterBuilder.build() * VariantContextWriterBuilder.build() was replaced by a varargs version of itself in a previous commit While this is a source compatible change it's not binary compatible and since it's a commonly used function it breaks a lot of libraries. * add a parameterless build() which just calls through to the varargs version with an empty array --- .../writer/VariantContextWriterBuilder.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java index 2325000a77..1c42c82210 100644 --- a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java +++ b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java @@ -31,14 +31,12 @@ 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.IOException; import java.io.OutputStream; import java.nio.file.Files; @@ -108,6 +106,7 @@ public class VariantContextWriterBuilder { public static final EnumSet DEFAULT_OPTIONS = EnumSet.of(Options.INDEX_ON_THE_FLY); public static final EnumSet NO_OPTIONS = EnumSet.noneOf(Options.class); + private static final OpenOption[] EMPTY_OPEN_OPTION_ARRAY = new OpenOption[0]; public enum OutputType { UNSPECIFIED, @@ -399,9 +398,25 @@ boolean isOptionSet(final Options option) { return this.options.contains(option); } + + /** + * Validate and build the VariantContextWriter. + * + * @return the VariantContextWriter 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 Options.INDEX_ON_THE_FLY is specified and no reference dictionary is provided. + * @throws IllegalArgumentException if Options.INDEX_ON_THE_FLY is specified and a stream output is specified. + */ + public VariantContextWriter build() { + return build(EMPTY_OPEN_OPTION_ARRAY); + } + /** * Validate and build the VariantContextWriter. * + * @param openOptions options to use when opening the underlying output stream. + * * @return the VariantContextWriter as specified by previous method calls, * optionally applying the specified OpenOptions. * @throws RuntimeIOException if the writer is configured to write to a file, and the corresponding path does not exist. @@ -486,7 +501,7 @@ else if (STREAM_TYPES.contains(this.outType)) * 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. * - * @param f A file whose {@link OutputType} we want to infer + * @param path A file whose {@link OutputType} we want to infer * @return The file's {@link OutputType}. Never {@code null}. */ public static OutputType determineOutputTypeFromFile(final Path path) { From e37d8de52b8290f23f5787070fcb9371c21b675b Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Thu, 6 Sep 2018 13:27:14 -0400 Subject: [PATCH 69/83] extending use of IOUtil.toPath() (#967) * updated many existing uses of file.toPath() to IOUtil.toPath(file) * add test for toPath --- .../htsjdk/samtools/BinaryBAMIndexWriter.java | 3 ++- .../htsjdk/samtools/SAMFileWriterFactory.java | 14 +++++++------- src/main/java/htsjdk/samtools/SamFiles.java | 3 ++- .../java/htsjdk/samtools/SamInputResource.java | 2 +- .../samtools/cram/ref/ReferenceSource.java | 5 ++--- .../reference/AbstractFastaSequenceFile.java | 7 ++----- .../samtools/reference/FastaSequenceFile.java | 2 +- .../samtools/reference/FastaSequenceIndex.java | 2 +- .../reference/IndexedFastaSequenceFile.java | 4 ++-- .../ReferenceSequenceFileFactory.java | 4 ++-- .../java/htsjdk/samtools/util/BinaryCodec.java | 2 +- src/main/java/htsjdk/samtools/util/IOUtil.java | 10 +++++----- .../htsjdk/samtools/util/IntervalList.java | 2 +- .../util/Md5CalculatingOutputStream.java | 3 +-- .../htsjdk/tribble/index/AbstractIndex.java | 2 +- .../tribble/index/DynamicIndexCreator.java | 3 ++- src/main/java/htsjdk/tribble/index/Index.java | 5 +++-- .../index/interval/IntervalIndexCreator.java | 5 +++-- .../tribble/index/linear/LinearIndex.java | 3 ++- .../index/linear/LinearIndexCreator.java | 5 +++-- .../java/htsjdk/samtools/SamFilesTest.java | 3 ++- .../java/htsjdk/samtools/util/IOUtilTest.java | 18 ++++++++++++++++++ 22 files changed, 64 insertions(+), 43 deletions(-) diff --git a/src/main/java/htsjdk/samtools/BinaryBAMIndexWriter.java b/src/main/java/htsjdk/samtools/BinaryBAMIndexWriter.java index 5a498c3526..ec9c7e5371 100644 --- a/src/main/java/htsjdk/samtools/BinaryBAMIndexWriter.java +++ b/src/main/java/htsjdk/samtools/BinaryBAMIndexWriter.java @@ -25,6 +25,7 @@ package htsjdk.samtools; import htsjdk.samtools.util.BinaryCodec; +import htsjdk.samtools.util.IOUtil; import java.io.File; import java.io.IOException; @@ -47,7 +48,7 @@ class BinaryBAMIndexWriter implements BAMIndexWriter { * @param output BAM Index output file */ public BinaryBAMIndexWriter(final int nRef, final File output) { - this(nRef, null == output ? null : output.toPath()); + this(nRef, IOUtil.toPath(output)); } /** diff --git a/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java b/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java index 1fb0b89e89..d3312bb3d8 100644 --- a/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java +++ b/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java @@ -452,7 +452,7 @@ public SAMFileWriter makeSAMOrBAMWriter(final SAMFileHeader header, final boolea * */ public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presorted, final File outputFile, final File referenceFasta) { - return makeWriter(header, presorted, null == outputFile ? null : outputFile.toPath(), null == referenceFasta ? null : referenceFasta.toPath()); + return makeWriter(header, presorted, IOUtil.toPath( outputFile ), IOUtil.toPath(referenceFasta)); } /** @@ -468,7 +468,7 @@ public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presor */ @Deprecated public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presorted, final Path outputPath, final File referenceFasta) { - return makeWriter(header, presorted, outputPath, null == referenceFasta ? null : referenceFasta.toPath()); + return makeWriter(header, presorted, outputPath, IOUtil.toPath( referenceFasta )); } /** @@ -503,7 +503,7 @@ public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presor * @return CRAMFileWriter */ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final OutputStream stream, final File referenceFasta) { - return makeCRAMWriter(header, stream, null == referenceFasta ? null : referenceFasta.toPath()); + return makeCRAMWriter(header, stream, IOUtil.toPath( referenceFasta )); } /** @@ -537,7 +537,7 @@ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final OutputStr * */ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final File outputFile, final File referenceFasta) { - return createCRAMWriterWithSettings(header, true, outputFile.toPath(), null == referenceFasta ? null : referenceFasta.toPath()); + return createCRAMWriterWithSettings(header, true, outputFile.toPath(), IOUtil.toPath( referenceFasta )); } /** @@ -556,7 +556,7 @@ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final File outp */ @Deprecated public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final Path outputPath, final File referenceFasta) { - return makeCRAMWriter(header, true, outputPath, null == referenceFasta ? null : referenceFasta.toPath()); + return makeCRAMWriter(header, true, outputPath, IOUtil.toPath( referenceFasta )); } /** @@ -572,7 +572,7 @@ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final Path outp * */ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile, final File referenceFasta) { - return makeCRAMWriter(header, presorted, outputFile.toPath(), null == referenceFasta ? null : referenceFasta.toPath()); + return makeCRAMWriter(header, presorted, outputFile.toPath(), IOUtil.toPath(referenceFasta)); } @@ -593,7 +593,7 @@ public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final boolean p */ @Deprecated public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final boolean presorted, final Path output, final File referenceFasta) { - return makeCRAMWriter(header, presorted, output, null == referenceFasta ? null : referenceFasta.toPath()); + return makeCRAMWriter(header, presorted, output, IOUtil.toPath( referenceFasta )); } /** diff --git a/src/main/java/htsjdk/samtools/SamFiles.java b/src/main/java/htsjdk/samtools/SamFiles.java index 874fc1027e..f69ab0e695 100644 --- a/src/main/java/htsjdk/samtools/SamFiles.java +++ b/src/main/java/htsjdk/samtools/SamFiles.java @@ -3,6 +3,7 @@ import htsjdk.samtools.cram.CRAIIndex; import htsjdk.samtools.cram.build.CramIO; +import htsjdk.samtools.util.IOUtil; import htsjdk.samtools.util.Log; import java.io.File; import java.io.IOException; @@ -24,7 +25,7 @@ public class SamFiles { * @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()); + final Path path = findIndex(IOUtil.toPath(samFile)); return path == null ? null : path.toFile(); } diff --git a/src/main/java/htsjdk/samtools/SamInputResource.java b/src/main/java/htsjdk/samtools/SamInputResource.java index 017a649c78..c68b6327a7 100644 --- a/src/main/java/htsjdk/samtools/SamInputResource.java +++ b/src/main/java/htsjdk/samtools/SamInputResource.java @@ -271,7 +271,7 @@ public File asFile() { @Override public Path asPath() { - return fileResource.toPath(); + return IOUtil.toPath(fileResource); } @Override diff --git a/src/main/java/htsjdk/samtools/cram/ref/ReferenceSource.java b/src/main/java/htsjdk/samtools/cram/ref/ReferenceSource.java index 61b3a418b0..1264fee09b 100644 --- a/src/main/java/htsjdk/samtools/cram/ref/ReferenceSource.java +++ b/src/main/java/htsjdk/samtools/cram/ref/ReferenceSource.java @@ -20,12 +20,11 @@ import htsjdk.samtools.Defaults; import htsjdk.samtools.SAMException; import htsjdk.samtools.SAMSequenceRecord; -import htsjdk.samtools.SAMUtils; -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.IOUtil; import htsjdk.samtools.util.Log; import htsjdk.samtools.util.SequenceUtil; import htsjdk.samtools.util.StringUtil; @@ -60,7 +59,7 @@ public class ReferenceSource implements CRAMReferenceSource { private final Map> cacheW = new HashMap<>(); public ReferenceSource(final File file) { - this(file == null ? null : file.toPath()); + this(IOUtil.toPath(file)); } public ReferenceSource(final Path path) { diff --git a/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java index 701d421515..b815774a68 100644 --- a/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java +++ b/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java @@ -50,7 +50,7 @@ abstract class AbstractFastaSequenceFile implements ReferenceSequenceFile { * @param file Fasta file to read. Also acts as a prefix for supporting files. */ AbstractFastaSequenceFile(final File file) { - this(file == null ? null : file.toPath()); + this(IOUtil.toPath(file)); } /** @@ -86,10 +86,7 @@ abstract class AbstractFastaSequenceFile implements ReferenceSequenceFile { } protected static File findSequenceDictionary(final File file) { - if (file == null) { - return null; - } - Path dictionary = findSequenceDictionary(file.toPath()); + final Path dictionary = findSequenceDictionary(IOUtil.toPath(file)); if (dictionary == null) { return null; } diff --git a/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java index 2016b7010f..3dc8fd191f 100644 --- a/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java +++ b/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java @@ -53,7 +53,7 @@ public class FastaSequenceFile extends AbstractFastaSequenceFile { /** Constructs a FastaSequenceFile that reads from the specified file. */ public FastaSequenceFile(final File file, final boolean truncateNamesAtWhitespace) { - this(file == null ? null : file.toPath(), truncateNamesAtWhitespace); + this(IOUtil.toPath(file), truncateNamesAtWhitespace); } /** Constructs a FastaSequenceFile that reads from the specified file. */ diff --git a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java index 06aa2007dc..8a3f9da09e 100644 --- a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java +++ b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java @@ -57,7 +57,7 @@ public class FastaSequenceIndex implements Iterable { * @throws FileNotFoundException if the index file cannot be found. */ public FastaSequenceIndex( File indexFile ) { - this(indexFile == null ? null : indexFile.toPath()); + this(IOUtil.toPath(indexFile)); } /** diff --git a/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java index 52307ea56d..226d539c0b 100644 --- a/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java +++ b/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java @@ -59,7 +59,7 @@ public class IndexedFastaSequenceFile extends AbstractIndexedFastaSequenceFile { * @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); + this(IOUtil.toPath(file), index); } /** @@ -68,7 +68,7 @@ public IndexedFastaSequenceFile(final File file, final FastaSequenceIndex index) * @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 == null ? null : file.toPath())))); + this(file, new FastaSequenceIndex((findRequiredFastaIndexFile(IOUtil.toPath(file))))); } /** diff --git a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java index 3e216b715a..d013d56b44 100644 --- a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java +++ b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java @@ -93,7 +93,7 @@ public static ReferenceSequenceFile getReferenceSequenceFile(final File file, fi * @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); + return getReferenceSequenceFile(IOUtil.toPath(file), truncateNamesAtWhitespace, preferIndexed); } /** @@ -206,7 +206,7 @@ public static ReferenceSequenceFile getReferenceSequenceFile(final String source * @param file the reference sequence file on disk. */ public static File getDefaultDictionaryForReferenceSequence(final File file) { - return getDefaultDictionaryForReferenceSequence(file.toPath()).toFile(); + return getDefaultDictionaryForReferenceSequence(IOUtil.toPath(file)).toFile(); } /** diff --git a/src/main/java/htsjdk/samtools/util/BinaryCodec.java b/src/main/java/htsjdk/samtools/util/BinaryCodec.java index 898f50eb4b..08fe60a123 100644 --- a/src/main/java/htsjdk/samtools/util/BinaryCodec.java +++ b/src/main/java/htsjdk/samtools/util/BinaryCodec.java @@ -123,7 +123,7 @@ public BinaryCodec(final Path path, final boolean writing) { * @param writing whether the file is being written to */ public BinaryCodec(final File file, final boolean writing) { - this(null == file ? null : file.toPath(), writing); + this(IOUtil.toPath(file), writing); } /** diff --git a/src/main/java/htsjdk/samtools/util/IOUtil.java b/src/main/java/htsjdk/samtools/util/IOUtil.java index ea30e0671d..ef7bec21ca 100755 --- a/src/main/java/htsjdk/samtools/util/IOUtil.java +++ b/src/main/java/htsjdk/samtools/util/IOUtil.java @@ -414,7 +414,7 @@ public static boolean isUrl(final String input) { * @param file the file to check for readability */ public static void assertFileIsReadable(final File file) { - assertFileIsReadable(file == null ? null : file.toPath()); + assertFileIsReadable(toPath(file)); } /** @@ -521,7 +521,7 @@ public static void assertFilesAreWritable(final List files) { * @param dir the dir to check for writability */ public static void assertDirectoryIsWritable(final File dir) { - final Path asPath = (dir == null) ? null : dir.toPath(); + final Path asPath = IOUtil.toPath(dir); assertDirectoryIsWritable(asPath); } @@ -613,7 +613,7 @@ public static void assertFileSizeNonZero(final File file) { * @return the input stream to read from */ public static InputStream openFileForReading(final File file) { - return openFileForReading(file.toPath()); + return openFileForReading(toPath(file)); } /** @@ -646,7 +646,7 @@ public static InputStream openFileForReading(final Path path) { * @return the input stream to read from */ public static InputStream openGzipFileForReading(final File file) { - return openGzipFileForReading(file.toPath()); + return openGzipFileForReading(toPath(file)); } /** @@ -886,7 +886,7 @@ public static File createTempDir(final String prefix, final String suffix) { /** Checks that a file exists and is readable, and then returns a buffered reader for it. */ public static BufferedReader openFileForBufferedReading(final File file) { - return openFileForBufferedReading(file.toPath()); + return openFileForBufferedReading(toPath(file)); } /** Checks that a path exists and is readable, and then returns a buffered reader for it. */ diff --git a/src/main/java/htsjdk/samtools/util/IntervalList.java b/src/main/java/htsjdk/samtools/util/IntervalList.java index a5d2a8e000..6691fa5745 100644 --- a/src/main/java/htsjdk/samtools/util/IntervalList.java +++ b/src/main/java/htsjdk/samtools/util/IntervalList.java @@ -396,7 +396,7 @@ public static IntervalList copyOf(final IntervalList list){ * @return an IntervalList object that contains the headers and intervals from the file */ public static IntervalList fromFile(final File file) { - return fromPath(file.toPath()); + return fromPath(IOUtil.toPath(file)); } /** diff --git a/src/main/java/htsjdk/samtools/util/Md5CalculatingOutputStream.java b/src/main/java/htsjdk/samtools/util/Md5CalculatingOutputStream.java index 8b4c643a37..c002b5bf01 100755 --- a/src/main/java/htsjdk/samtools/util/Md5CalculatingOutputStream.java +++ b/src/main/java/htsjdk/samtools/util/Md5CalculatingOutputStream.java @@ -27,7 +27,6 @@ import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.io.OutputStream; import java.math.BigInteger; @@ -68,7 +67,7 @@ public Md5CalculatingOutputStream(OutputStream os, Path digestFile) { } public Md5CalculatingOutputStream(OutputStream os, File digestFile) { - this(os, digestFile == null ? (Path) null : digestFile.toPath()); + this(os, IOUtil.toPath(digestFile)); } @Override diff --git a/src/main/java/htsjdk/tribble/index/AbstractIndex.java b/src/main/java/htsjdk/tribble/index/AbstractIndex.java index 04752eb76f..256e6716a6 100644 --- a/src/main/java/htsjdk/tribble/index/AbstractIndex.java +++ b/src/main/java/htsjdk/tribble/index/AbstractIndex.java @@ -173,7 +173,7 @@ public AbstractIndex(final String featureFile) { } public AbstractIndex(final File featureFile) { - this(featureFile.toPath()); + this(IOUtil.toPath(featureFile)); } public AbstractIndex(final Path featurePath) { diff --git a/src/main/java/htsjdk/tribble/index/DynamicIndexCreator.java b/src/main/java/htsjdk/tribble/index/DynamicIndexCreator.java index 17274ace68..0d3fb921cb 100644 --- a/src/main/java/htsjdk/tribble/index/DynamicIndexCreator.java +++ b/src/main/java/htsjdk/tribble/index/DynamicIndexCreator.java @@ -24,6 +24,7 @@ package htsjdk.tribble.index; +import htsjdk.samtools.util.IOUtil; import htsjdk.tribble.Feature; import htsjdk.tribble.TribbleException; import htsjdk.tribble.index.interval.IntervalIndexCreator; @@ -65,7 +66,7 @@ public DynamicIndexCreator(final Path inputPath, final IndexFactory.IndexBalance } public DynamicIndexCreator(final File inputFile, final IndexFactory.IndexBalanceApproach iba) { - this(inputFile.toPath(), iba); + this(IOUtil.toPath(inputFile), iba); } @Override diff --git a/src/main/java/htsjdk/tribble/index/Index.java b/src/main/java/htsjdk/tribble/index/Index.java index 51982c6d28..be1b697e85 100644 --- a/src/main/java/htsjdk/tribble/index/Index.java +++ b/src/main/java/htsjdk/tribble/index/Index.java @@ -23,6 +23,7 @@ */ package htsjdk.tribble.index; +import htsjdk.samtools.util.IOUtil; import htsjdk.tribble.util.LittleEndianOutputStream; import java.io.File; @@ -79,7 +80,7 @@ public interface Index { * @throws IOException if the index is unable to write to the specified file */ public default void write(final File idxFile) throws IOException { - write(idxFile.toPath()); + write(IOUtil.toPath(idxFile)); } /** @@ -99,7 +100,7 @@ public default void write(final File idxFile) throws IOException { * @throws IOException if featureFile is not a normal file. */ public default void writeBasedOnFeatureFile(File featureFile) throws IOException { - writeBasedOnFeaturePath(featureFile.toPath()); + writeBasedOnFeaturePath(IOUtil.toPath(featureFile)); } /** diff --git a/src/main/java/htsjdk/tribble/index/interval/IntervalIndexCreator.java b/src/main/java/htsjdk/tribble/index/interval/IntervalIndexCreator.java index 58e2f87eeb..dc8825396c 100644 --- a/src/main/java/htsjdk/tribble/index/interval/IntervalIndexCreator.java +++ b/src/main/java/htsjdk/tribble/index/interval/IntervalIndexCreator.java @@ -18,6 +18,7 @@ package htsjdk.tribble.index.interval; +import htsjdk.samtools.util.IOUtil; import htsjdk.tribble.Feature; import htsjdk.tribble.index.Block; import htsjdk.tribble.index.Index; @@ -60,11 +61,11 @@ public IntervalIndexCreator(final Path inputPath, final int featuresPerInterval) } public IntervalIndexCreator(final File inputFile, final int featuresPerInterval) { - this(inputFile.toPath(), featuresPerInterval); + this(IOUtil.toPath(inputFile), featuresPerInterval); } public IntervalIndexCreator(final File inputFile) { - this(inputFile.toPath()); + this(IOUtil.toPath(inputFile)); } public IntervalIndexCreator(final Path inputPath) { diff --git a/src/main/java/htsjdk/tribble/index/linear/LinearIndex.java b/src/main/java/htsjdk/tribble/index/linear/LinearIndex.java index 3d7905af1f..758a81859b 100644 --- a/src/main/java/htsjdk/tribble/index/linear/LinearIndex.java +++ b/src/main/java/htsjdk/tribble/index/linear/LinearIndex.java @@ -18,6 +18,7 @@ package htsjdk.tribble.index.linear; +import htsjdk.samtools.util.IOUtil; import htsjdk.tribble.index.AbstractIndex; import htsjdk.tribble.index.Block; import htsjdk.tribble.index.Index; @@ -84,7 +85,7 @@ public LinearIndex(final List indices, final Path featureFile) { * @param featureFile */ public LinearIndex(final List indices, final File featureFile) { - this(indices, featureFile.toPath()); + this(indices, IOUtil.toPath(featureFile)); } private LinearIndex(final LinearIndex parent, final List indices) { diff --git a/src/main/java/htsjdk/tribble/index/linear/LinearIndexCreator.java b/src/main/java/htsjdk/tribble/index/linear/LinearIndexCreator.java index 9109705d25..c4ff04da36 100644 --- a/src/main/java/htsjdk/tribble/index/linear/LinearIndexCreator.java +++ b/src/main/java/htsjdk/tribble/index/linear/LinearIndexCreator.java @@ -23,6 +23,7 @@ */ package htsjdk.tribble.index.linear; +import htsjdk.samtools.util.IOUtil; import htsjdk.tribble.Feature; import htsjdk.tribble.index.Block; import htsjdk.tribble.index.Index; @@ -57,11 +58,11 @@ public LinearIndexCreator(final Path inputPath, final int binSize) { } public LinearIndexCreator(final File inputFile, final int binSize) { - this(inputFile.toPath(), binSize); + this(IOUtil.toPath(inputFile), binSize); } public LinearIndexCreator(final File inputFile) { - this(inputFile.toPath()); + this(IOUtil.toPath(inputFile)); } public LinearIndexCreator(final Path inputPath) { diff --git a/src/test/java/htsjdk/samtools/SamFilesTest.java b/src/test/java/htsjdk/samtools/SamFilesTest.java index e7c1919d41..a386c9db39 100644 --- a/src/test/java/htsjdk/samtools/SamFilesTest.java +++ b/src/test/java/htsjdk/samtools/SamFilesTest.java @@ -3,6 +3,7 @@ import java.nio.file.Path; import htsjdk.HtsjdkTest; +import htsjdk.samtools.util.IOUtil; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -88,6 +89,6 @@ public Object[][] getFilesAndIndicies() throws IOException { @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()); + Assert.assertEquals(SamFiles.findIndex(bam.toPath()), IOUtil.toPath(expected_index)); } } diff --git a/src/test/java/htsjdk/samtools/util/IOUtilTest.java b/src/test/java/htsjdk/samtools/util/IOUtilTest.java index 5338b7320c..638068f021 100644 --- a/src/test/java/htsjdk/samtools/util/IOUtilTest.java +++ b/src/test/java/htsjdk/samtools/util/IOUtilTest.java @@ -44,6 +44,8 @@ import org.testng.annotations.Test; import java.lang.IllegalArgumentException; +import java.nio.file.Path; +import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -266,6 +268,22 @@ private Object[][] unixFileTypeTestCases() { }; } + + @DataProvider + public Object[][] getFiles(){ + final File file = new File("someFile"); + return new Object[][] { + {null, null}, + {file, file.toPath()} + }; + } + + @Test(dataProvider = "getFiles") + public void testToPath(final File file, final Path expected){ + Assert.assertEquals(IOUtil.toPath(file), expected); + } + + @DataProvider(name = "fileNamesForDelete") public Object[][] fileNamesForDelete() { return new Object[][] { From fb36a36fb6c362bc273c30948ec5d21a9b4ef90b Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Fri, 7 Sep 2018 13:56:17 -0400 Subject: [PATCH 70/83] adding back deleted method(#1178) * adding back in an unintentionally deleted method found by compatibility testing tools * refactoring the relevant test --- .../writer/VariantContextWriterBuilder.java | 13 ++++ .../VariantContextWriterBuilderUnitTest.java | 61 +++++++++++++------ 2 files changed, 54 insertions(+), 20 deletions(-) diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java index 1c42c82210..d809d3aff0 100644 --- a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java +++ b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java @@ -495,6 +495,19 @@ else if (STREAM_TYPES.contains(this.outType)) 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. + * + * @param file A file whose {@link OutputType} we want to infer + * @return The file's {@link OutputType}. Never {@code null}. + */ + public static OutputType determineOutputTypeFromFile(final File file) { + return determineOutputTypeFromFile(file.toPath()); + } + /** * 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 diff --git a/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java index 3ea0d292e0..b412165319 100644 --- a/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java +++ b/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java @@ -31,7 +31,6 @@ import htsjdk.samtools.SAMSequenceDictionary; import htsjdk.samtools.util.BlockCompressedOutputStream; import htsjdk.samtools.util.IOUtil; -import htsjdk.samtools.util.RuntimeIOException; import htsjdk.tribble.Tribble; import htsjdk.tribble.util.TabixUtils; import htsjdk.variant.VariantBaseTest; @@ -40,6 +39,7 @@ import java.nio.file.FileSystem; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; +import java.util.Iterator; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -48,6 +48,7 @@ import java.util.function.Consumer; import org.testng.Assert; import org.testng.annotations.BeforeSuite; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.*; @@ -133,27 +134,47 @@ public void testSetOutputFile() throws IOException { Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFile BCF File"); } - @Test - public void testDetermineOutputType() { - Assert.assertEquals(OutputType.VCF, VariantContextWriterBuilder.determineOutputTypeFromFile(this.vcf.toPath())); - Assert.assertEquals(OutputType.BCF, VariantContextWriterBuilder.determineOutputTypeFromFile(this.bcf.toPath())); - Assert.assertEquals(OutputType.VCF_STREAM, VariantContextWriterBuilder.determineOutputTypeFromFile(new File("/dev/stdout").toPath())); - for (final File f: this.blockCompressedVCFs) { - Assert.assertEquals(OutputType.BLOCK_COMPRESSED_VCF, VariantContextWriterBuilder.determineOutputTypeFromFile(f.toPath())); - } - // 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)); - link.toFile().delete(); - } - catch (final IOException ioe) { - throw new RuntimeIOException(ioe); + @DataProvider + public Iterator getFilesAndOutputTypes(){ + List cases = new ArrayList<>(); + cases.add(new Object[]{OutputType.VCF, this.vcf}); + cases.add(new Object[]{OutputType.BCF, this.bcf}); + cases.add(new Object[]{OutputType.VCF_STREAM, new File("/dev/stdout")}); + for (final File file: this.blockCompressedVCFs) { + cases.add( new Object[]{OutputType.BLOCK_COMPRESSED_VCF, file}); } + return cases.iterator(); + } + + @Test(dataProvider = "getFilesAndOutputTypes") + public void testDetermineOutputType(OutputType expected, File file) { + Assert.assertEquals(VariantContextWriterBuilder.determineOutputTypeFromFile(file), expected); + } + + @Test(dataProvider = "getFilesAndOutputTypes") + public void testDetermineOutputTypeWithSymlink(OutputType expected, File file) throws IOException { + final File link = setUpSymlink(file); + Assert.assertEquals(expected, VariantContextWriterBuilder.determineOutputTypeFromFile(link)); + } + + @Test(dataProvider = "getFilesAndOutputTypes") + public void testDetermineOutputTypeOnPath(OutputType expected, File file) { + Assert.assertEquals(VariantContextWriterBuilder.determineOutputTypeFromFile(file.toPath()), expected); + } + + @Test(dataProvider = "getFilesAndOutputTypes") + public void testDetermineOutputTypeWithSymlinkOnPath(OutputType expected, File file) throws IOException { + final File link = setUpSymlink(file); + Assert.assertEquals(expected, VariantContextWriterBuilder.determineOutputTypeFromFile(link.toPath())); + } + + private static File setUpSymlink(File target) throws IOException { + final Path link = Files.createTempFile("foo.", ".tmp"); + Files.deleteIfExists(link); + Files.createSymbolicLink(link, target.toPath()); + link.toFile().deleteOnExit(); + return link.toFile(); } @Test From a762262acefca73ea438e5165497e9d370f79bcf Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Mon, 17 Sep 2018 14:23:56 -0400 Subject: [PATCH 71/83] cleanup bam order checking code (#770) * cleanup of code for checking order of sam files making use of SAMSortOrderChecker in AssertingSamIterator this reduces some redundant code and makes order checking more consistent removing some redundant ways of getting a Comparator from a SamFileHeader.SortOrder replacing use of reflection to generate Comparators with use of Supplier --- .../java/htsjdk/samtools/SAMFileHeader.java | 44 ++---- .../htsjdk/samtools/SAMFileWriterImpl.java | 16 +- .../htsjdk/samtools/SAMSortOrderChecker.java | 25 +--- src/main/java/htsjdk/samtools/SamReader.java | 33 ++--- .../java/htsjdk/samtools/SamReaderTest.java | 139 +++++++++++++----- 5 files changed, 135 insertions(+), 122 deletions(-) diff --git a/src/main/java/htsjdk/samtools/SAMFileHeader.java b/src/main/java/htsjdk/samtools/SAMFileHeader.java index dd9bf5686d..1d123684f1 100644 --- a/src/main/java/htsjdk/samtools/SAMFileHeader.java +++ b/src/main/java/htsjdk/samtools/SAMFileHeader.java @@ -29,16 +29,8 @@ import htsjdk.samtools.util.Log; 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; +import java.util.*; +import java.util.function.Supplier; /** * Header information from a SAM or BAM file. @@ -70,40 +62,32 @@ Set getStandardTags() { * 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! - unknown(null); + unsorted(() -> null), + queryname(SAMRecordQueryNameComparator::new), + coordinate(SAMRecordCoordinateComparator::new), + duplicate(SAMRecordDuplicateComparator::new), // NB: this is not in the SAM spec! + unknown(() -> null); - private final Class comparator; + private final Supplier comparatorSupplier; - SortOrder(final Class comparatorClass) { - this.comparator = comparatorClass; + SortOrder(final Supplier comparatorClass) { + this.comparatorSupplier = comparatorClass; } /** * @return Comparator class to sort in the specified order, or null if unsorted. + * @deprecated since 7/2018, use {@link #getComparatorInstance()} with {@link SAMSortOrderChecker#getClass()} instead */ + @Deprecated public Class getComparator() { - return comparator; + return comparatorSupplier.get().getClass(); } /** * @return Comparator to sort in the specified order, or null if unsorted. */ public SAMRecordComparator getComparatorInstance() { - if (comparator != null) { - try { - final Constructor 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; + return comparatorSupplier.get(); } } diff --git a/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java b/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java index c92d9746f0..56518cd4c9 100644 --- a/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java +++ b/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java @@ -156,7 +156,7 @@ public void setHeader(final SAMFileHeader header) } } else if (!sortOrder.equals(SAMFileHeader.SortOrder.unsorted)) { alignmentSorter = SortingCollection.newInstance(SAMRecord.class, - new BAMRecordCodec(header), makeComparator(), maxRecordsInRam, tmpDir); + new BAMRecordCodec(header), sortOrder.getComparatorInstance(), maxRecordsInRam, tmpDir); } } @@ -165,20 +165,6 @@ 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. * diff --git a/src/main/java/htsjdk/samtools/SAMSortOrderChecker.java b/src/main/java/htsjdk/samtools/SAMSortOrderChecker.java index b6b7dd44e1..3483bd981b 100644 --- a/src/main/java/htsjdk/samtools/SAMSortOrderChecker.java +++ b/src/main/java/htsjdk/samtools/SAMSortOrderChecker.java @@ -34,21 +34,7 @@ public class SAMSortOrderChecker { 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; - } + this.comparator = sortOrder == null ? null : sortOrder.getComparatorInstance(); } /** @@ -71,19 +57,22 @@ public SAMRecord getPreviousRecord() { return prev; } + public SAMFileHeader.SortOrder getSortOrder() { + return sortOrder; + } + /** * Return the sort key used for the given sort order. Useful in error messages. + * This should only be used in error messages and program correctness should not rely on this. */ 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; + return rec.getSAMString().trim(); } } } diff --git a/src/main/java/htsjdk/samtools/SamReader.java b/src/main/java/htsjdk/samtools/SamReader.java index e0c147b934..f7062886f3 100644 --- a/src/main/java/htsjdk/samtools/SamReader.java +++ b/src/main/java/htsjdk/samtools/SamReader.java @@ -552,8 +552,7 @@ static AssertingIterator of(final CloseableIterator iterator) { } private final CloseableIterator wrappedIterator; - private SAMRecord previous = null; - private SAMRecordComparator comparator = null; + private SAMSortOrderChecker checker; public AssertingIterator(final CloseableIterator iterator) { wrappedIterator = iterator; @@ -561,35 +560,21 @@ public AssertingIterator(final CloseableIterator iterator) { @Override public SAMRecordIterator assertSorted(final SAMFileHeader.SortOrder sortOrder) { - - if (sortOrder == null || sortOrder == SAMFileHeader.SortOrder.unsorted) { - comparator = null; - return this; - } - - comparator = sortOrder.getComparatorInstance(); + checker = new SAMSortOrderChecker(sortOrder); return this; } @Override 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()) - ); - } + if (checker != null) { + final SAMRecord previous = checker.getPreviousRecord(); + if (!checker.isSorted(result)) { + throw new IllegalStateException(String.format( + "Record %s should come after %s when sorting with %s ordering.", + previous.getSAMString().trim(), + result.getSAMString().trim(), checker.getSortOrder())); } - previous = result; } return result; } diff --git a/src/test/java/htsjdk/samtools/SamReaderTest.java b/src/test/java/htsjdk/samtools/SamReaderTest.java index 4d4d056343..a2dc9d469c 100644 --- a/src/test/java/htsjdk/samtools/SamReaderTest.java +++ b/src/test/java/htsjdk/samtools/SamReaderTest.java @@ -25,23 +25,29 @@ import htsjdk.HtsjdkTest; import htsjdk.samtools.util.CloseableIterator; -import htsjdk.samtools.util.CloserUtil; +import htsjdk.samtools.util.PeekableIterator; 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.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; public class SamReaderTest extends HtsjdkTest { private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools"); @Test(dataProvider = "variousFormatReaderTestCases") - public void variousFormatReaderTest(final String inputFile) { + 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 rec : reader) { + try(final SamReader reader = SamReaderFactory.makeDefault().open(input)) { + for (final SAMRecord rec : reader) { + //just scan through the lines + } } - CloserUtil.close(reader); } @DataProvider(name = "variousFormatReaderTestCases") @@ -58,18 +64,18 @@ public Object[][] variousFormatReaderTestCases() { // tests for CRAM indexing @Test(dataProvider = "SmallCRAMTest") - public void CRAMIndexTest(final String inputFile, final String referenceFile, QueryInterval queryInterval, String expectedReadName) { + public void CRAMIndexTest(final String inputFile, final String referenceFile, QueryInterval queryInterval, String expectedReadName) throws IOException { 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()); + try(final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(input)) { + Assert.assertTrue(reader.hasIndex()); - final CloseableIterator iterator = reader.query(new QueryInterval[]{queryInterval}, false); - Assert.assertTrue(iterator.hasNext()); - SAMRecord r1 = iterator.next(); - Assert.assertEquals(r1.getReadName(), expectedReadName); + final CloseableIterator 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") @@ -83,12 +89,12 @@ public Object[][] CRAMIndexTestData() { } @Test(dataProvider = "NoIndexCRAMTest") - public void CRAMNoIndexTest(final String inputFile, final String referenceFile) { + public void CRAMNoIndexTest(final String inputFile, final String referenceFile) throws IOException { 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); + try(final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(input)) { + Assert.assertFalse(reader.hasIndex()); + } } @DataProvider(name = "NoIndexCRAMTest") @@ -113,34 +119,38 @@ public SAMRecord createSAMRecord(final SAMFileHeader header) { @Override 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); + 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) { + public void samRecordFactoryTest(final String inputFile) throws IOException { 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; + try(final SamReader reader = SamReaderFactory.makeDefault().samRecordFactory(factory).open(input)){ + 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); + 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) { + @Test(dataProvider = "cramTestCases", expectedExceptions = IllegalStateException.class) + public void testReferenceRequiredForCRAM(final String inputFile, final String ignoredReferenceFile) throws IOException { final File input = new File(TEST_DATA_DIR, inputFile); - final SamReader reader = SamReaderFactory.makeDefault().open(input); - for (final SAMRecord rec : reader) { + try(final SamReader reader = SamReaderFactory.makeDefault().open(input)) { + for (final SAMRecord rec : reader) { + } } - CloserUtil.close(reader); } @DataProvider(name = "cramTestCases") @@ -153,13 +163,13 @@ public Object[][] cramTestPositiveCases() { } @Test(dataProvider = "cramTestCases") - public void testIterateCRAMWithIndex(final String inputFile, final String referenceFile) { + public void testIterateCRAMWithIndex(final String inputFile, final String referenceFile) throws IOException { 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) { + try(final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(input)) { + for (final SAMRecord rec : reader) { + } } - CloserUtil.close(reader); } @Test @@ -169,4 +179,63 @@ public void samRecordFactoryNullHeaderTest() { Assert.assertTrue(samRec.getHeader() == null); } + @Test + public void testAssertingIteratorUsesLenientOrdering() { + // The coordinate comparator's strict sort sorts lower mapping qualities first, + // so this list is not sorted with respect to that comparator, but it is sorted with respect to the more lenient + // file order comparator which only checks the position. + final List looselySorted = Arrays.asList(createRecord(1, 10), + createRecord(1, 1), + createRecord(2, 1)); + + final SAMRecordCoordinateComparator coordinateComparator = new SAMRecordCoordinateComparator(); + + //sanity check that this really sorts differently with the file order comparator vs the full ordering coordinate order comparator + final List sortedWithFileOrderComparator = looselySorted.stream() + .sorted(coordinateComparator::fileOrderCompare) + .collect(Collectors.toList()); + Assert.assertEquals(sortedWithFileOrderComparator, looselySorted); + + final List sortedWithFullOrderComparator = looselySorted.stream() + .sorted(coordinateComparator) + .collect(Collectors.toList()); + + Assert.assertNotEquals(sortedWithFullOrderComparator, looselySorted); + + final SamReader.AssertingIterator iter = new SamReader.AssertingIterator(new PeekableIterator<>(looselySorted.iterator())); + iter.assertSorted(SAMFileHeader.SortOrder.coordinate); + int count = 0; + + while (iter.hasNext()) { + iter.next(); + count++; + } + Assert.assertEquals(count, 3); + } + + @Test(expectedExceptions = IllegalStateException.class) + public void testAssertingIteratorCorrectlyFailsWhenOutOfOrder() { + final List unsorted = Arrays.asList(createRecord(10, 1), createRecord(1, 1)); + final SamReader.AssertingIterator iter = new SamReader.AssertingIterator(new PeekableIterator<>(unsorted.iterator())); + iter.assertSorted(SAMFileHeader.SortOrder.coordinate); + + while (iter.hasNext()) { + iter.next(); + } + } + + private static SAMRecord createRecord(int start, int mappingQuality) { + final SAMRecord rec = new SAMRecord(getHeader()); + rec.setReadName("read"); + rec.setReferenceName("1"); + rec.setAlignmentStart(start); + rec.setMappingQuality(mappingQuality); + return rec; + } + + private static SAMFileHeader getHeader() { + final SAMFileHeader header = new SAMFileHeader(); + header.addSequence(new SAMSequenceRecord("1", 1000)); + return header; + } } From 49c70e5b394d303b47bd894d430f78f08aefc268 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Wed, 26 Sep 2018 10:39:35 -0400 Subject: [PATCH 72/83] fixing bug in SeekableHttpStream.read (#1182) * fixing bug in SeekableHttpStream.read * a bug in SeekableHttpStream could cause clients to go into an infinite loop because read would return 0 when trying to read one byte past the end of the file * fixes #1181 --- .../seekablestream/SeekableHTTPStream.java | 5 ++++- .../seekablestream/SeekableBufferedStreamTest.java | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableHTTPStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableHTTPStream.java index 640a14d989..a846fe4512 100644 --- a/src/main/java/htsjdk/samtools/seekablestream/SeekableHTTPStream.java +++ b/src/main/java/htsjdk/samtools/seekablestream/SeekableHTTPStream.java @@ -100,9 +100,12 @@ 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) { + if (len == 0 ) { return 0; } + if (position == contentLength) { + return -1; + } HttpURLConnection connection = null; InputStream is = null; diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java index f6e0b69899..4e498828db 100644 --- a/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java +++ b/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java @@ -69,6 +69,20 @@ public void testRandomRead() throws IOException { assertEquals(buffer1, buffer2); } + @Test + public void testReadExactlyOneByteAtEndOfFile() throws IOException { + try (final SeekableStream stream = new SeekableHTTPStream(new URL(BAM_URL_STRING))){ + byte[] buff = new byte[1]; + long length = stream.length(); + stream.seek(length - 1); + Assert.assertFalse(stream.eof()); + Assert.assertEquals(stream.read(buff), 1); + Assert.assertTrue(stream.eof()); + Assert.assertEquals(stream.read(buff), -1); + } + } + + /** * 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. From a7214cac11d7e8dadbe4d5b7dd1e208661e3592e Mon Sep 17 00:00:00 2001 From: Nils Homer Date: Fri, 5 Oct 2018 12:45:12 -0400 Subject: [PATCH 73/83] Add a reset() method to ProgressLoggerInterface. (#1184) * Add a reset() method to ProgressLoggerInterface * The default implementation of reset() is a no-op. --- .../samtools/util/AbstractProgressLogger.java | 22 ++++++++++++++----- .../util/ProgressLoggerInterface.java | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/htsjdk/samtools/util/AbstractProgressLogger.java b/src/main/java/htsjdk/samtools/util/AbstractProgressLogger.java index 4499c211aa..0b7dd7275f 100644 --- a/src/main/java/htsjdk/samtools/util/AbstractProgressLogger.java +++ b/src/main/java/htsjdk/samtools/util/AbstractProgressLogger.java @@ -15,14 +15,13 @@ 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 long startTime; 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; - private String lastChrom = null; - private int lastPos = 0; + private long processed; + private long lastStartTime; + private String lastChrom; + private int lastPos; /** * Construct an AbstractProgressLogger. @@ -37,6 +36,7 @@ protected AbstractProgressLogger(final String noun, final String verb, final int this.noun = noun; this.verb = verb; this.n = n; + reset(); } /** @@ -124,6 +124,16 @@ public boolean record(final SAMRecord... recs) { /** Returns the number of seconds since progress tracking began. */ public long getElapsedSeconds() { return (System.currentTimeMillis() - this.startTime) / 1000; } + /** Resets the start time to now and the number of records to zero. */ + public void reset() { + startTime = System.currentTimeMillis(); + processed = 0; + // Set to -1 until the first record is added + lastStartTime = -1; + lastChrom = null; + lastPos = 0; + } + /** Left pads a string until it is at least the given length. */ private String pad (String in, final int length) { while (in.length() < length) { diff --git a/src/main/java/htsjdk/samtools/util/ProgressLoggerInterface.java b/src/main/java/htsjdk/samtools/util/ProgressLoggerInterface.java index a3ef7bcf8c..becc802813 100644 --- a/src/main/java/htsjdk/samtools/util/ProgressLoggerInterface.java +++ b/src/main/java/htsjdk/samtools/util/ProgressLoggerInterface.java @@ -34,5 +34,5 @@ public interface ProgressLoggerInterface { boolean record(final String chrom, final int pos); boolean record(final SAMRecord rec); boolean record(final SAMRecord... recs); - + default void reset() {}; } From ff3db931524c44c595aaa8844304146c0de0d34a Mon Sep 17 00:00:00 2001 From: Nils Homer Date: Fri, 5 Oct 2018 14:35:19 -0400 Subject: [PATCH 74/83] Bug fix: BinaryCodec should not fail when both reading and no bytes are requested. (#1188) Bug fix: BinaryCodec should not fail when both reading and no bytes are requested. BinaryCodec.readBytesOrFewer will fail if the input stream is a ByteArrayInputStream, the buffer has no more bytes, and the # of bytes to read is zero. --- .../java/htsjdk/samtools/util/BinaryCodec.java | 5 ++++- .../htsjdk/samtools/util/BinaryCodecTest.java | 15 ++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/htsjdk/samtools/util/BinaryCodec.java b/src/main/java/htsjdk/samtools/util/BinaryCodec.java index 08fe60a123..51e23fed09 100644 --- a/src/main/java/htsjdk/samtools/util/BinaryCodec.java +++ b/src/main/java/htsjdk/samtools/util/BinaryCodec.java @@ -415,7 +415,10 @@ public int readBytesOrFewer(final byte[] buffer, final int offset, final int len throw new IllegalStateException("Calling read method on BinaryCodec open for write."); } try { - return inputStream.read(buffer, offset, length); + // Some implementations of InputStream do not behave well when the buffer is empty and length is zero, for + // example ByteArrayInputStream, so we must check for length equal to zero. + // See: https://bugs.java.com/view_bug.do?bug_id=6766844 + return (length == 0) ? 0 : inputStream.read(buffer, offset, length); } catch (IOException e) { throw new RuntimeIOException(constructErrorMessage("Read error"), e); } diff --git a/src/test/java/htsjdk/samtools/util/BinaryCodecTest.java b/src/test/java/htsjdk/samtools/util/BinaryCodecTest.java index a47bb22e43..1774289d06 100644 --- a/src/test/java/htsjdk/samtools/util/BinaryCodecTest.java +++ b/src/test/java/htsjdk/samtools/util/BinaryCodecTest.java @@ -27,12 +27,7 @@ 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; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; /* @@ -284,5 +279,11 @@ public void timeTest() throws IOException{ readCodec.close(); } - + @Test + public void testReadBytesOrFewerNoneAvailable() { + final byte[] value = new byte[0]; + final ByteArrayInputStream instream = new ByteArrayInputStream(value); + final BinaryCodec readCodec = new BinaryCodec(instream); + Assert.assertEquals(readCodec.readBytesOrFewer(value, 0, 0), 0); + } } From 23f322335662ef55bb211d9a4d5cec75ac3e95b8 Mon Sep 17 00:00:00 2001 From: jmthibault79 Date: Fri, 5 Oct 2018 16:10:44 -0400 Subject: [PATCH 75/83] Add 6 CRAM compliance tests from htslib (#1185) --- .../htsjdk/samtools/CRAMComplianceTest.java | 10 +- .../htsjdk/samtools/cram/c2#pad.2.1.cram | Bin 11077 -> 11251 bytes .../htsjdk/samtools/cram/c2#pad.3.0.cram | Bin 1070 -> 1257 bytes .../resources/htsjdk/samtools/cram/c2#pad.sam | 26 + src/test/resources/htsjdk/samtools/cram/c2.fa | 2 + .../resources/htsjdk/samtools/cram/c2.fa.fai | 1 + .../htsjdk/samtools/cram/ce#1000.2.1.cram | Bin 0 -> 40569 bytes .../htsjdk/samtools/cram/ce#1000.3.0.cram | Bin 0 -> 30395 bytes .../htsjdk/samtools/cram/ce#1000.sam | 1005 +++++++++++++++++ .../htsjdk/samtools/cram/md#1.2.1.cram | Bin 0 -> 11198 bytes .../htsjdk/samtools/cram/md#1.3.0.cram | Bin 0 -> 1390 bytes .../resources/htsjdk/samtools/cram/md#1.sam | 12 + src/test/resources/htsjdk/samtools/cram/md.fa | 3 + .../resources/htsjdk/samtools/cram/md.fa.fai | 1 + .../htsjdk/samtools/cram/xx#repeated.2.1.cram | Bin 0 -> 10532 bytes .../htsjdk/samtools/cram/xx#repeated.3.0.cram | Bin 0 -> 683 bytes .../htsjdk/samtools/cram/xx#repeated.sam | 7 + .../htsjdk/samtools/cram/xx#tlen.2.1.cram | Bin 11312 -> 11561 bytes .../htsjdk/samtools/cram/xx#tlen.3.0.cram | Bin 1296 -> 1535 bytes .../htsjdk/samtools/cram/xx#tlen.sam | 34 + .../htsjdk/samtools/cram/xx#tlen2.2.1.cram | Bin 11380 -> 11629 bytes .../htsjdk/samtools/cram/xx#tlen2.3.0.cram | Bin 1359 -> 1601 bytes .../htsjdk/samtools/cram/xx#tlen2.sam | 36 + 23 files changed, 1135 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/htsjdk/samtools/cram/c2#pad.sam create mode 100644 src/test/resources/htsjdk/samtools/cram/c2.fa create mode 100644 src/test/resources/htsjdk/samtools/cram/c2.fa.fai create mode 100644 src/test/resources/htsjdk/samtools/cram/ce#1000.2.1.cram create mode 100644 src/test/resources/htsjdk/samtools/cram/ce#1000.3.0.cram create mode 100644 src/test/resources/htsjdk/samtools/cram/ce#1000.sam create mode 100644 src/test/resources/htsjdk/samtools/cram/md#1.2.1.cram create mode 100644 src/test/resources/htsjdk/samtools/cram/md#1.3.0.cram create mode 100644 src/test/resources/htsjdk/samtools/cram/md#1.sam create mode 100644 src/test/resources/htsjdk/samtools/cram/md.fa create mode 100644 src/test/resources/htsjdk/samtools/cram/md.fa.fai create mode 100644 src/test/resources/htsjdk/samtools/cram/xx#repeated.2.1.cram create mode 100644 src/test/resources/htsjdk/samtools/cram/xx#repeated.3.0.cram create mode 100644 src/test/resources/htsjdk/samtools/cram/xx#repeated.sam create mode 100644 src/test/resources/htsjdk/samtools/cram/xx#tlen.sam create mode 100644 src/test/resources/htsjdk/samtools/cram/xx#tlen2.sam diff --git a/src/test/java/htsjdk/samtools/CRAMComplianceTest.java b/src/test/java/htsjdk/samtools/CRAMComplianceTest.java index ff9bdc0e76..308234ac32 100644 --- a/src/test/java/htsjdk/samtools/CRAMComplianceTest.java +++ b/src/test/java/htsjdk/samtools/CRAMComplianceTest.java @@ -41,14 +41,19 @@ public Object[][] getPartialVerificationData() { {"c1#noseq"}, // unsigned attributes: https://github.com/samtools/htsjdk/issues/499 {"c1#unknown"}, // unsigned attributes: https://github.com/samtools/htsjdk/issues/499 {"ce#5b"}, // reads with no read bases: https://github.com/samtools/htsjdk/issues/509 + {"ce#1000"}, // SAMRecord mismatch: https://github.com/samtools/htsjdk/issues/1189 {"ce#tag_depadded"},// reads with no read bases: https://github.com/samtools/htsjdk/issues/509 {"ce#tag_padded"}, // reads with no read bases: https://github.com/samtools/htsjdk/issues/509 {"ce#unmap"}, // unmapped reads with non-zero MAPQ value that is not restored // https://github.com/samtools/htsjdk/issues/714 - {"xx#triplet"}, // the version 2.1 variant of this file has a bad insertSize, which is - // probably residual detritus from https://github.com/samtools/htsjdk/issues/364 {"xx#minimal"}, // cigar string "5H0M5H" is restored as "10H" // https://github.com/samtools/htsjdk/issues/713 + {"xx#repeated"}, // SAMRecord mismatch: https://github.com/samtools/htsjdk/issues/1189 + {"xx#tlen"}, // SAMRecord mismatch: https://github.com/samtools/htsjdk/issues/1189 + {"xx#tlen2"}, // SAMRecord mismatch: https://github.com/samtools/htsjdk/issues/1189 + {"xx#triplet"}, // the version 2.1 variant of this file has a bad insertSize, which is + // probably residual detritus from https://github.com/samtools/htsjdk/issues/364 + //{"md#1"}, // fails with "offensive record" errors: https://github.com/samtools/htsjdk/issues/1187 }; } @@ -67,6 +72,7 @@ public Object[][] getFullVerificationData() { {"c1#pad1"}, {"c1#pad2"}, {"c1#pad3"}, + {"c2#pad"}, {"ce#1"}, {"ce#2"}, {"ce#5"}, 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 index 12ce718fd26863dd68a2b41fc368fd9f8edf3edf..00c103b42a7c78055b394561be290bcf30a0fb85 100644 GIT binary patch delta 572 zcmX>a_Bq_ZImpqMi80woxgaq`&q&WuFS#f&mjMLqHNg~+U}OZbR$8pIP+^*AVCfiI zoLW?@Uy_lTlvtWmqF-E;te;U*oRyLdW|pKDm*^Lz7U!21C8rj{WfF5s^7C_w^+D!u zY~G{ckjMlwnv;{kn}@OC2m>QS!`_CyLM$OJj10lP(jXAz$LJWq*sx68$&HzX5val$ zL^Cro1o<#BN>1+4bdqIclyY-sWR!LbU}ThW3T9-K_w-|BV&HWFs*s&5rDbNVstUG* zi<6s&S5it^Mpphm5b&Q_J8|~^tj4AVXFe2q=`1I#_(gkNTvu-mXSqLmJ_CyMfh<_YVzX;&mKKuVlXk1cjpAF zkV00GoRs)H<#|eKIxEB4ysHrq71E~W2s2m@Dl#${@UR#byPsl9e)v~9qG{3AjP=`J z?5aOux$#(Be#~>`=C}Vj%)y4s7@%lvJ@}GU>g{3M=oee62oij}$g(LcG zZKj>$tgP&uOf0NSAVD{0 zAV0z-(=&jTk%^gw#Vr8HX8hA`! Q9~hjB3~X$maAITt0N({=r~m)} 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 index e069a6b5f84603f961241b6a8c49134c27bb68c3..541e1e00ac19fd959f213b245564b6a161d92187 100644 GIT binary patch delta 942 zcmZ3-@shLNImpqMnIYLoxgaq`&sfhuFS#f&mjMJ`GJ+`}!NkPSXkQhtPy!TbG-=Y1 z@8*C=3D=(6>vz~dg!Mt!*~%_!1Id+nPF%jrLge;1Fq_me950k|4vOB__u!-CuloxR zUzN3!o%{KR!Az0Y{+r^SYANQgwy9Ts|2anUW=dh$_P5JbqoA5&PHB+6rJNjt+?%|3P3gBd5cs}LQ(@B@I{%brBJm~$Y#gKtvecleM!rBxs zP20c9>IG?qJG{%vfBrPmU9sb7vAK8?_rdiRdn5ETmOiSgeD&^A&3v);OMh7cKfaI; z^ZousgNcE`u;;KXFxVRAH_V3xECa*jY{u@%1&mxCIYzVeW&>3*FmiG-c=IqeTr&81 zdm{rQL&Ncg<3cPUE{qJpzS1BN9ha&$jHKNAdg4_lV>oi)t8+; zBg@FbBk2tjXAw4TZ~QO9%K zpqjsF6^|HMBxN~aYFLCHr=%u7e(>zkBPIqDBYAgV%rMA%n^`cjNFl4LPfkjFp7J~; zHJz1VZQj)gkh0~48)q=GNSm4?3}Zd0$jD&8!(v$Meu^#m;a};9rbSyb)^C5Y>xAXT zV{!R0&zYOw{^u|U>fR>iah#Dw#sEckBQFC3PqV_-lmF~1FDzA2>TFOE?3`&5DI6cs zXKOR%uj4ZNB0tkDPlai8BpooPjjG_J2=W_x;rH{|L&SGSdmk~u$>cqh2 Z#-;|$U*}UjghYXgTFR`CPv&4z0{{sKF_i!S delta 722 zcmaFKxsHR~ImpqMnL&4QBcpKrSw;pZU}9ou)QNOe{{$3iRBU3D@8*EWFxQ^jpLfVW zfUUsF%D?b)=phwe-IF3u4tjgvnq+t2Xko`v3HKXYYJYmk{t%at@H7AOy+^~v-49IsdaDOl{-IEP+w@4=GAj?kERH@uB<vYrq%Z^3F z&DMS2^xpSu^S8#;DYt?`Iwsvb_@&Ce;h(DY7pYrwH(zKq_%Y{mFX!ET^R&`;s!Pv# z{r6?h$GY{l^V0(ry}l(ov0pJ!li0pg?%qnqRI@G2<}YMfA8)hMayjXs%D~{H@TjOW zLRO4RP;^mBza1Ncz*XLGkMwo^JslPI)cqbD`eczT_wLhW3*EqbpPp`?5agk`&O+97 zdWXjP*~<^d&Xd3N>BpA<$1tT|>`w1xcQP_DFz|Mj%LBuxVOqm9U|>$1Jb{rl)G1Hz z`X5lBGIDY?fS%@XXg^?lHR~iI@{1_br7#rS5IJq&iFalLL zgJ@<(h9DniJ~lQkRt`>XHYO%!AebD*c2 +CCAATAACC diff --git a/src/test/resources/htsjdk/samtools/cram/c2.fa.fai b/src/test/resources/htsjdk/samtools/cram/c2.fa.fai new file mode 100644 index 0000000000..f95d35d9da --- /dev/null +++ b/src/test/resources/htsjdk/samtools/cram/c2.fa.fai @@ -0,0 +1 @@ +c2 9 4 9 10 diff --git a/src/test/resources/htsjdk/samtools/cram/ce#1000.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#1000.2.1.cram new file mode 100644 index 0000000000000000000000000000000000000000..2f51131a271727bcc4acc9479aa48c17560a850a GIT binary patch literal 40569 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 UMfQ6K0r4MRQ4qkTA&BJv1;eYO@c;k- literal 0 HcmV?d00001 diff --git a/src/test/resources/htsjdk/samtools/cram/ce#1000.sam b/src/test/resources/htsjdk/samtools/cram/ce#1000.sam new file mode 100644 index 0000000000..857a9cd8eb --- /dev/null +++ b/src/test/resources/htsjdk/samtools/cram/ce#1000.sam @@ -0,0 +1,1005 @@ +@SQ SN:CHROMOSOME_I LN:1009800 +@SQ SN:CHROMOSOME_II LN:5000 +@SQ SN:CHROMOSOME_III LN:5000 +@SQ SN:CHROMOSOME_IV LN:5000 +@SQ SN:CHROMOSOME_V LN:5000 +SRR065390.14978392 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC@CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-18 XS:i:-18 XN:i:0 XM:i:5 XO:i:1 XG:i:1 YT:Z:UU MD:Z:4A0G5G5G5G3^A73 NM:i:6 +SRR065390.921023 16 CHROMOSOME_I 3 12 100M * 0 0 CTAAGCCTAAATCTAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############################################???88:;98768700000<>:BBA?BBAB?BBBBBBBB>B>BB::;?:00000 AS:i:-6 XS:i:-13 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:10G0C10G77 NM:i:3 +SRR065390.1871511 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA 0:BB@>B<=B@???@=8@B>BB@CA@DACDCBBCCCA@CCCCACCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3743423 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##################?6@:7<=@3=@ABAAB>BDBBABADABDDDBDDBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4251890 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###########@BB=BCBBC?B>B;>B@@ADBBB@DBBBBDCCBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5238868 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA @,=@@D8D;?BBB>;?BBB==BB@D;>D>BBB>BBDDBA@@BCCB@=BACBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8289592 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############################A?@C9@@BC=AABDD@A@DC@CB=@BA?6@CCAAC@+CCCCCCCCCCCCCCC@CCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14497557 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ######@:@@.>=><;;B>AB>>BB?B=>B=BD>BDADDD>CCDDDBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15617929 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA D?;;D>?C>CBAAACD@BB?B>BBDB>@BBDDBDC@CBDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16049575 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #######################@??BB8BBB@@:AB@BDBCCDCBDCCCCACCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17838261 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #################@>=?B@DCBDB>@D>DBADCDDD>CC@DCCCCBCCACCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22711273 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################B<@=<:6/0307==72@@=?788==;AAA:@CCAACCC?CCAACCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22922978 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##########################B=B>A@BBBC??=@=A@AC<><<8>C6CCCCC8CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23087186 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ############@:73???@6;D?B>:>BBA?B<>B@B>@B>@>BCDCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23506653 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############A/=A5::87@:=>6@AA>@CDBA@ABCB?BC>CD>DDBDC@CCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23791575 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCCCACCCCAACCCTTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##############################B4;:=B@>A@BCB@@ABCCBB@BCC@CCDCCDCCDCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-12 XS:i:-12 XN:i:0 XM:i:6 XO:i:0 XG:i:0 YT:Z:UU MD:Z:7T0A1G2T2G3A79 NM:i:6 +SRR065390.25911768 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##############@8B@B?9=:A?=@DDB>;B6?DDBCABABB@DDCCBDBDCCDACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26055380 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #################################DAA><0=>=B;?BACDBDABCBBC@CACACACACCACCCCCCCCCCCCCCCCCCCCCCBCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26121674 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #################?:AA::@DAAA>B??@A4@=BBBBDDBDBDCCBDDBCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30352568 16 CHROMOSOME_I 3 7 100M * 0 0 CTAGGGCTAACCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #################################################################A>>5A?CCC@CCCCCCCCCC?CC:C@A@==@A@A@ AS:i:-10 XS:i:-19 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:3A1C4G3A37G47 NM:i:5 +SRR065390.31341126 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ########################?AD?D@BCAABBBD@=DBCDBAACCDCAABCDCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.33653624 16 CHROMOSOME_I 3 17 100M * 0 0 CTAATCCTAGGCCTAAGCCCAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ####################################??8?000-+0000,@ABBBB@B:B@B>BB????>>>@@?::?6?>>;>>@ACCCCBCCBACCCC AS:i:-6 XS:i:-19 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:4G4A9T80 NM:i:3 +SRR065390.28043279 16 CHROMOSOME_I 4 0 9M1I90M * 0 0 TCTTCCGATCTCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #####A>=7A6DD=@AA?>AAABC@CAABDBCBBABDADBADCABBBDCDCDCACDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCC AS:i:-26 XS:i:-26 XN:i:0 XM:i:6 XO:i:1 XG:i:1 YT:Z:UU MD:Z:1A0A0G2T1A0G89 NM:i:7 +SRR065390.29270443 16 CHROMOSOME_I 6 1 100M * 0 0 AGCCTAAGCCGAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC ###################################@:88@@>B>C>CCCCA@CCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:10T2G86 NM:i:2 +SRR065390.1364843 16 CHROMOSOME_I 11 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ####################@=A=8@:>@;@@=>>B8?C6CCCCCCCCCCACCCCBBCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10190875 16 CHROMOSOME_I 11 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ##################@@@@@@;>BBB?>A6BAB?BB=BAB@?:A.<===@7:4::>8D@BABBACCCCAB@CCCDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13556211 0 CHROMOSOME_I 11 0 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGATTGGAAGAGCGGCTAAGCAGGAACGCCGGGCTCGATCTCAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCBCDCCB>BBBBB########################################### AS:i:-50 XS:i:-50 XN:i:0 XM:i:25 XO:i:0 XG:i:0 YT:Z:UU MD:Z:57C0C1A0A0G0C0C0T0A0A1C6C0T0A1G1C0T0A0A1C2A0A0G0C2A3 NM:i:25 +SRR065390.20524775 16 CHROMOSOME_I 11 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ############################?9<8B=?@C8A<@?@C8CBDCCC=CCCCC??@CCDCCCCCCCCCCCCCCCCCCCCDCCCCCCCDCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20580336 16 CHROMOSOME_I 11 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ############################?:>@?@=>@=0<:CB>@B=DCADB@CCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22573273 16 CHROMOSOME_I 11 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ##################################A9;?@CBBDBA>BB;ABDB>AAA;=>=0943@########### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20870114 0 CHROMOSOME_I 12 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCABCCCC=BBBCA@B>B?D;B=>9?############################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3863623 16 CHROMOSOME_I 12 1 100M * 0 0 CGCCTACGCCTACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC ##############################?@BB>B@BCABBB?DC@DADC@DCDCACDCBCCCCCCCCCCC@CCCCCCCCCCCCCCC1CCCCCCCCCCC AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0A5A5A87 NM:i:3 +SRR065390.1659845 0 CHROMOSOME_I 13 0 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAACCTAAGCCTAAGCCCAACCCTAAGACCGAGACCGAGACC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCAB@CCC######################################### AS:i:-22 XS:i:-22 XN:i:0 XM:i:11 XO:i:0 XG:i:0 YT:Z:UU MD:Z:60G14T2G6C1T0A2C1T0A2C1T0 NM:i:11 +SRR065390.1567418 16 CHROMOSOME_I 15 1 100M * 0 0 CACAGCCTACGTCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #########################################?:8A@<@>>BBB8>BBB@BBBB>@:??::87688:?:::?@<@@97866@?>@@;;>:< AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T0A6A1C88 NM:i:4 +SRR065390.4996386 16 CHROMOSOME_I 15 17 100M * 0 0 CCAAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###################################@@@@A=BB@C>>DCCACCCCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-22 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T5T92 NM:i:2 +SRR065390.14822977 16 CHROMOSOME_I 15 1 100M * 0 0 CGAAGCCAGAGCCTAGGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ####################################B:B?:==2>6@B@@C>?>A@CB5@??@28C@CCCBC@CC?CC?A@CC:CBCCCCCCCCCCCCCC AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T5T0A6A84 NM:i:4 +SRR065390.15148736 16 CHROMOSOME_I 15 17 100M * 0 0 CTGAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###########################CCBC<=C;9??<;==C@BCCCCC=CCCCACACACCBBCCCCCCCCCCCCCCCCCBCCCCCCCCCCCBCA?CCC AS:i:-4 XS:i:-21 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2A4T92 NM:i:2 +SRR065390.18089757 16 CHROMOSOME_I 15 1 100M * 0 0 CTGAGCCTGAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ########################A212.0:?.>8?BB?B<@@C?CCBCB;DCCCACDCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2A5A91 NM:i:2 +SRR065390.25601994 16 CHROMOSOME_I 15 17 100M * 0 0 ATAAGCCTAATCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #####################???DD?BD?BDBB>ACBDBDDBDDDBDBDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-21 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0C9G89 NM:i:2 +SRR065390.29400981 16 CHROMOSOME_I 15 17 100M * 0 0 CGAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############################A<:?C>>BCABABC?AD>BDADDDBDBBDBDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-18 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T2G95 NM:i:2 +SRR065390.1056430 0 CHROMOSOME_I 17 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGC CCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCDCCDCCC:@<:<@=:>>DD6?################ AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:96A3 NM:i:1 +SRR065390.32986719 0 CHROMOSOME_I 17 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACCCTAAGC CCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCC>C@@C@@A?8?@==0><:??@C?7:@B############################# AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92G7 NM:i:1 +SRR065390.25620225 16 CHROMOSOME_I 17 1 100M * 0 0 AAGCCGAAGCCGAAGCCTAAGCCGAAGCGTGAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #########################################?1?<8@=CC@>CC?CCCCCACCCCC@@ACCCCCCBCCCCCAACCCCACCCCCCBACACC AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:5T5T11T4C1A69 NM:i:5 +SRR065390.1843941 0 CHROMOSOME_I 18 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCBDCDDBADDDDD@DADDAABABBB>BBA?>>B;>@8=@@:@83@>AAA:A6?<4= AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.1866654 0 CHROMOSOME_I 18 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCDCDDCDCCDDB6:?@B=;@@=@@:A=B@??A=@<41@##### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.2940592 0 CHROMOSOME_I 18 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCBC@@=CB?B=?A@@DD>DB=?>B7@8@@?BABABB@3>D9=?(@==A=A##### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3916542 0 CHROMOSOME_I 18 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCBDDCDD@DDDDBABDDDAA?BC@<:?@B?A????@?<@@<@;D@?@9 AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9532073 0 CHROMOSOME_I 18 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CACBCCCCCCCCCCCCBCCBCCCCCCCCCCC@C=CCCCCCC@CCCCCCC@C=?CCA=CCBACCAB?@BABCB=@B8BA=A::;8;BB>8>=??####### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22616746 0 CHROMOSOME_I 18 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCAC@CCCCCA@CCAA<::>BB?@88@@########################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26956496 0 CHROMOSOME_I 18 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CACCCCCCCCCCCCCCCCCACCCCC@CCCCCCACCC@DADBC@BACAAC@B<@@BAA@A>@>?B@################################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10808349 16 CHROMOSOME_I 18 0 18M1I81M * 0 0 TGCGCCAGCCCCAGCCCCGAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCGGCCTAATCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #################################################################?A??ACCCCCCBBACCCCCCCCCCBC@CCCCCCCC AS:i:-33 XS:i:-33 XN:i:0 XM:i:11 XO:i:1 XG:i:1 YT:Z:UU MD:Z:0A2C0T0A4T0A4T0A41A0A6G31 NM:i:12 +SRR065390.10873351 16 CHROMOSOME_I 18 0 100M * 0 0 AGCCTAAGCCCAAGCCTAAGCCTAAGCCTAAGCCCAGTCCCGAGCCTCCTCCTAAACCTCACCCCAAATCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC ######################################################################CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-30 XS:i:-30 XN:i:0 XM:i:15 XO:i:0 XG:i:0 YT:Z:UU MD:Z:10T23T1A0G2T0A5A0A0G5G3A1G2T2G0C31 NM:i:15 +SRR065390.15490530 16 CHROMOSOME_I 18 1 100M * 0 0 CGCCCCTCCCTACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC ###############A@A5ACAB?<0ACBB??CCBBA@?CCC?C@?CCAACCC@AACCACCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-12 XS:i:-12 XN:i:0 XM:i:6 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0A3T0A0A0G4A87 NM:i:6 +SRR065390.1909715 16 CHROMOSOME_I 19 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ############@B@:;0=:1@B5ACD@DDCC@@@DACCCDDC@CCCCCCCCCCCCBCCCCCCCCC@C@CCCCCCCCCCCBCCCACCCCCDCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7382123 16 CHROMOSOME_I 19 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ###############??6D?B?D>?B>?B>>?@BB;@BBB@??>AB@B@DCADABBCDBD?CCCACC@CCCCCBACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20593989 16 CHROMOSOME_I 19 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ####################@=698@?8:4>=BDBDDCCDBAACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.25363430 16 CHROMOSOME_I 19 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ########A663>BB>CBABBAAAA?A??;BCDBAADCDDBCDACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.32419676 16 CHROMOSOME_I 19 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ###############A1=@?A@6A?>BD6?AABBBBB@AD>BBDBD>CDCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22906057 0 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCAAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCA@CCC@ACB@C=CC;=BBBB>;AABA################################ AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:86T13 NM:i:1 +SRR065390.27521332 0 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTACACCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCATAAGCCTCAGCCTA BBBBBBBBBB**9+7BBBBBBBBBBBBBBBBBBBBBBB@BB@>BB;B@BAB;BB@BA>ABA>A4A################################### AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:10A0G73C7A6 NM:i:4 +SRR065390.30947354 0 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGACTC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCDCC@ADABCBBBBBAABB>BA>B?@@B################################### AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:90C5C2A0 NM:i:3 +SRR065390.31587235 0 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTGAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC'AAA@CCCAC@DCDC@;BABB@>@B?A@4;;8@??>:DBD?>:A AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:45A54 NM:i:1 +SRR065390.1370038 16 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #####@B>;DAB?B@=@@B=@BBB>B@@BDDB>DDDACBBCDDCCBC?CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4643729 16 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #########################BD6;@BB@BB?BDDBDDDCDBCDCCBBCBCCCCCDCCCCCCCCCCCCCCCCCACCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6133344 16 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ####################@?BB@999.4A;;;:C8C@@@A@>B;=;==CCCCCC@CCCBCCBBC?CCCCBACCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6927609 16 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ###########D?D@6@@@@3:>CCAABA>ABB>ABBB?>BB@@BDDBDCDA;BCCDCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7858967 0 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGTCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCC>CCCCCCCCCCCCDCCCCBC;CC:AB>A?<@'>ADBABB>CAABBB>>B@B;BBB;BA?7>989?D?@?########## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:48C51 NM:i:1 +SRR065390.8362231 16 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA 3AA3@AA==.>>>>=4@?@?;BBBAAA>@@AAB>DDAB@BDDBDBBBDCC@CCCDCB@CDACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9016128 16 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ################?B@?=<9=:@>=7?AA??=A=??:7B=;=A=C?CB8B>C?ACBCAAAAACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11434451 16 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ########A9<=?B@B@?:CC=:?DAA>A@BBA>B@B8BD=DBBBC@?DD<ABBBDBBBDDB@B<>DDBBCDCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20362361 16 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #######A1:6DBB?C;BBD=B@BDBABADDBCB@CBCBBACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28067938 16 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ###############@6=?@75595=7:=:;:A1@BA@@C@CACC6CAACC9CCCBC?@CCCCCCCCBBCCCCCCCCCCCBCCCCCCCCBCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28676889 16 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ######################D@D<>BBB86.5/B=7/7B<@@?ABA;BCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.31914072 16 CHROMOSOME_I 20 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #######################BCC>AADDADBABDCDDBCACCDCCCCCCAADBDCCCCACCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28534879 0 CHROMOSOME_I 21 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCATAAGCCTAAGTCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBDCCCDDDBB89BAAA@@?DB:@@9>====?########################### AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:81A2C10C4 NM:i:3 +SRR065390.2215027 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBDCCCCBC@BB@BCDDBDDBA@DDBBB8@BB>B?=B?>B?>CBAAA?9>>A>:6@= AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.2347049 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCBCCCDCCCDBDBADDD@AAD@BBDBBBCAA>@C??################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3130808 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCA@ACCCCC>AC@=CBCC@@BBBB=>BA.A=:?A@@@:>@####### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4139123 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCDDCBCCCCBACBBB;DADBD;?BDB>;BBAB=;DDBBB>??BB>ACACC?>.A@=>,@########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5087657 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCACCCC@CCCDCCCCC>B@CC@CB;@CBAB1B@=BBB@BA;A8??B:==B=@@?>><=6=6D@@>::9>9><=@@,@@@14;<@####### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10185722 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCD@BCDBBBDBDB@<@BBBB>DB>B@=BDBC>A;@@DD<4=@=<@6@###################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14268858 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCBCADCDBCABDDBB>BBBCBBAD?CA?>>BCBB?AD?BA?=99>8;8@;@ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14318056 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC=ADACBBABCBBD>AD=25867BB@BBBBA@;<>A=AAAA?A8?<>B78*=8=<>@###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16702871 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCDACCCCD@BCCCD?DDDCD?ABDDB;BBBB>?@?A@88B:@=2/99>A3.A##### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18871990 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBDCBCCBDBDCDDDDBC?;;B@BB>?D:>BBB@94@########################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23185275 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCC?DD@A@B@?BB>BB?>BD?########################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26311247 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC8CCDCDADB@;BB?@>:D>BB=>:DD>@=@>@?6?AA?AA############ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.31584477 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCDCBCCCDDDCDCDDDDCDDDDCDDB?DABBBCBBABBCCBA?AAA=?D?DAA:AAACA>AAAA?################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.33157605 0 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBC8?>??DBBBBA@?CBA=?=>BB@?@=<=?B@BAA@@:=>::8AAA>BBBB3:===8D?B<:DD<:?#################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5496550 16 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ##########@727;=>/7=<=B:=@@ACA?A8CB@B;A@CCB?BCCC@CCCCBCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17740346 16 CHROMOSOME_I 23 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ###############A;:>A7>=9=:.>==@A=BCCCBACCCCDBBB>B@BBB;A??BB;DAABD@DACCCBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16643153 0 CHROMOSOME_I 24 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCGTAAGCCTAAGCCTAAGGCTAAGGCTAAGGCTAAGCCTATGCTTAAGACTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC################################################################### AS:i:-14 XS:i:-14 XN:i:0 XM:i:7 XO:i:0 XG:i:0 YT:Z:UU MD:Z:45C16C5C5C9A2C4C7 NM:i:7 +SRR065390.1203526 16 CHROMOSOME_I 24 1 100M * 0 0 ACCCTAAAACAAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC ###############################A==B7277*@A?5AB9A@CCCDCDABA?:?A@ACCCCC?CC?CCCCCDCCCCCCCCCCCCCCCCCCCCA AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1G5G0C1T89 NM:i:4 +SRR065390.1571837 0 CHROMOSOME_I 26 0 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCGGAAGCCTAGGCCAGAGGCAAAGCCGAGGCCTAAGCCGA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCC>40?######################################### AS:i:-20 XS:i:-20 XN:i:0 XM:i:10 XO:i:0 XG:i:0 YT:Z:UU MD:Z:61C0T7A3T0A2C1T5T1A9T1 NM:i:10 +SRR065390.26106665 0 CHROMOSOME_I 26 0 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGCCAAAGCCTAAGCATGAACCTAAGGCTCAACCTAAGCCGCAGCCTAATGCTAGGCATA CCCCCCBCCCCCCCCCCBCCCCCCCCCCCACCCCCA0AA############################################################# AS:i:-29 XS:i:-29 XN:i:0 XM:i:14 XO:i:0 XG:i:0 YT:Z:UU MD:Z:36C7T10C1A1G6C2A1G8T0A7G0C3A2C2 NM:i:14 +SRR065390.28275609 0 CHROMOSOME_I 26 0 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAACCTTCGACTAATCCTACACGCACGCATAAGCCTCCCCATA CCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCDDCDCBBDCBDBABB6@C################################################## AS:i:-30 XS:i:-30 XN:i:0 XM:i:15 XO:i:0 XG:i:0 YT:Z:UU MD:Z:59G3A0A1C4G4A0G1C0T1A2C7A0A0G1C2 NM:i:15 +SRR065390.7812 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##############################@::?>=CB@CACCC???CCCBAB@BB;?B@B==@ACAA@?C?BBCBBCBCCCC@@CCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.2770334 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##################A<8.@@@=A?@?B?@>CBB=B8BAC;@BBCAAADCCCACD@CCC@ACC?CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5038515 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #####################@>BB>B;@@BBBBBDD@D@BCCADA?CCBCCCCCDC@CCCCCCCCCACCCCCCCCCCCCCCCCCCBCCBCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5869665 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ########################@6A@?@A;B=BCC8BC@CC@BB@CC?CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8368880 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA <:3:B??@4??DB><7;;84A>>DD?BADDD@DABACDBBCACCDDCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11712874 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA >8=?=:;;1;1??:2279772,5552-278A8?A1@CCB@:ACCC=ACACA9?=BCCCACCCCCCCB@CCCCC@CCCC?CCCCCBCCCC=CBCCBBCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12176045 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #####################B4BB@;B?B@@==0BC5B?ABDB@BBDCBCB=BCDCC=CCCCCCCCCCCCBCCCCCCCBCCBBCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12322670 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ####?@@=6<??:>BBBBAAABBBB=DBB@4ADBBDABCCBB>CCCBC=@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14671547 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############?A@A8@@?@BBD9BB@@?CCCDDDA>CCAD?CCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15954948 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###A97==00;A????;=BCCBD>DCCCCCCCCCCC@CBCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17314912 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################AA54=?A?<8?@4:8)??:==.A>7;=3CCBCC@CCACC;CCCCC;CCACCCCCCCC@CCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17920847 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ####################@(=@@9632;283*38762-8AAA=8@CCCBACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18484794 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #################@A=B@4BC?AA>CCBC@ACCBCAACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19979752 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ??@?AA>8=<;>=:2>;>BBA6ABB?>BABDB>BBBBB@>BDDBDDAACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20318652 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ############?A<8BBB8?A=B<8AB=CACCCCC@CC=CCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20730275 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##############################?4?::BAAAAACCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24048983 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA 98(934>>39/<==9>3>>A.BDB?C;CCBD>BBBBDDABBDBBBBDBCCDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26914314 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############@;<:AAA?>?>>BBB>:ABBBBDADBBBBDDDD@DDCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29129737 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ############A?7;B?B>A6AA?:>:@@B;AABBA?@5DDDBADCDDADCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30130221 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #########################ABBABA@@;@@@@@BB;B>B@CCC?CCACCCCCCCCCCCCCCCCC@CCCCCCBCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30619064 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ######################@@?>@3>DA6?>AA@?@>BDDBD@DCCCCACCCCCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.31338027 16 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###################################@>=>@BBBAABBBDB>BB@B=DBABCCCDCCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.31592423 0 CHROMOSOME_I 27 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCTAAGCCTGAGCCTCA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CCCCACCBCAACCDDD@BBCDBD############################### AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:74A17A5A1 NM:i:3 +SRR065390.7084193 0 CHROMOSOME_I 28 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGAAC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCBCCD@ABDCB@=>BBB>>>BBB############################## AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:96T2G0 NM:i:2 +SRR065390.19170893 0 CHROMOSOME_I 28 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTAAGCCTACGCCTATGCCTCACCCCAAG CCCCCCCCCCCCCCCCCCCCCCCCCBB######################################################################### AS:i:-12 XS:i:-12 XN:i:0 XM:i:6 XO:i:0 XG:i:0 YT:Z:UU MD:Z:68A11A5A4A1G2T3 NM:i:6 +SRR065390.22308979 0 CHROMOSOME_I 28 0 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGCCTAAAGCTACGCTGACGACAACGCCACAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCDDDCCCBACCCA########################################### AS:i:-24 XS:i:-24 XN:i:0 XM:i:12 XO:i:0 XG:i:0 YT:Z:UU MD:Z:64C10G0C3A2C0T1A1C1T1A3T0A2 NM:i:12 +SRR065390.5010743 0 CHROMOSOME_I 29 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGC CCB@@CCCC@CC@CC@CCC?C5CCC<<8:?=@@:;CCC@;=CC8;@CCCC;1?C@:858?5618/?=695;9@@;>?B###################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:97A2 NM:i:1 +SRR065390.5559541 0 CHROMOSOME_I 29 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACACCBBCCCDDBACB@DD@B>@BB=BD?;B@=??85797;@::@########### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:97A2 NM:i:1 +SRR065390.31135792 0 CHROMOSOME_I 29 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCBD@CACDDBDDBBCBBDBC>?BAABAC?BBAAABCAAAAAD:D<=<3<9<@####################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:93C6 NM:i:1 +SRR065390.1936876 16 CHROMOSOME_I 29 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #@>?B5555(=<:=?@@A?@;>>B?D?BDBBDDDDBBBC@BC@CCDCCCCCDCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16850763 16 CHROMOSOME_I 29 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #######@8?73=/=@=:=7@A==A;;@;9C@@@BDA@CCADCCDCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17680911 0 CHROMOSOME_I 29 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACC CCCBCCCCCCCCCCCCCCCCC@CCACCCCCCCCCBBCBCCDCC=?CCABBAAAB@4BC?@:?@@B*B1B>B####################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98G1 NM:i:1 +SRR065390.24171347 16 CHROMOSOME_I 29 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #####################BB@DAD@B?A>BADBBABADABBB;DBBCDBCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24428216 0 CHROMOSOME_I 29 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACC CCCCBCCCCBCCCCCCCCCCCCCCCCCCCCCBCCCCCC@CCACC8??>A@?@@(=8==@=@8A@A>A##################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98G1 NM:i:1 +SRR065390.27070077 16 CHROMOSOME_I 29 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ##########################?A=?@?@6@AAAAA>@CACB;BBABBB@BB>@DDCCDCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.27769553 0 CHROMOSOME_I 29 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDBCCCCBBABDABABDDDD?DBBABACBBBBC>>B;D1?B??D?:B?2@@=:=A?=?A=@######## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:93C6 NM:i:1 +SRR065390.32563299 16 CHROMOSOME_I 29 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ###########@;;@.<@@?A?B@B?AAAABDCBBBDAADABCDDBCDCCDDCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.2792992 0 CHROMOSOME_I 30 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGTC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCBCC@CCBCDBCCBCBBBDD@DBADA@BB>BB=>:AABB>@B@>B?:D?D################# AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:95A2C1 NM:i:2 +SRR065390.639284 0 CHROMOSOME_I 31 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCDCCCAADA>C=@A@@@><@B@B=B4>@############## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.1105550 0 CHROMOSOME_I 31 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCBCC;A?CCACACCDB>? AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8156389 0 CHROMOSOME_I 31 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCC>CCCCACCCBCC@@CCCC@CCCC@@CCCC=@@ADD?@@BBBACBA=DAA< AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11912243 0 CHROMOSOME_I 31 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACCCCAAGCCTAAGCCTAAGCCC CCC@BCC@CB>CACCCCC@CC??C@CCCCBCC?BBCBC@+=A5=1==:=76+@#################### AS:i:-7 XS:i:-7 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:78G2T17T0 NM:i:3 +SRR065390.17298969 0 CHROMOSOME_I 31 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCAA>BBACA>AA>>C:A?A>?<<< AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20623938 0 CHROMOSOME_I 31 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCCAAGCTCAAACGC CCCCCCCBCCCCBCCCCCCBCCCCCCCC?A@CCCCCCACCBC@C:::?:@8?######################################## AS:i:-14 XS:i:-14 XN:i:0 XM:i:7 XO:i:0 XG:i:0 YT:Z:UU MD:Z:76A10T4C0T2G1C0T0 NM:i:7 +SRR065390.21172388 0 CHROMOSOME_I 31 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTACGGCAGAGCGG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCC>>CCCB48@BBAA.=@@@0.=>:=*7??####################### AS:i:-14 XS:i:-14 XN:i:0 XM:i:7 XO:i:0 XG:i:0 YT:Z:UU MD:Z:85C3A1C1T0A3C0T0 NM:i:7 +SRR065390.32636364 0 CHROMOSOME_I 31 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCCCACCA@?CCC@BACBABA@B@@?B@DB8:=4=9;2B########################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14726933 0 CHROMOSOME_I 33 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CCCCCCADCCAABD@CBBBB=BB8BBBB>;DB;B@@B>B########## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92A7 NM:i:1 +SRR065390.19804249 0 CHROMOSOME_I 33 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTAAGCCTAA 00.00?????CCCCCCCCCCCCCCCCCCCCCCCCBCCCBCBBBBBBBB@@B>@>@@BBB=<>>>>=>?0?############################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:87A12 NM:i:1 +SRR065390.641561 0 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCC?BCCCCC@AA=C@C?BBC8@=C@@A@A@;=?@>A95<=>=*=9:<@################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4398044 0 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCDCACDDB@DB@@BA>B@@A><@@?@)?B72=77B############### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9917822 0 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBACCDD@BDBDBDBB@B?@@<@@?:D???<@??@==@3@@1<@=<<9< AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13766985 0 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCACCCCCCCCCCC@CBDDCBCDABBB=<@BBABB@BBB=B4BB>BB?4???>B>8DB<.?? AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13985245 0 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCADCDACCBDDA<@BBBBB@BBBC=>B>BCB>AA>AA>D==; AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15076148 0 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCCBADDCBCABC=CCB@@;B@@?B8?@@;?8<:A:==?BAD?;@B@=@.@D@??2=? AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16049660 0 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC=CCCCCCCCCBBCCCCBD@ADBB@@?@BB?;?B>20+7/<===@?######### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22701424 0 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCDCCBD?@@@ABBBABA?ABAB=3A;B?;D?DD>B5@69<6:=5=> AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.32125404 0 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACDCB;@@BB<;@@@A@:?A?@?6AAAA############################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7546701 16 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG #####@?.:@?BAA>DBBD<=BAB>BB>BB>DB>BC@DCDCCBCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10989112 16 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG 5050388648?AA6A===)77;==5:>BBCABBDDCBBADCCC?C=CCC@CCCCCCC@CCC@CCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11531996 0 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCBCCDCBBCCDABB@@BABBBB?B?ADABDB:@7.?=4A=:9A=???D>=(;4 AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16826146 16 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG 9=59>@??;B==<::1@@@>8BB>BD=@CCCA@ACDCB@CCCAC?ACCCCAACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17948445 16 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG #####@4@4@8A>::<>5>=68AABC>CBABBCBC?===:B?DCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29829737 16 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ############################@B?@>BB@4=AA@@?A@?BC<@DBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29888392 0 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCDCCCCBCCCDCBDDBDCBDABBBADBBABAACA@>?@>?B?>BD=>@==A3<<.773783A################# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30225547 0 CHROMOSOME_I 34 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCADBBDAADBABB>ABBABA>BDBB<>>?8<>55>'0626526@88A0;3'5 AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8226077 0 CHROMOSOME_I 38 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCC@CBCC@CCCDCCBCCCACBCCDB;@=C?BC########################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:80T19 NM:i:1 +SRR065390.17492028 0 CHROMOSOME_I 38 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACACCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCDCCDCA@@BACB==BBBA;4BBBBB@B??#################################### AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:94A0G4 NM:i:2 +SRR065390.17605413 0 CHROMOSOME_I 38 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCA?CCCCCCDCDACA@<=8@==*51553BB?BB?;@*?##### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:96C3 NM:i:1 +SRR065390.20811266 0 CHROMOSOME_I 38 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCB@BCC@ACC8;;:;CCCCC=A@5CBCB5=?7<<>>A:.@######################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:88A11 NM:i:1 +SRR065390.25876953 0 CHROMOSOME_I 38 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAATCCTA #################################################################################################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:95G4 NM:i:1 +SRR065390.27381447 0 CHROMOSOME_I 38 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGTCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCDDCCCCACDCCC@-A>A>>DAB>@A?AA:A>AACAC6<@@###### AS:i:-3 XS:i:-3 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:54C45 NM:i:1 +SRR065390.32350443 0 CHROMOSOME_I 38 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTACGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCCCDCDDCCDBADCDDACBDB@=DBBDAB6C@######################## AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:84C3A11 NM:i:2 +SRR065390.26113957 16 CHROMOSOME_I 38 1 100M * 0 0 CCTCCCCCTAAGCCTGAGCCTAAGCCTAAGCCTAAGCCTGAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #########################################A=B7===;:?@??:B?CC?CAACCCBACCBC?CCCCCCCCCCCCCCDCCCCCCCCCCCC AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:3A0A0G9A23A60 NM:i:5 +SRR065390.22114448 16 CHROMOSOME_I 39 1 67M1I32M * 0 0 CTAAGCCCAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ############################A:B;@@>?B@?ABBDABB@BC?BAACC>BCCAC>@CCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-10 XS:i:-10 XN:i:0 XM:i:1 XO:i:1 XG:i:1 YT:Z:UU MD:Z:7T91 NM:i:2 +SRR065390.4122396 0 CHROMOSOME_I 40 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACG CCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCBCCCDCCCCC@DDCCCA>DDDBBBABB<@C>@BB?8@@@;87?9<700727;7/7<@@@###### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.12501634 0 CHROMOSOME_I 40 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAAGCCCAAG CCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCDBCDCCDCB@DB>@BBDDABD@BB><@=@?############################### AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:84T11T3 NM:i:2 +SRR065390.15005277 0 CHROMOSOME_I 40 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDACC?CAACAA@A:ABB=;1@################################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:86A13 NM:i:1 +SRR065390.22489915 0 CHROMOSOME_I 40 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAG CCCCCCCCCCCCCCCCCCCCC?CCCCCCCCCCCDCCCCCCCBDCD@C@BACB@@B@BBBB@:@==B:B<@BB3>?######################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:94C5 NM:i:1 +SRR065390.25381446 0 CHROMOSOME_I 40 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCDCC@@BBCCADDDB################################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:66T33 NM:i:1 +SRR065390.26177760 0 CHROMOSOME_I 40 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCAAAGCCTAAGCCTAAG CCA@CCCCB@CCCCCC@ACCC?CCA9<:<=9;??6?########################## AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:79A4T15 NM:i:2 +SRR065390.26407476 0 CHROMOSOME_I 40 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGNCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGTCTCAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCC/C00!+03;999CCCCBBCCCBCCBCCB?BBB@BCBBBABBB######################################## AS:i:-5 XS:i:-5 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:22C59C2A14 NM:i:3 +SRR065390.13931899 16 CHROMOSOME_I 40 0 100M * 0 0 TAAGCCTAACCCTATCGGTATCCCTACTCCTGCGCCTCCGCCTTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###################################################CCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-28 XS:i:-28 XN:i:0 XM:i:14 XO:i:0 XG:i:0 YT:Z:UU MD:Z:9G4A0G0C0C2A0G4A0G3A0A4A0A4A56 NM:i:14 +SRR065390.1371033 0 CHROMOSOME_I 43 0 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAGGCCAACGCATAAACCCCAAGCA :@@B??4?????3??77938<=<7?>39??B8A?A@@C???A>>BBBACCBCCCCCACBCCBBCCCC@?@??BB>B> AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0G5G1C8A5A76 NM:i:5 +SRR065390.3034972 16 CHROMOSOME_I 43 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT >B>B;@B=B?><@B@B>>@>BBDBBADDBBA>CC?@CCCBCACCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5390013 16 CHROMOSOME_I 43 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #####################@88C8:?=AA1:A;8C5=CCAC=@ACAC=ABBDBBB@DDDBB@CD@DD@CCCCDCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10370271 16 CHROMOSOME_I 43 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #########################################?>BB37:7/:8:/75;7;77;=?4><;CB@A;@CCCCC@C@CCCCC@CC?CCCCCC@CC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11422655 16 CHROMOSOME_I 43 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ######ABAC>?DBBBDBBBDADD@>DCBBDBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15298468 16 CHROMOSOME_I 43 1 100M * 0 0 GCCCACGCCTAATCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #####################################AAACC=ACC1ACCACC2BCC?C@ABCC?AA?A=C>CCACCC@BCCCCCCCCCCCCCCCCBCCC AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:3T1A6G87 NM:i:3 +SRR065390.20235987 16 CHROMOSOME_I 43 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #############@@9:7:8BAA>ABB?@BB:B?@AA=DDA@ABBADDCCCBCCCCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21015579 16 CHROMOSOME_I 43 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ##########################A;@=B@;BBA@CA=CAC@CCCCDCCCCCACCCCC@CCCCBCCCCCCCBCCCCCCCCCCCCCCCBCCCCCBCBCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21101533 16 CHROMOSOME_I 43 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ##########################??A;=ABBAA>BB>ABADDB8DADCBCCCCCCCCDCCCDCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23753867 16 CHROMOSOME_I 43 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ######################??6?B@:DD6D>AA?>C;BBBC>BBDD@BBBBCBDCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26254463 16 CHROMOSOME_I 43 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ######################@@@>=:>8?BB>B@=@A@=====@B;B@BBA;7B=AA?8BBB##### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:96C3 NM:i:1 +SRR065390.31555089 0 CHROMOSOME_I 44 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCBCCCCCCBCCCCACCCCBBBBB(?A??AA=B=CCCCDC>AC=BB@?B8>==:BB@6?#################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:45A54 NM:i:1 +SRR065390.4469707 16 CHROMOSOME_I 44 1 100M * 0 0 GCGAATCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ###########################@>==@A>=.@@@?CCCCCC@=CCBC@CCCBCC>C@C==?=>?ACC;;>5>@=CA?9A############################################# AS:i:-14 XS:i:-14 XN:i:0 XM:i:7 XO:i:0 XG:i:0 YT:Z:UU MD:Z:68A12A5A6G1C0T0A1 NM:i:7 +SRR065390.28536327 16 CHROMOSOME_I 45 1 100M * 0 0 CGTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTGAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ######################A:A@(6@@>:9:>553+(>@7<>=B:A@5BCDCADCBAC@CCCACCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCC AS:i:-7 XS:i:-7 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T0A35A61 NM:i:3 +SRR065390.30452237 16 CHROMOSOME_I 45 1 100M * 0 0 CCAAGCCTAAGCCTACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #########################################B@=@A=@DBCDCDCCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T13A84 NM:i:2 +SRR065390.473101 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGCCTAAGCCTAAGCACCAG CCC@@C@CCCCCC@CBC@C@C:?@@==;@=CBABC@CAC9?2?;2A6AA@################################################## AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:76C18C0T0A2 NM:i:4 +SRR065390.2292661 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCDCCCCCACCCBCDCABCB@CCDBABC@######################################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4943586 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCCABCCCC=BCC@@@BC@B<@BAB?<;5@?877;7;>D>?D:>?=>@@@B=6@@@###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5569754 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACBCDCCBDCBB@CBBBBBDB;DB>@ABBA?CAAAAAAA@AAAA########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8043944 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCB@DCCCBCCBCDDADDDD>DBBD@B@@ADB?>B>B@B@>CBBABAA?BDB4@>??DAAA7A AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12047482 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCA@C@@BAB@DDB>B@;@A:@@>DC=;@@DBBBBBBAC>B?6B;?<8?:? AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16134128 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACGCTAAGCCTAAGCCTAAGCATAAGCGTAAG AAA=ABBABBCCCCC>ACACBCCCCCCCB?CCC@C@BBB>3?8A>>@CC@@D@?###################################### AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:69G0C18C5C4 NM:i:4 +SRR065390.17957775 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCDDCBADBBCADDB<=DBABBBBB?C?DD>B::8AAA@@################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22147900 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACCCCAAGCCGAAGGCTAGG CCCCCCCCCCCCCCC@CCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCCCCCBAD=@=A=@5==:74@################################ AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:81G2T5T3C3A1 NM:i:5 +SRR065390.22676708 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACCCCGCCCAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCADDBDB@@DABABBDAD@?>6@@@@@################################### AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:88C1T0A0A3T3 NM:i:5 +SRR065390.22905722 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCDCDC@BBBBDBBBADB@BCBBB>A?>===92>9=985@###################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23066210 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCDC?DCAB?>BCAB@DBDAA>>?BB??>DBB######################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24301313 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCDBDDADBBDDBBBCDBDBBBB>BAC>A>AAA53=@9>999AAA################# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.25506513 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTCAGACTAAGAAAAAGACTAAG CCCCCCCCCCCCCCCCCCCCCACCCCCDBDCCCDDDDDCBBDBBDAA>BA################################################## AS:i:-14 XS:i:-14 XN:i:0 XM:i:7 XO:i:0 XG:i:0 YT:Z:UU MD:Z:76C2A2C5C0C0T3C5 NM:i:7 +SRR065390.32874751 0 CHROMOSOME_I 46 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCD6CB?>?;>ABAA6A??>(9<9:18868@68@:692:85 AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12211289 16 CHROMOSOME_I 47 1 100M * 0 0 ACGCCTAAGCCTAAGCGTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ###################################@;6;BBB?B>A?DD@:999<<><<;87;89<<>>?<9??;::9;7883800000 AS:i:-44 XS:i:-44 XN:i:0 XM:i:18 XO:i:1 XG:i:1 YT:Z:UU MD:Z:0A2C1T2G3A1G0C4G2T2G2T2G2T0A1G2T2G5G48 NM:i:19 +SRR065390.26846416 16 CHROMOSOME_I 48 1 100M * 0 0 GCCCGACGCCTACGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC ############################################################?BABC@CCB@AACCBCCCCCCCCCCC@CCCCCCCCCCCCC AS:i:-12 XS:i:-12 XN:i:0 XM:i:6 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0A0G2T1A5A3T83 NM:i:6 +SRR065390.4887361 16 CHROMOSOME_I 49 0 100M * 0 0 GCCTTCGCCCTGGCCCCCGCCTCCGCCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ##############################?AB>>BBDBBBBBBB>DBDCCDCBAACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-24 XS:i:-24 XN:i:0 XM:i:12 XO:i:0 XG:i:0 YT:Z:UU MD:Z:4A0A3T0A0A3T0A0A4A0A3T0A71 NM:i:12 +SRR065390.27800038 16 CHROMOSOME_I 49 1 100M * 0 0 GCCTAAGCCTAATGCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ############################################################@A@@@B>>@>>AA6:@A>>CB@BBACBBB4?>??@@BA;B>B0@############### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:93A6 NM:i:1 +SRR065390.4627990 0 CHROMOSOME_I 51 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDC?BDCABB>BA=B?@?B;?=BA@47??:?############### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16715324 0 CHROMOSOME_I 51 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCBAADB=AB;@D0;BACB;BBBA;0>==5=3?@>@7477:@######### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18309630 0 CHROMOSOME_I 51 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA=CCCBBBCC?BA@B;BAB<:703=:=:::??@@@######################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:93A6 NM:i:1 +SRR065390.19555357 0 CHROMOSOME_I 51 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAC CCCCCCCCCCCCCCCCCCCCCCBCCCCCBCCDCCACC@CC@CCDCA@@BBDDBA@BADC<@DBB;;@@??A>A@C######################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:99A0 NM:i:1 +SRR065390.20581090 0 CHROMOSOME_I 51 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGAAGCCTAA CCCCCCCCCCCCCCCCCCBCCCCCC=A?:A<;?;;A?;A=9=;9A####################################################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:91T8 NM:i:1 +SRR065390.23080061 0 CHROMOSOME_I 51 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACAAC@CCCDBBDACDDADB@ABDB>ABBABA@CC>:A8B<<:?@>A@AAA???B### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26337922 0 CHROMOSOME_I 51 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAA CCCCCBCCCCCCBCCCC?BCCCCCCCCCCCCCDCADCCCAA2=:(@############################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92A7 NM:i:1 +SRR065390.10947804 0 CHROMOSOME_I 52 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGGCTAAGACTAAGGCTAAGGCTCAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CACC@@CBBC>=CB?A?5A######################################## AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:76C5C5C5C2A2 NM:i:5 +SRR065390.13041859 0 CHROMOSOME_I 52 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAAGCCTACGCCACACCCCAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCDCCDCCDBAABC@B@?BB?BBDADABAB8B?>>:9A########################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:90T9 NM:i:1 +SRR065390.20639196 0 CHROMOSOME_I 52 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAGGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@BCA=AA?CDCCCDACDCBBDDBBBBBBBBABB>?;>BBB?AADDB@D@BB@=BBA>=@BAB?5ACDDC5BACCAADCCC@ACCACCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.1360842 16 CHROMOSOME_I 56 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #############AA;9457A5:7@C>B:C@CCB@@CCCC5@=CC=7;===@?==CC0>9A=;;BB;BBB?>AA@9?CAC>@BBCCCCC@CCCCABCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8944828 16 CHROMOSOME_I 56 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ######D@D>>BDABAA@@ABBBBBDBD@@DDBBDADCDCBBCCDBDACCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9154510 16 CHROMOSOME_I 56 0 100M * 0 0 TTCATATGGGCAGGGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ##############################@B;@?>>B1?BCBBC@>CDB>B@CA@CCAC=AA>>AC;CCACCCCCCC=CCCCCCCCCCCCBCCCCCCCC AS:i:-28 XS:i:-28 XN:i:0 XM:i:14 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0C0C0T1A0G0C0C0T0A0A0G0C0C0T85 NM:i:14 +SRR065390.10327745 16 CHROMOSOME_I 56 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #####?BB?>793=2=@7>75;BBDABDBBCB@CC@CCC89876@CCCC@B8@@ AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:3A4T2G5G2T79 NM:i:5 +SRR065390.11441245 16 CHROMOSOME_I 56 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #######################?=:>==8;;;231@==;B8BBA;?8AA9B@=CDABCDCD@CCCCCCCCCCCCCCCCCCCCCCCCCCCABCCCCCCBC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12629337 16 CHROMOSOME_I 56 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ;=5?:8A?<:?8A@@A?==@6B=BDBBBA@CABC@DCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13640483 16 CHROMOSOME_I 56 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA =>8=>3A@=6B=B@8B?>BDB@ABDA>BDBCCDDCCACCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18076115 16 CHROMOSOME_I 56 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ###########@<88>>8?<=;8A@>:=;*AAB=@C>@84=>5:535BCBB@DCC?A?DCC?CA9CABC@;CCBAABCCDCCACCDCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22432674 16 CHROMOSOME_I 56 1 100M * 0 0 CCCACGCCCAACCCCAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #####################################A?5@@AA:9B;BCCCACBCCCCCCCBCBCCCCCCCCCCCCDBCCCCCCCCCCCCCCCCCCCCC AS:i:-12 XS:i:-12 XN:i:0 XM:i:6 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2T1A3T2G2T8G76 NM:i:6 +SRR065390.24633504 16 CHROMOSOME_I 56 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ###############?>B==B:BC4BDAACDC@CCACCCCCACCDCCCCCCCCCCCCCCACCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30385823 16 CHROMOSOME_I 56 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ########################################?@?@AB@BBCD@B>CCBCD@BCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.159947 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA <>4=96:98:?46?A6?B@BA=?>BBB>>BADBBBDA@BCBCCCCADCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.1796988 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##############################################AAA:00000?=@BCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.2760975 16 CHROMOSOME_I 57 1 100M * 0 0 AGAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############AABB@ABBACBCBC?CDCBCACCCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCDCC AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0C0T2G95 NM:i:3 +SRR065390.12418490 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############A8@AACBBB;;B@BBBB@CB@B@DADADA>CCDCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14521060 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##############################B?>BB@A=:<07;;7B@@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14712716 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #########################@@98@B<=@@B=?ABCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17723586 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ####################################@:B><;75<@-==;CC@BCBC?CACBCCCCCCC>>==AA AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17845832 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #################?@9A?88ABB0?@ABBBABA=B*BC=BC?CDCCC=DCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18910535 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #######################BABCAAB>BBBBDB=DBBD@BD@DCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19689790 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ####################@33B@>B>ADA>B@@CADDCACCBACCCCCCCCCCCACCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19927220 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ######################CBBA>BBDDB>DBBD@ABBDCBDBDCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19989398 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA @@6@?@@:<@BBB@D>@D??>A?>CCBCBBBBAB@>BBAADBBBABDDCDDDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28429399 16 CHROMOSOME_I 57 1 100M * 0 0 CAGAGCCTAAGCCTAAGCCTAATGCTAAGCCAAAGCATAGTCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############################################A:=@@.AC@CBCDCCCCCCCC;CBCCCCCCCCCCCCCCCCCCCCCCCCCC@CC AS:i:-16 XS:i:-16 XN:i:0 XM:i:8 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T0A19G0C7T4C2A0G59 NM:i:8 +SRR065390.29699086 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ####################################?:@?;:>=4B@BA?AB@BCB:BAACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30602381 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###########################ABBB@>>B@B?;B?BB?@B;CBBB=BDCBCCCCCCCCDCCCCCCCC?CCCCC@CCCCCCCCCCCCCCCCCBCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30661211 16 CHROMOSOME_I 57 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ######??8?5<08<::=48?B6@B8;8=?=ABB=B;AABA@>BB;BBABB6BD>BDDDDDDCBACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.1865058 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCDCCCBCCCCCCCBCCCCCCCCCACCCCCCCBCA?BBCCAA########################################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3486883 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG 000000000,00000AAAAAA>A=ABBA<:;8;592;77230/79111-9?+79?############################################# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5071220 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCATAAGCCTAAGCCTAAGCATACG BCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCC?6>=>=@9B=?==9==BA;;@######################################## AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:72T4C17C2A1 NM:i:4 +SRR065390.7153981 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCACCCCCCBCCCDCCCCACCCCCCCD@BDDDB:BA8>6>=)=>:==>>>5B?@@@96<:;@>0>> AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9722947 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCDCDDDCA@DBDDAC?BBBBB?ABBB@;A>:=:?9?6A??########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13953914 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCGTCAG @@A?=CC@CC===A=CC:@@ACCCCCC@C<:8<839>=>?5=@@######################################################## AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:95C1A2 NM:i:2 +SRR065390.15007214 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCB;DDDCDBD@DACB>?=BBBBA=0>>DBBDD=ABDB@B@@@BABABCB>>AB?BBB4?6(? AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16824019 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTCAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@DCCD@@ABBAA>>DADBBBBAB?BAA=A############################### AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92A4A2 NM:i:2 +SRR065390.16851488 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAAGCCCAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCC=8=A<=>=8:252;/@@A=?############################## AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:78T11T9 NM:i:2 +SRR065390.17897057 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCAACCCCACDC@@>>BCBB8AAB>@############ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19083188 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCCC@CCCCCABADCBAD@ABB0B@B@(@################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19427372 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCDCDDCABACD>BDDB?>BBBDA;D>A<>>DBB?A>DBBBA>ACB??><@ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19483941 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCBCCCCCCCCCCC@CCCC@CC@BC=>4B?CBB AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23214436 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCABCCCC@CCCCCDCBDCAACBBCCB@CB@BBBB?;@@=BA>AABAA>;>AA.A@@?B?############### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24888065 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTACG CCCCCCCCCCCCCCCCCCCCCCCCCCCDCBCDD@DBDAAADBBBBA###################################################### AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92A5A1 NM:i:2 +SRR065390.29491496 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCDCCBCCCCCCCCCC@ACCCCACCCCCCCCCCCBCCCCCDDABCDDBBBDBAABDB@A>;@B@AAA??0:+=544925??######## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.31477096 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACACCTAAG CCCACCCBCACCBCCCCCCCCAC@@CCCC@@@>?@>B@@;>A>>>*865><9?;;@>=>@BB@B>B;>;;===B=>;AA?*-373BB(?B########## AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92A0G6 NM:i:2 +SRR065390.23852108 16 CHROMOSOME_I 58 0 15M1I84M * 0 0 TTAGCATAAGAATAAAGTTTAAAATTTAGCTTAAGACAAAGCCTAATCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ########################################################?A@<=CCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-36 XS:i:-36 XN:i:0 XM:i:14 XO:i:1 XG:i:1 YT:Z:UU MD:Z:1A3C4C0C4C0C3G0C0C1A3C4C1T8G53 NM:i:15 +SRR065390.23932205 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCDDCCDCDADDDBDBABABDBBBBAABBAAB?CC=AAACA?8=@@68: AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24149813 0 CHROMOSOME_I 58 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCDCC@DDACA@=D@A=@BABBB6BBAAB=@B@AB71<>9>0:>1@6@## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.1087596 0 CHROMOSOME_I 59 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACCCTAAGC CCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCDCCBBCDCAA@CB@=9:::A################################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92G7 NM:i:1 +SRR065390.26571979 0 CHROMOSOME_I 59 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGCCTAAGCCTAAGCCTAAGC =???=>AA>ACBCBCCCCCCCC>@@############################################# AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:75C24 NM:i:1 +SRR065390.31153791 0 CHROMOSOME_I 59 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CCCCCCCCBABDADBADDDBBBBBBBB>@B?CA:AA>AC6=<:A:2:@###################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:85A14 NM:i:1 +SRR065390.33128805 0 CHROMOSOME_I 60 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCGTAAGCCTAAGACTAAGCCTAAGCCAAAGCA CABCCCCCCCCCCCCCCCCCCCCCCACCCCCDCDCCABBBAAA@?BA@<=0@@@<>B>BBBA>AB@################################## AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:69C10C13T4C0 NM:i:4 +SRR065390.8926768 0 CHROMOSOME_I 61 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCD@CDA?=>C88A==@.8:@=<4><@@86;@::@# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9390775 0 CHROMOSOME_I 61 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCB@CD>CBAADCC=AABB@@???@A######################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:81T18 NM:i:1 +SRR065390.12883674 0 CHROMOSOME_I 61 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCACACCCC=ACCCCABD@B@BADABBB:@@=@= AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19474303 0 CHROMOSOME_I 61 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@DCCCC=CDBC=CACDC:>BBDB>?DB###################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.32664926 0 CHROMOSOME_I 61 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCAAACC?BCBC;CCCBB>=@C>4@############################# AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:82A17 NM:i:1 +SRR065390.33180966 0 CHROMOSOME_I 61 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACT CCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCACCCBCBCCACCACCCC@8?>AA############################################# AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:97C2 NM:i:1 +SRR065390.14178092 16 CHROMOSOME_I 62 1 100M * 0 0 CCGAAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ##############################DBBBD@AC@@A??C@9><;:CABDCCBCCCCCACCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2T5T91 NM:i:2 +SRR065390.33093699 0 CHROMOSOME_I 63 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCGTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCC1'0000>=39A############################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:72C27 NM:i:1 +SRR065390.3811166 16 CHROMOSOME_I 63 1 100M * 0 0 CGAAGCCTAAGCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #########################??>AB@?B?>@A==:BB@=??CBB>D@BDABBCDBDCDCDCCCACACCACCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T12A85 NM:i:2 +SRR065390.9360891 16 CHROMOSOME_I 63 0 100M * 0 0 GTGCGCCTACCGCTACCCGTCACGGCAAGCCTGCGCCTCCGCCTAACCCTACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #####################################################@C@BBCCCCCCCCC1BCCCCCCCCBCCCBCCCCCCCCCCCCCACCCC AS:i:-40 XS:i:-40 XN:i:0 XM:i:20 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0C1A0A5A0G0C3A0G1C1A1G0C0C0T6A0A4A0A6G4A48 NM:i:20 +SRR065390.11907902 16 CHROMOSOME_I 63 1 100M * 0 0 CTACCCCGACGCCAAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################B==8>7BB>@B?@CDC@@CCBCC?@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:3A0G2T1A3T86 NM:i:5 +SRR065390.18166736 16 CHROMOSOME_I 63 1 100M * 0 0 CTAATCCGAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ####################@?;AA>BB>B>===3BCBC@@CCDCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:4G2T2G89 NM:i:3 +SRR065390.24035073 16 CHROMOSOME_I 63 1 100M * 0 0 CTAAGCCTAAGCCGCAGCCTAAGCCCACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##################################################A=CA?BACACBCCABCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCDC AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:13T0A10T1A72 NM:i:4 +SRR065390.29735708 16 CHROMOSOME_I 63 1 100M * 0 0 ACAAGCCTACGCCTAAGCCTGGGCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ####################################@B4B000+,1.+108;@BBBBBBB<@?B@>AB?BBB>>@?@>BBBB?:;>><:@@@? AS:i:-14 XS:i:-14 XN:i:0 XM:i:7 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T6A7G2T5T7A12G53 NM:i:7 +SRR065390.1636136 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCC@CCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CACC@CACCAB:B?66@:@@@ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3392236 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCBCBDCAABBDADDDBBABB@?A>BBADA?ACBBB@;?B;@?@@@<@6@@ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6690334 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCBCBBCCCCCCCCBCCCCCCCBCCCCCC@CCAC>:AAA;9;==?=:/A=AA@?C?@A8757=?######################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13292986 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAGGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCACCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCC@CCCCCB@CD?C>C>@=A@5@A?AA?0=?####################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14309215 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCAACBCA:ACCADBABDDA;@BB<=::A>?B4;D69===D######### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.15577802 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBDCCCCDACCCCBADCD@B>BB@BB3?B?BB>>B@AC?BB?>B?>?@@A@?B6AD AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16480523 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGGCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CBCCC??>CCC=ABBBAC;?AA6?@>@########################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:94C5 NM:i:1 +SRR065390.17141184 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACG @BBBBBBBB=>>>>>:>>>:<>>:>BBBBBBBBBAB:BB>>BB5BB9>>?BBB############################################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.17760882 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACG CCCBCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCA@CCCCBA@CACC@CCC@BA>BCC@CBBCA><=CC@B@BB##################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.18662066 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCBCCBCCCCCDC@BC@AA=A5A=A@C=@@=?BB8A############### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21809038 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAACCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCBCCDCCDCCBDCBDC?ABCBB?>B5=AA########################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:93G6 NM:i:1 +SRR065390.22192818 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDCCCCBBCCDDDBBBBBBBBABB>B>BDB?AA>>@>@>9<48*@######### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23362845 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCC?CCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCDDDCBBCBDDB>BBBB?AABBBA6A>BB:>>5,=99?;6>=?####################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26775560 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCADCDDCBDCDB@B>BBBBB>>AA=<=@########################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:96T3 NM:i:1 +SRR065390.28745603 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCDCCDBABBB>BDB6BC>AA@BBDB>BA@B####################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29133277 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAATCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCDCCCDCCDCDBCBBBBCDBBBBCDDCCAABBDBAAA>@A@>D>A############### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:93G6 NM:i:1 +SRR065390.4912040 16 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###@@A5:8A7;84:=>A:>;BB@>;BBBB?=@BDDBBCBCB>DCACCCBCCCBCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9629649 16 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ######################@A=>>;@@B;4BDB?BB5CCBB@>CCBBCCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15607771 16 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ######@@=?<==:6<<>AA)B@BBA@BBBB>BA@BBCDDDADABCDDC@CCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16191081 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCBCCCCCCCCCCCCCC@CCCCCCCCCCCCCCCCCCCCCCC@A?CCCCCCCCCCCBC@CCCBB>A=@4=>@CC@@9@AA################# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16241777 16 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###############DBDD?:@1:@4=0=;>8B>@CC<@=CACCCCCCCCCBCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22359834 16 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG @=)????<6>A>AAADBDD>;>>BBC;@BBAB;ADBBBBADBCB@@CCCD@CCCC;@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.25076320 16 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###################################@:=C>@D=CCDCCCCCCCCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26013356 16 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###############?C>CBBA=BBDDBBABDD@DCDACDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29257811 16 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###############@9@@=:@?BB>;B?BB>>BBDBD;CBCDAACCCA>?CACC?CCCCCACCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29430375 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCBCCCCDDCBBCABBBBBBAACCAAAABCBAAB?AAA6A@A@>?AAAA?64?########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30148213 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCC=@@B@A<@@;BB=BB;BBB>>?B@?@4;@############################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30863885 16 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ####################@@@@@>>DBB>6BBBC@BDBBA=BBBBCDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.31415192 0 CHROMOSOME_I 64 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBDDCCBCBCBCDD@C;@@C@BBB@BAB>BB@82>>=AB;B?@B>6>77=7*;,7378/895A?AB< AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6076202 0 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCCDCACDC@DCABB>A>?@>??,>?=A########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6192585 0 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBBDBCBABBDDB@BDDD@B>BAB?@ABABB?C?:AA@=)?:=@@####### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9007991 0 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCACCCCCCCCCCCCCCC=CDBC@AB>B5<@==BBB>B>?BBB20879=(5:.=:@94 AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12321086 0 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDCDDBDD@DDDDBDBBBBC=>B>BBBACCBC>CCAC?ACC= AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20771747 0 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA@ACC@DCDAC@>@BBBB??B<<7739373:93937;3=@A>?A?A96<*8:5<8@############ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21858348 0 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCDDDABDBBBBBBADABBBA4>BB???######################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22848365 0 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCBAC@CDADB;DDBB@@@?BBB>BCAACAADD??A>A>>40771 AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.25705771 0 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCDDDBBCDAD>DABB>BCA=@:@?@A?*=70;70=@@A@######################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12439940 16 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ##DDB6@<<=D6B>@BB@@ABDB@@B@BB=D@DBDCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14000986 0 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCBACCCDD@CBDDA@DDABBADBDDDDABBBB;DBBBBB>CABAABAACA:BA:?B?6?ADD? AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16839733 16 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #############################################AA@CC;CCCCCCCAABA@CCCCA@C@CC@BCCCCCCAABAA@AACCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17727634 0 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCAACCBCBDCDDACBCBBBBAB@>BBB@BA@B?;BB@A6?A8?################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19208569 16 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #########?979-5A:.6@B?>6BABCA;=DDDB=ACCBDCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22372328 16 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ####A5*904@6=@>1BBBBBBCBBBABCDCCDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23208723 16 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ######@==B:77.<<@=<::>=:7;6BBBDB4BBBB9=BCA@B;CCBCAABCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24356433 0 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCDCBDDBADDBB;BBAABBABB>C6AB??>*AA@:A8@@@###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.33542765 16 CHROMOSOME_I 65 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #######A6@>:AAC=AA4A>;@DB>=@8<@BBBDABBDDA@B:?0?############################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12905806 0 CHROMOSOME_I 67 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCC@CCCCC?ACCC<@CBBBA5CBDA@=A@=@A><@>BB8BB>BBD3D###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17964782 0 CHROMOSOME_I 67 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCAABCB=8BB?BBB>AB8<=???0;7?######################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24880161 0 CHROMOSOME_I 67 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCADCCCDDDDDCBAABDBB>D>B@BD?D8@==A==@@>;;: AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29470600 0 CHROMOSOME_I 67 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCADCA@ABBBAB=BB<=A=BDD:@BCACAC@@############# AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:95A4 NM:i:1 +SRR065390.9712286 16 CHROMOSOME_I 67 1 100M * 0 0 CCCTAAGCCTAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ##############################@AA@A::=>/==:A>B@DCCBBBBCCC>CDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0G17G81 NM:i:2 +SRR065390.9802725 0 CHROMOSOME_I 67 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCDCCCCCCCCCCCBCCCCBCCCCCCAA@CCCCCCCCCCCCBCCC?>AAA=>AA3>AA8=AC>A=CAC?>?B?B@B#################### AS:i:-3 XS:i:-3 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:58A41 NM:i:1 +SRR065390.4151860 0 CHROMOSOME_I 68 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTA CCCCCCCCCCCCDCCCCCCCCCCCCCCCC@7?<A:=;A27>22@37???A6@A:9;-390=754:=@##################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:93A6 NM:i:1 +SRR065390.6451314 0 CHROMOSOME_I 68 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCCCBCDAACDABBBDD@B=BDBB;A7A???#################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:93A6 NM:i:1 +SRR065390.7753919 0 CHROMOSOME_I 68 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGTCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCBCCBCCBCA?>*>??@?:B>CCC>CCCDBB>DB@B=6BBBB=1=A?9:D8D@@?@8 AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:48C51 NM:i:1 +SRR065390.12766808 0 CHROMOSOME_I 68 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCC@CCCCBBCB5>@?@B@B@97;;9@################################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98T1 NM:i:1 +SRR065390.27353147 16 CHROMOSOME_I 68 1 100M * 0 0 CCGCAGCCTAAGTCTGAGCCTAAGCCTAAGCCTAATCCTAAGCCTGAGCCTACGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #############################################################################################B>==@A? AS:i:-16 XS:i:-16 XN:i:0 XM:i:8 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2T0A8C2A19G9A6A6G40 NM:i:8 +SRR065390.2141529 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CCCCCADAD@B>B>@@@D?BABB>?BA?########### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.2320480 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC<>CCCC8@CCCC=ABCCBACBC9=CB@:C56@8A.:5?=3A?B@B@?>?B?;;434=>90>: AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4714421 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCBADBCDDCDBDCBBABDAC@BCBAAABBB?AB>=BDAAA?BD;?B?@#### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6640654 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCC@CCCCC@CCCCCCACCCCCCCCDC>CCCC>CCDCCABADCBD;B@BB=B?=B>19>==@>4BB8:=74B;?8D??8@########### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7630109 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCBACCBDAB@DAABBB@B?@########################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9514930 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCB@CCDB@BAB@A@>@B=>>4A???8BBD??9D@>?;?85@####### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10004235 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCACACCDCC@CD@AB@@C>BC;:@?:@=??########################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10865454 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDC@CD@BB?CB@BDDD@BAA@AB3>?>>==(9:;=4>@:@;:27.@ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12673297 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCDCCACCCC=CACBA>DCDDCABBDB@>>B>B@>B@AAA>C>3@=:@@A>?########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12772245 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CACBBC@CCABC;CACBCCBA==B>?=A#################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13667706 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCBCCCCCCCCCCCC@CCCCCACCC?CCCCC@8AAA:@:>:BBB;B@=?B?BDB0BBD@B>B>=BD,//85A4AA@CAAAAAAAA??8?@@@@?########### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17659493 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCA@CCCDBCCACB@BBDBDA=BBABB=AACA=@?B####### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18370296 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDC>CCBA>BC>BBDBB>B=8BBDCAAAA>8?:?A?:?DAA>A###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18372281 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCDBDDDBBDBDBBBB=BB;BB@BABBB>?BA?A>CAA@CCCACC>CBA>DCDB@A@BB@C@BBCA=>=:@##################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.31254323 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCDBCCACCCCBABDBDBBAAB>BBBBBA?BBB>AABAAA??BB@9(AABDA>B@BB>BA8BB>:>8@=>6@3:<@=@:@ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11515609 16 CHROMOSOME_I 69 1 100M * 0 0 CCAAGCCAAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############################?>55;C<CCCC@@82@A=A;=@8?C@C@@CCCB@CCCCBCCCBCCCCCCCCCACCCACCAC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T5T92 NM:i:2 +SRR065390.11752838 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDBBCCBABBBD@BAB=BB?B=3?@@=?@:B>:A########### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11823969 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCBCCCCCCCC?CCACC>@C@CA?BC?AB;@@@@DB=ABBBBAD@BBB;AABBCAAABAA=A>A AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12248467 0 CHROMOSOME_I 69 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCCCCBCCCCCCCCCCCBDD@A=A>BDD>>>BBB@BB>B3BB?@;:>=+<55,75=::AA@6@## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7434339 0 CHROMOSOME_I 70 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCAAAGCCTAAG DBCCCCCCCCCCCCCCCCCCCCBC@CCACCAAB?ACCCCBA>BBBBA>>AD@B@?>@@A########################## AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:84A8C6 NM:i:2 +SRR065390.23718480 16 CHROMOSOME_I 71 0 100M * 0 0 ACGCAGACGCCATAGCAGAGGGGTACGCCTCAGCCTGAGCCTACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ############################################################################A>4@AA:?A@;A6>00000763:6 AS:i:-30 XS:i:-30 XN:i:0 XM:i:15 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1A2C0T1A3T0A3C0T1A1C0C2A4A5A6A56 NM:i:15 +SRR065390.21251465 0 CHROMOSOME_I 73 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCACCC@CCCCB>CBCDB=@7?5@@>:>@=??/=?############################ AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:94A5 NM:i:1 +SRR065390.21597469 16 CHROMOSOME_I 73 1 100M * 0 0 GCCTAAGCCTCAGCCTAAGCCTAAGGCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ####################################BBABC?CDCCC@CCCCACBCCCCCCCCCCCACCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:10A14C74 NM:i:2 +SRR065390.29344619 16 CHROMOSOME_I 73 1 100M * 0 0 TGATAGGCCAAAGCCTAAGCCTAGGCCAACACCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #########################################AA?A897+99>;7:0A>>8BABABB?ABBAABA8><>9>808<8 AS:i:-18 XS:i:-18 XN:i:0 XM:i:9 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0G0C0C2A3T13A3T1A0G69 NM:i:9 +SRR065390.32874267 0 CHROMOSOME_I 75 1 13M1D87M * 0 0 CTAAGCCTAAGCCAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG DCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCC@CCCCCCCCCCCCCCA>/=;=9>:/5AA############# AS:i:-8 XS:i:-8 XN:i:0 XM:i:0 XO:i:1 XG:i:1 YT:Z:UU MD:Z:13^T87 NM:i:1 +SRR065390.13205982 16 CHROMOSOME_I 75 1 100M * 0 0 CTAAGCCTAGGCCCAAGCCCAAGCCTAAGCCTAATCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #################################################################################################### AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:9A3T5T14G65 NM:i:4 +SRR065390.1968887 0 CHROMOSOME_I 76 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAAGCTAAGCCCAAACCTAAAGCTAAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCC@C==@=:A####################################################### AS:i:-16 XS:i:-16 XN:i:0 XM:i:8 XO:i:0 XG:i:0 YT:Z:UU MD:Z:72T2G0C7T2G5G0C4G0 NM:i:8 +SRR065390.3020042 0 CHROMOSOME_I 76 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGCCTACGACTAAG CCCCCCCCCCCCCCCCCCCCCC@CCCCACCCCCCCCCC@CCBCCCCC=CCCCD8CCA########################################### AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:82C9A1C5 NM:i:3 +SRR065390.5329842 0 CHROMOSOME_I 76 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAGGCCTAAG CCCCC@CCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCC@CCCCCCCACDCCCCABCCB0@>A@?BBD@B>BA>B>B??BBAAC>?=:?A########## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92A7 NM:i:1 +SRR065390.7718336 0 CHROMOSOME_I 76 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCAAAA+AAAAAACCCCCACDDCCDCCBD@B@BBBD<;@BBB?BACBBB8D>B>B)>? AS:i:-3 XS:i:-3 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:48T51 NM:i:1 +SRR065390.9099421 0 CHROMOSOME_I 76 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCAAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCB@C<@@BDCA@D@;B@A?=@B########################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:84T15 NM:i:1 +SRR065390.13504888 0 CHROMOSOME_I 76 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACCCTAAGCCTAAG CCCCCCCCCCCCCCCBCCCCCCCCCCCACCCCCCCCCCCCC@CCC=;3=ABB=@B@?@B<@################################ AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:87G12 NM:i:1 +SRR065390.26299881 0 CHROMOSOME_I 76 0 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCACAAAGCTAAACGCATC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCBDBBDDDABBDD?###################################################### AS:i:-20 XS:i:-20 XN:i:0 XM:i:10 XO:i:0 XG:i:0 YT:Z:UU MD:Z:80A2C0T2G0C4G1C0T1A0G0 NM:i:10 +SRR065390.26546478 0 CHROMOSOME_I 76 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAACCTAAGCCTCAGCCTAAC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@DCAACBBC@CC@BCBDD=BB>;BDDB>?################################### AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:78T2G9A7G0 NM:i:4 +SRR065390.27871278 0 CHROMOSOME_I 76 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCDDDBCC@@B@AD@BDDC=BBBB@>;@BAA################################ AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:90T9 NM:i:1 +SRR065390.28581901 0 CHROMOSOME_I 76 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCATAAGCAAAAG CCCCCCCCC@CCCCCCCC@C>>B>>C@8CC@CC@@@?A######################################### AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:89C5C0T3 NM:i:3 +SRR065390.30916163 0 CHROMOSOME_I 76 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACG CCCCCCCCC9CCCCCCCCCCCCCCCCC@AC>?<;CCACCCCCB;C@@===;=BBB0A=A################################# AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.32781383 0 CHROMOSOME_I 76 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCAAAG DCCCDCCCCCCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCC?CCCCC@CCC?CC?CCCBCCDA@BB?BB3B>BBDADBDCACCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0T2G0C95 NM:i:3 +SRR065390.7469639 0 CHROMOSOME_I 77 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGC CCBC?CABC>CCBCCACACCCB?CCC@ABCCCBDCA@C@BCB=@<@@##################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:85A14 NM:i:1 +SRR065390.13605737 0 CHROMOSOME_I 77 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGC CCCCCCCCCCCCCCCCCCCBCCCCCCACCCCCACCCDCACCACBABB@B<>BB>B:7;=7=><<<<>A=:?A.@@######################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:95T4 NM:i:1 +SRR065390.14866698 16 CHROMOSOME_I 77 1 100M * 0 0 AAGCGTAAGCCTAAGCCTAAGCGTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ########################################C>3CCAABAA3AA?ACCCCBCCBCCCCCCCCCCACCCCCCCCACCCCCCCCCCCDCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:4C17C77 NM:i:2 +SRR065390.19434606 16 CHROMOSOME_I 77 1 100M * 0 0 AATGCTATGACTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ##############################################@:A80000/=09;?5>>>;AA5A>?CCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2G0C3A1C90 NM:i:4 +SRR065390.30084692 16 CHROMOSOME_I 77 0 56M3I41M * 0 0 GCGCGTAGTCCTCATCCTCAGCCTCAGCCTAAGCCTAAGCCGAAGCCTAAGCCTAATAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ########################################################BA76CCB>B@ACBCA.>?ACC5CCCCCA;CC@CCCCCCC>==?=?@BC@@BCCCCACBACCACCBB@>BA=5BB############################################## AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:79C13T3C2 NM:i:3 +SRR065390.29958565 0 CHROMOSOME_I 79 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAACCTAAGCCTAGGCAGAAGGGCAAGCTC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDBCCACCC=BDDBA>@@@>B################################ AS:i:-18 XS:i:-18 XN:i:0 XM:i:9 XO:i:0 XG:i:0 YT:Z:UU MD:Z:72G10A2C0T3C0C0T4C0T0 NM:i:9 +SRR065390.26894079 0 CHROMOSOME_I 80 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCGCA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCDCC=CCACB;BBBB>8A8AA?=<>:?=8=A?@=D?D=B@B########################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:91A8 NM:i:1 +SRR065390.15628724 0 CHROMOSOME_I 83 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCC00000+0//000000CCCCCCCCCDCCCCA@@BCCCADCCCB;8@BBB>;BBBB@;AA?A749=>:=*9=>@::A?8=3@##### AS:i:-3 XS:i:-3 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:20G79 NM:i:1 +SRR065390.4058482 16 CHROMOSOME_I 83 1 100M * 0 0 AAGCCTATGCCCAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ############################BD:?2;@?24?6?3??86?3?:B>@BB87787>BBBBBBBBBBBBBBA????>:BBB?CACC?C@C@CCC@@ AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:7A3T88 NM:i:2 +SRR065390.31993990 16 CHROMOSOME_I 83 1 100M * 0 0 AAGCCTACGCCTAAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ###########################B9;13>54888@@<@9>>7>7:@A@><8<68@@##################################################### AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:80T15C3 NM:i:2 +SRR065390.268023 16 CHROMOSOME_I 86 1 100M * 0 0 CCCAAGCCTAAGCCCAAGCCTACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #########################################@@B?>?;BBB>>CCC8CCDCCC?CCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCC AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2T11T7A77 NM:i:3 +SRR065390.6919046 16 CHROMOSOME_I 86 1 100M * 0 0 CCCAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ##########################################BCBAB=BCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2T8G88 NM:i:2 +SRR065390.2121410 16 CHROMOSOME_I 87 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ######################?BA;;=:8CDBABDCDA@ADCABDACCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6166783 16 CHROMOSOME_I 87 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##########BB?A?B>BB@>@CABABBA@@@BBDADB@BBCBBADCCBDCCCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7495357 16 CHROMOSOME_I 87 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA B3>6BB=?>BBB4?@>@BBBB;@BBBAB=BBA@=AADDCCCCCCC@@CCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11353312 16 CHROMOSOME_I 87 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##################@7?;<@BB=6>BB?@A@@B;B@BACBDD@CCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15848524 16 CHROMOSOME_I 87 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA 77471AAAAAAACCBAABB>BBDBBDBDDDADDCC@>?@6CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15965869 16 CHROMOSOME_I 87 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #######@7.@B>>?@??@@:,9;3=<:8@>ABB=BBB@>ABBAC:CCCCD@ACCCAACCCCCC8CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17210890 16 CHROMOSOME_I 87 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA D>:>DDD*>?BDB?;BDBB@>BBBB@>DC@CCBAB?CAB@DCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17578845 16 CHROMOSOME_I 87 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA B:=@@1BAAAD>B???@???==;@A=@AADC@ACCCCB=CBCCC@?DCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21562505 16 CHROMOSOME_I 87 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #################DBBBBB@>BCB=D@ADCBABCCCBDCDCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30807379 16 CHROMOSOME_I 87 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #################@@;852A>:?A;AB>C;ABBAB>CBBBA@BBDBBACDDDDB>CCDCCDCCBCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.32276242 16 CHROMOSOME_I 87 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #########################?9>=AB@?@BBDA6DDBCDDBCDCCDCCCCCACCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.33628207 16 CHROMOSOME_I 87 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #####@B@9@77=74>6BBD;?B?B<@>DCBDABBAB?B@ACC=CCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.25375430 0 CHROMOSOME_I 88 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGAAGCCTAAGCCTAAGCATAAGCCTAAGCGTAAG CCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCBCACCDBDBBDA@@BC>B@>.?A??<1@########################## AS:i:-7 XS:i:-7 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:66T16C11C4 NM:i:3 +SRR065390.7789978 16 CHROMOSOME_I 88 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGGAGCCTCAGCCTGAGCCTAGTCTTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###########################################################@C?A@C<;;;5;;;65AACCCCC@CCCCCCCCCCCCCCCCC AS:i:-14 XS:i:-14 XN:i:0 XM:i:7 XO:i:0 XG:i:0 YT:Z:UU MD:Z:30T0A5A5A6A0G1C46 NM:i:7 +SRR065390.22922524 16 CHROMOSOME_I 88 1 100M * 0 0 TAAGCCTAAGCCTAGCCCTAGGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ##########################AA?:CBABABBDBB<;ABBA@@>8BC=>BCBCBACCACCCCADCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:14A0G4A79 NM:i:3 +SRR065390.30422609 16 CHROMOSOME_I 88 1 100M * 0 0 TAACCCTAAGCCCAAGCCTAAGCCTAAGCCTAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###################################################?CCCCCC?CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:3G8T26G60 NM:i:3 +SRR065390.3148788 0 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCC796B@5B=5=@=:*=>><<8@############################# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3974764 0 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCBCCA@CAC@A@DDADBCBAA@BCCBBBC=BCBB>?==>>=??@A@@?@########################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8437156 0 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCACCCCADCCCCCCCCCDDDCCCCA@B@B@BACAB?@BB>BBA>B=>?::D>??B8@?:@######################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12974063 0 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCDDACBCB@;@BD@?@@@>@@@@??(@######################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17247283 0 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCCCABBCBC8?AAAAA>B@BCABB>BB@.=@BA=>==BB@B@########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17845387 0 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCACCCCC8CCCBC;BBBBAAADDDC>BDD>AA@BC?CA>CA>A;0500=A:?AB AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19019558 0 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCBDCCCDADC=B>BBBB;?BB>B>BB8A=A<=@############# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20644304 0 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CCCC;ACCCA8ACCC<8@4@@@5?>@@3?###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29723571 0 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCDADDBDA@BDBDBBCB>BB>BC>>A;@@3D>??D;?#################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30710022 0 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCDCACCCDDACDDBDBDDDBBABBBCB6BBBAC;>AAAAA?AAAA>??@?########### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.33685608 0 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBDCDBBBBCBABBBDBA:;=:<;=AAAB?@=CBB@=C<@>B;@B:A>;BD>AB=@BBD@DAABABCCDDCCACCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15212051 0 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCDCCCCCDD@CDC@DDBB@BDACB?BB=@B=B?D?B5=::A#################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18095819 16 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ################@B;DDBBB;BBDDB>BBDCB=DBBCBCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20762057 16 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ####?7:88;:7@.=>>>BBCB>@D>DB=BDBDDDBCDBBBDCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21120770 16 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ###########################@@?A?A@C@B@BAC@@?@CCACBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23419512 16 CHROMOSOME_I 89 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ###############?=;9:5A?@@2==9=270;7AB;:BDDCBDDDCBCCCCCCACCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.25957119 0 CHROMOSOME_I 91 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGAAGCGTCAGCCTAGGCCT =BB?CA@@@C7?;<<;>CBCCCCCCCCC8?C@CC?@@B>>2B7888*.0000@====;80==.;?;2?######################## AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:81T4C1A6A4 NM:i:4 +SRR065390.256433 16 CHROMOSOME_I 91 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ##########################A>9=;BCA?BBBC@0?@>DB?=B@BBCCC>@ACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6797268 0 CHROMOSOME_I 91 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCATAAGACTAAGCCTAAGACT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCC@AAAAC@CB?@@?@C;15<@9=7/7=<<>@B@B@##################### AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:80C4C11C2 NM:i:3 +SRR065390.7161425 16 CHROMOSOME_I 91 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ####################?8:@2@B;?@B@B>@DBBCB@DABCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10403193 16 CHROMOSOME_I 91 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT 7:;72=9<=:4@@?A?5?>BDC>BB?@>8:??@B9BBDCD>@BBCCCC@ACCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14326039 16 CHROMOSOME_I 91 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ##########?<@??>B1ABABB>BDABBB=ADBC@ACCCBC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16063981 16 CHROMOSOME_I 91 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT 7@7:7+>:=9@@B@=D>4B>@B6@B>B=<>DA@DABC=AC@BC=CCBCCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20404151 16 CHROMOSOME_I 91 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ############?<>A?<<=73:55235124813808A?>8237:=;9?A000/000000?CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24289923 16 CHROMOSOME_I 91 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ###############################AA>A=@A@@@B;CCB@D>CCBCC@DCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28545477 0 CHROMOSOME_I 93 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCGTAA CCCCCCCCCCCCCCCCCCCC@@B@ACCBCCCCCCCCCCCCCCCBCBCC@C;?:7:::@>A>@>B>;@=A: AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3687468 0 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG BCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCBCCCCCCCCACCCACCCCCCCCCABACCCDACA>@@:@############################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6194634 0 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCC@CCAACCCC@CACCC?>ABBC=@@1@CB=CB6><@88:377;ABBBB##### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6316515 0 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCDDCDACBDDBDDBBDB>A>?B@?@5@???##### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7638809 0 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CACCDCADACBACB@CDABB@DBB@@>B>B>B=BAAC>>@:@@@5;79@########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12817194 0 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCBCBDCCDCCBCCDDAABBB@DBCBDDD@DBB@CB>C= AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16588016 0 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCCD@C=CCCBCDC@BBCB@?A@A?@>BDBBB>BAA):=:7D@@D? AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21115573 0 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCDCABDCDD@ABBBB@=BBBA=DBBBB;>B?D?6>B?D?############ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22487510 0 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCBCCADBBDDABACBB=AA?@DDBA:BD?A??B::==::9:*>@############### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9644932 16 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG 77=9==5845?A=??AB@@3BB@CAB;CCCAC>CBCDB@CCCCB?CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12890063 16 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ######@(<9?B4;B:A@;8?BBB9B@>BDB;DBDCCADBCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16020961 16 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ##################?:B*B@@?>?:?57=36C>@@AA=63ACC@CCCCCCCC@@CCBBCACCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28179307 16 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###############?.?=@:B@??@@@@6?B>B?CBA;DBBBB;BBBBBADDBDDBCDDDDDCCACDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28514209 0 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCDCCACCCCCACCCCCCCCCACDCCB@>AABB>=B?A??=BBB>B8=>>8><@?62;B=@############### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29025503 16 CHROMOSOME_I 94 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ##########A@63@;CCAC===@=>B?BBBB?BBBABBDBCDDDCDBDBCBCCCBCBCACCCBCCCCCCACCCCCCCCCCCCCDCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.25192538 0 CHROMOSOME_I 95 0 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGGCGAGGTTTAGCAGGAATGCCGAGACTGATACGACAACCCAGCCTCTGCCTCAGC AAAA>?A>A?@@B@>>?=>?58:>:AB<>B>>:B################################################################## AS:i:-56 XS:i:-56 XN:i:0 XM:i:28 XO:i:0 XG:i:0 YT:Z:UU MD:Z:42A2C1T1A1C0C2A0G0C0C0T2G0C1T0A2C2A1G0C1T1A0G0C1T0A5A0A4A3 NM:i:28 +SRR065390.28309751 0 CHROMOSOME_I 95 0 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAATCCTACGCCTAAACCTACACAAAAGCCTAAGCCTAACCCTAAAG AA>AACCCCCCCCCCCCCCCACCCCCACCCC5BBCCCCABDDDDBDC>@B################################################## AS:i:-20 XS:i:-20 XN:i:0 XM:i:10 XO:i:0 XG:i:0 YT:Z:UU MD:Z:56G4A6G4A0G1C0T14G5G0C0 NM:i:10 +SRR065390.28547696 0 CHROMOSOME_I 95 0 77M1I22M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCGTAAGCCTAAGCCTAACCCTAAACCATAGGACAACGCTAAAGCCTAAC B?CCCCCBCCBBBB=@BB:>:>B>@B>BBB@B<@@B@=ABAA;>>B?D>DAD################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10373067 0 CHROMOSOME_I 96 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCDCCCCCCCCCCCCCCCCCCACCCCCCCCCBD=CCCCCC?CA??<=AB<=A@A@@6A?AAB>@?B@B;B>?8DD>AAA>?>????3>8989A=;4A?;8;17888@############################################# AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:86C5C3A3 NM:i:3 +SRR065390.14825713 0 CHROMOSOME_I 96 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCBBAAB@AD@BA=BBB=ABABBC@4>B=5=>AB>DA5<@@@86@=@< AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15608785 0 CHROMOSOME_I 96 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCBCCCCCCCCCBCDDBDABBB>BBA@B>ABBABABBB>A4B=;9>5AA######## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29977405 0 CHROMOSOME_I 96 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCDDCBBBDDDDBDDDDDAADBBDABAABB>ACCBC>:<@@@##################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7301839 0 CHROMOSOME_I 98 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTACGAGTAAGCCAAAGACTAAGACTA CCCCCCCCCCCCCCCCC4>@################################################################################ AS:i:-14 XS:i:-14 XN:i:0 XM:i:7 XO:i:0 XG:i:0 YT:Z:UU MD:Z:69A6A1C0C6T3C5C3 NM:i:7 +SRR065390.253303 0 CHROMOSOME_I 99 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGCCTAC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCB?BC@=CCBC@BBC?;@############################## AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:89C9A0 NM:i:2 +SRR065390.1116804 0 CHROMOSOME_I 101 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCTATGACTAAAC 0000089938?:?>8:8:<>785;;@3@@@######################################## AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:93C2A3 NM:i:2 +SRR065390.15284472 16 CHROMOSOME_I 102 0 79M3I18M * 0 0 AGCCTAAGCGTATCCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAATAAGCCTAAGCCGAAGCCTAA ###################################################A9<>>>BBBB>BBB>>88>/???89B>BBCC?CC00000:9:<;@B?CC AS:i:-24 XS:i:-24 XN:i:0 XM:i:4 XO:i:1 XG:i:3 YT:Z:UU MD:Z:9C2A0G74T8 NM:i:7 +SRR065390.32407240 16 CHROMOSOME_I 102 1 100M * 0 0 ACGCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC ######################################A=::@@A853;200*.054B5?=0=AA3338900.0/CCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1G0C97 NM:i:2 +SRR065390.2751803 0 CHROMOSOME_I 105 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCGAAGCCTAAGCCTAA BCCCCBCCCCCCCACCCCC>CCCCCCCBCBCCCCCCCCCC==:AA@CCCCB=BC:+0100C?CC?######################### AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:80A4T14 NM:i:2 +SRR065390.9101383 16 CHROMOSOME_I 105 12 100M * 0 0 CGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###########################################################A<7?<1?CCCC@ACBACAC?CCCCCCCCCCCCCCCBC@CCC AS:i:-6 XS:i:-18 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T35T0A61 NM:i:3 +SRR065390.19805019 16 CHROMOSOME_I 109 1 100M * 0 0 GCCTGAGCCGAGGCCTAAGCCGAAGCCGAAGCCGGAGCCGAAGCCTAAGCCTAAGCGTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #################################################################C>C:CCC@CC@CCCCBBCCCCCCCCBBCACCCBCC AS:i:-18 XS:i:-18 XN:i:0 XM:i:9 XO:i:0 XG:i:0 YT:Z:UU MD:Z:4A4T1A9T5T5T0A4T16C43 NM:i:9 +SRR065390.634578 0 CHROMOSOME_I 110 0 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCATAAGAATAAGCCAAAGCCTAAGCCTACGCTTACGCTTACGCCTATGCCTA >@C@@CCCBCCBCCC@B@5BAAAAA@BBBBB@BBAB(BBB?;;;?####################################################### AS:i:-20 XS:i:-20 XN:i:0 XM:i:10 XO:i:0 XG:i:0 YT:Z:UU MD:Z:49C4C0C6T13A2C2A2C2A5A5 NM:i:10 +SRR065390.14445465 16 CHROMOSOME_I 110 1 100M * 0 0 CCTGCGCCTAAGCGTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ##############################C?BBB=AAA:'000(0=AAA>?CCCC@8@BCCCCCCCCCCCCCCCC?@C@?CC@BBCCCC@C@C@CCCC AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0C8A0A3T12A72 NM:i:5 +SRR065390.19877275 16 CHROMOSOME_I 110 1 100M * 0 0 CCTAACCCTACGCCAAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ##############################@=9==(B?<B>B>>B>>>A>B>BBB<>BB888:;00./0::72;CCCCCCCACC AS:i:-16 XS:i:-16 XN:i:0 XM:i:8 XO:i:0 XG:i:0 YT:Z:UU MD:Z:3A0A4A4T0A5A0A4A72 NM:i:8 +SRR065390.4419 0 CHROMOSOME_I 111 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAA CCCCCCCCCCCCCCBCBCCCBCC8CCCC?C@CCCCC@CC@C@CC8C?@5BCC@;@CA>@@=:>>532:;8A@A@########################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92A7 NM:i:1 +SRR065390.6629332 0 CHROMOSOME_I 111 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCADCACCC@B=ACBBB=CBD?@BB>B@DB>>.>=>>*4;77A@?A>DB<:?=@@,8 AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:80A19 NM:i:1 +SRR065390.13561281 0 CHROMOSOME_I 111 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCADDCCCC?CCC@CB8?*?:7==8==@<@:@######################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:97T2 NM:i:1 +SRR065390.13848363 0 CHROMOSOME_I 111 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCBDCC@CCAA?DCBBADBD>>>BB>>B1DAB;B6B9DD###### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:99A0 NM:i:1 +SRR065390.15692749 0 CHROMOSOME_I 111 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCC@CCCCB@BAC??>B@B@B?<:??C8@?A8A####################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.27886908 0 CHROMOSOME_I 111 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTGAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCBBBDBD@BCBBAB@############################################# AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:56A43 NM:i:1 +SRR065390.32433607 0 CHROMOSOME_I 111 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAATCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCDCCCD@BBCB*A:A?:@BBB?BA@BA;BBBBB=B>>B@;=>;<::82>8<59 AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:58G41 NM:i:1 +SRR065390.32577253 0 CHROMOSOME_I 111 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCGTAAGCCTAAGCCCAAGCCTCAGATTAAGCCGAG CCBCCCCCCCCBCCCCCCCBBCCCCCCCC=CCCC?CCCCCCCCCCCCCCBADCCDACABCD@DAB@BBBBC@AB@@################################# AS:i:-5 XS:i:-5 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:6C93 NM:i:1 +SRR065390.27208864 0 CHROMOSOME_I 112 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCGTAAGCCTAAGCCAACGCCTAAGCATAAGCCTAAGCCTAAGCCTAAGCGTAAGCGCAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCC?####################################################################### AS:i:-14 XS:i:-14 XN:i:0 XM:i:7 XO:i:0 XG:i:0 YT:Z:UU MD:Z:41C12T1A8C23C5C0T3 NM:i:7 +SRR065390.14809419 0 CHROMOSOME_I 114 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCCAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCC=CCCCCCCCDCCCCCDCCDCCBCBDCCBDBBCDBDB>BDABAABBC@BCBBC>>A?B?B>?AAA>A4A=9@####### AS:i:-4 XS:i:-4 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:22T77 NM:i:1 +SRR065390.20842573 0 CHROMOSOME_I 114 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCC@CCCBDDBCDDB>D@A==:9@256&(3036-@@@3@#################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:68C31 NM:i:1 +SRR065390.349756 0 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC@CCCB=B<>BB@= AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8856958 0 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCC@CCC?CCCCCDCCBDCDDBCA?>AA@@?BB?;B::2=4=B################################# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19124748 0 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CCCCCCCCCCCC=CCCCDBCCDDACCB<<=@?B@6@?BB>B>?>9>(:=979A#### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23327180 0 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBDCDCCBBABA@@B@BB6BB@BAAAC?CAA>=@@<(@########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24595212 0 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCACDCCBB@DDDAA>DBDBA;AABB?6DBD>?=??B>@9<:=<;46@@@:@############## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.802879 16 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ###############?05@@@@;BBAA=CCCBA6@@CCCC?CCCCCCCCCCCACCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9215590 16 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ######?=?:@6B@@C<=A?A?8@@B@B@@B?8CBCDBB;>==BDADDBDBADBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13357175 16 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT B>::@@D<@??:?DB?B;D>BAB=B@DB>@DDBDBABBDC@ACACCDACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13460510 16 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #########################C@<B>B@@@@8BCCDD>ACDBCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24138882 16 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ##############################@?BA?<;BCBB@ABC;DBA@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29591166 16 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #########################@@<81=@@<BBBAADDBDBDDDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29698542 0 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCCCCCCDCCACCBCCACABAABCBABBBB@A@?@AAA?####################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30439372 0 CHROMOSOME_I 115 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCD@BBBCDDABCCBCDBC>BA@DABB>BBB;>BABABB>B?>ADB>B AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6134052 0 CHROMOSOME_I 116 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTACGCCTAAGCCTAAGGCTA CCCCCC@BCCC@BCBBB>@B9<;88@@:@:8778;88;;>=:3@@76384@<@@############################################## AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:74T7A13C3 NM:i:3 +SRR065390.10167659 0 CHROMOSOME_I 116 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCATAAGCGTACGCCCA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCB=;ACCC@=AACC=?@@=@;(?@?################################### AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:85C5C2A3T1 NM:i:4 +SRR065390.14472485 0 CHROMOSOME_I 116 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCGTAAGCCTA CCCCCCCCCCCCCCCCCACCCCCCCCCCCCCCCCCCCCDCCCCDBDCDDDDCBDDDCDDBBBBDBBBAABD>DD3:=>A><==A################ AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:86T4C8 NM:i:2 +SRR065390.16076532 0 CHROMOSOME_I 116 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCGCACGCCTA CCCCCCCCCCCCBCCCCCCCCCCCCCCCC@BCBCCCCCCCCCACCCCCCC?CCCC4;???@=B=C?A?A;??<B;==?############### AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:91C0T1A5 NM:i:3 +SRR065390.28531075 0 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAC BCCCCCCCCCCCCCCC@CCCCCCACCCCCCCCCCCCCC=CACCCCCC@BDCC################################################ AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:99A0 NM:i:1 +SRR065390.32393251 0 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCCCCC@BCCA>B?CB@CBBBB=@B?BBB75@;<>BABBABBB@@CDAA@CBBCCDCCD@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.2710794 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##################A,A?@9A59>;<1@AB<@5=BC9;9:3CCCCCCCBBCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3026627 0 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAA CCCCCCCCCCBBCCCCBCCCCC@CCCCCCBCCCCCCCCCCCAC?CC?CACCBBCCAC=?@@@?@BBAB@C############################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:97T2 NM:i:1 +SRR065390.4690010 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ;=<@@9355*;B@@B>B>BB:BBDBBB4BBAA;8AACB@@CBBC;DCCCDACCCCCCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4869028 0 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTACGACTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCDCCBCBDCBBBBBB?########################################## AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:87A5A1C4 NM:i:3 +SRR065390.5729393 0 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGTCTAATCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCDBBDADDD?DDA?BD>B>CBBBBD:>2B#################### AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:89C4G5 NM:i:2 +SRR065390.7269481 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ############B??@@@@8>@BBB>BBDBBB>ADABBBCDDCBCCDCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10010220 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##########AA?==??>BBA6BB>B>;AB?DA@@DDBC@DCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10563492 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##########################################@:A@6@??AAC@C@?3B@?BCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11835411 16 CHROMOSOME_I 117 0 100M * 0 0 CCAACTCAACGCCTCTTCCTATCCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #########################################CCA=ABCCCCB@6CC@CCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-20 XS:i:-20 XN:i:0 XM:i:10 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T2G0C1T1A4A0A0G4A0G77 NM:i:10 +SRR065390.11890498 0 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCB?CBCCCC@6>BA>>>ABC>>@DABBD>D@BABDDCDBCCBCCC@DCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13274061 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##################A91=:?B?D;BBB>AA=BBBB<=BCA@8AAB@CCCCCCC@@BA6>BBB@D@B?BB>BBABDAD@A@CCCBCCAACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15182324 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA AA?>5BB?D;BABB=>BBBBAABB;DABDD@CDBCAACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16508065 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA =297=@>>:@=?@:8B@BBBA=>BCB@C;CA8AC@AAACBCC@CC=4CACA;=@@###################################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:87A12 NM:i:1 +SRR065390.16618625 0 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCTAAGCCTAAGCCTAA CCBCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCC@CCCCCC@CA@A>?ABACCC?8A@AA=CB?AA@BB(??B=A*553;;8>?66:9:>+?;79 AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:74A25 NM:i:1 +SRR065390.16909890 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA A.=:@>>B8@B@B;BBACBAB@BCADBDCCCDDACCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17985359 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##################A<48@B58=9=>=8=?B?>B3B=CDDBBB>@CDBCBCDDCCDCCCCCCCCACCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20428024 16 CHROMOSOME_I 117 1 100M * 0 0 CCAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGAAGCGTAAGCCTAAGGCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ######################################################################################AAAA1/555/0000 AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T29T4C10C52 NM:i:4 +SRR065390.25333072 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #####################?B>DD?>BBBB;?>@BABBBACABBDDC@DBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26734455 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ################?A?@=;CBBA?>BAB>AABDDAA@DCDBBDCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26915421 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ####################@?=:6@;;7/4;5550>DD>>BBBB@B1DBBBB:;CABD?DC=AD@BACCACBCCDCCCCBCCCCCACCCCCCCCCCCCCCCCCBCCCCCCCCCBCBCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.32532096 16 CHROMOSOME_I 117 1 100M * 0 0 CTAATCATAAGCCTAAGCGTAAGCCTAATCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##################################################################A5?A000003699;:;<8:9;<99BC@CCCCCBB AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:4G1C11C9G5G65 NM:i:5 +SRR065390.33077092 16 CHROMOSOME_I 117 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ############?7=;?=A?>@BBA=@?DCCA@CACCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4104352 0 CHROMOSOME_I 119 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCDBDCCCDBACCCDACCCCBDBDDBD@BBDCBBBDBBBABBABBABA>BAC;>@>?####### AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98G0C0 NM:i:2 +SRR065390.11335401 0 CHROMOSOME_I 119 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCCAAGCCTCAGCCCAAGCCCCAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCC@CCABCDBCACBBBCBBB:A>??C################################### AS:i:-12 XS:i:-12 XN:i:0 XM:i:6 XO:i:0 XG:i:0 YT:Z:UU MD:Z:71T5T6A4T5T0A3 NM:i:6 +SRR065390.19440436 0 CHROMOSOME_I 119 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCGTAAGCCTAAGCCTATGC CCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC=@CCC@C@BAAA################################################## AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:82C14A2 NM:i:2 +SRR065390.31062597 0 CHROMOSOME_I 119 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCCAAGCCTAGGCCCAAGCGCAAGC CBBCCCCCCCCCCCCCCCCCCCCACCCCCCC=?CCCCC?CC;;@@BBB@B@BC<@;;9>7@:=@@################################### AS:i:-12 XS:i:-12 XN:i:0 XM:i:6 XO:i:0 XG:i:0 YT:Z:UU MD:Z:71T5T7A3T4C0T4 NM:i:6 +SRR065390.21240567 16 CHROMOSOME_I 119 1 100M * 0 0 AAGCCTAACCCTAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ########################################A::A48>,57/C6CC@CCBCC@CC?CCCCCDCCCCCCCCCCCCCCCCCBCCCCCDC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:8G11G79 NM:i:2 +SRR065390.473388 0 CHROMOSOME_I 123 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CACCC@CCCCCCCC6CCCCCCDAB?@A=C;CA@=BA######################################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5212583 0 CHROMOSOME_I 123 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CCCCCBCBCDDA>BDBD=>?B>BB3B@B@@@DAC?C;>D:?<(79.:@<@@= AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6106911 0 CHROMOSOME_I 123 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CBCCCACCA?79878B@@?B78678B??>?>=AAABBBBA8A;>>B>:>BB<>?>;???######################################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7281918 0 CHROMOSOME_I 123 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CDBCCBCDCCC@CDDDDBDBB@BBABB>AB@BD>B?85=797/@<:8 AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14025609 0 CHROMOSOME_I 123 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCC>CCCCD@BCDDBBCDAC?@A@DDABDA=D53885@?:A@@BDBB?3?>;=A######## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19641253 0 CHROMOSOME_I 123 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCAACCCCCCDCD@D@B@BD@B>BDBAB8>??A??;@B@D;?3==?B6?A##### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20334733 0 CHROMOSOME_I 123 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCACCCCCCCCCCCCCCCCC@BCAD?@@@BB@<1?################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22745112 0 CHROMOSOME_I 123 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCB@BDCCBCCACAAD=DDBA>B>@BB6B@AD?###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.25556189 0 CHROMOSOME_I 123 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCDCCCCCBCCCCCCCCCCCDBCDDDBBBBBBBCBCBAAB@BBA@################################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.27641394 0 CHROMOSOME_I 124 0 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAACCTAACCCTAAGCCTAAGGCGTAACCCAAACCAAAGCGCAAGCGCAAC 88;68;;:;9@?>AA@CCCCCCCCCCC@CCC@C<>>>CCAC@A-@####################################################### AS:i:-28 XS:i:-28 XN:i:0 XM:i:14 XO:i:0 XG:i:0 YT:Z:UU MD:Z:51G5G12C1T0A1G2T2G2T4C0T4C0T2G0 NM:i:14 +SRR065390.9280611 16 CHROMOSOME_I 124 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG @@D=6@@6@@A?=ABABAA@B>=BCDBCDBBDBBDBDDADC=DCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12478066 16 CHROMOSOME_I 124 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG #####B@@A?DB??@A:?AD=CBB>BCBBBADBBBDBABBDDDDCDCCDC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.25264436 16 CHROMOSOME_I 124 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG #######################@<766>><:4==:5==;C??@?=ACCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.32908522 16 CHROMOSOME_I 124 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG #############################@B=>><:CAB@=DCCAACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24389795 16 CHROMOSOME_I 125 1 100M * 0 0 ACGCCTAAGCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #######################################BBB=>DABB>BDCDDBBBCD@DCDCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1A10A87 NM:i:2 +SRR065390.7886550 16 CHROMOSOME_I 127 12 100M * 0 0 CCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #####?6@??AA;AAD:6@?A=CAC;;<;7<1B@@>BDDBB@B@BDBABBAB>>;BB8=;@BD::;>D#### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3825439 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCCCCCCDCCCCCBCCCCDDCCD@CBCCDDCBDBABBA@DBDBBBBCBBABBC>BAAA>D@######## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6176897 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCC@CCCCCCCC@ABCCAACCDCBBBA@ABABA@:@:??BBBA@DBAAAB>?B?:>B@@ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6179290 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCDACBDCBABDBD@BBDDDBAAABBA>BCABB>A=4>>/=0298696=@##### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9176327 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCC?CCCDDACDBDC>@BBAB=;?BBB4@@BD:3???5=:8>>9@:6@##### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10096114 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCDCCDBCBADABDABBAA=B>B@?BD;4@7>9=7==>>> AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12408086 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDBAA>DBDBB@BBAD=@?B?B?4A??B:A?AA<(@ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15769247 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCACDDADDBA@B@BBBB>B6B?B@?########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16538618 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCC?ACCCCBCCCC@ABB@B:6BB8A?7@<><@:9?################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18630353 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCC@@CCDA?BBDBB@B@BB;@?BB>B;?<>=>69@:86A3=@@##### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21703645 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCDDCCCA?D?C@CB@@B@@CDA@:==@@@<@@=?=>BCABA##### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24795092 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCBCCCCCCCCCCCCBCCCCBCCABCACA<;;??C@;BBBD?6@@@@>2?@;8::>9>A11@###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.31111380 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCDCCBDCBDCBDBBBDBDDBBBA@BBDBA@BBDDAACAB?:DD:??@><@<@@@ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.1774013 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ###################@=379:@=??D>@<7D>>@B@DDB@;: AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3893380 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ####################A?0@A@=>8CCC@B=@CC?B@@CCAB@ACCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4975116 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #############B??8B?B8>>DB?=;8?BB@B@;BBB=>DCCBCABCCCCABCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5530338 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCC?CCAAACDDBADBADDBBBAB@BB@;@B??################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6465879 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #####################?;@B;;>5A38;98BBDBBDDDC@BCCBCCCCCCCCCCCCCCDCCABCCCCCC@CCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6537766 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ################@8?=?D=6B>:==>?C;BBA5DBCB@BBAB;BCCBCB;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7401229 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCDCDCCCCDCCCCCCCCCCCCCCCCCCBBCB@CACABCBAA@BBB?=B;>B=5AA??@AB@=6=8=CC>AC;:??8;5/-51B>2A###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11449581 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA 7=741.8A;4B>>AAAB>AB?>B@BA@?A?/000(@AA>:C=;CCCCBCCCCCCCCBCCCCCCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11762556 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACDACBADDBADDBB@DB@BBDBBACBCCC>A??>?<8B### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11780901 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ######@@@@=<@@@68=>=>BADABBB6BB;BB>@CDBAA@CBBDADCCCCCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12246013 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCCCCCCCCCC@CBDBB@DBB@DBCBB;D@D?@B>?B=0=====;:@@@@@:@CCCCB?ACCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13762870 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ###############A<>=@92757;;?8ABBB>B@A;BBB<>;B6B;@AAA;:BD:?@*5@@17@### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21762505 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #############?:1,@>B<<===>8@6@DB?@?ABBB@ABADBBDDBCDBDCBCCACCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21990338 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #############A=452==:=?=?@:?::@5?>=8:<=C?C@CCCCC@CB?CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23838269 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCABCCDABDDCBABBBB>@=93=7=BBBB?0?:A=47@7@8/8<8@######### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24259901 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCBC@BCC@;CB@@BB><@@B@;;A??@:.?>9B:9>@@@(6=@####################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26950543 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #################################################A@B?@@CCACBCCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28049981 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCDCCDDCCCDBBA>B@>B>@?BDB@???<:?.75377?DAAA############### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28919001 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #########################?:6>6@B6@@@B>D>AABBABDBACDADBBDDDDDBCDCDDCCCCAC@CDCCCCCCCCCCCCCCCBCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29600181 0 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDBBDBDB?<@@6@?>9;9@############################# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29907490 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #########################@:<=2A8=B>6;A?@B@?>BC@B;CACBDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30476269 16 CHROMOSOME_I 128 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ########################@9/<22A?5:9@D>=D>A@BCAABDDBBDBCDBDCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9576969 16 CHROMOSOME_I 129 1 100M * 0 0 CTAAGCCTGAGCCTAAGCCTGAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###################################################AA=AA4A?AA.=AA;>7<>>58>>>71;<>;;7300000<>9>>@A??? AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:8A11A79 NM:i:2 +SRR065390.9988260 0 CHROMOSOME_I 129 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCCCCCCCCDA>A;C@=@;C@@@A@@############################ AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:79T20 NM:i:1 +SRR065390.10035310 16 CHROMOSOME_I 129 1 100M * 0 0 CAACGCCTAGGCCAACGCCAAAGCCGAAGCCTAGGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ########################################################A4?==:C?C>C@C@??><>@:@C@B@A@@CCCCBCACACC@CCC AS:i:-16 XS:i:-16 XN:i:0 XM:i:8 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T1A5A3T1A3T5T7A66 NM:i:8 +SRR065390.29366441 16 CHROMOSOME_I 129 1 100M * 0 0 CAAACCCTAAACCTAAGCCCAAGCCCAAACCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###################################################A=@A>@BBBDA=CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-12 XS:i:-12 XN:i:0 XM:i:6 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1T2G5G8T5T2G71 NM:i:6 +SRR065390.3937302 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCC?CCC?CCCCCCBCD?CCBCCBDC@CCB@==@A@@@B?8B?B?===?@?@A>?>A AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4086234 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCAADCCACADDAB8@BBBB>?BBBD>B?BBACAB>BBA########### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4778767 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGCCTAAGCGGAAGCGTAAGCATAAGGCTACGCATAAC CCCCCCCCCCCCCCCC@ACCCCBCCCCCCACCCC@ACCAC=9CBCA<=?CA>=;BA@?########################################## AS:i:-18 XS:i:-18 XN:i:0 XM:i:9 XO:i:0 XG:i:0 YT:Z:UU MD:Z:58C12C0T4C5C4C3A2C3G0 NM:i:9 +SRR065390.8295829 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCDCBDDBBCBBABBBBB==BB@@8@?@:>@@@A.:;8>A*<=8< AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10871940 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCDDBDDCCDBBBC>A############################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12095552 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAAGCCTCAC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDACCCBADBBC@4A)0.//A=>=6?>>:A>=@D99.@################# AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:84T12A1G0 NM:i:3 +SRR065390.13775982 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCC@CCDCBDADBC@DDBAB>BBB>=??@B@@?@>BD AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15558825 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCAACCCCDCDBDBCDC@DB5BB@>@@;=A;?4@?############### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16058509 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCACCACCBBCACC@DCBDC>CCABCBBC3===;DACBA;A:?########################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19900294 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCABACCDBDDABDABBA####################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19995334 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCBCCCCCCCBCCCB@BDCCBCCCDBADBBB@BBABBDAB@ADACD=>88A@@:=<>=A####### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21017432 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBDCCCC@DDCCCDBA=AA=>>:?<@BB8>B############################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21103370 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDBCCCCBBCDDCB;ABABB>?BB?@############################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23568099 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CCCCDCCCC:ACCCAC>B>@@;C9=<8==BCAACCBB8;:69;37:5:3;9?########### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24833775 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCDDDCBCDBDDBBDBCDA=DBBDBBB>BA6BA>BB??:??A?AAA@= AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24981819 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCC?:CCBCCCCCCCBCCCCCBCCCCCC@CCCCCCCCCC@@CCC?CCC:C?CBCBC@BCB>@>@@.=9>9B@BB5@#################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26074983 0 CHROMOSOME_I 130 0 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCACAAGCCCAACACTTACACCACG CCCCCCCBCCCCCCABCCCCCCC@CCCC>CCCCA@?CCBC3;A==<=;AD3BD;D@BB?=AAAA?>??###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28071689 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACBCCCCCACCBDCBDC>BADA?BB=A@>>8=48(;88/? AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28757581 0 CHROMOSOME_I 130 0 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACACAAAGCCTAAACAAACGCCTATGCTTATTCAAAATCCTAAT CCCCCCCCCCCCCCCCCCCCCACCCCCCCCCCC=CCC?C@8?>>>B>B5B################################################## AS:i:-30 XS:i:-30 XN:i:0 XM:i:15 XO:i:0 XG:i:0 YT:Z:UU MD:Z:57G0C1T8G1C0T1A5A2C2A0G1C0T2G5G0 NM:i:15 +SRR065390.29809470 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDD@CACDDADBDAAADBDB>;DBBB>BBABAC>ACB@3@@6:95*@########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.32683144 0 CHROMOSOME_I 130 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCBCCCCDDB@BDBD>ABBADAABBBBA?>ADB>=AAABC>>C AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.24353773 16 CHROMOSOME_I 130 0 7M7I86M * 0 0 TAATCCTGCTTAGTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA @@@9@<>>=>1BBB>?@B>A>?B;AB@>>B<;<>>?7?C=CCC907=9728*82*3-3:=<9>@>BA>=+>@############################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:72A27 NM:i:1 +SRR065390.9158702 0 CHROMOSOME_I 131 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCDBAAD@C@@=>BBCBBDB>ABBBDABDAADBB?D############################################# AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:55A44 NM:i:1 +SRR065390.27452830 0 CHROMOSOME_I 131 1 100M * 0 0 AAGCCTAAGCATAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCC('/(/BBBBBCCCCCCCCCCCCCCCCCCDCCCCCDCDDCCDCBD?DDDBDDBBBDBDABBABB>A:B@;@>3@?@?:;6:@/?688<3:: AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:10C89 NM:i:1 +SRR065390.31152354 0 CHROMOSOME_I 131 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCDDCDCCDDDDDDBABDBBBBBBDBBBBAB>ACA@>.@D1/;>>@<6@##################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:79A20 NM:i:1 +SRR065390.33386269 0 CHROMOSOME_I 131 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCACACCBDCCBCDDCABCABCABBBCB;>BB??AA;9=8=?>BB?BB4;B;B>B=B@D=CDC@CCCACAD@DAC@CCCCACCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8335531 16 CHROMOSOME_I 133 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ?DBD?=A?A?66A>BB<>B@B@??@>DAABCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8716276 16 CHROMOSOME_I 133 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ###########@??8B;D@@BAB>BB@BB>BB@>@;@CBCC@C?@ACCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12206123 16 CHROMOSOME_I 133 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #####################################@:BAA?AC@@A:5<@53;97>DACCDBDCCCBC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13431089 16 CHROMOSOME_I 133 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ###############@3??A?:B@=>ABDBBDCBBDABADBBBCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14308521 16 CHROMOSOME_I 133 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT 35880;A6AA?DAA@A=AACBC;CAADBBBBDDA@BBBDBACBBCDCBDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17911869 16 CHROMOSOME_I 133 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ####################################ACCAA38C>@C>@ABCCCCCCCCDCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26803411 16 CHROMOSOME_I 133 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ############AA@@31BDB?>@B@A?>8B@BBD;BBBBB>B@@BBACBCCA@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29004521 16 CHROMOSOME_I 133 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ###################A>??=?BBD>BBADCABBBD?DABBBDBADDCACDDACBCCCCCCCCACCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.32891184 16 CHROMOSOME_I 133 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #########@@:@@?A;?@??@@@BBBBC?@@@BB>>BCCACC=A==;00000.0000/0+00@=A@################################################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:73C26 NM:i:1 +SRR065390.19147644 16 CHROMOSOME_I 134 1 100M * 0 0 CCTAAGCCCACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ####################?>?@BB0B?<@B=@BDDBABCCBCDCCDBACDCDACCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:8T1A89 NM:i:2 +SRR065390.24348183 16 CHROMOSOME_I 134 1 100M * 0 0 CCAACGCCTAGGCCTGAGCCTAACCCTAGGCCTAAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #################################################################AA@AAAAA?AAA:?A@7@2@:@A@:>>B9>A0?A0 AS:i:-14 XS:i:-14 XN:i:0 XM:i:7 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2T1A5A4A7G4A9T61 NM:i:7 +SRR065390.26237014 16 CHROMOSOME_I 134 1 100M * 0 0 CCGAAGCCGAAGCCCAAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ###################################?CA8B@CCC=BCCCC?DCCCCCCCBCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBDCCC AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2T5T5T5T79 NM:i:4 +SRR065390.26715609 16 CHROMOSOME_I 134 1 100M * 0 0 CCCACGCCTAAGCCCAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #########################@4/>BB@A?BBC@B@B@CD@ACCCCCCCCCCCCCCCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2T1A9T8G76 NM:i:4 +SRR065390.29763377 16 CHROMOSOME_I 134 1 100M * 0 0 CCTGAGCGTAAGCCTACGCCTATGCCTAAGCCTAAGCCTACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA ###################################################################?A9?A?BB>><>;AAAAA>>;><>8>8>??B?: AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:3A3C8A5A17A59 NM:i:5 +SRR065390.5592165 0 CHROMOSOME_I 135 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCBCCADCCCCBABDD@DAB=DABB@@@B5>@==B>=B:=>9>A@?><(@/8<8@6:96 AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5867686 0 CHROMOSOME_I 135 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCCCACCCCCCCDCCC@;CCCCCABCACC>DDBBBBB?BADAB>BBB>C;?>>?>B8;??5;@.;>8@## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10729660 0 CHROMOSOME_I 135 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBBD>B@BCCCCCBCADCB?BABBBB:;B@BB>BADBBC;BBB:B0?@??B>CB>>A>BAA6=>? AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12631494 0 CHROMOSOME_I 135 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCBCC@CC?@BB@CDAABBABAA1?>A?=AA=A;9@?A@*?/B# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14201144 0 CHROMOSOME_I 135 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCC@C;C>ACC?C=CCCB6BCCB5BA@@C##################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16211946 0 CHROMOSOME_I 135 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCADCCCCCDDBBCCABA@CDBDB5DBBD@279;9B>@=@B@@?<@@ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16765976 0 CHROMOSOME_I 135 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCBACBCABCD@ABB>AD<=<:87?<=?98=8?########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16773580 0 CHROMOSOME_I 135 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAATCCTAACACTAAGCCTAAACATAAGCCTCAACGTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC6BABB<@3>?=1==;D?6D########### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28919583 0 CHROMOSOME_I 135 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCACCCCCCCAACBAB@=BBBBB=B@B8:<@=D??;?7@8<19=992@6@################# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.33072912 0 CHROMOSOME_I 135 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCACCCCC@BBABAADBD@<6B?3?A@A::<:9 AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4862525 0 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCDBADCCD@BBDBBDDDDD>A>==?;?BB??B::995>.@@@############ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5774599 0 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCBDDBBD@@ADBBD@BAABB?D>;?B?>D?D:A2?6=79;9 AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13990332 0 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCACCCCADCDBCCBABACCBBBBABBB??C?;B97;=3>=>>=5-;37=<8=< AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17419760 0 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCACDCCAABCDDD@?B@C@BDDBB>>ACBB6DB########################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.21031614 0 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDBCCDCADCDBBB>DBAB?:BB?@?>BB>@3DABB?ACAC>????D@########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29523788 0 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCADBDBBBCD@CA@BBBABBDABBDBABABBA############### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29752320 0 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCDCCCCCCCCDCCDCDDCDCBBBDBB>ABDBB@ABABBBD;AACBAAAAACCAABAAACC@@:;9@############## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.32757960 0 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCDCCABABBCA@CCB@@BDD@@B@BBB@BBB>B@;@B8@87B;;;>5@<@?=62A##### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.1606697 16 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###############BBBB>?4@?BABCB>CC8B@BAACCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8349937 16 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG =43?@B6>:???:D?B>B>D?BBB?DABDDBBADCD;CBBCDACABCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9584086 16 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG #######################??>A?AA>=9=5>A>AA>AA1@>@D@>6B??:?>:?B>??>?B:@?>BBBBBBDD>8?AA??>8@BB>=ABCDDACC@CCABCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15429543 16 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ######################A=:B6ACAAB?CACABBCCCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16332923 0 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCDCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCC?CCCC?CCCCCCCCCA@?BCCBA@@CB=?:5B>BCCACCAC@CCCCCCCCCCCBCBCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19757045 0 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCC@?CCCAAACCCCA;>?>?>CA@BA>AA<<BBD>@D@CADCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23337581 16 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG #############################################?7<1:8?CCCCCBCCCCCCBCCCAAA??::<<<<<< AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.25202138 16 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###############A@>::>BBB>@@?BB@>@=BDAA@DCCCB@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28056173 16 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG #########@@8'55<@3=@A:?=BADDBCDDDADCDCACCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28190925 16 CHROMOSOME_I 136 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG #########################@8???30235=*??@CBBB>;CC@CA@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13943605 0 CHROMOSOME_I 139 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGCCTAAGACT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCACCCCC9@BB>A87=>@?################################# AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:85C11C2 NM:i:2 +SRR065390.323629 16 CHROMOSOME_I 139 1 100M * 0 0 GCCTAAGCCTAAGCAGAAGCCTACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ##########################ABBA@@@==0===A8@?>>@@;CC=@@7@C8C8CCCC@CCAC>@C=C>CCABBCCCACCCCCBACCCCCCCCCC AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:14C0T7A76 NM:i:3 +SRR065390.14693556 16 CHROMOSOME_I 139 1 100M * 0 0 GCCAGCCCCGACGCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ##############################A=@:;==AA===7=>?BBCCC@@CACCDC@DCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-14 XS:i:-14 XN:i:0 XM:i:7 XO:i:0 XG:i:0 YT:Z:UU MD:Z:3T0A0A0G2T1A4A83 NM:i:7 +SRR065390.30350798 16 CHROMOSOME_I 139 0 100M * 0 0 CCCTACTGCTCCGCCCATCCCTACTCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #########################A@=;:=@?:=:>CC@<;@CCBA5DCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-22 XS:i:-22 XN:i:0 XM:i:11 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0G4A0G0C2A0A3T1A0G4A0G75 NM:i:11 +SRR065390.4780763 0 CHROMOSOME_I 140 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACCCTA CCCCCCCCCCCACCCCCCCCCCCCCCCCCCCCCCCDCCDCCBCCBDBADC@BB;CC@=A;CA>=@BACB>@ABB@A>AAB#################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:95G4 NM:i:1 +SRR065390.10506396 0 CHROMOSOME_I 140 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCA CCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCC?CCCCCCDCAA9ABB@1C@@@A@@A.B@A==(77;73:?6==/@6>@##### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:35G64 NM:i:1 +SRR065390.17927737 0 CHROMOSOME_I 140 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTA CCCCCCCCCCCACCCCCCCBCCCCCCCCCACC?CCCCCACCBB@BBDAABA?B=?########## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92T7 NM:i:1 +SRR065390.27209146 0 CHROMOSOME_I 140 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA CCACBCBCBC@@@AA,CCCCCCC=CCC?CCCCCCCCCCCCCB@CBC>9=8.;=:=789.177042357??################## AS:i:-3 XS:i:-3 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:54C45 NM:i:1 +SRR065390.8223160 0 CHROMOSOME_I 142 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCAAAGCCTAAGCCCAAGCCAAAGCCAAAGCCTAAACCTAAGCCGAAG CCCCCCCCBCCCCCCCC?CCB>BB::??3?ABA>B>ABAAB@B@B@BBB################################################### AS:i:-12 XS:i:-12 XN:i:0 XM:i:6 XO:i:0 XG:i:0 YT:Z:UU MD:Z:54T11T5T5T8G8T3 NM:i:6 +SRR065390.28374598 0 CHROMOSOME_I 142 0 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTAAGACAAAGCATACGCGACAGCCCAAGACAAACCACATG <9;;;=A?=>CCACACCCACCCCCCCBCCC=ACAC=CCCBAC@A@?@.>@################################################## AS:i:-30 XS:i:-30 XN:i:0 XM:i:15 XO:i:0 XG:i:0 YT:Z:UU MD:Z:56A7C1T4C2A2C0T0A4T3C1T2G1C0T1A1 NM:i:15 +SRR065390.2772417 16 CHROMOSOME_I 142 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ;7/77:0=1>=7==7@@BBB?4@BBB>DBB@CBDCDDC@DCCACABCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5292931 16 CHROMOSOME_I 142 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###############@>9471*=886:?DB>:DB@AAC>BBDB>@DBDDBBDBDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5356550 16 CHROMOSOME_I 142 1 100M * 0 0 TAAGCCTAAGCCTGAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG #####################################?=AC@AA@CC=D@BB?B@@DADD@BDDD@?DC@CDBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12004249 16 CHROMOSOME_I 142 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ##########@*?:@??>B?B;ABBA;BADB=A@BDDAABBDD?DABADCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17100183 16 CHROMOSOME_I 142 1 100M * 0 0 TACGCCTAAGCCCACGCGTAGGCCTGAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###########################################BA00*0+=C=7@>8C@ACCC5@@CACC@AAC@C>ACC@?;>@;ACA?CC?CA=ABAB AS:i:-12 XS:i:-12 XN:i:0 XM:i:6 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2A9T1A2C2A4A74 NM:i:6 +SRR065390.19067238 16 CHROMOSOME_I 142 1 100M * 0 0 CAACCCCACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ##########################BD;CB>BBCCB@B@AC0@BABCBCCCCCCCCCCC?CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0T2G2T1A91 NM:i:4 +SRR065390.30164492 16 CHROMOSOME_I 142 1 100M * 0 0 GAACCCCAAGCGTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ##################################B>;<>:=B@?>B>CBCDC@CCDCDDCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0T2G2T4C88 NM:i:4 +SRR065390.30379033 16 CHROMOSOME_I 142 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###################################A>BABBBDB@?DCADBACCCBBCC?DCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.31408372 16 CHROMOSOME_I 142 1 100M * 0 0 TAAGCCTAAGCCTGAGCCTAAGGCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ##########################################BBB=?BC@@A=@C=C@BC@>C:C@ACCCCCC?@CCCC?CCCCCCCCA@CCCABBCCBC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:13A8C77 NM:i:2 +SRR065390.24902099 0 CHROMOSOME_I 144 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CCCDC>BDBBA@;CAB>ABB>A?B=:2:=:7=(77@@:<>@=@?# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.26130664 0 CHROMOSOME_I 144 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDBDDBDBDBB=ABABB>BB@AA0=A=???@<<>@3@@=+>A7(==7@>8:=(;7749>3@3@######### AS:i:-3 XS:i:-3 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:67C32 NM:i:1 +SRR065390.10040702 16 CHROMOSOME_I 145 1 100M * 0 0 CCCTAAGCCTGAGCCTACGCCTAAGCCTATGCCTACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #################################################################B;BAAABBBBA??AA?@CACCCCC@CCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:4A7G87 NM:i:2 +SRR065390.76906 0 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACC?CCABCCCC0BBAB@.@?BB?:=?1?########### AS:i:-3 XS:i:-3 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:87A12 NM:i:1 +SRR065390.22155458 0 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCA@BCBDDDD@DBBD>@A?AAB0AB>??########################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.407652 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA =944;@<9>7:?@=?9@@B4B@B@ABADBDCDAABCCACCCCC>ACCCCCCCCCCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.688364 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ?>>?>@D>6@?:=:=7@7>==@A??;22;0B@=;B?BA@@DBDA@@C@C@DBCCCCBACCDBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.2431093 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA A>@>A==94=:7A8@?=B4?@=@B?@B@=BDBCBCCBCDCCBA=CACCCCDC;ACCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5178538 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ############################@?>2=8>>@?@B6BDBADBBB@ADAACDCDCCCCCDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5776200 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #################?@>>ACBAACB>BB>BB>BD?A@@DDDDDCBDCCCCCBDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6963092 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############?=??B@?BDD?B:>@BBB>@BBBBD@DBAD@BDDBBBCCDCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7246095 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ################@?A@?;A;?>;BBBB;?@?@@B@@BACBBBBBCBBCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11988452 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ######A>=BC1BBBDD>BABB=BBC@B?AACCCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12087571 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ########################BAA4ABBBBBB>6B?@?@=>>)69:===?<=B?=8@## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:83C16 NM:i:1 +SRR065390.12944530 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##########@B@?>:?@????@A@@B@@AA@B@@BCB@@CCACCAACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16589531 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ############?A0@ABBDCBB@BBCBDDDDCDCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18782999 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##############################B9B??AB6BBBBBCBBDDBBBBBDDDDBDCCDCDDBCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20251224 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##########################@<3?>?>BADA>BDDBDABADDBBDADCABCCCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22643473 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##################@@9??DD>>?>ABB?;BBB?6;BDDAAB@D?BADBDCCBCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCACCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.25014137 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ??@???BABB=A>BAB>@BBBBCBBBDDADBBDDDDBDDCBDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.31537660 16 CHROMOSOME_I 147 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ############A=9;C>BBD>A;BADDAA@CCCD=CCCCCCACACCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4975670 0 CHROMOSOME_I 148 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCDCCBCCCCABBCDBBBADBDBBABBAA=B1<@=A=@>B>DB?########## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.10980220 0 CHROMOSOME_I 148 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCDCDDBD@B;B?=@############################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.16205013 0 CHROMOSOME_I 148 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCBCCCCCCCA?CCCCC>C9?CC@?CCC?6CB7>9/6ACA@@0@;@= AS:i:-3 XS:i:-3 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:88C11 NM:i:1 +SRR065390.19247267 0 CHROMOSOME_I 148 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCAAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDCCDCBABCDDA################################ AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:90T9 NM:i:1 +SRR065390.27744200 0 CHROMOSOME_I 148 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACG CCCACCCCCCCCCCC?CCCCCACCCCA@CCBCC?BBBCB>BD>BA@C@?@44A=9=76:?>><><=>=?########################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.48058 16 CHROMOSOME_I 148 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###########@=<<>9:6:;AB>>>===:.9>>:>ABDD;BA@DDA2:<<::06=:A:=>B6B@BBB>B@>>@@@?CCB@DCDCCDCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3911401 0 CHROMOSOME_I 148 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCC<@CCB=CA@CBCCB;CB@BB@CAABA>?0?><=@9:?/57.3B:B6;:;4B########### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:93G6 NM:i:1 +SRR065390.11019398 16 CHROMOSOME_I 148 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ###########################A@=?BBC?CCCA@ACCAAB@CC9CC?CC?CCCCCACCCCCCCCCCCCCCCCCCBCCCCDCCCCCDCCDCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17181327 16 CHROMOSOME_I 148 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ##########A@@@@A@BC?CBDBBBBADDBBBBAB?>B>?CB@DACDC>D?@>;B@=BBABC>ACDD?6D######################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.30860653 16 CHROMOSOME_I 148 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG ############################@@B?>BA;?A=B8C<=@ACCAB58=8<> AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.428236 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CC@CCCCCCACCCC@C@CCCC8ACCCB>@@CC4CBC>A66??@?8>=78@>,@< AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4115644 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCBCCCCDC@ACCBCBBCCBDAACCACBBBDB=BBABC>>?BBB;@=BBB>>8A=>0A:A=AA>A################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8373173 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCBCCCCCC@CCCCCCCC@B?CDAACCCACCDBBBB;B@C;8BB@A@0D45>737=>=+>@9A?########### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9273601 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCBDCCDDADBDDB@AB>BBBB9@@@@8=::877519=8=99?:>A# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9667751 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCACCCDCC@@C@BA@@C??8=<;@@:94==759=>=A############################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10356164 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CCBC=>C@DCABBBBBAD?BBB1B><:7.7>A>:5=@=?@ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10582969 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC=>=>>>@CCCCACCCBBBADDCACBBDBA>DABBABBABB<>B>BDB:>BCA=AA??AA?##### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11554773 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCDC?CDCCCCCBCCBB@BBBBDBD3774;33005=A############# AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.11799834 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCD@BCDDD@BDDDB@ABBBC>D?B@C>8CCA>:A?AD?####### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.12271991 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCBDBABDCDACDC@BBA@A@BBB?>AA>>BD???6@::= AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13100135 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCA@CCACC@CAC@@=;8><8B??A?=@=<>:==?;AA=@@B?AAC>5A#################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.13252530 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@ADCCD@BDCBB;ADD=B@DBBB@;@@?@=2=?################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14011507 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCC;CCACA8CC@CC@AC@C@?AC8A8=B?5?:DB?;B=@AA?@@.B8=<@=>@@:;?900;10>17> AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14302244 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCDCCDCCCCCCCCBCCCCC@BCCC>@CCACCCCCCCCC=CCC@AACBC=B@@A8:>=B@@?8B=@B;=:>:?BB<@B;>B>BA>A?;:==.>.5555966@= AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15822909 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCC@DAAB;C@=BBAB==BB@;@@BB@@4887=:0>9:@###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.16263688 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCCDDD@CCDDBADDBB;>BAABB9B###################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18384187 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@DCDBC@BBBBC;BBB>A>DB@=B3@?@>B6>>:9=0;=2::<> AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18577103 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCBCCDCCBBDDADBBB>>DBCCA>AC?AC?AAAA################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19188617 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCBCDBCDBB=B@>AB?6>=2>A>>?;6D?;B@??AA>:AAAAA6<@6@ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.19522689 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCACCCDCDDBDDD@@ABBDB>;BBBBBBCAB>:>>?@9:@@?@96:<@@########################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22784325 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?BCCD@CDCDD@BBABBC8@@AAC@?BBBBBB;>C?@3=@@?=<6=9>83@=@D###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23133897 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCBB:?BA9AA################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23202943 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBBCACDCDDDDDD>BADB@ABBBCABB>AB>=>=@@A??AAAA>A################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.25064051 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCBCCCCCCCCCCCCCCCCCC@CCCCCCCCCCDACDCDDABBCB?A@<@ABB@BBD?@AAB>0BB:<=8>A.>:>>/==;AB@::=@########## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29443750 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDABCCBDDB=B@@BB@B>BBB>B?DDA@?ADB:>D?DD<9;-@############ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.29935780 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCAACCC@CCCCCCCDCDADDDDDBDCBDDBAABBBABB>B;AABAAAAD################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.1999503 16 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ####################B>@>=4BB@BBB;AADB@BDBBA8CCD@C=DCCCDABCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.2979717 16 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #####################@3@A:?@;=D;???A@;BADBB@BB=?B=CDC@D@CC?@CCCCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3631589 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCBCCCDBAC@A.=BBBA@?@@BB>?@=@@7?@?A############ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3971739 16 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ########B:=/5=7:>;4>@=?:7;===2B@BBBBB=BBB5BBBC?@DCCCCCDCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4002088 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@DDCBCABCDCCBACBDB@;BBBBB>?=B@@>@>@<;@############################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4609375 16 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #########A:3>59@?:=@<=>==6BB@?ACAABA@A@BB;BABBCDDBBDC@DCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCD AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5221796 16 CHROMOSOME_I 149 1 100M * 0 0 AATACTAGACCTAGGCGTAAGCCTAAGCCTACGCCTAAGCCTAATCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #############################################################C1CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-16 XS:i:-16 XN:i:0 XM:i:8 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2G0C3A0G4A2C14A12G55 NM:i:8 +SRR065390.5504153 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCDDBDBD>@ADB;=B7A>>=A>BA>>A>@?CAA;ACA6C?@>B<<@<=>?>?;:B?D<9.7@/B74@########### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6311425 16 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #######@9@@::A::;<.?@BB>8A>BDBBBBDDB=DBDBBADABDDACDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6572328 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCC6CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@ACCACCADCBCBDDAAD>BBBAD@@DB4=3===BBB;CC>AA=CAAAA AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6809356 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCACDBCACBDBABBBACCBB;BBBB@;??D@B>AAAAB>@>>?############## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7213562 16 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ###############BB:>DAABC=ADBBB?A?BBB8?B@>B@DCADDDDDDCCBDBBCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17029406 16 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC @9'8@:6:,B>9==;6?@:BABBABBBBDAABBDBDAADDDBBDDBCCBCDDCACCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.17428924 16 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #A9>AA68=>981==A@>??AA==::@AA0@;B@@B;ABAB=B=CBBAB;CC@AB@CDCCCCCCCCCCCCCCCCC@CCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18015619 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?CCCCC@CCCCAACCDB=C@DBB@DBDD6A?=>?>ABBBCBBBABBABDDBDBBBBDDCDCCADCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.20608417 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCABCBBCADBBA>BABBBB>B>>BBBDB@?BA6><=><=D<>B?############################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.31976147 16 CHROMOSOME_I 149 1 100M * 0 0 AAGCATAAGACTAAGCCTAAGACTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ####################################A==A=A8:>@@@BB?C??CA@@CCC@BBC>AA=?BACCCCCCCCCC@BCCCAACCCACCCCCCC AS:i:-11 XS:i:-11 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:4C4C11C34G43 NM:i:4 +SRR065390.33177643 16 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ########@@@A66A@@@=:B;B@@;BBBB@?DBDA@BBDCAAACCCCDACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.33572049 0 CHROMOSOME_I 149 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ?>?B@8;88?>>B9>B@97>@>>980000.*0000838?8:;56722/-/;734@BA4?############################################# AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:93T0A3C0T0 NM:i:4 +SRR065390.824436 16 CHROMOSOME_I 151 0 9M3I88M * 0 0 AATTAAAACAGATAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG B;?8B?BBBD6:5:>3=BBBCBABBBC8@CC@ABACCAC;?CCCCCCCCCCCCCCCCCACCCCCBCCCCCCCCCCCCCCCBCCCCCCDCCCCC AS:i:-38 XS:i:-38 XN:i:0 XM:i:5 XO:i:1 XG:i:3 YT:Z:UU MD:Z:0G0C0C3G0C89 NM:i:8 +SRR065390.8852076 16 CHROMOSOME_I 151 1 100M * 0 0 GCCTAACCCGAAGCCTGAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #####################################C@B8C;?CCCCCCC?CCCCB?CCCCBC?CCCCCCA=>CCBACCCACCCCCBA AS:i:-11 XS:i:-11 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0G3A0A5A38C49 NM:i:5 +SRR065390.24657688 16 CHROMOSOME_I 151 1 100M * 0 0 GCGTAAGGCTACCCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ########################################@4;A?@@+CAAB@=CCC?CDACCCC@?CCCCCCACCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2C4C3A0G87 NM:i:4 +SRR065390.32343734 16 CHROMOSOME_I 151 1 100M * 0 0 GCCTACGCCCACGCCTAAGCCAACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ####################################?BCB=BDBA@DACCCCC@DCCCC==@?(@############################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:80T19 NM:i:1 +SRR065390.11017273 0 CHROMOSOME_I 152 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACCCTAAGCCTA CCCCDCCCCCCBCCCCCABCCCCCCCCCCCCCCBCCBCBCCCCCCCCACCBC?ACC=:=?########################### AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:90C8A0 NM:i:2 +SRR065390.23405592 16 CHROMOSOME_I 153 0 4M5I91M * 0 0 CGAAAATTTTCGAAAACCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG @??B?B@BAB<:@BBABABB@@CCCCCDCCCD@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-44 XS:i:-44 XN:i:0 XM:i:5 XO:i:1 XG:i:5 YT:Z:UU MD:Z:1T2G1C0T2G84 NM:i:10 +SRR065390.30873804 16 CHROMOSOME_I 153 1 100M * 0 0 CCAACCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #####################?:A@6==97B?DDBABBDB?AB@@<>;B>B?DB?=@@?@: AS:i:-8 XS:i:-8 XN:i:0 XM:i:0 XO:i:1 XG:i:1 YT:Z:UU MD:Z:5^T95 NM:i:1 +SRR065390.19270079 0 CHROMOSOME_I 155 6 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTGAGCCTCAGCCTAAGA CCCCCCCCCCCCCCCCCCCCCCCCC@CCBCCCABDCCDCBADBAAB=BBBBB6B@B>ADDDB>.?################################### AS:i:-8 XS:i:-10 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:79A4A5A8C0 NM:i:4 +SRR065390.30567090 0 CHROMOSOME_I 155 6 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTAAGCCTACGCCTCAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCDDCCDCDDDCADBDDDDBBBBBB;CCACAABA>D?##################################### AS:i:-6 XS:i:-12 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:79A11A4A3 NM:i:3 +SRR065390.7022394 16 CHROMOSOME_I 155 0 100M * 0 0 ACGGCTTCGCCTACGCCTATGCCTCAGCCCAACCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #############################################DCBBBCCCCC=BCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCC AS:i:-20 XS:i:-20 XN:i:0 XM:i:10 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1A1C2A0A5A5A4A4T2G5G61 NM:i:10 +SRR065390.17996680 16 CHROMOSOME_I 155 1 100M * 0 0 AACCCCAACCCGAATCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ######################################?A0.00/0000.;8<5:C?C>CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2G2T2G2T2G85 NM:i:5 +SRR065390.21693823 16 CHROMOSOME_I 155 1 100M * 0 0 ACGCCCAACCCTAAGCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ##################################@=B0>@<@7?A@CCCCCC@@C@@CC@CCCCCC@C@BCCCBCCCCCCBACCCCCCCB@@??==BB@= AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:1A3T2G9A81 NM:i:4 +SRR065390.27653002 16 CHROMOSOME_I 155 0 100M * 0 0 GAACCAAAACCCAAGCCGAAACCCAAACCTGAGCCCAAGCCCAAGCCCAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ################################################?<8BA??C?ACACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCBC AS:i:-26 XS:i:-26 XN:i:0 XM:i:13 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0A1G2T2G2T5T2G2T2G3A4T5T5T52 NM:i:13 +SRR065390.31159665 16 CHROMOSOME_I 155 0 100M * 0 0 GAACCGCTCTTCCGATCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #####################################BBCA9>5=BCC@@ACBCCC@@CCC@CCCCCCBCB?@B?@CBCCBCCBCBCCBC?;<><>??@? AS:i:-26 XS:i:-26 XN:i:0 XM:i:13 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0A1G2T0A0A0G0C0C0T0A0A0G0C84 NM:i:13 +SRR065390.11329514 0 CHROMOSOME_I 156 1 100M * 0 0 AGCATAAGCATAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCA CCCCCCCCCCCCCCCCCCCCCBA0==?:?BB>=D############### AS:i:-12 XS:i:-12 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:3C5C89C0 NM:i:3 +SRR065390.29072565 16 CHROMOSOME_I 156 1 100M * 0 0 AGCCCAGGCGTAAGCCTACGCCTAAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC #######################################################C@.B>@CCCD=CCCCCCCCCA@?<>AACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0G10A88 NM:i:2 +SRR065390.31653691 16 CHROMOSOME_I 157 1 100M * 0 0 CCCCAAGCCCAAGCCGAAGCCGAAGCCGAAGCCTAAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #######################################################??5AACCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-14 XS:i:-14 XN:i:0 XM:i:7 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0G2T5T5T5T5T11T60 NM:i:7 +SRR065390.24940664 0 CHROMOSOME_I 158 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCACCCBA@DBDBBBA=??><; AS:i:-16 XS:i:-16 XN:i:0 XM:i:8 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2T5T0A4T2G2T5T5T67 NM:i:8 +SRR065390.10545162 0 CHROMOSOME_I 159 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCA CBCCBCCCCCB=??BBBBBBBBBBBBBB:BBBAA@34*2/;?>>>BBBA?882)';8748>B9>B+131@############################## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.12800438 0 CHROMOSOME_I 159 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCD@CBBAABDDDBDA*AAA?>>BD@AB+40395=21>*2(22/@@+@<55@## AS:i:-3 XS:i:-3 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:74A25 NM:i:1 +SRR065390.21037219 0 CHROMOSOME_I 159 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCDCA@@>B@@@A>@=@?@?A@05/85;0;8@############### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:99A0 NM:i:1 +SRR065390.27810825 0 CHROMOSOME_I 159 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAAGCCTAAGCCTAAGCCTAA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDBCD<>CBDDBDADBCDDDBCCCCCCDCCCCCCCCCCCCCCCCCCCCCCCCCCCACCC AS:i:-20 XS:i:-20 XN:i:0 XM:i:10 XO:i:0 XG:i:0 YT:Z:UU MD:Z:3A16A0A0G0C4G2T1A6G2T56 NM:i:10 +SRR065390.8173376 0 CHROMOSOME_I 160 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAG CCCCCCCCC@CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCBDCCD@BDDDBB=A@@??8BB;D9?DD;BAAAA=AA### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98A1 NM:i:1 +SRR065390.24971098 0 CHROMOSOME_I 160 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAG CCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCBBCCCCCCACDCA@@AAC6BABB=D@>@B>?>@1==377.5055(52049467 AS:i:-3 XS:i:-3 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:97A2 NM:i:1 +SRR065390.29229469 0 CHROMOSOME_I 160 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGAAGCCTAAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCACCCCCCCBB?CCCABCA@C:=B@BC?=B==@==?@@A################# AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:90T9 NM:i:1 +SRR065390.15931715 0 CHROMOSOME_I 162 1 100M * 0 0 NGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC !++++22222AAA8AAAAAAAAAAAAAAAAAAAAA8:0:8AAAAAAAAAAAAAAA78AA7:89996664:AAA########################### AS:i:-1 XS:i:-1 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0A99 NM:i:1 +SRR065390.16420564 0 CHROMOSOME_I 163 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCCCCCCCCC@CBC>@AA:A>?CA?@AB=A=@BBA@BADB=BBABCCAAA)A AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23326095 0 CHROMOSOME_I 163 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCACCBBABAB>DBBB=>B@@?B?B>BB6BBD<>4?==@@A@9@=7AB;B;BAD;@DACD=DCDDCC?CCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4460513 16 CHROMOSOME_I 163 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ####################BD@:BBBABABBABDABDDDC=CCCDCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4608863 16 CHROMOSOME_I 163 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT A;A2::::=.@.<@@=A>BDDADCCBCB@CCCCBCCCDCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.10096102 16 CHROMOSOME_I 163 1 100M * 0 0 GCCGAAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT #########################@3;B@79;99>=BBA?@A;@=>>D::99=4=@*:BB>AB@@@BDDBDDDDCDACACCCCCACCCCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.27063479 16 CHROMOSOME_I 163 1 100M * 0 0 GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT ##########################################@BB@B;ACA@B=CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4604929 0 CHROMOSOME_I 164 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDBDCDDDDBDDDBD@DDA?B>?*:B8@@8=@??A?>B?A## AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:81A18 NM:i:1 +SRR065390.21767995 0 CHROMOSOME_I 164 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCTAAGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC>D@AA@=?@####################################################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:75A24 NM:i:1 +SRR065390.24370235 0 CHROMOSOME_I 164 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCCA CCCC3CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCD=A>DBB@;@BBB;=?=6A:=A################################ AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92T5T1 NM:i:2 +SRR065390.33289921 0 CHROMOSOME_I 164 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTAAGCCTA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCAACBBCCCC@BCCB>B@@B@B9B?B?:0>==D?:>?############### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:88A11 NM:i:1 +SRR065390.33450079 0 CHROMOSOME_I 164 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCCA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC@CDBCCDDDB@DBDDBBA?B@>@BABB6>=>>94@<==@#################### AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92T5T1 NM:i:2 +SRR065390.9104074 16 CHROMOSOME_I 164 1 100M * 0 0 CCTAAGCCTAGGCCTAAGCCTAAGGCTAAGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #################################?777?:5@B=B?B?;BDB@ABBA18BBACCCC####################################################### AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:96T1A1 NM:i:2 +SRR065390.6217548 0 CHROMOSOME_I 166 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAGG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCADDCACB?@@?@B@BBD=:=;7ABAAB@:?BD############################## AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:96T1A1 NM:i:2 +SRR065390.22416659 0 CHROMOSOME_I 166 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGACTAAGCCTAAGCACAAGCGTAAGCCTAAGCCTAAG ?A=8?@AA@?CCCCCBBBBB:8:?:78307>@#################################################################### AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:64C12C0T4C16 NM:i:4 +SRR065390.29369023 0 CHROMOSOME_I 166 1 100M * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTCAG CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDBBDDCBBDBDDBDBCABA>BCACC>CAAAAA?A?>:=CA@9;787;8A48;8@######################## AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:86G1C11 NM:i:2 +SRR065390.19225398 0 CHROMOSOME_I 167 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGCCTAAGCCCAAACCCAAGC ?<:<<>AA@>CCCCCB@B@=58;;?<>@BA>B@BB<@B9BBBBBBA>@############################################## AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:79A9T2G2T4 NM:i:4 +SRR065390.21123303 0 CHROMOSOME_I 167 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGACTCAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC######################################################## AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:72A2C2A21 NM:i:3 +SRR065390.29022479 0 CHROMOSOME_I 167 0 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACCCTAAGCCTAATCCTATGCATAAACCTAAACAGAATCAAAAGAAAAATCCAATCT CCCCCCCCCACCCCCBCCCC?CCCCCCCD;?D?D################################ AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:94C0T0A3 NM:i:3 +SRR065390.23298396 16 CHROMOSOME_I 167 1 100M * 0 0 AAGCCTCGGCCTACGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC #####################A@><>B==BC@CCBB?BA'@>>;>>DADDDBDBADB?B6@7=;;7DBD?B<8=AA:4-9<@@1:@A################################ AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:98C1 NM:i:1 +SRR065390.23263331 0 CHROMOSOME_I 168 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCBCCCDCCDCDDDBBDA=B@BB@B>B>AB?@?BB>;;ACC>CAA@;9<5@############## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.1428659 16 CHROMOSOME_I 168 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC #######?DB@;>BBB::>:D=>D?BDDBBBBCCAC@DCCBDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9270489 16 CHROMOSOME_I 168 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC ##########?4=>@BAA>BB>AA@====3BBBBB;B?@C==CCC?@CCC?CCC?ACCCCCBCCCBCCCCBCCCCCCCCCCCCCC=BCCCCCACCCDCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.9538669 16 CHROMOSOME_I 168 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC ##########@=?6??@B;BA@@@?.@?@@;D>A;DB@DBBBD>@DDDBADCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.15525407 16 CHROMOSOME_I 168 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC ####################@37:0BC@@C@ACCAB?@CCACCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18387934 16 CHROMOSOME_I 168 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC ##########################@@A@4BDDBB@ACABB@8BCACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.27778447 16 CHROMOSOME_I 168 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC ###############@@B=;>89<>/8?<8@>=ABDCCDCC@CCACB@@C@9ACCCC;CCCC@CCAAB@@CCCCCBCCCCCCCBCCCCCCCCCCCCCCCC AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.4767844 0 CHROMOSOME_I 170 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTAAGCCTAACCCCA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCCCCDCC=CCBA=BCCACCBCC<@@@A@>A?D<5/772AA####################### AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:80T14G2T1 NM:i:3 +SRR065390.6036148 0 CHROMOSOME_I 170 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCTCAGACCA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCBCCC=C########################################## AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:86T6A2C1T1 NM:i:4 +SRR065390.7523697 0 CHROMOSOME_I 170 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTATACCTATGCATA 8773399<;8BBB>BAA<A################################### AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:84C3A4A5A0 NM:i:4 +SRR065390.21777229 0 CHROMOSOME_I 170 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAAGCCCAAGACCAAGCCAAGACCCC CCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCCCCCCCCCCCCCCCBDABAA@48@############################################# AS:i:-18 XS:i:-18 XN:i:0 XM:i:9 XO:i:0 XG:i:0 YT:Z:UU MD:Z:74T5T3C1T5T1A0G2T0A0 NM:i:9 +SRR065390.22082412 0 CHROMOSOME_I 170 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTTGGCCGCAGCCTCAGCCTGAACAGA CCCCACACCCCCCCC??:??@CCCC@9A>9?AA@AC>@CA@B-73>8=53@=:=A?><=>49778?################ AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:88A5A5 NM:i:2 +SRR065390.32243033 0 CHROMOSOME_I 170 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACGACTA CCCCCCCCCCCACC@CCACCCCCCCCCCCCCCCCC@CADCCBBD@BB>=?A@9C@?C>A88?>8A?:@CCCCCCCCC:?>;:CCC?BCCCCACCCCCCCCCC AS:i:-39 XS:i:-39 XN:i:0 XM:i:18 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0C0T0A0A2C0T2G1C0T0A0A0G0C1T0A1G1C64C10 NM:i:18 +SRR065390.28296401 16 CHROMOSOME_I 171 1 100M * 0 0 CTAAGCCTAAGCCTAAGGCTAAGCCTAAACCCACGCCTAGGCCGAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##################################################BAADDDBBDDCCDCCCCCACDCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-12 XS:i:-12 XN:i:0 XM:i:6 XO:i:0 XG:i:0 YT:Z:UU MD:Z:17C10G2T1A5A3T56 NM:i:6 +SRR065390.1242089 0 CHROMOSOME_I 173 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC A=@@?=?=8A3BB>>B@B>BAB@B@B77//8<;>5:@@@B6ABA@BA<@BB5):5;*83736?;;;@@=;6B>??##################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.3872193 0 CHROMOSOME_I 173 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCBCCCC@DCACD=ABCB@BCDDA@BA=BBB@C??@;:0A>?>B>?)?#################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.14566073 0 CHROMOSOME_I 173 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCBCCCCCCCCCCCCCCCCCCCCCCCCACCCCCCCCCCAB=?CCCA6?AACABCCAC=1B@A@;B<@A@@;>?@>8BB?B#################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18391952 0 CHROMOSOME_I 173 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCDCCCAADCCB?CBABD=A>?BB5:??:B;>?@AA?>3?;@(8>=>>/(5500;+@@6 AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.18719419 0 CHROMOSOME_I 173 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCAC@@C@@B@DBBDBB################################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23668023 0 CHROMOSOME_I 173 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCC@@ABDB@@BBB>DBABB@D@BDBAABAB>B>AA@??9:8>>A:255@###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.23826980 0 CHROMOSOME_I 173 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCDCDBCDDBDDDABBBBDDBBBBBBB>D?#################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.28024258 0 CHROMOSOME_I 173 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCBACDDBC>DDBDB>BBBBB;?@BBB3@???=0<=>@@:@################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.30039772 0 CHROMOSOME_I 173 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCDACDBBDDDDDBBBDBBD>BBAADAABAAC??B??######################### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.5345749 16 CHROMOSOME_I 173 1 100M * 0 0 GACCCAGACCCCGCGCCTAAGCCCAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ##########################################@BA=>AAA@;AAAA@AA9AAAA@BAA@:=@@@4A=?A@AAAAA:B@@BBBBB@>>>>> AS:i:-18 XS:i:-18 XN:i:0 XM:i:9 XO:i:0 XG:i:0 YT:Z:UU MD:Z:0A1G2T0A1G2T0A0A9T76 NM:i:9 +SRR065390.16932911 16 CHROMOSOME_I 173 1 100M * 0 0 AACCCTAAACCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC ###############B?BAA;;9>0A1BAAA@=CA*@CCCCACCCC@@?CAAB>AC=C?CCCCBCCBBCBCCCABCCBCA@CCCCCCBCCCCC?BCCCCC AS:i:-6 XS:i:-6 XN:i:0 XM:i:3 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2G5G5G85 NM:i:3 +SRR065390.17106354 0 CHROMOSOME_I 173 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACCACC?CCADCCAC@BB@CBB@C?@A@@A>=B?BAABBABB6A>BBB:BBA=?DD??;D/<71; AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.22716808 0 CHROMOSOME_I 174 1 100M * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCGAAGCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCABBBBB?################################### AS:i:-2 XS:i:-2 XN:i:0 XM:i:1 XO:i:0 XG:i:0 YT:Z:UU MD:Z:94T5 NM:i:1 +SRR065390.12986460 0 CHROMOSOME_I 176 1 100M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCATAATCGTAAGACTAAGAGCAAGCCTCAGCATA CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA?CCA############################### AS:i:-4 XS:i:-4 XN:i:0 XM:i:2 XO:i:0 XG:i:0 YT:Z:UU MD:Z:92T2G4 NM:i:2 +SRR065390.14729559 16 CHROMOSOME_I 176 1 100M * 0 0 CCTACGCCCAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA #########################?(4<=B@;BBBBCB?>BCCA?DCCACCCCCC@C;BBB??B<;9=C@BCAACBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC AS:i:-8 XS:i:-8 XN:i:0 XM:i:4 XO:i:0 XG:i:0 YT:Z:UU MD:Z:2T0A0A6G88 NM:i:4 +SRR065390.26023345 0 CHROMOSOME_I 177 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCGAA CCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCCCCCCCCCA?CDADABDBDDBDDBAB>>BBBB@;>@BBB?A>CBBB<>>B@@4@?>>?0ABD@@###### AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6149508 0 CHROMOSOME_I 179 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBCCCCCDDCCBD=CCDB@@DABAB=ABB??>>@BB=BCBAB>>D;A?><>AA>?A==+@A AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.6618950 0 CHROMOSOME_I 179 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCDCCCCCDCCBCAACBBCBB@DADABBDAB?CBB@B;?BB=B>>>?:? AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.7246333 0 CHROMOSOME_I 179 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCACCCDCCCCCCCCCCCDCCBCD@CBBDCADADADBDABBDBDABDBCBBA>BAB>>AC9A################## AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 +SRR065390.8266146 0 CHROMOSOME_I 179 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACCCTCAGCCGAGGCCTACGC CDCCCCCCCCCCCCCCCCCBCCCCCCDCCCCCCACDCCCCCDACBDCABCB@A=ABBB@BBD@DB?B################################# AS:i:-10 XS:i:-10 XN:i:0 XM:i:5 XO:i:0 XG:i:0 YT:Z:UU MD:Z:80G3A4T1A5A2 NM:i:5 +SRR065390.8986893 0 CHROMOSOME_I 179 1 100M * 0 0 AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC CCCCCCCCCCCCCCCCCCCCCCCCCCCC@CCCCCCCCCCA@CCCCD=CCCDAABBDB>BDDBDB;BB@@B=@BDB:.A>>BB:@################ AS:i:0 XS:i:0 XN:i:0 XM:i:0 XO:i:0 XG:i:0 YT:Z:UU MD:Z:100 NM:i:0 diff --git a/src/test/resources/htsjdk/samtools/cram/md#1.2.1.cram b/src/test/resources/htsjdk/samtools/cram/md#1.2.1.cram new file mode 100644 index 0000000000000000000000000000000000000000..159e8340c57b3f214fe49b2b219c8d3d780092b7 GIT binary patch literal 11198 zcmeI2|7#m%9LJw0cb6tnSW$+c1}t-0J?+Ul}| zToyV}mTpxCLl}rKK?P+nget8A9b;O<7=Ecj$3TA&U5idBR94*&g(=48E{&;wg77>% z;q&C)@6YFXp4UD1+Y^ZS!wQ(+}I-TWbkFhyH)6YcJ4DDmphiPAzOC9$3geSbNq>Ja1LYKROaK$W1TXOaK$W1TXJ6IFEU08o+3 zH}Cq!$5rYi{p9Znvk(EZ7fybpm-F?Hc2pdsNn9XauIq_s^5m(yA$wc}6`$AHGf4n; zh8iB~kp0F+P1Vm86b>c$t00)AyO5AHTla`J*Icf1ubGTD)&RKoymzB)Y1(Vy;v2tA z-%jw;EClU~t2fFPOJ84g3SDto_Zd(TOSjsUPB)?6iqpx^%%hRzG;+ z_jm7HxpR-0g3q+|$?ItD-BW=o&KnDMExBZPb9hzzVd?xMU;SDi5V|L|6Ujr)sfnrO zw>i_qvDM#f?|rfJbGblEld`%5j!z`{gc7{+UBhLiT;FP`smgc79n{Z~pu6*ReT}T! z+N@Q5UvU||3)N|trc~OB52Tpxmj>UsN<3Ci#I3U1{$C_bxx<(*jwEtr!KhqcYSwEDig3ZmX2E4yw!8WRcV+Q2vJQV6Odsa zfP{oVWXNN3!AFJ=kamNmGX~!2^y|uE;|3C?LZbtaYSaMH8sZV7G6Kj8bSwtq=a6u$ zDjPtiQeiegBEU9n5t9X!kL*fQLW&5RXDC>=Gpflefq^y;2c*v-$N-eDCddLLW6Y9t zSgar#W=V3GM*=`H!SvJBo3FMb21-d;t4OFYgvS?%B+}@ZSeabmm#pP>+p%>0es=tP z@xlZ8(K%=R+bidW5Q~&@2WQm-IAmvBprKgq6h1;+Jb1~QQBuMUs?zN`9knoa!(?W0 zw%6Cs!R1$Mt~jDSU3@SJFfXdP(l5s1ySsyHglMVKUQtOpbzo^rB4B>3z)wKpx)*H@ zr?bl8(xckGreOi`S-RIZ3Rv)PlAndebuMOG=wl{_6SsusDNI~oTnJS-st{Vvi`bGx zG%B@j0I(=3IH0jojAS-ir79)Cgb>*yxCU4v+eElDsZ@5nE*4EqBDC^y`W#KO_lFT5 z>1LYMH1~7$yv0^+29)^z#1u`NzBQBqI65mUupQq$$Uld;%z>Fic1hyah|vz8yv9E2 zGFOYu10VOv_J`*l^1QY9>Ea5r0uCf(5tpsri3Y$inVVc#?q(6C;Nbybcm4$LBj1UK zzPuH#u1qWEl~(QDQBhhk*lQJ+K0ooh{Jo3IKhY*1ydy0G94lo9j$*Z0s%#cEI&vlA z44Y7T+j@L}Wzn1f#ap*bW;;e{k9G<;gwuRa +AAAAAAAAAACCCCCCCCYNNRGGGGGGGGTTTTTTTTTT + diff --git a/src/test/resources/htsjdk/samtools/cram/md.fa.fai b/src/test/resources/htsjdk/samtools/cram/md.fa.fai new file mode 100644 index 0000000000..87f55859d4 --- /dev/null +++ b/src/test/resources/htsjdk/samtools/cram/md.fa.fai @@ -0,0 +1 @@ +a 40 3 40 41 diff --git a/src/test/resources/htsjdk/samtools/cram/xx#repeated.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#repeated.2.1.cram new file mode 100644 index 0000000000000000000000000000000000000000..cb04d56083e081021f0b06b45e7a3f6a9ec94771 GIT binary patch literal 10532 zcmeI&zi!h&90&0GC60+}(}boXAcUyIz!o=Yn$Rc%!C(}rF^%0mfMYv^wjs#pA}b7K zKnQ`vLe&mTNQgcJufQV!s>I9&EDUgVDSZZ{@9FIO^ZV)ayU%=v-RWg0j<1Hn!@!LK zzf!AID_-c1-&|vV8&NVj+&kQRBE}m|UvaEf94o67$5m`djHV3V5W40iW!IUcmoF z+;KFSY;!#+NRQ*n(49$YL4yDUAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHaf{O8_eYU^-uOg0R?c2|nNQ)R((Ct6y5LFP%SWdqnxN+%2ZlMXr7+GB6Zs*2(^GT+GcYnVv^2B`v4prVG6efdgFuiUqhkO=9>0?tBO|{vkPry+VP;|E zVq|a(U}Iun336xVVEhjR{EQ5KZa^8JAt4|YK-$d@LVNnLGBNNvIkB)YGHNk0s`>^3 z#TgkHfCo6u>TIW#Q)G7XaI``^&xDmgx&6 z?=E{#5+vq)=l5sl21Zr}ab{R_u?SC|HjRzp>-5Ak%s>zFpY^q7WZ{&@FUyILFV4#-10yyD zk#D~RIf1GqKN{sSvIvN?Ayg%^GP*Hjd3Fi00p&er*mCd#X|Nw2xca*R*}xED-Fp)h Q>TGPF;9_KWm(1u50LnC={Qv*} literal 0 HcmV?d00001 diff --git a/src/test/resources/htsjdk/samtools/cram/xx#repeated.sam b/src/test/resources/htsjdk/samtools/cram/xx#repeated.sam new file mode 100644 index 0000000000..88fc3d6b4b --- /dev/null +++ b/src/test/resources/htsjdk/samtools/cram/xx#repeated.sam @@ -0,0 +1,7 @@ +@SQ SN:xx LN:20 +S 67 xx 1 1 10M = 11 20 AAAAAAAAAA ********** +S 131 xx 11 1 10M = 1 -20 TTTTTTTTTT ********** +S 67 xx 1 1 10M = 11 20 AAAAAAAAAA ********** +S 131 xx 11 1 10M = 1 -20 TTTTTTTTTT ********** +S 67 xx 1 1 10M = 11 20 AAAAAAAAAA ********** +S 131 xx 11 1 10M = 1 -20 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 index ecf339678a32fed6d0fc3fdfe25f6618625b0324..2de38f8f3dc0c9b09251a4b8418b8a08cd93e92b 100644 GIT binary patch delta 730 zcmdlGu`){EImpqMiLs(Wxg;kwPtQotP%pVCF_!@d)@y=D5MX2kktl-vSYeFEqmMxb{%G`JWWW&r)uFtK4G79Uj$IdLL;Nk){B zQPeM(nS~J;Rek}CjN&1|jErKF9kpEql$F6Ia&Us$Z{blj~P0bicAOF_aXZ zcLDj7kwsL31t};JQW97g_O>>Lvw$VVWRU{%w+=r`jZe(~#s*%7(4zA^kf0Pt*8ez3 Q9H`%lySR*HGQW-@0CgIyZ~y=R delta 466 zcmZ1(wIPDtImpqMiBWg*MJ8dRpOl%W zpHWhrlbNJnl3H9cakV`j+0ELFt2OK;L54Aka4=}FGB)%uFfuf>Hna+{gt#y=1p7*Z zK#(7!V*o=wpOYIiJ5zGQWF|&NXE$axCPr2uYcji59Jibt*aT)KZl1~Sv?X+;+2y-A zz>Z~ME-u>=`8ne-3q$l`?~m*tyI8n2C1COl%#*ih=>{-ARuN)g@N+v;p#fA83Um@9 z&`BI1CmjVjXb%P>dxLNepfW4mN$Lg7^HNuPUG5v7YK1Iz2<(wJ#$J}!Lh%E?AtDFh|^*8kMeuCVEZ<+jDu1c-*%t6#kj^F4mZAU+N1D~_nu%yWSoFpOW>R(i#PuN{Rt@8-M76@ zKG|;m`Gv`5v(GXy6x=!esR^iR!u%!Dd;T3{Er01-yCpA4z16@&^QmEszz%=S=ZANH zZ11~m`rVh|fs#al7qh$`hs{D0xvKltyE-1u0EY6>bIacV1GHgn!&*qV4iVBxYW0^Y zV47fH6yaddU}tRTzcI()Fask)LrX)85KD*)BSWySGzbLwF**h?r#K>_SSRu*m^egUv8yT9Da zZJEAM^6s(+B|&1&cMd%Jx1W)fL6Q}gv{{57KaAdUh=C!x!=!>0=*9jo$!8f^xHTnU zDj0-W4+3px;5f7)+==7+k36>K_V%NX3TzB&5!Zm}0Gg>H!~pc) znFtL@$EM^KC^vGj>DK=SI)@P$7aST~j19{zxS1qDaWSW14wkrRXcZ@vU_gse8b`o@gT+zB!MUQqI8s&yyPSg^6i1?B;#i}p*dpN`CDEku{Tn=* z?8H4DgQ7{vb-5HZqe%)qntfY#WV69v!e1wj%kICFM~RiCgsVr$n`SChrD>LT$pv$>v>SeveHw_inA8?`@WP| z*_*6;Q~Zb6yWjQv&t)RHOBXJjvWfX-sFw%h{ar8l60$gVe`WjP8K!MFJmhz@qy4U^>U-(CJPH?bjI^$ZCtwL3-4@G*I>boM(O|*7!w>eYPx8gZ_qKN*q zcYj+W&t0r~Qv4(5$VS8(!p=|LgvdqF)%VT^f&Yiv4prVG6efdgFuiUqhkO=CBKs! zGdojq!(=8#MrSu>HYP?^AS=j+nT3&+k-;&5jfsIZ$eo#k@jnm%Q<9$>PzGpT2uKBx zcJqVKo_?%M47^TGENqO7T8xaUzJWk-Mn;ApkT`c>Fe4*RkS9cGurpAIkC7p@$tjwF zi9t>d>{w zh+gddksavUgKHLUWMtvilz^#WU}ilCw4H(D(1vg)j_*J6*qYnhk3K4}F{q7uD*@DD zZhj|(k%dQG1Ezz8`LT)+1JHkGDl~xdmp)!fECw3D2n>>> <<<<2 x1 +@CO +@CO 1>>>> x2 +@CO <<<<2 +@CO +@CO 1>>>> x3 (7..15 vs 10..11) +@CO <<<<2 +@CO +@CO <<<<2 1>>>> x4 (1..20 vs 16..5) +@CO +@SQ SN:xx LN:20 +@SQ SN:yy LN:20 +x1 99 xx 1 1 5M = 16 20 AAAAA ***** +x1 147 xx 16 1 5M = 1 -20 TTTTT ***** +x2 99 xx 7 1 5M = 10 8 AAAAT ***** +x2 147 xx 10 1 5M = 7 -8 ATTTT ***** +x3 147 xx 7 1 5M = 10 8 AAAAT ***** +x3 99 xx 10 1 5M = 7 -8 ATTTT ***** +x4 147 xx 1 1 5M = 16 20 AAAAA ***** +x4 99 xx 16 1 5M = 1 -20 TTTTT ***** +y1 99 yy 1 1 5M = 16 20 AAAAA ***** +y1 147 yy 16 1 5M = 1 -20 TTTTT ***** +y2 99 yy 7 1 5M = 10 8 AAAAT ***** +y2 147 yy 10 1 5M = 7 -8 ATTTT ***** +y3 147 yy 7 1 5M = 10 -2 AAAAT ***** +y3 99 yy 10 1 5M = 7 2 ATTTT ***** +y4 147 yy 1 1 5M = 16 10 AAAAA ***** +y4 99 yy 16 1 5M = 1 -10 TTTTT ***** 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 index 558e4dd9bb18aae0b0c5d6db1d52e279c51ee7a5..5700fa7ceab312b74dc62791e693b56a8f2c3eb2 100644 GIT binary patch delta 737 zcmewo@it1|ImpqMiLs(Wxg;kw&q&Wm&rmP9C^46Tf#I_zkN^WlMi8~~&B`}7ChA)| zh8Cw573-H|WF{q+=9K6c7bWXwloV&BWP_O{sl_GwMXAO4rA5i9#c-L#+>-qKoML^D z;S*czDK})}-S-+oK_Hhgif}M!urt;(FfvqCO@62;%#*_B93Pa9` zkSRQ1MFKJ$2t~=MDPYLLkYiJF3uN^Ppnn*F{^8KzVr-ZJ^iadZhKXP=RSThbNlM%o z=s8ipU}hFZVD$I}FfxjV1T!*Wh82~t)D8^Xa3@~)_uI2C*>t)p8{o{y!_eayzh zP*Ql_1>|2w7EuWnqyR}tNMT^G=zQG30+tk$MGDenonQPcHUAqMdbt^@YNc000#qDD U|MMgf28J-_6dwNyraZmND+VoGMNeo|(h zenv@gPG*vRNosM)#MSnAWH)OwzSppq1R2IC!oi@y%Gl7uz{t?h+R!S*65_(h5bP@r z0zrO^jsXn$d`@o6>`ciGlbIM9o!yw(m>5}stjTM&r6#9px%kV;flXm%;^z4e1pK?d z+{A$E`xShzJMVDb#i zlYeOG1~5NX5n^EQb30R^0aOtRbSWdyr5qra9tF8{U&B5uE^SyYgz8idW@biKW=19^ zpkrlBfG%fX1iIWWn3;tU7?gei%v>yt>|6pYOh6D4%q+wL@&Fr%;A7$fi%!0$?Ghv> v2euub59PREK44+~{ou!`Sd+&~mD=qXQg>S|;=A_1Ls;j49nK?;Z_PxU}-qvg$dq zmv%Td&iy{$4j(E?W<{bHY(j;G418qe_>Cgk9w@JnIv7?Y+|`A{dw6Esr)L@ zraQA(^TWB<45Q!5m1EN&Or_nD8~b6I;;$^qtI$`vMJR!xNp&n0#Dl;1gYuR`vE zyK7|U3Jq;RrY&s?++-Nqk40`V2r}Qpw4GyiyZZuLv+o-Y>wfQ(xY77NF8ZBpVaSxJ z7IOcm2JDyK`d;d>?w1p5H<$3=G~LjAvlJ-RasJZeNkG#UPL7=Q^z&}lKaq3e=6$hw z>9XefYg3=7wPCAS7@Gdoe0}26EN|QLbD?dIM>J7ZF}-^YxGIPnolR zrw>!ZghRd4j5;4WEGX98eEWqyC*%9)cYraX_VZ36Fz_1=Hynnu|3JPEsva)dV@C$%#+5P2SZp-wA zl6RLqCiQv8pcjA5%(P-;;ntLZsbCOh zJqWa&f#cAIa3_xMKl0d`+uM&mDzGuAje9Er)NwDe)svBhM_dD@gGKnUiVy?Pe`hK* zfb#p!Ca^QI@GI~j+o8SHWnc2FFNiiu;5recePdz3_z#`kaVXtERc zcnpdrCD-Lr)Ql!6^k@R6?~=mvE}%$SxFeXEkwsL31t}&|5>gl#EIJ=IumBaTn^ygi zkwr`vDNQ8*;%BM(-`LR0%}`Y|3ZK literal 1359 zcmZ<`a`a_p&}F~`dQ31eCMJf)+@5NPY&{#5hd z5$CU)Hi)cny_B%yme5+e1DEDG@PpseqJW0i~h9N8_&er$X(PIAB@xJU|%uO4VO^*KUDHeRRLeb`2 zYsHSJ|4${>?KETD!1#{!`M&nWZ5`xR^Ng0mEG^{J|z*5I1aV*anM)p+&D{ zS+K+$m|PebMK~BVSQ#5;37Ied#K6eV(BIH6#1i7d$Pnx+4FW-ajE(^emHbX_%Tat=T)-gH z{#(n0I}$X$e}hMYow&ziP$Znz{>M%z68M4YK;Gwn;Og%NWCNpsb?;4oAjQT8N`Q>>> <<<<2 x1 +@CO +@CO 1>>>> x2 +@CO <<<<2 +@CO +@CO 1>>>> x3 (7..15 vs 10..11) +@CO <<<<2 +@CO +@CO <<<<2 1>>>> x4 (1..20 vs 16..5) +@CO +@SQ SN:xx LN:20 +@SQ SN:yy LN:20 +x1 147 xx 16 1 5M = 1 -20 TTTTT ***** +x1 99 xx 1 1 5M = 16 20 AAAAA ***** +x2 147 xx 10 1 5M = 7 -8 ATTTT ***** +x2 99 xx 7 1 5M = 10 8 AAAAT ***** +x3 99 xx 10 1 5M = 7 -8 ATTTT ***** +x3 147 xx 7 1 5M = 10 8 AAAAT ***** +x4 99 xx 16 1 5M = 1 -20 TTTTT ***** +x4 147 xx 1 1 5M = 16 20 AAAAA ***** +y1 147 yy 16 1 5M = 1 -20 TTTTT ***** +y1 99 yy 1 1 5M = 16 20 AAAAA ***** +y2 147 yy 10 1 5M = 7 -8 ATTTT ***** +y2 99 yy 7 1 5M = 10 8 AAAAT ***** +y3 99 yy 10 1 5M = 7 2 ATTTT ***** +y3 147 yy 7 1 5M = 10 -2 AAAAT ***** +y4 99 yy 16 1 5M = 1 -10 TTTTT ***** +y4 147 yy 1 1 5M = 16 10 AAAAA ***** From 1971f4e591a0acd4f4be8b935b82002b146152e6 Mon Sep 17 00:00:00 2001 From: Steve Huang Date: Mon, 15 Oct 2018 13:50:09 -0400 Subject: [PATCH 76/83] Adding Allele constants for simple SV types(#1192) * adding constants for Simple structural variant types to Allele, ex SV_SIMPLE_DEL --- .../htsjdk/variant/variantcontext/Allele.java | 11 ++++++++++- .../variantcontext/StructuralVariantType.java | 15 ++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/htsjdk/variant/variantcontext/Allele.java b/src/main/java/htsjdk/variant/variantcontext/Allele.java index abfda8b325..dfd11d892f 100644 --- a/src/main/java/htsjdk/variant/variantcontext/Allele.java +++ b/src/main/java/htsjdk/variant/variantcontext/Allele.java @@ -26,7 +26,6 @@ package htsjdk.variant.variantcontext; import htsjdk.samtools.util.StringUtil; -import htsjdk.variant.vcf.VCFConstants; import java.io.Serializable; import java.util.Arrays; @@ -200,6 +199,16 @@ protected Allele(final Allele allele, final boolean ignoreRefState) { public final static Allele NO_CALL = new Allele(NO_CALL_STRING, false); public final static Allele NON_REF_ALLELE = new Allele(NON_REF_STRING, false); + // for simple deletion, e.g. "ALT==" (note that the spec allows, for now at least, alt alleles like ) + public final static Allele SV_SIMPLE_DEL = StructuralVariantType.DEL.toSymbolicAltAllele(); + // for simple insertion, e.g. "ALT==" + public final static Allele SV_SIMPLE_INS = StructuralVariantType.INS.toSymbolicAltAllele(); + // for simple inversion, e.g. "ALT==" + public final static Allele SV_SIMPLE_INV = StructuralVariantType.INV.toSymbolicAltAllele(); + // for simple generic cnv, e.g. "ALT==" + public final static Allele SV_SIMPLE_CNV = StructuralVariantType.CNV.toSymbolicAltAllele(); + // for simple duplication, e.g. "ALT==" + public final static Allele SV_SIMPLE_DUP = StructuralVariantType.DUP.toSymbolicAltAllele(); // --------------------------------------------------------------------------------------------------------- // diff --git a/src/main/java/htsjdk/variant/variantcontext/StructuralVariantType.java b/src/main/java/htsjdk/variant/variantcontext/StructuralVariantType.java index 36b517a2a9..487f089e59 100644 --- a/src/main/java/htsjdk/variant/variantcontext/StructuralVariantType.java +++ b/src/main/java/htsjdk/variant/variantcontext/StructuralVariantType.java @@ -43,5 +43,18 @@ public enum StructuralVariantType { * event can be summarized as a set of novel adjacencies. * Each adjacency ties together two breakends. */ - BND + BND; + + // TODO: 10/10/18 one caveat: BND's have symbolic alt allele, but it takes more information (novel adjacency at the minimum) + /** + * Create angle-bracketed alt allele for simple SV types + * @return angle-bracketed alt allele for simple SV types + * @throws UnsupportedOperationException if this is invoked on a {@link #BND} object + */ + Allele toSymbolicAltAllele() { + if (this.equals(StructuralVariantType.BND)) { + throw new UnsupportedOperationException("BND type does not have angle bracketed alt allele"); + } + return Allele.create("<" + name() + ">", false); + } } From d50425607f2aff6652f66e8c2ed26b417026bf91 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Tue, 16 Oct 2018 14:55:53 -0400 Subject: [PATCH 77/83] fix CRAMIterator when next() is called without hasNext() (#1193) * fix CRAMIterator when next() is called without hasNext() * fixing a bug in CRAMIterator which previously threw if next() was called without first calling hasNext() * adding CRAMTestUtils and extracting a method to it from CramEdgeCasesTest --- .../java/htsjdk/samtools/CRAMIterator.java | 15 ++--- .../htsjdk/samtools/CRAMEdgeCasesTest.java | 36 ++-------- .../htsjdk/samtools/CRAMFileReaderTest.java | 11 ++++ .../java/htsjdk/samtools/CRAMTestUtils.java | 66 +++++++++++++++++++ 4 files changed, 90 insertions(+), 38 deletions(-) create mode 100644 src/test/java/htsjdk/samtools/CRAMTestUtils.java diff --git a/src/main/java/htsjdk/samtools/CRAMIterator.java b/src/main/java/htsjdk/samtools/CRAMIterator.java index 33492df69a..17adadf0bc 100644 --- a/src/main/java/htsjdk/samtools/CRAMIterator.java +++ b/src/main/java/htsjdk/samtools/CRAMIterator.java @@ -34,10 +34,7 @@ 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 java.util.*; import htsjdk.samtools.cram.CRAMException; @@ -259,9 +256,7 @@ public boolean hasNext() { if (!iterator.hasNext()) { try { nextContainer(); - } catch (IOException e) { - throw new SAMException(e); - } catch (IllegalAccessException e) { + } catch (IOException | IllegalAccessException e) { throw new SAMException(e); } } @@ -271,7 +266,11 @@ public boolean hasNext() { @Override public SAMRecord next() { - return iterator.next(); + if (hasNext()) { + return iterator.next(); + } else { + throw new NoSuchElementException(); + } } @Override diff --git a/src/test/java/htsjdk/samtools/CRAMEdgeCasesTest.java b/src/test/java/htsjdk/samtools/CRAMEdgeCasesTest.java index 4fa9b1a59d..6c6a05f4de 100644 --- a/src/test/java/htsjdk/samtools/CRAMEdgeCasesTest.java +++ b/src/test/java/htsjdk/samtools/CRAMEdgeCasesTest.java @@ -3,19 +3,16 @@ import htsjdk.HtsjdkTest; 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.Collections; import java.util.Iterator; /** @@ -79,22 +76,9 @@ public void testNullsAndBeyondRef() throws IOException { testSingleRecord("AAA".getBytes(), "!!!".getBytes(), "A".getBytes()); } - private void testRecords(Collection 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 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); + private static void testRecords(Collection records, byte[] ref) throws IOException { + CRAMFileReader cramFileReader = CRAMTestUtils.writeAndReadFromInMemoryCram(records, ref); + Iterator it; final SAMRecordIterator iterator = cramFileReader.getIterator(); Assert.assertTrue(iterator.hasNext()); @@ -113,16 +97,8 @@ private void testRecords(Collection records, byte[] ref) throws IOExc 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); + private static void testSingleRecord(SAMRecord record, byte[] ref) throws IOException { + CRAMFileReader cramFileReader = CRAMTestUtils.writeAndReadFromInMemoryCram(Collections.singletonList(record), ref); final SAMRecordIterator iterator = cramFileReader.getIterator(); Assert.assertTrue(iterator.hasNext()); SAMRecord s2 = iterator.next(); diff --git a/src/test/java/htsjdk/samtools/CRAMFileReaderTest.java b/src/test/java/htsjdk/samtools/CRAMFileReaderTest.java index da53f170cc..a5999f8daf 100644 --- a/src/test/java/htsjdk/samtools/CRAMFileReaderTest.java +++ b/src/test/java/htsjdk/samtools/CRAMFileReaderTest.java @@ -37,6 +37,7 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.NoSuchElementException; /** * Additional tests for CRAMFileReader are in CRAMFileIndexTest @@ -229,4 +230,14 @@ public void testCRAMReader7_WithoutCRAMIndex() throws IOException { CRAMFileReader reader = new CRAMFileReader(CRAM_WITHOUT_CRAI, indexFile, REFERENCE, ValidationStringency.STRICT); reader.getIndex(); } + + @Test + public void testCramIteratorWithoutCallingHasNextFirst() throws IOException { + final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted); + builder.addFrag("1", 0, 2, false); + final CRAMFileReader reader = CRAMTestUtils.writeAndReadFromInMemoryCram(builder); + final SAMRecordIterator iterator = reader.getIterator(); + Assert.assertNotNull(iterator.next()); + Assert.assertThrows(NoSuchElementException.class, iterator::next); + } } diff --git a/src/test/java/htsjdk/samtools/CRAMTestUtils.java b/src/test/java/htsjdk/samtools/CRAMTestUtils.java new file mode 100644 index 0000000000..b3d80ff487 --- /dev/null +++ b/src/test/java/htsjdk/samtools/CRAMTestUtils.java @@ -0,0 +1,66 @@ +package htsjdk.samtools; + +import htsjdk.samtools.cram.ref.CRAMReferenceSource; +import htsjdk.samtools.cram.ref.ReferenceSource; +import htsjdk.samtools.reference.InMemoryReferenceSequenceFile; +import htsjdk.samtools.seekablestream.SeekableStream; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; + +public final class CRAMTestUtils { + + //private constructor since this is a utility class + private CRAMTestUtils(){}; + + /** + * Write a collection of SAMRecords into an in memory Cram file and then open a reader over it + * @param records a Collection of SAMRecords + * @param ref a set of bases to use as the single reference contig named "chr1" + * @return a CRAMFileReader reading from an in memory buffer that has had the records written into it + */ + public static CRAMFileReader writeAndReadFromInMemoryCram(Collection records, byte[] ref) throws IOException { + InMemoryReferenceSequenceFile refFile = new InMemoryReferenceSequenceFile(); + refFile.add("chr1", ref); + ReferenceSource source = new ReferenceSource(refFile); + final SAMFileHeader header = records.iterator().next().getHeader(); + return writeAndReadFromInMemoryCram(records, source, header); + } + + /** + * Write a collection of SAMRecords into an in memory Cram file and then open a reader over it + * @param records a SAMRecordSetBuilder which has been initialized with records + * @return a CRAMFileReader reading from an in memory buffer that has had the records written into it, uses a fake reference with all A's + */ + public static CRAMFileReader writeAndReadFromInMemoryCram(SAMRecordSetBuilder records) throws IOException { + return writeAndReadFromInMemoryCram(records.getRecords(), getFakeReferenceSource(), records.getHeader()); + } + + private static CRAMFileReader writeAndReadFromInMemoryCram(Collection records, CRAMReferenceSource source, SAMFileHeader header) throws IOException { + try(ByteArrayOutputStream baos = new ByteArrayOutputStream(); + CRAMFileWriter cramFileWriter = new CRAMFileWriter(baos, source, header, "whatever")){ + + records.forEach(cramFileWriter::addAlignment); + + //force a flush before reading from the buffer + cramFileWriter.close(); + + return new CRAMFileReader(new ByteArrayInputStream(baos.toByteArray()), (SeekableStream) null, source, ValidationStringency.SILENT); + } + } + + /** + * return a CRAMReferenceSource that returns all A's for any sequence queried + */ + public static CRAMReferenceSource getFakeReferenceSource() { + return (sequenceRecord, tryNameVariants) -> { + byte[] bases = new byte[sequenceRecord.getSequenceLength()]; + Arrays.fill(bases, (byte)'A'); + return bases; + }; + } +} From 37069a344a675d8948713dbf094d296744180b99 Mon Sep 17 00:00:00 2001 From: jmthibault79 Date: Fri, 19 Oct 2018 11:26:23 -0400 Subject: [PATCH 78/83] Unit Tests and fixes for a few classes in samtools.cram.io (#1198) * Additional roundtrips for ExternalCompressionTest + moved inside samtools * Rename CramArray to CramIntArray and add tests - add IOTestCases and CramIntTest - rename RamInt.read to readInt32 - byte[] and ByteBuffer tests and fixes --- .../java/htsjdk/samtools/cram/io/CramInt.java | 14 +- .../io/{CramArray.java => CramIntArray.java} | 2 +- .../htsjdk/samtools/cram/structure/Block.java | 2 +- .../cram/structure/ContainerHeaderIO.java | 10 +- .../samtools/cram/structure/SliceIO.java | 6 +- .../cram/io/ExternalCompressionTest.java | 29 ---- .../htsjdk/samtools/cram/VersionTest.java | 4 +- .../samtools/cram/io/CramIntArrayTest.java | 27 ++++ .../htsjdk/samtools/cram/io/CramIntTest.java | 106 ++++++++++++++ .../cram/io/ExternalCompressionTest.java | 54 +++++++ .../htsjdk/samtools/cram/io/IOTestCases.java | 135 ++++++++++++++++++ .../htsjdk/samtools/cram/io/ITF8Test.java | 37 +---- .../htsjdk/samtools/cram/io/LTF8Test.java | 40 +----- 13 files changed, 344 insertions(+), 122 deletions(-) rename src/main/java/htsjdk/samtools/cram/io/{CramArray.java => CramIntArray.java} (97%) delete mode 100644 src/test/java/htsjdk/cram/io/ExternalCompressionTest.java create mode 100644 src/test/java/htsjdk/samtools/cram/io/CramIntArrayTest.java create mode 100644 src/test/java/htsjdk/samtools/cram/io/CramIntTest.java create mode 100644 src/test/java/htsjdk/samtools/cram/io/ExternalCompressionTest.java create mode 100644 src/test/java/htsjdk/samtools/cram/io/IOTestCases.java diff --git a/src/main/java/htsjdk/samtools/cram/io/CramInt.java b/src/main/java/htsjdk/samtools/cram/io/CramInt.java index 1b0432f9b6..58a14d15db 100644 --- a/src/main/java/htsjdk/samtools/cram/io/CramInt.java +++ b/src/main/java/htsjdk/samtools/cram/io/CramInt.java @@ -17,7 +17,7 @@ public class CramInt { * @return an integer value read * @throws IOException as per java IO contract */ - public static int int32(final InputStream inputStream) throws IOException { + public static int readInt32(final InputStream inputStream) throws IOException { return inputStream.read() | inputStream.read() << 8 | inputStream.read() << 16 | inputStream.read() << 24; } @@ -27,7 +27,7 @@ public static int int32(final InputStream inputStream) throws IOException { * @param data input stream to read from * @return an integer value read */ - public static int int32(final byte[] data) { + public static int readInt32(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); @@ -39,8 +39,11 @@ public static int int32(final byte[] data) { * @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; + public static int readInt32(final ByteBuffer buffer) { + return (0xFF & buffer.get()) | + (0xFF & buffer.get()) << 8 | + (0xFF & buffer.get()) << 16 | + (0xFF & buffer.get()) << 24; } /** @@ -61,7 +64,7 @@ public static int writeInt32(final int value, final OutputStream outputStream) t } /** - * Write int value to {@link OutputStream} encoded as CRAM int data type. + * Write int value to an array of bytes 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 @@ -74,5 +77,4 @@ public static byte[] writeInt32(final int value) { data[3] = (byte) (value >> 24 & 0xFF); return data; } - } diff --git a/src/main/java/htsjdk/samtools/cram/io/CramArray.java b/src/main/java/htsjdk/samtools/cram/io/CramIntArray.java similarity index 97% rename from src/main/java/htsjdk/samtools/cram/io/CramArray.java rename to src/main/java/htsjdk/samtools/cram/io/CramIntArray.java index 819319e476..8ce5421de5 100644 --- a/src/main/java/htsjdk/samtools/cram/io/CramArray.java +++ b/src/main/java/htsjdk/samtools/cram/io/CramIntArray.java @@ -7,7 +7,7 @@ /** * Methods to read and write CRAM array of integers data type. */ -public class CramArray { +public class CramIntArray { /** * Read CRAM int array from a {@link InputStream}. * diff --git a/src/main/java/htsjdk/samtools/cram/structure/Block.java b/src/main/java/htsjdk/samtools/cram/structure/Block.java index 2e99b8a76c..b74577a2f8 100644 --- a/src/main/java/htsjdk/samtools/cram/structure/Block.java +++ b/src/main/java/htsjdk/samtools/cram/structure/Block.java @@ -91,7 +91,7 @@ public static Block readFromInputStream(final int major, InputStream inputStream InputStreamUtils.readFully(inputStream, block.compressedContent, 0, block.compressedContent.length); if (v3OrHigher) { final int actualChecksum = ((CRC32InputStream) inputStream).getCRC32(); - final int checksum = CramInt.int32(inputStream); + final int checksum = CramInt.readInt32(inputStream); if (checksum != actualChecksum) throw new RuntimeException(String.format("Block CRC32 mismatch: %04x vs %04x", checksum, actualChecksum)); } diff --git a/src/main/java/htsjdk/samtools/cram/structure/ContainerHeaderIO.java b/src/main/java/htsjdk/samtools/cram/structure/ContainerHeaderIO.java index fd6edfe178..7e6e203f13 100644 --- a/src/main/java/htsjdk/samtools/cram/structure/ContainerHeaderIO.java +++ b/src/main/java/htsjdk/samtools/cram/structure/ContainerHeaderIO.java @@ -18,7 +18,7 @@ package htsjdk.samtools.cram.structure; import htsjdk.samtools.cram.io.CRC32OutputStream; -import htsjdk.samtools.cram.io.CramArray; +import htsjdk.samtools.cram.io.CramIntArray; import htsjdk.samtools.cram.io.CramInt; import htsjdk.samtools.cram.io.ITF8; import htsjdk.samtools.cram.io.LTF8; @@ -49,7 +49,7 @@ public boolean readContainerHeader(final int major, final Container container, f peek[i] = (byte) character; } - container.containerByteSize = CramInt.int32(peek); + container.containerByteSize = CramInt.readInt32(peek); container.sequenceId = ITF8.readUnsignedITF8(inputStream); container.alignmentStart = ITF8.readUnsignedITF8(inputStream); container.alignmentSpan = ITF8.readUnsignedITF8(inputStream); @@ -57,9 +57,9 @@ public boolean readContainerHeader(final int major, final Container container, f container.globalRecordCounter = LTF8.readUnsignedLTF8(inputStream); container.bases = LTF8.readUnsignedLTF8(inputStream); container.blockCount = ITF8.readUnsignedITF8(inputStream); - container.landmarks = CramArray.array(inputStream); + container.landmarks = CramIntArray.array(inputStream); if (major >= 3) - container.checksum = CramInt.int32(inputStream); + container.checksum = CramInt.readInt32(inputStream); return true; } @@ -84,7 +84,7 @@ public int writeContainerHeader(final int major, final Container container, fina 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; + length += (CramIntArray.write(container.landmarks, crc32OutputStream) + 7) / 8; if (major >= 3) { outputStream.write(crc32OutputStream.getCrc32_LittleEndian()); diff --git a/src/main/java/htsjdk/samtools/cram/structure/SliceIO.java b/src/main/java/htsjdk/samtools/cram/structure/SliceIO.java index 4ccbb36969..3afca735dc 100644 --- a/src/main/java/htsjdk/samtools/cram/structure/SliceIO.java +++ b/src/main/java/htsjdk/samtools/cram/structure/SliceIO.java @@ -22,7 +22,7 @@ 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.CramIntArray; import htsjdk.samtools.cram.io.ITF8; import htsjdk.samtools.cram.io.InputStreamUtils; import htsjdk.samtools.cram.io.LTF8; @@ -54,7 +54,7 @@ private static void parseSliceHeaderBlock(final int major, final Slice slice) th slice.globalRecordCounter = LTF8.readUnsignedLTF8(inputStream); slice.nofBlocks = ITF8.readUnsignedITF8(inputStream); - slice.contentIDs = CramArray.array(inputStream); + slice.contentIDs = CramIntArray.array(inputStream); slice.embeddedRefBlockContentID = ITF8.readUnsignedITF8(inputStream); slice.refMD5 = new byte[16]; InputStreamUtils.readFully(inputStream, slice.refMD5, 0, slice.refMD5.length); @@ -85,7 +85,7 @@ private static byte[] createSliceHeaderBlockContent(final int major, final Slice int i = 0; for (final int id : slice.external.keySet()) slice.contentIDs[i++] = id; - CramArray.write(slice.contentIDs, byteArrayOutputStream); + CramIntArray.write(slice.contentIDs, byteArrayOutputStream); ITF8.writeUnsignedITF8(slice.embeddedRefBlockContentID, byteArrayOutputStream); byteArrayOutputStream.write(slice.refMD5 == null ? new byte[16] : slice.refMD5); 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 60a65197de..0000000000 --- a/src/test/java/htsjdk/cram/io/ExternalCompressionTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package htsjdk.cram.io; - -import htsjdk.HtsjdkTest; -import htsjdk.samtools.cram.io.ExternalCompression; -import org.testng.Assert; -import org.testng.annotations.Test; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; - -public class ExternalCompressionTest extends HtsjdkTest { - 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/cram/VersionTest.java b/src/test/java/htsjdk/samtools/cram/VersionTest.java index be2851eb6d..c4b27d89b1 100644 --- a/src/test/java/htsjdk/samtools/cram/VersionTest.java +++ b/src/test/java/htsjdk/samtools/cram/VersionTest.java @@ -91,7 +91,7 @@ public void test_V3() throws IOException { CRC32 digester = new CRC32(); digester.update(containerHeaderBytes); Assert.assertEquals(container.checksum, (int) digester.getValue()); - Assert.assertEquals(CramInt.int32(crcBytes), container.checksum); + Assert.assertEquals(CramInt.readInt32(crcBytes), container.checksum); // test block's crc: cramSeekableStream.seek(firstBlockStart); @@ -102,6 +102,6 @@ public void test_V3() throws IOException { crcBytes = InputStreamUtils.readFully(cramSeekableStream, crcByteSize); digester = new CRC32(); digester.update(blockBytes); - Assert.assertEquals(CramInt.int32(crcBytes), (int) digester.getValue()); + Assert.assertEquals(CramInt.readInt32(crcBytes), (int) digester.getValue()); } } diff --git a/src/test/java/htsjdk/samtools/cram/io/CramIntArrayTest.java b/src/test/java/htsjdk/samtools/cram/io/CramIntArrayTest.java new file mode 100644 index 0000000000..22f5b5dc2a --- /dev/null +++ b/src/test/java/htsjdk/samtools/cram/io/CramIntArrayTest.java @@ -0,0 +1,27 @@ +package htsjdk.samtools.cram.io; + +import htsjdk.HtsjdkTest; +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; + +public class CramIntArrayTest extends HtsjdkTest { + + @Test(dataProvider = "testInt32Arrays", dataProviderClass = IOTestCases.class) + public void runTest(List ints) throws IOException { + + int[] inputArray = ints.stream().mapToInt(Integer::intValue).toArray(); + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + CramIntArray.write(inputArray, baos); + + try (ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray())) { + int[] outputArray = CramIntArray.array(bais); + Assert.assertEquals(inputArray, outputArray, "Arrays did not match"); + } + } + } +} diff --git a/src/test/java/htsjdk/samtools/cram/io/CramIntTest.java b/src/test/java/htsjdk/samtools/cram/io/CramIntTest.java new file mode 100644 index 0000000000..7e3c2de67a --- /dev/null +++ b/src/test/java/htsjdk/samtools/cram/io/CramIntTest.java @@ -0,0 +1,106 @@ +package htsjdk.samtools.cram.io; + +import htsjdk.HtsjdkTest; +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; + +public class CramIntTest extends HtsjdkTest { + private byte[] streamWritten(List ints) throws IOException { + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + for (int value : ints) { + CramInt.writeInt32(value, baos); + } + return baos.toByteArray(); + } + } + + private byte[] byteArrayWritten(List ints) { + final int bufSize = 4; + final int arraySize = bufSize * ints.size(); + byte[] array = new byte[arraySize]; + + int offset = 0; + byte[] arrayBuffer; + + for (int value : ints) { + arrayBuffer = CramInt.writeInt32(value); + System.arraycopy(arrayBuffer, 0, array, offset, bufSize); + offset += bufSize; + } + + return array; + } + + @Test(dataProvider = "littleEndianTests32", dataProviderClass = IOTestCases.class) + public void checkStreamLittleEndian(Integer testInt, byte[] expected) throws IOException { + List ints = new ArrayList<>(); + ints.add(testInt); + + byte[] actual = streamWritten(ints); + Assert.assertEquals(actual, expected); + } + + @Test(dataProvider = "littleEndianTests32", dataProviderClass = IOTestCases.class) + public void checkByteArrayLittleEndian(Integer testInt, byte[] expected) { + List ints = new ArrayList<>(); + ints.add(testInt); + + byte[] actual = byteArrayWritten(ints); + Assert.assertEquals(actual, expected); + } + + // Combinatorial tests of 2 CramInt write methods x 3 CramInt read methods + + @Test(dataProvider = "testInt32Arrays", dataProviderClass = IOTestCases.class) + public void matchStreamRead(List ints) throws IOException { + byte[][] inputs = {streamWritten(ints), byteArrayWritten(ints)}; + + for (byte[] byteArray : inputs) { + try (ByteArrayInputStream bais = new ByteArrayInputStream(byteArray)) { + for (int value : ints) { + int fromStream = CramInt.readInt32(bais); + Assert.assertEquals(fromStream, value, "Value did not match"); + } + } + } + } + + @Test(dataProvider = "testInt32Arrays", dataProviderClass = IOTestCases.class) + public void matchBufferRead(List ints) throws IOException { + byte[][] inputs = {streamWritten(ints), byteArrayWritten(ints)}; + + for (byte[] byteArray : inputs) { + ByteBuffer bb = ByteBuffer.wrap(byteArray); + + for (int value : ints) { + int fromBuffer = CramInt.readInt32(bb); + Assert.assertEquals(fromBuffer, value, "Value did not match"); + } + } + } + + @Test(dataProvider = "testInt32Arrays", dataProviderClass = IOTestCases.class) + public void matchByteArrayRead(List ints) throws IOException { + byte[][] inputs = {streamWritten(ints), byteArrayWritten(ints)}; + + for (byte[] inputArray : inputs) { + final int bufSize = 4; + byte[] outBuf = new byte[bufSize]; + int offset = 0; + + for (int value : ints) { + System.arraycopy(inputArray, offset, outBuf, 0, bufSize); + int fromBuffer = CramInt.readInt32(outBuf); + Assert.assertEquals(fromBuffer, value, "Value did not match"); + offset += bufSize; + } + } + } +} diff --git a/src/test/java/htsjdk/samtools/cram/io/ExternalCompressionTest.java b/src/test/java/htsjdk/samtools/cram/io/ExternalCompressionTest.java new file mode 100644 index 0000000000..7ee63e3c76 --- /dev/null +++ b/src/test/java/htsjdk/samtools/cram/io/ExternalCompressionTest.java @@ -0,0 +1,54 @@ +package htsjdk.samtools.cram.io; + +import htsjdk.HtsjdkTest; +import htsjdk.samtools.cram.encoding.rans.RANS; +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +public class ExternalCompressionTest extends HtsjdkTest { + 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 compression".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 testGZipRoundtrip() throws IOException { + final byte [] compressed = ExternalCompression.gzip(TEST_BYTES); + final byte [] restored = ExternalCompression.gunzip(compressed); + Assert.assertEquals(TEST_BYTES, restored); + } + + @Test + public void testBZip2Roundtrip() throws IOException { + final byte [] compressed = ExternalCompression.bzip2(TEST_BYTES); + final byte [] restored = ExternalCompression.unbzip2(compressed); + Assert.assertEquals(TEST_BYTES, restored); + } + + @Test + public void testRANSRoundtrip() { + for(RANS.ORDER order : RANS.ORDER.values()) { + final byte[] compressed = ExternalCompression.rans(TEST_BYTES, order); + final byte[] restored = ExternalCompression.unrans(compressed); + Assert.assertEquals(TEST_BYTES, restored); + } + } + + @Test + public void testXZRoundtrip() throws IOException { + final byte [] compressed = ExternalCompression.xz(TEST_BYTES); + final byte [] restored = ExternalCompression.unxz(compressed); + Assert.assertEquals(TEST_BYTES, restored); + } + + +} diff --git a/src/test/java/htsjdk/samtools/cram/io/IOTestCases.java b/src/test/java/htsjdk/samtools/cram/io/IOTestCases.java new file mode 100644 index 0000000000..e2a3b88b61 --- /dev/null +++ b/src/test/java/htsjdk/samtools/cram/io/IOTestCases.java @@ -0,0 +1,135 @@ +package htsjdk.samtools.cram.io; + +import htsjdk.HtsjdkTest; +import org.testng.annotations.DataProvider; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class IOTestCases extends HtsjdkTest { + + @DataProvider(name = "littleEndianTests32") + public static Object[][] littleEndianTests32() { + return new Object[][] { + {1, new byte[]{1, 0, 0, 0}}, // 0x01 + {127, new byte[]{127, 0, 0, 0}}, // 0x7F + {128, new byte[]{-128, 0, 0, 0}}, // 0x80 + {129, new byte[]{-127, 0, 0, 0}}, // 0x81 + {255, new byte[]{-1, 0, 0, 0}}, // 0xFF + {256, new byte[]{0, 1, 0, 0}}, // 0x0100 + {257, new byte[]{1, 1, 0, 0}}, // 0x0101 + {65535, new byte[]{-1, -1, 0, 0}}, // 0xFFFF + {65536, new byte[]{0, 0, 1, 0}}, // 0x010000 + {16777216, new byte[]{0, 0, 0, 1}}, // 0x01000000 + {2147483647, new byte[]{-1, -1, -1, 127}}, // 0x7FFFFFFF + {-2147483648, new byte[]{0, 0, 0, -128}}, // 0x80000000 + {-1, new byte[]{-1, -1, -1, -1}} // 0xFFFFFFFF + }; + } + + private static Object[][] asDataProvider(List list) { + Object[][] params = new Object[list.size()][]; + for (int i = 0; i < params.length; i++) + params[i] = new Object[]{list.get(i)}; + return params; + } + + static List int32Tests() { + List list = new ArrayList(); + + // 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); + + return list; + } + + @DataProvider(name = "testInt32") + public static Object[][] testInt32() { + return asDataProvider(IOTestCases.int32Tests()); + } + + @DataProvider(name = "testInt32Arrays") + public static Object[][] testValues32() { + List int32Tests = IOTestCases.int32Tests(); + List shuffled = new ArrayList<>(int32Tests); + Collections.shuffle(shuffled); + + return new Object[][]{ + {int32Tests}, + {shuffled} + }; + } + + static List int64Tests() { + List list = new ArrayList() ; + + // 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(Long.MAX_VALUE); + list.add(Long.MIN_VALUE); + list.add(1125899906842622L) ; + list.add(1125899906842622L); + list.add(562949953421312L); + list.add(4294967296L); + list.add(268435456L); + list.add(2147483648L); + list.add(-1L); + + return list; + } + + @DataProvider(name = "testInt64") + public static Object[][] testInt64() { + return asDataProvider(IOTestCases.int64Tests()); + } + + @DataProvider(name = "testInt64Arrays") + public static Object[][] testValues64() { + List int64Tests = IOTestCases.int64Tests(); + List shuffled = new ArrayList<>(int64Tests); + Collections.shuffle(shuffled); + + return new Object[][]{ + {int64Tests}, + {shuffled} + }; + } +} diff --git a/src/test/java/htsjdk/samtools/cram/io/ITF8Test.java b/src/test/java/htsjdk/samtools/cram/io/ITF8Test.java index a206ad1f04..749d0451bb 100644 --- a/src/test/java/htsjdk/samtools/cram/io/ITF8Test.java +++ b/src/test/java/htsjdk/samtools/cram/io/ITF8Test.java @@ -11,7 +11,6 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** @@ -34,41 +33,7 @@ public void reset() { testBAIS.reset(); } - - @DataProvider(name = "testITF8") - public static Object[][] testValues() { - List list = new ArrayList() ; - - // 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 list = new ArrayList() ; - - // 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 Date: Fri, 19 Oct 2018 17:59:37 -0400 Subject: [PATCH 79/83] BetaIntegerCodecTest and bugfixes (#1199) * Fixed off-by-one error * Include offset in bit count check --- .../cram/encoding/BetaIntegerCodec.java | 64 ++++++-- .../cram/encoding/BetaIntegerCodecTest.java | 140 ++++++++++++++++++ 2 files changed, 189 insertions(+), 15 deletions(-) create mode 100644 src/test/java/htsjdk/samtools/cram/encoding/BetaIntegerCodecTest.java diff --git a/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerCodec.java index 496f5a63be..d96b46ef2a 100644 --- a/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerCodec.java +++ b/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerCodec.java @@ -22,36 +22,70 @@ import java.io.IOException; - +/** + * Encodes integers by adding a constant offset value to a range of values in order to reduce + * the necessary number of bits needed to store each value. + * + * As a simple example, consider a data series with values all in the range 10,000 - 10,100. + * Choosing the offset -10,000 means every encoded value will be stored as 0 - 100, + * requiring only ceil(log2(100)) = 7 bits per value. + */ class BetaIntegerCodec extends AbstractBitCodec { - private int offset = 0; - private final int readNofBits; + private final int offset; + private final int bitsPerValue; + private final long valueLimit; // 1 << bitsPerValue (max 32) so int is too small + + /** + * Given integers to encode in the range MIN to MAX: + * + * @param offset the common value to be added to all values before storage. + * Setting this to (-MIN) will ensure all stored values will be in the range (0 .. MAX - MIN) + * @param bitsPerValue the smallest value which will allow the largest stored value (MAX - MIN) + */ + public BetaIntegerCodec(final int offset, final int bitsPerValue) { + if (bitsPerValue <= 0) { + throw new IllegalArgumentException("Number of bits per value must be positive"); + } else if (bitsPerValue > 32) { + throw new IllegalArgumentException("Number of bits per value must be 32 or lower"); + } - public BetaIntegerCodec(final int offset, final int readNofBits) { this.offset = offset; - this.readNofBits = readNofBits; + this.bitsPerValue = bitsPerValue; + this.valueLimit = 1L << bitsPerValue; } @Override public final Integer read(final BitInputStream bitInputStream) throws IOException { - return bitInputStream.readBits(readNofBits) - offset; + return bitInputStream.readBits(bitsPerValue) - offset; + } + + private int getAndCheckOffsetValue(int value) { + final int newValue = value + offset; + + if (newValue < 0) { + String negative = String.format("Value %s plus offset %s must be positive", + value, offset); + throw new IllegalArgumentException(negative); + } else if (newValue >= valueLimit) { + String tooBig = String.format("Value %s plus offset %s is greater than or equal to limit %s", + value, offset, valueLimit); + throw new IllegalArgumentException(tooBig); + } + + return newValue; } @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; + bitOutputStream.write(getAndCheckOffsetValue(value), bitsPerValue); + // every value is encoded using the same number of bits + return bitsPerValue; } @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; + // every value is encoded using the same number of bits + return bitsPerValue; } @Override diff --git a/src/test/java/htsjdk/samtools/cram/encoding/BetaIntegerCodecTest.java b/src/test/java/htsjdk/samtools/cram/encoding/BetaIntegerCodecTest.java new file mode 100644 index 0000000000..742da5d81c --- /dev/null +++ b/src/test/java/htsjdk/samtools/cram/encoding/BetaIntegerCodecTest.java @@ -0,0 +1,140 @@ +package htsjdk.samtools.cram.encoding; + +import htsjdk.HtsjdkTest; +import htsjdk.samtools.cram.io.BitOutputStream; +import htsjdk.samtools.cram.io.DefaultBitInputStream; +import htsjdk.samtools.cram.io.DefaultBitOutputStream; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.io.*; + +public class BetaIntegerCodecTest extends HtsjdkTest { + + private void testCodec(int offset, int bitsPerValue, int[] values) throws IOException { + BitCodec codec = new BetaIntegerCodec(offset, bitsPerValue); + + try (ByteArrayOutputStream os = new ByteArrayOutputStream(); + BitOutputStream bos = new DefaultBitOutputStream(os)) { + + for (int value : values) { + codec.write(bos, value); + } + + int[] actual = new int[values.length]; + try (InputStream is = new ByteArrayInputStream(os.toByteArray()); + DefaultBitInputStream dbis = new DefaultBitInputStream(is)) { + + for (int i = 0; i < values.length; i++) { + actual[i] = codec.read(dbis); + } + } + + Assert.assertEquals(actual, values); + } + } + + // test that the offsets enable the data series to be stored in N bits + + @DataProvider(name = "basicTest") + public Object[][] basicTestData() { + return new Object[][] { + {8, -100, new int[]{100, 101, 102, (1<<8) + 98, (1<<8) + 99}}, + {4, 10015, new int[]{-10015, -10014, -10001, -10000}}, + }; + } + + @Test(dataProvider = "basicTest") + public void basicTest(int bitsPerValue, int offset, int[] values) throws IOException { + testCodec(offset, bitsPerValue, values); + } + + // test that values fit into N bits without offsets + + @DataProvider(name = "basicTestNoOffset") + public Object[][] basicTestNoOffsetData() { + return new Object[][] { + {8, new int[]{0, 1, 2, 100, (1 << 8) - 2, (1 << 8) - 1}}, + {16, new int[]{0, 1, 255, (1 << 16) - 2, (1 << 16) - 1}}, + }; + } + + @Test(dataProvider = "basicTestNoOffset") + public void basicTestNoOffset(int bitsPerValue, int[] values) throws IOException { + testCodec(0, bitsPerValue, values); + } + + // sanity checks for bitsPerValue. Must be > 0 and <= 32 + + @DataProvider(name = "bitsPerValue") + public Object[][] bitsPerValueData() { + return new Object[][] { + {0}, + {-1}, + {33} + }; + } + + @Test(dataProvider = "bitsPerValue", expectedExceptions = IllegalArgumentException.class) + public void bitsPerValue(int bitsPerValue) { + new BetaIntegerCodec(0, bitsPerValue); + } + + // throw Exceptions when offsets + values are too big to store in N bits + + @DataProvider(name = "overflow") + public Object[][] overflowData() { + // tuples of bitsPerValue and offsets + values which are too big to store + return new Object[][] { + // first with zero offset + {1, 0, (1 << 1)}, + {2, 0, (1 << 2)}, + {4, 0, (1 << 4)}, + {8, 0, (1 << 8)}, + {16, 0, (1 << 16)}, + + // adding offset of 1 will put it over + {1, 1, (1 << 1) - 1}, + {2, 1, (1 << 2) - 1}, + {4, 1, (1 << 4) - 1}, + {8, 1, (1 << 8) - 1}, + {16, 1, (1 << 16) - 1}, + }; + } + + @Test(dataProvider = "overflow", expectedExceptions = IllegalArgumentException.class) + public void overflow(int bitsPerValue, int offset, int value) throws IOException { + BitCodec codec = new BetaIntegerCodec(offset, bitsPerValue); + + try (ByteArrayOutputStream os = new ByteArrayOutputStream(); + BitOutputStream bos = new DefaultBitOutputStream(os)) { + codec.write(bos, value); + } + } + + // throw Exceptions when offsets + values are negative + + @DataProvider(name = "negativeTest") + public Object[][] negativeTestData() { + // tuples of bitsPerValue and offsets + values which are negative + return new Object[][] { + {1, 0, -1}, + {1, -1, 0}, + {2, 0, -1}, + {2, -1, 0}, + {8, -100, 99}, + {8, 99, -100}, + }; + } + + @Test(dataProvider = "negativeTest", expectedExceptions = IllegalArgumentException.class) + public void negativeTest(int bitsPerValue, int offset, int value) throws IOException { + BitCodec codec = new BetaIntegerCodec(offset, bitsPerValue); + + try (ByteArrayOutputStream os = new ByteArrayOutputStream(); + BitOutputStream bos = new DefaultBitOutputStream(os)) { + codec.write(bos, value); + } + } +} \ No newline at end of file From 334800e73760c5ffd3278cfab28d68671f9e78a1 Mon Sep 17 00:00:00 2001 From: Nils Homer Date: Wed, 24 Oct 2018 11:19:32 -0700 Subject: [PATCH 80/83] Add the PS FORMAT VCF standard header field (#1200) Add a standardized VCF headerline for the PS field. --- src/main/java/htsjdk/variant/vcf/VCFStandardHeaderLines.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/htsjdk/variant/vcf/VCFStandardHeaderLines.java b/src/main/java/htsjdk/variant/vcf/VCFStandardHeaderLines.java index de2817c96b..035cdd3c39 100644 --- a/src/main/java/htsjdk/variant/vcf/VCFStandardHeaderLines.java +++ b/src/main/java/htsjdk/variant/vcf/VCFStandardHeaderLines.java @@ -158,6 +158,7 @@ private static void registerStandard(final VCFFormatHeaderLine line) { 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_SET_KEY, 1, VCFHeaderLineType.Integer, "Phasing set (typically the position of the first variant in the set)")); registerStandard(new VCFFormatHeaderLine(VCFConstants.PHASE_QUALITY_KEY, 1, VCFHeaderLineType.Float, "Read-backed phasing quality")); // INFO lines From 44baddffee15659c6adef96f39bc35a0b980d686 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Wed, 24 Oct 2018 17:17:47 -0400 Subject: [PATCH 81/83] Adding support for 0-length B arrays in SAM files to conform to 1.6 spec (#1194) * Adding support for 0-length B arrays in SAM files to conform to 1.6 spec. * adding explicit test dependency on a recent version of guava, we already have a transitive test dependency on an older version so this shouldn't be a big deal (unless of course it breaks something unexpected) * adding new method for combining Dataproviders to TestNGUtils --- build.gradle | 1 + .../java/htsjdk/samtools/SAMLineParser.java | 5 +- src/main/java/htsjdk/samtools/SAMRecord.java | 3 - .../java/htsjdk/samtools/TextTagCodec.java | 33 ++- .../htsjdk/samtools/SAMRecordUnitTest.java | 86 +++++- .../htsjdk/samtools/SAMTextReaderTest.java | 20 ++ .../htsjdk/samtools/SAMTextWriterTest.java | 14 +- .../htsjdk/samtools/TextTagCodecTest.java | 112 +++++++ src/test/java/htsjdk/tribble/TestUtils.java | 7 + src/test/java/htsjdk/utils/TestNGUtils.java | 40 +++ .../java/htsjdk/utils/TestNGUtilsTest.java | 150 ++++++++++ .../htsjdk/samtools/one-contig.fasta | 278 ++++++++++++++++++ .../htsjdk/samtools/one-contig.fasta.fai | 1 + 13 files changed, 721 insertions(+), 29 deletions(-) create mode 100644 src/test/java/htsjdk/samtools/TextTagCodecTest.java create mode 100644 src/test/java/htsjdk/utils/TestNGUtilsTest.java create mode 100644 src/test/resources/htsjdk/samtools/one-contig.fasta create mode 100644 src/test/resources/htsjdk/samtools/one-contig.fasta.fai diff --git a/build.gradle b/build.gradle index 7753a6f386..25a8e7d07c 100644 --- a/build.gradle +++ b/build.gradle @@ -43,6 +43,7 @@ dependencies { testRuntime 'org.pegdown:pegdown:1.6.0' // Necessary for generating HTML reports with ScalaTest testCompile "org.testng:testng:6.14.3" testCompile "com.google.jimfs:jimfs:1.1" + testCompile "com.google.guava:guava:26.0-jre" } sourceCompatibility = 1.8 diff --git a/src/main/java/htsjdk/samtools/SAMLineParser.java b/src/main/java/htsjdk/samtools/SAMLineParser.java index f73a67e08e..c015aa0a5a 100644 --- a/src/main/java/htsjdk/samtools/SAMLineParser.java +++ b/src/main/java/htsjdk/samtools/SAMLineParser.java @@ -465,10 +465,9 @@ private void reportErrorParsingLine(final String reason) { private void reportErrorParsingLine(final Exception e) { final String errorMessage = makeErrorString(e.getMessage()); if (validationStringency == ValidationStringency.STRICT) { - throw new SAMFormatException(errorMessage); + throw new SAMFormatException(errorMessage, e); } else if (validationStringency == ValidationStringency.LENIENT) { - System.err - .println("Ignoring SAM validation error due to lenient parsing:"); + System.err.println("Ignoring SAM validation error due to lenient parsing:"); System.err.println(errorMessage); } } diff --git a/src/main/java/htsjdk/samtools/SAMRecord.java b/src/main/java/htsjdk/samtools/SAMRecord.java index 3146f6b48a..c5bcbdffb1 100644 --- a/src/main/java/htsjdk/samtools/SAMRecord.java +++ b/src/main/java/htsjdk/samtools/SAMRecord.java @@ -1419,9 +1419,6 @@ public Object getAttribute(final short tag) { * 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); } diff --git a/src/main/java/htsjdk/samtools/TextTagCodec.java b/src/main/java/htsjdk/samtools/TextTagCodec.java index 40dc8ac73f..e86bef0412 100644 --- a/src/main/java/htsjdk/samtools/TextTagCodec.java +++ b/src/main/java/htsjdk/samtools/TextTagCodec.java @@ -44,6 +44,8 @@ public class TextTagCodec { // 3 fields for non-empty strings 2 fields if the string is empty. private static final int NUM_TAG_FIELDS = 3; + private static final String[] EMPTY_STRING_ARRAY = new String[0]; + /** * This is really a local variable of decode(), but allocated here to reduce allocations. */ @@ -52,7 +54,7 @@ public class TextTagCodec { /** * Convert in-memory representation of tag to SAM text representation. * @param tagName Two-character tag name. - * @param value Tag value as approriate Object subclass. + * @param value Tag value as appropriate Object subclass. * @return SAM text String representation, i.e. name:type:value */ public String encode(final String tagName, Object value) { @@ -71,7 +73,7 @@ public String encode(final String tagName, Object value) { // H should never happen anymore. value = StringUtil.bytesToHexString((byte[])value); } else if (tagType == 'B') { - value = getArrayType(value, false) + "," + encodeArrayValue(value); + value = getArrayType(value, false) + encodeArrayValue(value); } else if (tagType == 'i') { final long longVal = ((Number) value).longValue(); // as the spec says: [-2^31, 2^32) @@ -83,7 +85,7 @@ public String encode(final String tagName, Object value) { return sb.toString(); } - private char getArrayType(final Object array, final boolean isUnsigned) { + private static char getArrayType(final Object array, final boolean isUnsigned) { final char type; final Class componentType = array.getClass().getComponentType(); if (componentType == Float.TYPE) { @@ -97,10 +99,10 @@ private char getArrayType(final Object array, final boolean isUnsigned) { return (isUnsigned? Character.toUpperCase(type): type); } - private String encodeArrayValue(final Object value) { - final StringBuilder ret = new StringBuilder(Array.get(value, 0).toString()); + private static String encodeArrayValue(final Object value) { final int length = Array.getLength(value); - for (int i = 1; i < length; ++i) { + final StringBuilder ret = new StringBuilder(); + for (int i = 0; i < length; ++i) { ret.append(','); ret.append(Array.get(value, i).toString()); } @@ -108,7 +110,7 @@ private String encodeArrayValue(final Object value) { } - private long[] widenToUnsigned(final Object array) { + private static long[] widenToUnsigned(final Object array) { final Class componentType = array.getClass().getComponentType(); final long mask; if (componentType == Byte.TYPE) mask = 0xffL; @@ -127,7 +129,7 @@ String encodeUnsignedArray(final String tagName, final Object array) { throw new IllegalArgumentException("Non-array passed to encodeUnsignedArray: " + array.getClass()); } final long[] widened = widenToUnsigned(array); - return tagName + ":B:" + getArrayType(array, true) + "," + encodeArrayValue(widened); + return tagName + ":B:" + getArrayType(array, true) + encodeArrayValue(widened); } /** @@ -175,7 +177,7 @@ public Object setValue(final Object o) { }; } - private Object convertStringToObject(final String type, final String stringVal) { + private static Object convertStringToObject(final String type, final String stringVal) { if (type.equals("Z")) { return stringVal; } else if (type.equals("A")) { @@ -219,17 +221,18 @@ else if (SAMUtils.isValidUnsignedIntegerAttribute(lValue)) { } } - private Object covertStringArrayToObject(final String stringVal) { + private static 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"); - } + + final int numberOfTokens = StringUtil.splitConcatenateExcessTokens(stringVal, elementTypeAndValue, ','); + 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"); + + final String[] stringValues = elementTypeAndValue[1] != null ? elementTypeAndValue[1].split(",") : EMPTY_STRING_ARRAY; if (elementType == 'f') { final float[] ret = new float[stringValues.length]; for (int i = 0; i < stringValues.length; ++i) { diff --git a/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java b/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java index 135d5a321d..decf011792 100644 --- a/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java +++ b/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java @@ -25,21 +25,25 @@ package htsjdk.samtools; import htsjdk.HtsjdkTest; +import htsjdk.samtools.cram.build.CramIO; import htsjdk.samtools.util.BinaryCodec; +import htsjdk.samtools.util.IOUtil; import htsjdk.samtools.util.TestUtil; +import htsjdk.utils.TestNGUtils; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.*; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Optional; +import java.lang.reflect.Array; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; public class SAMRecordUnitTest extends HtsjdkTest { + private static final String ARRAY_TAG = "xa"; + @DataProvider(name = "serializationTestData") public Object[][] getSerializationTestData() { return new Object[][] { @@ -1169,4 +1173,76 @@ private Object[][] hasAttributeTestData() throws IOException { public void testHasAttribute(final SAMRecord samRecord, final String tag, final boolean expectedHasAttribute) { Assert.assertEquals(samRecord.hasAttribute(tag), expectedHasAttribute); } + + @Test + public void test_setAttribute_empty_array() { + final SAMFileHeader header = new SAMFileHeader(); + final SAMRecord record = new SAMRecord(header); + Assert.assertNull(record.getStringAttribute(ARRAY_TAG)); + record.setAttribute(ARRAY_TAG, new int[0]); + Assert.assertNotNull(record.getSignedIntArrayAttribute(ARRAY_TAG)); + Assert.assertEquals(record.getSignedIntArrayAttribute(ARRAY_TAG), new int[0]); + Assert.assertEquals(record.getAttribute(ARRAY_TAG), new char[0]); + record.setAttribute(ARRAY_TAG, null); + Assert.assertNull(record.getStringAttribute(ARRAY_TAG)); + } + + private static Object[][] getEmptyArrays() { + return new Object[][]{ + {new int[0], int[].class}, + {new short[0], short[].class}, + {new byte[0], byte[].class}, + {new float[0], float[].class}, + }; + } + + private static Object[][] getFileExtensions(){ + return new Object[][]{ + {BamFileIoUtils.BAM_FILE_EXTENSION}, {IOUtil.SAM_FILE_EXTENSION}, {CramIO.CRAM_FILE_EXTENSION} + }; + } + + @DataProvider + public Object[][] getEmptyArraysAndExtensions(){ + return TestNGUtils.cartesianProduct(getEmptyArrays(), getFileExtensions()); + } + + @Test(dataProvider = "getEmptyArraysAndExtensions") + public void testWriteSamWithEmptyArray(Object emptyArray, Class arrayClass, String fileExtension) throws IOException { + Assert.assertEquals(emptyArray.getClass(), arrayClass); + Assert.assertEquals(Array.getLength(emptyArray), 0); + + final SAMRecordSetBuilder samRecords = new SAMRecordSetBuilder(); + samRecords.addFrag("Read", 0, 100, false); + final SAMRecord record = samRecords.getRecords().iterator().next(); + record.setAttribute(ARRAY_TAG, emptyArray); + checkArrayIsEmpty(ARRAY_TAG, record, arrayClass); + + final Path tmp = Files.createTempFile("tmp", fileExtension); + IOUtil.deleteOnExit(tmp); + + final SAMFileWriterFactory writerFactory = new SAMFileWriterFactory() + .setCreateMd5File(false) + .setCreateIndex(false); + final Path reference = IOUtil.getPath("src/test/resources/htsjdk/samtools/one-contig.fasta"); + try (final SAMFileWriter samFileWriter = writerFactory.makeWriter(samRecords.getHeader(), false, tmp, reference)) { + samFileWriter.addAlignment(record); + } + + try (final SamReader reader = SamReaderFactory.makeDefault() + .referenceSequence(reference) + .open(tmp)) { + final SAMRecordIterator iterator = reader.iterator(); + Assert.assertTrue(iterator.hasNext()); + final SAMRecord recordFromDisk = iterator.next(); + checkArrayIsEmpty(ARRAY_TAG, recordFromDisk, arrayClass); + } + } + + private static void checkArrayIsEmpty(String arrayTag, SAMRecord recordFromDisk, Class expectedClass) { + final Object attribute = recordFromDisk.getAttribute(arrayTag); + Assert.assertNotNull(attribute); + Assert.assertEquals(attribute.getClass(), expectedClass); + Assert.assertEquals(Array.getLength(attribute), 0); + } } diff --git a/src/test/java/htsjdk/samtools/SAMTextReaderTest.java b/src/test/java/htsjdk/samtools/SAMTextReaderTest.java index 142eea32c1..36826d0925 100644 --- a/src/test/java/htsjdk/samtools/SAMTextReaderTest.java +++ b/src/test/java/htsjdk/samtools/SAMTextReaderTest.java @@ -27,12 +27,15 @@ 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.ByteArrayInputStream; import java.io.ByteArrayOutputStream; public class SAMTextReaderTest extends HtsjdkTest { + private static final String ARRAY_TAG = "xa"; + // Simple input, spot check that parsed correctly, and make sure nothing blows up. @Test public void testBasic() throws Exception { @@ -135,4 +138,21 @@ public void testTagWithColon() { Assert.assertEquals(recFromText.getAttribute(SAMTag.CQ.name()), valueWithColons); CloserUtil.close(reader); } + + @DataProvider + public Object[][] getRecordsWithArrays(){ + final String recordBase = "Read\t4\tchr1\t1\t0\t*\t*\t0\t0\tG\t%\t"; + return new Object[][]{ + {recordBase + ARRAY_TAG + ":B:i", new int[0]}, + {recordBase + ARRAY_TAG + ":B:i,", new int[0]}, + {recordBase + ARRAY_TAG + ":B:i,1,2,3,", new int[]{1,2,3}}, + }; + } + + @Test(dataProvider = "getRecordsWithArrays") + public void testSamRecordCanHandleArrays(String samRecord, Object array){ + final SAMLineParser samLineParser = new SAMLineParser(new SAMFileHeader()); + final SAMRecord record = samLineParser.parseLine(samRecord); + Assert.assertEquals(record.getAttribute(ARRAY_TAG), array); + } } diff --git a/src/test/java/htsjdk/samtools/SAMTextWriterTest.java b/src/test/java/htsjdk/samtools/SAMTextWriterTest.java index 5c9ff28cde..1ee916f58f 100644 --- a/src/test/java/htsjdk/samtools/SAMTextWriterTest.java +++ b/src/test/java/htsjdk/samtools/SAMTextWriterTest.java @@ -34,7 +34,7 @@ public class SAMTextWriterTest extends HtsjdkTest { - private SAMRecordSetBuilder getSAMReader(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder) { + private SAMRecordSetBuilder getSamRecordSet(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); @@ -45,7 +45,7 @@ private SAMRecordSetBuilder getSAMReader(final boolean sortForMe, final SAMFileH @Test public void testNullHeader() throws Exception { - final SAMRecordSetBuilder recordSetBuilder = getSAMReader(true, SAMFileHeader.SortOrder.coordinate); + final SAMRecordSetBuilder recordSetBuilder = getSamRecordSet(true, SAMFileHeader.SortOrder.coordinate); for (final SAMRecord rec : recordSetBuilder.getRecords()) { rec.setHeader(null); } @@ -77,7 +77,7 @@ private void doTest(final SAMRecordSetBuilder recordSetBuilder) throws Exception } private void doTest(final SamFlagField samFlagField) throws Exception { - doTest(getSAMReader(true, SAMFileHeader.SortOrder.coordinate), samFlagField); + doTest(getSamRecordSet(true, SAMFileHeader.SortOrder.coordinate), samFlagField); } private void doTest(final SAMRecordSetBuilder recordSetBuilder, final SamFlagField samFlagField) throws Exception { @@ -128,4 +128,12 @@ private void doTest(final SAMRecordSetBuilder recordSetBuilder, final SamFlagFie Assert.assertFalse(newSAMIt.hasNext()); inputSAM.close(); } + + @Test + public void testEmptyArrayAttributeHasNoCommaWhenWrittenToSAM(){ + final SAMFileHeader header = new SAMFileHeader(); + final SAMRecord record = new SAMRecord(header); + record.setAttribute("xa", new int[0]); + Assert.assertTrue(record.getSAMString().endsWith("xa:B:i\n")); + } } diff --git a/src/test/java/htsjdk/samtools/TextTagCodecTest.java b/src/test/java/htsjdk/samtools/TextTagCodecTest.java new file mode 100644 index 0000000000..7cedf19f34 --- /dev/null +++ b/src/test/java/htsjdk/samtools/TextTagCodecTest.java @@ -0,0 +1,112 @@ +package htsjdk.samtools; + +import htsjdk.HtsjdkTest; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Map; + +public class TextTagCodecTest extends HtsjdkTest { + + @DataProvider + public Object[][] getArraysToEncode(){ + return new Object[][]{ + {new byte[0], true, "xa:B:c"}, + {new byte[0], false, "xa:B:C"}, + {new byte[]{1, 2, 3}, true, "xa:B:c,1,2,3"}, + {new byte[]{1, 2, 3}, false, "xa:B:C,1,2,3"}, + + {new short[0], true, "xa:B:s"}, + {new short[0], false, "xa:B:S"}, + {new short[]{1, 2, 3}, true, "xa:B:s,1,2,3"}, + {new short[]{1, 2, 3}, false, "xa:B:S,1,2,3"}, + + {new int[0], true, "xa:B:i"}, + {new int[0], false, "xa:B:I"}, + {new int[]{1, 2, 3}, true, "xa:B:i,1,2,3"}, + {new int[]{1, 2, 3}, false, "xa:B:I,1,2,3"}, + + {new float[0], true, "xa:B:f"}, + {new float[]{1.0f, 2.0f, 3.0f}, true, "xa:B:f,1.0,2.0,3.0"}, + + }; + } + + @Test(dataProvider = "getArraysToEncode") + public void testEmptyAndNonEmptyArrayEncoding(Object array, boolean isSigned, String expectedTag){ + final TextTagCodec textTagCodec = new TextTagCodec(); + final String tagName = "xa"; + final String encodedTag = isSigned + ? textTagCodec.encode(tagName, array) + : textTagCodec.encodeUnsignedArray(tagName, array); + Assert.assertEquals(encodedTag, expectedTag); + } + + @DataProvider + public Object[][] getArraysToDecode(){ + return new Object[][]{ + {"xa:B:c", new byte[0]}, + {"xa:B:C", new TagValueAndUnsignedArrayFlag(new byte[0], true)}, + {"xa:B:c,1,2,3", new byte[]{1, 2, 3}}, + {"xa:B:C,1,2,3", new TagValueAndUnsignedArrayFlag(new byte[]{1, 2, 3}, true)}, + {"xa:B:c,", new byte[0]}, + {"xa:B:C,", new TagValueAndUnsignedArrayFlag(new byte[0], true)}, + + {"xa:B:s", new short[0]}, + {"xa:B:S", new TagValueAndUnsignedArrayFlag(new short[0], true)}, + {"xa:B:s,1,2,3", new short[]{1, 2, 3}}, + {"xa:B:S,1,2,3", new TagValueAndUnsignedArrayFlag(new short[]{1, 2, 3}, true)}, + {"xa:B:s,", new short[0]}, + {"xa:B:S,", new TagValueAndUnsignedArrayFlag(new short[0], true)}, + + {"xa:B:i", new int[0]}, + {"xa:B:I", new TagValueAndUnsignedArrayFlag(new int[0], true)}, + {"xa:B:i,1,2,3", new int[]{1, 2, 3}}, + {"xa:B:I,1,2,3", new TagValueAndUnsignedArrayFlag(new int[]{1, 2, 3}, true)}, + {"xa:B:i,", new int[0]}, + {"xa:B:I,", new TagValueAndUnsignedArrayFlag(new int[0], true)}, + + {"xa:B:f", new float[0]}, + {"xa:B:f,", new float[0]}, + {"xa:B:f,1.0,2.0,3.0", new float[]{1.0f, 2.0f, 3.0f}}, + }; + } + + @Test(dataProvider = "getArraysToDecode") + public void testEmptyAndNonEmptyArrayDecoding(String tag, Object expectedValue) { + final TextTagCodec textTagCodec = new TextTagCodec(); + final Map.Entry decoded = textTagCodec.decode(tag); + + Assert.assertEquals(decoded.getKey(), "xa"); + + final Object value = decoded.getValue(); + if( value instanceof TagValueAndUnsignedArrayFlag){ + Assert.assertTrue(expectedValue instanceof TagValueAndUnsignedArrayFlag); + final TagValueAndUnsignedArrayFlag typedValue = (TagValueAndUnsignedArrayFlag) value; + final TagValueAndUnsignedArrayFlag typedExpected = (TagValueAndUnsignedArrayFlag) expectedValue; + Assert.assertEquals(typedValue.value, typedExpected.value); + Assert.assertEquals(typedValue.isUnsignedArray, typedExpected.isUnsignedArray); + } else { + Assert.assertEquals(value, expectedValue); + } + } + + @DataProvider + public Object[][] getBadArrayTags(){ + return new Object[][]{ + {"xa:B"}, // no colon + {"xa:B:F"}, // there is no such thing as unsigned floating point + {"xa:B:F,1.0,2.0"}, // same as above but empty arrays have a special path + {"xa:B:,1,2,3"}, // missing type + {"xa:B:c,700"}, //out of bounds + {"xa:B:C,-10"}, // negative in unsigned array + }; + } + + @Test(dataProvider = "getBadArrayTags", expectedExceptions = SAMFormatException.class) + public void testBadArrayTags(String badTag){ + final TextTagCodec textTagCodec = new TextTagCodec(); + textTagCodec.decode(badTag); + } +} \ No newline at end of file diff --git a/src/test/java/htsjdk/tribble/TestUtils.java b/src/test/java/htsjdk/tribble/TestUtils.java index b2ca9e7a50..c77f58a68e 100644 --- a/src/test/java/htsjdk/tribble/TestUtils.java +++ b/src/test/java/htsjdk/tribble/TestUtils.java @@ -18,12 +18,19 @@ package htsjdk.tribble; +import htsjdk.utils.TestNGUtils; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.FileSystem; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; /** * User: jacob diff --git a/src/test/java/htsjdk/utils/TestNGUtils.java b/src/test/java/htsjdk/utils/TestNGUtils.java index cc7dd6c558..3eed34a788 100644 --- a/src/test/java/htsjdk/utils/TestNGUtils.java +++ b/src/test/java/htsjdk/utils/TestNGUtils.java @@ -1,11 +1,13 @@ package htsjdk.utils; +import com.google.common.collect.Lists; import org.testng.annotations.DataProvider; import org.testng.collections.Sets; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.*; +import java.util.stream.Collectors; /** * Small class implementing some utility functions that are useful for test and interfacing with the TestNG framework. @@ -40,4 +42,42 @@ public static Iterator getDataProviders(final String packageName) { return data.iterator(); } + + /** + * Combine two or more Dataproviders by taking the cartesian product of the their test cases. + * + * Note: In the case of a an empty provider, the result will be the product of the non-empty providers. + * This is different from the traditional definition of the cartesian product. + * @return the cartesian product of two or more DataProviders than can be used as a new dataprovider + */ + public static Object[][] cartesianProduct(Object[][]... dataProviders) { + List>> lists = Arrays.stream(dataProviders) + .map(TestNGUtils::nestedArraysToNestedLists) + .collect(Collectors.toList()); + final List>> product = Lists.cartesianProduct(lists); + final List> mergeProduct = product.stream() + .map( l -> l.stream() + .flatMap(Collection::stream) + .collect(Collectors.toList())) + .collect(Collectors.toList()); + return nestedListsToNestedArrays(mergeProduct); + } + + /** + * @param dataProvider a nested Object array + * @return an equivalent nested List + */ + public static List> nestedArraysToNestedLists(Object[][] dataProvider){ + return Arrays.stream(dataProvider) + .map(Arrays::asList) + .collect(Collectors.toList()); + } + + /** + * @param lists a nested List + * @return an equivalent nested array + */ + public static Object[][] nestedListsToNestedArrays(List> lists){ + return lists.stream().map(List::toArray).toArray(Object[][]::new); + } } diff --git a/src/test/java/htsjdk/utils/TestNGUtilsTest.java b/src/test/java/htsjdk/utils/TestNGUtilsTest.java new file mode 100644 index 0000000000..9fb811a7db --- /dev/null +++ b/src/test/java/htsjdk/utils/TestNGUtilsTest.java @@ -0,0 +1,150 @@ +package htsjdk.utils; + +import htsjdk.HtsjdkTest; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class TestNGUtilsTest extends HtsjdkTest { + + public static final Object[] EMPTY_ARRAY = new Object[0]; + + @DataProvider + public Object[][] getArraysAndLists() { + return new Object[][]{ + { + new Object[][]{ + {1, 2}, + {3, 4} + }, + Arrays.asList( + Arrays.asList(1, 2), + Arrays.asList(3, 4) + ) + }, + { + new Object[][]{ + {1} + }, + Arrays.asList( + Arrays.asList(1) + ) + }, + { + new Object[][]{ + {1, 2, 3}, + {4, 5, 6} + }, + Arrays.asList( + Arrays.asList(1, 2, 3), + Arrays.asList(4, 5, 6) + ) + }, + { + new Object[][]{ + {1}, + {2}, + {3}, + {4} + }, + Arrays.asList( + Arrays.asList(1), + Arrays.asList(2), + Arrays.asList(3), + Arrays.asList(4) + ) + }, + }; + } + + @Test(dataProvider = "getArraysAndLists") + public void testObjectsToLists(Object[][] objects, List> lists) { + Assert.assertEquals(TestNGUtils.nestedArraysToNestedLists(objects), lists); + } + + @Test(dataProvider = "getArraysAndLists") + public void testListsToArrays(Object[][] objects, List> lists) { + final Object[][] convertedObjects = TestNGUtils.nestedListsToNestedArrays(lists); + assertNestedArraysEqual(objects, convertedObjects); + } + + private static void assertNestedArraysEqual(Object[][] objects, Object[][] convertedObjects) { + for (int i = 0; i < objects.length; i++) { + Assert.assertEquals(convertedObjects[i], objects[i]); + } + } + + @DataProvider + public Object[][] getDataProviders() { + return new Object[][]{ + {new Object[][]{{1, 2}}, new Object[][]{{3}, {4}}, new Object[][]{{1, 2, 3}, {1, 2, 4}}}, + {new Object[][]{{1}}, new Object[][]{{2}}, new Object[][]{{1, 2}}}, + {new Object[][]{{1}}, new Object[][]{{2, 3}}, new Object[][]{{1, 2, 3}}}, + {new Object[][]{{1}, {2}, {3}}, new Object[][]{{'a', 'b'}, {'c', 'd'}}, + new Object[][]{{1, 'a', 'b'}, {1, 'c', 'd'}, + {2, 'a', 'b'}, {2, 'c', 'd'}, + {3, 'a', 'b'}, {3, 'c', 'd'}}}, + {new Object[][]{{}}, new Object[][]{{}}, new Object[][]{{}}}, + {new Object[][]{{}}, new Object[][]{{1}}, new Object[][]{{1}}}, + {new Object[][]{{}}, new Object[][]{{1, 2}}, new Object[][]{{1, 2}}}, + {new Object[][]{{1}}, new Object[][]{{}}, new Object[][]{{1}}}, + {new Object[][]{{}}, new Object[][]{{1}}, new Object[][]{{1}}}, + {new Object[][]{{EMPTY_ARRAY}}, new Object[][]{{1}}, new Object[][]{{EMPTY_ARRAY, 1}}}, + {new Object[][]{{1}, {2}, {3}}, new Object[][]{{4}, {5}, {6}}, + new Object[][]{{1,4}, {1,5}, {1,6}, {2, 4}, {2, 5}, {2, 6}, {3, 4}, {3, 5}, {3, 6}}} + }; + } + + @Test(dataProvider = "getDataProviders") + public void testProduct(Object[][] dataProvider1, Object[][] dataProvider2, Object[][] expectedResult) { + final Object[][] actual = TestNGUtils.cartesianProduct(dataProvider1, dataProvider2); + assertNestedArraysEqual(actual, expectedResult); + } + + + @DataProvider + public Object[][] getDifferingNumbersOfProviders() { + final Object[][] p1 = new Object[][]{{1}, {2}}; + final Object[][] p2 = new Object[][]{{"a", "b"}}; + final Object[][] p3 = new Object[][]{{}}; + final Object[][] p4 = new Object[][]{{3}, {4}, {5}}; + + final Object[][] expected0 = new Object[][]{{}}; + final Object[][] expected1 = new Object[][]{{1}, {2}}; + final Object[][] expected2 = new Object[][]{{1, "a", "b"}, {2, "a", "b"}}; + final Object[][] expected3 = expected2; + final Object[][] expected4 = new Object[][]{ + {1, "a", "b", 3}, + {1, "a", "b", 4}, + {1, "a", "b", 5}, + {2, "a", "b", 3}, + {2, "a", "b", 4}, + {2, "a", "b", 5} + }; + + return new Object[][]{ + {Arrays.asList(), expected0}, + {Collections.singletonList(p1), expected1}, + {Arrays.asList(p1, p2), expected2}, + {Arrays.asList(p1, p2, p3), expected3}, + {Arrays.asList(p1, p2, p3, p4), expected4} + }; + } + + @Test(dataProvider = "getDifferingNumbersOfProviders") + public void testCartesianProductOfManyProviders(List providers, Object[][] expected){ + final Object[][] product = TestNGUtils.cartesianProduct(providers.toArray(new Object[][][]{})); + assertNestedArraysEqual(product, expected); + } + + @Test + public void testSingleProvider() { + final Object[][] expected = {{1, 2}}; + final Object[][] product = TestNGUtils.cartesianProduct(expected); + assertNestedArraysEqual(product, expected); + } +} diff --git a/src/test/resources/htsjdk/samtools/one-contig.fasta b/src/test/resources/htsjdk/samtools/one-contig.fasta new file mode 100644 index 0000000000..8af5b5bf26 --- /dev/null +++ b/src/test/resources/htsjdk/samtools/one-contig.fasta @@ -0,0 +1,278 @@ +>chr1 +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 \ No newline at end of file diff --git a/src/test/resources/htsjdk/samtools/one-contig.fasta.fai b/src/test/resources/htsjdk/samtools/one-contig.fasta.fai new file mode 100644 index 0000000000..d626db67d6 --- /dev/null +++ b/src/test/resources/htsjdk/samtools/one-contig.fasta.fai @@ -0,0 +1 @@ +chr1 16571 6 60 61 From f00a75437bce14d094cdceb373fa380195cf7a89 Mon Sep 17 00:00:00 2001 From: Jim Robinson Date: Fri, 26 Oct 2018 07:11:18 -0700 Subject: [PATCH 82/83] Remove JAXB (#1206) * Removed all uses of the javax.xml.bind package. The package is removed java 9+. * This breaks the ability to marshal SamHeaders into XML, we believe that there are no users of that functionality and will not consider this a breaking change. * closes #1204 --- .../samtools/AbstractSAMHeaderRecord.java | 4 +- .../samtools/SAMSequenceDictionary.java | 8 +--- .../htsjdk/samtools/SAMSequenceRecord.java | 16 ++------ .../cram/structure/EncodingParams.java | 4 +- .../samtools/SAMSequenceDictionaryTest.java | 37 +------------------ 5 files changed, 12 insertions(+), 57 deletions(-) diff --git a/src/main/java/htsjdk/samtools/AbstractSAMHeaderRecord.java b/src/main/java/htsjdk/samtools/AbstractSAMHeaderRecord.java index 0c3d484203..d62bf5c62d 100644 --- a/src/main/java/htsjdk/samtools/AbstractSAMHeaderRecord.java +++ b/src/main/java/htsjdk/samtools/AbstractSAMHeaderRecord.java @@ -23,7 +23,7 @@ */ package htsjdk.samtools; -import javax.xml.bind.annotation.XmlTransient; + import java.io.Serializable; import java.util.LinkedHashMap; import java.util.Map; @@ -33,7 +33,7 @@ * Base class for the various concrete records in a SAM header, providing uniform * access to the attributes. */ -@XmlTransient /* don't consider this class for XML-serialization */ + public abstract class AbstractSAMHeaderRecord implements Serializable { public static final long serialVersionUID = 1L; diff --git a/src/main/java/htsjdk/samtools/SAMSequenceDictionary.java b/src/main/java/htsjdk/samtools/SAMSequenceDictionary.java index 86ffa6c9f7..be825ef396 100644 --- a/src/main/java/htsjdk/samtools/SAMSequenceDictionary.java +++ b/src/main/java/htsjdk/samtools/SAMSequenceDictionary.java @@ -31,9 +31,6 @@ import java.util.*; 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; @@ -41,14 +38,14 @@ /** * Collection of SAMSequenceRecords. */ -@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 mSequences = new ArrayList<>(); private final Map mSequenceMap = new HashMap<>(); @@ -60,7 +57,6 @@ public SAMSequenceDictionary(final List list) { setSequences(list); } - @XmlTransient //we use the field instead of getter/setter public List getSequences() { return Collections.unmodifiableList(mSequences); } diff --git a/src/main/java/htsjdk/samtools/SAMSequenceRecord.java b/src/main/java/htsjdk/samtools/SAMSequenceRecord.java index a4b4df2369..4927a6c568 100644 --- a/src/main/java/htsjdk/samtools/SAMSequenceRecord.java +++ b/src/main/java/htsjdk/samtools/SAMSequenceRecord.java @@ -23,9 +23,7 @@ */ package htsjdk.samtools; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlValue; + import java.math.BigInteger; import java.net.URI; import java.net.URISyntaxException; @@ -38,7 +36,7 @@ /** * Header information about a reference sequence. Corresponds to @SQ header record in SAM text header. */ -@XmlRootElement(name="Reference") + public class SAMSequenceRecord extends AbstractSAMHeaderRecord implements Cloneable { public static final long serialVersionUID = 1L; // AbstractSAMHeaderRecord implements Serializable @@ -99,8 +97,7 @@ public SAMSequenceRecord(final String name, final int sequenceLength) { } mSequenceLength = sequenceLength; } - - @XmlValue + public String getSequenceName() { return mSequenceName; } /* this private method is used by XML serialization */ @@ -113,27 +110,22 @@ private void setSequenceName(final String name) { 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. diff --git a/src/main/java/htsjdk/samtools/cram/structure/EncodingParams.java b/src/main/java/htsjdk/samtools/cram/structure/EncodingParams.java index 586fa90fdd..ab568af86e 100644 --- a/src/main/java/htsjdk/samtools/cram/structure/EncodingParams.java +++ b/src/main/java/htsjdk/samtools/cram/structure/EncodingParams.java @@ -18,6 +18,8 @@ package htsjdk.samtools.cram.structure; +import htsjdk.samtools.util.StringUtil; + import java.util.Arrays; public class EncodingParams { @@ -33,7 +35,7 @@ public EncodingParams(final EncodingID id, final byte[] params) { @Override public String toString() { - return id.name() + ":" + javax.xml.bind.DatatypeConverter.printHexBinary(Arrays.copyOfRange(params, 0, Math.max(20, params.length))); + return id.name() + ":" + StringUtil.bytesToHexString(Arrays.copyOfRange(params, 0, Math.max(20, params.length))); } } diff --git a/src/test/java/htsjdk/samtools/SAMSequenceDictionaryTest.java b/src/test/java/htsjdk/samtools/SAMSequenceDictionaryTest.java index a8e60ed501..a0063cc938 100644 --- a/src/test/java/htsjdk/samtools/SAMSequenceDictionaryTest.java +++ b/src/test/java/htsjdk/samtools/SAMSequenceDictionaryTest.java @@ -31,10 +31,6 @@ import org.testng.annotations.DataProvider; import org.testng.annotations.Test; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.Unmarshaller; import java.io.StringReader; import java.io.StringWriter; import java.util.Arrays; @@ -59,38 +55,7 @@ public void testAliases() { Assert.assertNull(dict.getSequence("chr2")); } - /** - * should be saved as XML - * - *

-     * 12
-     * 
- * - * @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(){ From c48424196483ae4f0251e8dc0cc2735611c9abf9 Mon Sep 17 00:00:00 2001 From: Alexey Philippov Date: Mon, 29 Oct 2018 21:22:10 +0300 Subject: [PATCH 83/83] MergeSamFiles accept SO:UNKNOWN (#1069) - case checks for header's tags/values; - added implementation that treating non-conforming SO tag values as "unknown"; - corresponding tests reworked, few more tests added. --- .../java/htsjdk/samtools/SAMFileHeader.java | 10 +- .../htsjdk/samtools/SAMTextHeaderCodec.java | 30 +++++- .../htsjdk/samtools/SAMFileHeaderTest.java | 91 ++++++++++++++++++- .../htsjdk/samtools/ValidateSamFileTest.java | 7 -- 4 files changed, 124 insertions(+), 14 deletions(-) diff --git a/src/main/java/htsjdk/samtools/SAMFileHeader.java b/src/main/java/htsjdk/samtools/SAMFileHeader.java index 1d123684f1..935746043d 100644 --- a/src/main/java/htsjdk/samtools/SAMFileHeader.java +++ b/src/main/java/htsjdk/samtools/SAMFileHeader.java @@ -246,7 +246,7 @@ public SortOrder getSortOrder() { try { return SortOrder.valueOf(so); } catch (IllegalArgumentException e) { - log.warn("Found non conforming header SO tag: " + so + ". Treating as 'unknown'."); + log.warn("Found non-conforming header SO tag: " + so + ". Treating as 'unknown'."); sortOrder = SortOrder.unknown; } } @@ -308,12 +308,18 @@ public void setAttribute(final String key, final Object value) { */ @Override public void setAttribute(final String key, final String value) { + String tempVal = value; if (key.equals(SORT_ORDER_TAG)) { this.sortOrder = null; + try { + tempVal = SortOrder.valueOf(value).toString(); + } catch (IllegalArgumentException e) { + tempVal = SortOrder.unknown.toString(); + } } else if (key.equals(GROUP_ORDER_TAG)) { this.groupOrder = null; } - super.setAttribute(key, value); + super.setAttribute(key, tempVal); } /** diff --git a/src/main/java/htsjdk/samtools/SAMTextHeaderCodec.java b/src/main/java/htsjdk/samtools/SAMTextHeaderCodec.java index 908e8360b8..5e4f64cd34 100644 --- a/src/main/java/htsjdk/samtools/SAMTextHeaderCodec.java +++ b/src/main/java/htsjdk/samtools/SAMTextHeaderCodec.java @@ -23,10 +23,12 @@ */ package htsjdk.samtools; +import htsjdk.samtools.SAMFileHeader.SortOrder; import htsjdk.samtools.util.DateParser; import htsjdk.samtools.util.LineReader; import htsjdk.samtools.util.RuntimeIOException; import htsjdk.samtools.util.StringUtil; +import htsjdk.samtools.util.Log; import java.io.BufferedWriter; import java.io.IOException; @@ -69,6 +71,7 @@ public class SAMTextHeaderCodec { 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; + private static final Log log = Log.getInstance(SAMTextHeaderCodec.class); void setWriter(final BufferedWriter writer) { this.writer = writer; @@ -231,10 +234,10 @@ private void parseHDLine(final ParsedHeaderLine parsedHeaderLine) { final String soString = parsedHeaderLine.getValue(SAMFileHeader.SORT_ORDER_TAG); try { - if (soString != null) SAMFileHeader.SortOrder.valueOf(soString); + if (soString != null) SortOrder.valueOf(soString); } catch (IllegalArgumentException e) { reportErrorParsingLine(HEADER_LINE_START + parsedHeaderLine.getHeaderRecordType() + - " line has non-conforming SO tag value: "+ soString + ".", + " line has non-conforming SO tag value: " + soString + ".", SAMValidationError.Type.HEADER_TAG_NON_CONFORMING_VALUE, null); } @@ -323,11 +326,30 @@ private class ParsedHeaderLine { SAMValidationError.Type.HEADER_TAG_MULTIPLY_DEFINED, null); continue; } + validateSortOrderValue(keyAndValue); mKeyValuePairs.put(keyAndValue[0], keyAndValue[1]); } lineValid = true; } + private void validateSortOrderValue(String[] value) { + if (SAMFileHeader.SORT_ORDER_TAG.equals(value[0])) { + try { + SortOrder.valueOf(value[1]); + } catch (IllegalArgumentException e) { + if (validationStringency == ValidationStringency.STRICT) { + throw new SAMFormatException("Found non-conforming header SO tag: " + + value[1] + + ", exiting because VALIDATION_STRINGENCY=STRICT"); + } else if (validationStringency == ValidationStringency.LENIENT) { + log.warn("Found non-conforming header SO tag: " + + value[1] + ". Treating as 'unknown'."); + } + value[1] = SortOrder.unknown.toString(); + } + } + } + /** * True if the line is recognized as one of the valid HeaderRecordTypes. */ @@ -462,7 +484,7 @@ protected String getPGLine(final SAMProgramRecord programRecord) { private void writeRGLine(final SAMReadGroupRecord readGroup) { println(getRGLine(readGroup)); } - + protected String getRGLine(final SAMReadGroupRecord readGroup) { final String[] fields = new String[2 + readGroup.getAttributes().size()]; fields[0] = HEADER_LINE_START + HeaderRecordType.RG; @@ -525,4 +547,4 @@ public void setValidationStringency(final ValidationStringency validationStringe } this.validationStringency = validationStringency; } -} +} \ No newline at end of file diff --git a/src/test/java/htsjdk/samtools/SAMFileHeaderTest.java b/src/test/java/htsjdk/samtools/SAMFileHeaderTest.java index 86946d0f5d..911a7bd24c 100644 --- a/src/test/java/htsjdk/samtools/SAMFileHeaderTest.java +++ b/src/test/java/htsjdk/samtools/SAMFileHeaderTest.java @@ -23,7 +23,9 @@ package htsjdk.samtools; import htsjdk.HtsjdkTest; +import htsjdk.samtools.util.BufferedLineReader; import org.testng.Assert; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.util.Arrays; @@ -31,7 +33,7 @@ public class SAMFileHeaderTest extends HtsjdkTest { @Test - public void testSortOrder() { + public void testSortOrderManualSetting() { final SAMFileHeader header = new SAMFileHeader(); header.setSortOrder(SAMFileHeader.SortOrder.coordinate); @@ -45,6 +47,21 @@ public void testSortOrder() { header.setAttribute(SAMFileHeader.SORT_ORDER_TAG, SAMFileHeader.SortOrder.coordinate); Assert.assertEquals(header.getSortOrder(), SAMFileHeader.SortOrder.coordinate); Assert.assertEquals(header.getAttribute(SAMFileHeader.SORT_ORDER_TAG), SAMFileHeader.SortOrder.coordinate.name()); + + header.setAttribute(SAMFileHeader.SORT_ORDER_TAG, "UNKNOWN"); + Assert.assertEquals(header.getSortOrder(), SAMFileHeader.SortOrder.unknown); + Assert.assertEquals(header.getAttribute(SAMFileHeader.SORT_ORDER_TAG), + SAMFileHeader.SortOrder.unknown.name()); + + header.setAttribute(SAMFileHeader.SORT_ORDER_TAG, "uNknOWn"); + Assert.assertEquals(header.getSortOrder(), SAMFileHeader.SortOrder.unknown); + Assert.assertEquals(header.getAttribute(SAMFileHeader.SORT_ORDER_TAG), + SAMFileHeader.SortOrder.unknown.name()); + + header.setAttribute(SAMFileHeader.SORT_ORDER_TAG, "cOoRdinate"); + Assert.assertEquals(header.getSortOrder(), SAMFileHeader.SortOrder.unknown); + Assert.assertEquals(header.getAttribute(SAMFileHeader.SORT_ORDER_TAG), + SAMFileHeader.SortOrder.unknown.name()); } @Test @@ -81,4 +98,76 @@ public void testGetSequenceIfNameIsNotFound() { Assert.assertNull(header.getSequence("chr2")); } + + @Test + public void testWrongTag() { + String[] testData = new String[]{ + "@hd\tVN:1.0\tSO:unsorted\n", + "@sq\tSN:chrM\tLN:16571\n", + "@rg\tID:1\tSM:sample1\n", + "@pg\tID:1\tPN:A\n", + "@co\tVN:1.0\tSO:unsorted\n" + }; + for (String stringHeader : testData) { + SAMTextHeaderCodec codec = new SAMTextHeaderCodec(); + SAMFileHeader header = codec.decode(BufferedLineReader.fromString(stringHeader), null); + String validationErrors = header.getValidationErrors().toString(); + Assert.assertTrue(validationErrors.contains("Unrecognized header record type")); + } + + } + + @DataProvider(name = "DataForWrongTagTests") + public Object[][] dataForWrongTagTests() { + return new Object[][] { + {"@HD\tVN:1.0\tSO:UNSORTED\n"}, + {"@HD\tVN:1.0\tSO:FALSE\n"}, + {"@HD\tVN:1.0\tSO:COORDINATE\n"}, + {"@HD\tVN:1.0\tSO:uNknOWn\n"}, + {"@HD\tVN:1.0\tSO:cOoRdinate\n"}, + }; + } + + @Test(dataProvider = "DataForWrongTagTests") + public void testSortOrderCodecSetting(String hdr) { + String validString = "@HD\tVN:1.0\tSO:unknown\n"; + + SAMTextHeaderCodec codec = new SAMTextHeaderCodec(); + SAMFileHeader header = codec.decode(BufferedLineReader.fromString(validString), null); + + header.setSortOrder(SAMFileHeader.SortOrder.coordinate); + Assert.assertEquals(header.getSortOrder(), SAMFileHeader.SortOrder.coordinate); + Assert.assertEquals(header.getAttribute(SAMFileHeader.SORT_ORDER_TAG), SAMFileHeader.SortOrder.coordinate.name()); + + header.setSortOrder(SAMFileHeader.SortOrder.unsorted); + Assert.assertEquals(header.getSortOrder(), SAMFileHeader.SortOrder.unsorted); + Assert.assertEquals(header.getAttribute(SAMFileHeader.SORT_ORDER_TAG), SAMFileHeader.SortOrder.unsorted.name()); + + header.setAttribute(SAMFileHeader.SORT_ORDER_TAG, "badname"); + Assert.assertEquals(header.getSortOrder(), SAMFileHeader.SortOrder.unknown); + Assert.assertEquals(header.getAttribute(SAMFileHeader.SORT_ORDER_TAG), SAMFileHeader.SortOrder.unknown.name()); + + header = codec.decode(BufferedLineReader.fromString(hdr), null); + Assert.assertTrue(header.getSortOrder().toString().equals("unknown")); + } + + @Test(dataProvider = "DataForWrongTagTests", expectedExceptions = SAMFormatException.class) + public void testValidationStringencyStrict(String stringHeader) { + SAMTextHeaderCodec codec = new SAMTextHeaderCodec(); + codec.setValidationStringency(ValidationStringency.STRICT); + codec.decode(BufferedLineReader.fromString(stringHeader), null); + } + + @Test(dataProvider = "DataForWrongTagTests") + public void testValidationStringencyLenientAndSilent(String stringHeader) { + SAMTextHeaderCodec codec = new SAMTextHeaderCodec(); + + codec.setValidationStringency(ValidationStringency.LENIENT); + SAMFileHeader headerLenient = codec.decode(BufferedLineReader.fromString(stringHeader), null); + Assert.assertTrue(headerLenient.getSortOrder().equals(SAMFileHeader.SortOrder.unknown)); + + codec.setValidationStringency(ValidationStringency.SILENT); + SAMFileHeader headerSilent = codec.decode(BufferedLineReader.fromString(stringHeader), null); + Assert.assertTrue(headerSilent.getSortOrder().equals(SAMFileHeader.SortOrder.unknown)); + } } diff --git a/src/test/java/htsjdk/samtools/ValidateSamFileTest.java b/src/test/java/htsjdk/samtools/ValidateSamFileTest.java index a7a218c802..190a6d5073 100644 --- a/src/test/java/htsjdk/samtools/ValidateSamFileTest.java +++ b/src/test/java/htsjdk/samtools/ValidateSamFileTest.java @@ -562,12 +562,6 @@ public Object[][] tagCorrectlyProcessData() throws IOException { "@RG\tID:0\tSM:Hi,Mom!\n" + "E\t147\tchr1\t15\t255\t10M\t=\t2\t-30\tCAACAGAAGC\t)'.*.+2,))\tU2:Z:CAA"; - final String SOTagCorrectlyProcessTestData = - "@HD\tVN:1.0\tSO:NOTKNOWN\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"; - final String GOTagCorrectlyProcessTestData = "@HD\tVN:1.0\tGO:NOTKNOWN\n" + "@SQ\tSN:chr1\tLN:101\n" + @@ -578,7 +572,6 @@ public Object[][] tagCorrectlyProcessData() throws IOException { {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}, - {SOTagCorrectlyProcessTestData.getBytes(), SAMValidationError.Type.HEADER_TAG_NON_CONFORMING_VALUE}, {GOTagCorrectlyProcessTestData.getBytes(), SAMValidationError.Type.HEADER_TAG_NON_CONFORMING_VALUE} }; }