From e923a2e51268c49c7697a40855af8bce001e0fec Mon Sep 17 00:00:00 2001 From: Matt Hanna Date: Tue, 10 Jan 2012 12:12:33 -0500 Subject: [PATCH] Revving Picard to incorporate final version of ReadWalker performance improvements. --- .../picard/sam/MergingSamRecordIterator.java | 247 ------ .../sf/picard/sam/SamFileHeaderMerger.java | 744 ------------------ .../gatk/datasources/reads/SAMDataSource.java | 17 +- ...2164.jar => picard-private-parts-2181.jar} | Bin 40954 -> 40954 bytes ...2164.xml => picard-private-parts-2181.xml} | 2 +- .../repository/net.sf/picard-1.58.1057.xml | 3 - ...ard-1.58.1057.jar => picard-1.59.1066.jar} | Bin 1201269 -> 1206214 bytes .../repository/net.sf/picard-1.59.1066.xml | 3 + settings/repository/net.sf/sam-1.58.1057.xml | 3 - .../{sam-1.58.1057.jar => sam-1.59.1066.jar} | Bin 569648 -> 569649 bytes settings/repository/net.sf/sam-1.59.1066.xml | 3 + 11 files changed, 20 insertions(+), 1002 deletions(-) delete mode 100644 public/java/src/net/sf/picard/sam/MergingSamRecordIterator.java delete mode 100644 public/java/src/net/sf/picard/sam/SamFileHeaderMerger.java rename settings/repository/edu.mit.broad/{picard-private-parts-2164.jar => picard-private-parts-2181.jar} (88%) rename settings/repository/edu.mit.broad/{picard-private-parts-2164.xml => picard-private-parts-2181.xml} (58%) delete mode 100644 settings/repository/net.sf/picard-1.58.1057.xml rename settings/repository/net.sf/{picard-1.58.1057.jar => picard-1.59.1066.jar} (91%) create mode 100644 settings/repository/net.sf/picard-1.59.1066.xml delete mode 100644 settings/repository/net.sf/sam-1.58.1057.xml rename settings/repository/net.sf/{sam-1.58.1057.jar => sam-1.59.1066.jar} (96%) create mode 100644 settings/repository/net.sf/sam-1.59.1066.xml diff --git a/public/java/src/net/sf/picard/sam/MergingSamRecordIterator.java b/public/java/src/net/sf/picard/sam/MergingSamRecordIterator.java deleted file mode 100644 index 4b1c7a999..000000000 --- a/public/java/src/net/sf/picard/sam/MergingSamRecordIterator.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) 2011, The Broad Institute - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ -package net.sf.picard.sam; - -import net.sf.picard.PicardException; - -import java.util.*; -import java.lang.reflect.Constructor; - -import net.sf.samtools.*; -import net.sf.samtools.util.CloseableIterator; - -/** - * Provides an iterator interface for merging multiple underlying iterators into a single - * iterable stream. The underlying iterators/files must all have the same sort order unless - * the requested output format is unsorted, in which case any combination is valid. - */ -public class MergingSamRecordIterator implements CloseableIterator { - private final PriorityQueue pq; - private final SamFileHeaderMerger samHeaderMerger; - private final Collection readers; - private final SAMFileHeader.SortOrder sortOrder; - private final SAMRecordComparator comparator; - - private boolean initialized = false; - private boolean iterationStarted = false; - - /** - * Constructs a new merging iterator with the same set of readers and sort order as - * provided by the header merger parameter. - * @param headerMerger The merged header and contents of readers. - * @param forcePresorted True to ensure that the iterator checks the headers of the readers for appropriate sort order. - * @deprecated replaced by (SamFileHeaderMerger, Collection, boolean) - */ - public MergingSamRecordIterator(final SamFileHeaderMerger headerMerger, final boolean forcePresorted) { - this(headerMerger, headerMerger.getReaders(), forcePresorted); - } - - /** - * Constructs a new merging iterator with the same set of readers and sort order as - * provided by the header merger parameter. - * @param headerMerger The merged header and contents of readers. - * @param assumeSorted false ensures that the iterator checks the headers of the readers for appropriate sort order. - */ - public MergingSamRecordIterator(final SamFileHeaderMerger headerMerger, Collection readers, final boolean assumeSorted) { - this.samHeaderMerger = headerMerger; - this.sortOrder = headerMerger.getMergedHeader().getSortOrder(); - this.comparator = getComparator(); - this.readers = readers; - - this.pq = new PriorityQueue(readers.size()); - - for (final SAMFileReader reader : readers) { - if (!assumeSorted && this.sortOrder != SAMFileHeader.SortOrder.unsorted && - reader.getFileHeader().getSortOrder() != this.sortOrder){ - throw new PicardException("Files are not compatible with sort order"); - } - } - } - - /** - * Add a given SAM file iterator to the merging iterator. Use this to restrict the merged iteration to a given genomic interval, - * rather than iterating over every read in the backing file or stream. - * @param reader Reader to add to the merging iterator. - * @param iterator Iterator traversing over reader contents. - */ - public void addIterator(final SAMFileReader reader, final CloseableIterator iterator) { - if(iterationStarted) - throw new PicardException("Cannot add another iterator; iteration has already begun"); - if(!samHeaderMerger.containsHeader(reader.getFileHeader())) - throw new PicardException("All iterators to be merged must be accounted for in the SAM header merger"); - final ComparableSamRecordIterator comparableIterator = new ComparableSamRecordIterator(reader,iterator,comparator); - addIfNotEmpty(comparableIterator); - initialized = true; - } - - private void startIterationIfRequired() { - if(initialized) - return; - for(SAMFileReader reader: readers) - addIterator(reader,reader.iterator()); - iterationStarted = true; - } - - /** - * Close down all open iterators. - */ - public void close() { - // Iterators not in the priority queue have already been closed; only close down the iterators that are still in the priority queue. - for(CloseableIterator iterator: pq) - iterator.close(); - } - - /** Returns true if any of the underlying iterators has more records, otherwise false. */ - public boolean hasNext() { - startIterationIfRequired(); - return !this.pq.isEmpty(); - } - - /** Returns the next record from the top most iterator during merging. */ - public SAMRecord next() { - startIterationIfRequired(); - - final ComparableSamRecordIterator iterator = this.pq.poll(); - final SAMRecord record = iterator.next(); - addIfNotEmpty(iterator); - record.setHeader(this.samHeaderMerger.getMergedHeader()); - - // Fix the read group if needs be - if (this.samHeaderMerger.hasReadGroupCollisions()) { - final String oldGroupId = (String) record.getAttribute(ReservedTagConstants.READ_GROUP_ID); - if (oldGroupId != null ) { - final String newGroupId = this.samHeaderMerger.getReadGroupId(iterator.getReader().getFileHeader(),oldGroupId); - record.setAttribute(ReservedTagConstants.READ_GROUP_ID, newGroupId); - } - } - - // Fix the program group if needs be - if (this.samHeaderMerger.hasProgramGroupCollisions()) { - final String oldGroupId = (String) record.getAttribute(ReservedTagConstants.PROGRAM_GROUP_ID); - if (oldGroupId != null ) { - final String newGroupId = this.samHeaderMerger.getProgramGroupId(iterator.getReader().getFileHeader(),oldGroupId); - record.setAttribute(ReservedTagConstants.PROGRAM_GROUP_ID, newGroupId); - } - } - - // Fix up the sequence indexes if needs be - if (this.samHeaderMerger.hasMergedSequenceDictionary()) { - if (record.getReferenceIndex() != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) { - record.setReferenceIndex(this.samHeaderMerger.getMergedSequenceIndex(iterator.getReader().getFileHeader(),record.getReferenceIndex())); - } - - if (record.getReadPairedFlag() && record.getMateReferenceIndex() != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) { - record.setMateReferenceIndex(this.samHeaderMerger.getMergedSequenceIndex(iterator.getReader().getFileHeader(),record.getMateReferenceIndex())); - } - } - - return record; - } - - /** - * Adds iterator to priority queue. If the iterator has more records it is added - * otherwise it is closed and not added. - */ - private void addIfNotEmpty(final ComparableSamRecordIterator iterator) { - if (iterator.hasNext()) { - pq.offer(iterator); - } - else { - iterator.close(); - } - } - - /** Unsupported operation. */ - public void remove() { - throw new UnsupportedOperationException("MergingSAMRecorderIterator.remove()"); - } - - /** - * Get the right comparator for a given sort order (coordinate, alphabetic). In the - * case of "unsorted" it will return a comparator that gives an arbitrary but reflexive - * ordering. - */ - private SAMRecordComparator getComparator() { - // For unsorted build a fake comparator that compares based on object ID - if (this.sortOrder == SAMFileHeader.SortOrder.unsorted) { - return new SAMRecordComparator() { - public int fileOrderCompare(final SAMRecord lhs, final SAMRecord rhs) { - return System.identityHashCode(lhs) - System.identityHashCode(rhs); - } - - public int compare(final SAMRecord lhs, final SAMRecord rhs) { - return fileOrderCompare(lhs, rhs); - } - }; - } - if (samHeaderMerger.hasMergedSequenceDictionary() && sortOrder.equals(SAMFileHeader.SortOrder.coordinate)) { - return new MergedSequenceDictionaryCoordinateOrderComparator(); - } - - // Otherwise try and figure out what kind of comparator to return and build it - return this.sortOrder.getComparatorInstance(); - } - - /** Returns the merged header that the merging iterator is working from. */ - public SAMFileHeader getMergedHeader() { - return this.samHeaderMerger.getMergedHeader(); - } - - /** - * Ugh. Basically does a regular coordinate compare, but looks up the sequence indices in the merged - * sequence dictionary. I hate the fact that this extends SAMRecordCoordinateComparator, but it avoids - * more copy & paste. - */ - private class MergedSequenceDictionaryCoordinateOrderComparator extends SAMRecordCoordinateComparator { - - public int fileOrderCompare(final SAMRecord samRecord1, final SAMRecord samRecord2) { - final int referenceIndex1 = getReferenceIndex(samRecord1); - final int referenceIndex2 = getReferenceIndex(samRecord2); - if (referenceIndex1 != referenceIndex2) { - if (referenceIndex1 == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) { - return 1; - } else if (referenceIndex2 == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) { - return -1; - } else { - return referenceIndex1 - referenceIndex2; - } - } - if (referenceIndex1 == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) { - // Both are unmapped. - return 0; - } - return samRecord1.getAlignmentStart() - samRecord2.getAlignmentStart(); - } - - private int getReferenceIndex(final SAMRecord samRecord) { - if (samRecord.getReferenceIndex() != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) { - return samHeaderMerger.getMergedSequenceIndex(samRecord.getHeader(), samRecord.getReferenceIndex()); - } - if (samRecord.getMateReferenceIndex() != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) { - return samHeaderMerger.getMergedSequenceIndex(samRecord.getHeader(), samRecord.getMateReferenceIndex()); - } - return SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX; - } - } -} diff --git a/public/java/src/net/sf/picard/sam/SamFileHeaderMerger.java b/public/java/src/net/sf/picard/sam/SamFileHeaderMerger.java deleted file mode 100644 index f78cd81da..000000000 --- a/public/java/src/net/sf/picard/sam/SamFileHeaderMerger.java +++ /dev/null @@ -1,744 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2009 The Broad Institute - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package net.sf.picard.sam; - -import java.util.*; - -import net.sf.picard.PicardException; -import net.sf.samtools.AbstractSAMHeaderRecord; -import net.sf.samtools.SAMFileHeader; -import net.sf.samtools.SAMFileReader; -import net.sf.samtools.SAMProgramRecord; -import net.sf.samtools.SAMReadGroupRecord; -import net.sf.samtools.SAMSequenceDictionary; -import net.sf.samtools.SAMSequenceRecord; -import net.sf.samtools.util.SequenceUtil; - -/** - * Merges SAMFileHeaders that have the same sequences into a single merged header - * object while providing read group translation for cases where read groups - * clash across input headers. - */ -public class SamFileHeaderMerger { - //Super Header to construct - private final SAMFileHeader mergedHeader; - private Collection readers; - private final Collection headers; - - //Translation of old group ids to new group ids - private final Map> samReadGroupIdTranslation = - new IdentityHashMap>(); - - //the read groups from different files use the same group ids - private boolean hasReadGroupCollisions = false; - - //the program records from different files use the same program record ids - private boolean hasProgramGroupCollisions = false; - - //Translation of old program group ids to new program group ids - private Map> samProgramGroupIdTranslation = - new IdentityHashMap>(); - - private boolean hasMergedSequenceDictionary = false; - - // Translation of old sequence dictionary ids to new dictionary ids - // This is an IdentityHashMap because it can be quite expensive to compute the hashCode for - // large SAMFileHeaders. It is possible that two input files will have identical headers so that - // the regular HashMap would fold them together, but the value stored in each of the two - // Map entries will be the same, so it should not hurt anything. - private final Map> samSeqDictionaryIdTranslationViaHeader = - new IdentityHashMap>(); - - //HeaderRecordFactory that creates SAMReadGroupRecord instances. - private static final HeaderRecordFactory READ_GROUP_RECORD_FACTORY = new HeaderRecordFactory() { - public SAMReadGroupRecord createRecord(String id, SAMReadGroupRecord srcReadGroupRecord) { - return new SAMReadGroupRecord(id, srcReadGroupRecord); - } - }; - - //HeaderRecordFactory that creates SAMProgramRecord instances. - private static final HeaderRecordFactory PROGRAM_RECORD_FACTORY = new HeaderRecordFactory() { - public SAMProgramRecord createRecord(String id, SAMProgramRecord srcProgramRecord) { - return new SAMProgramRecord(id, srcProgramRecord); - } - }; - - //comparator used to sort lists of program group and read group records - private static final Comparator RECORD_ID_COMPARATOR = new Comparator() { - public int compare(AbstractSAMHeaderRecord o1, AbstractSAMHeaderRecord o2) { - return o1.getId().compareTo(o2.getId()); - } - }; - - /** - * Create SAMFileHeader with additional information. Required that sequence dictionaries agree. - * - * @param readers sam file readers to combine - * @param sortOrder sort order new header should have - * @deprecated replaced by SamFileHeaderMerger(Collection, SAMFileHeader.SortOrder, boolean) - */ - public SamFileHeaderMerger(final Collection readers, final SAMFileHeader.SortOrder sortOrder) { - this(readers, sortOrder, false); - } - - /** - * Create SAMFileHeader with additional information. - * - * @param readers sam file readers to combine - * @param sortOrder sort order new header should have - * @param mergeDictionaries If true, merge sequence dictionaries in new header. If false, require that - * all input sequence dictionaries be identical. - * @deprecated replaced by SamFileHeaderMerger(Collection, SAMFileHeader.SortOrder, boolean) - */ - public SamFileHeaderMerger(final Collection readers, final SAMFileHeader.SortOrder sortOrder, final boolean mergeDictionaries) { - this(sortOrder, getHeadersFromReaders(readers), mergeDictionaries); - this.readers = readers; - } - - /** - * Create SAMFileHeader with additional information.. This is the preferred constructor. - * - * @param sortOrder sort order new header should have - * @param headers sam file headers to combine - * @param mergeDictionaries If true, merge sequence dictionaries in new header. If false, require that - * all input sequence dictionaries be identical. - */ - public SamFileHeaderMerger(final SAMFileHeader.SortOrder sortOrder, final Collection headers, final boolean mergeDictionaries) { - this.headers = headers; - this.mergedHeader = new SAMFileHeader(); - - SAMSequenceDictionary sequenceDictionary; - try { - sequenceDictionary = getSequenceDictionary(headers); - this.hasMergedSequenceDictionary = false; - } - catch (SequenceUtil.SequenceListsDifferException pe) { - if (mergeDictionaries) { - sequenceDictionary = mergeSequenceDictionaries(headers); - this.hasMergedSequenceDictionary = true; - } - else { - throw pe; - } - } - - this.mergedHeader.setSequenceDictionary(sequenceDictionary); - - // Set program that creates input alignments - for (final SAMProgramRecord program : mergeProgramGroups(headers)) { - this.mergedHeader.addProgramRecord(program); - } - - // Set read groups for merged header - final List readGroups = mergeReadGroups(headers); - this.mergedHeader.setReadGroups(readGroups); - this.mergedHeader.setGroupOrder(SAMFileHeader.GroupOrder.none); - - this.mergedHeader.setSortOrder(sortOrder); - - for (final SAMFileHeader header : headers) { - for (final String comment : header.getComments()) { - this.mergedHeader.addComment(comment); - } - } - } - - // Utilility method to make use with old constructor - private static List getHeadersFromReaders(Collection readers) { - List headers = new ArrayList(readers.size()); - for (SAMFileReader reader : readers) { - headers.add(reader.getFileHeader()); - } - return headers; - } - - - /** - * Checks to see if there are clashes where different readers are using the same read - * group IDs. If yes, then those IDs that collided are remapped. - * - * @param headers headers to combine - * @return new list of read groups constructed from all the readers - */ - private List mergeReadGroups(final Collection headers) { - //prepare args for mergeHeaderRecords(..) call - final HashSet idsThatAreAlreadyTaken = new HashSet(); - - final List> readGroupsToProcess = new LinkedList>(); - for (final SAMFileHeader header : headers) { - for (final SAMReadGroupRecord readGroup : header.getReadGroups()) { - //verify that there are no existing id collisions in this input file - if(!idsThatAreAlreadyTaken.add(readGroup.getId())) - throw new PicardException("Input file: " + header + " contains more than one RG with the same id (" + readGroup.getId() + ")"); - - readGroupsToProcess.add(new HeaderRecordAndFileHeader(readGroup, header)); - } - idsThatAreAlreadyTaken.clear(); - } - - final List result = new LinkedList(); - - hasReadGroupCollisions = mergeHeaderRecords(readGroupsToProcess, READ_GROUP_RECORD_FACTORY, idsThatAreAlreadyTaken, samReadGroupIdTranslation, result); - - //sort the result list by record id - Collections.sort(result, RECORD_ID_COMPARATOR); - - return result; - } - - - /** - * Checks to see if there are clashes where different readers are using the same program - * group IDs. If yes, then those IDs that collided are remapped. - * - * @param headers headers to combine - * @return new list of program groups constructed from all the readers - */ - private List mergeProgramGroups(final Collection headers) { - - final List overallResult = new LinkedList(); - - //this Set will accumulate all SAMProgramRecord ids that have been encountered so far. - final HashSet idsThatAreAlreadyTaken = new HashSet(); - - //need to process all program groups - List> programGroupsLeftToProcess = new LinkedList>(); - for (final SAMFileHeader header : headers) { - for (final SAMProgramRecord programGroup : header.getProgramRecords()) { - //verify that there are no existing id collisions in this input file - if(!idsThatAreAlreadyTaken.add(programGroup.getId())) - throw new PicardException("Input file: " + header + " contains more than one PG with the same id (" + programGroup.getId() + ")"); - - programGroupsLeftToProcess.add(new HeaderRecordAndFileHeader(programGroup, header)); - } - idsThatAreAlreadyTaken.clear(); - } - - //A program group header (lets say ID=2 PN=B PP=1) may have a PP (previous program) attribute which chains it to - //another program group header (lets say ID=1 PN=A) to indicate that the given file was - //processed by program A followed by program B. These PP attributes potentially - //connect headers into one or more tree structures. Merging is done by - //first merging all headers that don't have PP attributes (eg. tree roots), - //then updating and merging all headers whose PPs point to the tree-root headers, - //and so on until all program group headers are processed. - - //currentProgramGroups is the list of records to merge next. Start by merging the programGroups that don't have a PP attribute (eg. the tree roots). - List< HeaderRecordAndFileHeader > currentProgramGroups = new LinkedList>(); - for(final Iterator> programGroupsLeftToProcessIterator = programGroupsLeftToProcess.iterator(); programGroupsLeftToProcessIterator.hasNext(); ) { - final HeaderRecordAndFileHeader pair = programGroupsLeftToProcessIterator.next(); - if(pair.getHeaderRecord().getAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG) == null) { - programGroupsLeftToProcessIterator.remove(); - currentProgramGroups.add(pair); - } - } - - //merge currentProgramGroups - while(!currentProgramGroups.isEmpty()) - { - final List currentResult = new LinkedList(); - - hasProgramGroupCollisions |= mergeHeaderRecords(currentProgramGroups, PROGRAM_RECORD_FACTORY, idsThatAreAlreadyTaken, samProgramGroupIdTranslation, currentResult); - - //add currentResults to overallResults - overallResult.addAll(currentResult); - - //apply the newly-computed id translations to currentProgramGroups and programGroupsLeftToProcess - currentProgramGroups = translateIds(currentProgramGroups, samProgramGroupIdTranslation, false); - programGroupsLeftToProcess = translateIds(programGroupsLeftToProcess, samProgramGroupIdTranslation, true); - - //find all records in programGroupsLeftToProcess whose ppId points to a record that was just processed (eg. a record that's in currentProgramGroups), - //and move them to the list of programGroupsToProcessNext. - LinkedList> programGroupsToProcessNext = new LinkedList>(); - for(final Iterator> programGroupsLeftToProcessIterator = programGroupsLeftToProcess.iterator(); programGroupsLeftToProcessIterator.hasNext(); ) { - final HeaderRecordAndFileHeader pairLeftToProcess = programGroupsLeftToProcessIterator.next(); - final Object ppIdOfRecordLeftToProcess = pairLeftToProcess.getHeaderRecord().getAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG); - //find what currentProgramGroups this ppId points to (NOTE: they have to come from the same file) - for(final HeaderRecordAndFileHeader justProcessedPair : currentProgramGroups) { - String idJustProcessed = justProcessedPair.getHeaderRecord().getId(); - if(pairLeftToProcess.getFileHeader() == justProcessedPair.getFileHeader() && ppIdOfRecordLeftToProcess.equals(idJustProcessed)) { - programGroupsLeftToProcessIterator.remove(); - programGroupsToProcessNext.add(pairLeftToProcess); - break; - } - } - } - - currentProgramGroups = programGroupsToProcessNext; - } - - //verify that all records were processed - if(!programGroupsLeftToProcess.isEmpty()) { - StringBuffer errorMsg = new StringBuffer(programGroupsLeftToProcess.size() + " program groups weren't processed. Do their PP ids point to existing PGs? \n"); - for( final HeaderRecordAndFileHeader pair : programGroupsLeftToProcess ) { - SAMProgramRecord record = pair.getHeaderRecord(); - errorMsg.append("@PG ID:"+record.getProgramGroupId()+" PN:"+record.getProgramName()+" PP:"+record.getPreviousProgramGroupId() +"\n"); - } - throw new PicardException(errorMsg.toString()); - } - - //sort the result list by record id - Collections.sort(overallResult, RECORD_ID_COMPARATOR); - - return overallResult; - } - - - /** - * Utility method that takes a list of program groups and remaps all their - * ids (including ppIds if requested) using the given idTranslationTable. - * - * NOTE: when remapping, this method creates new SAMProgramRecords and - * doesn't mutate any records in the programGroups list. - * - * @param programGroups The program groups to translate. - * @param idTranslationTable The translation table. - * @param translatePpIds Whether ppIds should be translated as well. - * - * @return The list of translated records. - */ - private List> translateIds( - List> programGroups, - Map> idTranslationTable, - boolean translatePpIds) { - - //go through programGroups and translate any IDs and PPs based on the idTranslationTable. - List> result = new LinkedList>(); - for(final HeaderRecordAndFileHeader pair : programGroups ) { - final SAMProgramRecord record = pair.getHeaderRecord(); - final String id = record.getProgramGroupId(); - final String ppId = (String) record.getAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG); - - final SAMFileHeader header = pair.getFileHeader(); - final Map translations = idTranslationTable.get(header); - - //see if one or both ids need to be translated - SAMProgramRecord translatedRecord = null; - if(translations != null) - { - String translatedId = translations.get( id ); - String translatedPpId = translatePpIds ? translations.get( ppId ) : null; - - boolean needToTranslateId = translatedId != null && !translatedId.equals(id); - boolean needToTranslatePpId = translatedPpId != null && !translatedPpId.equals(ppId); - - if(needToTranslateId && needToTranslatePpId) { - translatedRecord = new SAMProgramRecord(translatedId, record); - translatedRecord.setAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG, translatedPpId); - } else if(needToTranslateId) { - translatedRecord = new SAMProgramRecord(translatedId, record); - } else if(needToTranslatePpId) { - translatedRecord = new SAMProgramRecord(id, record); - translatedRecord.setAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG, translatedPpId); - } - } - - if(translatedRecord != null) { - result.add(new HeaderRecordAndFileHeader(translatedRecord, header)); - } else { - result.add(pair); //keep the original record - } - } - - return result; - } - - - /** - * Utility method for merging a List of AbstractSAMHeaderRecords. If it finds - * records that have identical ids and attributes, it will collapse them - * into one record. If it finds records that have identical ids but - * non-identical attributes, this is treated as a collision. When collision happens, - * the records' ids are remapped, and an old-id to new-id mapping is added to the idTranslationTable. - * - * NOTE: Non-collided records also get recorded in the idTranslationTable as - * old-id to old-id. This way, an idTranslationTable lookup should never return null. - * - * @param headerRecords The header records to merge. - * @param headerRecordFactory Constructs a specific subclass of AbstractSAMHeaderRecord. - * @param idsThatAreAlreadyTaken If the id of a headerRecord matches an id in this set, it will be treated as a collision, and the headRecord's id will be remapped. - * @param idTranslationTable When records collide, their ids are remapped, and an old-id to new-id - * mapping is added to the idTranslationTable. Non-collided records also get recorded in the idTranslationTable as - * old-id to old-id. This way, an idTranslationTable lookup should never return null. - * - * @param result The list of merged header records. - * - * @return True if there were collisions. - */ - private boolean mergeHeaderRecords(final List> headerRecords, HeaderRecordFactory headerRecordFactory, - final HashSet idsThatAreAlreadyTaken, Map> idTranslationTable, List result) { - - //The outer Map bins the header records by their ids. The nested Map further collapses - //header records which, in addition to having the same id, also have identical attributes. - //In other words, each key in the nested map represents one or more - //header records which have both identical ids and identical attributes. The List of - //SAMFileHeaders keeps track of which readers these header record(s) came from. - final Map>> idToRecord = - new HashMap>>(); - - //Populate the idToRecord and seenIds data structures - for (final HeaderRecordAndFileHeader pair : headerRecords) { - final RecordType record = pair.getHeaderRecord(); - final SAMFileHeader header = pair.getFileHeader(); - final String recordId = record.getId(); - Map> recordsWithSameId = idToRecord.get(recordId); - if(recordsWithSameId == null) { - recordsWithSameId = new LinkedHashMap>(); - idToRecord.put(recordId, recordsWithSameId); - } - - List fileHeaders = recordsWithSameId.get(record); - if(fileHeaders == null) { - fileHeaders = new LinkedList(); - recordsWithSameId.put(record, fileHeaders); - } - - fileHeaders.add(header); - } - - //Resolve any collisions between header records by remapping their ids. - boolean hasCollisions = false; - for (final Map.Entry>> entry : idToRecord.entrySet() ) - { - final String recordId = entry.getKey(); - final Map> recordsWithSameId = entry.getValue(); - - - for( Map.Entry> recordWithUniqueAttr : recordsWithSameId.entrySet()) { - final RecordType record = recordWithUniqueAttr.getKey(); - final List fileHeaders = recordWithUniqueAttr.getValue(); - - String newId; - if(!idsThatAreAlreadyTaken.contains(recordId)) { - //don't remap 1st record. If there are more records - //with this id, they will be remapped in the 'else'. - newId = recordId; - idsThatAreAlreadyTaken.add(recordId); - } else { - //there is more than one record with this id. - hasCollisions = true; - - //find a unique newId for this record - int idx=1; - while(idsThatAreAlreadyTaken.contains(newId = recordId + "." + Integer.toString(idx++))) - ; - - idsThatAreAlreadyTaken.add( newId ); - } - - for(SAMFileHeader fileHeader : fileHeaders) { - Map readerTranslationTable = idTranslationTable.get(fileHeader); - if(readerTranslationTable == null) { - readerTranslationTable = new HashMap(); - idTranslationTable.put(fileHeader, readerTranslationTable); - } - readerTranslationTable.put(recordId, newId); - } - - result.add( headerRecordFactory.createRecord(newId, record) ); - } - } - - return hasCollisions; - } - - - /** - * Get the sequences off the SAMFileHeader. Throws runtime exception if the sequence - * are different from one another. - * - * @param headers headers to pull sequences from - * @return sequences from files. Each file should have the same sequence - */ - private SAMSequenceDictionary getSequenceDictionary(final Collection headers) { - SAMSequenceDictionary sequences = null; - for (final SAMFileHeader header : headers) { - - if (sequences == null) { - sequences = header.getSequenceDictionary(); - } - else { - final SAMSequenceDictionary currentSequences = header.getSequenceDictionary(); - SequenceUtil.assertSequenceDictionariesEqual(sequences, currentSequences); - } - } - - return sequences; - } - - /** - * Get the sequences from the SAMFileHeader, and merge the resulting sequence dictionaries. - * - * @param headers headers to pull sequences from - * @return sequences from files. Each file should have the same sequence - */ - private SAMSequenceDictionary mergeSequenceDictionaries(final Collection headers) { - SAMSequenceDictionary sequences = new SAMSequenceDictionary(); - for (final SAMFileHeader header : headers) { - final SAMSequenceDictionary currentSequences = header.getSequenceDictionary(); - sequences = mergeSequences(sequences, currentSequences); - } - // second pass, make a map of the original seqeunce id -> new sequence id - createSequenceMapping(headers, sequences); - return sequences; - } - - /** - * They've asked to merge the sequence headers. What we support right now is finding the sequence name superset. - * - * @param mergeIntoDict the result of merging so far. All SAMSequenceRecords in here have been cloned from the originals. - * @param mergeFromDict A new sequence dictionary to merge into mergeIntoDict. - * @return A new sequence dictionary that resulting from merging the two inputs. - */ - private SAMSequenceDictionary mergeSequences(SAMSequenceDictionary mergeIntoDict, SAMSequenceDictionary mergeFromDict) { - - // a place to hold the sequences that we haven't found a home for, in the order the appear in mergeFromDict. - LinkedList holder = new LinkedList(); - - // Return value will be created from this. - LinkedList resultingDict = new LinkedList(); - for (final SAMSequenceRecord sequenceRecord : mergeIntoDict.getSequences()) { - resultingDict.add(sequenceRecord); - } - - // Index into resultingDict of previous SAMSequenceRecord from mergeFromDict that already existed in mergeIntoDict. - int prevloc = -1; - // Previous SAMSequenceRecord from mergeFromDict that already existed in mergeIntoDict. - SAMSequenceRecord previouslyMerged = null; - - for (SAMSequenceRecord sequenceRecord : mergeFromDict.getSequences()) { - // Does it already exist in resultingDict? - int loc = getIndexOfSequenceName(resultingDict, sequenceRecord.getSequenceName()); - if (loc == -1) { - // If doesn't already exist in resultingDict, save it an decide where to insert it later. - holder.add(sequenceRecord.clone()); - } else if (prevloc > loc) { - // If sequenceRecord already exists in resultingDict, but prior to the previous one - // from mergeIntoDict that already existed, cannot merge. - throw new PicardException("Cannot merge sequence dictionaries because sequence " + - sequenceRecord.getSequenceName() + " and " + previouslyMerged.getSequenceName() + - " are in different orders in two input sequence dictionaries."); - } else { - // Since sequenceRecord already exists in resultingDict, don't need to add it. - // Add in all the sequences prior to it that have been held in holder. - resultingDict.addAll(loc, holder); - // Remember the index of sequenceRecord so can check for merge imcompatibility. - prevloc = loc + holder.size(); - previouslyMerged = sequenceRecord; - holder.clear(); - } - } - // Append anything left in holder. - if (holder.size() != 0) { - resultingDict.addAll(holder); - } - return new SAMSequenceDictionary(resultingDict); - } - - /** - * Find sequence in list. - * @param list List to search for the sequence name. - * @param sequenceName Name to search for. - * @return Index of SAMSequenceRecord with the given name in list, or -1 if not found. - */ - private static int getIndexOfSequenceName(final List list, final String sequenceName) { - for (int i = 0; i < list.size(); ++i) { - if (list.get(i).getSequenceName().equals(sequenceName)) { - return i; - } - } - return -1; - } - - /** - * create the sequence mapping. This map is used to convert the unmerged header sequence ID's to the merged - * list of sequence id's. - * @param headers the collections of headers. - * @param masterDictionary the superset dictionary we've created. - */ - private void createSequenceMapping(final Collection headers, SAMSequenceDictionary masterDictionary) { - LinkedList resultingDictStr = new LinkedList(); - for (SAMSequenceRecord r : masterDictionary.getSequences()) { - resultingDictStr.add(r.getSequenceName()); - } - for (final SAMFileHeader header : headers) { - Map seqMap = new HashMap(); - SAMSequenceDictionary dict = header.getSequenceDictionary(); - for (SAMSequenceRecord rec : dict.getSequences()) { - seqMap.put(rec.getSequenceIndex(), resultingDictStr.indexOf(rec.getSequenceName())); - } - this.samSeqDictionaryIdTranslationViaHeader.put(header, seqMap); - } - } - - - - /** - * Returns the read group id that should be used for the input read and RG id. - * - * @deprecated replaced by getReadGroupId(SAMFileHeader, String) - * */ - public String getReadGroupId(final SAMFileReader reader, final String originalReadGroupId) { - return getReadGroupId(reader.getFileHeader(), originalReadGroupId); - } - - /** Returns the read group id that should be used for the input read and RG id. */ - public String getReadGroupId(final SAMFileHeader header, final String originalReadGroupId) { - return this.samReadGroupIdTranslation.get(header).get(originalReadGroupId); - } - - /** - * @param reader one of the input files - * @param originalProgramGroupId a program group ID from the above input file - * @return new ID from the merged list of program groups in the output file - * @deprecated replaced by getProgramGroupId(SAMFileHeader, String) - */ - public String getProgramGroupId(final SAMFileReader reader, final String originalProgramGroupId) { - return getProgramGroupId(reader.getFileHeader(), originalProgramGroupId); - } - - /** - * @param header one of the input headers - * @param originalProgramGroupId a program group ID from the above input file - * @return new ID from the merged list of program groups in the output file - */ - public String getProgramGroupId(final SAMFileHeader header, final String originalProgramGroupId) { - return this.samProgramGroupIdTranslation.get(header).get(originalProgramGroupId); - } - - /** Returns true if there are read group duplicates within the merged headers. */ - public boolean hasReadGroupCollisions() { - return this.hasReadGroupCollisions; - } - - /** Returns true if there are program group duplicates within the merged headers. */ - public boolean hasProgramGroupCollisions() { - return hasProgramGroupCollisions; - } - - /** @return if we've merged the sequence dictionaries, return true */ - public boolean hasMergedSequenceDictionary() { - return hasMergedSequenceDictionary; - } - - /** Returns the merged header that should be written to any output merged file. */ - public SAMFileHeader getMergedHeader() { - return this.mergedHeader; - } - - /** Returns the collection of readers that this header merger is working with. May return null. - * @deprecated replaced by getHeaders() - */ - public Collection getReaders() { - return this.readers; - } - - /** Returns the collection of readers that this header merger is working with. - */ - public Collection getHeaders() { - return this.headers; - } - - /** - * Tells whether this header merger contains a given SAM file header. Note that header presence - * is confirmed / blocked by == equality, rather than actually testing SAMFileHeader.equals(), for - * reasons of performance. - * @param header header to check for. - * @return True if the header exists in this HeaderMerger. False otherwise. - */ - boolean containsHeader(SAMFileHeader header) { - for(SAMFileHeader headerMergerHeader: headers) { - if(headerMergerHeader == header) - return true; - } - return false; - } - - /** - * returns the new mapping for a specified reader, given it's old sequence index - * @param reader the reader - * @param oldReferenceSequenceIndex the old sequence (also called reference) index - * @return the new index value - * @deprecated replaced by getMergedSequenceIndex(SAMFileHeader, Integer) - */ - public Integer getMergedSequenceIndex(SAMFileReader reader, Integer oldReferenceSequenceIndex) { - return this.getMergedSequenceIndex(reader.getFileHeader(), oldReferenceSequenceIndex); - } - - /** - * Another mechanism for getting the new sequence index, for situations in which the reader is not available. - * Note that if the SAMRecord has already had its header replaced with the merged header, this won't work. - * @param header The original header for the input record in question. - * @param oldReferenceSequenceIndex The original sequence index. - * @return the new index value that is compatible with the merged sequence index. - */ - public Integer getMergedSequenceIndex(final SAMFileHeader header, Integer oldReferenceSequenceIndex) { - final Map mapping = this.samSeqDictionaryIdTranslationViaHeader.get(header); - if (mapping == null) { - throw new PicardException("No sequence dictionary mapping available for header: " + header); - } - - final Integer newIndex = mapping.get(oldReferenceSequenceIndex); - if (newIndex == null) { - throw new PicardException("No mapping for reference index " + oldReferenceSequenceIndex + " from header: " + header); - } - - return newIndex; - } - - - /** - * Implementations of this interface are used by mergeHeaderRecords(..) to instantiate - * specific subclasses of AbstractSAMHeaderRecord. - */ - private static interface HeaderRecordFactory { - - /** - * Constructs a new instance of RecordType. - * @param id The id of the new record. - * @param srcRecord Except for the id, the new record will be a copy of this source record. - */ - public RecordType createRecord(final String id, RecordType srcRecord); - } - - /** - * Struct that groups together a subclass of AbstractSAMHeaderRecord with the - * SAMFileHeader that it came from. - */ - private static class HeaderRecordAndFileHeader { - private RecordType headerRecord; - private SAMFileHeader samFileHeader; - - public HeaderRecordAndFileHeader(RecordType headerRecord, SAMFileHeader samFileHeader) { - this.headerRecord = headerRecord; - this.samFileHeader = samFileHeader; - } - - public RecordType getHeaderRecord() { - return headerRecord; - } - public SAMFileHeader getFileHeader() { - return samFileHeader; - } - } -} diff --git a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java index 2e243b847..c0537334d 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java +++ b/public/java/src/org/broadinstitute/sting/gatk/datasources/reads/SAMDataSource.java @@ -556,7 +556,7 @@ public class SAMDataSource { */ private StingSAMIterator getIterator(SAMReaders readers, Shard shard, boolean enableVerification) { // Set up merging to dynamically merge together multiple BAMs. - MergingSamRecordIterator mergingIterator = readers.createMergingIterator(); + Map> iteratorMap = new HashMap>(); for(SAMReaderID id: getReaderIDs()) { CloseableIterator iterator = null; @@ -573,9 +573,13 @@ public class SAMDataSource { iterator = readers.getReader(id).iterator(shard.getFileSpans().get(id)); if(shard.getGenomeLocs().size() > 0) iterator = new IntervalOverlapFilteringIterator(iterator,shard.getGenomeLocs()); - mergingIterator.addIterator(readers.getReader(id),iterator); + iteratorMap.put(readers.getReader(id), iterator); } + MergingSamRecordIterator mergingIterator = readers.createMergingIterator(iteratorMap); + + + return applyDecoratingIterators(shard.getReadMetrics(), enableVerification, readProperties.useOriginalBaseQualities(), @@ -847,8 +851,13 @@ public class SAMDataSource { return headerMerger.getReadGroupId(header,originalReadGroupID); } - public MergingSamRecordIterator createMergingIterator() { - return new MergingSamRecordIterator(headerMerger,readers.values(),true); + /** + * Creates a new merging iterator from the given map, with the given header. + * @param iteratorMap A map of readers to iterators. + * @return An iterator which will merge those individual iterators. + */ + public MergingSamRecordIterator createMergingIterator(final Map> iteratorMap) { + return new MergingSamRecordIterator(headerMerger,iteratorMap,true); } /** diff --git a/settings/repository/edu.mit.broad/picard-private-parts-2164.jar b/settings/repository/edu.mit.broad/picard-private-parts-2181.jar similarity index 88% rename from settings/repository/edu.mit.broad/picard-private-parts-2164.jar rename to settings/repository/edu.mit.broad/picard-private-parts-2181.jar index 4465f91f578165fb7f49ea5c891b40da3ac8e70a..ef33718276988af18e549760e2fe06dd91544302 100644 GIT binary patch delta 820 zcmeyhpXt|rCcXe~W)?061`Y;>U|%hViG1oTK_J?4Hp>rhAbmp)LjO_%(~}h#HNXlc z`!MQ581;;nEWdzCH}7GTV}}UcJXGcqu+FflMVPTm+SG5LZR z=jI8VIgDU+lekSFMp$s`vO!pxf`3^cW@L%kvVhFkyjskM6(adt`WpvC?5oO3PB3e- z6sO+g3wmM@J+JiKA@ZjBe;6TpObtbtAuL}LZAOS}jp;ic2rJKNJ2Ql(={A!Q?A6W3 z+#8r6I=sB@vq8jk1B;n>K>=g7Sa`c9*f;0h%_cvX&A$0na4=N4V;E2)$jOV3MsPq( zIGG?0m3)#^4w2j(pLz`{Ynhh;wS8&fb*Q?Ak~l^|kWJq&zQ1xzh=E~`1_Of$FzgIB zE0kRmf*AX&Baedx6mOGrCYnRMzI>t`B&J?Y)PpdjCmBH)fs>%o(mTl>qWHojPq0Cg zWhZArM7k$?Kp2M8r6zxzYz6kmWc?}G5Yc&4Tp${rO-Y0>yr*VBq_$7>g(&8j29?U4 z77Yo0$e-%$QjOVerjLfcT^c z$N;6e$=7CuLPYduL!~AI8DOdJvy&mZ;^xFcME1`~hA`CTLZy1=WPHxZ3GRKV(dS#L~T`!X=80|W56nkBG{uM z6?Z3XlBP)yMMONw9&#z<)Pf=yQKKjIPy~BWJZK?SaCg2ry&vEAy*K-2wpx;^CCPcR z$02VfL?Ohuln?37y|QlCU`~EFY}HRqsMTG(vS!-C1FV;N0rzN7u2@lXi8j?j`mD4A zJZh)wgXP`HoUIR0LS%`M4)!9lgO%N?`B+U*o-^wF7|~wWS_8V``X^(?xci7~&oH06 zdpE)S+xSO;_Ivj;l@s%*8Y^pV^sH%N_yO+*MNh!D%>nB3@27C@27c6olE;b;(7xkY z%2zd4!c!7Dy1T#BKx^&4E^VCfvrp=4#EgNJPXt&RC81Coe7!Dwyyx zwq2O3!?$3X7e^|>4JOCL=})eG6uGGzQR=c!T7UcV{YnENOD%->t-JG?%{MCz7+bxc zRAl?zSVBL9)t~A|@lxM)4bW&D1oRu?S*DE;!eyh24`MsnIFyI%1i+W}uwU#j--CHm z6Hp7OPBeT=4FP&)#$Xj^`VdxTg>`lIJe1d#V&4bzrB5OJAUyzOHGLa%hB707SD6?r zEqfV|$xZ^Cb1`f(X@ULEvC7}-$qQ>bKLKSUKZ@{Z T;T)9ZLL8G1EJUF^T1fl{#xPWO diff --git a/settings/repository/edu.mit.broad/picard-private-parts-2164.xml b/settings/repository/edu.mit.broad/picard-private-parts-2181.xml similarity index 58% rename from settings/repository/edu.mit.broad/picard-private-parts-2164.xml rename to settings/repository/edu.mit.broad/picard-private-parts-2181.xml index 6a22ea2c3..d11423b59 100644 --- a/settings/repository/edu.mit.broad/picard-private-parts-2164.xml +++ b/settings/repository/edu.mit.broad/picard-private-parts-2181.xml @@ -1,3 +1,3 @@ - + diff --git a/settings/repository/net.sf/picard-1.58.1057.xml b/settings/repository/net.sf/picard-1.58.1057.xml deleted file mode 100644 index 15c5b5620..000000000 --- a/settings/repository/net.sf/picard-1.58.1057.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/settings/repository/net.sf/picard-1.58.1057.jar b/settings/repository/net.sf/picard-1.59.1066.jar similarity index 91% rename from settings/repository/net.sf/picard-1.58.1057.jar rename to settings/repository/net.sf/picard-1.59.1066.jar index 4a82a3058e5c8939773c8c4f3e78dae6105547a3..1bbfd5a19efbc0395c83e8d35c3e212834891633 100644 GIT binary patch delta 58768 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 E4-tA^$p8QV delta 55572 zcmbTf2YggT7dL!n?(W{ZcW>H~!a@iM1PCb*It1yxhbAC3KtL1{NP-HM1r<>#q7g<= zX#!CZr6mi}ML@BEy_d&=U9f=)$J1}R?b@ck+A4OTn`mKaCsz`3*H@pPi_v#Qy}u-! zbL}TDhC|c7e8h-k2yT0A$+R0Hh;E2b=bFj*(yqVM+tuaA`4JAF2mb0A?!5bQhcmbf# z+Q5eTOcU*--SV=|p4Z<--`^H?_R#w4g^+edFOU1?ViQbe6PLkyDl+J!QCiKY- zqMZXysCJ>~E$qyfd(Lmw!6NEll@7_PrxyGflcAQ~66FmYm@RTFyBnc@ZWBEt?IC*Z z%LCsWLDfe}&w7(e5A96|EnFf_yPRgTI#ne4i4y&#F|X89&z+A+3O%|)H1^x6ohy!> z|5PLTR8wChcx<3nMT!Vj|3Zu>gkFBDIc@#0Ma+-4gKEYBk>k1@gB&V5Ag* zTXiRP`xy~*M{
H-% zbpIrE`ZZTS7juxb3b)!J$DJZTH-=SfYNof ztu7}|RI;XNb{^M_;~#A-i5g2A%2m>z5*pc1%a%^Y`x677Sombas? zx4UdSR=FO(t|mUDMTJH^s4a6j&3?O5TkQY8z8vbuq5kX)FlitS;<&*& zIGIFsWHQy44JcKnQd8NOn#nY3C7V%unN6K!JL)cbP=DEz zhRI%Zo$O8dvJbUDeeopI84_wqt>JU14YdWF3~#$IyiWsO%q#VE;1yRv)EVPSa^U|D zhz3y~IoO86a;gslA*nqYlhlE-;QJBEpdpk=CUAcUwW>qjD@++L$b{g;xs{+om9A9> zv^E23VnnkkjOr&ZKYtK4wWKyCDoOQ{PL0@U%uW-7(m1-QP8lXz$zrFOPR)T$s`(aI zl6vz~Em03ID)m{VH(sp|YS<+1)jC96wQN+QXyUvsXH`<~3G_mr{ya=+^71 zx8LxjsJFh+>{XGVM4YQu5UDykMwq=AZUUhgZpHS|5PTN~K8m8@VzZ~27;20o#ioZy zq-T@^H!>L^vw)2b3Ih3nGS~~nS#pVUVXKCnj}#XvQK$MIUSOEKU>K^t z@OhAGF)YU^g1rjzmXS-l0)mILNYif88Pi(fCb@by$(XJJZ8gA$M9WO_Occ>ED{*9A zy=IcvtxJyU3Ap2WmYxHXxP6lg4A(&|A$awYkx!YlN0jJdu1Qjqn3N!H;?T{8xWy3j z3^Csjw;JL$L)>nNI}8!z#06etTd0dWO^OyJ{BajMceAsIoqO0>tc!b1ai6%KKbEkw z6i!eq)F|$ zi;cQ?!lW#*iBmRno-GV#89Ps6y^E(f?rC;{TXpda2ez5wS@9f)w(DYtmvY2Tc6OQ6 zR_tb{To)B4b>XsIL`WBV46&CheBKcIOzQ5$@8`q=-0VSJ9P(0sao7+?4Do^?jvC@c zuICuHahyXZOz~1stcNRJ=8-;WidV#|x_HeHuXD|BaJ8qr=*Vey-el)3cHU;^9d_R3 zrrzVw`&`2Zrua~N#Lmb3`3aBFr@Hve5TEnVe_@FKnBq(El_|a!-NH5hOEn(--9C)bupQ{!&oir znKDV%*Jb-;lb(_(hHSuoLqnz-vXLPh8?uQZ(+t@Z(PFJG(@okfGYpvt^pRP*Y^F|~ z)EZn(_kTI5-C+5;j~qUt+pwM!d-fZqTC~=3M5-FxR!eBqz1#3!J-Q7XIGj@ixo6ES z$-hNV#8vU3b+2d*p0rO)i{WGNZ5{ zZ|2N-$zc{Kxd41yGSWhOPit?>#BlV${DSEv*Mk!bfA=exntzM(zoT`GiQp1dydt>6 zA*#j0W_^1$f*bnLA9zoVU1Ps<0^&jK9U!8tW+n|OIj7&5=v-66I^NR$vRttaAGSuv1w-I{lea#T@%|U>$+(0p~ zI(3gNx%DYg9Jo(!Kmxj28$-28$m`RbkzwTT{}D9}v(iTzj%E8TEMEpeSn zdBJ7#yG;g&$%0&YMMbHgnanl2X66?l98oZL)}R^1v+_!&T+b|WR8fB3)EZS|yPBL| zT+-d)GY93D6wR2T_I;#vALiwp-RG5XDHF8}F6@E%z=!TsHWfrj7icMJO5xmslA4X^ zX=A&O?cTKCm1(i-QHMU(ng~-JJ}=wXs$y*g8Q~5Wm!>=$t44gH&2`EE9IhHBP|EV@gwf;;?Hg%Z{gcX#TrY3!&#j49&-FoR`Jt9ks+r}^(QeV@AOP#x3 z)-f&FO18FS8`(DW`)ArPX|%&99iW41h3TuE@Bw{j(U=mm>@r#~zl%TfLUeW=Thmb^xGvgjgRvSeq`%934VSBs8t z))VxCF1uM0OshqoBS!Y*&?_9>%aXliA6+)LWMA3OlKtfXK^<9AS3Irx>>29T9qvf` zWDr#oWd&WMPVd(eIK@7xxic)G$$^#}BnMk`7ElU}foLO#a6+y{f73q}y+sEFbx?E0 zyF2(TdV@~sa;PPT37NU+7ij$`Sf2O8b@;Z#B94p6Ja=e_N&UF9_xV_LF6_gX{D?u5<<`yJRDJ+;aWBS~p zJSGpx*XI={=T%n*ga;|$>eIj>HBFv8wKxbSO-;@NQYK%ORW#+UPO|76 zhE3+l$yks)5mPMDTC~xnXR0Ohfl!AlBWtUyue8*GZR9jAGToBbbCDVB+#u>&@6M3 zZ__`Z`8-R`m$&NjHcQ?v@6ct?k_+TQOWrB((&gQjTm+;MokbT*44@ytbYY;yU`yVE zmPJd^3SVBEdq#$9>7XSSGpzT@`z(1shnC2t3{S2lmkF08Co;gxsSik(N~YV_oWyqofx&nRr(d&W$h)n)NS zKr_*jYviLU`5P@ENt2IZqWTrwls9w6)MV%I-)my-km3DC^cyl*O*^C2_u_E*f+ePi zsj6#NJ+=#|MHO-hYHB0E)EU#J)Ao#v`sARhH{cSJ`K^81-{{L_@Xxtd^#_oz(`a_s?oe z480)#=7BQ`@>TA6S4L^nwW+F8VYFZEJEujem|wNg>fT?qaq7C?wJmCMk*l@(q7sa@ zeRTY6S)@CdKzqQU^EmNN;v{?r4_jL}p{gY` z@*@}f35P;#aCUdFd)Pk6q3vVOvwduPwvU|;zMnTg)aDGqc?$Y@Bdm`23*&+<$Igg7 z5q=%IY>$7XUCCCe1M0!^;e2nyx2W;G1K+a7_f9_hVNb&eU+{T71_;6@%rg6cy^o~Y zJKI}dHNT)u2=1e3T!}&Ul$5@Q>X%b8j-SbT1*NdBRZs)_@Gl^pr{1=p;C>wQyHGb8 z2a)7-8cH|NwKR*y(rlVU#rV2~3TYmd(0sVJ(cN?hJwOX-6)mB)w3N2cG6C6XST0Z| z(hcFor%RXuQ^wHhw*q>|CtR6;py6@yu`H}%Ii;!we`!sE_4ZOzK?5`P5}2CR)Bu4D zUN@P8kS%E+WsS)UQM0|&T+*nr%8$_5F-XV`QHz0Er$i2Jr09(3!4=eU)ZI7+R{osM zh4xYAn2ZXF3{fi-FQ?YX+2#aw*hg)-d@BChRZ#o%;BM-`KI(BFpqw$gHNUjrUP^G$S$En!iT{xjDXqdir}IY`5I| z5Tg3vudjv<^pogS|J^iz+ge9`o#H{K{6MGtzcX`%gOKP)2i;tfBZgdQ;lKKm_3uvP z4oY`GD5s(5&afO;z*RxRS5qzagCla>=>d0$MwV6nfcg`UQxtm@bZt6hgNbF-D92s1 zr=uM>>Q>MgbdpP6cL)Vq@20VB89)Tawe@Iib%c}bxy>;GMtF9!Ib=_7R*pB$9q{fB z(%4CD-EkfSY22i?o;W=m(#tAejdQOBj-$?S1B>I_iwnzXd}IgXO6_LA4A2b=Z4K#-~ z(yjCa-3k9*+6;R16x^q=)olf3-iGbqIZ*ZO!cRLyGuny0wn8Y{D>mRDP)09^=jf;i zR?v%LKOGZ?=(speC&X*?l6aF|1xP2wd-MuKlW#y0c}jZew6y3=nMH3w1pl_|M(;r2 z{k|MdAINF+A^6~rz*T-MSJNkQ6MZV5r7vVT{RaZTujCo}TArsLXopNd&NOd1V4Ff4CY0eM+(8e6j=*GmbOSpNMeWX=)sfn?cJ(9Z{DI z^ekLLt5;P5oeG!G=2w-#D4;~pF7hq}&xvT*ryZsyPK8=IwG{O@)fEXrErVrh7XT`Q zfGx(ADV(iljor+|nx>iiQYzq$PvN zA{9Yh`w6nWMxrr>s)@6mg=5kXgKHn4Tm7iSixjPk^uMXeC5q5R24vN-|In~YxMa~q z=07y45~5m{F0zoOi)M%;oQb1!(LBN5T^HFYmAEwX)=bw&isnKHR7&6&+FqhYxWG+s z`!@ks8X)u+HTvIi^*P^P)c6uZ)B@qZQMKe#5AV8aM5Wds=uq(Vy5&?SJ-u#-rj=7& z-hAusq3Iy)2nAdR==w2Q)h;#zv>k-KCkXrS3c8_;8V;&S`ft37^kZAT?$8b(nimYi z7%X7TW-8i3HclcAqZW*ZR6hU#T^-2fAVe4SfEY>G=Ic`%kxbWO;KyJ_uESi+!_YGq z!NT|JsJ@MkSamc%JjV#J^Z{Mtsqm7^>%R@-$vws?6)tl{ZgAWnA#`&FdNveW+sq1@ zwTB7@fe$FGpxK?%GwX$D4)1@vsc1DB{^BxhtR>h0kz;O%ZbG?4|INk$x@C-(2`(Vu z9zMp+x#tZZ<6(dP9=dh-7@dQ+ac~daUO{(oF*L`Fl`{qnSWig=GjOAkiN0r{N6jf) zWK(<5f(k`zx=FOL``g(8xVo1&+iQ}qajq9_!2n8JI7|}lz`1Ie-qE7H=m2gloBD_x zq`K|Vh$eZNGIh}rSaeM{_B#O(u!=#2WUX_-0#IzzfzY63w_bBGPQ@F00&&^hR;aJH$OfiE%Cj zYCS=<;@okrsR+kzAl=0mDQ%5?v9FYY%rJ+Z;jm5ZAFJ8oaO@F?bUen zEG|n)bjB=pBU5w-k?%>hMK7u=dQ)%FkEV3zmE+JuHI5 z=n*jjvh!=P#f_!c#CZBZOrX!jL^>lT(Vt=pRf?&=y?hZRt{1Ul2I%MwqJg+kWQtj$ zg(v_n6^brmwiqaiaE31y<3x#=B<3R5JjBiyw~57O|I_U_nG8Wa3zniav2@I<>Hgycb81{x*^4HS~DZ(m<$} zeInvGUJ#(?;!%vlKfr2Jl!`v6#f1@CBKjia#yABRiGFCaFJc5BDgrRC z(J6a1dF?fXlTam~^4X-B7t%nc$%E`a9JFd*AooQwL1ixyXzf7Z{fkV{=tf<|C2ECS z*VIm|UoWN}K!UW$S#Go?2*^N}sJYfzYwL=0WgOf{shM%ER#-@DC^iEj=WF>IEGtdi z?ZUG9sGfaCXp_=9OdZ4$)VdTm$;&WQ%c%*%S-3T0YS|jqyD81y<@u_&dDUPc1kn{A ziaD|u27xbRv+R-9><;@#y9D|nQvOB_lI3w>s4Fl^OnLk5qX+oJlUB7itZ;}w4ozeH z4?5xGx{E64A%y*72yLyW8^&$N{H0(X?P%dg416!czoIe zA!?XW)v;9$?1&%ZR|o^@3VLJ|vaaUCYDS3Gl+mtz^eD*9V}p4A^lRbM+$}aa$>u2g zq%$}x%mUwyKn7Ur!*q*t+**Jjmou!3Sgn6Lxb(hk{E&YRu$KxAfA-EoBv-moeHnxyB;oq>V!wvjs_HT%;UbjE@A%q>Bkbtk;Xw z3CNLlfg1P?a3d2z_iUjAqnEurqV`b&CUy&sGi7_|$t%JU+|dGxqhL&5w4rw{>7zuR zn2fe0OJ(6=eam;z8|Hbg+ec6Fl35+1rw3*Fw*vp4;RUg^jQpAYZQ-wN*uKQztP|9# z3KzHtBj2-(4O`iHjvW+m`?tdhBjk=u{|?mA)|Khs$-X-sEOK@jFLOLN+V9HI19}(( zPX+W~_!PFAxAd$ED$nsU7Oo)+8?%GCw$G9OLQQ123N-^bp@(rZtqO3zjl_1&3SwNQ7FekZS?|H6*_0~#5g!Q z0Xz|jSAj^cftNf*&BSRMFW#aFII>L>?^1zyAE@;K-4+xdVgvk$){BpE2>gWhi%;o8 z@i~1Xz7RfKf5(ZhL>lhOJBn{ae_U%{E4~G$eP_@1-I&q!I4&}VdPN!<$w$ZpovACP zA>_k`;$X6cgXuvrUCaQLx|80sF&P9-TqlCg`GkWu0;9lS?3_0OvC>7hn2BmMsA&Bz zW?@HiQ33rZ3J`Kb%J!+f3_R5+@6-WA52uaA>5Wl-5=C63I=U!~=n6EyNUh=W8N}d? zEGWh!1u?vrO~7Ixh$3+`nT@EX*|odbC2)G^$RR$N==Szkvk;oFMVw*|aJ|UJ`(k>$89TRhVD;reIM-v zZ%K2ttnUP$?c-Y9%?Wn6&lRW}!HV=~%lS{G{2Udhx(ZKBLUp~Y;hEV~{=_2MuWTjZ zRCRcht1^-kUb>rzh3C_X4f=FGc#-OY+X{rHf9AT@bb?2|bM23HiY>hC>g*_s57k?@+y*v# zo2AYUfL<(=aiZ01)9nrYE!_t!r@?(uZm)ELFU7d;@H)Z%b=?nood!Qkb+>gn!9Y{D z-^rkww{)L&vbtKiFSzVrMSJ)7Mowhjcz0}ggy&6mPYB0;wAfwdwnyaIt-1Hy4cxq2 zw{@S@q&ohXRZruJb!lC9ROroR?nS!Ov9T-NLCpz%`iT2{IQYS1?mc=W55n@6#q+zT zKw~z=);9{*<5Rhhx?O6~%*d$Fe>S;$q&P#<^tgM!&k25a+I>&F4a%9#d)k}eO?5Jy`IJY|nJvl9d2<3yMu)4XkLDeF8Io zY=S3BeRj!hg@WT54%TrDJuty@)?=5uuu{-s?H*vLRNNmU=QA*fW=TR)#V5nDTt2 z*}Z;oM5j(Yn-TSFrk;J&lNp4D(Q*L}*JlU|Tc3z9nUd)O^dZIs_hlLanmM|t#qqHm zf?AHp$rf*j1dgt4hyeR_*r|)n*%0*%kz|Pa9Fc5@6hkyHL_4|h}QhwMi*@j(T-tgZ-@?DM~)#n zn&KMK$;1Juvmv?|qALfx8KS!`dYIs5dUDZThUl$}J|=bM?`5JdoS^8(!T!2{YIYAX z&=7-kF<2KvOzIb0OGYw~Fgds+n*fK_OhS9nhql@b}eyj;bX`D&9OnfJp zG*aYpg%fo#$;1I3RV_zV;3Be3D6LE}#8ggh4pqBlBA=t$aAF%nOf$rE6UVX{oN|LM zZZxsG6>vWb*_qAJb2wDQp<)h|7|`s4f0JRW^f4spV6K?QqY~Eb;~;DIu^;pz^8yYn z9K`OOT=*_S%;b-|4Y5cU_ZVWa0o6WgChjw7p=i%@bU#sL6kWX8;9e9La( zLTZKDur{)}I=01=;(I`>)CF$uR|%z#+!Wav_8p#N{{iucC02_y7EX8Ychd&*-OYsETCtQYIl;WE$d+6JLQU7z&aDq=Q@C!mYZZ5Jm)g+^>ruRi7J zY&<~95}U;q<$u~UFuu$ZPl~5-OP}mq%Qv&c(}2uYoml#`r(Wj=#8xOJ*%$X=C5&uK zJcE-nxtdL$-%=N)me?kqwQ!kS4(V^R>GSQBX>%+JQMo$vw5Njs)|;E$uF|%8dPYA_ z`z<=o&N1*eRD0F9$l7iUh}fZ4Z}p7Ld_e59#4g&zQM)Z%)gHF6fA52a+Q<>TvoKxd zmZ%URPTr%=mFl%r?laO*9iQNm$!K`8bN_lkif9MCSJG1 z8}z;z!2dWI&vgGmP5`z`Sh}F3T@lv$q}`d(Q=y)sSh3u=mz&e zm9k5VPk0E?_Q4i>P$|OBIl*1J@MtZSQ|?)c6>y^5lhNc#+8y8+S0m>dyQC{JH8mAn z)T6lMK&7ETg~uyUsA0&{rz02QBTqeAhI^0I$UwMgzEV7z^hiG9(BsYihM9m}(ORb> zwRn$bm^vTwbV6lq_WTzF>;4A>>#r2#b(^sF|DwzWT)ps6%-HMs8)c?G?-?FspvR#{ z*Hcei&TN7}p);5$Fqg)`pft&)I{(BL|Utn@S9f2c5V7ZPy9^cIat@vjR?l0@C@G5F}tXbFvUP z`<;yd*sgF#C+zcdXwUN(33v!~ducm0p`A76F|Ed6Ya0z>}`+p{^_(khqMi!t#qXM#tmSY}&>5+hFA#^xOrozCP$_*qJ-UV08=w z!;^Vk7#I#Ysxmy87$1LvyPwlT5GlK=-iJJCEvg&F%|X>5fz7I}B_Ujk7qsn&U2NSU zPePL`#Txw^UNrYYIP)imJef5z*IdGN!)ck-fLbM|3R(;AuE)u_34b!O0EJM)6W zp8i9skqe@?7ziu<5K~r-ioeFFw5aY+iyEVXNgwJA2`Ic>Y2b)wbdW1`M1$AjL^=u= zETbu2jDbvbEG3I^b^~m?!6r5*phYAx2@W>!1azrxs>{_)O>~+973Zdqb1&*(v0~;< zx^BNQNW=X}1&tk}&K~h(V2Tr8@HDxOJHui~56ILjSi_LXz>MKltYHnU`l{D(CIqgp zBQI(T>nZWH$B^q1&Z@Yc{flaKNBcfZ&FL^ndHe;>Wbx3dqn?c1s#d&ctuVRdRv^%vjJkQ{zYS$4CReu}^(1!TaRhO|S^Yl9#O|-2 z7y{hyhU@Xsd$z_C_t4RL;z~ZUD|z>*C#eR0F1IUi0*I){t_%nET80C499F5vJlz4y^kbg-HW6W1 z8es~*MH?PK(7=WTh9wZLF)S|F_|&ywVZnBrFf4A6jPD@Yb6|;M=`C)P(Yh-P%LU-8 z7ov?H!wr9likRY#PRGU5ELO6)aZL+W_VGZWMu#}g@E26TbfX~ELXRajr7I{q8aiR`BL~2Q76GfhF){_1fTp2uAfPOZ4$@g2D#sXgChg}y zDWpBNT``voQ~W;4MW=?2fi~8#5EbpDejzIUFQN)b7Q^DO4)Ngy`YU2^i-#V0={IOx zJ9E|+{o{Hq2rNtdbN#`aD(L3_uI|km)mik1-3>2P*3O43S%^w_{8Ld$%Yhkw$bsi| zN?c2Ei5WX-K0Y=i%@#qpkTfhwgn*{+|UC7rO1R+>s*qP3wLK}0~ zeyKkA6dp4RsPGpsN7|$3C0v*^z<@C#{#^~vf-pP{{|lbjEAV(T0M2dO#eahn{1Whd z1$e#&Jm27g`P&-cG^_?EsT!Pw{{|-|49-8*;9L%)XCc73eW3r2K^e!XBP8Z6{deG+ zcMUbKLed2lq~3VhlNh{xU|Hpf%Q`JW{e}zU->Ikg6GzYUIA>n4`^G5ihQb~%QXDqGT?H>< zteLq=tL8om!&nr?S)0s)PdW=hA6RJMZxza3f@Y$FT0f&!CNV>+QMMXi(J_5Yj0Ed) z&mjBuc=4FQ$Eglh<-Jg-$_z%MXZMZDgpk>UlHQkyw|Fq_ALCzw{w{U;+mm`--CrrG z7A)_Qq>GZJ2d1t%wUY*Ql|JevBdE8GwEN5ZOD!0DRs!z@2vHL#Oz?eHGI%@<9oJ|= zZ>-xYzH6v(*;@_wydJqOL;F#ZeycVNuFIuXy}nF;L8Fo=@DiROO>1kF0M3!EBSJD&-4rYzSp~ zHFeo?!!Z{w`{VWNrU0F$sBZgRaUrBGciC3`dj=V=w8O63PMvKg<3hO? z^=V;{pTDeUgk_E238Td8G@j=(PMWT}c^;a_8<|ez#CT(7IO`h$7Q}C@X3t>=84o$LTmQSbPg+A6qje{>equyz zm3-9jg;pFhdUkT4d0%?RhEb@U%lk(d+-%)@D$1^T`N>NIRDC?$QNJ1lkNRBm2Gof^ ztjN%i1n=tlPE9|y^?p;^E;DjVS=zTi;crPj_(ue0<%r=@KVR#ORz|M(FFVU!Bi0vn z^$~UTv4pxdr^bb@8S2gTIhCy#=lwW5inFJ9UkqbL`x0+f7&B%p^17m&ymKD*HV=>D zrboTYJ$3^}-7U`kl|%GbPWZhSh9P^UHxQb$(d+H#l)U2;@5=BDCVb&tpKZ@@XkUzZ z-sJ=<;?2r%aBp36XPOgR*we%l9E=U2q<-e$CI&CAdxO{fC$w&kS=S}TseNlQ6T747T6EU587M^Bj!m7N2oI0#GAAcBWYaYVepd5?1F zMGhS^*w$2v6S{cGfSD;^I?3O!7~)m-+16BNOVc#5)exuHKh4gYhIotpw+-Z1{aAdii!V&-z<_lS|KaApG@&E;6+2(ME5rYB z&To9UP5ah|tF*7!`Ce!9(_Z37pZH1qti$${`f^A6inAPZjvM<{7r&Zd%6?<8f9KF2 zoZ(Lnoi~GUFYxzY?7$Fpkobo~7umVQpO<~2QevOr{~lSjzyM`uQ`D2TDJrMA4e3GM zQb&{0@JTP4l%|iSNuMq)_9L9q1g1_#@~Hf*vt4R|jK=u)m5_q>g>kB^C1bgYICkQF zGC_RH3AH&Pzz&4p2Vs{g6J1u#yP=`sW3EHi`bW?^V$Geb6qg%;*ZwlHK%lUB%9x`aghVc7=bAlsUN+WRZkWe2|1pTuMAx z5?mw)aO6P#9^{NuRQIli9BjxTTuq!IbJ-ti$YF*YZpaasROx0AMzU!zaAuIamL15; z2g%V~&ls)|GIJ@%a%h|(#{)|wWaih)i6+gI5SY)DdED#ZWJ6Bjf>S+RlkJg%VrsrF zrvcGqoGz!cf4wdtD?cf3(B+LL6n5JfawY&^L_8yBaXSU<6!Pb6h74B9a{!!#0A0#r zLzZyqx$NA;F*mbw3y=IfKL_V?!CQeC@-|)Gu4WgRja5cnD@9FOX4F&b7n&nfa7aYU z(&v7Phehwud~ZGV@SSFJ_4b|SjiKl7GWTf_-r+N*7vz=9Ey@?vTMbQdHBrm!xV)uZ zXX|Rg2476*;9~QfP#@f9&MqC(J5kko+DKKi?l;${FMshhQGGv&$WRNGm<6hIo42>R zVX6797_ajFk_}6@&x(4e)TJiv@FuBGmYH=LvSsZZSk5q-)8ztPF2n)@qGR>x@=jnr za9rK-fcc(PoHq-i=8{>nVWg-|kM`D8H?1%uO&HiU=6~WDwS0xSK)pQ0s-+?yG`qT> z0Qf^_$b;q>A?^u1^^ob3VxxNYVe@{iF3h-QXPS7aXQdhKTLeQqxtQ%rzf(7^G`FX~ z0LL*Ah1JU?3oP7kmTC5U_hO+%}7ZS zb%u6%%)AAkee(KEn+OWS#Gh!5?N-+C*@PN-Qv>{ zD}5nHKBKz6A{twAn^c%DOFk=~Q{6mP9M7a52E5xbW^#wz2`QnkUQq7hs^*JZEx8*Z zSuT25vVub)cJ}b+UUr_B`z*PiLkHM7D7OF!EO|&C#(`l}(TtLk{DNeh!C<61rLbsf zaWhLEfu0S7F!|F8i}I5T=a$Td0qK;Pg~j=ne1Vhv-KMFBR^wTuqw+;d9+Ss)c|v`D z+=_Qu@+GNaL}Z*xzKjmNvD$1KLBF)_6dd`L{8~_Ix8mZtvt|@bPo7bL z-m1d8%{b8vR=zM~#DssN)~+$@1F6RHw$TtOY=x&X}V@unpZO|&8JzG7NJFANJkdjSWtL#LGr*ElZ*0- z=2==4UJA=xYmS8l$5lqGmKLM=QDE%Anx?HCF)X-IfkAn^dSb2Fxt9C^tw2E$7jSFD zqm~wnHTDY)_(v+hCqj38S^v9yf3nR-C6dnj2MC ztZ%wnd51UJrKL6PuTpZ1CMxb$+_HDR?5$n;(S9pbf0H>`gDvwEHPoYZRQEk)UN7pY zt}l3>P``EZbyDr_@?|TnLJU-~vt=Fi$J1tsI(*cd5Zb=goFzn(T7SI}r<%X$ouEp) z`eIbAeMU-X>o#+$P;W^XOuzl8XsX&jXU+?LjcqFiQa(^aJH*zA5&|)T>xT5n5wHIY zUoe4#%W-U}cn&#!EoKo=F+@3nDc-+R&vWVp#Dfa{JN0i0BKaRAur;DnH5*i(!ygh@ z005F4PN-`0cf59hh9OJji^Z%|J=4O;_zzhKLis{D{L@+M)&V~ePc$17S0V<&=J52@QA9zZ{WG~Bk8 ztVMDU%xdr;7r#Y>8;)|)*)h`n-g3xmV(ND-htg*(S>+VT2~n^n3>#GX)1k>-3*WJj zP{x&0{0c1WngCHv z9-i+S2UCbDvEOi!EK>006%9ngFz_{$6xmEL0pg_EdnjvTGg0Wh!X! z8hR@|D-aP1(vY0Uj6h^{15tsf8V%qp5NS6M8HjQk;NrQfDJBpFTY;fw9;`RZD3fD{ zttKD)FyVAkM{w#0m{QnzNAlOmcu&0X@EXbuL_o>-+CcDsl^ex5M^%*@&0nLdhmx&8 zF{qu}8D$h>4`vy80}&c(i}#p$_Mq#l(I#phgWG~K>Jf1B=v*f$-Zb;ZwKHRB>>MwE zfX;NV1}@mBFdkDM52;}b|AZ?@P&e*1ao z?fIXX6BCFzPHd?WABce!(P1jc@dy0J(cS2PA9oQCl+)}$bOp@;M!+j7tGpSIfnvJW zQ&NDTEMX|;vcqtp{R(1HeSj5PlPc&I`ztPAC5?Y{-)9tu!y8~C_LEK0$!2RGtTzTDt>#@byS?mViPo6{)P>)D((GEuj(7fmYx$@*!MAt`z-gm6%2fYNwBgn}NS~(;D1`Jt`ie z$HZz}C2gV&Q2O2|o~KRXByAS&)05&$dPe*J`BMuwe&KiFehap1z(Y?aVA?21IjHhpxg!n%3Uy?+zaE$k6}FdEsQ6Br%yDA zS9GK43oV)cqcx&0VM_Rw)}FrBdeFC8U;0iPLf>n{=tpfFj3{rWv)Tgs)uwyDLSUW% z1BW#9-9mqpMN^TEd!J}(4JIg)d_mkc41zg9Gu)WoOegG&k?8O9cE%_%4GOu18}|+z0*a3#`FqKp4<|0Mr4cKd{JYb^r+{e-IWz7A%Aa zIv2Go=^NJdW%V{4Y6ZAt=6}N=tnH5b*k~9q4*!Sx!M+8z2K;fEV0$q_7bA6XZCq4@ zSuetj)BhrO!r#=z&IRkUQOH*byoAc&zv^|lpo`2Ibk>yPTA(k7CmsQ&`M-J)_=e>>M)5IFD76bB@7C}jD~v# z;vo&!pu2?|v<3GAz{ne8X<^~=YY+@x4J_XYWx&!h(~n!B>J76NE!s!-pfij2(Y^5Q z<4yYhJ+uT?W$FKi#AW|$(_D@Xb2D{B4KQwt55lk7+8^NExr|cw(F$Bv*?Txr>r~K# z{)ZfBLR5+u4<6=?7|Qr7b6nnbZhNbqjtDx1KIBd0O#{Td%qH!3KfU%R-RM4Xg&0~OulVN7S zV}$M7#h=^)Z{HBQ^WJ>|bUG_OT)z)lU_QT&%?S3=dKZ+9US%u9;D)vq`y1Ov#95qU z!xNMc4y~tdaSbF+XH5wuGpxoHm!y zFz2a(4R$fR9=jxmp0o?2#vpBQs@&*Q`6O4#m0Vq~Q)R%1E&nN`!;oZBX*q(hEo3HT zb-bH5R(C9IwKvw>E3;a~jBUeM#k(2jVNR04_C(JKT#W@Y*_6co-of9t4T(Lt7|jR6 zOQP&@lmAnNyJ}XL>EDgda6#ZkIm1{%74Vk9K_(yR0axu47S2=VoAM&qUW#(|H9&PgCT~lFk~rBz}KgNw@ru9 zZ-y8xGGVFM9CnD=;#Lsq<%nGglKdF#`kn{LJpx+$5)@hA0Hyso2phx;qPvu$hqOdb zSxfYibwqEOBKpWqVt^bh2Fg)ln4B(#%a9l?e-dNlIWbON5aV&io?z1h*o26ccs5`X zjw4VYg%)KVLJ`ousf10?57=35q#p&_1^EEzH88833X%Ug=sGqR!E9XAegxS#Z!J2L zi7;95%b&3Y^ZDrxc_-9nd3U%=-X7i^-jvM*RDeOC-jNxw9qEA!Vi0kRV$@{}m_xnm zU8Xqb2Q#I<$cDfpF4H1i%(N-(%u9HQ0XiVTR5n;294-;gZ4>oyJ{8*Da~ABU|66c{2HXN!>SFig0x zqn{kp;82bm3@Nx@rWe6-EI|8f3vTSOF}-1FLCDz>PEH!GJ61KLn!2EU5>J zrW*{kJjZbe(T`I%CZv2gv0q8C4=13BVcOa&2hVC$(BXimf{xfswm;woaX9E=x^S?p z^7Vk5H6m<25-(@?fg6)?gq#9}u&J;(&qvMEuyIYt`B&UPQ-GnfMIqe=Tb}zx2{^&I z;Ph?+hj$COx_Nl*Vm^@cR+#cFurZ#sIA5Ven}za1@34)Hz6L!;gJBW$0~nNzsJuuN zGfLA>VU*?&GdDPPBg9B6!K5O{43-O3eg!Mysla6BUs&hGsbns};ubL_gj@PF=npX? zF%-xE&SNHD+Rx(4`~Qk&oMjdUY0x^kx`>^YeVKYGsh7C}IG z7G^doxFJ;7B|QV$MMDOIsQI(1&jvV*@}7ffsCAt^54HBt3psos^=C1`<>MhE!O>?> zg+m1E1Tj`57NLvxU~2A#uF8Fs37xYJFrBWCY^>ve_Nqs)OZ5nLv4;(htb%wld#h1A z9!z4+(`64AWGa`agT2_tpc4=dhdZG#>|ANXOyFM7M!vx~565L>;mH#|Q6I;74q*1) z?muR0)!5|PQ7l{qV)h73A6HYHSOZJYN5N6As|GX<1a1zvYG#`nR)gHI8svsykWC7R z+Zbdqh~F=UzUf6)#uy1OA?Rc<)iuY=MnT>t9Oa@d=u{cnei8(BD|U=$>^75aMl80v zrC5lQSXzbGr^Nz0X}3lln~ zX9nD$h3~AUs4PCfJJG3FKWN+q+v4=B5WS1f_XJgE2n5}O$|~2}Nq_(?zR%B3Ev*5~ z2Mi4i=`n$b1(Wesjwj#=!&J(lFid*paq12zbj^mMT^3VVhJs&m@CEb=`fzpCGZL;i zw-Xnn57$&hy343rHMmi1s%oZZ#i36hRY4uDFrW{ztHVe2>t@h{uPfo{3ad}zk`wb1B}$4;#u*RC>MW={o)@mRF}kQ zaap`CD(w|94ZE#^Lgf-B=ClyI3o|z^9K09WaXJ{gHFg}+z7N7HA_h#E!|;qpvrAD{ zqI+}jR5-Q~4GLMO#d54^7r4aN#RCXk*(Z<~p7-xG2}@n(k118w1w#%4RSwJYWC^&s$8j>D@ROLh*oc+)9j%hWD_VidFV_4N^N! znze$sP6<=LAxP#UGrvQBP5lb`l((!Xev~BY%Hh{GeZYeWczYZ21HawAqr+UQy8T+P zo9cn~CEw`4#ZZY{RE=q+`C2C^1UeiHlZc=#38l1}G$P=}aVGHz(qZ*(*&m$(?!jf1 zZ`Ua26a({Ay^O)VWo@Q7JWhvmRER#a1Dg;it9+ARW%%4)H}7+=qn++C1R$|6GT_b54GWA!d$VI47+O6pL!EI6f->}h#oR^= zj0Me~O(;@xTsT|RxIjg-616$POsp{^xH=3E$y2~R-qyF^shu_s z4)MzyHt*a3fu8ou8;f|1Y^sd+4qOfn;eC}dD$+XR=eNSR2P_Mh1b$WH9yS)BY`rJ= zh;RaL7w}hSyp7}n?)|G^gR2V$T$_XZ!~)7N+Ll#*cxBw}dm`BrINA%p@Y0*w%KrFO zmjS@hfxyv0G+hp+S#k()bT~aEN6>0Hk~ZW0Xr>CY!D`gU&cJx-LO9LFORXALJyeCO z?jTg)qwS0yh~%2u8Qr*+nq?y^8|2(zBP%m-TdF5-OBks+j!Cerfyta!HDg)iyU0)F z3{M5lg2G-wYN)3Isl9&}RAF_a3#cUmt>C8_@b{D*dKv}@`~xl?x)=EI4Y0caj9g1B zr)f|JYwux|vybJvt^xT4v~>RC@oE}Gz%EaXUy5P@p7+Q4xe*?EE! zHkoW|$Dd`KiUn%^OSr4Bf>6^c;U~_rYKemNz?Smrl@FypGDD*z}p&R4KZ z0ga+>_~Q&i`>jsj>GZvh2k>8S?CTYpl-3AD$x5{LwNh`i^0kQaV2rt2&s4@WzR}T>MSV*o zV?0C(T^2M>oo;~n>e>Y8fH4sbEYXn1`5s!V#I;Kc(cfdzgZ2#YTvwiQjo4QFL2?+#3fKUUGK z2g)iwk3p^lqZwzi@CC3`0+X^Pzd1~1iPjO zv0FD7Wi$kZF;r>;Mbi=4pn{;oN)i-pP#QY%BB6|Rf;O2AK3hUA=3pl~Jktb&(L2wy z32$K~>bWaM7+N~=2&s|Q(hYkgY}sHHvvku=e5+gt=ss~S0)BXe1mtIAVxJ-fH=xty zmB@~TvJ=7UnU9Ad*jCWBA*3dFZwQ{7L53+8B-3<$l&X^spC<9@#4;4p*0VS6Uv?f_}p%wd`HMrz!Psm9*0jO4YkV@M<5F>g3Z* zE}29P(uh`0*XzMoceRv>W5=kkdIzQYv}{R+N-`qBgeV3Jm{~a{zyr824_jR#P9qVg z@&Am|gvV(d7NzNGsW;MS_6{aL8>B?ehMtB9ZVt#hQVaaZSuLgG>j48Qc9n@A5iW3B zX7aUEUSj+a{28Wy1VnDfpmp&~=_6k5GpN6rA38bn^&%zghh{3SQp)fiQBpRRx zry6A!C$R@vr6pErX`^}>2o;xHP%|5WU!l>C&aLBKhJps=xs=n@C)@k^#lq1Un-EYL7xqw+w3r zl%r%Mk3p8s4oz-|9qMjK(1~<-eoh2i6yXR;-ZnJA(&IPK0u-Ilj zwhc0ag&=g)zURC#L#Q+RC*;+lz3cF}4mSi@djilI{lMBn9I6n)G0vAKf4S zGoFtu&+G0ytDogcD{$TsmxTSjsOjK?INNwI5ifa0vEkF5N#(-_I)6xX({Za;+(TYi z2=mQ_vHWaXIl%A4irHEG66aTf#O1%f|Mxu1^ygVumD%E0Q6IalJn;qR^8&i?%@#2q zVRHGAOFumMf>SO3VV(0^mx)p+-?zm%M&^^MM=Xu^zm$d}dTDelGp@YzR_C5Hk(lXo zXS~NnGcW7xxRpbpqleOq$)ANEhDPZPXEF;a%EM?W=pwcT>0N(OxW2U)Do&`>PWa&TGZWt2gX@VF%imHSF!i zyUGVuoYU*)P}zodVJFd)ar7$QLi%``KAyo1GITN1I(ZSlmdQe|Fs`Nd7uVAJi)-oq z#kKNs`go2$@Cf5tc_r@faY!D4`T~(zWtCr~@6{B%hJ0(C(uB|}jOzpP2CKZ0fG-p9 z74p4mmrLc>$hV0;%AB}`XC3))^TY}APOFRwTV3LL zH@)e&h|u4{twauNUcN&RV2IOlP2@#*lQH0cMHeQcP2_zx`8^vB$ia)bXk+<+6-VTx zTp2Ubx^zx%EzZf|<0JC@p99wnVe;vbG5L&_-?7Pud9Dcmh)u>kG+sVRk1Zaf;Lj+^ zaq?j%x|UAN<;pv#WHB8L)FY0*Bp`CrL_a~-M?PSqLv-={5FLGgYokMS@$xAfJ=WL< zk2T_BzY|jcda==gJtGi{$HR^IIA_Jfjad6Y=BLuLc$lC*A}=D`pRMvQ^nISz?blgx zlqrDg!~f&Nhd5MMSH5JEFFRn)cf~1fpp$hTyy^&(`s@5W-4jG}Egh;`ONZ*7kpHsM zk-E7!QiqV6jnRT)4=J7ap-=fp3=s#)bHH<3t@x?yc61u;N`Pd7$bq z|KmZmkxBNI*BY)?MEHT=vnm>dkpJVvQY4B1Qd-_>q`FhF?t*B@(&UvXMM^|wRiiNA+RP+N!Rl3*+K6xIyGfS@o4Noqp~h-%j$CNu>;@^^(1+g!__UwSuTpVM;2|_xX5o=fQuq7DA)0T9C$*wezr>ja9o?Xnt%VKQH9MvDu z2+{Iz8p%Y@2C{}bO)XjGT-9U4`+@X|T{ipATs46W#fPmqJtVjfv`gly?bG%tEmS23 zhgfj4(pxG_bn4IzW_v^L0xGRQ8Ic>+ZLQ>C(YydJuC-Cxs!BUL_|hI3ghkR@s?tH} zh}pIrrz)N3J;;1)EK9`=SLH!}nlxme9g?4|UUC3huC_eZ8Zsw#N-&#Ls}Cz?R3zk+w` z2B6d*>Y>(6R0b*ykp@mlHCGDpRG;!7Dlzm_-vv)?tRUdxZ&k*Pet1U?xxK#6S<|fy zM={9{%6QZ7A!P)sUZNIfb->Gd;3tVV9f_y)P%Fx4{+OQfh>E?qA{Col_?U$o)nWZU znL%4bm;Y3vzAdvk$7CCubiip}ncP3J{F|rLCbqy@bk;Nm(MYu5Q}~rzGP-N>Z$dbv z590vw`*r+=tcHHS0UWw!i*O;i_|`~x4RFXY4~Hm+!gpaRin^BMCOTm}F+p`0LMX>? zh(PG~yZ9}m<9&7(SgRB&Ma_P(t2NLS8)~ zI(%~kS&s-ylCY{K`6*A5b`CK}RbB@^Y>;G{N|`hEv6D;G22oh8aAUQ?1Cvhg+mbH> zHYFNMS*k__qF^?HnW&2M3Vt)q$$d0Ci6#t8%VV*a!S^TPXfY#!wi*1im=T{tCmwuc z6qHa_agMMP`TgH$Fz@i0l5ZE;m?sey2I$F{S*Cy%-!A90@@Tubm&&a+ePoD~hUCgB-lJDP+GC}o4@Sc#TqAUQshS>Wfth)G%xJn{+**Ly zOCL;4`e8~^h>6K?Of|-0W-}f`^hYr&Ud3lMYaokjac|B#469#4v2Vo9LNCiEm?K3( ztVkY~qVl@o77w~S$^>dLuyOw!^T}11AXpza zguDU)JBqO^UH@dE+6mS>d?Z#7F!-pUV4ee?sQ2+;Pb9nn5vo8tczi+>B0FjhwxQd9qbHSAhsvy$OP>;14UEQC8`v+fvFs zdba*&`0q(6Se}OGmXty(J3_Y4L$J{Q;5W^N-h-f-@ZB6Y1xb#Oa4S!q=K$nW(*-GPLdv~5OFZ-L#_8(8#sGt@?EV{wMAcA_hw zQh52%Ot3j`E!46yP-=9&)giL*60-Vh+h~88j&5{ESK6~t&&bGwcUe5F(#U?Q7d_1g_<28 zsV1|!0xZtbn}b%YnvT*1vp$p)2`e72faH^~QVkyq3M+g~P8{xl>@)!7j5`KV3_$w6Q6e3Xdq)O)dQk+$~QAGmpN4$VD49cJ&!QoS%xXT0uugbGKmJfX-SrK_c<{XtFUp$fx;Lqhp* z>vCSd!^mWZ*Kd4|tsWUlcfj>a|5SO1-CXNPl_!u4mFG9{+OyFUG@|wbkp1;&2&leC zgB-#v6t;Z^;b|Nao?M|GJ45SgT`>9nSc)Q8H(YFLCMHF5I!rn0PB(;|3sSX^wS@zl z%DbfedJqgJG0`Saj8lf0M4<=TA)o|-ol;NeZ$Ft3Iw3wibHF#3d?c>(R;ieuAnQJljz;#(V}|9Fso4Ay_(=vX$L8pFyQmg9z@MoXzplOW;H zSjz)g7^H^B7vhA5!;&Cm{CkKhyZC~-jW-Uuzw zcguK~8NX9-dKQKnXo@-5l|nBfZ^Mq`ee^ai`DJL#3P5q5AL}O6Y@PBnI)R2TyZj_> zeWnAn4tWSVD~f9i$R1d^N1(M@w4)O3tSEv64;%FD|5MSh>-lsbWGJqBkYyGhBZ~N`$?TG6vF1LK>R0u(~a^*mBjOLVs7Vf~wMY6vck>kW|0Dk8oI_g193!%9OrPLf3 zY{fJL;f)NAm`d-0;P9gB5Jq-*Ed!?=gKO~3aEy^c-PA5{RDHD?6NoPalC@kKNyksM zE`B%OQ!JAjM|<$D=RPS6S|(MG_O6!vJP?c;qxjWBl3!Pos^1Y*lW6rWoTP!8;`;6W zrBE-1;v0vtJUhQy9n0GhJ@+&o(|td+1q=ZL*d;xQE`ebYBLO1`4_qHP5uaWxdjH8q z9Jb6b2d@S^8#ar6#vUq-+B(CEg1SFknvTbrk}w)^V(06aoQy`HV$u9QZxpzeQjQhv z5d-kEl5qL8nz_erBM z;2DF{2URt4$$u$iNHL@jQcU7D7JZ3@`Vd{3A#EQ^ar>l4KrS#2!UrIodLBJ(m zBTk^hxg1e6D4d`6y(A<3k-UIJ#o#eszvhqB3n&uZu~+zU(A;m%#Ia+XWPU6H zg(S)?zU=-fJbg#ob2PR*v0i;pn{lBHOcp&38uQbl$3bgy$n_BehhVY1N@q8G@^g4Tp&{Z%%1>eOvk@Ar zCQn2sN_~_sfbQudo-kgBz|&Af+JoL=h9H9u?S$M|Zi?j2V@^R)ROu*QwI;S4VDoRz zmQy;2iy)c-&n|6|YjZsGFEDb}7X{FnW$O+7Yq>er9H^mxjZQCc9W5PRnOZ+a&IqJ7 zZ$=wFDz`wG1#7r1H#Fi%LV7Jg5`2CST1rdx<8(Cly0P+$p>I| zATo(#!6It`xfP=De1J?aAFV-}n97#(xMBg%a+?s()H@26-w3iSw+*rkqg%2rlc0V) zq;{Z7q@OA<#SH0-_B3LrV6F~=>Zb!&JkUTjg*mkJa|Lo`4JsK!BOOBTK2W&K07Zv6BiV&=eNY!3y&0NtWT-)SlV$#CVxbZ=va*O3x+3^db~R_mM`}eIg`*rgt>L@ zKIsW)-kDXimmHQoJx6p7qg+Ww0sLzL9y0ga zax4g0SXS`_z82u*h~EUy(|D-w3I0&uGr`q>!KLZ|UI{bNHXET53gljp-9!wBNi~{b z(lH8eZe~HuMxwVPs0~}O&vGdCM4|A4B6khv9zG-Gg7Y4Ixya!LZ@C|46%o+qXK>1c ztbp?H2-*P9Gh?#zCQi>HwLoY+OGGFPMJPlBl2S;=eJPQK*nE_Ym7DvdE@YSrpv7Wn zJxI>JCHWz@E_4@I>gFwx-nLLkvq>2dxrtbk!rbr`EJr5pm7b+RG0x-%urB#<05_f| zZk>ngx++d9dRK->e7jv~3d{6nQnHc_YyPIV?=XiiO3@0jf?j9{azaZ{890dl9lpso z49$d=qJk^LfXT!0i!$P%d%G1m={E8&1o9zC3DAPQ;23u=3xO;T3M3YJbg8ObcS@ug zEmtFRbIdrr#6^N6@vKlcVM|m~La11x3Jt#~%Hv{50mOULSRpjvk@&e!ojPU`H2hk$ zM_OEuJP^Gl@CU~PpJA!Mg%t>l&}rmVR_IfpRLB9Fw#F zmiwa+W`~3|j6tcxS#^DFzFZ!w zOWk(7Aq%M!az$0e3CrWSQloLr`bbQ11XRDg03Y z_0cp}nA8O{sX+H_;=P291ZtvcF))|0moiCIEhZMiOw2*1gmqA_ON9x=K}6t25z3&D zY>}h{bLikppVY1#I5c|_)Wlu`(I$f{jIc3}5P}|y3b8>5_~0%u0?V#qR#!EpVPPr7 zhEj^M67V&W zLN*kNENzviu|~2z6<2Ap&t-d*N!o^x$vkAX9Rrmjrq~%p3zZ6zJ|13##^tDowu+OLG_b(_QGqNy>ns!~RXN!3PJr#`{Q+_@)JKHW0;ifwkU_BwO&fI_1`QxuJH`fg zX{Dwnf2;CIbbEB3Ry3v7C>Hul+9$n$G0v*pQeMJ7iNX8gZVBtktKnO-TWU+14zoXY ze5)EgYCe7_@&fE1Nf^P?12}7?^=QKz@V(JO23sEK{X9R$?F`R_*fGx;Avdwuu?Ize zWF;lOSBr1C6qo#@2C|8JXKzz?`F!M^@RI-g%^1Uw>%@Gq_Gq^J zUupyP!xyTje8oX^i$lc7`&8{^72X%VP%Td3-EdlcTsJC;KdX+77NHCNQvcAcj^^A_ z<8*}8chq6M1;X8Y*DO`s`#x)sE7mN$tA@E+M+$^*r@F>w32%p2T^CetRCH`wgU?%` zKW-Hfb}RVyT`q6=s2#4JdV+g)yLRZ7NfY+Cn#OXgsEmtu_?iW`*aW(z1UtI5aOmnC-7yjj1W)`9GcU&KN zIE&q9c5VJ}GVY5{=2z#x<8+rKbHHamo*n!?2KDb-=xN1OPPc_6XS?Is(F1sA@{79e z{rdTy=Nq|u$B2wy=P@Wy-K4KAtJaB@0R=n_@T;Rrop|dG7*B83W9KyS9h5J95f`exc zxCgt0_diG7W1Iq^?>FxCkvvl`7X7}!iA*^yD}A3vvEtrZIy+O-X)kYg$*o%4R7{h` z?MbhZDoHg`g?ZcAT#t)g>#aG;pZ?vQnJS3yiS|@;3-7n7o?rYn;%UR)?pxWS5>F;O z(bnTEznAN|Z4(UK>FDXwPjwv!2DeOcgBmtW6Nbb@dHTeZAyT z-t@ew@{;>Gw{u)`h<tPLFG9pvL#?-=1ZbOpNlikY2T;P$iiLo{Fch4J2-W)5D=;{F)wge9Sq zi!wyk%&rd6JmqmyyiZYd@426d5a6Y$d5Sv(`hk1lAzUXD|PBju-Dda3jVO zbG<9Xt@;O6YUg2}CLME1rKSK za_?Dhx}MYn=e*rrBB@1Jy!j5n%l9|EJ#+@@%f7@2(e8Vge0ZLLtAILA-(Z{YJ`?FH z^zt;fr#$y1mg=!h%pY;(h2q)iO=fqaJ)ZLBX}%GMObjx>Ub^7RcCCVM^%%Mi5~EV~ z;{{(+(?kL$T=d1qMS=B6qaJNg&`nmNV5bI6FU=xoKA_E->CkDT4G2`=yc^Iz+@T*{ z>2jL~+4_sVYW(#LwjWeX3qgfFx7=Kf-MZ-0co{IyC11R9ErO-Ako}qAiIePJ)9MZ# z2(clT8=@^qr6n~@JjTkR$Yi$pQjpjIBKD1)gI3sL*^(=`2F|$x@E^GXoYkrtEB?!;CX?pa^HsH^J?MqWwKZ_q>>-`n zl%XftwT>i_YiL04F*1nmVuP;&o$|kb^u&^$en}!%U_kdQ73j;K^Q}CK zqmPwYxpo!29xV%jS?)DG@kPmB#aU4W@DubuR=4cB~;NtCseN1yMWg@Pw% zEd1W=^J~8DTw$=3>qzeO=fU`KZ2EOyqyQ}@(C(8#P?Di~DTQ6?{-F~=ot!a+Wv7F& z;#jxeeUZHIo^Q~xZaau2xd#mV5BMpF9?RbT9hFMd*{8o#tz8tLtV_`>@eiNg%Vz!o z(6(Cys>i1P;foT&xP*dl+~dJ3^X^w;XRo53sV08D(0N}G*d*7^kapw7tk+GSpY3QO z*J8^W%N9d6xdu+HQSnQrB#|>#x~WAdZWQa$Lbh-gd1gPT5x4L%DvDf|A;IROd8CyE zMUgDwuV7{y{sq>jjSYeP}%;sFGCPNO~LQH!h=`2Wfx1j>C=*^BxUuWAT{%%h{2L?A&bPp>JBeY9083>u7Lsd z_cKJiE?agB%o5cL*PYu^Aui;Ms^MjJ@RqL^N9sQzEwHGSB#~=jpqIw7Zu>fm5}AD) zC1S~BQ||c^{)_u_d!B06O~GSsaE%NkazzaG!&oJfx$fvnWkA8ZSGNF{Tw??NH}!c6 z%-aB0cYjl%i+*Qq<7VcA=7y_p!2hzLz(0sf;@J_<7u=q`L-p4#1T(ROyMR%du!eU5 z`?-4z*%# z7pwW$+vne|AxY$nWM;FXd%gz*Gu!X^;v;4S@S?h`#bt(de8lSJp{s`WLJ^TOYRm12 zG37}movklc>@4p->YMb8(^56Q8fCnDffM?QV41B%wIQA4jFMo9eBlGFHtQA{;o|7LP{*Cx)E-7SWQc5tzsS(^wgrf&E!h0-3kvzlChG9;G~jDYXb zl6aOEp|ubU&WQknyBcv4Y&(94;A0egDo+GgL}V7*dxOVZ;p=r~qmcZGZFDpJlOmapFuP+i5iWWyW1-qQ3BWAF)dvO@dy)44Y z+?Ic+gy;}UR0-#nvxn?jtU(PD$>sr5qdCX`Ib(@MJ;!6PVJjj$Y%@|2rELC=kwej7VhTtii~|1naO?z^?A}`dH`OAnZGWoq1Kj zJg=iF5^OcB?ltd z%cZ6`mbE`3nN>KnSRNrZFl>4Sm?hW75Fz&C$_R1J9uG|%HL~qPQy-o@lF5JjB6;NG z4I7f9+hZ04XB>7+KUx_%mW_5ICnc1V*-jMQ_g|72X!@xEB5A!pR>QLph7 z*p5vm7rXzO$;Q@r^hkU2>)sxNZl0V`B=){8BAsw+Nu2(*afu(E059Z>J?!Ln1?uvy zW*f`)Am==H`5xr%nSBIHVFwQ)*~#zeX$yocgz)2m5Q3ZC^J!`l$&4~PCOXQ*Z73_bh*DU?7%dsC z#B3M+IB!)Djd(@%2$Y#!F?1MC~imynXF$_kn!;p+^>-cE}8~G*cYWmalzU4{i$c1=p)D(2iv`}!|yxn`Bc4qe^gMS*{Ix7op}uSU7AjYYXrBJ7P=6mZ76 z5Wy7YjY9ztY-yuuGuvXEL(Z71^RI^RZOl9n_|!80SbD2fA1srR>uF$M=Krx2KgMwl zj+&#`RnX^?FeSF&hlVr(gELOUb6B!p>na3ek{=9y^s7kF`v{od{u@5_`-77686n)c zpl9)-Sz|qNp@yirpUZmtlW$PnQqvVY9 zvuP5WQXQlbGlAm^s>c&RwRWt4Wwiw@Y870PZZ2A!@C$e&XPl@tj}!PC+MxM!e5%Oe z;yDA?$4e49<4}I0U*KO$u;880bc=-@OVn$Bc#3KJJJ3DkjOzydn}j0S*aJ;14&GS^ zacWZyTn}m!LU6N1)q-vLWrEEp6tMkW%}zFa5K`nifXm{2LRdG55NfcN)wO7z+pT$< z>S4E@toy1|;^Tt}wJq1|@BPa?cMHb2#LDO zAcZY|%;I7PMuC}(E0_jwg*1f_%;N;Y#z`iXT^(n!vAsEZh4y&9=TqJN*hPmkc5w$L zhDAz9Mv5ehtYI<;4q7N+!!Kcw+WKjvI4e2W6c+(O?!h)CYssQ8k08J_XR!sBXuoVt zV%8Lp;ssSL1%Ma^z|LKGuI~~9W7MQ;5cH$Ixw-98&E#-jWazK7md5E7ir~%VSo@VzN2tIIx5P7hLoj7UnuvImJOl>8EjVD3~W>)=6 zIum3rViG+CKw_8wzk)J`-c!haz^c-jwf{Sye``T0y4(1pv>k>v8wDE5uh@Bd{RNf zkD&d@)d|%L$>^t31>ZTfH1V!58&XS)kNEdYD|_y5tG{0OG>Itv-k{sRSGpyMT(*Id zI!i=hI|5ceJ5gKHQYb>yy$b2^4fJK0D#IS=m=!&6h$u*(DHul^Hwn)POp14b1@!A(D z=;O&56%QVr&Z?&+vh8*CA;G`b5AZ+PUXsWeD{)S22-U+T`Be*huniO&(ck&ucZp9z zi;^>T%iRZ4q^4|MCgwQ2pw?xgiqjt!!N(8Vee8awEk%7IaATm7I;`;@}JdW(nq#S`Ov_RaH_*#N+-0~}b3O>PiODL~=A z4|#ZXhDXIM>|h9Zf`AJoJ5^ousziG{OU%+Dd7ehS{qfhYV2Vu6SRlX1A^apZFDocF zYqCJ=2U7?Z&n8(>!ZfaBVCJYJ-D=iJgrixjn5tr1w?-J=p1&GW_Cet!I|I%^?Yma-)juEx$59z>rjeX z+~ND|X>9v^yOTYerI%*E&g&D8gC%ku4Y86|gvUDmqTRt}v<&k0U=#4rdvzs7CRpV7NeL+0Dzo76NYWOE7le?L?L9c&N9B%Q%N15kOy z!*({qxMp%Q&CIU(99}V!;0O(y0byiR2%$zY1xHPPZ|>CE*fWHyWys+eKcP0^Sp7ch z|NJP7m&q9iQq|fLRty{70g2Vk#x#tme)YusmJZY-IpcEE(T-vG^RsomKrhA*#yp9f zu^CjK#2U7M7ARVW+ctlg;;^u}Ep?q_cp~1w`sdR`q~MG38fU8VhT5tUdt*Q0XN!WI z&;sSO_B4g~*~S|V8{6Chs*RW72L!AAa~SMCV4V7qL9ZTvCPk9S8MV{W%VGF^XeLRt z=&IWrC{A+5@%kVS^W|w#?CerU9Q&)CPMyzoU+`5tl@sNagjl zRU7y7)xsi?e&cGsL%Y34pF|VQ|T*kLVsSL{vAtbW1 zk2|%n_OO%?hIR-;I5FSpVv`1f%w<%kXwmlwYt9IPwJ{4-stQCOD!QSY+&l_2>&h&9SN#s9b#}1ah+6R(kgDpO1MeLx#x0 zr5Z@xU;@8rxx>zu5%qPl9-a_X=&d9R)bHcC2PPf)2D0B4w zp4$>7i5!G9^jBJP`%6M?zzJTuJMq9BR6jXmQ~&iEVMVc|bX7wqqT1NfykOP5lm`wo z{|ZM45@cyd{hOc%$QgCPbPM~uofgZ6`SHRw4K+kHk8cB757#GH0z24Fb+PSjv`Efe zU2WJ$F6any#?kiS#$ou5w&-)HbXZDT&`N2c!@8?(HX18*0ydjqU*?A5`B#lcTC{>E z;8zJgqg@D|%sRHyOTF?|FzjoD3X+B*zjYA!!7IWd*0 zM~V~IQbVV|$h9-1wH#AD;%$f36)((eIKi$RLC|?jz_Px@4QZ=7 z21{`(!5;rH1ans=Cb;o+0>Y&8I^kPttT0m`!tRZdblin1)Oh=J~n$?k{$37vSX7`Abct2$ehjn1DY zeK&up)l7+$aC>0YrnRuUh_Ld+ae!4Fg=0$Q(Z3R?}7v< zdx5^)N_S!wFgUE?-Jt)vLa>gbP3A;u`Vc; z%^NF$QS8cYkhJ}c9bF>%_SeJy_!G-dxs`I`>h&|Ry+%c#;8wra(G`8UT+WzK;Zlu&tAn#WdMn0hRZHO$xAa;*4wzZ&O7 ziIX#y&io|8N@L~u!SX(qkM?n@DLdC4U0FrG-s{cnvV3(R%9fl_1I4u_)Mz&M3wRu7PQx1E4(90`lvLm}Ar1oL(fFqqsXvwA(D>8MO94RWhaEYo_1@Z%UvbcImy z?2Yl=A3qyIW^%?Q)>*wnkxXpcSa&SDLMc&mGr!xge=96Tk~8*XT?$2{WhMnHF9kaO zPuKsf_y+PyE-fUtq=P@1#-cZTMs+D!?h2WW6SxRpjP<-T0V(WV8ok3iq1DRVLb> zA)?jDR$16%Ge;lfWwXLQ=!f8}TW%BE8s~{-gZt!ZaeGbRbpr5BM_y?%PZzPD^%ZYwl)az?S+`MAI@27{cf;Ux=; z1}9*`0cWhUHggEIF&F+n@1Ag6K#h_!GJp0(K@e8fCf1@q)Gb#a1^vOdwk8CN726I3 ztF+Iq+K@in6vDT&+x@Y^P53Y0-7sQ4+7CIDUFfg0r0Y%{e}GnbF0C*>|i}lE@kJJ@iXLt%hqLAtpRC2?LQC`zZ>>QHnoNOLOsv;nWaVtEHv9Rdt0=7vgTdRLwt~Xh!BCHs*e7#sgX6FmN6uJ>T{;nJ z8oLR;1ceDhK%s0P1xJ&OeKirhpMp;gW#@)MGhV|F(Ve@8B6#{Z3XWyRUPY0Uei1Xh zaRmEdJi*f0n?o@_q0+9jsIS_k4VX%(Ekxw%!w`AmToHNslU^$uJ1ofJT!IZP7A!7b ziDEiF4E4+_=M2FbJ|ke>;d%kIUVnVoM0B9!j8(jGNr;R$td7?Y2bsQm1&plp8Lag6 zSt?KG9wEGQG=#v7^hMQ&oPe zYa_Eyg(4-h&#r)r)@1I%m&baJ02jx8(Gf;ywM8LprQoD1Jb0DcXTdh7&&jTgfb3B( zGI++JGylBI+xmJiP7OBTVU#ytE1&o<$i?3jsSJ{$jQyEjfvHBmF + + diff --git a/settings/repository/net.sf/sam-1.58.1057.xml b/settings/repository/net.sf/sam-1.58.1057.xml deleted file mode 100644 index 4f0dfe44e..000000000 --- a/settings/repository/net.sf/sam-1.58.1057.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/settings/repository/net.sf/sam-1.58.1057.jar b/settings/repository/net.sf/sam-1.59.1066.jar similarity index 96% rename from settings/repository/net.sf/sam-1.58.1057.jar rename to settings/repository/net.sf/sam-1.59.1066.jar index 804e21b6165869fa1dff4e622ddf3e7dac8f0f7c..8380da8644ecd4d4480b1c47276c4c91d99985d4 100644 GIT binary patch delta 8787 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 delta 8765 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 diff --git a/settings/repository/net.sf/sam-1.59.1066.xml b/settings/repository/net.sf/sam-1.59.1066.xml new file mode 100644 index 000000000..75a327daa --- /dev/null +++ b/settings/repository/net.sf/sam-1.59.1066.xml @@ -0,0 +1,3 @@ + + +