GenomicAlignments/DESCRIPTION0000644000175400017540000000412513203700454016711 0ustar00biocbuildbiocbuildPackage: GenomicAlignments Title: Representation and manipulation of short genomic alignments Description: Provides efficient containers for storing and manipulating short genomic alignments (typically obtained by aligning short reads to a reference genome). This includes read counting, computing the coverage, junction detection, and working with the nucleotide content of the alignments. Version: 1.14.1 Encoding: UTF-8 Author: Hervé Pagès, Valerie Obenchain, Martin Morgan Maintainer: Bioconductor Package Maintainer biocViews: Genetics, Infrastructure, DataImport, Sequencing, RNASeq, SNP, Coverage, Alignment Depends: R (>= 2.10), methods, BiocGenerics (>= 0.15.3), S4Vectors (>= 0.13.13), IRanges (>= 2.11.16), GenomeInfoDb (>= 1.13.1), GenomicRanges (>= 1.29.14), SummarizedExperiment (>= 1.5.3), Biostrings (>= 2.37.1), Rsamtools (>= 1.21.4) Imports: methods, utils, stats, BiocGenerics, S4Vectors, IRanges, GenomicRanges, Biostrings, Rsamtools, BiocParallel LinkingTo: S4Vectors, IRanges Suggests: ShortRead, rtracklayer, BSgenome, GenomicFeatures, RNAseqData.HNRNPC.bam.chr14, pasillaBamSubset, TxDb.Hsapiens.UCSC.hg19.knownGene, TxDb.Dmelanogaster.UCSC.dm3.ensGene, BSgenome.Dmelanogaster.UCSC.dm3, BSgenome.Hsapiens.UCSC.hg19, DESeq2, edgeR, RUnit, BiocStyle License: Artistic-2.0 Collate: utils.R cigar-utils.R GAlignments-class.R GAlignmentPairs-class.R GAlignmentsList-class.R GappedReads-class.R OverlapEncodings-class.R findMateAlignment.R readGAlignments.R junctions-methods.R sequenceLayer.R pileLettersAt.R stackStringsFromBam.R intra-range-methods.R coverage-methods.R setops-methods.R findOverlaps-methods.R coordinate-mapping-methods.R encodeOverlaps-methods.R findCompatibleOverlaps-methods.R summarizeOverlaps-methods.R findSpliceOverlaps-methods.R zzz.R Video: https://www.youtube.com/watch?v=2KqBSbkfhRo , https://www.youtube.com/watch?v=3PK_jx44QTs NeedsCompilation: yes Packaged: 2017-11-18 00:39:08 UTC; biocbuild GenomicAlignments/NAMESPACE0000644000175400017540000001146713175714431016441 0ustar00biocbuildbiocbuilduseDynLib(GenomicAlignments) import(methods) importFrom(utils, read.table) importFrom(stats, setNames) import(BiocGenerics) import(S4Vectors) import(IRanges) import(GenomeInfoDb) import(GenomicRanges) import(SummarizedExperiment) import(Biostrings) import(Rsamtools) importFrom(BiocParallel, bplapply) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export S4 classes ### exportClasses( GAlignments, GAlignmentPairs, GAlignmentsList, GappedReads, OverlapEncodings ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export S3 methods ### S3method(as.data.frame, OverlapEncodings) S3method(levels, OverlapEncodings) ### We also export them thru the export() directive so that (a) they can be ### called directly, (b) tab-completion on the name of the generic shows them, ### and (c) methods() doesn't asterisk them. export( as.data.frame.OverlapEncodings, levels.OverlapEncodings ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export S4 methods for generics not defined in GenomicAlignments ### exportMethods( c, ## Generics defined in BiocGenerics: is.unsorted, order, sort, rank, start, end, width, strand, invertStrand, ## Generics defined in S4Vectors: parallelSlotNames, pcompare, ## Generics defined in IRanges: ranges, rglist, relistToClass, narrow, coverage, pintersect, findOverlaps, ## Generics defined in GenomeInfoDb: seqinfo, "seqinfo<-", seqnames, "seqnames<-", seqlevelsInUse, ## Generics defined in GenomicRanges: granges, grglist, ## Generics defined in Biostrings: encoding, ## Generics defined in S4Vectors: first, second ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export non-generic functions ### export( validCigar, CIGAR_OPS, explodeCigarOps, explodeCigarOpLengths, cigarToRleList, cigarRangesAlongReferenceSpace, cigarRangesAlongQuerySpace, cigarRangesAlongPairwiseSpace, extractAlignmentRangesOnReference, cigarWidthAlongReferenceSpace, cigarWidthAlongQuerySpace, cigarWidthAlongPairwiseSpace, cigarNarrow, cigarQNarrow, cigarOpTable, queryLoc2refLoc, queryLocs2refLocs, GAlignments, GAlignmentPairs, GAlignmentsList, GappedReads, Lencoding, Rencoding, Lnjunc, Rnjunc, findMateAlignment, makeGAlignmentPairs, getDumpedAlignments, countDumpedAlignments, flushDumpedAlignments, readGAlignments, readGAlignmentPairs, readGAlignmentsList, readGappedReads, NATURAL_INTRON_MOTIFS, summarizeJunctions, readTopHatJunctions, readSTARJunctions, sequenceLayer, pileLettersAt, stackStringsFromBam, alphabetFrequencyFromBam, encodeOverlaps1, flipQuery, selectEncodingWithCompatibleStrand, extractQueryStartInTranscript, countCompatibleOverlaps, Union, IntersectionNotEmpty, IntersectionStrict ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export S4 generics defined in GenomicAlignments + export corresponding ### methods ### export( ## GAlignments-class.R: rname, "rname<-", cigar, qwidth, njunc, ## GAlignmentPairs-class.R: last, strandMode, "strandMode<-", isProperPair, ## GappedReads-class.R: qseq, ## OverlapEncodings-class.R: Loffset, Roffset, flippedQuery, encodingHalves, isCompatibleWithSplicing, ## readGAlignments.R: readGAlignments, readGAlignmentPairs, readGAlignmentsList, readGappedReads, ## junctions-methods.R: junctions, ## intra-range-methods.R: qnarrow, ## encodeOverlaps-methods.R: encodeOverlaps, isCompatibleWithSkippedExons, extractSteppedExonRanks, extractSpannedExonRanks, extractSkippedExonRanks, ## findCompatibleOverlaps-methods.R: findCompatibleOverlaps, ## summarizeOverlaps-methods.R: summarizeOverlaps, ## findSpliceOverlaps-methods.R: findSpliceOverlaps, ## coordinateMapping-methods.R: mapToAlignments, pmapToAlignments, mapFromAlignments, pmapFromAlignments ) ### Exactly the same list as above. exportMethods( rname, "rname<-", cigar, qwidth, njunc, first, last, strandMode, "strandMode<-", isProperPair, qseq, Loffset, Roffset, flippedQuery, encodingHalves, isCompatibleWithSplicing, readGAlignments, readGAlignmentPairs, readGAlignmentsList, readGappedReads, junctions, qnarrow, encodeOverlaps, isCompatibleWithSkippedExons, extractSteppedExonRanks, extractSpannedExonRanks, extractSkippedExonRanks, findCompatibleOverlaps, summarizeOverlaps, findSpliceOverlaps, mapToAlignments, pmapToAlignments, mapFromAlignments, pmapFromAlignments ) GenomicAlignments/NEWS0000644000175400017540000002333513175714431015716 0ustar00biocbuildbiocbuildCHANGES IN VERSION 1.14.0 ------------------------- SIGNIFICANT USER-LEVEL CHANGES o makeGAlignmentPairs() no more drops pairs with discordant seqnames. o Change 'maxgap' and 'minoverlap' argument defaults in methods of the findOverlaps() so they adhere to the new argument defaults of the generic defined in IRanges 2.12.0. See NEWS file in the IRanges package for more information about this change. DEPRECATED AND DEFUNCT o Remove 'force' argument from seqinfo() and seqlevels() setters (the argument got deprecated in BioC 3.5 in favor of new and more flexible 'pruning.mode' argument). BUG FIXES o Fix bug in pairing code of readGAlignmentPairs() when one mate in a pair is lost because of user-supplied filtering (e.g. mapqFilter=10). CHANGES IN VERSION 1.12.0 ------------------------- NEW FEATURES o seqlevels() setter now supports "fine" and "tidy" pruning modes on GAlignmentsList objects (in addition to "coarse" mode, which is the default). o Add "pcompare", "is.unsorted", "order", "sort", and "rank" methods for GAlignments objects. o Add encodingHalves(), a low-level overlap encoding utility. SIGNIFICANT USER-LEVEL CHANGES o Tweak behavior of isCompatibleWithSplicing() on paired-end encodings. o Minor tweaks to low-level encoding utilities Lencoding(), Rencoding(), Lnjunc(), Rnjunc(), and njunc(). All of them now are based on new encodingHalves() low level utility. o Speed up first() and last() on GAlignmentPairs object when the object has no names. Thanks to Pete Hickey for the suggestion. o 2x to 3x speedup to "junctions" methods. DEPRECATED AND DEFUNCT o Argument 'force' of seqinfo() and seqlevels() setters is deprecated in favor of new and more flexible 'pruning.mode' argument. BUG FIXES o Make grglist() work on GAlignmentPairs object with strandMode set to 0. Thanks to Dario Strbenac for catching and reporting this. o Fix bug affecting extractSteppedExonRanks() on certain paired-end encodings. o Fix subsetting of OverlapEncodings objects and modernize their "show" method. CHANGES IN VERSION 1.10.0 ------------------------- NEW FEATURES o The GAlignmentPairs container now supports pairs with discordant strand and/or seqnames. The "granges" and "ranges" methods for GAlignmentPairs objects get new argument 'on.discordant.seqnames' to let the user control how to handle pairs with discordant seqnames. See ?GAlignmentPairs for more information. o Add "invertStrand" method for GAlignmentPairs objects. o Add 'use.names' argument to the "ranges", "granges", "grglist" and "rglist" methods for GAlignments and GAlignmentsList objects. o Add 'use.names' argument to the "granges" and "grglist" methods for GAlignmentPairs objects. o Add "ranges" method for GAlignmentPairs objects. SIGNIFICANT USER-LEVEL CHANGES o The 'at' argument of pileLettersAt() is now expected to be a GPos object (GRanges still accepted). o 50x speed-up of the granges() extractor for GAlignmentPairs object. The improvement is based on a suggestion by Arne Muller. DEPRECATED AND DEFUNCT o Remove left() and right() generics and methods (were defunct in BioC 3.3). o Remove 'invert.strand' argument from "first" and "last" methods for GAlignmentPairs objects (was defunct in BioC 3.3). o Remove strand() setter for GAlignmentPairs objects (was defunct in BioC 3.3). o Remove 'order.as.in.query' argument from "grglist" method for GAlignmentPairs objects and from "grglist" and "rglist" methods for GAlignmentsList objects (was defunct in BioC 3.3). BUG FIXES o Fix 'use.names=FALSE' in "grglist" and "rglist" methods for GAlignmentsList objects. CHANGES IN VERSION 1.8.0 ------------------------ NEW FEATURES o Add coercion from GAlignments or GAlignmentPairs to DataFrame, and from GAlignmentsList to GAlignmentPairs. SIGNIFICANT USER-LEVEL CHANGES o Use DESeq2 instead of DESeq in summarizeOverlaps examples (better late than never). DEPRECATED AND DEFUNCT o After being deprecated in BioC 3.2, the left() and right() getters and strand() setter for GAlignmentPairs objects are now defunct. o After being deprecated in BioC 3.2, the 'invert.strand' argument of the first() and last() getters for GAlignmentPairs objects are now defunct. o After being deprecated in BioC 3.2, the 'order.as.in.query' argument of the "grglist" method for GAlignmentPairs objects is now defunct. o After being deprecated in BioC 3.2, the 'order.as.in.query' argument of the "rglist" and "grglist" methods for GAlignmentsList objects are now defunct. o Remove the "mapCoords" and "pmapCoords" methods (were defunct in BioC 3.2). o Remove the readGAlignment*FromBam() functions (were defunct in BioC 3.2). BUG FIXES o seqnames() setter for GAlignments objects is now consistent with seqnames() setter for GRanges objects. CHANGES IN VERSION 1.6.0 ------------------------ NEW FEATURES o Add strandMode() getter and setter for GAlignmentPairs objects in response to the following post: https://support.bioconductor.org/p/65844/ See ?strandMode for more information. o The readGAlignment*() functions now allow repeated seqnames in the BAM header. o Add "coverage" method for GAlignmentsList objects. o The strand setter now works on a GAlignmentsList object in a restricted way (only strand(x) <- "+" or "-" or "*" is supported). SIGNIFICANT USER-LEVEL CHANGES o summarizeOverlaps() now returns a RangedSummarizedExperiment object (defined in the new SummarizedExperiment package) instead of an "old" SummarizedExperiment object (defined in the GenomicRanges package). o Slightly modify the behavior of junctions() on a GAlignmentPairs object so that the returned ranges now have the "real strand" set on them. See ?junctions and the documentation of the 'real.strand' argument in the man page of GAlignmentPairs objects for more information. o Add 'real.strand' argument to first() and last() getters for GAlignmentPairs objects. DEPRECATED AND DEFUNCT o Deprecate left() and right() getters and strand() setter for GAlignmentPairs objects. o Deprecate 'invert.strand' argument of first() and last() getters for GAlignmentPairs objects. o Deprecate 'order.as.in.query' argument of "grglist" method for GAlignmentPairs objects. o Deprecate 'order.as.in.query' argument in "rglist" method for GAlignmentsList objects (this concept is not defined for these objects in general and the argument was ignored anyway). o After being deprecated in BioC 3.1, the "mapCoords" and "pmapCoords" methods are now defunct. mapToAlignments() should be used instead. o After being deprecated in BioC 3.1, the readGAlignment*FromBam() functions are now defunct. Everybody says "Let's all use the readGAlignment*() functions instead! (no FromBam suffix). Yeah!" BUG FIXES o Various fixes to grglist/granges/rglist/ranges methods for GAlignmentsList objects: - Respect cigar information (as claimed in man page). - Restore 'drop.D.ranges' argument in "grglist" method (mistakenly got deprecated at the beginning of BioC 3.2 devel cycle). - The 'drop.D.ranges' argument in "rglist" method now works (was ignored). - Handle empty list elements. CHANGES IN VERSION 1.4.0 ------------------------ NEW FEATURES o All "findOverlaps" methods now support 'select' equal "last" or "arbitrary" (in addition to "all" and "first"). SIGNIFICANT USER-LEVEL CHANGES o Add mapToAlignments(), pmapToAlignments(), mapFromAlignments(), and pmapFromAlignments() as replacements for the "mapCoords" and "pmapCoords" methods for GAlignments objects. o Clarify use of 'fragments' in summarizeOverlaps() man page. o Tweak "show" method for GAlignments objects to display a shorter version of long CIGARs. o Add checks and more helpful error message for summarizeOverlaps() when "file does not exist" DEPRECATED AND DEFUNCT o Deprecated readGAlignment*FromBam() functions in favor of readGAlignments(), readGAlignmentPairs(), readGAlignmentsList() and readGappedReads(). o Deprecated "mapCoords" and "pmapCoords" methods. o Removed Lngap(), Rngap(), introns(), and makeGAlignmentsListFromFeatureFragments() functions, and "ngap", "map", "pmap", and "splitAsListReturnedClass" methods (were defunct in GenomicAlignments 1.2.0). BUG FIXES o Fix off-by-one error when processing 'S' in query_locs_to_ref_locs(). CHANGES IN VERSION 1.2.0 ------------------------ NEW FEATURES o Add 'preprocess.reads' argument to "summarizeOverlaps" methods. o Add alphabetFrequencyFromBam(). SIGNIFICANT USER-LEVEL CHANGES o Export GappedReads() constructor. o coverage,Bamfile-method now returns empty RleList rather than NULL o Add "mapCoords" and "pmapCoords" methods. o Defunct "map" and "pmap" methods (skip deprecation). BUG FIXES o Bug fix in flipQuery(). o Fix issue with "show" method for GAlignments and GAlignmentPairs objects when 'showHeadLines' global option is set to Inf. CHANGES IN VERSION 1.0.0 ------------------------ The first version of GenomicAlignments was included in Bioconductor 2.14. The package was created from existing code in IRanges, ShortRead, Rsamtools and GenomicRanges. NEW FEATURES o coverage,BamFile-method uses \code{yieldSize} to iterate through large files o coverage,character-method calculates coverage from a BAM file GenomicAlignments/R/0000755000175400017540000000000013203656426015413 5ustar00biocbuildbiocbuildGenomicAlignments/R/GAlignmentPairs-class.R0000644000175400017540000007423513175714431021677 0ustar00biocbuildbiocbuild### ========================================================================= ### GAlignmentPairs objects ### ------------------------------------------------------------------------- ### ### TODO: Implement a GAlignmentsList class (CompressedList subclass) ### and derive GAlignmentPairs from it. ### "first" and "last" GAlignments must have identical seqinfo. setClass("GAlignmentPairs", contains="List", representation( strandMode="integer", # single integer (0L, 1L, or 2L) NAMES="character_OR_NULL", # R doesn't like @names !! first="GAlignments", # of length N, no names, no elt metadata last="GAlignments", # of length N, no names, no elt metadata isProperPair="logical", # of length N elementMetadata="DataFrame" # N rows ), prototype( strandMode=1L, elementType="GAlignments" ) ) ### Formal API: ### strandMode(x) - indicates how to infer the strand of a pair from the ### strand of the first and last alignments in the pair: ### 0: strand of the pair is always *; ### 1: strand of the pair is strand of its first alignment; ### 2: strand of the pair is strand of its last alignment. ### These modes are equivalent to 'strandSpecific' equal 0, 1, ### and 2, respectively, for the featureCounts() function ### defined in the Rsubread package. ### length(x) - single integer N. Nb of pairs in 'x'. ### names(x) - NULL or character vector. ### first(x) - returns "first" slot. ### last(x) - returns "last" slot. ### seqnames(x) - same as 'seqnames(first(x))' or 'seqnames(last(x))'. ### strand(x) - obeys strandMode(x) (see above). ### njunc(x) - same as 'njunc(first(x)) + njunc(last(x))'. ### isProperPair(x) - returns "isProperPair" slot. ### seqinfo(x) - returns 'seqinfo(first(x))' (same as 'seqinfo(last(x))'). ### granges(x) - GRanges object of the same length as 'x'. ### grglist(x) - GRangesList object of the same length as 'x'. ### show(x) - compact display in a data.frame-like fashion. ### GAlignmentPairs(x) - constructor. ### x[i] - GAlignmentPairs object of the same class as 'x' ### (endomorphism). ### setGeneric("strandMode", function(x) standardGeneric("strandMode")) setGeneric("strandMode<-", signature="x", function(x, value) standardGeneric("strandMode<-") ) setGeneric("isProperPair", function(x) standardGeneric("isProperPair")) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Getters. ### setMethod("strandMode", "GAlignmentPairs", function(x) x@strandMode ) setMethod("length", "GAlignmentPairs", function(x) length(x@first) ) setMethod("names", "GAlignmentPairs", function(x) x@NAMES ) .make_it_real <- function(strand, strand_mode) { if (strand_mode == 0L) return(Rle(strand("*"), length(strand))) invertStrand(strand) } .first_strand <- function(x, real.strand=FALSE) { if (!isTRUEorFALSE(real.strand)) stop("'real.strand' must be TRUE or FALSE") ans <- strand(x@first) if (real.strand && strandMode(x) != 1L) ans <- .make_it_real(ans, strandMode(x)) ans } .last_strand <- function(x, real.strand=FALSE) { if (!isTRUEorFALSE(real.strand)) stop("'real.strand' must be TRUE or FALSE") ans <- strand(x@last) if (real.strand && strandMode(x) != 2L) ans <- .make_it_real(ans, strandMode(x)) ans } setMethod("first", "GAlignmentPairs", function(x, real.strand=FALSE) { if (!isTRUEorFALSE(real.strand)) stop("'real.strand' must be TRUE or FALSE") ans <- x@first x_names <- names(x) if (!is.null(x_names)) ans <- setNames(ans, x_names) if (real.strand && strandMode(x) != 1L) strand(ans) <- .first_strand(x, real.strand=TRUE) ans } ) setGeneric("last", function(x, ...) standardGeneric("last")) setMethod("last", "GAlignmentPairs", function(x, ...) second(x, ...)) setMethod("second", "GAlignmentPairs", function(x, real.strand=FALSE) { if (!isTRUEorFALSE(real.strand)) stop("'real.strand' must be TRUE or FALSE") ans <- x@last x_names <- names(x) if (!is.null(x_names)) ans <- setNames(ans, x_names) if (real.strand && strandMode(x) != 2L) strand(ans) <- .last_strand(x, real.strand=TRUE) ans } ) setMethod("seqnames", "GAlignmentPairs", function(x) { ans <- seqnames(x@first) ans[seqnames(x@last) != ans] <- NA ans } ) setMethod("strand", "GAlignmentPairs", function(x) { ans <- .first_strand(x, real.strand=TRUE) x_last_strand <- .last_strand(x, real.strand=TRUE) ans[ans != x_last_strand] <- "*" ans } ) setMethod("njunc", "GAlignmentPairs", function(x) {njunc(x@first) + njunc(x@last)} ) setMethod("isProperPair", "GAlignmentPairs", function(x) x@isProperPair ) setMethod("seqinfo", "GAlignmentPairs", function(x) seqinfo(x@first) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Setters. ### .normarg_strandMode_replace_value <- function(value) { if (!isSingleNumber(value)) stop("invalid strand mode (must be 0, 1, or 2)") if (!is.integer(value)) value <- as.integer(value) if (!(value %in% 0:2)) stop("invalid strand mode (must be 0, 1, or 2)") value } setReplaceMethod("strandMode", "GAlignmentPairs", function(x, value) { x@strandMode <- .normarg_strandMode_replace_value(value) x } ) setMethod("invertStrand", "GAlignmentPairs", function(x) { strand_mode <- strandMode(x) if (strand_mode != 0L) strandMode(x) <- 3L - strand_mode x } ) setReplaceMethod("names", "GAlignmentPairs", function(x, value) { if (!is.null(value)) value <- as.character(value) x@NAMES <- value validObject(x) x } ) setMethod("seqlevelsInUse", "GAlignmentPairs", function(x) { in_use1 <- seqlevelsInUse(x@first) in_use2 <- seqlevelsInUse(x@last) ## We cannot just do union() because we want the returned levels ## to be in the order they appear in 'seqlevels(x)'. intersect(seqlevels(x), union(in_use1, in_use2)) } ) setReplaceMethod("seqinfo", "GAlignmentPairs", function(x, new2old=NULL, pruning.mode=c("error", "coarse", "fine", "tidy"), value) { if (!is(value, "Seqinfo")) stop("the supplied 'seqinfo' must be a Seqinfo object") dangling_seqlevels <- GenomeInfoDb:::getDanglingSeqlevels(x, new2old=new2old, pruning.mode=pruning.mode, seqlevels(value)) if (length(dangling_seqlevels) != 0L) { dropme_in_first <- seqnames(x@first) %in% dangling_seqlevels dropme_in_last <- seqnames(x@last) %in% dangling_seqlevels dropme <- dropme_in_first | dropme_in_last x <- x[!dropme] } seqinfo(x@first, new2old=new2old) <- value seqinfo(x@last, new2old=new2old) <- value x } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.GAlignmentPairs.strandMode <- function(x) { if (!(isSingleInteger(x@strandMode) && x@strandMode %in% 0:2)) return("'x@strandMode' must be 0L, 1L, or 2L") NULL } .valid.GAlignmentPairs.names <- function(x) { x_names <- names(x) if (is.null(x_names)) return(NULL) if (!is.character(x_names) || !is.null(attributes(x_names))) { msg <- c("'names(x)' must be NULL or a character vector ", "with no attributes") return(paste(msg, collapse="")) } if (length(x_names) != length(x)) return("'names(x)' and 'x' must have the same length") NULL } .valid.GAlignmentPairs.first <- function(x) { x_first <- x@first if (class(x_first) != "GAlignments") return("'x@first' must be a GAlignments instance") NULL } .valid.GAlignmentPairs.last <- function(x) { x_last <- x@last if (class(x_last) != "GAlignments") return("'x@last' must be a GAlignments instance") x_first <- x@first if (length(x_last) != length(x_first)) return("'x@last' and 'x@first' must have the same length") if (!identical(seqinfo(x_last), seqinfo(x_first))) return("'seqinfo(x@last)' and 'seqinfo(x@first)' must be identical") NULL } .valid.GAlignmentPairs.isProperPair <- function(x) { x_isProperPair <- x@isProperPair if (!is.logical(x_isProperPair) || !is.null(attributes(x_isProperPair))) { msg <- c("'x@isProperPair' must be a logical vector ", "with no attributes") return(paste(msg, collapse="")) } if (length(x_isProperPair) != length(x)) return("'x@isProperPair' and 'x' must have the same length") if (S4Vectors:::anyMissing(x_isProperPair)) return("'x@isProperPair' cannot contain NAs") NULL } .valid.GAlignmentPairs <- function(x) { c(.valid.GAlignmentPairs.strandMode(x), .valid.GAlignmentPairs.names(x), .valid.GAlignmentPairs.first(x), .valid.GAlignmentPairs.last(x), .valid.GAlignmentPairs.isProperPair(x)) } setValidity2("GAlignmentPairs", .valid.GAlignmentPairs, where=asNamespace("GenomicAlignments")) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructor. ### GAlignmentPairs <- function(first, last, strandMode=1L, isProperPair=TRUE, names=NULL) { if (!(is(first, "GAlignments") && is(last, "GAlignments"))) stop("'first' and 'last' must be GAlignments objects") if (length(first) != length(last)) stop("'first' and 'last' must have the same length") strandMode <- .normarg_strandMode_replace_value(strandMode) if (identical(isProperPair, TRUE)) isProperPair <- rep.int(isProperPair, length(first)) new2("GAlignmentPairs", strandMode=strandMode, NAMES=names, first=first, last=last, isProperPair=isProperPair, elementMetadata=S4Vectors:::make_zero_col_DataFrame(length(first)), check=TRUE) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Vector methods. ### setMethod("extractROWS", "GAlignmentPairs", function(x, i) { i <- normalizeSingleBracketSubscript(i, x, as.NSBS=TRUE) ans_NAMES <- extractROWS(x@NAMES, i) ans_first <- extractROWS(x@first, i) ans_last <- extractROWS(x@last, i) ans_isProperPair <- extractROWS(x@isProperPair, i) ans_elementMetadata <- extractROWS(x@elementMetadata, i) BiocGenerics:::replaceSlots(x, NAMES=ans_NAMES, first=ans_first, last=ans_last, isProperPair=ans_isProperPair, elementMetadata=ans_elementMetadata) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### List methods. ### ### TODO: Remove the "[[" method below after the definition of the ### GAlignmentPairs class is changed to derive from CompressedList. ### (The "[[" method for CompressedList objects should do just fine i.e. it ### should do something like x@unlistData[x@partitioning[[i]]] and that ### should be optimal.) .GAlignmentPairs.getElement <- function(x, i) { c(x@first[i], x@last[i]) } setMethod("[[", "GAlignmentPairs", function(x, i, j, ... , drop=TRUE) { if (missing(i) || !missing(j) || length(list(...)) > 0L) stop("invalid subsetting") i <- normalizeDoubleBracketSubscript(i, x) .GAlignmentPairs.getElement(x, i) } ) ### TODO: Remove this method after the definition of the GAlignmentPairs ### class is changed to derive from CompressedList. setMethod("unlist", "GAlignmentPairs", function(x, recursive=TRUE, use.names=TRUE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") x_first <- x@first x_last <- x@last collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(length(x)) ans <- c(x_first, x_last)[collate_subscript] if (use.names) names(ans) <- rep(names(x), each=2L) ans } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### ### 'caller' must be "ranges" or "granges". .error_on_discordant_seqnames <- function(caller) { if (caller == "ranges") { range_type <- "range" returned_object <- "IRanges" a_returned_object <- "an IRanges" alternate_caller <- "rglist" alternate_returned_object <- "an IRangesList" } else { range_type <- "genomic range" returned_object <- "GRanges" a_returned_object <- "a GRanges" alternate_caller <- "grglist" alternate_returned_object <- "a GRangesList" } wmsg( "For some pairs in 'x', the 2 alignments are not on the same ", "chromosome. Cannot associate a unique ", range_type, " to ", "such pairs. Please call ", caller, "() with ", "'on.discordant.seqnames=\"drop\"' to drop these pairs, ", "or with 'on.discordant.seqnames=\"split\"' to represent ", "each of them with 2 ", range_type, "s in the returned ", returned_object, " object. Note that in both cases the returned ", "object won't be parallel to 'x'. Alternatively, please ", "consider using ", alternate_caller, "() instead of ", caller, "() ", "to turn 'x' into ", alternate_returned_object, " object instead of ", a_returned_object, " object. See ?GAlignmentPairs for more ", "information." ) } .make_split_IRanges_from_GAlignmentPairs <- function(x, use.names=TRUE, use.mcols=FALSE) { x_first_ranges <- ranges(x@first, use.names=FALSE) x_last_ranges <- ranges(x@last, use.names=FALSE) x_len <- length(x) collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(x_len) partitioning <- PartitioningByEnd(2L * seq_len(x_len)) range_pairs <- relist(c(x_first_ranges, x_last_ranges)[collate_subscript], partitioning) x_first_seqnames <- seqnames(x@first) x_last_seqnames <- seqnames(x@last) merge_idx <- x_first_seqnames == x_last_seqnames range_pairs[merge_idx] <- range(range_pairs[merge_idx]) if (use.names) names(range_pairs) <- names(x) ans <- unlist(range_pairs, use.names=use.names) if (use.mcols) { i <- rep.int(seq_len(x_len), elementNROWS(range_pairs)) mcols(ans) <- extractROWS(mcols(x), i) } ans } setMethod("ranges", "GAlignmentPairs", function(x, use.names=TRUE, use.mcols=FALSE, on.discordant.seqnames=c("error", "drop", "split")) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") on.discordant.seqnames <- match.arg(on.discordant.seqnames) ans_seqnames <- seqnames(x) is_discordant <- is.na(ans_seqnames) if (any(is_discordant)) { if (on.discordant.seqnames == "error") stop(.error_on_discordant_seqnames("ranges")) if (on.discordant.seqnames == "split") return(.make_split_IRanges_from_GAlignmentPairs(x, use.names=use.names, use.mcols=use.mcols)) ## on.discordant.seqnames == "drop" x <- x[!is_discordant] } x_first_ranges <- ranges(x@first, use.names=FALSE) x_last_ranges <- ranges(x@last, use.names=FALSE) ans <- punion(x_first_ranges, x_last_ranges, fill.gap=TRUE) if (use.names) names(ans) <- names(x) if (use.mcols) mcols(ans) <- mcols(x) ans } ) .make_split_GRanges_from_GAlignmentPairs <- function(x, use.names=TRUE, use.mcols=FALSE) { x_first_seqnames <- seqnames(x@first) x_last_seqnames <- seqnames(x@last) is_discordant <- x_first_seqnames != x_last_seqnames ndiscordant <- sum(is_discordant) collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(ndiscordant) partitioning <- PartitioningByEnd(2L * seq_len(ndiscordant)) seqnames1 <- x_first_seqnames[is_discordant] seqnames2 <- x_last_seqnames[is_discordant] discordant_seqnames <- relist(c(seqnames1, seqnames2)[collate_subscript], partitioning) ans_seqnames <- as(x_first_seqnames, "List") ans_seqnames[is_discordant] <- discordant_seqnames ans_ranges <- .make_split_IRanges_from_GAlignmentPairs(x, use.names=use.names, use.mcols=use.mcols) strand1 <- .first_strand(x, real.strand=TRUE)[is_discordant] strand2 <- .last_strand(x, real.strand=TRUE)[is_discordant] discordant_strand <- relist(c(strand1, strand2)[collate_subscript], partitioning) ans_strand <- as(strand(x), "List") ans_strand[is_discordant] <- discordant_strand GRanges(unlist(ans_seqnames, use.names=FALSE), ans_ranges, unlist(ans_strand, use.names=FALSE), seqinfo=seqinfo(x)) } setMethod("granges", "GAlignmentPairs", function(x, use.names=TRUE, use.mcols=FALSE, on.discordant.seqnames=c("error", "drop", "split")) { if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") on.discordant.seqnames <- match.arg(on.discordant.seqnames) ans_seqnames <- seqnames(x) is_discordant <- is.na(ans_seqnames) if (any(is_discordant)) { if (on.discordant.seqnames == "error") stop(.error_on_discordant_seqnames("granges")) if (on.discordant.seqnames == "split") return(.make_split_GRanges_from_GAlignmentPairs(x, use.names=use.names, use.mcols=use.mcols)) ## on.discordant.seqnames == "drop" x <- x[!is_discordant] ans_seqnames <- seqnames(x) } ans <- GRanges(ans_seqnames, ranges(x, use.names=use.names), strand(x), seqinfo=seqinfo(x)) if (use.mcols) mcols(ans) <- mcols(x) ans } ) ### Shrink CompressedList 'x' (typically a GRangesList) by half by combining ### pairs of consecutive top-level elements. shrinkByHalf <- function(x) { if (length(x) %% 2L != 0L) stop("'x' must have an even length") x_eltNROWS <- elementNROWS(x) if (length(x_eltNROWS) == 0L) { ans_nelt1 <- ans_nelt2 <- integer(0) } else { ans_nelt1 <- x_eltNROWS[c(TRUE, FALSE)] ans_nelt2 <- x_eltNROWS[c(FALSE, TRUE)] } ans_eltNROWS <- ans_nelt1 + ans_nelt2 ans_partitioning <- PartitioningByEnd(cumsum(ans_eltNROWS)) ans <- relist(x@unlistData, ans_partitioning) mcols(ans) <- DataFrame(nelt1=ans_nelt1, nelt2=ans_nelt2) ans } setMethod("grglist", "GAlignmentPairs", function(x, use.names=TRUE, use.mcols=FALSE, drop.D.ranges=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") x_mcols <- mcols(x) if (use.mcols && "query.break" %in% colnames(x_mcols)) stop("'mcols(x)' cannot have reserved column \"query.break\"") x_first <- x@first x_last <- x@last if (strandMode(x) == 0L) { x_first <- unstrand(x_first) x_last <- unstrand(x_last) x_unlisted <- c(x_first, x_last) } else if (strandMode(x) == 1L) { x_last <- invertStrand(x@last) x_unlisted <- c(x_first, x_last) } else if (strandMode(x) == 2L) { x_first <- invertStrand(x@first) x_unlisted <- c(x_last, x_first) } else { ## Should never happen. stop("unsupported strandMode: ", strandMode(x)) } ## Not the same as doing 'unlist(x, use.names=FALSE)'. collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(length(x)) x_unlisted <- x_unlisted[collate_subscript] grl <- grglist(x_unlisted, order.as.in.query=TRUE, drop.D.ranges=drop.D.ranges) ans <- shrinkByHalf(grl) if (use.names) names(ans) <- names(x) ans_mcols <- DataFrame(query.break=mcols(ans)$nelt1) if (use.mcols) ans_mcols <- cbind(ans_mcols, x_mcols) mcols(ans) <- ans_mcols ans } ) setAs("GAlignmentPairs", "Ranges", function(from) ranges(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentPairs", "GRanges", function(from) granges(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentPairs", "GRangesList", function(from) grglist(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentPairs", "GAlignments", function(from) unlist(from, use.names=TRUE) ) setAs("GAlignmentPairs", "DataFrame", function(from) { firstDF <- as(first(from), "DataFrame") colnames(firstDF) <- paste0(colnames(firstDF), ".first") lastDF <- as(last(from), "DataFrame") colnames(lastDF) <- paste0(colnames(lastDF), ".last") DataFrame(firstDF, lastDF, mcols(from)) }) setMethod("as.data.frame", "GAlignmentPairs", function(x, row.names = NULL, optional = FALSE) { as.data.frame(as(x, "DataFrame"), row.names=row.names, optional=optional) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### fillJunctionGaps() ### ### Not exported. Used in the SplicingGraphs package. ### fillJunctionGaps <- function(x) { if (!is(x, "GRangesList")) stop("'x' must be a GRangesList object") query.breaks <- mcols(x)$query.break if (is.null(query.breaks)) stop("'x' must be a GRangesList object with a \"query.breaks\" ", "metadata column") offsets <- end(x@partitioning) if (length(x) != 0L) offsets <- c(0L, offsets[-length(offsets)]) idx <- S4Vectors:::fancy_mseq(query.breaks, offsets) half1_partitioning <- PartitioningByEnd(cumsum(query.breaks)) half1 <- relist(x@unlistData[idx], half1_partitioning) half1 <- range(half1)@unlistData half2_eltNROWS <- elementNROWS(x) - query.breaks half2_partitioning <- PartitioningByEnd(cumsum(half2_eltNROWS)) half2 <- relist(x@unlistData[-idx], half2_partitioning) half2 <- range(half2)@unlistData collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(length(x)) ans_unlistData <- c(half1, half2)[collate_subscript] ans_partitioning <- PartitioningByEnd(2L * seq_along(x), names=names(x)) relist(ans_unlistData, ans_partitioning) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### "show" method. ### .makeNakedMatFromGAlignmentPairs <- function(x) { lx <- length(x) nc <- ncol(mcols(x)) pair_cols <- cbind(seqnames=as.character(seqnames(x)), strand=as.character(strand(x))) x_first <- x@first first_cols <- cbind(ranges=showAsCell(ranges(x_first))) x_last <- x@last last_cols <- cbind(ranges=showAsCell(ranges(x_last))) ans <- cbind(pair_cols, `:`=rep.int(":", lx), first_cols, `--`=rep.int("--", lx), last_cols) if (nc > 0L) { tmp <- do.call(data.frame, lapply(mcols(x), showAsCell)) ans <- cbind(ans, `|`=rep.int("|", lx), as.matrix(tmp)) } ans } showGAlignmentPairs <- function(x, margin="", print.classinfo=FALSE, print.seqinfo=FALSE) { lx <- length(x) nc <- ncol(mcols(x)) cat(class(x), " object with ", lx, " ", ifelse(lx == 1L, "pair", "pairs"), ", strandMode=", strandMode(x), ", and ", nc, " metadata ", ifelse(nc == 1L, "column", "columns"), ":\n", sep="") out <- S4Vectors:::makePrettyMatrixForCompactPrinting(x, .makeNakedMatFromGAlignmentPairs) if (print.classinfo) { .PAIR_COL2CLASS <- c( seqnames="Rle", strand="Rle" ) .HALVES_COL2CLASS <- c( ranges="IRanges" ) .COL2CLASS <- c(.PAIR_COL2CLASS, ":", .HALVES_COL2CLASS, "--", .HALVES_COL2CLASS) classinfo <- S4Vectors:::makeClassinfoRowForCompactPrinting(x, .COL2CLASS) ## A sanity check, but this should never happen! stopifnot(identical(colnames(classinfo), colnames(out))) out <- rbind(classinfo, out) } if (nrow(out) != 0L) rownames(out) <- paste0(margin, rownames(out)) ## We set 'max' to 'length(out)' to avoid the getOption("max.print") ## limit that would typically be reached when 'showHeadLines' global ## option is set to Inf. print(out, quote=FALSE, right=TRUE, max=length(out)) if (print.seqinfo) { cat(margin, "-------\n", sep="") cat(margin, "seqinfo: ", summary(seqinfo(x)), "\n", sep="") } } setMethod("show", "GAlignmentPairs", function(object) showGAlignmentPairs(object, margin=" ", print.classinfo=TRUE, print.seqinfo=TRUE) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Combining. ### ### 'Class' must be "GAlignmentPairs" or the name of a concrete subclass of ### GAlignmentPairs. ### 'objects' must be a list of GAlignmentPairs objects. ### Returns an instance of class 'Class'. combine_GAlignmentPairs_objects <- function(Class, objects, use.names=TRUE, ignore.mcols=FALSE) { if (!isSingleString(Class)) stop("'Class' must be a single character string") if (!extends(Class, "GAlignmentPairs")) stop("'Class' must be the name of a class that extends GAlignmentPairs") if (!is.list(objects)) stop("'objects' must be a list") if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") ### TODO: Support 'use.names=TRUE'. if (use.names) stop("'use.names=TRUE' is not supported yet") if (!isTRUEorFALSE(ignore.mcols)) stop("'ignore.mcols' must be TRUE or FALSE") if (length(objects) != 0L) { ## TODO: Implement (in C) fast 'elementIsNull(objects)' in IRanges, ## that does 'sapply(objects, is.null, USE.NAMES=FALSE)', and use it ## here. null_idx <- which(sapply(objects, is.null, USE.NAMES=FALSE)) if (length(null_idx) != 0L) objects <- objects[-null_idx] } if (length(objects) == 0L) return(new(Class)) ## TODO: Implement (in C) fast 'elementIs(objects, class)' in IRanges, that ## does 'sapply(objects, is, class, USE.NAMES=FALSE)', and use it here. ## 'elementIs(objects, "NULL")' should work and be equivalent to ## 'elementIsNull(objects)'. if (!all(sapply(objects, is, Class, USE.NAMES=FALSE))) stop("the objects to combine must be ", Class, " objects (or NULLs)") objects_names <- names(objects) names(objects) <- NULL # so lapply(objects, ...) below returns an # unnamed list ## Combine "NAMES" slots. NAMES_slots <- lapply(objects, function(x) x@NAMES) ## TODO: Use elementIsNull() here when it becomes available. has_no_names <- sapply(NAMES_slots, is.null, USE.NAMES=FALSE) if (all(has_no_names)) { ans_NAMES <- NULL } else { noname_idx <- which(has_no_names) if (length(noname_idx) != 0L) NAMES_slots[noname_idx] <- lapply(elementNROWS(objects[noname_idx]), character) ans_NAMES <- unlist(NAMES_slots, use.names=FALSE) } ## Combine "first" slots. first_slots <- lapply(objects, function(x) x@first) ans_first <- combine_GAlignments_objects("GAlignments", first_slots, use.names=FALSE, ignore.mcols=ignore.mcols) ## Combine "last" slots. last_slots <- lapply(objects, function(x) x@last) ans_last <- combine_GAlignments_objects("GAlignments", last_slots, use.names=FALSE, ignore.mcols=ignore.mcols) ## Combine "isProperPair" slots. isProperPair_slots <- lapply(objects, function(x) x@isProperPair) ans_isProperPair <- unlist(isProperPair_slots, use.names=FALSE) ## Combine "mcols" slots. We don't need to use fancy ## IRanges:::rbind.mcols() for this because the "mcols" slot of a ## GAlignmentPairs object is guaranteed to be a DataFrame. if (ignore.mcols) { ans_mcols <- S4Vectors:::make_zero_col_DataFrame(length(ans_first)) } else { mcols_slots <- lapply(objects, function(x) x@elementMetadata) ## Will fail if not all the GAlignmentPairs objects in 'objects' have ## exactly the same metadata cols. ans_mcols <- do.call(rbind, mcols_slots) } ## Make 'ans' and return it. new(Class, NAMES=ans_NAMES, first=ans_first, last=ans_last, isProperPair=ans_isProperPair, elementMetadata=ans_mcols) } setMethod("c", "GAlignmentPairs", function(x, ..., ignore.mcols=FALSE, recursive=FALSE) { if (!identical(recursive, FALSE)) stop("\"c\" method for GAlignmentPairs objects ", "does not support the 'recursive' argument") if (missing(x)) { objects <- list(...) x <- objects[[1L]] } else { objects <- list(x, ...) } combine_GAlignmentPairs_objects(class(x), objects, use.names=FALSE, ignore.mcols=ignore.mcols) } ) GenomicAlignments/R/GAlignments-class.R0000644000175400017540000006313413175714431021057 0ustar00biocbuildbiocbuild### ========================================================================= ### GAlignments objects ### ------------------------------------------------------------------------- ### setClass("GAlignments", contains="Vector", representation( NAMES="character_OR_NULL", # R doesn't like @names !! seqnames="Rle", # 'factor' Rle start="integer", # POS field in SAM cigar="character", # extended CIGAR (see SAM format specs) strand="Rle", # 'factor' Rle #mismatches="character_OR_NULL", # see MD optional field in SAM format #specs elementMetadata="DataFrame", seqinfo="Seqinfo" ), prototype( seqnames=Rle(factor()), strand=Rle(strand()) ) ) ### Formal API: ### names(x) - NULL or character vector. ### length(x) - single integer. Nb of alignments in 'x'. ### seqnames(x) - 'factor' Rle of the same length as 'x'. ### rname(x) - same as 'seqnames(x)'. ### seqnames(x) <- value - replacement form of 'seqnames(x)'. ### rname(x) <- value - same as 'seqnames(x) <- value'. ### cigar(x) - character vector of the same length as 'x'. ### strand(x) - 'factor' Rle of the same length as 'x' (levels: +, -, *). ### qwidth(x) - integer vector of the same length as 'x'. ### start(x), end(x), width(x) - integer vectors of the same length as 'x'. ### njunc(x) - integer vector of the same length as 'x'. ### grglist(x) - GRangesList object of the same length as 'x'. ### granges(x) - GRanges object of the same length as 'x'. ### rglist(x) - CompressedIRangesList object of the same length as 'x'. ### ranges(x) - IRanges object of the same length as 'x'. ### as.data.frame(x) - data.frame with 1 row per alignment in 'x'. ### show(x) - compact display in a data.frame-like fashion. ### GAlignments(x) - constructor. ### x[i] - GAlignments object of the same class as 'x' (endomorphism). ### ### qnarrow(x, start=NA, end=NA, width=NA) - GAlignments object of the ### same length and class as 'x' (endomorphism). ### ### narrow(x, start=NA, end=NA, width=NA) - GAlignments object of the ### same length and class as 'x' (endomorphism). ### ### findOverlaps(query, subject) - 'query' or 'subject' or both are ### GAlignments objects. Just a convenient wrapper for ### 'findOverlaps(grglist(query), subject, ...)', etc... ### ### countOverlaps(query, subject) - 'query' or 'subject' or both are ### GAlignments objects. Just a convenient wrapper for ### 'countOverlaps(grglist(query), subject, ...)', etc... ### ### subsetByOverlaps(query, subject) - 'query' or 'subject' or both are ### GAlignments objects. ### setGeneric("rname", function(x) standardGeneric("rname")) setGeneric("rname<-", function(x, value) standardGeneric("rname<-")) setGeneric("cigar", function(x) standardGeneric("cigar")) setGeneric("qwidth", function(x) standardGeneric("qwidth")) setGeneric("njunc", function(x) standardGeneric("njunc")) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Getters. ### setMethod("length", "GAlignments", function(x) length(x@cigar)) setMethod("names", "GAlignments", function(x) x@NAMES) setMethod("seqnames", "GAlignments", function(x) x@seqnames) setMethod("rname", "GAlignments", function(x) seqnames(x)) setMethod("cigar", "GAlignments", function(x) x@cigar) setMethod("width", "GAlignments", function(x) cigarWidthAlongReferenceSpace(x@cigar) ) setMethod("start", "GAlignments", function(x, ...) x@start) setMethod("end", "GAlignments", function(x, ...) {x@start + width(x) - 1L}) setMethod("strand", "GAlignments", function(x) x@strand) setMethod("qwidth", "GAlignments", function(x) cigarWidthAlongQuerySpace(x@cigar) ) setMethod("njunc", "GAlignments", function(x) {unname(elementNROWS(rglist(x))) - 1L} ) setMethod("seqinfo", "GAlignments", function(x) x@seqinfo) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Setters. ### setReplaceMethod("names", "GAlignments", function(x, value) { if (!is.null(value)) value <- as.character(value) x@NAMES <- value validObject(x) x } ) setReplaceMethod("seqnames", "GAlignments", function(x, value) { value <- GenomicRanges:::.normalize_seqnames_replacement_value(value, x) BiocGenerics:::replaceSlots(x, seqnames=value) } ) setReplaceMethod("rname", "GAlignments", function(x, value) `seqnames<-`(x, value) ) setReplaceMethod("strand", "GAlignments", function(x, value) { x@strand <- GenomicRanges:::normalize_strand_replacement_value(value, x) x } ) ### Does NOT suppoprt pruning mode "fine". Pruning modes "coarse" and "tidy" ### are equivalent on a GAlignments object. ### FIXME: This repeats most of the code in ### GenomicRanges:::set_GenomicRanges_seqinfo! set_GAlignments_seqinfo <- function(x, new2old=NULL, pruning.mode=c("error", "coarse", "fine", "tidy"), value) { pruning.mode <- match.arg(pruning.mode) if (pruning.mode == "fine") stop(wmsg("\"fine\" pruning mode not supported on ", class(x), " objects")) if (!is(value, "Seqinfo")) stop("the supplied 'seqinfo' must be a Seqinfo object") dangling_seqlevels <- GenomeInfoDb:::getDanglingSeqlevels(x, new2old=new2old, pruning.mode=pruning.mode, seqlevels(value)) if (length(dangling_seqlevels) != 0L) { ## Prune 'x'. non_dangling_range <- !(seqnames(x) %in% dangling_seqlevels) x <- x[non_dangling_range] } old_seqinfo <- seqinfo(x) x@seqnames <- GenomeInfoDb:::makeNewSeqnames(x, new2old, seqlevels(value)) x@seqinfo <- value geom_has_changed <- GenomeInfoDb:::sequenceGeometryHasChanged( seqinfo(x), old_seqinfo, new2old=new2old) if (any(geom_has_changed, na.rm=TRUE)) validObject(x) x } setReplaceMethod("seqinfo", "GAlignments", set_GAlignments_seqinfo) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.GAlignments.names <- function(x) { x_names <- names(x) if (is.null(x_names)) return(NULL) if (!is.character(x_names) || !is.null(attributes(x_names))) { msg <- c("'names(x)' must be NULL or a character vector ", "with no attributes") return(paste(msg, collapse="")) } if (length(x_names) != length(x)) return("'names(x)' and 'x' must have the same length") NULL } .valid.GAlignments.seqnames <- function(x) { if (length(seqnames(x)) != length(cigar(x))) return("'seqnames(x)' and 'cigar(x)' must have the same length") NULL } .valid.GAlignments.start <- function(x) { x_start <- start(x) if (!is.integer(x_start) || !is.null(names(x_start)) || S4Vectors:::anyMissing(x_start)) return("'start(x)' must be an unnamed integer vector with no NAs") if (length(x_start) != length(cigar(x))) return("'start(x)' and 'cigar(x)' must have the same length") NULL } .valid.GAlignments.cigar <- function(x) { x_cigar <- cigar(x) if (!is.character(x_cigar) || !is.null(names(x_cigar)) || any(is.na(x_cigar))) return("'cigar(x)' must be an unnamed character vector with no NAs") tmp <- validCigar(x_cigar) if (!is.null(tmp)) return(paste("in 'cigar(x)':", tmp)) NULL } .valid.GAlignments.strand <- function(x) { x_strand <- strand(x) if (!is(x_strand, "Rle") || !is.factor(runValue(x_strand)) || !identical(levels(runValue(x_strand)), levels(strand())) || !is.null(names(x_strand)) || any(is.na(x_strand))) return("'strand(x)' must be an unnamed 'factor' Rle with no NAs (and with levels +, - and *)") if (length(x_strand) != length(cigar(x))) return("'strand(x)' and 'cigar(x)' must have the same length") NULL } .valid.GAlignments <- function(x) { c(.valid.GAlignments.names(x), GenomicRanges:::.valid.GenomicRanges.seqnames(x), .valid.GAlignments.seqnames(x), .valid.GAlignments.start(x), .valid.GAlignments.cigar(x), .valid.GAlignments.strand(x), GenomicRanges:::valid.GenomicRanges.seqinfo(x)) } setValidity2("GAlignments", .valid.GAlignments, where=asNamespace("GenomicAlignments")) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructor. ### .asFactorRle <- function(x) { if (is.character(x)) { x <- Rle(as.factor(x)) } else if (is.factor(x)) { x <- Rle(x) } else if (is(x, "Rle") && is.character(runValue(x))) { runValue(x) <- as.factor(runValue(x)) } else if (!is(x, "Rle") || !is.factor(runValue(x))) { stop("'x' must be a character vector, a factor, ", "a 'character' Rle, or a 'factor' Rle") } x } GAlignments <- function(seqnames=Rle(factor()), pos=integer(0), cigar=character(0), strand=NULL, names=NULL, seqlengths=NULL, ...) { ## Prepare the 'seqnames' slot. seqnames <- .asFactorRle(seqnames) if (any(is.na(seqnames))) stop("'seqnames' cannot have NAs") ## Prepare the 'pos' slot. if (!is.integer(pos) || any(is.na(pos))) stop("'pos' must be an integer vector with no NAs") ## Prepare the 'cigar' slot. if (!is.character(cigar) || any(is.na(cigar))) stop("'cigar' must be a character vector with no NAs") ## Prepare the 'strand' slot. if (is.null(strand)) { if (length(seqnames) != 0L) stop("'strand' must be specified when 'seqnames' is not empty") strand <- Rle(strand()) } else if (is.factor(strand)) { strand <- Rle(strand) } ## Prepare the 'elementMetadata' slot. varlist <- list(...) elementMetadata <- if (0L == length(varlist)) S4Vectors:::make_zero_col_DataFrame(length(seqnames)) else do.call(DataFrame, varlist) ## Prepare the 'seqinfo' slot. if (is.null(seqlengths)) { seqlengths <- rep(NA_integer_, length(levels(seqnames))) names(seqlengths) <- levels(seqnames) } else if (!is.numeric(seqlengths) || is.null(names(seqlengths)) || any(duplicated(names(seqlengths)))) { stop("'seqlengths' must be an integer vector with unique names") } else if (!setequal(names(seqlengths), levels(seqnames))) { stop("'names(seqlengths)' incompatible with 'levels(seqnames)'") } else if (!is.integer(seqlengths)) { storage.mode(seqlengths) <- "integer" } seqinfo <- Seqinfo(seqnames=names(seqlengths), seqlengths=seqlengths) ## Create and return the GAlignments instance. new("GAlignments", NAMES=names, seqnames=seqnames, start=pos, cigar=cigar, strand=strand, elementMetadata=elementMetadata, seqinfo=seqinfo) } setMethod("updateObject", "GAlignments", function(object, ..., verbose=FALSE) { if (verbose) message("updateObject(object = 'GAlignments')") if (is(try(object@NAMES, silent=TRUE), "try-error")) { object@NAMES <- NULL return(object) } if (is(try(validObject(object@seqinfo, complete=TRUE), silent=TRUE), "try-error")) { object@seqinfo <- updateObject(object@seqinfo) return(object) } object } ) setMethod("update", "GAlignments", function(object, ...) { BiocGenerics:::replaceSlots(object, ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Internal helper function used by higher level coercion functions. ### ### NOT exported. ### ### Names are propagated via 'x@partitioning' ('x' is a CompressedIRangesList). make_GRangesList_from_CompressedIRangesList <- function(x, seqnames, strand, seqinfo) { x_eltNROWS <- elementNROWS(x) seqnames <- rep.int(seqnames, x_eltNROWS) strand <- rep.int(strand, x_eltNROWS) unlisted_ans <- GRanges(seqnames=seqnames, ranges=x@unlistData, strand=strand) seqinfo(unlisted_ans) <- seqinfo ans <- relist(unlisted_ans, x) mcols(ans) <- mcols(x) ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### setMethod("ranges", "GAlignments", function(x, use.names=TRUE, use.mcols=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") if (use.names) { ans_names <- names(x) } else { ans_names <- NULL } ans <- IRanges(start=start(x), width=width(x), names=ans_names) if (use.mcols) mcols(ans) <- mcols(x) ans } ) setMethod("granges", "GAlignments", function(x, use.names=TRUE, use.mcols=FALSE) { if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") ans <- GRanges(seqnames(x), ranges(x, use.names=use.names), strand(x), seqinfo=seqinfo(x)) if (use.mcols) mcols(ans) <- mcols(x) ans } ) setMethod("grglist", "GAlignments", function(x, use.names=TRUE, use.mcols=FALSE, order.as.in.query=FALSE, drop.D.ranges=FALSE) { rgl <- rglist(x, use.names=use.names, use.mcols=use.mcols, order.as.in.query=order.as.in.query, drop.D.ranges=drop.D.ranges) make_GRangesList_from_CompressedIRangesList(rgl, seqnames(x), strand(x), seqinfo(x)) } ) setMethod("rglist", "GAlignments", function(x, use.names=TRUE, use.mcols=FALSE, order.as.in.query=FALSE, drop.D.ranges=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") if (!isTRUEorFALSE(order.as.in.query)) stop("'order.as.in.query' must be TRUE or FALSE") ans <- extractAlignmentRangesOnReference(x@cigar, x@start, drop.D.ranges=drop.D.ranges) if (order.as.in.query) ans <- revElements(ans, strand(x) == "-") if (use.names) names(ans) <- names(x) if (use.mcols) mcols(ans) <- mcols(x) ans } ) setAs("GAlignments", "Ranges", function(from) ranges(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignments", "GRanges", function(from) granges(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignments", "GRangesList", function(from) grglist(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignments", "RangesList", function(from) rglist(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignments", "DataFrame", function(from) { DataFrame(seqnames=seqnames(from), strand=strand(from), cigar=cigar(from), qwidth=qwidth(from), start=start(from), end=end(from), width=width(from), njunc=njunc(from), mcols(from), row.names=names(from), check.names=FALSE) }) setMethod("as.data.frame", "GAlignments", function(x, row.names=NULL, optional=FALSE, ...) { as.data.frame(as(x, "DataFrame"), row.names=row.names, optional=optional) } ) setAs("GenomicRanges", "GAlignments", function(from) { ga <- GAlignments(seqnames(from), start(from), if (!is.null(mcols(from)[["cigar"]])) mcols(from)[["cigar"]] else paste0(width(from), "M"), strand(from), if (!is.null(names(from))) names(from) else mcols(from)$name, seqlengths(from), mcols(from)[setdiff(colnames(mcols(from)), c("cigar", "name"))]) metadata(ga) <- metadata(from) seqinfo(ga) <- seqinfo(from) ga }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Subsetting. ### setMethod("extractROWS", "GAlignments", function(x, i) { i <- normalizeSingleBracketSubscript(i, x, as.NSBS=TRUE) ans_NAMES <- extractROWS(x@NAMES, i) ans_seqnames <- extractROWS(x@seqnames, i) ans_start <- extractROWS(x@start, i) ans_cigar <- extractROWS(x@cigar, i) ans_strand <- extractROWS(x@strand, i) ans_elementMetadata <- extractROWS(x@elementMetadata, i) BiocGenerics:::replaceSlots(x, NAMES=ans_NAMES, seqnames=ans_seqnames, start=ans_start, cigar=ans_cigar, strand=ans_strand, elementMetadata=ans_elementMetadata) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### "show" method. ### .makeNakedMatFromGAlignments <- function(x) { lx <- length(x) nc <- ncol(mcols(x)) ans <- cbind(seqnames=as.character(seqnames(x)), strand=as.character(strand(x)), cigar=S4Vectors:::sketchStr(cigar(x), 23L), qwidth=qwidth(x), start=start(x), end=end(x), width=width(x), njunc=njunc(x)) if (nc > 0L) { tmp <- do.call(data.frame, lapply(mcols(x), showAsCell)) ans <- cbind(ans, `|`=rep.int("|", lx), as.matrix(tmp)) } ans } showGAlignments <- function(x, margin="", print.classinfo=FALSE, print.seqinfo=FALSE) { lx <- length(x) nc <- ncol(mcols(x)) cat(class(x), " object with ", lx, " ", ifelse(lx == 1L, "alignment", "alignments"), " and ", nc, " metadata ", ifelse(nc == 1L, "column", "columns"), ":\n", sep="") out <- S4Vectors:::makePrettyMatrixForCompactPrinting(x, .makeNakedMatFromGAlignments) if (print.classinfo) { .COL2CLASS <- c( seqnames="Rle", strand="Rle", cigar="character", qwidth="integer", start="integer", end="integer", width="integer", njunc="integer" ) classinfo <- S4Vectors:::makeClassinfoRowForCompactPrinting(x, .COL2CLASS) ## A sanity check, but this should never happen! stopifnot(identical(colnames(classinfo), colnames(out))) out <- rbind(classinfo, out) } if (nrow(out) != 0L) rownames(out) <- paste0(margin, rownames(out)) ## We set 'max' to 'length(out)' to avoid the getOption("max.print") ## limit that would typically be reached when 'showHeadLines' global ## option is set to Inf. print(out, quote=FALSE, right=TRUE, max=length(out)) if (print.seqinfo) { cat(margin, "-------\n", sep="") cat(margin, "seqinfo: ", summary(seqinfo(x)), "\n", sep="") } } setMethod("show", "GAlignments", function(object) showGAlignments(object, margin=" ", print.classinfo=TRUE, print.seqinfo=TRUE) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Combining and splitting. ### ### 'Class' must be "GAlignments" or the name of a concrete subclass of ### GAlignments. ### 'objects' must be a list of GAlignments objects. ### Returns an instance of class 'Class'. combine_GAlignments_objects <- function(Class, objects, use.names=TRUE, ignore.mcols=FALSE) { if (!isSingleString(Class)) stop("'Class' must be a single character string") if (!extends(Class, "GAlignments")) stop("'Class' must be the name of a class that extends GAlignments") if (!is.list(objects)) stop("'objects' must be a list") if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") ### TODO: Support 'use.names=TRUE'. if (use.names) stop("'use.names=TRUE' is not supported yet") if (!isTRUEorFALSE(ignore.mcols)) stop("'ignore.mcols' must be TRUE or FALSE") if (length(objects) != 0L) { ## TODO: Implement (in C) fast 'elementIsNull(objects)' in IRanges, ## that does 'sapply(objects, is.null, USE.NAMES=FALSE)', and use it ## here. null_idx <- which(sapply(objects, is.null, USE.NAMES=FALSE)) if (length(null_idx) != 0L) objects <- objects[-null_idx] } if (length(objects) == 0L) return(new(Class)) ## TODO: Implement (in C) fast 'elementIs(objects, class)' in IRanges, that ## does 'sapply(objects, is, class, USE.NAMES=FALSE)', and use it here. ## 'elementIs(objects, "NULL")' should work and be equivalent to ## 'elementIsNull(objects)'. if (!all(sapply(objects, is, Class, USE.NAMES=FALSE))) stop("the objects to combine must be ", Class, " objects (or NULLs)") objects_names <- names(objects) names(objects) <- NULL # so lapply(objects, ...) below returns an # unnamed list ## Combine "NAMES" slots. NAMES_slots <- lapply(objects, function(x) x@NAMES) ## TODO: Use elementIsNull() here when it becomes available. has_no_names <- sapply(NAMES_slots, is.null, USE.NAMES=FALSE) if (all(has_no_names)) { ans_NAMES <- NULL } else { noname_idx <- which(has_no_names) if (length(noname_idx) != 0L) NAMES_slots[noname_idx] <- lapply(elementNROWS(objects[noname_idx]), character) ans_NAMES <- unlist(NAMES_slots, use.names=FALSE) } ## Combine "seqnames" slots. seqnames_slots <- lapply(objects, function(x) x@seqnames) ## TODO: Implement unlist_list_of_Rle() in IRanges and use it here. ans_seqnames <- do.call(c, seqnames_slots) ## Combine "start" slots. start_slots <- lapply(objects, function(x) x@start) ans_start <- unlist(start_slots, use.names=FALSE) ## Combine "cigar" slots. cigar_slots <- lapply(objects, function(x) x@cigar) ans_cigar <- unlist(cigar_slots, use.names=FALSE) ## Combine "strand" slots. strand_slots <- lapply(objects, function(x) x@strand) ## TODO: Implement unlist_list_of_Rle() in IRanges and use it here. ans_strand <- do.call(c, strand_slots) ## Combine "mcols" slots. We don't need to use fancy ## IRanges:::rbind.mcols() for this because the "mcols" slot of a ## GAlignments object is guaranteed to be a DataFrame. if (ignore.mcols) { ans_mcols <- S4Vectors:::make_zero_col_DataFrame(length(ans_start)) } else { mcols_slots <- lapply(objects, function(x) x@elementMetadata) ## Will fail if not all the GAlignments objects in 'objects' have ## exactly the same metadata cols. ans_mcols <- do.call(rbind, mcols_slots) } ## Combine "seqinfo" slots. seqinfo_slots <- lapply(objects, function(x) x@seqinfo) ans_seqinfo <- do.call(merge, seqinfo_slots) ## Make 'ans' and return it. new(Class, NAMES=ans_NAMES, seqnames=ans_seqnames, start=ans_start, cigar=ans_cigar, strand=ans_strand, elementMetadata=ans_mcols, seqinfo=ans_seqinfo) } setMethod("c", "GAlignments", function (x, ..., ignore.mcols=FALSE, recursive=FALSE) { if (!identical(recursive, FALSE)) stop("\"c\" method for GAlignments objects ", "does not support the 'recursive' argument") if (missing(x)) { objects <- list(...) x <- objects[[1L]] } else { objects <- list(x, ...) } combine_GAlignments_objects(class(x), objects, use.names=FALSE, ignore.mcols=ignore.mcols) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Comparing/ordering. ### setMethod("pcompare", c("GAlignments", "GAlignments"), function(x, y) { x <- granges(x, use.names=FALSE) y <- granges(y, use.names=FALSE) callGeneric(x, y) } ) setMethod("is.unsorted", "GAlignments", function(x, na.rm=FALSE, strictly=FALSE, ...) { x <- granges(x, use.names=FALSE) callGeneric() } ) setMethod("order", "GAlignments", function(..., na.last=TRUE, decreasing=FALSE, method=c("auto", "shell", "radix")) { args <- list(...) order_args <- c(lapply(args, granges, use.names=FALSE), list(na.last=na.last, decreasing=decreasing, method=method)) do.call(order, order_args) } ) setMethod("sort", "GAlignments", function(x, decreasing=FALSE, ...) { oo <- GenomicRanges:::order_GenomicRanges(x, decreasing=decreasing, ...) extractROWS(x, oo) } ) setMethod("rank", "GAlignments", function(x, na.last=TRUE, ties.method=c("average", "first", "last", "random", "max", "min"), ...) { x <- granges(x, use.names=FALSE) callGeneric() } ) GenomicAlignments/R/GAlignmentsList-class.R0000644000175400017540000002501113175714431021703 0ustar00biocbuildbiocbuild### ========================================================================= ### GAlignmentsList objects ### ------------------------------------------------------------------------- ### setClass("GAlignmentsList", contains="CompressedList", representation( unlistData="GAlignments", elementMetadata="DataFrame" ), prototype( elementType="GAlignments" ) ) ### Formal API: ### names(x) - NULL or character vector. ### length(x) - single integer. Nb of alignments in 'x'. ### seqnames(x) - 'factor' Rle of the same length as 'x'. ### rname(x) - same as 'seqnames(x)'. ### seqnames(x) <- value - replacement form of 'seqnames(x)'. ### rname(x) <- value - same as 'seqnames(x) <- value'. ### cigar(x) - character vector of the same length as 'x'. ### strand(x) - 'factor' Rle of the same length as 'x' (levels: +, -, *). ### qwidth(x) - integer vector of the same length as 'x'. ### start(x), end(x), width(x) - integer vectors of the same length as 'x'. ### njunc(x) - integer vector of the same length as 'x'. ### grglist(x) - GRangesList object of the same length as 'x'. ### granges(x) - GRanges object of the same length as 'x'. ### rglist(x) - CompressedIRangesList object of the same length as 'x'. ### ranges(x) - IRanges object of the same length as 'x'. ### show(x) - compact display in a data.frame-like fashion. ### GAlignmentsList(x, ...) - constructor. ### x[i] - GAlignmentsList object of the same class as 'x' ### (endomorphism). ### ### findOverlaps(query, subject) - 'query' or 'subject' or both are ### GAlignments objects. Just a convenient wrapper for ### 'findOverlaps(grglist(query), subject, ...)', etc... ### ### countOverlaps(query, subject) - 'query' or 'subject' or both are ### GAlignments objects. Just a convenient wrapper for ### 'countOverlaps(grglist(query), subject, ...)', etc... ### ### subsetByOverlaps(query, subject) - 'query' or 'subject' or both are ### GAlignments objects. ### ### qnarrow(x, start=NA, end=NA, width=NA) - GAlignmentsList object of the ### same length and class as 'x' (endomorphism). ### ### narrow(x, start=NA, end=NA, width=NA) - GAlignmentsList object of the ### same length and class as 'x' (endomorphism). ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Getters. ### setMethod("seqnames", "GAlignmentsList", function(x) relist(seqnames(unlist(x, use.names=FALSE)), x) ) setMethod("rname", "GAlignmentsList", function(x) relist(rname(unlist(x, use.names=FALSE)), x) ) setMethod("cigar", "GAlignmentsList", function(x) relist(cigar(unlist(x, use.names=FALSE)), x) ) setMethod("strand", "GAlignmentsList", function(x) relist(strand(unlist(x, use.names=FALSE)), x) ) setMethod("qwidth", "GAlignmentsList", function(x) relist(qwidth(unlist(x, use.names=FALSE)), x) ) setMethod("njunc", "GAlignmentsList", function(x) relist(njunc(unlist(x, use.names=FALSE)), x) ) setMethod("start", "GAlignmentsList", function(x, ...) relist(start(unlist(x, use.names=FALSE), ...), x) ) setMethod("end", "GAlignmentsList", function(x, ...) relist(end(unlist(x, use.names=FALSE), ...), x) ) setMethod("width", "GAlignmentsList", function(x) relist(width(unlist(x, use.names=FALSE)), x) ) setMethod("seqinfo", "GAlignmentsList", function(x) seqinfo(unlist(x, use.names=FALSE)) ) setMethod("elementMetadata", "GAlignmentsList", GenomicRanges:::get_GRangesList_mcols ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Setters. ### setReplaceMethod("rname", "GAlignmentsList", function(x, value) `seqnames<-`(x, value) ) setReplaceMethod("elementMetadata", "GAlignmentsList", GenomicRanges:::set_GRangesList_mcols ) setReplaceMethod("strand", "GAlignmentsList", GenomicRanges:::set_GRangesList_strand ) setReplaceMethod("strand", c("GAlignmentsList", "character"), function(x, ..., value) { if (length(value) > 1L) stop("length(value) must be 1") strand(x@unlistData) <- value x } ) setReplaceMethod("seqinfo", "GAlignmentsList", GenomicRanges:::set_GRangesList_seqinfo ) setReplaceMethod("seqnames", "GAlignmentsList", GenomicRanges:::set_GRangesList_seqnames ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.GAlignmentsList <- function(x) { ## TDB: Currently known pitfalls are caught by ## GAlignments validity. } setValidity2("GAlignmentsList", .valid.GAlignmentsList) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructors. ### GAlignmentsList <- function(...) { listData <- list(...) if (length(listData) == 0L) { unlistData <- GAlignments() } else { if (length(listData) == 1L && is.list(listData[[1L]])) listData <- listData[[1L]] if (!all(sapply(listData, is, "GAlignments"))) stop("all elements in '...' must be GAlignments objects") unlistData <- suppressWarnings(do.call("c", unname(listData))) } relist(unlistData, PartitioningByEnd(listData)) } setMethod("updateObject", "GAlignmentsList", function(object, ..., verbose=FALSE) { if (verbose) message("updateObject(object = 'GAlignmentsList')") if (is(try(validObject(object@unlistData, complete=TRUE), silent=TRUE), "try-error")) { object@unlistData <- updateObject(object@unlistData) return(object) } object } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### setMethod("ranges", "GAlignmentsList", function(x, use.names=TRUE, use.mcols=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") ans <- unlist(range(rglist(x)), use.names=FALSE) if (use.names) names(ans) <- names(x) if (use.mcols) mcols(ans) <- mcols(x) ans } ) setMethod("granges", "GAlignmentsList", function(x, use.names=TRUE, use.mcols=FALSE, ignore.strand=FALSE) { if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") if (ignore.strand) strand(x@unlistData) <- "*" msg <- paste0("For some list elements in 'x', the ranges are ", "not on the same chromosome and strand. ", "Cannot extract a single range for them. ", "As a consequence, the returned GRanges object ", "is not parallel to 'x'.") rg <- range(grglist(x, ignore.strand=ignore.strand)) is_one_to_one <- all(elementNROWS(rg) == 1L) if (!is_one_to_one && all(width(x@partitioning) > 0)) { if (ignore.strand) warning(msg) else warning(paste0(msg, " Consider using 'ignore.strand=TRUE'.")) } ans <- unlist(rg, use.names=use.names) if (is_one_to_one && use.mcols) mcols(ans) <- mcols(x) ans } ) setMethod("grglist", "GAlignmentsList", function(x, use.names=TRUE, use.mcols=FALSE, drop.D.ranges=FALSE, ignore.strand=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") if (!isTRUEorFALSE(ignore.strand)) stop("'ignore.strand' must be TRUE or FALSE") if (ignore.strand) strand(x@unlistData) <- "*" unlisted_x <- unlist(x, use.names=FALSE) grl <- grglist(unlisted_x, drop.D.ranges=drop.D.ranges) ans <- IRanges:::regroupBySupergroup(grl, x) if (!use.names) names(ans) <- NULL if (use.mcols) mcols(ans) <- mcols(x) ans } ) setMethod("rglist", "GAlignmentsList", function(x, use.names=TRUE, use.mcols=FALSE, drop.D.ranges=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") unlisted_x <- unlist(x, use.names=FALSE) rgl <- rglist(unlisted_x, drop.D.ranges=drop.D.ranges) ans <- IRanges:::regroupBySupergroup(rgl, x) if (!use.names) names(ans) <- NULL if (use.mcols) mcols(ans) <- mcols(x) ans } ) setAs("GAlignmentsList", "Ranges", function(from) ranges(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentsList", "GRanges", function(from) granges(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentsList", "GRangesList", function(from) grglist(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentsList", "RangesList", function(from) rglist(from, use.names=TRUE, use.mcols=TRUE) ) setAs("GAlignmentPairs", "GAlignmentsList", function(from) { if (length(from) == 0L) pbe <- PartitioningByEnd() else pbe <- PartitioningByEnd(seq(2, 2*length(from), 2), names=names(from)) new("GAlignmentsList", unlistData=unlist(from, use.names=FALSE), partitioning=pbe) } ) setAs("GAlignmentsList", "GAlignmentPairs", function(from) { ga <- unlist(from[mcols(from)$mate_status != "unmated"]) first <- c(TRUE, FALSE) last <- c(FALSE, TRUE) isProperPair <- if (!is.null(mcols(ga)$flag)) { bamFlagTest(mcols(ga)$flag[first], "isProperPair") } else { TRUE } GAlignmentPairs(ga[first], ga[last], isProperPair=isProperPair, names=names(ga)[first]) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Subsetting. ### ## "[", "[<-" and "[[", "[[<-" from CompressedList ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Going from GAlignments to GAlignmentsList with extractList() and family. ### setMethod("relistToClass", "GAlignments", function(x) "GAlignmentsList" ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### show method. ### setMethod("show", "GAlignmentsList", function(object) GenomicRanges:::showList(object, showGAlignments, FALSE) ) GenomicAlignments/R/GappedReads-class.R0000644000175400017540000000517513175714431021027 0ustar00biocbuildbiocbuild### ========================================================================= ### GappedReads objects ### ------------------------------------------------------------------------- ### setClass("GappedReads", contains="GAlignments", representation( qseq="DNAStringSet" ## TODO: Maybe add the read quality? mismatch information? ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Getters. ### setGeneric("qseq", function(x) standardGeneric("qseq")) setMethod("qseq", "GappedReads", function(x) x@qseq) ### Overriding "qwidth" method for GAlignments objects with a faster ### method. setMethod("qwidth", "GappedReads", function(x) width(qseq(x))) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.GappedReads.qseq <- function(x) { x_qseq <- qseq(x) if (class(x_qseq) != "DNAStringSet" || !is.null(names(x_qseq))) return("'qseq(x)' must be an unnamed DNAStringSet instance") if (length(x_qseq) != length(cigar(x))) return("'qseq(x)' and 'cigar(x)' must have the same length") if (!identical(width(x_qseq), cigarWidthAlongQuerySpace(cigar(x)))) return(paste("'width(qseq(x))' and", "'cigarWidthAlongQuerySpace(cigar(x))'", "must be identical")) NULL } .valid.GappedReads <- function(x) { .valid.GappedReads.qseq(x) } setValidity2("GappedReads", .valid.GappedReads, where=asNamespace("GenomicAlignments")) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructor. ### GappedReads <- function(seqnames=Rle(factor()), pos=integer(0), cigar=character(0), strand=NULL, qseq=DNAStringSet(), names=NULL, seqlengths=NULL) { galn <- GAlignments(seqnames=seqnames, pos=pos, cigar=cigar, strand=strand, names=names, seqlengths=seqlengths) new("GappedReads", galn, qseq=qseq) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Subsetting. ### setMethod("extractROWS", "GappedReads", function(x, i) { i <- normalizeSingleBracketSubscript(i, x, as.NSBS=TRUE) x@qseq <- extractROWS(x@qseq, i) callNextMethod() } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "show" method. ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Combining. ### setMethod("c", "GappedReads", function (x, ..., recursive = FALSE) { stop("coming soon") } ) GenomicAlignments/R/OverlapEncodings-class.R0000644000175400017540000003021313175714431022101 0ustar00biocbuildbiocbuild### ========================================================================= ### OverlapEncodings objects ### ------------------------------------------------------------------------- ### setClass("OverlapEncodings", contains="Vector", representation( Loffset="integer", # no NAs, >= 0 Roffset="integer", # no NAs, >= 0 encoding="factor", # no NAs flippedQuery="logical" # no NAs ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### parallelSlotNames() ### ### Combine the new parallel slots with those of the parent class. Make sure ### to put the new parallel slots *first*. setMethod("parallelSlotNames", "OverlapEncodings", function(x) c("Loffset", "Roffset", "encoding", "flippedQuery", callNextMethod()) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Getters. ### setGeneric("Loffset", function(x) standardGeneric("Loffset")) setMethod("Loffset", "OverlapEncodings", function(x) x@Loffset) setGeneric("Roffset", function(x) standardGeneric("Roffset")) setMethod("Roffset", "OverlapEncodings", function(x) x@Roffset) ### encoding() generic is defined in Biostrings. setMethod("encoding", "OverlapEncodings", function(x) x@encoding) ### S3/S4 combo for levels.OverlapEncodings levels.OverlapEncodings <- function(x) levels(encoding(x)) setMethod("levels", "OverlapEncodings", levels.OverlapEncodings) setGeneric("flippedQuery", function(x) standardGeneric("flippedQuery")) setMethod("flippedQuery", "OverlapEncodings", function(x) x@flippedQuery) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The encodingHalves(), Lencoding() and Rencoding() low-level utilities. ### .split_encoding_halves <- function(x, single.end.on.left=FALSE, single.end.on.right=FALSE, as.factors=FALSE) { if (!is.character(x)) stop("'x' must be a character vector") if (!isTRUEorFALSE(single.end.on.left)) stop("'single.end.on.left' must be TRUE or FALSE") if (!isTRUEorFALSE(single.end.on.right)) stop("'single.end.on.right' must be TRUE or FALSE") if (!isTRUEorFALSE(as.factors)) stop("'as.factors' must be TRUE or FALSE") encoding_blocks <- CharacterList(strsplit(x, ":", fixed=TRUE)) unlisted_blocks <- unlist(encoding_blocks, use.names=FALSE) block_halves <- CharacterList(strsplit(unlisted_blocks, "--", fixed=TRUE)) ## Check that the blocks in any given encoding are either all single-end ## or all paired-end. nhalves <- unique(relist(elementNROWS(block_halves), encoding_blocks)) if (any(elementNROWS(nhalves) != 1L)) stop("some encodings are ill-formed") nhalves <- as.integer(nhalves) if (any(nhalves > 2L)) stop("some encodings are ill-formed") halves2encoding <- function(halves, skeleton) { blocks <- relist(as.character(halves), skeleton) encoding <- unstrsplit(blocks, sep=":") if (length(encoding) != 0L) encoding <- setNames(paste0(encoding, ":"), names(encoding)) encoding } Lencoding <- halves2encoding(phead(block_halves, n=1L), encoding_blocks) Rencoding <- halves2encoding(ptail(block_halves, n=1L), encoding_blocks) if (!(single.end.on.left && single.end.on.right)) { idx <- which(nhalves == 1L) if (!single.end.on.left) Lencoding[idx] <- NA_character_ if (!single.end.on.right) Rencoding[idx] <- NA_character_ } if (as.factors) { Lencoding <- factor(Lencoding, levels=unique(Lencoding)) Rencoding <- factor(Rencoding, levels=unique(Rencoding)) } list(Lencoding, Rencoding) } setGeneric("encodingHalves", signature="x", function(x, single.end.on.left=FALSE, single.end.on.right=FALSE, as.factors=FALSE) standardGeneric("encodingHalves") ) setMethod("encodingHalves", "character", .split_encoding_halves) setMethod("encodingHalves", "factor", function(x, single.end.on.left=FALSE, single.end.on.right=FALSE, as.factors=FALSE) { levels_halves <- encodingHalves(levels(x), single.end.on.left=single.end.on.left, single.end.on.right=single.end.on.right, as.factors=as.factors) x <- as.integer(x) list(levels_halves[[1L]][x], levels_halves[[2L]][x]) } ) setMethod("encodingHalves", "OverlapEncodings", function(x, single.end.on.left=FALSE, single.end.on.right=FALSE, as.factors=FALSE) { encodingHalves(encoding(x), single.end.on.left=single.end.on.left, single.end.on.right=single.end.on.right, as.factors=as.factors) } ) Lencoding <- function(x, ...) encodingHalves(x, ...)[[1L]] Rencoding <- function(x, ...) encodingHalves(x, ...)[[2L]] ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The njunc(), Lnjunc(), and Rnjunc() low-level utilities. ### ### 'x' must be a character vector of single-end encodings. .njunc_single_end_encodings <- function(x) { if (!is.character(x)) stop("'x' must be a character vector") old_warn <- getOption("warn") options(warn=2L) on.exit(options(warn=old_warn)) M <- try(as.integer(sub(":.*", "", x)), silent=TRUE) if (inherits(M, "try-error")) stop("some encodings are ill-formed") options(warn=old_warn) if (any(M < 1L, na.rm=TRUE)) warning(wmsg("some encodings start with a value < 1 and that is ", "interpreted as a negative number of junctions)")) setNames(M - 1L, names(x)) } Lnjunc <- function(x, single.end.on.left=FALSE) { Lencoding <- Lencoding(x, single.end.on.left=single.end.on.left, as.factors=TRUE) .njunc_single_end_encodings(levels(Lencoding))[as.integer(Lencoding)] } Rnjunc <- function(x, single.end.on.right=FALSE) { Rencoding <- Rencoding(x, single.end.on.right=single.end.on.right, as.factors=TRUE) .njunc_single_end_encodings(levels(Rencoding))[as.integer(Rencoding)] } ### We make this the default "njunc" method although it will only work on ### objects supported by encodingHalves() (which is called behind the scene), ### that is, for character, factor, and OverlapEncodings objects. So instead ### of defining 3 "njunc" methods (one for each type of object supported by ### encodingHalves()), we define a single one for expediency. Another advantage ### of this approach is that if, in the future, encodingHalves() is extended to ### support more types of objects, then njunc() will work out-of-the-box on ### them i.e. with no need to define additional "njunc" methods. setMethod("njunc", "ANY", function(x) { Lnjunc <- Lnjunc(x, single.end.on.left=TRUE) Rnjunc <- Rnjunc(x) Rnjunc[is.na(Rnjunc)] <- 0L Lnjunc + Rnjunc } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### ### S3/S4 combo for as.data.frame.OverlapEncodings as.data.frame.OverlapEncodings <- function(x, row.names=NULL, optional=FALSE, ...) { if (!(is.null(row.names) || is.character(row.names))) stop("'row.names' must be NULL or a character vector") data.frame(Loffset=Loffset(x), Roffset=Roffset(x), encoding=encoding(x), flippedQuery=flippedQuery(x), row.names=row.names, check.rows=TRUE, check.names=FALSE, stringsAsFactors=FALSE) } setMethod("as.data.frame", "OverlapEncodings", as.data.frame.OverlapEncodings) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Displaying ### .make_naked_matrix_from_OverlapEncodings <- function(x) { x_len <- length(x) x_mcols <- mcols(x) x_nmc <- if (is.null(x_mcols)) 0L else ncol(x_mcols) ans <- cbind(Loffset=as.character(Loffset(x)), Roffset=as.character(Roffset(x)), encoding=as.character(encoding(x)), flippedQuery=as.character(flippedQuery(x))) if (x_nmc > 0L) { tmp <- do.call(data.frame, c(lapply(x_mcols, showAsCell), list(check.names=FALSE))) ans <- cbind(ans, `|`=rep.int("|", x_len), as.matrix(tmp)) } ans } showOverlapEncodings <- function(x, margin="", print.classinfo=FALSE) { x_class <- class(x) x_len <- length(x) x_mcols <- mcols(x) x_nmc <- if (is.null(x_mcols)) 0L else ncol(x_mcols) cat(classNameForDisplay(x), " object of length ", x_len, " with ", x_nmc, " metadata column", ifelse(x_nmc == 1L, "", "s"), ":\n", sep="") out <- S4Vectors:::makePrettyMatrixForCompactPrinting(x, .make_naked_matrix_from_OverlapEncodings) if (print.classinfo) { .COL2CLASS <- c( Loffset="integer", Roffset="integer", encoding="factor", flippedQuery="logical" ) classinfo <- S4Vectors:::makeClassinfoRowForCompactPrinting(x, .COL2CLASS) ## A sanity check, but this should never happen! stopifnot(identical(colnames(classinfo), colnames(out))) out <- rbind(classinfo, out) } if (nrow(out) != 0L) rownames(out) <- paste0(margin, rownames(out)) ## We set 'max' to 'length(out)' to avoid the getOption("max.print") ## limit that would typically be reached when 'showHeadLines' global ## option is set to Inf. print(out, quote=FALSE, right=TRUE, max=length(out)) } setMethod("show", "OverlapEncodings", function(object) showOverlapEncodings(object, margin=" ", print.classinfo=TRUE) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Detection of "splice compatible" overlaps. ### build_compatible_encoding_subpatterns <- function(njunc) { ## Each "atom" must match exactly 1 code in the encoding. ATOM0 <- "[fgij]" if (njunc == 0L) return(ATOM0) #ntimes <- function(atom, n) rep.int(atom, n) ntimes <- function(atom, n) { if (n == 1L) atom else c(atom, "{", n, "}") } LEFT_ATOM <- "[jg]" MIDDLE_ATOM <- "g" RIGHT_ATOM <- "[gf]" WILDCARD_ATOM <- "[^:-]" sapply(seq_len(njunc + 1L), function(i) { if (i == 1L) { atoms <- c(LEFT_ATOM, ntimes(WILDCARD_ATOM, njunc)) } else if (i == njunc + 1L) { atoms <- c(ntimes(WILDCARD_ATOM, njunc), RIGHT_ATOM) } else { atoms <- c(ntimes(WILDCARD_ATOM, i-1L), MIDDLE_ATOM, ntimes(WILDCARD_ATOM, njunc-i+1L)) } paste0(atoms, collapse="") }) } .build_compatible_encoding_pattern <- function(max.njunc) { subpatterns <- sapply(0:max.njunc, function(njunc) paste0(build_compatible_encoding_subpatterns(njunc), collapse=":") ) paste0(":(", paste0(subpatterns, collapse="|"), "):") } ### 'x' must be a character vector of single-end encodings. .is_compatible_with_splicing <- function(x) { if (!is.character(x)) stop("'x' must be a character vector") max.njunc <- max(c(0L, .njunc_single_end_encodings(x))) pattern <- .build_compatible_encoding_pattern(max.njunc) setNames(grepl(pattern, x), names(x)) } setGeneric("isCompatibleWithSplicing", function(x) standardGeneric("isCompatibleWithSplicing") ) setMethod("isCompatibleWithSplicing", "character", function(x) { halves <- encodingHalves(x, single.end.on.left=TRUE, single.end.on.right=TRUE) ans1 <- .is_compatible_with_splicing(halves[[1L]]) ans2 <- .is_compatible_with_splicing(halves[[2L]]) ans1 & ans2 } ) setMethod("isCompatibleWithSplicing", "factor", function(x) isCompatibleWithSplicing(levels(x))[as.integer(x)] ) setMethod("isCompatibleWithSplicing", "OverlapEncodings", function(x) isCompatibleWithSplicing(encoding(x)) ) GenomicAlignments/R/cigar-utils.R0000644000175400017540000002673113175714431017771 0ustar00biocbuildbiocbuild### ========================================================================= ### Low-level CIGAR utilities ### ------------------------------------------------------------------------- ### See p. 4 of the SAM Spec v1.4 at http://samtools.sourceforge.net/ for the ### list of CIGAR operations and their meanings. CIGAR_OPS <- c("M", "I", "D", "N", "S", "H", "P", "=", "X") .normarg_cigar <- function(cigar) { if (is.factor(cigar)) cigar <- as.character(cigar) if (!is.character(cigar)) stop("'cigar' must be a character vector or factor") cigar } .normarg_flag <- function(flag, cigar) { if (!is.null(flag)) { if (!is.numeric(flag)) stop("'flag' must be NULL or a vector of integers") if (!is.integer(flag)) flag <- as.integer(flag) if (length(cigar) != length(flag)) stop("'cigar' and 'flag' must have the same length") } flag } .normarg_pos <- function(pos, cigar) { if (!is.numeric(pos)) stop("'pos' must be a vector of integers") if (!is.integer(pos)) pos <- as.integer(pos) if (length(pos) != 1L && length(pos) != length(cigar)) stop("'pos' must have length 1 or the same length as 'cigar'") pos } .select_reference_space <- function(N.regions.removed) { if (!isTRUEorFALSE(N.regions.removed)) stop("'N.regions.removed' must be TRUE or FALSE") if (N.regions.removed) { space <- 2L # REFERENCE_N_REGIONS_REMOVED } else { space <- 1L # REFERENCE } space } .select_query_space <- function(before.hard.clipping, after.soft.clipping) { if (!isTRUEorFALSE(before.hard.clipping)) stop("'before.hard.clipping' must be TRUE or FALSE") if (!isTRUEorFALSE(after.soft.clipping)) stop("'after.soft.clipping' must be TRUE or FALSE") if (before.hard.clipping) { if (after.soft.clipping) stop("'before.hard.clipping' and 'after.soft.clipping' ", "cannot both be TRUE") space <- 4L # QUERY_BEFORE_HARD_CLIPPING } else if (after.soft.clipping) { space <- 5L # QUERY_AFTER_SOFT_CLIPPING } else { space <- 3L # QUERY } space } .select_pairwise_space <- function(N.regions.removed, dense) { if (!isTRUEorFALSE(N.regions.removed)) stop("'N.regions.removed' must be TRUE or FALSE") if (!isTRUEorFALSE(dense)) stop("'dense' must be TRUE or FALSE") if (N.regions.removed) { if (dense) stop("'N.regions.removed' and 'dense' ", "cannot both be TRUE") space <- 7L # PAIRWISE_N_REGIONS_REMOVED } else if (dense) { space <- 8L # PAIRWISE_DENSE } else { space <- 6L # PAIRWISE } space } .normarg_ops <- function(ops) { if (is.null(ops)) return(ops) if (!is.character(ops)) stop("'ops' must be a character vector") if (any(is.na(ops))) stop("'ops' cannot contain NAs") if (length(ops) == 1L) { ops <- strsplit(ops, NULL, fixed=TRUE)[[1L]] } else if (any(nchar(ops) != 1L)) { stop("when 'length(ops) != 1', all its elements ", "must be single letters") } if (anyDuplicated(ops)) stop("'ops' cannot contain duplicated letters") if (!all(ops %in% CIGAR_OPS)) stop("'ops' contains invalid CIGAR operations") ops } validCigar <- function(cigar) { cigar <- .normarg_cigar(cigar) .Call2("valid_cigar", cigar, 0L, PACKAGE="GenomicAlignments") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Transform CIGARs into other useful representations ### explodeCigarOps <- function(cigar, ops=CIGAR_OPS) { cigar <- .normarg_cigar(cigar) ops <- .normarg_ops(ops) .Call2("explode_cigar_ops", cigar, ops, PACKAGE="GenomicAlignments") } explodeCigarOpLengths <- function(cigar, ops=CIGAR_OPS) { cigar <- .normarg_cigar(cigar) ops <- .normarg_ops(ops) .Call2("explode_cigar_op_lengths", cigar, ops, PACKAGE="GenomicAlignments") } cigarToRleList <- function(cigar) { cigar_ops <- explodeCigarOps(cigar) cigar_op_lengths <- explodeCigarOpLengths(cigar) if (length(cigar) == 0L) { unlisted_cigar_ops <- character(0) unlisted_cigar_op_lengths <- integer(0) } else { unlisted_cigar_ops <- unlist(cigar_ops, use.names=FALSE) unlisted_cigar_op_lengths <- unlist(cigar_op_lengths, use.names=FALSE) } ## Prepare 'ans_flesh'. ans_flesh <- Rle(unlisted_cigar_ops, unlisted_cigar_op_lengths) ## Prepare 'ans_skeleton'. nops_per_cigar <- elementNROWS(cigar_op_lengths) ans_breakpoints <- cumsum(unlisted_cigar_op_lengths)[cumsum(nops_per_cigar)] ans_skeleton <- PartitioningByEnd(ans_breakpoints) ## Relist. relist(ans_flesh, ans_skeleton) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Summarize CIGARs ### cigarOpTable <- function(cigar) { cigar <- .normarg_cigar(cigar) ans <- .Call2("cigar_op_table", cigar, PACKAGE="GenomicAlignments") stopifnot(identical(CIGAR_OPS, colnames(ans))) # sanity check ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### From CIGARs to ranges ### .cigar_ranges <- function(cigar, flag, space, pos, f, ops, drop.empty.ranges, reduce.ranges, with.ops) { cigar <- .normarg_cigar(cigar) flag <- .normarg_flag(flag, cigar) if (!isSingleNumber(space)) stop("'space' must be a single integer") if (!is.integer(space)) space <- as.integer(space) pos <- .normarg_pos(pos, cigar) if (!is.null(f)) { if (!is.factor(f)) stop("'f' must be NULL or a factor") if (length(f) != length(cigar)) stop("'f' must have the same length as 'cigar'") } ops <- .normarg_ops(ops) if (!isTRUEorFALSE(drop.empty.ranges)) stop("'drop.empty.ranges' must be TRUE or FALSE") if (!isTRUEorFALSE(reduce.ranges)) stop("'reduce.ranges' must be TRUE or FALSE") if (!isTRUEorFALSE(with.ops)) stop("'with.ops' must be TRUE or FALSE") .Call2("cigar_ranges", cigar, flag, space, pos, f, ops, drop.empty.ranges, reduce.ranges, with.ops, PACKAGE="GenomicAlignments") } cigarRangesAlongReferenceSpace <- function(cigar, flag=NULL, N.regions.removed=FALSE, pos=1L, f=NULL, ops=CIGAR_OPS, drop.empty.ranges=FALSE, reduce.ranges=FALSE, with.ops=FALSE) { space <- .select_reference_space(N.regions.removed) C_ans <- .cigar_ranges(cigar, flag, space, pos, f, ops, drop.empty.ranges, reduce.ranges, with.ops) if (is.null(f)) return(C_ans) compress <- length(C_ans) >= 200L IRangesList(C_ans, compress=compress) } cigarRangesAlongQuerySpace <- function(cigar, flag=NULL, before.hard.clipping=FALSE, after.soft.clipping=FALSE, ops=CIGAR_OPS, drop.empty.ranges=FALSE, reduce.ranges=FALSE, with.ops=FALSE) { space <- .select_query_space(before.hard.clipping, after.soft.clipping) .cigar_ranges(cigar, flag, space, 1L, NULL, ops, drop.empty.ranges, reduce.ranges, with.ops) } cigarRangesAlongPairwiseSpace <- function(cigar, flag=NULL, N.regions.removed=FALSE, dense=FALSE, ops=CIGAR_OPS, drop.empty.ranges=FALSE, reduce.ranges=FALSE, with.ops=FALSE) { space <- .select_pairwise_space(N.regions.removed, dense) .cigar_ranges(cigar, flag, space, 1L, NULL, ops, drop.empty.ranges, reduce.ranges, with.ops) } ### A convenience wrapper to cigarRangesAlongReferenceSpace(). extractAlignmentRangesOnReference <- function(cigar, pos=1L, drop.D.ranges=FALSE, f=NULL) { if (!isTRUEorFALSE(drop.D.ranges)) stop("'drop.D.ranges' must be TRUE or FALSE") ## Not sure why we include "I" operations here since they don't generate ## coverage on the reference (they always produce zero-width ranges on the ## reference). if (drop.D.ranges) { ops <- c("M", "=", "X", "I") } else { ops <- c("M", "=", "X", "I", "D") } cigarRangesAlongReferenceSpace(cigar, flag=NULL, pos=pos, f=f, ops=ops, drop.empty.ranges=FALSE, reduce.ranges=TRUE) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### From CIGARs to sequence lengths ### .cigar_width <- function(cigar, flag, space) { cigar <- .normarg_cigar(cigar) flag <- .normarg_flag(flag, cigar) if (!isSingleNumber(space)) stop("'space' must be a single integer") if (!is.integer(space)) space <- as.integer(space) .Call2("cigar_width", cigar, flag, space, PACKAGE="GenomicAlignments") } cigarWidthAlongReferenceSpace <- function(cigar, flag=NULL, N.regions.removed=FALSE) { space <- .select_reference_space(N.regions.removed) .cigar_width(cigar, flag, space) } cigarWidthAlongQuerySpace <- function(cigar, flag=NULL, before.hard.clipping=FALSE, after.soft.clipping=FALSE) { space <- .select_query_space(before.hard.clipping, after.soft.clipping) .cigar_width(cigar, flag, space) } cigarWidthAlongPairwiseSpace <- function(cigar, flag=NULL, N.regions.removed=FALSE, dense=FALSE) { space <- .select_pairwise_space(N.regions.removed, dense) .cigar_width(cigar, flag, space) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Narrow CIGARs ### cigarNarrow <- function(cigar, start=NA, end=NA, width=NA) { cigar_width <- cigarWidthAlongReferenceSpace(cigar) cigar_ranges <- IRanges(start=rep.int(1L, length(cigar_width)), width=cigar_width) threeranges <- threebands(cigar_ranges, start=start, end=end, width=width) C_ans <- .Call2("cigar_narrow", cigar, width(threeranges$left), width(threeranges$right), PACKAGE="GenomicAlignments") ans <- C_ans[[1L]] attr(ans, "rshift") <- C_ans[[2L]] ans } cigarQNarrow <- function(cigar, start=NA, end=NA, width=NA) { cigar_qwidth <- cigarWidthAlongQuerySpace(cigar) cigar_qranges <- IRanges(start=rep.int(1L, length(cigar_qwidth)), width=cigar_qwidth) threeranges <- threebands(cigar_qranges, start=start, end=end, width=width) C_ans <- .Call2("cigar_qnarrow", cigar, width(threeranges$left), width(threeranges$right), PACKAGE="GenomicAlignments") ans <- C_ans[[1L]] attr(ans, "rshift") <- C_ans[[2L]] ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Translate coordinates between query-based and reference-based ### queryLoc2refLoc <- function(qloc, cigar, pos=1L) { stop("NOT IMPLEMENTED YET, SORRY!") } queryLocs2refLocs <- function(qlocs, cigar, pos=1L, flag=NULL) { stop("NOT IMPLEMENTED YET, SORRY!") } GenomicAlignments/R/coordinate-mapping-methods.R0000644000175400017540000001264413175714431022765 0ustar00biocbuildbiocbuild### ========================================================================= ### coordinate mapping methods ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Generics ### setGeneric("mapToAlignments", signature=c("x", "alignments"), function(x, alignments, ...) standardGeneric("mapToAlignments") ) setGeneric("pmapToAlignments", signature=c("x", "alignments"), function(x, alignments, ...) standardGeneric("pmapToAlignments") ) setGeneric("mapFromAlignments", signature=c("x", "alignments"), function(x, alignments, ...) standardGeneric("mapFromAlignments") ) setGeneric("pmapFromAlignments", signature=c("x", "alignments"), function(x, alignments, ...) standardGeneric("pmapFromAlignments") ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### mapToAlignments() and mapFromAlignments() methods ### .mapFromAlignments <- function(x, alignments) { if (!length(x) && !length(alignments)) return(GRanges(xHits=integer(), transcriptsHits=integer())) if (is.null(xNames <- names(x)) || is.null(alignmentsNames <- names(alignments))) stop ("both 'x' and 'alignments' must have names") ## name matching determines pairs match0 <- match(alignmentsNames, alignmentsNames) match1 <- match(xNames, alignmentsNames) group0 <- splitAsList(seq_along(alignmentsNames), match0) group1 <- group0[match(na.omit(match1), names(group0))] xHits <- rep(which(!is.na(match1)), elementNROWS(group1)) alignmentsHits <- unlist(group1, use.names=FALSE) if (!length(xHits <- na.omit(xHits))) stop ("none of 'names(x)' are in 'names(alignments)'") x <- x[xHits] alignments <- alignments[alignmentsHits] s <- .Call("query_locs_to_ref_locs", start(x), cigar(alignments), start(alignments), FALSE) e <- .Call("query_locs_to_ref_locs", end(x), cigar(alignments), start(alignments), TRUE) e <- pmax(e, s - 1L) ## remove non-hits keep <- !is.na(s) & !is.na(e) seqname <- as.character(seqnames(alignments)) GRanges(Rle(seqname[keep]), IRanges(s[keep], e[keep], names=names(x)[keep]), xHits=xHits[keep], alignmentsHits=alignmentsHits[keep]) } .mapToAlignments <- function(x, alignments) { if (!length(x) && !length(alignments)) return(GRanges(xHits=integer(), transcriptsHits=integer())) if (is.null(names(alignments))) stop ("'alignments' must have names") ## map all possible pairs; returns hits only map <- .Call("map_ref_locs_to_query_locs", start(x), end(x), cigar(alignments), start(alignments)) xHits <- map[[3]] alignmentsHits <- map[[4]] if (length(xHits)) GRanges(Rle(names(alignments)[alignmentsHits]), IRanges(map[[1]], pmax(map[[2]], map[[1]] - 1L), names=names(x)[xHits]), strand="*", xHits, alignmentsHits) else GRanges(xHits=integer(), transcriptsHits=integer()) } setMethod("mapToAlignments", c("Ranges", "GAlignments"), function(x, alignments, ...) ranges(.mapToAlignments(x, alignments)) ) setMethod("mapToAlignments", c("GenomicRanges", "GAlignments"), function(x, alignments, ...) .mapToAlignments(x, alignments) ) setMethod("mapFromAlignments", c("Ranges", "GAlignments"), function(x, alignments, ...) ranges(.mapFromAlignments(x, alignments)) ) setMethod("mapFromAlignments", c("GenomicRanges", "GAlignments"), function(x, alignments, ...) .mapFromAlignments(x, alignments) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### pmapToAlignments() and pmapFromAlignments() methods ### .pmapAlignments <- function(x, alignments, reverse) { if (length(x) && length(alignments)) { if (length(x) != length(alignments)) stop("'x' and 'alignments' must have the same length") if (reverse) { FUN <- "query_locs_to_ref_locs" seqname <- as.character(seqnames(alignments)) } else { if (is.null(names(alignments))) stop ("'alignments' must have names") FUN <- "ref_locs_to_query_locs" seqname <- names(alignments) } s <- .Call(FUN, start(x), cigar(alignments), start(alignments), FALSE) e <- .Call(FUN, end(x), cigar(alignments), start(alignments), TRUE) e <- pmax(e, s - 1L) ## non-hits if (any(skip <- is.na(s) | is.na(e))) { s[skip] <- 0L e[skip] <- -1L seqname[skip] <- "UNMAPPED" } GRanges(Rle(seqname), IRanges(s, e, names=names(x))) } else { GRanges() } } setMethod("pmapToAlignments", c("Ranges", "GAlignments"), function(x, alignments, ...) ranges(.pmapAlignments(x, alignments, FALSE)) ) setMethod("pmapToAlignments", c("GenomicRanges", "GAlignments"), function(x, alignments, ...) .pmapAlignments(ranges(x), alignments, FALSE) ) setMethod("pmapFromAlignments", c("Ranges", "GAlignments"), function(x, alignments, ...) ranges(.pmapAlignments(x, alignments, TRUE)) ) setMethod("pmapFromAlignments", c("GenomicRanges", "GAlignments"), function(x, alignments, ...) .pmapAlignments(ranges(x), alignments, TRUE) ) GenomicAlignments/R/coverage-methods.R0000644000175400017540000000361513175714431020776 0ustar00biocbuildbiocbuild### ========================================================================= ### "coverage" methods ### ------------------------------------------------------------------------- setMethod("coverage", "GAlignments", function(x, shift=0L, width=NULL, weight=1L, method=c("auto", "sort", "hash"), drop.D.ranges=FALSE) { x <- grglist(x, drop.D.ranges=drop.D.ranges) coverage(x, shift=shift, width=width, weight=weight, method=method) } ) setMethod("coverage", "GAlignmentPairs", function(x, shift=0L, width=NULL, weight=1L, method=c("auto", "sort", "hash"), drop.D.ranges=FALSE) { x <- grglist(x, drop.D.ranges=drop.D.ranges) coverage(x, shift=shift, width=width, weight=weight, method=method) } ) setMethod("coverage", "GAlignmentsList", function(x, shift=0L, width=NULL, weight=1L, ...) { x <- unlist(x, use.names=FALSE) callGeneric() } ) setMethod("coverage", "BamFile", function(x, shift=0L, width=NULL, weight=1L, ..., param=ScanBamParam()) { if (!isOpen(x)) { open(x) on.exit(close(x)) } cvg <- NULL repeat { aln <- readGAlignments(x, param=param) if (length(aln) == 0L) { if (is.null(cvg)) cvg <- coverage(aln, shift=shift, width=width, weight=weight, ...) break } cvg0 <- coverage(aln, shift=shift, width=width, weight=weight, ...) if (is.null(cvg)) cvg <- cvg0 else cvg <- cvg + cvg0 } cvg }) setMethod("coverage", "character", function(x, shift=0L, width=NULL, weight=1L, ..., yieldSize=2500000L) { if (!isSingleString(x)) stop("'x' must be a single string for coverage,character-method") bf <- BamFile(x, yieldSize=yieldSize) coverage(bf, shift=shift, width=width, weight=weight, ...) }) GenomicAlignments/R/encodeOverlaps-methods.R0000644000175400017540000007641713175714431022166 0ustar00biocbuildbiocbuild### ========================================================================= ### encodeOverlaps() and related utilities ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### encodeOverlaps1() - A low-level utility. ### ### > query <- IRanges(start=c(7, 15, 22), end=c(9, 19, 23)) ### > subject <- IRanges(start=c(1, 4, 15, 22, 1, 30, 25), ### end=c(2, 9, 19, 25, 10, 38, 25)) ### > encodeOverlaps1(query, subject, as.matrix=TRUE) ### [,1] [,2] [,3] [,4] [,5] [,6] [,7] ### [1,] "m" "j" "a" "a" "i" "a" "a" ### [2,] "m" "m" "g" "a" "m" "a" "a" ### [3,] "m" "m" "m" "f" "m" "a" "a" ### > encodeOverlaps1(query, subject) ### $Loffset ### [1] 1 ### ### $Roffset ### [1] 2 ### ### $encoding ### [1] "3:jmm:agm:aaf:imm:" ### ### > query.space <- c(0, 1, 0) ### > encodeOverlaps1(query, subject, query.space=query.space)$encoding ### [1] "3:mXm:jXm:aXm:aXf:iXm:aXa:aXa:" ### > query.space <- rep(-1, length(query)) ### > subject.space <- rep(-1, length(subject)) ### > encodeOverlaps1(rev(query), rev(subject), ### query.space=query.space, subject.space=subject.space) ### $Loffset ### [1] 2 ### ### $Roffset ### [1] 1 ### ### $encoding ### [1] "3:aai:jmm:agm:aaf:" ### ### > encodeOverlaps1(query, subject, query.break=2)$encoding ### [1] "2--1:jm--m:ag--m:aa--f:im--m:" ### > encodeOverlaps1(rev(query), rev(subject), ### query.space=query.space, subject.space=subject.space, ### query.break=1)$encoding ### [1] "1--2:a--ai:j--mm:a--gm:a--af:" ### 'query.space' must be either an integer vector of the same length as ### 'query', or NULL. If NULL, then it's interpreted as ### 'integer(length(query))' i.e. all the ranges in 'query' are considered to ### be on space 0. encodeOverlaps1 <- function(query, subject, query.space=NULL, subject.space=NULL, query.break=0L, flip.query=FALSE, as.matrix=FALSE, as.raw=FALSE) { if (!is(query, "Ranges")) stop("'query' must be a Ranges object") if (!is(subject, "Ranges")) stop("'subject' must be a Ranges object") if (is.numeric(query.space) && !is.integer(query.space)) query.space <- as.integer(query.space) if (is.numeric(subject.space) && !is.integer(subject.space)) subject.space <- as.integer(subject.space) if (!isSingleNumber(query.break)) stop("'query.break' must be a single integer value") if (!is.integer(query.break)) query.break <- as.integer(query.break) if (!isTRUEorFALSE(flip.query)) stop("'flip.query' must be TRUE or FALSE") if (!isTRUEorFALSE(as.matrix)) stop("'as.matrix' must be TRUE or FALSE") if (!isTRUEorFALSE(as.raw)) stop("'as.raw' must be TRUE or FALSE") .Call2("encode_overlaps1", start(query), width(query), query.space, query.break, flip.query, start(subject), width(subject), subject.space, as.matrix, as.raw, PACKAGE="GenomicAlignments") } ### TODO: Put this in the (upcoming) man page for encodeOverlaps(). ### A simple (but inefficient) implementation of the "findOverlaps" method for ### Ranges objects. Complexity and memory usage is M x N where M and N are the ### lengths of 'query' and 'subject', respectively. findRangesOverlaps <- function(query, subject) { ovenc <- encodeOverlaps1(query, subject, as.matrix=TRUE, as.raw=TRUE) offsets <- which(charToRaw("c") <= ovenc & ovenc <= charToRaw("k")) - 1L q_hits <- offsets %% nrow(ovenc) + 1L s_hits <- offsets %/% nrow(ovenc) + 1L cbind(queryHits=q_hits, subjectHits=s_hits) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The .RangesList_encodeOverlaps() helper. ### ### This is the power horse behind all the "encodeOverlaps" methods. ### .RangesList_encode_overlaps <- function(query.starts, query.widths, query.spaces, query.breaks, subject.starts, subject.widths, subject.spaces) { .Call2("RangesList_encode_overlaps", query.starts, query.widths, query.spaces, query.breaks, subject.starts, subject.widths, subject.spaces, PACKAGE="GenomicAlignments") } .Hits_encode_overlaps <- function(query.starts, query.widths, query.spaces, query.breaks, subject.starts, subject.widths, subject.spaces, hits, flip.query) { if (queryLength(hits) != length(query.starts) || subjectLength(hits) != length(subject.starts)) stop("'hits' is not compatible with 'query' and 'subject'") .Call2("Hits_encode_overlaps", query.starts, query.widths, query.spaces, query.breaks, subject.starts, subject.widths, subject.spaces, queryHits(hits), subjectHits(hits), flip.query, PACKAGE="GenomicAlignments") } .RangesList_encodeOverlaps <- function(query.starts, query.widths, subject.starts, subject.widths, hits, flip.query=NULL, query.spaces=NULL, subject.spaces=NULL, query.breaks=NULL) { if (is.null(hits)) { C_ans <- .RangesList_encode_overlaps(query.starts, query.widths, query.spaces, query.breaks, subject.starts, subject.widths, subject.spaces) flip.query <- logical(length(C_ans$encoding)) } else { if (!is(hits, "Hits")) stop("'hits' must be a Hits object") if (is.null(flip.query)) { flip.query <- logical(length(hits)) } else { if (!is.logical(flip.query)) stop("'flip.query' must be a logical vector") if (length(flip.query) != length(hits)) stop("'flip.query' must have the same length as 'hits'") } C_ans <- .Hits_encode_overlaps(query.starts, query.widths, query.spaces, query.breaks, subject.starts, subject.widths, subject.spaces, hits, flip.query) } encoding <- as.factor(C_ans$encoding) new2("OverlapEncodings", Loffset=C_ans$Loffset, Roffset=C_ans$Roffset, encoding=encoding, flippedQuery=flip.query, check=FALSE) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### encodeOverlaps() generic and methods for RangesList objects. ### setGeneric("encodeOverlaps", signature=c("query", "subject"), function(query, subject, hits=NULL, ...) standardGeneric("encodeOverlaps") ) setMethods("encodeOverlaps", list(c("RangesList", "RangesList"), c("RangesList", "Ranges"), c("Ranges", "RangesList")), function(query, subject, hits=NULL, ...) { .RangesList_encodeOverlaps(as.list(start(query)), as.list(width(query)), as.list(start(subject)), as.list(width(subject)), hits) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### .isWrongStrand() internal helper. ### .oneValPerTopLevelElt <- function(x, errmsg) { if (!is(x, "RleList")) stop("'x' must be an RleList object") vals <- runValue(x) vals_eltNROWS <- elementNROWS(vals) if (!all(vals_eltNROWS == 1L)) stop(errmsg) unlist(vals, use.names=FALSE) } .isWrongStrand <- function(query, subject, hits) { if (!is(query, "GRangesList") || !is(subject, "GRangesList")) stop("'query' and 'subject' must be GRangesList objects") ## Extract the top-level strand and seqnames of the query. errmsg <- c("some alignments in 'query' have ranges on ", "more than 1 reference sequence (fusion reads?)") query_seqnames <- .oneValPerTopLevelElt(seqnames(query), errmsg) errmsg <- c("some alignments in 'query' have ranges on ", "both strands") query_strand <- .oneValPerTopLevelElt(strand(query), errmsg) ## Extract the top-level strand and seqnames of the subject. errmsg <- c("some transcripts in 'subject' mix exons from ", "different chromosomes (trans-splicing?)") subject_seqnames <- .oneValPerTopLevelElt(seqnames(subject), errmsg) errmsg <- c("some transcripts in 'subject' mix exons from ", "both strands (trans-splicing?)") subject_strand <- .oneValPerTopLevelElt(strand(subject), errmsg) ## Expand the top-level strand and seqnames of the query and subject. if (!is.null(hits)) { if (!is(hits, "Hits")) stop("'hits' must be NULL or a Hits object") if (queryLength(hits) != length(query) || subjectLength(hits) != length(subject)) stop("'hits' is not compatible with 'query' and 'subject' ", "('queryLength(hits)' and 'subjectLength(hits)' don't ", "match the lengths of 'query' and 'subject')") query_seqnames <- query_seqnames[queryHits(hits)] query_strand <- query_strand[queryHits(hits)] subject_seqnames <- subject_seqnames[subjectHits(hits)] subject_strand <- subject_strand[subjectHits(hits)] } ## Should never happen if 'encodeOverlaps(query, subject, hits)' ## was called with 'hits' being the result of a call to ## 'findOverlaps(query, subject)'. if (!all(query_seqnames == subject_seqnames)) stop("cannot use 'flip.query.if.wrong.strand=TRUE' to ", "encode overlaps across chromosomes") query_strand != subject_strand } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### flipQuery() ### flipQuery <- function(x, i) { if (!is(x, "GRangesList")) stop("'x' must be a GRangesList object") i <- normalizeSingleBracketSubscript(i, x, as.NSBS=TRUE) xi <- extractROWS(x, i) x <- replaceROWS(x, i, invertStrand(revElements(xi))) xi_query.break <- mcols(xi)$query.break if (!is.null(xi_query.break)) { revxi_query.break <- elementNROWS(xi) - xi_query.break mcols(x)$query.break <- replaceROWS(mcols(x)$query.break, i, revxi_query.break) } x } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Should we use generic + methods for this? ### .get_GRanges_spaces <- function(x) { ans <- as.integer(seqnames(x)) x_strand <- as.integer(strand(x)) is_minus <- which(x_strand == as.integer(strand("-"))) ans[is_minus] <- - ans[is_minus] ans } .get_GRangesList_spaces <- function(x) { unlisted_ans <- .get_GRanges_spaces(x@unlistData) as.list(relist(unlisted_ans, x)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### "encodeOverlaps" method for GRangesList objects. ### .GRangesList_encodeOverlaps <- function(query, subject, hits, flip.query.if.wrong.strand) { if (!isTRUEorFALSE(flip.query.if.wrong.strand)) stop("'flip.query.if.wrong.strand' must be TRUE or FALSE") seqinfo <- merge(seqinfo(query), seqinfo(subject)) seqlevels(query) <- seqlevels(subject) <- seqlevels(seqinfo) if (flip.query.if.wrong.strand) { flip.query <- .isWrongStrand(query, subject, hits) } else { flip.query <- NULL } query.breaks <- mcols(query)$query.break .RangesList_encodeOverlaps(as.list(start(query)), as.list(width(query)), as.list(start(subject)), as.list(width(subject)), hits, flip.query, query.spaces=.get_GRangesList_spaces(query), subject.spaces=.get_GRangesList_spaces(subject), query.breaks=query.breaks) } setMethod("encodeOverlaps", c("GRangesList", "GRangesList"), function(query, subject, hits=NULL, flip.query.if.wrong.strand=FALSE) .GRangesList_encodeOverlaps(query, subject, hits, flip.query.if.wrong.strand) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### selectEncodingWithCompatibleStrand(). ### selectEncodingWithCompatibleStrand <- function(ovencA, ovencB, query.strand, subject.strand, hits=NULL) { if (!is(ovencA, "OverlapEncodings")) stop("'ovencA' must be an OverlapEncodings object") if (!is(ovencB, "OverlapEncodings")) stop("'ovencB' must be an OverlapEncodings object") if (!is.null(hits)) { if (!is(hits, "Hits")) stop("'hits' must be a Hits object or NULL") query.strand <- query.strand[queryHits(hits)] subject.strand <- subject.strand[subjectHits(hits)] } ans <- ovencA names(ans) <- NULL mcols(ans) <- NULL is_wrong_strand <- query.strand != subject.strand idx <- which(is_wrong_strand) ans@Loffset[idx] <- ovencB@Loffset[idx] ans@Roffset[idx] <- ovencB@Roffset[idx] ans_encoding <- as.character(ans@encoding) ans_encoding[idx] <- as.character(ovencB@encoding[idx]) ans@encoding <- as.factor(ans_encoding) ans@flippedQuery[is_wrong_strand] <- TRUE ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### isCompatibleWithSkippedExons(). ### ### FIXME: Revisit this and make sure it's doing the right thing for ### paired-end encodings. Maybe look at isCompatibleWithSplicing() for some ### inspiration (used to suffer from similar issue on paired-end encodings but ### was refactored). setGeneric("isCompatibleWithSkippedExons", signature="x", function(x, max.skipped.exons=NA) standardGeneric("isCompatibleWithSkippedExons") ) .build_CompatibleWithSkippedExons_pattern0 <- function(max.njunc1, max.Lnjunc, max.Rnjunc, max.skipped.exons=NA) { if (!identical(max.skipped.exons, NA)) stop("only 'max.skipped.exons=NA' is supported for now, sorry") ## Subpattern for single-end reads. skipped_exons_subpatterns <- c(":(.:)*", ":(..:)*", ":(...:)*", ":(....:)*") subpattern1 <- sapply(0:max.njunc1, function(njunc) paste0(build_compatible_encoding_subpatterns(njunc), collapse=skipped_exons_subpatterns[njunc+1L])) subpattern1 <- paste0(":(", paste0(subpattern1, collapse="|"), "):") ## Subpattern for paired-end reads. Lsubpattern <- sapply(0:max.Lnjunc, function(njunc) paste0(":", build_compatible_encoding_subpatterns(njunc), "-", collapse=".*")) Lsubpattern <- paste0("(", paste0(Lsubpattern, collapse="|"), ")") Rsubpattern <- sapply(0:max.Rnjunc, function(njunc) paste0("-", build_compatible_encoding_subpatterns(njunc), ":", collapse=".*")) Rsubpattern <- paste0("(", paste0(Rsubpattern, collapse="|"), ")") LRsubpattern <- paste0(Lsubpattern, ".*", Rsubpattern) ## Final pattern. paste0("(", subpattern1, "|", LRsubpattern, ")") } .build_CompatibleWithSkippedExons_pattern <- function(x, max.skipped.exons=NA) { njunc <- njunc(x) Lnjunc <- Lnjunc(x) Rnjunc <- Rnjunc(x) max.njunc1 <- max(c(0L, njunc[is.na(Lnjunc)])) max.Lnjunc <- max(c(0L, Lnjunc), na.rm=TRUE) max.Rnjunc <- max(c(0L, Rnjunc), na.rm=TRUE) .build_CompatibleWithSkippedExons_pattern0(max.njunc1, max.Lnjunc, max.Rnjunc, max.skipped.exons=max.skipped.exons) } .isCompatibleWithSkippedExons <- function(x, max.skipped.exons=NA) { if (!is.character(x)) stop("'x' must be a character vector") pattern1 <- .build_CompatibleWithSkippedExons_pattern(x, max.skipped.exons) grepl(pattern1, x) & !isCompatibleWithSplicing(x) } setMethod("isCompatibleWithSkippedExons", "character", .isCompatibleWithSkippedExons ) setMethod("isCompatibleWithSkippedExons", "factor", function(x, max.skipped.exons=NA) { ok <- isCompatibleWithSkippedExons(levels(x), max.skipped.exons=max.skipped.exons) ok[as.integer(x)] } ) setMethod("isCompatibleWithSkippedExons", "OverlapEncodings", function(x, max.skipped.exons=NA) isCompatibleWithSkippedExons(encoding(x), max.skipped.exons=max.skipped.exons) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### extractSteppedExonRanks(). ### .extract_njunc_from_encoding <- function(x) { as.integer(unlist(strsplit(sub(":.*", "", x), "--", fixed=TRUE), use.names=FALSE)) - 1L } .extractSteppedExonRanksFromEncodingBlocks <- function(encoding_blocks, encoding_patterns) { patterns <- paste0("^", encoding_patterns, "$") ii <- lapply(patterns, grep, encoding_blocks) ii_eltNROWS <- elementNROWS(ii) if (any(ii_eltNROWS == 0L)) return(integer(0)) if (any(ii_eltNROWS != 1L)) stop("cannot unambiguously extract stepped exon ranks from ", "encoding \"", paste0(encoding_blocks, collapse=":"), "\"") ans <- unlist(ii, use.names=FALSE) diff_ans <- diff(ans) if (any(diff_ans <= 0L)) return(integer(0)) ans } ### 'encoding' must be a single encoding. ### Returns an integer vector. If the encoding is single-end then the vector ### is unnamed and strictly sorted. If it's paired-end then it's made of the ### concatenation of the 2 strictly sorted integer vectors that correspond to ### each end. In that case the vector is named. .extractSteppedExonRanks <- function(encoding, for.query.right.end=FALSE) { if (!isTRUEorFALSE(for.query.right.end)) stop("'for.query.right.end' must be TRUE or FALSE") encoding_blocks <- strsplit(encoding, ":", fixed=TRUE)[[1L]] njunc <- .extract_njunc_from_encoding(encoding_blocks[1L]) encoding_blocks <- encoding_blocks[-1L] if (length(njunc) == 1L) { ## Single-end read. if (for.query.right.end) stop("cannot use 'for.query.right.end=TRUE' ", "on single-end encoding: ", encoding) encoding_patterns <- build_compatible_encoding_subpatterns(njunc) return(.extractSteppedExonRanksFromEncodingBlocks(encoding_blocks, encoding_patterns)) } if (length(njunc) != 2L) # should never happen stop(encoding, ": invalid encoding") ## Paired-end read. encoding_blocks <- strsplit(encoding_blocks, "--", fixed=TRUE) if (!all(elementNROWS(encoding_blocks) == 2L)) # should never happen stop(encoding, ": invalid encoding") encoding_blocks <- matrix(unlist(encoding_blocks, use.names=FALSE), nrow=2L) Lencoding_patterns <- build_compatible_encoding_subpatterns(njunc[1L]) Lranks <- .extractSteppedExonRanksFromEncodingBlocks(encoding_blocks[1L, ], Lencoding_patterns) Rencoding_patterns <- build_compatible_encoding_subpatterns(njunc[2L]) Rranks <- .extractSteppedExonRanksFromEncodingBlocks(encoding_blocks[2L, ], Rencoding_patterns) if (for.query.right.end) return(Rranks) # unnamed! (like for a single-end read) names(Rranks) <- rep.int("R", length(Rranks)) names(Lranks) <- rep.int("L", length(Lranks)) c(Lranks, Rranks) } setGeneric("extractSteppedExonRanks", function(x, for.query.right.end=FALSE) standardGeneric("extractSteppedExonRanks") ) setMethod("extractSteppedExonRanks", "character", function(x, for.query.right.end=FALSE) { lapply(x, .extractSteppedExonRanks, for.query.right.end) } ) setMethod("extractSteppedExonRanks", "factor", function(x, for.query.right.end=FALSE) { if (length(x) == 0L) return(list()) ranks <- extractSteppedExonRanks(levels(x), for.query.right.end=for.query.right.end) ranks[as.integer(x)] } ) setMethod("extractSteppedExonRanks", "OverlapEncodings", function(x, for.query.right.end=FALSE) { ranks <- extractSteppedExonRanks(encoding(x), for.query.right.end=for.query.right.end) ranks_eltNROWS <- elementNROWS(ranks) tmp <- unlist(unname(ranks), use.names=TRUE) # we want the inner names tmp <- tmp + rep.int(Loffset(x), ranks_eltNROWS) flevels <- seq_len(length(ranks)) f <- factor(rep.int(flevels, ranks_eltNROWS), levels=flevels) unname(split(tmp, f)) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### extractSpannedExonRanks(). ### setGeneric("extractSpannedExonRanks", function(x, for.query.right.end=FALSE) standardGeneric("extractSpannedExonRanks") ) setMethod("extractSpannedExonRanks", "character", function(x, for.query.right.end=FALSE) { .extractRanks <- function(encoding) { ranks <- .extractSteppedExonRanks(encoding, for.query.right.end=for.query.right.end) if (length(ranks) == 0L) return(c(NA_integer_, NA_integer_)) c(ranks[1L], ranks[length(ranks)]) } ranks <- lapply(x, .extractRanks) if (length(ranks) == 0L) { firstSpannedExonRank <- lastSpannedExonRank <- integer(0) } else { ranks <- unlist(ranks, use.names=FALSE) firstSpannedExonRank <- ranks[c(TRUE, FALSE)] lastSpannedExonRank <- ranks[c(FALSE, TRUE)] } data.frame(firstSpannedExonRank=firstSpannedExonRank, lastSpannedExonRank=lastSpannedExonRank, check.names=FALSE, stringsAsFactors=FALSE) } ) setMethod("extractSpannedExonRanks", "factor", function(x, for.query.right.end=FALSE) { if (length(x) == 0L) return(list()) ranks <- extractSpannedExonRanks(levels(x), for.query.right.end=for.query.right.end) ans <- ranks[as.integer(x), , drop=FALSE] rownames(ans) <- NULL ans } ) setMethod("extractSpannedExonRanks", "OverlapEncodings", function(x, for.query.right.end=FALSE) { ranks <- extractSpannedExonRanks(encoding(x), for.query.right.end=for.query.right.end) ranks$firstSpannedExonRank <- ranks$firstSpannedExonRank + Loffset(x) ranks$lastSpannedExonRank <- ranks$lastSpannedExonRank + Loffset(x) ranks } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### extractSkippedExonRanks(). ### setGeneric("extractSkippedExonRanks", function(x, for.query.right.end=FALSE) standardGeneric("extractSkippedExonRanks") ) setMethod("extractSkippedExonRanks", "character", function(x, for.query.right.end=FALSE) { .extractRanks <- function(encoding) { ranks <- .extractSteppedExonRanks(encoding, for.query.right.end=for.query.right.end) if (length(ranks) == 0L) return(ranks) ranks_names <- names(ranks) if (is.null(ranks_names)) # single-end read return(setdiff(ranks[1L]:ranks[length(ranks)], ranks)) ## Paired-end read. ranks <- split(unname(ranks), ranks_names) Lranks <- ranks$L Lranks <- setdiff(Lranks[1L]:Lranks[length(Lranks)], Lranks) Rranks <- ranks$R Rranks <- setdiff(Rranks[1L]:Rranks[length(Rranks)], Rranks) names(Lranks) <- rep.int("L", length(Lranks)) names(Rranks) <- rep.int("R", length(Rranks)) c(Lranks, Rranks) } lapply(x, .extractRanks) } ) setMethod("extractSkippedExonRanks", "factor", function(x, for.query.right.end=FALSE) { if (length(x) == 0L) return(list()) ranks <- extractSkippedExonRanks(levels(x), for.query.right.end=for.query.right.end) ranks[as.integer(x)] } ) setMethod("extractSkippedExonRanks", "OverlapEncodings", function(x, for.query.right.end=FALSE) { ranks <- extractSkippedExonRanks(encoding(x), for.query.right.end=for.query.right.end) ranks_eltNROWS <- elementNROWS(ranks) tmp <- unlist(unname(ranks), use.names=TRUE) # we want the inner names tmp <- tmp + rep.int(Loffset(x), ranks_eltNROWS) flevels <- seq_len(length(ranks)) f <- factor(rep.int(flevels, ranks_eltNROWS), levels=flevels) unname(split(tmp, f)) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### extractQueryStartInTranscript(). ### ### TODO: Maybe put this in IRanges and rename it setElementNROWS, or even ### better introduce an "elementNROWS<-" generic and make this the method ### for CompressedList objects? .setElementNROWS <- function(x, eltNROWS) { if (!is(x, "CompressedList")) stop("'x' must be a CompressedList object") if (!is.numeric(eltNROWS) || length(eltNROWS) != length(x)) stop("'eltNROWS' must be an integer vector of the same length as 'x'") if (!is.integer(eltNROWS)) eltNROWS <- as.integer(eltNROWS) if (S4Vectors:::anyMissingOrOutside(eltNROWS, lower=0L)) stop("'eltNROWS' cannot contain NAs or negative values") x_eltNROWS <- elementNROWS(x) if (!all(eltNROWS <= x_eltNROWS)) stop("'all(eltNROWS <= elementNROWS(x))' must be TRUE") offset <- cumsum(c(0L, x_eltNROWS[-length(x_eltNROWS)])) ii <- S4Vectors:::fancy_mseq(eltNROWS, offset=offset) x@unlistData <- x@unlistData[ii] x@partitioning@end <- unname(cumsum(eltNROWS)) x } ### Returns a data.frame with 1 row per overlap, and 3 integer columns: ### 1. startInTranscript ### 2. firstSpannedExonRank ### 3. startInFirstSpannedExon ### Rows for overlaps that are not "compatible" or "almost compatible" ### contain NAs. extractQueryStartInTranscript <- function(query, subject, hits=NULL, ovenc=NULL, flip.query.if.wrong.strand=FALSE, for.query.right.end=FALSE) { if (!is(query, "GRangesList") || !is(subject, "GRangesList")) stop("'query' and 'subject' must be GRangesList objects") seqinfo <- merge(seqinfo(query), seqinfo(subject)) seqlevels(query) <- seqlevels(subject) <- seqlevels(seqinfo) if (is.null(hits)) { if (length(query) != length(subject)) stop("'query' and 'subject' must have the same length") } else { if (!is(hits, "Hits")) stop("'hits' must be a Hits object or NULL") if (queryLength(hits) != length(query) || subjectLength(hits) != length(subject)) stop("'hits' is not compatible with 'query' and 'subject' ", "('queryLength(hits)' and 'subjectLength(hits)' don't ", "match the lengths of 'query' and 'subject')") query <- query[queryHits(hits)] subject <- subject[subjectHits(hits)] } if (is.null(ovenc)) { ovenc <- encodeOverlaps(query, subject, flip.query.if.wrong.strand=flip.query.if.wrong.strand) } else { if (!is(ovenc, "OverlapEncodings")) stop("'ovenc' must be an OverlapEncodings object") if (length(ovenc) != length(query)) stop("when not NULL, 'ovenc' must have the same length ", "as 'hits', if specified, otherwise as 'query'") } if (!isTRUEorFALSE(for.query.right.end)) stop("'for.query.right.end' must be TRUE or FALSE") query <- flipQuery(query, flippedQuery(ovenc)) ## Extract first range from each list element of 'query'. if (for.query.right.end) { query.break <- mcols(query)$query.break if (is.null(query.break)) stop("using 'for.query.right.end=TRUE' requires that ", "'mcols(query)' has a \"query.break\" column ", "indicating for each paired-end read the position of the ", "break between the ranges coming from one end and those ", "coming from the other end") query <- ptail(query, n=-query.break) } query1 <- unlist(phead(query, n=1L), use.names=FALSE) ## A sanity check. if (length(query1) != length(query)) stop("some list elements in 'query' are empty") query_start1 <- start(query1) query_end1 <- end(query1) query_strand1 <- as.factor(strand(query1)) ## Extract start/end/strand of the first spanned exon ## in each top-level element of 'subject'. exrank <- extractSpannedExonRanks(ovenc, for.query.right.end=for.query.right.end)$firstSpannedExonRank sii1 <- start(subject@partitioning) + exrank - 1L subject_start1 <- start(subject@unlistData)[sii1] subject_end1 <- end(subject@unlistData)[sii1] subject_strand1 <- as.factor(strand(subject@unlistData))[sii1] ## A sanity check. if (any(!is.na(exrank) & (query_strand1 != subject_strand1))) { ## TODO: Error message needs to take into account whether 'hits' ## and/or 'ovenc' was supplied or not. stop("'ovenc' is incompatible with the supplied 'query' ", "and/or 'subject' and/or 'hits'") } ## Compute the "query start in first spanned exon". startInFirstSpannedExon <- rep.int(NA_integer_, length(query)) is_on_plus <- query_strand1 == "+" idx <- which(!is.na(exrank) & is_on_plus) startInFirstSpannedExon[idx] <- query_start1[idx] - subject_start1[idx] + 1L idx <- which(!is.na(exrank) & !is_on_plus) startInFirstSpannedExon[idx] <- subject_end1[idx] - query_end1[idx] + 1L ## Truncate each transcript in 'subject' right before the first spanned ## exon and compute the cumulated width of the truncated object. subject2_eltNROWS <- exrank - 1L subject2_eltNROWS[is.na(exrank)] <- 0L subject2 <- .setElementNROWS(subject, subject2_eltNROWS) subject2_cumwidth <- unname(sum(width(subject2))) subject2_cumwidth[is.na(exrank)] <- NA_integer_ ## Compute the "query start in transcript". startInTranscript <- subject2_cumwidth + startInFirstSpannedExon data.frame(startInTranscript=startInTranscript, firstSpannedExonRank=exrank, startInFirstSpannedExon=startInFirstSpannedExon, check.names=FALSE, stringsAsFactors=FALSE) } GenomicAlignments/R/findCompatibleOverlaps-methods.R0000644000175400017540000000264313175714431023637 0ustar00biocbuildbiocbuild### ========================================================================= ### findCompatibleOverlaps ### ------------------------------------------------------------------------- ### setGeneric("findCompatibleOverlaps", function(query, subject) standardGeneric("findCompatibleOverlaps") ) .GAlignmentsORGAlignmentPairs.findCompatibleOverlaps <- function(query, subject) { ## Starting with BioC 3.2, the 'order.as.in.query' argument is not ## supported anymore for GAlignmentPairs objects. if (is(query, "GAlignmentPairs")) grl <- grglist(query) else grl <- grglist(query, order.as.in.query=TRUE) ## TODO: Use 'type="within"' when it's supported for circular ## sequences like the mitochondrial chromosome. ov <- findOverlaps(grl, subject, ignore.strand=TRUE) ovenc <- encodeOverlaps(grl, subject, hits=ov, flip.query.if.wrong.strand=TRUE) ov_is_compat <- isCompatibleWithSplicing(ovenc) ov[ov_is_compat] } setMethod("findCompatibleOverlaps", c("GAlignments", "GRangesList"), .GAlignmentsORGAlignmentPairs.findCompatibleOverlaps ) setMethod("findCompatibleOverlaps", c("GAlignmentPairs", "GRangesList"), .GAlignmentsORGAlignmentPairs.findCompatibleOverlaps ) countCompatibleOverlaps <- function(query, subject) { compatov <- findCompatibleOverlaps(query, subject) tabulate(queryHits(compatov), nbins=queryLength(compatov)) } GenomicAlignments/R/findMateAlignment.R0000644000175400017540000003020113175714431021117 0ustar00biocbuildbiocbuild### ========================================================================= ### findMateAlignment() ### ------------------------------------------------------------------------- ### ### For each element in GAlignments object 'x', finds its mate in GAlignments ### object 'y'. ### ### Alignments 'x[i1]' and 'y[i2]' are considered mates iff they pass all the ### following tests: ### ### (A) names(x[i1]) == names(y[i2]) ### ### (B) mcols(x[i1])$mrnm == seqnames(y[i2]) & ### mcols(y[i2])$mrnm == seqnames(x[i1]) ### ### (C) mcols(x[i1])$mpos == start(y[i2]) & ### mcols(y[i2])$mpos == start(x[i1]) ### ### (D) isMateMinusStrand(x[i1]) == isMinusStrand(y[i2]) & ### isMateMinusStrand(y[i2]) == isMinusStrand(x[i1]) ### ### (E) isFirstSegment(x[i1]) & isLastSegment(y[i2]) | ### isFirstSegment(y[i2]) & isLastSegment(x[i1]) ### ### (F) isProperPair(x[i1]) == isProperPair(y[i2]) ### ### (G) isSecondaryAlignment(x[i1]) == isSecondaryAlignment(y[i2]) .checkMetadatacols <- function(arg, argname) { if (!is(arg, "GAlignments")) stop("'", argname, "' must be a GAlignments object") if (is.null(names(arg))) stop("'", argname, "' must have names") arg_mcols <- mcols(arg) REQUIRED_COLNAMES <- c("flag", "mrnm", "mpos") if (!all(REQUIRED_COLNAMES %in% colnames(arg_mcols))) { colnames_in1string <- paste0("\"", REQUIRED_COLNAMES, "\"", collapse=", ") stop("required columns in 'mcols(", argname, ")': ", colnames_in1string) } if (!is.integer(arg_mcols$flag)) stop("'mcols(", argname, ")$flag' must be an integer vector") if (!is.factor(arg_mcols$mrnm)) stop("'mcols(", argname, ")$mrnm' must be a factor") if (!identical(levels(arg_mcols$mrnm), levels(seqnames(arg)))) stop("'mcols(", argname, ")$mrnm' and 'seqnames(", argname, ")' ", "must have exactly the same levels in the same order") if (!is.integer(arg_mcols$mpos)) stop("'mcols(", argname, ")$mpos' must be an integer vector") arg_mcols } ### 'names', 'flagbits', 'mrnm', and 'mpos', must all come from the same ### GAlignments object x. ### 'names': names(x). ### 'flagbits': integer matrix (of 0's and 1's) obtained with ### bamFlagAsBitMatrix(mcols(x)$flag, bitnames=.MATING_FLAG_BITNAMES) ### 'mrnm': factor obtained with mcols(x)$mrnm ### 'mpos': integer vector obtained with mcols(x)$mpos ### Returns 'names' with NAs injected at positions corresponding to alignments ### that satisfy at least one of following conditions: ### 1. Bit 0x1 (isPaired) is 0 ### 2. Read is neither first or last mate ### 3. Bit 0x8 (hasUnmappedMate) is 1 ### 4. 'mrnm' is NA (i.e. RNEXT = '*') ### 5. 'mpos' is NA (i.e. PNEXT = 0) ### My understanding of the SAM Spec is that 3., 4. and 5. should happen ### simultaneously even though the Spec don't clearly state this. .MATING_FLAG_BITNAMES <- c("isPaired", "hasUnmappedMate", "isFirstMateRead", "isSecondMateRead") .makeGAlignmentsGNames <- function(names, flagbits, mrnm, mpos) { is_paired <- flagbits[ , "isPaired"] is_first <- flagbits[ , "isFirstMateRead"] is_last <- flagbits[ , "isSecondMateRead"] has_unmappedmate <- flagbits[ , "hasUnmappedMate"] alter_idx <- which(!is_paired | is_first == is_last | has_unmappedmate | is.na(mrnm) | is.na(mpos)) names[alter_idx] <- NA_integer_ names } ### Puts NAs last. .getCharacterOrderAndGroupSizes <- function(x) { x2 <- match(x, x, nomatch=.Machine$integer.max, incomparables=NA_character_) xo <- base::order(x2) ox2 <- Rle(x2[xo]) group.sizes <- runLength(ox2) ngroup <- length(group.sizes) if (ngroup != 0L && runValue(ox2)[ngroup] == .Machine$integer.max) group.sizes <- group.sizes[-ngroup] list(xo=xo, group.sizes=group.sizes) } ### Should return the same as: ### args <- as.list(setNames(rep(TRUE, length(bitnames)), bitnames)) ### tmp <- do.call(scanBamFlag, args) ### tmp[[2L]] - tmp[[1L]] .makeFlagBitmask <- function(bitnames) { bitpos <- match(bitnames, FLAG_BITNAMES) sum(as.integer(2L ^ (bitpos-1L))) } ### 'x_hits' and 'y_hits' must be 2 integer vectors of the same length N ### representing the N edges of a bipartite graph between the [1, x_len] and ### [1, y_len] intervals (the i-th edge being represented by (x[i], y[i])). ### Returns an integer vector F of length 'x_len' where F[k] is defined by: ### - If there is no occurence of k in 'x', then F[k] = NA. ### - If there is more than 1 occurence of k in 'x', then F[k] = 0. ### - If there is exactly 1 occurence of k in 'x', at index i_k, then ### F[k] = y[i_k]. ### In addition, if more than 1 value of index k is associated to F[k], then ### F[k] is replaced by -F[k]. .makeMateIdx2 <- function(x_hits, y_hits, x_len) { idx1 <- which(has_duplicates(y_hits)) y_hits[idx1] <- - y_hits[idx1] idx2 <- which(has_duplicates(x_hits)) y_hits[idx2] <- 0L ans <- rep.int(NA_integer_, x_len) ans[x_hits] <- y_hits ans } .showGAlignmentsEltsWithMoreThan1Mate <- function(x, idx) { if (length(idx) == 0L) return() cat("\n!! Found more than 1 mate for the following elements in 'x': ", paste(idx, collapse=", "), ".\n!! Details:\n!! ", sep="") showGAlignments(x[idx], margin="!! ", print.classinfo=TRUE, print.seqinfo=FALSE) cat("!! ==> won't assign a mate to them!\n") } .dump_envir <- new.env(hash=TRUE, parent=emptyenv()) .dumpEnvir <- function() .dump_envir flushDumpedAlignments <- function() { objnames <- ls(envir=.dumpEnvir()) rm(list=objnames, envir=.dumpEnvir()) } dumpAlignments <- function(gal) { objnames <- ls(envir=.dumpEnvir()) nobj <- length(objnames) if (nobj == 0L) { new_objname <- 1L } else { new_objname <- as.integer(objnames[nobj]) + 1L } new_objname <- sprintf("%08d", new_objname) assign(new_objname, gal, envir=.dumpEnvir()) } countDumpedAlignments <- function() { sum(unlist(eapply(.dumpEnvir(), length, USE.NAMES=FALSE))) } getDumpedAlignments <- function() { objnames <- ls(envir=.dumpEnvir()) args <- unname(mget(objnames, envir=.dumpEnvir())) do.call(c, args) } ### Takes about 2.3 s and 170MB of RAM to mate 1 million alignments, ### and about 13 s and 909MB of RAM to mate 5 million alignments. findMateAlignment <- function(x) { x_names <- names(x) if (is.null(x_names)) stop("'x' must have names") x_mcols <- .checkMetadatacols(x, "x") ## flushDumpedAlignments() must be placed *after* the first reference to ## 'x', otherwise, when doing 'findMateAlignment(getDumpedAlignments())', ## the flushing would happen before 'x' is evaluated, causing 'x' to be ## evaluated to NULL. flushDumpedAlignments() x_flag <- x_mcols$flag bitnames <- c(.MATING_FLAG_BITNAMES, "isMinusStrand", "isMateMinusStrand") x_flagbits <- bamFlagAsBitMatrix(x_flag, bitnames=bitnames) x_mrnm <- x_mcols$mrnm x_mpos <- x_mcols$mpos x_gnames <- .makeGAlignmentsGNames(x_names, x_flagbits, x_mrnm, x_mpos) x_seqnames <- as.factor(seqnames(x)) x_start <- start(x) xo_and_GS <- .getCharacterOrderAndGroupSizes(x_gnames) xo <- xo_and_GS$xo group.sizes <- xo_and_GS$group.sizes ans <- Rsamtools:::.findMateWithinGroups(group.sizes, x_flag[xo], x_seqnames[xo], x_start[xo], x_mrnm[xo], x_mpos[xo]) dumpme_idx <- which(ans <= 0L) if (length(dumpme_idx) != 0L) { dumpAlignments(x[xo[dumpme_idx]]) ans[dumpme_idx] <- NA_integer_ } ans[xo] <- xo[ans] # isn't that cute! dump_count <- countDumpedAlignments() if (dump_count != 0L) warning(" ", dump_count, " alignments with ambiguous pairing ", "were dumped.\n Use 'getDumpedAlignments()' to retrieve ", "them from the dump environment.") ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### makeGAlignmentPairs(). ### ### TODO: Make isFirstSegment() an S4 generic function with methods for ### matrices, integer vectors, and GAlignments objects. Put this with the ### flag utils in Rsamtools. .isFirstSegment.matrix <- function(x) { is_paired <- as.logical(x[ , "isPaired"]) is_first0 <- as.logical(x[ , "isFirstMateRead"]) is_last0 <- as.logical(x[ , "isSecondMateRead"]) ## According to SAM Spec, bits 0x40 (isFirstMateRead) and 0x80 ## (isSecondMateRead) can both be set or unset, even when bit 0x1 ## (isPaired) is set. However we are not interested in those situations ## (which have a special meaning). is_paired & is_first0 & (!is_last0) } .isFirstSegment.integer <- function(flag) { bitnames <- c("isPaired", "isFirstMateRead", "isSecondMateRead") .isFirstSegment.matrix(bamFlagAsBitMatrix(flag, bitnames=bitnames)) } .isFirstSegment.GAlignments <- function(x) .isFirstSegment.integer(mcols(x)$flag) ### TODO: Make isLastSegment() an S4 generic function with methods for ### matrices, integer vectors, and GAlignments objects. Put this with the ### flag utils in Rsamtools. .isLastSegment.matrix <- function(x) { is_paired <- as.logical(x[ , "isPaired"]) is_first0 <- as.logical(x[ , "isFirstMateRead"]) is_last0 <- as.logical(x[ , "isSecondMateRead"]) ## According to SAM Spec, bits 0x40 (isFirstMateRead) and 0x80 ## (isSecondMateRead) can both be set or unset, even when bit 0x1 ## (isPaired) is set. However we are not interested in those situations ## (which have a special meaning). is_paired & is_last0 & (!is_first0) } .isLastSegment.integer <- function(flag) { bitnames <- c("isPaired", "isFirstMateRead", "isSecondMateRead") .isLastSegment.matrix(bamFlagAsBitMatrix(flag, bitnames=bitnames)) } .isLastSegment.GAlignments <- function(x) .isLastSegment.integer(mcols(x)$flag) ### 'x' must be a GAlignments objects. makeGAlignmentPairs <- function(x, use.names=FALSE, use.mcols=FALSE, strandMode=1) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!isTRUEorFALSE(use.mcols)) { if (!is.character(use.mcols)) stop("'use.mcols' must be TRUE or FALSE or a character vector ", "specifying the metadata columns to propagate") if (!all(use.mcols %in% colnames(mcols(x)))) stop("'use.mcols' must be a subset of 'colnames(mcols(x))'") } mate <- findMateAlignment(x) x_is_first <- .isFirstSegment.GAlignments(x) x_is_last <- .isLastSegment.GAlignments(x) first_idx <- which(!is.na(mate) & x_is_first) last_idx <- mate[first_idx] ## Fundamental property of the 'mate' vector: it's a permutation of order ## 2 and with no fixed point on the set of indices for which 'mate' is ## not NA. ## Check there are no fixed points. if (!all(first_idx != last_idx)) stop("findMateAlignment() returned an invalid 'mate' vector") ## Check order 2 (i.e. permuting a 2nd time brings back the original ## set of indices). if (!identical(mate[last_idx], first_idx)) stop("findMateAlignment() returned an invalid 'mate' vector") ## One more sanity check. if (!all(x_is_last[last_idx])) stop("findMateAlignment() returned an invalid 'mate' vector") ## Check the 0x2 bit (isProperPair). x_is_proper <- as.logical(bamFlagAsBitMatrix(mcols(x)$flag, bitnames="isProperPair")) ans_is_proper <- x_is_proper[first_idx] ## The big split! ans_first <- x[first_idx] ans_last <- x[last_idx] ans_names <- NULL if (use.names) ans_names <- names(ans_first) names(ans_first) <- names(ans_last) <- NULL if (is.character(use.mcols)) { mcols(ans_first) <- mcols(ans_first)[use.mcols] mcols(ans_last) <- mcols(ans_last)[use.mcols] } else if (!use.mcols) { mcols(ans_first) <- mcols(ans_last) <- NULL } GAlignmentPairs(ans_first, ans_last, strandMode=strandMode, isProperPair=ans_is_proper, names=ans_names) } GenomicAlignments/R/findOverlaps-methods.R0000644000175400017540000001471113175714431021636 0ustar00biocbuildbiocbuild### ========================================================================= ### findOverlaps methods ### ------------------------------------------------------------------------- setMethod("findOverlaps", c("GAlignments", "Vector"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { findOverlaps(grglist(query), subject, maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) } ) setMethod("findOverlaps", c("Vector", "GAlignments"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { findOverlaps(query, grglist(subject), maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) } ) ### Not strictly needed! Defining the above 2 methods covers that case but ### with the following note: ### > findOverlaps(al1, al0) ### Note: Method with signature "GAlignments#ANY" chosen for ### function "findOverlaps", target signature ### "GAlignments#GAlignments". ### "ANY#GAlignments" would also be valid setMethod("findOverlaps", c("GAlignments", "GAlignments"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { findOverlaps(grglist(query), grglist(subject), maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) } ) setMethod("findOverlaps", c("GAlignmentPairs", "Vector"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { findOverlaps(grglist(query), subject, maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) } ) setMethod("findOverlaps", c("Vector", "GAlignmentPairs"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { findOverlaps(query, grglist(subject), maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) } ) setMethod("findOverlaps", c("GAlignmentPairs", "GAlignmentPairs"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { findOverlaps(grglist(query), grglist(subject), maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) } ) setMethod("findOverlaps", c("GAlignmentsList", "Vector"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { hits <- findOverlaps(grglist(unlist(query, use.names = FALSE)), subject, maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) ## TODO: Replace 'factor(togroup(PartitioningByWidth(...)))' with ## 'as.factor(PartitioningByWidth(...))' when "as.factor" method for ## ManyToOneGrouping objects becomes available. query_map <- factor(togroup(PartitioningByWidth(query))) remapHits(hits, Lnodes.remapping=query_map) } ) setMethod("findOverlaps", c("Vector", "GAlignmentsList"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { hits <- findOverlaps(query, grglist(unlist(subject, use.names = FALSE)), maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) ## TODO: Replace 'factor(togroup(PartitioningByWidth(...)))' with ## 'as.factor(PartitioningByWidth(...))' when "as.factor" method for ## ManyToOneGrouping objects becomes available. subject_map <- factor(togroup(PartitioningByWidth(subject))) remapHits(hits, Rnodes.remapping=subject_map) } ) setMethod("findOverlaps", c("GAlignmentsList", "GAlignmentsList"), function(query, subject, maxgap = -1L, minoverlap = 0L, type = c("any", "start", "end", "within"), select = c("all", "first", "last", "arbitrary"), ignore.strand = FALSE) { hits <- findOverlaps(grglist(unlist(query, use.names = FALSE)), grglist(unlist(subject, use.names = FALSE)), maxgap = maxgap, minoverlap = minoverlap, type = match.arg(type), select = match.arg(select), ignore.strand = ignore.strand) ## TODO: Replace 'factor(togroup(PartitioningByWidth(...)))' with ## 'as.factor(PartitioningByWidth(...))' when "as.factor" method for ## ManyToOneGrouping objects becomes available. query_map <- factor(togroup(PartitioningByWidth(query))) subject_map <- factor(togroup(PartitioningByWidth(subject))) remapHits(hits, Lnodes.remapping=query_map, Rnodes.remapping=subject_map) } ) GenomicAlignments/R/findSpliceOverlaps-methods.R0000644000175400017540000003015613175714431022777 0ustar00biocbuildbiocbuild### ========================================================================= ### "findSpliceOverlaps" methods ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Low-level helper functions ### .rangeForSorted <- function(x) { part <- PartitioningByWidth(x) xflat <- unlist(x, use.names=FALSE) IRanges(start(xflat)[start(part)], end(xflat)[end(part)]) } .compatibleTranscription <- function(query, subject, splice, clip=0L) { qrng <- ranges(query) srng <- ranges(subject) sprng <- ranges(splice) ## FIXME : should clip be a modifiable parameter? ## Or we could consider taking it out entirely... the aligner should clip if (clip != 0L) { bounds <- .rangeForSorted(qrng) - clip qrange <- restrict(qrng, start(bounds), end(bounds), keep.all.ranges = TRUE) } bnds <- elementNROWS(setdiff(qrng, srng)) == 0L splc <- elementNROWS(intersect(srng, sprng)) == 0L bnds & splc } .novelBounds <- function(query, subject, qhits) { qrange <- range(query) qstrand <- as.character(strand(qrange)) qrange <- unlist(qrange, use.names=FALSE) srange <- unlist(range(subject), use.names=FALSE) ## bounds violation for each match lviol <- start(qrange) < start(srange) rviol <- end(qrange) > end(srange) TSSviol <- as.logical(ifelse(qstrand != "-", lviol, rviol)) TSEviol <- as.logical(ifelse(qstrand != "+", lviol, rviol)) ## bounds violation across all subjects hit (grouped) lviol <- start(qrange) == start(srange) rviol <- end(qrange) == end(srange) TSSmatch <- as.logical(ifelse(qstrand != "-", lviol, rviol)) TSEmatch <- as.logical(ifelse(qstrand != "+", lviol, rviol)) TSSgroup <- (rowsum(as.integer(TSSmatch), qhits)[,1] > 0L)[factor(qhits)] TSEgroup <- (rowsum(as.integer(TSEmatch), qhits)[,1] > 0L)[factor(qhits)] TSS <- TSSviol & !TSSgroup TSE <- TSEviol & !TSEgroup DataFrame(TSS=TSS, TSE=TSE) } .allMatch <- function(x, idx) { (rowsum(as.integer(x), idx)[,1] == table(idx))[idx] } .oneMatch <- function(x, idx) { xcnt <- rowsum(as.integer(x), idx)[,1] oneMatch <- rep((xcnt == 1L), table(idx)) unname(x & oneMatch) } .novelExon <- function(splice, intronRegion) { splice_eltNROWS <- elementNROWS(splice) if (sum(splice_eltNROWS) == 0L) return(logical(length(splice))) ## subset on elements with splices ans <- logical(length(splice)) idx <- splice_eltNROWS > 0L splice <- splice[idx] internal <- unlist(.gaps(splice), use.names=FALSE) if (sum(length(internal)) == 0L) return(ans) ## FIXME : not competely "within" hits <- findOverlaps(internal, intronRegion, ignore.strand=TRUE) if (length(hits) > 0L) { ans0 <- logical(length(splice)) togroup <- togroup(PartitioningByWidth(splice), j=queryHits(hits)) ne <- table(togroup) == 1L ans0[unique(togroup)] <- ne ans[idx] <- ans0 ans } ans } .novelSpliceEvent <- function(splice, intron) { splice_eltNROWS <- elementNROWS(splice) intron_eltNROWS <- elementNROWS(intron) if (sum(splice_eltNROWS) == 0L | sum(intron_eltNROWS) == 0L) DataFrame(Site=rep.int(FALSE, length(splice)), Junction=rep.int(FALSE, length(splice))) ## subset on elements with splices site <- junction <- rep.int(FALSE, length(splice)) idx <- splice_eltNROWS > 0L splice <- splice[idx] intron <- intron[idx] iflat <- unlist(intron, use.names=FALSE) sflat <- unlist(splice, use.names=FALSE) site[idx] <- .spliceEvent("site", iflat, sflat, splice) junction[idx] <- .spliceEvent("junction", iflat, sflat, splice) DataFrame(Site=site, Junction=junction) } .spliceEvent <- function(type, iflat, sflat, splice) { elt <- togroup(PartitioningByWidth(splice)) if (type == "site") { combiner <- c elt <- rep(elt, each=2) } else if (type == "junction") { combiner <- paste } ikeys <- paste(seqnames(iflat), combiner(start(iflat), end(iflat)), strand(iflat), sep = ":") skeys <- paste(seqnames(sflat), combiner(start(sflat), end(sflat)), strand(sflat), sep = ":") novel <- !(skeys %in% ikeys) rowsum(as.integer(novel), elt) > 0L } .novelRetention <- function(query, intronRegion) { ans <- logical(length(query)) if (length(query) == 0L) return(ans) hits <- findOverlaps(unlist(query, use.names=FALSE), intronRegion, ignore.strand=TRUE) if (length(hits) > 0L) { togroup <- togroup(PartitioningByWidth(query), j=queryHits(hits)) ans[unique(togroup)] <- TRUE } ans } .intronicRegions <- function(tx, intron) { txflt <- unlist(tx, use.names = FALSE) intronflt <- unlist(intron, use.names = FALSE) regions <- setdiff(intronflt, txflt, ignore.strand = TRUE) #map <- findOverlaps(regions, intronflt) #mcols(regions)$tx_id <- # splitAsList(names(tx)[togroup(introns)][subjectHits(intronic_to_tx)], # queryHits(intronic_to_tx)) regions } .result <- function(hits, nc=NULL, compatible=NULL, unique=NULL, coding=NULL, strandSpecific=NULL, novelTSS=NULL, novelTSE=NULL, novelSite=NULL, novelJunction=NULL, novelExon=NULL, novelRetention=NULL) { nms <- c("compatible", "unique", "coding", "strandSpecific", "novelTSS", "novelTSE", "novelSite", "novelJunction", "novelExon", "novelRetention") ## full result if (!is.null(nc)) { mcols(hits) <- DataFrame(compatible, unique, coding, strandSpecific, novelTSS, novelTSE, novelSite, novelJunction, novelExon, novelRetention) hits ## no overlaps } else if (is.null(compatible)) { mat <- matrix(logical(0), length(hits), length(nms)) mcols(hits) <- DataFrame(mat) names(mcols(hits)) <- nms hits ## no compatible overlaps } else { mat <- matrix(FALSE, length(hits), length(nms)) mcols(hits) <- DataFrame(cbind(compatible, unique, coding, strandSpecific, mat)) names(mcols(hits)) <- nms hits } } .insertGaps <- function(reads) { query.break <- mcols(reads)$query.break if (is.null(query.break)) stop("missing 'query.break' metadata variable: reads not paired?") reads_flat <- unlist(reads, use.names = FALSE) reads_part <- PartitioningByWidth(reads) left_end <- start(reads_part) + query.break - 1L right_start <- left_end + 1L start <- end(reads_flat)[left_end] end <- pmax(start(reads_flat)[right_start], start - 1L) if (any(seqnames(reads_flat)[left_end] != seqnames(reads_flat)[right_start])) stop("reads are on different chromosomes") GRanges(seqnames(reads_flat)[left_end], IRanges(start, end), strand(reads_flat)[left_end]) } ## Until we have the formal 'gaps' method for GRangeList .isNumericOrNAs <- S4Vectors:::isNumericOrNAs .gaps <- function(x, start=NA, end=NA) { if (!.isNumericOrNAs(start)) stop("'start' must be an integer vector or NA") if (!is.integer(start)) start <- as.integer(start) if (!.isNumericOrNAs(end)) stop("'end' must be an integer vector or NA") if (!is.integer(end)) end <- as.integer(end) ## seqname and strand consistent in list elements if (all(elementNROWS(runValue(seqnames(x))) == 1L) && all(elementNROWS(runValue(strand(x))) == 1L)) { flat <- unlist(x, use.names=FALSE) gaps <- gaps(ranges(x), start, end) ### FIXME: this makes this function more of an 'introns' than a .gaps. ### FIXME: this breaks when the GRangesList is not ordered by position if (!is.null(mcols(x)$query.break)) { insert_gaps <- as(ranges(.insertGaps(x)), "RangesList") gaps <- setdiff(gaps, insert_gaps) } idx <- elementNROWS(gaps) != 0 ## FIXME : can't handle lists with empty elements ## 'start' and 'end' not quite right here firstseg <- start(PartitioningByWidth(x)) seqnms <- rep(seqnames(flat)[firstseg], elementNROWS(gaps)) strand <- rep(strand(flat)[firstseg], elementNROWS(gaps)) gr <- relist(GRanges(seqnms, unlist(gaps, use.names=FALSE), strand), gaps) gr } else { ### FIXME: does not handle query.break column yet setdiff(range(x), x) } } .findSpliceOverlaps <- function(query, subject, ignore.strand=FALSE, cds=NULL) { ## adjust strand based on 'XS' if (!is.null(xs <- mcols(query)$XS)) { strand <- ifelse(!is.na(xs), xs, "*") strand(query) <- relist(Rle(strand, elementNROWS(query)), query) } ## NOTE: this misses reads completely within an intron, but this ## is intentional: a read is only assigned to a transcript if it ## hits an exon. Otherwise, it could be from another gene inside ## an intron (happens frequently). olap <- findOverlaps(query, subject, ignore.strand=ignore.strand) if (length(olap) == 0L) return(.result(olap)) if (!is.null(cds)) { coding <- logical(length(olap)) hits <- findOverlaps(query, cds, ignore.strand=ignore.strand) coding[queryHits(olap) %in% queryHits(hits)] <- TRUE } else { coding <- rep.int(NA, length(olap)) } query <- query[queryHits(olap)] subject <- subject[subjectHits(olap)] splice <- .gaps(query) compatible <- .compatibleTranscription(query, subject, splice) unique <- .oneMatch(compatible, queryHits(olap)) strandSpecific <- all(strand(query) != "*") mcols(olap) <- DataFrame(compatible, unique, coding, strandSpecific) olap } setGeneric("findSpliceOverlaps", signature=c("query", "subject"), function(query, subject, ignore.strand=FALSE, ...) standardGeneric("findSpliceOverlaps") ) setMethod("findSpliceOverlaps", c("GRangesList", "GRangesList"), function(query, subject, ignore.strand=FALSE, ..., cds=NULL) { .findSpliceOverlaps(query, subject, ignore.strand, cds=cds) }) setMethod("findSpliceOverlaps", c("GAlignments", "GRangesList"), function(query, subject, ignore.strand=FALSE, ..., cds=NULL) { findSpliceOverlaps(grglist(query, order.as.in.query=TRUE), subject, ignore.strand, ..., cds=cds) }) setMethod("findSpliceOverlaps", c("GAlignmentPairs", "GRangesList"), function(query, subject, ignore.strand=FALSE, ..., cds=NULL) { ### FIXME: ### instead of relying on query.break column, maybe we should add a ### 'splice = .gaps(query)' argument to .findSpliceOverlaps that we ### set to junctions(query) here. The downside is that a GRangesList ### derived from GAlignmentPairs will no longer work. findSpliceOverlaps(grglist(query), subject, ignore.strand, ..., cds=cds) }) setMethod("findSpliceOverlaps", c("character", "ANY"), function(query, subject, ignore.strand=FALSE, ..., param=ScanBamParam(), singleEnd=TRUE) { findSpliceOverlaps(BamFile(query), subject, ignore.strand, ..., param=param, singleEnd=singleEnd) }) setMethod("findSpliceOverlaps", c("BamFile", "ANY"), function(query, subject, ignore.strand=FALSE, ..., param=ScanBamParam(), singleEnd=TRUE) { findSpliceOverlaps(.readRanges(query, param, singleEnd), subject, ignore.strand, ...) }) .readRanges <- function(bam, param, singleEnd) { if (!"XS" %in% bamTag(param)) bamTag(param) <- c(bamTag(param), "XS") if (singleEnd) reads <- readGAlignments(bam, param=param) else { reads <- readGAlignmentPairs(path(bam), param=param) first_xs <- mcols(first(reads))$XS last_xs <- mcols(last(reads))$XS if (!is.null(first_xs) && !is.null(last_xs)) { xs <- first_xs xs[is.na(xs)] <- last_xs[is.na(xs)] mcols(reads)$XS <- xs } } metadata(reads)$bamfile <- bam reads } GenomicAlignments/R/intra-range-methods.R0000644000175400017540000000657513175714431021422 0ustar00biocbuildbiocbuild### ========================================================================= ### Intra-range methods ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### updateCigarAndStart() -- NOT exported ### setGeneric("updateCigarAndStart", function(x, cigar=NULL, start=NULL) standardGeneric("updateCigarAndStart") ) setMethod("updateCigarAndStart", "GAlignments", function(x, cigar=NULL, start=NULL) { if (is.null(cigar)) { cigar <- cigar(x) } else { if (!is.character(cigar) || length(cigar) != length(x)) stop("when not NULL, 'cigar' must be a character vector ", "of the same length as 'x'") ## There might be an "rshift" attribute on 'cigar', typically. ## We want to get rid of it as well as any other potential ## attribute like names, dim, dimnames etc... attributes(cigar) <- NULL } if (is.null(start)) start <- start(x) else if (!is.integer(start) || length(start) != length(x)) stop("when not NULL, 'start' must be an integer vector ", "of the same length as 'x'") x@cigar <- cigar x@start <- start x } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### narrow() ### setMethod("narrow", "GAlignments", function(x, start=NA, end=NA, width=NA, use.names=TRUE) .narrowGAlignments(x, cigarNarrow, start, end, width) ) setMethod("narrow", "GAlignmentsList", function(x, start=NA, end=NA, width=NA, use.names=TRUE) { gal <- narrow(x@unlistData, start=start, end=end, width=width, use.names=use.names) relist(gal, x@partitioning) } ) setMethod("narrow", "GappedReads", function(x, start=NA, end=NA, width=NA, use.names=TRUE) { stop("coming soon") ## ans_cigar <- cigarNarrow(cigar(x), ## start=start, end=end, width=width) ## ans_start <- start(x) + attr(ans_cigar, "rshift") ## updateCigarAndStart(x, cigar=ans_cigar, start=ans_start) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### qnarrow() ### setGeneric("qnarrow", signature="x", function(x, start=NA, end=NA, width=NA) standardGeneric("qnarrow") ) .narrowGAlignments <- function(x, CIGAR_CUTTER, start, end, width) { ans_cigar <- CIGAR_CUTTER(cigar(x), start=start, end=end, width=width) ans_start <- start(x) + attr(ans_cigar, "rshift") updateCigarAndStart(x, cigar=ans_cigar, start=ans_start) } setMethod("qnarrow", "GAlignments", function(x, start=NA, end=NA, width=NA) .narrowGAlignments(x, cigarQNarrow, start, end, width) ) setMethod("qnarrow", "GAlignmentsList", function(x, start=NA, end=NA, width=NA) { gal <- qnarrow(x@unlistData, start=start, end=end, width=width) relist(gal, x@partitioning) } ) setMethod("qnarrow", "GappedReads", function(x, start=NA, end=NA, width=NA) { stop("coming soon") ## ans_cigar <- cigarQNarrow(cigar(x), ## start=start, end=end, width=width) ## ans_start <- start(x) + attr(ans_cigar, "rshift") ## updateCigarAndStart(x, cigar=ans_cigar, start=ans_start) } ) GenomicAlignments/R/junctions-methods.R0000644000175400017540000003232613175714431021220 0ustar00biocbuildbiocbuild### ========================================================================= ### Extract junctions from genomic alignments ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### junctions() generic and methods. ### setGeneric("junctions", signature="x", function(x, use.mcols=FALSE, ...) standardGeneric("junctions") ) setMethod("junctions", "GAlignments", function(x, use.mcols=FALSE) { if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") rgl <- cigarRangesAlongReferenceSpace(cigar(x), pos=start(x), ops="N") names(rgl) <- names(x) ans <- make_GRangesList_from_CompressedIRangesList(rgl, seqnames(x), strand(x), seqinfo(x)) if (use.mcols) mcols(ans) <- mcols(x) ans } ) setMethod("junctions", "GAlignmentPairs", function(x, use.mcols=FALSE) { if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") first_junctions <- junctions(first(x, real.strand=TRUE)) last_junctions <- junctions(last(x, real.strand=TRUE)) ## pc() is a fast "parallel c()" for list-like objects. ## In the case below, it's equivalent to (but faster than) doing ## 'mendoapply(c, first_junctions, last_junctions)'. ans <- pc(first_junctions, last_junctions) if (use.mcols) { mcols(ans) <- mcols(x) } else { mcols(ans) <- NULL } ans } ) setMethod("junctions", "GAlignmentsList", function(x, use.mcols=FALSE, ignore.strand=FALSE) { if (!isTRUEorFALSE(use.mcols)) stop("'use.mcols' must be TRUE or FALSE") if (!isTRUEorFALSE(ignore.strand)) stop("'ignore.strand' must be TRUE or FALSE") if (ignore.strand) strand(x@unlistData) <- "*" grl <- junctions(x@unlistData) ans_breakpoints <- end(grl@partitioning)[end(x@partitioning)] ans_partitioning <- PartitioningByEnd(ans_breakpoints, names=names(x)) ans <- relist(grl@unlistData, ans_partitioning) if (use.mcols) mcols(ans) <- mcols(x) ans } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Natural intron motifs taken from: ### http://www.ncbi.nlm.nih.gov/pmc/articles/PMC84117/ NATURAL_INTRON_MOTIFS <- c("GT-AG", "GC-AG", "AT-AC", "AT-AA", "AT-AG") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### summarizeJunctions() ### .extract_unoriented_intron_motif <- function(genome, junctions) { mcols(junctions) <- NULL junctions_len <- length(junctions) Ldinucl_gr <- Rdinucl_gr <- junctions end(Ldinucl_gr) <- start(Ldinucl_gr) + 1L start(Rdinucl_gr) <- end(Rdinucl_gr) - 1L all_dinucl <- getSeq(genome, c(Ldinucl_gr, Rdinucl_gr)) Ldinucl <- head(all_dinucl, n=junctions_len) Rdinucl <- tail(all_dinucl, n=junctions_len) xscat(Ldinucl, "-", Rdinucl) } .infer_intron_strand <- function(unoriented_intron_motif) { natural_intron_motifs <- DNAStringSet(NATURAL_INTRON_MOTIFS) intron_strand <- rep.int(NA, length(unoriented_intron_motif)) idx <- which(unoriented_intron_motif %in% natural_intron_motifs) intron_strand[idx] <- FALSE idx <- which(unoriented_intron_motif %in% reverseComplement(natural_intron_motifs)) intron_strand[idx] <- TRUE if (any(is.na(intron_strand))) warning("For some junctions, the dinucleotides found at the intron ", "boundaries don't\n match any of the natural intron motifs ", "stored in predefined character vector\n ", "'NATURAL_INTRON_MOTIFS'. For these junctions, the ", "intron_motif and\n intron_strand metadata columns ", "were set to NA and *, respectively.") strand(intron_strand) } .orient_intron_motif <- function(unoriented_intron_motif, intron_strand) { ans <- unoriented_intron_motif idx <- which(intron_strand == "-") ans[idx] <- reverseComplement(ans[idx]) ans <- factor(as.character(ans), levels=NATURAL_INTRON_MOTIFS) } summarizeJunctions <- function(x, with.revmap=FALSE, genome=NULL) { if (!isTRUEorFALSE(with.revmap)) stop("'with.revmap' must be TRUE or FALSE") if (!is.null(genome)) { if (!suppressWarnings(require(BSgenome, quietly=TRUE))) stop("you need to install the BSgenome package in order ", "to use the 'genome' argument") genome <- BSgenome::getBSgenome(genome) } x_junctions <- junctions(x) unlisted_junctions <- unlist(x_junctions, use.names=FALSE) unstranded_unlisted_junctions <- unstrand(unlisted_junctions) ans <- sort(unique(unstranded_unlisted_junctions)) unq2dups <- as(findMatches(ans, unstranded_unlisted_junctions), "List") ans_score <- elementNROWS(unq2dups) tmp <- extractList(strand(unlisted_junctions), unq2dups) ans_plus_score <- sum(tmp == "+") ans_minus_score <- sum(tmp == "-") ans_mcols <- DataFrame(score=ans_score, plus_score=ans_plus_score, minus_score=ans_minus_score) if (with.revmap) { crossed_by <- togroup(PartitioningByWidth(x_junctions)) ans_revmap <- extractList(crossed_by, unq2dups) ## 'ans_revmap' should never contain duplicates when 'x' is a ## GAlignments object, because a given junction can show up at most ## once per SAM/BAM record (i.e. per element in 'x', or per alignment). ## This doesn't hold anymore if the elements in 'x' consist of more ## than 1 SAM/BAM record (or alignment) e.g. if 'x' is a ## GAlignmentPairs or GAlignmentsList object, because, in that case, ## the same junction can show up more than once per element in 'x'. if (!is(x, "GAlignments")) ans_revmap <- unique(ans_revmap) ans_mcols$revmap <- ans_revmap } if (!is.null(genome)) { unoriented_intron_motif <- .extract_unoriented_intron_motif(genome, ans) ans_intron_strand <- .infer_intron_strand(unoriented_intron_motif) ans_intron_motif <- .orient_intron_motif(unoriented_intron_motif, ans_intron_strand) ans_mcols <- cbind(ans_mcols, DataFrame(intron_motif=ans_intron_motif, intron_strand=ans_intron_strand)) } mcols(ans) <- ans_mcols ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readTopHatJunctions() ### ### Read splice junctions file (junctions.bed) generated by the TopHat ### aligner into a GRanges object. ### Usage: ### readTopHatJunctions("junctions.bed") ### ### Comparing with output of bed_to_juncs script (assuming the ### 'new_list.juncs' file was obtained by passing 'junctions.bed' thru ### bed_to_juncs): ### junctions1 <- readTopHatJunctions("junctions.bed") ### junctions2 <- readTopHatJunctions("new_list.juncs", ### file.is.raw.juncs=TRUE) ### stopifnot(all(junctions1 == junctions2)) ### .bed_to_Juncs <- function(x) { if (!is(x, "GRanges")) stop("'x' must be a GRanges object") if (!identical(mcols(x)$thick, ranges(x))) stop("this BED file doesn't look like the junctions.bed file ", "generated by TopHat") blocks <- mcols(x)$blocks stopifnot(all(elementNROWS(blocks) == 2L)) unlisted_blocks <- unlist(blocks, use.names=FALSE) even_idx <- 2L * seq_along(x) odd_idx <- even_idx - 1L ans_start <- start(x) + end(unlisted_blocks)[odd_idx] ans_end <- start(x) + start(unlisted_blocks)[even_idx] - 2L ans <- GRanges(seqnames(x), IRanges(ans_start, ans_end), strand=strand(x)) mcols(ans) <- DataFrame(name=mcols(x)$name, score=as.integer(mcols(x)$score)) ans } ### 'file' must be the path or a connection object to a junctions.bed file as ### generated by TopHat, or to a tab-delimited file obtained by running ### TopHat's bed_to_juncs script on a junctions.bed file. ### Returns the junctions in a GRanges object. ### IMPORTANT NOTE: readTopHatJunctions() does NOT follow the convention used ### by TopHat that describes a junction by the position of the nucleotide ### immediately before and after the intron. In the GRanges object returned ### by readTopHatJunctions(), a junction is considered to start at the ### left-most and to end at the right-most nucleotide of the intron. readTopHatJunctions <- function(file, file.is.raw.juncs=FALSE) { if (!isTRUEorFALSE(file.is.raw.juncs)) stop("'file.is.raw.juncs' must be TRUE or FALSE") if (is.character(file)) { if (!isSingleString(file)) stop("'file' must be a single string") file_ext0 <- ".bed" file_ext <- substr(file, start=nchar(file) - nchar(file_ext0) + 1L, stop=nchar(file)) if (file.is.raw.juncs) { if (file_ext == file_ext0) stop("'file.is.raw.juncs=TRUE' is not aimed to be ", "used on a file\n with the .bed extension") df <- read.table(file, stringsAsFactors=FALSE) ## The 2nd and 3rd columns in 'new_list.juncs' are the left and ## right positions of the junctions, respectively. The convention ## used by TopHat is that these are NOT the positions of the ## left-most and right-most nucleotides of the intron, but rather ## the positions immediately before and after, respectively, that ## is, the last and the first positions of the flanking exons. ## Also these positions are *both* 0-based. ans_ranges <- IRanges(df[[2L]] + 2L, df[[3L]]) ans <- GRanges(df[[1L]], ans_ranges, strand=df[[4L]]) return(ans) } if (file_ext != file_ext0) warning("'file' has no .bed extension, suggesting it may not ", "be a junctions.bed\n file as generated by TopHat. ", "I will assume it is this file anyway (or a BED\n file ", "with similar content). If 'file' is a tab-delimited ", "file obtained\n by running TopHat's bed_to_juncs script ", "on a junctions.bed file, you\n should use ", "'file.is.raw.juncs=TRUE'") } junctions_bed <- rtracklayer::import(file) .bed_to_Juncs(junctions_bed) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readSTARJunctions() ### ### Read splice junctions file (SJ.out.tab) generated by the STAR aligner ### into a GRanges object. ### Usage: ### readSTARJunctions("SJ.out.tab") ### .STAR_INTRON_MOTIFS <- c("GT-AG", "CT-AC", "GC-AG", "CT-GC", "AT-AC", "GT-AT") .get_STAR_intron_motif_levels <- function() { ans <- .STAR_INTRON_MOTIFS[(1:3)*2L - 1L] stopifnot(all(ans == NATURAL_INTRON_MOTIFS[1:3])) rev_motifs <- .STAR_INTRON_MOTIFS[(1:3)*2L] stopifnot(all(rev_motifs == reverseComplement(DNAStringSet(ans)))) ans } readSTARJunctions <- function(file) { motif123 <- .get_STAR_intron_motif_levels() df <- read.table(file, stringsAsFactors=FALSE) ans_seqnames <- df[[1L]] ans_start <- df[[2L]] ans_end <- df[[3L]] ans_strand <- strand(df[[4L]] == 2L) STAR_intron_motif_code <- df[[5L]] if (!is.integer(ans_start) || !is.integer(ans_end) || !is.integer(STAR_intron_motif_code) || S4Vectors:::anyMissingOrOutside(STAR_intron_motif_code, lower=0L, upper=6L)) stop("'file' does not look like a junction file generated ", "by the STAR aligner (normally the SJ.out.tab file)") STAR_intron_motif_code[STAR_intron_motif_code == 0L] <- NA_integer_ code1 <- STAR_intron_motif_code + 1L ans_intron_motif <- factor(motif123[code1 %/% 2L], levels=motif123) ans_intron_strand <- strand(as.logical(code1 %% 2L)) has_code_zero <- is.na(ans_intron_motif) stopifnot(identical(has_code_zero, ans_intron_strand == "*")) idx0 <- which(!has_code_zero) if (!identical(ans_strand[idx0], ans_intron_strand[idx0])) warning("For some junctions, the strand reported in the motif_strand ", "metadata column\n (which was inferred from the STAR intron ", "motif code stored in column 5 of\n 'file') is conflicting ", "with the strand of the junction reported in column 4\n ", "of 'file'. Bug in STAR? Obscure feature? Or corrupted file? ", "Please ask on the\n STAR general user mailing list ", "(https://groups.google.com/d/forum/rna-star)\n for ", "clarifications about this (only if you're confident that ", "your SJ.out.tab\n file is not corrupted though).") GRanges(ans_seqnames, IRanges(ans_start, ans_end), strand=ans_strand, intron_motif=ans_intron_motif, intron_strand=ans_intron_strand, um_reads=df[[7L]], mm_reads=df[[8L]]) } GenomicAlignments/R/pileLettersAt.R0000644000175400017540000001105113175714431020314 0ustar00biocbuildbiocbuild### ========================================================================= ### pileLettersAt() ### ------------------------------------------------------------------------- ### .pileLettersOnSingleRefAt() is the workhorse behind pileLettersAt(). ### 'x', 'pos', 'cigar': 3 parallel vectors describing N strings aligned ### to the same reference sequence. 'x' must be an XStringSet (typically ### DNAStringSet) object containing the unaligned strings (a.k.a. the ### query sequences) reported with respect to the + strand. 'pos' must ### be an integer vector where 'pos[i]' is the 1-based position on the ### reference sequence of the first aligned letter in 'x[[i]]'. 'cigar' ### must be a character vector containing the extended CIGAR strings. ### 'at': must be an integer vector containing the positions of interest ### with respect to the reference sequence. ### Returns an XStringSet (typically DNAStringSet) object parallel to ### 'at' (i.e. with 1 string per position of interest). .pileLettersOnSingleRefAt <- function(x, pos, cigar, at) { stopifnot(is(x, "XStringSet")) N <- length(x) # nb of alignments stopifnot(is.integer(pos) && length(pos) == N) stopifnot(is.character(cigar) && length(cigar) == N) stopifnot(is.integer(at)) ops <- c("M", "=", "X") ranges_on_ref <- cigarRangesAlongReferenceSpace(cigar, pos=pos, ops=ops) ranges_on_query <- cigarRangesAlongQuerySpace(cigar, ops=ops) ## 'ranges_on_ref' and 'ranges_on_query' are IRangesList objects parallel ## to 'x', 'pos', and 'cigar'. In addition, the 2 IRangesList objects ## have the same "shape" (i.e. same elementNROWS()), so, after ## unlisting, the 2 unlisted objects are parallel IRanges objects. unlisted_ranges_on_ref <- unlist(ranges_on_ref, use.names=FALSE) unlisted_ranges_on_query <- unlist(ranges_on_query, use.names=FALSE) ## 2 integer vectors parallel to IRanges objects 'unlisted_ranges_on_ref' ## and 'unlisted_ranges_on_query' above. range_group <- togroup(PartitioningByWidth(ranges_on_ref)) query2ref_shift <- start(unlisted_ranges_on_ref) - start(unlisted_ranges_on_query) hits <- findOverlaps(at, unlisted_ranges_on_ref) hits_at_in_x <- at[queryHits(hits)] - query2ref_shift[subjectHits(hits)] hits_group <- range_group[subjectHits(hits)] unlisted_piles <- subseq(x[hits_group], start=hits_at_in_x, width=1L) piles_skeleton <- PartitioningByEnd(queryHits(hits), NG=length(at), names=names(at)) piles <- relist(unlisted_piles, piles_skeleton) unstrsplit(piles) } ### 'x', 'seqnames', 'pos', 'cigar': 4 parallel vectors describing N ### aligned strings. 'x', 'pos', and 'cigar' as above. 'seqnames' must ### be a factor-Rle where 'seqnames[i]' is the name of the reference ### sequence of the i-th alignment. ### 'at': must be a GPos object containing the genomic positions of ### interest. 'seqlevels(at)' must be identical to 'levels(seqnames)'. ### Returns an XStringSet (typically DNAStringSet) object parallel to ### 'at' (i.e. with 1 string per genomic position of interest). pileLettersAt <- function(x, seqnames, pos, cigar, at) { stopifnot(is(x, "XStringSet")) N <- length(x) # nb of alignments stopifnot(is(seqnames, "Rle")) stopifnot(is.factor(runValue(seqnames))) stopifnot(length(seqnames) == N) stopifnot(is.integer(pos) && length(pos) == N) stopifnot(is.character(cigar) && length(cigar) == N) if (!is(at, "GPos")) at <- GPos(at) stopifnot(identical(seqlevels(at), levels(seqnames))) ## We process 1 chromosome at a time. So we start by splitting ## 'x', 'pos', 'cigar', and 'start(at)' by chromosome. The 4 ## resulting list-like objects have 1 list element per chromosome ## in 'seqlevels(at)' (or in 'levels(seqnames)', which is identical ## to 'seqlevels(at)'). x_by_chrom <- split(x, seqnames) # XStringSetList pos_by_chrom <- split(pos, seqnames) # IntegerList cigar_by_chrom <- split(cigar, seqnames) # CharacterList at_by_chrom <- split(start(at), seqnames(at)) # IntegerList ## Unsplit index. split_idx <- unlist(split(seq_along(at), seqnames(at)), use.names=FALSE) unsplit_idx <- integer(length(at)) unsplit_idx[split_idx] <- seq_along(at) do.call("c", lapply(seq_along(seqlevels(at)), function(i) .pileLettersOnSingleRefAt( x_by_chrom[[i]], pos_by_chrom[[i]], cigar_by_chrom[[i]], at_by_chrom[[i]])))[unsplit_idx] } GenomicAlignments/R/readGAlignments.R0000644000175400017540000003630013175714431020603 0ustar00biocbuildbiocbuild### ========================================================================= ### readGAlignments() and related functions ### ------------------------------------------------------------------------- ### A "flag filter" is represented as a 'flag' vector of length 2 with names ### keep0 and keep1. The .combineBamFlagFilters() function performs a logical ### AND between 2 "flag filters". It returns a "flag filter". .combineBamFlagFilters <- function(flagfilterA, flagfilterB) { if (!identical(names(flagfilterA), c("keep0", "keep1")) || !identical(names(flagfilterB), c("keep0", "keep1"))) stop("input must be BAM flag filters") ans <- bamFlagAND(flagfilterA, flagfilterB) if (!all(bamFlagAsBitMatrix(ans[["keep0"]]) | bamFlagAsBitMatrix(ans[["keep1"]]))) stop("BAM flag filters to combine are incompatible") ans } .normargParam <- function(param, flag0, what0) { if (is.null(param)) param <- ScanBamParam() bamFlag(param) <- .combineBamFlagFilters(bamFlag(param, asInteger=TRUE), flag0) bamWhat(param) <- union(bamWhat(param), what0) param } ### 'x' must be a GAlignments object. .bindExtraData <- function(x, use.names, param, bamcols, with.which_label=FALSE) { if (use.names) names(x) <- bamcols$qname if (is.null(param)) return(x) colnames <- c(bamWhat(param), bamTag(param)) if (with.which_label) colnames <- c(colnames, "which_label") if (length(colnames) != 0L) { df <- do.call(DataFrame, bamcols[colnames]) ## Sadly, the DataFrame() constructor is mangling the duplicated ## colnames to make them unique. Since we of course don't want this, ## we need to fix them. colnames(df) <- colnames mcols(x) <- df } x } .load_bamcols_from_BamFile <- function(file, param, what0, with.which_label=FALSE) { flag0 <- scanBamFlag(isUnmappedQuery=FALSE) param <- .normargParam(param, flag0, what0) res <- scanBam(file, param=param) if (length(res) == 0L) # should never happen stop("scanBam() returned a list of length zero") Rsamtools:::.load_bamcols_from_scanBam_res(res, param, with.which_label=with.which_label) } .load_seqlengths_from_BamFile <- function(file, seqlevels) { seqlengths <- seqlengths(file) if (is.null(seqlengths)) return(NULL) bad <- setdiff(seqlevels, names(seqlengths)) if (length(bad) == 0L) return(seqlengths) bad <- paste(bad, collapse="' '") msg <- sprintf("'rname' lengths not in BamFile header; seqlengths not used\n file: %s\n missing rname(s): '%s'", path(file), bad) warning(msg) NULL } .open_BamFile <- function(file, index=file, asMates=FALSE, param=NULL) { if ((missing(index) || identical(index, file)) && (is.null(param) || length(bamWhich(param)) == 0L)) index <- character(0) open(BamFile(file, index=index, asMates=asMates), "rb") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGAlignments() ### setGeneric("readGAlignments", signature="file", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) standardGeneric("readGAlignments") ) .readGAlignments.BamFile <- function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (is.null(param)) param <- ScanBamParam() if (!asMates(file)) bamWhat(param) <- setdiff(bamWhat(param), c("groupid", "mate_status")) what0 <- c("rname", "strand", "pos", "cigar") if (use.names) what0 <- c(what0, "qname") bamcols <- .load_bamcols_from_BamFile(file, param, what0, with.which_label=with.which_label) seqlengths <- .load_seqlengths_from_BamFile(file, levels(bamcols[["rname"]])) ans <- GAlignments(seqnames=bamcols$rname, pos=bamcols$pos, cigar=bamcols$cigar, strand=bamcols$strand, seqlengths=seqlengths) .bindExtraData(ans, use.names, param, bamcols, with.which_label=with.which_label) } setMethod("readGAlignments", "BamFile", .readGAlignments.BamFile) setMethod("readGAlignments", "character", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) { bam <- .open_BamFile(file, index=index, param=param) on.exit(close(bam)) readGAlignments(bam, character(0), use.names=use.names, param=param, with.which_label=with.which_label) } ) setMethod("readGAlignments", "BamViews", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) { if (missing(index)) index <- bamIndicies(file) if (is.null(param)) { param <- ScanBamParam(which=bamRanges(file)) } else if (!identical(bamRanges(file), bamWhich(param))) { warning("'bamRanges(file)' and 'bamWhich(param)' differ; using 'bamRanges(file)'") bamWhich(param) <- bamRanges(file) } fun <- function(i, bamViews, verbose) readGAlignments(file=bamPaths(bamViews)[i], index=bamIndicies(bamViews)[i], use.names=use.names, param=param, with.which_label=with.which_label) ### Rsamtools:::.BamViews_delegate requires the ShortRead package! Rsamtools:::.BamViews_delegate("readGAlignments", file, fun) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGAlignmentPairs() ### setGeneric("readGAlignmentPairs", signature="file", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE, strandMode=1) standardGeneric("readGAlignmentPairs") ) ### 'use.mcols' can be TRUE, FALSE, or a character vector specifying the ### *inner* metadata columns to return, i.e., the metadata columns to set on ### the 2 halves of the returned GAlignmentPairs object. .make_GAlignmentPairs_from_GAlignments <- function(gal, strandMode=1L, use.mcols=FALSE) { groupid <- Rle(mcols(gal)[ , "groupid"]) stopifnot(isStrictlySorted(runValue(groupid))) mate_status <- Rle(mcols(gal)[ , "mate_status"]) ## Dump alignments with "ambiguous" mate status. flushDumpedAlignments() dumped_gal <- gal[mate_status == "ambiguous"] dumped_count <- length(dumped_gal) if (dumped_count != 0L) { dumpAlignments(dumped_gal) warning(" ", dumped_count, " alignments with ambiguous pairing ", "were dumped.\n Use 'getDumpedAlignments()' to retrieve ", "them from the dump environment.") } ## Keep alignments that (1) have a mate status set to "mated" and ## (2) belong to a group of size 2. ok <- mate_status == "mated" & Rle(runLength(groupid) == 2L, runLength(groupid)) if (!all(ok)) gal <- gal[ok] ## Check flag bits 0x40 and 0x80. flag <- mcols(gal)[ , "flag"] is_first_mate <- as.logical(bamFlagAsBitMatrix(flag, bitnames="isFirstMateRead")) is_last_mate <- as.logical(bamFlagAsBitMatrix(flag, bitnames="isSecondMateRead")) bits_0x40_0x80_are_ok <- is_first_mate != is_last_mate stopifnot(all(bits_0x40_0x80_are_ok)) ## Split and order the pairs by ascending start position of the first mate. idx1 <- which(is_first_mate) idx2 <- which(is_last_mate) oo1 <- orderIntegerPairs(as.integer(gal@seqnames)[idx1], gal@start[idx1]) idx1 <- idx1[oo1] idx2 <- idx2[oo1] ans_first <- gal[idx1] ans_last <- gal[idx2] groupid1 <- mcols(ans_first)[ , "groupid"] groupid2 <- mcols(ans_last)[ , "groupid"] stopifnot(identical(groupid1, groupid2)) ## Drop the names. ans_names <- names(ans_first) names(ans_first) <- names(ans_last) <- NULL ## Check isProperPair (0x2) and isSecondaryAlignment (0x100) flag bits. flag1 <- mcols(ans_first)[ , "flag"] flag2 <- mcols(ans_last)[ , "flag"] is_proper1 <- bamFlagAsBitMatrix(flag1, bitnames="isProperPair") is_proper2 <- bamFlagAsBitMatrix(flag2, bitnames="isProperPair") stopifnot(identical(is_proper1, is_proper2)) is_secondary1 <- bamFlagAsBitMatrix(flag1, bitnames="isSecondaryAlignment") is_secondary2 <- bamFlagAsBitMatrix(flag2, bitnames="isSecondaryAlignment") stopifnot(identical(is_secondary1, is_secondary2)) ## Make the GAlignmentPairs object and return it. if (is.character(use.mcols)) { mcols(ans_first) <- mcols(ans_first)[use.mcols] mcols(ans_last) <- mcols(ans_last)[use.mcols] } else if (!use.mcols) { mcols(ans_first) <- mcols(ans_last) <- NULL } GAlignmentPairs(ans_first, ans_last, strandMode=strandMode, isProperPair=as.logical(is_proper1), names=ans_names) } .readGAlignmentPairs.BamFile <- function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE, strandMode=1) { if (!asMates(file)) { asMates(file) <- TRUE ## This is required because BamFile objects have a pass-by-address ## semantic. on.exit(asMates(file) <- FALSE) } if (is.null(param)) param <- ScanBamParam() flag0 <- scanBamFlag(isPaired=TRUE, hasUnmappedMate=FALSE) what0 <- c("flag", "groupid", "mate_status") param2 <- .normargParam(param, flag0, what0) gal <- readGAlignments(file, use.names=use.names, param=param2, with.which_label=with.which_label) use.mcols <- c(bamWhat(param), bamTag(param)) if (with.which_label) use.mcols <- c(use.mcols, "which_label") .make_GAlignmentPairs_from_GAlignments(gal, strandMode=strandMode, use.mcols=use.mcols) } setMethod("readGAlignmentPairs", "BamFile", .readGAlignmentPairs.BamFile) setMethod("readGAlignmentPairs", "character", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE, strandMode=1) { bam <- .open_BamFile(file, index=index, asMates=TRUE, param=param) on.exit(close(bam)) readGAlignmentPairs(bam, character(0), use.names=use.names, param=param, with.which_label=with.which_label, strandMode=strandMode) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGAlignmentsList() ### setGeneric("readGAlignmentsList", signature="file", function(file, index=file, use.names=FALSE, param=ScanBamParam(), with.which_label=FALSE) standardGeneric("readGAlignmentsList") ) .matesFromBam <- function(file, use.names, param, what0, with.which_label) { bamcols <- .load_bamcols_from_BamFile(file, param, what0, with.which_label=with.which_label) seqlengths <- .load_seqlengths_from_BamFile(file, levels(bamcols$rname)) gal <- GAlignments(seqnames=bamcols$rname, pos=bamcols$pos, cigar=bamcols$cigar, strand=bamcols$strand, seqlengths=seqlengths) gal <- .bindExtraData(gal, use.names=FALSE, param, bamcols, with.which_label=with.which_label) if (asMates(file)) { f <- factor(bamcols$groupid) gal <- unname(split(gal, f)) mcols(gal)$mate_status <- bamcols$mate_status[match(levels(f), bamcols$groupid)] } else { ## groupid=NULL when asMates=FALSE gal <- unname(split(gal, seq_along(gal))) } if (use.names) names(gal) <- unique(splitAsList(bamcols$qname, bamcols$groupid)) gal } .readGAlignmentsList.BamFile <- function(file, index=file, use.names=FALSE, param=ScanBamParam(), with.which_label=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (!asMates(file)) bamWhat(param) <- setdiff(bamWhat(param), c("groupid", "mate_status")) what0 <- c("rname", "strand", "pos", "cigar", "groupid", "mate_status") if (use.names) what0 <- c(what0, "qname") .matesFromBam(file, use.names, param, what0, with.which_label) } setMethod("readGAlignmentsList", "BamFile", .readGAlignmentsList.BamFile) setMethod("readGAlignmentsList", "character", function(file, index=file, use.names=FALSE, param=ScanBamParam(), with.which_label=FALSE) { bam <- .open_BamFile(file, index=index, asMates=TRUE, param=param) on.exit(close(bam)) readGAlignmentsList(bam, character(0), use.names=use.names, param=param, with.which_label=with.which_label) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGappedReads() ### setGeneric("readGappedReads", signature="file", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) standardGeneric("readGappedReads") ) .readGappedReads.BamFile <- function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") if (is.null(param)) param <- ScanBamParam() if (!asMates(file)) bamWhat(param) <- setdiff(bamWhat(param), c("groupid", "mate_status")) what0 <- c("rname", "strand", "pos", "cigar", "seq") if (use.names) what0 <- c(what0, "qname") bamcols <- .load_bamcols_from_BamFile(file, param, what0, with.which_label=with.which_label) seqlengths <- .load_seqlengths_from_BamFile(file, levels(bamcols[["rname"]])) ans <- GappedReads(seqnames=bamcols$rname, pos=bamcols$pos, cigar=bamcols$cigar, strand=bamcols$strand, qseq=bamcols$seq, seqlengths=seqlengths) .bindExtraData(ans, use.names, param, bamcols, with.which_label=with.which_label) } setMethod("readGappedReads", "BamFile", .readGappedReads.BamFile) setMethod("readGappedReads", "character", function(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) { bam <- .open_BamFile(file, index=index, param=param) on.exit(close(bam)) readGappedReads(bam, character(0), use.names=use.names, param=param, with.which_label=with.which_label) } ) GenomicAlignments/R/sequenceLayer.R0000644000175400017540000006005313175714431020346 0ustar00biocbuildbiocbuild### ========================================================================= ### sequenceLayer() ### ------------------------------------------------------------------------- .make_empty_sequences <- function(skeleton, class="BStringSet") { if (is.null(skeleton)) return(NULL) skeleton <- PartitioningByEnd(skeleton) skeleton_len <- length(skeleton) if (skeleton_len == 0L) { unlisted_len <- 0L } else { unlisted_len <- end(skeleton)[skeleton_len] } unlisted_ans <- rep.int(as("", class), unlisted_len) relist(unlisted_ans, skeleton) } ### 'filler_width' must be an integer vector, and 'letter' an XString object ### of length 1. .make_sequence_fillers_from_widths <- function(filler_width, letter) { if (length(filler_width) == 0L) { max_width <- 0L at <- IRanges() } else { max_width <- max(filler_width) at <- IRanges(1L, filler_width) } biggest_filler <- rep.int(letter, max_width) extractAt(biggest_filler, at) } ### 'filler_widths' must be an IntegerList object (or list of integers). .make_sequence_fillers_from_list_of_widths <- function(filler_widths, letter) { unlisted_widths <- unlist(filler_widths, use.names=FALSE) unlisted_ans <- .make_sequence_fillers_from_widths(unlisted_widths, letter) relist(unlisted_ans, filler_widths) } ### Parallel combine. .pcombine <- function(x, y) { if (is.null(x)) return(y) if (is.null(y)) return(x) if (length(x) != length(y)) stop("'x' and 'y' must have the same length") xy <- c(x, y) collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(length(x)) ans_flesh <- unlist(xy[collate_subscript], use.names=FALSE) ans_breakpoints <- end(PartitioningByEnd(x)) + end(PartitioningByEnd(y)) ans_skeleton <- PartitioningByEnd(ans_breakpoints) relist(ans_flesh, ans_skeleton) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### sequenceLayer() ### .make_fillers <- function(cigar, ops, letter) { ops_width <- explodeCigarOpLengths(cigar, ops=ops) .make_sequence_fillers_from_list_of_widths(ops_width, letter) } .D_ranges_on_query_space <- function(cigar, before.hard.clipping=FALSE, after.soft.clipping=FALSE) { cigarRangesAlongQuerySpace(cigar, before.hard.clipping=before.hard.clipping, after.soft.clipping=after.soft.clipping, ops="D") } .N_ranges_on_query_space <- function(cigar, before.hard.clipping=FALSE, after.soft.clipping=FALSE) { cigarRangesAlongQuerySpace(cigar, before.hard.clipping=before.hard.clipping, after.soft.clipping=after.soft.clipping, ops="N") } .D_and_N_ranges_on_query_space <- function(cigar, before.hard.clipping=FALSE, after.soft.clipping=FALSE) { D_ranges <- .D_ranges_on_query_space(cigar, before.hard.clipping=before.hard.clipping, after.soft.clipping=after.soft.clipping) N_ranges <- .N_ranges_on_query_space(cigar, before.hard.clipping=before.hard.clipping, after.soft.clipping=after.soft.clipping) .pcombine(D_ranges, N_ranges) } .make_D_and_N_fillers <- function(cigar, D.letter, N.letter) { D_fillers <- .make_fillers(cigar, "D", D.letter) N_fillers <- .make_fillers(cigar, "N", N.letter) .pcombine(D_fillers, N_fillers) } sequenceLayer <- function(x, cigar, from="query", to="reference", D.letter="-", N.letter=".", I.letter="-", S.letter="+", H.letter="+") { if (!is(x, "XStringSet")) stop("'x' must be an XStringSet object") ## The 8 spaces below are also defined at the top of the src/cigar_utils.c ## file in the GenomicAlignments package. SPACES <- c("reference", "reference-N-regions-removed", "query", "query-before-hard-clipping", "query-after-soft-clipping", "pairwise", "pairwise-N-regions-removed", "pairwise-dense") from <- match.arg(from, SPACES) to <- match.arg(to, SPACES) D.letter <- Biostrings:::.normarg_padding.letter(D.letter, seqtype(x)) N.letter <- Biostrings:::.normarg_padding.letter(N.letter, seqtype(x)) I.letter <- Biostrings:::.normarg_padding.letter(I.letter, seqtype(x)) S.letter <- Biostrings:::.normarg_padding.letter(S.letter, seqtype(x)) H.letter <- Biostrings:::.normarg_padding.letter(H.letter, seqtype(x)) if (from == to) return(x) ## Right now, the way 'S.letter' and 'H.letter' are injected in 'x' when ## 'to' is "query-before-hard-clipping" can result in padding in the ## wrong order (i.e. padding with 'H.letter' followed by padding with ## 'S.letter') so we temporarily work around this by enforcing 'S.letter' ## and 'H.letter' to be the same. if (from != "query" && to == "query-before-hard-clipping" && as.character(S.letter) != as.character(H.letter)) stop("'H.letter' must be the same as 'S.letter' ", "when 'from' is not \"query\" and 'to' ", "is \"query-before-hard-clipping\"") ## TODO: What follows is a big ugly piece of stinking code (350 lines!). ## There is of course a better way... inject_at <- ops_to_remove <- NULL if (from == "reference") { getCigarRanges <- function(cigar, ops) cigarRangesAlongReferenceSpace(cigar, ops=ops) if (to == "reference-N-regions-removed") { ## "reference" -> "reference-N-regions-removed" ops_to_remove <- "N" } else if (to == "query") { ## "reference" -> "query" ops_to_remove <- c("D", "N") I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) inject_at <- .pcombine(I_inject_at, S_inject_at) fillers <- .pcombine(I_fillers, S_fillers) } else if (to == "query-before-hard-clipping") { ## "reference" -> "query-before-hard-clipping" ops_to_remove <- c("D", "N") I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) H_inject_at <- getCigarRanges(cigar, "H") H_fillers <- .make_fillers(cigar, "H", H.letter) inject_at <- .pcombine(I_inject_at, S_inject_at) inject_at <- .pcombine(inject_at, H_inject_at) fillers <- .pcombine(I_fillers, S_fillers) fillers <- .pcombine(fillers, H_fillers) } else if (to == "query-after-soft-clipping") { ## "reference" -> "query-after-soft-clipping" ops_to_remove <- c("D", "N") ops_to_inject <- "I" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, I.letter) } else if (to == "pairwise") { ## "reference" -> "pairwise" ops_to_inject <- "I" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, I.letter) } else if (to == "pairwise-N-regions-removed") { ## "reference" -> "pairwise-N-regions-removed" ops_to_remove <- "N" ops_to_inject <- "I" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, I.letter) } else if (to == "pairwise-dense") { ## "reference" -> "pairwise-dense" ops_to_remove <- c("D", "N") } } else if (from == "reference-N-regions-removed") { getCigarRanges <- function(cigar, ops) cigarRangesAlongReferenceSpace(cigar, N.regions.removed=TRUE, ops=ops) if (to == "reference") { ## "reference-N-regions-removed" -> "reference" ops_to_inject <- "N" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, N.letter) } else if (to == "query") { ## "reference-N-regions-removed" -> "query" ops_to_remove <- "D" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) inject_at <- .pcombine(I_inject_at, S_inject_at) fillers <- .pcombine(I_fillers, S_fillers) } else if (to == "query-before-hard-clipping") { ## "reference-N-regions-removed" -> "query-before-hard-clipping" ops_to_remove <- "D" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) H_inject_at <- getCigarRanges(cigar, "H") H_fillers <- .make_fillers(cigar, "H", H.letter) inject_at <- .pcombine(I_inject_at, S_inject_at) inject_at <- .pcombine(inject_at, H_inject_at) fillers <- .pcombine(I_fillers, S_fillers) fillers <- .pcombine(fillers, H_fillers) } else if (to == "query-after-soft-clipping") { ## "reference-N-regions-removed" -> "query-after-soft-clipping" ops_to_remove <- "D" ops_to_inject <- "I" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, I.letter) } else if (to == "pairwise") { ## "reference-N-regions-removed" -> "pairwise" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) N_inject_at <- getCigarRanges(cigar, "N") N_fillers <- .make_fillers(cigar, "N", N.letter) inject_at <- .pcombine(I_inject_at, N_inject_at) fillers <- .pcombine(I_fillers, N_fillers) } else if (to == "pairwise-N-regions-removed") { ## "reference-N-regions-removed" -> "pairwise-N-regions-removed" ops_to_inject <- "I" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, I.letter) } else if (to == "pairwise-dense") { ## "reference-N-regions-removed" -> "pairwise-dense" ops_to_remove <- "D" } } else if (from == "query") { getCigarRanges <- function(cigar, ops) cigarRangesAlongQuerySpace(cigar, ops=ops) if (to == "reference") { ## "query" -> "reference" ops_to_remove <- c("I", "S") inject_at <- .D_and_N_ranges_on_query_space(cigar) fillers <- .make_D_and_N_fillers(cigar, D.letter, N.letter) } else if (to == "reference-N-regions-removed") { ## "query" -> "reference-N-regions-removed" ops_to_remove <- c("S", "I") ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "query-before-hard-clipping") { ## "query" -> "query-before-hard-clipping" ops_to_inject <- "H" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, H.letter) } else if (to == "query-after-soft-clipping") { ## "query" -> "query-after-soft-clipping" ops_to_remove <- "S" } else if (to == "pairwise") { ## "query" -> "pairwise" ops_to_remove <- "S" inject_at <- .D_and_N_ranges_on_query_space(cigar) fillers <- .make_D_and_N_fillers(cigar, D.letter, N.letter) } else if (to == "pairwise-N-regions-removed") { ## "query" -> "pairwise-N-regions-removed" ops_to_remove <- "S" ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "pairwise-dense") { ## "query" -> "pairwise-dense" ops_to_remove <- c("I", "S") } } else if (from == "query-before-hard-clipping") { getCigarRanges <- function(cigar, ops) cigarRangesAlongQuerySpace(cigar, before.hard.clipping=TRUE, ops=ops) if (to == "reference") { ## "query-before-hard-clipping" -> "reference" ops_to_remove <- c("H", "S", "I") inject_at <- .D_and_N_ranges_on_query_space(cigar, before.hard.clipping=TRUE) fillers <- .make_D_and_N_fillers(cigar, D.letter, N.letter) } else if (to == "reference-N-regions-removed") { ## "query-before-hard-clipping" -> "reference-N-regions-removed" ops_to_remove <- c("H", "S", "I") ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "query") { ## "query-before-hard-clipping" -> "query" ops_to_remove <- "H" } else if (to == "query-after-soft-clipping") { ## "query-before-hard-clipping" -> "query-after-soft-clipping" ops_to_remove <- c("H", "S") } else if (to == "pairwise") { ## "query-before-hard-clipping" -> "pairwise" ops_to_remove <- c("H", "S") inject_at <- .D_and_N_ranges_on_query_space(cigar, before.hard.clipping=TRUE) fillers <- .make_D_and_N_fillers(cigar, D.letter, N.letter) } else if (to == "pairwise-N-regions-removed") { ## "query-before-hard-clipping" -> "pairwise-N-regions-removed" ops_to_remove <- c("H", "S") ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "pairwise-dense") { ## "query-before-hard-clipping" -> "pairwise-dense" ops_to_remove <- c("I", "S", "H") } } else if (from == "query-after-soft-clipping") { getCigarRanges <- function(cigar, ops) cigarRangesAlongQuerySpace(cigar, after.soft.clipping=TRUE, ops=ops) if (to == "reference") { ## "query-after-soft-clipping" -> "reference" ops_to_remove <- "I" inject_at <- .D_and_N_ranges_on_query_space(cigar, after.soft.clipping=TRUE) fillers <- .make_D_and_N_fillers(cigar, D.letter, N.letter) } else if (to == "reference-N-regions-removed") { ## "query-after-soft-clipping" -> "reference-N-regions-removed" ops_to_remove <- "I" ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "query") { ## "query-after-soft-clipping" -> "query" ops_to_inject <- "S" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, S.letter) } else if (to == "query-before-hard-clipping") { ## "query-after-soft-clipping" -> "query-before-hard-clipping" S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) H_inject_at <- getCigarRanges(cigar, "H") H_fillers <- .make_fillers(cigar, "H", H.letter) inject_at <- .pcombine(S_inject_at, H_inject_at) fillers <- .pcombine(S_fillers, H_fillers) } else if (to == "pairwise") { ## "query-after-soft-clipping" -> "pairwise" inject_at <- .D_and_N_ranges_on_query_space(cigar, after.soft.clipping=TRUE) fillers <- .make_D_and_N_fillers(cigar, D.letter, N.letter) } else if (to == "pairwise-N-regions-removed") { ## "query-after-soft-clipping" -> "pairwise-N-regions-removed" ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "pairwise-dense") { ## "query-after-soft-clipping" -> "pairwise-dense" ops_to_remove <- "I" } } else if (from == "pairwise") { getCigarRanges <- function(cigar, ops) cigarRangesAlongPairwiseSpace(cigar, ops=ops) if (to == "reference") { ## "pairwise" -> "reference" ops_to_remove <- "I" } else if (to == "reference-N-regions-removed") { ## "pairwise" -> "reference-N-regions-removed" ops_to_remove <- c("I", "N") } else if (to == "query") { ## "pairwise" -> "query" ops_to_remove <- c("D", "N") ops_to_inject <- "S" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, S.letter) } else if (to == "query-before-hard-clipping") { ## "pairwise" -> "query-before-hard-clipping" ops_to_remove <- c("D", "N") S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) H_inject_at <- getCigarRanges(cigar, "H") H_fillers <- .make_fillers(cigar, "H", H.letter) inject_at <- .pcombine(S_inject_at, H_inject_at) fillers <- .pcombine(S_fillers, H_fillers) } else if (to == "query-after-soft-clipping") { ## "pairwise" -> "query-after-soft-clipping" ops_to_remove <- c("D", "N") } else if (to == "pairwise-N-regions-removed") { ## "pairwise" -> "pairwise-N-regions-removed" ops_to_remove <- "N" } else if (to == "pairwise-dense") { ## "pairwise" -> "pairwise-dense" ops_to_remove <- c("I", "D", "N") } } else if (from == "pairwise-N-regions-removed") { getCigarRanges <- function(cigar, ops) cigarRangesAlongPairwiseSpace(cigar, N.regions.removed=TRUE, ops=ops) if (to == "reference") { ## "pairwise-N-regions-removed" -> "reference" ops_to_remove <- "I" ops_to_inject <- "N" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, N.letter) } else if (to == "reference-N-regions-removed") { ## "pairwise-N-regions-removed" -> "reference-N-regions-removed" ops_to_remove <- "I" } else if (to == "query") { ## "pairwise-N-regions-removed" -> "query" ops_to_remove <- "D" ops_to_inject <- "S" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, S.letter) } else if (to == "query-before-hard-clipping") { ## "pairwise-N-regions-removed" -> "query-before-hard-clipping" ops_to_remove <- "D" S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) H_inject_at <- getCigarRanges(cigar, "H") H_fillers <- .make_fillers(cigar, "H", H.letter) inject_at <- .pcombine(S_inject_at, H_inject_at) fillers <- .pcombine(S_fillers, H_fillers) } else if (to == "query-after-soft-clipping") { ## "pairwise-N-regions-removed" -> "query-after-soft-clipping" ops_to_remove <- "D" } else if (to == "pairwise") { ## "pairwise-N-regions-removed" -> "pairwise" ops_to_inject <- "N" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, N.letter) } else if (to == "pairwise-dense") { ## "pairwise-N-regions-removed" -> "pairwise-dense" ops_to_remove <- c("I", "D") } } else if (from == "pairwise-dense") { getCigarRanges <- function(cigar, ops) cigarRangesAlongPairwiseSpace(cigar, dense=TRUE, ops=ops) if (to == "reference") { ## "pairwise-dense" -> "reference" D_inject_at <- getCigarRanges(cigar, "D") D_fillers <- .make_fillers(cigar, "D", D.letter) N_inject_at <- getCigarRanges(cigar, "N") N_fillers <- .make_fillers(cigar, "N", N.letter) inject_at <- .pcombine(D_inject_at, N_inject_at) fillers <- .pcombine(D_fillers, N_fillers) } else if (to == "reference-N-regions-removed") { ## "pairwise-dense" -> "reference-N-regions-removed" ops_to_inject <- "D" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, D.letter) } else if (to == "query") { ## "pairwise-dense" -> "query" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) inject_at <- .pcombine(I_inject_at, S_inject_at) fillers <- .pcombine(I_fillers, S_fillers) } else if (to == "query-before-hard-clipping") { ## "pairwise-dense" -> "query-before-hard-clipping" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) S_inject_at <- getCigarRanges(cigar, "S") S_fillers <- .make_fillers(cigar, "S", S.letter) H_inject_at <- getCigarRanges(cigar, "H") H_fillers <- .make_fillers(cigar, "H", H.letter) inject_at <- .pcombine(.pcombine(I_inject_at, S_inject_at), H_inject_at) fillers <- .pcombine(.pcombine(I_fillers, S_fillers), H_fillers) } else if (to == "query-after-soft-clipping") { ## "pairwise-dense" -> "query-after-soft-clipping" ops_to_inject <- "I" inject_at <- getCigarRanges(cigar, ops_to_inject) fillers <- .make_fillers(cigar, ops_to_inject, I.letter) } else if (to == "pairwise") { ## "pairwise-dense" -> "pairwise" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) D_inject_at <- getCigarRanges(cigar, "D") D_fillers <- .make_fillers(cigar, "D", D.letter) N_inject_at <- getCigarRanges(cigar, "N") N_fillers <- .make_fillers(cigar, "N", N.letter) inject_at <- .pcombine(.pcombine(I_inject_at, D_inject_at), N_inject_at) fillers <- .pcombine(.pcombine(I_fillers, D_fillers), N_fillers) } else if (to == "pairwise-N-regions-removed") { ## "pairwise-dense" -> "pairwise-N-regions-removed" I_inject_at <- getCigarRanges(cigar, "I") I_fillers <- .make_fillers(cigar, "I", I.letter) D_inject_at <- getCigarRanges(cigar, "D") D_fillers <- .make_fillers(cigar, "D", D.letter) inject_at <- .pcombine(I_inject_at, D_inject_at) fillers <- .pcombine(I_fillers, D_fillers) } } at <- inject_at if (is.null(inject_at)) { value <- NULL } else { value <- fillers } if (length(ops_to_remove) != 0L) { at2 <- getCigarRanges(cigar, ops_to_remove) value2 <- .make_empty_sequences(at2, class=class(x)) at <- .pcombine(at, at2) value <- .pcombine(value, value2) } replaceAt(x, at, value=value) } GenomicAlignments/R/setops-methods.R0000644000175400017540000000162313175714431020515 0ustar00biocbuildbiocbuild### ========================================================================= ### Set operations ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### pintersect() ### ### TODO: Revisit this method (seems to do strange things). setMethod("pintersect", c("GAlignments", "GRanges"), function(x, y, ...) { bounds <- try(callGeneric(granges(x), y), silent=TRUE) if (inherits(bounds, "try-error")) stop("CIGAR is empty after intersection") start <- start(bounds) - start(x) + 1L start[which(start < 1L)] <- 1L end <- end(bounds) - end(x) - 1L end[which(end > -1L)] <- -1L narrow(x, start=start, end=end) } ) setMethod("pintersect", c("GRanges", "GAlignments"), function(x, y, ...) { callGeneric(y, x) } ) GenomicAlignments/R/stackStringsFromBam.R0000644000175400017540000001122313175714431021457 0ustar00biocbuildbiocbuild### ========================================================================= ### stackStringsFromBam() ### ------------------------------------------------------------------------- ### Should always return a ScanBamParam object containing exactly 1 genomic ### region. .normarg_param <- function(param) { if (isSingleString(param)) { tmp1 <- strsplit(param, ":", fixed=TRUE)[[1L]] if (length(tmp1) != 2L) stop("when a character string, 'param' must be ", "of the form \"chr14:5201-5300\"") tmp2 <- as.integer(strsplit(tmp1[2L], "-", fixed=TRUE)[[1L]]) if (length(tmp2) != 2L || any(is.na(tmp2))) stop("when a character string, 'param' must be ", "of the form \"chr14:5201-5300\"") param <- GRanges(tmp1[1L], IRanges(tmp2[1L], tmp2[2L])) } if (is(param, "GenomicRanges")) { if (length(param) != 1L) stop("when a GRanges object, 'param' must have length 1") seqlevels(param) <- seqlevelsInUse(param) param <- ScanBamParam(which=param) return(param) } if (is(param, "RangesList")) { ## We support RangesList just because ScanBamParam() supports it too ## and also because that's what's returned by bamWhich(). param <- param[elementNROWS(param) != 0L] if (length(unlist(param, use.names=FALSE)) != 1L) stop("when a RangesList object, 'param' must contain exactly 1 ", "genomic region\n (i.e. 'unlist(param)' must have length 1)") param <- ScanBamParam(which=param) return(param) } if (!is(param, "ScanBamParam")) stop("'param' must be either a ScanBamParam or RangesList object ", "containing\n exactly 1 genomic region, or a GRanges object ", "of length 1, or a character\n string specifying a single ", "genomic region (in the \"chr14:5201-5300\" format)") param_which <- bamWhich(param) param_which <- param_which[elementNROWS(param_which) != 0L] if (length(unlist(param_which, use.names=FALSE)) != 1L) stop("when a ScanBamParam object, 'param' must contain exactly 1 ", "genomic region\n (i.e. 'unlist(bamWhich(param))' must have ", "length 1)") bamWhich(param) <- param_which param } stackStringsFromBam <- function(file, index=file, param, what="seq", use.names=FALSE, D.letter="-", N.letter=".", Lpadding.letter="+", Rpadding.letter="+") { param <- .normarg_param(param) region_range <- unlist(bamWhich(param), use.names=FALSE) what <- match.arg(what, c("seq", "qual")) param_what <- bamWhat(param) if (!(what %in% param_what)) bamWhat(param) <- c(param_what, what) gal <- readGAlignments(file, index=index, use.names=use.names, param=param) gal_mcols <- mcols(gal) what_col_idx <- match(what, colnames(gal_mcols)) what_col <- gal_mcols[[what_col_idx]] if (what == "qual") what_col <- BStringSet(what_col) layed_seq <- sequenceLayer(what_col, cigar(gal), D.letter=D.letter, N.letter=N.letter) ans <- stackStrings(layed_seq, start(region_range), end(region_range), shift=start(gal)-1L, Lpadding.letter=Lpadding.letter, Rpadding.letter=Rpadding.letter) if (!(what %in% param_what)) { ## Remove the what column from 'gal_mcols'. gal_mcols <- gal_mcols[ , -what_col_idx, drop=FALSE] ## Sadly, subsetting a DataFrame will mangle the colnames of the ## returned DataFrame if it has duplicated colnames. Since we of ## course don't want this, we fix them. colnames(gal_mcols) <- param_what } names(ans) <- names(gal) mcols(ans) <- gal_mcols ans } alphabetFrequencyFromBam <- function(file, index=file, param, what="seq", ...) { param <- .normarg_param(param) region_range <- unlist(bamWhich(param), use.names=FALSE) region_seqname <- names(bamWhich(param)) what <- match.arg(what, c("seq", "qual")) bamWhat(param) <- what gal <- readGAlignments(file, index=index, param=param) seqlevels(gal) <- region_seqname what_col <- mcols(gal)[ , what] if (what == "qual") what_col <- BStringSet(what_col) at <- start(region_range) - 1L + seq_len(width(region_range)) at <- GRanges(region_seqname, IRanges(at, width=1L)) piles <- pileLettersAt(what_col, seqnames(gal), start(gal), cigar(gal), at) alphabetFrequency(piles, ...) } GenomicAlignments/R/summarizeOverlaps-methods.R0000644000175400017540000003014113203656426022726 0ustar00biocbuildbiocbuild### ========================================================================= ### summarizeOverlaps() generic and methods ### ------------------------------------------------------------------------- setGeneric("summarizeOverlaps", signature=c("features", "reads"), function(features, reads, mode=Union, ignore.strand=FALSE, ...) standardGeneric("summarizeOverlaps") ) ### ------------------------------------------------------------------------- ### Methods for GAlignments, GAlignmentsList and GAlignmentPairs objects ### .dispatchOverlaps <- function(features, reads, mode, ignore.strand, inter.feature, preprocess.reads, ...) { if (ignore.strand) { if (class(features) == "GRangesList") { r <- unlist(features) strand(r) <- "*" features@unlistData <- r } else { strand(features) <- "*" } } if (!is.null(preprocess.reads)) reads <- preprocess.reads(reads, ...) mode(features, reads, ignore.strand=ignore.strand, inter.feature=inter.feature) } .summarizeOverlaps <- function(features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) { if (class(reads) == "GRangesList") { if (all(unlist(strand(reads), use.names=FALSE) == "*")) ignore.strand <- TRUE } else { if (all(strand(reads) == "*")) ignore.strand <- TRUE } mode <- match.fun(mode) counts <- .dispatchOverlaps(features, reads, mode, ignore.strand, inter.feature, preprocess.reads, ...) colData <- DataFrame(object=class(reads), records=length(reads), row.names="reads") SummarizedExperiment(assays=SimpleList(counts=as.matrix(counts)), rowRanges=features, colData=colData) } setMethod("summarizeOverlaps", c("GRanges", "GAlignments"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRangesList", "GAlignments"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRanges", "GAlignmentsList"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRangesList", "GAlignmentsList"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRanges", "GAlignmentPairs"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRangesList", "GAlignmentPairs"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRanges", "GRanges"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRangesList", "GRanges"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRanges", "GRangesList"), .summarizeOverlaps ) setMethod("summarizeOverlaps", c("GRangesList", "GRangesList"), .summarizeOverlaps ) ### ------------------------------------------------------------------------- ### 'mode' functions ### Union <- function(features, reads, ignore.strand=FALSE, inter.feature=TRUE) { ov <- findOverlaps(features, reads, ignore.strand=ignore.strand) if (inter.feature) { ## Remove ambigous reads. reads_to_keep <- which(countSubjectHits(ov) == 1L) ov <- ov[subjectHits(ov) %in% reads_to_keep] } countQueryHits(ov) } IntersectionStrict <- function(features, reads, ignore.strand=FALSE, inter.feature=TRUE) { ov <- findOverlaps(reads, features, type="within", ignore.strand=ignore.strand) if (inter.feature) { ## Remove ambigous reads. reads_to_keep <- which(countQueryHits(ov) == 1L) ov <- ov[queryHits(ov) %in% reads_to_keep] } countSubjectHits(ov) } .removeSharedRegions <- function(features, ignore.strand=FALSE) { if (is(features, "GRanges")) { regions <- disjoin(features, ignore.strand=ignore.strand) } else if (is(features, "GRangesList")) { regions <- disjoin(features@unlistData, ignore.strand=ignore.strand) } else { stop("internal error") # should never happen } ov <- findOverlaps(features, regions, ignore.strand=ignore.strand) regions_to_keep <- which(countSubjectHits(ov) == 1L) ov <- ov[subjectHits(ov) %in% regions_to_keep] unlisted_ans <- regions[subjectHits(ov)] ans_partitioning <- as(ov, "PartitioningByEnd") relist(unlisted_ans, ans_partitioning) } IntersectionNotEmpty <- function(features, reads, ignore.strand=FALSE, inter.feature=TRUE) { features <- .removeSharedRegions(features, ignore.strand=ignore.strand) Union(features, reads, ignore.strand=ignore.strand, inter.feature=inter.feature) } ### ------------------------------------------------------------------------- ### Methods for BamFiles and BamViews objects ### .checkArgs <- function(bam, singleEnd, fragments) { if (singleEnd) { if (all(isTRUE(asMates(bam)))) stop("cannot specify both 'singleEnd=TRUE' and 'asMates=TRUE'") if (fragments) stop("when 'fragments=TRUE', 'singleEnd' should be FALSE") ## all paired-end reading now goes through new C algo } else { asMates(bam) <- TRUE } } .getReadFunction <- function(singleEnd, fragments) { if (singleEnd) { FUN <- readGAlignments } else { if (fragments) FUN <- readGAlignmentsList else FUN <- readGAlignmentPairs } FUN } .countWithYieldSize <- function(FUN, features, bf, mode, ignore.strand, inter.feature, param, preprocess.reads, ...) { if (is.na(yieldSize(bf))) { x <- FUN(bf, param=param, ...) .dispatchOverlaps(features, x, mode, ignore.strand, inter.feature, preprocess.reads, ...) } else { if (!isOpen(bf)) { open(bf) on.exit(close(bf)) } ct <- integer(length(features)) while (length(x <- FUN(bf, param=param, ...))) { ct <- ct + .dispatchOverlaps(features, x, mode, ignore.strand, inter.feature, preprocess.reads, ...) } ct } } .dispatchBamFiles <- function(features, reads, mode, ignore.strand, count.mapped.reads=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) { exist <- sapply(reads, function(bf) file.exists(path(bf))) if (!all(exist)) stop(paste0("file(s): ", paste(path(reads)[!exist], collapse=","), " do not exist")) FUN <- .getReadFunction(singleEnd, fragments) cts <- bplapply(setNames(seq_along(reads), names(reads)), function(i, FUN, reads, features, mode, ignore.strand, inter.feature, param, preprocess.reads, ...) { bf <- reads[[i]] .countWithYieldSize(FUN, features, bf, mode, ignore.strand, inter.feature, param, preprocess.reads, ...) }, FUN, reads, features, mode=match.fun(mode), ignore.strand=ignore.strand, inter.feature=inter.feature, param=param, preprocess.reads=preprocess.reads, ... ) counts <- as.matrix(do.call(cbind, cts)) if (count.mapped.reads) { countBam <- countBam(reads) flag <- scanBamFlag(isUnmappedQuery=FALSE) param <- ScanBamParam(flag=flag, what="seq") colData <- DataFrame(countBam[c("records", "nucleotides")], mapped=countBam(reads, param=param)$records, row.names=colnames(counts)) } else { colData <- DataFrame(row.names=colnames(counts)) } SummarizedExperiment(assays=SimpleList(counts=counts), rowRanges=features, colData=colData) } setMethod("summarizeOverlaps", c("GRanges", "BamFile"), function(features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) { .checkArgs(reads, singleEnd, fragments) .dispatchBamFiles(features, BamFileList(reads), mode, ignore.strand, inter.feature=inter.feature, singleEnd=singleEnd, fragments=fragments, param=param, preprocess.reads=preprocess.reads, ...) }) setMethod("summarizeOverlaps", c("GRangesList", "BamFile"), function(features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) { .checkArgs(reads, singleEnd, fragments) .dispatchBamFiles(features, BamFileList(reads), mode, ignore.strand, inter.feature=inter.feature, singleEnd=singleEnd, fragments=fragments, param=param, preprocess.reads=preprocess.reads, ...) }) .summarizeOverlaps_character <- function(features, reads, mode=Union, ignore.strand=FALSE, yieldSize=1000000L, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) { if (!all(file.exists(reads))) stop("file(s) do not exist:\n ", paste(reads[!file.exists(reads)], collapse="\n ")) if (is.null(names(reads))) { if (any(duplicated(reads))) stop("duplicate 'reads' paths not allowed; use distinct names()") } else if (any(duplicated(names(reads)))) stop("duplicate 'names(reads)' file paths not allowed") reads <- BamFileList(reads, yieldSize=yieldSize, obeyQname=FALSE, asMates=!singleEnd) summarizeOverlaps(features, reads, mode, ignore.strand=ignore.strand, inter.feature=inter.feature, singleEnd=singleEnd, fragments=fragments, param=param, preprocess.reads=preprocess.reads, ...) } setMethod("summarizeOverlaps", c("GRanges", "character"), .summarizeOverlaps_character ) setMethod("summarizeOverlaps", c("GRangesList", "character"), .summarizeOverlaps_character ) .summarizeOverlaps_BamFileList <- function(features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) { if (any(duplicated(names(reads)))) stop("duplicate 'names(reads)' not allowed") .checkArgs(reads, singleEnd, fragments) .dispatchBamFiles(features, reads, mode, ignore.strand, inter.feature=inter.feature, singleEnd=singleEnd, fragments=fragments, param=param, preprocess.reads=preprocess.reads, ...) } setMethod("summarizeOverlaps", c("GRanges", "BamFileList"), .summarizeOverlaps_BamFileList ) setMethod("summarizeOverlaps", c("GRangesList", "BamFileList"), .summarizeOverlaps_BamFileList ) setMethod("summarizeOverlaps", c("BamViews", "missing"), function(features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) { se <- callGeneric(bamRanges(features), BamFileList(bamPaths(features)), mode=mode, ignore.strand=ignore.strand, inter.feature=inter.feature, singleEnd=singleEnd, fragments=fragments, param=param, preprocess.reads=preprocess.reads, ...) colData(se)$bamSamples <- bamSamples(features) colData(se)$bamIndices <- bamIndicies(features) metadata(se)$bamExperiment <- bamExperiment(features) se }) GenomicAlignments/R/utils.R0000644000175400017540000000137513175714431016703 0ustar00biocbuildbiocbuild### ========================================================================= ### Some low-level (non exported) utility functions. ### ------------------------------------------------------------------------- ### 3 equivalent implementations for this: ### (a) x %in% x[duplicated(x)] ### (b) duplicated(x) | duplicated(x, fromLast=TRUE) ### (c) xx <- match(x, x); ans <- xx != seq_along(xx); ans[xx] <- ans; ans ### Comparing the 3 implementations on an integer vector of length 12 millions: ### (a) is the most memory efficient; ### (b) is a little bit faster than (a) (by only 8%) but uses between 12-14% ### more memory; ### (c) is as fast as (a) but uses about 30% more memory. has_duplicates <- function(x) { x %in% x[duplicated(x)] } GenomicAlignments/R/zzz.R0000644000175400017540000000024013175714431016366 0ustar00biocbuildbiocbuild.onUnload <- function(libpath) { library.dynam.unload("GenomicAlignments", libpath) } .test <- function() BiocGenerics:::testPackage("GenomicAlignments") GenomicAlignments/build/0000755000175400017540000000000013203700454016300 5ustar00biocbuildbiocbuildGenomicAlignments/build/vignette.rds0000644000175400017540000000104013203700454020632 0ustar00biocbuildbiocbuildUAo00MC]ueGJ:Mb:uG,b;>9`%gT*K^\*{;2]1W FƜ!+R,T`  Byְֵz>= options(width=72) @ \tableofcontents \section{Introduction} The \Rpackage{GenomicAlignments} package serves as the foundation for representing genomic alignments within the \software{Bioconductor} project. In the \software{Bioconductor} package hierarchy, it builds upon the \Rpackage{GenomicRanges} (infrastructure) package and provides support for many \software{Bioconductor} packages. This package defines three classes: \Rclass{GAlignments}, \Rclass{GAlignmentPairs}, and \Rclass{GAlignmentsList}), which are used to represent genomic alignments, pairs of genomic alignments, and groups of genomic alignments. The \Rpackage{GenomicAlignments} package is available at bioconductor.org and can be downloaded via \Rfunction{biocLite}: <>= source("https://bioconductor.org/biocLite.R") biocLite("GenomicAlignments") @ <>= library(GenomicAlignments) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rclass{GAlignments}: Genomic Alignments} The \Rclass{GAlignments} class which is a container for storing a set of genomic alignments. The class is intended to support alignments in general, not only those coming from a 'Binary Alignment Map' or 'BAM' files. Also alignments with gaps in the reference sequence (a.k.a. \emph{gapped alignments}) are supported which, for example, makes the class suited for storing junction reads from an RNA-seq experiment. More precisely, a \Rclass{GAlignments} object is a vector-like object where each element describes an \emph{alignment}, that is, how a given sequence (called \emph{query} or \emph{read}, typically short) aligns to a reference sequence (typically long). As shown later in this document, a \Rclass{GAlignments} object can be created from a 'BAM' file. In that case, each element in the resulting object will correspond to a record in the file. One important thing to note though is that not all the information present in the BAM/SAM records is stored in the object. In particular, for now, we discard the query sequences (SEQ field), the query ids (QNAME field), the query qualities (QUAL), the mapping qualities (MAPQ) and any other information that is not needed in order to support the basic set of operations described in this document. This also means that multi-reads (i.e. reads with multiple hits in the reference) don't receive any special treatment i.e. the various SAM/BAM records corresponding to a multi-read will show up in the \Rclass{GAlignments} object as if they were coming from different/unrelated queries. Also paired-end reads will be treated as single-end reads and the pairing information will be lost. This might change in the future. \subsection{Load a `BAM' file into a \Rclass{GAlignments} object} First we use the \Rfunction{readGAlignments} function from the \Rpackage{GenomicAlignments} package to load a toy `BAM' file into a \Rclass{GAlignments} object: <>= library(GenomicAlignments) aln1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") aln1 <- readGAlignments(aln1_file) aln1 length(aln1) @ 3271 `BAM' records were loaded into the object. Note that \Rfunction{readGAlignments} would have discarded any `BAM' record describing an unaligned query (see description of the field in the SAM Format Specification \footnote{\url{http://samtools.sourceforge.net/SAM1.pdf}} for more information). The reader interested in tracking down these events can always use the \Rfunction{scanBam} function but this goes beyond the scope of this document. \subsection{Simple accessor methods} There is one accessor per field displayed by the \Rmethod{show} method and it has the same name as the field. All of them return a vector or factor of the same length as the object: <>= head(seqnames(aln1)) seqlevels(aln1) head(strand(aln1)) head(cigar(aln1)) head(qwidth(aln1)) head(start(aln1)) head(end(aln1)) head(width(aln1)) head(njunc(aln1)) @ \subsection{More accessor methods} [coming soon...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rclass{GAlignmentPairs}: Pairs of Genomic Alignments} [coming soon...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rclass{GAlignmentsList}: Groups of Genomic Alignments} [coming soon...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Session Information} All of the output in this vignette was produced under the following conditions: \begin{small} <>= sessionInfo() @ \end{small} \end{document} GenomicAlignments/inst/doc/GenomicAlignmentsIntroduction.pdf0000644000175400017540000055113613203700366025440 0ustar00biocbuildbiocbuild%PDF-1.5 % 45 0 obj << /Length 2548 /Filter /FlateDecode >> stream xZ[o~ϯ JѤ) %ZV[D9^=)Zp8s\s(o._zkˉ.R37h癙L+WN.'tfJOu"9әɒ-,7Zv]Cu߮qh[\Ȕ[^_eƥz+`32`9vUf23eZV9Gs ߦL~UN]n)䓁O6iZ<"2 lj Ǥ~o eH'pQ_Pi`^] G^gRS̙437TnjA?S*rvZ̢ | %0*(p'k!{I`?ۣkh BTS8g׫)f8Tp,*yw!/m Ұ-*R%mџ3v #ݠ$ |K8Zp%z>O/q€7hg7.,Z|65 AS0 k'x7"r:k==8W Yp:+KUӗ<+1 LSY3/kFu@mȶ6k7Cy<GU7W%[OGz!ʦIy0cULs,ݍL`ipƨ9>eڪG0 XBkBIrƱ =5~jibD I,ǽd`C,Dl̲*WUx,k܆k9bǿG{ֶ>uG2- B¶&-  \a %U%EDK.γQie8QFۋ(ÊrH«@i& *J3R%-?R xg(.a|ޢv5 UcJs7mg}K֌7l8;uݭ}RZ{ă4#殏o=={EXqj(X `#Cpzȏ5OqOnVe} (B2Z\nO2E35T'A#4'D]e+̻|e%c%kۃ$?ABG̯+œgyKH1*jP9֣$;QȣX q}=!漞qȊT#grŏgsGSA ͊Jp`4?ާ@ *ewnˠx8p}k;wquMA60ql"袧+~`bgŘ#sE#AB")~6e| 'ha`_ +4YZKpă$2Fqֹwf`̢\˒hɻ>ҷ:VX8$r ;֐iۮd&.Rõ~ ^WɆ!קG9P&t ^ߐ߽_:#hzF_fI i$E$ m.n7>ؓIY7bX~ݩEk6RFfG[5k Zp8`*upZۧ]~2Xpvf`1UyMLUx5?\ 2׾ZK\JTwՏ7AU 0ag ?qR,AUַRLvp7{ߡRKqLx5!bMP0O_j~WZW읏Jb>]=pq [~j)4NCɷe5q%h ]_GT\{=F+2I6 _nt,l]H%idSY4Іt=^_ $9 .ƀB;r=x\C>:KC]$m)M _q8 '_=VL$ĝψkja=^vSFNK5O~y>+#;Yp"ntKXLz_dc}eO<2K;'d>fzHh@#'9Z61ds6iQP4Yjq& qöuxQ|w@xfǛ_ociqaGP._/e1&*^EZu=~{pk_D5 x"wƹu#9Wb}DArN^}R[I[p/6',E08Uܰwp bmH8 B`5E(JJ.xOYZ=| ZZ.W!q%}bz/yQ1Yg%Gz`ʜƂU7T÷drcm+7ta!* =9A4!w7 fR5m'yXGDmmB;6sJٸ^Ox|FpU^c$nHLU*-2/~MVW endstream endobj 64 0 obj << /Length 1908 /Filter /FlateDecode >> stream xYo6_a26+"Ϣm5{jUDmlݬe˱>~<:gON^b.f8Q~E1zUc5㉉Co kk/`\x Ln|%OQ縌zKJٔĩONg0<=?yK_­SRP4f1AX[w/Ǔ(>!e pI_Ŗe3-`=D)?"v&y x :S-N@N`A"/\pDo)[**|rdDU/0@Ȋ& XXahDK%e$ |~?=d/8&2)ջb!%;MvX\vQ aQrJ0W պc.y|#W5JI*:~Ew˕ Ȗf*[]2{RlmuM CS̝B M]l`55OЧeӃ%?Gi'&Ty푬H'[%׮l)xI4nmc1iْ#{KI@(l 9u[QWAd&FB'ky R@)%,0~G%F䷧X>'gh.˔*c%Gm$mcqن7`w#1 w[  Lذkp؆E\P{2rGe4CFBȻb@\h3` P%V6ܴ5I3Ǥ!N6p$z@z[v6]٪;V"P2vF:ͧLT&9ŪSMw{^YQ/ To2DA^k)d.[6[ܰK;$lobtwuUJ)0LwM ݻ3吼Y1Q&шjEТ?Mh R:^רN `_/?e: 5oȥBWJ2ߤQ[Fcas;O#Vј붐va|mRk /% F.A-7i r'Ԛc%ZǔH-PX|BCg]'w8>/s@pـu,¨)S?p8!sL.îoL3F20cKU;Lx:1{[y$7yig*B3-i3R'o}$I-ICώJX+r[[תkm9vR ?]id I/d Ӑt}OMgkH|#PC̀! 5Q:[Y%n zy<' j/Opwp$+;ovxh~pt  ~*kvJa}6O[ ,k,i-q/8,K]:uʮxCoOPIן=7g=Hwy FXg ؞x//Y endstream endobj 68 0 obj << /Length 1405 /Filter /FlateDecode >> stream xXYo6~rfDJ(M)&K6@G>K ~DNnR@l8 )^β Wyjr\$ AMf"mQ"FKT^Ī66ք/bOb k攅)(C$OXT!@,-m<z8Wq!C+J;Cywۻ0tX[v≚Ⱥ.7 &&w*ʲacW%Fj5bg*B5Ne3c$-BnI0$jDj}V(v * s+Qz`5GFTsy-pXNIFԄ##!=4HwRɐuo-Ij q?%U+piQvC] dIg28SqDiJ˄RePbe1׽;@4-,/Ӷ0%ftdXr{2}/ u/Vُ"aBX[d^RH#j ~)[K2oaŬGLG 簂rvv9p1 C'?Zvhx>M@4d /[q0ϧ[kʐ0yGkcz+̛@N_ xyLKG:\%8m*ycpU<ޣv^v=H>'F7ۢoм:JV%VTƼ-^Lr=)N$I?ޚ"]/5(t9᷆(A ^n\*γVΜҹz\~W5 /`4XEo&p iRGTcZ`ޛc?:Yb-->U3]ws0%:U*2|kT endstream endobj 77 0 obj << /Length 1514 /Filter /FlateDecode >> stream xXr6}?_ycWe! IRN;i 0 ᒓ˒H![^{$N.X 7O4F* 5=d^5}xuʅ|-~%@>RvOr8J=-FCǓ˼!T>˃({%L(r=ϼR =a rDq!.PIb:\DiSB=(݁_h."+Bxf4PQ>c3cPגr"ny( eLyN֢ 8a- CJ]ʟ|*}aA$\4J 2eRBi Ֆ tȼG冁+G顷tZB޻]Yۺeaq^wB q|{d&6ϑ_[ o9wj%eLlK u w.'ރY>w c ;}"{/čy7чx ^dG~kn!}L2m][֗E|j˹pR/z5~Y8ne_j٣DNsfKGlHfoÍ%С< W =џP5u7#ƲDeuTj)Gb\Y/ʽmUuRBr]I)\¬zusL3Y%POD18N&u~~}FRmZtp[O]>YQՆə #uQ;hՎw#i i%y??V6 endstream endobj 95 0 obj << /Length1 1765 /Length2 12453 /Length3 0 /Length 13567 /Filter /FlateDecode >> stream xڍTi.Ӹ;![C4 \fvvgv{O=UO[Uo4,`3,э] NRΉDCifFjvCt{IވEw{WO.o"E c(AH4R`'o+k8~Л384H8\ĺw@7k[Ds=@lnr/nnNll@WV(3rx, P:*im/ mAo& [t2_d?Ñ@ss `icUfurc- ]o@=g@V_8Q#nގYB rtsE#?i۹{\;GϿeX;i98⼉Y<|3enGMo'ПJ?o58oel,Ao?H>@O#$ de71_.6^ϓۄYb6EjL$ `apprۏ*d/~|Չ'3/q 587AS&aSn\.8%~g)m8hAL=ZRL;dv,[U;: RF6`Mw 0'q,K|$بE^ on6l];XNEhJwS%S(`le"֣j7guʗTq.X}Ux ;żڧ/B[Ӭ*'ڳ5ʊL&;HnzJy Cwt 5aD6x :cYF9*qa&Vy6BY*P+?R^ LcKu,Rgg⻝ { 1N w"ʢJ=r| x*dl8%7%ԍk^)X!ZhgVi1tivF 3mr[:PmNӅOC芆6(y0峛U5:.8Vpڈw|͘)nO0.<x(>1vTw DM$KD1*_Y2%ştwBޞdgRzYSAom.S.! [(0"2l;=XݼpKd,BYY@?oDKvQm(qtCQ֤Ӷ؉d,b@`{D5LK0k7f~J~ޗ0G hE#E6/8NACJrt /Lfʘ[!ԚєnΐH] ,?y|vN)d_ |[]wL31ur PyR?R"XaPe"ZaA)};2 ƽ{4mZX1mu.mĔLWr0_Y MtעW$G.WVt<=:8 q?<`$@AVGEfˇn{CQE:IG켡7p*-0pP0p* DjPZs/9|D83Jgo .g>עڿYzؠ/0}ϙR@ }y@SƧD<.8Ԡm/9Cr,*).RKbB= ;FAFg킧j+:I 4uMTg`Sԛ/2:C~ #YnYuCQAt4SD {Tns%Jtac']]+αt{[o }m! l& {)rWؙRMP(W9?ؒ`W'8DOؾs 6 #uuyi dib^Tv"/5#A-t=**&<`п!95b,*4j&<>$(p#jlCIptٻ39!Q0G} Ŗ2iyB.U?BPLȥ&z5zetHhѺSݶ/5>+q"*}ؤDY bDyS\^kS *?T,N Ƀw$@6NdeC}0̑|E+b̮mUi1@<}/"n֔SRh]uSx*-\ȝY,iZOc&9 -T!>-1;!]eII37?D}@0yuԁqJ㟺5kޓjv9GXJ:-%I=\1OzK,?UHYulq3"Ab$Dc_+gg *^BhHa_r'˙bh$Mei|< aI; uͷN`ƴ(c,a5Q~!ʆ'Պa\._|ʶ؏b''Ϫ=h RoĹb{^>m)YFVGDY'BeOi_zGdK>oӰوy/` ^crʒi7' 1&7_;<3bw"_g]>Ma|.Xefv&oPo]u.G CL,Tx *Etxr .&bdE`>;Yi-npd s _(k7JؓA]Z3esT? 1ݝ߬>#{.0JѽG4W~ ˬv9K=8^Z<.ml޻4eJ*T%2IǶ OvB88D}Ani YYS] kҒ8ﲴNez5JT2#ǣFY*ţwV3<&VRR |JYb 9a(hkT=F|\r]Lջ%F@ק=~a^$[E+@\@mS>C+~c&SXsDN,izVB՗/;_4ՏQwIȶ8(?_K|7;{m>gf'dH> q=Pʽ*w'u݄!"$34Ă@[f%-gy̴ns*'b1w-#- fU-L/8~>DԞ85#9pߘTeFž i Վy%ic}<]8C)fT.yAϥ7=Ъ| TdLMZ多ېY ߟe-Vi(jD*e9z˽.e`i\ɰhituRi/I?fZuZ2.-_m V&'zL^7s.IoS.g?IϷeB^Y2Нz[;a?GhiXWjދfh… $ \|,# Ono2v y<T7h8ϡBWmXC M0\-)q=WЛGJ_Ĭbz`TCSa!j1b5 !K5'FOp4RSVGSZP`kߖ<yf8ǐF$: cU,0k\X 5:fѝPw$盀kib$# t^cW8o1w*}t-[Y9fQzЪ\PW[}pwUZ}Ψ0H)= ET5gG կo㦚eR0kWԁk׃ϵ/I#^_[_9MFO5c>G O~,sF3fpQӱ<ȸ@zrw|[%(؈ '[PZZ'5/5r[FdR™W R:&@%hT7}2]e"2m=xTR}wZTud dv:8@RO>wX R2|zv(Os~|EȽ-%)TǓ8Ii!!Ȯ^>cQfTG\[N)̉\P]ذ'˺4Q~%<}GM2ξ2_l !uP5QIJ9.")hjG]s 2*;˟Or$d5: z|:k3 5'Lu*bQg^CN y-b<5 \_T,3bOtcaX :]*#cH\sS:"@J욄*O s\wc`rE"ZB7C$cmtV*|ƒB)a}> `|KpP,!ZVQ =>5qvzk. *qJ.)jȔhBWj02> 3eYVf ܾ2|v؅=ٯYhH2_}J8dnHGn7_yFn9G8&Thjm\>$lf$]6Gn 7I`ҵtqc2$o2Ĥ!C'=I& -(fV#\)C/3Qg ϼJrC >9='cuNU1ź ak;m:1hTq\EMlKh\Ά_Sk'~= A }DIzsԹ_tݴdcj?$j'|۾7/d$:G>,JBn* |G;~uQv4P:J`3_-}ʐ#:MFWԺkX ƀf4hp(vrG  y#r(x;p$P/ȟ'ŋM=>n+*Xߞ.,] J[I s1g}3\8S)+`"{%Fg6/1#I5UrI{YˏH t/4r##^{֤Eˁg~UqRw1 Qf"µF@\i3VnR?Cj9UHNuA;dUrZWD8UwvAT PoW~:>fF~6T d,zևP0SS%۹¬%lcS{lN尯;)eu.ܲ1,nV"D}Tf$j) j-USiܞأA2E&!&~c-XVČnOnuy]*̏\1~Z'wx?J*Z4CTB7jF{q2a0c,AWygO`Wω䞂_Bc* ѝ!0`d"Tg2%'%V^`KmK pm',Qi, }TZsҹ 3U*ixTYI/5$eI/V|4s 7Sk(>!% `l$!{km0G76H4RޯRq:[ {Mk:qCp*M.|OǞxBne߷G2O?ҟy >iYHrdE[!pt>3;7qjNxg^7z{f9gs0 pN[yGe5l/NZǞM2%ӆX,n6+\#ԠYU:L8+B_fI)*^;ԯ[t 7}Om3yX?=>2) `U" eSS̳ ^l :6+ dJӬ8^$ks% e٘t|`h' # J@fDa[lW5KĎ3^A23XqSC;G S|/;{ˆAc`x X!#! ׃G~xc<5^h% ) W7PXP"Wa~yP~BؘMXYe,/ʾXAS.V]hʫ,&&S$Y;?=,ѯƾ)؊GCoRrJ$s2|프I؇@:ܸgvˡ^FYjvO`kB-+lj;j옹WÚaxVI%Zv,{!fdAnߚZ[K'p]Qʶ,mjGW_53+d0lI&:f?p@pдy{{:K Btkl2ЯCS8C o^ZfOf&> ?<~^"tŔ'Jko,珺_+!|yץ,'{gu͞Qi9# P7ޅV-uhNKgxVRX EH}2f„)|ZJ/L 0۬cq;4P]x&И Uw4~m˼#~"4Cq5oW0,$Z!ɳw[́ q5܆њh/;DQ64A+e4}L 9)={JI[E%N(DW[μ^,$$WPqf:jNCt`. ɋjφcWkJ \['< Ϸe!x[Y]}!(M*+䊙/eQOZYcMjo} {<ҐH;;Űb8}*Ѽ&I_N|G!˿ވ$z {+J&2꼏9PHb:77ݯ҃k&XFI8pb*ZyhA~XX5)q7Rkve6 v.nf ..1r\^BѭLcuq7{bHH$Hдy$f#TSqZ$XLCt5C6S?HR%TeimRC󏜡044"WXb"DExjr 9 jEeb`8YےݢwpAƖ~nL{2RAF 7\&`WkkzR[pAp}RHzhRDz:JE ޔpZ4uyEW>Ȁ5*C|⩎+/R -{$+Ӝs85,X*asqhNLR,9o*^OkCൂNtV sujKX#E\)L(nld[.Ҋ$sFOΞx{5U%;(i GPXk!E.BL۸jk|Ew0g ȳWB¼ҏ=r%P?(0b;C,r~,&zM@3}y>.#P+\eb'=Qd6+q\6iՎmlVAX{' V)^0GX-iA̎ZXe!vu>a9vAAȌkGOLJSMLlI%+YmB迄tsŊ?N!6 [!ڳFIeg#C~ Aw">_hO)9w ?A4!DB!pѷ/ a4bR|b ,?|5XLRH]x+0\)rI@ǍgSSvt͵4.I( RTp]pz;>pLN<./:pqM%WbK ^@;`N_)@j?U$BzoT`mRd8&ta2δ2dc2MV ,_3(C-5vϢNxw-zJѵ![U3X'n 15x(}2YP>[c`D1m2C孛Um:)U J7AzyAcӛ&Ǽ4֑ܽxk~XBgh|؂ `ɜIlMYG6S? Pc)]c_G'l V>ss9brzq%ΥyޗzvzA-9m11d35;7tw?Y.|%>;!*Lz=F,Z_QQ>.%5?C?k~:!!sdv_#-@dT'ܟKebHdǹhiDK]j_r;K +`Q!UއTn<ϩ,:@JLku"!J0?h©>9jy%`+]qnQLE(b:od` aYaDlO@!ҤHGQ̐Ajn] _oVP= )T}Uq{k-gdc2|J%8u.F"@5Jl`a`HƺNKycd-e'Ko2z*gmՉmF&KS"Gm,v,ԸFH8@P TX$_f|Yq2nox\lL6def|< eO$C"Tj$@a6_&sxx-/ye6ID4p!Q%sb'rl*L!Y0mg17"V{a s*ޏx)&7M"16 {n^! a-|H@O\̕1I{h >PMW}%00 v*V9ji\e &{rx lBj-@ZO0җ.FOsUӪKM!^냌bIHݿ ֊BΕ_I5q54(\ξ!05yIb$+$\)*0XG`~YY,f"榐m.?ҝHG#R?~eG0 숼վpk$AH 5/^V^[=(~d*>M%]G>ZNFz֟*c;ۚܠEe`..o2=?~}5*l? ڤ#\KR%풶-l#<;s`G\17((P^ͲqlӆB)# fzAtՔykjMF*i&D,9#;hC ^h:2tܘpO$"1-v/*$u*4ÙZY_ZtHuP;+ZI0yA^7H[3̫vP0_(S.,87aNH0#}zXzƁ|+Mx8ijUU+mky!~K5B`'*֠iͱC%Z`R:Mkcc,'99y BA]n,НCzQ_CUR άGV8D^ĦȲ䇭s 9f[`ESKId66SqaȇeUd ESG ;LOf}Y$ W#俉F׳CELY^:Ab R&S -*`n,92mi/kRkOQ s5ytڪy*zHpUO%Y`1Ns}NK>8q3Kl m4l)1Nf;P%Vg(R^ztZH%7Wii 8}y})GK*\$μt_G"L e%+ W9=!Tw-I9g&'HE5X] >0C3vHI h]+> stream xڍT\ Cݝ kӍ4%[xsoFѽgլZUkZ)IUM F ؑ *'`aagbaaCTpǎ@w_lb@ vXXXXl,,!Bb@g @9 PBl-_#ƘW8@doa 䀎 R;:130m f  Gs2d 2n %@o h-A`' :@EJ` MgsLMOD࿂[ l0$d]@o"tZX^H+/ӟyfq(vt@]=eݘ9\+0dj61݆- $%ńfrpps@v9TlA9Y_zL_yY^~< ߎE cG'd7~9{ WˋX,?}{Q l3~Ԑ:ED FNv#'+<@`+6x.eS?g@hK\uY8Y_X?*U" 'k4@ k/ur|9,/U@MO2 `3n+DomW=h`"`dea?2z>^4 2<8b{8@{{ˋ89/hrKf&0%ҜbD8¿M#.""nV`^d8"_A<f?l_3Xl,w_>п ,dc 9!N r__b_:Y_W/3俐2?l_qd 2ue=ҽ.Y_p|2̎mK._Tidor7uoH? 2FXl&paHeXouGKH_NB[HqX hYyba~w,P-!';Ou?׍ҔvN<(.ݒ5=?gv*d'?ELSfqd$C?uEB{&L{[݌r*C6.+ *Di9h|S"o@;*⡱!}?b͉hc J}k6\'V'l4^+#EāW4BoB{{x'kc}>|g3r"=չT:T" fcxUJ+Uvw_w> ZSv 7)MDXIwadT+u{EЅK!@`nbX65~Ce"hDd(IITqG}P91 kz F\NGE46\4*O:@{\Ry>H䩂ߴ-;ͳ~T; wh&pghr6sbF"i'*i;?۔H\[`M0=LEX(Hh;} P7OԻ4$5w`Fʀهк) Ei]ЖzP~=+h7;3IC7owo,gh9*Mgl5 B:晢+.I$g.F>-ĽtPl~$(cRM=uWfָGa|W4ݩ1+S4إ~+gJeq"T˾!JUAx #=G Jdcny9 ƫ GF>D#ќ m"ĘnAWh鍒 ySOSPOumFIp0fmx# &;uZO{\.¨+^èPyts_~_}*Slz1xGGNNz"mn(F S0m uSFTr~YvGsV"Зe?PK&A=$2*`3}h,I_J,QݡI0Qn޷Le7@yLg!-qX0!!{N EfOuJt1)簸.Uza*(tjߩ~?U2noz)Y@5VK-OX nL.|`"PȬ76ލ[QѠ$A 0!b" ,j.$[2P?(>E{^’q|B%QZu7B6z;đ1U`C].XOתT0ւ[}2"ϝK"Uת?M!N3޵?8U!t8cZך\mq7:aߪJ-u ډâkB8950f.B́GH37Du[qRaKW╙9r gR$\|O@Qz>#ĶQssB1Q8j=cX#n%TvS'3g3S`|W|$n\Tc*j;<>}d+W\.:pF)hypaB0c'/ecX4j&mTPmZ/u̘UQj9f:Sir@2P݈mJwEF[`co)3wNwDlf2!2o8PZxKe˼SY2Cu#&*b5(ƇoҼ*Zٲc0i'e+Pɍ~oo UAʽ>%PCZ7:/e}+1gx(@3VDDg+YёCEH.uWćOϡd͚+j>3ťO%V<6 Acӕ;񌋜Hz.Iޏ80a*^Dx[kh9Cqm/F;"Üş QC;8\.g,T$pI16\߱%Y%$dhhYsR%|ݤa2bewҍ$UI0wk]M"9)Whci#(s{S2c+j,BdӤziüa)h~(F+o$T(H7z+'T/n~PI+kو1㺽VjqDD݄R a[8?m$TfO1@$XLbM?3VL9$KbiӻvGE$RA~Ct=zŻ$ЎکPz6a~SP|˯Zh͠,~5"S2V1Tff2W e1>; |˷9\n*U2Y06y9H{Cw[Ipq\@'fC%3kM}ҊO1W͑9oGrS I(\?4^>$uQ'iAT؊f 1K|fEI^;\:6ۮqɦ aR,n*dX,ITSVRӕr+S.Gם+BZ܃#/+~K='tmEh({X/xB CyŋN$d~ZDBuL ʕק*p e)#CC1Q;-+*WsR {!?=?K:Cʂ n 1J@\#>z#@J3df=CLsAk)8+kݲu͜Xzfk oA7;miXAa8B>] &кK U;(1x:~4f8hyՒs yt-硙 fPȈ#%Rm# D@Κ<>Q8uJ`})盒w}٤¨ \^$_{Xn!1_̀uNjA `}Hmg; S4 o\ oZax{Ҡ0E-:4WIK⥛A1iT2L,y1hW3 o')r.ۚiY +.l̓|C-\+Ys*ϼģl.R*tR\Ѵ>|KZ'A}O>g'-IoԦL.%.bVKvwiNR%aQ~|xeF=srʹ@lA_KrP$D8*QS *((hlamTR+_><%}Q倈Te|V԰}BªoRy 32EVycNB͑rcϷMUaۥL0z:pIi=SMu>b[/Y qEa)8 z*hNd3ѽh|J:k⁒A@1-p˭ oA,-\ y%|H-JEZᕉ #'S(M:gpR _J$v7Es8ѝEƧhœZ.=S-qNAt)d'|LGoTCHz G[Ys4yw6r2KCINn@y3%cqEAWY/05N9ݣC_+apu.|C(Tz{rMSq}zЗt{4i%,"$Y]̐ &t4ѐ*vc3*䀕̫&>eaFCAFNX@'xN:ZLfzh ⯝?>;1K&kZ 6({)>؍מ6Z5YՆ|{67Fsx P=rgaUM1M [iu6h-v4 DlszaȉI0ШF~)r:X #A߁[m0$orw~h Yo2{"׫8;$ )O*1gOc5xm;fR=A卟.nC!U!+&vr`%aXB־.i u臗 s= ?倵sN:(KL|idM^eJfVf>lhkUm|-쒉篖5(.u)u; =zaaS޴$фl]}*ԇ_+H[Ė._/X7Gp`Z t,#EepfM|j,.x M^R#tgțH',--&u ;=,lIUW\Bf|գQJxiZ4R@MtR[]~pW0 #ty/O ~tʹЇxk4Rz¦rcvBp }rߥ.q4p}i̴yWȨ~8ѲjV'@05ZOF"6D {؝v!~QUCֈ˵6ˇװMvǹWger×绒U\B:ZWe‰l_n7׍H[h_/ ¡>`*˶/9Q1WcS9R N(ũLOj;F9\[@,. `]k-Qѐ]xUNc2t"k@);C#o&)1;ls of~biwъ&EL{DYMV6\u롫:>  U"6bh^7NUZcvwh;?Jy^Y*dҞ0edDS`;k0y#5߬AZiҐh/5r/0Ff,0p'KbeߊP> EJ|f9s``x%4&kLb;m3=O| 3B :c%M/h: ۠vQ]t^}9 PRmcYNt$U*[]yUɼQNSY'A/Udp//lI(' o N\XS >潣$SmѯZNhV ͖ѷ܇ ilrNhz%ȲSS0$'Q/iF2.b_"HL+Bq0qk3d;'xVyx&?̉>9NM)7\dSkG͌Ư{^2U^ GmtgrD=h%~]>_# _m :x4F_Fg9zߖ^Q]/D ـdwVrHvI7iGUGè0O{8OFze瞑1ҾQ(y?1cf9;,yfh#%*z~Euq#fC#^SH:f[]o|N춐G$w{.w>l7PvpV\` 6+VU 731Rv`b;̥1X21jGV)jM|u'Qhk9 [?刣2;ň%v/۝[.Vl# H 9Х| @kbیEd#ݐlo!ym?m{p)i]^S b Wmy#$U}2~/ִ #kE$ `T \*@?,L*m;i{>޲Q[-YگHfMGU[8Q:`0.H.s$ҬhlHC27mEΊ!:nX­y0dE/ft?D xr܏8aQ+c!D^mg3Df/gu~H; }u^fa<vf-q+_3mCL,UøVT ,zC ZSIW NG\W[}gAdKi|*fCVD !FMǡ}h]hqػЦ ˳ z+A^} (P᪄iHsA,2+!֯5q&|/"IT?`=1d}gjڱ":"В;Y#ETKQ>7˓_⋩\b2Ew2d'T[ .ϗai7'njE'zר`l9ǑUN2P5x><}ώrRLyz uanE?cZ5M;׭hF*B>}Xͫ0g;ۥsW iB)"s9_$>Ha]BSܹhq) D(4ANywu+8kO"dn7c݁ ꆁK GW~=:s!%K ξgAF[l iq;=C8}7U1L=)1A82#hod_刞~Qg 9op*Vm^eC]uX耿!X-ðQQ.%hR-&/3%WZx)Vi+Qvo|z%>MI9ف=?7#3~OCM\NhBTbBVyo1+;O[U~Uo5tw Pʙ|o{Nf 9ώӅ3MȜ~~^TVoCq4nL%YcTA6D.:{5M!6 DGCo͸VZ)wn07d‘\w {ݹ99A+]7#Ǡr~-?#OlX%zYSg`z,us 7_CӦq)Dt||b_Τuƴѐ.mOlX=TAH* yW#>yPPs$[:h"Q5 [9\IwUcBMtځ_*yRΫ4 $7sO"\nЊv\skU_=uC%j0UcAtACo6WteSZxO{ه[xδܛBL;qV:gaJ;w 1ƚ<|u8IqZ<1_Kl$')8&y3g2cU%͠\&oTd&iQ%_Uli$jNȱU5>/TyxqJ;iU9{4V'*@S2;_g7%o [-v|UXlQ\sSG8h`1ٻUh;:ʤh3B-` qY{1\O]Xm}#4bٍ>^,uE}A-zb bG7J=6|B/l3N:{3k9&;w6b>F܏x@!S8/Q(R?2Oɶ>0S1Xe..d)O'1# R9g|{ ,yޒk$q'G3:~]g4KvC}xN5jDv I=4A$@5O_a=h8DI.^%oDxbr""[Pq-7!{NL ftn**cOi,@g2hm暲 I]$)jDQyqZ8YVv~qBԇ ѹ83R%Ҁ!#7iQ]CO19Sqti/ёҏ"¿+f7 "oH;v݄' ޷e38q7J 6XvF)mM5k4+Fk,sb1M}f6~}OO,3oqpڭts^z}זtr@2ޏqmEүn=O[FPAn~ ژR!zEfV3)H]+9AI`}!Iя|< ه%s:i% ;UZm QST/oڧ<'ΤVJ ]}l:$5$]*')gM%{E )|x K4aJHKM$Z}US9KY\:W'`@ĐmiݼuDv@]̻P%ZAzWrG ϼsv %nG$a3>BNeI_m2IB_E剅Ě)7Hu,G< U3fN\$Ey*ryYf/F0r/J[hj>W w9)ӻqbPp4g?h4K|`g}GP!hcz9Ub~ WtR:U(c ˌsˠ(^w3/kZ,dʁW[,SLs|Zy׋0ه3UαDme6`aUх\;j (\=a$H96MEBW RL?4)nLYrϐ/|Z輓*7{6(XjJ m#5/omȏڤcxlwXbc6z_>D63xj^tPt_Oʴ*50[ WD97 B,)C@ͤ"̒Cj[zf#x)hOEh y(z@hE?-Ќr/\K#ׂ|ׇ&W=m{EM0Wvaly~d|uܡnR~,5؇VQ?+Ȥq"U+%B(e#t(v@ƻ{8%e{qmjֹK+k⼃$!]6n7lʜ3{ͅtg<K36;W.ׯﳶw3x{OJ*'M>=D)dV9Z](;bnFA,co| endstream endobj 99 0 obj << /Length1 1581 /Length2 8749 /Length3 0 /Length 9787 /Filter /FlateDecode >> stream xڍweT\.nh,8kpww 4H7tA ܝ!H ;3㭳VU}UjZH!e àܜ\"5iC]%n./'#.Q G@`Pqd`M@UAnn^K?D\ rX80((sCl\V'ي-,,G8@ X5aE+#@fzW v"@' ۊ< vm0 w[~ P9nkAҁٸz`b"ܠ`8a}*@ '9NWD ++3l `*+;M9"` wd@x@^J zVp+q%wZPWd!p{>b(@m~b ԃB\JL8l~...AAn^DC~>0gC+`? p7Ͽp+W%'l'~P 0z!7كάaPG4PXO_֘vKK<><~.7 @ߙ4A*WO)Aaw.u؃oe-?B_jC[ P/ An{ R 4}J>(O;![kB\TΟvs5a!|fp  0K f{x 8p0`? rBa!608~@*@տ7A#"A!_Pt>%kW?l ™YW6_THQyp}9~}e*G龡,7;jJm|=rh|}tM3 0BՍg]؂jmKvPTrhm"}KRLϻ(c0)xqQB[[ʤ+ƿ(1 %%>ߺ|=ÿ3SĎ YzOr-nC0`qC:9941Te3u׋xBmpWa Kbn Qg<6Y*nYMSDmYUb&ph(]ܪ"U+]e着'w_\9un+W:7Ͽ-O;vQ2۵zZH;ݯ&ClE #BK.t\el0'[ $[Aϛq*84d#z*7ԆǢҐ#9ipoKό#qX&6'z~%>?qO&yx&SA8 I۸ųr+-Ik8AQē $ Etn_6@O9ttD^!p?YoY!vTR n ❇R!Ld}柖n%qsىsoKQstI|EE 2; J>LuVr)/% Z[=& %LuFY{ ;H4f%1WHzDNJ.sL]#%>[zKq9F.HZT}\j&XoHGVy9C L'c6U-'[YArLۏF[͘!Y뗷> /,aO-Ӧ ~(q)sԱGMړ#U6v8a6ojOZ'~i8agg´:z>@J:ڮ#Tbi+rę0Bh^Q}krn]ď{CV ybձ$/ InUqY4jSؚ>OH ZF.~q$eui;gk^gaU"5ĩweHƧ킟_bZO`CE˟}s+=K)j{}ʀ:@21˕˔2p!a1 &nYCN#[D1O5˧Ŏ0,m{&K]\/,71HVcJI#u߬jjhc7w$V>0☃Hٕo@Hwe_Y{dr3F>S2P&EbU2^z/"nՉDK-7}3Qcb3)S[4ZgL?# ]ʢ2 㒟/DmRO"`r>UI/8XIz+R}$_zwv*zsC'>Hn 5g{L %$g8w "Le^},) 0@48IЛ"Nh++OġPW(\7C@|Id2ukNc榒a֓8䶥 z71d8.:j;u/ƶc, Eϙ[ TE~;^#%B<݆K,l.m5vH 7$ScRDuK' Q5Lķcg踻DQKÓ5(I}2JڵOY2 P.qf1T3bm攵M]WjJHRn=i)t5Kܫ6E[t,Y%0J@#<%_US>Z'ϫ?KȢ;2(ס'fy@OSgfUXhƭx̳2yIǡr't+))D6^%;:+ ɲR$Ti_#~ힽ_cEP Iք/4kTԼžدTY+5A{?s*fDR9YvU\F_V17oavAa,?AYaͪașeyX*I־ZF))|7X>%aG%l=w2?&l{QGO zժwU6+&:yQ>昍q}0:-[ 1_<Zpn>e)Uah:ϯb9G1s̥T) *3M̳>D,Eլ@LZM)Iđhu"ğWqIFaak~$ԠAw!ic,RYD0mHg)O}[z'PDhbOH)kFb~?+CM8T.kѥ3n3t¢ %ǘw;\;\_Ut땁9]b</9/I12)6rzH}3 ӔʥE{)W #y,}*L+y(@,. uyM\tgE97L~bl6:[m5\[[-A_,U)L- jhD&䐶*Y:~=5(o[+(w%_&twLL)AqvT0zH&D}y<]i"! Z̃ҩt;kiu]|۪ Tyoe6':'N%6ld)0q6 T 4|^i`zݷto}>Z2 &vs9AOXjleI@_s/0屡 0}$ܘł.=X0Gwg>TюN0ѼvJkջgݭ7%t l{&4>0)^V̂qֻGM:F33ܔ2J?[Xl#%//⌙B=n&G?i]>/W<;ϓ~RRm<8(Tz)[)")9>J{jڅ9O%*8U_Il)r=&l +6<9Ϸx#Oo&y`u;^ Wzv0E{&SIJ`>& ̽!'00!Uhq9))da:U,"?`U<=fLQf9҄-=MX OwU(*$dWEfX-|G8AnAR)6/Cs =E;r]<;=%3<,C֗)͔HjxagqZUϲq([eލsFK2564H$dvxQLN9-Ã՘V;({8O;L^[4(uَlT@wq2 drlѫ:rn@o,3l׽jk|qPӡ&us'i!Fٚ|JJ4l#rP6"8IkJbi b6xŞjlC9J{gUz"zUI;#j*4iNAj΅vfCEC\ ;g)8Ɩ2I~OzuOP͗ꫜQc/&\ULz$tۜI^795"۪2F%MWd6>ϯT\{[(kV[P pY~~d]N2M)sR#>;)C5Bܡ,"e>VJܼDf))<̖*ϭfqFdZzt0#PeS,V_?ͤBސ;T,W0[2" 4Oa*L) rRR}{5LV>Wz"VXu/wX5y3rWɩ!/ejrM\}&y艳N.dNm&duOf'H SXӽitfE%O"]}k_k-Z77gcCX δY = / -bL;j.PD^{j˼\RXsKEMbJ8QS7ȄjP3懛ڈS򃕧s\$F-m:p~/I}FdsbşF~ 4C#3ܘ /c?vr9&&7vTfba\Pb3jTCsxcx\}*5mE{wB[TR09m#W_i?gVs{;Qvjؼ/tXW ^S@I$Eܿǀ2bBV~o|HKVv׽=6tց"аzt0؋x|"z%@\!qSN˫Zױ/hsb^cJ]o/m*[iW.Sg4]MeA'i]FK]I &Ζ*D0[LB/]Vӊ$+䂚'D$S>j)W'GQCY*S?69#.n=!(:\w< YKE/1g=z oS*]G\ קXnmH;}Z'h"t7Cy2*dV5č}$ f`NGd/|\RfOFl=¯5c(Á4#AwGLO|x XeooGjUFM<ݦBQ~'uQ B7?VE NEXUoV1EH|dYZ8e|bNNޛx*f|(~gc œY$dFLA\L^SoZ^5hvtep_>bf$ bv-b皧{~+q[·ȓMd4ͼ#8 2_aV*WЃGok\0#o/\^/ u^e(CDHz̦ыiE#/Z\n$4S&X;v7JV/G<Js[wjJjIUE/>z|vȀE^H.қɜp]tΩed$U; o@gnVPe3S٢0emjt)@s(-ugl7%qeg&iMOJiDAoqA/Bb*obA7/޳&Ryw<ҩ O[G(s?1,g-(lL= 1U9rIy ~$lE`TP,dj } fTGH7~FQk?"bE7m<{qɣRiГBtx>y-dnu[mlZ.~gGXEZJ>3qdb~pq@2Ǎn'&9H>HVvzxRl? [wZL2qU V)e~$`%zЧjI\m/O8`'O7V= Θu05FʀG,q]%#-5{uq32 ^XijYl}3 湃`rBq%2b"u *k&{\sGʠ2;;^"7?Mh}I}/q݌](J Ø )鈴dVڜA-9޻oxSM_"06,*;7"旕Lwk@l 8'@bKnQ'\Q\ZBQ(@Mt'_K~b~6[m{B %k)Z5/1bİ@LA ,#_lk;g:&<1ۼ<|N59N#l%_q*6g) ^3D?4Jrn}}D#Rnd(*|$Wv<?^\(>Zއl} Н(QHg_NlsAV?V %;x`1qޠIe;jq}uB2h&#fRq[JGiϮ2Xa;Q}k@ i<wqȼpF'CA\ƃ'EI㗘yz S]:L^ vJꣁdXh 0^B'qGܞ7/fV 3~x^= P\Kb<,sg ;ǟzFkByWK™8*>LH.q fJI?釁b6z)PSg~&ÒupfO7ad h3-^/STJqtj9H Ō8Wd tΫ@8-QU*< 48YsP3t˶_`Gt7ҌFʳtw"8-MZDց˄nN#Yo}?UJEod3cvo4? gBiOFMttFZl6O=70G;ɕc*[ֱyJqgsI:t D. jS2HsS{ս}oen:K}_nXEY<⢍9F%^{QO*S1}'<#0좶8aWI(|Rr5L!]ť hOnE'Lju s#v֘oLr7'͇W~ ^nyŚtbmnzU]݄i 룊%Esoq 'kFJ`2G =C )T$H;/ҟ箐]k1z% =1TOլ9 ^!03-%^lI=Z0|x2KDž~eF<\1/pw؋U6=+1%mj⑄-ȴhЄǩ;:Z)]&-2򆼹; 3|wr#YX!k^<%hÜדAth* \ b'??u̒T> stream xڍwT6҄RE:QCH* $$ IU*H* H)*J/_PϽ_VJޙyfϳΛwv05$Iuu5 $, 89XW~) #RPF XOuW XK@@!Ho -Tx큺@-$p*#Qhߏ@n(,))~W:P C!.sïP8 2NX,JJPS@x=X'! C{# n? 8Np AÀx+ C`)04:HS!~u~l,W?_(醂 GWza! C< pWuPMOg>  Ga1Ōe۬WFX ?8ﻷuA =>[pP& $ą%D0w $x7 +pgA!Q@0? @<`@,?`0`pnoh 0{$_G,htO)ߟTRBz}B $"?]Op@/]ߨ{C? O]L/R42;R{+!npW??ښ#]D[ORؤwY8)}EW&Ң^YC"i!ɮxEtOnAKіzeZ T }3]QZVsbUXTD.W<3c3NVaӾ8;J\SQhB͌oF-ZhzU2mq߷kJ YWkqq4R Ȟl-28A9VRW[)a=A^ދ@=aGI`&t0@H߽.m:(PnT-7E੡pD/]O+SeIaݤe}J'?~iW'F(.6FU1R"H& s殰#3N5vVssJ,=.obH\zя N*ܲn{Y6!l:;^򵖯U`A%HvMYZ!N1vy:<mA-@I߫ ĽiNF !OHѠG7& @7t}g ajS%'$yg*=ƺݱKh"P (.mВ̜ F.Q~1G!TN^Dz;|Ш9`2Vp0;X^fQͺJ,gPջ7MfoHۋ<7.tAw;3!͇~<wx`l޳[c'iyMlq 5'Bgt+o-_p|n^N>vj8cgآ -ִ&h^ce`>x/8/ :e4x;6xدfu$2Tp<LV9Yߺe1JIvsȂx`^i3e7 h jg'zH֞*E`׺6 p{# mud+pai@&EV [[eU`W盟^7Q&C,lQR }2G|PSMJ"1nl}@@sP!+(/s.{ɚCC{rO:&|;u]~ %nTR_[#{&fcZI?2`X@hE)!gœ'{1=^4h92oeùakz;4veP,1̜;+f:<&.,=XipՄ=XeVAS@Υfx3(H~!M5f<2>;¥ܒGكr ѽ+oFK$׹gzAЃAgz9q:qOzMR+3a,}3.IOOL"LV$2D}׊Xaʌk +JfJRoV $Ѽ1K(j 0(MHA}!PWHCCx.%*o׻zo^F҈,x7sLi31@B,q3iU44yg-e uix8[~<+Jt^^Mff4#[ΦV'@mWj ИNOPnHԅ ÁS3qzџᷙ?yjbCsW>r{Srר{W|۬3[eCb-c{w;fZ|`dNCA&G}sJ> nkZ TDwR^|a>R|btD+DF38=hIR0e;іIͷ/k/FyO$U R&:)+5Q l,qG؂UMI|; dSQQo3m_\Rwߩzg%SrܤT˪Euk{aS3drEyg{صʲj!\a#1,εk]j$An3& Oq5#B藷ʋ QݢT^:*o"v3$D}rZRNy4ȫȚ<y9X=GVIĶj񌟨޵@ܫXt9 (Gs BȸRJ{\9Cb +m a779^$w{R)?K˦ݓlnQ s6~h-}}u@] &8Xơ@|(&AhoKjt3-l1NWcj >Z@]*Շdaav[Qww:BOi753{ӈѯ,_?zsHXlF@/rx*t|DžiPb;2jJr*8UeYvKqс8GЯsHT+Nh Eȫp[g.Q-MN\k׃B ̶K Q7Ӑ :T+C,J\[_L&ҡ#L+!ȗvfD+~Jj{E]p ,s=pPjBEsP*UC6uwpf\c'~nfY?tp[_\Ni'Q&"HLE뷨9'Ku[K6>ka 񽭥e[/=ڢϨ brgYVEJ0RVB!]jt4gw vo7{dBgN]NW|IGCyo{JsRGZl4K>Fl2| J4r3Y|춄Okw0Ĭߟm~]JlAj$VDbRt)?Ww|ܔvYHIVcML>'4 rvXQn{3j9Ax0 ^iJ`cŋ2 gKVY3!wog9 }DQ美-{5N@겹eա*T^h`']mk,cag䕩 M&. Dq7oB}[百^͍lxzܩ"PIdJƺgforדm3^9ZtHQ?<ơ{52qK$I_a+|SzR*tseWʑibcz[=Hhh%ʏ*dgq#)tYeBVmz0l$P Q8uL5ԶwegUV33jv"іB&P­<)u"%C(R%Hv#xQ+,GWU ]]|;҆ш! z?kMn`ZIFJzgЫBi(s;K;e5#zmI21ښKX#"r*M֬; #w4k^Y m ,r's֞=Sw.yqj]cAti{ŖbFKo~ɲk)+n|NT'mY?*z!b Ƣc_- ] KbfR:;I&*2<)[Vߒ_~O(4#!ØcMSw; C^DPշvS !I<*퐄K?QrVn%R.C8LbqTFhWh5G[%(n@ta'iv)`u$F@clEUoW_?=$% !lOA bG((wy4m dv K5.ES1)]P+ކ2l^Y?Շ*5}Aw+y?L'Ku2R]:C VQqՌT~?/6dmɿ\DnwXGy];p RE*j!9;a2O+ͣD.`1aE/%T8x֘:ο0Y)T|L~@Rt|dۆl#/` aqFz\_K_g~uPԑ9n^|:6lU־Ș6{GǪ1mtNQ?!E g^ؗQ>L<{N_Ed&svXHI'jgҟѐ:G'2E0}1t;h#o ~峊ƻ5_+w: <* k?_.P60FPfkq+:v8&R;#X R*+ ]'Qו e\ouF<.lrN[D/6 XKaQ_]Ȓpq@@uUk#$Մ`XcKptzy錔 AIBζt36 |E[ϝ>v圱5GD-?\Tu Z$"qr,8jLŅK;J2prݷ\s~ a~Ѳ$:cNLJ juxL> ͋y->jŁync>yRXPHid{G %źQxz qKʽwǟ;V>|Fz`Ga\xmI6.rv kz7ٌ(I(^ endstream endobj 103 0 obj << /Length1 2292 /Length2 18719 /Length3 0 /Length 20059 /Filter /FlateDecode >> stream xڌp VcgŶmvVlj8ƍVc'/n3LfVu,rb%Uza3+=3@T^ GNfj W Gtvr@h.3v}wȸY<̜X|z5='_ f2yNn\HJhu}eˣ{e1zA_fMI\ `hP=gongPs'ވd>Dzl=yVt`ߠNQ`ZҿWLHBpYmmS>GI)mD7t&QĨn5Fsatjt[/qO׽f-|VZ4 [x0ӈ[F,dAujQS!|/Dqt {@GO|/*:6f?@y Px3v~^c*nN)1-R0RxQ VE$žp1@V&-ٳj(J/TR5Px8~!hP$$`붼\㗃yGPܦghN IhX5wbxdM5Βg2i1rE>_| b=80?4Զ+S dƑg-5j\੪zo&&eDAs;:?ULԫyTӚp~Ml?pxpB ]`X PTJ&WL6c-H_W~Vίש J.&~;̑;)l?P9 gǪ|>9 Vn1aZ0a@(kS/TДXCyj>P~xFAf\q-Jਁ# Ҙ}VY/ZY;5wM8oJHtҲǦNix'R4iR^A>Wb4݇c;y^4<9[mZ[aEpKrX8RTGD2k )J2EiF#CZcE}ֆn',pl(~Gv' EIwĝ(N|K/[bF^,Vľn7_{ e1MG&6-r]+)K&zԎ<ړD2Ɨo'5Y<̦w5cEjON&{+L axlm; _-GEN%x`R`J8;_CU/=(JfUHz>Lܡ}i~TxQD 3˹a@Z5tR  5j΅WbUڭ3-C<}>OZOb4ɶm'Wg!Vc+c6QwV/BҌmSdy}:/vo-1Pe$2U@ xM|} e+/g*MeJ rS%؆ZՔnCtK!IMIn 1F>0w@C!s,V\u%c)o1 oc:̄4e;&>eAʬ mc3HU 9Vtm\\!=azB$j&O:4ll-L+cWRF6_ٔʹ4] lN \2푼?u@Wx}8/s*.( qW눖&zH^۴Pl䓅=R+RvO X-oYO84BY$ xhk8k- 5-,U< pټ,VY(K4.Q޻5!$,dN'N w(v%!Br@r#yBj j7,ZjX"[.bI.f*cWYr lPrJ7MيE쁁̰P((\\NE3V%cX׹8yPD VP}x 7..^p|s>#9,CY ,4,J^թ9r>6qw J- F{Cp|LxT!p > 6&k'FrՅ0E}>ϑ[gr+-{lIdhvo.)W:4w.7&B>aEE}La4t1ao8Y(OVfR9@mBECmϬ:xdMNk>>=hӰVĻj8"7E}  gDq!1\\r"14=EX.XF僭$Xlwb(`Ruc`{%O@< ChzeIytm4VkūM)=r]{Sv{2GNVFӨTץtHU[\cI.}MAߚQ&~`μV3}QW6؀9Em {rTcnmWaHz9D4AH5Lðe xX#o'_eE"9߻V?5 $Pv[^0C=1ZgBZݳ.DIrwcY ,t F<7/ ~a-VN9I>gtqN7*m'~s?!pLe \&U~i84Ŗb 8h. Y^X3JifsU׻s ]0EE wI>'qHL:e#s%n[`ir:&jɶ"oK`ԎwQ@`)E*d[) -(["_o[ʸR˫mb=ǔ25dBu&zjH6di}Jsy)Y"-Mۆ&ކXٟcRgъRo0CcqDߣy"j/>m4#鯐‘-B!/SZ gb|JΆl\QH!`A^2 I{me#V_[0w*Jiۼc(3qG#EpmGJ.72ի78s?SZ./UGc$uJ<=+˼Űe*Cb/ WI(L ^zI͋^L)=xNBImX/@UZGmv23wV?V'B^lT2o^)P)TZGm90 oE*~5|tc7̄oXd.yBve݈:`X\ii$&Eg^fmIFT_Lh`YRcbGL+p+՝iTmg_b7j bnxtǨxNan1!Bեq(!¨]O3.qL4H>Hն:W)èM\'DrSOgFF?\[GZ ?$b̿(o~U01]nX q ]=ueqh1fV/7׃TV1 H6hq&ŢߝUXA]Nr@ڬt+INc )œ$|UY\_\vKl K&^hKď 2nwN,r"u.iV@Y/#PL/  ЖEhnA]BIU%pUUtJ.m`&]C<> FkцcSS}-eLrÃawXsf55ю|[ς7MƉ̜oZKQA~Axsd%?^(6OjyHwz/wI*1`D)Y7得tleA^OҦ8"+"Q2k'M2N5ւq<5C Pov5f?;tOJ)P|D*ҫQP$T9Z8WxVZe᫠nМ jg3ok_fXS6P' {Qhǘ׆U6xwޞM}_p=y}d7ǒ7 WJlBVGᐆ#_x0|+ᦑfÜi#Y9cU_rۑ2], QZ:L-Ʌ^A]un54˳afMZ\i 4_H,' .MR<W йv +앛WE* 4/k-z? ˏi^άq!Y&Kox ;jĵÚy?Sx5 sgTƽN>l"Ec-!! .9S9^weOK"xiYД|DuED;>4,g7@WꎁIf 2U-  #*&i;]عGۻ89WLZψ127b{<%ˆK3$KsUXuW)zJL2wnrzTeaRJ D{GsVbU\Oσ"rPA/X- 6  ( ]1+q %z:$rvNSPտW2> ؠhSVsT.VPuPQ`ֿY+D3@ k_jEuet>rOI Q -x`3.%Bj2G//WF86-цycp`'*(Ūl 7C7d)J/* u=#)}4iU&auVټHiLkRAj Yi-RT*^ڶuSr(t0 NN2$[|Azh.6IRGozua +_ r꜅2+ <H2mHck+ G6R~D)kgI_/r@'DVA$u[kҙX;c[zzVLL,DݯPaO%'{I7x8cǺȈȋ%6$_a!\qYx~@oQj5  TE“+M^fQ!t{ƒ 0QZSЙ *_ρA ]gV6O 8OQfWZg?X58\H/:U7&ub𦶔W-lHoiY#$~DB\afjWnaY]e??rB 4Kؽ:"&/AZ,کv<^ ٙXyImEn1ApW5Z 鈈NT[HC Y4'kȼ_[}TPY>MM|0 dJmL@puBmJɛ|+}܂zL G02TM ഛz0O7nLXa}"glBnj`&i7'\jVF}xY|K8)I[%?`2E,$oxN?kJ`8*,n:reB\jo[ӥձY/:I D Ӈ 8#Y o%LHh]B*@kOҽk­M$A{Qfp*+)x޺- ǂm o2JBHJ"ʆ\hf!ۦ1,uZY]lC>rUK^K҄)+%|~ )ςZci*V0R֒Ӡ,~gs~n>/ūμ c7QɄ شd#F)fkn-^%_Ȫ!qb">s=b5Y67?X1euAtb4?]MՐLO A[lͥTrZl7Ti]R2-`oH\{̑p;hÒ\6|gxCu9O/1V1-vi";}ސÇ'y6ٻL{r*t뭪)'V۽wDϔ0sJ}uK "24cg`nS+/W"ZX٪}e2&ߟB@q93QorԼS[ yk؋!H(D5nFіa/ZX}';:{8 lYN#}UgfTaqT@1BQ `}z0c3'Y s*$Uи~΍Kg>qҳM dE͏wUQޢN=g+91|-4[50>4|F:J 7~O<ܳVz%o[ `d}4 VKt-~31n!7Ԏd;;.z~}{dfl]+ȃq~c$3 !hÅďr s"תh3D${=g&b>Yia{uf% C?S`x\0<yeR w[b [|"/Zv3itThgWPSZ\X2TyalH6+Y<w1&Wzt',.A+pƀlBǠ>bG26Iʺ]\/(4{$JR2ܫkDm䩈d53F|rvfr$@9e;Ƴ|-AHDMiK.6~!4M00hvĨc%{g7ΘF'KRݾY F'J xuVܟ *n38@t 퍮 +W-l QqO<^'yBVZ!ڎ>~Uoh1ꀾ|/?6Ja&"Bap at=Xhfd7lX4u@ޅ/N#lW[]uE6tFK^1/bv)s{b*|5跷S' f~HB /Ta]$Ga>/st{댤JVCnrpPEHGp?1 ,9K,pGcb=jt_%W>ͨ6;JU?>*9AݣΊ 3g1X19ͤZjNQrmx{jI=,lԯCCnKl ,( zjW?6d'8L?;oLG<\苦)Kκ Sl[cYx)Fp/'۽}a|wimN15Zغ(Z`Q^لaw"_uۼ FH6It/K+[)/-S:t 2mz $H~sNr<:[)BL*\!#> l>n(#-LuQC;"CG*Mָ9Jǡ/zTb8,;zT'sV! -\}6X3[JXuRƓԿe*0*YoWGEB"0.MSy,_߉$*#q)f#,kQGA2Qϑ/ECL{/X @ͺ: xɢl* 9C'>~#<+u ]\+Z"9LCnc)5NG MQ%rJYivٞHط\ĕ`1+L_a>.W"̯v)}u2Uw'?hw% j1~oq)5˺fa+2¼8V[zXZ҈\*2rd&_&ฌhܪ$RNNraRT/ _U܍RDJ +r !\C8@l4Ǟ܁਀Bm&EJ/+SX NjmdIyXsp2K|:蠦8Op<X7q,T/|(`n5KٖfOV^QdSșqַD"2CIR"P,31."Wge&K1XEpEZ ЧFHb"+y` @л8z,t_B2Kn[zc/6 #)9&%S0*y=t O|P--۹3Хbžb")9/55foGYM. (c,ʺW7Ci!>A$tC~VJP&׼SuL1z@hY^ !%Idg2~}eAz0VG";p.sW\}Ь(9_7+"S޲!W<*r2R|]W*yY7vzDxz8 Bx-@EYg)6;t:=߂l0mܷ7żXo`2]EC)7~IrHT044`9JǷbI`u~#Q*-~9_|]n]Z͆Qblw@'%v؜]XMȭʌ.a ԬFJ'X;pݝp͡-,Z\iDͦ;˗K9W'A.9;:^QQjQJ<A$rA#jtsŬ U 3cFCO=ag#?X$-I%/kg ujLNBiϕ3zhǮyOխ:]tX8՜ T"?wc.Jfp0f̺PDxMIul(è_tm&7ɗe\j;~Cyi[(nb+1&I"YE O/|ABv/PaQSabR{1hG3ai7 #( c)0NT\$ &Rn>%/NtQzP@`\pi1>byK%!*~mlGJ7$)ewy47Cs6I!Y/ag2<)$ᛔ QqXd];]u (ɮ(1HbuPkh7HDdP%z{/!jbwN0YD{B`P\ ߢd8Ā+o@'rQ]ifmrOҚO>mpҽ޵'ei,^?nmxG܈}ɔhKn>mU 6>YdA7yseRDOCEd@O~h"Y\E!@gi7F$z L &2;kgTOClӐqDcB蚮LnLfR.ʹ`yg0<> X4/yan!1dNGނTռG ?Ӫ q{Ug=mu-Ώ<0c̉sr.ͽ6RRN;=6nN2x͌Lx0 %V~ K*›]%=z^Bצd,4$>R0I4Qp_~@_~ 3D^drb6,G+\aOhU&[˼3`We~ky'Lk> oR¬3@X'EcWt}dziC4w\3ps2rgøםn>z3[()(f% ┶|}ɘMP? ]YNkWoʪXԡ'~NMxC!&_ڵ(X7 Z;M"Ifݪ3zzr@~Be(9`)5 (F)3J!%co `Od)0YcSSz+Q{q,(8,Vζml /~4 Kl8P$;5*gEM _\-rG;\fh'kgYn%ޔ;)+Lug?N^-Hn#tcq JU'Y򚴫uirx_[1Fwx\ٞXM="aNyz 4;t~c aPEd:f4-ۊUQ^,Q8EoKaC:[ɩP8HaRԺ'My@b/aC݂#H/wKIϧێcNH)\kutp%Y؉?@klNw9IJ M͢pcR-rtB3z VHdh1ո׬+L 6X⏉ ,E@1|pA z(ALP`bg&= & lu6#oY/a|J_EڠJk[YLtMH =(;.DMe:#ދ.vgwV>3 ՠ2UgLjv8B>4󗊍}sB5,$L|hj슔a=P/»cVMDG<_Ry o(B%X:ߢYR  Яr#ּ=Q7@u79u ogN.*yZ#@%UIW/H6\$C}U 9M;'e~yGD>ٞBQ,Z7l#ܼau(/b( (Z|{Ĭֲx ыyk%" +.V^OT>cI9Ij#Nȑ6laOw6<}t]T<uݢ(*[t m?ql+UX/]hė ˗`-ʪ<}cmBaű^xz< \,54c>iHRɬɆ_X 7Ei׆UE~nni&cFÂi\nTO|Ϲ #(ȩHH#2˓t4hh2EsjgTo,-5h-dH `A?\K8PfZξǦ^Jm .',#1Z[jS ?[^pLK nq#\;ŒssdD@AxYǔ8[mrf|90n|xiJ(ߦVrVҌ<X,4,jr.`QV3znPD )Kث&3^]1^}OVkJn16'!/7gŏOSq+̱͌C9iӻ44zh.U$RA/,.D (KgY>EsU<c5Ǝxnm8 Qk Ia|\1b.huQ%ULKzjQ֪ ``:'qDd|M,;FO(gfndk ₙZ<)ә!w򶹢O^PG>PgPug*E *"e#ǭwh %BBq1tZذ>UW#j1Tn3Q<+yR#iA墳(׶Cx#L"ej1]h6"MUs{ ZVZ 6dbRgb0n,ǹ qUL}SXmk]7gAb8$2\|_؊FP,zD! n4/RG!^vCXY.<;!GRb>4?4 N&vI2 ^*g.fo oo0~\4eV0W4Zo%X}u3<ƐWLxqYq31Vkr&fHVm{% bg!Ibc{ +Urg|WZ+!:eϾ季S6/!uJ hsyTW(:}hvUmCOpa(fPxS Jd Gb$ȯ|U1 ('Ń?WQ̛P[` E< FqXFSn ?Yǹ:;J?=:%r 8z Zcxy5*HgOL;ݤn}I5xTmi/_ޔ.JNN=+~غr@R1 T81vb;CU|o\ \[Ǩ_nVZ}en".gwj7(S}[| "P,rR.@wnC7]U p8?b+BYM|W>V}~fo{,K;I c'b10[X5' 9g^5Ԍ}FqW_JS7:9bA#J#=Ĉp%coA1Li+IEg)ō&J9HO OY" YIe~.inu,HaJH#/m'e|^+S.|1`?Xc%TReZ͓ n7~.*)v~xF  "작'uߧ`4d + ]#Q'H';5ҶK.$7̬-ä$_л>^"9AO-rg8Ϣ*SLrUG!VuچdQ&MK8dƇ0bQRk\E[%Of#l&:BrDm1PgϨ8#EEPJXO9g|`\B \!F%bC2 Z'rTrdd W)T'n¯ghK#" ~E/*;2C}]UY)|alKvK{l_˜݁oݼ&%1G:!:rM=)qÊA_v\L:m)ЉuCD<7HG!Yy eoDٯv&D+3ๅAJƙ(L- G-aE ؝I:$T5+'( >Zo m{)h4O#P鸏A\-nYWdAEP4{5#z$Z2HrqM"^G~z5y~rU "bT-+~8I:Y<;.7-:)n݋@_?5iZ]īZo޺XRe-f/Ͻpw﬋$Ù  e\,w=+9q߶VЂy+&o_2uݐ H7(TK0 p4(HH Jmd`DfTos '~x 5FCzTa*3Ixxo{\^[O:%`Z&=2'm+/I='!-6Sg럕$_W'87{3g LL0t\VZO,7zyX*{@_Y@::WD"FƆyV;´2[%v\قF[gכbJ;GI-wY(nr2:# G_+eof 1%> iⰁb@;;>B윞λu{}i ?p$U˗6mz۴ 7(Wʙ께p?-۠A2X9ӭgţf_r+9L*ӌv2^'dm"z 8#z5Ђ@.DQ:+"-xV&F@UdV|%{RqK(8hXjjl%iv: NZ|eYCͫ8{AQmے'zu7O+-yv : E4RKTjƵKUKIv^τVKqyk%bf$n%5wdwr#}Z.:{*'`ڇwn=fњQR){cS_7,8߸1 H{`$v˾(ģXv|\:_䁮zA}}.(e߸],Bw>۴+uv@ FvH69@e#GžZV 4tmCE@%mc, K$0~Sx[Rdܱg+pǶ(}+DGTɬ| "P *2R-H=2xqb`) ,&.18`Dہ| qO$ x?٭+m!uGTqdH;Kfyw%33rNLT {Ko?ٲmnajنCCal~6NM1pD˥"HQIR7mngr'dU~\+&ד*1e?B|k blZ1*z^;$bFI(fT^BiyqȦI}׉ _(}?_ȖYh"i定n ض.)s9kj9 3Yd=v - (Aqa52&.h3Lt5}UN&RTm1͔=&g^mkŃBq uS `%D2thB٤~g6r߂7GIf_uh}Fh!RΪ<7)c~WJF4F¹lsL^u)?zTA "RKaGD0pjJ HT7eZ۴ݏh7Wp&BJ*0ߎր. hc3Xf'y:_rrUc)؞L=ÄWcvx}Շd3D endstream endobj 105 0 obj << /Length1 1644 /Length2 9073 /Length3 0 /Length 10150 /Filter /FlateDecode >> stream xڍP.{>݂kd \  @pݽ{WWS_w>_FC] ,uaȨjqx9x0t .v z`3*/d<:@ʮvn^00 G0@r`g GO0@09 PXN4!`J,j(wpYC\Z`g0 l0@ d3 5O;< `S+ <VR;:l+w"`# Z,!v` jdrA@fOTKi@O ՞9 "4OSZ8ۃ.듅OcfmP￀%ja WGN]($˓ %`sku<ܿOz;:8,B,O_ 70 7`1w P?ˇA<\OpI^P;_NU%5%5?;vxy@!! ?h UOا)``w.5'тh܈,7oAvvdI.OWuxYUY%HA#YЀ[)?k88C~*vn.6p~RiqH9 `0'דxOhCNS=_ 8DBNSopF'd4Xi^N /m=8<a|ZN?OoaN!ov{z<𯀧I?+ O{1EBlCowv3Xؽa=wب,u9A+ܵm9KÎfdͮ>ofw0>̔J5 SSH~yp EUf(pr(¿qRhZ [Z'j=V7(|,# - ;%S˫3ʉlGW8ғP"^>eOS&]QLH3em쵫u;a0#LJ‰Hѩd_N—{CzQN_ 䵏L5\˚0:N ĈQk5zKn4jy3AK;T'UN{g513emV; lޯS& --AblDMWrdXԜ 7ƍ,u]7߶ tj rJQn·\>l ˮ?RVt_3p>ĸKJ[K. O=Ad0O݅Z!aSbfXDygIZEP[$Vrbe ug.p<7Qu+nPjֆv{|/I"ɑzA*:Ac:N[Nͮ璮1k+c"MU6ӟ5޲x0m3x:Z.ZD_B(UuVcQ5HeU{e7'wM9H\`$C2Z`IUFi9ĄZRD) 2 R*>hϺe6cX `hU9ȳDqd%HqIe yQ%_um䵯ތ.ЯÁˁM1S8L%ƍOǫY" ^I.,x%jXJ|p}[9/I*%o:m:JW5AnI, %ciVu|Q 4F!YG)b-5+j-Dm8"ZzpǺG4veճ0 'P|g@陱B;ֿTFN2Hh Q^+ZQƴ(Ei_p@"yJ:t!@6ZI"ff.aR + 4YXW d||.!8_{\[e i1A ѥ4SHEEP .(,H: wT"agzu:UЗoVJm<@)ZZqr?.[f]s4k:X̵y8ZKr5GR4`VokœX䜛fc?TqpފcD g O=f`FT[:/> 8E:f8q\Y]%xyJ]ϖ=3iEO9T籽I*DwfInCզٔG 菲&bz>Fs=S% Iń 'g|.0\5! -11y.d0} bGiVxDyruwAC[ue̬nq@OVrT&%{Za 5y -A{ -LlֳbaY |ۥA$3;Ѱ*4>_k~p⺢ZlHFzf) ]QuX6Fc7:N.{srK;W=4u^$?qTbGͰ'˪4-+8YqRʃp4=z< 3&:g _[|faλq0(*R0 c$Թ %ӵFY1σ+kp-gY5Xߑ~sva] w9ednWCؽS/:Iݱpb\ƴc측ƀZ!RLIY,Xdu)bP 9Ǹ-^QQ7&o)|]Xb(nb-0K`>)K5 Pn║C~ I؄HRDx,(]C@ o l6k%\Zr(Whp,`ޥXI/$-&Dɬxu\Btk{_P`r@N]oD6R[Es:FӾ_g픎\SW_ ҂S/,*qWPH,ظ 2 s2()毠MD"g< f+l]nr2 c[qZ4mHǜQ=$AZr{]R/:u/lSVj]uaEeӬaI!d\S!!F~z&s[]{ ? v 12 ɴgVPtJh5Ć+t]Eү&&w.o4d|C.>\3 `?%!*piZsv&^G&8hK % TIfM͚\Ve._P53Pvmgvf|TPf9YxC/1[ Q x)&sHqmY76gd+Ec(+>zv>VoQWO#[z)iSm-H sj2 o]gn8JTV"\dKI?y)ѓc \Ǩw; ˒)^ 8-|il td]lͰYȄZrhCdj-΅SpbG\3G퓂5z:'*=Q;l X&ׂ8fWR/lm=%:K֍BI-)7vZ]U4 2,HNQehi!V*{G9jدCbܧo=S7̾G$_trPt0UsB4jLO" Mb1eDx`Ee%a'.) ?aHY9wPS?eʿ[y5S}oafP3ե䒟[Qgπ:&x#!AǶPOޔ1Aґ02" vEr4`'7s9U6v:Jw>V~?_\ ~0;t/?,Ze'/;^X4#}JMPAeƣy fCCj?]wɶr{Mq6LBseqN+o2 MVj30hԆ`(ۥJ dﴜޖ]!}Nd쏲vc졒Ǎ ]`i`*0Ӯc }l :B'HÅ EOgM o'XitB˭5NNqxAG2MNA@XkK1SSS{+ۦ) }61ǖG*[|"ؤ>׬%^Aˍd&p3i ѺR48nw0iXEk8T'( WxxԂ-i ]&pNɒSnQ[P??}'?rp^ 5,d:rn _Sw\WSŤF$M%ҔT^j-lbߺׂ;kb8L9~bnK ptyS0\-YWdʾ|:%shǹ'R۔(n<ܓ6U o;H.s]nQ8=֊1=0sUD-#eC3]tх(zI܍L"b\ܸYllAE-;a!ihmN_>WH}-JrR`M# uyд]B51cLD5KVN1eր>,)cfD:Nz9_+H5/{ZI&ƈ"i}.XUV2%Wm0+yC!͔0F]Ν5xv%: [{\Ɲ̺f Xa%ҏXƙ͙GRyFg°ړoEMP6; -KhzZUTh@%dL`^{5&|Y]5Z,?qO8eWk {[I tH&Xut O31﷯Pf;qȵ43IuۮƓfJñ 0(Yj̘:W[uzA~ Qeg^ i { Ylw*ѫf`p{9q'B[c7T/yNN%7UdUxZyI`FDb|Uv{Z&K W^'vJ %| \ss MWRh~Gri;GywIfHC@X2_lŪ:3mhJZ\0S vb73JsuA4z& ZjET<蠏1VPqliC3C %,w' _VL)+/{!iBܭs׎ N5k"Zf4cΥĘFhabnm6-=uݳkI/2T* ѭ}))ğHVJB怄j"(ϢƤv:4эD j}SA,qj #(,mܼe8_R + xdF6eBarmytW`q$u6۹w7Cy,@va;</UB\`Z|w ?+6o* ];vjVҕ8 ;z[ZO!* ^M c / (ufWQީcLԲ YikcN-.Ô.Bu{̑T~$b[bG?ȥQ\W.^Ъ@YZ –5K1/5$,#+LGX2n$"8"Bev$J/nHGzt,0$u]A%GA&h rMә2P/7G"P/i3L-%@^XcraF2em;}kuSPE,@.{8,HٔL~S̾Yw'hFx{2bF|h8mi߱]m[_ 8Ό&>CEשc*DwEӛ.9BMV/ESx=Kk@ Wu9P\.[uULqmܲ*mA;E) E?XP=Z}$МZn g'-#!W60~Ns1I֟4,!]F ABXEM.cb-O|1*P)C`*iG*8phsWlx JZaj;5QdY½;&'\fuM(\lv[,/|AlC_k(,CSmjUȣw2(m#u&Pԅ#98Ϻ ƗNva.if$:1Ip,H?@W2WrbM^:'֕{ V|Hϕ){rDTi@HO,MD˧+dO_59˵DĝB`ݒy(ZBHIaX. (o0tO3avW6N*eqL])>-_:KmeLBF=|svʀI],0f4+@x9&BY LJrIAލEJAfCkǯUnM$<9f5n3eT 'Lٱc'[u 6^ОPm1_% 1TGg-ځBrH~o+"==9Ve&Ug+ﰮ](]vo03:譁kю;C\|!y\W! 5=O=2l|3Y%@ endstream endobj 107 0 obj << /Length1 1642 /Length2 9456 /Length3 0 /Length 10512 /Filter /FlateDecode >> stream xڍP\-JpCpwwwwhn][p\C. {NU>sUSVQg `FV&>+7 Jb[LtrA|;M]e.v0@`cca0uYr0JvyNO9;@27M]MsB X8133;3A kjdj3&d*5/: x؁́`gW .Pv2VˀlLW 9 [,Av@ lof 35{6])@JT`9;\AvZdyʒ` q=> y-Xpu`]3X, eyk|u4T?:11ps|;)*Xu[B<ty&-@/ X8Y̟X࿢8IVԦ ;Ͽ 9ET*-@u1}Q?c9K<* s\גف@3׭`deaf>ό>/C,~m'HloUz0 qyv< 8!:Q.N/o `eA<,f/7_ `6|k0[ yvB?s^99 |׸]/ |o7 h0 1 i%rgNc^pjsCCHt%cyKRd{sBXsj˽σqN 8nXhm/ 17GG@[/:r]yTo{=j{K~P:N3 h*,sޅ}j +{L. ;Bour 6NJ=|K jod99QMLClyrrivxیw!H\GR{߶ }G3v`TBQuRnVh~bɃnfM<x)UbHV2cwg0!;Rzz0]mQ+*/VHB9FሡPL[ r;dT2 W+R8,*2?sFbc(I'q˞,4: _n&!_K)/cYyoT)ڕRmoe.zn0'F_%c)*NCW纉aG_~,JZLF-~gel]\EB}_mhI1+72^`E4˗`e'O6/FG bۿuam3/ۿ-h 1 &G~FSP8IqC.M,nKvE#D1I2' jFQ}qV")e/5h &YyfQ6红fEۮ $ijto>x@08ϋcYoNUi~Hmà1x޴.EU5ɗ\GV*5 ~6or+~@6Nk~ᬡ`-Ojjh-  b26Jg,:ji"龎ng M(̸il3DPv [LSlt"4Je[ToX%JTRgWo[?۩jO{?Pl{ ?S{6_ZxR3*&J}Da1=C1)4 Ad'6EȐDy탂[6Vf6t'&ţ0-Nԕ\f)@;DcAb٭9o#ƬYme$'|=f|HGA:g1uTxmǥ.LH}jXZ|ʙBgl~{ŝ|nB1BQ^ET v6SQ997K]Xxd PcK˒VN+J6[X4I1[5_\b usw 6il)dʎI &/o&?qr) jQS0, A}P`"^8n`mj'TGgW";YYm-6N_'%4Y7Մ4,PzOo? oӋҍ)\}Sayy7JxUSFctk&y%#>옚n \"Ub( C gNof6^kwdmI3L+p/KO.hiKBBu"d l8p,odJt>^XrƠ.LU":وvW™C 튥8n[FIF"a:-wve#.pX oW5;-n.͇%xe[`m)_g@+;a~dƕw oyMҙg6jQ̓5 l2Z;iN`㫙M$E,̌bhL ˖LCZDN]e%$7T7!ڱ M\7ĉ];Cv02w `@ | f#2ze3XU|bN3 K@n9c G1RO 8%Eڗ}q@q1( &i8n×XM2w6[ 3!:C&:FC mb7R|`/샪-f(?Bׇo1ٍ"CWrn IJ1^}۔)J#qt7줡oR6ߑG}$?YŊ9?`#G"Y<-;qm&gr+N> u-E5~u^IS;z#LJg_NV"Z\8ZoQ)(G$P}y%,Xw%W0PKTȧۤ|r/VE9&ݨSTl1 rLAZK8 7 ϐEgo:EsI]‰jnck~r:!V})cKY0ɫ-++x,~ܳ։kܝVZ5{<5rXQn)x7;"6VСky5xH{VEwEm-ҋX[pрoYk0roVlvݙgmnXݕ^Q% t,o{%^E]ZL;|0sTu,vHn*]j-{'B;-x$F0)Pb-&7U8exTm2(Q9%L֧N6ш/zKK[svg'F[˖a;)+_7Yʄ&<~M!mHe-_ H9GR0zu>J45[ בb?6 ywuإӪrf韌42QXWu)/hX(Pyv5WS#YIxuܝS:lýnsO8]iNsa)N.ȼl(Q/Ke5NVA/=0NZ-U0px< }gmb3F;а%qc˄wALAi4t9',sT)w)k`nOU |dj%M('T+HBIFH=YiX@Js$݊=BQnESwAy !5ibk Ti{3ja^t';?E6q";anNmGG6wyalK>Is^1tNo}}ؔcd$e^B vya-ϫ 5]͋cT(V:Gt%:I a5ea (.]xطO[3l@'uhuıˁAj@)X,%[[6^2K浺T7 âHI CxډSPCWDXWґRV۶MP@bcgDE4:=]w-w$c-W{{ssz~>/v0f ٨-hIQv4)ԏ .eFn{GƿA,S[%Y<ۯe fKX"R=CertD+A1Nlfy43 oK#DV'W$%!>A|}U,同n42Of*_\=#9nТCgU a3QPa"TD Uֿ1{<6U=ylNO0c1e*?Ro_0:'U\"l*ѐR׵zi#8ecǿD:{t+T'%)Ӽv6Qzv`t1N.5ܤ?PDD\&)n@fK8| w[#s}⦢'|Qj uL>ִfzZ5wn8a7|F<㡬*2gˇ9;):'zA;z ql]0:Y2$SK04bF>Z/QBnê]8$ hΔ2hW4m tڝ\ 4_y=)ǜ%Lf>rr,- a& iArL fR0l&-52yP0D|++PѮ`W=?_~JUgMLϹ^;Ϳ`HcG1^ʻhD>Ȃo'6L 23(MpGGo5X4u犦DU`΃UR#Lm>QQ=SA^z 7A%C9= 2 fǚA&uJTBxY(¨)~s|QWV`gE=_):(F=…3BHʯ8 -UŰM_ކTpw·$-Gڋ$p^/}~ZrId#16ts}3]|ǵ A_jp]i7x@@;rCXy?*(VU]r;zNDQ .㋔CwݙTDOHA:\3lwO . ZFpܶBɇ%vxȼYf 'k$wa5%A+CSeʠ#J m "~BylA!BM-8=%7H!-k f=EpӦ@q] HGΑQ 2ӟCZ #ývpw /I|4zR+ktIg#3{:rG ҇F.B$%<~CY-ۉI |3B떢}7شl87mik z3fyز%<#j >^gӌ8q"߲ &=v+jV$+Tm)Ppl_84J[\ yU<\TPp]/X>V0c\z?*a:2}SQSZ1{` vcGmSpI KDh1qɴ 1;`q7rtǟ->|Z:t̍A3dFUfy]'7([|£cZBl׾BE nig?۠|/SɣFiZ )H;C@[]wm۶8@Od@e]ך; Z ;iyb__?#tkC3! [QۈQYzss\o_3ʱq{,`b[2SCFOчQX ]uef|`;ޗڌ]]u:_6SN*#`$MSPۀ`yD束\hyn+6nFCx2k23q't2'smdh[⊗諨`C#;X2*M*Dw j=7&SޥIĮ}r{:D˅">;3g=g?-p!Zl3W\M.8%<8OBt}9*tHZO媃,̔f_7iMHB)TWvzO"yKÄH+.mRtznh&h*.t%pCs8w\oi:xֆF*m endstream endobj 109 0 obj << /Length1 1357 /Length2 5945 /Length3 0 /Length 6875 /Filter /FlateDecode >> stream xڍWTlS@$T1:6QBc66CB@B 4P@N}w9=Ͽ{LHD"B`a,@T @@9#ZP^p$BP0'SqfH@ %eR @!% P]$ETCz`Qpg4.˿^(,##%Cv2B!n3$CcW{ #QΊ|_8` |`_ !ߍ S.p?b3p789x#a(.7LG`C1c k40 Bp8`#M}a4- Bܼ8q.T1@p՝@{ {~u(+ nG5; U:⦎VWG8:jCeQ-s HJZ0P_ͱJ/1@ ,P{A|`4QG8 p9GljaNͣ <0[Ho1UWUH _H`1(_UA8!2M_}޿g,C$0I/]7t?vsZ; Wo4HijCW#?:h*g h["3Fz=(!0:G *4L"KTBA X ܊q7 ?GCG7"$pB(~S\ {~ )Bh{0 A)f&Pmǵ*7|ƀVgPOIjQU^_{4˟gɦ#/)6UE~S\y%32ԕC-Mm\HwV ]쇨eI=ʳQxq`C Z= kyCl[ bK'~^\L}W]K׽>x!c'T߲1j]n,/3!N\bv{){ xޜ"FTQ Mr}ŁŕA EjRi۾b#ȴ-|Z8w6rS"gɱ/$u=٬J]*R쏦YX\ژ}ВJTEO^Nkn'UH~Y?]-V+H?<5+*ɐEɖ I+j"y X~%]y6Amo^^gHxF`^UH!5}R@AUxvV#kR%+HDᆩ(L۾ZHې_X^=Qy5\gBSV{x:zQU+^4Fa VV1a%?OiMv\u3@`%J;x\ZNu^W? KJTwBZ\Π]=s B)E;K3VR&,7S*EW׭<_!\ȥ'{12{{Nq~U;{/ˈ هI1u}.T. ]5͔H9vz/[h"/I:]H";mvX=L^hf\ .\p:V+zmLR1N9Ujp;[),x,w5!stjh\󺘹|mktI:5J;o^"-cJ5yZmߨn>$IOxLRz\G"nr$4B0$o5 !,*h2U\;"p:v17H`duu%K`Pv "sޛ] 6|g @"tQ:糙X  CgL` *n1L)& Iv%[w"֮`vrxL=1#J}fFG3oK4ǠkZyw}|mؘHhcwNE=Ԗq9aA}e#l-}DH1t{fE1SZN6_f9} dzD.HGKͰseQˢ"6f|.˨Kҕ*cWwؗV:y {) jZ\ʎ3]uMA}*`0X=xْ3k۫=ݲ+A_{:29^8l\3fffrzAW]&6*$ V>g]p_tO/*uu0V~jeʷVן!+%e NλpfSI#;TTp6p#uRaގ NbUjx @O?eHiƶܤWM<)(ِJ!|rї#U\}Bfuy#i!X}yv7ъntHtu:_Z__'_ȖfoF%o`I'sS}wJ0&[ 6m--5^?XLJiar@^ R-4,2f;Ӿ;@ʩ8,}Uڒux\n T:>Oms< m.wlrlH)biK k U{^t{jec%QAu+ f0Dտ,&K 0XR滏L߱l,8ڜbpVgWrS8T m I35UX6?*'QPByΔ;[E:W1(Tԗr]^@/ݰ6qV'tk'LYY>+ۓ$ ԕK]vccg J9 Ɋeh&W'4To㍩a}Eeq7P: 3,9Z-RUr&x348uxTk\+ife#^6Y0FVr%" ;aýqם"15KR*o#m1T(d Rtv~ȉPu1WC)͊7LLdFh.b:mwuj$".㒉ğvM(GeŔggcIޡ6o^9|H)M GCS+Ff*dUvV@Ny셼2GKEѮwl '_|"2')*W6XNWÚd1nzn CXK~)vWܸTlOH9{ g'/ۏ)ƅXӍp iNh wWxž{Ծ$bv[3zۤSݟTxE?,z&?hepD촎2ҋu%'}L> T'T98c7SQ`+ħn0vy}7'4!,} S4%=IũS} _j@{p㐋fvkpCِȠ8o[/ Ր=N0Y9;q=MJ$|.{١>5^}l G7c.ۓ}A Cjb6a9}Ssi* KToOŎJp*Vː{kG>(1[cgws7#ԷK/\XbXއZ oj֎ r6(TTT!+s\rzv<pZiRrг|P<:ewm [/`#(=/Ŗo=4cx۞z :dLdNqNqp85zSM!R-Ya\6Ƚ)KM7fA8p(3zgKk޹d̷g5">& rlZ @SZn۲=Mo/Vzcps s{wdL,g.֤G6x~-ܹ&zXav|ՒQ+{C9HD*a{VDMA#CO"-%&X6oLWWPGJf3*Tk@JpN5ϲt;_T,'J5T>|ޛԞn矇 ~#S~ۀv-ѼnۛwD6a:oU So¶D4Ts&}B+<%و1x@Pl@gF!tⶳEk5Q_4+)>#9SLyGXf$q¯ګ,h06#u5JXCf4Dtf[\G&Nsw`7;Mʫ33S!V #7P[u</-LҞuU\Aji_!6td_p:aܞmxV59/yi cLVUMx]ndk1&7A {3aOy`@`7EB\Qܓ9|5jړU)X"W4Ͱ/C9 endstream endobj 111 0 obj << /Length1 1357 /Length2 5946 /Length3 0 /Length 6879 /Filter /FlateDecode >> stream xڍVT۲I HG~)JOBޫT)B PHQ MQK'"MJQ HE=w{kV|3g|^>oj!qA`8ID 46W )D$,ly#XAX?$pM,#ڴ`81 {P*UP@iD_ @R kb|Hw-(UTTX$a8x" X`H.)Dxp>J`p`` 'JH`C`v 1)0`caX@4x#1ij }#菃P)+;cP>0t0!U#)\N]9¼0xX s!:.訛0bu"}p~R~H_!^6UB!8?ЯXxcBc?k7$W >`+4rDA |D+e7e&naH7 ?w (pEq hF'E!DAȯϿWDnb.X@Hw440A^RZP4@\3) Wcn@O[WM_/ae!2Mp{Ni;c,oߨ/0;/Wj#Wc+>FԀ:ߗA!\M8[70!=($*#7 Gj_꒖`X,,D1q'D"~3K18b@l/ p`A)/#X,QVO<_F p~˛*y%J'M Tiϳfi=LEv&bRC͇AoWhx%-ՖB}CEzד_b0g "M[4[z.oH{T^U}dpQNJ$V0K)A8(lL!nVhȧ~\B\v|;,.5V 8>K Fe>8膏(\ F&_zM~~}Z m]/ZB7b2ұD 2#NN _KK' {0<ϭs1 {{2_e_w+| ߌ^U8 :#--pYږ2cU#ѸH8Wᢐpr,spp^-Q:Ly5p͖%'ՈNzRЪEq))飷Y[ȋhxu/%9߱{V޾gBO.֧VMyJ9uњiNH>~[ҥ y\iƈ< +PvQ)ݵVWrg6r+Q j-ZO mSuѦ= EaNB_kŌ5ಳp [. j-j2ٿry?g3畦1Y"s6|4~qjhiY!}SU,)+ׂڃkjӯGXf ="6O*{OVTbjL¸4LAیyy>HJʙs<;ߍDyfV5~`lsVUʫ)"Ž%M`kuu܏'t}ZGm6p5pQa5+ t4BmIw?57>pܘEa8㗺 vnYںM~:YW9OFU&5ZV(S7 ;~Ig,H!,B{=X@ 6_XPUmKog~|J2/:H{}{R \Ń(q^D:2wQ97K.VSU+(kMzVؙ<1  lP=!f!*7B6G qaQ<:Y] yO+QW9z\≀v%F]%f8& O:d 6M5=S'u E[!.òi6s>-p;bW.c<-rHrB*lsH:'n9ŗj>Űmܽp-$+!{ϷLsrvJ.j#ɽ]џ򹜑_.A[h*YH^ęう8vD# <+s-1{S%ޟt#PՔgWQO"Ǭ$hȘu=9U}Nc ;eMZ=d2[剦ܮ)j+(ȨfoG]nqJYތ$? )/(\c#/}H^VD_TnQϭgeW>h|gjƭILdfDHY3e Le-9SKs$ \UX ٫;>}O43uF})b t]aTnHpi/mC7)Ӟ `N;xubȃ]e^S׿2o={M5nC6ژyZ=Wo1WGF[1ϧ  c4M*be>ހFˢ\Fa#;A(T9e1^zmKeKrוu5#_ 0o=@qe,BvrPSʕe:Y(sMgeB \k>4su_f&Ukz9 ;Z\oipTlw^-]Y廦Z$-}l,q9+m̐x|Y(Q=˳sVzm2wAM2kMƈGm\M+ԫ/=Ż滺SRo-9 61^+ Fv0xz`t9 R]i^rf Vy\S G"-c&f:ƁG +2{R:N|6y:a5ɘUFC.Q.Hn`{{> -QMPTڪ7t0 >3Z4rƾF68JPSDxO_)Py7a)jN6v'"ldhz!ծ/l[:G&ԪlhFG>A*^M;ժ 7ZCHщk]1]z:҆4~z_w&n0!-(",adg#Llm' [qto_7/NNsUaj{[F>ʰ~,jn(WWX"&^ॠNadΓb\d\.4Itzy4p'-̉pus&k@) ^$}kK"/ NEBc}~ӗ^ӈ/|OOC>PîuԸ_CpT+F2 )Em9Qq(>Χ։'uHyg<'R q?K947-D.rZGf5f5#ǵzW ҂1Zbk-* ҮfnZURCyz.,vj Oj2+ӖZwWQ`g?Lf12Χ}Q5Ѵc%\&~tU-7cKKUA:_wզjuuxK 1V[/1"kMSɁO]1{CwJwa'%oM-kٜq+DQ}*EF_O{ǎ.F0 ^|R-hxv#Ua عyFbgCRn!!%VXpK}>n)-)``uGܟ{vaIc̐Kȑ.!cuQ%[2HytI) M *kO?mfRtV &:wFR2VGL6za˴48S]e'''MJnfzBesc.7)$]c@q+)/sBcE&B.>}jX@{KtV.v}${P7mTeK=>iOb0Ib21"1M;0bI<:7tg9%f.Ht[ lz+G3iv_Y = ݔq3EKe f]Z4}F6+5Gh7L VNr+*PZŸ4ҦC8u}}y4+3кx9.p9s>ǩ>۔2wN'(tw |cꂝI$eW5.0)<ۅ"mxҵ &6 N*Q i>+ù;8 X)|8j~I9)É>%w|TwﲿU ǖ! &jHЅ/`^wعbԇHxpWu@gw7U5շ\\"F +-8ku >;o3{|2~)h~?_G1dMj}gVVeiv0!<,/qNCLudSV6bb^d;fTrÐƌ䔀S=rS)A]Jat'@jY5v?YaY+S%cNҽ՞eW;Z?$,ZL<M3(2Ŕ[3ti5 [>3Jh2̝W\֫Q6ZRlA=G'[S. f"X+ʝ$@"_}$ gswVh7oUݶT`rZLBIi5b<1 BƳMCݴ%DT٬،4C|ޖsKuntd“مW#5,ݧ+o1D4pĔ:}i05j0ugMi8o50]n,gS z2޵?٬P?p XXϳ[&F\857Yw<)>gWBu4 gS,"8AV+BÊ);AŖ$|?ɽ+V%V~bCSE"^Ε/jQJ{ Թ>yXVUȭh;dtW?.$AKY?xɁŤVq^_~<7AV/=U"Jc3rB{7`B{p?CkGW7IsO gŋ {sM> `Sqf]sUE'ZxS o<`9jޏ1fޡPvySO\X4d{!"D]#MR6grh0A ɢvl( 8`Oe V}oJM}oDksKOQ2N1Wx]Rdg`\30@B@QMl/:oW1 endstream endobj 113 0 obj << /Length1 2069 /Length2 11963 /Length3 0 /Length 13230 /Filter /FlateDecode >> stream xڍveT-;NC7!8Bp  !h ̝~kuuN:UԵ$@ ,ɝS aFӶuw]l!Np\@wM@.00''S?D0@i !N`74:);t0Z2X H8]m-N %/lݝ98؁nWk1&V @vdTűmlviAܽ``k vry8-e3oV?ps?ѿu+hi qt::Yl5YevwowV tp@ぞ@[W@B7KW[gw7v7[_*9~--H vrwC+Zy [:~Iy8s8ٺxaAMhm`w'' `. ǯM}9~:!+p]=~:qq@ աf#Nhr8}g370R`WnII7 {!u?d/PF`gN*`~7㴄~qw_!fGoN1C@G[8p :NK=*`z܁бp6;/f[7Y[o0H6۬kl7_W |Y^'n*d 9n>~ m*n>>t8A`q VW_Ge p8~#oP r84EBo$"> //_uYe~Xy[Cֿni@76>6`?Pl?4}_oS?^ @Gnnh3wr[rc{5CvNjBb.Bh!\< `ZB9l @qBC.hOЉIjE@~wQC".y?$D3C0P4]hd&bO-!z5.\~g|Arh gdozt)Z%k2|J G_ZwǕB,+y,;T+2o ogO q{lGiv Uc_F)FJ-LXȇKxrHޕO65k"A5KpD VԭsfEGtW1WL2+mj vrӶK-=M zkj}"'TXO5QxNJ%y|O+-a2d"m&6~TGmSO3톽0OU>b薙5h,{ez#|cRC~X>ٛ%9ً^.G4 '˰eO&kPa6#"M=96D\F@ߴ-݋9.F:5@.( mRoJ'irB\b{O† ?5LT1_!e! 8%U0v`"ٷIR0c6jۭ{^dͪJ]xnw~0tmꁚ\ĂI}1uߗ]"l.YTG$,evl֭QTRd{PU( ?@Z.G~5ר1НnXrbwRRX-iBr\zߩM+HpccŁ)׺/?=|nR[y]MGV˄22ep}+L:W炧~:N;чӪ uƒxukJʭUEY&]L+|UV/wSwͻHB*.b/6F|26YL~{ 1^tPq<*G5t9#7'SqNcv%E(8dŴ% ΢aL:PUϠY,a*N9}3&TW:5QQс%L'6(Y2*4!8ЗXTCJfRz.n70G)#^-K%zi 5=cWezA(!a%63/8]In>:KpБ;ekD2|M{n@@'ir@?aQh=dCjOTgKgnGa`r9}/BNK3bz$mѴK {wSȨ ĵ]5}tcciF;{0|b^x6o6qLyH(D&?t?+G][}Ĕ{9{loXә΢tHA;V|DA3AQsN2T >S޽ |l&K>̥&+ JK8*jƎxQa+@vaVw69l\  &>]Bx`rHN7I_]1g<0O+5D_Zi_d-D]s7XRݶz߆\LA@ШXQ|%RY:za;W6IE`;/?R:m]^ZgBHuA&jZ5)~ ^k`y[k#{ 7C"l}TF8=\~0kxbLVb-j* 1v&K5Mӗ8"-椭b3٠ ڑƉwَ{WtsExjEOhQ5["s+퍁V!l$;&Zm\AOEk6zۊKE&xn?3"R"fj%w^͞%~6wܙy_pS2mu/yߐVR܁}qڏ/_~']t)8p- 11c%Eތw ~fl[Hkdcjf`Q]ړ.},igh7 GYْ뛝jl7W"Gսm,E1sF8\vNX,%[?4-U3_Ë'[q $eqZ8~vs 1ΖN1q%3I_dT}t ލv593L:lד=8%jNJxWLC,-~T?oAo+$ WمT{akÄ߼^1KjVJēnzPCjnE;0XOי '܌գR,~_-OzDJ2}c}['52s_py)pȂ xUއ#KddE%L &^SEjqZφ#Ұ'l"L{Ú+ڷGB .GՉ}{,i&r V t7,xcw@Ұ(q[ 3u>A)H.jc_$tï>5kVԇ/Yg4Wx֮n2!kG.Dj!P -. "yI. V<~Mxj6QeVz)v𳛘kw!..ɲŸmX϶fUst%>*ҪVw}G e X8x%IJB U Qȓˉ7yG<?Hٰd/퐄cg"1l*ߚ7;.^(57󼷿eM.doR%,dP}7R,"Fg$&psFL\bfA}@oΈٿR)sZ&QhRYzF_CrL{|~-6Э|ɉ~DHaz(uԩnjLfwAL,xޖ▂Nuj0js S$qV@IxTOy1!쎗Z)x]&`i7J PmB>',Fk2HV)rl2~"^ x?stF-}JW(P-eseuޘh>יlz-~H"!x;Ysj/ V.w ߗtw9)#ZgȅkHCvQoneEMrP}fHwaHaXdᐫt,ayk\E7'^:~n }"c<|< SY߻}ꌜ%p9T췻;GIwu]?;iָ>2z*14~p'n8_"T9bj|#kɴZxOzFhEf{+vdd~l\LW*ڀP{,gZ;h)p,<)c$~pZhn'bܽYW] \ˮ.;:צ<5=3.7'mIqR6!s' 20~E(RҶSCǣغդFyGƏa |-Xo'@v[[![޴鵆/H<E W2AWNmv,iU[ z-QS?BWtFa/Upx֑h7٨cA]csQC-Z5ϵ> '4."|x^Kz>KUFG/YT !=g &]/4;V-m>ߧ}`kbĒD}0#X3b IpՓ/Wf1q %FN-^"-Z t~񗱚7A 뿉-Ų&zQh1Dz-g\}eladtu&(n5mSgMyA푘I,bx%l#-MQ͘0 *U<2`Hu{Ƿۯ*gZ}e<W?TmC54[`2PU4}錧qg*kig4YZM&hyjpq\ ]VIZ2?z$Iy2nJ΅_7HCPWYG`gkfZަ+ wu\ =.f͇))>c'>tA208`粆 fKb-H2RPiLJ$+\xZ}FԠRnM NaT뇟EI> a}ȢX|cX-}]{-ͣxfai5JLeA( vc q%z&'V/4̚M{"0[GRdRQWZ>G?vs{WpaTسbwοX",vb"F9fNZmT}Hly g0]X7Dc=l0q3(` Ќr\{gQǘxy2듥Rw+2XϛBߋϾ&WEx1R9/7]%e?΅wr3Z|G׮ K"~_8,Cv3U?0`O2Qj0em q!R}ctDUi6՞\}4uh|S Lf`YACXTZny)#'UXdG9domQ׮=/A CWE'-^a{Tojֹ~r"wM]ѯc1Wf =N__1%ѣLG3Ə2 Ї]7gC^}wX]XXϠ ɔ}wj9Q_u*{h"t[fQw  z42qYN0O~ h[eMܸt18:.b}HBb}ar'R]JiHJ4G S E0<1T b 4?\AsiLNjЌ)5"8[a,IE 戞9n?=̠СsdVJ3V=0ɤgKtK@ƈ;Z5q7]vg6tn14^cz?p'7NrԉT౗tح#hj0oVrTZb&, h.\XD?`n1->_mI ] v:j"6?#ޯ7?=d7%g-V `1n%i1x\6nܯ]OGȒtz^8{QIx\ מE))$;G'rXvq)=F材Y7(c[#ɖ}Lsl[]Ji%1dXu(Ny[p\!~ud,2j19g qk$>apKbxH3%i+c]J(nN7/yP!sõk9=¹]{_I2N*U:c\8rjXfŋ6y &| h.K&bլH. Wu'TUTs mޕ,8Z]G'nk^#3Ɉy5h3'@JǙtXx‰xBt|(7)4v/U;|bIOƞ4i$ZxUm ,k3H Ƿ,Oqaaުz;T1OKn>8^sMőEDF,nD_譝M2ɘ7:`LhS˜_w3=y~k>T3}ToO~[Hݒtxsb?x Ʋ`bs ahGk\,Z3R%I cB!ɛ! @ H({AL=SGSVV3B4mb[ I {ͳx82O42ۓI|\A @0ALg(7}=`ОQb|b(A2yfQ#{cp,J|<4;B3j1_ΔefU1嗟Z{Kj/Ԅŧy bc.;[$]wp8MIK\v;N<ԾZN}Vo@ڝ%4jR!T$;dVdqs1j('bisnZ oFϲ {F9jl'w=vrSdлTPM@,ec+<9;qhU[JǫY&}^ >{֣Ĉ gSgp uI~q Apϊ\A!28o{cfRc&#̙$oT~fa}4 !Kquxܞp_yC(E)T #b WRy kZ̄Asu<( rxKu: y3 3{)ރ1D(]|XEkK+z; {/c*y)E(:kWJœW)mjX) n+墙yҺ=R!6dҧ9|v|e}睍7X<Dx Ln5WHpMqb7u0fdu3+_qv2_ws7;1d`9ۑ:/;iq'OhRh l?F@WF(8a'{ќI&Ĵ܊4LJTWt|3v!*Ɨkaϼ>{HfisB'}3nD-9H}})V6R(ZzCU9 ֻgw}pzzm'LdIy,3%my "eF;D6Nruby䇾8\ 6cк=-2z$ nѯX)wvaWCۥsF_:G[٧U\2*b|nor1Ao-Lw?j=먶4Geb+!v /Ür.VK1Sk$O"ы6[=6ήl'3pHI<-c{? ~#bբ|z UgI"a,gP^|wy +Yi(~m*v7гkYiƝ,64c=*U]3%G sV k"xa>!q8)o_B4xdiYiXh_'ӗ`h]fqQ.vȒR SMknS66 RH([Ϲ5\ nd@}tf y&ЙM|,$Q=e]~> nerݡ^օZ +6vS0U%jc݂F:5dlmYP>"ka`XME~ aCrFX&GO(h(= m}m2 #`V:@d!f/f/#WW~pY?8x }2o6?08M}M{8^H'N՚4%MZ=>ɫ_Cf n2N=h|"/a4Oʎ`WADS2 s=v9$ Gp2Wc|"(B_g# k7v:RRq TUymjn z yL Hz6HK۔k=feXaP8i6`>{3^wR/kd=H:I5v,BhSwɜWgoNtľGtWDYg^2}#k'ޕҜ SJW{ 2ϤUy[v>lWlI}0xv)w;YCEI-֥3mέ~4,^:q.fQ9{֑ /7;b8J=',?PM%?r Vxj ϭ> Փ.Lr ?}$u^Z:o;b`ӌܢ.MrHFuR9v+ }Cuۄ[9o"E`lD2DʢekT$S;6eu'mŃ#=5\jq[홥QRsܝVc;'!  ooF6pn#B'qP׉2|#ֈM#z}ݨ[j]x endstream endobj 115 0 obj << /Length1 1489 /Length2 6969 /Length3 0 /Length 7959 /Filter /FlateDecode >> stream xڍTk6H H7C7 tw03 %%tw4R!!Z߷fu~FZ mN)k%XEppE2<@b22@혌z`W8C BdA{* PrsxEyD@/(7* C\% d9{Blu~XxDD8~+ B؁+Z0+,v(7 s`x@v-0r cІ <@`bCܠ`W}u @ p<\c5J!O  K'E|)To>>-=C ثeBw dls]|'٪6yhg~L>D*,Q]{ Y}C=#ȑ_i}W4'DĐZʚJ DY:QBOc~R\g[4O!yޖ =_Pos8{@U~.p!W\[^vPꊵ /ݒ1G_cFe'jvj?F<\n`rVEtSӫ;{\Iϰ^; ' ͡ˠY.Rgy)׸PvH L-o'78m$'ՆEc3 rL^ nqVd;ЈVJ3d&wLGj9Q9yPwu3H`_AAD>ÔjwHޖK.Wm aK'9rg$X-/yI{S+P4 )c_ I,ZX nRgi*nە g8sTL:j{Ms{vad Lmj .Dgޭ 3qô"-vP2`Q~DzJкJ榻$ jDas &Oq>"þ@#iR 2QsC b6{xؠ# Nr3T|c rVYwM;n-V/K|Kɜ2cR;C,= H'6<#/Q/ioyA !#cNBԮes^+ kA'}lՠgٷvL&= +UH.9bczdS5-?Sk  áI&´OY,<yXrrOlqUQfqc4K[+^No1yvR9]/ke^f ; C s@g&YQ][ O9p/@HD8I[hDM'~ѻQ$"v1)#.{fQTJR f4!Q2UUÀG3lw a mmZ7䶢1 PJ`OqiohNxP`LDD({y9ɽ  mz9@Z]O$ Y(pnyRP|%ȱc!Cq'.ƣ ѳ8s\d3MfO]Ȁu98FUDf xxorCH04 2Qv]D+:NQUcvSKMOG[1 {40 Ŵ%b4,k[`WUc3knaJC泒ֺy TrSo~oػw囝7 9d*?Ϻ1PQeWs=J܎gD !*<[[5Ҍ~byFK>7 %bP弐G41{4 fM?&Ng42`by,(%bVL5_e 2IX[Xơ2a<(s.Kk璚?\tU'o&Lp*e2]Xo [!r?ϕO.EZ\{\(b)e\]2ppyN?iIAL$c&2Dh'+ǖTq mxP=_A+++}{5{Ƭ2ȥ{/=I+J51ʎנni29];Y يMt,;oIiuƟguj%yt BQOmqjN,̖J޴HȺo8)ҟ"F\qn|"vPi_|F/I=$iHƛIYd=!=ciCzU&<.k[]hg (B lf W/hM/daJrEVc]4l7ǁ"euQ^r"w6櫁 !_x SS\-YʺU8j9;ۉbQY5R,)Cx` ce:ի7nML'VC73nEהGƫ lSȍB+DKj S+7tNgF(k]#uݺ~26 9P08@ _ dgGX#hKhuV%X wx탑!+"nQ=GMI؛ ՟`1U[kݝ%Xp#w>1mW٧L ݚ.789x%&YF2Aj-:URClRf1y'2u<1%hY|5s\- kiHgnM6M3Ju|#];gFP+w9 Z7C@ 3_0kĿZ6W16~n .i sR/e lXϟȾ' _/"cXFst{hVLt%+6ɂV#<ċgS@d@=k@awqhU/ AM21A+N: l0F~W1w^XQ 2r}[4[7d$X4,aajܼܙlt[{3}Ťc`jfQC+dz4B+&;cV3T Np oׇ W?#XB~7rq$T`[n[y6tFGW`\"m aOG׏ ګPTc|iu-X^z:>lI& [p% 5{~-ReZb'2 ߊ$Nͻ ^|BL'̅gEN!I1>(ͅm{Uo,oy"?#a|RZmL?`cꡕGye]}MP痮3=,hY)++tF!0ϩ'>@~)&,k)p eaVKv!Lw7=6QT~4D٧0:Eד dq25ٿ&Ы0h/n*9b {^ԍPZoCL L#s||!9F=C"6%:*RH}xH09}Rt@i-o׀BjGmKafIǹ'C3Tfjk9ofUoxׂO9/=j?ޖ {9k*I:H豈K]&F{Ճثi7XB|޾Iߒ=?dלay> stream xڍP[-wwhCpw'84XݸA[` 23wޫ=65(vqs Uu8<윜ܨ: #_rTz=v"J.00''S_`7aP;!`o7%Ͽ&+fI'j:dph@@`B]98<==- `7[qfV'jBn@k-,ƎJбARhmn@dt;[/ڊ*u_*;׿G VV`' go-˩C g? -!  [$5/ C@Gku;9?^ݛ:8=}l@6a¡ ru*m"Bqrr r  t]*vؼ_P}!@O#T..5 ڂQE xB?.L^f vv#00TQd+^_6>7' r8  W/= XjL!1'ˇ(WoEr2-@[0]p_S}_ ;Vj ζ/feKȁ _KǾ9`ŋt/Kf@^ CW lDzq,,Q_f\/[i vg0ң?`D\ ~ʿ 'C?o$$pX?K? ? % 9_"_Jt|I p| |iҟ K"?asi^/+zPV"m7Ւdl;ܼg۲$Ң<$f~]=.ynr0 t0]K}/LX߆`c7+vwQqidlmKxܬ5yftg6c_^;:x{$bAAtvɌJE:ٛ߉r|KeT 勌{=擀iYLm,!c"ۓg g1Z )iNQ$,7ME^wʔ|^L)c,)/CA[@Z˞R3<`IΜN-dMk>皲B} bj ɊAw4[ b)ScESO r R99Zp8ajH{rs\}#P{j,=Th\,>6FCZ70$NN_fG)-Ap@6ӏ-[&ϡup>5@3OS(tkl'r]cLX|I 8^V-KН֪@K[Ԍ8YC9+_^[2:n[_IYIsX %Pi`+<4zaw34TdKwe Tc{'9˿_"bp1эx9x\bg+BZoA%`07I5gWaSg+Ҿ(Y"b# uVŮ^JMBgehҺ<- RؚݓfWMyl!Szt.qzeАS Ⱥsܣ>' ,{QrrU!C+=k l,d|%9I7rbS+7ɲ={=z5X$j|E<Hu"J~u$〇l4 AaJ; Hc!qn"/ISE?-fU!VO@Ҏ6',Igb":JE6s櫖#O޲y٧wUvSn&s^uB "{~>4+I |xF̅m4m v-j럆hZh ae^ enz{Ja d}i>fjJz^pNrHYR4 Jhar7]IJ ^apIO]H0`l|{#|vAķ+BqN"brΤ~[Vn*<>.#EKcR]Lglw & SP2dv#oW`9ģq߬02qkl8_Oܠ:I?, 'o|`c{Fe8QjyR0 ȓo8yTǽ` >4pÍOt 3(ME+q7|6aEނa}`݅1.9Um ǽZؓcq >pK#-}(kP aKp쳋:n?uiqUڊLϩL~<ȾRO'/U7U+zԎt.o} _q.Luq}ZJmn7j!0r OyBQ8INx34q3b G.ٰknKGúQ%%mI}ck7ߪ1Z+^mn/M1Bo7|o[̦1к/bN#w#Ϗ\31ؖMp2EBDrsVMyZ+!]W. m1>W`b3Q*>1p5O=uj kLuu{]r{o^7SI~^x]٫1_n@%~$q%V9yG䧖,ܮ?mlp4cC^Ѡ:`̓9=cvѐK-)̈7GoP`&'a9q03BXî;l#C:km1mz%\<[yFK)VQZGMϬ>o}Ov ,N.i קqqx$9]Xhqm=^_{P9 %pԉ67D'Ai:PfKqB\'8u~D2;*]瘕NtJѲZE36s fZS14tvTubwy#߂Lbp*h{D&Ғv{tXL|B₇,ћ겡\!tI )I9kp[-z1Gp~Cf'K|2.1ڵ@1z,0 tC2 m{@1?ou0LSY󫦲Em# :HkO7񀗥{?#jGX\9Ncn9vfp5wY'NHg9u IQuPt:āp~!JgbV|֜ou\Ey F(;9k~x$baz*&+swb~w ҅A3]Ԟ)uTEhOT;hڐKWvt`96v;;1(bRf~רhaȉ` /|KIF4Sӄkƻ\&-,FH\6֕|E}cF4RZy*ct4Ԯ9Pcr rU-νڰ*RmqOPPCͪj O`8 WN&mMpi6`>N~Ck)]6nr;Xɛ:nNbg8u|ϛWEM^;:ML^7}F _,A|[z|1 uTBӀ'{1be&d+>aF}$f^^+n j^91Z(JۘEl-w}ZmtE.ud𫪥mVkض$e~fZnjCgp+_U&: ``/љyWs}FޟLJwb)}M5gToCt+nH7Ra>M0]uyL'/*Gϻ󧈎NUp\8z~Î{7d(Xpޡ"»C=x[c{Kx7r?ϽMlME0t8Vii)g͈쥣A] ($ toUtiKhM"5[x݉Iۙʇ\gퟷ,|V I2 w˙ <^+Ώ@e*'-|UE>zedҩDWo0îY1]?I$FI#umyC&}L\ '~bKXq\yʐO)Ep}l2 ȢihR.K3"d q n YzUľK1__q`ob7,:wrWHupW f\VEB ht'K2kFHc>up6JbWEºd QX[V ѬʲiQDf. Xxn:Q6;FiuW$GTuo…ɶx?])S"QL[Ƚ>L[J*~IPTW*9.{ڍqKthy█ I}uzYdrZ'%fdB8R= 2*'d5D{STneBu.Zesh'vF'Z!JŃ3ehrq$["Ҍ@GE+'kB\*fSʹ3ɫv-oڲP}T} ?Te)@%8{[At 4o3"U [<yqffSWWO?gph/\&? T7QRM:rthL)XڍFufM4a%jy\h448bTyGBhi4֬sfYY%잕Ǥ0`ReJq}dhU#\BNF*me'&i5XKdtDR/E{S{c~|0ta ;Yi=sTōYV3#)t|>8vRH%iliG9t0#۷TCt f;+GSa@êoIM@j8uژL\ 7Qe+(ɟljGIZ k&j+Lt۝jЉV[i)AdSIfi"g@66,ٕnY!lu%> #[|hZy@`~inBj>:Ggѫ{'L0acf_wL²&!RGuREs Z>⫦S.BM(dE.) B|6ovrycx o鑭 .ިU/\ɼ/L 9nW|w`ĕ E'Al 'iZwc!7VeϠ"l2SH=%~2קi\Qg| Vk #0uwFkjܱŢCY}`aݬC 'd-%MS1mkDs;uj⻫&Y ҏ_λ1{=+ ܍\|$e(s.u;ؔ+a6pҫ.CQXIx'hP`YNPD,in@R_:d & _CwfRw'@YlruAΉדgl9@$'2uƟ %RpY񅳄Zw?0} ICe)2(8BH(a- ofV}-4@5x[տFJx|ms(_&%F?Nt]ބQ9@۽7$^wu|V,nZU?%oQH8ؤ 7E<34PԨiyLaJBu-^Z\H<1+H\|&:}S -u^7㖍M9X# C-Z(hE臛LOg-dO;4ڇ?.}bº%=[c?YZۻ"-VMyDBJ$Ԏ(h*Օn$,rczٓ@S.UM JgF5UWl>tdsF(HG,lq*\)TE.?)t:Yk+ļvmARbu7[ Fcy6PhE+9 ٮPRv..ٞh}6ˢEX+-c XbB*>a6ᶹ`=,)5[fD8fR@gk-2 J |!ˉR_i8 %D$"2 R`TBwbiM 숄^r߶wKl,0`7Hi]û'wԋpl|0{o‹9)a2p#lEDrnRY)7Pa,ow51|[k5CC2}I;:`e rz]8;_f?81PuuŞs^%*!GmL`6Y઻oݹՒf~ʖFU](s _/~JJP`++]lNTBjz= >ɊZ>]! (Ujf{'ؙFpb+ "0?$GzQRqGy#dn{h*Č:UPC g@C'G1]-dgٔo#k(^$}E+<Yxk\dwzŒoTXpnYa9sA T]1׏ P=8\ S>?i65N UQΠOٷ1-1MI/ځX$XPUp17&$. 5wo$wZbUwHُܻf6vw tXӪ:|E00:fkCO,6hn'3!N$Gjڟ:IgPe}iPGW*xL"d;BLaVTϹ lNQޞݑybd 漷xEOm6 ю$IxFCU0ZW:cu_mYX='.\L-CSRL)\F6+z!\}|x/ѫҢLjf,RՌ|ڊG L}id D"`t g\0P |rl[)EO6lHTc 2nr+:I;ߗcL5z`rwdR M2\Y_9?zsK7F*O1ݚ+,!f'BYTh" ÄUcZRfE8($(#ۦj?kh~T_N7/k71P|3Ew-,ù1~`6ڎ4蠼uJQKm W ;^JO3O+ B <_G&qeJfю%5uRcdgb`U`#Vʻ+ȋ-#䣻kOkys"ͺ࢚G8ÒqF !m$1´<)fȸdB6IZNljED;}"8a5kH<8N'\n_Gw!bFl}xla,|Kb&*zA~ X3dT ԁ,vI01i\NfLQFKMu~j8xB7Z7no<8M}B 2ۨסmj8̚a9#(W6w7ڷ? 7WR,;Þg:E#ԟ£ S(d9W-a&͐@Ϥ+,ZGx~y8ϯ5UR֞?%6ns˵<njR" |?$ܰka*넡^.֔0ݼZbWprbDd=M!X\A=l;aqT܆C'QGݫh/dF3x1%?;RrWׄV ȹע~8yˍi-Bغw܌YO zac2F9OWcYӣIYy%k x kZ5ђ"s.cm-_BuLCoUM&KvE?׀{* T/;nS}pmꇹ&NٯSH0%XDU5IN_%cLc!4rNnY]ڣgJHT_= }a^}f+nD3^qכxAth_ƙUQx~]UnUp%SW?{n1K!K/t*Xozi;-seeuQ ߷;"櫳dJlrHdbȔ@-\yya@&) "6ϫ"8ғ,|v_+nKJV6=oފyjhǩna=>^_ œkIa͗n; #-t&Ԧ(?_ +M Y p /jRvp0i?#Oc: Ty4|8hhQlFE`$8ZW.i{GxHꪕbvA"ȱv)Z}SU*MW~_z&<-H6ETjq0جjY jßWېh"o$d?/酬wHpHDt~g5aP{чVt[5 yH޹N(5ı thiUgxXLA>!/~$+y M ObZ̴0wɕDB^Bֈ}<>l*=̻}N;M}n碡fjg#/i>&hadC7[{ӵ(-="ˉd[ga>^t:Dԋ&D@QNu@ d:43נ V~Qq 3fRsi_&%!mC]M&o5:tƍőʕ5'OW(ʫ@2@Mo{sI9`M\:L ĚXo4u_W#4nJNEqԟķiN$&?պ+Q`A,84~G ߭d"=V*õ5k6e5(4NWr?S6C=(ъIĔgkֹ۫NY3C 5|>i:-n`if2v)3~9u8tYu(?vũ (ý Lm1LVYI'D46AI#?;8y95/=D?<rs^Wt~]$!d箩sڀ$*};U]l;Qígaug ~wiN!A{S7Urͅ6ē?β٥}uUWѺi5mnj,:3Ky ӭ (2> q(%?8O ";/¢h*~VQhk޷8mᆗ"sZ=حm8(kЪNL> Łԕpm% x)%.LvUGBAi䋻9K s{f6nX^0u]5k$R%uFο~7=%FCa{Y+Dvm9SzSNY/r\C>@*q)[[q'1 ?nɋ?}*Q!,M Hqh?Rfu]PћzV<̏[Uqc0<䞯\er5 1Kh'm[ )卉w.Ƃ_F9{O,DdzaԨ`6Z>wt?Yl@%/0vւ}R0]j7fȇ v$ F< SHiƶvg5,c/y Z CC h{rm(^6.$C;`gB),0S7_A$3.vw6vi*1lU#hŴɦ pHT|gl^v#1[!2-M. u@eTZbgZgJl)Q_ Qz z1c0p>>Piq,Q}+~[ A J}RA=kW"NFxj ൩!zDf 9۫h_,(> stream xڍP 3 nACp ]+9*սw{ E!;#3 " d03223SPZ8[c rtCdn5t~']@V `afΑ jjacHق)D=-̝G1 Iw8@halh 3t6ټhlh P39{O j^sgg{&&777FC'F;G3~z9@rtj ohwkUs 9TL Aw1=x?"% P,/=w_,l64675ZX ⲌC[Nv񆮆ֆFK7 ) ;wNƎNNWwlMDll@N'j2~݃ߗkekfdjakbW&.Lj. )sMlf g;333+ 3u=o'/{>^v6@>?^N 럎E@ `2 2~G w6Z{}LJ JtnNaa;w oECWH)[S;}W?{4%o> 1afg6~<Ho??~C k3}7RAZ\9J9pp(Z8=2g E;'^ޗpzɿ]lLZ2v<$hr{Lv!|v]);I/ӿI`}'I3?q3 ޙNZ8Ypc @;:LEɌ/]LW |@"M5pG_n;S7kO  ﲛ{؛Y.ޑ_s.0~vy{ ߿(l>؀mm~vg{վq29kb 21C?w'ཐ?e=L掠\{WnvxW]qw9+6]u;r// n{wc؛SOaZvlwyBMpJAY\!u\< 450w"TOG*sd3x4E b.[{mXž~%Ǘh(980 h.ܑnfѲ&߈}NY6Yb=TYpqp!oƦ) 63i6G;Ixeа%}Zk4z2T ikOqL%r L\ca=n5OneNj&=GM1E9`suyYW{ZNϺﻫ %"5pR VUrth㮈2:\ip<{{X'LH5[ǝiaA Fsf- T< JTN˅w<<5D@i}3kjLV'ňddZժ; ̎v8 cnoe.]A%2mɶAonoʘl֒LjPeTMX`:vX:%Z^'RnEGiKF+znór6MXck{e_ME9K=f0b|(T9\%3ia}F>EԘ{FoW)Na֯2RXXBkr HbֿFIYjTg~oٯq+RJ}~T[VN 8^=\2unEM7)-s;KHʏ Ԉ&WeBrx|rbBHbbo_'Q0y(s&=|em~t y疜'oXC4ᣪL`SxjkSG_ b3빂ӹ@5zI _8`eDEv-qgzPAZY0Oߨ"+xM|5JW x~ľh#47Dyqs}Ƿtc,0V=U$,EWxJ8{e|(Jd7Bg[t'k4ǂjx թ!^%Jp&ciZC! [},:D(#Mwl]|*6ŏ:g@VGX>KcDQ Yf{? 5ClSQG+BUEIC'kSb^K#O<^?:аmlYB~Рf;MfWClȍd;aͩ/`Du&\ (pG݁Db ǭ50 6j`\AU5VV z!}U}oN@:>|TؼW%[sT Z€+GQb\;]u[e](|/6{%"&dۚhh݁>I_uտ'/o{'q 2N8X qm|4g kwKמҁ< °!ˀR'›r!4"d֏x]eͬR?;]5^,|b;L9 Zv.*R}d - @U93CP]q‡rD O }WrCڊq_`i_Éh![+1Yb79Y/!^`7SDeb j0L%<3%:ȃ,.MqEmhǀ}𪔵{mjd5(4U.EևQqʫ[M[$kaNb%{סc)0o};)V%;ÔxLKeHTHMsH}vL,3zp#R6|$!Csw_;]O9N{`K!0l䑧R'Qi?J_a>!Ȼq qFzH SOnl  tE{l#)'xkx  6j wQ`)S0XvX Wwm})[J}ƦEAF3-hIW.F..o ~Z O})dY-6.C'8}pUP}PY#>֝f)bL_l!!!ۅJ'ǨwSvb6{kQ?OI Mp( vP 5­\+q¦u%%!J8Zܶ䖗ҁN`6_GfЉxܕ%2즯4S~*)  DfQ^j f8Is&UgH',15n y']=uKt} q5OgLg]JEdQYa+7WS 3T֜*鳁Y5+3s R 2{xM)Xp{_ʊcİV{y_7O '¿)Yީz0~'^˖FfNH};{KШF\(`(oƶ?/hQܝpZɎQ qܒ5Uk4Sxs*]Ո"|MO[$V^){ܧ!]SU ,x%+;j@.>@L ]p a=F_λ;IX?k@T`LgNBbϙeν^h9'sXh6~-VeǕy**',*X˟a/[c@B0owA2n)]Ժl_RICn ;X\Ĝe6 NN9nsPJN%p/8B{r:֠]Kv،`uRFcPMw`3&=y{ʼnk$/1q̄BaC<9wQYWDye%N~+A6&g#q\="@cm uRG.ka5[IypWx`qf-¶+9L;1_ & D=F:8M^fh3fn:R"QN9hLA uXXJ1j~ mtXC jjM]nq`6h#^yyt _d5(ݧ~4t$BǂoRp"R31=L !Ll4Ӷ cۚL*k)B6 Yk٭ce͘fBboIϽ,՟gdY Bq7 @d-3"LlX@=9Q3i x)5tؙ׸E VohStEӠ@Z_rȼp 0 ~'m_}௃t΄9dC/#;t}i`&|y3+oqTO*O vR u`Wu-T͆"7O-C *~&UQs!˅S҉FGC6͖*ۊ7,p4cPkp_=1iOv(u' 45F_m6d\#?U~l|˪]+{̢ܖ1,a-4eV*"ʈ+)P7_\Y!/'ֈ;J}[~8lY6sCȝJ|g_*vKyy]Oך6<nx>]& MXsS@aܐ:Bq4Uӳ03c}2֏X1O[:-@zBJ? sa,vKBW ̞Jp5D=sX MR"^P ] \G8jlS8v1bs-v7PEQ "ѣX&zM7=PχJVL7IhaR+v7QJᤥZQ#&gzjȏur]+<o_Lf Q[­صrtyΞa2[*&K]VoFxU)qsi&桲 ~fԷ7*P:N>#JFlP5 \1%L6wyHM:Ji=tEWL/cDgICv2ߥSS]shH}jz XS dJ$lBP: LWֿ&Kd (-F'߇UY;$ ꪭ mD'[&#d :fG'sm~}f4tGgI]Y="riXD|X;4_vލ<@)i6a(nwr29y%TW4b<)\]=83' $.#M(C)C1g(P8{d0Q1$2ws=Ԁ@]VmG#\PHR~ȓuIÖ{e8G/,5[nl,5 S6j&Y.9-FPŃ*2㳫qtvRR52,p]>J6µ>hu/ J#:?j幄s^GCNň;,Chꥸ(C;ɷZ\P}55g4p:-Yk,U>̰4Xq)p2V[~\ǧF5U_'N){,@\1@Z#%_˿Lʀb!YW;cqhmVHGF/dUWNkrK4o +wH롽$$\NvЕjyM&MM}=GC' g7pmocI8 >dB4)agʨ6´|zx_YNNUWa ;sΩ+c=!ȢOb>Z/NFoq+6>(">dH>,_jp}6C3Y(ic/JNGkjTG^$Vpun!`LFy9&JZ4wHR{Iꂴ%E(8tF7v걐aE!eػ ؕ!M鉛ܲA|T7WoHb7@[: rc9R/(܂o 3dP t9FsrH`CJ($y&9S>m ,||sm ֥28)8gR"TPGʶa"tYUPމá"ْhDHt0'*&?FF 653ZJgˠ)9}" u&icxi;[t` G+{7u[ssFIeT t'Mk@ {fsM_-G)CM\80s ac 3yLtCvI 3Q^bt#%Ҥ)Xn$P.ӴɆ,+ēL3COϊL )E#Dِ#ewӝ;8C]z']Rh]| Z6Y6>/:k{.T$Z }٘[6*%x-3zMpC:Z.|]S+mg)jV6B#Wv2L0}h=*µЫrS\""̹~gV>~r<љ'q+ف?TхT%5c&R݊#  J zrY WYޗSf 909BdRL=3y%1ƉhTRGï[Ѣ8뼵lp<3'GUK iqNC=]5~xk@#8aeYx(mTZr,3q"zCRO֊oؓŸA_wj+C*] #6>3~d>9p7yZTJ5l_wK&lMlz|~I6$kު0VWo< Ξ ^Xܢr2VOjZXJ'z m/bC}gQ}<#V,Ef!,o Y==){e#G:Sȟc5tR쓙Eg|ܵV#[r4_L ≳ 'J䓓,!\a}Sl5^ϓdy 7T2dR2> Wve ]"anMI8Ʉ9+k@*iU8F{44zǞh0Lg/5wM(iI \,O 쵽}'MwاCp"Bt#n<]sd~sl^tAI> n H}:38KA>(D?7Trw2PvY cHJ N^78}v?gS)r~\Ŏ,V0X94 PP5 !GWUؤR8'G\I@'7F;vW&zoѝ8LiFবƙZ{`Rs㯪ْ?6RXt*3:̅W vbx  VHɫxW_phx1 }(m!QL.6!?Pi*\.dvځh3r_6D_tY'(J]4т4rz;T2 W7eWdHzejP47Xp65Aԟ+7\^!2ڵz7P`@WXEJrLx#=ª~I\6Nb+g&9kv\LFJք<#eIUJ"-9xdxEaS '!?F# ~y A Za 8W'FUb ^ql5|onV)FЯENP/~'\2wEQ<#zXdCp~]D7;%tY1%S(j6 r#hKZ^b]v&hقPT.)1_$8qCkZ&}`fY8aj,&rkվSn$b>6W{AMBH(q]b,y{eE0Inc:ܘ:4!eʆǔ`r`%LT52;G kk 9b%X ҙ,g&i= f+bE6u֓dd) 3Z~ eҶ fwr12S6lgAl#ayh#B I}rg*wأ!ֆ/_mB$Ac6J<5fџ ]]K+&t&3貘?|J#hxo*~Kڊk04w̭ #Ej=^:Q:AU&|ORhyUb;>HTލ׊@lG˽Sc$P_:"s#m˿̠L& 2.# =$v% xE !_}a]1 )zjg>KՆ'DĹ(r `"pT?9q$ɯG߾")^9-9H'|RQh߷>ykF,vrVԮvAX $Ak|4񈹱W!BnVZ L$Ѽ%UPU̯4U[v3`6!z]+Fm\ژPx?H6JEIK Ad<EzSTN-k/ _<`ȢЦT,G< AFctdVpL$ "7F94Ôb! n0EFѰeVC Ҿ0Vޣ$NU%1P7_ڴxq'Tڗ%]+oe``XS4pc( bthO/J#j<uabO{il1/vZ'WMw`f5;?r]QS,?ͭoً@FU|0(< c302Ж8kBH _o)t5)yXfmA eG[dԿk,if,vaEI窼4 (k~5GQ+G6jKx}Ie%TKY'gTSŪ%,%Tj.IҲSxD1g>9՘LąEd% Ѐ1{@/*1j[5wMߞ3m,dea^O| Er~:g,CIl^) PHAp)sUi֤o2m5.fբ|mU_cAqUOWyN>Sv]BO/ZSϑ,?,;Q?pHBߨ@[ҏd#f_%2c䐍ҁox 9i5%ܴF]'h~?ostzZu<'DD)*g EZNأB=N]rwU1snހD }`z{z NuH>aUXάWcxbEM!غv֒b3G8q6AȎZe)O"@qj9 ~L׃7|8 !TOEɦcGl¸헢2!Nx2[ME(px `Ju {|Ycl{\e d95~gcT@UK̳&-#uu4(9nF\1ץ&/Mdlcu*չ one85 ^]ab$Ao)Uxa(!&[ǧbĠ QJ-JL#]kP*Muا<UV lQݕ%;xx,,./otaҷGY4k0 Ƿ* UrHuY=b*=?_*\ITrbY9 *[Cޚ0P4hY/M_YJ$p)m61q:ÊJEe boCt-fwAZT9Oƪh > stream xڍt<(;#EV}:{7Eqgܝ22#+,#{ d )CGQq=_{<_oƠ bqadi)R`$-d"x iAHA+aC$&@3 }o"@d `0 c)001h$P.Rp!"//+zy"q(8 HORF8QHB*X ___q'^sQ|QWG|aљ8-tE-0_ (8'yxH@JX&X$Ql8WއP#g( @&چ?(C# ax CyHGm53Fjg{x8%(%ÐFh`<=h>M '_f_tOB#@xc%(/oOI`0XN U0?yI`1X2$a>HF7@ N.(4$1&-$A׿$z!0hG7ճ/:bRT Ab C,SJ?\C,Mq{0 '}AD?r0Fqf*6pv ;uaoo-9ovQ pa]o4:(&17puJ~E7.꬜=yDZvC*V=>jj nF+I%d ΥX/K韞p8gZgþ4G :{LwDGE|5hf:o 6`H*r׳J{wYBX"\5.sY'5=q&E:0'WOPJIqc=lYmXhȫN5Ҙ~8MOΚIѼd/*KȊ}𼩏 Yk 'WXA[ yfrM@SatZ= yZ~\. pn􈘪De~%YӖ\\sn}*zšoԽ75Ê-Y_DBdc.w(..jD9>mCa1WGQ8P+V %qջs輦.0ͅY.XL-c'oo|r)F$_)O4]QAv"*,C-dž`+.nO^P8k(hHxmد5pAgvLިjM t'{=U椁M!oO ?:frރ+-nLCzdT {/[_*.s&볜;Qa]GvCؤ9r0ě>QV1ɔ}w5xt^ɶOmXlV`8B[JEʫ[{MZA~5MVkeM"I.I>r̶1DN:;F(& :V)KPp_s Vngd"|bb"#Y/% ַҁ抻ɇ|j8&qߩ.-2և_IT)+*"9m隠U*;FG[7'b?EuM !u3.mIT<ȭ(O%G),wls@/8=GJtU1%LhzbrxNCj\ 2VdlÄUKFֈJ@EdݴЏfN~cN*C N}ai;Ә@7mzd<.- r{0_c%LIuGSlyV wޫ}Ur29E<ڙ (n(wdz?0Xj3e0eri3Gv`EcA/mk_eI A""rrQ˚ՒHww _R]Z3\B~ݚ@K~sͬt c)qtNzO/0sTy8Q49Jd^Q09MvɣAJ. ~q3VDT5J"]UhR&O`Tڶ8 Q[2;Y9Tee~rٖThfMLX*XU |`rb QHBl9ĹT8ѺBƫVh4hߵJɬsȜZ}JW,,N-QI.[جW -v0a Y / w4yU<ǝE˭2iUkRf1E Y_ZWmT:B[g>&Jsq{zJTɫ@ʲݥuUF}VrtIC^n{G)T^A!Ӵ_?jE܊mj2MmrO /]~??c<;j2{:O&ɋϔ_Md¿OTv q7j\2݂?qK!ns`Hf&k@z/:uӮ$u99K;:_Sh6ݢ5!Ɓ5V>-'Z.y'͖VbA  Np>knO`&KٰfSQ*#KicC.=_9*wɜXjnਠ+-/xe5uTFq&zNh90vxՅ;&D.+ݦ(0~9+wGe2Ek4z`R},=gK !y5#j3s~@0dsBr[A'5 zjLUNT%izrWPX\"u=Ystv32C]9pɧG(ή/PUcOd>`wzNOeل95.jk=W89%yˡ\em6yyBhMj!NV UHvELl Fv.jz /pHm~u1JzϙZfjJY]ŧ"_oC_n4X]ʸ=5,NE&XY:k:&Mwk􄵶xc%{&7ʷ3ΐRï&г0Z^1M~++PrKQNKB oGl^ʽ.M*=ɱq'ƹBёgro?kZ mP&}~ju9秊]{R_CV{|^T!n SQ_Q1/yG|mQ=[?쵖H_ʚ ψxuE΍< )y%ܤI:ON;#rWoX85,/c?VbࣩZM7'g]/hksM9$o3ႎg/} d *:6+i(o{KإE,bIBFYY5Cv>a͚Ϭ_-H k%%3GCEt>$=7wiקCǒ_ Bm~%J_E1Ck ARMb];7ҕj>W2w|1vKWScy`lQ19۬[r S1ݢNI4IgZ]QTn͐ 6ͼ?+12g֌Y+vf7Oޞ$sg09o[Iz=Yg)wS+1S%MCs]fb endstream endobj 123 0 obj << /Length1 2375 /Length2 15027 /Length3 0 /Length 16411 /Filter /FlateDecode >> stream xڍp6{gb۶mt4Ķ9mĶ&v}{fֽT~W01X;0sd9LpHUv6֜08|Ȅ >dl&+''== m8NZ5TF6V@;s#kdcdtpfttδV6vgs3"h4U0@ hHf+٘88Ks#1APe,/j{`eO{og##+[kWskS% '*M@ 06  ]=_%"B6VV@k{6}ݕ_'"mTͿ;%m!#3:Xٙ_]m+Tnkc 0(ins7pT7c`9 p&ogТ=_<|ϗNRTSJR_G'(hpa021X"o`$xJX8G'_?ſW߱dm>f3,F_ σ|6;!QGK˿?j+sK||,6UkeeV[+`֦i XX4؛uhc} 6(bmdc~1 \?ƈ@'@Gkm`bcׁ  68t"Al:?@'1 &.}KA2..})A|J3N`W>U>?O?#3?UbG?FA,l,?$ ?GqLL̝/?>LL?f53W[3?s~4?GQLb?᣾?X>\?&l8#{?`o3j>3ÿz~@6h/GGa Q9ˇ-[؛#Ώ lױ?hInpun#G.9}\5~u.@#_ 6F\?i&xfIԒ)iٵ;>!A'PVm $ |Z_&|u?inSh{xыQk[?'ŧQx S4#;|.ڃsK]Xž~K MJoia<6 WKۻYԬwB*8HwMƨyreF.Ml[Աi2wDIEˆ LzJZ%KAc;/4bT^W lu2K7c{-RK&)#sx?z Hλ*9nc g~_̵36\^[V(mjSP+: $~ \Ўufʌ3Rt~'~]YL|z<ˤySZdv2Sؐŋ|x6-oSɛ|[. NgIgTԖYvD4tG8.ʍț"˕8 w׮1(^l !|i5 °cK񬪌4 C;.^+{ @HZ<9-t.´< %v@M?.s? fYLJ:`4ϵR<( nn4Np&⎛B0Xn/^!ya=#@6LmHBY܋k@)9p5d13Ui6 ?ht3M깢kf"M/X@`{ƀPAx܎BBsj5nmJaVW0 Lzo#H~d!. `&{y=t2'eT0% V7 %y@Q8#̶l-`8g- iBxh(znJzHJχ֏ak,L@Aǫڨc];h_N#WnDqY\a|LBvt59rX6d4vK;8Cm p]u+|TGO0 kYAѓ, @KJ8/8r=0ths'݄)t)TR-}TV33@gv|;$aSiE[Kmyk!VCXf-׫}_Xк5<]s"'x:*d),jQص0'LUɖo 1f=xYb2e ?C wǺHDT$"4n,rthyqkz٨&f{rɋ˱Aã6 <'Q*#>0]S1h/[WLAFS"?O7EY= 1GЂ ;r4wujwvI - F_%(qQ,%Y.ӕO DFBY9n GBd|Ny@\ĥζaL '/Y[S>.Ԟ+g"ퟛR? ="dZ!n.:jzfӒi<'HM%2k՞JFE yE^-)O.7F@?a'$L#ttҷ/AOc 1_AМ=Xܘ6RnʳpC:L.ANKc *y YHs[tvE2LW|\믞[l0M;E? f<{js)tI /_e-:KZC1 (SΛʑde%cͯ8A@1fDFtܥAo!v w9 C.zXB*ԦS),wN =| iDuh+31jv6!t{*{! y Rrn? VT/l*Hmc@Z?jkm*ӣH6]Ó"kuhv9z-_g.rcΧdavalùXQ3+U;%U /wcrdJZ~OC= Dq8q0^y:4/)K=Uqn*t J9y nTa溙d^ztkȸ˾LwN|c:Z1֫]:"*4X԰4cM aZkS5tZ6ckPN08 bI?I: ?D=۬5ӟǠt#+tIb@<~KBSH#6)$IxTcrMЋ@rwIGLX&9$ּ2` .LwEmPx̩ 1$Ù\,y0bb!vyFJxhLPLEY~Am^jSl4AkS&^Z}E./ߪ(hIBq10+}7{lUGo in67>DY'uQH}=(+{>T}+kq@EVՊ8؋DÈs 1^̴<&Ճv+ōe"$zj@oH3 l7I&~yXjD][0 3AH"[JIh)hT cS\Ia,_lڒd?ޙɛ _.7*Ƥ`tT*]^+?C})MĄ(s¯ &6؏aY !1vn>R#հ ⤫,ΉvgϜy>¡%(5"l;h!|m_ Ο74Bݽǜ6Zc|'dj`ƍR}7y9ӕVFgs,u܀Rn>cGXkKݰ۞62erQ7|GSt55,*D^5d`_OG/oA7Jbg%n\/myEH;iHOtD\MԮta*wIPLm. Ԯsh_sW39;|&t=/Asú42F:8-aw8jUTZ(cr%OvA1垅g;5 ۗ?;qVJqjmh.gb5Rg.$syCe;^Owܚ\MvMKBvkqO0)?Mrhq; 4|VIU1=٥MS!4XEԧ;9Hfqmlj>H؅rtk7 !m 0PIO핰l(=̾8cNiVZ x?-!,D'pYtAp%> Nd;}@.% 2y51wEq0du!+\x B=0k)glBg4{xcg ̮FۗD+NevR"VG[Hv]ljۨ2|+ky#j%fM5բ@O8봆2ݦWv(7U)E|DiB$$ZoUT-TYi}Zz@}^ߊ:5?d;9`DcQLWZMVU9=](Vp`%GZp͎\-G:&a2!ͅxv'>Whm2OF֯*[sl֥i~+r*o/}JPsQ0pCK5H@#n(譐7Vm.v8-& AbcJU۽Cg ];]e]uk]}?B^`=GD=`}@j?!NOˍ=&PxE<PgIL]|a۶{SGlh4J p/MeATtu"9aC)'.$Ӓ U,ȁ;nOYL JC^-mcڨtN 2Lj{A gҖ6 Fo5 mA@8EdF;w-)ӝ]EH|jRb/`Jpxq>-0Aeg ك9C*g[77|.֛C'y)"&\`W"[#Q; :Ȥf!NkYmz<\5xUz!l$>x>6>|G`%T*-ktq5 ^#e\2pBءHH w\?[{P/[WvHf|^1?Mi)_niuDήԘ:b#_PO܁=Y(o Ix8Q EEȖӬT$+&mige$l|:|+Fa.5E$"ISl<έ)Q)ec&a ޢhQMeJ`#>|tF $jɓ.P9 } }BKQ^>Adx1J gd*UCo6Q (JZNY1>ZٛQIS J`N5T>j#תeZaIiՁ m2~cxpV\}q_4琭d=+Õt)а@i+)VS/%qM(wa'QlV̇g[!a"{o-1%(ʉRUįIQn/b/ ɫsWsB@W"5Lݽ߅/_OAX%֗ %e=7'T;V͚#{pIc I6gx!4b𦭷$Lh d 铓kEU1tߜ2&IUn+stA ӧVLqriГdEyLiK{괳9YުxpC1݊-21vd Ά5ԧlZA~O-ebFۅYoZo$XRsO\aԦq! IMB< lKI̲tH WD䳞`pt5Bw`X^=3mySU¶_k:Z@1$mE2`Ey-T7zcC%~보ókȼӮtIٸkC!H*gp}F-~гRR5Tvc$GrKlCMG)I~ep#iIl_x\>F!Rҵ#(TQKX )u]C[*6 # ֐NӊmJJ N#{F.p I D$Lb"L[ZL8Gثj+)J΃BW:j`:\SLzT ;ܲxxZ/( yz`Q Xi\= .{R{PRF+-[dը>/?PZʌ-{(BK#u=NHŶW&s80MP'<1ֲt"opX GMT2!WѭZay9 bp,Ţ `tƲN̽6{YAf^T,CdyO":SFQzPQVdy0u;nHV{';S~f,%֮yJFv3J Df3dj#|:iNȭU+`ADMB'Wġ-oaD N#]W%Qy-4<ۋ.u$CNQ ĢU;mcP_}vEO{ mK3!"#fNqRgƛ& qnFF?1\\ǃ2Ѧ}ܐw)>#+l_S׃]oـ ;=ަYRZ[4"7u.m2",eExz) ]D^z.,l&NxNw3ˬ9#_${bT 8l!~-Zb"%~(T@Gb~kЊDJYvUQ4!0aXS9ʎ5ֶֻ)f!ho<}2oMF /Z ǵ0 Qc"֓*E 뒼]U;Gz C!~v˃K\2*ta7Z1\<`G/3d~tpC*V 8t裼C`둩Jyy=Q\F֌XKBܽuy0e \ŰX;hK5uy <;R-6t(%Ӏ c-t@o#$C̨gd.||޻!O݆v);Rq}E2ڥ6.~z'6;-$vY]dUzNCYl(%`+ K/eNXPbIxn+Z93[QxW[o|7k.0SG$Q(7SXUnD߾$̼$;Wm2q]xKgP-;>TOV b֯ f > !{4TYYi:"eijۯN^hvGtgelhvK!9 8FgT-_ ?;K6&3=Dizԝ_DIltm%O^%(^'%|}&Vps v ELɵ_voU6\6F$(3Wn5iz8q0@tv}?Q 64dJ~ j*i?*@JVmTs T6Teyw+DHW,6ȹ8?eD3_aFϣ0aG8`֨Nv{d+Y׫G~M`qh'V[n"`0T恱IYdΗFEa퉵S+j Q 5So1ۜU%dq3Rå˛֪9eQcbeγ“DVYiՋq±/qH4ć(٣ʘ“(R rkDLg]J>\D ~zy+>DEM͈w9Cܝ䤺dvT `<B"l'I5!(w|ن:W,3!ܲ *lL♁ʷV7)bP#WyZCiѽyT(W൘;K"T ; cލN[:NBl\ג?fР 1FZrutB: 2p,Y3BLH^q4\q ;Bj!FK̷ <Ȫ#MC?<\ fz|.\yB 5y}>CL jB8!#^.G ^'m4PV+"<l;ΣJ G,N!1rZoo;|"5ڻLz.oQx*݊pZXE)m#+i Xx2^H ~M:Ikd}'V-Jg!әr]Z~cĻ˔M O,`Gf(b42\C1LbܞuQ\dmsXًK%0-^ }7.vAy߈\NsRb$f* /KmG qTc6L w$K6^%Rt*1B}}Y8U5嗗s;Zmdڱa6}~ x] >@8u=Q4[HGQHz͜w|i:$Wty~~ >:VheBVX\fqC ~$Z(6pFgyfM2k'oo=X$a }zFP`F]^'=G.B6u} JN ]TAq\z.'j_/;kD?[YBn8*EipZAzuSYTdb*\?]l˽۸ dL ܿٝ>_KJfhqths^.8/x=x+s͵th~ j;GDm4,"a|en]OJhQ-.t]eW);1lEB ^kQ%zUZQ36)bEb|tBԓB`6 $/>lmU%0|kSD;2Z3^C_< ,8BU) 56H~EVk0Ye,xB (DE /[QOajbh٘1(5d?`N=Sic/ dDZjk:sYQ*EB7) c2a`zZ5G>h$Ax|Ml#m\xXiZXmj/@:up>u Xbdd{6?1?Ui L>5RTDf0j v$h-t9N <$pjvtv!Z tA֦VDȖe&!TCN4# prm=顲ةߪqN޴ `t`S/0:tyLZݨpG+ ܀u{㞩f~|TH'[/! wmǶ:X3\M - %7 =OaLBwnvLϟZs/ѨջGzX=ch fB#&0?i!㧞78rgmP b>:‡BY=BDf 2VidPj9ҪOLg3{}ۋn]7|! \x~.?&A`դ}j|/+ŚGTf 'X2vQXF Ip!T#5}%R`:X$,:z3-MU =Ka!6B›tg hѡSPa8l3*V/ i鷽Eum ڙ3Z{Pt;*Oz"C;!e1[IVVStZ,ZH;oyU\GQqF1iᇺ.C657FS49yi-BkZhM2Bo?CGe p+(iocrj<{XA3AA)W2LNeKqF\I<)`JBGH"h^Dܪ柒1?Yl3¥1=Kw >n4x ܈|=dpχwA\ \Kq,Qً<xϟVHy)Nv捸MDzeG!G7ـyvJ ATJUqL7S+ߞn1pss.$(ݭw~Ɖb~{ 3j%k S.d *tSJcȃ]e^nT^.;^U{I(r-lX;LiG פbtf)TΥMN)s"[\2o ts){=EЩE6!jR=NKPoU}ֹ.RN*( Sxc&հ[O7B`[)!Xznajgʶk]#Z%ZF%u_"<]<Q[~e^ )^}[.S7~8|!XALn(}~KМ)P/U2`JLp|R[*h26KlnPӢϢՃ\v#~1(򣉙mq3ɈqJԑ{}0ͼi:U$|kVR+I6.$4YxD -wGQk-Ky϶oy6̎z]K])#p rU^uЧ;a~S"AIc> '-pBCQiredB-l±W )թK2+;dUl0;`O`:$iRԣ%W4v.7)H_/j׭x ;;Yo)+ZmZ=S0!Ĺ\0?bCBV #77#ϧM>#Je26;mP?E{j8sXҁ)!w=2BW wq@s=BkL[WݬjĴeXoVW)|^9Q4>ѧhB8tVSÓOZF%t7Wp{('bB=&a3?,P٪_iCAoxRm-òԛXJQZ?e`t0>bL vAkĎ.C<'VJ9Y#X6.t| Q)nJ"cBjYt?+oYp51p3=(PX ~y7;!qGs[> stream x[OHVrV~@O?t@&wf;qHHhJW~m(^X'NI(# 0ָvJhEZ@cX0`IX@aMt_8t$Lњ"Ii,$+(,^+J !| >Ua69@) ox*p^ m(=J%|A%, {A*(Dg"f righ DOz5V^,H1D0y'Z!Q@$zLB(4^bɀ$T 2$$wi#, \ U+POָ*=,ЏTTHepV"X[ip4Ϥ+zd탆S`E1`,c!m '!x,!arfqx6,hh\6䉐'B>B>?ɠG~8NF-Xgg;Wu5!Uzp&sw2C1xXE_U%IvQ݃dp},j|b(J|R鴷ɓ/> zt^u*D|%"ΨBSNF (#Q(CpGNEBs* x\X$ETy 2+}@~TV),V0(6hu?+VXlonbm*^@UA}>3K4jc ԌjLR˒Ǒzf:RƜ!XSBcp!_곓 Ax/I7UwJR6d%o63'QOB# l)qVh}.^=f4A!+F0eP[Wxw>Z(c(<-MThW6yJθә,,y Dz|@.'H9_Oj\d5Ga5';G9BaCW W|#69ڒmm]ٌm)ur{0(~uou9y ; F؋,&ahgvh" aQ~&6y;(OY0!R?'i{_ @ccZo" eDiǧ62/MI1V3,7IΓ )1Rc;3o~k,?'.|e>M%Fu@j'IcA̚~L>f+l-{<+Mr=d6a13[b.VLgH&X&t{EKNcpxmsPf7]V*+q8;j5h[9n:CQquV<#*zYQ0\}<-*lPuHEG^ ;4A";D^QtIM.K7g | 9gBM4 X|33Қ]X:MifYZrF5yQ$nst,}Cxg"WHaQfT䖍QFLLe7 |g*D >D1#kK$LX) >swr.5Hs6kҳjV٩fWΠ3j`-ߥʋ`5TTCٚ^u6ј<#XRZ#EISܚ&b9kۂhasɱ%%͑!% ,'VSpDuHgXd (Kk$RuNd.0s^M%rsvs- m3fućI6m Яk.gHJ-M=#X.( CD%eF+5W=JL np7]^ͯM6||M3|ojb7g($nG,=#IO +bH!I2QȮcʣF1_TK_ TA}.}[O$FDmӯ~b=XP:59}~"?j0uCh]]^4m#׻ J1nĤl(f-)jKy10XhûݏxXUk>g8K f|#o_Fߪ t3N=?*W@r֍zxyNhu o@8/J~?c1˃l eSSqlV9AA?TXb>uɹRH Q__:+t`& y 8AyWZuβS{RάnP?;$qd: G~ɣYirsQR/vN޲(+ TE6Em%? uM'o߮,sd'ߒFir&ֺF2w >E}ǵDMq+ͻe]n޼{{e4|Wl\mcg7&wFW+&vsu;^Z ~Xjw/0qŦB[~ KkrtJ[UNG"4iEb~ص'r?OwY/nD:U6bơKZoL*_nUK}_ap.Kkm;u^ey=NG%u+Eė|Ζ zo%;;}+E?g[ͯn'W ?VEFf M迄osףOfg^_Y>6> endobj 126 0 obj << /Type /ObjStm /N 11 /First 78 /Length 402 /Filter /FlateDecode >> stream x}T[k0~8ӓKJl.ODhh:owI<\p}@FW!`(@ni AHJ= ]s90 GyM^C}9 R\/k|n1h2U`50w@*JI АykpnGEYf'&v*C;::ǫl;}Q' ӂg4'x lBoœ ~麡]$DM?U:+蹕b]3%ޭP[ DYX#%dz󈧏"v7P|(Ϝ{}J.Q?1SJk>B{~ e}qi^=Ϗ'OR*Wy&CS[fU(o1f9 endstream endobj 134 0 obj << /Type /XRef /Index [0 135] /Size 135 /W [1 3 1] /Root 132 0 R /Info 133 0 R /ID [<969692F16ABCA307796544CCA00555CD> <969692F16ABCA307796544CCA00555CD>] /Length 332 /Filter /FlateDecode >> stream x%ҧNQs.}) KY{^Kd$x&Cx4̗qDD~uBER B"(1Q Zfvr !ɐH4H B&dAِ ˰ PP P%*! Pk`Zڠ:zTB!;yP%|m5rQm5ra5h5ue5:xo5ze5z~i5zSVӪ7V3ެfZͩ;}u/)\zlxǾxlS1 endstream endobj startxref 184338 %%EOF GenomicAlignments/inst/doc/OverlapEncodings.R0000644000175400017540000007643513203700434022325 0ustar00biocbuildbiocbuild### R code from vignette source 'OverlapEncodings.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: style ################################################### BiocStyle::latex() ################################################### ### code chunk number 2: options ################################################### options(width=100) .precomputed_results_dir <- "precomputed_results" .loadPrecomputed <- function(objname) { filename <- paste0(objname, ".rda") path <- file.path(.precomputed_results_dir, filename) tempenv <- new.env(parent=emptyenv()) load(path, envir=tempenv) get(objname, envir=tempenv) } .checkIdenticalToPrecomputed <- function(obj, objname, ignore.metadata=FALSE) { precomputed_obj <- .loadPrecomputed(objname) if (ignore.metadata) metadata(obj) <- metadata(precomputed_obj) <- list() ## Replace NAs with FALSE in circularity flag (because having the flag set ## to NA instead of FALSE (or vice-versa) is not considered a significant ## difference between the 2 objects). isCircular(obj) <- isCircular(obj) %in% TRUE isCircular(precomputed_obj) <- isCircular(precomputed_obj) %in% TRUE if (!identical(obj, precomputed_obj)) stop("'", objname, "' is not identical to precomputed version") } ################################################### ### code chunk number 3: untreated1_chr4 ################################################### library(pasillaBamSubset) untreated1_chr4() ################################################### ### code chunk number 4: readGAlignments ################################################### library(GenomicAlignments) flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) U1.GAL <- readGAlignments(untreated1_chr4(), use.names=TRUE, param=param0) head(U1.GAL) ################################################### ### code chunk number 5: U1.GAL_names_is_dup ################################################### U1.GAL_names_is_dup <- duplicated(names(U1.GAL)) table(U1.GAL_names_is_dup) ################################################### ### code chunk number 6: U1.GAL_qnames ################################################### U1.uqnames <- unique(names(U1.GAL)) U1.GAL_qnames <- factor(names(U1.GAL), levels=U1.uqnames) ################################################### ### code chunk number 7: U1.GAL_dup2unq ################################################### U1.GAL_dup2unq <- match(U1.GAL_qnames, U1.GAL_qnames) ################################################### ### code chunk number 8: skipped-regions-in-U1.GAL ################################################### head(unique(cigar(U1.GAL))) table(njunc(U1.GAL)) ################################################### ### code chunk number 9: no-indels-in-U1.GAL ################################################### colSums(cigarOpTable(cigar(U1.GAL))) ################################################### ### code chunk number 10: readGAlignmentPairs ################################################### U3.galp <- readGAlignmentPairs(untreated3_chr4(), use.names=TRUE, param=param0) head(U3.galp) ################################################### ### code chunk number 11: first-and-last-U3.galp ################################################### head(first(U3.galp)) head(last(U3.galp)) ################################################### ### code chunk number 12: isProperPair ################################################### table(isProperPair(U3.galp)) ################################################### ### code chunk number 13: keep-only-proper-pairs ################################################### U3.GALP <- U3.galp[isProperPair(U3.galp)] ################################################### ### code chunk number 14: U3.GALP_names_is_dup ################################################### U3.GALP_names_is_dup <- duplicated(names(U3.GALP)) table(U3.GALP_names_is_dup) ################################################### ### code chunk number 15: U3.GALP_qnames ################################################### U3.uqnames <- unique(names(U3.GALP)) U3.GALP_qnames <- factor(names(U3.GALP), levels=U3.uqnames) ################################################### ### code chunk number 16: U3.GALP_dup2unq ################################################### U3.GALP_dup2unq <- match(U3.GALP_qnames, U3.GALP_qnames) ################################################### ### code chunk number 17: skipped-region-in-U3.GALP ################################################### head(unique(cigar(first(U3.GALP)))) head(unique(cigar(last(U3.GALP)))) table(njunc(first(U3.GALP)), njunc(last(U3.GALP))) ################################################### ### code chunk number 18: no-indels-in-U3.GALP ################################################### colSums(cigarOpTable(cigar(first(U3.GALP)))) colSums(cigarOpTable(cigar(last(U3.GALP)))) ################################################### ### code chunk number 19: txdb ################################################### library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) TxDb.Dmelanogaster.UCSC.dm3.ensGene txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene ################################################### ### code chunk number 20: exbytx ################################################### exbytx <- exonsBy(txdb, by="tx", use.names=TRUE) length(exbytx) # nb of transcripts ################################################### ### code chunk number 21: CHECK_exbytx ################################################### .checkIdenticalToPrecomputed(exbytx, "exbytx", ignore.metadata=TRUE) ################################################### ### code chunk number 22: check-for-trans-splicing-in-exbytx ################################################### table(elementNROWS(runLength(seqnames(exbytx)))) table(elementNROWS(runLength(strand(exbytx)))) ################################################### ### code chunk number 23: exbytx_strand ################################################### exbytx_strand <- unlist(runValue(strand(exbytx)), use.names=FALSE) ################################################### ### code chunk number 24: exbytx2gene ################################################### tx <- transcripts(txdb, columns=c("tx_name", "gene_id")) head(tx) df <- mcols(tx) exbytx2gene <- as.character(df$gene_id) exbytx2gene <- factor(exbytx2gene, levels=unique(exbytx2gene)) names(exbytx2gene) <- df$tx_name exbytx2gene <- exbytx2gene[names(exbytx)] head(exbytx2gene) nlevels(exbytx2gene) # nb of genes ################################################### ### code chunk number 25: U1.OV00 ################################################### U1.OV00 <- findOverlaps(U1.GAL, exbytx, ignore.strand=TRUE) ################################################### ### code chunk number 26: length-of-U1.OV00 ################################################### length(U1.OV00) ################################################### ### code chunk number 27: U1.GAL_ntx ################################################### U1.GAL_ntx <- countQueryHits(U1.OV00) mcols(U1.GAL)$ntx <- U1.GAL_ntx head(U1.GAL) table(U1.GAL_ntx) mean(U1.GAL_ntx >= 1) ################################################### ### code chunk number 28: U1.GAL_ntx_again (eval = FALSE) ################################################### ## U1.GAL_ntx_again <- countOverlaps(U1.GAL, exbytx, ignore.strand=TRUE) ## stopifnot(identical(unname(U1.GAL_ntx_again), U1.GAL_ntx)) ################################################### ### code chunk number 29: U1.uqnames_ntx ################################################### U1.OV10 <- remapHits(U1.OV00, Lnodes.remapping=U1.GAL_qnames) U1.uqnames_ntx <- countQueryHits(U1.OV10) names(U1.uqnames_ntx) <- U1.uqnames table(U1.uqnames_ntx) mean(U1.uqnames_ntx >= 1) ################################################### ### code chunk number 30: U1.exbytx_nOV10 ################################################### U1.exbytx_nOV10 <- countSubjectHits(U1.OV10) names(U1.exbytx_nOV10) <- names(exbytx) mean(U1.exbytx_nOV10 >= 50) ################################################### ### code chunk number 31: top-10-transcripts-based-on-U1.exbytx_nOV10 ################################################### head(sort(U1.exbytx_nOV10, decreasing=TRUE), n=10) ################################################### ### code chunk number 32: U3.OV00 ################################################### U3.OV00 <- findOverlaps(U3.GALP, exbytx, ignore.strand=TRUE) ################################################### ### code chunk number 33: length-of-U3.OV00 ################################################### length(U3.OV00) ################################################### ### code chunk number 34: U3.GALP_ntx ################################################### U3.GALP_ntx <- countQueryHits(U3.OV00) mcols(U3.GALP)$ntx <- U3.GALP_ntx head(U3.GALP) table(U3.GALP_ntx) mean(U3.GALP_ntx >= 1) ################################################### ### code chunk number 35: U3.GALP_ntx_again (eval = FALSE) ################################################### ## U3.GALP_ntx_again <- countOverlaps(U3.GALP, exbytx, ignore.strand=TRUE) ## stopifnot(identical(unname(U3.GALP_ntx_again), U3.GALP_ntx)) ################################################### ### code chunk number 36: U3.uqnames_ntx ################################################### U3.OV10 <- remapHits(U3.OV00, Lnodes.remapping=U3.GALP_qnames) U3.uqnames_ntx <- countQueryHits(U3.OV10) names(U3.uqnames_ntx) <- U3.uqnames table(U3.uqnames_ntx) mean(U3.uqnames_ntx >= 1) ################################################### ### code chunk number 37: U3.exbytx_nOV10 ################################################### U3.exbytx_nOV10 <- countSubjectHits(U3.OV10) names(U3.exbytx_nOV10) <- names(exbytx) mean(U3.exbytx_nOV10 >= 50) ################################################### ### code chunk number 38: top-10-transcripts-based-on-U3.exbytx_nOV10 ################################################### head(sort(U3.exbytx_nOV10, decreasing=TRUE), n=10) ################################################### ### code chunk number 39: U1.grl_and_U1.grlf ################################################### U1.grl <- grglist(U1.GAL, order.as.in.query=TRUE) U1.grlf <- flipQuery(U1.grl) # flipped ################################################### ### code chunk number 40: U1.ovencAB ################################################### U1.ovencA <- encodeOverlaps(U1.grl, exbytx, hits=U1.OV00) U1.ovencB <- encodeOverlaps(U1.grlf, exbytx, hits=U1.OV00) ################################################### ### code chunk number 41: U1.ovenc ################################################### U1.grl_strand <- unlist(runValue(strand(U1.grl)), use.names=FALSE) U1.ovenc <- selectEncodingWithCompatibleStrand(U1.ovencA, U1.ovencB, U1.grl_strand, exbytx_strand, hits=U1.OV00) U1.ovenc ################################################### ### code chunk number 42: U1.ovenc_again ################################################### U1.ovenc_again <- encodeOverlaps(U1.grl, exbytx, hits=U1.OV00, flip.query.if.wrong.strand=TRUE) stopifnot(identical(U1.ovenc_again, U1.ovenc)) ################################################### ### code chunk number 43: U1.ovenc_table ################################################### U1.unique_encodings <- levels(U1.ovenc) length(U1.unique_encodings) head(U1.unique_encodings) U1.ovenc_table <- table(encoding(U1.ovenc)) tail(sort(U1.ovenc_table)) ################################################### ### code chunk number 44: U3.ovenc ################################################### U3.grl <- grglist(U3.GALP) U3.ovenc <- encodeOverlaps(U3.grl, exbytx, hits=U3.OV00, flip.query.if.wrong.strand=TRUE) U3.ovenc ################################################### ### code chunk number 45: U3.ovenc_table ################################################### U3.unique_encodings <- levels(U3.ovenc) length(U3.unique_encodings) head(U3.unique_encodings) U3.ovenc_table <- table(encoding(U3.ovenc)) tail(sort(U3.ovenc_table)) ################################################### ### code chunk number 46: U1-unique-compatible-encodings ################################################### sort(U1.ovenc_table[isCompatibleWithSplicing(U1.unique_encodings)]) ################################################### ### code chunk number 47: U1.OV00_is_comp ################################################### U1.OV00_is_comp <- isCompatibleWithSplicing(U1.ovenc) table(U1.OV00_is_comp) # 531797 "splice compatible" overlaps ################################################### ### code chunk number 48: U1.compOV00 ################################################### U1.compOV00 <- U1.OV00[U1.OV00_is_comp] ################################################### ### code chunk number 49: U1.compOV00_again (eval = FALSE) ################################################### ## U1.compOV00_again <- findCompatibleOverlaps(U1.GAL, exbytx) ## stopifnot(identical(U1.compOV00_again, U1.compOV00)) ################################################### ### code chunk number 50: U1.GAL_ncomptx ################################################### U1.GAL_ncomptx <- countQueryHits(U1.compOV00) mcols(U1.GAL)$ncomptx <- U1.GAL_ncomptx head(U1.GAL) table(U1.GAL_ncomptx) mean(U1.GAL_ncomptx >= 1) ################################################### ### code chunk number 51: U1.GAL_ncomptx_again (eval = FALSE) ################################################### ## U1.GAL_ncomptx_again <- countCompatibleOverlaps(U1.GAL, exbytx) ## stopifnot(identical(U1.GAL_ncomptx_again, U1.GAL_ncomptx)) ################################################### ### code chunk number 52: U1.uqnames_ncomptx ################################################### U1.compOV10 <- remapHits(U1.compOV00, Lnodes.remapping=U1.GAL_qnames) U1.uqnames_ncomptx <- countQueryHits(U1.compOV10) names(U1.uqnames_ncomptx) <- U1.uqnames table(U1.uqnames_ncomptx) mean(U1.uqnames_ncomptx >= 1) ################################################### ### code chunk number 53: U1.exbytx_ncompOV10 ################################################### U1.exbytx_ncompOV10 <- countSubjectHits(U1.compOV10) names(U1.exbytx_ncompOV10) <- names(exbytx) mean(U1.exbytx_ncompOV10 >= 50) ################################################### ### code chunk number 54: top-10-transcripts-based-on-U1.exbytx_ncompOV10 ################################################### head(sort(U1.exbytx_ncompOV10, decreasing=TRUE), n=10) ################################################### ### code chunk number 55: U3-unique-compatible-encodings ################################################### sort(U3.ovenc_table[isCompatibleWithSplicing(U3.unique_encodings)]) ################################################### ### code chunk number 56: U3.OV00_is_comp ################################################### U3.OV00_is_comp <- isCompatibleWithSplicing(U3.ovenc) table(U3.OV00_is_comp) # 106835 "splice compatible" paired-end overlaps ################################################### ### code chunk number 57: U3.compOV00 ################################################### U3.compOV00 <- U3.OV00[U3.OV00_is_comp] ################################################### ### code chunk number 58: U3.compOV00_again (eval = FALSE) ################################################### ## U3.compOV00_again <- findCompatibleOverlaps(U3.GALP, exbytx) ## stopifnot(identical(U3.compOV00_again, U3.compOV00)) ################################################### ### code chunk number 59: U3.GALP_ncomptx ################################################### U3.GALP_ncomptx <- countQueryHits(U3.compOV00) mcols(U3.GALP)$ncomptx <- U3.GALP_ncomptx head(U3.GALP) table(U3.GALP_ncomptx) mean(U3.GALP_ncomptx >= 1) ################################################### ### code chunk number 60: U3.GALP_ncomptx_again (eval = FALSE) ################################################### ## U3.GALP_ncomptx_again <- countCompatibleOverlaps(U3.GALP, exbytx) ## stopifnot(identical(U3.GALP_ncomptx_again, U3.GALP_ncomptx)) ################################################### ### code chunk number 61: U3.uqnames_ncomptx ################################################### U3.compOV10 <- remapHits(U3.compOV00, Lnodes.remapping=U3.GALP_qnames) U3.uqnames_ncomptx <- countQueryHits(U3.compOV10) names(U3.uqnames_ncomptx) <- U3.uqnames table(U3.uqnames_ncomptx) mean(U3.uqnames_ncomptx >= 1) ################################################### ### code chunk number 62: U3.exbytx_ncompOV10 ################################################### U3.exbytx_ncompOV10 <- countSubjectHits(U3.compOV10) names(U3.exbytx_ncompOV10) <- names(exbytx) mean(U3.exbytx_ncompOV10 >= 50) ################################################### ### code chunk number 63: top-10-transcripts-based-on-U3.exbytx_ncompOV10 ################################################### head(sort(U3.exbytx_ncompOV10, decreasing=TRUE), n=10) ################################################### ### code chunk number 64: Dmelanogaster ################################################### library(BSgenome.Dmelanogaster.UCSC.dm3) Dmelanogaster ################################################### ### code chunk number 65: U1-reference-query-sequences ################################################### library(GenomicFeatures) U1.GAL_rqseq <- extractTranscriptSeqs(Dmelanogaster, U1.grl) head(U1.GAL_rqseq) ################################################### ### code chunk number 66: U3.grl_first-and-U3.grl_last ################################################### U3.grl_first <- grglist(first(U3.GALP, real.strand=TRUE), order.as.in.query=TRUE) U3.grl_last <- grglist(last(U3.GALP, real.strand=TRUE), order.as.in.query=TRUE) ################################################### ### code chunk number 67: U3-reference-query-sequences ################################################### U3.GALP_rqseq1 <- extractTranscriptSeqs(Dmelanogaster, U3.grl_first) U3.GALP_rqseq2 <- extractTranscriptSeqs(Dmelanogaster, U3.grl_last) ################################################### ### code chunk number 68: U1.OV00_qstart ################################################### U1.OV00_qstart <- extractQueryStartInTranscript(U1.grl, exbytx, hits=U1.OV00, ovenc=U1.ovenc) head(subset(U1.OV00_qstart, U1.OV00_is_comp)) ################################################### ### code chunk number 69: txseq ################################################### txseq <- extractTranscriptSeqs(Dmelanogaster, exbytx) ################################################### ### code chunk number 70: U1.OV00_rqseq-vs-U1.OV00_txseq ################################################### U1.OV00_rqseq <- U1.GAL_rqseq[queryHits(U1.OV00)] U1.OV00_rqseq[flippedQuery(U1.ovenc)] <- reverseComplement(U1.OV00_rqseq[flippedQuery(U1.ovenc)]) U1.OV00_txseq <- txseq[subjectHits(U1.OV00)] stopifnot(all( U1.OV00_rqseq[U1.OV00_is_comp] == narrow(U1.OV00_txseq[U1.OV00_is_comp], start=U1.OV00_qstart$startInTranscript[U1.OV00_is_comp], width=width(U1.OV00_rqseq)[U1.OV00_is_comp]) )) ################################################### ### code chunk number 71: U3.OV00_Lqstart ################################################### U3.OV00_Lqstart <- extractQueryStartInTranscript(U3.grl, exbytx, hits=U3.OV00, ovenc=U3.ovenc) head(subset(U3.OV00_Lqstart, U3.OV00_is_comp)) ################################################### ### code chunk number 72: U3.OV00_Rqstart ################################################### U3.OV00_Rqstart <- extractQueryStartInTranscript(U3.grl, exbytx, hits=U3.OV00, ovenc=U3.ovenc, for.query.right.end=TRUE) head(subset(U3.OV00_Rqstart, U3.OV00_is_comp)) ################################################### ### code chunk number 73: U3.OV00_Lrqseq_and_Rrqseq ################################################### U3.OV00_Lrqseq <- U3.GALP_rqseq1[queryHits(U3.OV00)] U3.OV00_Rrqseq <- U3.GALP_rqseq2[queryHits(U3.OV00)] ################################################### ### code chunk number 74: U3.OV00_Lrqseq_and_Rrqseq ################################################### flip_idx <- which(flippedQuery(U3.ovenc)) tmp <- U3.OV00_Lrqseq[flip_idx] U3.OV00_Lrqseq[flip_idx] <- reverseComplement(U3.OV00_Rrqseq[flip_idx]) U3.OV00_Rrqseq[flip_idx] <- reverseComplement(tmp) ################################################### ### code chunk number 75: U3.OV00_txseq ################################################### U3.OV00_txseq <- txseq[subjectHits(U3.OV00)] ################################################### ### code chunk number 76: U3.OV00_Lrqseq-vs-U3.OV00_txseq ################################################### stopifnot(all( U3.OV00_Lrqseq[U3.OV00_is_comp] == narrow(U3.OV00_txseq[U3.OV00_is_comp], start=U3.OV00_Lqstart$startInTranscript[U3.OV00_is_comp], width=width(U3.OV00_Lrqseq)[U3.OV00_is_comp]) )) ################################################### ### code chunk number 77: U3.OV00_Rrqseq-vs-U3.OV00_txseq ################################################### stopifnot(all( U3.OV00_Rrqseq[U3.OV00_is_comp] == narrow(U3.OV00_txseq[U3.OV00_is_comp], start=U3.OV00_Rqstart$startInTranscript[U3.OV00_is_comp], width=width(U3.OV00_Rrqseq)[U3.OV00_is_comp]) )) ################################################### ### code chunk number 78: findSequenceHits ################################################### ### A wrapper to vwhichPDict() that supports IUPAC ambiguity codes in 'qseq' ### and 'txseq', and treats them as such. findSequenceHits <- function(qseq, txseq, which.txseq=NULL, max.mismatch=0) { .asHits <- function(x, pattern_length) { query_hits <- unlist(x) if (is.null(query_hits)) query_hits <- integer(0) subject_hits <- rep.int(seq_len(length(x)), elementNROWS(x)) Hits(query_hits, subject_hits, pattern_length, length(x), sort.by.query=TRUE) } .isHitInTranscriptBounds <- function(hits, qseq, txseq) { sapply(seq_len(length(hits)), function(i) { pattern <- qseq[[queryHits(hits)[i]]] subject <- txseq[[subjectHits(hits)[i]]] v <- matchPattern(pattern, subject, max.mismatch=max.mismatch, fixed=FALSE) any(1L <= start(v) & end(v) <= length(subject)) }) } if (!is.null(which.txseq)) { txseq0 <- txseq txseq <- txseq[which.txseq] } names(qseq) <- NULL other <- alphabetFrequency(qseq, baseOnly=TRUE)[ , "other"] is_clean <- other == 0L # "clean" means "no IUPAC ambiguity code" ## Find hits for "clean" original queries. qseq0 <- qseq[is_clean] pdict0 <- PDict(qseq0, max.mismatch=max.mismatch) m0 <- vwhichPDict(pdict0, txseq, max.mismatch=max.mismatch, fixed="pattern") hits0 <- .asHits(m0, length(qseq0)) hits0@nLnode <- length(qseq) hits0@from <- which(is_clean)[hits0@from] ## Find hits for non "clean" original queries. qseq1 <- qseq[!is_clean] m1 <- vwhichPDict(qseq1, txseq, max.mismatch=max.mismatch, fixed=FALSE) hits1 <- .asHits(m1, length(qseq1)) hits1@nLnode <- length(qseq) hits1@from <- which(!is_clean)[hits1@from] ## Combine the hits. query_hits <- c(queryHits(hits0), queryHits(hits1)) subject_hits <- c(subjectHits(hits0), subjectHits(hits1)) if (!is.null(which.txseq)) { ## Remap the hits. txseq <- txseq0 subject_hits <- which.txseq[subject_hits] hits0@nRnode <- length(txseq) } ## Order the hits. oo <- orderIntegerPairs(query_hits, subject_hits) hits0@from <- query_hits[oo] hits0@to <- subject_hits[oo] if (max.mismatch != 0L) { ## Keep only "in bounds" hits. is_in_bounds <- .isHitInTranscriptBounds(hits0, qseq, txseq) hits0 <- hits0[is_in_bounds] } hits0 } ################################################### ### code chunk number 79: which.txseq (eval = FALSE) ################################################### ## chr4tx <- transcripts(txdb, vals=list(tx_chrom="chr4")) ## chr4txnames <- mcols(chr4tx)$tx_name ## which.txseq <- match(chr4txnames, names(txseq)) ################################################### ### code chunk number 80: U1.sbcompHITS (eval = FALSE) ################################################### ## U1.sbcompHITSa <- findSequenceHits(U1.oqseq, txseq, ## which.txseq=which.txseq, max.mismatch=6) ## U1.sbcompHITSb <- findSequenceHits(reverseComplement(U1.oqseq), txseq, ## which.txseq=which.txseq, max.mismatch=6) ## U1.sbcompHITS <- union(U1.sbcompHITSa, U1.sbcompHITSb) ################################################### ### code chunk number 81: LOAD_U1.sbcompHITS ################################################### U1.sbcompHITSa <- .loadPrecomputed("U1.sbcompHITSa") U1.sbcompHITSb <- .loadPrecomputed("U1.sbcompHITSb") U1.sbcompHITS <- union(U1.sbcompHITSa, U1.sbcompHITSb) ################################################### ### code chunk number 82: U1.uqnames_nsbcomptx ################################################### U1.uqnames_nsbcomptx <- countQueryHits(U1.sbcompHITS) names(U1.uqnames_nsbcomptx) <- U1.uqnames table(U1.uqnames_nsbcomptx) mean(U1.uqnames_nsbcomptx >= 1) ################################################### ### code chunk number 83: U1.exbytx_nsbcompHITS ################################################### U1.exbytx_nsbcompHITS <- countSubjectHits(U1.sbcompHITS) names(U1.exbytx_nsbcompHITS) <- names(exbytx) mean(U1.exbytx_nsbcompHITS >= 50) ################################################### ### code chunk number 84: top-10-transcripts-based-on-U1.exbytx_nsbcompHITS ################################################### head(sort(U1.exbytx_nsbcompHITS, decreasing=TRUE), n=10) ################################################### ### code chunk number 85: encoding-based-compatible-implies-string-based-compatible ################################################### stopifnot(length(setdiff(U1.compOV10, U1.sbcompHITS)) == 0) ################################################### ### code chunk number 86: string-based-compatible-does-NOT-imply-encoding-based-compatible ################################################### length(setdiff(U1.sbcompHITS, U1.compOV10)) ################################################### ### code chunk number 87: U1-unique-almost-compatible-encodings ################################################### sort(U1.ovenc_table[isCompatibleWithSkippedExons(U1.unique_encodings)]) ################################################### ### code chunk number 88: U1.OV00_is_acomp ################################################### U1.OV00_is_acomp <- isCompatibleWithSkippedExons(U1.ovenc) table(U1.OV00_is_acomp) # 1202 "almost splice compatible" overlaps ################################################### ### code chunk number 89: U1.acompOV00 ################################################### U1.acompOV00 <- U1.OV00[U1.OV00_is_acomp] ################################################### ### code chunk number 90: U1.GAL_nacomptx ################################################### U1.GAL_nacomptx <- countQueryHits(U1.acompOV00) mcols(U1.GAL)$nacomptx <- U1.GAL_nacomptx head(U1.GAL) table(U1.GAL_nacomptx) mean(U1.GAL_nacomptx >= 1) ################################################### ### code chunk number 91: U1.exbytx_nacompOV00 ################################################### U1.exbytx_nacompOV00 <- countSubjectHits(U1.acompOV00) names(U1.exbytx_nacompOV00) <- names(exbytx) table(U1.exbytx_nacompOV00) mean(U1.exbytx_nacompOV00 >= 50) ################################################### ### code chunk number 92: U1.OV00_qstart ################################################### head(subset(U1.OV00_qstart, U1.OV00_is_acomp)) ################################################### ### code chunk number 93: U3-unique-almost-compatible-encodings ################################################### sort(U3.ovenc_table[isCompatibleWithSkippedExons(U3.unique_encodings)]) ################################################### ### code chunk number 94: U3.OV00_is_acomp ################################################### U3.OV00_is_acomp <- isCompatibleWithSkippedExons(U3.ovenc) table(U3.OV00_is_acomp) # 141 "almost splice compatible" paired-end overlaps ################################################### ### code chunk number 95: U3.acompOV00 ################################################### U3.acompOV00 <- U3.OV00[U3.OV00_is_acomp] ################################################### ### code chunk number 96: U3.GALP_nacomptx ################################################### U3.GALP_nacomptx <- countQueryHits(U3.acompOV00) mcols(U3.GALP)$nacomptx <- U3.GALP_nacomptx head(U3.GALP) table(U3.GALP_nacomptx) mean(U3.GALP_nacomptx >= 1) ################################################### ### code chunk number 97: U3.exbytx_nacompOV00 ################################################### U3.exbytx_nacompOV00 <- countSubjectHits(U3.acompOV00) names(U3.exbytx_nacompOV00) <- names(exbytx) table(U3.exbytx_nacompOV00) mean(U3.exbytx_nacompOV00 >= 50) ################################################### ### code chunk number 98: U3.OV00_Lqstart-and-U3.OV00_Rqstart ################################################### head(subset(U3.OV00_Lqstart, U3.OV00_is_acomp)) head(subset(U3.OV00_Rqstart, U3.OV00_is_acomp)) ################################################### ### code chunk number 99: U1.GAL_is_nsj ################################################### U1.GAL_is_nsj <- U1.GAL_nacomptx != 0L & U1.GAL_ncomptx == 0L head(which(U1.GAL_is_nsj)) ################################################### ### code chunk number 100: U1.OV00_is_nsj ################################################### U1.OV00_is_nsj <- queryHits(U1.OV00) %in% which(U1.GAL_is_nsj) ################################################### ### code chunk number 101: narrow-U1.OV00_is_nsj ################################################### U1.OV00_is_nsj <- U1.OV00_is_nsj & U1.OV00_is_acomp U1.nsjOV00 <- U1.OV00[U1.OV00_is_nsj] ################################################### ### code chunk number 102: U1.nsjOV00_skippedex ################################################### U1.nsjOV00_skippedex <- extractSkippedExonRanks(U1.ovenc)[U1.OV00_is_nsj] names(U1.nsjOV00_skippedex) <- queryHits(U1.nsjOV00) table(elementNROWS(U1.nsjOV00_skippedex)) ################################################### ### code chunk number 103: U1.exbytx_skippedex ################################################### f <- factor(names(exbytx)[subjectHits(U1.nsjOV00)], levels=names(exbytx)) U1.exbytx_skippedex <- split(U1.nsjOV00_skippedex, f) ################################################### ### code chunk number 104: names-of-U1.exbytx_skippedex ################################################### head(names(U1.exbytx_skippedex)) # transcript names ################################################### ### code chunk number 105: FBtr0089124-skipped-exons ################################################### U1.exbytx_skippedex$FBtr0089124 ################################################### ### code chunk number 106: FBtr0089147-skipped-exons ################################################### U1.exbytx_skippedex$FBtr0089147 ################################################### ### code chunk number 107: sessionInfo ################################################### sessionInfo() GenomicAlignments/inst/doc/OverlapEncodings.Rnw0000644000175400017540000016236513175714431022702 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Overlap encodings} %\VignetteDepends{pasillaBamSubset, GenomicAlignments, GenomicFeatures, BSgenome.Dmelanogaster.UCSC.dm3, TxDb.Dmelanogaster.UCSC.dm3.ensGene} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass{article} <>= BiocStyle::latex() @ \title{Overlap encodings} \author{Herv\'e Pag\`es} \date{Last modified: December 2016; Compiled: \today} \begin{document} \maketitle <>= options(width=100) .precomputed_results_dir <- "precomputed_results" .loadPrecomputed <- function(objname) { filename <- paste0(objname, ".rda") path <- file.path(.precomputed_results_dir, filename) tempenv <- new.env(parent=emptyenv()) load(path, envir=tempenv) get(objname, envir=tempenv) } .checkIdenticalToPrecomputed <- function(obj, objname, ignore.metadata=FALSE) { precomputed_obj <- .loadPrecomputed(objname) if (ignore.metadata) metadata(obj) <- metadata(precomputed_obj) <- list() ## Replace NAs with FALSE in circularity flag (because having the flag set ## to NA instead of FALSE (or vice-versa) is not considered a significant ## difference between the 2 objects). isCircular(obj) <- isCircular(obj) %in% TRUE isCircular(precomputed_obj) <- isCircular(precomputed_obj) %in% TRUE if (!identical(obj, precomputed_obj)) stop("'", objname, "' is not identical to precomputed version") } @ \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In the context of an RNA-seq experiment, encoding the overlaps between the aligned reads and the transcripts can be used for detecting those overlaps that are ``splice compatible'', that is, compatible with the splicing of the transcript. Various tools are provided in the \Rpackage{GenomicAlignments} package for working with {\it overlap encodings}. In this vignette, we illustrate the use of these tools on the single-end and paired-end reads of an RNA-seq experiment. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Load reads from a BAM file} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load single-end reads from a BAM file} BAM file {\tt untreated1\_chr4.bam} (located in the \Rpackage{pasillaBamSubset} data package) contains single-end reads from the ``Pasilla'' experiment and aligned against the dm3 genome (see \Rcode{?untreated1\_chr4} in the \Rpackage{pasillaBamSubset} package for more information about those reads): <>= library(pasillaBamSubset) untreated1_chr4() @ We use the \Rfunction{readGAlignments} function defined in the \Rpackage{GenomicAlignments} package to load the reads into a \Rclass{GAlignments} object. It's probably a good idea to get rid of the PCR or optical duplicates (flag bit 0x400 in the SAM format, see the SAM Spec \footnote{\url{http://samtools.sourceforge.net/}} for the details), as well as reads not passing quality controls (flag bit 0x200 in the SAM format). We do this by creating a \Rclass{ScanBamParam} object that we pass to \Rcode{readGAlignments} (see \Rcode{?ScanBamParam} in the \Rpackage{Rsamtools} package for the details). Note that we also use \Rcode{use.names=TRUE} in order to load the {\it query names} (aka {\it query template names}, see QNAME field in the SAM Spec) from the BAM file (\Rcode{readGAlignments} will use them to set the names of the returned object): <>= library(GenomicAlignments) flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) U1.GAL <- readGAlignments(untreated1_chr4(), use.names=TRUE, param=param0) head(U1.GAL) @ Because the aligner used to align those reads can report more than 1 alignment per {\it original query} (i.e. per read stored in the input file, typically a FASTQ file), we shouldn't expect the names of \Rcode{U1.GAL} to be unique: <>= U1.GAL_names_is_dup <- duplicated(names(U1.GAL)) table(U1.GAL_names_is_dup) @ Storing the {\it query names} in a factor will be useful as we will see later in this document: <>= U1.uqnames <- unique(names(U1.GAL)) U1.GAL_qnames <- factor(names(U1.GAL), levels=U1.uqnames) @ Note that we explicitely provide the levels of the factor to enforce their order. Otherwise \Rcode{factor()} would put them in lexicographic order which is not advisable because it depends on the locale in use. Another object that will be useful to keep near at hand is the mapping between each {\it query name} and its first occurence in \Rcode{U1.GAL\_qnames}: <>= U1.GAL_dup2unq <- match(U1.GAL_qnames, U1.GAL_qnames) @ Our reads can have up to 2 {\it skipped regions} (a {\it skipped region} corresponds to an N operation in the CIGAR): <>= head(unique(cigar(U1.GAL))) table(njunc(U1.GAL)) @ Also, the following table indicates that indels were not allowed/supported during the alignment process (no I or D CIGAR operations): <>= colSums(cigarOpTable(cigar(U1.GAL))) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load paired-end reads from a BAM file} BAM file {\tt untreated3\_chr4.bam} (located in the \Rpackage{pasillaBamSubset} data package) contains paired-end reads from the ``Pasilla'' experiment and aligned against the dm3 genome (see \Rcode{?untreated3\_chr4} in the \Rpackage{pasillaBamSubset} package for more information about those reads). We use the \Rfunction{readGAlignmentPairs} function to load them into a \Rclass{GAlignmentPairs} object: <>= U3.galp <- readGAlignmentPairs(untreated3_chr4(), use.names=TRUE, param=param0) head(U3.galp) @ The \Rcode{show} method for \Rclass{GAlignmentPairs} objects displays two {\tt ranges} columns, one for the {\it first} alignment in the pair (the left column), and one for the {\it last} alignment in the pair (the right column). The {\tt strand} column corresponds to the strand of the {\it first} alignment. <>= head(first(U3.galp)) head(last(U3.galp)) @ According to the SAM format specifications, the aligner is expected to mark each alignment pair as {\it proper} or not (flag bit 0x2 in the SAM format). The SAM Spec only says that a pair is {\it proper} if the {\it first} and {\it last} alignments in the pair are ``properly aligned according to the aligner''. So the exact criteria used for setting this flag is left to the aligner. We use \Rcode{isProperPair} to extract this flag from the \Rclass{GAlignmentPairs} object: <>= table(isProperPair(U3.galp)) @ Even though we could do {\it overlap encodings} with the full object, we keep only the {\it proper} pairs for our downstream analysis: <>= U3.GALP <- U3.galp[isProperPair(U3.galp)] @ Because the aligner used to align those reads can report more than 1 alignment per {\it original query template} (i.e. per pair of sequences stored in the input files, typically 1 FASTQ file for the {\it first} ends and 1 FASTQ file for the {\it last} ends), we shouldn't expect the names of \Rcode{U3.GALP} to be unique: <>= U3.GALP_names_is_dup <- duplicated(names(U3.GALP)) table(U3.GALP_names_is_dup) @ Storing the {\it query template names} in a factor will be useful: <>= U3.uqnames <- unique(names(U3.GALP)) U3.GALP_qnames <- factor(names(U3.GALP), levels=U3.uqnames) @ as well as having the mapping between each {\it query template name} and its first occurence in \Rcode{U3.GALP\_qnames}: <>= U3.GALP_dup2unq <- match(U3.GALP_qnames, U3.GALP_qnames) @ Our reads can have up to 1 {\it skipped region} per end: <>= head(unique(cigar(first(U3.GALP)))) head(unique(cigar(last(U3.GALP)))) table(njunc(first(U3.GALP)), njunc(last(U3.GALP))) @ Like for our single-end reads, the following tables indicate that indels were not allowed/supported during the alignment process: <>= colSums(cigarOpTable(cigar(first(U3.GALP)))) colSums(cigarOpTable(cigar(last(U3.GALP)))) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Find all the overlaps between the reads and transcripts} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load the transcripts from a \Rclass{TxDb} object} In order to compute overlaps between reads and transcripts, we need access to the genomic positions of a set of known transcripts and their exons. It is essential that the reference genome of this set of transcripts and exons be {\bf exactly} the same as the reference genome used to align the reads. We could use the \Rfunction{makeTxDbFromUCSC} function defined in the \Rpackage{GenomicFeatures} package to make a \Rclass{TxDb} object containing the dm3 transcripts and their exons retrieved from the UCSC Genome Browser\footnote{\url{http://genome.ucsc.edu/cgi-bin/hgGateway}}. The Bioconductor project however provides a few annotation packages containing \Rclass{TxDb} objects for the most commonly studied organisms (those data packages are sometimes called the {\it TxDb} packages). One of them is the \Rpackage{TxDb.Dmelanogaster.\-UCSC.\-dm3.ensGene} package. It contains a \Rclass{TxDb} object that was made by pointing the \Rfunction{makeTxDbFromUCSC} function to the dm3 genome and {\it Ensembl Genes} track \footnote{See \url{http://genome.ucsc.edu/cgi-bin/hgTrackUi?hgsid=276880911&g=ensGene} for a description of this track.}. We can use it here: <>= library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) TxDb.Dmelanogaster.UCSC.dm3.ensGene txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene @ We extract the exons grouped by transcript in a \Rclass{GRangesList} object: <>= exbytx <- exonsBy(txdb, by="tx", use.names=TRUE) length(exbytx) # nb of transcripts @ <>= .checkIdenticalToPrecomputed(exbytx, "exbytx", ignore.metadata=TRUE) @ We check that all the exons in any given transcript belong to the same chromosome and strand. Knowing that our set of transcripts is free of this sort of trans-splicing events typically allows some significant simplifications during the downstream analysis \footnote{Dealing with trans-splicing events is not covered in this document.}. A quick and easy way to check this is to take advantage of the fact that \Rcode{seqnames} and \Rcode{strand} return \Rclass{RleList} objects. So we can extract the number of Rle runs for each transcript and make sure it's always 1: <>= table(elementNROWS(runLength(seqnames(exbytx)))) table(elementNROWS(runLength(strand(exbytx)))) @ Therefore the strand of any given transcript is unambiguously defined and can be extracted with: <>= exbytx_strand <- unlist(runValue(strand(exbytx)), use.names=FALSE) @ We will also need the mapping between the transcripts and their gene. We start by using \Rfunction{transcripts} to extract this information from our \Rclass{TxDb} object \Rcode{txdb}, and then we construct a named factor that represents the mapping: <>= tx <- transcripts(txdb, columns=c("tx_name", "gene_id")) head(tx) df <- mcols(tx) exbytx2gene <- as.character(df$gene_id) exbytx2gene <- factor(exbytx2gene, levels=unique(exbytx2gene)) names(exbytx2gene) <- df$tx_name exbytx2gene <- exbytx2gene[names(exbytx)] head(exbytx2gene) nlevels(exbytx2gene) # nb of genes @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Single-end overlaps} \subsubsection{Find the single-end overlaps} We are ready to compute the overlaps with the \Rfunction{findOverlaps} function. Note that the strand of the queries produced by the RNA-seq experiment is typically unknown so we use \Rcode{ignore.strand=TRUE}: <>= U1.OV00 <- findOverlaps(U1.GAL, exbytx, ignore.strand=TRUE) @ \Rcode{U1.OV00} is a \Rclass{Hits} object that contains 1 element per overlap. Its length gives the number of overlaps: <>= length(U1.OV00) @ \subsubsection{Tabulate the single-end overlaps} We will repeatedly use the 2 following little helper functions to ``tabulate'' the overlaps in a given \Rclass{Hits} object (e.g. \Rcode{U1.OV00}), i.e. to count the number of overlaps for each element in the query or for each element in the subject: Number of transcripts for each alignment in \Rcode{U1.GAL}: <>= U1.GAL_ntx <- countQueryHits(U1.OV00) mcols(U1.GAL)$ntx <- U1.GAL_ntx head(U1.GAL) table(U1.GAL_ntx) mean(U1.GAL_ntx >= 1) @ 76\% of the alignments in \Rcode{U1.GAL} have an overlap with at least 1 transcript in \Rcode{exbytx}. Note that \Rfunction{countOverlaps} can be used directly on \Rcode{U1.GAL} and \Rcode{exbytx} for computing \Rcode{U1.GAL\_ntx}: <>= U1.GAL_ntx_again <- countOverlaps(U1.GAL, exbytx, ignore.strand=TRUE) stopifnot(identical(unname(U1.GAL_ntx_again), U1.GAL_ntx)) @ Because \Rcode{U1.GAL} can (and actually does) contain more than 1 alignment per {\it original query} (aka read), we also count the number of transcripts for each read: <>= U1.OV10 <- remapHits(U1.OV00, Lnodes.remapping=U1.GAL_qnames) U1.uqnames_ntx <- countQueryHits(U1.OV10) names(U1.uqnames_ntx) <- U1.uqnames table(U1.uqnames_ntx) mean(U1.uqnames_ntx >= 1) @ 78.4\% of the reads have an overlap with at least 1 transcript in \Rcode{exbytx}. Number of reads for each transcript: <>= U1.exbytx_nOV10 <- countSubjectHits(U1.OV10) names(U1.exbytx_nOV10) <- names(exbytx) mean(U1.exbytx_nOV10 >= 50) @ Only 0.869\% of the transcripts in \Rcode{exbytx} have an overlap with at least 50 reads. Top 10 transcripts: <>= head(sort(U1.exbytx_nOV10, decreasing=TRUE), n=10) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Paired-end overlaps} \subsubsection{Find the paired-end overlaps} Like with our single-end overlaps, we call \Rfunction{findOverlaps} with \Rcode{ignore.strand=TRUE}: <>= U3.OV00 <- findOverlaps(U3.GALP, exbytx, ignore.strand=TRUE) @ Like \Rcode{U1.OV00}, \Rcode{U3.OV00} is a \Rclass{Hits} object. Its length gives the number of paired-end overlaps: <>= length(U3.OV00) @ \subsubsection{Tabulate the paired-end overlaps} Number of transcripts for each alignment pair in \Rcode{U3.GALP}: <>= U3.GALP_ntx <- countQueryHits(U3.OV00) mcols(U3.GALP)$ntx <- U3.GALP_ntx head(U3.GALP) table(U3.GALP_ntx) mean(U3.GALP_ntx >= 1) @ 71\% of the alignment pairs in \Rcode{U3.GALP} have an overlap with at least 1 transcript in \Rcode{exbytx}. Note that \Rfunction{countOverlaps} can be used directly on \Rcode{U3.GALP} and \Rcode{exbytx} for computing \Rcode{U3.GALP\_ntx}: <>= U3.GALP_ntx_again <- countOverlaps(U3.GALP, exbytx, ignore.strand=TRUE) stopifnot(identical(unname(U3.GALP_ntx_again), U3.GALP_ntx)) @ Because \Rcode{U3.GALP} can (and actually does) contain more than 1 alignment pair per {\it original query template}, we also count the number of transcripts for each template: <>= U3.OV10 <- remapHits(U3.OV00, Lnodes.remapping=U3.GALP_qnames) U3.uqnames_ntx <- countQueryHits(U3.OV10) names(U3.uqnames_ntx) <- U3.uqnames table(U3.uqnames_ntx) mean(U3.uqnames_ntx >= 1) @ 72.3\% of the templates have an overlap with at least 1 transcript in \Rcode{exbytx}. Number of templates for each transcript: <>= U3.exbytx_nOV10 <- countSubjectHits(U3.OV10) names(U3.exbytx_nOV10) <- names(exbytx) mean(U3.exbytx_nOV10 >= 50) @ Only 0.756\% of the transcripts in \Rcode{exbytx} have an overlap with at least 50 templates. Top 10 transcripts: <>= head(sort(U3.exbytx_nOV10, decreasing=TRUE), n=10) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Encode the overlaps between the reads and transcripts} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Single-end encodings} The {\it overlap encodings} are strand sensitive so we will compute them twice, once for the ``original alignments'' (i.e. the alignments of the {\it original queries}), and once again for the ``flipped alignments'' (i.e. the alignments of the ``flipped {\it original queries}''). We extract the ranges of the ``original'' and ``flipped'' alignments in 2 \Rclass{GRangesList} objects with: <>= U1.grl <- grglist(U1.GAL, order.as.in.query=TRUE) U1.grlf <- flipQuery(U1.grl) # flipped @ and encode their overlaps with the transcripts: <>= U1.ovencA <- encodeOverlaps(U1.grl, exbytx, hits=U1.OV00) U1.ovencB <- encodeOverlaps(U1.grlf, exbytx, hits=U1.OV00) @ \Rcode{U1.ovencA} and \Rcode{U1.ovencB} are 2 \Rclass{OverlapsEncodings} objects of the same length as \Rclass{Hits} object \Rcode{U1.OV00}. For each hit in \Rcode{U1.OV00}, we have 2 corresponding encodings, one in \Rcode{U1.ovencA} and one in \Rcode{U1.ovencB}, but only one of them encodes a hit between alignment ranges and exon ranges that are on the same strand. We use the \Rfunction{selectEncodingWithCompatibleStrand} function to merge them into a single \Rclass{OverlapsEncodings} of the same length. For each hit in \Rcode{U1.OV00}, this selects the encoding corresponding to alignment ranges and exon ranges with compatible strand: <>= U1.grl_strand <- unlist(runValue(strand(U1.grl)), use.names=FALSE) U1.ovenc <- selectEncodingWithCompatibleStrand(U1.ovencA, U1.ovencB, U1.grl_strand, exbytx_strand, hits=U1.OV00) U1.ovenc @ As a convenience, the 2 above calls to \Rfunction{encodeOverlaps} + merging step can be replaced by a single call to \Rfunction{encodeOverlaps} on \Rcode{U1.grl} (or \Rcode{U1.grlf}) with \Rcode{flip.query.if.wrong.strand=TRUE}: <>= U1.ovenc_again <- encodeOverlaps(U1.grl, exbytx, hits=U1.OV00, flip.query.if.wrong.strand=TRUE) stopifnot(identical(U1.ovenc_again, U1.ovenc)) @ Unique encodings in \Rcode{U1.ovenc}: <>= U1.unique_encodings <- levels(U1.ovenc) length(U1.unique_encodings) head(U1.unique_encodings) U1.ovenc_table <- table(encoding(U1.ovenc)) tail(sort(U1.ovenc_table)) @ Encodings are sort of cryptic but utilities are provided to extract specific meaning from them. Use of these utilities is covered later in this document. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Paired-end encodings} Let's encode the overlaps in \Rcode{U3.OV00}: <>= U3.grl <- grglist(U3.GALP) U3.ovenc <- encodeOverlaps(U3.grl, exbytx, hits=U3.OV00, flip.query.if.wrong.strand=TRUE) U3.ovenc @ Unique encodings in \Rcode{U3.ovenc}: <>= U3.unique_encodings <- levels(U3.ovenc) length(U3.unique_encodings) head(U3.unique_encodings) U3.ovenc_table <- table(encoding(U3.ovenc)) tail(sort(U3.ovenc_table)) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Detect ``splice compatible'' overlaps} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% We are interested in a particular type of overlap where the read overlaps the transcript in a ``splice compatible'' way, that is, in a way that is compatible with the splicing of the transcript. The \Rfunction{isCompatibleWithSplicing} function can be used on an \Rclass{OverlapEncodings} object to detect this type of overlap. Note that \Rfunction{isCompatibleWithSplicing} can also be used on a character vector or factor. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``splice compatible'' single-end overlaps} \subsubsection{``Splice compatible'' single-end encodings} \Rcode{U1.ovenc} contains 7 unique encodings compatible with the splicing of the transcript: <>= sort(U1.ovenc_table[isCompatibleWithSplicing(U1.unique_encodings)]) @ Encodings \Rcode{"1:i:"} (455176 occurences in \Rcode{U1.ovenc}), \Rcode{"2:jm:af:"} (72929 occurences in \Rcode{U1.ovenc}), and \Rcode{"3:jmm:agm:aaf:"} (488 occurences in \Rcode{U1.ovenc}), correspond to the following overlaps: \begin{itemize} \item \Rcode{"1:i:"} \begin{verbatim} - read (no skipped region): oooooooo - transcript: ... >>>>>>>>>>>>>> ... \end{verbatim} \item \Rcode{"2:jm:af:"} \begin{verbatim} - read (1 skipped region): ooooo---ooo - transcript: ... >>>>>>>>> >>>>>>>>> ... \end{verbatim} \item \Rcode{"3:jmm:agm:aaf:"} \begin{verbatim} - read (2 skipped regions): oo---ooooo---o - transcript: ... >>>>>>>> >>>>> >>>>>>> ... \end{verbatim} \end{itemize} For clarity, only the exons involved in the overlap are represented. The transcript can of course have more upstream and downstream exons, which is denoted by the ... on the left side (5' end) and right side (3' end) of each drawing. Note that the exons represented in the 2nd and 3rd drawings are consecutive and adjacent in the processed transcript. Encodings \Rcode{"1:f:"} and \Rcode{"1:j:"} are variations of the situation described by encoding \Rcode{"1:i:"}. For \Rcode{"1:f:"}, the first aligned base of the read (or ``flipped'' read) is aligned with the first base of the exon. For \Rcode{"1:j:"}, the last aligned base of the read (or ``flipped'' read) is aligned with the last base of the exon: \begin{itemize} \item \Rcode{"1:f:"} \begin{verbatim} - read (no skipped region): oooooooo - transcript: ... >>>>>>>>>>>>>> ... \end{verbatim} \item \Rcode{"1:j:"} \begin{verbatim} - read (no skipped region): oooooooo - transcript: ... >>>>>>>>>>>>>> ... \end{verbatim} \end{itemize} <>= U1.OV00_is_comp <- isCompatibleWithSplicing(U1.ovenc) table(U1.OV00_is_comp) # 531797 "splice compatible" overlaps @ Finally, let's extract the ``splice compatible'' overlaps from \Rcode{U1.OV00}: <>= U1.compOV00 <- U1.OV00[U1.OV00_is_comp] @ Note that high-level convenience wrapper \Rfunction{findCompatibleOverlaps} can be used for computing the ``splice compatible'' overlaps directly between a \Rclass{GAlignments} object (containing reads) and a \Rclass{GRangesList} object (containing transcripts): <>= U1.compOV00_again <- findCompatibleOverlaps(U1.GAL, exbytx) stopifnot(identical(U1.compOV00_again, U1.compOV00)) @ \subsubsection{Tabulate the ``splice compatible'' single-end overlaps} Number of ``splice compatible'' transcripts for each alignment in \Rcode{U1.GAL}: <>= U1.GAL_ncomptx <- countQueryHits(U1.compOV00) mcols(U1.GAL)$ncomptx <- U1.GAL_ncomptx head(U1.GAL) table(U1.GAL_ncomptx) mean(U1.GAL_ncomptx >= 1) @ 75\% of the alignments in \Rcode{U1.GAL} are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Note that high-level convenience wrapper \Rfunction{countCompatibleOverlaps} can be used directly on \Rcode{U1.GAL} and \Rcode{exbytx} for computing \Rcode{U1.GAL\_ncomptx}: <>= U1.GAL_ncomptx_again <- countCompatibleOverlaps(U1.GAL, exbytx) stopifnot(identical(U1.GAL_ncomptx_again, U1.GAL_ncomptx)) @ Number of ``splice compatible'' transcripts for each read: <>= U1.compOV10 <- remapHits(U1.compOV00, Lnodes.remapping=U1.GAL_qnames) U1.uqnames_ncomptx <- countQueryHits(U1.compOV10) names(U1.uqnames_ncomptx) <- U1.uqnames table(U1.uqnames_ncomptx) mean(U1.uqnames_ncomptx >= 1) @ 77.5\% of the reads are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``splice compatible'' reads for each transcript: <>= U1.exbytx_ncompOV10 <- countSubjectHits(U1.compOV10) names(U1.exbytx_ncompOV10) <- names(exbytx) mean(U1.exbytx_ncompOV10 >= 50) @ Only 0.87\% of the transcripts in \Rcode{exbytx} are ``splice compatible'' with at least 50 reads. Top 10 transcripts: <>= head(sort(U1.exbytx_ncompOV10, decreasing=TRUE), n=10) @ Note that this ``top 10'' is slightly different from the ``top 10'' we obtained earlier when we counted {\bf all} the overlaps. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``splice compatible'' paired-end overlaps} \subsubsection{``Splice compatible'' paired-end encodings} WARNING: For paired-end encodings, \Rcode{isCompatibleWithSplicing} considers that the encoding is ``splice compatible'' if its 2 halves are ``splice compatible''. This can produce false positives if for example the right end of the alignment is located upstream of the left end in transcript space. The paired-end read could not come from this transcript. To eliminate these false positives, one would need to look at the position of the left and right ends in transcript space. This can be done with \Rcode{extractQueryStartInTranscript}. \Rcode{U3.ovenc} contains 13 unique paired-end encodings compatible with the splicing of the transcript: <>= sort(U3.ovenc_table[isCompatibleWithSplicing(U3.unique_encodings)]) @ Paired-end encodings \Rcode{"1{-}{-}1:i{-}{-}i:"} (100084 occurences in \Rcode{U3.ovenc}), \Rcode{"2{-}{-}1:jm{-}{-}m:af{-}{-}i:"} (2700 occurences in \Rcode{U3.ovenc}), \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}af:"} (2480 occurences in \Rcode{U3.ovenc}), \Rcode{"1{-}{-}1:i{-}{-}m:a{-}{-}i:"} (287 occurences in \Rcode{U3.ovenc}), and \Rcode{"2{-}{-}2:jm{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} (153 occurences in \Rcode{U3.ovenc}), correspond to the following paired-end overlaps: \begin{itemize} \item \Rcode{"1{-}{-}1:i{-}{-}i:"} \begin{verbatim} - paired-end read (no skipped region on the first end, no skipped region on the last end): oooo oooo - transcript: ... >>>>>>>>>>>>>>>> ... \end{verbatim} \item \Rcode{"2{-}{-}1:jm{-}{-}m:af{-}{-}i:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, no skipped region on the last end): ooo---o oooo - transcript: ... >>>>>>>> >>>>>>>>>>> ... \end{verbatim} \item \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}af:"} \begin{verbatim} - paired-end read (no skipped region on the first end, 1 skipped region on the last end): oooo oo---oo - transcript: ... >>>>>>>>>>>>>> >>>>>>>>> ... \end{verbatim} \item \Rcode{"1{-}{-}1:i{-}{-}m:a{-}{-}i:"} \begin{verbatim} - paired-end read (no skipped region on the first end, no skipped region on the last end): oooo oooo - transcript: ... >>>>>>>>> >>>>>>> ... \end{verbatim} \item \Rcode{"2{-}{-}2:jm{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, 1 skipped region on the last end): ooo---o oo---oo - transcript: ... >>>>>> >>>>>>> >>>>> ... \end{verbatim} \end{itemize} Note: switch use of ``first'' and ``last'' above if the read was ``flipped''. <>= U3.OV00_is_comp <- isCompatibleWithSplicing(U3.ovenc) table(U3.OV00_is_comp) # 106835 "splice compatible" paired-end overlaps @ Finally, let's extract the ``splice compatible'' paired-end overlaps from \Rcode{U3.OV00}: <>= U3.compOV00 <- U3.OV00[U3.OV00_is_comp] @ Note that, like with our single-end reads, high-level convenience wrapper \Rfunction{findCompatibleOverlaps} can be used for computing the ``splice compatible'' paired-end overlaps directly between a \Rclass{GAlignmentPairs} object (containing paired-end reads) and a \Rclass{GRangesList} object (containing transcripts): <>= U3.compOV00_again <- findCompatibleOverlaps(U3.GALP, exbytx) stopifnot(identical(U3.compOV00_again, U3.compOV00)) @ \subsubsection{Tabulate the ``splice compatible'' paired-end overlaps} Number of ``splice compatible'' transcripts for each alignment pair in \Rcode{U3.GALP}: <>= U3.GALP_ncomptx <- countQueryHits(U3.compOV00) mcols(U3.GALP)$ncomptx <- U3.GALP_ncomptx head(U3.GALP) table(U3.GALP_ncomptx) mean(U3.GALP_ncomptx >= 1) @ 69.7\% of the alignment pairs in \Rcode{U3.GALP} are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Note that high-level convenience wrapper \Rfunction{countCompatibleOverlaps} can be used directly on \Rcode{U3.GALP} and \Rcode{exbytx} for computing \Rcode{U3.GALP\_ncomptx}: <>= U3.GALP_ncomptx_again <- countCompatibleOverlaps(U3.GALP, exbytx) stopifnot(identical(U3.GALP_ncomptx_again, U3.GALP_ncomptx)) @ Number of ``splice compatible'' transcripts for each template: <>= U3.compOV10 <- remapHits(U3.compOV00, Lnodes.remapping=U3.GALP_qnames) U3.uqnames_ncomptx <- countQueryHits(U3.compOV10) names(U3.uqnames_ncomptx) <- U3.uqnames table(U3.uqnames_ncomptx) mean(U3.uqnames_ncomptx >= 1) @ 70.7\% of the templates are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``splice compatible'' templates for each transcript: <>= U3.exbytx_ncompOV10 <- countSubjectHits(U3.compOV10) names(U3.exbytx_ncompOV10) <- names(exbytx) mean(U3.exbytx_ncompOV10 >= 50) @ Only 0.7\% of the transcripts in \Rcode{exbytx} are ``splice compatible'' with at least 50 templates. Top 10 transcripts: <>= head(sort(U3.exbytx_ncompOV10, decreasing=TRUE), n=10) @ Note that this ``top 10'' is slightly different from the ``top 10'' we obtained earlier when we counted {\bf all} the paired-end overlaps. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Compute the {\it reference query sequences} and project them on the transcriptome} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Compute the {\it reference query sequences}} The {\it reference query sequences} are the query sequences {\bf after} alignment, by opposition to the {\it original query sequences} (aka ``true'' or ``real'' query sequences) which are the query sequences {\bf before} alignment. The {\it reference query sequences} can easily be computed by extracting the nucleotides mapped to each read from the reference genome. This of course requires that we have access to the reference genome used by the aligner. In Bioconductor, the full genome sequence for the dm3 assembly is stored in the \Rpackage{BSgenome.Dmelanogaster.UCSC.dm3} data package \footnote{See \url{http://bioconductor.org/packages/release/data/annotation/} for the full list of annotation packages available in the current release of Bioconductor.}: <>= library(BSgenome.Dmelanogaster.UCSC.dm3) Dmelanogaster @ To extract the portions of the reference genome corresponding to the ranges in \Rcode{U1.grl}, we can use the \Rfunction{extractTranscriptSeqs} function defined in the \Rpackage{GenomicFeatures} package: <>= library(GenomicFeatures) U1.GAL_rqseq <- extractTranscriptSeqs(Dmelanogaster, U1.grl) head(U1.GAL_rqseq) @ When reads are paired-end, we need to extract separately the ranges corresponding to their {\it first} ends (aka {\it first} segments in BAM jargon) and those corresponding to their {\it last} ends (aka {\it last} segments in BAM jargon): <>= U3.grl_first <- grglist(first(U3.GALP, real.strand=TRUE), order.as.in.query=TRUE) U3.grl_last <- grglist(last(U3.GALP, real.strand=TRUE), order.as.in.query=TRUE) @ Then we extract the portions of the reference genome corresponding to the ranges in \Rclass{GRangesList} objects \Rcode{U3.grl\_first} and \Rcode{U3.grl\_last}: <>= U3.GALP_rqseq1 <- extractTranscriptSeqs(Dmelanogaster, U3.grl_first) U3.GALP_rqseq2 <- extractTranscriptSeqs(Dmelanogaster, U3.grl_last) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Project the single-end alignments on the transcriptome} The \Rfunction{extractQueryStartInTranscript} function computes for each overlap the position of the {\it query start} in the transcript: <>= U1.OV00_qstart <- extractQueryStartInTranscript(U1.grl, exbytx, hits=U1.OV00, ovenc=U1.ovenc) head(subset(U1.OV00_qstart, U1.OV00_is_comp)) @ \Rcode{U1.OV00\_qstart} is a data frame with 1 row per overlap and 3 columns: \begin{enumerate} \item \Rcode{startInTranscript}: the 1-based start position of the read with respect to the transcript. Position 1 always corresponds to the first base on the 5' end of the transcript sequence. \item \Rcode{firstSpannedExonRank}: the rank of the first exon spanned by the read, that is, the rank of the exon found at position \Rcode{startInTranscript} in the transcript. \item \Rcode{startInFirstSpannedExon}: the 1-based start position of the read with respect to the first exon spanned by the read. \end{enumerate} Having this information allows us for example to compare the read and transcript nucleotide sequences for each ``splice compatible'' overlap. If we use the {\it reference query sequence} instead of the {\it original query sequence} for this comparison, then it should match {\bf exactly} the sequence found at the {\it query start} in the transcript. Let's start by using \Rfunction{extractTranscriptSeqs} again to extract the transcript sequences (aka transcriptome) from the dm3 reference genome: <>= txseq <- extractTranscriptSeqs(Dmelanogaster, exbytx) @ For each ``splice compatible'' overlap, the read sequence in \Rcode{U1.GAL\_rqseq} must be an {\it exact} substring of the transcript sequence in \Rcode{exbytx\_seq}: <>= U1.OV00_rqseq <- U1.GAL_rqseq[queryHits(U1.OV00)] U1.OV00_rqseq[flippedQuery(U1.ovenc)] <- reverseComplement(U1.OV00_rqseq[flippedQuery(U1.ovenc)]) U1.OV00_txseq <- txseq[subjectHits(U1.OV00)] stopifnot(all( U1.OV00_rqseq[U1.OV00_is_comp] == narrow(U1.OV00_txseq[U1.OV00_is_comp], start=U1.OV00_qstart$startInTranscript[U1.OV00_is_comp], width=width(U1.OV00_rqseq)[U1.OV00_is_comp]) )) @ Because of this relationship between the {\it reference query sequence} and the transcript sequence of a ``splice compatible'' overlap, and because of the relationship between the {\it original query sequences} and the {\it reference query sequences}, then the edit distance reported in the NM tag is actually the edit distance between the {\it original query} and the transcript of a ``splice compatible'' overlap. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Project the paired-end alignments on the transcriptome} For a paired-end read, the {\it query start} is the start of its ``left end''. <>= U3.OV00_Lqstart <- extractQueryStartInTranscript(U3.grl, exbytx, hits=U3.OV00, ovenc=U3.ovenc) head(subset(U3.OV00_Lqstart, U3.OV00_is_comp)) @ Note that \Rfunction{extractQueryStartInTranscript} can be called with \Rcode{for.query.right.end=TRUE} if we want this information for the ``right ends'' of the reads: <>= U3.OV00_Rqstart <- extractQueryStartInTranscript(U3.grl, exbytx, hits=U3.OV00, ovenc=U3.ovenc, for.query.right.end=TRUE) head(subset(U3.OV00_Rqstart, U3.OV00_is_comp)) @ Like with single-end reads, having this information allows us for example to compare the read and transcript nucleotide sequences for each ``splice compatible'' overlap. If we use the {\it reference query sequence} instead of the {\it original query sequence} for this comparison, then it should match {\bf exactly} the sequences of the ``left'' and ``right'' ends of the read in the transcript. Let's assign the ``left and right reference query sequences'' to each overlap: <>= U3.OV00_Lrqseq <- U3.GALP_rqseq1[queryHits(U3.OV00)] U3.OV00_Rrqseq <- U3.GALP_rqseq2[queryHits(U3.OV00)] @ For the single-end reads, the sequence associated with a ``flipped query'' just needed to be ``reverse complemented''. For paired-end reads, we also need to swap the 2 sequences in the pair: <>= flip_idx <- which(flippedQuery(U3.ovenc)) tmp <- U3.OV00_Lrqseq[flip_idx] U3.OV00_Lrqseq[flip_idx] <- reverseComplement(U3.OV00_Rrqseq[flip_idx]) U3.OV00_Rrqseq[flip_idx] <- reverseComplement(tmp) @ Let's assign the transcript sequence to each overlap: <>= U3.OV00_txseq <- txseq[subjectHits(U3.OV00)] @ For each ``splice compatible'' overlap, we expect the ``left and right reference query sequences'' of the read to be {\it exact} substrings of the transcript sequence. Let's check the ``left reference query sequences'': <>= stopifnot(all( U3.OV00_Lrqseq[U3.OV00_is_comp] == narrow(U3.OV00_txseq[U3.OV00_is_comp], start=U3.OV00_Lqstart$startInTranscript[U3.OV00_is_comp], width=width(U3.OV00_Lrqseq)[U3.OV00_is_comp]) )) @ and the ``right reference query sequences'': <>= stopifnot(all( U3.OV00_Rrqseq[U3.OV00_is_comp] == narrow(U3.OV00_txseq[U3.OV00_is_comp], start=U3.OV00_Rqstart$startInTranscript[U3.OV00_is_comp], width=width(U3.OV00_Rrqseq)[U3.OV00_is_comp]) )) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Align the reads to the transcriptome} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Aligning the reads to the reference genome is not the most efficient nor accurate way to count the number of ``splice compatible'' overlaps per {\it original query}. Supporting junction reads (i.e. reads that align with at least 1 skipped region in their CIGAR) introduces a significant computational cost during the alignment process. Then, as we've seen in the previous sections, each alignment produced by the aligner needs to be broken into a set of ranges (based on its CIGAR) and those ranges compared to the ranges of the exons grouped by transcript. A more straightforward and accurate approach is to align the reads directly to the transcriptome, and without allowing the typical skipped region that the aligner needs to introduce when aligning a junction read to the reference genome. With this approach, a ``hit'' between a read and a transcript is necessarily compatible with the splicing of the transcript. In case of a ``hit'', we'll say that the read and the transcript are ``string-based compatible'' (to differentiate from our previous notion of ``splice compatible'' overlaps that we will call ``encoding-based compatible'' in this section). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Align the single-end reads to the transcriptome} \subsubsection{Find the ``hits''} The single-end reads are in \Rcode{U1.oqseq}, the transcriptome is in \Rcode{exbytx\_seq}. Since indels were not allowed/supported during the alignment of the reads to the reference genome, we don't need to allow/support them either for aligning the reads to the transcriptome. Also since our goal is to find (and count) ``splice compatible'' overlaps between reads and transcripts, we don't need to keep track of the details of the alignments between the reads and the transcripts. Finally, since BAM file {\tt untreated1\_chr4.bam} is not the full output of the aligner but the subset obtained by keeping only the alignments located on chr4, we don't need to align \Rcode{U1.oqseq} to the full transcriptome, but only to the subset of \Rcode{exbytx\_seq} made of the transcripts located on chr4. With those simplifications in mind, we write the following function that we will use to find the ``hits'' between the reads and the transcriptome: <>= ### A wrapper to vwhichPDict() that supports IUPAC ambiguity codes in 'qseq' ### and 'txseq', and treats them as such. findSequenceHits <- function(qseq, txseq, which.txseq=NULL, max.mismatch=0) { .asHits <- function(x, pattern_length) { query_hits <- unlist(x) if (is.null(query_hits)) query_hits <- integer(0) subject_hits <- rep.int(seq_len(length(x)), elementNROWS(x)) Hits(query_hits, subject_hits, pattern_length, length(x), sort.by.query=TRUE) } .isHitInTranscriptBounds <- function(hits, qseq, txseq) { sapply(seq_len(length(hits)), function(i) { pattern <- qseq[[queryHits(hits)[i]]] subject <- txseq[[subjectHits(hits)[i]]] v <- matchPattern(pattern, subject, max.mismatch=max.mismatch, fixed=FALSE) any(1L <= start(v) & end(v) <= length(subject)) }) } if (!is.null(which.txseq)) { txseq0 <- txseq txseq <- txseq[which.txseq] } names(qseq) <- NULL other <- alphabetFrequency(qseq, baseOnly=TRUE)[ , "other"] is_clean <- other == 0L # "clean" means "no IUPAC ambiguity code" ## Find hits for "clean" original queries. qseq0 <- qseq[is_clean] pdict0 <- PDict(qseq0, max.mismatch=max.mismatch) m0 <- vwhichPDict(pdict0, txseq, max.mismatch=max.mismatch, fixed="pattern") hits0 <- .asHits(m0, length(qseq0)) hits0@nLnode <- length(qseq) hits0@from <- which(is_clean)[hits0@from] ## Find hits for non "clean" original queries. qseq1 <- qseq[!is_clean] m1 <- vwhichPDict(qseq1, txseq, max.mismatch=max.mismatch, fixed=FALSE) hits1 <- .asHits(m1, length(qseq1)) hits1@nLnode <- length(qseq) hits1@from <- which(!is_clean)[hits1@from] ## Combine the hits. query_hits <- c(queryHits(hits0), queryHits(hits1)) subject_hits <- c(subjectHits(hits0), subjectHits(hits1)) if (!is.null(which.txseq)) { ## Remap the hits. txseq <- txseq0 subject_hits <- which.txseq[subject_hits] hits0@nRnode <- length(txseq) } ## Order the hits. oo <- orderIntegerPairs(query_hits, subject_hits) hits0@from <- query_hits[oo] hits0@to <- subject_hits[oo] if (max.mismatch != 0L) { ## Keep only "in bounds" hits. is_in_bounds <- .isHitInTranscriptBounds(hits0, qseq, txseq) hits0 <- hits0[is_in_bounds] } hits0 } @ Let's compute the index of the transcripts in \Rcode{exbytx\_seq} located on chr4 (\Rfunction{findSequenceHits} will restrict the search to those transcripts): <>= chr4tx <- transcripts(txdb, vals=list(tx_chrom="chr4")) chr4txnames <- mcols(chr4tx)$tx_name which.txseq <- match(chr4txnames, names(txseq)) @ We know that the aligner tolerated up to 6 mismatches per read. The 3 following commands find the ``hits'' for each {\it original query}, then find the ``hits'' for each ``flipped {\it original query}'', and finally merge all the ``hits'' (note that the 3 commands take about 1 hour to complete on a modern laptop): <>= U1.sbcompHITSa <- findSequenceHits(U1.oqseq, txseq, which.txseq=which.txseq, max.mismatch=6) U1.sbcompHITSb <- findSequenceHits(reverseComplement(U1.oqseq), txseq, which.txseq=which.txseq, max.mismatch=6) U1.sbcompHITS <- union(U1.sbcompHITSa, U1.sbcompHITSb) @ <>= U1.sbcompHITSa <- .loadPrecomputed("U1.sbcompHITSa") U1.sbcompHITSb <- .loadPrecomputed("U1.sbcompHITSb") U1.sbcompHITS <- union(U1.sbcompHITSa, U1.sbcompHITSb) @ \subsubsection{Tabulate the ``hits''} Number of ``string-based compatible'' transcripts for each read: <>= U1.uqnames_nsbcomptx <- countQueryHits(U1.sbcompHITS) names(U1.uqnames_nsbcomptx) <- U1.uqnames table(U1.uqnames_nsbcomptx) mean(U1.uqnames_nsbcomptx >= 1) @ 77.7\% of the reads are ``string-based compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``string-based compatible'' reads for each transcript: <>= U1.exbytx_nsbcompHITS <- countSubjectHits(U1.sbcompHITS) names(U1.exbytx_nsbcompHITS) <- names(exbytx) mean(U1.exbytx_nsbcompHITS >= 50) @ Only 0.865\% of the transcripts in \Rcode{exbytx} are ``string-based compatible'' with at least 50 reads. Top 10 transcripts: <>= head(sort(U1.exbytx_nsbcompHITS, decreasing=TRUE), n=10) @ \subsubsection{A closer look at the ``hits''} [WORK IN PROGRESS, might be removed or replaced soon...] Any ``encoding-based compatible'' overlap is of course ``string-based compatible'': <>= stopifnot(length(setdiff(U1.compOV10, U1.sbcompHITS)) == 0) @ but the reverse is not true: <>= length(setdiff(U1.sbcompHITS, U1.compOV10)) @ %To understand why the {\it overlap encodings} approach doesn't find all %the ``string-based compatible'' hits, let's look at the second hit in %\Rcode{setdiff(U1.sbcompHITS, U1.compOV10)}. This is a perfect hit between %read SRR031728.4692406 and transcript 18924: % %<<>>= %matchPattern(U1.oqseq[[6306]], txseq[[18924]]) %U1.GAL_idx <- which(U1.GAL_qnames == "SRR031728.4692406") %U1.GAL[U1.GAL_idx] %U1.GAL_idx %in% queryHits(U1.OV00) %U1.GAL[12636] %which(queryHits(U1.OV00) == 12636) %U1.OV00[305] %as.character(encoding(U1.ovenc)[305]) %@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Align the paired-end reads to the transcriptome} [COMING SOON...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Detect ``almost splice compatible'' overlaps} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In many aspects, ``splice compatible'' overlaps can be seen as perfect. We are now insterested in a less perfect type of overlap where the read overlaps the transcript in a way that {\it would} be ``splice compatible'' if 1 or more exons were removed from the transcript. In that case we say that the overlap is ``almost splice compatible'' with the transcript. The \Rfunction{isCompatibleWithSkippedExons} function can be used on an \Rclass{OverlapEncodings} object to detect this type of overlap. Note that \Rfunction{isCompatibleWithSkippedExons} can also be used on a character vector of factor. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``almost splice compatible'' single-end overlaps} \subsubsection{``Almost splice compatible'' single-end encodings} \Rcode{U1.ovenc} contains 7 unique encodings ``almost splice compatible'' with the splicing of the transcript: <>= sort(U1.ovenc_table[isCompatibleWithSkippedExons(U1.unique_encodings)]) @ Encodings \Rcode{"2:jm:am:af:"} (1015 occurences in \Rcode{U1.ovenc}), \Rcode{"2:jm:am:am:af:"} (144 occurences in \Rcode{U1.ovenc}), and \Rcode{"3:jmm:agm:aam:aaf:"} (21 occurences in \Rcode{U1.ovenc}), correspond to the following overlaps: \begin{itemize} \item \Rcode{"2:jm:am:af:"} \begin{verbatim} - read (1 skipped region): ooooo----------ooo - transcript: ... >>>>>>> >>>> >>>>>>>> ... \end{verbatim} \item \Rcode{"2:jm:am:am:af:"} \begin{verbatim} - read (1 skipped region): ooooo------------------ooo - transcript: ... >>>>>>> >>>> >>>>> >>>>>>>> ... \end{verbatim} \item \Rcode{"3:jmm:agm:aam:aaf:"} \begin{verbatim} - read (2 skipped regions): oo---oooo-----------oo - transcript: ... >>>>>>> >>>> >>>>> >>>>>>>> ... \end{verbatim} \end{itemize} <>= U1.OV00_is_acomp <- isCompatibleWithSkippedExons(U1.ovenc) table(U1.OV00_is_acomp) # 1202 "almost splice compatible" overlaps @ Finally, let's extract the ``almost splice compatible'' overlaps from \Rcode{U1.OV00}: <>= U1.acompOV00 <- U1.OV00[U1.OV00_is_acomp] @ \subsubsection{Tabulate the ``almost splice compatible'' single-end overlaps} Number of ``almost splice compatible'' transcripts for each alignment in \Rcode{U1.GAL}: <>= U1.GAL_nacomptx <- countQueryHits(U1.acompOV00) mcols(U1.GAL)$nacomptx <- U1.GAL_nacomptx head(U1.GAL) table(U1.GAL_nacomptx) mean(U1.GAL_nacomptx >= 1) @ Only 0.27\% of the alignments in \Rcode{U1.GAL} are ``almost splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``almost splice compatible'' alignments for each transcript: <>= U1.exbytx_nacompOV00 <- countSubjectHits(U1.acompOV00) names(U1.exbytx_nacompOV00) <- names(exbytx) table(U1.exbytx_nacompOV00) mean(U1.exbytx_nacompOV00 >= 50) @ Only 0.017\% of the transcripts in \Rcode{exbytx} are ``almost splice compatible'' with at least 50 alignments in \Rcode{U1.GAL}. Finally note that the ``query start in transcript'' values returned by \Rfunction{extractQueryStartInTranscript} are also defined for ``almost splice compatible'' overlaps: <>= head(subset(U1.OV00_qstart, U1.OV00_is_acomp)) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``almost splice compatible'' paired-end overlaps} \subsubsection{``Almost splice compatible'' paired-end encodings} \Rcode{U3.ovenc} contains 5 unique paired-end encodings ``almost splice compatible'' with the splicing of the transcript: <>= sort(U3.ovenc_table[isCompatibleWithSkippedExons(U3.unique_encodings)]) @ Paired-end encodings \Rcode{"2{-}{-}1:jm{-}{-}m:am{-}{-}m:af{-}{-}i:"} (73 occurences in \Rcode{U3.ovenc}), \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}am:a{-}{-}af:"} (53 occurences in \Rcode{U3.ovenc}), and \Rcode{"2{-}{-}2:jm{-}{-}mm:am{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} (9 occurences in \Rcode{U3.ovenc}), correspond to the following paired-end overlaps: \begin{itemize} \item \Rcode{"2{-}{-}1:jm{-}{-}m:am{-}{-}m:af{-}{-}i:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, no skipped region on the last end): ooo----------o oooo - transcript: ... >>>>> >>>> >>>>>>>>> ... \end{verbatim} \item \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}am:a{-}{-}af:"} \begin{verbatim} - paired-end read (no skipped region on the first end, 1 skipped region on the last end): oooo oo---------oo - transcript: ... >>>>>>>>>>> >>> >>>>>> ... \end{verbatim} \item \Rcode{"2{-}{-}2:jm{-}{-}mm:am{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, 1 skipped region on the last end): o----------ooo oo---oo - transcript: ... >>>>> >>>> >>>>>>>> >>>>>> ... \end{verbatim} \end{itemize} Note: switch use of ``first'' and ``last'' above if the read was ``flipped''. <>= U3.OV00_is_acomp <- isCompatibleWithSkippedExons(U3.ovenc) table(U3.OV00_is_acomp) # 141 "almost splice compatible" paired-end overlaps @ Finally, let's extract the ``almost splice compatible'' paired-end overlaps from \Rcode{U3.OV00}: <>= U3.acompOV00 <- U3.OV00[U3.OV00_is_acomp] @ \subsubsection{Tabulate the ``almost splice compatible'' paired-end overlaps} Number of ``almost splice compatible'' transcripts for each alignment pair in \Rcode{U3.GALP}: <>= U3.GALP_nacomptx <- countQueryHits(U3.acompOV00) mcols(U3.GALP)$nacomptx <- U3.GALP_nacomptx head(U3.GALP) table(U3.GALP_nacomptx) mean(U3.GALP_nacomptx >= 1) @ Only 0.2\% of the alignment pairs in \Rcode{U3.GALP} are ``almost splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``almost splice compatible'' alignment pairs for each transcript: <>= U3.exbytx_nacompOV00 <- countSubjectHits(U3.acompOV00) names(U3.exbytx_nacompOV00) <- names(exbytx) table(U3.exbytx_nacompOV00) mean(U3.exbytx_nacompOV00 >= 50) @ Only 0.0034\% of the transcripts in \Rcode{exbytx} are ``almost splice compatible'' with at least 50 alignment pairs in \Rcode{U3.GALP}. Finally note that the ``query start in transcript'' values returned by \Rfunction{extractQueryStartInTranscript} are also defined for ``almost splice compatible'' paired-end overlaps: <>= head(subset(U3.OV00_Lqstart, U3.OV00_is_acomp)) head(subset(U3.OV00_Rqstart, U3.OV00_is_acomp)) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Detect novel splice junctions} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{By looking at single-end overlaps} An alignment in \Rcode{U1.GAL} with ``almost splice compatible'' overlaps but no ``splice compatible'' overlaps suggests the presence of one or more transcripts that are not in our annotations. First we extract the index of those alignments ({\it nsj} here stands for ``{\bf n}ovel {\bf s}plice {\bf j}unction''): <>= U1.GAL_is_nsj <- U1.GAL_nacomptx != 0L & U1.GAL_ncomptx == 0L head(which(U1.GAL_is_nsj)) @ We make this an index into \Rcode{U1.OV00}: <>= U1.OV00_is_nsj <- queryHits(U1.OV00) %in% which(U1.GAL_is_nsj) @ We intersect with \Rcode{U1.OV00\_is\_acomp} and then subset \Rcode{U1.OV00} to keep only the overlaps that suggest novel splicing: <>= U1.OV00_is_nsj <- U1.OV00_is_nsj & U1.OV00_is_acomp U1.nsjOV00 <- U1.OV00[U1.OV00_is_nsj] @ For each overlap in \Rcode{U1.nsjOV00}, we extract the ranks of the skipped exons (we use a list for this as there might be more than 1 skipped exon per overlap): <>= U1.nsjOV00_skippedex <- extractSkippedExonRanks(U1.ovenc)[U1.OV00_is_nsj] names(U1.nsjOV00_skippedex) <- queryHits(U1.nsjOV00) table(elementNROWS(U1.nsjOV00_skippedex)) @ Finally, we split \Rcode{U1.nsjOV00\_skippedex} by transcript names: <>= f <- factor(names(exbytx)[subjectHits(U1.nsjOV00)], levels=names(exbytx)) U1.exbytx_skippedex <- split(U1.nsjOV00_skippedex, f) @ \Rcode{U1.exbytx\_skippedex} is a named list of named lists of integer vectors. The first level of names (outer names) are transcript names and the second level of names (inner names) are alignment indices into \Rcode{U1.GAL}: <>= head(names(U1.exbytx_skippedex)) # transcript names @ Transcript FBtr0089124 receives 7 hits. All of them skip exons 9 and 10: <>= U1.exbytx_skippedex$FBtr0089124 @ Transcript FBtr0089147 receives 4 hits. Two of them skip exon 2, one of them skips exons 2 to 6, and one of them skips exon 10: <>= U1.exbytx_skippedex$FBtr0089147 @ A few words about the interpretation of \Rcode{U1.exbytx\_skippedex}: Because of how we've conducted this analysis, the aligments reported in \Rcode{U1.exbytx\_skippedex} are guaranteed to not have any ``splice compatible'' overlaps with other known transcripts. All we can say, for example in the case of transcript FBtr0089124, is that the 7 reported hits that skip exons 9 and 10 show evidence of one or more unknown transcripts with a splice junction that corresponds to the gap between exons 8 and 11. But without further analysis, we can't make any assumption about the exons structure of those unknown transcripts. In particular, we cannot assume the existence of an unknown transcript made of the same exons as transcript FBtr0089124 minus exons 9 and 10! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{By looking at paired-end overlaps} [COMING SOON...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rcode{sessionInfo()}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= sessionInfo() @ \end{document} GenomicAlignments/inst/doc/OverlapEncodings.pdf0000644000175400017540000105113113203700433022657 0ustar00biocbuildbiocbuild%PDF-1.5 % 232 0 obj << /Length 1340 /Filter /FlateDecode >> stream x\Ks6WH͔xHOM1iIt{%U"Uv%AҢ&EI k"]@4 hm DRc|ƊqPDmjz(Q d0 $%ZC!T0ßl&Im6n=eC7+ U7yClp%D\ garк'@#e " ֍&5\|qMHh^ڙ]ޠ*(S_6jv++W[Ž7oqyUbL굢Dž1Tw{g3*6qn4yRLji&ﳲrg{t51Jkeay (B/' C`Cǃج}0y2w.|튷Et=^}+\S =uc"}7o^mP+"fB_XIym'# bk䦩l6&7܃#i$bE  dQعkCHc;Ʃ ^-Z@$i  VxXNU46j,I~vPq̈vЭ>\Sk(IcqS_' 1M&%`/r卫{ *7Yy@me[A͇-HnαT^8V+Of zܽGؓZm0αl atXQDEj h:aMK[Vg6܉;^YCfrzZ$Q[g/1j8'rb|O{& ͎۹7z n~5z0uLJ`8'og[J;>3őwNWMރq{`ǧtόF{>?xJ{Qdyg8z  tU}?B?~QJT\H{[EaµPn9mT]y} a <ͩڍen7U)|y"Ԟxabf@wT ll룝udN4]bgaS)h(zkqx&}I]Q˗J@1Z :bQf7cTj #;5j{s5jW}^ ® endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 814 /Length 1615 /Filter /FlateDecode >> stream xڵYMoFW-ɡ76 EkͤjeR}C-%9vdJ \ͼ}fv(Қ92<@B IV>#13k ,+$,ҦHƐ3,@^cg5 oSHIQ3KDQao1zUxO]7 (D8φXD9spl {P^`p0O"LAcE4+-4&V-El0.B@qQf/_A\#ƒu[hd [+ [ `%F .{H%m^B CȍƇ CLD@z0I2dda۠+Ә$U@KTH1W$3c%Q8ȦqaRNN?zcT $ %)4ZIT 3=J 2*iNyYA tF"')^GkZM_/5oE{W_}ӜL? -fI-Utz }WWaCLiyVW7 Li^MApˬ 8s5Q{MbV͗tUwu/+uY^/n6C܂=<W@>n5>|KIG-ǁmYuU]}mHEim>dzQ6?`_60C5~CVC-;1oyW}խ;,r>^tΫnz5_v7Ā~#*;~G [*FcwVO|\a܃2Agʯ=*.OkkU/вƈ/ZbyKmU#noq &6}8- fm&q]3;;*:Љ 촮=fTdowwwoOcxpǣ-zAnjCwg\51Tv-=ݖ鍹`tLJllģ;mݟx';iPlcVO("D9. 1cAQi!%7^Ϲu)u^d3U(/#:,Y֕ւfd=~\y2# xKbv1as mءz6OK#Y)Z(_*d5tzUԜLĽJs2,8ʘFrzn=Q=7~?6<yUFîьM0FId+m6Oæ 8gƳ46i endstream endobj 279 0 obj << /Length 2169 /Filter /FlateDecode >> stream x\[۶~_ɓ4A_zxizqvb{:eCHο9(R܍묨]%W$A|J4KhG:M%HN8*y;LJlW;6rooh|%IJUԘd!yc188 3`l6a'>y;cum}.vYb[٣ջ)tS-wϷuN`0KmaεD9gDk $/29 G⯀SL3O׬Vg "@!FȨZ\rrU`lmVlfnT_bMf| H=Z=&oy;}^W+Q6G!Vz}3e|b EZgϦFk#\_^UmbU,*ۅ,Wil7j jX?UPA4a)Sۦ.[گe)RZ Kg(9eݺXUE(]mZ>,20|{9|r5|t[%0;FsGձv۩[ 3[P U S~\_'h@[6ZggɜäMd`*J_p{y$8Ձsс:wyL1;p`X& v` !_pA/9(p6*.e3#fx١ JoQrTP^~`~#J" yTQnI>u/ӍZ{:qA_ 5Ǒ*;)T:}I{=N^ OqFshas Tbp%Wz"`k/iM20}U؋e Dv.`Lg2A&1P&PB=gJ#ٱPܖ諸$7x 4Qna$ċq^'dx!C Fx̌=*FI0t\}=hrG<NeiڷGA\'+))Ѷw17p4z:Jj'^,MMSzVe?ӳI6@ܗ=eL)Á*-;)U[ېU`}QpHіo*4,QɌLpDvfK^ֲP`( =&?T_G9m*~X2.2` ojn^ `:y} ~0p<۩ a qv#ہhv BVlx7|-&vvAO!׶٦\KuS.G'tCz8x섆FGؠ0vxiٜ.fL4n> @TF`2nJ/|@sHO}#%!ÁBѦASX;fAQd+? D#fX]B31~;a۾IH׏@FiLKc".lmhV&}/*4:  -| iYo9G8z6 +wq16V12z$t 6 !PwU(|Zpq0UlvZtZ¤3 jj-XE]'CdbՀ3zOh`uE+1W4J3.B. E4hNW3,@ Rxd?%Zo@6>RC{\HKia#A@b|u골F >01T 81Ykw#R0Obip#FFq:%b~B_(O9bϞOz(ǭ|-{Fj~xbbQ3lGy}a٧=ӼǶ0B :NSw#'3*NSc endstream endobj 286 0 obj << /Length 3111 /Filter /FlateDecode >> stream xr8_k#7ɩn9IjHlOM'TvJiǞI*}|٫GO_*3KXb_ gq,gL 5;ghx!x^TYղ=_(O_hfXEn5FLDy'Zg82V|, V,ZIJ̔fRIZXs\wy*<@@ C (4:!b}װ0ѻ#X~b&aM Pf#1S&NjћqO i%ILi4u.ՈD1aQ&52~$#6E OHX$,q/wU֕uEp"ϲ LqImJޔcjv M(c1 .w !jC n"m髬PK'$S*qK3""|Sc%hyQ ˢ4~L}G^xJ-1C⠾!CmWfxl2w5|u ">j%_us>c g'P "svO'EqسȈ 0#Jԏh#)0'Hi,\@xrbir,ʩB+_*۴mǻ]f܏ԐU׀c A:B1J*,Txyu60t2 8􋀘Ā)GztHfb;l¬ѭR_ (ﯽZbNMw=Q"vjP8'_2F$<̌q)63D6Rv3^aAUB ,KA#"f5>M2J4=' :LI&u Z5P/ʗgT ư`Bk"iK%>3oC&;3+rkam6u[S R3 2a!X3\=vSI1)}|`U)g秿MF&F O=/K$b(0h5(;vE<5w8NyX{|ӷSnLk3pWl+$)x]%x//h*uNK}M!ID,?wk(Hוga42f`vL# ӣ|,GDrЙ5SM#H-GzU8%EPb@6Ԅ3r'~kpXk\ ,C[?S>{&EP&h*M U{) ĸs{ㅅ]^4i܁SQzN?,l)y =b3^| +[){?]l@p 6b̡ 2~'50?18H6 on" ڳU)NH٭?4mOzF8/DlP_2,R&u= !%֯J8lfHG*ȀձPljڃN7OIwFFXu/xHB-QócbuɗO^|/&#pVT\U0, !G D A%+0ۣA 7JCF!J1aa :(0) Q])|+^N?~Al~{U}>5ck1#>K/gҡDTh,b$āb1Qw$Ha|97B :tƻ]~@.ݟrO2op-vmwQyȖH!#Etyxk Ԍg[nLtS״I~8:2dzY*kݚfV`I5h¤_$EGNlAYu߈ 8#=3SRFXOȶ|J%Mgu' ?]܀b>{`V+pnL Dv[M^vExJ/~V$wd:~d±¿DQlb!lo\_fP pR/qO^P7=ԃ'1EF`o:EflC&+C_mWeFsT \AOmW%PIe } !JI~l^[oI%R UN]kzuN14ցqح<F >ze8UGcHicd#u3{7xIƵ}6|'5F-ٿ#V/wջ3Il5 Dݷ5={#e1t2o~ۡqt!m}A5 it:ȩ'W_>o˭W&dYTa-ӉOp$sjojѾ'0W*ꐷK;>udʱW' k+cޭ3(U) endstream endobj 292 0 obj << /Length 2218 /Filter /FlateDecode >> stream xZoܸB'*|S<$)].9:Z 1 yJkI[}JZZO$1!93 ;?z3Ib*:G$i"-X(grm'Lͧl/$FPa[.CCg]$~5 c2n\`2FG)OQiR<҉2<@)CY=(f߈$|uY/4y+PNX=$PWz|_hy“$~LQFD1쓼ۛNa])Q f<ȞXO:\{w#1\ W4-&L k%Τ 5 h&HSI>_L9L$(d]/a`ҺXc` givLVap]Wؖg^)Ycga޲37ەAz3x'$I76w8OyNmUa"](~Į|xrFqWUWxmM+]؛1IL [jLJ3 j0X^ jo7~o"M*p9=u(Q,=>N XOy4aizWu0(zgLT{LӵY0u$pPAaQ*# ]"*V:ASh OM=B䲫,08 R=P>L˅DY҄K3|[cx@*ߟ8Gd6%74MϣrwO`:A X<:9¨N ,U44$۵% 6طʛl{qA/i8bN?FKLY$=w@׃4 Oz'v2z58_D<ٗB6+/i@Ie:pGnUn +?R`^dUN}(a#Bu80bM^8AS+!T)gьOtL]!>gk6/X*g~ێntֈK1T3©x)O1MB }Zi e[JL? }E)F8 IS]Ff(T[}r(q)ij XSrC0,X iu Su2ANchLްfL;VSn*KVY!#1„2IEwdTTkYi0N{EW[;]W60$L.[z$9 *0'x9~;zD\-F-[ KlୗX#p B{!xT(h$ =u(c)>V02қS\䶯$|W |[K᢬2.0NPwXtq-Vp1)*6~lWuVa/s7B%dږMv` \7p4(z ޠOn_y{H$@f\áaR2.A> stream xZ[o~ۡp @ESyhV2[TH*nYRLvb`p:sfm"9BEut%iʣDr™VѯOmSfŒ'il^զ]v36Httm6ѩ/]4bJB3/"$3)1TDg?cei%(ʝ$2҆ j 0E8\jX h_7HxRI"q)@aF,!2\⿹~(urԔ)~sh[lzTVw_;®cczkP)`iJ8.?fwT2k;EMVd/l6&,6V]~;o)d?UAvUerڗ^gFުlkd iX99]tau}xFǾ=K&P1NeO;YmkN%QTO8/c"t~WpSJ'x"Ue%|Lc+J<-cf 8*$A5sR.3\#t | ǓJg2|%dۇOVp|8ki\upwqy#k:ѺD y:/Q!+}da Pivc3{m_qawNp` J47'{umqC|<>ik* Eq)*2`{m}ЦR P gtGf]p}Y[qa4%܈i@*(@"]_1(s4m7zA {d8# 4F,%J w>NNH3AXO  /tN7+pSmBȕD%p\Vl)H_Ţ$!i2J7"־2l* v7,bK;w\tdp;Bk"-I[CX"HY izFM]$9/qG_ س@By 69pTGy,NZWMQ"[XrK T=CqPf)! υu@0|޺R39$Chb`G+E^&0F .]gC۸Bwu˫9ōJ2*P`h!Ku\;7!ޗ+$Wq-pG>gHv}X> cQ, it";\cF\ šQXK4 wCGt [C_ޛΪ34.u {bO&b9t:/38ɨLWpI&!'8/q5 ZUyf5ֿ ;VX%FFL|I書AoLqVTŦD`O9ύCa2쌋h|dKb}9"M^wTfY-BvIWŔW b/vEe"eHdSq0)n+wܤfK! 4 K ScY8Q5TǤ\Pu؃IeP6܈ԵZDJd tT#2G>} .Jjiu.VuUɽT cɭ1y /]Qb| !|._bꦟaH}ʄ9it@>h )4( ûj>֠#m=Ԛ>3;\wA*ȻMZ$ Mk`D䉃{2=j}> stream xZoȇN}?ErvS AASijD9$e'}gv4)ˉ8`r33y4Y$49>qvpx$T\'DQb-O3UQɔUբƃHDg?M GIJjB P'O(QTYԘ5o||AɔѺl˧ڬ ͛u4.uDja(dr ;Y.pfAӏ{q * W Y_W&y WŻ@"=+C񱖋ĺ7ߗ?.q,@t /b$;7(z+gc^4y]^ ж˲C@nŸׇyv4a i+28."̙9 K"9?CگUr*wݎ^  xJ0bQ_q81V'|{ɷp_]gm/Utx&cXx{Em #Ʊ4h3_##f 8Rj-tЈy-i]d&t SeWE^݄lpcXOn.KW@yw5aDjkdh8#_eH`۪|-yY7@Q 4\DT]0'O&SəLeO) pu)8W3w)w'ӛq P!P!*{(b?J2NR #G~.;et, =6;[y.߷UXӯ4HBXN(),1 !./KTFY(;WFlZRZ p ]Gxh̄_stQH7:6תּ)LߺZn^0䟧 9Tqfxk=%u zشm\1?l0-P=-UEla9+M@Q4SPATZJ#[7ucʫYg}_ L$>il_%b=&:.7 mc}a>rxINђT8%JݽG 8S## QZ g{ 7c?*BTh0^M!nⳢ)0lR}( cY8&k\U98$(dVHv1&J;aЙHuh4Y%Eҡo+ ȂJh4yM6Uc$s?s^o֡tH5Eb1  Wm~/vح̆ *g6F~ՊFg: | |/mׄbPΐho6QEaSLIzz(,*B,hvS<  pWBqEB*|Ķqg,{p^o6 AHTxn7>XdU٬0yMxЅ C1? ˴o˵#|D{/F>cLX//@*7Cl>IwrKy -6 Hi􉚁rrZj =(C-xLѦ _ B pHv-!kBh { g>U1V+!VX#%:H{eRU o春@6L EӘ}Ǹ!Aˤ HaDC}G  G%>oăb} ;E#QyGR#u#%Xo> &B\2VW9ʩzکJGr߸0F%UyVgG v] nv yǗq̟>bnL(_ r endstream endobj 310 0 obj << /Length 2207 /Filter /FlateDecode >> stream xY[o6~ϯ`njx`dLN FR@D) *PP CDJcFbչNx̥=kUZ1HEfȳ*Eq~(k8t[pD=gu.pd5Zs LH_$F[̓}S7]u19|Dmx 4-p\0Ih&AuW:;Rv=' ф2dh„($ߎQFS+}ꚓGʤ6jUV5%Wi)\٥N>i)*k7-l{QEn*MR/ҢkSVSE+. ȯN~+W''s{zd&#z֜ ZFuzpt:/_0 ]ko΀uM DOZ*_ !J9qAT*<Peawr`mKb ph %,]<$'Rt;cGuVAjzOvurZgyŬPCF9Ι+߄( p*ק)?Bs_C~Գ7ג_gv \l籠x\iQ.i)*6ɡn}w?_~aNF}g8xy7LM2'd8'Tu uM&.|,m~y&0(UC@dT'l4p0Ś 8c-Qvs೧VF;5u(Yr@P3i1ە atCQY,cg`pq nM]؁8; e'3Kvn}j_)P6g u&w)hdyrE'%0scٍ5Ke8hE~(@i:n>-fs~c@3!{kXϣlf/V-XD*1z8|nrt+htjD,<6Jj}E퐿iQmSءξ,.ڊ\ַ;8&$_p^&rA𥀠61 5xdp|MK"5<$,t $GDJ><dTW:;VAP2]Zqz-XZ,P vBDž'7oֺJ?cIB!T7r=Gn\ϗZ~ LqJA Z%6A %r"]7pb6`i>o,֎tz6 Gn_$#FrQǮ!ǀ>?{ldz?Fr'˷WzXpbG?ǻO W/L m.i]trx߳WoctuNlQA5\_q'mS4N{ĄJӽbZxo{Mk7S镫 c <SEeLx+Nee endstream endobj 315 0 obj << /Length 1921 /Filter /FlateDecode >> stream xY[o4~﯈2bEb]@+CY42I7?K4v T|s|''^|~DT&'D`e4Q"JXrHNޛ/fsE(U7{{a9!2*OdqB~҈,)vSV e4KZ,~|(ʒ,QH L4CzReP4/}bm^wE[^oXrq)j@ $B$eJw8RL;u6YV6nP3vP&߭Sk*"MA#xG#e>S}OY ߡY>_}1K3Ȉμ:'Ytrgk6gao=,Ƽ8 I |xwUm^ /&ޔ]'։蜒giq7~oyy~>h[0{#$)~H2,'I>E-hQ)S 3 "2>IMLQj0o&-(Rz0g[j8#wQ6S^ПLDnnH-6U:r3˶Yb|BYi(?H(FxX(pbv˳:;j{bdRgDk@'NԱc 4%̕yo.A%]2-Cm1 P^`/##.-ooj2yGF@zn hy{M$YM"d.7I 6㉐_ 9|m?$; r )e̪ՏTr (,Xd Z%ROp T2!1.=A- 8L`LH]Q9?A]Q)5iA"*#]/.Pkٳύt 'GDTnJ$(l9p~|qƷ\$av,o&V4 *5aˠ Hc6D#)e\} ۍ]KRaiLkgiMeP@Io$mjd_K8V2C<˦C~\F@ aD%M1w'ŕ@Ԗ6Y ,6 h_!sy6Ѷ\e8Q^]E^UMg؃?~k|![ M$ɸu 3*)c_aM 9 }E)*؄^ȒԊMk˗'?}[4K  ILG>bk4|tL`<:.iE||r56P4<6ZN?mRLrg3{V>Ugdg%L )Ƿ&ݞ6|`*$MUeWaչvծ@t '6 SgWC$")mWXv}Oؘ' f*T RVM) Ta'<>|\D ϭuZ"`-ͦ ֆN0*,ym ux%1{Wjk0 ;_dnpWdY.9!3E; endstream endobj 319 0 obj << /Length 1912 /Filter /FlateDecode >> stream xZo6B6jQZ0t-"Ӷ:[r$?~"H%| &N^= #ƑHk)N%,:Eob/T͒|fٟG8,wZlA!YaX82?"ʤHU?caoųtmV4@T`DۺNO`ȨgmYΎ.G$ !y$@(jX Z6G ##)A5_tU )w?I`! b h5N"FEL$dAl+d-8$CiӈjcsY~:$_fջ-V?X`XIEjpXDg$5`3n/k$Z%SeĮ;/4HjQSB Sl8yјe?ۤi5-qop|*UpsgF`e.]"6,U:8 I'1X.# QqQA GdYKżi2Jq'-iVɍ ,vt>=Ō(V9gIkJB=JDB+AZFVg=.1l/e!d u]AY}Y?ۏ,aIqj*a~tYѥ@ *옵tZJ,LKU`Koe-zV&(?R Ve+I4C P4/^,!ku\s ,/>waR- gԻ )K⢆E(%"!BByuNc4<\h@X O=*i4PpB3Q* VSNU @EU{ ˁ$Gb M 4J7zn/jbg=MA}:;H>Y) 7ph!('>Ŕ$1sy'Y P`3k(L5Y404 nTnx!]ٸ|'C~w) GRJvn % 1Q X?It(R8<"Tͩn0A{K@uIV5O\x I0dC{g(Tҙ@D*W"C)4w*(6C\Y䢤 $*Y.@rQZ@^<}u`S} x܇#.ÿW1%w7GA7WRծt/ef{w ΥI0anAч͉nmƒR.!4^+I"oڪ0#iH4ZG[VxX=/,gg_]rCZV"gyVOGI Fpɯԃ0A5R/Npoۉ=l.v/zb^gȖY)pu%BS &2\BA@oΏ\EePiQW nulWa n)MC'd.|RD3Ûj,rUU*R^ oj}YUcjlGJz5qҽu-)pԀ)aAL!0tū endstream endobj 323 0 obj << /Length 1874 /Filter /FlateDecode >> stream xZ[oG~ϯ؇"x9sG$HR%q:`oR=3c$;OvnssYh2Nhr` .K I1hO8}sϧeڤy1&x;GEXJڿqi讧~}cH&,H{nN$bLyr h,'G2Bz:f'R-X0H?~t>4 2OR"tv~EZ~bgga2+hSwIyK;ͳE)Y'aǤ$J+FD)A(9X,[ ZlmHJ."ToSZ&C'n+*bI 8E/C'm0٬: y6{6$>q Lmļs$2V`C1N#:QhTё93UC"O $Oe>RYeQeЖ|9Ym'Q lT~S386Y"X*=x1xr/ZMg)0\3Q2{"iCK]CCh^CP( 4BTwrJ`UA31^M2oT@?-?{k l"/B@S+`γkHtH]1LSK!|L,*JLrŭ:姎G&NkbTwlZOܙH9e ۲. v:k /E|n78ǾFwrP|>9:~)QVfQӫzÉD-7~$qf/a.̵dӣiJC(qh&}꨺pEkK0(q>?  F[LcHbtx>8T ҟ> stream xZߏ6~߿B/ P\/iq]lɑH٢l5ެ n_Hg8C~3xyv۫W7W_*si]83#!fzNrV\gNlOꛛW@byJ!NfՕ8MKOղo,3Ü32W.X뇷o!r]O>=Ԓp8*4B~z9i|d7M* v½3H))RE$JJ)̡"T선)@.'ιScS644cVl]]B//C-7b[0p_ժC硩c ɤ!&]?sۿ}V≠ 5:vX2c5/["bj4ԩ̾ !4!)SN-VVVVǶ;6t>QrK@q逴x ۮ*76vbvr=v=\\!guˡaS=.˸Q''BT03B_k4J 1|+'C\eބjföUy ` )LiAKn?EC48'I\1C , i?xZFwA[EE]r3pEt~@G|EC1W;WRXfMo?܄Hh@Hoi PIZ*:}6idM9W/8x$?q"5hMfն|{R9="Iw=)@tOOQ϶)cOu^"45Jlw fI拺5znwyNm|1'qFԾ#M^ΟjBRj)]Hc!!Zv򮺦Y7VmCsHbJ3BNPI1뷔u)Y4" ` 9 zеԓ2a^7 O'Ŧj;4ʦ1a"%3;nyi:@u 1{Yew>E/#Pk~[Okz7ڔ@#> ߼vwؑMz-Er @ G#eETVAgUHS|/W?AeֳL~:̔ OՇX/yDj^lXƚ}BM;=nC#M"]eDUIޟdw{aėQ=:@!)M&J V:-vУU ̈棕ڝ\_2HQژ%yZ-XXt](;R'Z}V+~rjkL#x HyDo[,y!3 {oeiO !?loS̚#bcOXapܭ벃C]zS%y n! Ǿ@gzS.cJNyUEJ`-'Ɨ=qr8_'2Tg'BH \[Z{#?灌N2Ic[FH#CTus9A$>bV =Nq| \1 K_jjN$:Vhu`ppR(u)BhE)SX5ʐiAw1vtQ~ZuL_aQzv@mOK 8ms;]_ endstream endobj 331 0 obj << /Length 2629 /Filter /FlateDecode >> stream x[[o~ p^d4dH 'E>$-#QHɿ?.)ĖW;܍+n}{@<)3(93%eBbc1,A5utҜ88Е fG[=]UMZ+]yhM@vlbr[4'xѲ1ӥ'MR:xrD>prVVj᪦F>pK82Ghx^No`Vޢϥ[nVA:nI+A+ykVUhX Ґjp52Ņ?iG (k71:B7gDshJC 5@*7ij VQh B9iC:}1Μ*0h! E0$LAa .Xe-s})f@uݤ<\ͧd0a7G޾]f($d}ka]2%}Mnzɽh xĿ-Ofyh?j6$~͓~:w+VԬo`dΤ%iuT{ruLe+ZB|7!%;8$Kj-vraIe>KSa_<Rr/4*uD2E# RvK CTu dc:roc>ΞjM]|8&MI,­f.ʪ.OkZ_#qDtlD 8 e6K)^}B˻^a?FTV=TTM)ˁ~IbCտyC(d]x5 Ax .ăK]CB-Zwnju(y\^Pn폑V"۪P ˁ*U ̲D MØ/XQqo/ʲ*旎ad.~RXzݺ2;x\x|̓XP'N mn"Oy'?fIZ@G^D#mw%=gϮ M[s} g!CڱfCm,Uv(-Qk)d9\TD_{[~NkDcq;z>uoS6k ceV{*1|fIOllbK!~HiwWpGi4x/zH?L3I-vV7Ͼds1|vAaKY!C G}+| @t1B$6n/wK;.axKadVmK/{@+J(~(|b,txśe.W6u5^oN 27}֡˵?'kejKa#WPrpoϕOȤ^SڏR<+U9 JLǐm%+jf,Ĵnliʦ-Oc{ ATcI#i!{3jqE endstream endobj 335 0 obj << /Length 1410 /Filter /FlateDecode >> stream xY[o6~2XIiH f^bPlQ'[E؉'Ë?;)#v:z(A2:"4R"JXt:MUIL崜y=|F% jm:yWG#∴x"$.FvSH"F*L>>dWVE %S+!L2$*ATVHWHˈ _F x:Ogp։ ԟz^/й̛L0 }2g[U.nt9{uzrv $hOR7*ϖecwgfӴPnNI8CB/) ^%c11B$c8[ IsBcon P [d6q#) ֲvLV~ FoϸcvK"h]uuMf"aBY&M?$\yNmg PkS]/8Bэ\弹 uhMo`Eqb19'obIg*S[jq/`z˚6:З:_MzQQ!+C)7i{]Vͭ0;y@l'1" ߠƘ`Yv_iv39BKN5ƁLe9cE\s| =ȣA +;uzoՏca㋫0{Efאg~)}kCa0 ,Cc'.&dl% *ǥYM?Cs+ V~%N*~U=[$%ex7Z@y)PPB+htnԉ'q b;yG^;F1?L89=6]EBHtZ4Ǵk5˵lӺ fx#pi<5\r@%4--s5%U@tGKJ$ޞa '#\U)j^͋ywo?sޘ`>݋"{=ngA5\y@["0M(4,mRߛbY']!YV&䴓^ +72YG+_#$Pi |٘$:]0 RڮKE9מ_ ]%8cpNǐ&~7nI)VT9g;`7lg!b>I `J-n(BP@G>T=>|͇=V7X{OG=\O\Cׄ2^4ԈB/h$_gE#H'|ݥBz9-2ŇI3؝r{+A=z``[3򲧺ol ) [C9ssC?p endstream endobj 340 0 obj << /Length 2511 /Filter /FlateDecode >> stream xn | Vj_`C=e-IݎMsmUMBO? 842QX#9L$*cYYƍMj^/ꦙ}ƅ(q1乮vOg1ؖ&WSF %W90h$"YPibS# J1B ĺbf<=gY.,_ZʽÖYa p=h1Ƚ¤_y8!X0b ׫",,|}Gh' XV2ß_.Sh 2N irz"#eJ ze_2i6|4̑Xspwɗ㰻{\)_w meVr2iUW4L"vECiޡ:P^&hp:$ﻳME&J.X H-g0i`ų:M%WsL-b]sѬWy}zi rù qUZlfAۍk`:BPS]}~9ɏj/ HqG Tt3cӲjML[,-ns\eӖU(MAG +JPŭ¬X" 6 h7y7 u Elc|$J ! 0@~2UO(EpˆSP`2)q -#Ev{g%?F3*۩PX)F(qI;Ju|4qJӂP> m_ߏ/d?xP۲C,I/ `CS,By snw]LP[0:̮KvLlEw}v)h ,S'6܁u*N`qG+qG PL=(i`41=%J1#&Mh v}H 1]rvt )?GG4%7s48 p @Q~Rك!-oUmcjYzx[Ra t ^ !9ې> `LyG&Bpl9/&z)WZYQ-^:]?WGIFr|#Ƿ)]W"׃sk/  NU<`Z|t_x)|2sɈ96/&?Np*(BD#`X̱aSȱ2>dž] =e.ޒJ0A8MU HsL_\͏\(Z%q݇pa/>Pk Sug7xComtb/BpvgHu*@OA1SaKKA[fW8bW!/6n5hGխzH׊'" h֞5G޷ӽuj駝CCq%/& w.-}&|f1$\ąjaKE$Ϻ0oҹ'SWx%<|U#z],!7e]tt=y螔bQASB,c_l#0pOtlE (D_s:^-N[+/JYM P/[k6+Ŵ#o{05a,WQaPbrIC~Fe|}W7nRޭV_° ja#R!F#7Vس)֡U[,_V?Ct(nz?e+gH3^|{ 9te ΎD39Zg endstream endobj 244 0 obj << /Type /ObjStm /N 100 /First 886 /Length 2203 /Filter /FlateDecode >> stream xZo~OEP.g?`@ 5 [YsgH&"n \,p8 869.v]dA[]RrL2dĕdZfGkX0hSEtRVǘ2&`NJZcj *&p5DsNhH^ Q0zPn\Bd^LO! "f"6VbގY`#nya-ݛϟz=Z.WEzExu?{5aEn=\t{|g@Eޜ(R+1"r^uO7xt[ I7g$ٛ5<6oxY`/y .nfbU_6i/Io5SG1zsw >=6]zI6,g_µ z# 01(lUT_(7byFGsjcfYTt#қb0"^lRd6*' 6jj4϶'E,4:e-[Ie),U,q4G~L286?\3,LY0QWmXwÙg#q$ @'>4rSW eDVǏ7F4 YLd3#2>R,XxawxQ\Da  Zv7u/Vǯ{u/>sݛ;jIP\[]`2Wgǽ ?GWJXܠgOJ}sv?u&BQl'ҠI@r$v$#WL|(\cvƧ6EVdClb. β<[Dn{k{$ySؙɣl_U Ո|+j-C>ݣ%ݣ^7O֫sVg'_AbG^ V-e@Sݣ4,m ޙo9Uw흕ٽ*5Ǖf'IwmnW kܫEMTxSԼ+ʾ1P֍0k]RK_)2"!_~_t'~w>ԕ_:t 81Ľ5ReƔMTN} ק[N~5}ٝ*+nmBj|&+lcLFɰCK E endstream endobj 345 0 obj << /Length 2299 /Filter /FlateDecode >> stream xZko6_!d16-(d$"ۢ!-l+;8#9?~% R"yKg^hﻗdy+mvtΜY%BeGjQ\Oe&e=[Ϋ{<KNn#68C^`Npf& .N^.7 ^g"ˬ7s`WC ٪N~#Ag9K҈P O$- :y"N|I f0o?gNU8Vn(ݭ[SeCUE[-&>[,-j2,yVqpr1{Hk͔i#"iٰQeIr$g4 ϦB/I`G:NPt!`Nn C>r[z;+j8)i]<Ώ&-\[ż;d4"  ]XfUdq,-319E|!zN+5۟j-֮?X\\0ufBxCH{EA6!m H4`+b'}~7v~C]Q6ukxϴR5ld?rTǷ"VqBRWuAE%tm9mcCR+UH&r `%#oIGc` 8 #ƿŠ(L8ݟZ.Fш|^q?xX9"k$ dGCtI綫"&0ɳ^߻MFdbهt$" EĵhCWrt'܃=S[]:sjd )-ʠwbߒZ3,\HcdtKDE>U̓gL &o|rG{ g ϖɀU?8^AysfMB^K'$']kI:w%HLBr=K(<4$I'OeTG7FaR]'ֆ9 o^(::Ŷ t&f\JeU}CbdQk2 1kʼnR*Hpd<W)dĴ:P;DN "uDMhcbLj ̛1U 1m?Q w NEP i"ڴEK#;9NϦCof_˸=Zy ;3!CFǕd9G#.DK!8fI [iiQtpR/^&*,c4shv#HZ95~=Hr)lro"YHIw$G*JTݟ<  DOcM$G!HZibue嵗RHIHE)7ϊ:q4ˆ2tWLϧ>(Rq%~qҝTy*0XZiQeYl^YgKAKl|ʲoX<+N/&tyYh  2iÑڢWl8\Vөm D[x3V.^iټvkșRoGŪv7-eΏ-% YzK9T][oAS/y 85%5}mRqYs׿smEuR/[:eYH'CcΟnO uL} JyTF}%Gh.$p& TPyrQPeJwB)U].ZR qQNK ~/|ا'NaG~J6yO];ѓ.{xfתl '.fg :Sn9 )ͬuqI$- wkźEη0cĕ1e܎!W:($߸TLZ"T!Ζuec6#Tts _gEi_1} lu6>⧸[_T8~𥑍?hq(Jh &ʶmivqy^7pc)ytYj zfiA5w9XUڴ(bx_Qg?} 8~(4tWUݖ2#S]9> stream xZ[oH~ R*aΙ;ZZ!PM֫ 8mڤR5mw. O.C>zw e% |q8888888:r5x3fc etˁ2OLҝ&P\Ȱ cQ@GYж20H򷼺V82Njhϫa) }ǓTg5ڇ$UY|*N$f׬}< '&,z+CTu:I@FZG gK}܄Mxr%&jq4[-+52Q䳔2G&uO?(8D+fC׌J4Of#A;)#"u[pPD#& Pt$R0@cZ⑤"^TT?j6@=ٽ>)C qXlTM~_`0:Tw"%D)k-8եMRq'wqz$).fuGwO:[Vyqku'.)XSu]z6w\=KܝBdߦj:XG*Uz*#xmm^ݷ|4߆as@Jԉr]l? 炷5Es2nS! TVy~Q*|Lj>J':Yև*Yj5bzt@T.6^/MRCo]6֮O/ZcYe*Y: Gmc THJDtY{W}O,l̫=)5{UYSs-Oڮ=\~)iV=Ո2**+`e!#5Cх:O:1fu0zf{\CNȭZi7wpq&vKܦ% zݣFFhܨui* b(2ZeF mw,^8ިηfQ8^84/>hG.np Us3U8Ҏ(Y?]1v<&vOz)er')BAK1 :h(^iA&98~Fi x܄avmD!ؾFqlT4x-Ƶ#m]'ĭu[{#on1)bަ="MQ7ȉz\(]_JII@Ʊ_ bzeO- 1]׃uvj v4 tIR_:c ]X"zX(gjswÇXkUٻ=Jĝ  ƋgՂ nz[M^@)Z hk^@eOŚoK7Ei$9(tosz.p5Gw9VpŠ !x(]xdRi}s6_T g endstream endobj 354 0 obj << /Length 2982 /Filter /FlateDecode >> stream x\ݏ6߿B D ?]Rk>$mUۛ͐,t#k( 5Zd4W/_ 94Ahè$ bJUM'~N%CrcTo:?u9SyV7N>L֫]u]nw!$F s4Jb&L,, V*i͇C=Smm߅ .Oe'P#2r2),*9BObЅ.彑Ol]0UMtYƣ-Rz,ރyj鉾!ϦH}fߖe;gQcHoѧL~vmهf:+5%Vʆ)ס Ǝ%Zei&jY4ZV+P>Ajl/y Yŧ> 2JU!uFp׿[0`v^*7vڸo*v_ fm;e W8{/SLX|ɧG ʍ[aDqDIHDH; nqHLLY,[i`'ˣFp,Clw7?Ʊ1gěn{3;) ~XI>`HD+ Go:ъ6.(+İf69A}i%Lv #J#jYdd e5a/L^u~~+C]{ d NCC"yuO 9SSD&׬Á~;sCcq+N My[o諸mgA&feOɢUVbn&Z+ K0t,B/=/ $3[B\((nӢ/'80<`ם+nE-C^5%Œycp%EQ] &cEn:=z|$ 0\!*MΗQI԰dZ2P6) skꢤ"Sp%?6jxkUMĸKpha% )-mʆG䨚~!&R+sz/ƬcvܻKt-y80@ؾဎ* 달0'}Okx)6 gr ٛ'4Si9]\<ӂޚR/jLGi#?Gd5mv1F'JXZp)+i݊IqD|K B]v^a(lD*uɼRĹdaP#ǧ £AO !1. (IRJvp Y 1fRznt`emb(^"oFT2$}#@\[M?(j(z,5gc#1dPқ 8x |T4LpH(auMJ~Ib3IِcFP?4"uZ%~[p(v?*a ؟_ӣZA( Y܌l,^QQ- ~PI510Tg, ?•W+OJ*Y1Q"+pڟse/_r"gO>ſ)F(4 G'qxm[g}8CNj?"?vAe$'ȭE8jx>:Xlʦɍ;N,̫nPztݎV3k7):׿Ǩ=< ̙ !vjlл/@K-<_'N93\;>tZy܉IC(gcoQ- 2Aքiw6&Њ8~d!lPݭ8WLze:/V EiH{xs1W0#\G@yA)gU =s3?&U5>-<*4#Šs1H Pin | m5>0>v+Syq;V'C:+$ⷚ&LI҈} endstream endobj 358 0 obj << /Length 2377 /Filter /FlateDecode >> stream xZko_A^jn\#@Z$n~ FdT@|gHrc ݙ3C`۳o^0h%<1 ͂z\O"0ͧ,'jkNh"VpU+ NOTm I-  J +RuvG-Bdпڷ[< ,H@HЁa,>90V4vO6 iыYVH 'ĩe۷9 pXNepddGBIZꏢo{<X? ,pEY@H$< \ՃZP ]*$INgQ:M| ]]_͐EV]_5ٺ\5'mzidqw{fo5XuZ``Ano"B1]14>md|2 W+ݩHm!3t_沊zbWϽ8;yg8iU֟s% `sY,&1XW;GN71> |mڦ6C>H0rZpf~b_S2|I'Ȟ}2 ŢL !//pSKxsozN@Ķ2RG7w= 7ج] bI?v^ehMٴ!Dzub uO`4]:@b8UL"*}0d c8Yc*GJıL#wh95pb"ѮHF /w61ߓD"@hpU}qؾdpĎ0DRHw#<3&.~ryGVGT*Þ/`D ̬j:2Mrp@J;sya‘=$4t"䦂XFi5kIsn6ʬn4@80glҼٺ3kuߤ- *r+/%3WYJۤI <9MEZj0?Pwes)ѕ[)]K LʗOFjwQiT;,eCls|ۖg'^h\ߔ`_Vu6ϋ̒`3gd '$w`ՠ>)(asO|ByDL^{6!Y&ػ: JYAxpwrqwp_LN0;mDX3wϛݚc 'ƿbAj,Lj׹-YOHH)@ir~s[O0Ows~KZ8FJ.r];-6y&]>ʞ{:ځڞDz˶6{p6j[GS@rdTEױ> stream xZ[oD~ R*aHXB, Qe=xƩ4M7C46;gϾ;RgyC&4gQf12gN^*E>ueu93^ęWBl<پ[>o/= 3kH1"͖ga]f:f":Luexfלd 3G].w_sPN&% ;sĻYgio:]ڻSP %7OD)2*:&6.FTM&~B: '{NiUpm DŽ3:Qj_mfRRwӧ%;^ A{q%2,%׼oc+Y V0\)qf8AI}\؞BpuE$i}4SDbr([њVgya2Bl[*N`2k.fMܾz"Sp,]\40,6gWg0;ȔGJ;eBHǁޝQHbGRժpleGN2#]ZN8+x.~)Uz 6qoA  }ez +_I\bxxc"QdƱ;9ݟƍ9:ӆAg!iVZ5-j9J^Hd^XOwܶ?n?%-Ɔ鮎vy*-\5ؠF 'mWn|vgM\/x~)-o _ VĎPMc#t.S|}tNwqڏj^lXkl{ʗ$q;JG˙J Pj{:w[C> /. y@ a,w6E=z8mbּ5ަ~_o={Hے}@{XT?5 Q}8 T'j[pKd |QH@tuu8Йg?P =8i> E88_OcڧB+/EmN8<4)yͪnv!Bpk~Fk^jX2T\m@tz&<󯛚Kڿ47 yaxp;v!s5zou €ST42vJOoj;UwSZX'1E{#yaۏ2u?> rgQMCK̻ Ey}?Kj^E֮ղ{m񎷾>OA0_]6yYxUDZmࡠV>hxxI? Wp{6iQS"~l)dxu]aO endstream endobj 368 0 obj << /Length 2692 /Filter /FlateDecode >> stream xZm۸B@ \bp|E:\[wHrr;CRov/EΙghhqjyqZ8ZG$ᑖp&:-wru2Xg| k#E֎M9$ܓS-԰2\(H%#IZρP#(QT%:ZG%0|" %'ۺ>BB40D PLVS6).$_踪KA'%'@^OVWٴWN 4ϋ:",xy\‹[;]ŻώFưcһ2w֯ei/h}c,Xq4RW8bbSIi0c"Xar2/c KP1ua `QіPO* /D4QbH"CYhWen$1Òq{F!ӹ KFV@cC]LO2Ϸˋ Ј5#%ѐMV4Z7"L}r+0E7z&_l֔DȘY,ᘒ\xt/@{ʾ4'$f$Bo#D%W{z "Sl9Rk>\ ÓcLц%OLr b!SWFIl)׶a ż6 !/X C/[NLHX Nꥺsca2i8NlNT,h٠I**(uyd~@}ki]Ϲ _?m;4*Ɖޒb;SPkC>j F<{ +p c d$rэ=phRCl_-۹ je/CceLW5gXuj+G$P VOH TM!|Ge#_.g  *?⧕ %?y .E<+ M`Thw])8@,,gꚲ&_Άa*GL)cvSn LWuRX6[?qCt,.y ` ^bh[$mb1frg6 B̖ܽr\%;9XI\_S4$S!H9o.` @^8L,.qJkўVIZ- J-6R/a `%Z I/Xb~jDArtTy1Qf((W7ÖS 닱#{N%c:P%alZ.Nd6=\1f~#l^`x$b$0:=ۀXq/ƵǗCv=U(lʭ|0rLzdOkn 2l)iN0ua-e1+GꉃU=vce#(Љnm8'-9$3*y+[@!Oɫw~GoM_%pm=ԙe_M8a_vؐoP>LPun>NrFQ~O`Dq #Z!LM`};)rA:h!Z|4Lwc~-zEs%I+.U$]h=$>~|FЙ]W!Q111^-N 9 endstream endobj 376 0 obj << /Length 2990 /Filter /FlateDecode >> stream x[s6_S 7fzwMNf&{q37LٺJMR.R%ġ<c.4LhG?*IINN牢Z g"9H&WxʍŬX_hFފ'S`9 1}9klډjR{U(ڷsރ|Wx*gw tg= S2xk(DQ& h7207i8e*nQ7~E,%v <%\&2Jt2uv7AOn&,aR BU2[a2$u,$Ȕ~i4 pBV0#p-etX#h_W/ؼ/*$7;+.^ל >5k%=k^/Y GRò(\D0PT=V?k}eE JZTߏrd޽#`S8_ #m =Uc~SA*_fEy W'ݴ~aO--G5X}=Yd1nʭ~ 6(,X beew DH K,PE_&<392e}U[B(`$4-鞳XESthcF'nت !ȡ5"E J^M#@V,P AY0*,q-fcC~'2#rhD0BA$ -IRL"ŚQĨфR:>(#44<ޣokd`F]z[E49\ 4GvHI)(P!SzhE8uO'spa)My6r+ނ]ќvdLSG0T1Ϳy|Ӗ]!$ugP@|^y0t@a P ]^fPxvm^쌸|Ҿ};\#;Iej'W~V,fX _@:"*.pz}^::EhѺfӧdm p8 LGqDZ?ej4JHZ 0_>^gE_|WO:P1gK`Hb㠺]]3vZBHӶO> Vd%h ɩN9x XRNR5SR! E,I %8 DLo>]3=d?]Dَ[|żV/.+_b[_ _^8A}?zU?FK&[)3/eP&"D"hQ ln)0){Jm<nѴLf^$nHN0=A0e=cbif(1`n'"{t~4OV.YHeκp0j136wcT_|UPCZgJ!Bzy >r;=?2\w ܅Vhqk_(AKv=u>gBffv:dW'FjkjUIvjUiۘn G_rH>,(+G)"A԰0*ȁ/4\/KF'XB_DӍbmߕj2;N fLPOIuY`QwUA"Xlrh E8$V=@VyzIxC$R~Bt"j3j:ixc St= 0 )$ 0lx1M{pb Jگ'hW>1(cz\`{ "x|YY7]n.!x:@{]` 0o?wke7CqZ aR_\\\J"S@+Tb"rRn{;&qڻluȥgip %ci`[/ڊzfq?={x,1r eXP8_|]7]bvkzP} e ޡmX?o >ޕLH%p;_7$Dw5}cϺ5y,.E%X|+Q6LvfuY8Vyфi—x?sF5focbJĶ-(, )f]aeTnl,;9#dFi>/tcI(0B! ChihˮnU=H W=~gҴtQM  Z ib},t`F9$ 35rbU&.3La*U0"6z93 Z\ڔXo(W M*ҷbr-0B_̂*| *V^3Kf辿=L^0RZQn8vqK%쇥>oa?|'`|2-.  7e"xwϯ;pJiO*ݽ}.A;TJYL=-v}Ѓr"иM@~n*F> stream xZ[o8~ϯ`co"v ;L:/bڲGN$eIɒIc}؇XsO?7*,5L.$%BM.O:>JDy9̋rY~ᄇ8Kf2~V}S_ D-^c8㩞̮N軖1Vdq˗ٗQҘKUȤqdij&W7IT1,/&f2}qqo*+YU\7Ŋ1NYrlc6WTIΌј`<r7Wwy<]uS7eGcyQL*á2UgϷo9bTz|c:6 lV`͍|5ŦWŵxcsOe pl'a( 2y_onB8Qf@IkmrE˃-U]y\z]mJ 4uI?o|T:7fH46j J I_˳ڕ/ZAl*E=i!vu+zu`!{5,b]GZ'buO^{?&FoGy𐁺@rQsW[{T2HlUܐGḭ+H02r 3Uz&iN#!礉j ;@ {=;k(9[RQF'qep8 N.(()Ĕ6.M1cJtI0L 1= TVG?W>z`pU>.=[*/ڿo@S D)6 U>w[CT!!{Dtzl~Nw&F>oO; #f 굿Ϣ<:_i,E4bI[TJ5fB $lq,(`IV(ʸՏ}U?;8\s%bj}֮ Cqyr_2,77>!pctlK3N~iٮଁʳ~b"1̀GZS(:+|nS^d~&- 1NyL/A9>@I#iijނD O-Ie h`P|#yU$@|b9REp7 E#:pQT"0\1I OG<\8nO jJ1f!!?I"AG(C('=1i D%`֌X:?VɔIq,26rȐOyJ"%qJT#5e4%Aar :~Q%et%DeX;ICB@ߢ$Cv N'Gg:ejiSѬdQSIdk/|V K2in ŦbcW C=/BO|Yٴm[\D"WɯXl;^G]k^ǿNWIXN{GS:fڈw_S{w3j /4uDZ^Wx> &OD;)@]W?ӣw!kF*r鎶EĬC6"dkFNu?EqeW@Ek'XD?mԃc(og|<)Bx=wP9&f6t*J9ZۣeGod;r []3Ѱ/2˜;-IRƠ+w'8 }V3UnQoJXKpEg̣.wmC{zǰS!V)-0Yw C hB]W':Gs[tv^_+p&q(r&gu],`|3;o (eg|4ٝg5~YW{nZB+IB|:Nя^f !+:w* ;}D"\oVWP!Bނ r &( [JlM9R!=H endstream endobj 387 0 obj << /Length 2302 /Filter /FlateDecode >> stream xZ[oܸ~C`3ZR"Eh &MQ`^}pB%44\(Y'뉳wo _.~xi/ 8+O IBϨ0e]ޥ'VnM:ot?n^J3V[+ h*Lu[ wz%Me׶.xY=vNڏ{kˬnݡn oD(ވHMƇ[j[ cXa} e-Z )8D/u S^ [fu$3hÿ6˷B `طm:N^d a+ڴA o@s!eʾ'p edG)7B5xBBݮ*W:wbg7\@c1aU9S4ra^9r9m:ZʶHEǼޘirv\<\ @ GBcU *Pɉ $@i[ٛ,yLGaY`ʮo⣯,!I0 B$=ΰ0B;űH+9TR6|طJAelȑ-H,]yU7YUϱ{Шb1/#fM >) yC OAQL:kp/Kqḳ{RBBޗ*#4lgxDdu}1&{Q>ACY !5'|FB*L//_fh=ms#DxtHp(:r~2ەRi.PnMPP >tjb}0[=V?Ԏh&y9us7O1[1fvu.pTpw,ư\߯ }{C=x~lj c1=-:F2f2g&zneG"fkJ>/` K. lW/ ^܌bOcz*STU@ww>C-nڹb߲{ A"ɈWvLߑQH@1/~3Lg;>}:kkn jS;~2,mxqWpsw)|lwZr30ixqIT3 ,^:؀9"d =HJ]EGۻѱ564mCo[-)Xswe΅v< =t̽Mw|Sr7 ƩXvx#93"<"\1b "ú,;gcv/;*1$n]e T/gJO*dDQj}L~LX̉S%=(PD;8]3SX(2bfFE]0i?l)\ԇHz|-8L]d qm)vZ4!fbJٖ@p1x] HEhF>6cuA=>1E0c,=xӸ0^kFlP d įs,<&0${iH+؝h/Vcoy6{ ٧1\uy7 u_V<}ւ] RP>җZT\DfO,\f!܇B"AC.JqC1$NjwjUŭYg(p8 ˏ#"޽\N z/t%qDl wJ endstream endobj 391 0 obj << /Length 2107 /Filter /FlateDecode >> stream xY[s۸~` Sw2&8CIņ"sp@iGz};ܻыA%,d],8VIx TyL}SEV\דc=Og!c Oq |:DP,PD%7U<$']NEgԬ -j0,7SS,2vgʽM5Oz^Mmrm+%azE,9w2Xe75,@s{؀S 9ιAt"ٴ$ɐ'fޠ`5N[\}<`'y̴^$,#`/RI-~B mEXn$"%J\ҽXyq{א(Af4 ^V1 2 95 rK:"쾲?,daFY&Ӏ TB6+HB4&D`l6[Q6t$)@־Y<[}[5fA `3b6U.i4iG@^B-qm @E_'-/ mƪ,i3g`CܹYI5+T${[.`@Y״ѡ.ZlT.-c`T) =vwk+X['L~RN{bѮCKAr[4)h=Y}^7ir$RvBf,qKSmk+,oj.`+%=?Mh&5ײ1M!whG^O۔cEvzU ;hh d@#~[ ]qOZ`r+^ qeBPrNPiJ~tRlI°uB? ' sY6rl h%S6cɃXm"l-}p&6 .g&.PE~7& yi6-Ӳ'b˶ľ-)+1kśwlV:Nz]Qɰ|_\t|5/2=WϩhѨ w {짯Sao_kv+8ĭSK2 -Ng//L4dgkR9+rG)Ö9i[Y|`I!/N&l=Ɵ]9){.ΌAT4S{7ONԛ:ř {`ⳗpi+IMG88=&^I*漢noy]i}G>,53ynҽi~Br^;vKW_!X)oȽ> stream xڽY[o6~Ps][f]5R")i}-(N's94.:zu:zqDT@`E49EtM2/4&:OY_TOaG# Amק8 +y)VAeN"*  t0][IH LCFRQ$T)!pL n&E^y5k]Bn0uYj,U4 (  B0Դnh7F86u9K/s,.[Le\'][|ZɢԷp 5".H[=;_u||tƉ=Q\FJL:I^̴'vDg^K5!BC E{& PD_F^E!dC<[a(+An "ɷi;~^=!#۱K6b .n7~kK;j~]yU$+M΋|VO\ `c67\o2ΫL/WT5Q$YC/_{]jf?ek<<>(t:_Qcvzn` +'F#}}J<{8+'I\N<X3E^Po\i\ġ`}i%x%z.,PNSL;uT2mU~2(I% 0l=ʆ> stream xYo6_6&U,ڡ_Ь=ŠJՖIn~G%K|5k_|ԑ<;4:hfxkĚh|)J呑p&4:~ME4yv^?ߣA̴lţT D& d_,V,YZnHlP$U:EzU HrTYZxP)dJ#)`\#jC$_.lw ;1Fb *BpTYLNgʰ̋,#M&3' Zc`0?g] u 4aq=mQ%FAV+o`+g@ptL )N}o0,t-]h;J+\Źۖ6* FFa'hWi=[gqӱ7b}%: gs dHav`& 1He#tW.{NjĒ1iq:zsY{{ 4a@YCd+p!"QFg{d` VxrgB --!$G=4像oߍ:Bz6Ϧ)]6Iz+ 2!եoo9ҿ#6|m6̈xj(s ۦ)lgfU{n&<ς-o~BQe)#ܣQi0;akF'#x8u(EȥSLy0sQsy%:xz#ReU@R&e:EIROi Ġ*UU"4rhrI&CIA iy휬/dbɠ GXoϗX mT5Y%mTsjGUjvꄩm,`i卵_`O( wA*_zzmzBӖc6O[MRLqt L8PF}(T*U@M6έvh`u,*R M(\8ƦB(Xɵ \ v{MSC2060c&vܿLl@}󃰟] u g6[#!z\:@ȲH˺tHl@6\6-R\+ Ӥ< 6S]%4P|@L)}B>*"hh[RFo+<ໜ-1n8,PfwȿM8̼?WPJFؿ@'qӯ.ZX?n\)Y!\/n}=^N2p7e~-軽~Sp#Eo4jF-0n)d4Q.qc Ǹ]p X1xb0sRiXj:Y*-]ϏLWawnY`[QLsˉcf̄R+[cf؜ cЙuYѐ\SPApo(Jl+C B(uENs`*3FLTV+ʼcP44JWDFqJ^ *F Am̌3z#+q\Cg0c*{2l[6XzPK%Sh  i+o\0r|ˠ62\ Qfbu ?; 'AiPyyPf&@{_Syy9h=9zu||JPd2ZP2d,"=e!6d|]mU?E͚ kE^ʧLo_??Tqݙx/Q[ endstream endobj 404 0 obj << /Length 2379 /Filter /FlateDecode >> stream xZ[oF~ Dt-ͦm1 ZlfeR%{P"i;qcJn8\ofH˄&Jqt(J剑p&er|u͹i^.eQ^6h'Y_&uo>=Y_mT&#l\LQ%u~R&"1)QWimQWiM*=Ut]fdQ]oN~aexZ lϛw0_+I|3=d S.n\Wy(9@+2-aM~sAMƞ@,xCߙyg}%ڣfbPLg<̈́n-f }(Ԙ0]?O 0IԞ9!A&l'QLL~..bau2<[6qL53FӬl fLM[]FG &5a\Fk:߇-!|#\8@Ԫm;R6_AA9jb٬ETm3Na 4qUBi&}^1 ?;~wɭy4Y'0 q=K QǨƻOṖmK2}O9iFff,PBsڽ:¸,~f &ˎTxF h8L^Ȱ\GeSM9D8 D)iBO08럛-Ts r{ױ?2(  mF/AX}>i{!VY`= hi/Y/Ё!nd~T\N,WCM ,b`%p֡|]m? EfP kP2tj K xQ˚?{(7Q}OApHRx,$l$iPWSaVT$ +l(&ID%=Iyd4B g2&;"9%ߓH@| үEhe'O4]e p/z.c0\Wl6SޔZϥ%.\C>aH}D)mQba^r zR7j3 fME'[莚F,l "!s70 /!tkpP!_?P4۪E|>XaFMe٨Chnfrr,9hHJG}&+ ᝐ H;2҄`3AcV8!<tX=àhB… T]H{D+HCD+\qcn(vTu? | y@ҭuSa3*VBUZP]\Sl 6}$OHB<eU8W]e~0@&;Z{b XJV ÉSW@E|w 4 DpK:%M&47{Uc+?=_wM6Fp.t]Xw>FpÙ7ό-t UfEQHMxܔ7Esڽ}pbtHKp j*F&bwBCV0b$w(+wUƋȭnFgfrko30YѼ6/BsGY8lJ@:4Y8|'v5^Z$wā\ + (ƷѦRfR|{zpy/=Lq !P`$rʩ)LMMH-,(>S(f5lpaԜf5HjvQ'/z6|񩈬?etxX԰&4j3>C7Tcĭ閽|^ f;|ԨI*u *RtSz"<~NS˸vp.j,Vzt[3vOr@ ܟOP{|kY cfVH j${>kS^IF7ⲨJt)|}_=Eb@Ԅ@ƖՆ]ߘ mN?pW!`GO:r<== GKp'Th9fy endstream endobj 408 0 obj << /Length 1636 /Filter /FlateDecode >> stream xYo6BL&oRACi}HAQG-9?~Ǘ#v );wG'''{=:f"Q.Lή4Q"JXrvߙ2tj겹b=6Z#V*J0ad+G2I )8Rs [qԩ] [j::ۻ#'$!D#,Da,rg'r Bpwl\QFgrUeɰ@4N~ {u^SلIF`cL2i:7ťwU㪩0MN&˲qMi+EK;/E9f-l4)Bhez:_݉>Q݁w2=BsĘ@$W"H;|a'!+Y'r8$^͇^ͯz7vQp_?HW.܁(3|[-~.&柪~w 5G]3iF%-`ju;+#/C0ihCd&Ui|\y458r0-잏1dI\N\!7g/BT: a (v"o?:&,A9$qUǑ/1NLvYj>h'x TH,f,ݭŀռ}$ä#D|A 6D@q?sM |B јP!BB± >^w qo!`c2A&$1!H\AK<#6FZiq1I_:JAIYz;#pص@ed͈݈*E0taa-v[8[Iz nSwE|kFs嵧+&ոbSجo 9Gܘk$_i 5y((F\+$ZAɓg_2!Hw@@`2DB eC!BaPc4Zj[>vͲn_,Ӫ go+P0e3+A,:r(Y[ !RAj k%W_5#'O\B.By֔@}շI:tahrZ/|~;b/M]LMkaiY ʱNoWV b"nKQ]֥5Na(CY.l%hq[3OئX<=Ō($ 9g)+ _S5 z9 \Τ] ud!a(.$ۊmN.ls( lm lnl!CC2,MTS _v VYXW_NJ~wtmꈅ.p]?6Un-zWww<{+bv9S8<٭ƿ:༹Y.!vY/fh86u35!COk}b҅ԉ1&nȡ@D>Ω6Qr{> stream x[mo_q(Prw hKi?FqN6(' ywY>Q떷o3>3{ūOvv ϼS]3砰 Y]'W&u3]^̚Wg?4зO팂58N4ǥrv?SLU/Uv+fMUgOWBb WaΎ Ԋ%GՌ׌s]LGTS0Xѯw1 `xav4%SQo=7\Jšо:7Yш/8jXh|6Mujg[X~־U1N Q aA vU5jvmPq $; x4#83zQi?nGlϢn"o8LCzq*v=jduwQeX4G]M_f*vlLD$\&'aFBUf &bz dG#;{EKÁB39kbYg"|~q9]^7z8k/8Ǧ5N{Q[ jE{v+ |ta[aBUp5 [p;{ggSLpfi4C$|"SJO&=mzwsrA .cJ`̃j-vԝYmrA= ;v ɄbR結 YCrE 2krAgAuŢ$qV=:?+Fjv5L;y8U F);JAB+ :[ n38̚jN cIlXj_V`RD*]q]'B]kk^:6]/si(E+G_5hSϸ /v]D܅UbąXl"o/}ef2"ܓ68Wt4¥k:a=34>2FX yFŞB~>K+8\y 7Z[y@@3J#*Ԍ(֙SzA1NH|-/yq?xM/8/N$ފA=hŜQ)@@4]HL1_sLOpduY"2Ő]ב;n13>J:uuAA|])$ o]fHڌa^fYHbsCIKaY}v9$zIjݞ^U .>,gU{I DK9a69.=Kps;wxnO|F?Zթ6&es7d렠zfM4g䭤 e@r.Avp_6cڪ?궞>~gGM&8T|UVEY7Xɻc!ώer#-Pq,c6bbd+~e-!-t2&ww/:@S$Óx%J@>˦ftMBOU*=\DwӜ~oı1@bǎ9IsA) )u!Κ!?Y<3Uۜl -/bw*4vZ54 `ݭfS,0U@Y7\Tݿe9;󲄓YYeYu^Dv$dwIHM[nh0:MSKcːg fC=2M5?h~T|KlgK6$H_ ~qH$Z7}l#3cŹR: 6=}q5CM5@PAcA%.Gk;$ u! 6>Il.t~Jyh {;ev P!v?d &Ύ*9;-+zENL*?( ca3 )%aoP\Ǻ6^:=ɗZ}z"FKsLH˥?WXF# U1eWz{ȣqc.!~$Z" ԧ'՘tXHD [I)dZDR$EU0I\.=]͇{o!(5z/r} [ endstream endobj 416 0 obj << /Length 2103 /Filter /FlateDecode >> stream x[ko6_!t&c7Ţ m{! VuZJ~.)Jy ,@J{yg}w3&28< FqL)(]'8Li1rrrba 0X R%RT< R8ZA)kf8vU`!2*piq@BbcL{icW{āBZ`jbfd8%2‚9: ^@-[oV2rIN7d@<\!LxKتZ y.x\ %"R @n<,%< \,p !b  qƂH̝$ILgQ4qc,0Eڶ8ˊ7iu֙lYVu|Xb0L%t+o\ N(vhn22`(N B?27?^/>=ˏ!"Jᨧ}o5ƶ)BR']N(7znfPTygV#"/M0>5R4_(pjcMX\"#|Q4^^̳cifcǛ5>e \_Y5kY={SG?u (a2XG<&OϲbV_9H?uN0hv;}hyt,.ܜ$( w[i#给N4p_ĕ}wnb>j%P=jb"l1d%dmcڲǦG>!aBoNF#Q$cLjwEĄhrTi^KR19 LEC$& dB)}21  aas: #NaY|?_.j=e*e:1#;͆ iҨd Fʜ?7!2DZIgyB@f,F$V-!>]#D&)HZ" "`fؘ5U}S贸̫.-v2ԗ@}z^Ly2}\=(jv +4J,p@Y!*qJ [_!ZKI_IN=N\rTo+Ja˜*%UX|~Gap-ӷyHK:u䬩8JԼq= M1`<>;V>ζaXU~WYܿc]lΞN{upQ@MkTLp8=_ $-B*('Z i$=iߡ+B,79k&J!Лa]A]kD|CxsBfW0^k;RL##&}3uXPNbk\)ͨ]UUjY~Z8@#eOڲFǠuz4;͚dz4/t{(px&ip嚳$R&n@18@]p7"v&..mBT4 dX\(];Żl0Swo &D&g3uwI endstream endobj 420 0 obj << /Length 1945 /Filter /FlateDecode >> stream xZ[o6~ϯKY^aabX6KW $l)(Rd;7Is'~>6$lcK:l.xK"HeAa_$O'cs}*Yi.gr^M̧:4ePhdpaLI((ș(HΖ‰k+ڇ`=}yrRiIDسm E_Pu>Wu__Φ8-*o'(;m.V:fE-nM V /1Xׁjz^R~uՑWeS:I}$HZ2R|: F{"c$gAƙ`j/' ֓;P2WJj+=sXgUk?aZO"|UEx(k OCv9g SN`/<8Neټ^/&ͯӦjvLI1tTϋnew-k2/ 5ypЎoE8߀H|cdf ;HN1eƑ4 8zSCCǵ`pޗ_P>N 6/'tH>\T=+vmnT(B@Ǹ!v$k}{'{9ĵo;spYz[puG!?&J\j["KY]b)T5Quجg^=Cn#qQͪPe 7ۅhANH1Nv^I]41\e9}H`C7j6cھz<6U&Yj0Yy+Rzϐ4/vSUH\tcŽ@L5dG JJpF ?I$Sj6+gZg:]N~_ܽ.S|>̷~ભgő}{C m = w4\y W+ŮUD7Z]LWX(hl.(,lmPd7.85857ofLg#G%)nX̚Nz^ ZfH_D.y;&G*hIjD:8:-f}4Ӫ|އ`M&{譻sy"T+&r]х+@[9HwVULG:bl|fF5n~Q I\30/}hȁɈ1ސ] z\b}!zw1w10dPVaowҵ"Ћ}+ euQv{8: R*{K#%APV1E–2j6 M]e@TCIث endstream endobj 425 0 obj << /Length 2008 /Filter /FlateDecode >> stream xZoF¥|QJ  !Es _}g_>ŗ&!nvqqW;/v2d$Q&0ҚfSD [/ɔ*j<,fa =%G4rDD [M;2 tܜYh6LО(l&:Uۄ翱N<ά J823s[GM[TrBU^'^4k :^&/bfGttQJ"jVgլ-|{$?­w1ٶn˽;pFI0 "I6;q DʸMVh珛 7}2݊aL*v~L%z]M4Zgi%Ù:GJl[/څW9,syzthD-ON@gaįeB0JT)?[Qv89y9I0>}:vH4}"PO>2y6eB%qjBz$][5gmVgH!9Xy٢ RR{j*C iY-uWnx &-m]dZ.M%KSvEwA tO"(fdUAȑA l%` }<%zTp[`[7yyf/,bI幫-ip*H K1SU}?AiK,iPfkq6G!Di[}Jۏvч'B<x,<V@. "y5LIGa؈kQvtK;0"@f D2=N zՖ 1>CY!ax (nmut.3t_B٠T1 :v,X-N}> stream xXYoF~`pw<H&Hƭ<9FAK+D40ػ$L+ gaN Y $5MMJOXm?Xm'Fe]S`ͤ Q\D eչf]8zLyEۭ IV,ܬ 3!oS Wr9"߅Aң'Š?j\oܸ[Vo/jTѭ~m_=J+i2:I?dݴe9󹫺vF0SV?: yPRDʦ̦2p#أV_1{q1Ì+($wښڪ14L>tJFPP3]ʱ_ L/l`QtMlKz5XNC늆(iߠ{18;{)jZ!+|(͋KzɎPÁbFsN5U Cڮo7aI#hԂ@Wu7"[1C9&D ,0zx Ҡ ev`7:FxH 6΋5鶘~ph;ۚ6pK:B *$iX30(^:B kLiCY/P>հLgM1:IDj!'Y]_9 .q!8G ɫ5C/EbC&dl';ӽ2)R)Bhrt"@5&3A+U9B!E(fUQ HEjֵ? ,bI)ȋ%d JZo3Ix+eU d{1 uzBU0L +1+58;~ endstream endobj 433 0 obj << /Length 1825 /Filter /FlateDecode >> stream xڥY]s}ϯnu>}'B *zp(aŪ.h :U??]`"zź֥{/. ,6_*8S0q&P.~yo` PcZ2?Ѐ5UUMQU~0oWAmz@ E;ʱl4x>|R"&O ދn<{`3.,x6FD͇7 #l+jC1f'3{QPgq;s_|-(3S$p5VB8nJ׿5BqIj[wB'Vu` ,y6Zfu PP"!UIU:.&goh ATgb0 G"qJЦ=+UZyb\1‡v<6S: O;m~QJȮtB?ߦ*j}dKmf๹pۇ#]jPy?6by# }{su-[Swxi+ 3mR!eG:P${GSd]:NI.TIPNf"BŤ97-;VWT nQW[+[$_HLrjXٹi^25>VTxUr~΢ͦ5܄:<ĉmRá0RuU=om)wVi|.v0ʽ;6%qX=|cIGyžP텝` sω*Tͪyx1 N T ;ғ* 1VIP 4c+0a|4j  :ыid*}:ϖ JCNU$k4|J@+[@1=mugچ @S*M 5sޢC+w3H8p4 kNcm5x55_@ًd*.xW2^`ɴ.;5o&Cc {zӕI`-$-rq1}Q}%fym\Zc5NΜ 8<\Z..|\OvljWĬUT*uw'ȷv`M^ۜjgc&3$lUGUuM ]LN h^=ۙz-gYNrKXJ̆" =~i_O~"(9 $m򣟸ƋC| endstream endobj 347 0 obj << /Type /ObjStm /N 100 /First 881 /Length 2061 /Filter /FlateDecode >> stream xZk$~BɋZR`{YH Aw[DFB%NwaHh2,j@SHK2^,~^?/ݛfyA| fEay]_,o>_/.~s{Yߢ7vˋ_b6T[w-|p?o [Iu٣L9'_#w]XZ@<3St{ɖvw vw@ hcZ.>.7}(nΉ0: G O&M:&6³Cqdڇb1yAߍ(tً'SSRу8dø;1};paqk.u>냋p VS\>,䞐CIiGxKqO]'K1٬LVzYx3M9mͳM'<(H~|3V'-3pKpn9*y>y\|ym d~-oS1 a6#!R: /JdP;w䱭NM /)LObj9*6u~i-Pvm5C׾G`crc [f16?e*}yͦ(>VeKog6<2eI#La->u>ӅbYim>q6ނ:husۃ jzTnmAt- K#La2zjl2>=a HS>@k[gߗL(crS0M[y8UE_Xm\!:]i};}_J^eVE:}}6u"xUf`ۖz,} jRE}1gnjp0m0M928%5}cCߓ'~lj/uK}L(ˆ˝I`z <7~_$Af-Nf%K,f m/dsaY ׬{y߭6tR8FeRfdCצ֗,qݚaST mh m=1Jݵ[SG6v R_Y ^$&˞-6DvZ5ZjY%qslɣorn^nim>cb1ٝ&SmV7'aF5(iuس}vn4r+* endstream endobj 452 0 obj << /Length1 2087 /Length2 7410 /Length3 0 /Length 8560 /Filter /FlateDecode >> stream xڍe\ݶF:鎁Fb6(i;AAFZB<!~AIy( P`0/w wDeLOӅg <Ր60m+C!`(tm6!n0(p0OHP vNp;@T%cߕk!ܜm`%;sT[@_WUؔ_Jp; wA77 Q oTp #PcD7$P!q I!1A TnP!a 5nP7R׺!?$R׹! nC"BbxC\n r1!T.P%hkvJ A7vPZvC}8;d :PUJBH&(]=l`j=V?(2Pn6vXP7&T57@٠-DuS(/?f\B9HPਃ}I4p+%Խ)IqkPe?/E܌SVǭ"Pכ"kEH2CooDUAǟ{v;Qx=o! [GT}n!j*79"B?e(i#nXulAkw㲗Gx@> ꐊ>e x:y _/7CQ@!v3S;ORRi͇i# 5Zvyn~Axq*>UX  cqUk iꞭ]5Έ7VKo7L Lk,/ۑ#2t;dB/39Dm &{eWI'ݮg RQ?4gX (}j~ʝ{_2GIoߛ@LOnwG߹K KƠ6V^,#n38Yv woyĕC-_[MQ(Ȣ}ڵ.!H[8q9&y 1T^)i,Bؔ˄؆JZ,,RxjL4QHd1avi9 K1pj㌟^=5-yW8CL6;g_ipb3&O}:&W47eGo\ĚhnzOч^nX xm![$Ip $≯ngqN>L۲Kb&<õc:Q!\ys;4jC:4̣/C\{ `vXTN1|&ܮx; d2>W Fi<+MyjH I9X[mR_tka/x̨L[t4vꝈ=l_Ux>KTƷs}E,tђzYʲ^JQ՗c*>1$).]s-o&|J+=꧕S![Rens34|!rc) _6B% Tr3dlXz(J^EEĪ?03@?);!:UغD:@vߵ'C*@úh33.qF=Y'J4"@k뼦-ͫ)oB J!-/|NzNt#}_o[};̪)75<I$NJs^K7#neAq qzc惬 /k;Io_q֨a!=.lg_e[Plo׏u1#?20spCj &-0@n jbu:܌o_MhΞ0F9ApWB0O6eglHkob] hVV"}8yg,9u*l^9n8 ت4Y_=)ޙIEO]RP5tEF_[ؖ̕!AOe eT'5Q/3IqYS|g "aƛ4 j/} v?$1 o\2{x|ьB8^yR` X[d*% "N ~\Uܶn/cQeyaf8p}v\z~iK/LnfrlY31Dh ֲYXBEfА/ #,VtvI]MVm (\_5c7rQ,3j(=C?h=um?ILJRϧ\̃p>[HaF׍|֟J}i:,K(vQ#bj 13)f, A:- I84:!Unz6V>m)TNPGzmzydKVĜLl70tz5 M}"Go0_07TH3s=؟ F|fy6T |Ŀ3D˨YaT}\t*k$Q8*3 yo6E̿bᱍt=hg$']CÖ!ofy:VZN4Y#=\W)f'0 9^Qُ]ĤR4idxZVCŏ0C"b69{3 VW=zMsکY4KlɚOQ%Q8 x4 "t !O/D"1BItw 5>`fKٯ @|bI/ nڮjϝrE ʡX[qQ޾ 5=iyٳ>^Iq}ԑ)/d-#Bsq&G)vin=!%<-$sJhU(3:6b%|>EɽNx6yñytA}E_ Ͼ,,sEyXuF.GO2==Iw#fUʨ(WoU'K4-4.c3k1$V˻Ţ:)/K YwvMzd^qᨦX ヹΩ3Ϸo_C!t. y%GHeWȩ j`i*=Ck|tu2Ld}Gb\SJN@gOݠϡLtD9af3[gȒ!OrS3;'Z{iKBDURo/>c5)n7,֭J(3T󔻃Fɲ7NNn:/Coj1aι%AHH+U|5*&5{eGĔ@矡UhK0Miʨ m te%PnTV];ȋ |}q #u膌LxA-`N\W'/pǢ~FCܵ=?Zٹ5ru/&Vi_~mtA 1yN(K+tD8u5O\Z~aLz>© !9%AUZbʞW;_ Fm-)x}z?2GbP^sVi5KyQӘvYjeF؀@Pw^ܵ[@"H|U5$./j<"4y21m=Eh<1^f "jZNk 5 xGq'YK)?K|!nVRX,Vk/ʡ`Csx{|S)rVJ {!9))[i?Ù󀷠5rl{W 쇮3dRG_j6YL#NTpMISqg!G͔$U<.S I|,q"Az;OW7W}T}mY 11IE }~7:5j_+b~;D#JۿJs_zOMZ{)HJ3\kة{*Ii? c w=(J[Od4s F8Go{û 4w>/ W5$Y>)Ѣ{k-)2F/OL\\1,xՎ!PWཬa=z>@p؂ ԕuFS2RlVij;5gRK@?d1TN"5n27ϘuI/tg`_7TI)]>@\;"))JWK͛N zk|L:q\yE js9|iI,Ѯ9KLCUz,t뼏0JeUW? >pq{RlkUQA~k&ؗ!" ]0t*dz0 + n$I¾{`-e #<ª /L`q/Qc۴T%ʎ lpμIjQm,t\;WhYǮ J/J<5zч[>0Rfl o}.FA <d[9oIpR uT_.UG,b\ \Xklb=d}R%3E~r{Snj3H`沢 Npz`N40[wC 7=B: 8 v_OoSGS =DSy&p"̗glkX%T1+lE4.3Q$p d<}YG-hQPPzRC")z4Kydd*MX$y6(۞QV$O$Q+qS-J S9 ]P=eџqr-r#CnsOC6uY- ̰8Ū J_O7+9t3Ǐ.Yo5Q[aLS],-18(J4JįP m[[hȲs6fXF["2,6 k껼"&8Ϫ8Й{;_Lp,I\zOSN&^r3ۻqA5HA4[DDA!*x|cΫEYZZ:QI@1tIj'{-rAǫi|M{Ah'zO~Q*hynkWt{Uw,?"mb챊uĈ0.w؇b9Cpi&"ipd0Q86a^ "218-f ݕ$N^\twO NWyuoh?qb/uF2 7qyo|d*<=4b̬8 .CkD(MDgIxc$cX֞kQDa.} ^ q*@z/9Yy &{ښucM뷱,=v3I i_ .r.AJ1{~eYWɗ:)R+X#u:b%΍v1Py%׍ {Wey;qcS%~6Փ)[`{J j:jvrE`y,]LwG=0jWnkXYLN\ݮZa#߱y7LƮT}0GM@"'UzźJ|ҏ.Qx;b>Qa~fR+ulnYDR7Ϭ *YtEWҋR%N*uYceܳU@W]MBjk E#X=hS)ej3Qw Arߌ} 6LX ״XzΕklRHM8ebMxΊy4&JkR+"t3J`;j%m̀ #ӷң+G<7U}}msL!ػ JjI1NWM,J>uJm|SX (:ٺlad^@C,`.Glxߢ˷H ^jRX}=.IݩMFf}?d8٦J笳٢e!&՜enhَ^5e?WA!u!cpШ**@T +QT>liPIyH3{r"D$|8* 3{1)Z+,u_`r~X{O>ޟ,'9tz+l^M^S:yaŬX:{Gzx׻R\i]mf2\Kw™9O{U?xRג|>w|«DYőott6LJ/Jg%?~bLz=cMrs+;N 4 M/|' *pox~y CP5]9#Or4e endstream endobj 454 0 obj << /Length1 1994 /Length2 8802 /Length3 0 /Length 9897 /Filter /FlateDecode >> stream xmu\>LKw!ݝ,.]J7HH% ҩHwK<9s?kyQkJXA,+' @bevU!j gw Nh݀m[w9%z-:ꪸ@}8'TNN `Q*!Nۭܝߙ`;m;xXwUsG fр?Q7w9x_f81\eA^@+u-ڕuV@q 4δmA`+OGz@Qh?`ӿ˩ʳc bx..ިC/J5!n?|v?#>3z `zFvg$`>#Ng`FvgeWzFPvgS}FP>?OA4OA]Au]Ak @? z_͡#n!P''T%h?fݏ9m? b qt| }ZZA]r/ ?YjW,[?gzXagb}^#k}.) B7$+A{Z@$5: h0 {VM?*m4'Mŵu!@lݛ~a@__1pqeF|@λ[!m }Ҩ^^BC϶.H8dV|Gw#z"d=o@ܠiUjX^d|&iRdPlOi3:6%IjbB7v55|C$s2ҳ$@2_yĕD0_kMM_U!.ܯO}?nQQ:p.9//o#ׅ4[ih8%ѕe3 y~yi0ە {:\V<[:OD)#;-D|{l=bei̴dz;BSOjW[i qJsezDHWΈI3B%JɹfYXu|ru YݛmZm6)JO /Ş~dq bbϣ'<(۹{zRMgwK,Bs,`:/>c:$ }R0J_n[/_4_GڃU*o f5P.W ʊNDpldJv?FN#va {@lq ~P>J'7no4r ,be|R_V$**v_B,<1"(/ײ7MgM=ݏV໏8j%)kwu C; K}I6-ԎVȻ2 ]MEQٿ 3鶠~'bo2IJf JU^,˵9L]5{*wpiQ ڞAUϭV (t0g@匼i|;O{F.4VČ=l\0Yg̓}{auX{0A޻0 8IE6}/6Z߭DLLڃl0,U2y~ 49/}M?{ԳScn}MDH[*Tv.U{Dc~~kৎV/Ρ5oge1'ĞaT0Ǽg"T~f3rY^'V4M[ҏM yI3S#xە fhdjb;G YMp4~a)֫xʻ5;( F9E&uKC9;"KjS{+8u/nTb4<4R/ .V;"B2MDj!qDRQj1<YSt"Z\[AXC2%2DnTi zP<,j!լ ll<[ } \;Ј],uLʼy?"G!CaJARP`B=F 5Y\I#>U'k tW5V5t'W-RR|1cH3n[Rc$N"X2|YeB+hq`M`w+6C.%{Xw"h|kO)%_OW 84F۞n;ve G3S/ֳH6I5{Y;bŴ\ޯ3Y'}/,oa;o0֒)cnѯ:-Ҥ'N1cC;R"%=ɥO-L$^q1DɸǻyȖ;P5@lNd)Dz}*"yw1!f*%xR2hqsQP]_ &{~ܬ]uaV%:Rwt#G߫@?odl -eH!cixBlEM0&dI$p4op䄛/ogĦڇMe˓&6 ?,#iDhE4it m~:c}}u:;x>'%5 OK9fk? .@p jRට.\ t;2=6h^W~ᄏ(FjLm/2sk`hm1t꣚L\ t'&]/D~A9c1p2YG84YDeE"B MU@qQZG1NEηA qKXcM<#E)0*ͺL_[&n B4`֖m6YWI9[ Ή1:f{2Φnla,ˡ.TȊ[L5F(2OW [SAyx=m<ĻlxJ/$Դߥ-c勯;i'wB`sggh~]#PF pǪD똖U͍uG߼d rǙV򓖒m/0!# MRv8jq.s+%P/“7 %ɁuqPXC ̘Q~TMlzy:ogOx3T<}VzލQ5)1ZxMhVUՖ=L_6O鑕InEx(i$ev{ќ=\¸4L?r2-@ڴ U%\TlVyirb&DoOH&09q7VԽFk ݷ95=մp)7D20C|j+(>a2aUC& ?'4+fezw=?o)3  Njܗz^>]~{^ةm{~S>?TUP嘬8L[{iΖxy5Ub}3h4~k-vЫK'{YAcOeV ]?Ol~{WJӦn{ \v 7K朘rY8 8to }ث[29,V~J%ZQ :癆ab_Ǝ >hWmW%Ip%dcPCM^b,1nYG#M:v1N-$)30d., ԓ$Xch5#!.{̌2z5Nȷs! =I8L {ך9Gp?#]pm#+el*nII;Nd#;Sp2׺s'ZqH5RAtʯ  ua(R?d|L,jg#!HBE#IbcP vPaQH`2-8Qf#x i{/FT`VK[ӧu̙| m%eC[ItPe_fwk%Ӣn ==9#o ]{C?ZjIZ?d5*; K*tp[ZLR{twэ/CdCY6[/y0 K=Ŵ9eJda'ƵBp T%rg^쿝_c,zQvy3n~GR-bT~`k17BW֏YeJ_(uYybJ@/JcߢD ӥ"Dz +x<^:E/Ԗkh=e:IcPm'W Ts+FO[ ~ܰUځ?2\I8J 8O h}s6X)T9;0`Zc!n4G:kdԆi(&TZ?isLbQ\.=^϶Ԥ?HDE瞘A`ɶaZ~N@ SYO>.U{Yb>_Ĉ3symǾ8 gqqV5L_N7S;F#Hf؛ BsQ;4=|Q831BO/k-8NBe]7|M:BgY:vP=Mn$weK8jE"ql0fh w,T8{Px9r=SeĸE)-><܄T+`ޱ#S+Sb\ UQ+UY8-MM9`;O',et; o/q(hn(xEVrŧ<y9)WqmضbF5UŨ(O2J1C'Q\n!<+>PK}>Nae_$29ӃTA$"Xu9?gLbK)@.g}iK5|V0jSgBǯW'Oy0?td?T6tq'" utA~s̽pW0:E]YD@*NhTH(&ր>^h#>e= b 6֠cn.Ē3)f 1c=sC*&LlX3Y(Dn<RoJ qY-dM32d.a&2~'fƿUnF>͔$otbufL c??E[C{ྜɢ+<VV[}<)ð=3k LsFoݠEODU 0?7й% Y;k׉-*+aDإF&vYg)'v/31>9l85>M{!,#'˚>,K)ut13#I=,"Oc^\jA ?){cli:sYMdĂkZA Ʈj<v{BlLָɡ[v0qզ9:#6~0"#cH2אr /nYy CXpxXŸF7oZA|߼?`upWRkq7Zho|ΰ X20$pʯKywEi};*G!~mctd[^jL˙MҬ$3kg8᎐0ͨ$OYJpg vr~z⢲QxI|t߄3-?݌"Lh)9i%iY) M柳+ [6t[YJwA5THʌ<|H-h^jV%A[ ''"ͯ Nvf s}ټ^)jq@5LDp.3s ,6a@^}b m=@aj3fYLVw6尧9I~z ~G6EA!ʒ{1ʸU fJBp|,dzA[=|֛y#mbH Ptpn U5d}[ċ>!95iy0aUp{KDRc.&G-Q':0,`Q'G0Ga_]W /Cǔf.@(J._-caSjde(`H<~~|z)IV%縊:qB2="D~ &振yHxDa' kV~?bf~Èl)}\Ѻn,IfQ+׌9ؿiWXg _:2y!NlsoՕ'9BW6b _)t:wg9ek/{B7ؖ=> SQdO"ԱN3WKj;ph ,nr6H K7DV`v4~h{M{k2A-;eXp.ӣ^ '6OHieA09P ^pQ6_e99IIQ!uuz0R*nVaV&e ga,>]?o h<)j-.?MTwHmw'o(Z׾ ["0,gyG-"9!Qg/JrbOgiCwri$Hd|<-+o#0 E =zQl+xoQ, C~\dž` x>fյ:p9܌Cbé "Y .QBdh$t3z+7eȈ־e={k1Wo! c@R.BKV%UQ1BH~4&Ü :P' mf'djV cYd#rpu/e]0gs'P\pIH9бʟ i çOdA~p4 |O: ĆaR>7̀F]6X%V_/v1؟,^VOGfT䇶USx=G2͍;NB2&!\4e9mSOȔ 1Z0#샱3}t %D5iyQ!(gz& endstream endobj 456 0 obj << /Length1 2842 /Length2 23344 /Length3 0 /Length 24967 /Filter /FlateDecode >> stream xڴuX=Lw4Cwwww4C3Cw" %%-]! H 9s53ZJ mVIk%P `dj[99XNn.6ZZi7=$c{ԭ< AZ<t8U `{ZZC@=Iyl)6#`(= X,l`- Rfdtqim]y,A۲t <骲::x6:2iT7?;!vvooo6[Ow6-?t`7G 1 kH;=*{S*V@;w_NgH+!IAӿ@YpyA +H;hM/@oCoR`^;ZxY</ rwpWE [=cSTSaU U $eT|NAdHeA`ggjw퓱̵# 6 kߝtaٻze/bBcz8@Wʎ7? iC `c B~P-7O`ߎF(k{+ȠC ?A6`%v0sP! rXmP`3[qN?ZnNwZk{X+zX@f_dl?& 2gG|rAHy?j ~@C?O{k{֐7ɿBT- ǘrqBϿ3/?_RR`VhVnrps1OZ柋7V}V(ˋ`+樲 rxZAJ1DNB*xQhkH]XEA$(%Tl@і\ZSEj xnXRHy7Rna lV{b;9@wXZ>kG*|xO-xnN8>KX]$K]/xc-% ƕ\zpwc??.:3'z=eLu򺳥BG' qd͛8{.*OU YLΡA=5,FwPs79~DSa<&dJ>Chl3Dg4Gx)E|M\dJ't)TזZpbZi /՛p*=Mm ;%6{^>F4p;pP1/8N&ގͽ/ڌtgf9 W\RV3Eq=H8A#TmUwHz:5q72>Pc.n 6gWr{~Np-|ہF}?&uAymvenۢF" !EvEoj62YrΗG՜֦dK-W\MQ/xɳ \zL rН6)2$t:kA2bo]=w HX\p GLז piDt6=x )K64Ѷˍ쒩r[a>,{;<ŕCd)@,XI%:SK=qVf{.uxyᒰ@_t9y7[.E2h~~%/C1St&,mtb,Z=dէ{š놁ͤEmŇ_xFi JۓæDx4AF ge4YuHJk""Jm o&]AE$6kyn=_O9-=oʩ==~Mrj]6^y] -aךUphbzʮ,0uyM j5ө{맄nW%)0Xl?lCs-q&0$?{yUG@[\| 3bfԋ[$xW c2ͿeC-@-玄iiJ3}-gB>Գ:jvH{DUToST7 o Iڬ0(vAv;0e;S24FJ#,53'!7δ(;,ͥ?CMkuO/4}bi RUtm&@bMzRH[M'1oXAS1bAfm[pyRw¹uo0$"D[C 0MAv%o6FCfܦ{nhUEŷvIJDHhS/"Vb:zXڜCk;קTq75Ħݪe3|,p?p$1z ڜ Uߓw\ = ҡ| _U`@f ?_=Z4 `}3*M`yWNq䚿0tnXػbQ7L\Їee* K]U={W!jCM:LvE-0S6u'IvtE4+%MpM,8\g MFE[uѡ#V+=]>#F\|GŤz$:0̱TIYܾ|J&Ll0C61z]ĘgF@]0|8}I*7$P٫Ez۬P[^,о<..`Z!Y Қ3x i-XU 5Y?f2(压KJW5$)ϙL 27d qZ TR؆ U5[`ʯ?~Frb/Jqh͹:.8xR~̚$=qr5PQoN]} 2i@Twf8}xsuuq`˹OھvKKՊtoZbwNa6k7[0ULL6ju~LC`ĈM8>dNP6fŲ9'E|||FPDyȃua#EdIZ&`2S}|u:c 9{/:&R<3 uAJ&mz=ݓ}u߯Lb2'Lp$n#PBv8&P32-<Q&bDe: _Uk*`#:h!!$MK&(Wѓ} '-K JUL\9_4̗R<\ ;vV(DยwҙFξ SQ<9dF_FÛl}v=i t?p~xdu8 YiӨ#~ 2)Cp"9t>|=G_zq -W3(xas%m'뭩g"eci%E8#y#fxjLI7ˤo~Td3%=T_!?|MChXoy#Źk0.|˲RRb9JM?OLy})'K֝)9x"4ےu*pc8Ts">%5&&$n{K82@!/V̚Ì+j?cwX&*.~D.2Pgv_k[yWĥ3hLWfp^eQ$W)IiQYqFe up8 wxs8w4R#]xdwQcBs\pTO\4e=-9tYqs>]Glۛ5VCtv)ߵW8SloݡFͫ4fMbRL dx. aVq&M_Zt_^F4!kׁNNR@ ʎ}Ԇ۠>I17u\-_QˉK0mT$BYW&tY6"Qo pݘ=4M]խۙzg}2id^z>^>X8>`ꆌNsCD o҄0Dlgw+OŸl ͺZGˆ?v(KRNJN̬btHuuu+Qq"h_ɍV LL=ֈ|dr^Q׾DaQ)]ۿ=4lF5r|A\rP?. dOtb8sj:{!tK*\V0JsD=E5^ Hv+X'idDZoIy)_"n$BZ}︨`(n)T/J^oS0{ni|~.>WōN rqLIbMO<;"0V`}~Ay|YFG˱'×DqV~ 鄱?Cltmk⎯$"k7ɦFʫJ=8a)Q5EfbZWrڠr'xnY~zyٸ-hc1ѵ+xok5FU* dDR ݛh_1M* ^22|f&K( 9͎7MNHIj%#Z^],zF"%#ZarK)9&I ۢ􁨢WeUkfk%Ben$:-{1].lVޞ5OJlQY?xM~f.)wX:㴬-?&If#mzl~{í;"AiK{'66U_4P,uuQ.u>`bǡB^dUփgGGl \vlzPJD^~ZKۍe^n]&oma_Ib<\rޥԞN@jy/ B#%xAnf8NnvVl} B"1Kw ʡOSZdP68x9%JXGn{!օ4"La`DndsSVTRU } I. KY&E >g%;NZ= " [aWUOe=oQ +tE9/"yt5֟Ef4VOVń"֥jm@{ʩXG8tޏ }p^1g1i9>`m{(yɂل"2j LQi1R` [f~ߓr }gAҾZF*;&ぼt|Kg'k {F%5o2vҏetV o&lJ2$@mWo~N3s[c/Ol|&̮Dc1>(Yȿw#NnGlux$ԏ6F±rGigA~{%"HE?ܯ9?(vJ䣒p?\̚K^:(#eZ8~t޺ɷR!I٫8tE`my4|Y .}`laVa)p | hW@<d#t1?cA)zmG B7_K%Y!/6ѵg\ ¹ۇ.Z 锴L[N:#3M4ZԄ dGV1nUȮX/4l05l@GSƝJw~p=9O3~2h7 zݵ k.naX/Y{9-..GH ]6ٲf:Tԉ;|H2sA#hKuŠ[.2S,(uBmniEw=8yW>);"-޲#ù=%:X=MY; o ý}C9{R#˪{(N"#uʟC7;\})(ĪY~P־A,dI+ nύ,GN2i34hUqt^]m"[;&o@%3}A23䚹ɷRAw?ϯ8u *Ƞ;;jJpevh׀C"ICXI|C{rڞ߯tY BrHYS^ / pycȦ}=z)^ ~D0[<|";]gGϬsSq8K:rq߇;%|* 0ZΚ<"hpa\*;0w3d& Ī%7{ҟ!Qd7>J_Q"8UZǸVvoڶ b@vt=8僤R,/V "LOR_R~g,bRC1%OV&~t,z̽DD>E/^:^բ9 n~hu^La 3?Dy}nLQZ%$}gw}~pwwAF|NϝT UtH' G]  /ϝ)?Na@Z^cL ߤJ۶fڽ6=-x65nYOZ\Ěp*N鐶!G Ti략o#̨bڏh^r;gFP'KqNO][GLpR\@' f99 '}|oBs#;IX@#ƕ۫ktWdCh"a[B2NX; kt)Ne]MOPv iغy~u9wt׃o@P{ͣ5%gE2CBɃ0&_Sx/ě@۽]y RsZ{= U_/l/Ta]_{qD5bZ<"\9v95dyMn"[̶&id|6:NtȤ;::["vM~$Uyp|0%%&#=.es)wgB9H4:{5a5>×]c&e:R>ߔG" I۟B絨j$<*Ff\w{Դ[ٹ3)tyǣ•]I"Z0zg B3o 3)=mwxtKyE{/ sG1a~u heEBu~"*,\d؟3BZ SF0&0{3w!O7 '4Yn,JK-w)t;t 09;~[@;_C m6F2n^Lm%%J;UKT6:(tkvFgP9@r4 P;*5?b٫s y^hIfvLSI"cZ+RgfW`pc ^F9\gz*e:s}a"`,,00fRx+Ӵ O|P Jݰxߣ,\ _zSr=+OϤjW&&9p\ Y #K#ƌ6f8秌rڧ0[-2 dn e;)ɑ(Vk׌ck(%\a)CAH.FYvÄqbp_J'*t f g˪_.>7ug1aNW^FݕN?Rqz!.Kѿ2َ,IÁbnY)U.hQ},?#%P莁TlgCWOVJn2sch4'{ϯ_CYyH$r8s'Q/^HL2 򍣎BS͹HQ ރ;iNIa|FϛPxbH9+9 s(zp"x#[PIa_sxjwgS I %}I7i7@깬{Uڋr% d2̟H\/맘YpI]E|DnZ0-8))3! ⤭MLLV_\d}- ]x"IGI+B;Y|L}#cSE?Q;nŧ{8Ifx ]<^Q݄D>)j, " WA&!hQvjfD׎g]\Ev.2.SW't`PnL#Χ{ȹl.7Ȯ}@؝b"a7^ JZ#hsNtБo(]\B*!;0G R&ag0?cbCw276Q:WNQQTBk tQA&qJYj2?{>&LIN#\-4)= zlIg{h<5h9ΐ#ԈfE)\e6po|ɦƞ' b3Mt?=PFm>YmDd! 檸kc nYŠ P>FD}q[؆gݳj!1?GJU1Y!rTji')Ճn?׎,~gH`H.Dٷ V$Q[ӿ? AV|hЦb$r4F|)[5]{2k2 QO0cneS~'5fSw_'eձ^;ӱV쫋<0RAΖ}r:/{ $<@0w ]|s1[7N(tG5?&6z51j9^@o,g5,aֻn,>l^Y3GYvHMk7EN$b!!qxAT2Rdi_xOkc.lVʨ\*{IKX0/EF[]p'v Jgk]t9ϵ >o̥,֚߆ 7B&yp9#= cG@q- k-:m+O=_Mx9`}0t6;*BL3xRmCj`>!WozXW ǯ~*Y)'wbX€*9,^ ~}9`g'@S#ivb_U&x[bXE8gS% r 1AL߳3`lV^c4>$/y$vDS/RC8 R+j5# /!+MJIN +`juQCeJq_7ch]])+@H wj.x#GE!X%M֍Z[YBs ci`䜯̡J,otñqi$7{MkD3BU5oOjLǰipC?s«s$ GhU]R=mGO٨Nزǡ5R VRK]cihJ6MS.\K䫶9wQݱ,y"rUcj 㟴Z )|'/3_V'!V: K 7gEwz2P '%a`ez=u\GvFЎP{J915:ԉ&i;*aC'')(9Ӣ+J?))Kmf:pxS8n%(/U_x6P-Qm|n^?qI="~B.q۟l*.t2kպZc&}fIyŧWX/;BF=:&r-_?L^8E[`bS(yG񉜹dKi"U>c[c[e˻<mrz6kdi/t. CePk]97Sb?"W35)7+I'6O̅"8 )1Q]mb-.G}X ݘ/osHmڤgTqwN[%1YPطF6Ꝣ*ڻ`^3i.:Xu+a7cG-hMnH@Q'i3F+Ⓝ'clmR=yheBgL-v+!9eDxW06.cd|؝t,Ʊw_?S03!ť }h r1, ׹0n*5ckl̦Qt4 ŋiͱ{AKݶy _ fw̱;OYwN}fߍf^w&'&hd?j`rs#2m;iW%N[4Y@PZP!i)?}vrlI]i=-o$ֆ.Vn ~86*$ Hط,Jg31WJh f!),>:*c7;yP=tRv-z,xّm\xƱXrX1(r?͚/HCqe!-/Y 6ʈP5[s(#`])ũ/jnxBSLw-6mA9ͨ;֨]t&)]{B'. >59δFu-cG"In`iP8弒;]7}kؖl`E5T6/})X YkKԛQgu4ب3F$<Cʹڪ'B|mYoB:WajTr@q_2]"2?j{wldL"!y`F}'rxt'ns{]BZ~ֳ$}:Qkݛ(so)Ekf-d ^U|ވw)[7 Vbܵ9âm%F+]pKU Σ0[(QJ$"XP$)WC5HcV3tHn )= uS]ʎJ19mVe9IPfW@;(;EE8CWhGɖR^hX {E};:-G|o”}/Ȁrv-%Nyf&'.X*S4V,͔>On i  m#1k3 -53rb{> 5U[`pu ?.uJ=rYld1DNh+7EnϙMUf>Uf MA!dDOBgx$Lw +>e8 EUFXeă In_ v]R>r cFdd_ruilS!J˨F0O\f=0AOuQ/ܵ'e4yz}&WOKo_HGݬ|vxdiN8qF~sk~Վo>p7tƶJ#8͖4'`^kQՄX'-eqȇpB#Guw?ZG vib-Ɵ_V㊹\wѵU.7De +c2r,E ѳ~d.^֢~ۄ#]{l}P.D0x4qO'+.1~[ /_42>p'OвRقܵbVQg{PM̂ <#]/`ٚS\Ki2D<<6p`&~RGI1K'Dk_nET},?k$-H9#z5ӹt3Zb1Է.MZ ճMJшUf:CȢLJG2Yۘ*]YQ0GE~g'E&v}Q4Af#S40!Bg (.qP^ySlAKŁ?Ql/}^g)'Jt#4o];&U.Pm@o!,x+Axb.j3ytnnԥbl&R]eBTjj3BI,bP\b 9?֌:*Qcѻ]P"Y]‹H~99P~?]5D  s|vg &ێ悯yljNy%(=@ Ӝt$'F< ?qa>YḶlG [7ɧ#~}מf".w=%m%.N4T7VqDMZBa^Ww0V?1 \1B7QY} j`I &p @4R n9q~|صF#}X0gg)fI v0 2>oy+Eg00Sk̺ ySF߱R ĻZ>Aocf</F'p)Ntu@ʋP`lGt=Wp8K4֌%h x==C!JnWgD)~ zC*U"RHY\Djוzޙv*',KM PYbʾAou8s(|D?X6aF6Kg't?fBgUeej7%Yra.cgLNzxM-a4DaT΁6vt5H'| %2B.8YAםIXRu+}M:sXex1BSVYy<Ҳ"r[Heh? 1#Q Agʹs x޴=͖}~Y&P:Zui{2αC`9|owy. p0Eq/˘ʉ5F  װqȺcԕ\R oy,BGț:>BѼ f(sGGY9._0Lb,3!GN}=Y,yU(*+Kֳ' 60+ؗ<}$c"#e5FP&Z;Ч*1awUe ` B@k' p[ȥX NkGtWM4)дs7yOdbc3&XUϠ;!]2yS eї~/kGמ q?4 l43U_%.YyLF˼b):+;u=5%O|7!ŽKˀ%ɒC?*s U$vؒe{ ͮ]'ؼ|{ "\0GF)e܈ 8^|zۄ9^(1C7\:B 'b5/#,Z ҜE ~G#W;x(c5'3,~T y/ q6kA}+2CL7wS4S}ZehsH i b},e@)7` V8r} *;X\lvhTukugZ޶ &}r]bq( 9UK!rdz~v;a`?%Q`Ew75?(Bx'bIx6Zo O[(H L=ayh\OVΤ7k$zB#ЍFrvȶ/YAcY`Ƙie x9#N3 bPO>kt#kZ6QH쎋(/D 9M '/ϕP ]ǀ*9g!TY÷>YHH |JSQ'V'C+1 H@I Ĩ]R hrS{_#cZ=Z(}܎? {8aiӚxn`ج+ d:ԍknNTxbyvXH0ָ_U%cLmag-l,Q>55`2sϹK3Wj&.{#vf=2Fj8={ORS> !!T!84:#eI #+2"w0do ''rLCج^II?;*y\IZE\u%c템Lj(s`G4|9m+q}ğ7DG0۴I;MqhUƁTRrRLFKH?$BެANP ck&O|G)#o[;V#dhAfQYs'8.Wғ'䭜1d[\ö`wғπ6T ZU紨2|#<嵔La7B`D3(W˻cCvtA,~l웚oDźHW!ٜd2@-$c01&]HnZäv+4mݯ6 !H^RE &*TPzucڝ Y`n Ot8aT(h[ht_eVS{v^5(kF܈r]kA{w"Ds]i)=y/r^C*A|&R|.AJXqC"=YǬfh%x̗'L7 RYhbgk-Rs4Ϫ ;7,3P6԰㟱v-T=A)?Og5421~(%'=֨MhBÈVWS}ʊM $>sxk]]bˡ\nxHxB98='6j%R!}eDl ˄3dmwsEfrE[an;֡`f<;l,:nҞiVT+QR?PcOz4svvKLj@/urV],|Iu`w1d  J0b<[O#&'4~x=.w%Ba{bn,wj19MSs/oL3Yxg)PyQ>@2qar,q(|D,701SF"ށ̰M0ybSJ4@LydIjuKt-to;gWekJK2IbNE!P;{[!\A@ %֛J{c;#W} _^?e]qEYi9DKML*kDV%,O,47FPvD~I^9!LwB/c)',F3vAoBVrG*C1'sM-${VQmϟPTI>(?XdM}{E3J!^Gp4`:,hQ[nL.q3*7EXTf.$UCü!!qyTH̟$3Zܦ;éBblyh?hX1;Lb6ԙja p;?T ɁX@8Kݚ%+HUZVF4{CCqcbKi5a'<.E1*4_k; slu'sW6/{>4 'Z@xގ+w2; >nK_lgd]ԘZ¢bqIA9fDWPo$IWYޗ\֐ٝ.d?(@? o`bSaakߕWS3,ۅjbt xͺs@R~55nR3?{,'ll 셈rwHkX %] k: @ ^R9wu(~b薆 =3b<_no6q7^-2)&6*.>~$ ]S F/*ۗ 8HV8}!s~?סyuZY%5WeN;?ޢ5raT#Q͠B_CEu]Сwe\, Dtt^!A> 2KT#|PvHRi2 gN_{2Ć0KۼCq0CJۃɐ@ & @se˦{~"Ɂ.Cqe&" tX~Az~c TK@M9=ڏ[3Bn:N61.>)7Pw5&{.$7ݫ,6M^OIJoM eZfN,|A<HƓ/oCg8p1Po2p;?Q<#^QW?^REyf02KVh$z>0is7xv]暴ǂgvt g5)IT#IJBSr={]\VAd"n > stream xڴeT\[@pP8 N;w=r뾷o(ksF( mNtLY9 ؑNdl t032"8N`QdP0vz|`dB H 7  rہTM YAo."vfNb[ 4uu&iz9z@e ֦́[S*H"PVPST lggIDU uZWU~3ZO7?rbBZbL z0\@Omo.*s'';nWWWz3gG'z[3z;S5p:X@֠qdW?k0AmyMވp_GҘUT-N 0lftrv%{{L(U  'ܿUI҅m:ӵΎ6;Z8:9+"`ja S5%SQ}<0;`z'7p2XoC*6y}o<9:3X[m]/&v j` {g=fl'_GGFh0!x:]@'g?8&NocU.6pKVɿU7TmS=jb vLmƁ]?ĝ6 à64 ПJmlpp(Z8ɥos/6-_"?[mf?{Gc+0 Fj JZBw`ۚXlm LolrkL `[77R8 AL N߈7b0qqA,o16vogc&5qtƶo[`0| [-}; `0S uvÛ?[o ۙYY[6C ~;ߪ[38?:fzk" ?:d{3wp;[@GxK2Udo}:-?K.o `u\6:Kw= 89Z4,L%a"trpa|;Иouc}Z&U}#|ui0}+ d8gkdR#?QKE\_S:f1} G4g$P/VV['\Ie֜TDIp#烏,&4N!WAJ}(U:BP9j|fEL!-kYɅu-ajtFw[@k_htz}-L|د7GdyG%ʍJ%dQq9kc0ل_dkNoatՍ.0߽HoW"bcZ~9LHp=5/w262Ԣܚb nD[ C}<Cl65Q iwSb辇M]$N[ Kf槓Vü% @EʉURnQCL.vY.&Vph*5\bHOqK_tϏ*|]vY!qqy"/ѠAH.Փ72yh/|qӎNw4.ˡ+U]ϯs 2QCQ n!\L23`n 5ib{W!H`l[n F/U 6BF &Őf5s#X#]fefadIQ f`QDj1d\J`vjԮ*1jOYE-_ВXO[-SV|iSN5NΤޠIu_>T<$~ueL7$XZ~'" #oL:1`Bo-#QrHy,~͂JנWKב-CPp6mP_2]͟K@Fa{ScBb\j"]gSb+&ȶ_yzC/_ h䑤; ,6{;g]Dh-}ޗp,z7K4G,w FNIK!MV s$JS3dFɹkk֠-*^Ru<_׈|j2wϢ~Xu Jo"9oo=Mcߦ=VºD'&Q=ҩS47 khq.I7"PS@gيw2iS'|goĺ?[4^ځEcq8R.0y쩋a0>l/}ig+@2{%!Ȱlbr=Xޑ`+ (`zyH4ژ9L0>QbP G(&eSW&=Xg4`8Bh2BT/!\ިdY&lTff%s]H8F8"LZݹ|3s&Lt=^2RJ~ Y 7ï\>h8ү# ;G:4%dw=f$+w ?ɔ'7u)Ya;n~i#j6I*HwAx޹jynkQ_o i҈poS 5v ^PNGUNe%Jf`X-|,<7#Ni{NYYiaծs NݑQcxopK(jcWyJ:ӗ \K5V O h6w_iIzV4/kT aMU&NO9w?ђ؝}U 07X^7XW J=a)ҏYd6I3_Wdsyq$gC4"v:(Fw}{B_øG`l{da?ӷ4LMwZ+ҨƠ,Vy{#S#doXY8)kfz.~d!x%[Nmc7tˁUGKn@]## _Md Hpt~SR'~ Ϙ0Po󚔏p `Ղ}hun O ڹyC.SbBU?fA#lc|g1};Hǔ: i/vء>)"'{;[*嚅\o=|NXV4c1:ӍF9S FlQ!ݼocvG׏X`gM Nq9&Xy(Jj<4,#~u'Nmt3I:jru]O3!E: TiqHګ u<~'pۄQm~VQ|N$LMT;CXh5%1C?/򒳠6Z JRJnXL ܓ?w_g~^1[8θj•*2H|["j_!ŶŸ!Q. 9Z/zbs6b|z | 4A{;^tea0= rd9xD9`kݨmlRөf_ 2 eNM'I;8vxN︼qC%Ԡw(_I'Xv^3_2[i|f!1 vhh& /\y` Ӻ%h(SELteHCTV$7%}OaF;3FQ pTjm| "}#U "sOcw׍u+ŷn7Ϯ+6i(ɌĤ:*Vcg2uE|vdML?5ZX`Py!{6=3DIh 2EXMw P#wZ EbgA)Akx-!5?M}5E9&ٴ'#Ml.R;TuF,VՌoI76pxbd رSG'<`Ro;Il@7#ysVK_nw.L[UJIG:k[i6ξY*FD4{RbMHg4!w:qGjyLsrC)8cڛGyTI Jj4Wx !~UrУ4 Ȋ,悚q2OGt`VC7/ɦQŬ2wΨN`[&~Rw~b4-<%_ja _4﹚`'$ȹlnʋ'i6sIrWSٺ\mfO(ܮNSi~kHb`EF![[r} _+HBJ|=`+CPH9_W/¿3::襇'?B %_ 3h`Nt~ =y5c!yX53 4%u2=kvv?$~0,$•4밷i(5;EVr'QOQ3;LGh=~j*q(+_㲣 gCL8kef/s^ZΓCpb$WI$sP_`xj$c<1`MuUCE5'ė*("ʸ<4hiD(ʟ$^~;VYsY6ցtBj3d4A:X#뭠ըq$n=@̺(s,R+\TI ]kKn,5U̲vXΚ~^?GY"TamԚ,u_zBj?Qwca# >!Y, lE9Twˮ0 !Opu\-=QL(XUrG]?.mD"$ܳ_b^IWPhoÇ&t0aCRS# Fdgd6ksN@$fW%e 1'`o9e[iWڄz%NK1+3 A`ifi~ހu[Mj3ϡȯz09EZl,_ʲz%*)%ܚ!y_7U\!d+ɚv`L5/I<-a "xvVEܤ:q8JZ y֢ͿbF9CĪ2~=HQ}OQ^ɝfJ&5EVkɖ:7^7r/'>#_[s -^D#V~`Oo=[j55X"mфq͌e.J}Ovr>qvE͌e3RetˑG_4u UP44TJ{3mˋyTGφ˪ [6#"xdF4[Ɔ?^sNHB1<.󏛌܇F/2\Bc\_NM!E?4ꑾ9CH9٩w2z*ڍ흟wlR|vM"yǑ+A ̲|>h4jT_ES-!.(jBoPR!$FUYx^wtuɍ%VQt*;HJگQ~Yo0▞좭oؤ6{p)z]! *qX]Յڐ0шE%;go#OfX/m,,a#m }ETf^:K3dt 9o`(jFՎtd$?W|5/-Q|%\a.͓YsŢCupxJ\mge$'nh=d%uU?)UItE6HƵij OC~dY²y-~m~`OV # #wD/d]6*8}ѣutuPG̕EcD6*BxuGM1&S43ծttݐ"!Tc&,v1))K|/B{g2$Y?Ar]VbayJb6(Ƌަ~($_Ɔ0p#i-=aAF A5i WL<֤T'j7(};~ @#T10fYG\e?=~mU†a.Arlrr8THh2;pAGqt+xP)9p#-/;.4 }PŁ2{/.io\g;ٻ6/xݭ'Z{k$D`p {a贈\\ 郶ugVʢڶ`f3QJWBz$`43KB:˚b\dr"-~A%Hd"jY-xi" }1 Z@[ino\4OgrXy%4EY5Dȥg%jAǷOg|u+F0jp薂ww P5{J,<[;R40%1@De*[|B'+;7ӑ մ,v4Cnfb1=QK:4 -q|[FCx(q=Y+DHgc݅N0'KK.?,c0GsR=~^aEj&gα@%-$;Z 5%k `:l(biW-ԁg_(Εm~OVE]ֱv:̩lY#vv wGS֧w1%'U].OduH.a#,{uq=Xs1G`,|i ?&)I˴͂췻g(#2Όf$vv" O4OE/{Ś}iU!bC3.b.)cQwZ__>pF\.,qrs@n66,ݕFԔ-WdkJVL@`& WYW)S4HJ7 i]D' V5i+if|e,Mq>Wzΰ0:qؐב\Sr8PNk.Ea_m֡2*f4[kc(FnQZ>EՒdɱv&l4UT3a~? gv#?7QpqބHÐnbNĝRb"JϓyE9ɗXB\]{? ~ud]ZSf4i^ zҬjgF`1 rMD62bԫ*V_rƠ >FK:r=4hto r+idܗF%}4I'FO=ao,0Dֹ9|)# $P:P7GwF7 }3s9s}+qEN A()n~J]Ԯ-|+?J`.Q-y)H 6@i3T>BO.*&4FƹqfE6j$tk^qPv]%9 y4b8 lv?:'1L:L^J]؈0ەHN^՘2.:h cSv=geGNSN}r^4ðLBCVW~ѱ* 0*$rC~@OngiAH M$ʘU34Tu;[~-R_c&$҃fflɬ<zԈ’`mP ^=ŤJޔ:Ilq;NUIh)=y!v[-e9\cVRVy~^̲R]h>I ^5;!]ZG>28x_$qaӮwejLth?e4n:oGZ:pV%#]r{P_ *wP r? Ȝ:SJGrbc7b8TlJY3,nd ޛm NE|6hFGc.\rf ˦Ki`f8`uHG9&LjPg%?w&hy<؝YW)7DyL@qT'Q Hj,O6x (Q'?1_O7Xze]6$l> CKГI;"tX~W3 C=]{Ei{vJt/+,J&aѻ@u2e/)rPB'k2$߀4ȣ4uIw0LzT5M痷8G6Pzz zkc~_WޯE(0e;-wV*BjŌkCRMUTtahStnUC̿2LB f3Is?@%YLl #*+&cү@yT]fHF%;_r,YD?%`Hf'c~{:+^"'fV YBuC5.\<9_wv[)#6Lv1IS11XeO2騖 H/ 'M"x:>kêf|=F0Yw)%;*mN/`?^Ƙz*iR,!^.C43q%j/rĒFޅNF޿}i$=a M^%Ж][}컱Llt[jFLH`\.ʴeNeXRsLm+yYkrAO5.FW+$0\kDְXđOEw>B'Dx0Møhׯ3|1f'ltTϢu%Pboc#,2lk;# ~4=NG2ႫEUߵ5d~ezC3:FkJ}h#NģqXe0j긶1DA_wJ?+"^#0t.!EGn ds<]U׵5YH[nF X œ=6Yw?m`ycg!~HCG7 "ù_šM@C#aT\Jb_ prkN6@mY~G=1aH[ ieD69 ݞpZ^N~dl~*\K%ZE ףWiӕaz 82|k|Ywm> U2pKۮ=WÓqD]ٓ'[ԚY,4-arӼ/Lze&iBh4&&7(SЗ7>WD;֣5FU}$8 >Ck.Q y#Ҡ>Zɰhhث畬".MxnRlťA?Yv٠O5!រ(XMf/մu2lŏԒ$\K}f+*xx[Rr.sC qQ(/.Jә|ENLtfb**ER4j8IΩq29HLLvtOA3pɇLc8*r-e)tx.11gT*@E'ǟb#NBHK.nI QJ}Q2N"/~OP^3tNƻT>3Y] "C`:hpsL˫ }[즭~g`::芊PN7U>ǮS޲1?gA@8FAjhBpy:A/&9pvYAp %ivT-s\(+səod+i&; pUtaaHĺ J<7:Ly<ڴH qg7צ`#MR0̥Ţ2JQj3ojP fh ݨmgw qf&D$([:&[ECtzet"]=FF.43 _Sc4 y+HO K:Q>+z`e*I +0TsUJ"󹲛WN9/=^=L.eUbWpf5iQ;X/ݡt-ܛ=oU5UΔ@7#"F71K-x ^ј'P['L^\94>RKڭָބʫ"(I 8&:5u7"U|}-\,HQ{n+%+4=C d5\*lL څw5YV@_SPdA{Y\' bJ̔HnN-DL-+4K`XY 68Is䝘)(o % .71:^c8w暥j_@||0m|xqwG \|# ^NY=fPB*{ mKE^(j<^$֮U]$VX Bٌc$Д'okYQuA.ikWmw xbݐ ##0۸uXVo٬|Ɠf5A~M}cM B`zT }?7m~>ޓTMx Kp2d9Լ&Y A9Uak.n_>%3/пZiQc0Ps7 zAxO¦N#&s-ppk) %"L;,RF㫚,y0(E vMlUb>ݾN=W@+؀!pb7}bŲ8; Dyvu$&G@ O$To{JDeMv|T>$7Ey+ }3c/1zT=r:][0O::jOuF. GJkPX6 d')4#Q/+355%HF32~e~AlힻVA> w&i2{oTd;Ɓ+xZL teMpzjbLS9QUA#';*!K~ݍ5ܱH".0>X/@0g&O+"J{$[+D UV,7Ey+fGց&@޺0Pc'I\=rXR5>nx_9U;ivy(گ}E":CP~y v+I|a ~K6+[~Le+ ;7GKSwaDkWуr.u=HJ$>#q+@vKCC,olQ:1ܥ6b֐Vr&*Rv`^B5kd;?cm8}_f)dQoU/Wzʇ3I1?3cOh5a>aұ7oT!4>? ~ѐɝ.\Q9/>sRaYԫ5De#hO*Po>BVq'0 %i*Ezrk9#V'C%wc)<;YH%XTur2: `2Yi!MohFKWUV~˒6w4RV",'el=cdv endstream endobj 460 0 obj << /Length1 1798 /Length2 22735 /Length3 0 /Length 23850 /Filter /FlateDecode >> stream xڴspd>v:msbۜv2dbĶm}uVW嵟ݧ* Pޕ 'jl `khbk223QP9]ō].WKg3 :&^y#@m`bi[Xi>C,,]`c`o(#@ `loeg(8x|*9JTՕTi?9::8^Tԥ" j=@J]U zڧoOǿj"jJ,L`](?;OkvP[:21yxx0Z2:8[0:ӟ yuNWK)7H_FO(?>'s2.))쌭]Ʈn.toտܜ֐/E>Wgg;fl6uwrquWF {{feN^DAFRBUAx 3z7/`$g.pً?r?̭#_T `@OSKea_5_'~>sc[9b:|Jp,\3+SO ?eEcS7pK DL?|gߩ`Դ2_.ƮV̟de)@?sEE<}?q``` eaac?:ϭ/=pKLB[*JMWBR0Vc j&B,eNwo(yڗjQ`ھLݚ) $!2%PCJs$W]>ՑAP;}e@N#իX-(gipE\D_uxˆ1Y3* rE)zhul +9bA†(9.$A&N{JKƳNC:5ʕiKp0`%;F݁"ƲzC QDɍV__8eTFņ+ա0,2GIh)oG*ok&'ߐx +d9s ~{> wrn`4Mm9{X% ´mT79p}Xv3A!U#tJ_p9!0jh @aqA1(S&dX9{m҅+Gze/n|*YޡTa?+ueQy{#uzc1Rb87Fee RTY]W,.$<;'LF~S߇9sH;ON; FK "9f mh`ҽ;bP?V%H.f9Eʶ1) Z}}vx00 Y^/ (Aj 5- ^)ӘɊ<:[s08ʧfPkQhHI'Z+u5s}$=QWV^+TUu$OӞU i:xհfVn9:^] jG83eHѢ|q/>r {K=kiB8xpHq0߽Qxvt î?䫦kbea(n,3:<89~o+hQKODhދ*7Bl>t#˖oO^%r_/'auӖ4|I@M"E K~Y. Wt:<▽ф àuY刕%񡍿Ar˂06ISw߯ļ'߹ 6&*'zrguV"1V C CT_Q >j̠2)hВzآsq޲z}@(^W͟9߷)V~E V_ji3mq@;Ux$tիNnJðέ$US)wT=*Q9xLof+KѣgOĺג6a삀+[Փ C9$AkVX`>ÁHIF T 0Q>} j1Q4a,Bgl #?/=z e M<ĈS7d:hcxRNzd\w+S-*)>>"YEsH4x)M.o_Iz\a:L[{Nbuy( 3YPBDLZO|2> u<}h˜f!Ҫ@|?z&A9ᑚ`twVvQ'q!0Q5nyKfͨ5qn "glxH0MWORDx}ZejYrjgli!e%Kwf3afvsd\)lL"ahAp.!js8pCC%?3 "VEt&-E^1FoBЗK+6E5< /da}}$WmR"|na+#q-U9UӼLS[ޭ>4G[_ y[Q+d nά1S3f&^0D9xxb?C!'-XmnE﷬{Rm}@a2 A;fck !bnjJQyuFs/?cH~,dXбIhe~R t,S.h7&A߉%a"e4m V]26Q{ê2@9ƕI FNka[[M/0yD1n`#F,tcw]? "E@yȸe)˹~œҫE|V7ՎiuoR@ P)=q:?i8gjqUІSUE1|> iY'wQǢ7ºc?x91M1Gi$96:: [􂿉7CN +-BCYˑBqQTei8PFmW3-7k*1na'oٔk,'й'$ϰzk̆ o_MxRGX!ZaVUGPL^25`ϾCof 6M@}*b3xCc\Ls: zXgZeoaje~6$ڱP2R0Sq'#RURbfll̼~& sX+#<Ơi<%RU]FpWp}sm~n>59'.΃y%L 4\)QZU4=KxYTf6Z2?U3n[d1A-[44/UuڂW!$uITˆo{If:؉^:bk/Ev!WLCJaF# U'3xwsNV<.ϋ|MBA6I_? 5 uOa?UwTճ5m봎wҙ 5hRi_̔(M0-~ @"k%kt!hp4F}Iph«Yif߆#j1C|PsֲUq˯F ]f6{R6=-KBUTl#?*oL_&QjdzKƶp^nEC`$g*~; dsZ%2-%yL]rnO' l)b%2NY?Z[G'6_ f3I¼.3WQPJ.PYecX3^s @S'PQ [6~G^/@ԎQ7DB864L3􏝤 1SZ+;Rvk7Z~~HXFй8jcUY+3M-T(X m~hMδ<bJ_E&t{*jM3|!r^{-1Ṡ˟݄؇tGSNqŷ)7tj_m9O jԢCl㚴xg)C#9h$U H1 BQpNZس$̳1 3d~|TYyD;OSM3^h)ٜe;0ٝx6h緩Yw%nmGG!-nY#5}ʭ7WTό+7z?JQ,IS2tW WfIfkv%ʖ`#UU?ĂW.Gik&GUpib l?5'F,-Vя3c5sƾ ^TGuQL$wIwUj^%ҖuzwR^a ./2= nB4[F5_qp@"KU`]Cm9gTw*h:Gnܗ'34#ZH_`]9i=ӺH%ie ̷EW 1Wt=R޴\ILTv,(ZN>F-jjҁ?u'V'u&,N0}I!>RH0IAs/n>dw[Ei=_;}؛IC7~C$nןY2H}9_P嬟LFN*D_u; kK RwQnF'iݦPk&G/նM5{eH)C@n,ӎhK̪fWmR,+NίIm^D }|5KUTB(@ š}uePܢOt 8 T]̣*&amuʞ>>׉, ¼&/^>}1r-.+zp!^I)ǭ(dE|KRBCr;jYnGނ;Eix 5 wIoHҠb8 '$^!>Qy^yveh/c"l|F '1-3FS;ڌaH`M3$;n>ɱkbXUquIjY_i^`on谣f^bXV+liF$hJ*G (@w2{zGE[$%mgA#ԡ,Uܑ6]Ϋƣ\N)O$W")O=ov/;]H:h߼"mݯNaf{2&)~16!~H4KXn k|YqWnִ3^tfDMS+sj&eQ8Q憾ƺL;<jP4` Y" L<7nvL;AWcӜkwQM]i?mJe;g襠#x~d0eP/8M'[57t>' ;xڝOlp* 7k]B-CCEWķA ո|tpc~"I^2,XC9 [ot,~CGtt.(j  `OnA:2fKYdH aKӴ&cܽtztH$=x<Ō͑`ڂJYuЕMYS'U9K#n|kN\} y?J7`y.RA)G*U(q}ƣ,jGnŬ}Izr0q^"VD6>zӔ 5SYV;?v#\bG2Dԋ2NOEn4V8>TIpcT/(ںVG2m3~yWg8a@دRiHO]MCbV,J56 *y/E.&5p<׹_QƼ@P4J9/m͆'ﯫB,αel-cS J[6Fgd\pȖ ^ a4W9#seXr֎Q%!? ܺ6xrSh&ImJEɄU慌r)+\`J0h}e۩U M0\ H` A-4=k=h1OU58]_%Y0V));|,^.|s7opgh`h"u >YFYPI,T:%H7 ,(7 `VG/8Kͦ+J-@eĢpj`o0n?U|2nA#:Hc( "<~^I3g-.EIdd[CL; "FG;:I`5챛  RbpwNO>L ~ vLqLh)oc&T?m̊&^ɾ噝NSJ]tPj/隸(! ݰal{#mxAp[xd.'dwyW61DVQI@'$ /iTRx5?hJ,&&H' fP}I(u` Ezw(:7ig:?G~{;1+ku۵߲h~SKYcvbR^୻`I6Ws%Nv*OL/D=%/:r|وՍyba_?#Wb7zQIp6d_jA_hFBSĆV7*,4E;5y_zd7xSb"Jħo^4a[݃WBN ɜۧ?==k_w`< jʃ{H*R^dACw…T<)_Kʩ}f_G a|TTe mg!nI9%;hФxG"h{66|t@:E&F!I qAg~c'ٷ:/ I, p \nPjd D1 țEp6׎?λrB MS{] TukzxvJD.,"")ZégHsUT.se]$A=13_\'WĬ$AfX%NʢDȍ5w]1Z∲1R[7,6d e⾸k:V bΩ) ϱ,RoxpnQWr-_ fnjݽ1Ҷe| ȑi{sL #V\j=O (2I/^ah99jG(nI6׮ozOv buHUDLV?͜Nl,F:+!sjt#!sTL#ӷBM"TW1V!ԙȊ¼D-503P5vڀ p1E iXCW 4d=1(^~Wɚk3-j?7򃞵(N5'Y9&N uN=pgf0M>.D*&cяDil1//lyNŤgu~)(HwPf@rk_wQ:nk347raЂ1q/d:#Ra C[ jdQB !MlQ>W)o=gz<Ga˶^ ͩQaZd:nmdR1 \VI:s9_+? ŋ*~f057Uy-Gh":Hoj)K76ꝝjͰT"K*"6`V[[ rN/rӸ&.Uwh7u,`i8:$lށ6s0Qf m Fgio^ڜ5vi^F7?31.f63_JJ4a؂ISД4FPJ8WJP:70g`2G'琘!S,E5o;m ^}}-Kj']9y/AB΃:_H }wɈJ_0nU'z)AOASỽrE6+ uo7J5|ZZa!7#2Lq!.SqLa8D !'"IxCo%vrݦ?G/=jXe8n]L֜nCtl 8TL\scTC #GT_o#z^| ZD 3oM\S7Pҍ$wl~3×ҮyS1P 4tmg 3z$ʆIaZO(OJji/gepx=0ߟBRb Py9sota|1^ϸXa,YfՊ ~ ϾfL%^2FO!QY v'9I9>^TƧ +!7ܒitMGԺ !!v|ڲ[HkdW BJ0~17s:p7Q;d gRg",s%yhJ# ~5b4f(J:&՚ڭ,2̚i9g] zzn?x؟߮lG'Idk}벉$l)FVE9 8p)XluByYmI:#?Dvx-5˞8[ՀR*8mcKz=p/"8ne*6Gu'd;hxuB7(Ot/$[0PDD'c] ywucdz['L}TOɉ3΅=$CI77B 4ڒ1gQTBޅPv|Zֈwp9chď҄em%Y k;Uct+87 /`[s?ugEَdq2S\}҉5y$'E-dUh *e1X9VCTVAWTF{Z[p5&u -H1IA- +f/k""b0xgQ;Mpx+dZz"[ 1|`2ڑ\R8MW΅2A FQGd[3vR:Ar)a/}˥kjI؜%t9*Iwa 2YN*/] _j8ED+!nJg؅}hMRڬr]D@:^G8@7&iL2R_Cy=R I-.@eubJyYw'!:aq16 a߹dXP# ˭6 -=Z&ʵ]Cf6 o0{_c9=1v|=EaI ̉+S6kwƎף ۊh;+|N}>&\k9#x-O' Zɻb!gDc6fCh bvTU.M(eD{+ue(l!]M5&q$y"5H vp9|zQ>i{D%馩U ff0\wuaD%xp?=jc7A~9ٻ92G5}v Lkm$ ItYJ㬰x&%X14&iY8f'at򄺛A0BtoZV7de3\{)m22oL:%U3&[\h7'@/;7P?RM|zH~#-C(>ܫam›/ eû{'dWKa+꫄knD)G bcUBQZ^:GL'r9 ,AU^HǹHYFѮǐ0`9[ϓ^\)QeOsfo+p(&aCY3*T j?Z|X,R3`W `ωj %E[z. "L+aw!0 ^g<+8pw|^ 1z`lHJ+mNEx,wژݭ<>]{9 KlI)`ChyGBpF} NSzw<[9rf.xGY,iY~~G\s ~@@QWм%Dfk3 4#Ki*\d|),t e~nb9ttn6UJv[#e[;ަ6pQ2r LNu9/E\qiRS6#ųjŽl Rٞdq'gldN?R-U;'3~,ڔ*z f x!KީI>&9qcEf)a&i*-Q gC]ONSQYKO׏@M,|$S&2+ēAsVmuw*^%SŌl_:/| R,S70ঽNG@I|^ `UP8M&O [ΗH\FaZ$z8ao2(5u.CtaFqlʝy0QX{Oa7 2|z̾-.w/M%R(i7H=V!(| u|;ڀL~t!oJV^ ,rH+c.MO­Ux* 1E *k*~?E6pj{p VBJ"[ղǿ=-i3V]{:9CfKiv;k+ʴȖOڼi58TOI1d }-SP:O_&^IRDψ?{~?g`-5 Kk/qA &_YGK&t{(dڞo -SHdQ桩+\Cؠqpdb;.&koVԙ#1se%"< P]՗\nq{p]'lϮxE;mO{8 cܭ[ͺg H.2I]6K @1`,\#>a`L}VK ƢW)]܍*k2&7|5z|gi=n @c ƅt-岇t;eIܘ )ZxZ8 safr 9#r 2%x2{M3&AԪV\KE<- ,5^~m*$G%ŋgI|s4Icw\soc~W1vY22&đn)4"/ݢ@x5yZ;TuQ´g573|t_OTnYZ\[ [БH![s *^?ξ@uʶf S&&,J>+jM @J͏%nxO/-=FnYCS9wMBur4l1r3I1(+濓R:8;7 (žR5cKVog?JJV;_B%ys868W/BB://6p=Zc,BS~ +b9q֓Ay/(RwPU*͜ bJCq!H?Z*Dy՚sW*9d\))4'3-Ƥ1@zUV`hv+|)?a_=ƻ,hW'̏fc&Y Tu)1xJ!F+-ڿjD-GsȑvH7x'үE7d2]_x(]nR{)ҚrJM[Zj%a/sxij.EQD~(PwE6#cܼXPryet= t1I[v9"_QDe@h`6/cRb uA7ٺi}[X\GpȘ7lL=ԯ"GpߑՑuy/)~/] 멣X :U=]7~O8\^"yOg 55GLLl} 6{# M-"W|Wjzĵi{#)KA_6 9Ӎ)AeT#@VHG}$ϖ\9zY_S269@zH(!S\y94cKQb)EGRZlJB=ڑ,Fk6,8uljϦPvx4π0ci=j buɑQow~V<6~گ~KU6kxS)YcYPNjcJRP eL9}kf.!4NsAH͓PKDy dF j0CMVd RJm.ʊ/zzX?̓XEaPtSs 3.RT=@w`4spg" >˞}+ aTM# Y,"9}f疆 CˌGHԎHhCgIt A^Jy$DT(OTM H-RjFfPV'Vb0/L ^a?ƱMny0eXkqkޟ3yΘx0lԐX2ח-亂x翱^H #xԻ 22H sWtKǭ0w-{3=S$e#$\tΕ"hAg:wl0ufHBk'ÝY/S+dRc``+*,5'UuGj7_.zM_k6;pd#"j?` '&}A+ U BdujYj*섇ӯW>Tu>ߒAZ`ٺ\B xl/'z8 euI8}q'lY.ت~|Enߋ2903tR`'(,ɈhGVn=0<jw@]1g=  ʘHJn54H!#Tj;+"6P"ޓMD_NYN6z æ<2Cv:p)}$HzVrgF {t`eB C'kG4|X[?\@ͧv/EUQXrijpN G]1 <ԫv'#N6/X`nWBkObWAw lMB1ke)IzUG;`Oa^Bt̃OűNSfόB&oU^Mfa*xiyR<OA|2ێs!&˴z1t#ƣQYrBQyst"~ײ;C]es*im0>͏ptSPNnŷ% %{eN=%![1!ԧ--!yWWb:!T'ܵt69,d¹I+I)!]3~Uo[נ $`z0KfwNk P/tx C^FѶ|ҳVe縇Nw_f*h$)c*VgZ"?o90J2R|t endstream endobj 462 0 obj << /Length1 2099 /Length2 23501 /Length3 0 /Length 24808 /Filter /FlateDecode >> stream xڴeTZ5{p!4N wwBp ;̽3^-v>u^XQ^(nrgf`ʩ?٘XEFΖv Q#g `s01q#$ `:zTFE;'gzc#w7dn RSD=--`3@`2H31ލ*;hadc35j*b* e5Ej*.vEDEUM *,*$TTA?uTUŘ p::Y)?(ޕN5s͍ٞəќ/}N7;Gk#Wc\@t+ZAN?$q9m[Nz;G{#W8 2FNqeeF g dl0RK  ܿ])oWkc;frqGo{&v 'K'ge,m;3K_69ay)q1UzٽwW|¢<.&37}H@"v瞧OOv= ;7,AfznbϨtpJ_ o9:& 5' 񲷳8},̀o^NF@ 럎F̜SK?&ee~Wom>_G|ځl<@3Fy;QO-qy#[ l-m<+"4R?N@SEKg_v)g/ڟ3d> @?94\m#*+L߳Wd`a9:y 0 ;;}MMdNػ8"'Q_ (`yFw߈h3yo¿-ll,󙙘F? onv?l6dۿ!{a?{aځ!]?Bu8w' =?Ҽw.Yc=bl)P1 8;Y5,M߿e"gh~ܙT`lEgy!fN__W7s@w oUjShط2hrn lM\m`A@E$orH<uK䵩/#_9_d19 jrKe]$ԇ9Zl3m mj?D;bX&.SHt 瘛1mݗP; :0㢍if CHvcG >l7Y À cU vŸ&SPpֳy}<9ʙnCg%fGR g@5 AXمFO Tl!7S3FY "zuq ́at :rgkPUi~o4 oHO!u01#svt_)៵>xR򒇄**BA`r/K,IJl^mNVurZ58Wkr.T՗jW0u4`sd`1-d׶tx6AVU>Gma˟w+/ѻ-s8N~Gl9Pᬜ hETAv%i2Ow%ꡄ$? 5Ν#MVP[}h2>$&;y6jnEVe#ڥ BeN4&,%mFN[؄hrQ$B:o.*aK+/ >z)jZ"Dc֠]\ܜ3LL7\(ng4Z B~w[1C/RZ$8Llf;u1)30VЅeKB Y~(&!glj#3-AxTPj?߳/J_$Ӥ֨XiX ,,`L43p4PZ^}H)(gkO/iNӒ/TKN73#eeW"dB֬pgHź9X"@EdtRZMjlaDo$4@y(gAfT_1Wg 6st,D^#xeEbB+P z''+kUSnC^QU&k7~"I:AtG7ړ<@9y\uҫc3fz8!SwuoƬ:x;޽a1&Aͥ\$ -rV[IXC`4 2 E]utP$Dy>.R$Ǫ1#_ >y:Hct!BMS{\!ΆDm9d_ՑH锱kqj7h0D' LRT!kő)%|B@NHQ{_*"`K8|Hǡ{6 NC8 G`(פnRr5y_>(3)ua|PQvS&&mc}3|١ɞ)j,0yƧTuYHS6uO[,0ͨX)xWCWE_lAioS)Vk0S պɧ38F<'Zsf/foOTh7LLXFLm\O=Rs9 \Vd/jE*&RL֦ %\vRS`0-!X-Ha,:I[Wsfsx!?A5=pVXm\ڜ"q)A`cCm.4}Xd{Yx{>+ Bj `,1&zԗ\ :0~ko8@yFsG3l<S[ڧM+_һ%ޥpyi1H<0jNZi2 Ig%H2T\MVii-cà@{JId4'cggIIfxE@;k۳ مKfX'QbY`Cy|- 77((# _Vչ#/i['hf.pgU 3H*yעWU7 ~Q: ׉,E)ʌ#G YxmV4؇>(55^'׮1=m12kjPрLUk$`IZ˦v{BBR*W3_ET[a6j`jhTdBve+ҒL sqEĔML;V K$YyݢOQBمAn"3m8$~! ٮw]҉\N vr@kT${d\,fbJGjCr.yx#n@4s!dNϨC;iŰ!3QVut3иOmU.x{'(Iؙ">?=74e/l|:/UΟp!2Gs6ZhێlJp~ݭq/RhIhKwaؗ5i\*R SLۓP1n91)_,YfKj,<'>ODe׽]ؒ2TYyK=5p@InR,4?~Cx5nyw4H#w@̕l+FnʙWt^YI7eT =醹0 8l fQQ-Y0ȁF`7~FNAC͂O]n"&Br6VgAq1tZʳS(۴TTT:bZ+͕Dlj);bKW%Oԁ ^Rbaƨc}+. /7 D\~N#CUp !z<Ì !t*L[E 7 XR=PUo3Y(k: LHF`2O] kg$ҽ5='ԫ #z)Ղ0Y_ \8X'HUec8v ?c;էv|d]ͱe+ =W'2Rݩ`!JڲUe=%*v?MwY $f(_r0pRhM_xӠ 0Vt,ec;1Eal}ޝ@*ђ4VT 2?Q=~e}dc5TPQ_ \Ϙ,]ܷ@0vCLhܡU {: y۠ՍNMYV 2_X_CΟ%~Yeפot{?}zp2Vecקp ]o4UAG4[.'yb{.f OqZD*%)1P֤`,LBY/nFß#-s^'}ZECU{mfktO tvOAk{jvEدak"bkY*P̀JPiLLϧoѡ[&G>kJA~1f eFYCAE\aoηS<P4yBἽƭWG8<h[blŻ@ofS+0Azxc)~[&RRN)8{Y+ G:('t y> $L Fk}D[M[S:88 Y0yKHDX[Z18!j鐞ͺ) h[<> 5DM 5-vӭx19[;D3^^ɓV.?j~@]7]!:*}t̓$jrTO"f *s㜺 8&Zn ]w] ۙĞEޤjOZ[AJ"%ۃ paa? (E UK&HNHɸsHm&jU/XЯhi,e$ j0s$]:P^4G+/%fexDN kĸ7Vg?WuN´qB]DQYC(%(kM/1~M VTgZyϐyR*%_,m7F_ 8fL(qJnus4׆ 6Cz/5epYAot,s^vFWO TRqd#PMnstD3u | K(xn-x"b"FT QU%ͽ6YWRLYf'z^«4{w{!Jc eP5˔y\VaUFY1fGR M!h L2 U6 9`;mj_=ul2/!,*'_IڇߠOҞ{ƅNadB;bB GJW[ft~}?I)xL?Ɔ- sQz杸Gv@wIZD9'j q[5D;qa&@ϣ!W]<>y`;~vvU&ITO>vEXc8:4 D aC9]J e $ʏ8H+G NS3/[hHԝ#"1Wgj: HtHLHK& splyϤ2pߥ_0*mGԣ\Fqdr=I|1"+i0V0ՑE]'~ 7ic (G]IDa~Ku@ڕMzkU| 1ɔ]-TʊkSj}!vHK(cz0C-n6[O3rb[ߧFU=P->%E4^g#G\Drlm)@"'Q x:nWlI`Ӥ '=堷I:l"v^ҋ3:cN_huT rfQ[PqbgHk X k˕p٨EacDB#5vzSqjy4dY |8%mH5uzαpθ@{S|Ʀ/^/=Q8I &)aPC?z!ax\@hDɨ5[aE{\3gǭbrUU5/\ fhxгHm|+S2-a>w~w 3x(K7ZnsotkdIA0T /5Oٷ,Jb^%A_0B-nb \B }3ψ`yO^S. (3&U$LEpqNP>o+5R:S SEuju + m+=lJ  xYԾ _KK'U]|q5(JkqPg` q|u}9r&^Q`CސĤ5{ ި~޿_n^;| P-v-X|[MqBaqa["A,t'U9UnFpZ9~Ǒtæp?JyHQZ.E(%$h<=M!F ܷ6%Y(Rs^`(VIKv!%᧑x l*,wꚭޘMT]~g-+g~皫_nT|XSnVK084w!LB?5.EjPUio}dh%Q0;:tbe2C944J٘'Z>ZE*4-^1E# |!U֥L+T*>^ۥQd-cb(+s;jDP:0RUT)/4##WS@wڔRÙm&zS7Fnѥ c)—pqk5GT\ㆩAUTZl^8_57^CO'DfZ$KV_J:Ryy/ N]`Db3_=N6h+Kۀ|ńKоu_Hڄ!EY%ƹ9l[:VhSg+ ca{m.4-LNq. P!w}l7B߹|Y ρl f&g-_xs|FN{*YhOzv:bk3Ph}B&$TsHz}TYј#˭FxuRe紎jR7\oCC"`% Jѝ'J'8 q$-YɬKʯSk*U&/уM_o*9gtSUїQ7wQ~{ ra<߅eFr&`HI}5/0/C֠ꓤęnnQ42*ZpBgT\?%]Rݓ޵k PDgǒkeҒ8s_?gf_ |f>_bSτbs?F{5e72I<%\.o‰02öTeq }m>Y4ɐ5A4il߀n%˹sBӂTn(s5+{. r dc)V85g\O&IIӦ µ{oKt;S I( {䋬өqs9)I _݉Y,̓'j|0ys1v`ژ(UDjzIybvzٰYENJmx0"rU9OuT6N2`.-ߘI$f,$GX uIgz3_S")է0lP3Ì= _}K>6fur *ތE](;Uv6 ]*/f{(Am3᥶nfa[\~/a`*+BqXTx km1&G|Y4bȜ== khPŐ`MSݭ|;YХJIg.cKn(4g{T//?2iϝZŚqbpAsլs5A|}r8n\'û kq٬ $ͧ n=5vq`*O$aC!!YR) x@]"|lԋ!Q%0I8MrǓoK_nt)FfY/+ 7\W[ጭVpbsEm-IM Jp3*b5tԓtܚ z~.o'_=/*#։kEl"$6 Xx"%K-t,˴3Ǧf14I?2eZꇞ` p#sWFKq]gӃtr$(2[ Q /aM-°G0ee/ۥ2 \/C΢2ʼp*b qfi2lqR+8m3:Yv418YӉjȣeq&C}x }n]:tQɜ;4%8"V;[ 饄23A^7qG{>?rI+&m}Cb+W˦hL)T8ƈˉx pyp0c;qT,$ HJU, Q}W'l*܎-\XHNv5E6S2:͡ #Nc}HB7ӽB5C/fo,umfqy;-D߮eH 0.}CCW5.E=LT=(` O-xVU_+S] ($J&DeI6RM鍸JP1Vm] 5k Õ*e:so'&Nd_ӛ9%b/.Sr塝 Q qp5cܫj $5.F#Wl)d}464>7R/9%ģ]vHUYa9[X?tsq+#?zS6?/Q m!R*Ӹ߯Gr1swEcuۏwa  A(㓑aHār#$NR<ゥLW&D׋^dFyS}Q ^T^ :q8"@`b 1x.׊n5_| ]䱜OBmKf¬rk6`4gHŶ]KL.^EL( ڎ?m$$~[9.EZ1ㇿG ޜrΰT0$|쐦1.eHGzL96uC73gTe$r5n~(E`WkxtR_ߑ8NkT8jrjCKzv*pitʜ,$mЌaws o _qG Zwf~#}vxF:X'KITwl?( Գʥ`2+*)թjo^ƻ`TbCD-?(GH!?W,N38GcܓjR. AM"upفۛ~4o굌3ѪTT]"Ĩţ%)Ǿgp&:Ue]a7H,Y`0m'E\&Gmm+(WyڽE )(AB 9kSNt /0lxym-J6G!ߞZ`&gG}S< ?hn*0t_BwnJ./_tQK $V_$ެDa{M*h|\V>WXՑ^Oq6aK`v= */uRI  e-K1&4}$$A7MhL e 3fN*btze`qIFoJ*RVn<XCzw˒/D 9lT3KXkBq|+j3ǚZGN&ncn^'8 rU EWcmݩfrXA8EYIJM{0[ Ü-q+]Պ&.L} V DtܜHy/zQZ[q(])U$fQBF bb,IV֒}H ]6蔔JXUFcے8?}r䏙pͨ|!ߋByضڛ˯Qg_?N{7)~ޮ] .R=)᷺nBSXCEMsTvj=, P7dE=0B/9V 8J߽?H/P=gyӶ&Q 9&n,X'* CTqVרa$( # :1՗m 8}?S"X,&Ny94âx[zcqK,;; ktLj沘 +6WtcכyZ"e{X eg7Ũަ08Xo l"*5]Pl ohJ0k45 B3U#xo'gCbn?t\,o;8P /̕.!MT)xMzVT)w֔a3%&ftAg[bVsY=(x˒%TnOI4.(3q~LUM՚Cizʴ0BɨYel*N1`P7n]7&CͤU:l йyq{9YƖy떨OM:>.9۴4h-%WnT?7>uȘ܈`բI|zvmxnN~=!/dGY|Eb۬t)-+kАxiH96ĘmCQGkٵadiN5 ?HX^AgtQkDN~c@E tJPw~uu} e+&(jHΰ7(XE^6뚏 ֽXw=fTj=9RqCD!_Odhһt`B6=ywos8_QrQ$sB,NYgQ&v3p|YSpp?o aϧ8}H`5CF!V |nj,E B1^}DAe[ E(iRMlqG='[yknwaoLaFJ%@|+ExlIIznDNͩteB{ Ϣ28"mdk! %]t= =5dIVB]XTGtI_Nd>6m ;:f P 9#F@dXr#˧OQk6"FY}ieH95V}./ywZBq"%cjh^ F@-%˙Eܜ5(d/i7@ƬA`׆k-J@ /H-r0ein B=i/ |$vH@Rŕ}Y]]%Bvko\colHv5$/ /_`ɗ}p.ft]{A[(RCco dfב pƿ/ִ ބK/X T Qpe:pIh"/0]ò0*#Jι>AM*mv7ٶEGVc ]&7myyz[fmPӄ{lQRhFi|nM;t# -'u7tꢂb/5>WZs WrxY_w{"hJ)&ƨ VEnP/+Zi~mbA g势R8y&['*2^% >G5n/\u,#ԡN$=ݼ/&C{f][T&(͆k+qBb{^ҍj$|PIM/H7RB{\RUa=3QHyo\VR]ߤ1jNdG1D*$sDyzL Xhtc`H<\J@fAѫ/yEbYyV(S|jwVy%wdhE8/wszS&ZZ>mx=4YKenE\/`G|f2?n!1щyC`LOGJGMl륷ZT]Rf/Atw?h-omSθ JfvMGG&ٍ+6a0 W {FgVSYq {e/ytz|睻sEfO5\}p$f+2]fzk+/yh{Xuj:e)Fi\\[*S~V fI?)z7Sۛ8Ł*@8:jX3w~ZB3wf-1}vӺfY<8G#nIkŪJlC\]d[C?=Y+|3Wtk>yc|?(ΓH | )"4 s>g옒jQhD%馩r q QJ):7BE ts @wNj11Q{QgU Uo]vnx$_аfýoJ&#_ثJQVz>R2hھ X6x~);&_{rEٚӕ5#,po+Ez0E'քwU.{bފf#tel+~$҉}+8lW"WxK]břy*n츷Z6UHؔTɳ4|C@6Y͝]T5G!B_ 1e?; 6K3<8ݍ\TNsc[n;f2#| 7$^@PɔN wLnh~d!"D G(ږ$5FtKcZh tt);te薠k:*ym܊?5{6U9n#ws߷!]ӦJyS#Dzt_k!AI_/m) a0mz\,`y^Up@QUxoWd/"_ tIvFdk?|OiH44n 4B"&&OpY|.6vr['d=w^$,c57+¾t 8z|WF㧁sEv] l=m9 Nj*:mNP|:N?5O,83[6)D9=dϹ{j=sq.6qdϗg($ɒg<NW1RZ,? PVL&*ʹzxnG9HDy-u 4H\,/@SC!_cN HUy%wV: R+ЕP+/isjPv7ЁxzӒ  ېjUh>/yI /l)|Y'@Ƞ\!Z Ї:3p8{OZ]8$ G02֦HjupIrnk$0?'-Dd* I*\i{}nHB\ij-i|u+aq 9[CJh/܈D-;)+iw($[eѤ3N鐋Y;5 ?vni'mbejmyRID`+WSsR VO`+@fCVP?l1pY򝧑*!67hIl5ecn\uzΫ$JEwݕ\e];( (\(ǤQ3y( K*vOiK 'uxQDXU3\Sq<0Uq7H3pą yJ"Dmm_o6E$ȍnd:r9=gL^}n.)3(67p|ׇ ;p9R (s}ƚF\著WoX{աfTX0D]x/@Af J?{Ot'U}KqQ"TE c5D'q}OE_9H9$5_tBmDm"Zĉ{u1H+#c {㒯 ``~gSd_ 8ڥhN귋ɔֿ oĒ{nq(h!19z3d~r9{W|WjzĺR"*q(pӎQ0?Xan(mT`Ϡ3rhb3Gz3a-JXqH>a"%?ʶVSFq_"ݾ*[PVj 50QOādL֣a߳&rRiUÅ[1B!@Sgwt!s\,]IGzf_b%yw ]5֝*r+<ӌqQpvճs! ܍ۊz*\we_f2K% fÆ2h$aZX&gSR9K02EZ`HX|#o9r31!2~~5s-K#LPax3Ki3A-+cSaY`3J^w\⑬2:,}'Mw)AiX, yv miLlCѠ1],BxBhkD'gG:J8qwo,^81RNFC8Obb)@RcS#=ڀbc*MA?3&c Ԙ:6Rܤl?"C*!_U5&V'Ly U38qW;7\[8Zmӑ⑧b9Or7:70~ Y f--T`ÌdkPNqbkؘE<#}xF$yp7P^4Y6q]c}@ܸ,mQ!0U O@ iqYMN9uʖ238B!e== ZsNs,%DkE8#݉%7o ul!xJp$ BDhtwE%s[h>S ߥ&Mkd7r3f2~i"=3/,Ck4nMgj2'djTE|X)^0@ѿ)R0`59XrX7~W +N}2L4a]v<_)# _|0#yOͽtJ4vgQ q:Iw{ i6H&E6~zN ^|*F Z,6MW/MH9L6 dpWz(<pqZ.Ҧek~B}'#s"$ {]]X]n-hĨ={&Wv<<ħo\CB~4FfA1!WӤ_iۮmηVƈBaԦ[7NJMd$_~ψR-wax}7-%yANi& f<%Xk3$ł?},i/t8QaRZCC癇8#d֙'IN,5LkME)E !*.Lt14g[źL?۰˱vzַ#df4 8:\Terw fcЗ%ҋNFQ 4" rV.wu.B)Cpop:u}/:Q8Z#ěm#??:G7*>’vL,;#EiW]/7TYO أ"#c +(\#)q߉]d67…GMemr>Ip 4Urߠ' 9=C~#-i;I $%׷(8 (k?*ZQ)*y1=ݘa EYwuHJN:w9K\?Q}j3-Ȫ45Rurg4h r_\6wP~R/6&Z+:/$q!83νPlej2[xQ9͖ X&?΂]X@l}"Y2o1 tcqI1-qP"MLӪLY‡(#m8J'4%2OaY{x cBAԯkH>JZc GLgX,i.UfSlA mֆ1̍U!5E!, 2x)E2w9gj ZtCwiNZhP\D'֎P*1ɖTy!h=ЄS4*&8Ms@A$H.Pԋɚqyz1\Dzr~y>nt:oSD]AJv \.vjG2{;lG4Oi%wyO¬$y{4䮂-(2ЪIdjs([bKU_jWXn-S@:Lr?0NvTcja@ԛk`}G{Ȏz6^$D95K"@1n,|g--*D\Q9/YEF(Fd;>ǣ g-] i/l\.JCsxD+Yٖ}@ r7]5Q:5j{h/nEwSah1&OtX tΤwk` 1JCs0e!og[0bAh "Ne}u.tw.XCnv9\p{5DBߺ,~؍.BA_ĻVzѳ42l)lW;\`ON<FGdo`~0՘.]^TU#O6nǶ%Ey1D?y ޘ)^=^^t,U's+~tpw-8 iK Hh~r@>:]^/)4cB 2cac4L]:5ws `vq[ dU}]'Lc?3:|?Wj6Ŋ]{deŝyڙʇu5⫻^z›J1Jp endstream endobj 464 0 obj << /Length1 2262 /Length2 23769 /Length3 0 /Length 25061 /Filter /FlateDecode >> stream xڴuTۺ= ww Rݥ 8ݝEww+VJG} sYke\UYd9YJl*f6n@ "5 lr4`k9-ƏH :]ޜ3/ldЙTA`f3S77H"rrҟlq`hgQb(<ތ6:# hmjo Y4- )u =[a 7''pԒaH)kJL- ?@7VLe7>oҕ44TYpi_hޘjr v`e`rs\Xim >]qsxl W?hcttI&[қoboBԴW86֦**Lm@GSG@)`hA/@˟Jrw.z[?1SG7Wh69ڸ]Ua8eSSdV|@ O"Dv^9m6 _-AߘFJK-@^ %"26t%foloI;?"+B+2|66@ U]l6bV@3;ǿZ6依>67ކ b|(0U[SBNKL_aR G+7 m8>oSmkV, [  y<V?!߈*7JRFlV;Uo`uPUQ7{7zSqX5F\VͿXX5| |#`7x˵տ!k/'k?"lLx[?O7ooLQ)T8]l@XY7\߈r[9F?t{V/,c{& k]@v@oQ2x곽Dog >C-.aa0sIQ:6?7#,ClӚaY*quW2;%w("[>f|) :Rؿl&WMX+Jihe)-,?++jKh#hHwtpLb\Rxϳ7ccz.v-OwB_M{VL paucAF<.;7x>O~vj\hrd7Aq=w4E^ yT&l G@J:}n̐ulA< Dv>⎑: hϾ}B M>5@aq^x+i`fhgm% e_څJ` jE~Z(Ї?vϽI ֆyd+ޛaP bɊr-~;HCzztKYQt.7x0X map'5C eNz SPHjHf*#f Ǝ0Ȧ-dϬ'#!CT|!h '#G /.(oZ$џEK~|`Qkf`J\ 8e W_Ƃ|ܹXydФUR2hrq[1t}g9˱w0unZo3[w)x%T= sEgsFi'gv6Rǜr$ЖJ8M%t5һUt>jD* YXFϾ0cX {,I9""xvV`m@vڥ5@vG G=mv4}P<}eMXtNgJW_֥Ott6G)ŕBRqP-Pe}bHg 8XERhҎE1̚FwFa7'`l3}md[˴_[oDn 0,e MȢ`CMabjrEk$wcnH.VaV<(4Qw^џH߳t <{kE#on=V^Rig)GXk={(v28=dyD D~P()DS%E Q 0&ɝ.Jmǎ|I5(dPP+G"#ᰗBb575L~Xxh @:8KoXs;8a$v^<ⵓtjnj)MȐ'Bd.s%f0 mIk^J̤[AY^HiӍȎt VG^_vk Sccqt<= AAjq0'd&4q9 jul{JTeIڼ '޴e2S(?zF^/+)4]XʟWˇI sbz㱓]TP pEۖ=pufD1"!>HFp|dl͸ƫEN9%DZuQaI4$V5D/bO 5mw#V%(.%c51+}x7qX:,{XdҬ r,fh$uWQ5 ޴reѸSL`ex3 X'O>ϓϑ稼DeI*Y8h|?%- K\Of)s udGDR\~avrM`^* PoT tܑI|'F[U+jJe3] QĆĤiNmK9OR`6ZSjLdg> E0s i)<Ʈ!Lhp9O  -eAREA5G©Ek k"IH1Ahu> K<4+W^ |_4 [~q{ߖ% e9:6ySP*%)>!J9uXN~Qn@%@a wQFbGg&c엘*y=M.R/'9ޓ_w<(zE,^'-%Ca,Zhq PaԹbE}+];vb~lw-|dxב6˼0G-\'/*zTS+q憾$yP$+]\{Pӡ1~X_,)5 /+'(.A°KM v'U`)"30y "IL-u6z5Ck;n%EP4D:cQb]@fq5bT?w2Y;(S8DXxrT-iΐ< @Ѱxmv^X*bjі``3OרG-!^ѹ 2A/@+}=Y c#A@B ]t) @^?&H<`|0H i ǰTrZJGW.?qRJ7$Y QmT~iްeDg4c;)_͉_ alTQ"7SG7 vVqꉊT()P10B7EfշbVF4Eufe]S@OK Q Z[h|]rO7$s -̚-H%D1$vZdB9ˏ.bU4I!lD-'3Uϰ;TAeQC<֔ːQ*cXTAWi2K%HM,3(ZBBK4x0E\+@Ȁ !g?E1n"˛ o c畳@9#JKP E>OKK5oe#,[`=8\U%\&:QfbéUr&`\Fw̠υx_rO=2szmh~!-RImTmϊTZ$$W>[h+FYbwlk暪Ty%p ϰzT3$xteB60?hgWHՑFdh2?DWBJ'f1IUaD@ae:ӁLu#p P=_n2W~\z9j*Nw=^Cڹf%.}]OiXثk-RNQVN~GajJj_BS78$0٨IĊ07&Dض{j8-@,]{8j#pɩl0XH-0CB*<,V }5߯hC2OCjY;IK"m KnA٫TҼc{y\ ])΍;gU0Anf`^O'L,DCy^hf?vx0,Z(dFjϲFzTNeE]s;x&CV;w:6#%}qyYв{ʹ//c`t<_IN,Nǧ}X}@!͚9-I%%Xߝfԛ|ayE ?琙vR943ҍ$SR;f* ]*ajgk@C"ЗWmX@S )d_t Aˑj&Lֻy8E~hm0+N2` H2p[LÓjFexU>켤5n5% +1e|iRX kO 6A7OXzٴYƮ~)<-ųC6OsZXgăwqCcٴ#ơ귉h\M"1bTɅc#{|v"zd ZhE&Gz17Ct,"ۄwoɁwDrRYj}N>mX_6tࣞ,BmUǟ,F'[)ViꨊD`-􍞸mH9@x]^W2Iʣ<%ˡOҘ*d.fYc.y ^Oբ/C1jmXyHԬ^1=1ӝjY@UsjIK0ha⮭ 4>7w '8 iI)W3C@Wyvٟ*OMludx>Er^T+Q.H,tFs/Q)O;q^ZdkVXZa23ceh~Z㿋 iJoǫPP2`kJ ~Q0>Kt+>}lQ3v'r _‰@vCXʃo.Q!75UTB ?wu|җQ/HgǷ/O,xRμf}V2 =gTR/jX{O1E#cřۥ%F2k]@6◉s[Bƣ8`b=oyñ43Oep:S XHobġ0#ESB(}ȱ8zDv]Q58~$\a1=W:M."p:,2:ʖ Qz,yQ} Ev7RK]V:֓kBnƋg"\+K(ʘg"Sw̔;ߙZǿ51bqڴk"7Mܞaހ]{kdbP첑}-ߡsbmy\ԆV̆M-*x UZ?b~%J\~dǬİd.QC\ ?DO*qucJ`,dĥ[ª () f'Lf>)RFU8 1N]CYO! Y[-3ZP&/b 8|NB"L4922ϣ. Ќu'<BxhãZMa4U;;iٶ=TP"&Kjqk[e d,8Wpl~=HYei][{~QVg1h?]k()Y&W. r1%x9T Tt, (qL1)91NwYýIZjOI3K~L͋!E>{c}.'m/trm*(cپyc&US}nʥ+˙җgġnCV>G/L鹛M4]B=o&Bq4K9ZMbQ2<]?|'y$/qCTbWoc 7eG Bn} wV99񦧹rnWK• j -OcUߑԪ]S}z6/yo?OU&ԩe^lR; ʢ5B AX1(`qn3h[#116fRD!=U HYupN2 vFOk<>Jp'@ ~ $j@QɛjBJA:@= }G[x 4qqk9{Mڱ/ԧX*6qA-?74^ Eeuvh ܠ`,n,e HGS\n>=ua L UM%QӞ{3 3vYDd`F `v>~vJdkSF2K|?8ͯ1h,y_97@&Т'Bzh k|d:&U8^ 5qn"fxϣ7yiiz ZyH?l:ѻ D7?~#n;-4zγ652CrV! ʇ] ~^#Gpl^'UNIoU4EzUPW|R{ apn+ciڊ:cr]3xagD`f w$G{q:vZ-򩎟%VGp}np1\M<>.HGgh?g͘4$}1u"녥dV} WfXFUMdz*Dy*>1C$hU|Bm^ȃ%%maExR>ky\4)?ಌWF %Em"abNzJEpdhъQPp#pq'MBk\V[bG9IXTΚ5Tg&P%lI Rz\'r;q|\YMCO-&ӻ l2, @SVcEQ[zj4+L{q(c 4cO+nF;G{'Ofo`QȂSif_2W\j|$GAϫK9ʣ>-K:RʐbLEIH|4tϿا=~jR6nROEZsA4n=LOA!vO$Iz_ ga+{: F+X+)|`lbwc!'`ݠ?ʕpw1RpEgGt,ӰbY[ۖA+HS ^) biԞlQiU]>Z h`7gLnbw$\.Z2aM.Mb\ƿЧqؕ 䰴w6D9oN;or杷Mԙ!*DDp݌PRKX_K]1!΅&ǚ.\f +ݫ"9Q @Pz\(YP.LI8J~-y+3 CyF+\<,r{?ՑWЛJFCzaKg1ʵms +L괤bw4W,HH]yCyI.pSFt N ;Sm̙3G @4717\ Nl~)6${C{B?wGm[\NZm~vF?4aC$E}w0* ,RrA:GqԾ/eA3Pb,"hў3Mf匉Q?ߞ4FRy2"~n;jYEr2Qψ7.ژԣTCmŚG;vݲnJV. "'=F4 [T$HcIr#M(?%.ގT ۥife4Tά)6u}X5srP(!BDzgO4>Xqp*;`! C k\R gf=xMi}u|ED":=vs4;!ΔkχN9ܾ䲫z5 !+}.v'1 -$y[:odGQ.U"d_RQcXٍȁ=13"EޢnsL<=PʰA_Pb9&ψ+4$5{+?,x[v쾐 [%]-ɽ*oY(S1N`217hhO.X&iő">j!5 a2`5Uxk^\}tcۻ}VWNbۛmq-%~K_qf:x(.fCWy/JJ/uV 2Q^~y15|:mYh!]W:度!F(wGn~N &=I9(i{-됱Bjc3}w^} hm'3aw6M <3k(#urʚb24iI͎t T&f`jh<ل)l8NlDE. S얎B d&["F94uf"-<קjm9-} M۪K#*8-d",P"2#b~b# ιpqWЕB16?g$}:7ԥdr}ƲvFpnAJa"ô j#$"zҘ׆ Mo^G'IlWc"s³GzmYzIH@:}ӓ TE£zaIh_MWzlZ>=UN_xu?wLP6&q(Bb3qffGsqb}\!q5 Qggi2]>ɧ'>fc^ jk5hy,ktU.8y+nqq_hO&[0֣kǒo.2r듯E>F7!gy"9;C`XAy. xgO-0ȵ$n=<l8,5޺?S_sxٕVFrbbY#Y\bt+GMn]gc힣(ODPWuD6H)>V) s`+ r@=Kg )p}̅c:z2"eyI%=:h~Eem !iw s E\N M U&!O3+-Ng?M [Aphfm!,''-qR^'G,YeR8A݈um.*6/>nYA%5N]Xc߲~k'Wܢnv|z~H]999I{ip0NS)jT$]GvյjiITb3 +˱ GSӇ4~8C OiW4&yE2.ח * ۜ'u*e$gv#Z.WVJJ]rAʌW??G?QUx,m ł1GY<$>˛LX#_ Bgpў T;,>EZ/KCT^MՅ#Czr놛tjW偹C3e6ǩ%RgEkqĻ.<(&U LZse~=5X#sNqwϥ-j: NW|bMXYɂ*ˠY%_[8mO&N&얒 km^J9}M)Ƽ<3* H7վ O@b;(x5FGo(41ڐB ?@1+%@}t=FH k+XZh}Y^E5a9FRl::Rõ<#IUEur @Y EJ#cbYjew*$w3זлZlnbEc d[λT& ^+!M6%3[8ӅcCrf}z&xӏ-wjAa$;>b!Q'EѱQX5 i2К;Y8pz{zaw.3=qlòB;B]mQ ;Au#_.> 0|: mzmȺh1gJ!hP[IGaίu]7'ؒ|3Y1#bA/ι7 1+iN5](m~gV\kKt$M-{,Yq[pMh,hʾb 4AgQ9(F.'N7~Ń#jxjF:x.=H4E^<ۀ#]9:Hux1\%z6uh| &MB\h`\A͒y= *磺TPƾ]l%½!le)^kσ)`w(́eIlQءQe ܐvxD]hH}S=W _*,␬'e1eB9*=(H~TfC>|Bg R!]'e6PzDE+L">7`gc$FzDs}@4s->~_R rɂS9WnaUnb\wʶiuN;EZ3g+6vJY}H9_sb33Ů2"y2C;Ɋ!\BMUZG r)]v:E? i-tk$~ xIP:`~q7ⳠSsZ:Xyԧ[eŒs7dCYMn>؟}Țixj6w+SᲇT07'PETehrGF^*&B[hEA-ޥ4Ew/oϢ-${'}ƧozeFM.`<*]FF{aU p@jiQ awJmD\p!$yN'=D3LIE_HPgX#O'ā lK 8okv 8c6Wund+ąYN%-uZH% ҿ؉H,F>ay ?r(AOn bs֖EA]@TORPe }= ~uWEC͕TN7G'"sY_ OyDNn)CgXhI7>#2[n3]OC rd zO9;<[ݨԸ9F[md^_q-6'a)3Heh/Pz n\DB|=o\|PhtM~2ߛg0Yæ·;N^I-Q(Z4FL Хf` $!sc8>Ԣ<^uj $)}y< n"٥{V0e:#4Onfh'N035_7y/ʵM_IѻG:#2ҸGcb3v#D˫ry - ϋVWV\:Riiofˑ!ُSľjx8uFoANTetHSB iy?TL.VMP>hHmcL`IXwk pkkUݎ&Sw9zp 4:*Ƭ۞`ſ^za{y7nq3"y<'6MoECk+$۶7:v:m۶͎m۶m[mf33QUs*tQ|],{ =㳲Vlwn?ÎnQޞz`v4h0<Ԧ:fC=mVXSZh-&OQF/@zI1ZqrKr-2j&-j0p8oכ'<H$W.6,19b2h|OU- |0[c 8@@IW% qkV0wn&Eh|4 BOSfl32sQBl(qL&lF&{>AcxBoO}XKEwWS0DbiZvVgE0/[%F.I4\pl« gɭ맻 #\OEr}ђ*=od©R*J(oM%<  ՙ│4q32g:2ڶBM)\p KXQQBNvq'<߁lE-+\BUMU߇(›OU ;1r ZEd:8m̦{]&q[V|bSrz#`SZWt"̈2mѝoutԑOgFu6_;X~tTZ uc9E\3YZ, $xuL-PgjZ QVh/;78kt2FL<ћUFP%nP*ުl';dgl1T3*hC\tu1 ڄ &]:u4508NkK #\3۝G0kPP\!wxB~Sʠ,zr2%haRx_1 o4nT/^8-a ~ FdHM~}tGqC. 6l;,) Db%r0'|]v ߅C{ͦZ V}ؙ,"")ȚYʵx%z->h.xUUq?]%R 9zcVtJ@K!qnH Ŗ9r#wi̳ܰb鰏e}اĴɲ*C޵GڶtvCڜRYmWƮ.Fl._k ĩ%PDcvWOAd"3o#Qf:^-HazBꍘbO8) ᾊЛˊݔFv-#fߎv,Q5*I;&?$X:{ЗqˋC=5+ Qv˱wD=w ڴc2ž ;Tŕ]4rIr0z V]!xݧChu2$w@y:a{oieKBvZ9EO'2ց 똓ul8ϛÃpܺV'G ;^-h;cI9lwz + dn\)Z6GE/0$[mC–tÂITh$Kk/&0ZɌUUgA2I;$~Šтv)u DΤ=Ϙn6z\fy_$-e =TT`p!m0F .Mk>+Ϫ,.RB*ÄxdFLv[$pO|1=g5*J1kVz_ ŗEsOQƼ#O@#` 5f/%~snZvv:H:$g3AvU?1UmRs!ˠl8Wl;yz׭F`B.WgCQl RH9Ȳ>(oa[cI-7!!9-2n4X*,n 3dXUR_LEjޛe@p۶\PM|7XQﭿ؀ҷc5X]:YVL: 'ʘ0MH 3 -Zf,WOU'"ᥥ_qqP4H5bbzȾ&OUpӣ貔,adk.!1zh^Hhl!L ,t峯ڿ·E#㧶O%)Tp af0uVc] Iya2v7vNl;~AjK\M@1O>kyG&2sp*VA3hOZ4" yˣ߽Zd|5@a)eQf5/0'iXhzQ<9oD=C<U\|V=!z2(f=Eџ7/4uf?R@kf{ySɓi3QݟVU7Gt핳S-16!6왓Q&l"",ATjiEzo 2JOZ]GCU ; `%: JmH.lW1j[})m:,J  ؎⸌BG3rgzszҶN~i^IX+Hj[ U5^Nqf^Wc]W^t~ZuOb&ͷōc `LDm8mzT0*eʋ_jᰢyAU򲗫g"ȳw \wA9EtI}%w)fJ%1&]+M^*GxӰ !2"@iˁŠ(k8V_>9@Ӂ?1I,}'A<֙]ԲJ iM:bp9Q 'dзst/:EeӁt~?y4:$Bq ! 桯oa  qDBa-[$(LDj`Ou$V8J=-ԉ 6,' PZbK=J9lK)|d,TRFÊ6cْ8 BS;:t͒~ oُ$o m$2X~ֲ5r΋Ʌ!d;1%C>̐lW}*p%A=jrnΒ{:"Ḳ}m vn|Җsw'h-| ,H@"ͼ{T0Җ7}4x8w [C!v*q:ŢsgLA{0"# %jOQoz4ïѱS3[d6:GGBz%?RAcNɾa"޿S;s fyFl̀gbuO10O`$U^gt{Tġbvkh"ك%k˟`fY3d E/VDZj"@~[#Kɨ$ NѠ\w}r@n:m_ Oyb:j֔bNlr#k<Khtt =BL,B81PXe _Gm"?CnwVQyys*rY_OG ǐ'Fx@.c I G1:TT~}3-eDVp7Iw+US@^L~%YI  ;hQx"=" (սϒ?T"tk CQwx`YD73kۋh'MHIO#6E 1oTP2#0*Q 8'ONsifxЕ-WGY g}M[Ζ͗/uϣK1| ? 1$Ue\)=:񁷘ʿ,Po^[^O4tiB#8r*ك uГ/ y\Jl8g} 2y_҂;VKE]2.J{RԤ+\^%#mh$R0EyڒOSn( g 2w?'Td9d+6rqe@_'5VvK#P~n,! > ŝ* O̎h!;f:R$ 5m a%Dş|Iڈ'ZRC ҫs0x"W5M) K`n=WPɇ%FBgXHST}3gSE}jQyas̠XNoyt9 Ѯ}[4nog"rK,e^2Rpdm BK.wbꖉ}8d 3Or۞E9.KV # dx\W鴿[0@+(:eXl_eRE˗QF/JUlruU!+|3'Ek%z̺mML&TU~̣ٻV05"++dWqd oo@Ź@ƞrI/.k^*]z;IJ!,S/SjNDh 8x ITO^B K9]QW(7]s ؄_׻OloI_cmF/]{j }`QOi3.z;)i!Iz5uULcc~3Fpa40iKjn@P/O t0,5 cZl˓E[H1 26ĿoEG`z>t>$y߬|󬭦2VȐhc5Azm]霂s[T+xV[NXV&Wt5t,2F-T͎L!m2`#B endstream endobj 466 0 obj << /Length1 1757 /Length2 18989 /Length3 0 /Length 20151 /Filter /FlateDecode >> stream xڴeT\ݶ-ݽ@!8P[pnCK}=Vj1cU%Hڑ Uҷv2X9 LL" }G3kQ}G7 oj`fb₧|Y?F7,Q_P#(88;|A&f [7{3Sǿ9Xf-7qq0[dr6.J35doi 1(*JbJ* J4 lmm%etQ!9e1HUEI2:oǿbB b@ƿk {e7G?Ԧ܌... &N 6& ljp|\Aq67 cfv ʏmǿ9-pWS}bedVf֎ k}kGG}G'?7D֐o-߭ |LK?wL߰6v0sptWF{{ffNVHNR\LI^x6X38:7 7b0}THk}hcYEɖQNR?T39 ;ДoW `o23}\=AG{'ǿ:~cX.iml6T)5tl?AϜG-q'KK9}+B~Vfn?<@{ҷ+H_K/}!kK/߁`c0q탔 +?&0ȪJ?Mзwg3j#?\02X8~l6 hWdA&2G2Md0 `7 o"DBn{ J3 u #+9X̌>n"ho郏뿿i3J-,lA gaYY.lg>r/'5xMBQr1cKB.Nfo}Өmd$ ),[+&n {z f2.vIejNƶTFEڻ"ѮɴJ[Ws\ fM讋`OBK_frGm{0uL9Y`eQ*N4ᔬlx3!!㋔T/`] Ql.%"e$/uEl#剮;1ʀ3Pۨg]ruC1WۀeWFW|1`[ڕW/ 8_6Y),]G6nNWeNÉ[ZprKx MKPxbb$ƅԌtDϲ"@x٘}j!g %>Vyj_g&<<$o,I@3%-BK%ik1F: jRd$&+; 13Ú5TS{?󰻾ZbA~|@I0X\l}*oCthޓ $o[?]I1ƙ7)(uVq{p黹Rh)nM(n֠3|F>W=!r}: m]ګAr@m&d{hvLù7C\Xjɶ?[ *ܺ -ٞ@tHG[&iȧ(}U6coE2jz\ehlu~Y0\ע%\t.t֐!>^1|FCY-_]prQE۲_j_EXOj{vdhR1=V`IK'[DXҩ\tRxG oٟ/* i"x6u&I>jK׏>m\eڨb zx"{>I9੊q:y"yMlᄔn:Yh=]vOS[@V̸Ϝh\ 4}uH[#K{!?FM\aw\qSw M^1͞fShN%!}}4?M^OjK.xZrLv0DXhP?=߼Hs:8 tF @oq9?Qۊ]vݰB&Fd:ux%̆d ;K}C W jL%zݟ ˡYx<,-6J*,)DO*zNYLƚJ$X /:ЇyJK6 *iWB 6KWydp%ˡ+2Mgдń;RnU G0+&}5 ;RFy!ni{l¸0Z;AC`w4 Xug.11c\1b骢>zi~wBPkdM(Hukq0a9{Lj)#YXRNs+{`KZM)MY:wy3ݨiO"6>OPURqF֭3֊@R V,[{3 벖0l.8yNsxؔƋizY꬯$hdBőm #`k;Mr[:mӍ=kTu7"R( YC*F>s q;74.ίnSC&Gz<,WJ@k.BlWU7 ꣅ%d@wI6g"ԜI#i);pj=y4h1S%z+[KqͱaRGD ѸݙddR~'յz͈K5ZZ_[-{-8/YXjT͐oO *v0]<ļ ?~ذ QƅjѬ j=yˎqct0TvWٴ趄'j@Q$y٠&8}֛bءVۿͮD O쐝o$T<+%Jn>_'7NJ#: B/Cy!P*:xl@U11>0u6:ZH$`yʵdPJOɬ4ƗH\' xm2T(moÕ 6g}+ږC[plO9]Uay :$|7R{N>+t=ZQaŎe+[L/ݵoJ@BY+/HQZBFJ}!U)3"4o278$՜(}Z$%n@#+7B/h/n46Y~w2dt;RkO*`R-2,ݭN!)M~YЕLuzHif_GT{[ho^͡yKJ:\Cy5\k-V<*\C05Cc+GyDT"ΙmJW?Z¯3P<#̺/?WXښHWlUva4wQIwC,5:VX+ŽEz/wG (H~LE Eb:wTWLx~Hpҏw=ţ\,&wB%gLF|([P)4f=`Hj&N paAFQ9I{B d'dZvJrї7Zk7+;fn$C W 4:VJ#0Y+7" AdԬe./~6üE׊ցC*Qԋ鰺+--oIZ\ |0 Bޕ?xo˔utb1JusOϼ eV3a" Ȯ[Pb{G!qiQpbΜCo'gjȹN-БEYppuz qi;g k#uJ )i Ïھ iKj2\ΌZpjYx5ȟ+ MXO))$حw+҇8jR 4s`UYϹգ[y`@g+.E2}҂;/;f5ylP>spB)tb3k~ XlkU|_RYlA ZJ]x wYp풻ed)GQ;EgD7[Jdcci+^5n߷&?>_?<{LN yZžݓKY/ǛEp]BCaםc {5^PWMj!\.ީg\{[GauLxDMqzӍͣ卺rۣ7 ?/85QrWk&4Օ^)G 3|ec$}{Om&ˋOChc_ێ%"P )ܺb]~M {Yb` 񌽗GH6v2z͸ |t%o {94o_7'\>ݸvZ#رWV ʘMঐGY}иsIT=0+aO &-ۉ_h[?QYN 1!pf6\x.iTkJS,Ȁ U-)%﬜j.hԃNMi@ vLNVZTmf)F[8mJv0/J9OS-%$(?6΢T3zg`}ȧ )vPP{JJ'9DWՃ)wrʔ 0$;?JUZIQ[OƝ$݊8>͍51QZ>B'/ݐͅS?*qgm Hxq69:Q &s 'qЍό\E9~/G}xusPN(^2K9MjX9()HS,9_Ǿ,{<:t,'SXߌ&'GSv:zbܨ#b4;*Or weYLv>okPt(r jE (J暪\_۫ Q[ qE*?Mx5K^?+_@1?_ Xy*C٬[."{Qh_˞!׹vɋc/k7ڙIxr:Ccej*]5킙Օ[V D$OR?@12M?$f?̘i N xJ08pÜa (\]RP jn ƭ.ڢ`{wόb47QT!?a^@YhD\'6luHK:+=aA1|8/ןw(It'n/V!KZ84R_"%TBzr[5tD.;ZBg>ǤLWPyON%kqKpS %Ax_;x U|U׻6t-P)uհsǫS&"b%Qϟ|94p4HkC޾.f Vg(}U,B Hq)q;;cGd0E1`iό#T0i\S$WzrpQԴ,_,܂Y2WV/D۬3hrJ/sv6H D2}i2|yٺu{ׇԇQXCK]Tjz0P<+`>),48|b[N<ƙsDOne*Pg#NȲHGc-%M!1؈c`H%-^EY5q h` jVM,lI*cʞF ɪuJ՚yϋ^99ao,h,1 ?)HBpZ Q M͒ٷ!nytn l}G%e8Õzӽ>Ϊ*&vA wW{V1b/ԋL ҄2Qwi6 HAg _nUmDT(-#MhU4RU/]ØBv2>t(u7ھSijs DˆtFy2w'u_[ʝsdM D,gfz tg{\8}|/H1'Q|&(F;B?+pb-@-%km *5 qvhZ1Vƛ$Zx`1^LYc:\SSTэOK I̯_=]ZgfYbuSߪ$>ET<rJTRd&87dTY9S0Nx8t}/PJe+ݴF&5M+W?:@λW@e.JI$^&jW9b7})bO\6' y3DBLs\2es}+8GOj1,9gϳW+$B} m ;tFqwyr3x~3 \'5w|hoµg\'u^q?,U!c u'"lj0LKE'?]dP^=NIxU3_TJ{>F~n|D˼qqbwxeι@%(ܨET}o\8rqAV"p9%1(Nt'}EOIM':QcDB=W^CtϽa<^<eئ("УB[HMűжH͛2"v6Pa ##{-%/B8΢x|y-tN{0+ p!^b;^ՍW.&"9QGRYFgܗrπdĨgSx X*\LL.H1V#áϤmZ+m899B,@ѝK+-Q*~ڟ3BF6g&A8Mٙ1a8{5<8 oj<{-5.ۻ(~1kP#{ 7+7R4OZ.nfjfmԗ T_D5- #ӶdNO逶~6=:X_-ds9+H}Dlks|*a }M3*…k(Csdm_D)'.xyHqj.02г零@6dXqm7^Z̨ 4#t:ϖFw3Jd_(7O6`7񭚣'9S_MJpH/RJ*<.XOlJ笒Z֗%PɎ3[ tGHB@ g_$6вoVJ.,&pkH_{R{Q)zp9uЏoxI[s99k` Z˒ϩtKacY'M:7a&= Y iAI{P*GQ\;5h]"ox>B3:eE%!{Oȹx)P-3O[kw-~G$߮U)cmT:/R3Tnx8YކoFbܹb7N۔I ̞WFoYi% 34O#sg=9k%fH"dWNd"ɀ&EG+vLɆiU[cVag6{d ">A \PB['Śy܏qϧUtKNȡ%MJ7qнk`xXXEkZ'Aʮ ЧE'-ȃnLʙtLJS's)Ϡms6[[mQ;f|wi=Hֶᅴ[ꋵXX*)I/WȤ0SKP}aށU*؟lPI-b;`0cEz-l8 ͯH=,YIYC'وLS\D`y@qv6Uύv%&r&bllT"G*Њ='%~N:_΍ xK  $^y>(W׆hy eaYB&ҒUڀ(o7%U TVdxU%7#etX|8j=pGXO9%0`[mt$H@V@: 3q_D-k:_2G.:\pK Ь#4-B%To׶iM~o+.&&}J #߾t f^1iAJYb_t=2?S}~0ѯgzVJz1[mؾ6R?7%Q!~dԫ _JdƏxfzjI2謟zx&i_pBaXt5v"W-"4v> ƻ@v A3;E"D#aWMaf&Peoo5BrmdT>K=KW]g-lZ<җav{oODXSؔ?kRm6JvyV %Aڏbi#eVح~AXU]mtzo~&;𫴅H؍  aRttY&OTMF[xCS˜%('IX6fﻁ:ʃ?hX~ZgM ,?!fֻ;s#`e\cUa:Ή\ַ`ypq/Fy*E:=K4.lu$Ù0iprZiMbmw-HAXw5b1K/'ɬ>_i #YZ[>UV]y;/SU T˳g>(l ;hE X-" ^]F^iN.w-!)'Ϯ33"67F>g$,0X>ڽ(;7R~Ui,Ϭ6~bЖ6|{ pD4v&\+gv;㯅|Q_&jvGf4ڟ?&uUt~vS\Dv>՗> /sATӪa_XK _a?k뽨Apt]~]z {>9u.}om29H:e~lS/5bʲ"eq_Dt`(:+]IH,T y"l˄|6拿((?~Ҋy2b#3wȱx {Z+dBpT ϊtŚ-K#JcR^VEhwi)_/ #Qĭy>AWu܆T~-2v(?~$dwO]rKs/8fmJDrآr"?xvtN_?[;CgtKc"6$Ćc:[j\M6L֒"pVX|6\+&®HO1F}@ܸ,2+2?'fC4w a#h[g&Я-39͇4X̹=zgy*%Ԯ'vH0-R;/yWg55V9Y~68'[Մk)4ask{\ojaw=={ 8ZЦUj(mEᄈ_mJDg]'y=NN,2Yxf4pOFЗ:NgڪT%-w{\),9H&o:=i[@V^%T3> e%UNtdj8SV͞ zExhQp@bk'S?L41߈:.[]pPՒ>w7 hߒIy! }JX~VHAK kU18lz w܋'1*䵠@ͤ޵ьԔqԇ{CqC: b!G uK.Fsş[p,}ba3:V-z3^phgV gaA'i/dV(y&wKP罉w hh/ 9BNPb{e(zaX ,/v'4ۗgBs )4rM@ͪ@:?@vw2-ńg% ڗ]ia-]'nz ޛTv2x-:!i#C&od( G B[==nSzӴ͌ 賿Xqw\[Q&PHHK|f4vK9TQߠ6'^v@|bSb֙'IN,5LkME)[uw"6o:nqIz"ym8LSyL,Y{62iŪBS$zd$!ZADo\YY\͵DCU%LYд>xr k8HA =. g$p*pLw NljSm#Lgw̵xxRlPk4] P QĒB,97bGV ,`1 +me.q d# Ic݃R-W&b>hlۈ9}P,`E'NpT&r?NL"E6H(7ը\OQ-$v%BZB-up*>9)&|9]5"m™.&,~[_`#ڮ'N$iH4Ma*nӯd T"mL68ߙ[ُr_7o9T$K4D¸ID1݋2"B!E")~'W5G_RO,ڋR .v'4ۗgB|E?jMۧK(!6pRMv8XP!\yUgҽs;M uoFC N݆Йk]SPݕ+$K>"(HhEj1H6KO@lK+z:xX |ap)wv agj;(X{׳VLԕkyߥP4S%hY"0 L&:u?k-`qzh R7{.j9ɚsj73pȵ;ut{~Buh MH {%/^ބ-7=lmTOwE9!d@fx>DZ[C0#E!V:"~GrwBK 9֏7xj"=`p C#vv!WB{tz!- /EJ}d[} .ҹJNq}a-nBVJD] 4Z"+wxP~AE'KPwH2.Hw Γ?}Y2]7+-ɯ 0Hw}PBGӢ4u=WRb/M!-T+E~I`!0Į;#tx;4 ӸNnZUܷ%0P*]A&OJ2JJI3%e]}v@3:)m!nuY05j~Ky/d/췺,:%Fn9)SFeh`oL`>Э M0B \({ endstream endobj 468 0 obj << /Length1 1757 /Length2 16583 /Length3 0 /Length 17746 /Filter /FlateDecode >> stream xڴeX6S]ݝNpwZ8) ݝ};{ɝ:s )P WP3qpebP2vvX)(\& kGq(>B]<)h0(A&^N@?+ tv|9:yX[Z`c`o(#@``eT`(:z|(ԎShIT4h?999W/bjRqEu P Sѿ%=@Q·p uue g܁.GoP G @ '^&&FK7W%?[Y<]lO`?ỲA2@>i/w+X+,7vL>A& 7W?7М_ bn..k(E?Nog7foc9:Z\Y;SQPSg : O?9,<J89t >q@.^L׶>Woa`nys7'& :P0r寚?'G'+q5q@.n@?7o `nm ǰ]/G'm/ P34Sj`0Z3):>AϜG-I7;;E{ B~&v^?<{Vtt7'\df/`|p_``aR@}0cX]^V} d?Z@o&E)mm%Ú$ͭ,/x*rp|X>Xm+&FGG pt{<<&$fDV,&L&\M0`r?>߹-d5-P\L@.֞z|d*@?oѢ> <~+_Y. 4_Yr4 Im /ȟ)a<ԖZI & fP8K'9iSbٽnM5W1W'@dPX,"9)fho#httazGN!/k[˅(\`itC\F$X6Y7 qF5Q1E$+2;U X~mOp`l1ǥxK8U7+'Q6#R|#EZ.cTxŬnSkC,-[nRcgYd4̣,~(:b>шc{a N#% Yj" 决iwhU=Okm"C{,eob/D@bjO"oUݣ(?,ď͢EG̰jL.U%ej+W?{t7'\G؏q 3UL7/?$.ٱq/nbS~A3ΝuX3`SâP $P0D7'{Ӎ# |cKph0= wB6~187n['r ;o)Kg+;ib@v6,kOxC#U+Ȅ4:IGb7!XWb#*$PZI_b礇kV߉ĞёxJ8eV _W:5xҳ;/5532ꅅVRufHx9}IZ fiy -̝7䜖s\\뼢>Ko1\ rӓ~:}3ije;&o]BQ7T$ ^e0 u8qM)QPʾއy`tLȤm &GqXzvYҲ#HeMʨJn֮Vm?[Y/d:Ob#F_& G!dNmHfc>}33<4 ] YnKeͦՆt`ީĠb6[ ]4nq~SjIuiVPsXA@>Oȥ?j ʧD}>ƭDTt"G n..R/CͷNkGX=I #VNm#ۑ?j#W>Jh',tt 4l,k^8#pll[JJQundߑe\]?`dU"w>I#z/<G U@ps n@R.uy)n]1I8 :S$V,oj=Pg󫥒>M&K+w 34*Z&Ėd͂ x-ǾЫiYʪگ#MELh'_MaA1m]uv9WLRFkRra+uRu]]97> Vr <zN}vUG4~FU/6_SB1h($ړj`N)#Ҏ_I,}x2((ѲY@Y_ԒP#W,L Kk1UDmu[(('n`*&d,D'5x)5g8v4FPfL\Mpg$X|L?"9'}ɲH gf>:uJi8ĻrO^e6y[[v0uBy҅l'"/Ilt *MRB.ݤ1yLȑo(Ʃ8zwm@DںRˣˢs3u0\6XyLGX:'x<=(,$4īS&ܫqVw?(-5gNF4Zi/NI-# !BNm}U{Mڬ`MI٭g v.)wu =LOu Q e-|/EQEocr{`TF7's1ρRPyg: S|Y*O3$ݕeD?wPo)40 @9Be'.7uӫ0i)hTȵ >Q%J}K=/d]ݎv|lD)R}j1.y{IƯ9huDp CɅNoSS͆דޟdRH=r49lЭwӿ)9\9p@HRD#=%٦Ww0k+IOcIY8#4Tc2{\H|pÒu;0EFgjX~2W+N5pgq%;|ה'' EaQ.2Ӛ1`HRanSsM]* 3_.+e8r&]( wֿ)puV[\fC|׶YnrKFYuŀ!K;* 1q J963g#XU8p 4Lkpd]Pca3-VwxZJD[K킳ec/r s}.hU1@Zl)\+6@% H-Jۛ~{ nyyP'zcT`n›F)B9WgN.;: ~Fѐ9 U]RX %.&\D\bF钰 ??5EiOgRڋZ:SGŊXJ;߉NѮaJc׌@\q=\P1nܑ*7mEȣ,}[x{Lxm&.2onV5Z-Qslβ# )\n¡&&ĩVy/a1 S"[M+2l󯴭[=CG`2ٜm2Zڕ*$ٮkK6B#3N`Zd@YVokuT xF")rX)D(,ORRtkV@v^5ZO%>QpHX& ok%[v 9h‰/?jtbcW/~MLoڶh3DB6sxo4%1X m4e(8L䘤,JhL2)ci{> 0[4wfe8P8٨ZJ /OG=S NRc"<# =dq։hNjEnN<sèuY<V\帾O0ƪ~ZO5C#f~#`;17h/=~زG7d,eb\ ŵy'_ԷxxvPȮԧ 8O@yRS{0ى9ɓ;{IN/Sw=ޑX0l7Dmg].8kWnZ\mjIe N}阃?˦rpL(Llcxwpg~ AbTR绫 yGnk+Ft,WY A"7 n"V{ˡҏQ2CV_y֘;PR c^+i Q8"3*HmUyx"x.uk`){,?.Ik2ɂV]ƓyC>`F\E>?^"-RTn!s69ѭV^gAIT4q2ryV_t6\+=&\L"oZH=l: D 37ظC K [ZS$vJ j))Q ̦"4L T{K 9ء0喝k©5x*͖Ũ(t w,LRDԹZ7YwBdϔ`ꯞekM>=uOzrhk/H_3peF{cq+BH0P@(>DX)H5sW$ n:\^ I"Xo%?`ҮoYDgPOߑz.ܤZzxzW2|x][eoZW;#jF~;$rѱDn!K`IYOs2ٵ;7B ?YlJo]]} >A򟪗ΐIs/"oʔYG7$6?jM+G$RorgJܻV#O]sS#qB8?Ol5 ƞ[uA3Aurrˏ\ Ep%xܸޔ|do"ལ.$8/3$_-*6c u驪!$|Qme5#dn GpH y[1٨4$njFżpS$A͵U.ļ/M= f~=N]3da*w@!,k TTB X]'ZoH~fNAq~LG^\٫b tXĉjao1_ХmsT3uW~'!oRSɃ=Un."`Z&]bn}mV0rd:զS^0-ڧ3Hr48h=nޅ5>USp jB\_5a-((sPD'y]lk&)]_wc$m?`hY7eejk4oR~2Ϟ;苙gQGW׺ьp+yjIʡΆCƓ?-3\!-ϴEوIbG"\DgOH)48}8*;.^}Mycު 4ƭMX% ^xJw՜uub*Zw:salr?|Oڼ;5yZ"?P;f8?Qhcɷn#[G6z\\{_OwLq$S7171L9Խg@h6Ĕ bsa $H;v;e&G㓲EdȾq5ű56P&Dr.N\(aച`C9ȣ5l+nwItֺ@<^pݣYMI$K'0v<[ؿ0' 1τ-)獶o/࢑[T{-kjYczP5)IZ3}>t| 'eH4|= %{q'jdQ p+jp[i,`_r$S,u]s2BDӸ%\X”.KD'łS&U:݃HG K+ͣ_ɧ&Ml~"P{Ԯөݶ&0Ad,)pYƲ[;X3ɞPДLsO[8E\?Y kSK]Knv4 < {~u Smv&tgoe !PbL'`]a{?};Shk\J㼧BDhD)7 F]+0ٶI!xc핒aa붥8>)sN鋰C6]/*e6jENݗzgNgTDد!=҄r py*.ڠ&djlUZ!bv |Xj3ׄ.:kB&d(5 $^9UMt#1ƅtԼrҏ ޅ2U wy"9Ts/EV/l ))>s|eR\]Oc0+moXAŦ}d t3~';g!]%.28aauDG3%S>3(XzҬs׉bx@f%:G(%B d&c Aٝ*==eI: mMXХ lbOLeXr腒<@]tHr)& $ФMy~30gx q:z[hq/11^ /= SR^aDȦ96C'V 5b˳wڭo;&| ;(VM7qE:/hʹɁY4lLdǻM:u.ѧu߅?\&O:G46*.)4dԫ`(~\vjLyty2J$N[*Q7duVi^z7?F ˋj^hEa"fut'o`m6u!T+_繭`k2]j@}7ڈ>u%Sg}v'TF_ZbǨbIms%S71΁ژ'Sifߵ˷c/ē8IڇsK!w/R:M6r4]క|U" OlElizh)$^[WR SHmk?(7*8:#Ư KVg*fBg@V!0ؖr(USc@ۗ]U_Oě&0fQj_? Pɠ{&L"?x)|ySϿ7M<^a[=#͵׮:ZnjR[DJB '10ujS~r(bߙKv P!*1~K*YKZA70e3=Y|t6ҘSu81X?meмI"ZW%.&+A},4hD!$Y'_Kd%]C$#|ϑ<%9v{l$}14QW}}i HNy%I V"=}j|P\Uj/ Թޥ=Jxz˽ ޯ`D7Fܝ&5D#Z=5X\vY{OVe#׽61_JZ7FDX+(-7heQ6-)@΍Uef\Tꌾ=[޳XH=< ?x"w_H}6Hbͧ fz;̍(uu|fΈ;|anim";Rƍ3} yN=P >I\̀ʄ?O dD qm蓇.OZ ѱ_aC !Wη D}~nL>O~RKL~ ;Z e  Md ū&ߠ e2|G3 ԞX$ſG%IqVsKh4%C9{}i*,ub^UzhMbhn*لF6'O[wM1}v7^E%Խoȯg]&TNLķZ65U[/#D=je4[giKrꤗfx"MKUE6P#VXȑ"QiSmjt:;]1 mu \8Oe:/?:hEB=Q{7u?(+‰aMдVTd8iÛu5sZC]~Ra"}c5Zv= %+agnK{zKoع/SR,oКآ򫞭(t|\E^) 2nq7dƔOb6xu-$$S|iƫݹi!14 =1sx4ng6} {l\r9w+OggW_RXlRo+#1;W6Oe5%01BG" 8wm Ffi$wq;K(lNx桌 nK갅|+;Mq~U+kIwJI+LN ^R?[9A:Xuh!<}O(GߊUrRvjEr97)N?O/'LC=IW fEeR!+YxmU_3#e&e{. :UPmW?o b]keYІ"]K4ZWD$92x1LbLM? ܴ!Gox05r7:S-np~V:57]UI;y45̓+L9gh,Qd fv4]tOx0m`P:.&7^:am@k]0eo< JnorBesh V3&↿mU.e\tv^iqTN%n>i%&E4(?l ep":b\gAR6E(㜬gqdR$f3.B{Uja47zbfyd Pӵ5T蝄dRtHn`Bp\hfݓzjP~^CKsd,y'V(395/쟰$?!00h qLwp/kH/F2`d'yLgɊ#KeGҗU cm5ے}6!Q[Jɺ6+L./:sFB'&.ՠ?ϋT⊺kRŵ乿i~*39fO[yZBDO  vN OR {IoMDr$=@!p(Y(~Y§ y $t4vYv9e])gHL7QՃt_qvdd61jtzd=< \ޑqY j(4NLv;zu°y1ũ^~T E>Ti~@#x/քĥl<^bhtQ2h-#9^|Y8ھ2XP̘k=/ Ik>: ?ԓͯn.+e[/!?n<4@)|E/cA=\3n~UAZ󨚭5X\ JH P۪r8mbDC`;Rfւ~BV̋vT;ϙcD&$h4n &R%m,u" GVn5}}Hyi13 ⩖b/ Qˇb,%,Mv}8v77DV57;<߻3i=!kEk}$E΃\I[SʹF:l6Uru%WZ2LY6Le^ںOqa۸bFߩ1am*Ѳy1͈*H"fޠ_Oz{j'λ1}{yeFNODn+`R=skXHpڳQfh>QySv ڍls4z\(%$('Jh>(Yॷq VU4図D&i;?8K.[*O K#2< rwpd 'CV߱XeY$EFPc^j>qd/Ǹ %P뼅$\TMG,{ޚ BL`T$+y"8ؖo^hEdeFr}%H}ǬCfpP'=_&PU ˣ_;F>cvDgıx%7Ԙ%jB1b .k'*UncbtlS;ՕTATlѠ'ruN+~U飙CwOMh@ ` q?TeuevH%4/Sa?]GyU,"jOI+CƎ'1!{Xb9ZY<9u[Iّӵr_Z#x3zG! aG4q R1E2Hۂ61iw,DcهT.m9IҨk=^[7Z}nhM)x2#Pݐ |&cPu'%Eǵd<!7dflu%/4 'z+!N7l %ٌ& GOMnzg,F\ae#b(-ZVm6J]G@1:)7TTސ(0NTlK>D)zE0(a{u)@1ouŨ/@SC!_cN HUy¿W/UyV`DX`l}ڝFRfaA/61`NVL݃Y6ýJ:2j:$`*VK^)݂]~A#jܩZ TOraؾi- ȓ=Rȸ?]٣7"^\V48ˬG\(: FQ?XAzZ\>=[WKkR&W-T}|$͜nV*VT`p;TE7p_˻%F]GFf-Yڬr]ޅ` lN@Ɯip]՝I\褤Eb=2F.C>ZUpJn) or,.rAb-}=u@ew-kaq3+#k\yFi `!l'K+ד=;[mo_$RaaTT7;ҎKEwb3H<i+';{h Ah<58g| A 0qD|n͢0AN3/!o#W"SPoG*I)U( ctǢ^S2ߪS س.͕]iDI_shIR>-+|a#S_$A&݈.`"ثVS hpG]'&y endstream endobj 470 0 obj << /Length1 1608 /Length2 7409 /Length3 0 /Length 8229 /Filter /FlateDecode >> stream xڭVuTDBASQRa``aFSJFK鐸w9w}ucx]CO n Ð\"e:.0 äH@l<<naaa\z$D4մYY0uG=`pC6`|P  -s TQՕS0*kd00:B! "كpaf߭sc`b؂6{o`3@`-~asS#A-p_UUJ/HK wm{}74~'vsE!0{] 0B.l?4!01` @los{:?B]' 5湯 B׶p9/o`#g@Lw 渜p}IMe#Gw%C8@@ܿ0E7m PDm_ x?70{)8rBe `3Ud 0Bgǯ 3#^?cs-a Y~]@O 3;{yQek'K^u=C nO7- `l\a>aSl% q724 7'H ~9 -`3;=Y%$!KһI鷵puUhdyÛ MK9*Enk]oެɳ<26gRy1f=gd]4{v0'흚ѧkLz^97cgHJ3ƎCֵi8@2m8 t^,?@ j,y}Ԗ/yC@3?(y I{*{N9|M9|i+-6O1e;%ͬ,߇#pF<:xx6q,4ue( 2.ln~ RZ6T23LEbo=T:ꁢ>Ն|*Yq)LAKATe8)>T:{Wf|K!msޚ>-xcCQ.2m,(Im%KR<=y ewn"F %G9D8@knFY]r7KmaK-MIUx/xHц\Q1:]z٫?rӷ}9cJ D!s/Q| ܻ8s2BlvKGft [{MSIpPJ E'AN,l'm::"1,wy uݽ^# t'nDYXr>]HT%%5y:˝O#$GuGlƚh྾J chʹ0(i%&~o!Bqd  ;g{}aQIkxRId:Z"V@G*%v܈t~J tƤ{Uv:c L1qk>{8c~|iLFEStֈٱ+Le&F8q(Dꂜ\?R@RV%F< Zc11>5qo++{z_~$[~  2G&z'=)lܦ nak^0jԽ%$jCe(ч#CIUW]-TqFc H9a ar'<| ҽ"7]cr.GIR"ehOC~+ts}hteiժ;Yטe{v[=U.Bh%ӦCQSч ]1Z?T\K+7GmJLq٨ 3%WAIhM"®Z\|wߠ"~cBEXxjh˗Qpȋ:4RkerKY<Ӏ/U}>QpF}($Y[4-"YQi'ްcA)vg4JǶIqtq7&8M;RZF!3gp@yQQS 'h݃2北銑Qh:6YmJlST+t!ξ@ZNBXߊעx6.,}<3Gڢ[Tsb}WoR}HVaȩy`K^k7̗1 ɯ0$f8r4ĝfUfLfGJBU@[>C7a#YC螆- % y* /A[R`|f@"쌬&ݾԼ4(} CUy.Q5.yzDgVteN!s֚@bWhp]᠒;ryA"2Ob_.8$5^!;+uDbJ)>޳t+fIDxk2cMb /Ҕ ^/V4.ʕFIsqgPr-+3vݓi('UN^K_B GZcUJ'eogrW.j/OU0W)ʉ|r=/]5_7><WZ|Oð* #/|t*ͭ6vFx~Yk\>dxBwTl4ך&m; 7J+<{EZo7N;l6oMh\voь,ɵ -Y:W{a\f,h]Đ+aZo ^[I{*̷`I`\P]SӜGIDZZ mb[w%錡ydyp!(_ӭkױՠ"pMˈd0\_zʃSfԮ~ԻQa|)8yl;NUxsjz4%?GMz\R@6'gCRQlI-h?;`1,V;ByQ9Ş,J2sIK~ۧcʕAF^sϸ;Fa6|vg@.6 d1J^ l}Pq ~l^vNy9Sњa?;k]~Jh>C9K 3jӛ6Od5fCԃ//(p*3Kg;lI;^>f8B4+"YG#nJm'W/p-, 5GBŶ;޴~F+ƛ~U5dA4MeQ˱>E5+r=R~L;=̾VKe8n24ңQ GGR/Q_-Zt*S1cMHɔ|ӭ=uV9DlDe^mӤ6H]LQG~َ;һd#c\FJՉR,-eމt< Tgҳ75Ue3+WUN;Y6&_\G]c/fŞr2C/G2sLWQǢ®$/j^#7^ 6v'cM!U,4yh]%hI~g.,ihns Qn“CvqO{QړK6=TCol# X,Z?<8ǢbZ ii{gJF~UQػΓpoȓ7U~zʱiQ>wt|~rVu靉9z¡^qWx[C6Y.:uWKvCts7v_f?dxu1߅,VP)e5K`S:g>ZBc2WfU*r0P{K0Y"$ɑh(Rm }}Kmd^aopTI)^#&h:Gy] &}-m,.B5'4_Y N>RZx_1_\^CFG70ܛ$ٙʑ9&ٌB,eǫr8|]k(*g`3!|ϵȐ9 2SNkb~ Ԋ0wo_~H^.L|,*~U rO<>:0/{q&HRP 4_bY@4eDDiNi$tѣ5Ш -1MC<|(q GGcͤ5mLB=W h}7C<eSeηYGàq.kzt-W2Rro*B̟G*1,oP|zuWw_Dn% ^;8:(y1'%] Jb4U6gc`,.˽148A)+Irhlꌛ2_}͸sJwB+CU3G%v12}+ߞMq1 !;|:J_lW -jm~N \w>eXN'PUL]z' QZ@f/Cwm~q\.h8Y^m<`GCVF)O x vn5}5 4ieTv_tC0ܤqFm?8{~|L%{aߵQlmqeI e5[_; d֊TL%Yג,')? tx &z|?(.n9[-2ޥp |Crh/'yAWk3ẗZ=;hw׶>lG7X݁{39jpiʼSy?+5VXCrzA/YAus暇p ']8{;KweN6y?1p1\(ӽI]/>x]FuKz =xxjcڛ2CuQ?r-ӵ%TG_J yA=YsFMf0TwաJD-{cEC%͖ ӇJa/t-r$ik$Z>w&vdn 1ˬ-b򑂲 bj|v%PT\DI}sYܛz 9bVϷRc*~daT;n9"۾aɥ_I%uW{v٦/q7C[2}/oʁ%VWM~]U>u[4SC(gΕrь R:dm4QݖƷL<{y$F|+&IsYYN*0]@ft&4*vKzPVp6^ֿ{Ee/fS+0Um{@llɢ,J[a> UG=G_f냹PKȲj-!z-_z6ѓVP(] '炞K5]N8r$reCZ\b#ڸg(2ϼ)3q>[dswu Rⰳhr:_ނNtR"+!NIWA~04n [{㶵қSPvulpg"EHWPS_uU:.iȒWew^Lx{5hP=N]94\~x$U\X\z6tJJF&RT 67ͤfk&Q5"4??UQob."13D_L0)Mi?#:N}a"ډ$R\fe;=bxZF^DM.1+wCbuE}ה,՛W@ͭ,k+[vG0!Y1Ɋ-c9#(z2kM$pc\XwVNQz~ȍ & *ݰ WRJ(p|h&0pxN1Z[bQN=1 >G2(~Q2tEur='82KfmQ;-,ct;(d}3 ~`j$r@A{\[xԋ'[MDF-YVgBU/e_W.˔4)IJ)K%ol} E.jn>zyJkk4w3\}'Y%v}U֤ys޷|vS6+8ˁ)K-|= *ynЏMG2gI[`#Q&+`+o/~ endstream endobj 472 0 obj << /Length1 1144 /Length2 7572 /Length3 0 /Length 8339 /Filter /FlateDecode >> stream xuseX\ɺ5 7.58Ӎ48]'!CpIef99{][ZEK*iBPVN6!9XUd|y1hi7 s,m}m݁*@. '/_W!\ϔ4 j;;;ځ4AnwWK |qB :z,#@ ؿ4 {^x!dzAE[nm.ce] -,lmzܬ (;s2`7?0+)?x} [ْ3 ߘ  \ /K[?RjÜA`+?g3 gg za{PWwKheg Zlogd^j4`r{e|V#pUs'2?{wY%gEA^*oEV[C<ru{v!O2SI6[^g<8OZ9dƁϝh_Nv?@5w8{Lvnv^ +u;_ [@7?,?))e+; P ?sWЖkom\ XX ׇ|$dӹ|ruΆЧ p(#->KZ}VQ>,D&AP ?A>ADUa򔣟81EҀVVUٵή yEA @CAWJ=j/K->"%=w7\9;b h%Jl.{Ql.#(mf68Q Wġ M^ԄKF6N>baHNEnE]pIHIk⳴S:#'lIiB5Ldkpfjh[Cy7zz %k;De7>~!˻ ah|8d'(]PeK9KZ_bM`bou>ߣ+)L)ڗ:4:iTebPi8J@m4jQMFYRpl 0^1 7=̓ *AcpY3.#BձDa\cJ0aCimKjpYgFH%A uܟ_!-Wu'4Q6-1&˂[Zwޒ[ͺiOzSι"REaV4 Guw%{v4*b us9Y٢y!I1>]VdoY$dw6wԢPlhj$_طb|ݡ?,&ߪ8φhVJd,2P+a#)M-_ټi^s5rQybc1--{7H%߾pɕ=LѱEָH[גnJ1 :u WY^+W{2IV=k@Ӄ-QײDR#\h9 Z C1Up9N'u[ 0/KUiA]F¼"K@6a sp'i Eɰhulz|i6,iNӚV-d/Niͥ1\M 2g0G#`ݰ 0ɢWII:!~"~u!uq ]. F5$:sJ=0 | 5V?Bbn,_euXB:<d>,ƪphN;epF*꩕TCܳpxΟ:;!ߩh՟!#mrW\lZ - |/{ أZZU:kvF:8oyJ)-ɱ57hl2~'$Dr8ߑzLОx WFކ5CdK/F҅=Y'L>Q֕h,k6P7J&*,okczX&^?-BeMj߻RX-r͋ou8}Ma,Cˋ]O"GwgvI&ĩ 8'oTC QC$T%n3V2%mT<0*R1WQ%x{xfхwQH2VȾ,/WT3j[ nS^ BYE7KOIНx$>Q?%5e+:WsJ_t}D"JʪDB1˟WXѶ?:N]>al]W]uWTL rⰄv*I#D"u؅0F [%HO̦r> Lt|oBSI.;Ii7|/6/ѣ_hD+ƺ"c47r:?JT-/'4 =fVFf)" 5Q\듈 R/]iָR|luL^L # W@`$ F[yH.q|%APk%˟ w`;|9,<.Lqp  OTوe!wR~ym^> ;Y^29DíAgxP78G7U|Xٍ=Rڥs-E'|< )KI%VBƣ@s,ΣHĚ RDYK{X)LJoQ5/QTMu5핈f2&X #Jl>w8xMd&Ҷ6r5rQ5EemLrJW,W7 +_$ce\r̽g\b(zH]IDt8y<_P ];^W8v=xfa6n՗_!"X]S&srÎVlD;1x`Q/rs) YT| si/DPH U24ؔf&h2SZű.zqMmSK# _>u|tFubJ4i8=^E1xQ)aq$e[Y 'q_Eۺ_(ո]/hIG _ٚ¤dB/,c0cr((:xN,# )7 y Qޘ-eIh/Uc~ûeDe:{kWCg[ {'D";p<!h4xΏ1[`@g(גKxnj4K".;Dʌ1:)%H8ݝ1J}r=0ZH7]zDt%QD;sO Zjv]UVV2|d:JY̿f_cHM7TRpXNY GcL~ǩGz{_##,U_mZi`b:e7ҚhZO]ߨ*ŏ ;1{GJ*tnq!?xY/8W s^01:$DtvCT̫\GJ8XoFS=X -om1q&RT=IH'97 Ҁol)+OJ\܊ۇn~S Vu_y,,_39=#1r߁Iw2TEN(yIhpѫr GԷ/c+7QO8w}Uy#i&&?py`Twa,t:S R3v=8J_K9)LAbx趻eFUWޙm;atR|4O8p=ף9Gj$_o6 E 1]iCQ7аUBcR)=X7sMOV#4Q`-v}QS3e5XuH9sJe4ϕ8S \r _Kz*ʸE#äk&lB>n&C4(5oL ZS* Dwo5"a"Z5Z#֚ы%jkʱV%=yplMX(|T@oJG2[R{WaD 1TD#!ǖU^ $2 zhuZf.!Nn4]Vl3+/72&b~us*QX*!~N,H˜ WӬ$,=RA'N@"GFIvYM^E(iU6Sfw@Jr@6 v uOXE\FHň.botY yd_2;t0ζ24&ҔG1چ!gy Cz%qFf"{7rZ'\\(si3+/ԧE[׮TJMn+ȧN* 9Vs| G[ >%,}\|uZ]2/fM;f1*VIrFQ5 gL[Ȯ}c5hI⾣]vlyꀂS4a0hKhg8/ ϡ7 񬝻Kwyx)QpesY}Qe,n iצѣu': crO 1'3 sY(V;jkZ0W0Wdǖ|څ.I]^,D0'_$|+ =C>pᴇpjʼb2o9YǤ[4oۚ&+6](8k:̼]Э{!a=4y759WMBJ˯Pf?T'Id :qqus1[Ç!Eof}ah*Js5Ϛ!`0;C endstream endobj 474 0 obj << /Length1 1177 /Length2 1595 /Length3 0 /Length 2323 /Filter /FlateDecode >> stream xmS{rC%R8\AVA+mm&*N1 p1@JNKxHc~B[cc!+IdD8F IxlDF͏KOj$NI aD0.O 8Z&$0F)N@_D;:0^ICIT ybH'x1¤rď;u*| LVa {0)PH }W8~2܇ TG.]eTG'hRqtUx׮(! 'ǧM@ pWBV&~b0@VYEQp?FN?.g`5!ˠИ~1Df/9pr?]p1T q@c|фK& D0*3B`~$d2܊@?FF!.'|h\*4~Sx[ {PԈS] gM FF Գ OH|# J:f\*C{OWHJ`g9Fҗ6Tttt9#}VW(M9[ XzԨ{AgͮZtuf0\hrkI}Ŗ6/[l:5ss i߱G5tVw[5;xF&ZFA//UjxǍKŘ]t G35e48΋Zw%#-@Wk.pN%5yoj{c]:DjH/{Cj9^;DZ~6VKmXkNG_>U_'\{1/Ecf7T/UxyAhQ )&je?uB.U:h҆ivqvˢ*x?dmuzVg eGW坻4{4G/ղ"Tz溒=i #vjZ`E5gќy:O([JW EΜu6Q*agǁ:y*yyf` &,[ph=Cz 1J \-kjAﭷJuPɽ؟>m7{Soz Tn2&gfezse OoKԞ^[,s:ko6hkLeְqXӥBMPsM L9K9b?a؈qj*ZמZ,Wh\y'4$p6H|Z}]'ϟ8Z]1Ds7k'*̳ :7\pVЩ0m`f3N0Uu[ת:ҷ@-x{%/=LbZЩqSv{5+ m"3]սEݚhkBaFHabj%[Ĕ4ԞSg=ZnXtNÅun=+M>x@497#yFjvg_~4Lqt#Gul4ut|2ne m ;]\hL6c8Ai`*8*#e/xe[O]kq^dbȋt8"2MM_; T6=S>H03EwޥO={0?-q7֪PXE)mu2æ> stream x[[oܶ~_ ( \IIN8{ug$Rd;1CѬDQ g]WJ]JJ[q&*y%СX9SWACU |e*,vVRkI-*iUѦRW) q0˨J$*@2}`83Ƹ ]':c\ **R(*k(HYZjƅ 㕀ytOrZVaÙQ -9t& #3VY1m%|@ܩ«BYJ'Q8ַPi:c8h01-@0JpxE oC oE [(aCeP+2`B],B92Gc.],! $\"k P4J`~t#)`9z)8#:) !n@ܕP K HtC8pUBL*@(I`\xW, 1 ,:CY 6@ th Pai |pW~XP{kƵrNq'xĶٴ[؇9h aC ,Qg6~hbFGu^ V5GSPNӎ9ڏ_=-> ۏ=Ѕ5xJhbBۡ#"|0F>:vh[B>b:Bt8XCPEx!P waw7DiN8kh+j8r1Z#X~f-1@k2[hgyІcۇpՆbz!=Bg)!]!HF8|/<]=6$* a-@H@7 Q͵G;Q}B0ʷ̎D`NC cȀ^30sz]CqDB(W@/2$C9 ^=-rSت:iۀ^Bz h Ġ)aHW6=Y#oX4Mcⶩ5֎6Fr1Nkm3o*7?̾~F~ȓjޞmWfO^}z33_m׫|m%_Tu[{ [Ny=W;ȣճzq Ty/gV˺3fW_;f{40ǧM!yD<# rD yI^kB~%yO䔜7t3?-돻9[/+^^99_/0&^=ϗ#\\.6|Wo'O,dIvK.ɊfX5YCoꕷķWf>'WIs.)![? .OdGv6uMvɞWlgB&~ pġ?((zɳ<(^.`k9,`q!T\0Q9_w uu d2b&br_B殃͵r} bD&F^1B=x]_r|H8aΨpþBB#9.0_21ğz1Z[߂& ~tSh^*ƙ׷aOߟaYM7 ?<=~[jt,_ZM|573l 3X^sv~-MsMow=y>2L\6\n =0f,9$,QW~&|B\.,UC|.M}/l:Ltřu7NG>-n,BwQʠdz8&[Uw=k`;*/ ;=ݙeU?y獣G忚';>&QGMꨠpVɛ?tg&3?99uᆧXfL^p?KQZڵ0_[%G'G9Jr>w' U) rX+*\o^%_r qc سz[΁JxzN(޹=$xj6]ȡF#a7dMǝX6z8[6L a21Lڻ0lr7n@SMwaݷTRR|j9a_[ʯ= 7x? /I?kώ{x?x]Я!"Yln^G(ە  ~h vK*=蔌ŻN!Yx|HSf.#,:/"(q K ƈbx꟢]bMy͸7jզ5]A *k,INO/;iJǯG,<#@"X+Q67h*;-K {i!-{H7Eou_4%Ov|ͬA,ł,XB6/keDǀub85f{yFa8%>xS,ca;L%KX;et-ːM:8vC@GHSս+8tPn,.v܇aZ!: =a=7= {1zjmGf*bK{gqHBnvݨ]2ӔBBISU4 F (y H#vP> endobj 495 0 obj << /Type /ObjStm /N 4 /First 29 /Length 194 /Filter /FlateDecode >> stream xڅ 0EYڅMScB)|c%]6H@b҅羅n˜s xAQ(Bł)k]$@'iNF?Ĵ7W̃# dWf8d٫|+ep #<t)|wB#zݷӵ:.5qQբ0>gXx endstream endobj 500 0 obj << /Type /XRef /Index [0 501] /Size 501 /W [1 3 1] /Root 498 0 R /Info 499 0 R /ID [<71DB9BB8E3533691A90259C9B11D8C00> <71DB9BB8E3533691A90259C9B11D8C00>] /Length 1227 /Filter /FlateDecode >> stream x%KlUU~hGWii7-&LL9 ёhCu&1j1jc 1(Qq}?ֿ=Z˅ ^!mpN{a)u$,BzN xCx ːrxH%!cUH5(a RwoǛ#l@%lB;BY7wp%ҌwoYwjA5ZxېvKx !=9 8 v v"]xx{ 7!xxC-xx{"lOlM Ӟ"܎u #;< ܉ 1QPAqLC>B-po7C/g?7z b)m GzGWZa OyP4@W$$P LD^4^ 3xڲ342Bx]v Ѭ[9ӻyD N;]pHtc%ODNA!|.2/D坾9}+*v%*qNTQӏJۢ*ENaj}T˫[,C#J5e*Ho귍~t&E˜-wO"xtʉ b*RjrQShShSͩ^΋QHz sz\@ւ4"j2_д^P+plO[,$uzR(D%4QV4J+HjVDoJ>u#u.e:`am 5Z|F}7Q iD8euYf۞7 8Wm<@DؼL,:@VDYtE+Y}8%_-%ֻXL<~$ endstream endobj startxref 281742 %%EOF GenomicAlignments/inst/doc/WorkingWithAlignedNucleotides.R0000644000175400017540000001213713203700445025011 0ustar00biocbuildbiocbuild### R code from vignette source 'WorkingWithAlignedNucleotides.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: style ################################################### BiocStyle::latex() ################################################### ### code chunk number 2: bamfiles ################################################### library(RNAseqData.HNRNPC.bam.chr14) bamfiles <- RNAseqData.HNRNPC.bam.chr14_BAMFILES names(bamfiles) # the names of the runs ################################################### ### code chunk number 3: quickBamFlagSummary ################################################### library(Rsamtools) quickBamFlagSummary(bamfiles[1], main.groups.only=TRUE) ################################################### ### code chunk number 4: ScanBamParam ################################################### flag1 <- scanBamFlag(isFirstMateRead=TRUE, isSecondMateRead=FALSE, isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param1 <- ScanBamParam(flag=flag1, what="seq") ################################################### ### code chunk number 5: readGAlignments ################################################### library(GenomicAlignments) gal1 <- readGAlignments(bamfiles[1], use.names=TRUE, param=param1) ################################################### ### code chunk number 6: read_sequences ################################################### mcols(gal1)$seq ################################################### ### code chunk number 7: original-query-sequences ################################################### oqseq1 <- mcols(gal1)$seq is_on_minus <- as.logical(strand(gal1) == "-") oqseq1[is_on_minus] <- reverseComplement(oqseq1[is_on_minus]) ################################################### ### code chunk number 8: is_dup ################################################### is_dup <- duplicated(names(gal1)) table(is_dup) ################################################### ### code chunk number 9: same-name-implies-same-seq-in-U1-oqseq ################################################### dup2unq <- match(names(gal1), names(gal1)) stopifnot(all(oqseq1 == oqseq1[dup2unq])) ################################################### ### code chunk number 10: oqseq1 ################################################### oqseq1 <- oqseq1[!is_dup] ################################################### ### code chunk number 11: most_frequent_cigars ################################################### head(sort(table(cigar(gal1)), decreasing=TRUE)) ################################################### ### code chunk number 12: cigarOpTable ################################################### colSums(cigarOpTable(cigar(gal1))) ################################################### ### code chunk number 13: table_njunc ################################################### table(njunc(gal1)) ################################################### ### code chunk number 14: readGAlignmentPairs ################################################### library(pasillaBamSubset) flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) U3.galp <- readGAlignmentPairs(untreated3_chr4(), use.names=TRUE, param=param0) head(U3.galp) ################################################### ### code chunk number 15: first-and-last-U3.galp ################################################### head(first(U3.galp)) head(last(U3.galp)) ################################################### ### code chunk number 16: isProperPair ################################################### table(isProperPair(U3.galp)) ################################################### ### code chunk number 17: keep-only-proper-pairs ################################################### U3.GALP <- U3.galp[isProperPair(U3.galp)] ################################################### ### code chunk number 18: U3.GALP_names_is_dup ################################################### U3.GALP_names_is_dup <- duplicated(names(U3.GALP)) table(U3.GALP_names_is_dup) ################################################### ### code chunk number 19: U3.GALP_qnames ################################################### U3.uqnames <- unique(names(U3.GALP)) U3.GALP_qnames <- factor(names(U3.GALP), levels=U3.uqnames) ################################################### ### code chunk number 20: U3.GALP_dup2unq ################################################### U3.GALP_dup2unq <- match(U3.GALP_qnames, U3.GALP_qnames) ################################################### ### code chunk number 21: gaps-in-U3.GALP ################################################### head(unique(cigar(first(U3.GALP)))) head(unique(cigar(last(U3.GALP)))) table(njunc(first(U3.GALP)), njunc(last(U3.GALP))) ################################################### ### code chunk number 22: no-indels-in-U3.GALP ################################################### colSums(cigarOpTable(cigar(first(U3.GALP)))) colSums(cigarOpTable(cigar(last(U3.GALP)))) ################################################### ### code chunk number 23: sessionInfo ################################################### sessionInfo() GenomicAlignments/inst/doc/WorkingWithAlignedNucleotides.Rnw0000644000175400017540000003411613175714431025367 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Working with aligned nucleotides} %\VignetteDepends{GenomicAlignments, RNAseqData.HNRNPC.bam.chr14, pasillaBamSubset, BSgenome.Hsapiens.UCSC.hg19, BSgenome.Dmelanogaster.UCSC.dm3, GenomicFeatures, TxDb.Hsapiens.UCSC.hg19.knownGene, TxDb.Dmelanogaster.UCSC.dm3.ensGene} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass{article} <>= BiocStyle::latex() @ \title{Working with aligned nucleotides (WORK-IN-PROGRESS!)} \author{Herv\'e Pag\`es} \date{Last modified: January 2014; Compiled: \today} \begin{document} \maketitle \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% This vignette belongs to the \Rpackage{GenomicAlignments} package. It illustrates how to use the package for working with the nucleotide content of aligned reads. After the reads generated by a high-throughput sequencing experiment have been aligned to a reference genome, the questions that are being asked about these alignments typically fall in two broad categories: {\bf positional only} and {\bf nucleotide-related}. {\bf Positional only} questions are about the position of the alignments with respect to the reference genome. Note that the position of an alignment is actually better described in terms of genomic ranges (1 range for an alignment with no gaps, 2 or more ranges for an alignment with gaps). Knowing the ranges of the alignments is sufficient to perform common tasks like {\it read counting} or for {\it computing the coverage}. {\it Read counting} is the process of counting the number of aligned reads per gene or exon and is typically performed in the context of a differential analysis. This task can be accomplished with the \Rfunction{summarizeOverlaps} function provided in the \Rpackage{GenomicAlignments} package and is explained in details in the ``Counting reads with summarizeOverlaps'' vignette (also located in this package). {\it Computing the coverage} is often the preliminary step to peak detection (ChIP-seq analysis) or to a copy number analysis. It can be accomplished with the \Rfunction{coverage} function. See \Rcode{?\`{}coverage-methods\`{}} for more information. {\bf Nucleotide-related} questions are about the nucleotide content of the alignments. In particular how this content compares to the corresponding nucleotides in the reference genome. These questions typically arise in the context of small genetic variation detection between one or more samples and a reference genome. The \Rpackage{GenomicAlignments} package provides a suite of low- to mid-level tools for dealing with {\bf nucleotide-related} questions about the alignments. In this vignette we illustrate their use on the single-end and paired-end reads of an RNA-seq experiment. Note that these tools do NOT constitute a complete variant toolbox. If this is what you're looking for, other \Bioconductor{} packages might be more appropriate. See the GeneticVariability and SNP views at this URL \url{http://bioconductor.org/packages/release/BiocViews.html#___AssayDomains} for a complete list of packages that deal with small genetic variations. Most of them provide tools of higher level than the tools described in this vignette. See for example the \Rpackage{VariantTools} and \Rpackage{VariantAnnotation} packages for a complete variant toolbox (including variant calling capabilities). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Load the aligned reads and their sequences from a BAM file} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In this section, we illustrate how aligned reads and their sequences can be loaded from a BAM file. The reads we're going to use for this are paired-end reads from a published study by Zarnack et al., 2012. A subset of these reads are stored in the BAM files located in the \Rpackage{RNAseqData.HNRNPC.bam.chr14} data package. The package contains 8 BAM files, 1 per sequencing run: <>= library(RNAseqData.HNRNPC.bam.chr14) bamfiles <- RNAseqData.HNRNPC.bam.chr14_BAMFILES names(bamfiles) # the names of the runs @ Each BAM file was obtained by (1) aligning the reads (paired-end) to the full hg19 genome with TopHat2, and then (2) subsetting to keep only alignments on chr14. See \Rcode{?RNAseqData.HNRNPC.bam.chr14} for more information about this data set. As a preliminary step, we check whether the BAM files contain single- or paired-end alignments. This can be done with the \Rfunction{quickBamFlagSummary} utility from the \Rpackage{Rsamtools} package: <>= library(Rsamtools) quickBamFlagSummary(bamfiles[1], main.groups.only=TRUE) @ This confirms that all the alignments in the 1st BAM file (run ERR127306) are paired-end. This means that we should preferably load them with the \Rfunction{readGAlignmentPairs} function from the \Rpackage{GenomicAlignments} package. However for the purpose of keeping things simple, we will ignore the pairing for now and load only the alignments corresponding to the first segment of the pairs. We will use the \Rfunction{readGAlignments} function from the \Rpackage{GenomicAlignments} package for this, together with a \Rclass{ScanBamParam} object for the filtering. See \Rcode{?ScanBamParam} in the \Rpackage{Rsamtools} package for the details. Furthermore, while preparing the \Rclass{ScanBamParam} object to perform the filtering, we'll also get rid of the PCR or optical duplicates (flag bit 0x400 in the SAM format, see the SAM Spec \footnote{\url{http://samtools.sourceforge.net/}} for the details), as well as reads not passing quality controls (flag bit 0x200 in the SAM format). Finally we also request the read sequences (a.k.a. the {\it segment sequences} in the SAM Spec, stored in the SEQ field) via the \Rclass{ScanBamParam} object: <>= flag1 <- scanBamFlag(isFirstMateRead=TRUE, isSecondMateRead=FALSE, isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param1 <- ScanBamParam(flag=flag1, what="seq") @ We're now ready to load the alignments and their sequences. Note that we use \Rcode{use.names=TRUE} in order to also load the {\it query names} (a.k.a. the {\it query template names} in the SAM Spec, stored in the QNAME field) from the BAM file. \Rfunction{readGAlignments} will use them to set the names of the returned object: <>= library(GenomicAlignments) gal1 <- readGAlignments(bamfiles[1], use.names=TRUE, param=param1) @ This returns a \Rclass{GAlignments} object. The read sequences are stored in the \Rcode{seq} metadata column of the object: <>= mcols(gal1)$seq @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Compute the {\it original query sequences}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Because the BAM format imposes that the read sequence is ``reverse complemented'' when a read aligns to the minus strand, we need to ``reverse complement'' it again to restore the {\it original query sequences} (i.e. the sequences before alignment, that is, as they can be seen in the FASTQ file assuming that the aligner didn't perform any hard-clipping on them): <>= oqseq1 <- mcols(gal1)$seq is_on_minus <- as.logical(strand(gal1) == "-") oqseq1[is_on_minus] <- reverseComplement(oqseq1[is_on_minus]) @ Because the aligner used to align the reads can report more than 1 alignment per read (i.e. per sequence stored in the FASTQ file), we shouldn't expect the names of \Rcode{gal1} to be unique: <>= is_dup <- duplicated(names(gal1)) table(is_dup) @ However, sequences with the same {\it query name} should correspond to the same {\it original query} and therefore should be the same. Let's do a quick sanity check: <>= dup2unq <- match(names(gal1), names(gal1)) stopifnot(all(oqseq1 == oqseq1[dup2unq])) @ Finally, let's reduce \Rcode{oqseq1} to one {\it original query sequence} per unique {\it query name} (like in the FASTQ file containing the 1st end of the unaligned reads): <>= oqseq1 <- oqseq1[!is_dup] @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Mismatches, indels, and gaps} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Because the aligner possibly tolerated a small number of mismatches, indels, and/or gaps during the alignment process, the sequences in \Rcode{mcols(gal1)\$seq} gnerally don't match exactly the reference genome. The information of where indels and/or gaps occur in the alignments is represented in the CIGAR strings. Let's have a look at these string. First the most frequent cigars: <>= head(sort(table(cigar(gal1)), decreasing=TRUE)) @ Then a summary of the total number of insertions (I), deletions (D), and gaps (N): <>= colSums(cigarOpTable(cigar(gal1))) @ This tells us that the aligner that was used supports indels (I/D) and junction reads (N). Finally we count and summarize the number of gaps per alignment: <>= table(njunc(gal1)) @ Some reads contain up to 3 gaps (i.e. span 3 splice junctions). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Put the read sequences and reference sequences ``side by side''} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TODO (with \Rfunction{sequenceLayer}) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{OLD STUFF (needs to be recycled/updated)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load paired-end reads from a BAM file} BAM file {\tt untreated3\_chr4.bam} (located in the \Rpackage{pasillaBamSubset} data package) contains paired-end reads from the ``Pasilla'' experiment and aligned against the dm3 genome (see \Rcode{?untreated3\_chr4} in the \Rpackage{pasillaBamSubset} package for more information about those reads). We use the \Rfunction{readGAlignmentPairs} function to load them into a \Rclass{GAlignmentPairs} object: <>= library(pasillaBamSubset) flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) U3.galp <- readGAlignmentPairs(untreated3_chr4(), use.names=TRUE, param=param0) head(U3.galp) @ The \Rcode{show} method for \Rclass{GAlignmentPairs} objects displays two {\tt ranges} columns, one for the {\it first} alignment in the pair (the left column), and one for the {\it last} alignment in the pair (the right column). The {\tt strand} column corresponds to the strand of the {\it first} alignment. <>= head(first(U3.galp)) head(last(U3.galp)) @ According to the SAM format specifications, the aligner is expected to mark each alignment pair as {\it proper} or not (flag bit 0x2 in the SAM format). The SAM Spec only says that a pair is {\it proper} if the {\it first} and {\it last} alignments in the pair are ``properly aligned according to the aligner''. So the exact criteria used for setting this flag is left to the aligner. We use \Rcode{isProperPair} to extract this flag from the \Rclass{GAlignmentPairs} object: <>= table(isProperPair(U3.galp)) @ Even though we could do {\it overlap encodings} with the full object, we keep only the {\it proper} pairs for our downstream analysis: <>= U3.GALP <- U3.galp[isProperPair(U3.galp)] @ Because the aligner used to align those reads can report more than 1 alignment per {\it original query template} (i.e. per pair of sequences stored in the input files, typically 1 FASTQ file for the {\it first} ends and 1 FASTQ file for the {\it last} ends), we shouldn't expect the names of \Rcode{U3.GALP} to be unique: <>= U3.GALP_names_is_dup <- duplicated(names(U3.GALP)) table(U3.GALP_names_is_dup) @ Storing the {\it query template names} in a factor will be useful: <>= U3.uqnames <- unique(names(U3.GALP)) U3.GALP_qnames <- factor(names(U3.GALP), levels=U3.uqnames) @ as well as having the mapping between each {\it query template name} and its first occurence in \Rcode{U3.GALP\_qnames}: <>= U3.GALP_dup2unq <- match(U3.GALP_qnames, U3.GALP_qnames) @ Our reads can have up to 1 gap per end: <>= head(unique(cigar(first(U3.GALP)))) head(unique(cigar(last(U3.GALP)))) table(njunc(first(U3.GALP)), njunc(last(U3.GALP))) @ Like for our single-end reads, the following tables indicate that indels were not allowed/supported during the alignment process: <>= colSums(cigarOpTable(cigar(first(U3.GALP)))) colSums(cigarOpTable(cigar(last(U3.GALP)))) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rcode{sessionInfo()}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= sessionInfo() @ \end{document} GenomicAlignments/inst/doc/WorkingWithAlignedNucleotides.pdf0000644000175400017540000064276213203700445025376 0ustar00biocbuildbiocbuild%PDF-1.5 % 53 0 obj << /Length 2396 /Filter /FlateDecode >> stream x˒6>_QUȞoxR9xr)H2E*$5ٯn4HMmHt"xt7/@ME*u5lwE];Sf핉D7+(yRHuY8͚sG:FmIv7ofWECUnyS/`Wj\s.K{:t„`{YoG=3VG6zug7vSYOd6Ţb pL|#UH"9mT,iMZˬo|̖ۀ.)RA:w~OWmW~Xw4rp፝cm;ZJ3+ S,;sR &HM¹]11g2 +>~>}>ٌxemv5}?>ΞWMFV1&=[kU6 Op._P)X@ K,!K.V5fMm+H82RgU>R+"cFQyryvmfz۝ f|u<22ȗN%KPaoO$ej &\%Kk"iD8c-݀{ cɄٯn %&o4M-j1ԣ;3)jU,x쟰P&̈*˿d &4뎐en2Ԗ߸˸;OJM֭4ms 6"U8 փ6RֹEszC?9}c؉!ma)PT|޹gF"(l.leS;Mv7M^ܬZ@_o%>"a6Œř٭u@)z}.PL7-Ϭs?Sìݴ0^wꭟmܯ7,i8)*\pjMGA 8N:\^c-}w}a]{Dl0Qgalqiʞc&׷wքM,Rfݑѝ(-Yk#6F:");)b?-@ߊK 'jknjjl<iMfS:C̐=ͪ{RAPPӁ9AN뗥AhUOj$$J˺ϓ1e y\{qϋZ 3 QảhhJ۝#U ]_ ǺQӗmcKrGƿP- 2d&-鐎d^WrR@)`^/χdd<`s Lmo} >ga 5|`IF(ty=z0b2@"<5w;G.ZiiZC+Lnn h4b?lhۯ(zJW(t@E=Pxrc ,&xؿv}kIp.`hѐ%"\rzJr<6Q;ʢqćBZVB+#k1!#mqqQ*Joc1Y 0f58FܕV=eqLǪۨDH,A#5h!9Sȅ9;2j`ώŗ¯2,vE(hGRJjqxnsE1_WC*S̈-Do /z dQ(6,/)N SCQF18*+ۚ~9e\yA3r Ðe{N9b?,ѲT3@Y  endstream endobj 69 0 obj << /Length 3273 /Filter /FlateDecode >> stream xZms6_K?h s/NMm%"/E2K\;vg뉘yr^-é2ip[ .eq]9WC)Pu[mX?kt*NG3٧(dc (f XW'qP_bXP`mbY=AN;ԴVnF_4[mkgmQWūic˻hn&XW3W6KmS),vlCmT=FZB\XY\E@8>CaDLKLDLIJlAu7k~aXD%YS=I(dS)QG*䀘IPɫ9ɹ҂XZĪkm$X x}ӋqY--ͨE[j+$ "> jf(sJ;$lY}1ͽس%yu#(eiunbMc53Y;@g*@7Kv:BW|j}}mS1>"0ųc%߾w@Nw*iMLrRl75pFwU )5) "|,*{< iW$: (n[G$Ƽ䙿\]Z]RAE^%Nx\27]iͬ`#0Β5ﲸ^X+[ׁI/eYDDJ"s,JwC2Ie "Xp~ 7%_&৳$ B,b0V](&iEۮ>:tbCyc bE {s4$oe^T=ZR,-ʢi, ZG5g1Џ.\J 4Q̈́݃ym~_) 䖞 ',Ϯy8|iVH+0#MtW䜛n^zGB s[Ft]g>4qU{qeIa*Qwު2NḪꖑÎkG@g>yS-٪n8rlJ*`d1qXTrpxX+E[8d'qlĚb:EX}Ӫ~ GI LeZz{9cl%鴻 b27j]/Iz5?='*D7\~\&ܽMLF%#C,'sMTrp+7vhQ(Q$ > rط\餍#HXD`"/pl3+%*/PkˉqD0Q]Ҋ4'z/׮f"aZn׷ݜ2*X6܉I*L? CU݃gԫ-p)IJEp%wG8?=5~pLöޛ /]G J>?aں7xV9Tp(;֮;I@`la Bva[NGxe_-i x,gJ q؝>ۋ A!\+sJc ~V_G`"-cR{ǹ)SK@ro㘣{=dY_< sYO F y:jwh Y/ۇRd$PAH63$#G`6NɒTAG t}W<,uY5!b]t锌DZ.0|Hx-bh0(NGϚ۹^ϛmc*`S6v`'Xeh{ ~ GߐWOSODcף/NЩEp0B Q +QAFu\"wd.kzh;ԩLq_<=ONm+p+pKdCd] 2 endstream endobj 76 0 obj << /Length 3025 /Filter /FlateDecode >> stream xZms_f:Sj*et`Fbڲ,N>$$h?{@;v$;88۾sK͈g'g*Yff#YQ%BfћOջ9Ӳi~ݯ.}%L/Oٿg}|d CL+ˀci"fp[-3M3 x*hХ? B ۳iVߞɲ)A;.!ѱl\j^is2(gF'1;W:{%ux%' bVx?/[Cin#o'̼!%J&k #I3kbwWK6(-nZ^鼩[22 O.R3."PFe3WZwWl%yvP]WV/t >O۶گ92Tm$i-"^U,10Ӯdf`}`i$Ivh2Ye'2z"AW pXFh;hBGʥzd W@ws2[."X!6\(/P;g/k/} D[+`yGN(1[ڵ l )("-fI+'J/`g^"{{=@,vK{k \,<9XWv Baep=!tu*UKRBu:DJ#20 QH$!|*=% Iimw/L!u\#I4€O #M4 Õڽ'# a#38p(R@0TOTc9料P#iBXhΣI_4l.B"Z lMxGxzԗm&̀~ .(@vOSE$٦ U.[WK#X=(׉0 tDr_Ĥ t\[J"CҞpbM+&$y]nz 81[[$ RڋɥڦI^Uo V D$7mָo؇CNlS]& p'^^]s뀏 R]]^s6cgӣtJj ~p|~kHݦL,{ւC( $Dn7&ly$D V4C;Yt@p鶇ϗYd.Emnfd q#_VvxMژ~ո[B:B%˶@4zHJ V$˴&3P`FBzPH`A)WNB۳[L `Wn q8{&`r {ׇ \ϛvTg6Qd/)n@Uͺ*pki-R 8*!A2ϳUR#=}$I^5v=,!߈_|$♋,H~xs/Cu0l&Mn8 BYٌ2Fc|"-5)]5WKAh|<՘W!,8e_%$$S6{!%\KHIE]ȫb@ĢMCD'\A%h!hzh e?66aE^ ZM 3Eu UvDqQ#3 iXH>2R{xEODA7814r:YO-&k*E;ۍ7ċS~ZbG#w!-8q IfMiuUvl,S\@Lv endstream endobj 82 0 obj << /Length 2430 /Filter /FlateDecode >> stream xZmo6_T D _%p9`nHZV%mSi%y} /H_gfM, $1u 0JS$"JX.woM7&iol)M [|AqX/ Y{,oG/_/M۷߁,?`Fo ]~W듻)nT "H&"hUp}K9#FR`\2ġKq)WpaBQiZϖ5YrZ.k^z2 zᯑu{_=aQ"H&1N;a$\o>K>/J%A` i։*xrladvw/U:8&93<-װ4lYo. Nj;hhjUVؒ?7 y)n o Vj^ 'VFdaC!T֙_ yM*mzd]fQaL!O *3LuujBw*loU31:GW3۟992LՐ["g; A?P]FszH$egD0S-i8,L3Xȫ9ٴUtpvVc+'ʺn51uauEeQ۾vhۚMf([ z]߿97 #@{AI>tOB_?7j-#mTMV}p>O(1D"y@P h5%i 퍵$gw01Pl<ʶ׋}(ARDtjx6$(ylQ0~dClj#TD 1@A ]}7YDg(n ˪j4ձ=x#*vׄCfL.W-] 0L(˜z wJ ?aK k.P0N)cSj0QuqAGBXX' 3 o0(=Q= aeI !x}tzcl#țzt.[<v՞+wNhO ~;7 N$KW^jQ#3~Fu U ЅMv{3) yҴ3M;'.q}Q؄]u+o*joelmq0-C~>j3{b#Y0LuU<& s(]gGjӣ)x+ J0tH0&TA%J(,գeچ 1Z46E?t&{1Dcr3n nTlG96C6o'I#C75ڡyߦ<>]7g4ƪ|Q *ݷU Ug~ZJ3^>[^8vޙAC/]Mz%NrQiv,H6A_aZ^n2m  " T kg E1)5΃ *jɁq0Oz1Kw K:Db!a@"4. 5eoT=y n som|F4&w.N<:CX^̍_#1p0fa "!x endstream endobj 87 0 obj << /Length 2125 /Filter /FlateDecode >> stream xY[s۸~`ߨ NNRi$JΤ3CK]^Q=EX۹|hѫg" 1:R) g"GO#Mz[^-Fc|}{Y/*;Ոx3q^s/TO8|6}Nlty#Ht4lW辩ɏz}qYVv-ai4+pXrEIq6>GyU4QBnӆ_ƚxVM٠g"[-/n zlP@P)i @h$K㷡= NCОϏB<|PQHh,41Fƒ3, ATpE* Fyvv0n%`Mf-׶(\Wƛv&[=;"+6m pAY.4q=uXWs[>^g'ݞl*uSy]+wv}=dK8ͫ(nwXYǙ!Dzp*I+jS^9[kb-'(_zJ[~ `yD*>DL`V=1U Cz7;sڿ\ڂ1<øݱ%A氌q*cJRsp7GGP֥cȳZgyp WVM:ω%$kU; qgF f.q@Q&&&riΝ@PРiէ(z13i7XJ*)sC #3NxL^T⤟떢9XI{=_8 Dy0>¬<T*A@FsFIone.h_$7DiN:ҝKa80EW䞭Υ&Cz'zCQ鏰]ҮA G@~ !( b*kozUͫ룼p}[JhAKT5|l}a#Dakg7+IrS,Z.ݝ!Ř   *YE*+Ʈ1Mx9/e + ST)!- ׅ]]svPN}%|'mcrP_{۸ f7[[ߟ|SWxå8W5l:L4AB.E`-I a_6Mbl($aH$d=z wbN9z${ 9Q0C"_'W|K+Sza݄2 406կ>mkyоBq>+<$,Qj;%B'J4 RLXC*|Pcad }n',o>ij_!5ZEe'}SH;v,9L("+:, Bh2䞀tO@f *+ms|1تƉv2>F?lʪq (m6sx,E;?4 UJ z>)Hѝ%Mw}\XgɄ 0@/)&ʺs-5l>3m~ \v4livgJ{Ô"UKHўk3h-2tP;-!̘Vr;PJ;h&߯hIL[aΕº;t+ KmMNtTPySpPr:D@c endstream endobj 91 0 obj << /Length 1186 /Filter /FlateDecode >> stream xXKoFW7-7 (iSYEMDIL%ҡhreeK6k3ߊ".&&/pYbSlI ưH FlOUWQiS٦XOʄB|=OějE@{wvr1}}ynُb**okz׳ɧ E`Gͷ.$Du-'X #VHYA%wZJ)W~k*e2Ir˺z*+x]y,\*/m$^iZ"5Rԫ<[AL5plo=O|)eD0 N`jXXZ߆GŠ"(Rbnz?pcŝ6o֑]Y kvx0Dh.^|s;w!+ꝿ9;՟yj%Lw+ctV*ϪgDpXY$rJؼ\o7IʁU 9k& Tw͈+E$ʂsP0qQщj+\/oeS:[G8ڇmZAuۜIj2w ty gIR!DA-De@c#H^UUrewhԏTcpB`WgC8G'sDb@JQ&w̷"ypI87NVeIA~8gF2o G;0[dMg]x&ā'l1$`Tb#ğn{੬nC ¥W˫&G'Q"Nȫ:ya(|K ՗t9Erv׵@RQRPsU7T!@("6.͸'IJ[oQKI=Qޓ{ R'W{lu͘'W;fԗ1`B٧򧀬,K9u9G(aLӽp'}7vI5v\9A tkG70>H9 gh,H6; %t[e)hpL vOJy&q{d780{> stream xZ[o~PR &s'Yc؋}H(RH*3g"e:qk'}|g(>OGϞxJ;\ gI"gL 5\^G-/dDZYU^Œ:\h%bݕˢ7pWY|뜾: LqOԳbHPbl dL<_Otd))n" 8>j."XGMѢv%Qoy֕}s: <{ R4Xv̑F,sS2 L.`lo6Z3+SDkOACG)V$#<>FDڨ`dWtO?$50`;B{E4Q}l*.irFuuNPp JHPT ˙LX`唘g"U'6/Wpq:fo--3:k^=Р3z9EgʸϪɃDŒu[OKD:xb][.XƩu=o# ^v@[Ub..p 8Mw̛+2޶u4@kEJ:":ݵ=87Y1fOoԱb*H Bl5vZޯ5=N.> L:Y-,9rq dz~F]As\:4Czve }n 2 an4#n^??0m͟1zaUo A/H%ӁaլoT8h*D88חv"$NJ%wCw(豚IRTE- :Y79ĉNbZ.Sd9dkBٻ@xQEz]eC|{F"ǝϏ_\!p]d <$.&hd BH|\$tү]W'Lp<_o%5I,Va?MmhCQCTyx fw{ 1QV >ElGwbC3&ȵũ?Z(cm=RpgT]Sd:>eHM)@pgN/^R~}|a\0Sg@qbvPKh@}1M-XX4g~U PcG oA]%s]: 2Pv 9.ʫ pX02ۢAx́fSe]1 ! p5ݑZQXYn 'T xhfQKpeHjMgU|6j8(„V_/^Ԩv&r A? (v^1[ajYny *K](i BL7U{E;? R !FpQSF"{uLHaӃ#Tcv!]ޥ)ڶ4]jFXKwA.ȻקGPSڲ^PSPe|ࠦAm? !>dH9E* 7wUǢjceQ!]`ov 33W?FG I@)~f'`N,*j⾀L$aB[^*u^5Tc3[v.]gpXo4~CQX0`,MĽ{ɇ>nXyAKhQ·*I?@|,+qɺz} }z.8P̒vըPe@c ys30@GW_i^>k[+Xs4Y5.AhbWjBDr3kny'BGOIΕ Hsf칐8Vs2=R/qH+1*5Z$  0"qGd|&!q >bl I8>'F_LjМV'QbL/?IIE/8EាbS$¦U*ORN3~% 5]̝PYPH$z-R]nUS{xZ3;,6<2+Jh endstream endobj 100 0 obj << /Length 1643 /Filter /FlateDecode >> stream xY]s8}`}MƎאm; MP&N;} {ϕ֮Z^lNk&FE5aPD Ӽv~ḝxѩ_G"C!u(nGA +;&~'_Lꃑ>W{jQ!\B;59wVk}ns,lْ j"bL$0 _q톭 dJ agG瘶gI䮗,\Qy?4[/ Dj! b q J@=ՎTjǪ}G7 im3mK(6\0wiK6D6g6K1Qbb HQZ9V@m, GiH_ºIm|ž< #jbm1pϑgLUZR° J9k,%j!.J ĸ -cDd4(1L(0KIS? zkuRPqHj}N>"P-4M4K}#Hs~Cnݖ5"n2pE*$>*KMʹ_ -JCc Ge0S>Ƒ'E9(.w o@’hjGa~z 0\ &Oq\u<R:Ε1! +=A~U׳`Mh2w_CJ2xxz6”V ]1A[' J)]4_Xme`G WGjG[ƚD oϾ}CO`WhA!f)bďT 7=5UT*n6Rt T@p}%}^~NfM(⊢$FH [{p+M7jQjHz,"_)$cɥXS ?eع b՜F1 '29yDY]Oieaa:^d>t'}7t,Ozza0=Iz`\i(bC4 XUkhs'MoO d6~0Izؔҿ L?^̂ 5IVY{^ﱢD endstream endobj 104 0 obj << /Length 1133 /Filter /FlateDecode >> stream xڥXr6W@[(KLf2L4n<sAƱ-8sqpt:\}SFZR]^E4Q¢m)8n٭ki/SغfMp|)XwO/l9\\|dAa9!2_]R]o.Wr#U׫9"ER+ՇFy <k8 ,׉4>)ۍH(Jt1>H2JSRDMaK1WYѴugAц D!^bx!W^c/ys՞n+i''>흜%*BboZ<FDNAI΁Cs@ʼ&J!Mr՚@˗ҸҘ&/@Yww5u8݃']WKKFt:=x°8abN֕mBFR03 I&G}wo4MNTJeڍ^')i۟B]½IG=?CWᅶ;;=9a$ ۮ Mgp tOkF,3ڑכJ(fs<ֶScDQhK#Bm;L`͔*)K$S 8 sTG⋩n--Eݖbz.in4fE}ٸj٥cwiT,VhZ|J!v.FSc&P@ {W**-` $|Rd8 3櫰-H`*aI:68tEZ>׫T4w]](pfDS:vmZ)Ðq"<_ \2(j8 6|>6}Us6[_9N5dӑ'F-s:SĂ0WC6!.ok͙ gȦ[L{!ɒ{*ڻ[~y]9%<6}_t^Az$|<*ѧ6Ͷ,'9+ ,RԒ8o}YRmgN),J8_ީ~ӂ endstream endobj 119 0 obj << /Length1 2026 /Length2 7162 /Length3 0 /Length 8290 /Filter /FlateDecode >> stream xڍvgXk5U$  (MjBMz)BHL tHG  I IΉ{w~#Y3sZ3YGGi UB"\x@@y(J ᬉD yϬ@~~0/???Ur!\G@5,E`~~At:6AB qZC`VU-nfr/;'mD=6P[9( ^h 8<" @98'uܠ6Qײz?Mg Tu r;8 \ @+oP3O< ~=APgg.#ߕk!QϬEErtͧo @EiCB@+! @@ZꁮtA:m( F@>k$SF@H ȧ)]#O|*Hȧzͮqͮu Q45B^#45B_#A ߣkbpZ ::)Pn8kں\}Cq !tv~ccyZ}lBlp  ~ uRt_NVG}>k szbw]eu07 ={OG{(FyހY8܀v] ϕTB\UGy}/7"k7: לAke8BQ0sP B[\m-LjtXߘzeh2BF0k%F8ío@V/.8wqG8z49]Jguy݀߸K7 DwftP Yu`G?/ ƚV{4_hn_}-/zy['~6>w0{ B#HD7.3ۺyK P?/TkmƆ}bnlbU7m}~|L1Y,_Wa׭^8[eYe+S>5Tͭw_l}G pkfϥ&;_\n?)&:}xHte0xH+i%DQ:!ĘypM95G%Iq+-$0$W2]7AuxՔWsA0*]wf7Ms޻VS[2FԷ4p%1Mixvc> 'gtdkvY+-Yce;\x&*L 1KA 3qf _.ݱN] iIZITGi*v}Zb 7 loZB1K׽SHfDD*#q]Ms'͞*\a]|9y;=҉vYkilT[pEVBgN~4W*H៍\1_LK%JLO&3<:JIxLyBlC%%Ne1S-4^Zo'!_]JR(Zd!wRlpMƱ}<\ N.U:v|COr{ztD+/@-MVe14o+f 0WŸH*{1 ?# X;u~Qq1]BGEm6i窘 乻\vykXÞ{40%S]ҢYw)I73E=]XZyWͽ4IO@Qoԋ9rfٖ oq6Ab䭨zbt*  M= \%XM 3ΓG'oWS`.˿~|KZۣݗǒj{Ri|%j;gB(J~7i vN-8>HJO>!!H9ZOyP 8>  }6D3R[ᥦuhȠrJG-2/?6\a(CC<^{WhƋTaWN)$7W9y<*ϒW*7Œ~b\HFW5lI_W%-5$c`P.H7>+ykGan}SLsҕYeNqCKцM̖13F@ Փ!ۗ&t'Ǜ˱NQb+HYέ%A mR/앫qpKI~5ͳ"pV$R emPYⲋ-q"SV5%UcYV_3nc* I10㷻\o1ϗRܿM*i(/?k*)q5"zy* 7}ή">uge*)'&Zqz:rya`K$;uS֜'u _NbVV?,,34.*/Qy3 dN=#pneMATZw(0 $> vRe'n1pjM f2Se̴)pL8cV a@"PRJ7yobdE1'lM?z}jT-}lCÙq%6+aExv%Hen ٻsm^_Tb8Z)?2R'@ n^!3tq^!g^hxrm|aMa.cp]^ ϳoIQZ @!37Mo'Se$3'PiXUr6e >y}UK ry`'xX0U+e $Y8B#QLoYXd.R9VͿ_pΜi a:Nv7y|>0QP][ Gb)P$ۗj"Ų`11rzc'Yu[.Pb *XԀ>q=j#Tfjai[`aPP mϩR}k,9'<(W&0I\}ɽEc) 1c񂃰D ᔞMtEvvq̽$:"?L?=b}j͒Z߿c~u{Tp_N o9xzt<>òY-rE:ﯔՔ|3d~9nj28'{gBrGO1STPr|zptc.q6nUm7&s Iy2f\Ye\j J$|'@zdδ.@~Q-ӴȲ#t,ۨ0^jQ5()yz^X%I1㷊@,nݧO'uCu?FQPeOA(x>(N 5W(1QbPEA[1JR85 p%ZwJf.g!K 8O%'vUi4 5sЁ1Xh zwA)mV|lF'(Qںh_r˾DK,Ht\nэ|(%Hn?nNjl9x W~h'Z"GIXޘCc{K:4C@)'9v%A{ IY҇te_ܡkݛ 6c>n"9V:(b څ~A/}G!z|8mVW?4l$2q_# _Q.lJR}rvZo#-ޥ4Bkj8W|,2XnxDs_}'4)PYw}[93zUSc:a|s0ggj In{4znaCF#hg~)hOO63#ɔN?*Tk?`ZZ2]Kw #F#^Gk(ϨfJ`i`ȹRշ $~C6y<=Ax*\C.%A ۃÈC 0/ :m^wr 'zȾ2Jla⃝dYoJc^gn/M>tX&j|\(a JL'ӂ>"#ZAyÌ}'Kkf"K +GM̤,VܐO}~g1ӤjG2_D'ɡ:&"[kฤRd[z3_.LUw<Ihle:q|u ~ u>!Ll_yX?߰8il LT wgqu,ގ! Í>AphO-1nNr}Uvs"hӀj7W~K-Oh6z3'DZJj[zh#CDXY!pCK8,XQ|$>mϹxwսK+zY &SDMV|F٦ bq-ϲ`8_?.PBiXTPyY;I<~!ƦDʦ{ejr օЇ*.+zݻgw*1ㅢ tGQn"as]io[_47~۵G+}wkAi|+Y#*Ny҈'z2Ѥa1FD]>%iq"dNd *O(-%2vK(M}>p%WkvЪҫ^?3Cڞ8s~~HUy~9Y({l'u/V[(4^?=z(=ˬ$yIle`<`A?e`x-'h xuZ,1N57or_fǮ7$O.4ΰ$2v3( Tq~^O*Br  TŊ"VϟT3+Ғኇw2}H ǤH-JqOs_t RDʅֈ܃/ľ/ MT-j3S%HeI wȂzeFU񌥔<Ş)t *{C;LFhζ׌$ݛiu+c8JKC5|@V]@ T^Nυ՗gVx&"k4Q=BmRóm,;8 k1C@ lTuE;Zx W&5xc8]Zmq#z$?bw^s7E7ǵYqU]S: ?_S*4`mMx%0K\KK}kIoOu$|=p{U,xxچxCdHü\ ӹ BWC LNLV+[Wh%<ԳF!KWÛFX)Tn`N5͘hY}UiYXj3,n&OvsXd ^kh@'rZT4@)qET(ˆͬfD. ` oe _ad5U endstream endobj 121 0 obj << /Length1 1737 /Length2 6917 /Length3 0 /Length 7900 /Filter /FlateDecode >> stream xmu\ARbP!gb  IPJQ@S|sgf}n9;8 wEpI!66ZpW80  (x@lNpWED`۸b">>!tS-: "9"`+]5W{8_q;yA<~'%o]/+pC"p? D$ U%1-x!Q>-xUnI]- xn yKh=[BiZ?$ӹ%-n KB^[Bnmn %Bqvm!!-]}DxAAtP_hMm;z;X 9A?G&zq?w ګst}!ecN!ڻ_n_gt?vݨ G'J \0/3 ^ k]0zI7Ds߄ŸA<{#g~t$aH8bU~t%F{A8z@nKF{F<5UӅ^ {]8^!1nQ-s[:o}tl\>nu/e-# 0/?>?4yy7}Ap yL[z_z?e{' xClfᶒaί2zFK R 8WchՍ=W_c,qrOCNrKK9 4]6н ǔJRmF3-ZL Mp&,g]Qq1Оm!~ظ\VZ$yVhM &Nd<&t^Cj̣U!o-=QJ~(o"Q==?WX%.pO]_ͻl-ԅ/4%ZrgҐcX w=6'<2HrjКk Ki?kx{DR7#tr! FO{NN:< 60̕uY#TAwr/'TpBMpM KtHG~io֤zܪ6 %{w>Z(M,FQEGgpwnچs5_m=GWXuGw1y^=30ķ(h%&Khۊ[ۥ7oږ (96uͺo4+{~S pڔ.D@Qy1jX,~v,_l+H=~+ڻx0yHDiX\1THT"d0דK.)˔MPtBlx»b^0%t'FjO 2FoOv:p3* yik OQ+$RDW_ѸJd (T2*5Q/͚xgr۰,`YeQf֩}21!q2x؆t}' I"HJ.F!ĺIu/qrutSX6K*“WPXyzv5}-t%VR=&%exmegO!HZERjD$ǭu,Ei WvLT;ҎAk6ct ~wȲ2^H'H*ovlMvdoULHX˔i/ WOA.mEeCî͊&_8ƨirIf6v~ݹ4|'Z2H }TzJ=.7V_bickr (ogUH:$X3hQ"k~N ħhD?W ί"`=q N߲+sd=)E2K$ !K;.9Hf=D6sYr ,^+?Rz78fhZL/'Kѫ#ʓқ޻qm1 UL;c=ZnY$~Ǧ;v=2tᢎ>Y/}Y:vF6%E$>ʁ }􈷚]gﮯag-V'_ui6"L) D ZO+Ea|LIh 4J i$pdo}jjY3x#QZ7|e ]Wf^f<b SkRBn\ F+1!la4;o^$\u*.'Si s0`dqCYHC8<1xUbE c})Ug[4 f![ՙXmT ʈF%=B:˲45KEmZ2gV09?p4!5C5c9cz‡}T1bcی{Xےl!n`@r%՚Ǘ1{ |V@*mTՁP=Z!wz eEtJAB:T=+evcG$~FzChm|~VΕ^NYȃAeC2 VכR7@>+Bb{@?zv?PXu~.h!4]tlIg{o'3h)O}k 5 Ѕτg@\00%x1XAaIT%+̱> %X [bI\ja鍾qǴu5r+um41(=/?(*yDӯ, 6OE /tOx[K~,s삁NTFnW Z[}=+bU$D畋E81~C7s˘U%!M<^Yczpm+؍2Wnˏl }1l/shN1(vG./9`8&yQG˝ k G0H_,Qq55n^vd \g`A9| הonչCQfs9R*bMuG.8Uog͋Gx TݸAa#L`"gFZ$$7bzw2e{k!>X~>(4nd3r޵?Yse ƕ {yF-[r9fBHj/myÂs^scp)! ^16Vs _|Hń=m5-fA(X԰J/Nx~'eۯfѓ,;Bn}ą aF9 i>3Yjr_?&55< h!"%fZ8u+LE%C7qKqS=wjاA1H}FTIm vOf'_^u@N]\|5wV9f.v{j%B0md>^Δ=>rQ>RF<9,~Rчk{xbW}zyXLn2=_H%nMKQk|t5؊[dq()CiԴQ#q1 ^^j: |?Y` > A~"N[,qS\5칊xMezp. &Mg&Ok^zq'r^KԤK\LV?Rj Y7y)h&jUo:RI郳/km@VKAK!w"-YeAV쮆w͵ew #M CtW"f4=8)#_h V hcX] hw?~n`|$|tέkj{!}* M,O0p7vMcǫș2o,8\`b]+wٮ'E}CEB1BQ?Zʥí ~K7!J$jR*qDqLňUGCdȦ/t}q$(eK =g‡wRÆ%,5C#&i .u-,GrI~qU9safa o)h3 N֎]X<zVA%ib J蒪f*Bt9'p~Yj49 6`5[q%OՇ{??x"\W|-NtߑxE YC=5z1̕oz!V!Unz3l'"0Hy黗;;o*Yw0E-l&^z1 XI jޮߙ/)]rX^Hc){6{}l)ڌ2 ڃVAwN?#z+gAᆡ<2˲]^-yF}zsuʉHBy"pzίNJ$HTCpHH1L*D+ʳΐ/Q?-JH LA0%s xRڞ?aH:EOx!r:VՀ+R<3s>2YAіst>D֏,:GDJRF:NB@wS{R2T?5/YVoV wrOw/ںW;Tp S.4qy9yީy ޯ۩nH# ~<9:s>^r`AJ6lL'ߛrbS_/RU͠pX0jU5o*Yf]aN/ {+$\+3MY+$ Av)/Hv0n}h[bk`C*Rݤ%BiIWLja $w+(οrMVId++^ PlTPyrŀ "OPx9> ,t 2ǵ?қr/Qk;J~׶,:R3 /Q0b1_vl%zi B-8)?&B mS!ȼ`#?>  ɞXNU̕JnѲﳺYpeQ6[1nn?O{.՛ygBꝒ+_IߺҤ R7dC;)Zfjj|{ϥOXi9(GY5U:q)axs3wJieR,m v]iQ_ͰS^\zbh2y x7A?x;ŧ!k4}ӱNbQ;uEן{HU["{eHZigRƞ1ZZa]( #(I(2ذv@B>V*KzWOUPIctج3n4ː\lc$J+8 ;}O$dD&I-P'|BiZ)(qKr >FBxUw_ʣNB:;A+g7$$v4|$OpNoPqx s!j,=)Z"lbA;;ҳe4Aå΃/þ:yQUdV29l- ,a̸*ߡ&9!GhHkn.*k1ūNEM>'N{<x"P $ayZB9L+\? C4sgYYc5HT/v/\auh.6!]x|  հF\j@ "AOidqMnIxTI[ r2 :s U3>v-&_4}˱3OѬMqI0NYU;yKZ1K/CFՀYă Ǜjm5 cC;¡ d-0[D%.ړXzHɒ4ٴi-xKYp͆I×[~\^߼1,\,s en:9Ҕ34 h J? y3韣;Ym`*+> stream xڴuX= HwK3t7Hww7 0 ݝ!!JIwwtIw |s~ ε׾RbXe!`wVN6!؍Uhh bArZ `i wfMFpp`+i -}:͝ mA` #4E s]wْlE +`(T!^P#,v6 @ђik1A ky8;C\ @ZBU[ehi C۲T}Ud% e8 ~nPf?Ԡ6ݝٽl= lΎӶ +0`kv)e$ *%4 jw1k:+W; rՕN ;l[{A֯EpuC.7uIteƎ~^c`7߿e[An 7wUl@~MEBUAVFKU:x`VT0?ѿIH+ 8<ʀ NNPnAur?sx_ lm[ykgv0 P-Vv3-͜P! G7`@s]=~;rAVA+m L`2BO5ڠBܡ9^N@,@>?z\T!Nɂ w+ /t%@c}s }~?<|ノW*j.]]PGCdVkpuA//:@&CS+K6 % ~$`2Av?.q nA+A*$AkA`\t (?E?H, (O??곂8B''?Aj*@Y3@hrA;ڀ`nh9?~GC<\ʇJb2WWc/U/]_䄒S N41jZW''thG6s tAN@. zaX:WIN?.?vN'tni wy hfW h? xts5AP9ܽ %@kxXhܬ k ]__C-v Bgh%_OeB`-wWPd } +Dm8vϿ3t.ѿ%%!~<5rC瓓NWտJ߯ h0O,4Q@'vPT_1~!cH:w(VI_Q2 Lѧ 'p|ZmJ*ve!"P%SFb$GM'4Se>q_1'ߠg*93r %q5sBm\Ҽy{t~ ?EӴy~$"sWb/c;+."[J`0*x]SʼL0>t-Yu*/WFk>SE-n_h#9k|bӛ#TlG-kLT~QC<}Ӕ"!د(BMI2[bEΥ?5v5<4-Ύ0ԂN[84qF|{s`ώEx۽U_qZI!ߠ$F:ڎͽԇo*Zf \V1ȸ;N=Ji%MexwJȦB;Zp ְ3z>`ͭgq{ %ed* 7&vF5:52aQ!̐|mOQbEz-??A%{.*If'$y\tזؤտ 猸HX4IKw |SB16L F%ɿ:qJ'W n=ڀDd*,Μl'*KNQnۋ~x(b{w5ɉhr]d>T1[>4Ε]X"*<@43haʃ yxqA=džj4oq#D1VfaUZOܥ09@\:|?yF7׻Dsi/S`O)@1zKn&qI`}AO9FG,FCB J["f Hz",vjF F-gy掘xQ+׃mHdnS_i3Oi7cGl|ӗ>;y=G1ȸIQ`4,$:J<lЎu>#G1['T6UIp |cuv%d "h{Ք?pe0!1⑚it=\C+V3i0B8w23( Ky63fm"pM9kX^#kNdG;tPLȥƻ!(^Z k",quy@0b\1 JM{g6Gﴦ.:YU69x +2=x[t:ϾW\? *Gq3}A/4^ѫ;Dž߮)OgʲNƓN|X}nk7;XDh@# }n?, Q7f8u u ;RsY+%t>]='5rQMd3dOViu1h2?-$Nqj¡Rӑă+_QE4T\o`(< qEc/ bZQ3/| |UM-٤k1qN*>Y(  JD(~&֟8-hmI|hiOQ+j8es={E "&r;Td$lnbz#t aw;ԍ>S ȒJeL>h-DBBX!Wf' mWj+ݟDS v ˍ"Aߩi yR4} 9^78dqrU",8]}֏"рinD}`-fPuͺ+4^K*vkk|XJJ"J1fCE2a~1r T -d^JGW EW?U4`(ns7r~|OȟhiJ6,GbweGwol,Hi*S,}LB^|tzN: %PwdoB * 8[ D3q܅) Ux"C.2 ,H8/\=|Miٲȟ22pO-3Oi wpFƠE8bQվu!MvpD2+0&f" B 2ZTY"`_ВN3#}#ZTtS٤v *(ܡHQI PNJ:T7]EBN_FRD5Wg} /y7>ەox*˛H07o2 K0nNp`{ [K |w:!& 2Ŝw7)/U 7 d[Q&Cﳄu?X*qxXXYۄS9o_<0 nj:&dҙsEvqT$;摡;32I|*/(Yhl#)oLw:W{yyvgݩȯO ThOktz;-lQA|oXǭP" eu"t8eS&Z?&ޡY0bNl%٬E3')HbȤn?Gz?}i 2u_:8⇙,c$zg-|y;>c<L=Γgl1*Ids,FZoU IB{$*KQa7 H!&(&,{"3E Me#Ze$?R[N!T EfZHHƇ+ RRu)uW0GrB"m_(eDu:`)*12>+ɑ=M;&x$>TE+]#Qd?D4Мˠ 4햼pHixmO07=V{p3'7 0b1IͩɾwWͷ>E$*]!8Kk`ys(>+gFJ|N,?O 'h2Ke74mhcl {ܳ<7u {KH,J~.+ɴGfJ$D4V&b(.2,%{!p=*Z.{:Zu=`l7mb^U2a4@ޯE.Sӂzb6'lT!V>շ#k?2)3+G,]WnI{S*+2 R ir/gvšlZyl!ࡇ[9„c( :fŌQ奤ɻgGɬhXqv'T;>-g$,"}-XD?f]^Cm0vO/ڴy*)ΤT_~ r!#@!i%(yG;[_T#i(u`gJ&vx"gmz7Ԯ]M ʺWxH{,v:avKEZޙ39?-փsc8)EN2wW@Qרgf& {)ZfƜzϏ)W;_"7@foU@H[-=%[ cy&MJk$Rs#D&0Kf/eʎvd;+B n'ń2  w_ Eܭm|Np y i/do!p~"R 2uaK Wx}g`b+ ^t+!> ߎuA[EJ)zʛ<^7Vx+`a7tH+ ~&;&1b>+MGب-$Um3{>pZK 2OtMU63#HlmK=a~dCwq_ l t}@Oh+.6c9LzBuR}q iꟂr[Bo>_wԸ"_{A!y>|LMn<_~##wzEH-R_Z?%;ϺSƩ/n B$2NRkU?n`!<gvю^z]7)=$ZЁV8C\J(sQ&n0z 2V|cld*!yW3Nav!6w%?%.GUj'j/[U,QS.mA۴,_Oh:h&_ 935B;+Ҧi%kYsրFr!fB࣬x~/:*Fz˅ 8w!W;p5Q)Ļ^,_mۑ_BƱ(I\کذ}+לF כ+t_`l*^ v,}X?4ٚykzyl蔆۰<( e鰹x(jW uF$>Ygs/:.EuYҼ>޴٦}itm;Ϧ8UkB!w; M7;Vu k/>hbeʊɣYomLii8 XeZI{}~W 3fZv=ՂhU4_Lm $D7 {MfVcP )ϑڲ3'{gH=p{es9IjG'Ir7G%%=)d3(j:oxգ1_M1{ AC`/}euiMϮG6O^-i՝0Y)"涌dkUtrȈTeU*ᱲQ*u$Y{\ nD؛#i̵娶[.փ9 GhR0ee@eRV}Gq#6&i6,ABGJ1).ȋaiwY#[ ];ymcB.<@Ճ IMLO#gb05ipjcoЇX4^;ے*\F/9I"JYEbf9,r=_% xSJn:?8"4:_˟!r_Xb_Jp@[QGη9wOz]G4lЎ( N後ND2yM9a^e -;~;dj75AětSy|@zNۄf0:揓q ĮYI t t]_k8l+ke $M%,wQ]zDJmGٌ\%볻Ň'{ +"@R5vF$]/oHk\-U!VlqW~gұ YODRγ-;u)Z~]+:[ٍ;&/E3^r9Iw.jJN/9uf$ēöep6U[ р OͰ&.ɛ}{}4WZ|}۲~ -d~nW%Tg("s6^q>)0=_ }I 'N%:) jڽbVU& b|j3X[sU,jj2̘mnDaeH6 \˸fJ}#iVBK/v #8꣆M!U?w f%}nA*6i}Xv~x cLuMȵXaf Ut^ uETU@Z%zz}HojvnM6ܿ?od>}XaHups\{DMmc'~}W/f04hjhwoXI\XĞ w.Ne"KU"n.nT7Qc3Da6tqͿdv1W\TU]۶?l>o3QuYu?Ot.璘#*@ꥩˉ+2Dwҏ}d"F{!$BH;!Z5edznG;qTSF\#_ƪl;z7 B'A¥ f鹝>^ w"o1gbu`NĶ5?RT̴_\]0بӕ;<>OoUǿ0g.u|NbvHUN$eZ+\kfi \L5Tov$mZkպ2E5 ޢ4ur3{R/  3e"]/'=.D;~)no9BQ',ݓ)0ބDnges>1Ԣ%baI~z@np]8, ("]PA龵R~ @uRlWA%mK Ybg*b̚M.KJ+y]C%5TIK"CO M7,Ub2C_?:)L 3uEG/8BO,Z&Ff8B ^-?D'C<ʡoȞMY6߁'_ƫunV"]nvSEpٍN.$;5 X,aA`lʁhq^B$'g9>۔[K6$0L ]e]7kGK\lBdIWڛ5Imn 9/]UgG"䟞t7gZI2lj@miky]w]GEzFT2: {AE: v]4$T MH9 TQ0x9yR;1Se] ˘,_Z\_ޔ龅qep:.DLgqy{qA~+Fi}-4]|fk`i`m1uG aĻ-y&i \^_tu )^Ǹ`|T'{i"c:!e͜=!jҾt4FAC%#,VF }6QR6Ɔl|0L45H˿eF%5~CzROȊ0ڃPG!=ͨ=biP7&@;5ä!*bY,I5ù̊buM Ok/ 9H"t7M1*^}5Jy/swGrt 0#&ɒD 7)O#ܭhw0OQCV/^Z &l3M>RJ{j |XLU0SO3;S6 -ZvbDMtn.6=+C|yTdHiK=)&k_2Xf sR#n)]1!$Qc_֗8m퐵•mnh>K%b3\EX~n+G;uɺS_bޗ>.Ը(y9L+*vfNuf=0)Z[殖B3p-WDǂg+숿]NYWw7Tt?,`ـ6t,ǭq;f95ٸLvy'fOkm F[Lvs-B{jl8v%0,=f93(^9%cT\LbpQJL}"Ǵ=*[ĐfCvghc0j:5\fxƖSb0߭m*z쬓To >![T둄J >c޳ʁ8C}G}Afn U 5^ Y#-uI&Vvʮ;zю/mǥSȉJmln?!|%#Uť{*94VNMa/"{FMs0?i9e~ + "LÔxLCh9w.;+wAJѭk;M l]m,6!};+xLeAjF}Dq=i Ƚ=z~QJ 2j*&Hӆ3!ajTx !se ALS}Po"3Y~WRQVLE&9oA sO߻ .V \V w.2K"I "yASFvԒ!][\̑>ݙf-Ă 9{ eGEuWpHa?X &$De7~8AJ{@zG1\Ä jp{B;t Eɕ~GM+}GyDվ ZNe2Z$ $ӛ*IBmC[k*&m#&.! G)žfxm53_,ℯɟM0xtgsnc)Ry7 a2ye9VMŭ1 3E1N =mIZV"!Y9ioY?6)pՁAUo5;[ #1fl Ruj[u rC/2RN3j\[f#yis;vdsw  ߠw9K$gCFp6 u^2 F~MPʒnvR>WD{&Y-F,a8`y C*B]Y1pݖCaD Շß}C+|bN9+zU5Y=s(a3oNR~ׯ/:UX ЊI"0emPP^<~pS$^OE.L1öx)]&ck3[R;6iIWx]v-\NAA <̫Q9X K&0'Yw֙ Ipİ%c/_VtJC{7I20Je s$>ɼ7qpPB~lC->I/Vnj6*v4|׀6s%a.2%o` 6.$w2/gq\j5[3WdE[ك.,)%t9g y,8oPQ$$8c -2!z#u٩ qÞ"îZI64Imlp ܚv˶6EZ߶`&b9/d>DV!(caVf+BOu pǻw8CKU}|1ю>T,fgG p?(iwWkȖ\[[: $DQ;I+5:@c  tJp(fAҊdLz0#`3&lB@,Oϴlj_^8nfT6 "2`LSKCP (Xp%cӜIXZ\`dV7KN1qc71.C2j^FJ>> 5yg|ЦfzQe0MQK(h~ 9g}x {P(l۬Jё,*EkAXpD(ӫH8Z\]^gؗb=pm!_bNg Xb(1MׯDzre>#E6z 'ˣV7gh/ո`'$V<)>`kG}c^齇w&2l";'st綐U2Lmn$5XY0c lj>wa.z<z3օ'9gqN5>9a:VY;D%45l|DXTǹ:Ù#V䎊磙>O?эxOu] FћÞkzƊ`Ey.6PT[6ʒhәinOm8DT_&N"gqoJY=SGr꡺\2s^c1)Xayig/p>yc 6+oE,*vR{4OqnS7*mf$`CUnS4Ot~2qm5+4dl4;;_r|BZ>sSsfauòvDͽ2m#RQ~Q dWU[bg[hui!ۋZ"N|NtUhs#N}ötpN qlVv2!BtR$FimvsH|HPwyk[-] ;4A2QA@y 4~&'?э_&-*4^3w(O29`K bJZh]WΛLB bCfKƄ QJ):5= "1KߒQ\J! 3R$МX=gKr}X$vu9Fۍ_@Ew=ֻuuo\|ԶL|/ep>5D}@ WIkcMh tY[#jcԖT\$H4Ma*nӯd1̷o"e,INTf{KБp+v$`KĠ}=rj݃m>۟r:=:J|LH}p<*TjCIo{P^=oa1*'828 *}`ؙ.͠Ú萑<ٺσ:X'7s}m$l}"X.+Ak\@ɾ0Zy5#7k`6dtqi0:k S:vm?g>A4L,?,H\]C5R}d}08~xĔV1(c^}qwtG%1"qFI\0,{ KH~m:.~IAv/ћRm8SuopR"πaJAy3N[bO.e4/Sc׹^LC󽃲;B5P De)2Uf`CfUg9~Uhۅz&927MZ޷ԉCx`.)l7&ƹ>&ʴhNж쒟W7%V@Dd'fdՃ0ZR<&B"C= XMe;YW8$ym_3VWbsO {V S,7}~{?Rnn@Y&1@P%nҴq4`_ \ [5 F Ȧ~vc=$yhf]͇/) wy;+Jf*n: CR]@%7GI`a ;bZM!H~:EZ#43ߔhnidɲ(D_ nbb\ ݤv:i!&E >AK")C  mt1E,{N- `;/8ZHW<5ٌ_prUɄ@X JTi?.ؽ蠽eL.FD*۴ޯaA`M[4TnʵZ/ydZ r2&L8`ɣ0w`T'xk %r~p4W,yMƌ"):gw1ݕTA5w{3^~c=EyFHv$$+c;WesnL^^mZ_1Sfb֞w"9sxȤlm<;c^d*b[B4ybT|("AO7//"u Ȕwu-8[$rraxQ'<)Jsp WnN|[2AZnmD kg+Вj&/"=QȔ N׵^C$XGp7s'3LOtNN=M[3I1Ya\ﮦ1>bɾV ,vN kD  y򰿣\I,Mcm yQ"-.Dخ n;BRU3q5~o-=f>|1̸sfnB9T@*Ns",!]80 ٽXeO'͞]MhDI!H "# 9]wSX^Հ 8@HLu&ƌ714򢱋O݄Jv^q6m'l^}~`đ #H&5T4;񼖀L]|垖 }/Vdø gNAlD~ ?{|2 .7&c=r07\acu+ 7}r״4Wș,-r*1^,TE˚\~ˤr' sˍATHl[ dJI3To- A{Itj$L4Ixt4.-%J+9xh:2G,XǠcYE!Ɓp j\"ZO "f&B~!u%*R-WWx׳Ġ(> :AQtj(|p]mTk|vB!#lfN>>fB>Yu:p7D5|lZ$Y-l=]\Pd벟Jbe{|q}Cxv k. B^GL l qM AN*lM*6?3"yǚICKub K+uOnk-ZϲwyYB~.J4[V/㔁={b?0ⓕ0>6LбOc .ҡJBU\r9u)jT][DK( ⹪}Yӆy(C=T׃FC5QrX 3A8L5,h򫑃 ![IN[zʑj$/3ղ f<'Y43;h2T]4/3ɐ Kv>$5̲9^N.SR[c2 ٮHIQzپzg21@b*tow_S223GkbC@%A0\6OKbU?O9dKe~ -FDq(YT7ۺqF: lv *T6[ZwZZ77~j/^DK }?^Ɇ \\˘$S2s"-6'DClڤP %wbeRG!Bs:Pґ{]+YEMή Xb<M ~rB|2xE"I=wtфP|')BOE}gѤE"is vs,-[Ì2{tI?֦"Ac:0$F6P]TnNoS.[羛CVF/lj1lЇؔ߫ZGL iQI<sPe/1Q!x`I@~8#%Pi+x,jE RVH+* 4NtVJR-Am.ATEIpښó>7tR-iǨF]Ju(QQO:,U20/&wKViQ<ۦHU :NxrSTч0,rs^[Ī6nӣ1':Dt';^uF¯}ыvQ(N;Z @ I,яs5Pڌ%Dlo5%$W2fU#q2+bĒ+Wcp7Q:8t\4Y:Eg`c\H2z`v~D<]Q4jٺ35}6\ß/۞.=ܘQqQ-$sbYy(RaEtuܚ7NO3K9lb!RiBw[a)HW^DAZ Bm ἘW"7㴟He6*KN)$|YNWa`¤٣3Zǜ@X1El="FƓSp e}3%Rb%횙 r|lp c<^kn͏ Œ'X]nOJ]nNE7bs#FkhlZzBw7_@NQ,aW3!h.K t8j^SN,TKt ٖ&^Fc?d|j҉藸S1 =fˆ=WQHXbtZMd!cy4ETH[d 74KH9$fީ"=?J;ORAbybgʞF@sOoT nUz2Ds.&L)e%m)Yi $~Q*.H&"0^:.Lڧn=t)i˙z-P3iz1|-UL} ;f<i4w^'^\9F9YǷT `%@MI@fp 2<{:]+FB v:"hlUf~?Z RʡٹAJFռֳ\׆on;^ :CvhWNh:5yV 'D1QLdDS3 ]?q~g oc-T=Hҹw{8! flhcʺe/Z~MB*фGO1r2YI2{/LlIKD#o?DpOR,> stream xڵzuT.-Z@wR(EwšH\wϹ߻X}fޙ7+YVbX `(+'@EU* usppqpJ- X Co//hy XzTP m/' '/qZZ`[" qrAfe鏷@jXJll5Nj`@;  hjj5k1rsri-my,W~oP~b]UV[R@]O N;'q{a7W_ vP;+ b?m;+bxy5 lN] +_Z"/F@t G; ׿|UU 0[B-nd/@k n..rKiE] Rϲ `W+@ 3J)ji U0x2*B> eHeG֮h'zcmx}/ lmnN:`PQ_DhcY##~i `c _h>@ O"4N~5 2/WtE  ɿT3 )ˎZC^k 2 rɹ98Y8mfr0eP8Z8*ZVvo"e%#Kg^fq]]|/M//.)-#', b x..^h/S |gk_c`gC/.'7(D#A"^qx)_NN; n `s|o`G"ΗDe~3$`UX$J,ohE_HQI|˚uPL Gꢶ-ZF`iQV]MN֕V@;wxmR>>\ӮO'dVBKgI`"\y9O(,<<[1c4\7,KFp[& ܅JofP|ampI !\$[78n`]e7Q@a0!{9c;XMtH\j0\UNyxG S k.}}"E9QL6`eQQ7`W(cBBLќ3e/ʑcC3E+߽x +i7 `$6)Si:Y$o.̲Uu~45򊈝C"U-8:SB=Jlkb=J-̷e-?qyXW!ZOvjN-i豘Inv4\VZ E.aWʍ8BO_A\ٶu9J:wPBr(l~_*"GOe'^]WYj @n, =M,11 #'4 ib/;_fOt_J87y(O.3vrǀ^5m4ߙ^z 9)fX/fEzW9V.a g l#8-םH?%DBc^}ĥ[J5o ½j9+Qއ6e(g@6D+gQ82,ܷ7vQ.UjIvA*%%inuvH}\gUG 2]XY1|נ_>rɿ?7uݗV&x8aU#R0֗>ylgdWs Cx+4 |HljQib~0@_Ugof:yBhJQE#?IH ٷ;:U{ uX]sC;:Ε8wHH Qu x dFyˇ-{P n 2;m2l- یs^Kv& iݰ -F `toA%5*~:jh|KfHcM6j熯%ʂ\s[6R {.EJ\0 D`ߜjL$łs2S C~4^U[܎$*#!>$Ul-VF6/][*鳹YqFN]U7*'@Oqפ< Fϑ\kznkۼ2>rm%2Н|"m,Nv;, I3V-(6 |k Fb9^ރ hBa4QYn-l>*,u>wDo3:;wgԿ#i@@ ӼonMjTH#?o\ۘ؅e{7' $yE0YwKf%/v6G#iyrudEۻ駁SxoiMQ `߯;&^~gxC7Fc[uo>BUB6si$o9.&^YնGՌv> 5[(pc ' ,viYh"k>F"6ת)]Cڊ#"0]HYͯPOF -8 H7IJypX'P sI߂*܂`[@둚"h1CG1Ӏߗ4l_!mQ_2m㻳'b㸚3w:(ƍG*|g廋`QwqnR] V+Y;е9W;Upm_uSzK)rɪ&RlBLb}E1z%?#!wԊQΊ:Ա6hr. eݔ:OZ+BK5›$8gv0w\{_Ӌ@XkڠVͳ gSG>p. rkUI+MFW ߤ qʛҭo59[f;8tm|,oqH5TlŜKZr_GȻkMͣޒ|*VlU 19IᒨƄa-<LG\CΩN.[5`d!+B'*jZ+`h  P'4&S¿EMkfqYhVοg_a~]'qx9&yԵϸ/s!tUz JgTk6ha 4h*L>o0 {u{oȓ'J&‹1l`z` +1_mrA'0[$n&(⢚DjQ%AUʈ˼Q<~=Z8$kEd?QMF$rzyF=t|$Dz[`yDj'G}p .*C-Niܒ0}D3ِ K/hi/I~n\ԧx AL&Dk8`^Eo |#*kt,V_֬yw0 Ty)D %C&vҮ{-U'}2YzuOBx0v~\,Ie7 2GL\mXɐP^aҋ,B + O˵V֮Yl9faeڳNX½\`"ARC,)xϧ8F' VDoN7]dߝ])?QiZ'gʕ9 ~5tz5LX2i͸yYJw=m(q daαl:0<<zS:rvLN~´"ްr.KL`4ZP],]=vŇ8tcVhٹK".U:yFb=o%5+wrZ>cß@ռ~ _SIq|jomϭހD+I =% glw |tuI\8agZl2BEu0it #?.k2<"{CdG0j*TL/(#V HHm[!!{Pqw:^1*[@{[k `t^~Z\ԕm{`,`xjH6f<__{ɑ㊯.c C'r[XoM$bs`.7{R#7Bˮ1`K]Z#߄% .?Q]\@FVmSՎl\͸hY}5~ CE}w{!pR աL,=-N}KMVȠtg0$ 2R.k #jO|)-R`gc)UDHtaSˠIm]MnVϩ;caIRLۻP[n rωgL*JeWo~VJirً"HK+ 0d7MSoL[%mo̾CўY)­V,?NrGʈ F=%e:Μx6zqvBxt'ӴCm#7KR_ɫZR^1^{y+o]/1Uf6I(8"{)IL./\lp_ O`! #n/N^Srp.\ 6Zelg*LٳpfXsrYD*RHu+' 7sJRrB49ULRfU,MD5b9_-FdշMDw-_/؅dң \~/)6i91|] u#/2;# {ݨ0 1Ϭkȗmwn_,@$Q!ygs Vddn019ipܮnJ\$MK)`rĿ*N|1]k|#:dam!>j1mAfow>rRNȌE3,3B. ~DQ}L^78\ռҢ#Zx'AN WB~0CFsV|?Q6~pR]q짺Y{6;aEJ!k{6u *i-c;M7U&WNgUÎTBG9GÛ!PNjև<.ڋQrJǮpZm nuP;Xc8U_zgV?(op%=Td P\.{~.ׂxar ˋ_˻6]-aoyy ;Xf.drA…>Fh)j"*9ZW{ک92V8A&(!TMD Se ``rk'Q{Z2v +^rŚ!orcƭ&F3>2c^7a'*p/6iNlw"R?Ⱥ|W^ I[h."#RCz 5G ɉ"&Eqk=[ >27+ʥ2R9 r$7.q /{1D: cSl D˵ek<{NbLw{AV7sLf0 F5e`5ymnCgq75!-ő+7*倾^9{w0lt$A EI" aNqlg]\w|r%?󚟙~jEЅOqcn'fۑ R9>E8%Mi~*rUE"::Vq)"HNdT~OwY_E680/+'d=eNq-RUYGJLsZOc?6[ {dB7*YҀCգ\@wn*Ix}BCn#pg1Akio|%G]ٻږm"uĵ"")?}3h GnND3[flk G!QZq쓄c]!zj ُ *+`Kgb\ED<[H5an$=h;.]*])o l#cC߯(V-S Qyg }yZ4(/sF$ bg93~jrcF%ٛڼԳly c+iԾ5X@OH)NG)],P4ie; FfEB%ٙXljbm~+GSsQ =^pxj7Jt@ɾa͞yGu:n z*\aV){7|<7ӉŻz ÏIT|PK T,3A(yCnZ[1$i$8 G!^$8X: ud?}bp'},#Nv҄(1ku2~)9?nS@}#C"ͯDi:wUԑh/xM`LxT&P;'5a}k_`R wVWպaړ|ȓ'ݎ`;)}HH|Xp V_Gi+rΒ {VֹY:xGb`Cٲ7W;f?@IY`"yciF%zggϧ]4^4y ^ӥNd8ݻ23>*fm6uz_R,yqUm:e|؁{2/}ԆBG3sV O@{w*|@8eEfq: 9"ohDa{8cq+WԜ_V§2 pJsQD> 7M,ЏgYDB6? %cP%qSE5k{! DA1 A=w_<ᮓg*?䚝UýIMt9*/նD^"ti\U6ڇ> v;0}][eaR)lZ?H 'RZ0˜DI^IX-WTÎe=!.CG ՗ҹ߬ C%Wr޴Fu"aR>I^C[@4ǿ3#WJ@OshXx@++J}K@ayh2k&ʹj oqsCyZT ,)iS|,#WUsc$qԈ JaCin-Zs?s mJwτv ` =L@@rT" cy˶8h%r&FF/ר0|:55D40jPHP.ҒWN.$D)ww2yw(p%Ư*S>~S9N`W34Q:9n!=Q/GXXH;,vzvlKr؛9˥u5ZKOA1Vm:3Yk [֔j9d~Zҽ600gK?PbPT-ة,`f|ݎмkkӤX P~NvlO 1 ؍e6iˆX0 aPmQ(e&7%}gZR#}6|Xat̹.|T<#u Zw7jvV1/d=wKֳE,j M v'bi"{s-`op3#sB.@ ˈ.?UJcK>=>"WV cd%j)!Lm}߭6 vSB-0 vP'pqWR4[0t 잉s}/! $B5ZulQ|v}ufsuExY([PJFVg:XMsw"KuAO1>ONވ]3oCc% O HM3k&]ؤNUξ 2"B%$ϛMlbPM_k|n Q-}*u ֏0(eS5 }e]>P z,tm8(#NCrtZ޶SNϓK&iF<).' G[RNEdjUě.hwWjQ{ .N%Bl[AG?l,U 38!!nT+ąWFxޞ "}b:aS]@}7|-bP!d@ "ɣЦúp7=_(2ɑBmƆ=T/SlPovpG,$̫;&P=vF"痼Ko/%$IX%y3]J26.:_k!#3 6Ro!r -U6CO;{Ig ԩ|g'ҏD U޾FڰB'NVR V~;Z'%$v7Bt)[U'JWsP S MN"lWKň}5$KBஉV/3]G>d;M&~tawxP8g*[(U<ϥܾM*CRv?)Ǜܹ!Sɑ\9"H &1 󞰘z)f"cÚdD~6GH ?RBWբ;$T#?&M,⍭2d5:'\Q j#ty^+/v.S裹Į%MDU7l ouU{r `S "yk(-Q6QǝefЫ T_V-!誧դmr `V5~!tb[Gj. ~vEYe|l/o]DC's҂~0\ZOl?Aۅ2m*$tPwP-f]<ɅLUz4y*j@G*'eg`vQƞsL$ s+oT߼rrkwnupX<9+ⲕ,4lV(4;˰8f*kc{ǯ tb,ޢYp wU1\ jM3\{1MIBDJ{tK,EUq9-鲚\k/D驌97N9D;޹ki(Lyx6!a .|tBGC  HWYXjv?;aO$#;Q9چ7ȼ[1DA0n{^\:J.Y|.m]yKf`K!J+z̫}sTE3n``Cȯh%wzs=L!^mb >s'"#v_zܥF{\Rj>5K&JĻN?p˓Oпz>ݔx_c2ܳo_#3(.lRV\}2AX>tX7h *lddb:f\Ls66 NmI!~vlG;>^iۆb>ϳo2 ̖ýkN.6߫]wNV04^uG1$VBi_gyfSOvy/2ш֘Vu*>re} ˾ w:(0QhDaA ;:&힣`b9uA(ޑ>JEIjmn,C9Sfor@YZFu!cQXfi;*,}ѵ`4@@L\x;ڐ5=،L5Ip0W =mGc <ޱ_! ݷ*Y}_TYMn#ZC_ߨ~H!NGqy ND-w!*]-8VEjUî_% UZ||6l<N5&RC@G~@`ӡұc{ JHiGuɃ+e#!A#}kb5T)NP2+CUx6 =<ϧt6 Qglֹ$06j3$ִ :rk1HxezZ9t] RE{ȒйjČdyK}mO'SD^=b)j5 } hX=38̅WqWPDlVÐ!d^IAlpqv>E\ endstream endobj 127 0 obj << /Length1 1798 /Length2 22735 /Length3 0 /Length 23850 /Filter /FlateDecode >> stream xڴspd>v:msbۜv2dbĶm}uVW嵟ݧ* Pޕ 'jl `khbk223QP9]ō].WKg3 :&^y#@m`bi[Xi>C,,]`c`o(#@ `loeg(8x|*9JTՕTi?9::8^Tԥ" j=@J]U zڧoOǿj"jJ,L`](?;OkvP[:21yxx0Z2:8[0:ӟ yuNWK)7H_FO(?>'s2.))쌭]Ʈn.toտܜ֐/E>Wgg;fl6uwrquWF {{feN^DAFRBUAx 3z7/`$g.pً?r?̭#_T `@OSKea_5_'~>sc[9b:|Jp,\3+SO ?eEcS7pK DL?|gߩ`Դ2_.ƮV̟de)@?sEE<}?q``` eaac?:ϭ/=pKLB[*JMWBR0Vc j&B,eNwo(yڗjQ`ھLݚ) $!2%PCJs$W]>ՑAP;}e@N#իX-(gipE\D_uxˆ1Y3* rE)zhul +9bA†(9.$A&N{JKƳNC:5ʕiKp0`%;F݁"ƲzC QDɍV__8eTFņ+ա0,2GIh)oG*ok&'ߐx +d9s ~{> wrn`4Mm9{X% ´mT79p}Xv3A!U#tJ_p9!0jh @aqA1(S&dX9{m҅+Gze/n|*YޡTa?+ueQy{#uzc1Rb87Fee RTY]W,.$<;'LF~S߇9sH;ON; FK "9f mh`ҽ;bP?V%H.f9Eʶ1) Z}}vx00 Y^/ (Aj 5- ^)ӘɊ<:[s08ʧfPkQhHI'Z+u5s}$=QWV^+TUu$OӞU i:xհfVn9:^] jG83eHѢ|q/>r {K=kiB8xpHq0߽Qxvt î?䫦kbea(n,3:<89~o+hQKODhދ*7Bl>t#˖oO^%r_/'auӖ4|I@M"E K~Y. Wt:<▽ф àuY刕%񡍿Ar˂06ISw߯ļ'߹ 6&*'zrguV"1V C CT_Q >j̠2)hВzآsq޲z}@(^W͟9߷)V~E V_ji3mq@;Ux$tիNnJðέ$US)wT=*Q9xLof+KѣgOĺג6a삀+[Փ C9$AkVX`>ÁHIF T 0Q>} j1Q4a,Bgl #?/=z e M<ĈS7d:hcxRNzd\w+S-*)>>"YEsH4x)M.o_Iz\a:L[{Nbuy( 3YPBDLZO|2> u<}h˜f!Ҫ@|?z&A9ᑚ`twVvQ'q!0Q5nyKfͨ5qn "glxH0MWORDx}ZejYrjgli!e%Kwf3afvsd\)lL"ahAp.!js8pCC%?3 "VEt&-E^1FoBЗK+6E5< /da}}$WmR"|na+#q-U9UӼLS[ޭ>4G[_ y[Q+d nά1S3f&^0D9xxb?C!'-XmnE﷬{Rm}@a2 A;fck !bnjJQyuFs/?cH~,dXбIhe~R t,S.h7&A߉%a"e4m V]26Q{ê2@9ƕI FNka[[M/0yD1n`#F,tcw]? "E@yȸe)˹~œҫE|V7ՎiuoR@ P)=q:?i8gjqUІSUE1|> iY'wQǢ7ºc?x91M1Gi$96:: [􂿉7CN +-BCYˑBqQTei8PFmW3-7k*1na'oٔk,'й'$ϰzk̆ o_MxRGX!ZaVUGPL^25`ϾCof 6M@}*b3xCc\Ls: zXgZeoaje~6$ڱP2R0Sq'#RURbfll̼~& sX+#<Ơi<%RU]FpWp}sm~n>59'.΃y%L 4\)QZU4=KxYTf6Z2?U3n[d1A-[44/UuڂW!$uITˆo{If:؉^:bk/Ev!WLCJaF# U'3xwsNV<.ϋ|MBA6I_? 5 uOa?UwTճ5m봎wҙ 5hRi_̔(M0-~ @"k%kt!hp4F}Iph«Yif߆#j1C|PsֲUq˯F ]f6{R6=-KBUTl#?*oL_&QjdzKƶp^nEC`$g*~; dsZ%2-%yL]rnO' l)b%2NY?Z[G'6_ f3I¼.3WQPJ.PYecX3^s @S'PQ [6~G^/@ԎQ7DB864L3􏝤 1SZ+;Rvk7Z~~HXFй8jcUY+3M-T(X m~hMδ<bJ_E&t{*jM3|!r^{-1Ṡ˟݄؇tGSNqŷ)7tj_m9O jԢCl㚴xg)C#9h$U H1 BQpNZس$̳1 3d~|TYyD;OSM3^h)ٜe;0ٝx6h緩Yw%nmGG!-nY#5}ʭ7WTό+7z?JQ,IS2tW WfIfkv%ʖ`#UU?ĂW.Gik&GUpib l?5'F,-Vя3c5sƾ ^TGuQL$wIwUj^%ҖuzwR^a ./2= nB4[F5_qp@"KU`]Cm9gTw*h:Gnܗ'34#ZH_`]9i=ӺH%ie ̷EW 1Wt=R޴\ILTv,(ZN>F-jjҁ?u'V'u&,N0}I!>RH0IAs/n>dw[Ei=_;}؛IC7~C$nןY2H}9_P嬟LFN*D_u; kK RwQnF'iݦPk&G/նM5{eH)C@n,ӎhK̪fWmR,+NίIm^D }|5KUTB(@ š}uePܢOt 8 T]̣*&amuʞ>>׉, ¼&/^>}1r-.+zp!^I)ǭ(dE|KRBCr;jYnGނ;Eix 5 wIoHҠb8 '$^!>Qy^yveh/c"l|F '1-3FS;ڌaH`M3$;n>ɱkbXUquIjY_i^`on谣f^bXV+liF$hJ*G (@w2{zGE[$%mgA#ԡ,Uܑ6]Ϋƣ\N)O$W")O=ov/;]H:h߼"mݯNaf{2&)~16!~H4KXn k|YqWnִ3^tfDMS+sj&eQ8Q憾ƺL;<jP4` Y" L<7nvL;AWcӜkwQM]i?mJe;g襠#x~d0eP/8M'[57t>' ;xڝOlp* 7k]B-CCEWķA ո|tpc~"I^2,XC9 [ot,~CGtt.(j  `OnA:2fKYdH aKӴ&cܽtztH$=x<Ō͑`ڂJYuЕMYS'U9K#n|kN\} y?J7`y.RA)G*U(q}ƣ,jGnŬ}Izr0q^"VD6>zӔ 5SYV;?v#\bG2Dԋ2NOEn4V8>TIpcT/(ںVG2m3~yWg8a@دRiHO]MCbV,J56 *y/E.&5p<׹_QƼ@P4J9/m͆'ﯫB,αel-cS J[6Fgd\pȖ ^ a4W9#seXr֎Q%!? ܺ6xrSh&ImJEɄU慌r)+\`J0h}e۩U M0\ H` A-4=k=h1OU58]_%Y0V));|,^.|s7opgh`h"u >YFYPI,T:%H7 ,(7 `VG/8Kͦ+J-@eĢpj`o0n?U|2nA#:Hc( "<~^I3g-.EIdd[CL; "FG;:I`5챛  RbpwNO>L ~ vLqLh)oc&T?m̊&^ɾ噝NSJ]tPj/隸(! ݰal{#mxAp[xd.'dwyW61DVQI@'$ /iTRx5?hJ,&&H' fP}I(u` Ezw(:7ig:?G~{;1+ku۵߲h~SKYcvbR^୻`I6Ws%Nv*OL/D=%/:r|وՍyba_?#Wb7zQIp6d_jA_hFBSĆV7*,4E;5y_zd7xSb"Jħo^4a[݃WBN ɜۧ?==k_w`< jʃ{H*R^dACw…T<)_Kʩ}f_G a|TTe mg!nI9%;hФxG"h{66|t@:E&F!I qAg~c'ٷ:/ I, p \nPjd D1 țEp6׎?λrB MS{] TukzxvJD.,"")ZégHsUT.se]$A=13_\'WĬ$AfX%NʢDȍ5w]1Z∲1R[7,6d e⾸k:V bΩ) ϱ,RoxpnQWr-_ fnjݽ1Ҷe| ȑi{sL #V\j=O (2I/^ah99jG(nI6׮ozOv buHUDLV?͜Nl,F:+!sjt#!sTL#ӷBM"TW1V!ԙȊ¼D-503P5vڀ p1E iXCW 4d=1(^~Wɚk3-j?7򃞵(N5'Y9&N uN=pgf0M>.D*&cяDil1//lyNŤgu~)(HwPf@rk_wQ:nk347raЂ1q/d:#Ra C[ jdQB !MlQ>W)o=gz<Ga˶^ ͩQaZd:nmdR1 \VI:s9_+? ŋ*~f057Uy-Gh":Hoj)K76ꝝjͰT"K*"6`V[[ rN/rӸ&.Uwh7u,`i8:$lށ6s0Qf m Fgio^ڜ5vi^F7?31.f63_JJ4a؂ISД4FPJ8WJP:70g`2G'琘!S,E5o;m ^}}-Kj']9y/AB΃:_H }wɈJ_0nU'z)AOASỽrE6+ uo7J5|ZZa!7#2Lq!.SqLa8D !'"IxCo%vrݦ?G/=jXe8n]L֜nCtl 8TL\scTC #GT_o#z^| ZD 3oM\S7Pҍ$wl~3×ҮyS1P 4tmg 3z$ʆIaZO(OJji/gepx=0ߟBRb Py9sota|1^ϸXa,YfՊ ~ ϾfL%^2FO!QY v'9I9>^TƧ +!7ܒitMGԺ !!v|ڲ[HkdW BJ0~17s:p7Q;d gRg",s%yhJ# ~5b4f(J:&՚ڭ,2̚i9g] zzn?x؟߮lG'Idk}벉$l)FVE9 8p)XluByYmI:#?Dvx-5˞8[ՀR*8mcKz=p/"8ne*6Gu'd;hxuB7(Ot/$[0PDD'c] ywucdz['L}TOɉ3΅=$CI77B 4ڒ1gQTBޅPv|Zֈwp9chď҄em%Y k;Uct+87 /`[s?ugEَdq2S\}҉5y$'E-dUh *e1X9VCTVAWTF{Z[p5&u -H1IA- +f/k""b0xgQ;Mpx+dZz"[ 1|`2ڑ\R8MW΅2A FQGd[3vR:Ar)a/}˥kjI؜%t9*Iwa 2YN*/] _j8ED+!nJg؅}hMRڬr]D@:^G8@7&iL2R_Cy=R I-.@eubJyYw'!:aq16 a߹dXP# ˭6 -=Z&ʵ]Cf6 o0{_c9=1v|=EaI ̉+S6kwƎף ۊh;+|N}>&\k9#x-O' Zɻb!gDc6fCh bvTU.M(eD{+ue(l!]M5&q$y"5H vp9|zQ>i{D%馩U ff0\wuaD%xp?=jc7A~9ٻ92G5}v Lkm$ ItYJ㬰x&%X14&iY8f'at򄺛A0BtoZV7de3\{)m22oL:%U3&[\h7'@/;7P?RM|zH~#-C(>ܫam›/ eû{'dWKa+꫄knD)G bcUBQZ^:GL'r9 ,AU^HǹHYFѮǐ0`9[ϓ^\)QeOsfo+p(&aCY3*T j?Z|X,R3`W `ωj %E[z. "L+aw!0 ^g<+8pw|^ 1z`lHJ+mNEx,wژݭ<>]{9 KlI)`ChyGBpF} NSzw<[9rf.xGY,iY~~G\s ~@@QWм%Dfk3 4#Ki*\d|),t e~nb9ttn6UJv[#e[;ަ6pQ2r LNu9/E\qiRS6#ųjŽl Rٞdq'gldN?R-U;'3~,ڔ*z f x!KީI>&9qcEf)a&i*-Q gC]ONSQYKO׏@M,|$S&2+ēAsVmuw*^%SŌl_:/| R,S70ঽNG@I|^ `UP8M&O [ΗH\FaZ$z8ao2(5u.CtaFqlʝy0QX{Oa7 2|z̾-.w/M%R(i7H=V!(| u|;ڀL~t!oJV^ ,rH+c.MO­Ux* 1E *k*~?E6pj{p VBJ"[ղǿ=-i3V]{:9CfKiv;k+ʴȖOڼi58TOI1d }-SP:O_&^IRDψ?{~?g`-5 Kk/qA &_YGK&t{(dڞo -SHdQ桩+\Cؠqpdb;.&koVԙ#1se%"< P]՗\nq{p]'lϮxE;mO{8 cܭ[ͺg H.2I]6K @1`,\#>a`L}VK ƢW)]܍*k2&7|5z|gi=n @c ƅt-岇t;eIܘ )ZxZ8 safr 9#r 2%x2{M3&AԪV\KE<- ,5^~m*$G%ŋgI|s4Icw\soc~W1vY22&đn)4"/ݢ@x5yZ;TuQ´g573|t_OTnYZ\[ [БH![s *^?ξ@uʶf S&&,J>+jM @J͏%nxO/-=FnYCS9wMBur4l1r3I1(+濓R:8;7 (žR5cKVog?JJV;_B%ys868W/BB://6p=Zc,BS~ +b9q֓Ay/(RwPU*͜ bJCq!H?Z*Dy՚sW*9d\))4'3-Ƥ1@zUV`hv+|)?a_=ƻ,hW'̏fc&Y Tu)1xJ!F+-ڿjD-GsȑvH7x'үE7d2]_x(]nR{)ҚrJM[Zj%a/sxij.EQD~(PwE6#cܼXPryet= t1I[v9"_QDe@h`6/cRb uA7ٺi}[X\GpȘ7lL=ԯ"GpߑՑuy/)~/] 멣X :U=]7~O8\^"yOg 55GLLl} 6{# M-"W|Wjzĵi{#)KA_6 9Ӎ)AeT#@VHG}$ϖ\9zY_S269@zH(!S\y94cKQb)EGRZlJB=ڑ,Fk6,8uljϦPvx4π0ci=j buɑQow~V<6~گ~KU6kxS)YcYPNjcJRP eL9}kf.!4NsAH͓PKDy dF j0CMVd RJm.ʊ/zzX?̓XEaPtSs 3.RT=@w`4spg" >˞}+ aTM# Y,"9}f疆 CˌGHԎHhCgIt A^Jy$DT(OTM H-RjFfPV'Vb0/L ^a?ƱMny0eXkqkޟ3yΘx0lԐX2ח-亂x翱^H #xԻ 22H sWtKǭ0w-{3=S$e#$\tΕ"hAg:wl0ufHBk'ÝY/S+dRc``+*,5'UuGj7_.zM_k6;pd#"j?` '&}A+ U BdujYj*섇ӯW>Tu>ߒAZ`ٺ\B xl/'z8 euI8}q'lY.ت~|Enߋ2903tR`'(,ɈhGVn=0<jw@]1g=  ʘHJn54H!#Tj;+"6P"ޓMD_NYN6z æ<2Cv:p)}$HzVrgF {t`eB C'kG4|X[?\@ͧv/EUQXrijpN G]1 <ԫv'#N6/X`nWBkObWAw lMB1ke)IzUG;`Oa^Bt̃OűNSfόB&oU^Mfa*xiyR<OA|2ێs!&˴z1t#ƣQYrBQyst"~ײ;C]es*im0>͏ptSPNnŷ% %{eN=%![1!ԧ--!yWWb:!T'ܵt69,d¹I+I)!]3~Uo[נ $`z0KfwNk P/tx C^FѶ|ҳVe縇Nw_f*h$)c*VgZ"?o90J2R|t endstream endobj 129 0 obj << /Length1 2103 /Length2 23230 /Length3 0 /Length 24512 /Filter /FlateDecode >> stream xڴxeTK- N}-;R-j 7qpᠥuvv1vw3=ZCN 'I_N)?>KC?5-_K=S+G=@//А_AG;?=6.`2M wO=1=+G{h67wWE =3&/-."H-1xVRX88$@Ra+CAkK02Ε?FVF47tU2u O o1@.&5'xX,쁞F`t? =+c? _ŭ206#Jq> ,\@#ZikQ s%? =KS G P_.1Vˤ Y| DžcP3c ̭6ƿ\hdTTTsV264200\a>N1ņ@&@KceqtYEV_ @+7bJ?>"FZE>kImabc;? =7d(hdwEhhwAf %>l,,?*Z ?#?bA?r?#hi 0:/|rpCo8C®p%R֠{/`gmT15xGǑ?h@mlkwj&:5г,?r uu|?.t,Zp%5x MBӜcJĂNb ey}}H%8| UI-6[+ vpDziҤ}J;(%rՊfZc[Nۻ"&ߑo4K[s ,P\p:p;@ޟТ#zW(ts0$ mzP@# xIfwmq/9 A>c`~&)8N*<"%nC(kט^J$%&/%-җV+&Ra5[җ[BlGO7N[޽V6C6mYKѢW3 :'t-0Daci y3%aAR|rэz@64 N : v:iYzlG[ꪜt peB0Qj[hi/:)?6B}/(y$4b}ihjkPi 5:y,aߠ(Nίi82pm~ϖ k?hdmꗋ hHc 'b?>]skxvrsICaV/02uJAҢJ 2EWoBekjp[8,vzW6y5 Bd,JJܓ z!Tr ;8ۖDOnհd1zȹJ̠3s<萟 .)3`fLJԗn '!BKdW  ډ_Cr( p/Qb 5e^J]~adg4!G |rYK&N&R'9 ݭDy@g\xKqSԲ}*{S'mQG.29ٴ0ώ0,:I5i*ٚ_XJcdJ6R((yn'wKPtǓ/Ɓ3At]ftl•iBd eP֨;%Vfr[!( bu _D1+L]Tم|C[m-ni!>'h@0\*C%LrgM:>?W^p!%HPgLv'+b;˂u74\O 6~Zأi1nx 7)ߝ}vuD8K{i5ѵ$%F62V ٱL()tŒϞ_Ew7,;?QYqp@K̯Xa"J+BFajK4BNh)qI ٯH\g/;.ZsJҵ#HQ' 4 s-S*fG) C[a|cŻ[C`#+i(OG|=^$uf'c~ߩì?ߜT֭$ +3=UM]TܾYy=[FˎhVP.nfU=/S9: &x@)V-~ʖu H<@ ExC.pt  Lqz;%$ly\Kp(ӫQ0l;d=3 Gʎَ0_+MR-ގ. uRk$gY) gv"XPy;y4r>uX}~ʮYWo7DS3'SxՂ!}yFG,}n|Q mKH242b@?R^$L~P?rQx9}+k%f.tL9O#8;~adca@"C^=[ato|#RwqGJv^JC,0X',xjƀ\b&R[*rL5j@L;QGNc7 v}Vض?O=0 Ġl=)OJw p$jHڲQw߼v1A o>:7m+М7#QEEV񥴙 s=ToSu}߮؞_zͭ[iVxdy/#y!DҏZ2xdwu`O².=/`hպQ0-%6F+w$(7# A;s֏oq#E$wѬTmz*Ads >. _Mz_K:Ƹ8mBS E 1j$@{Vs1u,ÃS R >N6bs@q{X' umZ]`v7t˧lsUmt_zjO:圦Ʌ/BP J8Þ6~b ( ['l$.?1W>%F$4L6l F/Ypȟ1wގGt3a܁Ƴ7;r|e <7-udymq%樥Yd=4uHoͅՅ#w$b=#e:gJjH-g1}G=[׌cjl C\#N L ~+Ϳي4R{Ŷ˻GS>QBQ"8<.}"ܠ. Bvക.2q,zbiW5#3(]GN,݀'ƐMٰbTZ+ p_&I|];QE,.{cѱeXOuJڋ[rWu@ V$$jY4–E_D2&HF8L,s( HF֯mL b Ypl.`|64[LDLhf10AêdP˚C BT#hUoY6.(fӆaD 8AO!d3%\Ɔ5x?#GnoSVK:ƃ븤x՘M٪)wSM0 zzy>TG͈S<P` 㛲[NYқ?K9}̗қqN$DĞf{hr*~}B.%!vzsi'}㩅h(]!na;7{zzồ dYMӷP->H ]-s6qZSLj= qqQ+R+GlUKO'RعwYIvУW)V:.01R8@LOyb}j:İװ#鐨%NڝDU{!C@e(jg,K+>-RZeBja%ń8Ts I4:?%2_f%ڮVSؕ:MܳЋg޹sz-tf'gU^Rm Eሣ|-Ph˚}s2"JzcMF dܐd{?s[nwK/E䆎/^rS|v?9Lu'@V9y7Sxe@ebd^jF +=WHYoJD9<4 !rlH{uoA%ëM~Kb2lDF۪ѵ$bF;!Pݵpݑ+GHRPx ;B8/rͲ g7c޵d"=Prö9./3r^{ȂSokIٴS]@Ʉ̃ckLMÈ F ->@?f2dGDzt=Ȋ%prVLX dMz~\ F=n mΞDaAyB ֤ {ɅJWfڕO]oZ' P<9sUi+#Z)ЯX7 xb"Ahh9HµhS3#JqaM =+A.EFhK?^Tjb9}z@zd-V/Amؖ+kqWUڏ';QR¬uiwZSXΎܷ=_6Zԋ1~x6B9tr'',a ݵ`״P3?>4l(◢.3K%X7 T>`kZxr$ SNS$NdxDB&5FW(+ZA# d  b wZ#X0v&vMR@ب=Y`N~D 8* }gqtɅQ|8fHlXzHٞ¬-]EtPH3O ƐV7;VµSF'Y-B B?UjAs8OCo9*r6nVڏ0A܅gߵ/-+=TuA73g#Y+ ">tx >,Dz##D%OR%xTf@f0,c$#e)MDh ]+ϣLYwC R[3acjb(G`4Նyd)dXv;Qޅ{Wiǩ{ZNL*Q3c$ ۙo6؝rO$zbxp> */&U1l!gk __\B^fT__m;vF5ˁT%T?7&&^}4oFSOZ閴6܊i 3NI+Y?ucnFn[F%,-)oze[+'mňLy78{QywҀ.2YW Y"M@CDZ1Y IUkLOcY"SP$fBTW&nd3 g5:7Z ZVO.u oVqZ&4q:j!O,we \xK251GCj@kH>PIPÀDs@9(5o}0""vK=8VG<^Vr]ܖu\^{cݍzny훀nԫ`} s'gF~l6lTFFK*`2R. ҈!Q1S1b\}r,c"vwͷSz3/bk^θZ8sz W'37nUN?N7` z8zp@MR-c"ta=Kg$d"V>*i3*̀ϥ ޳)]Gș+zԗ+x5j 自V :yV$ M7?\,qEjoԱBMoJ_ܬ|;lzM IoYBkWi9 O$ џ"bw.16"}o;q0Ƣ_W#D;0? C p Q<Ua]W*be*1-D:7=h 8}Nj&Netӑ>]KToASgfX✰wFԄ%u*PGHOIY-Ŧ[+Eg784U?[o}>XO,R(3Π#NPiYSz:İscU6Rs>*xރO^M +D* b#1 0OeIĔ o#T+x 5N՗H0V"O)k/R+ٖ8 B%O'4u#Zt1qPO]hWÔO36s<i>Rxfz2iTbaz|*d3TS<1njFrN0AD=2|SNBPW~*y6G0eP4s:x裸 }\bϯ_1;YPRYS{U[ՄpfUKZ} 26S_3J nPl50[5&"D( ]UWi?I1#KvW`Bw6[C(+`>Yjc7_έexLј bu!~f{L\m̤e \m'#"B1L"MŸp?9,_i*| LW"Mnot8L}18kbȔfwO]YQSN+ b^u(mHycV"B=*^"n9Gieo> n7tك,R؏rC(k~)~0.rڽoٵHhܝ>;.nG_J™W/γJ *?iF{x#r{p!d卉EMjGے)Wxӗֽbճl;7wrАE`R{d)Se%Jk1.V ߲ANOml@I#iK94^]hI8s^U޴~4|7"dE`{)郢T]>k41xp%4(_K,)ä#J8_YRkTs" HeRc)Q^!R# Q $hO)pxѺyoア#B*Gva}il\yIcw`2 Bcw=]62PdEo1%0k>e#m0Iks|H{#eVzMP.˕i,S aƒUGt.#狩٢1*HaHcQ%фW97{H@ ?|!aQa)AGX3y&放phKYZ"T=-] '~tBgx[Ь` bOaZXO DKlO{\UQC4 ӈ;dɕ;N ,qD$w_ l݇2Ȩ}&hP1y]9j֤-m,#=A4L_0~T~l3ّeTJƌtcXO j b0DT5&ڹ1%Cf&6^[t3߮12E~F|)˘jB &j3b MQ_~9EIjEݒ vDHsx榣r~D{FY!e܇%!)tv#M;7˾+ {h豱!t( m6|Q22=,F Li}б?.3UjOZcbzs߿0"5)cxiee(҈ On/i'e3v6AJ+z=dȚPf9*Mڞ%%%*:N'W0,d&{5Kl ~O"1ƹ^ Yƕ@kHE _7aF>"2h!8JK > ahqqEq\U|<"6"v+f7,<}>'7;K29$xt%){\ܓ NDG/ M)҇Zq=_VbSLRvgHElb @a?A?XxRd%L.YlOedoᎇlBOdPHmZtǮJn0ϓ%*3ĺYq^¢Fza8R2! qǞÀ44ʱZ)u>t{bmg =eB4+{dwVTƱy:sz/HG;^"PN ZV? 5Z7eGU vp0Zra{ R}StSA- BO^6 $]Z6Y r[wX{TTZL_JcX\lG{B4Z[ᣂ9LF}@d+trM2sN=Ep @D2q©ѻaFex{fɃ,aC;AXؘ 7">X?~4”&}C%볜t]]FO<>TfNy%Wy49n ֡sU545}HN#?%;Y"}l>I34Fs@X$;Ռ8P2뤻{;ma3_=S>5,[i)ܳGFtT-S['>&?Q:rPP\%!Sl+?59(BFe!PP nM SrG7=DzW։&j_hܐWl. CxQVW*e:cnBe |CkG-g_7RYSu*;k]^/eøHoйA%m]TlSU M|W[^(*>a @Z}f5=̿™ $:Mr7¥~#N~l߼T H D4H疲/gXbd5K} cDS9KLŦŒPv$l@\kȵ:.I !|8Dm%9d}u(tLw6c'{-x.C86@tРm]TZDtt墪 fU"}B/*?蕎Z`_ݐ\I>$C%b]$z;:3bz4Mɽ0gWY $QW#" >2PyP"ı^z ^`8ެqwmSr;h1`>Xiy5o6?Ǭzwy,5_.mƴ[E_3ȘZיT$VrِᢲFL=aIa;}q43}/,W&W\lpH~W0%f]W "^9.E`BM)w7kv;X )fU7l,GxY^5O]쑎v$o^U|ڥR8s`Fثr[Qh1fd+8f-ɉ>Ȓ)ib~R *EOeCf*mU Uz+CaPiZOlnu"JE! # `k:=^t' dA}h +.(Ly/0nm0Pop7qaOu\kg2+ZTukGkf&P,innEԎĮxƆhh[,*gLq @ʙb*4 `/L;bXm8bR]A|18<#oVXjʷBrrDzՆڲTZΖ6oiLEquiaCwDe]Òt i$K m*3LIe}NNuAd'Y/Ya8Y\a (5ӂrNЙNGBؿ}]N Oft\t] jӭ\{U58XZ+$/ctWsyv9x_|8@nKY/ qvz_ZJu.Rx:AVRFs,eid 2Y8*_%Y5*PӦ? :.&ZJY\_P%ěK(2OK:Z4= ce; (VWwF.ƞzhqlĴ/g嵣#1H?&wj$oxJs;k\5jX'MW! @EE?U Evdo{V KJICs,., +AzpZ' e) 6 %}HKGr G5Qhn>SPhmfΡ96!u3rWU?Xf[#fH9cѐΫW|N+q>FjdQEd-(fl2; h$KcefMTXG5XT*ѕzUWm`sESC|:{Gzu սvvo.N:/,MI0$P.=`X +b\E1bvcZ/?x^>7̟FumE'*2Q>U08Bd ~)dcQB[pCAwl;?Ou Gpl|BNL+̯L1X# B2X.-!AޣЯ9E%(`1jt'?R u#=ըŀ,$\z@ gv4Qbl>5ak޳g|6 AƸ`}ڜGΧ}<:dg]ƞax w'ghŔ1sg3S'*"sW-, g \]xk1Cu^Eỳ(N:~V- &PZϐt&Up@OR(ٝaP`JX~Ί>~d_u)Mѣˈ'h7J"rQИ{nJ(C?r+2y޺ŦkPGv{MI-}8:$NA4;4+cdrZt5Mla/ex6gmXNBn]Ⱥ6+ &H{zwˀt JwF}{9Vi% CWI׺(_z0H'_y.a֘ oh*He-SR'# X:`\NbɛXC9TlCU#3.BܾK4c~-A.we+՞,VB;*GM3UbB豓r7\]ϋ,VzƧ 1,|3!j3 bvڋ8Cc!hzy1n*8ÓE9L~w ]DKSQےH\HgdM21n xT0_r !` z)N|KqY55˛Ao3KJl4KQ^Nt(lcws2iO5Z(ohXƭDLwp"2)ml@, $Mi[Py%Cx[4y=D̛ɥ-UuxB^dB,1SA%rD'2kmC;UF]X%G7%wGK7EŅUbK[vriCh=A%Ɗٿ:,)@3d 'G^Y$ zUG}$x-EQmm(+UR,9K:TAY-?F5;h/yەޑEX'@ŐvUnZTJd)lw?̹FfG)ڋWOk˯+f~kq9V1m켭Х"")Ȱԩ 2g?n{* 컄D7I%Wf &8's0}w?fPZy7ttEc$p[uTJs fbgB2\]"Qmty(/ĝ>`Nn|VQ)  ACeKSq4g9 pMY<_O%WڽNm`'}6 n IF)p[uSלP`~!76kLOC^lVR,t) oQ}c8~R="a?s)i^P)dե,UD8M5>* @mۀ5=tl]=)K"+W RxxҌAWe4̤cC,̯7F-b;}/b,:mƝj$KcS$WrRkF変 /ΖAq Th%\y_Zt%*\A"+{]Qgebm 삄clB :[Es'Ht~1&}F#};@U9N=W’ m=a'cnda;]G5ϡY6$֘TQDʉu eCAB} A[!XMŖNCd/bm; Uo%k~U%>l{AWn쪥]GL nv# ipgcc.~xr'6TmA!FɌ@XͩΗq CƞNJ!O!,g9i ͩjE=:6+Oj"+c- LjBX\9l[XuS̥e#%j6jE|@xL^#k} o(\4LJaA~W' ">RUKFӡ=-( r`_^dl$ҀE k\*+LpARӣ{\)=$Fft; Mhz_-bmLk5c5b~(jEIDEIp`x奸W%jiqkR({폀e0(LsϏ\FL.TtG6vR.Y6둻ps3ܠGyONI׾;Xqzr 9BfU=/&@\Mݟ7 ,kVIet@Skյu~D @`}ZJo BLPL$ZXo&'&*E<<ٌOO˰̾/!'+lG!c&15 >ڼx T $s Zx9MULsM txTrE "?B`A BD O&ҥ-y,UJ+Xc:w]b[d xl!{8・׵%>,xDG75sawP:䟀Ob\@Ea|nMQy„j.:c`c"P&*J߲; nkz/tGox2OI'y1]w#8Ÿo>aCwDe]h"#|GPi>Q; 9 F/0 91O@Hw[@[ 02Ύ 3a%Hn fz&} \vr. &a_NDvTtqw5:3htjsPG|F[Gx\C=N*8WB6ο'jZ39he\˅-Kj@"JQx&v͑oȂJݠ.I|hg|Ñ2ٕ)_H@m gF#',ߟX՜$^jQ .!\F߿MoB0᧮U4U="͟EYYHn{nq2M'_{F]&KKp|K* &v.Z}EIW(mEgl̜L6YALBot=Ic9N L]%b$.77] Ft7Uac4gOP M6%GLTgB[7DxSI4K zY\5Cg%kU#>OMMI8IYQ]=}$v*`x*Ѿ9c4mެj;wܟjN~2ƾ zځ=:rL7ι0oi=)OpurjU-%i?+:x99ȡW)QǎihMpsx!8 3.~y2雤XWv DhBLA x%5H*NƇ=0z?92aT .}P+X5j䬛J`BVbss@p1g*B}zG3 ?4Fޒ9p"rlYN|-|2 R~#RIG|?ոu$ hΥ?|Bk|LP m r3m9.t6`EC4ᦂ72G!3'd=nSQ^NP ɑf.K}{G#يjG]0[[h?3uΌ%kֹàm2iɢ0&I)l3C.W 'Z&$DKq~tڒR" E=Hߓ>kנ$)(W͙~2-RU+U+O`A6z(jw#31C1|wwA9--q_ hIS74¹c=GjD.M%V[6JOPZG&QwǠP{ȤΤЋe*n=#8S}n.)Ч:5Kn|SMv;rkTvx.EIg ͕9\i :{!û -ͬ29vW"?UXM*}2'%ܣJV]I :x#a%R9o)p"̌mQ6 F1LXM51s?ȎelytN}A@,ƴIBPbzB30 [ 5`8胚]:y_~Գ)RBB5~;o#ǥm b9:j_Ti׎<iW9ChV#HCi˾S a6^v=qƤpE3`㻱ދaʯc8̺*b Uӵbc/ TB6({<H7MJj1?HCg4aˡX DD.ӗF endstream endobj 131 0 obj << /Length1 2156 /Length2 22489 /Length3 0 /Length 23781 /Filter /FlateDecode >> stream xڴeT\۶5S8'8wwww-]wwww  }d{j%}h}9WUQ(( 2ʆvLF6.&&V8 a'SC!Д?R,LL\pqS;S  k 4Tp0eP읁FnS;sK;Sa{'Ks T-24wsڙdrnFK `oP1**)ĕUi> +88;aeUq:(T U9@NGtYQAMQf?k0\M-/nSH5stfdtssc0wq2;38Ofd xw21K;9*d,MM$i!G҇obBԴW8?X:+ 5 .lOS489!._B+ӱ1t+fhmsvΖ@U4YژaYeUV<;zYup2XLC*jg"lok|":<\[ٻy_M\U$E'`:Lݍ-kZ?drw8X~y9N.>^t'cX?cU]/uPQi>v Q1%bc#ghkJߒwDWrN6tt75Q[K%/hgnc gfQφ܏be/P[ۙ:;Xr~_?C(- I0Q;c{K;s ;cX^Smb׬) dg0 1 FF'Q߈(7b0J>"8 Hg߈7ooo`47bfhholfo?HY~eAߐ?C֏X{0 Fw0uR?9~Pqj~w*<9 NOaeǽ!@'KwmOрBB^L~l?c\*:>?4nuޘ'*9W`OC*b5cG$wԔ0?^F[79X"m-jDQ`WITp"GA50SvſTNf |f{|;@uD+;M Nyz[s ^l( #6ڰ_pwP )(}"B6s}Hl73SΖ kcu7ғ6Bh\QdPE󂇙 wdΡA53uLFחuƉ-@PX$ (g&[wNH0<{4X(?Ҩ 4t71^x{ |=]cHLAD?He}OܓOyTgm]$.V0F;÷ô5grpp߿"p.~[J4=HcŊ NBic 4g6bH.1ڀԁ @؃̵/\u("Ƙ`iL=a]9۷+ ܱH~^Ynx؊8y2xphNk0]d^JJQHDTݪ_X%s1q\P96\bKsd ^W[71 $崄 ]f^Ǔt /mo_(N7{Ko[>$gFC#j~]HyF Eq^Os 6 -K`#&qP6,ޞL+"0eW wũ=6٤A seƁԜ X𝠱"ڞI`~}@$gW nkAH7fA[q .̭? vltKS@d| ] ߦ*iHF+NXZU] *L}Kc#?E2hUo5H9ʶ Bg5\aG+n;iyJ zMiF?Pe"EӬDD[@]] I8YͮU)Y]mxk5IY R2/ <\ݠcBc%q+'XĖ9D:2 =GV$0<_-ݺٛnkǴb v @K8M* ;sZ{Hx'˂ӂֶZwFjO`6Ӝ^p9TUGD8S"k8FYeR!^!bחڬLF$P;<9n|dQp/qO9m~hFA闏`;XHU]< i%ZZm0RX/ < HnX4>I$]j(A>KJ>=oJN/a_\} /Nf|]kp:%登 V3x|+ TE[KglK{$L&7z(4ISQ!Fz)YRuog^uI" &Z#?62. 7%egXT)sH[bR8_zw?F5J=6xg!Mh}9+wa}16 羓|"Θ=[z<"9/7I S2p+bZBA}ڟ$l54#xS/ψ2OԖ-B/=\e2=x,|a ouR5X p80Aeo5Q6XSy>"扙VzӬ2C^8ՐҔ$@u1IwZ̎6e(C^I]sq_.-^<7RěѮl鉦ga<#˨^k"o?-8:2 kֱxz+`]Rj4]K1rK-Q*;Gzep>b?J[%}L^8]l8 m@j;*-D_ 56]l͜Vwypl=EDD||viq2Z3O!O>duթ+sCʒ3;i@V7JJ1!1DDjF5ٟ;MKc3U4C}F>¬je-:3ӝFDZ+`wbkC[9L{ gsN"UEA|n/c4Mhw) W`K;GLހqExqΞm˲a:H]hHLuGͮMW`v'&Ǝ5fd玒,В\7`{bC+ՙ=}w-6%q^"S$_S /i>_ϛɮBGQj$:q\%h=(=זE쟼)qGqz*!hCKFoh]C/dեp ԧ68Ȃ>RYJvߥ@FfӴ$vtzQjKs92 ȑ'=6 g!>Ow:T$Θ׼/i1PV@2{]Uɔ{Ao.-p%lh Y_Ee"]jcY+Y M"ьɄ*ߕ }*ś0 fØal40-f49J?UisA/ {M|Dvr-;t̍^3;lגWMȴxjz>pǘ@& !wqqT!eYt:G9bbxr߿Zjow@Q{h K]y2gc̏uUs.!@=A]|UF3b `Kq(/l< w@]1}t~~ Kʍi.V Ԑ~`Bؿ%C#G?XV26!.N›H^+7dub S>c'ц;12@oF׵>%:;;W jR:IsaQ~9]YDA\>C<"wS%'<>>jќ?LRi)4m}ս{W WB99`w2hT$[bv,>5p"xCkJOcU~v%BZL{jE: ٽǩ|8LGPr6 %9Uc8uSefUO3/:Kj3¹O.Ռ9Ri]qy+~_~DdG;QeqPiAJjPi%/=S? dT]gﹾFz &(?図eLъ gLc/73uK>..Ӌ#i#t@ckQʐ.E)6F_+#cJϑpLpj*k YR@i5il 0N59EAg\Q?Ak8!ziT8.Usi=W+`DDS#dO|m38FY[ >b}P;K-knhlN0Px#3hpNICFGiYPBk׾'AGE㧠* irgr頜'˗\UzKW>74Wkۻ+b-C涋2TD ] ,VÊW)1CLngJYty E8iQL 8 i\cgfzIVJ)ʚ)le0ڣo"5m\߫4Ń;@ؗ_tۜ$3 Ц{$#~* W^-P qo^0Vy<ir)%U '0AwIs1.B{_ШH?X 5/<sr̈́-55߷ hH!\,x(>DŽ*kϭ> 17H:^2#:Ď}*QNk@@]{݊8À 'yǭ&T*EkvADѶ1I; kؕM8vfR4F.t[g9p"ܮ+7#%X hR羨~fX,s@HT|}-%H675E.=pTsM˓RT NT0V*ލ)ӧ{o@Yyc]gT>,2`ReuS|$CܨKjhǜs"n֢nSݟ(`S/t=Fx BdkZ ~kbB.M@VEw{II1F2 {TOIu :2o7A}0Ujq?*NBZr_jEwqPNjUG[^h6ϡݺiͰOdg%sLF'NV(rOk4FʞqRi AD?sM "_Pz0[7|*df"cM ԳsKwl{=ur۟~Nf@y[ˉJA&{t$z^<`{T6hE k=S6؅i]\i gѲ@Gk%^=[L-oW nt 11~QI)ͷg/;YHcNnuU9q 0CSqt),!D˳Ւ&[rr.V"YLkd[Cq2?[OoUz'pHܫꆛU)& ]GCU([~=y6IbԐXȯ9$utڑb^ǘeyUB:o#SxE5U#GnDj3z}Ѐ벵:j},KrC:N&_ i%Am5`sW`X`2{B諟t0Q*.bkzͤ'59ZZتiߟy׿c? U(Ř (ROo9yǻS]s3=t2(H||r_hp̂ G^z)MIyCmUZap~}M<~(a}}.NqiM$T yCO)O\ l",ӎ|^/w('srYE3B+Xe-5Bm$04j5bݻuk n~Xj #,2%jYP:HWQ.8/g7-w@bw:j~ >0B1%㬯S5qiPcO2"Y o#5 ,]32oHݻ؀՟7~V ^ @RS.4SX.ØANt^=~ti4)=HձK@*^ț@Ъ~?F0?eu譸YZ{nM˼ H_ʰ*cDŽ^:V= %df%'q˝#|'Qӯ I.`u뒂>ȳzύ'tR"xeVrNŲi4;7NAؓ%;53`YWhO\5\XT1pBZe W'Lz?_o"*hͰ^niB: s;6o7$:₌h>7% 8txl˅ALP=|3KȢ~UTu zS}IH|v*ïvnh^5 b~YvpiF9um*FNR:s}t}FoW5C;2t~u& 3LPNYb'Bb5JߛH,Kත(?1UT@7XKL6T]r^ zǝq Cvs4z:VsEAPVLPAҡAٳu ;%r'd()5mKMRr˸*~)RRc2ecH`^ ܠ&c7&o@oA&ѕ}τזo4GOڴyK-xa҄P.tlQ)kȨYL|FṉZ>l])ꆉCy#|Faô H VR^6Gs"聺11룟.=^fI]nC\T^ aA{,#e:6`֋D7ϓi$o,H{t iI7,b ͡~2t$UˏH j*(t`C j-3$z玬ٙxUk q0OCRr9SAi:F&% htEV@S%Koᐿ{ڐ/V.J7FQ*+r_uy|""مd>$0/^ؙ<왺,Y;(:rIo}o0. A03 ^NyT ]s UkZ_e-h>Sp a“i<6$ UCFޖkZ2nVM]fI]vo fz7-%ٮ&Di*@ವ iۂuceS[9t']gkƜ-&Jի71/H6MGO^m6Us]9"~ѣQaiAUiGEҒ'Pz;'6Gy8Zq6lHuOuM'0ՈvmTPψP=،`K/_LJV>P͂h~grɵG)SAE2$4u ݿsH[!zmo>*+H-0t5C~[ZBA1NWAt寕[$y-~ ,7apw`חJ`|aVnη ۜe*ٻڇn5'\!:&7 w3/6~,8y"ʑ`,bvU#G_Rz;ooRym}1Na&Kq[b${w[|ck> a< AE r Mt =WM2XWs{A {;@dfF?-E" 4K2m.spݡġ_]e qR%Kd;fjV*LK_-~JR{lI qm!># CYs^I;sE)ϭ!m}_P^>_*z;Bh.| Y3SҘ%MWiuۮ8e/Vv'7cjvcYf>#n!ue<ˬ!?!qaS%o"xN-gD( F^lRh` w"2כ\s0Tk=߿躶TD,[S,J`;`q5eQޭ_(@kǎ|,(&vS뙳Ħt{l_cՇdKO\WVk2VhU{M/9Z<4ˌHXR/r%+^Mn7*d ;y}~۠x<Ϯ]"GA O9TA J#a0(zYv42?uLD@% % H&TiBnv^OeҐ`?`_?@96|MBxҌÀqnK+~$fׂOSRYhigЙ5ķ)aaI69d[`@CN'sQw>64:i\Kq=3[VJVTgn@r9Neg4ۑ֌IL90)4qVր&J<\iPM/-ywPxe Ήm{}<}փ!('+unAڃ/np`x%IzE ׎0}w2ov>s@'! sV8Mys7 d^d-DBWR@0ס[O^2=K m/3`/OQZ#B8%!do/r=peQel1[B}75okgyr̹4 `Т9P%A4Tz*$TKb[ZPiE!Zes8DG޲/Rހ8Zxqyx[(Iƶ̰!q1UU+I6,,o$E?&k@ JxEa^BW*wQ5{GFZbmX)+pwyqFSl75F@֨=9 uyQ]QAӸN4nU{ХCpY`"sޤP_g9d rY>32ɋU_] w:Ƽd%'Æp:pE#xZę,"`sN̕v}I(qt+2/gϘLtCFW1M*Uc^+;d=/KgvgEfNˏU-tCH(T6K4#u OT4+6AnIFW ͒PP*EdM+-~u.%3[MԹ#KŹ'pA̕0a%MuRR8΄~b řcE@Ia%9]K,l܆S/J 9!_&޼ݔXT!td4}o^Be"؜8MģED} %;Bitxs_ UYdW(r\szJʆO}I'Ʉ!,o,& 0Fgw}1YomF S.;, v {<vfZCj(]`\a:sްxzJ~鹮T஌B  eg73Xa(8Bз`oh ut~/= {VÉJv%=:Zs͏O@}՟~(~n}d\T'%8 RtpKJ?lNx#4hA7#rΐ^oE<5"Vi>9_(.ˠI¤x-<XImgrY])N_EG"K]X4(,aIe>Red+|$3W$ð`ov5tK̔/-VtCǰ #L>:`# *2)+R侵1b(xWb7W $g6S٩'= ~p?Ь~SAUv߆ߗqP=,KypK@pR^#ڒ <}S똈s0s!&ƺŠ8jA!@dbAFk1BLODJ5V<qUnwe?୫)+e9n*xw?te.F5BmF\nG!] F=٤[A " znɧ`DXtcM ~N!4az4K:אkG0OuSR"cF<2 Apn탟WLbCaIn0q 4}=#?0'DEUȳ^VIE eS`,"+HѸ(S" MOx,|7(!yBL0 Jcu[@z$#I:}d6jrYn}t=) B:Nggu{нKhR"&Ls{rUY,SZnH3FC'.9\J:b`EXkH)²*"w4:Η;O8o#;Z ~c3JW覥BCn<0f΄s!"$ϷgAx\^`z[ 8 &+s7eE:5eѮݑMFOle),fM(yv"8Ou[omZD!1<)A-p  hT p}Sfg9Qo X#^GZF9D(3sּ=ó!R^NDB7ŭlgq% Cpӽdl~^2 Q4Y暧>D*aT9oYlH;UhV;Na֏NL#^xoЌI|`w_~a%h*^*bbI dQ_L`U7b;?&b)\QY\Q4=^S li g'S^:K.*\fmP>I"cĒ%/<Ŏ z,BM°PRZjr!e]ǂ0Qɫ i'syj!-g9zX_1\38"Fs1}O^hf7ƍEW :jym(u,ÞPʎGVHmTIKy.D̵d83ڽB#^-[-m{<3Z\M' Ke-)BRVltҵy %pڦW\P5q*|o',&|,~zE2 倩!Exe-DT Vo)ڎc>uWϯTXjҵ*hAcN74LP/"([dFPKUz,~" /S~SV'4f!\߽lGZr{uqsɗ҅s<[wAüW3q=&ԭ>ftfkQ2Ƶ5]tC5S5.l Zu87ܪ]-ޣ z\A, gxv^t?Uy1xn1V'>:H0,G:^4R =dp*j5MI[?M}T[u *w韠ڱ$Sh-4=DutTpίU=8(9[5{l)2O=3{M㚳Xs !\CTʱo硨Aڳ4U yŚw;}>%^k+2nW\# $  ,TnBh=  霑רf'0Dޕj@*Mݕ 4KaTjNDaDNS5KZl\^l=#{mQe|K͗oDL3r,4&Hx."1T 3:ܝr`'{Jٝ{sH<ޒ[A3C;ZŖ9,7ˬի90`8{ur'Z'<-U²;ٶm۶mZs}w/ 3J5bLikjOjV(ٗ?x}2.NRiRjڝBB0jd+)'9C&XgܱU?d2?yLWF]rtdLޠΈܜTͭ- 97O>B mhI aױ3}z@Nځkr@N /Zb)f h,ʘ\*O*8\-G,9O ;>x(hnK[ut,=/?,/183:ˣFXo^,M1(b?V#CZu=]$Kk'gv M7#MqX{Sw8G*T Fp&2tCM[#Ay 4W*.J< W5Lt&7/b|BSķ Cv=gjT⤋KLR8R dwpzwu ZjiLG0Q'84ke:M~#_ϬJe?L,#v@2nÈtK>!#6%>eB{~+mǝ. ) }(XpcYbjoJPlL( K3HV,% //BMN{%C j1jJ˜dLc`' ` @E9nrw ׇ«QEj{^Zz4c{`SA*܈JX%_4RLa:EJ 0U@}QA/(ikЏdƷR^lV:y5Rsr}W+ ,5<%.Pȳ NI@n4&ZdT#F 7G\>Q,. Gq>Nj#ܿ;ZHlAP%/A|h$@ߞy<9~^ڔw'ŌkΧ4Vk!Vbve]J#Y!Zı kuY]A~ǶR(/.SacE ~x--cL5Q(F8>ڰR1=$&A)O#~J<%|.Sr'7 IЀi?^d'SifKhdlyV*H/7(ZYF߬p>S* \Ai&9t&Yl0>޳t,⌋ m=;]|-C/RT <JIu!qC9.feȦ; Q'B=whPX*-A*0Mho|ttlg:Yq?;RxCNW0gtxO)[.4Rߔi\e4W(f_ijx|FGj}<(C*\)xtJ CҥQwWF¯SW,QNYEgA<>FxO9.P{;6XB]b(Qgl,⾙^6OdŌJ D>8WᄉgG$v>g,iI½~I` D-lI4{ E?[K^EMHίW%  A Ypj9]-]߬#v9To௖=e>׫T MI<`|~sV^WMZ`n2WJE3ѓ:5"zhs_Knƴ!2wJAEEnJ[mlo@wqa ׏dƇXe%Aڗ%Sj8ۧĽM`Bj?Wz,ՀcV'<3CP/S=s. \!Z+Vհ밠LljFh);QBv.ӷ":b >?,+wӦxlhҖK3$cy{x i-7?kM <5!J^uS\ԱN̄ZJwwqwAe6N4$}L7.މ[=$Z*4:8L nBЅ٫Lܢf}_U>6 ewr]\w^,[}~a|R A]RA s:@@.&ƽwXvZu{An_q!\Z)GH}}l6N^5GeKCB^ˢI U bѢLƪ_Ǽp%]Y?eW=?%m;A(LîBRxFy/gLʢ+a }" ||SJd Cu,j-d8R{WJ[\|vgOo)͒ufT6R]EH8&B^eHRfwE˃- D&}-Os6>?$MpP`)v2qcۊRhvu?hhyNicƎKGȊ!'`-JqHd v0uޥoj+S ,h:FӺ#3<ϫՊ~Z!N3ܷZ9bޡ:/>zP_+!OP#(F9fttR;-s" kȯ N3 2vPȐba-Glk^a}š!DM'>" bJ?3,~៮ ?xG\ q*}rTw9xMCKs T/`Y,jwK"uӇH9am^  lozyfӰ)sZAWTJHyqmAƇ dc"^IMB*_[ 躄fO~W-Ⱥ[邡\jژ.B Zy6%,p=k0݂:R6@Z6uE 4CTƔļ5>;vÊwT>ÇgA\;u6GfO:j[̞sJ߿{0 ,!DKdL) ; (wLqߡv H4d" \v`)̮흕iLwQqqЊwFH-%@Ə5]%!}EJ.\%)Z(:pRHԘM *[S{G|ҝ\Q99μ l2oʳS]50+MHb[ e.v~6/Qt B):wxwY QAj4h Bb:axi>-Qj %Psw*'_|,\Ȟ*zn<:q^T&կځJEV?@\ٰ/v1}[9qFkZxG&Z۔|K5,V檜@^k]?ֶV:+oeqS48-_(pIVB{ơ *'Yץ.H.Kf']? (CQY(I? y/xX-B%Yn&DgJ %Vn xLs39QѾm2PsJfq@㭫gQHrEv ^Y7it&^v-G?2y;W4&++~QAFIj xl'HN썔v ox~}SA&X5T͟=Ӟ8k䶁Xo%.&_nu)h_BƎ߳1̣_(CfK@y,xӞhKL73/4Qh,A;*LDNC)ợRS8+^4^?)goSvC"UD??94`Kp݈aT"U' yoGBʚwUu+9g`]*ˆ|ekEH)i9? (.uoOU/JS#7R ̼o GzM cm+L*f^ldGю=EUC@>I͊)4yP>/ E]' )E_Z7P@7SeaޯW[),TdJ g\rZ[V~k+ (Xƞj%Ci 7Jc3/A#Ҁܒx%#Ɍpݚ8-/2&Sӑh76P%+6,t$(Auc=ֶ(Y";3Ѵu(!}mXY57\\b1Y ʳÕ224djf+g&`7L!7c49*ww.(hm$er>ӹf}VDa^U#$Oj ؐOSjrcPse8>4-lE}Ht)@FA`2r{%"9špXE&`RIіZK_~q0MF[o! 7~rԢz ]òm,͢EX%ПWX)b ͦxMj".:VIY1EZ [>d {9œhFhW8Qd΄#^>nygCFA 졋/H\EŏGX=O?gnRz-oP_#Xy g~n @}Ub7fNAC5pi -2[4 gB](:ť0泽E:`Œ*Rny Δ"W:n(!7LePƬ|M2Hftoxm!a%+$TM?u+2TU @M~]f 6N ID4#;l5l DLMߜ,˼may&)/w&8w KBAO?ǽhK|sHZ8mTrЮ|eZzML5*%[U%P@-Mi+fl'X}Ewvаjbd<ȥM&sG+uwMb_Vj&y [M 64<ɔ(z l] Y;ue5_ߨTɤ!ߗ>D5CcDCK zq`'?ՃQ΍å iED1wFƠk vXCŮ*GzQBo#߽͵Q7{AP5Ƙ#ہz!|ƓI0j_9-)–&X㳳aBcB)9N0 K*eތ=Z>;f |&Xj> O|DHuit" g&O0};T`h$Nq,ok[٤H9~ֿkŠee8=@hӉi5HdRc9GjڡD,$ɢ +v̯JƘ~ga<#YrBш3ʐGUD_.Ab*ӯg W2'21OuF=bzH`> stream xڴuT߶.]ܡš(Zܵ[å}=3}=kΕ"SUg3w4J;:21M\ؙTL݀vfVVN** Aq~쬬|T4z&^N@6?@ŕC tv}H8:y-\`b鯷83@``gVb(;z|ShKdT4U?999 u MFTtߒ𯻒gU)6k܁ i6SڇZ+WW'~fK7WfG%?iXY<A+h7:] wSf@_'i)?p>p_ 2qWQUU`ob t0q00t5qus#xiU  ͡*Mߥ;~L?w߸6stpvquWD z{fLILYNZJ]I?q`vto<1IE~/+7ѤRU O'WG׶>/nN,ere!B% :fV,-l489:,L\~ ; r#6G ?,|TߪjcJ@ eG׏g#=?)O;{k;e*;MCg"m 4Wv5˹|/߁܏GS:]\DG-..-t?fRfv.n d \\6z+fGw?x,&EB|X,\l ~r7 `oF0տG?? YVw9?>GDdl3_ g [\ӇA''p/_kV7{@Oʢ@MjShTt4Y|9P1yn*C+ ^8T~4XiS]xu{G(Rulc(}Nj!@Nɞ f%ZKF.^C)b*רJUn Ӛ1)ɈB}.̯`/GiA4})n:}9e^=e,&S'Ygb+5K n7*p&+`-I*z*f ސmf{b{CHx.ӍracKc[ .V#@:zF$6L.3)x |GDcI7d1VM^E~).n3uNgzMWHK܅-q8@doIYC@]R5|vZ)O']TZV򙺟 Jvs3,6-]WFUiSHP:e蓟XE!6ɗigv,w=Ё,h1ʷ:/Zڮ<|]dAGZ#>EhPVsc4HI/DhB*77w&_I`))8$ WcM|Ұ{m.Crx9fofM]k &H6r6z6$b h,lka* nB\@S‰zQTQBW'M57FlzBFƒ)uyMS9_V~}|A[~^jW$_P( ڜYxuo;[\qg8~pbinYj)o½р]9@\r"acJBѮh}ayb(hć){EGtNl3P$VuVe.nag4'9BlV@j9vwOɷld<0Fl m~j,$䕿p㯔|Ʊ,jh=_>w&./wLtQ%5Ζq?|\|M[ҕ6c)͘W?ZѳQ79W=Ά{>FD:j(4L @ A[aerj|5E q8>|/}rٺV+] {c|Ǧb|o\7ө'VY5.o' tLx08:lIl%_KW$ 8Ą90lj[ qW5i듆\u+c2P(ѿտJq֟tfRZ?[2df."Vwm nZ$0UX.R]DugYt e5Ğ5-r0%*DއʻkI-<|oiQqbշڑZ|f'D3|([TL:Ͽ\ /'=/~{UqEZjGLe* 1IwHSlT6)lض; F "nE 񞯍 *csXdčdCJg;14fHOx!D%=UV2W tĬ筜yl͹trP?u/-f*>p+-3O|~C,?!:]q5-hY5sy#ʃb& Ll*1AdZRȑ|} ,̎it {}Kn℥P SVɶ*/Rʯ/#(>V ?=Yz"PQ2uU ,U3]yo4FR2ܲ;5Y ʹiX4O"!9^ĜF3GU,`󩪨+jSE w]_rGݝV)EZ9<.qs6ӌ(c$՗O{s8-Ǜ˝e9˂}Эfo,$S_rN1T4~8TBq'#]. %>>77ss b0F@TcA/NEi _e ZЂ0 0BTzm )X3OJÞU?'4$̇ep{!?`5/7y KO#(#Sw,DE%Kz;4.Qb#EĒS58&'K-AC7)L̺X3rcG2KWk{SN 3Ё9, +Jui܉aJZo2ȵW01m1j!ꞔ()9B 9TAn.K8BARє3T*],L;fBy E,6Q3dȌ6EԜ +.˂h="ŇJ͘c-d I?S؅H.~<M.3@kiQrDxUeD;4b]-KUYF`=M|J VwY\= nj@QvMjpz>j_4}_Jh𷞗.N$RR+o Xɡ+iB^q|C\QVs5ƃ(|@q3DQؠ9x-O{ rZ+'.<+B4\EjQ+_vDf+@uDΡmǙQ$ DByQlkbe& د,?sHJ4Pg]hZESu$c2UE͜'?L R,ȝ(,c8[@.'b_KS[u, H9$KҦI!*8Z?NЀ@SX}/ :}*m.']ST ~WυPKpxîzӃhoE"kG LL-SQ ӂRqoRwf/)84A*P3]ʛ4-:DFy:K*e''Q5'?pCe&Q]R5'>䐸*"$!ʫ2C܆c³LQ<|ĒZdP;gp &*Lf&w PM'F)D6:LD-!Ӓw1l 0}B0!/ps\yl! o)@L|[Yֹ j7`TBI.!Qu+sUtFC(~,jc\"wŁeŎ$e!T]H"2 6BT9~ ea1(ʹyOxW@T.)֌|e>љmf7mZ6ܟSlӠ4n+4dwVd"y9 PZ|$V5y_2!IvL'b?+l#+Bjfu OEZnzވ XFѣXOC?j~VVYX$&, Kxs`4;!&(n3TcleQH,`Jۿ/7`#=BgYW]ku[sNPYo^l'kK]u9%U6m~ yi?vF؂<,i.*CU_ڨT3 6BhsM1&Ѐ@=>YeF[CaIbƧCE41竂lc\E)V9f̼7ZTZ~}MuⓧM 'EECWP-|HeģhkOʯ69ٜM°j mÄ 8OS{jć} _y}k4lv3oMMR~3ѡ$^7fܧʏF2mMß%ԸzDie[fzmǮKgudJ@-xF#s"[hfJ82d,˼I*a{dׄ@kI=1Ԝ7+]eUapEŸwQZq`Õ36ޞd)3/:8?j"P}%tԭ}EA)՗,HzTl|)5 Ai=Y]Eñ@oT^euԦpT[TB K,bbk Aq^E3UKԵDaW.8 Jkvf*>Q^rNe=Nj-spbpdO-Z55E싽> !fe:S_e~+=:DLeډ~5/1V7@:at̻gGJ$Tjc9_3 {Q.*˺!'F1E;VL}Xf&.P5NjC.Gwh|}S=W_R9bQ'f Ogc|)}ܐ0c$ڋF4Tw4Q:jV;e|| s>}XOvŮӌǠ' пzԄhpYfV`d>Y0l |\EJ@®VhA.ф-aMFS8KA7#c@[шо|يuu GkéoKC{?ަ&=_.m <4HG[ݙ>L1M|J$k08. .w Y-Ļfw .T5W|$Ot"nf>/ 8Zm?~fVD{iC7yo!  \22y#-bfp CY$U?_7qoYƙQmH"HeDJ U0/*Dڶ;E1&?]|Us hBtQ7jAUT wO/ օYҘQے-vɪ&Sam  Jì``0O3xŮE;iӍ)fn霟pAXC(~'kWضIYt5^(K %N?ݐ]gNX"גhhF"MFL$-xz9dapU=WuvRHNnǢSpsܫ%В>9K߁`媋P3+Ŋp½98m`N[u%zY(?($A!\oo{O8AZ"J$v% mdkrS=4}֊~r|;p4Svgg}#|X:E?KY6I$j(q*73-c!T*`6aO5QS%bi!ڙW3xʏTZAW[{Hꂱ/@=AAm^xD{CwpF-lG5uP5ǹ1t^C-X~-Τ2:@}GCf#D]a0kж`Sms0\g;L-77FTx;cprp`m4_yHЎrWTq ײkm{őN>ơ&fvG- 4ݥ TKV^5+!?]j8lI|ZAF s4$h۩=9<1&`;CQ5{ Za)]0=KG`S "kX髹RZLj>,QI՛Ybf&>Vt7a=52DP4$ď8/X5iT"lsN o.D*[6H` 7 6eKva.S]Bq]2{kFzE [ka-b[u57&6I߭)vDiԑmF9~& v<33d8eeB]V" Uqtbx>f-uKf%+K~Lg;+wL]\'rv T狨]-4Ѳt8ln.ߣ$St>\[VnTD(sw]gMi)o 2̒z` "JxOJFZ }zh!!QT 3bRB;ټIsN$z7]b2.08^ct[RMkCTj"Oz❦Sg-7Jyz +f": ]jY`iz@O#MMԸC4rEyN@@iR1fk?0YU:q=5}>kSa+jcWE!Erm˓ H K!Q(#8&q:eMB[dHzp{WUcTP$Z-~Ņ4[L{o7j{F!tNzތ Ib@BL@ă=ي]-("|6ׂzI2ܥOⴅF[ŋ5G& ,=,ov 0o#Tޏ%%µRG*hը9mt(wϦ grH6s& r9R{YfEټlc\o.qWvQȘY.BSjW2E]WNu_$":T>Ee#4O3 A]$Zl/%6=o;-IeBch-^|+lA=X.*"}RRI6cLX%!,іgH:.hSm~5v|*D=cc8$O'&*Ļ2kNo&fR(T,=+q]6bH5Atg8)Imf'0%WWP/;'R`Ʈ4K >:Na%c톾{GӬef¡I)J7b5PN1zUαWFH?Nm~gU%ٱJ~,OԐB+٨gNhobPbyR[dx \t Ɯ{\q"|94>W:Z`;}m9 LʂO^&CXQI,}I .< {Q(6' /£Ʀw+Bĉg߲aNsՇMB:zDoJ#/⃖ V6L6ٟBMBeJ,h rn ڕH8T#V9l(1˓&1 7QHW^ `]S f`a+!"`S֜k q+8y~l^2Ǯg-|PƦ&OjZ *N5wUz[I,Hw`B2|q9.ST– ݡ r,W{wx6o|EBuxRN&?\ٿʳB5Fqլ wSrϒL W/Q5QY_(rXPcvI W$@@<th<+Wu2T2(C/.:׆u" /@^9IYB5lؔvCrt񯕤 Y GpBDCɵbXF,ݙ̜Y pR)T:a^ bB=Љ鳫D]TKp\!]_eh': `(H=.+v; ߾9j띵I@a$5?8C+Bbss1mC3#vQ1̃ˠSmneW|PT ̰~.&Ua)cNy V,V4hqDw`wmݠqF*9bKը07nş.EppzA5: *Owubg@@6vSak4qAfZ ]-b1<t_#; Czm0d-tn]"EC.x|kp`f^ $DN/kpƒ7N"|ʃl3 ۑb~CECشn\R+bJHП_GbZL]oc\SddO fEGdk+cI~:ebF,4 b31>ǖ|>Rpo!_Z"W!S'b/g2/)K{ ޣI 5M3V_;ǩ$# ,w߉ZZ9~$ySF>QgR kx B!@xu|GrtA|^MDxZ;۲8d=O>VfaԇpuEgxE2.O}X+lfb`Pt93~ɚ~p aWyPQdbhge$^xV<$6w~qgp: >4zՉ\7;%aI\NwV.8جP>G~VL2r7ҩrVK+{CB 2p"Je^d5|)V_wӤ0pj:E`'`{eL~\RGðH a@Y8iV~gQ3jO:QEr.8T)%U*sݱj|v/B׍$Jbz stD.Jw%l\~`@ 0"qɦcJ̳.TxZG;l; |OnDAuM=o:>E.ɒbĢtKro2Vяdm2m'X[߅|DrQ̜L>,"A21 UN)fnszkwwWS:|/XY9318t6:lD~'p/ %^m$4-^ f9'J LT e>v]@h9Chk=D048$qhmФ"ΉHCryu(f < b2]tgK8CKxONyz○<1Y S.͠V)pʅblQ4AK /sⓣ" }f6Y3JOjQYv:%h5mB->O$ljR-{d}{7س㌪mD&+!6`#sY]᮶Q[RJR|e`ظ_ ,>Џ:CzOJ #fA3ZeUNItWן=#_VޖȽBN2ڛ)*0k Y6Gþg [bk?P82k;3^-a)UcERִf]VA1T5nNSd~ clg>eD,hL4&eY Fh@Q-MφtflKz{* IjzW[$}O0lhUʩ *2 %V0TOӔ!|Vpm%b&A 34)& z9~zL9ש֭V%<`!TpU >3k&F)%NXD"<.- !JyX™!57L2@otYI1<(eZ {uH1Vy _Q4IE?8$_sܘ•ø+k TrX$u㘜;jk0Ϊm>S2*ɀNmгQ-Tfc,)d"ˤo]CCEKJ`@Gj @ZR=˳`B ԏ0f1bewyu4ZcERִf]VA1Tumer{g=kg5dIVB]XTz Or E]:i~S8i7uЧ5h,W\\.F5*r& j(j)BL5K`]V'ym Qv L^C}GUdlyB/$a Jjj)GD<,hݠ'PBhlx9< LTb(bPKF` qnZ}}o_Ce5C+!P7a>Ǎ־6XWLi-'Ա(MH] I GF=tG.o; yO֋s_kKUO ~tIɂ+lIJ G~eY*>#?osh"}Z Ȭ,ݓG iǞu";  MWj T;jl&nxbd)PC}H ^ hPt+= k :1Rp :ϐcb:uR-K-g).YLsUĴ*Y08Bh@ ~gN)I~WbJo/nKz/#TݖFfH+>)m™.&,~[^bOkg%]'5c.anG-_<ԛcm\؉N<6̇#G<.>DrnԬ[{g~cQ R]ᕖ wP)eſM Jө#-B*{t/s,9hTyOrBrH:.VmU8릃4+0l6E$2mض2sֹ/gl)8ޯa]D~u+dVHɼ,YiP[G2/؁+y7d8̿7GӢG+.=*:Gݍ[J&U, ͸ ۫+|BxT|H؉É^MKmPWhz 4E JTȾ~dPp;+73%/ܣ#4v;ᏭȟyNtXՊjT瓘( 01ٱX&myÞ!&.#';ԃB622e|7 D0?fj:?::ȂPF]:<r@oG^]?fвiZ'CHwbU6P쌒g_f*?jF.%s5(] ;{P15)bt]al;TYC8LfaӟiɿDJGk掃Я(;ZZ"Td_8uخ>RO 7e]}~ha7[ G)L362< e-9FTZ6৙~萌u $' 7c'_c}~aWԧ 1:;@ƑqvΒ' /C֋d5 6-Bγ ] u/ Ι]N #hFqCdV%Y魉r8P{0Nz#Z5>md~ߩ/6nΟ\V q5lcA` t ?Of0gz=sl̛'_>7.+S 6gbS6pOc"AbDcxSz?7H?&wj$kTH ߞ>l-\,;WZ#|7:X׻ѽ?B);}Y^鱅YP)jGri>ȦW P}nIx>XӕKsvFK9l'a7BnjchdD,*ی{ʣ >Qg}=5z$9-a ?baL#@Qsf-Ɓ-ظyls$ d>W{ 6k"M2"+L1[\QL+J*Xee5"DyBdU֎@%.h~b=8w ]МrP;<%P`t`bl2Uz%Cuq1Dd]N7$K3Q[Ka }Ui^2s$5@HH_Qn}̗-a{؉h(T7!%rQiBRA[$zsZ6T/ezN3/LWWF3VbДH hC&y9ļppeVb/3.>~$/=0%} l4YS9\^7aY bJMgaz5(|n(18O u.U5?2li\_./i"lk/"FuOqP y`[E^:7/6%$@2УPj~_ϳ^S򥍚;+m,1ITXzs9j^`{x+U-T-OC<ċ4[ٵ[]57L$η^FPrTd`w||^u0}X٥\X83T-<6r *`geRƵ&IK`9IBo hGn".AJl%Kic3t&4_AVђ< 蘵XI޿~,e \=EHR! ,sM+ :X>Y3|6i%7SUpVچ"nWJJ@,â (_ZXgI2g=*?Œb >@|Fȓs ւ">(Jr@|Ys&ɺ WLykm-〩.s.|rO21x\b?6 endstream endobj 135 0 obj << /Length1 1816 /Length2 18475 /Length3 0 /Length 19642 /Filter /FlateDecode >> stream xڴuT߶. ww P')^nsg7279WޑTYQ(iradeb+YLl]6&xJJ1'=Hv(|:XXx)R@Ci0(]< i?\<,,]`gd鯷(@ ` 22)0?V{hilk7_TR_ԕUi>:8;W-bjR qE5 P U ߂𯻂+5Xn@'gi6Sڇ? 4..|L.LNLԧfi pw|\q}b W2$C oL_yeey2~:}Td&fogQ3_ĭ>xrwddV 3̛:0dC?2 t=L-[Y?hvw:}́xogc7 YfV.1,Dx%U4 *ǔكl=f@sxfE{g#?)O;c;+[e(;Yhlbj/b%q1}-/߁܏`dOGSڀ.T" `VQV3 0vr2gh6NN7GW=3 0wf㿢!^A,fAvſANտA@V3G( r ~Dv7Q@PM#i`,85>>GDC壕Y?~P7# w_?c) h `obOh[PK6r9kW< (TMUl//ͧ*բ }hN1S5S#@`RVX ( =+.nIl!u>ƲM]長@̱6b:٢{,,M?b,aB;twk`dmNP) M+ V\Y~&80@- =zE~WLx6V!Qʎ4`&k<0!%Ü翯.GUNk44Ǿ|Ü&w#ѱy=Z˕*a~&Vڸ vAmlэ_/zJ!M8g( KTƮn5y"xD\s ) r/}.!o K3Skh$ ٖixڀ>+=F=UZ+$)lpS`Fv#e-\{h}S:̕?f{l9_|ךu 4ei_3 ?1͜[1`RRRd%Q-VQ鄃V1bj pm f *3N P'uT{NsԊ@l#-]8jo!V̲4| ] 1(S5DL7Jwtt K\5(|=^#1s丷=\gi89FNKv@鈽=ѐ'B3?VX!~ۊsh& *M Nsp "c;Wwuap":*:1גN">{5DG5O4O"vG2Xatd\o-:;#Xv-VOܣ$c&]̞OO*sTCyr*g3sJ>4qiD.(@ ~5_]s(Wb\gҪ0,|uyS" βFm7 ǞDgkE^lxz{].WɠV-xw;RݪhCt77(*qN3 +a|O:jKnWl6@^R 1(FOCٕ "=١*DzEaL}9)&!7NnlZ[TK9Ôy>Mݑ[DDmT<\|%KcA\k =E렡pld3SWqFSbc|pᒬEWU֢{_O|!5IPgzz@˚lM w[=EB{))L~wk \gF^i3{]n=#sM^PJ1kM ҡSdieh %_}C:/~x0vtp\N +S;&s<~7MrZzMO^jC2g*kCjd@DFh9Hn("1anöpgB{I}i%-LM0O\u#EVw`_6*rG% nOkw`5X'@ɝm5D]9=ַ?0!!йʈ%aҍ**A܎aM*'ZIn^w!M@d?OE`6N:ӧϰ_:]|Q v >i,,օ}G w#Wu-g2H^eUH PK\.(kfs po257 $ynt-|ãT /1 |ǖ$1Dqto #]o`J1GhRv9K|lJPNAN^+ED)P= <g&HFR(DH ~N=S>KPxu?eݱK *H%+,%B me^/@yI*?4]î1W 0MZᲤVY@S2YȁGAN1;B6+$U)ʇcp;^pGNkֆL~*On֐^ ~TKgXHH{&IS_6ui>]NBPR}$ m*|AVâ fˉ<3[js0bd^+r[mRR۶ Ea\]G[7!'UA.{#cuucI #Tkli:zߝA0Ӎ(Q_%w5;0feK!\  ud@5,ziw'J V<{bk֣RzZܯz0XD4aʚuEwHZLSSYl}>ٳ?tD?ƍ4uN#A\d,ܴh,)+}lg{-? +SQiBEe؏?:ƺ%>ا@D:_yjʣ8q|mӆ^ᴴzOԼA|u)P_>$T/lr0׌&'6Εp*XmA+D6։O.Y! }'EX[/+0m}pZ4: -{3 } ~Xg-t^MF"PT2fGOo]Ԗt֥+;\d=H1DrgnKTŜ4s8ćVZϯR` m|T.U;؆\VBt;:)ýar[WNkOQC%|I.& 2QGQ ȓ98n_qNfOBSG=g-c ^,˨5\oUmc,xYU2xbPyltl3񪰶* ^$&Q ό5wo^W!ܜ\?,s?T08$.}\? @Ȉ4"!VZ)3_R/$HJ!DU(O'48\-$A # 8:+$biYyKwd$c%̰R#͡t'WAy EmmݠHf}{;"e&Ars0!JzfPйHڸakj< AEӎ{0Bə6BˉXsSA&o/'murс̦҄7TK H8N*^۞L#9# UpIQ9؉R8%U[#+V4+)'5UoЗ쌝drUԩ^u^_ *ML*ec3< K#pQ]uXbKJaajyʉf`M Ma41x}Yk3óɒ)?z&Y K:1̿/a`ԧϒѩ!YEBS7k Cg|IZ l׎"7s3zhJ";D"?J8W"lX8BNqH,LKop*Nƙ-|iȢU^x5Qbjv|3Z5޿"&75EGRN5>lWҝf|]u;@߻2@rrȀ] &kp!1 vꒆ|-&*^΋@Zkލ, J?7@fʷWe_Im~[]y[ S j;I.֞ɤnsmoV+݉kt%qV;037 ] œ:{lDyG'ommNij3iSM5 `5 eE 3"xC;&J-1hz5_<ӟ:iШx*ڸ9LU`tU=-me&I1pY!uO7vn$Ȥ!5l yWM:n<B A61JGcaQ"*} 'wG&^;SW QAWxB:L +rg៟k™8=_ w gVG4*!_j_];b>Wd/*T%c`,W 1B^VWK&Ę{)s:)"պn U3i2zDתJS oFWc(m+;rWi/\p'1>e(L[|T(LI>.gtX[LhdOP9 N9swҼF|K|I& ~ /!Zd1 <5whRرDM~yO[_jeE!y`n!p]bXxifɉ= {:6~!y}M`r=2똁ݻsݱDjj[Yԕd08$GmW,974acIӔ8~ Tn=3_eƝIգ9kx00y[l)+ aĆu]1Yj_]83Ɇvm#ܤbmNE.@SFW1WdNl]waG]hs6;54?UMjx9E‹3=;ґ*%TJLݔ;;6-C{bg`j#U1I9M(Y,rF+}!՞u&0MQ ,d<2 YӼGp IdͮL]m-`_6]P |HIZ ="<*Ty"R0Q8E`KWn?Aْ亮 $sBDA|׀t0[x6mg_ !ےo+XN`ߩ^Gѷ_7,G) s >/QǑ?sxvPn[,yލ [^=qRq73 &Q'A;C,0)'53WYRHaʐ6tps4IgƎ5;ڊ[۳waI}S ۄ9/Җ,b_'5{)=u"Ag򇲑~oe(.[Vx=}ÚbmlpR:gap#T4 Zү:4M˭_ݱ5_\ u}i4!o,FGr+_ HERǟ'iQ|l?ú헖ejdZ$m+ӒGWĭ5]l}'Kcľ2Lha:6!)V=u gh5Tn˧fo648-^s 88D%av[} /v lu8i'd:B^ު5n*ÖaEYc/-KA2*<Ɣ.XMR[*F˕N$=s IʣWk۫pmo hs%,(V4gq|3XRPJl㵓a [7x\f? ;u)*7*ֺ7DBhEgt+ӈU1HF\I3['%+Vn˞ukOTǓ.y_5x5 (PW [ E*UE;?JDwAUR!lZl=JV%¸]vh2ޡA=NՄ ڇyc7a*D@+@KrŮJ8vÈu~QF%]BSzeQlbkscLK ὬR\oO 15)2nFg.2>wɮpkYVhgk{zl+kc ӹYx2XSI}%i k_ꓒ 5,bKے.?Y0%VK]Gv!1N2$Y #wvT-9ͣD5˰[Q-`Z١hFH]-^#vY/J`PG㾥n#( ",aσ"<RS#uK 9WbFJQ޶P\}40$j=A8T1Adn͙R ώVg f_3ժjG'}E!ە=6R1ınr/w|fU?LWB)g\x2^E~l6Bw]y}_`-J[OqTOPu9]9ȉO\+o^N+&m?.~1[ٵ"!w!lD]^⡛p]yxtN\.d/([ )otgLqQp%Y?cd eP]k2ދ%`Gl3B2-o`uP(z`Dx/C86s={L"x8q*^NTIv,ZM>S!-~aUNt `ϋ]veG]>/UiCDz: e[>x`N`W[0OZWRQqS-Yaxj-~vZ1ea7}Eq<'tލJuO^V%5JQQbHDWqɿ zlk O-r y7%'Xx;O-2ݚm5TjKr3γ,/Z0].a] ABVn'dQZ6zp[+[_NxA]*q;wL'RD>4Ɯ,^Xg* \|ĥމ U#6L?p^E]gDcՋҜa/U)`d~*+pR:QFr Gj)Vft sj}9q! kP_Ҥ1w #9謟| j-VSf8# ASR@-ҩ P_Ÿ̟ۅUHA[`\U*b:7cinYo9D p(}nzǸלɐCvewe\!% e;28gw[Pˬ:4xFI 6B~@Wc&;6l'b9}m[$}0Gs'c"4F5o/G}qAdm܅GDQ{G-rJk\U4f*uꂵzWhEIĦ\vYRh*gI>@:뷐vRW^I!t8跐J FsZŰ@DrӚx?/D%FJ̫: >O $/J7ym\5e׫ peuH$;՜C4O d*禵. vbH5c U@Ϩ"O0_l_ eDM 1LټN l @C^tX5R~I%1Xnw6\N;:уaKA]%Ӭ"=%lhbadѐkNMl~*_v@qU$}t)oNWGuB"l/Ыm_{ڸqZ[ p, Y|fr]cY1v+s>Ezr]3jkKq^Y",p8js,_<`-ptl2^ft=a/V:}Cͱ!wg}SL?ZNJc(aU )8x 8!ɠ 5}* r5Q :GyafR$ofٞ/b?<wKKӘY\k*?.*SVN?j)SZՁ]dqL N)+iT>?=nѨQj do*0vXRF-B[|_lmr̿>Ao'JpnBAe]V@m+mk;@ k4fxv aVo$1(֞L[|&k[لE{E ̸QWXCGD|mR?H1@f0M9xdq1R&ý\Cpb+U!%|yoFcL,V''C6#rFeA%@}҉m(6vݽ!`t~1vgKkw,}(nԳΦc 4XԳ\ah4hHKgZ^=%gyE3pPZ\\ቴEŐaspJ$7Ddߪswo74a nZ8WQgy@&9i*v3?7Hw++o4|sMpa˖'ߵ0DFf~译"iH9"PvP0Ni}ٕ*c)fv2Mَǀh?MvR7A4ºwEehBEAw)ZsVkWBN d80_&X K:L ƦT &\A ه[#1 FP<ёJ,z@% _cl?UuyӫQU8#nza#cD(l)#{uwE=-Ț0aWP X):4Q❐T0-Ge`)_"Y0 :l~k`f /G Dsp;*H4qP&rIT?_*~D3Z?6?tsAM\Ig~M+Vd8v\qI!(\yyZ$- 4woJ\WgFڭf7W ͕LHˬ hxhkB}=Ӝ ވ6OzUyY Gq!D 3;~~w}v[{8(?Uhư}{~F 󩠿V Хo%ΆDS+S gsj躁'7K^kvӞ nΩI뙢;UwimTqs!!UX둸 u2O`(~O=4hN~A ݍ16B¨fdtG .=~;"+ aWf-؍ GeMkii&7?wgaL/pmiO_DT2I$6˞IjMw" q &Ò4ͱjbxfo}/{#2H^& A~'"?sxECw٣;UQ:ZN(m_ n7[ffa9wٵ#%UsGT߅J6*ye8yGC'so))u<ȃi{ٝ#^mJ*61DY3?DUbo$DOaU3E6b~'QE|O!Iv$i_ۘAzNctF :OK!1 Ȩ\|s)hC݋7K U+_a*B]7/d#!(|sM,ϱ^d BMT > MD.xPM3aUc͒ lėWX^.>֤x xƪhlI8\I I$i7^TN`KH\|wR7f<0sŹ׋^ ʺcoL.F0ߧvpt:[ΣeWBD¬_ՕE18!964e~}ѼX ųK}\ç(_+)aՈ3!JVPmFONGLf?.5;QB쟚v@2;U)8lWL z|opOܾO wJݡEmyBQ*wo"H/yJ>/(WݸB#̊[j-+|" ~[JE&|%H 3-9΍so"_;'/Ơ' q قTA;^ UW,BFX#<ĸߠ*"rhodo Ptl;ƋYUP! DZGȮ#59?|7H/|Nw4 @.7A3dFXRfrUN`3.T7vv{0KX 0e@gjO YHEb225A R'è wnfٓt EB]7xe38qz rI3yWҖg+Yj 0)k눦𗎱Hٮ۫4&D3?Y&G+ SLX=כ[@927i[&٦+-]mDşYQb\UYG2Vjȅd$c;fU:z+C!qiNyN2 \ s߲Q 7*02.A)<3G/~_Kfq (C#Џ y (0BU%.4C4 9P:9W妜kfcmj[CRAJ|,IӪF6R,:-*ُZiYC;PhKr&wOMS?g[Y@GͫsgE:|dX݆,}dRp;`jHh g[- WKQCa wp-XxjӚa1"Qnft(+}Z튰y1K&{vW:|>޾0FnPOCjȹ}ovrޔ7Yѭ^W\.a~Q<㈟)0n~Ehor; 'O?C"a-of<  9pAL^f04(iIf`;;9 )O~3;BГZ!v+fx_^d~xiBa/p66=F?H:0qR4W)'>U'e_ Qj _nN KG(Ud"$8p`"! mw+dΎ؅P鮆~tfk8PZF*g&  "J-7f(F,4u-Q8e>R6ǔtZ4{H/UY$JfF1  c;:|TҦ S!l2zX |fy`),`lQ1_-POEʠ%O;e#¼/ПNB{w0[:PͩE 4a }reN28!Cn+ ]ɎS q8-W9 =<+);ӛۓ6F9yr>&;wE9? & <^c ./#QEUha|\z6w]z’Hnnkl\X=^PCn62F=PЄ`Qߵ_V 9v +øo>aCwDe]u, 5W= X#|[ yqJylեLc6{l }mNd/{D2m՛v8ο$|4\: : DK-4;%dMd RD`b(S&_#猿Hg;g f !(ONKXUF ~p}+__Eqf8K{#yYwb`%cD[zXhfoN ɓηaIJvrdaU?mqYgP.o2 ?Ǵrb! }x{?Dc6ܰw7GIcx9Aro~MSI"fW4k2$Qycg? v~Y_"Xsޠ;K,A[{^A -O]ŐQż0\ٮvd:4rٽ1Sըaxk)BO;oّR~|RJꏵtlΊ~j\,w_؇9` O^i:ŜۓZg1i3c-Q#H&ORw^9`VGGSkܒ/!iC @z3asC10ıE%F <8 OٸB oA$5ɯBJW#. >o[f-kqSG,q3dŖH%x>^;1tS]IV#(R} ğ4P/aVXͮHM7NerW5lN,:Zw+VFW-zzڟ=Rlzқ GёS}5 "Qً5F ?,B!=-ӛ%_)Ȟef1bRzhv҂|SF(D^)"*Œf"gL͆CehƻwYL t+ &Xg%ֶomFy,3('Pk8]Kǭ]u! 4)ׇj6(<ߌڇu.D{'UZ*>(]U/rYցJ (|8hT-Rn8#i`C+w~zxwx5VK8O1#[B"͗jb`|&e 8ՆO,pioBj a3sXU!Rw|c^9*]SDWչԆ$LgSS[OYt}W G'>d[˻Uc }*_oj~m:&2RFs9PPpJB,ŽX: 7_fmF=It‘ur 8%? \X̐pogvhW3,3 ~plP endstream endobj 137 0 obj << /Length1 1608 /Length2 8687 /Length3 0 /Length 9511 /Filter /FlateDecode >> stream xڭteXᶶ14Hݍt# 0 % %%%) ݍt()͇s>ίsϽe8<Ş.p3 pO н;GHz\0-iCB4Yw% T?3%E3BUmCP^iR#CV:w[d H2^!EKӥLQD'3}voaP3P k2>rxP8⇚Ibpȥ[=ڟ[U[[GdW?uXQ787P }j)P青Cy<xYjZz|Ě|ք &P/pc h/U݅{7 h `TMFz)vxؐ$h?KCёdiOxx̍ΔfD~"LQ! : 7.b>|r=ЄYUJˌ[8/4 3%X) M^%VBk/`p{\;. aE QGAOqEWQn-ŮG.v>(MHc^ɪ/Djf-(&EdDQϽ!Pg:ɀw_)ې'~YfbP/UG&Ym ꒉ'i8T}y?24!˱O'DP(1U1܁~µyU.0Mwl{ڐ '֎w\:K>bX oN!#1M14R%n_5Oib [',Ee^G  ]#'`"<+Qw?1  ^w뒸0ʱ澡Z,{E\u"x"еeo QC7"D5кe:3~a9WLvT!ESSу3pYR_̾eEH~m2Hި[}-E7hKJ&T Ysy?n~zIõMb;Ph :wZf=8p Z2}YcQÃ*&T{x#R- 7P"l(T u.Zވp)yX,s[`?T  V `knA;gYj8{הoE'f^첅[1$q}vһB0Ot>D[c2Yn[juݚL3Bl;ºKMSp_X`Fgۻ?94CIVG&qi6oVE ,=2 ~]TuPU Cە3ZW@G3P&Ԫch|Y7~Wt|uv@{=ݢi$52Bʄ2,]Ь=˳_ MRmu3шGR 2qhFdx~}ȱE[g</qt@;#P={ʦ"X*jE|9,m@VsXȫ{P1d  o2,Y_txǃakm7YH!{W6E '֧WVy&cS -!_csaT&`]p "6|* 4br̹Su77Ԋ-ba .ӷAdW/՝FVhouu/(BҮO]>roۛ#;QS>dEY.|`Lq2aGd&z _Yw:ibQ\~a^Ym6φ*V46s=+Yfؕ%QW(e/UY{251p^ @ϥVn⊣=[NYq$'Q=jfsՂ{ڷ]FуMkzՕVxflZtӕqZ>_B_V<iiPu9)8oԏ09\°{<bW|4>AGT5EЭ/dUZO|-s.# C!RV ;7:i8qM`xAe|P}{ZE+uw Q .i1. A:,+6P U3,:,(f`֞n;;o*'@đ\8 WY x{|zE{) }zpTO s޽RTn\f?4'dwIKhYGڜo٦KI&۾]cʏ {ѿL ;ih-OtvejCc20pqAIryxRfcr-s%x:_q# j>d[\!qZ `gڠ3-tM0Go[!-KB+ (u +d1[CKNAN*ձ*Z6c!-a(g=ol6j}ϖM/:Ӛ\.뀼:ɂ(1BF-A_}(Wd1R]*Lhuol#w#KHq }/Ok :gq/)9Q* fF3 0}#*sr4 ֿ_#,?%jFНRLy}^6j b-p<=n|GLEuF{d| =]_ůX "DgwzY7p[Z-Hৎ"_E0JŕVFM+EMZwH" #Qy= [dmk鶈5#;p^VLmMR2GgrP(a(wOuSFatZPpkV21M봖\V V30M7xW(SqTC"Jh㾭/NɴzAi,]Iڏ<Dd] $ـ-Xrshx9-IɿL`p"aܓ0K5>*_r&Crur? \EiYdM~㹂%/}*H hLmUCeԡxbxOYAx^@pOEAv >Q9ɩ LV_?=cmF8=S'C&wmҪH|k6ЫȀ$۶tEc憷PMqWjvȮft +8{HYY"ejUT|qG(0(Fbu/,&,2jaީ2Kb{L棝0UB(cXՅ7N\3H-?*Z<!*oGكA~o+P tVIwnHdTe;~CbtNR#ݎ#\[Q5K'I|$ {2oh֢ S8NǸnx|%iR݇1fӖUB) BF;{JpیN/y헾{'pk1F_]"ex/(Guzx-AMP,WgB-r'eeF\ᘤBFDjNN0d.|+d WMUw4&XlT} 85Lc((HָyDsD*U_.w~ &Q9ܮp-e}C#`<(uMw (2![PLŹ5kgw ts'(ӫ^!467B7M}(!θF1Yh]k?X")~bUGv7*[: \9zKeNXf?2ޏNɆ03ީÃC忿M74Ϧ,@7́ƭ:i%V2N۹e%_uP[^(<|r]i+1go. [Ѣ3ɸJB0ofkDŽS$5J^,`+`k rxOwˬPp[FdZEq1c-l6l7~Q߇~䤘oĶ\%yEr"t$kJ:srg{EyGNb$]0`QJJ< ~c5a<[ՕJ-blYpUp̈́3% 'ۜ:MXbU<')t;=%+yS;[^`%+rKXnB[S_MG83ae;(ŹX7XѼZqGqL;jL 4㽭itY#T]:os |q*KiBJk">&d6E 8Jޮɢ_DIutUH0\.ib`6$ԧlֺU,ZdzgfӜ%n?@kG2wE|AyGl' ޮ .@b/ q=h]:ٞzhHa^u5Cn )Ȓ;5ZFk1X83J[k*MP뗆Zv&">|H AA-cs{m)fL䴴H7QmqQMdʹ6$?:9Q:?@RwKujV3ʇ ynrnZ㶦x_k7DVә#*8#5LdtJ\G(9ϒ(_ީm[Z:A`49"ҜCc!g\CEع^ɈaM'-nQGAm1/^i'|Ɔ=F%C~{|ACT.haL^LmZc^7YP5WpZ|>A?S d| ꩯgtyo^Ou $_~?_.4=u%8κi/t[p,>E0鬛8\*͵X82Cʹ]Jə9Zʼn,o!uk %WvJ۵1T8ƳLg=Q"zYۥX4U|mT +D8 >++O'[7Te"}N&6"*y%eykԺF6%mE*y D"oV`kR!YWxi)K<Jܑuēvz ھ*0['|SSRއ;|A4~M ״飐V*ihWbn㰠`YXrs] aq d+-{IR0^0TY fpJb (稺nƌ>8e$^ȮGb)g_Hem"oDѢLǙ[9EϏEqH>$bʿvѣi&X> >_\ ~crQlre:'*ԁmSJcgp #qp~ Csswg +(83\eJ6 eyhQt̅ ^*2ѐ8;4 ڙ}0w6ШnqPJcYuY2&]N_\ͅ6٩z)ڻwK<%D }Rϛ [r nYĊ콵 g @bWKR e;GTtw[4<ʨ@< d%V r"Djka:`fjO4umcՑ7 "o^ (c(ĶK)l Ŝ,pe& =6QY8\>^v%v5m_WI&dx/ݜԌqjgZ8Ӟd2vx;%*q/}jF!H|_Y/3a!PbnM9 .l: FŽO4%(Ry?#8kH tV$LW1b"'8 u0%i'Mlgv4^*@a}gq_4R<6}*ORKl_KkwfHĻ^Y]`1?>ole8C͟zOo*#niC"^#f@KYVDE[_a>:[3pju+|9KQc>.=E B%Oyҽv=g%u/̜Jq.[ >OQ] 9#|]Mهk7/Z֘Z,nxLRi_?S<}hCF˨\-Gmd>'nm!{me}ۅvVPM;IK7ABG;~>5D=~s37PCrUfą$h2aEBoJI} .&}ᓟ G 4& 0tdx90M*CxvЃ HG^RNhKj endstream endobj 139 0 obj << /Length1 1144 /Length2 7551 /Length3 0 /Length 8318 /Filter /FlateDecode >> stream xuveT\ٺ-w Sx]KU = ¥9Nך[5FS]n ع9DGKwWL]lxA 7('B ra '^rpDD\ 4] p& (Y#pw+橲 ;y@l@=m}fVVnaaa,b 0>-]O0毽0p{etppu# %- d?9IQ Va%  WOW`'Jp7$&\\Oxzq?sȻCqSUCA.r@  B=&< l qz0?8&7 `kr]]'Y# n tܞr7m4?/6`/`p'Ǒ;T<2d ԉ?1w@,؟g& 9Ph~|8sˤlxtMTAh17/%Bӭ̒°\PsήCE8&islTdUl\Rҩ`~UG%+t"GOژ5|:RwU4qE͹i\q{smyc2*&Z!C?%LV>{a"z "H`燤T{S:f?Q4+}ȷU U׀aUnij-P\w=!ຫ^Lؕ1%{_ɱKȭvY5+8c;W6^I::i%_Q`n+>Zg-!Ptn]P1o@hĨ~ cءWYU.=kx-/|,3Ց^3զ'6;lm&vMvOvbՏә',O|^ҐttLU#(0qP_m肃N)|BdNYg-}Mw21?0o0IG޶Z.kMS"估n܊0[PJ7? mݾF6Y꫖pJj=!1/5AXOv|MtRX͹mM^*VMeQu%+io 5wf2M,j4bo_+z@[D F%0n|q*(x9TCt/nb幆%7 p$\@Sh(V]],y2M ԜDJ` 4\ҩ`BiQf1O[P>i\;:}'ȵmv9/:X+4h+$S/r[b-yD^˯߾R+ı5,o({m(@.źp[v-6s`~%R~EB.%=y;Yx&1lkH]ۋ8dW+16z2-@8u&Ќ!]wܳPdklL3gr? Kkm, U6'H*FXVKZh5Oթ)S!GNi[[.ɐ3~٢Yد9Nw|e4LR.1~%$B92)=g >3y~m5Cӗ#+ tb G0xT,;}6~)>epBTn60KS[T6_bXH|޼:h@PUݬ^B v(k^i$p{7"تFV:%CXҢ èF;+Z";&!I H"ޤ:eۋG\4#=ܳ qcd41T^[>˟TT6˺h0_ҕeo&4?=Idv;D'< d[4{CY** @?L. O j}bbf%mW;4=' ns<ʝle?(a81Iӽ]fEK6czhIiȅUt/ ^wE&^^-6.B,Ż#q9#T+nJCnuYڴ97.[x鳨6H~)sZ0$٩/.INCm<nVs̷-=ȟR I 2r0wIUw3c SMFy}*Q m嶑WZIO@w{pz7Y3f*0%څRkI2r՜X+ ?vYv9dKpDwg^ ڬd]aíNܙ"clEŦY$"Э3[2eaPAM# 53o4Nf@5aX5_mwv!܍,$T%F8iOowG\atԖFc]c_ޤT3LDwBD~P 2:H|NSo- ;/~Ϩ|C޷2:Dջw׮-!0m^wX*"aٗ0 Bn#bՒNgVcNy`+؉d?VqSTfUme`WS4'\k4 g\xbǓ[󻧿v9<8 u,7w ]&)(i͹xe!}H~F;)Ǔ~.N\~LGQa`4`Zǡ*/ zJ}nk9bT_ {D~.ekd'Vɨya;[ZǺ"|v+E[`[@L KzLB1g"m8AZ+*KV"C !nQz "M7k5=0)R4{e1ز,ٛrGlsC&}&b~1x"bT<Ʉ/Z"hf׿*fg5BsxF#6DSKݺ;I5HH;AUf52%fm& Jb>.0<*<[;Y#6slKQX  1-3T+iby@EKIgF!BxI*(R0=ZVlzn\<؛\@,Z< 9W|iЭ;+ǿ KKI"#"zS lJe>{Fdk桿u8pi46UcI{>`b&(j@ׂ/ju!MʝC 8w?!}q :e;0pi` DQu~? %V d{]'iUM-4Uisxppy_>@ xߪfm>1ɑױrU4߯S_][k[̓^))6~̯䭧ޫwY`г lZ|<\v)@~Yh/+gIةzK3;)[aHW@"~Uj1G`"jfB.&J#mzAר/8o6OHwGҳ yƌ8r,jq=eI st fyd_Lom|wٿ-۪}ߚQ]T8 3 R+LPb c6.D^9?_ʆ Y?*8<rk0XDEڍ[l3׶̱;#{LzˋX!9r+R3`T|77w(C-*8 'ĢxDɫōDFvDKAP~prabk_Q@b{zW j|3*AN6\Q4fA|8wNM#gHtF(Jאӹ1WY$qF2pbSj`XĆX\txh8x=c9pGa>͸$-obsn4RuY+"upEJ_(GStRNf<~`l?Zƌ+(~.Ď ʺ~5syn`֗p:nAdV!EhiGB輤)7/Vs21Dm[ @DlYtEe; P_[6џ )+*!U0^(QNp=<'0b:yɠu`C*JidK|`t6P £ꗋYi|@GsJXfj( OB>TlF??_*`V$7~N_5>{0`UL-i}j/A2m}DJ}Y19}֛xoFXBOo{[i3Y͋;KxAb0w!茱K-fHIqUQbI",VVlb +蜃= ֖tV!Gش֫"\J>}ݩ.yعT'I"GlŠWm|ߝP|~7MgE*Pia%GDN^ b1I-%7h3GF/r!MZgfT9U1<*2tYo#uc jr*Kh>iVLk?v<# zGroEY $|tCgv4Ë2݆ÉԲ%S{<,R,>DhZ35$BSrNU9 83f NW,&s+h7T Y[];mޒr}(V>6'I oul[D vdGM%[!;&Q0]|1 FS?$SZk‚$$x_lD7MQȀZX׊bTp9ckd-`lrɓ>ym!kJбv*Ժ3Q\5@wjսKaХo#"Qǧ,ZdN5+U42/ JDvX(RAUK D`11zhxVs[ y(6'f|چn;ɟ}O.j/?2ԥҢN|U+=v#G`,b®DpZ%J#o#̛|x3$P\_= 6Ⳏٻk |n7Y-&@VkٙC 3Ɖ9k#'Gkx\"nl ){T;_} QH4٘U!.jVxlʐn?o%B4H9oʈJ+Mש,-lXk$n{&pTm:ث9XUFCxjcWrcoF:dmPAg{ hD)]WX#E6p&sf (]%]_MkrU1<~w!Ɉ{ k<@XqPY0'fc3o 5@ CіR>$<'W3JQRi0hq _Yz¼@7 $KΔ$n4d-G#Gw~Y\o6.4ǙuZts1[`Zt*գ/GZ<\Ӂ.l _[ֲ(+{9igV b[ ۗ+"=>{Kkr\- C; \4|q ,AM)]3WJjJgqAUx4d(2`eiP_Vo G86bD$Q +^wE@V6By>N\L!_,*ߪ] ,*b'-u!\m pL;QgMhs@Huc&[GI,!<)'vH22_Pޚ3Ԩܦ8bbl? ǜ>rubf"PM#HGjtbЏ6lIq#&up1mKߝXGŅEөnixXp01-#'[5 ѡ )9L'RXdf kMLv/eEyn]bu4hBwqpKN@?Ɩ[Ӱ"F*kU+W|Zi3t i=ߺ}:FrkUϧBkh[SSf+SP:Zhڻ.UbNz[u6()6v ayG*a;ޮ7`*C̠z }مv+ƿ}IӜkLF^s0IbCĆ#Enӊ^(M@cśB& s6b ĉHt-4).1Y8~1ǐfP`JlWhA0;@\Y1/Ep!(?9rzlS`rbUv/ ؿx٨rsFCfp endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 821 /Length 4221 /Filter /FlateDecode >> stream x[o8}{7y(hM۾6)Xdwof(9N"ES#r7Oʲ`93L2X`13PL82)tpL:[tOJd0 Ё8)Ōf0 +EXFq:$Nnp[T/c}OH$@~*?Y=C4ȒB ?;362&= , @oBc#V01 ;m`JT("0z1~E>Ӕɰg.?zw{4`JwגH.yɊl\X]c֬)?Nqli]]Nr*N^uq94Uφb`մq͞ b?/xP n7vÞO'J3iYd_jp_ׯ` ={ώ^<8`%7 >rMOfuZNTe1N9\Ɂ`MƧowV0c?N{zŗ˒Y{xR' 8aTXC#Oح>9 vq?%k|Q@0M)WO~y`VEb¬S+X=nd pISRGJ{sѴ=~4=߭AY1c'=́&Y)$>쥷͉y!x@p$ lȉ>9Jg","3'63#JfΥ 7|1v#'p` \4Z sAY>xyft@`I2żʹ̈]FV_FePaAJ,VYYӷD@( :j$yޱ=OGu*R6 D :h2qzm Tu}O+*(5?eU Lا4QWЃ4٥Y ?/q|2;'ê_bꬪe5.Geє|(^ ?|r1~i/E17w׸ubNә 1Jdƪ,`oLsC4CR+O[f?9P8ypv+q^.+4( Pyg3_1UkRS\LjdS2~#k47FB*v3Ly]t% qC-mWXyQFPoA&>?$<_@¶>Gن&ny ^y0mxfkcQ ЗPlqb2viބ> v 6yfR®8B}j{ep oyb!19C6Z9밯"mGcv~XGHἆkLhp .ϱ†"I3ceB( >sr$.BB:.^>{l"9(?EYr?xFYrl@׉ @ yhƞ3aP7H-R8mumhZ4UȃdX!^ExigGygZ Ghs>!z9n6o}*C"m/O-485UJHf#.\yE[Egat?->` T#F0) X14ɟ!%80? u)Q;ʠ'}SǥBI¡4y-ݛV)(jg>v_7=Qzr>BÝ?. I7‡ѶscFs|"Z? ?ӍJEZ}-쾶!b67wLm9cN#<} P 6Յ="X.5mЎ6^h,k5⫍hjqkaY%mq_<⬭4.ajNnn+v s`ͳ-Aׄ|=#ɫT$g~;z*HkA$'~太CErxxݲ.qW;E1Qq0wa;ReA 5M:'z||X'qA&hؿ?>,Iyn{d9΋ .g~ ʟW~ȏ o[^~R.ɨ􄕖^\Հ_ ?Nˆn8&dk7ϼ9y]|Gŧ|:uӯ OYWw~!}j5?|Gv2D 6_M `I񛔾nRt?*.Pߝ h`x6 oemJqm>_~zu)l "֤9Q^_(}LtL8SO+}+Mj͕_wEoCN{KZy5v0">DR]G{W-(X/'/`*) ')$`y`kaO!uV[84//yͼkDuٛ<3Z?ثubo5i]xL˗]X,6p#IŇFG`Z Sб]ca9Եˣ݃Y_AHD ֐ zbD_+ջG+k2 .C@c"Y+KV7|嫽g~z:86 AD8:265XեLK>|J .A, ^W+ے"=_|cSwJ)a lES1TK&TU堭ثw!|kiWDj0<v {/uqpg/*<)ㆀ|$E1%td0#H42JFI qS7"ƣ2kĕ,tĂ%) .-mV*wI[Yquo)a7L2?Rh⫵8~nPUuRCPU 9w;*Jvd,#T!p[4%a8fn&N,>`=LsTMR^<7vsș]Lq,"{~='R p6[%XK|I?Peo5"k[lmڒ5}/GY۳ߊmzTKֆumœNpSK̅3Y"{KnF^Ԫ̙ g~=gFm endstream endobj 150 0 obj << /Author()/Title(Working with aligned nucleotides \(WORK-IN-PROGRESS!\))/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20171117193900-05'00') /ModDate (D:20171117193900-05'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) kpathsea version 6.2.1) >> endobj 141 0 obj << /Type /ObjStm /N 19 /First 142 /Length 637 /Filter /FlateDecode >> stream xڅUQo0~ϯǢ g;#U::iVeSX4$( w`$]rQc`!P0 c;>B(J%d+ TPЩC92Ŝ.&ABQ^f, ]߃KA8j SZi¯<ۯ"g/z{ lTW2;EIcYYՓ \f"sMolj{žӭpRI ni6[\ =bC#^{p VcJHЛx:ֻ,7AY \J,38:fN۝siCY҆2yz9PF\9 w%1Wra @.^k1xyWxPGh;-HO.I׀Il^LNzěG$,BSF <5AFC7AE9B631896667E1ACF54695B265>] /Length 387 /Filter /FlateDecode >> stream x%IRSQs҈A&HU-@1^1g!L x?_}u{775޻,2sFuj!fUT  ,EC2ʡ^3SiAo 1#T6L#akͬOgn5z*j Q= S5ʫZB ZC :ݬV_O؃} J^xVy79AnM|~AڭV[0#n#$Mni67”[B  nǚW"|w˰>G)՚YIv3pޟyOrV}h\٣MնGWkzTϝP 3b&\pi.MR E/D; endstream endobj startxref 213871 %%EOF GenomicAlignments/inst/doc/summarizeOverlaps.R0000644000175400017540000001702213203700453022577 0ustar00biocbuildbiocbuild### R code from vignette source 'summarizeOverlaps.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: style ################################################### BiocStyle::latex() ################################################### ### code chunk number 2: options ################################################### options(width=72) options("showHeadLines" = 3) options("showTailLines" = 3) ################################################### ### code chunk number 3: firstExample ################################################### library(GenomicAlignments) library(DESeq2) library(edgeR) fls <- list.files(system.file("extdata", package="GenomicAlignments"), recursive=TRUE, pattern="*bam$", full=TRUE) features <- GRanges( seqnames = c(rep("chr2L", 4), rep("chr2R", 5), rep("chr3L", 2)), ranges = IRanges(c(1000, 3000, 4000, 7000, 2000, 3000, 3600, 4000, 7500, 5000, 5400), width=c(rep(500, 3), 600, 900, 500, 300, 900, 300, 500, 500)), "-", group_id=c(rep("A", 4), rep("B", 5), rep("C", 2))) olap <- summarizeOverlaps(features, fls) deseq <- DESeqDataSet(olap, design= ~ 1) edger <- DGEList(assay(olap), group=rownames(colData(olap))) ################################################### ### code chunk number 4: simple ################################################### rd <- GAlignments("a", seqnames = Rle("chr1"), pos = as.integer(100), cigar = "300M", strand = strand("+")) gr1 <- GRanges("chr1", IRanges(start=50, width=150), strand="+") gr2 <- GRanges("chr1", IRanges(start=350, width=150), strand="+") ################################################### ### code chunk number 5: simpleGRanges ################################################### gr <- c(gr1, gr2) data.frame(union = assay(summarizeOverlaps(gr, rd)), intStrict = assay(summarizeOverlaps(gr, rd, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(gr, rd, mode="IntersectionNotEmpty"))) ################################################### ### code chunk number 6: simpleGRangesList ################################################### grl <- GRangesList(c(gr1, gr2)) data.frame(union = assay(summarizeOverlaps(grl, rd)), intStrict = assay(summarizeOverlaps(grl, rd, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(grl, rd, mode="IntersectionNotEmpty"))) ################################################### ### code chunk number 7: data ################################################### group_id <- c("A", "B", "C", "C", "D", "D", "E", "F", "G", "G", "H", "H") features <- GRanges( seqnames = Rle(c("chr1", "chr2", "chr1", "chr1", "chr2", "chr2", "chr1", "chr1", "chr2", "chr2", "chr1", "chr1")), strand = strand(rep("+", length(group_id))), ranges = IRanges( start=c(1000, 2000, 3000, 3600, 7000, 7500, 4000, 4000, 3000, 3350, 5000, 5400), width=c(500, 900, 500, 300, 600, 300, 500, 900, 150, 200, 500, 500)), DataFrame(group_id) ) reads <- GAlignments( names = c("a","b","c","d","e","f","g"), seqnames = Rle(c(rep(c("chr1", "chr2"), 3), "chr1")), pos = as.integer(c(1400, 2700, 3400, 7100, 4000, 3100, 5200)), cigar = c("500M", "100M", "300M", "500M", "300M", "50M200N50M", "50M150N50M"), strand = strand(rep.int("+", 7L))) ################################################### ### code chunk number 8: GRanges ################################################### data.frame(union = assay(summarizeOverlaps(features, reads)), intStrict = assay(summarizeOverlaps(features, reads, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(features, reads, mode="IntersectionNotEmpty"))) ################################################### ### code chunk number 9: lst ################################################### lst <- split(features, mcols(features)[["group_id"]]) length(lst) ################################################### ### code chunk number 10: GRangesList ################################################### data.frame(union = assay(summarizeOverlaps(lst, reads)), intStrict = assay(summarizeOverlaps(lst, reads, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(lst, reads, mode="IntersectionNotEmpty"))) ################################################### ### code chunk number 11: gff (eval = FALSE) ################################################### ## library(rtracklayer) ## fl <- paste0("ftp://ftp.ensembl.org/pub/release-62/", ## "gtf/drosophila_melanogaster/", ## "Drosophila_melanogaster.BDGP5.25.62.gtf.gz") ## gffFile <- file.path(tempdir(), basename(fl)) ## download.file(fl, gffFile) ## gff0 <- import(gffFile) ################################################### ### code chunk number 12: gff_parse (eval = FALSE) ################################################### ## idx <- mcols(gff0)$source == "protein_coding" & ## mcols(gff0)$type == "exon" & ## seqnames(gff0) == "4" ## gff <- gff0[idx] ## ## adjust seqnames to match Bam files ## seqlevels(gff) <- paste("chr", seqlevels(gff), sep="") ## chr4genes <- split(gff, mcols(gff)$gene_id) ################################################### ### code chunk number 13: pasilla_param ################################################### param <- ScanBamParam( what='qual', which=GRanges("chr4", IRanges(1, 1e6)), flag=scanBamFlag(isUnmappedQuery=FALSE, isPaired=NA), tag="NH") ################################################### ### code chunk number 14: pasilla_count (eval = FALSE) ################################################### ## fls <- c("treated1.bam", "untreated1.bam", "untreated2.bam") ## path <- "pathToBAMFiles" ## bamlst <- BamFileList(fls) ## genehits <- summarizeOverlaps(chr4genes, bamlst, mode="Union") ################################################### ### code chunk number 15: pasilla_exoncountset (eval = FALSE) ################################################### ## expdata <- MIAME( ## name="pasilla knockdown", ## lab="Genetics and Developmental Biology, University of ## Connecticut Health Center", ## contact="Dr. Brenton Graveley", ## title="modENCODE Drosophila pasilla RNA Binding Protein RNAi ## knockdown RNA-Seq Studies", ## pubMedIds="20921232", ## url="http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?acc=GSE18508", ## abstract="RNA-seq of 3 biological replicates of from the Drosophila ## melanogaster S2-DRSC cells that have been RNAi depleted of mRNAs ## encoding pasilla, a mRNA binding protein and 4 biological replicates ## of the the untreated cell line.") ## ## design <- data.frame( ## condition=c("treated", "untreated", "untreated"), ## replicate=c(1,1,2), ## type=rep("single-read", 3), ## countfiles=path(colData(genehits)[,1]), stringsAsFactors=TRUE) ## ## geneCDS <- DESeqDataSet(genehits, design=design, metadata=list(expdata=expdata)) ################################################### ### code chunk number 16: pasilla_genes (eval = FALSE) ################################################### ## chr4tx <- split(gff, mcols(gff)$transcript_id) ## txhits <- summarizeOverlaps(chr4tx, bamlst) ## txCDS <- DESeqDataSet(txhits, design=design, metadata=list(expdata=expdata)) GenomicAlignments/inst/doc/summarizeOverlaps.Rnw0000644000175400017540000003243313175714431023160 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Counting reads with summarizeOverlaps} %\VignetteDepends{GenomicAlignments, DESeq2, edgeR, rtracklayer} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass{article} <>= BiocStyle::latex() @ \title{Counting reads with \Rfunction{summarizeOverlaps}} \author{Valerie Obenchain} \date{Edited: April 2016; Compiled: \today} \begin{document} \maketitle \tableofcontents <>= options(width=72) options("showHeadLines" = 3) options("showTailLines" = 3) @ \section{Introduction} This vignette illustrates how reads mapped to a genome can be counted with \Rfunction{summarizeOverlaps}. Different "modes" of counting are provided to resolve reads that overlap multiple features. The built-in count modes are fashioned after the "Union", "IntersectionStrict", and "IntersectionNotEmpty" methods found in the HTSeq package by Simon Anders (see references). \section{A First Example} In this example reads are counted from a list of BAM files and returned in a \Robject{matrix} for use in further analysis such as those offered in \Biocpkg{DESeq2} and \Biocpkg{edgeR}. <>= library(GenomicAlignments) library(DESeq2) library(edgeR) fls <- list.files(system.file("extdata", package="GenomicAlignments"), recursive=TRUE, pattern="*bam$", full=TRUE) features <- GRanges( seqnames = c(rep("chr2L", 4), rep("chr2R", 5), rep("chr3L", 2)), ranges = IRanges(c(1000, 3000, 4000, 7000, 2000, 3000, 3600, 4000, 7500, 5000, 5400), width=c(rep(500, 3), 600, 900, 500, 300, 900, 300, 500, 500)), "-", group_id=c(rep("A", 4), rep("B", 5), rep("C", 2))) olap <- summarizeOverlaps(features, fls) deseq <- DESeqDataSet(olap, design= ~ 1) edger <- DGEList(assay(olap), group=rownames(colData(olap))) @ %% By default, the \Rfunction{summarizeOverlaps} function iterates through files in `chunks' and with files processed in parallel. For finer-grain control over memory consumption, use the \Rfunction{BamFileList} function and specify the \Rcode{yieldSize} argument (e.g., \Rcode{yieldSize=1000000}) to determine the size of each `chunk' (smaller chunks consume less memory, but are a little less efficient to process). For controlling the number of processors in use, use \Rfunction{BiocParallel::register} to use an appropriate back-end, e.g., in linux or Mac to process on 6 cores of a single machine use \Rcode{register(MulticoreParam(workers=6))}; see the \Biocpkg{BiocParallel} vignette for further details. \section{Counting Modes} The modes of "Union", "IntersectionStrict" and "IntersectionNotEmpty" provide different approaches to resolving reads that overlap multiple features. Figure~\ref{fig-summarizeOverlaps-modes} illustrates how both simple and gapped reads are handled by the modes. Note that a read is counted a maximum of once; there is no double counting. For additional detail on the counting modes see the \Rfunction{summarizeOverlaps} man page. \begin{figure}[!h] \begin{center} \includegraphics{summarizeOverlaps-modes.pdf} \caption{Counting Modes} \label{fig-summarizeOverlaps-modes} \end{center} \end{figure} \newpage \section{Counting Features} Features can be exons, transcripts, genes or any region of interest. The number of ranges that define a single feature is specified in the \Rcode{features} argument. When annotation regions of interest are defined by a single range a \Rclass{GRanges} should be used as the \Rcode{features} argument. With a \Rclass{GRanges} it is assumed that each row (i.e., each range) represents a distinct feature. If \Rcode{features} was a \Rclass{GRanges} of exons, the result would be counts per exon. When the region of interest is defined by one or more ranges the \Rcode{features} argument should be a \Rclass{GRangesList}. In practice this could be a list of exons by gene or transcripts by gene or other similar relationships. The count result will be the same length as the \Rclass{GRangesList}. For a list of exons by genes, the result would be counts per gene. The combination of defining the features as either\Rclass{GRanges} or \Rclass{GRangesList} and choosing a counting mode controls how \Rfunction{summarizeOverlaps} assigns hits. Regardless of the mode chosen, each read is assigned to at most a single feature. These options are intended to provide flexibility in defining different biological problems. This next example demonstrates how the same read can be counted differently depending on how the \Rcode{features} argument is specified. We use a single read that overlaps two ranges, gr1 and gr2. <>= rd <- GAlignments("a", seqnames = Rle("chr1"), pos = as.integer(100), cigar = "300M", strand = strand("+")) gr1 <- GRanges("chr1", IRanges(start=50, width=150), strand="+") gr2 <- GRanges("chr1", IRanges(start=350, width=150), strand="+") @ \noindent When provided as a \Rclass{GRanges} both gr1 and gr2 are considered distinct features. In this case none of the modes count the read as a hit. Mode \Rcode{Union} discards the read becasue more than 1 feature is overlapped. \Rcode{IntersectionStrict} requires the read to fall completely within a feature which is not the case for either gr1 or gr2. \Rcode{IntersetctionNotEmpty} requires the read to overlap a single unique disjoint region of the \Rcode{features}. In this case gr1 and gr2 do not overlap so each range is considered a unique disjoint region. However, the read overlaps both gr1 and gr2 so a decision cannot be made and the read is discarded. <>= gr <- c(gr1, gr2) data.frame(union = assay(summarizeOverlaps(gr, rd)), intStrict = assay(summarizeOverlaps(gr, rd, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(gr, rd, mode="IntersectionNotEmpty"))) @ \noindent Next we count with \Rcode{features} as a \Rclass{GRangesList}; this is list of length 1 with 2 elements. Modes \Rcode{Union} and \Rcode{IntersectionNotEmpty} both count the read for the single feature. <>= grl <- GRangesList(c(gr1, gr2)) data.frame(union = assay(summarizeOverlaps(grl, rd)), intStrict = assay(summarizeOverlaps(grl, rd, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(grl, rd, mode="IntersectionNotEmpty"))) @ In this more complicated example we have 7 reads, 5 are simple and 2 have gaps in the CIGAR. There are 12 ranges that will serve as the \Robject{features}. <>= group_id <- c("A", "B", "C", "C", "D", "D", "E", "F", "G", "G", "H", "H") features <- GRanges( seqnames = Rle(c("chr1", "chr2", "chr1", "chr1", "chr2", "chr2", "chr1", "chr1", "chr2", "chr2", "chr1", "chr1")), strand = strand(rep("+", length(group_id))), ranges = IRanges( start=c(1000, 2000, 3000, 3600, 7000, 7500, 4000, 4000, 3000, 3350, 5000, 5400), width=c(500, 900, 500, 300, 600, 300, 500, 900, 150, 200, 500, 500)), DataFrame(group_id) ) reads <- GAlignments( names = c("a","b","c","d","e","f","g"), seqnames = Rle(c(rep(c("chr1", "chr2"), 3), "chr1")), pos = as.integer(c(1400, 2700, 3400, 7100, 4000, 3100, 5200)), cigar = c("500M", "100M", "300M", "500M", "300M", "50M200N50M", "50M150N50M"), strand = strand(rep.int("+", 7L))) @ \noindent Using a \Rclass{GRanges} as the \Rcode{features} all 12 ranges are considered to be different features and counts are produced for each row, <>= data.frame(union = assay(summarizeOverlaps(features, reads)), intStrict = assay(summarizeOverlaps(features, reads, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(features, reads, mode="IntersectionNotEmpty"))) @ \noindent When the data are split by group to create a \Rclass{GRangesList} the highest list-levels are treated as different features and the multiple list elements are considered part of the same features. Counts are returned for each group. <>= lst <- split(features, mcols(features)[["group_id"]]) length(lst) @ <>= data.frame(union = assay(summarizeOverlaps(lst, reads)), intStrict = assay(summarizeOverlaps(lst, reads, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(lst, reads, mode="IntersectionNotEmpty"))) @ If desired, users can supply their own counting function as the \Rcode{mode} argument and take advantage of the infrastructure for counting over multiple BAM files and parsing the results into a \Rclass{RangedSummarizedExperiment} object. See \Rcode{?'BamViews-class'} or \Rcode{?'BamFile-class'} in the \Biocpkg{Rsamtools} package. \section{\Rcode{pasilla} Data} In this excercise we count the \Biocpkg{pasilla} data by gene and by transcript then create a \Rclass{DESeqDataSet}. This object can be used in differential expression methods offered in the \Biocpkg{DESeq2} package. \subsection{source files} Files are available through NCBI Gene Expression Omnibus (GEO), accession number GSE18508. \url{http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?acc=GSE18508}. SAM files can be converted to BAM with the \Rfunction{asBam} function in the \Biocpkg{Rsamtools} package. Of the seven files available, 3 are single-reads and 4 are paired-end. Smaller versions of untreated1 (single-end) and untreated2 (paired-end) have been made available in the \Biocpkg{pasillaBamSubset} package. This subset includes chromosome 4 only. \Rfunction{summarizeOverlaps} is capable of counting paired-end reads in both a \Rcode{BamFile}-method (set argument \Rcode{singleEnd=TRUE}) or a \Rcode{GAlignmentPairs}-method. For this example, we use the 3 single-end read files, \begin{itemize} \item treated1.bam \item untreated1.bam \item untreated2.bam \end{itemize} Annotations are retrieved as a GTF file from the ENSEMBL web site. We download the file our local disk, then use \Biocpkg{Rtracklayer}'s \Rfunction{import} function to parse the file to a \Rclass{GRanges} instance. <>= library(rtracklayer) fl <- paste0("ftp://ftp.ensembl.org/pub/release-62/", "gtf/drosophila_melanogaster/", "Drosophila_melanogaster.BDGP5.25.62.gtf.gz") gffFile <- file.path(tempdir(), basename(fl)) download.file(fl, gffFile) gff0 <- import(gffFile) @ Subset on the protein-coding, exon regions of chromosome 4 and split by gene id. <>= idx <- mcols(gff0)$source == "protein_coding" & mcols(gff0)$type == "exon" & seqnames(gff0) == "4" gff <- gff0[idx] ## adjust seqnames to match Bam files seqlevels(gff) <- paste("chr", seqlevels(gff), sep="") chr4genes <- split(gff, mcols(gff)$gene_id) @ \subsection{counting} The \Rcode{param} argument can be used to subset the reads in the bam file on characteristics such as position, unmapped or paired-end reads. Quality scores or the "NH" tag, which identifies reads with multiple mappings, can be included as metadata columns for further subsetting. See \Rcode{?ScanBamParam} for details about specifying the \Rcode{param} argument. <>= param <- ScanBamParam( what='qual', which=GRanges("chr4", IRanges(1, 1e6)), flag=scanBamFlag(isUnmappedQuery=FALSE, isPaired=NA), tag="NH") @ We use \Rfunction{summarizeOverlaps} to count with the default mode of "Union". If a \Rcode{param} argument is not included all reads from the BAM file are counted. <>= fls <- c("treated1.bam", "untreated1.bam", "untreated2.bam") path <- "pathToBAMFiles" bamlst <- BamFileList(fls) genehits <- summarizeOverlaps(chr4genes, bamlst, mode="Union") @ \noindent A \Rcode{CountDataSet} is constructed from the counts and experiment data in \Rclass{pasilla}. <>= expdata <- MIAME( name="pasilla knockdown", lab="Genetics and Developmental Biology, University of Connecticut Health Center", contact="Dr. Brenton Graveley", title="modENCODE Drosophila pasilla RNA Binding Protein RNAi knockdown RNA-Seq Studies", pubMedIds="20921232", url="http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?acc=GSE18508", abstract="RNA-seq of 3 biological replicates of from the Drosophila melanogaster S2-DRSC cells that have been RNAi depleted of mRNAs encoding pasilla, a mRNA binding protein and 4 biological replicates of the the untreated cell line.") design <- data.frame( condition=c("treated", "untreated", "untreated"), replicate=c(1,1,2), type=rep("single-read", 3), countfiles=path(colData(genehits)[,1]), stringsAsFactors=TRUE) geneCDS <- DESeqDataSet(genehits, design=design, metadata=list(expdata=expdata)) @ If the primary interest is to count by transcript instead of by gene, the annotation file can be split on transcript id. <>= chr4tx <- split(gff, mcols(gff)$transcript_id) txhits <- summarizeOverlaps(chr4tx, bamlst) txCDS <- DESeqDataSet(txhits, design=design, metadata=list(expdata=expdata)) @ \section{References} \url{http://www-huber.embl.de/users/anders/HTSeq/doc/overview.html} \noindent\url{http://www-huber.embl.de/users/anders/HTSeq/doc/count.html} \end{document} GenomicAlignments/inst/doc/summarizeOverlaps.pdf0000644000175400017540000061626313203700453023163 0ustar00biocbuildbiocbuild%PDF-1.5 % 55 0 obj << /Length 1949 /Filter /FlateDecode >> stream x[[s6~x@(fgIٜۙۗ%)d}.EͶդ=p.8p6ɋ3ܗNhB+(J% tul/>{dB1z1ŒE*reT鴱 onX csf(PM`8 % Aa .~9qG @^8ɼ:s)EO2H%D"v6B n=S<])PFIdJi0!C|,H2`}*S-P6iazd34+u:K>{^5 $4c$Kv1)nZ=ˋɄd$c G\]|>˸6ڍLZ{[9V8y-tK#`x(l`cٺkl``ȍi@n)N^eD~SwjwŪc<Hme$"8ȍHQ:'D|^RBQ0.feqg#(#E:Mۅ˷y.6'/CqV ۞(CMĉEL\f 딏3gwp(˜Mp3}DaFb<ޔcCT`z4<qc4RznTaGE臻ѧF9I L#&#mbܷۢ,#lxp3ǐ۸쫼Oʌ (Oĉ86@z% _!g⧘]m kiyʰQ (j"NĿś!A{2܉9D# r[+7i 䇉8$#H 3 wk r5.f3jf8Y[ŒNU)qpW&/e^_n8!qy}Wbⶶ]gC(M5yg#n5:}*}"26ˮ)x(j^a~]VIYrEA҉Z,B+Fz@[tֆ;4{YT:Xځ1x:FUI|9jh?26GS(6q=jB@LF&q/|lT*_a]e\ʲYU}߫,u ]wм#4 xSYa@_{9H&c)-o1Iqgv =L5{h{հ1r> stream xZ_s%B:K7>]2--(QGRv܇|bAussX`owh뛳/RD7w,I*̣׋ilIyMygJqd (EUUW޿ꗽQF9tJ0V0#t4[m"U.;3Ic#Rc .<_#>3nO% p&KFJifs8U{W%T,88H(i^"$O],Fؕ:MI)*L:9ܖi]R=d L*m[􇋩Oji`q>[VwԣI.@'b$ "8!X/պ*[/o<)jiQZiÎ/H+L u~Uwdn7κ_aE#5|zޟzQۍ'1) K%vii=1򔂼~J9>P NKqӔJ2E3DeͶruqWԻy,?7oݧo&v Ή/wbg*oppm7嵟<.H[7Eui;Q+a;!XYyQ^?h eۢZ:i 5D;) v׃sO=҉#<Di$D%1I١@!9DEqIBA30ۮgM^ɜUY~Wj XR\gcղ}\hbAqsCTBLfҳry(\.JhUEf庩ʂ*彻-ʭhupd[;zqv U1db͔=~)]BZ;!}ha\'Wj@EpھF;ɋb[7M%4,Q 9-C*Idܵ{w`BǑL`~|#LҎB-BHt"hM_D9rpDc? !9<f /އ$\=V;±ޏ0V{s"E~WjT endstream endobj 78 0 obj << /Length 1159 /Filter /FlateDecode >> stream xXK6W(>vE@[$w~$%ua'Er3zYFn'&n!z# -f9Ad wٯ]Uj 벦,m|̈́Q87Q%ʓ&cxiGh>|q•W7ӆp14%YNޞd %zDO Qc$05 ͦ+)`f.6:󯲹(9?"OWlxh>DKj|P5*@8[^߶v g,B.M5e*3bWfY0kS4Oo!.7հ?<(:P U;M$iE=WG0oee!Gh22ʃIf)G}bd7Бޑ(!Jh=N"M"=h<^RsrT=\:͋:|siR۟9)vTݰ*A}lRQMMu/LUݕ` ڎNsY6[Imq8֌u`xUB2GzD'BE1)EIUiVAe-_Z&iRilyE['Υ,!c[if΍ViP1%U5g bwZVǐJ+AI)>JRQ_6e &B VB”Iú PoK9yʇ6M"1JkM,^"|_89Rr߅(vt.Ip]u\|I] b,H%gӈ (-= Y,JaSųK(5(ڎ!$4,ʵه{'cV=a. fJKGq;4B8Ë*آGGQ&4SKrW髋iFޮ3 endstream endobj 70 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpIxNShR/Rbuild7fb970ccf15c/GenomicAlignments/vignettes/summarizeOverlaps-modes.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 81 0 R /BBox [0 0 612 792] /Group 80 0 R /Resources << /Font << /F1 82 0 R/F2 83 0 R/F3 84 0 R>> /ProcSet [ /PDF /Text ] >> /Length 1902 /Filter /FlateDecode >> stream xZK7 W9z, ؛]&-u撿_>4<?"%lÏͿAaLfuۇ៍&Sa;!Aq0_o6ƺO~kgTřm,8!VA 5O*XbfA <04bh> ^[bz$l=@jNgaTԢǍkXP ح9VMǓH3K S(xI*6FUx2;='9ÎM; U DE)bYeKM(J/KJqC1YP -.󞙟R]7[j2OOux^iev^Y`lt٤"Ǹ*D`OÐvwcr;Iv,’~$G>]Z1Jln ,Ch ԐujzQut@ .9p.QWځ=L>R.;A윃Ʈ䜨έcPvиNv+.цW.q]~g&cCT3eޤk9VTFѯS :a.ܣ:S,PDhX]gzUt|r@`}5(QDcDZ%- tHUjpunu aXSQxWS bR\ @CR^8a7YeL P,vtK endstream endobj 86 0 obj << /Length 295 /Filter /FlateDecode >> stream x]Mo0 9v@HH 4B~m:smO$F9;aiƕ_eI6aM?KCnn᫣:x`ɫSԄY#+Ku[Ҏk]~Y˟X)=EN fJpBQr,]/?[i ە3%8%"xG>l#Hu<o"ID"&{&:ҟ#WTGNq ;]˛sa|0[6S;3* endstream endobj 88 0 obj << /Length 369 /Filter /FlateDecode >> stream x]n0 em˺w)BZ[Fm ,rei!\;X*]hDIX'1r,#4B)&aV) \|d f|@.)LҹyB.c/??z%?9#J)c):HOS+?xS;͟eAm2'jl8}֍ v7;8a=꒸ endstream endobj 90 0 obj << /Length 269 /Filter /FlateDecode >> stream x]j >aqB`ٲCд`t 1}uܶЃgᛱtѡxV訍KLڐSeExY8RDm-ΌiHsKݝ/^fK~u f02ҶT< ,f(PTL}s@9e" ^ HXK%`Կ\ɲd𱴌Uu#će T%>fƚ:3O|B,=jd1gt*Wظh7M .|_ endstream endobj 91 0 obj << /Length 94 0 R /Filter /FlateDecode /Length1 29464 >> stream x} x[Ź9Z-Z,YeIG:lKE^ǎ+8$'8,NXKh-R(r 嶽 -iP(z9v }}C'3?o3sd;(Ң݈EBX C!l4/*$B*Ͻg![O rk#`4z=B@b.RBm{/ f7 E?\.ҿ=rXœlu_C쮱X M!HDtS>"d|0<PA ++*uFKoKȎPeH :A6_:fb>ZE[aQ3.B]H 1a"9NCGmYX:nA{p.Z<eEtLzF߇VKh-L=s }ݎӑ z0z( Q+BЭ@C#G%Y _A ݊BSxN&OrM`%թPԓw7%&Ы2o@e8 (at:FXۣr|MOD}hė9-?!; `}at/=Zv|}Uf] !q6q{`h2TF!| >:c?U@ ]Z{!:^g9>NUL#qso r(_xn_*P'>ZR%t& {`\/F:rj+A*f} gnVvx: ^WjcwNA[^<\VZR* y\/qs.#Ǟm˲fZ&Aj*B.c ^.M||kk4D4&8hj9'R4\L0>)"&6p6X5\gM<77M|78Mv 藺`pYM\r͉{{!MZ#M Ci5%!l`5Sl9a 69ҟ\dw oI ~EB(NP4&tn*YKla M SYg@u^;9k#ս{ov-uhX&wo L9bzfcJ`JJ\_o&-r 5{i/&{or'#(ۻw'|w)]75c8۹=C(Cz > Qt[,& \t*E޾*@O7Q~PBػPCmæ{kwo ϵMs~8k]lћ쉖u"qM=,˔ha?Pβ*!eO(M){#J!a6(+`xLm3`nc.d; G@lfS'ݭ]YzJϧ?Ojck1f:sz$'_Ots&wyә2s`9<?W@sX=|ՊR`]x+b\W ŝc*ҥdu~2|GVSn8Czŵ5OIqqi>_nz&WBy::OBzd={Pb4gfVTþ<_N]=y>)k*ÿ̩^mտ\la|u&~f}=\ܡqϜyɐ['=N3(Ȏ EՇ4jΦ愪 \kW/Y\°/>.6Wm?w2/Fr4+s.),|y7i9+SgCƬrҖ !ߜ️%M35aZJh)ްVرZg< ! }z ZNjX\5:G4Ȭ ZFjtlzz='KD=4L8.9Z-Jj>ޣ<%?z/3ʭS {yylƼ:S+mwy\*sm}@}f \0c4EDa BsZ7µ=e4 9 eo.#,+(~`s1\> amdLS @+RԌZ` ZΥct,D5夘0-3BpŠY1rd\^g) 9st*s!jO-Q;{=xNS➒bp+2>"Q_æaӦ5+a /;c䀹yx]:>CnAz:i"UOSU vZj @X/òl+Ţ3äg/<'zĘ!.-4)֦56}8j<+`{:YFaמA L99Ò(>{Nv-Uuƫ*ÔV>Nl m?frM+tc}ݺ}Y*@cJPS6YI6[IPw|{tϝzX*k(ә}WO<+_m=+/yoϼIfB-Tԧq&N3^9dd]v^I#JjO4!m,m.M2&ƹIt1)v Tt[# rh3(z)VϼyfYp7;]Xd~D`XkId W $kRen[B>>-C3f fr X#hẌ́:aY.8䚇v,!%gL˔ٜ!hd'ʘ8fز;.w X ^i3zywjX82 /ĕVyx>CCsݗv]uh}g_re-܂w?9EK pХ0{̣AK4kʬM6YYҦ-#`G=;i5^T&V28sdv_R>3Z:B):;w]2u(;)yBƧ֘1?]I;*USlh)3ÆE?hl:cX@NTrdZsI.S.ݺxg-98 NG=7#~qI%ŏ T`G1{%`6eu CPA+5g5y\+ש ,ڕ6BZTBw0. S؉s) _Y.vWv6q@ٟg6ݑWI (MNIc]F0Ybr >,<^J0ׄ7GaEؤWTJ"._p|Ots2M\' YaJ0U\MsJ,x=)30p>h 4h dH\>E)@@9F vҭ2End"өwΦ~71A$SDwo\NP o6~42 CB>$ZA̹A` XR0Ԟx;ESdq-û/zz!2xrqxIp" \E]̗4Ԙ91Ɲ6x_o)^^;x[pW>zhb0/ VzoqK_S;veU$~u|G^5V#~Qp!7_PouPHp~5;12v>y,׈%9Iس㓘a3X;ÒezۈiVF6B 8#G7}+)UJx|ΑǕX`JW?=H΄X~j jcux5&k5ݞ{&s~ʥI ?=zr_|jYZa= *Ju~/Ҧꦎzk,PDNdNmEuVE;ݬ"ʀ8Ko C1 E`k7 gT;&A*6+\L%spq.ŗ -M(ېdo)U>Fe;; KI"Pxyy ˗[kf<>,!fAH7e/421@aWIfWr&1Oϩ*b Yp0)f=Km^|,f(q}yEdj \;B~~*Ll,veטrs ű=rEo>.t=۩o}A>T098xf{ :ʮś6\>e6pˉ_'M&VUBة6 9^WPѓajJoy1J;8ېcza3u=VJT"ƚҫ1:Ǽӎ}NWzE=}[4!-"{,MՐݐ^Av 9zP{7GJr7+7vn<'ßɌr(2L2 fl0rD 89&qҠ2!)3|Tӛ?!Q/1&.c85I' 0|/s=lͻƺu<¬ars5|U6ݓrsa1ooFA%C8)ll}[`U=\Qt#%ƴ[[nޗliiL(,wZjr(90BG@ 7(XJ,%3`dV5sTU_ڬ&KPkL=dǔ/)z娒Q <`Bh`:/pg@Ɛ9?pLԹ9[K z^"d6sFbN=FjPd{HB5kk;x|-<1eV%W>Pg)|>m@$#\/]a(OVe>Po3'ƙ+.\ /97v@RL.t 6\BR@ŕӢ6 {^W>uוBx]ỷGxa,^W += ˜2@Z[ilRdg ֹVY՚׻ޟm;mێX^s{EA ҮcAV 2אUTW4p/m8hH45!Ȏ7 7y+8{{!\M9ɻXN `Aw pyC%vF'Wr|%"'V(l'BR'kkUS93ORV)1}KleZ6ZQuhZU ,ZiA=c+ Bπ;ҤBY,:JZkĺ^7H$C5r솉4W lgV,T|3tl3 ;&s  9yA9dwʡ)|Cㆍ:oe~pX<{&w}|Z4;K/M ^m>^qP_  6SHW %2Pu) R^GVTkJIa2*r}.nt@gJ")f-R(ΰ;K0%BIgXDu&AS;=km9Nu2pVrLAkEQDB-YJ$zZ|SJL^Af9m×[U}Nt_6PՅtPBt),L@~fJ悛V{PK͜mtYp }tcw(ۖ"%/ry~bH[rڗΜ.``Ŭ`pyἦ<6wɏf?P 9e8C#_`- ={f(UQ ~I8OeQYļgiE2Ԫjɝ'zGUL_fdk*1/Ek_75?ؾW4Ϳ-i\uet9*>˞_czk:ܓuYn!zivƚBOqoAKo7~ܞY_ʦ?7u+-gjE1)\st=ߌ.ZD܏QQsObY j!t@~PvΥoDjT-Tv|by.h=$وVB#P5{!nBfc't H0X~ ,<+ TKH _H]ϼ/in ֠ կ$XԭSVW%-26|_1K0d̢ cːxˑx+P^ Va$X2LFe/2La%ы.l? ڵ$X mRXM`Я%@Ǿ\Af C ZA?K07!ߜ@~wI07 C I0 ӈ/I0h7,C d- R8X~`PqN (cLL " (l&K0SNa /` seR'$?KaOI0Ź+%l Or ~{(ߖ`/Kl  Ha?OQ|DI$(j`_"ʏhZI;OTI3z)yShBc(PAɡ!m@nGhR\P#&&yڇ(-0&R -rơ3&qbF~nUUSTJ[`0`V!NGz1H穣Bi:IqF-Wy?{yq#kF:[lqu*9t` 4 >1Fxqٱ 5m8\ߥ#>6AWZ!5N@A%pLsGk| =@K8$@5Fy} O-¼1XQjo'jCM)2%aP-?N9I5[-D,H9P"wg1Aѵȇ@}/hJ24#]ɀ> 8mPZ&Q3(P]$an E)_#R9"vRms9*IP3%REaLmA"ֶR9EstsQShJ-Jm!Oѷ#Pm'|TK%,hDtdDI8)zDeFvPC2VF>Ad=!=m6a|L\ j9]./ڥ()+qE랤)MҵsvRZb#KJ'5BI:H.BgO)ODi\/HqO.D={&#ar4F%;$EOsNŅ8uɼ$vSIO,/.bO,۳-a5>[/cΞ bYQOГTzDZv)JjL\W+:k?P<ŖFiVG>,eQzro( qhQi?=w_\Q=WE>$gaY@O Hý0*nA^ ܖÐyCt!j0z\ wJ:Í$BwƅЇnD܆(>:2&qtblt"ƆH&bq.26H<tRe 5Dw"cщBnf987 Ź mqܪ87--$0 &0e뛈Rƀauh$2q;AXvP79򀡡hUĖ>ahhbtr 腋^ĆvDaQU&F ;&&'`Y6"}1nE$%Aغ8HqOi2FFvF'ƢH|<$,r;b)Pm`d"cZ|/m鏌Qn+YG0Y0薡L<96 H;QLetp}P9deh{dkdH4&ZD< QBG&%plƆ#SbcD|h0 vY]dNh0}8=NMh{lsqxdwF%!k6jYذa՚nM zUcsfa 4]E! PH c\j "75:IF@4YBzXazdD4JVuð(ktK< i;q@AI |[.%'D4)y/Y`#܎$ )X,_:</>/>/>/>/>/>/>/ {5Җ舕4;r\oCנow_#ZQ>gGlƉX4*?\N$0IOb=Tk_92NL(UrY|ɘO,f'F$K|g1ۤ3O %؈~s1x4/7 1#9;\*B(e2v$sJmprANfiJX!U"0Ԑ&C-H 0h:j&ǡyǘ0{fFQ*4ؿNH J$iH LKDR࿅8HY1 Ǵ.@"oddLtKJ;og؟#Ai(P>=3zCnMv 6-v*>*dhN:/mHc^AQb8<.vݖ,uqG{S}cF!4XJc_c!3`,K;BJfgԺ Zv9 bqIsy|Q&c W'-({ wwRUF]z\z_@3*E >sB}W/o&MP͛774"c_@! HN%AG(/=^^0ahjFN8"iʠhWhKcGk 1kVQ t)gd/j-rQ0pcnj*=TC#={ KA: >H!Ih` fH,wΤKGMtdz1J՚x(+gX{m#Yv$]$ &3U5G6 $բ4ΤtM1Twl-u1%_c,nh!/1Rv)tR Y 襠Rt XSJAbAmH zH =$$9m@{1 ~H P AnH Azc0bwCJ@z%;47XQ!BmB FxfeiôQ% dUԻlZPwYS375eWXMߴ~;kܯدd5haCx [Xt fA=VR[ujgҋo |+ ʅ"skl3;NX ` ^͘f%S4ٯ9Ih45bNq\qRBީU)v++(.eHY@ O@bnS@{ ?Ni1Z y1 @7:$Bm B+x2ȋޓ^&2s 5 tSy<z!y'xȋ <+ 6;!E!!Қr$r}&t,s{ X8"3 zv {;cnK6ےŢ쥆j. ;;)B)~$ ?8n3 xs;<gvA.AàLMFiy49dr2(f"I ZN\/hxyݏxݷy]CsB4 ^ݫ^S^7ޣ_#%Znʇq9}^t?t?twqnNW: l:5叄u=ʀlI=Re|1ұiIkUӂq'sI7@aO";>EFfWCp2q1ڤtkB y_I??(O8x/9]R| 0@99 _G,#1B9lGaTs9N|({W,+9P77C)(nOz|JVe,nd;0lA1l/b[gP %N[! ֍rI{O/Ad;I !ҠBp#9"$ŀVX.J69*2ƕo* ~!'+9P39 2YM2eL !\4@)!aY1z_UoPtݗ?`}``VU,K|]r]Sϸ.'Y]CuAXVovS?k}9]C]Ѫ::@G=]ТDF(g~溰{ x7 H* wJҩ4L**]UT*JbTH3;f e60w b(1mW$*mԺDU-켸_m>ԶKik7% 0 +9|v ]8EF\g'quwwY:cuKdRtsj-m8H98 367adבv< h(cj'1:,AÇP]"H4k(&q){nHM~&Hha-Ҁ*!_)^{;_7H,g}"Gg1o 3wtWoBMܴc0+{ !#-}D;hSbo-.ҽo:7tMf>=ӱjn\jCU:?{tw\dնnn:B+_k Io鵻Wd,sg]eT}HNh $l6.piҕN+en>F~g55|Ic1QYbG> stream xy\8|<3><0+;CHx0;H!a 14Xh ֵ5uKCQ*ZXf~*moU;!j#Os9 gFz" ݻҏ~(Ba}a>[w}+>DCmOW!wv\_P#Tb'AA yߎ]W|Qz䓐3GI/uEe"!]z?= #I _;H}:ӛ{p{0<bgXN$HerRhuzCdXmvGŻD7CX\ȎP= v"3?m(s*CV#5ڇ_Acb2d"t'z]2 &kqQP*6MSJӸC W0Qd?Ⱦ/b_ZyGe?L}h+z_Fnԉnʸٝh:~jFDoN~UlSٷG0ꅑ>n'gEh1ZMlŬ ff_VxDJԁ>j΢/Gy IքFЕ {=Ÿ13f;OӸ ){(9[-fQ E/q ܰdjXa:^<~ t3́C.RBU =h/ pE->#r]):h@Khƾ4&yV< kv|߆'MF̸A8 KB$VH&yh PXCel,b**k:3̾=$ eˁ#aŸ p/|yUZ˖uz.C.=\R%zD5{lSZD (*C ?@v~ix2*t5:nyCG/_w>}Hufxď7oa< g1ۙ๕9ͼuv{'79q\VT эůHB0=S46Y4km/>1;Aa'w@wW`H{AZ_x6-tx<(,_?H;`m'y? O[w 1Â4 `Rzf9¬g;3O0{C2'Ygcl;~} O\6r۹kW׸7E.QhыbLA|qHĒVVUHR?h`ݧ.Ry xHT]¦EY7?mXf؝ٯ˘x#<.Q5 ݄7yg!IfgT3r׈3TS̷kkϡj=-=k0Ls#̕G}@z/anEO{oY/ *\Ƥ#qgMA_D~ O"bī%pkQJ0}?`'q1V}V|-ďЕIYvLtZ#hdA??,آ7D7FZD+oٌG%iP]=A2h_X {ab< ;`h&'󰳦P#57q:AOjܗ-SlFg)% l6TmArQ<=4 \^ 8/}ʭ{[rXaب`_F}Q=nm써#{oR>wOvU6f(•} /W>c #<_Aޔ)2=<@`EϢ]O@*]Ü.c`Bd̺}/EN .Y\:UUYQ^VZRLcHQ8 }^w9 vb6:FR*2D,XhwY'?+b$킂<-8Ir-XנXo?hx%\p3(|eG?;e{vnlN(^y,N*7{'y cn> yǭ8oodscnEq}w8.DhTO׏K4|Y ?:|Ӥm({=]ng0nBo>n${A~%ֺIc3e7 0s]q|Lȓu5Vm$%2R×wcl} Mx*{7{vo[WD:vI[/EOhu9PkR蝯mNt#JqL6{aMU$Ba5wVC^{~⒮|د}HɼA<G%4_dƽi- mڪ@|Im%symO !ig:I\q9~F?dhQ=M7Wߴtɖ|6X\Nx#N|0Qx S p"i-щPb;JO#߉86}},-JHHGE##RD.+b$nr.)tn0$,.u7 ɥJN0ثT1 6Ą& `0`$( cNp:̅bH,ħ9R{Ļ-Ϸfjk9 ];SO%:} aN3siq ֕TTqMfSi]^ZfPW ^o@WE`cUr>,y:>`Q]${yi`evvUo+b)I5LMKFcL<MNOpӏJUJeYY3x;!?LTN!?sc3L=#pƕ2NӞHKuc㨄J9 nU~71LytHYQ[;h3g۵Ӄ rPѥک %s d~|+2TVUT1bT.enat4.{D)LwhX큨Z\ "@"EEEW_}5ofZ=:nωŰd̄&OS<,lZ%I E+@c)RM*C$C*T,uE~6P^VYQQY^*J#)ꠏXE*w|~Mj&'Ə^fC/7kJcMz[q5=Ұjt^^_pFߡmO:^R8v-\75 $kԊrS SýןB:ew0Lm᝺;7MZ`-ćlE٢Pv޳%haMFb؏a֘&]p`6 FQ,F5 ӫld#$~WJ' B8sWj Zøapp 6t:9D|b ~}Z; 6s,#,֙S>3v!v*R@r8RQWziȽD67}r(fs/xۖC[K;nSߊ@/P6ފB9v⃝tp<ȕ)*] ^dZ 8 _(čA~".r\pdEGÓs_oVØhy }/ۉ5!}B!BȎK7~/Nkwht́:MsYN("oI;OHn gsUc`Q׵Fv5r;ҶFu%v쟹{b5#YS*pB &KTKFyrxR?a}4XXlv^]+>ء:@+i-ʭ.]Oegˮw{.;v{e.`I-V,-|C:%=-e]|=>fVwrv3]Z%9=][CXq2i4RMw*+fdi,^I/ mamA|Xh:#3BK db*;,#1xτs<k+y!2Ҭ% ZwDTZ@^#o!SB5)=SYV}עw-tJk|J 3`ߵ!pd:2'6j`N')`;4)Fk`MlBb;J*H1nZ9,֍ ؋ D8.v[Fg큖l(gZxQ"$z/3>xn.od)T7 Q#~eٷ ߔF&u&!͛vK()q \xTG_sO7ΉwT ʣJF9(0i ؒod];Mul.NSJm<6H2<fYE- PܦAL٘˱F*:ƐwZctŘq8Ǵ|L.E9͛ża,9DRp,$L#jH5 b 72bMB<ٺ5iA-O KBu5$/_eL-^-h\6cBg^ٸRg7 h.K:.|>j#+lZovT l+ pF<u̇;}iߘOZ}@"Q+%%e4Υd.i*ĭ2aGvOAkt7(JBĠ̒]}9IMm9STYU>IYѦl̂[-ӒYYYD W]$2MrҜ%C8, b D ]QyB-**Ykql}}.8mn&5EEf3PVw}1[sHXB`tX8d,t=bu܇ J}%UPc1X$*=W zAyRs@394VӌE9#3}V3' 8nuaKeë܆Kg*\r/L+_Z;]die +k_TSm'=U7eJ"uڶ(P^YtP,-ڣ4v;YCV`q]wXns|[p_W_>ŕ.[V"A_Y˹*(US3$ݡ?W'Wjnu. 陙3p/nѫ$M8犗+ K=kK˚5ŜΕK‹/i;qhQt$a{EM.ŜUƆ~$vo%s u&ڴ4,DBx`iI0֤;zej،=VtXUB\zQ)D|2lv\Jǿ<{: /?Am<HSEd|K/A;?.z({sߛ7B[]vۃ]v۫qٍn/*EZoz%ƢJzdڒ6l+T)Ԗ8qh|*~:ƣأQO':4^y_vsKv`t}MDs (6JQZTvo)ʛX8\!'8E/Bnޅ0oG;}J%CNM`W^9e3ϔn؃ͥ/Oh-ԕ-qkח2uE*0O+8^.;&e%/ɍ?z/PQ ydVm1znhxd}C]G4Fݏۿ 3"Y%^7Z68:NKqXaL7fy/$/Yߖu?-bf~F׍W3ʞ@1%n ' n)11-θϹUmoi%_&)$hA$B>UX*w)q8d -J"u4Ch A2RlؘV>jöI N91Fb'łX$?|>=3egPG;#Az;K.U`Irܦ' )VĜi% m*ADs u\aW߸K_/.r^ŗ{h2|ob[o`@"`rz}sv4:R>#_D8Ү~J{H]ŋ^<:$ݧVzm?eͥmee'l(7az(n :QX.mb # E]R쒏əN3r%aV`)3Ƅ9ܝ/6CEyjjm '%*, $'T*x\ͻς}a zUf,Pr}ic%9adW`[`×ސ~xUEĜj孕AQuZL޵g% ʼڟL};}Y&Eq-iQ}x[yͶ~4Ƣ'!{u?<-_^ si$^֙JtMOL%$Bb4 ]M"Y!|R\Q~`ѱd*q.<5"{Fh[m~J(:?,yJ"E@j*NC0hs8 \ME{ѨU­KzcitĺLc&NUL߹Hrq}>w#L\$4lbpҠ? х($H(U"RF9s|7.]p3y~tmg}-b.q1칸;Sھl6^?P/7ҩψݕP Kn4` uuJ]Ncң{c2X+a::"C~)ŃwJ&Y::w2NoƑV-&zX*k>מ<ñIo(2*zN{F}2VW\+`rԘPSj}˘{C NyzwgstMLvFjO䍣,0ƀr`rr[ ,4vdyK/ۋRl48LKɺ_CKO m.sKW\x]='2[VHCYe0o} !qt& 8$lbG۰-cmpfd>xSv (< !"F$z[v.@Xl[ W6 pH$7Ij"T)WHĜH|Yqb6N8͏ lrASG|UJd*IySojWsk33<̠fm3 zTܹmr Isqc")l.Y;TK7Z- ۣnz\فs6cO/?3,!T]vqnOw{]%nC.r1e_^f b]7x`ޓ=<=g;\w.hF8NPoanq;;҄Ct!v &]\v+xjIfJ0p fu^õCLIc6"NT#,Ȑ(0W;. 7eex;6xfJcݫ ( 럷Z3/;ѯvVIZ+??w)ՆKBo؉MU(GQHÅPXi-LW= +*ltX;lvH%RjnX1VѤiW:N^8:Vs0PV*U K 88ɻX֤3J-._ZQ^QI11R.^*W\Zzi٥VlT Eؠ zQ8Yg |wHHܙ|(1z;skUv4؏W1`C*a/pٝΧ IIHF.P*e h"b*1b)I :-uuoX$sIףΈVeh?s< Lay2,$=x8˰%oO#irg8I%"f5f6~,Hi>?Mv8w KJ "*+Ea 9 $!+)KBp,ըE~=M q)׉Awy 3n6vmwko#9#h0wTX4).IB]׷?z"KƍM~vQ6km>տc6\s6re.YRڴۮ[/-֙kl:9|[~\nu%Si)]5[b*,|ꆕ׽ T_MТKo\67_oX*%wٳ[QGm)ky?;}tmۡRrvW;TZ.W@4 l0?h~`@W*-h5n.- 67HFoߥ4?}Tw 3t:B" Ye!q\׵J6Zֆ)ho!07]o>`U6WWdRpf~90N5Zv(u"\ԸNk2{Ii(Of L l!0)H2b5^Db-X  (~xtaHVr !E Fb3rGR , MOOްwK`OZ1+~-+kŗ$cɹB,?( JA`!0`@l0!}a: ģs):&wakԆOO%ڦg΂NM[Pm9k֞'a:ٴ%w}GsZ(pAZ"R怹H1Ki grt*-P&NBj  0$1 cj]m$/ǂ%"/rwwU.tsËs?ʍ޿Q[EjlJ}_)/1{/hu5{KVa&4˒>?gO,ScŬLˢ(E*R,m-Dr<$wKGKŚI ^Q-ϼތw }m=;?zaQۨ}q(v$")yRk*;Lְ=zN_)U(*RQzEꇼKΡ K9t.wlG&sIltE9a16Ri}D*=zϫRp MDN'/>cZȕp)_uuO"fLj&q` ڬqKG|C5d`2<*otF_ΐnޖJNb=Ouo.pW$RT9w-篵g.6G(:ĥ8,u ^t IHs&b{_7t76 ֣(s=K5fwzn)[9r,(ބݾ6B5% YSXײ6bFT4RJS_ID=Ekʗ؛KC*j1a =LOEy=sNh&jU0 pNЫ``/39^/`9|&3tFq+ύw*qM]tEsNWgWŪB)7|IԦ;xٳxG dFKOI U+ƬǬX@)F0lx~dA?ˆAitcr$_y8hn)Iq0cX b bc $T [0,K~oB&K($ɦcV>c^&fm{ 1 pd`K%V(z̸23X+hcBV >1|A B-dv`'x0huh}|;}w @/m# bQ. 2|Tv\ȮS^WPѿl(!P:VB .hFFtc)93kH*Ta󄪧ՌsӜ6ACUy}΄T0)qw*119H9aZ1BM+ NH/;>m-[>[[][Hu߯XUH.`ӏ4`Jؿ(\(*cO<]>V.qX(˙r Slvjr҄N*4Tܧ4%[hr'q)HңW|Jc\p'8t,T,}N?[[YmhPԃ9 oi /л7{KS?oR+.2ry\6,+ָ_U6+M ޻𳳅BϷ%"kekV)E߯Ws*qu$ OmD7<vpC~IfcF*L0*-5BPA} |y2e h"N!% -QRyy-D= mx1GZfK؟p;EWD_k%zɟ:dɟSܯ[Q7kJ/?iYY^jlkϯЃ6#3LՁC)]nAr+0FNci/5vaEyїYyXz%ߏu5“Eq es~PJS yȓ6Q7ztCreiw9)C=Ahϝy?c-ysr>9Ipnܜt,20w-+T[4羋9#Qi!|ϛ;!94T*s y=B?n_~#TFKkv*/Gy\/x)]NRsoȜM^tOӄ]4l_^'<8Ƿ/J=ŶsBtuf^K=N0ޜw+yZ@ۜ=B)N1^ {W^KU|\Цп[XIQœg7`59KMC<|F&\Oޖ#wB ޼=.΍Q>樕[pޖ>Xׇh T ymk>޼%379?GN*!8 NUP$d0~@)W~ũT2QIm1<įY߷w_ӻ_;k#] ?T7fȤ%>ם6PhЊu?!~}wWWf'?߮n}aha5|˶mqkw?Իw4Ϗ؞Jطot۽fu]{Q~c_@_ݕ= d--Yop!(wmx/34wӽ]yIsek\=VwP+ݛ`;w}ޮ!woޞ8ϯw@֡{`W/?Gw 3F{SL/FmV?b ̇2ݔ[}&và پ^1ܻ{oO/,ptf $3пpbHzgȂv ptKd|%<8PrtC!ҳ7颲ߵ{ܗ#3H>~ѕ邾0p_u$ǟ4qxN{Ewo?Yp?־}0Ho\v7#Grru``EhW+v" ;`29 -4z]r={z3}dDb޽]yBAt;w'v 51LX!;2N*Î{{$.kZ֯\nʖ5|2~5k׬WUrw7 wP)@?fUZD {*ȉ,.wm6趣 5u ( ܻ{D r/ޜ& g@D`h@3;p)% pᅽؑSͭ֔ׄ ]PD+灊DƷӾ]==}dP%J[K>T߮vd_ t20(D>|8 4I5Z00 <& c㇥(wwn k4ذJ2WWŒeɤL eeWVJ/vݿ݌$ȣG!1 !qVq9 oSen'wqŞ`c4'/V>yɋO^O^|b+X'/V>yɋO^|b+X䋕n?.]C}z/y?f?ysMrn1ĩf :_{r߁,Ze#8>e0>xO>e8aZ> ;I>^<&VdF 4R_r'BG!%w ;Pn6i/{o8c&.myI,@t+V`1{ Og:i r)kKyZr HH((E_6WثU*hsP%|CW B!@!U!h?IA8Fr^c:^>rm?JjavIkaɑ 9"|!m{imIRhNvOC`P>e pl/z]vIv`".ـϳ%U@$l @WvҲQLD˺[˶"Vrqub\18ħgĢkwQXFөH+FV+ AѪ$XuV k!!APγAnt).r1i@*iJ5PִB脐׊kH Ԫ*ȩ Zf> Z! NbZH_+8ϒ0jjJDzu xo%r?W׆jބ?JϹ.+亟;WX=j.D$YBS&JMb8,ނ" .  1(} JC-: cD@ב򣴎@?:Q]RnXQAi8ghyK1ZNZ #Jp Uw[`nA: !Ы&b48v oopME'P|t\'ЖOGP >Zs g hx#TEV(V8rPzjqA@|"b ?{ ]"L G3tG4ۍ=cwQ勱@qgg,gl9%]g˨cw9{nK#-ب#iӞ]T4(S )i^@Ϧ"LcM@ 5 h8P&qA=F6L 62LTcHJE,"%*!)N)_f1=U" TJpN> ;wiƟ k[ePHAl,nnvfkw MMH˛VjVt^S{r=Uj+q tw1\su+]K9TN\IB;0sjrLY[@RTENt֮}`z> stream x|{|Tյy&ɐ9a!dBy"` π%$H2̄Z+>ZE:mJm*Xڪh᪽,Vܵ9y z{~s^{zBB~ap{=3MQq2nIw!s{;/(7h]7ttPiye\ @r1;Ǿ}mAcz.gNl4ED R[^Wn6qv@NS6{8x:x> j:~4 yRE'3l#Y=|YMģ*'<9~ P ] p`wIjd/ÃK+H{9\  D>Mxgm̄JX ~\x=ed(#rWGc/:r ^|^Eo?q7 π !! "tDd B=BQ.G$\-T*G‘Hef{)&Khf}> $!-=0;$Zs&H\XW!auchP#~9 k5`-J(wz->[bA|Y~ +'+::Bq>mC{W>M OkgĠG!PSɷ[䏴n? WB7O?HY@VoNr5|C^!Ǵ6M) ?F knܪxqkcDnUסw~8 o>|H4$# |k!ZF3L|4@w}(>gB0Sp B$Q;yF@Gڹ@CSKym[zпrν7c7чVQz>;0➆I4Jr"rZfH ^c.S9iDm\G )r5 NvE}z!w{2M-=̡m_vI?"ͳ0,@Eț٘aVNAKCP8 *hNX宬tW,|aY邒‚ysrfgrfe:ffH4kjJrRbB|c2:F(GmvEc9`gJGKX®4aI)H%JB鞠$fJ5)JC%WjDjG>zq8AI鬖¤E nivGUqN.6F!X8ѻ$/"5e)M(Tꨮ :a!^:-#iNnTyap,Ǻ8 Tq6amUXH> *=4|ۨZ[\m6ưib<,.[NDdjih0\Xsx&)Ʃlj5p.ͪmEַHȍnkj mRb0dG i( Ŏ-pVfX`4Gڶ;WIuKG6[UhTD'gX &cDXJ(IuZ y { ~ G|aCU˰aM! 0<ǣh85.W8' }2.9GkBJ,͟|ZZը%hMw)L[ȡĵldh|dbz#y/&ΉXsR|MgY$}Ͱ׭qԭQnQm[0/Sp|UFU |r1k4F,n1*yj斥Jd'FΰY.sMo/֞&^!XpqpZaCCcT3g4rhMV0.90MśâsNn-&ZT;2 :$cx?}>?[28kokB[u9@ |jo:XZ(Fx@^9AP7/R\ʗ?-?Wb K% Gp >I<ޮvY  Pj:Ӂ SPwD(JQA"h6.\B>͌rPŕ7BKFb]»_s+5+{\;^ ""umضh$gSVkJN^Ԓԛ$$b4?`ff3`>6mbTۄrfMdckO鎢vbO*4gܙ9Ev]nNХ(ZϝXnsOAũs'*NqK\ii\鼹I_$k`1CaXtIIIs1S+\y /?;M&^8{۹wn1.Nf7Yz@'ƪGj%mhl(!3wLT5g)'4?$,gYN9gɗ2wt{~`}̔HR>z4f뫓=ٞ)*KsKs\zksM/Efe))!9?( #!ell:ۖS=fgL$F31BLMHf6OJ;fA,cM1{ +#s~m)9:vjJJ49+ef~AQ-k+T;oF[ߩOO\gO}Z~I@  sBߩ>fb~p͟_Ÿ"ݬE ) > IPDKH$sKK7A kn:8#s얛_i6$|Ζzؿskkض 1&kfg%M})}ֹ=m9Kwm-Xqh|FD,QP*m2WQF5τM":}E׫ݩA'ЅuttZR,54}z|%3!jH_bre%39-BK0aI`J[roa3Ļi^$?D]N}# w?VT)=;.O2I$>)J F IY)Edr($/2g5lXEktL"10HcѰطYK*Z`|\stKd)$n=z'"1VCDSrȅ Fkܦ" a"iI:@6` ϫd\M Ef-|{o.Ԓ#XX{- !o0Rєe*2U4 Ŷiqu[moB ͛咽?p:?RO8nؓv9}V+K6ݲ膘Mm1W]Ksq''XF4mt3w=tYY1[6@jLQ=+,2JR1'h }>%4L~c̍AaXw V*4d[yc?*7z_k07`ɝgb\1ט+JpM7|QE Mzӻ#.}֧?deеOo}Gӓ?=[vE ק[C3Noqx»-[U/_zנ.K B¥2>2̗0zI"9K%抯``|XFzkn3KKb-ϊ!zJ"IH5x\Zߡ:8L~zpN70CōBGAv}{x ]7a#*N@ct*.@K5mSq-_:h5ߠz7DzHţ`^Ή(?&Ac /%!"zt0$Z(u#. >JyMG)WqQ'*>J]U*>J8(u@Gօ*>zT}dGٟTq#_GfsQLYx41W43]fx5 sUhǹ. 2XKBtrЃR$~ J8=]8?j?\)B2 HOo yP\bgtat !>k5Df,ې*d#ȣ [-B)} 0 `){M=zqԏ~rfOYfNRԣ&[Oq2{niCIB\"f ی& J>_'W mAz6OULZdRGL^J*RuLQ;H'J;!{xKA&*.I[ynEB*J$xdXἦƋW]ec3LNWT/q=W2¤pyQޫzP SGs8R{نڝSZ ~!"^5RхpM[ŇWf5~cܢ]|>[5oVTMVB;]j]}u&>N[^ (]8&sjpB6כ\M^$u۬||;Ucď%ћUk++LfyWǽizST4ݾb;n. RNׄݼ5/D/UyۦŦ }?n~oؖx l MLveԬ즠eSU|"5[G'#Mƭw{xdnʃ!Ŋ!>\{y u9.[?B8Vgi>˞ߟc_y0+{)K*|˛'U{B(-&w+-;Oj_wJjo:9d H>ofsWM6IZ `HmG !5JOHrJ Ҋ<&]Ay&VB}Oo.Yx|=lM;GZoť.O0y}i u@3-(n&[`P zЂh$_&}=b/Ry|8RgŗNjj`  >4y/*({`ЏB\)ԥ=4 ur3tml6Q EBrO'#`-,ee˪*X..[VU|MTduMM}dlD[E Bܢb\LAifzY>R(_{:"1Oji +F834M,dt,!s;qR.BI'k0z[C45EYq0'L11Ei1BΓuR3G ^&5Њ=<\O[Feg\KBu}L!dMA%Hyyw[XG.%%XNrW{;I<(_=Bd |*+$iv,V l@؎AXa+A3|-$UV^U7\ޤzBV+R+\*bTp2IHc^, = !@d: vD 9$H#4āRF=1iXV D8p4}|ޣ!ջPa'A:.fdxLjXbwPGJJ sĕ",INSQۑfGH.sF \ V" "h{ `NZy Ax-FXF(=:\lL_A2k^L_o/yX/ۡ2 瘱6c=qHDرG@Xa;3GqȳpDH9xHv cLbİ)tRs=dccck3bpmD+6 İ4sd&"UZi4"`|&2~0횝c:@#CCdH&CגP9 Ȑ !7z,@S iRw :B$CA2$CYd( I=J3FW{*پE(cZ4:A,"DxˍDL853T(RN| ^0zaeC"Zoe,"FrqN#P">W^Z|_ɠfe^*lt"=NK 82JLaPiw0qZol}|2|E:R Nv1.}:;̵ 1l>gOlяm'd&<Kzy9J: q'ppgƶľde ܱ+Kqj[5+lWb6g}.Rv3uזNwnQB7_We4]>NoF^Ջz}hsE*JfJJ.pPG,&uC^kg8Fqac1 A]Wݨ.:\ V~q7!w4ao> stream xn_AIڳs'm lES- tD*N=g*zI{+̹̹͈GGx}F9+mt}ΒDF*Py>qg骢}^o}3ΜFi夀RH] }xjXg`'"f3?Ybl$k}ݞ$Q̜Ƀ0avGQX1:x.lbl]. X1Vt9>eB0#9f )iU6pE;ȗB$L$Ԛq\ iJ&zQe2tTEU3WVԼ9Z{IuVu'pD4CY:G.=zF,DZ`m6yS1!wcfd`db!Jf #1z YvYڔ W.P P }r'YP)\7}r\%R[*hs.|y.E=;нΊe{xj}{$rŒ%`*\,|otmZٯ6]+jhyavKghgU mVE:_U7a 45SzyzHrd<с6 j12FuTaruA TZb@J"Eh`O-\mr' uF cخ/@4YXQ5R[5: TZPTIUySz*bGL]u2Ϩ%oc O3Xr[Qk}Ϊଂ^PJG γ=~F*6R+%΃@AMJ>:QY@dģVnG"u#u(OF3TU.3hP56°׏P>lzID h*+.PE.Vii}K54 $ uIeZS+:̣T`یA/ck;oyRdĽ ]bE=UxP~Wq0&5.ʾ "سܖ|n7lW -j,H:(5ղ,0ƾrF2-r{? Szl쎦+J[@kwHN#Ći/ 82fZc:I9cdSb1  A(v:[C43APhVIp(A{HHBY?Lq5{|}:Cרz/ٯ`iDõr༖?quMSZd[5cp4C痖KTwmA#o74Pe PIRaY^ἴb i b`76owj0N]~;)s!wXW]Ua>_՛괍a—τ~~'^모r9}W^\<͋w^( KE:Pڗ`a ,qD90Z0 nB#6epCǽ DIZYI jY/˻YHz+U@O.J?ND (lhFE TedUiK 5C6M\vXG8=Ow! s_]16q^Zͫר-.\,vJE6Pk2yi.BwU?vslT4BN^14'ӃXMMò]R[]"Dh Hi.yE'N!KJeowis/.n5]vl(4򪹏h.l|L nhkpY3 4idͣ hKL/4WqN>\'*o.m"QEImĦmo,%MUr+W7WT 74静%kwi3޲W,V7$iag9{剝&OSՌW^zk%4WZPe.d,Qp9%Qcf/nM:NuH$N,!I&y`Q<囒aͿ0 'P aG ~pō.Uʧ0{9&3ܱ{6tiFt3 cmd.!bصuGͩ+0h܇@?J/ISyc+ĿriʼD\(͙-Q'f>Yv>t6Ձ3BX,~ƛqRh9@m(ٞ|Ff!+1"&iaT$F/Љ[c}hLuWZSLFhRb I?ZLGda+/]Bɽ`Oa-o}d&߱ᄐKO/HPeO F}kfl H `> $sҼi\ QzZg~,~ Cq endstream endobj 103 0 obj << /Length 1594 /Filter /FlateDecode >> stream xYo6B'Y)뀾uh;˰i06m eW[td=,qjwC Hy~tp0 pps5FZRNQ@qN:-tv9*f&_/0Ҝ`ęZBA"vL}ijUV| ׈HЕHnPȀ!R ?RI(=V&p׋odHlV$*kkɌQ ae Tx7'1}1٩ #Hrz&Ljh{{;ie R  1©@Dbm(-{@(Jj0ɹˑt8˖uUbAo7]0įiG,w/6UzC]oBSpFT$`h75QLVCLnv;'# s-|!1vy7oo l/ٕ7 zhZG9LKxzTЮG='Nq<CXN=3@=Ӂg}Nsm3OSU^xaʐ.̟{\0E{ f&х16^Ғ-xXM>X.֩?u/0 UyhE! R2@cJH@ CY(ڱrixH(MfV2ν,:jcvV00c .AøI{?\߹ G鯹$øt㐉|WI\xi,}; /*ы&Amäq^@%!9gs$t/&+UN)K [!0R Np-l!VRY"^%[MI{6Llp9Hȡ&Tӱ꠾PzVgv/ 4a|@>s}& 5m$/گ\wz*bLZVA{=;SG PuG"uG׍&/D""NمÎ@qE?x:7Ŀi] endstream endobj 114 0 obj << /Length 2939 /Filter /FlateDecode >> stream xrܶ]_K"$;u3V,4qjCpw+6I{rIZ%5 \po[Ċ)zɀDBA}-XXNmޥ/; H,(U^@'eR^ >39j.O>:C=*bB#$ʣ@^?eO$C LOG\x<=ON@XP;jd2bBNxx m䢷9U~bѽ-HD!Lw4eɦ8o8!eL$(c`$WpИx-_e^ cO CKŔ&âoOg!cODz7LeI]'I+$X楝gKd6>RvbřKŻUMZ-mq &2d(p3dB/1k!t0]0*=!GC|&C+ɗ_B_DY={KÞcȌ:5~P!N+Aok$;H l00Mvo;VY2p…yib-,ڱuT1đ7~Mc'x#\ztd=cpsJ<GkZCJh$<)2(v ) \.bi$V3Ap(6)dAи˕}^FZnVoe/5ߣ33|5&s6>\d/Qll,uN5,T %Lb`/Ϥpc҇XS L DBaYfk8]( _ yJN`E@*$8:7ITS2\ReH0(T4$l6=bh)C = : (!m$_! DEYÞC^VTALB~&%} gKRT硝^/q sDޢօ#FеUiZ&QZmut"pq?\Za.]C;C:YH]fGdbxlG6ܥܥe $ i> FGM.s (k-@~׮9s Pv&p5L'2 1/YeB'3*CZh{ 1y&S8FEx`rK6Id*|ߟݗFMu1{|Vz{t b;ѬW4AD ;Li6:;#b"Iސuy{f (Qe공.>mM|:Z|'ȿ1K(6Z;/VW ꎠXCPn aNyЍ~f 3pa4<E.En3]., g !dϯC]+-RaL-ˤVAx) g*ROxoU hPG5* 劸L0ыc[]/6IZbz cWyehrX9'3t.saRyXmRsfsDbb>77ɭ- 5Ong5uMN \2{6DH <{VD@:ѵ +!F)H2.m]U KyY}Ev AN,bT\n6*d! :G`Lx0Y9\8DG48`9ý]:Xo,FT0FB93 6ֈqa@Qgi \Ub3WuЈ!30QQ >܏)+Q*q) _C$eRwY,6YpI2<IR* V(?!a ЌCC 0 =f qJC/_gz21aJG1 Ԁ x:MaD"Fv|,e$?/b~~bQ)-~_ZoI1iD,Nv  &]2e{tŗo0S \hp~79:䎒(͙t4,k ʦ@z]e46cpy;=xR}kj8>.!|1^a%wnj.~8R>wYkhsyFnXV&[v^Pn"?kTu=!(C6e`QvUKhSOmoijt[ 4;x0h؝ ]Kp3AE$B1v:]V C1;m"wt^%]9jUf&/V]:ggҙNj=SCW=EX}nVg˪Mjyͥv 5Ya8^(׈RBQ<Tޥr h_%6Aɓ j`@Mg= endstream endobj 119 0 obj << /Length 2386 /Filter /FlateDecode >> stream xZs6vn9 &@us?N&;!$$H8x"e˭+9̄u\:8>'&qj."愜:Wa6+FZ͛]zÁKbNiค{1S X[VЁԡ<&4^w$ ҙ{"Z=wwi@ O')Kp_aI;&oHho{z|pOޕPREtbp'p)U1wx}|;Њ F)ơQ0pS+u|M;G84IqZy)R2r뻳HgsGQ@zJ}ff˪[$57:>;;.b粻nd{8g,Ce'\q ?6 Y'"ՍʳV]㎷{. [YJ"vfm``ɞ:5#}Z&er~mʮNNwT3UI`D?5NOCM%?'!cvj Q{?F~,R HW*o_5n[F4mb R.?ɕDCpB㍯Ҩn9ïcB g4`a)YRM P Cbur-6ޠeK C -#H.UR/$$$[V^@nYf+`ެAZ{IR~ۇ1?wEs([bT`b.(vy! L^ tr@bw5 sV \AIZVdA.AƠ V6U5_xnn-+k_Q_GrEa$7AHx MzQVh/BE{҅Nh{}68{Qu6~hS`TC{Kx|Cid]'ɏgnּU{dipStR(,1pY,F ܘ}!'{,&sP%biÅhqk7SݏT*.;몄sf[^ic~̚V?X4QB.vX&KaQaJG*bʩgUNpzDYAk;{M<'0]V\vz̳k3)iW%.O_3xM[gM TY\iaKMBOȕ:P7+.Sxϰ ~ 8uzٖ0v=wo4ӑվZ{Q&h\\OGfb q/e rY[vsM8ݟR Y/Ѣ l^KEۙnENG51԰ kN@}OgFֺljYt͉HU95/vJZyO.G]w]髴 q4]OGu||ssC:#E$E qUy4sYX$ Iw^\wCIE\ڨCA+Ri =#dZV9jJ5.lR(X˗& jڅ0{1I~GPt%Lhr" x3$sc5-ju *ƍ{UciH䱐-M6/XEfH X;zi'>& {,D endstream endobj 126 0 obj << /Length 1007 /Filter /FlateDecode >> stream xWKo6WA6j|S*&v/&)Dd+l}Pb#Co4A&5W(b MH iA$GwUeq1kMX ;O>N ,x(PʤHP *|WդrG +*Q6cCDAޟ' HDtNGq,_C0e h*Y3Of$/-8?7S(F)1}+(SMel=m oI+mP\bS&)ȗ^O ە{I8R = J'lQ-8B$н/Hֿv 0Сs3 ]YEwp:C*4cp誥\KJ\;iΜlQ^6uGSYa'nH8/5k~m.f<ʝw} @/nW}4c5676́c\1OKo ]S7.HCtqvfb9`0 h{LcQYSƶY#euZ5Y],7lUc!ans?6u)_ ~p#o%Ji pRЀ^J NgkR*u([5I7Y-S7c}OkO.KAQV@!}/m-FJ5=X3d<݌:7|W&@y+JWk=hTn8cpE%PA'x  ."+J#c}. 3@Re?Ir"1Rr'(3:*ѭ+7imqXۆά]4kH/Ic18CW2fjL݌*w $(_{h 0p{gv^lanϊHêK()\tJVL4 endstream endobj 142 0 obj << /Length1 869 /Length2 2029 /Length3 0 /Length 2609 /Filter /FlateDecode >> stream xmyzpwO.2=@1 0D(܅6t@0( gˠ #2)V!8M @[Za,L- e*u'5hqf/ A <Q[Y$.f@ؗ^ ;zaKY^޻=Vuz[Y)N^py0;,еfQ7Jy볎m֤:%?لD=Wϕ4\{@HO7:lZ W:8"mS w]YWjRF2E6mn=rMnжyrVRU5Tl[l%i_0;]U6tQ7eMvzx<}KZLTtGd= $\QO f&.!hڐ$m9XvA].7'M6*^xdȜRΏBg=>h7d)4ؾ X SdRjR,؈ nqٍKCyZE%e}MU5$6G0~JXS`D5پ[eGxGg<Juʟ=$w^ohg桏P'ʶ_9A_ۥ|0Ÿ[IW{&]R+í#aWvjkݛC9W5@F[3VZ2=Ngl4?jaNt%@)z_uj>z0 oC\USB؇k2>fkQUY5& k9pQVoz*?.*PqR{nW9S3Jyz-B f rRJu%]_Z=WZ*Pڼ;Y/{DNd~rl~pZzi[>)zwy[/) 8>uBxu awY fӃ"2w8]Ta/|Xp9`Jdz\DKt7ff 5 %,mKrP.UDVy Ot?ɸ8ϱNEwm endstream endobj 144 0 obj << /Length1 1747 /Length2 5972 /Length3 0 /Length 6964 /Filter /FlateDecode >> stream xڍwc'{ qqP'lR"ޔQlRY n~u]y1Wc\4V\ZBJPGB-h?# #n))/EaКP,Bt~ -S@RR@k#?+>FoPHKp \Qh ߪzh$/WW]k1h`@RHc(x\ݰ0L䷼  ~X|Ij(? @%1 _K~oz<"POL 6QA) sVh8FbP7 KK @#.ߓc|%@s[LM[80 v@`SO` T@ A $%,>džH/#Iߦ H qN9)Z }NҀ9Is$ gxNx=s^뙞^ $ HZ~Zs«[C xu9gp<XO{nUǁo04% x|+ՃC=Hω) wS?9J:/Ƨ7?~̹:>/7]s77׶e]Ea @ |i#&Ǟ[;7!X #_%QbHo/6&A?@ ~o!W A-'Bc-y~)9A8/;ä B8H@ H>߁0_a_HE 01 L)=-3[կi uGA&~4IZhͭI~2D @'MQccO~% h m]^aNsM-/_o&v2فU*p]nkŠ_A\/ ՞d崐ge2I9l㻁`g+N~A?BQșa{ߊ~=(m&*ݕIX"1}}wnf$%PC$9b5Ε+v,4E%ذZleV %_~hcѮbQ%ڸ<~M̞.O_W+Mo6e/9h uiz9ЖgxY'3M;Fܤ^5%V7 pmqP9uf Oؗ! T}Zb@S  gҳtՈaAS#]yq FkÈbNkMmSF܋L$H6Ej,sE ^mRO >0q,!r3qHWsˢJ63lI zeYH6 @KHP^%GJƫ`3t Vm(0ݱCg2Zޞ0S­1[1FzbhIF_ά+(-9 ?t5>Wd9@y=zh\7aYUdBeͰq9~i[$?Pcj(FnE"Ű˒˄v۔Cy5eʌ:++A'#ڶjvN W&X+}[SQ3,/ﯼ}u58'cǪ}iS+u?<|e Vt@ l $ɤ 7@Gy|'ʭ"uga 7[H$y+*uk495MfkמLBfIԬDXCuTacJ+S ['ߦnbHvܹW/s l?7h]պ&I7`sK M1f1k-_fv*΁<3bgUAeƻ"ѵ£o8.Wh)-re ;NܘȮA_(V󳊌~;pJ Gosr9O#Pom]ܾ㫄2(Pv)sc5;eP,z0̘؝:NњX9g9#-2O+W+zzA/㴹:.;2^_Ϩr7\vqIOge6" _G zhFL:#x/\LJn&FA7iK3a["Aqs#euv2 :Ri CHHO_|iu:5)MpGZO9+ln_i#s{W}dd,ҧh2BehHyy0Cg_Z%LMG8 =~so*EJBHn!7Uj0*J*ŽFeZ‰Y]2)/6azzN{wM+X,QËXfd&^];$.[aP>tqV%4ÙqOU4ϪPo|̜cΠwdI.2i .V0u/$?d3@(QcfDM8M=K~orj4*m4F6ȡOe(;D}-C~0m9h*؟=lMȌ#"mFJSd[[8ʊ./rLn<^ WX.qƖ?][Bl` #ohB۩5rjZ3-sa:?3n=&.;iN5k j$PlGj, yTxR q nͮ407T6U^OSdg@کKA&8R~ l"8 |{GtJ`^ 0QNI EH10AH< EӋ8 NJSLK`Gj٧Մ-,b"vVF<5jd?U_iqmYxZƑJnM% ęOn\go#9VO<6V@.ŭG/q$̶z<A*7+=(80NoTPÏ}0=B-l\7U|u3UCuB"_8K? n0G{僁˳cn0\FM[}-D$ >ѶT>k-a7WP%oHcdIj/+BBR00D 68ej"Ui]6v\u+d gwUk{@Od{S|ScݣOo9$^sbH_@SBnԾ͏ _p0sҼD_kEnƜhH$0js;=BP"y{_,Zq$oeӡtQ7]@7{'^Qڭb_PFt S>W}\ [kz:'L N,`` ؠJ%*$#P#/j8rWgw(T+/ɽTt25:0tx^-:">'A'η~uB9+~!HGBJҥAoRRJ g`]ecW>w%_#~v\;~YZ:'iUdY?qw+sONJZ4~B\]:=|0\w!(˸U%mKr\"zz[TI!e;r%>sW$"Z돲f%pGl _ }n܁z@˛O6oޕ,>з+l0 5|%oU^|o'!x%yN(Pbupڂ^֖t"e]1@OɅUEy$;a}3E/j3We]HOݣp^5nۻj 킻phJ2:TI"14r|*KG|q]̥ϣeqYFdt%HX;}5 ;[lUbk %0$,}dzԜ4'M)VE?Pu[[&KCnt|=|+)+g?N`{,+-at!zt#v6ήfU?j)OdG}ֈ!7ih`qWݭv6뒏*3a3w r#-?( zX֓VR}jum!mQ\XUF\C߅V'dG)HIi=*u5nJ=jאwwLTjyjڡЗ [TyS:tY>SalRfK;]z0t`XgY̒Ð/Wm.|w*8Oj[V 76sIZ_u>J0V4(Q*cB~GܭXaZWѬ|7G/='|md+3uґ^`HdOݐJ :3"Ќr"Q}ߐ[[U{>a#Jefk`'#3}PcZ!t9٫2FW#8C&lD$vEv2 ={RM>'rW>tl^[>SoG)<'tQusLB/[x ToN{(0j#(7%֢U.j>0L䢬-jYa6jaK_hɬ»9SuWiy&OcJ&NQK >Q46%8p^'8 V)bwHQSlb6-W2l{3Jja睌]YdaT73ͱػ2 aWV&*_D"am-(V(o)Ge)'!6O9?6>k),BőVꂉObCg0_㗮͆qW~'zJɩxtWc|Q%alb-y"XJ8s ]yshIa5&AErvoN14jY P? GeJpEOMZN&D b_<~ԥ^!o>%,wFy6Yȃe)՟ ?]cJ9 Ok1]{hkᄌCF0~p9kJ{GZ,L[}2jfWbnNp8ًgbָgB.CSVO>)e&O70@]Fw8| HZ]gRKn(S WXuSv+:Q;7\^{s'dtiFmٱd< [?c^ ϔߧ(wX\Y)4Z|N;Vڴ!7Ki4)lk1_Ԙ?Kq/6fm5=+#13W e.WN5\{0|d/.%?kM7 3ۻ[g]i[[9E^M_ _?"U<{YEhBVFH܌ b?J4Yd})\Z\bl}7,`n㡒P}A)c+c1KmS]iƱ˓~$*kz@W>]Dͼ^Z̤?pJKQH||6I׃PU3Bllo_Rѕu4Vnَ>v%%Y^o㘀h(<"\?oB,\7^.QB;`g,E衅#=?Z*}ogReνf 7_lHǫs\(]כL;£)VgzT2V}D?XQh|> stream xmuu\6HH+!(twwwò !J ҡ KtK( 9yχ?kf2=aYaPwv.Na4J 5!.`''7'''+Ze+([%(- EyY!bNNߟ.. A8?JP[6!,ඁA}6`[YGGu+'0fр?r8_'w#$s(cC6w=ѕzP# քAtqt! ( /_.0sur_PѧTeX1*l P;7?}r I7 8pp\q4_~@e(/@*= B= Bi||x@]_$` حw 1r!.< A qsxHHa"]@`wG_?w_bп sDܷ9yX4s!A,B و)_G>Aȵx7"!#ogAh1{g{0 D(}D/h΃b~D<?N @ŇE<ڇ!N_{ P7 ar?G͋q "W\Cr?F;V.܎ڔq:Y:-BٳKb죟 <뗑.Q+z7I3aw820aۻ fW~JHgAcu/@d"DdD%HPOy7k~nއ9r8ھPy1VAϏ<88hǥg\ONS615k.7hi9ǚ3~Å\Schn༖H.ɅIoH$Ho2ti-lڳDv&YrEґEL | ngT@0ij'0;\{DfMuDΫw[rg/ʼ&7]*c:yq)D'|ճחDIG}2#ﮝ7s R%K'usBڝba޶4$%Q:,&$kFu0([Y30myJNɒ"!شSF\ $(D試6Kx.5r\p3-mL5J5B7V CYȺBØ $sFYD,v^X6i)eN Ypݶ&kx1]~TKmd.d)K65]B?5/ 蜤M,e7>C)f`Ӈ;Wn.E& pUDh'xb#:?*KW*تа?9 w7`# 4pؚzҊॹ.𹄐B+j/%*w™ Q[)f,JWxݪ4/#h ۾=?ܹ}Bk4'@e/T7ΐpѬy?ڏ moC J502TPd5j}_i`Ojڴ TH p^2#U$osW38WRYY*VUL'mkWT~,(6_ A٢WW8%g|-9d@z݁/fͨBP{=Vh+p~=O>J]''e/ʸGp~`&F42mx`nS|q癗[̓B'Y(+9]Q^5k@Gdw8Gz4lgrEqѠx{V@\pR֝^Ϯs|Zyz\kw_caO<N{M^ʭȻr1_|6E/_Kd`O$-~w!6GP\T/{8ᎆ3;lt'Mُ=D>gZ(rN-/h3Hϡ亘&QAdC;>OO}pl{x:W4fwǂL'LHE5N`NBLI+LҦla<- {%'uBl~`jcZ:d%oQ&;PaTVV7oP^%:ʕ6cˎ2 NzeB!VN q8)3#V4C7{ dIJU7idW&rEΜ 9Q-RO:W\݌o~{+l+9y&bE\hO%@ %Fv2ZNjK@uAΩe-䊯̵⫢)*/y<4 {\n_:$ꣿҦȪ+tƄ򣴴δa˪`۴k5e+aX""#_{&r8VpR.SY\0/3Haf 7dƲGm2=rnSMuA{Y0ފa'Ȑx &G?tD0637^Sd*BYh^UETV` dnk8K\v=_.liAokjbEF?;BY-B{>pL8Y c9yPb'3(n{wƽf r 3١^q5CbmBtK^0H>|{bYRy-j0JITdEYPo5]f}Ϛ ^P,GHK ܃X}{; vg: gf }0BB%چ[rr%\FduM 51XcYlMÂ|z6fg͝y|qCӦ<)!_3e<&(c;to9c3%橉$g#a5rvSQ]HP[EU=x~lyʿ\ERa)AmC9pP2x^!e;]z4oҮ)Xnl՞ o; \cw3P&cbϋ P^XX65tb|eHɐ(eKĊSuzFR\el`9K:+<%!+r/$ư1|ؼVu '@^_HW='<%R=4›EIeG'Sဧ;BN1y|@cBDmob8 :] +ۄ{v6S4/*U(蔲\{Q'g!zlRhjpGvNT$_d_iS<$rr*!2 "|a/Xqӝ{fQN1i4 2B2s1IZ* Ii⬄oe综P&ƛ1{GSyVr " Q2qnGoB54^.WҤt=I#HIH;WZeH5Dw6Y ڛAZ"MÓ>Mcl~h$UR^͆bx4tS8Շa}'wd<]L ǒF *$6 hςTnWoR%Wmq1˭y`2)8Y*E-%RPĕ2_6؆F.uyOQwr7.p]kt iFzEZ!t`8Ems M2o]Rdcᶖ 9}D&$]<(`iRLŝ4;vWՏ׽&g)t#6ߴqPel 6bؠZ(<i>_ec$k^h%iVQscL )qy|vJ[r^l hT@;IDb:&rb(yA#Хx޾$kIx4Kh{nPn~[ߪBjl. W?M|R`}<+sYCkϪn &tϤV:ZJM,!6Fbٺ^ӷad*ߨyQ:\XɮzE,h6mΜM Zg6* W~BEqml;S.{-xTa-c 2}F]Fi|\Uc<`mci~I@}NY}SD5ۓ~ ZEW/5TW(i,D1kH%TTٹ[u?#B[LK|h\HV0VA[y_aR}ux(>nL( CpB]Ӎ^kvtOo^֯QDU}| F~_W'/bW2 %V>ߋFw*y1 Y2q鬦c3a=Bih|Z"{Y3ՐRd9ܼ\>D ca|zj%ⱄ.P wB'ZjzbȦjsM&oكp,nӫk`UDu(HLVZ5Þ#n3eK~T͜4AMx** $\*#?:mV {٧: }bSO ٻrFx#{)5eabou UFYsr8<{zW`@'";h*mỏ*{]Bq B燇Pnv U]U|~ *Z~ J`ܳ\U9m;aqien ̏ÍeEJͲXhWj$Œ/]i#g^?G f9\ϥ3BoK */J:w# KGcDQe!_`}Ŵ'lu0v+mٗfQ!ǫ-KWHĈd`玟Ve~ns΢OSV'Պ9?ϴ)%8UmCkI?g7?Dv տ| 7l~3:R&6ŤJR"6ikK%>]#fˋ284.uv`-W>_gNG{rNyu!1Ϭ-M;jS*KyoTqQЖrt \ZȀ´xA-Wǟ׉=2/Z\ғ2]1嚫 uRwé_$[-:&LGjB}5 TY) O&'|=>wj LeE8xDPrHQ Wh_/ R=J`UX [x MО/\~3 zj"rT#Բe9On rhJvG֣*ϼ~vKR91 4oI U'd7zV%]XPz> %Nt14~&kND8rU. nl闅Wi `&|bϔJۿ7p(%p*6\ؗk5:O-kDrT-~MMdv.04`&q 7yb;YF(wWMfn y,"FTcQˏ8}H\%΋⥙REKR^30/ stv({nlGgǃ率 -Q"Rxb\4Y>@]#\zmbzMSwwBxVfg␙jNL >ߢxr"ax~Xݯ>H|EM 8USDs Em+)Ɓb9W%2bzJ% o c$k<+Kk!!W.}gaf0(?ذ2kAz{T#/{RM{.31! )1+_9Lgru̷-lH2(^vU_5Jm~Cֶ?uٙ|ٽ:Urm>bג01,;] + endstream endobj 148 0 obj << /Length1 2745 /Length2 22683 /Length3 0 /Length 24259 /Filter /FlateDecode >> stream xڴeT]]5 A9$ Npww;~`a֪Y5W6c@I(jh rtpcdeb((80-L\lL,,.@7kG 7  l y"P@Т9t3vhL*n&e"bmi;;#LŘr&fs"@d8:LV&vG P.VSTQe%VwwrrtZ54J{@P % opEI Q IV=X@WߴS2@.hܜ===,]ݘ],Ob }` 7`mtprע=HJP@Bi/w+_4V&*(M܀&f G77wW?67М_..9.Lw/mm3GWkW7e,퀿wgEd$5@RǁD%<,\V^ hH%AU"O73׶N̚@Y,n2bMϴ66durtXع-_W #VnhAA{F柃J :vsh hsKNHyw4J.&vf*e4Wv3˺f_ڔLhnAߏ.#+F W$ wfm)i1gfqt0s4vqrL\\LX@ eʹ9I0398BNn G߻ `m0Af?,%YR+Ybue S@|JO?Ġ `@jA > ^2@A zSФ<@& Nhmm$_OL;jd`a'o''+;O@T%qHfW;Wrpr5^ < p /AE{AS(_TLS}s]y?XemzEKtװ젯f_ɿ|9@=0FFpWٿ;@Oߗ>!,r4Im( ̟Mt\#->O"w (\AU gPMmڜT1~m*eERt8=fH|з2:S- -Cq޶·72o-yО3X.v^h'MzD覍F 8uwbnG ?pAvfR&VE^F5ih$ڂ!\$;$r&˕MW5:ɿO'SJfkB}!C;dFاeĺ5ӛA8ä!Lh7ktX>0-$9tIXѨᒮ5>:Vd@_7t7T>fC86( >Nif}dve-ƉT%׳:_\OADl-~nT'FY4Wlbf1p"?Ӿ5W6bȆtc`f#bZk,CdwLq.IN,G`kk?'\s`ng0IIV( ]ʤG8 O5I1k>2In 5gK6=KV}zc s =^`VM4Z:soٱ9 mɯ~8汐E4ڪ$?Ea9uǵǫLΝxC-k&%߲+8u3=zȹ xu}lč oasY?}>cKHvS}-cT1r5<]@p@Z5"? Ř:U`Z.B؄46X`{8ך6.ֻ`ؾR\nPR)@a*[SvfeZ+8cΨi͝fnМY}<3]w5or#W-Qeb}Gi&lgiVMG,$Pwx`Y-ڝʏZ >Vz Mg4P0#W4na ]hxɭ~EӜ!M k>4}F TimS -fs~}SS86iF>Vjbh'8A1,^&"<DZP1e%VTkZ5:"+Enp)?J+ԫ #sQceè_4mNgAa&8Mt#}fB}Ȁ5}_[Qn3붳 >^%<7=4'i?0 I%6P<4y)~)&Zt4KvpxTLgْOS/n˾=^1=Z5B RGH]OXWo@~H5z<*\`W2D]DH8:'o?:9sda~z 1ec} S~!M@)Å.匛=-We"!58#8|4z)ΘYD?*Z-ӭS$uVV⛘c*0r+m?*'n)"c6GJnf"c 48oBKint|0.ArDCڿƢ:̍H˛/f1x9<#R6בBW4koqP.` n#V>!i%â;K7!nnwt|ڵ,TQZe'_(uڦxaʕJ٣0E9uY fHdCI T%1jM}G_bqB߳Oœ5L6o]5 6\x= }J@KQ,3#K,Џo vTfi\\Q׌V1U<7=Dcѻ2|("z[Yj8m o8$)C Y  F8ZL_Ow~Dcm^ɷ_9eۗr[@Q2t2?NiW,wu*UnbΒ3Q]ƾ]hC`HgS[v= -Jv~K1!3],i 3ׇ \UL7aa_dIo]SOoo{-)3_<8~/F~0k8EN 3h~ 1z^C~ze>bσ!a6$!i|8YTxMdvk.tlDq9h62CQȣ@$5:ѹ^ U5?YB#mz^H>4t3J=aٹ'Jr Qd-BH)Hk,WVÒkyZj-x'Sc/!+-BfXا‹N0[8vm^B;J xvcMTwU?kq諠G)*_6!fn ں?6"E靐PJa ?' ML)eF!+2IN|n[W-WXL&g?IcaC2iHt[urFyxE%wV^DR:q3 !ccJ^51r;+0%H/0(iKE?A3yʞ7z(M.e N^7n4NYtxGvM>[蕦p;qڮ6+ #0w߹¯>5N2vUKD)>8.|Ogm1ScSs VBIu8)Y]B9(LiQEK#||YWr\IC# tX("G ݚV oJSwlQ!z4DSE8f w y.Gt/( jDӼye6> ?>s{]׷MX1BN\ekB((酰xV\6iw*~K" ʧTԚY߼1N8o$.f}RV4p-F~'poǍm ja"HkpX.QSvrU(lg6xCdh !7#o`Ŕ2'0u7q29"w4S)_GC y\s g] ޒ`fѕtjNwE[X,{?=,bIoxڗ)?X)r$SI !NpaBNe& qWpBi\tGF;$8eNjminlq"ɢPE?G+b(I@()!<_#r5-.;0Y_)+‘F,GP=MP #k TR>+ }JQ@=jjoyg1t,\nO=jE4+Tej2kR/ZC@epu0kN+cz%rxY>x@M*]ٲ/ת]+l_in嚫{Hƿ͵/_.cmu r]+SoOynжIm'6q롾 Wg5?Ǩ j0L9l՞a[2?6OuX&3'uLavh[4\PUAY+F`> zO8bۀ<8A5/=Cw{Xլ߱#\|OoG9u_h䡒a VpP~~ʼ00ݝD[ڇ=Hԓ׮b/i11]BEٮ`M ftJ+8BMI9MMY&Pf\[T6ȀW£4ǭv|LdO{k>;j 8#?aذ~>x=wpHAѠǚz#C@Gvh)v-^&զT"vӚ?sErT v"6߂Q\^Pye43<3qJ]&B"(E;17y2e/W:)KMW28R/G1cі0腷>Jv}yq ]Wv1uigs _ԫJ |Iw[-EU"mw1&n!>dDŽ42MyYXpGy0 ;ѱ4JeElyDqvtE4E.,eT)^$y7 J8N֔PvA[:2͏=p s"($'.]|@:-*Aw^-2{135mLm//G+ gҸji4#4]joo:x[M90j;nZ)W=y垙 u[%T0g䴾}M,u.V]s$>m+73- 4r] dLMx#63鋜 cx˹Ɏ=5:&"%hXL\[Q5bq!oif~D>2 a9O /tlvqeQD;:~!_o(V$J.^+!rGt t:_?RGf^bNTȚz14@[@m~K\MiJTH[ң26+$2DŒZIQEOh!.8>6҃fF'dzTs&$E*1 v)\4kYba +>?L>xTfsWΑNы-`@K&tY#]"Kq)ESKXe!\O`ΥQ暹ׄ,FtFDƥ[5<(r0r.24ŕj6X%P'+ٗpx}wW]l_{Xm.6ylGDm>"閝T| g.Y8juD j#;p蚮] R 1t~ 8&t0S*ԅ>#9-nxwIZ*hBL+jCJ)dd5%npkL*Ez[Rr6+Ska  5xnU?=Iҧcԥջd^+搚l[1Y8L\36??P3KHYf{vJ&Hr]T0dWmS;^{:9ޅO7;%cV ӭĔz WZәu2$*G&F}+}܀(h3~MI.5/KY۞ rbNjS|.+0ְs~s!L4_?}óyYgEƤ.1EO1Qi sloG(@gUX%*β-n5=%v#Ay(QYS5"]f"m M$#nTY7ܭD>ýG RH%YwA8}xRLM}ݤ>Cm: 9$$ eI-d=<~h,*E)/FEok~\}h1e%]<(BW: UXkLRg5~*ޫ7:fg)=VZt~p_j +#L_?@~{3uNB=It<3V & B fbOe]ǹLll(p {B*.&dC8V=Žf=з8{hLi@e: <wGLY | @ٙ]kcZ,v3jF&dM1kjH^][2Mj+y5ho/o!]Ԕ:cj81P' A3δ{+cqAC/meg Y`bƿK}ߒ,jTHN% t7 aQɹ{N"yt9e_ NĘPfKKvOzH t m1G7;Ǖů(4T:JӽZ®?vEK&|ĝڣ01FXϥ? .V8i:c)U,* We%0-BC7imyp@֛}ø# {ݴ/{]][Vsޑ䥾%H=@KTGpJgl^\Pv[[Pxeee Gj`GIwR\mf c)^)$sp^O]z_Ct-07=HxFZ͍n:&=Ԩ>xjrgUӷ2akcu 35L a:$v>8[ԍ]NP2PWJ>6N:~yz.A$@wa!qUZ}r0cb1qJF/"2=pV,O%YUd57~YV[(T[kc4ƗǦi,Gfs$I8Yg>e Uc/ Z''N.7]D&՚ Z:Zy]=i[t~ UƮϰV64eu'E}EnK73.\E{udMF~$8Qt$oƶ@}7>α( uwB7S"mioYKr ODnXYh(;Ȑ]q-T6EBXehݠ@隂yi0^ֽL-5r)fsfhr1IaPIPhz[c#o aNs:ru5}Mծ[bL[w dy4 _}Ջ.G i52l[/&UC *H.>3&˚vdc mgY)!h o ek*"f+nܬ ]'*s8ŸAM]S( vx7_}xHf_+=|_dQZML1<(B6Ҟmcj<}ČKCբs qn{?{^,fKʗyY>eٓ ŐuRtR̤eCQY=j 4?QdxNl6D0}(|\+CdKd+.[21S*k[0QeaU84B!qr fo;\' >Cuy$Ħ9Emg+O'7z! M_ ˖x /T_cbӥʩ!x_l2L3{ArAcsnjອgDj_3LL |p;OIzoT3 6?ZT6z#tW4%T ؋N^od+TJ6jt? OP) GˑNSww \;,HwhOyx<#?|}ƁuwӄWrщ=Gqe)ѣCZ^MU%Ɠ?Ag]ǪOLv_ȴFKV,d/g\"HYgh2'-s?Θ%zahd!U.+F5gu( ,SUB;y^/,Frg҆ >3tCVT) U1(YT* 6''l5Sl}ҰuʛMmEH'(#b؋g%3| n^:4D d 1}t4t$ޥa1?jPM%xMOg#d-;nZ)P@8iQCz+mhԎo9(MA)Sϝ&XS̱h;y0垢?ek:}!,>v`}}ߕ'L]ӈUf z_И |X D4+Ċ1fX#|0/,ۚ=1WTDLw{K"yYM,a҄䏢Տsc94\jdlvSݑyXBXƣ+96;)EU=;63&JяMB䲜# ˰ʼnj61;mcP3BŌ,sfǁuvf64ry))3uY֟Df\Ykrв |X%@&0L^D>vGg(!/#KY7*TDCZ3ʲGlrA/4 \KJ7mmsyXktRI%ΞPoC DN~#/2m~˃a(~POفn^O+zۻS[2<>n҆ٚ1rxTQfڸVxekiQ&Lu*L&`uz;Ƥ¹5xYn o1zt>d i ¥&W2OLpZF+kUTgɇrLƩjC0Z9O<_3V _L^Z9\YsJSYTC@3;-`-E `h<|TT57^)91vcZ:4FήZܾqe#(LG6VB' &x+a2Ӧ>L&<45Wƫv%afZ3`T&_ǧz=`6|{[UXTQnXqMQj\iE+k=ͅHw9 y}|$G07:Oa5&w׆1Qb`{{tWh#y& b8>"\T@v&Wk!aZP$[dK |ReKQdb0??)V7 eCkjٟ(O^r"P3Ot1mREjl;>’U4k"mӬ 5bt d|fZcr '?$),)1x*ŗA+W§ Vsk<2vf!ZZk;fRC<˂JG1ιgtuJyk=ŧyʹ)/-YuXJl~`oӡp!J(El;WN,Aj`w{\} l僣 !EU 0׌A^ GT @:jW ]I.J7|u:ds!El F]Tq6.H#П|v쾁WV5$SY87+) ـ;``K;Ӱ1Č}7PS2Ӈ|nCF4cB<"[',=Xx>֥{_v_F8u .m!YvYBp~HJV3u`tQ0_ dFBJUlZkcCO*8-9ThG2!I՘N~Ԝ6F}{vBMbFݠ04rbQ 1%9NH~ YdҜk,BE} u4@[n*Ű#nXsjKjR܉T9h:a'wKET亱Lcj?p|D0&hI ?3%KwGs8')օGWFll9xՐꬣrVrpUF US[,˱Ńn0ӓ([#oݽkd٥яMl5KmIFk?¼k=A51:ƄN͸. g׾fԽHPyU"xpKFB o)a1_RP$ψxg v.ȡyljeEIFP0kM;Y6=TNEOl bPl96|&Cԕu9uх<|#k ǻ4JU3PٷxySQVTAMMλRf39|bGpEk,$Q%PMe\{c3X2 Ί}p ||bW:^Q~`5wb|[_* 57NhmDksQF!c^i+N8o% jm".%X,= ;'0<#ݰ!l18*gY{,2RF[Gn[゜'|"1yV2 _vQ3c-Ӈ}s'0-KVa3(ދCGzPmE]VRrӱ[åZ"k3Yw~jy'hsD(w>QI*% nStܮI0e7EbZAⴗ*S݃M) }Vk\@Kw{Dڗ6P,n~^:w؄$%u*l|bT*6n596He+θvR̬[\Gɋ!-Y} OY-G~m2J0ȢJC]-,# h.pFb ߈v ⡶qۆЭI.ֆ,ƭpTҒ72 oړ/ 0fܷxE|`:8z;gZ&/)ȃyQfl/T;P|Q0ty|ճG.NH^R\Q1دd7(T' Ɔa6˻s\7FlN;+Ql.68e9l:GKAm wbCX0Jί&$he#x;i>,'|> X ㈼ ߅D<$@N{r{o'>n> bb2j:j nX/`׎y.(wDmF(ɡ̣H+m5Ԏ/GT6o֟J"w)AG=k}7}jEiwl85,G qǫ^ϳ@2dZdWYcx@[BsRvaKL*ZkXBƿDOUjqq0ѥCӷRfpo0nQBx]YRZel ȘQ8;\;0Dz<{DU^4cKR>\Qd!aoy= EݷxY+pn?.vh{⯓7*׌g)6Y?nWSyTH¶do蘝:M{S/x\\޵^3jTalp:rc4a iIߜTihԒrf"Š,Oؕ u k)5YV*IiAk-QRN(IJ}E ˏl52+]]#pnՁ*w18Q1lszd{HG(A{|Bs]y1&?tHQ&܆;P/Q&,f4=ʕ-ƅv@Wl?=n!TЩVX{E 8R9|'ڞ!7Pt~}Q/g)l5 OEਲ਼к=-h "BqüU#ג)5l=i,ۖ2%czE~#]ްP(lћsx28H e/`.# "7Ʀр X)YYc: 81]7"BVޓ/0sR aOTJRݝ( n{M΍Ag|15V'<5oKQ?(ϱ)_&.r |+Jb6 r$RDtIvD>Nx_MStO _x^d=+pBtm]؃@KW~KZUkL}%Gly1ϧ[c y0غ*Ur{)ZCw7F inʫV_H@m 9ܲJ |fG@څ6Qt|B+,g֋V5) dgȲ],. ӈ RGR/ /I\B27 k*Ey}(1#nkVJd7!!+]S(6eؽJ 9c< 8/ _b**3 C# h4]6kxE'j8lG3PK`h? r4mܱ d 'æW'@<THhl.nNO+?8,:Qjg+Qړ7:kzV{VFdT{ac3G: Ʌ'jolzb՛է轗6u(NESl.]TRK돫x[ɘ'ghŔ1sgV+xU5]+zH#R4b^_KfVjԦ  [2MAkV>&88ݎ$6\ v0ۮ#g[FtCAU;W- - T&W[ϕ)2(u %h\^\ Z{. KM^Hkvۓ6EyԔվ!R]ijgNƂ`xoi4$X_W:ω܁'9,?^ Ża%)xw($[eѤ܇n :bh} uڏAjBM`w鈧VJVW](pDlQb npP#5~aFģ澖7BqM͗)ϱ?OS^3[覎@P: OFsZ2;?z9|ۑᗮ7-+DT҉hWELݟd^kl5ȼ@ݳ@c٧<'Fw3tNVF e)~G{ڧ4[4#4%"ce]^TO[$)9FDk&}E0wޓp{g yzqjEtJ.?m!Va8E*ӆ8FX #Uhm4]#fHHlYW0ϐPee}l S7E6dkjIF@qi;e`r4_¾YԐkItQe/+Y=>?#/@@lq@Ud@W{ckkޥF{E/ "v&p1<*@X3R xz ߿6jN)P|#$=m!:LʇNА٘*u9Y" ˟ nò1N8P_0@F(i>;P1r?.Y@eW~Z[Z{ǿw% ?R?'9kSjUnp_AIiFXs-upfq m~4ADj/S 8Y4Rsx }`&g_W!^{{Pg I/XXe@9P@PP GBN{)oe3M h8U\X;e%o#dDa6'ߩ,]lD8cN-TUPnf_aH*9=ӬLd5e秈C ״E? '1cAp\E{ŶI ^AQ9O#y"R̘~#?o~ η e#-Cktl(Ajd3:=#R. EB(*4wFq7;K5BX$ks r,n>3MJ x I/$R)(i漏cƣrXBH! h9<P$[몠 Y(@~vEQpX >tN-|-j:j jH5īd>5@I-e.ï1Ctcn&E^>+&#zK qH, \WXp ^\:i& O+Xh-IvqMvC+A|ͩ/Խ +s6:ۈ| < T (J4xthn֏*>R|#p+LW'&ToV%hX(ƭ X6= $nC7%fn×P߾0A`6[C0rn_Smq?FNUo/`vLB^:G6&3>+,ZYyTR2g$${ [:pVJ] ~OZ.?y:jh+ބrygGtfw[PtvR0^.*85]"˙>U_c uyD6i7(Yfno." p\ɘg>Z1/=RR.ѕC3&C)T%W.."RF`ͷ"lz|+|dEtY30KAȣ%R _N+qe۪&s;7YL[2b`_iK u2ZYOmcH7pN6Yj!:ktпi,Dɚn{D|N]DjJwdQ5A03CbMDZRF%eq2||#w!cPE"w0W8pg= ީ-`ؿ Ηv>U Z c."קdE`1gP]{ =] K dƢ\wk|D*db[WhEҎ9Hy*wċ͚`v +0I3O!YLYpۑ2#Ad1Wt4]RW[@7] i(1lY`0ޮuwZHnzh :na:zi$hsj(ce ة_ߙHYc _FM&:Cw$ uUjI3b\H)`WoP~ @aLLwzKxj tP-[/ '!x؟N+yhMq~2V@vM;ZY9 %“t 76x'ҡxd,5偨oG3=0SU#X|fHo`K?*s^K%'?aJwn:3)a&i*2 ZLov^(YQ8I]1r%+|QP.,{`e4',!11d_?.5Xs=84`fQٜ0j(bOӅnlLz  ʥa]}կ6£\+m[js6vi,>FW&ixwxiy+ "9TmZ̆-M,e'R)~삺 endstream endobj 150 0 obj << /Length1 1801 /Length2 25378 /Length3 0 /Length 26502 /Filter /FlateDecode >> stream xڴuT\ߒ>w%@pww8 4C.݂ww Asgsz9]Tyv>k&WQg5w0J9\Y & gv6f1;seS;k'W Z 4qvI]f.p0 Fs'@bdЙ#8808 Kk" roh15dcQd(9+t )`4%jʚ*,]U4@BTICbHkkjA[24;+JjjH}; v?jy ?C-$Y8򳲺X:8-YO@;?ĸt+߅(XA )ߩ|]_aDi/w3X8UPQQ؛X\ ٻ3hNqW0o6_.] }MsL@^~l3"v;]3k?:EQ%Y)Iu f1+:bqpo K; _JͿem4TG-)#? 3sk%`x"777́t 8,W#U$Vx#``7jo{$͉߱៖gkGVw;_hg{Ww}_ g -&N3fo=f fBlRJ$ `XN+pt`3ډ%r)2i;(KPؽ$UNޚ)Jhhe*.uRsd&4GڻrLa\Pα7a0= ;: ]`ǘ.39taB ?Rl86]Ήv~*8BFC.rB@TQa}9|Ao+p +wŹL_au(kq!jU[Һc8P~4LwG@Rh],gO\jݑTݍcBFpZ“Dk[<܊I&mLcä;r[#+۳\Ydrz5:ν͸nhSYԲvᬔ*3s+Wɪ)srDA0B UM%TIQJhy &fl?p$ vrŽ4t5Sz&sUt^ h!#`g Q2Ott:)c(;تU:]H]#Wg?`ʐFd p+*|8!'emگ IoU~ԁX{wm41̧M3h{b=P-p!^uʍjq̯SEмsʹͧãd UE)93Na%a1·]]G :"@~rN?SJw'BMbX2aj,װ coL |]_WeK#ExH vUd4֘Cs(8q|XYωhe}jʓvxAzצ큣2aێ:=/sMnM T(rc/tpB)[OU` s]9`oReW>+ ȷ.>Ml1,$3"ve|/gu,ɑ.+F@A4!.|?k67QJzE8Fڰ;dtK5㩥:g+E.̉nlA&,Hn&~VO|ֆDOb5{#@JmhD`k`oɴ*O˟2@3KK|bN7 h-&[洇A(e'R ifJUb[,J:(Ziػqzϰ8!2h8| 8fӌ]QXM Syj͛$irw8~𧖪@,ΧHnM.hro;L0mH]ec _Hdr)&mi8Ʀ{ՔT6LQ bZ%|%WnHاbYh'*b7{(GA%4#=ϵYNS+{ά]>A_Cf0}f{2C/~8om10$ =T<3|ÂI뱿.kz4 G(k":u)`M/ >#"pcVPۭgw{7"d}ڦ¢?,YvJ˫]QK<7NvT~:0bf'>Dl\iVjI8 m7a._'8(Nј&rZi:o33UHc.Dd׬#|6sQ<$劘 )w5 ୆V;`zﶮpB~QA8%eh?:0VeH,eg-͙b F&KOŮ?b~$ӟ}JC"?5&5ui:(_骣ПnrbA//|ڹY@A[AK cTrYt/uq$Tqeeӑ/IU!:l66qIq$'`ןgRi[Ͷz/{f5\Ҫ\={+ȗQkPbq>,8dt2o~Xm H`myAw^ &_VJvGD>^x;q* ]{_Z+PD?#1Um2({'>V%GbAqwn`՟0p# |ʈς>O+u?Іg\`HfYR+slH 4E Xqo1\&?Fsy@ O JLZFOS d[~&"D}d1w>0!m))|B%bǝ?Vg>Bx`c:蘧lx "M4&ā4blY,p% #Lb`FYHCj"vX/v=$â*0@.ܠ PMpbNNh]!IQȴp28sB,+D-WH0! K怪:(QB{K8wiF/٤;ƣʩ(@CEu]wba?Rߖl n/f!/.8ZR{_}af]Y(X!qpљpLv_Jߩr'b"Th `M:$@~^ HB[ 'GhWɾT> .]A t"ˁq;loᯨݟJQ7!agAؑNb2PByHCȥw{euh$Q{AM{5Mu".d4!ΐ0'<jC({ ɉBk*hDi&v:@:uWxF1bl!ƳzCɌb/,;iwY H5%i7_ݦ-(ザp:۠ySu%P_jbk|K*جFV'z3Ƹ bz -Y\V`.+:Mjx-y&Kg,(궺2+~ ^AMe߲ף}](jf~d:WT0,kjZ< z{ANu]ۭ9hC󩆍_f5؈Gb釬'N^6qf #+.TԂ̆!}>ZLn~!hKc Pm"tr4gg;vx%k)Jp^1~Z"RރB<ܞ\NHo 0e-Z,胰"?<# }iύ9i(As(MeqݤjCOƄXWW"7|}A ޛ)|dtBz}?_{(  =ޮgk Lh {-W]{#=i-ϠT_l7[Q⟧[vn#]`({ EGTF{٭.!9[ב'bpZde`!.W~^x;ڽEjxuoNlNi{cUChw-bQ/q ?_ikJ=6Qk\[Sv}9p2drj/-]wh^ ?G6K<Ʊoq907D7 {[yz_jF_"5hDI&zE 1#zaLaD|x|WG}5>ؽAB*aڻ-!m<"SF*g=6Ng?u3#J/`vho`f4 mAt2` (`w8<\ v@eA6[. J=[]Ņ|$qKp;KgM\ycOA㒙M[%_$ǰ_=vXuMuWdldrޠ~0+Ae/D.$;MђW,+Ojf*uPᡆLaߤoǗɁԴI|l '#z /Jp3g'X4Qr;}X(iߍ|x˧|)cH}f+ ~N`>㊘Pvp:MW9LjY~on |91ܓӧ 0֨ՔP&}u}r)( O+jCֹx.ӡmV.%>BU٭cѥ؁i"h[d qMoרG'[obWzc@{5#~a?/q? wSqzG ?.rdT l"mq1=vP7=LPO'ny* `btpitq amb vŷ0<0U6&ĒI -w$b|;X zCbP \>$m4˰?O3*U~bFSbP=P@BCrʑ'$jf,q9x/O(`V)"(nJ&E!_,8WM 57B_IJ:(˿S^VIKRqlhr{x1F7zcKU˳|ZȼKjH3J'/°p0 pu ,Fq7ڹnQ!=_Wq~";F=f n%# [>x>tibR6`ցBj0_&lP )kr$2L>}AhKJ NQCވFZQ&WF3ٜeuwFFB.n = <{c)SĂr5݈_NKθ~u!SUtWC&K22gWQ^}$Y>r/Kƫ~???3jWY^EU$AKZ2WH]O;no z}vٛ$3GX}5 kv/6B^p#),n!EܜpncȊv]T +؁ѪiD :{ sQqaN1n%t $}2M I4Hmj]HW|ߪTHN2?T&]̥ڌm5D_%JŔ6$^7~4u*M8ϟjɔV+YIӪAu>+,ZNW=~nk1/<n7,%ϟI]l=Oǘ;dCDiϹS>UrWT]حY18 —. ^BRAlK9gWa/etlN(`+@~]r\: HdZǫS.P[Asqqbg~2ߦexՄN}_߂t?G8Sڨs^@1vTM.bå!-a-&ܒNjT2=GᲧ(4GL'3* '[EkJQxTǡoe| ?1~^ZӀ}gLY$#,Ÿjd*ȨL=OO- *_;<-Px}oSP]˿iմč~Jfӎ_Eh113\nt=,gS\Їo;8Bt?}{ңH0wW_f'(abxOKbdFס]HG3t̡WS ah"ȄsN" ]tn晄 ը3N'}J,JSsv1Խfhj#"u4خ}/Qv qNq<+=[Vlr\:nB\>qlj{›2~XU ;3B[I=amK|q^s**| cVOu>+ k\(Rϳ.A܂fpՇ9CMɏC'1)a{537Vs"#q0~֦͚*+)oIQa*XwȲ> g?d۶Nqb ЂQ9J3(@)bm8Y#ىcDe=%L%:,_z$?]60N%7ҸxVa!< R[O&$ZbUYB> n<錩yxca :WE\֤Q p qv=3˄TkOI`Ixnfύt?^yy!.`ׅha i=iz a HbŪϭdUA)B <6K=8f Q%4isu>IrX&xc;AvTI?u!³9E6`nU@2{a䔻;4uQghG;eݪ0R 46kI'`CB9$ZD)o6`QZ@0:t]#DFɖ!FD1M_j- h<֦nW7T ArqzMY5a٥BEꧼrq/:?ey/:'/D-Ġ-U\y{`Va-xI`104A{lsh&a2Y FCz0ep={^$ >(ws3'W0Y]5Q2_^='~fj B逷x(xYڅBxSo>Q ,as }K /Tdn8R]GSCoH~Lǀ[xŞ륬5dD][y/,~) ]TTey͝/*q(i|u įwpafX]=!WQ d۶V/[TeHcOm W`ƢlcJ7^ \2ҔXtO,w]A8{|=# :j\96ϚQ%!y&xY:0`\i1C&V'$V`ez -^{5t|U_QdH=+ >9ZWLw %w7Cr*qI&׈#2Py5Ql8u8isb@!B g9w(QW r03P0>B'hzC8ls{ k!n*<h uk՞Zfn*;쇩:B3s.w\yBR.no;f%;APA p9=s1c}Bap8l5r%r/ ?FZ%,F]=6.tEr! ԻY32Єے%ںHo_0}{XC { m7$zڦRA=UzI@v10Ċk,#K.RIZf"3{y"p^l*Ҳm.ce}D42gɇU^md Myse CPpWĭ&ۭ|l̞.:RLUO P 3i/ 驃!_?I=n_ڑQ|0  QC]d_)kQ'SKJ)`m|g_xI5ЮˡcNҨz68F/(xqŠ47ZKkݑlS(fE ]?)t)pKz F&}2 ޒd(!}k"AZEc֢Qdt Cc{Y θ^W ,1PalVHH dE=,U\ @ K L8hzZyjܒڪ@`>&Mg?uS4NK0j`Fz%"}'{*^@t8i{ 8m9j ' n6Ufӑ/woѝ`3jG$͎jŧ>HBŲ$'!ί(%KZ!@5'$󘟔XUG:^7'ta HTLm5ǬǗ^&$^fg40"YyK65ǔJ럦.׼QYx'/Z"F96 M89~!$z&v}BZPߢ8T& T1q`D(vd/wAz]ҚbQOJ%]7a쵐ӭEu9LeZ~-jA&ei}jmȵj`W.H%uEZC*c/a͵{5 1|I5z}ςLzHкnތ5>7ϛVm <%JN|w)GXfH:I%NZĀ,cy)Ѧ=UJD>.DiPY]gXV.^Qv~&?,W9tʌeTF߽$Dڴ2uy ')P="/IӢX{ ]tӱ ke:׼G伾gIr)w9P=hGg&1{= ||S晦ϩ'[)Se$hLm^A}=p(\?;!?R7Ř*b'>^r#ҭd_iɊ.Io,q*m5[eb3RK$FBYA:<KX @։;-~m} v{z .* KiND#ٸu UE/ZWT biQ{kYx?&'.km LdY7"o}60REJ&W{ :&*Q)Ux*$Z?}LY8O=^wR/UU j3Bj.=Q!-ϝ'Oi CARmZfRU_Cl#:=Ύ=,Z}LcXz яzM)'I?5EĤʺJLxbD(,WO_?;]!xwa~{PP\.ٿ |:_Ƿt5v3b V~MjJ_0A !Utj;{/ ٌԱ5~D{ɤ>2 )aej"Us- ]o[4bvj9|=F Twcz6ѧO~E#/ґW ~X%h%G<k0% yDE+40U`T؎&lqR_- ZhӭqTpi ~86pf'8ږ~{aiB x(TFYԯr5U2^6t<<~n̗COF)Xёln "BA Ut^bt{qBT|-듛jxYSq%vw4Bl&y]#MF0-M%AF) ,!!T$ iɬ؏VtWai*v] Me IY?>٘kb <0ӿ$Fl|qSÏC1"a MFgAGܶv6xY f0,dx3*K$rVz4*iE`4,u҆ YY>OA&ʝUGP)cP=QhC'-"F"WpȎ*~Sv1^w2B%NCUKũ%#%L~!650u OzJIaٽRYg}s#>kEv3!N:c!Rɉ]Req=tُ}gfN:XBIIL(s֖CQ$ OA5;fILX|R3qPVN~ysz 2z(Yޮ)Q(%|}Tuy%ӛBHGrxm5.7V;+L|ߩ?F}͡9 9^ #|E3q>YMQDXIGqRXަL!LAҥc\Vg4ոLkԬ%V.%뮶 ֠jA7ImNi`Ѩ>2TuT;i2iR՜b~hko5{ #)}"׏f _eTݺ_ӗ#0׻:;\`/Jt"=lkh~nO39t{f&:Ԏ_:l@ |\NgܬEu% =>@ހ/{(\Y-[jjnvc7KuIpI#F?WY׉fj@ PBMԼ%l$"fStٳK:ŴY^e/=]k-Fuln333;GEEB.7Զ=%ZbY6Ɵd"pWM ]eLVUK1 .dP'qʄTo33+lh8Xcx4oSFKk*Zrwj->Τ A?r)$lD4 40/b1):-4ѱW}3!H[ۉs(*yz4䈰R'O˂&6*6#6@Qp5ʚlcdcm۶m۶mL[a/|yD1\!1ӥR6©NaɃXzȚgLO_l'F%-ߊۻ/).c/W݅oof P+DsP(,VԂ sIH "_}afzzjW䲧=+u-D%Cjj2HP cET>+ ;H2*}~{6AtWc6 `bwTxCwx+jmncX2,?y$ɱWvA8 |Lv2`T.4͝q"MS]A4sZD?*g2GF6ɛJh]eB(Wdg|obffx|Qf?S4k"cŸK$lm  W~B"-$3a*JggF{y/VH Tc_> ڱLS DjXLL퐠F@늨ᔹHUsFs'`: -?/C`~17JYgh ~il9li Tgb/0Zm"f꘸~ 8GLI8ېk ˬOjT3Mj+Sn#CMZSݬa"Mp wXND?k6ށ7uKtQ<*rvH^,i ]"s-IpB|SAʹWK1r+"ao>P%gH!Eh4Ao=EW.e gpǪ$A6ن%\+R.4^Ieϒ-j"T>bҒUL*=-C`[{T/'{gj CU6+dN΂MK-ɱG(v O/YPp:FgU)f"1GrTȆ `9Wxf}}{@a:̪}3wt9B^IH2 4I uO}v2/4u?fQ_pe `[6T(Pm\`$XR5dE*&olfS דYużL{ʹ}8")ˌrո<= *SWɳkyƞHevޮYP6-?9Uxײ_{6v)Bׄ+@)Wj\-T_SXEG|]xoPG4se0 ?xZCͿyˆȎKzN\,p8"4"mSk,1*&uGTCuzo2\VĬf]Ɵ iBLx7DdR|Z;ъ^2?2y6KObiWz9M?ᆚ 3ut?aVk!}:?L,bvjGv( 0ct;岡Wg' !LVfQ>.F9[kw؞"Ž_C|S>ʌ~qwUe#M h?+:>Hs}[oh+iOcǍUfpf%̀zSK`?xHG9Yw"F~+<8"yDKbц}ZDNZ%q.qNbRH=gJ$eU!оH8on!/%Af 57|yFwقnU"28;N%9KbTxfCHt uK5$j>G\D=ҹ8s$W@Ğxi$WGNT_i,nMMͦ/>vXZ'{LK0dk$N&k,2gtݼh枅w47lьu\BW󹐚w6hH3km̸S\ hl$6RMYo~@/Ĥ#͂4 %t~ڋɒdHG78_Bt} fҌ l.^qb-GXԒWN|甝 <7^ME~*,W1Yw5xȐق34tI_ku"&^^rG!cBSFRv91aAa0HмRN)A, KXVtea-TM3*ݑT@w̔!Re' lnO#՗U9e26'@-lMPث15X [{G-c!u:gGܙ @lB\`YPGd}NNF"=YwsIFyd⧾7h?Ħ*Er%82袷^'xN/c_B3u*&fy՘w{ c$ѧD6#n]}Eb.2Xt ád䳷Y4mժS;jr^(+S WBf̧}7>~rMQjyW l Taꪟ^fRN1,~K%QJ71Q %V`F,+˷gnF4|ɯ\VnHW$g "f7~j+@9] t- {_֚EQ^*ȝ(rfc3R)+1RZ706şQU+~v CԞ?4M|*ߍTQ{7(sń( 6]Ҋ2iîq þZ_q3 uN$Xa('Yx-ŭ;8!n~'cnjǁ`t"srSƒ 8cryIE$/RVnehi>_%^ o I j Ryw3xhhkuNo۔W(!zo(˻f( rSȵ,?#G xOr9%&/F߸&5SQ3[:*giy, c#/SkYI\̔% O7vK-,1δ86R"2٠r{opneHq=PX G:G## 5UQDG .}T(Bqў\lWN5s!'LN!Y9y\G~/%L%Zŏ̠cHrS4U } /Jm`;lI:ئ{OqRg fv!Fڜi})MI[sr̀"hT]XZ 2۫;,}PU3I :fU" ~P#lN\BZ_H8P_7Olj! gL#Dn~>CRewt7ձb4  3b~x0H&NlS}Nȡ\:ζQ7սP>bT|<e"Q?,A`MVhe]bntyM|5ёOPT/R8{>d 5N(gFdITX_fԯ1FwM 1:Xi(E^|0Y"bluA a}9@x 'XW=sm,gpJ[H;@Ã(D) prbtav8ҕnZ:Nͮ>tN3ԐMcr/C; hi u&ELiNTlbb+X]@RGq҇z원5$ ΄SЇ)~N<yi^ _-|(Nj|]۩HdBu:*gvO$+JE~ -O(d5!\jἏS?Y_6:y|n7vVcϿwmCf'mY.MY43uHS,]qT`0 f-o5s]*O`f +uE w,~d K9}N{=nI{$AOA 3jo"$wպg:JuD Ywזl&J(i+n|u҇{eӚԶ/a*6 bCe)-C Xv=>lna( fN!G|C#X(^ō6T`zqL][MKd-N}bB37X!u4Cv7tRÙ~q G"1LÑ'M]IG /ءX}Un{ Lq|S!.=O =_8qIfU:Sm( Nqϛn[_CI/YҵZܸJ{J "DEvsJt(C W%$-Q4 k@DmR&kruԽCx>Ul=Ɲ{5.G%\I=ɾxejUᆫkGsiy Ә75w":ޗ퓢NP0y?ؿ7Fc=*M߽}#a\-I)ά2O2XQD AG0i'EOtg xLg6lK ~MSrL*yc1 ݳ~WOT}̥ Aj+sšR^H{a 3[E!cؗaQEWH `ۉ#ߟ ;:&qY r#?^ES)ӕr=sHl;<<4/vŞV[G,jFb]M}9|Zw{ (vN+y>ٔk6jLkujxh*S)׻5 -e+syBWIAmѧL{؍,Zn,(p%KBv͏GYG/7%.is  :Rh 6[\6qT^l&{""21Wpa]܍b W''Vzԯkf] -`|h sF1ZV4ܓ{8.-.hd2^ւZ wmƹ`#*"yxhvR/Q,"ίY_U9c;Oh@=@f*EVWԓ+E2z" L( jKo;t.JPհ`Q\_Iﬕvu&HZI_HQ;fWwG><*(n1Hh@皩^)Qu' tPrG-"ѝ;o܆s핓'qdo+w3| -蕃ޟ27:A[4L3x&'_77\N6녆Jw Wخ˼? pWXi&CO S(`QeX1RVnBvϘF:m{p립bHj$t@vvqT_AIso"*-yW_G#%DC<> x,U<=N${SBh15.J]Џ7̖*g3!7CHwCz.wK{(AQ1̉/#.wR;]ԁEE6 1n7o2Q٥ RsJ7S8$0fx)8> f C!2_Fins+L5L ;u588=vH|/7!?A> 4U~ J=̴$ךl:Ģ:Gtcu8{ܸvKoUPL (Ԟh0>4⇌:U)'j\}e!Q [s%mv9?sc<, wUvXR[Gz9ϲZ[n> stream xڴeTJ5 AK.%!!Hp;;^-{uTu QRe1%A. ,̼9yUc{gfQB hb7v\,.qNVff8 n4x.j@_@ `bn[XiC@NV.r10'Z cljrwۛd w @ -m sP * RQTWRa|Or?-bjRq5 P U h߂nSO ӟ5Xn@'g?eG2;*tqqebrwwgpuva9Y0:Or;m5콝.%#9+S3O$_FV.?9mpQX9%%9 `QK  MN)o颠zۻ:[olS2V?왕_'I U5gwǞ/?Dx̜vJ؛U;i{\@NLj{Vfznno $9 t=L-kN,x9ƶ@+s  `fe>AJmͧҼO3' hǤryNԒtU0RdlgeJr)YZ?-}?!a}pWvϡ= ށ?bLRj:t|$MAfVVN'rpXާ ׄA.!W9 .rrDPB\&"7I?q#SBͰað03YLw!Vmߥǂ[[.Vj}vYS{Y7ߘ(g+0w}:]UsuVwU]@6@M+﷿8Yy24wO(@;oѢ /vNf+]3?bMuu]=p S`봦2_r( ƓJ,A-̩|/[@€,B4oJ}E0zkk3emc_y_|$ < F,%.RC%3Ym mD#1։7ߩzm?܋X1ln66c;5HÜa-qeD(Er|8Մ/ {/*0Np"Նe[Ee (~ &X0K ~0Wšb|}˰ abwՄW]O/x7|xYa>68}FSXst()pxihJ&\+1{o{ARGhqKﶁ(Ji֡5 X W?: ޾Ev8uУҏؿA":[fF(ӏ&ݷ|J $VLq3"ۿSįQUqTpâhYؒC+ []=X:)q7$ iW6r".H|.G 5aTQ@&}n% :ȨQx\icrp T%[:ijO.}%v/Flc"V:k&M=n>DG c=HL三.AtҦ]땡"(!P|p[3-/-[|L'+ 7DbgǀE :7Fy** іv7rKxRdqW.}$+?q)5du}dPr5%ރ6Aˋ=P)G xҐkKaNxPY~__d'X6 ʇz)iY! G>L܃XӦ+Z/?&rd"يcc8Ӥ[Xܘ7LOhahT dMn.}9&5 4ò[1CE(;{01Ҳ CiI /{|h3g )_IjY/ֳNCaI6VD26FVN&x`eaa ڒ)|h.#PEtvTnkц+he7X:%ZceTeo]Op9;:a}`:s6_ŠlhK3-K7fEm>gqIs6Ѩ9h )'lDOo t&S/9ǔ'BP\M ۰9wu TA Jae`RG-`[U/n#^w=bδUAc}i˩S笘q+j"E'0'͋#q8!$~XEa̓zw [N[ib`,IMG╭ͻ^Mmр7cTx5 B }ousE%^UL ըR9eVvX˜"Xe)՝jkuW5EſqL>꺌j9!gv{19Mh Fju:ܶJ>fR\=!=RZ kܭ[;w?>pw5s-!$8TҞا;@pAа{Mxחb|ޥ|hdL$4\!~GSo++[%[ET6w'g߮^A~xx6mqJcezhF]]2*?BhH1 |,VW F㺒@QuZE8Q "o# elHT܆cuXAfan9X~h =Ay''B,9d'TR"Ici/jр093I68kY8i& )o7Rօ=2/ȏ|nQfB[,^')kU[Ec^3J,6F-LgSP QD*z=\`'*$1CtM+%xUpŏ4|ypmG'aa貄ŵr2CI!{9G%BT;E#Tk3owMT`s;q=DeÙ{Cj]V$2x'k%?QGKC|˜?dA28epPywc[;,G?bxZp6z~eR=,6{]j3 5y|PPhz-m.|<6ׂ9J"VJ<9(?SGEɔ, `Ȭ7O273{213֬`B0I` <,0@|-f:iL<Lԇl7`/)6tZVRdOi ^M(OɛjoR"߹L\V)D/` bH_C [j%&LJ7`3)SB*du|! Utejh= sC˧|Hm+T+ros4#8w31s4 SϧQU@i~n禊eVԟ HbJTqI_> !5@ kj寝hg>oN+BvfRIZُk/ܼs"0y),5?|plׄA %]J辁O}ƫY,[f]>mfwUtKF)-fv/,_x~Sפq|)yZzz )[#[V&n(ko 0Ku+K< v"€mK;O}@<~-:R%Ђ5w7`|>` ;a Dbj[ғh0)&IIuE@:%zY*JD>m01aqW= >s8nQ7S]klSFt+LZPׄy:QbZ1ޒDVn6j4V]JN :8MQ`ʨ LTaF7a!Ԫ-iߙWϑlr7{ܯOe HB-khGa_?.vLsc44+㩀_W`n]~ʳ mlN0`I6p~C l2J|Y=r 7r><xy*jscRYhQ؈>Aۏ'!ʨV*s6ְ֞ RWЪ n[^YͯXPItaBwccb׺643-uܤ;}1$;X_ *:_p?K ^gU$wؚۜʯ8!)F, Z \*%&;/ թ_F$s2XҎ̋PyJhݔn*#u.?|^# (H&)k ;5T;]dХk}ZLjiL5ߢ^(Nќ(xߺi8JxStZƚJPF!{xb=Dk`3XP2tVT4Ka/74tgBGSW/{|<{/#⽓M,4/փ9gDC%u7_+j"TR$ N^3P!"qsjm#j;LN$Ф>.jGLwWǶ׈Rnq~_w"j;aM?G)+ ümRALj_"!'̍Ah`۳ ?H>"}CJQ ] 'KDTrXWEƺZEE7®d9'j.>9gvTa@ˠCR\~ki,l_c< ӟ]2A?Y!%쿱 v3dp ehjwh0`:HǾ3pr!kJ3]Tcz7PN񄠖5dW; C˒?2.znnPv%UNDahQڒ1*Q}i0U5}p{Mmc]R},ı*K0BVlpCˮ± I6oڧBk"?Qv-Ճ;3q|<_!`3AMۀ8亣ꩆv"ڟSlRO_pG 7\4c7*9, +К}x#+}h߷AWo,<|]xwrs"3&TL|  c_R"Q:d&q+y([ٟG{ґ9_sYC 5&")rO"2ju-g-a`^{) T5LhI*x@p P-{tAp*Ԉ0 cJ ѵID Ti?Ϝ !qs,5Wۃ7Z#%kґWL̝U)Ra܅7- )2SGy2cK[V4iiIsʕ*' lYM@pGA>Kw= q5 mPi}C_Tp_db0M0:80+g as-Jorr 3 gtkkv4/Ot{1y}G(Vlo()i_ ,bμ=9M5B.˔]lld(K1ʧ8-ac:*6dMH ("uk&H/~ A|>1|a0q۷^#L.?.3/QƞO=@,gG$૭) gHv :GR#Nk<?Ά#^xiM;~}TV ӧ~ W*OX*=cz8z?3jsn&BkܯD̟k|׵z,?fc0tF0Ji6%ʻt%8!fbaNP_]WL1QjVW̜w+d.jT6 ɥl,۴]S=vW]ț`~`.dڳK攡|eh c6uoӢMƩ#v4}:ny*96[7kͩ- Ӟ2T q<1^1޷bA|8^3}) <#rz a$o`.Pm { ^ 3%/)l/tj3<10tV!>bq+K]-wE4 <ȣ"Aq XV޸FZ68,#* BwS4ϻKH5-5Ncuóy?m8:9+z7C%AAZxDҟUʫ.>1@ D K=AK/C!J3̴Sd6toys )z٭JtL re0ur)Z$|o䇫*R%Xx$K3FpZs Sr"㉴Jgr $B_~5Q=w ZS]ٻXo!/,n0(Ӕi򩘣Dpȏr2y :E)wsGx HXMg̍s^>Jݵ`A~+>MqIjh!IO`YRE}GțM@>&215g"UH> ˪p !L\њ]#kLkЩ̉z Ҩ#q۵|{tD@ IR^҂oD.Qy"cdV'*H*l9lW(ep {j]f thAuWl2JO}D3!27 %Dž =ui'S[Hs>b>[9ivh d ,4c*pW"{h?/d+IWjէ.xخ蠨Dy|/49/ S;%o0r2;9:;ozKJmg i?8G7*db]m/Է"vlɇS4l}=I'4)À}JMRV J!~ZlXݚT-of[3n:&j,\Pi>j,4Pяj.j8P[_v<ǹAta)kM3Kog`C78aϖ%hF~o w&x┨K$-LQfP͹8522uyo.VUO̎V q߮;6qWPDtM~aq4y|d-h=E1]}@*i%H^ O:)Cc.~@vEӔb>t)9c $P} 4YE:[J@Ed0\| z-*]Ci*܆1CٓVE:sҨĠ9eGNٴASv-.o1XR'K6cZ%_; zK6q=_X ԰'¢8"z&q=Yui%Io$uFbzrBw?$6D\Z4'x5  pG~}d#ť;{,=:nq멹*qc)flcy=H}w×u5 u&eau;ZI/{9w~i1eTIjVhr,LRL:9٧s"Pg֬?8sh _5i]tjv@`Gy!Uv x#LsnS!tD8‚7YH>8vvKM1}1G 90OS^9Qp%LM׀Ä,IIHznO6l0BzkO'twO~ (Ӓ?󍺝K#7 3d'!}̴#F R7nu6 L/^o9[OѫuZ|@~}j\b51zȗUy7`Ӭh >3,B-_j#~VA{ ]j0G>{Et<=`qImuт73MQն!{ 4Z8 7 ;.K16yq.WóE-URJ.LJXxPo^Ѧ# 's&^Tf@ek7ڮpx=.=rpb~~RgMĆgep55lD 5M{eǢy&71wՆZS'„55O)}9D@p<,ik.m1wwsj4iߒQ~%/lfLCŰ`kX-7{;F@Mu`dBMa6/. =(q>_42hUӿU~#v~nc~y,627}9Nҡ`OQpF"=VWjhVџC[!#SC=<JJ!QO{ XI{3)=2p嫭=)T X #(}P`hnQ<;^Js橾LPhvi!n=*'[H6[ "YPإ#a*| joTdd9VnQlE&DHЮЇp gD]znV9P>db{e_ƺ+~P2SKRڤ<:@`Q&Aam9!Wݘ8LgIc!F>PsK~IVfVwh[Q$둥{*zL{'P ۝4:EiRzZ@mȬJU9Y lCg*+3y(:kzk緄}Wa{JbؒTUX;cݤ9Š-5Q-ʄ`^2 ΐ/;'qgFև6Գ=;5'$>HVS:4x{.a OϢ@# ]2:#.{ƃRp#kBp I7ILPAv)εYv9* }\`f gh?j<lbu©gBD}@{7mZ%;tj8,ᵞDl6)_ΤL"}TEԁ7?Va6W|G3ÙPl)r%*7'bYCGsMMyg ZX{o^.(&gq[r +m /V S(l\~NIUB!lr~U_W*}4M  U0ޘߙܟmN)qFdDz`TL9B!iNZY}$J?W <.~/~KQegIe%qc 4gW+} \1̬sQYGect?͹kad1- ԛ:N"et,BzQn9U2s5R ׇmfi;-?PvFy~j,kD_;fL3L} &D}ѮT__kR u2rUbp5,5g֫sx\h4ets`[iY)lYnl!fc)J[NM>݄'C,.:DZ-MPh\RhI\+ ,}_w)1CީDKqbƪ0νūf4]pN5kG&HT0#tpE-ek71 s9shۅ?SpsdnwOSj ͸xdk]/ۗX9gQјlc 2!䀅)wݱ)BTt Yl(g4y&y{B/CKU m %Jz\G-ٰ/rبD [C&T8&_X[&HN1 T;[`d{"foԗvGfhdg;D5m4iz0} [kD ඼XQJү~ɣ{t[Zs kzξfi)Ux }sU#R6Qk\@pb=Ee&x1 C>hE̿r8rG#n 5ޑDv^gJgyHh~`C{{yrVƛ-Ke.LkJ:t\jոpzquv|jABdT_y]i -f ~02ǣǑ =D2fB.WakP*T>h,g6?\l'Rz}AY=кawl2ؚfGim g V-„:AHE)DHROےUQ)h,NVV~D32M|Q2wz[ճ^Eaਐ;Ʋ*yvh;B@u -s-x]wq?Pɵd7GS B_T7tRo86U?h`: \i1ϤUOYTh üMГ6Y[g %O,NhCp PSN,F ~L\ݺRcp1(O޸@[,O~(kUY&XVqeO>ΦBpgtVHUDM75OrHvѴ>V{ {A#& 9IeY֬'uቷ7ʏ`+sŬݓfȓ,7 #}e@;ÄFPίP*'%҂mq:vy?(O*b^2no#мE6FmMR4}(^lajɫdEK5W#eF@ jȢ֠9*Q!a#͑VxʊysRv}$qc]zq^|pWl9nޔߗ"!?hFl{R{ߺ ڣ&ܖL)hꔹ۰MԔِ34RRkD+~~EG^$7&sE p-l#4 tdl[&8TR벣)j(L$Q{iq+ξ:RA{lm |;jø>b|0)WKѥ&U.AEScKD.&r=RhhaUqf, hll:N선R&*<;5{|{p^VޜN!{ #!.$;u3͹ĸl _dٲ2~myA(8I;H_{: :v ft60T*w%+KqQ~Ֆeįs#DiKI 1W*4O0=at4ƥ``Ea*۴r/IX?z3[UjXх=3)^y:,ZWfI6@֬MaI[փe_jԈDqa(C}O!ek@ "+ y(ٯȨh mqwJ~1;,p<>qr%mc6Vh/,˕ =]@E+<r<3&r@S-@ U9TR re=4ڦ0?#*(J z+e5ZUQoe\1QZ#:6Ļ#nm.J $ļ~•>~牐/5#- UW^NS ѝ{ϱ^Lu׹BoA1> (M#^)r;|oEBYsޯ@Ҷ*Ct:V 9dU!mI[E/:g[qg4W(C d;nmʠAȫ7'JS3u*g$6;b@-K՜}wh&*_rE\J# 'Cr?-ߧ1H_Q3K\ B a8-:}Y =>5.j;c%R[!Hy,dOZC_,2L7XH{ӰuV2o>4 m"crl,?a:іXpZ9jJeI``: @ |R3-<]efjPʡ60Ԝqs~D C=1%*]e|x|T%&a`Bfҍt[צ컡USq9Ȏ8XZGh )xt]YP?2&VED!ѵn@w:)TZW@ 9@Pgte.sQw~}T|P[5iQ= > S}_ul¨-Dntm"a{1.dm.lBKê2ȍ; Oߨ|B}P-e4{#:}!H)+h6vnRL4Y'2n:6>q\d==3ȶ?g, Q^< +^,s‡-*ٟ7vZI?j/y"Xhx:PTkHA81$eiHrc|@ϑK]}|E"u{Aƛbk0 蒝p ڵm.Ƃ /DΫy r0 VMB}O|":~_QTT8"P W aYNګmn-fWu,6P\^* 1u+K{n2YB5nZ @NNlm\ V3j&8+yҁ)C-ZK[0V:70ҒR~4\"zG; YD}gӧf2I}◬1D7?=s*>%6RG-i. †6cb:SBb ]:"K(US68ޏt "33p- 4P"n)f:O "&ţ$_Jt7&j0[QsJh)%Dj1@8>ʒ Xח㜭R21%$vovJu9=+,j݇Fz>8lJr),ޠh(Ĭ7A} 4H2hT![$ .$&rUR z b d3q*}:dW40@0 K7vEZGәSSk1Z%VOpqף9npoaTE4LӦ~ܻez#Z!bM(Euv>ꙂgQB{v鏱#ȪSTDa9?6Ibݺlѥh6βD'qYFݷd)N,)H&9OM`pk͑iJjN^sQ/rIOA\U?JX\,U^^m9'TWHtMIkcvMEq[u>¡x>R ;N]/B.|Ye`%i#y85Z!ÿsfiv?>?_kl}m'~?Θ:3:^j- ZPPL*}EůWeAaB&q%7ﮒ giJ2;To. 28H6kK=ӑvJS=y/]2| WstyGн?$~ Nq&p?.Ļ~&,nL?-ΥB*bDo`C ^^$<0NI&Z>,NDdRBhTXx%9{OUʣM.d!Ă, j%ߪ+%C`?+ZN1$A>.'N?̣*+H.݋_R8#d*1C7,{>^L\ަ@olѧ#j*gqWkM6zRe55z2G^U5(6U?W0JdwgI LvèDx9"[4![ Jr<ڵ}`-+ A8ln^- {i&T #=@ PAZHB,֥+d@}9!(Þtျ̱M`ȗƙlhwN񉲄\ឋg܂x :]7Y'y؅@VW-}s>-+")jhh (ꤨ#UNG)?P#L05L#QTO?Hσ8?P;`\?($k{YoxG^{vl{U2[gr GrDSX{G큹NV`qj( ;iu,׳{(ºr"3^ EVs;aŇ <G0rf*go&z* {HjfEFsmxd/ X ۅT2CGRxp6ܫ CvI6S 3 {$ RHwTk-0xx[t6fڢ 0*ҍj$|BT˨pH4!x$EB҄IOO)t :|U;b{m 젽&A]+p>Lr5<"Q뀕$Emewg7xwFEP)\nޔSтւзFWS<'i[A"< 滀=ۅ廉]qE]t$9௰A1"Y*2ҷnJd~U@Ԣٵ*6s/-{}DHBfA ;6ߘo=Z ;d yoKs³Fg0Oe;e#hP3GE4^R*g+UGgJw.δgv5i\.n@އx`joIց9YrbMG&⚻Mk0M^-*L"l3D:r#(}#= l "#~F,/^&R붨Mcufk%NܵH |s?;>o.dhPG0TW@Eylz쫘S~BOXyP,\ڽ'iEN3! Ϩ#y.̎'K/}#PnGyxiay< fe+qӯegde:o%YH)`,cUp+P?0A||5oEQ_{U([()VpRǔP[ |1ɴzW+ ZObT̀g2.Z/tRCeEr~薰ia>s|XyX/ߍWwJ布XhΒ h.+)5iAd-b~8,/`.(fwKX&ݯG֊1h݅Q˜yDm:N֭"y.&%.z(~ir"f> stream x[Ys6~_+%RaٮsHr%qC eΌ\#Knbl}$2-cƳȼgRfR29&10%RS2_L9bDaZQj2QADL{ɢ `>စż6R042+tCG`|J)iT1)zkS<s@ @x#=3%&DIj:|IMFii8Z֓"4M N[OtN+6Nةg?fE}R3~ |^ FM}>NOW-bl#s~}S{趇fx0*M}^ w0m3pXqmXv˪A>WϦ=&좬VN2KMz)[k;*.W !=/7?E׃Q1 nǏ!ىMq^{g^#_4u4`x_FsAG/0;&ĈAлAߓ#4TA'S۪% -6U-io4zFu9h-┿̳;%# !Eat #:nmVDL+de̔1Q10'b3&q06Y11/ e,DX`‡%=BBpYVclh2i_GqtW{4E 9>̹QNn-&[M ) %$L=ϞInG<n|idusooC~Y {GY0G8,pU+ 6x6W:HB ! lHT-g&m9DD kcp'&m7'04Utk#BtfmvgS H >Q^mMaT{ >W`;1lo&lS@Q]M ;d4ڪz2) [=9^ lv#lEoBLH/L|X${ﻓP|:O;{uuEa_]^|tE#[:@*aZk:FH&uPƠ{*|P MyC ݦ~;(b+=/խ_IzҴE8!cJPWt2yJor`;VA&O6NkV/'|{Z6e^mg3&2G]Yxxuj!.U~9d ۱;Zt $R4jWewpYDO? oo^(;G/1eU(]hؠ+wS[n ./*<̎F4!Z HE_ -ʞ{ѠIT!E\ʼ[{e"̉z+P@;;|C ꚎCcϣl>c [ l&w,:øEîualVvI.e}J0-;(")c 9wv8eI2쏖TSLd d}x@|{aks3`|ޓrSZd"ۤ}1pljF 1mTfm3>}2T٠. eQ~?_De~O"frt6sm0mJk'2,xeV aVyx˯tt/2)糀=19t!?$G Uh(/e:95"dJm#+Ky~EJR_d]~n6PXsn~ [2繨Atїmt9 >ɠi/}gWs5>+>󂏇E3']c|,O躺Q VN)z&!D0r&j;NuVe-/|i}0*:KGrYJnQ/]WY:Yj t6z/ҍ2g6dM yh3IȮFc2@#$jV?AtX'$\Z|HzF*7i3m:#RۥmjCMol cwMgŒ8k @Y{ܶqZ'L~NiǟS;mm''MF.)Unl0) PqOe HkՅ9(C3$nl*sɔe 1ŦoJm [ZX!ݧ 'O:iS'HP1.N9ETm¡KQ= Ε$d~:,H -ԶVl]s'AhIuJgwi i1ƥ{針`d&:7Z^-mRtoK6SS2OcbDZu65ĎT*nꄃQ#LmPk gD?1>#LFn #21FFu$َ6do!7cV$;W m>ݤ$#;/Kۤ=}ww{EzP;rNf&?eKY6w]'Ƹڂ=?7C>OgR&͝Ro߼yp֔^M]G_zJ}|i??#lO[ qFǗŨ*.FvCqoWدei^|ǂ__/7W<-qu5q( Z7ESt>Lh_HG 8,?]5EG$O3M(3sr~*~5īb8}0>N`+ C"UmcXnİʇWcΉuSlwy勽^! b稸I(Aߝ_iS#kf*"DCY>[cUU, zI+y颾-fVkz0B.[7wP]ۗ ƅo:? }h{2׾HXr؆EL2$W@Y#{?HRH~NUrݳ%mDٚZ2JqYyܷ- endstream endobj 154 0 obj << /Length1 2082 /Length2 22334 /Length3 0 /Length 23626 /Filter /FlateDecode >> stream xڴeT\۶5w w$A[ ޳9}ZIX}UZQ*1L-$An,L̼y5GWfF%S{gw +33;<% Q͂f P2s{Ou23S,-\ޝSo / ruc45q}w[8Z8Zо]l`cdSO(@jg0q42)0AF `jambo Y-jj)U% e5ZjNN "!QTXh24[8b(y ., OF 7TK_ 4nnN@'Ŋ/~6O;_\ş$Iп|Oz ԴW8?X+,p0qtp4q4{t3qswe{ZS@OuRL󿯘?f69ڸ{?/:@qdrr+O=qy^73'.R Gs1;kW?ytmtvKGs?7wwj8ɈO o` 2iZYrXػZXZxX\-}O01s{f%/;uhڨh 0*A>^&4=3qвÕF`b_>WI/ se73 _v7w8Z[YXeߕ~9]{+/ ttTtj p48ZX98&..&R`/L ?zrrLB߈7bFyF,F߈ T7MFLFXߋ|/koZ{;Y[8#f?{o!{by |_?;@v? 9y;K!?;JG׹VssYh٘Q`bYd (>-* edd0]<Vf::PE 0_YڦHT@S0Wa jCdtYfRy K)C_7ۓUL%Ds543+zhOds tJg3;;b<]O_XnS+:=YZ1]ѽQ gޞ0cMDV °ea{18p.czy_)ijoZ+{f r9&˓IW1vQ8A85\2iل{i_fH.ϯE[P:=mY+؀&DG4BJ@`nO}oqK 7pފv,ޒUeqk{oTkX8$*{990DhЧAj%JCh@a0t'aL} $Sb2|gtjsYn@%GU]` 'gAx0 hϦ&WiUS%Z pQj\v1Vrה٫0j˸<&-UwEs8gd ,][RJrznj@}c~ZytgBh 7RaLmըv:tvOlNrvȍSw2J[H[MaɰG%tKɓ؝֑q܁CNQ[Mm\G_)4 CRhТ7&rtNm(~VC>UMT0qA5_{b#V }lGK6NS L`/I}u l$(WG0!!< =i!AB71" 0}f44+ w >&ĮiaC˜":2%/2-)|!ie3艎Q|+o73VՑ WW.G0@ !´MA6)B nx칗fTDq#al*azé L h\Wy͵-K./h]YR{rθF8bbH_4N*h748ʟ wdt((,6⑰_=Z_NK"Brr*?nPPSuY*zB|A{R]4[%'cI1=JNm)210KDd&N)%kk#M"< >PfE ,c8*5~ޭ g0mD5 ocj=JN[m\-+Lт$ 4f( /2nj['ҬZ`/2Δ c͊<Я 25"ddE~X7ׁzgIR"7a!.!`'ǵj¢]ay]CgmrzK{^Vύ'C|z$b T](071zTAuWsJķaKB=es`hdBE/:%|R >"4x۔,2חQ Mi-J?#aq„ j@pXZ'i)7צu.#= X7^ڏӭ_QT ^>!.R)S0bLv Rw8rQWzd3҄q,@j &cPN 6ėUaY#ޡ5Hp^XEdqpq},X.(V{eriZ5ߡ& \ģ0y4JFF" L,gk 1\uPG)N_aM [w>u*W9lgZpö Y[džKЩ*qY[?^z;8B/C[&g?x }}|0ɷWhs0ť܎65).XbI37!*a Ɗz1,RiX{&BP]W 'M/qy[{[PҷQ%q\F J^gp0sJ5(Т(Χ"uLD[f *c@)w5Aa#{}>R9NIACNs̤X p* :-{qAkah5H(L.Z/P`י ww·+Ys7bNL3sY>(L@,?h6AE~BQw<#I$NkrC US'tŇR$5 *Чuz.RPdΖ>v!rz3+Li4٭I,d9M,"4 *L)*QXjri?gsY ,To3z]k?6o*#W9Td`<@Nj?/ hV0'LZ+X5a9Z|gsiO9$9W.޶m"`JH|჌R 6)NW%،Z_afmc-7:&pn\nlGcB 픦FgNєw=Un5ijFPp2y3ŦKʣUZZ/y,{^>$6Ć{VE 3]b;ϭ1w~]dJ ='i(+ 8 HH 95>䗨A|KA ~K!뛇  OL9}\g$s s57ok7s;_mMMLXܯy8%8p1JOb[% )O39Zuh@閣b⁄X@ 6Q /a¼{8&8ݦޥx=S=/NcFJn}ܓ0 fI`[;֛[CoQ"E^cTv^L p'uGsEZ'7^P,2*InjZ|jZQȩib V%ND[L;AK>R>Ngb8qO-NMd0P`BMAZ$k'ʰqY><5N>'ڍ<m bOVWm'*,]=.Y ٳPCŶdO%|BTXO6̂%Ye=nOZhhQXMZZE~< ~8?fk7?w r {~]0#+? .~fU#O8ý jli 3'Fp ~1.:y(*Ut8Qvc9V&ԉxwgfhU dsY.< `*>A:^mAHBD3Vem>-NOfa8Hԛ*-6br~ _ȎH瑈xY zS)ZX%\}?]*\u s2/JGk~IT~ꏵi';$Ûp-5qy?a6-^Kh=25W!ɥD?V`1h{2u\"y5*:S&X=kD ݕ k[1YW MUԲeI".q/f o>>^mb\A[&%*e( V t&y (nB7Ԧm/l̶, :{R7B8MeE0T $\W(~/x\{ + ?dC5dWf#YэT(Mvo>޻ rz#/ӛXc;F᷻Ψ-ϕ|J(S?qg`;|:Ҁ\Pfvi^np`eG އlhW 'zf~ RBrj)FT\hO0cG0d\Ւ>yL`=EGw b8Q]`t@wѬEsllvCA-&{ؑri ^d$*ӼÒw;A}Ɲi7lͨ_9?׺[oKB>.Vh -"EUdYD+9$Sv,8yGioMP$ ˒TݽQuvdP1N*]md»0"]a nipLyYSwwmnv6w_ ?%tȍ`A[SKc~=u$%`+ޱ>dJQ{ 8[Q\\zҵ5%rq8|Ea?Syw~*]/b$V~t<4a0a9b~>Fz~%X:[y#0?qj\Z>Q~=5~w9/to /R\XszUlR"h*BպCVYUEOarVrWԺRx"}t#=寮j^c?<YƺvLQB KwviA݌U_֊N^JiՄ` ;kΦ0k$3RȂ¾dr!A˭E[T+-ЏR lt970S ݧM3(0v ī] "r^˫j'nP(h-Uux&ٿ,' a pD8`6vG'&6>_z95WT! N ƬLU^P$*}+y66P͖@\9N~A{̧/`eYیsx>M & Kܵ\]&/ʥRYҋ^ײ3{[wio-N~C^Pr&y#l]5hW̽Qr3qo1`FNm {\ٸ,29\`52|p3w$/ u!6Bm)Xg$'`Tbbu85@TU,.5Va?OOg/0-5sw7=lUhvHXȇĦ f%_hioĈ X[<pp}76, zYjk0^[~< !qNS#b=, 3LѢ9]\mԜeIFLD_*V֟0;\34Y+7&+9}Ģ |_#]:Tи؇|HuN!AC{dI'\Yaf>tMПnԫEM3fA 4ɃjSɐŴj_751fr:▆ CE8TE隦*Ur ࢅSݛ%v1b[ ww7ke>깓ӎ[vS+jxqդ~;N^w{9|anq~wPҵGgl),W1c_U۵Tp V׼jҰ1 ^%PT$~H8YW5fYAV0^bCYdz gGsu|3oqzyd6ŎKc!h>sRQ\ K7\P8,p)6m#Do\|/n99pMVU  ~3e[@/ 6uȵ^p+ o&о[" Q@7 V|΀Ibj1o a"@W3e7";DPz骤&v!-2wnDQbƽ4*_b*"yr{ǡ_ e/wQʅR3bGkwvsW?9D%ͅlrh3 &C)>\I~u\U30t[y<-X4SuGJ(?Qsi]ujzlxMtFc9EȈO a&8 ȎU ]{O[vj,Mt Hk$Q]oj D#Y6;Wd`f}p kkYޙ ̑n%22}Zo93VOԝ6AwU_e[zp4ܚA gHpDO9ĵl<֤Ǧ3Lx`Gu2C\oogAqR.${u"%+'eM2\֣d1d> pWQs2+w6msItN??j%H]ȄjkY1%mZj1V粨R?Ҡtn L| J?}xyii/E2O:I}D:<7Lȵ;A9ޙƒ,rcNwu1s/ t/`A9PՆɞc8ƥ=(I ۧGTZU2էM-run#pOicayqV9U^\ukQ.{ƺjN h}bJ >NBNNȺbjsM KŘ ɲ{%3Sw# bo+>Ԉs] ASkqߜQJ,#r><7DtuQ@ZF}0e98yS=+s2\ȩKKafXQXy|/jGV:>@/zCȭeŧt̳R5Of>bɐXs~^(h^h >vk}Λ1=n`uߙ7\gLOɏO}^QїohG,b$,@ǓMz(/V_Ch5>U10эVzgY|VTQA K>Ztiesw4ч;Zc4J谘c Lx,ŕ{YS& ʛeLyg)Y~guJ讌f;|pUQ0¡a=ev{m4?{Ke2Xg D,:$>g9/ Xhfswôs`{YROaJy3 ·Kok9DI{b>nYc\*#Q*pdIaOћ* *Vfy"!LA-{vx^̭7(iݰ+Ō% .-"23I(U(¼a/c^PTVV渲/*uRجG\Et 6 mj& ̝xAVtvvqc`m=ʲUɇW} 6{%Ѭ=ws@UKM1dAHsehKWp0M$GQ6^:*W=OBO-2u;ՠ#d[Yu/r}Υc<YBGt[2K30 :eCPe Vf`}[RϏ.\k[mcIBJV>} }~Mj? M]iJGN`NQJjg0֙{DVz˵0?'Z$U`@W)]9nBf+*ԟ l?~loXunu.ZȍwxFHǘ_s&±bU;z>ix8EC 'xiѣ=֌|TL\ [;gd.;#rwIacpygB)l#աz?9C*񿽝$^qG/ wmqKq#.DV\aW~ ʭF6k! ACk@:"R9D8a{(do~!T,T"U7ŀ8="3\~tt$^E~)Ŗ@2fy^F=@gjBjd?jK-R0mL#E5pŏT$)hH cǟzl܃N~M0SUH CjX#!aIce=g\^.?mγ LUK)QۉmJI]l+RP,{{ '6pN~$s(X ~Ok;1r>3.Dwe[]5e'OR$ #op4;%:ΈR}3u,:(4(z_T4C76cC+`VHE# |y1*`1]_\<nkMl޶,뷤=ܔĺA[WƚڷڭG=)I͐I}0pǐp+eUo6iVhco쩣N4H{r[N8?:TbILшlheOXvtқg;_X"'ǢJm,k"OUwRN}[I:Ĭ{ϊ&"8<#\k .oJ81x2 AzJs;C❲җ2466,CڅyVLy)|ZX*vYC50J"F|S%WPF92g˼5K/Mm;&AFAUK_zYlJuZѺȄc?W *ý)F$q6:E~ wY:~7kO66צL" =ъ”~я~f:/r㨼ofڪ3MPv!}tPbb!W_MVatcf-z\xl+\sW.X˖,ђ7PnVcv~@H.G;c-WZzF_aHm`0k(]Ƕx{ou SYT!)ȢK/L)ӨSTxG:=_Ip؜m}<,D'mV `mj)00abuQwYēOs eJ[cvtQiϻx:5}GC t}J4_H} >cS6ucNd(ۛ*ͣ1a`Bwu:qo}9?%ZMU$"c #`v(a  [722+O ϯ8>r61s}u.96' Nv)WSq˸ ]LtMpo.3b]vR㺛6+ː_] AӘ.lӮ vF?JTFaQFN|xx ϡ{ӂMGٹѷD9Ry&I`XJ '=gEas}Bi+2NSOZ/{?2ebs30n 1/Ipvu@\8. ko?&X݀fU20~dAH.}?v,r=;6fx[R|du3cQR_bOݜ+V6/(&H)pmq"gS%ld%?>S9qY.CkL@C[$wX /e-}0zLl4c(t͝Htrx4?ښ:rR|x1i}ճ."դrZk*a6ɶ19v4vjΚIm6z?k `?=c[g.@Av7]8+{g1{6#= 1_x:2{oﶖ[Ie]M!Y_nʔ$W}FOn ^d!J.%N-C ߀(T#lLNV" ;Mg?! SLDžpB>[mۦr "; ɞT9FAAcvF뎤)g֋#wW(GmKh\3Bޏi4wίwWWqD {4^I TdXr$o>Jk "SC87Έ%B1aǔO߉Y%J(ݸt5nv0帻Vz,).-P#z#d+-+_lC>uE}B[}*&":=[>r11LMp5 zȤ{:k;~4I ֌Noϱޝ>!M;1_,%oiجqA {k^{ AU xy}FXa{֎ک AzDԾ=JX&._8)b{*j>kDYd%?z$1ҘF|YThNZE&'S TёUSבe଻;YkUTw̎8& K=ny44Sɶ`~U4>T&XVv3y0{}קvO~udwfD(/?y(`GlFF[zzǮ].he)Ğ?3n8oBE7gdz22rc5}=# d  vYgX\FoHuuBSun7 EI0*&UF DzcaB'LBW͗m2r"'B>>+9-:ڌ{*ww"j"^-3 k&9%!pEu&1l ևYlۘ8'S8r)_ص_tX5%#EJz٭z%{t'+𮹣ZॅBEP.Z (|Norxsoӫlgi% Iߌ0On G(񌯆.9Ir%vonՖ;%m>:B5 Rl8&ϻKQ.HٌZu0^tAG2VhU零FgYSnnOq 4P w]%y':Cll@=ɎsYdwmU '@'imrf<0uF&IO]b1nXج[j4Ea}/(X$g(=6Z(Ɨ/'W̧zOby~BX6R郡1M-A0˕q9^{{\I?~*qgL榗!S8E98Vҕ`})G#XX]SqR!2;l82UYP-|9zUm8͇࠿JkD̸h x&tɪe L嫮N?f<06Nq4VP&=G,JZ%VOqMH$9ykJJq P(xRmxΰ[)PQ_rLkG4K:4&%T"'a/?WM Ą"`(q%vձɛ>~G]%kCk8PSҟكDHU)'Qj*)wtϹyנA6 :b";]=*A[`$|^3AI jXڞ]E 80kx/fm뎻5HQӍn \-j5b-]:tTrq WQ=qdָ EIK{.Ȑ՛h8=x uIq-ǏN0sX33G=#j2^T*J}N:f@!c!N&/cy+B|fef'&! OF 3_d n%ɏ `W`Te2ʩ91 EaGF֭b:o-yiw2ZRBcﮱS3WUMeۧ,83Xn%$ Oz.:GNQ Y*aiX6 oC>#x`DE)4 eR[jtڟ&Ou.uOE(Q}Ǫ@cnr6kHb{lCds*CҼăkND("7JFm48k݊yD(dO؞ <{dDϲ d1#Q6L.i{B0[8 H~O/7?RxՃfQ# YPUO7%^lhN:e뤒lc4,e[CsKb֤b݋qb{=4wu[x++*_~t3wRְTAӼl9CS>G<΢!9691yb]ERXwfy_XA 5G4uٻŭ:0t0`.&ynxlbphmw=A!1*w]B(px#L;nY⥥U坶'{*䫡%=U]6F|@݁g Dr”"\56UM3BX۲x]8D HDKT[>6_JwҎX_pk*j.Ε3ywߴM$Vucf#Yw\v)d-`BҎJ\g4j󩷏d5X.N,-۵k~Tu§[ ViL y%]q"Iq0Z>7h)w ~,'։#|8f{q< /d57Qy +i"Um.3y(S7lcGE-3A✈'@\HH#v?P¸B\F&M5_r-=p~wX-4C=+gg)= `ւM )Pɮ t,էv(|0Zߚ#,aK ܑvEMn,"8Gߐs0V>D!om_ \$S!biE-1g]}uqkLxиIhNf WtҠ}}7]&_*#1cqaP<ʻ.,#Nߪ?uͦt][m#9VK(שdDsNqr w(ބ/8_ b`} h_OI6phĵ@mlHjN~TDB-S΍gGSt*]S>*x VYAg_pQOk9Vyh$vULkr14^/Jn LO>}3+C|Zc{3]tR` ޞf,;s Y#"LC[@4m_9\mKưj|ߢEQ`3: ꩩRiӼgw'>?*Og!5wabz3Qb`;|uSZ XA)}j&hiZ[K i\k/Tkf' $',#? a o?ǧn qNJK&B] B[H dӽrsz5*G;oiQ@+A ^[|p5pJ)[ ޅhL%Vu2>&y}& I_ᵅ@k!q1ÿ`~3-1״ EġyRSǡ4uoAi?mJ{7uiZ ӑI݂BTȋp>MgeS@+'==u]vt6U>֞xv9;;Cz5͖j|TD,ϲQ֜{}?6Xm`I3V>~C^'Zh.G0t3UŘ1G;z/cFǽΎƌ/!^JҖv5?紥RKtC٘s8XB+5}.cK 0ՙJG٦ռA =mg\bM%>k9QhSLXk -1ɻ'<8"Oۆ$uX٫!c]kW|pj[2v 7Z26'SFy\'/D4T$$#(oBmٶS`W/F0/WShAtqbLаXK$:hT,uM#YUv->P-kMwoE >51J#7I=ZKH^0Q#La}K)$`Xw4Δ l%84tJ( q.{+1'3tW~ֲelsDΚCkxߤ͇$ !ߞK&+>p~[r]4x $͢Lfk?ڢZ%Gd+Flduq}1[Yzy6D U"}[FV12Ɏljt-)~p\I'gF#Ʉ6/%3H4S-ƫ([Mɪ)U6J[ďDV o`uAzڵ;*3X&#g/Sٹ^c?(Tzv Mxz݌Raå_!k9Xe#嵭9v% 7/|T.F&lsƗd3XbUMU />`Irnw)#@8پs9 ]z;2oA] S)Wz1u<8=RL·"vQQzil4#4Lh6c#%t7"GirwO) ڕLNG;l(~3洽K(blFü[T l՗fYܺ~ld+TK+Ϊ *tw%p/1&-`ghl-'T|25 d<-j|Hb'tIax~4QI |zgٳOpl*V;IR|](fq9-FgϠ*q#dN[zw:nP%*?8l6cY/$kjowJL4]+.=3]g2RzP> /Vr0j*+"e¹]pD.PKB>TD٧Ok\}XM(hJ2#h5[ւM+;NOp!J:Nx-ɣZabMZ}&v bbeue"3G_̼N.R=ܫŭaa>Lkp0ɳVNٛEtxɡsGh*e5?ec NMDTuoe&Ө1lpYidLb:Y7,&#UM/XglA oH^VOo2Z9"%Iŝ 6οYrЇĬL9^X(>E~ք?0VvBfY%k^$emD#]K:iqK8 P endstream endobj 157 0 obj << /Length1 1608 /Length2 7326 /Length3 0 /Length 8144 /Filter /FlateDecode >> stream xڭTeX) aaKJF$n.xuu硧aY`Pvn.cUcAN~,zzYg p @V9Ƣ=6.&̬lNXz#x@>\lAk02TP0)jAPj j`  1a_ZxĒ,pGx 9A`8l-.3pP 7G5!GgccL w.ǪZr tp]~ `֏V0a.`(p]!hP1`8l, 8t'tos'.pĚ&屶 {Q07_~+W@{gIXXOSXS?'@y]q _8@ _`{/Dq PG)8r `h <_jrG--h=t?!ÛSQVP^,G]t=w01dd`ovnA^;/e ze[8=ƏMsqiY#¬~q:;?*?ϒ@ 4 (bR4qw'7P:݂J'wU"=8olwB?r)}_0w,2 nqxN- pok4-Cmu8dx@Lw|[O҆_@Xːuy;sߧcԮ ֬xLzQ~);.gu{wJ̤Z`w?uv'ʦ44q(`ߔOmQ׮oC&:2dF nK,9ۂi]&KX8S)^DZ-!:cJI}uMiR$A=`\\#G'eUL_%m˄)}_'4QiP (|CcI&|~MfS>c*0urbU>g[/pc , Sq$hڦE®{09mSdC&Hc;i11 љt9:$0A`XɆw),rEOa[MyChܸ݁RMEv\AaҠIUju(k^a; _9vQ1-j_ %?t(Rp*dJ5 ?m#7EJJ`,*R4ן0ܬHh+$vK+uAvr`Z#A d):E j}U>M~1I)Gmqg+l-fGWX Zx5Sf0nqa/ 7^۱uG<łeb,up9WCZwrQPwT9Υ\O Ҝ,Q"}\f'^)!TPaOExZg4$5Sw9(dWl#|U^F*V|is٨#MY7f;bu9j]R]_u-k?S!MTC+t>Vxrt}-q&Cnyn\I=JE|ׂ~:Qihj*㜁 ?`.y[nd.#}'n{'݋3k$KG/%ׇniVmj2.@fRY1SMEzApd!@P]Df@?YE?aZvb#{ߕOM5Cc$R|KqH`L&VQQ@-Q[X Ce9'M0ʶ\;&~kP&d*$9-o&'A⤴ٷyxDȼ6l!6c܄I!S]\{']Jyo/j$xvg"'`mg 9ԺLÚIO}9?bf])Q~ v4BL;q09wϋJc"§~~E,~WՔWYm^z%X\RyCbW@)kbH`SRoJj(4mp>&biOmyth EmC2cb 4v;,[xy] 9R Er.:ch" PP,n:rù?B%~K!Y au_̒FbS@\4!Kl |HБ1m͍ernoifOszCՑU?T}Iٮ=Cn&됎ZS[gU ^=DYw=AUT+RJGK M7>Q0$@{s/[ڹϹ 27SG紏|=<#-Mc~~SPǃ3ԢeVMU[YXI0 72kឱ`{_r!lDyt| ;ǎq'sH,܍^f''3o2FGA?HFIbHҟ6W5ϫ0TerIvCxdnr?.p&FΆXqody7yh܏׎4ajd, fwFeZFʔ$'W׫{1"F!xDJzȲO?>`=WHud l+qgҊ4efGr_se:% 6~A"ZypzCg]0ά9(iAm\u0b% UPĹJca~!Jh{e[ֱE_FR&ڷ^]\0.}ĽdȞ]WkJ\'ct">i ([>F~0JoH իa!8D@鏺GO󅮒+2R },B;Z"f=$}rsb7AnҖ)k*5(q,޸Dž\}'CLr:R/Og m ,V2= M=Mݤ ,GfGu$'\n*YHېL2E{,/EooL]Gc3 ?Q 7;On>lCbկg|@ÇΟZ%N^.k9R[wn1%ѩD|d(Nj%V;viy:gh &폭у#^aunRCZRi6byX0YB-_,ptaK83oXZ;@*5nF}n >FFHbi+xn&J^lqOM@hӬ1kUJeX힚wÈp=!D `b4ǿ2ZN7ϯ1¾\Ľ{-]KڑE[ .;ZnLYqd 惨H*9MohOMv\Ǥx6fWU EGVtݗ?oUj G:h aAiI# +OuW1U:Tc]\])}ߒ1ޕۉ7 >"uN̐B{/s8cS^zr5Iyһ%r&³!SG!jhz O [xcsv!>+F'57ټDXÃgHzفjbfoyMAvpGH<ƥNG6.dLXZˇԈ#z'/i%6{Ko:\I1w+Fi!'g]؟Lj4-mT~i b1Tޣ̃٭_ͦ j)Hl1L#gPڽgP}kwSgFSA:˅Zy1@Fss6Uv9,{@2:G`MGq>Ko $" ׆b,+y y8 tJYM}@L/NS Aɓ~$N<0 % P&d*m/Gޱ`l=AJ\OGѠ+5[)Fʦ^ҚiVw{OֈL?!Ǡ맵}1m.vUpW9eMDjayi|t ~Ԟ< ̍v[QF-Jsc,@saA+IqFB(;r:yP4dD;$#e 9DXctXDBյU'Z J@| !U9j xΕ܎ބ$u/ :R\5kk*0 /_\m(`B\ɍ5΃%܋6*}:Y4G$ SN@ypŝڌik)C')[\-[>UJw|}g\]zhϳƳ.ZoJ.)E};Yb<5n,<$ވ[5՜Patc Eo=VK|:Bj5v@]j&b\<,{U[ _ ʘ[2} &tнgs\ۿ52?7AkPD^`f6h>^e!ڏ",\P:%7JDj Su?ؘ9PzPu%sbǫ3lbYy=aP&L53 D= +>LФP{_Bq7#Ixޞ4yaz, 6KXZc]V}m4cn`X,]pg'դᆐKA܁AU9 R!]fpuQpK <FmJ#Cey|6݇D{15[#gExBha='ӊG,Vs>r,:6A8 BU 2HLNBQak_(9 oKDhH4!ƌ6-M4)OJQըCL;k*vpqE1 6~,4p4c 4 'Y@m(f{项[,>O}6'3sFWs%4 }FX&ޫҶJPx|z {VDX,c;tSf1hi^p lٸ,X 5#jsfer n EM _ڣL\ P_w;-/q3F;k>eyU@enK?bu=Rj1QnLة{9ܹ)qv$1唉gXy< ἢޔ[Q%23#?bѷ!RkM pŔR h)Nk7 Ba'l QXv"才 }_^)#Ɖ >#AkW{_5rcӬit̝92m~RMNR2l|A7i_:?)`r N7-/SO|Hu|G2˞Ø|pbWJ-uf OB @#@*bWb-iN͹Y%kYJ,hԑ M8җ*au\7JKg21kWJũ c)~ moҫݪ5`p7`ap Ͷ_+q<82n=/Qc^5>ف*ۑɨe4|*ZwX ?3׃$8"0sY('H컱>Q-ي۱H2,iiqO/U?r®XOTݨ3;5F1Ȧ6F863?A)E՜[2ug =5B΄KzS>F5]|LQ]! 1 @VfX'.=^4BG?.9o0qnWF|]|t1fe ^7M6Ze $3UHH`RY1- E>0+ŵs< oP=dr((ޗzR/O1oke(qڕOLXkZ4耽.NVhܣl^$M޽j"ɥ) U;vF;1Vߞ{B=;  YgU endstream endobj 159 0 obj << /Length1 1144 /Length2 6109 /Length3 0 /Length 6872 /Filter /FlateDecode >> stream xuVw<ۺFDuDMN%>a0FoQw-z/QQD/{AreϾgsǷyz7(Bbx q&bTсٸo@! "]8C,0pRsں5,@~  o Qhq6j004QV.0$舀à:0g ,?Ph-ȭcpG#`111_ P A9o0w %);VB nm89Z[n0^gk^$ wP$T[hMS|=őO wro D7f@ 1?[N-P/G# [nD^0 Ŀ` nZlnof^A B($pM OAE +JVu# 8FQLHa5 (g7xWƅ@? {J( $AB<tT0 106ce1?86tmVH`H?R* PP8 rAoݜko )sYMU5T0~ wt"H^Ԥ/b%:]^V-X(7{1^|/)pyIh~>E&enyt+`-92䐒L FQ1o8i10jm> RF>m$ rm-k0% V"TY2~n?mQnnŵ~7@|`G @JK;/xʊ!umW0w/@tGiݲ^gQF:IIdPeTqo_M\:[3c=eCU$J궼U f9)J1vb2?jZc X2!?LM9o?.9_(C6qg_++Mh"kJa<, ˁ :G(N"1#ˇBݝb S N{cd%A/u" aQf6ǖ"N s~cl/"CoribV$ _Ku #J ^qĄv`y*J+Ege-}VwR! H6GLˆ'Gf5w}L|B@cF4|;'rRh|#Sz¡KJQ>AR:gvYCqYq}ߧק" 7wm SkY)o^r=7#6i=hJsRN-Nzݴf0lW\Hb;XW?(gycxi"@_<1{dg,0uy`ȸ00Ȱشf,zz)-i{F?FcV=榈66X>%?7,U>%0aSm\>& m8V4GoRCi--t}F\˯o O-O}(rnKmV`W5Bqxl[ic\1xbVypfhj<Ww zɻ/chrX1UWr|~N~,[]1S'ӔE̒ #|$Ly6w'jmr{$Ƣ rp>Bk3)Š0bm+bPK4G_CDsutNqvL+/n7ruŌjowgxE.ټM%%/ wh}r7?7բA#t?KFH4drOzΠMb]AIQPPqS!dC.?24^DQ-O uR ZZ%Ժv X!uH}7[\٦` gaѳ|LtZ8Dӥsn$B>yI]-C"ͻЖ\UZTJinw7 [\\gj$8B\[\|hYȞVn&ZI g _gXlJN=`> `* XOa% ×U͌L1,3F:M CC-7wm @&c쓱 m}OhȎUB5CKEq9\ɠú/ ͼaJ$  "4+9IަOTic=D9l |4q{c^#JGxe+ǖjx3sFo H'}WMzOKXn'Be#(_d~A9մz?oŎ#}̭ѵ=$IENsisӃ(˖AGf afAm "ٺ&UU?V}&ֽkʽ/dԑ2\%,W"=+Ҁ-Q/d\Fr U♬:!.|g-9Z+B?K >t槊ӃF']}zI| onP(%#Q'-@Ƌ=*G0k }Vm>/Ќ;H^;c]“eÛD3".Rfpl3"Cav)Plʀ5[b0eG0vVd 'KfZH9!X튅mK< e.[4Ĭo[SUH*5 c\]AZIp.5i\3Hѽ6P>OiTMx{rܤRNM#;ϐžu/)fڰLv2_%}-lKȲ=9{ln~%a?in~{!5 uzY~ڳGJLCĮ\qlE'+n{E9Ep[ބ~9`_uu~>~Kʈ_RVXh'߇Vrys!&K56DmuVrÐ YUq;g@˹ͷ=}.M#;~>.YiY¾a/7IYpW ]8i{Yk5o>0n4Q0ERN.Rd1d%t^wBkZ{9c?hޝv#u%_EsDF}0h ygIFk%&A-iqT9&!&qG1#bHҝN"1t6x@kyˣJTνwUeZWt"to.N>2Oȣיz+Myl:[pVBXZ)G!N]`\kK5rz? s;anшN&ykM.*Vxf+3m7Ig[Km e ,yט˚[-ߵhB@H ^}4"-z C:sypݡ$o&˛GZFeT|4u<'@C~H AM0ýe įp;XTJ]pzbޗrvDpv.^֣ij564#^g<a]}yFkw)ʨgȇS9379FD #1$ok*ޑΔɻ=z.|3 ZiMaN y{o:>{inDOpPKqZ E6Dl@|" &YYyӇMdt>'e1\^Q iYY;5卦1@q^9N^]2¼y_{ NИ*س$fgW[k $P[r0DiCӎ%'xT>h݄'eW5FrJNW~6U 1y i/75v_vmK`eA i<؎orGV~z,6 SPtkX窒$,фUޡѪAh5"~!!a4MÇmdݑ^C ~XgGbn_?6ʸ?z_?'Z_'^V4W$P T򥌫.mpd'伓MN_N1@E(|U\$z] JWخx{KNh1a KM']A"%^yR\, "E˅gCZqA=HK}X>1RpՃZ sM DzʚXQNφ_?7nO-fk+#yFz,HO*i R]=b%DJ^wUlM~݉jqeRyVjEgwզ&JXZX+#LVyq`>ptߍf w\w6/t t>\\Q_Q@a3Wi 5I# DeޱZA&kb8#⫨6۟%:U(;SH% z EWWJ-krzY.KR1OU;%V`_> 5bL*(~={Ia@ tRzJcJ\V}uhl4[`*3m3˖'Uv'4r!V15ftZ4P,X/<ĉ!.<앦ydTPj@=n zqx߼3o^yYYfqau| .&}ǨOdDHp82/^'5[?afr.r090]%LBi$-by`dBzcE8N.N\͠fZܞ<͂$;`д1[RbTduȻSCO$ʃid 0{3wߧlROĈvj~A>YSt/Ln4a28Wk1aq#Ͱ)RXN{\9UԶ4R؉My4KΙPQ +/cQWQNBkpk&pC@sZ Q)c&&]68fqⵚ%V\&m䧧r_i9qX*'1a j񼴄j꼙IfjjѥoRd"D 2[$٘!WE=6ۄkZ2pxzV.3*$*(]{=8~w'cvR$||"H)vܨzjezBr6ij[d9cE#8Of~, B[ng]3![ 箕񲼮"{͔ЋەsڢbD>C 'ӈ8w|0wl|8; Ğ(nygCOR endstream endobj 169 0 obj << /Author()/Title(Counting reads with [functioncolor]summarizeOverlaps)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20171117193907-05'00') /ModDate (D:20171117193907-05'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) kpathsea version 6.2.1) >> endobj 156 0 obj << /Type /ObjStm /N 34 /First 280 /Length 1576 /Filter /FlateDecode >> stream xڭn:LP#.$('qKȅl6Oeђ}3P޺h$R3>#uC BC\w7,i|!K$%4.aTȎJ$'L0I1x'0P* wL p%@ 8Ő\8mpi;xE{& tB (|.skcnXEu#B237v>|ݏ"KPeT$pO.|~|wv~u.~.D8#vWuO = !uSs"=g'J'u iQ:Hqu6WO:P{ aLVdpGp gp7p !aCP0ɏDŠD03A xsʠqT o9>8rtBOE|I4\@4(|"x#1f)s2zm2NÅ `cDI\)`_"5ĪWg*US& ۫SЍ LlHVrmmB| !ߵ1nGDfAT6&bkКL:n,c;PcEF*U@e+Ñ \$tUs؏ .}fzDQbAp0Vvi,ĘwUg7EE d: RgEa6*5T0J,&* XѰ\lX4!RY#*PrmȾ; 'pJ<[.7u>B? Tn oe.H I <_ |?VTPZ:ߛ#F"FuWselKSLMu=bI $JA0R._Dʟ+ ⢟MӉŮf[K_7>ҫ] "լH] )Ҭ&^ss&>inWz16ҵƋL\c{ܓP]'7ȥҊ_a6ztƢ|,i,fk^M}+LfN[n" l9<]tlq7`vm.HT3s:|OwW훝`vf\Xmj]V-n8S/ۘ=-j+]nǗ5MGLMct/jFT5iRu]F~xXF"+Q([RjX+_i2{v2T(6Z%C*fy2TpRw9S~yvc endstream endobj 170 0 obj << /Type /XRef /Index [0 171] /Size 171 /W [1 3 1] /Root 168 0 R /Info 169 0 R /ID [ ] /Length 444 /Filter /FlateDecode >> stream xRSA?Q"BBL2E TTP@4;.{*/@-WKݲD~S>Tw:%fynǨH8M9$)*GcQZ4i T-ƚ:8S'3Def֥57QbbUͱUXUK,Si ڛ6]t~3p l+;-EWuA[Pp .C[P>8nm?u߀[qI5Vʘ[mZ|! 0nݚkpmo[cWL$܄[p,\w^cSlZu{Ldts"D-SxaVa ^~^TUj}vS}'O7l`UguN{_@hp,}ETG|K/vQ endstream endobj startxref 203255 %%EOF GenomicAlignments/inst/extdata/0000755000175400017540000000000013175714431017620 5ustar00biocbuildbiocbuildGenomicAlignments/inst/extdata/sm_treated1.bam0000644000175400017540000014560213175714431022521 0ustar00biocbuildbiocbuildBC]j0`O];hnZv+VA.붻hP:/?PZI@&NHf/fJ'KB|ϻ s@w;uf7<ߣ?6boru<w jނ[4Zp܉:1 x\35J*lV ؁찄Oh!y [h{{d^ԡdJf||߮32BzΗCvn J'DcnP'[݄BCg;}{,[ZS]]U^ݧ f~$nvL`FBU`WcJB!$j5ȘQ j"FQJ`}VZUGg_[qxQ?_;_X|-&g' (uY/~ҫ֋WCV;nu %Dy;ys'|e0_xx(fLJvxݟ7t_먮3] m(6QCe ʣvG*WUY>JK:1_/Żŧ7(/6(aaxu^.Œ6z(:Qq]ooo4xA:̋0VÁnJza*ʏ`o \<;k>'f*S49F!H9,d2tkE(}<(IQ2nW۔eʫ* 8'n ޽_ɸ,KݪU9wa;(OODCUU] " hP׋~=U ]ygAAA!/}ƋꋱVվ~e^up!9}4/p$b?K#Fqa 5dAJDAW<ϔ9$$=eEK\N q^:SP:!=ng$,r=P>GoAjo4S Ŷ:7e=i,0OeUaZ(x6LӜ'lks-G^+}Uaz oQOR:R۴ 4E%~ x3z<D0@Ƭ_w4PNs ^ 0lHwz/g @0 hG=2+(0 CI,Yp`CڴAQ 8caCw%-7`>`Py]r37 =o:$$oA5r7Pwk1K{7EnD)QVn_Z.Lr%ŷ粰GQ(,6E`#Iq{Dbf)>|"ŘLtW-1t6{&$:^iK|eRČ<ڮvltUO@?)tߒMEs ry%gI&eE'+O}vJNJ4L=GF_sAǨ=`jp4LW#G8Ax3B4(3CDx`@ƾiNMȉ4D!o6LKBCE:HAqb*\4znCJ\xA)1$Ƥoɢ(pn~ #E$Q>L؉e)5lCA1[pz؄ QX &L27$xpb; 9&5( @-@f[W/W؈g!z TdA; T3I-IIj$@CQxS]ST,ǝr(8dhaY=g{ NgE8D bXXBs2sgpʐc`؉Pvj}WN6M>:܏ MQ:x8GQ;F: Y懀һ> .QGm;>i|S9I8oBT*22u(WQ!('1_1_"GM#1lOAʬss8P>)3w ShкG$:" }- '_pL3ǘk)9$QD1\)8tBסH v"FQ Q0Y4DpS]2UA}r(C C IEMU  ?;Q80 ÈrID(C Ί8GdɿW) :ɩHɩ (Ϙq`rJ1JWc<},PAEmtB1> UBPjМeN Oa, q-Cxhv큝S><,-U~GKMݚ4M:DY!:z91@P< ؞P,O(EQBUw@aQC:PDQ,|>Em:1,t>e* r) r ;jڜk^3v%CC:$4}8G|+:Aq8s(]O%s/a'y!6!'M}f`YgZ\2 X"7Dte9o͜zďYx1Hj)F|ʶ:8GӌM4`%ܶK1a[2-(BY2zcr}Pp6,û?1#1U jq4<ټG 4"o ^ΔQH(.j9~.teÍ[yd /_몚L4u:1M>kΰ/~ZNyjkKO oL@e QmBkHȡHR,d%NP؁ >'#`i\=1-0c⁡y8}ER Y^@Ӈ7t* O"^(mڗ?s9%|2*yـ F&'dچy5Pv֕?#e$͋1;g,~ebg$HAGaxxT3-]@D82+ &aY.rnĘ,Em+8-Ĵ 礸") {QupU?aPwQd21jO\L;֗BŢVa }Fq9~;2~W](~S6I5m.0b$2 Y!+ C.bY>5a&xކ ;YE'Mb( þA<Zg@8dj $:ҔU*ŀ7^y,7tYn tfp՗I+@\x XU~QrI}JL&w(Fgiq>_|;dr8 ƟM\Q  ]mR; xpzo7b ,azR,E}=Dt(饴8`hz7!ԆI`Qk& {U'<ݺuE i,:UܳPpc^FQ;(NgIX;L'dfvwH/01ԗ-%ꇙp/z6%u "xޫsdbt+.[JJD RR,xmI0 r1{wKqtaƌɪꓩѓ:.IGG`׊v}*JCW0T0Sޚ nG8¦n {C4mjuݢq#)qr vgF۝W;ǥ5kŨgI1Eq$!X/7 ^'ף3rnYC ʃR=? u"q%Y^FNaTj;)1Jw,\UDcnR߽{rw 8]5X&p"`_?Z6Y|}ֵQBc_->[Qo\m{L->Oe2]RT !euIWVX6R B{Tb"Q%um\ 'Y״(3x(.1Bh]ۑ64Wd&j -=#Lf-c ;ESU,`~{:z.!8n8,IyO1 p$o S \! q@`3A^EF tȬwQߕ@)0ļ_3NɣWmCfNX TG}9_-qE׹FEW Q!Vct_ &t]QzH1g\Y%DYt,f(8A(@r~@MVi؍V=aPھo".96ՑniXbZeͯ;$Fgρae(%4]!1-2(!2p"i|$3-^EO=)" ︿(LtX;DtY2"KrDD͘EZ1Tպ5~HufMDbhgo Q47[͙~k:D6OMhߜ߾),  0`:X*q$I}3kS+ RRsF38udJ'RHG1t'}0=h3HHd[ )\: )CNjqD<#n:N]ӵ)[\1E~_ωnSEAy E~)5ŐI1Z$$"P `xuǨ?+sV,:~֎0!6Shk7^L)R q1Dej ( j~ӿfl>ɥs)TXdq۾M 040%XGDT`.Y[E='k !5Vl|`ыkQF<5lvU j\Lt ra)qt}('U:FQ^۶Є;=݂QQ-+RQJZPΊJ,o|= Ǡ/e?"eEA&jӿB1  ?7+@1vE٢k%f{?*%' D'1g؛ ~jWP$Ea$CfV,)X8Q:C8bB.kfdIHi'(C ܂k/¼b=pފ@{8UI ֕^p7EiNE= ˲&M'( 8 F1f@l;j ~)QuUc^QfESs'P}=4'x aQ3?kfe3iaڔϣ:YM:?.%.B?D碬Ѷ5ϋe !JFh?zWblhTY C Q_U鿔IOBHbƑ(ؿ:ȏӌf}81tǘtOyYصD&0ӰMlS I"waN6qGtQ0FPi;UĘCG3JY8\~'*<|sPN="X'9z! U"3H7XVBTVNHJ0?J"3T= s8Vot&D&g oC)Qz( >TDBlhr(lVGvQ)+:ˣY2F EnS#??= ,tpP޽<]+Gid;,/rL(¹iΫo(Kd` &ȹr",B0yK,pN sWd)"W| GQ)JJNBXgo{rxo&pG-Bpl>&NM-b jPqȍǝW oz]E'EW fh۠z0>%u АMkuu'1t{.oC'b()z=%7#& |W{obl=ql.-dPGAJ.)[ לL.ვp tA@+QϺ؜[GO:\tX[/XjEqHi-e͂HN03y(tQ-ŝ1jaAI-(;؛JcҢT Z`{qخC=zZa@tLVKϗb4(P(mWg?t0Y*SVo܄H S4=Tp4Ba90IǽD#s&7567BW_"?@NT@zlA)"ɊSD91am' !dr(RP!)/@Vg&E}œ|) .b.wx dJ& G 1^ g/xq LQτ'="G*QqxM}DǭQA) IӬQ(@pc$=-H-ZO&m&氅('1K/"FfzhW>RoK߀u x\ ŗJEey'[C#]Oi0A?*eYA&AD[;[gC&e`EcRvJ6W,خKlw-$`دT<6OcX, JOahP(0!6V#%=R<+&.:x]gAXoOI" ߼Ip7&k܉gu:4&_L/E&Y3Sb4dz67`[$ox(fk$x"n7/xWbl2C* 6;8$ŕ`֒u}z[6mQri^qTGؠxMI[WT!F0-]@TA Bi9)\,MNtm4((Fv܍z@Ʀ. b`QC/W`DpgLpk:G5f=~ q(X+,<Cak61oU/M8HqEY݇:%0Bq_'gfw+@1R|cb]5)@`Eyѫ;rw#p|O⟚V^1]{եfܝG,螄 >дyr,tN e ޜ̊`awM*@'rXMvUyXQ骪ް{"&-ـ'BEZͮM*qWWUV((%4!45gO9<?oۇ(px,ԇ %Ih{~_yEntIN.DA"3OlضXsY7lsR<7l `C0;2 /0X6pf8,b6sR$*?g{'BTUWϲ?/AGOFNYfLF,(KO\.25P~6 {!E9IȺ f9WXTu=aCUl\\$W(/luE w$F-\p4A3j)s^j5w燊HĞSMQmJI|ЗP Wu`@kDQk7" O`߃ nh!7Ez͋obT`?ߍ'6A&q llP$k[JhSEJb✭s!s|q֫xc݂{R k*(ڟ8Pbp 3ǚ;2%わq(Ms3 4qvP?rEXI|̓-iu)dᙸɁ].ϱ8( ohQf@hd1~C!Ax'[$l iFP7h~rJQ$1 oʝ騆1%gLa7W<(żb4xBʕ(F>xA|krz ^BRfiT/~SQ{ ?uU϶~\1q/bTqf)Xq95j"y"F}ST"&[ fK@u`ysZ3IƣAOc*qi XhږsƨaǠI1MqXW&PkIql+ѪG`*l %5wN+)*Hs* %j~bEa&"OsXbssHHs<0*b*bPxg(>϶rixS3y6ⳍbDE G-jC5i'i0O`AtvmK̠W<&+_șv\6Y$yX =F堒}Qp>"a'AppϊiW hHiR4燱U5UB3un4U@O+>]~AY3E{xS41B03+10*RL6d1H-PDXe ]ukP-'c4@@>Ipcv=Aa<),kƪGpCsg3l̟_Z~Ląm";<\@aJ*<郔Xٶ:fֳtEuk)?x)31Ǟ5p+j?C UrsWtK3YIؕ~

症ii8#?;_pA[m59ӊq2<8qOsJP"-~Qp%[KQ/](}%{'pJɠh%JN$RJGɵJƢa؇[ Pr;%e(k{Pr%F T%TP %_'7.t8 ="J꿶׌P:;mpӚOܷyT3E%(iA+&A [b} VR&.XqٿW. ⊘3Z+[q㊢p{Z=m]Eq. .{}y߻orh sq\ybk+vqe\HUi:u3}7;Ώj;iB|S\KeNCvsݒŵ(Q!(/@)(5QFjC0J6t=J'ԇS=P:S(M(  J4esO;JϮExyһyN$\)kp4\&7nGuj\p#jn̮Ǎqc)Xq.nzwq7;D&on MzܔZg2Nu)߫,9٩MLܔW{܎ށsKq;6 &]~Z{]Py4!;p$);0U );b#Ca(GHD;L6z桬Y@/LyGL9eǡL{? E٨nG9:Mec#ʼtP6UgܒE (煲kkX݂%wh1;J$n/YmS+{wpIw]pwB/ܝȉqwgS;w6F&N,[:1b/q)~IXC_tC߆Ds)5^xāƯ)|H M`x|N]Ńixp(ۆ%Ll',Em(0E; I4QmFy8ˊ^'-DPToA\R \S_8*f@EtGT,.AE)*RxQ *uQ"(*61!8Yxv^E C*\A[_<߮Gx^ < zQ9d2*ʢҐFPiJs}TCoܥ{}jϬCwv/ ThRPҨrCi Q Y ^lG2r;*5Q9߄xWT.-ʤT.7P<*WrcTV9TꡲJU`UҨ*釨ꟍ~\ 6d*;nTCTe8*TʿUP|U*TFM{ʶp3Ë] p^\.Ƌ+>^;mGGy4hO g'r^n_JAӝ~Tw9|ٳ|N7%ǠZ 厠[T+gZ0P=@ զ!95gk05h°5QܺGs~@}Y|P35>Q;5[Q5YP;5yը5Yv&jvCٗF_[Ps}jf)<ʳyq5չ=3ߦ{ jV(R}Q+z_P;$ Y5f8ZãƑͯE_(KdY+:˾xɐ;7xyG}hmvLn~R^\ ~,/^b=셗_ KI+Qx%'3Ixpk=Ji+^+@RSb+u5pū,kP5^i+mKQ/p12"^+:Đ$oFf8^Ûax7;f *>m9`7'Y~)ěwy]=#v{{a oNx)7Vsx[o?\ۯRϠs&E]7NuG]רcyo;;w*,k\uQqsC/s:먛r3L}~?i9li;W͹Ѩn,ԭdMPSuxPE]EoE~xT:|؎k!7 ŇwQOl"zNWE:O,u)chc? Qoc~r6'#Po?:"@}?Ʌ%?sϥQ_$Կ܏/#9|gOG1 58<>jG8t>9U|4녏+q\|qǫ)Wa>a8Oeg1>Ba|'OEkm`t|:aOa&>=Ƨz|z~*ӋT'OY{_J|->h_^{}|~+]wITKsV|gy̷n>o瓁 z'ϻ Zz#˂wMo%6y/9|l/] wO"?|sa]< Mbj/#خY8|q|/ %p=dVo5}~9?/2˽rWA%|6W:_ xi2`xu՚N_='f`(׬{|C|]7_TOԒ t z_vc|3h@|/4I;6DZ5LjGΤ=&#d'Y^%TDz0^xGj1_fUOnaTyՄ8_g~ٚo9ߪFMhs?sǿz"L" ]/H:8G6֟%y ǨCJ7DUЦuue]u::DRGy=-Z5͍cgm1eqa?X:nNLi2u|VL_5vlNo:AFSw1:~zF?_N7[l1q[wO)zN܊1ݟqӈ{d $MĽ}qJ{ ]4 >g)~>i^ֽS[n;t6R'RމxO L<|ˉ"1ZCⱞIS˩{Խuޑlu~t握h*uB{Ҩ-uҧB \]˳~gV8\٫aV]$tdDG{.^4uzzh9W֥5!P՛ACy3'^;Mx}oTx%ބ<]dOěxc2>9Okw"n'hM|Om_̶>OWT^30#>CN@|v" ހRķ;O|WߣG>>_XG|>*'s"7hW&/J< t!SI(G Sa> :"A&7HWSH0 `XnB $0XTI` -n6 fxOqn$ߑ"%$T;$fC+`:;?9W"-|?x:`( !w$-[PmM&!>r'/I< MXGBIhz_mkv"{ $"ȱ sK $Poa^اېzoOB[]Vj:oEB\$ DBq:N?&3HJ:/X/!̫H@*eH1~O6xvQ$* KBIpӹ,{eH 5Hx{ a$uHd !a$<ʇmyw$r2#17OeLbXΤ$6͂ĦK،4@b̓N$v^kx$EyH\+ #II!}Nwr#q$>.7ZiӞ"_ N[H| O,&lwa_Ƹ]H|%"H|_{4Ft ^xw$~P$DIB8I`(& c$'$d;U?a)pCOIb%I\OߓSO^S8z4nA{ިu>A݋L܆=7F3/f& I}=-i"K9Q4ܧs]ә'?%^$#G2IFZd葌Lu$=dtL2t I&уdjHf&,B2H&&"%$Dn$d*}d_&7lGΞՓ$?Nr_I.@W #|$ÔRרUQԏ7j'C 夐vH!))dn'ˤZr&Z]RH 맒f"-<vN'RL {rHa&RG p^ ..>0 )rJ2"CIc_RBub(Mb3HQb,)r'E(mC晤fO8Yamx[_,)ga N=R\7em|s`9)&ţnxՀ$xC#Xy_b:R5"ŗ[IfR|TY2)s_}*LnRgGﶕOO.4AA?-9ɷ[=M+R; }GcW'MJ*%% 9RCJbHIs()iIbG Rv$eǯ<k< ) ˤ-Ds1_ R;8ýX(2"ʈq5I C*+IEl0?!%SMMEʈT&~~8T? .Rp!HE[팟9?3n޳~ove ;݀Lf6B?T&Wԥ20̘H*>ڞGJ>Vj+R M$lR zN*+XOJqTIUlJ>!Ҥ*T U_?rjMC7ԑY:JT-߲ڇa/:#UG؟T''Uo]K>WHu&%qR pTCz0|!KjjK(R3xKjN KjZىԼwOt!t e'6/ڢ8ԖTZJN"VZRBjXa9ԊI1;R;Ԏl"bMR>nZ8}&/%phV LiY4`xnƟӢ.}hE4m! HBi@80K@UЀ#4"idYc_>~LH s!nҤ~ǩK"u.mM2SIC-+w$uu! >P5sH][o7Crz'ԓ&-by}kѲi8JH&iאV}s7 t>G#ޓHGƞtt>OΈcf@:2c)PC:Vɿ{Ƌ38^jM0 /IlXN:s|]JHc ] #]Ťt'7NO3BHwf1Mt^tW UHwMw]+IHwMw',|)˸ptkkI)b{t?W`cJ9kh0t}\zG_{~Jդi;4` ,6gim 6m:n:`L.0^IgnE4x^<ς pk|bWmۺshppC-|?5a(^kj5Wϥ^7iU <ߪE~|?ҌoCzJHOy+S)p琞 x'=cM =GzIo [Lz[Io%R=[Az˥{~Sފ1ɴ,8J;P^n'aFz5꾐P>>ҏ΢! hȢ4l% y󘆼O!VАR˴jg" +K3>{*I_=9CNfF I} .??.!h3wK!W ܏z_4S"I*F:D; HJ/#/I~hv3I(CuHoş흌#S}5( ;_VLwY?;\{w[=D/-2Jq.k207~Gm O" d7pɠa&KG8x㸛s' 28vK9eI2RHW3ZN&]N?7wnT?NC44Mi=jHCMh.- GC _w!2$CA+2Aud( $NB2MR Ȱ12^K}PV[adO PqЋO#ɯ[ gn%Cd跊 ]0#,'PvNX&>&| 0 60 <%medChA%%2P")dX{i_P%KɈ߄2ıZPȨW72 #t2 #2RJF &#-o2P%qd6&Dg-"9d3绑}42O "dDY|7UfoI yd݈wpN- 2;q0|h;̏gD'ld_2?Bgl읜$XΥd~iK=w@A>KcS1Fb Y#c"dy,f El'XNdә,N'S9dqzY$sdQ}z,nEY)Y<3$dQم,&^M5,nj7J]^9 #K S4'aK"Y.0#˴d,7'[rGY\$crX,r&˃dye&ˣFdy\,O(7vXs6?;c|,&˗}=YӨ*4J礓fBw} ?@UȾd_&RWLw:PIx֑3cfܪ^kSd=swUlmٿx|J3~I~{Y{7?sҗ9=[2Cɍ1]CИhL!zLc1Ҙ4=Jc?]_vqǑ_C9ȧHArD9R=9rhu>Oȱt\lDNi29 JN&=iArHNS)`9-&HGW BeC39W;7jZq<4"} 1ܧqZ&J3N ^L Th.4;\1#Ĵ ȥ>CtD.2r9;KPru\,h%FK'\20\K_r9\ rC\n1r+g!vG]Uur6#WrIڳ' !W)r]N5ݖ\s'k n\O"u-[[׶_&םoujrݓO{ɵP9x6@GOHr=B뙹zv_J%;hz r\Kh9+ܲmlrvٓ[+M"ӄ34#M(asUM6 N҄7Z9^#=#$#~4<"'eE6HDzܒZ@^kxJ a>2~{gFٙ~gsK3gy$ uty] kfgzԏSyG%|֟hZ?r$!Q$ܟ&IIoh,b#/\/LҤu4i:m5MQ)hFMHS-[K Kރ{:j{cxЁpwiC{+HsߐwdhCC[,[ m]KJޫNwm^]@ޛ]Z[f>2Ol!}>ˤ!yDoD>%gE>\%|ުT.ASw]4Rzف^W3j;|U4ՔZ>h3kڙ4MyE3}fD Y-昡f(2O}{=mzfuwӌsht#jL3.4fyt7y&HGV&i!?=/$v}' Uf; wO(`~ 8TBR@1??՜ߝBNK-|UߊPAI: 8*G )\a8ܔMr)؇&_GG2lx۞\(( Jg(Hz9| 9p AoRP;[ݲ.ݹA)UQJ RMAj/)H )ZlPи}侅(ȏRPH&R4 @A,/XGAFIA(hmfzL :`Ni(8c ߙMe(n W6J)E!\M7[gZDwj#/?j]{mC!|)9LK!{($4$=?ZSab 9nJ!'l) 9;*9=N XM!(s_ 7)TZS/zBW4r GQ*3 0kؑPYF/QaOABU,13)t zo_7{;=}:WBpw9w)t~ ]Bs{K)tnԢB)|. ש])\ߌ (|'{ KcR>})ܟ9`iN)|ֽ?.Qx _ZD˟SxjxIqxF5gS ϝAy{(| PGY}~"GREϩ6~m `'E$EMd^XRA)3c\_.M(b!EϤQ8"1=IGE\OWVPU33 x"VSD9[)Lz7wqo,E/)IYG)kڪɿ"RHE pЋ4/)-"չ:})R7" S5EHN9#ӔZJPItH)JyŌ"oQyo8E>CQB 2do7(JE)Ji>E)0oj#)jJQ5FSXׂwvr΋(iҜAj-9f4ǖ'Q4Qt)E <~(ZEGJV:Qs6͹=㿿;~i i6a9Ec#)ڃeyyR. uAsh]wi:߱_Cs-hͽnBsB*BvooU}dZvV|g1kD<å4ؘNZмwiއ9 4~/8ܢa,tԣ|A1]PLj) i7#@1"#I1)FHWQOcH1:l_>+Q#ߡ <N1s)%8b.{R̅zbJ'R [9bnˠ3)ayzbSLC\C1rżYN1u1۽7P Ŋu؞6k"JJ1`\dsNe%N"9{|KkUˠ؁k(VuakbMOQ숭kƞc0n':bަǞrEc8iRl㔢8w' Aq۸>[Lq)?ӔRsS4S@'AqZ(Ϊ9_8Ls )n-y8]IBqKS(nM : 4vQܾ{WpLP܉w5]5k" z(/}(OzR4_`GhD͗,Ri~4_~,+{;}?yz7 ً\JN9x͏9ۏPs77hs4;Nv]'i~><4{AI4->lڋri^-}%hQZ03NChͥ:2@ϖ0-[{hanR|ol{5Dz\M[PB/)-?߽CRScWYQ @ki6iuZ(\J mh UZx-|m?v\A N-3 Epa CM }J._+(qx)%QY%tD bQAhIQxS >')J,_I})z/%<%"Zd5v di{8i>-Nܧk&%qt$Ώ&sV496t.OI)iUJZ}ޤ͔!6^g(iJ,d4JG2/)gJ̋N-k*zl9'Q %PreJLɡrMcOPK9%AJNFɋ$)y,%t3C(`J>wJRN~uq )JCW0j>_ˢ{|}%m{U{):k\(i(7{7QD}(-؇u%В_Zra-oOK}m]zɧ?пi}o[ߝ,EKfJnY>ϏۅY2[N]h]`PTrR ޔb$R)e%nR )̧baO)VbUB)zdS4JJ):2 8TPʇPJE4۔-SB&eGiٽYA/ZMWEny~bZ>{i\Z/\EshAW7j 7WX4͜~(-_3q9wX=* DG)uT$Z}T끔ZPLizl$'zJ=;R>JVtͤ %[Za g7@iwyPڽEvߓ^VgDi*)#QڧI9ҾcXG+;Ukw g4W HJRZ)ѕVJ1/l:ۚJzZr҇tҝ(}fgPz(} guJĸ- o@J~Pk>*^V|U%h XBʵҡ (ƙrm;1l\;8:;_S?{ֱN,g@1?/(7l e<{rPn͚ ΠNSn2:R^CDyS)OzΧ<٣'Ǽ}QMowί|?;:7?CiT}~Z2xɼAI6 rhĕ}0mҦ ie6q4D +kZ pupepy:pS|AuZ uM)n] sv  ڀR4|y'\8C8xOCc;8Oc>8xK=pxكm+891v8<6[B#A}#1AS=pOs"825%83ijxTpN>N/?pzsAp I* ΐfipn΍ \p ALd[?? YY Ӊkgٽߺ8)Wmpi]RpS.\G`46y[x~7_KyB+eo>1ˋTWW+ B+7m=Om}6õ "<:t Ezj<_Ezd6'?{dްťѱytRG' St;N"$NۧuW F'ewtN]GpkU{UpO\ vk.Bpۭ_{lj[칟N33sй}t@g<|yM;Q:'Cl7j.:~tz'/Gg fǬF/}oQGf7Af:_م.ć.\Er$.RZ"z]_/u@׊L]ANy]?B׏u0Z/瀇éMҖ5L*gϱa <>q,vn 4Gs!tv ݍoG=i;֢G$zl-A-}#P=ᚇ.c\zXGQac_gxǠk ^J.kJoOW8xTg ^mEjWc7xg/ի9Yo0jx;[F;w%ۍg=3{j29V3(A}w@p :2}vC{5,$v;ۙ A^.asJlC} Z~t `<@ﱜSic FAЖ_"/B=?Bo%Db| 2{%Dr 6"@:"Uy; $D%AT7D= }1CTn+DenCTz$D{tQ Z QCTy^P-Dn4zUZǣգ۽~՚Y?=j -{~kr~hc[s`g{A` DwI.XRILc)XQ~UiK e!b!b;!?b6eh&x]gB\G+ }VC\{o(4 a4)ޭ v+!v8ĎufH%A C@"l $  1K,  =$*} \D$>K7h5jYigJ5%ٹSm);onDoUyzvX g0z1G]?͑M^]ЫKO ЫA^!zG/m)Wb?^okq-z>^ס׹=AraHKBjHiAjP6CAO;% >tOHKM'/!=݂!szf\4CB],˴iֿeOY?E X  =1F^߿Y">'9|2'3mdmUY9GB|X ׃ ;"d=b .A=x ' >i!7u3 9mWː[rwC8UC~$=iW;ػB~BAk ,x%w2~'F_+oB~o]!s.mES]}9jvnûﰋ kz}g~F_:=}l.2@AwfW3<~ڬw~ǣ{G~g_y~W!(>N(]{Zӛ-r Cq_ʹvZꞋ~>Aa;AI J$1J4tNAI)P}-c@6 J4J>PJu4)J^ɼ.iQkٳJ C)YPxJB) Jo:Ci(.jݳ—$e_+-xwY[}T._@InNRE_U ]u+^PZe;sPesHP~!EP *S @G*Bų*C2mJZp Tn0J _o8Tf1mir*Tn*BT*@*s*W2ʫPy9*o7TCTB. c.Cu2T͍Bu5?TWuRI.oԯŅSc5dSP[ـP :: uԶAGu:YuyPuPw%PO EPχzi9/6kwq?wB}(oӂKPP/gܣ4hpgBCK=t]c| ҾАƀhނޢ1r4Lya9g|a ۅ5np] \h}>8OלF.h蘏ַ0P4 Q7r4`(4gKk~2hz9C4=ު_< 94B`h>T-|hpVwMhu^hIl/D9% -В -i\o>MOX-В -в̃ֈh&A)Ze ZEgZAf iКZ?q9oOhC;SMmOhvmC=Zڣ^@+Gyh뎄@h+B{mn;_7Wgk/hywܑvrw~;C\h?t_h {Ym~W{yڵЮЮ~^zh?{V4_E+tBt传#q_ڜ;:awӱ vttff]:_}> k:9Ք{]Asq.<5!卂1Е]M | ]1 z@#;VYЍ ݰ̅nk#}!sr;-΀n#tC:?G˞qksnVBsoԕwk%SPvzkg1zf7zЛzz1D3KЫ1{Bohe=lꩌs qhlI ,~Zs>5| ih :yr/9NП w/3[ }]5_@V5U C:wCp?Sw>/s{20\!0 W03g}g~0> ^` ѡ*@9@ a0X)K`# _~'0x: r01AC=1&bLVNc uP| MQ,f?*`QzH큑ZTs`4F:FU0z+J0]`a,U2v:52Lm020VSe PVs(a<:xP; xB/^Q0|%& aT )_`ˮ89x+a3~w㪭կZaY=᳖cxT X1:bx <'SCu^r?DtL1otV ~ }D&0D#&j` &3d1Lܖ%&~0Sz$L;$loEn^01]ؠ< 09 S<0c0٫(I#~RɫJԊ:f aja|a* 3`* b/a*XSU0gg~i܆vM;5tNk;H=?;];";?3H)0]b{{yM/={tGZ Aq| Fˆ01#M 00S/05i0ɃY2,9fKag0̮4 fW`v)faVR3k77ݒj]#ц f,'0{i?xZ)9qF9Iw`׼쇑i°2bdy] KyT Ke.XE%X xpy7u,GsmǻLtoێц?;`i Ƒ Eٲ gKQX K[!X娚w2?,SF2Yy`vVcy;mѰz8r[`TnFe(gGyFm1j+Fmg֯u@ƨ}C*Ĩ͵o u>je~Vae,a2*QXOc $ۿ=_Rq>F轼{Lo>lk]'Xks.},a=9a=Ns"X ڗqSoz2guT8#~h+a]p;F0܆ OwXO)~$7¦vyl:̿{^l5rMRu`/΄GhfB˜ nԦ{F[ 6ea36SqvU͌0|eEm[&O|?mMaļMNlV [ت̂r"lak [7`c:~*le`klUx r>Qc gYNkؖu.^+O`{g-`{"W`G̓Ѱ-L5ݜۍ]39 =` ~] aK=^Lܼ߽O o=Su.Samض&;AUة]0)܇]_YɫN?z_FOkLrqYRYRv#GnV  [;#k;3ӃݨNmZ^]`,g[ `7m2 M .mgϾa68!V.}7VnE .y<.n5.1v ,c);21M5j]W,3]?g\,=cO'1xXlH[ ,6D]o}q猇Ww}a˱^Fl{Qo+J^~cwra {9 {g9͹I Np^'_.XY [_;a#a 7=-ؗþkn %1F>I{X1#=c0*`10FSc`̵acQa<eQ R#;ñ8=7pxY p CuΈBfig.|[Gv޿Z.-ۛR~mFp˒ǔp\R շᘕnjQpܱ[ḅq:gp94{)fS8EH)t'f>S8-S=$|?w;©3υYm8^tp:N/B Nwt[ N|VN]r>M}ǰ{-pq\}'_:7㜅Jgnj:w>0 hggpv|gpuD8Gٯ+y='yZ&OVSup>Ι[Xp^αL9g绮Cp]2ap אpMk@(\<:SSO7F wrxO/ʅ"/,c1wwaZ,+K0^y`x9U`1Lކ ÞbBk p;n;Om5&vD Wb ;o ?ac88scĊcA றUp׏Mp]p߻1<4cCxh|$<bWxȽj]ygcFxLI[ᵓ?<<}j ;=a},4G H_ ;xu`.чNxJߠ? 5[5>08Ke5^zl\N˹^5k-^̀׬LbPWuMy)O+-oxs0.;2!.z  [ %}ޅ}JG$υi6|Ɩ0|wgYxgf(|W0gN4|f]OBa\/$nSx >k'G>#|])Z܁57>7o_u*qLZ醞"1b41=SM56ckcQ,03/c:;p|L]1A>G90}UL_΅0}gL_a'*6Kkcz"L? OaM7?2SLK04ӯaF箘aASϏ:sϞ_UUmSO`,7 7}6ig}vi+#`i3ݮ703w`!l,|\;Шbfm*|e;·OWh^,|U|׵nw *s;Zo! B,6o)Fnyo~gO~4.|8wn*|oH^ ߋp/<{'מ_~~kO;E/~A?~s7b/χ_ %-//A~ 9e]_JʧK mm| C5v-ߎ@mgn; F+Z> >>) vKh|[ok~L|@d;lG=e28l3w#c_|s~3οʠiIh}Ll5ck\!-DpH%#@R = 1bu@6#xSo[> `揀!N3 F\S_B?<n?#cg1p"^vef/gwo2 ͝iyX<9%UwvnXסQko);66;B~sxɋ] u\5+>#0u7"pSF#pnX{sOc Z=AoX8>FM*xaKxq[Atq*#Y =X5# !cܵ ṷ`c>b G#-~{w l `*kG؇`Valq_w<i_yڛo=eVT?G"ۄ"8q!x~9"xss& /"G?tF(o7 =qM@b8 GBƞBHv8BEIIBH$B"P!q{ !1~!sW d6/Bf"$7B"2>!a v޿ݎwz/B6מ5t\!B tu"X)gȻشql]Y^Uи}%r7>гa Q`@;aV4a{}s5 TŽz^Ba&#^ 6>i!O2@ػu@89SqDWIw_n+γA ]] !8rA2q""h|*D!F&"F}qgqt[6.@D}oDr@LV"4DvDADuCDz GCD=Ex{DoG4ǖQk~5 J9lgV"W"CdgD&@dmDҭ|{_/"LFd9: 8. Jd&}Ew=& jF>ZQs 5[ QQ\X{ ATBz2eD/DF:>0klr2,{m̲S0kx4f ,}mz2~eCfՙcVy%fݫƬui]ܺ6kM' ~5_c3 h`r>Ɯ#ssνfœ=1d0?<Ĝ{1t\+œ\+1+漳B4uG y ѪVVF'=4'47Etl5D Bqx%}v:Wܫ0\9.<̳?y՘g<5|̋:yal?C慘c^Ll11ݭmb,&"V <#Sq1v2к b"V_ fJD UیXUSNkϴ+bk)"6xPS#vn.ه-],!-b/^b {Nqqb'qB]gDs,?#b(97bVÂSX aUٌx,O tGY1u=}yir%L?A&'b!R,Zg5X' wO{,A?dkOzn*.#uHk{Hއ W$E*$` H0 nH k +ՌG2-+@’/HH| ,q$aŦmMB^$[cuFam$\Cs ґp #U$ܬA"BB4*"qd=G!TFH4܆ġH4DH\D-1= qHF:RK-zmRCjeVa^< +bPK0}^ii]aŭز+ Ƿ·7@D#Mf]fiӐfxifHs0FX{B@M )HsB"߅H[i mumGÑi iv'Ҟ*"z ҞJ"TJ9y+% iqHUH--W-i2)VfaeV\ikrCL!\]ݶuN|hbhJMZ/'G|8#O6Vjʯt\eH/J*=XIYKW!6W@}UW*7V^ǪSJ%`U?wMzCOdBRdh f#x2(#&2gD#xȸȸqe2.EFI2^d\fEf`2{"s-d.Ff:?2Affdא;2@p9}Z峂#WY3#k*7&/E-[!0Y'@YgȚ0Y[U*d#d*~jl1dwNE㑭6V2AvȖ>^׺.w ^RdgCvFd/FN+FqX3;j 2V 9aYs%Nd˼N)V`uiX-u%ncY˼1VX=:9!' 93(rfD39FrQߍ1yѲ>b@뺓isϿiv-qΚ.Xk||Dk!x,X5I'fatƚX> kV$cͺXEk6ui7{OcMS1I7)!Ty%'< y<)țy9 ؀<`Mёxdf2לFjKd@>^dJCL7AfddRcgYSwFj?֌k,fg3_,df!Id^̛y#t=°}L*vGOӛe``a8p۳+}G>Kb؞ 7vL'簃7vxaw vpcvۿc{JlUi(f;>*BcZͿ1;3pb xr+_5z N#kƲ:f\*5 Yg5v3fE֬PdMIYSc r b郬rd3!k i#k V?C֊ Z"ح0;[bw8{e =gXzcV1;?e܍Ǟel<9=/ް~7|dw5

>AĥD+#0vNfϐ3}W!rDZ~Zލث惽W.{al^W\g 앏ػ{w'[:`f?k.>C1P5[[~ޏ[L/R/ž9㑣r9mCh9"G3 95ș9șu93W#gL*BDgL8q|BN+,]%Yx9 2в~>r^g"e_<@5\ȹ 9Esa "޳#oc֣ؿSDZ2s#8xqX/8;BV@H`W[惁Sppڍ37too_`f\/vG8dp0 {P/eC:Cp(i4ph2Z׷6bvuf]+'Pq^wġ8b==lC8T~3'E{0/}Ms2qX*wKQ7HpKö]q^i8; 5ͳ7+܎Q~>1 WZ\uN䪾Cd*"yz!W#kӰZBnMC5]eȝalYȽk-B.pr߯FnZB}*ܻ{gro!8ҡG$LF^oT;F3<3A^aZ$% o&f"oI.}F@WF9G FȻlAy#T;'p(Q>u`ΊiptJ4N8s 6±H ]_:G x?﯇cX]ı8R49U8'd{x_"|'6 뼒+ךO*$N lj%81f)Nh韚,k dg[OD 31F8y'd惓7. qrMcփL˗Uh^м6f#j@yC9]|[ -LG~ {>1'"U !Ӗ!S7NAzyܓ?\}/򳅑_sT8շA {q SqʆU3N .AU .850)4r)'*N]Sq\:58UjSw'vuzyiUp|f- QNU(EA>wn5 B;A(p"8 @v DayS#7m6FdG .(x0 PP%Qv *,Pf> ^mi8-3"_pFx%`o8`3|83\+deܱ;gƜJq}!Dz8cD*Yl=c'lv.ή釳+pnG7 ù;87;g܌u87e{t݈s18 ƹCMqZGsGM='>]Es޻'q=ùqW݇Spw%OzSrp>-C4/pa.8\ qd>.A .t\*R).~K/G\eL|\^M^j #(tj4a]>Ⲫ.drkqyi\qyl\eϸ~?]Ge[VP\Z˽f*OZp4/ SPo" jB(ds ?@<ևDa2d0" ס0: gGpZwD粤PyiWNWucXC(|ͲlQ{Ca ?mV0OM_VY |GZ`a) gHh3Eo1oy4\?9׏z4lp`rq\?+TpBP}Ӹ4k׊pcyp #ᜎNB1I7&fxo+Í Opc~kE| nōkpm箋㦺:nv鈛*pSy7n*pf'cܔiUC:K7tꂛK9nzmMI܌p^v7qn%J澮o-67ײLQLtV ]``w8߲Qop͗p+5܊_ [q*+[ոU[ m[ qkn­ķ =gخR{ϯeQ_íL;[qܺ[%pkn}z[pn+ʧЦy-p`nމ=p[o1n-¸ܴ7L!sq=/>;d9n_ݘ3Zܓ=ɮ'xxN=WܛӚԎ g^h[9W2gpq^}{^ދ%(`w(`e ۅPbU zGE_P2,JSQ?%PmJEP*D(R) ]Bɢ@.TJ5vT} Jm$F^E(]ҨX.2@mF2oJC4d4Jt9J:tJ%tJ}]nJUP+7t&tyo.DlƇPV|m}{;jnx?l`PeoA^ YA<(X% PBP}j˖F_Gax >-Êъxt,(+mG[/zC<)[ xG5S=L<]Qx.-\;nx3/S([M݃b^ =cP> |9ʷFy:PuQ~ʏ5]xӼvY DyU7مOQq?@( (uOQx^q>y=9x%W"^īx%+W}g/Ixe<1g4,]ZzV*Mx1THXHgހ7w7ӣCo6nµ.QaasQ1Pa6iKD~VӺơbUT,JE¥XP1-*͓4?]ReQ* Q?'Pq2*>@4Q*و@%sTꄣ[/5.*{D`CTeUguYQ9*6.6ƨJXTzɢr,\ye*c2iP9q*gsgKUf]1u~=cGm_fǟs/z>+۲ }o8Lۊ}nK믍w {TsdJAx8}wx6S7}J?Cz$>)'E>|>OO4)>M}ՠ_4>o9e4>'*|y:ôug0Gg{ |ϖ;پ-kϮ||)Č=m}v<{yWTJ QiAݬؐBUWr:?GU_CT kMz[Pujr*+ UcZ{Zҟ]h}G[,cquZuWVjQT}Euǥ@ ӤQջes ծjT;բ-DT;Hz$G~Clxv&P=^132AmTZQؘ+b/%a|7 ߺVjGT'7/-k[Z|]w<ݙo o|+ًEtj:Fx jĀ~; xXpd j\BM*Լ5/tP|'jAMY*jG ߅ҕ)D͝b>CjDMej֠ j9OPmcԊ8VCo ZV= VZR[Qk/ڈΛc @\&8Ԯ~ Ux2<:ُ]_Q)ڌ٨MOB ԦA推ڍnpk]}GO>C}Z|w5OL&O׫MDD2DiD.DnDc9 r$r"#$rhH"sy"DFND}bP!%LSH5Qww;G=T"5bAH7 MiDSd`-Hхhۿֳ:/ "D6Dg׍8oqtIRGC8w@w!I8x*80"Q_8҈Ý8#.qd1~7qF)#c5q4#!ık%߃8rt WԞG6s;NiIsPOh^@\ۉK\ԈKq%mraI\U l;=zۍ^ Wyse'N:3G)qKj7q} _҈*~Eܷ޹R{ L N m{kqYnA/:W,"N)Tk >_>2_2É?n+G&it n/c,h_F'c$0 " g0q X4_4yH&i$_A$1%k$PGI]xَHp$dH, VEJ_I ~S$!^$ABP -YAB@Bq=I(&KH(0 -8 FB\$g5$҉kIh mJ!o$S^X+ J/OBuH, $:y{б)$t K3\Mgڐ2 )$׋ HZßI|1Yx V ՓIxU" 7'uI8 D‡FplEŸO$̾5}A"(a`}m>H%QIKlILDL2E"JI2D,ΐ:Yd&!sIl' 1M~$LbHl].Ibv$fkAb$6 ,ؤ+$6yXc GbIlN'BbjlOjO$nӛijjH^`AR$ $u;I],%|n:NoIk!A֞:Hݡԡ%u0ԦK0ICC|%uHXAޤÊ!eCV5uxEH:T iC$-j@֓.Ii[AHzIO*%ibB>$=ے,$HqD!Il>!2%DF2.1t$$C2=H&(di4ˊ&Y0dsL;F2sIVZd%7 B.\_8deQ2vF$| $8dGڑpY͠LQ$ݼ6!HcFm "٘}$ ɖqÁ$)ɾ@ߐ3vgI,}A]WSG1:.iqDu>:ZgЧVNqIW:y@3y'Rs|qc./cIrQFܼ$:nUGrپ$ۓm$H&SI.ɝxNrn3t$$wq}!C$v8U$d*=&$WLr%Hچ޶ZyW]^y; $/dO$ϗ@ܶ$O^$/jO~M!3HVFdH?z1RwBNI1G?!y$?. D:e.H~o{G]H>EI`_?ڝsb}[7$zɟ!$_W4Ն:=N]ӷp`)#EͮJ"HQ8'KD 3IbBR46o)5&EH?%.X}ua}=J*ݺ6ʀJ*=kQIT6I[F*Iexgo;#I%}p>9u[F_T|KkRyI*RrT%+2RI*֐3rn=M*g{NB j_F#J=bMq*TţHUiMOTj:iꨋ:.P!U#걇T݌IŅT;6c&aR۲vZC؊g7gϓTjpRvTj{m{娋uC] WzC-J*.5E]vu.YKX/ YCjoHM$,Ru#5jR '5Os*zMgzc8uH]RK빕\Z06áAOz߈Sr} u-O]PǙ!u}+B]+t-dHZOIKeoܻ:0i4sHk%Қ&O"Y&HH*6,"vi'{x.i#mhCώ$=~+I{;in']ЁM%M+6q&uI~nם;vn7R(@݇SwԽWuBQwۛ iq˞w }m񴴫=o>)uISknuÎzRa_1v"H= N󨇷lcnVӅzںl,ꑰz,M=M9;TgZW- t I7p2R'{ݓt  N[ j @on ҭ`5[Oϟ2(at)>j{6{`G;_o}'Sȷ5dy=ӤGIzq-ɖUғEzHo!߱zcқ#Fzդ緗fU1L$Ioқ&'I7Q&0g=Hzwރw?JH/l!~'G7ПiEֲ>MjI_ ]z2QO7m鸍z:[RsvL=^SYsU9u|z.Sωè=z;Бzz\AarGc|~X?B=+Q7e koʗz^HÜzsP #SkR̗z|`^Qsyu^WRԫz]^k~L+>eԫy^>w"}ɇ }I_b2w:OU\BJ2؏{&}jч. #}y߇64~ݛ]r?"ҟcAys_ݩ$Ƴo~Jϵ'lUEۭH6 <֐32cC60 {Ud`ܴ"5dz\^KAWa2$Cdp 4G}>7>ܳψ 9qo_} 3^yF}&]'Cd ;#Ndo!^d8}(N}J搡O_2 Cd8| CJ>d8̜ ~$Cod8Od85ZڑAr=9;al2LV#\mAt*OQE~ө%HRoQSLv]o؟;@Rc`AMsټa+gXWNFk(5QO=6Qf2ڻN18jQawynt!|dtu4'Z[2JƜqdT3G2FFqWՖud<*y26#cBƿn_K!8. %d7C 2>+J/Ș}3~֙x2ջy:i?&.d.N&C8dp2`C&db~L̪Ȥ"-L,%<2C&6KdbL{ a}-y樓D2uLf>f`J&GIѭ{|Ie2YĠA&dэL֮#fdr$"v|2L. d-<'Gd:ݗLl2AL Id]Ft,y$S}dvL 2 u'` zDdSd MF.dňL4zF%p:.AL'}t/\d_!{2;Mf';Nfz'3w2s"7dVٽl2} b2t.~&}\Ćwdn=ɼV2_B=QGyx&ŜdEQ7)U2?QBjdɼ YN'  02 ~ daF{ŀAda,.s=L6gݏ,Sb`,FxbGo,~7$y!dC" YD&+dY,JJ;),3}Y}FFd,=&-dց,6EYV",#,~oU;\0,4 X]FWȢX,ɢЉ,.#=KGw-vd)HhN4m "k*di<,LȲOYl#_ɲ}T KIuk2]}޶ڳhRTa&,&[4o "@@M(ް7EhhqyT N4v& IѠ4(! :[` #hPsT4]@.4ԯwA׶ѠhЕ4v0 r~D& 42-hhUezVv-{D`i|*知y-jCMhHg "?~5i QS!hH4D!4`lWUW-@CLӐ48!smN!GҐW4$#V!KҐœhBkk%!JVŒFTζ{۳wo)OVf}Ȫ=Y nAde Y,글[h6wkMV.deڶ/wrj_O%UR!Y#u]di'Y~@Vb2Y"9duY.''{&7]i4+:S94Uz܍#kidEUZ1'wi.UW_aBWbznDO׆0y4LՒ$<~\E֏Ⱥ}a_6MdceL6vjdtl_$ ][E6W͕dSA6s|O>1/l|&Gdɦ1<ϫɦBl^a//|"BQv^َU"Ѻd;\l#[ӹdkrlmyomNd܇&OƓ]9U\c$ :udm|{R+W5sݫ4=\kAÿTI#uhF.ԡD]hdF5iԈ85|_ErhPA5DF Q(/4gJۼUm˼C>9Dw'ea4 q+9v"G1cQUn&#ǔQX ֒x9e<r<<SЕwʑ!Iߍ"I,ɉWd7r~j!s' \=\]`%mr)!Br!oɹe:r~6b{`yu0"~2bwM.v2L\8OrR%qra\ oa[yW_r N.S6ˤ=C/rNry3I5\CߑQ\&׸;IkOC.Z\"r#ל9uV_$דWhL h ӡH0svcN3Q>Mc3.46q\Gc|/n?Y"McјLΘƤј->4fٝKcvD+fEn}r` On#ɭ{uC8KYrލߦ; &!4M75qّjJnIɍ}w[6\i8t' /r+|Hnvb6#G=Lnɭdl$*]r<>-$n w$wxrܵg'w r7q$91~$3a<Vyh*WPD|ȃw+yp5WȽ -`w*^ޏ<wHNKg'ǛqG_WO׻[#|6; D^cnJ^M^Cj y$/ñ yi;yhǜC^nqab{/AY?ѸOi܇eNޅ}ʋ&Cn>y=EW{^}w,%{롖{}3o5af3w O~y%lW%yKi|)4^O>=Vwיz[8wöh7?/֦Si|<Ng3Wij;/K㋘vU4{?H4!nQq|Gut~H>kݚוtZdS1=|zט͠H>#W4F/nE>Ygg 9O>G)v ÆyYY|>%u/) 4A$& hfK|l+M.I\h4qI8)M!HmCib4}M&rj%MJIФU}iR`| %_kq|'@n9|g&UH19|f{|"ߜo3f#{3|o$kӯů#}z|_{f ~9Ih4MVirE4Y6MB._5܎'H;ӌVԼuy-f!R "e_z,mZN~IN8ؼE#g/\ef[gB~;"lϟz{wwV&jOPi俛l# /&{wNW?1N4e%vL ivZSHsҜ4҆'si+p-νO8Bs94j ֤9s x(P؞S  VHڡy5Q} T@).lR3Yм6c(p@ 4 [ 8TP{ \i~^ I- |Ʋ)$AIP > h6/B9hceС}bCA)h$eMP OsN#_hnn6=<4hnO`7(FP. 3({C\aW)*YHa)W$ 0Ki w|(l"7jO򋶏‚R؜L Has5sc])l-(,| v` k^Oa(,8%Υ-awwf4׺ls^I օoS33PxFoMi oLʚlз۳",^S)K(f>E G֙񔁛"(lI?"&Q̛1EL4uڭO= ExPENE3(LzI)_C0-xpӂhA-6n--C q|E j_3Ђ Z͐rndZQ Z3Nhl!-4ʴPw;-4 {uA*p䉺zȇ_<'ZxL]-"!oZ$JbiZĻuFf"g nHc!-RO|uݰ'-2^j7PЇլE߄hoK<'-zD=)JАk}0+})$E a+5ؕR}5oE:晬.HQ OQ{)*4:Eg;Rv(\ޮ qXC!CQSTEjmx4/,4/"4/ i~u_NC')nS-潙G7R4fpRtF/ &}Ͼf喵= EW>#8b)לb8fR+ka?g1R#فb$t)fUńHR=3-xRŸѷ)fi|<@1.QSљb>OlWڳS3bRLbL).ŪnXXUX%yկXNݷRl7#՞LZuZXS;J8@c)%b1HQC"ŎL;!y_1;ɄbSR(vG ԟbgS4nLvt{{osyŞ>gP-̡g^[^W{Aqf,}&dЀ5xnG\xRa/:)^ތ;jQ/y}4⻃vx|?Oi?XmZK"uuۺ> o ͻ)~+o0;Q:vfF6_-8 L&?3)s/J^R|~şLUſBOi- zX`-w&bʹX-;I iYZlL g4~b$ZllJaFG#hq67-޳z@ 1|9ޕ_K.whG-9CK2hɑlh0/DK-hsϿ__jNUҲylN-S_oѲE=iYkZ-[6]{KNܤe1Ҳ޴@$-ߕa2(!ݕ͡])(:R‘p PhJ8ߴ?C ֔oO ']NT1>,4(~J@ w)NJxJ /<(y%<[I O)Jxդ-F˅>&|1WLתK,-_IqNZ;-5)Q#(Q͘U)Q1 %*p6D}6Omez?ԝ[|-GKČ픸%ė“)PS7J, '3)SgJHS(JbO#(u%m_AIFv5.l z3n+{huZ7Vh4Z᷆VҚaiѴ*ZSrA\Lk-5gҚJN)կRg.bJ]NPj͔un}4w(5bo:B[DX~{?v{/GSYZ։R㭔`+Dky7Z֒ ~ԏןiA1=ڞim }Hmh+?=ևwh}mZᅵ֐HF܆Qa"y6xT҆1~՞6'M0yim<6MJ|hGi󄍡MiZ*m^ܘMT`mv{]ygGڼT(MYҖSb~JBiٗ)JqҮٔve9;QZ!]iux2PÙқv/l]|Џ^3^PZ#JD[i9"F[$'EtЋhk-u>mшlL -Cir2 m4?>mhմ%emYUM[wі%IDӖIeEڲ&mA[gпMsl޶mKaX>޴5Μ(ںЎNuTm5[Hc)}PJWmz=܏6ol,)ݗ78s[N߶t_Aui{uLú1GnL]N;Q?|-Yu?kgg5]n?޻[h ^~VN?ߵ=_ms68p Ժ:#eI~C"=xEւ[t@wk8Z f, } ZPJ ]{йafOr:gUθ.V9O2~ִ=woVϿA#c81Wc1U7Qۼm4w66\l6O,p  ~p\NSm]>uϨraps9`OnlB[w/4p_yܷ}g |_3kw̎?Ylڹr |_e>{֏ 6M Y̼_1CN+I?sLLg`|g([=?=xzYxYwU[8_~qSTD+o;g ~7Mߜ5?:w2_p|D6[5;qo?%Ղap/Ýh2͝'gwT ROֿO*,V7櫹 #ߞz ȕX4o[bX

@p,}Yr ~ nxdA05 ] ,* ] x B x>%!X8 W 7CA5C7 B!$Rdȅr0TW4}i!8=ao|Y;|DZ(:Y^ᥫ 9""Jk} 94߶N;4"ջRC ~ 'DcJ x&D73>mD3C4sA۽b{@pOG{} bս!Χq~.+כ > !W !ޟKonm˴.uvd7xqI-pO!>'1fx\Oe/Sx5ē b0WӾ܏̦h ܕ{U '8Abb8$&;@b(H m8H ļ}~z]Nz m~hz5s!{:A"@bý< mez;~oDB~$B |! 1pH0>HJ AR.{ e,$ u!i/Iu# Y.ĝn^=owyў3~ۏY;"017)غH6 5"߁saN}pop/P81WtuI_ux l6i~t&hGx\AuH z#ЗGGpt[ JgYOp{ni8c8vT*pTǗ=Zpb8Y 8 #q#8j{~V)tAqxNl.lk§z]N[QN !pr%8zӒxۼmWʷX6kpNΩN7mȍ2Ip溂Mp`vܾ[0ȁsc8W*?puW׮R. d. bVMk1QP\<\5'\~5s&hjg*Z\k0Lr24U- /M{~_77kv<7Z|Sh޳ʲW}kAӞ5-n{y&w$p>ܻ{>;Cgpoe;;m7_w|'pH{Dܣ9n_;GĞbG{߫wؿ11x5xG xwGj.xWG%xOg" m:/o >^ rks8xwMNرu? ^בu2Cn ޭ)M;9]kwU-xټ͋7x%wn/fnin~4xLSgQMi]~2?ߕc|' >]I~Ӣ:ae?'?߷Wn^+B VWx4nK*7@rhBl!yAfH@@3A{z.+W<|  1|@`y qBk|^m~Q@ B2k8W7~dp!4j FCn8A&BEI^#ލC-P6+ s% Q! n@x{dP0.y4yZHg#td.H> s!\0‡ޕO #GCx*oM޼ Cx\= " =nUφZv^vˏ^ y!2Dfai!Q)y"vYkm U/ ~0vD;T<țy! Gy()a{u } >H{lbqEw`q qmo5 @, ,!_  C ~`5ij ~K 'MH8@ Fʐ{o CY6!AK1(@b %$" 1&w]f@8!qW k'48xf 'uj@ f4 :>I|Kl .U >mf,gy|46&ޫuՇg߄>uZ´O?_h1cN&o c  ?sKڟ-aLg*c{ ٿُ (@6fu5cBmS!1^)w!s!c!v@Ph WnaG ħʐʠưBqk } ^B, B{Bhpmgzd}MϪuhGA(0X>D~7aU Ht E/|l PQh:gJzx[X/h".q>YWh nbL/몷4&@l69{N(> b˸ >n~rgQ 9oEB'VX>cCbhH1\FYuSuzmH[ xH<֯Z_URp$Br$ i;vމ $G@,C$x!4(H;W]=!u '$W]#Cr6$g?_u.HCrvH0eNmg}AJ5LBt@|C*t$_opTnH-; E̬_3; uv My]H4W"{RH_ԕwI Խ2HkqH̀T9:Ct#!2Zq⇌8d\u!3f5dr 㷒鵐o׼o7/GojZcK!e}ONm2]JZ|dV͂ Yp2S!sm2dC.̓>|c7԰PI ?, 1?G OpA$۝ gL!ύӺ"/|q?_LOm_i91W +Љw:MNqg::]DEtzN/Щ *7?}agO/ i~7IPt*sК;\b΢*,V ]u6':"t}tFu-;mY'ϣsn:M)$@A:tt` D`pS4;gӘsPp9ů0 ˍ Z R^ sTZ-mu;(CQ2Pӭ5%+sCQ1Y=ՠ 5ٞYohvFL2WC1eSCq}O(n

w%gQ(C=JQPQYPcBP ٴ]{VYAi\(OR^ ;'Ot:TmP~2 O?B oM~5Pсu_/jn&Tm #~j|PK;j;5 j;Am@m=BB)Ε'~v3jwRVbѰP|zuPﲹf@#cA}zobsz&C>6ԣo@= }A3[. =PthtQa(4UMz|Fa?wOm'~i"eOXԋV6֟%s[pBDgb>[<-ӸcL/h&i|Ƙ 1-4&A14fƜK!4zC#ۘ?}42W@c+4s̡q"4ؿg'qi4.gB.4qcOs @f4/&Ak4y )9ǡ) ͞{{?%IE7N衼=C#=i@SߡIowm1tپ̣MZhA+LZQ,[W+&CZsUugO#ο+-VA,-B{ah[om h]6;ObHlsw _Po#9zF̷m"z'#L<-Q'Eyϡ'z_g4zг=[mٽp#xQuYa?̓i]y.NӮ|]>'veۜݼo stWW/:}3- KOgY|f[BTWKЫ2꽧a^7ɩW\Z^)k͘:.1}|Ҽ&8[׀קsh@{!\uu{wWAV߳~I5N홌Ґ{/Nh +X0a'a`s/o[|Na 1C`0I+`>ބU ap n äN2}hz_ڠ[>?kk枯|}ԜGk 5a C0TuaWPcOCOkz[v43eOe}Yy}.l-|wjӒna- '`(fֲ` X }s`hq=`hu 0t k taI0pӴ`0\xq` G.OW3}\&q /vfâ^]uܯF"Ӑ ܏wFB@],>~ ME}ww]瀾[עA9= :; ݀~ y跤-G'oa~;߮^֌Po*eaq qwxsC0>\0>XKvoKa|s}-׹0ϟ2/_Ȼ.a57?fwG>%wRT-`e ~2g|,jTX +@X93@X9wa5kj.l3X[ Sɰz`TVkaU~ V `V˒^vx۰4j3y'}u4֜szyoc[ ͙yMp,leP ێ9g}gu*^mWCز_n`ۿlMBak[ [UڦnlG%֛36!Oah;/svW8E&* 2[zo͞cv=`7ȅ%ژy'M7ov9a`vi!۲v`w쎌axs`w N.?v'R7=VO_(د~ /`X]^?'`z}ìW6mfV.~Mf25._J]nawטSo[ܘe1 70i ?X_cr謈0bjH(ň#fc}Fu(un`5`}U)Q`{ zO?Z+FKcFKcTFwh-;߯k17덹1?=#F;`)= }aT1}=[`t ds`4?iAw70{=І>%+ 2]ŴeM2Л|+%pȈC62Cfp8ړip+Q!p#~/:Nrpyo=ᘨ}lO!, '%#8xI<[853vqpq8Ei+pZik; NK4N ٍp!)pp< g8EY, ,gX8ˏs%pz)pVL5¹A8kswc8ul05 la < '߁sj93Y ={J༟ 8s>Oe[D.-,Ks ,.rN$K3\V݆:.Һg]\d'A c7ՙþe}J=+Jz S\ #~u.o1papi zP}ZWf1<2": eHNJNMkm/NexWcl9ƾ /*.xY!^ॴ^Q19_&xmobTnxS$x_z+}uタ=:U{ZOhQ(wUxǝ?=ϞݸwR?=cX6b|&okzcA)?<>=1L,߆%|gp|g2zǮ>싕IMZo,dV?7qcXIx1~\!|'>.|OL[2|OxoY #߁O+|v^,|]߻ wyz:A;&R0q٦{yT9&8k=SٌvraBa:1LLbRLän`v?ְwp<60h&&'\ZR}[(1Eu,PL9S /bΒ։ &a SW`jL]SWbrܓӺ4Mg5C0q;S4TL(xvk8owô5}A>^0/L8L1}Y'}K1=e L_1C23d-aFF8&p3ƌk;0,C̸1*fOh<FoߴKuyn4 k5ߜO׾=~O o }bosc[>D?1 [ (?PYݐ%p.;-%Vb`sNl~,)?//0+gRĜ"9 sb&cNl!,R{bξpٿs||dO1+1@"x 3:G@L(MA| @Mxm>*t;诅SA4Es  m@@q,Yf}J8pH7g1G`3}hЬ|j3M,8V"R^A`b^wASg"h:!h./4_Aswi%4sdan-:9{ sY-ܻ0-ܧ#} B Bp:oމ.Y2?RA]9 D8!'ҁ,Bi4!ݶ=ߧ-|N4CkT5{|vz_mg^zR(#Dc Bz{ ;B "D{uùǾ8B3q! "$!)tĖ=9![m4y<a6q;aK|²!l~0C e#U6^3jxN9?}9{[׆s+=\q5 1CZAܯs@8{-÷LDxmg̭;!|wU}?ṗ~d >|/e9ᒦ_9NMyyts}fbQ4.|0$O|_A̟<ϯ4)(}aNu9Θ(G3Tb~92 O$k_Ň0?U-{&¾]qQ WqmE'""2":ucύo鈨EXDDQCqDCst{HKH/mDZqx~ٻt,<싅#-2E}±ȸY`]O,Q&ho܈P@4=D>F4qD Zh$ō-)h)WDwF|Dˮ=VX\Q{u0o3/ο/-{+{# :t',(DGӚk>3 s_{1o];A^15ὌL-F<Ĉ;!F+bd!F~b#a?=8MC\ĸFL4B̤)5Ed)eh̑gx@]Q l>7XY/m)d}&yf?;qW<@Lebj VwClHĚC` Cm*b;\Oݺ|雾a+nElbkN ,h⸗ A}9#g z)#nZ"f!.$qu`".:q1VtA SKi~=6!nw& BĕEsvɈx=!QܘU[TYįKB6~ħbX- fcB,VbYB,1˶#yX'=?e^"8A$tFB^CӅ?r%Xn}EܦGbX~W{{@*k$E:$Eƃ׾!|#)HIs-BRz2xԲUOKI$s!57VtކB+aEb譍}+gYX駀Z챲}-V~+m:/D2ǜ\2!$ E2$nv-S;@n$+Br>H֜װ."yg"yC$Cl$Fr5H^6}}H>TmMk$_tDaH~ɯV ƪ+8V ǪXYX-iܼژJaZGnj؏b-Տ"C }%RtbHw)Oϣ<<)FHqELDDC&#eJLFʌ{HH l﹦2mm{̃9Xk>OXS=eHCj"Zj}+ ^B^fG꽾H-{ڏ{02o 0눟a{þccuW_6c ^7s`U eu9~_1jc6gbC6ڕbc6ظ)6CdGl<폍`ذ6d+i+ 6b#56 c56:Mas6Ϯ &uͣi9}ٙؔs¦Itr86a͹t٪nBl>c\_a+l~ˉY4H7g(ET!Ҥ"M~/vyi" rV#: wlaJ-ױEbH`?Hc4lQ4U[ `Plq-ʱes4l=-gkw6Gmim} [{c]l_4~zc)e%Uضڮ_Smkm]ma[ZglbP~ղ}l+bJ4]ggmw^`ӞROlρmR-ym3l{v>]:һG-GOÄuH SS!}Zҧ@z /H_Wݻ>!}ggE^VDzΖ6s׳V6ep{# 2Bw }]l᝱w6TZRihH)j2W){-vVh(ZDٴ$Wrivs9x^3>.'Zz>;ٷ >\9|B٬T>|S q;|;M n7'4כ>/~V3 _ Ey_)#;3wVkv >711Es=)>4weW |u p4|{llX?gnHgj;w?tZ M SlW5[UWeuQoI\&p ]k..; qq.nZ[Jpqo4.HCpqOg}d=.;j-\b.y%K>~Kkg.¥ŸK TKETe;p*[q{ZP'TWEoq o'.Ȱ~bkk)6K6߃ u4_Ӱ_(xïK&A g~&}g1~:8 ~V7lF9 1lƄG?"- %l{v6 1 ~8 e?G [Ax=>)zFO S;f [xktF?>b#X0/Z=n7&:4Bgd#t!_]=au7~~B#ued\VZȐmqY:n.\݃+ lq5WVY㪏tմfj\V՚fF5\5צmõepe3Tw9zgXf46ou>5\va 3!La6a2~(N#` "$Bp nEƸ1 7G{FarpEߋ@ < ~}y=3~ksbO8m_߼WpFxZ+?;W܎!Q᳜u{oD("#"mCDg=DS60:^{a|g"f bNDEtD,؅ )XtfOvߘ1}.3Wwf|^"g9B_կTpۂ)nx,DᬷK0oO:fF|~6+Ҝ[]p/nV]Y_,>3qLĝ)pDZ?,/Ɲ5f<7N~w)iҿ'vj'{kT2GdODv4BdbD"r@"!r6"@jDICT2~e!(V걸>sK}np6fX%D#zDGT|oD%BT=,AԳJ2"**Qj 2Dtu;!z8C(Dc^>ї}eo :z?_I!.b#F1b#11rQ*FbEĸ!fg>bv CLe8b"˷_@1 Uݰ{#w3q7A-Vn7b+?6v C/bեk|;p3bMEP7;&bAl8[ꈽgg" 17#N!nFč88x]GԓVEW~7ĭfCFmqC܌ v;͐ q)qi$ qO/#{]W^9ڸfӘ{k6pOb']}>Oq:; {?}͸(Wq?%'0|2q% |@ [#,ď☛ߜxVGy!ޯ3C #o=[;^ի+wHhub$H!Ac.4 1H : j5$x!d WD=ƿѣk=͞/sag x_32X}}02v!dD##Fq>ۡi@\7ɧVUc8LcWdBmȴ"dGldn- 72y2D 2[!3ArMys 2oi#3*ȼ7`(2nEf5d>Gf2 F2 ӈ?}֗fI~5Y1k9%Lעy}>wg+,;2Y#{!(l eӑ5Y*ڇrVglW_N'Z6f=9*imItUEFN齥yr̚tɯB Fΐcȱ?BDLLvG"Lc3gDμiYe 7_lM{&7}T-qr"W7r$jQ rEk=Y=iC%r'2nÐ\zz.Gݱ#crO kx]>g&?L? x-*(POi =޷bZ o]PE A;>H8|б$|uL+Qz>N=+q _x%,ǜ4>~y5y<ȓߌȳ@HyǑ稆iț^nsrB,gcKE窉eC^#oܟ2䝳Fޅ*B^ /y KEaoV /]!yYa=9+`R3| D('J3|D~{|wW܉|0 W|u !ߢ"ۜC>E(ـS? dz}!ү] ]l8d!&GM@~4;C8I0FO}"/6O?WE8Ғ;~y+gm 34mסũ-ť7otf֜uAEA(DA'Oh^-Yt^t郂Q0 ꁂP04 `|ƞ|~bm=ӧ/q11o-DNݽ{tQ/ sK(xΕ1(xBA>cT" *ƣ|PJ&ۮ&ʢM{f_{`ozzfG3>{}{3.k}>gvBM[jAaW6 {BaO{( Fe4 l@(| CvfnvG()D-(wy(tD4+N7F =:MC(s'rPx\ TP"eMEJi(2DH3EZ!(R_,Ohp @ь3(EsYJ- p{sNc\sn3QvKNvBѩ LP5EKPt*.tA(^ `_|'kn|O#iD|ZOmO; ir|ڻ 3m<>OS#|JXO=)3>=4D7(>&q((NDS5??W|P|ϙi^(N>퇞Ee:8yP7 P\…rW,FqJD4%b[Q"))(iQ(](?%=tC^t~m֯ %;P#gQ2r6JdT5JtEXa+Cn,~D,J\ĭo}nEC}(Y;%njQ(<>(ͭO1-_Ў׼^:$[%9Q> s݅}Nl#J͵QjaP:`Jt#JG(RkqG?o~7fj =Q:y4! QT͘Y5QuJQzMBi]ƼCW(7 ILp EPz#DRlJ_3Yεk-䶶kxCOD:MCShZbմn愲A(2هl9ʢls͚7XPq*Ga TtF TY"A]Q郊 Hn\{XEptTB)HBe߻4dH)/VJ5tA)gtYmܨʭnJk%De=T^)BeTfBe:ڢmTCpT٦j P5UjUÞ[Oyߏ[61Ϟ~Q)&BC)6uAǨs1U6*˜U)Ph3AUZT=Dz˧ze7TZjwcTꣃP}60T0~}P}kcPWN@uj NCuNjꠦpHuGLOB&mƩUV5W25)DM3o7cmF]gdV" ބ,B@WYDDHI0\%FA<\ j*-J[p1q*1q%n3׉-Ĉ:G%g{YW nC;l8q0!E)q.$-k/n=Gx!ùsa7,&`% YAx?$o~J|<7u) '6|',K~#g z9{Zꏛ r7׽e|'xajZB}J-t>|߹)$Ն2@3BHFƵ؋$pO'IJ@+ T:@)%A:IwHgS޽{bӳ [DsEHpD\\G H0ɞ_%b,&($ʓ$.6E$t|$ ȑP$j(ўJmt4Mo-jӧ#մ} Hz`z W͉"js+6OǑf wFz$$=2|&$|l {W/؆I8ȗOp轆HVf^c$_c̺"Am 籞HQ$bYH"Id'G"%qv _H5D>kzSڔviK8Ƽ aiY3DƐz38D$H%W8^ݡTW7Y;UJ"gY_D">HğH|I%oI$MHbN2$6[!-"}Il?][ObƓbC$ėĜ-HEĖXĮ$k$vwX|"I,ʃĢ~j/4H\p xG"$kI9K $.ۅ|I* *pHZHYO]CH7&^3H|Zc_Sܪn$F+I|~_ߏė4]"q6$~ď=$~ʄĽxY3$U: mLWj*v`(GRۓjyqj[$$IB2$d&I `xAm߄5Oejg v݄ͩ$~1In$HrQ"$y9$_'ɰ+$L^9 _9?yҹ1W.(sސ-$ϖ䗏$Y|$Kd!) $5 I-&թ$η.wg_8$ER7yIU i$;ߦta?bD%$]͸/$a`կ+OtMIS{Cj4G6\|SKA_kIfPF2H{(%Y$+/Jkƒ|PCH&ML$2>ːo+;W`H'yu$/e; C y.$oj[o5M{ګ4?G\&q#BI~k/?:O1#{HqOA3H~fh3=&=3XߖL;jH~!H!{ 8^%I>b8ɧؑa Y$Ғ3ٽ#sH)p$R"VRP9J I ZmN$QHa^RsƩ\;4)_MҸśv<&IaO)=N XF I!t*)#X֓2YriIѶ )\%%0Rr#%kba(|.uXES6R"#HEYTT]H#C{kZˆTt{JäTi!~I$lB*;BI%RpTH%=>dr*ZRu&U~ʍ'U%k\ETo'HڃTg0\ANN:'T`>.׼-51BuyHjr6ajurXt7Nm]R;Dj^Hw$51vIԒH-R{>[YFKeHu}Ƃyropƚb?R6v8s=HRO0\!AH}7gykvq>1O`}";D4f7&Mљ)P8GKiJfiɴ9d/iοM {%2=ܔE[Hsiᬯf8BI4?k$ d0-s& `9}YEzpϥWX!uuT1;XRI=\/S HF=f7̗za2 w$) g; %a ?'Ç^7CWl;=}yzd2%Ldrb>\N&dȆ_$q݊L!S*2&Sd*LJLʐ 2Ejk?qrpƝ&teO2]Jt"`(%Mtn1&ӭt;^9poKi41$3.a2K!Gqdz̞ WMe<#IdGf3[3#s2$LSj2/&1d̗3ޮa,qy Ia.d~cߴ ďd-?J/Ok2>I9l_:CTߓ2t?'y02/Mԏ~ϩG\;)Zj g-k[wKw~f=_{giAo~Vwoy7Š~5Rtf-|i9t'|vע-}Olits:MO&}ʾYM"+]BVsUj]Z6$+FV':7d?zU * p Y=9NjD˽_ќSnϽŻ^kUBY}d3XPl5+6/u_7ޛg84Tz? ACP4T9 CCzP-MCMiN_cJCw4*wJӽsf[hHzz2 Mv?^͕l\SbR+N:-#|NDօd]}lG dSlZ]k5?FS, Ѯ6e]})1 z/ +'-p)Kv\3xek..,6,}ZӞ1 \ۙgkpm \nyM\Ts oU?m\J'- G ߴw zs\/uO\ u\70~PTk{9f/j̿ahCG 5ֵ-x!he eZ B@h \!keVu]Xk[ tqA'T y>K`ufګbC6*hx ‚hm^ͫ%h󴰖 RFODA8=!|¯_Ցz\Uph &Il,}_ 5b? 1x11Ic-f=y f״O`.D?af|-X_ ؑscM O+HA\^2zoҶZqD0jP˼-ws%[b . qU o]kcιڼə-+噇܃!^T!45'h: q $ HWhH\yMtGH\ 吸79H_Ws8vtvhǽ.˩ p3E;u9딌v*NY:XJovrFh'v=[$2dr?5S'9gݒ<_ɗ!Cj SIhwjQ9HjC* R-!.!AҝgBZ$S -y!-z"ni[AZ 5&A7{4ieuCS]\[;Bv:늞] !;wJVτLY_ cd/A6`(d/]YA>BC. yޥߚyrAn+!?R#:B~-6S~ X7u|:os|?߹=|k{6oJyEz j{ Q?># w#Usgoc m LM|g{+' Q`?_ ')fЄybϨ,X\JrW.P@?CFU>[9P W͠ %t(k'p/*q:ZPvj(φ@bja(,+|#ZLjBN6=8!.߳Ġ^r<2 OG P,6.05P b ( |I6:%iPZĠ%P:P:J[Ci6A)t .^ PzJW^@r 7GRQ[QPi\ȽR*áPzY"ЁdTnGP*)Ra(}a_:AПy*HB tCIn0TOF=KtHJGy,d1 ^0|],E5tmuyseP4a(e@. =?PbY̡<\NdQ wVC9$PW_7(7@yO)w7Pړg𜵅v_޽}s~ւ8T@e8}[[AJ/\6Jx\<Uq BTbr]`Zg7/ հJ6Qn Ln>G&JTKv. : ՙ: w:y&T(C$T{@uJZB" 条&2P5jyP UPUIR :S+$N",YN|~wNڋIYm0 f*mCi9:9~F6,Am>-w>ԖnڶPۺ jjkښ߸jbvju |K7jؾH~!PK W P{9jOR.uQ6XF[ R02!Pתj\}{LM,'6K'{nz .+6%;suc?ӿ8CsX P9DWAԋӠ 4O>4 9q5$ Z7sZkBk8߀ֲNrtGC':iIԇNttYMS;]B?SͫjO\ q _WC*Wv޽$?ѧ0*,Ak=.v˜лƝ<`06zaƝXk:_g]G8x'{[a._mӸ7 }DQ&r&0| Ջ01ˇL{ôULyaRZ0 .L`ړ`jzl LtLRa:*LkjKohr`EbgW3˽FwC8Eﬕks0:'`S9Co`5זb0OK:_,`W`!ܰb|}=,:υE_oX,Gaa.]ma1,c$,;pX%5uru7+aƝ(aܫH+7T K64S۰4,g2X^\ K$X\``y,Lis/ ꀁs0pH 6b8c5 <ɍa\ O,欽Vsgqu=g}$f.|; rr1O}m[-Wrӗ `5`ؐ6,Mac1lJ Ü6bغ*:AÖưCv`6ퟅaWcam/0CgabxA gK`xL  _= C1y_ ˆV">^ #DqrU7g_ Ǎ죃=4X#_bg9 #/N:X+š#[02b>l.ش6a#62a#} 6REi0Q6ɰ ݸ6oПa;lfج1Y oa3lLg56vS`3h l,pB}.X%lf:/lMe}jMMMZ\dwel6=:  C$lr]lQ kؔ¦=2U l׺V ~a[v҃mUN]۾ak ۝ݢ ͬgخ`܉E>aR Xۋahhg]EW`'wkǑ1];nx OYnd>gmS-Yssa7y+`70v+L[>]a}= `7F9`{zmQ/cT]*¨ hV\0ZF#}F[w=ơ3L13~5ƌ1!61cLV2*af]mˌ0vH]^0t1_xbquت 0Ni8iƩb3q=wa\E[q+1n?ƅo1^*Ʒq 1h}܏qY<Ƹ w`\To t8^wq(gt,yø;1n +ww|%_Y,Ha/'L[ !_cU13&m 1at&ecB&9bB.LƄsz- g`i%Lځ p *& '1칶=1! &dtLx^kWbP}uy ] a=`Ͼwڛ=q[k~X m Ia?; a?cMi9~;د D7ae/L'0qI9&.:Һ| L\鉉˴01&xڨz@/LjUI0z>:!L=02A#AD <1i=|CAu;`hfJ>,E`3Ln#ɭ0nUüP?L0%!”8LT'jPzU j`0uqL]_oUkp̀n\Ө4EoHkNnk{]~F=N Qkj~Mܵٽ2}ۆY~P tu$8f)1}tg=noϮO) ʖ,5s6cjkY9+1g̛䄹799'S1' œîa7*e0a|(T'bg+&0w&ny#?aH[jyJ.=|ٳ/ŠWZaE? xF`WP 9ð`4cq1 >","Xt{X?5?[?bwC5x],ŎXgaX<}~=ι[8 穗٭Vyps Շgyb8{8_< g1p> 댻}9ű6>j!\VsѐXƒpi#)piGp} 8p.= ip.p1p.Cw%\v_Nx^ɫ\DC$%q\9 Kyb>\;%5ޟ.9'ʣWMpXZsܖZn?\-; pQ}સU\~.o+* ~zupڨ?%\'|hwC3zrӺCi~kpݸjp`p=׻u8p{9\ +,p}֩6Oe;Z;õGwGk0\ &n"pp[p㉂ r͢3m4M7ہpnVp;f ]v-vpK,{Q?ۗX&eRX\ue*'L)Ld2`YCMw39=aXIUbXnK5A/=cWX~Jˏ#V ÊX!|<$?X1X?#ñbQt+-rXyrVJ4[+pzOUX%ZU"IX%gUR㰪p].U]O`?VMŪ1X5ZF`VUʱjvV-Ǫ%jg)V=jU;VV\dhUo*kVe^)z{zӯy>7gv㱺?TbuVW`u5VWtWѸ5j cX"t5:5ݝVlgX-`5g_X+vk'buOCuYg-esKekymucn.V5~~/7ϟus`LsuScXKXy ַ%XBpj\6`Clx ӱ~l{ (|Cj=?kjk9{][Kwaã gp6={y6W`stl͉b>K7?"9' -\[b9/آw[4?caJU.ÚS=Ğ\f2[xVrke>ز'>t[*Աŭ`t,MV9l/ͅbk uW\ [eGbkqvjz~![Dc5R[d3ce)l_qgp׆!%g]8m<.xp7w,IZwp7\ wsbluwp 5pセH;St{,-m]M=Bla4\9? J';bw~ʸ6rl0_IE2pϛ^ 9`.-l8'Ķ"l{:ƶ%v]o/x{uα&?%(v`G(2}l}&l4v3gl7nݾ`տzwt y۰s2[:`s,WcW>f]z zY`WM5v]N5vMى]c.dĮA{kx+]}vm]\ ̢6v-]sֿjRkU.by/v Ʈx]%vCazt^d6m-#`,'chѰ~oz6qnMk_d^ֿ)={aw;隂=J[G~6Ⱥci=5 Աv_7]t_aOտ{:zǣ`??}+'_d [aW o1uG* ?",={8@AL803nD![8༹^v~9sn9xk8p&6̟Yv0J#N|{`f&!!y0|xa-5 5qR!8$dpH}'!pA uq4g-^xVCf<:ůk g>CXJ2~q<,xI8MSiBk x< HlE>o{=U`\ÑQkqg$8#/pD5 8׵Mi4uib枆8RG[y(Wߺ.хqttyptݻGw323sqG/GcW} PX {c+bql{[Tcql|uvX!+ceqNJx585x[3ی<=Y|g&.oẎg x܀N{ə8άÙk8s$΄>ęR 3A8xg.Cq6;T(LF3ap[P ޭ+ݪom.\+;[!޲= o!֖#xJxˇY} ޣm76="J»z" 㜞9͹870!뮂s×Q}nbN\8g?&;87)&Ԉ|qͿs+SkKqn;%,:ƽ #py}-sO B`\j_Oc8Qu_/IWN l>.%B9.DB\(r%|G|oǡ>g؇gerMoLռgg{m\ I>w'lv}ݔ_whn/6=߽ qQm |?0Of7tj3|oQO mZޮa{mf{ty&.NǥlV?қ\JKĥN~ v𓓄~;}%΂ߦ[ ~:ּ2x9=8 ߗ]u+*yFQE@ih5\XGU(p?m]\w\=W ]V}R#`8%fϭF2@ j , Y.ߴ.z.+AO[7BUEZ}ĵA*~tAPi S'AP޺|>-vC"f}.<"pGZ]}'.cDy#L NA 66fWԯjf ! A*`O9`-#k>BpV`M`n; I#D5^,2"4lv &V2 R}?^AOoNnv5g}Nk<i۴h 1#4 (1h(D{&"C F21ڋNv91%13z bF-Ae !ֈ1ƭ{b#&CoFY9柖CL1S1ٱy&1q1w Vbn &?bUrS-~A}pWGwen]bOFu~jݷSZ:3hw^=5ؾWkjX D3 #>Sbp;K{׀V^783̜jFĜ!_K<[vޖZ\'sED ښ"AT %H0BIW$Z0$GBH0؂ZH;< !c 5(+DH ^H4yFH:wаvcGb+$.G$Y[ļ<$0dM!_Y!$Gb$K5Q姞ӂ=I7$\DxĊ$:H؈$WH6IzHRViLWyAW4.: ɇ;pIgy]}/理H6@+$wvCz$CZ=S!yn$OBDy$O j_ϸ"yS$/~ 5<_ so0!y4$o֮,ބoWk3~oڻYf~kso|_ɱHV1x2Ã; A+BxP_<R 78`zL9yHV+,;Đu |HI`}"^REJ$ix Re#F<ϐ )*)o7 )WʇiH퉔wבR8)Gm<_#|k'xa5R{E UaP]c1 :O{n u=Rw)#uG(R.FԕH]>ӳ=ROX#xR1#A-zhRNBꁧHTHԋLEhD&.HH;\QW'DZ. !-eY_3`<3b<[L}=-y^v-AFd-Aֲr,!Ț+UȚԴom˽?=S#٧}E_{dD=ȎB1ȮӶSbNG/`9 2.rLCڍYSU2xZ. p r[#>^Ezx{ "rNrkNozAf{Gmn9Q ߁wNF盧Nx2>7{M*Żn\kwcxg+wn2nwy3]wKN-Q|FK+|ꟛo>;rcq(rܐC~rŃs9\5Zku;#r-ՑۧSwtB'u܅;@mC-7__u& n!xotn}x"sޯ|ɋ}dx_{tz> ‡ wჹ>|Hz gD7|zpR6wm}~_>άi858ˋŇd>F[1b#>^M>bbT>VT3ǒu\'/O/ pQm g4]ms0a}گD7;g 2衰$( +PXeQXʸ)(,f(* PXPp QcH^(|oο"ٗ܎wl HE}>a(Ef9q(i^'~ƟBZ"\M)~9\(:P}P)vB(ڲE/hAkռI|`'Wt>>7§6|:Wyٴ?ӣq-WS;>§[!_]vswvg +>§},wk?+.g+L|Tp|K$yb4>۵{R|>S}ҿ,Pc/Kxc: D~c A5{Gq Gi_F1C= (;r](~_ܷ(~ 8FI(C /J>P"qŦuMF(9% Q2dJ'Ģ%Fl9JNAɌI(/Gɜs(Y6BɎ+(%[Pr@%Prtx]~[(CI DILƽ+8t| JNJtr@}nꄖs?+tpFKG.BEE53Bs(Q@f<tBi^JG(ҷz(Aiz"JK濜mY%k n|&Zd2ʌ/*zArٔlq((_1Ρ|YOFH9r*Y(!r(WFy+CykUFY.~v]{yK;>}vW{{_ߪ:s{o~GNؿ_~o9_}^][/>?_>)kߍW_Ws;ٺFP~S;e`S6;8)(/(t< 9.(xXԲn7܇g0f1 0@,TS*>ah=}Qa*>k;iR kިـ5 ɨ2l ΨJpT;JlTj )T6G堹8Z3+BPG.2<*#P׼Pj+*?)**rQ19P*/ЪTV8^\QյQe*2a:Ui6AboT닪ٯQUuUٽQqUQu.0t*ޣsBGzxTFPTwCT+ɡ=7w5y?Lw>k~׷g^^ޫ/Q}CuQ}&"g%;|1@M5QFʠoѧkըr5P3i.jtP3a:j4GcY85NҨ95N/MQ3O^@'^Z"笥 z9Wi̓KjCd5hh"D=6'$#v$|S6ym')hD&"}E-q(ש6q=J\W!q& UE\٫+˜2d+cqgq/szƸpz}'-z7.v%n=uL<i[kE|'wxO4g&&>7e}aM=Վ1ӟN,&~ІߛD6'~?/&3#H8NQu5 k% ImjZlOǐ;$ЀL"H`03SQkHB=L;JX*Q='8΀X=QWt&ɗHо >BzW$8ՉX "_ J~$+D֒j<;ĒG R"Z$8 s'$p7'pmyC^;=s`-%H0\Z%!$IBzB$$MB}IH' %Ih ABFz$O)Z5#%u( y$$׃ !v#^$<*$l7mI R#a$|$ G"Q$|CxH r& kn7pj ?$ᤳ$|__"gHy]Go$2hR$QoI"v$"CE:$X܄n ޾-hO"HjL$K]H:DG~$$:.~GOh"D*fHI$M$8=_&y3->*jǰ/Tا_'^#!,Ɵـ<-$тFF_ׯZSWHH|k@ $n҉ħD4Ͳ'q'Q>$co"q$ɛw/l0Ͼۋ#+$YAⷙǷ= " GHl:[-ԮrjMnHxشGh~FcDӻ{ʙ ը-_&MmUʨ;9͠Cm%^S۶bVڶQ5fz4ئg7' .$COIb&p\OIb5I NfmjZ$S͝$.Ia]I2ITD_hw-]}FQO90jD=:J QגKIrqI!IM$Kʞ4Wu"I?U7#ēbG\JoH I|`H+IU1I%ɚw$ݓZK6 HR"9_s$rmء$-G$b"I="'$ڸԍEP[Eӷ$=% IO!~$=aOZ1Ӟ׾.n$Ĕ'EIza_^0}k-HzEI/!e Hz I=OһsI\I{] CO$EOo,EҷH/HK5HyL% If|(Ɍ"!H5B2I 2#\oIÌ.yG}~d 95$7KrsInG]#]?OrF! N!jW \{+LI^x $HkkjB_6̨KIs)($jL;R9N ]ZR#O>R81SQkεŐ{TR6lED3RF[2Hy ʎW0~'Ru%e|CzCK!)'L3UH}V~6);IRoM*<I;T&ƒ(#RO*2ȧ3>ﺈT椓BR^C*S'ʆRY?TV&[ފT*J~(ɑJR@bHUԓT!jfL&IؙT YC=H,vIIs/RxTّRuhE HuR]wTW'ڐ>c'n!-HuӖhDҺLRLy |*f=oGSGԱF(@'RG(CzP-qut:nJ7<ը8]:c=c߮?u!zm^ER;dOjBHmOjN"R;!EjǦZ5R GjIj1l"[I-/]gsҸg1?5THC6iL!14z^hʠLڤJ4I͒=Ӽy_;מ_OC=⤡iKjwYVl%A V1p0i 8IKI.跛4-ICpaXt^E!H#̙4?kY~m>iD"(WҸC7OF`|HZ;XҸAH#֓4k_7a>_fuQ4I&p4r/;sx=4yN\HS͛4;= M5ifhn!iQ;9Ӿ.#QHO,OcGmlHg ؊4f1Ҽ4l' \4ɤn%0KBZsIK)iɶ&-S%KZZ~IiIZb,VYIZG kY _c+ie & >:IΝ3*Om=~UQIxiiCԹ$UH[zjzi&I{ i/ =7um.#cI:.mI:'ƀ$҉4%0tN6t $YJ{H7,6!I{͝t/O#o}E>{jV,%ݒɜӆuy~A9ZN]6uݾ^@]ck uT ?eչ׺Z!=ZLz\Ic[S\Fz^eӕ!= 9ZFzHd9^uoӊt Ho M{ϠFz\7#ɑқOz3Ho}5-gEJ96&HzyKzIo4y%ICKdgEzH/ΕM)һNzΤawѿxޔvZД/amy_dDS MZ~=k;V8"}A/5Ǒ'7l'}NrHrI}HK̯eSҿ]D7Juxy'2(G 2K+`2p}Г '2X 打_[pe?4ߣ%eM=SDыzH1Nb1,A=g.P4x˼7:2\EB9Qꗜڅ5;^h#LFxh'%$d<ґ?"cI굺zY ^C쨗P2XĄYe2۱eތXxڸ}2O:(z^VX756}SK<^tz%Ed<3VƯεy=xN}Pwσdꓵd.> )zL}ގe1ʼndҮ;M%x2L#~dbA&F'893:C&d̿H&Tdّ|!| )W_2J|8kVd*&NChv .LCLfRׯ^Wmvz__;~%g0o(Y'sUq2WH悹dڝy^Y /U-!H2+%d%̊GK2owߜp sǬ;>]<d.KDb ߵ}cȼ2FFdn̻n4<"s%dv!s⌎|R&OL#ldQN|_ ed 26̗ #sϘwkF7~oxW^"2Ǟk4kd5߾I7˩dc7Q?E8P?]o&;ғ,!ɢTCɢ ݣ~_VSrԯnGWfvթG\/'Y^H#Ӌ;YnnY HW#2tYY߻AqkMLI̟ E2ͺ>,ӭ6@FeVY(*ɲ\,?i+Ц2@kYGT:LZ]DVj0Z>':_ow [#+J{KVd~:Ye}> 򠡳rh3?GC7iP$mix4Oа4,^F܏ѰhdnO>O֋u'@֝l-5XͿc9>d" uti:m&[kqZmdՅlo$PE$Qd{ds nz){H_Ȏ)~g;HfHNu\5ܣ< |UB_ ~n X(UB\Xbw`(c<9i ! /mVǝDf?iZ2uSޯkҳ 1j!8yePDON4꠳t[g|}nO^~"O٣;OrևJX>w>{o@[Ex)F 4Xϙ l-a62#0jg zp6 G0Q03`FF̎ ŜeҘw7Bp p8 @omwXuz5ףTk:00Scc 6Im&S9l Ħa;bpٌ]bK͵{&t*Þsw<ݿwc_k{f]=آ ,w x܂l@p  "$;=3=s]?]Uשοopg_K8\0͏Om.p+9\p!!0C)oS{)o>$LyaW~^~Q_ (}M~fs _kWmvEO{Yگ> sU sU s]~nX`#3F0nu] Òk|=,va \1.,sa +BXsUW=3aa {-q>[>l?lCk]uE7(a5͡a9Eo=x~ݗ \7*rᐏW ~H8߆#N19p+lN\bpuÉ>N<䷷ 'tR8mC ϰk8CYZ-L0᡿s^p !\0b%> NThB%g!dv ac! ˆ{C²Xծ_0߇0vv aVmק!̟VqGkoCҿLaZVv+=ڮCX!,x{Zڞ/Ezݮ B6B8;!lz9 =!/!9w@H&#Br!5B:!񐞱Ho/7' iOo=n.ґ3_)ϴ],Cy*G=,?.6{߾]vDEϡ窳Bˆ;WC Fjae*vf0ì:+6#aٮ ,yPu=am*_?{rX5FAL}v O8!^siy0M¢#NqMXtyCxy^:# Oܺ!vaziPZpPT!նe:^/kvHѡH)L a , /aبՏCWQa!K npv]ǡwCυivmf+}?L}Za VZE6kO 3ssa1/l{q9ąØ9 c8),֙r'loِ•ۇp!\Y,µO eo 3tBz +tѬNSEy^YuPYPY}PMW l!. Sz%NfH;մmv7(N^5mWCسBs󿚞i|^u0; <[}fe0ߏg}\0纳9w~(̹ˍa]vBaC Æl? SN}WrF>!ߜ&0r][0FnDv4v-9~04K?90LЩa~xoN;07v_gÏ4̸aY> 3k0ۅzT[9v;{mj_{v0ʼnۄYO5z>&,f=agLJ~_jM9M:4qݭasp`5\KabQF-sp~a/QFm\! ?F={QFDYaV[FkG2Y~K[<{U,sW2}C\^W?M74[nx΅bV*6UkC5q!,oXU߇¡v?N2C۟"g7>{KA>IG ˄қ/wdd9$.#Cv ؏C!9ഐZ akO B:cn G̥Bz!kdV_"dMG֥ByCyPoPPc<gBy!{ʐ=涐; dP˻C3BS66d,ڽ|= 3gi^^ԟ3[T Mpl@ávNJoeIo.KCqaX6?7?gYv]b&vlamj77~`V"lS3֟K Nv_oiVFbZKl|mWoPC^iTzu{C~\ncXb­wzgVBkޘ=Ow̵XLVT.͕K+O]۷IWNDҥCX]ˮ^OÖ3NK_o-Wg~%zvߠ^/۩/K73tmN*ûIr=ceu}=?aY.풕MY/FK3K?2C̓þm'C<;#7=qvk'g'udƀ겍n_0><:ȍEyAR![~]-`d bnnjF ~ '+س1sF]gש>|6!Umҗon@{io߷˘1yaWKۧ}~_] YyI353k!˧֟^^.u.蘿IljK[s~+'S xsho%W$=OVK߆>&dn#n>Gec^zG=|Sڛ` 8$iА+;MzAb3s 7NˍU1CLX Ɵl|ë4CgJKpjhlٳ8>O5]tPj[m=k:}`JhJSUZ;Q/c[}\_['6%ǒGo0v|xg+s:ݦozlId^r BJ?28`lK[:^Ik4a:,7-gxA+o(nlfZc٬sU^yt༼S?'Xj>1V|RװFpX>Md`K9=~cXg8)N|`_\&ʵk/`5ΞKlҿKәavgD86XLeoGuI}<`=qM|3LC!sgq?GppR_ż^+W䣲sfs؄~4;0lXTC  9 qe_o{TMk//Q?%ɥ(Od~< l[cj8 8ID[6}ʆooW+}e{UoKM8} %t3ȡ7~oFJ'_3Y }Aή?+Owwݷ͘w5y,9FѓVi:_|f2F,F_]?ݘ? xHk>< 20x4~h0)4tAZd2 ֪FwJ7cIOd.&g ZǴڤ׵<=y'H?)xpeóc6>4],==&@0W~OLJ/Mj3־mbE<=EN9uI:kb_7 2nL7Ad?KY5} {ts tˈKﷺl,0v!$s$8尦l|G)Mi4V{͉dKJ7ik/붙3*:TF'EB/$q39xEHlaEG2X/Bv~^*kE*%a]پrm^][& +&!>ۀ3d_%M94_C)6,lEX4/N.wZ~- mڼ+o: f̅#EƋ[aUMc5W'~T9AO Id,|_?d{(?CA-Q> zo{ŘlwpJ/ 9ARld5e3<_f|t^{ ߹P%dv?>n}Vlc<}z}Ö@Փ[λ&M&o=,a<6D|p}CΛ~tWz~=6Vc_CZ ՛g$}R =lϻVbM)&dPvymk58/`49 ='}o^Vgq{?p Q]s¿ï׳l|Pe l9W|ƟeBe.}5?lS3i,q<̢>a3ұg2W.-h8#WyX_ӉAe6[_t_d[\l%uCmu8ç O>=gmwN'a3<|ܩ |to;^cFq:>QK.S1)y.Kb+Aqp My;o=|ȐYrD'ki0u3û=ۘ,\bIt_y>#^ [H,¨̽Ke<|}O EA7vحMhѕyX;_ `=_X8a =Ad}+_Wƀ>(mnY.=ex>fBoA4]YyJM ʾTO}{Mݗ ZV>8G{(59<;41&kw39b; mi=-3=Ԙ|V 0b||/tZ:6|]Wљ| AJִ՜|sfU}{ 4_.3]piy}8}90:1Gߛ!<փ|\īu^H:bW;WW, -. г~֔f6|hY)dmmrP/)>}Ѓ' d|ӛ[ O}48/~QjGhM?:m V i v8ehʽW~`/d4.߮.\9ڶS:FIhWy_{#)ZLtޓݚ;l)A4 Z+:sRcwZӋ(%W4lmGؘLlϳ;;)y',/E_ЇcKnk V^}/KL?ɯylYwt?[/0^5=[>=w/N>6׾;?Vtwɫwzfq`lcÞ$t7w䪆[_B ~5^R͊HД.:x3[]#}/ȗz(ٿ'ߧ^V;y賌w}42f`p)^g ,*Xҵb}ɯ򵯖W<]v},?!5/񧕞=yC8&狮uȯ7M]|sҾ7O 1mwb?AU5yjkj^v6 ;$|;3jZ7 mo :8>2xޟOE3JX^`(ş>OӞs*Z]_U |- ҁɢtK,e'}[gͷlȒW eo9a0Cf\/@{vwx hk5a'+L7g{{:}[YU<kk+~Vh|WxZd+:x= kGvz MR[?+sa,? 8&(Ṙ4e?ߔ.uԛ37I90W"eXK-6vN/9 u\ߜދeDpAڱi$۽={Mf Jsڐ|="3py]85Mq>5K;tMp&~}ōO*#c^τ~<aCj)OBz?CC蟑St=z sg0!ۄA?q<vo|W/oг֥Ͽ?i['mJb,9;˟`,AosK3.ak]^0{;䵫wvzߓ>qa,`#ڗ?Sí]:G1~o'Z`~ل RK3*o~)M [Ď^̓PnrKh_gGNٚ_n#62{ E!nۓFD'  9*sldK{ۊpt;FS+ AϏ7Qw_l9c)]8XMz}u\o" f/Hc-vWyT]O[P7O>&`:"ڇC1oOMmz7nU֋ G5_ռ]ެ)QOC/[>}r(6 ^K6 _"t;U[&=N>'Sh];i_NQnysۮ :IANk-'U HOq/_鰛!gyh:eeiE }k-_x<*6!d!>tT\C[yl/^JkgE]}I`uRLwߞc`U77m蠍Q̆,p$"~ gU>w:EG66T d+Inm+uwwG/REn~Ok~2յgy6+yy|ʺz]p=8~f{_cV;44ꃴcC2z٭/'yǺUtnK2|Y{F^dvǎe_7&Y=Q,P?).uѯ2(}o,vG2<q.l:c`.TF~g$?GWwu۶wkq7|C'ןsJL빪7gcZ^w_QR1׽B0'+v-{deGBwZf =w'zX?qqłZd+;}R̮OB.~9Gwyq?|߬ ҫcwf6C'b)_d-.˃$/ֳ~T o ClW!e SF,ܡ 2 m'ZrxϲQlw|CW,3po 4fϊâ FK$'ؚJ~ox1xeo.' ;S/&v|}}ei=謰8)i)Ho%Zm6G׾ɾc\c`}Rk: A~',n8LSNŴo1'W>jwqު}{##Mqy>+-HcYYGzwFVl}fGQa^~wd]< t?;]Ӧ4i 48: K:4[;=~.'A<ږ>;ٺ^Fv1^V6'ݖis-oig[ã:Yotll* {4#$>vkO6; ޤ@gmFde}]2}}?/ec ..yHӅYIω^#`C>K6[m95Y_;KLۿ)mXN~xi)sfÁO2gEEO?p4J7KC9mWF:2& K_9,ztoR>87Miu;3^We^>O1RmGtySb6O?W>FcG`ANXc23m<7mM&qZ?鮍dl~ &Øڦ7&mN%Y l o zKEvĻtYdK`N?PP~ ̀1?!~*1'24' 73Y8]_|211cq'';=y x=Yxed9p"<'zZqeϸ3~ v o-%[[~"V;A+6r&I'kxT*)ױ b[/ :+5;K>W/.=C]rWcaOϻ|k\$eݸyߴ kЧK&V-d_pf.:GTwcü|eߩeNfsl$L\wX;#l)v5'7wFemy%]d|l$n>5Y-13[-@'U >dUK~' vrﬥ+oܘ.9k#i(o4@0XUq,'*媛[.z2 L7ųoߢ\{T |tK]jUѡh=Щͻ#]E~s#q':2: ݡ35u羼[/wY^^t;Kzïվ :_?1dn[{0rq_mߓ0k4Y)4ך9:{<3lt8}н e7KeZE3:~8B1He"m[>2tFb׷")|fv/p z}K0kl ~ | CG ?WwxZxgXh+~Q4gJ BBGa?+;9Wq8eoHv@ݔOr^:wrgn= I[昳IK waJCV3?.{3s#}w,8c,]b38V8J' 3:Җ~k|Ck֕2v,bXkqoJOn0!k>W:릌XIڶ5]rmޱnxUlyl9mS <YWF4Ufd'c߱vak14wٲ*o<6d#A/tǟN{VS<簖!; V/D}x'nbE񵗉qa6u!ǭ-~[bϽC7ŻAӼ۠7yiZNuޙLyexa/7m]~Rg0+),r̸mky~mmĦƫ%Ε+_=(|A΃ero+&w+B}? mC۠yGx_h:zTS?i͠Hu"n~9UIz G]TKu9: tv&'N"g7ڄ9݊=EkNoY YJ8+voA__FW:^=ɵϊМW ր"kAk_ :#{xg4/nefZѿI4λşF}|!8/m=/Kڵ)v ʠhɿ-S/c{۔)h]~e:}W|zlI;Ph)>-V+AҪq:?.g7Ygp|3up?; .5A,{\ŖJ ~iS=|ҀemXήWo^(%;xx!8n^|k=7C*bSZ)R[79ɣ^drmk{>Sv}k.⟂7ۛ:K}Ro`tknJt7Olvwtgyl}5e=AOE8Ă<le ZHAv_\#9o֡!SظW,dNxtb6ɢm63'^}&zt 85>o>Z1>?+|=%:D>׳KҾXM!l 6Jl99н 3:}kD󵩳^zmաHt_xiw6$⺪ﯨ=ڗh hSv}H)g$q.pxF8|JsߵpwrP\NO6 d^?Z C4_nIVc`؉s7B&G/d\/KS̷˰\^#_c>8gߠsPz7xYU 3Al4{$^~xruojܖoٿ`3ʞK#m,QclʆCVdd>g4lɩ7qIvG<܁ѓ~q2(?Q}D+v8P|kLZ}\ k 6e3bVoۘ l[(Bb&ycR[aTt3E:}F\#҆bWw#kl& qK+e 7sҮnJsk:]2rNKeci+>ygIoe%-|MpGV\G"y;khzetNď1 on[bkO14۟%_rEH[6R>G`<غOh}^77+νV lyxl4l8QggZ| ,Ttؿؗx71v5[,]  w/r>H g7CWd4Dl~nڽ|վt{h7+?rOb>Ŧß>t^"3atRq2 .iLF.س ~#Ω*^O5M[bd`o|_{,ߟle`ؽ3W&c>jcq d䜏nPII\!zѿ~BGD5z~nSF\&K×J~/eFګLat=ƥ{ou^F1h ]h&]ll2vox 牒'"r0OqɃ#+fȳ>'_g:co,]iҵҮo,MKs:9as1[Wgk>Oa.3O/ Yy7OKLV,Nwq GlqvX myաΥMihƾl\;;6+pS1̻[OaN$.F t'grMC+ۢz+9it~lp]Q֗nv`Cz[ԙ>dΓOMvL3h'cKŇ9^o4T}OБmy|֟aB/ԟ څSߡ(']wo 'E'Fl3B7m7S=6:r jzg]/Wuwטwk>">mޛEi c9C<l)㟉}q J< w].۾?诰1йFHcycɳvmu+[l*n=).1ѫ|[g|/~oTv+,t 9{Jz?8(V#M2x ^>βrϾ,dk]2SߜJ>*N՚6Ʒ瓮sL`|nlP?|8{:M=73|-eSrGۖ3r<,廱OFgkV&ƃiM|+ytl#"8cƏg8 Yɿ~MͿb?o9`:dH02lw]o.H۫ mBAHGWwkz߲};zAhajkC]|G}3Ǭgs,1#z.䟞ى70U^ Z. +K+ ^("Coْ0M !|++5[':tE##/=֟tAF[NOuw3xi`]F>C>pf;p%k~VkO.kT 6YC[cONdVjz/;>d?ZS^wL," փ gn<8ԮӇ_XWqdtgb3^۔ď?x.MX_q&ʇ9@gjE&2<*k+3 _<7OË>~O/Y2k #JCVۮ,{|#^pTQ=9;ԡnQ^UP)33|6* a/6|VyP< Ѱ|8 in8p} kAS6 mӦ=@[mpvf-$Ih}=^/8_q&{$(`r6?#^;(uk(`pW[)8/Grn?zt?>9"_Ç}/.ӯ6եYi߳˽O9I6cV+4S~Jo>GO+&Lu<٫ 牟7EUϿA/a|G cYfg]{&&/}dk:_.S!CcFoFx/8ia-&Oy]/F~4׿|`TTYc/w|x63>wjtS>o1wɠ'0?Ƕ>.❍ Qg\Q8OunRr/6S6}:x[ΰ_,dzZz?ZnvECyYǧ:glX+kl=?ƙ+} K~?aoS:p{4Agw׺NT~d]1/5!˸]|b|eEŲ:gi6]cR4WT&:vm߸;֋?mj6uqϡyYȱ՞OwXdob98 Y1h}rϤ2捾\w 9}k:#opiۊḳa|\'UF? z%t&CVW"ou_7Ď#wGPqW/S=L^]GV1:.>$ +x~4邭]Xk_c~%1 g)M ~VoǴ0-oE~|,;lCuU\/W[C?ݑ+2_龡+w[K|_6I'mzZvi.)=3Gc{{g/b![PlNjɘƚn\[Gu(_SjU둽孽m;;lrCþ;׹LjtXƵh4C眸ゟ8'ޜ7_& o< e۽+^K&=T2l[ӈK[{g+C|,5^Ug&gOxG7ڈdVZdآޱg~_ رEO#~wO260l~ڲr#'ԡE}yȹU7tw,SszQt/ْ@q )&AJ_=yi; 6'6e veGoF5~B1b2^ >;nv$5}s#=>pK !cDF8x\>長뿬b |ob`H{G:ӕ#-ҞFc#2g_Noz3(O;a:~ڪ7];צGSgh &$)Rp:G巇\\g Ϸ~XG0Vi;/W/nj+dueYreҰ%|{^%yp7b_mM˗&_ľS.\}駜K䛟v.#o7_]+r-١:ƳF1n䳏XOehC_[*ȷtc%N|Am8+?ʄ~eA[: hͯ {Xt=yy#y֔yY3V٘#x,lL/*:ig KrmLTkm.^ Cp<TxKxWfYS d7^?jܹL#>vTh?{eczzY+^E$N\Y[uÇ< jcyz' ْFct$g77=6f$pe_>dV&3֢) <\Yvc; iOz:Wg^0lU[bRPcX2Fb2/ 8Éq<̞1E܇ ;!&dAg9ivQkSq"G9jg _13B CUc]Az_sD0؇6qPK:QO+cG혿Ӌ2S7uj14ؚMR16; K5b$wJϧK|j &>PF}oP,H|+6_$SAʏ/UqW%6^s?q Rw@^gh{7:nn5AweR piI_4j_4b1 /^EgL| ŕ5Þ.lۮS>jwGP^/ޘ&;* OuqDž%=U^S)MgDH{oTF{;; ڐVsIuV)t>F/1/˽/y' >tE?v)rF}qmPIv4ڭ #.I|='3{l_G{c'6;?84W.oo۠4go]Qy||~-#c n$S>5sM`3yzkW\_k;5O1ЋH']GpS5X6~XҏGa<[b 6} =Ɨ'8܈IҪ70>1yỶδ_A{ă2=􀨯6G&\b5>~Yo>!N[y6^'G?.TܸpJfĪ䧴i_W6h#W#ި3-l*qnz^͟Ek6'+u/Ǟ3>ՄewSZs)-Y0qm{?受gopOR t3#p@9uW#Ld$7dh-9Dkir|Zb9=P^Kӥߣ}߽tėnN9[{I߸MmWnJ'&vt5NiJ;5Mgƻ"z-+fz5y5#_:mYgUIt4٦jk}^J^ f}qAeӃ_+PO/k{u؅%BCrؕ^{Ҹ4XUzÕa>#{l?iWy<6w:=~i|'K&,6ˏcl"bMſG[<:Wzr;i3Wgmm.+}G7M< Y+,72N0aDq 1y ]^&_j7uv_j||q({HkvIW?53|Y#cluɥ`;#\zV;gqMywTm0zdܧgxrߓFg:%ߒg}P%OvS;:Ct_ѳ[:GAo |6gqJGw_xOcHs6RsWxv?@lrm,2M7W9|^Pf\9tg8L!;q^E3Ex@kpk1{n0sn|.'~SWH~ewW'n ekad O1tk_{db_/-rm l wWߩHIvQ}ѭ]_؇/:?e; _4[TBg=՘ zzɁo^t*^92KwT"/10ܥ3Jg W'.êX/QQ5cשmɬ[vnީX޺2m֪dIa6T /'?Nrc*~KnE΁B3^/CvEw@g6׫bouge7*(ʣCYh~'bN ;p[OYW&zaiu_:lp#>\(ۊA{p )ؔL ޱGďkT;&HXvGisǤ~,[t[> nC6/-->W{_ zs. {='O񮦴ξHSum ]bU.SP[:Mg;E(SNe؆tz6V):ۻӽi{;9Vw"L^w% ܜY,\)-ۦ}9uf+]}ceo꾬 oR!o"RAgn>FlMf K=Ol?i <.9^T5WqX`| v }|9Ci˵KoJޞ)yŖGt|iT @~o 0f{cY2O^ ϰq5c8=?Tw"=#OP{)G{9y#­,yX` ?/7~?pxR][q:5IE|Km~3NpS{}w1zʻϤl>˛Ⱡږk;¼\=洹|ߪW:=K="?TkK`x.YLoď+s%>Ή[ Fw=s[ŗ]ؚ`8}x7F+MhkcfGO|v+O{K)lcb/"^2g?k,:&~tэyŘ/pl?L>Wgg{1r7^CAb3^tY8]]Z^_Ey p:CZb2S4"7sl01M@J#ܢ})^65u<}~(6$F͐lK;lНs Gwg{d;BC߉{| {!J?jLNv=Smk|4u)[RL5]e5s7=g.uaY(psj?ОK KږN^q\q5>1׉Q`_61_wT.ĿXN4` ?g){|">h@0kO.O1hAsx5}̑| PǽГ}g6;lg{񷩭n:S{ CLot\&9`l7ܖe҉т\gܕrx=__pr9;^>\0} 7/+gJO4%Zko`3V9gXI &%UKpbށgOg/`J:Ϻà|'ֹMt ~¾2s L_~s9WP|룥U.oĵ~a&GWk5H U=ϜG*;=*o/]}}!{>[G<M?:Y/(= O}h|eWuss 侣8t 'vt& e1[ NtՈGNi#`x(Ie@Y&hXE6~*]ښ_ާMR6oxy/0PcRMhצM7MCl5`{\{27u\ʷ2J8_1bsY&l߆<(١e`hǤKy+L>+YEdjv{m_5Ǿ3'5+&OmS6&kkQ{Fl-bLpRyð̥}yy gXc#܊drMVqq7qʒ}79 0g[TY OA0xԞCلLQX?4M9Uw{=Cѭz^92_*xy}^۷7C>{.Gpv9i ~t^Gx+()iuy[}>z 8b[cmS<-&Is-xPٔZ: 㳈3z! ϲپ/x/#ytD_rXu5~V;S|Meuʷ~H`.u;M:Mz 4tsMۏud_O9O!MGFM5+lSMe^k*^}\ZhG#x;6b3Pv.^}>sgc]|,c'bM11qa,#=|qpn={mEu6.vC0$9}^MLvcf|LiN\p8:"g~=Vipkvt[4m @n[?t~A9Seor Ip8czkq&t(}+Ƶ만%W Oy1:X'Yq`u8Bv[tnG5lo9 |54t !ة- TCL΃wY.vQ= y|$ԞML~_{ 7x$lJMC2C =-Ѓw3y⫧=ZA~3>g_O#ׂ+giN@; 4)[o$~^?#Cu.Hrs>{3ktT0nWuoTxK7;pyd9 L盠gxi+M[ْ{Vg,66. dQЗfLlMkka\.ґM6|[!ߏs퉙 1xA@tp]cdG* W1_1e_'λ>na Ŀ`'nwѕyҰ=s16>S<#bCLv-pPWirPud,M>38tTvtz؟ou}Oo/NW\K'O]9;/t+s}xEU֞+`a zf 2+_&ٟhFY ybtҐm*768/8b4JTOjptվ3t-y8>۸k<}GgsS]zFon\g@lW6ybiʠaJ>EZN3/aw@g%b |N}?u;.b+xݾes6-MZ6Ϥm|BP:Pen4ďb˚궫_Tov󽯨}u-?Z1# 37m",-yx7j[ӹy 8@_Ӌrn(qdwkfsqk(&z_=b؟'݃;I'xEX=q֏b߰>n#8eBjFUዞlwtY!];^2G_`v?+O"ߗ55g=/N/۽;CSN/k=KQ?Ny 2OddY }W qxԞD[h{;| e9-λP}C?~E,h525#1,oeKR]Z#A!sNScd~G7/%ĔZ_;*o5|S.218ݟPva+[F~)o ߈uO̾rkᗡ% =ʾ(>xb$1 Eј3CI=طfEU.dw蘷]|yGź/whV>=8(S1}|zUtBFz~x}k=kRMf;ކ> ~U:gc:v`9tආ/}\P:K<|ACK- ^3\t_asoޡi7l#}4Ok8"N>ƸgLP<4E%gOt4xexokG: "7- zY6v Lwe8+=g,ݘwe2_gx%h<Pn`Þ'=&-'xm|gAF[ů?AMLӇd7&}u=WgLyUNpl`y5],E&bcO ?\7#/+\M7vx2^^]玃гcN6|F䫆}.K4orb?g0";ql }g})6|ROܤק֔vkt׿#໥wm|=M7NA2b,p: 8uO㯳?WY{7xP ':.>]^2_=Oͧ[M)kx|ҝ5hk-> S3]æv%nyJGc|okssۂ%ahBy`ɹ&ksb| bp5%:mox0kC<7`-?#i{ڕv#}7qa^vߴ]A|{ɕ; l,^⋷mVrg79l&_t eWd atJC35Hٖd7X{w4YOУAF#{֒|pX@.z}veUxD?w"LwQNx>9wv'\<^˓֒]ٳP:ܯ;zf~a+Kxa'61=It]@M,YEpe? g9L0|yUTMM5[m=_z)scΚP${/Bߣ=־sf2?@~C߱S?(uwہ7  =՟{.$)g>_y^tTG6G{{6uUzm^*ϓa/qڏQ{.t=1X}EOëbYcF֊O>q|RM|'eF'[z=y9!8>+V:Ek}-37B16q<}*maM}w\ {ePLb!Bwg31M1WsjzaA2̧Q^xtHٚ'yZ柾5Mq윆wؼ%֟cg=UױW?.oa]|ZImlTv ߐH S{3kUUKK/YY5?Cve0E 4Tsßk!7cFYz>{#VSν _wrCgЏ?{ ~F'1O?^5wl&cǕ :~^sR?CqD*6_;oA#/,3:lG+u 3<4EIU5@'\ 2> ߦjj M%8iEk6^R\l/:=Sw+sYVe)l_._k5F,*8&Lv/-xCXow ;gbOsz9j?O;'zZ;)m8>]V~VādI=_l@37|9'ؕO7 u'򗊍ނ$54qWu'u|)/mH7r >r?WFOslW`_P#d2|1kdC"˟}y~Ϡ)1-i]&4Cg6933YUHgt6&r |z%| (L2GAؗ#۔΂<}u|v}J/oS;'ƗP!f2OQ'Ä.twhKx>/O9䌸nڤGei^ܳW  e7X5~rf^rxpn||^׵MNY( ?\?y}k~=_'F_*7AyXLzzs{޷u(]tѢt`9LŲ"5rO1lƫ(.A?:,uj?qzT<ܻ}"2+247Iyủ,qm2tއɲ\-3YZa{2:NK(CX{;NƓJgvG<}+k;:itFNǘohtsOd8b茋ҥigC۔u$TVW|( qx?u=F.iqIwJ.Q'+Vq>yw+GI$ѹ>2ik\+}@zOk'N<qO|Wfo"XDޚ5 9Dyhۧ큖?a(<,L,]5hOj\n1M..]?s( :Goڙ6xq]4HW5ngh7 %˥C^-&4&cm?2a ;Fy+ku S9 0y|e=Cғټ^CڬdW^縴P;Wm}OK1N1MК&{9sZto1^O3<*9#l^՞4dUA1O{T\}ldC.Nq/ּV "hK߷8]w^Æl bǐ/i⇶7.WyxLL}AnKHi3!zz~kέ2kRN?_O߶\Q{àqG e;8a5"K<9?K3`.Ot-_Re_3syz߱3(K65bFˎ<)W;Իq,0}57qpk\]O=)\񾖷sF߅.xPA -B3ȂB焼n|.&gw)6 'Ob6o͐=gf&>[Osn|o=>v|ݞWh&g*6?ILltA*O6GNv;+7x] k7sKVo걝a~G^:/>=ޭq32{7^b*~#I)$;97Z6/,^۱àXZg CZ6+_@ +nt; Dvg;|5V68[X֚ľLbdGd@k /h(^V1g[:C`{GD^X>}==P/kMc_ :lPYx~OK!48d7wG/NrI&_ gZ3bt%7:!ffbU3t zVUN ݀|_$1咏ƆV%i]s7N:/z6:뿏詨HWPeVo[U ΋Gelʫ)NkhOh ~owި^%>d5״Ӟv7|nn~tew,O;d_q K'ޫQZ.[lrc_}aoչG#߯! ߂ß!z|dnL/[]كwm;.>밭Z)i)oVҙs)}sۤ`]“.Oe?V2ꯌ|;3XNplsXA:C ѳݔnƳڏpb.jb~ܔ^h"`^0ݫ8]fp.Yc+S9C)s0wh[- 9B>L 㴙o`~".G/Eߥ>47>43b8?˞]<(zLA2'vyFGs6MxLWOJ`9y"7L[gc ^#s(]xx1|S[*JFԮ<ɱ6)gd8q[GbF]_ŗW\1wd0uǎ ?fI2(v_H8f"7Im!BFK"N nﺣ]>ח"#>NJ\ w*эWWs3A><vMj.],Oʼ~$ Y;ǠMpkf|gxdlk|}Y璳Gt2;^ٚeq=< 8s7}%}H)W7߬z)7[CgxghX.uh]e+_7[k\gd|gڛ{>5{&qqIt =O߭| ;| *Ѿ>4zuJr4N;]YLgSwI1oJq{d d\F&sWߊ_BF0wo7MyK;;f?>_6.bA٫ms~ƭ ̷4wo_')^eo^<1?צNsHyqbR^qci:?hRrNer=xe\6aoTrtvւ߇uy1{l̗(ȵI͑Mӹ,}(qۖE[?x)-C&u>\b"DA_k.8ď2mc=a]7WM\~]P?Ol1^]>|?Њ3I{M&O ;0Iq}aFh{T{+2;~*< TIOc;Ŗ|TgIS0t L|9_[C&mǓ䫃 :<_cWۓ#7ڥ+H0pEt:Olk.nwϡd}N>G7}5틂N[ غ48M.־ϛ=%l2ߎQ9iHؚ/xg/HFAݑMeNk-Sf~k^B?lŸ?4uÎ-}ǿb_oqzxtIk5 ̂3~%guXco|i9_;~עg`/enpn]T$k8iKOc¾oGppO?+n:N5"b{P{.(~<zãe_qϱX}ybكOPr\?e@N]Y2u\՚\1Xp0pyCo9mWrm4_jl1 ~I=M>&D//WFPs|]nޙiޑ+טG tѴ^5&uNk|w.{i4|75<]1o>Xkvrɠ4c\}Oҳ]P_k4?¼;eo|Vx!ևY4cCC9ôG ={e&ʗc`S}adw+GyxoxK~DrU?b;+~(d07u.=^G[9jʯwy+ >)}ןd垥})WvהÞ]AK Yx}}=֥|UzC $ز/Kqxw;D_RtWo9-"NkK0ρD28~czڧOk|^P_gz:׈8/;,:}SYlW1绊k ۖ }#OZ1;mkJ!Aa<,Z5-(+;ՙ #ɡxuuESe x ,u_vseiߨɦt(0^aW\]dZX8.'v, 2)wB΋tV]Mi+Ϟ^pa๟ lM%喘~d.} v>V-<:S|~um{wKzg.L+o_71d3PLf/o|نԕ${~x^Ulx&lЋ]ަt.O {mCq.ΰ?Mu5_~r=ac/:c=OKO/}3G7?C /*%QǴgq=̰MfK\?1r% !"CCƵn|~x/gF#k藡w`Ww`wWF5+߁ux. b\6 Dkdݮz:urGÙ2 tQOg߲JƗ,>yϘNc4C_^8z?RnrʶA{_!Chܷqkv6n7{s9wG9o%:/b pޯEw̆ hhM#s+˙ovQl{rk:,iNMcOpuo}xk#wWaxp@!ʘ_uW3S"cǏ~[l/]~X\D/>Rǎw\Ѿ1?Ҭ)Xλ9Ge6w#rq(ci8^̆;W 0٨!t)y vw'|drt75fTvo&uY~X>vXM}EGO+T7tVOx}px}W>/%Q||xigvWB,mE/Sڡ>e$s)"c$ۢ{ñWJ7u>Tr;sw$:N24pMuq{K ObRH>Ee֩ 1L^Ip_nL_t@39^zL6(nWqW`gl\9uU6[~Bسw,f#f@ *-|6ڭ#g^C.9_ְdIǩq4o[|E?u㷐K ah,UFN~j-*Ⲳ#֗]^yv=ezt-=6vT>Hgx,xBld'~ 7| uF v*Е/7ޔn?[A0hVVvRc|iOZq W)]}t7]1O [Gx,t:1XhɐNc,Ms΋spӁox_u}n$wdrwzK;",wxzvO~ܡ gmu)/ʧѧy~<ө *֢^{fEP,|o[?gS+֓lkQv.#?χ>NGdHr+>a}:h/ɇM"?1_Np ws"櫿mq(mL{5? fe[:4.k5gh-oqῊO2vg#EYn@1_6qš]y!Ztf_s9Ϋ+J7-vLhjb x^Nm/zzb۴|=߲'ONQ+D ]#ke !H(ALN.Lc7|b&9ٿ1N6dNn3Y0Ʒ/%Ouf wŃB_h=P|'+2'yM RC|,8h|~q2zF ?gE o8/i+8Y{7\z/sS_Ͻ'cgROtBB\;>$!wEϓ9z\^ eh ޖ?a=#e_u+Gܭٷv1f,'q4VwxtuC`]y#7L֬M0e P'%:E>~,[=2 0faS |ckpN7W,,64i$r̩Gߺ.cĚ 5V2YI .H5 9Od֖xI[vv?k[ WM#ă/&t'-*'.ә _;zld[KG| _oYmТH/Os_`+_9ͥK_&Aȵw:.;4F΁7kL/zIe/nc۠MA%+L2,3)lm3-[[G[ҜJ6l"yabWЃ:~|^=$>Q^˗w]?MGh.LNY 5߲]0]|ҡ̢{?b|Ԯq=;)>QηH61ZtkZ }u5K./'=^vt}]OFgy)wK|?l߶b=1_v2kFlrĭEAd apCm|S1kEUd˵)_mGzjku||#ϓxO|M/ jMbs K7ygϧ&7JT{s>c< +sXdm[k6^6[7o% .tLnS?|˗kkQ{E!{ Gz X|?vA٠女iWk9tY!шU|Noq);:Q?)ozυ G+"ow.S`nnvɜϹTmCcɃ ͟_z۸ yֶ1_rE{0VH;462lV.8/.tv|{ڇLjt7\jo?Vtv~/ vtR<dFxWx}}\wΞ6k[+ ʼe8#*3h/11Y2-3x 迏?wΞ$b<7{8czgc qeM3!Okt`]:~)1:# N^ [W5 J ~Az]u_v|meZ}罌t زiMi/wece{F~8^;l>!]<阠AK~qi?qE׋,ddpm,zJ>:?tR-O2l,8F ڻh幋zWjNg- !9]3-D!_گz|^ٟ"bԙVO>~ow}|Sd{8I@OnK~ dGk1:g"3>$ח^>}Ϭ'p/4m7O{>&C;x3DL#nx9{֍#~B~1F+< &+m=j?|NL;R8ִ4_PSz@G`ྀuȃwBƻs_PE] @;6ruJm8W.!9-}n)ef?Ce.ʬPVrRybl> _3 :hkJԘ}= w2^?3`X=LO^Fπ%X*({B,{_l }y.t[^!d8t.Wڸб@cڷia6[S%j<ްyiԏ)Cb\>"Oڧ%psoNs$lZ5c?oj1zQ葍 :\_-[LQ~t~gt:}y_O.st|S*Ƴ?3O3!\Ӻ-!_;U/yϥ`FsfAvwٙ-µz9w('FbcD5 H*& p1ilV&}&ΚuMGak5NVuOVs:.ʩ2z4ɜT-fҡesQ^L V2S\F}2yQҡM#kum>#^ suxcKf)۷}t5.htar%2tc ?sŹ2HU\?oHq5V՞OH?ȉk@۔ ظȓ|\g4A nXٺ"k}Mϡ4| ~pTy? %8qvXFU8)-|?y*H4tQ7_6/^ċJgws%ބG鯃ZmS1cс.'bq1~@t?p%ZZ' qߝCYКN7ڏ`~#?^Mi Y/7Y#afHVq_T tTfit^-.CF1%2rb_je-.#Ц Jl9'\Cй"K|ω֨{ ?pQ\:֜|X ̗U\}&ةsZC{K;2/k{ɷ:lrܻ!4]7tK|oĨKF5&%ON^ ] ts~W I\/D|U1LOA*p}lL3M6#q`2Arf`5zn}nl\틮n:~jߎun6qn?m9!X㲓\#}v)<73ef/^|h;6212Nn랭b]$o|5SCgpA1z,6U1:1=5?埿S}a]0{߼=A\DgC[Y3K~8];uN4:;$|_1P߬=zf/Ő˛kX?6ķωg-v|wx.PYvw;(oh'vƄ/m*isש=^]rڥU޷v'瓱zYOv9v2y#^^wb95[;JxY.` 0{7F|yÞlQXדt8FǼfוܶ3߇n^Z!2gN~\ֶΔ1ހs;/z8غ|w$oS`m߶ް/ÍQgב|m)oĺJ FL6(<>{7x];[eteKGOx6^)H<1,Z@X{#p1| N? vKwtz QsMwyS-ߐYȫo<\>wx!(v{!LyEw%q`ss|u:2 BW ڋ[F.@a2`dֲrgjis6]BEχ=DoƂlbo8x/ !d7Mj}% iF^ .ϟg-CoV~.C7O)G,^eoem%<eH:w^F=γ#ANb$WܣvKǏ3M;:nUW3dL{fo(g!#_Zϰ#-9Avf0T1\|]Kc֕kͷVG`sW >Q^[bسщ`Ű=*M^c v[X?x+p5m i n6uF(ƈڔoNS^-Ӟ t}9ǕR|ƗIw\˧ ֽ}{|:uio` Z49)(GiOsԗNUiw*Hy[dp46fBͻGx3ڐ/>ڿNu&olvI}ӵ24Edo#1KaƧqO}u7 u2}uS~]mtVS;:C}ۦ?v}ҷ/7]ԗ 1Z^gbkgFczzm(% :{7A߁~n86>GvUsg&k;8@)ts=oSo_~t,t];A? x: ؚs6y;-'g\{IOr9(C[b 9)wXHUnML2$țulbRѾ yq \`oI6%}H-d8klѯZvσ́=/FW{<.rv;{=))|'xP~3=/H4K wm>a#:WZ٩uS[q}c~]o# אLa_<9ސl+|,5.xcu׾N2",AW7-×i'؂Ƣkɞg-zײ\yYRd_-?cc1YX#΂\+~ #MI)XBl|Ί"V(zctL%}\گt_3pX3!(m[0zP^yp?~Ul)'!߫2r: t)FF?+K^^ac ހ.V9ͿY\ѧ>r_Io_HXO]]Lx?mS: pEkRL sNBWW1j#;)Αo_༠dCx1#[uW /r ifQ;u-D܏usẂ#n\Qb`|x[/p_C=7R1ƅo/ 5|OIK/lDeهmϯ>la@ܡwZ<ѣ<+.6edYƻ$K;X{>IQvxuWD@|Ǹ2]~x,K9u*c 6Vq {<t ޞbawh ;v[ GW`xZy?o ]ZtN߱FXH'@7:{!cWB5s71@ORa"ms$I]oZqq>+qyM zi5x{} [ߔ&og7d DVClm$?o'[< ѵtT*7Ph z:`V߿'V_7%m1RѢ/ d9i}*WC?QXuLYƺ=']{l6}\^sڋj[v e,pm%ܳ^dwjy_6n)>!+'X:|k/SmGY+F>uc9 cZ=2K{ӮS2U-Ћ?m^_ {i?ꐇ>\=P(6^ט^,һF`g@bP b{w3=ϙ+J^]_\io6Ψ .{7]6%:G@W,HC!M2kߘ>fgūAGki#}>O66GT> ;++9|I玮^/T7pCGK&kݮ)bYþni(?/?]}K7S\>ھ-\iWgy7t+ڳu&b u巌/eCjZ+s6uhNmSl<pF@ %٢iNG?خ ujj/~WNrcź?\~dž%;F} O=c;Ʒa^Ʈ{/ o~R?߲6|gNp~kᏢ]USS[=mHq\l*Oׁ>*'O1 vJ:e A]qӥOϩKgsQ&K!?/2[ԧcU@:.T'#q.㴋?W5 xmbp[߃11d[ ̄Zq]LMzCG)<6ocC3a X:O^=棛: AF!퍰5.aFki6=Z;~Ȫ޾MQo6yt۸Cm&m|^ |2 7O,Ho^>=/9o|;corw}YX 7/ݴs&Ps^|nC?rF*y=~mzou.:aU>d;=E}[f z gx[ҡ] 6F`g3x2f.lmOMgXkcOF·`c\'Cd*2 2ž(?s)9 F؛--lAGD[_uh4ʷa#AfA ':Vz!(llRe]V <^pk?#"3Lq5KNeOݾCrgirjq-p0>&Gx: yIkibkI{?'rk:tKښQc.Q7 OƸ@0Q2+c>|qu:a7ӆcoWKB{Fc;AeW4~g`.:wK'O]=X)M1M1_(]MEA ]bEY({LAY-/e9^.v^lÃbem6#*~ <1|ziopY^W{⺨/]NA/ oNBݽ M' 0ZC?uǾ`f nS5V:m]w爫cg8 ٩͎l_itD2A| h {;thXecݡ?uw\؀87=G;?9ix]S}ICU+?<{ۑW˻1l }1 ׃CgLCeSp)hz A>m,,+tzpX7倝)-tm51r@U(Y_lo N 4o잽}nk_}k.WYmLVx-xKqLO4 zbMiAg)0#!@&{#7kcK$:^t67uJj.ozBV珼?3~{O1 Iqq wVaN?ǹ5Mbۂf Nl*rFڃl_WIÊ];ɇʞ[#pZGS`wN+ocNZ} CGMƶfHԞY+{3?wnF uiG:j48??u|\ϑ8{jL-t2wY]Gc;k9d |y^vi}>_>mvKuD{X8x>%5 ]߄X?ACoׯޠƹ]ۑA t;w큖\|ms=A#k-D/#^n^s*\wE> ;vk8l|5FėBi~.n6>Zg5) ^9{15|yЄًz:n5{K:?`Zg FCƸf!I6Z&촹ݵCmlk6nǴwn{1vEp\S @ٍ#M!7ǽ$R OjߎeMd=g&6oX}p<ӦsEy*N4H G*fU}aO|>K_&q߅O5?ve٧=*ѓ v dë'=G,<}Qo=x<"ՔF3ZD '`#53CRģ8YvBa|FkZrTc[Ӥ<߸K)&#/pdB9J^FL2w+0`&O]=p|[|=?N!52*jrYh*< _|{i2 SLCn${qM {й.cۛo-cө~'%/+a|,]1 Q7c^XO QGOy';lh xS?+}Bф0>k9@{|M?r\)Dt:i71CtxIoc_fϗsu^yMub</Υ_K}y>y߉y!xnPW>:JNpN_GSO..|V#Am=7,]kϊwql{.֞AJbEF>G2VSyX4x_J5334~o vf?LJSIA6m-hC#ʭyz9أ%PGFtfϚΣgu> (ЭN_=Z.?Va>NÃ+u6چMЫO/W<6ٱ E'cLɜϿ5_~k?ӲsC.m82 O# @lEإVl770hc%=TdnM28s5K @ K%s>BgiMS9 p[~pZ873.]nbjI ]g4= m]~+~_Fd]{'i|g-=x|XlxVS A+mH?1;pWs8c'A61^)}n9Ȟ/]Y=Sť3XJ։4z \1kA=]F*]Mu6&5C⎃ N>U~|_ҡ/@k2ȷCzY|'g {B:h۞cMK_"b"=9M}ǀ֊Sew#/tGGϙӥׄf{iw{M~f3K"%+ /B.#,mᆭcA_c|B_,XRG;MQc~Nn>inRek }|iMÇ5,&]O6u󻼯3xh'ym^_l0ҹek ]wWvˏK.34Fk_" MtF'BO}+3(ܭAq*䭫DX~7Y8+>O\g=qsꁃ#n Oر58 .j0yP,NH5~ˬup qLrO>#ive׎seki*; 6t./Z1M|o췝҆ĴizyŃw[=C[xC^].ڏ~(>;\Myp\P @fgE)*gnj59}VY_mwˢ=5C6#[o2·dqX}Zk nܮvmj.p.]k4J; 0yI>myve6LlG:Ã<.6I`}PwWǙˊ> |gAwvT)Oѯ錾v#e6.Z胿f;|Vk{t-zϬ,~ AwobS#<ń  4ߎpD϶$ES`oK2KB:>foI7~7WFcBW1+&|;oHun2>_!מ v |ȶJŭər4ྱo;s˰-akt>S}ca~c]kh߷4rvBv|ɤu5%7nJ1.ɏB|,m>86{I?;!`ؗ.J>駼7>6e4ҧ3|6jm|-I kMijQzysA?/׾%Ù؂d1cl/F7<>ď+N`Q|< M,ΡVQ%&(2o׮oZG`xzQ1ܒAEg,d^=+gP&sX ?yѾ"nW;ӪGtWfG1pDDd]I`;-/g|V{wsxWr;kȿL/Ee>\]wf|^cˢMvtWߦ/yEZL@5oeVpV[ m=yw=s';'㇤︥)m΂ BgwyV'Gz\ ^Gغ"}a Π)1k,}j+o}33^~\Ͻ|pG~[XTq ye㟧^~|vzrcx#l󳱏{h3iq8oľ\\׵JF0=/1򾥼_{7>fSZclm[NgS[sדgsyJVd bڤښ.lQ:짍kf҅g!'owf_'r['Hb=c NHkBG3Ҟ %XMiUʃ?jE☁#Y9 tQї-HuZZ/ YSYӳ_ڪ Extv}=/\M9 ~CONW2;cX/֭o~r;m==4ϓUL9k8ϲ}/CGxf:.?y"1Q /ޔjmHGtsw{. Wh˚Gq}mIßR:8쵗;)v=#yA3si}m\֛}}ob3s'5?uYwƆM|/ʗobb mXPoz7o:-/==c_<}5z vd,F: Y}^kN:wX; p{WMߗ"盺]ɏ@u3V Ec|>i4owB1cc3Wߞ&Y R+%ȇV7ScUM ݁O^׍{l{>ddp=]lTS.)s9Q>!Т͢nn;!}Ǹp ΂G?1~lxGyhޗ ׀*TXߵBDw;FORqlY n{k?W=_>wRYo?9ǧOƧW5>E_j|ڟTb/?nl }~W "~o8O~jgRo~^>Z+Oosp3ۯ߁K]M8+UW5>E?OG&73Q/xڄ౏6 _,;kA]sjp?l x>%M<BX٠8}ڣҦ.b':m^d+ֈ!~bO|_?W=;gp?_Ň'Ibc=صo5kK?ߔnE} ɗs)# nw'm?DV^gpvݷ~>4cy=z޸~[en/a݃bއmTM.ȧi?ȷ m=_|9Gᝠ=jsU|FRG={x(K9cz̓lm99ؼn;ܩI?Rܪ =vt%g4X_kϩw%3ǀcGwJ^F.ͷ}+=y]p =̙Fu~= ~-\GeHs35dA=g?tG{=79 fԡ${֒WteNk= IǻJpGO|Yoq ·O0W2bZqpbp]ߎau2eoĭ=7a ?<~7aߚ2.b6'}7Yt{n8'-\KVgѐ}Y+BN7%b6 1 ۯWpx:{oN9X㡉+ě?T1dFo=&q϶]׃$kGq~\X08sٞ )|2t_L0Gw3] _q3tOER֦ѯ^.j0)&)|sҥ(iRŵos4ތ.>\wftXl8IogߓX=JrOg^>ߞF.~wOſ1Q_=-~ʓv[O}SN[2jwv)oACW36'o\vD6&Gm^?O>`ީW^)\EWkmSw֞+%ߥ_] G%Ssiʟ̥M//3#|b.E}AT聍Ϙލ]N>bƣ?fmz{FiIGЫ._y8sG8t3͌n7_ʌsֻk7G5w5^WlsҌ#ȾB O: >4\뉻Qxa=%U-rpͭ\&m/e={R'G=atkqw`1~֮t؟fav5o ӭH9j\]{؋=ryGI7vhSD؅l9n"4 VG>T_>|=hБN~;\;r72g|2Zv'm;smڥ|׮ȇZ׈BnVv_skkyxo-_qYqeFxw_\kȵyAU\ Zs0ugeG660薭#9%aˀkp41&,6Vb»k{ҽ=u }J6_F7l4mD煜hTeEatfw.~u7ò+sǸ.{#.c+K^nKu߽ ?sl$:m] " ϠB<37Do E[*:|ͦQ[M .+#>835]xdz:aA>J jŏlԷ?K)L mV}&y.kpݰ6Cuֵu8Wnκ}}qE|'k|n|ɬ3mer`Vbc{r3@@{L.C1-=1Z?oO/>+hW3ڮ8Om6 n3b'@n[n .WA+OѝJv+l1< 1=uf;]v/u'=~C˨oAw}w}%}FO.FV?x !/k_N+e L<:{˃ )&/vxN#y-Ћs#x :=g|C/ ,0iƊ66VC_Ȃ$݅ ?_R155^E!tW}c;ġ%ȥeb vYyU~=)ϯ-Uߴ<8xCQ/|񃛕TOeu-O.*wrl ++)tVg/2%/`(rKe: >AqP; otIRjlfjkSnC#DZ x֘6\05Fg1C8N]ҏ|ϓW`Ug&0 zWw|Zn({ ї ^: ݞtMy"pg)Ii8jZ:3/AMu!ߘ/E\:cљ1[E `a\^&>U=^^5wN+O^c?B~X0^{*ah؆͛#÷=%~phx2g4= A⛱kY'Er|/~c4mG6: 6Z>26+Z(AW}l|ǂ*`o|u6|L/k u/zu-+M0/=ȿSkʞ#yW>dI6>ѹE,Ϟ>)?3C.Л@wx} gJ[_mk~yh }<<4}yel΍r'w7ϊ)$$'t]9vIqmi=+4#יC/s`VvWgpyS;Kҳv O,#ms1_Nӏu۳Lv+/d+ nsJk4\:ߎʙ 0Ǹ/#twj/PzjWx dOڨmdzԍxنdlώ}>巺` 㷄1V-k[92gU9:u2usgkak@0Wyn0Yc/~7w̃9|A&^ͱƓGCc))fa?ז7K{;'6iVp;(΅ni4K$m<eM :7V3lպF6;UUˡXnBS%y佐K\(dϵ5Amn71;˟~A'7cn<$M~q݈'@&u:bWgó~Ƈ|D|h$ ?SBG>4q4G~72FYw^I_u -1٬)';1Nw\P+?{_`$Y8>_k9U}ȧlOx|Boxma2-{ϩb#|4ӌc㚈i/LVo"܏J+HzzQPG/&c$~-μu˫%FGS}ݴ> -)uS9'"ME:l:f]l!\cJp_oʍ>\#Ώ/1&ˡ7}~oŸsbK{OXlB16v~]6n8}skxx4uL6:A!Y1Oey'$oJgsq?I4|ɯ"M9+b;\xz^êP 4_w"V䗽_eN8<13ɖ`'pOzZ~M톳="2>~".<9 ߢC1+_Fko 2{$ lh:'5x~YYzVMvc7CIS`27Blvo0% [İt(Y|q?$}Oσ~ "sa'?ZWM#<̇MuߥͷjlXCg?/:'6cc \1){K# 5:~O@[>2'tnRP<v%)-.ڭFQ;ߋD2|IͲ1R\͒dcr8p~gC0~ٞMW||2"Ot6ا6)PpAEg >}dw]cj`z3g'©xp!~6giKCOmY<̔tQGH+y[aZg4L `+-͌_4] ?V/L\b_¯ə$a{+2v9vmϓhY9@p}'@+CO<3~NObxZ񓌇{?Sq5:=|/Vu q<~ MEw>2ޑ_@f;>ƮW؞Y<ϾngFe&ާ{ac7-=oͻmyhԒ'W?25o䲄 e{·dr 2c^~/V>Wl0Vʸ"KZy]"KZtoA6}MsϿ}ƾ&6:=}~ݭlRPD @ɷt;UeeXV7XU햕-,-9]x37 =\V^8ͯ|?c&2~g#*csbȗ //:{PKǺ~ D^ K"$x=xwUKbeӱYAa?HOA0=HO/_295ţVLvp݃~_`kFq?'{Z>`B7̼M_e{_ 5^lLo] (q֊4C7-)󽓥ظw(9aӊp|'\G)uN?$} ~7vMDz 7-C|Ygv0iO[mb?pmt8k6?> 6~ҙK 8?|^y6w0xE}_3_{ EK|yB{:gautx֖4zY_ [kw^S_q~ δ8e7?Y9k{2C*eϺ7ޟ<8Co')~:O OYgZgV;5Ű ~5~5_s"EMP,of<]6r)k;V| /[yrd,xܪWzDtC1ck}vbߗK\^_ \j8R` NVl\6飍.#m/%pߣ+urpe7e_Q~@{uX ^e ;44Cc{3W<(5e&ٓ5c2l;f2=lp߫s%# V=2C0~zC7d;Z_p.(q};?qD![5-~|v}at^TCwp@|SCuXOw̤7vC6sd΃/Y7^ : _Hi?C~~T!9X ~:~+.|?|%6ފ|F_`8^AwjaLh|~! 1ށ}هv;!q n6FOOI ~.Cׯ׏JK4^`2/Ç*VpsxO&([e>(WϢ; u}(oۄoI?p}87%w?2jp[O+4H}@~bm(>lw|Zr:㻏}Sm}_kOYq_#|<:{u^ce}n:/?wuf[~W.:ϾۥMKn ;ƔCao@ y-&W6[yx0@#3]?`2LK|r޺OQnuCM ~щvAl)&*´CrG\n.}|;{f <6dxZټmtz*'^@r'd;gFbsן\ܦ󔾴:;خ/=P1V>&sA@C1!\I|qW7 1]T^m£"؏m:^!o|smm,5sYWotK~.a1&Myo\sp8- LՐMK x+׭WG1Q?W06>5u`h=ópטl+:-XV[!ek?'FW8%5y`p;.F΢LD-痝ǫvL=㽈Iy1l1LJuP+_|v)ҏJuwe." ?"C O=L W 6zqY;,şad/GK ý %F(=Aal?a9Sk[- vqòm'6KyK\0)vݺG{ki: % #p<#gxAb04`kb˚ '?\hn[/ؤ(z֣] ծ;w\%O,L:cj{_q!Oqj5W4{l}qE: &Z!||:af'Xw5 m읺yёh.\x$β$|:󱠻.%`D*Mh bt;l{Qb:3 ĭȊaxOx |N6Wrړ*:RHh9>!eG -wn/c +{p|?]o{?=7W9_/ǯgjpw=h/.5^m >gΧ8Wfk~Hi2)yel]/栻C1B/?ts<ǀ{l;er_Gϡiń2|"~KAШc~0oZߊf:Q. Bg;눶zWR|rdVblzǘ]?|uУd&O$F)+6z8x1qmA(DZ +`;|gˋ\ʚ2xe$uclGK?7 xlzdtT{|GR: u>{{A;Gεvƺvի '`\߇k2C KK Ws7`ru蝑r>h7moxxxSbulŻt),~Y:nx+5kǧ5{Kl_?xIV+1|AY{{DoRbKSrxG[9U:g~'݉a{$Kؠo}3F<̂A;}gt3+YdR/?WdeF_8—M䫴뢉|Ë pkXm} @;fj/#N}HϾwg>fiϫ/  ZIcĶ:k|{1i_9>s8E{.eͺ+Ox'vqgse _ғOWeRj6ry5[طR6 qɜS6\#qb\GSyP#p|.i_s(2t> 9-X|jV莉0vDOx{ŮK˘o"; `^曾Elm'2Oz/-c|ҥ=]+ϵR{ͫ'kGτi~f8IѧwY%seyM<e AwEw%ەp¾}Pg yL 8?k?sQqc{!3#n&w BrG~[,x,u]cY/5sˌ5삯^e~n+f(T!Fh'<1:xu_ F*l|L`ІW~J֎Szㅱ֕?nb+3\] [gƿ%%[,y+?t pv۷׌ui3~'1c~(8tӱ?A~@^#B,7Z%&H[.h[{nSg춖d[Bh7>-?mtKdq_{oeسa2zr5({B.}[}Rd.e7 \r }FCWpپ3_ ;DnNmWűxkzAnO]ˋi݋BFs+ayq5?~ڞFs#;ۖůg2kg8u39}:3. e_\ψ܋>`lHO^A1?~׻&?B_x8Ad8p1/Dd(Ţ(_۬-n`lI?#:6WZSR )Aw` CֶeoyН ~^ءWSC665_ȟom-^ ^84 <u?c$MߵbW[ 尸X[Q|V]{<.5[߹W7w`OS'tPGWaC֏GSjMSch;_tA+[ a"6/p3>'摨c@š6M =ڿ35t&m_:4b>ם@cS|}+C'=QOc_fl:LhY;ˆ:zڅ-ѵQugQHW}P `J!>j/<,_Gvg|e-SUڭlYMB G 9ioy伸ѝ_ j|Ǧk^HnukKGK@ph|fk>A_¯7ю!WVWܮ N}tbCWF\R֬#?BbUNV]ٞ|jh\z!g el.8ߋυl 1-\^-xpzr΋Amౡ5謮4`4w~{ı~1ާc|8|#g|jFio:>K ΃C?ll]70/gq9L 8?#sӎg-=fG7)q]|qU1G6Y u)8=[;Es3zXGy?gupݹ6QlDR6l `2>V+OS xr8%/ՙzN muz0ৌoǃ?7Lob5^ŎgwJ/I?P#NmfWgB&<cwu bAj' ԥ-_vQU}љ.ӫ|.t)ק,{oGR.R[rb?hv n. s*[q>c}mJț\u#]v?EAӌ`xb[?>eu)C_f8 >e\+O~m1}ϝm:~QCK=ކV$[W%0c׫| -2.x=DE><>Xh3:hz=Odn__esYVZ;N{n-1,)r2S>'wjtn4hk6A{a6Tg .+9׿:8e|:.2ȀD 59(ାRh~sq͚Λח!_8$}78dot/;gJ;|٨78&_voO;?uM+tϤ"/mhQ$oro8o|2lf}N+ՂMW(?#?>fp"'k)߫iy;_ONU|ÆFs3f0Č@^ ߳R\ugsbӖlx `@cO<51zq_R\zN[#utREٷlُ[sA㭇L>\+ NU3v}[6{p0[q_KwgFGj!pIfc9X?{N~1g>(m.WB0zla߰RwI}^x|'49L>q߽߭=>9@ѱ^ vm$mk+{Dd|M2(Gº@ֺ!~yt$tvh$!ˆebd%'M=s{΋gg<{p6gtc39mc}ZBDZp~ z瓹 ixכAM||gKVx߸, _t` gkYgKO.P)#8Nnz3_qe Gx}lQ.=3wv W.n|C?5/CNwc'BΡ\ϐް'mH _7=q'g><lopߐq8bOSXj}~,zIVGѴ :brz7p|t^dgol ㌎ sm,Y卟G ȝ)vm]FY9YPwf.m5vH6yn qeOgi[7 ?^>.Y7}flm6=Vq/Mc -ry1{[\еAX]!8dLvsҺpyj8f"(5O1c9ouIMٿ$fZQQwZ?٣'i"2!|w9~#'`K}F>)Z$#_v%|V }wd oN xkǃЂfG oJ?Q>֑okA}'~3< z#aX }y'<ѾT"1l~׿J'a8_2 +z[m!Lc[_}N8l.\mj:>ݭeq}Ѿ0{7 oCk_;]:Mzn'lY?)N M_CwQF=K9|j3qܖguF87dgd!~d^A<8rοE6igGߟpc t)> |6K\S >ÖOsiY o Dg1]+mݏ7,_F̍w y{lJtNc'i%^;G;"YY_^v}1#'y>W\d#ֽb@D:xEq_z=-=jwT"}g2|=߇Egft٩gd yg.l\xQC'm ?sj;>.|ZnmϗwϓX/Uٞ/4}~}ˮQCg?IXQo̦\f<&?QYs\#>np6U.>gU{5H[#=F[q ?g[RcY˸N C4(V3;6VGZ)bJux_:ŜRނ%yŲTwV<+PIr75zm} :?tDt9yG|F o|Q쳚ݸg69 */ÑM';=)1L?~jS]]=\]_e~ <5K4:Р9 ~,}^Rk+>VEt5<öZ&DbLPQxR>]cyPO |WXJ?>tzwyzü6wCثK|ӬrA6g w\+z6?Yu|`r6@KV-?rjs =Źo;|xA|qn˰ zq:w+_!hCyYV"|Rb>?߿=_m|=M3dكqC҄)!'+R q(XOit*ܭ)};Þ'^{OIu([-r op#˗jL+.2۵}gjoT˓iىl>z h9JOtݾg—[io]gjR5 oFRtkKzO񽯆8/ugbڭ;κ5Vqap࿃W|>RY~mBGWȾY~UmoR^OZU6;^@*{!uCSQS:{)Gڗ~F{\?'? r.qQl=䏰j2h-z7CCv9MY&tWdZ:Cn }U\2oӯ;8?ykM0F8|%14Ne+_0{$4coeݞֽ`إq";}KWFOb8Y1&p;M&9V|ϋk-py㺗\_̟zU tiN!tpp&ybt' tG1m6{u5{M8e=vw ć1-41$\7[鷑u19̕=ࢭI|>ҿTԓPF'sGœOqk,{y`kgL ^-?zņ6V]=okߗ:z$Ytqtg5}"ʆ#G=_碀GOkMl`7@. =mK` r[?[imNϭn31Y.Fa^^lG˓NVrWEOc.:|W6i mN:&3rVջMRf!1r`.wZ#=9x{"Hvnv;Sp5S]EQ旞8F茷W_zF}^{a$FC6exC{ܝ*V+/ӽ<uJ8<=9^=DNnߏߧ^lO|գ]&]o~rhc5ӵ+wI|]㾲}L=^p: z{IK_ Wp#`Y_>yy \||D'J.ł>(6=7ʏ}ӿ1ڛ=Mw!>{-3Kpw!GϓuN[rL̠Whם!%#->S>'ȆҹOV>V#FkЯ 7gd1/I'\d{Zqt7lq~x-nt1m 1cxfh dRחW#1Wvwo?R啽H{ByY='4~#i_pRǤ[t&k>ѫװbװ4]9M~oSpMJv 㹝yM]?ozkUEɟomm*Vs ?Y/xl#ɟ/>+/MN359=~1İ(֖f{yyċGNzg:YCvw~x]tWC3sOm՞i[ zo?ϱ8{[EneU?t7Z0v}9(~#2[=V}3d6f>`&ctC?{V_w- ogź8YK1]6 #~)}'g_AKanpaC{=_RlUmMW`i>|"CSq3Oz&9/ǵ}X/"//t 2E)C?$`1#y!5w~dKNonF-VXʆ~G8׃d.7ve:}⬏c 5zkێcb9|hcX9w`;(D~^ LV Iz=ȎPëe7kɦ齎ce3gg;o  |AGX,o3);gxcż;:iv٬=` gh̪EbV-?'SWIS3Nt'=~Y!8 L#z .FwKll?}fzĆ w+d + t117|km~9*+K&\3tI.*jxM|[#QVu+Vm>LP,5YxdcSf#L.צ[cyrxGu4B=HѸ^Pzc0:Ǒ{yF9BW:×yyl?~e.sF}cǾkfOy]~6.qc8#]=Gn=5Ug"k71|Cť#>.Wrz$TrQ!}Np'xp3OowxY<\ޑ<ل軰 NLl;9 "E3 KiZf}\AwO>/'~-)""s鼌|sd110gy}6l8Uǽ>;<=1wlӽOE#}+ixXOƓuϴKi|{bk@v\Z:ϴGD\g#xA:쯞NoKC>~Yu+;6Zh兴Ŀ< :i<%%5ʒ^>Nd^鎳sOLvxxL]ߧPxZeyEyGhk3b'4y\=,;"[~Խ4:Nvqvb>tSi.Ws:'7};<th{ L93Q1ll>\~t _|CY>yp: ,|+ -@wk4\<M 9 \\Xp:o;jOLs;+90 9)돱Um9>V.Ӯl] h ~*6q8^.=Woi|][>t@v$=1GW.N*'tYiÏA~l*N/g_!x}:Nfk:FL:l έp)4[>;[7&7"6t&.?&zkkvhq]cF_`t@1vq:uþ?T<q3'_'G=B\3?d0:4~H}IoCEVѹߚcr(LlWz33ϚǷ1ys8GoOāEJTCÉ-.[{ߛ~!u=;ϚܞSybs[zB|`ͷ^KMk/ϷrN=~z}i|L,6xIJ_srzߧgO?ى:. ~b2[q%JKOg.7PCb=ˌ7:7 0GU:v0kd;ӝ%NtƞP/GgY=O2Ji1>e Z)kXvic>XZu.g=ZE_O8d㷡Zk&rd[_]G۳vo_g}?}gIGϤXn_1ge?gF%8LX#mͬƮ-ܻ{J/ϷҊu?ACG" (֠)/>0t XKM_qx+@]!S 򛮄NwKE8$ȶՖfN)u:鉾nX{GwF`Kazϻk{qO }[H_*ʛ$[`ldmioѾQA\adK\ZKG  Y|3M:7MƐGkk)M)5?m1e0*Ǡg>dϻ@bBuۦe%{I7?ݼt5~c͜`3Yi{U}OL9v#l]ۻ?73⺷ VnGm0SZDvV{`mo/۩N:g\mI?+NU:=1{h7>L1#X:sG'Dl ~?בWEWO~cp j@:D`G܁8Vwy{ޯg?)1G[߯\+/ݞ4\Zxt6za=n/JW>z$l&8o(Y?`qWhȌ<츃u_}IN?ek^= dH|z}{%e"S <+M<זG5y/hݕ 0Y.[=zڮy{Ql<8Y\#hAAZ]ݬ({A.1/ڥ;W_xUgݲo[{xO췆b2IRXo<.ayH_ )?QfESwF<Չ5#nz{ߌe[f Q0:_S F ^cRpyf2ł,?{5Hք-moI_HWM ^Ͳh [Y'|9WVI^?U~#K?Yzm>6d`˃CW{E-{b|;>A5> .i-7 q/tLj+Cs#H{ݙ~H6V;3^}:c%H݂출yǣf[_҇Aλ&8NCfz7Lp/UdOCfCat)Îh\x /pOl|t:rn+-{K>vxJuf>Nkl겄:(n36Cht+_}}>MdKuM1"^6w͔ea[>o':i 8 ,D:!{y]^>GWڹ(WrW:Ua}$`F]sO St6;gS;/)^u܇\`"kO͜6S}p_:kR;'u;=צxƾwyU<>񝘿t;춶϶Fݕ=yrw&ٸfAmt]mk9y=_yiN+4k\_9spFgi e>]g% d7d߲CΕjA1e4|:)ry6>]g ?+~7xFﵞqtjQCҞWB{Uz ?l)7`kkI1ɌP_$dr\kz>PO8M[Vfά-ʆ[k-><{~{o6.07G[4Wf -s7E1 S[^w ;ǩ#JoOx 5tNNAgP#6C1p?;yt }?Vލ˥[=>wխ_HЙEzyOI{zE+_cl֮b{ioC賍ן]B/>᬴x{GO;/LSq|(w1XS5(^QVهnP~~pY8#Sݑ=X\%aޏW fݲu]{ݎne}k]Ƨ<7>ў':Tȣx?WNãwtНBSd[+J*z>\zYO -/ՌA^z1o>d2 bGOž*+duT,Xi·Bmڐ?4 ~ nk%oo>1sfG?Q6oFv9_+ ^/m.eKv)5"nwXxt-?.lֳL7g0E }>LV'IR#GO :3'b_8cdY;+V=!_w+;oٸ=z.mk|nmd=c; ֙t=b5}&}[x|ƅdֶ|cgZVj>p2Sogٺf1cl.N\/H<x|[SWǂ`yǿzW_E|X&k(jX? K~g٭-\-zޖri]Dۢ|)2 eo+8Ϭ3{?יoÑ}b% \KaߨDW.=6 e_2:CLO]8i0.bX%Z:KݔuAgR%W}?~:ԍGFx~ʿ?aC6mu.Mo[>:3_{Jէrepv k ɍ'F)ѓq g9+ne/WqN wi]ʺի(fuQs Ꮟ=Gs?T^An|Y$Y!Uz.~?K_/[,Av N) OҶVqX pxc|gђ6k|Qw~{@Yw. ܳn#j0GE8Od䣐QYM2(v<՚fanظߺQ~|g:$;w8CNxPӦn\ו?v|̹x,u8GVwDM"4e +K򁗏{mk2l >L6DNogJg-!?BZ5, nRF"3#~}tjQ6e no>[!$WFT>-zt5pqXW]i4zu?7ywck_ 3b>oC|  #C{^FG[Ϝb75D7)[KR֬.e v`zohQQ/Y%P,e)6Agd#\\Bކ3kxjtclIm&)=_U6ƃ1̓Ȃ#ih<6gF3SYJe bZ'kxb'r&9cNԍ‡{ݑa,~.]uѭ.v>Oı9~Wm},<-g[ȑ}?lGOJ`꯯>s`OizlVZ[I} *?S^^zeK>D:[6R; b+W@8qLj'={N )V1|񸺻{cA( 5.xG$wS3}V!^d}SJi =F1kytFm-s+59t o< 1rCff=+b87];o}?loD`2|#Y̠~Tz2[+YT}Mz\Ev叏;U_8iuf86}W'LĿ'ܴ6)y/k]LxS>*3u3 c߫.U33 -z'hIS!/?UW|v!d-m΂7/w bgx!df([:7i [Ϻ?"W&j>O_ѹLeGMit".o&3^·^{|wc[r{ 9{t~ W=2tn9Ѝ~EN[Qx!3:u=Ѓol=:_wաuJtgogS_~CwJBzVݣ3[н5G?K|Y~]ޑ+--=j;8-/Nr mf'XK`T3k"ƆL/ g/>=Lﳶ#yd{b޶ =D}?Th6xp ˻Wm*`Xo+ Q?Rw:%#ulu&XKv󔲋:Hxn\KX$o<t\3.|w)v<-G"BB:A8l>sd+@t\E9Y1;xZh;~{Ð3+EFgцok(gm!3}}uԧ\F _l]$6GlJp{.A=`q11f#\:4dٍ_z:i!ktvEWݻVv/vcj$rcݳ~_w|gg}5_͘ںjk}b'>̌|١wEֳz ىŊlҞb PCV>~=dz+hz->zӝ6Oo אo.ɥs0Ѓ^l+D 3o?qށEf1n_uCsLNyc`2nQ5{>UdmM1SWbV&8wwtK:Ufr̡0wT7ܶ0WRrl ?+]4<1ߕ?cc˶+Mt|B4f}-poAwۛ?Ѿ߂PŊڬu>}Ͷ}988~z&XAg]6?,bc!dȔG]G᳆U%3|!/ _C~_g~G^.)/KϪ.+˯j<>-WAWvfq}C?Zqס|59`?x(y]+F*KVe6n0wZA k@~IQ[KΦzsYgC;ocͰ~kNi{_:Sd ,iX[vU4ۑtn>U!HoUޗQQá}H[sSG96W햹ۚmy89M[#ce|F$tՊ2c]v=j/9Ͼbw/micSߓ]Q]BCF-O ignu:|tѣf/\Xv[(o _Oqxg&w]o?*|:4t/|/ksy_}Cg& <(;e|u. ~Š&Ceࠃg!G}v=,߈]ŕ/4nVjG읩ɧɽqtʲp drs}[н3{nekK]!|-Feۣ.e'v);K=gxhg!>t_OX̱aűٿ9 owOm]/#}:H߫)6oIg JxSv>V2Q5_\l=+ޡsdPunFуyE_jtfpN0;\rzwam;Ŏw(xϷ;H== :Cqsh8K\0p}YT ڵ3}:1w`ߠ&@>ݢь!8K}7#_O$ I,| 9ab ?* 㯸 ,1MD5<}?Β6CӃ%6ѓ? _Ƀ59,k‚7+==>8`/NJ2Ť9;Koz;j=;¢;Too, Nmy8t zj /k9ӳwgGX~4P6[[r=SS:-'+پ{=?tΨfkvH;#}^, 1|.CSG;83c/yۻ7rb:<7tv[:&>5hac[@a״3̳:P셯qW3<㕲X˚2h}Kf< z숧i-s.;'}Az ɑYwJY7ݣDvdm= 90Xwgk:7ο*uWCbh<{[lDZ38};䫍a&[ٺ3rhf~Xqo|iSWb|dܳDr设qtOqLDXWx;HBh <)tg}'| IbԻ'7#k3_\ޖ%yNȚ6^%96eEW`4z6V~a KDa`>QH,o;ɻ5Gt0Ǹ> 4ӂX~+~y1/).nt*?{yg]ܥ[\M~"~ߝ]QvGcu8'E9KyG@㌗&G `9ύA39>ꢻ*Ka\7E+-ۤկ%; |vr~̧^D㗉e!_bKHŞ3&&?F Ndnt{'-]_oad~|i_VK'YFtN^v<4'GU_2kAyȑ˕#yY`\91oB 4-~v+ǮzrVɮmw; )ppt9O"{8ۏEf6YOwGvwWS> ՑOuΉAct(ȗoZǥ,YzWדRUjy{{C G!  0oaJ)i]kVsa g<2W ?Plp9p8&5 [?t!7"磟-Y6祡uItoޔ%}4^Z6\:~?tYKiݯ˫#V}, j :tL٧,>X.lC3Á|_ġ@mL nF =VzgUo$ AVN1mߕ>_{#&73{z /rp 3T YoxdF xulM 2Njwv?О"zB{C뙘ˊ遞o6l.7pU13i1# ee,+8&bxa|em_&M,\:]K#;1 4v!@:}"> #|㠷]+~}SryI><;F&{;,oΰ(n'aV"Xwj!mrζlĨx^nL1Jj}}[4_1 :y{9|z(_wB]tw35Ӻa|€eOp^Lv3<,?_`W4 p)aAzͺspri듾^C{ϋk5WW]? S?=牿$yʿS^xڿHyE9Oחm}8>]:'kƱ2\O)Cw{|0QXSSߑ]>»ΧV_s鷫_$ u>O[4MG:6s=5̑,>3FC?l~6FQ v4^dܻ)7\Vg /tn/kKrp~M9o'B r'x%.B6?T}-•}O`\;{R V.~Ew%}%tݭeb$ˆ]i9ഁ=F|xxoC}YC+=^_ ^:ubt0?lkC(%s۠_xy6ɂmΉdcV?2x\F{gy")ql^ =9>Dvah0:Sa/(okP+}Iy0>TSC~mD ;ktm GK#ףk>&ۋ\Yܰ+}*q I񅀿CW ?Y,1:)|tO(2blFe[׬y8`J=#y޿xZ:`IJO<oc֗V5_ ge}ɽ+_WmZ䋴BgI[{{vqx[6"QC_A']q24U{pW3ym67S «zk&.UEhyք}\}ϲl&Na狠8ϟem#<bmj{ѷ}CS3>sVo}ѶvWnt] װlVx>-d ElyuQ-^-G_vSS˔R>ێ,}[kaw HYvχrZ5 ]oe{T^.?يbl╭g dMAsk sgQw+kkkp}4IgI92ًyls$5 ~x.c:aX3F|q|Oa›̺N{p|;:W[udd:ꎮ.9w&\Q\6>}>Ι3I?Sf:W$vtQE;ѳa3BK1eMrI}Ot8}!on2,4}/8dEaߞo#}]8-U[CM`³i\w *`SGhLE[)mM napO3}8+;y,>q5|ٮB{M6~1n뚇.0m3ra֧h\.X/\+ -cg6lh ~`zQ`LlWX ߥ-Q}+:=lϹ~f{)Ewh A߮ :;1qV~yzw\n׾Y{[fo:>n-@AOd3}7|8U!s-x{IN˨Ajr@*WhacUKһ۟ hF;5XΤ%m}- {x5[Z_||IҁQ]Gc#mL 3-?xdeϒߏcLy~l\/g g͉il(~6Fb66Y[>K *Gxj§AX/W8qoyk|u3d a w]>trb[mI։U8!zm/ g60zS72/S#O2)ZF3M/Bο<1恻GEƋJw겄o ݄:WTWؒn A|Ξ+/xaV5!]s4B׹8)X0Y/WN/)h +,+Z`##6%m*6;Ʒ1h 򗔞szUd{MJ9.L_w88ql mh,\/MGg?=MkχuE!rޞy6<g7ǟ:/bi#,?6>D>"_Kʦ2GbpG,c N;Rv_?d}~+ah}w{|K9:/ XuN=c{0oV׺^c&ߵ}]\Ώ 9d=Skt?=Jcn~5 _>#Y.Nx(?4R| N4?0w.zme븎7~h!usAOxy?1jx&eeO^͢f#]/s}M±syW=;|fqfo+o/?5>k{ʞ_~ߍh}xᱍYaK\?xkWM&Mjןw?cgئKTӭ l~j{4=ԥ?3 |g7>ƨ=ȭG`>ʰk~7M5>"Agߓ*H~n7c/M i7ir7r<~%ȔY6g^>qm{| OÞؘ/7 46JygEwAV@E=\-h- Yϧ[ʧLyGAg3+P1w;-eե6?$_xlޭs#Կm?z]{矱6WqAGSz2hV ~GUM ھ6amovtigV;:#Vю|UfF.cѧC-8dƿM|;|UC_n>+N4ht]x _qC>N1oi?JLOϴщ4Q~|߂=o)ҟb׻6]b?ʼKHy;H_ϛmX`W&ˤƷɞq?+F/ ޢ{}k{}^~ ΃t[7;# $&p\ *'fOכN|IUp k㍂|sShAFrhukF_O63zxblZ6vc0>Gp E7~[8C7atn}S{~{|gϳg|7$&u-?5,m%5{ƾ}"x|/F8gE^_ka{ן䷺xәC>>.=9`u \rR+:=-;C|BzB/}c݌Ǿ6u?B ^o=*j7ʌﰶн[[,KHu?6>:ўYwBaJ1GɷyaZ d_ #̉mδpg/ݭ n0Zc;,HNfֿ63χ=ܗѿW6:'v܎믕+v_y݊rX;{]p7<\N@gekq\r-#w6|b{a+BZ}z{VF15=AW15/x>|?מoyM |q.>Й't ,{5 6!x)nϵb->UB{Bߧ0z%iV)ޭSqScp?Aʲ{ ejbH)mxC }VYpC_]y 7N6I60\\N|mEѶѵ_~YWqF[w,e11a/x`7iYtc%y*3Sgbq_sv'LjtC!d?6\19|>4_cfj}HΥ+~Gpߥ=H8u_Ol6{^+ QǾ_De_ߥ}[~){#o; s?nUBK<:98DkF_[gݓ ٸƐSlUGKݮX/]>1Ofܥ]~գGy}~2nȷ|mO ߹66l!zXtI -mF;|:Ń8:H_񼣯롁[Mr}GYgdn^>D[%uo^^Y❔>vyҺw /| KSXG~?}b@ T]jm2.;}L6}=b!rotcmuδ#~:pMhx)JOn-ivǃ\9w{,`0R>-VQwVoyguNU+Bd,yY9No=K^Sg!y?m\6asyRWp?%^ep|˶ϙi'1koqfHwL6wގFO?oaT>? aӽ\n6ˆ xUHwOXѥfB;i{4;忣7+ 2n4 c;>l%gjнt>QNؼ+< ?:癬ZO8|s89׽ź;95sɷcz8'Ue|{A Q]ټ5f[mF084䎼Y臑qE?.3z.T|4{jg?<1NG^G+5kYBV:aLoH_:c On{vٟc_uq=7>}_ϸpqzA79뙜ęX#NN ⌽h?gw浩16ǭg Y|_(䮂1Y1Gv&ϻm~>g͊p5 W؀/`.m||?zNm=&^߃h]$ٞ/ةPlAD\. d5euC܎dbS+G66wCx;I㐍=Fg ER/߈|-x*{^65dmG{ײ=_:R|gX._*cu=fX 0: WigK _1 i|d[u'js8/{ύ&kp>89r3},5c~cFh+w p=0YXs+A_c gpiu׬{diɽC лmjgf{3^Ho=>>ڙ}(=LǪF3l6uwhsΙfgfW`w6C,b=|5A1&`˰zF%9\>%0["NE+:3te-5cs{Tkkt0Zb6<;)Nh3Sd([R63y%mtuJg)QL䕼Oz2hɜdAAjUÊ7{v93#-WC1+x|,Y#i%qW6QK=?wd(9zc}ug{X_^^pt ߒy׬|A6 ~s_j8jq#%?f|ELekFQ?otU>6#Ϥ俢<oƮ}M=)mÏ=?%+nF<輌5luiw{(Mw/]&KO^n+d>{9Clu:cuZg>Nbosނ%=8KE4I[Z:KL Jr8k 0ZH[牽[T>{`}dXmα"\Hyܝ*"]_i?b ?=?];l0Oܿ&L}5SsfYqJtc6RC=G\Om?loI矑?==g }4cȾ0N>LEZpK/d&N7 2k;E.Pܷ6ɺ}qSc٧Sdq{"oxv6Ϊ :gsٱKz4^1I^*f7'|- V_-/S[PRbpåCD|w!5O˦o1ʹf 8ݔ?Ft^i9.Gxw-י aw̧-$49a6f}Q6ry.mPCUnN᝾>W[IAǴk8ts p8lZ]Y%+qm}=btwg_|^ ?oqnt<^olFwݬfvr{ ]Ig=OFf%rLo1=V&芰9I.u^~ψ_дശ,e7v/~TOCi|8p_[i٨oyۚ^ l2[e Y w; =;Y7w'*&sþ73stWVXFײk?>XgZ?2- yS/+sb<”cUABw۾ӽ ӺjlCi4^X~IٳD>:<Y=v7IkÛ}NFb1=?l}tTrmvJX:HV ͺs&]xL䷕}qs4v|,vK aUU(Gn,]++ֻz%}̚鎻SJ?9~&d8! ñt8++?KVj4X"I9}ҍ hN/-Xyq.gE~~t~^Cё ތ+L̟tB]U 3hv}·z</Yc{lؿޙؼ<5^u< ۫_Etg}<0{YI(b,T7ڦ:t F p'_b \}㜤ΰ\hc=xux<c#я,Њl< pt-U(//xF}>Bu/[SGyu 圧k؅wlL?`,O|ٍ1mg?c[9wI`.̛g&̓chAght7<Ẅj8l?/\,:zЍANdˋmt;+OYu_&WnVpe('epg:^RLn[󺏁>;әuo& nVx^:rX:t}}.,wDOFҫ;bL">{?\Iӛ%Q2)hr_ly;b㊮U}<#Ɵ\ Hl{_~k949>x0I.0KIP"a^wcG(2}uwKg@|d0kh=K>4$g{{V<MYٟ۟O߹=ͅgx?:F~z=yFF&<q/ި3.nk65nw[ s~f_ynmף=o|njri?߈M^}K>|7x~5utk+:}y=}h)/3gҷcbҠgDv3 O)jBke`e\g>nqDLsfX*oQE}yxH~NÝ ;ѯrJ>f):_񎺺pt]/k|ߍD&.*VOy$vg|'6~_yhl7>YV =+>*S|+"MUjoK)z:3|>ѷ>K#G>>7t잆O/;JYU_79VyX4OoOs,v6dt3&Ks~$A_}kXV_=DC&ՌOf oxLl3K#ã-Z&0g!G׳~^ؾ쾳Q<ɣ& _5}SgM%'7 7aג)E"K_r .~gxFr9F-5u胐s6k8ZsR!x^^c9ӗ=y`@1Js+_MWqdPgIRkӂS42zb_yaWPpy1s~Pӄ??]ڟ'OBa "^}+\a/,m];Δuk;=>s%ˍ^`x.sdb4n_vtRp_: x}:~&o8Bxmkk>Xg366Imt? /<|\~v/ӹGo.e+e׮rcF ^b_)gZ,'Ft^[l&ZA/¿E5&>}5(}e> (s#+sY+LL^=T?^cAu_f>KӚCdFS'w] DRh2q *SLf[;,?y bc8-͗ty{]I|D4xH!_{&x\VQF,|*)3|CIE3V0Ļ-%>ku=` Kp:n]g2&LoqGO96~uHWgjAw;tLv͊Ճ,cyem):B[~X.DN,-_>v غ#^q'v{p+f}ɖA~}u>sM}ݏ Oc?+d5U}Yt^~x'7,Fn4܇]}рN ~݌vlÝPd/t |86ML7tQ&?80eUnܥ_>|D6O)~ /=;FRb{ |=g8xmAfGΔw0B?ƫ50ſ]3M^S@w KW%m<zMpq=>$eO^֣Κ+%yG~"||Ny:5=`HsEq-A_Kwq<{:^^Z]~m̌JfU{rK-5rQ-EZYsx'7 | AAkpƈ2!xj͎ Ⱦ{hq{6fS6.cۑ%ӥ}q[xt`\aoh\ee[|liX1^7g}Pݭx/]Hm>6#?]#N#eck~.J1ˌf1W}m }"K:!+|&^l7]C֍ z_kݽ@9\^qϦwFi^t-ビ_org} \,CoARGVUֱwekű>L_[|D/x~zwc=C+Mot,Vҧ>T{Uܪ}[}U 1ܳO{>sr;OfoV>J&9˧e,Ȯ̻6vms sI7,v{}i4fr>fw.}hb.Rz@ңNZ=t{-U{>K1 $h}n#! vplAYaZWo_NH7gt_ <ǃx|8|6pn?@V vxNKwui=~2}1m8nk-™3_G_i*~޺CPE^ȅ lt&Cs,'Y4oәWyiӽӃbi {_r5l,~gd3m ~:ө}jpJ YL[~8rd/gn yw1zf^[=\z+c݉ſw:5m?9A̡3:KfӷҲ3qUO!{+M|oI,ƅ;e+6 /n id GHY+>Ӝ0s\bFg_'l沆|c8 9͟(ؑew~]\8Eg X胯59lֺhCt=sCEpb[ I_޾l;ڇre+/W\对.G;&.0}$Ag'DT.o:+’ۜ6#_q-'E _! | `-/S \(>6-*d$1m];Ȱ# L3yܶIӬ!B޷uK~dIsuk}޶/q:tG*uWqIl+P|e3;pR<)>X^gӄ4s?3Xн ';>Ⱦtuyf]g|5ww8xh\sNl]R3ȾE ސkaoW;/L bt)2G ?{<<=s^C=>fBHb Eollߴ{j{QZ||t~/_/%Jg?ku{}1q08W [׃Oʌ3~->g7OW#`8?L#|lkKӺOCR۱oA>iϚ˫ WKCM؇ȽF%2Rt/z}?Odm'gh:V:)KǍ]g%}b(n4dx9օUbtM =5txlֳ?v+NKZ#Jb|*+-/O_ˮz,LghkBbs‹l;^B,ŶF#w\i|;zb!WAޱ>e9`#=/3o래KnK8mmK5a~X #݉^p2? [b:sK9ʈ{<4nz=ޞ?Pw,çB,tǯ:8|JaZ3?n;*^EV\|KQB+ڛ\h/W&~M i3Of9 3>x"p=,t97>Mzqx?Á3ݧ4.Tl1^&~;c\l^1ac&O}̊y)r2y vpcnk.'v{|Q <*g|< żɭY엡O~g]O -/##)cg/1Z'n o,s~m\ȃ&/jG/3VX#b5/THce=OBB| ^ qcZIޱkd˟-j6kMȬ]|>T6 6=`e Bmf~gLSǝ?z/K_p|xy[^/?#m֗-~ѿ?~k"17_ ׌Wņ^1׋ ԎtW瞏m6655fPf Vo|\X<:qz e [tOc.<|IMfv{tK7>C<<|9s*[+e`Mj'_>ԟboǾӊ2'A8*9liXptipg݄wޅnGϓ'Ecnm2t=腞woOQv7zl)ADY(Sqys{p=6(_(Au+?B/x'5>MlOnc%yv֖~μx%\W<ǂTmaڟVVg;{7C{!31]>||GpeĦÿ){s;O}`W}n u~Hם OE~cOGO--}0:^g݉ ;"S> b]qŎuHvA_M{˸|7c<>-YVmq  cg #w%<B(#|}ͻn ^&^/.mNsߗ|^ugk֎|Lf#md1slo~D7l땻(v]88dhtӊCxYavlҽ`_?GG?3ވ5L~Zφ̿}?sU<1ȧ^gtd~zp݁?Ggk*KLν'_XlA̠uWn }ǍVp\E7a2 gx@:wgx܆'kʾe1Nf7^h聒#Ɗ0'D~ƳKsݠ[fFo?jɺ죞\Agx=_z/NR/h[({K9rحNXC!n;r8>oFdo~u5搵yQh@7>\%Kuqu.(\yKv)|l|ɸ-el#dtO_W2n Nw.~zdOow pGk>ho,&|ItsF۴g\_p;qFg|ݝa89=_ C?e%=ڔgn6.ӜThII3|\/>+t r^d>dOEb'D^Ϣ3UkuJ3xp4B%n h*uljE>"o2~Mٳ ~ky'hjOTqLgqwَmbgAS\Hߞl|d߶o m ׌Wl'۱=-^4z戽/19=a>l=`zÝE{ɳy)f[Xջߙ.c Qג|ڬM 'Ő=c5 362df)k^fkE/˥Ol6;ȁ?ey*+I/5G|<|38Y=]ň$˱o0Y,}'<>R`=G.1%,qUO7tvC5o|<([:Kw:*{6xF6?m X1C6^#>ϺiF._&dt78wE~@~6փR\nilݎ'ųy#1dt#yU5d}֣^DAo W\ׯX"D;V ,&^oBAt8m ^~ʧՙ;9_uZI>Ĉ.wΕ_P.ezoEχ /z mdDoaRaGrx9x^%W|drI$s]ƺsL!ƜCmdϺ# {NX}1?LgSdށG1)xx cT]^\g ?*/<-6~2|_75ZCgk{o˷e.Āȧ!?\Ϗ g=^qy}cfx5Ԗݎ`FY[_M6an0̱kuiY{2FGjM@Gx}u^!azVדHEYV ma1gĖ8?\V#ߍU쉣|߈{]kL 9oXg v #H1-ygoآ˂?z lC|gL7yA1aeX; ? 6g#$ٻRh$xŠ:SdŇ#G>FzBWkɨOt) C󾪿Ɨsl*qg=okrd{b'Soc< 7WWu*m %klne3dbs-U \F:YBwss yWҳ;;E|:ƺQS?ױemu[ x @o:N'N4FұCںx#l!}ގlm㯑JAr>O_10y~Ig7{~;Nqڭ9oc7;83M dYghbu{{/h fˈ-J&==smO.nwa+7<:|=:zǁp mAzqïkyWE.,õ);Zo1<ュX{78Wи3?tf0rrb~.fӥ< u¤}4y2ל|sI gwn{cq?cuqepq)1US(=t\i/cGM\MżAEfA~zn؆ut _L۵WFMn?؄\ۣDB}p:B+?|^}Vq2GyIzW{W >Gs{ŗ[k&Agfjpyl\ldkܟehmp vXGCc}&'5x}+쀊5KFeK:?$o#N<,C:-o_Cb`㙵+鼸gWrg)AbM@>sY{=[hyr|gD5|JVч<;>(bߩQIKbReCg[:^!));>sQg79F1rv+t$8]4_8dtmw`Aψ@g!Qt)sƲ:$3NqR?Oܵ,cW|,dgdƿy|^%:h'@Vl|Q3=b+[ӮO{NAm{Zg s! C/gG:7fsP|A{>`ne=7. eŲzQV_v[V}Mm-Ց d>cNK GpY|r?}{-Ỿ:inU⛱9}%Nl;?v/4zT?)w(Ҕqw֘^ުV|<ω.ѷ̈́┽)ミ#'=]c\ FŹ6_v9G?c)<"gݾ;MylCֳSyUYw)l9}7̧*S;8os פ[D / |8o!{'.Vn?||n->+&ɀɼSv}/ȇsKQEo|J:9yu 狿1լ?~&l/^<꡾4/V Ϭ:FGF.̪S oHcQֱr:Pp-[';8Ux]>3F6f4TGAg%ιohխl8>)W d˨T_^rXd xV%RIwWS0A{{ 0貫٬:>8ןx1x=#ԟstX` #Nu۠^ PLo>'Ml}ՐkдgFۧ1&,^n3b2:MOn/a:/ j_ȭt?ڀxcߧ}ROq/p?aԱ&k뮸Xsx'˄uN!ig =$>DWσlYּo݂Oŵ~p:3<~yQ?{Xd:8K›s#^|߁ldm̃|uflƳSzc#U>g۠iLiϓFwjfsGhk 6l\mSGe&h+{GϿb:A4>GWS;Kߌ4W,=&Ҙ%?c%)t̽wwY"%g\ $ga,HT$P$UDPA $1Q:5wzv]|=~cNUWW8N}8VG8>6go&n-~"򚭱Ca.}6CAFtWm,838hYiWIl!:0r^!.M=QvpbXbZ:~Ow)|]户cMb@Vl3}_vpYӾ{ /2F|kF.oqƠf| l}WpϺ1(L ./+1o\ކֳ^g}w sHgm6TWlLZ?sWFzR3=k/XcG ]ѻ}32ys>ӊq> M}X7ZwJANtabq~(ŧ4>Z\ye+C?^hq7d.#P4D|7x^~ygֽj1}[Њ#y%ix縛^~v Ր>.3w9~kɒ.-NNk {ٚ ;Pk}.Fn?gymz迌ן]v}ÝĎz:ٻџB*8cw-}a>׺  4l -xѭ:'֜B3٭ oG7Nl%Otk6_WU5E# S ro=޿>f*&q݀)8(K%(_ח|c'=ut x+tp-xt K}H~aE6_lfY/'rZ!~'gݰa;oBܰ`+=e}@Eik_ٗ򵧘n0Oo~_~Ӄ|u }1]aϏQYA+䨼sygŦѥ/d/@A&3a7I\/ǕihHٔsseYs9;G`}mm\Eq!65>7{9Y{7~0FJSۛe3O|U&oMμeӍYc^达}q(:a)h~W np0CF9{Ŭpfˊڗ,|p\>4~J_~ђ-ig. u'YpyS=!{-A=#H\M.'ѓm]]ѐ+6JXD'MVXd5a1zOemսHw%ώW.tԓpG{#Nxxrt}\tfb`NiuVlב2w=:9Z^bCYԷyg~Km?b$FuNֺ1>W`hb>ϐSH'[ <?6}K&~ze3y^ ?g+TXtvw\5PtxR{m6q E4 ?wCn7:Y@t(.k '3 @.y.}9l}yg|ntoq;L|u6ۀyF!=2dgY-kS p!g=h+}}jGYLq[:Zwq.sm Q*.Sg>3^VU|֝|=1_6O/"R%~^|{Y;3=疣3 8N>d1R>].?Vy먟+W)&q|94tJ{ugw>Ħ-y!޲vs|+ }/w ^RMTн{Ql摵m _]SBtrgoɾ'vtau'NvNg5ײdb!h]elmURg:w9WNp@Yqk0tۯgvYqI㋓yihǑyk_Ed߾#/w[}-_M_w8 &ݠټOd>s҉@~W,_c~ݲwk%_7@DKw\vW)V|/Wߛ_i?c)oAj딗+FNrё}}kLAaj呖oaΌr8;o _ L< ݝ=ou'xW+|*~|<cm͝'7]w|?ebW'am *1<:7:Cd?ջb»֏G4f5}>MfE#ҥK=KAg9 }Ywڼ*88iqO 1 Q}-(xYQ姗lԶCA∝| !2O'&]h`^>KSL&O+  ltFUw¯",?<4l#_߀^}\ˢ}C9YKK>y.*{JFmC+,81痹Ue3h4Mt?A7!᱿I<~Q N^m4[?d/Wi5T)x ֍I~k"eX֧A ?6w1we8H;dptjmO$nV[{oA;Oڙ1sGƾ.πbaKG_[??^m4Ec쟼vpŸrht#-QCu {nhWUwU8O[a\+WOV۸ַqlvGg.ֳGNCf :|8?\vt~_3'_ Y]: NǞlu~-~ٺ}˕gı@{X<.h%ң2m+bc>4Y:^0oKgxt?7{ooƹO{&pנd/yZq .w)~o]+躷^w}6\ft_筌 ԚWXc=;Q~_ X:bDƝY8u8S#+' x]_qc\{mr3okQ>6!{bJXj㩸^1<ݟ|x'!˜ٙבdϨem[xfa3EzXwZ8=ܙǝ@rCU:ga[{@vvxFo0ĵvؔkdlEe䦇v nZr[ĬS yp22fЎ)gI7.>SwZM |Fku(ȯ\A\3yJ9FO΂|1+{0(6q]؆SwS,4S?&q,KƳ#_ieA5x`7 [b;a/U`GUX#Xyq&gʉ٭,]'~7 |l޿^7>W޾JoݣJ yױ󡣶u ;ʉ 5jQ+u/ѻß_׹4ںv.=9n/ ?f͢C795oy3?Z|>ú,9#-Uz7չzr sMu͸f?#U.vgZYZe|ٜy9>c4Xt`|=O'_OpGOt_52dQeZaOMk7񾉿{tG:_Nls?X^~7+V<sYxk}73/ SyQWt}&:/#|m7(+RC`Ot^!3 ~7,7 aW<@s=JZitz#ϛgd|ʮ #|C6uXWF|n90;*mg^IzcuuO >5 {E\eK ?7:o||[)ۥ&nߑ 3#a#o:l\.?:6hܡȟ#5l:0_R8xjď~: f3>uCb7kl$_/:sQ'S!Lח}Gu-S>f3Ѿ٪w[%lF \+ù@kq)BV?$GRm H<rQ0QXwV"-{gcrG7i|H~7 ~?7~/E_CW;jL n< Sv|5a 0(tSɀ>B78}(ae7|-zmwcޡk[l oiI53mjq|C ;'rdzhd{;o܍5Wt a5Xt:cN~~ki'/Y.m}\C:Kc.Tn+x5-y%l 6Z"~[n{؅Y[9 'SvE}>iqv9lc{ ;zDF5~; θ>85~-lh$wgi)_9S,}-ybүgY{-:b7: #opD5s*u2閾F~Fs\fX5phbV1eSGtZ|5#=̈́^=@p{yⲁOב]r߯b|bۺu}:N_ ܓ=ɍR{U`c_ mY%c'⫍[)ھY~,uRa VD,ϗmaΏs{rp~x MdK!@d?O{{yz]䠳 +flY1Am5zآ_oOoaeG>W4!8yo~$ b2]x?v?:gܮ??>:"98ʹH fzqkou N:36;7 ^c0e`(oor)4)f\ߎΎ/Ƣ^[3ϫe6C'8GY?jwף 1:O|Ey m} 5xڲ 7Z_͉~138}۫z;<7Y[DA-ܗӽF#=68nj2T u.^g9~m ߹uu'5k0[>=!Nlw]=a]J"oYo?,93ϰ}Gh~6{>٣lgGhlj׋{ t۸>>/ocйoW6ܴœy!$d|=("zۍ3f1LAށq>>cۂK o<_Wzwy>әߥՐ: *,ahrp͋?z*t8!t5_ӧu7yz~T>F/M_vddl86Yg=(G #|hюĻ'םNDV]ǟY~2̓lLs GG^CV,0%}:v_.=yj+^Ӄ&@Kd pHl~!mk@_ӃƗa۽~6o>h07OCzg@jun0=|'Yr_9[V(s0NUqlxkeY*/{ǯWZSlOˮ>/g _֦i#w:OGe~|2<\xKۚ2 g{h7mO{֝&:bV޼iA6T,h4)/5ɝs,:vG'/ ^h':P|/7;ON;:XǼЫ|z[?t;xF ~Xyfr|#'{n3c\no% osr-GR] !&1M3.Kp'%oo;xqu#6]ѭg␉ϻ]Q:Nc+DZ:i1:ѯ|*=}K=as#<÷c؅~xS};4޾E2?{ΡZF7`r 6t0rVo$Y:K%d۟RܕW!cǃ3D8t|Qt=k6*Ap qޙښ?Le|~L4ٴb {6Y_=chw_)T/ի_'z5j%}r=7;m̛m?K6y2x)(*#4{q[l;4t־vb4s6;wc;SF4Z[z6[q=RVJ)$䖒~Q2o\cSFvQ9)@^zk|26~փf[clv-+g 8wHs ۜ`?I3͞R9qͼ n+;Y uʒ1LmYpK Kw8gi7u-Yj&O~h&-}Z+ rJYg7ނ 'ңޭ3@w?6z c[ - ڼq\mx)K}pZ]4nD?`,7=W^",kTqOy_s lgs팗"v!zJBL4M0>|`ql*v4<%*:Wf&<  x)D3tȈ͂oAtL~6oKtmz' ހG漵ޛ+ϗ}8_z?`o{]^Ssx5 5?<dt6=w=樬.{b)Q=Wc۬=7w=qL+;wOXVO|ɥ~Ee߀J/b]$ W7xiYfo~3:Ov\2.4Y{}>aJYKxw-`6%CYmS ;ʴUQ"]cjmE6 ?!l|>Ã笽&ș5'z@WtxgzMё͆#Ě.G8ɫq1߾i .pk.-KJ-|V˻D9USo=7>b1!hXVǡ:ϙ3L ݎɆ*MXR7Lt^,4) ʦuN_t޷GZe ,tf=ᑒ2Й{}Y5CoHyu y#L6tT%2\Qk`Ac)]?kFmءpyjI/˓y̝I}Z|>Fsvc']u ނ5ܚ0_oB M4ut[\gQlPgllj|m_)V6ӀFnuحK {gC){Ҿ;e5Y$>R1feDn76{ Vp6u{ti6x &[&+=Fϻ-{Qq'L؝K`}?]bD;Fk_2?Ev zt??[_t=4:sOM[m[߷ߡ3_-/׍c~}jp5]\tp.ص|2zH)ϒx wU$ޣwMܴ. ߪ1+?ܛ* :|&r]4m"T",O;ζH!_U\ȱԃC%V17!~]2ygź!G1#Gty~c/x>duYjXT~st|],A:&峂b|9 ܽ~.g ^e9ǐzƴ|,[]߯;::Oq)簣=LЃ#;V?y/Vmeke:w`Ss{~% &5g] |J3ɸ@vM4?9LQds Yatسsɨ<%z^9G@&CNGAo_㝆쑓U)׸=aEV`\ls&H}1lLdp]ɘ҇#c^pLyglp);yRp}xt[^_W7,2z# [qE=U -hI<\Q6@OE<mT3}g`gau?h5ؒq_QyAgjv=|u?{T 3rKIm:kt3vZ?OE>}bЦFa?@>L *4bᆧX10v ~N: ?FM QuA-![.n>Or۫Oc<:gc2A>D:e2HgV>KBG9sx'Q>תjUc H^f'{LPKOl{q蜱p\:%>{g; v;1(2;J+5qsy:xx#zƊN+[wrDb5|4 :He_R;tVYQ^lw1guyǼN7y`AkHps'm_: oJ0*q]=gl9lv;B9]lS~FDZg,9|!ϓo|wbI>8NУcALR~ ~ڇNx FZiP>p؀ͥhS|6I?X~JqyYpWI#e{ s|fgZI{LΎOspy>8=˿4#whT[nEBt4ͳ0&:]G/0Keb1mm7'{go>Glܵ\alhE_?:3=y\ȩ돱l3fO_3ɵRb4Og`pfwsF3k۬طeh 9۬uO/Yw,թ~Ow<:CÙ0kuyeټ!S Kγ|yIX᩸;U1?c| @<|޸~6OgX['q+׈Pze |·{=tjy>nm=mL Z_W/MmZycGE'CI|k;X|+5ֵ.~1{ƪ= tr*.d}פf~Z<־C߁ ׵l0%ztSXK 2\:l\|wv0J+/cLy1=6: =OK/D~Zdw勉kFUZ;(A:;&[tk{Nx"}֑J~cy~dΊ|'X$M2es+:1>8:=뾍]%UR=ll6/܈nl8~zeLiHƆ`K}y#:_DfPb/_Еfo|P+-|zNr_d~J>O 46cIyR/@~wtW͏==:ķᧇg zVo?Ϸ 1G^ȯ8x|HFqYOm~oi:Y=b}V|>ad/ur١Zs?[ˍ{g{6Hk\߶Xրy4Lbq-ǧ:k?!zd U/ go.萯ů@Y:vPwj#/wy'|Nx+s==g=m־yLMs[]͓ DfgFtg3z4}9'{re<]뾻Dc{_w{~'Gש<>!أ=Ӷp#OtIuu>p6PanV_ǽ>+Ծ3~81hf=s#m‹i1/'x2w^vksPe`Sکt7lDZ`2d_%|_;}]j톣_mNIFEe(#W_ O3/Ÿpvl[(6BP\}xLl1:cͩNwU:|xAJ{.Jrc{N-t|q=ܷ `1>~ػ+=(ȿxt>_NAz(vV>GB7lCÿ#[O持ᗑg=3yvطl뾛?+,shXE.]:|c#=Vr^ݧ{un`߇<WuD l߉n =p|-G4t»82V3\g7ja|d|]iK:,+VTZ3@-6 +qLl$Csq5;1ٯBGoDZwn-893}ʘ|*,l}X%}1/WGw*˱8hǸ|pℓ߸:`V,ZiC >R.A+U5ĽIz3LtԚRL:ҋzs&.yKNYwjVxyhinQa`cC'}ɞ 3:ݭ\}L Ȥcgαnӆi=w~# ?^,qL}S_?XqK"|BO)ݮl:_ln9-{|q/r|ir׺-̳*7RL|5=3(k=wл-WL>vt?p\~KjL&~O^ߜJ wno9޵,5 sO/^?h\:wͦ;vZglct 0?oޫ tֳG湎xۜl|]ǹoQ6^tbgǶX}Fg&/ f4$_~R%#xO\n9/ӹ8[N?{ zG_1>Mg% "`_uִqٵKxxTm`l,9SzwU2;qLYw:0#'/yׂl$!U}燺S޴wbGE,?{WnY|]>z Љ|)y\?n ̸s]do^?Ow]@M1ll~8=~ v6捙er (X{;`Kp3Cojlpz8ਣ>%.a;/>:e?|8_(VI%[AYCkx&3ۼm} ^h^r'0\ذwyZ;{h]`"@_*6~AZzl ( wu ?H; NaR 78[[:ԭn哊)Tev.Wk]ܲL_ٻd,+R[5x?OM]6u7 iqm|򓁿'l ^6d~M?;ZÎ{`x+KNtzp:?9ߨ|";L `8n'Uf?=<;׶ȑMF秓"}7ѢƝ_|1C/rK܋w?ݎKqcww;u:N@,"X9^ J61^~\~BGk:oֆXߩ-ylKh>VVI%tkW|~p ehM6]ۄQ,pN}?xݿ[mʡOƗ[+;ȧ= \v#|=*廗('}GO['KY^5w=yIl"M8'k{[D/y%ygsW5Y6ܕÄAŏ ~}0wp:W7{o"g>q7)*N>c3u,c#-i{hgc] G5l.w?U7taf8f-u7tQpk/w.'m -{ë{~13y[d/[~4ݳXc/\_!δbdӫ;Sx{L@[ox8_2з"otfPlM|u놟I{c2ͩb{6qrovjYhkL?3mt,!G uM綞my򥿵$!yq^Atya^>>uiѭL:)z֪}8>O(OqoWfk `Ϥg;/KKwv=tuר t_F?#_ژ׎jmi\[xwh3|<:?ҭ/s \2&5jpu踦tk[_]Kۼf` m[ܞpNx]:Nc/ֱAX^.dr֭|(~Ȏ䑶z]7 +ac{񉭁\׾⺔ _l]h}1ߧwbK^ a\398|Wu. Yt/ 2+jMWZ;()ם w)_{V?=~K?~ZoXpW^oQ<᭻ mVӠ;97 W >NJ׆h{y6l/3)ح.q Ƹ֮8b>n g/-7g><ɟk|@g|F;}}ȟ))әÂ2Ӝ]-$ RzA]5 1)MuX[#NhZ7:}|Ÿc%~xk2Hsz}5Z?>yØKd t_t_$6Lq:<}b~&?/b#uYBG>CowHm 0''ے\ɧg:P[ƶ]%h><.:ӱ~ b mTV[7v[U mAy"P?qpq]˦e0Y1)8E.}DaF%'4I{Nux8x+!N3ihѩ6͜i&}Q!_L_|!'|qf|6>sWٟ;UtQı31[ NJ.PYm< w:߀qLxFv3sMgEfG:UkZN>y ۘユ{ -:t؞QsM4h69ݦ.<rї`zYq,s}Ly. V742-< 85SllLStb3^](rɟ+Q/aOј>E:ⓂX ӂMl/չ uꗵ ;#ڙVLdrtSE/[98 ۴^7>:+iIi{ryk-Q| ?k{N)`tD}L@LVvP6ݬ \F mTm+7p0%}=#mȗ#e?-(["|⏠>FqxlZĥ*>J{gj@ r߁lvrWr $#3aW}-phoChm@cO|&NkexLO :A[)y/K vt#\*/{#U}u(_U&߉?6*uC\'1\NG}דu~3<3p 5Q>:lݪp > NzUO 1:Vc !ku2>ݛax[ [3׊€O=bL̷I1^Ҭb\2ye&} gu| غ9֑wl&Jg؟c>_t_.l|DZ_P'4w߯R'^xx9@$}iGoȏ|xr5w#>:L woM>_&;j1jyٺW:aHKi]~lS6>%j;*[lT,ᣫ 1Vף=I3<|Dbξ=<2 dWF)<Eѧ\j<󓷏.kˇ}eAh|I0iНX3> 8j|&y,K sqӶv\ &6FryVG(plnqi&k?c}\ MBVy œ}.RwGCg{ңՑٺÇWw:,>~r|Dx$DZ\~n2FeMUw>{9zODtJ#~\7Ϙ? dfp}<-VIxClrš38O_F\g+6<`yث_Tu眅8=@49> Lw 711p >a+v|6M9wbgO3"{Y|-&>7߭?hHfei,̥?0`}~WغfL6u,!:Z6rَ]fuGqPov=nd5Q4AEGxo;ynd߳A[ ǥ4~Hgٿ}Eg$;T<NaJd;WEN˥kZC97Dorpʊ=W^j 44Z cN ~m} %0dk W}mߥ.e'v)[Lx8=lyFy,}&u{_ѹ?@CХ^M #;{gF:y:+k/Yg u[|5~ cO͔=3K>{Ӝr=)#ͳC~5;y>'飝y0$lf;&+N>S0&\YΨDzhO=f$6>niu尲OCn=uQc'Ի8qܟW gEe ^ ^l#Xϸ\;o3zvPt|>PV[_s7|~v2.Uqy&9OC2w=b{{FcY':I>yڗu9oɎHy^+>cOۗ#gݷhC8^;->8GMK1WGCvR6O1@x>ſCg=kڷ\Xp=stopQ\-tb/=-  }=%^wy?awx. 6o6v2ϲV{˘oӊ}!7Efq|𲯇2-5lfx藤G=!*㵵0e庇prsf g2b~,:}Ru~O/Xh+߽-Mʼn:?m!L`~=|/c:b\p8Ū]y3<|ߠ}5{ 6LHcZ}ŧ0rt{:كX6}Cer60q\?!۵y Ȃ Vy&>^EGOq=0<~D=<<. k?ͿOokw,oo_s.hvX3@w]X|g/Wӯup1Ҁg15݅Y=ůƗ6X_gڛ7_6"\W6_Z,]&`01Z7eryt%2y'rpL>˓ ;ebw2Q6b}IG9}ljF't\Y{2Vi 3V?p8݁A <|]}x蹰I0]l_&dG+k9$H.);}2Ӽq&r.:dr{GLx}gu51Z3l8p,,~irX\ݞGWE 8>hO$NkyDskct@y~>_}wyG`ZguIԏ.~Gc-Snyb/}xƅqgL1-.< Si~8io,4Q0e .FqsCN1ti(1x>-YBIY^V)쑒Lt:?21|FY/l}ۑ]]!d>rb-a/l0|.b'z<5^v؟.咛x'^m<"K'8\e8Υ_vJW7o /۞0]O ~use/{ nt͕)C_ClAH򯵱LݼFw7;$4w j֖b1pGzרQy[;zťdo:w(ҿ7@٦{wgks%Ma*6J>^Q4||up >>.25oc-Y&Y^7>vg?kGg񓢏&+Ȏwfa:QQ04}Va:gt)9v_7gтV2g`!{eۏ3g#y앧;5ry{=!ËϨ 8em\Hw򖈸}/'|޹mtS ^'<+¡0'av*t?u:~-XJd-J paa> k̃QgCGJ?wK[0FqG/,r}Ct:Qch?*SV#7A_j{z3^6?ìdU7>sݏ&r:ie'[/[~r#]}`Ӂ72llS!ZfcgR7N c^\තs ~ksg/kgfx\ӗcwq⩂د ӵ+F쪴8G;Ts㺿Vq̼'q`*cSm"m+1?x;ͽ:5l.x:{`xfS}mux+69]B .Sh?oo3X27rQqLkۺ{{¾ֽ=|6} ScV|bl9^eulr1~!MX$߃i̇Lo:SF{w ڴ{:[.S|JmV\&;+-{tߑ>פuu}t!ovQL1/gY+{0| _k|'a@]RGvZHt{Oػ\ zbtfO1Kʈs!I-P*G˷ >Ki |rmp>|٫J4.v蒡ޱ9O<]lMs?M6uU1Q~_.P&_u^= uS{ٳ.3\\"qg4@[{F{Y 91H+{:ی~eQ#}Cpjbr>:#br#:W>1> ^θGl?$\v0#m]P>vL>9'O{P 2Q'[nu0Kغ?rpؿq¿\g2i|fѣc;CuHu]g/p mǞöl dڪC8BCM@1*7`u58# S;oT~={+v꓂؄K ~4|4oWg2⾰F h8]u]IΈʟgX3Ku&[_9E"87CrܧX8jl׆#]7ܭ62Ao20]ʻhLL:݇3ʹS+G`gzt;ڛRh̓.,MO/GvGdw%7Ij{t٬A^WY,~[Й 3Ke5jùOSH֚qmzVlrC"zjgZnqBٻvƯ+Fݛ!nm?pSsgS0vguA]7u#npk@n|ƽr׃Kb稓gs\}>tv $q_DtH:Qc18ߗ΅Q{dC\Agf|7\D|o=%tȓ|^.~|]ZlT?T-C1lGp[JdP΋ڼY[.b\צK3>FWXam}sT~qM0Y+A !d'VÉb (&\xQq.~PJA;~e qt6Fy9v2Fz+Qxbً:w{~kޖd\ pmdhy<'G9ruEXj7aǚz|~.>=I  >] ⥟Sï)=[y݂&u#[3eqwk9qGc\yCٜ-LG.vț_a+Bo  hz7ݵ m;%6\pG18qBb8 1~\dܗ#O}& 7k'!Nv{c ƠEe~}z-$f7?^|<nWu֥>s-2Vn;5ǽ:+#= Q~lrܠvHx\0EyȂ(_'qwӃ}_k;gߌ{t2)|Azt}}2Km SoϿ״|_1b'0_7@_;z~:p̳5=?g]νX>`?#Nh縨l~/ ls+ОAbJIź~4Fb2OmrǧEb\ '}^tYb|~ ϊ_7=O}qbcD^j̅gdi#?Ifs_3}5;/ɟox`7(ft&r]l~ uKͷw%T>\>m݈'Ya\I?Ίy->x1v_gY:b>M50Cg&7З?"cs}sRvbtNbb[U^iBgXuG3-@o\vyx x"tIl ! &7Y3z4:;8tF;zֿ]xoN Ke?- UlkU|Ӝ%6(7vwPߓ6o: WɏG%GCrall2pZj/:,+K krN}wZ34<2x<3 S?%e}PRl@w܄̹!Ku#?.(sZK.@o@Kiݭ~~zM_->1TɌ6E a!|q#vO3&%c{^(׽1EoQ+/Y 5eC)D͞r7x-ZwZ?@W.n L?پoHp? [co s׮<^ȅ3;ad_ wU=|8~#+5ǎAwyg?oc e*IJ%2>)]퓢q} -XuwԌ@O*;>Mcq m¿c/?df/rfxbM[Oz)3ֆ|ggG0^ aWZ'|u,K$7:Go9Al}9qYŞ+]遨Ǔ?/|=૎ Yzߍ.jk vGbl~[?{lLXv_{K}0oߙkkzd쁳|Ãpo㭸F߈㋮ }c4ok>9ⲩCbKrs|0;k1aFit^=waư~Ss?r~a$C. 7(6hfT^}M8:ǩ^H>o3+_/)FӃ|ukLL&܌\Ȏ|Z\7lQ]](߻G Xp0(7~1 ]dAO\s_ՇseX''} o3%>9ޱ,stUs/}or-uοrߵd&F~gҫ65ܖ9dqxη7-{Oo|*/kJ}ɇee[^֭?(_'</WY m+{x0?Y^Ԇ}=54A>f܇?M Cvfqv0854Y-|$Ȧ._ fx-eOj;yNhɪ):/ ud w"sc<ǽ7/U] oaտ;[5cW.?>޸XkS_v]NizGܪAu; 73Y|do^ur)&Ծ{S>_mWlw>8g[Ԗg{A:|bU<0ھAqLw}?W3Nflxk|pOa1J`RiV@~YY7~K=l$c6HEje_OlcxeTöuK{%J{fW;c*mMzl11m8T1*[yOG7*(MwVTp_sڕO fTr]Q&;KRto `e@?k;ѹhOV 7 xNe >L8dxf9h7ߔM03{89矶ndɊl,ϵ 6zgt(4Ʒit/y9Ο6}i9Cxwh݃Ke=ez-Z31j&byIˇoq|FFW2;4>~F;48uNQNʡSg'"+aCEF2zXkǷ;/߁2d\"H6ogΉ.ps?U;)_iqicLZ[lo>{A=#=Uwt|B{kACDo8~ lv ޿Wl+⚯{hsC84S2^.(/[͠x4 ^Ov8tJ;m wt?86}~]:OEјk/k_k7Zb K]ũn;!oql͊Gװiyw>4Ei6M݇=3C~Yt ~|Rp%rؗ&$\*[ tLzf<9ne}c~8:sjk+b>tf_?۴ഞteŷO λIΓ?|.墨0:O1& ޳Aq~aɡ7oyo+Rm 꿯W=yА% ^(yMSt?'So|_k^,VNG 6,^40$"ۚ7zy^!tul17$cE+ _HWMA)lFWx_ذs3lN@;&zK^fN31ⳃ!{\/dx+읩?C `32K<= 5wMНA19J~N{wȵ׭ci=?n*8m47A.m,pBaƾ䃳 3K}t|ؖ+[cYi[k]7-WHh7,6gwZPmLGظgMt{ήNbk;L{8~LN,} :ndWnܰG`6ۃImU{p^ޭ[]β!3-xG'>ojp3lgASOil%?x߾=h3y 1?:UhQ8R[o)HaO=7q~uY6A3-هf<)xqn-Y L_g?B3nGǢ#w;%R͜_^ *e};U:^F|V܃+ڒn^8[#,ri/ȚěHXkkIu%t&=^5ayzqSYe y )ȭ&eeIFWM~nb[o!A[u{ZO/Y3p+é,fmXbݲV=5n.{$|צUzG8mh{Wh|v;;]v&[>i?t+;qQk!C#a>Y'1 X򇄇F>Hp; _A7F[nd;rGpΓq_b1D&3Oʼ|JtL4q,军e#;T7bӂž,+/gmֹ5 -nOl|[Ѹ\:l63c@>+ tx78&Fu^'phIJJye7 ?&6cgY3y`>qy3̞3bk{)\\?,gn __Iп4&<az;\mlV̋}`7ob2X53uv?+3\#trCsgU3zv=Z|MΐM:r5A~fpgCNg<ΖNY9< )FucH|w9w8'QY786‡}| a^s}y#¬y(Vcs';lK_qm9\&Qسnqq #=]H~zCͽ{Ȟx/Ϲ 5ir\G|묪CY/p#om#Wǵ39۱%ZbPbˇ>*NjU0>EL^bԐ E]hwl!B#ELb=fBFw@oct8{9ϣ f0//qEjxsx<|d )8g aǵu#Z39|d^pGNs/Ƨ6֋t)6(b=AO +ƽaY XpU`%_̪'O`۸CJEWr:)mz>d_+wgމc,/dx9a40]"kc"z}1KNxJ|}:ׯt)mAp&I.uY} _eOKכkˈuGz=xAM=bw n4h5<1w'}|ۥAzF^nc&;rVb$mMIV6%Ӭg}>n}#гۑ~?!~_N5; =eۜ7UGx+>45Ap\ub1D[ ʯQ~Qr~zm&\ƅQt}H-ЬqѤOC`E ]΄p}jȘ1ɶЬJm]6ۡ2elflkȊwk\ö{eUۤ W' dCW{ ̥qcW:՗RX0a-Rqr\\Ӈ{F‹94;`t~щAgm// Ҷ'9+?7Ng7>DSeWx $دy_t՛V5_؏'zec6q}m/['K?t?v˭ !{-4PlSlЏoUg?[JE#L:&71C{\V:C_l?sV⽭-lu8)xz>,(Q@/tU>bA{,*;%↲h[}A.]|FWk\0ߣ*|??Y}x}ӄxwXӃb$";e=Ñ:]x1Ά & nD=D;4+rr6OҜ7at^<(x)ȟ Rt9!G˷<-|":[tksob٘k 8P" tgScF}%E. |'&eq(Q<^_ʠC>ߑyݳvZmJ//4>5g,|ArڠYcn)N;:#gOkLyS7:+=U?'͊9lU^}yWyy{־ב&5j.ܭ"[)߶֚E%k7; MFkۏ2xr9wC=/G/69N;0<5a?x[|>ǂ3E=φɎқo>vLp { 2#YI;[ߵ#߉ xSqy[gi CY{s}:򹟯#J{'[\yUŐ:52Qwޘ,kh8oIfN<{Lٙ'89# xb\yn5Rpe1yۯ o2Ùqb6>ygKoF5wO#/BzwVGK˵g 3(&25 =r즱/ϟ.i;Œ\^;7;Go\g<ϐl[DZWޤC18q$u8qC[د?:ݕw6':1=eX!+k }NܪTKx=L!bONv]ox#t _'G9.jy/ΓNS sq{_OjZ;)޶,N= ^>O%Cs{46!7}ӡ|!MtǾL6ػ3}^й7t{[X w+Շ=/Rz-xp9RGő h^1|'U-SwŹD^6>' rQ/{| F`vlKrUʠO_׍d]%B|`fY%?ÃG/n4;*ʐEu4W\撶uv5}לdYWeovs7{FO3t{[ih8TK%r~JwrmTbd/b@~!]rξ>l~?!yGIاvbe$'f!d##5)|Ϝw>g};<:η64vRjti5~71~ok7{>p.ԸNrYgc{abHҊ_\}]W~|Eʇ x&r+}t6r5%eRf9$2|Rҙh wK#?ǭ|l=8߭G{ٺP6s}^Ɉ_+^dطy;y E:c"^{3 GimxlR2x7U8_ǖ`?wL .>oV.*|&I ?&f׷b/S.͊_Oł?*}kuk?6<5@I|w^!;}&ZsgpW?L{%FoK)i&>uDg+E] xax上pGў͡ΚOf?#6z ipzpv,%8E>>jDY:=z8[N0ȖƇ7Yh=}RϏÒ^FkȁDy^0N|f]<^KO}JpUqPGy<"?;cƁ)| |>xP<뾤ֳ儗9J?C< \~ڳSF}'yҽ|=5<ۂn~s|Y{1vZ9۽nNk0%z=tF?0Ai1_?p<؂Z'\ק :;3eUȮ-}#m0Κ;2vq0S Nӂ i1D%ߊs/ҟpu˱.}1ɳS7a_<[ ط{}[,NeףKʊ)W^ngy[emn!^cksB\J#3`ִ b@1-_y:/or'o3lm#ѝ#[?Ę"̠#¿O[\7CG_s[G<02]ө {A/wajOF+m3y*Vڌ_H\B?h ~>3'i/xZ9Z}eRj1]7Ru1)+B+ۃ69m>]a #*Oq-UWD^[UN [=L$p=w!;"]|_>4J<@\{k)x*ӳ\\gӃt>&E15Z ߳oYoLδl\:fR_W}_먌rDゟ}?bOX=?U1xo dAG;]&~ =52z}gcܱs1m3q/zKdǯ5WhySy [|}FkEq&OG˳؉vpiЋ|~;pAz>ѐ*0^ /u`}ϨwPghru=8/_ub}CtЙZip''?{OW6mO$G{?c?~ثO;,9ddHZ䃳?#Wtoy1k$fmސ,˟9lXOvZҙ`/1~`;xu9ܨ6sZz}wL>6PW=|rhqpzf&AIrb`=N;Ln@Ӄ>(9f'uuu]×z1G?Ytx{#FqDЗ>\ VDw/B[yy>+?'KƧm~u[O-2=q[t~RP=c--:%0{M/e+kd1L=`0uyW F4|x/7Yq͠G \53 +=?<;V4osFbN^\}:^.* 4t}Lo>{;r]n 39(yӺ:`cщCZ0CK b2yg`ύK|{L\wT(̫= }%q?tQq+O|]K oSgZW6u]k~b]j8Ɨ=R}7B~jI.g~k60F'anV[$}Ы?˗_ƑWmzÌ7ޡh3g2kV<s~pMf05i4|Fs8j?l o^3K;Ӳ}?s2_+9Ψ{Z='QO}; m1ĒaF3F0?C G!w'#`/{qlvM*n4:D57a?ބ=lFp+r0?,Ev9(WXmޡ;X؁ p&|Ul ^F  1/_#<1]ZYUem>}g1w=W {y?s } {;a:҆84`77a+`59 ~ vxg?\#>!4k0_Ō>肼,ܪ1N }=9Ȯ.{'^np$jګؖW7ڙY+1F7k𦿶=Obޖ7|nůBs#g~?(+;/%Ѐ}7r.~7wc_,`FNॠft Ȕz<_ɖè6EݻgpK;/-bBB_py̳!Ÿc+%>_kgk:[>{)OYngݸg>ڢfw3;wFcn6g63dݏ>?qp'Yߩ&V :dhݾ&t^73MS{FguOUJ#l } 31򎋊ǭ:#[&>5 Y1Z?{:8GL~+@vNj:[͍ cv/~Yƹ F;.\^ N1u_?psL OU:ịFX]VOo {,ikݗAp !Nð l>Rf>`f0k2%!#_#_\?lL^u3#rQnmx`ƶf_Ϧ9VKa۳q\th% _uЫOBGZ]` ~t&}lm'pVg~xАvJxZP[\|0W$v%ټ IdBh :890VkKp:VVSF\~pc˓>פyF]UJAx?*v\U{n;Yo[nHUdkM^P9TOK_Q]ʯue?}t.TbZ]}˺pOq ~.=ЩAplB>oҽ—>=UM} at?g8r~|[F'k]_6yt~&?3 ~qB[Vf.3ݳf{7)/Acis5WI0#X&!#_/SGg&ѧO1w\N9HyYIH25mX9b8| Z0e9_+E쓗7WWj6 ՘k5x[:FǓoO%OѾ6ٴ'~IH/KωGnsCwg|b~rS[2Zyysa$6O ~σxhÇ:(ΑAzhgZnCu/O CX{|^Q۽`F?;v]:= t%rɚq/,)cc79F>:HûfmDGŊE*? #q5Ybz/};UnӋrgŠ0~;90)xci|ujdʑ Ս6𬅺;bC3 h{1x|[gxV1б+gt̪4}GgGwwMpžt߷+L}akmuuX޹,^dg[W#OɩYA>OKaa\.7XDdzƞ ~X~C.mC&1 Q 5t$C~y1[_gIJ3p ]Gηu/|7.~Ȭa&<u'A}ug㞒nC_()˴~=&E0ƓGt6w36'n(g R?Wϗ|Dl.7|4z|߱}wWY+kG%Uդ{3wc嵃tGt16|VC:㳯 {~~mndA_yg*mM ɳ`܏4%2OtsΤϥ]^)bĻڼ;IQI)`LC^cyͤ(S2wc}>נK3qĕ~\:KBF?SkaYoln{{' ܾ7{:v޲rr[9vǮv/oϹ{GkDw@b,v|ů/k?cg:ɶ9gtl?͗>~=KÕ4}3YTMaheۖ~^~2xkޮ/o־z=j%8h8x,dy\gR[1G{$o'~Fk=+i|&~Hobҵʞi[x3%\27%- gwS&?G\.4""fw!=<^t)=9d뚏|V[f_{ >{Om ;I֌>3ϟC=~ۨ˗çg>b+% .9|2} 7Kʗ7N,o{Ϟ d IX>8Fa#p߱tg_|~i< 1G :Jt7%m}U^ v"]$%psX;#Q}l2OZ_l|em=Bѽ>n=oP?3ҽ)tN趍'n>< vwpns<,ydRsFLuhcmΈ ;A&>o~3qF';2bh8(v5s=M <]pdet'#Go8Xɏ:afɴ tzR3tU}tuG`Q.cu'}j׌FsT̈eVVO~=6cm"]<@s7p:_=KZ|V;qt ½^pY}m*#m"x\*KV|ᮊp̽[-N1V{eqnlu^7>:'nDfOnTl"*tɠ75p3|y;ƹ.ewu7/N ]g}0>Cr 3\'3Mȸ׷:7 %AAv' 8G6- F2ކf1!{1R5=tKf{N +~q+|7S5VO^2@3a)[ Q=XOF+,Y]CoZ_c˻Rf.d+Jo{H]E}Nz ǪUcku9ت\EvP ~8^-vƒ~?+:sW5/Y!X/y`ՙ/_gJH;G|mN#ykugg5?U{?a3V;3/v#7\+v+_{yGyys.FpU~H˾bg[q1#Lay6Fu]aOKY~zr8bw1]_.nc3 *XF׸W~Vtxhu/)ɷ[A gjE~| *A ?Й>2W_<ƯrmL|4>ju伪T1_Hc33#4oAp읝٠=ez,7\ҞёFl(}G֭[ ߞ74o~`)>s"ͥ룕N>wzbl:. ز7 'v/~BqS}/at+WALNM6 nMmPc =qB3Nc#|˶C|d3yEںS< 7\Fp+F;җ¬y1םA}51 ?}%/(fzrxͮgh%oQ~nxtc&m>tf7 N4m0hl'_t6h(|2tqN'Mw#z9%LƐ3xw^.+ hIdM^uݷɞkc!õz*6to= -VL;d/XRo8 ١[HL0CS7vE4̛0I1""HȞ9%balO=xس]my~+)t&6>֎|Ug;{xI ȗ9:s 3f8"ꦍ>V+W"oMy hI.2lӔoǿܺconkWWY^r;cJݛlx.x |nyk+dmn1Z;ikZv [O=7i<^qvb:_wR'g .ٻ3ۿ_ !"8΋|XԙA+¯ȷi?_10g_ nc0jO| ߷QSω}s |c8<Κ:ic(Mj{tVOCN9=E>C\Pls$:GM& ?${pooNOg~ە޲a}y5ɸZ~ >\U>-ߕ?F/y`/|һ':S_+Z{6/b߲lr.zEݯB|>>mfgZ١Gg>?Ś {g0z\ca—웙xV~2P~%O jYUkOK8#=tbƒtnQ _~Sw.Γ|D[x|,5`{{).g4-}e_-gF|ܡ*9M_׃o>RC?hnS lm6Qstge⚉rT!mu':̒TYl="{xѰUڔ{W|nzG*n,mOb,,nc17ϏmkBk9XM]umrKXgoޒ?>|G;ӊGq`Ϩ7x=@_ Q^a*h.]l`߹'[~!pjA{v s _~Y~3yXx8Ÿ@SLRb6`~rY[zaiS9z^+SvlqvXpQYrpwJ?ǐmI= .^:C%kx׻jPscxFGg&𬿉{nә#񋘚yB AлM8SOc Amʐ!VlyyÇu yC?AM[{ͯ{e5x7[ ֌V n˞/py}!2k⻳Ϻk,?to wF6}OІy Oۙn>:!Фovep_\xN? ons#\sKzbd3|Ȳ%k~2 Ɍ:osS-<ר6uew}TzMp[֗SF,t{:atŒ]ӮɍVwhsY;aA4X%3mA挵u'Fuvq@gxy_B20ƹF~F@_F/fgvug ?357: k=<450a#/>|aEn>֐*\ۣa.4~X?<ӳ>XKU|[Ά8VNeߥu).S̘:E=t ?/IwOt }79i14Z8ΰ!}b @K1}n4CTۣ5rw%}3\b?׺W:_{LJM]Y g(kcືihm)hgT>:i_rNn_Y=ѥ|?u:!i_td 6b4xgVfdSȯ:WקᯗnNNs8tG F~j0mE6 3Z^4icGt1Od36PuۺKݷmsׁ tM]?=k8ļLZt$#|=yexqPx2ɔmD)Kr 'L9οc83oEpe]6@AGVd2 !Pomޒ^d8b|kz?"IA g;9?jEyqs-{c~8 ڊuԟP/]@ItYפ+e13h늳Ӄ~L7K[^8W>Ԍ|ShVhcO qm@w6_\6Ep07 s+nu+[ocZfL{Y-Oawbуw(x˹U>״7 ϑ->6L  o@S>t}_h 5kOqo J ;pMrEq"~tV(6;@@6ERX0:_y?zZU_d;k#rᇡ{7FN4n[縞 ~^*1v0eW;[ec|i5d+}zὠĶ (3|t+du07= їC\d/}lj!}SI%6< gμwg`ճ} [9\٨z͔AKYo]KxYu7x7?->s76*psu;m4Pg ɞV^կu tv霸qkn=~aYL bokk7l m.z piu,}- 7J?ȗ;䫐'2ƺٮn Wocߔzgr]&}a.*7vGp?OJ~(4u#o9n Ǡ̹E3+uW+F [׍gi쭭gbW4m&[ŵ ~4AFXv]3xe6ߥ:Wi՛7{!/Ե:¿D9#ܨ#vtnWP&|=%o ]*2$ysC;ӊL0`m&2sx/&=XExw3a.x5n>a$l[ºсw;Ig] ;[ĆV\;ZP|l㌅tRֿcmChrP^.ު _dMQdasl]:.vYҙiZ/a7588ыݯBg`,8?ߎ2V3x,#dxvxi| 1Y/ߴnmlA֡}#흗 O{OxO{:N[տܻ㻨? 9BrOÑ;o<_(n*Bbz8{g}uOmo=&$W}+YޖotGOGRvitr"/jF,pk.e7 ~ev_i?|ft`ŎӜ3|kk?3e2<8%*[Cmcg _3g7=}tM{9YGp7VmVΚA1BUЇi>xu1[T쿾h2/C->+V^A>:6~sQd}$9fBFq_trXnl]}P12iam>@j#$Abk"[rj96󿜷-l?B+´6s!pP}  k-.#KYYcU_ 92gRv@G޲2_RwRtPzTd^>Pr3+P3|nmo;9M!M7h t^:CC^.3.ҳFcogV1RǬACUXK;_M,;kṈcϡ>?=og8;hzSLOg+x߬/:o?} yao#Ye924KnLl؉6ˤowgxV&-:!3tc?wnd) Cz2 {myĿr݂^lUV{]I ;S}ve0=|~ _>w#BClj6'Mjƻ'u]d\<#A,s0pw ]6;ug<$1t ϣ]`Fp_t'uZq2|!П%v|۰l\orFbEQ0wؼhp+3>;E{ıΕacC™cb/{̷C܋^a|qhGC6~M_!6Cd2HZAJmt91@iuMS@sA]]#2^.$=pIك>ek LRb6 AqsĆ|p=z;a8V}W,$x<=tk?rzYqMxl-~^>/<2{A/_,=7LsXv4^,TǮ/{س#iA[yӹC": \w P Etjt 'B.K 8d- W#@ ߟ.A g ).G}l]m }=bq^=BN W) pڇU~vd g gfXggEw_ED _͹a}>k= 2&N"hI|}W.K"= u+F]Y16~C*l'w_Cs&hyzIƯ1Ov\lo7l^q}Lg_c῁dh6tqۋɆq>΍_, [vi{G+ökuX݇V amcoUq5l,+>˜ni|5ǫ1&GH:rk[?gD̬OJ8"=[OoJ}+{^ $d+3y= snT{||zͶY1[zCwf߇e ̲eO{ԽK{ԣ:Qw4~+흒K# 9nM_C5%)v.uCB OAfg lͣljxwo-dѠ{)|\TU&;='5CgZg$|l/S "Lm6G-$ :7cE0SgM4%Ǚq 1lh/5|plpoKgA[Gδ'^MѿJ͆E'ٵwm m+%ֲ)Z9!ϱJp3s^ݣ,5EM#Y'[[wy蠠oU6#dPtHqn%8!V='DOTkX`tLJf `F={d˺Og &=,HwSl+A^y_߼3_g{ H}?-am~kOTLҫC+0˶gj`Н*ux>l"Y3̿b*弿yq.#󹃢#Zчw'1\^:sg>/Olհ0n _{ 6辊czWn|!:W|EFo`#9Ah/1S~">Xtěq|F ^53YnjsA[_$x |cyv5ZO n0=8Coɤx[.%ߴц&|3ޝ8cn@kx8!{{X#o_uTZݓs.oH\5[^}^hqnjӹV|{'"}Huy'7q\زYz㢻ώc܀ۘo6`cÿK[Owa&fn!'x /ӹd [xE}R恽l᭒A]}5&Wȃ`O>e}43@pr&x ;( 6y ;r\ ]~f3t`ޞq4THaa|l9g>:Op~¼|FnzIm'Sc/->3Ӄb?Cϛf} 3qQ;y&o_b޲y"=Ag U\S#g~UuWw)brY}^C緾bo#NK1o?L0hƷWO=KNv~H#EAϔX>z6݁psmIV&,*96lj-u>tcs#vtNE2oi?|YrW {_ٲd7Lإm=H'yAϋ4g`Ïp|-8!gءqz(ǒ <&} [Igs[;2/k:c/O[5w_M>ox䘏͍16u?@Mܴ"RwKV: UfeutL>"&8Lvf+_;zƶ~F#Rd8q.s^>U:UkjؗVϩNa&y0o&D6 ͦc\gLDǺ7zH,:Gϲ #]XKtǖ):q|%}{ :Sd?ӱ Ly d]ip`4|~܇h)>CG8cE  z,Nq,,/z/}px:caB7^cpǸY;)8xtd/.7iil2φWjFeg]<|[g2:x-ʻɿ'W{c ͕e};=_5fFzaz[CMdΛF@wAlIGZ3'= \rb#\C |u~7</kr3<&|3} ֍>O\ ûO67zp!:2DgxKG\ޣGǽXxre>o_KGtI9gmU,Х5Bqx8#K]`x!O74e, :5lPW8ޔ?o&5|nt>y\(}[_wx;,Og?/{wLkm-)['^'i{Ye a_k?6siݫtS;oم1XNgS̤op:ΝX_(w1ndΝFnc3_5HE=ÈNס0sq=auzk: v!~ o'#8}|$ӗ)CvM2[ksඦsw=u:g-;^Ҹfb]}p@fֹ].1̂έsE ^a_.6Lsb"HلV6,F+kȱ;>59ùlZg?dx\z>&)Av3:^Y:f|lVӞ _5:Ty 4SK[EywM.r-3l23ǚ|cΑAV ?etch{V܉;t sYL=W=ygwS"֍ d.ݟO+9ײv{` &^7,Ɨ9jes϶ Oކ\018~Gż#X~kxm\Ɵ_2ܿinοү3w=&>wqfZ+Y+?7ӜK *=a?xַֽ$W\ǡ *,Òt)+{]QX|jQ>Qt!H/)h[}/qOM$ A2x^}L|bhߡHAtbl ,U6MY]~WL 7G+@x^2Ѳ |+}+x*'K[6?l|ǒI>˲tGFHmN}lc4"5?ɶB =z[.k~or0xh2Ƴ^'5%a#?]ՙ|б_F#?ke6? `3ܥ@Zr3si;=O;Z~Uhǣ}H @OX.mc.=(Ъ~Y\RN:8\cԭL[ϊpA._ywد[ţ#09]N9 7'ԭP:L wX 9q# ۏK࠳;0Sn6m7IQ>v[:>Eq/800]Rf -pu/Y~4 pޥsq[]|0n灗igRE7^DnDΏ`9oWߤ=}/| ΑV׮tUWvc].̽0JI> ^hsro##o796gAB7~vwӱ$ypKb_PE'g[q~-%e9ϦA~'O|?GlGHZsj8kו tG^*nŠI5%7?i|8S5pI8)/l$5̕.2ڛ>nLg:a-5\>n)Η^k>yu߄˺xbL?Zic}ʑ hׂklWw=XY/FPL; 68/f5Y7+Rl&N*dt߳nmWs}]"W~g!QekIJ;%Nh]q?M>BNc%5bG祧k6>ss?==_n}'&0rlE_l+5_+$}p |A5 fJP DXΣV1Kcq`5p Ngv:[?ްm _~`;ڶ5{?y9Z>%ٳΉYɔ\ntEL/^A< _ul ZH&CcoW^(uwXkːo]FUg7;2e.9'!#>OxBty<+#[7{.uoUykVk"{۞7@gZ _| 7 %LѮ06V^jjH0|9񣾦ӧ_}-$[*# w~Hh=_QR# hkP|ܐш4hq}7{4<:0>ڟ9@?`?G b߻ډg'1w8HʛY`BWln/_oBODvWIk1i}W;җgs.죝YºߊuWۼ4E\1۹ 1f'oo=rL&G;.}N6>3Z|NjG|>nyjpۂUaDL#HF2_S\kC: oϕ6nZYwbSetR,MUF|:{|y}rFOE<#8^8_:VaάVbҶ#c/y+F3@<}kt񢕽`vz7 |wyU:gb2}#Vٷe!s~ >W,Pzǜm}ϴs^྽lZ6V976Z;I&DSl :~l%g"Y=ٵv㍱Xލ~:veX4tп}^~<&z^a/=ے=rcBߓ/$q+3Mqk)㻎wx-@׾Ų‡!zM/<n #F?)@=}>˿~ 'φ~>qӭ-|.92ٹ6ec8(>x>С*/gWVЇ*@oK?@[Ϟc-)ʄsr9ߓ󀢂1`@I*`X#J0bB]Q bLp1g׸ļUiy ~ptS#['vqE4y~M,5. 3Y&m٪-7[jl$]2W~}?XKiӐ'|2_ K?u V϶>rwk4y׿3(g`{Vj<؞l'?=_4}nAzs<#}Ҷq<5qgm.S}ڥKeJ"9>6hi/Wy>}=>izVagroG<_R|> /MKߕz$hqs-\oҏZ=>{̜yU|KYi/GoPEjSԥ>tG[]U}g˽d9IyOֲ>y~K׷j|>>.]+?`Ƽq>]K9&j[{S>YVu-={Xj,ej,><=Լ9'n`P f{kP*Msi~oa煖zP.uGaۙoix}/.mɜ27<և-5f+}ɤOӂ+!] ׺s@sR/H49!Q͒9&_3z};n{2j\D9Oǚ"깬'6KTorMzՎ+9qKK,9G<1`9#hB0]ː}lj.{"R#2.(X%wr2rqxҷO/UX>pn1l~ܷcq?y2Π/˻̄SQ?Zj{ZkӜi{iϴä}drqoF߿>qszoJUqsrɽ4U{q[{(/Z*s22?G=,PFdgO[^woܫv@\[[K;:בzSfR}>.i܁ϝz.f\|8{/o$i4eN'\ lz,'<}9qsوͤ@[Y;c\_,4{g<9mkD> rr-e#y^i7J} sDO8(Eԑ <-jGu_alb?sEʹ=/;]/=om얮6!~䞦LSۦշpwWOwLR幚=ci{+Hꇪ?pktH }qwIe9I}$N|B3WI?t̫z󕺰RuعdftO èϪ15u2&yaKiہi잗e%.R_(8&'V]tm RGHVJ_o.a$~䗶]izH[W!uZ [x$ă|O{na>-.Ųq:%LHgQi~%.B}ߓs/4ܐXڈd~--Vn{AgOֿ1=X)t=זvedR'rzpIۡ`I;mrJۼ?\wQH;xgʹHdnlqgq߱=MgT[G5~&#?/*uK)ӪḵsGt= ]/~Ov[׾}[}^kqeR'is_u/Վ]^?rN;Ү{f}gm뙲?aQf{UoR7{vmyj }r,.^jYwX}+u~nusWug&t?}˷<ŏqרrtQ>VJVzIڢ|Ҧ'1彤f"c=qҎFn4L|(j}&ykI]m=ջdj̷1qo/YFmQc5[Ը3uzW%rtDjS~H[6bzazx%}s@גz}qyeW弤.'m_|&^ɾɵ/GV!\i{= t@R ȶTcWE^|~{?(sۑVf r?@ye-mX f5SgOkB_y 7!,q~9^zslΫ_2)CG9"תؕ<7ջR߯逞V϶^J/koc{1v3M8̓gԸUҎ(Lj檾K}w<cX;՘23;Oo˼5}mH3-`sԓ.;Mƽq=/"S}~e{K8CU?J&w7lYFX|;/uHv~Os2'[ p}{W[^Oa̼j~>4R1rJQOJ7Rc>v?l~B`KY5VeUm~\\~}9K{^l-0~Z9zol+$mrJ|IX_{su}Rs+7Kwze﷤,u(io՘'}wc,9}oUH/e'&ʹPOU)xb`v.[܂LEAe=I!c^nN Ii}N\☴NJgiP#nl&\WE[#5#]OnK[yKȘ$>b3 ~8Ok^zSF>Tmwvϖzвqr>{.+{K??-.'ϡ}Us[]nY9q}[7nGku]y>OI}lcyWﺒsZ}݁ct:x{"]FgioB{uZ^{H{{w)'p'=&S;y꯾&};M78'|_,t}'՘Os'1&gF6WU]Xq +n/wizZ=W"|:J׃U͝9+۾R2-.EpaxzޒrPM~i.gӰ{y#6QOt}R}ճXזc-ueدRWVcJ]4[Ჺ NLUA)˽A*7l՗]cX8ϑwm3X9}[9"m4b1둱Uݗ|+-ik qq/1 ɳ-=I?~N;+<' Wni緯Qkl v*V{(+WmPGjM#oI%nFGbzvM$^ʹ{/5Vć[iu}-&,}/]r̑;sA=x{*%TPccSϒ:SmC}x>9>徧0XiֲR8sm7`}c7w߾Y''?û1o}ym/1#ɽq{F="4)io)0^IY淈`w/(R/'2/#ORa;{6('iz:Q'Q\8rwurܩOzM;i R2^^|Jw9~2NuhiWϹv+K<@?3^HP_a%e^S^z>zs3L=Oƺ|uztiۜre7Ӽrχc~G69 VDz"˦-~/UsB[y7B]N[1K~VvzUK5I8wNq}>UK?/is~]fַ[?G{rK-!w*J=zO~ˏuKYGCz~ ؓ}gJ([lU22.8|-=H;-5V꽏3I\٩'5烌"ջSߡĶbl2[܎m=/,?Kcܞ.q|Kl1g-m{#]wP|BO\c漌gIe~@Ҧ*(5G9>r,{$bܜ<5IWSt_-=pz[G~+K;Sy-:ܖUw7ۘm,Zܪ2cz>Ok{x<kZ27Pi2n!<jQy+C7ay:]%/p}ݪz$Ξ`紞gWve|I8WAl`,Zf❸(?b_{^oU?c_ê[y]W=XĎk-UU;=/0McRwlV;]gK/Ĺٞ~ȳnϹeNpk._/:1\g\/~VD=zeƲ{Wr,-wYom[㲼zoݗ/W@b>#}]ۙ՚X\Q^[`W<\vOK]H_&ץ($C=WiH>\rc$s^I@eeouoX;ߋu.O?}'zA%ϻ^\r=rr9%Ե+zs.(v|K↌aG{I;oo22rr_ɋױjY<ýlk(S_ uAWMΡq,~`klGxǧLb3QحWs󓺧ܽQI SNסQXy{s=^9s[ۏ=۪-ke_}ص|n{K:3\R_{=Mz9#Lq@'ەz >#c}8+u? ^8rq7@X k/AyPA([PHW,KI\q'@~a2^y^~E>qwޯ8O? sԳ.5ͩ:^٣.T8կhOXz}o=oV93|勖vE=#g9-3_6MLƮ6#3/4dKʩ@Y^N=2}罅KO>5=tە}nDRj?ĕ}#-5>f?adlUiwU8nݱgs?& !+ֿUm_EwOrNsf{ ^w%72C$P_cڇiSs#V,a埰2zxj~]ew@r/Qgϲ<:> >bZ/j̗ws}>]T\NP(M"8_^쓾gsf=ӳ]6UKER_ X`YoL>q^?DĴ#(1& w%t鳬n~KG9HM8_8S1@iz&=?Yjܧrs4oxgwݧHZQ'yU_8( y/.jvH-/#n$ߖ:H];q6-=QdZ8IWWc_cKЃzOU]VfrK=LW/Q~^z5lI~I޳IYPr/j~X{3-~CR_{GNnQq7.+muHYUy{ha*049}tR~?uO_,$$D?c_t[u|֎#Tm}ӎ+-g KoT?<'C'u5i{.Zsu)u[O.Glj=!$ˉ[ŜnyeI+uBgx4}NRScTPSC *ոoj+fZ}%jA^D_3{=%.iv٭Ts=O5k=ui6Kz9.s^{r-iqk}ǶlwǍ.ko7:ն}moVqw=5ϳQ۾?.<bۋbw]S77{ˋkc}}9u^c}}z8v,Ʊ+C__uy/N^qNߺ՘?~~'}\>bvĦ7v\ϓNď?[˳x:z]]'c6Kl ,:P=&K=sˊ==/$M?.e} &=g<9ee$=LcP>ʟT_?XVD~Qp`#|q lt^>/9YKG$~q.}cKC8Lsd|fﱬ!e]>і~?9K[Ig7xWTO,Is–&c^8{NS=ޱ]ɱz=}i{nzSH/+}#5Z]rnawUJϝ,̓ktKK|UρUA~}VR>깧03xkJ[}^h_=o~>lҤ/:{s>4iLhjg 亐gǤ'dw-ScɹJzFk,|R;z^Ӷ6tgk4_~0O;glYzv6#bE םzPs8Xu*5xFf-=,O+c,*J}}r/Yr/+,|ƫW߳T*5F\/w됱d fyלWC C?ged8{;,}ݵls ˾˱69(b5%UU2-lP =סu\t׫잧PZ5fPV996relE~O&q%<>{s,U_"OђGJ'HL?uZꙃH\/~Az_'k6}//;]+M~;>FYޣLGi('\ީMK,CH5>|__Kvr?,Nky\12g7g%s>]<e_ M%t-unqޫ qV\XQNƵ{y~U=oyܕđ\j[#Q~3[۔>Krlorj %۴[qm,wyWCR)!}d= y'< ia{#yLԻne?,xE^</~&㣨gIeDsLgYL\A=)K܀_Xzc˨]Ҿ_(jSnm9劏ˊy7Z=x؎Lۥ^{Ғ_-[K~@z\cRQcN='ݒ<B1ȼ-fZ]e;Lтtjܫ抋M,>Ǹ:-Y4QǠq2!&uۑgPrn3'^wg|wyǔ,>ES''yU>l0Cœ'XyM?q5~{z㱃A? \Iz^כA:jc/dzOXQ;=O"sOϴV.g%Pݒg2Y=σQz>}A0PčA3<ծSc3?zi_ ]\K^q[Xj D?]-e>/%.?n1ݟj܉x}M9l߾y19>5. MGNڞ$*Ȼt]RzWY챺Oro+&m;’NSup9?kORտnηǘcCL1Ł}YsnI,&n*v) <ǽg,{TzK'>$?kgI_{uOIM-W[7YfG-s= gl;BۼjG3#c5=3]I8CoGbu 6RWs ?wjGvIW*(}lwh鎜ff[I@ڬL]Mqi{==fʹ6,=6[<.tvynM+X= e+< =3j7k_xsv.e8Ҥ\}M;ˑoߩf˘ ٦MzؠqC~D#/%m2&uTżt||.u ߮]B8*QyKr|/ J(}/ߑmRrrOI}sK{bO8\'ovg./G{vke_i~Ao3T=?jXջd^%BҜ7t:>c,3}Vluj i6~֑~-V%`sQGUĭk-/7W,S}eޅv˫1S{!ޤpG5,侂vęwu?zuz09:]k?ݑDc%E~s[r\տ@8+ĚSUek)KQH*~dcu[^WJqLsx98K9f^q-o. äZ @}$**>7WCh-Ot^,zBb!KdsZkc+1:E>;ySMֈHrg3ϵ{tr̓MrO{]c>{/ޡ̝ۘt?5F#/{Wvlw#9i)j}X#W Hl~S=]?2^KCx/_\~s][~h&m168U_'jy[t,fɾw7"«{R7+kSu~ߑ.k[eLJ^x5+%;5U&i};^>BY+=.>{br9>9ϣ_27{> /IP_|Q>b\5(\9_= .i=+{Iیiz(ᜓ6$qzȯ;#OLz\߇qk}Gx\'kU3߷5d9=:LS.>=-[]T3s$Z׿SuoduJ]FWn=/'j{[YyEn~_bl~Rr] iX-τsS kuS^aI2's k+2I)]UڹᲜroy'<WW6UcP_/Gިz[p"K#,;C_r\#[oYӪ{N&rM{ZW6{>BӁNSg}9o'כ}U%fypWuaW]ҥ.vg_[S{{q\;;ճ(=Mywrζ4T۪ItiWuKU^cئiIxx]c ܦypP@ں2yf;bʩ_^V[݇oz4uMrOTs7smeU_7t=wWZy,rRڮ>iS%W ʜ .B u%v[WŽel%"cWۜ: w^l_#Gːya3ߏj9/5H|Wo|LL!ӪkU3-y?}]ZgleH[է6]R;n<_0U߬QN~zwYQn:aruK}KeZU«Cj\y*_^# ϺWY-7e[n㑊[缺!=R,U;s俒{]ro.=2&O=?Ҧ/h5&篴 oT#GQ}]e.r/ZƫEr aWΫOiկ",uޟd{^l_9w󧚸/5'[و+=/uLS9^o"I|>:)~β9k\F}SM}O"?K\T5פzN᭖r_XVE=W᜗+LjKY?VGAUgF┭@!xSuvF+Kj?]N|ăxΎ]ݵւ=2t#O[ A$=;b9Q=Q\/UeU9U-ʹT/'f#Mi|tze?soۦ md'cQ' -KwSCW. ib껨;XiZT<ئ`j KEUԚnꘗ7[R޹,̻-Kᒼ-;hn.zoLm>L5&PJ&_Mw4w[m>6= !U' SҌ)M\zRvixoIw84em,he`%ېse}RVIQQSG'LKܓ4꣣փTkEqDgX,!i {FlNs,3-(U-l"KWw:j4&MrP4K7+]dvq_o:Yy؇:m<:DDw5~OΤJ*$L",@jio^KWRmۊR4^Ku%TtiN[5t5Er[WerkMP\ K7*,VDwhn|&UZ_m $+|mE,ɗЯȗ|ij-/ iJ[?ti>pEmZ~Gn mGQYʱҼj*BTw6VzՅ瑡#ix4U. my߂ti^&3=,8j曔c^#y]a!TZ>vI?R]$T4m^k&pz0>M9/nRn3.;ҔIPM=R&QcY8zQUL+oتNaz0WurpSv`4 .Ҍ'Mr.iRUzT]t}࣪K>J2iP]>xK4Kp|Rus?r B0Q %;F!áHs lK.XnQHsb JRUNqyBUTWg@a.>ztD/bWK]\؏KOVK5ʣq MCa޶$M:%<P]p i"˚\B[-7xp W6j;&A=΍+p#fpJK oVtGs:m2Z Q4-{OUW*{'Ud6od-Q]?M6[H7F"y`1я]鿳u#n#ޠ6 xqYw21^\B5Z0Mg7!= ^Cnx+c2wxƋwHj?C^C^C=>p z/^ ]TeZ*轁m?b55,?/̒nC4/ ǼvHwwy ?CzU7pݲ[( 㤋j[^Dc{)_5 2P; /~ |x .?^i<@Rj5^/x-~'G}~8oǂ~BUsJR8sx.!X,CZ>˾c:>˾ͣ*}}W$_ZwG}|pe*v郇>x胇jx(Cя~I>X'z` u>Xm>xi>'Cɫhԣ,MV``P.`%kann` #>b #g>⷏#6ˣeغ#._'Nay><#&i>b+R޽fr2Z"޲d;YqGg}kGk}ZGG}Zy'/5_ﶾvIM?pGpG1=?$n ~XꇝyLfk.%[^|U?\cc~臏~臵~X뇵釳~8뇳2ܠ<蟛G8aZpWpW* mX?X,wBYx-nle[/XmlO@[ ?!Eq ?n-]~B~`c.f ]`i&nyGm#H ᴼ&)0Y gx, cy?pҒG,ȓwKډ9:%~.eA5E|86٦a p?>@'9pN p^al|!j]SaN0=0\; \g9{m6lo1o m3vᦁs\~/1ƅyxl 5WyEu_ տG8k_>adq`̇l4^kxl A<6K .ąp0R_w"bc na5A/q N&^vf_ޞ6ҏ-}l.=gA4xCHr AS:q cw A1;qG6gk"8a? A1; ^ĻxZ Y2 d/ ZA\+ ķV83}/۴|^A)xoCq >[xKD<c8R /A% mO[98c: , ~|2 JA8cϸ% ?RΙ&tAA8A:Ҿb`kagfaffah^ffafOOaOk § | §.6/+++p+p+'4 a@Y!W!W!mF(S!85!X5c>昇E!Q!9!8T(L%oQ,ByJ:yek>l  PG%۶~eY[`ORބp!x7KC&oB72720-B0-B,B,B,t.Bp.Bp.Bp.U=!q!!u!Xu!Xu!8g{.ȿͼc, 7C2#C02C01C01t{/;% ૼ>_C5_C5_C4CC05SC06We< < < S5ΆlΆ଼2C1C1C1C1e$vl~g~g~g~g~g~gnfnPs\^_C5_C5KC4KC4_C4CpK^7-Ƀi!i!!!_˗öl \ < < L , yRKQaosϬGX}K_, | l      W]ҿ jje~蘇!!!!!!) |   UiFz06 S037a303~G~672 gAG^6p6 3ð6 702\Я 0 Wk5 'p2ԯ 0l 0l 0l 0l 0 ì0 ì0 é0 è0| ç0 ܖLo.Xf&ߙvYr7vYNS&[mn˞1 ð1 ð0 Ç0 %pG뻽cala_22|W4a(Clc~adF]ޅ]O _a________΅a`օa]΅\΅\΅\΅aXW~W~rp/ ð. °. - -\Y;`aaaya{a{a`A:, E+dFadb 0 0 p0 ð. Ճa8~Ƀ-[[,=x~|7axYa9arE><.ϊ|xoaaaa8a8a8aa8{aX}a{aK 0,Wa_3mYe}4 Kð4 Kð4 Kð4 Kð4 Kð4 Kð1 啎a0 0\TC\xk0#¼?QƆal&F^E`\q}# F``$_}8KLlФ]agd>^.g.,"00"p0"0-+#0"-"*"419o嘇a]k9Lð|mTNES>ESDwӤQ.ë]]%iǙ]E]E]E`]E]E]EZEYEY.E"  Ed_N;yI#l$M9ͥ G`s6G`s6G`z>GzFG`tFG`t&GtFoF`G({K;#:#;#0;{#7{#7#7{xwwxyyu]}kn{98`B|&D["xKi&Da"K-%DpY"M6D7>g"L3|F^g"Lw $DeKs)%DnM"I_'$DnM"?M)<%DS"xJO)<%<%Dx>Gd(;xGȒGKgQ'] 8L0Q&Dc.ixM5Q&D(N-o&D(UJW6l=[2ZRm]%y%yuvmy%(vaQ*GE(.ˢ8[TQ*SEq(NťT‘_Eq(^#]6/e(ŧ8Xp[٦oÿu;o,{Eq(şQ'D(ѢX%ep(ţXOKQ,KE(śxSo>|NQ*;Eq(ŝuIËxD$G:q(./E0Si8Gtr,:uL0Q$Dq(CxH!Q$Dq(.EHŽ(fzbz_b/3~up,dO|(~ 8D M:~/8BGQ<#Eq(}Q|#oD(7F߈Q"WDq(.%Eo[ξN\&De7׿A2xZ][<,Eq(ɢ_Q+sEq(c.e(^ˢxY/eQ,sEnm`Q,Eq(8X`Q,Eq7ſW_Q+EiâxXaQ<,E(âxXaQ7cf ߌ1|3op8g ׌1\3kƎwI;% '1<4p=cg 13o;ct?–wpcxc O1\.'pbA `z Ogns3Ͳ8jqqy&p.ûbL 1<\'BGKMsu<{2xUKnbU O1)?pãbS wNT Q1<*:4>åbT 6Wp bo38K G1!#ػixCrrxD 1#Kp>'b8D 1<"GbB W 1\!'bB W1 +pn bA 71 pn bA 71 p؏8B ۦabxB O 1Ɖ+ipc'Ɖqbj'Ɖqix'ƉqiO,88N,88N,7m0819NLsW-\'ljqbx'nljqv'nn&^ljqbvWibw'nljqvKRWJF |($pQ8JGI( &$Q8JMڗixKOI) %$p^=GH |$$?xGH \#$%I# <${$p?GH |#o$7CH\_+!Ck$8CgH I|!a<^+l$O$$N'Dh泶Ip$ $,H˓$ H£^uLz%mp" 'p" 'p" p. ! ! r[Ufkٹ 00y5,;zۺoIII8I8IIXw2qy LK>oA>KKIؘIؘIؘIؘIII8|>,:3o{c &ao&am&k'al&s07 s02 #02 S05 O]o[7 p8 wv)I3) p9 p9 08 08 p8 p8 p8 p8 p8 p8 p8 p8 p8 p7 wp7 wp7 wp7 wp7 wtɓtXIXIXIX$g2]V.04f`V ^`T F`T ΤL ƤK+ʭSUr/Zc]/^Ru[ξ=S=uu[R~w ~t 6q >s .r .r .r `p `p .`p `m `j%y6up p `q `m m `n ަm ަm ֦`m Φ>g)))xw3 S7{S208S6oSp8umkaqꇶo)x)x)x)))ae~XXXOX782tY[OysnɲniYyoYynq;ow@+G4n%xdLi<2Gt̥IY3sq4Ιf4Ι98gLi\3s47ӸfLi\3cq4~/-w?R~fmxtNi<:G4ƣxtNi9?4ƏqgNCixs.i7sYNi;_4~ƯuNi<:G4ƣxtNi<:G4ƣxtNi<:Gq4~Ƌ8nMi7æq4uӸlMi74ޛyӸmi7q4Ot;}ImyMi<048^Kxi|0q4>58_Mi|2q4ޖOI7i&4]ҸJWI*i\%q4nMo1e/ZPYn:߰`neu˺^`e.XPm}o++z^geq4b_Li|1q4Η8_OL_ q4>`Li|04. `Li|0q4_M8%'4aWLi|1'4~ xaOLi0C^a]֥q4|O4KҸL6ac ^㒆asަahhh/IRfe`c6f`cfc>f`c6fbfafX(30 30 3}\&Bkn+SxwxKZ% .fZ 7 | 7.xxxxxxxI: .t 4 7373737373'ڦpgpgpfhfafaf`tFg`tg`pg`p+=yIl , Gsq>Gs1>Gs=Glsq=G\sq=G\sq9G\swhMVL9#7CEcb}8s?هa_}KxbO9\1+psbW9|1+BY2SpN)s8e7ᏹm߸bW923pΘs8eo]9-{pýrW^9+{psW a9<,ïrTT9*SpárUQ9+cNçrTʽeX9*g{v Ε;ߑJ<rxX˽6orYRG:ro1iZ7a9,pnrVY9<+_`\pr8\}p2qi9.pNr8]t9.r8\n9.ޖr8[g}1ђ\Z90ns]v9.p<8]ty|.q|ʶ]Goz|Dg? փFZwֳ~׮lwm׮'.~X:\Wryrvs~5Ꜻf߶j=zW9MoSSs泎4yyyyyiyymzNy:[qǧG/HÛ8sgy93q<ΜǙ8sgy|9/<Ǒ8rGy9#溏3뾏Y~;ɺM%O!O!O!O!O!O!<yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy y?O q<.;/Y,u<<ߛ45//^V)ẋH-G\^S M)6\+pNSs xM)5V^(:qSq 54Sw 8N)6ܦp~SI xF(>"Hl."Hl."}"7"qH."qH\.lHl.b1Ol.U3O.V4H."qH,.oxEȔ!Eqq2O|."H."1HL."1HL."1H<.2"1x[Ml,7"H,.C71H-w"1HL-S"H<-O"H-?"1H, > C<."1H .5"1H .iM:1x#4[)r"H."H."H|."H|."qH\."H\."qHL."qH\."1HL.6M."qH.K/2.Y-os9by]$VEbuX]$VEbs[$&Ep8\$Ep8\$En[$Emx[$El8[$EfY$nEbf]umw="<(gz>沮,Y{E|e^p޿YVm0 p0ӊ0ӊ0ϊ4ˊppp{V Ɣ`LI ۇ|u,[>şncelc_lwEܣk"nR1qYFү;wpQi\4i[Q?JG (%wpR%)"%<؁Q1J8G ($%KpQ;һtrYf` pNRIJSXK_ +%ܯt#G7.Y#Kd酶iSpNY%Kd ,%/WJx_ +%ܯpWJ_ +z%p[f= O,%ܰpNX K8a +r%>V;Jxb (%![H *X%pNRmJ8[gJ_pTƒJxP *?%ܧpW]ͷ=O*H%SgL)1e<ǔq2RG(e˔q2PʸCw(eܡ;q2PʸCw(el[ܡ;Tp P*8Cg <3Tp P*B' 'T ~P*A?†*A?T 1BL+ B<+.)w,+0B +w0w4*0*0**0re`FVT`EVT`E6T`C6T`E>TC>TC>TC_}\^TEVT`Ea}q>˺~+ \ \H<ܬ ܬ ܬ , ܫ , H{K|ʹUηMg!QQ P!W^$T.XFl7QT`L+%`P떿*5ٖ{c^vOt}X6 '+p'+7++'+p*yp*p+*_4y_%3fAX8]Ԓ ܬ|L |٤W4, w7< , ,6 W+0O+G+9zq7&͹._8_^^֪*l*l ʟ(+m*T*>RGH#U|Tq*Q?xH%UTSLirI SQ TmY:澯SvWSvUUq*WŷxX'fU|Uq*W8`e+mM̱X._V ~˪q~sn܁k, W5߸qUW*^\kUV*~\œ8s:](w-ne^s=㚿(Vq*.[imǭ{.LJn/+#8|_R[W*^]ů8tlӸrgUKWq*n]ű(s)kWq*]ŷ8v׮Uܻt<]ŵ8wU]ű8vU_W*ZKOiyg.ipY^q*.]Ɓ8uLU{3'wV3*Y3k&gռi\spZÉkh- ᥵OkxO ?>5 pnTÍjxU L5ܩVͳ5Wp^R5\5\çjT S5|Op.P5^%jpkpk.?hE>R=jxN S5pnRI;ԑ'Pj8D `^ `^ +iG:e ֎5\kjkxF ڽgA:Lܮܭ\ܪ<ړ, kOBYZ58Z#f׈5bv]g9`j_#P_#`Z_#g2p A J J N^"G v`G|3# ^^H#5Q#5R95R 5Q 5P/5R{s% `B vJ O]]ܩ]ᘇ'5R=5XU+58S15R15R-5S5xQ5XS+58R'5S5Q5xR5b_#`C Ծᘇ)5R5Qo-I'~׈5XQ!58P#`D_#׈5~ v`M{/46/j#s~3_Wj0cjp_VIVaEVaEC=dE=l#fNDNFaIaIaN>D aHHȫ-ɳ/0_갥[갥[-7\wɃIuR'uxRcuRim2Ay8TCuS?٦aQ6aMNaOaSaO.aOOaHD~aEaH~KaOfԉuQu8Pu8PuS1uS?v ,lÝ:Ã:\É:É:?AaNaNԉu8Q-uTM\NqÄ:LÁ: Â:ܨÍ:ܨÍ:Ó:\ì:Á:|Ä:qN\:̨Ò:ܨÍ:N:qN|:N|:?0C//v, 갡N̯:\e/v,K갡7pF](/:O~~-_ uxQuPuS+uXS'aB&CVaEaHC>C>?O0309/9aI+FoxR'uXS&v׉uR!uR!o-ɻjE\Å:É:ܨÍ: Ò:LØ:Ø:1N||È:Ò:̨:|Ã: C 7 ߀ _(=H%  7 xр 8,HO×FjAznAzvAz5A Ӏ?m48 8Հa Xh:.ip3] pG00[o{p7MÚilii!o2 ljljjjj jLjji1iҀ/ Ӏ; Ӏ; xGGiieKU XՀU/oՀ xԀM ԀI XՀcoƿ/Xn365`S65`S65`S4`P5Q>5SV5~$\hق5S4V3H/H Ȃ<ф>s2 ?5¤&kfLú&i&k®f6Ϛ0 l¢&|j¦&Li&i&6_>6c>6ca^R:貎˂-wnay綷nmwmح:n% 2xFiM<4&C8HwhM|_4&^IEh Mܢ?4q&./xCh&o MDhMܠ5<ܣ%J>n%7V%֊ew(4FYjUM|5&ĩxNi5M4&{Mi=M)k` i-~oZO h-|O)ZJ Wi-_*o+p>ZCh -Z8C h-p`A>.њ,ɟ[n|5_Le,3Z̢|ܥp.‘Z8Q 'jAW)wnl\- p.¡ZP iI7>cZxN i:-\+p“Z_.ﲅU[ݷQ~+^ZxY /ke-p[ZxK k1-|sZxN i>-\ueZL 7j\-˴pZM4|㴞hq}ZxL i1-ܦ۴paZ8L i=6l3˴yZ/rC-ߴqZ[{ZP `iU+%k{{)w刯-m"-bs"V-bw"-b{ނ -҂ -xӂ-"@ E `] &f `o >`\ ` J pSZ8D h3,l,l-<^SZxJ oi--״^kZxM i>-ܧ “ZxR OjI-γc?_qr;Xaɾ;ys^>x81\t.q]fc?93'>ϖ'''''''''''''m.)))iia6Z||F|kgggg>sG-ܜܔ!|nF|s \ƎrX9t2n[Vf![;=c|?ns#܉1;91܇||=ܝܕ}(ܽM㖔{\fmP||| >'y$Gy|1|||t>O$>O>gy~33gygy.yy>e|^%|*>9%G %.o;.\=ɻhI.iy#Es/s W۾ qyAou|^5|.][('6l؀ v_8@'hnʯSgh6nþ6nÿ6n6 l6 l6 l6l6m6kû?٦a_h?10[ه9`k_bFaeNhhac^FY~m؆mنmXچmxچ3]l e}Z3Ls6ln6|n6jõ6jí6jí6k6?HSϹ9ϻ6\jð6kñLW\S>S6XXf+s2W6kî6jú7LkÇ6h×6jÏ6kĖsG:iÜ6|ié6iÛ6l?bb~ctBtb}X߁8ҁ///H!vu!wXЁxсx!wb~kk.k_ne2tےe~m<<< s`PFuVG::0[r0m,s5IzPFvahvahvakkb.lEvqvovo^w & o:Sk乭S}w.^Ѕ]< p 0 ׻0 ӻP]tqnk:u kv܏}-xNFkY{F.鲜@]<'uoǛPA]>ǺX3g3Gu.ߺG?k]\uq=VZ]\ku3',ñ8V_]ܬuuC7ǺxX_]ܧ;uq.>ŧTY]ܫ{uq.nͺYWX)b]ܰv. a/u]u_`_d~cŶy\+v.=L|]vq.N 8a]'{8f'=^ {f=ܰ lzxa/=ܰ ?}uI{];i/N{a=<~z(VZOD\/2=\>x `q>~{xKM}>o>{8O?oǃEG)q>aP7K:NiNB}<}<>sxNA}>e7rA4'0???0CG72>>>>qO<[>0g0OL><ø>1O#䝼$a@aB}'}b'}bj'v}bkڇG;ݥ O>O>1O w>1Ow>O>Ol>qyg}bb'.}b'&}bb'&}|'}b|.Xm]ozN]}zi=.Oqgs~ڟEYv|vKqo:p>?8I+lG}\G>CxH!}<}v62[]~úw/($C.$ /}<>~ 8^}^qȌ .oxp}<>}l}.i8p_|v;{8'qby^=8/mӸxf7x;}|xp;0/w p6<8`nq;8xp;{?tMfi|wp[\ҤN<wps\wa><?y3p.<]ovpn;x蒼-{_:?{p,κp=xxp=x2x}y:u5!!\!!l!\`>aaa.aaFa٦( Qk;g|mklY5C>7~dA%KG!1! yb7 q!0oo0W9qmCd~Ly<` !^1xgCcc q!118Cq\aG q!118^p1#?#?#?#x? q0'FyG|GyG{GpyGyG|GyGsGqGqG{G{Gl|GmX[,G07Ĥ;`V.i0~nc˻K~0F?#`?FY](p.1%Fg2#8#8#8#8<#8ߚfY)GpytҚJ8e8yͲx7#\aGp}#`^0%Fb'8?FvdX8geb_a0#<#?gFޏ`F`FLLl\ n0}5˾i?CF8w#0F',0F~_}6ߜ:a`'#`p0F8dE>0F8#a_0F0|$ !pYcx?cx?c|`[Lxc0Əaaa1>05ƺp1L c|`nn_~# k~vgg;aaayx:c?c1_d Kưd G/5/r<|Ö1,cϵ1{L1q~ Ɨl1&x=&c8>&c? c0'cX5)c6+cX8&=񺮫y~]Ycr?70| cb)t=X?&b_LX1&xg ary7L 0&xGx>8??&Lp ~0&\bޗaWL ^1+&xOObSLp 1y)YR]׷YΗʽ`>{e79g.5yu-*7biOM`L`Lp n4&?FhrKumG L 0X9::ng'pvg'pv'o'q'q'py#'0t'ckx<899/:6y[l W4770wS\`LO[fO74rp| } ߧ}3y `OOOW)̟),)\m0x p~ y y { w wL)"O\0{ } ߧ} ߧxOOOOߧ0 ;pt G0u gpv gpv 0x py 8VOaѶiX>S>}SM/ãmwY;mq>NVNaNMaM?hMS4YSx7wS86ySX65S85SS5[S4ES4CS84mVMMa&M?lg i ߰)L©)  )L¤)|Ÿ)<£)l®)¡)¦)lª))JSa ~miE2GS2#~Έ3131'1<4[3b<#Έm̈ɳm` ̈3b>#ψ糊_jYg~Ï~Fܟ#ψ3813x?#Ō?#ψ3x?͈38?#ψ3X?#ψ3bx>#ψ3b?CyaFܞg1{F̞gpa#fٝ]Æ1}FLg~Fg0`f~FLgcK#ψ380#ψ38?#ψ3X?#ψ38?#ψ3X>#ψ3b?#&Nw;,(6̈3X>#ψ3?3;#Έ3=#ψ3b?#ψ3?#ψ3;#Έ3X;#Έ3x=#^a˻%>#..6qpFLgrFg1yF,]fپ3b?#ψ3b<#ψ3b8;#Έ3b:#> ;#>j&Έ3x;#Έ3;#&ψ3b8<#Έ3b:#Έ3:#ξi3bx:#Έ3;#Έ3;#Έ3b?X=#ψ39#v~i&Fψ3:#Έ3;Jkgk38'~Ήs:'Ήsb;'Ήee5&P6~|Ë9yN91|N 9};9yN̞9yNl9q|N91|N9q{N̉sb>'Vωsb='Vωs89'Ήs<'Ήsb<'1eWo?'8?s0?|Â91~s̉s80s80'ωsx0s?'œ>'ωs?'ωsx?'ωs80'Fރy9#a~# n̉sb?'OsIs2sX0s1)sb?'ωsb?'ωsb?'ωsb?!s2!s2!s2'ωs0s0 sX1V䟻"yaa"3 _pfWpegpf+b;cW0f[e{g{o0߱g. dgW:6W8a^aa66aaK9ä9,è9í9ܚÕ9<Ó9<_<â9 ϶̷aESro֊H>20yew0Sx [vk0x0xpxX[k_oLBg%[eI-XdI"ٖ,PB&B' CBK^Bo 0P-_ʇuIzֳl7 G>= c>4a=:a39>vp{3a g?ǭk[-r^/h-1S-fÌv3bFc0/fŌY3bF[M1)f4ƌƘ3Z`Fch07fÌv3bF?}0ff g63`F| 4Œ^ 3yNF}0ftČ3aF?臙Oք\-3p3`FhM0U{h-0f3ܟ3.35}0~3387pnuaF#hϰ~Fp}3:aFM0 f F& 3`W~F/0ft og85f9vΰsF1#f6w{{}i23:`w?^h 0ftnj&3`3l g<>y3|̵aF{̼f>rf8{!ևx|!·bv!8zp&i&i8 B q.ĹC q0C 1+C, 8CL 15WC iӆC 1,iPdd!bb!n`#!΅_/wB, 0ĬBc8bO(?aI 1*ĨB 1)ĤB, ,īB 1*ĨB| *ĥB\ *ưB\ ,ĪB 1,İBL q+ĬB q+ġЇSO!bSM!N5a}!ƅUU!vbN-!bXo8Iyf8bZQ!xL7!bTW!.s< } `hs!vbWi!>bTQ!FYg!ޅf=, }^:qlq!ƅh{!^xUW!^b^o9-p!Ɔbc!>8l!dz#!XbA!8s??roa!քbT!v8s!M/!N'!6ua<|=ϯ;/Bq'Č3B"ċ/B"Ċ+Bt}'~?7¼ ?醿?1cw;?wx;?w2s뫰 믰 뱰6 뷰~ k kv k >:/O ^j 뼰 믰 믰 믰^ 븰f Ú-Z.Z//:1:1:1:1º-:..-z,š,š,a]YXυ\:yg za^aMdaMja ua]ua{aցa~am|amva=qa oa=oa=oa=rak^5]^\X[X߅[X[X[X5XX5XX5\X˅5]XZS7zO |WZXZX`XubX'ubX'u\EwܯZ0z+º,/,,,#:2#:2<{ܰ k>xհ Ȱ kΰ а k kŰ N İ k k Ȱ 뽰n ưn Ș5-ֈa ֍a pa}ևa}~axaM}a}րaxa}a}yamvatawa`#k/NJy6M6ïsu˵<_ '̣0\ {e,{avraVjYͲnu,;f=|} y9ˣYh=e,f96˱YβleO1k}1lI,e,fY4ˢY;-Y5˪Yrm,e, gY8YYβp,,Cg:˵Yrmk\,f5˷Yfclnle,f5˸YͲg_e,f4˥YrkU lsh=f97˹Y^2p e, gY8˯Y~lg,fy6˱YiUܚ,fY6˧ُpkϼI2˕Yβp,e,{f4˥Y.riKepn8Ǐ<ϼgrifn7|OͲjU,fvda??a&sk[,f7˷Yjw;y-9[{,gY7˾YͲo˳1f?Yg,?g9YzFk/9:{os|c X89νuF1vscwx99^1tso6ǯ9~k_scx89αtsܜ;==~w.cs|n? 4& >/-Y[ÜvF[_ CtƜޘs:cN79 14Ĝsu3x s}5x!4Ĝfs`N+i90+vF5Gimpnڻ[92]˜v.seNi92]t˜f?x賾sbNfNo917Ɯޘ/sΏ;1>:89N=7 C`N'陹gNC9=09tŜ66sZaN3i9}0œnsZaN+̽hœ^ s:aNi90?4n s_1a+oد/œVsb90+Üv saN79]14+^'x saN;q||t܏aṈysc=8>91liscX7Ǹ9qps̜X>91wsrkis< 3/7os|/F>3sgsמ];#9Ǽ9Eh|݋p/¸"\-¹"\/"<-´"00¿#s|VD1#OΙ1#f~̏"Dn8gGX1#fĬ=b>Gy1#w3:bG1#fx,;R w1#0!b~F"fjLs6bF{35bF䈙aBl7bFވy1w#n܍3-bEÈy1o#fl38bE5a߇53#NFۑys{߶w?˳oc~ܰ>FGa^yFabuEyg&F_Ea^F8aeEX]w&F{ƹ" 008W_EabFFL=싼=Oyi^GchG~GZ ">#+#<#|p?"h篽6GϽso|9=0&na^y0#ļN a^?wyy]0 5üf za:an٧w^-2Fkx5~}1w;;>p;izm^y6ټNbl^y 65ټ6h:l^kUͳz^̳u imb<{u|/8 y?yϳ{^ͳ{o8\?zY#>k.{=2?~N :a^'ky115p^3ky01{?w/| Wky=4sۘ545м'd^y]2uԼ~M:f+o٧j=w6ӼΚb8Y+kym45ӼfCi^;ky4uӼnMi^#ͿZj^Kkym5uԼ?6^/ky25ƼZb^kym2Mn92uǼc^y25Ǽ> c^sky-1!5Ǽ#6YȞkß˼ ]˼v2_˼^ c W}7t̂VX aAG,hM4ÂNX aA7,ha;N zc <{}^w>3g1 >ǝm]?x#~-0{Aw,kßyf-ka><\`x^-jW ZBt=KSIL/6ŞbkX.v ]`_Cٻ.0w ]h݅+.pw ={po/pv ]cxЛb_w=^8n.u ,]`wؽF.r ]>yyf,<u\Yx->-|g9} xy+;-(xeX,pd' \YgxF-l᫂5F-0f; \YK56-lޯc^3kk_Zd"ٵȮEv-k]Zd"ihm=l[d"9ȱE-n֯jWZ"L\"_5{["ȲE-lg<["YȴE-2miL[dQx/ʭ(܊r+ʭ(\+ʮ(*ʩ(܊*ʪ(*ʪ(*ʪ(r*ʩ(>e슲+ʮ(,r*ʩ(r*ʩ(WΌYM'QDYeAQDY ʂ( QD5fsLQ9p.w˹̄uND5f| Q3^s3zI ,{K ^bߥ=,^bX%/xK,^b8%.xK]RU!+쥧^bؽ%f/={=ؽ%v/{K^su/|K,_b˗X%n/|K/#?}38%/qv{.}й]%/1xK ^b%/1xK/ ־jdK\^z{F/yK|^b+%./qyƬ|3ؽ%v/{K^G8%.qtK]bC#:xC%.1tK ];%-qo{K?^_>i;\w~_xpO|ZGKhI-%}4̒Y"K_ Kl]b[غw_]{{%pp/b|-Ʒb|;c.b.vc_1c_}1X_1_1_1_1_1Řc`1_1^{1}AcL15ScL15ScL15?c4;c쌱3/c5Vr?_c16cc5gcq6Ccq2{c133č13'cq2'c|2#c|1c܋=cd1e1^Ƹe16c1>c1FƸca}1c_gq/b1.Ƹbl}~pE‘1c,0)ބkx%#k}Ⱦ1cz18x1r1co1cn[ciݶۦ)|?w{}Z$]zwO}'}b(ebZ&eb:&cb̌鑘0b\1+Ƭb*b܊*ƫb:#ƭb {~=l-{cd1Fcd1Fca1xa1x{qYgap_^9glqkqYhqYgiq9ghq~fqfg['?5{=5{=Mn~G;>1g>lOiָfkָfkָfkָfո^ո^ℽ {m\um\ƍkܸƍkܸƍkܸƍkܸƍkܸ~׸~׸~׸~׸~׸~׸~׸~׸~׸vk׸ָ~k׸vԸNkظvk׸fwGΟr3k޸k޸k޸ލӃYӿq׺q׺q׿q3o9?zqqqqqqqq=q-טq-qqq׬q qעqיqץq׌qחqםzՐq אqבqבq׏q׏q׏o᜾o[kKoqs17=&yn}e\;uc{kɸތ͸ތsZ4EZ4Wz4:4C:4C:4C:4C:4C:4C:4C:4=Z4EZ4!1#z3:1:11////׭:/:/:/{ y `A= $4_ %xˡόH!ogCyx=|J>3H)7M#;I˔{9Z5 $X`M5 $ؑ`G??`3K,I$Dd5$'s(sIp'wIp'wI0'sI&op„-My?[1Lwϸ{p9\Np9\Np9LN093z &`l &`l &iq< 9|GW!q?tq!wI魄^JhfJhJ覄nJ覄nJ覄nJ覄nJ襄^J襄^J襄^J=s:+:*Uo%TBo%>-xjKhJhJ譄&K譄JċkJhJhJhJhJhJhJhJdI聄HKk6Hh6H菄HhNIhVHhFHhFHhHhHhH|C^yHhHhHhH莄Ht?#?#?#?#?#?#?#?#?#7$7ꎄH莄H荄HI^{$GBs$Fuc>뒄.Iߡ5M$ M$ M$e-ELޛ/o{u/eϲY;:gY#-u5в>ZA:hY, 98ϲY?gY,eϲY>je ϲY;zeic>`̚Y3fY,ke-oϲ.YZb9>,_2'e/ke/s|˩;X˛X˺cYw,en-3kˬYf2o'2KY̵e,d'g15Ʋ>X`Y,e]e/~ˌ]#ZcYk,keꇸ^ʇxmq˿i뽿>7wup[ƽGo7~Gϣ\cmxu7w?g|̚.^˺xY/_wtV6^+xE{o0~^+zzEOhWv^+xEhmW>^+xEhMW4&^+:x:M}')~ }Wt^+{Ek, {>{|--gn9猕 GpNۯ,g=W4_+~Eӯh=W^+z|Ei6”Ycz +S>cVnvfˊg(+QVaǏY+3_+~EӯhMW>;x+{EwhW^+_W^+{EW^+{Ewe#pKWW4^y{MW4_+z|Eh-W_+:|+}EhݾWtN_+|E=W~q¹__^\^+:rEh VŊZ3+zfEϬM;VtNJY+:bE3=VkrOn874+zfE蓕딕 ,+)%s%]%]%]%_%]%]%]%]%]%]%OꅤHjSW-I-III=IM|[댤.Hr?$N$Mr5lM5$G='qI'a\Nr9$\Nr9$\Lr1z$KWV%yJ;I$ٓKrk:+Nr(ɡ$IY?a(8ǜ$sI2'ɜ$sI)ɜ$sI2'ɜ$oH2"ɀ3ﰗ;ܷ1{>ydcWI^%ycy}Yê$J)ɦ$lJ)ɦ$lJr)ɥ$\J~ژ5N%dTQIF%?g3J2+ɪ$J*ɫ$J*ɫ$J*ɫ$Jr&ə$d)I$dJ7I$I#I$dK)I$dJ)I$dJ)WO;I$MI&$`&1 ɀ$ H2 ɀ$ٟ́dBI?iQRO)?ezRp7RHq#ō7RHq#ō7RHq#ō;̑CRH#ŔԻ }H')XbI%)^XbE꽇s#Ō3RHH#ŏ?RH)s?eCY@őLHq#ŅR\Hq!ŅRLH 变ِbC )xAj}3R\H1"Ņٟ2S1kHmkHm̍+R| )>e֧Yڽ_RHܲgo7M7)ޤxM!)6Y2Sfy,O)s?e2SfzO);e~2SfvʌN۩NNǬO)>eƧy2Sf}ʬO)=e2Sf{,O)n{p̓s2{pOi?m6f~Oi3?mY6f}ڬOi=xHs ́4҉fB iyAi6~ڌOi3=m~kC cI/i4~i?mƧY6fqLOi8my6q3,Ͱ4 K3)ͤ4\Js)ͱ4lJ)ͦ4lJ)ͣ4+î +ì̛p+í 2p+yYgexaIdaFfdy֟2a5dXL3dXaM5dؑaGvdؑaGfvO2<PCdxI'dXaI%L|5dIf}3720&ã _2|%×L-X/ WmϠ 2'5xQGexQCe8aPAdO=3a M7dxM7daS;daE)dy13xϘY73f{g9[ֆǰ 32 p#Æ ;2|!Çg }fENd8ygfdaFfdaFfdaF6daG|/u^dxA^dA ^aAdXH^dyyVdXC fdxaE &daA dY13fy,Ϙs>cg913xϘs3e>3e)Xe*7Vy:3#Xe*+VʋUF&3f1Ye*CVyʋU^b?{NrcXe*VU.2c Xe*VU~6 f*VwWg~5yoYjfپjfپj3\sy5I{?|dM˧)˻c>4{v ,\*VyʲUNrj[ >?gsme,[e*VYʲUleZe*VʳUf2kY [*VʭUnrk[Z*VʡUrhCZe*VyʣUhEY*cVY-C_2aVٳʞUg=Y[͏pt+ovu:a=5/}k{ĪXzbUOU=#V>XbGG>kU5VƪXZcU[U]+V=X_ƬiUmKVuɪFY&dUjUmMV*W9Uίr~_*W_U__`UޚXk`Mi5 5֯}k|_5ޯ~k_c5|k _ci}{}Opw廵vXk`Mi5=Xk`M~k0>]6s9}~XkaM?56Xkz`M i51k_k _rYkc-w~MIȚY h5=AִǚXkaM?5 5~qqkl\c8֙5nqsk\gع5~5i5~}dk\O>f=O{qtk]G85qtk]G85qtk]G׾`:[غ5ukL]cSטԵ/e5f5k]#53| _35yl^K־%ϭ53}L_3׾wYy {oks=`Ek,Zc~dƞhLJ~b=شƥ5d3kLYّu.g.g=kYc{سƞ5qg;kY {شƥ5.qiKk\Z-9Ʃ5NqjSkZ8(^MY6e0X1L[Y]YfeeV̓o1tiwqgbYeٕ]f1*>͐bmϦ!`Y-Yg@{}V#dȺj6j>ꉬFj;{͐muC8xC;{- ًn~" ^uDÂZ"%Z"%Z"#"#k"!"#:":"Z"!"!"!"!"!"!"!"!"Z!Z!"z!z!z! : : : : c־j̚NꄬNr?,r?,j,j,|β3,;2:֬r4,323}#ehYvfٙegYffyfY>febYfgYf٘ecY6f^{Y6fٗe_}Yeٗe_}Ye[oYe[oYe[oYeٖ6_uoߍYcYucfߎ]{wcy|[:ζule[[{;3iz;|mO=_:u_:پpZ`X7׹ΐu3d!롑0Ş4s}e[g:>;LZg:5ɺ>Xg:Χu>iO|ZӺΤu3g9µu^ ֵ6X`]kuM 5&X5>=7nwS|&Yb]sk ^N;'w.sq7ss17ssOܛp9M|9Fct9FXcq98{)r;wNw|ꆜfisα:sα<>C{& {x}9c~9c|9c|9{Lpny:sq?Xrϱ=W _:s1:r5n8}ܷiFi\3x 9 9]9 9=999999c98c|-{1Ş^]LOtLN4HN4HN4HN4HN4HNtGNGNwtGNwtGNwtGNwtGNwtGNwtGNwtGNwtGNktFN[tEN74CN;tCN7tC9n{QpگpMy<µ_u:+r*r_>u%Qr(Sr:%Sr%Ur%Orz%Ur(Ur:'Wrz%Wrz%Wrz%Wrz%Wrz%Wrz%Wr?ꖜfififi/LX299]%99m 9 9 9999cu9Xcm9X[Q~?Z$Erz"Gr5^_GNc4FNc`^^uF^F^kF^OuC^7uCMǬi:x)")Z!rc:7zϛ>wy y y Z ϳ? {>6_ns}LG/B^/B^/B^/B^/B^+B^+B^+?s:"#:"#:"#:"<\~z#xyyglC5y.繜ry5^yuyV9uo^0 {l.s`&G1 NO|yYw75?uϙp + +zW`_aW`^exVYgUTOUTSvXURW6T`SM6T`SMTQGXTPC^^*p *p *gURENXT5F~|dWXV`Y]fU`VYfU`VWN8U`V7n̲ * *«ǜ{Mp[nU`W]vU`[Y^xU`Yo>n= ׎(WdYYEfUdVYEfUdSME6TdSME6RB-EFPdLE9QdMEyQdNEQdOEQdP!E9RH!E9TH#Es}Єspùa}f9UL K-E3#kl,.M87|d\3} ?3"L,2"C*n gcE6+CYddEFgE~YgEvYdgEvYdgEv[ekE/W9[djEZdjEZdjUEVSdN9E.PB E.PB/EhR4E~9_d@ь/Eh^4ߋ(~?ȝ"3(EnQFEnYQdDEFQCERdJ'EQdFEfQdFE^YQdE/Eȅ_4{ӔYU| SO?EySM7ESdN1E~QG+E* xTuqwȭ"zϰ"Ê*rȩ"*rȩ"<*ȣ"<*Ȣ" *2ν+?ƺ"ϊ+2ȵ_|\sE9g4`6 mmk\6k4\7wlv;1xC7 n0t `C7 n0t `C7 n|5mlw6 l0`M{geF|d/6ػލlY|ml] &mkK\6xfpmvk|?µ1׏#׷pG__ۏ;G߻\;^hCmh 64І^KZhC m 6Fk;7\64ԆPjCCmh 64Ԇ~OiC3mhg ]Qqk\1ykކ{zoCmhOy~znCmh ]6tچNϺmCm趍O٧6t߆}nCmh =6܆ҡs_8rNmh -6t߆}oCm 6W7n ݸ7tvnC?n }64ކpnCm|Ʒ޲Gn 74ЀpCnh 6{ކvnmCm 6t߆x {a^6ކ{zoCmh 6ކzZoCm赍ߚb&onCm踍?;&]64߆|oCm 6tކy:oCJ:JZJZJJzJJڭJJJڪJڪJJu6r=׽C^t]Iו> )N~C-ޒ-iے-D(1-}X%ޖB%^x_n#?r3K\.qK\.qK.qKl.{K-qK-1sK- G>{֖8\bm/zK-'K,q'K,q'KL-+K,17Ycau%֕XWx^.xXa%^s1a%FYbd>g^xYe%^Xb`%Xb`%8X`_y9Zbhxqť{K-{K-{K-1K-K-K-wK-`σa_NoҞm۽2˼/2ˬ/[p^VSOe>9WRSeƔTfU/elQ6OƄ2KL(3̄2ʜ(̣2[l)̗2(3̌27(s̍27(s̍27(s̍27(s̍27(s̍27(s̍27)̕r{SO?P?eSO?e֔RM-eRfK9eSK/eRK/eRK/eRJ/eRfK+e9RH#e9RfGn8ǒM8ǘo8Ǟ2{)̞2{)̞2{ʬ)̞2oʬ)̚2g|)3̑GCo97ww{;siڿM;<0}qg;9eS9emS:e}S7e}S7e}S7e}S7e}S5e S0eR+e R1JYs_5a'kL8 :m{=TemP域p^?kuEYODYKD7Ƭ昵IZEZEZEZEZEZEZ ڠz`?]+7fq=oM]+65ŦbSwljMm7ecSwlMݱ16so{9ͲM6S޿{ͲU6ʦV):eSlb1:fݦm{S={)w۞M65ڦFhmSm)N8A\;s-vԎqSmjM=@mSmnatnSm?:p36rԸZtSnjMA75ԫ:tSnM=7ԜrS_nM}/7妾ԗrS_nM}/7妾ԗrS_nM 75&ԄzpSnMM57u.[M͸7uNԉM/6ƦjM=6ǦcS{ljM=6ǦcS{ljk6M 6{Cc*#*Fca{=oghvh~藊~藊~藊~藊N葊hh>;9C*:h>0 +p +p +, 3+L¾ *̫gc%bTSaMei3*L£ *l0· *0¨ *0 *« +̪0Js̭³ *<³ *<7>U K+, '+p '+0 +p +zUV128׷ G#?=v낵Z*zeo[bؼ-6oqy͂Wo1z[lb9noq{[-6o1|]Ge3:[bؽC9-oq|[Ƿ8-oq|[Ƿ8-oq|[X-&o1y[LbX|[\6y[lbV-Fo1z[b-Fo1z[Lc֎> g÷-n1z[g8-nqv[o-nnqs[7-nnqs[b#-~ns[7-nnqs[7-nnqs[/cֿhY1k,bX-ox[bشŦ-6m}Ә_s~mjQ[\bń-&l1a [LxŁ-l1aݏ~ =~?N1{c}~Zf;~۶~s?{趭^K[ziK/m-;#Ӗve[lKm-=ϺjK{l-?kƬk- 3tƖ:[cKli-ͱtEMWtEMWtEMWtE)~}{4JM4JM4IMHMHMHMHMGMo4HMtGMoFM4GMs4GMgtGMkԴFMc4FMc4F?Y{:Cj:Cj:Cj:Cj:Cj:Cj:Cj:Cj:Cj:Cj:CjAjڣCj#HMԴGM{tHMGMwcԴGM{ԴGM{ԴGM{ԴGM{tGMwFjgl?S?TMctTMGtTMGtTMGtQMC4TMC4TMCSM?z7)<j5Vh5Vh5Vgᜆ鷚~鷚~鷚~鷚~鷚~nXu5]Wu5]Wu5]Wu5]Wu5]Wu5MWr5}Wu5}Wu5]Wu5Ve5Vr5V_5Uiiiii骚骚骚i˂WMTc{M/Ԙ\fu5>xW$5N8Uj55NxScEͼp-kjƚkjqƚO|5RcKƬiύO5TcP95xScPwG+XPC5`=j 1ƛojƛojƛoj5XSN;5XꜨ_;cpΏ:?Ώ:;쨳,Α:GsVc2Μ:s̩Κ:kΟ:Ο:Η:sꌩ3Θ:cꌩ3ΗuԙSgM1uԓwˡ:kwѡΏZgiu~Ygfu6ֹXXcuVYQ_ΐ:C 3ΐ:C ΐ:C Ώ:?Ώ:[ꜫsΑ:G 3ΐ:C l xQgAuPg@7&_MXIuN9QgK!uԟ9Ύ:CΏ:7 3Έ:#꼨sΉ:'ꌨ3WfԙQ=;s΍:7|·:|·M9uԹSNCuԹRJ+uԹRJ+uԹRJ+uYRgIk>s#n=kܩsmCyST\sΕ:W\sΕ:W\sΕ:W\sΕ:W\sΕ:K,sΌ:#ܨsΉ:'쨳Ί:+<-?M5uySP9Wp?uyT[3Ψ:ꌪ3Ψ:ꌪΩ:sΙ:gꜩsΩ:̩_^M 65`PA 5N; 4XG 5jd-Ƭk`N9 49X{54~djpjpjpj0j sa.7Y0,j sa~7f~ÜnpaV7y0Lj 4Fc5|Lo|j7F!xo70fzLolOX0mpn=w'Khhp h sa790vn san7톹0tÜn0z;9~G7xչ] ꣆6jh&lh]^ \ }WO >kƧ }~p^s5WCw5tWC5WC{5tUC75tSC35SC75tSCo5VCo5VCo5VCo5VCW5tUCW5tUCW5tUCW54U#k/Ujhj諆jhj覆^j襆^jljޏg's[{nkm͹=h֏Zr[cnkmM`&G~ۑt[nm͹A|~wO z^{m֛ۺs[nkmmQf֮v[nkmu53Kn7:v[nkmͺcuֶۺw{}̚&֞s[nmunm}3&nY6ykc]g6붙mmsm[?nmmn{6;S6-mfns7c67mn?{̚Vfv 3656Kmnsw 6ϘbgMsmo~یf6׷mo3}یf6󷙽mo~_1f+Gپmo|lf6뷙m~os||`#k1f;Ǭimom m` f6Omo~ۼ->8cИ?~Þqq}^;lkmö^5͕kWto97w'F ʶNf6Yͽmmpnokmoko;ww8dw7y;wXpt;0#y3wظnt;acwæ6jW;y3sL{~е?5{s ]qwtѵ;vG}sw4>;ZzG3h >g w4;xGhQw4FϺvG]sݭvG-kk&ݤWk6Uk>Okn[Ag-z_׮}z_ס5}z_ר5}y_ק}-z_ק}3~ o}}>Ku}y_wס5}z_׬}z_׶}m{FO? c[O ap ݿ>Cx?a1}>7 'ݿ>1w= ݿ> ?qΟ?Opk7?+M]>?<6ۿ}}q˃|8g`~~|OcO7|s?#}^p?{OL<' _5tp'׃Ľa~aSx??s>=_oi>w<ѽ'_?C0aw̟;Qqf=ߏ1~?vx{bzaCO=r}1<>?{b'>y=}8XQ1}?>8~m2Ǘ:Ŏ;Ut|?}ž5ts|k/q|f79^F;^>78k!;ep|+?~9~uP#Ck'?19~3v;^pǟ8qxUu㷦{#;;,;,U#9;\7/}5Ք7|oww }`dZ{1^Y{MoMVp-xG;8vu]x)xW{8n:^tG:49{sq\5w]3y53wGޛf쮾5{w]xwyټ 'sן3]Fn:6Egݼ#߮]s: aux}sG;!}Cz\f建g#k1a &Ϯ>;zgW]}Le\ycDzhW;jݯ ^uӮnKhW]vˮn-hWKl7Y?:iW']MvuϮA=Yj]-vF(eWj]-ov̮3zfW] v5ҮFHiW?j]͵3S cm?ܲn>q}O2}7`W_2z`WjW}nvaW?j]vukßtҮ=:dWv5.wn&hꆦnhjzZ:o[Ώ^9M MMMmMmMMm~jijiꛦij^iꕦijijiݲ?{KS4uNS4MS4M31oozڢ++91ZIz-jꌦhjijiꑦik&?Z&C m2%Lnꉦiꚦin4_5uS4y4M7Ck|ora#5QS4YdgMf6dfMV7M] ͏bh>qq{?aʟ#s_;?y~~Oϭ O^FS4uOS45HS4?o >떦jꤦ~ijijiꜦiꞦ^jjviꙦijijvijiꐦi꘦iꛦ>iꔦi~SphViꔦNijViꍦ^ijFijFibºvij&j&#lr#+?m&gn&Ûm܄s,n2^h&ϛ0y+5-v-Xz-Xx-+c֙bv-j--η8|-bk-^bv-fbv-fm-^bvK->Ã1-3e2[fx˼oe2[:cΙ-^bAoŧZ1ņ2[h1yѽlhqō7ZhqņZlhŌCZ i1EcgH!-K3-8H5-FXbG!-K3-`߷N%-8F-8bJ1-ƴO뻦;i1ŜZjqsOY ~~½:Z|lųZkqŹZ|ken햹2[vn-xy'3[f}w'fσ{ݴcM-6bVY-&ekqŐֵ!pu_Yz {Ǘ=k]{c γjU{csǜ=1g9{\8Ǯ=vlg{<X=iM{lc6fm|Zcǯ{ZfO==GtŞ){ZdOo=tÞn {aO}ʘO=tɞ~&{:aOW=m-Ş} ^tù/{zfOi=-OɞV){:d+_=-#tĞ{:eO=ݰ﫧M!4ҞI{:iO}Ț'{){aO7=ݰo͞7{fO=}ƞ({eO=ͱ94Ǟ.{,{cOsi=-EȞc==4{)twa{cwm{:bOi=`$5>u>}sg>Y}-5p'a_;k}þZc_kk}-}9i8w|FLynx=:a]}- i}'GrZd_k}-EȾ">yKYϲ}ݲw` ϴ}sm2<>[7aGl>ٷϾ}&3s YC#{}ӡ=F9׿gg{ww)\߇g>}3tlg>}yS)=+Ia_k}3ug.Cs}k}-}}Z`_+}lg>}|>}~>3Y||g>y}pٹ}~tNqߔ'{=pq?w ] ӾLZi_+}Ҿ.Gi_3k}ʹ=:lw]jhϯMأo}0=uھNi:m_{}'CuYks}N}݁^:P@_}uՁ:`z@wށ;sz@hx6D׽qyw.sO=iit}{|}C7黮}3{z&9x~` <x8\rY<+xn8%<j^]4g{@<3xf8p3Á>0?hNyC^~t?Z@}~>? qp5fȞ~=ߥ< x8r@|4gMX#&kϘp~3'Ԅcn8ysƜ \u1ϙpNfҺgp'҄ '?&ʄOcy:uY3ׁgM3>Z>@[xf:@hm~g}> 4=uz+iك_o<_>>-@h ^>x{}46>@+gm|4>1k@K|tugׇ>!|CqCq?i9jC{u8o=CkPSjCMq)5š8p˞wgPz8PcC=q'5ơ8P3jCmp졖= C 'š8Pw~1z vGɡ69PjCrOu!}?ǡ8#ZPp=zPPCr 68`=[hC-qaY~CjCCrz}CCPjCsl?ȋCO|:!wCŇ>3ӽ܋/Wx^Z␃>d! YxC𐅇,<"z{;d! xȾCK=xCNr򐋇\Yc!{ßzϓCA :d!yuȭC;!ywȺCNɘzr=~1c+5-rC=6L=dᵩ=d!{y^9emfjmڬl-~[S{ǸO+yu[+uBk6o6osS>6یo36ۜos6m36sos6ns6ns6o6۬n6O۬n6 o3v=zõf|mƷf|m m#wǬ=5rm޷5D[#Yf|g}mַYfwmη~m^yfzmYmzYmfyf_WgkT̡kj3Ϳ6,kͻ6ڼkͻ6ڼk6_۟mֵYf_}m\wk/Y‘5>fQ]m]wmYbmVfmfYfXm9Zu2ӏxrİ#Go:f?bS#,?2ӏ#,?2#3Gf~dGĂ#3Ȍ?2#sȜ?2p#,?2Ǐxpă Es1#G8/xqċ1{FϛG8bǑdG~dGY{dGfdGfcnٿ{9w.=G9tĬ#c:ˎcɄL;Nq_F1h;bwļYXvIJ#qoGYGY ,<13#N1Gb|#.GL?bx~5cF#kG?^2Gk#]p)đf85-qcFޘ}6zo}~t‘N8 G:HW#-q%đ68ӑ׎YG_8GH i#-p7u}j{}p±^8X ?68ǺX7cp'cp ±68Ǭ?f8ZX prn83u8Xcq-ű8XWx8 X#kcrq;_9>_߸oMr=7 豮g=zKOV=Ѫ'D_}y/O剶<і'iMg=ѧ'D hxO鉖<є'Dh=z?OtZzZrdMםwNމ<ѥ':D?h=xRzN≖;х'zDϝhw}Nω9>'DKh-uNԉ.;e'pNtى.;ф'DhtNщ>:P'Do|Os֔t'>;xG]k>M' N>1o.5_5O)ϐ'wq3qw;?.wD'8>9r|/p|o9c̹;>{us"y/9CŎ/r?/u|+_rrOpwǗ9^x㫦;;q|x_ZǷ9҇;{/oýYySΝ2q;e)N9z ySV~{)8Vο-ndσ]o{NvOtIGt4KGttKGttJzS:[:W:ڤM:ڤa:ڤa:U:U:ZS::3::O:W:Q:O:M:ڤ>źh脎h莎蚎艎;p;\0;lph&hF膎n膎苎PG_tEGtJGttKGto?1}:~,tjG;vcG;v4`Gvt`Gv4dGv4cGucGu`Gu]Gv4`GvaG+v4dGv4`Gu^Gu\Gut]Gu4`Gut]Gu4^Gu]Gu4SGutPGuPGu4RG#u4RGttQGtOGtOGtOGuSG?u4WGutWGwutW=|н-#)o}mw=s=iqu}[w}w9c밎hv賎>蹎谎.h^赎ffjv蒎.蒎-׼kFџwb}LXG7veGv4bGvZGu[Guۙ:R{L[i3u?4ٛ|ago{ϴ™^8^gZLgl?c3s#NgÔ׾еO}~!ɏ~·[=9Mb{ޣeʟ?ܰO_i3|ϴ>gZL?3m}ϴYt̚^>gLk塵ȞϺL7i3 ~4?g[n9_F?gL3]sδ͙:ngLi3vϴ?gZL˟i3tf: QwܯYg|':L+Ly8ӾgLi3{>~y}ϴ>{g|g3~Ckן?ϚG>n̾g?1cy=g:L3~?g3o9S)x8sù8rnswpu:\ks{uϵ&>\ks zquN=ש:\sMza 7^\לsM{i59?\ksmtεҹf:RZ\Kks-uε:[:I\ۜksms5O;9ϙwγsg<;99uΰs3a|;9 = <9Yt΢s3?̶sml;Y7s?7sƝs;goo#{oiWOϙvsu;g9 Yxδs_ų?.xt ]G<`.Xt ]pCl`.Xw FOί .S|Ͽzm=or#u.4҅?B\ t.ąOCŅFB\ }sc.tDž& #t̄s -rO.4˅f,B\h r7.tȅ B\h re.G rQ.tɅ E=|g.˅.B\ r_./4ȅ,B\ rW.\ ss.tŇr5g#<}5)k؅>%B\hg }~{=sC?68Ӆ&$B\<7x,B\ Msg.ąnԡss6z/mr7[Ώ^`]\|-׾`kZB] -t.ŋƬ ss.4΅^`M\|i#8ا.bֺEzB#]h mt.tхFCB]h t.4х>GzB] mt.х^KB\h s{.tυMB] r.4Ѕƹ4zB]h msa.˅~>r̺fB\h -t.Ʌ޸zBo\ ]q+.tŅ%:BG\h }q%.u+h -q-.ŅָkvD#]˒5߻f{lkw|L]3ˍ޽察p'|p/Ft|>׿-Sn}oMywo1ri998^?כ;yo;{iS>{]Z]mV]mS]^]D]T]MW][]F]mI]Q]}G]}S]T]M]✦ꩮjꪮꜮꨮjjjrd]MU]N]S]Y]Md]Q]]]}']]U]]TݳΝN8ǺzgQz:}ڧ}ڧY1^t1YuuOWtMWtuQCMWt5OWt@WtNWt@W tCW;t5BW#t5DW3t5QWtuPWct5JWtuAWtG]wy}WtuDW_tDӞ/x{4KWtHWtuKWt5GW{tuHWtIWt28uSxsmc:iqkZkgzqqkkkzgzqki:gSqڥCJWtMWtydW5+];]2WMڨoo{?kn8?ڪz#fߍ|~icf]o3{1#k|z1DŽCzkf1&鄞í_j^ 4%/NR\jKp+.uť|;R\K=q1.5åfZRK\jKq5.}~Kp-.y}K~_ d%/9}zK._rR\R\rۗ,3|_ܿ%/K_2՗27Ş{~K_K=p.uYp[7eC.9zK^|%/{K^rїd%7/{K=pU.φǭ={1f5^r×%/}Kn_r%/{Kn_>cs,d%/9|K_r×%/Ld%/}Oc0,%.tK^^2񒅗,d%G/Y}95};w5Ss}Cw{\;.u>1R\K}rO.ɥ>'R\jK}so.ͥ?zR]~#\Lگ{?|R]H.5ޥƻxR\K v.uԥVR#]R.uޥFHzR]jKqyR\jKt.ѥ~X;W\ˡZruR]=~{1;~ivN78S~O1s:xpnrn70oҾIם/!:zzzڻ:ں)G.&kFkn6k&kӂW}}} }=}}}}=}}}m}m׻}׿}}]}}]}ף}]ק}׫}}׸}-}׬}װ}׮} ת}׮} ײ}׭}׮}צ}מ}]ס}!e_cf_sg_h_i_ud_Oue__uf_5g_{`_a_'b_7c_Gd_Wh_cu`_ua_uc_Ob_5b_R_cO_A_G5E_Q_?(x}uA_[5@_KuAgMI}m}9X%CG_9my}ya}ye}^G_ygj}c}Fn}}^}N9?9rḠ3+K,s>SLϚ>\ϟ7Wfj;}o͞73\l};Yac>co}ofndg}sl`csk`~ ̱y6x͵60f,km𖷬}sg`6 .x#kfL3k`f ̬50,Wj`^ ̫y50Oj`V ̨Y50Ssj`N ̩950fU3k` ̣40[k` 2S1fal` #ͬ50fLm3n` ̼y6h gsm` ̹y60m3l` ̴60fOXwo` #kWgsq!C?p` ̿980|p`Y80 <{sp`ŁY80sq` y80<mso` 80fsf<r`^8fsq`NƁ70}o`ˁy90/_y=|3s`~ρ990'sr`NɁY:0?flr`~:0Cssn` ̿90C\3n` ̼70f|}o` ̾703٬un`&ā80 fS3l` 70s)yĽkN+3L2w+z_ey=oFWfY~e~_Wf|e._WY{e_Wf|e~_ӄu3L2+sܾ2w{r\2߯+2ϯ+ʜb~e_W~e_W~e_Wf|e6_Wfe_-Y3ׯ+s 2ïpe_W~e_W9~ef_Wf~e_Wf}e_W}=܃kjc;⚝yp?]qWlbF֎F֎5WCqC9qŁ+N\qWb#pŇ+N\=c3OpŊ+f\W?pŏ+f\1 Wlb;qōY>}=SXqŊ+V\Wlb#rŕ+v\W"("(8G8@sܙ:&m6I&ӴM1mӴIQpgQpg]gnc?g}J~afafaVUOVws#w8r-wrw13[[WpWP+wr)w8s)w~,8faaaaaaaaanaaaa1{Y|,Ø;f3}̾cf1w;ay~<~{̽cᘙ3scfťk5s;f嘹3cfk< >Y3cq<18f~cc4ܬ1s4fԘ3co}=1⾻{xó>=73^~>~}l)ƥb=%tΩb̊*ƣb<(ưb)ƦbL}NQ1xcW]1VXcUO1cTY1CE1CS1F3cL1$Ɛcbq!׾f5XcIC|~ch1^1&ƔSb< Ɗ+b"Ə[bl1'Ɯsb[K/{{Ug1cSM16Ÿ+ X]S1nc[{1~VW1ŸcT[1nŸcZi1^;p+1cN91f8Pi1c]y1X;T[n=~wc^y1ž3rb.cj5>x^1xb1fƸca1.X`1cc1&Ƙcf16b1&xb1.8`1c1^8ǬYgW4ce1^Xca1Xca1cmߟf?{G8Gs48[l28348c㌍q^8̌3387㏽~=}`=A}}}@}{YqqřgZqƙqLJ>?17>q^gjqƟY֞q58W78O,s68g㜍8g{=s88[s88|9{XО ~w܍=8W|;8㌎ϵ78㌎:8㼎30nqVǹODָ_qyOGB> 58g㼍38K㬌28+㬌s48+㬌28C|s38܌s38<08'̌338⼋s'λ8<(Φ8܊s(ή8슳+η8|3+ά8⌊3$Ζ8'Ο8l3(Π8<,>nyXcq~_:gYcqvřYgqYXcq9[oqZkqygXiqvZiq9YOq^yWmqyE[Cnj3&Θ8c⌉3&θ8l)Φ8l)ѳ {s$`QEw)an'xxpl&90{frLN 35a&9x M'a'0{|O 7a&҄0Kg kfq,N 8ȹ0fxœM s5a&لٜ0folM 6a&DŽ0fi,M 4a&ӄy0OiLs s.a%քٚ0f`\M s7?"L s5a&ڄ03k|M s4gB3б0[sY0Wj\M s5a&fr¼M 7:^ 8a'0flM 8a'90pL 6a&ڄY0kfmN 39aF'=>>{OĽؒ`K- $0Op!Hp#?ZcI f$xM f$F F$`F $C >$`F .$x`E $>~-;!ro o3ٔ`UA >%8`VO >%P[ n%`UC %XSO >%X`QE %z1,Oz?I%ٓQYI%f<_Aɇޗ`[=\y{1žaI&YdeIN&9I&oI6&yeI^&YdiI&YdcI%9dcI&Yhco$&9fI&nfhoㆽ#sp9$,Jr(ɿ$?,K2)yE{YWI%ٗdYI%_I%XcI%[}I%ٗV[In%ٖd[mI%ٖd^ cI^&>k\Lr1$3L\ }9jI&-r>gqqI%b{I^&Y߉\aI&9bI&ٗdaI&8'{-eVg@7{N1.ɿ$璜Kr.ɹd9n&9djʜO}{}ucS,Nq?S L10RJ1+űRlK-ŶR,L/ž S,M17{)Φ kSMq6cSLq6wSLq3OS`)NNO^lv"8fk)8`)xi)Fn?)~g)z)Φ8bf)bp)6n)~>`)^s6/SLrRL13S\L27S,M11#SL1T=Fxbc|L%tsؐIgR=7bػ:SRLI1%}`޿򜿍ǰR Kc5n=$ Ǹ6ƴ1ƍ=487Ƙ1ƌ1c=c{4Ʀ11g9c :uqk[c:X4Ƨ1^j;c<c5ƨ1~k\{bpk|cƘ4Ƥ1Fk_cƸ7ƽ1}ϱϺ!?|׽|ϧ~Λs.cbLwi1 04c_0!=w煮k11Gƴ؋"/r]i1-2SƴɘN#czdL"*ccLi1}2O^Z%cdL1=3rM閱=:fLӌi1kLӌ13gt͘3czgLKi1]1Ƹ>\w냱uX51Vg]{鞱Țۈ9$ccLi1}2C4Ș; 퉮i>ɘN-ca9 >/CX'i10!t쳦54Øvczb;}{޽wεʘn0ceL钱12_t̘*cdLiWGε͘(cdL鐱D/ZfLr~Sӌ12e:7c:2c::c:?c:gLߌ13k3g4Θ7ccL{5t.SCsA;iw}4q}1kY{Ȁ}_;QƵʸv-:e\q2Euȸ.*Zb\WkqM1zd<}kgjqm4ak\>z~}5Ayk볦O4uԸ\\g8cY;q3xe'O+?y=eq0#5Ÿ%)tq5Ǹfb\Oq~g85,8y>E# _<3ø^a\+kqm0Ƶ./rM#kq0ƹ>q֏3#r)Ƶø6y\ kЧ&8?q8Y=q^ϻkLg89Ǝgpz8{9;qƎswGCg8s:qst{~}|8Oǹ:W7qn3z #Ə3ߊ߳ N7}yni#}Ӄ{۟ߥ u߸zZo\kq7u޸wo kq7ݸwmBq=7܄>]zlB{Mh^;:C6c 6&tքNZZkBkMh 5&քGhBL|@c&ʄ.9:K:>(r]L m6&GE5#kzhBLh'E5ф~&cBwL莉>Ʉ6&dBLh 3SLh 2K&tʄ6&dBL ]2E&gX)eB{Lh M1)&4ńzbBOL艉/޻~ހ_ٯk&4ʄF"ZdBLh!׾j5}3o&ׇEzgBL 3u&΄֙:Zg":<gBL }3&Ø=ZgBLh 3u&΄֙:ZgBLh ]3q&̈́:eBL 2_&V\L =3O&Ʉ>"dBLh 2Qc&\k ߺ8~4`s҄CzhB+Mh M4&΄֙:ZgBLhmwj 4&~ 8Dο7rȹ_kBM 5c^zeBL 1 Lk57\īܫ&7&4įkwuįkg{ܛބ`&'8~3{7G|}wQ>}0F`B#LEhOCZa/?zaBL ]0&6 ]\/Lz_Bǽ>`RLc<bR7LI}0# ?,BZbRCLjGG?8dd}#obR7L ?.3` dRLI15&ƤΘ ac"O Ĥ?)r޻1&5ƤƘ":cRgL>#r;&5Ǥ|vi|jI1;&ǤƘbR_LI 0I&su-1&ĤF:aR#LjI0)&5¤FaIOr~/sUs0&u$'?I-0IO~$'Y?IO2~$'>IO2$'9?IO2~񓌟d$'ٯ&d$'?IOR?L>Ť $'Y>IO|<<3vd$c'0:SbJGL)0 ?)O=*3pM?lȵrCiGeJL)194ǔz̀쳮Q4ԇGGeJLi)m2[ɔ^(SdJL)]2KȔ#ScJ{L=5 SdJLi)179V\Li)2C4ǔ֘S:cJ[Li)}1-9/$SϞg}ѐ}EsX>g_<5ܔflSmJM)M6ɦtԋ#ۀ=mJMi)6SM)6SMi)6٦4ܔ~nSmJMioq7GN)iJM鿩>k}tߔ}SoJM)7#koJN-ww]3N#┖oSmJMi)6զڔVjSZmJMi)6ϦJ[SsZ{WYjE6qm}[=~-޷qmwoIn3yg2e;˔w),SYLy2}cʻCw2eʻԷG>x>ރMy3f;͔w xĔS+L)]=Syu7S:]f֮ӺuZNki-:E ?v{촞ְvCvZNki:_~֯uZN?q'puֶiݚ֭iݚ֭iݚ֧i=֣i=֣އYӹi=ֳi=ֳG5hZ{uiZgZiZ?kcnأiӚ6iӚ6iӺ2]4/:2z1z1Z13z1Is֏i֍i͘օi͘~f1)8910m'o&o&o&o&o&&,s:'!4PZ5PZ5PF4QZ5QZ5OZuQZuMZ5NZߤ_뚴I뚴I똴>I듴>IkFIk4!4lL3,Ͱ4#ӼI&ͦ4slIs'͝JygGw|iNYtiytkN:4ӼN:4ӼN:4ӬN3;4ӼNOnfvi>si>fti&fr&fRIi&YRKi.RKi.9|I%͗Ts=WYZGifPAiٓN9i9~}AiCifQ=iy~c5&1eS=~dDVdXK^dXaE3la f0Ä`1g80Ä1g1g7,sڿ[ os?Y>>1s{͡2?cIϽן6u!)?w3nF6f4ی83`N3iF3{ftόyZdS颙O :~jp}r~]5f4Ռ=3i"g > ?s}:h3kF|Nftǟ:r3:nF6f4c6e3sftΌΙ93mFh6fیvn3/rMhM7f+CnFh=7fXz7Eִ̝>qF78gtnnF78gtnэ3qF78:ֈ3qF#h8g4р3pf;t:օ3qF]8 gt.т3oF7s٣gN9s9 ї3rFShM9)g4LwzϺѠ3tF93gtΜў39Ѡ3?|m9-g匶і3rFG-9%g䌖ј3zrFO=9'g/Osh97g~%ԝ3sFsh8g>ђ3qF#Aoا#g~c}.ѥ3tF35fƌ֘3pFh19f4nj3cFs\Fe,f6˰Y2hc,f96˱YNβle,e,fY6˲YͲ}e\μY1˰YͲkG<,fy4=5`f?< 7C}Hg^g,KgY:Y>),g7ˤ٧7ɑOsjc,f5˳YnlW,f5˥YN2kB猚e_,f95˩YN2jQ|e,f3Ցk-tI_ڋkyWy^7˵Yos/ >Y7˸Y2nS,f4ˢYgG e,f3˟Y2˜Y2g9e,[f93˗Y̲e-\,Of1ԬQ|Y-5fuԬQjVCjٟG{Ud ثf5٬6eZkVsY5f֬ޚZ >٬\ZkVJpfu׬NT:hVjY-4f|jY=4fYHxTjV?Y4f"8[po YX{jY5fu׬]CdsmNi9M6t֜ΚYs:kn>< aӂs:oN974w;7ђsZrNKi99#t7pzsZoNik98ߜӕspNi9 8ts:pNi9 84zsoN974ߜӈs4d=7=gwQ~~ӯsuNg9}9 ✆ӌs:qnWνagjܹ7Fw]Gߥ4r5;y֝szw_k9}<&Y͛չYmճY=YMY]յY-՜Y=ՓY͙զY]ՕY]ՕY]ՕYՑYՑYՎYՎY͘yxjˬ~hdC">ѻ_fhVf5hVf5iVfhVf|jҬ&jҬFjĬ6ĬNjĬFjĬFjĬjj꼬꼬꼬꼬꼬꼬꼬꼬꼬jjjjjjj;7n }~޿{׮YݚlY-e9iYjY-RY-RY- 뮬jꙬ Y]5Y]5Y4YM8Y6Y]5Y]5Y]5Y]$Ҁ%;#9ȹꏬv\YYݑivgq}z$5#7z#Oz#7z#7z#C#9#9gMd5GVd5GVodFVodFVodFVkdFVkd5FVcd5FV_d>;[|B-7|O;|W5g~s֑Y\Y}]Yݕ]Yݕ]Yݕ]pׇܣz-ײ,*z'i(k&7`]eNVdN-}OVeQVd5NVd5MVdNVdNVe5pC:h^Ϳ{{{GA_ky:Eןs^wОDžD]{!׵4]{䀟}o~{޿Ϛ|^Ky]=uz^Wkֻ磇\뷮uN:}^y}>6z|^ƀ=7]{Gx~=îtC׽s?#tSEA{>yg{>3켞б׶vC:w^ky;q5sky;}׾w^ky;{5֝׺z{^{ߙ׼^y;u֝׹vEYz|%9~~|ϑ =~<㦟e߇wy={{3g޻ϼwy>}!=g޻ϼy;w{3f<>ޟ{3gѼwyHy{N3f;|uȵ!׼#{G3f޻ͼwy6y{~3f,a lX4E|<_4>Ãy ons{hpϣ=~~#{^pc\3 ?5âfX ZaQ+,jE !u"E.2v^>ן }jO J'?3tI{lkxýîߧ )C?O >3"OO:jQG-EuҢNZgӢ~Z|^s=ᵻ4עZT5֢ZXkQg-ϚZ^/pӻעZ_kQ-EעZ_ZkQk-jE֢ZL{ϊi/?[{nQ-f㻟ӡtu8ԃoQ-jE8`].\V\ԇzqQ#.jE 5\}ZpQ-jEݷޢ[|oQ-Eݷuޢv[nmQ-jE}٢6[fϽ}3tݢ\ԚxzMC|{Q|{]F ߧun^͋yQ3/j u⏄hE-*t5^ԋzzQK/j+8ՋzQW/_ E-^ˋzQ//EV^ʋZyQ#/ƃ>{~^_z}Q/E5^{Q/jE 5_jŷO/j >{።r>s=s=s1s3s:r/sZ+r:6rz+Gs+r+r+rz+s+1s+r<ڇ r,r->:.r,Yr:F9 V99 9͐ 9m69ݐ$9 {ƀu]9ݐ9999999>k! r r:!sL1=>q=r_u_}\q9s\q9sL195}8t9Nc~ѹd7 X ] 9؞u9V縝x9渚i9F174ZqȵBp}nsC oеaw9}9}9}9}9m9uBN#AN'4BN#4B9sLʱ7ǥr<)ǧr|)ǧr\7Ǧup-:rq=3s1,ǰr9VW9^cYa9V~Ztrζys 10Ǿrq/ǽr˱.Ǻ/^{9帗^{9ؗLwCk9W9XcUi7\ʱ+ǦrdTQ9F>k1&ǣgrq&Ǚgrq&Ǚrq)Ǚorɱ&ϙCUy乓N;y䙓gNcO?y乓ٔQGy?0dR-yK-yN?yows'ϙ䙐gB y&䙐gBP 7fzLϛ yC~ϛys?oy7!zvȵn}krk~u}w+l3*Ϭ9dc.Xb&Xx ן1K L- \,p |+|qhgbgbog[>{3Ϫ .p .0 .(—^x}X]tӅpZɀֵBA4AC냂>(h6(|SxX7tCA7tCA74CA;tCA7tCa&8 Z c PC k/p -iIK3}8ĩ%Ĩ%.-qiiqzoq~痆|GZr;ع%~.sK\bCX%F.1s gϞ,&/qxK^bx%/wK,^b{:c/}s%/qxK ^bO%^.rK?#{{߭%ҫ]~m-ҏyFȀ{߽G,x{tʒNY)KdI,%UtʒNY)K:e~Y3KfI,%-ct#ko˒~Y/KeI,%ݲ?%]k̒Y4K:dI,% 1?6_Y0KeI,%{s?FX+j(j(j(nz /2"Ë."'z#wcF{Q EP LJ?*8E}QEQ EP EP EP>뺡}ֵEQO9_|E=Qd}O(ꀢ(ꀢ(ꀢ(ꀢ(ꀢ(ꀢ("/"/#2^QEmQE}QE}QE Qůk(ꇢf(~]MdM{HQwuGQwuGQwuGQwuGQ[5E1k(ꉢ~(ꇢ(j(C=11/"Ӌ.rrE_dyE9^xl=梅EPwE^|E9^lDִBE^d{E^zE^dzE^yE6XdsE_|_hϷ Ccе}-2"O,r"+2ȼ"<,Ⱦ"+ȼ" ,v1+21㊯J<|u_s"L,2"'\," ,,{Cy:;,2"L- "l,",2"={x`L\f2e&.g>g2'9eV.? pQC[3e.s\1G9e.3s ]27'eV.sq\\2e.o[2̿e-3r \sFe..sq\\2̦e6-iMpY˼Z2y̶e.i:ǖ9̰e-3laϖY_|Z2ǖ9̩eF-2d21t̬ef-jOn-sk[ˬZf2o82̰e-k]Zf2ٵ̮ev-k]LYɲ0kA}Ne7knQ~ 7|g o~gD˚hktҲY7:eY,e=Wʲ^Y+ZfY,keͲ#5˺f;G|Y?gY,eϲY?gY,ke}o5ɲY%:gY,zo=g6&_sG{7 ὃ˖Vі5ڲF[hm!ٖ5ݲ>[g˺lY-?Q\-eͶϖ5ܲ^[qZmY-eײZ_kY-e>XyShV4׊Z\+fE߬}VՊZ@+iEhͳyV4ϊY9+:gEhuVΊY:+ZgEh}oVΊY8+gEhqVSO ΊY:+ZgEhuVʧΟZ8+gEsVtΊY9+:gEˬh-eV̊Y3+ZgEϬh [V4̊vY}ɀkgEhqV4ΊYyŀk/rCdȵ}jEWMVtԊZT+ZjEKVtԊZI+:iE'V4ҊFZ|*8\kmVtՊZU+sVt֊Zbe)rV V VX©u6h0m+\[9]p{+[ V½lc+[؊~Z V8-}n FQ5ʞL_a WX'W8px+^ W~8t y+\^ʏ"tVz姃Onh+LZ V~V«^jW+Z Vش¡iK+:s;J;J(i( %Q%Q%-QZaV)i(i(i(i(i(i~(1#K,'K>KZy'^ƀϧJ{y^ZJZJZJ:J:JJZ#{ZIϕ4ZItZI4YI4YItYIXIw~6tJ:J:J:J:J:JZJJZJZJJJJ:JJJJmJ:Jok6*б)陒)i)ҿE/uHY5HY5HY\{Hk\{tKY_uCY9_fwe&\fwe.\re&?$X{\de^y]qeZfoe~Ygev9'S2[l-Cnj-32cˌ-32cˌ-2O<-2O<-2O<-2O<-2KL-2O<-2S,2;,s2?,2?,2?,s27,2\,s2˱CI y[oeZfmeƖ[ke~YfdeO^fheZgesl˲W6f\ٌ+qe3ln9Q6\eBfil.ViIJyX6a2tl6ƲX6c٬+uel֕͹w]ټ+meslͽW6fe+we3cW6f_+}elޕͻyW6f`+b+}el;W6^ ,{el;W~c YX6 fa,,el²9X6o $f6X6e3}el6ƲX6a|,e3VͷՇܪj֭ufݪYjFwݪYj֭>"tl{fުGY\\5WUsq\5WU3pByjyjyjέqf9jέf#ߪj>=8~jh \5WU3p \5WU3p \5WU3p \5WU3p \5WU3p[5VͽUso[5V<7\!׾`uul]5SWUt]5CWU3t ]5kW_4 nXȺyjëׄUsy\^5WUsy\^5'WTp߽nBUu|]5_WUzՌ]5cWUu|] 몙jޞ|=}"kK}Σ#fjfjYj7[}{9ǪU>jO|Z= >9ʧUN2j:*VʧU>iO|ZYc*VʬU^jWZ*VyʫU^jWZe*V9y?z&VٷʾUo}[ekC[e*Vy:3W_l\*W-8f*Wۡc6q\\*WU.rq\*W9U2oy[e*V>?L2t ]e*CWU2tg'C/;׸5nLjK{x5֮was1w}OtQ'W׸5sk]{l䜹k qvk]kغֵ>"ػ5wk]g׸5qukl]{-yF5Vzk^5F1z\cs|k]>/5q|k,^X5yK3xk^c[غ5uK"k]cSט5fq-vuή} ׿_sr7;gk_k_״x&Xk`Mil\i5}k_c׸5Nqzakư=S=[=|]ظ56q:+vܷ;侽!j5f1{k^cX5qxk\U=9=|sh85q|k _cW Xgט5~k_ؾ5f1{k^c5~.X5vjk ]cG8"k_cg1xk ^c51xO1~k_cט5quk\]W׸L]YuƮ[]Cǽ3w]:kٻG]g:kYu?*uήw]g?hzo^:Cٸ'Y{J5n|?~Za}9r+uźXбX `}'d:us|'u5v2ZskuN|^g:Yu3{^g:yu6]C׿o=k_g:uίs}_Yu3_gk볮ֵBz`]]ku Yֹu)X轿9:a]'u}>X{)5ź^X za/#oyE":~K^UֵʺVY*Ze]ϺO ͲS6CBǺeCl<4tS6tʆN(dClh =S64Ɇ&$:eClh }%6Ćzb`7{opG 6j - vo{9g7X o| ]5'OO'pZbCKlh -cCcl }/6gE4džzcCglh 56t#zbC;l ݰ6tÆn _:䚦bCKlh 6K"/k m-6ņZbCCl0zCSlh fozCKl0{lHǃOo0{7ؽ nop{#:_ γufo|+ȵy1 o`7 no\8w+w'x6V<}~a{zϪ =z{C{n{=wnF}{/:hClh k6t͆5fCl蚍kzgCl蝍o k ݳ{6tφV*ZeClh }W6̆f,eCl }K6Ȇn$ =U6ʆ+zeCl Q6^wfCl =5d㷃 k O6Ɇ>dBǚcCslh ͱ96Ȇ`v cCwlh^-6Æ~aC#lh 6{} =aS3lMݰ65æf|=}twMn9ž09}zhSSljMMI6Y:dSlMC6uȦ!hSlj͏ ?:8$dSlMC6uƦ &75&7Mor}뛟ZgEukMod煎u:`Sl258~\'l>/Mor:`d&7ٿMor| |qhk_Zid_}^Y{Y5ݰ65æfwO6æf ZaS#laS7ljM65æF`3:|f.t'7əMldžf%8_3iLڬYɲMNm2|&6ٵɮMvmk]&6ɦM6mrkOLd&69gۿytI-rg;+w56Ʀa"?:}M}/6ŦbS_lM6¦^ zaS/lM6¦F `7}]Ͼnn]6u˦f*:f4̦/zdSlM=G6Ȧр1{uΦ9o kMͳw6˦v.>>Z^%md=4{=t[eK_li-w]([zdK{li-?ǖ[cKsl=.![:dKli- 9tȖ![cKwl-5tǖ![?Ϻ#[ZbKSl鑭OΟJp>kψ=;rMȖ6ZdKl-U4˖v0[22[fKl霭ZgKl-ݲ_t̖5[Ϗ\>5͖zApXsli-gtϖ3[:dKlmɖ6$[dKl-'tŖ[cKli-[˖ي Glo/wߕr-ƻionğp{L -4ؖ.j[Ֆnk[mKm-Rjoq6?MeKl閭z\li-=a̖q[hKli-a̖f5[fKlioq6[kg-|nY[ziW" E }϶4ԖQ[jKom-}~=wg-ѶEuՖVL[iKOmi-m֖Fsӳ{ؖ&f[38hCUtRE/UtSE?UtTEWUWEgUVEU\EU^EUz ^z{\;V:}}w ?VE'TtBE'Tt]EUtkEUtDQQ:QQ#MSپa蘊x蔊6hN4nQ~GV Qй>4#כwkƩhƩhed*X4MSGVHTbS?S=TQ S'}R'}R'R7Q!=R%}RR uAO}P]QPQ9+z'+s +:*Z*< +,e=}w钊ި0 S+L0 +p +=zp3 f6W9́m_ W+->Mq5ζ6h[mkmݳmmo}|&b{'Lf6÷_Ƕcg݌uos=]q~-?Ƕc[lm}5gwZe[lkm[/oϚn/Zf[lkmuζ/e[l:t-:f[lkmu>ru7\{#wk=i[/mkZi[lmccu̶62ۿ9s=f[_maXmkm_5ضd|mk^hmʹ5Ӷf^ UPIUTIU]!{~3>3tJo!WUoURUU5\UkU5^UUUU3U5Po\r*\ꨪf2*۫2G[*߫|j.ꂪ.j6ꉪjfjfjf9cPUPUMPU=PUW_UVUYQeE)UTRU+UTReQEUFVYeU~VYZehUV[erU?TEU>W\sU>WuFUMPtUmP)UmR.ǟ~|Q~(?׿v~ho?Q{ǿ3aUUUU'U&U&U&U.U.U.U9U9U4U6U:UBUBgйwȪƪwªwªĪĪĪO#  ?|5coUoUtUsUxUx_pݭݮ]]꽬=ݮбwFos=]}}]==]꽰=]G}?> aɃyt|ߙ;WwxWλw;;޵w'x>=y{@/-5s59zλ yߧ7<?ۃg܇G?]9g =y?BGx>ʟ#0>ԟ烃}3'#|q<ٟOI|Bpsl>ӟ >ݟOSy?<ݟT>ş<}' ?__񎳣w4ј;sGcCaGWT}pG?h1wtѝ;ZtGhmwfp{({}z}GSwt;:xGhݻw}Zy`,-#7<'n~wyo;~' ^;~GhwtN;:~GhmwίF~-X;{G;:xG裝? hvԎS;zjGh]Ý^Si s]=rȹz;oGh]]6gYIv6=} ?2tYv5®~Ua?:89kwY] v]2w˻wZ`.w9ˡ]2oye.w?!{>1!yR𜧏Y#.Owy]rvӻe.wٹύ3se./vy˭]nrf<.w]~ـL}k}}ɐ/axG[|}Wl.w]~zѻe.w9]Fr{Żl.wyݙѻ1w]>Njq!Xg.w]F2zk}ؾ5M5wY]r~׀.w9]r{W]2oy=sole.'w;ZC{{e.w.wwYm}ֿw˥].riK9.v0.w]6Аurmke.v9˶]nu?\ .wy]6t C1r7G9\}Sdo xwoϬvٽ]Qû.Ow]2~e.wx=Ih>?o=\w>=s^]מ&`F^u;Ktמh{lOi= >{gf{zmOi=Mܞg{lOi=MuݶtڞFf{zmO=՞v={gO=-C㧆ўT{:oOi=>mrM7==֞^{kO=m_O͵ 4&R{:aOSi=m՞I{a+_:{:aO7i=-%Ş{:eO+} {&~-2x> 9>W ݹg~yQ"ܛ.M{_g.{oO= #kӑ}qO'i=]fOݸt&ӈ{Zo|=tݞx{pO;i=]4vy{:oOi=WpM5ܰ/g/ޱNӉ{rO_=}tFӎ{rOci=͸!➞m{zoO=ݷ 5w -sA냾w{Gx/5 Ҟ.ӎ{sO=}>Ӈ{uOi=ͺmힶ{g|'?NY>?r={{O{n4{)4U{mO[i=՞V{jOo?p{=ثwk~Y`=O'=^|'{ÿǰߡWWtxMtxM׾pYn5]^5 ^5}^/ Vi.iߚiN6iiiiiiˆs5=Wy5MXӑ5=[Ӓ5\Ӄ5XйFi^鸚iƫiš.iZ_r=3k}{y=~Q;l̐ ~`OSִoMtn͠iКfi֚iϚViךFiӚ6 ]׷5][ӭ5Zӭ5-[Ӳ5ZӮ5ZӸ5Vӡ5ZӶ5WӤ5Ww5}Ww5}WӅ5Wӏ5v]v5R?5mUӇ5=T54G5_cM Դ@5P5P 5P'5=Q5=QMtFM^99k邚.邚.邚foO_ԘTcRI5nոUVy5v:jƻjk<ƯZ-ՙ? {~,c[EuUgYeuVgVYw:^{uvWgYi β: sζ:<ζ:,ί:ꬫ3δ:unRgR}unV7fx u:\u_X3OyXCON]7xݬu6y\7q=XRK N58`VI N5`To0a78`KE v4`G v4`FnCŐ0 h0hpgi_|i[liƋ36xKF|f3|f3W9o̗>gowߧg}}x栿Qakhk訆jhj,5WCs54WC75tS:e ]U ^ \ 6#뽽[5mV ]e ]e ]e P5tYC5tYcr l =dV\5[C5Y: Yn Mj \c54VC5\C5wk~k跆j讆khNkh>k賆>kh? ?9׉ Ј y u>k轆kƯG5[C5`C5~38t Ђ7ZC5[C5t\Ck5t]C#54SC_5tSC75TC#54QCS5QC'5RC754M4ڪq{:44Ѿv+:j_k}MIu˾ :b_Gk}/ǾFc_k} az{ݯggϹ?#wqгn{{̇g3½0=ޚ};{/b߻žw} A{'=b{ľ};{WjpY}{neɾ}'cnu7#{W=f̾Y/w}8_=d˃kz׾џ <㹑gDy ||;Ͼ}Wޯ6לž٫9n~Ã;:x__k}i5״v_k}k}]M7;=~gz@=s/ǁf9':о/GG|{w>^=u]4Ɂ8`s{0!}~?{`f>03>0,?0&t|:tn,8`3l?0`)tn~`3?0,?0>0>`?'z/xq~p88p 8`3L>0s88pp;F{˅.<~S8rp]:`v!C:^;W~נ{~:rϯx{y[у7~_ =?9h0>`Qs{e3}<^>ߧ}٫1Á~08@CpC#kPjC?N8|tu]po޳4\P;㇜?!?"C\й~8OsPjCpC2O |2i1wCC2PC~a=y΀gϼ1PoCjC=p8ZP~ɐ}/~y7;jZPjC}wk:ڷ}C]ӖP[jC-tuСkPC-sIuơ879oY5ҡ:9P?s\/jCq#u¡8?yCMp8 GZP j^ Cpe_xy#1GϚ>GH7# }{F>zvpiO#zutn=ҤG:H#z[k#mxܑ;{^|y#EFyztW_զGH#=| #_!#{>GH#={{QϚv=ҮGZH#]{66`M#{ >ꑞ=ҳGHiڣZn \GZH i#-|Tt呮<ҕGZHomo4>>GHsYӥG>Hգȹ9҆Gg=҇GH7#xt呮<ҕGH#x;t><ҐGHC#]y147\>?|M#zW<ҟGZH#zc} Fk#={stn=ҲG 18׾GC{zkH#}z_~=үGH#z;|j#mzGt=ңGZHqpgsmzSt=ҩG:H#y^j#zUV=ҩG:Hc\Cc3>~9}cV>1~9yε±N9 ZXKc{8f1Cz=zC=f1ߏ?.tcV=f1k{ɑu?}g XO׸~c\?1C9tcsq[:fsOs;1wxxǚu,<1׎_%'Ywcu;f1 w̵css|;q1gyc&<^ {;19ycV=FDG;w ~ذ;f1o|c6Ǽ=n>1|c>3=f1|cVsnjf1y~̾l<1xcsǯ >w̾clnp'ksa[g O8|p'L> _Ox{ؓDŽYz0'= /O{ܓ >2t䉡 3ꄭ'L=aE>!Xc N{¸<-ƽgY{zgY KO{f0'<< Oz|= 7Ozfg'<; NXx'<< Oxxn%݇!{(sy|p'>a N8s£֜5'<: O|np'? Ox|vp$9gInZ&> |x!+'\9 Ox.l7Nu¹T#l;a sNs£Q':1Nu¯֝pA'L:i: N8t¡0a' ; wNu¡=',: NrŸ|p}~$ƪ9'<:a Nxu¥\sC>nxOqh&ڠ&ߛloꅦhgsǟ~>}FhjiꞦijjjjꦦnjꦦnjjhjhjhjhjhjFi B皥K߻GzS:Z\s45GSs45GS4nijniꖦniꖦi&kiꌦhꑦFij6jj6jꚦhjhj\d}>^0`hꔦij&ijis )M*M]'M="M-%MM-!M](ZAkڤi7JS4uIS4GS4uKS45JS45JS45JS4IS4uJS45FSw4uFS[4FSk45FSo4KS45KS4s{_u:Z ZW:i>뚢끦hꁦh&;:#:#C댦NhꄦhjCkZM=M= M MM]M]!e)kOY{Ss ?5Opj~JiΟfʀS|8e)OqʐS2Ԝ?Ӽ?5OYpʂS)7NqʍSnrf)Npj柚ߧY~j #Y~j'~>5OSs<>5OSԼ>5Oo ]^ci2X7OCD띛9jΟ8)NS|=5WOS3 >5OS>5OSt>ri9qWe)O9SƟ2:Tywޏ;a?TߜS}soNͩ:ipMCȐkSzTOjSuV:A:T3SuN5өf:>7ݯNuة:Xotө>;`TjS vyNթ:Bw 8ctNթ:WzTcjSuNui4٩:Xcӿ?S}t#uO7\{ȐkZLWiw֙:QgLWi3u{Gi3u4ؙ:^gzLi3uδهOuי:_gL=q5vi'Ξ4`]ǝ}kLӝ=yȞGiij;~gZLógXV^ӖgZL73my)tn<Ӓgkɳ5-y)噾<ӚgLO3my~<ӏg:L_}yk_5ڽе+ X޺=>g/szk賦4f>gLi3{=gzL'3}{o=ӿgL޻fOm|w<Ӳg:L{3rtәF9Ӿg:Li3-veδv:4gLӜp]ۜi3msδՙF:Hg錝g!Й:CgOϸz3ƞL7qg>c8}3Ξqg|;Ͼ=sg\=3ѽuo8pϽs ;=gL@gj3=ryϙ9(gZLϜ3rkyx9ȾkLǜjpXϜi3-scΙ9>ZLi>̙v9$gL˜i3 t]δ˙v9.gL3}sot˙9X˜zL鎳#r/s=Z\Dε˹^9z\sk\srUεʹ9Ț.9*z\ksrCεɹ&9'|r?88-=!Yεɹ8z?Jε¹8zskss?g9Ϲs,?9Y~s>gs/=;9ιyo+u3L<9y7Yzs>oYzsSp;9xs'#k>{x{s3ݟϘ ݸŽ~A7\7s rA5ƹ8\sr_˹~9vz\לssuuϹyuywtλsޝwZ\s\g9ϙ|_ >__ >Y|_ s|L>g99|sVs=g9{ϙ|}ɀ?2L?9Ϲs֟s=9s}9=5=psXYZLoq[{p[oq[ o'[|o[loq[o[\o11[oq[\o[o1[loq[n1ӂcbz-vXby-x-?Ga|-:CcַX~-8z~K"纠[o1[/[o1KCk5}־[o|oh鄖6hq[oCkc!k{웊-fVKOxYa-b]u-VxXc-8b]u-ֵXb] >[2[hŕ3Zh1Ō-fbK]-vbW]-vbW}-~W_>-lŻ{ZiqřgZij:SZ;r١{٫.4х6M:B/] -sw.υ.BZrK\^BO] su.tӅnxA~tWFͅf8BS] s.хf=zBo\h q7.tȅ@B]h t.=4B7]hX\ rW.4ͅ3ZB\ ]re.Ʌ>;E憽}5{w-lwa.˅vvzk s.4υCzB] t.҅^Rg֚5\h v.م6fz:.܅VBC]h u.ׅ u.ՅOzBw] u}Y:B] u.؅hB]h v.4مbZ}5oF~Ϛ><:B\ ]rQ.4ʅn B\ =sI.4ȅ :2Bs\菋 6tkk^#A\#tQښ)ښ)ot__hik6ikViW5])Ǐ Z k{>m|6ln66m3ڏ?&t6O }|Bns6s|ms6,o6\l6+۬l36'ۜls6OLks͹6ڜk3|l36G۬l6ڬkͶ6lks͵6\k6|kͶ6lk͠6ڼk3ͨ6ڌj3ƴ6|k3ͮY6j3ͮ6kYfGommv6ftnmsmy657Ӯ[F:;{fDmnHo3͐6#\h͏6;t{,Π6?ڬi͞6oli3͑6G@7fI3z>kd%;.KY~ɇ?,8DL4/ypɈK3Ҍ4/Kd%#.?duv\|>6\̸dGg|4/YpɇK~\2G#ILd%.Y%k.9səK]2K\%W.rnwDqK\d%.vɬKf]2ad%.vɧK>]/ss%._:f˂O]q\d%.uɭKn]u%.YvɲK]I\ >O]2a%.9uɨKF]2cbpΠbɹK\K|%.sɦK\Y賯/YvɦK^Ul|d%.uy8`aYv]'/YvɼK]B9/9rɑK]G;ܹd%.uɥK.]|5csҜ4/uɪ_\%._YgEvɵ_3aYg%.7ΟK\)ΦK]2͑kGt:.wɛKV]29eϝYld%.{m~%8vŴ+]qBky>^1Wlb17Woxsš+]q늁Wzj˕e_WŇ+&]1IWXpń+\q3WXv}tř+\-WLbSqŚ+\}ŀuf\q+W\9pŒ+\)W|w^C/W btŠ:Xsŝ+]KW|7\p}j5^1YWldm.rkWLbtş+.]1sW {8xޞ{wź+^W jYw/Ʒ+&^1WL:Y?ន}wy^c +f^19gozŞ+6]犝Wlbxy+^Wܽb{}+N_}|ӳX~8~+^_qWbW:J\h|y}z/ߧ+]q;•бWJ?\+p 4vWኹW̿xWor]o\uȵAОgWJ;\ii+-Y=pkqO}H]"k:#::):Z5:λsޚ莎ÃGtKGtHGt4BG7ttBG;tHGt3Zo]tEG{tFGtCGWtMGWttEGWtDGOtDGOttGGOtCG?tC#k:::z!: >DSO -'9 =-Ț胎<5m mmwMya5 Wڡ.hh6h6h6谻>Cvwawg"r;Z:p;;l:찷N1 龙w}|Qk{Ig=(]>j5:ڣ|꒎F;ڤs|C1;Lp:::=:%::9o~ {OC?è:?U;CkGttAGt'd]qu4AGttEGWttEGWttEG+tabfvafvkvaywtFv8fvacvvaivRKvFd5uŴ ;0[;\p;\_u:=8_w]uSO]ueXK݇Ǽ격˦#"r˩.,벬˧. ˧.|~HO]>u12ˬ}l5uyeYǟƭ.Ӻk\첲.2˷Yg_{]&vby]ue^]vyYs]u}AƿWE_2`]&v`]ve_]Fvyb]v9e^y]ued}]ud].sskNw5ûfz7|]t K<2k~wY5߻{|]3kwͬ5fbL욉]3k&vĮY5ϻy]3kw9B ݽ7خ]nt5j׌횭]^t鮹5h ]skv 욭]3k6wܮ5?\7WaOgG8{k^sf5y|k^nd f5WY{k__gu:Y}k&_3׌WYc#|f5ǯ|k_3\w 1}k^sל59}k_s:vTf5篳c_׋1ϯ9~k_3Lf5˯Y6ӯ~:5?ȹf5w{]{k&_f5ϯ[`Ztyh$X׼6x Ⱥ:Z\kpY5?9]Upk^Z+\D?:Oܾf5}om $BC %@`wBgBPCK$ز,I-ɖdYdI$˦:P">?極~뷖>}e~2Y?gL_y~}lkܯ3g,2YF?g5ijYmlcƾ>?g5YMyV#<jg,ße V<g5Y_ȹf3j,pe+ aA3,pg9 Z«Z''^#8f8-m ﯿ9{^4 b ]`›[ض~-k] \`;]0~>.0q |\»[`~-ki L[`XЅ{?p#.ps \`K>.s |\KGָ^.nw ,\#X~-mq \9c{%~~sb?c8~.pt \+6.q \;.pr \`.pr [ ׾gڴ.0w'O.v ?5v.v ^` 8.xq 3vWk1#` 2O'Ӿ{N/ ]`ع6/py ]XYcԔƄ}kk4/p} )sSq \`;'tp{8.q l\w}F.0r \G8/w ]`.q \Ÿ ]`W̅{u.s\"7EF.rs̿sόs~ɋ^"wYE~.rtL]d"s9ךcE-2o}\s{93oqߋ_d"E~/zߋ^"ٽEv/{L\"ȼE-ȵpf3}М׸Ic?xLx.?l=:ڇ̸3}Ĝ>vŸ#g|>n6zۿ OpZEgQ-j ?c\-jE]Ouʢ^Y.fQ,E}sˢvY.e y_<uѢ>ZIZgQw,jE]CȢ.Y)zfQ-Es̢Y/eQ,cQ,EcʢFX :a1|jE1̢.YbqkšXtbn)$:aQ/,Žsm1ƢX<9$ZcQ;,jE-)ŢXcQ,uɢXbQC,jE5u{zvY3fQ,jE]'Oy>{Gpߓ?gû)u35ݢ[xnQ-jE7#38wcl[ojGOXcsX%/1vK]Աk,^7'XߥϜ%&/1yK_ys>.}q%.rK\bWLX k]w%.tK<];X¥oy%..1sK\xĵ%-mmKl[bۖķ%-mmK?1rm|G%.1pK[طľ%-qoqK[bĸ_98x%^.rK\9G%~.s0XZ%.quKL]bҥ1qKL\|=ݿ1K^bSݥ9{ػܥ8v~ 8%/qxK^sX%.w%Kl]b XĂ%f-1fjޛc׆3==:sĜ%,1g9K.q<\2's>.q\f2yڻ93=Xg2/s\2;yef.3s%SYe>.q?z_t,]f2;ٹe.s|\2yϘpen.r\2/9ef.r \f2Yx寝reS}Ue.st]f2Kٹev.s['}ۄ5.3vߏv|v˼]2oe.st]2,8g Xe.p,\f2 Ye.p,\f2 Ye.p[f2󖙷̼e-3no|[#[f2c̘e,3f1ˌYf2gٴ̘e,3f)LYf2/7'\\YGᗎ)̦0| 3)̧0\ 3'̜0_ϟGs/̳0< ,̱0, ,̱0 s,Uc\ s-̵0|2-̯0Œ -̶0 s,̵0< -̴0L 3-̴0L 3-̴0L 3-̪0\ *̫0¼ s-̬0 3+l>6s|c:lVy6ì)s\gL|a=l96f||a=l6{|=]t a6fC a6fC a6fC a6fB a>B a.B a.B a.nsFC|r"̉0l!̆]~=Քބu΄fL+a`'?ƥ0\ (̣0| 3)̘0cŒ 3?3DaL1DaL1DaL5~DaHu yI'DxI'Dy6r̖["l%bG1#fr|CynFG7"fx,%bG;4#1ynGY1#yļ3;bG툹1#v̎s:bfGꈹ1#uļ3;bfG kfx쎘3;bfG숙1S#fjLs5bFՈ1[#fs 591_#kF<4c#nČY5s7bFۈy1{#28bF܈1#fp{f칿n>GwADXaAߚƆ"l!†"zİ>D1#{|=:ȁ3?bG1#f~̏3?bG1#f~̏3?bG1#f~̏3?bG1#f|ltk)SY1#lČ\ؚ9Eflݜ&DӟpYF>D$BD91#|Ĝs~Ō_1Wx빙b毘+b+k+fbƯ+fb+yb^up}ֵg_M 6i}srړo2c\[gqns+[a V¯^0lg+ [a V8¨F0jQ+Zaϸ}cyɔx+ ]a CW0tct+,]a 7W͕Ot+,]a KWXt+,]a KWX|at+_? SWf0s+Gغ0t+\s~poI+[ V¥.piK+l[a V¦|2jO+|Z Vش¤&0iE+ Z Vlg+<[ Vx³la+Zo>vk#ml?V~7s+[ V8¸ƭns+ V9VX¶mm+l[a Vض¶mm+l[a Vض¶mm+l[a Vض¶TF·ڄ5pkbƵƌk[9v6v>Ӯ?+\ 7Wqk+[a Vx¸ƭpmg+,[a V¾^0w+|\a ?Wx»ޭnw+[g2.ʸ(㢌1.ʸ(㢌2.ʸ(㢌2.ʡ(o|r"ʟ苂cD5ӣfx\QsjG5ۣf{Q=jGϹQ^Dg2"ʈ(l!ʆ(lr ʁBQD5Q?93DħOz}=NF9edQFFcQ&FcL21('\2(1(l~gpwǼ2('2:G3;3(?1(r0(r0(r0#L0(FexQFeeQGye)?Ϯ?(|vF>}QGye}ћQG ÑOGQGQGQGQGc?c̏1?ث?}Z!b:!b:!b:!b:! b! bz!b b b b b {c썽ur:cq:cq:#Ǽ1::cL<wc܍q7wc܍q7c|~xcq8c 18 #;c&ƛob&Ƶsb̉&ƛobq&Ƙا\WΪ\5v>w_5Yg1ŘYg1xW_1~W_1~S_1f8cX[1^ŸRY16ŸO16cSM16žb*ƫb*ƫb*ƫgbq&Ƙcb|+K#܉1+ƞ_b,&Ǝ+b"Ɗ+b"Ɗ3c|1^y3cy̏13=f3cfzL1n7z\qs=nu>n y7}ܼq>ny7}ܼq>ny7}ܼq>ny7}ܼqs;nF7f{ Wn7xqsn97|qs>#9rlN48@#c,9?=?3 6$ٞ0f{lO =a'ٞ0ya'0}¼O s=a'0z\O s=n$90fzLO $0bkžԔ kH#;H#;H#;Hp#1'Hp"'Hp"0LH\G;# $xA $X`B $X`AO pdWU2v\e*;WٹUsǫ<^*GWUvs\*7Wi#}}s}S|iȿͱ/VŪXbU_U}/VŪXzbU/jUVªVX ZaU+jկy{^6r6Y9ڧ{{BZhU jU V5k?0c:iGV5ӪfZKziU/UVҪ^ZKziUUʹV)M:iU'UVuҪNZI:iU'jUmV5Ъ>ZA:hUjU UM 3FU}V#ǚjU'jUVuѪ.ZEhUU]VuѪ.ZEhUU]VϪY>N&UΫcgcjUSjU-V~ZMjU;jUVӪvZNiU?Uc?V|jUmVѪ6ZF3rV5ҪFO̚YHkhMi5 4КZ@kfMi5kִ̚Y6k59ט556{ \2ko<> ֘6#o|u5f1sk\Oع5ޮuk|\51+X56qkb+>n:3Xڵ >~c~&|3ƥ5.f5kYcCxƛ5ެfkYcKטƜ5^q&qlIkLZcxƢ5hEk,ZcڗMƝ51a͌_35kLY35~ͬ_35~ͬ_353~͌_35|^3~z^>qaGvckXc+S_''â ƥ5qiGkcZ'wZmsv0Ny}I8Vy:v~6r|>kǮ1|k^3|k$Nr;$N2:$lNr9$,N8=sw³8|ns7Y/iywͺ1=;?I:I@Y=Z(z-Z*ђ)(((((((:(((4QR/%RR%QKGPR%P+FuQR%uQR%uQR%uQR%uQR%uQR%uQR%uQR%uQR%uQR%HR$HR$HR$HR$GRc$5CR$5@R$BR$ّ=Z!؞?oCc{~zS?&'}9~L3Z+z+++***** JjJjJjJꩤnJꦤnJB#))))))Z"$ۓNꨤJjJj$ǓNj$O8$C M7Nr6ٜG$QFؾYFbg͹ysI34PR$G. IݑImI=I I]I=IɿpǮ|ƽ/~Y#zd]0e]ku]_u\Ǭucu̺Y/e]uYʺ^Y+ze]u3)}9}ݳzf]Ϭuf3{^ ^gg\uZfXg6Z:5ǺX`]ku9u}l_g:?rus#\_SkuM)5źXipmҺXc]cuͱ5ֵƺX:b]_ku15ƺXzb]_uuº>X`]ku] 5>xmgkieܣֿ{{݌ix_?Yol}ֵݺ\gh]_kukuͺY|f]Kku}sкY:j]uuֵκY62}cl'_Dzi]u]uѺZF#h]kumֵѺ6ZFh]kumumѺ.Z >Ѻ>ZGh=|ju5ѺZCh]7uݴ5ҺFZHpNY9Qyy1IB<|97{s];um׵f\זݱX[ku]׵度\חZr]Ku}/u庮\וr]7uֵ[癔K麔K麔KȽ5 ҐW{[叼Ugy&R8Sz8SZ8#Ǻ8 S0 S0z^w돝ɔMiԛk˔Li˔Li˔6M˔L˔LĔFLi;z1Sz1Sz1Sz1Sz1Sz1Sz1Sz1Sz1SZ1R0R/R/qMۥt]JץteJۥ_Jߥ4\Jߥ>z=Z/RZ/RZ/c͗|)})ݗ{){){){)y)y/ 7FLiJ馔VI魔vJ}MSc4FJ;CJˤtPJC4DJstDJGtDJcDJDJOMJS4HJWtEJWtEJWtEJW4EJODJODG؜kz$GRz$ERZ$&Ii&Ii&IiHiH鐔>I錔I鏔HiHiHiHiH鍔H鋔HiTxx%8`]wtGJwRc:$AR'k$IRc$OR$MRIq&řgRIq&řgR`8ƞ{RI'URL1(Š;SJR,J(ŢR,Jq'ŝRI'Ş{RI'ŚkRI'śԟ>RJ,ųR|Mعy2oSmʼMykNk~f0w7 sw`Æy w07 sw0w7 3uì0G7 t gs|yaoan? szÜ07alm&17 3| 07 3|07}>s><6x 3~Ì07 3~07 {_ι~S~ޏs>b2hu2?{g>&x~n|?ᑿ~?7 .oxL`7 &ot z; `7 o0x[7غ n|[p>m}ssaW<_ __6e]lhoxO:eCl S6tʆN):eCl S6tʆN$dCol 76ƆzcCgl czcFa\lh -E6~uSlh MI6oǿk mM6Ɇ6&dClh =O6dž#zdC[lh !64Ć6c멱ȱ!8 =G6Ȇϣ>'dCl =G6Ȇ#eClfClh Q64ʆF(eCgl =76Ɔc=6ɆcCcl 36rš#}#;Һ#;Һ#Һ#5_9)z"'z"'z"'z"cO4FZc5FZc5FZc5FZcDZ;5EZ;5DZ?uAZ5AZjړ9~ii~i~i9ciF9CCgM{λ?ųX2w{r2ȴ^H32GǼL24z#IOkM74M74M64kӌM44[\Ms64W\Ms54W_4awi^N;ivOiffFiffFiffGYfI%iYfI%iYfI%iYfI%ifBiw饑g#͎4;H#͎4'H"͊t*X[6iNِDi>Ci>YfAi?m4fOi?m4 His?mƧ6f|ڌOi4o[f ~wg=5֜{OZKZJZKZJZJZ2X Z&[Һ%[Һ%[Һ%}-6lMmM6ɦ6&eSlM Q65ʦ"ZdSlM=C65ǚdSljMMI65ɦ&$zdSljM165ǦcSolMo2}L&W7~c=|}2ϛl&7yAsm+6uŦbS[lM#65Ħ:bSGlM5;cbS_lM}/6Ŧ`{`.%dSlM]K6uɦ.%dSlM]K6uɦ.#zdSljMMI65ɦ":dF~~kZeZfSljM-e6̦2ZfSljM-e6̦v,:eSljMU6ʦV*ZeSljM K6Ǧ46ɘMl2f/|̿@ߑ?#Cm&MoxǛ<&7Mnrt&7yMnpu&6YyW}}Oq_'\.d&_7ٺMnru&?7Mnnrs{{S3=pϼ~]?gؿ-o[bֽaW|x+=ŞW{s4kG<MxW[@[gKli-}ϖ>[gKli-}ϖ>[gKli-}ϖzDZso1K'l~=Fmd]ƎGȱ [gK'm-:bKmi- 'Ė[:bKGl-#>.aOli-MItĖ[aKgli- )X[/iʖ"[ZdKli--EȖ"[:cKli-5Ɩ[`KCli-S}ӌ{Ėn6[eK[li-M)4Ŗ[bKOl鉭os߷?O2[e;|<4і&?'Ucmi-]tՖB[ziKmi-MyȜ{/NfG[hKmEOؖNI[:iK'm--ؖVJ[ZiK+mi-#-M4ՖT[gKSm霭ڔu}ϖ:[ZgK'm-ͳu4Ζ``ƾ9 ן>՘7 ~CӞ7wۖ[[r뾹4}S^}7?fg}ϜO;n^-?gp[cmkmM#x~ϫǺk[mkmM׶_kE`š>~ km[mkmͶٶ5۶flۚm[mkmͶٶ5۶Fgl[mkmͶck:m[mm 5ض^zk[omؚ&~sMSmkm˶Զfzj[Kmkm-Qcj[mkmm#:k[cmkm5Ѷ8f[lkm-U?hmM#|#]zp[n9?g=r[Gn/9_<Ǟ/cϗ̱˧wۺw[nm5ݶtۚn[mkmM\Ӈۺs[#nkm5ݶ^ۚj[lmݳtж.Slkmͳy5ѶSKmbpuжAg[ mk;C:h[mkm ] vtk0};awxF0z;,Ww+s/q|;L;\wؾp};\߉LXcwp}'9v6ewXh=vN~\hmpv;gw8s|y;owxv1ޞw;鍝>y;|w>y;|awj:wF0zљgFYauљW9uguvg؝awNgau>gs6gapϙ7{ןq3p< g3o9r w3 : 3p8 3y{azgyϱ9}gxaygXa~gxygxyg8avgvSاs>gs>gtBF d8a~gavfgavfgavfgifxif`7̱eus9ŭ 2p'Ù g2p'Ú 2<˰,ò 2?0r̵ 2̰-ö 2l˰-ö 2|- 3+3/5&fa]O6faWwF9O=:2k-ƯhpeW&\ מ<7f|'C3 3=~oZ< 3l̰0 3p.ý^wexeuwea^yea^yea^uex]w~eW_sea]keXW_~eW_~eW_~eW_~eSO>eaXσYZe+{&˪,ʾ+-J#\r-˵,|)˧,u~eW_;YgYeyeYeYeٖeXaYe9XcYeYL3Yd_|&˚,k<2)ˤ,wɲ&˗,o2&˘,c8e=YdN;YdNYde@Yd@Yd9@Yd9H#YdyAYdyAYdyAYdyAYdyAYde@|Ϛ/־rܼϚY9k>gٜ5߳_?7Ygٜ5fsͮY3;kfg kfz<ϚY;kvgٝ=q\ϚYc3? 20,v'31, ,r0{3r`윓YeYeemYe9e`?9f^YeegY.f)?>s|0sL2Ǽrlq/ǽrq/ǽr˱.Ǻr˱.ǹr˱.Ǻr˱.Ǻr˱.Ǻr˱.ǹrq.ǹrq.ǹrq.dzr<,dzr1-ǴrL1-ǴrL1-ǴrL1-ǴǏ3.Ƿr|-Ƿr|-Ƿrl1-Ǵܧg1/Ǽr.ǻr1-Ǻrq+ǭr1*Ǩ7<Ƒg|sds0:s|1#s12s̱1r/ǹOXxcaG&\aGC#y^{9x]w9x]w9~i잟|#k9cc9>cd9Fcd9Fcd9Fؘcc96昘cb9Fؘca9xas9ca}9c>C+ǸKlϙ9=gKsə93>gr*g#~ϙ9~ٟ3sfΜϙ93>g3sxތ~ϙ9>g3s{ϙ9s>g3syΙ9s>g~kxf5wW >]s{5w]3{5w]z׬}5e.vY˂]2`MY מ)yñO]e/|} ke.svY˚]f&xvˤ]h}F}lU.v9˩]62iILe.vٳ˝]g=.wvY˗]d-Le.Sv?)w|?KǾӧ||M~G]wG7пʹg >ɴٳ|>{M8ߞwP蹟\|{|Ӟo߮]4ލv~ع].uv+z=g{ή]9svsz=g{?}ީv#zGi;Үw]Hޑv#zG=f{̮]Hމvz}f;̸CcGvz.]d׻Ȯw]6?5a;ʮw](QvzGe;ʮw](Ovz/ ׽{~G޳g{Ϯ];wv.{]hЮ]AރvF'y.]f׻Ѯ]3gvw{qϮ޳g;~pg|{vz{ׂ)ak{׮]]޻vwz޵k{׮]Wޯv_z~j;ծw]Xޭv[؞޻vwz޵k{׮]]޻vwz޵7ּzᙼwwww?qTTT{T;U޻T{UTT޻Q;O;O;O޻P{O{O{O{O{N{N;N;N;N;Nν_<&&&&&&%%]&&&:9l½6}֘gN9y䙖gN^5UӂO[s}yFFSy6ٔgU;N39TSyN9T &+ϝyOymyymyymy湚hyYgiy湙iyvٙggyvٙggyvٙggmyٖg[my~gdqycy]qy噖][Y]wXp̸<3.ϸ<˳*Ϫ<ʳ*Ϫ<ٱLɸ<g_y~O~9gKcyyGgygH!y9H#y9H#y9H#y9HyFHyYgEyyEy^ygEy^ِgC y6yCy>=dž=6a3^}ڤi{ǟÍW{屵W ǜ=qg﵃O1g1{|c[زS9&фMyضc<ǰ=1la{Ǯ=vkC{8ǡ=qhC{ kl))ǰ=1g'{i{ _Ǘ=e/{|_xǏOƔ=qd#{cg͔Ӯ}jS{Lc玝9ǭ/ mp̤=`{W{fYg{9g{9g}ǔ}yg{~lپg{fپg{?1ל3=s~Ϝ3~dKXǒ=d%{,cDŽ=&1a {LcDŽ=&1a {Lcǂ={yǂ=3{g{^)3[?g c >9=qp}{ܞǺ=mm{lcضǶʔ{ᾃx=>ş+ݧGKi=-%Ğ{ZbOC]Ǻbi=mw\{bOW=])4Ş kbnlM{i=;tǞ{cOsi=7ƞ߷_ϸ¾V`_k}} uNX aGþfn>Y}k}}o1e>y}~>9}s~f\{}s|>}~S}~|>پ^\ݰٺ`=)*c_S}OOoB> |y3Fg<xϝgz볂?<{.sy;'{O=a߻}{?~`{w}|_s5&.}aw} {w~`߻~`N8>~ľ}'O{>}b;ľw}{>}`_OqOy};w{ޱc_[k}mz_Wk7:{_g} ֣S3r~_k}=3u澨י_}Et_k kt_k}Ku.ץt_}-Eס:t7rI5&פt_}7צZt_wk}͹?uGj5Aמ)ܷ.}[ K K C :C :C ڳ= ڳE ? ? ڳ= o45=ZУYНYМYМ7 |ƵuZЩZЩZШ-ZxsYxqp#뚴I I yA4OY߂[0 o-k)`6*`>炎- Vss`n킹]0 vAdA^g-R0 fy^0 fzL/3`>{y_0 {/|ؚ9_`D'ń5&P`B &PA &P`B `Y_0 f|/3`_0 f|/s3s~F?{w~>~w?͟'{G4|2S L-0S L-0S ,-#\-pW ,pBLS L-0 ,- +0 +0 \+p |+p]`\q2ܔ3ϸ' ,Be5xZixZixZi~Yi8ZhY`gvY`9?,[lvZg{;b½.|" .2" .2" .2"{-\3Ɣk.2".r"-ٌk.2"L.2"L.2"-"w-r"w-r"w|-"_|-"c-2"c-2"c-r"W\-r"W\-E=PE=PE9^dx3a_OX`}s&ܯ둢)ꑢ(ꌢ(ꋢ(ꉢV(j^(ꃢ>(ꃢ>(ꋢF(j"G(rȍ"7(ȍ"'(a/1a7Ly4s"늬+2Ȼ"+Ȼ"+Ȼ"+2-+"+Ⱦ"+Ⱦ"+Ⱦ"늜+2ȹ"NJ +2ȯ"+>'``}EkƳ1\-r"W\-2"SL-2"S<-"3gu{'"s-2";," ,," ,,2ȸ"uuS{*/wM){7tQO;uS>=b{/ܧ銚x9붢n+궢n+궢n+궢n+궢+j6+j*j*ꯢ*j+w3% V`% V`% V`% Vz{ZIkXIoXItWIwtWIwtWIwtWIwUI[UISVIWtUIWIأ_JouS>%Szع*頒*Ȟp]'tRI'tRIQIcǮin*馒n*馒V*iV*餒N*}Ԅڪg?zz`<)~=}{կ%ZҮ%ZҮ%ZҮqMזlIϖ'ْ,iҿp;K9K9KڴMK1e]tkInI4jI4jI4jIiI4j jIjI_4cIt`IiGgIOtbI'tbI'tb;'Mګ'Kz'Kz'Kz'Kz'K:!K!KKڱKڱK=K?#;lI~z5[Ҹ%[Ҹ%}[ҥ% YҘ%ZҨ%Xҿ6OY%=Z%MZҤ%[ң%-Zҡ%ZZ5K)tdICGE՜Є O IKIKzEKZEKZEKZrMt`I? X@umT:%S:%]UH%Q'%MS%]S%P%P%-P%-P%-P%-P%}TҊ%=PStAItAItAItAItAItAItAItAIA%@ 0h^mk8W~&]q+tŁ8@W]q+^4q;8x79~cp4Áf8 @7p.8z@=pt/\sf|Ks.p透l:`tpCg/xuF|98v6K\:si3}gqG1_:Ou/;/9xy;Xw;f9|{;c6p{ǎxăx.p[:Xt0G9wsp?,;`s_ >ys-\9Oxr9NNJ8[Xp`0`g='{Wg8uNE{#\:0tP9fup|U:`XuVU:<:xvg<;NXcwml;`vml;`_;vkx39d!kYsȥC99d?}:{_m^A :|s|Ql:d!tȦC6Ml:d!tȠC͔Sn:_<wȵCml;d!xȾC2i;!9uȩCFMl:d׹w3m,;d!9vȷCf:tȧC>rQ:d!yvȔCnyȊoq!|C.͇L>d!|C&2ɇL>d!|C&ˇL>d!|C&2Ç\>dOYՇ>!Y}C2:)k|;|68Kc#硑 ,>dax?Y{Cr=!C<=!G9zCX2聵` J#y{Cv񐟇!}CNrӇ>!9}C>ч>d!2ˌ.2kˬ-2[l-2_L-#Gue\se&\~`}| ]v '2,/6#.2o˼-2o˼-2oL-32w-s2w-2o˼-2O<-3G>pe[ne[fgevYfneYfleZfhOskˬ-2k ,s2\+̧2,*3̌2<(l_6f|ٌ/3̑2G}ټ/elޗY_6f}٬/el֗wͱe9P@e`|:K,)̒2K,)̒2G<)̒2K,)̒27(s̋2/ʼ(̌23(3̇2(eL΄y_6f{l/e̗2G~٬/sl_6f/esogdl(l^.OX3+L7v8a>RK/e_Y;YNWe^yQEeN9QfC3v;;gI%eYRfI%ep:_l)̓2O<)̓2O<)̓2O#1GL=bSz#qGL= y#G;b`^Vg G\?x 8#G}L48b8GG?b׏~#}sG?b8b>o#p N8\/G:H}u ѷ]G4r#t‘^8b^8;u q468GzH#}9Ǐx~#qG?G?uqG?GZ'Ǯ5p.8GG?bۏ&8GH+醣S,>ų~ktѳs<~œ GzH#rWtˑ69θuđ8#GHi#]s[ˑ93GH=}̔ё^9GGZH铣Hi#]r54ȑ8G:H/#-q/tǑ8!GsiLӞG:EXY\:X/>rѱf:NXKkq\UzXOkc=uԱ:S:X+kctұ^:NXc]suα:IǺX7cMuԱ:Y;3Ա:9qyXcvÎֱ:Soc]vˎuٱ;bǺXoc-u5ֱ:`[&ko cumXkc]v5ֱ:c:&ic-q5±&:DXOct5ձ;b?2Yz}> p?;s#SOǿu/?9?;{9sػϱwȱcNޏc'ν{o9r{ɱwc,Y{g9.s{ϱ#o؛׻αwc:{9t|{9^sбcCޑ3y9nsػͱw㫱sMucIXc|>=/c}}]̱>5߾wN>'D{h=я5F?':D/hxO6>'Dgmz5O=ў'Dh}x=O=h |IO4>=Ѥ'D]{_OF=i'D7hMzOOꉎ=)쉶;3gO|ຆ<3_':D}Ot>ѭ'Dh{qOt=Ѹ'_] u^>'zD|Q{OV=Ѩ'D۞h{O=ѿ'DÞړ/DchM}Otw 'l8aÉ=Ѿ'Dwh>?':;'9։F?aɏl; gN8s«^{¡]zOt>=т'zU'ZW'L:'L=a NƉ9'ZS' ~od7ϞY߿u~}3~{oxr-<>'D/脓ȹ&8'z'?a O4 O}0'L? O}0phdx윷'=a O}6'? Ox֟hG<<6Dh0':Dk `3' >a8 O?^;a_OZ OwsOXő/񜿜riN_)6:TSr}N髍Sq?Nǩ8):Tۜjם_Nɩ9&TSrGNɩ69TSpNué^9zTOjSpNʩv8 1>ck䔯=q]ׄY>e)O}ӏS~Tp1.8|>)OYNũ>9 T˜O;g~ʜ{ڧAN5ȩN9 Zt)OY~GNɩf9*T2TTS=pNu©N8zT?TS pN)O9~ N{?e)OuV8n8)O~S?)OplϏ=gL_SjS]qN5ũ8T;_ >/k_;OkSTo\<)O|S.rti䘉<)Ox8e85MpSpN)_OuNuv8 ?)O+s8ۑsQ ]6脊6hh^hFk쯰 *ڡ*ڡ*/z 鈊hƨ臊芊hh[ih֨芊茊hh֨uQyaN艊~蓊hh芊|H*1*z+**!*Z s+̭'9+ +)#kk +p +\p +\ +0 +_ +|e5W]awvWx\uW]sW}l~W^affVYafW^azW_OqN0 +?9r + +|V[alV8[m&WZm{lVX[pUUpITTaREUVPCUxVY[KNXcZ~TPC>TxTQGfUXVVqvUU_2{z߽=ރ9~ӱ * +› *̩0 w*L0 O+'*,p *0§ʟ£ *p7s?8ʷo;vwZsUVarO*l2ʰ*3W\rUWYgUVY[emU&W\erU&W]ev՟~s_WTCUW_e~UWY_U-PeUW@UT5@UW^UWy^FU6WY_e}UMPK/U.UVݙƞ*̮OTYUeU0dYMU6UT5LZʬ*ʦ*ʯ*rʡ*lOvUUXuʩ*㪌ʪ*ʦ*>r#P;1󿞟*l:cg8tƨ3ޜg8g8sƘWs#g9{hg>z3&1g\8gLi3]pδ68gL3i/q g\׾xƵ/qg\?N8cWskFֿfºF8gL;}ȱ68gLc}cMV8gZL#3p%δ>8gzL/ir͹; ׾+S=wcOqϏ?=L/Dp~28kLi3rQδə.9 a=L3t̙.:Sۜi3ms~klMGi3s{sstЙ9>gZLi3sqtЙ:KLδљF:GgL3sϙ.:5gLiҌL?O?}8>]wtܙ9tgXם3Mw ܙ;rgLϝi3wܙ;ngLӝ鼳?9wg3u}o3 wݙ;g:쿏>#Wӄ9ӄg#kZojJ#kO5PMtNM4RM#4R5FRMKbMOմcMSմOM4QMմRM+WM4X=ocio|]j]jܯq9jli;MX 5V@݃5C5ט^c|M4NM >h%#zkܯ閚n}hu@&ؚ֨ii釚vi^酚^酚^鉚kqcܮfTS_58P@5Va5>X\n5[cs5Vx^~5x_|MAM+ԴDMtJM>-O;XGQhkZkڤk?>k1cklkl=Ӯs<翌웶_~Y?}Zjܯ1 j j: jZ#jڢj5Q =bo{EM_ԴDMcԴHMԴHM4J5ָZcr5Qcl5[cl5=R%5MR,5R,5Ro5~]wMg\{58]i5[o5>\s5v]y5~MPcg5׸^|5Z58Zh5[mcKk'҄4a=g9g|sƞ3=#=9sxss=g9#Ϲysv<<9yys6{&=ƞS}?5?{?qsx15ƹ<ׇZ\sMrI5ɹN9)\ssεϹ9>\ssεw@'oc;g\kss}εϹ9=\ss{uϹ9<\hks vεڹV;jZ\ksx^<{y)߯w.>z\Gks-}ϵG`α/y\ozں:Z뺽::뚻zzڽڻڻog}#g=/zfF2u/u,u7cGGMSS[IIIC=CC?KE9::AIIO2ު뭺kު빺֪kNأꚬ#{T]OV]S5]]wյc]սoԽԽ#V]KյU]s5W]sյY3kkgMy}AE븺kk뺺k뚺뒺fk&뜺Ω뮺֩k֩k֩k>kkΩ뜺Ω뉺뉺N]ԵH]uN]'I]uF]uM]+յM]_ԵG]w~\y0kީ띺&듺>oaaZ5.k6k6k6/ϸ~MԵM]ԵJ]ԵK]ԵJ]K]uK]uJ]uK]ԹQ1u9Rg[/uRO?uԏFYT7뼪Ϋ:3δ:ꌫ3μ::: ,&κ_gj68fkON9Qu9RHeuS'o쨳Ύ F\0sΙ:g. n\-l#xձkf9za^. s 0/ ^af_{ržo3 ܿ0/^m=̺`3.q \;ܹs.=ls9ps/u ]|`.w ]a `3/y f^p삅.8w ]0q|.v ]p9~~.v n]e:k.xt f]u7ƹ`o`}|-|vhy9<>{Yоsϼy~CzzZ5rڪzZ/:ZڣYڦzzZeZe:c:<|֤3s> o~#γ M4yE;7v#hɏ&KhɌ&+hɊ&SLi2Ɉ&7hr3Ɉ&O4YdO=lp!{6dbMN69ټ;s>6eMf6bMV6YdhM69ټw-vbW]-bLcͿo=ϚgbW-z`k-68gu-fg-XbZs-vxUW-bb\{)ep͂o?c?[/[xu-Vn-bUUz`o-]-8`-ֶXbh{-bZc-ε8b_q-ƵZo-εb[m-X[-Yg-xss90 ae-VXg-6bj-fd-F~o䜛-ֵXZ;fa-Nbe-VXba-c [#FS[LmqŽ'[,l?[lſZi?ZLj1Ť!Ui-fxbT-bUU-~QG-bX[-bSM-6xSK-.2[3K-.]UW3k={5N^2S%.9Wy+ϸίK]_}{ld%.ywZ#k;c<% /sɦK&]o%'/YtɡK]2뒋ld>p/.9Kf^o|d{^|%/yxK^r򒓗4a'5^Yd%G/Y{33Ɍ=3f7sg03Up/Y`zx6\ns6n6ۜosڏث:|}ftnjcw1w;| 1W;kl혹cvοqncv܎1;fmǬ3cwɎ1W;j\혫scvՎ1;s옓scv֎1s;h;f\7#;fc옟cv؎1c;fl| Ntud 0){ &uK 6taCntN/>taJvtaG翌nt8H).t~}oMYgG!taL1VtE^txaK1t1;x$>aC 6taP!t#,pÅN!XcLtaE X;[D13:cpwaDNt89ts=9 갦Ög:0Ì_:|×_:|æpνxQގdS#t8H#t8e?3teJQ]kweJ)]teK7]tO]ft9H#]teM cntYeQE]uyE3]t9L3]vt9eL1]t>X 2ˍ.+ˏ.O鲨~.f˃./~]nt?48=CÂ'{?<8?fQלr˓.Cl2q|r˄.r˄.C 2ˏgqˊ.C1Nx:/貢ˉ._|~~p#/p7ݯqueTA]NueS]vt9eRq]uօA3]9Dz.˺벯ck,첰.ۺ벭˶.ۺl벭{ouŨ+F]qw͸+^}Wb^}fp+]W?f^qW/ 08f;xy+^^Wb+285.^qWbOrŗ+\q7Wܹb8tŪ+]qkWxy+^^Wc{+_1W b}#1WZWJ]i+-q%ĕWZJk\i+-rCtȕ6*Wb~+_WzWlbP~+qKtɕ.+WJ\i{^7F:;,r=/~ =O`G/w]y>sg_[[\y>s}}o8t}̵k/k9\y~r}ڻ{s{ɵ|{ϵk/U\{wr;˵wkU48rfk{c&o?rNc׽\؞'!xwk}־C׺Z_kk~᯵󵎿/;:Zg_{7Z_k}~ϯ>ןOz'>]|׽G\{opڻʵk +W\{Wp}{ĵkן5vƮy>q;}=7{\yp#_=r;ȵk\{?qkcʺwk55fp{ĵu~5 Z]k~ݯv?\)׵NS??3럝qg\f'קyF#w럛Z_j?=Z_k}p{#{Ư/] c#[\{/qڻӵk\{p}ڻµwk %\{7np:==ڻµwk %\{p=;õwkf^kk];s})ZZKgBGDOWtEO/tFO;BO;DO[Aڡ zZ)z#zS`ºiii鉞豿z.iՔ=o=M= = wzڡz:zz:#ڢzz/ 5D=clOOֹn=V=mc{=:{<뱰 {,q'{1G{{L1{L1{ڠ zڠo±)Ms~6{{6eۧk{Lj#z1Lj[z 1{zz z zZǡzǫ3{1ǚwz<7{6گϸ3ǙgzqǩzǤzqǭ^t#=wǿzǻzqǹ{mq3a=xc_bz<ǵz\qzLXaM=6RK=.cW5z1 >cB =&cB=s903075>c]=㩯{ǯz,uok}WF>G#<볭ϯ>|fɹ>|ϧ>볫Ϯ>l3ϩ>sϱ>,sϜ>l곩ϥ>o;rΩ>4rY}9P[}nYgQE}^ygTA}/8~O}f_|rϘ>곩Ϡ>tɫ>g3ϔ>S鳦Ϛl}so>/fx}^>3x}so9Uk}=Y 3|=i<}3y} y}&8{kGg}~{_ 3>{ >̱g\)Ϙg艾kF뉾OYt^땾vkk:?Gݾ~닾듾k>ls>?;v^k>k>K\|}9} }x: ﳼ>kF끾vk&k>{s>>낾.낾^s> 3[cx}Mc}6g|jdyv5nݿ y_}-gw`~w{w}^y=`;`F=g=gX<&<`fhl6<`.<߃7Y{˱u;6x=ָ>`vuʽ8?`>X=`>`?n=~=`v>f:<|| |szLsz`N=0aL0aL0aL0aY?0fL~`nY?0<ss`ń907fsy7/z~. ~Lp``~48ssSF> 0s`?0|a;c?0f0bY>}`N9=0 0`A9^gȀ. 0l^ <`<lϸƊY?0\pepb'pb?0\pe+laL0c`<97\sz`fn?[NXszp?>0fL3}`0`7zc׿}&ℵWƊ4aOZcͫLXgͫMX'8t_skMX{ k3au'&hLX{ ka oxn0y7o5r1nXvôpy7̻a oXx'sk7\a nv.p7\ ox.|##yG==,a go8{|ʔuް78:o~p7a koX{ް7< oX}v߰7, o~p7< o8}N}p󕏸kFa o~íߍ_7̼ oXxp7 ouSᾟ|Vް7a ko~vy~4߇|Cxh>Y;4k\Cszh<,,Cwhۡ<4f C3yhY;4|Cswhࡹ:4WfмC3sh֡:4sfCyh>ɜ{<4f2VY3fLCxh6䡙<4؆CshF9:4GмCsthMnl=3xh9&r-o|[ߦ渞pٷ-o3'o9~e-o|[6߲ͷl-o9|[>߲ŷ|-_oz[Ƿ<-oYx[2ѷe-o|[޲˷<-OvǷ;ow,gnyx{!Coz[2gu_=7swc{{;qw{9w|};v߱wlc};߽[k̾c};1w{5ܾo{;F1\{י{;&1 wLc{ackcKXrǴ;ݙwf~ǥ;1{wLKG0l3qǍ;nqwܸϱKÐ;~ܱUwgxsgFߙw|gߙwoXsg}`XrNJ;q,3Xpgߙwf+q'w5o=3{uǬ;fs&_ |kmA)mӤ鰛i}ڴÑ2 " Ȭ22"N $Mtskoe{~/k^+~˧|̫|̮̹̩,̢/ _2.2.2."1]fef]e]e]~mnYwo9xWyu}ge]e]e\e]fwDxuguܿl̹̻̺ ˜˼ae&^__2/4tܽN_eF_feF_t2˟ g":c,/s2/,l"׬\ 3tᅡk8^ue_rp]pcF?ze[fIe.GqXf`eFYfkeZfkeZgtuxE}~7<#ʺ;11ڣ+1ʥSuAYuAYuAY[EYwHY{GY{GYuAYuAY5DYCFB}ww9z?eS-eR%e]R%e]R0eQeQ eP eP emQemQemQ)| kK#ckR)emT~EpеN)kV)k)k*띲)i(k(뎲(k*럲N*\}R~k0GK5LYϔLYu@Y7@Y @Y @/ιZ~)#c".2zXh)k(돲(k(k~(s2.2xl/s2˼/kF(놲(닲(둲N)ߩM~w~F|*kV*렲*륲>*룲>*뢲v*kvtH'UQE+U4Qe4tN覊np +\p-*l2yWtNE#T_~ECTtLEGTtDEGTtDET4@E#TAETAETt@ET4AET8_ >y_-P-P`f1Vx[EWTtEEWTtEEWTx\auET\tW\s-PyE3T_zѕ3畻0O>UTSs^V]sW^UxUUyfUc[]Pa`UW_p¹ *\pµ *̫<=^VXYy|g{ݻ,3+̬0¿ * » *0 *ܫp½ +,p *Ҁ~U8YdVZahn0rVxZiVXb+8g\qVZhV8X`cUWaY{UVa_kUWajVZaVYfUUaV}U8Xe^V8S]U>1ž *0cp¦ *0¿ *Xc+,Xg+يubX+ * pbMb}X_+׊bͮ.[+劵bX\+5b έtz]NWkvZ]VWkt]{M*u]WUkv:]VUt:]VUqz[MFSkuz]^WUo[VUku:]NWUt\6WUxz\FWUktZ\>WUszZVUj\VUn\Yh:\WUku[VWUu՚\FVUkdY.Wocܺ]VU]:WUUkeZYVVUkr].Wmey݂wpGaI+UTQWPe@YPEU^Tvεʎ*;򪵾jmZ۫jZǫujʓE[ujZ5jMZ*'>=Tϳ?sλ;U>T)8f<'4nZjZ=*/<0888gA_eDU&TPe@uU',ʋ*/2fͯXtK,ʒ*Grʐ*C?gޛ"sReUxot[/0"o`UVZehUVYg{w`>\ο{s*y|FT*KT5IUT5JUTuJUTKUT5MUT5IUTIUTJUTKUTLUTMUTuHUT5JUT5JUT{铪^iꘪfj~ꙪꙪΩꘪvETL.knUʶ1:f{(2oʶ^;ۚf;0e[lφ;\lkm]˶v6f[lkm sλNM5ZZCmmuҶnM7 uC:׷\_5-B*4ֹu6k͵Ͷ׶Zۺl[mm͵}SwmmǶ׶!:d[lmȶ/ۚkνۙk5Ͷ:ۚg[lm Q5ʶF;g[lm̶"Zd[lmݲa5̶4:g[lm]cu̶f,ۚe[lkm-%Ob[Sl3|`[l[?lkm=5Ķ)Zf[lkm=/ C/:f[lmm\lkmͲmMI5ȶ~Eq㯌{ox^msokm}5ŶF~K1}͗mle[klwE6u6ٴyȽöͶm^mqwیfGqlg,6Ƕy͵mmlg\swwwk1ckqck1ckL1Kk,qƳWks]X[c_}5ոVc]u5XW_5&Yg5~Yg=5XcQ_5.8TcT[5՘X^SFݢ|f8VXc58V.cw2Ƶj1ƘcjƾjqƗgj̩1Ơj1ưj̿oLƮjLƺj?qƩj|="tB?:t1s>Xc5fQGg5RcH!5ԸPH#5RcH!5RG5^8Yd5XZcl5[o9V{Ve`,w5_A5fԘQcFG5nԘTcG+5ԸUcQ5nr=[x]{55 ^w5֘WSO5n8Vc`5՘Wc^y5ѹ̫k<1ưjlƿk 1ƿj7`'xׇd5xXh5FֹWWݤiVd|(4:C s:+lCXcuy^g_uyXau~Ygu&X[r蓛uUV_uչUg\qu;&q:Wg\S Ny&uVYUgUA 5V[>LkjkpGlh\i_i_,jLjpSY`M5 4 |zްF7xа7 }zA}4xsmgLikigOv4xI/ 4x`I) 4`I㿻{WzW{oog\qekpoK;\ܾIm 5:9È0`;agv8ÔbǏ0dšk0d%;[vÏ~e-;,_vË^0e;a v8Áiݑ{[vÙf5;LaKvXÒ0f!;,Wv;5~5{ھc_#ן\w"tO:=pcCc;vOvxcݱXw;lSvXcޱ^Xw;,رXCw;kNg vtnN׺yW!dJ)M5;瘩7iɌ&3i2ɔ&_ i2ɐ&C i2ɚ&kioZyǽθiorɍ&7hZ6dewM5y]wMn6yeM6cM59XcM5|fq5d`M6d[uMF6Yd{͗ǿ&k+#cl&|l2&l2&Llrɺ&뚌kɼ&ךk29^M&6Yd\qM5_M66dcM6`M5?|~,QEM5Z]MN6dXΙ0ɨ&|j2ɰ&Ϛlkɽ&k2|M7?2iILsQ.v˨]^riOe.vˢ]jaO3Φ]F2miLe.veu=b.vy˻]2ow.v˾]m]Xˢ]&rjYe.v˸]2pe.vGxsg~X˵F >ﻆ| Mto3=r<пxMw*-;Ͼ'Wsoy/;omWpWozEʿ[_y]wg*S_Ew5ϿεܻZxWj]kwuՓrW_];w5ե3u3|"~VݻtTwt\3?u#һ˘.Z}W]]irm m^kO7myߕy?{_vŞŞƞ̞=ȞǞʞƞ}ɞƞŞ}dq{9g#]eOgoggϲgg?g_gg߲gg/ggg]̱Dog]mn7f̋3<7wG9Ϭyo)wd/oc?ggg߸gggws#f9{{{{{{{{1={={={o 9   v|uz3{/]{{{{{{{{{{?h9{{?<:;<~4޳w{|:|q====={={={====۽_={gO=s{{{{{{{{yv9/s~i`s{y9s^yf2漏9^e%1==ݻt{xaO+iW 8OcكW7cG3i=Mg߲'3-{osJ{<ؓ﹋m<===ݽ9>_ܳٳ?ٳO9"4f^ffffoCƮ}"{ga{xOi= 9s>}}tž޳{}O=u4~{zuOw=+t垮ӕnd_[k}m-徶זr_} 5׎:poڳ+_D~ɗwu_}ݽu{_K} ]5ךpu9:q_k}]|j}u{zo_ߢ}u9zp_}MBq_}߾o_} uܾVYzi_/} ̿λu E~U{^ w=wk}77r=ןs_c}ݷ#o_?uы4׏q_gk} ۾~}n_k} }s Zw ǻӧt_w}從}K]ȜgFgD]]5~וq_3k} ׁ:p_}ξWg_쿠ϻykC o^_w|9w_kk}?eLk}mGۺ}}SFuסzt_˘fטZs_}]]"Hs_}`LOq_/}1u꾆׬u_k 8/0Wk}OuоEi_+k}ԾW:k9 ߯w#p_sk}߱u4ف6;4Z4۾vp@;ȜA5rΜ_O8O]zQ\06 z#&=Ж@khy_t쁞=еZ@7hy;4V=У_qo}y7t>=РZ@׃1禑9@hMzM4n=Ь{ܿSWqe9w3G[6w0w~k9@C]ypwف&+s̹oy};u?92/1`>~~5='3؛?3!2fp`p?z>>>η8x5gޟQ>2༏8ȼ-so)rmq3/:999999lq{{{/N,+*******\`NϜs?POC{Cmnr4?4ҁ}ԁ=Ӂ 6^P&w#]z{Fwy̡}̡}̡=ա=ա=ա=ա=ա=ա=ա=ա=ա=ա=ա=\Uc}ԡ=ԡ=ԡڡޡڡڡޡΙ׽;YCCCCC{Degeeewoc#m9w]`w>g7~[Z`d^|CzUV=ԪZPjCzOu>:|ݿ˳ <'_knEU>{}oݞ}U7WE8:8898<9c{9?''udHǂ{Tp)}ооо^^~^О~~о~~>W/0oxhqhsh_thshshshshshshrsoڧڧ={C{C{C{C{CCCCC78оо~M}Ǹȡ=ɡɡ}ʡ}ˡˡ}̡ơV?>P_s\{C{C{CCC{CC{CC~{  c޿gW+7CKS3;v:KB{zPCiNC]x%A=ךP{jC=zQdp=9|vuV ?sߣи6>GHi#|R^<ҎG |p+<қGH#=zKF=ҪGHmE5><҉GzιI>!Xw7ϙsstKi#{k-BcHi#-x ᑖ<ҋG:H#x34"s` `~ߣ;aU}G0_+#p!=CHi\?rs}\#r_̑&:GCZBH{qG|>ˏ|#1G>88b|dOLpGL=bcX{#1GL>byΣ\ųy?w >*{5|8G:H,8ipSWi>5Ǒ8 GZHi#p4đ8GHg#qkq t[Opő88G?bˏx}#G?z>?|#}pőF8b{#GzG?b#~}dzι=/d9HC}.GZH#-p&8 GH#]p48GHG?|#G~cvvw.8f1~cOgdh\?>Ycsl?f1ۏ~c\?fJ+>f1y|ա5B׼E}=1s̝c3)Ƿ`mϹϰcF3Nsv>yws?<7s_y\os9y9;hcp5ñf8 zᘁ=~zZ sl'DhsN4ω94''Dhg:DJds#|>a #/'>'?a sO{GN^|Ο'>;Nt O^:g O4 O^:g Ox~f',> O{F'>sY}'le)O<{|g}S-tNu/ww{@蹫y"7>Ӈ[<}z|Aw|?m99羾=ʧ?kS{OSu=\>=ֿTjccz?34+~>}Vd\'jS]|k.>ŧzTS{O_TjS |Ou>սwŧT#jSm|O5=տTϞr?8~o ITGw.v?ۃߧO;tTwjSyNylzvs>5ީ?3OC/9s7Ԟ|6=ձT\S9TS{Ou=իzTSzWO&=բZTjS{aO5쩆=հ`,|]=mFV=ոZTj S}M홾=ӷgLߞ3}{o홾=ӷgLߞ3}{?t=Ӕg,g\㳛5"L;i3}t.>ӾgLǞi3 {a4Ϲs{wD5r_?}K:cN=c.]~f?gL73-{t>ӵgL3y4ٙ:eg쇂Omw9s533ZzZzZ2]ƞeL `K{`K`K`K`K`K taK^KӵtWKWK{WKWKYKõ4\se-f- `- `- g-a-a-a-a- `-`-^-^-V-mzZZZZZzZ:ZsOYKtYKw4V냡sb-c-Z-[-[- J-=B-C-=C-=C--B--:-.:Z:Z:Z:ZZZZZ|ꡖ>ji&j顖j顖j顖h5---:21Z%.Z&mmGmmm- mmm mfim[omfkCmYfQEmyQGmyf{Im&fRk"|jͦ6ljͦ6lj}pͰ6ڼjͪ{ܻ}>ksͰο5Ƿ6\ks͵6\ks͵6w`|;8g_ۺ޶yԶVmk|ۺض.mkpض6{gmvzgz~dha1klUwmkt?mmlۺڶmkhIm-m[KҶm-m[KҶm-m[KҶm-m[K/fpXgض畱޶mm[o [wݶumm[s۶{CF[mn[mn[5m n[ȵm-n[mn[2wyin[5xvzioʿιϱ6 ?sͱ6ksͱ6=Gι6k;6kfbmخtcWyffmfٮwhmfff #QGG·8Mw|Mڭ>C79&S#v3`9sܟsy~qɱ8yg|1tu+(:=:np;6%:qS7wqKǭqq;;sF9u>n]}U9?/::%/;x9_qygG5/pE;^x]^x7-+tێqnWG_xus78x͎8V:6xOt]w;x};>C?sÎq|񷎏;.XdΕ{ = _u{ttSO;ogu|qG0/:>r8/9.;r9ꎆct:ǡ1(ca834IJ! leC6Ĝ! 1g9Cbs3ĥ! qg/Cbc2đ'C<K83Ē! d C!utȺ8˩̷YsC!uv:;dU{-{ܻygsrZ?dY뇬C!k~Z?dY뇬C!k~Z?dY뇬C!k~{O~z?dYC!k5~zϼW^}-04Co2ȵN C:aH' i? 88 C >uÐf CaH3 i!0S7 !i!q|C bÇ>!~>CbW3|GϹYtȐ(CcH 鏡:ιI>}5Cz1ņ>c9ߡ4Ԑ~OCjF+]nwvy^ "s;c.k!6׆ڐ^kzmX ` s2;;9QzrXOa-9%䰖֒ZrXKka-9%䰖4sg/8_a:\ka:W갮.c.sr]4&֤ÚtXka ;Ku.֥útXam8FֈqX22oe֑:rXGa9!>ևpXa]8 5&քÚpX]{;tֿw<]W|W<׫zv``Wka95օÏ u>=iaa:CN։:qX#ka8z_+5~֖rX[a 9 㰖֒ZrX'a8փzpXka-8eúl7<դÿzAYϹg;ܫxf <+WzX?a=?_|ja=Çun:yX'So<5ú{Xoa=5Ú{Xkka=ֽzvXka:EnzzXMq;cu찎ֱ:{Xa=9 5߰}e3ް{zoX3ka7?5{nX Zpha7φܰFhmX ka3 Cc:? u҈Fh#:iD'4uFtˈ0#y,ӹ6#fDӌh=3gFˈ1m\\3sF͈2#ZfDˌ,0G3wFΈ;#zgDh3wFΈYp=uЈ8#gD.2yFn?#FЈ~cd~^ۇi2?F; 0r9G>]16yD_y{wq~#\=0F/2w'NJ#zgD 2AF4ň#bDShG7Fƈ!#zcDoh =13F4ň#zcDW]1+F~&r1F4ƈ#bDghm1-F4F5¾Zq F5ʯQ~j_e(F5ʬQf2kYO\kW(F5ʏQ~cl(Fy0ʎQf>/1} ?7NJQVae(#F^w_/;ysF9:]]9>c}sЙ_}qovy]? >3tqcw>]gt]~o~SHhT9tFuѨ?gT?2FѨNIi=V}o\Q=3gF̨DhTjQM4FԨEh#k4FuҨNYZfTˌjQ-3eF̨>=tuԨGhTQ3wF5ҨFgTjQ3}FϨ2:hTjQ3qF5Ѩ&ΨCgTi13i4͘4cgL׌1]3{ƴ͘6cfLیi1m3mƴ͘6ceL12Wʘ^+czeL12C4ȘcdLi11;ngcjLi15ԘSczjLO1=5VcjL3i1 5tӘV~=]5t{ics }x{gӇcpLi13ƴ˘v{9{}M3=Ǟgsޡtәc`]8;54C:1-5stcucpLuuksvL?zcox;1tc<OX:1sc{w:1uclc[:1tc<Ƙ6uy61wcc'c+9DZ ?\w6tc?+4KX:1sc?8161c\q1XJkWo^q-_c>ٹN]駽ؿǘfif鵘ViViV鳘>鳘>鳘>鳘>鳘ދ%y=ӃKӁ1\1@1 @.c*b(b(b(b*bZ)bZ)vй6iV願Ή闘~i~6=蜘Ɖi.}}љ{`֊iV駘Fin飘>飘>韘}OZ#PLŴPL4PL4PL4PL4PL4PL4OLNL4JLoĴCL[Ĵ@IW܈~j?_ͻoczc12:`\q0?ƵS]89?qns{l`8y?qޏ~l_ ]ƙ?q3Lg8?q[}m}}M{:c\_q 1 ?q]0qΏs~8ǵĸ wkq0u:`\q0qz`,hܺ>n [ǭqCOk5~?nm8ƭqk`#=,g#4ΠqΌe%O ]e-l8_ƙ1Θq3di5_Y2ΜG2Γq3e3\g8?ƹ2ȼ^sg#}3}9g8Y7ιq΍jgup{893Χqsm?<g8Sy2Γqd'w:~sg8+e8/y9qVrsn3p<8?9qs8?9qnrg8#9qF3r|83yw0^N >/37%㟺0e\kq2au˸n'd\q2޺t͸L*gԄPjB+M 4&D,2&ӄvNM3FFFG:iB#Mh 4&4҄CzhBM -4&Є/f⫃O4M&Ʉ6&dBLh 4O&Gʄ^+ZeBLh 2S&n:,eBL 2S&tʄN):eBL 2S&tʄN)e=i 2q>ꗉw&]`s}P>]wޭ&ք֚XZkBgMh 3&4̄0eBLh 3a&҄x9?zЄ?gBLh 4s&τ6gBLh }4&ф<ZfBcL 0&įƞ{vd3ZdBgLh =27&Ƅޘzceg7ΧΘ dBL Oy⍑{Zd5o܏{9Ͼϳs_ݿ_~Cp{g^IzdBL =2E&Ƅ֘dBoL草yO?3o; 3&:C]A`7&4݄s2&G{M74[`~oRMI7&ov}M8'ы19'uNԉ:qv[GƵVԉ:qR'NI8'6o`7sxѳwr:wRNI8'ugpԃqRNjIM8 '5NoE㤎ԐsRGNI9S NjG?XhL'NI8'uԃ?c\GNI9#'u䤎ԏqR?NI8'5FԈzrRONIM9)'䤞ԏqR?NjIm8'FԈqR#NjI8'5FԈqR#NjI]8'5&WjRCMjI5&k#ciI4&uҤWziߓo >9>I=0IM3I=4IO2}Ld$'>&>INOrzӓ$'?I^Oyϓ|$'Oyϓ|/8<$'y>ɍIL`|d$_&<ɄIL~s?w_p{'6eAdưddew/[kۙo&knz=o^+ns;mgncwuQ\5Q|,tkkkk렸k뛸&Jp#"\kƈkΉgνиkkf냸6k냸nzU:&S:"8 3:8s88㌎8~kx[ 읺<<}_;oy >ou ;賝;_;[_o5|m{F|׿s7kӸkӸ&kҸ&kҸkии_sZ5U:5Q3E3_2a4M4M4C:4C:4?3?3?3O4C:4SƵh\Ƶh\Ƶh\Ƶg\{Ƶg\{ӻ|dLƟeLul\ul\ul\ul\ul\ul\ul\ul\ul\ul\ul\ul\5k\5k\uk\uk\uk\uk\uk\Ƶk\5k\5k\5k\5k\j\5i\5iOuiٸ"e=g{o1-q-q-q-q-׷q}״qM״qM״qM״qM״qM״qMןqB?\k|^Gǵo\5T\ŵj\m\R\5^\5L\ě]ƴO9q׃q};et̔2S@q35i>N;ȽN3oQS:jJGM)5tԔQS:jJGM)=4ҔZeUSjJ7M)4Ҕ֙:SZgJLi)3uʔnUy6q _5+9>5|5|-#_)O}Sc#c\k) 0S4˧X>u92GGL}{y:`SNod]:W2;ʔScJcLi?@pAdJLi)M2I4ɔ&"SZdq =&2Wʔ^+SzeJL)2StʔNSs9?y3w͔F(SeJL)}2O2Y4˔fz~y0SfőkM3g̔3SzfJL)=3gt̔1SfJL闩u^70z͋`SlJ[Mi)m5ՔVSjJ[Mi)m5ՔQSiJMi)3ДQSiJMi) 4]4є&DShJMi)M44є%SbJSLi)=1'5r_"s?y~/SeJL)2e>1SfJL)3ct̔0SzeJL)}2U1[͔.SeJLi)]1u=gNM: >   + ]  x::% ]#   = 'xp܀2]؞kq %Eq N&tFsb{>:" ,L0 ,L0҄H&8gc %x^s %8TS F%8`TQ >%1<g ; [̿~[u| '=# s:Np6kN6CMp9{M7Mp7w|N7sM05}2:D?ϻYxs;v n'xu '8x v'؝`w V'u >'؛`o '^s9x^/1   ks2Np8wMaC|N09 9lN9 N8MM~{C"rknߠ O?LN09~ C͍ m m m = M M = M M M ' '{ '؞`{ '{vdZ Z Z Z Z O?$Or?$ӓN:$N:$|N.IN'yqI'9\\tIN'9tIN'9tIN'ٜtIV'sI&&d]ϭ$Jr)ɥ$J2(-}s*Ι|K.ɷ$ӒKr-ɲ$˒,K,ɱ$,J2'ɡF|D?uΙs4xgwt.3猇yes$_K2-ɴ$ӒLK23ɵ$ג\Kr39O]?14$L/ɿ$K/ɿ$K.ɻ$1 ]|v&ٙ^yIn%|Qk.&54ƴ$ϏbCKr/ɽ$Kr/ɽ$Kr/ɽ$Kr/ɽ$K2.9K.ɺ$K-ɻ$ےK#si02$\L22$lLr1ɶ$|Kr)<3K,ɲ$˒,K,ɲ$ I(w}}427I6%N7I$yM7I%8J2(ɠ$\3)ɤ$LJ2)'\Jr)ɥ$LJ2)ɤ$;JJ2(ɠ$ J2(ɠ$ J2(ɠ$3͟iL?7ͦi6MiMlft*lg<4Ϧy6ͳiMle,f5ۦ6ͶiMlglf4Ӧ6ͱivMk]ӥ9æ6ͰiM3la Yg,f4˦96ͨiMsjSӜ#nsp^qo 45ͯ;2yws98iNp,f4 Y8iNkӼ4G19498gg9?|@A?|צ|Ox4ͣiMh9̙f86ͪiNM3j)3'~ss~o~#e4kY;i&Nr,f439i^NrN3p f48iN3pӬȺRK.źRJBJ+ŮRJ+ŮRa)bX[)nV[)nVY)^xUW)^bTW)N8g)W+)Fsp%[w>n^{o[_})ƥxUg)VΙüS L10S L10S L10RK1.ŸRJ=02#SK11ŷ[SK1.RK=2rͽCRH łR\?&4)N8bH)VCe)FD)N8D)N8D)N8D)N8bD)FfF)f8C)FbD)FbD)FbD)FbD)FBEYbD ) ŇƧ)zȵCsq#ʼnNt`I,2ve5Vy0g53a kf83Ùe/3a cfz<;s#g6ë^jW3 fx5ë0kE3,ax5ë^jW3a kfX3Úpe3_c3a Gf0Å.pa#3\Xg3̝Bsi9y/3|a cf3Øpe+31vwD3tΥ0e'3< Gf82Ñ0c{>d~}.0^w܋w3cFkhm1'fČ3bFg]1+fČ3bF?0f/Fꎙܧ 0I?q?~N3iF7hm4fЌynd\+褙gƟ~^9 =f~%[3zkFkh5f֌֚X3k _=nF}7г/Vс3oFh]7f4݌NyS;Buzq֎3:qF'8 g>c\7h8g4fщ3zqF;}8g&8hZ7|,tgtΛ{3:pFCM9-g4ߝ3#s5ޜщ3qFC9g~йэ3_ >݌\3:kF 7fLow=yv?tw F}.|;-3ZvVYM9Gg6շuVwN\&йձrVgY9Sgnկ:vVjY9Cgՠ\Y9Ag&զuVwٯ >աsO7Cg.]#suF=8 g5VՌqVCY=9+gns5NՎpV/{:w\OY-4f'.c ]Y]1/f 8;:bVgjY-1)fìbVYm1%f5Ŭe,guĬbVgY2wza)9GgY;Yrve󬮘/f>=f>Yϲ|VjY0fu,g>Y|糬,g=YNϲyӳe{BYr}le,gY=ٿ>3v,,gOO0َ`ypos;9fύ9&1zsX<9vscx<9Felp9wy=9αws8=9Nq|λـx>w d-xc=9fi90n~ss`scs<9>1{s4x?܃{#.Z~w\mxϵt{g*hƹ^|_^ٻ_9}8|v㜞ӒsqNK9m8#t֜{|dL[ɹ2:tNi99й6stNi933k4ҜөsiN3iw nNoi9=87"c13ӜޛQskNW95˃s-5՜WszkNwNq5t֜ΚYs:kNͽϽ7^^g}yK{oNi9}7+(ցs:pNi97еusZnoNͽ/ttߜΛ~seLi9]6Ԝ>|sbN+i9m5t؜as:lNioy}.4_€k^oۄ j9M<=74ݜ֛R4ΛӃsueL#5kt`> 9t\uΜәs:uNN9]9^׋r^ck|2 %Bt\Gym93Ɯטq^Oky91痻y-9!伦_2ټאzs^kym6ټtۼvrs6mBm^ky65ܼ^qL[m^y7y1}3γsy~{o>>y6wl<=^Ŝw>4>8Zmu~:?o[Y3ϚyhG,gs_xipm%Kx㕎W8/:2;]/ٯ_{:^ǿȽ7g~:%{K֗/٧_;6;/ٯ_zs/Y/uZ"P~zz:zɚzɚzɺuZ{ɺu>G4t۸55uvddF8q}}}ɚ}z}z}Z}Z}Z}Z}Z}IC_3"0Ry>W\uK u f\%]%]%]?,pb |Y;x,b Y`Cرv,pc1 |h,e'8,0d+ \YgΙsM mO[ӝeikڟާc9H m=M[kٴu6m N[4 5>mO[ӜHOϭExn.,oH/Ϣt2xz>ҥEiCiffH}!͇͂k9HifH7iޤyC{Hs$͓4W|Is&͛4w,J(͕4WҜI&͎4[lI%͞432ΐ4WI%͚4c1i֤~P؃#O^OiSOGF"\Js)ͭ4\Js)ͬ+J3*ͨ4J3)ͩ4LJ&ͨ4I(ͩ4LJ(͡4,JRp̈́4ҌIs)ͤ4ҜJs#͗4;ҬI$ͧ4H$8gMifyKC3Js(ͅ4{ J)͘4I"͉4Wo#m-N[괵:mN[ﴵȀE~,rf;lXd"/yȋtC\Y"cٷȧE~,B.+k.jYYd"#ȍE,2d1Z3g=>-jWl["YȖE,rcKYd"wyx.\Zd"s9ȡE-iMYd"{ȗE,ri7f"GYȔ ȚE^,gKY|`"Xd":Xs&-2hE\Zd"_ȕEV,cXd"[ٲȖE,r` X"'ٱȎE,d3Y"g cO E.rt\]d"+E.t9{g"gE.2u[d"#E.8;_c{suwz"h^dCc]|}Ek5њh_/89ȐE,2dUY;{ƹȑEN-rjSZ"3}=]W}~Cx^9YE.m;=C?~/|۳& ׹o \>7|n}gˢVZXgڢn[SgQ,Eݳ{5ҢFZHbZ?-Eb%t5Ӣ6Z:ZgQ -E 2%3ޢZBhQ-jhZ촐NZIAE?͓BB-@ @ =ݓ-ݒ??]8'72$[2%o2'> _e\7etLFdn|j蚌蠌蠌62c2&i2z&a2&i2w\k#c>s:HݔF͔KKMFF픹wS;eRF'e4RF3e|jfhsm>-<;ݓND4QFe4RFKe4NF e4QFeOFdP93hVh 3?}-gBFd4QFeCF;dvO= MgFƞeY3p;n舌芌̯sYFjDeİ%-1hAKZ2p*é%6-qiOK\ZĨ%^-DS5Öİ%v-k):ۖضĖ%,jeKL[Ģ%-kK[˖Ě%,iMKlZn{ossxĪ%&.joK<[˖%tͯ;[xij%~-}{d컺}G1-qnwK[Ľ%-1moK|[bBܿr}#%.1pyK >Ļ%-puK :tps6.qpK\bx%V.1t_KZ=.1igK[طĽ%.k9Ǧ_ n.==3gsk-Ow}^^ޯ%/nKl_b~3to_b/%>.vK]:rK:aK]7غ%.uK]?8%.mK]Ӗxĵ%-1mK\'ǥw 0]H䙿 =_\3}gؾ9%/逥ODu4'O/q~Kz`߂s]B,^bؼ%N/q{Kl^җˡJp%6/yKL_jvcϗ:2{K9%/1?,β;%v/;,2<,dz8,β9,Lβ9,s6,Lr:l:92;,ﳼ;,۳ nٙegYvfgYgypYfyehYfekYf;{ C/;ng~,32:,=,ӳz ,׳\r=r<, ;, s:,lβ9,,Ͳ4,KͲ7,<2;,<,/26,g26sYFgِbYVdye]uYVfYس#\2)ˬ,\r/ˡ,7ɾ}e_~es{ݾ6>׹s9cYffkiYeٗe_{Ye^Y6feeYfx?cum2s\r:'''˰,2*2˲,˲r;˹,\30˨,L,Cc2,˶?e^Sk~eYe]kYe?c_{r.˭,ò2.˼,8]ƙb{WwLaYf9` /̲4ۈ=3v08ٺe.stggl$82oe&/'O.sw \2wټb{u ^f2=1x_߈Ϭuy|վ>4_,keͱAuDzX'b{<_y{7qO,߬ǽ[w>E{jY{,eYw,eݱ;ʲXgY,eMWŲXzcY,k{ȲX-˺eY{,ke]˲&Y&cY,e}7DzX˚dY,?˸VY~X%:eY,e-e˲Y dY,e}}<`^O=Y1:f .>/ y߮<q-u:jY-eu˲nY,jyY/eY,keͳӖӲY~A0]h~ǼޥӖ5ӲXzbYO,ke55Dz~Y!:dk]7DzYZgY,%weL,AhL_-ǽNY4˚fY,kt{od]4βYCzfY,ke}G5ͲYG˚h+i\,2U˲~Y/˚hY7-^gSZ=˟ke]bq _]ug|?;{9_|Ou_uвZ_ZnYS-e]uղ[;˺gY3-ke\ke|\N骜雜iFuI7b}韜颜.餜飜q9s\α<s)s 霜isq9c_}9xi9>Xck9瘟9縙c9v8ce9Xce9>%2v.cwݾ{sq5[sͱ4w98ch9ؚ9\3/gsq6s\q1Ȝ9g}Ys|1G=:tC#r,ȱ8džrq$Njr|ȱ"Ljkrɱ.Ǜ#sO?gKr8g 0K_}W۞Irl=+ddI9&ؕ\96xc9f8cXu9嘖\9Xc]M9^cYs98\U]cN{~t4ǹ3s|55/s\q1os̱7ǵ;sq.ǭr.ǻṟ4_3网99̱5,11Csʱ.3s1"džr\w:W) YT_C>ysx.;sp.sXcaO.縜_9~帖Zk9x]if|'t:Xr1.ǿr˱.{+Z Vx¾a+ [a V«V0mw+SV#[ V8¿o+ZY3+\[Yp^\ 08wu+v蕕+^a W|+,_a WX^= Ư0~+,^a WFpx+^a WC#c^ Wp~+,Xa V&q+\a ;W8ήpv+,_a kWX0+`E] V\}D|{|Y5+?O'\w<G\_~%_o1z_{{Õ_;|`bb_b_bb/uИ}ۊ=ي؊ۊۊڊڊʯVVVVVVVVVVVVVV^ySS؟؟gww؛{Oؓؓ_1tmϵbbbObb>lŞkkŞk~kk^gžjlihhhhhhhžim^h>hžh>iáVAV7VVVVVVV>y}{9g}̊}Ί}֊=ןVeVuVVwVqVqVgZǪ1{{{{{й=Њ}ъ}Q^%o ;{!{>i^j8g'ʏ3w*4{O0Ͼ,oOy}W~,oߕυyX#o{䗻?-y{}N+o7e̳#Ey}L>'йN^'oߔoS2y{=N'oJyO&o۷[>y{Lޞ'kK/ykkښ歭y]y=.tݹxyVYyyyy-y>np|G7gw{gmys4T22wyn_`^9^py pNk鸂*h*hkkk+h*詂N+贂N+覂n*覂n*B"qO[4WAIAKAKAtKA/4XAoVAoVa333[=)^mZ : z z ]ߦ+z :  pе&+赂^+谂*h+h]Cz ګ zpy뤂*h*h&+h&+ƒ9}=i3ޑwy8?8;xy: ' :  Z z# ?垶,h͂,h{<߹s׬YС]ZХ]ZЫZЫ[б[Т-ZТ-ZТ-Z~W~MXЄMXЊXЊ-XА YЇ}XЕU\-Xb-VbmVzVc Xm=Vb RVmVxMsW=PjQPPPxSd(hv(h)h)葂)h&)h(hf(h(舂(荂v(舂N(GkPP}P}P =Q @A4@ACA?4FAc>?FQ`DFQB#Q`MA{tE4HegX|GgрsΙs<T`k&X`bE^yYdhűs"l(Ȇ"L)Ƚ"|,"|,bw\D=.f/;ϳʿZO_;4CQkY^xjpڢ&("달/"L/".:8gx65.r".".r"."s-r"Nj\.rȟ"rQϳ"ϊ<+rȉ"G(Ț"O<)2ȸ"㊌+2Ƣ("'(2ȱ"<*2"O]ϟ\3Ȩ"|*rȪ"*rȯ"*|]E&TdRUEVYUdX_EyϺ<Xd`EXd`EW_EWdaE9Xd`EyW_yEyXdSME6V]wEYWdb DzOgޛBs:0=q~{;w}=:3ڢ-ڢ-ڢ.czz:#:#Z5ZGZE:sy-S2ƿ%O܈.`wh*ꮢ*jtaO:ϊ:Ê:}VjE}R.ER`ER3E-S2r0͊zeZi-TfESlEWgUjUݳWV5ЪYXëL^e*WV5*WUjU2}u8W=ƵR{_e*W5 9WU}﫼_Xe*Wo|2|_Bc}Z`_ȘX__SU֯z׫^X`UjUV}]3gt꽮oUt}q_u g*WپՎ_aU3jUͰ-VƪXcUcjU-YV5˪fY,:eMF+qckUs _ǿ/qw|FoпqW&]ӓkrM_˵XZci5ޚv\ӚksMw˵нTb{ <7{<7C4]ӥk:uM#5{Zi9G0W5}>^ӹk_ckk㵛u^kxMO}sh\7o {;:s^k{Mi5mmu9׍krMW=t3vկkuMi5-v}+kZ}Mî5=q״횆]ӹksMi5-E״]ӻkwMֵG 8W{5-]~$2etߚf]ӳkuM5]tړs5MCt\ktMi5Ct\ӦkqMO5)\{^p\ki5ݸ't~\{iu{y1M?\ykvWF~'r'䚞\ӓkzrMi5ݹY\ӟkzqMCϜ?`YӚkrMCi5#t{o.]@{?=tܚ[qk:nM5ִ8Ʊ5qlck_ט5f1sMìqsk;;=tۚ[mkmMuM׭5 AtG#{F~߭g>5we^}\{onou}}%^k~coԪ/RkW[z-\uؗ?}#|N~9ױ/G]w_?wJWjJou=Y t_uj+y5ZXfϫ͍=wr֟-]NJ|oЫzoc1ZwsߟǞcq8q;7a1q 9nb8s>GǺ<pL:ǔc֑pIǜcڑq,:ҎKB0 eǒ#Xq_jW9u 5Ǫ(86%7u|9n鸅֎[9q;mq|Nou|wtMor{wu|.;;qw;G2]oݳ˼{;帏{sq:~@>#p<0Cq?xA':qs㱎u /q厗ׯtv*k ] ;~&ov.ǟ:;xxp_8!p>{q|y8Î8`}~ ]q{^g:יu}!`[ٺG9uV3yL^gX^:'uv]:9uv~<3={U~_vw>ϳ?w_3NMi5ͺnYc]ku]SuʺNY(c]ku-Auo5˺X):e]uݱA5Ⱥ&Y$e]&2 ]hu3uƺY!:d]uSޟwg>X`]kuuĺY(L[g:יu]GO7*]g:kٴޱ,]g:Cyuήs{]3{[/_Ư3yyg>uߦu #/~N3{ϱ}$x_?{ߩk}ֺY^ZiClh ͳ}6z4X{ZjC m袍Xp= =64҆I.s=ІHiC7m =64jRȽl^ww|wG5opw]'7ДrCn 7^ЋZqc+ss4ƭsV=}9߹s m]7ކУZuCnhՍo ݩ=}ոZr.}k [7ЪZtC?n }'7֌ZrCknh qе|oCmh1E7tfЎqCn } 74↶РzpCn 74{(O<羆=iyѶjCCmt64׆wnCsmh_qOmh 64׆czlCmh_rOn 6ن6fnCmh 6tچFhmCm*t6چ\kCmh -6ۆNi:iC'm ]6t܆gjCSmh 6tԆ]zmOC{O06ֆXgCmh 64؆H{kC+mh o6ц>GeLcmpuzeCl n0x||pξ moRZj|7t7عߍ{97vs6.'aC/l0;K,s%ޖZds%Yh):ga%w%ޕXYh%t]qculqRbKC%֔ZI'%XR&Q旸Q ƾ˸5Ĕud]/YKĄuĕ;Jؒ5d.YKd-YKڒ5d .YK5dM/YK풵d.YKߒd.YK5d-YK έ%kZ%kv遡kuɚ[ޖ%kr釂skt[%koɚ\%YzVg%kuT.K%RɺUm%kbYƖ%kcɚ]ٟ 6zW}=k-/YK˒d.YK5d,YOKޒ5dM,Y?Kϒd,Y?Kϒd-YsK:s%km[%kZޖ^e̺\%klZ[%qz\%iɺ[%n];cz̏{KԒd-.YKd=/YK5dM/YKϙ'aI w^y"ϰĝwJ >RbH!%SO?%XUI'%9r͢sJ<)qo]?T;%攘SbRO%.TRQG%XUR]ƫ=8J*ĬJ<+ĸJ+1Ŀ69ɱ6ٶɶMmlk96YɺMmƃsl2iWd&{6ɷMmrlcd&6y >ɡM.mjSl\hC&6:2ƲMlkA_\_d&6o\3j+|d&6ɶMm2h_LۼCp}86YɱMm2l_w ]3mo\kgd&6Yy޽{ǾMnrpwd&7ٷɾM.nnqd&6Mmnyشo2cyd&6M>l>!2sQ==&|9O:>6ɬM~mrsiLd&6y.8FpMm2no\|vY57yɻMNmrjS\d毇:&69ɸ`d&6ٵɴMm2mid&6yɳMml)d&k6YɚM6mrhC8&79ɩMms_whg<&6yɳMmlc&7YY9.qt:=7-nu_y-nnr[|݊E'k8߭|R䚽[u:r1r\3{[b->nq[boX-o}[Lݺsu`[`Klmv!6zw-3G{li-4غcٹ [zaK#li-o1~Kl----o1~[`[<[oh\;li--oi ?(8[[Z`Kl=$t4ؽ-nw[<oXB:s ?.=>܏wyؕ'O[`[l-o1}[`Kli-`ysÖza;{g4Ŗ[bKSl-o[[`Kli- !4Ė[:b5~7–V[[z`K/l-_;#Ͼ5g{[liWu{Vl1u[ b->nyު.B!B "1 ~_1HHH $g= Y{O}OO}OOݛO O OmO]OOmO~7g||j|j|j|j|ж/K}k|||j||j|j|ֶZ:6AMͧͧͧͧ/QSSjރZGO 7m?ﴽ{m?)GnP5AmP?uAmmO-SԢ>^y35}!?$5EjQZԬ5EjQZԬ5EjQZo>?SZ?wZ7=~}\עƵqmmy-j]ZעֵOlQZ{Q'[x\5?xx^MmQc[ց?S[5EmQs[EkQ+[ԻuE nQ[uEnQZEkQ[uE]lQ['. 8:xk:ۢ޶-jiڢv}HjiC~uE]mQC[5E mтQW[uE]mQW[ElQ?[ElQ?[ElQ#[ElQZE-lc~>iu|)1ߣh-z=A:ݢ'hQ[E?Т>-z5E oQ[5E oQ[EmnQ[uofs~}7KާGh#-jwEnQ[5E=oQ[uE=oIoQ[EMoQ[En5EТFZ -=C/CzzzzzzzzK ;R{^j~/5K}puwDqcK71^CKM?襆R{zLKVR{~m{j{¶^^j}/uZKK'R{^j~/5KR{^y/K=漏R{z߽^\/u:K륎RK{wԻ^]/KRzӽ^_/KRz}^j^/KRzq^j`/5KR#{ԟ^Pg===z4>EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ;z4b{ޓlO=6佲S-_eǹ?M؆=6<^qrϮe6MYloe?γr^hX.u=b?_ hLjϑlFw5a 9QV[1c JֈjkK߬}A5\?VRu5׾-5cb=vu׌꡵{Q~,zZG/UGC/}MjnYLcmReqb~:Qck5cklmU_t1lc3^ǔZ^9R}yR;s95zLzjCU5zRzعޣ(b3y!?Ǟ:s>n[J󵯆u{:_e/eE,EgC5 tԩDZ>Hy/Ogr> <+K彲,a5+|c]!!W=/BՉa,9ӌ*uLcU]KSUco1}E/Yl&Ma{{=ϳM{ YŹQbrm):S'r龨ZXjBlHW!J똾Z]/6vc4v ɿؾ>m_3|hkԩڔuɩks苭{L!^\/5w Ƣ庡X߹93%NBK-vW[l)>7UsPsSESt]k] K5L'Skiȵ~1UK9ʮ3gy)qkg_rƱ֞ޫuy!ZkeVr[urLIJsB5%yE&RlcIW;繱}a3ޔ~/EF}=]u߳Ӷ ז}Oeulzu^![{^͊z u1{3.|z鲹O7|фTֱUU][׭UU\yWEmVڵc|:g3"^LߕBb2buXNf'ε[}YvzNkrq*??1f -@!equ!6se}cZ2/q景 iXc&hbJ^19[keU5c}hסBr/6cPwRl?Ug1Ӗ5k{v!5YڠBڗ|,NxƖZ)5"mqēuzcŒhϹtkkk]Se1>Pϥ:66V}W,˽L[t/sKƒUgh b?͡>t Heoct{ekA8z\EVs?jҏ|^c~ҧY{^ҧAY^Yu+޳<;9>$~]qyZe]|eyh b"m q5ROcuGEgʓ*ZUll=*{eWKesr^uBb?&蚫G 7U>o2Gwl/gv^qh  ggzbYXkk1}o 5yh/7?#w]|55'lOٖ̱rituZuֱvq!} }6׵o9&_]s\'N@S3uWњ-UjW{o<1T5̓\=ZLY᛫Y:F)!ֱSt߲#kBJjkh۠\|T|?~)cq-9CU~'bEkn~6!]f7_ݷ֡Y瓳6Z|ZVN`.Ǽ99 3e1\i@Q΅ESG}+BӢ.?~Ս=LbX->-zm[HU=صVv2Zw>kX&$?}]UܩĊKssDCBtdN;WwꈗԿ-"T8KC _mk[ڵ<:B/s2ehZ9NƞVnS-]}t^KuzN?'ϝYle6dk-c^ȶ%lKؖ-cc[2+l+Vb[Ͷm-۫lֳ폰ﲽƶm#&lMضlG٫^MZN~2 WWN=lgCMZv<<){&zT⿔g2}U>g9|ݍزlݟW.-p~2 [5r/t,ϱBtjͨ뵫&,rkqcSOSc5sX Oٟ1Bcg_k}MK>=ѤG~neXe`m\ Ww/}E9}Wؗ=1}OS}yZ![WX}ZӖ-k);>?b]:tLRB9[#G̕zǩ1sn]jѝwȵsu f]n91R]ױ}X]Bb!t,UwbǪ(CRj먞_\uW^H_Xwho}b5sW5*u\J]>^zL|֚"-ug_.<*kG33ݠv\]j@JކW=Y]=^l3zdykֲu|(zgAy1vNYϷBXU'uA,sR'uk Wo yUNoCrʔXO-ĭERz:3c!f[b 9zƓzGe._||^Ze;fZkJj/z*&z/>'1cWHOVUvUF7ki~^vEwScѡZj|k,׶hQJzn}s'r|^^δDžQ,>|x? l;߸ʮoy]YcUNQ[2wCi˷y{\JAuQs8xfs6m_k[eԜzWVC4"32ߧĵ+~|gCh]O#˞Z?~Uǡ!!yUVsrL:eui!+BM!Yj6Y点js~ɧE#,|"ԦX ]tZWcuՕ>uHnjVj_TWLBւ)k#K~ Z]dwǘ~*$B[_U4uW=bTG sυ]5.9k5r&З!,߼| ^1uҷZS,ױ%GbʚO@nO?R?#ɱU:%w}PEL懥֕=wê|I޺nIʘC;~ g 1=Sݭ>pjn[y7U%5VS9{;TSr}ecX֔\qc el546b޳\{ƞU;S GN-IE9󳝪>Kv =6ekN90&uFVkjz=:Q묩15*w+}|1*;?M4%7!=u5q9KzZî{rjC,c__LιO_ձnECb/4%Vr0<4/Yr-&﫮wjUcsn,;ue:USR/\,ӛ[߳%l*F\jߡ}^uyQ Yzn_-+W/U˹)vhZH}~f[c#{eu˱k\=K?,=C~U|]-RR K1eՐǷϧ5ڪSuRCՐj}SY\2$Uޣ}uޖjBk{ZԳYcɉZlsN|5kq=ſc6m*lئw}M׺}T{N\ᩢ(ޥleMSr7!良+Bc6wNY]}W{=u)>7oZk]'G^"+EhOZ嬷:sGJ>u,yL'?)_-pD9rz^Uy5,GXzXܪ}ckIk `ۇcE딘5K{jz?v^dZ˗+8 =ƧZ3v 9]}[cu+9kt7-ubjZdվu^ګXi}WRkleگZb Կ!55s=O#BgО.9Cu/Tc΍иr 8SrCX܋>oQc*\gxN]*kpP #֬T=wUO칾uS5}N>w\:XuNc}i/BIN?XR<֩26wjh.Yqگ7)|}J?BkOc\v9E#:;;CݛX+\qb=CzCk ױ13X,*йλg!vUtΝ8cu)hѣzl^W FU>0֖>#D#k\J7׮ܽCfoeB}mYҟx.VW SWm'Kq ,~iru?)YLkYOYmK릞Ush^zx{1-vrcSqc.-wq9H5+wc*}'5B:މ1O;UsEk.9eױC !uhlh2s`{}!˖!kB9Vuz2gWτħ/b4LWBh>.͵\w>;2Gk,^s:խ> u[nVqlYu*/_Bz92K1ݤt9Gu{b*=z;s]~߿=ק#)@I!g퍝On'rFwhUv|1z˞L+7m T+_]sxhoK<K׾]8]f!ָ*6bkCJnOVͿh*K䚛ſRx>-K_)MɟoL޺zԚC9)v1\85B)džֿИև#wj"/dvQeu.{!u GXz"Xju11\fR_S ZthX{Yj>_] ~JQNO⇘ʲh^ųZ嘘*fYYks|y~_Tsct }rgj|0v!kb)|&\hXٖt%?R[^O=}^E[7iQYpQ\+E3ԁN#lS[N .eEξ3ujqU w7{>|l(ͥOu7V}:髡'K}*zNWoj9*)3F z=P~K& c7=͜}p35lUQbe7gͻ^V׫)\xK9T3smnȧ~zLZ߇yk}Ec~>uun76tLU_Yor'5,TVR{B_xr/sccwt^]k Wڿ":elEz_uo~-S~9rߞ(`{?,^U4ssx-:!}kz*1zZfmo5u۵,yY>Jh [9!=EYsϢ;;?cߥ/0YlMkX̡=VH,Eߞ)Gabncsm1rvP~_\6_[!hiݺ?'^ϗ #W)9ktlwb\y\911^LfWo=K^z >SL_cʞk]]MѶg2}qwutUSݬ yԚ0Dsԑsrgct+G>թuhM']cr/ڭ,{XsG:c^<׼;C|$q 4!ǴWqe:\eѸv[\\?k =5nN5:9Q=}}LȺZ'~o{rOL?M{ X幵߯,^zWͰ{ѩrUk}k 0ЮmV3!T7qi/kGYz*K}^.n>*uP.{Ըˡ67_/w}m^k\\e>[`juL<]RsUuhvX4*o\hEbjvR>ߢ)b?Km'%O|ZgC֏xٚ巜1Wv3{BJ䨩 у~|]/:rb7zYG_kUFhU:f>J8/4bbwbk~]u/!ߏ3sKB54oAħzXi׬qwc?^xes}-9b!w/sꮉ)@ȵqLb:^xΚﺆkv{뾏E`kQR˵.NBusgek*T5*?[r\^#׮9>]ks-:O}s"ƚ˦x/뜜s3FKpl>ջ[Gi!Aﱕ8> ];ب/潢!=Ps^9ew\H޸|SWvQuϵ8,KvU5wLl>]gyLw:&a*d=V;us˲>k gߵ})Frg1ZCo[YզXyx(^/4v}9ι^/澡+ssVƋeƸ5XTy/s?gw= MOBb/:!31u%d_Xrݐ^*k- Nˮ['ּsݷh&}]x\}>LթkM1rmӸTmjhjm]o|c ɭN~N6PʵC>N. !1ltXjkإ\5 .X7P?3crmKpiO,}LlQQ62U=lSe,~ !ʱy\ͬ6*)k_}Ma[^L,YP{֭oCͳĠJUWsFNvs[Tm mlg62m{AsM2nLαZUq}!:$f|å̵unu2oS593Z)kZYVαW,5'fk^U !xvvz꺗fW|vy?Ʃ A{{nW}_7UM9ǪU>hhm_=gƕ=W nznrLH/3(~ݜӗ_]R̨r^/TR0<([ˮ~kA_yN_꒵OqǪurUazfX]N}:|]>cs 95Jgza ZR[Bmv=&6|.gWUn~^]{!~|Z\y }C!glUg9S+_4#G/š~>SNL>YvLγ I r뗫Լ]{\a_2W E_o~EO}qheo7>ޢ[]S!58&d[K[eH}竔.mw.}ͩ{\Gx]UNղ}!e}j7~^Q=ێPi_W|7/nuCkOCT#߭b=ϖZkSjUc}Ko+>]~n:5N[M25>}qcjc]GC=M7];놱>W,hLlv?9>}}Ǹ^#?˩!Vgl15FYY_\Ѭ=uQUsĎ8XR;|rB&Yl+U/T;Bl󅯧ט*}}_z\VCu1c`kz-d[b%lKٖyer!ɲ{A1]Z Ru"gul02tJ N;>K=?SzP+嶵o+Bl]֗Xo!;yL)T{\~iC\yX:2}:^r-lީ-=E4ֺt 7m;Nt*X굻_9[亇%C:~B޺xk]0_ Sk}?rtLhG˽rZ7)qCsNp;9?[۞uͯ.OwKr sHoc~[{b>e=ЭuR!9P};6ks5zuZ;'3m_ZH]('F7stGUkv)A:[s3vꖱp秬RM'Q97ZeBâ7Ruļ{*l156CZ9?Vy5&X,c4 ƶt.u1R3]|q+{+qÒWΙkWo3=TQ,sKr|j#tqR CO8΢1UՂ[X`[Qpţ+}K]]t{_սc㫢*+}xnhk-Rs%fXz$KmqBch♱e}EQQs5}M:uvpQbQ1E*-OckfUZZCjt\|e:4-&!kN*z\)]\ zW\}R0dQ6Xjcbθ7Kb{iLHX{{W.XtQ'1+6Szuf:kަh~SsQxݿ)u'ćU|s;sckKs|Z窴cn8׿%eס5H|BL+[b u ==So1/=[Ɵ;CssF\ꏬcՔt~}Zg"MκW.Tmͩ1DŽ8U>J)z._mRju[,d:[z?-ݹn9Շ҄cf6<[٫bEs*gWL[ݕ9^שkkZj z]wXKѐ娵bHN4e1O&郥@~|9c>9m܍}qY߳hi(,sUGRۊ諩UZ}km峟7MLU׭=9.ͪ2]Z3^,>zv}Ϫo ~[3ć!5Ɨ. w]b~Q1eU ,lr[_V|{V/RW}: ~Rb,T;$טk9> kK/{~)s]D6 k ?ZD]+\s+{[2\34]sqmCk/峷!h%$]s\{`w$\rò@Log15[X&'q2_{aמT'=̧{怵0UNϺ}]7G}/ӗ>'t,xh]t׏׉!Nư9E+\q\ |#䳦n|ڍi![Սk)r+3w|ugjZҔ zus}=,}hq!]/lR/vԹno R{:{ܿ;׹+}1n!~XrڒoUuZ1L_wz+f.{6|e]KTIU|:wU,5T-T߽TfC3G_BCaBuKfA&Wk~hѝbQ\=+vcr(go߅6m l3^d6m\yl]>nW7mqt蟁zss̷[4s딝:}s7b"+/{kM^؁z;5NWmF]}TȪZۏ 惺g=ï~8 3BٺzUtw<˹9m]B(cA=<ȳخ׾0!X|`Ѹ\q^L>6_kbu/?\E}y彐{1)zojg-raUݨ۪Ի{\?g)w s^GIՌr(f~0݋jI֗v]WUWU n< ͻxO}mUTri_7nBHcy*WYt橞4_tϭN)Z}jh/[3jTBm 4ΪAh[zmd?_Yzتص+v};r!sHFhy^#~6u1T:63*ORtR'zԾ&TCBk~V^,YBXubZ߬[ Ghg֋МP\Ӛ1s1uEmڤ]}alzXk/~ES:%w^kiLn_9Zsc ٗڗW]mCkO-:{ޖ;{uNٶtYo[6kױ6\8T|\>7׺eױ%Ʈq亷57y7?\Oia, 0(shN5܍9/d,>X^u/}R+z(]1ӡk#e^ >>LkXߑHR:PTД/&VxXeuң^!ė6s4q|TcpcSLRR[4w3*JU{Vxruol;RϵѳD BQfU?V-K;tؗ!mvh?nڿ\Gϖk\ ZoҵyJb&v.?1æּ雥[H5}!ZE[ 3CjwzkXZ+rjش3t|uLrڪ?(٘^Ȣ>+E5'V}}U=)M}euêe匫P{Vi*Ɛ!Z'UsC>?s,93 υ\E!UZKOZוּ+%!єl_56%s#Wޗ[zccr~бwz1V}vάZǪŪQ<;}n?9s><ޝw7==W-X{z7Rs@kKbbsgW:׋1oQO_w{#u_E_;/Q~\r~5F]G#@[+BuZ#\ s( 9E-YkKB?CoB%Nb<64_Cg'kͮj-z>Pwx;WS5KucB3[;1[xY|ZjyQ=t;텬y56Y_R e#ttq< y.?YcH7 !X*XccZfSuB{sd~N_mjϟShMLMOљ~7X?'W߾ڣ(w}z-:wTˇ\#uT=qro91:bբ!mO5ѲNs.6!:zO1NY'YlVt\J=bܒuntnYLXkSsZx: _ s0U]_sm|~|מ^^'5]ȹcX;XKcs:Fc[~/:kgR9A鵺V7c{p.~-vJZ}kv}ex}RGm~(6]רiffo.{XkճX6R["-ujMr׺\ߧkE\ΩϹY8}~1}PzY>pXUˡ1XգX26K:GWXgx9ç!񓣏-nַkOE6I)J9ޢz K.ܘuUoCTO5߻mVhΆGޫ9jdHW?Vc=Bx >˭mU!KQSce&EsϷsLRպ{T:hM-->i%R^Erfnv˵SQ!1ݐ9 Wސ)4!Ts߭a֞٧1]URz& / =ZcBeq9e}-r5>{*kQ?3 "U}BlK)Wiߚ &'-&nV{ԓb\NZXB^[7ChGHsuXdn{R"-rBjg}rje국:)ZmKɜVm[laX;>[({?40t9XcjPHmuicʞ_jtN YV;)@3׮þ\oR[k jk j_ѽuťMяYaCq1%-ӁL(iAR=>1͕)W|z69b/WjySDŽRk>;WR>RU1ޟ3헪{cJtxu/g^꒏rCz~zlH9l[l\ҟYwm_d|6M-ld|uw|g8{ZО$Gxn}9OzRB:Tџq gl}JɵukeWg˘g93S]5S5&zT_nXz:R7-+]ӪuMc11.1;6Ի䂯Gb]Zuuo5o*;u?qgH_sMحLJuk _Bt?d_j},-=S]ct5}tu[sӚUcv"=랟OSu=V\iK:7MCoݽ?瞧.M ]#ZU^e5[2cm˴"67-jo ܪǺƛ+|}BLn8sF:Wp7.䄫~뉯{8Sc_ oK C:K2w_,:VˤŚʥ1X4G/w>r>yVKͅʥ{.[Xtckhogjx l&Mf6yilf6.Ǭ.K7W{ :PVc<~__ڟCs=[p,u%t(5*I]#n5>c =R(>WQgM[֕1l]/27U[bȦ1ֻ EU9T7!. )OS] ͧX;zTP:/wsUi^v ^Z!W 9ץ sԖ~x/Y/5%TRXpѪuu_Sb(Wum9s,s+'(ůqҁXdmѠn~Pwr_k%ǭy k|耵&Xu~H11sNYb:olW_e )7h_h\~"g>>]>6d)qSy=W/SKѕ<(̰hP7)L y]U_eR73ǔi/b53'kg eݗK6BBkAu?XR_#e9)B3֬F\}JF֩1Y~Ե_"|p1=8\ZWSt5VQ:Y} Y'T;1=XϖR9B#TCߧ9>hG:;g>JuuнtGu[Ucu妯J)ŮibTKwZoU;}{wbhnɇGʼ1컧ޡq\B43usbCPu=nǗ[Nj\5/Ybu{W&+<ƻ,To-1}M6KnԩО8W ]Krǒ%r;_Z4srp!c=hMB}D+?>Sk곏G6uA#ww o*{]vz]ek)^u-ɔruEq 579)=r3LwY jUSCyxNtu|҃^ɡS/K~_"@:uLYSSSSa6m>[be[m%N:ߵauʿOWXsۦh]ҫw3Su_w>ޢg> u,wqL]kw1 @ؘHHۢk3˺-d=|lWvc?e }9`[xsrNjKQihmr_E5|ZSuRg]|O^Wcb:uK5#䙋k-iXob֦0fZ?VQ]}oYcN=u{oV~oyEsoȹ{x.WEMz鹴]V=n8οW .uayWl>SkqaHӋzEC\k*R9fMֵsk|kжNߍq[uI!L5BSv/Wթ>Ouԯ 69bfՑzxGJNĈK|]ة矝ؼI]<߽sZjW,dOJ?fWt?WTUc|!1;'o:iP_z$ݭesHo҃ļn{H_rps" v;VƐW1ku{A[W/RRrIHl il+KYu<kx˱l}V)\ZқU1-:Uʶn[9kZgusݿe~/zgn:wlI_>[<>XƖr/_CӉZ勗rcL,uv=-cz'WhWqVUS~YUC6tofk԰T<+Ɂso_賬XGQZƚa=屒 k ϱWCstOk[-x`?YˑzCB"u;;9c1G:*ϷԂԍ־l1l-kRt ~9auNǧ־o*UW9cSnںf7˷S1~s.wu{`S};&%n|R6PZ{.Q+9h[~.e딟]ZEHX{tC|'%GCH=NWk.)ks(g0~cF>>-,#un_JטZs\Vv\Nw#BlѼA%EP{EWBs[֬gZ -bYƑSO}k*7RO묕kӆc)bٗ5ܾʭO):c>-R_>[Pߩ[gꚥw-Wjҫtڢ[UCQ?kWU1OK nV11Ծ-gԱ?d-92oʡݖcCjIlo Y=9?'i]ZǾRu-\#^MԽc{yo^kMBޏ^§;?1XӺ3=C&>g'_LSR9us\9l٪u/ES=UuƟK\qu)qkw513m*Ojx/S&X+~}6iWr۲Ij-L}/eZ:9zOZu!sNhcLݫs옸#c?ՇPMlUϭo.>c W,5.goeu>O7nFL0Z9>V}~uD>Y|T|0P}]]Gڋu}ߘBD~2uZ+Clߍ~$W}/%&b Tkv:| gwR:6!sֿssWEDJ 9k[l:W/n9{yHj@|/)t6wͭY^{/]uϪkoB⣪%殝)v)Yt5sŪ%-q|$+>W1{/ C>H]oVqM߱ƻ\; Z*:%և\DZssZoM+~Sr\8sORbzظw?k~s\ۤheUԶZ}U`jX~rKjnȝv}DͭBOcɟ2 ){'C?"1v{_hoʗZڿ:j|ηėdQJP}#r]cL%U֚3XrÄS{V[ZS7RzÐBb'VT]GEscr-W,`mW Go<>(W,cgU\W-}v"kñ؜hiϮ|JB^ 34Bc*T?>^B&&jmu#!e\1.Ӝw]B.Z:yը9^ڶ2M,Ϋ"w-ul>mw u[}.z]ezẞ+A}VLku?_}2ݲ̿[CJϧUW[笱b'VW]8juu?>[SYa1[kf84biOl?e[Y͢ )Suk_-=u5/z틭1J6xϲTa{XU{+CʥO19#\zQîS6GKOX6V_*xчm9j t-R[Yd2֋Tbm}֐Gur}_h NsbsSyI^t[5QCׇr 9Ծul-q]uFH]<_ ]틍Łޫn^s7cRhxG%6]߇GLORu/Yɘ{",lsc clz-n-Wi35<N FUEwv]gcuQG z{_!Z<רR?bSWmn*Zu:cuի_W\iG ]66ӵi^fnW]DwbQ:W 笾1 w~~T:^~\ kK73uwLv{=mO>*̭N;[嘫~(VjmQz(6Xuשq[2ǘC1 |^[]ޠ͵lyꫲǭ{3x|YlbkZu!9ǩǶj`ji؈1v9hEuF!2ն}ܱaP{ ]߁~|~V !Wul'{#RRsޱ?>';9s:sC{n1c\}GJo+91V_=BzBl1tե>X>FU5WϪNzwb}j=wHb2jGN?#ptHt顯XEr6W} 𙃵hKե r|u%볐u[>m n.{6guZs,QvG\YU8Н(U#})}Z7.嚖cޯr7u:џwb]";vk.hyW?k\_ 9&Z;}b뭵 =qqKC]L5(vCjN&UGXlnnvhɘ]߷yr9ymLϒzLh2cb^ݚiBW.{Z:G̔_9tFTb[Ø;.t>g)9~N\em 2Kԛuqcbˢ19?z)f?Dobs쵫7 ]>r, YOhon]6|* $gRj ɹ\}sgN.*Dz}5wTOw136Z19O]ȔKT;|S|> 7bSjH-X?[uZs<.qNRzG-Z'sg|bjPɽԱNdw'}jU~s=)j_U/etiO>!޲?GO~5R=YZn]Ԭ/= ]~HYuq1Ui}/Cz]oU]]έu!ssoWxқ &WklՄ[Wo?xn19~~-wiՙnbȳ\Vu 뭵6,5LW}}fQoZ|I5G!黨uϳ-qV)1m;U5{5k]i9UYyct]#|:m^"2-}[?DBkL}i#UGk|]un׌2^z~r=Sq\_upe9jH\YQ̘BkZ y?|/El`BVgw)k]=>Ts)GV9\{l> qeUZtsԾi*[~=V{̥~1YA'> Ϳ\!k:kժbS^;?6]G<~/aJր9{l|^lZnYurZ5Bcu= JKSzV_/ZwCS}>p=+]o%v2_wSU؁z͐~;DCBjg:wT>:N۩}^o_+D(c1R}c=ZKB Y[]>?_b;G9 ]^|>jq7̿ί2sk_]3&kPsQeUu]b"[1Ng-=}#_@ٽqPճ|s_Ok\Xk9vN\;4W,q 6sU!ZC-c.Cܪsjct:vVG }lSئ2=H퉶X{x?{1saU]H_t[γWh[Ѷ3F5зr]_19:ܱ,\#$,uu^(C}no^ʽUԭPXU-ceʹ_!F>#uqLbkXm}ykN!q6Bb8oX;Wo׾|cz\һN!h] ^`Կ\}^Tto<}lKktӵ-zj?s=s~%!QlOWh]e|z7czwNlBzRz7x rP^}5ߒ[y\ >[ks=hTXBmckbU]q!>U֕C1RH\rƧe}k9c> Մ.^kyr~!:l]}=o}`YwǾ:G_aժ~-{ YCkyپި}ϣt\&r)TrʖX`kW9͍cY0_OkLMK%!6yk5,w5!WC>8tesk5%FxPE^lɞg6m l3^d6m\yldM[/ۂ:lt8 4[qwV qjʓMꆱtc\뵐u ]˗= ]=dzߔua]"Pv|{Ů_V{[ed,U5Sg%e+F:'3GbW]S(32+W!*uK>t9G +ŏy}gƧk)z:ws}ƞZCcƒnɮUQ߸bcɢ>$5,$R[uZo\Tv8J񑒿zF=شR>hG:$Z!\kgy/ՎEk}/zove'UL rKZgNXRr=OyT|?5Vg'-?pdYk9WM1fٵ9'f_k_SvZg!}5U\v}6rlN?WnunKVH}r-MW.[5d޹lۡ/&R^~ZZe;fB1bj{׮{SL}*c|ηjUBL&:/S\b4(.ɝ{!qk9! ;]c\~1xs޾~6Ey!ZUEc!0c}^kU:[TG\U]ƾ1:}1Yt^}}p{)CZ2ߋBV״cHٵ/bkv!3T_t9_l?&.+KޕңܦS+0ZV~Ǝ5|cV^<y[c{c sg}J'ZQBK~*(o7 x>_}o^ȳkVo}}Ƕb]sԵY'v[ϟ $4b*X ɣ5%ޫwyr=Ů-;=̺s,_rأN(e=A&kn<%Dֿ^&GW'jpߣ}Vyeuqb֠#}T}_ɟ۷::qǤ 9|s9K3fc2\g_fːukgW5:о?W_)toXkNֳ޷ojhcQRʵ,?K|+eM(筵7Po!G/ĜWCC2 !=VV>X^Bu9?w_=9u) W_6keWѣԡc}d9u]Wv弲/Z!.K\|wOClWr~Γ{@\7 ?s~\8qv_ŗWxW~~S<Κ'>{EY>sFپ9wo| YؗM[ċ nLZ=}%bcz@8.Vb~nsCFLul_箚җoh}ԺԾSq) "tZcB`w"1^K1j5ƫ։v"ƺϡ#*>?5R{~h}{u<)UsĪ}`Kc?n\iG5G,~PT-kϢv擻7_m &Y٥ehg!:1gתoUSGNċ̽MרCt8dž3X-]8YΉ)K[4âS9{\]O~>{Xm]z:vmkީziY{Z99b꫘~Z,X{>J1Uo;y\h4̥ Ϙz9-#ZƖXs\r/K2ʎ5u6=|u|zmC[k}ykMK /)\/VW|z1滿UX!uc,VܗgV ѴXmM2YcŕϮKr]߾Ԯ^͕[eu:lTyݸ̷1'.ؔ5BP-կqXKѩ2R\r}ʱ)<5cr"NU3ĕПsH}YSvk.YTM~^U;Ụ,vr;ʩO{1Ԛڿ_@H_?uj_SN~xn?9Nw×:O~ϯrogxk'k~g-ON;=`;A'֓^c䯳>tܒ7xߋY;ObY~p~;Ҷ{ȃ{;g>9wmØ:C|}/AǶ'i=ğcN7<'jϒg{|pi[{zgi;tܡ 80G r.O~?O.xȶQX7L7qÁM!9pȃ-spc~=Iſc}ܷ8z.g'N:vߛ؇2m|Kzm.[mKl^f[l^g>>f{0Kl߰baA)fGQ`_SlcE۟g&3 1AZl 1Ak^e#lmbSl_1AOlk63 bT'˓ROO2'ɥ'˓/O.bc>O2'ϓ̓'/Ȇ$ΞOlo6_O7l}{?ES)q6b)blSSoq>`ÞO/Oyaç`ccl)l?d#."Ol)?FC!7B>aClcB^a|Crzz6_ !.C!r{R؆2ΡPrb(q9JN %yCP{(؇CP|2_ %7CP069 %W %^dCdžC`#^⫡Пl(JoCPw( %bnaCP4`(g(vCPw(q;Gϰy9>ÜAyAʆ>a\ac\ϐKϠKwوg33?e#Ѐa05 _2gӳYv2gɉgggӳ.R?E E e~RO^>{ {{y:m6bYrYYóYrY,~y<yY,9,y,y0:0[g\éѫpp4y84>F '3hpy8? 'އS驆p;&4qp0=N G?ph8<8 'LJklp|3 gs9r9jss9l9949}s9{_?v`#> vF#hHzS͑#kG3#b$ul$2xVD+G2E#đHtg$q2>|$8&D{F#‘H<I; I܌Ŀ#Hl09d~#H4~d>#Hrw$s?Gϑ/KQh(g4El"F1Qh((rb91 E>G BGGQGQmlżF1Qk:n?"G(0&PW& Ԕ ԓ q-'P'` l:ܞ@L` l0L` 'S>O '0 ;=]&D5ቌg.6p"DnD4}ȸ&D|47Z0N_D|6XHO7M$&&Dp&R&2԰ԯ}"D>w"x'I`q<8/&OB7'Q&Q'9Icl;Z>Lbn&aIqz9$bc11N"&ЎII$4r2:5xDNB'׿IɌi2=d5>c2cLMF 'sdl2y6؟&?NFO&L9ؙLLF#'&ɏy2dk2q>b2vL~Mƶdjd4p2k{21 '듙dzhdl?ON֓ѽԥ)h=mnLSt} s|;S)i y09M'Bݝܦ0)i Z9>k :29M!_M!%Sn 0L'BMA7cS)|5[M&O!ާS)a >BOM!ק)n >BMaS ~N!)ts )GST>JM卩w*~:`*\kSST}*JMJ.Me^ST5ʜ'Sm*a*STi*soSTjT;JNe3L%gg牱Ɂњyby4y4yla:kt|:l:s\ӇN'3:N_3M'Ӊ 7@+g ucA A ~g |5<̠^͠> Gg3 |4\A͞A`N3Ш 65 89Π~w3ԃبY3pA fq\g3p9A3 |7fݳgE??xgQgaYq5 .Y qg{Bg1Y,? "6g1Y,r=,3 -f1Y,;El".g,psE9E΢E,¾l7M,&fќlba6q9M35l3_&gsl|2MΦ糉lt6sfѝu6MfԊk6M&>flx6l6y6ͦFf39g}0_ss|4bF͡ǞCo=ؚ092홃̡V̡AG!9hxC|!`9q4xpc s\l=qs\\<K%2\Ծb.8ؚF̥?N̥<os͹Źh\tw.kn.q.n.}\d.8]⧹s\4u.c.97E2ǹ\9{.scsh\rgsCcy<<͛Ǽ1y{|kO<|5|sc)Фy`6 1y{Ǽ1yyZ1XǜM9X̣'G<5?|n>OΧ~Χ4з5ul` @GM6` A6s n ޠn ` ̹̹A6oi01 W̷hMyM4E|.-zqޢ{nW-BZ-ߢh1zBZx j1shM-[z+-BZq^⽗XE{]/eXF^rX%V{^rKeܽԺ^tߋ={U6ۋz_ԮdyZ@N-/@K_ rk{-` kZ0hƶZ@<- ƵxZ S ȣ칀.,@?_ `j 0ro^ka]`x{`l:澀zZ C Фhzhm!Z]--G ѤGK Brr!p.vZbg!9YH.$ B[bl!9-f Bl\H߲[H}YH\be!yYH .D{-$bBrn!|ZH/x\H<.F Dži!us!B=Z^/G]bͅ9 O hBt{!5j!^aEfY^/BGE"j""|M^mɋK"j",-bݲZE"x="첈ڴ,"aE"l]ZaEE"4h|],B9;͋EbX-o."g1痘K%9~{ xKK%KKȗ^G/Q ^B^/aO^b%v}X| }ZL .&7ӣ,FccوԁŌa1kԁx1]L-Ʈяbl.Ɔbtn1z[̘b-nY-_YL,Fcbbtc1u0YPKKz%q z XX,aͰq/A3Kȝ%4x sYp Y/~/APÖCK%{ 1-~/!NKKh s]B^-aK%Ԃ%w 9/A?Kk k%` /!~?KП%Դ%WKX.!vPÖ7Kbf yZB^-!SK%tg Z-]BYB-KY1Kɟz)^bϥq)[ݖbi)6Z9KRZJ-Ecbh)YJ-6,EsR KR气1/e ^J/EKRhRbq)q~2zeg>[qex[˰24ls6]F^.Þ˰2rr9 ZF]^F m_Ƙe2켌~ay [/ex]/C˰2rsZ\|ae2浌y-c^˨˰2 [e˘2[F-\Ɯe2r}_=Z{YG}w}G}Ç}CZ؇/YzчOe>|G+}\#WmG>r\}Jv#ȕ>⠏}hlGQЂ>jQ_ }ԥ>Gn}WcR}ZGwCȽ>|Gc}`~}Xy؇#}ȩ>-/}}]G. }?>|ӇoM7}>|чAg=˱r.ǎ˱rl-&˙r涜/gˉhrrr4`9]N?[N.'?}A.'^˩喣˩˩Yk/'&S[K,ۿF/Zˉ˙rt9q9.'ޖ3e2v~L}_/L>L2{mz2ez/S^f/S_f26~;^!^!~^!v^F''W+h+h+ z½^`W^`WW++zWm0W0W/_]A̯ fWs+p bn1[v`+ }߭@W+h ^8W#+ 촂'XoW+V?+o+ V`K+Нk l9g^AO@W+ 9`+ 湂i~^.Т b|^W e_A\ W+Jr%>ZI>$W+Օi%6[INDW+Jc%5}%YI\$WbJ澒XI[\W+ڕy%:$W⻕k%듕g%J߭$_W2J9D'W2Uh*o9BVu*tmy9"WeбU*b}x_|VU׫ի* ?b.ѫU{^E bКUqUԓUWQW1U*g\m1[-Qqu6[Gܬf:ƲYz`ۭ#f/눕uum9{#& ȓuc~_X1uum5YG#w֑7 țuh:캎Ymב7:lMYGϳ]Y\p}ztd=6^Oy'gϭ'Fczrc=q_|֣멋шԾ?3hzr~=6]Om[O߲g.z칞9'֓zby=c^Ϙ3ԃztp=um=yqG3ߐ!>~CM r7oЃ;G?w8;.~߿u^&^o1k5b55jk5b5z85jkhkk1Q_#^ׯкטk5kk5ƾ@ۀ_6Зo@6pt}bmlo` @mۀ6 j񷁺yl@6Зn`>kryv@l`n W60 v@\nm 6` mo4zsȜ6R7ѬFo#kFj#sHon$7җloHH?=H|nHO|ۈlfmD6{s#\7Fbx#n$62ߍF漑uFۈ~m$Fi/{61M)X?lbnM&Mqy5&tx}Z nBK6g& _n"7&4x܄/7ϛ&| _n—Mh&| lЛMwz ]܄M6MبSȓMh&݄7ѳnB7Q7aM8&y6لm&&rv~t o6m&_7~3~ߌm6ԫh3fflxL/L Loffjftw3>f3mm&>6p3fbd39[n&F6cfm&w7c`3ZLLnfg6S63fbb36L=یm6ɛftw3Ll&_Gg_gί3ייݯFyx~z z8ubu(3׉Ը^Go^'_g3hu: zޠWzA\}`Mv}]`Lo077h }y{]oo`77ȗ7ȕ7ȓ77o`-ta Bl!>~B lA--v z-d i 5w =ۂ&la[n[о-ݶ[z-{ ƻnna[M[ƽB߂0-u ~Bo[bMM&~X~MMbMl&5Mla{ Iz_I>I}X|I^I^INILI&&&:&&&&Z&Mj oRcdoQoR[ޤEEnEq| [E\Řfo1gߢ"¿ooQ&oa[[܇Kl[VЭo+Z\J~n%[V|m~[ѵi+i+>ڊvm[a+܊.m%bVn+ڴ{l%?o[V{lJJ>l_طϭhVbq+j+y+j+|5hm6멷oocǷocǷml66q6}MM.>M>FFom66~;NnGOCngۙv潝ym've.wŷRg%EeCE% u]]4]b]...q..1.Ȼ].q.1.=Ż]b]r]..~_Kir_ wP7wPvbv_;rZ\؁~;rcA v;c v`blZہwPv`bjk_ߣ\c=sy=l1zyq{h{o} a{=lq:yc|[GlNǘCߧzOm1'n~{'^g}>6{|~\~zOާߧz1G_ߧf?'ǧw_SGki'}'~IDgvw'I܉줧I\d;Nr'qIDSwRwk;vbhNs'}Nrj'zۉw۝w'ua'cމv;ђ}'Z}vNk'5b'~߉mwhN| ىwbҿb|}~@ 9}~@-]bî0? > ? >}=? _>@> wo.{¶].lȟ].j.pqم}wa]t].].lڲM^&NwSov3nrd7ͺm71f,ɕ|7>xv 즆f='؍w}7cݍw˻%}7~MA_P'P'0=hrm9ރg{=htqڃ}{C6콇\܃CL!`=lC~A{mvxڃ e{=b{bnsCa{=}CMC!w{!ܳ|ދ ;Ek{{^|ۋVŷ{{y/k^z{/Z!KB{^l6{?+%{ͽj/q|K-K|E bh/1^{^j^`/Z%^C%Fe{у^l{=>qCa}>c}>>첏:>l܇CX>>bf6GOGG;#n7>bg>G}>fهC>촏Z܇>;#S}>ivG<#O>e#?}m?6ۏv'v;əc?yGS3~c?}ڏ ذ~;'N'~z~~z~c?s|3w?un?~漟O|gɡh~bc?sOO<ُNG#SwIpM8`^|~\8@;<?yp `||y`eï?|r<@ ;@Ճ 5 y$wRR;׃Ԑ y|=HdѱA c:bAl{ =N$w:H88AzɻhAAt =.N$M v>HѣA t<D^&B1CC+ȕC;1C!rqtrb>va40>;ìI[at0ysyfNat=f>aaar0u0t8;L-:̜3a0~<<#ar0>=LsFKG?a0r\::0t|:0q_9C!s5C!9!z!s?}V~H\~H}H!~uʇ·ÇC4C!=里CrC|!uCb#r#b#zMᄏG#4#zG!>"?b}gƏGG##z=GGԐߏߏGET|~;y=˜GЕ#z#1{;!VGGк#~9BGȹ#Gд##}q!0#t~9˜#rx>~:B{\;JGGQjQjQ(:s(s=O+GQQ(>8ݏǘ141x|;ƜF?|;FǨc1|rz~ ;A@[N9ubpg''З |w|;Ɯ vO`r-=A>Am8OO'.a' r}=A' v9N_9AV'N' z z{\?-O O' z=As'_N' O_ccl1cl1q 6tcbcjcc/ب3cc11~1z11~?$fO'IIt.d,'I|wW'I$?Ob$>IndL'Ib$}Ib$v>I|DORNbӓU'ɷhI$~$IZvd'$s8I{-9Elb̧)yu ;;OQNaS)qs;EbS)q9Fb>S)uX:n"?OQO1S)b=EBCO){ Sw ["O)y|x4:t;M&'Ohi4y&Noɵԉi4;Nc468O34s=\O34<|N3i4c?O3i|~9FgO3i|~קi4u4s9M~&wN3hb  {yX8C=9COz:~y!,f#6sN6b z|yag31g3 s?CgY,:q<|Rϒg,Zzze>gY%gY|uX_gYr,x\=⿳s;}9u9ǼΑ9|uzs}9y9~'=o>|Q7Q79j9}:Gc9>G|cn9byߝCks9bs#&QϱV:s}9<1yM:Oa>P>O>a|kOa: zuظ@~]V%. ?X\~a9|_ /[ @^@.Э bZ{ؾ@\. hsgЪ /P.W.tlu;]Fjrq SzOOOߧSrSrSOhǧ#bO>n}?Ŷ˟ß2O駌SS))v\}>%n?%n/ҋ"롋E"{^$.b/ɿ"=Es_\d{]/.=Ӌ"5":tc1g3q33r3q}}Fl|F-[oߢEK~_~K-%V~K\ト?.'ȉKԴKu%j%tD\\Zˆo.%j%^".%uy]b^ȏK%r/.1Kv_B/K%bu%zK%px0Us9sbs9999y9 >G+>'>'>'>g^ssbss9q9s|N9q9y999cs999y919~_ ׾|AO}A_~?`_K__{_P`=z l>^ z/hԋ/__////7_~A |~_Ǘe|~?_Nheu2|]&//ˬ/ce2yq /21pܻLLvL]fΗezeb2x-/eb2sL\f\Ɨe%%ؗDG____2/_2/Y|IN~}I |I%cX?}$%1~O_2/c_b/ц/фWWWU_O_w|}¶_K_aӯW++t+zW++։_I_aW<_}E||__㯯\kbkj__SۿFf_sьѝͯk5s5~M}&f_K_㋯77ԘoȽoo'0o77!a poЇo)AA!!7? y 6m~o7aLo7l q Z c|C|!!7a,+zW}^A++ B ^aW4 q zp_&_Wȝ+VWЁ+\%^RCW!?W ⿫Ur**9_e-sJ]?2U*J _eW2Ux]eNWUt*v~?FOq^E2hU{y^esͻJ^eWUt8|۫4s MF]F^\ßЂkqy<]ÿІkys^C߮kh5V\F\ȧk5bq [\ȩkרпkԎk5q]#kԎk}_ïЕk5k5zkq|^Cϯkk5zk:q|Μיu:w-N^gNיuq9\gтub:c~ _^v_gц:=u|z9\'יu8ש_ub:Z~^~]Ǐיu|y]'.3Ԩ:u|x!Uznг@o7 j 5>AL_7 j bo` l}w[ߠos797Б x`|77В 4 l}`|7 &{n2֛l&:|>&qwMr&:x_ܤd7M&vXOn҃'7M|q?ܤ$nS7MlyD'o7ɩM^7EnIn3mw=oŷm|um}|oNFn3m6&oSշɵ6vMx/m|r6~&nSnSo6tt:=1==Z=y==6G3'~'~>c{zߣߣ}3h{= ==h{r{j=j_p;?wOw;~PK0;0;A`;ow~aw}}ow~!wr1x!w;?wȓ;~|Cͼ?~ @.@|@l~ ?@~@`?3?Po1~`McqX~wq@bCg҇EWwɓh]4.u.r/wѕ].K\%2ԓul.qrKOwɗ.K7wɑ]r.>K ERGGw]b.&enwwс].K}\w]l|#=hӏG#H\H,8$~$~~$~~d|?GHX~$g$n~$V~d,??R~$$~d?rG#6z##=ǏGrG?R~GNCa{qpa{{=p?=};#.a{=ma{sCca{:~u=bq8v#Va{G~=Ɇm"n~B7~6DO| Dkȱh~"~"~B~"fB~Ž?Qc~w ] D_ ĸb?1А?1O''x}'3GNOOwX=5}b>1|OtOl'&h}SYg'6ь}j}j}xg^}}b>sOܧg.}z>x>ϜSn333338LL<FO~&g9LL~&n~F&v~Ə=\*C!rJyWtQ*ɱr>:9uvp6gaa36FىP墽=~u.>\˟sq;W叹5sc.΅\4\^i.<ꮹ7ם8s;й<4tkv [O!tA0aA/a.!nv K x9.n#.tm 0s;nfe7 \~ 4` p) h5|[<Vlw<"-:O_lw-n7S<F{'@y @}+Vs ~@Z@ȿ$Np Q li=@>Q a@M <u ,ݿ@ PGy40O/͓hzy|;niyyynyny}MyG7fɩyvG v?ϣyyf'yrΓp;>9p4_>?e|;4|sͧ<3_.G|͇|:0'|;A md \==A<Aprɯ ~_A7H~EOn og2Huh8H#H. ;!R.XZقO\ `> 6C0m`8`w ^1XF 41X&P| ` ` `+Lt `KLKtl`81-S:,y*)o !;B|{b"cCh1_!x {Cp["!).CF|Z]k!)D;C"GB{;Dg܄=Ğ!aȃXvX@ ZZf_@S ̿@.u-- ̿< @V, &y2v=cXrvuc\]̣_@w > pg P-м ͺꁅp]O zZ\H B^w݅j!o/U n!.4B\ pZH ip!BZ[h4ʩPN/77o27 `=?S7xo93o27s73fot x{(C}'Cݚ< P5c(]o4To9Ci$ܡ2'ޡnPz(C{r,m PYPx;~C*_BD(C tjPw(C;CeB!M7CE(Pp(#?avs=f0- a4&:a<F;an0{#Fa0A av _a)^a#LO0FWax atf0 ga+g|0FCar) av 0Ynp#OfK8n p pwp|H,p: p&\.λx { s8..}}Q?s8.NN ]pm i8L*7R8~a.Y8la.eB]G"4!"`!"ܹ,x7NwE1!B>E9f#G7¾aDh-F~5BFE"^ZEEX$E_E΋e>\Ep^E~wɩE~w,"."ZE2`M-rs.O".Ez,Ef]E]$Qv"/".choxN\Whm1_-ˑv^[rob{s1 b,'}_-ebz\4.ub7bZ\ 2|1|h>\7e1,{1-f]KKXBK.=K%]³K-qw,GKhv \]%]";t Ls .w>8.[JKaT-eKKyw),ɥf^j沈ٗEʥ2f)-5R.-KݤKuR-2t)-5RZXJKͻԬK`9icKyl[aRT,2YLV.32.ӹܯkyoo|{`.q2:_e {]}|Xe]fe]&2;,2/e^eH[$FH)"X$]Fe$]Fe97$}Fg"i4iH[dO~FV"Hc$?GʔHE"G"Dv}xH7I$Gx8m##.ɷU܉woH%ۖ}[i9O,r:[8\8\0Xner}]r=\W,rur}܎yt9.qiq9.ɊZfXro_aeWV :X3V W [A+yml=YA+`Vb%G+JJ]RׯJ[Wڕ`^iku2v%.VgVi%^V.ZfYI+ͲR~FxGdcQf{-,Q::`%$Qp2_|h'n%dW9UUQpQ(7k[*`(XEM=JFE)wTԿsRa-M7Ѻ5ڷM4G9Ni$/-ǣ}oGH4DL4z{6.2-=M/z/?f<oѸhymhmhFF4^$ZG7ZE%'vxUUr`ͯ2nU<*\E*ܯ*7*\EU*WUnU0][ojwjXռ}ڷjڝWXM,\cejjqYVղ`5Vj|+k|[k{ko~^#9Gkd9FkqL_#ָFkkk|_ߚ%Zkv\ob]w-Lk-ֺ:8s::_u`[kͮzz\Z~_~7 ~7 ~7~7~7~~wM~7M7MIGl &9InnMt ߛM:aV٤#7A7ɨM|'6&w&Ioۛ{nvLq7fG7q̛\uf=Ymf^̧uf.͹ٌyv6t3n]ao7f3nvn}m]Yfn<r70ެ6o =o[̾ElI[d[tmsmߘ[`[eF[V[a[dʹo 8n-#c#b"FVh s3111x4F3ǘ911[btLybtL *F)FZ#c|,7}5oL3Cbu},c,ǚ?.c8&ϱtGgXXZ9c cuLl[l]5w|5{,cqX!vCXǺibvb}w6v[&d[.m'G|o8g8v#N+83qv8ӥq5vh'N8{8;85N-~Mg8`ܟݶUlV^*?{VYW[eVUmul[eVߋ[VZJ?[}lV*#ʅJ[{g+Mo5V}/[L[ͽ׶ڪ?unNVfmnmt]MnlIh|l3663msne6yɈmfF`m&i}l6|ovy>vlSݽ]Omv9]/mworx;d;nwluv|evm0NgypN`; lcn؎a[bYvo7vNu;xNwȭa;;ds;A;C%;x;N;Í;̾;;̾_ww0|f݉rbo|NNs;ͷSN;;N;ͳSt7=\;uN ۝anةvꆝ<vqvN++'p Fd.ۅ]v.2.3쒧m^w.I..o `wqlM?}nۿݭvyj7n=6vݲztloὛwݼon{ݲr7?1n߶nٷ'{G1ٰ}'{8졙=:p\أף=ze\؃=؃=8=|l1s5{{h|{dZ#+ȵ=b}Wi{ͽ3p/]ՙ{yw/^_^<'{Wq{il/s/˿{^^|Q{}ʿګn׎{x/nꮽً8kq.kt/}x؇}xg}}vه}z{}죝}V>/>}fGx`>G"<ߛlc>s3>~kg}}g}vuf\Cc)ލ/Gx=񰎇uHtL%$O2cJ$J6giai? _A8H'~<eAqЬA-C!=DˇzHna}{حtaz9aɇi=0r0^-S"SNR;E(E'VR܎)4B):=?)SdNMN9B)|6OY }"KSSb\WRS R̞B[)IM)J{)Rt (oKTyjTDR8SᜊTKL3vKKT\bLTX*_cSʩjTH|*RΩ0H*ϤRjTnT>JcT T=*SajT8i}Sj#?G(-ueGv/Q:G\:*(QwT5Qv׏2&MdO! ipHiNs[<̒f4ܧ5̑vTK;in4xə4ܥZ`! _i4͝Os[+Fh449cc31331>c:& 1:;FO.??;n<#1w-x>8.˒qt|ܾp\q=qqy\qםq9r6~;Em;?C]o;04 :?a0: \ \4}VN yGOt}q/O ٞ}ON^OI't ;!{OON 0 8eyx8>= v9)N$N]N$'eItNʠRޞr9i;i4{RIIx~'yo:礞h8E_)\2):v;NeNN͞S)Z:{O)[4tIUKt7MMt7y;~鴐N tNc:v:=;}'--.ᗮGtYJ Ntt7MtfK͖ky$^tNtZNgui;i>n8n: Ӳ4O4~O4OpWgܯg'gd g< {g<3:쌜<#; qqߞgܷgh ͝3p<yFug`zF1~;cȟ33tyg`{gh o3:[gA/t 8eHʠ  A0˰{ʐ2&v:(wf}3J eMd52`3Avpd g g g=CfQ{'~A+4a 9 eD鶳nq&Yy{geYxOgeYs;+ʇ4~֌geYwYY| geYY=΄o\˔ۙr;SdʴL:4{&d3ɣvTTɫ|iLe22Y0΂qe,ʲG=̟e,rdə,-Yvɂw,Y4N̲S=Y%-͢,,^Ȣ,e,]%Ɂs=gs4|oszN99X9;s9~s|w9Z<'9B;GelfR2ݔ-+D;%![?e7[d.[f7풭y#l7q6f2lfeo6}f˱l7s6f'9[?g-/EζG6Oe>]-aM;[gC]i;./6S6}d?޳eN6dldK6dlɖ2)[g+7}celfUlɖټ-'t l-Ӳy*stnˡ 94#r4G9 GsdBF縏s#sti.͑9z-9|ri-}#rܙ9r6Gȡɡ99*Gp͡㜖ozΡ\m#sdEoZ[(Ƿt/GZˡˡʡ:ȡ~9 9r!r)'rx1GTMQKHm &98qsp898qsp8ǹx[.^rq\60ͅc.ra \xʡ\X庳sy1W)N:W_\ʤ\9˧u#\˳,Wk. sy47sl~ȕSsuD.ʒ\-Wa.ry/r[|C pݖg<{^V얧trɓy&ώy˳[dzK= -'kG}ty'Klɣ<ݑG yvʳOLs!OɌ5߾ͷo>~,+<|||L>N>L$GC*|~ɧ|w[>qӃU[8^n||?v|B&eu>||7M>W~aɇc>0j̗|Oat6y8?/[ ϯz]^~yl?|{W L O/N//l / @r.xA]po_ r}.m_0_p3\Уpsdw./Ȭ rꂜ .]^?x/c( 2@f(g;n l(i()0W\A 覀n Qs 言 IRN {M dLa z-{dL)r@W^.0([o+y[,_!⯐' W VBSB*B] aS(W SByZBT!\ eO! }£ ej!, eP \C-Bix-GXHXG4YB8i =TW22MRhBڿPڿP>ꗋnH~Q^:"/e/ʐtxQ\{ѾEh׋r" \E7E<_E^EE]E"n/ʉnk<]E\Z}ѭtQO^݋f޹$K/q.%;\%]d%;]ro\u-pI_r\K뒹..K$.ɭKv{./DO`xIn]EtSE^$~/".QEdt;HN":*k-ESERDE+r":(znp[d"SDE-"^/"wez^ueex]˰l ˰.lLL~/pY^ .᲌ e,.ˁ2/2=\evl˰g/t~~ueھח2^t{nItP,NJ_lbZ(v㢘y']lb(vb[lb/K1\(4]lb\pL+b>.k*i<\bZ/v[˰bۯ T;} Ș+z^Ӯ+b+b+)]l*MTRwTl*RYP*K骔KRRY*3KU涫խy-rWU_Wi*-]*4s/ʝ4|WuUsU^Way^Wy\*{2ig;L^ɠ27ofx e2le:F̌er6>`\ƣe-ehLǔzxLɕ2Z(+eP>*2]SƗe*5e0-2Z)g>-Ce en2GtA2:*2{_x=ɡkpn嚼&k:̿fk|}vO_knk:隌G5&|k]Oz]_35fk8FM\kzyu3_ף}Nu>#u~n::_uοtmt]^u]Yu]^n:O\]ui:?\:/\nn}˲밸2:\uwuZ=uþ7xް ]qþ7d z7 A7߰ o x7 rþ7w7 {yo7p7 7 sޠfA7ݐO77{w7vCy7vo7'/i?4|yW?l?O\Ig?iO<)48IOsSO')t[՟'SwIʂ?eП|Mۿh/,/ x/xe޿h/7_2/_K/O_tI7yzo݄Ms7M}7i&oݛ{nꝛ&np)oMXM޼閿 nV 4yozM|Msn7vn7q}7Mכ4{ۿio-;Ϳ}-3˿io{kvsmyoXo8meێxo{-wſt}ʿep[mݞ˛ioG&GCc?8ZqS[c|G>vs#n-[pnio[[0[ln9o[[fo-~Kr{rߢ[e[z.d-ҟYzˬz xߺyyz^iދ^K7 y+uf/yI^w Umvn+yfWǫ===>y^O}Xo7ֳn~vz#^ws%g`~?ޭn=3.^W3z{{fY3&zftG/ sg-xXmS@/=GwT'^vx<{a;=<݁;ycg;yîwsLo-{c֣;b<{Awlvx4y^/C^GwpzG;!"oNO|ثN{Y;{g#.;}۞xwFx۝x3<<7u' Iwn=ỵ;|y+JCW-x/_-<k5?{<_go;y.s7ͻp;s^_w.~]pk7]+[0]˼j.k|:ɢr^dzwѴXnx7Cwˡxw?n;gt7lУv7m{4{l.wn;ӻw˻zwGwgxwˏ{d=`{c{hG&߃{z|u?G={<8Kv>h^ދ{r/ ݋{eսp߽滗^yuoGk^^^Wk{i^y{>߇N3}M=zN>u߽On'7}r>}݇})t߿'}g~wNː~~޺_O˴{0_o~z?=G=]Й4h|}<`L}W.x@_< od?@7t}ȟ0xδA;?Xӫ5hA m<(yAzP?M9;r GyQ:z.Q=J |TNmeVy/ϯeey/<ݗ[}YBy-ϷR_^oy:(/?Aycy7_y87[yEy/S^+ا}* v[+n_^h^h+qwSVQVл譂]++{_AUsUdW]+ +uE*x%7h%S*JrWJrmTJJPTޕ蠒;*Ṓ{:2VٕVnݨeue;T^+w*veHe`eR+;y*C*tY+樬W*2+ü2=V6WeHeS6+ÿ2}Vy̗Ne7eWv/V4Zw^TO{TqUKTѿUS^ VqKTS_U[nع ΪޯBUh WƨBU`QEVqcT*"ê . .*4[EUlUEVe*" * -VwwZU*ڹ;}ʪvj|Z.Ui*U5oU>jƪz*oU5[Ujf+ꊪ*ʤcU鯪kUq\֪ZUWqUvUZU\U\UV}RխPV] /P]] ] xUo5VӿYGl&WjtX \M'WjjYOj2Tjr&\fj8&UA5P :U}uW-Uƪz:-UKu;T7u3yûnvnvn毮ü:WCuW\i.˹fN?yQuNC^ݭ]㢺=j4Tnjȳ2 aQ?j5Z g|!j୆;Ԑq5ՠ2p5hkஆkؽa:jط}kȓ5UCא%5dx ]C~װ 9R5dH 8!Cjؿ !? >c8} 1y>s<<|cvLF<cr1}7c s<^{s&h?oq3>n~\.=7קq8?|W8-=n8~qy8<a8q9&ksMXքeMX֔5,#5ZOjkk·ۡ]j]M 4W5&k»]kYM8W5i &jYM~ [\jkٵOZxeZveZvE3PojɽZnWjԒZjO-y]jᷖeZZT=YK~rԒdE-;y-F%jΫ;|Ԓյp^KfԲK-<׶Cm\)T/6k6mצ>MsW[Ֆq^km4X[6[m\[ڸQetmSqPۍ[um\ں̫PkomPkۣܫMe_mBv?a'h '`Oȝ' ޟO'~ ' x='O' ?#O::;ԡ:_uh::\:4R>ȕ:4R&Cudk::t_G:n:8CudkPȘ:C:^w/ƃsZc:4_^ؿȌ:zܨ:p~:#l:𩃏:[KcuuQ]ߓuݣuy+?«N붩|n+3ꧺ9ʉ8WuVnu.W]T~u鶮. ±.嵺|VY]F]z[]Kuy.,4SWV9u]֥麼WQua]·.L´.ׅe]KuI]uVWԥݺTVuJ> '|$|˓0yOғ2I]yRV>I/OƓvzOʌ'iI]'I{ҼOIY=Hh߯'=ӗhGpTOwՓpR'pROG=|ԣz8's=S=YR]ϷG=B=Y^뙽{MדQ\V뙻m֣zXylö]/nϟ_io>ԇo}XV/A}S_׽uL}[|>՗qZ_Շy}קVMTOk_:Y}o2>nr5c;6cj`;]8l ୁ?5A 4K l^i W50h@S p@7 dl\5UW dPY`0i k ఁj@ ` `@w59 @7mih| qP7wCwHCP6# qܐnkC;7 P77ц8oH P6C:m(iC7]CZmtАjCא£!6 aP.4AChh4ѐ߆4 =Ӑʉ4А]C{6_Cy=n踑m$nFm$#~᷑]ṑ٥۩)Mh'#u#;4׍gpH5FmdFl#s7FnFnᦑnnF:kDOɹS4rc>şOSv{J<çݧr?etSz)7S{nO)9>EOȧdS{wS)~ɧh)\MOާӺi}/i]4> a4> ]OӧiZ{Z>#랱3MqC>#˟3r%-=ghzgu̳,/< 4y<7߳x{՟Y>C!gymxVV>KϚYo*¡T7M}Mה\o xn*ƦMqMdS6oSkߦr)6iMedS:mǦo)5MuzS;6wG:n&fiF=֌^fmp~ 7s4s6}3{7w34{37hM7I37fG3=L5E3   辙nofilכft݌ٿٿsr9{='W#9Z~s{9`9{Lϙ9~[9Zzd x\/Y{/ d pyac/._ \_f}"_G//ʫa"Ͻ(_/Ë0}QH/^iE}xIFۗ}_KtK^rd| /Ɉx%ܼD/ɈKr%K2%z}^ٗh%{ /%$^g  B т[ฅyZyZN ohA{-ނ[[ȹoK-觅kapksZZZإoar]Z}ZȻr2Zȹ~-BpCA l!WZy |w n!WZx lnix~^~]G^7ruX.^x}u~xlu^:_7q:}|+^V ߭J2w+֊_ZV8o%Zἕ}ZV8iV8hV=m%;[٫\oV dF+ҊZl+wa+~c+\V4JFr [p7X+JfpڊvZɎVxmZɐVmVmVmE_ípJfrY+mfi[ y\ހ<ސox|Cg!; ^}oȑ7:y~o}C  ^o7xo7tyo {gtɳoʚ7&7&t{i7M|o7M^}Sּ{oM{?oM&74MܽɿoM|xơt&ߒ#o[-=x o-ނ[4-ナӷ`{o~ oɴ3oK߂[ooɏ-|7[z-<\:-6 ymMo˻e0|߆۴6,߶۴mZ?56kxߝ>_t>p~_~}@ȋ?4_|@ȱ@|>:@|`t@$~@Ȝx&>C9!>.a!|;CC|eׇt!~?_, mex[A[=mݫmW[hKmu[hm-wm-uk[ummqmy{D[;me@[mܖĶfoKmT[~i۶r-ں!c[ɶ9jn߶n:-o-_[V{;g;ogvvlَ^;]ߎ|;|vWc;A;7h;߲tLឞnGk;=gpՎ&ٽkgvNss];`Ў,۵#h=]=۳=kڞ}˷^i=klo_{r]˖t؞G|^鰽۫=N˽.mlϻ؞۱۲=r{}^s{=޾&^Ʒwn|`z-wpu:ػ;ฃ;?wpuUЁ;pdl|vpu\@跃\꠫:س<:ృ:إ C;v0=wF`tTځ^;k\vWQfuݎȯXG{veqUGv!ܑ;|Ѯy# wݎ#v#;hGQt}QtgG|vӎӎ83:#vtWvsG:h׎n??Gf]9?ˏY?r~dΏL>2Gr#G[> Go}ߏ#\?|ӏ#?w?潏c1}| ic1?v'~wccvkv.|]]]  \3ȕ.0/ȗ.0"Wȕ.Evqtqu. }uWEw.EWt.--Ev. u.v"?ؿ.0.r v.]dhMЕڵ+ڵή<ڕ/ڱ+>گFW]ݫ]i+ڷ+w+]Օ.tW_WMW{vԕVꜮ]uOW L򧫝ⷫӮ37nx&wA7tG7\un4ͷN7:&wz7u[7tfwn놷nxFM?t_7u[7{uӡg79 ԍɌn.nnnv&ẛ.&Kn8&ٿ\Fdp7^[@7FhFO77`7B7ws7u进|Fh\FOh:?' }O?Op}?'DBOx?I^Oh}?۟K?O;v7Gw|vgw>n;>~Nٺˊ]u_q]vw鱻;㰻;ˮx߻;.ۯ;v4i;vkw{ww towvmw~>>.;nn{/; ywkwv0eZw7qw֝r\:;L?iO~>?)O|T} Oa]?|>OiSY?IS;|JSTjOSJS3{S~jO}Ӄo{lCom==dOӃG{ț|Co^xaf2YzYz;{gyC+==h9{=j=x{HO͞fitݓ.{µ~igޞzl)'{^O)'z%zHO\|O ۞z·'M>=y]z1z2'{ڥ']z|Oi^4ыz٣C/[Ћ>z^xgdg/yKr/h| z]/c/z^^:S^r\%{ɓ^֋wzN/x^Q/Q/I/7i/s/yKG4hn{zᷗ{|z]dR/؋wzˢ|6Mq[֋ߛ6{fomz0 r7,zXo[^}~[F:={qo=ЛzBo-+z۹-z۳{㿷\M[6tЛzBoǷFڇt:>C}B#OY]GF}pG}a{>x#௏ث>>౏y;>vf>^co\>~~~nȝ>ڻ//}[o8 8K}i/\_ +}_y_/}uJ_=wW>}}y/nʭ/M_k|ޗ/⺯ʾv2/ʫpN gM|_f>gL;3ZL~&>gxg>?gnLw}&>3gt~>~>g~,p\~|N>s9>w#~~t9}NCsf2s:F>749|ne9>s9.#Cn~r<'<' ɂ~Џ_~L٭]Uhۿ[,~roK?~]ᾟ\'٫o~~itx7wez/?=fn꯫?^?MI菗_O /~YY֟zOew>O;_?g;[OeZ:x돷mml_0z_ ܑ`1 ;| :O <=>/:lm=/oxa 04ȥ/t: a/_v_ȕ/t~ ~_/e_/t~ ~!?_ ~!;/ ߃_Ȏ/|!;BG| _g_ʁrht4@8䁁o @Z@w@ze M @^@hρn|1Юa:POԑݝig\ ݗ@mz  r A|/ԗ|%쿄|L%}[_u~C9y !7Cm ;D !c'!46wwZO!b!0&b!|4D79DF CP; Cc(} CuPXPPu呡*Kϡj֡ơ1ԬCP啡pJ#C;Cp>[N[zݰ0i|nNcy8j<l8 z8 ~=k8m pp.}8 p6LJ׆n}nlpy6m;ܮq5Oep~Kep96ep]5wY0-0 7Bp##2Bo#`3F0#`4Bzk-#w6BG#p=#9·;#vaaxoGsL6)Fl$4Hy6l#q7RH91#r9GGH4='G=FH=R7(](Q9JόrG0JvrO([{ F(;(=͗hF9Fy}Gm8mѴ6uh|h;hhhў͟hvq -FhKo4m;poѾFl;|4uhy:Zh-SGh|9Gdn11<85Fߍ12j -2 >c>c`2&cxp ͏M5F181|8c=.c| #xчcx1n1<܏3c?Fc?cxw 81:q<c1;2ca̿ˢ|<&X9=ci,Xy4ǺWX僱+XxXKc{}؁-X܏kk2z,X;;wX{XY5u,ݏSc;Vuˌ2֞c9sgqqnqfa>8qvǿp98Su8w8_8qyrjgq<}3q|qh;affɥqt=Ν0NsK8k8ߛ<he&DD'c̝(O&ʒt83QLh׉nӉnre"MtN6&$>$['I:fMrLI$K&coIDd$:dI7INr?LInIDnMInIpć0ILIIeM:IN$_&IvS&un'Ire'䮝$G'wMIt~':d}'w]'&d:v'{'{n'&d߮d t1Y&Ma2YN4?6b2oNdLd |8}Ld 7YMt1YMdO&ɴ>''ds'dY;6ud.a2|&ˤ2i2]LIÓy`:v 6_W+J~tWndWW_WdWJ|%w⇯x+{}>||e~epW+~[+~Wnt~)b)b)8b)BSw4EVN36)f):Wȝ)rg N1LсStz):EL>^b)i _N)go}_|mfξeײk3MG_p_k3K_վ'_ks}-K6rk~ ӯ~kna8m*OTMT:VSq9UVOS5TwT:_e* T2UOt=Sy}q{bi:ujG ST6UMr|*]LuGNzgcr*=OASa9>ש42UO:v*mOyST8Ozj*O{},it4ɀi#40MOipFd4=6fdivy^&4747p4}OOi441ɻiv:MO4MmdtOtnNKyw:N̳tk nxa:MwWMtt;NtOtNe6q=a٧t94ˡ47]&Owoz羟N y]ug:~7x} #7^o 17f&ot777t -}co179 _~CO79o7no q#|CGo~t ~Goplo-|#ȷo[~˻ʷr[V'Wobo-|Kߺ?ߚ[Pf޿5:[|w0v;7w;3~Gdww<ɹ;s|=wNn/~[;zN|p8^|o=}O{~{|~/f&^|C=\7ߛ{o,ޜ{ߞex=~~w?<~~?zw?6A`s?3wote/ry=0 >fj}zbOϠ8Ao3v\ri-4fu>:c̀ π ;̰ ; >a.!g z{t]gOfa !f <̐3 !fȉ3>3xqΐ3 >f ڞA36/O余4S^̤45av3}&f6馛 Ǚ0fLͬęv&΄L;3ybfgLwLL̈́LẌ́LwL̤Ù0fL;ϴLL98'fʑYYmngYY~农eY2dzeY2yj~ggx`Y|3|hs,eY8YnY<2]0&gc_4 b;qYx% gwΒ۳yggc>fNfgv-glZ4<]=yk6ClWl90[nΦٺvgllIa01-=[ΆlM߳qoul}5gb6}Ϧcl2d6fl7l͖q5[͖[s5?9c945g}Z99450GΡ9Wr=]0.sp9Wri=Ț9vc992g;tN'y3GG̱;̱98ˏGQGGXH?#G~Ǐ#(/ˏ4Ifߟ`$~OO<NO'tOI.W?' _?ɟh'?'s^|?'\o~?YNlq~ig ~g3ϲgwY. ?ןn43L?ˡ_EBȠ_/0,/Ȝ_ܗ/t ,~_x:1/_zf/rzŷ//t _h;N/_eU _zW=+~5ϯ:WXk_ͯ+_kOuG[W&_ͯWx*c~篲W3~sj.Oͅ\s5\sͅ\3ͥr`.坹k? sf.̅\7\7_fj.\\uu΅\5si|.oơF@f gw ,lx 0We\ ZY9@>-f0w<p3>o Gz'd|n+@m (eE @@: e9з~ Ni6P6%P%ށ8 I ?H m=_ m%i87v{;*G @5@ k ;зQ S x@qh@<^'{ͣyS<8OΓ=9O8hxs3|#q1Gs+e||d>|<̧vOk>ihܟonn44~= x;` : 2{?A 3Q   AD?A D3A |5H3ȜA|D+A/HL&G`A"oA=H_)W$oA8 O4 \P  Y Qп; }V34,C݃y)X`YL:(Xwy)4 `</n`7N.vj0f0ː`M0,,ۂ,#6@=}~i2؞4L`ߺ2!ؾ k qzBh(DOBܚ!bVB"B:D+D''!!OCxaf0087^a 0 0f0Fav p^}8n#xC7_ei8.y37F=eh8>ݑnpv .=N pNkuCop{i*\ք˘p܅}}eM}5m 6ܷJop^xo~#x""96##:&4BvE"#<7Z#N"E"UpF#v#tf#tf#<D;#pK"hw]"{-"/2"] o-.EhM.ҍpH.iɠEp`Eg~-EfZdE_dXn.?yh1b>Z,u1?-eb]X,cn_,bz\+Ŵve%_£K𷄎d^[%vYBcK`D6,YKm[%]b%[%v{ -%|D.%w).wi O.RZj4i-e)NR/KqߖRR;-KZKmYcKuR:ZSK6K^KR4ճRwKyg)R;,wRYL.2>ZYCloee<̎t2ZY&Keˆx]rp- f+pBmor~LXzm [7W 7V Yo+^VJO+JNVJwJ^wWVf_ XI++ᰒWЕrs\4+i{%]?Wk%ϕf[IS+RtkGPJF(2{{/ʷgVW|F5xY5n5^#o5/khl[k̿Fk{ wk찆Ț5X#Y^kd:[Cgkp->khk;h M}Ʒ5|i]|XkeZXkeZk͵Zky֚km-za-=ךm-M5Z.Zkw-ͯ5Zݵzmݯ3:]':XgursmsC:Xu2g[` YhxZ\Ghw|Y:ܯ'rl\gutt:#Lʹ^V66sM:il߄Mrc$7MnM7ɎM$7&Im&ٱ&|m:MIn}hhOlMo3lYmf9Wq36l^l͸۬_7ٌٌvڌtg i}7;6f;l6ffYlAqgfl2p=6aٷjB[̽[do-M=3o1^-n-rz"Z[dYŌ[`-4E?n-f OlEl[dv¯[9Em-fߢ{ mI[E&mC1|1WbP Nbx)bcPlKډ{w L[ bNormkܰ r|L ߝ2a[w'S;a^;k'LwN;ͻ_v<;ͼvw'䝝SOQ;ε{mywN4N>;fv%wc'줙fifi]tK]]]v.9 /ƻw춫E̹ ̹wsrLͰvn[7nw-w w˿8[f7|vr7|vnwwzm-wx7-nݲfv˚ݺa7/ aۜn ܻb7]nn{`Gfqq {̳}o=fك=٣k{{x{}^^ ^> p }{^}W.函ʽW^]^^ k߽|>g}l`O~+VOF>^'}^>Or*72 ^?r8e@;(^?/e@e܏O}#~_f~Y_Vw׳~~37CfK{"|euNqHsMo"O'A͓s|(ݠ(u"͔͕D}hDww"%K"921v3H#qNp;L8#:8p:`09p8 :?zh<[<9x]yh?p;@p{@np}8I&ɯ$'=I'<ɍd$X'$x'%$7s̓d\|%ɶ$'w;87pIO$ZNMIyx=ܙI$$zNAO$\$GOGݓs/'$Y$;'' ?LIC2vqldw%d2&˭dld8KdJd3ɲ;_HW2>ld,wy37)Yn%#ɾےݑɼLS28Y%K]񖌳dH[,:ă8;hv:hrA;quO=AA}wxoyAiz ̓NOŃv9xw MɃ:(k؃v;v;({!yz!{!;!7!!sHCv8_;Cx:c!;!?Dt!C8;Dx=dCxH.C4y{9gCuCz9=/0Ovoa{avR[*NR*SA*~ReB*]ʹT7oS횪gRZ*VS*S&~GxWGd}~Gs?GxL8b#2#ȷ#;b#|sx^G<G{##;9+Gy}D6#z8s>(ՙG~ԭqT5Q::(^(GqrG}Gy⨹QuGuQuYQeGqpGaGy䨎=cأ?Gov8f:v9Vc8FGpr1:&{9cr=1Yp-pLsc:F_xq>n||\?N?;NGq>GS݊{ܽx\q=ry8=U}Wq~|8Qeqq9.?|kAfx!KЯn?p5'h:a '|BpK Z?N=O͟='uO ߿'d {r:i|R֞=ix8 >i2$O4rR>9̓'i$n>I'{.NOI7I=I'uIs 'ax'u)o|ߜSSNN)>eSx:%/OS8:t)9eSts :NwOS9eSϧWO4͜vG4sZӾO˘|zZoi^=+ݮzi{i\&8Kg{Κ,=|zY?+?Ϛ,f,g^<ϲCg!Ye,2{hs:s8:s8:s|}79s윬=gsv?sqs9ܜs?s9{ h眝9|s>gsz8ϹUϹU9wi{"[f8MMٴ}ddv#ec=혍l{e'˖Wl[6=fP˦lփټ-Gy>{'͟C)휃=s4u9^q)r`cx;G+9ˡ3O9s&r&_rS>rpc>r{4#r`&r`KSz.4K?n\7|el;".|o |ͷCuB\7c>G>}8tO'߼0|sˠ|zȇoaz}s^ΟMwv}w۟yz=/+?/+o< {~ˊ:>=[8/3y=//y~yyΛ<]y?Oy^p\sA_p{>/./]0zA_]0\_0tA__ |ux^`{A_3_ /\z.O]3P]ZN/ȫإ2v(T`T} dU W @o@V hU@tP\ dq `^o2/@B-K! P⣐ tS-I-C! 餐 P^B@(B._!ڱ/(v,_ VhBڭ^4]BʷBRW TW THKtThBYr>rHhދsf.ʲ"]ߋHrQ^4E|wN.w{Q/^E3_ft7E^#i"..;LnK{ %Yr>n.ɓKvK\r#_ґxI_K񒮼/%9ɭ oxDd%y x.%>.K|t Vd%%^%]%K2.Kw.%sjV$+x_d">*[EܣEv+ҳE";᱈UsUDE*r_٩NE)K*"~+ _d"YQToEv)"z,K=xHHVo`{E+cE8-e]pY\e8,/|S^qwَee]e<]wtY_e>˺ⲽ.ee{]e~L|n/y/eZ+O<^ bs-+z2NjS b:*6G1ln1L~1b)b] b[<ۃaobs1>ŴQnbQ۠Wm1r1 yVi劎WpŮ+4sw\q]2W7^+JZ]Jo yɷJxO%v,Q /cJ]Jd[ ~JhDO]JhDN৔KyԭSR.S)U)/گv,WJyK <\J8)O:~Wϥv,[)]JuKn)_)aoRRJXKKtXRUR+O]*Kex)b)-b)JTgd}ʭtxW{ծWqxծW誮JWxޮ~*?_U]U~OWU_ՍWy*ȫnjtU^Uy s s soW}\孫uWʮvǫy.꣫ͫty7U]w7\٭L>̷XxLVadX.s&-2e.mep(y|ɖ2T&d]o2z.O`T2W2,{ /2k[<<}λګWa/Ǝ9͞~ }~ܿ.f_F~ ~|;k5|5{5rk5kkkkl=__ޯ=_ѷ_f_c~^f d7ȡoدoأoؗoQA|u|a@`'}aW@@_߰oo߰oX77777 { ~~~>7d7șoاooeE~~ }~=--t-t--:[tBߢ_E~,--[-goob|^}|[[-9~ .W~~~{CϿvϷ~=6߃<9g~'~|;r;;;dww;ا؛a|Ǽ/߁A!۾=<~/޾Gg~\}O߃9o}?~y=t=2{~{{={~{x{x{? #~`?? ~@Ȁo?[?`zZGp#t#GdڏGx<#?bG?_?bȺ~ny/?b BNBm'k =՟௟OM?! ~wN~O~~B'ĺ~~Ͽ_o?OWx0?`ys7N<9ȳyχ<?xQu!CGs'k#G?[~uGa_<s#Ͽ?#pG`\,Oϟ@{ۿ__-<3Ͽ__C<=p1E.t t .Gx[oy--喣<'yX-wy}pz< {|e<\rw<---Jt kšnaMyX--h~[Yǭѭ{x[a=>4v o[y۠ې!+o;xm<<~dmȨ۠bNwwA#ww:}s?~&Cw^cc#ö%%/a%KK_K/5~.%{K/_"; ~Y}<'w;;῝w'^d;Nxoyo'Nm% dv;vȓ;Nӝk'ɼv'xd'rp' 䌱3Nxg'|D /D&;E;᫝ŝÝNxk'v.t.h`t Bbͻ]Ȥ].d.mk>n؅^b]uk¾?킟v <.yBoBBwbX.ָb}X.l].xmrj킖w!wwa'>vA]KwC~~~~d~اC3ٓٓGng~38r~u?x܏ܿm78ލ,؍mFnww76nj7~w3Zndnln7s7nd7=9wяEnmv#v# v# v#wCȭK}7܍]ZvCww@{=>{!{{ַg/߃n: ?a{y{[ K=?{'{3W{=b2pzxcw{+   {=s@{{=ho|ۃ\a?{p@?<}v@~>>8x<~9rtsy||=z={=zy=<Ğy9=\wrz 2Ap AtABw"G rA࿘|x=z{9>d"{D<=<=<[!!C!{x=Ĺ!C?b!S{z!!!dC!tCؐ1B<_¹#G#|#GG#Go@? A>œaΏ aޏ0}>d>m=ڇL߇]cw؟}>jkv9j>ֲ5fڇ{ie}>ֵ܇.݇Ǟ7ac=}gaCc؋}}}>lG"O~}= < }> ]> M> M>Z.F|u? m>ʾ= O?=}y{{y((ߣQQhQQ(|(x=|x}yx?x x} } gccȐA'AA'!GccȓǠǠV8>?C<} } ?o?x  z ?<| =tky<~CF?Z8|~=|5<6OCCC珃DZ)G<??6g3عCc<q8t8<88sy{8{8{88{8rqdcȥ' ''''ؓ' `?`?@~>~ z~ h x x ~I~IhI~Ip$“|II$ dȃ''''']OO'd/ޞD<^> < ? o?ɺ#sogO#S[a?{=GW7#SûCȢ~d~d~d~j?؏ڏ: 퇆CC~hh?~~w?:v?s؏Lڏ=#SݧǧXSߧSSS)Ocb/Bf=Bn=~>B<_=OAOާ˧XS|)x))S)lWOO?O?OAOa=?ZB?> Źi7fOCO39= =}4{444t4ȝُᙧOc3< =< o? o? M<~<fO/Os}9>46iti4x~8=w9ȡ::s89@Ahx;:O|`g@7K~9Mp:k8gr9}\u5 | 63p | r < k}~|{p 333x xy }|u<0g33ȯgg3Ȫgg9G= > ΟnbS?e2gEb=|=? 枅eϢ\< = o= =? Į>̓Ax 4w8;oBo9dA |}=ȺσȄA x9~9ȞDxAAuyq<YAl ;\= k<[ѱボb"C ~r9h9~\?=}>ǚC&> |5?Ǿ>cM!gc1s9Σ1!ȩ7Cσ3 xS<Ȼ=2@6{fe[cW5t6ZkFkF֬c oY=f\#+؇kd~_##К@CkxfnX5ad .Ȓ5d͚׬y_C7k]f_Kk5g5;p`3m؏ a?6{xXziú6Ԇm ۰ kֵAo `so7ȝ am{oAn {'6نڠ6݆xcolSָAFn yڰֺamލmD?ȺFhmdF|DgΈ Y =#:ddoG0GsD.1#nF2kFxm#f#p #6Fp2be/#7" G2#Gp3B#4#~]>"G?#zuBMȑ =Nkb'wn't^'huV'0Ag 2!&vb' >!&4A:k&{b]}bmkXĚ&̄XO BNĚ&4 3 2uM ??&dȝzg3>fafg~fgz3x͌:gv3YynfYLə }Ȥ5nffl3{6ft5Y9Û3^أ;kA,< hA/\M-}A.yvj~07?΃[Л x[z <m^Bϼ^^'/A///K/1[/1+/A /!^ž} : xK%8z ]ttr%x%h%zK%%h%%%%!!lC!:_bCCz?BGBb#]C43!!d!t!{?mw=ubC!B7C!t!hpu!AX!xk=Z!#~eeee22s}e+exelWWW+++++WE _A&?}{{Z_a@WG@'@0WWW`=Ly| j,ܽ o^{N{ܽ M ^^oB "^wbx*t*z[U(B Wëë؁B^_^e_6yUUUhUݫUWwb㾊 }}5cFV06aa0k88Cˇa= Ma0gì0k93aȖa0t}>; M.CYa؋Ya06aaah020:̞fmᇡkkȤXkA3___cqy  {55x5x5k5lk߯aǿƾ^^c?_^^_Cz y 6kk5k!__c^c]!^y 13O?p'Ɵ?~ կ___AWW__aί_7ۯ#wwA>> ׏#8<^9A&G{Gl#s9n@+G#hx: 3wG##><ڏ G#GGБG#G#pYy8]_GXx4u[t>>.#s:sGكr?Mx: "w+G(88 B+GᕣȕQ}?ZGG͏QwQx(k: oeGYQqsO躣ΣQt(6QdQx(tv(k=.8 EFBsGؼGQdQ(Qpq9q< MGQc1|u ]31r ;tq Y| Y| F!A#ǐǐǠccc11t1d1h;x 999_C>w1v &aǠc;x<ccȔcx:^q;=.8cccȖc1x8<7C8k;?|r8#CG73 ǡqh86qhǡ8k:MpG8Mv:?Κ O"WOOO'ك䓬$:$z$$$|v99~> > ߝ~O{'ݓ螓$$r$9>N{'ὓI$:${x9r|y;88 = .NȈ4x << bػSتS)k;y2;8l<ߝbSv)vB&b X)lSȏSȏSSS#NASȏSȏS)xty ^bONNϧYiilӬ4vp=>nO+Os: N_ipq\fO4888>= }Yt=<xfݧٳӬ4{v{4|w]yz>\< ߝf}YiwO'ON#OË7ili445}~z}x.vݻ]wwYӻһwYǻwwYûȢwB_B_##ﲖwYǻwѫgeoe "{ϲY,v5eg٫YtY)gᑳYt^9=˚.? βgYYtYY,k> oβȪ,|,,u;˞egџgџg٫Yw<==qr=Stǟ2?oSOSkkkktFokhȑ__ßs9;o'ϡαCΡ9s9pvCo7琉9:1ssyܜc砋ssȕs92tqu~=.AS98;ϱs94|?qt:==ﱾS!scﱾ!+caS~z}~|_wcAA/1{==1z>x|Y>x|{\\G޽>>>sy>}h}>>s{}>8~=>}}#;G/GvއG6]{>>t\}o|=Ψ >>`> >@6>`?}{{|{4>Z>}=Ϟoy; ; g]<{<}[<L\`/س Ȯ ,y]s9!t!ԇٟٗ'G>D~}Ț>܇QrN!rCtChC!vڇȅu!>A/1 !>f>>y}|}||<1#x#x#|vGGG###??1w!>?>F>>>bM!>B}?|~Y#cǬc12cd鏡i3Ȗ-Yc>,\?fCc} ~?wÞ 7ea\ do8o 4YAu7o߰Ew"}}__D]d}YEx"k]F/ƋEh"s]_.GEx"r_7.7/EdE"x.g9;^Lu޾o\/.YEE"vEdEx""x~\d/B[.e/-oYoQEȂ߲ߢ~oᅤ_~3gX?9v~9spȍ?>sן?Y_o/54V %8K/5 O%r/ǿd]Wֿb+t_a+pW_3毡F5rꯑ}_C  ^/!/E.KK} q .1K%d%:޼y ޼ \bK%t%x22k w//!+/1K%r ھ]_G.!/<2| [8^_Y :'ة@ߟG >, ~ ZzO^ | k= 'h'O'ȗOߟ0O˟@70es:]F^FN^6/Ãe2r^fo.×2t_F]/eequ\fˬ2}\._٫˜O/Cceh2{ts24s5^ƹ:/>e>{?e>BGBG2O[BB3COϧۧOS<ȌOOȿOb ~lY))| \}|>'ǟ۟۟!>!>CV}o~곿\|~l 33~3gϰE?>?CO~m^A^M^aW)Wth sM^_W+ w޻+ l}^_WWE+u|]A^]p^^^tq+ {ڮ` \'yЙW| 2*2*t~9vMp _ίU*4}_Ŏ *}z BWcWͫؑWٻ蠫*8 wWؒWȢU*t}Z<~^E\E\7WѧWWW׮BSWѯW=W*~*<}s9{={yYǟßϙϙsϱ>g>GΞ}>G.~w`K~}0ϙϡϡٳٯ!C>?g>g>>~99<\cϮAX5uL^C]c=دkoدk{u35^ǯAא=k4{y z s_~wػkؤػk5d5xv565{x ھl]\p5~ >t q =r._ίAk} {4~}kk?_/////Xح_` }:`m_@_/X dG_ 羀w@|}~|ھ``_ o`_@_0///8'||>}]^goٷu:6ux:{vq޿ο̹]GV^G_G^^gYu:Ξ]߮_Yuwڮ{Yuv޻9:::r:w=_ίcCYuuluuz=گCYu_ކ.md6m̴ lC62dنm6nچmhj] ]mcnC[6 m?ȢmhnFnS6 -ncmçȫm6 mnïȭmmt6چf?mxyFmcGm#Ӷm6v6tކ׷qmN66\߆Ȁm~6is64 oC6t nC6t mCk64 lC#6{z\|欳- oCm|FmC ]M&v^dnG7Mp||w7Mpwg7Mpt|7MpqDd7u77YMx&k, ބWoŸ7ǛMx&ڌ&n˦%AsykT ޠΘաQPw(@^v?&9vjq41Ju^y Yt2V'j56Zʻ*;4\=F7ʉeo_< jy3401zkcLmT2a‘Zb(( E似Cc5SoyKִ,u~#PXi+w2WiQIW^P錌_ JU2aϕ c$T4֦oǤef9VT>Ƌ}'z{/#0qvo͂ _[oWk;ABX{`c]A} *J:?_)Q HPceKӍ @w'SIk]h FƵ}C}\rU?v-ʑ-wddZ֐T.6A\ETG-hc4-;/|7:\w Og̷y$?9*fz ųwaŢ\Eo uǦBu;6dTMLĪ7mŲpcd[ʾnoԓ!"ztUڬ 2& ]wsZ@EFz=w"K B]zy6Wc<&d-y-]fy;%*\[qZjͷd¬WF2[5JU;ԭW\RU5wX-e]cC,Vkϫa [ f9IP]u u' cP塵M|i}Q .YӺ2M4vC?ˮgd-{m>dt5ccs玵u5Wvv0rx"M|4؄&auSkjj7(!g[f` ]U/lLl[ȃ/Ɣ]:~6&k E ,zBa/۫R\R5zZU(@ՌT/@2-.Q-8ZJP"bzh34@[U LPǥʉ>mhϗNU\8iqӠ IrK#ꩯ᎔+PSԨqN2BW [̫hz|cJ 5TQ 3*ՃPuG~1JEnw閮ZN(RPd3Z )lԋqZ^'t 9y,rS#PJy56r$Kʉ%STFu(dmUw(@Vs]8 (YK1Jpskʝ *H{R`uB'LPQN^^l|^d⤜&$H;%v6,I(~PͤEVu զ*P6(9 HANX:;_v>HJg+FVƹ&}LL[+5-%f@ھ1n7u Na}hT@gI,Ώj,ɻ訇눃i!r*ARró-ѦbO_q/vѺ'G5@V`:I1g$_MLEoIzj[߲ªo{$6w8@ i|yЕ.J"Øu~j('\yHi]Ǯ^勞.7 /sZ}H[%H<,ygonZL:vtݐ5al}~ }Xt\)DshGF-6mTMPE-2rLRR9-.zq+rV'gUS5r.:ƖUL\O.y1o|rII7~]JjqřFAUZ 9zR~]:"vX]^x;KMj\ϵӽ՞`cvZPh|&3AhsxqkyhT% hKT)JzhTPtbĐʼn!@+to\Ź"sE,5 $~QPIdS*Jj,QI&_\knA/s%:&r&U<͹U JKL}5U3Gyj:A!;aօ yQ 5%"Y5Jk 6Rk3$H~`jl(ɺUpPͰ6Cė6~1{ri%Zb!](y P^R+8dkNj )g/r6,:ɽ6Q5ȧ11"c.(XA{֘o=+@kp=+F gyF\ڬML;Ҹ#Ij쐌bVcj +-Qx$4՘62)YIJ V]-Ic!ۯAJ~쭑]iqR%U_:rTC2Y*}[^5.AFUlgl=4۳5O ._= EzAEVoa! }qB碪}Q1:WYjEaXb_v~*c(ƠZ V)^"3HSmkkzH/!k5&!|-0.HaIk!:c'aZ썪21m붹fx%[ay;5557wH"&2j)邭EMOb+a5Jj8!@FaUQe\vʼn(+t4F; {Ŝ(vJ%TW[_l3r QFauV\J&*{ FU^.Ucju*%5 pBdjYXPD>R0ӪVD &ռQO*F`v truϵ;16+Gȩ.7C Mp`!'@YGݵZqb|V+(`aU3"N RV4yQaX/ك0SSir`&ַ\[kUm*TR-y61"[GYc]c5J,@Ni2&t~ܸbϦ}Ȩn|9ŵ֍Ķj4'HBA #N*{ՠ)B)RaNz YmH'Hi1U}a]C=JZwl1_5$~6@DF{jbnrtXezh V$Uf(?`Em4dLX%6&o͹V D4+4@'oZ5U~Qw A%XW=@* X9JwN+y]5VaCe @}t~$[&vW} d*I(\geWGL BtM8_+k,"=/J ҹ5;t^)>@Q83Sc($v e_rg/kfU@)@BLq*oƵmb4gAơߞy%DxaC&jEE{@DgkFeY}(CyMu%ɷdc zuw (u*RJU7{\Fǭ^1׈VB72QFt#*~k5[.UسȍѠZjUsr|,v.v!./VsŮE^2ZNs=Fgm\>xS'ȩի[$S{ЯyٲUij%gVy6+^"&;8Κo|(TJuN5Z yx[ ޒIzV*Qa&Y8#jQ[ -6S3+W7@F M5$@Q&PUG7Q1wh2Tm$@Sox]wx%{ k,Y|2*It sڛ'?/6AvP$e8ЮFD9ժTp*,n DUtq\M=2"~zȭ $Aƪ-Gʻ(j1/v ׇkjHA :QFuƇMkdL T"_NgN_t_p|L;Vjlu]\OWj}tl"[.D/Ƌi ̹[mZ5a%Փạk%;El$HXm(%M7Ջ-@Bamϖ\52_?[D_T E. inO2ة]]4׎P:5s5lx͇Q.٘&(vSW#[r!ִ|MkՇ8A&&Z%N/|JQ[t O7C'ڎ3 ZхA}<ۭZ##CnҷT&@N5Uktj9CC"A09JVLNW/NgᲒ $d;ݝWr6GysyV5&E#ǦbMLݣD]媶1gz5kx>zӟC,UUs ģ^yUrƋ$A:xZ|%چj(F\b cfea Mb y|ю슉lŠ\ACjx(7*Gyl)-@b>e4 &kb[O1awwm^ ž.%HBa1w,V[UQ O*@e}itVPGӘK|q~srZ#"hidsXlb,tYrvOI8OǶI#Rii`q "óEAr,5K2V_jop>osHbn~^5@DZf<Z*sͣruRPs7:1ZQTɤk\K?ik/Ƌ7m`gz5HG &77v P ʋh G ׮hkwH!rE=4BkpjZ!Ȳ}ڙ3 zL*ZsRa#e|{#ߪ96[IN#ƄUW1s cU]픓vz$eYE"SD;#Ϊ>(#GW]7e^|CcՏSm)2u!KAK!5E7;uvh2V=:PkC]ͭLX:'v ,]PTQ b嚣=A 9Ƿ'vNԼ0@Fb( >NwNjBTje̳5~Q),];]ms M^V 9Q&OyﶢR:t>Bu5kq|vМרsG+?( cɤm2,z]n4NMjxWcs+kb\W-6 QX) m2pO{yﺚ͓ R)F9ҩj K^NNM3] Xz:\5Ԉ{lb9m 1+ν[[[fƋ kT%:1v51"#`}TJW3)Z5M]0J*j!&-& *zi/ kU6{y6!>,m+I1_6k(QYakrs%Ҝ{کo Vѕ( u*D[q9cN#L;Vm3[s:z롁/e7jDv$~ ߬ RMC ju<{%5H;AƳ1@.n.jUtUUX9J^[} 2lMFV* G,57A&ryr>?v ۷֟H W4 Wc+ 1ڂЩ_f.vTEvfW{հ|t< vlՆ#@^..;ik- N\SǵpkX2rt0\NQ5O\?:d,* 2dǬ(Lv ˟ #q5M6sjJd. PAtT8*>>_+͐ߒ]MLdb=O2/羧J 2uޛJoEӗ.T;ǀw 9Zk׮ "Z+?/C 䄥&$HrBgή&t&H(o}E;NV?_,`AͶcXac(Zfh 5FH5$`#".@4[NbT0jύ)6HT͂DY>:EdZPL1kt:ķ/J5HTe7P֢ػvŨˮb(ݮE-ceK'Q])WuU8?F5@^vuQ/Q&9 龁]{|1 ژ276/֛w7?dy5"eֈyoy27iV,AZw%S`t4 668zSM65:eȵmBGdojuf[!ojHktNԦ+TJg n7>zkn-R@HWա jZN2A_ 'U*v+sb(O~ѽ$]3uphdǡ fتrT NVu\l$h62*HZd(ˎX8Ob0H%jZ(}7@L8[)3B3U QZ5Uc͕*' _lLr*Jp7FytfC+5Jj +~:r4DT/SlhcՉ(gvx8'9׃V'y50aZu6bAL%}Q᪥2EY*;\=JgȘhZΊ|vL'VTOb5zƂƨF- ՍZW2GV% J-5^T2JƼ\AKmh;0E T£6Qt T/_JN76T:/שt'^*1JwXQ^y\rBS^A -5mκl PW 哴Ε;O׍zִ%r})Nj A{5oI~M^%(OU>ڴ .R9SL_ɿIh$ӤNj/I 2svrgIaj|2(N1oǝj MO0d4YadplR, jEuB ^44r3rۣrYbfTM؈hԡTob3J Cˌ qC+HUnm=7ҔZ%G9lEc-.Ƕh mcͯMLTGP?6p|5+%fcThtXq{ƋZPI5FEC^-Eɠ2q j[J]-gv/6&!$BTQ%@ PoF;}oZ'pDɢ+jK HP /[܉Q5lE U˨1r:c1) G)iV3+@r3lT:[MԖy-NgokMHOWfG(jHUW39A^Pz >dQ#b5Aqnsj[ W容5q|dLզUexFU @ rI\EM$Z6(@eb hQ4׿Wl)(>@m{WN -hSSQbBw3[/:P=p ; >oLXB >~j(Ρծ@ЖN1ӵ|Czmo=@LU-vD9uFK==mt=I"F5@ groXIn|T׸*Ȗet5R#UAcM :8wR!j\FT޷5L䝉$ʩUqVZBbA25e2v R [~A1U`0^qřgq2HIUVZR\-`ƼE<䄨UWŨƷ<V}($ANZT:@!P68s⻹EUFz{9JF.ĥWS@k*&Hǭy/G9NI-(#Z5&5yQUS"cwȒC P" 5eZF ,MڑsTC/¶]/MŅbFrwKüu[$W+UE{ƼPjhd5lœ sm b _\lArՒ;@ƄK SRdU56z 1ʳW Iʌ2 ҤFGµ͂6 Ժl5v{U]~WiiAvb 2Kc\'fx i@/փ (&Fu+Tur=;o"#\4 $ ozxZ$5'6A\y;toIԓs~EF<1aV>>,6z_VUDcW͂T$SkL 2JREg<1amU#-3,*tJQV틊( ݫAU=uZk;t^&Ap[F0}KF~1ҥ>?2M(sYF ,%BL̀F3rk[&.fTg~R5F k!*ӑ*|  U{%,#t6}U`MtYy\"RymA5R)F)EƄH]3+KE/J|QLJzcߒRנ,Xlw ֎2Wj]pۂdrF$1{3bWwY SZ8Aζ_,V5V_LT} MN]+CU2EU43@I4伏Y9WwqTݢ8nqNlpaA"ߚћ FuNs@ 0fiQw-BAU;6YzR5|țZuP .1 -8yq󲱰q9k5w+AI_t\b}N] DdűëiIRޮ?&HT?~Q5Ie4M4.U"*\mK]޵1[9sc %YJ@C׼]sEennۯOqs+M2]j8dxh_q5J;jwY Gw 7*D+iԠ I{_ y[)2j ӄF_,ZմU "WR>M9vߪbsGG tWԼh wQĚ T1 %fU-7RBGoלꨥrq()i'1J'b{RM%F50aϓӦ9E-:VA9 kV嗚oYph:Idb9au_K$BQnI>ٍ:215P諙Zu!$MZ!AQ*HKEaxZec:hU="ЮZ#@6'EkPI cR>AƽZ#AEr/ oG bR /} /EWFh$*9(ѽz?HU\׺w,E0XRQ0O"T)P/ X3cF7Z,t]7 N&JL9>,>wxiAK"~}]+LFwd&nU7V4e|ڃeNV W]EM;Ec&$WKDirTEO k۫Z1l2 n墚Cp3T|uJP[:I/iqL XFaYˮJR(li"ࠢ4RfT#ܴZ)g\dhV;chZ]5\@:@iPd|F2RgD&=ڷyܪR]먾X>WX j=l hm7XFrUMJPL$#^>C*V`Q Y7 Wy5 R+z@;Ӳ5-5*!T"Ӊ9YYZ@)Q. ƂhX0ը*>Aot~QSJ QY1[cBu-FJو2 =L*ᠪ Q RnX`ځ,ltv_}[Ftk;E=/*.օM5YJʔUf;Z >oX !%[9Z {*jQےAޕlKQ^PiX|5%AGjvJ7l!OGVy^ZUשfhO:ywքWwU aU=z*c{I3m_kveQ-IQ:zR91ƋrlRt(ӄp~ &˶ZC kfʉRR«j~jM|x1˶1?ύ+Iʳmقox'bk8nɷ՘Jf upbZe:A„TSm !r Zv)@ ّnxU!oVm9Pz QdzjbEKy]-ll$mgJ|ȷޝdo^L9('ZL7\*5}}kT'qՠTs#ͬu`y6UR`:A9*0 smN'ֵo hCY<1VB1rd镝s)KEi~'/ed[k C,/6Ttt*Ml?bJGUh@] LjT &@*:Wvf*U9@J7Hע +ȳ, ϾJyH މ53@5 E g_5&@z钲JMe]TpS"w`6N:(6p~XmM-9,Un$TΦfoD&F$JMC2U}Ti,Uٵ Gr,Abs ȸmTF|]c7-WMtIPvXKd`q۠|WBr=ԥ(>U# X&ȷH:,' uEElZN RN X1%H `_wcWX}$e[SPk eD"2z~TU"]p}KY9dtɸ>:\jAU9AMa;ŪU3^ߪ"msr㾳o4L-uGGf} ;Y CgکE$ǜ]vtFڵnG$Y{53vN69ˍ5>=D|^Wj+=z 7^lrRUZ.+:w>-$ێn>\+%kjmc$|lLioyW(\nv帹dƋFasj)C7{k41<*E5Y;B5o' Y5<[\lkk\ ugWkXTs蕿U+0]sv철!q˹PƍCeLV H_UHkv/-"=ʔ#"m^^~9DUKϧo[qo$*~v5lߑ%S>u{5#r{,ƨ/ yj%"j^2?d F'Ȕc\Ug%j#RQ ϾDgߐ9jY)o eԘ]sU l׹(TPѶWljD$ s=hv?ucjNFK!n2;scuLv]|he-k2;y E h,f$&LL>xvkj_nrT%bbRn(6ddъk_RTpc}rbɉSM̍drbYS gzh;5.gkSY5JZͩZX)W[_l*MV&4 ȤJxQĤ(m~[$m!%bIN;IS}#"dڢCt^vW/ϦFԹOݝ K j|^vR䤜& jY5y֫e|KwT|›nm&ĩɩ;.J39g9? 2HeujHENJW@K ϙ0ja`өf#(oC?Fy|[^εB/Ok?9cirT3jb"A(oy*еq~T%O?IH%)G\y`zה [ϛ-F9 *O% #6AG٫bW@T];|ϛEky"ѻ G/2VU[۞>9aerOo9f/3 ƌYR`V=yJȩzr]ĩH*娴HpUH.G66΀n~˸WƾƦj&H ӗW$AZ;LmIZڭ%AqhL5ɰmeLgh(X5_luYȇy %$}zL||ň '܅aj Ej\e`Z5ƊjM.q䊉Mn5T%񋞽/$N*jR:arPsT[^}jհjRm RIUcbOR17 #Q((xͩfH:jYCX/cj&5nܗreF ni䦝 Nn:ĶOMu69mnQ1P6SH{q>eOܑ b RWc^~>!#b=/\]nRnMjLLҔ5_!:&7@y}kH|X5*ilTp[FWϵMl͠[9arBT"{|ez0Yݟ75FA^R[LO5;2uX:>Rǀ1 2&#ѻ]۪2!4 [qmT;@bc1--v4.v4.h];W%.բ1@N|ȨDZz>&C-yp СƯBÇF-{L1j26/Le󩆘' u uOQ^P=? dETظmܞv95HIzFf}9M Nj׊4}z<]\cTq?G +{ jî9 V-YYT\䪩qi\#@jЪ`Mη\59kV Y#@IeՑ/rV>d}uJo }Z|=02nd~#AՉwLRηH" ZYJ \Z _ZI] (w1f}Cq)-=&w 1dm8]Ke8=iy3_7/j)4/oOQhva@u$Ovb豚>YwإEҖ([kPh\@^v 0G[/CcEΩn̠љA2"n-cDFZ$W;s$Hj)E#G(Sq5J r p0"k_n8c큓 э9FgW>ZR̍p=яN>2eDc)foGs^SG(gjZSD2eb9-]80 ;2V;9 K&HC04eGhGP-ȘfƋV宽6E )Xax5G]2r@[в֫ӬP0rRk=E*"^1/I[ 訍-bG9|Kh::qApW\&Yo5eRW׫z C5W$AƄII]< :!):oFgo75ltBuU: t=L9vLХqٛCZG'a53UQcMӯSyތikpZ\ Mb]v6m1+p?@ؘ֦ept.ͤTym3Q]LiK , o|kS@hKwn߰-4ݶĬ!m!:7jY˔zGj|K7(96VFΪ7y'!My'ŷꦵM_L,m~5처UΨfOtPWI>5*~>(_\fD ʥLz(rU&H]{_ԗ2vHrB/TW'AHIPTrLt 8wiofBm3P S+QZPQzHu&fH/jLͤZ j2aZ+,BT"fC*%D֌5*%S_eiU{-ģ##I(^9@p6b G GE׎hTQYjd^;@bhZ|(~QK\x9I6H"W8-@ +'Uu$k(A*<]%1zUu= ˙zB"58UU*"f\|lbpG`k[m v0MKzW"앟׵XB>ȈvCWUvZr.A񵾻 'X+h oZ \a:WW1/˺4RU$mT*CXƋrU@dX5%8 mԽs=F@gr WPŊ©uqrYںZjy**Zar.x͒L*By]eZ| rS!]R6Wz5Lr*.y⠽Z+ANxlUpp]5ܳmi▐*KվB!k|t_:粕ںV}Z&_o N28* {}tkLҐ_fsԞ }Te,\GMD[r7Z{.[ۋFaZ+'FyMWbjtA鋭R[%HbqT1AƗOS$:P1 y PtP ^:J_ uSՐyԐyUՐyՓt<{;I=A" ev56*AZrw5*A OU%OI#eW;;&HΎ3 UrqۣïGrf6:{t蔵|F{75 eeXXzbMp!v!v!v|QSX(UzEn5V_sȡï n)}^\oVXx*r9Rah׮Umv/@j] Twr]UG7ڌ/GUkEƑpvMgRM1g<{;2ԣ| G\NԤԌr3Yةl1J.@BF>>>"9?@ y1VR<sߪR٠Mrε\hD=uQ@mUZ%d#/z;䃙]n|ys k HXUa@ 9#zZ*eVFcJE-%/z m?feD55AQb)Fk䆆i&UB  Z2!g%2J-e[H!Ȩ_xz ާu+E*(c# cc$@UUZ,A\SiU (e.bjVN?UӲvsu:Gyj55F)j=$fU &EG9 }wI wbdV| B5Z\K?Bȉ;jYXՃzNU(?fƷvs;% dN49>*,@՛>J9j*v ]fnd_`y>R- ߭-&`vEy^.fV2$j.ym՘ Nm`WwU"-ckk+:q=}u jleKTGVk+Dp@~絵|((aVCjj #Ǟ4=C \\3 K}uuwG4 R *UpyTc#@vHIo(.mv7aΠB*[ _FvY7}ҭfw$DVTZl*.VmcmڕKjmedlk6.A" ޾ s*|& U0Y[~$[R5>oZ]DykJאk_}Sou0/yN<ՌHU>+cGu!t_>QJcQO٥وjMfB*儚G5F !5'B V,#3LÛ^e-yjg6jXۍ\;"JH0X4Ԅ5>R 5XX䎂^nannpH`Aw1 u^)eɯ| %(xHP#ûm-Z2о>\FrdZN'iA%-F>_\g5ƋJM(ctR/JQ U)eX0J*%_Rs#Ro~yO&cQEG k|tn(tz# u\ԨBVI(TQ=TZ+AZz+& OªEUW ^ P;>W7EcBxWbTk^vU1[dJuC%FNy뚫oĕ]9 [ŷ?鳮m Ʒ' !ފ$HU/JI8:zƋҢNb4+)ZUzjC%Sj8l kR؈*L/zD&D@0ԋG85>deivdfxkZ(?1FT)4@^Vhԁ%AE8)>_N7#GUm5շ"wPy;@iCC(XE?܃mNj u T}ktC$R<5 TUBYf׵g>P%\{gٱB/ZTx:QӠF}ؠ FQ~3AL͵o`$jyB2s#% UO8}wvYUc!=J7ʵK͛ Pdu\3☄ k¸i]VԘ!8L6k_a;՚hZpyS@mN'Ӣ_䌨Q  2L*Lje ^F y`&Mgb;:ՠ5Fy3&smjJwr,y`3&ߊL6դ /ٰjI2{6yOBeѐ„rbUEڠaPhy:t&MSMkyOa/Ჸ"Hn*ؕE}* FN2\WqrT8&r7ldQez\,TsL@2W5P(jF)ҕZ62ɔ] 936 Z7JN|7 o &uR31J'5. >iƷD.q59gr.3I>@Z$NV$@4^Ղ\)bt'BN.ᱲ6Ht5oK0VkxQ^u Ѫ'9RKt`mղ.Fy(hq7n.&a"pȷjηՉ&'WMjk ]OiSbeu/KaਔYFSX*X}7@}V]a.OT&9e 8U22/rRt{kɅw7Ks=bBǣnO az/s:rI EGM oLd$|QHXG[;WT$}(R1F  _5-u4f#eML.]|:5HKTܰޅЗOC5cz(_[謰U1a|YI*FyUTƋ&;IF{DF{WFR*vLo2r\a,ꪋ˭vummؠB_:l^)~i %k_ rH; >S,rڭ ?U¦dޮk'L5/G5UEک(㐧Ph@RsL55j#ykQG9Q~Sc9&r]ryW:vPQ^KԿ6Fk/sGw/0Q4򷫚 Z#/`q7wothjP @k[NjM[9kŒMVNv{sm'2g]DGgei* JgU|M{c 7vʀI&t]׭U5uϋW4 ;'gN=dXުbIZ [Þy5w [#hh404m폮J^&C稧AU$&N&A&fj ̠x *rrTco9ܠ{z`:G {, 7*Ɠ#շ9Ԋ:EǷWl2 РI@YY^2R]:pUsOdD[;crj& [ É Tu颖 ϾAo$唔h8r2ɩayrT,P߸YtF䬿u%& ~}S&*$Ëfp՘IRjE_6jR{[JF̆ޮC{ur{eI \jqSlgm=.Nmu422,Qܹ}r~.kIt?9j@@ɇjN]X0Cni; &c?~lq6cyQ|} .IeeA[U١MYo0{%vcڪu|X7}p%ڨoxkjOmVCވ^ժV9QFa Äk59[ 9Wo\Nmmԟ/nZ%N+\NN&;5dw+^|sGə3g9Vmc^^:s2ty8(9dHUQ54QiQ P[G{; ꏎ]u٪jv~KB+WVq@~QVCT>W FVj4z@w V4;Avw0ƷL,;ջ pK+99 sr$̈wPb#ڪu-!BHؚHYg>UOVqJh?T=&!#p] jxP- \-ژ4F*2rr%Nn0;U7C:j A*qޮSU z"Ĝ? aq©&NfkFVM n_jr>TuGl|K*aTEGc5↪]t n峻98byW4 rzV Rkc ::tt&L w;ڣ;VoJL^.1>ڈ-0zNPF 5I5C5AyGU9z|F"5F|eTdk0Xt"Ɏne7˭FZ1Va gY?:\_t{<]7Zt<蠄iK->-a-E9jqRo2UR-rTʵZ e>mpcmnosj-|ڣ;:6}Hҡltϳ68KP%jhLΛk\^VD+ AFed鮚cbEaGѭ=;S\)at =@ZcMLrG>50G5~QToEBmVHSUbJ<:=iH!&a!Q21SZ+$$a֍莀Ue+{3A4mm"Oޭ•em- QT ꆖdeدjYXqZ7,j'aB4@DNPc/]k6̳k|p%3Jy^>;dAY?ֳUN\#KVBmc)6;Ҍ28șˠ):QqWFr;B- Zd,,Uo蚃 b-Fbcm7>wM'5~Ѵ­(dUfF)F$ S -;Y]`v\kȥ;u54_T]St?hIKoUZ!R\"RvP뉦wŕ/LYdDk ѵ % j WI ~53;h¾Ⱦ&׹nsF%T0GIcۨn(9. A_6cn̏[lmXai@ mYtEGWԝ$ȳI9 us=־[ Lusr@}L]p[ۙV ~' 5(Aƚ? ;f$HwOظkj4kPU<{_4nOkyq脨hZ:A Gk+ywdktw}FolIݝkt9 }wrKU<{EN\56>QHc<{+V'WNU1ESa8) :mNsѽFsԝѩ;e[,; /8cMua2:ftK_{[([jwU&^vJV**nU[稂8@AA+0^Uͽ/*5JZ2qLOStDt} \FŌ צilKQDTu!FU+@^v j|KRuU&!@^cu3Lrd'Mj=FqΈ5)镼G(c'bT#4TӜ or&^^RcTEKG3VK!@!Q;N1D^r5ܵHgQՃ}Qҽ{(:\*;`up +ɺ$HE>btq+^Nֵud]*Ki@DpĂC/Fr\{Vӷ}$@Zݜ2bV#\xj.r憎[}-\FB'Ms b2^@fzMUG2Zgyj&F5@^vGȻmY㐣(XUZUXG8}0Yػ|1JeJbχ2yjdLX3+L1j'&HED!Y/JNkL*7%wo/V'bu;5%|MjZ7N0 Ͼ]]jtݨQ_T<:Gy۽ZȿX`1 -HMϫP$ v'OLh5,z1{en$5@Xc˪> C_CD׎T.^mLԏoIԳ{TJ'PYo{] 2Pl6C~K{+QaI==r t likݜiqqmaᮜ2@u1fif9ʘP\(QtKV֑Fy&V=8ytʬq 8ePr=Rf˖MOobu[3&^$H~Z&dmsYJk5>AҍThrgoմkUK'H2Xڮ.&I3 ZCj#_۵@f$9RqRC 7CFMxW_ԘŐ4@>fi6@ANvT3~ѩ;l5rErx %ʢult+?@f{׊A$sLCvz5`n<.NBJbԣc ^,%HujT>5(O*t-]SW 퐺(B|8]pP5jߒS5 vPK]'HUjDv$U*6@|59%I^ (Z_l)"eG3pz5'6U$$8Fb2PHu=LPcFC- QuC9Qkl\jrR<Q 'J F+'XبZ!C0t!QSqH_ɅS-I YKJq$og՚M"`O u A$6m'F5XP9y;[if r~G;Cs\S1Tϴpc{h੝] kQ]X˻&-cqC&o;jAed]j_h`0ZQ>TW7SyJ הihZsUR{hrNY_ N׼QTIݦ[bzhrZ}W§`/MvLZH%H˞TksTgzSuX<& _L4ʈ(D5.V:[ k"`LJILr—#x֏+JыӦFJue"lO:jݶs$EQ[()3R[^kPm /FԘ en%2t׵o`+0ZV K'U Qy_b WM~v[=dmsGj*йM# :6KQNYkb[Ɨ3:#_l|^bmw^+H>04k>_h&ljL$gQyٖI ӪV 9V*ߒߤƒƋ^P @(,|h܁7૙^DKHRdm'HzN]JK՜;tl..ݿvcg3S@~Ecmlީp~D*l m{)@UMKTZ9HоFC=՚ Bi/z٭Ix5W7]57[XA(j! M26#LJ~eŷ q\m ]~M NPcެer ɯebjc&((\LC#YhUc4iV.S5FbF#⿑UsdFœ6 NPaPW˔K#髞n|9jvN(48npZ\jհjkd"ѽL&͟4 Ie=#G:mpP-9:5 :8tM4U*-j4٣ Ή WPY~ߡf&ȑjo';`* #lDZ%msKQ.Ag]vd 2 ie4U=^l|2GՕLC WOF-2ՠ E_e2ʓKlg~p4Vܼ_j[1q)gZB2jܧBH 5vѝ;U7AoRp UrjTA ]W{bU| j|3Խ N'h]ҹF2RQV\)le+h&FDAvQetvFt7MO4AJP%$A55Xb2-;UIs@eՊ=1Y|1t:8up]K-䗣L ) MIgiATE>oa1AU(̵QJl &-~ ѹ3ƇWw½҇/z>9@~p:ɹ[SJPET-œ /Q-\y7 lٖSQ95#tnXDc%P̩9JWkۅ.C*MNjnMK5ĽrEVZ5A)/C"+WT jҲ:7O`PB>jc?:^:#dRW\븙9Ԕ'伩?硡41V\l86$NtaUw!1U-ArVTUvƋu&~j\䳚*+d>Kf: B$MT@5=,>\69 QfdGD.z 5@'_5L!#fR!ewj6?&_Q2 ۾jB| &9'GU{ +n+#G_} X/z3OG$UPcm z rZd"TQP65%2_y:Y@^.]I&o4kJ\4e\dA6rlϣ:FıdAw:9J2҄Q`Lr씏Ut mW=F].61a v:œg7\q$Hpk˾mv5?AQ*ۉa:娳 ) 0Z 2 pq/cm4&\"YtHnLB^.3*=ӪQICzxR!?'}Bj7R[ƌwWikÛZ`dGn3͸mBZ] @Ji$HKF(@}WQE9G5^,XS/%,}V\5 oF99`rSm$BYhzq]sV\cMF M9?&Hej,F e)FH[FbqjԀA_.]Cb5^IoU¦O'jS@qV,V( {B!E*j:ڵ9Xp 2׺\ArSu8֬,`p4V 2? ȬskcMPcNVӡƋ*1.EzbM*h5w|J+pD f N(?n4s_R0r"/G'ʏ5Q>n2t uxj|Ѿ!'9tt 9AV5k9}0v~hI UwdL^;Y{R')1J!N5*8>o}[c| 5_>H786]:kWQ/ȷ-+v8_PRW &@~Q^@pu K(\4~QAsSHqTcõy$C;Ŝh*F&hƠƷ$ jۥpcYQl|jyo{ccޅZ9A2jz$M\PvM[("h(7ֺd ~RFb+EN3ycg ͂Z|/A&چ^$SXourώl{76VF&$68Q~po| ؁ࢦT(#h˨$̵d20_ZF^c(ɨ,\@5+y[XCcuFL^,< utԱcM6p.eR1/9kXq Z ૬Z$*2|MB*z]nMmu,; -ddBvս(yL /jr <ЅKr6v NKrN?tڂqXs÷msQCƗMkrXc wkݻ9(|&Gc5f/a?+y-ߓ\6ΧL_EU&Hqf6&Hg>_\}\H7TU#ٮs>]>,ɱ2&,\^c LU5_(4/W.+}-뵂C 蚫eٹu2uJ2$7bFRGv}TdRHY [7A6untmz'qzd)>+e.տky,eYXC}V^7\<\s\.8y_9MFT:(FUc^! ~n; ^e ša9:%rtJ䨔n*"s>ήBYǭ58p ]t$`UN䷺>~5m\vǍ7 yKlpUmX|Tڵe6.qJ|F9U|)tS"GD5%2A t~4Z{:)gS}&Nb2/}荒цAB6nL׸I鎵WaLTT^s2;jMpVJMLd]@йu|<֍s6bQ.#wE7v=Moj}̰V.M-st-" qOz"Dq<'avϦIH(eB rgשr j7E^ |·r*mgS$H&ۃ&ȷ:6rTc&ӀD&C ][^ᦞTD *͵/]VDoHјA{.#`N9)49o6.A&$d6joqGZ6N۸7/ʧU9xo$tŶqF}V/78xMMNPWэK*ʊO˳~6@:DynxNbnDjQ6Wl75>A Df7R$l)IA/\iGngqyg9/ToT\ħITwܸK&We%7%q/I@f=9s#@/pHmшŗvT# Z$;(P >J8fr(i3_Q3wl\=-/U;+++32" #I +KlOBTHH T@ o+_טe{B<[ɷV>c&9V+1 -_,{YweqZWS<[ }lAcg/T:>\<)S;>\Y!zO >%yRᗉD+sWA5dt~@ddܑd}Tù1 {m2.]!{8@V!ՐqKw%UJSC^ h@邗tkp)u\Y L➇n ly<=3 Y'8ooYC6+ }!rJ_IZY a! Q/Dv7pA~C:.ͨƎ5)T|F-T8j&쏏OV~isOnC8̲`4ܞÒ 4+i Ėh4#V {jgaBϵN^.Hn0^>NQxY烉!JBTC>TkPp:V`{ U^rb>iouVɦVF b3cCH .Cu'͞VPnE@5U*[}Se#~7 %z%bUfq.XZ<,2 2C/3*GYjlPd*CKr==}{'f !?4fFWkȢ>W2A&!/z&?hB¥=ZM [YWՖ9:]ϺhB,B2y+c*B5ǚJP5Zs}.);WM2bDӆ;.2/WM+-ڝ$,+!dkH]8]ҒڵfBغW.0U7}8M_PoN7vl[G~!?$VׁMm1|\&Vk('\h"kH_LpkX҆&mwʍJs!GҩԽƩ5%|IԾ*C,E!&B=F`FRqgDmğs7$54w%-lr]r. w^xIG7/i܏TW4 ٮWr{g9 /,oCY|F7l/j[*s`FAeա s_V9e,%ؐoK{|!#?9+{Ru{BF+I9 {6a! sԐ.oĜjQMMBOp=K TX_ε+B 2` _*/i@GGnZ*,E_CHE 9}-aI uԇ~1һ^\z>He`.kfC 뽔4_6AQɲ ܲ*9yBuڮAWCsc3A}b i]ZԊ%#n!`*fʇ^@ۑlnJUJW*sLn -+a.m;I?WVyqvtx뼡o2@9'kl{W'Bםg'嫽jw "Ur+w^Yy}}L-rJG}[{`PГ`/Zq"٫!'>[;VVrC*MG O",i{ ]BjLI7Dnѕ;c]=ɔ*eOSf_藆6T:DnW>ȇV=帴ȇEB[Qe_W1*&"؄j믝xdPSpߣ;]MBgqEP8 Y^02JsZ&5tԙ\뤐v &IvZߩ[Аs?kC+s}K'CkClV 9Q|Cz H<.ȗ6ޙ[ULw+'ܝ;rVבl+Ћ˺LWo9am3 u+PzU}Sf=fܪ!f2ΗzͨGB$Ro"C]hޖ6uru+y, dR5'Cݲ@nO|'G $TYʢZɲ""ʊ}/X BRwJ/VdɑZMť9LL e~lyhiV b4eҊoiŷ?+ݒ|LjVv"gg (_ aB!S脍X@ zHϸIg{ {ԧ`ۊe%GAChDtN_ZCxe-VA /` "w*q+;Y }aVx+S£[g.̧^ǭ^a~ʁd ^ KBރGVlET%;56J:x]hn] ¨BPPyD?*"rא)Y}`^!d*QA)N_[@C y(S"Ef!zU@@Izr/)Yo?@C'Lr"]neV>Yx\8@_(ui޽8dURC>#rT4DjĀApw?Bl! _#C 1sRk[{y):,տH¤VJ(XdʙBQvސ#o)e{pN="uґWo;M(@8rCdYͭ4Vڛesp2S< ֊ʚM E'VN7B9!N!fq<*WY[ؙU)[ YCUMhh{ح\4KC9 18C+IhohGD[9څP<2՚EDAnV"Ʋj+e~R!G]ٷs-,m>_@ ̒D#Y iuv$ 7 ;$ؐwv^@ MeRd,?ӐϨAix}:TM`>OC||ǙVǙ]Ck3ej}x VƑk41W.O*T!ڬ.Eu=}#sBzJ<)G*}#}//ҾzsO !je|X<N$˓ \,6Tcΐ9h #mKs$FMwb~U0jOcbunTZ#sRXsB <ׅLǠKmHl?яDZgC6 ߣr֭iȮ*mJ8ߑ50.7sj%W})OЊg|dg۝y݊XAA&)qwOY|lMk)GD¼AI";G\s:M' ͙'ڐzhm?\&bq_,!k =US.3L5iw8چh8f{Cqdf}CNrUc DĭZ(G*44T3?:ӥR҇dEAbT|bc5Z ]zS;Ӆu c-hOXj5bKnkNWJվ,'E^|i݊Y ʗkL[14}buT~YAE <2/*-!XyCvCC0X! k ]w$믆ޙQkHfǤV> Ζ9k%-LTYɮkh+U'zT\ 򑄨~?v.:SSk49}U$HZ^AH@>-Ӑ)a64to:׺O1Ou+E[*(|0}Jؙx2 u+.7z0 54ݳq뮸9at+GR?}/Ge JZ!$g(Bpu9^`*G4MPp}[.h5MܷUuCz̿Fvݼ%jq?SeBgʘ`2yp*!4Rc6ylZ^* vU}H3y_u)<@׆Vߞf.UQ !  $Kl(\p!s"Q̯IЙUz5VVugnIȷV0#{$Ǿ 3׺Ae7hV)īvh٪:)w/u+)9WC(Ey*o<`*u+utcM咆2\p* n ׽#7TzLV&?gdEaTYY8z 915(f B<5s7i zNThV4h[&Cw_9_e_o;_71ルxѐ/  aXyשE-4=x}*372a|=~Be0;85}%3'";_B^HC_}-o5P-^K40ӉmOYN88!@mm!bORaCCE7"5}uuMaCHK;tᆋjcS7i j-7k5d"|QCCW}nzZk7 Ulw kVz5@>c||}{CfG~7"^EBl;~FԿQoQgRB`Wm!*A( ֑! q`qF2olG0*?OպʁdMC9  >O*v/<="m{Vwbxơ9 ?T)j!rlTǂJK1O֑4lσS铕._x^I͓h8~? 5c'6|!GbLFJp:1 r'!hC}턊PZ^h譂p:_e>I{GK>֑Pj{Rỡ!s0Zo̱ևR\'2٭vabdX~ :a6Ěc ǚg+}dR7gv+}MېtL^jgTi/r"@OH$,5 tm~ɲK]?ͮ&ٱ U,v~JjE^l$5Ddm}QW@3!WΖY1ϲIdIW~C,ia<@Fۆo+k` ?)XUZ/$uڅOC''UPϨ6G'eAKSG>?p5S:cd<7^%0X+ !Kj2 9(F:ᔓĺ<ͥvqxng| &Fjl4'á1(H@VR 0L]p&>sN56>)ѐ|+ vTy/LgC NRH9HXt{ 6O)ie$ /ɪ[*9~>rCڏ rr /VvƩG'r­G2_&TBvU_Ǖ<{tQ&F &t'%Ap/GϔwmFo\x?܂7}lH9{;#A9x&U Gp׭/FXIٖX^y, ϻ BcGGy l(d-.˼mU[C)}˃TC"pٕZ) iy}YӸ{y޶k~6츧 Pqdv~lMؕ&ٓI2-mT0 A!<9؇ء!bjGm@;Ln2~mC c hI y/cs7:3YJ9=+,h orzt@vkhž3]հ?[|j1aeynE'TV t g̅}*H6$X7d:gIJ4:jPE1}{_o2^deΖ^(Umc/MwN0DPz)hiJgxвRr[9Pj"b0]Җ&E^ՁQ2ZW_% ?Xzǧz-R uP!V[H?yCu ,Yt!/t ;>zV&rݕ~潐!L^_H\e$}n[yDJF\qu,+&!I9Vý8X!04ܪo۽Cݝ,rT9[]sU@Kí!\p;ş#uj"CR>O_چ<v /wxȩ|ȃXG'ޝ/U:3Ҕ+}V @}Ltnx 9}8`O.slP]sV2!)u?I{u$726\6 /k}`B(XPxWVAZñYVV`H=@C_z1d#~L݆OSЏ[S|/tBBHr,j] ߖ{ra7@&  աnU&2,K,~0b\'܉xd3'_RW~rv+\` r~Xb{}% !MvW^)АSJnoz2@~8VR9#_YEVPHƴ+/YSv.}DVNYvK]K]ϕRyⰸI ے@j+ 6oJj;Mқ^8\:@>7/ĭӭ~9O\{u%nWXr~NqYD/ٗU+ 187襺Ee}SyiyQUq!L U+Rv)(I WׁqBdA8 _n޻t )^u'ՓmȠނeK>ߕr2!ӬчB/[7$3Hf>7$vEO~!tQ 2eBO˄g(м2VFn?\a%K&\.YK^Cޕ2PGmM2)+DUٙ5ƻpOI2pye;Y}/TG3y+99%j%_JrhC9'a9'^3 u`w(|nH$!! Ǣ:[}! {Jq`,}{ǷP`V'bˬ2K嚬҆:/Vo+>e,3R䂜V&Laf4DA!59=/*ZJZ~,/ye,!R`P؜/jgsV4"I!-HۢBI pP" R~_1xN\ɸ,[LS[ Hյ8Ӯ˕!G b7OT4tyY!UN$ 2g"}v?T*Q]kGt_mWKx{^o( fž=vO9;h4cJ.eA&_rOQt)JE2-sJ2GwB~Gn;˂? ~Xlz89i7o(5S. gŶI~RUPWk$qf˾ϘSN%'k/ ^,0{Y`b.t(kEgRx&#_Jly\Mڐ!I(Y2p0 i -7txȠlG }Fμ肮Ѯ_g tjG[WV4m`GvpCi$ԄvAnB=֠20vm7}Nkɳ[(彐nMo?'oh%R8|ΈL:њ38\e5*Ysh͆d_db?X˙{ԍyȼچXɇTT&,Hq!ۏ!0bAv p|uuLsn(䗂bU#T Loh`@dKbIrBCxCr~ 1}NR {j,Vtq{'{qXMh6 -,ăc^8@ZxV|Veѕr챆VV߭5Gdž%–yy`k(ܭ{ w+vٽ!6wI Tx/q޼ &s )J~ 11e",6!^e‚S/G/\%лBߣ+ٕVmkhŭmi[^ӝ5䜸V8ܤY}s{FoeV;}g!ET~ +(b}:q_ U+"amlՉփtr!ıq[:u^ri–뜚'!9nJKB#腜0~0w䂆؈Iih=<ַ>+3vnҁA,=vK9K%5dnT_H6|RH˻e/7hDU)bM՝fACxNjp{Z$"" d.Ȉ6vyT4˝ӷ!ǬҐh9;KĹ ݊Nd.CCZ# hzozmz 3VQnlmū]fPD1l 3_ot[&J&Ʃ\p _6` d@C~0d=imHPLh WAǮjLo3NNB6(BIj{{!-o+TX*zH ؑVjhHsڪ@Y!odl'̳ee_{TZ|nD26Vb'.ďήu,z::n/VrR Yl7)Qːte/ukp=,V6WtPFE3u|^;2%r wJ|rv=j08encŊIw؈UY-dG6 7GX.3߭t; 3Q[m{0W2YGHoRn no!4J }Sy/t=nyKaeU>}_f)~{z2z:z-sHMu0 w*w"yV&. ZvUexQݞwi63}iu%i4cʰ~ ! 6|*ܦTϨWBtwLuDLqȠ:3]m &)1B|S|Gsm=22\7hoeX} {A % !R)~L3 m;q鈔}{p M ٤eJ#SCƹ}ۭ)T/Um nEo_ԡ 5DcWx}C4,eYi(ڇ5\q6i 1fx!VCqT?b?z?18#K3?ʡd*$_Zpuߒ _[M;%ˋBz@CH۷!,-GIndP=PdvrW6&VV&{m;DAxX2mi}2UƑj8}!G{@ĹlZa[(헏=*™ iXtQ׌>!e| 58 zґݐn@=Ihv-@Rz߆Pݺa.O3߭)*߭:ѐs}c|;%r$!?+T +hsҴܚoV( FSPLViu53=ߡkUARTAdmj!hnGQ Jp.M JSq ݹ "/,խxi{ ]CwOCyQq.dFcdf*e Pp,1`^C>eht÷9SK؋p{T +H/RxN޺МׯO&䧐;_A=B5B{$OJa藊cd726wY >"g4RC ߙy r;š :8.|TxǴ3'Ⴄ@xNV 0s(@E5n=!B>C[ẗuFs,Vޅoυ!<[^B>W&hCˁ-wwXł| G5`(e}Ҵ޶hgpߤԽ]wVNA*~/ PV+i٭rw'aX6TnoN'>y8ͽ v*96ߜ;>cw$!F1b`{9b  [| &}+t+wy l !/RƫIFH ;bcIqrc8H)#Qi#w Hof4ąaC 1W(r u^ !*/5Z9D[7)(vk+{YB˓4* jM( [y_K?eBhHmj<D9bI_,q[{@*dA\8x}2!a*I\q%; =2ׁkvھ%!Uhu/L6fFޅ#E ~1=ㅱu~aC=,܍bՊwNdACRRmEb #]T={߭RZw; 4ղ2i#W+CNrZnh;ԅ= xU+Hچ:8Hϑި={gu`IGݞ*Nu&yz @_7*gr?*hEQGDI ]_j?-c.cV5tPu :?>]Hc@s=P/+ȑP+85\i@ Q YAق =|i˗|i+_ZCf.EFe{h)yUG$AZ岽QbZ1%RDqOu-7zi 1MN]@Nt!D Z{Es@;\Q1Ӊ{2sp&x 2ȝ!8 P)G*4dՉPep {f.ƑjI[{{7LW{\P4:xA!o_.|Y!WAvBMI58Bn3U& _{i$Z?Jd+wTmr;AH(Rý`S>Rm! J}npݻt rW` n?csq%w44a37LL +C+Ko');BC>C>C>C~O^f'73lnoHL<\:",R; ҇LA36$kh_I/'&\;&K3lw nIAn_nzC77n|Нoj[4ķm6 vQq Wptu$5Z&Sfd_$!zT ÌNFoCCT/2\<}HEP1Z1}wg]ݾБz00/raˣGr7wI$\ ۙya5<&Ff7!^v+_GVojI6D'nj[iҲj@[7vN0C"Ab)ȑ0.lC99cve]'R~WkJ\_ȂB]x t{' 7P%efD#h~imu~dybLTcJE;UC4B OrbCT'M  >r=/$Y#ۧ$ӻ 8֜+Th؉K9'7,Q)aE 3Z :R)1' +brګ>#Mr;ˇ|!^Ӈ"_xl_Ϙi6$4Cu;`̙'pِosWdt+ey•r~% ю[6!GcrπDAZ9Φ}h2!e)`i 8\?~f{j0'0ΗZ )}Å dPzίV7[EE U=Oj47.ɳhdAΌwFQ!^G9$T%ViTb}lMˏi4Ъms].LL[qDRԚAqb˽'J%00.5R! ]q-KyH4H(+VlS!:SK\hd^t+Oo D43JE+\ug=ةQߐhɪ ԹmBcsa4T<4>׉!?Pg2y< {9RNeN`Ei͠Aua t3K<[PNjxU{ ?fţП'5 Kr5x?H?1_qx!^;8R彗EșyBJ4hFxQ B 4K jnԝeg3JnCC+s݆W+΢`VpA 4jd@BgDrkY(h7748(^)Pe~!֭m#rIzRCmGģSJѩ)TTet&BdϨM.RtJ):**J)\S9fI@̙S݊QMKT=ni6D^P/SR{ jF)Аř r{e\ ,5E49eTO)3)|)juEO-Rr;(xME$9\B$BgV*)a]r%Ό?6/|I;Z*jsr& dj)| ɗ򷧣̍32LI]IYy{/w"y2._"[4䔋[ RlױTۣ㶒,ԁѣ[֯킼N>bV.9-i y{ϵTP֫!'ίENi-gZ*%S˙L <J$ o}iw^3!+s5avۯk Ny&r nɤ:pJ:}Cn"&eE:e^zՐ\fΕ )g^a*aG !!"`p x#m66$)δݷU-Mu ʖ#8HY^!Kv>fi=( kAriFѭ[ >cJxe"am5z!>4[ܑ`קpJ1aIv\R"s>jTm-WV!-e_AjkJ#HR3!&Cr V$,R2VVEihb'*JC|șbp{Q;Աarз=ZҦ3)=sœeWOtޔ ko+Z;Gϒ,ra؈GDW22*1Jz6FPJfϘ+Uc%  RHБ{\~ikihq'\/I+I @;VZқzAI{݊ ?]jU}_M 9$ `ކd{`Lf$=]I~i5š!4N/̨;sUD + 8drV ˲8K2YuYteqẗTY]%)gIy!Si%g!ED,5Kn͒[,5Kn͒[$Ҭ'JFw$ۿ]xʢ an,;ȥԦUʟcU:pj5D$e/V`L(}ۛ3NY,Dݭx)'YF e I,֬,YT͂a 9ZCY!'հFю>mmvp 1Wɪ+ȮYc%!&A)YY~9I9{~V x"Bb$!ړWP*-_TJ* AqWsjp4L\' ybucLO]높d@Y0{XM-5Ylg`]]v?.ɈcI{GbJTRIX:hR;pbX*i%26 \Z= LAL VC]7eWCuIBC4CB+Ku+ \^VR^M~Z4}dd=&۠Ծy|08(XYOYO)NRR+S 𪖇Z Ø ~&l%֐D GIr%M2㽮؜sEZ^dZNɴ4\\ |ƴAa%!9 d+ d<ޯC+K83PdA*|0i#~ =h ʪo+gJr%A^JD_-%yD>/-{Me佂07 ÛV stdoD T "@U,i)V !7 YQ;czmSwd1v}j/չ `*cS\ߒⷦ~rgb Dߒⷆ4)~Are]|xjCò%.36 Lʻ' B,H֢$]. duK $5JXC9-Ȁ*t7_uH}!*kh=mhx}$U 5!|쏤7K D2!Sc̰IK՞>uV~z Y/k]<Ox!E6y}Ӆa[ {P(a^ӑE!axAv]4 !npdLᅩ\*}-_{rX"phc/4]wI\rj fRˢ!6W 1%\ޯ{ZC aRwΪ)et:|+A Ҡ1^VjRݷ1sA^ftSJ{9)-'_JG*=O¡b_+=$:\} ՘ ytr`z鍺\U&j/捆ȩUk ʚT 9=5PFE BMk'VY]R.)X.WVj&%m{tdgʹTTRk!CHIAÅL>v{=W9p՝IMke5XZ)uݝ nR{p6&L=-R( o~ ؟pzknpɈWz%I ,dIrW*ƕne\']א#3U*5m} IkkE_>+}]{}~rWַꭉ6xﲘUJN>dܪ HUl7֧* eF`CCX C KAE-sDZ?cY+)2 @6@R ~J|(g*v ,6^ȫLtll*_IP,ETv%]w%Q%Jw 6$O$/SCW%w]zC+[?]OjbB(uY|֕qf(ʄJr4}[VhWI}3j35ƑpQvb;_R֮ 5Ӓ֐I${UCJP |A0r rïTnH&G'6kQ4~ѱy7X0.d]&^ZZHj*Y!,vɤ,vAzCZAB􆆬,ܭ WBUU.ILyifWH7C'b *} r_p< =c+unZO,濐1iSMekV։Vr%&U_C*$2(UC5T]6ue8L<[;^Xgd|]W\֤2y -tnm+}VXm4URdN"¾p/>P6dW]\ɭih脏6uKqh`S$w+{O'ֆiiQuo:q;RYث)sבI_hn͂Ljd'0ɻƩ0p. JXMIC3BC ԫUn99VCAKQݛ;ɡ BLUQtT2Ʒg{^Z CnE)je '@z)#B:qSlzQS0НFIen@f16a픇Yݜ݊O~kB}]x.}{ߐDӂ{v}b>F1PJȬ6*QC>c91dX# 4LToCz]==eZd<=՝'Æ{Vf{4]Jn*4VR !=6ӜM'K'L|mȑFZa3RVC&?/o/dn\M*uІ/0t.V'/tTXS<4<֔|F,j ;[:ߌcTCpW+L)(uAGu/Ї '-}!`3Qk ^% 2CChA}.'Vސ]͘NA#efqRiA W_"/͐_V[?x /J^Yg\?A JAvP 4O-|GE;yUۜ 爔"ϔ]ᠨbAn:@ eˣ;N} Noȑ spԅzD<=,]6)Y[H64S̷3?aG#{I/FWʱHfAN lvvvOfR2]"5anp2V̯L*ԅ= 6$]LR40~`QݤԾ]=Xp/:Ď.%[pD5ƂE3=5% 0M_0ns&v3f_!,_2zoՊ{(jD EDvM=U,~!iu U|[ų'[ b#YZ؄w+즫狼W™L1ĭbAG2$xjPvi{u7Y "ː[R{=F[|מ+o2HVSI"/!eBQnhp8#kPoBiY!"XV%lㅀ{!n (?͌]=WpA9;d`UZΙ{ЖZbe&W(xAҎ:ܿSlP)r>:H_,G'{$EyC} 1w6ws;w54"3G]Q좍ڈeV5?=>ӊ.VKSb!,9͢TEp/N}7ㅆ_ w{ {vN*X(\պ"7s}!6RT1VD+s스r ;9[9*ٳ'\-ۧڤUl͞|4S8![^nū5ql,08tY!;?+!W skU׷'.y*; b4ZoK&apnϔ{7E'7Od44zRuLˆ B[VyA{!BU 54}Pwm2Wf 4#kb 0}_gd_ycdzz% W݉󹠡_l'f]8V~Vzj2 -.x;|\3/ᅆ_t$!'%*w} B؇5^hɄtXJۑ|8bd{/G+Hrط  ߞ$u~f wtUOJv<#/D0T^J%hnC2wR$6by)U֠w+bu)ܐ4PY=0D8ԍ:Ԇ!ܤ0X0iA{ҟS#U+N`\C[, v#?Ną 4}//6"|k:R~V>|cx!!e#2@Åz)_I/g`2?,pXBna嗶O[rj;V{!CiKμx ͏8q>{E{ZIEZ98,Ozܺ^Ea ]ѐó‘ :CơaY\r5Gn'%lK Fב4z⬐EMr淡b͇/3k;(B$S er~({ɏdQdՠaàCԂHiC Q=mhŜPd ㆘_Gdb?9R R)T{0x!,Ƕr3bxq\p r޻+XsȲ8*~2Ѯ[]B~il8fтo;GfVH~amN{ U}?Ԇ?ԙ?T?Ԭ?T??ė,T `Y BsE ,Zy xᄐOJyҮ\o'4;Kk ݃Mv>{0波iߋ+%Ȳkl=gVGVCڛч,SkV;oA7s&u+~(~{C||m66#NrːQmjbTTk3oC^kOP7"HEj'&5%!{ⵐsxyBWVonǾ}_tuW1(7k;8;s/O"k|Fe%ƻܻ"T 2t<\ýUVUTܕ`A{ip0(v.2. djphLj9͚gC5*GV;hȅ};e vIUG7t 1-}3f++;(yѭ!3h<쏖\@??>$)g+ۊ.YC5G !n(J.>p@P r+|5Lapt+mj" Fޭxdͼ*Etv KD$O9yj_W=۠.DTAK"ҿY@ aG2J#KZ^CVC3 w /[ <\אRbہ8ZANȱU+g4$9\G;ucԭ9R[9Vy|iALo U9N%&{f?\AL9CFd53Ri@/t ڷsl9ά !YH jԿ?gG xaAP"ZQEC΁qA|(\]o؛Gbx3R@{!!R#QSJ6 D;m⨦h[gFjfΆk6h}sЪ+OtgOjM~ȣaџ ²:t`` & ´F on$,]p{!RT+/!39Sƽݑi#C+v3_ZR*INIRC$_"~|;[әιㅘ;vv"e\1iT24rR>s')f S2!]j$}f{CC'|i'd5KsqJwu;庝uk\wn }g2] M\SFܙ,ېHؖIU%efjOrx'Jәq񜩼Ԑ#+t :Ԑ3fbCv)| \bO 264tgV$2h d[4up9͡||ŇL{Zs:!rf,5t=e ]cq'sB|iBʜa:\s*dC~)Pp64(s{+$HX!dmymɽ>S)U\=.KK `=N9sdÌN5.L'oC\rp(o-g龝Ni*}P8Y 窵y2M!ڦNO:I7P6W*;]9JZd+CF qy^wg r0G{ 2NAg2(W;gT4j(WB(R ^(2{@nu(^Ņp3xf"[0\2pMCz ]Ͱk ڈmXAy/iinii;aCgY~EqQx5~\`\VI&UCeTwy*ONCHX鲠ҕ* 5e+;5Ӑdz/4u=I{q2 ]iT2UWupt{!ZqkYcpJ(8P'0YP $d' R nj"/PpT3 U-ӎ+czRA$%UVkișF 4wrqW bzL8,CCZo;t+DZj-=鸝4`abV'Onai:R,-0H ]1-vXgU [9 }d!40mJYg. Yt!^`g7|4& vP|ivT/rݧ6~ ~eHH I!n!pA8,%T:/%SșR 3V!\Ҳx/CC+o*u!Ȓ{*h }C]RCC^N5l`Y*97TS>iQS)wrN9尜CoVT@H?KCm0qo a$,[XjT7(ܣx©$ 18_dLiiZ CWɑ}PQKYU',{f N %ӥ[58@ZK>LFz!B |F F|("UjmgykޚwIiph]V"O4'SCÅ,0+wp([NI!fJo9AgV)H;:+Uz޻G擑V4|_(XҺ-1z)1r&䭍8lsT:@b["Z3 _LS{TL]5}e|[ja@2V2>mHƲ̙chx vƤ_P.ۇ3T8yOh(;,2h,ʪ(} OsÅ&^hBgšK~!/>8{[9M@v^>#^3@W۫0 {!gNQe$"4Ҳ:IJBᵵ3%,LVқ[S: Ii"ZsBmc"$,4+4m`F% +¥s "׆ԝUۺP [wj 5Cm λYtVrJ@r b4*K8Uge%x]V:ّGP`CŶ?wVi2߭`ft/^:oK}2 5U]/!>TKVk 8WݤTJXX>)7CW]MNuφdR\!41L{{A1,z<ϝ} %e[eȖ"eqbZF{ x2Lݭxr muZ `%˨U7A P22VZV渭^36 qԕ@N5,#tSCuTQs_ԐsC$jȷ ~یeKVR+JQŠƼL4l~wX;e@}}Ƥ8Xj742ۙ*&!r!(e #>2rm9eѕek ,+@C| icv+~ѻ r<װFAِIAkYD'pgH뱠ѿ!_·O-ɕ/rJ""3UÒP;) K:ĺt\YdzX@!l!{-ƚVZC6w?^*6ǭn5ޱDSQe.@nv+1+YU!ިHnבj $Oen y(2B.|/4=dpU1_Y!OWL7˻rchcGBמ.D-)3 w$paUKs2,66/5__%`%IlAt^@1hýoF~ÏR}''IW;"+ 6x04hc-B2&NQ2[EQm ή۔UWwrKW3wO"H ece8rD۾a bGtV銀7| iAprº[n OJn鲸ht+H>#*uceLmSxZ Yb&!GšPVZ|iG'j\1^K훪 C %}db`kZgpvQybd[,V-fxl܆]4uLu:ald9o(!TN kH05 ™m^Gfׇ[ ]C:2,V~t>7ĹGvA[Nu→1LmHxIW76:oea~>hOھPj=oȢ+o+։eٷCf2Vؾ&~$/ JB_臬 Qʂ| ]Y(!޻Ґceg0jCW12!;U8il7 6fr"'**Eecr*(o=OtJFeuՌ_qSs^WB4qHs6#74_op{+ +UF\%]08n]Ij7*E7D ez"ҺʗU{ 6MjB+Լ kPmEv+8 ___VmL~ayeiJjNhOHb 1սHWOmN/V*dBNr9=+RnBu\0% ?Z|<bF+5"WakEJgWC^g:cPnR/Y !:w2 VG=D!b}v:rbJ󕑌Bfw9ɳk_匾їi mҷݭ 'K/4O¡f3>0u&KQ{m& W4:&4q3q%M UW(r,`-.k[\,wqem>De/xW%qYJHYU\֚/_rE4f%*H$s\֣QV-1-doM쵁8|l2&Q^ .V]h%H\4\C9r{B OsB?>U5$^{J-;L>wt+!҉mrI RǚP- rS3,0VOF~H-0&ɕAR񕔊K*ʕy}i#چ<_#?>rYP`T+w5ub55tToj"5%GgŪG7gDm [0}iw<"5K˒j E^C|CF,CB|imE*V eq.V\Ź,se j~ەzWrSvU̠+A}@!VH,xs 6mG"5.!DBh=5Г-p/{֔f*IG1GMqK- 9kYE!CO!_ute(GnY)iTxNt9M9bI8ߐJ̸h(X yBJt <*N$FNr} o{x*ڥ,{k̟s]ʓ3!:n}Ԫ{"Q:' / sp І{9Yݹ[kB?#|Cr<~RX11?)߭2=cO6OC#pLZ'Jnh>teǭP6OT+FIg4!r_ŧd;MVpkI$fRc^ܭH7Ǧ_iCY&L6kI'+Mt+ͨ<"VX0&P~wVj1&Zz?Ihȏ 9 z:{Ϣ~d=< ?Vp_%-$Zh-v-H.ee.FC826$|iɷjgz[s;l9'HfPV%1!\}Y|!+:xO1&Is~!|Vz[O`AE93Yg~pU*d6@y],Ǐ{|G|^܍"#iIjkIoy4ɂ7 JZBKS ccIU-R [8#9/"> +6UGVCWWW%P>h=cckd3!$XG̯/\v: =U+_ǰ~ [ӂ|wί >_ ם3zgXBYN*}-Vb*J4.Up꫊4c薲zUez}Uy b\TxIV9@9a<@V> , }t7CA;c:/၂03ܭZ} 9&h!KWa/Mh_?/,qGr1#v I Qh|.l'u{']z o<ni5/ (G smAPV<# {h%Ł '9 a!9{CyýBk\5\螖Gzii$o*ݥH'^LO.tgEKAjuiMӁ^hY ?P 5{TF s8/Tٹ(%W Xgw51}nA F\y e[SXEܪ=6JaD^)^]ž!{>2ӭ$ q=2S!GTάLV%& rp(?T3wu.d~OCl݊ _vЁ6g irLJh81`ЉXNجTlj4d+s Hnn5(T o-}ɜmDE_Y 0b2SI7֙BG07A/r g֗=,wyh StnVR3z]vd>yCme%fWQgČVװwP2 HJ- ǭ 1ӲVL/G#B=X`=bd`gQ*~0}&+Ҩ9 94,2x.)? ɻ-/TS8}~x zͬ >Tjg} 3LiWL)rF(.Pp~ԥ rTc*{i[sGCRa!KO0o7QXPq FHԗbVMJdOgjCdCR!҉[);.0oȠt{#+cދNx*?sO+?yy((9|ɑ{q~[I QA}"SVRZ }tn ~J'2B$>Г[fIkh$̆ P6;Պ/-+~7J#d7Dat^qbMZLJ}={T>Sy nșyw#_\C&Y Hvr{ =ow}6Ԑ(, PNazL R Щ[b%ߪ/ݽV9GucwB"יp/?/>B<U6WDO\rW Քs\;>Ԝo{ Ws:Bͨfm<\JJVa|졫dYPکED_d%)k_͡bN媂Vku Nz3#<*]$srbNF]>UʽQ.H$KڎyA%vm;gpU:|;ʗF 98b(|(%Yx蘒 e탦cRH!#T1jcq VZȮ)ۭ{]L{veZUvp@V}{36(XNV?3y y/O3ح&.VIl)YjI biZ73f<tvK%L] 1td~Nɱ]9$)KD4 hx q2Zw{r<"d"[ȺjeOf {>BD ])Ʉ :$)ЭX'T8i٭C*}/L˽5Q?x}҂i[!&/'_$|/Dtv)Vؐqm> mCkҽz_k23DvОCrBu/fɹbCչ r~MG j{rce}}' 9y ,b݊ bOjr$HzٓmQ{h9ϑ+DΡ.XV =ZNpm K ӅÁE㞌:åT q*a>0 ␑ņHJKw(pz'!ߣτrzY򐱒P"NP2`^H1rN_7o0 ב<^(H ޽G|xXgF'Hέ,Dݐ>>O:IlEVH,zًlDI!}ݓhZc*_z;? rۻ 9V~XsL߳t cS?aZ |}چ$OP4\}f(:9ܞirӧ̡J fcP;s]m}bk:9ȿaVB{7xM/t<]1OcT!6“"n_w @,x~ hCTv{9 9,.G@aDk܂\}ZBg=ݚN3 zjZb`W|{1M.^_O)gR+`ӒqJnsC39RjQirN"N"NnԌ(L5d=9Hn|+ *']=MMW楝dZv+T{;<8<$ڡKqOOj ĥC:+'_M92!M8@Z$sT+?䱰 tNٚҿ4aO[5bp x*OvgːԞ)}oHW:Y[9^aR$,--j((||g4;d)O}%Www[^s rnT:./:,Khfq ib:iI|l4F J/َ.FZ/BNҎ:8Zߴj+vRHk!kPA {]U9څi 5d4|>eyOYgvN1:%~j NbnojV+>2+oבZj߇!DȨND2v8[/ MCEc]}a_|H׬fJrU_Sr)^.6H9/ۖ&+QL~Lԡ7&{C~0|U$79UP̠ YS910v;RP5{9^NNNNNV*v+9Dӆ@VL4+Oa?)אc8%!$U 2 LHpEIܭ$J?ۜ V;sg?q~tyMӟOGtNߐ׹UN35dWNJC*{ğ|9cʩ䗐~&Ϳ!gv lgfC0&Rn \O2]S}lEf E[!1IAL$DISIZ[IHoV9^HLnmb-%m}%m/T^sUݘa7? 3Fz;/rEƾ  KWAOcW -vFR2ar{'bY3mZJ /Ʋ"Z C8KzD1^(d*jNKDDZwV^{oik7R̆rNߏ͒b5Fɒaa>C 1_+~Q!V>܋y7B Sf[@؅+\g5*VBo!'ƃe5WV=F,,$//<4ČNw٫Hd%_dey/5#$b )+:pIxım[@'ĶĶ]_7~!V-R ~~`C2٫[ɛ[GX Y/s_sU౿k/oK:]1O3X)qK;> nwcPO 3u4t%ּ\e(g4;)r A)4ec'iXrYref#waΏu&ZlocmHV~C:BgC~ רqYpBHȌnlDm-ɥ] ސ%%W,cW֒Ea=de!P]U!74tգCr79j&6))TU^vJ7ٝ-MymNUÖy环oF=Z5_$N*!\}S -тxwb/H#ոZ5ε1x%uGa!› -6hzP _ȃP.gދ<7MyD D%EC^ vca+/4V!MV9BYyR3>LA2$.V|=" לa¥5Ͱ~CiFi6Zx*H oSvhVDo+)AT!(V<ĜhH (r{-pæ(ӯI' ^P.{.V]> $'4D>_ۖ6 rm&o&չL-(6'ie/k.zҐ @s?"m7[ٍzF]喺++ın)zǤ%1,NvJCtYm2p7JUOa8?!Vl[/!un_̕M?fxB~<3PP.J :Uˎvҭ| ER[Jpϻ`OچԀ]bzD2؃XM>V</*2<7xI쏔] a,Y‰c[nˢw&5y ܺQL<Ηd8aNFrIb~-8<TVýe!>ŖXm,Y\~Ck//LTbT3G;q{!bm3`fW+G\-_.U\V+&+BoQ[Èۛ8LLե0(RUi „}N%Պ-,jcfX5(+/ٕvAyl|&NbN,d\ھw 4ʳS~˟P ϵLCJjx?Q㥅,pd^!k eQNf5mXB8زT:-Ynl=Nrav2yߓΈaN(XYP鰀f2Ζ"Icye5\~S̪ -b niy쵹fvm55T뼪0ݷslɖܭ*&{aZaŤ-wnE8cr~`wH }i)]QMTCLn5/&x13٭H7B&e6P'ګ̠MЖ,ޥ!R%iIFdRmɷ:{SϨ8x1#Ґ2.jɫTBS!#C>@Q&?zpCҝw,~lݏgѯB%_ȗmöQ k!ʵ=\>kXjY oXM\ɭNنb;[yQip]@WDc'FQ㕔n*Q9.tF\QdKim8e"+~pPIܬIYj&ORNr5欕6.|-mJAawQR<[d^*9q~ =A˼-5ex'/P *vCC+V KD5 n#,߃gUm# ^l0·-0sj}ܤQ%rF 9VZMVzqp4o EKM̗u=Z=i\fQ(@}@#%=}}{g>̳ܹ ce;Ū|s B4c[pfmHΓt3:7582!ix,N ɗd{Za*fX8ϚgU 5c~L^SS.ds_pʐ,HkTmhgmn\>Nhkq~Zih962aa4(R*&@CR' ՝pQٳ4KUr-d+̂"G$ 5d w W"#~GjBV$ gq*fA&K%{2,ʮRm7yGJ {!ѻCTo_3,eJpdʽlo+]Y[ p/)S-4+?\Ͻ[Mj:˞ڷu{ˏr{AjKthe>@fcձcӎYl!dzo+GK<ɚi~%&9'%Oj*ߣll(-JEZ mERBꦗ*fSmWmtٳ>LCC'|_p]-!q( "yIoo)ZgpB vLt/B5zwk?Y4!'=+W4tYZ1' U5̳].lϸhoNz|SSʮƞd$ٓ~ ;je3,rC+[ڮˮ̞1U- my4o {IxOVVCǤ`5dtDWlZ=rLh{[ ɤD_8@{].Gj7[n.iP5vU,@UEN`Oj>6/oq_B2S_gtKvMp̟fvgjýLJ 2 N&6K#_b %]S"z1ۡC]b╻M;jŻLJTAF)s㓞'=}_)bG$N0 ~(Wć[ wj>T ;&17/cAsR5|OcCp{9{2^R+B;3;Cڤt54ɔU˳覄M{!)d l 90,5k.ƞYX@e!=uԖ"2cVvm}ۭÞ\`9<ح[mϬ^|lIӭKǙ=ٛ υoGr Si I ۳lghCZ>}٩VR9TY\{s)wu\\%(&&IPy99M%U@/E{2k2A/W+. Ɏg2g|Nen-t˼ q3SDb_h藩jb /T\3i 2tf彂3}h„=5tOINhL2xx{$ S 'Ά= 9sO4@%cg>snHfXNw319dsCh dUɨ||J=Xܑ̍vCG+d0(yLp]_XYв!E"|A5^3x6'Y}J>%kO'1f@k=(H̱O!yΙ2 {|[TLѻ *Rؼ!&p뙊eY&+!g(ehU!lqZ4>tP@V.s7w\)렠xCÅxN3нGwexx{tW ޳Vo2ɢ>gי~>RZYͼچpl_%FIt_u;vnLyC0vؘY[q АX֜V Wh}Wp!!45#N"N fJ,J,*%v=SrI<~(RSL=;ISՅ}<| ~B䀟Y޻!|{~ S!PUQ(]tGx©x™ ǖG y| tm:W63g&{RviR\S ⤴Lo"~ZHIdnIWC]3%@IC K ,a1mWC 1XTqĘ'O~/8j6=J/m#)r{1R!XH9BWz13%243ER-^Ό4ᒦR©R©R©,9{AnА7fY_bE 3 &V r$Y+, V&9R~Q07@/휕f ~5mVz+Y\DKKR{兹m7WFĸ2!oo\agWXf ">/d']rlÅx0lqd/bZɊ:Qo+?XjPGuB#YVșZ[bF%/>䕟BIIrCG$&0b Cd@DCL(}> 1;N%In vwfӆ4%z K$k/S(W95˚_l" df/ʕBkqƖ~nc,ѐ2@>D$mwX!WK҆8g Y^m>xDNaZbY(XSC3!vy "ⰈRAN9RW2r~]f̮RfI_WVnJ=| uuyX) BkS[Νڅ{,HyXG7S=J,'v8*&@CbMZבBkj򱗥˖9+u8R N.&3{XbhO!/,`e]eJj$Z+{mCCWRohж-+嬤i8̢eA] ,$ U}k{-ků)tȎgt  {:#잒Mu{B ogC#9 iR]ZݤӐ]%OvQC6VV~iޓ.gWXH`Ui Z2\w~0f~Ⴓ[ົq< 64rw'#6U)Րc|mOxl>icn%}wD)ik!$ECX_jF,/ rͤⱫ{OCGAKF'w+G;ner k!:#kZ}FPe*gei5ZŅ5LrKI;h[@fזr#0TtUTU.x /ƞu!]5#Q|Q8$h ]jx-w3s™Q~T'] LvAK,r1Rn@S2)BvV`u{kn+<+|a # :5 93-JpA}a.C51|(řnυv4NkB|_d߉)3W׌W+}w^ZCځjArJrh~@CLr,^ ۍPCyi݊cp B9E=_)Y)|Vyh!n#}ج&t\Ginh7dՊܕ| R{C4k&7*;|V7{|݊UZ !ͬqo9)BDjI 9qx'! GՓ. a 2Oڔl2K_A\q-6qk^-*{<`KW)`mI*A qw2_sk UC-׭Hp0.̈́/4#`25 b@a8x%'Z)/z(8xr3/*AHB3@6fO_+8SQPw+/Ur/ľj%6a^7U[*4!uѩyWP/i4 2Vzz+`[ 74{4UW}_&|eqQ짬g;mDn/S* ]z"ZO;d}n`y{NsA>gxFP2Gh۫Қ,(_T8?sDsʎ9Z'V5g8ޑԺn o2B|GCTȆ``%v‰)w'6O[!V'lh0j|J{xir/3"}#\qde~3OH@X}u`GgbCFjDNuo{_zrWCl{!ׅ$i4T3-3z) > t`YWL"/Hqn},ӷ!oh7vPʙ6@C_.aY ʴ^ԣ6OA,pu r]tfM4W$G0 t+ [8NI_Y! gߞMߐ'5| \Gӄ-j3dOgB:쨗~23!ԏ˕ygxM-IDh?fsG0n{za{cC~ARh::HG`zϷ}T0OI:aOOK>>$*j \+\g00)t˶㥾It4bbO=_x>vn0k[7&{`|Vz9QjrmT??&ɯ~?7j_A'߾o~ϿOɿg?=~_/~f__Wi?/_o?Og@׿_/_?/~?`߾c^_/?eWO//~xÿֿ[7&;]ߝ$Qb~_?_WϿm_p;ack+_W1p?}?^W&g?ۿo~NG?_͟_/o]o_?ïo4/?{?7?_ş}?ͯ?g?_og?=O y~hmmϿC/?'O//x뜣w_ߵbVX,dF1֩EGenomicAlignments/vignettes/summarizeOverlaps-modes.pdf0000644000175400017540000014172013175714431024556 0ustar00biocbuildbiocbuild%PDF-1.4 %äüöß 2 0 obj <> stream xZK7 W9z, ؛]&-u撿_>4<?"%lÏͿAaLfuۇ៍&Sa;!Aq0_o6ƺO~kgTřm,8!VA 5O*XbfA <04bh> ^[bz$l=@jNgaTԢǍkXP ح9VMǓH3K S(xI*6FUx2;='9ÎM; U DE)bYeKM(J/KJqC1YP -.󞙟R]7[j2OOux^iev^Y`lt٤"Ǹ*D`OÐvwcr;Iv,’~$G>]Z1Jln ,Ch ԐujzQut@ .9p.QWځ=L>R.;A윃Ʈ䜨έcPvиNv+.цW.q]~g&cCT3eޤk9VTFѯS :a.ܣ:S,PDhX]gzUt|r@`}5(QDcDZ%- tHUjpunu aXSQxWS bR\ @CR^8a7YeL P,vtK endstream endobj 3 0 obj 1902 endobj 5 0 obj <> stream xy\8|<3><0+;CHx0;H!a 14Xh ֵ5uKCQ*ZXf~*moU;!j#Os9 gFz" ݻҏ~(Ba}a>[w}+>DCmOW!wv\_P#Tb'AA yߎ]W|Qz䓐3GI/uEe"!]z?= #I _;H}:ӛ{p{0<bgXN$HerRhuzCdXmvGŻD7CX\ȎP= v"3?m(s*CV#5ڇ_Acb2d"t'z]2 &kqQP*6MSJӸC W0Qd?Ⱦ/b_ZyGe?L}h+z_Fnԉnʸٝh:~jFDoN~UlSٷG0ꅑ>n'gEh1ZMlŬ ff_VxDJԁ>j΢/Gy IքFЕ {=Ÿ13f;OӸ ){(9[-fQ E/q ܰdjXa:^<~ t3́C.RBU =h/ pE->#r]):h@Khƾ4&yV< kv|߆'MF̸A8 KB$VH&yh PXCel,b**k:3̾=$ eˁ#aŸ p/|yUZ˖uz.C.=\R%zD5{lSZD (*C ?@v~ix2*t5:nyCG/_w>}Hufxď7oa< g1ۙ๕9ͼuv{'79q\VT эůHB0=S46Y4km/>1;Aa'w@wW`H{AZ_x6-tx<(,_?H;`m'y? O[w 1Â4 `Rzf9¬g;3O0{C2'Ygcl;~} O\6r۹kW׸7E.QhыbLA|qHĒVVUHR?h`ݧ.Ry xHT]¦EY7?mXf؝ٯ˘x#<.Q5 ݄7yg!IfgT3r׈3TS̷kkϡj=-=k0Ls#̕G}@z/anEO{oY/ *\Ƥ#qgMA_D~ O"bī%pkQJ0}?`'q1V}V|-ďЕIYvLtZ#hdA??,آ7D7FZD+oٌG%iP]=A2h_X {ab< ;`h&'󰳦P#57q:AOjܗ-SlFg)% l6TmArQ<=4 \^ 8/}ʭ{[rXaب`_F}Q=nm써#{oR>wOvU6f(•} /W>c #<_Aޔ)2=<@`EϢ]O@*]Ü.c`Bd̺}/EN .Y\:UUYQ^VZRLcHQ8 }^w9 vb6:FR*2D,XhwY'?+b$킂<-8Ir-XנXo?hx%\p3(|eG?;e{vnlN(^y,N*7{'y cn> yǭ8oodscnEq}w8.DhTO׏K4|Y ?:|Ӥm({=]ng0nBo>n${A~%ֺIc3e7 0s]q|Lȓu5Vm$%2R×wcl} Mx*{7{vo[WD:vI[/EOhu9PkR蝯mNt#JqL6{aMU$Ba5wVC^{~⒮|د}HɼA<G%4_dƽi- mڪ@|Im%symO !ig:I\q9~F?dhQ=M7Wߴtɖ|6X\Nx#N|0Qx S p"i-щPb;JO#߉86}},-JHHGE##RD.+b$nr.)tn0$,.u7 ɥJN0ثT1 6Ą& `0`$( cNp:̅bH,ħ9R{Ļ-Ϸfjk9 ];SO%:} aN3siq ֕TTqMfSi]^ZfPW ^o@WE`cUr>,y:>`Q]${yi`evvUo+b)I5LMKFcL<MNOpӏJUJeYY3x;!?LTN!?sc3L=#pƕ2NӞHKuc㨄J9 nU~71LytHYQ[;h3g۵Ӄ rPѥک %s d~|+2TVUT1bT.enat4.{D)LwhX큨Z\ "@"EEEW_}5ofZ=:nωŰd̄&OS<,lZ%I E+@c)RM*C$C*T,uE~6P^VYQQY^*J#)ꠏXE*w|~Mj&'Ə^fC/7kJcMz[q5=Ұjt^^_pFߡmO:^R8v-\75 $kԊrS SýןB:ew0Lm᝺;7MZ`-ćlE٢Pv޳%haMFb؏a֘&]p`6 FQ,F5 ӫld#$~WJ' B8sWj Zøapp 6t:9D|b ~}Z; 6s,#,֙S>3v!v*R@r8RQWziȽD67}r(fs/xۖC[K;nSߊ@/P6ފB9v⃝tp<ȕ)*] ^dZ 8 _(čA~".r\pdEGÓs_oVØhy }/ۉ5!}B!BȎK7~/Nkwht́:MsYN("oI;OHn gsUc`Q׵Fv5r;ҶFu%v쟹{b5#YS*pB &KTKFyrxR?a}4XXlv^]+>ء:@+i-ʭ.]Oegˮw{.;v{e.`I-V,-|C:%=-e]|=>fVwrv3]Z%9=][CXq2i4RMw*+fdi,^I/ mamA|Xh:#3BK db*;,#1xτs<k+y!2Ҭ% ZwDTZ@^#o!SB5)=SYV}עw-tJk|J 3`ߵ!pd:2'6j`N')`;4)Fk`MlBb;J*H1nZ9,֍ ؋ D8.v[Fg큖l(gZxQ"$z/3>xn.od)T7 Q#~eٷ ߔF&u&!͛vK()q \xTG_sO7ΉwT ʣJF9(0i ؒod];Mul.NSJm<6H2<fYE- PܦAL٘˱F*:ƐwZctŘq8Ǵ|L.E9͛ża,9DRp,$L#jH5 b 72bMB<ٺ5iA-O KBu5$/_eL-^-h\6cBg^ٸRg7 h.K:.|>j#+lZovT l+ pF<u̇;}iߘOZ}@"Q+%%e4Υd.i*ĭ2aGvOAkt7(JBĠ̒]}9IMm9STYU>IYѦl̂[-ӒYYYD W]$2MrҜ%C8, b D ]QyB-**Ykql}}.8mn&5EEf3PVw}1[sHXB`tX8d,t=bu܇ J}%UPc1X$*=W zAyRs@394VӌE9#3}V3' 8nuaKeë܆Kg*\r/L+_Z;]die +k_TSm'=U7eJ"uڶ(P^YtP,-ڣ4v;YCV`q]wXns|[p_W_>ŕ.[V"A_Y˹*(US3$ݡ?W'Wjnu. 陙3p/nѫ$M8犗+ K=kK˚5ŜΕK‹/i;qhQt$a{EM.ŜUƆ~$vo%s u&ڴ4,DBx`iI0֤;zej،=VtXUB\zQ)D|2lv\Jǿ<{: /?Am<HSEd|K/A;?.z({sߛ7B[]vۃ]v۫qٍn/*EZoz%ƢJzdڒ6l+T)Ԗ8qh|*~:ƣأQO':4^y_vsKv`t}MDs (6JQZTvo)ʛX8\!'8E/Bnޅ0oG;}J%CNM`W^9e3ϔn؃ͥ/Oh-ԕ-qkח2uE*0O+8^.;&e%/ɍ?z/PQ ydVm1znhxd}C]G4Fݏۿ 3"Y%^7Z68:NKqXaL7fy/$/Yߖu?-bf~F׍W3ʞ@1%n ' n)11-θϹUmoi%_&)$hA$B>UX*w)q8d -J"u4Ch A2RlؘV>jöI N91Fb'łX$?|>=3egPG;#Az;K.U`Irܦ' )VĜi% m*ADs u\aW߸K_/.r^ŗ{h2|ob[o`@"`rz}sv4:R>#_D8Ү~J{H]ŋ^<:$ݧVzm?eͥmee'l(7az(n :QX.mb # E]R쒏əN3r%aV`)3Ƅ9ܝ/6CEyjjm '%*, $'T*x\ͻς}a zUf,Pr}ic%9adW`[`×ސ~xUEĜj孕AQuZL޵g% ʼڟL};}Y&Eq-iQ}x[yͶ~4Ƣ'!{u?<-_^ si$^֙JtMOL%$Bb4 ]M"Y!|R\Q~`ѱd*q.<5"{Fh[m~J(:?,yJ"E@j*NC0hs8 \ME{ѨU­KzcitĺLc&NUL߹Hrq}>w#L\$4lbpҠ? х($H(U"RF9s|7.]p3y~tmg}-b.q1칸;Sھl6^?P/7ҩψݕP Kn4` uuJ]Ncң{c2X+a::"C~)ŃwJ&Y::w2NoƑV-&zX*k>מ<ñIo(2*zN{F}2VW\+`rԘPSj}˘{C NyzwgstMLvFjO䍣,0ƀr`rr[ ,4vdyK/ۋRl48LKɺ_CKO m.sKW\x]='2[VHCYe0o} !qt& 8$lbG۰-cmpfd>xSv (< !"F$z[v.@Xl[ W6 pH$7Ij"T)WHĜH|Yqb6N8͏ lrASG|UJd*IySojWsk33<̠fm3 zTܹmr Isqc")l.Y;TK7Z- ۣnz\فs6cO/?3,!T]vqnOw{]%nC.r1e_^f b]7x`ޓ=<=g;\w.hF8NPoanq;;҄Ct!v &]\v+xjIfJ0p fu^õCLIc6"NT#,Ȑ(0W;. 7eex;6xfJcݫ ( 럷Z3/;ѯvVIZ+??w)ՆKBo؉MU(GQHÅPXi-LW= +*ltX;lvH%RjnX1VѤiW:N^8:Vs0PV*U K 88ɻX֤3J-._ZQ^QI11R.^*W\Zzi٥VlT Eؠ zQ8Yg |wHHܙ|(1z;skUv4؏W1`C*a/pٝΧ IIHF.P*e h"b*1b)I :-uuoX$sIףΈVeh?s< Lay2,$=x8˰%oO#irg8I%"f5f6~,Hi>?Mv8w KJ "*+Ea 9 $!+)KBp,ըE~=M q)׉Awy 3n6vmwko#9#h0wTX4).IB]׷?z"KƍM~vQ6km>տc6\s6re.YRڴۮ[/-֙kl:9|[~\nu%Si)]5[b*,|ꆕ׽ T_MТKo\67_oX*%wٳ[QGm)ky?;}tmۡRrvW;TZ.W@4 l0?h~`@W*-h5n.- 67HFoߥ4?}Tw 3t:B" Ye!q\׵J6Zֆ)ho!07]o>`U6WWdRpf~90N5Zv(u"\ԸNk2{Ii(Of L l!0)H2b5^Db-X  (~xtaHVr !E Fb3rGR , MOOްwK`OZ1+~-+kŗ$cɹB,?( JA`!0`@l0!}a: ģs):&wakԆOO%ڦg΂NM[Pm9k֞'a:ٴ%w}GsZ(pAZ"R怹H1Ki grt*-P&NBj  0$1 cj]m$/ǂ%"/rwwU.tsËs?ʍ޿Q[EjlJ}_)/1{/hu5{KVa&4˒>?gO,ScŬLˢ(E*R,m-Dr<$wKGKŚI ^Q-ϼތw }m=;?zaQۨ}q(v$")yRk*;Lְ=zN_)U(*RQzEꇼKΡ K9t.wlG&sIltE9a16Ri}D*=zϫRp MDN'/>cZȕp)_uuO"fLj&q` ڬqKG|C5d`2<*otF_ΐnޖJNb=Ouo.pW$RT9w-篵g.6G(:ĥ8,u ^t IHs&b{_7t76 ֣(s=K5fwzn)[9r,(ބݾ6B5% YSXײ6bFT4RJS_ID=Ekʗ؛KC*j1a =LOEy=sNh&jU0 pNЫ``/39^/`9|&3tFq+ύw*qM]tEsNWgWŪB)7|IԦ;xٳxG dFKOI U+ƬǬX@)F0lx~dA?ˆAitcr$_y8hn)Iq0cX b bc $T [0,K~oB&K($ɦcV>c^&fm{ 1 pd`K%V(z̸23X+hcBV >1|A B-dv`'x0huh}|;}w @/m# bQ. 2|Tv\ȮS^WPѿl(!P:VB .hFFtc)93kH*Ta󄪧ՌsӜ6ACUy}΄T0)qw*119H9aZ1BM+ NH/;>m-[>[[][Hu߯XUH.`ӏ4`Jؿ(\(*cO<]>V.qX(˙r Slvjr҄N*4Tܧ4%[hr'q)HңW|Jc\p'8t,T,}N?[[YmhPԃ9 oi /л7{KS?oR+.2ry\6,+ָ_U6+M ޻𳳅BϷ%"kekV)E߯Ws*qu$ OmD7<vpC~IfcF*L0*-5BPA} |y2e h"N!% -QRyy-D= mx1GZfK؟p;EWD_k%zɟ:dɟSܯ[Q7kJ/?iYY^jlkϯЃ6#3LՁC)]nAr+0FNci/5vaEyїYyXz%ߏu5“Eq es~PJS yȓ6Q7ztCreiw9)C=Ahϝy?c-ysr>9Ipnܜt,20w-+T[4羋9#Qi!|ϛ;!94T*s y=B?n_~#TFKkv*/Gy\/x)]NRsoȜM^tOӄ]4l_^'<8Ƿ/J=ŶsBtuf^K=N0ޜw+yZ@ۜ=B)N1^ {W^KU|\Цп[XIQœg7`59KMC<|F&\Oޖ#wB ޼=.΍Q>樕[pޖ>Xׇh T ymk>޼%379?GN*!8 NUP$d0~@)W~ũT2QIm1<įY߷w_ӻ_;k#] ?T7fȤ%>ם6PhЊu?!~}wWWf'?߮n}aha5|˶mqkw?Իw4Ϗ؞Jطot۽fu]{Q~c_@_ݕ= d--Yop!(wmx/34wӽ]yIsek\=VwP+ݛ`;w}ޮ!woޞ8ϯw@֡{`W/?Gw 3F{SL/FmV?b ̇2ݔ[}&và پ^1ܻ{oO/,ptf $3пpbHzgȂv ptKd|%<8PrtC!ҳ7颲ߵ{ܗ#3H>~ѕ邾0p_u$ǟ4qxN{Ewo?Yp?־}0Ho\v7#Grru``EhW+v" ;`29 -4z]r={z3}dDb޽]yBAt;w'v 51LX!;2N*Î{{$.kZ֯\nʖ5|2~5k׬WUrw7 wP)@?fUZD {*ȉ,.wm6趣 5u ( ܻ{D r/ޜ& g@D`h@3;p)% pᅽؑSͭ֔ׄ ]PD+灊DƷӾ]==}dP%J[K>T߮vd_ t20(D>|8 4I5Z00 <& c㇥(wwn k4ذJ2WWŒeɤL eeWVJ/vݿ݌$ȣG!1 !qVq9 oSen'wqŞ`c4'/V>yɋO^O^|b+X'/V>yɋO^|b+X䋕n?.]C}z/y?f?ysMrn1ĩf :_{r߁,Ze#8>e0>xO>e8aZ> ;I>^<&VdF 4R_r'BG!%w ;Pn6i/{o8c&.myI,@t+V`1{ Og:i r)kKyZr HH((E_6WثU*hsP%|CW B!@!U!h?IA8Fr^c:^>rm?JjavIkaɑ 9"|!m{imIRhNvOC`P>e pl/z]vIv`".ـϳ%U@$l @WvҲQLD˺[˶"Vrqub\18ħgĢkwQXFөH+FV+ AѪ$XuV k!!APγAnt).r1i@*iJ5PִB脐׊kH Ԫ*ȩ Zf> Z! NbZH_+8ϒ0jjJDzu xo%r?W׆jބ?JϹ.+亟;WX=j.D$YBS&JMb8,ނ" .  1(} JC-: cD@ב򣴎@?:Q]RnXQAi8ghyK1ZNZ #Jp Uw[`nA: !Ы&b48v oopME'P|t\'ЖOGP >Zs g hx#TEV(V8rPzjqA@|"b ?{ ]"L G3tG4ۍ=cwQ勱@qgg,gl9%]g˨cw9{nK#-ب#iӞ]T4(S )i^@Ϧ"LcM@ 5 h8P&qA=F6L 62LTcHJE,"%*!)N)_f1=U" TJpN> ;wiƟ k[ePHAl,nnvfkw MMH˛VjVt^S{r=Uj+q tw1\su+]K9TN\IB;0sjrLY[@RTENt֮}`z> endobj 8 0 obj <> stream x]n0 em˺w)BZ[Fm ,rei!\;X*]hDIX'1r,#4B)&aV) \|d f|@.)LҹyB.c/??z%?9#J)c):HOS+?xS;͟eAm2'jl8}֍ v7;8a=꒸ endstream endobj 9 0 obj <> endobj 10 0 obj <> stream x} x[Ź9Z-Z,YeIG:lKE^ǎ+8$'8,NXKh-R(r 嶽 -iP(z9v }}C'3?o3sd;(Ң݈EBX C!l4/*$B*Ͻg![O rk#`4z=B@b.RBm{/ f7 E?\.ҿ=rXœlu_C쮱X M!HDtS>"d|0<PA ++*uFKoKȎPeH :A6_:fb>ZE[aQ3.B]H 1a"9NCGmYX:nA{p.Z<eEtLzF߇VKh-L=s }ݎӑ z0z( Q+BЭ@C#G%Y _A ݊BSxN&OrM`%թPԓw7%&Ы2o@e8 (at:FXۣr|MOD}hė9-?!; `}at/=Zv|}Uf] !q6q{`h2TF!| >:c?U@ ]Z{!:^g9>NUL#qso r(_xn_*P'>ZR%t& {`\/F:rj+A*f} gnVvx: ^WjcwNA[^<\VZR* y\/qs.#Ǟm˲fZ&Aj*B.c ^.M||kk4D4&8hj9'R4\L0>)"&6p6X5\gM<77M|78Mv 藺`pYM\r͉{{!MZ#M Ci5%!l`5Sl9a 69ҟ\dw oI ~EB(NP4&tn*YKla M SYg@u^;9k#ս{ov-uhX&wo L9bzfcJ`JJ\_o&-r 5{i/&{or'#(ۻw'|w)]75c8۹=C(Cz > Qt[,& \t*E޾*@O7Q~PBػPCmæ{kwo ϵMs~8k]lћ쉖u"qM=,˔ha?Pβ*!eO(M){#J!a6(+`xLm3`nc.d; G@lfS'ݭ]YzJϧ?Ojck1f:sz$'_Ots&wyә2s`9<?W@sX=|ՊR`]x+b\W ŝc*ҥdu~2|GVSn8Czŵ5OIqqi>_nz&WBy::OBzd={Pb4gfVTþ<_N]=y>)k*ÿ̩^mտ\la|u&~f}=\ܡqϜyɐ['=N3(Ȏ EՇ4jΦ愪 \kW/Y\°/>.6Wm?w2/Fr4+s.),|y7i9+SgCƬrҖ !ߜ️%M35aZJh)ްVرZg< ! }z ZNjX\5:G4Ȭ ZFjtlzz='KD=4L8.9Z-Jj>ޣ<%?z/3ʭS {yylƼ:S+mwy\*sm}@}f \0c4EDa BsZ7µ=e4 9 eo.#,+(~`s1\> amdLS @+RԌZ` ZΥct,D5夘0-3BpŠY1rd\^g) 9st*s!jO-Q;{=xNS➒bp+2>"Q_æaӦ5+a /;c䀹yx]:>CnAz:i"UOSU vZj @X/òl+Ţ3äg/<'zĘ!.-4)֦56}8j<+`{:YFaמA L99Ò(>{Nv-Uuƫ*ÔV>Nl m?frM+tc}ݺ}Y*@cJPS6YI6[IPw|{tϝzX*k(ә}WO<+_m=+/yoϼIfB-Tԧq&N3^9dd]v^I#JjO4!m,m.M2&ƹIt1)v Tt[# rh3(z)VϼyfYp7;]Xd~D`XkId W $kRen[B>>-C3f fr X#hẌ́:aY.8䚇v,!%gL˔ٜ!hd'ʘ8fز;.w X ^i3zywjX82 /ĕVyx>CCsݗv]uh}g_re-܂w?9EK pХ0{̣AK4kʬM6YYҦ-#`G=;i5^T&V28sdv_R>3Z:B):;w]2u(;)yBƧ֘1?]I;*USlh)3ÆE?hl:cX@NTrdZsI.S.ݺxg-98 NG=7#~qI%ŏ T`G1{%`6eu CPA+5g5y\+ש ,ڕ6BZTBw0. S؉s) _Y.vWv6q@ٟg6ݑWI (MNIc]F0Ybr >,<^J0ׄ7GaEؤWTJ"._p|Ots2M\' YaJ0U\MsJ,x=)30p>h 4h dH\>E)@@9F vҭ2End"өwΦ~71A$SDwo\NP o6~42 CB>$ZA̹A` XR0Ԟx;ESdq-û/zz!2xrqxIp" \E]̗4Ԙ91Ɲ6x_o)^^;x[pW>zhb0/ VzoqK_S;veU$~u|G^5V#~Qp!7_PouPHp~5;12v>y,׈%9Iس㓘a3X;ÒezۈiVF6B 8#G7}+)UJx|ΑǕX`JW?=H΄X~j jcux5&k5ݞ{&s~ʥI ?=zr_|jYZa= *Ju~/Ҧꦎzk,PDNdNmEuVE;ݬ"ʀ8Ko C1 E`k7 gT;&A*6+\L%spq.ŗ -M(ېdo)U>Fe;; KI"Pxyy ˗[kf<>,!fAH7e/421@aWIfWr&1Oϩ*b Yp0)f=Km^|,f(q}yEdj \;B~~*Ll,veטrs ű=rEo>.t=۩o}A>T098xf{ :ʮś6\>e6pˉ_'M&VUBة6 9^WPѓajJoy1J;8ېcza3u=VJT"ƚҫ1:Ǽӎ}NWzE=}[4!-"{,MՐݐ^Av 9zP{7GJr7+7vn<'ßɌr(2L2 fl0rD 89&qҠ2!)3|Tӛ?!Q/1&.c85I' 0|/s=lͻƺu<¬ars5|U6ݓrsa1ooFA%C8)ll}[`U=\Qt#%ƴ[[nޗliiL(,wZjr(90BG@ 7(XJ,%3`dV5sTU_ڬ&KPkL=dǔ/)z娒Q <`Bh`:/pg@Ɛ9?pLԹ9[K z^"d6sFbN=FjPd{HB5kk;x|-<1eV%W>Pg)|>m@$#\/]a(OVe>Po3'ƙ+.\ /97v@RL.t 6\BR@ŕӢ6 {^W>uוBx]ỷGxa,^W += ˜2@Z[ilRdg ֹVY՚׻ޟm;mێX^s{EA ҮcAV 2אUTW4p/m8hH45!Ȏ7 7y+8{{!\M9ɻXN `Aw pyC%vF'Wr|%"'V(l'BR'kkUS93ORV)1}KleZ6ZQuhZU ,ZiA=c+ Bπ;ҤBY,:JZkĺ^7H$C5r솉4W lgV,T|3tl3 ;&s  9yA9dwʡ)|Cㆍ:oe~pX<{&w}|Z4;K/M ^m>^qP_  6SHW %2Pu) R^GVTkJIa2*r}.nt@gJ")f-R(ΰ;K0%BIgXDu&AS;=km9Nu2pVrLAkEQDB-YJ$zZ|SJL^Af9m×[U}Nt_6PՅtPBt),L@~fJ悛V{PK͜mtYp }tcw(ۖ"%/ry~bH[rڗΜ.``Ŭ`pyἦ<6wɏf?P 9e8C#_`- ={f(UQ ~I8OeQYļgiE2Ԫjɝ'zGUL_fdk*1/Ek_75?ؾW4Ϳ-i\uet9*>˞_czk:ܓuYn!zivƚBOqoAKo7~ܞY_ʦ?7u+-gjE1)\st=ߌ.ZD܏QQsObY j!t@~PvΥoDjT-Tv|by.h=$وVB#P5{!nBfc't H0X~ ,<+ TKH _H]ϼ/in ֠ կ$XԭSVW%-26|_1K0d̢ cːxˑx+P^ Va$X2LFe/2La%ы.l? ڵ$X mRXM`Я%@Ǿ\Af C ZA?K07!ߜ@~wI07 C I0 ӈ/I0h7,C d- R8X~`PqN (cLL " (l&K0SNa /` seR'$?KaOI0Ź+%l Or ~{(ߖ`/Kl  Ha?OQ|DI$(j`_"ʏhZI;OTI3z)yShBc(PAɡ!m@nGhR\P#&&yڇ(-0&R -rơ3&qbF~nUUSTJ[`0`V!NGz1H穣Bi:IqF-Wy?{yq#kF:[lqu*9t` 4 >1Fxqٱ 5m8\ߥ#>6AWZ!5N@A%pLsGk| =@K8$@5Fy} O-¼1XQjo'jCM)2%aP-?N9I5[-D,H9P"wg1Aѵȇ@}/hJ24#]ɀ> 8mPZ&Q3(P]$an E)_#R9"vRms9*IP3%REaLmA"ֶR9EstsQShJ-Jm!Oѷ#Pm'|TK%,hDtdDI8)zDeFvPC2VF>Ad=!=m6a|L\ j9]./ڥ()+qE랤)MҵsvRZb#KJ'5BI:H.BgO)ODi\/HqO.D={&#ar4F%;$EOsNŅ8uɼ$vSIO,/.bO,۳-a5>[/cΞ bYQOГTzDZv)JjL\W+:k?P<ŖFiVG>,eQzro( qhQi?=w_\Q=WE>$gaY@O Hý0*nA^ ܖÐyCt!j0z\ wJ:Í$BwƅЇnD܆(>:2&qtblt"ƆH&bq.26H<tRe 5Dw"cщBnf987 Ź mqܪ87--$0 &0e뛈Rƀauh$2q;AXvP79򀡡hUĖ>ahhbtr 腋^ĆvDaQU&F ;&&'`Y6"}1nE$%Aغ8HqOi2FFvF'ƢH|<$,r;b)Pm`d"cZ|/m鏌Qn+YG0Y0薡L<96 H;QLetp}P9deh{dkdH4&ZD< QBG&%plƆ#SbcD|h0 vY]dNh0}8=NMh{lsqxdwF%!k6jYذa՚nM zUcsfa 4]E! PH c\j "75:IF@4YBzXazdD4JVuð(ktK< i;q@AI |[.%'D4)y/Y`#܎$ )X,_:</>/>/>/>/>/>/>/ {5Җ舕4;r\oCנow_#ZQ>gGlƉX4*?\N$0IOb=Tk_92NL(UrY|ɘO,f'F$K|g1ۤ3O %؈~s1x4/7 1#9;\*B(e2v$sJmprANfiJX!U"0Ԑ&C-H 0h:j&ǡyǘ0{fFQ*4ؿNH J$iH LKDR࿅8HY1 Ǵ.@"oddLtKJ;og؟#Ai(P>=3zCnMv 6-v*>*dhN:/mHc^AQb8<.vݖ,uqG{S}cF!4XJc_c!3`,K;BJfgԺ Zv9 bqIsy|Q&c W'-({ wwRUF]z\z_@3*E >sB}W/o&MP͛774"c_@! HN%AG(/=^^0ahjFN8"iʠhWhKcGk 1kVQ t)gd/j-rQ0pcnj*=TC#={ KA: >H!Ih` fH,wΤKGMtdz1J՚x(+gX{m#Yv$]$ &3U5G6 $բ4ΤtM1Twl-u1%_c,nh!/1Rv)tR Y 襠Rt XSJAbAmH zH =$$9m@{1 ~H P AnH Azc0bwCJ@z%;47XQ!BmB FxfeiôQ% dUԻlZPwYS375eWXMߴ~;kܯدd5haCx [Xt fA=VR[ujgҋo |+ ʅ"skl3;NX ` ^͘f%S4ٯ9Ih45bNq\qRBީU)v++(.eHY@ O@bnS@{ ?Ni1Z y1 @7:$Bm B+x2ȋޓ^&2s 5 tSy<z!y'xȋ <+ 6;!E!!Қr$r}&t,s{ X8"3 zv {;cnK6ےŢ쥆j. ;;)B)~$ ?8n3 xs;<gvA.AàLMFiy49dr2(f"I ZN\/hxyݏxݷy]CsB4 ^ݫ^S^7ޣ_#%Znʇq9}^t?t?twqnNW: l:5叄u=ʀlI=Re|1ұiIkUӂq'sI7@aO";>EFfWCp2q1ڤtkB y_I??(O8x/9]R| 0@99 _G,#1B9lGaTs9N|({W,+9P77C)(nOz|JVe,nd;0lA1l/b[gP %N[! ֍rI{O/Ad;I !ҠBp#9"$ŀVX.J69*2ƕo* ~!'+9P39 2YM2eL !\4@)!aY1z_UoPtݗ?`}``VU,K|]r]Sϸ.'Y]CuAXVovS?k}9]C]Ѫ::@G=]ТDF(g~溰{ x7 H* wJҩ4L**]UT*JbTH3;f e60w b(1mW$*mԺDU-켸_m>ԶKik7% 0 +9|v ]8EF\g'quwwY:cuKdRtsj-m8H98 367adבv< h(cj'1:,AÇP]"H4k(&q){nHM~&Hha-Ҁ*!_)^{;_7H,g}"Gg1o 3wtWoBMܴc0+{ !#-}D;hSbo-.ҽo:7tMf>=ӱjn\jCU:?{tw\dնnn:B+_k Io鵻Wd,sg]eT}HNh $l6.piҕN+en>F~g55|Ic1QYbG> endobj 13 0 obj <> stream x]Mo0 9v@HH 4B~m:smO$F9;aiƕ_eI6aM?KCnn᫣:x`ɫSԄY#+Ku[Ҏk]~Y˟X)=EN fJpBQr,]/?[i ە3%8%"xG>l#Hu<o"ID"&{&:ҟ#WTGNq ;]˛sa|0[6S;3* endstream endobj 14 0 obj <> endobj 15 0 obj <> stream x|{|Tյy&ɐ9a!dBy"` π%$H2̄Z+>ZE:mJm*Xڪh᪽,Vܵ9y z{~s^{zBB~ap{=3MQq2nIw!s{;/(7h]7ttPiye\ @r1;Ǿ}mAcz.gNl4ED R[^Wn6qv@NS6{8x:x> j:~4 yRE'3l#Y=|YMģ*'<9~ P ] p`wIjd/ÃK+H{9\  D>Mxgm̄JX ~\x=ed(#rWGc/:r ^|^Eo?q7 π !! "tDd B=BQ.G$\-T*G‘Hef{)&Khf}> $!-=0;$Zs&H\XW!auchP#~9 k5`-J(wz->[bA|Y~ +'+::Bq>mC{W>M OkgĠG!PSɷ[䏴n? WB7O?HY@VoNr5|C^!Ǵ6M) ?F knܪxqkcDnUסw~8 o>|H4$# |k!ZF3L|4@w}(>gB0Sp B$Q;yF@Gڹ@CSKym[zпrν7c7чVQz>;0➆I4Jr"rZfH ^c.S9iDm\G )r5 NvE}z!w{2M-=̡m_vI?"ͳ0,@Eț٘aVNAKCP8 *hNX宬tW,|aY邒‚ysrfgrfe:ffH4kjJrRbB|c2:F(GmvEc9`gJGKX®4aI)H%JB鞠$fJ5)JC%WjDjG>zq8AI鬖¤E nivGUqN.6F!X8ѻ$/"5e)M(Tꨮ :a!^:-#iNnTyap,Ǻ8 Tq6amUXH> *=4|ۨZ[\m6ưib<,.[NDdjih0\Xsx&)Ʃlj5p.ͪmEַHȍnkj mRb0dG i( Ŏ-pVfX`4Gڶ;WIuKG6[UhTD'gX &cDXJ(IuZ y { ~ G|aCU˰aM! 0<ǣh85.W8' }2.9GkBJ,͟|ZZը%hMw)L[ȡĵldh|dbz#y/&ΉXsR|MgY$}Ͱ׭qԭQnQm[0/Sp|UFU |r1k4F,n1*yj斥Jd'FΰY.sMo/֞&^!XpqpZaCCcT3g4rhMV0.90MśâsNn-&ZT;2 :$cx?}>?[28kokB[u9@ |jo:XZ(Fx@^9AP7/R\ʗ?-?Wb K% Gp >I<ޮvY  Pj:Ӂ SPwD(JQA"h6.\B>͌rPŕ7BKFb]»_s+5+{\;^ ""umضh$gSVkJN^Ԓԛ$$b4?`ff3`>6mbTۄrfMdckO鎢vbO*4gܙ9Ev]nNХ(ZϝXnsOAũs'*NqK\ii\鼹I_$k`1CaXtIIIs1S+\y /?;M&^8{۹wn1.Nf7Yz@'ƪGj%mhl(!3wLT5g)'4?$,gYN9gɗ2wt{~`}̔HR>z4f뫓=ٞ)*KsKs\zksM/Efe))!9?( #!ell:ۖS=fgL$F31BLMHf6OJ;fA,cM1{ +#s~m)9:vjJJ49+ef~AQ-k+T;oF[ߩOO\gO}Z~I@  sBߩ>fb~p͟_Ÿ"ݬE ) > IPDKH$sKK7A kn:8#s얛_i6$|Ζzؿskkض 1&kfg%M})}ֹ=m9Kwm-Xqh|FD,QP*m2WQF5τM":}E׫ݩA'ЅuttZR,54}z|%3!jH_bre%39-BK0aI`J[roa3Ļi^$?D]N}# w?VT)=;.O2I$>)J F IY)Edr($/2g5lXEktL"10HcѰطYK*Z`|\stKd)$n=z'"1VCDSrȅ Fkܦ" a"iI:@6` ϫd\M Ef-|{o.Ԓ#XX{- !o0Rєe*2U4 Ŷiqu[moB ͛咽?p:?RO8nؓv9}V+K6ݲ膘Mm1W]Ksq''XF4mt3w=tYY1[6@jLQ=+,2JR1'h }>%4L~c̍AaXw V*4d[yc?*7z_k07`ɝgb\1ט+JpM7|QE Mzӻ#.}֧?deеOo}Gӓ?=[vE ק[C3Noqx»-[U/_zנ.K B¥2>2̗0zI"9K%抯``|XFzkn3KKb-ϊ!zJ"IH5x\Zߡ:8L~zpN70CōBGAv}{x ]7a#*N@ct*.@K5mSq-_:h5ߠz7DzHţ`^Ή(?&Ac /%!"zt0$Z(u#. >JyMG)WqQ'*>J]U*>J8(u@Gօ*>zT}dGٟTq#_GfsQLYx41W43]fx5 sUhǹ. 2XKBtrЃR$~ J8=]8?j?\)B2 HOo yP\bgtat !>k5Df,ې*d#ȣ [-B)} 0 `){M=zqԏ~rfOYfNRԣ&[Oq2{niCIB\"f ی& J>_'W mAz6OULZdRGL^J*RuLQ;H'J;!{xKA&*.I[ynEB*J$xdXἦƋW]ec3LNWT/q=W2¤pyQޫzP SGs8R{نڝSZ ~!"^5RхpM[ŇWf5~cܢ]|>[5oVTMVB;]j]}u&>N[^ (]8&sjpB6כ\M^$u۬||;Ucď%ћUk++LfyWǽizST4ݾb;n. RNׄݼ5/D/UyۦŦ }?n~oؖx l MLveԬ즠eSU|"5[G'#Mƭw{xdnʃ!Ŋ!>\{y u9.[?B8Vgi>˞ߟc_y0+{)K*|˛'U{B(-&w+-;Oj_wJjo:9d H>ofsWM6IZ `HmG !5JOHrJ Ҋ<&]Ay&VB}Oo.Yx|=lM;GZoť.O0y}i u@3-(n&[`P zЂh$_&}=b/Ry|8RgŗNjj`  >4y/*({`ЏB\)ԥ=4 ur3tml6Q EBrO'#`-,ee˪*X..[VU|MTduMM}dlD[E Bܢb\LAifzY>R(_{:"1Oji +F834M,dt,!s;qR.BI'k0z[C45EYq0'L11Ei1BΓuR3G ^&5Њ=<\O[Feg\KBu}L!dMA%Hyyw[XG.%%XNrW{;I<(_=Bd |*+$iv,V l@؎AXa+A3|-$UV^U7\ޤzBV+R+\*bTp2IHc^, = !@d: vD 9$H#4āRF=1iXV D8p4}|ޣ!ջPa'A:.fdxLjXbwPGJJ sĕ",INSQۑfGH.sF \ V" "h{ `NZy Ax-FXF(=:\lL_A2k^L_o/yX/ۡ2 瘱6c=qHDرG@Xa;3GqȳpDH9xHv cLbİ)tRs=dccck3bpmD+6 İ4sd&"UZi4"`|&2~0횝c:@#CCdH&CגP9 Ȑ !7z,@S iRw :B$CA2$CYd( I=J3FW{*پE(cZ4:A,"DxˍDL853T(RN| ^0zaeC"Zoe,"FrqN#P">W^Z|_ɠfe^*lt"=NK 82JLaPiw0qZol}|2|E:R Nv1.}:;̵ 1l>gOlяm'd&<Kzy9J: q'ppgƶľde ܱ+Kqj[5+lWb6g}.Rv3uזNwnQB7_We4]>NoF^Ջz}hsE*JfJJ.pPG,&uC^kg8Fqac1 A]Wݨ.:\ V~q7!w4ao> endobj 18 0 obj <> stream x]j >aqB`ٲCд`t 1}uܶЃgᛱtѡxV訍KLڐSeExY8RDm-ΌiHsKݝ/^fK~u f02ҶT< ,f(PTL}s@9e" ^ HXK%`Կ\ɲd𱴌Uu#će T%>fƚ:3O|B,=jd1gt*Wظh7M .|_ endstream endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <> endobj 22 0 obj <> endobj 23 0 obj < /Creator /Producer /CreationDate(D:20110919112357-07'00')>> endobj xref 0 24 0000000000 65535 f 0000048860 00000 n 0000000019 00000 n 0000001992 00000 n 0000049003 00000 n 0000002013 00000 n 0000021369 00000 n 0000021391 00000 n 0000021590 00000 n 0000022028 00000 n 0000022322 00000 n 0000037600 00000 n 0000037623 00000 n 0000037829 00000 n 0000038194 00000 n 0000038428 00000 n 0000048006 00000 n 0000048028 00000 n 0000048219 00000 n 0000048558 00000 n 0000048753 00000 n 0000048805 00000 n 0000049102 00000 n 0000049187 00000 n trailer < <46F4C118FD5695FACD59C6662AF33DF1> ] /DocChecksum /EB3DB5A503E55D6801D44D88907DE7A5 >> startxref 49444 %%EOF GenomicAlignments/vignettes/summarizeOverlaps.Rnw0000644000175400017540000003243313175714431023446 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Counting reads with summarizeOverlaps} %\VignetteDepends{GenomicAlignments, DESeq2, edgeR, rtracklayer} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass{article} <>= BiocStyle::latex() @ \title{Counting reads with \Rfunction{summarizeOverlaps}} \author{Valerie Obenchain} \date{Edited: April 2016; Compiled: \today} \begin{document} \maketitle \tableofcontents <>= options(width=72) options("showHeadLines" = 3) options("showTailLines" = 3) @ \section{Introduction} This vignette illustrates how reads mapped to a genome can be counted with \Rfunction{summarizeOverlaps}. Different "modes" of counting are provided to resolve reads that overlap multiple features. The built-in count modes are fashioned after the "Union", "IntersectionStrict", and "IntersectionNotEmpty" methods found in the HTSeq package by Simon Anders (see references). \section{A First Example} In this example reads are counted from a list of BAM files and returned in a \Robject{matrix} for use in further analysis such as those offered in \Biocpkg{DESeq2} and \Biocpkg{edgeR}. <>= library(GenomicAlignments) library(DESeq2) library(edgeR) fls <- list.files(system.file("extdata", package="GenomicAlignments"), recursive=TRUE, pattern="*bam$", full=TRUE) features <- GRanges( seqnames = c(rep("chr2L", 4), rep("chr2R", 5), rep("chr3L", 2)), ranges = IRanges(c(1000, 3000, 4000, 7000, 2000, 3000, 3600, 4000, 7500, 5000, 5400), width=c(rep(500, 3), 600, 900, 500, 300, 900, 300, 500, 500)), "-", group_id=c(rep("A", 4), rep("B", 5), rep("C", 2))) olap <- summarizeOverlaps(features, fls) deseq <- DESeqDataSet(olap, design= ~ 1) edger <- DGEList(assay(olap), group=rownames(colData(olap))) @ %% By default, the \Rfunction{summarizeOverlaps} function iterates through files in `chunks' and with files processed in parallel. For finer-grain control over memory consumption, use the \Rfunction{BamFileList} function and specify the \Rcode{yieldSize} argument (e.g., \Rcode{yieldSize=1000000}) to determine the size of each `chunk' (smaller chunks consume less memory, but are a little less efficient to process). For controlling the number of processors in use, use \Rfunction{BiocParallel::register} to use an appropriate back-end, e.g., in linux or Mac to process on 6 cores of a single machine use \Rcode{register(MulticoreParam(workers=6))}; see the \Biocpkg{BiocParallel} vignette for further details. \section{Counting Modes} The modes of "Union", "IntersectionStrict" and "IntersectionNotEmpty" provide different approaches to resolving reads that overlap multiple features. Figure~\ref{fig-summarizeOverlaps-modes} illustrates how both simple and gapped reads are handled by the modes. Note that a read is counted a maximum of once; there is no double counting. For additional detail on the counting modes see the \Rfunction{summarizeOverlaps} man page. \begin{figure}[!h] \begin{center} \includegraphics{summarizeOverlaps-modes.pdf} \caption{Counting Modes} \label{fig-summarizeOverlaps-modes} \end{center} \end{figure} \newpage \section{Counting Features} Features can be exons, transcripts, genes or any region of interest. The number of ranges that define a single feature is specified in the \Rcode{features} argument. When annotation regions of interest are defined by a single range a \Rclass{GRanges} should be used as the \Rcode{features} argument. With a \Rclass{GRanges} it is assumed that each row (i.e., each range) represents a distinct feature. If \Rcode{features} was a \Rclass{GRanges} of exons, the result would be counts per exon. When the region of interest is defined by one or more ranges the \Rcode{features} argument should be a \Rclass{GRangesList}. In practice this could be a list of exons by gene or transcripts by gene or other similar relationships. The count result will be the same length as the \Rclass{GRangesList}. For a list of exons by genes, the result would be counts per gene. The combination of defining the features as either\Rclass{GRanges} or \Rclass{GRangesList} and choosing a counting mode controls how \Rfunction{summarizeOverlaps} assigns hits. Regardless of the mode chosen, each read is assigned to at most a single feature. These options are intended to provide flexibility in defining different biological problems. This next example demonstrates how the same read can be counted differently depending on how the \Rcode{features} argument is specified. We use a single read that overlaps two ranges, gr1 and gr2. <>= rd <- GAlignments("a", seqnames = Rle("chr1"), pos = as.integer(100), cigar = "300M", strand = strand("+")) gr1 <- GRanges("chr1", IRanges(start=50, width=150), strand="+") gr2 <- GRanges("chr1", IRanges(start=350, width=150), strand="+") @ \noindent When provided as a \Rclass{GRanges} both gr1 and gr2 are considered distinct features. In this case none of the modes count the read as a hit. Mode \Rcode{Union} discards the read becasue more than 1 feature is overlapped. \Rcode{IntersectionStrict} requires the read to fall completely within a feature which is not the case for either gr1 or gr2. \Rcode{IntersetctionNotEmpty} requires the read to overlap a single unique disjoint region of the \Rcode{features}. In this case gr1 and gr2 do not overlap so each range is considered a unique disjoint region. However, the read overlaps both gr1 and gr2 so a decision cannot be made and the read is discarded. <>= gr <- c(gr1, gr2) data.frame(union = assay(summarizeOverlaps(gr, rd)), intStrict = assay(summarizeOverlaps(gr, rd, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(gr, rd, mode="IntersectionNotEmpty"))) @ \noindent Next we count with \Rcode{features} as a \Rclass{GRangesList}; this is list of length 1 with 2 elements. Modes \Rcode{Union} and \Rcode{IntersectionNotEmpty} both count the read for the single feature. <>= grl <- GRangesList(c(gr1, gr2)) data.frame(union = assay(summarizeOverlaps(grl, rd)), intStrict = assay(summarizeOverlaps(grl, rd, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(grl, rd, mode="IntersectionNotEmpty"))) @ In this more complicated example we have 7 reads, 5 are simple and 2 have gaps in the CIGAR. There are 12 ranges that will serve as the \Robject{features}. <>= group_id <- c("A", "B", "C", "C", "D", "D", "E", "F", "G", "G", "H", "H") features <- GRanges( seqnames = Rle(c("chr1", "chr2", "chr1", "chr1", "chr2", "chr2", "chr1", "chr1", "chr2", "chr2", "chr1", "chr1")), strand = strand(rep("+", length(group_id))), ranges = IRanges( start=c(1000, 2000, 3000, 3600, 7000, 7500, 4000, 4000, 3000, 3350, 5000, 5400), width=c(500, 900, 500, 300, 600, 300, 500, 900, 150, 200, 500, 500)), DataFrame(group_id) ) reads <- GAlignments( names = c("a","b","c","d","e","f","g"), seqnames = Rle(c(rep(c("chr1", "chr2"), 3), "chr1")), pos = as.integer(c(1400, 2700, 3400, 7100, 4000, 3100, 5200)), cigar = c("500M", "100M", "300M", "500M", "300M", "50M200N50M", "50M150N50M"), strand = strand(rep.int("+", 7L))) @ \noindent Using a \Rclass{GRanges} as the \Rcode{features} all 12 ranges are considered to be different features and counts are produced for each row, <>= data.frame(union = assay(summarizeOverlaps(features, reads)), intStrict = assay(summarizeOverlaps(features, reads, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(features, reads, mode="IntersectionNotEmpty"))) @ \noindent When the data are split by group to create a \Rclass{GRangesList} the highest list-levels are treated as different features and the multiple list elements are considered part of the same features. Counts are returned for each group. <>= lst <- split(features, mcols(features)[["group_id"]]) length(lst) @ <>= data.frame(union = assay(summarizeOverlaps(lst, reads)), intStrict = assay(summarizeOverlaps(lst, reads, mode="IntersectionStrict")), intNotEmpty = assay(summarizeOverlaps(lst, reads, mode="IntersectionNotEmpty"))) @ If desired, users can supply their own counting function as the \Rcode{mode} argument and take advantage of the infrastructure for counting over multiple BAM files and parsing the results into a \Rclass{RangedSummarizedExperiment} object. See \Rcode{?'BamViews-class'} or \Rcode{?'BamFile-class'} in the \Biocpkg{Rsamtools} package. \section{\Rcode{pasilla} Data} In this excercise we count the \Biocpkg{pasilla} data by gene and by transcript then create a \Rclass{DESeqDataSet}. This object can be used in differential expression methods offered in the \Biocpkg{DESeq2} package. \subsection{source files} Files are available through NCBI Gene Expression Omnibus (GEO), accession number GSE18508. \url{http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?acc=GSE18508}. SAM files can be converted to BAM with the \Rfunction{asBam} function in the \Biocpkg{Rsamtools} package. Of the seven files available, 3 are single-reads and 4 are paired-end. Smaller versions of untreated1 (single-end) and untreated2 (paired-end) have been made available in the \Biocpkg{pasillaBamSubset} package. This subset includes chromosome 4 only. \Rfunction{summarizeOverlaps} is capable of counting paired-end reads in both a \Rcode{BamFile}-method (set argument \Rcode{singleEnd=TRUE}) or a \Rcode{GAlignmentPairs}-method. For this example, we use the 3 single-end read files, \begin{itemize} \item treated1.bam \item untreated1.bam \item untreated2.bam \end{itemize} Annotations are retrieved as a GTF file from the ENSEMBL web site. We download the file our local disk, then use \Biocpkg{Rtracklayer}'s \Rfunction{import} function to parse the file to a \Rclass{GRanges} instance. <>= library(rtracklayer) fl <- paste0("ftp://ftp.ensembl.org/pub/release-62/", "gtf/drosophila_melanogaster/", "Drosophila_melanogaster.BDGP5.25.62.gtf.gz") gffFile <- file.path(tempdir(), basename(fl)) download.file(fl, gffFile) gff0 <- import(gffFile) @ Subset on the protein-coding, exon regions of chromosome 4 and split by gene id. <>= idx <- mcols(gff0)$source == "protein_coding" & mcols(gff0)$type == "exon" & seqnames(gff0) == "4" gff <- gff0[idx] ## adjust seqnames to match Bam files seqlevels(gff) <- paste("chr", seqlevels(gff), sep="") chr4genes <- split(gff, mcols(gff)$gene_id) @ \subsection{counting} The \Rcode{param} argument can be used to subset the reads in the bam file on characteristics such as position, unmapped or paired-end reads. Quality scores or the "NH" tag, which identifies reads with multiple mappings, can be included as metadata columns for further subsetting. See \Rcode{?ScanBamParam} for details about specifying the \Rcode{param} argument. <>= param <- ScanBamParam( what='qual', which=GRanges("chr4", IRanges(1, 1e6)), flag=scanBamFlag(isUnmappedQuery=FALSE, isPaired=NA), tag="NH") @ We use \Rfunction{summarizeOverlaps} to count with the default mode of "Union". If a \Rcode{param} argument is not included all reads from the BAM file are counted. <>= fls <- c("treated1.bam", "untreated1.bam", "untreated2.bam") path <- "pathToBAMFiles" bamlst <- BamFileList(fls) genehits <- summarizeOverlaps(chr4genes, bamlst, mode="Union") @ \noindent A \Rcode{CountDataSet} is constructed from the counts and experiment data in \Rclass{pasilla}. <>= expdata <- MIAME( name="pasilla knockdown", lab="Genetics and Developmental Biology, University of Connecticut Health Center", contact="Dr. Brenton Graveley", title="modENCODE Drosophila pasilla RNA Binding Protein RNAi knockdown RNA-Seq Studies", pubMedIds="20921232", url="http://www.ncbi.nlm.nih.gov/projects/geo/query/acc.cgi?acc=GSE18508", abstract="RNA-seq of 3 biological replicates of from the Drosophila melanogaster S2-DRSC cells that have been RNAi depleted of mRNAs encoding pasilla, a mRNA binding protein and 4 biological replicates of the the untreated cell line.") design <- data.frame( condition=c("treated", "untreated", "untreated"), replicate=c(1,1,2), type=rep("single-read", 3), countfiles=path(colData(genehits)[,1]), stringsAsFactors=TRUE) geneCDS <- DESeqDataSet(genehits, design=design, metadata=list(expdata=expdata)) @ If the primary interest is to count by transcript instead of by gene, the annotation file can be split on transcript id. <>= chr4tx <- split(gff, mcols(gff)$transcript_id) txhits <- summarizeOverlaps(chr4tx, bamlst) txCDS <- DESeqDataSet(txhits, design=design, metadata=list(expdata=expdata)) @ \section{References} \url{http://www-huber.embl.de/users/anders/HTSeq/doc/overview.html} \noindent\url{http://www-huber.embl.de/users/anders/HTSeq/doc/count.html} \end{document}

HH"4x).kuַ7AKӴqo 3bȁ |Ӣ?S~Dq3Q7_7Q|w Б 6"/xXxA.9,[D'ɜyAϚtT0h_tȝc*h}JO.$I"F_c( X*.!A< m!  mN H .R kN6̦7Xi8W+|YaPTI&(6_$ T2*~ |t|u>,57ҊGKϖ,=9:.Ofa>134Wr60!Qw},'6KR"Xuc8֍y&zlxw'|6մoO9Z~;![,=ahέ)P*n $>,l9[L_3=HI$f*'7ՓJ EWzBLV+~'yb}p] հeSG`X}ZWR٧}\@`ӄ$b"&qCFHh=ybyNGm\:q&13@&DqV/~@i6PE{סHȏQ3& {0:#̉Hgwu4VT5Hрj8ʹeLVO5 m]l^WdEr瑰uds,-AN Z`V芘/%bEsj@l6cSχkImyh0h0m]J"YBkZc2=BPq^.zMr(I['[o=5'(( QsQ=pՓSr?>)N&DYע` Pעx֤vɶU'wK\R9 )ЀGw<M,Ŕ1s) 1cW^RHW|6_8lp,,Y<[vc8AƷBUrI4o=Ro{!wQJ^LIꭜ)fYMu?1 rXJ{KūhVŮ:Pb:+4CjʷA'!(F?uFe^s/%Cߏ"*@ ҁ8&*ZI\SfBޘQ :8 ]7W5O H1L: 9)Ada C%QDy5{SCarZDEdPX֎xc(D}"8l]WCmz*/N盫aB -nRNRA|@j$se~W'3v/6RΔ\\.ZWQq1Լi $PdyC߯;(HcQ7da+>(GNMro@+&F!&!"E@a4P$*J@QPHT~hk`XA"!+L4Cipܺ6EܛQQa1 laJ,%}nȥ&9B ,"e_FoN ma"y [0sM 5pBty3dQ&o+`aBf]|lO@ O؈,Ub^{Wt)|,Cձd?TAX݂tZO[EES-Idh_$qbž'(5{̹C _w㋤GPDAܸ"aYX,}e]ٮC`T$8 ߘH݂""rFȐC!k\B%,AL${j qZ`]0R;`u\/+A9]]w"r(Ҹc@aZ.Lk(x}ƛh0b8nD\iM֞-өb[dN|\'`SēՆ1[޹ =`'J-QM>t_Ị" '֪:2apAD&AY煃wGۀP`@vBQ6(6 ܦFtA$6?Jޱ8@ >֋Yq 2У(D 3:Ko .z3kY`(Lr`pL ,_ǾF,0!h-E@&:nuR&ŢRs _I*Yxzo񸿸TEqWֽ_&; 8k*Z:̰*Kxap٤[%\.ExF^)|>nū^ f$E %}ugM˱cglR*"?5x( +0ҳf~Mn@*A(kx91[:](]Fig̽GOFj)繐Wx]gEeYaٳ;3i Qx ;w/WJwIqJ qcQΆpX ꏯ8&0 y` m^=󼌦뎺1şg!:}²]#@<(m- ()+QtQIopTZ'!9#gamOaؽaDOJmoxaYՋkQnATCQ:,0J(ޕ|<տaH;p\;HYa6tEWKUR/'Qb;>1 ׍5r#+td%1|'n8@QTR78}:RzLc:lui0ċĺ7HBOA`UBO<UOI0k[^ԡG by8dʂ]c G|\* =0>Nx oK^y"p7_+5QMw rJuۤdfQSOUIX8<d}*YĴ⥢/hR+IQmvݏ_b.=(ߔʁܦa(K KPЋ'ד>P^(b(#҅K-׌aW_G=Zy%59hVKz3r49f/tx1¿ |b{% XԶ-efm&Q* p j#1BHDqIeAxFFYΕ؎hz襈( $>2@5d'/2PHd0?/v >ka~ae 5Mt0sBH]=),HAѽ$l`#2⪗{"?|+[zs)ER c>E,.I#FU~N?+4XuMBf0C{W~ZFG &bU]嫽)(`G! ׌F~%~ u*v"6wݶYaP )ZEgqx(P f \YERX1nHN<̒,PbfaA*v[4Cx^| ($]f]ڠ$(w@{U$i -3 fdxS(.?8 kA9 ?8W_0ԏ .f$WԱeuJb4P*\!NIi 240 ?k[AQP%Ԭz(C4Y}Sԙ^}z-(OAMJ]X9!!}X BbJN~ -2 8Ѥ]!JQxcuȂNʂ2I|DY)2Y FJ7IKw779*  f~*dfAlrxBlU(MODFy23-Fq+ŠBHsMngqX 0ro^qfɤxxcJ õaD8<9a n#D|C U ?XI(*E.|ta%۽2-x?@=ݏ}LoB,08S@9{H޸Dif\R鏿QK¼pf Qot0go$^'a(=9Dd ^6}$0)%L 8.qSY҇SN Cpu%s9+u,C쩭k1d[Hdy{b48OrO[([1]-(C?ԫY*N G8!tRDjq~mͪt){ų2E;kq`3 ?r%L kYp, 7lQv;_*+߄ShV'ج3u /"5DBksjYe"l`1_xS)V]90WQa鰕:Jﳅ Tl[( ȣ&ldڮ~ł8Ho$+c{,j"W'Ii5 '}( Ca3!o E]8krqh,Q, 5J A 4 2s4BFbÑF>+(+y *I"ʫr 6S0L%S?gtEGZSmߑP&i)@4 Ӵ.>iP1QoM2+A=cǞ ɱ񍃕hN L.69F,( ݥ4~E8 d_.ң2?|-=ΦL4F#^fG8'jc5B౦c[@u|W *"ē9Zh^]Y3&~qS4{P`ϓ@Lj+E+JEzՓ"8. ,,Y.xH Ƃ83,|ʛ ò uRς>ү%.@$*Qѱl"&'F)rqrp;E!>%o50ļ4 rX&b~N) (m{RNgha0ܧ|zuBi=mT'5GKb44 6ݝrF 7gl40\}?#qB1SȾu/X輎ea?S|C"4(3t r)fFMӫ6oEqyMr~xCo:=6?kO4!CG۬KbXֆ<b#bb}qwQ]jw EYrqLhSȀ<,x:«l@߮<@%K/&DKyǟ1 ?(1Cql<ֻz[\7~x;5,(^]| v"n׻nZ7wjTyf'o༩yZ 4ORD?"u+,Pt6ivwoC'6ދE<2 \V7ݬ݇]OMuxk-:DXW~ na#J hnw^/nux\״~ذDD'/>Y!RW4fy[ÙoAq1{-hLY3ӶGe]z󉊄G}y(F.ymz^mn_ܙaž j3 ΈǭZI?<j$y?=6z_cZ"R!wO ōqY7D/.YE10u5Zѿ@"W8,+>f7 1; [㋒['2>Zå_輦ؤf]k_? >b޷  vs7b}{BGk~H@mVb+FQ1m4cJ 9f2/g Qւ9U]n˧ xn;i+˯X5F(0:f6.mp4ғh2|F@KOR [{ t.2Xe7 mX{i"<3wzo!]:<b b\.bٽ{? Dvv˻Xα`2O ĢN[C|1=>{8y&.0 [`z۹|QkW5V2I"/:Ɨ;կ7ހvHG~fmL^v8w!/Xi (ʳb\ .\wrﮍ#.~hl`:4fY&4.Ow+]x˴tƣ>W}$|t/ mMi>wא1z/杩9oU5Dv];E]HЯ]i}}twא`2Qb^Xr'vΟrޮv׻f<$Va?~ _rd>&eats cXlˎE,%?Ye樑<|eO g^>__9SoS˹^˃eS(l\}5*=$oMcrǛr̀-8bD[!NkꊨD <nt u\7..OF2B \`qT#kXO~ÇqkqAߜ"Sݢ Ȼx#>Y }\l?n!]>46tF93kvۘ *~g/^AU^~'lGI!=b݋Lq~.iqy].w'dC:~r7: #6 Q_x:E}zy|o݅{}=X_/b|?>Aǔ[` .?3+fV,U!Ǹ?]Wxsټcc}R-W&,fA֑Vf+@p :oivL@ 4xl8fuJDOhQl)0),rvT]xܢ~q')ҹrq<Qcd.5踻U,j׫D6҆ ":fc rB[Z}/d:R˱C n cKM&s}jO//ŕjGUᆈ&$t#:d#` ɓuS9m+龯*ȕF|O>=q|T>"w:ֲ5o549, hjnJddѩjqѕ/jQas?+2]#{gg6#677zyg5 {}sn;( <[FcFx1X >um>bsɜŔѹ6܇>)#ֱɈcO,퀄SjӁ{2 OF !&VQ$4:}T6bd4/&kzY/:sűS|.׻nyq$:6ŏ)1Wz$Y[ƽYc5_AY^,bgQWKȿ{==ǬYV[H1toyCta8mckB!BŽ8QGza"ZJF/@:̠CzKW$rR$~!t2&$M,M4hfV*SyJng)D$&㭖W.4AL J0(VR(@ Bu2+۬&넭~CzmIFRN{ڔR-&N]av 4dDఉ6%:(#v5şL ?*͇W뼤஥r]^(jH@ꍾ?èRK-| *L4%jkD~[x=Z4|n"&TA$TnhS}J ]+,ZF԰aD Dk弗+Zc&2t'2 Ѭ (Ɋ;tZ bfȬs#xԸARO4pb2;~8jO)Om +r+wp/N 6LXŠ&Vԭ3Zk!b|~)jǭYWe{V [c&f&~7TeEG%yI͔^hp Y) \N"Ԗ@Pc,.$ I-,㠈C>Rc>%h$rbJ܀=SDA1{-h4벟H[?<*OTBLHBś(czIA5->P~@IbLVs3x+l!GaxSbẸ;nÔE@$f}) ]VhQ01QWZc(.Z]|&TgIa-22@mc:U75dC7|qbIMc@8#Q[!Ap6)7%&KrOJG8IVz!􀰾 1d*MGtdF֧ͣg Z꫌[G WH2yQ[F)vhFk(T ()"1&KaϚ8x qB>A bUO*xhlG秢b9mͬsr@%΋/N٨'; /eϰQ)wŒ1ڑ9@54$dC܈O͞]r0GhQImuȹ%Ɋ;-Daqu)tb?jԜi|=IٶqزK8OL4nLM{RQ)ÑƥЏPC48gG5twaqʘl Kj1m:ټ~FTCFXq#>CPͻdJqq1ݵkFϫYI@9EaGJdb2uWm%8+B 0M=q-æ&?5iHrp %8X-Mv^C~\lCHŬc0B*t A5EPҌd[yrם3/ 3UmlwQ ܊S*ZLafav6ū|zM!n9/ԴN UpbWq {^/WOv&Jmg@D҂'84И* \8Y9#'7S=(&ZygJ|?}eo+LnrBTʅ~W8uk/k=+qw_guf[ݽ > Ag+PnK/z] NeHH (/FeV1aQSWԥRIy8_$D?:Q1өLHo@(R+Q" ͬrN˃csRXEhXeUF쎀}ٍ2}+2'E*<ײ\]esJ:|ċ`O#k}]Xw\9n#jD~h%d4 `Ag,eWndDW {t<ċ#m*#|h Aq{!L>,F5xS_C_?>џCqxJ1S {f[{=TV%E Ѳ˪ӀemZ0Ř OtLH(!oC;R3_l˝+pbkkG'J(!#*;"^^JDEЍh.z?U<"llp.1-{1 "lL?uc/\.0)#mvjj2KN fN((4da4$Bd3ivp\"0"/S.~̢ <`GD{3 jZt幆̰L-#+!&#a^{A(H[LlT#NQp1Sw{Ieq5J NdK$(c4h<QFmAMs_p&'[6Ve2zh Pg>þSJ^`KčY[KqfS['UDìNr(|5&CI"ճv>d"żӥ~ar0:CBx4"BMH-jl8LjYA F4my3IY7~fNeQe߶$"p&Ɩk՞kv>~&2kX'04Snj6׎$ =F((@IdD; ž,U5'wA@U򐧦p-1ub1G:wᏆl| r~(NAwd8k, թ,$*P|4P)"jQbA/;>Q֔,5a愚p캼ݦ5'\F;$ɕZó"S]]G6m_L(A*G_%4$}`c;ZQ)ed6N//lbбaSv=tN buu6xW2O)4x'k-?OsOM~aKFq (8NO.zag%~9#u-fw0(7i: x6\<~Q@De"pތ!#s,s"ՃQ~Ikc9 Y{"Qcx5}x|b;3qIzRxנx_՘Zͧ*~GI]t]Dn Lrp~VhTD 6^U?2pQ mb8Kp&qրU t3x[bFTYסQ::(s^U+M:Y0[,m!`\Cӈr?Sš,cİ/a1@C3:xp%-q}>NHCO=mTj>2IǞzQjg <5?+(PB>s~U*jy.Ñd PCoV5/9Y$O4Thz*:8V*{7xBO ̄G9i8&? B֫v a0-.Bxepvt&zed^r*4?}>QXL8L<4#˒="/X$wZ1! IpÈ HYZw"8n(e:&=6r~9}=T+0$)}]|{_ D'}4qCz Syi9Mg8ᕡSڧd:p"X^ʴvAei7eԘH~fG'/&)W-ZRQ0M~j׳"JsO5ۦOl[QƱ26M<>h8c{d`F&/0 ӹ" T4D"R: FtQEf9F 8m۱JsD@\ ik}d~*]65 )4)(or_E^ISFe+ LDn{~$\iFTO~Fw뤇 O]S뇲{5?^OkO=?ɕDV\]G;(ln^kl7O2pLBJAo "Uy&Lw$D Ѻ+O wdWzt&O :穬 (?lxFU1|D3-{#{ĦOwy&ʡ [nco2"GՐ°yus~0xE,!ڔ+ģ]jnfOY& /Ă% SdHv'VgtԝGk݆aFfqx\FBh]E}D/  Pt$cOM5'Pjg˚e(LqT;Lj`a=_9g7}raG[׊Oйw$DY*edS;( !OQ+cLqC6H:wڎ f2~lOKCW#_<3)G@^O e0/HNSN4:(rL z(83aZQ֌=4{[;WkQyep-'WF{$/"#G=4}(=Sᾏ9=%IN&W[V̐7Z߉̎ܪ023_GZ-3HkQ"QaBJ>(#/T[6:q̒Ԝ$JHz=QkK! q\ؗZך&=/Z$6' Nr dQza]45:3 ;VͫDc|~Q7DiɊ\ou#Q'igd gAˉxeėݚQeaEf5‡YEl "UE2y}`ϗQ v/158{Q^y/3&oo( bϓF"{1,?-;)j (SF:aOF ,QR {2,b:e}[k,a@I22>OCNHi,6oheD>NVtZWjg'S FĶ+Cű۴F ,AZHkPԈp9.b4h1Л;&AϢ[l|(X>oBa1z*$tAYQJ_O Lmʎ^oDgGg$Nwpigae.{1 âT=Lz1m%ⲃ2PL&bE\UЋwDtl{CQ)&6dik<(cHZ#c6Q XH͟{Em&8 yHwƏ>'!R\͒k?(!zq /ӣq+C/('EWjFt:w $ /?*=yVnQPi~UFDxnc 8˹Dq2!I ՏH}z{BDE!t#u_" t8Si?dy_" EQ_L<=zvJ<fikmᆚ<"?Xe?m?=f3HIA)Nn(Fi &,0&xu[g^!c"2-Q%0<,IPDyZ9 A]WwmEuE-o -z',DŨ6"IAɈ? +BC/Ku "x\ܮ:z $޶nv(v)?(/L/ԐMZL7ȡ#a%,Zȥw9 .2j.X_\~/|cGϞ}>/컋 Q&I-D_>H"KӴ6C}>eAG(HYH&oq}82ʲ̛LD0VhJgj~#P*-;=z' Tl|L(>B>:&~]?k;}uViтZNhp1&Zh@Te1/sJyHx@{BiiTlʙE?2*gH,1lF!QJɧ)5DO'gͪgh3?GZH(乆f HŸI7$NCؔ0#_냇$ҢHҰ:6(dk$g-&ϓJjE|!cUԅ0q!dˉ <{^ 8_@Qm (E gKl{y faTY54Γ{f4|G^`CG2H11.,J\EQ%ԧD7e_Y0t)KoS01p<,H2DȊvBTx VFa /zHg52bUeTE"VF7z"x<Wmf+[m!QSMz<̢>GRFeMj\5ʜ )u؏q%H<MY$hEhߏCu*/"ϲ2+("XEo>9c N 9n!ZDme[烏7VO/&&ϻͯoA G ꈾ= "MVD +x#}d 5T̺Ӓ)f,풝#OP@/fIW!CX뇔S؈YkEb ,);j3VUCJ!SsVj5521 kVFӰ.< l͆'T5IqBʪ}G!2URyU~WU(> uǐT&g>p|˃U"DT:?vcAnπ`\`h>>DY!Һ'u/ MI ;>?]Fj Y(SHa"U (/&oN#R6I%?r,OTۻ7LjBDAY2L{$h@&Hg: [P,_vIM56E̪4Ijͦx^(x]nr).zz-cJyia|3iQKI< a(J癿rcȊ7,'ںW @L&@}Ry!Dd~0|=uE$*몬À'la 3c #!!r"Q@TTّUe,]TVMT2UZc" YʣoL"/piOw]ŗ׋˔++:|Y.Ýa0~w3kL~4!lTo1oDʒ-;@TUmY(1!)cZhh ˢkZ4"o.zO۟}瀤u9})"m.c8qe<J`>?YG. ږ!zԼ6v<__ z#IBQT=f]JtyW="iD,;/ 6gY:Sj5FEmL{XD_:DV嵎uG?򮢭f6Z2:OAX:<&/+eAv3 Z(O;KT9qYN'`t)Q{;HD+ok4A26ivŅ4Z`ljoy(Q> p:|!5lCڞF'q,O)zB8cX[/<y"i m^Zz(^ՉgO.ʪ<\()Vˬ46yWa~GW! joR_/X-'Z r~'?$b~Rl:cZOeRy=AX/Mح[Ȯ@3.Ã(t|BT5i 7 mU{}]Q<8]{#&=ŷ?gaQVWMS)2LDxWI&EQ6EנGVC=ꥎʬ4#׷//CL/,XQ,+*Qt]eB!'x v nˉDUMfjfl" #ѤYef"a˦!\Nu.ĩH|F>ќ۟@e=4 Ϻb>}eAqoKG4glDϤ~^ !?SL.'ɓIzkSֆڲ6Yo&&Ě֍ik~0;ldx~c!֩:\B AkO 1OȄDƻti7IQOgS ~cXjV)T!ʿ6$Xf, ,1גЁb;_+VyVL%ꭏ$R'Lݶ"aw; LB5smG{!@w8l|ZX$.[+k&4(n\rP%CN]#vH@v;io(%K1%2|EHerNj! {1aJL:eTdE&ʪQ؃)r8ZAQq쮒OiQc +e)Di&,=(=²fm-#IYQv$ةB^͖:ak9lc&#XT"9}L5QZ ZQTwlΔ m(ee*D'@:SMD" ÐmERNe>D;H2F<|QץDX4e%A=K-QԛiNA¹L̍U_R:|6fOdρ<^cR>+0jl2&&}CZӲ&&hC a'"~Ѥ}U_coqυdѣc%|@D?d$k*]Hh@H #\B܇ J+lI]H« 81q9H@2m#vR@͍XL4xf( 5Cc z!w.Fal{QVz4_FnrƧC4wtA/\j$d<m#<ݖ+"+r{L{kgIP9/dTWI5[hd/'*Qv˙DAHvS9xx=Q6uS7[/ r?{ Y=R' p8zj+2'Z7Ina!C#rZAYc&;Ҥ)QNF۶Kkjq41ίtasÕb GB#i.//Ye1gwO\>]f[DcJkkFcn ޣL5zgxBza:̷9H$MBzlvb DY  B[~,]6_+o!EA`r ‘>6le\IQ.D H*[VGjDuJ}pZ,ԡ4@T׵pklOU-=~uY(gu]ԩ)9Rg1傷u@KDTUnNeD^ϲ9$j7j_h@dciM@$&mYFZRY;D!#"¶ <ֺDjDBq@O$?j; Zən*G%*[Ѩ nD^C=EgŻHjvUgO_\{}sww֤͛Z>D]kHT >gcW9h[..w8/j珀LG[ i3% ڋxav,?\NTBk'AX9NuZ6yZzSn^95,}0 uVMw󩋌6xU56Z2qQS7&1aW# mp(r"QyU.n5F>}|rR"(1U˨#WrOם$* ^k3뻻uw{"޼zO֌ں!A& ?ߛj&~Vٮu!lf?-$lEJOwZ|a1$|BkH~GD[ziʢ~L~t6me ҟrƢ{K+ku "01u]D E lf" q'Dhy zSsMub^ubuseK޴jږ+? DsP#bOmy "6Yϻ",>5~! 9>;6gWiޔPRYD"&Gg'Φ~~Vi)dO4y`](!λ# YlZ&yON]KEE<";yyPb"1`>z+dEz4NyD!,Ȥ}AKivZVMWn.D8(~OKd{w9AD9@6AtՆDe!6.;\o3Н6.&ʓREa"bZ~}0 :Tgit&8 86!(^F P4/(:Hsڄ ݽXҦdԇ"< 2"JLd;G.p661qǃ}aHR;#ɤCxE7u ='YF(4]l; 'N*ew^@@@dž ،&%{DtޱQU__h\ڷDlVȟɗ:sGyږ}f1Q^WH)]VY]ڐNO4`:K #R۵-}GCd5X^>ȬF[|˴r&ȧxo<ÖK.u<YS]#y:ég%OV%aWfr{v̕ҟz)sŶ2+;$?u ~ܗ+e<\Y6"?y^c9O+-O_Уq`@l7t\WkX:V#!c׎\\jddO ,}K#kv v?}`)/#\wD"˦LO >8~ʓnvL 5űm;P2欗Q5u2 3Nq DE UL=9BĮ {'#Vʨ,2ONעeؓccٱ.xPk/yzgF\Pm1 #K:-*^O3aG| Aϖד vfȳeO:ڳ}<`W!Wcmt$ŁD${uec-5D"aR9 6Agq"#SY@$&OX5߭b/#X́5semoD.Ё:"pfuިe2x"0"_GZ"i5D<#bX""lˈzn[ie ͩzn?%E|!:>`3v801rX,r^ (yU+,{b@Է'vg{t~)e~ljRUۨ"r9x(#>lj`Mg6ظhDX?_6g'$:޼HxinMmb"@}?1:KNL鱛5 pO-J/$eWKtaoUIVdVZh)V I6#h|0H!$,vR9aD[ ĬL'Ӧ;Go2/~/O'!ʡkhK2XCO_! Nabt#I?ʌJP㶎!L"_%J ʼ1ˊʹD̕`kXg|MH$(΍D'TOkex= BleXGaj3$2kzri%sߒ-y<ǛA6-YV䐨@ cyd!,[ .'*+|j@GCFD8]q 1㻯|s-#ReWNw(MvS_M# G09RFydyet!-Õ _ɨ?5Jm+ݫO~ w7m;:Q1ЧfIw-yGDԖQ*z!oV% "ִc2_ HDjN2Fg$kQF?kww]O|ϿYW] sˈ֡5X̳Eu.W&q@`A!C<0IdeQuf"HuM9pC^hqpPG#rx҄fՆA`UV:!0:~՚>? `߱ .>2BN=Xů-'j2p"& |7.8LB"<-nz"& VPgw(#-'ʛ({2D̅p☫C%tωE#L8J;[EJyuNz֮oXPRůޝe$ӼU! [!{^+/e>+M|bon  mY_^FR!8ԡ*!fCGKj&/ϪE*ѢǺ-bF4AB54_cg(QS} @)UT%L{}I+"sul.$͈!q9m{x3򾦵U|+NQM{hD#e61~D(>9?@7(v!iljuQtv0|gnvM\VB ]DV Q@$6(hJ|R!3vJ7%M̦gJW16XfM޿5!<Eoۉ̬Vk3BtEۖb9,mkb˴^٩@c6lo-i}SEkhͫ[jQe±?>XߚRgyҿXudH~c :Jt(qZKEe۳-W_t˃#! VeW֫e=>:pem|'hmDe7R,H0 25ZH$cxuz!rlDZ1 GE[J*'SPx;gDj}~/gg kkb^CBP݄w5xzp8 1>{gyR7I"K.΃}EKVcx@$ߺ߀з;LkeD:{}6$feA( +2) b D8Wq~ DMSݪO{l @T!>Q> {_jwT/ EGCdOs3 }}^Q".<džWfр]cO/$'Ҧ &jhv0P̀DXeH9@9YB4Ԣ#]r\l?h7[Bpn~e>x}z}}FD<+Ϩ;ԱE1ќr%ƼC0튽|0~meFx1BL}cMQ%I;xTCt,vx\2Sh(m/h$dĎ|e~ntIy; MtE";>Quοs+DEUuetv͕v_Am,T+Ɂ~gM-:_?A4%ND8ˎA]^BCK,&uЧ~;3v6 L2࠻sAC ̟MnF^;AP@D&x ۉ-6ډg鮮g^j:uթS<C_=4?O'yZEٖmQ|.>>=9=={q“O|B[Q,暌z7~'k@YviJcu{DyD_BAGKh֨ף@2J/$M$DE;]kA@ bSj"iڤQOȄߏw`c ЅoH$"ʫ{Mu"S0\oB3z{-k(KN$Q#,T%B0}wO#eI7Ga/yDE]mDN/~2(ck?Ue]D;¹oN)sQD3&z.c=Nhί¹ᜟ^n⣻hg&!t땛n n=ABC]X;̪mCӲϟ=G=^zc }mӻt[fQZD]1סc%Q- oΛZ~h1!ķš2joDJ(RH(kN ;DKk3b(ج}TK˴,*%t+' s n}:AjEY +gԧc~689/scF$K?ˈ"_gxq[nEEeVUʵ 睈.oAckMQӍ1kHcqAB@>ݚp{).eXB@ϵ}5.٥ʣ!\.KfD@/ؤ-^"zD"UCD5#-0(ō6,;BJ0Vz@\JD y ݞC"ZGMYHݹ9.d_Ð;P=X2$Da,y7<]^_iGiZcg$yU5I kcL4URe mZ%Ʒ Ef VR $,n赚DyU͢AB@QҠ$re丮GyH@dF6jZv] : rd ?Ƿ/nJ"iꦯXInPY̰(OL 5V>+AD:oU9f 0H|DtIY"p/' "LqDlP# e_I tȳxr"%JB"Dl Dc"@o/ch5£,I݆@t-="Pl2}ΚJddCP5MdD)XfdR$MZ[(!D6~&{s!Q@<.Zؽd]Y(lbcCѾ")4UlB }kfb"tt)ѿ"X PiaڰfA(=Q)̋VI)"x4-G;2'KN#H`r VIw`B)R! Ӥ G:сlxhƋ5T~Y[-DFB49Ubnƒ1a~Y֐]y6qfOy.]j] F+|`Q)p.`+;F7%\w$D4nu'_MRdu65HeH\JOGyq^]@o4 ;"KDc7n\@+zi@7t 'FZϯ}`5Q$u?"'H+ v%.52` E+M[C9d`ۇ8ig_\'!Ey5JhQ#ۉ}`U\mU}" nIU#-"X=lg \/"UkMdQDlҁj*>Odto!Swy M*)P9pC4BVk˧UdjTvF qa1b^ wzSIRuz*3VO/]steDN z@E[Moe"lx#>:"@PfY_?x|Fǎ 22t\>%£ r|^FcmG{ˡD=c"ѯkaGCw^F*A| oϤD?(-y מ繄e4+MFR3@2?,X_ a,6u֝IMeT'y0 =˘muvHoNw3:()XVSMg>Sh@4|"ʼΆbt{]\/SvΣ.!DM}É G!v<`;DWD Iwc盓-(o6{h~4l[m=QЗUCM4{=QY-]D1G/{R0Y5Grw?''XjQܩS'N{oChSꒉ!<~LE+'9^Ӂ1:1ɰJY/˪8. z`x^^X%ug@S-^.!&dHDzųʦkI3|x'<16@RJ{3^<\i/EрDDOеKw?V1[Gt8y5 yVh R1$l@+uա /* *"ANCX'kI|(i.Fc6$?ʀ yFy-(VU:>M9+ }V]ga2~Kt-4e]=ѵH'Px^}{iƘm(Zn]nھT.,16|6WaZ.a28g#IHKp"'#EӦhzΟP!z< x5Oin^7<#ԃce1F'5֬/t zгp8V y)Oju5m[!HD Oi z] <',\;G }J&m֏-޸⣻HN`EOIn:%K4-dQǁ۠~^ G]w}0!l TƎǰnܱ@C%^D*Y-/DAE}?Ӵ鑠͟siUI:9y<[1Db(<8@ ' ^IY7՝π<*՝uDyYY]>\V@\~.5qkҋ,ϊf{$-%R==#&& j$M]`x 01ɂ m|Zmdm zm B!0DrVDK֔J5o>WL dz"TVڋ6tҶuq$6_2-]x%>aKEVJ+21l|vGhvZ9.-AN_N\2L\m:hg&[: /D$hI (i:O& hw| 1 |X£*+Z~s4y2bw8.;XISlh9JoMC:M^Z$yGe?OD3_ޤǺ`HOo%N7'Cw@t.'g0lz#ꆂRY3QVhG{'}XX\4YO*&{c@4'Cw%o^4JdX <*M[@֊(* # a$az_(1ZBWB ,RD /H[wY6'22)ºU?T@x8)9OvCJմi+>^Dh)D eY!!?2})EVCuUy1w}V+/\EdEFE>ǒIn-':IvIHavKf BڕF`aqm)]Fx%ERD,TJԍE靖gz<|_" .kwv*WE7tc ts?=8{kIMZϐ-]Bl%O^yهNov֦7=GЉ%`1qXOP_fḧ́h0b`aU`HKD>B-/yַR;1lE5V7{ݦy_?m~"He~*zs{JǦƀ9$qil3ѹyT@` gDD9C_/ x'*6)lYH.еN-,iudIxuz\;';5I)$iR2DDSmŽy|5NAJ)T< PX7ّ LOBJ(D)!B\k+gOeeZJ" euDBc,P{ De 탳DDR&6Ki> 9S|ycxcȺ˨JKi#v !y;ZFD˳׫m]9jگO?VO23bSay䯼M<'Ct R$[>`ʴ)Ji?ff/EFJ:mT"#A)a[_5bb*Ҿ[Jy۲(tdfj+9rUd2Ro r+lJ\)#.փJLU+" қ#"`VB043-"#t$`=D\{{~%6OD=>2-sb{E4dp"M֣nӤ%Ep3) 2n/rD{L8!k8IvXSjjƞFSdyV|š[ :C(xbk5ĎpSp.W"äm"Sh%FRTn;fDкq=Qɐg~5zҴ\ee575Deu qh\\|yDeҩyx6CA/>. ͹Yl ʉ .LBře``eDe[@52~1K5:iA?2-&0pCzlvdU*c⸝0tW8w<q5|Dmf$tb@$B<B]f0)7:|mɋ:TQ$Mc.#@^Y0@Dds:/3|2!H4vzWE~pY?::q ty1$cIX|xW!O2Lwyj3fbQdF 7eYSUY KuJyVJ>\7A/1͓CLTrKcZnSg\UJHV^56`m+)R`8=2w5 ޮNuQ& FRmD_;lxP5.#F,G^ö_Y_/١;R"16.ڳc _;b]ĄV=%ͷ\B|?=g BT%LgC]O^61*7g 5DcJFK۴ITJ:ZQQLzaln L_y dE+eD3)Ld$nӘ"oa̚ܕx6{p"v h. +$*2i3Ƒo|Ge3*)~Euv5ހ]yE_ U&ICdCW)uazgq|^u7wc 6'͛f^>6f?GRi;rIҦm # 0X7'\?Mv]JGB XʓЕ$ u/<47 y+;֓u"'䀚nl> H2_|cʒnu$ xjuR\g+z ߚ|^Eko -x4^ܒlЄԔe[-ZOmRJH@o]C))䥜d$sG2#:$D~"\kݼI&+ ڞ^-t(KB!~?W: Z{xJ*y#T$QvQ6^O$I7 D71c:|UdmoK62p=%:}HgFyCTtj b*|]X M3DAE]JJ"~ z˴ˍa`ln&]n4D>Dgr\|LCY # _V.8z۲+I3n #H#/] cYDlO^Uu1HlgXw\B>:Z'1YE]'d>j^{fn;Ik:&}Zv2 |ijɧ8lj_{溛[lct{7&9aQ r1ЗK۷ʉ#Du@,r P90+!ZQǶhL5A6k&IQu] Pf8]xL%A} 6%5@!Zd4<:yKD= 4$$)ƒ/>y^=+z,?hz'4i[dt4̉mX תQ3fF`; ~_'gcF'!c~S'R#t%Kkx{}!Q7:7Y#QOt:+.;F& OWVDK/+-LzmZW_,Z)#Ztʛ *["EVehf@`̃ 1W~&7l5hHBB>ŕD5-(cD.vHgm3Hzi#yaf /8h9 bFj”Hgک$ygX!Yxj8!ϻR5V|l; R5OL|ZA~-mouRgi9)'J0^OB鴨lPzd /5T1N] IW>,Q\i˳Sͻ^i#}WkϗE#{/Dw1z~g~m*蜂oFF  3Lq]-V|joc)*KoH{`,$ !!3.&`!'Rj6M2zʰ'?5z%Q7*=?Kb. (ug Uã4e[t82 7x  o{|ZJmBEoiz%%2+avThO2 8^:t/)%7P!O!P~_.Q^ERjcǽ#֔Qٔ=\o=x 58 !2r/Ȉ>!z%ڲ(JtkGj{q@<BCGenomicAlignments/inst/extdata/sm_untreated1.bam0000644000175400017540000027143713175714431023072 0ustar00biocbuildbiocbuildBCej0`k`cvr]M٭5mMֱh3 s.p`g{AlI{lVA4>B!!P! AB0v~ѵ:ι!kS[ն|47W;sZfBi$4x<8V&DSu2Y/XWhT{>Ua7c !G+K8x?oip?ϭTozp^~>oLBCjP{l]vt7]ԩs>}xjfz?۝LYH!A?ꪴ1؀"L xF BDJPBbd!YkOU۵owV?V?Ek?Eo-|~o-x9Y}5/&xٺ|movwιmv6 mlnbm J0i*pmQQZ0kθBÃH&BTɫS0h'y݂0m!e7M.9. %9*R׌k(SU Bó J 3j?N9$id2M&+G2v[1iRS=px(9DnCkd][PJe#? Kw|L^EX~@@E.Wi@/c*=ltÓhS9)NeIZ-'Ō ?E{(2~4?^4d0^q˲ūdW5@~y O$l^vn>˅rB9'q#2Hy:_-Fsǐmf_m'Sk|PߣYx1[nz/k~׊IР〭A*lFϥl(80$`O I1^/&׌2f50 4d9Ai6̠3x4cȴF Dkvʩ2AL> 28+FLPeY '+BV pjW@aoA*3(b:q1Gh[;?PT =XYCl9zo>+IB5 ( hd=^DcX-ƿИh2]OOLB4M ~Q7'G?pTRBj1'6&+n,]`ksPhӐ,sPuG3zj=-}*]mv7 ̛vwp倃V$7^]f9Z)o=_|30%fL,K"jWܰu GTj)(ѿֺ`},[jKT~ͩiξR}Gts󊱿DjHVLb ?1 29j խ h32~mn|ݞ |#mBpr 'Jy:Lb0cYV> ?_ti j5 Y#ʵ1Wid>O\C ih/08uC+D"f4ףCl}IKmP+&S쯱d`cFe7`t @f`MCen۫{/+ȕ,: 4.V:xHJ5pLHH>ՌQ\F˅w'f>3'>`jPaQ5}N_<:٧5:Id,e~&f/_*gf l ɱd5D5:Y2 'umNٌt3=;x-(8>lYQY5yX}kwtwyl4BMw gYٯJι(^Z Qdu< !7<bً{*YUo l N4 Xh$֜C=`nv5}\f:H"xNসݱmBv{/"u1eۯ#}+eԳ3!^LOcʉc`ܡAkCHw!~b^.> i*u8ZH+MK!NaJx=]w/U봵G"c1g*jnNkkV,T.LlQc5 36*z'r5e>TJIyTQ\`鸰BT]U0,r1L. !G OK90&W R}/!  ba CJN!Lj }&uۂ5|u@#]v ` aCd io!pox<a|7͑LV8Kozu[;vrmnb51nρ5~?@Ml8M=0}<07I#W4-{p]N>Lh98\?KT?0SZbsaN|u*$1b~Gil2דL&dU ,4 z60h|Yv~a]v+#-/GY=6ði(<..O 06SԶx&A^OFg%ϨCFqCo.z`coǵ߈ɫm9I(mTmZ7] Gbnn6a{;蝩t?\ƏS)IRNeh<-s >ЖGi`}q3hFwv 7 Y1S)RZ7w2k MV`Wj" NWwc&k)0S^KAe/K9|TeuX%(?$R 0+_qjCj8&}I ('Di VUڗNWäDj:H(7~#R,ۜ&}/5#T|ֻ}QM z)y;WS!#\b2 rYf[ r+$PRFj߹9ErDHRQ)mr< <\!uRz''(lx3PQL: d@ b5 umo:[0r`d-@g 1QȫcyFD~"2O!iz1ZGq,>/a>Jg-_.8 Ѿ_KVق|{q#H1Yހ U!jUy\/jg i|KG(2Վ0qKAZub d6 xoQ+8$^H{TM[C#L i_]N@͠X ZRK855d94k[#l`:[IuL\e!s݈*-|a *q=mnh)h $4*P¢pMW4-T2lο2eTW R^}5C'Ua<zvUŐ"= &Rz3F!&[$>3lPaH INjŤV;@(nmgzshϳ+w\8mz~J;h@J?.kL5&IΓY]A`iB^&Hpށo]Bcl50:T) LI*}.hN?yEx2n seCx.ē|m,-Џ{T|!)qS}d^nYw=HZM sdHs2fDp¿vZxGiŢr1ڰ@Y,(F u] 2k≀WJBűRae HMPJS&yIɼՌ%6 k3#"WTdAEHNmw#/ |5OeBuC ^s'ZRI.1[̧˨gq01"yPaGȽO(!|=HJJf58{P+*bbg9h]eZMuPHdzl^,֓dl -$%8Y\PӨC584_ n 7yyxO-|?ÉPn:Ϧ '@TdƚaY]Y~A-j#W̰2ʊ 6Z8.ttZc| 7f* 74L,#Yd(7D:Mʣl><^NI j+VqyɻIr x #kۉ!+/@mx إچ1>(8Tkz qOT+L4'I8ݴGa66Jk~]3i1Wl;l ۲npJ[wy#aOG*tR[?at[gǿ? 7@YUsQI1)/_N.-ZMcN fbՂˢ}Ņ0REIPɟ 8o U<Ջ?h <v/2Tt%7XNOh a*mY_xd\X.f,B~N;Ⱦ Q| 87Bǧ4+/1,}Rsi@F0 @4́z8> /F:b$N?]A[=hH|c#֞?Ѝ GO!Jb,֣8>lwy2kn2 DПn;鞔ݡ2T f֏0*򂲓ZZ9M`tvy=;#$؄rEϚGD,])py:^֋ >с 0l~gYv|֕8E$kZJ0g I'l*ifה?EḟNcntI ^{X 9 6:͝o%):jÝʳ=q_6ֵv6mSG>-?;iF>֧!/qզa֪3QIQ%9֊ Ic8 l>z:\I3uliPG4`}3ơ3ȁrf`"KadpN `DF3&Ik B>O- Sٓ_Db!QtU$ cyq֊S'Y-`-c3"dܙ,Ga Pi bۃ Zp,6 8w[DQ}53O%AOG(sh,ہ^x4(a&'uL,EJ;e~/ZbwDI\ƇjWMyPdPg0fYx;BZ#Vs_g 팡&X94_-{d 79IM~5=lh{C^(+feg,O!o4<:+-/Ki=ǵJ!S9~qS ƍT2g\0rʴ-/xϋg=5p[Q4nB. <;:V7-czX\&B}n`; / ^Â3% UUl5P! S?A!F [lr,d䷒qaضҊR3r 0lIt#54s78+1hRԕT:hq7] Q#9|`h?m (Aij|뽣ӷgaqS>˱g{>I"W\A+ PK_)1Zeq)*Qkd `2uj0R h2k7e*@Qh!Y0YBi 6ڵ.vӤ@^5O2"@R"̤!0Fe"cZS_qL@"!f nՂ~l\YDȔ"ZTg |I+<{XP]?􊢯:K<OG˰gõE%l1iVƅD*b%Ҟ2~.-Fy%i\C ;pĝCB˦GZ蓮Ѭ- ǻg4Ub[#޺+-Pؓ\ KYa6[q ŏ`nnrwE:w1 A녯X)N:C$1NBtZ)b]~;Ն7=C2@=?c9Meg̷||ߒ# R$I!ZæՍUuAX֬`h*pW(ZK7,9c] _ t_Eb W=J6;?|y{{ EJMkU|OPb n>"*1bXn=\eӗ=mG>!*L $T5h1A_d׈HNo)iDmx : oN!$`dH`_6*h7ZMÙqcv3=Po29up7Ŗm&tG|X;[Z.!pmi L38C6`{SK0a+}),`xbR S+e )+-X3R i2:eBCh푿C^~=]Sz^/0n>:ѰFԠ1jGvMTc(p*'NN' y{B$1FE4nQ[C9f;EӼF~҆ac 2;syB/+&cdijͥ FPlnGݥZW>@ Dܣ#T| C?wW7Z-ҢyEA{c$|Aſ 5k֢_P*yyA)Kuƺ^|;ikP ѧ@WZBF4c=G{A Mbthzk(!-eC޻klH e^BId,& r.aY4m4ުy&HzWŦs5.0_~]bLi|u~6/tBqk􏚼NW)ߐf'$S{Js$R#\Æ+E."ا؂ 4j B-v0!IWb96֯0>Lw%ᣍ?f߆Jco<}~)U|cЈ@1`1]+#AMF\z05i XN)8#i1aAlɊk-^1Qeѷg/0~ߗ8H'JaD_9G)vA}>vJQn nd ⽣]/qƹ]+Cށ:jxpqwicXOO YhhDLvV܅AnfbQ\ݵq9,OgGm݆e=7$xl?,cjq[(eSYúS?aLY/'x]>?gkg2.XC=`GY,Iqb8isg~M{X⺚ǾbՅSȿ=Mʣrf[H5J:S  (Mf>Q ՔtmOyw_et;~Ŵ+ 3L*UˬO1݉|ɲ-|{SSJn} U")&%z9hB( j\RO?2dze9LxC (7U~}yc5(nA҂b1G89zEa3 4s)ZdkTu;N=E^EF׸^S<bN)s(uF)c$ "zx{ |P8\X]Q9D0D[fwNx9Ck"W8;>/I/,eӎ`?Q)n-4}b: vr:ӗy0и2S IrhQ[^[U lPb1.+%ыߛTޚNƣ0"<YW@I"8H^dqƏ6`0Z[{lq^B4b{CN#p3 "*qeVICohl v@5[WPRh0[B~ ,t~k+-.҄wO?dpV!N%3/T4tE=LiPoo hd\j/}x:b VN}G{CFmr6~?&l=ƾxE]SX%OyW.ݬ4Cy\ݵ CXnj;|CIqڰgLugaR #Qg:Yl WYwGiRk%8G{Kj/nIt2ϨŬڱ/SMǎJY" ro_ Ik(s Mk`gu9r 1;|cG$>jXoUm{vKwNx=]iMgfalUd ,91Q2a!C) S|'uhW|dl#}eiQTLaj@Cvƹ'ݵZ^BS"t3)n]y(ͺRStN(-@(o}JwE2V17tt6,}U:996Qj}$IxIsYxs@URSd ; F%0ۘ4x Af-W?znx^[lÞ'Ӓ߆]<mySS'Y.Wȅd7զMJ8w_Š}+1N' EIwd7n{?l}kw6!BEy2J]V?Op]pjEu!͓VY{nn}뿅l]fAe\߽77H;dgEXYxORn"! TUOQ4p_NKf8*Ux6uޡ!O<} }qp=TFG*d]"c~}2bUQYRAq_rRN B^@*XhTYQ44 sMpnƏS52Y<=-gChw+3CR"0;hGZ^hs.ĒO%1Oay%&ȔՐF#bu;5 W$w ;I%9\q-M+lqh\J?ZA=TeS,tq=FBhtڇBr9a@VQ:J?R^¼Qp! -57h\i/iEjR~A|o@oq}.|t-+ =?NU $$I 1peXؿva\}q2I*CH  j+\!qYFƴugY;Id$4J~QVڕ}~AjJMp~x6L'')Nxvpl$к 퀐Sf,nTBńDK>ki?}33A3p7x:U/ECz^zB.l( 8$ʹQ&&A^r):Q56w).ޝߍ8kɤ_..8,bIri_hz@l3c*yv7IB^Np|q|PþEL`3%F~~O-7W5"{UTNb^y _y(6GG*/#h4$QP 4zc3 %6I C>/M>_àg"ڜ*FJƸ8^lxsⲃ`/P5mLZA$Zzw /Wic{I}T۰9Z^x@w mH +,*wK{,ixԒ6Bi'~hdA;O y$l>o~}8)@ۣfi~@ы4tӄ7(APpP?&?G w_Cd],| 2ERw9bWz)qy6IGK͍!ţa|jN)Mɟ҂D";͍ØmLIT9T: ߧw +V˪C8K <1rsd:/2[S&oci7&yl5lGa iK#ޒXnB|!Z .JT}w 6†%bor2kxV7m9n۶E=iPa>,N')zZCgn 9swH$;]Fڴ$*M5JqgD6&Ly9F…& "MCt(<۞m#byc1,B}Eyq7=c :`">g*uZU 3?OoH ,Ia+nMLQOCJ !twd2BKyS8:*ѹ~x>^C&]u؆hBN$C2/֪ O0 5\uthICDȆ;k߮1.,|@*dw lCu:F3a^>^mRmRɧ#1džlA_C<䷵]<{-C$| ߶+1cNOm_Z ;Rq8>{<Do$Nm?ϰ? "-3opAIE]E՞!z*%-Z'zЌ{fڲK ̈́W?СBJL M^ߝr R>A̞BYP$믯}jbMR=+P$O_%w'h4>ٰ9U@SZZVAJIs)^(*TFO3Lg:[t1?̇]̨]h41QE jXrZ3 FH3Qe`c$ް{&1;6v#QU) HL5ߠ*Bs96+ wc@S ݷM44?{+=ֵFƾRZM"eU&b>\}iź߅%O.{k3k nqmJw$%z! 4Qo[-uD6Px ]Yi#(< mu#e*AZh]Ulfjq6b̠PLGa d_ \&)ZFiŊ׼)U=I.PSǚ^ͫ1Aؗ*rU @ۼ(%佊GKɭI3\@t0 '"kY筴4em@\؀[;ߓԩ2\H,VxMD&C$ 5Ț9%|7W܂H-ktQtKkCZ2$ ֮-ѻX FD;ښyHf ciR@(yW{^[ ÒrB/ W%3?R8J{Tb5-s-ًh2y"gXQK{v(ƠesJ ,wxTv_XͶdH!{Zc5DoE4t56W*` 4S?xc(S}%,ۻ}~7=첇}{\`ra}WDז5Tբ7)R Rk}`zLx<on{h.je_Cޫ5he~V|N2~"~~5(r!>Y.lq.] -R +u͔(zLԃ`}V9+tv\W҈Z'E?dMf!LPᮧ^pS'!Fv8.HUʿ>|У|{ƿd0Ƴ4tS%@]][uV06M^OdUŕ ~ΨϧRvjwwW;(dex&ߩo5(‡|73֋Uc|y9O #-5~|cHZ\MSR4wx*D*A4NC7A)_W}g_T(M꿚ߚߤN|^䨂ru'@) $CG|xa0U\N( yX{^+y.$۫*S^8ꢄTJls&`f.:wwHn1 W$ :Ձj~%kX,*cNfL6#+OX㐲qg=;=|s7ͨ/ëևM|/"׮_5c>y'.pbc l$ho81^ 3Wy>-¸S29PȡS Ɇos7o([Y8y,4cڿS$z9(>7o4ZIS4h&V˛v+>ɆBq>u1B+֟9̂Iq _;NyOa]^5h~?%і1 D_hz$?k\U~ i}U/9]j=Ym "^kӯ!бbe5a (i*)!lo|uczܾș=c?&Wl 6EA9@ UO҈`J *Zgs]d];X%oK?K],A`Vmi1( k=G{gAE.!/=L}uڅ:=?XػR/!j v(aR^븉heuxM>"+i|:[J~ 8Ћ-(DJ?FF@aDrf,׳!𰸏'OL7&k.(A'lEږTY^29V7 4nG lU!p|5(_q^b} m i1CC"EQ?-H|7tc,x]L:M14TdTģ 6'SޕKi'}u:I1,o rQ/6c`= R~KSS  T^07Po;Md/D-A-4ɝ ]hֹHV/q[x+ ʲ'*Ɗa~0#ɮ9Ǫq҂eA 5&֢Emn %*]\ѠT qQ^ΊTYK NĬ m}FJliUi*jHiYK4t4cd˺wXy:ޱr~wMÿn"OhpOUc`樔?gx_P_aGwfǏ;>OI]ۘ% p-?1ԗtzC?OXOQ { a"a{_)߁C2^@_8ϢDQ"(dF .:TO//e=OI'|XO}H>=7&4mvn{ƥTؕ)4QC7'M.r@|&oa!ZAxOc{.va^) XjSṆq_ 6VKGI[gыN ^=l#OiϴlT_ ?yXwaƶ7/8hjӛ|ߦC|&hBs  8ܣ/`23 'g{,XœP6dJ=χxZ}|AD0*?xFR];۰ŵCW40/?w~R6ܔj=gA ӧ^^wzFG}RwVIg^GgGЁU_ϷLz?%!;hS};F ?=߱kT)!vW+8&:a4ۇc3ğN*&&k P|4+۲ws*m?91xE(W6oXwJ. 1:=ybc4MmVv ԮS;l4MR  Lsv:lnV~G9)> |++nbѝq3E&\.!΢ؚ__Kw7by'zaM(l[mR#@n dT)Sx K1}덴/z4xkS" +J~*Y/$ALƫdsV}ka-85̟Zt Mj'dC*K$Ř.fU Nls?(Kz:Pz<R2 r]cSb$sM(. \oQ;Ktm>(ѧf%̒6Kt\pVc_S8ڈ0Ou^țu{Mذm+˄=ixq]ۖy/agBd/×|د:epnZoAzj80=ҟG[wk.5_݄:d8YcO;zSq~/eyY z&*| }4p7ҚRѻnj(?'m?\$cBCJ[_vTW|}|iBF~*J0;P2`HB ]BfA"HW@'&!y% %`d@~ kNsj:]V߷kAX x?熓bh5.}upp߻+v/͇_}4޸v_7uxxϴQՑҺ?{oW/Gpdw^:Z缷 `ЀYXڱ3kM-lY ޼yh4/ @dnq }sp*xax-yy(x7CWanfB#PJ#NxHm66R6+#.u$;\yUY_<@A  %V~X g x 24tPe=^ m% A MRnP0%^Rh 6O:mf*lUG4UhGPpR5.0zQ~P; K'x:aSt1 (&-.-bPu e%@%}dtN捄}||z9Np;*>cYHW}z.8U(Kh,#νI1zO1Tn\,YfkG}^hf+Kr&)t\>@{0=tтvapmeAP S3;hS]VEyeS_8gMyz[\_?7WK`ϫEG_nޓ:ӾReV;u]*i&<{kGiS\e4׮(?̀6쫷5w iW\w\_e$;qŃ؉?h4]:Q#w/c_m[=h2'ッ}B֎4F5@1p%9Ґ+R$E ;]2d?>j||Sեy$]/ PoK9r6Z2;vv_ g?f;( /ïS 8յ5WuFO!ѭAV;{ߊvOO>h<:!Mh4d[հ>g)bd'zc&]ą{ kCT@7a; g>;[G kYQWAgxCfm.aS ֕dJzPr!IV[SWfg'?x{(ЕJCK (HJ`re`g9odD)6o |p<]q# ʢ$W9l |]=y7Jt+E]ʽoni?A#̐P*"0Do_6 O{3U#k04 l<]-^߷A)K0eir659d7C-U^4Ӽ,-<7p/& G-nK2/4 ,!Pti[ oZ'wE_0˲j+ߥ4?\g ~MԜ]{{Yj́0`0V 'ư ҕ93U9I?`g#!p維[AlFuw%ؿi19Gc/ӗ(\[^ƭV P3Gʁ+\!!n 7֭I:/8]uѿmAPFK;9,`W~&Pl :-+K-W3=/?.)mM(EX5(`ܘƼt3ͳ?|x5 ~.8dp (IX;W!OgbƓ{N{ƹX>vO?{nx~{ׂ<…( e06 F1`1k\SUySXUj3[<۵/MqNlEx)k1gFn[kNT+T"A(Al9|WlnN :TX%4x1/jހ@kj̮9p>^Lg//MP=4s0ഺE" LT1]sZ\ՙ%?Aa@c)N'A;V.#JX7kP6k3y$5 ]Qڿ${ .rNp,F%oH{Q _24b[+QZ۪:Eo0+^ \kSjQ(i?- 5{o6ICCfCR0+H,qZu]Tk$oe<YM"#Aɹw޵^([ur(ڮz@K9W'by;Ц5%1q YZ*@ʆZQ<1p͞/?G/-SK!d $8CV2g& Kͦ6-2;JPx@mNGc߀NӍ(l>%V^ɖR~ Sr ĊTt8&CWb1]FXFkKxQ5 G}#mT7!l9a_Z*Aأ k@k 9ಮ>?I<@q$T a(f@ @pPE6MY˘|ʧVIq&Ã߉| JbBu&F0aJ%"T0R fw5/OoGg>j,r@QX ]UPY+)bU#rNDШ;"[|yk~}S>–j @(X}c#\yW9gh2L;5OGy$ʳZ "ۏz|Z?rj8|@PZs Hi*R7BH #|R58JXZVaHl$T<e&fӉZ/ ~b=p5^PQnm馅M _{pZ΂%%Prc$F|f|_-#UAD9oů9HQ1&ỳ$XvNnA(Dчйa;Mgh~5wIn -VlSdg$ FOuT!ZbMBf&ˣ0e`Fֲ>[nY$Ua7[c1vX`Iѓ"ǷI'd .!B~J&n|~ sQ m4. Jkd y5PjEo0%b-GEkW>'an0xT$<4<)=:yV_c}Zx*_4"dbS4DżL/}j 9:==4RX=Bx)oOx[y-dUWRST)z#M-b4w\3\ ߇pрYLOh-rm'(I-?}z/ޚy^8岬E(+' 4zў3̷ l\D[L\\bhH.m׻氹CRUJSZґs9Fp|ˆK*%nj<0g=w1yma92m^.?c[m6Nl_λ̈́U/QDMݞˤ[Әa7:,5Pk!k5ɣ4?28A40V6.A3'8ۚ1,} ύ/ i*~A\ds1:bf7 2dw|D lQI.H3qL Fjr bmLUr|9'Bf9ta5^9t(b\ [Z) y]Lب#mO3co Nx:KLˌՓ0M@*@aUP9xژ ~I>#h]{]S!R1Ofxm̎*Z#cPA).sPh"TuVp}.q"+2 (A6 Fr0X8Zsyy# 6F)'_ yH<&XK6@sGuf P99*M 6tX}'k}sG,Pl$X g-y8ljpA: !/Rנ0y52'bS@zZ0'{pTejkex2:'?(HU9?Z"Ԙh6N,6yIG:e7(b2,b 6q}6V6L510q 77R}[F{&͠1R@mj҆J;7d%1*UIR~0ʘ& ثfN䛫W|`A<;3~Zk[JJ`Ϝq,e^f̨CHB 1E g 8!6thN`ȕZSG{431$ Ib1-MXbv>)Nb+]4cpߕ1HCp-1_cVd`eǼۅZ\'|Py^gZ+T%F4K{ny>}jURy\-Aťl>Zu`88tN5hpxIZZpf lJS̘,PM]8Ш 4Mb9.s\SQ8İC~J0~!6T)Bϊ~&R߁G6yٽ8m2~*)00&]09|5xӔ&K!X U]k2Pݒ-ы6PK} $3po+ـ~ˬ8}e%,G"tpE%}[yb5\눟[ZeU<x2HvsmaTQy?j6BqxQHf JXۤ8G)o4K,n|GSi:y<G\jYM>UaZltn0Rnn{w<2ANQo ,Ջ[i,'1T%z#ۀAFʅ$h4<9qj3LQR}A4vmp"\ bd2aIaV[=Ibv\VP@Z 4ap 9 2P I|ݯr ɘB ry w܉Fk"'Up |'iyd\wˌrp3a+5X""PwR / %5V֊_yX9Z')Pa+uާN'qJ:ǘ(YY2W,$}- /\c05* = Of  }]k NlQnttgcö1W6 t-FRyo$@f&oTYQ [ꎬ#! @s08j!}!cj1Y Y4>n_h:NmZl)8[K0H<.(F/zMWgy]Q{5ȏPUmHRQ0hNigt~ʷaeV\|ݜ} jj̙9tفP_Xa.>K!ϧ(NNemAW:H@? O/hcBgƱ!b4ॲJn0@wv u]~loꠢy!|>oajCyU`XOspNf~;\˶d`dVWylLhŕ:O͹.8nWP^嫴lܒVt7p黭!;yN(We.4A`c5`r@ncM $&`# MPp0u9Wcw"s?c)=msQp+H0(229„*c0˄9wKme.D?jnO7C/Ǐ9E@?dpUvQcY[d 2+F6IWJ^H~R:Dwn>rk*:ʁ./JA|޼kH ΀.i'k)8eW-rڜQ2n|d>ʡAXlu$=IF2xb6jM#1zN[}LZ us8.†4k,m[8Ƴ|+)"q8H<67dq1b+!5ѹ3k.*I!~u Ҁ4RGgxGyΩvkPwdtϦ6='-MsE0X}@ Ra1)N{v`k>/+ٌ%bǟ%ʀ)Ϙ,n46YFI'I <ta;)͖vtj 9? .2:p`]qX2>|̇ G@CEP8J]ATjOM5'G93{ej1|ZLM\Z0c5-ba_X<LwژZnuVC^"Lfewk/ġԊdŽ]%hXxmR+!o9슁8hrؗ14Oq~شjJRX-"*؄/%A^ƫYJXcvI!C:ϰszhN$!RIgK*A9V !/$A1-o6tC x^0f.(I_)Oq:h2̂H|MmudːLb(ʭygu<ղIJNk4e+.S8aeñ L5qq]ȥ:PmB31|KzltcK qjHgGR >.pzGIד a~SR &t^׺,65SaJkGCZtcꘇ۴)Oף,tPW rɽyRXcFB>:ug` ܌S]RD_N,ɘpR%2kX*_\0@EsA?(d~Ь@05d}3+妓y/O.P_]`ކDűj&Z/Շ:$XNy:` 3n_J+/Y}qsɅfAi4h ছ،c]#88`C*~e;)я"ǐ?x CJT\1TN], fi_{z4oi?)f7dZfܗ>&7]kԸ V{0%μ2_2C00^m!q>xS@ش hi$`50 πZsTynJk)F>)$kx0kၧght) ;p N73NO:,<΍Bx(@(:NX2u;EJm#f[b+ñQB)mFPXh: AP##M?HSsr$0.I!ec2(iU)%-5 ! r"5> FcAڮ jC;ATzer)T0ؾgn>3`z yiYk'+jD}KkS cl2FM$)Ӛ;:{EY;׈K` ^mzEңimkHy7$1PD(݁DcƇi*v9|p\)&m`jn K2S p$ m-,_Z Pz`{B[9Oj4ـjv. ݢF҆b3@j%. MnoxVp9iK&eUe#2)y)x֯.p*F̨*edU2:֖"> iC)HAdtAtAPϺPߕJ {@: Eզ"B!f}5/hh2J];vt/^ךژlsJPo&`qx(ElocځxyF?(D9APqdE9 ̏H(H*!Q_8C/z $ C;޲L(FؖkcpW+[rB0-bYq $# ;x={{AM&YVU8Gqrg _ yc #ȗ gfRXTlbɅh&q>MZu< [40Neܽynr^Uqؘ##U|4+.|4]7氖9 wo@mпr`?17:2O{U8BYnXim[⬨}P[7߿ZZNlwtXtf'(#Wim_߰~>V%s SLMOt5umHxVnAU۷^ b;woxǰ?l+oL_MJb9pcmZ,Rzͯ}A|Vv_ dSV~֣>Q=Pխ ':c3 Tp ʿfG ˫= 㩊 bM [ :ax 亊4OE12%i7[Mcy_(PiÅA}-Ypݵdt <cV̉WEB61qb]v݆mG>D WSv~)GN )t)*14&54tcڮ۞2'+[o<&4Vzn<'~e7 4Zbţ= lҢLR~^6mW '%EwcO:='joAK_^]ӭw777`C""w6GZU\s _zۂRBȷ8=wa3WVU}AWG_W.B_2yy2]g˛2ϳ{^ ('?QpR;hG {)1y"1VĔ:g9?Y@߿1T\Z+5ąڒ̶% v}9 +S?dZhK)ko|~syP.UvthqEGfK11TWs'~{g~4/Gp_cd\pq݌;"sqNZmǣnQD]?~RDO3qbnU\6m֙SdRk`ؾjiEGb?AX,i'=|?DB`>N"Hma]il^FC^/ih 埲e%?eV^eafGaz]M1Iшhio/vfs4>/GqTսCH}ĞIdN/r63P>#;d~,.(KA(0e-=p\"uI^K`wUx8YTMK"w N7j7ÌsGQAM}9q7Ґ 8 s@Іp|^J1-4 R8ہ!Egyhqchٵ]*؇.23P5m5M|~)|l9/]v(QQK6D a4L! a5>G0r{HM>2uʲWnh%APY<mSf.5" ߈_<7W1I?P\]{(_Tתӣ-goa<}6]-ve߯MuG)]W.jF-om(xc6fl43/}VSN!זC[~wɩk(Bk.08S=%Iv '][! MăV9}Pc; ybꊜ/pYŽrBlwG?/qDگ =E7&օfrycу]2]|Wt/|&ԏ9ݘ]w>/j5ԌY`R7&3\א%ڪzmd-~jΖƞ9^~{ڶ]U}8nal#5vr5^u s*ߨ~6(Aj:]YD Q,]+dr1CN :[_1 l?ү7&m\?44vDdky-pWA'&/pm |3C0)%s>ZvOK k:foyʊ]yOj4ُĚV31b,I(*#58$jŸ‹,Vۨc6c'fhj>~\?{ ۵W@ٹfO<,mt8]ٹ]S0sНH!~C!تz hے54^>ߌpbRC+9>x{-xFd.LPiFgjC8;PuSF!cBT޻ނa IH !̩py 3OWEI·5uCZ)VK#:_C̆b˲n(< SVa+Ϧ~U-  Y At,/Vƈ>aQ}Hk *s1 w(gBvC>}ֻrk+| ҰX}^x#ʶ* Ў9.W= ]zB{BC*>}Y$vVKUnabX\ -\!$oh 0@B!w^;zsGDUfWWeuOWUVgϞ /Ϟmx_|W򓲩zx Mw,gϞ}j6ͧml>|ɲM7ۍCgkh,>%h-G)F_=~~g?}집ǦG;?˗)$>Dh#b仝/*#TlO=¯Psx(3 ٨Z9< s? M eVV\hE&w'^Aru)jSCKꠣ息"a29>NqۚgR/K+/d8/quTu _5zX>[-x e(x(^6lыs/L0}o˲W+N'^ĆXGDWx鑌b.Vc ߺgb--dOl3u}u۲md%^p]/&f/P+C:L܅Non~Jj(JTT$#ٌZpVL\f;۱0["'w-2EK.}%Ǫ2[Zɢ*a;u_BsF82P:"c?[]X]t#@>'6?~s9T1ILxzg53d,="Dzp:'!dJ (6@yZ p`zrڿAzP^O?t7qMg˿/\;'~lN斞_$?£qf}W1J1ޫ6-̿$i~h˪cAA:f6+'ORn+4i$3Ԕ`(҉gJO}]Mj}"16 LE U 9^LACxa| P61'_x\JX3C/ۺ"E43^t!'MH ]tq1$ӵ}RxJԁ_,(uJ3R>UH˭^*`{K2>ܛ7DW \ش\+hEKrAx$\BM&U?@H;;l^Ş?嵔;8M?~<,ß!Z8(CeǪr_xQYODͨnҡ.Ãiv+у[ Iz RT~;?_Ѹg|32BqDYǓeHX U9MS )ڿy*U(xmv>ʶQ 4S>+c'69cxeȦCl9|]PLSer@2rNWӽK)^!g@%iI#.-i>*}9p!>dF5TڒM-S"뀙cW1>S8ccи0 uFۨ%\j.~SU-Z2 ߧ wwEJh;z|Wgf$ؖc,lV6)o]A%N[3DuVM߹O_v\v h8v`kоf|rzWTO?>Fmܲ,#;g~kMLUGgy 톙`Y)\\_>r 5?au1yvI!}}j{g?5mDv0hFyKAqG$I0ĕx [99ț:ku_=T#pi@ V;ˋ6 ڻ~WIOyk<-rUfG." _3J %X^1L>C9YBW5y7 ItU$l~,~[ﮬ%vY!b6**Hu,oF,ːܨSG7~V}Y U0TʐWf!%7ae+K)*}譺|y YPp{`'Fuq_MWn׹KIfʼ"W{<^a\pAA>-ǽ <'T;,Cmd_cOn7SdŠ4ǚ x_{,7Xc*3TYkz*`}]S{rs{7BM~7p 1d;i,J4r#niLψ<+/pu폭~+bx/9V)Xb`5N,E! 9(x,}M|7}eWgPBPխQk* <|eԹ,/JE^-Bx~wi(c׮WG8t:kRPigyE!U^<>w\O4_!HUuIRy!Yy]UZ;\Hd:<1"VHnO ]V|P;9 jR ZJ-6ɸڿ_ޏK~=401AP]C\<.5 VBd XMYzriBoq\tQ01Qf'ىGoxr>pumo POR뒌.3}Ps,`O+!cc1۱}-jDW8>s/uJ- <{x?orhLRMUE&*L]n^ N>~W#,1𧤺 w;l]X@T~ ~k!&DIB壱R|.+X`${h)3_5O  z*GRdГ1$*\mӠE Le4. H3 Ppt= Sօ-=uW8111c˓Vu|_0Uݔqk͵7\)TEbg_g4nBb݋^ԼŅ$g(4]GjEHs(N?4y* - }#5e4[yzJglz8hj7ԭ(Y 7cg>\nť.$ uGJ%`gbRكעРofu; \L17w_m{ -OAJ#^:< /]{ Vj=cXE\~T)N8R: I`H +uӶQW7R"gƬaL#8kN~#ᑜ*]J}"+x$MI#۝xc2qtalS7SHp(r`-lCb]?; W7:!iw1Aa\ZﬓY BA&nM䃳O z}ܺ<…KHiO 8IHsHM5]ar}4&. 앛uJLo)ޭ)ԅ4O0yM jBЌi%\ &NĆJO'\&܌ɧĘ /+3}HVtJW)]aBG932>}=4,**8wIt䶤*Hb8v])sIJ1A+a,/VW-~{7}C\7;mr8`Ow 1h2UhMa+.mCYB{KZ\zDf&ϯ_le{\ѭT IX5$O,gW?G Q 5ᓵΤ#ST`}>ocUE+Y(bsXYPW~߈s!9Ԕ& @%]]݋"9 @zR}ݵe2[uX$oɇ{u DeEg̺WVPMՅ֘e)!=37+aڶ]95Q 8u3Ua P6Xv SjM,-*g8M| ? rrC!BWYpt. ǺjZuD9,;0 GZq*t&ҏ+Gz2Xe7#\T1,39RWCl QuXNډL1\8褆 wWVk35Q,ƉO0\,*(#O|4VSECD{(.'-Ke`H`b` aG6ƨQgSZn` a[z:L~C]^SM{hX4 ŵõ}YG GLbl|`sS "B/=CA|="~?i[^yƈ-^FN_L1ahh܄4S/H~AHQ9?/+P~.%s.:ѓK# {&lsM -GFuv`rBP%K+ODinni$džRRzG`߂6}1I2yF($&Ŝכq&EO,Lfd{#N<燫Ex,2%fOZLy Xs?Sjhy2>[i-DcYvJkV<] W9/>GOKeI;]e(P 9Wov_'n^Q4>"-l8ɒZeδ M5W㾺\uQZ.G70bY]bB=b9̃[ly_'\l^Hr'6W][+<.$E=92ߗwg$}&6)#+UT\ݹ['{׺+|_kRͲ>z3˴ \#sf@oQ*Χ}?uiI[61YBl8G ["N.>6N"ḻɝ`5ySOt nnQI0}s<_uژ_~͊V*ROx+$;^$CqZjjJȍU;?Z]Só_LOo@G$P.a:6D>o6Nπctfџ\o*IQ?ZUӍVsOo'zb\F ̈."8O9VM|T *ܖ%htf RiKjGj& :W}ya7m? XK.c*)T*;!hqq])Xs;9HDPPJITgvY6+׫?f>O8q&bEAD8y49Ȕe4|hT ܩߡu:* [GKx1}*@Kk$؋k.E%7\B<x`t|9ݱTC |ߢqENud0KN*GldT`{C,e47IxM7:zΑ!E16R ج 8Z+pϘҜɧ~7m9n6{O薰f SWSxL}APO?} 7rIIwV(D.xi45<\BՆ_gū]|hs ,o1cݝ?OP-&=)ʓ$=yIW"Bh>w4ܔԭ zg";8ƯU=Н>nC$P)/e&1'G`a~ MuuK_IqU` F,e|LuZ_{CKyVA(tZRS’INOV3?=4GϹ?X-T1OSO~3tx黂O+W lMI-9+Umm,vGmBh{$J*E y]ϫL>9 X\Dh 翬leչFsnDd |V@jK%tfuL8(NՉC[{=O;ꝮJi. ;->qTS[]zXuVFʻ7>ݡo8}0Q؎I+|v8mY(3|- K+OX{dwSx҂F/8f들 l帜ssyGJHx^Y䛺V!7i*ʞ\(No_d<4:o X'@=3 t,v!Yd$PLܽ?Y\?^8><&ҥ 3~] Z1eg^ Y${+ { wdTm=|~yq`%R}.wʀI/v#NŴ! _~XW>D3U3U'Nw _VCXԼqox艳:uVifP s;I,&5q.k7]\Zjt_a U;EPRybs?DzQ3$*4lj80sVh/hze_~7 c[_qܠkc(Aܱ/cl+3.hB")t|\Z2u{"+|ˋիW>eio4.fwn<쎽d "#_*u-)(?r:gY!Nr8nb%8H7<~]UJr8# T@'u8 ϔS6SSxJI燊ϩu1)۶&ZIEwxTXOh~)ƅ$o8gwǟT.8.J|$tB cUgխhuuQ`PQᖒq.V[/Tx Vvxq6IZ(.7߆ثatE:r3h s3ZYLvb5jFMy.Nuί?!U*E.ppqۮ}\>\n=" xYDh6*{H1v.Ÿǽ Yڪi떦q UTv8UE& $Y8kBD["򤫫kIZ1gG<8XUQz?`tfxP%ZH}sK~%\աKf.*ߦ⌳k^$b S1m%v}͞(a2=S84!V*{DhB+ss%L/u^oh8%Έ4Q($zEʏUv!Jh7W`>^emU AqqG"SWj?xEԩGUش1m(DVtyUdfGEI,uzސ"u <ģi%i>>#ML*4ռ[gv@ NAm599ճ.iL{~M6bG1%mq h, #; 8}e+vڗfB%)\)%? ݱR &TwpYhb*Oʊ$=.yV 뮉sCLF9wwBȓԭa7עH~}1Tǿ]8}!YL*w Otႛ WJ?lfjz(&]3s,wW )7 m]ly[e֥[qRS&e͝a8SyOs7QHN7"cELY ,ޅoH:5L wCvAi$.Xv: g>-\ҊaBQ/_ {/۩cw|Ēca8ԣE>=pƩr1 {MRx{؇W>H+(JzF߰)g&%we~UPٍm"I)Xqu;rI"n L%@"f8ZGKs}Ԉ/"Iq٢9\x6U8U<dS9T ِRr;e )u 7#ꮎgXrZ oy) p)h?$& ~)?qv8~]^ 1q<%8[7v~ VC3-o 2xw_ rg{ ׈p ZU!ѳtkW:Oe+^>9{[n 6(`zغȮF߹3p5}@7 jh%v3!v;nv\HkLۇӅ=F'/+ݕHgqYC"㿬I_禅r۠k4xܪbNxB#C-T(N!L؞YCII#"/ʯ!ΥyxCbb__mP!>Uu}|f 7\0aګKʺi~ڭfffp娏prN+c䌥&U5w+g LewjRi}}c9~wΝx s;um4(ɋ Jɋ{y+<ŴnJ0Doʶlعۻ*: E'ZRv'(F$G\G_x[XT:*6xm嗀UtvL61r=ZNrW\@4##i̸ݎŜزb|<*8 4zD4M)m&L*iβ$g󥍯zҫN:oucss 8KLE&Xw0[8=rsɗXre9`.{폑7׆PSa!I)T!v.;c759%I_z/c2b+Gf;'W9)WAWرTȈߕq7A\@+KwQ܍:cI8uff9eLnވBM>ehesX}%f[3an !܂b"$,k ǡxqފ1Ňr=0Lk3;~MAC _nX^蟹YJ?l?۰iq5~ FaR˞q1/>VCX73IQ3987iژ2',w^_]þe2dF2wpc3we@cUUఴgt0ս;}?1?I A||.DR)+iGq\|UMٰPa0jQ+`)>dr2 8+<ƛ1[b҆4חnz-LtݖWKu4)^QL-?q ^#Y1*WCH9v(O|A`?WN#z3awSdꨨߚ3dIy$x8O՚8:i,rboCcEԍUaO+Pͅ/gtW Æbufv(AmhMe k `lwOJgubəxcS 4ʜC x>`"Oʤ|0BR%mr!gBrEx~2+,~݀O56C7,=dEQiɍP'[nF4~gEH.2+srjBCHΰMߵ],cY:Be椵 (!T q(_m90nQ<JN9.E qs\/r(]-;]apӛkK|3h $LsXjPj2xutSQRݨnOMn"/ q'RsKM'Ƒ GNigb'u۶jgqhհa9d+bI-L&,[Sٳ 7{+PG:/T:n B>!>OhrEmB,ۧH O:{)Dljܑ~C3¨[Kc?{q__* LؿAfoQyNeFTfvUfַ̺?|O?x1{f?y1y>bܯ7~k^_x1vTx~z;oC^Lg۩aROjZ/I+Oz!`B>̿OO؋{G߭00Ji8Om8t,nMؕs%UaQ*ϳ\˧~ݭ׫?)a8loH2 }dMG[2\;ϚƱ8tӿ$$<*Gl|zuEO;(G"<]\/#CX&^M f<$˻n!l};tobci Kels2L\כnl}ޙKvL œW:kzcH {C\~E?x_vzݜJmNًR$yTFleD=(;=WtQ)Y]^^*1٬ I p_?g$' ;d˴/L,ΐ(rO:}|$鯆KA+bY'o\a00 @U7 @ۦYmF>{#%*4D{Α2IG5G$njfœeviZh0+IIS KGv""LraOa^.Wn ~kazHqZ(+Axje yt᭿r0_^s&\}趔k[l7y2:d;Å( ހ G-K뢼Ttw:`ᣫսf D5VYRt ~8 ƹm(䬻tQ&|nr;,V0s#WmP#y_mH7c\]|t|( Sɿ,o3'GqFCk[ǣS ތؒEe/bmܿtn* "}rMgoRe+OkOcGWz >f B!Oa&hM5F*9>0?kͬɬ49]=`UrcǪ3R&NU8'q%y\rPZk\c GK=r PugdnH H 0|+Naa{8r |*)g;CEq?"ͼ),JFwͪuo5Nj'S(02J.e$j.&Z.m.Lr|k\!Ʋ!ߥ"8rQxV17@Vc qZȈ&`G5 WTFNJeqIT3~YG)l=äS¦:6 AK\Nc-zX/92+ᯗ$u۬Gtޜ҄Qew!A .mj |r:M9[k5S_iETFز&vȽלf'E }[HkNp*a= tYO_?!<`Pϑv`]ઌP7rUF O;ֻja9uj7$ܝ15 !<fߍ#lu#i>({4KМI雙O;׫z^r mN7DiGJ瓑BtjM>hiV#?n,8Xgm#@a p1:A-@5>̓gn'9R;>h|2vsUL?vkFyJDIJc胿'IO6;Lq跳 ~fmtRpZK7箨 g$sRW(mSm.f{O={?V7h0-5E r- R_OجN'g*#S#[CxܰA0V!3(qJx 9[qz fmlpj,ф- DW=ݭD7G$ io[@Ȧ,XE"C x:=է4N]6B 4 9ǓTЈ=V &*u)c%Ӆg,0I*ytu?4]Ve J= pwv`n- GTuKBkHse>&'2qiW猗Td<3yNr<2u *qYށ 03t6*Jr:j!B?yX!1 \Ye@^e1U):مy%g6˅qe^PL9#B0D~"V 2wL3[[܏vz"!3ӒRk6ŏJø(a ].d[m]5.3x_Ӫ,bE16{J3Ul2B9fG(3ѴS@ \j+i{J.&W3UI_g9XkȞHDphf=F{f<-ХsWW3GyWƪr.=~@'RSww׃-YIduW:<Ul`!p^ū[?~\'<$>Ki6p3 kL mM8}=g]0=)J ~* {Zz SZUBY!+'pҧavMs1>bL@b=)DZt( 2nt0\#ylMXFoS:j uV'OHE?:6fj?P ,+, { 2f3j\PXLS~@k$XW #Wam=c/N X#!>w y>fۤ07X+oP2qy'̹7KPbcJezsu!`vOMȴ E{ )*^Apc NP'LԨzi2]Yw=cf.n8kMpўٹ1|VC)fADȩ(*X5} !29Y(ζfrp J0@QˀGڈ20h zM\|[  %ʍI v]> s Ȥʉ)OJtph{iDzFkseP*vJ!tb'(|/uO eJ)t&D駿Y.V$%z0G˱UۻB-QblɑTN,J:l]H#LH"E^Hϟjo}$*Ta2Sҟsor)rDvrWJ=:ڞTcdzt$,ɿnZT . QGKRrRIvSqԲ5 C07[0v;f9k ht_+ 䍸|&p̪d$\ y<flGqvkJ"UƳCt~Ht Jpc򣮕πOlx DFsH[[XFV+MIme;u+45͞>DŽu ycTNۢMlݓ}krWf+n $: m~B2",>7(O{HG`IM+ć4I͉H+Q) )n7\].p'9C7M)wB"4.:z5!tA wC)=AA:CţX|2IA/w-!v;ˤ+1JV`yUWWi]eT9,QMŪ{R+1 ݝMeoU$*6[]GQXghؖK !ؒ.?nZ: V;| _\fr ~PjV4D%}!%ƐL)tI1̒EvM׺\g8|{+>>736@a \5G'.q-deY9yU,-*!L6EtDֻ}|I1 uU1{|>EAJߊ캘1{r/I|coǼ\vo말'IHNL=Ɉ;`Pm΋ #>?XSBs;N{WzA`pUaeSwtkɟ'!}z 䶨4o6!w'hO͸ms%(:3Q% DmECwt-7b땹x@;y*0e9'gw2=4v{mP\Ц]wnҁ#e, f{H9c%5QN0STTtW{osmghs'Sb$iR }'<8R#Kp~b`NCγz"/][FWp5yPcm ~`ij=a>Gѭ3Wlu), zLkEV\!C&-5Yg*N ΢ \"0'H0ptuE!\=e{WfixYe [q:]Kҗi+kZ%e%ޡe_Y[Ӈ?U=gΞ\WUM8,*^Q_ 2\<:e6V}#"M;-:>ہSCC@Dvb4]Nfe,䒟GƊH8#/28bE)8ܭ9ĭOB|2e|1qNb(%i|#t2#t-èw}N 3 )225ƥ\+L1hO ^Ka hWU+U/SRz >m[B:J Q7:)t!迼x|-Q3𯶋~;@|~l(|nbD1<[#\D<|f3 <#Y-n4zjd7}AY^}s䱻.)C;qt#yäA a?@]hΐ_{ɡ2IZvԶ݇÷߾C&W߉?D;DŔ4t"Y ?ɋ8-&1NXBAyD%Z?ϑ7fێD Rͅ,* nuSgeqFNn&tLsг՛2|6nڤŁJ2;Ulzz`.6c 'sBՏ6]1f'ΎI*+RAPi݈I3^ʥ#?yf#e=ܚ &IG|yɍ=-)[>bz? -[n7m"7cICXcq4-VklC0aJiė"M}Çp+no?"oImfd>G<:s!M1:otQy!W"8gqRE)}_|QO| ݳU=D6keѐІ|n'_zmy"{2+Yno㯆rwد>}"Β&ڸ.]H }u Aǿ-Wrx " (Q!| wy!u?1M4$s|wUvH վ%0,qPR1ݛKoZ;|=pEv}w7*VM ۊ@~ š(97 /]mށi::!NN -Ool8%uqu=it2QO=a#V _۩a&զ !!Q T"d*W_!+~9+'= m_M'xW[=#Hߐn j' Nn: Wޏ_mZMx%(Ļk]E<*MOq6 4bqI0CN=ycoh6 Nű6d,< %›g}t]/df À7~^:TeEOxUhG oTG՞%ȬÞ0ٯIfc׎]w& Eb?\OjNLs#Lrg3vM0o3NfH9[^ƕ곢N; Zcx'᳢I_cZQχԍ{RT-'ѱuD'oVo>j⚵tH&@uVPc)%ԕv\l ?Dn+Be՝!@IQ.3QjO7ᗨ$`6O8n{!3-0On\O3Kֱhʷ閫]|}ZFCfΕ.o'.-h8p:#GAsq`n,=I];tVyaob$Gƥ S3r8SP!@NSѶL$03sm,2v^)Μx-Svl=uqfF|~zfm ?| k,ؘ l*Vi&e4C;X/ww=a97xC?|odC,Gi\tWjhHړ!?,Xm!>W*)UaVIC.ĺ )`j y!%{WIV10̑>(ϣg C!y}5)Ӻ$A6;v/zfjX9&Mznm{ί"ozÑGA1?q|!eg)ǴKYY tz7=꫔^uYChaA7XŜuAh &@iڵ&u_Yuk*xD 5)Q{kۧTDYho5;UloEV?NZǐ'P;h j YTk|y|b5=\P29EI6rc“#5)=ZoV1Bkvhq,ؒR;ӴTJD#3nqXVQ޷iKL1%4|sR{=Cݮ4hE ŇDėh$”{rG垊Peia;ǯ8 Ռq΃LJ8>9+CW1rPTI&YgWdiWo߇wF1}+:fg[SG /{uI0tg47eR:pmj̖kV\ GB:+4܇m90|6j@xX %W*nE4V\fhTif6fl{𭸹9NlRd$ȈKJmx1Sҗ\[)u5 yi-axnw_t7 seoU|-Sd4fKғsԏЙcp9妔di0kK<Ĵ;Q[e.=/4rNSz*Փ o 7cA.6N ˩\DpBfJ.$QLZl6\fgSԵT0MQ@V\akgb8y)JیY)Ý+2ii9OZ̓ r8njTD5-pg_ڶu_H7pC plR;&㟊`z_YF u}_~` HzvQ,&Ӫ]~-ozM\gC r(߇'ia,wL}]\7&eօ-uHV|!bDCF^\'Pfuk' bF~*1WX]FDu ڪNBɈ0sa\^첨~ד0ҰH(<_>ٻqz#.E g;\8?'3rHA:rQ\D?#KcҒ!ur\NZUb7N\)6~3B`͓d+^? t=#sn[xSҚGNN,QehQ3`R[JHqlX'9e4[Yg;V|ښTOhyHCTչ\hy%LA+jZݗw~Xm.QPifJ:˶ԤV8vQ*J%f4k=Ii:Bo To~E^zVq Hq&٭75JKQr9;G3On0ܥkBDyu:~9P ],r\1 f90Ȳ@\ {ʗOGAI7ce|kQ,s5vL[mU&D]O ޯ>!#Kuv䲝/& W*njԮ %)qV^6jL׵ՠ Xdی W؁cOI2UȐ!dq,h#Id9YS]\-6(뜭u~\b>*xIwryyL"A3kz\:M/* m(<a1L~۵\kw{k(|ްi.4~)e>Ns ;SX}ƪn7*mZ ?Qk{[(DOF4v6G7+L#<]xۊm9'N[4vN ǃImKJ=oׇf B;ے!7*DvhRx$;ř+oQ;[Pל=?~En%]zW֡aއළ#0.a*-W0" yK)F(>9jGe)';ZaGWs 2)6R9B{ӋM),$yZžNٷ?$TU v&Iqm3ѐ}U$rYh O{bTQ :_9(Γ ̀}YqTb\h,&]08!jFIӜFmL?>i8D%Zug&$mO%"|@n$RBSrIqsQ:}Qw>Kg|iUjyH@ʹjiwɱ}xh $-@|:{ o/}h:hIlAPP}Y~ NCBNOh]+^NÚ}rXxznvԼśZbϵjm,+kj&T!Qlj ]y,Ou*6V! :71VZU*oB놲*lyBD|vx"Eq6*Ű9|߇氞nIcw׼<*?Wb PTor,I:抓-uv?O%4zk`%i9;P)fNıtPED K&89^Wښ#g7{6!lwݜa6Q2=R7XփIʗ'$REH[wow=LeH[Oxfwٜsn{@nD9\ua5wN_`lX9+}ś"fZCo?>ir,7r ъrC@EYti&Ź8aRj R1rbDV5.: Ǻ󸗥3qC(?t%$yN)+'dJ_T$M+cu˱DÆZ9B. QʟXm7i@yPcTMlřOSUE_LNq(1ORf8fpخx“s8Qsq)$rwmϾKS.$6]Z[}{ȉ|S_kL#% 2rFжf ;̬ SaD-I9̧zl}glm1 |XYj_6H×'IoMO;T.#fGX~}$|ح~繍*ͩ*p!ym4`=I\!,*o A rڑûmzfW:NCeO:` $|^*dZ7*am= l3(xjmF ȄkԤn6OO" K Xp䪁7~j Ow1qK5n,0i hCpkEy 54O罒qw},=r%ѹPsNL=Ө=NQ|a\U+8OUI%1jn#`bS voV|HS+q vN}S X,WrFt2^PWZU'31`I* S _Xʼ-6Q0ێ12Ę`4r r.Py'&3[}k[m>4z$/_$嵱f֖k8wzAǬ ėrFX+ əV](S#XIz_!$1빙rQk9[z(ORRFZ_R#_/j?G LŌ7)vTS *#@RKLY<߇Ägݮt!7;ҋ+)8[! 3G$UA^'^DEBN=HAUHiò2tJU((yzpZ칌rۓEĤ@Ny2h_yp7n9E & F(C3!1UqQp+.g ӵ V̫{;Yr䘶ΝsҤfYQO7<oHHᘐk~?ln OZG,G <I+24 SNG#o֫z1 >h}r]Ͻ!{ry+")%bWeƘ\Au:lJ;oJ:3Ev=)ns<וoqV8T (.HdvE[6 '̓έΑatjV ol,9ReƜ؋]D"|= X.=}jzV@u#\"&y\w\B{Q#Hg܇zڰ[rH~=Q4)Ŭ40Hq6 73SWDٶ_mK}8{qMUtYQβI_ җ9=9T$0ܧ=VE/}r,)0A^^3_N= KWR~&TH%" 5oE:'6]U7G:awwIV7i!&H I<\5X:ٮ6޹+)'ҝR=:~wXCKQ̋:#JK"fU&kDS(7΄Mcxac9C!z ~ w`K{U{N բ5tQ\.y7E%WwMVq;K.3Đo] $& $+H;?x7s=EsL+ΧdsL:Xz~hXUj^R?Li}fRorWY~&* ĺ"Ɇ k#cqfr̴29fpaՐߎ90)֒@6q_b~= .ұZ|m! ׻v;2yY m. l˭rYcHb쵉)*z-ÿ~foD*{q5#kH8f AdQ&sAj,PRiK)+6&73]6* H1-um)ۓg<suX6K|Ave]V])qV3WUK =]iDXyMW[OOaMyK9)Rcn?ƚ;YyCk }!/>-<4i U]e כ܆wf.tIa xD_&gRIɭ3ӹػYhF 7wQ'~sMbr8?*k%%znA0ۏ뼡2O!Oz̽*_btlv қ/H~L;ZR%sq g/1i<zݤ213}@j&D9K)n #tͣ,J59[C]m>hՇ_z ?kzV(vF0ɳ\@ \NJBco g:FdE&80+3I)<KTյ \W9D Ʃ%[3۞.e>č i2HB:xW^:mY(fO>l4^4-' 9\2Q>6!9`cNU.*s||O0w%Ոӷl.2<|i˧w؃?Dn#=Թ8ra[4wS^t` !g`pXSqHH(u}g̻֛ ($RN'zw%*];dn0VUEN72xc '<$;dÛghU٤}> ?'X'_ӡVx^υ{gi.va}A +"mAäK7_҆;^JZ7hع6Ж>~٦5DÄ$)0lc\VEC~J߯ 4|НjJ&/ gʆB˒ؑ!U"k_K/&E'O-Ϫ̔Ds,'}U%*`]9y4աIm1Dy'=ncNRBC_Eۏ$ԧ=.}OȌ y0ȼ7vyx?@B10ƶ, /6  |8{GFUfUEtUNOMUVk[ӫW^ÿ?UX ߿_zkVfޮo^i׷>2s/ggkkOxyֵ7uGO[üW޴V:~/~WG~/?#/Ŀm#s6ʿό_Gn=~<'. |xY'7m|kEĊzN߇$#v.MxB^(/QJI jٴ-;)"hmHSЀՉWx>8?BVmZ?73Ѓ.\> t >Q{!1C0^c{VWЃ$s; gҲ0x40 0: y< lԃ9%cyTMl۱syWG*pGU"[d VCuNnw&ڝq_++#[H8=w{/n|%Fx: R_1Eh,F\(JEO_ڃ4_J1e )+9~&$%$WIZmP`LL4n }.Q.΂Dɣ O@:)}n@AwޏBo6h?5wBkHHw‹tчڅFwl9RWha XQp`]kd)`1YO1;@QO*)8T D#| Ȅ5\МMuΧ'0%. Vy%^d1W '57|qSj|7 Wzלvj|ή~иd]2Ty-@ k ̠Hdfm<+Ls|ނ+3[x; W@xlXWt-L2*c/]NXم^i >`#{h6j9  rUH&T&q [;V/1unIeQ} ]\e> T ]9= (_^ p@ٳ‡Heߊ< N9: fS"~+!8e=~AyFX- x&aS9`r=bw"nkdk']n) 4&IsNg: }їiȍO6>X1ytt8Nq5N$<"+,&}1 <zqqϮg\9?= tƸ ޞXCqOiÄ0)`u(cizF4M@ORygV̈́(}ZKiYҿ1Bj`$ 8*5g  ^rAO_ozXTY%1^1/ M۵) \GnbLb"5߼L;OJ hw΃5C"g GRlʌ¿m7~5>ӒH҄֊gL t_@m tyeK+죟>PqxmC5ϥ55EC=eH&NE\o׻ם`Ҧ2,9WI}b sJ~%sg ż:P6z_UspX<C.:g㝊lW)i23] -^R a! !rXG.I kS2%v;(iyo,r:L@|H-V!z4A>f6S JM: O14(jTb^~5˥z UEٌ2Olm''ﮮ2"(d7g + '}ireM~ɤ.8!. O#XH8/ 1- ([dcc |p + A%tI%KQN-c}h|M\MY'R4LAsLŇ8]n)r|,,Vʹ :9J!ƘU,/gBXx 1?Zw|:oV; ؝~QڐIGflSC[}og`snj)=&[H,H?,/bVǠ%Cyd۷Jaz 6$k*{G!,.1zi9b~ Ohgگ5Ae$Jft9:2i? G"Z{AјN u 0='NyZ')4=}2!NO)~޴fzkg ]iC&YS|H?b*.%݆I=@?.z2נN;:Yo#'hXA$ j 8)r]TK9{jdo |mD{~&S]gMw>nc ѢXh/Wzym :W|&d몺Rox3āzԅ?BXS' o&F+="k0+n,TZ#\qa񋒞^X}sWy>?%}1@ 9'\u@#*/p}no oΤ&!2ST}ۭV>z\.Wűe  gEƮ`l,&Ymx2l7e;A=$D~-y0:u;,ŊL&گ6Ay{ ~50Oe?@~<EP)A.4n >߭~?ZynnzǸB+Kc oePlqJi+5!"*$] éن.?3DCu{8}\#Zwm7d$)~yV'l!nEGӖh)k\l:shȮKfo,O^SK@9EẾ0Z{a<S.nDfX\sZku8v+b'|$|lFDyB^W>H'Se%}  -j隆݂1 [-&tXa>ނ@O,Wv?0`1>5jcJ( "Nv)1p6r^["%v>$"=ا8_uloACc;ؖ&`|__i!9f᧑!>'m\&vq8<([>78$496L0Q g$i'!v!~O.-'|'fHdM9~FfFOLdA^,w?e s硾3coINX{Eז!Zbrgu{& np MfPu4:68e^~v]TPf%8ca4mc~-7a$k¬(8Ah(\*WZYa7?@T0THNq)Jߕfq&8y;I~xx{)~z.RQ1R!ܭ>(c־YF5N%VTd34Æ:%Fn@tlOv,=&?4N{v۶]ŦCaׁOc&7p7%dkͯ Y*DeF9#=&%2.;x>12rķ8y{YZv\˫`xu |^T|>[)tjwٴMjaztD\e'`v$8Q;>N"lf5'D=|eb,}pvc(=ԦcSKtz=Z?f` v6 K̿<7#؝}UD?f2|YbrᐙM9}*'iv ?eSfUpnp *L-:ż:,_V7UyULϗm7?q8+Rf3cTns]e+PVs+muSv w$n ?]))|kWr1&^Yc8qJ! Q+[\ڣ|J7pMml +ԘyAHW>XǙnӮcc8s%(f(agM|UQ&~g?0xl'3)gW؃([0ݤӰ:%GOOv\ugcַg#ц{VUr$tbqIeVI8pag~n<drv,C?ߓ珇2r lS@Y"b558ّo#:AqҞ3 Vm9.'j@ѲSYI?W7mlmCxgjДLY:*JiZ0>gpFQI7252~Aչ ^ԛ.LB!KSKucu9~狂IipڈK)̭\Y% ץ,eC xsVq:u n7rS#,3fMYe.Bq˘Uy9cfhvƔz-%gYJ뼪f3lk;<ގڒl7]|@?ίM /UQ/TcV]Tłgzc(/qX8\4N!'p*CUZG &5n2Ұ(:JrտI& wq PĆ*ke42XK`b)JOjuG~>jPVZqɹ6HNCc9*cQOc5cx ZI}K/YT&<t w*͎6|vY}қ0z1 99PFI+2Zh[\om~;>hfzK@=mY()8zihl74ㅃoO3YQ=WX]o X|@y>K|34lUC[ p/x<ۯH39٘O}. D;{\fYHl.;_݇^5)L{bNu{Ie3KiU(\U&0! [)IlmYB/N#@9zF0XoW8UUp&y,pKqz2ݪiWއ{~M'8j4s1 a9ڜM>}Xb/- ++% _$3փ]mqx?<.kb:8ϭ*%$`Y:u7Gziqۻ>::֤j Y@jq1֯=TW"r{]Ghx%JQЀfPWJ,,EٹR]-n Nv:锻ˆ?&Mӹv1g%Ƭγ7eu3pDe)? 1=f2Ƌ?Z-lTW մ ,k2V`W8xLOOGQmR3&=< A'RWҡt)mEBunj'(l /:F宾XnxD).sW(E.h,JXbS #nZbet [b}gZo@'4CnEE#@8ٮ6& fYN ~cBc7&Y#Lbp4xyD:Q6.d?<C\}МQuߴiCC8/G}K#ugbO;=B~D—a|p )SVBΤ1⪪UŊz>zbmzov (e@J.A ߐB Xuq"42`iLb,G7ix# ɺ*rU.U !c8ã)qė_ε3Xv,V*;**DaNPUhņ߭&Tl~T %%;V]9..sW3]e&ʂeRv*P)rvNYve(2.# `s9(\sA;<0+fdݢRJ(כM>wVE"gm G}U\ibށR -$.53“ĉ%/χi׻U:h\8TG] ֠hR Hv#9p4$8ԝG9)imz+DH+Ȟߵk St?_,,L7!sÝ<{҈BvM{(|/DCۭvI'\@*jhW#l|9Gmსs j}|ItA1>S;iU'ovu&Hg.}W}\+ .60) .tp ܝw܏4/kC]nJOZ:NEq8ј-.5r) { WP +#'򤖘MPsǻ@05BZ+܏(тT/*ïqr[c ۯ.zA6OcJ[BY5e|.v<XUѱy?H"99*jԸ*c^$"u3E/'} ]*?>gI{1049Y|Vbsm3*̠ uJ 6zv >엘a ri b?`$$KH%$ BGʇ}=l>Nնi~{|C]<]Sl RNb|uxWM'iV/3Grƙ,((}=9ca*53ӣ߇?9t|:CY\w}yu Ѹ^8Y<@A%jNĺ#͟M=hwn@/FN3S32;95WƖn0U֜-2{rs~d߮f51JaAi!|l>Sq%'[qw3 ˌ+y,.WA &=8` ί_ow&8X|t?z˹;6~Lp7M mB&4c Ҿ 685.,WiG~VfH/$5$RFRfCIǕn>gcClumF_豛KW3L0kardaoI0շ\;[q Kazw߭g@aI6U=ָ9`[ge}?>ĉrKqL8$"=e菤=TDݑ,ȟ>/m!(,U|5mP3?&ncPc~q/'}(=32ziPLW$+(MJeCD;&jSku ׎G"71'2}q1jdd^1SϨBZ+B%W^zf>gv.wG'&Սđ̴Vcv"|kw+`$|T$dyiLk])i#!$ӾxuKVqރ ;8Zh4. BnjF[MMMہGvnׇF辟7aS6c)U1'o~8z30=cgTgtbpF^c hsiv&9q R{-#b,8nAS0[0/afP8EkM 5j{_6m,>`/bhNK$<ҫKα uG7aċ5^5|; [#IvM/ [_sZ=3ڸ.sZfL>MIgpLcfHdȪDG~pno[]|?!YDž[i8boކM <.cwas侞 !5BFW^/Nn]AK]!@ThR4/mm>FIC+}ﰳ䲈0hnj=Ay\p5UAfZUraMS);x>_y=ct_QD/jpTV͹6 DNp[pi.2i%3I&<,s\Ө*^BB7kCR\i1}?-ϲ2O ՞c-s8\g<8<<}n q΅z.K|lek','g]Q;IX/3]:d;6ZCg$,:vq } v?~ H ^TyŁ(8:w~?ڬu\q3FsZJ@%a+x3T5SxLSe vf^zqIuއM6&Y{p$Bazc8ɚuN 5<Kl:R׸S1]=~AYY-)w}zX^~Z+Fɨ?*U! ])k Z6'Tx1$Z#*aA\հJn$1[Rܥ즪o7n]M. FcA[4\vhou/Ohj|{No?Ѕ>T(__~SЈ:>C; wߟgd&9vWs(8!q78VBh=Z:~w]H'Cǩ#ۂ*-bwx-ADy+7]tƅRGz& /`t)Gdo :s~ m۬G=XpU &^ܸ N7M W??OY/D V>x&r+d赛{bd..)-U`*ߴfkϜU3if}ۿsHq-ǙqCd4&ܺXh$g; vİGpzW>TҶ~K= 𥔁ݰ} x_]Zc]|6CpukM{hk|]aqZ'?=5;hccIИa:_nrQq.%D Nwc.Z̘EVIʗ)ee|w?Kݴó`TYx.fDLm}_?=?RZmbzaN7 K7h 㥷kʡVRQ3;>Co' 0X.EʳstIE ~}vO.t.3.I&msJGag(ljy^1PO@2}E}(&vu̿8̸mYnJCA:y?0 mt38RtQ|^*Ʈ q_I_[õ\1lrU`Ѣzkj+ 4n$ޫ'\6#5kd?Z"⮻3F(sT".Wۨ/vsXDmo#gό̐w9hah 1,OG9ՠUNqOISOώBtm\?TcTOUƅE7-C|qT\ESz<vdpo'v2MX?! c57ei*M" nihpakDmWŸIsɴ6!d]jNv}wpäWJп/ }m Ǩ:]ω|_ŬOO19$>\K|MVG|.^Jï@5]mSqHRws\./9%SB,K]RY!n-ƙ:6 6>}_`I,yZ)x&x"18KQJ !o|zMrtJKC$2M{6#J鞹\>S/#ύ`L|EM .Z_"ۧ|.B#3A(D/aҘ0Vf) #ta]U /H?B6YKN&E .7$8C6:Ѧ6m9 Rl'{.&ZQY!a S\2My{T0.1]3%7oF{D/zۼń:ZY~I]R/,ݟa?\9wG`gOwMsW>B4o5nrUXTᲛGQ(dhI0f*{$v^W񪭱lh ڠTdt169~"=~vm)_Kr4b;FrC^ \JS;:pއ;<6Ͽ}Jq}eO| BTΦLTm̓F'l'I% Px+tEjt  Ÿ?:o!ݴS/\BŞX*0 `nXatZ0 ې6r5Ix^s\aь'ZD%۠@\KF9_7َx%tۮB;>*b~S]yO4}q6S2|Dԕ R?\Q_S!Et٬)uA&$]2$!h\3z qэ;Rf*;vfm- Nt|LJN=SyjĸX^kԵd׵s^NJJ jeodow~yksoa# lkxK+6:}֦Ǖ`I * |2dH=jcGbEӳϔ9 ]ӬIn.3F7G&%,+9 ueJŝ e1~ˮVS,'EB#=|M:RݛZ۝Yѕ\c6D"4IVJ>qQgXe:= 5w‹ʼ#I7U9g8Z]E?.%R2^e^ ܦ^j!$ z@5'l6С2pw",c{r91yfXJ']EۗyvUυmݭ cX V51"k; aYE<x*++|}ssn6S_7eǗ2'rV o&mZ>B.K68Dqhu:ly\ 3")EQ `9j~nO>KF LXhK Sȇ). &ucIHAI:?nTMqi\iCyy6#Ԡ<Nr: ix}pXʘ&ԅ}GܸP5{?= A DRϬc}X?A953ե(IW_ﶻx8kJ;E)d SR6D04( SΟ Uœ;@"-zI#mJ:8}}7k܆F?ށtF̄bY/ᰊ̚Lꊝf.r]mvb_nGC䛏+|ߴz8ʃM *ZD P$8ߏ: >SQq% =L`"MԂ UN8 pjjӭ(0 fC]0`&?O=0xJb.V܉LWo~7~awC-09ԫCJa@j| E1s2CdF89vDlӅ6:vxNſZI7//B1KG;Ľ/M"FE%0Za+ִ}~q9m۶ƪ1yoMW)&\P IHѸ6zC_<&Sۛ} QGut*m^ ڈs1cTYp$x)]ߝBƅ*Ǩ~DօtY-.5ձ>K\&ċߜCߜ| }>U0>F-RZKi.a\U2p+d-]Gyv4)z'Pp+I=^r[fC`X9nCŧy_u/ ~L[o?SHNWh`4U=3jQ\?H8Ơ=BbM99vY])Se?7 Z[QY`W%MYkS[j)_$07]9^S&*~M=-|iw\m_gק>d8E}TclhO' %[*WO{_H[vwFf?>R7*iGMn6̍Ce::ҕ:N]# wIU wa`;s~ҝ4Bw66211:U2AkKnoC+-9bP[e87dWҸf鎅ϣ3$]-m v]"G2wzÓ┎L𣱡A7j-GEH]6ޒxpR!!:uImv5(+1xO*$5$@Ӭ)N T:+^٭>^C4*DqMH̅ u*x^2VT ş?pvcHvԂDxC&Oow5ő5p7в:" _YvTCi\X&hG!=8T=azf_1B+fj s.ʠ|P oRQ|7dvl [bժmf4DH%ez'쑌.ׂ>1ڳkM;.loB [8&!B* fw+{=hov wXq8O#A}\H}';?ўrr?g_>ck+HCɸ_x/W]i;scPBl_ tAqrP!t )U78=~OS'&桺_ך.1y=njmPf/ qA |; .Ɛ]Qc5@ݸ mm}yd}|%vKQ&ծweDA!fe]?W?V>>Ѕ&1  (iλX. Lg^{2=1} d8rڱxirѾ$4Y0cGχl.n7p6b.e9*=>61A'^߇_8+IW ]*Cw? +#Vݭ,XQغ#}3> ZX Z\\Wf1JwTIdBQS ݝ_kmfMfiAWU?Blouؽ?Be.6So](tşi!p%@(%73W2Z6$W"cEe:DBC ZMsDEI `vgtI~=J|`+#(KRIrي㲓TNrKgf+"wMXJoz^~݃/'w'^~<-I:_b^ ~l6k07pmm.Gf}_>f%cr;c|߳ c XmZ ^k½i C_SJ_!_ WOyC9.hx;!XI:98;$]cwvDk݈>ժ3Ƈ״1Ƹ ܀(u$%^!c1/t V:Vb01qk$nQ\{F'J^)!d JR~ 9RCz;ӐϻE`|(6r#ܕ^r`C-s_e3yJMj}c>5aBfƣFzȒe )C}nI/{|1Q|0c4?It/U>!|?nE(5u$'dˈҊE I)0>Yy8Xx=rY9;gcmz%[W}wk A>.K>eU-W]=`ųFۯzHZ8ӰA'* mO/{h|:u 5H#SD*Q)|y<eNH6ܹ[u?oyy,]i/Azx B IBAɇ%}'lv9a+&h=&|`c뎠i@"zڞkoͳG̋b5I35̱B tEy7L9vl!q)}{7E6}_L~KEܴͪـ`E.uelK_ZםlEB%ݪM/\R{-Ҕ'Ө . gq.Uނ_O}w "4ebpa$CzbQ>$'vSYg/VXA"Cg4tu-Qb'qi_;e5x0i@֡Alʱu餚YQ2_ͻ"3>]аDh*XZ5$&劈oZOnVyQ.{ST;EGXC٤Pnڠ^4~ZxWeH=S=VzW4C3Sj`r*n#6HAݻ!f9X!4[2BEpkO+$ayJV!z7~WXowy ™ h*$ќ"?YR >37$E ?Xp8wIMaV6ɬjFo*[yqj4eM5yVEZE?7%AGK S#0yhN7t o}Xh.DLi&US`a=EҚ|no_w8Zf~~doˌ5+3zЄ|V]oiXxTeOh4A43(v4_9?E9LhRT§|Qo;~'`5_?澮G$?m4 ~4nl`N%VѭQ\*.zU$-''(J HI-AH!D$*ns ? 8']4AZ.0T ++H#a'y>eYUY> mmi.a ×5 Yi=x/-]NJJ"ph!Ō"KKsE>;;S4|+"dʋgݑEyYh& S JNĀ'V>FE,Pyo.\ א[9P3:sRoЉ"u2ڡ݆w_-e{= Zsr0wKxP}uFZLidN 4;?׭rSLp݌}G[lX9H7k5̰m Ub+2hI#SG0sFݗ|( hmH?'BCGenomicAlignments/inst/unitTests/0000755000175400017540000000000013175714431020170 5ustar00biocbuildbiocbuildGenomicAlignments/inst/unitTests/test_GAlignments-class.R0000644000175400017540000000222613175714431024667 0ustar00biocbuildbiocbuildtest_GAlignments_constructor <- function() { checkTrue(validObject(GAlignments())) checkTrue(validObject(GAlignments(seqnames=factor("A"), pos=1L, cigar="1M", strand=strand("-")))) } test_GAlignments_seqlevels <- function() { gal0 <- GAlignments(seqnames=Rle(c("chr1", "chr2")), pos=as.integer(c(10, 100)), cigar=c("50M", "50M"), strand=strand(c("*", "*"))) ## Drop gal <- gal0 seqlevels(gal, pruning.mode="coarse") <- "chr2" checkIdentical("chr2", seqlevels(gal)) ## Rename gal <- gal0 seqlevels(gal)[seqlevels(gal) == "chr2"] <- "2" checkIdentical(c("chr1", "2"), seqlevels(gal)) } test_GAlignments_combine <- function() { galn <- GAlignments(seqnames=factor("A"), pos=1L, cigar="1M", strand=strand("-")) galn_c <- GAlignments(seqnames=rep(factor("A"), 2), pos=rep(1L, 2), cigar=rep("1M", 2), strand=rep(strand("-"), 2)) checkIdentical(galn_c, c(galn, galn)) } GenomicAlignments/inst/unitTests/test_GAlignmentsList-class.R0000644000175400017540000001165613175714431025532 0ustar00biocbuildbiocbuild.noGaps <- GAlignments( Rle(factor(c("chr1", "chr2", "chr1", "chr3")), c(1, 3, 2, 4)), pos=1:10, cigar=paste0(10:1, "M"), strand=Rle(strand(c("-", "+", "*", "+", "-")), c(1, 2, 2, 3, 2)), names=head(letters, 10), score=1:10) .Gaps <- GAlignments( Rle(factor(c("chr2", "chr4")), c(3, 4)), pos=1:7, cigar=c("5M", "3M2N3M2N3M", "5M", "10M", "5M1N4M", "8M2N1M", "5M"), strand=Rle(strand(c("-", "+")), c(4, 3)), names=tail(letters, 7), score=1:7) GAList <- GAlignmentsList(a=.noGaps, b=.Gaps) quiet <- suppressWarnings test_GAlignmentsList_construction <- function() { checkTrue(validObject(GAlignmentsList())) checkTrue(validObject(new("GAlignmentsList"))) checkTrue(validObject(GAlignmentsList(.noGaps, .Gaps))) checkTrue(validObject(GAlignmentsList(GAlignments()))) checkTrue(validObject(GAlignmentsList(a=GAlignments()))) checkException(GAlignmentsList(GRanges()), silent = TRUE) } test_GAlignmentsList_coercion <- function() { galist <- GAlignmentsList(a=.noGaps[seqnames(.noGaps) == "chr3"], b=.Gaps[seqnames(.Gaps) == "chr4"]) ## RangesList rgl <- rglist(galist) checkIdentical(length(galist), length(rgl)) for (i in seq_along(galist)) { target <- unlist(rglist(galist[[i]]), use.names=FALSE) checkIdentical(target, rgl[[i]]) } ## GRangesList grl <- grglist(galist) checkIdentical(length(galist), length(grl)) for (i in seq_along(galist)) { target <- unlist(grglist(galist[[i]]), use.names=FALSE) checkIdentical(target, grl[[i]]) } ## Ranges checkIdentical(length(ranges(galist)), length(ranges(galist[1])) + length(ranges(galist[2]))) checkIdentical(length(quiet(granges(galist))), length(quiet(granges(galist[1]))) + length(quiet(granges(galist[2])))) checkIdentical(length(granges(galist, ignore.strand=TRUE)), length(granges(galist[1], ignore.strand=TRUE)) + length(granges(galist[2], ignore.strand=TRUE))) gr <- granges(galist, ignore.strand=TRUE) ir <- ranges(galist) checkIdentical(length(gr), length(ir)) gr <- quiet(granges(galist, ignore.strand=FALSE)) checkTrue(length(gr) == 4L) ## data.frame galist <- GAlignmentsList(a=.noGaps[1:2], b=.Gaps[1:2]) df_group <- togroup(PartitioningByWidth(galist)) df <- data.frame(group=df_group, group_name=names(galist)[df_group], seqnames=factor(c("chr1", rep("chr2", 3)), seqlevels(galist)), strand=strand(c("-", "+", "-", "-")), cigar=c("10M", "9M", "5M", "3M2N3M2N3M"), qwidth=c(10L, 9L, 5L, 9L), start=c(1L, 2L, 1L, 2L), end=c(10L, 10L, 5L, 14L), width=c(10L, 9L, 5L, 13L), njunc=c(0L, 0L, 0L, 2L), score=c(1L, 2L, 1L, 2L), row.names=c("a", "b", "t", "u"), stringsAsFactors=FALSE) checkTrue(all.equal(as.data.frame(galist), df)) ## introns galist <- GAList grl <- junctions(galist) checkIdentical(names(galist), names(grl)) checkTrue(length(galist) == length(grl)) checkTrue(length(grl[[1]]) == 0L) checkTrue(length(grl[[2]]) == 4L) ## empty ranges galist <- GAlignmentsList( GAlignments("chr1", 20L, "10M", strand("+")), GAlignments()) checkTrue(length(ranges(galist)) == 1L) checkTrue(length(rglist(galist)) == 2L) checkTrue(length(granges(galist)) == 1L) checkTrue(length(grglist(galist)) == 2L) } test_GAlignmentsList_accessors <- function() { galist <- GAlignmentsList(.noGaps, .Gaps) target <- RleList(lapply(GAList, seqnames), compress=TRUE) checkIdentical(seqnames(GAList), target) target <- RleList(lapply(GAList, rname), compress=TRUE) checkIdentical(rname(GAList), target) target <- CharacterList(lapply(GAList, cigar), compress=TRUE) checkIdentical(cigar(GAList), target) target <- RleList(lapply(GAList, strand), compress=TRUE) checkIdentical(strand(GAList), target) target <- IntegerList(lapply(GAList, width)) checkIdentical(width(GAList), target) target <- SplitDataFrameList(lapply(GAList, mcols)) checkIdentical(mcols(GAList, level="within"), target) } test_GAlignmentsList_subset_combine <- function() { galist <- GAList score <- seq_len(nobj(PartitioningByWidth(galist))) meta <- DataFrame(score=score, more=score+10) mcols(galist@unlistData) <- meta ## 'c' checkIdentical(GAlignmentsList(), c(GAlignmentsList(), GAlignmentsList())) checkIdentical(GAlignmentsList(.noGaps, .Gaps), quiet(c(GAlignmentsList(.noGaps), GAlignmentsList(.Gaps)))) ## '[' checkIdentical(galist, galist[]) checkIdentical(galist, galist[Rle(TRUE)]) checkIdentical(galist[c(TRUE, FALSE),], galist[1]) } GenomicAlignments/inst/unitTests/test_cigar-utils.R0000644000175400017540000001042613175714431023600 0ustar00biocbuildbiocbuild### test_cigarRangesAlongReferenceSpace <- function() { cigar <- c("30M5000N10M", "50M4S", "90=10X5I50M10D40M", "18M10I22M", "99I") pos <- c(101, 201, 1001, 301, 2001) seqlevels <- c("chr2", "chr6") rname <- factor(c("chr6", "chr6", "chr2", "chr6", "chr2"), levels=seqlevels) ops <- c("M", "=", "X", "I", "D") current <- as.list(cigarRangesAlongReferenceSpace(cigar, pos=pos, f=rname, ops=ops)) ir2 <- IRanges(start=c(1001, 1091, 1101, 1101, 1151, 1161, 2001), end=c(1090, 1100, 1100, 1150, 1160, 1200, 2000)) ir6 <- IRanges(start=c(101, 5131, 201, 301, 319, 319), end=c(130, 5140, 250, 318, 318, 340)) target <- list(chr2=ir2, chr6=ir6) checkIdentical(target, current) current <- as.list(cigarRangesAlongReferenceSpace(cigar, pos=pos, f=rname, ops=ops, reduce.ranges=TRUE)) ir2b <- c(reduce(ir2[1:6]), reduce(ir2[7])) ir6b <- c(reduce(ir6[1:2]), reduce(ir6[3]), reduce(ir6[4:6])) target <- list(chr2=ir2b, chr6=ir6b) checkIdentical(target, current) current <- as.list(extractAlignmentRangesOnReference(cigar, pos=pos, f=rname)) checkIdentical(target, current) current <- as.list(cigarRangesAlongReferenceSpace(cigar, pos=pos, f=rname, ops=setdiff(ops, "D"))) ir2 <- ir2[-5] target <- list(chr2=ir2, chr6=ir6) checkIdentical(target, current) current <- as.list(cigarRangesAlongReferenceSpace(cigar, pos=pos, f=rname, ops=setdiff(ops, "D"), reduce.ranges=TRUE)) ir2 <- c(reduce(ir2[1:5]), reduce(ir2[6])) ir6 <- c(reduce(ir6[1:2]), reduce(ir6[3]), reduce(ir6[4:6])) target <- list(chr2=ir2, chr6=ir6) checkIdentical(target, current) current <- as.list(extractAlignmentRangesOnReference(cigar, pos=pos, drop.D.ranges=TRUE, f=rname)) checkIdentical(target, current) } test_cigarQNarrow <- function() { cigar <- c("25M4D10M", "6S17M6I3M3S") ans <- cigarQNarrow(cigar) ans0 <- cigar attr(ans0, "rshift") <- c(0L, 0L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=3, end=-3) ans0 <- c("23M4D8M", "4S17M6I3M1S") attr(ans0, "rshift") <- c(2L, 0L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=7, end=-4) ans0 <- c("19M4D7M", "17M6I3M") attr(ans0, "rshift") <- c(6L, 0L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=8, end=-5) ans0 <- c("18M4D6M", "16M6I2M") attr(ans0, "rshift") <- c(7L, 1L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=25) ans0 <- c("1M4D10M", "5I3M3S") attr(ans0, "rshift") <- c(24L, 17L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=26) ans0 <- c("10M", "4I3M3S") attr(ans0, "rshift") <- c(29L, 17L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=26, end=-8) ans0 <- c("3M", "3I") attr(ans0, "rshift") <- c(29L, 17L) checkIdentical(ans, ans0) ans <- cigarQNarrow(cigar, start=26, end=-10) ans0 <- c("1M", "1I") attr(ans0, "rshift") <- c(29L, 17L) checkIdentical(ans, ans0) } test_cigarNarrow <- function() { cigar <- c("25M4D10M", "6S17M6I3M3S") ans <- cigarNarrow(cigar) ans0 <- c("25M4D10M", "17M6I3M") attr(ans0, "rshift") <- c(0L, 0L) checkIdentical(ans, ans0) ans <- cigarNarrow(cigar, start=3, end=-3) ans0 <- c("23M4D8M", "15M6I1M") attr(ans0, "rshift") <- c(2L, 2L) checkIdentical(ans, ans0) ans <- cigarNarrow(cigar, start=7, end=-4) ans0 <- c("19M4D7M", "11M") attr(ans0, "rshift") <- c(6L, 6L) checkIdentical(ans, ans0) ans <- cigarNarrow(cigar, start=8, end=-5) ans0 <- c("18M4D6M", "9M") attr(ans0, "rshift") <- c(7L, 7L) checkIdentical(ans, ans0) ans <- cigarNarrow(cigar[1], start=26, end=-10) ans0 <- "1M" attr(ans0, "rshift") <- 29L checkIdentical(ans, ans0) } GenomicAlignments/inst/unitTests/test_coordinate-mapping-methods.R0000644000175400017540000001166013175714431026577 0ustar00biocbuildbiocbuild## CIGAR ops M, =, X x1 <- GRanges("chr1", IRanges(c(5, 10, 20, 25), width=2, names=LETTERS[1:4])) align1 <- GAlignments(rep("chr1", 3), rep(10L, 3), c("11M", "11=", "11X"), strand(rep("+", 3)), names=letters[1:3]) ## CIGAR ops S, N, D, I, H, P x2 <- GRanges("chr1", IRanges(c(1, 20), width=6, names=LETTERS[1:2])) cigar <- c("1S6M1S", "3M2N3M", "3M2D3M", "3M2I3M", "1H6M1H", "1P6M1P") align2 <- GAlignments(rep("chr1", 6), rep(10L, 6), cigar, strand(rep("+", 6))) align3 <- GAlignments(rep("chr1", 6), rep(20L, 6), cigar, strand(rep("+", 6))) names(align2) <- names(align3) <- letters[1:6] test_mapToAlignments <- function() { ans <- mapToAlignments(x1, align1) checkIdentical(start(ans), rep(1L, 3)) checkIdentical(end(ans), rep(2L, 3)) checkIdentical(mcols(ans)$xHits, c(rep(2L, 3))) checkIdentical(mcols(ans)$alignmentsHits, c(1L, 2L, 3L)) checkIdentical(names(ans), rep("B", 3)) checkIdentical(seqlevels(ans), letters[1:3]) ans <- mapToAlignments(x2, align3) checkIdentical(end(ans), c(7L, 4L, 4L, 8L, 6L, 6L)) checkIdentical(mcols(ans)$alignmentsHits, as.integer(1:6)) } test_mapFromAlignments <- function() { x <- x1 names(x) <- rep("all", length(x)) align <- align1 names(align) <- rep("all", length(align)) ans <- mapFromAlignments(x, align) checkIdentical(start(ans), c(14L, 14L, 14L, 19L, 19L, 19L)) checkIdentical(mcols(ans)$xHits, c(rep(1L, 3), rep(2L, 3))) checkIdentical(mcols(ans)$alignmentsHits, rep(1:3, 2)) checkIdentical(seqlevels(ans), "chr1") checkIdentical(names(ans), rep("all", 6)) names(x) <- c("hit", "hit", "blank", "blank") names(align) <- c("BLANK", "hit", "BLANK") ans <- mapFromAlignments(x, align) checkIdentical(names(ans), c("hit", "hit")) checkIdentical(seqlevels(ans), "chr1") x <- x2 names(x) <- rep("all", length(x)) align <- align2 names(align) <- rep("all", length(align)) ans <- mapFromAlignments(x, align) checkIdentical(start(ans), rep(10L, 6)) checkIdentical(end(ans), c(15L, 17L, 17L, 13L, 15L, 15L)) checkIdentical(mcols(ans)$alignmentsHits, as.integer(1:6)) } test_pmapToAlignments <- function() { x <- x1 align <- rep(align1[1], length(x1)) ans <- pmapToAlignments(x, align) checkIdentical(length(ans), length(x)) checkIdentical(width(ans), c(0L, 2L, 0L, 0L)) checkIdentical(start(ans), c(0L, 1L, 0L, 0L)) checkIdentical(end(ans), c(-1L, 2L, -1L, -1L)) checkIdentical(names(ans), names(x)) checkTrue(all(seqlevels(ans) %in% c("a", "UNMAPPED"))) x <- rep(x2[2], length(align3)) align <- align3 ans <- pmapToAlignments(x, align) checkIdentical(width(ans), c(6L, 4L, 4L, 8L, 6L, 6L)) checkIdentical(start(ans), c(2L, rep(1L, 5))) checkIdentical(end(ans), c(7L, 4L, 4L, 8L, 6L, 6L)) } test_pmapFromAlignments <- function() { x <- x1 names(x) <- rep("all", length(x)) align <- rep(align1[1], length(x1)) names(align) <- rep("all", length(align)) ans <- pmapFromAlignments(x, align) checkTrue(ncol(mcols(ans)) == 0L) checkTrue(length(ans) == length(x1)) checkIdentical(width(ans), c(2L, 2L, 0L, 0L)) checkIdentical(start(ans), c(14L, 19L, 0L, 0L)) checkIdentical(names(ans), names(x)) checkTrue(all(seqlevels(ans) %in% c("chr1", "UNMAPPED"))) x <- rep(x2[1], length(align2)) names(x) <- LETTERS[seq_along(x)] align <- align2 ans <- pmapFromAlignments(x, align) checkIdentical(width(ans), c(6L, 8L, 8L, 4L, 6L, 6L)) checkIdentical(end(ans), c(15L, 17L, 17L, 13L, 15L, 15L)) checkIdentical(names(ans), names(x)) checkTrue(all(seqlevels(ans) %in% "chr1")) } test_ref_locs_to_query_locs <- function() { cigar <- "66S42M2I20M8I18D15M43243N5M1D38M1D85M1D115M139S" pos <- 525842L ref <- 43425L + pos - 1L query <- 238L ans <- .Call("ref_locs_to_query_locs", ref, cigar, pos, FALSE, PACKAGE="GenomicAlignments") checkIdentical(ans, query) ## out of bounds ans_s <- .Call("ref_locs_to_query_locs", start(x1[1]), cigar(align1[1]), start(align1[1]), FALSE, PACKAGE="GenomicAlignments") ans_e <- .Call("ref_locs_to_query_locs", end(x1[1]), cigar(align1[1]), start(align1[1]), TRUE, PACKAGE="GenomicAlignments") checkIdentical(ans_s, NA_integer_) checkIdentical(ans_e, NA_integer_) } test_query_locs_to_ref_locs <- function() { ## out of bounds ans_s <- .Call("query_locs_to_ref_locs", start(x1[4]), cigar(align1[1]), start(align1[1]), FALSE, PACKAGE="GenomicAlignments") ans_e <- .Call("query_locs_to_ref_locs", end(x1[4]), cigar(align1[1]), start(align1[1]), TRUE, PACKAGE="GenomicAlignments") checkIdentical(ans_s, NA_integer_) checkIdentical(ans_e, NA_integer_) } GenomicAlignments/inst/unitTests/test_findSpliceOverlaps-methods.R0000644000175400017540000002333613175714431026616 0ustar00biocbuildbiocbuild## TODO: Add tests for the following "findSpliceOverlaps" methods: ## findSpliceOverlaps,GAlignments,GRangesList ## findSpliceOverlaps,GAlignmentPairs,GRangesList ## findSpliceOverlaps,character,ANY ## findSpliceOverlaps,BamFile,ANY .extract <- function(x, col) as.logical(mcols(x)[[col]]) test_findSpliceOverlaps_compatible <- function() { genes <- GRangesList( GRanges("chr1", IRanges(5, 15), "+"), GRanges("chr1", IRanges(5, 15), "-")) reads <- GRangesList(GRanges("chr1", IRanges(3, 13), "+")) res <- findSpliceOverlaps(reads, genes[1]) checkIdentical(FALSE, .extract(res, "compatible")) res <- findSpliceOverlaps(reads, genes[2]) checkIdentical(logical(0), .extract(res, "compatible")) ## exact match to intron boundaries ## (no overlap between 'reads' and 'genes') genes <- GRangesList( GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+")) reads <- GRangesList( GRanges("chr1", IRanges(11, 19), "+")) res <- findSpliceOverlaps(reads, genes) checkIdentical(logical(0), .extract(res, "compatible")) ## overlap and span intron boundaries genes <- GRangesList( GRanges("chr1", IRanges(c(5, 20, 30), c(10, 25, 35)), "+")) reads <- GRangesList( GRanges("chr1", IRanges(5, 12), "+"), GRanges("chr1", IRanges(18, 23), "+"), GRanges("chr1", IRanges(c(4, 30), c(26, 36)), "+")) res <- findSpliceOverlaps(reads[1], genes) ## not a junction read checkIdentical(FALSE, .extract(res, "compatible")) res <- findSpliceOverlaps(reads[2], genes) ## not a junction read checkIdentical(FALSE, .extract(res, "compatible")) res <- findSpliceOverlaps(reads[3], genes) ## junction read checkIdentical(FALSE, .extract(res, "compatible")) } #test_findSpliceOverlaps_novelTSS <- function() #{ # ## strand # genes <- GRangesList( # GRanges("chr1", IRanges(5, 15), "+"), # GRanges("chr1", IRanges(5, 15), "-"), # GRanges("chr1", IRanges(5, 15), "*")) # reads <- GRangesList(GRanges("chr1", IRanges(3, 13), "+")) # res <- findSpliceOverlaps(reads, genes[1]) # checkIdentical(TRUE, .extract(res, "novelTSS")) # res <- suppressWarnings(findSpliceOverlaps(reads, genes[2])) # checkIdentical(logical(0), .extract(res, "novelTSS")) # res <- findSpliceOverlaps(reads, genes[3]) # checkIdentical(TRUE, .extract(res, "novelTSS")) # # ## multiple matches # genes <- GRangesList( # GRanges("chr1", IRanges(15, 20), "+"), # GRanges("chr1", IRanges(10, 20), "+"), # GRanges("chr1", IRanges(5, 20), "+")) # reads <- GRangesList(GRanges("chr1", IRanges(5, 20), "+")) # res <- findSpliceOverlaps(reads, genes[1]) # checkIdentical(TRUE, .extract(res, "novelTSS")) # res <- findSpliceOverlaps(reads, genes[1:2]) # checkIdentical(c(TRUE, TRUE), .extract(res, "novelTSS")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(c(FALSE, FALSE, FALSE), .extract(res, "novelTSS")) # # ## junctions # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 15), c(10, 20)), "+")) # reads <- GRangesList( # GRanges("chr1", IRanges(12, 23), "+"), # GRanges("chr1", IRanges(3, 18), "+")) # res <- findSpliceOverlaps(reads[1], genes) # checkIdentical(FALSE, .extract(res, "novelTSS")) # res <- findSpliceOverlaps(reads[2], genes) # checkIdentical(TRUE, .extract(res, "novelTSS")) #} #test_findSpliceOverlaps_novelTSE <- function() #{ # ## strand # genes <- GRangesList( # GRanges("chr1", IRanges(5, 15), "+"), # GRanges("chr1", IRanges(5, 15), "-"), # GRanges("chr1", IRanges(5, 15), "*")) # reads <- GRangesList(GRanges("chr1", IRanges(12, 18), "+")) # res <- findSpliceOverlaps(reads, genes[1]) # checkIdentical(TRUE, .extract(res, "novelTSE")) # res <- findSpliceOverlaps(reads, genes[2]) # checkIdentical(logical(0), .extract(res, "novelTSE")) # res <- findSpliceOverlaps(reads, genes[3]) # checkIdentical(TRUE, .extract(res, "novelTSE")) # # ## multiple matches # genes <- GRangesList( # GRanges("chr1", IRanges(5, 15), "+"), # GRanges("chr1", IRanges(5, 20), "+"), # GRanges("chr1", IRanges(5, 25), "+")) # reads <- GRangesList(GRanges("chr1", IRanges(5, 25), "+")) # res <- findSpliceOverlaps(reads, genes[1]) # checkIdentical(TRUE, .extract(res, "novelTSE")) # res <- findSpliceOverlaps(reads, genes[1:2]) # checkIdentical(c(TRUE, TRUE), .extract(res, "novelTSE")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(c(FALSE, FALSE, FALSE), .extract(res, "novelTSE")) # # ## junctions # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 15), c(10, 20)), "+")) # reads <- GRangesList( # GRanges("chr1", IRanges(2, 12), "+"), # GRanges("chr1", IRanges(18, 23), "+")) # res <- findSpliceOverlaps(reads[1], genes) # checkIdentical(FALSE, .extract(res, "novelTSE")) # res <- findSpliceOverlaps(reads[2], genes) # checkIdentical(TRUE, .extract(res, "novelTSE")) #} #test_findSpliceOverlaps_novelExon <- function() #{ # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+")) # ## 'within' intron boundaries # reads <- GRangesList( # GRanges("chr1", IRanges(c(7, 12, 20), c(10, 18, 23)), "+")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(TRUE, .extract(res, "novelExon")) # # ## FIXME :currently TRUE # ## Do we want a novel exon to be completely w/in? # reads <- GRangesList( # GRanges("chr1", IRanges(c(5, 9, 20), c(7, 12, 23)), "+"), # GRanges("chr1", IRanges(c(7, 15, 23), c(10, 21, 25)), "+")) # res <- findSpliceOverlaps(reads[1], genes) # checkIdentical(TRUE, .extract(res, "novelExon")) # res <- findSpliceOverlaps(reads[2], genes) # checkIdentical(TRUE, .extract(res, "novelExon")) # # ## region not 'intronic' in all transcripts # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+"), # GRanges("chr1", IRanges(c(5, 20), c(15, 25)), "+")) # reads <- GRangesList( # GRanges("chr1", IRanges(c(7, 12, 20), c(10, 18, 23)), "+")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(c(FALSE, FALSE), .extract(res, "novelExon")) #} #test_findSpliceOverlaps_novelRetention <- function() #{ # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+")) # ## 'within' intron boundaries # reads <- GRangesList( # GRanges("chr1", IRanges(c(7, 12, 20), c(10, 18, 23)), "+")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(TRUE, .extract(res, "novelRetention")) # # ## exact match to intron boundaries # ## (no overlap between 'reads' and 'genes') # reads <- GRangesList( # GRanges("chr1", IRanges(11, 19), "+")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(logical(0), .extract(res, "compatible")) # # ## overlap and span intron boundaries # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 20, 30), c(10, 25, 35)), "+")) # reads <- GRangesList( # GRanges("chr1", IRanges(5, 12), "+"), # GRanges("chr1", IRanges(18, 23), "+"), # GRanges("chr1", IRanges(c(4, 30), c(26, 36)), "+")) # res <- findSpliceOverlaps(reads[1], genes) ## not a junction read # checkIdentical(TRUE, .extract(res, "novelRetention")) # res <- findSpliceOverlaps(reads[3], genes) ## junction read # checkIdentical(TRUE, .extract(res, "novelRetention")) # # ## FIXME : hits a portion of the intronic region # ## but is not completely 'within' # ## region is not 'intronic' in all transcripts # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+"), # GRanges("chr1", IRanges(c(5, 20), c(15, 25)), "+")) # reads <- GRangesList( # GRanges("chr1", IRanges(4, 26), "+")) # res <- findSpliceOverlaps(reads[1], genes) # checkIdentical(c(TRUE, TRUE), .extract(res, "novelRetention")) #} # #test_findSpliceOverlaps_novelSite <- function() #{ # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 15), c(10, 20)), "+")) # ## single novel site, novel junction # reads <- GRangesList( # GRanges("chr1", IRanges(c(5, 15), c(7, 20)), "+")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(TRUE, .extract(res, "novelSite")) # checkIdentical(TRUE, .extract(res, "novelJunction")) # # ## two novel sites, novel junction # reads <- GRangesList( # GRanges("chr1", IRanges(c(5, 17), c(7, 20)), "+")) # res <- findSpliceOverlaps(reads, genes) # checkIdentical(TRUE, .extract(res, "novelSite")) # checkIdentical(TRUE, .extract(res, "novelJunction")) #} # #test_findSpliceOverlaps_novelJunction <- function() #{ # ## novel junction, no novel sites # genes <- GRangesList( # GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+"), # GRanges("chr1", IRanges(c(5, 22), c(15, 25)), "+")) # # ## query = GRanges # reads <- GRangesList( # GRanges("chr1", IRanges(c(5, 20), c(15, 25)), "+")) # GRres <- findSpliceOverlaps(reads, genes) # checkIdentical(c(TRUE, TRUE), .extract(GRres, "novelJunction")) # checkIdentical(c(FALSE, FALSE), .extract(GRres, "novelSite")) # # ## query = GAlignments # gal <- GAlignments("chr1", 5L, "11M4N6M", strand("+")) # GALres <- findSpliceOverlaps(gal, genes) # checkIdentical(c(TRUE, TRUE), .extract(GALres, "novelJunction")) # checkIdentical(c(FALSE, FALSE), .extract(GALres, "novelSite")) # # ## query = GAlignmentPairs # gal1 <- GAlignments("chr1", 5L, "11M4N6M", strand("+")) # gal2 <- GAlignments("chr1", 50L, "6M", strand("-")) # galp <- GAlignmentPairs(gal1, gal2) # GALPres <- findSpliceOverlaps(galp, genes) # checkIdentical(c(TRUE, TRUE), .extract(GALPres, "novelJunction")) # checkIdentical(c(FALSE, FALSE), .extract(GALPres, "novelSite")) #} GenomicAlignments/inst/unitTests/test_intra-range-methods.R0000644000175400017540000000315213175714431025223 0ustar00biocbuildbiocbuild.noGaps <- GAlignments( Rle(factor(c("chr1", "chr2", "chr1", "chr3")), c(1, 3, 2, 4)), pos=1:10, cigar=paste0(10:1, "M"), strand=Rle(strand(c("-", "+", "*", "+", "-")), c(1, 2, 2, 3, 2)), names=head(letters, 10), score=1:10) .Gaps <- GAlignments( Rle(factor(c("chr2", "chr4")), c(3, 4)), pos=1:7, cigar=c("5M", "3M2N3M2N3M", "5M", "10M", "5M1N4M", "8M2N1M", "5M"), strand=Rle(strand(c("-", "+")), c(4, 3)), names=tail(letters, 7), score=1:7) test_GAlignments_qnarrow <- function() { gal <- GAlignments(seqnames=rep(factor("A"), 8), pos=10:17, cigar=c("5M", "5X", "3M2I3M", "3M2D3M", "3M2N3M", "3M2S3M", "3M2H3M", "3M2P3M"), strand=Rle(strand(rep("+", 8)))) n1 <- narrow(gal, start=3) q1 <- qnarrow(gal, start=3) checkIdentical(qwidth(n1), qwidth(q1)) checkIdentical(width(n1), width(q1)) n2 <- narrow(gal, start=4) q2 <- qnarrow(gal, start=4) checkIdentical(width(n2), width(q2)) ## M and X checkIdentical(qwidth(n2[1:2]), qwidth(q2[1:2])) ## I checkIdentical(qwidth(q2[3]), width(q2[3]) + 2L) ## D, N and P checkIdentical(qwidth(q2[c(4,5,8)]), width(q2[c(4,5,8)])) ## S and H checkIdentical(qwidth(q2[6]), width(q2[6]) + 2L) checkIdentical(qwidth(q2[7]), width(q2[7])) } test_GAlignmentsList_qnarrow <- function() { galist <- GAlignmentsList(.noGaps[1:6], .Gaps) qn <- qnarrow(galist, end=-4) checkIdentical(qnarrow(galist[[1]], end=-4), qn[[1]]) checkIdentical(qnarrow(galist[[2]], end=-4), qn[[2]]) } GenomicAlignments/inst/unitTests/test_readGAlignmentPairs.R0000644000175400017540000002774513175714431025251 0ustar00biocbuildbiocbuild### test_readGAlignmentPairs.R # Flag bits summary # ----------------- # 0x1: template having multiple segments in sequencing # 0x2: each segment properly aligned according to the aligner # 0x4: segment unmapped # 0x8: next segment in the template unmapped # 0x10: SEQ being reverse complemented # 0x20: SEQ of the next segment in the template being reversed # 0x40: the first segment in the template # 0x80: the last segment in the template # 0x100: secondary alignment # 0x200: not passing quality controls # 0x400: PCR or optical duplicate make_samline <- function(QNAME, mapped=0, RNAME="*", POS=0, strand="+", primary=1, flagbits=0, RNEXT="*", PNEXT=0, proper=0) { FLAG <- 0x4 * (!mapped) + 0x10 * (strand == "-") + 0x100 * (!primary) + 0x2 * proper + flagbits if (mapped) { CIGAR <- "14M" } else { CIGAR <- "*" } paste(QNAME, FLAG, RNAME, POS, "255", CIGAR, RNEXT, PNEXT, "0", "*", "*", sep="\t") } make_mapped_pair <- function(QNAME, RNAME1, POS1, CIGAR1, strand1, RNAME2, POS2, CIGAR2, strand2, primary, proper, pair_id=NA) { flag0 <- 0x1 + 0x2 * proper + 0x100 * (!primary) FLAG1 <- flag0 + 0x40 + 0x10 * (strand1 == "-") + 0x20 * (strand2 == "-") FLAG2 <- flag0 + 0x80 + 0x10 * (strand2 == "-") + 0x20 * (strand1 == "-") line1 <- paste(QNAME, FLAG1, RNAME1, POS1, "255", CIGAR1, RNAME2, POS2, "0", "*", "*", sep="\t") line2 <- paste(QNAME, FLAG2, RNAME2, POS2, "255", CIGAR2, RNAME1, POS1, "0", "*", "*", sep="\t") if (!identical(pair_id, NA)) { pair_id_tag <- paste0("pi:Z:", pair_id) line1 <- paste(line1, pair_id_tag, sep="\t") line2 <- paste(line2, pair_id_tag, sep="\t") } c(line1, line2) } make_mapped_pairs <- function(mapped_pair_table) { if (!is.data.frame(mapped_pair_table)) { if (is.character(mapped_pair_table)) mapped_pair_table <- textConnection(mapped_pair_table) mapped_pair_table <- read.table(mapped_pair_table, header=TRUE, stringsAsFactors=FALSE) } row_groups <- unname(split(seq_len(nrow(mapped_pair_table)), mapped_pair_table$QNAME)) unlist(lapply(row_groups, function(row_group) { lines <- unlist(lapply(row_group, function(i) do.call("make_mapped_pair", mapped_pair_table[i, ]))) if (length(row_group) == 3L) { lines[c(2L, 4L, 6L)] <- lines[c(6L, 2L, 4L)] } else { lines[c(FALSE, TRUE)] <- rev(lines[c(FALSE, TRUE)]) } lines })) } make_toy_bamfile <- function(mapped_pair_table, filename) { lines0 <- c("@HD\tVN:1.3", "@SQ\tSN:chr1\tLN:2450", "@SQ\tSN:chr2\tLN:1882", "@SQ\tSN:chrX\tLN:999") ## Single end reads lines1 <- c( ## s001: 1 primary alignment make_samline("s001", mapped=1, RNAME="chr1", POS=10, strand="+", primary=1), ## s002: 1 primary alignment + 3 secondary alignments make_samline("s002", mapped=1, RNAME="chr1", POS=20, strand="+", primary=1), make_samline("s002", mapped=1, RNAME="chr1", POS=21, strand="+", primary=0), make_samline("s002", mapped=1, RNAME="chr1", POS=22, strand="+", primary=0), make_samline("s002", mapped=1, RNAME="chr1", POS=20, strand="+", primary=0), ## s003: unmapped make_samline("s003") ) ## Paired end reads lines2 <- c( ## Mapped pairs make_mapped_pairs(mapped_pair_table), ## p991: 1 pair with a missing mate (can happen if file was subsetted ## with e.g. filterBam) make_mapped_pair("p991", "chr2", 150, "18M", "+", "chr2", 199, "18M", "-", primary=1, proper=1)[2L], ## p992: 1 pair with 1st mate unmapped and 2nd mate mapped make_samline("p992", flagbits=0x1 + 0x40, RNEXT="chr2", PNEXT=150), make_samline("p992", mapped=1, RNAME="chr2", POS=150, strand="+", primary=1, flagbits=0x1 + 0x8 + 0x80), ## p993: 1 pair with both mates unmapped make_samline("p993", flagbits=0x1 + 0x8 + 0x40), make_samline("p993", flagbits=0x1 + 0x8 + 0x80) ) ## Reads with multiple segments lines3 <- c( ## m001: 3 segments in the template (index of each segment in template ## is known) make_samline("m001", mapped=1,, RNAME="chrX", POS=10, strand="+", flagbits=0x1 + 0x40, RNEXT="chrX", PNEXT=20, proper=1), make_samline("m001", mapped=1, RNAME="chrX", POS=20, strand="+", flagbits=0x1 + 0x40 + 0x80, RNEXT="chrX", PNEXT=30, proper=1), make_samline("m001", mapped=1, RNAME="chrX", POS=30, strand="+", flagbits=0x1 + 0x80, RNEXT="chrX", PNEXT=10, proper=1), ## m002: 3 segments in the template (index of each segment in template ## was lost) make_samline("m002", mapped=1, RNAME="chrX", POS=10, strand="+", flagbits=0x1, RNEXT="chrX", PNEXT=20, proper=1), make_samline("m002", mapped=1, RNAME="chrX", POS=20, strand="+", flagbits=0x1, RNEXT="chrX", PNEXT=30, proper=1), make_samline("m002", mapped=1, RNAME="chrX", POS=30, strand="+", flagbits=0x1, RNEXT="chrX", PNEXT=10, proper=1) ) samfile <- paste0(filename, ".sam") cat(c(lines0, lines1, lines2, lines3), file=samfile, sep="\n") bamfile <- asBam(samfile, filename, overwrite=TRUE) ## Should never happen. if (bamfile != paste0(filename, ".bam")) stop("asBam() returned an unexpected path") bamfile } ### 1 line per mapped pair. Each line will generate 2 lines/records in the ### SAM file. The pair_id field will be stored in the SAM/BAM file as a user ### defined tag ("pi" tag). mapped_pair_table <- " QNAME RNAME1 POS1 CIGAR1 strand1 RNAME2 POS2 CIGAR2 strand2 primary proper pair_id # p001: 1 primary proper pair p001 chr2 10 18M + chr2 110 18M - 1 1 p001 # p002: 1 primary non proper pair p002 chr2 20 18M + chr2 120 18M - 1 0 p002 # p003: 2 proper pairs: 1 primary + 1 secondary p003 chr2 30 18M + chr2 130 18M - 1 1 p003a p003 chr2 31 18M + chr2 131 18M - 0 1 p003b # p004: 2 non proper pairs: 1 primary + 1 secondary p004 chr2 40 18M + chr2 140 18M - 1 0 p004a p004 chr2 41 18M + chr2 141 18M - 0 0 p004b # p005: 2 primary pairs (some aligners seem to produce that, even though they # probably shouldn't) p005 chr2 50 18M + chr2 150 18M - 1 1 p005a p005 chr2 51 18M + chr2 151 18M - 1 1 p005b # p006: 3 pairs: 1 primary proper + 1 secondary proper + 1 secondary non # proper p006 chr2 60 18M + chr2 160 18M - 1 1 p006a p006 chr2 61 18M + chr2 161 18M - 0 1 p006b p006 chr2 62 18M + chr2 60 18M - 0 0 p006c # p007: 2 pairs mapped to the same position: 1 primary proper + 1 secondary # proper p007 chr2 70 9M1D9M + chr2 170 18M - 1 1 p007a p007 chr2 70 18M + chr2 170 7M2I9M - 0 1 p007b # p008: 3 pairs mapped to the same position: 1 primary proper + 1 secondary # proper + 1 secondary non proper p008 chr2 80 18M + chr2 180 18M - 1 1 p008a p008 chr2 80 9M2D9M + chr2 180 7M2I9M - 0 1 p008b p008 chr2 80 6M3I9M + chr2 180 9M3D9M - 0 0 p008c # p009: 3 pairs mapped to the same position: 1 primary proper + 2 secondary # proper. The secondary pairs can NOT be disambiguated. p009 chr2 90 18M + chr2 190 18M - 1 1 p009a p009 chr2 90 9M2D9M + chr2 190 7M2I9M - 0 1 p009b p009 chr2 90 6M3I9M + chr2 190 9M3D9M - 0 1 p009c " toy_bamfile <- make_toy_bamfile(mapped_pair_table, tempfile()) test_readGAlignmentPairs <- function() { param <- ScanBamParam(tag="pi") galp <- suppressWarnings( readGAlignmentPairs(toy_bamfile, use.names=TRUE, param=param) ) ## Check the dumped alignments dumped_gal <- getDumpedAlignments() checkTrue(validObject(dumped_gal, complete=TRUE)) pi_target <- rep(c("p009b", "p009c"), each=2) checkIdentical(pi_target, sort(mcols(dumped_gal)$pi)) ## Check 'galp' checkTrue(validObject(galp, complete=TRUE)) pi_target <- c("p001", "p002", "p003a", "p003b", "p004a", "p004b", "p005a", "p005b", "p006a", "p006b", "p006c", "p007a", "p007b", "p008a", "p008b", "p008c", "p009a") checkIdentical(pi_target, mcols(first(galp))$pi) checkIdentical(pi_target, mcols(last(galp))$pi) } ### Starting with BioC 2.14, readGAlignmentPairs() behavior changed when ### using the 'which' argument. Old behavior: the same pair was returned once ### per each range in 'which' that had an overlap with the *two* segments in ### the pair. New behavior: the same pair is returned once per each range in ### 'which' that has an overlap with *any* of the 2 segments in the pair. ### The new behavior is a consequence of using ### scanBam(BamFile(asMates=TRUE), ...) ### behind the scene instead of ### findMateAlignment() ### for the pairing. ### The new behavior breaks the test below so I'm turning it off for now. if (FALSE) { test_readGAlignmentPairs_which <- function() { ## 4 non-overlapping regions of interest: first two regions only overlap ## with first p001 mate and last two regions only with last p001 mate. my_ROI <- GRanges("chr2", IRanges(c(10, 15, 110, 115), width=1)) my_ROI_labels <- c("chr2:10-10", "chr2:15-15", "chr2:110-110", "chr2:115-115") param <- ScanBamParam(tag="pi", which=my_ROI[c(1, 4)]) target1 <- readGAlignmentPairs(toy_bamfile, use.names=TRUE, param=param, with.which_label=TRUE) checkTrue(validObject(target1, complete=TRUE)) checkIdentical(1L, length(target1)) checkIdentical(Rle(factor(my_ROI_labels[1], levels=my_ROI_labels[c(1, 4)])), mcols(first(target1))$which_label) checkIdentical(Rle(factor(my_ROI_labels[4], levels=my_ROI_labels[c(1, 4)])), mcols(last(target1))$which_label) mcols(target1@first)$which_label <- mcols(target1@last)$which_label <- NULL ## Checking all possible combinations of ranges in 'which'. check_my_ROI_subsets <- function(subset) { check_my_ROI_subset <- function(i) { #print(i) param <- ScanBamParam(tag="pi", which=my_ROI[i]) current <- suppressWarnings( readGAlignmentPairs(toy_bamfile, use.names=TRUE, param=param) ) if (sum(i <= 2L) == 1L && sum(i >= 3L) == 1L) { checkIdentical(target1, current) } else { checkIdentical(0L, length(current)) } } check_my_ROI_subset(subset) if (length(subset) >= 2L) { check_my_ROI_subset(rev(subset)) if (length(subset) >= 4L) check_my_ROI_subset(c(4L, 1:3)) } TRUE } for (m in 1:length(my_ROI)) combn(length(my_ROI), m, FUN=check_my_ROI_subsets) } } GenomicAlignments/inst/unitTests/test_readGAlignments.R0000644000175400017540000000430613175714431024421 0ustar00biocbuildbiocbuildtest_readGAlignments <- function() { fl <- system.file("extdata", "ex1.bam", package="Rsamtools") which <- RangesList(seq1=IRanges(1, width=100)) param <- ScanBamParam(which=which) result <- readGAlignments(fl, param=param) checkTrue(validObject(result)) checkIdentical(c(seq1=1575L, seq2=1584L), seqlengths(result)) } test_readGAlignments_missing_param <- function() { fl <- system.file("unitTests", "cases", "ex1_noindex.bam", package="Rsamtools") result0 <- readGAlignments(fl) checkTrue(validObject(result0)) bf <- open(BamFile(fl, character())) result1 <- readGAlignments(bf) checkIdentical(result1, result0) } test_readGAlignments_length0 <- function() { fl <- system.file("extdata", "ex1.bam", package="Rsamtools") which <- RangesList(seq1=IRanges(100000, width=100)) param <- ScanBamParam(which=which) result <- readGAlignments(fl, param=param) checkTrue(validObject(result)) which <- RangesList(seq1=IRanges(c(1, 100000), width=100)) param <- ScanBamParam(which=which) result <- readGAlignments(fl, param=param) checkTrue(validObject(result)) } test_readGAlignments_tag <- function() { fl <- system.file("extdata", "ex1.bam", package="Rsamtools") ## valid param <- ScanBamParam(tag=("NM")) gal <- readGAlignments(fl, param=param) checkIdentical(924L, sum(mcols(gal)[["NM"]])) ## empty param <- ScanBamParam(tag=("FO")) gal <- readGAlignments(fl, param=param) checkIdentical(rep.int(NA, length(gal)), mcols(gal)[["FO"]]) } test_readGAlignments_BamViews <- function() { checkTrue(validObject(readGAlignments(BamViews()))) src <- system.file("unitTests", "cases", package="Rsamtools") fl <- c(system.file("extdata", "ex1.bam", package="Rsamtools"), file.path(src, "ex1_shuf1000.bam")) bv <- BamViews(fl, auto.range=TRUE) rng <- bamRanges(bv) aln <- readGAlignments(bv) checkEquals(length(bamPaths(bv)), length(aln)) fl <- c(fl, tempfile()) bv <- BamViews(fl, bamRanges=rng) current <- suppressWarnings({ tryCatch({ aln <- readGAlignments(bv) }, error=identity) }) checkTrue(is(current, "bperror")) } GenomicAlignments/inst/unitTests/test_readGAlignmentsList.R0000644000175400017540000001655613175714431025267 0ustar00biocbuildbiocbuildlibrary(pasillaBamSubset) chr4 <- untreated3_chr4() test_readGAlignmentsList_construction <- function() { fl <- system.file("extdata", "ex1.bam", package="Rsamtools") bf <- BamFile(fl, asMates=TRUE) galist <- readGAlignmentsList(fl) checkTrue(is.null(names(galist))) galist <- readGAlignmentsList(fl, use.names=TRUE) target <- c("EAS54_61:4:143:69:578", "EAS219_FC30151:7:51:1429:1043") checkIdentical(names(galist)[1:2], target) ## first segment first param <- ScanBamParam(what="flag") galist <- readGAlignmentsList(fl, param=param) mates <- galist[mcols(galist)$mate_status == "mated"] flagBit <- bamFlagAsBitMatrix(mcols(unlist(mates))$flag, bitnames="isFirstMateRead") m <- matrix(flagBit, nrow=2) checkIdentical(c(1572L, 0), rowSums(m)) } test_readGAlignmentsList_noYieldSize <- function() { fl <- system.file("extdata", "ex1.bam", package="Rsamtools") bf <- BamFile(fl, asMates=TRUE) galist <- readGAlignmentsList(fl) checkTrue(validObject(galist)) } test_readGAlignmentsList_yieldSize <- function() { bf <- BamFile(chr4, asMates=TRUE, yieldSize=1) scn1 <- scanBam(bf) galist1 <- readGAlignmentsList(bf) checkTrue(length(scn1[[1]]$qname) == 2) checkTrue(length(unique(scn1[[1]]$qname)) == 1) checkTrue(length(unique(scn1[[1]]$qname)) == length(galist1)) bf <- BamFile(chr4, asMates=TRUE, yieldSize=2) scn2 <- scanBam(bf) galist2 <- readGAlignmentsList(bf) checkTrue(length(scn2[[1]]$qname) == 4) checkTrue(length(unique(scn2[[1]]$qname)) == 2) checkTrue(length(unique(scn2[[1]]$qname)) == length(galist2)) } test_readGAlignmentsList_mcols <- function() { bf <- BamFile(chr4, asMates=TRUE, yieldSize=100) param <- ScanBamParam(tag=("NM")) galist <- readGAlignmentsList(bf, param=param) checkIdentical(colnames(mcols(unlist(galist))), "NM") checkTrue(names(mcols(galist)) == "mate_status") param <- ScanBamParam(tag=("FO")) galist <- readGAlignmentsList(bf, param=param) checkIdentical(rep.int(NA, length(unlist(galist))), mcols(unlist(galist))[["FO"]]) } test_readGAlignmentsList_compare_pairs <- function() { bamfile <- BamFile(untreated3_chr4(), asMates=TRUE) galist <- readGAlignmentsList(bamfile) mates <- galist[mcols(galist)$mate_status == "mated"] galp <- readGAlignmentPairs(bamfile) checkIdentical(length(galp), 75409L) tbl <- table(mcols(galist)) checkIdentical(tbl[["mated"]], 75409L) checkIdentical(tbl[["ambiguous"]], 0L) checkIdentical(tbl[["unmated"]], 21227L) } test_readGAlignmentsList_flags <- function() { bamfile <- BamFile(untreated3_chr4(), asMates=TRUE) param <- ScanBamParam(flag=scanBamFlag(isProperPair=TRUE)) galist <- readGAlignmentsList(bamfile, param=param) status <- table(mcols(galist)$mate_status) checkIdentical(status[["mated"]], 45828L) checkIdentical(status[["ambiguous"]], 0L) checkIdentical(status[["unmated"]], 0L) } ## toy_bamfile read summary: ## -------------------------- ## single-end ## s001: 1 primary alignment ## s002: 1 primary alignment + 3 secondary alignments ## s003: unmapped ## paired-end ## p991: 1 pair with a missing mate (can happen if file was subsetted) ## p992: 1 pair with 1st mate unmapped and 2nd mate mapped ## p993: 1 pair with both mates unmapped ## multi-segments ## m001: 3 segments in the template (index of each segment is known) ## m002: 3 segments in the template (index of each segment was lost) ## mapped pairs ('pi' tag only exists for these mapped pairs) ## p001: 1 primary proper pair ## p002: 1 primary non proper pair ## p003: 2 proper pairs: 1 primary + 1 secondary ## p004: 2 non proper pairs: 1 primary + 1 secondary ## p005: 2 primary pairs ## p006: 3 pairs: 1 primary proper + 1 secondary proper + ## 1 secondary non proper ## p007: 2 pairs mapped to the same position: ## 1 primary proper + 1 secondary proper ## p008: 3 pairs mapped to the same position: 1 primary proper + ## 1 secondary proper + 1 secondary non proper ## p009: 3 pairs mapped to the same position: ## 1 primary proper + 2 secondary proper. source(system.file("unitTests", "test_readGAlignmentPairs.R", package="GenomicAlignments")) bf <- BamFile(toy_bamfile, asMates=TRUE) test_readGAlignmentsList_toybamfile <- function() { param <- ScanBamParam(tag="pi") galp <- readGAlignmentPairs(toy_bamfile, use.names=TRUE, param=param) galist <- readGAlignmentsList(bf, use.names=TRUE, param=param) ## 'mated' mated_galist <- unlist(galist[mcols(galist)$mate_status == "mated"]) pi_target <- c("p001", "p002", "p003a", "p003b", "p004a", "p004b", "p005a", "p005b", "p006a", "p006b", "p006c", "p007a", "p007b", "p008a", "p008b", "p008c", "p009a") checkTrue(all(mcols(mated_galist)$pi %in% pi_target)) ## 'ambiguous' GAList match 'dumped' GAPairs ambig_galist <- unlist(galist[mcols(galist)$mate_status == "ambiguous"]) dumped_galp <- getDumpedAlignments() pi_target <- rep(c("p009b", "p009c"), each=2) checkIdentical(pi_target, sort(mcols(dumped_galp)$pi)) checkIdentical(pi_target, sort(mcols(ambig_galist)$pi)) ## 'unmated': unmated_galist <- unlist(galist[mcols(galist)$mate_status == "unmated"]) ## unmated single-end, paired-end or multi-segment (no pi tags) name_target <- c("m001", "m002", "p991", "p992", "s001", "s002") unmated <- names(unmated_galist)[is.na(mcols(unmated_galist)$pi)] checkTrue(all(unmated %in% name_target)) ## non-proper mapped-pairs (have pi tags) pi_target <- c("p002", "p004a", "p004b", "p006c", "p008c") unmated <- na.omit(unique(mcols(unmated_galist)$pi)) checkTrue(all(unmated %in% pi_target)) ## Reads of this type cannot be filtered out wrt readGAlignmentsList. ## They are always returned by readGAlignmentsList but never returned by ## readGAlignmentPairs. bamFlag(param) <- scanBamFlag(isProperPair=TRUE, hasUnmappedMate=FALSE, isUnmappedQuery=FALSE, isPaired=TRUE) galist <- readGAlignmentsList(bf, use.names=TRUE, param=param) unmated_galist <- unlist(galist[mcols(galist)$mate_status == "unmated"]) unmated <- names(unmated_galist)[is.na(mcols(unmated_galist)$pi)] name_target <- c("m001", "m002", "p991") checkTrue(all(unmated %in% name_target)) } test_readGAlignmentsList_which <- function() { ## 4 non-overlapping regions of interest: first two regions only overlap ## with first p001 mate and last two regions only with last p001 mate. my_ROI <- GRanges("chr2", IRanges(c(10, 15, 110, 115), width=1)) my_ROI_labels <- c("chr2:10-10", "chr2:15-15", "chr2:110-110", "chr2:115-115") param <- ScanBamParam(tag="pi", which=my_ROI[c(1, 4)]) target1 <- readGAlignmentsList(toy_bamfile, use.names=TRUE, param=param, with.which_label=TRUE) ## Duplicate results with distinct 'which_label' checkIdentical(2L, length(target1)) checkIdentical(as.vector(mcols(target1)$mate_status), c("mated", "mated")) rng1 <- as.vector(mcols(unlist(target1[1]))$which_label) checkTrue(all(rng1 %in% my_ROI_labels[1])) rng2 <- as.vector(mcols(unlist(target1[2]))$which_label) checkTrue(all(rng2 %in% my_ROI_labels[4])) } GenomicAlignments/inst/unitTests/test_summarizeOverlaps-methods.R0000644000175400017540000003042013175714431026542 0ustar00biocbuildbiocbuild.getCounts <- function(res) { as.integer(assays(res)$counts) } quiet <- suppressMessages gr <- GRanges(c(rep("chr1", 7), rep("chr2", 4)), IRanges(c(1000, 3000, 3600, 4000, 4000, 5000, 5400, 2000, 3000, 7000, 7500), width = c(500, 500, 300, 500, 900, 500, 500, 900, 500, 600, 300)), "+", group = c("A", "B", "C", "C", "D", "D", "E", "F", "G", "H", "H")) rds <- GAlignments(c(rep(c("chr1", "chr2"), 3), "chr1"), as.integer(c(1400, 2700, 3400, 7100, 4000, 3100, 5200)), c("500M", "100M", "300M", "500M", "300M", "50M200N50M", "50M150N50M"), strand(rep("+", 7))) test_summarizeOverlaps_Union_single <- function() { ## single-end no junctions mode <- "Union" ga <- GAlignments("chr1", 20L, "11M", strand("+")) ann <- GRanges("chr1", IRanges(c(1, 10, 25, 22), c(50, 25, 40, 26)), "+") res <- summarizeOverlaps(ann[1], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann[2], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann[3], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann[4], ga, mode) checkIdentical(1L, .getCounts(res)) ## >1 feature res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(0L, 0L, 0L, 0L), .getCounts(res)) } test_summarizeOverlaps_Union_paired <- function() { ## single-end with a junction (behaves like paired-end) mode <- "Union" ga <- GAlignments("chr1", 1L, "10M4N11M", strand("+")) ga1 <- GAlignments("chr1", 1L, "10M", strand("+")) ga2 <- GAlignments("chr1", 15L, "11M", strand("-")) galp <- GAlignmentPairs(ga1, ga2) ann <- GRanges("chr1", IRanges(c(1, 5, 12, 20), c(25, 20, 14, 30)), "+") res_ga <- summarizeOverlaps(ann[1], ga, mode) res_galp <- summarizeOverlaps(ann[1], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[2], ga, mode) res_galp <- summarizeOverlaps(ann[2], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[3], ga, mode) res_galp <- summarizeOverlaps(ann[3], galp, mode) checkIdentical(0L, .getCounts(res_ga)) checkIdentical(0L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[4], ga, mode) res_galp <- summarizeOverlaps(ann[4], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) ## >1 feature res_ga <- summarizeOverlaps(ann, ga, mode) res_galp <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(0L, 0L, 0L, 0L), .getCounts(res_ga)) checkIdentical(c(0L, 0L, 0L, 0L), .getCounts(res_galp)) } test_summarizeOverlaps_IntersectionStrict_single <- function() { ## single-end, no junctions mode <- "IntersectionStrict" ga <- GAlignments("chr1", 7L, "6M", strand("+")) ann <- GRanges("chr1", IRanges(c(1, 5, 10), width=10), "+") res <- summarizeOverlaps(ann[1], ga, mode) checkIdentical(0L, .getCounts(res)) res <- summarizeOverlaps(ann[2], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann[3], ga, mode) checkIdentical(0L, .getCounts(res)) ## >1 feature ann <- GRanges("chr1", IRanges(c(5, 6, 10), c(15, 16, 15)), "+") res <- summarizeOverlaps(ann[1:2], ga, mode) checkIdentical(c(0L, 0L), .getCounts(res)) res <- summarizeOverlaps(ann[c(1,3)], ga, mode) checkIdentical(c(1L, 0L), .getCounts(res)) } test_summarizeOverlaps_IntersectionStrict_paired <- function() { ## single-end with a junction (behaves like paired-end) mode <- "IntersectionStrict" ga <- GAlignments("chr1", 10L, "6M4N6M", strand("+")) ga1 <- GAlignments("chr1", 10L, "6M", strand("+")) ga2 <- GAlignments("chr1", 20L, "6M", strand("-")) galp <- GAlignmentPairs(ga1, ga2) ann <- GRanges("chr1", IRanges(c(1, 1, 20), c(30, 15, 30)), "+") res_ga <- summarizeOverlaps(ann[1], ga, mode) res_galp <- summarizeOverlaps(ann[1], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[2], ga, mode) res_galp <- summarizeOverlaps(ann[2], galp, mode) checkIdentical(0L, .getCounts(res_ga)) checkIdentical(0L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[3], ga, mode) res_galp <- summarizeOverlaps(ann[3], galp, mode) checkIdentical(0L, .getCounts(res_ga)) checkIdentical(0L, .getCounts(res_galp)) ## >1 feature res_ga <- summarizeOverlaps(ann, ga, mode) res_galp <- summarizeOverlaps(ann, galp, mode) checkIdentical(c(1L, 0L, 0L), .getCounts(res_ga)) checkIdentical(c(1L, 0L, 0L), .getCounts(res_galp)) } test_summarizeOverlaps_IntersectionNotEmpty_single <- function() { ## single-end, no junctions mode <- "IntersectionNotEmpty" ga <- GAlignments("chr1", 10L, "11M", strand("+")) ann <- GRanges("chr1", IRanges(c(1, 5, 12), c(15, 30, 15)), "+") res <- summarizeOverlaps(ann[1], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann[2], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann[3], ga, mode) checkIdentical(1L, .getCounts(res)) res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(0L, 1L, 0L), .getCounts(res)) ## >1 feature ann <- GRanges("chr1", IRanges(c(5, 15), c(20, 25)), "+") res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(1L, 0L), .getCounts(res)) ann <- GRanges("chr1", IRanges(c(5, 12), c(18, 25)), "+") res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(0L, 0L), .getCounts(res)) ann <- GRanges(rep("chr1", 3), IRanges(c(1L, 20L, 20L), width=c(50, 11, 11)), c("+", "+", "-")) ga <- GAlignments("chr1", 23L, "5M", strand("*")) res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(0L, 0L, 0L), .getCounts(res)) strand(ga) <- "-" res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(0L, 0L, 1L), .getCounts(res)) ga <- GAlignments("chr1", 28L, "5M", strand("+")) res <- summarizeOverlaps(ann, ga, mode) checkIdentical(c(1L, 0L, 0L), .getCounts(res)) ## ignore.strand ann <- GRanges("chr1", IRanges(c(5, 1), end=c(10, 6)), strand=c("+", "-")) reads <- GRanges("chr1", IRanges(2, 2), strand="+") checkIdentical(c(0L, 1L), IntersectionNotEmpty(ann, reads, ignore.strand=TRUE)) } test_summarizeOverlaps_IntersectionNotEmpty_paired <- function() { ## single-end with a junction (behaves like paired-end) mode <- "IntersectionNotEmpty" ga <- GAlignments("chr1", 10L, "6M4N6M", strand("+")) ga1 <- GAlignments("chr1", 10L, "6M", strand("+")) ga2 <- GAlignments("chr1", 20L, "6M", strand("-")) galp <- GAlignmentPairs(ga1, ga2) ann <- GRanges("chr1", IRanges(c(1, 1, 20), c(30, 15, 30)), "+") ## single-end, junctions res_ga <- summarizeOverlaps(ann[1], ga, mode) res_galp <- summarizeOverlaps(ann[1], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[2], ga, mode) res_galp <- summarizeOverlaps(ann[2], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) res_ga <- summarizeOverlaps(ann[3], ga, mode) res_galp <- summarizeOverlaps(ann[3], galp, mode) checkIdentical(1L, .getCounts(res_ga)) checkIdentical(1L, .getCounts(res_galp)) ## > 1 feature res_ga <- summarizeOverlaps(ann, ga, mode) res_galp <- summarizeOverlaps(ann, galp, mode) checkIdentical(c(0L, 0L, 0L), .getCounts(res_ga)) checkIdentical(c(0L, 0L, 0L), .getCounts(res_galp)) ann <- GRanges("chr1", IRanges(c(1, 2), c(23, 23)), "+") res_ga <- summarizeOverlaps(ann, ga, mode) res_galp <- summarizeOverlaps(ann, galp, mode) checkIdentical(c(0L, 0L), .getCounts(res_ga)) checkIdentical(c(0L, 0L), .getCounts(res_galp)) ann <- GRanges("chr1", IRanges(c(1, 21), c(23, 30)), "+") res_ga <- summarizeOverlaps(ann, ga, mode) res_galp <- summarizeOverlaps(ann, galp, mode) checkIdentical(c(0L, 0L), .getCounts(res_ga)) checkIdentical(c(0L, 0L), .getCounts(res_galp)) ann <- GRanges("chr1", IRanges(c(1, 1), c(23, 21)), "+") res_ga <- summarizeOverlaps(ann, ga, mode) res_galp <- summarizeOverlaps(ann, galp, mode) checkIdentical(c(1L, 0L), .getCounts(res_ga)) checkIdentical(c(1L, 0L), .getCounts(res_galp)) } test_summarizeOverlaps_inter.feature_GRanges <- function() { ## rows 5,6,7 from figure in vignette ft <- gr[10:11] rd <- GAlignments(rep("chr2", 3), as.integer(c(7100, 7100, 7500)), c("300M", "500M", "50M"), strand(rep("+", 3))) mode <- "Union" res <- summarizeOverlaps(ft, rd[1], mode, inter.feature=TRUE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[1], mode, inter.feature=FALSE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[2], mode, inter.feature=TRUE) checkIdentical(c(0L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[2], mode, inter.feature=FALSE) checkIdentical(c(1L, 1L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[3], mode, inter.feature=TRUE) checkIdentical(c(0L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[3], mode, inter.feature=FALSE) checkIdentical(c(1L, 1L), .getCounts(res)) mode <- "IntersectionStrict" res <- summarizeOverlaps(ft, rd[1], mode, inter.feature=TRUE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[1], mode, inter.feature=FALSE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[2], mode, inter.feature=TRUE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[2], mode, inter.feature=FALSE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[3], mode, inter.feature=TRUE) checkIdentical(c(0L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[3], mode, inter.feature=FALSE) checkIdentical(c(1L, 1L), .getCounts(res)) mode <- "IntersectionNotEmpty" res <- summarizeOverlaps(ft, rd[1], mode, inter.feature=TRUE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[1], mode, inter.feature=FALSE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[2], mode, inter.feature=TRUE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[2], mode, inter.feature=FALSE) checkIdentical(c(1L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[3], mode, inter.feature=TRUE) checkIdentical(c(0L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd[3], mode, inter.feature=FALSE) checkIdentical(c(0L, 0L), .getCounts(res)) ## read spans both features rd <- GAlignments("chr2", 7000L, "750M", strand("+")) res <- summarizeOverlaps(ft, rd, mode, inter.feature=TRUE) checkIdentical(c(0L, 0L), .getCounts(res)) res <- summarizeOverlaps(ft, rd, mode, inter.feature=FALSE) checkIdentical(c(1L, 1L), .getCounts(res)) } test_summarizeOverlaps_inter.feature_GRangesList <- function() { grl <- split(gr, mcols(gr)[["group"]]) mode <- "Union" res <- quiet(summarizeOverlaps(grl, rds, mode)) checkIdentical(c(1L, rep(0L, 4), rep(1L, 3)), .getCounts(res)) res <- quiet(summarizeOverlaps(grl, rds, mode, inter.feature=FALSE)) checkIdentical(c(1L, 1L, 2L, 2L, rep(1L, 4)), .getCounts(res)) co <- countOverlaps(grl, rds, type="any") checkIdentical(unname(co), .getCounts(res)) mode <- "IntersectionStrict" res <- quiet(summarizeOverlaps(grl, rds, mode)) checkIdentical(c(0L, 0L, 0L, 1L, 0L, rep(1L, 3)), .getCounts(res)) res <- quiet(summarizeOverlaps(grl, rds, mode, inter.feature=FALSE)) checkIdentical(c(0L, 0L, 1L, 2L, 0L, rep(1L, 3)), .getCounts(res)) co <- countSubjectHits(findOverlaps(rds, grl, type="within")) checkIdentical(unname(co), .getCounts(res)) mode <- "IntersectionNotEmpty" rd <- rds[c(5,7)] ft <- grl[3:5] res <- quiet(summarizeOverlaps(ft, rd, mode)) checkIdentical(c(0L, 1L, 0L), .getCounts(res)) res <- quiet(summarizeOverlaps(ft, rd, mode, inter.feature=FALSE)) checkIdentical(c(0L, 1L, 0L), .getCounts(res)) } GenomicAlignments/man/0000755000175400017540000000000013175714431015764 5ustar00biocbuildbiocbuildGenomicAlignments/man/GAlignmentPairs-class.Rd0000644000175400017540000004030613175714431022405 0ustar00biocbuildbiocbuild\name{GAlignmentPairs-class} \docType{class} % Class: \alias{class:GAlignmentPairs} \alias{GAlignmentPairs-class} % Constructors: \alias{GAlignmentPairs} % Accessors: \alias{strandMode} \alias{strandMode,GAlignmentPairs-method} \alias{strandMode<-} \alias{strandMode<-,GAlignmentPairs-method} \alias{invertStrand,GAlignmentPairs-method} \alias{length,GAlignmentPairs-method} \alias{names,GAlignmentPairs-method} \alias{names<-,GAlignmentPairs-method} \alias{first} \alias{first,GAlignmentPairs-method} \alias{second} \alias{second,GAlignmentPairs-method} \alias{last} \alias{last,GAlignmentPairs-method} \alias{seqnames,GAlignmentPairs-method} \alias{strand,GAlignmentPairs-method} \alias{njunc,GAlignmentPairs-method} \alias{isProperPair} \alias{isProperPair,GAlignmentPairs-method} \alias{seqinfo,GAlignmentPairs-method} \alias{seqlevelsInUse,GAlignmentPairs-method} \alias{seqinfo<-,GAlignmentPairs-method} % List methods: \alias{[[,GAlignmentPairs,ANY,ANY-method} \alias{unlist,GAlignmentPairs-method} % Coercion: \alias{ranges,GAlignmentPairs-method} \alias{granges,GAlignmentPairs-method} \alias{grglist,GAlignmentPairs-method} \alias{coerce,GAlignmentPairs,Ranges-method} \alias{coerce,GAlignmentPairs,GRanges-method} \alias{coerce,GAlignmentPairs,GRangesList-method} \alias{coerce,GAlignmentPairs,GAlignments-method} % "show" method: \alias{show,GAlignmentPairs-method} % Combining: \alias{c,GAlignmentPairs-method} \title{GAlignmentPairs objects} \description{ The GAlignmentPairs class is a container for storing \emph{pairs of genomic alignments}. These pairs are typically obtained by aligning paired-end reads to a reference genome or transcriptome. } \details{ A GAlignmentPairs object is a list-like object where each list element represents a pair of genomic alignment. An \emph{alignment pair} is made of a "first" and a "last"/"second" alignment, and is formally represented by a \link{GAlignments} object of length 2. In most applications, an \emph{alignment pair} will represent an aligned paired-end read. In that case, the "first" member of the pair represents the alignment of the first end of the read (aka "first segment in the template", using SAM Spec terminology), and the "last" member of the pair represents the alignment of the second end of the read (aka "last segment in the template", using SAM Spec terminology). In general, a GAlignmentPairs object will be created by loading records from a BAM (or SAM) file containing aligned paired-end reads, using the \code{readGAlignmentPairs} function (see below). Each element in the returned object will be obtained by pairing 2 records. } \section{Constructor}{ \describe{ \item{}{ \code{GAlignmentPairs(first, last, strandMode=1, isProperPair=TRUE, names=NULL)}: Low-level GAlignmentPairs constructor. Generally not used directly. } } } \section{Accessors}{ In the code snippets below, \code{x} is a GAlignmentPairs object. \describe{ \item{}{ \code{strandMode(x)}, \code{strandMode(x) <- value}: The \emph{strand mode} is a per-object switch on GAlignmentPairs objects that controls the behavior of the \code{strand} getter. More precisely, it indicates how the strand of a pair should be inferred from the strand of the first and last alignments in the pair: \itemize{ \item 0: strand of the pair is always *. \item 1: strand of the pair is strand of its first alignment. This mode should be used when the paired-end data was generated using one of the following stranded protocols: Directional Illumina (Ligation), Standard SOLiD. \item 2: strand of the pair is strand of its last alignment. This mode should be used when the paired-end data was generated using one of the following stranded protocols: dUTP, NSR, NNSR, Illumina stranded TruSeq PE protocol. } These modes are equivalent to \code{strandSpecific} equal 0, 1, and 2, respectively, for the \code{featureCounts} function defined in the \pkg{Rsubread} package. Note that, by default, the \code{\link{readGAlignmentPairs}} function sets the \emph{strand mode} to 1 on the returned GAlignmentPairs object. The function has a \code{strandMode} argument to let the user set a different \emph{strand mode}. The \emph{strand mode} can also be changed any time with the \code{strandMode} setter or with \code{invertStrand}. Also note that 3rd party programs TopHat2 and Cufflinks have a \code{--library-type} option to let the user specify which protocol was used. Please refer to the documentation of these programs for more information. } \item{}{ \code{length(x)}: Return the number of alignment pairs in \code{x}. } \item{}{ \code{names(x)}, \code{names(x) <- value}: Get or set the names on \code{x}. See \code{\link{readGAlignmentPairs}} for how to automatically extract and set the names when reading the alignments from a file. } \item{}{ \code{first(x, real.strand=FALSE)}, \code{last(x, real.strand=FALSE)}, \code{second(x, real.strand=FALSE)}: Get the "first" or "last"/"second" alignment for each alignment pair in \code{x}. The result is a \link{GAlignments} object of the same length as \code{x}. If \code{real.strand=TRUE}, then the strand is inverted on-the-fly according to the \emph{strand mode} currently set on the object (see \code{strandMode(x)} above). More precisely, if \code{strandMode(x)} is 0, then the strand is set to * for the \link{GAlignments} object returned by both, \code{first()} and \code{last()}. If \code{strandMode(x)} is 1, then the strand of the object returned by \code{last()} is inverted. If \code{strandMode(x)} is 2, then the strand of the object returned by \code{first()} is inverted. } \item{}{ \code{seqnames(x)}: Get the sequence names of the pairs in \code{x} i.e. the name of the reference sequence for each alignment pair in \code{x}. The sequence name of a pair is the sequence name of the 2 alignments in the pair if they are the same (\emph{concordant seqnames}), or NA if they differ (\emph{discordant seqnames}). The sequence names are returned in a factor-\link[S4Vectors]{Rle} object that is \emph{parallel} to \code{x}, i.e. the i-th element in the returned object is the sequence name of the i-th pair in \code{x}. } \item{}{ \code{strand(x)}: Get the strand for each alignment pair in \code{x}. Obey \code{strandMode(x)} above to infer the strand of a pair. Return \code{*} for pairs with \emph{discordant strand}, or for all pairs if \code{strandMode(x)} is 0. } \item{}{ \code{njunc(x)}: Equivalent to \code{njunc(first(x)) + njunc(last(x))}. } \item{}{ \code{isProperPair(x)}: Get the "isProperPair" flag bit (bit 0x2 in SAM Spec) set by the aligner for each alignment pair in \code{x}. } \item{}{ \code{seqinfo(x)}, \code{seqinfo(x) <- value}: Get or set the information about the underlying sequences. \code{value} must be a \link[GenomeInfoDb]{Seqinfo} object. } \item{}{ \code{seqlevels(x)}, \code{seqlevels(x) <- value}: Get or set the sequence levels. \code{seqlevels(x)} is equivalent to \code{seqlevels(seqinfo(x))} or to \code{levels(seqnames(x))}, those 2 expressions being guaranteed to return identical character vectors on a GAlignmentPairs object. \code{value} must be a character vector with no NAs. See \code{?\link{seqlevels}} for more information. } \item{}{ \code{seqlengths(x)}, \code{seqlengths(x) <- value}: Get or set the sequence lengths. \code{seqlengths(x)} is equivalent to \code{seqlengths(seqinfo(x))}. \code{value} can be a named non-negative integer or numeric vector eventually with NAs. } \item{}{ \code{isCircular(x)}, \code{isCircular(x) <- value}: Get or set the circularity flags. \code{isCircular(x)} is equivalent to \code{isCircular(seqinfo(x))}. \code{value} must be a named logical vector eventually with NAs. } \item{}{ \code{genome(x)}, \code{genome(x) <- value}: Get or set the genome identifier or assembly name for each sequence. \code{genome(x)} is equivalent to \code{genome(seqinfo(x))}. \code{value} must be a named character vector eventually with NAs. } \item{}{ \code{seqnameStyle(x)}: Get or set the seqname style for \code{x}. Note that this information is not stored in \code{x} but inferred by looking up \code{seqnames(x)} against a seqname style database stored in the seqnames.db metadata package (required). \code{seqnameStyle(x)} is equivalent to \code{seqnameStyle(seqinfo(x))} and can return more than 1 seqname style (with a warning) in case the style cannot be determined unambiguously. } } } \section{Vector methods}{ In the code snippets below, \code{x} is a GAlignmentPairs object. \describe{ \item{}{ \code{x[i]}: Return a new GAlignmentPairs object made of the selected alignment pairs. } } } \section{List methods}{ In the code snippets below, \code{x} is a GAlignmentPairs object. \describe{ \item{}{ \code{x[[i]]}: Extract the i-th alignment pair as a \link{GAlignments} object of length 2. As expected \code{x[[i]][1]} and \code{x[[i]][2]} are respectively the "first" and "last" alignments in the pair. } \item{}{ \code{unlist(x, use.names=TRUE)}: Return the \link{GAlignments} object conceptually defined by \code{c(x[[1]], x[[2]], ..., x[[length(x)]])}. \code{use.names} determines whether \code{x} names should be propagated to the result or not. } } } \section{Coercion}{ In the code snippets below, \code{x} is a GAlignmentPairs object. \describe{ \item{}{ \code{granges(x, use.names=TRUE, use.mcols=FALSE, on.discordant.seqnames=c("error", "drop", "split"))}, \code{ranges(x, use.names=TRUE, use.mcols=FALSE, on.discordant.seqnames=c("error", "drop", "split"))}: Return a \link{GRanges} object (for \code{granges()}) or \link[IRanges]{IRanges}) object (for \code{ranges()}). If \code{x} contains no pairs with \emph{discordant seqnames}, the operation is guaranteed to be successful and to return an object \emph{parallel} to \code{x}, that is, an object where the i-th element is the range of the genomic region spanned by the i-th alignment in \code{x} (all gaps in the region are ignored). If \code{x} contains pairs with discordant seqnames, then an error is raised, unless the \code{on.discordant.seqnames} argument is set to \code{"drop"} or \code{"split"}, in which case the pairs with discordant seqnames are either dropped or represented with 2 genomic ranges (or 2 ranges for \code{ranges()}) in the returned object. In that case, the returned object is NOT \emph{parallel} to \code{x}. If \code{use.names} is TRUE, then the names on \code{x} (if any) are propagated to the returned object. If \code{use.mcols} is TRUE, then the metadata columns on \code{x} (if any) are propagated to the returned object. } \item{}{ \code{grglist(x, use.mcols=FALSE, drop.D.ranges=FALSE)}: Return a \link{GRangesList} object of length \code{length(x)} where the i-th element represents the ranges (with respect to the reference) of the i-th alignment pair in \code{x}. The strand of the returned ranges obeys the \emph{strand mode} currently set on the object (see \code{strandMode(x)} above). More precisely, if \code{grl1} and \code{grl2} are \code{grglist(first(x, real.strand=TRUE), order.as.in.query=TRUE)} and \code{grglist(last(x, real.strand=TRUE), order.as.in.query=TRUE)}, respectively, then the i-th element in the returned \link{GRangesList} object is \code{c(grl1[[i]], grl2[[i]])} if \code{strandMode(x)} is 0 or 1, or \code{c(grl2[[i]], grl1[[i]])} if \code{strandMode(x)} is 2. Note that, if \code{strandMode(x)} is 1 or 2, this results in the ranges being in consistent order with the original "query template", that is, being in the order defined by walking the "query template" from the beginning to the end. If \code{use.names} is TRUE, then the names on \code{x} (if any) are propagated to the returned object. If \code{use.mcols} is TRUE, then the metadata columns on \code{x} (if any) are propagated to the returned object. If \code{drop.D.ranges} is TRUE, then deletions (Ds in the CIGAR) are treated like junctions (Ns in the CIGAR), that is, the ranges corresponding to deletions are dropped. } \item{}{ \code{as(x, "GRanges")}, \code{as(x, "Ranges")}, \code{as(x, "GRangesList")}: Alternate ways of doing \code{granges(x, use.names=TRUE, use.mcols=TRUE)}, \code{ranges(x, use.names=TRUE, use.mcols=TRUE)}, and \code{grglist(x, use.names=TRUE, use.mcols=TRUE)}, respectively. } \item{}{ \code{as(x, "GAlignments")}: Equivalent of \code{unlist(x, use.names=TRUE)}. } } } \section{Other methods}{ In the code snippets below, \code{x} is a GAlignmentPairs object. \describe{ \item{}{ \code{show(x)}: By default the \code{show} method displays 5 head and 5 tail elements. This can be changed by setting the global options \code{showHeadLines} and \code{showTailLines}. If the object length is less than (or equal to) the sum of these 2 options plus 1, then the full object is displayed. Note that these options also affect the display of \link{GRanges} and \link{GAlignments} objects, as well as other objects defined in the IRanges and Biostrings packages (e.g. \link[IRanges]{Ranges} and \link[Biostrings]{XStringSet} objects). } } } \author{Hervé Pagès} \seealso{ \itemize{ \item \code{\link{readGAlignmentPairs}} for reading aligned paired-end reads from a file (typically a BAM file) into a GAlignmentPairs object. \item \link{GAlignments} objects for handling aligned single-end reads. \item \code{\link{makeGAlignmentPairs}} for pairing the elements of a \link{GAlignments} object into a GAlignmentPairs object. \item \link{junctions-methods} for extracting and summarizing junctions from a GAlignmentPairs object. \item \link[GenomicAlignments]{coverage-methods} for computing the coverage of a GAlignmentPairs object. \item \link[GenomicAlignments]{findOverlaps-methods} for finding range overlaps between a GAlignmentPairs object and another range-based object. \item \code{\link[GenomeInfoDb]{seqinfo}} in the \pkg{GenomeInfoDb} package for getting/setting/modifying the sequence information stored in an object. \item The \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} classes defined and documented in the \pkg{GenomicRanges} package. } } \examples{ library(Rsamtools) # for the ex1.bam file ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") galp <- readGAlignmentPairs(ex1_file, use.names=TRUE, strandMode=1) galp length(galp) head(galp) head(names(galp)) first(galp) last(galp) # or second(galp) strandMode(galp) first(galp, real.strand=TRUE) last(galp, real.strand=TRUE) strand(galp) strandMode(galp) <- 2 first(galp, real.strand=TRUE) last(galp, real.strand=TRUE) strand(galp) seqnames(galp) head(njunc(galp)) table(isProperPair(galp)) seqlevels(galp) ## Rename the reference sequences: seqlevels(galp) <- sub("seq", "chr", seqlevels(galp)) seqlevels(galp) galp[[1]] unlist(galp) grglist(galp) # a GRangesList object strandMode(galp) <- 1 grglist(galp) ## Alternatively the strand mode can be changed with invertStrand(): invertStrand(galp) stopifnot(identical(unname(elementNROWS(grglist(galp))), njunc(galp) + 2L)) granges(galp) # a GRanges object } \keyword{methods} \keyword{classes} GenomicAlignments/man/GAlignments-class.Rd0000644000175400017540000004511413175714431021573 0ustar00biocbuildbiocbuild\name{GAlignments-class} \docType{class} % Class: \alias{class:GAlignments} \alias{GAlignments-class} % Constructor: \alias{GAlignments} \alias{updateObject,GAlignments-method} % Accessors: \alias{length,GAlignments-method} \alias{names,GAlignments-method} \alias{seqnames,GAlignments-method} \alias{rname} \alias{rname,GAlignments-method} \alias{strand,GAlignments-method} \alias{names<-,GAlignments-method} \alias{seqnames<-,GAlignments-method} \alias{rname<-} \alias{rname<-,GAlignments-method} \alias{strand<-,GAlignments-method} \alias{cigar} \alias{cigar,GAlignments-method} \alias{qwidth} \alias{qwidth,GAlignments-method} \alias{start,GAlignments-method} \alias{end,GAlignments-method} \alias{width,GAlignments-method} \alias{njunc} \alias{njunc,GAlignments-method} \alias{seqinfo,GAlignments-method} \alias{seqinfo<-,GAlignments-method} % Coercion: \alias{ranges,GAlignments-method} \alias{granges,GAlignments-method} \alias{grglist,GAlignments-method} \alias{rglist,GAlignments-method} \alias{coerce,GAlignments,Ranges-method} \alias{coerce,GAlignments,GRanges-method} \alias{coerce,GAlignments,GRangesList-method} \alias{coerce,GAlignments,RangesList-method} \alias{as.data.frame,GAlignments-method} \alias{coerce,GenomicRanges,GAlignments-method} % Combining: \alias{c,GAlignments-method} % "show" method: \alias{show,GAlignments-method} % Comparison/ordering: \alias{pcompare,GAlignments,GAlignments-method} \alias{is.unsorted,GAlignments-method} \alias{order,GAlignments-method} \alias{sort,GAlignments-method} \alias{rank,GAlignments-method} \title{GAlignments objects} \description{ The GAlignments class is a simple container which purpose is to store a set of genomic alignments that will hold just enough information for supporting the operations described below. } \details{ A GAlignments object is a vector-like object where each element describes a genomic alignment i.e. how a given sequence (called "query" or "read", typically short) aligns to a reference sequence (typically long). Typically, a GAlignments object will be created by loading records from a BAM (or SAM) file and each element in the resulting object will correspond to a record. BAM/SAM records generally contain a lot of information but only part of that information is loaded in the GAlignments object. In particular, we discard the query sequences (SEQ field), the query qualities (QUAL), the mapping qualities (MAPQ) and any other information that is not needed in order to support the operations or methods described below. This means that multi-reads (i.e. reads with multiple hits in the reference) won't receive any special treatment i.e. the various SAM/BAM records corresponding to a multi-read will show up in the GAlignments object as if they were coming from different/unrelated queries. Also paired-end reads will be treated as single-end reads and the pairing information will be lost (see \code{?\link{GAlignmentPairs}} for how to handle aligned paired-end reads). Each element of a GAlignments object consists of: \itemize{ \item The name of the reference sequence. (This is the RNAME field in a SAM/BAM record.) \item The strand in the reference sequence to which the query is aligned. (This information is stored in the FLAG field in a SAM/BAM record.) \item The CIGAR string in the "Extended CIGAR format" (see the SAM Format Specifications for the details). \item The 1-based leftmost position/coordinate of the clipped query relative to the reference sequence. We will refer to it as the "start" of the query. (This is the POS field in a SAM/BAM record.) \item The 1-based rightmost position/coordinate of the clipped query relative to the reference sequence. We will refer to it as the "end" of the query. (This is NOT explicitly stored in a SAM/BAM record but can be inferred from the POS and CIGAR fields.) Note that all positions/coordinates are always relative to the first base at the 5' end of the plus strand of the reference sequence, even when the query is aligned to the minus strand. \item The genomic intervals between the "start" and "end" of the query that are "covered" by the alignment. Saying that the full [start,end] interval is covered is the same as saying that the alignment contains no junction (no N in the CIGAR). It is then considered to be a simple alignment. Note that a simple alignment can have mismatches or deletions (in the reference). In other words, a deletion (encoded with a D in the CIGAR) is NOT considered to introduce a gap in the coverage, but a junction is. } Note that the last 2 items are not expicitly stored in the GAlignments object: they are inferred on-the-fly from the CIGAR and the "start". Optionally, a GAlignments object can have names (accessed thru the \code{\link[base]{names}} generic function) which will be coming from the QNAME field of the SAM/BAM records. The rest of this man page will focus on describing how to: \itemize{ \item Access the information stored in a GAlignments object in a way that is independent from how the data are actually stored internally. \item How to create and manipulate a GAlignments object. } } \section{Constructor}{ \describe{ \item{}{ \code{GAlignments(seqnames=Rle(factor()), pos=integer(0), cigar=character(0), strand=NULL, names=NULL, seqlengths=NULL, ...)}: Low-level GAlignments constructor. Generally not used directly. Named arguments in \code{...} are used as metadata columns. } } } \section{Accessors}{ In the code snippets below, \code{x} is a GAlignments object. \describe{ \item{}{ \code{length(x)}: Return the number of alignments in \code{x}. } \item{}{ \code{names(x)}, \code{names(x) <- value}: Get or set the names on \code{x}. See \code{\link{readGAlignments}} for how to automatically extract and set the names when reading the alignments from a file. } \item{}{ \code{seqnames(x)}, \code{seqnames(x) <- value}: Get or set the name of the reference sequence for each alignment in \code{x} (see Details section above for more information about the RNAME field of a SAM/BAM file). \code{value} can be a factor, or a 'factor' \link[S4Vectors]{Rle}, or a character vector. } \item{}{ \code{rname(x)}, \code{rname(x) <- value}: Same as \code{seqnames(x)} and \code{seqnames(x) <- value}. } \item{}{ \code{strand(x)}, \code{strand(x) <- value}: Get or set the strand for each alignment in \code{x} (see Details section above for more information about the strand of an alignment). \code{value} can be a factor (with levels +, - and *), or a 'factor' \link[S4Vectors]{Rle}, or a character vector. } \item{}{ \code{cigar(x)}: Returns a character vector of length \code{length(x)} containing the CIGAR string for each alignment. } \item{}{ \code{qwidth(x)}: Returns an integer vector of length \code{length(x)} containing the length of the query *after* hard clipping (i.e. the length of the query sequence that is stored in the corresponding SAM/BAM record). } \item{}{ \code{start(x)}, \code{end(x)}: Returns an integer vector of length \code{length(x)} containing the "start" and "end" (respectively) of the query for each alignment. See Details section above for the exact definitions of the "start" and "end" of a query. Note that \code{start(x)} and \code{end(x)} are equivalent to \code{start(granges(x))} and \code{end(granges(x))}, respectively (or, alternatively, to \code{min(rglist(x))} and \code{max(rglist(x))}, respectively). } \item{}{ \code{width(x)}: Equivalent to \code{width(granges(x))} (or, alternatively, to \code{end(x) - start(x) + 1L}). Note that this is generally different from \code{qwidth(x)} except for alignments with a trivial CIGAR string (i.e. a string of the form \code{"M"} where is a number). } \item{}{ \code{njunc(x)}: Returns an integer vector of the same length as \code{x} containing the number of junctions (i.e. N operations in the CIGAR) in each alignment. Equivalent to \code{unname(elementNROWS(rglist(x))) - 1L}. } \item{}{ \code{seqinfo(x)}, \code{seqinfo(x) <- value}: Get or set the information about the underlying sequences. \code{value} must be a \link[GenomeInfoDb]{Seqinfo} object. } \item{}{ \code{seqlevels(x)}, \code{seqlevels(x) <- value}: Get or set the sequence levels. \code{seqlevels(x)} is equivalent to \code{seqlevels(seqinfo(x))} or to \code{levels(seqnames(x))}, those 2 expressions being guaranteed to return identical character vectors on a GAlignments object. \code{value} must be a character vector with no NAs. See \code{?\link{seqlevels}} for more information. } \item{}{ \code{seqlengths(x)}, \code{seqlengths(x) <- value}: Get or set the sequence lengths. \code{seqlengths(x)} is equivalent to \code{seqlengths(seqinfo(x))}. \code{value} can be a named non-negative integer or numeric vector eventually with NAs. } \item{}{ \code{isCircular(x)}, \code{isCircular(x) <- value}: Get or set the circularity flags. \code{isCircular(x)} is equivalent to \code{isCircular(seqinfo(x))}. \code{value} must be a named logical vector eventually with NAs. } \item{}{ \code{genome(x)}, \code{genome(x) <- value}: Get or set the genome identifier or assembly name for each sequence. \code{genome(x)} is equivalent to \code{genome(seqinfo(x))}. \code{value} must be a named character vector eventually with NAs. } \item{}{ \code{seqnameStyle(x)}: Get or set the seqname style for \code{x}. Note that this information is not stored in \code{x} but inferred by looking up \code{seqnames(x)} against a seqname style database stored in the \pkg{seqnames.db} metadata package (required). \code{seqnameStyle(x)} is equivalent to \code{seqnameStyle(seqinfo(x))} and can return more than 1 seqname style (with a warning) in case the style cannot be determined unambiguously. } } } \section{Coercion}{ In the code snippets below, \code{x} is a GAlignments object. \describe{ \item{}{ \code{granges(x, use.names=TRUE, use.mcols=FALSE)}, \code{ranges(x, use.names=TRUE, use.mcols=FALSE)}: Return a \link{GRanges} object (for \code{granges()}) or \link[IRanges]{IRanges}) object (for \code{ranges()}) \emph{parallel} to \code{x} where the i-th element is the range of the genomic region spanned by the i-th alignment in \code{x}. All gaps in the region are ignored. If \code{use.names} is TRUE, then the names on \code{x} (if any) are propagated to the returned object. If \code{use.mcols} is TRUE, then the metadata columns on \code{x} (if any) are propagated to the returned object. } \item{}{ \code{grglist(x, use.names=TRUE, use.mcols=FALSE, order.as.in.query=FALSE, drop.D.ranges=FALSE)}, \code{rglist(x, use.names=TRUE, use.mcols=FALSE, order.as.in.query=FALSE, drop.D.ranges=FALSE)}: Return either a \link{GRangesList} or a \link[IRanges]{RangesList} object of length \code{length(x)} where the i-th element represents the ranges (with respect to the reference) of the i-th alignment in \code{x}. More precisely, the \link[IRanges]{RangesList} object returned by \code{rglist(x)} is a \link[IRanges]{CompressedIRangesList} object. If \code{use.names} is TRUE, then the names on \code{x} (if any) are propagated to the returned object. If \code{use.mcols} is TRUE, then the metadata columns on \code{x} (if any) are propagated to the returned object. The \code{order.as.in.query} toggle affects the order of the ranges \emph{within} each top-level element of the returned object. If FALSE (the default), then the ranges are ordered from 5' to 3' in elements associated with the plus strand (i.e. corresponding to alignments located on the plus strand), and from 3' to 5' in elements associated with the minus strand. So, whatever the strand is, the ranges are in ascending order (i.e. left-to-right). If TRUE, then the order of the ranges in elements associated with the \emph{minus} strand is reversed. So they end up being ordered from 5' to 3' too, which means that they are now in decending order (i.e. right-to-left). It also means that, when \code{order.as.in.query=TRUE} is used, the ranges are \emph{always} ordered consistently with the original "query template", that is, in the order defined by walking the "query template" from the beginning to the end. If \code{drop.D.ranges} is TRUE, then deletions (D operations in the CIGAR) are treated like junctions (N operations in the CIGAR), that is, the ranges corresponding to deletions are dropped. See Details section above for more information. } \item{}{ \code{as(x, "GRanges")}, \code{as(x, "Ranges")}, \code{as(x, "GRangesList")}, \code{as(x, "RangesList")}: Alternate ways of doing \code{granges(x, use.names=TRUE, use.mcols=TRUE)}, \code{ranges(x, use.names=TRUE, use.mcols=TRUE)}, \code{grglist(x, use.names=TRUE, use.mcols=TRUE)}, and \code{rglist(x, use.names=TRUE, use.mcols=TRUE)}, respectively. } } In the code snippet below, \code{x} is a \link[GenomicRanges]{GRanges} object. \describe{ \item{}{ \code{as(from, "GAlignments")}: Creates a GAlignments object from a \link[GenomicRanges]{GRanges} object. The metadata columns are propagated. cigar values are created from the sequence width unless a "cigar" metadata column already exists in \code{from}. } } } \section{Subsetting and related operations}{ In the code snippets below, \code{x} is a GAlignments object. \describe{ \item{}{ \code{x[i]}: Return a new GAlignments object made of the selected alignments. \code{i} can be a numeric or logical vector. } } } \section{Combining}{ \describe{ \item{}{ \code{c(...)}: Concatenates the GAlignments objects in \code{...}. } } } \section{Other methods}{ \describe{ \item{}{ \code{show(x)}: By default the \code{show} method displays 5 head and 5 tail elements. This can be changed by setting the global options \code{showHeadLines} and \code{showTailLines}. If the object length is less than (or equal to) the sum of these 2 options plus 1, then the full object is displayed. Note that these options also affect the display of \link{GRanges} and \link{GAlignmentPairs} objects, as well as other objects defined in the \pkg{IRanges} and \pkg{Biostrings} packages (e.g. \link[IRanges]{Ranges} and \link[Biostrings]{DNAStringSet} objects). } } } \references{ \url{http://samtools.sourceforge.net/} } \author{Hervé Pagès and P. Aboyoun} \seealso{ \itemize{ \item \code{\link{readGAlignments}} for reading genomic alignments from a file (typically a BAM file) into a GAlignments object. \item \link{GAlignmentPairs} objects for handling aligned paired-end reads. \item \link{junctions-methods} for extracting and summarizing junctions from a GAlignments object. \item \link[GenomicAlignments]{coverage-methods} for computing the coverage of a GAlignments object. \item \link[GenomicAlignments]{findOverlaps-methods} for finding overlapping genomic alignments. \item \code{\link[GenomeInfoDb]{seqinfo}} in the \pkg{GenomeInfoDb} package for getting/setting/modifying the sequence information stored in an object. \item The \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} classes defined and documented in the \pkg{GenomicRanges} package. \item The \link[IRanges]{CompressedIRangesList} class defined and documented in the \pkg{IRanges} package. } } \examples{ library(Rsamtools) # for the ex1.bam file ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") gal <- readGAlignments(ex1_file, param=ScanBamParam(what="flag")) gal ## --------------------------------------------------------------------- ## A. BASIC MANIPULATION ## --------------------------------------------------------------------- length(gal) head(gal) names(gal) # no names by default seqnames(gal) strand(gal) head(cigar(gal)) head(qwidth(gal)) table(qwidth(gal)) head(start(gal)) head(end(gal)) head(width(gal)) head(njunc(gal)) seqlevels(gal) ## Invert the strand: invertStrand(gal) ## Rename the reference sequences: seqlevels(gal) <- sub("seq", "chr", seqlevels(gal)) seqlevels(gal) grglist(gal) # a GRangesList object stopifnot(identical(unname(elementNROWS(grglist(gal))), njunc(gal) + 1L)) granges(gal) # a GRanges object rglist(gal) # a CompressedIRangesList object stopifnot(identical(unname(elementNROWS(rglist(gal))), njunc(gal) + 1L)) ranges(gal) # an IRanges object ## Modify the number of lines in 'show' options(showHeadLines=3) options(showTailLines=2) gal ## Revert to default options(showHeadLines=NULL) options(showTailLines=NULL) ## --------------------------------------------------------------------- ## B. SUBSETTING ## --------------------------------------------------------------------- gal[strand(gal) == "-"] gal[grep("I", cigar(gal), fixed=TRUE)] gal[grep("N", cigar(gal), fixed=TRUE)] # no junctions ## A confirmation that none of the alignments contains junctions (in ## other words, each alignment can be represented by a single genomic ## range on the reference): stopifnot(all(njunc(gal) == 0)) ## Different ways to subset: gal[6] # a GAlignments object of length 1 grglist(gal)[[6]] # a GRanges object of length 1 rglist(gal)[[6]] # a NormalIRanges object of length 1 ## Unlike N operations, D operations don't introduce gaps: ii <- grep("D", cigar(gal), fixed=TRUE) gal[ii] njunc(gal[ii]) grglist(gal[ii]) ## qwidth() vs width(): gal[qwidth(gal) != width(gal)] ## This MUST return an empty object: gal[cigar(gal) == "35M" & qwidth(gal) != 35] ## but this doesn't have too: gal[cigar(gal) != "35M" & qwidth(gal) == 35] } \keyword{methods} \keyword{classes} GenomicAlignments/man/GAlignmentsList-class.Rd0000644000175400017540000003324213175714431022426 0ustar00biocbuildbiocbuild\name{GAlignmentsList-class} \docType{class} % Class \alias{class:GAlignmentsList} \alias{GAlignmentsList-class} \alias{GAlignmentsList} % Constructors: \alias{GAlignmentsList} \alias{updateObject,GAlignmentsList-method} % Accessors: \alias{names,GAlignmentsList-method} \alias{names<-,GAlignmentsList-method} \alias{seqnames,GAlignmentsList-method} \alias{seqnames<-,GAlignmentsList-method} \alias{rname,GAlignmentsList-method} \alias{rname<-,GAlignmentsList-method} \alias{strand,GAlignmentsList-method} \alias{strand<-,GAlignmentsList-method} \alias{strand<-,GAlignmentsList,character-method} \alias{cigar,GAlignmentsList-method} \alias{qwidth,GAlignmentsList-method} \alias{njunc,GAlignmentsList-method} \alias{elementMetadata,GAlignmentsList-method} \alias{elementMetadata<-,GAlignmentsList-method} \alias{seqinfo,GAlignmentsList-method} \alias{seqinfo<-,GAlignmentsList-method} \alias{start,GAlignmentsList-method} \alias{end,GAlignmentsList-method} \alias{width,GAlignmentsList-method} % Coercion: \alias{ranges,GAlignmentsList-method} \alias{granges,GAlignmentsList-method} \alias{grglist,GAlignmentsList-method} \alias{rglist,GAlignmentsList-method} \alias{coerce,GAlignmentsList,Ranges-method} \alias{coerce,GAlignmentsList,GRanges-method} \alias{coerce,GAlignmentsList,GRangesList-method} \alias{coerce,GAlignmentsList,RangesList-method} \alias{coerce,GAlignmentPairs,GAlignmentsList-method} % Combining: \alias{c,GAlignmentsList-method} % extractList() and family: \alias{relistToClass,GAlignments-method} % show: \alias{show,GAlignmentsList-method} \title{GAlignmentsList objects} \description{ The GAlignmentsList class is a container for storing a collection of \link{GAlignments} objects. } \details{ A GAlignmentsList object contains a list of \link{GAlignments} objects. The majority of operations on this page are described in more detail on the GAlignments man page, see ?\code{GAlignments}. } \section{Constructor}{ \describe{ \item{}{ \code{GAlignmentsList(...)}: Creates a GAlignmentsList from a list of \link{GAlignments} objects. } } } \section{Accessors}{ In the code snippets below, \code{x} is a GAlignmentsList object. \describe{ \item{}{ \code{length(x)}: Return the number of elements in \code{x}. } \item{}{ \code{names(x)}, \code{names(x) <- value}: Get or set the names of the elements of \code{x}. } \item{}{ \code{seqnames(x)}, \code{seqnames(x) <- value}: Get or set the name of the reference sequences of the alignments in each element of \code{x}. } \item{}{ \code{rname(x)}, \code{rname(x) <- value}: Same as \code{seqnames(x)} and \code{seqnames(x) <- value}. } \item{}{ \code{strand(x)}, \code{strand(x) <- value}: Get or set the strand of the alignments in each element of \code{x}. } \item{}{ \code{cigar(x)}: Returns a character list of length \code{length(x)} containing the CIGAR string for the alignments in each element of \code{x}. } \item{}{ \code{qwidth(x)}: Returns an integer list of length \code{length(x)} containing the length of the alignments in each element of \code{x} *after* hard clipping (i.e. the length of the query sequence that is stored in the corresponding SAM/BAM record). } \item{}{ \code{start(x)}, \code{end(x)}: Returns an integer list of length \code{length(x)} containing the "start" and "end" (respectively) of the alignments in each element of \code{x}. } \item{}{ \code{width(x)}: Returns an integer list of length \code{length(x)} containing the "width" of the alignments in each element of \code{x}. } \item{}{ \code{njunc(x)}: Returns an integer list of length \code{x} containing the number of junctions (i.e. N operations in the CIGAR) for the alignments in each element of \code{x}. } \item{}{ \code{seqinfo(x)}, \code{seqinfo(x) <- value}: Get or set the information about the underlying sequences. \code{value} must be a \link[GenomeInfoDb]{Seqinfo} object. } \item{}{ \code{seqlevels(x)}, \code{seqlevels(x) <- value}: Get or set the sequence levels of the alignments in each element of \code{x}. } \item{}{ \code{seqlengths(x)}, \code{seqlengths(x) <- value}: Get or set the sequence lengths for each element of \code{x}. \code{seqlengths(x)} is equivalent to \code{seqlengths(seqinfo(x))}. \code{value} can be a named non-negative integer or numeric vector eventually with NAs. } \item{}{ \code{isCircular(x)}, \code{isCircular(x) <- value}: Get or set the circularity flags for the alignments in each element in \code{x}. \code{value} must be a named logical list eventually with NAs. } \item{}{ \code{genome(x)}, \code{genome(x) <- value}: Get or set the genome identifier or assembly name for the alignments in each element of \code{x}. \code{value} must be a named character list eventually with NAs. } \item{}{ \code{seqnameStyle(x)}: Get or set the seqname style for alignments in each element of \code{x}. } } } \section{Coercion}{ In the code snippets below, \code{x} is a GAlignmentsList object. \describe{ \item{}{ \code{granges(x, use.names=TRUE, use.mcols=FALSE, ignore.strand=FALSE)}, \code{ranges(x, use.names=TRUE, use.mcols=FALSE)}: Return either a \link{GRanges} or a \link[IRanges]{IRanges} object of length \code{length(x)}. Note this coercion IGNORES the cigar information. The resulting ranges span the entire range, including any junctions or spaces between paired-end reads. If \code{use.names} is TRUE, then the names on \code{x} (if any) are propagated to the returned object. If \code{use.mcols} is TRUE, then the metadata columns on \code{x} (if any) are propagated to the returned object. \code{granges} coercion supports \code{ignore.strand} to allow ranges of opposite strand to be combined (see examples). All ranges in the resulting GRanges will have strand \sQuote{*}. } \item{}{ \code{grglist(x, use.names=TRUE, use.mcols=FALSE, ignore.strand=FALSE)}, \code{rglist(x, use.names=TRUE, use.mcols=FALSE)}: Return either a \link{GRangesList} or an \link[IRanges]{IRangesList} object of length \code{length(x)}. This coercion RESPECTS the cigar information. The resulting ranges are fragments of the original ranges that do not include junctions or spaces between paired-end reads. If \code{use.names} is TRUE, then the names on \code{x} (if any) are propagated to the returned object. If \code{use.mcols} is TRUE, then the metadata columns on \code{x} (if any) are propagated to the returned object. \code{grglist} coercion supports \code{ignore.strand} to allow ranges of opposite strand to be combined (see examples). When \code{ignore.strand} is TRUE all ranges in the resulting GRangesList have strand \sQuote{*}. } \item{}{ \code{as(x, "GRanges")}, \code{as(x, "Ranges")}, \code{as(x, "GRangesList")}, \code{as(x, "RangesList")}: Alternate ways of doing \code{granges(x, use.names=TRUE, use.mcols=TRUE)}, \code{ranges(x, use.names=TRUE, use.mcols=TRUE)}, \code{grglist(x, use.names=TRUE, use.mcols=TRUE)}, and \code{rglist(x, use.names=TRUE, use.mcols=TRUE)}, respectively. } \item{}{ \code{as.data.frame(x, row.names = NULL, optional = FALSE, ..., value.name = "value", use.outer.mcols = FALSE, group_name.as.factor = FALSE)}: Coerces \code{x} to a \code{data.frame}. See as.data.frame on the \code{List} man page for details (?\code{List}). } \item{}{ \code{as(x, "GALignmentsList")}: Here \code{x} is a \link{GAlignmentPairs} object. Return a GAlignmentsList object of length \code{length(x)} where the i-th list element represents the ranges of the i-th alignment pair in \code{x}. } } } \section{Subsetting and related operations}{ In the code snippets below, \code{x} is a GAlignmentsList object. \describe{ \item{}{ \code{x[i]}, \code{x[i] <- value}: Get or set list elements \code{i}. \code{i} can be a numeric or logical vector. \code{value} must be a GAlignments. } \item{}{ \code{x[[i]]}, \code{x[[i]] <- value}: Same as \code{x[i]}, \code{x[i] <- value}. } \item{}{ \code{x[i, j]}, \code{x[i, j] <- value}: Get or set list elements \code{i} with optional metadata columns \code{j}. \code{i} can be a numeric, logical or missing. \code{value} must be a GAlignments. } } } \section{Combining}{ \describe{ \item{}{ \code{c(...)}: Concatenates the GAlignmentsList objects in \code{...}. } } } \references{ \url{http://samtools.sourceforge.net/} } \author{Valerie Obenchain } \seealso{ \itemize{ \item \code{\link{readGAlignmentsList}} for reading genomic alignments from a file (typically a BAM file) into a GAlignmentsList object. \item \link{GAlignments} and \link{GAlignmentPairs} objects for handling aligned single- and paired-end reads, respectively. \item \link{junctions-methods} for extracting and summarizing junctions from a GAlignmentsList object. \item \link[GenomicAlignments]{findOverlaps-methods} for finding range overlaps between a GAlignmentsList object and another range-based object. \item \code{\link[GenomeInfoDb]{seqinfo}} in the \pkg{GenomeInfoDb} package for getting/setting/modifying the sequence information stored in an object. \item The \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} classes defined and documented in the \pkg{GenomicRanges} package. } } \examples{ gal1 <- GAlignments( seqnames=Rle(factor(c("chr1", "chr2", "chr1", "chr3")), c(1, 3, 2, 4)), pos=1:10, cigar=paste0(10:1, "M"), strand=Rle(strand(c("-", "+", "*", "+", "-")), c(1, 2, 2, 3, 2)), names=head(letters, 10), score=1:10) gal2 <- GAlignments( seqnames=Rle(factor(c("chr2", "chr4")), c(3, 4)), pos=1:7, cigar=c("5M", "3M2N3M2N3M", "5M", "10M", "5M1N4M", "8M2N1M", "5M"), strand=Rle(strand(c("-", "+")), c(4, 3)), names=tail(letters, 7), score=1:7) galist <- GAlignmentsList(noGaps=gal1, Gaps=gal2) ## --------------------------------------------------------------------- ## A. BASIC MANIPULATION ## --------------------------------------------------------------------- length(galist) names(galist) seqnames(galist) strand(galist) head(cigar(galist)) head(qwidth(galist)) head(start(galist)) head(end(galist)) head(width(galist)) head(njunc(galist)) seqlevels(galist) ## Rename the reference sequences: seqlevels(galist) <- sub("chr", "seq", seqlevels(galist)) seqlevels(galist) grglist(galist) # a GRangesList object rglist(galist) # an IRangesList object ## --------------------------------------------------------------------- ## B. SUBSETTING ## --------------------------------------------------------------------- galist[strand(galist) == "-"] has_junctions <- sapply(galist, function(x) any(grepl("N", cigar(x), fixed=TRUE))) galist[has_junctions] ## Different ways to subset: galist[2] # a GAlignments object of length 1 galist[[2]] # a GAlignments object of length 1 grglist(galist[2]) # a GRangesList object of length 1 rglist(galist[2]) # a NormalIRangesList object of length 1 ## --------------------------------------------------------------------- ## C. mcols()/elementMetadata() ## --------------------------------------------------------------------- ## Metadata can be defined on the individual GAlignment elements ## and the overall GAlignmentsList object. By default, 'level=between' ## extracts the GALignmentsList metadata. Using 'level=within' ## will extract the metadata on the individual GAlignments objects. mcols(galist) ## no metadata on the GAlignmentsList object mcols(galist, level="within") ## --------------------------------------------------------------------- ## D. readGAlignmentsList() ## --------------------------------------------------------------------- library(pasillaBamSubset) ## 'file' as character. fl <- untreated3_chr4() galist1 <- readGAlignmentsList(fl) galist1[1:3] length(galist1) table(elementNROWS(galist1)) ## When 'file' is a BamFile, 'asMates' must be TRUE. If FALSE, ## the data are treated as single-end and each list element of the ## GAlignmentsList will be of length 1. For single-end data ## use readGAlignments() instead of readGAlignmentsList(). bf <- BamFile(fl, yieldSize=3, asMates=TRUE) readGAlignmentsList(bf) ## Use a 'param' to fine tune the results. param <- ScanBamParam(flag=scanBamFlag(isProperPair=TRUE)) galist2 <- readGAlignmentsList(fl, param=param) length(galist2) ## --------------------------------------------------------------------- ## E. COERCION ## --------------------------------------------------------------------- ## The granges() and grlist() coercions support 'ignore.strand' to ## allow ranges from different strands to be combined. In this example ## paired-end reads aligned to opposite strands were read into a ## GAlignmentsList. If the desired operation is to combine these ranges, ## regardless of junctions or the space between pairs, 'ignore.strand' ## must be TRUE. granges(galist[1]) granges(galist[1], ignore.strand=TRUE) ## grglist() galist <- GAlignmentsList(noGaps=gal1, Gaps=gal2) grglist(galist) grglist(galist, ignore.strand=TRUE) } \keyword{methods} \keyword{classes} GenomicAlignments/man/GappedReads-class.Rd0000644000175400017540000000253713175714431021544 0ustar00biocbuildbiocbuild\name{GappedReads-class} \docType{class} % Class: \alias{class:GappedReads} \alias{GappedReads-class} % Constructor: \alias{GappedReads} % Accessors: \alias{qseq} \alias{qseq,GappedReads-method} \alias{qwidth,GappedReads-method} % Combining: \alias{c,GappedReads-method} \title{(Legacy) GappedReads objects} \description{ The GappedReads class extends the \link{GAlignments} class. A GappedReads object contains all the information contained in a \link{GAlignments} object plus the sequences of the queries. Those sequences can be accessed via the \code{qseq} accessor. } \section{Constructor}{ GappedReads objects are typically created when reading a file containing aligned reads with the \code{\link{readGappedReads}} function. } \section{Accessors}{ In the code snippets below, \code{x} is a GappedReads object. \describe{ \item{}{ \code{qseq(x)}: Extracts the sequences of the queries as a \code{\link[Biostrings]{DNAStringSet}} object. } } } \references{ \url{http://samtools.sourceforge.net/} } \author{Hervé Pagès} \seealso{ \itemize{ \item \link{GAlignments} objects. \item \code{\link{readGappedReads}}. } } \examples{ greads_file <- system.file("extdata", "ex1.bam", package="Rsamtools") greads <- readGappedReads(greads_file) greads qseq(greads) } \keyword{methods} \keyword{classes} GenomicAlignments/man/OverlapEncodings-class.Rd0000644000175400017540000003070213175714431022622 0ustar00biocbuildbiocbuild\name{OverlapEncodings-class} \docType{class} \alias{class:OverlapEncodings} \alias{OverlapEncodings-class} \alias{OverlapEncodings} \alias{parallelSlotNames,OverlapEncodings-method} \alias{Loffset} \alias{Loffset,OverlapEncodings-method} \alias{Roffset} \alias{Roffset,OverlapEncodings-method} \alias{encoding,OverlapEncodings-method} \alias{levels,OverlapEncodings-method} \alias{levels.OverlapEncodings} \alias{flippedQuery} \alias{flippedQuery,OverlapEncodings-method} \alias{encodingHalves} \alias{encodingHalves,character-method} \alias{encodingHalves,factor-method} \alias{encodingHalves,OverlapEncodings-method} \alias{Lencoding} \alias{Rencoding} \alias{Lnjunc} \alias{Rnjunc} \alias{njunc,ANY-method} \alias{as.data.frame.OverlapEncodings} \alias{as.data.frame,OverlapEncodings-method} \alias{show,OverlapEncodings-method} \alias{isCompatibleWithSplicing} \alias{isCompatibleWithSplicing,character-method} \alias{isCompatibleWithSplicing,factor-method} \alias{isCompatibleWithSplicing,OverlapEncodings-method} \title{OverlapEncodings objects} \description{ The OverlapEncodings class is a container for storing the "overlap encodings" returned by the \code{\link{encodeOverlaps}} function. } \usage{ ## -=-= OverlapEncodings getters =-=- \S4method{Loffset}{OverlapEncodings}(x) \S4method{Roffset}{OverlapEncodings}(x) \S4method{encoding}{OverlapEncodings}(x) \S4method{levels}{OverlapEncodings}(x) \S4method{flippedQuery}{OverlapEncodings}(x) ## -=-= Coercing an OverlapEncodings object =-=- \S4method{as.data.frame}{OverlapEncodings}(x, row.names=NULL, optional=FALSE, ...) ## -=-= Low-level encoding utilities =-=- encodingHalves(x, single.end.on.left=FALSE, single.end.on.right=FALSE, as.factors=FALSE) Lencoding(x, ...) Rencoding(x, ...) \S4method{njunc}{ANY}(x) Lnjunc(x, single.end.on.left=FALSE) Rnjunc(x, single.end.on.right=FALSE) isCompatibleWithSplicing(x) } \arguments{ \item{x}{ An OverlapEncodings object. For the low-level encoding utilities, \code{x} can also be a character vector or factor containing encodings. } \item{row.names}{ \code{NULL} or a character vector. } \item{optional}{ Ignored. } \item{...}{ Extra arguments passed to the \code{as.data.frame} method for OverlapEncodings objects are ignored. Extra arguments passed to \code{Lencoding} or \code{Rencoding} are passed down to \code{encodingHalves}. } \item{single.end.on.left, single.end.on.right}{ By default the 2 halves of a single-end encoding are considered to be NAs. If \code{single.end.on.left} (resp. \code{single.end.on.right}) is \code{TRUE}, then the left (resp. right) half of a single-end encoding is considered to be the unmodified encoding. } \item{as.factors}{ By default \code{encodingHalves} returns the 2 encoding halves as a list of 2 character vectors parallel to the input. If \code{as.factors} is \code{TRUE}, then it returns them as a list of 2 factors parallel to the input. } } \details{ Given a \code{query} and a \code{subject} of the same length, both list-like objects with top-level elements typically containing multiple ranges (e.g. \link[IRanges]{RangesList} objects), the "overlap encoding" of the i-th element in \code{query} and i-th element in \code{subject} is a character string describing how the ranges in \code{query[[i]]} are \emph{qualitatively} positioned relatively to the ranges in \code{subject[[i]]}. The \code{\link{encodeOverlaps}} function computes those overlap encodings and returns them in an OverlapEncodings object of the same length as \code{query} and \code{subject}. The topic of working with overlap encodings is covered in details in the "OverlapEncodings" vignette located this package (\pkg{GenomicAlignments}) and accessible with \code{vignette("OverlapEncodings")}. } \section{OverlapEncodings getters}{ In the following code snippets, \code{x} is an OverlapEncodings object typically obtained by a call to \code{\link{encodeOverlaps}(query, subject)}. \describe{ \item{}{ \code{length(x)}: Get the number of elements (i.e. encodings) in \code{x}. This is equal to \code{length(query)} and \code{length(subject)}. } \item{}{ \code{Loffset(x)}, \code{Roffset(x)}: Get the "left offsets" and "right offsets" of the encodings, respectively. Both are integer vectors of the same length as \code{x}. Let's denote \code{Qi = query[[i]]}, \code{Si = subject[[i]]}, and [q1,q2] the range covered by \code{Qi} i.e. \code{q1 = min(start(Qi))} and \code{q2 = max(end(Qi))}, then \code{Loffset(x)[i]} is the number \code{L} of ranges at the \emph{head} of \code{Si} that are strictly to the left of all the ranges in \code{Qi} i.e. \code{L} is the greatest value such that \code{end(Si)[k] < q1 - 1} for all \code{k} in \code{seq_len(L)}. Similarly, \code{Roffset(x)[i]} is the number \code{R} of ranges at the \emph{tail} of \code{Si} that are strictly to the right of all the ranges in \code{Qi} i.e. \code{R} is the greatest value such that \code{start(Si)[length(Si) + 1 - k] > q2 + 1} for all \code{k} in \code{seq_len(L)}. } \item{}{ \code{encoding(x)}: Factor of the same length as \code{x} where the i-th element is the encoding obtained by comparing each range in \code{Qi} with all the ranges in \code{tSi = Si[(1+L):(length(Si)-R)]} (\code{tSi} stands for "trimmed Si"). More precisely, here is how this encoding is obtained: \enumerate{ \item All the ranges in \code{Qi} are compared with \code{tSi[1]}, then with \code{tSi[2]}, etc... At each step (one step per range in \code{tSi}), comparing all the ranges in \code{Qi} with \code{tSi[k]} is done with \code{rangeComparisonCodeToLetter(compare(Qi, tSi[k]))}. So at each step, we end up with a vector of \code{M} single letters (where \code{M} is \code{length(Qi)}). \item Each vector obtained previously (1 vector per range in \code{tSi}, all of them of length \code{M}) is turned into a single string (called "encoding block") by pasting its individual letters together. \item All the encoding blocks (1 per range in \code{tSi}) are pasted together into a single long string and separated by colons (\code{":"}). An additional colon is prepended to the long string and another one appended to it. \item Finally, a special block containing the value of \code{M} is prepended to the long string. The final string is the encoding. } } \item{}{ \code{levels(x)}: Equivalent to \code{levels(encoding(x))}. } \item{}{ \code{flippedQuery(x)}: Whether or not the top-level element in query used for computing the encoding was "flipped" before the encoding was computed. Note that this flipping generally affects the "left offset", "right offset", in addition to the encoding itself. } } } \section{Coercing an OverlapEncodings object}{ In the following code snippets, \code{x} is an OverlapEncodings object. \describe{ \item{}{ \code{as.data.frame(x)}: Return \code{x} as a data frame with columns \code{"Loffset"}, \code{"Roffset"} and \code{"encoding"}. } } } \section{Low-level encoding utilities}{ In the following code snippets, \code{x} can be an OverlapEncodings object, or a character vector or factor containing encodings. \describe{ \item{}{ \code{encodingHalves(x, single.end.on.left=FALSE, single.end.on.right=FALSE, as.factors=FALSE)}: Extract the 2 halves of paired-end encodings and return them as a list of 2 character vectors (or 2 factors) parallel to the input. Paired-end encodings are obtained by encoding paired-end overlaps i.e. overlaps between paired-end reads and transcripts (typically). The difference between a single-end encoding and a paired-end encoding is that all the blocks in the latter contain a \code{"--"} separator to mark the separation between the "left encoding" and the "right encoding". See examples below and the "Overlap encodings" vignette located in this package for examples of paired-end encodings. } \item{}{ \code{Lencoding(x, ...)}, \code{Rencoding(x, ...)}: Extract the "left encodings" and "right encodings" of paired-end encodings. Equivalent to \code{encodingHalves(x, ...)[[1]]} and \code{encodingHalves(x, ...)[[2]]}, respectively. } \item{}{ \code{njunc(x)}, \code{Lnjunc(x, single.end.on.left=FALSE)}, \code{Rnjunc(x, single.end.on.right=FALSE)}: Extract the number of junctions in each encoding by looking at their first block (aka special block). If an element \code{xi} in \code{x} is a paired-end encoding, then \code{Lnjunc(xi)}, \code{Rnjunc(xi)}, and \code{njunc(xi)}, return \code{njunc(Lencoding(xi))}, \code{njunc(Rencoding(xi))}, and \code{Lnjunc(xi) + Rnjunc(xi)}, respectively. } \item{}{ \code{isCompatibleWithSplicing(x)}: Returns a logical vector \emph{parallel} to \code{x} indicating whether the corresponding encoding describes a \emph{splice compatible} overlap i.e. an overlap that is compatible with the splicing of the transcript. WARNING: For paired-end encodings, \code{isCompatibleWithSplicing} considers that the encoding is \emph{splice compatible} if its 2 halves are \emph{splice compatible}. This can produce false positives if for example the right end of the alignment is located upstream of the left end in transcript space. The paired-end read could not come from this transcript. To eliminate these false positives, one would need to have access and look at the position of the left and right ends in transcript space. This can be done with \code{\link{extractQueryStartInTranscript}}. } } } \author{Hervé Pagès} \seealso{ \itemize{ \item The "OverlapEncodings" vignette in this package. \item The \code{\link{encodeOverlaps}} function for computing "overlap encodings". \item The \code{\link[IRanges]{pcompare}} function in the \pkg{IRanges} package for the interpretation of the strings returned by \code{encoding}. \item The \link[GenomicRanges]{GRangesList} class defined and documented in the \pkg{GenomicRanges} package. } } \examples{ ## --------------------------------------------------------------------- ## A. BASIC MANIPULATION OF AN OverlapEncodings OBJECT ## --------------------------------------------------------------------- example(encodeOverlaps) # to generate the 'ovenc' object length(ovenc) Loffset(ovenc) Roffset(ovenc) encoding(ovenc) levels(ovenc) nlevels(ovenc) flippedQuery(ovenc) njunc(ovenc) as.data.frame(ovenc) njunc(levels(ovenc)) ## --------------------------------------------------------------------- ## B. WORKING WITH PAIRED-END ENCODINGS (POSSIBLY MIXED WITH SINGLE-END ## ENCODINGS) ## --------------------------------------------------------------------- encodings <- c("4:jmmm:agmm:aagm:aaaf:", "3--1:jmm--b:agm--i:") encodingHalves(encodings) encodingHalves(encodings, single.end.on.left=TRUE) encodingHalves(encodings, single.end.on.right=TRUE) encodingHalves(encodings, single.end.on.left=TRUE, single.end.on.right=TRUE) Lencoding(encodings) Lencoding(encodings, single.end.on.left=TRUE) Rencoding(encodings) Rencoding(encodings, single.end.on.right=TRUE) njunc(encodings) Lnjunc(encodings) Lnjunc(encodings, single.end.on.left=TRUE) Rnjunc(encodings) Rnjunc(encodings, single.end.on.right=TRUE) ## --------------------------------------------------------------------- ## C. DETECTION OF "SPLICE COMPATIBLE" OVERLAPS ## --------------------------------------------------------------------- ## Reads that are compatible with the splicing of the transcript can ## be detected with a regular expression (the regular expression below ## assumes that reads have at most 2 junctions): regex0 <- "(:[fgij]:|:[jg].:.[gf]:|:[jg]..:.g.:..[gf]:)" grepl(regex0, encoding(ovenc)) # read4 is NOT "compatible" ## This was for illustration purpose only. In practise you don't need ## (and should not) use this regular expression, but use instead the ## isCompatibleWithSplicing() utility function: isCompatibleWithSplicing(ovenc) } \keyword{methods} \keyword{classes} GenomicAlignments/man/cigar-utils.Rd0000644000175400017540000004420313175714431020501 0ustar00biocbuildbiocbuild\name{cigar-utils} \alias{cigar-utils} \alias{validCigar} \alias{CIGAR_OPS} \alias{explodeCigarOps} \alias{explodeCigarOpLengths} \alias{cigarToRleList} \alias{cigarOpTable} \alias{cigarRangesAlongReferenceSpace} \alias{cigarRangesAlongQuerySpace} \alias{cigarRangesAlongPairwiseSpace} \alias{extractAlignmentRangesOnReference} \alias{cigarWidthAlongReferenceSpace} \alias{cigarWidthAlongQuerySpace} \alias{cigarWidthAlongPairwiseSpace} \alias{cigarNarrow} \alias{cigarQNarrow} \alias{queryLoc2refLoc} \alias{queryLocs2refLocs} \title{ CIGAR utility functions } \description{ Utility functions for low-level CIGAR manipulation. } \usage{ ## -=-= Supported CIGAR operations =-=- CIGAR_OPS ## -=-= Transform CIGARs into other useful representations =-=- explodeCigarOps(cigar, ops=CIGAR_OPS) explodeCigarOpLengths(cigar, ops=CIGAR_OPS) cigarToRleList(cigar) ## -=-= Summarize CIGARs =-=- cigarOpTable(cigar) ## -=-= From CIGARs to ranges =-=- cigarRangesAlongReferenceSpace(cigar, flag=NULL, N.regions.removed=FALSE, pos=1L, f=NULL, ops=CIGAR_OPS, drop.empty.ranges=FALSE, reduce.ranges=FALSE, with.ops=FALSE) cigarRangesAlongQuerySpace(cigar, flag=NULL, before.hard.clipping=FALSE, after.soft.clipping=FALSE, ops=CIGAR_OPS, drop.empty.ranges=FALSE, reduce.ranges=FALSE, with.ops=FALSE) cigarRangesAlongPairwiseSpace(cigar, flag=NULL, N.regions.removed=FALSE, dense=FALSE, ops=CIGAR_OPS, drop.empty.ranges=FALSE, reduce.ranges=FALSE, with.ops=FALSE) extractAlignmentRangesOnReference(cigar, pos=1L, drop.D.ranges=FALSE, f=NULL) ## -=-= From CIGARs to sequence lengths =-=- cigarWidthAlongReferenceSpace(cigar, flag=NULL, N.regions.removed=FALSE) cigarWidthAlongQuerySpace(cigar, flag=NULL, before.hard.clipping=FALSE, after.soft.clipping=FALSE) cigarWidthAlongPairwiseSpace(cigar, flag=NULL, N.regions.removed=FALSE, dense=FALSE) ## -=-= Narrow CIGARs =-=- cigarNarrow(cigar, start=NA, end=NA, width=NA) cigarQNarrow(cigar, start=NA, end=NA, width=NA) ## -=-= Translate coordinates between query and reference spaces =-=- queryLoc2refLoc(qloc, cigar, pos=1L) queryLocs2refLocs(qlocs, cigar, pos=1L, flag=NULL) } \arguments{ \item{cigar}{ A character vector or factor containing the extended CIGAR strings. It can be of arbitrary length except for \code{queryLoc2refLoc} which only accepts a single CIGAR (as a character vector or factor of length 1). } \item{ops}{ Character vector containing the extended CIGAR operations to actually consider. Zero-length operations or operations not listed \code{ops} are ignored. } \item{flag}{ \code{NULL} or an integer vector containing the SAM flag for each read. According to the SAM Spec v1.4, flag bit 0x4 is the only reliable place to tell whether a segment (or read) is mapped (bit is 0) or not (bit is 1). If \code{flag} is supplied, then \code{cigarRangesAlongReferenceSpace}, \code{cigarRangesAlongQuerySpace}, \code{cigarRangesAlongPairwiseSpace}, and \code{extractAlignmentRangesOnReference} don't produce any range for unmapped reads i.e. they treat them as if their CIGAR was empty (independently of what their CIGAR is). If \code{flag} is supplied, then \code{cigarWidthAlongReferenceSpace}, \code{cigarWidthAlongQuerySpace}, and \code{cigarWidthAlongPairwiseSpace} return \code{NA}s for unmapped reads. } \item{N.regions.removed}{ \code{TRUE} or \code{FALSE}. If \code{TRUE}, then \code{cigarRangesAlongReferenceSpace} and \code{cigarWidthAlongReferenceSpace} report ranges/widths with respect to the "reference" space from which the N regions have been removed, and \code{cigarRangesAlongPairwiseSpace} and \code{cigarWidthAlongPairwiseSpace} report them with respect to the "pairwise" space from which the N regions have been removed. } \item{pos}{ An integer vector containing the 1-based leftmost position/coordinate for each (eventually clipped) read sequence. Must have length 1 (in which case it's recycled to the length of \code{cigar}), or the same length as \code{cigar}. } \item{f}{ \code{NULL} or a factor of length \code{cigar}. If \code{NULL}, then the ranges are grouped by alignment i.e. the returned \link[IRanges]{IRangesList} object has 1 list element per element in \code{cigar}. Otherwise they are grouped by factor level i.e. the returned \link[IRanges]{IRangesList} object has 1 list element per level in \code{f} and is named with those levels. For example, if \code{f} is a factor containing the chromosome for each read, then the returned \link[IRanges]{IRangesList} object will have 1 list element per chromosome and each list element will contain all the ranges on that chromosome. } \item{drop.empty.ranges}{ Should empty ranges be dropped? } \item{reduce.ranges}{ Should adjacent ranges coming from the same cigar be merged or not? Using \code{TRUE} can significantly reduce the size of the returned object. } \item{with.ops}{ \code{TRUE} or \code{FALSE} indicating whether the returned ranges should be named with their corresponding CIGAR operation. } \item{before.hard.clipping}{ \code{TRUE} or \code{FALSE}. If \code{TRUE}, then \code{cigarRangesAlongQuerySpace} and \code{cigarWidthAlongQuerySpace} report ranges/widths with respect to the "query" space to which the H regions have been added. \code{before.hard.clipping} and \code{after.soft.clipping} cannot both be \code{TRUE}. } \item{after.soft.clipping}{ \code{TRUE} or \code{FALSE}. If \code{TRUE}, then \code{cigarRangesAlongQuerySpace} and \code{cigarWidthAlongQuerySpace} report ranges/widths with respect to the "query" space from which the S regions have been removed. \code{before.hard.clipping} and \code{after.soft.clipping} cannot both be \code{TRUE}. } \item{dense}{ \code{TRUE} or \code{FALSE}. If \code{TRUE}, then \code{cigarRangesAlongPairwiseSpace} and \code{cigarWidthAlongPairwiseSpace} report ranges/widths with respect to the "pairwise" space from which the I, D, and N regions have been removed. \code{N.regions.removed} and \code{dense} cannot both be \code{TRUE}. } \item{drop.D.ranges}{ Should the ranges corresponding to a deletion from the reference (encoded with a D in the CIGAR) be dropped? By default we keep them to be consistent with the pileup tool from SAMtools. Note that, when \code{drop.D.ranges} is \code{TRUE}, then Ds and Ns in the CIGAR are equivalent. } \item{start,end,width}{ Vectors of integers. NAs and negative values are accepted and "solved" according to the rules of the SEW (Start/End/Width) interface (see \code{?\link[IRanges]{solveUserSEW}} for the details). } \item{qloc}{ An integer vector containing "query-based locations" i.e. 1-based locations relative to the query sequence stored in the SAM/BAM file. } \item{qlocs}{ A list of the same length as \code{cigar} where each element is an integer vector containing "query-based locations" i.e. 1-based locations relative to the corresponding query sequence stored in the SAM/BAM file. } } \value{ \code{CIGAR_OPS} is a predefined character vector containing the supported extended CIGAR operations: M, I, D, N, S, H, P, =, X. See p. 4 of the SAM Spec v1.4 at \url{http://samtools.sourceforge.net/} for the list of extended CIGAR operations and their meanings. For \code{explodeCigarOps} and \code{explodeCigarOpLengths}: Both functions return a list of the same length as \code{cigar} where each list element is a character vector (for \code{explodeCigarOps}) or an integer vector (for \code{explodeCigarOpLengths}). The 2 lists have the same shape, that is, same \code{length()} and same \code{elementNROWS()}. The i-th character vector in the list returned by \code{explodeCigarOps} contains one single-letter string per CIGAR operation in \code{cigar[i]}. The i-th integer vector in the list returned by \code{explodeCigarOpLengths} contains the corresponding CIGAR operation lengths. Zero-length operations or operations not listed in \code{ops} are ignored. For \code{cigarToRleList}: A \link[IRanges]{CompressedRleList} object. For \code{cigarOpTable}: An integer matrix with number of rows equal to the length of \code{cigar} and nine columns, one for each extended CIGAR operation. For \code{cigarRangesAlongReferenceSpace}, \code{cigarRangesAlongQuerySpace}, \code{cigarRangesAlongPairwiseSpace}, and \code{extractAlignmentRangesOnReference}: An \link[IRanges]{IRangesList} object (more precisely a \link[IRanges]{CompressedIRangesList} object) with 1 list element per element in \code{cigar}. However, if \code{f} is a factor, then the returned \link[IRanges]{IRangesList} object can be a \link[IRanges]{SimpleIRangesList} object (instead of \link[IRanges]{CompressedIRangesList}), and in that case, has 1 list element per level in \code{f} and is named with those levels. For \code{cigarWidthAlongReferenceSpace} and \code{cigarWidthAlongPairwiseSpace}: An integer vector of the same length as \code{cigar} where each element is the width of the alignment with respect to the "reference" and "pairwise" space, respectively. More precisely, for \code{cigarWidthAlongReferenceSpace}, the returned widths are the lengths of the alignments on the reference, N gaps included (except if \code{N.regions.removed} is \code{TRUE}). NAs or \code{"*"} in \code{cigar} will produce NAs in the returned vector. For \code{cigarWidthAlongQuerySpace}: An integer vector of the same length as \code{cigar} where each element is the length of the corresponding query sequence as inferred from the CIGAR string. Note that, by default (i.e. if \code{before.hard.clipping} and \code{after.soft.clipping} are \code{FALSE}), this is the length of the query sequence stored in the SAM/BAM file. If \code{before.hard.clipping} or \code{after.soft.clipping} is \code{TRUE}, the returned widths are the lengths of the query sequences before hard clipping or after soft clipping. NAs or \code{"*"} in \code{cigar} will produce NAs in the returned vector. For \code{cigarNarrow} and \code{cigarQNarrow}: A character vector of the same length as \code{cigar} containing the narrowed cigars. In addition the vector has an "rshift" attribute which is an integer vector of the same length as \code{cigar}. It contains the values that would need to be added to the POS field of a SAM/BAM file as a consequence of this cigar narrowing. For \code{queryLoc2refLoc}: An integer vector of the same length as \code{qloc} containing the "reference-based locations" (i.e. the 1-based locations relative to the reference sequence) corresponding to the "query-based locations" passed in \code{qloc}. For \code{queryLocs2refLocs}: A list of the same length as \code{qlocs} where each element is an integer vector containing the "reference-based locations" corresponding to the "query-based locations" passed in the corresponding element in \code{qlocs}. } \references{ \url{http://samtools.sourceforge.net/} } \author{Hervé Pagès & P. Aboyoun} \seealso{ \itemize{ \item The \link[GenomicAlignments]{sequenceLayer} function in the \pkg{GenomicAlignments} package for laying the query sequences alongside the "reference" or "pairwise" spaces. \item The \link{GAlignments} container for storing a set of genomic alignments. \item The \link[IRanges]{IRanges}, \link[IRanges]{IRangesList}, and \link[IRanges]{RleList} classes in the \pkg{IRanges} package. \item The \code{\link[IRanges]{coverage}} generic and methods for computing the coverage across a set of ranges or genomic ranges. } } \examples{ ## --------------------------------------------------------------------- ## A. CIGAR_OPS, explodeCigarOps(), explodeCigarOpLengths(), ## cigarToRleList(), and cigarOpTable() ## --------------------------------------------------------------------- ## Supported CIGAR operations: CIGAR_OPS ## Transform CIGARs into other useful representations: cigar1 <- "3H15M55N4M2I6M2D5M6S" cigar2 <- c("40M2I9M", cigar1, "2S10M2000N15M", "3H33M5H") explodeCigarOps(cigar2) explodeCigarOpLengths(cigar2) explodeCigarOpLengths(cigar2, ops=c("I", "S")) cigarToRleList(cigar2) ## Summarize CIGARs: cigarOpTable(cigar2) ## --------------------------------------------------------------------- ## B. From CIGARs to ranges and to sequence lengths ## --------------------------------------------------------------------- ## CIGAR ranges along the "reference" space: cigarRangesAlongReferenceSpace(cigar1, with.ops=TRUE)[[1]] cigarRangesAlongReferenceSpace(cigar1, reduce.ranges=TRUE, with.ops=TRUE)[[1]] ops <- setdiff(CIGAR_OPS, "N") cigarRangesAlongReferenceSpace(cigar1, ops=ops, with.ops=TRUE)[[1]] cigarRangesAlongReferenceSpace(cigar1, ops=ops, reduce.ranges=TRUE, with.ops=TRUE)[[1]] ops <- setdiff(CIGAR_OPS, c("D", "N")) cigarRangesAlongReferenceSpace(cigar1, ops=ops, with.ops=TRUE)[[1]] cigarWidthAlongReferenceSpace(cigar1) pos2 <- c(1, 1001, 1, 351) cigarRangesAlongReferenceSpace(cigar2, pos=pos2, with.ops=TRUE) res1a <- extractAlignmentRangesOnReference(cigar2, pos=pos2) res1b <- cigarRangesAlongReferenceSpace(cigar2, pos=pos2, ops=setdiff(CIGAR_OPS, "N"), reduce.ranges=TRUE) stopifnot(identical(res1a, res1b)) res2a <- extractAlignmentRangesOnReference(cigar2, pos=pos2, drop.D.ranges=TRUE) res2b <- cigarRangesAlongReferenceSpace(cigar2, pos=pos2, ops=setdiff(CIGAR_OPS, c("D", "N")), reduce.ranges=TRUE) stopifnot(identical(res2a, res2b)) seqnames <- factor(c("chr6", "chr6", "chr2", "chr6"), levels=c("chr2", "chr6")) extractAlignmentRangesOnReference(cigar2, pos=pos2, f=seqnames) ## CIGAR ranges along the "query" space: cigarRangesAlongQuerySpace(cigar2, with.ops=TRUE) cigarWidthAlongQuerySpace(cigar1) cigarWidthAlongQuerySpace(cigar1, before.hard.clipping=TRUE) ## CIGAR ranges along the "pairwise" space: cigarRangesAlongPairwiseSpace(cigar2, with.ops=TRUE) cigarRangesAlongPairwiseSpace(cigar2, dense=TRUE, with.ops=TRUE) ## --------------------------------------------------------------------- ## C. COMPUTE THE COVERAGE OF THE READS STORED IN A BAM FILE ## --------------------------------------------------------------------- ## The information stored in a BAM file can be used to compute the ## "coverage" of the mapped reads i.e. the number of reads that hit any ## given position in the reference genome. ## The following function takes the path to a BAM file and returns an ## object representing the coverage of the mapped reads that are stored ## in the file. The returned object is an RleList object named with the ## names of the reference sequences that actually receive some coverage. flag0 <- scanBamFlag(isUnmappedQuery=FALSE, isDuplicate=FALSE) extractCoverageFromBAM <- function(bamfile) { stopifnot(is(bamfile, "BamFile")) ## This ScanBamParam object allows us to load only the necessary ## information from the file. param <- ScanBamParam(flag=flag0, what=c("rname", "pos", "cigar")) bam <- scanBam(bamfile, param=param)[[1]] ## Note that unmapped reads and reads that are PCR/optical duplicates ## have already been filtered out by using the ScanBamParam object ## above. f <- factor(bam$rname, levels=seqlevels(bamfile)) irl <- extractAlignmentRangesOnReference(bam$cigar, pos=bam$pos, f=f) coverage(irl, width=seqlengths(bamfile)) } library(Rsamtools) f1 <- system.file("extdata", "ex1.bam", package="Rsamtools") cvg <- extractCoverageFromBAM(BamFile(f1)) ## extractCoverageFromBAM() is equivalent but slightly more efficient ## than loading a GAlignments object and computing its coverage: cvg2 <- coverage(readGAlignments(f1, param=ScanBamParam(flag=flag0))) stopifnot(identical(cvg, cvg2)) ## --------------------------------------------------------------------- ## D. cigarNarrow() and cigarQNarrow() ## --------------------------------------------------------------------- ## cigarNarrow(): cigarNarrow(cigar1) # only drops the soft/hard clipping cigarNarrow(cigar1, start=10) cigarNarrow(cigar1, start=15) cigarNarrow(cigar1, start=15, width=57) cigarNarrow(cigar1, start=16) #cigarNarrow(cigar1, start=16, width=55) # ERROR! (empty cigar) cigarNarrow(cigar1, start=71) cigarNarrow(cigar1, start=72) cigarNarrow(cigar1, start=75) ## cigarQNarrow(): cigarQNarrow(cigar1, start=4, end=-3) cigarQNarrow(cigar1, start=10) cigarQNarrow(cigar1, start=19) cigarQNarrow(cigar1, start=24) ## --------------------------------------------------------------------- ## E. PERFORMANCE ## --------------------------------------------------------------------- if (interactive()) { ## We simulate 20 millions aligned reads, all 40-mers. 95% of them ## align with no indels. 5% align with a big deletion in the ## reference. In the context of an RNAseq experiment, those 5% would ## be suspected to be "junction reads". set.seed(123) nreads <- 20000000L njunctionreads <- nreads * 5L / 100L cigar3 <- character(nreads) cigar3[] <- "40M" junctioncigars <- paste( paste(10:30, "M", sep=""), paste(sample(80:8000, njunctionreads, replace=TRUE), "N", sep=""), paste(30:10, "M", sep=""), sep="") cigar3[sample(nreads, njunctionreads)] <- junctioncigars some_fake_rnames <- paste("chr", c(1:6, "X"), sep="") rname <- factor(sample(some_fake_rnames, nreads, replace=TRUE), levels=some_fake_rnames) pos <- sample(80000000L, nreads, replace=TRUE) ## The following takes < 3 sec. to complete: system.time(irl1 <- extractAlignmentRangesOnReference(cigar3, pos=pos)) ## The following takes < 4 sec. to complete: system.time(irl2 <- extractAlignmentRangesOnReference(cigar3, pos=pos, f=rname)) ## The sizes of the resulting objects are about 240M and 160M, ## respectively: object.size(irl1) object.size(irl2) } } \keyword{manip} GenomicAlignments/man/coordinate-mapping-methods.Rd0000644000175400017540000002703713175714431023505 0ustar00biocbuildbiocbuild\name{mapToAlignments} \alias{coordinate-mapping-methods} \alias{mapToAlignments} \alias{mapToAlignments,Ranges,GAlignments-method} \alias{mapToAlignments,GenomicRanges,GAlignments-method} \alias{pmapToAlignments} \alias{pmapToAlignments,Ranges,GAlignments-method} \alias{pmapToAlignments,GenomicRanges,GAlignments-method} \alias{mapFromAlignments} \alias{mapFromAlignments,Ranges,GAlignments-method} \alias{mapFromAlignments,GenomicRanges,GAlignments-method} \alias{pmapFromAlignments} \alias{pmapFromAlignments,Ranges,GAlignments-method} \alias{pmapFromAlignments,GenomicRanges,GAlignments-method} \title{Map range coordinates between reads and genome space using CIGAR alignments} \description{ Map range coordinates between reads (local) and genome (reference) space using the CIGAR in a \code{GAlignments} object. See \code{?\link[GenomicFeatures]{mapToTranscripts}} in the \pkg{GenomicRanges} package for mapping coordinates between features in the transcriptome and genome space. } \usage{ \S4method{mapToAlignments}{GenomicRanges,GAlignments}(x, alignments, ...) \S4method{pmapToAlignments}{GenomicRanges,GAlignments}(x, alignments, ...) \S4method{mapFromAlignments}{GenomicRanges,GAlignments}(x, alignments, ...) \S4method{pmapFromAlignments}{GenomicRanges,GAlignments}(x, alignments, ...) } \arguments{ \item{x}{ \code{\linkS4class{GenomicRanges}} object of positions to be mapped. \code{x} must have names when mapping to the genome. } \item{alignments}{ A \code{\linkS4class{GAlignments}} object that represents the alignment of \code{x} to the genome. The \code{aligments} object must have names. When mapping to the genome names are used to determine mapping pairs and in the reverse direction they are used as the seqlevels of the output object. } \item{\dots}{ Arguments passed to other methods. } } \details{ These methods use a \code{GAlignments} object to represent the alignment between the ranges in \code{x} and the output. The following CIGAR operations in the "Extended CIGAR format" are used in the mapping algorithm: \itemize{ \item{M, X, =} Sequence match or mismatch \item{I} Insertion to the reference \item{D} Deletion from the reference \item{N} Skipped region from the reference \item{S} Soft clip on the read \item{H} Hard clip on the read \item{P} Silent deletion from the padded reference } \itemize{ \item{\code{mapToAlignments}, \code{pmapToAlignments}}{ The CIGAR is used to map the genomic (reference) position \code{x} to local coordinates. The mapped position starts at \preformatted{ start(x) - start(alignments) + 1 } and is incremented or decremented as the algorithm walks the length of the CIGAR. A successful mapping in this direction requires that \code{x} fall within \code{alignments}. The seqlevels of the return object are taken from the \code{alignments} object and will be a name descriptive of the read or aligned region. In this direction, mapping is attempted between all elements of \code{x} and all elements of \code{alignments}. } \item{\code{mapFromAlignments}, \code{pmapFromAlignments}}{ The CIGAR is used to map the local position \code{x} to genomic (reference) coordinates. The mapped position starts at \preformatted{ start(x) + start(alignments) - 1 } and is incremented or decremented as the algorithm walks the length of the CIGAR. A successful mapping in this direction requires that the width of \code{alignments} is <= the width of \code{x}. When mapping to the genome, name matching is used to determine the mapping pairs (vs attempting to match all possible pairs). Ranges in \code{x} are only mapped to ranges in \code{alignments} with the same name. Name matching is motivated by use cases such as differentially expressed regions where the expressed regions in \code{x} would only be related to a subset of regions in \code{alignments}, which may contains gene or transcript ranges. } \item{element-wise versions}{ \code{pmapToAlignments} and \code{pmapFromAlignments} are element-wise (aka `parallel`) versions of \code{mapToAlignments} and \code{mapFromAlignments}. The i-th range in \code{x} is mapped to the i-th range in \code{alignments}; \code{x} and \code{alignments} must have the same length. Ranges in \code{x} that do not map (out of bounds) are returned as zero-width ranges starting at 0. These ranges are given the special seqname of "UNMAPPED". Note the non-parallel methods do not return unmapped ranges so the "UNMAPPED" seqname is unique to \code{pmapToAlignments} and \code{pmapFromAlignments}. } \item{strand}{ By SAM convention, the CIGAR string is reported for mapped reads on the forward genomic strand. There is no need to consider strand in these methods. The output of these methods will always be unstranded (i.e., "*"). } } } \value{ An object the same class as \code{x}. Parallel methods return an object the same shape as \code{x}. Ranges that cannot be mapped (out of bounds) are returned as zero-width ranges starting at 0 with a seqname of "UNMAPPED". Non-parallel methods return an object that varies in length similar to a Hits object. The result only contains mapped records, out of bound ranges are not returned. \code{xHits} and \code{alignmentsHits} metadata columns indicate the elements of \code{x} and \code{alignments} used in the mapping. When present, names from \code{x} are propagated to the output. When mapping locally, the seqlevels of the output are the names on the \code{alignment} object. When mapping globally, the output seqlevels are the seqlevels of \code{alignment} which are usually chromosome names. } \seealso{ \itemize{ \item \code{?\link[GenomicFeatures]{mapToTranscripts}} in the in the \pkg{GenomicFeatures} package for methods mapping between transcriptome and genome space. \item \url{http://samtools.sourceforge.net/} for a description of the Extended CIGAR format. } } \author{V. Obenchain, M. Lawrence and H. Pagès} \examples{ ## --------------------------------------------------------------------- ## A. Basic use ## --------------------------------------------------------------------- ## 1. Map to local space with mapToAlignments() ## --------------------------------------------------------------------- ## Mapping to local coordinates requires 'x' to be within 'alignments'. ## In this 'x', the second range is too long and can't be mapped. alignments <- GAlignments("chr1", 10L, "11M", strand("*"), names="read_A") x <- GRanges("chr1", IRanges(c(12, 12), width=c(6, 20))) mapToAlignments(x, alignments) ## The element-wise version of the function returns unmapped ranges ## as zero-width ranges with a seqlevel of "UNMAPPED": pmapToAlignments(x, c(alignments, alignments)) ## Mapping the same range through different alignments demonstrates ## how the CIGAR operations affect the outcome. ops <- c("no-op", "junction", "insertion", "deletion") x <- GRanges(rep("chr1", 4), IRanges(rep(12, 4), width=rep(6, 4), names=ops)) alignments <- GAlignments(rep("chr1", 4), rep(10L, 4), cigar = c("11M", "5M2N4M", "5M2I4M", "5M2D4M"), strand = strand(rep("*", 4)), names = paste0("region_", 1:4)) pmapToAlignments(x, alignments) ## 2. Map to genome space with mapFromAlignments() ## --------------------------------------------------------------------- ## One of the criteria when mapping to genomic coordinates is that the ## shifted 'x' range falls within 'alignments'. Here the first 'x' ## range has a shifted start value of 14 (5 + 10 - 1 = 14) with a width of ## 2 and so is successfully mapped. The second has a shifted start of 29 ## (20 + 10 - 1 = 29) which is outside the range of 'alignments'. x <- GRanges("chr1", IRanges(c(5, 20), width=2, names=rep("region_A", 2))) alignments <- GAlignments("chr1", 10L, "11M", strand("*"), names="region_A") mapFromAlignments(x, alignments) ## Another characteristic of mapping this direction is the name matching ## used to determine pairs. Mapping is only attempted between ranges in 'x' ## and 'alignments' with the same name. If we change the name of the first 'x' ## range, only the second will be mapped to 'alignment'. We know the second ## range fails to map so we get an empty result. names(x) <- c("region_B", "region_A") mapFromAlignments(x, alignments) ## CIGAR operations: insertions reduce the width of the output while ## junctions and deletions increase it. ops <- c("no-op", "junction", "insertion", "deletion") x <- GRanges(rep("chr1", 4), IRanges(rep(3, 4), width=rep(5, 4), names=ops)) alignments <- GAlignments(rep("chr1", 4), rep(10L, 4), cigar = c("11M", "5M2N4M", "5M2I4M", "5M2D4M"), strand = strand(rep("*", 4))) pmapFromAlignments(x, alignments) ## --------------------------------------------------------------------- ## B. TATA box motif: mapping from read -> genome -> transcript ## --------------------------------------------------------------------- ## The TATA box motif is a conserved DNA sequence in the core promoter ## region. Many eukaryotic genes have a TATA box located approximately ## 25-35 base pairs upstream of the transcription start site. The motif is ## the binding site of general transcription factors or histones and ## plays a key role in transcription. ## In this example, the position of the TATA box motif (if present) is ## located in the DNA sequence corresponding to read ranges. The local ## motif positions are mapped to genome coordinates and then mapped ## to gene features such as promoters regions. ## Load reads from chromosome 4 of D. melanogaster (dm3): library(pasillaBamSubset) fl <- untreated1_chr4() gal <- readGAlignments(fl) ## Extract DNA sequences corresponding to the read ranges: library(GenomicFeatures) library(BSgenome.Dmelanogaster.UCSC.dm3) dna <- extractTranscriptSeqs(BSgenome.Dmelanogaster.UCSC.dm3, grglist(gal)) ## Search for the consensus motif TATAAA in the sequences: box <- vmatchPattern("TATAAA", dna) ## Some sequences had more than one match: table(elementNROWS(box)) ## The element-wise function we'll use for mapping to genome coordinates ## requires the two input argument to have the same length. We need to ## replicate the read ranges to match the number of motifs found. ## Expand the read ranges to match motifs found: motif <- elementNROWS(box) != 0 alignments <- rep(gal[motif], elementNROWS(box)[motif]) ## We make the IRanges into a GRanges object so the seqlevels can ## propagate to the output. Seqlevels are needed in the last mapping step. readCoords <- GRanges(seqnames(alignments), unlist(box, use.names=FALSE)) ## Map the local position of the motif to genome coordinates: genomeCoords <- pmapFromAlignments(readCoords, alignments) genomeCoords ## We are interested in the location of the TATA box motifs in the ## promoter regions. To perform the mapping we need the promoter ranges ## as a GRanges or GRangesList. ## Extract promoter regions 50 bp upstream from the transcription start site: library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene promoters <- promoters(txdb, upstream=50, downstream=0) ## Map the genome coordinates to the promoters: names(promoters) <- mcols(promoters)$tx_name ## must be named mapToTranscripts(genomeCoords, promoters) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/coverage-methods.Rd0000644000175400017540000001273513175714431021517 0ustar00biocbuildbiocbuild\name{coverage-methods} \alias{coverage-methods} \alias{coverage} \alias{coverage,GAlignments-method} \alias{coverage,GAlignmentPairs-method} \alias{coverage,GAlignmentsList-method} \alias{coverage,BamFile-method} \alias{coverage,character-method} \title{Coverage of a GAlignments, GAlignmentPairs, or GAlignmentsList object} \description{ \code{\link[IRanges]{coverage}} methods for \link{GAlignments}, \link{GAlignmentPairs}, \link{GAlignmentsList}, and \link[Rsamtools]{BamFile} objects. NOTE: The \code{\link[IRanges]{coverage}} generic function and methods for \link[IRanges]{Ranges} and \link[IRanges]{RangesList} objects are defined and documented in the \pkg{IRanges} package. Methods for \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} objects are defined and documented in the \pkg{GenomicRanges} package. } \usage{ \S4method{coverage}{GAlignments}(x, shift=0L, width=NULL, weight=1L, method=c("auto", "sort", "hash"), drop.D.ranges=FALSE) \S4method{coverage}{GAlignmentPairs}(x, shift=0L, width=NULL, weight=1L, method=c("auto", "sort", "hash"), drop.D.ranges=FALSE) \S4method{coverage}{GAlignmentsList}(x, shift=0L, width=NULL, weight=1L, ...) \S4method{coverage}{BamFile}(x, shift=0L, width=NULL, weight=1L, ..., param=ScanBamParam()) \S4method{coverage}{character}(x, shift=0L, width=NULL, weight=1L, ..., yieldSize=2500000L) } \arguments{ \item{x}{ A \link{GAlignments}, \link{GAlignmentPairs}, \link{GAlignmentsList}, or \link[Rsamtools]{BamFile} object, or the path to a BAM file. } \item{shift, width, weight}{ See \code{coverage} method for \link[GenomicRanges]{GRanges} objects in the \pkg{GenomicRanges} package. } \item{method}{ See \code{?\link[IRanges]{coverage}} in the \pkg{IRanges} package for a description of this argument. } \item{drop.D.ranges}{ Whether the coverage calculation should ignore ranges corresponding to D (deletion) in the CIGAR string. } \item{...}{ Additional arguments passed to the \code{coverage} method for \link{GAlignments} objects. } \item{param}{ An optional \link[Rsamtools]{ScanBamParam} object passed to \code{\link{readGAlignments}}. } \item{yieldSize}{ An optional argument controlling how many records are input when iterating through a \link[Rsamtools]{BamFile}. } } \details{ The methods for \link{GAlignments} and \link{GAlignmentPairs} objects do: \preformatted{ coverage(grglist(x, drop.D.ranges=drop.D.ranges), ...) } The method for \link{GAlignmentsList} objects does: \preformatted{ coverage(unlist(x), ...) } The method for \link[Rsamtools]{BamFile} objects iterates through a BAM file, reading \code{yieldSize(x)} records (or all records, if \code{is.na(yieldSize(x))}) and calculating: \preformatted{ gal <- readGAlignments(x, param=param) coverage(gal, shift=shift, width=width, weight=weight, ...) } The method for \code{character} vectors of length 1 creates a \link[Rsamtools]{BamFile} object from \code{x} and performs the calculation for \code{coverage,BamFile-method}. } \value{ A named \link[IRanges]{RleList} object with one coverage vector per seqlevel in \code{x}. } \seealso{ \itemize{ \item \code{\link[IRanges]{coverage}} in the \pkg{IRanges} package. \item \link[GenomicRanges]{coverage-methods} in the \pkg{GenomicRanges} package. \item \link[IRanges]{RleList} objects in the \pkg{IRanges} package. \item \link{GAlignments} and \link{GAlignmentPairs} objects. \item \code{\link{readGAlignments}}. \item \link[Rsamtools]{BamFile} objects in the \pkg{Rsamtools} package. } } \examples{ ## --------------------------------------------------------------------- ## A. EXAMPLE WITH TOY DATA ## --------------------------------------------------------------------- ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") ## Coverage of a GAlignments object: gal <- readGAlignments(ex1_file) cvg1 <- coverage(gal) cvg1 ## Coverage of a GAlignmentPairs object: galp <- readGAlignmentPairs(ex1_file) cvg2 <- coverage(galp) cvg2 ## Coverage of a GAlignmentsList object: galist <- readGAlignmentsList(ex1_file) cvg3 <- coverage(galist) cvg3 table(mcols(galist)$mate_status) mated_idx <- which(mcols(galist)$mate_status == "mated") mated_galist <- galist[mated_idx] mated_cvg3 <- coverage(mated_galist) mated_cvg3 ## Sanity checks: stopifnot(identical(cvg1, cvg3)) stopifnot(identical( cvg2, mated_cvg3)) ## --------------------------------------------------------------------- ## B. EXAMPLE WITH REAL DATA ## --------------------------------------------------------------------- library(pasillaBamSubset) ## See '?pasillaBamSubset' for more information about the 2 BAM files ## included in this package. reads <- readGAlignments(untreated3_chr4()) table(njunc(reads)) # data contains junction reads ## Junctions do NOT contribute to the coverage: read1 <- reads[which(njunc(reads) != 0L)[1]] # 1st read with a junction read1 # cigar shows a "skipped region" of length 15306 grglist(read1)[[1]] # the junction is between pos 4500 and 19807 coverage(read1)$chr4 # junction is not covered ## Sanity checks: cvg <- coverage(reads) read_chunks <- unlist(grglist(reads), use.names=FALSE) read_chunks_per_chrom <- split(read_chunks, seqnames(read_chunks)) stopifnot(identical(sum(cvg), sum(width(read_chunks_per_chrom)))) galist <- readGAlignmentsList(untreated3_chr4()) stopifnot(identical(cvg, coverage(galist))) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/encodeOverlaps-methods.Rd0000644000175400017540000002125113175714431022666 0ustar00biocbuildbiocbuild\name{encodeOverlaps-methods} \alias{encodeOverlaps-methods} \alias{encodeOverlaps} \alias{encodeOverlaps,RangesList,RangesList-method} \alias{encodeOverlaps,RangesList,Ranges-method} \alias{encodeOverlaps,Ranges,RangesList-method} \alias{encodeOverlaps1} \alias{flipQuery} \alias{encodeOverlaps,GRangesList,GRangesList-method} \alias{selectEncodingWithCompatibleStrand} \alias{isCompatibleWithSkippedExons} \alias{isCompatibleWithSkippedExons,character-method} \alias{isCompatibleWithSkippedExons,factor-method} \alias{isCompatibleWithSkippedExons,OverlapEncodings-method} \alias{extractSteppedExonRanks} \alias{extractSteppedExonRanks,character-method} \alias{extractSteppedExonRanks,factor-method} \alias{extractSteppedExonRanks,OverlapEncodings-method} \alias{extractSpannedExonRanks} \alias{extractSpannedExonRanks,character-method} \alias{extractSpannedExonRanks,factor-method} \alias{extractSpannedExonRanks,OverlapEncodings-method} \alias{extractSkippedExonRanks} \alias{extractSkippedExonRanks,character-method} \alias{extractSkippedExonRanks,factor-method} \alias{extractSkippedExonRanks,OverlapEncodings-method} \alias{extractQueryStartInTranscript} \title{Encode the overlaps between RNA-seq reads and the transcripts of a gene model} \description{ In the context of an RNA-seq experiment, encoding the overlaps between the aligned reads and the transcripts of a given gene model can be used for detecting those overlaps that are \emph{compatible} with the splicing of the transcript. The central tool for this is the \code{encodeOverlaps} method for \link[GenomicRanges]{GRangesList} objects, which computes the "overlap encodings" between a \code{query} and a \code{subject}, both list-like objects with list elements containing multiple ranges. Other related utilities are also documented in this man page. } \usage{ encodeOverlaps(query, subject, hits=NULL, ...) \S4method{encodeOverlaps}{GRangesList,GRangesList}(query, subject, hits=NULL, flip.query.if.wrong.strand=FALSE) ## Related utilities: flipQuery(x, i) selectEncodingWithCompatibleStrand(ovencA, ovencB, query.strand, subject.strand, hits=NULL) isCompatibleWithSkippedExons(x, max.skipped.exons=NA) extractSteppedExonRanks(x, for.query.right.end=FALSE) extractSpannedExonRanks(x, for.query.right.end=FALSE) extractSkippedExonRanks(x, for.query.right.end=FALSE) extractQueryStartInTranscript(query, subject, hits=NULL, ovenc=NULL, flip.query.if.wrong.strand=FALSE, for.query.right.end=FALSE) } \arguments{ \item{query, subject}{ Typically \link[GenomicRanges]{GRangesList} objects representing the the aligned reads and the transcripts of a given gene model, respectively. If the 2 objects don't have the same length, and if the \code{hits} argument is not supplied, then the shortest is recycled to the length of the longest (the standard recycling rules apply). More generally speaking, \code{query} and \code{subject} must be list-like objects with list elements containing multiple ranges e.g. \link[IRanges]{RangesList} or \link[GenomicRanges]{GRangesList} objects. } \item{hits}{ An optional \link[S4Vectors]{Hits} object typically obtained from a previous call to \code{\link[IRanges]{findOverlaps}(query, subject)}. Strictly speaking, \code{hits} only needs to be compatible with \code{query} and \code{subject}, that is, \code{\link[S4Vectors]{queryLength}(hits)} and \code{\link[S4Vectors]{subjectLength}(hits)} must be equal to \code{length(query)} and \code{length(subject)}, respectively. Supplying \code{hits} is a convenient way to do \code{encodeOverlaps(query[queryHits(hits)], subject[subjectHits(hits)])}, that is, calling \code{encodeOverlaps(query, subject, hits)} is equivalent to the above, but is much more efficient, especially when \code{query} and/or \code{subject} are big. Of course, when \code{hits} is supplied, \code{query} and \code{subject} are not expected to have the same length anymore. } \item{...}{ Additional arguments for methods. } \item{flip.query.if.wrong.strand}{ See the "OverlapEncodings" vignette located in this package (\pkg{GenomicAlignments}). } \item{x}{ For \code{flipQuery}: a \link[GenomicRanges]{GRangesList} object. For \code{isCompatibleWithSkippedExons}, \code{extractSteppedExonRanks}, \code{extractSpannedExonRanks}, and \code{extractSkippedExonRanks}: an \link{OverlapEncodings} object, a factor, or a character vector. } \item{i}{ Subscript specifying the elements in \code{x} to flip. If missing, all the elements are flipped. } \item{ovencA, ovencB, ovenc}{ \link{OverlapEncodings} objects. } \item{query.strand, subject.strand}{ Vector-like objects containing the strand of the query and subject, respectively. } \item{max.skipped.exons}{ Not supported yet. If \code{NA} (the default), the number of skipped exons must be 1 or more (there is no max). } \item{for.query.right.end}{ If \code{TRUE}, then the information reported in the output is for the right ends of the paired-end reads. Using \code{for.query.right.end=TRUE} with single-end reads is an error. } } \details{ See \code{?OverlapEncodings} for a short introduction to "overlap encodings". The topic of working with overlap encodings is covered in details in the "OverlapEncodings" vignette located this package (\pkg{GenomicAlignments}) and accessible with \code{vignette("OverlapEncodings")}. } \value{ For \code{encodeOverlaps}: An \link{OverlapEncodings} object. If \code{hits} is not supplied, this object is \emph{parallel} to the longest of \code{query} and \code{subject}, that is, it has the length of the longest and the i-th encoding in it corresponds to the i-th element in the longest. If \code{hits} is supplied, then the returned object is \emph{parallel} to it, that is, it has one encoding per hit. For \code{flipQuery}: TODO For \code{selectEncodingWithCompatibleStrand}: TODO For \code{isCompatibleWithSkippedExons}: A logical vector \emph{parallel} to \code{x}. For \code{extractSteppedExonRanks}, \code{extractSpannedExonRanks}, and \code{extractSkippedExonRanks}: TODO For \code{extractQueryStartInTranscript}: TODO } \author{Hervé Pagès} \seealso{ \itemize{ \item The \link{OverlapEncodings} class for a brief introduction to "overlap encodings". \item The \link[S4Vectors]{Hits} class defined and documented in the \pkg{S4Vectors} package. \item The "OverlapEncodings" vignette in this package. \item \code{\link{findCompatibleOverlaps}} for a specialized version of \code{\link[IRanges]{findOverlaps}} that uses \code{encodeOverlaps} internally to keep only the hits where the junctions in the aligned read are \emph{compatible} with the splicing of the annotated transcript. \item The \link[GenomicRanges]{GRangesList} class defined and documented in the \pkg{GenomicRanges} package. \item The \code{\link[IRanges]{findOverlaps}} generic function defined in the \pkg{IRanges} package. } } \examples{ ## --------------------------------------------------------------------- ## A. BETWEEN 2 RangesList OBJECTS ## --------------------------------------------------------------------- ## In the context of an RNA-seq experiment, encoding the overlaps ## between 2 GRangesList objects, one containing the reads (the query), ## and one containing the transcripts (the subject), can be used for ## detecting hits between reads and transcripts that are "compatible" ## with the splicing of the transcript. Here we illustrate this with 2 ## RangesList objects, in order to keep things simple: ## 4 aligned reads in the query: read1 <- IRanges(c(7, 15, 22), c(9, 19, 23)) # 2 junctions read2 <- IRanges(c(5, 15), c(9, 17)) # 1 junction read3 <- IRanges(c(16, 22), c(19, 24)) # 1 junction read4 <- IRanges(c(16, 23), c(19, 24)) # 1 junction query <- IRangesList(read1, read2, read3, read4) ## 1 transcript in the subject: tx <- IRanges(c(1, 4, 15, 22, 38), c(2, 9, 19, 25, 47)) # 5 exons subject <- IRangesList(tx) ## Encode the overlaps: ovenc <- encodeOverlaps(query, subject) ovenc encoding(ovenc) ## --------------------------------------------------------------------- ## B. BETWEEN 2 GRangesList OBJECTS ## --------------------------------------------------------------------- ## With real RNA-seq data, the reads and transcripts will typically be ## stored in GRangesList objects. Please refer to the "OverlapEncodings" ## vignette in this package for realistic examples. } \keyword{methods} \keyword{utilities} GenomicAlignments/man/findCompatibleOverlaps-methods.Rd0000644000175400017540000000756513175714431024365 0ustar00biocbuildbiocbuild\name{findCompatibleOverlaps-methods} \alias{findCompatibleOverlaps-methods} \alias{findCompatibleOverlaps} \alias{findCompatibleOverlaps,GAlignments,GRangesList-method} \alias{findCompatibleOverlaps,GAlignmentPairs,GRangesList-method} \alias{countCompatibleOverlaps} \title{Finding hits between reads and transcripts that are \emph{compatible} with the splicing of the transcript} \description{ In the context of an RNA-seq experiment, \code{findCompatibleOverlaps} (or \code{countCompatibleOverlaps}) can be used for finding (or counting) hits between reads and transcripts that are \emph{compatible} with the splicing of the transcript. } \usage{ findCompatibleOverlaps(query, subject) countCompatibleOverlaps(query, subject) } \arguments{ \item{query}{ A \link{GAlignments} or \link{GAlignmentPairs} object representing the aligned reads. } \item{subject}{ A \link{GRangesList} object representing the transcripts. } } \details{ \code{findCompatibleOverlaps} is a specialized version of \code{\link[IRanges]{findOverlaps}} that uses \code{\link{encodeOverlaps}} internally to keep only the hits where the junctions in the aligned read are \emph{compatible} with the splicing of the annotated transcript. The topic of working with overlap encodings is covered in details in the "OverlapEncodings" vignette located this package (\pkg{GenomicAlignments}) and accessible with \code{vignette("OverlapEncodings")}. } \value{ A \link[S4Vectors]{Hits} object for \code{findCompatibleOverlaps}. An integer vector \emph{parallel} to (i.e. same length as) \code{query} for \code{countCompatibleOverlaps}. } \author{Hervé Pagès} \seealso{ \itemize{ \item The \code{\link[IRanges]{findOverlaps}} generic function defined in the \pkg{IRanges} package. \item The \code{\link{encodeOverlaps}} generic function and \link{OverlapEncodings} class. \item The "OverlapEncodings" vignette in this package. \item \link{GAlignments} and \link{GAlignmentPairs} objects. \item \link[GenomicRanges]{GRangesList} objects in the \pkg{GenomicRanges} package. } } \examples{ ## Here we only show a simple example illustrating the use of ## countCompatibleOverlaps() on a very small data set. Please ## refer to the "OverlapEncodings" vignette in the GenomicAlignments ## package for a comprehensive presentation of "overlap ## encodings" and related tools/concepts (e.g. "compatible" ## overlaps, "almost compatible" overlaps etc...), and for more ## examples. ## sm_treated1.bam contains a small subset of treated1.bam, a BAM ## file containing single-end reads from the "Pasilla" experiment ## (RNA-seq, Fly, see the pasilla data package for the details) ## and aligned to reference genome BDGP Release 5 (aka dm3 genome on ## the UCSC Genome Browser): sm_treated1 <- system.file("extdata", "sm_treated1.bam", package="GenomicAlignments", mustWork=TRUE) ## Load the alignments: flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) gal <- readGAlignments(sm_treated1, use.names=TRUE, param=param0) ## Load the transcripts (IMPORTANT: Like always, the reference genome ## of the transcripts must be *exactly* the same as the reference ## genome used to align the reads): library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene exbytx <- exonsBy(txdb, by="tx", use.names=TRUE) ## Number of "compatible" transcripts per alignment in 'gal': gal_ncomptx <- countCompatibleOverlaps(gal, exbytx) mcols(gal)$ncomptx <- gal_ncomptx table(gal_ncomptx) mean(gal_ncomptx >= 1) ## --> 33% of the alignments in 'gal' are "compatible" with at least ## 1 transcript in 'exbytx'. ## Keep only alignments compatible with at least 1 transcript in ## 'exbytx': compgal <- gal[gal_ncomptx >= 1] head(compgal) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/findMateAlignment.Rd0000644000175400017540000002615313175714431021650 0ustar00biocbuildbiocbuild\name{findMateAlignment} \alias{findMateAlignment} \alias{makeGAlignmentPairs} \alias{getDumpedAlignments} \alias{countDumpedAlignments} \alias{flushDumpedAlignments} \title{Pairing the elements of a GAlignments object} \description{ Utilities for pairing the elements of a \link{GAlignments} object. NOTE: Until BioC 2.13, \code{findMateAlignment} was the power horse used by \code{\link{readGAlignmentPairs}} for pairing the records loaded from a BAM file containing aligned paired-end reads. Starting with BioC 2.14, \code{\link{readGAlignmentPairs}} relies on \code{\link[Rsamtools]{scanBam}(BamFile(asMates=TRUE), ...)} for the pairing. } \usage{ findMateAlignment(x) makeGAlignmentPairs(x, use.names=FALSE, use.mcols=FALSE, strandMode=1) ## Related low-level utilities: getDumpedAlignments() countDumpedAlignments() flushDumpedAlignments() } \arguments{ \item{x}{ A named \link{GAlignments} object with metadata columns \code{flag}, \code{mrnm}, and \code{mpos}. Typically obtained by loading aligned paired-end reads from a BAM file with: \preformatted{ param <- ScanBamParam(what=c("flag", "mrnm", "mpos")) x <- readGAlignments(..., use.names=TRUE, param=param) } } \item{use.names}{ Whether the names on the input object should be propagated to the returned object or not. } \item{use.mcols}{ Names of the metadata columns to propagate to the returned \link{GAlignmentPairs} object. } \item{strandMode}{ Strand mode to set on the returned \link{GAlignmentPairs} object. See \code{?\link{strandMode}} for more information. } } \details{ \subsection{Pairing algorithm used by findMateAlignment}{ \code{findMateAlignment} is the power horse used by \code{makeGAlignmentPairs} for pairing the records loaded from a BAM file containing aligned paired-end reads. It implements the following pairing algorithm: \itemize{ \item First, only records with flag bit 0x1 (multiple segments) set to 1, flag bit 0x4 (segment unmapped) set to 0, and flag bit 0x8 (next segment in the template unmapped) set to 0, are candidates for pairing (see the SAM Spec for a description of flag bits and fields). \code{findMateAlignment} will ignore any other record. That is, records that correspond to single-end reads, or records that correspond to paired-end reads where one or both ends are unmapped, are discarded. \item Then the algorithm looks at the following fields and flag bits: \itemize{ \item (A) QNAME \item (B) RNAME, RNEXT \item (C) POS, PNEXT \item (D) Flag bits Ox10 (segment aligned to minus strand) and 0x20 (next segment aligned to minus strand) \item (E) Flag bits 0x40 (first segment in template) and 0x80 (last segment in template) \item (F) Flag bit 0x2 (proper pair) \item (G) Flag bit 0x100 (secondary alignment) } 2 records rec1 and rec2 are considered mates iff all the following conditions are satisfied: \itemize{ \item (A) QNAME(rec1) == QNAME(rec2) \item (B) RNEXT(rec1) == RNAME(rec2) and RNEXT(rec2) == RNAME(rec1) \item (C) PNEXT(rec1) == POS(rec2) and PNEXT(rec2) == POS(rec1) \item (D) Flag bit 0x20 of rec1 == Flag bit 0x10 of rec2 and Flag bit 0x20 of rec2 == Flag bit 0x10 of rec1 \item (E) rec1 corresponds to the first segment in the template and rec2 corresponds to the last segment in the template, OR, rec2 corresponds to the first segment in the template and rec1 corresponds to the last segment in the template \item (F) rec1 and rec2 have same flag bit 0x2 \item (G) rec1 and rec2 have same flag bit 0x100 } } } \subsection{Timing and memory requirement of the pairing algorithm}{ The estimated timings and memory requirements on a modern Linux system are (those numbers may vary depending on your hardware and OS): \preformatted{ nb of alignments | time | required memory -----------------+--------------+---------------- 8 millions | 28 sec | 1.4 GB 16 millions | 58 sec | 2.8 GB 32 millions | 2 min | 5.6 GB 64 millions | 4 min 30 sec | 11.2 GB } This is for a \link{GAlignments} object coming from a file with an "average nb of records per unique QNAME" of 2.04. A value of 2 (which means the file contains only primary reads) is optimal for the pairing algorithm. A greater value, say > 3, will significantly degrade its performance. An easy way to avoid this degradation is to load only primary alignments by setting the \code{isSecondaryAlignment} flag to \code{FALSE} in ScanBamParam(). See examples in \code{?\link{readGAlignmentPairs}} for how to do this. } \subsection{Ambiguous pairing}{ The above algorithm will find almost all pairs unambiguously, even when the same pair of reads maps to several places in the genome. Note that, when a given pair maps to a single place in the genome, looking at (A) is enough to pair the 2 corresponding records. The additional conditions (B), (C), (D), (E), (F), and (G), are only here to help in the situation where more than 2 records share the same QNAME. And that works most of the times. Unfortunately there are still situations where this is not enough to solve the pairing problem unambiguously. For example, here are 4 records (loaded in a GAlignments object) that cannot be paired with the above algorithm: Showing the 4 records as a GAlignments object of length 4: \preformatted{ GAlignments with 4 alignments and 2 metadata columns: seqnames strand cigar qwidth start end SRR031714.2658602 chr2R + 21M384N16M 37 6983850 6984270 SRR031714.2658602 chr2R + 21M384N16M 37 6983850 6984270 SRR031714.2658602 chr2R - 13M372N24M 37 6983858 6984266 SRR031714.2658602 chr2R - 13M378N24M 37 6983858 6984272 width njunc | mrnm mpos | SRR031714.2658602 421 1 | chr2R 6983858 SRR031714.2658602 421 1 | chr2R 6983858 SRR031714.2658602 409 1 | chr2R 6983850 SRR031714.2658602 415 1 | chr2R 6983850 } Note that the BAM fields show up in the following columns: \itemize{ \item QNAME: the names of the GAlignments object (unnamed col) \item RNAME: the seqnames col \item POS: the start col \item RNEXT: the mrnm col \item PNEXT: the mpos col } As you can see, the aligner has aligned the same pair to the same location twice! The only difference between the 2 aligned pairs is in the CIGAR i.e. one end of the pair is aligned twice to the same location with exactly the same CIGAR while the other end of the pair is aligned twice to the same location but with slightly different CIGARs. Now showing the corresponding flag bits: \preformatted{ isPaired isProperPair isUnmappedQuery hasUnmappedMate isMinusStrand [1,] 1 1 0 0 0 [2,] 1 1 0 0 0 [3,] 1 1 0 0 1 [4,] 1 1 0 0 1 isMateMinusStrand isFirstMateRead isSecondMateRead isSecondaryAlignment [1,] 1 0 1 0 [2,] 1 0 1 0 [3,] 0 1 0 0 [4,] 0 1 0 0 isNotPassingQualityControls isDuplicate [1,] 0 0 [2,] 0 0 [3,] 0 0 [4,] 0 0 } As you can see, rec(1) and rec(2) are second mates, rec(3) and rec(4) are both first mates. But looking at (A), (B), (C), (D), (E), (F), and (G), the pairs could be rec(1) <-> rec(3) and rec(2) <-> rec(4), or they could be rec(1) <-> rec(4) and rec(2) <-> rec(3). There is no way to disambiguate! So \code{findMateAlignment} is just ignoring (with a warning) those alignments with ambiguous pairing, and dumping them in a place from which they can be retrieved later (i.e. after \code{findMateAlignment} has returned) for further examination (see "Dumped alignments" subsection below for the details). In other words, alignments that cannot be paired unambiguously are not paired at all. Concretely, this means that \code{\link{readGAlignmentPairs}} is guaranteed to return a \link{GAlignmentPairs} object where every pair was formed in an non-ambiguous way. Note that, in practice, this approach doesn't seem to leave aside a lot of records because ambiguous pairing events seem pretty rare. } \subsection{Dumped alignments}{ Alignments with ambiguous pairing are dumped in a place ("the dump environment") from which they can be retrieved with \code{getDumpedAlignments()} after \code{findMateAlignment} has returned. Two additional utilities are provided for manipulation of the dumped alignments: \code{countDumpedAlignments} for counting them (a fast equivalent to \code{length(getDumpedAlignments())}), and \code{flushDumpedAlignments} to flush "the dump environment". Note that "the dump environment" is automatically flushed at the beginning of a call to \code{findMateAlignment}. } } \value{ For \code{findMateAlignment}: An integer vector of the same length as \code{x}, containing only positive or NA values, where the i-th element is interpreted as follow: \itemize{ \item An NA value means that no mate or more than 1 mate was found for \code{x[i]}. \item A non-NA value j gives the index in \code{x} of \code{x[i]}'s mate. } For \code{makeGAlignmentPairs}: A \link{GAlignmentPairs} object where the pairs are formed internally by calling \code{findMateAlignment} on \code{x}. For \code{getDumpedAlignments}: \code{NULL} or a \link{GAlignments} object containing the dumped alignments. See "Dumped alignments" subsection in the "Details" section above for the details. For \code{countDumpedAlignments}: The number of dumped alignments. Nothing for \code{flushDumpedAlignments}. } \author{Hervé Pagès} \seealso{ \itemize{ \item \link{GAlignments} and \link{GAlignmentPairs} objects. \item \code{\link{readGAlignments}} and \code{\link{readGAlignmentPairs}}. } } \examples{ bamfile <- system.file("extdata", "ex1.bam", package="Rsamtools", mustWork=TRUE) param <- ScanBamParam(what=c("flag", "mrnm", "mpos")) x <- readGAlignments(bamfile, use.names=TRUE, param=param) mate <- findMateAlignment(x) head(mate) table(is.na(mate)) galp0 <- makeGAlignmentPairs(x) galp <- makeGAlignmentPairs(x, use.name=TRUE, use.mcols="flag") galp colnames(mcols(galp)) colnames(mcols(first(galp))) colnames(mcols(last(galp))) } \keyword{manip} GenomicAlignments/man/findOverlaps-methods.Rd0000644000175400017540000001017313175714431022352 0ustar00biocbuildbiocbuild\name{findOverlaps-methods} \alias{findOverlaps-methods} \alias{findOverlaps} \alias{findOverlaps,GAlignments,Vector-method} \alias{findOverlaps,Vector,GAlignments-method} \alias{findOverlaps,GAlignments,GAlignments-method} \alias{findOverlaps,GAlignmentPairs,Vector-method} \alias{findOverlaps,Vector,GAlignmentPairs-method} \alias{findOverlaps,GAlignmentPairs,GAlignmentPairs-method} \alias{findOverlaps,GAlignmentsList,Vector-method} \alias{findOverlaps,Vector,GAlignmentsList-method} \alias{findOverlaps,GAlignmentsList,GAlignmentsList-method} \title{Finding overlapping genomic alignments} \description{ Finds range overlaps between a \link{GAlignments}, \link{GAlignmentPairs}, or \link{GAlignmentsList} object, and another range-based object. NOTE: The \code{\link[IRanges]{findOverlaps}} generic function and methods for \link[IRanges]{Ranges} and \link[IRanges]{RangesList} objects are defined and documented in the \pkg{IRanges} package. The methods for \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} objects are defined and documented in the \pkg{GenomicRanges} package. \link{GAlignments}, \link{GAlignmentPairs}, and \link{GAlignmentsList} objects also support \code{countOverlaps}, \code{overlapsAny}, and \code{subsetByOverlaps} thanks to the default methods defined in the \pkg{IRanges} package and to the \code{findOverlaps} method defined in this package and documented below. } \usage{ \S4method{findOverlaps}{GAlignments,GAlignments}(query, subject, maxgap=-1L, minoverlap=0L, type=c("any", "start", "end", "within"), select=c("all", "first", "last", "arbitrary"), ignore.strand=FALSE) } \arguments{ \item{query, subject}{ A \link{GAlignments}, \link{GAlignmentPairs}, or \link{GAlignmentsList} object for either \code{query} or \code{subject}. A vector-like object containing ranges for the other one. } \item{maxgap, minoverlap, type, select}{ See \code{?\link[IRanges]{findOverlaps}} in the \pkg{IRanges} package for a description of these arguments. } \item{ignore.strand}{ When set to \code{TRUE}, the strand information is ignored in the overlap calculations. } } \details{ When the query or the subject (or both) is a \link{GAlignments} object, it is first turned into a \link{GRangesList} object (with \code{as( , "GRangesList")}) and then the rules described previously apply. \link{GAlignmentsList} objects are coerced to \link{GAlignments} then to a \link{GRangesList}. Feature indices are mapped back to the original \link{GAlignmentsList} list elements. When the query is a \link{GAlignmentPairs} object, it is first turned into a \link{GRangesList} object (with \code{as( , "GRangesList")}) and then the rules described previously apply. } \value{ A \link[S4Vectors]{Hits} object when \code{select="all"} or an integer vector otherwise. } \seealso{ \itemize{ \item \code{\link[IRanges]{findOverlaps}}. \item \link[S4Vectors]{Hits-class}. \item \link{GRanges-class}. \item \link{GRangesList-class}. \item \link{GAlignments-class}. \item \link{GAlignmentPairs-class}. \item \link{GAlignmentsList-class}. } } \examples{ ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") galn <- readGAlignments(ex1_file) subject <- granges(galn)[1] ## Note the absence of query no. 9 (i.e. 'galn[9]') in this result: as.matrix(findOverlaps(galn, subject)) ## This is because, by default, findOverlaps()/countOverlaps() are ## strand specific: galn[8:10] countOverlaps(galn[8:10], subject) countOverlaps(galn[8:10], subject, ignore.strand=TRUE) ## Count alignments in 'galn' that DO overlap with 'subject' vs those ## that do NOT: table(overlapsAny(galn, subject)) ## Extract those that DO: subsetByOverlaps(galn, subject) ## GAlignmentsList galist <- GAlignmentsList(galn[8:10], galn[3000:3002]) gr <- GRanges(c("seq1", "seq1", "seq2"), IRanges(c(15, 18, 1233), width=1), strand=c("-", "+", "+")) countOverlaps(galist, gr) countOverlaps(galist, gr, ignore.strand=TRUE) findOverlaps(galist, gr) findOverlaps(galist, gr, ignore.strand=TRUE) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/findSpliceOverlaps-methods.Rd0000644000175400017540000001527513175714431023522 0ustar00biocbuildbiocbuild\name{findSpliceOverlaps-methods} \alias{findSpliceOverlaps-methods} \alias{findSpliceOverlaps} \alias{findSpliceOverlaps,GRangesList,GRangesList-method} \alias{findSpliceOverlaps,GAlignments,GRangesList-method} \alias{findSpliceOverlaps,GAlignmentPairs,GRangesList-method} \alias{findSpliceOverlaps,character,ANY-method} \alias{findSpliceOverlaps,BamFile,ANY-method} \title{Classify ranges (reads) as compatible with existing genomic annotations or as having novel splice events} \description{ The \code{findSpliceOverlaps} function identifies ranges (reads) that are compatible with a specific transcript isoform. The non-compatible ranges are analyzed for the presence of novel splice events. } \usage{ findSpliceOverlaps(query, subject, ignore.strand=FALSE, ...) \S4method{findSpliceOverlaps}{GRangesList,GRangesList}(query, subject, ignore.strand=FALSE, ..., cds=NULL) \S4method{findSpliceOverlaps}{GAlignments,GRangesList}(query, subject, ignore.strand=FALSE, ..., cds=NULL) \S4method{findSpliceOverlaps}{GAlignmentPairs,GRangesList}(query, subject, ignore.strand=FALSE, ..., cds=NULL) \S4method{findSpliceOverlaps}{BamFile,ANY}(query, subject, ignore.strand=FALSE, ..., param=ScanBamParam(), singleEnd=TRUE) } \arguments{ \item{query}{ A \link[GenomicRanges]{GRangesList}, \link{GAlignments}, \link{GAlignmentPairs}, or \link[Rsamtools]{BamFile} object containing the reads. Can also be a single string containing the path to a BAM file. Single or paired-end reads are specified with the \code{singleEnd} argument (default FALSE). Paired-end reads can be supplied in a BAM file or \link{GAlignmentPairs} object. Single-end are expected to be in a BAM file, \link{GAlignments} or \link[GenomicRanges]{GRanges} object. } \item{subject}{ A \link[GenomicRanges]{GRangesList} containing the annotations. This list is expected to contain exons grouped by transcripts. } \item{ignore.strand}{ When set to \code{TRUE}, strand information is ignored in the overlap calculations. } \item{...}{ Additional arguments such as \code{param} and \code{singleEnd} used in the method for \link[Rsamtools]{BamFile} objects. See below. } \item{cds}{ Optional \link[GenomicRanges]{GRangesList} of coding regions for each transcript in the \code{subject}. If provided, the "coding" output column will be a \code{logical} vector indicating if the read falls in a coding region. When not provided, the "coding" output is \code{NA}. } \item{param}{ An optional \code{\link[Rsamtools]{ScanBamParam}} instance to further influence scanning, counting, or filtering. } \item{singleEnd}{ A logical value indicating if reads are single or paired-end. See \code{\link{summarizeOverlaps}} for more information. } } \details{ When a read maps compatibly and uniquely to a transcript isoform we can quantify the expression and look for shifts in the balance of isoform expression. If a read does not map in compatible way, novel splice events such as splice junctions, novel exons or retentions can be quantified and compared across samples. \code{findSpliceOverlaps} detects which reads (query) match to transcripts (subject) in a compatible fashion. Compatibility is based on both the transcript bounds and splicing pattern. Assessing the splicing pattern involves comparision of the read splices (i.e., the N operations in the CIGAR) with the transcript introns. For paired-end reads, the inter-read gap is not considered a splice junction. The analysis of non-compatible reads for novel splice events is under construction. } \value{ The output is a \link[S4Vectors]{Hits} object with the metadata columns defined below. Each column is a \code{logical} indicating if the read (query) met the criteria. \itemize{ \item{compatible: }{Every splice (N) in a read alignment matches an intron in an annotated transcript. The read does not extend into an intron or outside the transcript bounds. } \item{unique: }{The read is compatible with only one annotated transcript. } \item{strandSpecific: }{The query (read) was stranded. } } } \note{ WARNING: The current implementation of \code{findSpliceOverlaps} doesn't work properly on paired-end reads where the 2 ends overlap! } \author{ Michael Lawrence and Valerie Obenchain } \seealso{ \itemize{ \item \link[GenomicRanges]{GRangesList} objects in the \pkg{GenomicRanges} package. \item \link{GAlignments} and \link{GAlignmentPairs} objects. \item \link[Rsamtools]{BamFile} objects in the \pkg{Rsamtools} package. } } \examples{ ## ----------------------------------------------------------------------- ## Isoform expression : ## ----------------------------------------------------------------------- ## findSpliceOverlaps() can assist in quantifying isoform expression ## by identifying reads that map compatibly and uniquely to a ## transcript isoform. library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) library(pasillaBamSubset) se <- untreated1_chr4() ## single-end reads txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene exbytx <- exonsBy(txdb, "tx") cdsbytx <- cdsBy(txdb, "tx") param <- ScanBamParam(which=GRanges("chr4", IRanges(1e5,3e5))) sehits <- findSpliceOverlaps(se, exbytx, cds=cdsbytx, param=param) ## Tally the reads by category to get an idea of read distribution. lst <- lapply(mcols(sehits), table) nms <- names(lst) %in% c("compatible", "unique") tbl <- do.call(rbind, lst[nms]) tbl ## Reads compatible with one or more transcript isoforms. rnms <- rownames(tbl) tbl[rnms == "compatible","TRUE"]/sum(tbl[rnms == "compatible",]) ## Reads compatible with a single isoform. tbl[rnms == "unique","TRUE"]/sum(tbl[rnms == "unique",]) ## All reads fall in a coding region as defined by ## the txdb annotation. lst[["coding"]] ## Check : Total number of reads should be the same across categories. lapply(lst, sum) ## ----------------------------------------------------------------------- ## Paired-end reads : ## ----------------------------------------------------------------------- ## 'singleEnd' is set to FALSE for a BAM file with paired-end reads. pe <- untreated3_chr4() hits2 <- findSpliceOverlaps(pe, exbytx, singleEnd=FALSE, param=param) ## In addition to BAM files, paired-end reads can be supplied in a ## GAlignmentPairs object. genes <- GRangesList( GRanges("chr1", IRanges(c(5, 20), c(10, 25)), "+"), GRanges("chr1", IRanges(c(5, 22), c(15, 25)), "+")) galp <- GAlignmentPairs( GAlignments("chr1", 5L, "11M4N6M", strand("+")), GAlignments("chr1", 50L, "6M", strand("-"))) findSpliceOverlaps(galp, genes) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/intra-range-methods.Rd0000644000175400017540000001216013175714431022123 0ustar00biocbuildbiocbuild\name{intra-range-methods} \alias{intra-range-methods} \alias{narrow} \alias{narrow,GAlignments-method} \alias{narrow,GAlignmentsList-method} \alias{narrow,GappedReads-method} \alias{qnarrow} \alias{qnarrow,GAlignments-method} \alias{qnarrow,GAlignmentsList-method} \alias{qnarrow,GappedReads-method} \title{Intra range transformations of a GAlignments or GAlignmentsList object} \description{ This man page documents intra range transformations of a \link{GAlignments} or \link{GAlignmentsList} object. See \code{?`\link[IRanges]{intra-range-methods}`} and \code{?`\link[IRanges]{inter-range-methods}`} in the \pkg{IRanges} package for a quick introduction to intra range and inter range transformations. Intra range methods for \link{GRanges} and \link{GRangesList} objects are defined and documented in the \pkg{GenomicRanges} package. } \usage{ \S4method{narrow}{GAlignments}(x, start=NA, end=NA, width=NA, use.names=TRUE) \S4method{narrow}{GAlignmentsList}(x, start=NA, end=NA, width=NA, use.names=TRUE) \S4method{qnarrow}{GAlignments}(x, start=NA, end=NA, width=NA) \S4method{qnarrow}{GAlignmentsList}(x, start=NA, end=NA, width=NA) } \arguments{ \item{x}{ A \link{GAlignments} or \link{GAlignmentsList} object. } \item{start, end, width}{ Vectors of integers. NAs and negative values are accepted and "solved" according to the rules of the SEW (Start/End/Width) interface (see \code{?\link[IRanges]{solveUserSEW}} for more information about the SEW interface). See \code{?`\link[IRanges]{intra-range-methods}`} for more information about the \code{start}, \code{end}, and \code{width} arguments. } \item{use.names}{ See \code{?`\link[IRanges]{intra-range-methods}`}. } } \details{ \itemize{ \item(){ \code{narrow} on a \link{GAlignments} object behaves like on a \link[IRanges]{Ranges} object. See \code{?`\link[IRanges]{intra-range-methods}`} for the details. A major difference though is that it returns a \link{GAlignments} object instead of a \link[IRanges]{Ranges} object. Unlike with \code{qnarrow} (see below), the \code{start}/\code{end}/\code{width} arguments here describe the narrowing on the reference side, not the query side. } \item(){ \code{qnarrow} on a \link{GAlignments} object behaves like \code{narrow} except that the \code{start}/\code{end}/\code{width} arguments here specify the narrowing with respect to the query sequences. \code{qnarrow} on a \link{GAlignmentsList} object returns a \link{GAlignmentsList} object. } } } \value{ An object of the same class as, and \emph{parallel} to (i.e. same length and names as), the original object \code{x}. } \note{ There is no difference between \code{narrow} and \code{qnarrow} when all the alignments have a simple CIGAR (i.e. no indels or junctions). } \author{Hervé Pagès and V. Obenchain } \seealso{ \itemize{ \item \link{GAlignments} and \link{GAlignmentsList} objects. \item The \link[IRanges]{intra-range-methods} man page in the \pkg{IRanges} package. \item The \link[GenomicRanges]{intra-range-methods} man page in the \pkg{GenomicRanges} package. } } \examples{ ## --------------------------------------------------------------------- ## A. ON A GAlignments OBJECT ## --------------------------------------------------------------------- ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") param <- ScanBamParam(what=c("seq", "qual")) gal <- readGAlignments(ex1_file, param=param) gal ## This trims 3 nucleotides on the left and 5 nucleotides on the right ## of each alignment: gal2 <- qnarrow(gal, start=4, end=-6) gal2 ## Note that the 'start' and 'end' values are relative to the query ## sequences and specify the query substring that must be kept for each ## alignment. Negative values are relative to the right end of the query ## sequence. ## Also note that the metadata columns on 'gal' are propagated as-is so ## the "seq" and "qual" matadata columns must be adjusted "by hand" with ## narrow(); mcols(gal2)$seq <- narrow(mcols(gal)$seq, start=4, end=-6) mcols(gal2)$qual <- narrow(mcols(gal)$qual, start=4, end=-6) gal2 ## Sanity checks: stopifnot(identical(qwidth(gal2), width(mcols(gal2)$seq))) stopifnot(identical(qwidth(gal2), width(mcols(gal2)$qual))) ## --------------------------------------------------------------------- ## B. ON A GAlignmentsList OBJECT ## --------------------------------------------------------------------- gal1 <- GAlignments( seqnames=Rle(factor(c("chr1", "chr2", "chr1", "chr3")), c(1, 3, 2, 4)), pos=1:10, cigar=paste0(10:1, "M"), strand=Rle(strand(c("-", "+", "*", "+", "-")), c(1, 2, 2, 3, 2)), names=head(letters, 10), score=1:10) gal2 <- GAlignments( seqnames=Rle(factor(c("chr2", "chr4")), c(3, 4)), pos=1:7, cigar=c("5M", "3M2N3M2N3M", "5M", "10M", "5M1N4M", "8M2N1M", "5M"), strand=Rle(strand(c("-", "+")), c(4, 3)), names=tail(letters, 7), score=1:7) galist <- GAlignmentsList(noGaps=gal1, Gaps=gal2) galist qnarrow(galist) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/junctions-methods.Rd0000644000175400017540000004245713175714431021744 0ustar00biocbuildbiocbuild\name{junctions-methods} \alias{junctions-methods} \alias{junctions} \alias{junctions,GAlignments-method} \alias{junctions,GAlignmentPairs-method} \alias{junctions,GAlignmentsList-method} \alias{NATURAL_INTRON_MOTIFS} \alias{summarizeJunctions} \alias{readTopHatJunctions} \alias{readSTARJunctions} \title{Extract junctions from genomic alignments} \description{ Given an object \code{x} containing genomic alignments (e.g. a \link{GAlignments}, \link{GAlignmentPairs}, or \link{GAlignmentsList} object), \code{junctions(x)} extracts the junctions from it and \code{summarizeJunctions(x)} extracts and summarizes them. \code{readTopHatJunctions} and \code{readSTARJunctions} are utilities for importing the junction file generated by the TopHat and STAR aligners, respectively. } \usage{ ## junctions() generic and methods ## ------------------------------- junctions(x, use.mcols=FALSE, ...) \S4method{junctions}{GAlignments}(x, use.mcols=FALSE) \S4method{junctions}{GAlignmentPairs}(x, use.mcols=FALSE) \S4method{junctions}{GAlignmentsList}(x, use.mcols=FALSE, ignore.strand=FALSE) ## summarizeJunctions() and NATURAL_INTRON_MOTIFS ## ---------------------------------------------- summarizeJunctions(x, with.revmap=FALSE, genome=NULL) NATURAL_INTRON_MOTIFS ## Utilities for importing the junction file generated by some aligners ## -------------------------------------------------------------------- readTopHatJunctions(file, file.is.raw.juncs=FALSE) readSTARJunctions(file) } \arguments{ \item{x}{ A \link{GAlignments}, \link{GAlignmentPairs}, or \link{GAlignmentsList} object. } \item{use.mcols}{ \code{TRUE} or \code{FALSE} (the default). Whether the metadata columns on \code{x} (accessible with \code{mcols(x)}) should be propagated to the returned object or not. } \item{...}{ Additional arguments, for use in specific methods. } \item{ignore.strand}{ \code{TRUE} or \code{FALSE} (the default). If set to \code{TRUE}, then the strand of \code{x} is set to \code{"*"} prior to any computation. } \item{with.revmap}{ \code{TRUE} or \code{FALSE} (the default). If set to \code{TRUE}, then a \code{revmap} metadata column is added to the output of \code{summarizeJunctions}. This metadata column is an \link[IRanges]{IntegerList} object representing the mapping from each element in the ouput (i.e. each junction) to the corresponding elements in the input \code{x}. } \item{genome}{ \code{NULL} (the default), or a \link[BSgenome]{BSgenome} object containing the sequences of the reference genome that was used to align the reads, or the name of this reference genome specified in a way that is accepted by the \code{\link[BSgenome]{getBSgenome}} function defined in the \pkg{BSgenome} software package. In that case the corresponding BSgenome data package needs to be already installed (see \code{?\link[BSgenome]{getBSgenome}} in the \pkg{BSgenome} package for the details). If \code{genome} is supplied, then the \code{intron_motif} and \code{intron_strand} metadata columns are computed (based on the dinucleotides found at the intron boundaries) and added to the output of \code{summarizeJunctions}. See the Value section below for a description of these metadata columns. } \item{file}{ The path (or a connection) to the junction file generated by the aligner. This file should be the \emph{junctions.bed} or \emph{new_list.juncs} file for \code{readTopHatJunctions}, and the \emph{SJ.out.tab} file for \code{readSTARJunctions}. } \item{file.is.raw.juncs}{ \code{TRUE} or \code{FALSE} (the default). If set to \code{TRUE}, then the input file is assumed to be a TopHat \emph{.juncs} file instead of the \emph{junctions.bed} file generated by TopHat. A TopHat \emph{.juncs} file can be obtained by passing the \emph{junctions.bed} file thru TopHat's \emph{bed_to_juncs} script. See the TopHat manual at \url{http://tophat.cbcb.umd.edu/manual.shtml} for more information. } } \details{ An N operation in the CIGAR of a genomic alignment is interpreted as a junction. \code{junctions(x)} will return the genomic ranges of all junctions found in \code{x}. More precisely, on a \link{GAlignments} object \code{x}, \code{junctions(x)} is equivalent to: \preformatted{ psetdiff(granges(x), grglist(x, order.as.in.query=TRUE)) } On a \link{GAlignmentPairs} object \code{x}, it's equivalent to (but faster than): \preformatted{ mendoapply(c, junctions(first(x, real.strand=TRUE)), junctions(last(x, real.strand=TRUE))) } Note that starting with BioC 3.2, the behavior of \code{junctions} on a \link{GAlignmentPairs} object has been slightly modified so that the returned ranges now have the \emph{real strand} set on them. See the documentation of the \code{real.strand} argument in the man page of \link{GAlignmentPairs} objects for more information. \code{NATURAL_INTRON_MOTIFS} is a predefined character vector containing the 5 natural intron motifs described at \url{http://www.ncbi.nlm.nih.gov/pmc/articles/PMC84117/}. } \value{ \code{junctions(x)} returns the genomic ranges of the junctions in a \link[GenomicRanges]{GRangesList} object \emph{parallel} to \code{x} (i.e. with 1 list element per element in \code{x}). If \code{x} has names on it, they're propagated to the returned object. If \code{use.mcols} is TRUE and \code{x} has metadata columns on it (accessible with \code{mcols(x)}), they're propagated to the returned object. \code{summarizeJunctions} returns the genomic ranges of the unique junctions in \code{x} in an unstranded \link[GenomicRanges]{GRanges} object with the following metadata columns: \itemize{ \item \code{score}: The total number of alignments crossing each junction, i.e. that have the junction encoded in their CIGAR. \item \code{plus_score} and \code{minus_score}: The strand-specific number of alignments crossing each junction. \item \code{revmap}: [Only if \code{with.revmap} was set to \code{TRUE}.] An \link[IRanges]{IntegerList} object representing the mapping from each element in the ouput (i.e. each junction) to the corresponding elements in input \code{x}. \item \code{intron_motif} and \code{intron_strand}: [Only if \code{genome} was supplied.] The intron motif and strand for each junction, based on the dinucleotides found in the genome sequences at the intron boundaries. The \code{intron_motif} metadata column is a factor whose levels are the 5 natural intron motifs stored in predefined character vector \code{NATURAL_INTRON_MOTIFS}. If the dinucleotides found at the intron boundaries don't match any of these natural intron motifs, then \code{intron_motif} and \code{intron_strand} are set to \code{NA} and \code{*}, respectively. } \code{readTopHatJunctions} and \code{readSTARJunctions} return the junctions reported in the input file in a stranded \link[GenomicRanges]{GRanges} object. With the following metadata columns for \code{readTopHatJunctions} (when reading in the \emph{junctions.bed} file): \itemize{ \item \code{name}: An id assigned by TopHat to each junction. This id is of the form JUNC00000017 and is unique within the \emph{junctions.bed} file. \item \code{score}: The total number of alignments crossing each junction. } With the following metadata columns for \code{readSTARJunctions}: \itemize{ \item \code{intron_motif} and \code{intron_strand}: The intron motif and strand for each junction, based on the code found in the input file (0: non-canonical, 1: GT/AG, 2: CT/AC, 3: GC/AG, 4: CT/GC, 5: AT/AC, 6: GT/AT). Note that of the 5 natural intron motifs stored in predefined character vector \code{NATURAL_INTRON_MOTIFS}, only the first 3 are assigned codes by the STAR software (2 codes per motif, one if the intron is on the plus strand and one if it's on the minus strand). Thus the \code{intron_motif} metadata column is a factor with only 3 levels. If code is 0, then \code{intron_motif} and \code{intron_strand} are set to \code{NA} and \code{*}, respectively. \item \code{um_reads}: The number of uniquely mapping reads crossing the junction (a pair where the 2 alignments cross the same junction is counted only once). \item \code{mm_reads}: The number of multi-mapping reads crossing the junction (a pair where the 2 alignments cross the same junction is counted only once). } See STAR manual at \url{https://code.google.com/p/rna-star/} for more information. } \author{Hervé Pagès} \references{ \url{http://www.ncbi.nlm.nih.gov/pmc/articles/PMC84117/} for the 5 natural intron motifs stored in predefined character vector \code{NATURAL_INTRON_MOTIFS}. TopHat2: accurate alignment of transcriptomes in the presence of insertions, deletions and gene fusions \itemize{ \item TopHat2 paper: \url{http://genomebiology.com/2013/14/4/r36} \item TopHat2 software and manual: \url{http://tophat.cbcb.umd.edu/} } STAR: ultrafast universal RNA-seq aligner \itemize{ \item STAR paper: \url{http://bioinformatics.oxfordjournals.org/content/early/2012/10/25/bioinformatics.bts635} \item STAR software and manual: \url{https://code.google.com/p/rna-star/} } } \seealso{ \itemize{ \item The \code{\link{readGAlignments}} and \code{\link{readGAlignmentPairs}} functions for reading genomic alignments from a BAM file. \item \link{GAlignments}, \link{GAlignmentPairs}, and \link{GAlignmentsList} objects. \item \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} objects implemented and documented in the \pkg{GenomicRanges} package. \item \link[IRanges]{IntegerList} objects implemented and documented in the \pkg{IRanges} package. \item The \code{\link[BSgenome]{getBSgenome}} function in the \pkg{BSgenome} package, for searching the installed BSgenome data packages for the specified genome and returning it as a \link[BSgenome]{BSgenome} object. \item The \code{\link[IRanges]{extractList}} function in the \pkg{IRanges} package, for extracting groups of elements from a vector-like object and returning them into a \link[S4Vectors]{List} object. } } \examples{ library(RNAseqData.HNRNPC.bam.chr14) bamfile <- RNAseqData.HNRNPC.bam.chr14_BAMFILES[1] ## --------------------------------------------------------------------- ## A. junctions() ## --------------------------------------------------------------------- gal <- readGAlignments(bamfile) table(njunc(gal)) # some alignments have 3 junctions! juncs <- junctions(gal) juncs stopifnot(identical(unname(elementNROWS(juncs)), njunc(gal))) galp <- readGAlignmentPairs(bamfile) juncs <- junctions(galp) juncs stopifnot(identical(unname(elementNROWS(juncs)), njunc(galp))) ## --------------------------------------------------------------------- ## B. summarizeJunctions() ## --------------------------------------------------------------------- ## By default, only the "score", "plus_score", and "minus_score" ## metadata columns are returned: junc_summary <- summarizeJunctions(gal) junc_summary ## The "score" metadata column reports the total number of alignments ## crossing each junction, i.e., that have the junction encoded in their ## CIGAR: median(mcols(junc_summary)$score) ## The "plus_score" and "minus_score" metadata columns report the ## strand-specific number of alignments crossing each junction: stopifnot(identical(mcols(junc_summary)$score, mcols(junc_summary)$plus_score + mcols(junc_summary)$minus_score)) ## If 'with.revmap' is TRUE, the "revmap" metadata column is added to ## the output. This metadata column is an IntegerList object represen- ## ting the mapping from each element in the ouput (i.e. a junction) to ## the corresponding elements in the input 'x'. Here we're going to use ## this to compute a 'score2' for each junction. We obtain this score ## by summing the mapping qualities of the alignments crossing the ## junction: gal <- readGAlignments(bamfile, param=ScanBamParam(what="mapq")) junc_summary <- summarizeJunctions(gal, with.revmap=TRUE) junc_score2 <- sum(extractList(mcols(gal)$mapq, mcols(junc_summary)$revmap)) mcols(junc_summary)$score2 <- junc_score2 ## If the name of the reference genome is specified thru the 'genome' ## argument (in which case the corresponding BSgenome data package needs ## to be installed), then summarizeJunctions() returns the intron motif ## and strand for each junction. ## Since the reads in RNAseqData.HNRNPC.bam.chr14 were aligned to ## the hg19 genome, the following requires that you have ## BSgenome.Hsapiens.UCSC.hg19 installed: junc_summary <- summarizeJunctions(gal, with.revmap=TRUE, genome="hg19") mcols(junc_summary)$score2 <- junc_score2 # putting 'score2' back ## The "intron_motif" metadata column is a factor whose levels are the ## 5 natural intron motifs stored in predefined character vector ## 'NATURAL_INTRON_MOTIFS': table(mcols(junc_summary)$intron_motif) ## --------------------------------------------------------------------- ## C. STRANDED RNA-seq PROTOCOL ## --------------------------------------------------------------------- ## Here is a simple test for checking whether the RNA-seq protocol was ## stranded or not: strandedTest <- function(plus_score, minus_score) (sum(plus_score ^ 2) + sum(minus_score ^ 2)) / sum((plus_score + minus_score) ^ 2) ## The result of this test is guaranteed to be >= 0.5 and <= 1. ## If, for each junction, the strand of the crossing alignments looks ## random (i.e. "plus_score" and "minus_score" are close), then ## strandedTest() will return a value close to 0.5. If it doesn't look ## random (i.e. for each junction, one of "plus_score" and "minus_score" ## is much bigger than the other), then strandedTest() will return a ## value close to 1. ## If the reads are single-end, the test is meaningful when applied ## directly on 'junc_summary'. However, for the test to be meaningful ## on paired-end reads, it needs to be applied on the first and last ## alignments separately: junc_summary1 <- summarizeJunctions(first(galp)) junc_summary2 <- summarizeJunctions(last(galp)) strandedTest(mcols(junc_summary1)$plus_score, mcols(junc_summary1)$minus_score) strandedTest(mcols(junc_summary2)$plus_score, mcols(junc_summary2)$minus_score) ## Both values are close to 0.5 which suggests that the RNA-seq protocol ## used for this experiment was not stranded. ## --------------------------------------------------------------------- ## D. UTILITIES FOR IMPORTING THE JUNCTION FILE GENERATED BY SOME ## ALIGNERS ## --------------------------------------------------------------------- ## The TopHat aligner generates a junctions.bed file where it reports ## all the junctions satisfying some "quality" criteria (see the TopHat ## manual at http://tophat.cbcb.umd.edu/manual.shtml for more ## information). This file can be loaded with readTopHatJunctions(): runname <- names(RNAseqData.HNRNPC.bam.chr14_BAMFILES)[1] junctions_file <- system.file("extdata", "tophat2_out", runname, "junctions.bed", package="RNAseqData.HNRNPC.bam.chr14") th_junctions <- readTopHatJunctions(junctions_file) ## Comparing the "TopHat junctions" with the result of ## summarizeJunctions(): th_junctions14 <- th_junctions seqlevels(th_junctions14, pruning.mode="coarse") <- "chr14" mcols(th_junctions14)$intron_strand <- strand(th_junctions14) strand(th_junctions14) <- "*" ## All the "TopHat junctions" are in 'junc_summary': stopifnot(all(th_junctions14 \%in\% junc_summary)) ## But not all the junctions in 'junc_summary' are reported by TopHat ## (that's because TopHat reports only junctions that satisfy some ## "quality" criteria): is_in_th_junctions14 <- junc_summary \%in\% th_junctions14 table(is_in_th_junctions14) # 32 junctions are not in TopHat's # junctions.bed file junc_summary2 <- junc_summary[is_in_th_junctions14] ## 'junc_summary2' and 'th_junctions14' contain the same junctions in ## the same order: stopifnot(all(junc_summary2 == th_junctions14)) ## Let's merge their metadata columns. We use our own version of ## merge() for this, which is stricter (it checks that the common ## columns are the same in the 2 data frames to merge) and also ## simpler: merge2 <- function(df1, df2) { common_colnames <- intersect(colnames(df1), colnames(df2)) lapply(common_colnames, function(colname) stopifnot(all(df1[ , colname] == df2[ , colname]))) extra_mcolnames <- setdiff(colnames(df2), colnames(df1)) cbind(df1, df2[ , extra_mcolnames, drop=FALSE]) } mcols(th_junctions14) <- merge2(mcols(th_junctions14), mcols(junc_summary2)) ## Here is a peculiar junction reported by TopHat: idx0 <- which(mcols(th_junctions14)$score2 == 0L) th_junctions14[idx0] gal[mcols(th_junctions14)$revmap[[idx0]]] ## The junction is crossed by 5 alignments (score is 5), all of which ## have a mapping quality of 0! } \keyword{methods} \keyword{manip} GenomicAlignments/man/pileLettersAt.Rd0000644000175400017540000001310213175714431021031 0ustar00biocbuildbiocbuild\name{pileLettersAt} \alias{pileLettersAt} \title{Pile the letters of a set of aligned reads on top of a set of genomic positions} \description{ \code{pileLettersAt} extracts the letters/nucleotides of a set of reads that align to a set of genomic positions of interest. The extracted letters are returned as "piles of letters" (one per genomic position of interest) stored in an \link[Biostrings]{XStringSet} (typically \link[Biostrings]{DNAStringSet}) object. } \usage{ pileLettersAt(x, seqnames, pos, cigar, at) } \arguments{ \item{x}{ An \link[Biostrings]{XStringSet} (typically \link[Biostrings]{DNAStringSet}) object containing N \emph{unaligned} read sequences (a.k.a. the query sequences) reported with respect to the + strand. } \item{seqnames}{ A factor-\link[S4Vectors]{Rle} \emph{parallel} to \code{x}. For each \code{i}, \code{seqnames[i]} must be the name of the reference sequence of the i-th alignment. } \item{pos}{ An integer vector \emph{parallel} to \code{x}. For each \code{i}, \code{pos[i]} must be the 1-based position on the reference sequence of the first aligned letter in \code{x[[i]]}. } \item{cigar}{ A character vector \emph{parallel} to \code{x}. Contains the extended CIGAR strings of the alignments. } \item{at}{ A \link[GenomicRanges]{GPos} object containing the genomic positions of interest. \code{seqlevels(at)} must be identical to \code{levels(seqnames)}. If \code{at} is not a \link[GenomicRanges]{GPos} object, \code{pileLettersAt} will first try to turn it into one by calling the \code{\link[GenomicRanges]{GPos}()} constructor function on it. So for example \code{at} can be a \link[GenomicRanges]{GRanges} object (or any other \link[GenomicRanges]{GenomicRanges} derivative), and, in that case, each range in it will be interpreted as a run of adjacent genomic positions. See \code{?\link[GenomicRanges]{GPos}} in the \pkg{GenomicRanges} package for more information. } } \details{ \code{x}, \code{seqnames}, \code{pos}, \code{cigar} must be 4 \emph{parallel} vectors describing N aligned reads. } \value{ An \link[Biostrings]{XStringSet} (typically \link[Biostrings]{DNAStringSet}) object \emph{parallel} to \code{at} (i.e. with 1 string per genomic position). } \author{Hervé Pagès} \seealso{ \itemize{ \item The \code{pileup} and \code{applyPileups} functions defined in the \pkg{Rsamtools} package, as well as the SAMtools mpileup command (available at \url{http://samtools.sourceforge.net/} as part of the SAMtools project), for more powerful flexible alternatives. \item The \code{\link{stackStringsFromBam}} function for stacking the read sequences (or their quality strings) stored in a BAM file on a region of interest. \item \link[Biostrings]{DNAStringSet} objects in the \pkg{Biostrings} package. \item \link[GenomicRanges]{GPos} objects in the \pkg{GenomicRanges} package. \item \link{GAlignments} objects. \item \link{cigar-utils} for the CIGAR utility functions used internally by \code{pileLettersAt}. } } \examples{ ## Input ## - A BAM file: bamfile <- BamFile(system.file("extdata", "ex1.bam", package="Rsamtools")) seqinfo(bamfile) # to see the seqlevels and seqlengths stackStringsFromBam(bamfile, param="seq1:1-21") # a quick look at # the reads ## - A GPos object containing Genomic Positions Of Interest: my_GPOI <- GPos(c("seq1:1-5", "seq1:21-21", "seq1:1575-1575", "seq2:1513-1514")) ## Some preliminary massage on 'my_GPOI' seqinfo(my_GPOI) <- merge(seqinfo(my_GPOI), seqinfo(bamfile)) seqlevels(my_GPOI) <- seqlevelsInUse(my_GPOI) ## Load the BAM file in a GAlignments object. Note that we load only ## the reads aligned to the sequences in 'seqlevels(my_GPOI)'. Also, ## in order to be consistent with applyPileups() and SAMtools (m)pileup, ## we filter out the following BAM records: ## - secondary alignments (flag bit 0x100); ## - reads not passing quality controls (flag bit 0x200); ## - PCR or optical duplicates (flag bit 0x400). ## See ?ScanBamParam and the SAM Spec for more information. which <- as(seqinfo(my_GPOI), "GRanges") flag <- scanBamFlag(isSecondaryAlignment=FALSE, isNotPassingQualityControls=FALSE, isDuplicate=FALSE) what <- c("seq", "qual") param <- ScanBamParam(flag=flag, what=c("seq", "qual"), which=which) gal <- readGAlignments(bamfile, param=param) seqlevels(gal) <- seqlevels(my_GPOI) ## Extract the read sequences (a.k.a. query sequences) and quality ## strings. Both are reported with respect to the + strand. qseq <- mcols(gal)$seq qual <- mcols(gal)$qual nucl_piles <- pileLettersAt(qseq, seqnames(gal), start(gal), cigar(gal), my_GPOI) qual_piles <- pileLettersAt(qual, seqnames(gal), start(gal), cigar(gal), my_GPOI) mcols(my_GPOI)$nucl_piles <- nucl_piles mcols(my_GPOI)$qual_piles <- qual_piles my_GPOI ## Finally, to summarize A/C/G/T frequencies at each position: alphabetFrequency(nucl_piles, baseOnly=TRUE) ## Note that the pileup() function defined in the Rsamtools package ## can be used to obtain a similar result: scanbam_param <- ScanBamParam(flag=flag, which=my_GPOI) pileup_param <- PileupParam(max_depth=5000, min_base_quality=0, distinguish_strands=FALSE) pileup(bamfile, scanBamParam=scanbam_param, pileupParam=pileup_param) } \keyword{methods} \keyword{manip} GenomicAlignments/man/readGAlignments.Rd0000644000175400017540000004676413175714431021340 0ustar00biocbuildbiocbuild\name{readGAlignments} \alias{readGAlignments} \alias{readGAlignments,BamFile-method} \alias{readGAlignments,character-method} \alias{readGAlignments,BamViews-method} \alias{readGAlignmentPairs} \alias{readGAlignmentPairs,BamFile-method} \alias{readGAlignmentPairs,character-method} \alias{readGAlignmentsList} \alias{readGAlignmentsList,BamFile-method} \alias{readGAlignmentsList,character-method} \alias{readGappedReads} \alias{readGappedReads,BamFile-method} \alias{readGappedReads,character-method} \title{Reading genomic alignments from a file} \description{ Read genomic alignments from a file (typically a BAM file) into a \link{GAlignments}, \link{GAlignmentPairs}, \link{GAlignmentsList}, or \link{GappedReads} object. } \usage{ readGAlignments(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) readGAlignmentPairs(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE, strandMode=1) readGAlignmentsList(file, index=file, use.names=FALSE, param=ScanBamParam(), with.which_label=FALSE) readGappedReads(file, index=file, use.names=FALSE, param=NULL, with.which_label=FALSE) } \arguments{ \item{file}{ The path to the file to read or a \link[Rsamtools]{BamFile} object. Can also be a \link[Rsamtools]{BamViews} object for \code{readGAlignments}. } \item{index}{ The path to the index file of the BAM file to read. Must be given \emph{without} the '.bai' extension. See \code{\link[Rsamtools]{scanBam}} in the \pkg{Rsamtools} packages for more information. } \item{use.names}{ \code{TRUE} or \code{FALSE}. By default (i.e. \code{use.names=FALSE}), the resulting object has no names. If \code{use.names} is \code{TRUE}, then the names are constructed from the query template names (QNAME field in a SAM/BAM file). Note that the 2 records in a pair (when using \code{readGAlignmentPairs} or the records in a group (when using \code{readGAlignmentsList}) have the same QNAME. } \item{param}{\code{NULL} or a \link[Rsamtools]{ScanBamParam} object. Like for \code{\link[Rsamtools]{scanBam}}, this influences what fields and which records are imported. However, note that the fields specified thru this \link[Rsamtools]{ScanBamParam} object will be loaded \emph{in addition} to any field required for generating the returned object (\link{GAlignments}, \link{GAlignmentPairs}, or \link{GappedReads} object), but only the fields requested by the user will actually be kept as metadata columns of the object. By default (i.e. \code{param=NULL} or \code{param=ScanBamParam()}), no additional field is loaded. The flag used is \code{scanBamFlag(isUnmappedQuery=FALSE)} for \code{readGAlignments}, \code{readGAlignmentsList}, and \code{readGappedReads}. (i.e. only records corresponding to mapped reads are loaded), and \code{scanBamFlag(isUnmappedQuery=FALSE, isPaired=TRUE, hasUnmappedMate=FALSE)} for \code{readGAlignmentPairs} (i.e. only records corresponding to paired-end reads with both ends mapped are loaded). } \item{with.which_label}{\code{TRUE} or \code{FALSE} (the default). If \code{TRUE} and if \code{param} has a \code{which} component, a \code{"which_label"} metadata column is added to the returned \link{GAlignments} or \link{GappedReads} object, or to the \code{\link{first}} and \code{\link{last}} components of the returned \link{GAlignmentPairs} object. In the case of \code{readGAlignmentsList}, it's added as an \emph{inner} metadata column, that is, the metadata column is placed on the \link{GAlignments} object obtained by unlisting the returned \link{GAlignmentsList} object. The purpose of this metadata column is to unambiguously identify the range in \code{which} where each element in the returned object originates from. The labels used to identify the ranges are normally of the form \code{"seq1:12250-246500"}, that is, they're the same as the names found on the outer list that \code{\link{scanBam}} would return if called with the same \code{param} argument. If some ranges are duplicated, then the labels are made unique by appending a unique suffix to all of them. The \code{"which_label"} metadata column is represented as a factor-\link[S4Vectors]{Rle}. } \item{strandMode}{ Strand mode to set on the returned \link{GAlignmentPairs} object. See \code{?\link{strandMode}} for more information. } } \details{ \itemize{ \item \code{readGAlignments} reads a file containing aligned reads as a \link{GAlignments} object. See \code{?\link{GAlignments}} for a description of \link{GAlignments} objects. When \code{file} is a \link[Rsamtools]{BamViews} object, \code{readGAlignments} visits each path in \code{bamPaths(file)}, returning the result of \code{readGAlignments} applied to the specified path. When \code{index} is missing, it is set equal to \code{bamIndicies(file)}. Only reads in \code{bamRanges(file)} are returned (if \code{param} is supplied, \code{bamRanges(file)} takes precedence over \code{bamWhich(param)}). The return value is a \link[S4Vectors]{SimpleList} object, with elements of the list corresponding to each path. \code{bamSamples(file)} is available as metadata columns (accessed with \code{mcols}) of the returned \link[S4Vectors]{SimpleList} object. \item \code{readGAlignmentPairs} reads a file containing aligned paired-end reads as a \link{GAlignmentPairs} object. See \code{?\link{GAlignmentPairs}} for a description of \link{GAlignmentPairs} objects. \item \code{readGAlignmentsList} reads a file containing aligned reads as a \link{GAlignmentsList} object. See \code{?\link{GAlignmentsList}} for a description of \link{GAlignmentsList} objects. \code{readGAlignmentsList} pairs records into mates according to the pairing criteria described below. The 1st mate will always be 1st in the \link{GAlignmentsList} list elements that have mate_status set to \code{"mated"}, and the 2nd mate will always be 2nd. A \code{GAlignmentsList} is returned with a \sQuote{mate_status} metadata column on the outer list elements. \code{mate_status} is a factor with 3 levels indicating mate status, \sQuote{mated}, \sQuote{ambiguous} or \sQuote{unmated}: \itemize{ \item{mated:} primary or non-primary pairs \item{ambiguous:} multiple segments matching to the same location (indistinguishable) \item{unmated:} mate does not exist or is unmapped } When the \sQuote{file} argument is a BamFile, \sQuote{asMates=TRUE} must be set, otherwise the data are treated as single-end reads. See the \sQuote{asMates} section of \code{?\link[Rsamtools]{BamFile}} in the \pkg{Rsamtools} package for details. \item \code{readGappedReads} reads a file containing aligned reads as a \link{GappedReads} object. See \code{?\link{GappedReads}} for a description of \link{GappedReads} objects. } For all these functions, flags, tags and ranges may be specified in the supplied \link[Rsamtools]{ScanBamParam} object for fine tuning of results. } \section{Pairing criteria}{ This section describes the pairing criteria used by \code{readGAlignmentsList} and \code{readGAlignmentPairs}. \itemize{ \item First, only records with flag bit 0x1 (multiple segments) set to 1, flag bit 0x4 (segment unmapped) set to 0, and flag bit 0x8 (next segment in the template unmapped) set to 0, are candidates for pairing (see the SAM Spec for a description of flag bits and fields). Records that correspond to single-end reads, or records that correspond to paired-end reads where one or both ends are unmapped, will remain unmated. \item Then the following fields and flag bits are considered: \itemize{ \item (A) QNAME \item (B) RNAME, RNEXT \item (C) POS, PNEXT \item (D) Flag bits Ox10 (segment aligned to minus strand) and 0x20 (next segment aligned to minus strand) \item (E) Flag bits 0x40 (first segment in template) and 0x80 (last segment in template) \item (F) Flag bit 0x2 (proper pair) \item (G) Flag bit 0x100 (secondary alignment) } 2 records rec1 and rec2 are considered mates iff all the following conditions are satisfied: \itemize{ \item (A) QNAME(rec1) == QNAME(rec2) \item (B) RNEXT(rec1) == RNAME(rec2) and RNEXT(rec2) == RNAME(rec1) \item (C) PNEXT(rec1) == POS(rec2) and PNEXT(rec2) == POS(rec1) \item (D) Flag bit 0x20 of rec1 == Flag bit 0x10 of rec2 and Flag bit 0x20 of rec2 == Flag bit 0x10 of rec1 \item (E) rec1 corresponds to the first segment in the template and rec2 corresponds to the last segment in the template, OR, rec2 corresponds to the first segment in the template and rec1 corresponds to the last segment in the template \item (F) rec1 and rec2 have same flag bit 0x2 \item (G) rec1 and rec2 have same flag bit 0x100 } } Note that this is actually the pairing criteria used by \code{\link[Rsamtools]{scanBam}} (when the \link[Rsamtools]{BamFile} passed to it has the \code{asMates} toggle set to \code{TRUE}), which \code{readGAlignmentsList} and \code{readGAlignmentPairs} call behind the scene. It is also the pairing criteria used by \code{\link{findMateAlignment}}. } \value{ A \link{GAlignments} object for \code{readGAlignments}. A \link{GAlignmentPairs} object for \code{readGAlignmentPairs}. Note that a BAM (or SAM) file can in theory contain a mix of single-end and paired-end reads, but in practise it seems that single-end and paired-end are not mixed. In other words, the value of flag bit 0x1 (\code{isPaired}) is the same for all the records in a file. So if \code{readGAlignmentPairs} returns a \link{GAlignmentPairs} object of length zero, this almost always means that the BAM (or SAM) file contains alignments for single-end reads (although it could also mean that the user-supplied \code{\linkS4class{ScanBamParam}} is filtering out everything, or that the file is empty, or that all the records in the file correspond to unmapped reads). A \link{GAlignmentsList} object for \code{readGAlignmentsList}. When the list contains paired-end reads a metadata data column of \code{mate_status} is added to the object. See details in the `Bam specific back-ends' section on this man page. A \link{GappedReads} object for \code{readGappedReads}. } \note{ BAM records corresponding to unmapped reads are always ignored. Starting with Rsamtools 1.7.1 (BioC 2.10), PCR or optical duplicates are loaded by default (use \code{scanBamFlag(isDuplicate=FALSE)} to drop them). } \author{Hervé Pagès and Valerie Obenchain } \seealso{ \itemize{ \item \code{\link[Rsamtools]{scanBam}} and \code{\link[Rsamtools]{ScanBamParam}} in the \pkg{Rsamtools} package. \item \link{GAlignments}, \link{GAlignmentPairs}, \link{GAlignmentsList}, and \link{GappedReads} objects. \item \link[IRanges]{RangesList} objects (used in the examples below to specify the \code{which} regions) in the \pkg{IRanges} package. } } \examples{ ## --------------------------------------------------------------------- ## A. readGAlignments() ## --------------------------------------------------------------------- ## Simple use: bamfile <- system.file("extdata", "ex1.bam", package="Rsamtools", mustWork=TRUE) gal1 <- readGAlignments(bamfile) gal1 names(gal1) ## Using the 'use.names' arg: gal2 <- readGAlignments(bamfile, use.names=TRUE) gal2 head(names(gal2)) ## Using the 'param' arg to drop PCR or optical duplicates as well as ## secondary alignments, and to load additional BAM fields: param <- ScanBamParam(flag=scanBamFlag(isDuplicate=FALSE, isSecondaryAlignment=FALSE), what=c("qual", "flag")) gal3 <- readGAlignments(bamfile, param=param) gal3 mcols(gal3) ## Using the 'param' arg to load alignments from particular regions. which <- RangesList(seq1=IRanges(1000, 1100), seq2=IRanges(c(1546, 1555, 1567), width=10)) param <- ScanBamParam(which=which) gal4 <- readGAlignments(bamfile, use.names=TRUE, param=param) gal4 ## IMPORTANT NOTE: A given record is loaded one time for each region ## it overlaps with. We call this "duplicated record selection" (this ## is a scanBam() feature, readGAlignments() is based on scanBam()): which <- IRangesList(seq2=IRanges(c(1555, 1567), width=10)) param <- ScanBamParam(which=which) gal5 <- readGAlignments(bamfile, use.names=TRUE, param=param) gal5 # record EAS114_26:7:37:79:581 was loaded twice ## This becomes clearer if we use 'with.which_label=TRUE' to identify ## the region in 'which' where each element in 'gal5' originates from. gal5 <- readGAlignments(bamfile, use.names=TRUE, param=param, with.which_label=TRUE) gal5 ## Not surprisingly, we also get "duplicated record selection" when ## 'which' contains repeated or overlapping regions. Using the same ## regions as we did for 'gal4' above, except that now we're ## repeating the region on seq1: which <- RangesList(seq1=rep(IRanges(1000, 1100), 2), seq2=IRanges(c(1546, 1555, 1567), width=10)) param <- ScanBamParam(which=which) gal4b <- readGAlignments(bamfile, use.names=TRUE, param=param) length(gal4b) # > length(gal4), because all the records overlapping # with bases 1000 to 1100 on seq1 are now duplicated ## The "duplicated record selection" will artificially increase the ## coverage or affect other downstream results. It can be mitigated ## (but not completely eliminated) by first "reducing" the set of ## regions: which <- reduce(which) which param <- ScanBamParam(which=which) gal4c <- readGAlignments(bamfile, use.names=TRUE, param=param) length(gal4c) # < length(gal4), because the 2 first original regions # on seq2 were merged into a single one ## Note that reducing the set of regions didn't completely eliminate ## "duplicated record selection". Records that overlap the 2 reduced ## regions on seq2 (which$seq2) are loaded twice (like for 'gal5' ## above). See example D. below for how to completely eliminate ## "duplicated record selection". ## Using the 'param' arg to load tags. Except for MF and Aq, the tags ## specified below are predefined tags (see the SAM Spec for the list ## of predefined tags and their meaning). param <- ScanBamParam(tag=c("MF", "Aq", "NM", "UQ", "H0", "H1"), what="isize") gal6 <- readGAlignments(bamfile, param=param) mcols(gal6) # "tag" cols always after "what" cols ## With a BamViews object: fls <- system.file("extdata", "ex1.bam", package="Rsamtools", mustWork=TRUE) bv <- BamViews(fls, bamSamples=DataFrame(info="test", row.names="ex1"), auto.range=TRUE) ## Note that the "readGAlignments" method for BamViews objects ## requires the ShortRead package to be installed. aln <- readGAlignments(bv) aln aln[[1]] aln[colnames(bv)] mcols(aln) ## --------------------------------------------------------------------- ## B. readGAlignmentPairs() ## --------------------------------------------------------------------- galp1 <- readGAlignmentPairs(bamfile) head(galp1) names(galp1) ## Here we use the 'param' arg to filter by proper pair, drop PCR / ## optical duplicates, and drop secondary alignments. Filtering by ## proper pair and dropping secondary alignments can help make the ## pairing algorithm run significantly faster: param <- ScanBamParam(flag=scanBamFlag(isProperPair=TRUE, isDuplicate=FALSE, isSecondaryAlignment=FALSE)) galp2 <- readGAlignmentPairs(bamfile, use.names=TRUE, param=param) galp2 head(galp2) head(names(galp2)) ## --------------------------------------------------------------------- ## C. readGAlignmentsList() ## --------------------------------------------------------------------- library(pasillaBamSubset) ## 'file' as character. bam <- untreated3_chr4() galist1 <- readGAlignmentsList(bam) galist1[1:3] length(galist1) table(elementNROWS(galist1)) ## When 'file' is a BamFile, 'asMates' must be TRUE. If FALSE, ## the data are treated as single-end and each list element of the ## GAlignmentsList will be of length 1. For single-end data ## use readGAlignments(). bamfile <- BamFile(bam, yieldSize=3, asMates=TRUE) readGAlignmentsList(bamfile) ## Use a 'param' to fine tune the results. param <- ScanBamParam(flag=scanBamFlag(isProperPair=TRUE)) galist2 <- readGAlignmentsList(bam, param=param) length(galist2) ## --------------------------------------------------------------------- ## D. COMPARING 4 STRATEGIES FOR LOADING THE ALIGNMENTS THAT OVERLAP ## WITH THE EXONIC REGIONS ON FLY CHROMMOSOME 4 ## --------------------------------------------------------------------- library(pasillaBamSubset) bam <- untreated1_chr4() library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene ex <- exons(txdb) seqlevels(ex, pruning.mode="coarse") <- "chr4" length(ex) ## Some of the exons overlap with each other: isDisjoint(ex) # FALSE exonic_regions <- reduce(ex) isDisjoint(exonic_regions) # no more overlaps length(exonic_regions) ## Strategy #1: slow and loads a lot of records more than once (see ## "duplicated record selection" in example A. above). param1 <- ScanBamParam(which=ex) gal1 <- readGAlignments(bam, param=param1) length(gal1) # many "duplicated records" ## Strategy #2: faster and generates less duplicated records but ## doesn't eliminate them. param2 <- ScanBamParam(which=exonic_regions) gal2 <- readGAlignments(bam, param=param2) length(gal2) # less "duplicated records" ## Strategy #3: fast and completely eliminates duplicated records. gal0 <- readGAlignments(bam) gal3 <- subsetByOverlaps(gal0, exonic_regions, ignore.strand=TRUE) length(gal3) # no "duplicated records" ## Note that, in this case using 'exonic_regions' or 'ex' makes no ## difference: gal3b <- subsetByOverlaps(gal0, ex, ignore.strand=TRUE) stopifnot(identical(gal3, gal3b)) ## Strategy #4: strategy #3 however can require a lot of memory if the ## file is big because we load all the alignments into memory before we ## select those that overlap with the exonic regions. Strategy #4 ## addresses this by loading the file by chunks. bamfile <- BamFile(bam, yieldSize=50000) open(bamfile) while (length(chunk0 <- readGAlignments(bamfile))) { chunk <- subsetByOverlaps(chunk0, ex, ignore.strand=TRUE) cat("chunk0:", length(chunk0), "- chunk:", length(chunk), "\n") ## ... do something with 'chunk' ... } close(bamfile) ## --------------------------------------------------------------------- ## E. readGappedReads() ## --------------------------------------------------------------------- greads1 <- readGappedReads(bamfile) greads1 names(greads1) qseq(greads1) greads2 <- readGappedReads(bamfile, use.names=TRUE) head(greads2) head(names(greads2)) } \keyword{manip} GenomicAlignments/man/sequenceLayer.Rd0000644000175400017540000003312713175714431021066 0ustar00biocbuildbiocbuild\name{sequenceLayer} \alias{sequenceLayer} \title{Lay read sequences alongside the reference space, using their CIGARs} \description{ \code{sequenceLayer} can lay strings that belong to a given space (e.g. the \code{"query"} space) alongside another space (e.g. the \code{"reference"} space) by removing/injecting substrings from/into them, using the supplied CIGARs. Its primary use case is to lay the read sequences stored in a BAM file (which are considered to belong to the \code{"query"} space) alongside the \code{"reference"} space. It can also be used to remove the parts of the read sequences that correspond to soft-clipping. More generally it can lay strings that belong to any supported space alongside any other supported space. See the Details section below for the list of supported spaces. } \usage{ sequenceLayer(x, cigar, from="query", to="reference", D.letter="-", N.letter=".", I.letter="-", S.letter="+", H.letter="+") } \arguments{ \item{x}{ An \link{XStringSet} object containing strings that belong to a given space. } \item{cigar}{ A character vector or factor of the same length as \code{x} containing the extended CIGAR strings (one per element in \code{x}). } \item{from, to}{ A single string specifying one of the 8 supported spaces listed in the Details section below. \code{from} must be the current space (i.e. the space the strings in \code{x} belong to) and \code{to} is the space alonside which to lay the strings in \code{x}. } \item{D.letter, N.letter, I.letter, S.letter, H.letter}{ A single letter used as a filler for injections. More on this in the Details section below. } } \details{ The 8 supported spaces are: \code{"reference"}, \code{"reference-N-regions-removed"}, \code{"query"}, \code{"query-before-hard-clipping"}, \code{"query-after-soft-clipping"}, \code{"pairwise"}, \code{"pairwise-N-regions-removed"}, and \code{"pairwise-dense"}. Each space can be characterized by the extended CIGAR operations that are \emph{visible} in it. A CIGAR operation is said to be \emph{visible} in a given space if it "runs along it", that is, if it's associated with a block of contiguous positions in that space (the size of the block being the length of the operation). For example, the M/=/X operations are \emph{visible} in all spaces, the D/N operations are \emph{visible} in the \code{"reference"} space but not in the \code{"query"} space, the S operation is \emph{visible} in the \code{"query"} space but not in the \code{"reference"} or in the \code{"query-after-soft-clipping"} space, etc... Here are the extended CIGAR operations that are \emph{visible} in each space: \enumerate{ \item reference: M, D, N, =, X \item reference-N-regions-removed: M, D, =, X \item query: M, I, S, =, X \item query-before-hard-clipping: M, I, S, H, =, X \item query-after-soft-clipping: M, I, =, X \item pairwise: M, I, D, N, =, X \item pairwise-N-regions-removed: M, I, D, =, X \item pairwise-dense: M, =, X } \code{sequenceLayer} lays a string that belongs to one space alongside another by (1) removing the substrings associated with operations that are not \emph{visible} anymore in the new space, and (2) injecting substrings associated with operations that become \emph{visible} in the new space. Each injected substring has the length of the operation associated with it, and its content is controlled via the corresponding \code{*.letter} argument. For example, when going from the \code{"query"} space to the \code{"reference"} space (the default), the I- and S-substrings (i.e. the substrings associated with I/S operations) are removed, and substrings associated with D/N operations are injected. More precisely, the D-substrings are filled with the letter specified in \code{D.letter}, and the N-substrings with the letter specified in \code{N.letter}. The other \code{*.letter} arguments are ignored in that case. } \value{ An \link{XStringSet} object of the same class and length as \code{x}. } \author{Hervé Pagès} \seealso{ \itemize{ \item The \code{\link{stackStringsFromBam}} function for stacking the read sequences (or their quality strings) stored in a BAM file on a region of interest. \item The \code{\link{readGAlignments}} function for loading read sequences from a BAM file (via a \link{GAlignments} object). \item The \code{\link[Biostrings]{extractAt}} and \code{\link[Biostrings]{replaceAt}} functions in the \pkg{Biostrings} package for extracting/replacing arbitrary substrings from/in a string or set of strings. \item \link{cigar-utils} for the CIGAR utility functions used internally by \code{sequenceLayer}. } } \examples{ ## --------------------------------------------------------------------- ## A. FROM "query" TO "reference" SPACE ## --------------------------------------------------------------------- ## Load read sequences from a BAM file (they will be returned in a ## GAlignments object): bamfile <- system.file("extdata", "ex1.bam", package="Rsamtools") param <- ScanBamParam(what="seq") gal <- readGAlignments(bamfile, param=param) qseq <- mcols(gal)$seq # the read sequences (aka query sequences) ## Lay the query sequences alongside the reference space. This will ## remove the substrings associated with insertions to the reference ## (I operations) and soft clipping (S operations), and will inject new ## substrings (filled with "-") where deletions from the reference (D ## operations) and skipped regions from the reference (N operations) ## occurred during the alignment process: qseq_on_ref <- sequenceLayer(qseq, cigar(gal)) ## A typical use case for doing the above is to compute 1 consensus ## sequence per chromosome. The code below shows how this can be done ## in 2 extra steps. ## Step 1: Compute one consensus matrix per chromosome. qseq_on_ref_by_chrom <- splitAsList(qseq_on_ref, seqnames(gal)) pos_by_chrom <- splitAsList(start(gal), seqnames(gal)) cm_by_chrom <- lapply(names(pos_by_chrom), function(seqname) consensusMatrix(qseq_on_ref_by_chrom[[seqname]], as.prob=TRUE, shift=pos_by_chrom[[seqname]]-1, width=seqlengths(gal)[[seqname]])) names(cm_by_chrom) <- names(pos_by_chrom) ## 'cm_by_chrom' is a list of consensus matrices. Each matrix has 17 ## rows (1 per letter in the DNA alphabet) and 1 column per chromosome ## position. ## Step 2: Compute the consensus string from each consensus matrix. ## We'll put "+" in the strings wherever there is no coverage for that ## position, and "N" where there is coverage but no consensus. cs_by_chrom <- lapply(cm_by_chrom, function(cm) { ## Because consensusString() doesn't like consensus matrices ## with columns that contain only zeroes (and you will have ## columns like that for chromosome positions that don't ## receive any coverage), we need to "fix" 'cm' first. idx <- colSums(cm) == 0 cm["+", idx] <- 1 DNAString(consensusString(cm, ambiguityMap="N")) }) ## consensusString() provides some flexibility to let you extract ## the consensus in different ways. See '?consensusString' in the ## Biostrings package for the details. ## Finally, note that the read quality strings can also be used as ## input for sequenceLayer(): param <- ScanBamParam(what="qual") gal <- readGAlignments(bamfile, param=param) qual <- mcols(gal)$qual # the read quality strings qual_on_ref <- sequenceLayer(qual, cigar(gal)) ## Note that since the "-" letter is a valid quality code, there is ## no way to distinguish it from the "-" letters inserted by ## sequenceLayer(). ## --------------------------------------------------------------------- ## B. FROM "query" TO "query-after-soft-clipping" SPACE ## --------------------------------------------------------------------- ## Going from "query" to "query-after-soft-clipping" simply removes ## the substrings associated with soft clipping (S operations): qseq <- DNAStringSet(c("AAAGTTCGAA", "TTACGATTAN", "GGATAATTTT")) cigar <- c("3H10M", "2S7M1S2H", "2M1I1M3D2M4S") clipped_qseq <- sequenceLayer(qseq, cigar, from="query", to="query-after-soft-clipping") sequenceLayer(clipped_qseq, cigar, from="query-after-soft-clipping", to="query") sequenceLayer(clipped_qseq, cigar, from="query-after-soft-clipping", to="query", S.letter="-") ## --------------------------------------------------------------------- ## C. BRING QUERY AND REFERENCE SEQUENCES TO THE "pairwise" or ## "pairwise-dense" SPACE ## --------------------------------------------------------------------- ## Load read sequences from a BAM file: library(RNAseqData.HNRNPC.bam.chr14) bamfile <- RNAseqData.HNRNPC.bam.chr14_BAMFILES[1] param <- ScanBamParam(what="seq", which=GRanges("chr14", IRanges(1, 25000000))) gal <- readGAlignments(bamfile, param=param) qseq <- mcols(gal)$seq # the read sequences (aka query sequences) ## Load the corresponding reference sequences from the appropriate ## BSgenome package (the reads in RNAseqData.HNRNPC.bam.chr14 were ## aligned to hg19): library(BSgenome.Hsapiens.UCSC.hg19) rseq <- getSeq(Hsapiens, as(gal, "GRanges")) # the reference sequences ## Bring 'qseq' and 'rseq' to the "pairwise" space. ## For 'qseq', this will remove the substrings associated with soft ## clipping (S operations) and inject substrings (filled with "-") ## associated with deletions from the reference (D operations) and ## skipped regions from the reference (N operations). For 'rseq', this ## will inject substrings (filled with "-") associated with insertions ## to the reference (I operations). qseq2 <- sequenceLayer(qseq, cigar(gal), from="query", to="pairwise") rseq2 <- sequenceLayer(rseq, cigar(gal), from="reference", to="pairwise") ## Sanity check: 'qseq2' and 'rseq2' should have the same shape. stopifnot(identical(elementNROWS(qseq2), elementNROWS(rseq2))) ## A closer look at reads with insertions and deletions: cigar_op_table <- cigarOpTable(cigar(gal)) head(cigar_op_table) I_idx <- which(cigar_op_table[ , "I"] >= 2) # at least 2 insertions qseq2[I_idx] rseq2[I_idx] D_idx <- which(cigar_op_table[ , "D"] >= 2) # at least 2 deletions qseq2[D_idx] rseq2[D_idx] ## A closer look at reads with skipped regions: N_idx <- which(cigar_op_table[ , "N"] != 0) qseq2[N_idx] rseq2[N_idx] ## A variant of the "pairwise" space is the "pairwise-dense" space. ## In that space, all indels and skipped regions are removed from 'qseq' ## and 'rseq'. qseq3 <- sequenceLayer(qseq, cigar(gal), from="query", to="pairwise-dense") rseq3 <- sequenceLayer(rseq, cigar(gal), from="reference", to="pairwise-dense") ## Sanity check: 'qseq3' and 'rseq3' should have the same shape. stopifnot(identical(elementNROWS(qseq3), elementNROWS(rseq3))) ## Insertions were removed: qseq3[I_idx] rseq3[I_idx] ## Deletions were removed: qseq3[D_idx] rseq3[D_idx] ## Skipped regions were removed: qseq3[N_idx] rseq3[N_idx] ## --------------------------------------------------------------------- ## D. SANITY CHECKS ## --------------------------------------------------------------------- SPACES <- c("reference", "reference-N-regions-removed", "query", "query-before-hard-clipping", "query-after-soft-clipping", "pairwise", "pairwise-N-regions-removed", "pairwise-dense") cigarWidth <- list( function(cigar) cigarWidthAlongReferenceSpace(cigar), function(cigar) cigarWidthAlongReferenceSpace(cigar, N.regions.removed=TRUE), function(cigar) cigarWidthAlongQuerySpace(cigar), function(cigar) cigarWidthAlongQuerySpace(cigar, before.hard.clipping=TRUE), function(cigar) cigarWidthAlongQuerySpace(cigar, after.soft.clipping=TRUE), function(cigar) cigarWidthAlongPairwiseSpace(cigar), function(cigar) cigarWidthAlongPairwiseSpace(cigar, N.regions.removed=TRUE), function(cigar) cigarWidthAlongPairwiseSpace(cigar, dense=TRUE) ) cigar <- c("3H2S4M1D2M2I1M5N3M6H", "5M1I3M2D4M2S") seq <- list( BStringSet(c(A="AAAA-BBC.....DDD", B="AAAAABBB--CCCC")), BStringSet(c(A="AAAA-BBCDDD", B="AAAAABBB--CCCC")), BStringSet(c(A="++AAAABBiiCDDD", B="AAAAAiBBBCCCC++")), BStringSet(c(A="+++++AAAABBiiCDDD++++++", B="AAAAAiBBBCCCC++")), BStringSet(c(A="AAAABBiiCDDD", B="AAAAAiBBBCCCC")), BStringSet(c(A="AAAA-BBiiC.....DDD", B="AAAAAiBBB--CCCC")), BStringSet(c(A="AAAA-BBiiCDDD", B="AAAAAiBBB--CCCC")), BStringSet(c(A="AAAABBCDDD", B="AAAAABBBCCCC")) ) stopifnot(all(sapply(1:8, function(i) identical(width(seq[[i]]), cigarWidth[[i]](cigar)) ))) sequenceLayer2 <- function(x, cigar, from, to) sequenceLayer(x, cigar, from=from, to=to, I.letter="i") identical_XStringSet <- function(target, current) { ok1 <- identical(class(target), class(current)) ok2 <- identical(names(target), names(current)) ok3 <- all(target == current) ok1 && ok2 && ok3 } res <- sapply(1:8, function(i) { sapply(1:8, function(j) { target <- seq[[j]] current <- sequenceLayer2(seq[[i]], cigar, from=SPACES[i], to=SPACES[j]) identical_XStringSet(target, current) }) }) stopifnot(all(res)) } \keyword{methods} \keyword{manip} GenomicAlignments/man/setops-methods.Rd0000644000175400017540000000272713175714431021241 0ustar00biocbuildbiocbuild\name{setops-methods} \alias{setops-methods} \alias{pintersect} \alias{pintersect,GAlignments,GRanges-method} \alias{pintersect,GRanges,GAlignments-method} \title{Set operations on GAlignments objects} \description{ Performs set operations on \link{GAlignments} objects. NOTE: The \code{\link[IRanges]{pintersect}} generic function and method for \link[IRanges]{Ranges} objects is defined and documented in the \pkg{IRanges} package. Methods for \link[GenomicRanges]{GRanges} and \link[GenomicRanges]{GRangesList} objects are defined and documented in the \pkg{GenomicRanges} package. } \usage{ \S4method{pintersect}{GAlignments,GRanges}(x, y, ...) \S4method{pintersect}{GRanges,GAlignments}(x, y, ...) } \arguments{ \item{x, y}{ A \link{GAlignments} object and a \link[GenomicRanges]{GRanges} object. They must have the same length. } \item{...}{ Further arguments to be passed to or from other methods. } } \value{ A \link{GAlignments} object \emph{parallel} to (i.e. same length as) \code{x} and \code{y}. } \seealso{ \itemize{ \item The \link{GAlignments} class. \item The \link[GenomicRanges]{setops-methods} man page in the \pkg{GenomicRanges} package. } } \examples{ ## Parallel intersection of a GAlignments and a GRanges object: bamfile <- system.file("extdata", "ex1.bam", package="Rsamtools") gal <- readGAlignments(bamfile) pintersect(gal, shift(as(gal, "GRanges"), 6L)) } \keyword{methods} \keyword{utilities} GenomicAlignments/man/stackStringsFromBam.Rd0000644000175400017540000002126413175714431022203 0ustar00biocbuildbiocbuild\name{stackStringsFromBam} \alias{stackStringsFromBam} \alias{alphabetFrequencyFromBam} \title{Stack the read sequences stored in a BAM file on a region of interest} \description{ \code{stackStringsFromBam} stacks the read sequences (or their quality strings) stored in a BAM file over a user-specified region. \code{alphabetFrequencyFromBam} computes the alphabet frequency of the reads over a user-specified region. Both functions take into account the CIGAR of each read to "lay" the read sequence (or its quality string) alongside the reference space. This step ensures that each nucleotide in a read is associated with the correct position on the reference sequence. } \usage{ stackStringsFromBam(file, index=file, param, what="seq", use.names=FALSE, D.letter="-", N.letter=".", Lpadding.letter="+", Rpadding.letter="+") alphabetFrequencyFromBam(file, index=file, param, what="seq", ...) } \arguments{ \item{file, index}{ The path to the BAM file to read, and to the index file of the BAM file to read, respectively. The latter is given \emph{without} the '.bai' extension. See \code{\link{scanBam}} for more information. } \item{param}{ A \link{ScanBamParam} object containing exactly 1 genomic region (i.e. \code{unlist(bamWhich(param))} must have length 1). Alternatively, \code{param} can be a \link[GenomicRanges]{GRanges} or \link[IRanges]{RangesList} object containing exactly 1 genomic region (the strand will be ignored in case of a \link[GenomicRanges]{GRanges} object), or a character string specifying a single genomic region (in the \code{"chr14:5201-5300"} format). } \item{what}{ A single string. Either \code{"seq"} or \code{"qual"}. If \code{"seq"} (the default), the read sequences will be stacked. If \code{"qual"}, the read quality strings will be stacked. } \item{use.names}{ Use the query template names (QNAME field) as the names of the returned object? If not (the default), then the returned object has no names. } \item{D.letter, N.letter}{ A single letter used as a filler for injections. The 2 arguments are passed down to the \code{\link{sequenceLayer}} function. See \code{?\link{sequenceLayer}} for more details. } \item{Lpadding.letter, Rpadding.letter}{ A single letter to use for padding the sequences on the left, and another one to use for padding on the right. The 2 arguments are passed down to the \code{\link[Biostrings]{stackStrings}} function defined in the \pkg{Biostrings} package. See \code{?\link[Biostrings]{stackStrings}} in the \pkg{Biostrings} package for more details. } \item{...}{ Further arguments to be passed to \link[Biostrings]{alphabetFrequency}. } } \details{ \code{stackStringsFromBam} performs the 3 following steps: \enumerate{ \item Load the read sequences (or their quality strings) from the BAM file. Only the read sequences that overlap with the specified region are loaded. This is done with the \code{\link{readGAlignments}} function. Note that if the file contains paired-end reads, the pairing is ignored. \item Lay the sequences alongside the reference space, using their CIGARs. This is done with the \code{\link{sequenceLayer}} function. \item Stack them on the specified region. This is done with the \code{\link[Biostrings]{stackStrings}} function defined in the \pkg{Biostrings} package. } \code{alphabetFrequencyFromBam} also performs steps 1. and 2. but, instead of stacking the sequences at step 3., it computes the nucleotide frequencies for each genomic position in the specified region. } \value{ For \code{stackStringsFromBam}: A rectangular (i.e. constant-width) \link[Biostrings]{DNAStringSet} object (if \code{what} is \code{"seq"}) or \link[Biostrings]{BStringSet} object (if \code{what} is \code{"qual"}). For \code{alphabetFrequencyFromBam}: By default a matrix like one returned by \code{\link[Biostrings]{alphabetFrequency}}. The matrix has 1 row per nucleotide position in the specified region. } \note{ TWO IMPORTANT CAVEATS ABOUT \code{stackStringsFromBam}: Specifying a big genomic region, say >= 100000 bp, can require a lot of memory (especially with high coverage reads) and is not recommended. See the \code{\link{pileLettersAt}} function for piling the read letters on top of a set of genomic positions, which is more flexible and more memory efficient. Paired-end reads are treated as single-end reads (i.e. they're not paired). } \author{Hervé Pagès} \seealso{ \itemize{ \item The \code{\link{pileLettersAt}} function for piling the letters of a set of aligned reads on top of a set of genomic positions. \item The \code{\link{readGAlignments}} function for loading read sequences (or their quality strings) from a BAM file (via a \link{GAlignments} object). \item The \code{\link{sequenceLayer}} function for laying read sequences alongside the reference space, using their CIGARs. \item The \code{\link[Biostrings]{stackStrings}} function in the \pkg{Biostrings} package for stacking an arbitrary \link[Biostrings]{XStringSet} object. \item The \code{\link[Biostrings]{alphabetFrequency}} function in the \pkg{Biostrings} package. \item The SAMtools mpileup command available at \url{http://samtools.sourceforge.net/} as part of the SAMtools project. } } \examples{ ## --------------------------------------------------------------------- ## A. EXAMPLE WITH TOY DATA ## --------------------------------------------------------------------- bamfile1 <- BamFile(system.file("extdata", "ex1.bam", package="Rsamtools")) region1 <- GRanges("seq1", IRanges(1, 60)) # region of interest ## Stack the read sequences: stackStringsFromBam(bamfile1, param=region1) ## Compute the "consensus matrix" (1 column per nucleotide position ## in the region of interest): af <- alphabetFrequencyFromBam(bamfile1, param=region1, baseOnly=TRUE) cm1a <- t(af[ , DNA_BASES]) cm1a ## Stack their quality strings: stackStringsFromBam(bamfile1, param=region1, what="qual") ## Control the number of reads to display: options(showHeadLines=18) options(showTailLines=6) stackStringsFromBam(bamfile1, param=GRanges("seq1", IRanges(61, 120))) stacked_qseq <- stackStringsFromBam(bamfile1, param="seq2:1509-1519") stacked_qseq # deletion in read 13 af <- alphabetFrequencyFromBam(bamfile1, param="seq2:1509-1519", baseOnly=TRUE) cm1b <- t(af[ , DNA_BASES]) # consensus matrix cm1b ## Sanity check: stopifnot(identical(consensusMatrix(stacked_qseq)[DNA_BASES, ], cm1b)) stackStringsFromBam(bamfile1, param="seq2:1509-1519", what="qual") ## --------------------------------------------------------------------- ## B. EXAMPLE WITH REAL DATA ## --------------------------------------------------------------------- library(RNAseqData.HNRNPC.bam.chr14) bamfile2 <- BamFile(RNAseqData.HNRNPC.bam.chr14_BAMFILES[1]) ## Region of interest: region2 <- GRanges("chr14", IRanges(19650095, 19650159)) readGAlignments(bamfile2, param=ScanBamParam(which=region2)) stackStringsFromBam(bamfile2, param=region2) af <- alphabetFrequencyFromBam(bamfile2, param=region2, baseOnly=TRUE) cm2 <- t(af[ , DNA_BASES]) # consensus matrix cm2 ## --------------------------------------------------------------------- ## C. COMPUTE READ CONSENSUS SEQUENCE FOR REGION OF INTEREST ## --------------------------------------------------------------------- ## Let's write our own little naive function to go from consensus matrix ## to consensus sequence. For each nucleotide position in the region of ## interest (i.e. each column in the matrix), we select the letter with ## highest frequency. We also use special letter "*" at positions where ## there is a tie, and special letter "." at positions where all the ## frequencies are 0 (a particular type of tie): cm_to_cs <- function(cm) { stopifnot(is.matrix(cm)) nr <- nrow(cm) rnames <- rownames(cm) stopifnot(!is.null(rnames) && all(nchar(rnames) == 1L)) selection <- apply(cm, 2, function(x) { i <- which.max(x) if (x[i] == 0L) return(nr + 1L) if (sum(x == x[i]) != 1L) return(nr + 2L) i }) paste0(c(rnames, ".", "*")[selection], collapse="") } cm_to_cs(cm1a) cm_to_cs(cm1b) cm_to_cs(cm2) ## Note that the consensus sequences we obtain are relative to the ## plus strand of the reference sequence. } \keyword{methods} \keyword{manip} GenomicAlignments/man/summarizeOverlaps-methods.Rd0000644000175400017540000006036213175714431023453 0ustar00biocbuildbiocbuild\name{summarizeOverlaps-methods} \alias{summarizeOverlaps-methods} \alias{summarizeOverlaps} \alias{summarizeOverlaps,GRanges,GAlignments-method} \alias{summarizeOverlaps,GRangesList,GAlignments-method} \alias{summarizeOverlaps,GRanges,GAlignmentsList-method} \alias{summarizeOverlaps,GRangesList,GAlignmentsList-method} \alias{summarizeOverlaps,GRanges,GAlignmentPairs-method} \alias{summarizeOverlaps,GRangesList,GAlignmentPairs-method} \alias{summarizeOverlaps,GRanges,GRanges-method} \alias{summarizeOverlaps,GRangesList,GRanges-method} \alias{summarizeOverlaps,GRanges,GRangesList-method} \alias{summarizeOverlaps,GRangesList,GRangesList-method} \alias{Union} \alias{IntersectionStrict} \alias{IntersectionNotEmpty} \alias{summarizeOverlaps,GRanges,BamFile-method} \alias{summarizeOverlaps,GRangesList,BamFile-method} \alias{summarizeOverlaps,GRanges,character-method} \alias{summarizeOverlaps,GRangesList,character-method} \alias{summarizeOverlaps,GRanges,BamFileList-method} \alias{summarizeOverlaps,GRangesList,BamFileList-method} \alias{summarizeOverlaps,BamViews,missing-method} \title{Perform overlap queries between reads and genomic features} \description{ \code{summarizeOverlaps} extends \code{findOverlaps} by providing options to resolve reads that overlap multiple features. } \usage{ \S4method{summarizeOverlaps}{GRanges,GAlignments}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) \S4method{summarizeOverlaps}{GRangesList,GAlignments}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) \S4method{summarizeOverlaps}{GRanges,GRanges}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) \S4method{summarizeOverlaps}{GRangesList,GRanges}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) \S4method{summarizeOverlaps}{GRanges,GAlignmentPairs}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) \S4method{summarizeOverlaps}{GRangesList,GAlignmentPairs}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, preprocess.reads=NULL, ...) ## mode funtions Union(features, reads, ignore.strand=FALSE, inter.feature=TRUE) IntersectionStrict(features, reads, ignore.strand=FALSE, inter.feature=TRUE) IntersectionNotEmpty(features, reads, ignore.strand=FALSE, inter.feature=TRUE) \S4method{summarizeOverlaps}{GRanges,BamFile}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) \S4method{summarizeOverlaps}{BamViews,missing}( features, reads, mode=Union, ignore.strand=FALSE, inter.feature=TRUE, singleEnd=TRUE, fragments=FALSE, param=ScanBamParam(), preprocess.reads=NULL, ...) } \arguments{ \item{features}{ A \link[GenomicRanges]{GRanges} or a \link[GenomicRanges]{GRangesList} object of genomic regions of interest. When a \link[GenomicRanges]{GRanges} is supplied, each row is considered a feature. When a \link[GenomicRanges]{GRangesList} is supplied, each higher list-level is considered a feature. This distinction is important when defining overlaps. When \code{features} is a \link[Rsamtools]{BamViews} the \code{reads} argument is missing. Features are extracted from the \code{bamRanges} and the \code{reads} from \code{bamPaths}. Metadata from \code{bamPaths} and \code{bamSamples} are stored in the \code{colData} of the resulting \link[SummarizedExperiment]{RangedSummarizedExperiment} object. \code{bamExperiment} metadata are stored in the \code{metadata} slot. } \item{reads}{ A \link[GenomicRanges]{GRanges}, \link[GenomicRanges]{GRangesList} \link{GAlignments}, \link{GAlignmentsList}, \link{GAlignmentPairs}, \link[Rsamtools]{BamViews} or \link[Rsamtools]{BamFileList} object that represents the data to be counted by \code{summarizeOverlaps}. \code{reads} is missing when a \link[Rsamtools]{BamViews} object is the only argument supplied to \code{summarizeOverlaps}. \code{reads} are the files specified in \code{bamPaths} of the \link[Rsamtools]{BamViews} object. } \item{mode}{ \code{mode} can be one of the pre-defined count methods such as "Union", "IntersectionStrict", or "IntersectionNotEmpty" or it a user supplied count function. For a custom count function, the input arguments must match those of the pre-defined options and the function must return a vector of counts the same length as the annotation ('features' argument). See examples for details. The pre-defined options are designed after the counting modes available in the HTSeq package by Simon Anders (see references). \itemize{ \item "Union" : (Default) Reads that overlap any portion of exactly one feature are counted. Reads that overlap multiple features are discarded. This is the most conservative of the 3 modes. \item "IntersectionStrict" : A read must fall completely "within" the feature to be counted. If a read overlaps multiple features but falls "within" only one, the read is counted for that feature. If the read is "within" multiple features, the read is discarded. \item "IntersectionNotEmpty" : A read must fall in a unique disjoint region of a feature to be counted. When a read overlaps multiple features, the features are partitioned into disjoint intervals. Regions that are shared between the features are discarded leaving only the unique disjoint regions. If the read overlaps one of these remaining regions, it is assigned to the feature the unique disjoint region came from. \item user supplied function : A function can be supplied as the \code{mode} argument. It must (1) have arguments that correspond to \code{features}, \code{reads}, \code{ignore.strand} and \code{inter.feature} arguments (as in the defined mode functions) and (2) return a vector of counts the same length as \code{features}. } } \item{ignore.strand}{ A logical indicating if strand should be considered when matching. } \item{inter.feature}{ (Default TRUE) A logical indicating if the counting \code{mode} should be aware of overlapping features. When TRUE (default), reads mapping to multiple features are dropped (i.e., not counted). When FALSE, these reads are retained and a count is assigned to each feature they map to. There are 6 possible combinations of the \code{mode} and \code{inter.feature} arguments. When \code{inter.feature=FALSE} the behavior of modes \sQuote{Union} and \sQuote{IntersectionStrict} are essentially \sQuote{countOverlaps} with \sQuote{type=any} and \code{type=within}, respectively. \sQuote{IntersectionNotEmpty} does not reduce to a simple countOverlaps because common (shared) regions of the annotation are removed before counting. } \item{preprocess.reads}{ A function applied to the reads before counting. The first argument should be \code{reads} and the return value should be an object compatible with the \code{reads} argument to the counting modes, Union, IntersectionStrict and IntersectionNotEmpty. The distinction between a user-defined 'mode' and user-defined 'preprocess.reads' function is that in the first case the user defines how to count; in the second case the reads are preprocessed before counting with a pre-defined mode. See examples. } \item{...}{ Additional arguments passed to functions or methods called from within \code{summarizeOverlaps}. For BAM file methods arguments may include \code{singleEnd}, \code{fragments} or \code{param} which apply to reading records from a file (see below). Providing \code{count.mapped.reads=TRUE} include additional passes through the BAM file to collect statistics similar to those from \code{countBam}. A \code{BPPARAM} argument can be passed down to the \code{bplapply} called by \code{summarizeOverlaps}. The argument can be MulticoreParam(), SnowParam(), BatchJobsParam() or DoparParam(). See the BiocParallel package for details in specifying the params. } \item{singleEnd}{ (Default TRUE) A logical indicating if reads are single or paired-end. In Bioconductor > 2.12 it is not necessary to sort paired-end BAM files by \code{qname}. When counting with \code{summarizeOverlaps}, setting \code{singleEnd=FALSE} will trigger paired-end reading and counting. It is fine to also set \code{asMates=TRUE} in the \code{BamFile} but is not necessary when \code{singleEnd=FALSE}. } \item{fragments}{ (Default FALSE) A logical; applied to paired-end data only. \code{fragments} controls which function is used to read the data which subsequently affects which records are included in counting. When \code{fragments=FALSE}, data are read with \code{\link{readGAlignmentPairs}} and returned in a \code{GAlignmentPairs} class. In this case, singletons, reads with unmapped pairs, and other fragments, are dropped. When \code{fragments=TRUE}, data are read with \code{\link{readGAlignmentsList}} and returned in a \code{GAlignmentsList} class. This class holds \sQuote{mated pairs} as well as same-strand pairs, singletons, reads with unmapped pairs and other fragments. Because more records are kept, generally counts will be higher when \code{fragments=TRUE}. The term \sQuote{mated pairs} refers to records paired with the algorithm described on the \code{?\link{readGAlignmentsList}} man page. } \item{param}{An optional \code{\link[Rsamtools]{ScanBamParam}} instance to further influence scanning, counting, or filtering. See \code{?\link{BamFile}} for details of how records are returned when both \code{yieldSize} is specified in a \code{\link{BamFile}} and \code{which} is defined in a \code{\link{ScanBamParam}}. } } \details{ \describe{ \item{}{\code{summarizeOverlaps} offers counting modes to resolve reads that overlap multiple features. The \code{mode} argument defines a set of rules to resolve the read to a single feature such that each read is counted a maximum of once. New to GenomicRanges >= 1.13.9 is the \code{inter.feature} argument which allows reads to be counted for each feature they overlap. When \code{inter.feature=TRUE} the counting modes are aware of feature overlap; reads that overlap multiple features are dropped and not counted. When \code{inter.feature=FALSE} multiple feature overlap is ignored and reads are counted once for each feature they map to. This essentially reduces modes \sQuote{Union} and \sQuote{IntersectionStrict} to \code{countOverlaps} with \code{type="any"}, and \code{type="within"}, respectively. \sQuote{IntersectionNotEmpty} is not reduced to a derivative of \code{countOverlaps} because the shared regions are removed before counting. The \code{BamViews}, \code{BamFile} and \code{BamFileList} methods summarize overlaps across one or several files. The latter uses \code{bplapply}; control parallel evaluation using the \code{\link{register}} interface in the \pkg{BiocParallel} package. } \item{features :}{ A \sQuote{feature} can be any portion of a genomic region such as a gene, transcript, exon etc. When the \code{features} argument is a \link[GenomicRanges]{GRanges} the rows define the features. The result will be the same length as the \link[GenomicRanges]{GRanges}. When \code{features} is a \link[GenomicRanges]{GRangesList} the highest list-level defines the features and the result will be the same length as the \link[GenomicRanges]{GRangesList}. When \code{inter.feature=TRUE}, each count \code{mode} attempts to assign a read that overlaps multiple features to a single feature. If there are ranges that should be considered together (e.g., exons by transcript or cds regions by gene) the \link[GenomicRanges]{GRangesList} would be appropriate. If there is no grouping in the data then a \link[GenomicRanges]{GRanges} would be appropriate. } \item{paired-end reads :}{ Paired-end reads are counted as a single hit if one or both parts of the pair are overlapped. Paired-end records can be counted in a \link{GAlignmentPairs} container or BAM file. Counting pairs in BAM files: \itemize{ \item{The \code{singleEnd} argument should be FALSE.} \item{When \code{reads} are supplied as a BamFile or BamFileList, the \code{asMates} argument to the BamFile should be TRUE.} \item{When \code{fragments} is FALSE, a \code{GAlignmentPairs} object is used in counting (pairs only).} \item{When \code{fragments} is TRUE, a \code{GAlignmentsList} object is used in counting (pairs, singletons, unmapped mates, etc.)} } } } } \value{ A \link[SummarizedExperiment]{RangedSummarizedExperiment} object. The \code{assays} slot holds the counts, \code{rowRanges} holds the annotation from \code{features}. When \code{reads} is a \code{BamFile} or \code{BamFileList} \code{colData} is an empty DataFrame with a single row named \sQuote{counts}. If \code{count.mapped.reads=TRUE}, \code{colData} holds the output of \code{countBam} in 3 columns named \sQuote{records} (total records), \sQuote{nucleotides} and \sQuote{mapped} (mapped records). When \code{features} is a \code{BamViews} \code{colData} includes 2 columns named \code{bamSamples} and \code{bamIndices}. In all other cases, \code{colData} has columns of \sQuote{object} (class of reads) and \sQuote{records} (length of \code{reads}). } \references{ HTSeq : \url{http://www-huber.embl.de/users/anders/HTSeq/doc/overview.html} htseq-count : \url{http://www-huber.embl.de/users/anders/HTSeq/doc/count.html} } \author{Valerie Obenchain } \seealso{ \itemize{ \item The \pkg{DESeq2}, \pkg{DEXSeq} and \pkg{edgeR} packages. \item The \link[SummarizedExperiment]{RangedSummarizedExperiment} class defined in the \pkg{SummarizedExperiment} package. \item The \link{GAlignments} and \link{GAlignmentPairs} classes. \item The \link[Rsamtools]{BamFileList} and \link[Rsamtools]{BamViews} classes in the \pkg{Rsamtools} package. \item The \link{readGAlignments} and \link{readGAlignmentPairs} functions. } } \examples{ reads <- GAlignments( names = c("a","b","c","d","e","f","g"), seqnames = Rle(c(rep(c("chr1", "chr2"), 3), "chr1")), pos = as.integer(c(1400, 2700, 3400, 7100, 4000, 3100, 5200)), cigar = c("500M", "100M", "300M", "500M", "300M", "50M200N50M", "50M150N50M"), strand = strand(rep("+", 7))) gr <- GRanges( seqnames = c(rep("chr1", 7), rep("chr2", 4)), strand = "+", ranges = IRanges(c(1000, 3000, 3600, 4000, 4000, 5000, 5400, 2000, 3000, 7000, 7500), width = c(500, 500, 300, 500, 900, 500, 500, 900, 500, 600, 300), names=c("A", "B", "C1", "C2", "D1", "D2", "E", "F", "G", "H1", "H2"))) groups <- factor(c(1,2,3,3,4,4,5,6,7,8,8)) grl <- splitAsList(gr, groups) names(grl) <- LETTERS[seq_along(grl)] ## --------------------------------------------------------------------- ## Counting modes. ## --------------------------------------------------------------------- ## First count with a GRanges as the 'features'. 'Union' is the ## most conservative counting mode followed by 'IntersectionStrict' ## then 'IntersectionNotEmpty'. counts1 <- data.frame(union=assays(summarizeOverlaps(gr, reads))$counts, intStrict=assays(summarizeOverlaps(gr, reads, mode="IntersectionStrict"))$counts, intNotEmpty=assays(summarizeOverlaps(gr, reads, mode="IntersectionNotEmpty"))$counts) colSums(counts1) ## Split the 'features' into a GRangesList and count again. counts2 <- data.frame(union=assays(summarizeOverlaps(grl, reads))$counts, intStrict=assays(summarizeOverlaps(grl, reads, mode="IntersectionStrict"))$counts, intNotEmpty=assays(summarizeOverlaps(grl, reads, mode="IntersectionNotEmpty"))$counts) colSums(counts2) ## The GRangesList ('grl' object) has 8 features whereas the GRanges ## ('gr' object) has 11. The affect on counting can be seen by looking ## at feature 'H' with mode 'Union'. In the GRanges this feature is ## represented by ranges 'H1' and 'H2', gr[c("H1", "H2")] ## and by list element 'H' in the GRangesList, grl["H"] ## Read "d" hits both 'H1' and 'H2'. This is considered a multi-hit when ## using a GRanges (each range is a separate feature) so the read was ## dropped and not counted. counts1[c("H1", "H2"), ] ## When using a GRangesList, each list element is considered a feature. ## The read hits multiple ranges within list element 'H' but only one ## list element. This is not considered a multi-hit so the read is counted. counts2["H", ] ## --------------------------------------------------------------------- ## Counting multi-hit reads. ## --------------------------------------------------------------------- ## The goal of the counting modes is to provide a set of rules that ## resolve reads hitting multiple features so each read is counted ## a maximum of once. However, sometimes it may be desirable to count ## a read for each feature it overlaps. This can be accomplished by ## setting 'inter.feature' to FALSE. ## When 'inter.feature=FALSE', modes 'Union' and 'IntersectionStrict' ## essentially reduce to countOverlaps() with type="any" and ## type="within", respectively. ## When 'inter.feature=TRUE' only features "A", "F" and "G" have counts. se1 <- summarizeOverlaps(gr, reads, mode="Union", inter.feature=TRUE) assays(se1)$counts ## When 'inter.feature=FALSE' all 11 features have a count. There are ## 7 total reads so one or more reads were counted more than once. se2 <- summarizeOverlaps(gr, reads, mode="Union", inter.feature=FALSE) assays(se2)$counts ## --------------------------------------------------------------------- ## Counting BAM files. ## --------------------------------------------------------------------- library(pasillaBamSubset) library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) exbygene <- exonsBy(TxDb.Dmelanogaster.UCSC.dm3.ensGene, "gene") ## (i) Single-end : ## Large files can be iterated over in chunks by setting a ## 'yieldSize' on the BamFile. bf_s <- BamFile(untreated1_chr4(), yieldSize=50000) se_s <- summarizeOverlaps(exbygene, bf_s, singleEnd=TRUE) table(assays(se_s)$counts > 0) ## When a character (file name) is provided as 'reads' instead ## of a BamFile object summarizeOverlaps() will create a BamFile ## and set a reasonable default 'yieldSize'. ## (ii) Paired-end : ## A paired-end file may contain singletons, reads with unmapped ## pairs or reads with more than two fragments. When 'fragments=FALSE' ## only reads paired by the algorithm are included in the counting. nofrag <- summarizeOverlaps(exbygene, untreated3_chr4(), singleEnd=FALSE, fragments=FALSE) table(assays(nofrag)$counts > 0) ## When 'fragments=TRUE' all singletons, reads with unmapped pairs ## and other fragments will be included in the counting. bf <- BamFile(untreated3_chr4(), asMates=TRUE) frag <- summarizeOverlaps(exbygene, bf, singleEnd=FALSE, fragments=TRUE) table(assays(frag)$counts > 0) ## As expected, using 'fragments=TRUE' results in a larger number ## of total counts because singletons, unmapped pairs etc. are ## included in the counting. ## Total reads in the file: countBam(untreated3_chr4()) ## Reads counted with 'fragments=FALSE': sum(assays(nofrag)$counts) ## Reads counted with 'fragments=TRUE': sum(assays(frag)$counts) ## --------------------------------------------------------------------- ## Use ouput of summarizeOverlaps() for differential expression analysis ## with DESeq2 or edgeR. ## --------------------------------------------------------------------- fls <- list.files(system.file("extdata", package="GenomicAlignments"), recursive=TRUE, pattern="*bam$", full=TRUE) names(fls) <- basename(fls) bf <- BamFileList(fls, index=character(), yieldSize=1000) genes <- GRanges( seqnames = c(rep("chr2L", 4), rep("chr2R", 5), rep("chr3L", 2)), ranges = IRanges(c(1000, 3000, 4000, 7000, 2000, 3000, 3600, 4000, 7500, 5000, 5400), width=c(rep(500, 3), 600, 900, 500, 300, 900, 300, 500, 500))) se <- summarizeOverlaps(genes, bf) ## When the reads are BAM files, the 'colData' contains summary ## information from a call to countBam(). colData(se) ## Start differential expression analysis with the DESeq2 or edgeR ## package: library(DESeq2) deseq <- DESeqDataSet(se, design= ~ 1) library(edgeR) edger <- DGEList(assays(se)$counts, group=rownames(colData(se))) ## --------------------------------------------------------------------- ## Filter records by map quality before counting. ## (user-supplied 'mode' function) ## --------------------------------------------------------------------- ## The 'mode' argument can take a custom count function whose ## arguments are the same as those in the current counting modes ## (i.e., Union, IntersectionNotEmpty, IntersectionStrict). ## In this example records are filtered by map quality before counting. mapq_filter <- function(features, reads, ignore.strand, inter.feature) { require(GenomicAlignments) # needed for parallel evaluation Union(features, reads[mcols(reads)$mapq >= 20], ignore.strand, inter.feature) } genes <- GRanges("seq1", IRanges(seq(1, 1500, by=200), width=100)) param <- ScanBamParam(what="mapq") fl <- system.file("extdata", "ex1.bam", package="Rsamtools") se <- summarizeOverlaps(genes, fl, mode=mapq_filter, param=param) assays(se)$counts ## The count function can be completely custom (i.e., not use the ## pre-defined count functions at all). Requirements are that ## the input arguments match the pre-defined modes and the output ## is a vector of counts the same length as 'features'. my_count <- function(features, reads, ignore.strand, inter.feature) { ## perform filtering, or subsetting etc. require(GenomicAlignments) # needed for parallel evaluation countOverlaps(features, reads) } ## --------------------------------------------------------------------- ## Preprocessing reads before counting with a standard count mode. ## (user-supplied 'preprocess.reads' function) ## --------------------------------------------------------------------- ## The 'preprocess.reads' argument takes a function that is ## applied to the reads before counting with a pre-defined mode. ResizeReads <- function(reads, width=1, fix="start", ...) { reads <- as(reads, "GRanges") stopifnot(all(strand(reads) != "*")) resize(reads, width=width, fix=fix, ...) } ## By default ResizeReads() counts reads that overlap on the 5' end: summarizeOverlaps(grl, reads, mode=Union, preprocess.reads=ResizeReads) ## Count reads that overlap on the 3' end by passing new values ## for 'width' and 'fix': summarizeOverlaps(grl, reads, mode=Union, preprocess.reads=ResizeReads, width=1, fix="end") ## --------------------------------------------------------------------- ## summarizeOverlaps() with BamViews. ## --------------------------------------------------------------------- ## bamSamples and bamPaths metadata are included in the colData. ## bamExperiment metadata is put into the metadata slot. fl <- system.file("extdata", "ex1.bam", package="Rsamtools", mustWork=TRUE) rngs <- GRanges(c("seq1", "seq2"), IRanges(1, c(1575, 1584))) samp <- DataFrame(info="test", row.names="ex1") view <- BamViews(fl, bamSamples=samp, bamRanges=rngs) se <- summarizeOverlaps(view, mode=Union, ignore.strand=TRUE) colData(se) metadata(se) } \keyword{methods} \keyword{utilities} GenomicAlignments/src/0000755000175400017540000000000013203700454015770 5ustar00biocbuildbiocbuildGenomicAlignments/src/GenomicAlignments.h0000644000175400017540000000335513203700454021552 0ustar00biocbuildbiocbuild#include /* cigar_utils.c */ const char *_get_cigar_parsing_error(); int _next_cigar_OP( const char *cigar_string, int offset, char *OP, int *OPL ); SEXP valid_cigar( SEXP cigar, SEXP ans_type ); SEXP explode_cigar_ops( SEXP cigar, SEXP ops ); SEXP explode_cigar_op_lengths( SEXP cigar, SEXP ops ); SEXP cigar_op_table(SEXP cigar); SEXP cigar_ranges( SEXP cigar, SEXP flag, SEXP space, SEXP pos, SEXP f, SEXP ops, SEXP drop_empty_ranges, SEXP reduce_ranges, SEXP with_ops ); SEXP cigar_width( SEXP cigar, SEXP flag, SEXP space ); SEXP cigar_narrow( SEXP cigar, SEXP left_width, SEXP right_width ); SEXP cigar_qnarrow( SEXP cigar, SEXP left_qwidth, SEXP right_qwidth ); /* coordinate_mapping_methods.c */ SEXP map_query_locs_to_ref_locs( SEXP start, SEXP end, SEXP cigar, SEXP pos ); SEXP map_ref_locs_to_query_locs( SEXP start, SEXP end, SEXP cigar, SEXP pos ); SEXP ref_locs_to_query_locs( SEXP ref_locs, SEXP cigar, SEXP pos, SEXP narrow_left ); SEXP query_locs_to_ref_locs( SEXP query_locs, SEXP cigar, SEXP pos, SEXP narrow_left ); /* encodeOverlaps_methods.c */ SEXP encode_overlaps1( SEXP query_start, SEXP query_width, SEXP query_space, SEXP query_break, SEXP flip_query, SEXP subject_start, SEXP subject_width, SEXP subject_space, SEXP as_matrix, SEXP as_raw ); SEXP RangesList_encode_overlaps( SEXP query_starts, SEXP query_widths, SEXP query_spaces, SEXP query_breaks, SEXP subject_starts, SEXP subject_widths, SEXP subject_spaces ); SEXP Hits_encode_overlaps( SEXP query_starts, SEXP query_widths, SEXP query_spaces, SEXP query_breaks, SEXP subject_starts, SEXP subject_widths, SEXP subject_spaces, SEXP query_hits, SEXP subject_hits, SEXP flip_query ); GenomicAlignments/src/IRanges_stubs.c0000644000175400017540000000003413203700454020701 0ustar00biocbuildbiocbuild#include "_IRanges_stubs.c" GenomicAlignments/src/R_init_GenomicAlignments.c0000644000175400017540000000221413203700454023042 0ustar00biocbuildbiocbuild#include "GenomicAlignments.h" #include #define CALLMETHOD_DEF(fun, numArgs) {#fun, (DL_FUNC) &fun, numArgs} #define REGISTER_CCALLABLE(fun) \ R_RegisterCCallable("GenomicAlignments", #fun, (DL_FUNC) &fun) static const R_CallMethodDef callMethods[] = { /* cigar_utils.c */ CALLMETHOD_DEF(valid_cigar, 2), CALLMETHOD_DEF(explode_cigar_ops, 2), CALLMETHOD_DEF(explode_cigar_op_lengths, 2), CALLMETHOD_DEF(cigar_op_table, 1), CALLMETHOD_DEF(cigar_ranges, 9), CALLMETHOD_DEF(cigar_width, 3), CALLMETHOD_DEF(cigar_narrow, 3), CALLMETHOD_DEF(cigar_qnarrow, 3), /* mapping_methods.c */ CALLMETHOD_DEF(map_query_locs_to_ref_locs, 4), CALLMETHOD_DEF(map_ref_locs_to_query_locs, 4), CALLMETHOD_DEF(ref_locs_to_query_locs, 4), CALLMETHOD_DEF(query_locs_to_ref_locs, 4), /* encodeOverlaps_methods.c */ CALLMETHOD_DEF(encode_overlaps1, 10), CALLMETHOD_DEF(RangesList_encode_overlaps, 7), CALLMETHOD_DEF(Hits_encode_overlaps, 10), {NULL, NULL, 0} }; void R_init_GenomicAlignments(DllInfo *info) { R_registerRoutines(info, NULL, callMethods, NULL, NULL); /* cigar_utils.c */ REGISTER_CCALLABLE(_next_cigar_OP); return; } GenomicAlignments/src/S4Vectors_stubs.c0000644000175400017540000000003613203700454021207 0ustar00biocbuildbiocbuild#include "_S4Vectors_stubs.c" GenomicAlignments/src/cigar_utils.c0000644000175400017540000007477713203700454020467 0ustar00biocbuildbiocbuild#include "GenomicAlignments.h" #include "IRanges_interface.h" #include "S4Vectors_interface.h" #include /* for isdigit() */ /* The 8 supported spaces. */ #define REFERENCE 1 #define REFERENCE_N_REGIONS_REMOVED 2 #define QUERY 3 #define QUERY_BEFORE_HARD_CLIPPING 4 #define QUERY_AFTER_SOFT_CLIPPING 5 #define PAIRWISE 6 #define PAIRWISE_N_REGIONS_REMOVED 7 #define PAIRWISE_DENSE 8 static char errmsg_buf[200]; const char *_get_cigar_parsing_error() { return errmsg_buf; } /* Return the number of chars that was read, or 0 if there is no more char to read (i.e. cigar_string[offset] is '\0'), or -1 in case of a parse error (in which case _get_cigar_parsing_error() can be used to get a pointer to the error message). Zero-length operations are ignored. */ int _next_cigar_OP(const char *cigar_string, int offset, char *OP, int *OPL) { char c; int offset0, opl; if (!cigar_string[offset]) return 0; offset0 = offset; do { /* Extract *OPL */ opl = 0; while (isdigit(c = cigar_string[offset])) { offset++; opl *= 10; opl += c - '0'; } /* Extract *OP */ if (!(*OP = cigar_string[offset])) { snprintf(errmsg_buf, sizeof(errmsg_buf), "unexpected CIGAR end after char %d", offset); return -1; } offset++; } while (opl == 0); *OPL = opl; return offset - offset0; } /* Return the number of chars that was read, or 0 if there is no more char to read (i.e. offset is 0), or -1 in case of a parse error. Zero-length operations are ignored. */ static int prev_cigar_OP(const char *cigar_string, int offset, char *OP, int *OPL) { char c; int offset0, opl, powof10; if (offset == 0) return 0; offset0 = offset; do { /* Extract *OP */ offset--; *OP = cigar_string[offset]; /* Extract *OPL */ if (offset == 0) { snprintf(errmsg_buf, sizeof(errmsg_buf), "no CIGAR operation length before char %d", offset + 1); return -1; } offset--; opl = 0; powof10 = 1; while (offset >= 0 && isdigit(c = cigar_string[offset])) { opl += (c - '0') * powof10; powof10 *= 10; offset--; } offset++; } while (opl == 0); *OPL = opl; return offset0 - offset; } static int ops_lkup_table[256]; static void init_ops_lkup_table(SEXP ops) { int ops_len, i; SEXP ops_elt; char OP; if (ops == R_NilValue) { for (i = 0; i < 256; i++) ops_lkup_table[i] = 1; return; } for (i = 0; i < 256; i++) ops_lkup_table[i] = 0; ops_len = LENGTH(ops); for (i = 0; i < ops_len; i++) { ops_elt = STRING_ELT(ops, i); if (ops_elt == NA_STRING || LENGTH(ops_elt) == 0) error("'ops' contains NAs and/or empty strings"); OP = CHAR(ops_elt)[0]; ops_lkup_table[(unsigned char) OP] = 1; } return; } static int is_in_ops(char OP) { return ops_lkup_table[(unsigned char) OP]; } static int is_visible_in_space(char OP, int space) { if (OP == 'M') return 1; switch (space) { case QUERY_BEFORE_HARD_CLIPPING: if (OP == 'H') return 1; /* fall through */ case QUERY: if (OP == 'S') return 1; /* fall through */ case QUERY_AFTER_SOFT_CLIPPING: if (OP == 'I') return 1; break; case PAIRWISE: if (OP == 'I') return 1; /* fall through */ case REFERENCE: if (OP == 'D' || OP == 'N') return 1; break; case PAIRWISE_N_REGIONS_REMOVED: if (OP == 'I') return 1; /* fall through */ case REFERENCE_N_REGIONS_REMOVED: if (OP == 'D') return 1; } if (OP == '=' || OP == 'X') return 1; return 0; } static void drop_or_append_or_merge_range(int start, int width, int drop_empty_range, int merge_range, int nelt0, IntPairAE *range_buf, const char *OP, CharAEAE *OP_buf) { int buf_nelt, buf_nelt_minus_1, prev_end_plus_1; CharAE *OP_buf_new_elt, *OP_buf_prev_elt; if (drop_empty_range && width == 0) /* Drop. */ return; buf_nelt = IntPairAE_get_nelt(range_buf); if (merge_range && buf_nelt > nelt0) { /* The incoming range should never overlap with the previous incoming range i.e. 'start' should always be > the end of the previous incoming range. */ buf_nelt_minus_1 = buf_nelt - 1; prev_end_plus_1 = range_buf->a->elts[buf_nelt_minus_1] + range_buf->b->elts[buf_nelt_minus_1]; if (start == prev_end_plus_1) { /* Merge. */ range_buf->b->elts[buf_nelt_minus_1] += width; if (OP_buf != NULL) { OP_buf_prev_elt = OP_buf->elts[buf_nelt_minus_1]; CharAE_insert_at(OP_buf_prev_elt, CharAE_get_nelt(OP_buf_prev_elt), *OP); } return; } } /* Append. */ IntPairAE_insert_at(range_buf, buf_nelt, start, width); if (OP_buf != NULL) { OP_buf_new_elt = new_CharAE(1); CharAE_insert_at(OP_buf_new_elt, 0, *OP); CharAEAE_insert_at(OP_buf, buf_nelt, OP_buf_new_elt); } return; } /* Make sure init_ops_lkup_table() is called before parse_cigar_ranges(). */ static const char *parse_cigar_ranges(const char *cigar_string, int space, int pos, int drop_empty_ranges, int reduce_ranges, IntPairAE *range_buf, CharAEAE *OP_buf) { int buf_nelt0, cigar_offset, n, OPL /* Operation Length */, start, width; char OP /* Operation */; buf_nelt0 = IntPairAE_get_nelt(range_buf); cigar_offset = 0; start = pos; while ((n = _next_cigar_OP(cigar_string, cigar_offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); width = is_visible_in_space(OP, space) ? OPL : 0; if (is_in_ops(OP)) drop_or_append_or_merge_range(start, width, drop_empty_ranges, reduce_ranges, buf_nelt0, range_buf, &OP, OP_buf); start += width; cigar_offset += n; } return NULL; } static const char *parse_cigar_width(const char *cigar_string, int space, int *width) { int cigar_offset, n, OPL /* Operation Length */; char OP /* Operation */; *width = cigar_offset = 0; while ((n = _next_cigar_OP(cigar_string, cigar_offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); if (is_visible_in_space(OP, space)) *width += OPL; cigar_offset += n; } return NULL; } /**************************************************************************** * --- .Call ENTRY POINT --- * Args: * cigar: character vector containing the extended CIGAR string for each * read; * ans_type: a single integer specifying the type of answer to return: * 0: 'ans' is a string describing the first validity failure or NULL; * 1: 'ans' is logical vector with TRUE values for valid elements * in 'cigar'. */ SEXP valid_cigar(SEXP cigar, SEXP ans_type) { SEXP ans, cigar_elt; int cigar_len, ans_type0, i, width; const char *cigar_string, *errmsg; char string_buf[200]; cigar_len = LENGTH(cigar); ans_type0 = INTEGER(ans_type)[0]; if (ans_type0 == 1) PROTECT(ans = NEW_LOGICAL(cigar_len)); else ans = R_NilValue; for (i = 0; i < cigar_len; i++) { cigar_elt = STRING_ELT(cigar, i); if (cigar_elt == NA_STRING) { if (ans_type0 == 1) LOGICAL(ans)[i] = 1; continue; } cigar_string = CHAR(cigar_elt); if (strcmp(cigar_string, "*") == 0) { if (ans_type0 == 1) LOGICAL(ans)[i] = 1; continue; } /* We use parse_cigar_width() here just for its ability to parse and detect ill-formed CIGAR strings */ errmsg = parse_cigar_width(cigar_string, 0L, &width); if (ans_type0 == 1) { LOGICAL(ans)[i] = errmsg == NULL; continue; } if (errmsg != NULL) { snprintf(string_buf, sizeof(string_buf), "element %d is invalid (%s)", i + 1, errmsg); return mkString(string_buf); } } if (ans_type0 == 1) UNPROTECT(1); return ans; } /**************************************************************************** * explode_cigar_ops() and explode_cigar_op_lengths() */ /* Make sure init_ops_lkup_table() is called before split_cigar_string(). */ static const char *split_cigar_string(const char *cigar_string, CharAE *OPbuf, IntAE *OPLbuf) { int offset, n, OPL /* Operation Length */; char OP /* Operation */; offset = 0; while ((n = _next_cigar_OP(cigar_string, offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); if (is_in_ops(OP)) { if (OPbuf != NULL) CharAE_insert_at(OPbuf, CharAE_get_nelt(OPbuf), OP); if (OPLbuf != NULL) IntAE_insert_at(OPLbuf, IntAE_get_nelt(OPLbuf), OPL); } offset += n; } return NULL; } /* --- .Call ENTRY POINTS --- * - explode_cigar_ops() * - explode_cigar_op_lengths() * Args: * cigar: character vector containing the extended CIGAR strings to * explode. * ops: NULL or a character vector containing the CIGAR operations to * actually consider. If NULL, then all CIGAR operations are * considered. * Both functions return a list of the same length as 'cigar' where each * list element is a character vector (for explode_cigar_ops()) or an integer * vector (for explode_cigar_op_lengths()). The 2 lists have the same shape, * that is, same length() and same elementNROWS(). The i-th character vector * in the list returned by explode_cigar_ops() contains one single-letter * string per CIGAR operation in 'cigar[i]'. The i-th integer vector in the * list returned by explode_cigar_op_lengths() contains the corresponding * CIGAR operation lengths. Zero-length operations or operations not listed * in 'ops' are ignored. */ SEXP explode_cigar_ops(SEXP cigar, SEXP ops) { SEXP ans, cigar_elt, ans_elt, ans_elt_elt; int cigar_len, ans_elt_len, i, j; CharAE *OPbuf; const char *cigar_string, *errmsg; cigar_len = LENGTH(cigar); init_ops_lkup_table(ops); PROTECT(ans = NEW_LIST(cigar_len)); OPbuf = new_CharAE(0); for (i = 0; i < cigar_len; i++) { cigar_elt = STRING_ELT(cigar, i); if (cigar_elt == NA_STRING) { UNPROTECT(1); error("'cigar[%d]' is NA", i + 1); } cigar_string = CHAR(cigar_elt); if (strcmp(cigar_string, "*") == 0) { UNPROTECT(1); error("'cigar[%d]' is \"*\"", i + 1); } CharAE_set_nelt(OPbuf, 0); errmsg = split_cigar_string(cigar_string, OPbuf, NULL); if (errmsg != NULL) { UNPROTECT(1); error("in 'cigar[%d]': %s", i + 1, errmsg); } ans_elt_len = CharAE_get_nelt(OPbuf); PROTECT(ans_elt = NEW_CHARACTER(ans_elt_len)); for (j = 0; j < ans_elt_len; j++) { PROTECT(ans_elt_elt = mkCharLen(OPbuf->elts + j, 1)); SET_STRING_ELT(ans_elt, j, ans_elt_elt); UNPROTECT(1); } SET_VECTOR_ELT(ans, i, ans_elt); UNPROTECT(1); } UNPROTECT(1); return ans; } SEXP explode_cigar_op_lengths(SEXP cigar, SEXP ops) { SEXP ans, cigar_elt, ans_elt; int cigar_len, i; IntAE *OPLbuf; const char *cigar_string, *errmsg; cigar_len = LENGTH(cigar); init_ops_lkup_table(ops); PROTECT(ans = NEW_LIST(cigar_len)); OPLbuf = new_IntAE(0, 0, 0); for (i = 0; i < cigar_len; i++) { cigar_elt = STRING_ELT(cigar, i); if (cigar_elt == NA_STRING) { UNPROTECT(1); error("'cigar[%d]' is NA", i + 1); } cigar_string = CHAR(cigar_elt); if (strcmp(cigar_string, "*") == 0) { UNPROTECT(1); error("'cigar[%d]' is \"*\"", i + 1); } IntAE_set_nelt(OPLbuf, 0); errmsg = split_cigar_string(cigar_string, NULL, OPLbuf); if (errmsg != NULL) { UNPROTECT(1); error("in 'cigar[%d]': %s", i + 1, errmsg); } PROTECT(ans_elt = new_INTEGER_from_IntAE(OPLbuf)); SET_VECTOR_ELT(ans, i, ans_elt); UNPROTECT(1); } UNPROTECT(1); return ans; } /**************************************************************************** * cigar_op_table() */ static const char *cigar_string_op_table(SEXP cigar_string, const char *allOPs, int *table_row, int table_nrow) { const char *cig0, *tmp; int offset, n, OPL /* Operation Length */; char OP /* Operation */; if (cigar_string == NA_STRING) return "CIGAR string is NA"; if (LENGTH(cigar_string) == 0) return "CIGAR string is empty"; cig0 = CHAR(cigar_string); offset = 0; while ((n = _next_cigar_OP(cig0, offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); tmp = strchr(allOPs, (int) OP); if (tmp == NULL) { snprintf(errmsg_buf, sizeof(errmsg_buf), "unknown CIGAR operation '%c' at char %d", OP, offset + 1); return errmsg_buf; } *(table_row + (tmp - allOPs) * table_nrow) += OPL; offset += n; } return NULL; } /* --- .Call ENTRY POINT --- * Args: * cigar: character vector containing the extended CIGAR string for each * read; * Return an integer matrix with the number of rows equal to the length of * 'cigar' and 9 columns, one for each extended CIGAR operation containing * a frequency count for the operations for each element of 'cigar'. */ SEXP cigar_op_table(SEXP cigar) { SEXP cigar_string, ans, ans_dimnames, ans_colnames; int cigar_len, allOPs_len, i, j, *ans_row; const char *allOPs = "MIDNSHP=X", *errmsg; char OPstrbuf[2]; cigar_len = LENGTH(cigar); allOPs_len = strlen(allOPs); PROTECT(ans = allocMatrix(INTSXP, cigar_len, allOPs_len)); memset(INTEGER(ans), 0, LENGTH(ans) * sizeof(int)); ans_row = INTEGER(ans); for (i = 0, ans_row = INTEGER(ans); i < cigar_len; i++, ans_row++) { cigar_string = STRING_ELT(cigar, i); if (cigar_string == NA_STRING) { INTEGER(ans)[i] = NA_INTEGER; continue; } errmsg = cigar_string_op_table(cigar_string, allOPs, ans_row, cigar_len); if (errmsg != NULL) { UNPROTECT(1); error("in 'cigar[%d]': %s", i + 1, errmsg); } } PROTECT(ans_colnames = NEW_CHARACTER(allOPs_len)); OPstrbuf[1] = '\0'; for (j = 0; j < allOPs_len; j++) { OPstrbuf[0] = allOPs[j]; SET_STRING_ELT(ans_colnames, j, mkChar(OPstrbuf)); } PROTECT(ans_dimnames = NEW_LIST(2)); SET_ELEMENT(ans_dimnames, 0, R_NilValue); SET_ELEMENT(ans_dimnames, 1, ans_colnames); SET_DIMNAMES(ans, ans_dimnames); UNPROTECT(3); return ans; } /**************************************************************************** * cigar_ranges() */ static SEXP make_list_of_IRanges(const IntPairAEAE *range_buf, SEXP names) { SEXP ans, ans_names; PROTECT(ans = new_list_of_IRanges_from_IntPairAEAE("IRanges", range_buf)); PROTECT(ans_names = duplicate(names)); SET_NAMES(ans, ans_names); UNPROTECT(2); return ans; } static SEXP make_CompressedIRangesList(const IntPairAE *range_buf, const CharAEAE *OP_buf, SEXP breakpoints) { SEXP ans, ans_unlistData, ans_unlistData_names, ans_partitioning; PROTECT(ans_unlistData = new_IRanges_from_IntPairAE("IRanges", range_buf)); if (OP_buf != NULL) { PROTECT(ans_unlistData_names = new_CHARACTER_from_CharAEAE(OP_buf)); set_IRanges_names(ans_unlistData, ans_unlistData_names); UNPROTECT(1); } PROTECT(ans_partitioning = new_PartitioningByEnd("PartitioningByEnd", breakpoints, NULL)); PROTECT(ans = new_CompressedList( "CompressedIRangesList", ans_unlistData, ans_partitioning)); UNPROTECT(3); return ans; } /* --- .Call ENTRY POINT --- * Args: * cigar: character vector containing extended CIGAR strings. * flag: NULL or an integer vector of the same length as 'cigar' * containing the SAM flag for each read. Serves only as a way to * indicate whether a read is mapped or not. According to the SAM * Spec v1.4, flag bit 0x4 is the only reliable place to tell * whether a segment (or read) is mapped (bit is 0) or not (bit is 1). * space: single integer indicating one of the 8 supported spaces (defined * at the top of this file). * pos: integer vector of the same length as 'cigar' (or of length 1) * containing the 1-based leftmost position/coordinate of the * clipped read sequences. * f: NULL or a factor of length 'cigar'. If NULL, then the ranges are * grouped by alignment and stored in a CompressedIRangesList object * with 1 list element per element in 'cigar'. If a factor, then they * are grouped by factor level and stored in an ordinary list of * IRanges objects with 1 list element per level in 'f' and named * with those levels. * ops: NULL or a character vector containing the CIGAR operations to * translate to ranges. If NULL, then all CIGAR operations are * translated. * drop_empty_ranges: TRUE or FALSE. * reduce_ranges: TRUE or FALSE. * with_ops: TRUE or FALSE indicating whether the returned ranges should be * named with their corresponding CIGAR operation. * * Returns either a CompressedIRangesList object of the same length as 'cigar' * (if 'f' is NULL) or an ordinary list of IRanges objects with 1 list element * per level in 'f' (if 'f' is a factor). This list is then turned into a * SimpleIRangesList object in R. */ SEXP cigar_ranges(SEXP cigar, SEXP flag, SEXP space, SEXP pos, SEXP f, SEXP ops, SEXP drop_empty_ranges, SEXP reduce_ranges, SEXP with_ops) { SEXP ans, ans_breakpoints, f_levels, cigar_elt; int cigar_len, space0, pos_len, f_is_NULL, ans_len, *breakpoint, drop_empty_ranges0, reduce_ranges0, with_ops0, i; IntPairAE *range_buf1; IntPairAEAE *range_buf2; CharAEAE *OP_buf; const int *flag_elt, *pos_elt, *f_elt; const char *cigar_string, *errmsg; cigar_len = LENGTH(cigar); if (flag != R_NilValue) flag_elt = INTEGER(flag); init_ops_lkup_table(ops); space0 = INTEGER(space)[0]; pos_len = LENGTH(pos); pos_elt = INTEGER(pos); f_is_NULL = f == R_NilValue; if (f_is_NULL) { ans_len = cigar_len; /* We will typically generate at least 'cigar_len' ranges. */ range_buf1 = new_IntPairAE(ans_len, 0); PROTECT(ans_breakpoints = NEW_INTEGER(ans_len)); breakpoint = INTEGER(ans_breakpoints); } else { f_levels = GET_LEVELS(f); ans_len = LENGTH(f_levels); range_buf2 = new_IntPairAEAE(ans_len, ans_len); f_elt = INTEGER(f); } drop_empty_ranges0 = LOGICAL(drop_empty_ranges)[0]; reduce_ranges0 = LOGICAL(reduce_ranges)[0]; with_ops0 = LOGICAL(with_ops)[0]; if (with_ops0 && f_is_NULL) { OP_buf = new_CharAEAE(cigar_len, 0); } else { OP_buf = NULL; } for (i = 0; i < cigar_len; i++) { if (flag != R_NilValue) { if (*flag_elt == NA_INTEGER) { if (f_is_NULL) UNPROTECT(1); error("'flag' contains NAs"); } if (*flag_elt & 0x004) { /* The CIGAR of an unmapped read doesn't produce any range i.e. it's treated as an empty CIGAR. */ goto for_tail; } } cigar_elt = STRING_ELT(cigar, i); if (cigar_elt == NA_STRING) { if (f_is_NULL) UNPROTECT(1); error("'cigar[%d]' is NA", i + 1); } cigar_string = CHAR(cigar_elt); if (strcmp(cigar_string, "*") == 0) { if (f_is_NULL) UNPROTECT(1); error("'cigar[%d]' is \"*\"", i + 1); } if (*pos_elt == NA_INTEGER || *pos_elt == 0) { if (f_is_NULL) UNPROTECT(1); error("'pos[%d]' is NA or 0", i + 1); } if (!f_is_NULL) { if (*f_elt == NA_INTEGER) error("'f[%d]' is NA", i + 1); range_buf1 = range_buf2->elts[*f_elt - 1]; } errmsg = parse_cigar_ranges(cigar_string, space0, *pos_elt, drop_empty_ranges0, reduce_ranges0, range_buf1, OP_buf); if (errmsg != NULL) { if (f_is_NULL) UNPROTECT(1); error("in 'cigar[%d]': %s", i + 1, errmsg); } for_tail: if (flag != R_NilValue) flag_elt++; if (pos_len != 1) pos_elt++; if (f_is_NULL) *(breakpoint++) = IntPairAE_get_nelt(range_buf1); else f_elt++; } if (!f_is_NULL) return make_list_of_IRanges(range_buf2, f_levels); PROTECT(ans = make_CompressedIRangesList(range_buf1, OP_buf, ans_breakpoints)); UNPROTECT(2); return ans; } /**************************************************************************** * --- .Call ENTRY POINT --- * Args: * cigar, flag, space: see cigar_ranges() function above. * Return an integer vector of the same length as 'cigar' containing the * widths of the alignments as inferred from the cigar information. */ SEXP cigar_width(SEXP cigar, SEXP flag, SEXP space) { SEXP ans, cigar_elt; int cigar_len, space0, i, *ans_elt; const int *flag_elt; const char *cigar_string, *errmsg; cigar_len = LENGTH(cigar); if (flag != R_NilValue) flag_elt = INTEGER(flag); space0 = INTEGER(space)[0]; PROTECT(ans = NEW_INTEGER(cigar_len)); for (i = 0, ans_elt = INTEGER(ans); i < cigar_len; i++, ans_elt++) { if (flag != R_NilValue) { if (*flag_elt == NA_INTEGER) { UNPROTECT(1); error("'flag' contains NAs"); } if (*flag_elt & 0x004) { *ans_elt = NA_INTEGER; goto for_tail; } } cigar_elt = STRING_ELT(cigar, i); if (cigar_elt == NA_STRING) { *ans_elt = NA_INTEGER; goto for_tail; } cigar_string = CHAR(cigar_elt); if (strcmp(cigar_string, "*") == 0) { *ans_elt = NA_INTEGER; goto for_tail; } errmsg = parse_cigar_width(cigar_string, space0, ans_elt); if (errmsg != NULL) { UNPROTECT(1); error("in 'cigar[%d]': %s", i + 1, errmsg); } for_tail: if (flag != R_NilValue) flag_elt++; } UNPROTECT(1); return ans; } /**************************************************************************** * cigar_narrow() */ static const char *Lnarrow_cigar_string(SEXP cigar_string, int *Lwidth, int *Loffset, int *rshift) { const char *cig0; int offset, n, OPL /* Operation Length */; char OP /* Operation */; if (cigar_string == NA_STRING) return "CIGAR string is NA"; if (LENGTH(cigar_string) == 0) return "CIGAR string is empty"; cig0 = CHAR(cigar_string); *rshift = offset = 0; while ((n = _next_cigar_OP(cig0, offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); switch (OP) { /* Alignment match (can be a sequence match or mismatch) */ case 'M': case '=': case 'X': if (*Lwidth < OPL) { *Loffset = offset; *rshift += *Lwidth; return NULL; } *Lwidth -= OPL; *rshift += OPL; break; /* Insertion to the reference or soft/hard clip on the read */ case 'I': case 'S': case 'H': break; /* Deletion (or skipped region) from the reference */ case 'D': case 'N': if (*Lwidth < OPL) *Lwidth = 0; else *Lwidth -= OPL; *rshift += OPL; break; /* Silent deletion from the padded reference */ case 'P': break; default: snprintf(errmsg_buf, sizeof(errmsg_buf), "unknown CIGAR operation '%c' at char %d", OP, offset + 1); return errmsg_buf; } offset += n; } snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after narrowing"); return errmsg_buf; } static const char *Rnarrow_cigar_string(SEXP cigar_string, int *Rwidth, int *Roffset) { const char *cig0; int offset, n, OPL /* Operation Length */; char OP /* Operation */; if (cigar_string == NA_STRING) return "CIGAR string is NA"; if (LENGTH(cigar_string) == 0) return "CIGAR string is empty"; cig0 = CHAR(cigar_string); offset = LENGTH(cigar_string); while ((n = prev_cigar_OP(cig0, offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); offset -= n; switch (OP) { /* Alignment match (can be a sequence match or mismatch) */ case 'M': case '=': case 'X': if (*Rwidth < OPL) { *Roffset = offset; return NULL; } *Rwidth -= OPL; break; /* Insertion to the reference or soft/hard clip on the read */ case 'I': case 'S': case 'H': break; /* Deletion (or skipped region) from the reference */ case 'D': case 'N': if (*Rwidth < OPL) *Rwidth = 0; else *Rwidth -= OPL; break; /* Silent deletion from the padded reference */ case 'P': break; default: snprintf(errmsg_buf, sizeof(errmsg_buf), "unknown CIGAR operation '%c' at char %d", OP, offset + 1); return errmsg_buf; } } snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after narrowing"); return errmsg_buf; } /* FIXME: 'cigar_buf' is under the risk of a buffer overflow! */ static const char *narrow_cigar_string(SEXP cigar_string, int Lwidth, int Rwidth, char *cigar_buf, int *rshift) { int Loffset, Roffset, buf_offset; const char *cig0; int offset, n, OPL /* Operation Length */; char OP /* Operation */; const char *errmsg; //Rprintf("narrow_cigar_string():\n"); errmsg = Lnarrow_cigar_string(cigar_string, &Lwidth, &Loffset, rshift); if (errmsg != NULL) return errmsg; //Rprintf(" Lwidth=%d Loffset=%d *rshift=%d\n", // Lwidth, Loffset, *rshift); errmsg = Rnarrow_cigar_string(cigar_string, &Rwidth, &Roffset); if (errmsg != NULL) return errmsg; //Rprintf(" Rwidth=%d Roffset=%d\n", Rwidth, Roffset); if (Roffset < Loffset) { snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after narrowing"); return errmsg_buf; } buf_offset = 0; cig0 = CHAR(cigar_string); for (offset = Loffset; offset <= Roffset; offset += n) { n = _next_cigar_OP(cig0, offset, &OP, &OPL); if (offset == Loffset) OPL -= Lwidth; if (offset == Roffset) OPL -= Rwidth; if (OPL <= 0) { snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after narrowing"); return errmsg_buf; } buf_offset += sprintf(cigar_buf + buf_offset, "%d%c", OPL, OP); } return NULL; } /* --- .Call ENTRY POINT --- */ SEXP cigar_narrow(SEXP cigar, SEXP left_width, SEXP right_width) { SEXP ans, ans_cigar, ans_cigar_string, ans_rshift, cigar_string; int cigar_len, i; static char cigar_buf[1024]; const char *errmsg; cigar_len = LENGTH(cigar); PROTECT(ans_cigar = NEW_CHARACTER(cigar_len)); PROTECT(ans_rshift = NEW_INTEGER(cigar_len)); for (i = 0; i < cigar_len; i++) { cigar_string = STRING_ELT(cigar, i); if (cigar_string == NA_STRING) { SET_STRING_ELT(ans_cigar, i, NA_STRING); INTEGER(ans_rshift)[i] = NA_INTEGER; continue; } errmsg = narrow_cigar_string(cigar_string, INTEGER(left_width)[i], INTEGER(right_width)[i], cigar_buf, INTEGER(ans_rshift) + i); if (errmsg != NULL) { UNPROTECT(2); error("in 'cigar[%d]': %s", i + 1, errmsg); } PROTECT(ans_cigar_string = mkChar(cigar_buf)); SET_STRING_ELT(ans_cigar, i, ans_cigar_string); UNPROTECT(1); } PROTECT(ans = NEW_LIST(2)); SET_VECTOR_ELT(ans, 0, ans_cigar); SET_VECTOR_ELT(ans, 1, ans_rshift); UNPROTECT(3); return ans; } /**************************************************************************** * cigar_qnarrow() */ static const char *Lqnarrow_cigar_string(SEXP cigar_string, int *Lqwidth, int *Loffset, int *rshift) { const char *cig0; int offset, n, OPL /* Operation Length */; char OP /* Operation */; if (cigar_string == NA_STRING) return "CIGAR string is NA"; if (LENGTH(cigar_string) == 0) return "CIGAR string is empty"; cig0 = CHAR(cigar_string); *rshift = offset = 0; while ((n = _next_cigar_OP(cig0, offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); switch (OP) { /* Alignment match (can be a sequence match or mismatch) */ case 'M': case '=': case 'X': if (*Lqwidth < OPL) { *Loffset = offset; *rshift += *Lqwidth; return NULL; } *Lqwidth -= OPL; *rshift += OPL; break; /* Insertion to the reference or soft/hard clip on the read */ case 'I': case 'S': case 'H': if (*Lqwidth < OPL) { *Loffset = offset; return NULL; } *Lqwidth -= OPL; break; /* Deletion (or skipped region) from the reference */ case 'D': case 'N': *rshift += OPL; break; /* Silent deletion from the padded reference */ case 'P': break; default: snprintf(errmsg_buf, sizeof(errmsg_buf), "unknown CIGAR operation '%c' at char %d", OP, offset + 1); return errmsg_buf; } offset += n; } snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after qnarrowing"); return errmsg_buf; } static const char *Rqnarrow_cigar_string(SEXP cigar_string, int *Rqwidth, int *Roffset) { const char *cig0; int offset, n, OPL /* Operation Length */; char OP /* Operation */; if (cigar_string == NA_STRING) return "CIGAR string is NA"; if (LENGTH(cigar_string) == 0) return "CIGAR string is empty"; cig0 = CHAR(cigar_string); offset = LENGTH(cigar_string); while ((n = prev_cigar_OP(cig0, offset, &OP, &OPL))) { if (n == -1) return _get_cigar_parsing_error(); offset -= n; switch (OP) { /* M, =, X, I, S, H */ case 'M': case '=': case 'X': case 'I': case 'S': case 'H': if (*Rqwidth < OPL) { *Roffset = offset; return NULL; } *Rqwidth -= OPL; break; /* Deletion (or skipped region) from the reference, or silent deletion from the padded reference */ case 'D': case 'N': case 'P': break; default: snprintf(errmsg_buf, sizeof(errmsg_buf), "unknown CIGAR operation '%c' at char %d", OP, offset + 1); return errmsg_buf; } } snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after qnarrowing"); return errmsg_buf; } /* FIXME: 'cigar_buf' is under the risk of a buffer overflow! */ static const char *qnarrow_cigar_string(SEXP cigar_string, int Lqwidth, int Rqwidth, char *cigar_buf, int *rshift) { int Loffset, Roffset, buf_offset; const char *cig0; int offset, n, OPL /* Operation Length */; char OP /* Operation */; const char *errmsg; //Rprintf("qnarrow_cigar_string():\n"); errmsg = Lqnarrow_cigar_string(cigar_string, &Lqwidth, &Loffset, rshift); if (errmsg != NULL) return errmsg; //Rprintf(" Lqwidth=%d Loffset=%d *rshift=%d\n", // Lqwidth, Loffset, *rshift); errmsg = Rqnarrow_cigar_string(cigar_string, &Rqwidth, &Roffset); if (errmsg != NULL) return errmsg; //Rprintf(" Rqwidth=%d Roffset=%d\n", Rqwidth, Roffset); if (Roffset < Loffset) { snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after qnarrowing"); return errmsg_buf; } buf_offset = 0; cig0 = CHAR(cigar_string); for (offset = Loffset; offset <= Roffset; offset += n) { n = _next_cigar_OP(cig0, offset, &OP, &OPL); if (offset == Loffset) OPL -= Lqwidth; if (offset == Roffset) OPL -= Rqwidth; if (OPL <= 0) { snprintf(errmsg_buf, sizeof(errmsg_buf), "CIGAR is empty after qnarrowing"); return errmsg_buf; } buf_offset += sprintf(cigar_buf + buf_offset, "%d%c", OPL, OP); } return NULL; } /* --- .Call ENTRY POINT --- * Return a list of 2 elements: 1st elt is the narrowed cigar vector, 2nd elt * is the 'rshift' vector i.e. the integer vector of the same length as 'cigar' * that would need to be added to the 'pos' field of a SAM/BAM file as a * consequence of this narrowing. */ SEXP cigar_qnarrow(SEXP cigar, SEXP left_qwidth, SEXP right_qwidth) { SEXP ans, ans_cigar, ans_cigar_string, ans_rshift, cigar_string; int cigar_len, i; static char cigar_buf[1024]; const char *errmsg; cigar_len = LENGTH(cigar); PROTECT(ans_cigar = NEW_CHARACTER(cigar_len)); PROTECT(ans_rshift = NEW_INTEGER(cigar_len)); for (i = 0; i < cigar_len; i++) { cigar_string = STRING_ELT(cigar, i); if (cigar_string == NA_STRING) { SET_STRING_ELT(ans_cigar, i, NA_STRING); INTEGER(ans_rshift)[i] = NA_INTEGER; continue; } errmsg = qnarrow_cigar_string(cigar_string, INTEGER(left_qwidth)[i], INTEGER(right_qwidth)[i], cigar_buf, INTEGER(ans_rshift) + i); if (errmsg != NULL) { UNPROTECT(2); error("in 'cigar[%d]': %s", i + 1, errmsg); } PROTECT(ans_cigar_string = mkChar(cigar_buf)); SET_STRING_ELT(ans_cigar, i, ans_cigar_string); UNPROTECT(1); } PROTECT(ans = NEW_LIST(2)); SET_VECTOR_ELT(ans, 0, ans_cigar); SET_VECTOR_ELT(ans, 1, ans_rshift); UNPROTECT(3); return ans; } GenomicAlignments/src/coordinate_mapping_methods.c0000644000175400017540000002536113203700454023530 0ustar00biocbuildbiocbuild#include "GenomicAlignments.h" #include "IRanges_interface.h" #include "S4Vectors_interface.h" /**************************************************************************** * Mapping from genome (reference) to local space. */ /* Returns integer position of 'ref_loc' mapped to local space. * If 'ref_loc' cannot be mapped NA is returned. */ int to_query(int ref_loc, const char *cig0, int pos, Rboolean narrow_left) { int query_loc = ref_loc - pos + 1; int n, offset = 0, OPL, query_consumed = 0; char OP; while (query_consumed < query_loc && (n = _next_cigar_OP(cig0, offset, &OP, &OPL))) { switch (OP) { /* Alignment match (can be a sequence match or mismatch) */ case 'M': case '=': case 'X': query_consumed += OPL; break; /* Insertion to the reference */ case 'I': /* Soft clip on the read */ case 'S': query_loc += OPL; query_consumed += OPL; break; /* Deletion from the reference */ case 'D': /* Skipped region from reference; narrow to query */ case 'N': { Rboolean query_loc_past_gap = query_loc - query_consumed > OPL; if (query_loc_past_gap) { query_loc -= OPL; } else { if (narrow_left) { query_loc = query_consumed; } else { query_loc = query_consumed + 1; } } } break; /* Hard clip on the read */ case 'H': break; /* Silent deletion from the padded reference */ case 'P': break; default: break; } offset += n; } if (query_loc < 0 || n == 0) query_loc = NA_INTEGER; return query_loc; } /**************************************************************************** * --- .Call ENTRY POINT --- * Args: * ref_locs : global positions in the reference to map * cigar : character string containing the extended CIGAR; * pos : reference position at which the query alignment begins * (after clip) * narrow_left: whether to narrow to the left (or right) side of a gap * * Returns an integer vector of local query positions. This assumes the * reference positions actually occur in the read alignment region, * outside of any deletions or insertions. */ SEXP ref_locs_to_query_locs(SEXP ref_locs, SEXP cigar, SEXP pos, SEXP narrow_left) { int nlocs, i; SEXP query_locs; nlocs = LENGTH(ref_locs); PROTECT(query_locs = allocVector(INTSXP, nlocs)); for (i = 0; i < nlocs; i++) { const char *cig_i = CHAR(STRING_ELT(cigar, i)); INTEGER(query_locs)[i] = to_query(INTEGER(ref_locs)[i], cig_i, INTEGER(pos)[i], asLogical(narrow_left)); } UNPROTECT(1); return query_locs; } /**************************************************************************** * --- .Call ENTRY POINT --- * Args: * ref_locs : global positions in the reference to map * cigar : character string containing the extended CIGAR; * pos : reference position at which the query alignment begins * (after clip) * narrow_left: whether to narrow to the left (or right) side of a gap * * Returns a list of length 4: * - start of local query position * - end of local query position * - index of 'start' used in match ('from_hits') * - index of 'pos' used in match ('to_hits') * All list elements are integer vectors. This assumes that the reference * positions actually occur in the read alignment region, outside of * any deletions or insertions. */ SEXP map_ref_locs_to_query_locs(SEXP start, SEXP end, SEXP cigar, SEXP pos) { SEXP ans, ans_start, ans_end, ans_qhits, ans_shits; IntAE *sbuf, *ebuf, *qhbuf, *shbuf; int i, j, s, e; int nlocs = LENGTH(start); int ncigar = LENGTH(cigar); sbuf = new_IntAE(0, 0, 0); ebuf = new_IntAE(0, 0, 0); qhbuf = new_IntAE(0, 0, 0); shbuf = new_IntAE(0, 0, 0); for (i = 0; i < nlocs; i++) { for (j = 0; j < ncigar; j++) { const char *cig_j = CHAR(STRING_ELT(cigar, j)); int pos_j = INTEGER(pos)[j]; s = to_query(INTEGER(start)[i], cig_j, pos_j, FALSE); if (s == NA_INTEGER) break; e = to_query(INTEGER(end)[i], cig_j, pos_j, TRUE); if (e == NA_INTEGER) break; IntAE_insert_at(sbuf, IntAE_get_nelt(sbuf), s); IntAE_insert_at(ebuf, IntAE_get_nelt(ebuf), e); IntAE_insert_at(qhbuf, IntAE_get_nelt(qhbuf), i + 1); IntAE_insert_at(shbuf, IntAE_get_nelt(shbuf), j + 1); } } PROTECT(ans = NEW_LIST(4)); PROTECT(ans_start = new_INTEGER_from_IntAE(sbuf)); PROTECT(ans_end = new_INTEGER_from_IntAE(ebuf)); PROTECT(ans_qhits = new_INTEGER_from_IntAE(qhbuf)); PROTECT(ans_shits = new_INTEGER_from_IntAE(shbuf)); SET_VECTOR_ELT(ans, 0, ans_start); SET_VECTOR_ELT(ans, 1, ans_end); SET_VECTOR_ELT(ans, 2, ans_qhits); SET_VECTOR_ELT(ans, 3, ans_shits); UNPROTECT(5); return ans; } /**************************************************************************** * Mapping from local to genome (reference) space. */ /* Returns integer position of 'query_loc' mapped to genome-based space. * If 'query_loc' cannot be mapped NA is returned. */ int to_ref(int query_loc, const char *cig0, int pos, Rboolean narrow_left) { int ref_loc = query_loc + pos - 1; int n, offset = 0, OPL, query_consumed = 0; char OP; while (query_consumed < query_loc && (n = _next_cigar_OP(cig0, offset, &OP, &OPL))) { switch (OP) { /* Alignment match (can be a sequence match or mismatch) */ case 'M': case '=': case 'X': query_consumed += OPL; break; /* Insertion to the reference */ case 'I': { int width_from_insertion_start = query_loc - query_consumed; Rboolean query_loc_past_insertion = width_from_insertion_start > OPL; if (query_loc_past_insertion) { ref_loc -= OPL; } else { ref_loc -= width_from_insertion_start; if (!narrow_left) { ref_loc += 1; } } query_consumed += OPL; break; } /* Soft clip on the read */ case 'S': query_consumed += OPL; break; /* Deletion from the reference */ case 'D': case 'N': /* Skipped region from reference; narrow to query */ ref_loc += OPL; break; /* Hard clip on the read */ case 'H': break; /* Silent deletion from the padded reference */ case 'P': break; default: break; } offset += n; } if (n == 0) ref_loc = NA_INTEGER; return ref_loc; } /**************************************************************************** * --- .Call ENTRY POINT --- * Args: * query_locs: local positions in the read that we will map * cigar: character string containing the extended CIGAR; * pos: reference position at which the query alignment begins * (after clip) * narrow_left: whether to narrow to the left (or right) side of a gap * Returns an integer vector of local query positions. This assumes * that the reference positions actually occur in the read alignment region, * outside of any deletions or insertions. */ SEXP query_locs_to_ref_locs(SEXP query_locs, SEXP cigar, SEXP pos, SEXP narrow_left) { int nlocs, i; SEXP ref_locs; nlocs = LENGTH(query_locs); PROTECT(ref_locs = allocVector(INTSXP, nlocs)); for (i = 0; i < nlocs; i++) { const char *cig_i = CHAR(STRING_ELT(cigar, i)); INTEGER(ref_locs)[i] = to_ref(INTEGER(query_locs)[i], cig_i, INTEGER(pos)[i], asLogical(narrow_left)); } UNPROTECT(1); return ref_locs; } /**************************************************************************** * --- .Call ENTRY POINT --- * Args: * query_locs: local positions in the read that we will map * cigar: character string containing the extended CIGAR; * pos: reference position at which the query alignment begins * (after clip) * narrow_left: whether to narrow to the left (or right) side of a gap * Returns a list of length 4: * - start of local query position * - end of local query position * - index of 'start' used in match ('from_hits') * - index of 'pos' used in match ('to_hits') * All list elements are integer vectors. This assumes that the reference * positions actually occur in the read alignment region, outside of * any deletions or insertions. */ SEXP map_query_locs_to_ref_locs(SEXP start, SEXP end, SEXP cigar, SEXP pos) { SEXP ans, ans_start, ans_end, ans_qhits, ans_shits; IntAE *sbuf, *ebuf, *qhbuf, *shbuf; int i, j, s, e, nlocs, ncigar; nlocs = LENGTH(start); ncigar = LENGTH(cigar); sbuf = new_IntAE(0, 0, 0); ebuf = new_IntAE(0, 0, 0); qhbuf = new_IntAE(0, 0, 0); shbuf = new_IntAE(0, 0, 0); for (i = 0; i < nlocs; i++) { for (j = 0; j < ncigar; j++) { const char *cig_j = CHAR(STRING_ELT(cigar, j)); int pos_j = INTEGER(pos)[j]; s = to_ref(INTEGER(start)[i], cig_j, pos_j, FALSE); if (s == NA_INTEGER) break; e = to_ref(INTEGER(end)[i], cig_j, pos_j, TRUE); if (e == NA_INTEGER) break; IntAE_insert_at(sbuf, IntAE_get_nelt(sbuf), s); IntAE_insert_at(ebuf, IntAE_get_nelt(ebuf), e); IntAE_insert_at(qhbuf, IntAE_get_nelt(qhbuf), i + 1); IntAE_insert_at(shbuf, IntAE_get_nelt(shbuf), j + 1); } } PROTECT(ans = NEW_LIST(4)); PROTECT(ans_start = new_INTEGER_from_IntAE(sbuf)); PROTECT(ans_end = new_INTEGER_from_IntAE(ebuf)); PROTECT(ans_qhits = new_INTEGER_from_IntAE(qhbuf)); PROTECT(ans_shits = new_INTEGER_from_IntAE(shbuf)); SET_VECTOR_ELT(ans, 0, ans_start); SET_VECTOR_ELT(ans, 1, ans_end); SET_VECTOR_ELT(ans, 2, ans_qhits); SET_VECTOR_ELT(ans, 3, ans_shits); UNPROTECT(5); return ans; } GenomicAlignments/src/encodeOverlaps_methods.c0000644000175400017540000003700013203700454022630 0ustar00biocbuildbiocbuild/**************************************************************************** * Encode overlaps * * Author: Herve Pages * ****************************************************************************/ #include "GenomicAlignments.h" #include "IRanges_interface.h" #include "S4Vectors_interface.h" /* * A low-level helper for "superficial" checking of the 'space' vector * associated with a Ranges object. */ static const int *check_Ranges_space(SEXP space, int len, const char *what) { if (space == R_NilValue) return NULL; if (!IS_INTEGER(space)) error("'%s_space' must be an integer vector or NULL", what); if (LENGTH(space) != len) error("when not NULL, '%s_space' must have " "the same length as 'start(%s)'", what, what); return INTEGER(space); } static void CharAE_append_char(CharAE *char_ae, char c, int times) { int i; for (i = 0; i < times; i++) CharAE_insert_at(char_ae, CharAE_get_nelt(char_ae), c); return; } static void CharAE_append_int(CharAE *char_ae, int d) { static char buf[12]; /* should be enough for 32-bit ints */ int ret; ret = snprintf(buf, sizeof(buf), "%d", d); if (ret < 0) /* should never happen */ error("GenomicAlignments internal error " "in CharAE_append_int(): " "snprintf() returned value < 0"); if (ret >= sizeof(buf)) /* could happen with ints > 32-bit */ error("GenomicAlignments internal error " "in CharAE_append_int(): " "output of snprintf() was truncated"); CharAE_append_string(char_ae, buf); return; } /* * A special 1-letter code 'X' is used for ranges that are not on the same * space. */ static char overlap_letter(int x_start, int x_width, int x_space, int y_start, int y_width, int y_space) { int code; if (x_space != y_space) return 'X'; code = overlap_code(x_start, x_width, y_start, y_width); if (x_space < 0) code = invert_overlap_code(code); return 'g' + code; } /* * q_start, q_width: int arrays of length q_len. No NAs. * q_space: NULL or an int array of length q_len. No NAs. * q_len: nb of ranges in the query. * q_break: 0 if all the ranges in the query are coming from the same * segment (single-end read), or, an int >= 1 and < q_len specifying * the position of the break between the ranges coming from one * segment and the ranges coming from the other if the query is a * paired-end read. * flip_query: if non-zero, then the query is "flipped" before the encoding is * computed. * s_start, s_width: int arrays of length s_len. No NAs. * s_space: NULL or an int array of length s_len. No NAs. * s_len: nb of ranges in the subject. * as_matrix, Loffset, Roffset: if as_matrix, then the full matrix of codes * is returned and the returned values for Loffset and Roffset are * undefined. Otherwise, the matrix is trimmed and the returned values * for Loffset and Roffset are the number of cols removed on the left * and right sides of the matrix, respectively. * out: character array containing the matrix of codes (possibly trimmed) */ static void unsafe_overlap_encoding( const int *q_start, const int *q_width, const int *q_space, int q_len, int q_break, int flip_query, const int *s_start, const int *s_width, const int *s_space, int s_len, int as_matrix, int *Loffset, int *Roffset, CharAE *out) { int out_nelt0, i, starti, widthi, spacei, j, startj, widthj, spacej, j1, j2, nrow; char letter; if (!as_matrix) { if (q_break != 0) { if (flip_query) { CharAE_append_int(out, q_len - q_break); CharAE_append_char(out, '-', 2); CharAE_append_int(out, q_break); } else { CharAE_append_int(out, q_break); CharAE_append_char(out, '-', 2); CharAE_append_int(out, q_len - q_break); } } else { CharAE_append_int(out, q_len); } CharAE_append_char(out, ':', 1); out_nelt0 = CharAE_get_nelt(out); } /* j1: 0-based index of first (i.e. leftmost) col with a non-"m", or 's_len' if there is no such col. j2: 0-based index of last (i.e. rightmost) col with a non-"a", or -1 if there is no such col. */ j1 = s_len; j2 = -1; /* Walk col by col. */ for (j = 0; j < s_len; j++) { startj = s_start[j]; widthj = s_width[j]; spacej = s_space == NULL ? 0 : s_space[j]; if (flip_query) { for (i = q_len - 1; i >= 0; i--) { starti = q_start[i]; widthi = q_width[i]; spacei = q_space == NULL ? 0 : - q_space[i]; letter = overlap_letter(starti, widthi, spacei, startj, widthj, spacej); CharAE_append_char(out, letter, 1); if (j1 == s_len && letter != 'm') j1 = j; if (letter != 'a') j2 = j; if (q_break != 0 && i == q_break) CharAE_append_char(out, '-', 2); } } else { for (i = 0; i < q_len; i++) { if (q_break != 0 && i == q_break) CharAE_append_char(out, '-', 2); starti = q_start[i]; widthi = q_width[i]; spacei = q_space == NULL ? 0 : q_space[i]; letter = overlap_letter(starti, widthi, spacei, startj, widthj, spacej); CharAE_append_char(out, letter, 1); if (j1 == s_len && letter != 'm') j1 = j; if (letter != 'a') j2 = j; } } } if (as_matrix) return; /* By making 'j2' a 1-based index we will then have 0 <= j1 <= j2 <= s_len, which will simplify further arithmetic/logic. */ if (q_len == 0) { /* A 0-row matrix needs special treatment. */ j2 = s_len; } else { j2++; } *Loffset = j1; *Roffset = s_len - j2; nrow = q_len; if (q_break != 0) nrow += 2; /* Remove "a"-cols on the right. */ CharAE_set_nelt(out, out_nelt0 + j2 * nrow); /* Remove "m"-cols on the left. */ CharAE_delete_at(out, out_nelt0, j1 * nrow); /* Insert ":" at the end of each remaining col. */ for (j = j2 - j1; j >= 1; j--) CharAE_insert_at(out, out_nelt0 + j * nrow, ':'); return; } static void overlap_encoding( SEXP query_start, SEXP query_width, SEXP query_space, int query_break, int flip_query, SEXP subject_start, SEXP subject_width, SEXP subject_space, int as_matrix, int *Loffset, int *Roffset, CharAE *out) { int q_len, s_len; const int *q_start, *q_width, *q_space, *s_start, *s_width, *s_space; q_len = check_integer_pairs(query_start, query_width, &q_start, &q_width, "start(query)", "width(query)"); if (query_break != 0 && (query_break < 1 || query_break >= q_len)) error("the position of the break in the query " "must be >= 1 and < length(query)"); q_space = check_Ranges_space(query_space, q_len, "query"); s_len = check_integer_pairs(subject_start, subject_width, &s_start, &s_width, "start(subject)", "width(subject)"); s_space = check_Ranges_space(subject_space, s_len, "subject"); unsafe_overlap_encoding(q_start, q_width, q_space, q_len, query_break, flip_query, s_start, s_width, s_space, s_len, as_matrix, Loffset, Roffset, out); return; } /* type: 0=CHARSXP, 1=STRSXP, 2=RAWSXP as_matrix: 0 or 1, ignored when type is 0 q_len, q_break, s_len: ignored when type is 0 */ static SEXP make_encoding_from_CharAE(const CharAE *buf, int type, int as_matrix, int q_len, int q_break, int s_len) { SEXP ans, ans_elt, ans_dim; int buf_nelt, i, nrow; buf_nelt = CharAE_get_nelt(buf); if (type == 0 || (type == 1 && !as_matrix)) { PROTECT(ans = mkCharLen(buf->elts, buf_nelt)); if (type == 1) { PROTECT(ans = ScalarString(ans)); UNPROTECT(1); } UNPROTECT(1); return ans; } if (type == 1) { PROTECT(ans = NEW_CHARACTER(buf_nelt)); for (i = 0; i < buf_nelt; i++) { PROTECT(ans_elt = mkCharLen(buf->elts + i, 1)); SET_STRING_ELT(ans, i, ans_elt); UNPROTECT(1); } } else { PROTECT(ans = new_RAW_from_CharAE(buf)); } if (as_matrix) { nrow = q_len; if (q_break != 0) nrow += 2; PROTECT(ans_dim = NEW_INTEGER(2)); INTEGER(ans_dim)[0] = nrow; INTEGER(ans_dim)[1] = s_len; SET_DIM(ans, ans_dim); UNPROTECT(1); } UNPROTECT(1); return ans; } static SEXP make_LIST_from_ovenc_parts(SEXP Loffset, SEXP Roffset, SEXP encoding) { SEXP ans, ans_names, ans_names_elt; PROTECT(ans = NEW_LIST(3)); PROTECT(ans_names = NEW_CHARACTER(3)); PROTECT(ans_names_elt = mkChar("Loffset")); SET_STRING_ELT(ans_names, 0, ans_names_elt); UNPROTECT(1); PROTECT(ans_names_elt = mkChar("Roffset")); SET_STRING_ELT(ans_names, 1, ans_names_elt); UNPROTECT(1); PROTECT(ans_names_elt = mkChar("encoding")); SET_STRING_ELT(ans_names, 2, ans_names_elt); UNPROTECT(1); SET_NAMES(ans, ans_names); UNPROTECT(1); SET_VECTOR_ELT(ans, 0, Loffset); SET_VECTOR_ELT(ans, 1, Roffset); SET_VECTOR_ELT(ans, 2, encoding); UNPROTECT(1); return ans; } /* --- .Call ENTRY POINT --- * 'query_start', 'query_width', 'query_space': integer vectors of the same * length M (or NULL for 'query_space'). * 'query_break': single integer. * 'subject_start', 'subject_width', 'subject_space': integer vectors of the * same length N (or NULL for 'subject_space'). * Integer vectors 'query_start', 'query_width', 'subject_start' and * 'subject_width' are assumed to be NA free. 'query_width' and 'subject_width' * are assumed to contain non-negative values. For efficiency reasons, those * assumptions are not checked. * Return the matrix of 1-letter codes (if 'as_matrix' is TRUE), otherwise a * named list with the 3 following components: * 1. Loffset: single integer; * 2. Roffset: single integer; * 3. encoding: the compact encoding as a single string (if 'as_raw' is * FALSE) or a raw vector (if 'as_raw' is TRUE). */ SEXP encode_overlaps1(SEXP query_start, SEXP query_width, SEXP query_space, SEXP query_break, SEXP flip_query, SEXP subject_start, SEXP subject_width, SEXP subject_space, SEXP as_matrix, SEXP as_raw) { int query_break0, flip_query0, as_matrix0, as_raw0, Loffset, Roffset; CharAE *buf; SEXP encoding, ans_Loffset, ans_Roffset, ans; query_break0 = INTEGER(query_break)[0]; flip_query0 = LOGICAL(flip_query)[0]; as_matrix0 = as_matrix != R_NilValue && LOGICAL(as_matrix)[0]; as_raw0 = as_raw != R_NilValue && LOGICAL(as_raw)[0]; buf = new_CharAE(0); overlap_encoding( query_start, query_width, query_space, query_break0, flip_query0, subject_start, subject_width, subject_space, as_matrix0, &Loffset, &Roffset, buf); PROTECT(encoding = make_encoding_from_CharAE(buf, as_raw0 ? 2 : 1, as_matrix0, LENGTH(query_start), query_break0, LENGTH(subject_start))); if (as_matrix0) { UNPROTECT(1); return encoding; } PROTECT(ans_Loffset = ScalarInteger(Loffset)); PROTECT(ans_Roffset = ScalarInteger(Roffset)); PROTECT(ans = make_LIST_from_ovenc_parts(ans_Loffset, ans_Roffset, encoding)); UNPROTECT(4); return ans; } static SEXP RangesList_encode_overlaps_ij( SEXP query_starts, SEXP query_widths, SEXP query_spaces, SEXP query_breaks, SEXP subject_starts, SEXP subject_widths, SEXP subject_spaces, int i, int j, int flip_query, int *Loffset, int *Roffset, CharAE *buf) { SEXP query_start, query_width, query_space, subject_start, subject_width, subject_space; int query_break; query_start = VECTOR_ELT(query_starts, i); query_width = VECTOR_ELT(query_widths, i); if (query_spaces == R_NilValue) query_space = R_NilValue; else query_space = VECTOR_ELT(query_spaces, i); if (query_breaks == R_NilValue) query_break = 0; else query_break = INTEGER(query_breaks)[i]; subject_start = VECTOR_ELT(subject_starts, j); subject_width = VECTOR_ELT(subject_widths, j); if (subject_spaces == R_NilValue) subject_space = R_NilValue; else subject_space = VECTOR_ELT(subject_spaces, j); overlap_encoding( query_start, query_width, query_space, query_break, flip_query, subject_start, subject_width, subject_space, 0, Loffset, Roffset, buf); return make_encoding_from_CharAE(buf, 0, 0, 0, 0, 0); } /* --- .Call ENTRY POINT ---/ * 'query_starts', 'query_widths', 'query_spaces': lists of integer vectors. * The 3 lists are assumed to have the same length (M) and shape. * 'query_breaks': NULL or integer vector of length M. * 'subject_starts', 'subject_widths', 'subject_spaces': lists of integer * vectors. The 3 lists are assumed to have the same length (N) and shape. * Return a named list with the 3 following components (all of the same * length): * 1. Loffset: integer vector; * 2. Roffset: integer vector; * 3. encoding: character vector containing the compact encodings (type * II). */ SEXP RangesList_encode_overlaps(SEXP query_starts, SEXP query_widths, SEXP query_spaces, SEXP query_breaks, SEXP subject_starts, SEXP subject_widths, SEXP subject_spaces) { int q_len, s_len, ans_len, i, j, k; SEXP ans_Loffset, ans_Roffset, ans_encoding, ans_encoding_elt, ans; CharAE *buf; /* TODO: Add some basic checking of the input values. */ q_len = LENGTH(query_starts); s_len = LENGTH(subject_starts); if (q_len == 0 || s_len == 0) ans_len = 0; else ans_len = q_len >= s_len ? q_len : s_len; PROTECT(ans_Loffset = NEW_INTEGER(ans_len)); PROTECT(ans_Roffset = NEW_INTEGER(ans_len)); PROTECT(ans_encoding = NEW_CHARACTER(ans_len)); buf = new_CharAE(0); for (i = j = k = 0; k < ans_len; i++, j++, k++) { if (i >= q_len) i = 0; /* recycle i */ if (j >= s_len) j = 0; /* recycle j */ PROTECT(ans_encoding_elt = RangesList_encode_overlaps_ij( query_starts, query_widths, query_spaces, query_breaks, subject_starts, subject_widths, subject_spaces, i, j, 0, INTEGER(ans_Loffset) + k, INTEGER(ans_Roffset) + k, buf)); SET_STRING_ELT(ans_encoding, k, ans_encoding_elt); UNPROTECT(1); CharAE_set_nelt(buf, 0); } if (ans_len != 0 && (i != q_len || j != s_len)) warning("longer object length is not a multiple " "of shorter object length"); PROTECT(ans = make_LIST_from_ovenc_parts(ans_Loffset, ans_Roffset, ans_encoding)); UNPROTECT(4); return ans; } /* --- .Call ENTRY POINT ---/ * Same arguments as RangesList_encode_overlaps() plus: * 'query_hits', 'subject_hits': integer vectors of the same length. * 'flip_query': logical vector of the same length as 'query_hits'. */ SEXP Hits_encode_overlaps(SEXP query_starts, SEXP query_widths, SEXP query_spaces, SEXP query_breaks, SEXP subject_starts, SEXP subject_widths, SEXP subject_spaces, SEXP query_hits, SEXP subject_hits, SEXP flip_query) { int q_len, s_len, ans_len, i, j, k; const int *q_hits, *s_hits; SEXP ans_Loffset, ans_Roffset, ans_encoding, ans_encoding_elt, ans; CharAE *buf; /* TODO: Add some basic checking of the input values. */ q_len = LENGTH(query_starts); s_len = LENGTH(subject_starts); ans_len = check_integer_pairs(query_hits, subject_hits, &q_hits, &s_hits, "queryHits(hits)", "subjectHits(hits)"); PROTECT(ans_Loffset = NEW_INTEGER(ans_len)); PROTECT(ans_Roffset = NEW_INTEGER(ans_len)); PROTECT(ans_encoding = NEW_CHARACTER(ans_len)); buf = new_CharAE(0); for (k = 0; k < ans_len; k++) { i = q_hits[k]; j = s_hits[k]; if (i == NA_INTEGER || i < 1 || i > q_len || j == NA_INTEGER || j < 1 || j > s_len) { UNPROTECT(3); error("'queryHits(hits)' or 'subjectHits(hits)' " "contain invalid indices"); } i--; j--; PROTECT(ans_encoding_elt = RangesList_encode_overlaps_ij( query_starts, query_widths, query_spaces, query_breaks, subject_starts, subject_widths, subject_spaces, i, j, LOGICAL(flip_query)[k], INTEGER(ans_Loffset) + k, INTEGER(ans_Roffset) + k, buf)); SET_STRING_ELT(ans_encoding, k, ans_encoding_elt); UNPROTECT(1); CharAE_set_nelt(buf, 0); } PROTECT(ans = make_LIST_from_ovenc_parts(ans_Loffset, ans_Roffset, ans_encoding)); UNPROTECT(4); return ans; } GenomicAlignments/tests/0000755000175400017540000000000013175714431016353 5ustar00biocbuildbiocbuildGenomicAlignments/tests/run_unitTests.R0000644000175400017540000000015113175714431021361 0ustar00biocbuildbiocbuildrequire("GenomicAlignments") || stop("unable to load GenomicRanges package") GenomicAlignments:::.test() GenomicAlignments/vignettes/0000755000175400017540000000000013203700454017211 5ustar00biocbuildbiocbuildGenomicAlignments/vignettes/GenomicAlignmentsIntroduction.Rnw0000644000175400017540000001275413175714431025727 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{An Introduction to the GenomicAlignments Package} %\VignetteDepends{Rsamtools} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass[10pt]{article} \usepackage{times} \usepackage{hyperref} \textwidth=6.5in \textheight=8.5in %\parskip=.3cm \oddsidemargin=-.1in \evensidemargin=-.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\software}[1]{\textsf{#1}} \newcommand{\R}{\software{R}} \newcommand{\Bioconductor}{\software{Bioconductor}} \newcommand{\GenomicRanges}{\Rpackage{GenomicRanges}} \title{An Introduction to the GenomicAlignments Package} \author{Herv\'{e} Pag\`{e}s} \date{\today} \begin{document} \maketitle <>= options(width=72) @ \tableofcontents \section{Introduction} The \Rpackage{GenomicAlignments} package serves as the foundation for representing genomic alignments within the \software{Bioconductor} project. In the \software{Bioconductor} package hierarchy, it builds upon the \Rpackage{GenomicRanges} (infrastructure) package and provides support for many \software{Bioconductor} packages. This package defines three classes: \Rclass{GAlignments}, \Rclass{GAlignmentPairs}, and \Rclass{GAlignmentsList}), which are used to represent genomic alignments, pairs of genomic alignments, and groups of genomic alignments. The \Rpackage{GenomicAlignments} package is available at bioconductor.org and can be downloaded via \Rfunction{biocLite}: <>= source("https://bioconductor.org/biocLite.R") biocLite("GenomicAlignments") @ <>= library(GenomicAlignments) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rclass{GAlignments}: Genomic Alignments} The \Rclass{GAlignments} class which is a container for storing a set of genomic alignments. The class is intended to support alignments in general, not only those coming from a 'Binary Alignment Map' or 'BAM' files. Also alignments with gaps in the reference sequence (a.k.a. \emph{gapped alignments}) are supported which, for example, makes the class suited for storing junction reads from an RNA-seq experiment. More precisely, a \Rclass{GAlignments} object is a vector-like object where each element describes an \emph{alignment}, that is, how a given sequence (called \emph{query} or \emph{read}, typically short) aligns to a reference sequence (typically long). As shown later in this document, a \Rclass{GAlignments} object can be created from a 'BAM' file. In that case, each element in the resulting object will correspond to a record in the file. One important thing to note though is that not all the information present in the BAM/SAM records is stored in the object. In particular, for now, we discard the query sequences (SEQ field), the query ids (QNAME field), the query qualities (QUAL), the mapping qualities (MAPQ) and any other information that is not needed in order to support the basic set of operations described in this document. This also means that multi-reads (i.e. reads with multiple hits in the reference) don't receive any special treatment i.e. the various SAM/BAM records corresponding to a multi-read will show up in the \Rclass{GAlignments} object as if they were coming from different/unrelated queries. Also paired-end reads will be treated as single-end reads and the pairing information will be lost. This might change in the future. \subsection{Load a `BAM' file into a \Rclass{GAlignments} object} First we use the \Rfunction{readGAlignments} function from the \Rpackage{GenomicAlignments} package to load a toy `BAM' file into a \Rclass{GAlignments} object: <>= library(GenomicAlignments) aln1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") aln1 <- readGAlignments(aln1_file) aln1 length(aln1) @ 3271 `BAM' records were loaded into the object. Note that \Rfunction{readGAlignments} would have discarded any `BAM' record describing an unaligned query (see description of the field in the SAM Format Specification \footnote{\url{http://samtools.sourceforge.net/SAM1.pdf}} for more information). The reader interested in tracking down these events can always use the \Rfunction{scanBam} function but this goes beyond the scope of this document. \subsection{Simple accessor methods} There is one accessor per field displayed by the \Rmethod{show} method and it has the same name as the field. All of them return a vector or factor of the same length as the object: <>= head(seqnames(aln1)) seqlevels(aln1) head(strand(aln1)) head(cigar(aln1)) head(qwidth(aln1)) head(start(aln1)) head(end(aln1)) head(width(aln1)) head(njunc(aln1)) @ \subsection{More accessor methods} [coming soon...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rclass{GAlignmentPairs}: Pairs of Genomic Alignments} [coming soon...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rclass{GAlignmentsList}: Groups of Genomic Alignments} [coming soon...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Session Information} All of the output in this vignette was produced under the following conditions: \begin{small} <>= sessionInfo() @ \end{small} \end{document} GenomicAlignments/vignettes/OverlapEncodings.Rnw0000644000175400017540000016236513175714431023170 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Overlap encodings} %\VignetteDepends{pasillaBamSubset, GenomicAlignments, GenomicFeatures, BSgenome.Dmelanogaster.UCSC.dm3, TxDb.Dmelanogaster.UCSC.dm3.ensGene} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass{article} <>= BiocStyle::latex() @ \title{Overlap encodings} \author{Herv\'e Pag\`es} \date{Last modified: December 2016; Compiled: \today} \begin{document} \maketitle <>= options(width=100) .precomputed_results_dir <- "precomputed_results" .loadPrecomputed <- function(objname) { filename <- paste0(objname, ".rda") path <- file.path(.precomputed_results_dir, filename) tempenv <- new.env(parent=emptyenv()) load(path, envir=tempenv) get(objname, envir=tempenv) } .checkIdenticalToPrecomputed <- function(obj, objname, ignore.metadata=FALSE) { precomputed_obj <- .loadPrecomputed(objname) if (ignore.metadata) metadata(obj) <- metadata(precomputed_obj) <- list() ## Replace NAs with FALSE in circularity flag (because having the flag set ## to NA instead of FALSE (or vice-versa) is not considered a significant ## difference between the 2 objects). isCircular(obj) <- isCircular(obj) %in% TRUE isCircular(precomputed_obj) <- isCircular(precomputed_obj) %in% TRUE if (!identical(obj, precomputed_obj)) stop("'", objname, "' is not identical to precomputed version") } @ \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In the context of an RNA-seq experiment, encoding the overlaps between the aligned reads and the transcripts can be used for detecting those overlaps that are ``splice compatible'', that is, compatible with the splicing of the transcript. Various tools are provided in the \Rpackage{GenomicAlignments} package for working with {\it overlap encodings}. In this vignette, we illustrate the use of these tools on the single-end and paired-end reads of an RNA-seq experiment. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Load reads from a BAM file} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load single-end reads from a BAM file} BAM file {\tt untreated1\_chr4.bam} (located in the \Rpackage{pasillaBamSubset} data package) contains single-end reads from the ``Pasilla'' experiment and aligned against the dm3 genome (see \Rcode{?untreated1\_chr4} in the \Rpackage{pasillaBamSubset} package for more information about those reads): <>= library(pasillaBamSubset) untreated1_chr4() @ We use the \Rfunction{readGAlignments} function defined in the \Rpackage{GenomicAlignments} package to load the reads into a \Rclass{GAlignments} object. It's probably a good idea to get rid of the PCR or optical duplicates (flag bit 0x400 in the SAM format, see the SAM Spec \footnote{\url{http://samtools.sourceforge.net/}} for the details), as well as reads not passing quality controls (flag bit 0x200 in the SAM format). We do this by creating a \Rclass{ScanBamParam} object that we pass to \Rcode{readGAlignments} (see \Rcode{?ScanBamParam} in the \Rpackage{Rsamtools} package for the details). Note that we also use \Rcode{use.names=TRUE} in order to load the {\it query names} (aka {\it query template names}, see QNAME field in the SAM Spec) from the BAM file (\Rcode{readGAlignments} will use them to set the names of the returned object): <>= library(GenomicAlignments) flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) U1.GAL <- readGAlignments(untreated1_chr4(), use.names=TRUE, param=param0) head(U1.GAL) @ Because the aligner used to align those reads can report more than 1 alignment per {\it original query} (i.e. per read stored in the input file, typically a FASTQ file), we shouldn't expect the names of \Rcode{U1.GAL} to be unique: <>= U1.GAL_names_is_dup <- duplicated(names(U1.GAL)) table(U1.GAL_names_is_dup) @ Storing the {\it query names} in a factor will be useful as we will see later in this document: <>= U1.uqnames <- unique(names(U1.GAL)) U1.GAL_qnames <- factor(names(U1.GAL), levels=U1.uqnames) @ Note that we explicitely provide the levels of the factor to enforce their order. Otherwise \Rcode{factor()} would put them in lexicographic order which is not advisable because it depends on the locale in use. Another object that will be useful to keep near at hand is the mapping between each {\it query name} and its first occurence in \Rcode{U1.GAL\_qnames}: <>= U1.GAL_dup2unq <- match(U1.GAL_qnames, U1.GAL_qnames) @ Our reads can have up to 2 {\it skipped regions} (a {\it skipped region} corresponds to an N operation in the CIGAR): <>= head(unique(cigar(U1.GAL))) table(njunc(U1.GAL)) @ Also, the following table indicates that indels were not allowed/supported during the alignment process (no I or D CIGAR operations): <>= colSums(cigarOpTable(cigar(U1.GAL))) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load paired-end reads from a BAM file} BAM file {\tt untreated3\_chr4.bam} (located in the \Rpackage{pasillaBamSubset} data package) contains paired-end reads from the ``Pasilla'' experiment and aligned against the dm3 genome (see \Rcode{?untreated3\_chr4} in the \Rpackage{pasillaBamSubset} package for more information about those reads). We use the \Rfunction{readGAlignmentPairs} function to load them into a \Rclass{GAlignmentPairs} object: <>= U3.galp <- readGAlignmentPairs(untreated3_chr4(), use.names=TRUE, param=param0) head(U3.galp) @ The \Rcode{show} method for \Rclass{GAlignmentPairs} objects displays two {\tt ranges} columns, one for the {\it first} alignment in the pair (the left column), and one for the {\it last} alignment in the pair (the right column). The {\tt strand} column corresponds to the strand of the {\it first} alignment. <>= head(first(U3.galp)) head(last(U3.galp)) @ According to the SAM format specifications, the aligner is expected to mark each alignment pair as {\it proper} or not (flag bit 0x2 in the SAM format). The SAM Spec only says that a pair is {\it proper} if the {\it first} and {\it last} alignments in the pair are ``properly aligned according to the aligner''. So the exact criteria used for setting this flag is left to the aligner. We use \Rcode{isProperPair} to extract this flag from the \Rclass{GAlignmentPairs} object: <>= table(isProperPair(U3.galp)) @ Even though we could do {\it overlap encodings} with the full object, we keep only the {\it proper} pairs for our downstream analysis: <>= U3.GALP <- U3.galp[isProperPair(U3.galp)] @ Because the aligner used to align those reads can report more than 1 alignment per {\it original query template} (i.e. per pair of sequences stored in the input files, typically 1 FASTQ file for the {\it first} ends and 1 FASTQ file for the {\it last} ends), we shouldn't expect the names of \Rcode{U3.GALP} to be unique: <>= U3.GALP_names_is_dup <- duplicated(names(U3.GALP)) table(U3.GALP_names_is_dup) @ Storing the {\it query template names} in a factor will be useful: <>= U3.uqnames <- unique(names(U3.GALP)) U3.GALP_qnames <- factor(names(U3.GALP), levels=U3.uqnames) @ as well as having the mapping between each {\it query template name} and its first occurence in \Rcode{U3.GALP\_qnames}: <>= U3.GALP_dup2unq <- match(U3.GALP_qnames, U3.GALP_qnames) @ Our reads can have up to 1 {\it skipped region} per end: <>= head(unique(cigar(first(U3.GALP)))) head(unique(cigar(last(U3.GALP)))) table(njunc(first(U3.GALP)), njunc(last(U3.GALP))) @ Like for our single-end reads, the following tables indicate that indels were not allowed/supported during the alignment process: <>= colSums(cigarOpTable(cigar(first(U3.GALP)))) colSums(cigarOpTable(cigar(last(U3.GALP)))) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Find all the overlaps between the reads and transcripts} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load the transcripts from a \Rclass{TxDb} object} In order to compute overlaps between reads and transcripts, we need access to the genomic positions of a set of known transcripts and their exons. It is essential that the reference genome of this set of transcripts and exons be {\bf exactly} the same as the reference genome used to align the reads. We could use the \Rfunction{makeTxDbFromUCSC} function defined in the \Rpackage{GenomicFeatures} package to make a \Rclass{TxDb} object containing the dm3 transcripts and their exons retrieved from the UCSC Genome Browser\footnote{\url{http://genome.ucsc.edu/cgi-bin/hgGateway}}. The Bioconductor project however provides a few annotation packages containing \Rclass{TxDb} objects for the most commonly studied organisms (those data packages are sometimes called the {\it TxDb} packages). One of them is the \Rpackage{TxDb.Dmelanogaster.\-UCSC.\-dm3.ensGene} package. It contains a \Rclass{TxDb} object that was made by pointing the \Rfunction{makeTxDbFromUCSC} function to the dm3 genome and {\it Ensembl Genes} track \footnote{See \url{http://genome.ucsc.edu/cgi-bin/hgTrackUi?hgsid=276880911&g=ensGene} for a description of this track.}. We can use it here: <>= library(TxDb.Dmelanogaster.UCSC.dm3.ensGene) TxDb.Dmelanogaster.UCSC.dm3.ensGene txdb <- TxDb.Dmelanogaster.UCSC.dm3.ensGene @ We extract the exons grouped by transcript in a \Rclass{GRangesList} object: <>= exbytx <- exonsBy(txdb, by="tx", use.names=TRUE) length(exbytx) # nb of transcripts @ <>= .checkIdenticalToPrecomputed(exbytx, "exbytx", ignore.metadata=TRUE) @ We check that all the exons in any given transcript belong to the same chromosome and strand. Knowing that our set of transcripts is free of this sort of trans-splicing events typically allows some significant simplifications during the downstream analysis \footnote{Dealing with trans-splicing events is not covered in this document.}. A quick and easy way to check this is to take advantage of the fact that \Rcode{seqnames} and \Rcode{strand} return \Rclass{RleList} objects. So we can extract the number of Rle runs for each transcript and make sure it's always 1: <>= table(elementNROWS(runLength(seqnames(exbytx)))) table(elementNROWS(runLength(strand(exbytx)))) @ Therefore the strand of any given transcript is unambiguously defined and can be extracted with: <>= exbytx_strand <- unlist(runValue(strand(exbytx)), use.names=FALSE) @ We will also need the mapping between the transcripts and their gene. We start by using \Rfunction{transcripts} to extract this information from our \Rclass{TxDb} object \Rcode{txdb}, and then we construct a named factor that represents the mapping: <>= tx <- transcripts(txdb, columns=c("tx_name", "gene_id")) head(tx) df <- mcols(tx) exbytx2gene <- as.character(df$gene_id) exbytx2gene <- factor(exbytx2gene, levels=unique(exbytx2gene)) names(exbytx2gene) <- df$tx_name exbytx2gene <- exbytx2gene[names(exbytx)] head(exbytx2gene) nlevels(exbytx2gene) # nb of genes @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Single-end overlaps} \subsubsection{Find the single-end overlaps} We are ready to compute the overlaps with the \Rfunction{findOverlaps} function. Note that the strand of the queries produced by the RNA-seq experiment is typically unknown so we use \Rcode{ignore.strand=TRUE}: <>= U1.OV00 <- findOverlaps(U1.GAL, exbytx, ignore.strand=TRUE) @ \Rcode{U1.OV00} is a \Rclass{Hits} object that contains 1 element per overlap. Its length gives the number of overlaps: <>= length(U1.OV00) @ \subsubsection{Tabulate the single-end overlaps} We will repeatedly use the 2 following little helper functions to ``tabulate'' the overlaps in a given \Rclass{Hits} object (e.g. \Rcode{U1.OV00}), i.e. to count the number of overlaps for each element in the query or for each element in the subject: Number of transcripts for each alignment in \Rcode{U1.GAL}: <>= U1.GAL_ntx <- countQueryHits(U1.OV00) mcols(U1.GAL)$ntx <- U1.GAL_ntx head(U1.GAL) table(U1.GAL_ntx) mean(U1.GAL_ntx >= 1) @ 76\% of the alignments in \Rcode{U1.GAL} have an overlap with at least 1 transcript in \Rcode{exbytx}. Note that \Rfunction{countOverlaps} can be used directly on \Rcode{U1.GAL} and \Rcode{exbytx} for computing \Rcode{U1.GAL\_ntx}: <>= U1.GAL_ntx_again <- countOverlaps(U1.GAL, exbytx, ignore.strand=TRUE) stopifnot(identical(unname(U1.GAL_ntx_again), U1.GAL_ntx)) @ Because \Rcode{U1.GAL} can (and actually does) contain more than 1 alignment per {\it original query} (aka read), we also count the number of transcripts for each read: <>= U1.OV10 <- remapHits(U1.OV00, Lnodes.remapping=U1.GAL_qnames) U1.uqnames_ntx <- countQueryHits(U1.OV10) names(U1.uqnames_ntx) <- U1.uqnames table(U1.uqnames_ntx) mean(U1.uqnames_ntx >= 1) @ 78.4\% of the reads have an overlap with at least 1 transcript in \Rcode{exbytx}. Number of reads for each transcript: <>= U1.exbytx_nOV10 <- countSubjectHits(U1.OV10) names(U1.exbytx_nOV10) <- names(exbytx) mean(U1.exbytx_nOV10 >= 50) @ Only 0.869\% of the transcripts in \Rcode{exbytx} have an overlap with at least 50 reads. Top 10 transcripts: <>= head(sort(U1.exbytx_nOV10, decreasing=TRUE), n=10) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Paired-end overlaps} \subsubsection{Find the paired-end overlaps} Like with our single-end overlaps, we call \Rfunction{findOverlaps} with \Rcode{ignore.strand=TRUE}: <>= U3.OV00 <- findOverlaps(U3.GALP, exbytx, ignore.strand=TRUE) @ Like \Rcode{U1.OV00}, \Rcode{U3.OV00} is a \Rclass{Hits} object. Its length gives the number of paired-end overlaps: <>= length(U3.OV00) @ \subsubsection{Tabulate the paired-end overlaps} Number of transcripts for each alignment pair in \Rcode{U3.GALP}: <>= U3.GALP_ntx <- countQueryHits(U3.OV00) mcols(U3.GALP)$ntx <- U3.GALP_ntx head(U3.GALP) table(U3.GALP_ntx) mean(U3.GALP_ntx >= 1) @ 71\% of the alignment pairs in \Rcode{U3.GALP} have an overlap with at least 1 transcript in \Rcode{exbytx}. Note that \Rfunction{countOverlaps} can be used directly on \Rcode{U3.GALP} and \Rcode{exbytx} for computing \Rcode{U3.GALP\_ntx}: <>= U3.GALP_ntx_again <- countOverlaps(U3.GALP, exbytx, ignore.strand=TRUE) stopifnot(identical(unname(U3.GALP_ntx_again), U3.GALP_ntx)) @ Because \Rcode{U3.GALP} can (and actually does) contain more than 1 alignment pair per {\it original query template}, we also count the number of transcripts for each template: <>= U3.OV10 <- remapHits(U3.OV00, Lnodes.remapping=U3.GALP_qnames) U3.uqnames_ntx <- countQueryHits(U3.OV10) names(U3.uqnames_ntx) <- U3.uqnames table(U3.uqnames_ntx) mean(U3.uqnames_ntx >= 1) @ 72.3\% of the templates have an overlap with at least 1 transcript in \Rcode{exbytx}. Number of templates for each transcript: <>= U3.exbytx_nOV10 <- countSubjectHits(U3.OV10) names(U3.exbytx_nOV10) <- names(exbytx) mean(U3.exbytx_nOV10 >= 50) @ Only 0.756\% of the transcripts in \Rcode{exbytx} have an overlap with at least 50 templates. Top 10 transcripts: <>= head(sort(U3.exbytx_nOV10, decreasing=TRUE), n=10) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Encode the overlaps between the reads and transcripts} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Single-end encodings} The {\it overlap encodings} are strand sensitive so we will compute them twice, once for the ``original alignments'' (i.e. the alignments of the {\it original queries}), and once again for the ``flipped alignments'' (i.e. the alignments of the ``flipped {\it original queries}''). We extract the ranges of the ``original'' and ``flipped'' alignments in 2 \Rclass{GRangesList} objects with: <>= U1.grl <- grglist(U1.GAL, order.as.in.query=TRUE) U1.grlf <- flipQuery(U1.grl) # flipped @ and encode their overlaps with the transcripts: <>= U1.ovencA <- encodeOverlaps(U1.grl, exbytx, hits=U1.OV00) U1.ovencB <- encodeOverlaps(U1.grlf, exbytx, hits=U1.OV00) @ \Rcode{U1.ovencA} and \Rcode{U1.ovencB} are 2 \Rclass{OverlapsEncodings} objects of the same length as \Rclass{Hits} object \Rcode{U1.OV00}. For each hit in \Rcode{U1.OV00}, we have 2 corresponding encodings, one in \Rcode{U1.ovencA} and one in \Rcode{U1.ovencB}, but only one of them encodes a hit between alignment ranges and exon ranges that are on the same strand. We use the \Rfunction{selectEncodingWithCompatibleStrand} function to merge them into a single \Rclass{OverlapsEncodings} of the same length. For each hit in \Rcode{U1.OV00}, this selects the encoding corresponding to alignment ranges and exon ranges with compatible strand: <>= U1.grl_strand <- unlist(runValue(strand(U1.grl)), use.names=FALSE) U1.ovenc <- selectEncodingWithCompatibleStrand(U1.ovencA, U1.ovencB, U1.grl_strand, exbytx_strand, hits=U1.OV00) U1.ovenc @ As a convenience, the 2 above calls to \Rfunction{encodeOverlaps} + merging step can be replaced by a single call to \Rfunction{encodeOverlaps} on \Rcode{U1.grl} (or \Rcode{U1.grlf}) with \Rcode{flip.query.if.wrong.strand=TRUE}: <>= U1.ovenc_again <- encodeOverlaps(U1.grl, exbytx, hits=U1.OV00, flip.query.if.wrong.strand=TRUE) stopifnot(identical(U1.ovenc_again, U1.ovenc)) @ Unique encodings in \Rcode{U1.ovenc}: <>= U1.unique_encodings <- levels(U1.ovenc) length(U1.unique_encodings) head(U1.unique_encodings) U1.ovenc_table <- table(encoding(U1.ovenc)) tail(sort(U1.ovenc_table)) @ Encodings are sort of cryptic but utilities are provided to extract specific meaning from them. Use of these utilities is covered later in this document. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Paired-end encodings} Let's encode the overlaps in \Rcode{U3.OV00}: <>= U3.grl <- grglist(U3.GALP) U3.ovenc <- encodeOverlaps(U3.grl, exbytx, hits=U3.OV00, flip.query.if.wrong.strand=TRUE) U3.ovenc @ Unique encodings in \Rcode{U3.ovenc}: <>= U3.unique_encodings <- levels(U3.ovenc) length(U3.unique_encodings) head(U3.unique_encodings) U3.ovenc_table <- table(encoding(U3.ovenc)) tail(sort(U3.ovenc_table)) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Detect ``splice compatible'' overlaps} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% We are interested in a particular type of overlap where the read overlaps the transcript in a ``splice compatible'' way, that is, in a way that is compatible with the splicing of the transcript. The \Rfunction{isCompatibleWithSplicing} function can be used on an \Rclass{OverlapEncodings} object to detect this type of overlap. Note that \Rfunction{isCompatibleWithSplicing} can also be used on a character vector or factor. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``splice compatible'' single-end overlaps} \subsubsection{``Splice compatible'' single-end encodings} \Rcode{U1.ovenc} contains 7 unique encodings compatible with the splicing of the transcript: <>= sort(U1.ovenc_table[isCompatibleWithSplicing(U1.unique_encodings)]) @ Encodings \Rcode{"1:i:"} (455176 occurences in \Rcode{U1.ovenc}), \Rcode{"2:jm:af:"} (72929 occurences in \Rcode{U1.ovenc}), and \Rcode{"3:jmm:agm:aaf:"} (488 occurences in \Rcode{U1.ovenc}), correspond to the following overlaps: \begin{itemize} \item \Rcode{"1:i:"} \begin{verbatim} - read (no skipped region): oooooooo - transcript: ... >>>>>>>>>>>>>> ... \end{verbatim} \item \Rcode{"2:jm:af:"} \begin{verbatim} - read (1 skipped region): ooooo---ooo - transcript: ... >>>>>>>>> >>>>>>>>> ... \end{verbatim} \item \Rcode{"3:jmm:agm:aaf:"} \begin{verbatim} - read (2 skipped regions): oo---ooooo---o - transcript: ... >>>>>>>> >>>>> >>>>>>> ... \end{verbatim} \end{itemize} For clarity, only the exons involved in the overlap are represented. The transcript can of course have more upstream and downstream exons, which is denoted by the ... on the left side (5' end) and right side (3' end) of each drawing. Note that the exons represented in the 2nd and 3rd drawings are consecutive and adjacent in the processed transcript. Encodings \Rcode{"1:f:"} and \Rcode{"1:j:"} are variations of the situation described by encoding \Rcode{"1:i:"}. For \Rcode{"1:f:"}, the first aligned base of the read (or ``flipped'' read) is aligned with the first base of the exon. For \Rcode{"1:j:"}, the last aligned base of the read (or ``flipped'' read) is aligned with the last base of the exon: \begin{itemize} \item \Rcode{"1:f:"} \begin{verbatim} - read (no skipped region): oooooooo - transcript: ... >>>>>>>>>>>>>> ... \end{verbatim} \item \Rcode{"1:j:"} \begin{verbatim} - read (no skipped region): oooooooo - transcript: ... >>>>>>>>>>>>>> ... \end{verbatim} \end{itemize} <>= U1.OV00_is_comp <- isCompatibleWithSplicing(U1.ovenc) table(U1.OV00_is_comp) # 531797 "splice compatible" overlaps @ Finally, let's extract the ``splice compatible'' overlaps from \Rcode{U1.OV00}: <>= U1.compOV00 <- U1.OV00[U1.OV00_is_comp] @ Note that high-level convenience wrapper \Rfunction{findCompatibleOverlaps} can be used for computing the ``splice compatible'' overlaps directly between a \Rclass{GAlignments} object (containing reads) and a \Rclass{GRangesList} object (containing transcripts): <>= U1.compOV00_again <- findCompatibleOverlaps(U1.GAL, exbytx) stopifnot(identical(U1.compOV00_again, U1.compOV00)) @ \subsubsection{Tabulate the ``splice compatible'' single-end overlaps} Number of ``splice compatible'' transcripts for each alignment in \Rcode{U1.GAL}: <>= U1.GAL_ncomptx <- countQueryHits(U1.compOV00) mcols(U1.GAL)$ncomptx <- U1.GAL_ncomptx head(U1.GAL) table(U1.GAL_ncomptx) mean(U1.GAL_ncomptx >= 1) @ 75\% of the alignments in \Rcode{U1.GAL} are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Note that high-level convenience wrapper \Rfunction{countCompatibleOverlaps} can be used directly on \Rcode{U1.GAL} and \Rcode{exbytx} for computing \Rcode{U1.GAL\_ncomptx}: <>= U1.GAL_ncomptx_again <- countCompatibleOverlaps(U1.GAL, exbytx) stopifnot(identical(U1.GAL_ncomptx_again, U1.GAL_ncomptx)) @ Number of ``splice compatible'' transcripts for each read: <>= U1.compOV10 <- remapHits(U1.compOV00, Lnodes.remapping=U1.GAL_qnames) U1.uqnames_ncomptx <- countQueryHits(U1.compOV10) names(U1.uqnames_ncomptx) <- U1.uqnames table(U1.uqnames_ncomptx) mean(U1.uqnames_ncomptx >= 1) @ 77.5\% of the reads are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``splice compatible'' reads for each transcript: <>= U1.exbytx_ncompOV10 <- countSubjectHits(U1.compOV10) names(U1.exbytx_ncompOV10) <- names(exbytx) mean(U1.exbytx_ncompOV10 >= 50) @ Only 0.87\% of the transcripts in \Rcode{exbytx} are ``splice compatible'' with at least 50 reads. Top 10 transcripts: <>= head(sort(U1.exbytx_ncompOV10, decreasing=TRUE), n=10) @ Note that this ``top 10'' is slightly different from the ``top 10'' we obtained earlier when we counted {\bf all} the overlaps. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``splice compatible'' paired-end overlaps} \subsubsection{``Splice compatible'' paired-end encodings} WARNING: For paired-end encodings, \Rcode{isCompatibleWithSplicing} considers that the encoding is ``splice compatible'' if its 2 halves are ``splice compatible''. This can produce false positives if for example the right end of the alignment is located upstream of the left end in transcript space. The paired-end read could not come from this transcript. To eliminate these false positives, one would need to look at the position of the left and right ends in transcript space. This can be done with \Rcode{extractQueryStartInTranscript}. \Rcode{U3.ovenc} contains 13 unique paired-end encodings compatible with the splicing of the transcript: <>= sort(U3.ovenc_table[isCompatibleWithSplicing(U3.unique_encodings)]) @ Paired-end encodings \Rcode{"1{-}{-}1:i{-}{-}i:"} (100084 occurences in \Rcode{U3.ovenc}), \Rcode{"2{-}{-}1:jm{-}{-}m:af{-}{-}i:"} (2700 occurences in \Rcode{U3.ovenc}), \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}af:"} (2480 occurences in \Rcode{U3.ovenc}), \Rcode{"1{-}{-}1:i{-}{-}m:a{-}{-}i:"} (287 occurences in \Rcode{U3.ovenc}), and \Rcode{"2{-}{-}2:jm{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} (153 occurences in \Rcode{U3.ovenc}), correspond to the following paired-end overlaps: \begin{itemize} \item \Rcode{"1{-}{-}1:i{-}{-}i:"} \begin{verbatim} - paired-end read (no skipped region on the first end, no skipped region on the last end): oooo oooo - transcript: ... >>>>>>>>>>>>>>>> ... \end{verbatim} \item \Rcode{"2{-}{-}1:jm{-}{-}m:af{-}{-}i:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, no skipped region on the last end): ooo---o oooo - transcript: ... >>>>>>>> >>>>>>>>>>> ... \end{verbatim} \item \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}af:"} \begin{verbatim} - paired-end read (no skipped region on the first end, 1 skipped region on the last end): oooo oo---oo - transcript: ... >>>>>>>>>>>>>> >>>>>>>>> ... \end{verbatim} \item \Rcode{"1{-}{-}1:i{-}{-}m:a{-}{-}i:"} \begin{verbatim} - paired-end read (no skipped region on the first end, no skipped region on the last end): oooo oooo - transcript: ... >>>>>>>>> >>>>>>> ... \end{verbatim} \item \Rcode{"2{-}{-}2:jm{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, 1 skipped region on the last end): ooo---o oo---oo - transcript: ... >>>>>> >>>>>>> >>>>> ... \end{verbatim} \end{itemize} Note: switch use of ``first'' and ``last'' above if the read was ``flipped''. <>= U3.OV00_is_comp <- isCompatibleWithSplicing(U3.ovenc) table(U3.OV00_is_comp) # 106835 "splice compatible" paired-end overlaps @ Finally, let's extract the ``splice compatible'' paired-end overlaps from \Rcode{U3.OV00}: <>= U3.compOV00 <- U3.OV00[U3.OV00_is_comp] @ Note that, like with our single-end reads, high-level convenience wrapper \Rfunction{findCompatibleOverlaps} can be used for computing the ``splice compatible'' paired-end overlaps directly between a \Rclass{GAlignmentPairs} object (containing paired-end reads) and a \Rclass{GRangesList} object (containing transcripts): <>= U3.compOV00_again <- findCompatibleOverlaps(U3.GALP, exbytx) stopifnot(identical(U3.compOV00_again, U3.compOV00)) @ \subsubsection{Tabulate the ``splice compatible'' paired-end overlaps} Number of ``splice compatible'' transcripts for each alignment pair in \Rcode{U3.GALP}: <>= U3.GALP_ncomptx <- countQueryHits(U3.compOV00) mcols(U3.GALP)$ncomptx <- U3.GALP_ncomptx head(U3.GALP) table(U3.GALP_ncomptx) mean(U3.GALP_ncomptx >= 1) @ 69.7\% of the alignment pairs in \Rcode{U3.GALP} are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Note that high-level convenience wrapper \Rfunction{countCompatibleOverlaps} can be used directly on \Rcode{U3.GALP} and \Rcode{exbytx} for computing \Rcode{U3.GALP\_ncomptx}: <>= U3.GALP_ncomptx_again <- countCompatibleOverlaps(U3.GALP, exbytx) stopifnot(identical(U3.GALP_ncomptx_again, U3.GALP_ncomptx)) @ Number of ``splice compatible'' transcripts for each template: <>= U3.compOV10 <- remapHits(U3.compOV00, Lnodes.remapping=U3.GALP_qnames) U3.uqnames_ncomptx <- countQueryHits(U3.compOV10) names(U3.uqnames_ncomptx) <- U3.uqnames table(U3.uqnames_ncomptx) mean(U3.uqnames_ncomptx >= 1) @ 70.7\% of the templates are ``splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``splice compatible'' templates for each transcript: <>= U3.exbytx_ncompOV10 <- countSubjectHits(U3.compOV10) names(U3.exbytx_ncompOV10) <- names(exbytx) mean(U3.exbytx_ncompOV10 >= 50) @ Only 0.7\% of the transcripts in \Rcode{exbytx} are ``splice compatible'' with at least 50 templates. Top 10 transcripts: <>= head(sort(U3.exbytx_ncompOV10, decreasing=TRUE), n=10) @ Note that this ``top 10'' is slightly different from the ``top 10'' we obtained earlier when we counted {\bf all} the paired-end overlaps. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Compute the {\it reference query sequences} and project them on the transcriptome} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Compute the {\it reference query sequences}} The {\it reference query sequences} are the query sequences {\bf after} alignment, by opposition to the {\it original query sequences} (aka ``true'' or ``real'' query sequences) which are the query sequences {\bf before} alignment. The {\it reference query sequences} can easily be computed by extracting the nucleotides mapped to each read from the reference genome. This of course requires that we have access to the reference genome used by the aligner. In Bioconductor, the full genome sequence for the dm3 assembly is stored in the \Rpackage{BSgenome.Dmelanogaster.UCSC.dm3} data package \footnote{See \url{http://bioconductor.org/packages/release/data/annotation/} for the full list of annotation packages available in the current release of Bioconductor.}: <>= library(BSgenome.Dmelanogaster.UCSC.dm3) Dmelanogaster @ To extract the portions of the reference genome corresponding to the ranges in \Rcode{U1.grl}, we can use the \Rfunction{extractTranscriptSeqs} function defined in the \Rpackage{GenomicFeatures} package: <>= library(GenomicFeatures) U1.GAL_rqseq <- extractTranscriptSeqs(Dmelanogaster, U1.grl) head(U1.GAL_rqseq) @ When reads are paired-end, we need to extract separately the ranges corresponding to their {\it first} ends (aka {\it first} segments in BAM jargon) and those corresponding to their {\it last} ends (aka {\it last} segments in BAM jargon): <>= U3.grl_first <- grglist(first(U3.GALP, real.strand=TRUE), order.as.in.query=TRUE) U3.grl_last <- grglist(last(U3.GALP, real.strand=TRUE), order.as.in.query=TRUE) @ Then we extract the portions of the reference genome corresponding to the ranges in \Rclass{GRangesList} objects \Rcode{U3.grl\_first} and \Rcode{U3.grl\_last}: <>= U3.GALP_rqseq1 <- extractTranscriptSeqs(Dmelanogaster, U3.grl_first) U3.GALP_rqseq2 <- extractTranscriptSeqs(Dmelanogaster, U3.grl_last) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Project the single-end alignments on the transcriptome} The \Rfunction{extractQueryStartInTranscript} function computes for each overlap the position of the {\it query start} in the transcript: <>= U1.OV00_qstart <- extractQueryStartInTranscript(U1.grl, exbytx, hits=U1.OV00, ovenc=U1.ovenc) head(subset(U1.OV00_qstart, U1.OV00_is_comp)) @ \Rcode{U1.OV00\_qstart} is a data frame with 1 row per overlap and 3 columns: \begin{enumerate} \item \Rcode{startInTranscript}: the 1-based start position of the read with respect to the transcript. Position 1 always corresponds to the first base on the 5' end of the transcript sequence. \item \Rcode{firstSpannedExonRank}: the rank of the first exon spanned by the read, that is, the rank of the exon found at position \Rcode{startInTranscript} in the transcript. \item \Rcode{startInFirstSpannedExon}: the 1-based start position of the read with respect to the first exon spanned by the read. \end{enumerate} Having this information allows us for example to compare the read and transcript nucleotide sequences for each ``splice compatible'' overlap. If we use the {\it reference query sequence} instead of the {\it original query sequence} for this comparison, then it should match {\bf exactly} the sequence found at the {\it query start} in the transcript. Let's start by using \Rfunction{extractTranscriptSeqs} again to extract the transcript sequences (aka transcriptome) from the dm3 reference genome: <>= txseq <- extractTranscriptSeqs(Dmelanogaster, exbytx) @ For each ``splice compatible'' overlap, the read sequence in \Rcode{U1.GAL\_rqseq} must be an {\it exact} substring of the transcript sequence in \Rcode{exbytx\_seq}: <>= U1.OV00_rqseq <- U1.GAL_rqseq[queryHits(U1.OV00)] U1.OV00_rqseq[flippedQuery(U1.ovenc)] <- reverseComplement(U1.OV00_rqseq[flippedQuery(U1.ovenc)]) U1.OV00_txseq <- txseq[subjectHits(U1.OV00)] stopifnot(all( U1.OV00_rqseq[U1.OV00_is_comp] == narrow(U1.OV00_txseq[U1.OV00_is_comp], start=U1.OV00_qstart$startInTranscript[U1.OV00_is_comp], width=width(U1.OV00_rqseq)[U1.OV00_is_comp]) )) @ Because of this relationship between the {\it reference query sequence} and the transcript sequence of a ``splice compatible'' overlap, and because of the relationship between the {\it original query sequences} and the {\it reference query sequences}, then the edit distance reported in the NM tag is actually the edit distance between the {\it original query} and the transcript of a ``splice compatible'' overlap. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Project the paired-end alignments on the transcriptome} For a paired-end read, the {\it query start} is the start of its ``left end''. <>= U3.OV00_Lqstart <- extractQueryStartInTranscript(U3.grl, exbytx, hits=U3.OV00, ovenc=U3.ovenc) head(subset(U3.OV00_Lqstart, U3.OV00_is_comp)) @ Note that \Rfunction{extractQueryStartInTranscript} can be called with \Rcode{for.query.right.end=TRUE} if we want this information for the ``right ends'' of the reads: <>= U3.OV00_Rqstart <- extractQueryStartInTranscript(U3.grl, exbytx, hits=U3.OV00, ovenc=U3.ovenc, for.query.right.end=TRUE) head(subset(U3.OV00_Rqstart, U3.OV00_is_comp)) @ Like with single-end reads, having this information allows us for example to compare the read and transcript nucleotide sequences for each ``splice compatible'' overlap. If we use the {\it reference query sequence} instead of the {\it original query sequence} for this comparison, then it should match {\bf exactly} the sequences of the ``left'' and ``right'' ends of the read in the transcript. Let's assign the ``left and right reference query sequences'' to each overlap: <>= U3.OV00_Lrqseq <- U3.GALP_rqseq1[queryHits(U3.OV00)] U3.OV00_Rrqseq <- U3.GALP_rqseq2[queryHits(U3.OV00)] @ For the single-end reads, the sequence associated with a ``flipped query'' just needed to be ``reverse complemented''. For paired-end reads, we also need to swap the 2 sequences in the pair: <>= flip_idx <- which(flippedQuery(U3.ovenc)) tmp <- U3.OV00_Lrqseq[flip_idx] U3.OV00_Lrqseq[flip_idx] <- reverseComplement(U3.OV00_Rrqseq[flip_idx]) U3.OV00_Rrqseq[flip_idx] <- reverseComplement(tmp) @ Let's assign the transcript sequence to each overlap: <>= U3.OV00_txseq <- txseq[subjectHits(U3.OV00)] @ For each ``splice compatible'' overlap, we expect the ``left and right reference query sequences'' of the read to be {\it exact} substrings of the transcript sequence. Let's check the ``left reference query sequences'': <>= stopifnot(all( U3.OV00_Lrqseq[U3.OV00_is_comp] == narrow(U3.OV00_txseq[U3.OV00_is_comp], start=U3.OV00_Lqstart$startInTranscript[U3.OV00_is_comp], width=width(U3.OV00_Lrqseq)[U3.OV00_is_comp]) )) @ and the ``right reference query sequences'': <>= stopifnot(all( U3.OV00_Rrqseq[U3.OV00_is_comp] == narrow(U3.OV00_txseq[U3.OV00_is_comp], start=U3.OV00_Rqstart$startInTranscript[U3.OV00_is_comp], width=width(U3.OV00_Rrqseq)[U3.OV00_is_comp]) )) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Align the reads to the transcriptome} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Aligning the reads to the reference genome is not the most efficient nor accurate way to count the number of ``splice compatible'' overlaps per {\it original query}. Supporting junction reads (i.e. reads that align with at least 1 skipped region in their CIGAR) introduces a significant computational cost during the alignment process. Then, as we've seen in the previous sections, each alignment produced by the aligner needs to be broken into a set of ranges (based on its CIGAR) and those ranges compared to the ranges of the exons grouped by transcript. A more straightforward and accurate approach is to align the reads directly to the transcriptome, and without allowing the typical skipped region that the aligner needs to introduce when aligning a junction read to the reference genome. With this approach, a ``hit'' between a read and a transcript is necessarily compatible with the splicing of the transcript. In case of a ``hit'', we'll say that the read and the transcript are ``string-based compatible'' (to differentiate from our previous notion of ``splice compatible'' overlaps that we will call ``encoding-based compatible'' in this section). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Align the single-end reads to the transcriptome} \subsubsection{Find the ``hits''} The single-end reads are in \Rcode{U1.oqseq}, the transcriptome is in \Rcode{exbytx\_seq}. Since indels were not allowed/supported during the alignment of the reads to the reference genome, we don't need to allow/support them either for aligning the reads to the transcriptome. Also since our goal is to find (and count) ``splice compatible'' overlaps between reads and transcripts, we don't need to keep track of the details of the alignments between the reads and the transcripts. Finally, since BAM file {\tt untreated1\_chr4.bam} is not the full output of the aligner but the subset obtained by keeping only the alignments located on chr4, we don't need to align \Rcode{U1.oqseq} to the full transcriptome, but only to the subset of \Rcode{exbytx\_seq} made of the transcripts located on chr4. With those simplifications in mind, we write the following function that we will use to find the ``hits'' between the reads and the transcriptome: <>= ### A wrapper to vwhichPDict() that supports IUPAC ambiguity codes in 'qseq' ### and 'txseq', and treats them as such. findSequenceHits <- function(qseq, txseq, which.txseq=NULL, max.mismatch=0) { .asHits <- function(x, pattern_length) { query_hits <- unlist(x) if (is.null(query_hits)) query_hits <- integer(0) subject_hits <- rep.int(seq_len(length(x)), elementNROWS(x)) Hits(query_hits, subject_hits, pattern_length, length(x), sort.by.query=TRUE) } .isHitInTranscriptBounds <- function(hits, qseq, txseq) { sapply(seq_len(length(hits)), function(i) { pattern <- qseq[[queryHits(hits)[i]]] subject <- txseq[[subjectHits(hits)[i]]] v <- matchPattern(pattern, subject, max.mismatch=max.mismatch, fixed=FALSE) any(1L <= start(v) & end(v) <= length(subject)) }) } if (!is.null(which.txseq)) { txseq0 <- txseq txseq <- txseq[which.txseq] } names(qseq) <- NULL other <- alphabetFrequency(qseq, baseOnly=TRUE)[ , "other"] is_clean <- other == 0L # "clean" means "no IUPAC ambiguity code" ## Find hits for "clean" original queries. qseq0 <- qseq[is_clean] pdict0 <- PDict(qseq0, max.mismatch=max.mismatch) m0 <- vwhichPDict(pdict0, txseq, max.mismatch=max.mismatch, fixed="pattern") hits0 <- .asHits(m0, length(qseq0)) hits0@nLnode <- length(qseq) hits0@from <- which(is_clean)[hits0@from] ## Find hits for non "clean" original queries. qseq1 <- qseq[!is_clean] m1 <- vwhichPDict(qseq1, txseq, max.mismatch=max.mismatch, fixed=FALSE) hits1 <- .asHits(m1, length(qseq1)) hits1@nLnode <- length(qseq) hits1@from <- which(!is_clean)[hits1@from] ## Combine the hits. query_hits <- c(queryHits(hits0), queryHits(hits1)) subject_hits <- c(subjectHits(hits0), subjectHits(hits1)) if (!is.null(which.txseq)) { ## Remap the hits. txseq <- txseq0 subject_hits <- which.txseq[subject_hits] hits0@nRnode <- length(txseq) } ## Order the hits. oo <- orderIntegerPairs(query_hits, subject_hits) hits0@from <- query_hits[oo] hits0@to <- subject_hits[oo] if (max.mismatch != 0L) { ## Keep only "in bounds" hits. is_in_bounds <- .isHitInTranscriptBounds(hits0, qseq, txseq) hits0 <- hits0[is_in_bounds] } hits0 } @ Let's compute the index of the transcripts in \Rcode{exbytx\_seq} located on chr4 (\Rfunction{findSequenceHits} will restrict the search to those transcripts): <>= chr4tx <- transcripts(txdb, vals=list(tx_chrom="chr4")) chr4txnames <- mcols(chr4tx)$tx_name which.txseq <- match(chr4txnames, names(txseq)) @ We know that the aligner tolerated up to 6 mismatches per read. The 3 following commands find the ``hits'' for each {\it original query}, then find the ``hits'' for each ``flipped {\it original query}'', and finally merge all the ``hits'' (note that the 3 commands take about 1 hour to complete on a modern laptop): <>= U1.sbcompHITSa <- findSequenceHits(U1.oqseq, txseq, which.txseq=which.txseq, max.mismatch=6) U1.sbcompHITSb <- findSequenceHits(reverseComplement(U1.oqseq), txseq, which.txseq=which.txseq, max.mismatch=6) U1.sbcompHITS <- union(U1.sbcompHITSa, U1.sbcompHITSb) @ <>= U1.sbcompHITSa <- .loadPrecomputed("U1.sbcompHITSa") U1.sbcompHITSb <- .loadPrecomputed("U1.sbcompHITSb") U1.sbcompHITS <- union(U1.sbcompHITSa, U1.sbcompHITSb) @ \subsubsection{Tabulate the ``hits''} Number of ``string-based compatible'' transcripts for each read: <>= U1.uqnames_nsbcomptx <- countQueryHits(U1.sbcompHITS) names(U1.uqnames_nsbcomptx) <- U1.uqnames table(U1.uqnames_nsbcomptx) mean(U1.uqnames_nsbcomptx >= 1) @ 77.7\% of the reads are ``string-based compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``string-based compatible'' reads for each transcript: <>= U1.exbytx_nsbcompHITS <- countSubjectHits(U1.sbcompHITS) names(U1.exbytx_nsbcompHITS) <- names(exbytx) mean(U1.exbytx_nsbcompHITS >= 50) @ Only 0.865\% of the transcripts in \Rcode{exbytx} are ``string-based compatible'' with at least 50 reads. Top 10 transcripts: <>= head(sort(U1.exbytx_nsbcompHITS, decreasing=TRUE), n=10) @ \subsubsection{A closer look at the ``hits''} [WORK IN PROGRESS, might be removed or replaced soon...] Any ``encoding-based compatible'' overlap is of course ``string-based compatible'': <>= stopifnot(length(setdiff(U1.compOV10, U1.sbcompHITS)) == 0) @ but the reverse is not true: <>= length(setdiff(U1.sbcompHITS, U1.compOV10)) @ %To understand why the {\it overlap encodings} approach doesn't find all %the ``string-based compatible'' hits, let's look at the second hit in %\Rcode{setdiff(U1.sbcompHITS, U1.compOV10)}. This is a perfect hit between %read SRR031728.4692406 and transcript 18924: % %<<>>= %matchPattern(U1.oqseq[[6306]], txseq[[18924]]) %U1.GAL_idx <- which(U1.GAL_qnames == "SRR031728.4692406") %U1.GAL[U1.GAL_idx] %U1.GAL_idx %in% queryHits(U1.OV00) %U1.GAL[12636] %which(queryHits(U1.OV00) == 12636) %U1.OV00[305] %as.character(encoding(U1.ovenc)[305]) %@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Align the paired-end reads to the transcriptome} [COMING SOON...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Detect ``almost splice compatible'' overlaps} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In many aspects, ``splice compatible'' overlaps can be seen as perfect. We are now insterested in a less perfect type of overlap where the read overlaps the transcript in a way that {\it would} be ``splice compatible'' if 1 or more exons were removed from the transcript. In that case we say that the overlap is ``almost splice compatible'' with the transcript. The \Rfunction{isCompatibleWithSkippedExons} function can be used on an \Rclass{OverlapEncodings} object to detect this type of overlap. Note that \Rfunction{isCompatibleWithSkippedExons} can also be used on a character vector of factor. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``almost splice compatible'' single-end overlaps} \subsubsection{``Almost splice compatible'' single-end encodings} \Rcode{U1.ovenc} contains 7 unique encodings ``almost splice compatible'' with the splicing of the transcript: <>= sort(U1.ovenc_table[isCompatibleWithSkippedExons(U1.unique_encodings)]) @ Encodings \Rcode{"2:jm:am:af:"} (1015 occurences in \Rcode{U1.ovenc}), \Rcode{"2:jm:am:am:af:"} (144 occurences in \Rcode{U1.ovenc}), and \Rcode{"3:jmm:agm:aam:aaf:"} (21 occurences in \Rcode{U1.ovenc}), correspond to the following overlaps: \begin{itemize} \item \Rcode{"2:jm:am:af:"} \begin{verbatim} - read (1 skipped region): ooooo----------ooo - transcript: ... >>>>>>> >>>> >>>>>>>> ... \end{verbatim} \item \Rcode{"2:jm:am:am:af:"} \begin{verbatim} - read (1 skipped region): ooooo------------------ooo - transcript: ... >>>>>>> >>>> >>>>> >>>>>>>> ... \end{verbatim} \item \Rcode{"3:jmm:agm:aam:aaf:"} \begin{verbatim} - read (2 skipped regions): oo---oooo-----------oo - transcript: ... >>>>>>> >>>> >>>>> >>>>>>>> ... \end{verbatim} \end{itemize} <>= U1.OV00_is_acomp <- isCompatibleWithSkippedExons(U1.ovenc) table(U1.OV00_is_acomp) # 1202 "almost splice compatible" overlaps @ Finally, let's extract the ``almost splice compatible'' overlaps from \Rcode{U1.OV00}: <>= U1.acompOV00 <- U1.OV00[U1.OV00_is_acomp] @ \subsubsection{Tabulate the ``almost splice compatible'' single-end overlaps} Number of ``almost splice compatible'' transcripts for each alignment in \Rcode{U1.GAL}: <>= U1.GAL_nacomptx <- countQueryHits(U1.acompOV00) mcols(U1.GAL)$nacomptx <- U1.GAL_nacomptx head(U1.GAL) table(U1.GAL_nacomptx) mean(U1.GAL_nacomptx >= 1) @ Only 0.27\% of the alignments in \Rcode{U1.GAL} are ``almost splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``almost splice compatible'' alignments for each transcript: <>= U1.exbytx_nacompOV00 <- countSubjectHits(U1.acompOV00) names(U1.exbytx_nacompOV00) <- names(exbytx) table(U1.exbytx_nacompOV00) mean(U1.exbytx_nacompOV00 >= 50) @ Only 0.017\% of the transcripts in \Rcode{exbytx} are ``almost splice compatible'' with at least 50 alignments in \Rcode{U1.GAL}. Finally note that the ``query start in transcript'' values returned by \Rfunction{extractQueryStartInTranscript} are also defined for ``almost splice compatible'' overlaps: <>= head(subset(U1.OV00_qstart, U1.OV00_is_acomp)) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Detect ``almost splice compatible'' paired-end overlaps} \subsubsection{``Almost splice compatible'' paired-end encodings} \Rcode{U3.ovenc} contains 5 unique paired-end encodings ``almost splice compatible'' with the splicing of the transcript: <>= sort(U3.ovenc_table[isCompatibleWithSkippedExons(U3.unique_encodings)]) @ Paired-end encodings \Rcode{"2{-}{-}1:jm{-}{-}m:am{-}{-}m:af{-}{-}i:"} (73 occurences in \Rcode{U3.ovenc}), \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}am:a{-}{-}af:"} (53 occurences in \Rcode{U3.ovenc}), and \Rcode{"2{-}{-}2:jm{-}{-}mm:am{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} (9 occurences in \Rcode{U3.ovenc}), correspond to the following paired-end overlaps: \begin{itemize} \item \Rcode{"2{-}{-}1:jm{-}{-}m:am{-}{-}m:af{-}{-}i:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, no skipped region on the last end): ooo----------o oooo - transcript: ... >>>>> >>>> >>>>>>>>> ... \end{verbatim} \item \Rcode{"1{-}{-}2:i{-}{-}jm:a{-}{-}am:a{-}{-}af:"} \begin{verbatim} - paired-end read (no skipped region on the first end, 1 skipped region on the last end): oooo oo---------oo - transcript: ... >>>>>>>>>>> >>> >>>>>> ... \end{verbatim} \item \Rcode{"2{-}{-}2:jm{-}{-}mm:am{-}{-}mm:af{-}{-}jm:aa{-}{-}af:"} \begin{verbatim} - paired-end read (1 skipped region on the first end, 1 skipped region on the last end): o----------ooo oo---oo - transcript: ... >>>>> >>>> >>>>>>>> >>>>>> ... \end{verbatim} \end{itemize} Note: switch use of ``first'' and ``last'' above if the read was ``flipped''. <>= U3.OV00_is_acomp <- isCompatibleWithSkippedExons(U3.ovenc) table(U3.OV00_is_acomp) # 141 "almost splice compatible" paired-end overlaps @ Finally, let's extract the ``almost splice compatible'' paired-end overlaps from \Rcode{U3.OV00}: <>= U3.acompOV00 <- U3.OV00[U3.OV00_is_acomp] @ \subsubsection{Tabulate the ``almost splice compatible'' paired-end overlaps} Number of ``almost splice compatible'' transcripts for each alignment pair in \Rcode{U3.GALP}: <>= U3.GALP_nacomptx <- countQueryHits(U3.acompOV00) mcols(U3.GALP)$nacomptx <- U3.GALP_nacomptx head(U3.GALP) table(U3.GALP_nacomptx) mean(U3.GALP_nacomptx >= 1) @ Only 0.2\% of the alignment pairs in \Rcode{U3.GALP} are ``almost splice compatible'' with at least 1 transcript in \Rcode{exbytx}. Number of ``almost splice compatible'' alignment pairs for each transcript: <>= U3.exbytx_nacompOV00 <- countSubjectHits(U3.acompOV00) names(U3.exbytx_nacompOV00) <- names(exbytx) table(U3.exbytx_nacompOV00) mean(U3.exbytx_nacompOV00 >= 50) @ Only 0.0034\% of the transcripts in \Rcode{exbytx} are ``almost splice compatible'' with at least 50 alignment pairs in \Rcode{U3.GALP}. Finally note that the ``query start in transcript'' values returned by \Rfunction{extractQueryStartInTranscript} are also defined for ``almost splice compatible'' paired-end overlaps: <>= head(subset(U3.OV00_Lqstart, U3.OV00_is_acomp)) head(subset(U3.OV00_Rqstart, U3.OV00_is_acomp)) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Detect novel splice junctions} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{By looking at single-end overlaps} An alignment in \Rcode{U1.GAL} with ``almost splice compatible'' overlaps but no ``splice compatible'' overlaps suggests the presence of one or more transcripts that are not in our annotations. First we extract the index of those alignments ({\it nsj} here stands for ``{\bf n}ovel {\bf s}plice {\bf j}unction''): <>= U1.GAL_is_nsj <- U1.GAL_nacomptx != 0L & U1.GAL_ncomptx == 0L head(which(U1.GAL_is_nsj)) @ We make this an index into \Rcode{U1.OV00}: <>= U1.OV00_is_nsj <- queryHits(U1.OV00) %in% which(U1.GAL_is_nsj) @ We intersect with \Rcode{U1.OV00\_is\_acomp} and then subset \Rcode{U1.OV00} to keep only the overlaps that suggest novel splicing: <>= U1.OV00_is_nsj <- U1.OV00_is_nsj & U1.OV00_is_acomp U1.nsjOV00 <- U1.OV00[U1.OV00_is_nsj] @ For each overlap in \Rcode{U1.nsjOV00}, we extract the ranks of the skipped exons (we use a list for this as there might be more than 1 skipped exon per overlap): <>= U1.nsjOV00_skippedex <- extractSkippedExonRanks(U1.ovenc)[U1.OV00_is_nsj] names(U1.nsjOV00_skippedex) <- queryHits(U1.nsjOV00) table(elementNROWS(U1.nsjOV00_skippedex)) @ Finally, we split \Rcode{U1.nsjOV00\_skippedex} by transcript names: <>= f <- factor(names(exbytx)[subjectHits(U1.nsjOV00)], levels=names(exbytx)) U1.exbytx_skippedex <- split(U1.nsjOV00_skippedex, f) @ \Rcode{U1.exbytx\_skippedex} is a named list of named lists of integer vectors. The first level of names (outer names) are transcript names and the second level of names (inner names) are alignment indices into \Rcode{U1.GAL}: <>= head(names(U1.exbytx_skippedex)) # transcript names @ Transcript FBtr0089124 receives 7 hits. All of them skip exons 9 and 10: <>= U1.exbytx_skippedex$FBtr0089124 @ Transcript FBtr0089147 receives 4 hits. Two of them skip exon 2, one of them skips exons 2 to 6, and one of them skips exon 10: <>= U1.exbytx_skippedex$FBtr0089147 @ A few words about the interpretation of \Rcode{U1.exbytx\_skippedex}: Because of how we've conducted this analysis, the aligments reported in \Rcode{U1.exbytx\_skippedex} are guaranteed to not have any ``splice compatible'' overlaps with other known transcripts. All we can say, for example in the case of transcript FBtr0089124, is that the 7 reported hits that skip exons 9 and 10 show evidence of one or more unknown transcripts with a splice junction that corresponds to the gap between exons 8 and 11. But without further analysis, we can't make any assumption about the exons structure of those unknown transcripts. In particular, we cannot assume the existence of an unknown transcript made of the same exons as transcript FBtr0089124 minus exons 9 and 10! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{By looking at paired-end overlaps} [COMING SOON...] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rcode{sessionInfo()}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= sessionInfo() @ \end{document} GenomicAlignments/vignettes/WorkingWithAlignedNucleotides.Rnw0000644000175400017540000003411613175714431025655 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{Working with aligned nucleotides} %\VignetteDepends{GenomicAlignments, RNAseqData.HNRNPC.bam.chr14, pasillaBamSubset, BSgenome.Hsapiens.UCSC.hg19, BSgenome.Dmelanogaster.UCSC.dm3, GenomicFeatures, TxDb.Hsapiens.UCSC.hg19.knownGene, TxDb.Dmelanogaster.UCSC.dm3.ensGene} %\VignetteKeywords{sequence, sequencing, alignments} %\VignettePackage{GenomicAlignments} \documentclass{article} <>= BiocStyle::latex() @ \title{Working with aligned nucleotides (WORK-IN-PROGRESS!)} \author{Herv\'e Pag\`es} \date{Last modified: January 2014; Compiled: \today} \begin{document} \maketitle \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% This vignette belongs to the \Rpackage{GenomicAlignments} package. It illustrates how to use the package for working with the nucleotide content of aligned reads. After the reads generated by a high-throughput sequencing experiment have been aligned to a reference genome, the questions that are being asked about these alignments typically fall in two broad categories: {\bf positional only} and {\bf nucleotide-related}. {\bf Positional only} questions are about the position of the alignments with respect to the reference genome. Note that the position of an alignment is actually better described in terms of genomic ranges (1 range for an alignment with no gaps, 2 or more ranges for an alignment with gaps). Knowing the ranges of the alignments is sufficient to perform common tasks like {\it read counting} or for {\it computing the coverage}. {\it Read counting} is the process of counting the number of aligned reads per gene or exon and is typically performed in the context of a differential analysis. This task can be accomplished with the \Rfunction{summarizeOverlaps} function provided in the \Rpackage{GenomicAlignments} package and is explained in details in the ``Counting reads with summarizeOverlaps'' vignette (also located in this package). {\it Computing the coverage} is often the preliminary step to peak detection (ChIP-seq analysis) or to a copy number analysis. It can be accomplished with the \Rfunction{coverage} function. See \Rcode{?\`{}coverage-methods\`{}} for more information. {\bf Nucleotide-related} questions are about the nucleotide content of the alignments. In particular how this content compares to the corresponding nucleotides in the reference genome. These questions typically arise in the context of small genetic variation detection between one or more samples and a reference genome. The \Rpackage{GenomicAlignments} package provides a suite of low- to mid-level tools for dealing with {\bf nucleotide-related} questions about the alignments. In this vignette we illustrate their use on the single-end and paired-end reads of an RNA-seq experiment. Note that these tools do NOT constitute a complete variant toolbox. If this is what you're looking for, other \Bioconductor{} packages might be more appropriate. See the GeneticVariability and SNP views at this URL \url{http://bioconductor.org/packages/release/BiocViews.html#___AssayDomains} for a complete list of packages that deal with small genetic variations. Most of them provide tools of higher level than the tools described in this vignette. See for example the \Rpackage{VariantTools} and \Rpackage{VariantAnnotation} packages for a complete variant toolbox (including variant calling capabilities). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Load the aligned reads and their sequences from a BAM file} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% In this section, we illustrate how aligned reads and their sequences can be loaded from a BAM file. The reads we're going to use for this are paired-end reads from a published study by Zarnack et al., 2012. A subset of these reads are stored in the BAM files located in the \Rpackage{RNAseqData.HNRNPC.bam.chr14} data package. The package contains 8 BAM files, 1 per sequencing run: <>= library(RNAseqData.HNRNPC.bam.chr14) bamfiles <- RNAseqData.HNRNPC.bam.chr14_BAMFILES names(bamfiles) # the names of the runs @ Each BAM file was obtained by (1) aligning the reads (paired-end) to the full hg19 genome with TopHat2, and then (2) subsetting to keep only alignments on chr14. See \Rcode{?RNAseqData.HNRNPC.bam.chr14} for more information about this data set. As a preliminary step, we check whether the BAM files contain single- or paired-end alignments. This can be done with the \Rfunction{quickBamFlagSummary} utility from the \Rpackage{Rsamtools} package: <>= library(Rsamtools) quickBamFlagSummary(bamfiles[1], main.groups.only=TRUE) @ This confirms that all the alignments in the 1st BAM file (run ERR127306) are paired-end. This means that we should preferably load them with the \Rfunction{readGAlignmentPairs} function from the \Rpackage{GenomicAlignments} package. However for the purpose of keeping things simple, we will ignore the pairing for now and load only the alignments corresponding to the first segment of the pairs. We will use the \Rfunction{readGAlignments} function from the \Rpackage{GenomicAlignments} package for this, together with a \Rclass{ScanBamParam} object for the filtering. See \Rcode{?ScanBamParam} in the \Rpackage{Rsamtools} package for the details. Furthermore, while preparing the \Rclass{ScanBamParam} object to perform the filtering, we'll also get rid of the PCR or optical duplicates (flag bit 0x400 in the SAM format, see the SAM Spec \footnote{\url{http://samtools.sourceforge.net/}} for the details), as well as reads not passing quality controls (flag bit 0x200 in the SAM format). Finally we also request the read sequences (a.k.a. the {\it segment sequences} in the SAM Spec, stored in the SEQ field) via the \Rclass{ScanBamParam} object: <>= flag1 <- scanBamFlag(isFirstMateRead=TRUE, isSecondMateRead=FALSE, isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param1 <- ScanBamParam(flag=flag1, what="seq") @ We're now ready to load the alignments and their sequences. Note that we use \Rcode{use.names=TRUE} in order to also load the {\it query names} (a.k.a. the {\it query template names} in the SAM Spec, stored in the QNAME field) from the BAM file. \Rfunction{readGAlignments} will use them to set the names of the returned object: <>= library(GenomicAlignments) gal1 <- readGAlignments(bamfiles[1], use.names=TRUE, param=param1) @ This returns a \Rclass{GAlignments} object. The read sequences are stored in the \Rcode{seq} metadata column of the object: <>= mcols(gal1)$seq @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Compute the {\it original query sequences}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Because the BAM format imposes that the read sequence is ``reverse complemented'' when a read aligns to the minus strand, we need to ``reverse complement'' it again to restore the {\it original query sequences} (i.e. the sequences before alignment, that is, as they can be seen in the FASTQ file assuming that the aligner didn't perform any hard-clipping on them): <>= oqseq1 <- mcols(gal1)$seq is_on_minus <- as.logical(strand(gal1) == "-") oqseq1[is_on_minus] <- reverseComplement(oqseq1[is_on_minus]) @ Because the aligner used to align the reads can report more than 1 alignment per read (i.e. per sequence stored in the FASTQ file), we shouldn't expect the names of \Rcode{gal1} to be unique: <>= is_dup <- duplicated(names(gal1)) table(is_dup) @ However, sequences with the same {\it query name} should correspond to the same {\it original query} and therefore should be the same. Let's do a quick sanity check: <>= dup2unq <- match(names(gal1), names(gal1)) stopifnot(all(oqseq1 == oqseq1[dup2unq])) @ Finally, let's reduce \Rcode{oqseq1} to one {\it original query sequence} per unique {\it query name} (like in the FASTQ file containing the 1st end of the unaligned reads): <>= oqseq1 <- oqseq1[!is_dup] @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Mismatches, indels, and gaps} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Because the aligner possibly tolerated a small number of mismatches, indels, and/or gaps during the alignment process, the sequences in \Rcode{mcols(gal1)\$seq} gnerally don't match exactly the reference genome. The information of where indels and/or gaps occur in the alignments is represented in the CIGAR strings. Let's have a look at these string. First the most frequent cigars: <>= head(sort(table(cigar(gal1)), decreasing=TRUE)) @ Then a summary of the total number of insertions (I), deletions (D), and gaps (N): <>= colSums(cigarOpTable(cigar(gal1))) @ This tells us that the aligner that was used supports indels (I/D) and junction reads (N). Finally we count and summarize the number of gaps per alignment: <>= table(njunc(gal1)) @ Some reads contain up to 3 gaps (i.e. span 3 splice junctions). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Put the read sequences and reference sequences ``side by side''} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TODO (with \Rfunction{sequenceLayer}) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{OLD STUFF (needs to be recycled/updated)} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Load paired-end reads from a BAM file} BAM file {\tt untreated3\_chr4.bam} (located in the \Rpackage{pasillaBamSubset} data package) contains paired-end reads from the ``Pasilla'' experiment and aligned against the dm3 genome (see \Rcode{?untreated3\_chr4} in the \Rpackage{pasillaBamSubset} package for more information about those reads). We use the \Rfunction{readGAlignmentPairs} function to load them into a \Rclass{GAlignmentPairs} object: <>= library(pasillaBamSubset) flag0 <- scanBamFlag(isDuplicate=FALSE, isNotPassingQualityControls=FALSE) param0 <- ScanBamParam(flag=flag0) U3.galp <- readGAlignmentPairs(untreated3_chr4(), use.names=TRUE, param=param0) head(U3.galp) @ The \Rcode{show} method for \Rclass{GAlignmentPairs} objects displays two {\tt ranges} columns, one for the {\it first} alignment in the pair (the left column), and one for the {\it last} alignment in the pair (the right column). The {\tt strand} column corresponds to the strand of the {\it first} alignment. <>= head(first(U3.galp)) head(last(U3.galp)) @ According to the SAM format specifications, the aligner is expected to mark each alignment pair as {\it proper} or not (flag bit 0x2 in the SAM format). The SAM Spec only says that a pair is {\it proper} if the {\it first} and {\it last} alignments in the pair are ``properly aligned according to the aligner''. So the exact criteria used for setting this flag is left to the aligner. We use \Rcode{isProperPair} to extract this flag from the \Rclass{GAlignmentPairs} object: <>= table(isProperPair(U3.galp)) @ Even though we could do {\it overlap encodings} with the full object, we keep only the {\it proper} pairs for our downstream analysis: <>= U3.GALP <- U3.galp[isProperPair(U3.galp)] @ Because the aligner used to align those reads can report more than 1 alignment per {\it original query template} (i.e. per pair of sequences stored in the input files, typically 1 FASTQ file for the {\it first} ends and 1 FASTQ file for the {\it last} ends), we shouldn't expect the names of \Rcode{U3.GALP} to be unique: <>= U3.GALP_names_is_dup <- duplicated(names(U3.GALP)) table(U3.GALP_names_is_dup) @ Storing the {\it query template names} in a factor will be useful: <>= U3.uqnames <- unique(names(U3.GALP)) U3.GALP_qnames <- factor(names(U3.GALP), levels=U3.uqnames) @ as well as having the mapping between each {\it query template name} and its first occurence in \Rcode{U3.GALP\_qnames}: <>= U3.GALP_dup2unq <- match(U3.GALP_qnames, U3.GALP_qnames) @ Our reads can have up to 1 gap per end: <>= head(unique(cigar(first(U3.GALP)))) head(unique(cigar(last(U3.GALP)))) table(njunc(first(U3.GALP)), njunc(last(U3.GALP))) @ Like for our single-end reads, the following tables indicate that indels were not allowed/supported during the alignment process: <>= colSums(cigarOpTable(cigar(first(U3.GALP)))) colSums(cigarOpTable(cigar(last(U3.GALP)))) @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{\Rcode{sessionInfo()}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= sessionInfo() @ \end{document} GenomicAlignments/vignettes/precomputed_results/0000755000175400017540000000000013175714431023331 5ustar00biocbuildbiocbuildGenomicAlignments/vignettes/precomputed_results/U1.sbcompHITSa.rda0000644000175400017540000044215713175714431026436 0ustar00biocbuildbiocbuildee?nP$SDTKiDQ ))AC nx;5q}8={fykߪU~фO+3ĎbOI)ةEOwTN#VE6~>g]t?i::t?t3J(7J(bF!fbN!XbY!VXbM!b!8p#!8D!x6v!ⅈ"A!x>D/H"U!҄HB%DBd3DyC Q K!x9ī!J(ox3DBQ)DBCQ3DC Q/DMC4"DB&D0G!ڇ8D]B|߆{!zO!!D?)CC 1<B1&B1!BSBL 1-3BG! 0ĢC, "B&B!C3ĮC 7ľCq0đBq&8bC\ q=č7C q/ăB<{B DB$$DB bt!҇"cL!^ Q"D(|wB nB40DC4 ,D-C &DB|߅[!zC 1$İC12ĨCL s_B{y!Xbqe!VXbuM!6b[!vbo}!8h!N8bC\ q3ĭC q7ĽC<0ģ +D C$4!x!DC >DB 7DC Q8DECXCJBQ:[!*R!Z!jv:!ꆨC4 (DMB ~v!>qOBt iN!> y/Bt%ķ! 5DC|G^!z?bT!sC, $kB 1Ħ[Bl W!8p!8D!N8Bq!Ŀ!z!a!x[!b"iB<"y!^ .DBd )DYBd -DB'DB Q$D/x9Dx5k!Q9DohmC I/Bte!z_A!bha!bdQ!Fblq!&bRCLk!fbv9!=ļC C, 8ĒKC,"Bl1;Bbg]!vb_!8p#!8T!΅C\ q=ĭC B<$2 +DqB DB$ 4DC *DiBd)DYBd =D9C ;DB Q8+!^ Q"DBCL!*J!x;;!jN!hY!Zh0'!:]B|kn!>DC 7D?B 14Ĉ#C 16ĸCL11!bz!X C,`qK"XVD*`}"vE;@#8.Ep9+\z7"nGp7{܏AocG'ď A"x.#x1d k#ArG7|`E"(K^D%#(A*DP1JTj"x'Zԍ^F,V>}G1O#g|tDU_GMF-|AD7#D04`tc"&EsD09_#G0#̍`~Dg #XD4e`e"@#8Fp,d"8Gp!\j"Dp/D/H"u4!҆x1DCd9DYCd jɚ3JԞ5jɚ'J(Q{L֨%kEB(%BTQ%D-B *DmB AC|}C|COCt YC|߆!bha!Fbt1!ƆbRCbr_CL 1-3B 1'b~?B, ,Cl W!vbo!8tLl|Bb jgz%(Q{G֨!k~-*g%^Q2zQEI%I|-*g{.JTΖ2JT6oEelQ94[(Del٣DlQ.[y#Q? G(E(/GTjQ?ǻ4?GhU#h|'tc",#tk"D00 `d"&G05iL`FE03Y,`Y#XG!Ḿ-;NNNN.Gp%܌vw"F=nā$d)YY99y%%((x;NFfV@{FƁ&fv> tt|:5-=3'7/0 080,0<0"0#07{`^`A_;{GG''gg. \ \\ \ \ \ <<< < <_Q%bbbb^ d      x#ft@@;wMM--:> |2U7o  =0/0?G`A52W@@@@@@@󁴁t􁌁Ĺ,lB"WJJ** T hhhhhhhhhhhh0Q'O]_ |!?c/Ɂ_SS3fff~ XXXXXXXXXX+=#w`g`W`w`O`o`_pXxdTtL\|BbJFfn^~AaQ+F v n ^ ~ A k [ { G g W`PphXx@@@@@@@@@@@@@> t |"ekgwOOAQс1Yف9+[vvNN \\ \ \\ \ \ \ < <_Q $ $ $HHHHHH((((x)J@7o* 4 4 4  |,E7]~ %09k`J`j`Z`zy? KK+kk[[;{{pqpwqϢ剁8xDHHHHY 9 PQEP$Ju2(r( ʨZhh&hhht9: 7=z/?~@ P(xLDLdLTLtLl\,B,R,r*ZD͉<[vva/a?$,*:n6.Q1 q<@JBjC&@NB>FCqWJ (jxQ}01C1 1a&faccvE+_3~@011C1 1#1 c-XX5X^ڄ-X$s S 70˟s|^>xx,A\C|$@"$F$E27}??~O1q I`2~o٘X%XXXXX؀؄؆;7vbvcNN y\EK+k[;{xGxx-jE؈HHHH<@*FŋHȀȄȂȆȅȃȇ(((x 2P%Q x eQQQ QUQ oTG D-FE=x M - m>|cVc-vo.>y\Ŀ˸븁[xGx'x-l@LBlA\C$sHi"!2"2# !;r 'r!!? 0eWQ%Q oM[(r( J*jx5P QuQ1Z }Ç.]?`c!cIR}01qqQ%PD]ûx !>FG|N]57*Zzl&ll6؁{ppGpp'ppgp._\e\5\ Atg_37] =z'z?~OQ1 xt)7QQU6Au@MBmA]4GKBkA[eX8s+k[;{ѢZR!5 -ң^(W*^C FE3 ` Lb bcfbfc.a>XXXXXXX؀؄؊m ۱c'va7`/a? 0(8N$N4,9ǿ˸븁;{xGxx-j,F؈HHHHHȈLȌȁȃ|(((x 5@Ixʠ,ʡ* :j&j6.]{hhhhVh6hc|O>]5=}??~OAQ Ib*a:f7,\X?˰+  [a;v`bN4,9\Ŀ+k۸{xxx-jDX<#R"R# ^D:GdDdE6dGNBnA^C~@!FKxU@Ixo ʢʣ** ;_0a&fa6`.~<X?K˰+kcN>!1 )?8󸀋pWpp7ppOϢEh1q /  -!=2 #2!3 +!r"r#" J (򨀊*jj]{hhhhhVh6hC|:Stg_3D| CWtCw|^>~#~  0 (8L$_0b bc~Ll\y?b!a1`)a9V`%Va5`-a=6`#6a3`+/l]؍=؋}؏8C8#8c88S838pq/.2*:n&n6.>!1)Eb &b!6 .!> !!1 )9C4D#4F4E34G D+Fh:Stg_ ߡ+;GD/F_bcbcFbFc bc&gS003fa6`.~<X?K˰+k[cNn^~AaQqIiYs8 q qWq q7qwpO,ZT<1  IGrHTH4H Y ّ_?c&cfwRJFl\Ǎh%+tG0 (XxL$_0b*a:f7l\:lfl6lǞhG AF@NBnE~@A›(PeQQQUQ oTG D-FE=x M-m>1>Atħ:KtW[|=}GA!aQ1q1b bc~Ll\y?b!a1`)a9V`%Va5`-a=6`#6a3`+/l؅؃؇8888888pp. nnG<0S1 3fb`.~<XXXeXXXuX،-؊;7va/ 0N4\Ŀ˸k;{xGx'ѢwX8xHDH$H<@JBjAZCzd@FdBfdGD.FE>@ABaAQb(P%Q [(r( ʨjjE}hFh&hfhhVhx>Gh :#:3|/_ ;tCw@OFE??abcbF`$Fc bc"&gS003fbvN^A1 iYs8 qWpp7ppwppOϢEh1q Iy@JBjAZB9T@ETFD]Fh&h6hvh.[tEw|^>~#` a0`(a8F`$Fa4`,a<&`"&g_1S1 1a&fa6`.~<X?K˰+k[a;vo.>!QqIiYs8 Kk۸xxxx-j1 qR %R!5 -^D:GdD&dFdE6dGBnA>GD!FK(QU(RxoM[((򨀊ʨjjE}hFh&hfhhVh6hC|:Stg_3D| wn= 1C00#1c01 &WLTLtoY91O,",,2, n>AaQqIiYs8 q qWq q7q qwqO,ZԨ1 q I y$ HHHxYِ9yPPEP/^FqWJ$Ju7Qo ʢʣ** ;Z:zx!1)9Z%Z5ڠ-G;|c|>/_k|o{@OBo` a0`(a8Fa4a<&`"&LƯi0 s0c,XEX%XeXXUXX؀؄؂؆;7vb`/a? 0(8N$N4,<."%\U\Mm]}GD!FK(QJ^xʠ,ʡ<*"*2*mꨁڨx M-m>1>Atħ9@g|. _|ߣzz?~O1q I`2~L4L ٘0`B,b,R,rJjZzlFll6؁{ppGpp'ppgp._\e\U\uMm]}GBaAQbx ^k(xoM[((򨀊ʨjjE}hFh&hfhhVh6hC|:Stg_3D| wn= }??~O񘀉 &c bcfbfcw| K ˱+ k [ a;vo.>!1 )?8󸀋pWpp7ppwppOϢEŃh1q IGrHTH4H Y ّ9 yQQQEe+xJ^xʠ,ʡ<*"*2*mꨁڨwQ ZZ }=>'耎>/_k|ozz~@00C01S1 30sb!`)cVbb6a+cNn^~AaQqIiYs8 q qWq 7ppwppOϢEh1q IGrHTH4H Y ّ yQQEP/^FqWJ$Ju7Qo ʢʣ** ;Z:wQ ZZ }=>'耎>/_k|o{@OBoA_` a0`(a8F`$Fa4`,a<&`"&a2~L4٘0`!a1`)a9V``-a=6`#6acvbvcbNN y\E\e\U\ -=<#GDaAQbxU([((ʨjx:jjE}hFh&hfhhVh6h#>%+|o{@OBoA_` a0`cFbFc b<&`"&gS1 1a&O,b,R,rJzl&lVl.~!qIiYs8 qWq q7qwqOϢՎ8xHDHx#R"R# !2"+#r!7 ? 0(e+xJux PPPj6.]GC4Bc4A3D+tAw@E?011 01b:f`&fa~<,B,,2jf; {qgpq:n&nY:1qI ) i"!=2 #2# "#r"7!? e@)(r(Q5P P1Z%ڠ-G;|ctħ {BE?  0 HXxL$ɘ阅٘?K ˱[.>1YsqWpqq8ZHDH/ %^DzdD&dF6C4DsÇhiY?˱O4ZUDHHx) pq ڻIP M - t;t^ˎ\ȍ(Ҩ!aX?˰kv`70\Ŀ븁۸{xGx'xgѢux eQQ5M - >@w/X%XeXXUXX؀؄؂؁{ppppO,ZqY9 yQPEe+xJ^xʠ,ʡ<*"*2*mꨁڨwQ ZZ }=>'耎>/_k|o{@OBoA_` a0`(a8F`$Fa4`,a<&`"&gS003fbfcw| K ˱+ k [ a;vo.>!1 )?8󸀋˸븁۸xxxx-j4G؈HHHH/ R"5 -^D:GdDfdAVdCv@NBnA^GBaAQbx %P:(PeQQQ QUQ oTG D-FE=x M-m>1>Atħ9@g|. _|}G!aQ1qI0300s0c,XEX%XeXXUX5XuX ؈M،-؊m ۱c'va7`/a? 0(8N$N4,9\Ŀ˸븁۸xxxx-jE؈HHHH<@JBjAZtH ȈLȌ,ȊlȎȉ\ȍ<ȋ|ȏ(B("(P /8^x %P:(PeQPPUP6Au@MFE=x M-m>1>Atħ9@g|. _|= ` a0`(aFbFc bc&gS0a&fa6w|?K˰+k[cv(8NN y\EK븁۸xxxx-jD؈HHHH<@JBjAZtH ȈLȌ,Ȋȁȅȋ|ȏ(B("(P /8^x %P:(PPPPUP6Au@MBmA]û M - m>|#>E'|:KtW[|=}GA!aQ1q I`2~L4LoY9y?b!c bcVbVc bc6b6c bv؉]؍=؋}؏8C8#8c88S838pq/.2*:n&n Y-b"""# "H) i"!=2 2# "#r"r#" 0%x5xo4BE9GTD%TFTE5wP5PPuP.=4@C4Bc4AS4Cs@KBkA[v#>%;tE7t聞胾?' @ ` P p8LDL+bc~Ll\y?b!a1`)a9V`%Va5`-a=6`#6a3`+v؉]؍3ppqO4ZHHHHx Y ّyPPEP/^FqWJ$Ju7Qo ʢʣ** ;ZwQ ZZ }=>'耎>/_k|ߣzz~@ ` 0 H8L$_0b bcb>88[;{xGxx-]D؈HHHH2!'r!?  %Cq(RxoM[((J*jj>C4D#4F4E34G D+Fh!>B{|O>%+|o-CWtCw|^>~#~  0 (L$)i٘X%XXX5X؀،-؊؁{ppGpp'ppgp._\e\5\ -=Gh :#>E'|:KtW[|=}GA!aQ1q I`2~L4L ٘0`B,b,R,rJl&l_؎; {qqqGq q'q qg._\e\U\uMm=<#<<5@LBlA\C|$@B$Bb$AR$sxR %R!5 -^D:GdD&dFdE6dGD.FE>GDE ›(PeQQ5QuP.=4@C4Bc4AS4C D+FE;|#>E'|: 7ߡ+;GDoA_` a0`(a8F`$Fa4`,a<&`"&LƯ 31 1s;a>XXXXXXX؀؄؂؆;7vbvcbNN y\EK+k[;{xGx'xgѢF[X8LȌȁ<ȋ|ȏ((P`XXXXUX5Xu؀8˸u"$F$E2<) Y ّ9 yQQQEe+xJ^xʠ,ʡ<*"*2*mꨁڨwQ ZZ }=>'耎>/_k|ozz~@011C1 1#1 1c111 ?LƯ阁00s0c,XEX%XXXXX؀؄؂؆;7vbvcbNN y\EK+k[;{xGx'xgѢbX8xdH) /"2 #2! !;r "  (^B1+xJ^GYCyTBeTAUTCMBmE=hhhhhVh6hE9Z|]11C1 1c001 ?LƯ阁00s0cXXXUX5Xu؀،-؊m ۱c'va7`08N$N ÅhOXc88+]:R(hX ؍=؋888c8S838pqWp pwO}?HHȀLȌlȎ<ȋ|(((JMFYCyT@T;ڨhhVhh!>'. ߡ+z/~@001 `2~LtoY91O,",,2, *:l&ll6؁{ppGpp'ppgp._\e\U\uM<#<<ųhQ-1Z D,FE?' @ ` P hXxLDL+`*c~Ll\y?b`)a9V`%Va5`-a=6`#6a bv>aQ iYs8 q qWq7ppwqO,1 q I )i/"#2! "r 'r!7 /!? 0%(W*^C D)7Po ʢ<*"*.)Z->@{|/5;GDoA_Ǐ 0C00#0 1c111 ?LƯi 31 1s;a>XXeXXUX5XuX ؈M،-؊m؎;{ppGpp'pqg._\e\U\u-=<#<<ųhQ+mX8xHDH$Hdx#9^@ DjAZtH ȄȂȆȉ\ȍȇ(((QU(RxoMCTD%TFTxQ5Q QuQ b4b&g)\[{xCLBlC|$B2CC4Bc4E3@KB=>'9:KtW;tE7t聞胾#~  0 (L$S01Gp'q p)Z("(W:>Cwa1q I`2~L4L ٘ 'bc bcVbVc bc6b6c bv؉]؍=؋}؏8C8#8c888pp. :n&n6.> Y-b"b#!> !# "Hi/"#2"2# r" 08^kx ePo#G|C1 #003~LX?+ ;wϻ[tEw  (8LDL/)5X ؈-؊m ۱c'va7`/D/R!56a 2F)QU(hFh&hfhhVh ;tE7t聞~#~  (8L$S003fbfcw| K ˱+ k [ a;von^~A1 )?8󸀋pWpp7ppwppOϢEh1q PeQQQQ5Q Q.=4D#4F4E34G D+F1>AGt%+|o-CWtCw|^>~#~  0 HhXxLDL+V`5a=6b`v`vN>1D"##2!#'r#Z5ڢ=>_?~ 8L,B*flAa1IiYs8pWq q7q qwqO,W1 I #9^@ D*FŋHȀȄȊlȎȉ\ȍ<ȋ|(((x 2]4@#4As@h>'O +t^荾#~P (xLD)i0 s0,b,R,J%aa6a3`+v<. &n61D6.!#)9|:Stg_3W;tE7t聞胾?' @ ` P (8L$_0b bcfbfcw| ˰+k[۰c'va7b 0! Yv- #!!1y$ HHH ȄȂlȎȉȃ(("(*JDE9GTFTۨzx #/_+|o-CWtGD/FE?0C0 #0 1 &c*7l\XEXXXXXX؀M،-؊m؎; {ppGpp'pg._\5\ -=<#<<^DlA\C|$@B$Bb$AR$sxR"R# ECzdD&dCDnA^GD!FE1x%P ((J*jj=4@C4Bc4A34GKFht@G|NA!aX%XXUXX؄-؆؋C8883qu{/ %r#/ (,ʡ"*2:j6> %Z5ڠ-G;|-Cw@OFE? 00C10c003~d) 0s1O,R,rJl&l6؁{qGq qpEŋȍ|(PqGqqEhɑِyQQEP5D)򨀊ʨQqpq._\u܈3" @-4ASo?a0`Fc&`2a&fa6b!bVa=6ab?4y\U]%+|o-CWt聞>~#~  0 (8L$_1S1 1O,, *:l&l! iYE\e\U\ -=<#<<ųhQe-b"b#"#"# "H) i"!2"2# "#r"r#"  %(W*^C D)7&J-AYCyT@ETBeTE5wP5PPuP>C4Dc4ASD+F)>%/~OI+`*afbfcw|,XXXX5XuX؄؊m؁ {pGq'ppgpe\U\u-}XXXX5XuX ؈88p. nnF7c103~d)i 31 1s1 K ˱+ k [ a;vo.>qI?8q Wp qwqO,Z81q I y$ HHHHȀȄȂȆȁȅȃȏ(B("(P /8^x %P:J ʢʣ** ;Z:zx!1)9Z%Z5ڢ>Gh :#>E'|: ߡ+;GD/A_111C1 1#1 103~d)i 31 1s;a>O,",,2, *:l&lVl_؎; pGpp'ppgpp.*:n.>)EjSb  .!2"3"r"6]4N肯 'ppqw @JFtH ȈLȌ,Ȋȁ\ȍȇ(((x 2(7Qo ʢʣ2*mꨉZwQ %Z5}Gh>_ ]ߣz/?~  0 (8LDL103fa6wßXEX%XeXXUX5XuX ؈M،-؊m ۱c'va7`/a? 0(8N$N4,9\%\\5\ -]}%+|o-CWtCw|^>~#~  0 hxLDL6n^ai+g@,$@b$A2D*d@fdGA>@1GIT@%TE ûhS030 K+a7 (N,<%\\5\ m]}7]ߣz~@011C1 1#1 1c111 ?cNN >aq GrHHx ّ@g|. _[|= }??~O񘀉 &WLTLto٘0`B,b,R,rJjZzlFlflVl_؎; {qqqGq q'q q._\e\U\uMm]}XXXXXXX؀؄؂؆;7vbvcbN4,9\Ŀ˸븁۸xxxx-E؈HHHH<@JBjAZtH ȈLȌ,ȊlȎȉ\ȍ<ȋ|ȏ(B("(P /8^x %P:(PeQQQ QUQ oTG D-FE=x M-m>1>Atħ9@g|. _|ߣzzǏ 00C00#00c0003~d)i 31 1s;a>XXXXXXX؀؄+[;xGxgѢb &b!6 .!> !!1 )9Ftħ:KtW[|=}00C0#00c13~d)阁00s0c,XEX%XeXXUX5XuX ؈M،-؊m ۱c'va7`/a? 0(8N$N4"%\\5\ -]}<#<<j@LBEX%XeXXUX5X ؈-؊m ۱cvc/8N$N4,E\\5-=C|>?' 0 h8L$_0s;XXXXXXX؀؄؂؆[{xFD$Bb$E2<R"R# "#2" +!r"r#" 0(8^((7&BEyT@ETBeTAUTxQQ>>E'|. _| = #~  p(L$_pqqp'pgpq/.2nn>! EDKȄ,Ȋ|ȏ(x PU@I((JxQuQ>C4Dc4Evt@Gtg_3+|= GAQI٘K+k۰;)B(x:ʢ<*2@!1q I`2~L4L , 'b`)a9V`%Va5`-a=6`#6a3`+a;vo.>!1 )?8󸀋pWpp7ppwppOϢEh1q I y$ HHHxYِ9yPPEP/^FqWJ$Ju7Qo ʢʣ** ;Z:zx!1)9Z%Z5ڠ-G;|c|O s|]7ߡ+;GD/FE??abcbcFbFc ba5`-a=6`3؉؇88 q)ڸm؎8[m|\d@oXL/阁0 1s1`B,,2*Zll_؎;{pqGp'ppgpp/.2*:n&n!1)E?8xHDH$Hdx#9^@ BjŋH ȄȂȆȁȅȃ|ȏ jx:j&j6]{hFh&hh6x>aQ1XXXC8888s[;{xGx'xg&b &b!6 .!> !2# #' ?57PPUPj]GC4AS4Cs@KF): 7ߡ+z/abcb4`<&b~/_103fb6`.~|,XEX%XXXXX ؈M،-؊m ۱cvc/a? 0(8N$N4,9\%\\uMm]<#<<ųhQ%-b#"#!!1 ) HHȀȄȂȆȁȅ<ȋ|((((Q$^xʠ,ʡ<*"*2*mꨁ:zxM - m>C|:Stg_3D| wn= }??~O񘂩00s;a>O,",,2,*:lFlVlv؅؃؇8888888pp. nn Yc &b!6 .!> !!1 )9/_k|o{@OBoA_` a0`(a8F`$Fa4`,a<&`"&gLƯY91`B,R,rJZl&ll6؉؋}؏8888S8qp7ppwpOϢ?؈HH$Hdx#R"R# "=2 #2!3"#r"r#  %x5@IBi2(rJ*j&j6]{hFh&hf^荾 ،-؇8C8#8c8S838pϢM8xHxɑ) i"!=2 #2!3 +!;r 'r#"  %(ʺ&-XyKkQ*$ĐGJIbI"I%|/$A~IJ6!9%RP Ia)"ERRZ~2RVIy T*RUIu)ԑROKi(4LK i)Hki#oVK(tn]zHO%}d 2IT&e̔Y2G/#rTq9!'\rCn--+~/(A,!XHRI&%%4VKA2J&"Y%dKrK+$BRXHQ)&ť򣔑򳔓RA*J%,UTRCjJ--uԓ@J#i,Mt.MzI_/e Q2Z8/d&e̒2G|Y e,L Y)dN9+\+rUu!7ܖ;rWy(G_KB_ I,I$$JRKI+$䐜KrK+$"R\JHI)%G)#eg)'奂TJRYJ5.5L@"Y,Kd,BV*Y-kdQ6f"[e?YB%LT_V"K*$ĔX[wOKI$>' $"I$$BRJjI#i% dLYJ6.9$ܒGJ>/RDI ))?ORFJ9)/TREIui$4fBZJ;i/tĒRHv5dgZIJz(%dl]rK'bR\JHI)%GIRNK(TRMK )ԑROHCi$4f\ZHKi%Hki#oVI{ t.UIw)O(d 2L)dq2^~ 2Q&d"SeL2Sfl#se̗PbY*dJVY+dlI6*d쐝[^'CrXQ9&\rI.*ܐrKn+/RLJHI)-?ORF~rR^*HE$TRSH=/ 4&TI i)>OjY#ke쑽rBe+O兄J|YFbJl'%$ I,I$$BTZHZI'% %d,UIv!9%/rLI9-g䬜 rQ.;[>H6ǒZH',]2H%dL2[\'dlm[N).O乄kKt!I|I >($dl[JiYI%i.KeME~9 #rJNY \+rM y <'TKy%oOK^>? ,!XHRI.)$|/$A~I2K)$䑼OK)(RBJIiIHY)'奺ԐRKjK+4&LKKi%e !2Tp!cdL2SfBY"+elrHQ9%gܐQ>Iؿ*W$FEJ4.1$ĒGJ$|  B 1$ C RAjHi! dL@V!\@^BPB1(%$#3P*B% U*TPjB- u.ԃB#h M)4ZB+ZC~C3t C }A0PaQ08&Da:̀0 f `>,RXaUZXalMVa]^CpQ8SpY8\KpU܄[p]<'sx ;H | ! Dh bC A< ԐB: Y +drB ?BPAq(%'(eg(6ԃCh ͠9 6+m:Ag]tzAo}0`Ca 0FhcaaLI0Tâ0X`1, X `5`3l  cpNI8 sp.e :܀p n ><x 9?7 ||P/_H | ! Dhb@L!ą ćBbHI!9=Ԑ2 2C ;䀜 rC ?P C( Š83P*B% U*TPjB- u.4F@Sh͡V 6+m:Ag]tzAo}0`Ca 0FhcaaLI0TāY0\a,ERXaUZXalMVa]^CpQ8SpY8\KpU܄[p] p18'$p98"\p57&܂p=!<3x/x 5'ox#3B|H | ! Dhb@L!ą ćCBC$$ArH){H! t22AfY!drAny!P Aa(EPJAi~2P~rP*@E TjPj@MԅzP@Ch 4fZ@Kh@khoA{t.Aw=>Aa !0p#a10x&Da Li0fLa̅y0BXa ,eVJXa u6Fa lmvNa}A8cpNI8 sp.E \kpnM܅{pCx G>g0W"C :Ā bC A< !$? H I )$R RCH =d #d̐B69 'ܐB> PB1(%$#e, 4Ch ͠9 ~~ߠ-:Bg]tzAo}0`Ca 0FhcaaLI0TāY0\a,ERXaUZXalMVa]^ p18'$p98"\p57&܂p=!<3x/x 5'ox#3B||~ o!2D C 6āăB"_@`ĐB2H) %| 5C2B& Y +drB. y /P B!( E(PJB)( ?OPPC2TP C 6ԁPCh14 C h h mW B;h#tB7='B?` 00#`$08`2L0 `6́0X`1, X `5`3l  `7쁽80p 8 4p2\p 6܁px1< ^+x o- ;' _2*|BdQ!DbAlq;!$D! $dR@JRAjHi! dL@V!\@^BP@Q(šRP~, 4Ch ͠9 ~~ߠ-:B' ]+tzB/ }/0  C`( 0F( c`,;L0 & `̄Y0\a,E2X+`%հ:X`#lͰ6;`'ݰ> p18'$p98"\p57&܂p=!<3x/x 5'ox#3B|H | ! Dhb@L!ą $|!!!CH 9=ԐB:H 3d C 7䁼C(0P C ( 4?A( ?C9("TPB55&ԂPB= !4B3h-%_5_7h =t :C ݠ; zC ? 0 `80 F `<`"L043`&̂0< `!,Ű2X+`%հ:X`#lͰ6;`'ݰ> p18'$p98"\p57&܂p=!<3x/x 5'=|| a+S˯"7-D(At1!Ć8x@BH> ~A !@RH!!4Az?@F! dlr@N!| @A(bPJ@I(G @YAyT*PAu5Ԇ:PA}h 4&Ash- A[htN@Wݡ^@_a A0PaQ0XwaL)0t3ă90|X a,%rX+a5zal-v;a=~8#pq8'3py\+pu7܆;p}x<'sxKx ?/x{!W_Eo[ Q *DbB, q .| >$|  B 1$ C H C*H i -~ 2C ;䀜 rC ?P C( Š8P JÏ3P*B% U*TPjB-uԇAchM4Z/~ߠ-:B' ]+tzB/ }/0  C`( 0F( c`,;L0 & `:̀0 f `>,X `9 VX `=l 6 `;쀝 v `?p8 8p N8 <\p . :܀p n ><x 9?%Ÿ=|| a+Sů"7-D(At1!Ć8x@BH> ~A !@RH!!4Az?@F! dlr@N!| @A(bPJ@I(G @YAyT*PAu5Ԇ:PA}h 4&Ash- A[htN@Wݡ^@_a A0PaQ0XwaL)0t3ă90|X a,%rX+a5zal-v;a=~8#pq8g p.eW\p n >yp܃= nzp˃<Oz=Py0܃=D&y0ك)L`=\y0߃,`=XRy܃`kaSϘ3^G>gB$B4 ą ? H I )$RAjHi! dL@V!\@^BPB1('(eg(TJP@5 4&Ash- A;h#tB7=0`Ca2L0f\a,68 KpU܄p}x<g/_H | Q!DbAlq;H !!1$ RCH 3dr@A(EP@Y("TPB55Ԇ:PA#h M4ZA{t.Aw/100&a, V*X alMp98"\pnmw܇cxO<W=|| a+W"C1 &Ă/CBC$$ArH){H! t2@F! dlPB9("TPjAmu4F@ShmB7 C`(043á0BXa u 6 `;쀝 v  p 8 4p.E \kpnM܅{pCxO)< Ÿ|hbw ) RC.ԃAch͡ @ #`$10&$ alMVa p.eW\>BWW@T!ĄX@\A|H !/?@ CrH){Hi! @V9!<A~("PC UTP jC >4Ch ͠9 ~~C3tnz@O}/A00caaLI0 `6́0X `=lM6;`'ݰ> p 8<܀[p^x ;>篮~Q :ĀX@BH! $ RCH =d 2C!P B!( E(PJB)( ?OP*A ՠ:ԀP jCO0  `4q0&$ S`*L0|XK`U[a;쀝 v8#p. w܇x /x - *D( C 6āăCBC$$ArHCjHi!!d,Av ?PJAi@y U*ԂzP@Ch 4fZC[ht.Aw 700#a10La̅y0v;a솽pQ8$\+p#x O)<{@(bB,A|H !/?@:PJ@I(G @YAyաԂZB+:@'a !0FX`2L0 `6́0"XKa% Va=~8W:܀[p]<'B  bC\? H I )$R RCH =d < @A(bPJ@I(g(TJP C ԅZ@`0 0F `<`"L0t sa>,X `9 VX `=l-v `7p.5w.܃x 9?%?||Pfd!Ć8CHA ?@F!P JÏP*B% U*TZB+A{3t z@O0 `8Q00&$ a),VjXka 6f[alvn{ap8'܆;p}x<'sx 5+UT!ĄX@\B" H I 9=ԐB:H #d̐ r@.PB1( ?OPPC5&ԂPB= !4B3hmW B;h#tB7 a A00&$ S`*L0f, s`.̃"X K`)56Fa=~8#pq8 <\p5 <Ÿ|0_E( C 6ą ć@bHI!$4@V /䇂PAy U*TPjB- u.ԃfZ/~:B' ]+tzAo}0`a 0&$ S`>,Z`3lmpQ8p&܂;p}x/5WH CL!ą $! $R RCH =d drBn PJB92TP C 6ԁPCh14f~zB/` 00 `40$3`̃f `;쀽N ܇ ^_BC !.| !$@`ĐB2H 3d C !PB1(43P*B% UT:P@Ch:Ag=70`#`$)0 `>U6Fa l>p \p n > P C (TjPj@MԅZB+ZoAW=>Aa !0p#a100&$ S`ٰ̄6Va]> #pq8 "\p]<' ^w7!Ā A|H !@ AbH =d #d̐B(0P C (?Ce )4ZAkh~@C` 0F `<`"L043`&̂0< `!,Ű2X+`%հ:X`#lp18'$p98"\p57&܂pSxՃ H | 5tB6 y8P@5 u.4V@[h3tzAocaaLI0TāY0RXaUZXa l v^p98"\pn]<^kxoO >? >C(}0|Q!Dw! $dR@JRAjHi!d,Av9!P C ( 44 C h 0 `80 F `Li0|X a,V*X `lvn `?p1W\pnm ><x 9?%OB! |e,_Eo[ :Ā ~A !@rH){Hi =d #d̐B69 'ܐ Ba(ԇAchMt.` `80 F `,e VX `+}18'sp.% W*\pn- w.< ŸOq!ć/BC$ԐB:H #dlr@N!| @A(EPJAi~2PC )4 ~:Ag]t^Paq0~ 0t3ă90BX a  `7쁽80pNi8g p57&܆;p}x1< w7_ٯ"7@T!ĄX@\!$D! $dR@JRCH =dLAv9!?PAq(?A( ?C9(TPC#hM4 ~:a2̀0 bXka=l 6 `;쀝 v  pN8  \sxKx ?||i$At1!6ć!!CH){H! d rB. y!P Aa( 4?C9ԀPB= !4Z/v:@G tzBo}0 `$08`2̄Y0|XKa9 pNI8,p.eW:܆;p}x1,Ű fys.c0s>?mq9,.Y\bqu7-nyEp]8-X$Hy+^7Ef1;EN-bRByT*PjAm#u4f\ZHKi%Hki#oVI{ tn]zIo+d 2RF]&d-sd̗P(dlMv!9*䤜rF99/ܔrG=y y''/+D[J|I W%P$DKI*$|/%t^~,]rJ.Np S0d89rTEe*U-[ԴmQ?C?4C?Z6h:.zaFQa`쐝OA9/\+pu 6܁{.w ]xc܅.w ]DžO^υH.Dq! 1\Blׅ.B A.Bbԅd.p! i\HB:һ 9\Bυ.p \(BQP܅.r ? e\(By*PŅ.p ]B]ą.4s =\B/0ԅa. wa #]hƺ0Dž.sa \XJVƅ.sa \!pԅc.w ']8κpޅ .\t ]UpDž.w O]xK^څ\?.|r ̿H.Du! ]r!؅ą.$s! i\HB:2݅.v! ](BA P̅.Tr U]BujPӅZ.v ]hBC؅.Bkڸ m]hB{:х..t }]B0ą.qa \ȅ.ra {]np˅.q ]xcԅ?\x+޺ ΅\B a.|qu! Q\B4Å.r! q\B\r!ą.$q! \HB R ]HB:Յl.dw! 9]Bnυ.t ](B1*Pͅ.p u]B}ЅF.4q ]hB+~q m\ͅ.tp \BW݅.t ]B_߅Q.va \.Lpa \0ͅ.pa ]\滰.,ra K\X2….wa ]^߅.t ']8iθp΅.\p 7]ԅ.pq ]u!̅/υH.|·.Dv! Q]BtbӅ8.s! \s!.t! ]HBZҹޅ .du! ]BNrP.r e\(BejP߅.4t M\h/.v m]hBG:م..tu ]B0ȅ. uw&0хI.Lva S]tf0Ӆ9.sa ]Xbԅe.,wa +]Xֺ΅.lpa \ͅ.pa {\>pC.s ']89.pɅ.\q \ npۅ.}-Y`1b`#-FYc1bx-&XLd1bTs,Z,Xlb ,XXgbFM-XlfbN]-Xܵo ,XxgGa_"[Dn"E"  _d-RXHm"EVly- [(jQ̢EIR-~ɢEY-YdQ٢EUj-jXԴeQۢE]-X4heůYhgޢEGN-ZtaӢEo>-Y b1bHQc,Zn1b$S,ZLk1b ,V[lb>,Z8mqe+W-Y\a{X|ljfo-"[İi"E"  _@ I,Z`"EVl-rXe"E^|- Y(eQG?[(oQE%U,ZTnQâE-u,ZԳoТE3-,ZZŢůYj͢E,z[kϢ,Z a1b,&[̶c1bK-X\lqCϑ,j"Ellޥlޝ ?vܻaϧ wlNooPCj(ݡwjPs2o 5Lh|#0wBhz? f6̛jP77PC-h72Q0`yB5;=PC 56ak٧M /C~ 5á6|džP0)PgB5sj.6j=B"ta25"|3BMnj#j Bgsy|^4LCM^&Psׇ;>N556v#0}f.a4^_C jnPs<57v}JJJIIIIIIIIXBܹa 6B s%3) ӕ0ӕ00ӑ0ӑ0ӑ0ӑ0ӑFaf0sd1f0s焙;&-aN 3wICf0󾇙.56-3] 3] 3okyK;0ocy LLLLLLL{fzfzfޯ0^),,,,,t,t,t,цZZZZZaoaoafW0}fLLn38ްٷaaa fN3ak&caDaa fEaaaa 0000000000000000ϰ;]444444444azfzfz0 3ߡaaaabz/f}1bt/_L7n~1wFG,&_?Q$DXWI|I %KJ$dRRKZI/%dCrJn/"RL~RA*Je*5Ԓ:ROHCi$MJ~6򫴗NCzJ/#d 2Dh#ceL27yp.u><sxKx|Я"E(bB, q .ă=Ԑ2 Av9!7P B!( Š8P JCY*Be ՠ:ԀZPB= 4&v:@G 0  `40BX `9Vap 8 g,Kp5-wܓCH<5 C^[y/|P /2$ȷYHT ! $ dL#egUV+:B' ]+tzB/ }` Q00&*e̒2G|Y e,%TrY!+e5Vz el-U `7쁽80p É5;[O5ط"E R~rPAY?;(砢J*;⠚j88h䠱&:hᠵ6~uAw=tA} p0 v0x;`I9`V;X`68`m;`883:8;9wvSĢvA\9 :s A`$qA2pR9H ~pA&dsA9rAysArPA1?:h.:栻z:`a;`QF;`q;`f9`8X`V8X`8X` 69`v9`88N:8ଃs;n:ඃ8xo|tEHq9 8;$pׁ$vAR$wAJ;H 4:duA9rAAuPAIvPAYTtPAeUtPAmuuPA} 4tAcM4uAK⠵6:8蠋9z99`9`8`):`;X`V:X` 69`}N8888ࢃ8n8ஃ{;xv|X9: b9 sA| $tȁ?t8AFYdsA9sArPAEsPA %rP~rPAY?;(*;⠚j8頖8렞8h蠑8hꠙZ8h頕~sAg]tsA=rA}s r08;`I&;`f:`9`9X`V8X`8X` 6:`m:;8ःS88.9ઃn888xృ':xใ^9xSĢGsA $rׁ9vA duAnyuA~vPA %r2:A9TpPA%TqPA55tPAusPAto:젯~;`9`F9`q~w0DLv0T3t0\wK,s +rkslrNv~tpapp)qpu7qpupq'sp\rp\wpM:':X8ǁ?8H ;H L2; <:(䠘J8(場䠌~vPAETqPA5pPA- 4wA:A[w!"%]#-## XXXuXMmC8#8c838xxxwŊ(."? "0I#&i#>"C2F S2G KF [G GrF WrG OF _G@ FP GHFXGDJFt~O(9"P>"P1"P%#P#5#P+#P'u#P/#  #(#$"<-"2"KZGM~ohvh.n^> IX%XeXXUXpօ>lgG81߱1ױwt# X81ƱNf\*vp̷Gl; ~A ΋mm澉RQ*I -AHo#}2HP&e2I&)d̑y2_6F$elݲG>/䰜r^.E,7ܖ;rWsy!Ky%卼?|8J,-q;'%$ @ I,I$$BRFJ: $dMKN%RF~rRYH5.5ԒRWI}i&ͥ"t.UI_'e A2X0.#e2N2A&!d̗PY*eAV&e}_A9$cr\N)9-g䬜rA.%,W\rSnm#wܗPcy*奼^>GG>g /UbHL%%ē+$%$JIz ?H6.%R^*Je.5Ԗ:RWJi*ͤtSzIo#}2Ph#ce 2Q&d"SeL2ObY"dղF:$[erP9.'䤜rA.%"W\rOy(<RA>',&_ݷYJ4.1$|'$$#' $XIrI!)%d,UIv%$RH K)*ť$奚ԐROHCi,M4BZ/YJ7.=2PH%cd 2Q&*d̐Y2[\'d,eR:Y/dlCv.+G帜SrF9(\[rO#y,O乼J^xHd"1%Ė@KbI"I%$J2I-y$䓂RH K)*,奂TRMKCi&ͥ_7i+t.]zH_ e 2JF+dL2]f,-sd,F6F,[dݲG9(rF9,W\rCn=/1߮>fc|7c>|o(|̷=>f=S0 c1>f/=c̹k3>fn}LT7ju 3{> mc̓3/>- 3#>>> s>mtttt>C IA91s^~3~7& sNL7L|fBcanI}]c1an/sW;q0o|=sϸo<0ƟO|&17Of|_$_sWy+}kD_dk5߽5oV_kr5oG_dk5|Mnf|Mv5 }Mn kr5|Mnm |M>&_kv%&_k5l|M6f}L||M>{wa5||M>&_Vco_3&+_F]b5|7|Mv; syk[̑d{0y5LǍIkni_an\_dknT_07G܍&[_܂~f^"jD73s0wi~>agz03gn?3~~~v33gfگa̴鄟g? ? ? ?3~̮O?3~f>[g|L~&c?=?dgfgr397٩~&/?&3߁~&7?}g73~3LN~&?gY7ar3'~&+?3~f.Lf~&#E?3~O 3~ό32^&G?W?3~&O?'ar3o7yG3L&SM&Wdo27Y,]offMfM7{sqsg4LYF6#ao f/NN>_07tttttMfoftti.F7tt ͮ77ofg3+++fM_͜97soo:o:ofhof̺fO=o:o:ooof̾w##3fMMMW 3floooooooooozo:af=ӍӍ3fLGLGL7L\Y0[)`0}`07<&}}y-`?0oBy{`:```````BCyL'L'̾0yLf?7LfL&#Lf7L&q8d09L&s&u:d`r0L&qf`Ffop00#;000`24Yy4hmy[df6l>dd2܃LA& u:d22\ 29dvvA& i4dn Y,dd6d6mAfg,pAfod9ȼAfo92sd 3A 2d3d 2\LAfdvnٹAfLAfLA& Nw:dr29LA& s9n w;l6yM&`w;l6yMfƃ͌>>>>66<~`lzlzl{JJV 6>t&`ͮ6o|PGf]lς>6666666666lzlzlzl>t#a`3f}lllllllllv@f>`slzlv@OOOJI+> 6o@yml` `ӡ`6;#`ӧ`]|0o{U%[f=l}%kfw>--`M[lzllzlIUUTTTTTQNHHHEyBbӑӑӑ.nnn^^^^NCL!&?B1{#7B1{#VC̛b2 1y:p؁#u8:p΁\p n:pˁq9؁vox{>8сO|q_:́pe@D"9ف(Du @|8ЁD$s H@:2:Ɂp _qo;PJthahaaaaa0\x;v`u4;0ہs` X":܁q`XF69@!lq`^9pƁ\vm8pׁ{wx+^;Ɓw:Ձo|w?o/cd8Ձhp q@<;āq H@2:́p %(@i8Pցrw@:Ṕph@C;Vvmh@{:8сNtv@z;ǁ w`#倇x9rہq8뀟d80Á9,t`[~8pԁK< _(LT&e1LB&1I$c3LL&7)a2ŘLi,STa2ՙL[h;` x0|!&vA)iw4.Nn07[m.s<`2)yμ`^2-y|`a>2_+ O?#@T q .ăAbH IsL&;)a1%L)4S)˔c3L%2STc35L-6Sc3 Lc ӌiʹa1NLg ӕ`z2L/ӏ `2f(3Ό`<͸/24f:3bf3s|fY¬d2AL0la2ۘ.f/s9a2Ǚis\d.1+Usdn1;=>y0/7fOLD&2f0 L&)IǤgb0yLAS)cJ1L56S4b3ML3%ӊiʹa2L7ӛe1@f3 e1#Ɠb\/3Lgf03Ylf3,`3K2f9YŬf63[vff0{}as9g1}yy$*C 5&ԂP@Sh͡V@[h#t C 7`0 0Fh ^opX> ~a L0f, s`.̃"X K`),V*X k`-6& A !6;`'ݰ> p18'$p98"\pu7܆;p}x|  DC 6āCH 1$ C H 5C 3d C / BP@Q(š2PAyա%v:@G];0a x'x `L0flsȧX `lݰ> pNi8w.܃#x O<^kxo|Ow??"B$ Q *DbB, q .ăB"H I )$@ZH!dL@V!\<ߐ B!( E(PJAi(eT*P jBmuԇAh͡V@[htN@Wݡ^BC`( 0ƀ0ƁCxaL)0 s`>,A8 '܇x 9[x|/o|!D(Alq!ćAbHI!9TA Y +drB. AC~("PAq(%2PAyT*P C 6ԁPCh14 C h + zC ? 0 `80 Fx0| `2L0 `6́0X`1, VJXa 6CCl  `p18'$p98"\pM> ~aLI0TāY0\a,ERXaUZXalM B` lmvNa}A8cpNI8 sp.E \kpnM܅{pCx ^x|//|o~OGhb@L!ąx@bHI!$RAjHi! 2C ;䀜 rC>C(0P C ( 4PC TjP@Ch 4fZ@Kh v:@G]+tzB/ }/0  C`( 0F( ^opX> ~aL043`&̂0<K`),V*X k`-6& A !6;`'ݰ> p 8 4p . 6܁3x|//|o~O D(At1!Ć RCH =dBP@I( e,P*B%5&ԂPBh14 C h 5C3t C }/0  C`(Q0ƀCxaL)0t3a,eVJX k`l `7쁽88p N8 <\p . :܀p n}x<'sx/7{G ;O C 6āx@BH! $dR@JH! t2@& Y ;䆿!?"PJ@I( rP*@E5&ԂPB= !4C h 5C3tnz@O}/ 0 ( c8_@`"L043`&̂0< `!,Ű2X+`%հ:!a+lv. {`/p!8 G(Sp98\p#x O)<^+x o- ~/ S(D bB, q .ăB"H I )$RB*H i -2B& Y +drB. A o PB1(%$PAy2TP C 6ԁPCh)4ZB+h m-:B' ]+tzB/ }/0  C`( 0F( c< \ n |!a' __ ; ~ß!D(At1!Ć8A|H! Az!d,rBny!P Aa(EPJAi(e P*A ՠ:ԀP jC >4Ch ͠9 ZCh =t :C ݠ; zC ? 0 `80< \ aLI04Xa),V*X k`-6AVap 8 sp.E \kpnM܅{pCx ?>gW_?E"@D! Dhb@L!ąx@BH! $dR@JH! t2@F! dlr@Ny /䃿!?PB1(%$PB9("TPB55&ԂPB}hM)4ZAkhm:Ag ݠ; zC a A0p> ~aLI0Ta&̂0X` ,e,\+p- w.܃#x OW[>'?E#@D!=d 2C \B>C( ŠTjPj@khmt.Aw` 00#`$0<ca?@ 0&dSaL0fla,ERXa5zalvn{apa8 KpUw܇3x ?S,DH@  1$B Y "PJBiUTPjAmuԇAch͡=tN C 7`Ca 0Fh7q~`:̀y0"X a5F8 '\px5>' __ ; ~ß! ĀXCH T@ZH!d,C 7P*@EU*ԂB3h-=t :C ݠ; zC ?  &T3`&̂0< `!,%V~8#pq8',\Kp#x 5>gW7ObCRH =d@N!|7:i?| p,p, plGH8ck8vcW8`8Nt8΄l8.b8.r8j8F8nv8a8i8׊w_?@H:]ԁntt;hWw=! CL vqhv(@ Bq:]ӡ)Cʒrnttՠ&Ԇ ZC[h#tB7=7 Ca4q0& a9ff0{}~s9˜c3+}yL_3Ό`F11b71,f.3Y,a1˙JfYìe1 Ff bf lgv0=18s9ɜe1 Es\c1'Sy|`>2_+`~2̟Db"3QL &&g0 L&)Iͤa2L&#da2٘L&S)c3%Li S)ǔg*0JLe STgj05ZLmӘiɴf0L+Ӎdz1ƃd73e&0Idf*3f3 "f)Yɬf0kuzflf`&lc3;nfg0$s9Üe2yüe1?g':Geb2qLB&I$e1əLJ&Iäe2ՠAw= z6cנA  6b0`p# F6c26p5gh0`$ f4e0`\y ,2Xl`2+ V2Xm`z  6l6261b`v; 08dp13g 2mp= <1x\(Q 4e Ab$) R1Hg A| T6bPߠACM 43hn A z2mǠA?  1f0`hO/`8_  &L1j0`  f1k0` ,1Xj`  V1``f  68bpi7 n2x` ^4xe[w >c_ 0iF0h A 0i AB 5(nP A95 j1oРASfm t0d٠AWn z2m0``T ,6Xb`&A![ 0i`> 28lp1' N68cp-w 7x`{ k/?uk A"I 2Hc ALY d3i _0(hPȠA  7`PѠA5 j6cPנA} 45hfܠA+m 7`ѠAg.] t7aӠAo>}  2l0` F1042px515h0`< ,6Xb`JUk 7``AAA 48dp1' N68cpEK \5fS/ ^2dwG4l A41 b6c AB$ R6Hc A|4(dPؠAQb% JT2lPݠAMZ 5gPߠACF 45hiʠA[v 0i۠A_~  4d0`0# F2m0em6kg0`$s ,6Xb`Z B 4e`^} 68cpy  .\6fp|3\ 7Hh A 4Hc Az  2d6bAAB J4(ePڠA9 *T6bPՠAu 5gPߠACF 47hiʠA{ z 4d0`O/`8@ &L2l0`4 0Xk` 6l3n`> 58np)g 7`pUkw 3o#O <3xnk7o |07? At b1k A"  2d1j An 5(aPʠA9 *T2lPŠA-u 40hlĠA3- Z2hmΠAgn z4cנ`a F4em0`AAx  &L1j0`  f1k`FM 0i`~ 48epYs \7ip <1xfk7o >|3is"D2f ALX 3H` Ab$) R2Hg An|7(`PРA% J6(kPѠA]z 44hdؠA 6m 7iˠA?!C  7a0``d)S L7a0`l%K ,7Xa`j5 0i` 08hp 08ipEK \7apm;w 7x`Sg ^2xm{|4\(Q 6c Ab$I $7Ha Aj4i 7` Af,Y d7i _ 1(jP̠A  J5(gPޠAEJ T3nPàA#M 43hn A+m 3d٠A?  5f0`m0`43 f3o`Rk 7``f `-[ 78`pa' 7`pu <3xa{|2 ~qOQ 0H` Ab$I $7Ha Aj 2d2l Av9 6(`PРAa% J2(mPƠA9 *T1jPˠA 44hdؠAs- Z6hc֠Ag.] 2kϠ  7a0`h1^.oXq>~ &L4d0`Ti f,6Xb` 78hp 08ipY .\1jpM;w <0xaF6b A  b1k A"I $3Hn A*i 3Ho A&9 r6c E 3(ePڠAYr *T4dP٠Auj8TӡqCMjPKZ9ڡ6upCP:ϡ phC:4̡r!Or9ۡMrhCSl9 ,4Xn`:  6l1j`} 48dpQc N48ep%+W \7ap] <5xf; A2) R2Hm A^|E J1`PѠAUj j4kPϠA# t0hɠA 0iˠA 6p5gcko`h0`DI L5a0`l9 ,4Xd`Re V2Xm`z  6l1j`~ \0jp] <3xn? >|6fO A$Q D3n A,8q 7H` A2) R6Hc Af,Y d7a An 7(`PРAa"E 7(aPҠAEJ j4eРASf Z2hmƠA7>}  4bieckgo`h0`$ f6c0`  V1Xk`AAA6; v2gp!G 78gp%W \7apm; <7xak7o 17? ~2܀ D5f A,q $1h AVl r4oPAae *T2lPŠA55 j42hlĠA'] t3nàAo>}  4l0`Hc < < \n | aaaaaaaaXaXaXaXaXaXaaa CpB°% [ð- ð# ;ð+ ð' {ð/ p #pq8'sp.EW܆;p"WUM]CSK[AMSK[O_@PHXTLBRJZFNIEUM]C𷠀```````Cx ܂qO/ &  ff f f   V V 66   . n    ~_b b    RR 22   J J ** * j j     ZZ :   F F <`G+($,*&.)%#+/X(X$X,X*X&X.X)X%X-X+lll\\\\\\\\<<<||GDDD$$$$$$dddTTTTTTT444tt e(nPƄ+PƇ2!L er(SBP   V !SGǂw!Q1I))iYY99  JJ  ** j j  ZZ : : : z    FF </K-p |?``````````````````````````G'go_hDĂ$䂔TԂ4t l<Rʂ*jZڂF&fV>aQ/K-p |SS  K+k[;;GG''7wO/oo_E %z(1BJPb $ %Y(CIJPR:4 %](BJP2% %o(B;`(B)JPR,⡔d(B)JP j j Z Z  zz z z   F \q_ LLL,,,,,,lll !-݂=CÂ#cSӂ3[ǂ'gׂwOς/_?QQ1qq  YyyEU5M-==}CcOK-p |? @(/ $,"*!)X$X,X"X*X&X.X!X)X%X-X#X+X'X/(*&!)%-+/8 8(8&8.8!8)8/ ("!)%-#+'/x x$x,x&x.x!x#x+x' GCSKQIYUM]CSK_DTBRJZFQEU]S hKx |Iɂ)iYy M͂`A```````52 oAAA!AaAAQAqA AIA)AyAAEAMA-AA#AcASA3AsA AKA+A{AwAAOA/AoAA_P0H(hS%p  I)iył%Ղ5 A````G'_?רHȂD$Ԃ4 l\܂yyee55uu M]]=}Cc/`O/ && &   VV V V 6 6 6 !-mK˂+ۂ;Gǂ'gWׂOhX؂8xԂ Fg'yEEeA &diMڐn?<1xBSt2ߚGed9c YKh_{.A;cKڕ=#(o~ㄾ=hGzwiBHAwAsAf }Sy7oBM}yF!I3I3I3噘$'3#D2,/^Ey{i/xNpQwQ.Eٻ(ke]])I*B+ }ᢼ]vQ֮/B(ke*Hh_h_h_h_h_h_h_.ꁋ]>=rQ\θhꄋvᢝᢝoW }+.ꊋ⢮hhw/.tQg\{ErQ\!uErpѾpѾpQ\% EEE]rQ\#uEk..ꏋEqQw\7\uErpQ\#uE]qQW\􆸨'.ꉋ⢾/.ꋋEq;⢎Nu]]ࢾ/.ꋋ⢾/..ꌋ:㢾/.zGi'xS7twyS7޴ owZP'^›:MMMNxSo7zM:MLh/xSxSiGxS o7u𦼽)ooۛ7eM›M72)co؛7 ޔ7 oۛOhxS޴;)oo޴3ݛnoޔ7M{S޴;iwxS6xSޔ7 oziGxS޴#i/x^r̽)ooۛr27noz];v7M,.xSx{M7Pޔ7M9i/)k77n){7e尿 uM)777e;Mo77uMpSn nꀛwNpNpS7uMpSnnꀛ:=ঌt۹)g7͹Ms9wSnz4nMy)o7v]vmwSnMsM)7tpӝݔfM3lݔuSnMٺ}p|iݔE7͸fMYi4nq7͸fM)w7u7]:n4n7uM.i7ͽ. ny7ݍnꃛw컩n}7ͽz঻MwS'ܴܴ 7uMpp~_?KKoXz;1ގvތތތslΌΌΌΌMɤbR3i%cs@N/y! PAq(% jP3ZN(uCJP0F4 i(BiJPZ:6tc(]BJP/ ep(CBʰPW(~$d4t Ll,VJ!%'8(8"8'"!-x.x!x-x#x+$,".!"*'/H H(H,H.H!H)H%H+H'($,"*&.)%-'[P@P\PVPCP[TL\VNM]CSK[GWO_0@0P0H0D0T0L0\0B0R0J0Z0F%p n_ LLLL,,<<<<<<<|#("WCK($"*.Ƈ[|NoWM|G|z}mק o3o.Ƅ|o"z|L;ǧ+7ˇ>-C{ԇ!|hо3a>|hyY{ۇg1g)YFQUd YK֑dByD.}c.GhV|>]gC]P|g}o|)+ȄF$IB_|K7ojPj/S9KtR&y;K7/}/}%Kwo)R}['HERT&oUBMK7/}/}R/} KžeKtҷo'BRtҍK7/t3ҍK7/ _z}қKo/ɾ qzK/}WR?|^N$R7|Ww#D6`B[ w;1_n>Kڗ:{PO|#s}iN=Kh'EBR|C_/uR|?[}iRg|iҾKҷ/ ס?"QG~#?_,BG3G3G3GQo/= QW+~nf?uƯQGÏGNQ'~ ?zG{u¯^Q/~?uveGQ~tC}Gďn?׏Lo*{?GnGh'N]GNQ'zGp?Տ2L(G?͏r(7?͏rhћG~hQ~(O?zc(S?ԏ2Y?z']GQ~ONLi>KhGnOSi?S)_>OUi7S?ןv?eOr/AJ?O{?ڟr|)_[Ɵ2)[w)c֟Y;ݟڟvOS4444?Oy;O?ݎeO;Oy;OOߟv?}?eOS4444444 ͼarOsOsO9F}^SkB])ߟfڟzi(z]hhh=r(<92 2  (<2(zhhh(?hh4ԃz mYYhN@lP@NP}y{e@s@Pye@YМ@w|{{e@{zz@@yЮ(;l(N3v@(( h'>]@ :@7Au :@@P44}{`BR#CPƅ_(eB(CʔP= H] ROi7R?= . ~R?w^vQRWiR_^^ n H7H u7n@U@p u8:HgρByʋP^*|c(B1%Q=1+'q? ‘T" Ð&Ñ)Y‘59‘3‘7w8 X8D8Jl8ʇB8*Z8jV8ꆣ^8q8Y8E8ڄ]8ڇC8:S8:K8G8zW8zO8cX8cD8Fct8< w8 81!19S15313171? ±8K±,+±2±&kñ. Ff b0*s67xOV{j<}3L }M }?Lo 0n 1  2Af ;y"P*B% U*T@W=~0#`x/?xa2L0\ `lMB` ]>8pu7܆pCx 5o~O&FA >$CH 94Bv /PBy5&ԁzP@Ch)4ZAkhmB7=~0p/p7a,_`&̆90|X a ,eVJX `=v;a=A8<\pnm <^;>g _?"B$Q!D @\ !$ĐArH)!t2BfY!?P C ( 4PC%5&ԂPB= !4Z@Khm;@?a a0ƀ|`&̂0< `!,`3Alv. cpN)8 W\[p]W;x'b@L >$DR@ZH #d̐@A( E$2PAyԅAch-%:@W70   ^0`2Li0fLs`.̃bXKa,Vja3A0 #pq8 sp.E:܀[p=!<3x3 _;?SB41 Ć8AH 9t @.y0bPBEUTPZBh =t@W~@ `80 FopX_@`"L)0t K`),Uz!!V;aCp18'3peW:܀p nx1< x 5>'/ 35DB41 &ĂB|H!B:H #d CN!|7P C1(%$ P @=h͡C /0 `80 F3ă90X`1, vn `?p8 3p W܅{px o-OOi 2D AH 92@F!\$CH 9Ԑ@V 7yo(PAyԆPCh ͡V@[ht C/}? 0Pa0 0& āY0"X `-   #pN)8&܂p#x O9>? >fE B41 &Ć8A|H !$$ArH =dL@V A>C(E8P @yUԀP jC >4&ZB+h =tzA_a fL s`.̇ JXa 6f`mv. {`p98"\p- w.܃^+x o-|O  7 "Ct $d@z +d rC>C((P@Y(TPjAmu>4@Sh͡V@[htNB7= Ca0 FOo0&d `56& A !6aCpQ8\px1<  |C3?94s轟C=zs94s2%2LY&Si4gZ06L[=Ӂtgz0=L_ӟ a2Øf x1.ƛq3cq/0Df23c3 "f1Y,c3+*f5Yˬc62L̄0f/s9e1ǙI4s\c37]y̏ 2DhAbHi d̐B69 '䁼 Aa(Š$PC TjPCh14fZC[htNB7=7`0 0<0ƁL043`&̂0X`1,ev #pq8'p.e=|?Y"B, q .ăCH =d @v9BPA ( 4ԀP jC]h14 C h 5C3t zB/C|!a,X `9 VX `=l 6CCl  `7쁽80cqs9 _Jwph/}2}*\pn- wnΥނ,7`)_J~-CwRKi/, Dgb01XL&.I$d1$LR&IdR3陬L6&b 3EbL $S)͔a2Le Sa2 &LsӚiôe1.LWӝdz3}L??3 f0CƋq1ތˌc&0Lf3,`2%2f9Yìe1 Ff lg2s9Μ`N2,s9\d.1W5s<`2/;=|f0?/,Dd"1(LT&db18L\&I$a3iL:&=dgb0yL S)cJ3 L5Si4b3͙Lk ӎit`3=L/ӏ d1!Pf3dF11x3nf,33f>Y,b3K2f9Yɬa2f#a2!s9d3# yƼ`^2|g~2gEd&I$d2)4LV&;br31yLS)ɔb0erLy"STa15L=>Ӑiôe3L+Ӎf1 f83Ɍb0b73a|?f3bf3sy|f1Y,gV0+Ujf YǬg60Lb0{}~s9c3,s\d.1W5:s&?S)b 3EL18S)Ta25ZL=>Ӏi4a2͘L %ӊiʹa:3=Lo/ӏ f0Ù(f x2^fXƗg&0S f&3,f0KerfYŬa2f# bf+`v2f/d2'S,s\f0Wkusf0w{}y00_̟YDgb0LJ&-Id`0YLn(S)Tb*3ULu&Sa1LCӘi4e3L-ӎit`:2Lӝe1@f3 e1ÙHf30~L 3Lf0:f `v2>f?s9b3G1s9Mnt뮦jiWvjڍi'5r[B{o5մVmnմVKo;Ehϭ5݊khn5tC$ n jkh?&#D2Mkh'F>[CךPJA9TP jBch͡VBՠ:ԀP@Sh͡V:B']ta/[k-}ïW(SS33ss+k{GGgWW77ww/ByPo(_CP~3_ߺ(D %z(1BJP,䡤 %U(iiY9)*)+ * ) +)+J(J*J)(**(***)*+(*j+(()**)+:(:*:)z+(*+*)+*\Gw:=nu+:~YQIYV((*(*)++).()+n(n)n+(*+(*)+*)+(Q|SHHHHHHHHȠȨȤKGQ@QXQDQTQLQ\QBQFQVQNQ^QAQQQIQYQCQSQGQOQ_@BJZAIYUM]CSK[GW_1P1H1L1\1ZTx)\ o[1VXXXXXXXXجQlQlUlWTRQUSVQUSWPRVQ\V\WTRQUS(>)>+(U|U|S|WPTmHHHHHHHHHȤȬȪȮȡȩȯ((((((((((hhhp+|~ Ebbbbbbbbbbbbbbbbbbb"HE]CK[GWO_q@qPqXqDqTqRqSq[qOPHX\^_woHȊ(X؊8xDT4t L̂\<`H(BIfل Mܼ۵ީ!ށʹ{7Ӟ|''ͧir%yr\#k7"C7? 37~Lpwfځ{~K&6ӷfSilܠJ~mhc^SIPbwVP BsD}~',$o ^Qr_P^7E}KA+DCA!81iBf9iEjO(󠎤L( 7n FD ( GF12 $^ %n 1hH& id:A( >y D`!h ;/n ǂ {*:DwR&B] DFAtDo}!Bo{u)D= QGA&2 ԟ OAw]B] OޒwɠŠO7,::+BzLoO03Q +ԣ`Q0`o`ڡԕ`I0`Jp>B}]L߭I!Bߪԑ2,~S?[/:\]0}W'i%ԗ`K0%ܖP/ԋ`E0u"f<{:L 7S0}ӷP0u%x(^7od!ԕ`J0u%L] SOI0"zL^S/ ԅ`^ӽL]SiWSm`QC)`y0eLL;#D(`<2iWӮL;" L;"vD0LS/sKB(=rC=E!3B(!@A !eBهP!B)M!yeBP!yByP!s]Ҏ>C(:C(9d lChP!4!oBP!m}kP!2C(8f> lC(6 ~A!aQ1q I)iY9yE%e5u]=}#S3s K+k[;{'ſo_߲mQqqII))iiY)( * )(*))+j(j*)()+Z*Z))+:(:):+z*z)z++(*)*F()(f))+*)(**)+6)6+VvN.n>~AaQ1q I)iY9E%U5u M-m]=}C#cS3k[{GOȊhX؊8DĊ$4t|B"Rrʊڊ:.n! [VU(ss  KK+A`6.^A!1q I)iYeU5u -m]}C#cW7wَh$dTԊ4L̊,l\܊yyE%e5u--mm}##c O¥Vc ?"P1^1A1Q1I1Y1E1U1M1]1C1S1K1[1G1W1O1_@PHTL\BRJZN^AQIV()+v*v)*++n(n*n)n+(*)+(*)+(*)+^(^*^)^+(*)+*)+~*~)~vFPDTDRDQDUDSPTRVQUWTRVQUWdPdTdRdVdQdUdSdWPTVȫ(((hhhhhhhhhhhhhhhR> _bbbbbbbbbbbbbbbb"HQTVQUSWPTRVQUSWPTRVQU\U\S\WP%gvw_ co} D"(n=t[~{V_@PHXDLZFVN^A"bbbbbbbbbbbbbbbbbbbbbbbbbbbbb"Xآخءةإحا8888888xxxxxxxxxxxxx#MSK[GWO_@PHXDTL\BRJFVN^A]CSK[""oE~EEqE EIEYEmEE=EECEsEkEEGE'EgEEWE7EwEEOE/EopH(h¥Q)iيEŊUՊu튽Ê#3{GNJ'Oϊ/o߲}11 II))iiY99)*)VWPRUWPTRVTRTVTQTSRW4P4S4WPTRVQUSWtPtTtRtVtQtUtSRVQUSW P T R V Q U S WTRVQx*.­Q*@$4L,\E9EEEEuEMEE'EgEEOE/EoE`bbbbbbbbbbbbbbbbbbbbbbPETELEZE:EzEEVE6EvEE.EnE^E>ߊBRҊ2 jZڊ:zFƊ&fVΊ^ފQ OP*+&(&*&)&+f)f+)+(+V(V+(*)+6(6*6)6+!-m]݊=}CÊ#Sӊ3sK[{'g犗Wϊo_߲  )iy++)+J(J*J)J+(*)+***)*+(*)+j(j*j+(*)+)Z+)+:(:*:+()+z(z*z)(*+*F((< /K1NU)+(*)+f(f*f)f+(*)+(*)+(*)+V(()()v(v*+++N(N*N)N+(*)+)+(+^(^*^)*)+>(>)>ˎDRDVDSTW$PdWPTVȣȫȧ[_QPQHQDQTQLQBQRQJQZQFQVQNQ^QAQQQIQYQEQUQMQ]QCQSQKQ[QGQWQOQ_@PHXDTL\BRJZVN^AQYEUM]CK[GO1P1X1D1T1L1\1B1J1ZXXXXؠV(*)*)+(*)+(*++.(.+())+(+^(^*(*+~ɎRVUS$R$V$WQTRWQTPTRTQTUTSTWPRQUSW4P4T4R4V4Q4U4S4WPRVQUSWtVtStWTVSW Q U S WTx( bbWW*+&*&)&+(*)f(f*f)f+(*)+((*)+V(teqR:QNIIQDC@;=rYkε=x,XcJU=xXcFMxlOmylcn={=AC=x8q9<.{\q-<^xx[=a={D#G,8=x$H#G*t=2xd#GV9j{x#G,q< z(QģG9<>G55<z8q S=xq+5!o  M?{yu7܆;p}x O@t 6ā@BH! $dR@*H !dL@V9!<A~(!BP*@%*C _WPj@Ms; ^>iq9:]N7r;?: g3q;g3͙v:ErgYs;&gu;'s޹\t.9+MyϡpND'ʼnv8DNz!d,A 8 P *C _AMԅB3h 5 o tnz@O}/?` 0F( cx `&̂0X"rXk`# /a}pq8 2 7܃#x O);?9B8 D(At!$dBFY!ܐB( B0bPJAeA ԃB3h |B ݠ;|~# ` 0FhXa Li08 roNW8Av9Gm~8A~d Y|q: \ \kpnMw.܇SxWOއÈi1ɌTFj#Hod02,FV#i2ryFAj5ōgFYQި`T4*__ՍFMQǨk7FKhg7:]nFwe6}~Fc1l 1?#QƯ8c1ŘjL3K2chal64;>q8j33?e_qψo$4$FR#Ha4R4FZ#jd39F~#5 EF1Q(gT4*U/jFuQ˨m7F hg|ct1݌Fm1Əc1l4F8c1dL63y|cXb,5Mf/cg7Caq8f7N E_q͸n0n#xj<3/+ƈbD31xF"#He1FV#m1 %F)Q(k7*/F5Qèi6 Fhm1:o.FWk`7~4c1n2~1~5)TcXl,1ˌ c`l1ۍNck7q8n0N3Yqٸa4nxm1„1HF#Ljk$6)Fz#(h1ōόRFiQΨ`|nT6_UjFuhi2mvFf|o10c1ml1c1ݘa4f9\c1Xh,1ˌ cXm76یgq:!s9tN98g EsŹt9ϝ[ u";QhN@@@@aL,<.dn gf d d 42MF ht21}c1g7fsfca6Aq8k3W-.ӈm$4F:#hd5ٍFN#o6EJFhk3F'e6~6cq$c1՘fL7f3Ylc1טg7K2cXm1Fcbe0G qɸf5Cxb<5ύKxc5QF4#Èi2bqF<#Hh$2IdF #Hc5FV#a6!FQ(j3JFYQި`T4**ƗF5QǨk3 F#hn0ZFGbt5ݍFOk 0c1n0Fc1͘n4f#(n1_U/F-Qh`45-F+a 4Opc1k3$c1ŘjL33,c1ǘk3 o"wcXi2Vk:chl206;Caq8f7N'Siq8g7.Ke_qոf\7n7[mxe1+R#ΈfD7b1XF#ψo$4$FR#Ha4R4FZ#`d42,FV#m1F!#(b3F5Qèe6uzF}hd46MfFkhg7:oo.FWa437z}Əc1bd0F㍉c1͘n0ߍcXn0Vc`l46[qq8o\0.Mq۸c<0S9ވbD5b1F#Hb$5)TF:#bd5ٍFN#c5FAb6EbFqQ(e6erFyQܨlT10__Fhb4ZmvF{bt3z>Xc1ޘdL6S c1ۘc5B7wcXc76?co0Gc q8cc7.Ke_q͸e6wCxf0^_QFD#وbD5эFL#ۈc5F#Hc5 F&#jd3r9\Fn#b"FQQ(m1__ՍFMQǨk3 FFche6mFg` 1#Wc1oL0&c1͘n0f9\c1Xl,1VJXk`l>#vn U76܅'3yq:'j8'щDq9ѝN'ω$p.WԠ=5覨)AE 'j7QJԌ?5腨AD >jQwo5xF 2=jQu 52j#2PCE*C—T@Sh-%Fc3~4 `$a ̀0|X+ p 8 g p+pu><x/5hQ 6ăBH =d 2C^ ( %4PCs _P j@MԅzP@Ch 4ZB+h mB7='7G`0 3_`,0 &Lsȧ~E;,%rX `lA8G3sp.EW:܀p =x1< |=D bC|H 1$ RCH! PB2P%TPjAmuԇ@Sh͡3ٙLqf83wp9՝NMSǩw8MN3iv:N'||v8}~Opg3v88cqxg3љw~w;K*gYs;8-VO/gu9!s9wN8gsys׹\u;7-sǹs;#yqOND'ىDu;1N'Iq9YlN')tBPS)q:UNi4r;͝N|q:Ώg3t:$g3řpf:g3Y,t~s~w9˝*glwv9{~s9pN:g5s˹ON'׉w8 DNb'I$wR8)N'Idr8Y\NnSʩTwj85ZNmSi4sZ8-Nitr8]nNow~t:!O0g3֙Lt&9)lgY,sV8+UjgYw698-Vgv8!s9s;'Sis9\p.:sǹs;yr^OND'ىDs;1XNl'׉$p9$NR'ItR;iN:'dr2;YN'S qBNS)s;_9_;՜NMis;N'pz:;>N_g3 wF:_Dg3řLs;3Nq^dJ O'ȇ8A6!Nq u'ȁ8A =Nq^q|ގ|`'8 ;Nqv`;' {'8> v9~p'nv3~΍y? :hNL'I$q:ɝN'dwr8y|N~S)p>sJ92NYSکTwj8:N]i4uZ8mNtwz:9;}Ώ g3v88:cqxg3љLu;3lgYtV95Zglsrv:{>gs9v8ǝ)s9\p.:+Usݹtn9{}y U/BuPS%uzB}Ph$4MfB Jh- BI,tz=^wBoOQ  !Pa0J-~~ a0Y"f sapB8) Ke_pC) '3 BD!Y"D хB,!G'$R)TBZ!A(d yB~PP($BaPT(!|&J 2BYP^ T u·BW]!z }~Ba0N Lf aTX&,V+uzaQ$!l ;.ap^# 3% #" (BT!]!b qBb!\H!d لB![# BA" "BQPBL() BEPURJZ/4ͅ·B7C#~~CHa0C)f sB_0P" F#Qhga0V L& ita0S% oaZX'6 [?aK' pL8..K¿p]!w{}Px$< # BD!S%qB"!DH*$ )B*!VH/d 9\Bn!W' !T(,J BeP]% MBGYFV) O0a0J-~& )ta0S%sy|7aBX) &aE*l ApJ8- W5pC- Lx.^ o+e!N$D фB,!G' DBb!TH&$R)B:!A(d لB^!P@((BPPZ(+j5ZBmPO/4 ͅBkNh/ Da0Y.˄JaFX'6 ?OaG+ pZ8## EpYW*\nw=@x(< O3Bx)^ o;A_apBx!Q$DQhB ![#$ B*!U& ńgBIPM.j B3Rh% 턎BoW' ~ !O0a0B)F ? ㄉ$aPX$, +6/aK-  CapB8). ׅ{Xx"< /+Fx+ :A(D" B|!PH"$ )BF!Y"d مBN!W'BPPD(*J BUKkPC)j uB=Rh%t: 7wBGa0H,  #(a0V'&)4a0C)f sEbaBX)FaY&v {}~pP8$ DžIpV8'\Wkup[# 'SJx-  DQhBt!K+ B"!LH)r9BPX("J %RBiP^ T* *BUK+kFh/t]nBwS%|'|/~ ? A`a0T)F ? c_a0K/,KJaZX# &aE*)l ap@8$GipV8'.KepU&n ;=@x-WڰB8!A(D" QhB ![#$ )TBj!VH'2B!S%BgBIPZ(# _ ՅB-Ph$4MfBsY"tz=^wBa0P$  Ä8a0Y*L 3Yla0W',KeraVX'6MfaUSK8  DžIpFG8+ 5pC+ /+҅ B!I"D B\!_H,$ ɅBJ!ZH# BF!C)r EB13PF(/T* B5Ph"4 ͅB{YFV"t ݅BO[# ? c__a0I,L ӄa0OX'6Mfa[+ EpG'< O# B$!M.b B*!FH+2 B!O(  %2BPS%BLh.Z BY"t ݅BOA/  C0a0R%~a0I* +*aFX+6a]!v {}pH8, DŽ pJ8- =Xx!^ ow{2 B!I,D хBL![# BR!\H%lBn!_BbNqS)q;Sͩpj:Pϩ4q:͜N Jh- BU)|'|/}~a0XI& F Da0Y"L 3y|aXX", aNX/l6 ۄaK-  !pD8*#n ;=Tx)^ oe # BD!Y"D 1B,!_H($ IB !JH- B!I YN6'rr;yN>'S)rB"Np#f Ìe*waNCi4u9͝NKN t@a0L# %2a]%IpV(\. W5pC) Hx*LaB8!A$DQhBt!W'R)TBj!NH/bBqPR(%T* *B PK- FBcTh&Z NBwS# ??  a0L- Da0Y*Lf3Yla0W' k:aC){Ap\8!n }Px$<υKFx'>+s!N/D" (BT!_H($4BZ!^ d2 YlBv!S%y|BPHEbgByPQ$T_UjBPOh,4 ̈́B+Fh+: ]B7a0H,  Äa0ZY#"*&)Ta0['߅aBX-l[?m_vapP8$GSipV8' Lx.^ w{e '"(B4!C) BB!DH&$R 4BZ!Y*drW0B8!Q$D qB~A00cW `O򅁰"@D! DXA|H TBF! P A(P J@I(,~eva/pQ8'$3p.%  ܅x -$x!D(bAl $ RCZHY!dB~(! 2P*PPTP@] !4fA ]t~!0~0a&̆90bX+`%5zaa l?a샃p 8 4sp.% !<3x !DH@H 1$B6yP gPB9s UK PCh)4 @[h#to t=~0O0FHg0dSaL,UͰŸ ]a8Gp98*\pnmw<'sx?)C !1$2B&9 'ܐB>! P>P@Y(| _CMh 4V@{|B ݠ;~~0 ?p#a1 ca0 s`.̇~E;p)8Y W\p n > !$x[VHW!AORHG!;;A'A|sH-!AoCN 9$֐C. :$$C?$萐{C HH!Bo %$os z $x o $耐 Cyxn C| r>4N n ^ 6 n >4Фd >4e U M m ] } C. >4{ C 2:4C , 6T . 04}C7j 0^ eC54 C4E ȵoh94د:p,dv ]8A&~p;p/fZځ:.~ 7to( p-ǟdX!D(AfY!TPjBh@ ݠ; 70 F0~_a 0&d`:̀0< wX K`),56;a쁽7p)&܂GR <ă C H ! P@Y("T/+ 6ԁPCh14fZ@KhB7='|a(`8Q08` [`+ ;`'pq8'3p.E ܄[p}x9W;x'cC 1$ @V!\B> PB1( rP*@ECe—4 ZAkhmtN z@/>~0P p#a `L)0t3ă90X `5l?CpNU6܁^Kx?)Ax :Ā@\H! $dR@J(%TJ9T/*| _C55&ԂPB= !4B3h-6A{to[ ݡ^|~a A0P p`)B8 "DB41 &ĂB< !$ĐB2H) %ԐB:H #dPB1(%3( ,P*B%*CPjA}h-:7-tzB/#`$̆90|Xa ,v. {`/ `?p8 8p ?peU 'AL!ąx@BH 9 @ZH!dlB  C( Š8Ϡ$PAy| ԁB#h M)@7}?` ` 0 F0~_a"L043ă0X"Z G(p N9 W\pnmw܇cxa!"Ad!ąx@BH!)$RB*H i -̐Av 7䁒9|_P C 6ԁP@ChM4 ZCh tN@Wݡ>`C'a3_W ` PB1(%,PԇAch5v:B' w`a_`,L043`&̆90|a셿ap18'3^[x>B 6āCH %ԐB:H #d̐B69 '<A~(EP JCY("Tϡ2T/*| _P CMh m{ }/?`0  1 ca"L0X `5z[OA8cpNI8 sp.EU>ԃB#hm :7-t C ?@@aQ08 `,`a ,Uz[/;`7p 98:܀;p3x/O>a!"AdQ!D bC >$D@RH!ԐB:H!d,r@nTԄZP@]>` ?0#`$3_W `P B9(|+A- u.4Ch ͠9 ZCh 3|B ݠ;|}/Ga !0~0&$ S`̀0 f `>,,a1, X `5f[O;a솃p8SpY8\Kpn- w.<x 9W[x'UB8 "DAt1!Ć8B2H !dL@V9!/PB9("Tϡ2T/*| _P C 6ԁPAchM4ZAkhm-tzB/ }Ga a0FHgXaLI0Tâ0~E2Xkal ^~80p. 6|E 2D bB< $ C H t2@F! dlrB. ybPjPACh 4fZ@Kh v:@G@W ;aL0~ŰV*X k`- mlvn{oCp.5 w.܃Sx%;x'U@X!DH@T!ĄX@\!$ĐB2H) %ԐB: 3d C 7䁼C(! bPJgPJAi(e P*PP:ԀP jC 4F@Sh͡B;h3|];@?Ï0~i0X acpNI8Y8\Kp+pMw.܃3x/%>~e ! Dhb@Lq!ćCa( %3( rP*@EC ՠ:ԀP @=h 4fZBh to[]tz@_?@a#8a,a1, JXa 6&6_vNa셿apa8G8SpY8"\/\p n ><x 9 ^O .ăAv!䅂P C(%TP5TPjB- u.ԃB#h M)4@[3A0P g`~u!DB4 q .ă2@F! dlr@N!/P B(P C JB)( es PjB- u.ԃB#hM9 ZCB ݠ;~0`C'aQ0~1RXaU6V_vNa셿ap18'$pp܆;cxOW[x|Z!DH@T >$CH 9 RCH =d 2C ;䀜PB  C(š$PB9("TP%|_C55&4. P#`,L0f, s`.̃,a1,eV*Xal-mlvn _ 6܁px1~R= p"@lq!$ĐAj ;\@A(! TJTZPA}h M)4ZB+htNo ^=@C`(`80 F0~0B ~5 v. {`/p18'$pp2 W*\pn- w.܃^Kx w>OjC 2DbB, q .ăB"H I )$RB*Y +<A~(@("PAq(AI( 4F@Sh͡C3|B  0 ?0?aL)0t `6́X `=l>(sp . :܆;pcxO<^x '5@X!ĀXB"H) % 2C Ba( rP*@ECe_@UTPjAmuԇAchM%C[]~A00#`$30`2L0 a̅y0B RXaUzaa]^88g<\p .w<;?"Bd1!dLB69 'ܐA~(bPJgPJC( UKM6A]tzw=>0P p#aȧ;,% JXa-6f[Ov;a=}A8cpNY8"\p x O)<Oj BH! $RB*H i -2B& Y +dP ABa(%2PAy| |_C55.ԃ&o tnz@OB?a 0F( ?~Y0\au_}A8cpNI88 <\Kp'sx5  2D C ąx@BHI!$RAjHi! 2AfY!䀜@~PJgPJAi(ՠ:ԀP@=M4 ZC?~0`Ca$3_W `Š|%2P*C—5TPjB- u.ԃAchMVB;h#t | ]+tzB/}? C` 0dSa:̀0RX+`%u6& pq8'3py7'C :ĀB2H 52@F! dlr@Ny PBq(AI( rP*@EF6 \px1<^+x o->~R? DHgPJAY(s _Au5Ԇ:PA}h14:B7='{ }Ga 0 F0~_a,0lsȧ~E VJXa u6 `'ݰ> #p 8 4,p.%U܆;px|AD Q *DB< !$ĐB2H) %ԐB:H #d,rA> PB9 U _WPjAmuԇAchM4ZAh =t7~# 0 ?0#`$3_W `0O0  `4 `L04`6́0X"XKaհ:X/;`'ݰa8Gp xI@T!ĄXB"Ϡ$PB9("Tϡ2T/Kh ͠96A{g8SaL0f< `!`),Vj [`+ݰA8Spy2 W*\pnm >~2 p"@D! Dhb@L!ąx@BH! $dR@JH! t2B& Y!ܐA~(@(P C JB5&ԁ Z@Kh  @WAo}Ga `0fL sa VX `=l8cpNI8 \/\p !< a!B"H ) %rC B ~a3_W `"LErX+a5zal'l`;쀝q\ \kpnM܅{pCxO<^kxouX!DHB H!=d 2C !| ABa(E5TPjB}h 14F0~_a,0&d āY0$C2H) %ԐB:H 3䁼PBϠ$rP*@ECe_| ՠ:ԀP jC >4Ch ͠9 ZCht0`a1 ca 0 f, `! X `5 [`+ /;a=p!8 G(pN)8 g8 <\p . :܀p Cx oOpNx'ʼnq:ɜN];LN'tr9Av2}\ld` >ȨAִAr}os`>}kW`>>{n`7mau !DH@4H ԐB:H #drAn(bP*PPCMԅ@Sh͡B;h#t | ]+tz@_a80 a*L0 *X k`-6&6 6  `7쁽7p!8 G(pNi8"\pn ><'Kx w>~1 p"@D! DhbB\!$DC H!d,Av9!<A~(@("PAq JB)(e P*Ae_@UjPjBmu>4CSh͡v8}~Ng3 wF91/Xg3Lq:Ӝ gV`6́|g,`@{Ǡ; 6V_vNa셿ap.:)N!/P AB1aL0LKa,`^:s):3)NLt {i+ /;`'=pn]!< [x'B8 DB$CjHi! d<C( BP>P JC( %ԀPB#h M97``a 0& `:̀0 f|X wX K`),VjXka 6f _v18g pn ><x 9 [x|G!ĂC"H I )$RA:!d,r@NvTz#P9"gYu9M~s9qq: οus˹q:yѝ8N\'I$r;IN2'Idp2:N'S)8EbN S)Tp*:ϝ*NU+Sݩtj9:Ni4wZ8-VNkiw:8:]N7rswz; Fgw82\q:ל`{w{ k{3֞A WWp rW@p ^A. W0˽9p`n{3+E ^-+{ ȝ^A W3L|J`{+U{gO fW0'Gz`>zwa`>zw``>z55z{1cx)S=yL1c [<~<{ X(BT!]!b xB|!XH)R B.!G' B1PBL()J eBPI\,T ՅBMPG+4 &BSI,|#t @a0X" ~ ÅHa0A(LSia0OX ,~ ˄*aFX'6 -Va]!v {pD8&N'SipV8'.Ke_pU&\n7[mpO/< Lx.^ Nx/|>W0BX!^ D" hB !K- B!HH,$R iB:!Q$dBaPL(.J erBEPUZ&Tj FBcTh+:  ]B7S%|'|/}A8a0Y&LfaDX#6 ?Ÿ6a[#GcpI+ +Fx+>W0B$!U! B"!DH*$ )B*!VH'2LBf!S' !BPT(+ U/—WB5PC- FB\h!:a0H, ~ #(a0]!f oba\X!V 5Fa]!v =^oa_8( GIpFG8+.+UpC)n w{}Px$< Nx/|>aBD!E*D 1Bl!O/$ $BR!\H!R iB!I,d لB!PP($B1PB()J eB9 PM!moB7C%|'|/ !P'a0R% Da0C) BwaA,l  ;CapR8- e_pU&\n7;]p_x < υ"B!M.b B!OH($ IB2!RH%iB!M.r B*EbB)PN(/T* U:B]P_h 4 &BSVh't BO/(  ? ÅHa0FEU+ ,a0W/,~ 5ZaA(l6 [Ÿ6aC# ApX8&N'SipI,\ ׅMpG+ s~ # BD!E* B"!DH.itBz!Q$d مBN![# BBPDL(# BePUR) MfBsRh% B/;{G+ apa0R%~~ a@X(&,~ KjaNX/l6 ?maG+- !pD8* 'pI,+\ ׄ pK-<Og ^ |B$!W'$RB:!Q$dr9\Bn!O/ "BQP\(!|&Jvrm?%(H"tw]30 ((34- 4X >{}s|dfZyQQ"{(QʣG%*={4hأǓm={tͣG}=y 1)y,w#]=x'=xs/<8I=i<~7GR)=Hqǵ=x\qM7{qmwyqGvyG!Ecx8qq_y[SW$<{#E{\qx\#u<2zd=zqǽ9}#E10"&".bDȈg"16b\ #&ELx%bJԈ7"ތx+bvD̉1/bAˆMDl0b[G{"F|?@C#ND|q*twG5 yD ".4⊈TWE\:⚈4i#H>"GDΈ";"OD"x8@##(Q8HDшbE<Q2TD2#*DTQ=fD":Gt#OD"F 1"bdSF<1*bLc#E11bRĴ#fĎx#͈w"D^DBļ "F,X4e+"6E|9bKֈ#Eq'#D8q8HgG|eĉS#>k`҈d#RD0⢈#.4Ⲉ#RE."CDƈL7Dq[wD;"ODG(hDE"F(Q>BDňJ#jDԎQ7^D"D<dD#D9KD׈"F 1"bdSOG<lsGbK"EL19╈)S#^1=ⵈ#fFf[E̍H baĢk#GlC t cSܜx|bkQ={]q1aL>ƺF{nt#=7bs#=αuo{|ccocVź{VOź==qu{{cXwu{c9sPĺKĺ9M<>ĺ-w]rV;k1CpQ8S/|'ᛳ%r4Lp=7p ]!!x #PJ@i(e P*AM u.4& ZBh =t @ ba 0 Hx gYx^Q00&D4x f0BXa ,aհFV`7}1|Cp18 N B2H)B.KRRu2B& Yzn[VnAvr@. y /< x Aa(E<Cq(% rP*Be աԅzPAch-5t :C7!ba 8 0 F8`2̄7`̆!`,%rX+a6VvGv'A8 K8p Nw=?Og% C .b.rRՐk!q3s{s1q%νĹג8wqKH{sq3H{͈sE{squ!νĹׁ8ws8Y;}s=ܽ?ܽ>8#}s8"ܽ;ݳܽ:ݣܽ9ݓܽ8݃ܽ7}&s-ܽ7sAyT*PAu5Ԇ:PCh14'Ih ͠9 ZCh =t :C ݠ; zC ? 0C 0  O < /( ce `p!8 GQs7YBs\b.5&\e65ZƤ5יt&`2L&b77MVsbn5Nsc^4M.1yM><`4M)h5LaS5cqSܔ0%M)Sڔ1eM9ST0M%ST1UM5S05M-S1uM=S40 M#41O'MS47-{/7imژio:lnzmok& 1C03܌0#Siy7_/ 9i6ߘo)s|g7?O54Ij&4s\n0̕*sIm1ך4&Τ3Md2Mshsn0wd7&or&kA~0G < 0P ǡ8P JC( p!8 G()|%$| 鳆]i:H!dLnb8ZAkhmt C 7( s`., [`+|`;쀏`'ݰa8GO3o{~B2H)H Ep1\ep9\J p \ i -\!dLpY&n[6;.l!<A~xa(@A(ǡ8Z@Khݡ~@X!Pów= `!,eVjapa8G< (B!( 64V@[ t`</0^0&D |X a`9 VX `=l >->mvG^'A8cp>SY#@J. HWUp5kZHi:H!dLp p @vrCC0Pǡ8P AEՠ&Ԃ:PAChOXCa|;a= pQ8z* $dR.b. HWUp5k t!<A~xa(@Ax Aa(E<Cq( 4PC2TjPj@M.ԃ C h v:@G tnz@O? 0C 0  O < /( a"Lu `>lv ?t n;N { d{! <A~xa(@Ax AQ(PJ@I(TJP@UաԄZP@]5v:B' ]+tzB/ }/0B  q00#`$<O3,<K0 Fx8`LW` LWaLu3 xށ 0X`1,>,V*X k`-6&6 6;# n{a| ~8#p g9|eN7[s|g7?OLR\h.2k͍&c^4M.1yM><`4M)h5LaS5cqSܔ0%M)Sڔ1eM9ST0M%ST1UM5S05M-S1uMst2ԼofYiVfYk֙fh6fl5fm}f9h9jS9aNSlrƤ39MQS v>p8ӳ^H uC 3dMp3mp;w]p7!~y /AxG < 0P jB- 4F$4fZ@Kh#tB7='B?` @, C`( < 0&dxTxk:̀`6̅xHE&6 6;# `}1p8_ | z1)$ Rk!d̐n;N { d|P C1( rP*@E TjPj@MԅzP@#h O@kh'~@X!Paixya I0^)0^i0^ā7M o;̅xHy0BX k`- 6VvNa}1||_R7p pwp @6B rC ?<C0G < 0P ǡ8P JC( p8 8| _I8;~C .b. HWUp5kZHi!LF 7p+wݐrB ?<CP@I( rP@sh-t. C 71 `0 `8)0^i0^ā7Mx flx̅X 2X+a vN #t$ArH@J.rRp\ @ZAz!d!!<Cx £PPC% U*TPjB- >t.Awo[0 f0ޅ`pN?5& \p%\WCj4t2@F! \7n[!?<C0G < 0P ǡ8RP@ TjPj@MԅzP@Ch <OBSh͡V@[htN@Wݡ^@_a A0` a0FHx gYxEx Fh/XaLW` LWaL-mx0"X`9 VX `=l >Ͱ‡ v. {`/샏 p18| 'z9)$. Rp\ i -\ =d 2Cp'd{!~!|<Q(b<šRP@ U:ԀP jC >4:Cw=>0C 0  O3Mx flxB̃Ű X k`-6&6 6;# `7쁽>O`?p±Ʀ 2Af\PB M h-60C 0xx^Q00x` LWa3`&o[0 f́w= `>,X 2X+`%հ:X`#l`3l!l>ݰ>>p!8 G()|%5|)8 ?5. $.p!\%p)\C*Z! \7n;.xG"PJ@IաԄZP@]4F$t.C}a2̀ o, `1,>,V*X k`-6&6 v8#g p ( 4fZCh +t` 0&+:́`.|XkalmvGv c8cp>po[8;~᧳&$ C R…p\W@*!5\-p+p'w= ýr}p?䆼P CQ(PJB)( e,P*B% U*TPjB- u.4&4ZB+h m-:B' ='B?` @, 8Caa,0&$ x ^YX 2X+a56Ff.~8#pq> NWpSp᧳&k  2Afpw@N@A( Š8P JCMԅzP@Ch'0B  q00#`$`2S`* `: ô6s]HŰVjXka 6fv. 'A8cp>/K8'[8;~᧳&% C R…p \J kZHi:H!dLpdfn;N C( Eq("TPB55&ԂPB= !4')4ZB+h m-z@O~@A0`( 0FS/K0 Fx8`"L L*L0ހ7- : 0sYArH@J.k!#d̐Mp3mp;9~ !4')4@[htN@7!p#)xg9x^%a ca 0&dxTxk:̀ o, o;0ޅ`.C̃RXz%\)B.K2Tk!  nAvr@N\@^x<Q(b<šRP@Y(TJPAu54V@[htN@7=>A!ba 8Ca 0xEx Fh/X`lMA8ϚC*!5\BH =d 2Cn^9>rAny!AxG(q(%$P*@ u4A ha`/K8_Io{~ΚB2H)H Ep1\ep9\J p \ i -\ =d 2CMp3mp;wpdp/䀜p 7䁼 <0< rP*@E TPjAmu xB;h#tB7  A0 O( ce `$p!\%p)\ j@ZAz!d,p=7BV n[V n;n9>(PJ@I( rP*@E TjPj@Mu4Cx C{t.zAoxa4a,0&+*L0f&`6 xރ 0X`1,>|[ᇳ] ,p=7BV n[V n;N {^9~y /!(š2P*@eUԇZAkhm:Ag]tzAo}a 0FS4<`40TuHy0"X ka#솽p-{~Κ~lA~xa(@Ax Aa(E1(%P“ ZCh ' `"L L*L3`&̆a,VjXka=l >Ͱ‡ v. {`/샏 #p|_p5| 4?ZH 9 %\p \ !52B& Yznp'd<A~x Aa(E<Cq(%2PAyTjPj@M>4fCg]1 `0 `8< </0 `!,Űz [`+쀝>O3 N | Y'rBny!GjPB= !4C+h#tAw=~b A 0&$a!,a,VjXka 6f 8Y3ArH@J.. H@ZAz 3\7n[6;.l!AxPAq(TP C]4F$4fZ@Kh-:B' ]+tb`0Pai/XaLI0^)0^i0^ā7Mx fxރxH X `=lV {c8 3Nf&p ".K2HWՐAFnAvrBny!Q((q(%$PB9("TPB55&ԂPB}h  tzB/ }/0  q0px Q08`"L L*L̀mxC̃"X K`)`9 VX apo{~:$.+ \ WՐk!  2Af p#7-p+p'w= ýrB. y /P JB)( eTJPB55&ԂPB= !4')4ZB+h m-:B' ]+tzB/ }/0B  q00#)xg9` LWaLuo,xB<$< `!,ŰއeV%7@*! 2Af p#dfnv!7< %6ԁPCh14AG`:o[0 f;C̃2?:Dz/)!%ҢDZHKiY"-O:$DZHiS"mI=v$G3v%DړH$ęui+ )P@5m -P@y=@z8P@T$P@% T.P@UT%P@UT#P@T'P@58P@M5 :P@= +P@} /P@ hHhd=@/z1KF@c 4!+@M4#@oz+Ь@aN"%B|"O('’DX'²DXka]"O 16%DؖQvhO>I:p#:@_! ]sHizn4Y#nۜ۝;";:܁*yTsj85sssH8VZhmuh{ +@{}h:p#:x}@' Mo t:we tuԁJ@e )P@Y(ketor/r`B *hJ*| *jjjV:jI'5 ,P@ 6P@u5P@= ;P@48P\!hD t r &@hf7hv @-$к@[m#@'о@GE t2ׁ ]ü2E. ti](U+]@ >P@Y]@w'P@(W܁*Hz,J*T2ZځAjI'5 -@'ǁ> t(@G t,@,灾t"WN:t}@?$P@J@$R2ՁR&P@e9P@1P@79-ntDn)`5㦔)mʘ)Tp:՝NMS۩u9N#iv8mvN'tz9>N_3Љu9ÜH)i9Eg3ڙLrtf9sL6}>yYpg9a0ǽޯlr>p9=y{/<ǽ޳|t{9|{7i. pq"]HW&5tm"It]"K)2'RD># pw{d =r wx4@ P4c(\*jjfZj^hYZhcO `PH' 46'ҤDz%$DHif"Hiv"MDJH %DXa}"lLas"lI-`g= p(G p<]RH$e* cLn 5M -@ g'@<(p"(LrbJq&h}:Kzob`D t#^x1⥈1?1gƄ1gza9sq3suo;^$`QX`eU`K; ;{Y|_&!77Y  pa\&2 s,pCd pS= pW [{p_ ; PKx"IrPi-U"N)&BDO"O0('B\" K02NgDx.Oş(3Ƽ5 _0LNWiqsg۹s\r~>uesg:i3}NO$uN }vw {x<޽ߎO\\v8i{/ދƻ}[{?gŻON{CĻ5?>^s:7޽ƻN>ǽŻ׮ΣN^+kA|ISqNySũTs;NcqxwowvN{?8ݜ7u91?qW&^Ļ}{ƻd{ŻZ{ŻX{ŻH{Ļ8~3͙rf;8: |gY,u9Վ{.ot6989!_:'ws$$s"=Hp =s j=9Ml>3$ Op}{?x';= qNpu;Mp9 88NpuB!= Nxqy{c^^cZN= qNh4t8O8O:M'>= m{]Mp{Bgǽ6&>= 50%װ= qOpx'{F{:NpqL= o;Ms&5aۄ5Opm{l>tcۄ}`/8 I% RRAj42@F Y +w]p7 ; 9 'C. y /<Š$2PC%>4ZB+h m-t0]L7ݸ{#)xeSU5xf›0ކw!|X a,% {O3/o{!\)rHWՐk!-\ #d +mp wpd\B>C(0P *B%UTP jCh <OB+3tnz@O }0b `!0 s"`4a,0&dxTxtx ^0ހ`C̃"Xa uVNa}1| p1o[I )$pp-pL@V n;nA. @x CQ(PJ@y TjAchOZB+h+t zC?0C 0  O</0^0`2S`* `:Lx flxށ9.s!"X K`)`9z[Ca|;a=80| _pNOg-LI! 5p p; 7!x B!( ErP*@E5ԇF$4fZC;+tzB/ }/`9x^%a ca 0&dx0 k0f&̂`9U [`+|`;쀽8G(|;~᧳%R…p\WAjAz \7n!|jPj@M4F$0b)xx^Q00xS`* `:o[0 f́wa.C̃EއeVjXka 6vn )|'k8g-N 9 %\WUp5\ i -dVl~<Q((q(%$PB9(5&ԅfZ@+h m-@Wݡ7 POq0^0ކw= `>,X a u‡ v. {`/쇃pN$9 %\p \  !5\ =dpwpdp/!!(0RP@Y 1<MV@[htNB ~@X!PaxxFh/XaLW` LWaLu3 x ކ 0X`1, VJXa=lͰ {a| 8|_?4 $d.p!\ʸצ5ZƤ55jid2Mshsn0wd7&or&ky3_I_˒d&4+U&Ik3Md2Msm19}&c2ST0LeS40M 1Cp3/|'kSY/ @Z p#p @6}p?!(E1xC (e,P*B% 5ԇFC hm=tnz@O?@, C)xyxF `<`4#y2MIST4MS5L}47-LKt1]M70L 0P3 7#Hy1s6GQs7/̗9i6ߛ̏Z$5MJ>ovWKl|&k\y6ELQSg9eF1fg&)ff^3fyüi2ly׼gx`fYffYeV5fYg6Mfn>2;.1{'f9h9j7KnR LJs\nRd4Lshsc^4Cy6ELQ)aJR)kʙ򦢩ljajoƦyflP3܌0fk,2KRYffYeV5fYo6fl6[Vqu~ ֹ:wX~׹ua_~׹ :{޽rCsx Cs(rEϡ92n3s6Gq|aN)_&Ф2WLsh[m&er<&g̃y7_+s|m1ߚS`~)%RsIm1ך4&l Fsi2w{L609}S2ELQSܔ5LST2MST35M-S7 LC46OinZ֦l>ok& 5#̳9yѼdFX3L0zǽotFڻ}^~g7׍o8oE̊vĜw#ދX0bQĒG,X*buĚ#6EFwK=i1z| _{|q?MI=y$Hqǥy\#G=n[=n^<{<#=(Q£G) =*{TQ3VDh <OB-#ZEh!cD=#zE1#c`#[8?a2H) !5d 2Cnn^ rC ?<C(EPJAy*TPBChOBSh-5t`0xFh`pGÿ/츏5ه:׹us\:׹us\:׹us\:׹us\:׹us\:׹us\:׹us\:׹us\:׹us\:׹uŹzիW^zիW^zիW^zիW^zՇޓuw:?\:׹u~N?_>K?{T^_~FSSSSSSSSSSSSSSSSSSRVVVVv+~ϕw)e 8x55ɿ>eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeD{RVyο{?Io|^?ӿjߓ;{ GYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY ;EN1?+<{)~[q(%Q;v]jWծv]jWծv]jWծv]%MѾ}k/hG;?t׼&j/{?jWծv]jWծv]jWծv]jWծv]jWծv]jWծvv=iO{Ӟ={kwcgyS)uʩN}4vErb555n.zU^Wp*:ѳ{:g\_y:5++++++++++++++#qfZ]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv=iO{f|x Ӯv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWծv]jWvu3LgFprZ㺝:uԩSN:uԩSN:uԩSYϧ:uԩSN:uԩSN:uԩ;]t}>SN:uԩSN:uԩS-6N:uԩSN:uԩSN:uԩS;S3ֹIw2?=3gf:>91("""""?:9tbL׿v:ѿG׺-΁|wSN:uԩS#%BL"""""NN7oz}%bZgqwn8ot:797\W/^zիW^zիW^zիW^z?so_zիW^zիW^zgoBwyj<<+&r{lpr:9;ԫW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^z'^{^zcBs#__o-)g^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^z֞V9ok<༨'e|g45y>~(+++++++r !5m|y̕ϕ_9?Zwctk]Z׺ֵuk]Z׺ֵuk]Z׺ֵuk]Qjv8y|ֵuk]Z׺ֵuk]Z׺ֵuk]Z׺ֵuk]Z׺ֵuk]Z׺ֵuk]Z׺ֵuk]Z׺_\of\G?R8gLt&<'45555555555555555555mijjjjsTv 88GBԩSNݿt>ԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԝ|8~ԩSN:uVw&Y rss՘_5 C?pu9SN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN晿@>/uԩSNsWggz|<455w5ʿ?WǝN eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee?5'wƿ;\]sy|}VVVVVVVVVV?mՏyk,xՙL8Og>3=-rJ;etk]Z׺ֵuk]Z׺ֵuk]Z׺ֵuk]Z׺z:eeeeeeeeeeeeeeߐ}ӕڹ\)W9;3"\sy㬚*8JNիW^zիW^zիW^z:uvP^SN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:u~]WZ׺ֵuk]Z׺ֵuk]Z׺ֵugg|E#"Twj(++++++++++++myƛY||k/_gw55ϧߡcy>?}whjjj?5ZNmSשw8 FӞ5vh_׾}k_׾n_;{}kٯ;jZ\|m;i`RB5?迡3UӾ}k_׾}k_׾}k_׾}k_׾}k_׾}k_׾}k_ڸ>)W IipZ:N?tW{ ;ծv]jWrUwiW]jWծv]jW'qW\?x[;~jWծv]jW/}̝vΜ9g[Y;?qs^~{ $rl7o;8swN;:8σ|y>|osݹfl֘Y,t)+++Cgi3@NNgMMMMMMMMM͟5[.NWMMMMMMMMMj,w8Ke֭P߷WMwިɒ$I4I$E-4t&;6$OF6R5lְyJ6lWAvuXDI?oVm$I]-۴kؠ`\vm#Vu7?)԰~m~=;j!GenomicAlignments/vignettes/precomputed_results/U1.sbcompHITSb.rda0000644000175400017540000043236013175714431026432 0ustar00biocbuildbiocbuildUW6tw PTEJ NPT wϼkf_k}p}?M.u'Nh;G_I[)4S}ԮӼYŊ_۠}'_ܬtݢ  2_˄f9a?,Ò?,Ê?>ĆBbs-!3ĮobO!x'{!q($ħ!8x!N8t3!Ά8|B\ q5ĵ߅>?1č7C S!~q'5o!~q/B< GBQ!ߢg-v8!H"I! *DYBd -DBQ(Dυ(h!J(l*!fZ!ꄨyV!Zhmv!! !z!bX!Fb|I!b~!^8ĺCl 5ĶCF!v4Bq"C\ q9W!M!1č?wB q?ă+ģC q,ĉ'C q:C\ q9ė!&ĵ߆>?1č/wxqo"V!x*!H"IgB$ :DB!DYCd =D9C ;Dφ(p!ʅ(B!*Z!jhaF!ڄhcBS![!b@!FbL)!fbv!慘bACbaE!XbY!VXbU!քXb]!6bsCl -;B +ě!vbo}!NwC0ġC|Hc!N8L!΅8"_6w!n)wCB<0ğ!e_8!ↈC$0DC$ L!RH"M!҅"w! (C Q.DBT Q9DUCT Q=D5C Q;DC4 (DMB4 ,D-B *DmB .!ڇcBs.!W!_!bp!!bT!Ƅb\ !&br)!bV!愘b^!VXbcM!^ %Ķ{BB q(8hc!8|K!:7! }!~ q#O!xa?o"VC8DC *DBd )D9B ?DT!(X!J(L !fZ!hY!ZhM!څhCN![!_!bT!Ƅbr)!愘b~B, (B .Bl %Bl#!vbw" "8|Ep<T#8\r_Ep%#z?Dc7"Fp?";=[bG'#HAG$ e"HAF.d S#ArF;|pEP2R|"A*GP%TN "hAD,Mm#hC#x1Nt[#AzG?`|#fF0+̍`^#XVF*l`K[#vF+=G`"8|x'"8Dp6s>.G]Gp=[~~ADEO+ĉ n"x*$ I#A2E9,d ["AT"(A G\E"(AFP. TJ"AFP/eG>#AD-#"&F0)L`j"Djk#vEf#ލ>`"8|Gp*l#*+|7\GC"9;܍~"x_GL-A #HAF. d S#AGP0Bh"(AJFP*JTJ"AD0F4I"hAZE:vts]"AzD3^O"D04`|"&G0%L`Fs"DR/GJ #XF,`m"X^ 9Ė[Cl =ĎobW7C 7{!ac!N8t!> y/B\q1ĥC|WB|jooُ8D!N8L!EYC|b|EmE}#!܊~ND[Gp/p=C?Fp#܊FKF{#3G<\ +DqB /!RR22rJJJJjZZ:zzFF&&ff^XXXXXXXXx5&6.>!1)Z`s`K`k`[`{`Gہw  aǁO.n~ = W/wS$g)iYY99yQB%%e5uu MM-mm/zzzF&f^ x%0(84,<"2*:j`M`m`]`}`C}>|8888888888,yBw[  <HHHHHHHHx6/?((((((((((hhhhhhhhXXXx5&6f`o>  |2U[ww~ < <HHHHHx&,<"2*:&6.>!1)9%5-=l _  *P P0P$P,P"P:P&P6P.P>P!P1P)P9P%P5P-P+P;P'P/P? 0(8,<2*:&.|}Cc@@@@@@ˁŁ%7{{ox7AcӁ3+n~ x#g?߳q  IYY99y%%e55u  MM--m/:zzzFFF&&&ffV^8$p$p"p:p&p6k|ouq7q 3WĈbE$Db$Cr@JF:dD&dAVBnGFQCq@)AYTD%TFmE=4@C4B34G D+FGGN胁q)阅9x K ˱k; ob7m|8Op4pGD!FQC EyT@TE5@MBmA]Cۛ?G_Gook荖?zfwYAѢwX72+EŁ-7;ox/~`PhXxDdTJ~}qORRR2222rrrr D          TT T D;*:QwPTz>Zt7CTm @TuTt;:*ZmuW݉Q]>ZtFm)k6G 5ڶhۣGEbTtƣ{0*yT}GEg<*:QَuTtF}-GE;*8Z=LGE9*:QѷET=yQu1ڥheGE Q=OQѽAQ9QwE_EwMԽh= D_ :s_ :^ :\ :s\ :wt4Ѣs\ :sZ :{sW :ksV :ST :;sS :3R :+sQ :P : J ʢʣ** j6.>!1)9Z%Z5ڠ-yGt x]=}00C00#00c0000S00300s00 ^+XEX%XeXXUXWk a3^l6x6>G88SQqIiYy|.".2W w#n&n'ϸ7{x?'xObDOqF|$@B$B$3HHHHtH ȈLȌ,ȊlȎȉ\ȍ<ȋg(B(PEQ Q%Q QeQQQ QUQ Q5Q QuQ M - mϣ=:#^肮聞胾񘀉ɘ阁٘X2^B,b,R,rJjX؀؄װc bcvbn^}؏w.#Aa|O)(8N$N4,<>pp_+\Wq ;|?n~m;_+~︇x/Gx$FT qOiG$D"$F$3HHHHHȀȄȂȆȁȅȃxQ((xEPP%PPePPPPUPP5PPuPP M-m^D'tFWtCw@OBoA_C @ ` P pHhXxLDLdLTLtLl\|,Kx`!a1`)a9V`%Va5^:l&x[۰;vbn^}x{xC|8C8 >1 )9g_..K|+*[|q?GMOqw ~opOĈg1b!6 .)888888 \E\e|p_\5|=[ 3;>! <=bBlA\Sx I !9R %R!5 -!=2 #2!3 +!;r 'r!7 /E>G 0CE1G D)FE9GTD%TCuD-FE=4@C4Bc4AS4Cs@KBkA[h":3+;z'z/?`8F`$Fa bc&a2`*f`&fa6`.a>`)a9V`%Va5^:l&x۱o`'vc/>x=!>!|OqGq q'q qps| K/k|ouq7q ?6~/w} !!1 )A2$G D*FE:GdD&dFdE6dGD.FųȇBD!s((((((򨀊ʨZ:zhFh&hfhhVh6hvx:3+;z'z7/?` a0`(F`$Fa4`,a<&`"&a2`*aaVbVUZzlFlk،ױ[ ۱o`'vM[؇]>G88SQqIiYy|.".2W w~ -wpWq_IY#b#"ӈHDH$Hg ɑ) i Y ّ9 y,!?PQ(8J$J4ʠ,ʡ<*"*2*:jj ZZ ڢG{t@G ] = 00C00#00c0000S00300s00 ^+XEX%XeXXUXWk a3^l6l؅7{oa~!>!NN 3|/pp_+\Wq ;|?n~m;_+~︇x/Gx$Fd qOiG$D"$F$3HHHHHȀȄȂȆȁȅȃxQ((xEPP%PPePPPPUPP5PPuPP M-m<ڣ:N.n^>~A!aQ1q I)iY9yx /,",,2, *ƫXX؀؄װc bcN›؍=؋oc?x|pq1> )9g_..K|+*[|q?GMOqw ~opOĈX1b!6 .)!1)9Z%Z5ڠ-yGt x]=}00C00#01c111 1S1 131 1s1/eXXXXXxka3^l6l؅7{oa~>>pp|#8c88S838s89\%\Ɨ W5U\÷:~p?qxObDϧqF|$@B$Bb$AR>pp|#8c88S838s89\%\Ɨ W5U\÷:~p?;>! Ii#b#."9R %R!5 -!=2 #2!3 +!;r 'r!7 /E>G 9Eq@)AyT@ETFTCE}4FS4Cs@KFC{t@G ] = }10C00#00c0000S0300s00 ^+XEX%XeXXUXWk a3^l6l؅7{oa~wc|OqGq q'q qgq>_ 7k{\7png]_~=<o !!1 )A2$G D*FE:GdD&dFdE6dGD.FųȇBD!s((((((򨀊ʨꨁڨhhhhhhhh/EtBgtAWtCw@OBoA_C @ ` P pHhXxLDLdLTLtLl\|,Kx`!a1`)a9V`%Va5^:l&x[۰;vbn^}x{xC|8C8 >1 )9|.".2W w~ -ϸ7{x?'xObDϧq ɑ) i Y ّ9 Q(8J$J4ʠ,ʡ<*"*2*:j&j6.>!1)9Z%Z5ڠ-yGt x]=}00C00#00c0000S00300s00 ^+XEX%XeXXUXWk a3^l6l؅7{oa;x}| 0>'Gpp'ppgq_..K|+*[|q?G-wpWq_I #b#"ӈHDH$Hg ɑ) i Y ّ9 y,!?PQ(8J$J4ʠ,ʡ<*"*2*:j&j6.>!1)9Z%Z5ڠ-yGt x]=}111C1 1#1 110S0Ӱ  a3^V.؃x .>xljBTEG  0 (8L$LL4L ,< bc bcVbVUZzlFlk،ױ[ ۱o`'n^}x{xC!N.K|+*[|q?~]{xbDH$Hg"? $ʠ! Z-ڡ+zcbcbF`Fc b&b&c bcfcbc^x K ˱+ *`-a=6`#65l؂؆؁7{]>G88SQqIiYy|.".2W w~ -wpWq_IC,FE<< I #R"R# "#2"2# "#r"r#YC~D  9AQCq@IBiAYCyT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4Cs@KBkA[h":3+;z'z7/?` a0`(a8F`$Fa4`,a<&`"&a2`*afbfcbc^x K ˱+ b b6`#65l؂m؎x; ob7`/>;x}| 0>'Gpp'ppgpps| K/q_\5|=[ 3.~  <=cbBlA<%WK˰+b bc6b^f-؊m؎x&vc-؏w 0>'Gpp'ppgq\e|p_*;|q7q ?6~/w}AiYx` VUZzlFlk،ױ[ ۱o`'vM[؇]>G88SQqIiYy|.".2W w~Mm;_+~}x|pq1>888888 \E\e|p_*;|7p ! %Z5ڠ-yGtċ肮聞胾񘀉ɘ阁٘x K˰+b=`v(n&Qɐ)i 9y,J4*j=:3zc0caa|Oq'p qgqs| K/k|ouq7q ?6~/w}^x ˰+ *`-a=6`#6c;b?>|Oqgp.K\ww~?xnRd@v@N@ BiTB5BW xLT,R6l؉]x{m;x}| 0>'Gppq.2A DdD&dFdE6dGD.FųȇBD!s(((((( J*jڨhhhfhhhv": z7cabcFa&`.8.~~$D"$F$3HH<ȏ阁٘XXXc|OqGq q'q qg.h030˱k c+:n.~Ѱ4ʠfbHFP%FIXXXXXXX ؈؂m؎؉]xo]|8GpqhyP-c|#8c8Ӹ_(FӄHȉ(rh^W ۱o`'vM[ 8N4>E\MqcDOq R"=2 "#' ?P QUQ uP m":+;z'z7/?` a0`(a8F`Fc bc&a bfc^+XXeXxk a ؋}xCA(8N>/k\5|q7p?./Gx#q4#"#)!9R %R#-#+" CCqD)FCETBTEMBmA]C}4D4Cs@+E;<x]110#1 10S0 0s1/a1b9^ZlFױ[o`'va7-~p >q)y|/pq %7o~MoG 0CE1G D)FE9GTD%TFTE5TG D-FE=G4D#4F4E34G D+FE;<耎x/: zzcbcbcFbFc bc&b&c bcfbfcbc^x K ˱+ *`-a=6`#65l؂؆؁7&vc-؏w.#Aa|OpGq q'q qgq>_ 7k:~p?7{o臁!)阁٘X2^B,b,R,rJj5XuX ؈Mx :`+a;v .؃x 6>>pp|#8c88S838s89\%\Ɨ W5U\÷:~p?;>! <]U1b!6 .)'Gpp'ppgpps| K/k|ouq7q ?6~/w}!1)9Z%Z5ڠ-yt@G ] = }10C00#00c0000S00300s00 c)a9V`%Va5^:l&x[۰; c|Oqp'qgp9\%|p_\5|#~xm,FE<< I #R"R# "#2"2# "#r"r#YC~D  9AQCq@IBiAYGTD%TFUTG BmE=G4D4E34G D+FC{胾I)阁٘X2^B,b,R,rJj5X؀؄؂؆؁7&vc-88%|op-png]_qOcHDH$Hg ɑ) i Y 9PV# " P%Q 10*b=6`#6aK5c1131 1^i9g_.K\r"?u>}pp_+\Wq {q7q ?~oO'1^b!i$B2$G DE:dDn4X888888 \E\e|+k{\[ 3.~/&G BjAZCzd@FdBfdA6dGD.ƳȇBA@)A-G @J:flN[x#§8btb!##%2 #r 'CQ4ćpp~}sa1 )9g_..K|+w~ /p'xObD?1b!6 .)%WK˰+b bc6b^f-؊m؎x; ob7`/>x=!>!NN 3|/pq %|op-#n&n'ϸ7{x?'xObt؈4#"# $Cr@JBjAZCzd@FdBfdAVdCv@NBnA^<|ȏ(@ABa<"(b((R(2(r( J*jZ:zhFh&hfhhVh6hvx:3zz` a0bF`$Fa4b&`"&a2`*a:f`&fa6`.cc b5`?8O.K\5p?;>! <ň؈4#"# $Cr@JBjAZCzd@FdBfdAVdCv@NBnA^<|ȏ(@ABa<"(b((R(2(r( J*jZ:zhFh&hfhhVh6hvx^D'tFtE7tGD/FE?  0 (8L$LL4L ,< bc bcVbVUZzlFx[۰;vM[؇]>G8C8 >1 )9g_..K| u[ qw ~op_Iz qOiG$D"$F$3HHHHHȀLȌ,ȊlȎȉ\ȍ<ȋg(B(PEQ Q%QePPQ UPP5PPuPP M- <ڣ:N.n^>~񘀉ɘ阁٘X2^B,,2, *ƫXX؀؄װc bcNn^}x.#Aa|OqGq q'q qg97qp1 qOiG$D"$F$3HHTH4HtȀ,Ȏȍ<ȋgQPPPPPUPPuP m/EtBW@_@ ` P phXLDLdLTLLx K ˱+ p0FHH4HtH ȈLȌ,ȊlȎȉ\ȍ<ȋg(B(PEQ Q%Q QeQPPUPP5PPuPP M-m<ڣ:N.n^~A!Qɘ9y˰k :`;v-;x(NN,>\%|k-O<8HHHȆȉ\ȋ(DaEiE%TFTG}4@#4F4E34G D+FE;<耎x/: zzcbcbcFb`,a<&`"&a bf`&fa6`.a>^B,2,j:l؁]x$N >\|oqw ~}x=! 0>'Gpp'ppgpps| K/k|{\7ng]pxObDAX Iɑ iِ9 y,!?PQ(8J$J4ʠ,ʡ<*"*2*:j&j6.>!1)Z%Z5ڠ-G{t .n莞>A!Q1񘀉Y9WK˰+k [o`'vM[؇>Ƨ88s8qp_MOqw ~opOĈ>cBSHHHHHȀLȆ\ȃxQ((xEPP%PPePPPPUPP5PPuPP M-m<ڣ:N.n^>~A!aQ1q I)iY9yx /,",,2, *ƫXX؀؄װc bcN›؍=؋oc?x|pq1>888838s \E\e|p_\5|=MwpWq_I躉 4 # $Cr@JBjA:d@&D^DJ ʡ<***&1Zڢ^DWD/ @ 0LJjk؂؆؁7&vc-؏w.#Aa|O)(8N$N4,<>pp_ Ʒ:~ -ϸ7{x?'xObDB1b!6 .)!1)9Z%Z5ڠ-yGN.胾AaQ1q ɘ阉٘X a)v1_ 7k{\7png]_~=<o !!1 )A2$G D*FE:GdD&dFdE6dGD.FųȇBD!s((((((򨀊ʨꨁڨhhhhhhhh/EtBgtAWtCw@OBoA_C @ ` P p(LdLTLtLl\XXUX x :`+a;v .؃x 6>>pU\÷:~p?;>! <Ĉ؈4#"# $Cr@JBjCzd@FdBfdAVdCv@NBnA^<|ȏ(@ABa<"(b((R(2(r( J*jZ:zhFh&hfhhVh6hvx^D'tFtE7tGD/FE?  0 (8L$LL4L ,< bc bcVbVUZzlFlk،ױ[ ۱o`'vM[؇]>G888N$N4,3|/pq %|op-#n&n'7{x?'xObDDX8xx I !9R %R! "#2"2# "#r"r#YC~D  9AQCq@yT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4Cs@KBE7tGD/FE pht,"\1"!!1 )A2$G D*FE:GdD&dFdE6dGD.FųȇBD!s((((((򨀊ʨڨzhhA؈Mx :`+a;v .؃x 6>8c88389E\Wq;\7pp?;O$Ftňxx O#!!1 )A2$G D*FCzdDfdCv@nE~D  9AQCq@IBiAYCyT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4Cs@KBkA[h":3zz?` ca8Fb`,a<&`"&a2`*a:f`&fa.a>%EXXXxk6ulVl؉]x6> 0>'p'ppgpps| _~ƈxx ɐP QeQQQ QUQ Q5Q QuQ M -m/3+z/`(a8F`$Fc bc"`:fcc^XXXX ،؎]x{o] 0>'Gpp'ppgpps| K/k|ouq7q ?6~/w}a|888s89\%\Ɨ W5U\÷:~ -ƯĈ~bBlA\C|$@B$AdD6@NB!E1G DiCTC]BWHBl~'8S8 W5U\÷:~p?;>!;ƸXx  R!52  " PQ%Q ePPQPM /3;z'z?bcb$&`b>,,Jj؀x c+vb`/縆o~m;xc|,A*dF6dGB^DJ ʡ jZ#: z`(a8F`$Fa4`,a<&`"&a2`*a:f`&fabcc bcVbVUZzlFlk،ױ[ ۱o`'vM>w>>!|#88S88_.27q?GMqw ~️x?'xObD?;1b!6 .)%WK˰+b bc6b^f-؊m؎x; ob7`/>x=!>!NN 3|/pq %|op-#n&n'ϸ7{x?'xObD?1b!6 .)888S838s89\%\Wq ;\7p ?6~]_~=< <19b#"ӈHDH$Hg ɑiYِy,! J,** >!1)9Z%Z5ڠ-yGt x]=}00C00#00c0000S00300s00 b1`c%Va5^:l&x[۰;vbn^}x{xC|8C8 >1 )Yy| /qW-?~m; 71ZX8xx O#>!1"#R"R# "#2"2# "#r"r#YC~D  9AQCq@IBiAYCyT@ETBeTAUTCu@-FE}4@#4A34G D+FE;񘀉ɘ阉٘UXW.>883pq7~=C'1 b$@b$AJCzdA^CFDyT@5TGC}4@C4E+F[GtD'tFw@/F  0 (8L$LL4L ,< bc bcVbVUZzl&llv؉7{omwSQqIiYy|.".2W*[|q?GMOp_I I !9R %R!5 -!=2 3#r"Y(|>1 )9g_.2|o-?71#b#"ӈHDH$Hg ɑ) i Y ّ9 y,!?PQ(8J$J4ʠ,ʡ<*"*2*:j&j6.>!1)9Z%Z5ڠ-yGt x]=}00C00#00c0000S00300s00 ^+XEX%XeX؍K/&nb̊Ȁ(TD%TA7@oL\*8Kq?7ßxcvlE|$D"$F$3HHHHHȀȄȊȅx(B(PEQ Q%Q QeQQQ QUQ Q5Q QuQ M-m<ڣ:tBgtAWtCwD/FE?@  0 8$LTLtLl\|,Kx`!a1`)a9V`%Va5^:l&x[۰;vbn^}x{xC|8SQqIiYy|.".2Wq-u[ qw~=C?#5>BěI" )IZd'IaRT'5HMR!HSҒ%Hwқ'#(2% 2, ",!K2 +*!k:l &l![6 ;.!{> !r!G1r ')r!g9r "D.+*F&En;.G!yD')yF%yMޒw=@>_Wh"Hn%H~R$%IYRT%I R' HC҈4&MHSҌ$Hk҆%H{ҁt$Hg҅t%Hw҃$2 #b,%r$j%zl$fl%v$n%~r$ar%qr$ir%y@.Lk:AyI^ yKޑH> J_$`H4x$&II !iI:d I&d!YI6 9I.!yI> I!R!EI1R %I)R!eI9RT I%RT!UI5R 5I-R!uI=Ҁ4$Hc҄4%Hs҂$Hk҆%IG҉t&]HW҇ I_"8ď&I;Ҟt I'ҙt!]I7ҝ =I/қ!}I?ҟ  2 !C02 #(2!c82L $2L!S42 l2%|,$b,%+j%zl$l#N&{>$ar#Ir'H.k:In;>y@')yF%yE^yO>O3BoII_C$ K“$"L$&Eґ$H2$ J$Ir$K)H ¤)J)IJҤ )KʑDMꐺOƤ iF%iEZ6iO:LnEz>dE&_SF$9EN3,9GΓr\$er\%ur$mr%}<$c<%s$k'G|'$IiR$IW2&cX2L&S,2%r;A~_$KW('HDD&HlI!IV%HRT"UI5R"IR#IҐ4"IҔ4#I Ғ"IҖ#Iґt%Hwҟ "#H2L&l2,&KR,'+J&kZ'Fl&[Vl';N&{^'Ar&GQr"gYr'H. JnyB7+E&aHX'HDD&QHTD'1HL&qH\E%.&O$ IJ$IIRt$H$K򓂤8)IʐrD**GiL9iEڒvAOdNFId E摅dYLdYNVdYM6Md3Bmd;Av=9Bc9EΐD:An[6C{>y@G1yBg9yA^W5yCޒw=@>O3Bo;A~_$`/B$ K‘$H"$ J$Ib$K7!EC?G$!ID$$)IF$%IER4$-H2,$+F$M)H "8)AJ2,)O*LNjMꐺOiLiNZiMڐiO:LNzMOdBadIƐd<@&d JdYEv3͎Lyd>Y@Ed1YBed9YAVUd5YC֒ud=@6Md3Bmd;Av]dK9NNS49KΑ LEn;.G!yDg5yCޒw=@>O3Bo;A~_$`9#Hh%HxD$HdD%Ht$Hl%^ě_"n!~ğ#I$"I$#I "I#Id"Id#I"I#IR"IR#I R"IR#IRT"IRT#I R"IR#IҐ4"IҔ4#I Ғ"IҖ#Iґt"Iҕt#Iғ"Iҗ#2 "2 #2"2#2L"2L# 2"2#,",# "#l"l#"#r"r# r"g9r "D.+NnM{>y@G1yBg9yA^W5yCޒw=@>/+F'EI &W(!aI8D$HdD%Ht$Hl%^ě_"n!~$O$IL$INR$IMҐ$IO2$L$Nr$M$O )L)NJ)Mʐ)O*LNjMꐺOiLiNZiMڐiO:LNzMOdLd8AFQd4Cƒqd<@&Id2BidIf9d.G擅d1YBV dN} 9L4@Kg3׼ċ?"iI:d I&d!YI6 9I.!yI> I!R!EI R"IUR"I#҄4%IҖ'HG҉t&]HWҍt'=HOҋ&}H_ҏ'@2 &CP2 '#H2&cX2'D2&s\2' B,&KR,'+J&kZ'Fl&[Vl';.!!r!G1r ')r!g9r "D.+*FO'yI^7-yG5? J$Ib$K7!EC?GD$1IJ$IMҒt$=@2$ J$Er<$?)@ B)NJ,D***FjZK%iEZ6-@:.+Fz^dHdEF1d,Bid:Af9dYF֐d3Mr$o&aH$"7!E$IC2$'EJIjڤKVdOdYLdYO6d9BN 9.dYNVdDd?9Hs<@.yD')yA^7-F~(4 C$qIHRT$ K()NJ FjiLiNZiMڐiO:LNzMOdBdCƒqd<@&Id2Bid:AfYd6Cyd>Y@Ed1YBed9YAVUd5YC֒ud=@6Md3Bmd;Av]d7C}d?9@C09B9Mΐ9Or\"ur#O3$k%{|$g|%w$H "ɸ&aHDD!Ht$qHr$MHK%6"7C<%_KAF!TP@ ~@a a0FHc` 0&dSaL0flsa>,ERX+`쇋? AR( 5.4ZA`2L0 `6̃ VZ{apa8GpNi8g\+pu7܆;p}x< x 53| ~O#0"C1!Ć8|\CH d,rBn PZAG` A0Pa$0`2L02XkalͰ6;`pnM|CH 1$ C H 5C 3d C 7䁼C(0P C ( 4PC2TP C 6ԁP@Ch M)4ZBh];HSā6G<2\p M!g_"Dh@RH #dlC!(š,TPA}h :Bg]a 0`2L0 `6́E2X`-pcTB>(4ZAkhm:Ag ݠAa( 0FS`*L0BX[`+lv. {`/p!8 G(pN)8 g,p.xB?B8 "DB41 &Ć?B*H i -2B& P @- u.ԃB#h M)4ZB+h m-:B' ]+tzB/ }/0  C`( 0F( c`,0&$ S`*L0f,sȧ {`/p!8 G(pN)8 g,"\p57&܂p=!<'3|   ~ BC 7x!ćAbHI!$RAjHi! 2AfY!drAny!P Aa(EPJAi(e P*AeUTPjAmuԇAchM4ZAkhm:Ag]tzAo ? 00#`$08`"L043`&̂0< `!,Ű2X+`%հ:X`#lͰ6;`'ݰ> p18'$p98p.% W*\pn- w.܃#x O)<^+x o->' _+|~/ H5! p"@D! Dhb@L!/~ >$CH 9 RCH =d 2C ;䀜 rC ?P C( Š8P JC( 4Ch ͠9 ZCh =t :C ݠ; zC ? 0 `80 F `,X `9 VX `=l 6 `;쀝 v `?p8 8p N8 < \kpn- w.܃#x O)<^kxo| > ; !R?BAha!"AdQ!DbAlq |nC< !$ĐB2H) %ԐB:H #d̐B69 'ܐB> PB1(%PCU*TPjB- uԇCh ͠9V@[htN@W='a a0Xa"L0t`6̅y0BX K`),VXalMVa'=80p 8 4pC\p . :܀p n ><x 9W7ǺH 7ă 2B!(šPjB- u.ԃBsh v:@W='B?` 00#`$08`"L043`&̂0< `!,Ű2X+`%հ:X`#lͰ6;`'ݰ> p18'$p98p.% W*\pn- w.܃#x O)<^+x o->' _+|~/ H! p"@D! Dhb@L!/~!$DB2H) %ԐB:H dr@N!| @A(bPJ@I( rP*@E TjPj@MԅzP@Ch 4fZ@Kh v:@G tnz@O~@a a0FHa q0&Da Li0fLa̅y0BXa ,eVJXa u6Fa lmvNa}A8cpNI8 sp\KpU܄[p] .pA|H !$$ArH)!4Az!d,Av9!<A~("PAq(%2PAyT*PAu5Ԇ:PA}h 4&Ash-6A{t.Aw=>Aa !0p`40`2L0 `6́0X`1, X `5a lmvNa}A8cpNI8 sp\p57&܂p=!<3x/7{|/w?B?Z0Ax!D(At1!Ć8|\?ăB"H I )$RAH !+d @^4ԇ0V>8 <)<>CB<CH!+dB(š TP jC]h ͡C3t C 70PaQ0XaLI0TāY0\a,ERXaUZX`3l  a}a8GpNi8 < \pn- w.܃cxO< [x|OW_PB8 "D( C I܅{pCx G |o~O?BAha!"AdQ!DbAlq |nC< !$$CJH i L@V9 '䆼C(P JC( ' _+|~/`DG( a ,"C :Ą8|!$D@RH)!C dlrB. y /P Ba(EP JC("T*PAu5Ԇ:PA}h 4&A h 5C3t C 7`0 0  `40`2L0 `6́0X`1, X k`-6&[a;]^p N8 p. w܇Kx o=| ! BC H)!d̐B~(Š$ P*AeUԃB h m:Ag]tzAo}0`c`,0 &TāY0X`1,eV*X k`=l 6 `;쀝 ^Cp 8 \+p ܅{p#x O)<^+x o->' _+|!~+!-d̐C(0P C ( 4PC2TP C 6ԁPC#h M)4ZAkhm. C`V:̐@a(Š%~$/Y#! "IB R/GdG&d&E'yMސyO>O+F'EI KV_I$!^ě_"n!~ğ#I$"I&iHZ'I IRT"IRT#I R"uH]Ґ4"\,"~r$ar#%r\'oC|$Hj'%HIR' ۿ+ _GKd_bIN%y@'_Z(ڄ]ڇsz+(*)*)+*)F)F+(*)+&(&`rdM.;%o):%7):%7)^:?p?Gp?uW5n:pˁqxK^9ځO|uO~;?B9ځ8u@;ā$s iH@:;сLdv (@A6;Łt8Q9p܁tpW5;pÁrxk8ց|p~;ցpw @T9ǁx;@"R8ʁq @&2;Łds (@Q9P܁t(@Y;PсTs@}9؁&4uh@:сNts='84ءQMphC,f;4ǡ-qhCZ :ޡmrhC;ia[8kᜅ,\p W-\p- -ܱp -9p؁#u'8:pށ.8pсrOx;;|r_wr a@db8~;ρ$p IH@2;r iH@:28сLdv Y@r:ˁq (@!9P܁s@U9P݁rh@C8ځ6u@G:9فp;0́t`d80Ձe,w`f8Ձmt'8i8pցswUn:pہsxs^:ʁqG>9ف|s?@'^h8ށDu @Lb9ہx9퀏;ρ$r IH@rR:ʁdp Y@vr8Ӂ\v y@! ;Pҁu-5RKM-5R+K-R;K-uR'K],uROK,R_K- 4 KC, 4K#-4XK,4$K-M44K-Ͱ4lK-Kk-FK,mVK,m.K-~K,taKG,t K,Xb麥nZm鑥'Yzm靥>Zd鳥/Zn釥~Y d)o;2vBY m)"Zd)hbXi)ؖXcג˒ےǒ%K,ŷRBK,%RRK,%BUdEQ@DaQDDqQREQNT5E#D4-E+VtDwCDoGD1P CP1LM0A7v|7o|ȷjL!ߢ0G !v Z HSwA!|rȍ srM jIqJ  GqQ\qWX%H~R$HaR%HqR$HiR%HyRT$HeRT%HuR$HmR% HCҘ4!MI3Ҋ&mH[Ҟt Igҕt#Iғ"}H_ҟ '#H2&c82L$d2L%3L2','+J&k:l 6$n#r"r# r&gYr\$er 7-r!}<$3%{|$g|%w$!aI8D I$$ďx$ILd$9IIr)H ")NJ)Mʐ)O*LMꐺiD&)iFV5iCړ#LOdLdNFQd4Cƒd FdYHdYNVdYM֐d#Ld/G 9D#(9F$9EN3,9G.K2JMyN^L' $A$K"I#ID"ID#I "Ix_"n!~$>ID$$)IF $L$Ir<$/Gʐr"LIꐺOiLiNZ5iCڑLC~?Hd,GƓyd!YD%dBdM9O!yD')yF^7-D$K"$*M␸$IJ )AJIjڤK@~?HdMƐdO&dLdAfd>Y@ed9YIV5d-YG֓dLdNvdK9H9J9Eΐ$\ %r\!w$k|"|#"] K‘$K$!ID$5ICҒt$=L$Ir$K8)AJR,)GjiH֤ iKڑH?D!d(Fd$EF1d,G&dIf9d.GEd1YBed9YM֐ d#Dd'Ev=d/G 9D#(9F$9EN9O5r$m| ɧ'H "Ixd!YI6 9I.!yI>$HaR%HqR$HiRT"IRT'H}Ҍ -I+Қ!mI;Ҟt%Hwҋ&}H_ҏ'@2 &CP2"2#2L&ST2!b"#Fl![!r$E&o[| _W|'?/L~%+P$4 C’p$I@D$1IBd$9IAR$ IKґ$H2$ J$Ir)L "LIꐺOiLiNڐiO:BEz>/OdLdCƒqdO3Bo;A~_$K> M’p$<@"H$AbX$6C/K\ďt$=@2L$3Bl$)IJҤ L&G!iDf9iIZ֤ iGړ#DIzޤ/Gd$CƒdGdJd9F$9EN3,@.K2BEn;yLH>N~%_Hh#Id 1I\E%$O$IL$INR$IMҐ $#D2l$;Ar\$7C|$?)@ B0)BʐNjMz>i@Ƥ iJiCڒv=@:^?@1d<@&d&E搹dOdYLdYNV59IN9Or\"r\# r"!g|%w$H &&aHX$HlE%.$$iIFd!H"IR#IERT&UHUR -I+Қ!Hoҗ#2 #2"2#D&kZl$v$!I@.*OyLg9yAޑ/+F'E!aIx7?O$IMҐ$IO2$+Fr$7K)L)NJ)MʐH*iHƤ iJ iG:ΤNFd KƑ d2IfdKdYH%d)YFd%YK֑dLd7C}d?9@C09B,9GΓNn[6G')yF^yCޒwLo;A~_$`I#I$%^ě_#HFd'9I'HaR'%HIR&eHYRT MH Ғ"IҖ'HG҉t&]HWҍt'=HOҏ  2&2L'3,2%|,& "#l"l#;^'!r%qr$ir%H@.K2Bk:An[.y@ yJyMސw=@>OI~@L~%B$ K‘$ FbXě$&IHR$')HJ!iI:d'I IR$HUR$HmR#MHSҌ4'-HKҊ&mH[Ҏ'Hw҃$H_2 "C2"x2L$d2L%t2#,!K2 +*!l"n#r#'Ir%H@M')yF/+N~`/y EB$2J$Ib$K|/G$ Bl$;A B)IJҤ )Kʑ"D**OiLiKڑN3Bn;E d&EfydYHd YJdYIVd YK֑dH6d Nv9CΒs< er\# r&w /+$H "_GB$ G“$*FċxK?I@D$1IBd$9IARL$3Bl$;Ar$)Fʐr<@*J JIjڤOiL5iGړ#D:.+NzMFFd;AvdK9H9J!yD')yFyCޒw=@>O3Bo;A~_$`/ EB0$, G“$"D"($*F$&Eb8$."ć$ID$ IKґ$H$;Ar$K)H ¤8)AJR4)Cʒr<@*J*NjG꓆iLiNZ5iGړ JOdLdNFdMƐdOdYBed9Bmd;Ev9Lc89ANS49Kk&M>yDgyI^7<!aI8D!IL&qH\M|Hj%I$Hn%H~R$HiR%HyRT$HeRT%HuR$HmR%H}Ҁ4"IҚ!mI;Ҟt Iҕt#Iғ"Iҗ#2 "D2L&S 2!s<2, r"Fl%v$r$r#I@.K2B>@4 O"($*Fb$M␸ċ$ Ir"Hn%IAR!EI1R$HiR%HyRT$HeRT%HuR$HmR%I Ғ"IҖ#Iґt"]HWҍ$Ho҇%H2 $`2 'd2L%t2$l2#,",# !kfl%v"#r# r!IDG1yBgyI^7-yO> "_'&aHX'HDD&QHT ^ćO$IFҒ $#D,)Gʓ "D***FjڤK!iD&9iAڑH:Τ M~?D!d(F1d,G&dNfd YFd%YEV5dD6-d+F$9EΐN'yMސyO>3N~_$`aH %Hd'9HN&yI>R#I RT$I5R 5I-R!uIҐ4&-H[Ҏ'HG҉t&Hw҃$Ho҇%H2 $P2 #(2!c82L $2L!S42$l2, ",! "#&r& r"g9r\"Ur$mr%}<$c<%g|%H &p$ F$&K7!OD$1IIR$ IKґ$B )D "()EJ2ė$&II d&YHVd'9HN&yH^ IR$HiR'HERT&UHUR#Ic҄%HG҉ !C02!c82L \2' ",!K2 +*!k:l ;N#r#'ir\"Ur 7-r!w=r< #<#/K&o'|!_ɷ^&aHE\ď' H6,!K{%+y^J]J-7uȻ:"Gp)< ?""""""""?B:H @^%HqR$HiR#UI5R$!4&Aw }? 00#`L0 43ă90"X+`%հ:X`#lͰ> pq8 \p .<'sx/G| ~&4CD Q Ā\! $4C!+\(((((hZvaa&a[I78p N8 <W6yn᥅7Zxgὅ>Zd᳅/Zd!o-Bx ,DBL ,ıׂo >YHb!dXHg! 2Zd!,YnX(kJ*[f[h`F[haVZ[hcv[`N:[bn[a^YoaYla[oaI&[bai[aaYf[cay[XjaVXXiaYjavXea=ZgaZ8dᰅ#Z8nἅnYmᎅYxlቅYxeᵅ7>Yb᫅o[]h a,BD ,DB4 -İB, -ıׂo >|-,-$BR ,$BZ ,BF ,dBv 9-PBA ,PBq %,PBi e,PBy ,TPB] ,4Bs -,B{ ]-tBO ,B? C, 0 #-0X ,L0d S-L0, -̱0< -," -,J ,Z ,lf [,lv ;,촰n {,쵰~ ,pQ ,pI ,pY ,`ႅ.Yb᪅k[aᦅ[n[x`ቅ^Zxeᵅ>Xjᛅ~X4Y( -İӂ_ . n ~YHa!4ZHg! rYk"Z(fJZ(e2Z(g *ZljZeZhi:Yna!ZfaFZea1&Xgau[`aMXjavYmaYoᘅNZ8eᴅ3.Xb᪅k[aᦅ[ZgᾅYxjᙅ^Zxkᝅ>XhᓅXjᛅ~}b!bXc!/ |--x,YB| ,$BR i-B -䰐B. -PBA ,PB1 -PB) e-PB -TPBU ,TPB- -ԱPB= -4Bs --Bg -B? , 0p #-0 c-0 -L0| -,^ -p '-pB .YlᮅZxd᱅g^Zxeᵅ7ZxgᣅYnᇅ ~} g!bZkecςx[Hh!$ZHf!tXj!r[(`X(nRY(oJ*[bj[azƊ&V֊6vNΊ.n^ފ>-m݊Ccӊs K{G'gW׊Oo_@E"X? Rx+| ­( )iYY99yyE%eeU55uu MM--mm]=}}C#cc  K+k[;{WOO//oo??QQ1qq^ £WSW$P$T$R$V$Q$U$S$WPTVUSdRdQdUdSSWPRUWPTRQUSWTPTTTRTVTQTUTSTWPTRVQUSW4P4T4S4WPTVUWtPtTtRtQtURV V UVULVTRVQS,P,T,R,U,STRVQUSlPlTlRlVUSPTRVQSWPW\P\R\V\Q\S\WPTRVQWE~EEAE!EaEEQE1EqE EIE)EiEEEE%E-EmEEcE3EKE+EkEE[E;E{EEGE'EgEEWEo pH(X84t L,l\|B*jV6vN~!a9yE%B)(*b+(* ­(T4t􊌊L̊,l\܊|BŠ"bRҊ2r Jʊ*jZڊ:&f6Ί.n^ފ>~A!aъ1 IɊ)i銙ي9yEu ݊}CÊc3Kˊ[ۊ;{GNJg׊׷)B)B+(*"*")"+(+b(b+(* OᯈHHHHHHHHHHHHȨȮȡȩȥȭȣȫȧȯ((((((((((((((hhhhXXXXXXXتئة88P\P\Q\WPTRVQEEAE!EaEEQE1EqE EiEEUE5EuE E-EmE]E=E}ECE#E3EsE EKE+EE[EOEE_pH(,\<|B"b*jz~A!aQ1q I)iY9yE"JZFNAIYEUM]CSKUnGWSW$P$Q$UTRVUSWdPdTdQdUdSdWPTVQUSWUTPTTS4P4T4R4U4SPTQUtWT P T R VPRSLTLRVQUSW,P,V,U,S,WPTRVlTlRlVlQlUlSPTRVSWPTSWPTRVQS(.(.*.)((*)+(*)+(*)+^(^*^)^+(*)+>(>*>)>+(~_r_Q11q> __@PHXDTL\BZVNAWOQ@QPQHQXQTQLQJQZ@XDTVAQYEUM]1L1\1R1N1^1A1Q1I1Y1C1S1K1[1G1W1OXL\BJZFVN^AQIYEUM]CSK[GWO_qPqHqXqDqTqLq\qBqRqJqZqFqVqNq^xxxxxxxxxxxxxT)/_aaQ11qq^ oW!hܟro}XDM(7d`qQBr?ʽXFDyQATDeQETDuQCDmQGD}!f`CHȝ(weܑDsBDkFMNrKIȽ(a܃rʽCDoGD1@ `1D rr1V(w^ur(wZ1ULӅir(wWTrC BH D,r;ʭ(QBrʭ(M2r](wHrg](wD r'](w@~{x@{(o(]oNʻ(P;ʻ(HU!oG6[xGȮ(X 3X <%l"!$`2X ],{0XvY`(XX`aÂe ,9K.Kd,#X>X~` ^)76X~`w 2X6X~`evevev    ["Xf(X~``{ Y \A~(RP@9 ԂPB#h M)4 A]tzAoa a0x`*L0"X Ka,ZXalv^0p }x)<{3|!  "CT1AH!)$ @ZH 3d rC>(E(PJAi( $ar% r"r#I@.K*F&M{>y@'@>O3Bo;A~`/9 EB0$<@"$M/M|/q7?O$IH$ IIR$@2L$;Er )IJҤ)O*J Iꐆ)iFZiMڐ'Ez>/Gd Dad8A&Id2Bid:AfdKdYHdYNV5d-YG֓ dBmdK9L9AΒsLk^w>g ?#@$ Q 6C/C\M<ď$IL$INR$IM2$L$Nr$M$O )L)NJҤ)O*LIjڤKiH&)iNZ֤ iKړdHdNFdMƐqd 2(lPĠA1% T0jPӠAz 47hiʠA{ :t6bՠAw  7a0`h1c L4n0`l9s 7X`` V2Xm`6} 28lpIS 58gpe+ n4mpc'O 0xi |0hAAAA(a 3o A$Q xx6hɠA!"E 7(aPʠA{ :t1fנA  6b0`d f4m0`b+ V6l`n= 18jps .\1fpm <1xj  ^1xk >|7ehd;d7d A?T d0h A.y 0(hPؠAIRe 7jP͠A - 7`ѠAWn# F2m0` &L1j0`| ,5Xf`JU l0h`.{ 3opa#G 78api .\5cp/ ^2xm; >|2l/@ Eo Ado A| $6Hf Aj4 2d4n A.r 6hkΠA'] t7f0`HQ 5g0`  V2h`n={ 78`pQc N7`pMo 7`g/_ 0ihdl;dg A D6b At b17g A"$I $7Ha A d0h AVy 2(lPĠA) 42hlĠAs 5hgѠAg.] 0iˠA  6b0`$Y 7Xj`v; v18`pIS .\2lpu7 n5gs7 >|4dw? ~,R(a "D1j A  b1kemk63o Ab$I $7Ha Aj4i 7h A r1k AAE J1(gPѠA 0iPˠAf Z4hmƠA; :6cנA F6c0`DS L3a0`+ Vl5f`~#G 78apy 7 7x`c 0xiC B1k A D5n Al8q | I 0Hi A 2d6b Ay 3(`PРA1r *6cPנA} 41hj̠AKV [`H`DF`TF`lƅ`|&`b&`Zf`Vf`^`A`i`EV`UV`M6`K`Gv`O`Ht΄l·B.rznN~aqi^e^Mކc>s{~g~ 0A!!!!!h!x'!pOBx!!H!H!H!H!!!!!Q!1!!!!!!!!XE!Xe!X!m88*nՋEQQL.ZB2TP CMu.ԇAh ͠9V@[ht.A 70Xa"L0La,%rX+a5zal ^G(p N8 p.U7&܂cxOW?'?BAh 8 79 |?BAha!Db@, q |@H !t2@FY!d rC>"PAq(%2PAU*TPChV@[htN@W='a0FHa 0< `1,: [`+l^ pN)8!.5 w܇ +x=|O7GA( Dh?ćArH)!CV9 'PJC( TJP@U5Ԇ:PA+hm:Ag];~` `Q0$ `.,%VjX`=lmvn#pq8,Kp ܃cx/ |OW?'@`GA(!DH b@Lq \CH !T@ZH d,Avy0P JB)( eTJPj@MԅzP@#h M)@' ݠ>A`( 0FdSa:̀Y0"X K`), VZXa#lͰ v. { p N8 \+p=W[x |@GP@X 6x7 <@RH)! 2C!'| Aa(Š8PAy2ԀCSh-:B' ]/0P `40a.̇rX` u80cpN8 p.ex O  ~;p"@D!D 1$42@F ;\@> PB( TP@#h ͡nzC a !0pc` 0&d`6,EւPlycm[޿Ŗm[޿rCp12K彋-7xl[(Plyb˷s6yb?đǑƑ;3NRQQQUQQQuQ BRJZFVN^AM!qdLǴǜǼ,Ǣ,NJlRUTQSWPTRVQU\V\Q\U\S\WPVQ #~w!7dܟBƸr'ƕ0n["- '[Kn;/Ǽ)b8"K-/|K]~_EPȝX$IE2\iU^r+y}%7A^rxerxD^Orx%7WU!WM!W=!^{ɻ%ﳗ|o{%WGU[%o^1N7!^x=%{K|z}%K*ZȞ%{K)/K^dx%KfKf밐9yyYN{I^Q/餗tK:%NyI~ /oBcK%xIw'^/鉗KzEDr{Kowl!].xK o遷t[:-̽%so[%ooN#${o[hoo逷t[:-s(,$o߻(!ʉ򢢐x]-]ѻ>xKn*Z 鄷t[4o"^xK/ry =ZH'f{x-xKޒd-{[-{KNxt[:_Hޒ-zKޒd-zK޲ eo[%ko[2-{[o ޒ-9#3#i>d#YLH>#3###H>2>dBH>#H>d#H>d#ȷ̷̷d#4>2>|H>#3SMw̺d#H>̼>2>2>dL4->d#H> >|${Gr}GnVb$dWȮ*FQBnSB B#wtGvL1K#G|S>)|dH|C>[$>%钏tG##>G|O>DŽy}d#oGz#' >tGtG#]WzF;+]+;WvWz+=nJ־+J2̮|+ʬJ̫o%QYT+Jƾ2Ǿ+9Jξ2˾d+YJ־+J+J̸̸̵+J̶++Jn+}+Jf+9[+o_y|]+YʞW||%_W+~|e}e+WWvr_w_WWy }e~%7%3<]]]]]KvKuɎwɎwNpNpI...̿K%wɼd..Kf%$n̶KfURH\t%]pI\t%]KvI..%$SdL]2.S̩K%dN]K2vI.t7kuI.%9$g쒜]Krvl$g̦Kf%]K2wI.%Y$k}.Y풼]KvI.G.%l]Kf%3t  .......%ٻdϻ$]KwI.%$-s}-yv$ n[:λet-pywK2ny%ݲݲݲt-]pwww~pwK?eWeOeO pK7st-p˞p˞p^w̻nnnnny}-}pKܒ[rwKn-ݲݒ[[-ٻ%{|n-%ݒ[f-pKet-]pKnܲݲݲݲܲݲݲݲ#Bv[v[:Cn[:4----;-r˞pˎpK)t-rK)t-w[z>;n[n##].H<#}H<###;#}^^H/< t#}H<t#H<ᑻ#{#{SZHy/<#< y <x-;>xH'<x ȮȮHO<{d_xd_xx=Hw<t###ȾHo<GxH<^xHG<t#H7< t#H7< #H'<{G:NxFȍnxG:NxG.xG=_< +G)yS<#={⑮xdy/Gz~xdxdI~d'I~I~2~2~$?~d'I.~'I&~d''~'w~{o'Oc?M?M?M?M?M?K?dOOfO~W?]wOO~C? yOO~??wO^?7O~?}dd7's~+~dddwOv`enyM]////_v̕geeee˷̔̔̔/;_f_f_f_f_f_f_/;_rw_a_1_1_r%gy}{__rw_r..Ke& 2eeee]w_//}YYKG(6+()()+(+NZ:oB.ZFnVnnZzL[zi镥ז?2Z>(]Jww)H"HtwI.CnPT {My|}kU#{ģ=G(G`=ၯ#= ăPy0ރi`<y؃ ҃u`=Vy݃`=^zpȃ<8 Nzp6r7tku!,m!o,"oʬID2"9HI"R> d@? P @(?D=!јhB4%'~$~"z}~gb1J 'F>?H?`<&z0ك)L`3<,xȃe,`k= ƒ l`[=Nv{σ<8nxp˃;=xs^.[B>Sxԃd3x΃ d Y=ANryۃ<=ƒ/=AE*yPك*Ter@9R(GS9rA\R~WPn);]PyR>Q>U)IJ2%JIS+J&s%]ɡTr)Q>U)dJr%JI|Q+LJf%UɦdWr(9|J~RH)Q*ŔJIRZ)U)/ JE@i4R(͔J VtQ*+= e2\((#QJ+c8e2CV(sy|ePY,V(KereRYU• FeE٪lS+;.eG٫S+ar\9TN)39rA\R.+W5wrCCRn+w}HyR>V*(*J%LIPR+)iJ:%AɨdR>W2+YJ6%CɩRr+yJ>%R@)R +EJ1RB)RJ+eJ9RATR*+UJ5RCU)J JiQRQ+J'EtSz(+?(?*?)>J?2@P(%P R%TLT(S,e2G,P**ereRYQ*:eA٨lR6+[eOٯP*irI\U+7?;]@yR>V*ɕJ&%R@)R +EbJqRR)U*(JJeRSV)JKZi||U)(JGYtUz(+=Pe2\((J*ahe2VW( _e\YTV)VrZ9\P.*rM]Pn*;]r_y̐B69 'ܐB>"PAq(%2PAy P*AeUTPBchM4:CW  ! a 0M w.܃#x O)<^+xp RgAzCfY!dA~( E(PJB)5Ԇ:BchM4ZAk :B' ]+to'G zC ܆?@\!T Aa(5.ԃBchM 0<{a?pN8 <\:76܅cxOS"ąxB2H)  t2@v 7䁼C(0P C ( e/ԄZP@h `_0 !a:̀0 f\a,V*X k z`쁽\p ;)B< )dܐA~(0PJB)( &ԂPB+h }/0_UBD~803py\+;\W[w)CH@e-L0f6JTB:s y /BP jP>#aBCBL043`&̂0X  Ѱ 6 `;쀝 v8S RP@3h--t0 `8? ` ̀0X `9 VX Q `=l 6 `;쀝 v > pq8' pn O)<[x #')$ĐB2H) %Cs Y /BPJAi( *@E TPjAm !4B3h-%-NB7 ~! fLXK!"  z #pq8' p.e7܅{p#x O)<^+x o- ;)| SH! $dRBH dLBv!/P B!( E(PJB)( ĐBj @:H9 'BP@Q(šRP@Y(TJP@MuԇCh ͠9:B?@`Ca ? 08`̃_a, X `5 Q `=l 6 `;pq8 sp.E \kpn- w.܃'s"ć| AH 9 RgAz!|9 7䁼 A ( 4P%TP *C ՠ:ԀP jC >44;I_wӤXLŔXLŴXLŌX̊X̏łXEX%XeXXUXED,"c>b1[b-c#;c;{b7b_,`,X,\,.J,Z,~;xD<%^7⭭:;B,7Pg:Yrt{:˝Ynrtۥ-MYrt{*~@9> "O1rtZgm:]Ynrt[-k@M.ԃCh ͠9 -z@/ ``0 ~0!!B! F8`"L0 fLa̅y0BRX˕RY5V %RV) NeWM٧W(CarR9V*rI\Q*ה[mrWW(GcTyJ__Y QF(>He(ahe2VW&(Ide2UPf+ser@9S+')rF9S+%rE\S~W+;]@yT^+oʟ_;_tU)JB%XI$S+Y>|:r A;`V:`9`;8ࠃC;8N9898ppmwup}9 $tO$rA2)wA&qA>pPA!qPAq%qPA9TrPA= r;ࠣ9[9{=G?9~v0/9`a;`i;`Yf;`8XWK,urQs[ls{spigwpE\vpS/ro:x]ϸ9 | R;AisAdr8 |;(ࠐ8(ꠘJ;(㠜tPA%qPA=M4uA tpA]tw^~pA_w𳃁9`8`8`8XW,qr+tjQw[ls^9`;888k~wp sOsAYduAvqPATrPAtPAmu4tAcM4uAKuAGtvAW|렇tz;㠿:  q00pAF9` &;`8`8XWtjkD;X`9`:8ః#:8~wp 88x^:xൃ O$qAr)tAisAdr8  8(蠐8(ꠘ8(렜tPAETqPA54tAcM4uAsq𵃶9A{ttAg]tA tA:t!0|8 4p.57 6܁p?>2$4|bHbHj̐ΐِՐ͐ݐӐPPPPPPPPPKCCECeCCUC5CuC CMCmCC]C=C}CCCC#CCSC CKCkCWN.^ } }   C >_X$l\BïEņ%5pC!mXgXo`naimkͰϰpppppppppppppppppp-m]=}C#S3s K+k[ß 51537|dؐSCRC*CCZC:CFC&熬܆<|B†"b҆2r/ _*jj:5|gaGC?Cφ!_0l1 c  S s + k k Caaaaaaaaaa7~AaU5? 7 O O / o o 23 ckȐАȐĐʐƐՐ͐ːېǐאPPPPPPPPPKC%CeCUCuCCC#CcCCSC3CsC CW m ::::30|oie'CoCC_C?C|b?FQ1000000װaaaaaaaaaaa!a67l0l4l2l6l1l5l3l7042615304615370261537\0\4\2\6\1\3261<0<4<2<6615i縆O I I ) ) i i    J**jjjjZZ17t4t2t6t742`mck`h000j3657L4L2L6L30421jXlXcXk7D" Qh:FV6vN.nQ1q I)Y9yEeU5-]CS3k[߆ q rrr   JJ***jZZ17t4t5t3t7|k'CoCC?Cφ!aH(C!b5F&fff~5,2,60615" (Caaaaaaaawu[;׆7? /qbCQ ǐ$1$!y bHg1d!O ycC P0B1Tr UbCjjjjZZZZ2|m'CC_C?Cφ_ C # >_!dckgolnakXhXbXjXfXiXkXo`dlnae8h8j8f8n8a8i8e8m8c8glbfnapppÿנ8 RR>31537d0d4d2|nlbfniego(`(d(f(i(e(k(o𥡢k7NΆ.no ?z~6 2 6 1&&ffffV HC!ڰհݰ۰ǰO_8Ć$dTԆt̆,l<|B†"Rr Jʆ*Zچ:Ff6vo   ] ] z7 70FF CaaaaaaaaaaaW"bR2r JCaaaaaaaaaw ۆ;{dž'7א8x RR>3537d0d426153704261703T4T2T6T104261534446414543472|cho`hlbjfn𝡷aa`e4B 񆉆Ɇ)i9y_ K + k (CaaaaaaaO_q >1|jHdHlHbHfHnHaHmHcHkHgHo`hbnaiek(j(f(n(a(i(c(k(g(o𥡂kC[C;7N ?z~6blb1 h8$dT4t L,l\<ïEՆHfV6vn^o}CÆ#csKkGdž'gW׆7? 6cߐ!!!3CZC:CCF̆,\܆| Q(L%ʼnDI4QHT"(C!0&(Ide2FȽ:"NMt r{nP1L #mmH!c`#BEk!;Bm|Fߕg4#6!=F BX,KJJ0bX+EaDX/6Fȝ0b]>Bvم#d8%dg5BvA#~7-q[PȮ!e;F^!32Gȼ!G梏AyG>} y;lY#sG>2|#GfO&!G扏 ^)"||||W|n}F}* I.]SSȻ˧h"Z y7|%#u#u#u#u#uw#| y'ȻG2}$s'DH>d#5#yH>Ro>rH>ܬ>rH>d#ȝ#w#YH>#yȝ#wq>Z>r[-#7I!rH>EqEH>>rSH>d#YH>/d#Gl}dȾ+J W<}%O_W2 }%C_W2+9fy+yL}%;RB暯}=+w_g2|%W_W<}%K_W拯[O~m(fBɾ-DK!YJ־m+oc_ܷ}%w_WwC}{ y{['!uGWjWWf_ 2|+sW悯/_ _Y2 |6|eJ-J-J-J-J JJJ J JJJJRR ;RRr;ʭ+wd+J羗+J澒!}{_HrJ-JJJ~~~'IoIoIII IOIOIOI~d';Ovk????g?g?c?OOO2#$[?֯h*$[?O$??OOf$/?OO$+?O2>'YIV~~k?a?a?~d''}'YɌLHV~2$/?a?o>$G?yI~$O?aB,$K?O^^L$W?g?Ofd'I~'yI~j?emef˭/ܢd/Kd\Hd/KKKKd/w/wd/d/s_涿/KKKoKoKd/K/K/KmE;h/eKOKMKK=K=,?XȎ~/dK=KKK2oe_K /ҿ2e_˾^Z]//s___溿o2eK}KKmK]K=K=K=K=KKKK=K-K-KZ/o92}/u/u 5 5 5 5 5  u ?@$9@r#$9@z;@vu YȌd<$;@<@^ <@ry :@j @j @j @j @j @x Hy s<@@́}d Y w ;<@vx̀2dȼ9 ,Y HrKL  3!@f@̀?@r9 wY 9Hq{d 3;@ud Hk} = Hk } }^|$7@   oI!HS2+YJ6%CɩR&FJ=,C (  TjPj@jAm bhC:1N1t[ ] +b)>1ap Cbð0"cad b!415L4L304̃~U)JD  [ [ ; ; { NNNN..~7\70aiemcox`xbxjxaxcxk_kTC\C315d2|njfg(b(m(c(k(goh`hdhlhbhjhfhnhahihe[aa!lko`hfkoX`XhհȰذ԰̰ܰ°Ұʰڰưn0D цu M͆-]݆=Æ#Sӆ3s Kˆ+k;{'W? 6>6|bԐȐؐ SJEF!7RDArf1rʝ(wI`yRTE%QYTUE5Q]5EmQG2r6r}(HmWBn@e> d7.!zď+@$ ٭Bd`=&F1Bv`8!{/P\)b}8]?P@2e^|y(7Pm@2eʌ (BƁ2eVl Y(@y2eʜ <&d, ((}(@yo*PNwKGiB2Ra @yJI}%RCAr%E RrIIR+AR+A9DN[AEOJJH@@@܋Ar=ZHAyPG!ZfArO}'$B "$ $ ?/d$yIAc4ILg$yIAg4KHAsOd,{)Xr \3,Bz8Xr %$B_C&BWCWC&B&Bdl~ ~ z) !2Cj !R!!2CdHMHMHMHMH_H_"u"";DM!!R!R!R!R!R!R!R!R!R!2C"2LHH!!R!R!"""T?T?,äd/Iaayd&&&Ia2$0aud&YIIIaaarÅ$00¤$0?L2|ä$00a1'b! Bca| R'a/&Y&s"L%L0a2¤^¤&¶R aRadNI=|vB9RN+g9rA\R.+W5Ej5r#?bín0G1'HHԱHK#2"K,"{,r"O,Ƣ`, Ţp,ǢB,*ƢR,Ģz,jƢV,jǢn,Ǣa,Ţi,Ţy,ZŢm,Xtwb;}b7c1 ?b`,bx,|bX"4c16b19c1#sc1/ c(bY9PN)s-hFM7Zr{mYF˛e}!hF]6Znn-7Bnro7Bެ2Z.c:Fn1BbHI!$RAj @ZHs Y +d A~(bPJBi( <|_B2TPCh14 C h 5kh h#tB~/0aCQa0&$`:̂0X"X K`),V*HXalvn{7pNi8g\.܃Sx?c@80p N)8 g,ppnm!< x o/xqq >|!9|s9 | @A(bPB9(ՠ:ԄPBkh_7:B' ]+t-|'} !0 !B! F `P C (e/"ԀP jC]4FB+h _A{ tnz~7~0pQA !a q0X+`% `=l 6;a7Cp9W.܃#x O<w&āCCJH AH #d!+drC ?BPAq(%/KTP j@M !4Ash-6|  AzB`043ă90|X+` 6 `=p 8 \k;܀WŸĸ RB* @: '|PC( T*PCM u.ԃB#h M4ZCh@{ tnzC_0 B `40`2̄+,Ű X `5Q `=l ~88Spy\܄p=)<^kx;Ϥǐ>ĐBrH)!2r@N ybPJ@)(e/4CSh͡kh 3tG z@`Ca8/?H 10& `:̀0 <x 9Wgr\ǐCH 9d,Av9!P B!( E(P@ ՠԆ:PA}h V5tz#a C`(  ~0 ! F `L)0t3ã+, X k`-DBDF{cpNi8g p. u7܆;p#x/%Ÿ3H!Ԑ2@FCf( E(PJB)( e,PC ͡V:Ag[zz~ 0 `DCF2C !<A( š$rP P*C56ԁPC#h-%6AwzP> ~#aB0Bq0&t `̅~E2X`5Q `3l v ~8 Gp N8 <\p-!<'^x _ϴAzs !|P Ba(%rP*C5&ԆZ@Kh m+h+t-|='?Bo? _` 0 _0 B`40`2LY0|X a1, `l]oA83p.E7&܂p=x3=$c>D@rH)!t2@F Y \A!( ET*P CM ~  !&Da Li0f, s`.̃"X K`%56fapa8G8p98"\p- w><sxof|& S3fH/͐9Cv 33r "JQR\)TJ)2J9RATQ*ՔJ RKQ*J#Di4S+-JkVFtQ*ݔʷJ/GO Q*%P QF+cqe2ILQ*ӕ*eS+&eC٥V(#Qr\9T(gKerSLyy> P }@(>P~ JP|@?P@hM?ZC?`}@QA0VW&)Site2SV(sy|eDY,S++Uje-CDBD:X`#lͰ6;`'ݰo80p 8 4p2\p ~pn- w.܃cxO<^kxoO  3+ąxG1$OSH! $dR@JH3Hi! 2r@N yPJAi(e<| "TPjA}h 4Z@Khkh0 |!F( 03`5"! alM6;`'=pNi8g\k܄[pCx9WŸgvH AbHI!$B:H #d̐Av(šPPC]4ZWA{=  C`(CCB0flXa ,eVJXa pHhXa3l NGp98\+ppnpnm ><xW[9 >$cHRBH =d >@(0P Ci( T*PAu5Ԇ:PAh ͠|?>A  C`( 0|!FD `,_a,%rX`=l 6 `;ݰop.?s@\!|'CH)! t2@FCfY!dB> PB1(%$JPAu6ԁPCh14 Z@+h m+h' _` !0_0 !!Ba q0 & `:̀0 f `! `;p}xO)<^xyq ć| 9 RCZH!#d!3d C !PJB 6ԁPCh14 C h 5-o=tN@W[zzB  C`( 0|`$@P08` Li0fL`,Vn A8pN)8 g,pn- w.܃^x __xq .ă>!!|B"H 9dlr@NPJAi(ԁP@Ch 4fZ@Kh |_C[h#tAw }/0~A00#FA A0@(hcāY0ïZ( 6f;`=~}A8p N9\+pu7|CBAbH) % Av9!< B!(šPP*B%աABon 5XIdT>W2+YlJv%SɥU+JRL)PJ*eJ5RCS+ JLiTZ+mJ;EtSz)}_A`e2T W|@%H VBP%LS+$e2]R+ %ReV W"H%J٨lR6+[.eGM9V+rCCR(w{XyP(o?gQr%ZIU+J&%]ɡRr+JRT)Q*// J%RUPj*J]@i4R+MfJ+FZitP(]nJw[;GQQJ*ahe2VW&(Ide2MR*˔JD*QzeQ٤lV(ەerH9Q*ǔ rJ9Q* ErU\Wn(7cTyP^*,U) ʧJ"%DIR>S)J&%EɪdS+9J.%RX)TJ+eJ9RQV*JCLiTZ)6WJ[QtUWz*>ge2LQBP%LQ*Ide2UQ*%\P)땍eG٫P*ǔrY\U~W+7?;]r_y/H|,d.9\re.22˝\y̱2\Y^%TJPBM 4Bsh=tN?+jCh 4ZB+|' }/0`@ӊb.1X@,$+5Z"Dl&[.bq8H"ljSi(1Q(L#JeDE QC%Dc єhN$ZmD;=ѝA|O$z b0!oY)oX)b#Ll!v^7b?q8H"G18q8E&g5qO< 'SxI"^o_;omU".HB$%ɉDJ"HGd$2YD."7K#D(Q(N$J_D-6QK4 D %ъhM!"DGхN&`b1N" "!B8b<1BL#3Ylb1O,"Ke b5XKDzb#A$vQq8A$Ng9qN$n;]>xJ<#/+5xKE#K|D|B|J$"ID2"M%BDaQ(F"JJDe QA"jDC9тhI#:D7;-уI@HD#~&Ca/O#Qhb,1OL &S4b1M, +Ujb $b+N vb/8G'.*qAA$#9xI"^o?wĿ{ۚ8DBS"HCd >'YlD"K# (bJYR^BTR(ՔJ R_i4T)MJ3+эN|G z@b1J#QD D!b,1OL$ӈ,b61OJ,"ˉUjb '"bO$'9qL\%׉-6qx@<$s/޶6HH$!4Dz"Ld%ى\DQ(D&EbDIQLT%5D]>рhH4"MD39ђhE&_D'3хJt#=>D??31B %ÉKHbHc8b1DL&Sitb&1C%+D$E#>b?q8D&Gcqq8E&gsyqB\%~'qx@<$'3%xKIMC! 2rr  P$1D %c(CėD"QLT!ՉDMQC54046474261|e{COC/ ?z0 1 aH Cc.py ˻'\8 Kx!B,abwJI>^{#\7C{=|<|;|U,T,*Zrwˍ-v;9|(6,b!v]Bn=Bnp ;/\np& , *\np7;"!x!V=}!9"H dFȎH(>DrRN}Q\d9DN!;-BN얈BvH"dG!s8Bfn2#dE|Y!s+BTD=P42"dDHGHOGHFHF|'"g"G"##n#N#.#!!5!u!! ^"^"^"V"N""$7BrX!$4BQ!yFHg6!F&B򦈐C"]!FH~_!m )䦍5BnՈBnC#挐2B#^ ""$1RnH.Rr"" #STBH"Ή&2<#%BnH4R2L#.;$R{#R,,䶈=);=R2#e/GJΑs)Fg"%&=){!R@H7R9)Gʜ#eFvi)%R2E 2;"%Ho̅BBd)FJGJGJGJG[?RۑΎގގ#=)GJ"BHһҳwlllk^7k)G;/R7R#)5)=)yMHFJ=DJ{)))))yGw%%yGIQd%GIQo%FIQmT!FeһQs%7jd%9GIQsd%GIQq܈QQQed%9GIGIQU?QQwnd%GIQydL}d%GIQ{%}YN%Gɞ%%%u%%u%}%u%u%u%u%u%u%}%}%Gɜ̣ Q}||%3=Jz?J J Jfyd%Jj!JxE w7HyQ*)HI$Q*ђqd-GKђqܮ2efGK2efGK2%h%h%hh:Z%hhh=ZrܣV죿2eGK DKђ́h)eDK DK DK DK DK2eD}-s Zj!Zf~he&D=-@R#R#R#R#r DKD fBWb XF,'VD@l$6-VbA$v=^7b8@$#Qq8A$N3Yq@\$.+U;qAA$n;]qx@<$'SxA$^7[O/_m]".O|L|B$"ID2"HE&>#9|DA8Q(I"JDe QN jD.QO4 D)ьhN ZD+k-юhOt :D+эN|K|G '~ ~$~"z}A`b1F 'F>/G#QDJL fsXL,%ˉj"XG'6"qL\!739xE%' DJ"H r"?Q(H!ňD 4Q@T$**DUQA$jDCјhB4%͉Dkk=сBt'%#z??/ b1F 'F>/GH"""#Fc8b<1DL&S b&1OJ,"K2b9XC'ۈn8q8M%xI"o?w?Ŀ{ۆ8D\"HJ$#)D"-HOd$2YlDv"E&y|D~Q(D&ňDi%QDT&ՈD-Qh@4&MfDsђhE&_mv7D{ёDt&]nD{'ыM%@b1F 'F>/1$`"M!b"1LL!ӈį"b1XF,'V+UDM#6-Vb;I!Lj $qH\!;]qx@<$'SxA$^7;o_ƸD<">HH|B|J$"ID2"HMd&YlDQQ(I"Je/JDUQA$j:D]>рhH4"MfDsњhCt%݉oDOчK'~&QD J'ˉD8M#6[vb'M! q8L!Lj $q8M!gsxE&MD2"HE&>#itDz" Q(L%ʼnDIQ(C%// D%*QN jD=>рhH4"m.DW#чG ~&a‡#DJ1Xb<1I"fs_Ebb XF,'V+Ujb M#fq8A$N3EqB\%7?.qO< O;揉$DN"(H" ňD $Q(M#__D%2QJT#5DmшhL4!͈D %ъhM!"&oD#щLt!݈ķwD{'ыM!_A`b1F 'F>/GD1DL&Sitb&1M,"KZbJl#;o>b?q8L!lj)4qƶ%!!!!!!!!!!!!!!1фhJ4'Z-vD{љBt%݉oD/їG'_/GD(F& Db1BL%Ӊ,b61K,!kDQhN߲˰ϰ tAQI-g%qY\[⎸kgox$4exg['ָDĆ$d4D:"=Hd'r9\Dn"G' "DQQ(A$JeD9<%QBT%jD#%цhK#݈ķwD{'ыM &#—#b$1$`"%ˆb1HL"&S4b:1K' _"XG'ۈNb/O"Lj#1xF<'^mqxD|"Dd'r9\Dn"Q(I"JeD9QDT!ՈD &QM!D1єhA$Z6D[ў@t$:??>D_џ@L $~!F?@"Pb41G'&4b1C, rbXC%‰""uzb#Ll!ۉNb7O Qq8A$N3YqL\!#1xN!"mqxD|"1HL$!ɉD6"(H&J2D9QBT%ՉD]QhH4"MD %ъhM 'zD(1C%db 1A&ˉZ" "b#8B%kM6qK#'SxA$^7_;oێOOD2"9HI|F%D&s"3A$ryDAQ(B%ʼnDI4Q(K#UD-рhK#!DWѝA"~"z}!0b81!| ?Ÿ Fdb 1C'6Mfb Fl'v{oAq8M!;qA"39xIMCKC% ODD"HA">#itDzs"3Jd#9\Dn"G' ED)4Q(K'$*JDe QC% FDc єhF4'ZD+#щJ"~ ~$z}~Db31E!D1K#$b21K# b)XN V5Z""uzbBl%;.b7KF#!0q8J#% qF$w'SxA$v}Fd"Y|DQ(B#%D)4Q(K#__D%2QA$j:D=ѐhL4!͈D %ъhM!"&oD#щLt!=DџHB "CapbKD1EAD0BaXb1HL&BWbXB,%ˉJb-NDDLl!ۈb8K#.5qC%CxA$^7_?Ŀ{8D\"HH|B$"ID2"9HI"RiD:"=Hd">'ىDN"?Q(L&D*QA$j7D{ёLt%?>D_?1D &ȇ%b$1$ Db1BL%f39\b1XHJ,!>b?q8H N3YqB\%n7{CxJ<#/k xGI@|D$$>!>%IgD"-@d$2Y\Dn"G' DQQ(E&ejDќhA$ZD;=сJ|K@&@b1J #b$Bab,1O,!ˈ*b5XKD$E#6-VbI"v{߈} $q8M!"qL\!7?-6qxH<"/-'xoK$ >"D")HI"RiD:"=Hd">'2YD6";I"ryD 4QhOt%z?}Db1AO#QD D!D(1JL#fy|bXD,&Kerb%XKD4Hl"6[>q8D&GcIq8G'.Ke qN nwCxB<%ωKxGMKK# 'ħD"9HI|F! DF"Bd%ىDN"C%BDaQ(F JD,Q(O|A|IT **DU:QO4$.DW;-=ыK#Pb1!@"CL&b)XA N3YqJ\'nw{}xD<&O 7m_"HL$!)TDZ"Hd"وDQ(A"$*UD5:QI%-D+5цhK|C'>D_џ@L $~!!Pb1AD1M!Idb 1FL'f3Ylb1G'Vk"&v9">&IdD "Hd">'وD"'O "DQKQLT!ՈD QO4 MDKњLt'%#z}ApbK#`b1@L$&)tb1E&ˉJbXG'6-VbC%~#I qNA$n;]qx@<$ωKP".H@|B|J$%)TDj3"-C%D!0Q(N J//D5>рhH4"͈D[ѕM! b01J # "!*"JD EmrKb%8$>Xy#0e2^LT&)e2O,P(KereRYV(k%RYlP6*۔eWM٧W(1rR\WP(SRyV(*)H%@HXTI$QR+lJv%RP)Q+_*JJeRUTj)uJSh/:C ݠ;| ='GIA  `8Qa p18'4 ppnm 8WŸ?A|H) %dlJv%RX)S(JJeRCRj+uJXiQV+Jw[[ Te)e2ALR*ӔLe2GY,T)K2eRYU•%JYlQ*۔NeOٯP?1Hyxl۶I8;m۶mUz>5<8p N8 "\pu ><Kx o;e9o;[\w+vs.vy9/yx.xg;;Gp! p"@D#Ոn0bF#Hh$2)F&#e5"FQQ(k3JFQӨc3Fhk3FOc12#Xc1lL1ӌc1Ϙo,0cXa1&cjl7v}~q8l1')qѸd\67[mHa4RitFf#n0rn0~F(#kD0"QFL#ۈk$4IdFr#Hk*FUQ˨a2juFcha2Fge1c1l 1Ì@#n0Fc1oL632cXm1&cm1Aq8b5qɸn0xgk|0>_7i_FL#Hh$2IFF#i2ryBFaQ(a4J2FYQި`T25FhmmvFGbt5ݍe6ch#QcXb,3`gl>!<^Kx t~N('މDq:^ކ25|?|6kB (e TԄZP@]4>Fc1p`"L)0f, `!,%*Xka=lM 8 g<\;pxG _;-B0! $Bx!D( C !$DB2H =d 2C A~(@A( E(P *C5ZAh t@C!`8Q0$ āY0|X `#lͰv`}p!8 G(pY2\;pCxKx=|w?oAp!!0Ax :ĀX@"H !%ԐC 3d C ~C Ba( O( 4PCeՠ4fZBk6A{t.AwzAo sg3s;$g3řpf:s9w.:ל]yu;'?C8!PNh' Dp":N4'Év9NB'I$s;)NF'q:ŜN S)w*:NS۩4p:͝Nktv8ݜN?3 r;C0'w:ӜLg3ۙu9BgY,sV;k:gu8#1sֹ\v8ם[m|t>;_D wB8N$'Չpb:N<'I$r8ɝN*'Is2:,NV'w 88BNS)v8erNySɩTq:՜N S۩4rv;͜N r;#Qhg3w&:,gYtV9 Fgpv:^s9wN:sٹ\s;7-sǹs;'3y|t>9/WD wB8N'މDt"9(N4'Iu28LNfSީTt*9UZNSi4t9MNtt:ݜN t8ÜHg3u9I g3˙q:BgY,u;+5Vgs:Gcqsѹ\w9Gcyq:Wt~hN'Ήtb;IN'dwr89\NS)u9ŝ?RNiS)w*8JN5Sөv:Ni4q9͝NK8=N?3 q:Ü@g3s&8Tg3י,p{Ѽ{Ѽ{wѼ67Gywh4oFfh4Ffe4oNFFL{1{{1Ccz;hLo齇l|u9?_'V0' q:ND'͉pb:N'I$u;)N*'dv8YN.'9?"N S)u9 N%Séw8 NivN8N?3 ug3ƙLsf:sBgY,u;gtv9s9s;+5syv::gp~:O`Np' s"8N4'ۉs9INj'dsr9ywb{Y^_z"^?W^c{9^n}۫sl/kc{u6j۫gl&woۻ3b{7Fl7q: .BW]z=^BoW'A`a0T& F#Qha0N Lf3Yla0WX$, ˄FaY"l ۅNapX8" DžIpZ8# KepU.n @x&^ ow¿{Q$|_o¯L!B aB8!U%$R)TBj!VH/d2 B6!S% "BY64xM\oϊUq=*7^yzK\oW&q#Sv7.q]!7z<7xf]@x$< τ? Vx'+>W`Bp!R- HBd!M! $BJ!V*EbBqPR(%erB%PE*4:NBgS# B0\!3,a0WX,, ˄ aFX+6aK- IpZ8# epU&\n CLx.^ ¿I*| ?¯L,Db B!OH $ ɄB!NH/d2 YBPF(+ B%PE*Tj5BPO/4 BLh.Z BNh/t: =^Boa0P$ CaB$ Fa0N/L& S4a0C) EbaLX.V FaK- pB8)N g9pA(\. W5pC%w{}Px$<OgKZx#>OgM.~ +A!J-D 1Bl!O/$IdBr!RH- BAP\(! BUP]K!j :B}P[h,4 ͅBKZ BY.=B/_$ C a0Z# Da0Y"L ӅLa\$l[mvaG+ !pL8.N 5pC)n w=@x(< τ+N(|_ow !B(!F'"HBd!])b B"!DH*$ LBV!]! *BULh.Z B[^(ta0X" Da0]! eraJX- 넍&a]!v {}apT8&. pM. '3^ |> 7% # BD!S%$RBZ!^(dr B!PD(.)J 2BYPA"T  BPO/4 MB3Bh)Z B'E*tz ~Ba0P$ CHa0^ L& ) aXX",V+UjaA(l6 ;=>ap@8( GpN8/\. Mp[# OsZx#|߄B pBD!]H"$ itB&!E*dr BPH(" %RBiPV('*BPM%B3Jh# BGY"t ݅BO[# @a0X"  B0\!F 1a0]!f saHX,, ˄ aJX+6 [>ap@8( DŽ)pV8'. 쿒D" хBL!O/$ B2!BH)R iBF!Y"d مBN![#|B!P\S(!J 2BYP^(T* UB-PG+ B#RBI,t ݄BC)  Ä8a0A$L ӅLa0[# "aTX.V aI,l ۄNa[# DžIpN8/\ ׅMp[# cTx&<^ o4B) B$!U&qBb!LH.R ,BV!K- BqOPR(%eBePW'BBh)Z BGY"t ݅K- 0!P# )Ta0_X(, K*aF l ;]naO/ G9pU&n ;cBx- §JL.B aB$!M+ $BR!BH)R iB:!A(d مBN![# ŅBYPM.%j BPO/4 BLh.Z B;Q% @!H. $a0E*f 9ap@8(DŽ pZ8+ %pE*\ 7;=@x(<Og?KVx/|> M.B8!M.b 8B\!_H $ B*!S+ BPH(,  %BiP^ T* *BUP])j uB+/ Bw!@!z !P!&ӄLa0[# "aDX*, +*aE& # pM!n w=@x(< O?KZx'+>*K# Br!RH% BF!Y"d B!_( bΟN S)딃NS٩rj;NNh/t: .BW 0a0J- $a0[+ RaFX+ ۅ]napB8%.KepU!n ;]p_x < '?KZx# 7 D 1XB!ͬ޼J墳yڛUxڛE9SթTwrj85ZNmSitZ9B;A(t: ]B7 z >B?0D* a0J- a0I,L ӄ a0K- "aDX*,V k:aA(l6 [6aC)v {ApD8&N9pA(\ 7-\x+ 'E*| ?_&I,D B!O/$ ɅTBj!VH'2B!M.r BO/ Ņ?BIPQ$TUjB-PWh"Z ւFh+:NBg z Pa( F#Q8a0]), ˄ aJX- Va]!v =^apX8.N gypE*<^ /·JV D" QB4!C% B"!TH+r ~B>PH(" Ņ?BYPY"T  5B]P_h 4 B[^*t BK- @!P%L& SiLa0G+KjaNX/l6 -VaC) p\8! %pK- Xx"< /+Q*|~W`Bp!V/D х8B|!TH)R itBf!K BAPR(%erByPQ. M!z }B?a0P$ F 1Xa0^(L& SiLa0G'2aBX)V kuaI,l qpJ8-.KepU&n w{}Px$<^ow¿{Y&|~?_>\%apBx!Q$DbB"!BH- B!U.r ?!_( !EbŸB)PN T* ՄBmZ$t]nBC)}@a0D* Å1Xa0^,L ӄaHX"V faU&l #QpB8) Kep]! GcZx#|_+Cp!V D" (BT![+ $BR!\H!R iB:!Y.r yBPX T* UB PG+  ̈́B Jh- mBGY"tz }~Ba0P$ F1Da0U% BaXX",VkuzaQ$lv pP8$ DžIpF"< ;Q_9tg3Y2B8Q .ćTAz! BC\h%mBG]!z `a0V' %2aRX%kfa]!v {}~pX8! EpY. CXx"< /7¿{U_ !B!I,qxB!HH,$ )B!Q$dYlB^PD(*'2P*Cm > 48a0A. 2aBX) FaY"l =^#pN)r;g?KpB:pNx'ʼnDs;8N\'I$u9ɝ4N:'du9ٝNN'w :NqS)u*:NSͩ4p:&NKs::=N/s8A`g3 rF8#Qg3љLv8Ӝ8(p NY82\pxxo-¯߲F "C !ā@"H !%ԐB:H d, Ba(E8 %Ԇ:PChov:@G+t='B?`B 0\a,EVZXa lmvNapa8Gp.576܃cxo_;eQ *DbB, q T2B& ;䀜 rC ~C B!( E(?RPAՠ:5&ԂPB= !4&Ash :B' a @#a10& `,V*X ka >8G sp.Ex |/ ~O[AQ *ąx@RH! @^|P C( Š8 %$PB9(2TԄZP@]  4 Z?70!Fa L0flsa>,Ű2X+`5zal ~8cpNI8 \kpn >{y9|w#9w3\>}W\pnmw܇cxO9/%;3|  ~+ B@( 2D C 6āCH 1$ C H 5 2C ;䀜 rC ~C B!( E('P JC( ,& [Sp98"\pu7܆;p}x W;۟i! 2AfY!drA ~Aq TPjAm4F74&C h t.Aa !0 !Fhca 0&dSaL0flsa ,eVjX `=l 6 `;쀝 v ܄[pCx)/%;3|  ~+ C 4CDq .ă@ZH 3d C 7P*B% U*TԀPBch͡hm:Ag ݠ;@ ? 0&$ a>UZXalͰ6;`'ݰ> pq8'3p.M  ?+"@D! ă RCH!;䀜 rC ~C B!( E?RP@9(ԅBktAa Q0frX+av;a=~8#pNI8 sp.E <;3| !*DbC >$BPB1(4PCUTԄZPB3h :Ag]t 0  `$0Da ̅Ű2X+`%հ:X`#lͰ6;a7쁽A8 g,\pnmw܇cxO<; _+|_!!0Ax!6ąxB"!? PC 6ԁPChoh M)4 Z?C3t CA0 `40 & a̅y0BXa ,eVX `+lv~8#pq8'܅cx95w/| > ;2! $B8 "DBt1!Ć8A|H !$$ArH)!4Az d\@^| P Aa(E?RP@Y(TJP@U/!414 Z@Kh zB/ }/ !0 !XaL)0t3ă90|Xa u 66;`'=!8GpNi8"\p5܅{px x 5>W[C*H 3dlr@.yA~(@A(bPPJC( TJPAu !414 C h 5Ch =t :C ݠ; @Ca Li0fa}p 8 p57&܂p=!< ?[x{|/w?oAp!! "CT 6āCH 1$dRAjH!dL@V!\@^@1(A X a,%VZXal-v.{apa8'<\p . :܀p =!< ^x oB@H!"D(At q!)drB. y /A>(0bPPJAi(e P*Ae/5ԅzB7 ~@ C`( @0Fhca 0& `:̀0< `!,Ű2X `5Ͱ  sp.E \kpn- w܇x U)!JPBsh #t.='0 aQ08`"L043`́0BXa ,eVJXa u6fa]^CpQ8SpYW!0`2L0 `6́0X`1, `3lmp N ><^KxoUC 2D @V!\ @!( eԄZP@] !414 C h 5Ch =tB7zB/ }/0  C Ha q0&$ S`*L0bXkalM88p N8 <\p U7&܂pCx_[B8 "DbB, !$ĐArH)!4C&9 '| P Aa(E?rP*@EUTԆzP@ h 3t z@oa 0&$ S`*L0f, s`.̇ X `5`;p 8 7 <$dR@JH!-d@VJ@I( rP*@E TjPPjAmu4@Wݡ^@?`8Q0x`2̆RXa5za;ݰ> p18 p.eW\p n=x O)W?~+4C!DbA\!$dR@JH !3d C 7䁼 P Aa( 4B ݠ; zCa @a.lͰvNapNi8g\KpU<3x/73|! $0CQ *DbBlq!ćAbHI!$RA:yA~( %$PB92TPPjAmuԇAch͡C[ht~`ca 0&dSaL0flsȧ2Xka#lp . ܅{pSxx/7 > fp 4p"B$ Q *DbAlH 3d C  P PjA]414 C h 5Ch AC`( @aL)0t3ă9X `9 VzalmvNa쇃p8 W܇cxO<W[; ! $@\Y ;\@^(BI( rP*@E ԀPCh)V v:@G tn^@ #`6́%rXa u6f`;p 8܇x 9|~V;BAha!C 3d rAnyA~(RP@Y u 4zB/ `0 @a q0&$ S`*̄90BXa ,56& ;`'ݰ> p18܂p=!< ?^+x o->' _+|~¯BC 2D b@L!ąRBV9!/A>@( ,X aUZXalMV{`/p!8 G(pNi8<\p . :܀p n ><s^{[BB( "DB41 &ĂB< !$ĐArH)!4Az!d,Av9!< BP C)( e P @UCchM4V-0 #a2Li0fL s`.,Va=8g܅'^x _x#|7[`B@Ha 2D @z!3dl@^| @A(P JC( U*T@[htNB7"X K`),հFa]^ #p.e7܆;p}x<'sx/7>G[PB8! DCRH! ܐ P C( Š8P *C- u.ԃZAwzAo}0PaQ0XaLI0T `6, X a 쀝 v0pY\+pu7܃?^+x o- 8 BC $CR!'ܐPP C(%$P*@E TjPj@M4BKh#t CB?` 08`L0 X k`=lmvNap N)8 2\p 6܁pxO<W[x3|  ~k C DbB, >$CH 9 RCH =d@V!'ܐ P@U/5Ԇ:PA}h 4fA{3t C^B?` 0A p#a,I04`>,V:`3l {a쇃pq8' p5g_|~w0! $Ax1!Ć@H 9 RCH =d 2C 9A!( EPJAi(e4B;ݠ/0  0F(ca 0&dSaL0fla,Vj[alvn{ap8 4p2<8B41!Ć8A|H 5t2BfY!< ??$2PB5A u14 C h 5Ch =t :C ݠ;@ 7`( @0F( c`,0& `6́%18 \+pu ><x |OߚDdR@JH i!d,rA>$PB9 TjPPjAmu4B3h-%m-:Ag =>A`0&d `6́0X`1,{pNI8g,p.M܇GSx/%;W[` bC >$CH 9 RC"PAqJ@I( rP*@EU*TԀP@]  v:@W10&d `'삃pf dLA~( Š8 %$PB9T*Pj@M u.ԃB#hB{+t=a 0 F `,X aa8GSpY8"\p57&~""C :Ā bC< !$ĐB2H)  @. bPPJAi(e P*Ae5Ԇ:Ch͡V v:@G tn^@_a A0PaQ0L`1, X `56V;`/CpQ8Sp98"\+p ܅{pcx9/%;_;_ !$0C 2DB"H I )$ Aa(šRP@Y(TJP@U/5Ԇ:PAhtNC zC ` A0A 0X K`lv18\kp ^kx#|V!D(Alq!>$ĐRPJ@I(,TJP v:B ݠ;@ 0 `80 F`.̃RXaݰ~8g2\p ܃GSx/|OW?oC@H! A|H i  2AfY!\B>(bP*B+hm:Ag!z@/ ? aA0FSaL0 f< `!,VjX8܃g[x|OOwB9Nx'щDv81N,'ljs; N'̓Iu29^&qNIS)s;N%SթTwrǿS˩s:fNsiv/:NxW'rz;}@g3q9 Dă90sMlxw{{{{>{oǻ[xǻ]/ySo{Qo|M0!"DB41 &Ă@BHI t2A69 '? PB1(%$2P *C աԅAw? 0Pa 0&$ a̅y0"X`5.U܃#x >F(A< 1$ C HPj@h-%v pz:_mj6floez4 rA>`*̀Y0(8RP*B% UT6ԅBch-h=t :CCa 0a*Ly0X `%- `?cpY8\pn- w><sx 5>G;k0 DCH 1$RAjHi!=dL@V P*C ՠԄPB=h9V v:@G tn000F8`"LRXa삽pa8GpNi8g\Kp5w.܃#x O)|[p 4p"B$ Q!ĂDArnގۍyˉn{6řLs;3Ylg3ϙ,p:RgYu9 Fgtv9=^g9t9#Qs9rN;gEsٹtn;w}yv8owο{|w~8?_{0' rB;aN8'Dv8QN"'I$sR8N&'ds;9N.w :"N1S)Tp*9UNSi4v:Ntv9=~s9u9ǝgs^v,D?^xH^nxj=o o_ |h탿m|hC;>t]|C7Czׇ~>a}d0Շi>a|B؇%>,a}XJVڇu>a}fՇ>a}>pЇC>G}8qNp҇S>|epՇ>}}ć></}xkևw>|_}w~j=B҇P>!Q|C"ԇT>!|Cf݇>CiPއ >T}CUP݇|CmPχ>4-|hC+ZƇ>}C7Czˇ>|80>La}\0߇>,a}X6ɇm>|81p҇>|%.pŇ>\7|-npLJ>|x#ԇg>o|gUՇh>D!1}HCB؇$>$!}C͇>!y|C~JPʇ>|(C*Pɇ>T}>4|hC7|COzۇ>>}@0؇!> a}HF0ڇ1>a}40ˇ>,a|X6ɇ->la;|χ>}81p‡>}5pۇ;>}ẋ>o}x{>ه¯L.B 0B!M.b xB!BH)R iBnO' BPL(+T|CPχ>4|hCKZ>t=|C}a#|(F0Ƈ>a|T0݇>a}XbVƇu>a}C) ApJ8-.Up]!n ;Rx->߄L.B BX!]- BB!LH.R B!^ d2 م\B^O'JB%PG+4 MB3Rh%6B[I*t =B/G+Qha0V'& i,a0G+ K aVX'l ۄ=>pT8&N gsN/D B"!DH)2LBf!U&dr9\Bn!W(  ńBIPF(+* BMP[# &BS\h!6B[M+  a0T& Apa0R%cqxa0Y"L 39\a@X(, +UjaVX'6-Va['1pB8)N %pE*\ 7]p_x < 'S\x# GC_} !B(!V DQB !TH'2,BV!]- ?B!PD(* BPNK!j B3Bh%B;A(t: ]B7 z Ba$cqxa0Q$LS a0O/, e*aI,l ;]naW' ep[#< oB!B!GH*$RYB6!C) BaPJ(- B%PM!j :B]P_h 4 MB3Bh%6B[^ t B?a0P$ Apa0^ L ӅLa0W/, ˄JaZX# FaE&lv{}~pH8, DžIpN8/\. 5pGx*< GY.~W`Bp!F) )B*!F*d 9B.!PP($Ņ?BYPA(T* UB5PC)4MfBs/ BGY"t a0TF cTa0])f sBaBX)V k:aE' 9pM.n {}Jx# 'E&|~?k@X!Q$DфBl!@H$$ Bv!' BBPL(-**BUP]!j zB}Ph$Z B[^ t: .BWO/  0a0F,L ӄLa0[# BaZX# Na[' KepU&\nυKZx+|> /7 &B!B8!A(DQhBL![# Bb!LH% B6!WJBPI,T ՅBmPO/4 Bs/ BI"=B/_( CaB$ F#Qha0A(L& S4a0C)f s|aPX$, ˅JaVX/l6 }~pH8, +uTx&<^/WB% B!I,D хB!O/$ $B !^ d مBn!W BPL(. 儊B%PMh(4 MB3Bh):]nBw!@! Äa0I,Lf aZX+ &aE. GIpK#υ+Fx+> ߄ (BT!]! B!ZH#2LBf!U& ~B>!P@C(( EB1PR(- *BUP]K!j fBsRh%6B;U&  B0\!F 8a0A$L ӄa0OX,, ˄ aJX-6 [`+쀝 > #p E*\pnmxd<6OWkl|1ߌOgD3b8F\#Hn0RiF:#hd22YFN#o00 FQ(i1*FUQ˨a4juF=hhm4ZvF{dt7Fod 7Fc1hL1ӌ c1ۘc,7V+Ujchl3{q8l1nj q8m1%qݸa2nwCxi2^o;h|2~F#g7"hFl#Hl$1ɌF #Hm1F#ld1ٌF>#Q(g7UFMQǨg40Fhn0Zֆhgt0:Fn6c1fAc1ʘhL2ӌ cXb,5ˍ*cdl6v;Qq8i2Ng9qݸa4nw=xe7>Og f6ьF #ˈm5 $FR#Hi2iF&#jd3F#Q(d5erFyQѨdT65ZFmQh`41ZFlt1Fo` 4C0#2#Qhc1˘m1Ecll1ی=q8l1ǍIq8g\4.{;y#x"z{3л19͟@ozs&Л-< fH`7;y͉@ @oFzs!Л}̀@/@/\n@~ n@/,9@/ xR<^x`}^zZwzyeRCޭO9.޽eNwzHwzm[ofw轕1 o zo$#1puo 2pg}o z2@~ z,c &@,k۞_=>,ޞDA^Oy7ȫoW A^]y5 j4ȫc7:yu  oVy j1ȫc7TSͿ oy fQ7y{x5 j3ǫiwy 0ȫaW A^ ys#țA|nA<f@A}=^~y7UW /K 22ȫuW /yy5 A^݃yun n n z /y Z/ȻY#냠p.% W*\pn- w.܇k |o~OBB( a ,"BT!&Ă@BHI )2@F Y +d?RP@Y("ԄZP@] 14 C+h A=>A`0 0 3`.̃ŰrX a- 6 `;쀝 v^8Gp.e :܄[pW; _|!!4D C ! A 7BP *B%5ԁB#h ͠%m=tN@W /0  Ca0xa2L0flsa,%rX+a56 `;=~8 4sp.e܅{pSx%{Atq!xH/F6mPgԀZP@Ch͠9 Z?C7aB 0Fhca 0&dSa,V*X k`-6& [`+l v `?p18'$p% W*\pn-x |~¯BB( a ,"B$ Q *DbAlI!$ RCH =d 2C ;䀜 rC ~C B!( E('P @9("TPAu j@MԅzP@Ch 4fZ@Kh@[h]tC`B 0Fhca 0&dSaL0 f `>,RXaUZXalM6;a=~8#pN)8g܇cxo |ml|( TJP@U/5Ԇ:PA}h  4fZ@Kh@3tn^Aa,0&$ S`*L0f, s`.̃"X K`),V*X k`- 6NapQ84p.% W*\pn- w.܃^+x o-=|OW_ !B8!D(At1!Ć CJH!- 2A ;\@^( 4PC2TP _PjB- u.ԃB3h-hm.Aw? 0 `808`"L02X+`%հ:X`l-v;Cp nx o- >Wm|p!!CDH)!42BV9 '< @A( O( 4]! & !J R3H0b*yyo??:kz{빞{``-֬{SAu ԅ %heh-6A{t.Aw=>^~*a A: !0ހa0ބ0ނQ0XaLI0Ta3ă90ޅy0ރa,CXa ,`,Vj0Xkaa|Sa lm>]^pNi8g p.eW\pnms @: dL@V!\@^!(ax*C]h/Ah͡%t~*0 a̅wȧXa |`9 VC(XcF6f[ala/`? | w=p18'~p N8 <\p . :܀p vDbAlq!ćAbHI!$RAj@ZH!2AfY!;\PP C M)42 ZCh =t0&,X K`)|+`%4\1!&ib&oD&Ibd&IaR>Ƥ5Lzo0&j&er<&gL43˦iiZ֦io:laz^cWL?y7@3ȼn!fy 3͛fi2hcƚqf`&Ifbifa13,31sͻfo3f|hfYj>2r¬4jj֬34ߘas3g9s\4s\77Ms6wclf&m☸&o&Il&InR&Ϥ1Lzo0&l&nr&m&o2LA)d "Qy,|`1,P`3l  _÷#p ~$p1 &ĂB< !$ĐB2H) %pC!#d̐r@. ?P*B%u9W Aaa 7` 7a` L0ށ0 f\x|xއ>a1,6;3 {a| Wp0p ~$p98"\+pu7܆;whb@L!ąx@BH! $dR@JH>Hi! p?<!d C 7䁼PC ( 4, P*AeUyh mt CW Q0ކ10\x|xއ>a,`,P5ǰ6g>]^_~8| sp.E \kpnM]B :Ā bC >$CH 9 < O@ Tg TjPj@MBmu9x^zAch#tq0&Da Li0f;0ރŰ X ` u6'>MVa|`7| G('4p.E܄[p51CL q .ăAH!p!#d̐ C < @!( EQx ')( Š8P JCY("T 4%B;h3t COW5`"Li0fLK`)1lO`#| `3l >p~'8 4sp.% W*\pn- w :Ā bC >$CH 9 R}B:!#dZ:Ag]tzAo} Aaa `a q0&$ S`*L0f < `!|"X K`)|`9 VC(X `=| & [`+l>9=}%_A8G3p W*ܹkrDؐ@z@vy /䇇 < 0G8PPC2ԄZ,Ԇ:Pԇ4F^&Ash-:B' ]+t^0 F08`"L043 `6́ B! ǰ6 v^ | !8 G(p~'8 4p2\p Íąx @V!\@^!(<OAQ(i(T TP C-x@ChM4V@[htN@7=k@`C M#-mca 0&dSaL̄Y0\x|xއ>a,Uka=| & [`+l>]^@8|k{8cpN#SpY8\KpU7 C 6āBbHY!\@^!(ax Aa(c8<:Ԁ,̀>a,U azS8\+pu7܆;wM AH 92CV!\A~xbPj@MxjC]x@3h-6A{t.Aw 7 08aL)0 xf, s`. `>"XaPX `=| & `;3py\+pu7܆;wMhb@L!ąx@BH! $dR@JH>HiA 3d C 7䁼PG0< < OAQ(šRPPAyTg TPjPԃ"4KB3h-6 :C ݠ; zC @?x^00Pos`. k.5#$R}B:H drA!(ax Aa(rP*@EUTPjPs<B;h#tB7x^00PxpxFHx FhxXaLI0Ta3ă.̃ `!,V*X k`-p5|w=pOpNi8g p.eW\pnms;! C 6āCH 1$ C H 5i -!#d̐B69 0<0< < OAQ(šPPC2<U*TPjP@]xԇ!4 4fZ@Khm-Aw=W00Pxބ0ނ60`2L0 x0{>,CXa ,`,k`=| & [`+l>] pyx̸CH AH =dx2B& Y +d"bPJ@I(,T4fZBk 77`Q0ކ10xaL)0{>|"X K#XaUB! ZXa |;K8[#pMu׬!ĂB< !$ĐB2H) dL@Vy /0P xP C ( e, PAu5< ԅyxZB+h m-:B' ]+tzB/ }/W5mca 0 & `:̀w`&̂UBa u>O`#| `3lp+CpE WAH dA~x #P Cxǡ(PJB)( e P*PAu5+tzB/ C`8 c`,a, X `5Bǰ> 6 `;sa/`| Wpo;a8G$pU7܆;w hA|H !1$ C H >Hi! 2Cn ?< < < < OAQ(šRPPAyTg TjPj@MBmu9x^zP^Ach W5` a0 0ބa-lOSa lmvg9=}%_Ao;a8G?I8 sp.E \kpnM]sC ĀB2Hx2B& Y +drB. u9h 4 4f^ZAh q0ށY0»0!,ŰG X `5Bǰ>)lͰ6;3 . K 5|p8 G N)8 g,p.% W*\pn- wz7D bC >$C Y +drAny!䇇,TPPԇ446C tzB/ }/Ux u C`(`8 #`$60DS`*L0f, s`. XG X `5Bǰ> 6 `]2B& š$PB9(Tg <1M)426A{` 7a c`,0&$ȧO`#l[a8G"\pnmshb@L!<C(@a(c8<OSPAq(%24rKA{t+00PxpxFHx Fhxx`2̆9.̃6f[ala=p+8_7-|!8 G(p~'8 4p2\p ]@41 &ĂB< !$ C H t2<< OSPJ@I(i(  !4 ZB+h m- 00ބ0xaL̄Y0|XX 2X+`% & [`+lv ^@8|kCpQ8?I8 sp.ez?At1!6āCH 1$ C H 5C!#d̐B69 'ܐB> < @!( EQx CE U:ԀZP@]x^zP^Acx @Sheh5@Wݡ^@_k@`C M#-mca 0&dSa:3a,%rX+aP5z6'v 8W܄[w-H I!%p C 7| @AxBPPAq(%4F@Sheh- v:@G]t>^~L0fls]=xB>ERrX+aP5)lͰ6;3 `7쁽@8o[a8 8G N)8 <\pnms 6āCH 1$ C H 5i -A 3d C 7䁼CP P Cx B1(%$24rP*@EUTZ,Ԇ:Pԇ ZC[ht^`o `4 c`,0&$ S`*L0ށ0<!,Ű2X+`% a:F K -|!8 G(p~'8 sp.E W*\p nÝ>hArB6#P<šPAUTP @=/Bh/Ux @ a q0&Da ,eVX'>Mv Wpo{8G8p \pnmsׇ! C"H %ptA 3dr@Nya(<Š8P BchM4V@[h#tBwa0 7-c`,0&$a!,v. {`/|KCpQ8?OpNi8gpnߵ(:Ā bC !$D Aax Bq(%2P*@E:ԀPނ0&$ S`*L0flsCXK#XavNvn{ _~8#pq8?SpY*\pnmshb@L!ąx@BH!T4CP P xP J@I( < e P*3PB55&Ԃg6ԁ</@=/B h 5:B']; zC_x00PxpxFHx FhxXaLI0Ta3ă90ޅy0B>eVjX `lOa3l  v v _> | |0p ~$py\+pu6ܹkIDbB, q .ăB"H I )$RB*H AH =dx2B& Y +drB. y /0<0G1x')( Š8P JCxB9("T TP C Y u.< PËAcx @Sheh-6A{t. C 7 W5` a0  &60`2L0 ;4EHZI+#iu$u>6Fҧ5E瑴+F?Dt(G1O==餧SN{:鬧s{颧K.{骧k{馧[n{gih{)Xb{)x{J)$zJ)RzJ)4zJ) S&O=eS6OO=TÞTSaOE<= OOz*ᩤҞy*既*y⩪jTKzj橅xj멝:z䩳.z橇zy!zz0Ooyi&{z,O=BO<-<VGBX$u9DH EH"EH8餧3z:邧.y銧y醧n{Oo2#<,a=ÚHimvyiӗ{!O=tEO,K)$yJ)y)l{)\r{)|{zSOyzӓTS1O=TSiO=UTS%OUfO[zzS?OzzSO< a4HOoymOc<4dOSs\g3yyq'W+܊E{ϵ#gYvB0g7pV||lv{ˊÿy8ᄇ<''=pg=p=\pU<\p-=܉!{!XzI")I$%.z!rz1<PCIzU< 0PoxaFzal~_0%̉`nF0/%=zx&=lgvzaCC{8ᨇNxÏ~p)=p%W=\pÝ[!bz!xH!RxH>i< xxc'=PC)=𴇲y #H #f$tN9DBH =#w$W#$ A0<ތ0:ލ9l̴s}Y}qV|{c{ڽ^vkWs{ڽ'\뭾[o9Th,'{BI帟mgVh }dr89E X! >M  v v _>  | !8 G('\pnֆ@4q .ăBbH!-!\P (<EP*B% @ ՠ:ԀP @}h%hM6A3t Am ā,V*X & [aݰ@8SpY\kpn- wZ@\!$D@RH!%2B& Y!dB(#P c8<OBQ(š2P*PAu/Ah t :CW='A: a L0>E` u Na/0#'p ]c@lq!ćAbHI!$ d̐B69 '<A~x @AxB<OSPJ@i("T TP jC P^Ch m @7=a ! &0X a ,Vj0Xkaa|a ls8_7-|$py\+pqDXCH $ R}rB !(ax Aa(SP C)( ei( ^~*a !0ހa0ބ0ނQ6Y0\X VZXa|a 삽%p 7#p N)8g pu]B .ăB"H I 4AzÃ2AfY!;\A~xqx(PjP@]xEh 1M)42 Ag=/`0 7`$` q0&$ S`*L0 f <>ERX+Sa lm9ݰp8?I8 pn- w$AtH %p p?<!dlrB. ax Ax8RPB9("TPjB-xjC PËB#h /Ah /CKh'>F$xfbX rX+al]>A#pq8 g<\p Uܼkc  !$dyżfflF1fg&Ifcw<3߼g>0EfYb2ܬ0+*ڄ0`>1ͧfb9a~4Es\6W5s04Id&Ieқ̃&d&nr&gLSy3CPfFm3֌3d3L5t33{fYl֛Mfbmfa>3;fc/n5ߙasĜ0?Ys\0s\3Ms?6&k&Id$&IaRT&h2&j&irgfy 6CPfFQfyی13L23L3 iffk5|y,0 C,1efq=6u9uu{ɽSlr'6Muu{M^O7Mut{ ^?7Musɽnnr7~\pnÝ6@41 Ć8A|HI )$RAyaxc8<OAq( 4g*ԁ<Eh14Z@KhtB7=Ux xބ0ނQ0&$ `&̂0ޅy>,|fz}>Cmv6װ5l{^6׭uk{^6׬j{ٽmv7\p\55l{ŽNme⛄&Ibd&ImҘ&`7MFd1L!S4b|dfYiVPƬ5gƽ}俇BPbPJC{x*ރ{y{q-=v`:Nbnaz^cWL?y-@3 0(fb703ܼiFhcƚqf`&Ifbifa13,Yh>4b,5+Jʬ5zl6[Vl7;^9`;s7?9o.K抹jabX&k&Ih&IfR&Im3iM:d0LV0Ln5L~S4GL!S3M)j榅iiZ6lefb(3֌3T3L73;fe昹]37fYbr„0Ƭ3f|j6-ffn|a/~sc9a~4')s4cwf&e☄&Ibd&Ϥ1iM:d0YLVd79LNS6Ẹ1y@UT P=@5\4F^:tS#AzE;C 0<# 0:`B&`J`NX`a%(k!l%le_86 p4' p:gp!\ p#F71LL'@I$ *@idpd )@9 ;@h<E P1@4 <ZhUh]`p#`T `z`A>aX,"lI> ) y]v`o}8 @Vht -@= ?C`XFx+`L`B&`Fw 0+s`^ ~ X`I> , ,ki`{> 3v`o/ eUMo|p$~ p*\ p)W\ p3[/D71MlO$tRBjAY!ܐ #P Cx')( šRPB9("T TPjP"4FBsh-6A =aC`(`8 #`$`4 c`L)0fls]BXKa,Vj)lv~|G$3py \kp ne41 1$ RB*H AH !d,rC>AA( $bPJBxB9(2Tj,Ԇ:P !44A tB?x^0 xa$`4q0&D3a̅% X `3l  ._>o;a8G8<\p .~!ąx@"H I T4A& Y( Š$P PB556ԁPËKZCht. C 7^נ? !0 Û0F[6 0t=xJXa u> 6 ;3+8_÷|(,p.% 7&܂w q $RA:Hx2AV!ySNP6@ E6O=^׫# 0:0! nyx/ |ϑ2a>Cquss,ܽw3‹;a{T{}D{~3_{/CNSq%{p!ܽgrgp^!ܽGqgp>!ܽ?w s.}N wp> o4sp wϹN+wϷp,=ۇČ-$fH<7wnD!1R 09Η;.u{gwu{^׽u{^׽u{^׽u{^׽u{^u{^׽u{^׽u{^׽u{^׽u{^׽u{qիW^zիW^zիW^zիW^zfWϕ^}Wov~u{^׽u_zٹWo#>ԫW^<>o<||k3*|ksHNIM(4}4JsHYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYg;eeeeeߚv:NSOSwJr[c]&~H_~Uծv]jWծv]jWծv]}w1_}k߹_V;юvSN:uȟ_Eyi4:fN?k>o{kO{Ӟ{wvhG;_kfA5羙t5~ܽ ʹhG;юvh'{W?紣hG;юvhG;юvhG;юvhG;юusw_eO?-v;!!9ѝNL'B}_?Nv~hqZ!ٳg׉WVVVVVVVVVVVVVVVVVVVVFG:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩS9S;9iN:'-3mDDDDDz]n䈿O;1͈{:s]Gy[:uԩSN:u_3yȯqMΑ׾7gydN'-_w׽u{Ͻ;{g]fVYYYO^s;8A뺋wJ~wS?~.'aa2UVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVh8yYޛg3^z~Q՞իQ{T^zիW^zիW^zիW^[ߘc^zիW^zիW^fv9*>OԫSu9@|"""zcq;9x.(vq 9"իW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^}Ejz}p _W~?_W^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիW^zիWg?G~5w&8!O0q{Π_45W[UVVVVVVV3~yRs=wSuYguYguYguYguYguYguYgFɚTQ1q uYguYguYguYguYguYguYguYguYguYguYguYguYguYgsdiϚ(4g3y8rf;3\I)MMMMMMMMMMͨ<=/fߠ?|NIS)N:uԩSs)*թSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSw";C:uԩCW]7,w*SN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSN:uԩSNMW?:`jԩSN|w~󯫩O׿eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\7O~цRgpWSɩ?aVv~~W* Q7ڬ_ކ;9r})+[#0!Q}OGDr09tez-tzў_﷿/u07=(d) (s9[9Wk*c<š06xد4QI[-oX^@8)ށa^gQ^Dx[.>here# cA/! dD)ԟzdF%k s2A7d[EOA YЖ//YC箥۠ V[D^~gwNίgz=[oЍs6)v[T-!o31_k2#2dO)&I4]/.&H,3/07Tjo=WdkTww}܏*2}y>_̋4X-5X>h(X7,,`6:X,2nXRk2uXe6?XbQjgeK^L2]fu*URK*s(V^`ռZ`5tc?vZ+`_:z4'J`?͸~c}]ou`m`E`T6Oy-@l#u-P%mSMx-m#]lǪvlvtzGo|?^3Ā 59lK!s{v,2,G/,2 F/Kn-eevW]`ע[n8kZC?Vuҭvw{ݛs>}m>MB`XNl{=_gπ&vCZڢ/8f=ǼVpIk,?5]\35;\klp-V2Sp-? )ԗ׹+S:OczJzr}t+1=A4}w#0i={ :;ݓ߹SBڿ(7y[*/;Gz9xd#c'ٹ ﰷ#%z=xO4MO6xZ"a0x>Ok=x;;Cw6xWRoAf&wp1p _b0ƹo RoMgߌup|/N9w9k0 |ǂe}~02w R8w%?~ 'Ҿ)O-_-Ĉ~Oɡ3_O7࿶ x7)ދ /z],79-*?QOP &0C;v<~кu=VhB`J zwֆ3B XFdC<!p OCE=UC0zC03J = 9,h:gAp !;o09M@oBD!t[Ւ6 }ףO-T;Oq}W{ D_S5b8|ߏG 2rDFHDS!21""!2=܍WoOgּalQWh+D Z?7B暞i9¿ߛЫk>]c.k XQt zAL}t b!6z Ė@l)2^Al!bzb[@l/sM{R :y{"I^@?-~&\,VkE?璆~7tAUHȭD-HL琘E9 0e yC(>@bHPk /n y9s̶ȀfTybA[y?2rmu`nC~H zZo]S Z!B>Oמ5/~yiw6SIjgLo#XŃP<Ųj(uĺPkJ6P KPP,(֥a"Cl(R|PMJUt*JԻz~ù^=1pVbέyE(] zsh~ֿt%PwD Pek my'P4G(+-j(m$sluClӏFF峼P w(?:ґ{, WrPqYW xAwTp*Ԡ*zAeL,ף{?k+͡$T򣠲*r0 *@T|2\oPiʓPy4V*TVAuT_Aq9TߋBC T?{_qS\gԸ2==};ޞA b5yE@u͘ndO'DBm9BM;j\Pi%GCMM<vT~v3A-9ԆڨPUPXPˊZ'6އZq6ρPU }}vH?O]k=j/NTޛ.tmt=zPW(ʯZ3E, oCDWnJjPyP:#B#6<-QP3@} X@= t[C}ԫC%;&(b`bh-:(Nvuhߥ39A><{Lmh[&hhBc=[kCC 4]Ó^OCO:t4Cgt 7BȬc:{'At`*.BVn}7-} ]2mB7} A$z[w7~ЗfX }]qwq)B?.B1DCO1O "WoRo2Ҿ>b蟤+ _Uá_??W=~u_YQT:Oea0`9 @M `90U^ ca`Å00q{T`3`0 \`rDAP: 0H{q0<SRaG`ʿ;ߚ?KM1lMy&0XLߋM` 6^S=}]4-?'aPKU0Q l/. y; Z(a >ށ0h`qǞQ}Z0o6`uۈ/30-՚n`pKK1n5CR C ]a08CHro!f\9`,X: 0V> Ka<&01]  %0ٴ &'.gLn Llɽ 0i80yR0}Pia6}̚aֲ000yCoe]k%M0Ê0빯!7`0#uY>^cX)B,2PY2,,4,`a5myX|\]LQy`kbӇnŻ$ օdv%k+,ka;|`)}9)`)-Co{t,a\>Ђt·prc),wXX˒@XVee,h #"\ɂy86(x?͂mn؎ ۉ`;3Ga[] ;Rر]쒷l6y+Tثz)Z.ŝ`_)_r ݃&_5ckM:ךW<WAFppp~pJ |H=2]_N Cpk uP=g(wLu4dqdGpǤCpWqR}:e  Ip\{ XHqt8n%p%x*p< 2% _ p x _cĕ'p=NBlk$N).IN2g? N)I l32:#8Y[3i\-Ť#8iq/p:Y*m8S>מ pNθm Z"u:7nj oSYz,gE4洏gl g$8ًξp} onԹg g=sg ٹwͰk[BA(Z< !-4_ձOf˝\aNUI9N||C1Di:(cJ\ e! 2v9$9CQO{ )fb_( S4\\U.p p ȸk*.zԚz֟뽑kv_3dk %еEcv.(I+\|.qpKhӤ pt .S2-.Fט.uK%4\u(\ݧuzl>S0^panspG.k\pw#'ρ"9kˇǠpp=Կítc[E. ўkපz5g=pO= 'jܳf? z\:0E '0yCӖ;-ѧ1R#Hѽ~}_A=;,Y XՑX}vmxYe0W9L{ 3{|g&WN㌯O3܀q0fbXkG[b~/7`xKR AB$|A}!"HAqaJqZ> o@MCJA+AkLQo! !Ao"*ymo|յvbRZ`GA-P`62E6۞A_Gpd_^ᚈv!ij!3}2=Bf@suZ)gk!<-·J#|]E%/;˓/~1s "2LU[ (8bذ bk""b;ȿt]A D7DDy "Nn@D7"n?E$2D<ـ@QDFd#"c@qy'pkDMEKDEو< Fn# 0Xb0bF4#6bDqF<Bq9# "h/6>N@Wv qW.qqb\]yf{s1Zg#lC<@:^:Ŏ"^r&e#^V:M)Zo׺~.( ~&"gy0g?l4tK}^&յLL{"+QBg>{}NV>c3ˇ1ڢp(mO] v"awa,AHc?b ƪl؁I;hj`n"ƶ Q3Zo;m#v"eEU;::뵑ȅGbs$ĥL +$3d(!1s5c<ڻf/]XM>HL-wm!q_CV<Iz) OrHJDDc$MDR $I is{nf0MAHERn CҾ $LA!$DH*W@RuƱFb\t'c#q0d59b3ݑq0.(B`\*ʼnocG&j&ё¸I0.e3ƥ|1^ c&\p٘p56bB}=&\S=z"%L#F_va彶|FL9-%ab&i;?plpy%?&g1>&1&m$Ø4&y_äњƝ>k0}LsZlk/E붏km\I{w>=Zf I,Lo8 W'H9ɣ#d)lT70y1q)&;EbMLvO䡾)Lɝ^e100 &U`rpLSvZc5L)CQ)~~؁)0dT”HLd)7amaLiÔwv~inCR冣b )WbBx#ŝ))#4)IZH7)&H) ^"em0R9#pRRFVCHB]H0wsCʑH9z)ґR&[H9<#WQSH0)r ) I$GI1!L}ÉMr,-`4pRbYi1s4qcNL<ٱif,M0jQ眛r׼ܗgϞ/}^}aZ4mo0#?*@( Ɵ4Ao I M84HS+D@7i isBCsSa]'f~>#҆ ;i湠}Nej@ܕHw iV73o̘93Eb>fYbUf ,dz)6bV[< 1[Cmlj60lC#6em;7]慄s9jW[O)fsdx?ݝ0K%fVV߂AfQ1r{~wm0LO%aim>/4Ywa߉90sob1sLr1lc84`8 sə3r)36椭KsNY0wS]'_5ʘyǥy0Gb/a̳yB1o̫,Ƽ";yg&a^T'ssxnڦMйczŽS_H_+ʑ Y75/a(ҋd)Kc /X,ai_ÒĻKh>-ϖ’uXa)cɚmQXm-ǒM4lzbə ,9KΗaɅaXRZ#n)RX*Kec,eTrT+K HK-&`<1R X.CKK}Ea1XƔe q*cY?cٸeX^eaٓ#XlX#c9R,皁|1Xn&XKqˇl_,1׸6V،Ŋ!XqgV]\A+ŠAX+Zc3c+VYqX铉V/XX+:aXGQ>6`X9Μ49w͈YXY+,oұA+6bB|my ~)r:σ9!X%jUbӱMĪǪX9.6aU6dU[Oadqv&aծxj<}/Ps[cE}t)Z1 EPB:dxѶyci=n2"ced$GF6 cd, F&;2e 2  SGi8ߞL Bf,2lB'ȬvGf<2oC]'d>nAfd>As_dW|}Tz[m x(buQ+Vl՗auEV-sbfd)d39x̟"bhn,WȊ^LĈYq'0Yc#+1 Y5~rۀZ~~3 SEֺZBndmpA *F&o d8\v"k+d[G#f"m#;LniȞ.왗=k6ɶfJT׹ {}( =[ {Odۑ} }}.PS}Rb7)#=sKd>l?܌1dט!d>Az_z.Gv}+mEuadߠ{ٷ}{;r !ηsQȑ@lY|rG G 9ʚQqS#?k#'@r#S{ˤk=9ȉAu^"'3riϘ $X!'>r&oi gLǸV9EC9Ň9[m"y9#gr"gpSDHeXߙ3XnjArr*LU(rN@9yȹ >^z9"1E)rF3A_M@k-伡ogI3|F| E.T)#rg $r(n!?y9/֋ķ-F`DJ4;U Wux5rM2kJ&Z܆F]:Q4!י%r]; 7 Qȍ8ܘuI5j-r/"wL1еCnpԯ1BK+U|l͡3r/s zWϪ݋K}WzrEl&k|]zN3f l]ɟyF$6,Yϰy>6F;ѥD[M?EijIè-1b^lM߆+bk5l=!Kq[|#E[Xlxzc$l}CtbG;v-N);TNM -+켵;o; u(` #vԾr k ?vmM;͍]{(]d8v]5+rv]®Ώr=n$aMWI}O Q܎=*cv{İǥ{\fcϥ!sU{'`L"[,7;ٴ{Zd}_iu^fya^"5,^c5م35wr]5{3gbo-5ػv"^덽wbO{A[B{ߧ`A(틒9(Lq%=P`P{KJP( Eɚ*lENU(}tfC#Kb_/^g>]اc ;}n[oZ} w`طbeLžMOo?sؗ}kn]sƾtny>^Ev8wdbZ==?y7)`M .S{OOmǁ{p`NA88 g8XPeR(ퟌR}=iEzVŮ=-{wza|qp!g\:uxS3}CfJ7T7zQOuԐbp12މc2)8qLؠ:3qıBvǂp,Q=^Qhߣ{{ ?{ ~ǭct!9:{?3=uuuw߽<^KP>ePe<P0wLЛ eB(>չ+Q|FEIJSG3dQ& e PeQLeI(SقV7Q6hʴ(#JQ2Tyowz/n?(3rC̦\e(FhrRA]鳹Fk~O~F9<{ePGdG_3|ks|8'|2S_|.N~ދQ7TA[*B)>BrFE1*F裢2UҨ8炊󾨸 w_*y#).nTRt4*(^RR*PJ'TpmE[%*=Q=OG\uT G|_T. @b#Tu-FKm QY ֠TmGe/;*U@<;TF;8;UP%U!RBvʲ7l7n:PȊ*Tj*PUsQ5U iL?eu&׹g_W3v>3_NYv5zw{wu#=_wJgTGՉ*>zpUORP8ޚSދQuz)Zb7é8N5 T?NP(jB5Q.YMgUzǮO.cqZ-W8f%Nw p14]8E}{;Q&83gL8IƙqpfBLڍ3pfJΤL"eÙdYKc8S>gl)nُq㸋sq%㜠4=FGF¹w8pΥܲܪs1:sN\:[*{q^}XQ#F!53Pe[ԨGj TPc56Qc;5\xף)jPQo@Ma s֢&xjB'(j"Ƣ&zM73{5;5)YDs޶jΘ]\8QM=7jDMjסv۸- BpAb .4C-k"jټQKC-o .0 paA\j nPZ&׮5g՜Z]V_7ޮ5MyQkqPkG}ZFFg8٨}y-ȖF" .rOpQ`. 5qqDsp~).: E\⊋nqqh.z?g;h6#Zx]o-1\lx.<%h\2{K rpi?.mKUkq.HƥiԤK-p .}XuOU}z0\+Bl8}n17 ]vN\7zW?RnF ffnv nd-=ekPd.u9UsOph[kM8#٢oQ7TZ'Qn(n3궭ENDn#{+PW7uשq uePWquP"/9O^0B|P/܈zA9AX-_DoQlzuZkpv_ץq]c&r5q=? q}$n;eq'n0& 79|y.fym܏yg7V/EK[Ҝp]zT[qɫ-~H؅ۆmɃ.}=o-3w&q*wj^skh5ؗ Р-h>h}hp<=%Iq z4 ;`ÿw.hۈ1А̎ih PhY7 /r{;>m}}M~g:Gp_O pRܷ֫qf8}{;S)}$(ތ/5^{7clv3p75PZ84]P9$|p /RŴDX;/9e1^܏x` ^.+^Qƫ{cu4?O^u ^g8׋zqQ[׷8^Ss17x7)6ʹbI397{'y7sMmo͇x;@om~2b!-Lqor ު[ex݀zڢOBo-,gm[0ok92?)M/=U3_ {Gm=w~x2<οݰ[)F44Df4?^hZSxgi}5h݄Ƌx6/?C4^7x634>fh|5*_ ]m Mlh%?~L3?VDh,{=H;x=^;hƌh MZh:cCt\M_S#*fBT]{[tQME)Y`ߡYƋ'4Gs Ѭ8 s< ơ9&עy)Kyi4BsYף$xl4WsQBsm./od;hWhEI GUhU}4?/(o@hi47`$|襁!n<_QYa>ԭ‡k1} 뒩vw|ŏXOfEO⳪?> pCZia|V<'o)oh Xi>(2|S|Ɲ-F3yIU9r#WeE)ihsGDJ3U6;jVehGk5&45u+ZDk7h]'B}Z|~ja[ڐ)7Zi=3Z?/!8GF N @|;e9wgn?eE9W;s~߽Wsnοus\ߟ{ʯY7,E'pw}OWϒz?5ϒso]g|{l6}>^j=f9Pw @9(Ϸ|3#)D0sUL.&(ҢxNq!A 'tG}ڞ ('($GPHpΈz{{Fӻx?8wjbo@;!#F2k߷xƱLK%LLJ0_'L&?`%ڄa&ʲy`.a6!6}z²@Xf|k&a=ޘAX?  \Kv6GMDN&l2&SO;""aS}M "l)ubUCz׊#%џ 4'1]pcV1Xw`±|XF8Gd±֒ps!6zoyb_yK0&Yd_<3:tu~OF8v l͋p$K2t;E8pUҾ^@8D gn <ԛe[O8O7γ7 繹=Uyb.'\c W[%*A.a%kHf.لKلpi.m&¥p 3᲏$\zF"/k U}3^J|<^C3U  J/"UR'\,ϱ:kD`p0Rh_`p ).DJ"PfFLaT/%W )"Fg,1"}OiDp$PH7-}Dp93&N[ÈC=>&ND D9ɔ7Dh?IV!BD(˞e3Sl!B9~Dh/tDW0S>f#lVavێ5'%nDG#%ϔEO FL,YJJ)SdI߹ D"oDd\7YCDV uuqbw:EFO#"qD$1]5f#/qDB^ IDOXIp}>E[f؎%Dl+yOD"v|;@7m'[񭻈vXLw&{N񽣉$"0?~Eğj~E);y=?G]xF՞ >] ,zD?H8 cm+l"aC$ DbHpI$#a1D""?KdDy"s&2wG{DܟCd#2/؈!DJ}D*Od>:YEDSK^V8ZYkoȨDoYs"Cd(jlR<2ҿoiADv: Id >utƺD6Zґ8R!u&"{L'Y܄+m17&r~D.w-#!rS\q&FDF{AҊȽO-| "?ixZ~ ?n̏N" )"_6fFDLyC OK ':RjȀdcd@QLcBsTb Q% CQDp(<# Y&HMWtj\9-'m1ԏ(CG bDqT9ݛ'8 QLK'E QLˈDQ"3$xW(ޫ& '(9oJpd(y%$JᗈRQLjӉR,QNZƏ9 CZ Qq(͞K.!J-ҵ>D Q;(ݣ{z0(=^L#Jh[IL̒OY2,9%Q]Cm(neDY(!2Ej@Ք-DY׊(Ye͸ޟ() ʞLjUw(a%D9Ң}Cwuoڷ\Hg>!ʗra|Ô Dqrx$Q92&qD5W^'DZ9QlKT[tƣOxne9*JDus:κ/ߙ՜߹};c*1Qp)&j)RD-5MIԎpuIԙhȈ Q<H 22b%XH4ߔW>F4 $" Dc1riDc'QB7,?3ʟov?Pֺgؒ+Z-ǯ}~3Mр CE!L4w{v# E'5wnEȻN4$F} O|3ѨerM7dN4YfMDSєq#DS~ _=/L!kG gDs:kD3Khf? ki-ߨF4}DuD׆]; ;$x]?5? }?n 7эHqv=Dw&M槰#()R4 ER2Lb j  ~ ~'J {#YĐw1G }i_{Z'ڏ Cb(D CM+bL CP_HR<#S:oqbD gÙ?+Fbz (*zBozvϴ՗W$FYW|G>Ĉ~6NN&FQ 1֑+ۈbrh<(1֜Kwc_ab<@8Gr+b\AO"Ƨq%]x{ȕ|fg| =1z- $31%MH1"&Rib20bbkNL '1i˃4b9}]LLFџɘ$$m:KQOLm-1'~I17 'f܆ސ;Pnib=:oE+1/K׾' |ÜyS\ 槹 GuRb2PC,tˆVbaA,MbaXy ubtXx(P&.M,B6yb~%ԳY=ۓ~73sJE7XSMAj9E bqm8>?x}XĒ7K,veyR?Բ&˛J!bʐbC,3Oܑ2?X|rV߼gZyby,B,$Ok.bX2+b弓Xy!V^W;^+Ej1qjduXŖv$DibXe#V9>* ZD6#V}#߼1{y#O|<6_1PsbK@GҎyrn ?YAuAW8}`Ogf08Da-aaez8L'3Y~aNqKqgm 28JQ4G488#v28R>08Ǩ:HG)ǔq$q}8/iޥ?ao1:a0{D'VqkYq8k!BC)*Kde<]I\2:q'LĕZWO4`D$'ii6o"qmqe׉ۊms!Lvl{8+u[\xqU'Ľ_q;d܍>7;0]΄+rګ3{?9Iܙl?Zzθa{$w>ey * Do3Щ+id¹ddh;2tb{~Ql;#4@<8(O'׃(լK\>{Aʉ?KtϚўg߹ 9]jN4 $@X a$@͜= q KH@ DN'$ b PnbC@$P5@08P fOl=l`0: 9`g@P] Dp l{Zd8p ﹷ;OP18|.]m cb0+I{txho}#Ig}{b?Ҿg^wN=:}_Փk>2);FR~E j +@rqHH,@-9 rzFY~;eY$R`fgQ0;:m߃Yo /+0/DAya`+`N 0O`N94m4o?֙j`O1W-|̗ρ,0_Kl`.͝r-˪ b PM fh N뮒`qNKB_'xՀŽ,~-ڝam/uS2~8#Nx`mL Vt4-K++Xu@k\o|Ēql& ~&l`ؖq` O {/_ t*gFA`_ kP (W3 7 `,8Cv KFr,s'8Z7C!8޽3x : r>.'Vp%˪\q{c׺nuWKD Ϗbp,wL :{\{R.q> ǏxpwiK4{G8-p{pxQ ܟƂGW<<G)<3 <;Mtk{<w7#kl)<~>~7µ] ;Y,E} 3,H^.DV/c,ʯ^-5IXz ]1$ C SH@;b*! b!&sb҇X{h?Iclr].][g4ihK;j a,9s bDwu ak_ Qkc$!'bNH%z!wqq Bi=, Uv! k!~5C?=SCo$)ok.y~YV7C/Ļ73%Ao BbI$Ṕcر.CǤ:D2?zeH*l3H:gBҩ!iHzux6$D!iɅtOs@r*HNPdpH<> 6BF4 R!5GR} v RI+!R1N~ ސ%;{AzUHo/ Tp ]!9sS)!wl }߻A9HH1PȰ[ƴ P qPRdۿJUPKY(>LJ\ Elc@1}r]L3YA~jrP6*v(Lq1Lϯ\xy۠gBy53g>TǙCyt(sZO-6eP~ [**ա *ܱPt =Tz%Cm {/ ;P8TBR*'jP AMP~*1^PxJJTP -LʤPYr#wU*gAT8Bl)Tmb*鬦=U֩9;i|C}j P5gP6{=R j[6-P[XD"Pjj:%tEh (o 5aP:OԹPhCs9~QmWZnz&Pu};,yPup,4CtQ-x5ԃ>,귲~ P?@fY $;bneH' t4@k$gc=bX ,ko>~-mS7 48zCACfF0hD\F874 C#z4FFL4KCcbhցР4̇Ʀzhl hdƪgXBg&},dzAaGhr&O4Bl4MA**4x?'bo==?i39t[ ih:h溓\B \:#kpz=hxg\|r xPCeh B֯=*7r-'r !qв-m[ vVGoO}?soғymgJV֤b_(1; kЩ:AJ)>^>CTF/p~ @?d?K qЏ~<l Pbtn.?h f:ƭ0|[r0\ҽCoӞVᶱ0] a R)Lòi֯ьKf`ƺf,`TIO0( Wab:L2/iGY( 3af*a&1f|,0KY\;܁G`qE71SXK}zsI}63`]C(a]:`W尞BZ_k;1X[ZjV,X9a- kTX /(+kn)Xs.5'š/aJPX]XݷU|F{*"Z VC`+>{|c5gT?VuR  9әVUJXU? cʰ:r Vw XjnX|ɰvVŻ`Vao\ʯJٰzV`5A~?w7[ wՓ`wO}ϱ{߲o~^vwﰫw7nzrMN=o>_/{aDvP&*vη@/qt>9vCag';(ؙZL(ڶ<- (>Y(`;}`;Qþ#~M1a%`g On}__;?鰯_5쟗SH?~([3pGϺ ɿt^wߝqLopd q׾yD.)8ԋr).zC[]F?ujGs84Ju ^]ópx DZpxá55QiF~{7ptpt*G8'z/COTX)8c|*1y[KḪGMxh6Os*'oKZc /Ql^8>>ǖJ86I tktFٌhGyݻpҩ@E8S w 4sQp2}ߑ;3ѵ?,k-F#dL 3C 1\mqv]ҳap=NpJiӔkp Nڳ=oNE3eu_{Ű]qlpmoE^Y ppָap6} k8CpN$^8OxO8瑛sc8 Ox\.˂p_ )T2 \V=ppY.K)w?.ᒿ .b^ڕeH:NڥE3M:Ӄ:IpM̄k6ach_ϻu}i6.DMp$˥};nVp3C0n&{B 7ps[t9 7_Sy q'ܺܘW2pq.we ebpya` UxXz <aa:1IAxLUG*< @95 3>#],ǖ8OSq=<:F+fx&xs7c$|8Vw&t}9<mzg g33 fwW5|wt|v`V|*F|gD~"g' ?ɱ3џ/jAF4^`(Om-GݦU/ww%&'3W2"o+~Yq[Xr^ SZn-Mj޴[lm;1OX?ü៺=7B i {p4;r _{:/W'u͗ ;̂?濻۳u'7KU<%)d*6#>.;"Fd"zm|!IVr#`P=`VS}}mz9g"ro8,FD4M" y:&!`*̬A*{Y^ȽIl@drF G.{ F`wdSNC<)h?.Ce~̇PENEPDкZ5Tӽ~ Au'tP[~YA?R"^UQ rGгf9G`RAGW xEAp|^P!8`"즀}^y!L-_~FW nBHPB $`,B#!>(xjxR_ $!!c<XVD/lAH$BC[!d,l9!-/6FQQC9ۖ?3{RUޖeԷO ˕8$ !9P[oP@h_a "t8"49B*wxg! &n0SB^Z@؈ DXUCXEdy!a-nk>Mpe?k.bJUCx1GZ{ G{]#>n6:>sw_t#wT[M?ct;vLO |>=ÄvsfDz%|}_96 f=о]Mˆ\Cϒ;99jh9@Z7",Z/Bq9Ds`'iw"+yNW5}]ʨKy3"kگ]=6 #aā+{41b[$?$שPeDM^I5QN#ځKaJȈS5_Gt#qDݝ;SuQ]UQPA9UDBԩJBT%Ua}%Q;#"} 9/#8 Zђу `$Woo--jZD;5whȿGۈntCň>CE^ ѳS݈{A='5?X+F1b){1}!F17h 韴pG:s-GC~BOCvk\@Z.FC|B W#Q?y-~ٖu w q΃1y1c+Ę0~:nq\~=) M2d%3dEeDHig2B٣PQ" vR=:sdy~vu2/8yg meέ^W`j[/;8ZH9vՏ-?+^5+w`JlϋPlϘgs=)}lՏ~?y9sD9w_י=9?K^k%cޯ{zG?ÖӳϢl/w] eٰ]ra8 (xakf[5^[Ͱu:[G U{]jӻw߾wnNg?WQm~f6cl;ld1l/*0nRLmp؞mVe QV3*a{3a[F+޻ۻ_)66lo^ޠK3`o]^ m 'l_^s'> ӻ}Ra>g톳n` U;=y;-V3awvm`WkYU%쪖 ؽUiؽ{vg®Iv/`)vþk^d+yG;a?Ca?b{ֶ҇ |-&\Q;a#l>ؗPy ا U)[h*8.a)D S[Ku`t:0 p0tLV =Q;NkVku?뎕ӰWhQĎGm ;nߡh}UֿHSpWGb GŎ/pdֽGSGj8#Ft^8QZo)FQepGk&UԀc%8l9&Ip>8o'3z8˅wp|DP7f,$ɄIv?샓L fމ182Ӌ pzt48=Sc*;v<854Lpʀ` 3Ùy̽ζz\ҽr<[8Y6}ul "0F1k ܮ/_k̬}`CD|@aG0?ɣ08Ƽ 50Væ `Xc}06<ce0\[9~~`g B: 0v^] W=0`8Ӻ[$]57\#]~wǛfϿzfϏSa>ӏ_ߺˏ_7}Q\KFpq~O_ %8< ggxJtHsǂQ`T*9pl*=yߟ3_SgU|O+wQe \8Ef.\hÅm/\FQ̆(Kerg9?-ӗ[\R||\"Lۯ9C%%.rb3\&åh$\Kr:?.e\ZV)b1\wթ:x\@A\ẇj^/Wr5Xp=Qap8ә_kp}pmbU3pcp9ncFm"_a #:*8M:7yIM|^g4n|p[ n-jp;a p},g'Q ۝X~p:3[M{y0{`<|t$G M%_WpoZ'vWLLbep3<ƝX>xznvZxox?ix/.haU1l=`;l=NM+{ͰνA>{"Bf=yIؓ6{2"›$ u}xO7O3tǺjZ᭩ oV[ o՛lSSx)GQ^ K7|gVpφi>޴oU'G cTARޙWd- %ao(mžccߴv!_}|j[}y&k8ȹ'D5ݍVDs?hqp6AAA}&\nfUegr8X7q'Oǡ7y8ۉKju(_PSw? ߃zכO״E?Wn})ZBD q/A(#`H?~- 0B-+(D=Hs +Ք\0A}XmAzX v:n l4pBXKq鞝Lp̹֝g4ܯ|^wsڗ{POr\!!2!2*!۪ 4"zPX/{#GVAΏu7pve B- tS"BGZ1Z]+"gOEh,bzd5BS#4<гtE^-}S Y!B/+ mBOB:CGM} )_˿ż/Æ=Fؐ* 6G W TD؀LG & l|#l¸$6:Ea0 -0 3C30V uBV%ŒD61a4c0oAEn9ڏ05o#9`}}?W_;b#,~YV5aWhfJvyJf#s/"SH " "rpĊ獈'qq B_"' r/"(zR KF:D:]F1iB;4띊݉|H:D!rkˆ$TiDGLȓy= ycZ"Q5b< AV QDwQ 5SQ¶DD{׷>e(z22@; BFDmD?؎#+UW VsQw8*֌;=x=艷-hq!D fV-k@D"Ze?Mm<tѺc !ۃK.~ZCDW!eR#8bx"Y ~Dֹ7 1 916Q:{zC:/Y^RB!HXG&5lFk1Sm/Vbn!ve !v b'@옥eXiEg1Ĵ"{ 1sS=CWw_{N}ŠM]k[9bP}tW݂^)(6 bݶ Nius nb؝o;MWhC쾄:z|{GQYNlGl bL{q!bW#6w+,F[GV->^ۖr qSgU8;8׾KMGI-E\ją.C\P=tGCuoT!~ dF|8WoA|oyy-#*: 8q,Y8㘮7-HDZqlyL億qH Ok?e&F[$p_@H0߅[`ҀH0HA^@‚9}ُA!a9W# {H[yH8$F$DޢH8C! !6#! 5@B*$r qX%Y#q!$!qHH A"J(f"k,Eg]$!$U^V$("Qb8b"q\$ZGJm$Bh$.Q@ #Q04(;}Nߙϑ`#=[ϩny-[f3$Os==Cg9mÑ׫*I-,HzIOUtI T?Iu6H@R_ 89'~Ɖ1pN~OqbNFOIw7tKHEIH: [!j9 ($eHX_$GCYH>2ɑq!}ϕ!d-#J "H~3ѿ8@MO#^<_BN5r^ oƮ{>{v?\>Q=\坆ܓ8MmliA&cVȧK1ȏB~r@? EӐ_׆Z:_nC~Kj@v?@~[`t=/hP/$ (Hd\ ףجŦoPl2ŋPl`y(MsQKQl8mBqXCPD@?,Bo(N䲡J^x*\֓Mv~5.gsr.BџP:rpq(-Ci曣4o%JRY(Pz&s{ݎ\(m^ @YM(ca(2qD٤|%l@|D6uT:՛Qfq e([M>(p ej(KEى@ GYO@(Y[ĕ\\Iĕ]ٸ2 o+7N%d4w 97oпm6JaT MAèME% \]ȅ*R|(LPS Ge=T^Be3TA)y\]UZLQS(J%UrP%ybmP5+U3txғ)_T*̺PUهP挪L zUoY/} ZG5Vَʑkqm" IN5K6+UJpM)BP-j6TOZjvT_jǡz-To3^޿QP4oʫDLFjLލi5Aq7(Ӝ:Ԩ3 R DslCF3lAukPc25њx8ۜl"<] +Q;v jG_cp]-upqG؏[a:7 o%&[bbF]T7.lv }.6s~Sr-m'ϵegM{xv}f O*4ۋ71-n čqUQ I76R}Cn?FC nFJ| 7.&'/nFÏ[ަ2$j ŭOsq{6p;X vUx&nϸMޮ\} ˯v93\g5='gIqܽ7wo0T}ō/Re(~/ʸ%6=kq;DAƸw & x{qx9^a8}o#qQUsp1{*~XU߼;{χ3Ocad6|Xpm+>Vkd{FAhIlh`k п,D4> E,4>ZFC461)Uh#PAc4F?G4݀FF4:ƃxP.x=3<'W?7/M1#x;RdM#dㅦ t't MItMh Kh@!/MOgݥ;BӛSa?|x^ǣ`yZeZ\DuZ6Ҍt/Bw}[7?D-mP)Zb)F%Z¤ђ4- hDK+ZNtղJm9^)Ux ^;WqRx=^݃ (tZC U3]s^;X׎(ڶ7u5 `A>z }x3{ ^k ;x}ʚzzΌ[Sx+V6^ދKx[ ćÇhCnŻGIvOF^, | 3`zmǂ3ϧcR|B1:7|EwZ?Gh_:z~mN֩hVtEAZMЪCVR.Zuzvu40GՉ Ęڷ~n&Oz;ɣm^wm}fm жt.ږM?波Mm*hCKw<my+|frէ\>KR[Jn]X_ҡd,;@_yUo r·@ _y{f*V'|mͬѮr.YC."lϞ5L]B Fks] }Au navKh_nh7V}S |AAbCDGB2F2=hTNGT &do!KI~E CB#@B&Υ{9!P/"opG!c2`j2`,&xo;>@YddS2x",F&KANAڧS |݅ CT'Cʒй3P d(/:12t\JjzF`(dhQ24e?zR }A >2G22Ȃ = Mu#,gR~'=w aHXF˄e2˝i +&,lO ˨¢`*ՕuoMEX[e qɅ8Ŷl',ۂˆ}k$,ф%ya9nHX KaIP',%>[zrva9#ܙv3h9aEXn Zfjk?>E # K6T A $n aK?a0dmI 󤞇,vnD '_$#xǞkl3O2˜d02bv2b+!ُv$aݳ:sV{a]gKXVCªV^wٝvT #U{>Cg;ѽ}lﯼ_'r_>ޣQLȺddn22ψL%##HdW%JFn#9ɨ[#K^&d?V=dƥa[D8q a[%lz3ۢ&¦i[6m>a#liMa?NBf, l?q"l ڕ]+&lWw+Xr2vX{@!c^dlx2b26Mt!cYb 2mtG[U~h32n4s7_:Mƽ1$n!n<& ȸKd\Sd\2Σ)"SɸIS8f2n'WI&"J&pSH S^ Mdi+`LXIsU2LN7 $u꺃!o@m~h?aEw+vO+rL!/ c|?M}uh231g Q%)$ <H8B1=`@8zb>򓔆vS:pB&& dgdr*\LFϽzH#|,|x56CƇ[> e ۰c%|kMߚGog!MHͦƋY!|Al/P6'|2wξN"|S +N{AT{>(?'?9OJGa/lB~_`6J5ޥƱ={~r_IS9^wk"gWpY"o+k՟uJBk"Sμ"SNe6dJz/gWH䦒)٭dJƇ}*2:zw7!i;4!"͂"T"p(XwhD%{@M->H;h-hz}i=xBV+D"(zKgbDPTN@ˈg"8*A}Fͬw<If3"z'\aѳD0f" ZE)XyD0npW-1{=\g3D~M \"DQ%UNDBED0Wwv!Dh9Z(Mt^Q!m~"н&B DhX""mR"B[f2q7"G;%"TNJХID"/]!ByPn5ʢ3 O"~͠OҦnǿvԧ͞?wk!tOU8zR&B/e0HZG="~ 6֏s25& D8~,N8[=C?+kK)\pcD8b+ga0>_CfεxW~MW#"IDN)&(؇{\fJD-1DtC ]GDQU:7׌2 u&ѽ2D;csD4r չ]OD8"zcy@D+4he"Z,KDs~w^kҫ7cb2%IfbvJɌdd_50%3<'3w/&3;Tsc'3+>֎dfc2 OD} CĂ) b D,.;iDĒY֩d",$buD,u}D#OLNQt~". $jb>7p zW(D\_#:bfv#툸"~r`:Ei.V믚L7 9"1}H~Oo&Rc)D"uvȟUz j_Cic"5].2;V2D~3H\&lշdV2{ZfCf@f qd~47[V!k̠Df "Cw~DFX|&2SuY̚4"cQOdl}Dv#"B~GO%r\"u'rqDNM}E-Dǎqo$rEDna.SH#rrDY8UJb֓D. )&lO(W"z>bAWmZ"?#s^y=1";/%:o|+"Elٳ!7>L$FljFD>zD?=ȟASDAU((3 oO䬈œz } u(,~N1˾G|BHBB G G5B-Q8N⃈ipQHAlQxIGDI(_N' +(X+V87(.K'KQE#,DQUQgJ6EO>(:s5;e>ל]ȾYβeYwgwΕ()+%46QE$C4QZO4%m]4(%=Zwe5(m#JW% 1[ALD۔DTZ{}ۗ;OSs 7,絑yɼ}d^{2z;w222,GԆ\!>w#jZ^zL_ V^x/gx>gD}uD^B#+GNh F4F; _1 0ZM4LBDæh0 D@"D#3D4rFY&ѨZE4D^IhQ!v99hL%RDSu=I4pMBqѴI&o6 "f<0h)"Z :SZJV%Z$' 32-Dug.Ѻh0"Z nDVh]H+ADʓVuv>K#߿h})a9cd~2a!GA.d~E2g?o9&? ]zeZP){ݞ̯>OWْd]Ksψ'܃h_m&ڗ". 6}hg %/<[ܷHt$:6Btt͸Bp#YfY4Y*,ڛMm5 ˯Qe>kFtue'<Ŋ螔"z爞*`0$zr 8ì􉾚 W'*5$J" їٛsC$FDŖL"OZb 1Xz, ;n 1RL0$FH6I5}/MeȲdـ0E?Ԭ,'DN#KeΑe^rdҎjO\_.1ٛILh'&މbo1u_ML܀XAL4>d1[2'fSLV@1bZc:,FaP@ qĠ;30ɢK?ozVv쓃?28 !>)u: Cc814}6fL 2xs1 Cife2Gևgbi4|bI kLެ-Wxv#^ˆs)_%YG:Hggn1z~Fga䝸x$YGo;M0- M؆mw< 63EYփͪl|wmCN`kW`{=cc ypIucxb bLC+bԈo0vS5& ]}ۭk1iVq?~WqM_0{rCS+ޣ7Zk;j= ൪DŽL8 9)[ cB'L*0QBQ4c0&1a?jk0qjLTD8߳~{Tc?dG;'w`hK]z3|] `;"ʆ`Wq(؃}EsQK`?UrPm8q8#r cpR\Ťi1))4" "/)3 3(-|Iq1%ط\=רkb;5?&}E<ͻ׷v-7ke.Qp{\ue5*ڻ޽ju'Gpi=ǃǵ5ϼQQF3x h"x,)<ۼc_𤦁%xnO<15Q*>ZJ[r5"n={uPCFJ7Q I= ?fm{s?Շ̬e~b7SncʭOiӟ` 4yZ 1Mqq]=O8<[LZi1tv.=Ĵ'0ӊb%iL+yietOu>5ĴDzֺ>Uu=i@- jkcC`?'@ȆILft@@_y7 `M۲ ۪ `m@pAS A~?N͂1 BPDbG!8+47;r 5&AР_7>_ϾIyWSWo)$AH Bb $BR $j<{&|j"6_wC˜8 !e(dm!l aiupUL4@X‹Cx\/aÝ` '@)7@-߂pclpҵՆ # vb/z&o L71`Ø~wڏߙ LFg!2@" "\H]{ "#!R/ [MvgDȽ&64{@5DhBiDY^A5#@tdDG@$ U Q55g@4)CqDrA^JAtRvUHŌ71031S)33-13C1#{=wf\``%̸ 0If6?fn!fbF[\$ !vb7!qbGZ!v:ĢۘU_:r!?dl53[ԯz8f}Y% +!NN_ .qQK ⒇!.s)A|̇Yq&g _*e:wUHx dHFA2l6$shedTHσd~#$  y)y2:_NϪAqWGBj5$mdHB~$x!y3!yo$BE$Q_;Wj@jHM8)vڸ:HM2~lo!d')l nѤxW~3oY!m(2 fCdF@mduG4^2_!3)2fktp^dDl # 3df@F<2[ #5"2sAf]ȘFBf+ȬUVY2Afϼ{l|ϳ! ޵گexdN~̚Vo 2]v̋y;))/}NOĜ+1sWAvx dY!;J c!>;#KLLi@(d$ {<'u y3ن}pM}ǣiMqP=䄿BNt,fLZQWmN~bȭ̈́:?ȭ gEmV m; Grolk ׎+Թg7Un_ Ґ 7 B~ho yUGyÐw5r}fs~UF6Ԯg|h!@> !G)Jq >C>i?OB>y'ȟ|(E SKYK/K/ɇeT A  qv(HBA >ҡuA(P^ [(P½p(' l(>D(:B =/@q4wow }6A1$/WHVL3+ (fyG(1w{Ce-_BI<JRPS%u7(iB0{ s#BY^sBY- oCYrP^z L\s/O66(}+B9ˠ\ {Sx2k;/ G&T(^Bg7T&KA*.RCe TR|PT@ED* y;Gs*gbT MPYU!PYMglBuhجVP.o T<ļǙu04< Y1τPƗh&ZOOCs4GCS3nASa.4lN}~ [M<B G<@khC34@3.4 /^ s3 ;yi44/C|64+@R Uymr u<.CGQ{d_}=kLYeGg 9hͷZ|g{i4r_M5@ZL(565Zl'5^ìzQ֌=֬В(+hi@k8֏h9Ѭ1Fr-C-/h򖇖\h.;ZCm[:; UOϽj c~OXջ}~~̿7P܁\h B;Cġ߽vq)ˊ].+3]! mо-2?{vmnA&oоOhi6_x0hΐ1::,3ltBu3tF@gdMϥ~)˨:cAgn/QህΤl p߇,L_#@PxGw:jxÏ1Β:,w05tVAgU6t,bZwo]tِӻ)wft{?''۝z,66>yܧ̟g{ͷu=EtK:)Љf4=,-N1KšSx\uN3tmNLԤB:uit׭й;.}_,$X~+  "Ұ 7 )ڰ| 俦ZX~DJB[X(]7aL*ιrP cPΝMA*|X*謺jBh,B1X3 a"Z* [y&,w E\;>Ƥbѭ>{;"{Ao t{x)t#yK-X݇ˠ-ӡA8􆯇)F@oT_~\KBODzrЛwMң{]]5z#9zg'Hqz9+Z7WzWz׎AaՍލлzd~WKo/ӯf>0eu/}W j578%7>}_ }EzC?GoB':A6S.6 !~.|f;;owq{'w~~ws?? [01 OW xR|&9€_Sa FX l`@w `+ݱM s=S0ՔY`Uvpz?E + a\ ]Lv\> i0(W}A5;y 8G)J81 04 z0\\/ρd F:0 f*<Ƽ$qM0GqF0- #H F0RH4ƒߜ{s'+aElGLQ}%tdz,$L:fKX} 5,Yf%ƪXZ"K-ÒXbK%bvo,s{,q؇%;axcIv,)OŬ%N;<|%/ȟ|),&TK 1{!ML"KX*Kg[PcK,ðt,U)%f?5-~n;b,eRW_,utїɌDz9X&w˰Lx`Fla,[Nar̊lm,3ߏe+_axٚX66R`V/M,eIXRe,J].r'XY2R,_fHˍnճ}eF0.^l k㛑0K#7=.?t:-yM0Cq &8 S&dF R` Y<o`2&_dH<&[>0mjp| 0Өaz(L4: gl9L4+L8LKV k` O{i}٩sWw`f`fX%l"+0tff +fay&t`S_۳f~7 37s}ӷm-/W|szo~fkL;=f^qd@ﬧlw{mLmj0$qe% ;R,M faf^0;f9Wzw]!+pE Vc30 s@/Fxs07 G`a̷D|0Fips;|Hf~8)ow=_8`~gE6tG{xg+z}LzKu{{}xRV /JQX9c5V-êX a1} ,DL`1 ,$a! ý|!]6f+v+Vy{+vyg{lcyzߍgrڞ88g`/5)lL2aIX,=b SAHt-XdE8,b5>V::f:V c%{=>ϱX3(֌ÚqRX3ެgf֌2UrkmĚǩXkMǚ"Xj/ͱvf1Jpb]f^J_V*7Vm:,cڴr3 ]L kcy1ͼv+ݷkmeN TWa<z`ǺXg}u-5ƺeθqSgPat3ǺJXguaNT:+gX;c)Xi׼ų^f&3gcsϧxuXuQXw>X3 bgc]uL/c;ӿ'l\64]6cӌ$&M&RTalGɠ&ەdM^y^K[r1,uY`i2 ؔ'C{-{fmK[wX1۶t{.ͰejX&kT,,O,eYXGڰ|Bg,X/l`5VC=aV`%P +LXf HgN*u2&*KV\:wVau^VaywXª6VGztXz ky kEkp3EiwտfF+`8=5a`CX:_`} ^u%XuF16w XWº=pFk0lx*,XT^ ˙:\Ѡx2\SMmԯ5L%l)l Ӂy6C>a3 lQgy6brg%ð֫ӰFlݽܧkmblc9mr5 {Pb}mKma 6nl3]mgm8l[&U[_mmc;YkaM4uvb[/h¶`zF)le`[<=7a5DQmc@lX<>ۧ`{xl^5% [[\m_5?=6o uS lS`-a&σ`un ( R<G`'ٛ`'{Mv Sx;װ,R͟]+ag հ ]PziCe.m:f]([>'`_{`1. -S| ϸao4`A#;O S0$ĸ0kE%f'v/ބe\8¡Wj pm;(C sdC,8<ԃ3m8< N8U8|Cc\+vLx]{!%kCgvʧ>K)R ǝ[P pSxOʫ:x386d8>ji( X'iw)@3:p? 'pQ&8i) <Yԙu#Q, gpV|g쮽!8ϗp_p=hIg>w|oP3/98g]!p'ߟ` ~]0}4#3h30&.;08,0G15 }`-Cx#ӣC9 Ue0hD`aJo0VŃ. } yj>ᰖ>E=g`n`{ ֿ*#ˀQF&sN0ـC]F}2(*b33_Re}Q~E`TjqUi`ԆqzK0!@q'm0ҹ{h*!}U`<֢h?OixٟW3{`I m`|m` få\M!_2 .,72,.edA.J|acwÅ%\8 2 \x2y\WE.R"UzhEsvV\'\VP.+Eb .k19#.;.^zC'ap  #%Qp9J ᒶ.rޥ2.R;.erux美ޭ1\n?\k?np יQp%IQW)eUv#\tϝk:[޷ϫ5puם4K {?5\SC?5zaE\ Z<$ 'p}Kwpm)w]7ui삛eM_n)jN1=Ђ[S,ܞe/^w4;) p{! p (}k|Ap>:lK>n%?hOw+pJ;z*Q\=p7Q7=|1#=Y# =)'3[ ~~; "}Kplғ\nN&sw*b) 3]~'w~؟1ܛSOgd?L?; <7oW뱓~V_;A9X ;G1#sv9G]~ N}`=v.Ueعw~^IvDQaعZ;a_ΚY炝(vk=L[9<,G^?x\ K^^ Cq9 x xh;D#}BC?gX{^3|Fg|f\K mYU5b|ࣚص!=c9>}|=/)v¿Z|]:i _rw%}h)R'.}fx[;&/6|;PSAjWΙJ#z-ɬ;"F7G7ZY\M83}!={#7{V&K{-߬] ?ɓ~J ߜosB8?=u&=TߣE74i-zL}f]2 VY`=,<;>Ga;T}\w GK`?j'c?Q& `ac ՋqI<؆y8xS#q`Oq\WД84!/8dCT?D5c:Mq& r6Pi ġ8HP@8~8}šOq 3?D n a?9)c3'~z;\{o?eo_:𗩃Z0?:r|?:ῆr;6{࿙>Von9O7 م_4E8,ۙtV㰶'JⰙ_=װA%89qʥ:F 9N<k^_x+(+< RhE1BK"Xe 5LEb9`6EE%{/{xCxA|!݉?g\;el}}߻{xnwJBd'#DBF |>B)?s GBHB7 $!}!t1'!1rP a~])rFFؙKt e!,sE²","g Er"RNMW#p!i8Ÿ9 N}t"U&"b_<"W""."惈p!XDDADDEDҌv}NOHY !n1"uxBvD ""/]DD3S.rGVރ||O5l#jnD-jC]DAlD#"Q[r-VGRDVFԚZ;|xhfQ$?fV45ёYCIci>唈(mQG9ю#??ȸ582>G&G9p~ns3qtA.Ok!.QU(q4>ѣ-R-9oXD#Ϣ#‚VHA/G܇Q}Mk,G2 @,Wb%;mbN V0B;}b{֕ Vu3bՎ#V#t#b/m@eAĖi JbCf NĶ}o7|;-qwFq͈;\e .r'!/o18hcspL}HWM۬9{hSKgĦ.gtѾ)9]UT_=ְulں/8c"_,qűZw#H%H}@ $( A]um|H` )3C}"v#c 񰌮6Zw;Opd/NT5MhIqI'VU\zI$4Y_r'MjYprNZd` L3N)R41y$E%GQtQ-p2f:Neq#)n0yB-WL~''lpm$ 90o@p; !EP)H񚄔=GREJ}H$#dTCJ!3iHI{2‘,nHIBJG@y]\BJ&ERl:Né8ST 3cg ;2g]{3pFg' uTH܊ԽiHKA~KLg 5m8RFS#Mioiγ橆("- i;c(@Z2Lg+ Ev~1V itVi5VJQ럑vw>J,qCXpvhβ8;gYS1pvΎY!8˻+xE8;E]/qVgPd_]H'׍v^ak>}4OtvP }9߄){.`D6oYH%H<3&p9=Y?}};Gtg(DQ_r gCHB݉tHiS{tMuk ]׬CH{t?tGiWg2癍֝3?r7ߍ(F5Oiֹ'Dt OAi3Ow`ҟ )}FQwBVG$d[#c:2Dv!Ct2f,EL~d߻/pw_~2I Cz X|;{VAES!2,[F{NFFTd"zd f02n/@Ɲ|dϓzsWeAŽ⍂~(? , ( cQEi Q`+Pf4 '`c ;NLUn*WP;ivϳ}ʾs~Hp  N~@Ar3 N ͤ]FA" 2 Qu(CZQp q.L x q+q'&o>;\ą)Ҹ &BP&.… Wp!=.=ƅ@\(p lPȋ Eǜ;⿙=?4=t..]Fm\v'f?ǧ^~b ֣p.; ppPZWf= }‰3 O$R&Ca67 u(|˅(lۀ¯QG@Q?  PIJ EdQ4 E (HnzJ(}"\9s6gޓBi -BQ_TUGOy1GX,bEPGrˠgObAۣx%+IJ(6;l(X#a(NG(j@q>@5(}qRŨExq\|sz\eqy1.O/Eqy4\^> |p7wa]1-ODw\}"={zy=߽Gq9I +vkQ,\~JßtJ93Q-Jq Q:yJ+~eҳ/j(֙9R(]U(@(=XCf(WPHyd=EiJ#(?rPzb0VjGؠ[z JoU23o2֠#}Vu~Bi J?ʆeSP6u+ʦG ʄSokތC(21K:2w(4A4Pn֎QϿV뾷*A5=g[̡e;.>\w.(smBGvF,DЮ/ME~qUEYRjznO`jw}Qʞ|Eٳe({ e-Qeow`}w؈O('("P>>*(DgOxr={wP*j(W=r5MQ>G ʍBVu5Pv Q}YkZ:%(?E<em(ƒw(u~gE]I\9WwW*pfܺDI\뉊ܨۄ TLCԥ hTLtE;$*8k3TZ<3YgO7zPa@❨0LFqT,9X惊t1*LtPa* )X1+*o7;`tơ~-MQ ;TYʉIBg䚀JnKT\G%_7 *%Q9{"*P"J@xT߁e\ʘDT.@e*OĘͨBe{T>ԹʋQYʊE\ʫŨl:OqUWqU{"LP+C|jUPk|P2PkCAgPkoiώO6'VQ\C]MKn<Wd˪>& uC(Q:[uk3gOʨg]ޥ{H hXؙJAE&}^_ ŻݣL{DlO 4l'l`7 lh8J?ѐ\ՙg8!S YryE-rАһw7)FE(Fh[qܸ+XhVe9*n.a։LpD&nJfঔ7n㦼#n*͹4H{'5QM"#+#$H 2Cf%34);TSi7Ϲuszq Yv;e,>/rDָJdMI\,,d-!:|YG=A"{8"{IdoAvrdCvTdo߆o{lٓw#=SZi ϑ dG":cՐ}/Av%s G|rFt9nϐ3Z9c"a!r4ґy9Vș>93~`F'Yu9{y 9{Y|9Gst9r!'vr: '^9 Z1#Ht3\ ːs!rg"+rq/2;=r=;Ò֯8y0޸;M!7 rw 7xe]飮!rBnY<ٍ| ax*5=Wix,tP>F3$Yf< :EFڡ  l2Q`Ww9>Q< [ t9 vp`"C 33 z3-wcȷ(+Rmif!Ƨ5 ?CA? >  n>DA(k{Q='쮳wR.w_[_(oM͝{>-Dᄧ(B(\XEQ:[Vp(mE(ܱ;m~޻iX(<(¨(L Px PxYWrPxm ӘOb>l@aVz>{3$j{V^SޠZEJ(8E6Q~EF5\{h>m]m( QA|(vq~ÂN jvC#Gq\[_@?f(vWA(S^׫6*Cq(>j (>< {Q|1P&\GqӞvBqwfx (~6fs!EKopf¨.(.y)?D(P;k(؊(C Jx۠O[->(i?%"9`@DJ$DyX`N(](Yt%KQJ0\BI J0\DIL9J$qu'x$Q%Il'=QP %q J;vfvPXო7>8`E|5Fwj̍Yca.|n^;>̐O<sთ_-a|)>r'>c|8"я牚X?|1 %+iB|Z~V-uO<1mk%>mǧѭt¡UnA7[o֮ v QʎP9g5*7c@eRTnaͨ=Pj*__C8?TM* T-;kwU쳽=|i^Sߧ%4\ "z U#Pɨ;g* PUr;^kM72TwjEVD PF#P  P }.z_ӜTA<}92Qh"zJT_.>?Os|.P/&t6BMeĭAM&jXe9o+Ps5i)}L_ a*j]DM?jQ 7 Hp&L>CiKXD լ ϋeQD剜3#C4ĐhфD'&MI%J4QhDaBD/%#:-Bt?Cb x=Ǜ9|-k Q3Qru'Wg%*P#*d"kDDl> ܏8p8hqp'!Г8P:]Uk9nmSڼmiֳgj흶4gnZ3gwx5i{Vk9G{?Ѷ cB86_"fıs,qLwG.qG[xԃ8WBt87826]q&^}j/9<1^M򜒊)78先Ӱqj'Nج8׼$εcs p'@uck{ňse|8GKęF9ę'S泾y!O\Wq .;KrE\D\kנ~M[7_Ac:՘ƚܵj*%`INH7*.XN܅ܞ_%Wk5Ox`F<D<("լfkijGx"ާs$x]#K$'_- {}5;PV=9ԙ!xa>Rē 'i3dTC⓾E|2Ov \ڑ$χa/-"%uy~ڦ<[^o#@z6]s~ .į5F:]h3$}?D!4r8C2džm_JFH6 @O'A6z /Hv 8 GEkZm$2$0rB@D81$`8 44N.!Sboz:% ө[(c{(>H컅@1$PՅqI;5 *0D`$4i(RmR/);SLH̅{&'=Ij{@҃sHzy^qW'$íΐG2$&dIFždIF$n+"rlu#E$cz HІd2$3$c:]wM2+XyA2A,?_dֹu#H f{E29H&TH& /HdTg8ɒrvfɞ!n${!d/"KIJ ^3'I6ɦ E$n';IId3<}8d $ L"\k}:܂L[:䶹\nBrIdȷu4wCI^Ֆ՟%xk$Hu^$?zɏFK[QME$?g"yTsƑ fu3V4_[tHLƓJg߰72%-KH>XW!5GH>3o$H~G>'}gH~2?dG![H>N%H>ɗO$l}$iSywIgHҟ-WDRZM `N =B/Rr!>"`l I*)8 $PRD Ɛ-j2[)T"K[7֟{2|~R!oo),=E ~=nJ6s(RX=E*Ia<)&$R6| RwƒBȼ?U.yN"{wI>C)dvOߑB)P"z/j^"EΤ(% HQ')*7#1UהjkRtw su"w51{bo)fxA. f Hqk CbPnH* h$)Ɉ))WB )I%%)ǚlR?EJCIț Ht3) o)H34KbbRr!l/Iͅaut1RfYDJތ[mAN@[8R:OWok1 -ߘ:HQ'S)Y:NJ.R !=3H%\T&\r rNEꐚRcGjN Hm C&-YIjK!-S&`xFjkGj뎐?Ws~'cد}U?_+?gyKjtdJzHmDjZR 'HS^/R;xԎhQ9R9yRRKXMj'֑ZC:%Mf|FPR{bMj=Iz#s'KٺZK'uY!R7ZAfԇ{I>G3Eu۷Ӥ~8ԏ^%1}2i떐Ɖ54?Ƌ ({B/I(i>CoHSiXlWҔL:y^BSIss\4 3!͐{*iM$=4mV"s{I394/pu!KiL!Aΐkd&ixQY&C UYQDNNYwi[OZ:?gs{~?)&-gv֐ZKZo,im&Hk?CiYFZaFZW'ɭ|1Q}ҊYCZ I%i#8i:hzGuai]T 3H ~Һn{CZw]=,'*^ I#i. {OZ>?~GZnVԮ|i&գn:Q71&:np"SZln6.6X%PS,?OݒP6nWYD2TQ~-GkP*+Vm~NnGڢgIi'mmH| i{ ^#iPzc"i$]%I{}viLc8mZ|+d=ǒnʶJHTԐC%n F Y'DǒI;%]%SnN9 >ۍ+I;5y̌s}ݙGwmHMkHf"C鈜%c8tLIԘt RWHlHA!t&u&KHo2; ~F:=IrytߐIZJ#_LҝFg';Iחtg뷍tWdP]HOG!='U8;agǸCIύ#Hoқs =Q[@z˚kkQ'IFO{trI>6ϧ5\hDzV>X^Izo%LO;&}sҏyO~? $m20' d'%k`{nl0'ku dpZdxw #Ç0O#â$2,:au2<> C&$˨; \_{;kꮳҦnp+GݗKU&=ŇKSV,lPbTgaר{gzu]f7u4.gjؠn;Ɉ  VQj2!#Gd$9N;i1M7E2^BF:+Hw622% ddkt $#se*21zQ dd𐌬:3|9C,|ߒbA Q`2pit[o (DvZnm2k`yp/ZLFIO(ٖΗQ22N$3lƙ<2J#R2OFUX$Ku&cdl4dpdNơId0bƍjȅ Nq Ud=w"Xo܇ r 2yN&/ɛ2ygE&U[K ridL/'2@T\-:1'.t>NG)d:}'ΰ"Yt'n#-4ؑLW3!A{_)ۇ鳍dr~#3 L@c)L[&%C|q6Ya]\GfeS*k2{^6Ͽk5v2U$s2$sj2:B}.2Jn5ۯ"s 28̝ג$A;d>n$Ow}#W&yn2z` I=zP>c)Xsz`8D=]džPQzQ2Se T}O= GQOԳ/]W9`zC]@=sRd1:Cˑ oKBd8Qn)Au}d,L duYn r@_*M@/AJ 9AgmA#Ay@Oj p[඾` >ຩ..`h =NԗW<"wxT   |nok9:OYm*wͧh mZk))6hd#s߽uqvWKrs&;O 8k5ק#h>&.@96V[0oPs+o8i MG P:݆bH@OAT%.,dHHImi\Bj*BjIcnW[H@jaOtސVz iُ^h)Q I!>!=ң4!=r?Gí-4kοu=ޭ]c!}!r gV9y?9!rCCnH e-yb2rK @cn\Nx^A^!CNBnmgCg@Pz!?9cB~t*4MkMޘsj# 76.~= <K(AAz@AR bP⃂0(Io&GBt(A 9-+(B[;(*J@QAq}tk-=oz+JP >NP +Bq{(f@`(,h(ek# P ŝSb/@XCrtzс8VJӹl9?΄_(.& ,Et](TtC.00_.w/t.[%|7Y.;%t{3+tyPT c_T"]Pj.(B%Tyb[ C`XC#x02ix8*Ϡ<*~+D*򡲠Tf5][zNc8 ˡr/TRzCCJ>; U"r@ T /POq6T>JE T8*O`#TT}[IP#=W{<5sﻂ3u봯oUv C+@eX{C}T0Au4T5(TW J?X UPe,zCun$T眅l̇8{=lW5# +Ue6vyU-]2ht]8]e3A2 5P50Y]?@wPwoJ"ԺDAu: 5PjP^n PS5ö uu&r}~̿5֚ܰk"LflOs9Ac'+C]PuPb~qy/j>2߷G*Aj%jGG9jU?Zך~_+mnϏV4Gks}kxP׍_] ԍz@{zouqz?V?2{>QϠ~ꙃ }q~5P|f!0Wap3ae%ӔFYOh<ohT?Fe4>B+4^&ohh@נIeNIԴ>hͅB(D|%l-4֐ . QSfBk2Ak>7f_ztPB=-,v_gC-;9[hs,vAmhw/әй:уs tBgd҇H P!tt#:Rm#9: # 5pv̠Y]]KrsC}wydӟߣ^X_0ο`|Z&TQŦ??s՞?w?g{} x|n:?x?>W?dŸ_Uoҳ2:~?׋/ߟݿҟ8Y?nqZe[+ݿ|~;S1rտ_'o[_';uqVb|ʐȭP|?&~?gFmO}}h?￯w]_~_Ý?t)~O8w~'߿?e-?h/#;orM=~w:oC"|~}5Kγ?|vZm?Sz?wſ|;|?o>`}/OO_?{~Mkw\gm;B5䆮"tBot܅.ty4_]Еנ+k ]U'0$/k1}b[}!p:@vyj?!:zoA~[#>Ω[s7W[OMzm/@ 8CCá( =Гx.54AORו z*г]=c虱ؤz3:Wk=i&s_[|xoӧ=w譼 Л7"a>6zˆ5&ުƽ_Pu֍blez;Ao[8DzGBM|V۷ zЋ^A;S(eg+u{^"6U7og }P~Go̅<+ݫŶo} .~f|g cI oU_\Я>0?_ذ5owm@3 xad`5{àFhK@S ca.`0.Z:*[UZö0ȁ!N+aah?6Wa8 :Ѕ#fp p2 xpr p 0p ǚ%._e`z8a8= }٬3`8H}~ԌWa_mnfS^ +v. k$Kah ` 0wؽ~R0a ômy1]uw<?7rRMs'5}桻kGn|e v{<}5tw2Fk+teC|`ľWq`P--@>g2¨H јshM azF`akn0yr[~0: 74˞Xw#էXƒOa,>0c0d<`9F0zg af ^ }eˀ0JsQn?nz ~%w2O0 wdmO0A0QbDt*{2&0 :X>]`bճe10ea&0/\ 0ѵ.xc?uk|&LN/]*g0`{ɻ 0qI\dq6L=߫*T~06aL>d"&>4L^)ɋ90UY[kaj#S}0y`:tiL 0]x_.ԃ\5>0 foaf0tf&7憆 ͆ي}0[%\`()-fM4Z<0{0+ Y1-Y;=cSa7fO[gZnay=;yGQwB{˾as 0{ v5 sR̍/#rL;Цv sf E)0_ s0fz1~x 0 v0:0z?oJ[:i[~m}~Q_Һ}U `-vu ]OyR1OÚ ˃a{a{`t `yzoy!}=Bѻ,VF`nڰҚ +joNٰrXI1J &jgXyja5 fՌ:l }a wyzs V/{>/z)Zk֝aɠk 2+VXNºXk݀X/X:(m7nI\=\Xjeax ]FX/qX{1k?ކu?=D )h'¦>la6*d免ElzLYG߁M+lvfGl6%[$n936'MasW6wg]|cmQT4 mm[rv+vօmG*qölV 1Z9.?[ k킭=sMu؞KmM õ|S܏ڻ76c7lӪ|`' ;Rؖm1>m3lXO;l;6X7j;]3X{-'Qؙ9F;~saa7 :`X;ޜu7~]v vKî3vEΰ+])m]?`->®b/8ؽY oU{*a/:m2؛p4S`w,L}&X~mد`# 7[EZkWK\gF]. }=_yG؟C,8c8Pw8 Ց62-k$ ' ~ph7/jZ+EAa^Cpzއ`i ^p=`f$8Q* 1p\u+8tUd8t9p*8 `)>1W?>8vE90ayiW`vZ #p.gᨲ (/Gp; G5-׿DNkO8z[k1;P8qe :NMs3O5XMl7ǔkCS-m~6[nqs8[or?#ep^@sA7诛ؘ3lпlOb@`9 ,Na@`AUb2)b)$0`1Icс-G\1i%vĀs1t$À'f|3{fo&‰N|d6Nd 'p28 i|v5wZ|Ni6o >kׂ r'Q['y28ٵk v8Jswg8s١3upy&p{s(1a%'WI|\t3G0?y>8`u~pNf3|Η6b.ϫ9_9pbzA_^aR Ap~e/\$Am`pg m;0X̳qz]08L1x. [5kE0s C1$ZCc zC_>S1r|ڌ!m"T+f'up.aE.jeth֛.pmM]]4jבo2.e8\ldex,%>]"%.;̴3ې]ް3>?.qMZ8#G'Oi:.W3%%VWT˗I4{PK|f[\><\>Ke P5*)*C0T%( P-k[41 ۙC;yb| ߺ70CP'k_v_4<C#cm}ml[1t2 ]t}1l8)~cv׋cxE;n:c-nZOᦹn/> nM Zp[7' pcSn*!?n2QZwϞO5z7{Ɂ[wy}p{Rg0Q#L0#`O6Fp;cWGc0ږ5w3/{nk&lnk& `Ď6'Fd#Gwň(a0? ҘkN󄭷֮`1Fpm0rl -[02)#O(sc7FqdQt4J0+#7Y# al,6#F>asOGv#\0F&Gb{e̺ KҼэ]QY31B_W6?7~F3Y̹~bQףalt }[֭g1fk7m ]cMnat,FKnhP^17u[)F7h(aҩxUFfxO}"3`tJew}LT6h}߽w}ڃobji{cc Si1{0sP*F׼iZs8Ka4ƨae}:10c Ƽ+d1:1pi)}cls7;6j4c}hFձkM0~Lsc~ n+̱xA9v^MϾxi}s|+H4>ǘ쏍ko 0;cyNb,*m 㢟c\T xqj0.2+0n:ƿWb-&\&LrLPUń.٘:c;5 0L1Q0 b&DL⁉=1y%&Dzy&c^b0qe &ŋ0>&.d 50`pLL`sb1 LlU:!_Mܵꁿ^wk<5:>8ܽ|W0db L`|JǤW0e:&]0hݓŔ)˜g'0lrb*Ia*<0S0uM1}`E2|=0 SjZtjfc|L)iӎbڔ ,4i+0-DӶ,L *Ǵ0mc+=͏K1x5%\´v>] Ǵ_0/i/Ѯ_}J1$̒ ,Ig p𔍁4g(eY̓61gC˺u?*ЄgjZ5o0{ ̞ٳ1rm=ֈ f-՗1;/fgF"f00 s c04*,B5`{x9hˮ^ ז -x-/o z2^Gexg1uWTV^+^Oi~e{6k:^ xpH^b^{Ryys9q> r6o3,.{xnwۄ-uZ) oXx[;?7v j]}j)Wb=x_ uMsϏÛ=Y0;bR 泹W`6cJr :'x]|z+ł1X  -JaAЧ}r[`Af&9` Xp.`t.,z 9)I,] 2cA,x 7bA9T'Qǿ5abĂw n?|$G5>1 q3a |4* >| >c LyɾqWτԧ!7> >ggUoO1|BяX _`b,,XXr +(—{|q _bᗍXy5VªX'ѵZ幺"|;ȶ^.9;~RN"a&8&8Fܢ.*X<MƢ),JENXt}$];E`х9KXteaQY,bQ1*gXTEX>Ŝs칱Xzݺmb_z`<3,5M,~ȐyN[vXũD¾i3(=cX"%rDfymimMQq`2c1,K4+^c%oSMh~[Ē^XS K>cb# 1`)51~X{:wRmXj{TOKuT:vJ!k _g- ,v KkKgbif,DXK+<,}KLiLoVޭ} ?+u ?)y%2n"pr~~s:oZڦ־1v_x5vgoWWdoK$Pt|S='֐ VSz$3nτ_}dvswN4X)W` gɓ+_S~ƲX)erű,k>=ebQ,˟՘ke9?pw"Cg,PŲ7 lzV> /XG+zcmVYP;ank. g+x+Šk棞4'nOm/0y+vaő 8 +35"i^ܦ XO`ť6X2qMp?.?jј_]ݨoeH"Vnb x{1a@+#$sB%VʓXy+cF+/cel/XyGv},^'^ TJ;V;j+X} V':clՑ:9V/j?3^ š M,5c-kBaMp"ּƚRXSj5W&/ kn\~w5__qs`_l5cjTzc'kuĚ7LLJ_yRW iTM`m{iG/y9uKmkQz g5a5?/{巕ko;}8=``)_ s+?Z w e/цY&4>;k-W=Z0okcJZ 4k=cʏ5uZ/o}kocmJc^$%=^Xץ/b]Z 3 9G>c}x?:`<LK}D*n;.EP$s!ZG#@}խӭoc{F[c~m/bZԮUw'w'{G^Lm-_ `g!`/K#`@~C~\.2&Ӯ+3<0٬i^rݧk-yfP3jhk_P,ꊀ:!`uHP3 Pe!"PҗN5E xZ^ 9;ׇN߅@T~s3~ѧJ&G`SDڱ߃"\9xQ皟,G1+x,E`&QA`g>m!0/!6aA351 l r6y0m ~h+a`l\c`X 2aCl{Š KGc56, ާ/~ 6:Εiz G  hN>gPAОE6l@~NDqQEDVg1 [`U?lX-Tazj\DPqAPmFP4#2G!X%-cd>lqgc3eTlٶixnlbW{y}gw|g~u;[]jزš}j/g_>ߘ+8:f7ӳo{][Rs[lEcw`-awl`>UGX8ӽh9|Vj\㻍`MtD{& ؼ={7־_cw67'BL滞\Ug"x}; &nCF!^ݦNZ\c|>բr=+\B ض۬`[_2Ol}[ 5<>T_g#DCBt#[?h|F:B# 'B:!DS*\^WZ}ߖz"j-Bm@C BlCq@r["dVqBd|׉GZBUU^*3ꩉx iuЉ;:WCϓyrV[~]o0H!tBYJk~1Sz2B/,B?NBhuChm\CeyB#]Jl~|| }{bPl=;*aul8c5ê9رpmu bhG`Ƕ ر;ͱS9;;yagea/vڎ]+|Gb SmX7ֿ5c#v4}:z9?yCG>kT+{b @;D &{璆|S޿%a@TXM)asf?a,a3@Xd0@!uXS6a.6Ha{uQb1=;=t{xM/-)=wcbt==Ggu;"ܼFnتݘSWDQw&wp'wj5>zG\G{vm6 s Uᫎ |U/3B׌4s֮'GBx*+"< Ÿ\D G' H%3DvPFB("e R=CDE$"y襬kΊt`B8YDQBԡ{7!2r "#6cȨ_/'tl\\d;"kv/5e˶^+6{E6`>-ik|6]>;<{]WwP*:)a{ ^~kl=̣w15`a?6tMVwt?{j5{ Ҋ׍IaS-uG}i96þ7h!`ߒؗ}7A*;0#: \Bp j⠨/RqPRuNGnmpPK5;Z)nppu pyE88U'83w9N`l;<8Q@Q5Q3!j]DMف]5F]DțQ"8^ӈ>3,e(cGD-GT͈2(=qDi!J4"J=Q ?mWff|?nD#j;QGlu`}-WqBTeu!p(*]/eP¡+{q(-C'p4ơ;68~w@aqT*C+p(w!opX޿ὑ8+#pm: ‘!y8 GBv8v#{>G(Dk!Z-ѪlUލΪ Bl*e-5ђ-hᾈ:hhp>y}G/@[D/g z:D_؊s} "LD'mCa : !5G%ԉ Dc-<=D?\%X j0b,ӫ=bzd!F1Xm]]͂gEX更ΠrG-4[uZkŞr#f>ü EbguGPlaAVv[q1{v"fb@̍k&=]ic聘{ ˆc{Ňc7pjc)8yxgv 8.ȏqgھ2Zo~~_yG-6[w^gZחcp|1\߷ #{x=8VYi8N3&ضsbymp\(?\,rLGb- W"bͥk݋Wz?v--@و*X=pFGdĆBG REl2Įgu,k v;2#.fg?ެ>wb? NdoC>O_1遈Mۇ>Sk5zA\;ęq3|?\80Z7f2L8u?Yws3}<j3'hq> ggαv*#nⶇ nz"n"DsAkb;"(S} ^u9Uv#^y8J/!.1s~}sJ%wF[Oߣojx[<@$ďx7Zx }?U;|,هŽh!#~'לEj[HG|h,C|#zMqሿ Ocwp}@눿#/^B-K;a"a  "$ۂOpA p3bp, 1H8䃄(= a[m/<@k7$ 'ڥDt൨hD ;-q3j8Q(.DJ{$oDaC$DHD#HBb@$r#9;9#Hoq' 0u9H-a c$AW g!qf$.B:}o#quWe3(6unk;"amk58v'# ka$~[|$qH>$Q$ '!IIHR$ $)!IIҮHj~Kǽy4O$M)4 Iۑ45#iB$-5IaH:zIHƸ{tGM[HBғHz I:I/d_xq'{⤙NvN8iv뗌>pr f} 89'Gɡ#Z⊓+׮_}v_e`]pr'C p2dNn ɈQqp 8j/cp*/NSIq+n_ué^8uA<1Nw^aOsN8}m2菳qsμa3oLp*y3%?K'f؄2Z8U~Ũ78;"g] pv(Ywxgǧ8pv/neJ8;g}pv+.q]  Ź6qK 8p\ƴyĹ87Fm8; R7gT¹Iqn΍c36ܲidH$; Y m#Y%EqJ"%{ܹL;be]oI{fGCϼԷrnj'32=|/"6$gLEr$߾UHC݅H~KA|^η`0y^Qy,܍~$WCr;?M@H~oʑ/o#< /^H~?ɏp^T}~mFū)ì7/9Og9-ICF-q^W絶wA.%o:ϋo pa\`B6N\ Aqa .l!Fw\zmq+.\ 鹸(4.=b>ۅҸ.E9p<.8Ҩ=)푲u RXxwz=ڷ\|Rf %lRBʾHIıH91)qO{)H5Dhe\vLpł\0ev6S)lQSVl\[sVl\޼ /ap/ak\ɩ̓+jGjW.:N-Iwpu \]WWtUw}u`\IzX7\5p~!^q=w3R;#? +!Ue#R;oE'R'#UKgR-j\j~y+AsU: R=̛H]? +#uy.R}@I.%T[ۑԴ ^@AH=H=i!FZ$!- u+6ZY߫ƭ}m~:x}=~?~uok=[=6Uv_-kP=={ww>x(#Vt6HFzgH{7֮c!}Km/FvEHwN!}o}^}?<{䑾yog6d!=G#Z$S7&|p? Hŭ qa7q#7pcDrÍ븱7V*s(ōB[xq 7>oƍ )x7^eF2D6_tdCFw}d'"C2᠉ ȰKBF?]d= } so#Ãcqm][aȈQd#Q$rdE,d bl7qS7.Me767]nո9 67]ps\.n# iUnr  {7fOnΕ3N}9i<Vf*nf$nĭB%*؀[O3p++>kpŖQ(nw{q[)nnpێpE1kq\[ٚ;[ pgC8l$qw= AGwwG{cL{7&n ܽĴqos)Ľ!:aޢ7o:yf6ͥz޹w6N^\^{*O ýRr'^+fk!+n\oةzLOdmD6쫀Lr s'. 9ȜqMaiӐ9+6!sY 2^"s)1io!sod<̠LpFfL2J 2ovGŃȼ?,c<'3 Lgē)xⶭK^AyYȲAVq댬Lrfx@]캿.YfȚ)Ț@u>ݶeZ3Y Y+>s%yl@&׍l^"+@qU'7Yu}7ǚKAVp=k2ޱ=V_gܻ_V-m-- =,N=`{w l>t5Ol=+!8!r3tDgkG#=rz#g0rV"Ǫr,d.rMCcC΂g}^3w\y4uRס{ݮ BF5b@nslw~\iO)#Wd rՇ6lk3{;Da$ 2; r7h#/|WH!wY@Xf!8^c{ܔ @n,r#7F KO Đ'9}ܻ-="6r0Bn;kV@nUV,~*䎧# eWX+|e(F1us@ѧd}Aѫw QT(^bO 8Xs5PVNuj8c2ogPBqSס6_EUB#(Ny֖GD#JTsQܦq1}J ٺ*JªP%3'dz7LU@ɔ (%ףd NL6N~fLu=F}_{~eNO_;_~~Uo.5Ըp_B,|{Prg Jܸ bE>(f(r%d7wwS;S3]Gw%'.^P*tv*-SPMWPyi%ۢ4#?JoBiH)JGiRJc?׮j(`7Q Q/)x1xx<U@xn6x/R+=^nB5ͻ9UFZ%BaJY 2f8޲ (ye#DQ6!ʆCِ(eyP樏2d MeY-elQ}GBY,l:ʞHԮE({fP#kQ=|Au:Q ۣ|b;CX!Qr5 nF(壄P>zT|;?@DDd7eʧ1o @Cڢ|Q"ʗh|)Lס|E%WAj(_( PAn(r[|J|;F.FvdG|o(P~准0;s ʏB19_XvOl (Od$94l @yN_(4}\k'P4vL%(;Q~(a(^2v(/eS /dGR!?뫐lKOiZכ_funV Y :t1^o jdGT͂8߯ hT*}P6*腊7Q ؁ 0 Ψ0> #Ttg^wP1'*\zbHT z gyT @tTؽذ>`Q1Un{P1*橢bk%*6ơ@T㊽Q 5CQf=钨H݂Pqi*."G.oÇV X|y=|،>2>t<7a,>ܹ^|CPuaQy]W!*362>ZnHDTێ;YU=QYO_+gM y|=_}(. p',5ErǗ.5ID8ԌUB͘IqkQ35fl@M\|/4LԼ]q) ބNb \"$$~D};ᮋ  rEO4וh!Dք6#Zyh(eG!ZG3ym}ͶD[%L'ڴhcцDw n"!J#zlDw+"cqǶq"qDeıw;q-"8nAnj#ڀ8h)uHE 98_#v3SP8F' q&ήĩ"E[3̇8C#sPܤDE⌷!#jy-qXMgyqu%.эn,qG\BY%A\Y8?]'Ώ +K2uڷ7Kiѿ/>ɉj&ח5U*G74K#nJn@mJ7y3-^Pi41,qL$##D< GO'U(@yN^ v +ORA}B*:S;jV#H4{8s$;HxG>-G‰ϩ:_DVS{ι$6_%,7~Kg3k6ߥ>k/2?~ Mw%N"H( >wun̵iC"HD$"4H "^*WT0DړS 8&'Hdh : WId8K"I$,Dv$>l$t5V}4mkc˚̟{th[:g(k.o8<=I""$򘽖rLr9̫$a2n#Ѡ\1=YMH4_DΑU$@bmo Q$1<I&)C$ehl]z0I/!$N]H؁IZ?I듴3G LR+ HʧRjkH6z=3YZ$]y7$ֳiܿh&NHFt T dHɘ[]4CF2חdgLK79H2{cH&.db-I&N2'd.3+H&;ɤU6jQB2=QS@2õ$SzdY_r)"W.$S^H2orI y_|~N,4udwN!Hv !-H6hnJΓ9$Adސz3'?#J7I0׾$WjI${&Dl|=s%9y"jd_ $B/$|ӚNr}H0ErHNZ$o}-n߼cW9?D3N na+u捹_#K&$R. $粑䆄\$j$s[vuA }Dj7Cf$oV$csco븷H,|~ϛDU_@ Ig3)p&Λ ʤ1PE5ZM Ia9R}a)x!Y 0c7)x”Nd$),'_RXhL H;IRx^By@5EruRfEH3;ˇ0R8EՑջbBRjn )#>mW_MNC{KER= dGeU&[-",d{x~\u~#W^VJ+)4L#iJ F_ƵB874# lՑ4M|HS?4%̀LNI i #Ͱ)4$̈́[:4%yAy4'#WI,<4sH@R8LZHio'-#0o3$I_l e bRHZǐV^i]7$܃ӕz֙$:=N\'#+I6ڮsn6j&[I#pmVv;>@=rHDI{r iO*!|~6'&Itt"%vtTHt7DAtbH'ڜt"/lY׃t֌gt Ig d{&6 s5DHW|@RYRD=Љte4IxҕfD *sפk>tMV%]./Bst^Z|#c_}rL}H$zW m" SI;1td n YIksOWw7!IopOؑF$IoL9]Ez H>>Dž "I*R!-IM{^#}AQ-H?r ȠNI?|0 Ig乤g$}~z4omJA&.toC! CRkWWfƙL2赅 BȠO)OC = Aч j55"1`92TJ<7hLtp^o'$S "S[dh^ 3}jQ nd:d1̠E\ȴd2֑L#_֞ Qv3+ UwftEݙ1ug@Si4n MeJ} oMǒy2=Mdȴ,>8`E@i ~+ /g88ikEOOxle0&K9<87"}@F0/4!NpqzAGqJa}q&*_,\ET' !N I!\IZN \$&δnęHI}hAę؎878gt/ MX]`٘h !NA IW78}퉳q[gC{{H {2a4qvgp sl+fI^b)w`w>?v ^!K<%݉SnNYr%nRܨ:}܉kM\4G׬qXMf=JȬ FfY?7r+EO%x2hGf};x ",JMNY؞ WكVdvzwR9 $sUa2_jG2ބic|Vh,Z'ŜSd,K֑ՀxHVfr6-%idjGVjAfl *A#jV}bUZwfϬ~6vWϋQnX~dTqd(Y@VtjYm%Ud!U(zOV3 Oh6Y=HVV{yٓUQ؝.0~8eo/vYUbnE{p:YK#Хd Oց[J.7 [Y '/d0lZXilNr+Қl:N'7q9I6jLfG&M&Y%N6fTYI6o|f͸*(jK`w D6_Js(l Vl [d֌WŒ`]ZDܲ1|՝v#֕lom =J,ax4" ldҍlW5)*<9] K)&nE.-{Ovk]"[y6%]F٥ܓ6dw/N7&&dJvsn׃j%58W=Z^aճ+TJV쥬ɾqoԈEC'{4ϩ%NS}p2놑N7/^W/"eGrPį`W>7JrhOɡ|rp എ73p”ﳮnЭ%9%Ir#.+ȡ`rh@lSr^Oa%rB}CNF}#RSHoat<}rs<.2&ae'rX,Vc 9JYx 9^Y`JJb"9>yBgx195nBNI9q"ɠ99Frr^FNdrZ!䴷9&5ivV"3ڐSTrpl*gyw6wrښDN[N1=GNCx5Wt9],%|~ךDӭ,rz2Y;59y>)9G3ש~`ﺊ]q N#goɹyrLcKy}rsgrf!yĂDlM^9F._w! 9~{,$9/|DKs5ͤNeg6j㟜'l;uYlsIB.;rލ\&qRF.K-H.wsHn6(Mgs^&BsלIA*P)Iz\ pЭM _@@ju<ɝoAL{B7ׂzt!) i4z]i_~&VU BNr΂W0܇Ky깒Ng|WKbH UjWܭZW#W!% t-N1esW96 NC腥_BI6_ui{+V5u!.haIi{_cOLw ܥ1}Kw<)cOQ7A8|0Cs!uDG  ~ˏ.p >!|/~1xD;H.WVQ8%Y@EiVa1ᮁ.ftf~"!xhBcB"Î@$-Df_žY YyϏٛge(_-^ujWgXU[JJ^W(DB4̘D{Bw{с'!>Cy:\>E2-6JzsA㵏x]Ě^.@bnK?Ă@l>Tخ{b;bG&B,k0N Ad^/w/b{ . &+ wB\-fA\~ĕ@\ӛ-Y?!6ğCċ_T@B=$ABt:$ AB-$Bb*9$́HQq&: RnC0Hy!u ߵܣ{' R6Av28C_ UxH=}zR@m0t IR Eg@[Җ1@ڹ?]! ҞncRs:܆_0C{6g>ݐ^v.% ;__nƕ+ 8қخa;BzkHY;}}[HB4IX&Y54]&w#I?j}&\Wh5|YY\Ć֐k*"h*.S{kOy8}FY0SwZewن=@qhbw]<7f:h*GFST45]gϢ4GӋ`|/.}ȸiB= 2 u2 ;TOu Abڐ9%Ͱ2[ s2 ٷf/$!s2׮@&/275 s dBdsIȼ> Y oJrbd7CV}?dAVUo~^oLua<#d#&C67d;YV;/F1mAk. _M!C .@p1dJWlkZ}. {f:dsX5dl^} }ؕyoBm7Ⱦ{e-sldlZ/V\9} &kr=!'rS9妐Sguw`e'9lh9@r^^ ٳٳukpr ש`߱A= r!ig"h!Eh-EYhlZE hu1ZLA@{-X3YQhѳ->E/6; -Ai"$Z,CU! 1c轪j?@~_a/(K(8AQ z5`f!  ԠW'& #J0+Ƭ¸qP 0E SŠ0m) Y~!f>;ٱ)v(dX(l)j<OPػ ՠ} g⡐3oZx ް|az 6C(\( k<g|,;C1l'Oz#׼>"Lb'\Pφdv!(nR\R6/vn(\g굇%wP<A'W; J<,W( W@J?~`4̈́R yJeP:T+;Cy=2<ǓV%Lj>p@yGw-mma3=U@9$/UƯ]/dA|J_`^E9Tա*/Ce`B%"*QM=*{Cem5 'ʤ Lʴ+Pq*AeC|䴄aU 0?yP?_j;TOCK=M@TuVZMZ/# P[j+=Fj@mi^#cvLUR,Ծʠ%A|Sίeh0-)Z@K5 l)-K^2)PfP4{Lf94^f-YjZCK=CK;Zz}e8Z&ϡ-hYx@ZVסeΰZvkw9- h];ZmAې8ډBhu#kUB/:Lu*|eZrZ+C:6ZѪ CsR^M_&зE}ja:NlV)h[lmtt[CǮtנ*t[ЙڑCyuDshl:;:?rUU'SW9>:G>Uwܪ.xF{&!\i˥յy睡+ӊt[AW^--:W,_wsݙ" ׊n3gƺBocxB1fAoR"7O z[pMT^F<6JAoC>L޶Xmwo`}Nk;IAM@2}>~]gۼsU8f/dCuk nWd`}DFU' 2| C. ū1{/gwX)fV}5OY 0]C(vm }~00V?08V0^ 0.O`uL$a0LDe L4dalҬRވg#7>Sܿ~μP^Ϫy25ݥeS{6ļ 6XDr߼ch_N kF71'\qU}8'+ܦ6 \'p[WV{%-c3R5Pn\p#p]=m܀lpuyp#p{ǃ'wr:Әܔ0pM7UN.]̸BVԛ9Vlaڋ'w,k{ZsܵK| -ݟDp3'h]+7Ov>ٞO0ky fa1?̪ux&:vٝ#cٳa6fwaԗ!f{af7n%ϨVvq0+s٧"KNK\5 ÜGk,jk>`~$ۨy+惘v|Z4̓|z"glyKwjR|%2o9\/5>-y%X: 0N;,LgÂ+ 3OX8dx ! !gCygٹ2gעefv?,bb,obXL3ޙ#a1w,R X^^˫Oaw7vgXteJk׋XgIo}, 1>V&,դް?sZ֋whE:)"_΄O*=A_zZ2MJ~ʧ,[ǽ7$Q,gw}wiyѶN,ltT.ؘ܃]ͲBجuZC᰹[.<vsnvݍk -^;U^(S`o8ƣ`ozw{w{Mq ma?WcF3|F][ߓCD;< `_'?]Zt~pX8t9"pHüOpH pX਱Zh` GCp4Gb.~4ptb8 Ǖk8)Iy-~pW8u9n[O<2B)Nu5N34|:b4'b7i38: ёpkqRp Nq l~b8wӤpְ۪g,8M=$8MLvיo4+Ns,4w"RB4ώb33?L 8N ?i4ҶpNtTNOi"Y8݃Ӈp؛8UXÙY1ᬸJmY՞jp;yJp^>Up޶|;\=bcY-9*\zI.Cr.n\ؔu  p?pޚ"O$:8pmwN{lS?ʿ+U( *"\$*>*m WU^jb 7ڝe=5\ܮzgv?R2a =)pk }Lp=pyk\[BjW]˖8f[VIMDM-$TnKp7pSd([y_[pkn֑iEn~5d3! íxpn}W­Bp dxpCG 6"nc xZ {&jOH]:p;p{ p+bcy'~7bKx{]6Whufwp76b:_ݲ w^ w}=܇{2 c~U|TKOvpO,dQOQc;> tk-ph͏ Ϻ{fwi|+x8:<\_!* ѿiVwioOtOw5}i<~<}ӫ?y&O皮\5{G³6B:h#vm/ &wW}<.qVhmAeKfM)G۰3h5es^ ^k x&[}1umjVBۓ)h{j*gXCx,Ӿ{+xo2f?t>V ;c] Gk;xHSO'0OO6`s ՄO~>3.>q3%|&=7v>I73=>s=3%|g|:g4|VuY>؎l.C >0=[gG'>%MI.=k_<0||븈Oτom ʅoO÷B~7Fxw){e}d 6M=IxO9D 輻:1B'jO3DC{%;]ra:\.7;KHt. Mò7-h~ cd K]U5]k4tC:叮,D$F"@&v^^eG:XJ" 7jO}{"_$F@EygbxI쬗myTV!ZmTC`?_G`3K1|C`!XC8#0ncޣ:|za=BjD_|'quwO;73?sGh[#s0Y~oQAAAR Y&?u{ XqX==A+'z\C/u8I‰``{m; ؕ/nۛ  2=o x$!xR>g"x2/ॉ5e.^W>{;"H}Dp:W b#_j>ddkȸ6p6Kw.ΓExz?ϒzLGW?G3$ } Bas }.yόtɿ>wo;P}G,B;''-,!S2xڼ7{Fov8;^#VL}o@߂{t`~`('"E?觐~JOeQ jDm\-&:Q}vEE3+uEa BԵ>QyP7ussy?i*L` وVWAf z UkDkCNDC6[DAщ=iCtQDO/FlDexg;sgC?Rrϫmm=r}X*wq*MD>xinipѷ7 %D D.TDtqp9nW]#U\ו~wsj q+w17EܫW{ q O ƘvE0HLd혠̳0b &:aLp6zcwwLp|/aBۘе&x_ڦ Z`B֭}>T'򼭏^ODz 1 &HbhA=&!S5WYӽz&D`<|Ll }-^cG&ovb4Lqrk _1,L}«8b -g#^c+5jⵕ6!^3ofk=׬۹?gwj݀:]+ѷVsf⏺ ;!> O$#>GW1f;5{/#aGvD¾u~T>w[Ya忛 k \.@Hx\`$E$6Y]nVzWu^nGC櫛{4Hg'*Z$zDG$ #Q{&u"W诋<$v n߳fUf:7/$ Db8$F]B|$@45$&B⺇H0MCmdWͫk~*VU>5Դ $YH+C}OH,gU &ucxIm'I_`"&7ɍS0|p& _0Yn &0d 阬e <3aҽ>&PoٮRCL.s0C&n))BS1Et=4 Lރɣ]51y'=&_1fovj7vuZe&L;9LqNZScJ{)L)aL 1{4oP=15q N醩Sbnsobj%LMMYT Sԇ0QWLSiʥi0 6҄!ӒcڜDL+icڲ֘\eb"LˌôuKG1#LŴO0Tigܻqn>Ŵ[1n`ZY6Eho$5Zƫ$$H|Ynn$KY$Y;" Ya\k6 Io#s$uGҭH;IgTHv)"{$?@r$$!+#>gBH^H^ɫkMɳ<8Gr= k5E= `؂{k?y^ Y}ɫm%LH^m5='`z!<Pw>8çԾgL3? Uc`ŒR3F]nj11afL1S3'afYg0 3bBl3cflv3G 3Fcݘ9 f+;fya(fbVN9’njABhUwƬ5nfMYU(YDextsܘNga9JŬy Ŭ]k0k370x:vk!naV>;Vg̺'Ԟ:3|¬g1-^?kZ7iY`hWn,Pҍxh1f`v$q0{̎/Ķ=MEPړm]ه}1iα[]pM~2>rsu;\Ɯ0GsEi?-#1G}hc's`̸̱f 9"0gЦ5ӮNK2œm3b|̙sV5e(v07s\csScn RR{0G*R#Rܕⱦ~}H)!H_ajH,@JRb:"emGʨH#qH8qHp )3.!e&H"e ۻ~R6x %R6G!e+۹y)"h&R@Y6ô͐7)7#%4ђH4 cnba晕ccks b"y[bc{rZbDžHoBW5\Ǹf,tD,rnTHt6 _RE ?H CjL!bb0_[bvo7 |o>-&afC3j?KjͳV=y3o;~? 8\sjk讚h02̟\1?%mk`arc㾘B_r^7×9Lm}{[$w٣ZJϛg.~ê=OJ b(D`g, ^ł)X01?f?:lXr`GJ%~ּj#w\KN9| ‚X~|xT >V}yy baw,Ltk,XӐ ½,s4fmwXxV sİ0 /ba n [p,=EMbQl,J<\{UEI3Kb,VѮQ_v&wgyÐ;H[i mB"mi#U()"C$>0d"0Ҿ{~j25`6zamWcφa]9Xwr±ϕ`]ndu K^N=uũZue { ߰^ci/őХ!] 5!]˔! bt eH-FTBz!H&mnjt+} FpQBZiH_pfolΖ~pҏE/H?.ZH|gG"ń}Z6!p g[dd#u 2ÑmּzBd n%2Co!#RQȈh2VB !8QSq2*@F2.;a6MF. ehh,&36c匆Eo̰ [`{46z&acW6`cSldm ЭY}ac8`64d(Aq~M9ؘ  K6^ތe$$Ul[M[BltjO>V/Mˮb/ S,lOVblub|lMvC~!C{lm>6|r݈ lf1>[RޅmkL`Y`hl`p +]DZp;l_aۅn?o%nc_swǎ;+_V<駪rvcGDv$4ÎI!1%;aG%vWؠ"O2bvc*4YVYi;bS{3f۹`git>{`lm˯b(89z-_;o=۳b켷; 8,EqY;HcCe9ab'Z]b׊?z~]w`׽U]6bW *9 -nݾ)vwֵTkxVgS}16`UWMyܠw=w7Yb+Xa m7`r5{rGh1=cϗ{{/m^yث{-6`>:006ū+D~v؛v{טcd,{aK˾g~ {wn?޳؛c"2{&`p͓d؁7c7ɟܾwbhwzb\ )``Su>5]UjuX}cߺؗ>r?O3Ͼ?9_ft`qFfTeLl9Zw 3!ӠV]SIV.>@&4 2BfpdE#3#2{FfmdZ_2"~d3yd`e-2o( .d6Cf^``2קJ|yD6` 9O8K(z.AAUCTqHi:yxa!i+Bra҃p(Bz#ֳqvHUf0OԆ! G]pd;\#_] -p$]G2 wƑ]Kqv<#\qq*<5Ǒgqyi%ϲ^@:Yp.e],6rG(dy#> ˧)!4:!ףÚ{3AV(1dE!+d2k/wI9Y=z{DVb{Y~`?| '}Sb|Y9bZY k%#kAdͷ)vANV4GId`DY*w' م8ZjpB] '42qBK'ZkDh)N}D?8?Rc7`w؀솪kND0-'G781u'氹y8r/8ϯph\E;Ir 7pR(':Wm^~?RpRR~ y{qr;\'SUe|)+8lN;d,oN0Cv#{z{dt'!{EcdW1>٫^"{PdFy#dv@%Ⱦk㐝?we}rDϞ!EW՞`\ !=dB~s"-VDMi$v3؄3"ngL8ӽ<3oqvlΎۄqvJC9s"q*-^P#'v{#\9SℜyC~HܙmS0~9T[`0ǹ%~8b5έs2q.}e&w 1wpEMx+Wʒ?jVp^s\yt>5!8-^Rw߰]o[k/5/,W `5+l\m<ȕPEnim~-bܸL\ȪD?UKm\KDnb\Axz#Krİ]#7U?cv.%]q]B1?}e_?Kۖܝ7[>'Ð{%K*rK!k0r%B#E\Ӫǻ` 6y% Q*W5j+~52USOʹf+p<W-pW8j-Pvqy"f3kpէ \mwW}jgY\ծѸl՞ a~;?wΦ{z@W^܇kQGq-Fĵθ׊G㻸=k/e9{_V.!0eq]i%]WuMc\!uGq^]q}0GZzL3n\Q\_u7]q}D\?9+#vB z#O,yWUꋼzȓ<59iJ!yue +gO]^>? y3y 78Bތtzț?̝j2[Τ .Y~[郼U':y"/>63mkiz9NDގ|~y7jps͓%o3/9voX)Sϼ5tӸ=nn9zn>yn:TC~NUf>"_1!_7|fVwVӯV5 n}fntsqBSjw;lw{ wnDfRRW3Qe{Eٸ >)ޗu1U&<łjn(hp he֡`C 2`Wc(82?gvCDEPE}gmhhjE(Z:(Z勢OhguqQśf{7C.MDKp1f6]xtzlwaJ3dʪxwꌛx7ޥǻkxim݉w;_ݶG[2;љxwHWOݙx#w`ǻKպ*J5tQ$JAxJ'D4G&27LE'(32P PhlOB5aTB(UC:Lh ʄ_LʤP\2(S;Qf2T9~j5sC=#~wiǯyJ󣫿Kvv}acqMTnM}.ϼܐ]5} ]饡seW}k~:ʺ(oFi(a(鋲-P61KQ6=YMdپNfdBslRQʖzgNxS?@5+奣ފ;Pv7O Ȗ6 ې@Y)oOiON}K/"QK^77MCS|h ʰC^გ;>c(ջƇ0H20>[gu.|X,ʛ->f{36(R (}{Q'!I|PGK]|8a|ܲ6ǽq >e{NHL|c=%/ KGy97rYyx\ I(W@:եbQnQʽ{|sQm/{>E@a(#Qdӛ3{llMb(߲[cPmʷGV((d(W}j2:S`{|꞉OAG7| Pxxk8O"iZ|;9Iy |^Ӆ5>3 O|ϛ˴Vd/[vE|9_r\|X/߰x}Mr"=/,_ޗ ;]_O|mt_BUDIoɸf"jN4(0WU9+kKWqWd|ueh|mے~vT+߄[֭%uo9v7ۻVo۷]? XTH/CEЪ/ʟ^3U] P 3?TسS!*w *0"s*n[_n>{%tE# z!L}LHʹWU , OOU ^^K{*^aJfDJeDcyU-"D& ݉,9="|h?@ Q4Gw&!$8krD)g@wmreJWͽZXE1"f'P oEB+Ih; -;OBf7v?!lv~:0">FB Ihxek슉ϮlkR=[= H 7_E$l0MbHt gE6 ,3#@º׫ݟ^DIx? =MA7 $v4 !ᏍHb3PciM"2HDj74[N"HF"JN$G"z];D JH(DL4I ޔBXx'5EEPclj5v[LIL)#MHl~Nb;:)$Gdzh52;Kg;3#sB I"?N/tIv/Bwx=JHb`y$& !$FHbr:ILKkDrI%#}rY|v2I,9IKp@$$)aEͻIfJ MꗹAmxUB}Odb4IN )3>$9Ü$g'ٶ$ $i$=I.QbxCIr~{zdʚ+$};xG9[w/W %3t{_];5!3I*_n%$u6I=JRT#zHR $ I=%l**CxNBHZ8E;W? i#$|S$1IO(_DMQ[IK.5oNM8Raɜd+jH5QԤx"Ӟ3&OCɳHjB{ԴTN#SMI%;ʙ5rVl&s;H%גT.pIR\O*WI*õ9r=TͯTn'/H7ܓ'AR)\I*Cʳ lsJ&զ+IUyt"յ多Tt"խ&nC{^֝g$׾CCH R=Gwj?@R}ՏT_ː{}#5Rӵ 5qf`NjݤJ }R!/I(R6[01&u囤n0Mz> =oǐEHC"cF+DͯʅCMt3|&<)v '݀*^;Mz[=V~\pW5_eV(*2.![ 0Uydp__%Rb6 Jڔj4~PT I:df| דK<9@02EVgjN\K#+duy7UQU1YBV/! %zi,NdUNd)4% Gڷ/YwA֝hgɺ2YBd=$$aGnݏݱ;]d= Y/#QϨWzY'#za'oL)d}hY_dvd&d}Yߓ%@/ΰؐu!+I֏"lͼ$x>4F6ې)[Sϼ =HU VN6ò& D'Mady:l9D6[_Ͷ2١̰lvM$݃Xe2 {6Kֽ.t #2dsٜYA6W\2{ n4 ]}rON W侄}EJ =55syXIr'~Pώ'1@#(&M{KgjW״c5{H'))HާuL1y^W!ȇw̄ih>eؔ|VTOiޔ|Z#U 7H>m 'K>Q'^N>cGϸosL^b̿A>fس|#"u'.ajM>vP{ sjoMeP{^7K旨vDcj|~*W 3Ԟ}i_?GGKjzUv־x :ȴ-n{@ںRmCxz%_%.|/#^wzrM7ګ3~6p/_ctjOΐw*jL5yޝe;6'ߧB"b`gCr(:RGԱ#(v:JNR˨ uTI[{:ڽr c*utA~7M>EԱ=QNY gS;;Yޖ:MʤNQپ?c~a;ӑlt/u:.>IJ-Q.GPs.hN~vϑm~K2iX[A~oەB~.wdO޺#jLpDNSp݆^P` ,Gy=vÄGNQMpC)u]D}\'>!_C_kS-mԽt u/)֠AB$CA-V0>?GA&)J)(fȢحa J6az+ Z3MS((͏~`v JA'($ 4'&ޚt.,Gf#H>C=fRJPޛiIz_c>\6_w</jK xutPHWQ ~y??J ^gxK!Bb"B!b+u Qts}>A! (-v?@!c(db Eo'D jCERhg0BEoy2zRH B"(6cg )1zJROd>l:z67b(rSzZI= QOk6ס;mO2wNg9dy_u{_(, Ka"q/>^O0g),Gr/QX w[M tz%t^R-7wH}zwS۠)S꣐J}L4fW.ӯ9_Zeͭ+6jC}+S&yN'W?J:Ѐ 4`6p$zShHT߫F6i)tZe=W4X%;,Mh- ytݞA_WyC!E엤Lq}`D4TFsFRT(4Pƞ7YSo;G1).bS[WEVRcSlٟbW@ eVH# %k.v !m5@h2 B>AhN~G,XU_P;0W?o ’z aяa΃Pnsu5@U/kBX-+ [!AؤMUv a݂< ?~!܏}!܋ia^U3&Ax!DY %A |E!\w |{ C|.D>~d`~hA ڌ(<#D D%t!*b5DfBTuD&U5lʪb,}Ү{UZC(D=!= ZnAeDԞ#aDٝvU0] 5DoAt6W/p.:whX--wmz}5ߣOsƷ,X[4_ΠШ.ڠ\4F3hteIBhF 4ڿ߯F cƣ{R\3lw]sƧ]6ihb^/k Vb+JsIBp! B\wĵ!:.ew({ZC|Sūe ^ o! $^Bg>$?kem@<$-DR>AZcE ]#c!1u($&C"Q!173[B"9$r3C2>?ߓ筇ĵW3CM d^ws-$nTItQfH́R@j#HƠZR vBj?إUg'XsY&RIJ; 1۩ :ëٮƿtsHK8@Z\ҍS h=EBZ5{?GShzAM]y:E45QhvT{nI&g4~39hzj't4]ua; yF 4;hzw7^G}h^6ch?ZM|db \Ș@D2!c2AY ^ rC @ 2gBFC$2Eȼ7!+Ya5llb>3k| r!'9+@{&ؿ'r=I#=uZ>_RGKZ 7)rO|!ȏ^P53r :V'Whm6ZErhQ"yh(- C>*sb tS!8!' @~lA7_pΐ?g@>{=OAd3k\s|#K!l䟤A`  / qiek]-WSgW (ȗNw VC56BPCPBW(tP &A mt wgB!\sW;&}~?߾cCc@O(_B6g¼+PHSjP8ʅ(LB)(e?=P![8 یϽbN(ONPWXz1DCY(ޟůT{kJTyWY|$oP /$1_¡ds!JP2 _J}CmJm@#(A`d|Mo A\>(E*Ci( !ɬPQ ,7 JcrmPJ#o0@ir;(M`'TS̫e/<.}A(?ePL$͝lv&ӫ朇Cng|}o[53屳<9GAyd c1@OQ(QwfV(dz:n s|<ʇŠ|oZA B"ʥgou~15Pi*$tT5jP;*CűT8P1L=3= PI/A%_*WEoTʷPjh_USiU^P[-@}9T[BՍqVkH4AuЖՐW#@u,8 P]4w:oTS:j|_nn@P]]jZ[_swߜ% ckzC T\> " iπZZ}Պ PKڴ/ Pc߻&_Z1ŻAm99] m!PۺAjPK/bpP[{?j,6jo@5w1v/j¡vMjWvIjv^jg?B-j' -_@K0YS\4-f-#B]1 JP ^h ughT$hHw_@$PO^CGX k~3ĠC}{1ԷA}kB}T,cC2nu+)AdC]o(u1A]@]=vz?~_l҆=?{g*qm-4re4ݠ24VƲWXhVИAЈ q+CA4:yRԶcÒ)glw>cǠ~gjȮi ?h|`ٮx0hor2ߠ~*kMlMLhC3t9` 4=vZj-=RIߠ5x\VyZ7*>g5*s5r!.V6}heBZMxU;ǭšm6w+/|nkm 3ڣB{{[ :ZCNxy]n+crNc\+߳b2=4 ݮ. >mjS;Ϻwg{6\mg_|ޮ-jޑ<z#[A/Fz=*g=)3Ђ=t@Oz-AOa@q/5=z£֞%gψ=Uıg3wg_xGu *~T~лzw \k蝗^Nx+w-?Ccb.@tG=ma`p◡> %C@~4 $n'f@a-9,3{='=vk؎c7 S0X]y0  jq gaPE3:wa0CN0j|D`K ` 0q^x(gΜQvm=[ysDz=`b&XJb0\XLDZD܋ύab8 &a* Sio0̓I*L`C|q%0C`:9Lo^itSyӵ`Zxc3at?8&ļg8)Ŀapgb7pE\f?pBY6KY²KY4yW$ śgsImyg%F'97Gd'& 8ށs9_w3xv8.ם)\_Y#8 r(p-kv6v< nd^߯%q,?:1p]wS.~׶{f5=K;>t t~LfQ0SV)5͂ f&"03303$~˪Q`oM\g zY/j1|`l_ـ0s}_?MN y71yC|Y R0? -a=9Θ}0yAEv-0X=a1*,Yx,]3`h,`f7ˆ><uƏ- hز)d"%)#*+ dDi4Fwv_ݷ\}?|sy^:1jBmXMZ2T[xudZWf;ך̧WPP{juP9ul!Pi%4A<4r<2}]-fc؜O1Zf@"Zg6A5Akk{ 4$y{ay32ռ{gOZi-eY6_af9^hFhN4A{Xtʠcz: ji Dάt@'i%tfG@g.LhN@謟u կ~]gHɆNtޯo uꊹм']ؼIn,Z ݞ xW+  t@p9tm;Xp#;tGcg@wlX}g4fY zU_ϼuY[ z9|IS^z@_Uo5E ߵsQK!~c?foz6]}oW !37E4 MXCAFwa;;ިsg7m`x9 ^01`; w\#1< C 1<{gPNk#߷c0Z" #%0FB0j7Fm-06ds_8{F{42|?}{[~mg ^0FEa9Fate6-[+| lǍ0v0LQm4Läs%Lh4ޓa"2K`"}&#a`<&9 0Y&arj%LJ`r&dOLvä([?}ۍYo: `rov\zS$Z3 yLvx=Lc74t`evm0 U03E_̼x{[7s޿g10wZs [h='\a.杊`a>G;=͇ك0U06 fWε>0f{L/=S5yC/btE`wXEb", WKwXZrHXZ:X~ d],r$Xe XƸrV,2Rt Kד=q.Ps?lkln5?ϸEn;ngkn;`u-w}<,/B,tlZ o<Vs1BoFh s UF~I0FڎKt0Q#Nsk.F]31rXw.W`}$F61X?lFl&΀$l4sV&V6&*lfͷ96c`s6Ellbz!ۓR slۄx|cvm^әeRÊg`;|o3Z߳?=Gv ``6vAal.o-fS}ښ9 Q;fJb`<쎄57`wv }-τ=؎z v5a5CpP=uÛYpxm px*G7p/w՚s4 G]pGCp c1IptGWQ8]q8f1#qgL4~8uNppN{hEm^mZ&mtbL*Jpp9z17 0'\y1?`̥As3뵘cauVoay!y.1ù!ù8\*;=-Ny"6c[ >>r>4>#2>8wzGϊY:>IQYUION{9Sd -O~ &,` Y1!Cr0aU6|0[&4l„Y +ߋל}Wf+||^c QN6C[z{{wG2|W7 m.J<໇s"~?|T%Vj|?|o]|aߚNt _5jyKwYQS0÷A⓽cGLɾ}6i & ?AZik' ~7x[Խ? )B(o)iE LO4lg ?\Y}~z\QȀ+珃z_΁vCSmU3ÿԀv5C___: Pa3tD*'T@@v11E@#P j.z!0^D!X5V\`7C]{Nl%`|$nptd[C*)ɯ0}L飗24(oW~'=翸]>?\ܮ?yo;wnNɿ~4#ci`A^"{]0I{0%S0i7 ~AaZ >|6] [we-= !|+GG`}={  ^5/l$Ÿ@w!L_oyU[;oϺY3\F`f^KbfZfHbBOL̥f` f.¬KYFaK̺9h0f=Yg`VDP$",þ2x!BSk\D8" "FDuDX׈w {#b"vEq"nC흈xgT #Rx";; R"6"0#5!ͯ#t"U/#ReTHY Hi3us*tXȩ86jx""}'#2ʘB2 2"_#rI"SW rUDnEEܩ""wϼD"DFdmcY>*"?rO(9R( D ޅ(1SG j^D*EJDŤ!GnC$D[.E&D/FUvh8Dx6`u '!ڧnn :}":(7=Bta" ؾi%)w F3b4 1j341grA1ʺQ|1wBmbv#f}1b֊ &W1k#&bV!fb fĤ,qo]f֝1s; 6v(bMkpZ^XHybCtrA셥D ľAְX/0 F`K+퍹}c$CUsb%{ ՘6sCbJ ]vs/b9]̭0܋o E̽>sNƼ1{ؿļ֘a-z#Nt!89yG0guqOg(8j:7pgSch ,Mq_"^/7?PjWApkK"l*J ;[ Gy`q,QoC8l#vWycIX<K|krM²{X aq*ǘwvߺWcq3W߉ R$HQ;w2)J{):2)qjD.R )"iJ)$+ );sͯUo. T LHʴ+ټJ OR)uHؙ\< [#XΙ7pH HrDj'vT}Hcv}.K:7/3 m']\  b ΎCZb9%qzX2%`,%`8),qc+]Ry19%Y5/ ,'%|N,ii7"*iϒ4i/ *۾͟_Y_=~?y3, %X.l%aF ,ِ:ݼܯލd9%Um6ZzO-Ex+"]ՙSB~$ҵOqۑ?!+>{# 3\s#SAOoBlҧ ~&j9\k=wwk>g.ϛc d8#a2F"Ö0ܲo8y*s1Q{_"T,2 N5c!_>52m2+#)vT筍9L{Ed6ɝ9a2} 9*2="}otx[~7{R 'V!,d!8{5D-dFQȼ{w.^D+2c{lwUeS@zVGd}}ܼ>K;7ˮzb?,e}~G,y˪`ًX j}SUg"[`*}+rXn<w}/-C>~ 3?eo}$6_c/X>þaym,x}|bg!X~A 0&k~?'\ 5[:+TCbQV,T%X+`i9b JNX>|ƚm;mʐ+~𳍼++r δ-_+t۳cr5;TUz\ŷȕG7nO%d亲j\Cvnnm<: c CD^ދ:E"O/s[nl GOu۰ķc'a}XJf\aVal5h¸#w^Qeȷ?U" ys yݶ6~`G~y䯫E }_4*ͱl;"E[/gsgQȿG=;(舂(@ A(`R I@(Pj+P=G݇( \KP`SB`3vPUI fP63ӂS `R̝9(g(8Ŗ,YL?G{O(F(l_BABJdz -9z P %QkQҖe3MG--awܟ;(vWQXi('Qx\GgFau8 _BaU1 _ء A~4AGcAl6Ƒ4l6)bSM{ˍ6~VBQM E_$ ]}e0ﹿ=aulm:+m l6#M5Msnbm%VnL36SwlŶHl[m e-7|˰-[Ƕl; c[cJl7mvg7>5 }clwǾEh =q|bv?5lƭ$`<A;vaӱ7vlvǎMQ ;c=vdƎؑ ;ϬvG5`Gy v|\Y%x]59x"vLξS2 ;bgo7ـKqyBǰA;NNaة;bz}w 3iH~%ڱ{O`Π9;>NBt3ޞ{Vs߽HS;;s~W6ec]欿P"K[:v}RA#Vɐݖm]Yg}Dv`a=)vO|Ұ2v{`w,۷,3c}ov]]nc^{갇`wio{w7$`<{&gcbw{fRSOyOfyx\/zxVx{aղGV_b˱; _Oհ}~k7ݱa uf}v^sI {c2`BS}{/aB"wq;ž7uZG{]~1Z"byG_-N>d~?< C_˰9~ki6wFb&?W?9N{2K@8 5Wjsӌq -/A88 V61m^gXO8u=n>85ppuW{~1]=geGqwDX&FH8;twClSDq0'}P6{%(ECmPlAŖ3P rY(?J =kkss Q6Ů}Q\b'}n;ϺxUG@ iɢxf~CPJz$D8JDG޺\' rGɄ(B*( %Op'J X~J Q2=%3P25%;=#%q}P2wJbPUq(Ya6 %yy(JVO@()<(͞xJ+J2%Prj2JNO^YSv J>A](Bi-(WAi^(t"P:@Q*=R)(LEi(!RUi*oEy-B遵(ݛULd9ڌ@Q(C{C:AfJj݌λ??O*8ġ(S2C( EMQ6a|,8[G(; e1=P6[e(+߀6(;i(;<e(+^}Qv:y?;UGYe<΍=h#f8" G-q ő68" GOM1}aa}Ƒoqd ۳GVH&nHncWn+8t;<#_HMdל~qTS%8I8*+Gpp=!7 8Hǒf c5n8>Cp<-p<3Ox*Oqep|&'T1 'w8y'2ĒRXap κәn828}7N_ɰHtB2\~MG̓^vU*PԝSK9^N@ mDPd (/ n(ϭD(OHv?K켳P~Ovj_X/|?ksQ^s Qivsl78:8厳lbIp֛G_!31,՘ٙ 8ol*_5T@RT8?a+#禩HT$@E/*P{ɨ YThi)[g>oSC.3V~kl׻ίl1{qJ:.7F.Ji;8wݿ$zᒘ.IåKpi \ťŸt.UJҙ \:K'7҉ pLJSp åq) ,.Ũn;o/5'C\V e{<P\qeq.oy-w^P.Ozmqma5Zk1*'%*&Pi| F PiXʡPɽJ-މHgT&Gq#X>F|{EJ+/=E5Qpvj\0WL⊉9t\nٸWW;g\廎+U:x؏=qsj+U p}eo^E5x\ԡe{µ pGUK mq(2~aUimp8n?p|n2x8ډW#;yqg>_]+w{~gB={2poP qa/v~[}z%{-7js|?͉7T~w׮ﺴ(iɥTSm ߉:޸5fָo&px?sq-Cfƻv?V=61~5<,<~GAxGxt+ZJ9}G_'w N>Bʇ)Q<6Sxj<O੮ hx;ṧe__uH Ff2F!U;w>Uӿ*Uq}PΉTQrʏEՎWȲ[&z U{Pu(uDU @ձ6:[;탪ըCYaT]hKQu8NTf{DU_yS?ZWWՁSx+Jr==8uoFm<^,^x3 {D'Me_G^_ũExULxx}n37(^_f 7fx7#h 71oF$U/T T?7=PN-A';ZYJQ=p57yigFzrT;F=?MPjKܺYM83Tes}3~:9 38:e&:SՋGsk2 )xu &Z똆wG]xǿK!kdQN ՏQ}*'o~[;F~77ʻWWڴ>67[gwkn -wKw]fޥû%ovR3»?ohq;wWxf7޽f} =1O&}y.Rx?EIM_1tE?vo]g*>0O>u*m*z*A5> Ƈ~kA77)Ga>$Ň | Ԓ5HWrՏꆏNՍ3k 91cq|\煏WJ^ǒ7wvC|쌏AMu^Zsٿe ?>~JǏ6~'> P|JO#G 'F>)=][cO9iU=>7§.9?zIN Sy.|op|n/5mQ5n8uD`EԌ،5@1V7ޛP3N 5SQ0 53-Pz5ɺIdZA{Ԭ_mN)>iy5O>QԼB-%)jd{]RAm;_@wjF8ԎuB3?[ׇ3vq[؇5MfgG= vF|}n +Q{ Q{1 P{#uڽHُ[l}t4jOz5^nU jo8X_2@D:3XuuZS 筙NIynyY.@ u~ɨ,v{:u z.uPz8J^g5Q9}Qpꓙ? هQu;O)|1/S|A}~פo3Q:/P G#ߺJc_^K'Pq!/ؠ<;SP"ꏈ@gowv1Ɨ/%w/wG˝Er7\/W&=n/Ϝ9_S>v药B*_;OW_|?2չ _᫇9T| z|]}_W1. DE^~Vw|,3-j͝wޯ<K4iZG1m+& ZР$mhh4-ϡVGCP?4g-efԼuϼfO0o0)\-ķg>HhoB  m;lA 3 D#LO vХ)͇on3d."NJvni޿0q aB0m6W%DtOId َ$>Y3G|oh~fCi0_ ~05K|"7{yL"~:"~+s7M"~įs'FLM? LJUHQL6!?$Jr ?2K_#z?7&g݈y3N&#[yә_-gM1o %H 2f!b>$Dj[HmwSvjs.U:ÖJ&}Q-u<_Pڅ7}3?v22N6H`4 Z$8C, %>$8u9 %pi]Hpv;KɋH0i! Ǒ \ؿ~/$ ԑ7_5#>'H(|Z2 ȴb<~^y= #i!$НƚW ABWjkPReS}o}@$t̊ʓP2 jKBIhScP#Y$T.$t? ][HBW.7n4՞whLBU>c+A?R=X@z.y=usA:؎ahPؕ:䯢y1?aTop2:;9āFK1Q$:GVp~S5:PGqwxK[Qc36Աu<֩D{ ujK^pQF惆Q$ɩjSTwqSORlHMQgy=u.R罁 |::ҡGJjW|ބ=p- ʐ$Ѓ'".$<}"Ix[$<·HxF m$<- g-%%1$+DkIxk^>&$\Dy$7!n$G~ !#$\ pI1 "ኻ$| {6w?&$|Mxpj>B"|$"؆DH"uD!~)$2-(i4q$G9WE"iMSsID'C"gI |O"^uD^ 3IyyRrw/O]:m. Kԥ—A]4RuIZM]>hR2L#!rߥ.P;˩ُԵ[ vq uMnezUW;?])&>-NdHtM $Hm=HH1V=I\Kb]*I-$jV!'#1"SLb؄$ĒH,NO:LXղ $n+XI^>$2Iin޿B R]ښK`G>`Х}*zQs~s-+߁z' $q$$4yHqH" ILoROMh("IJn^ CSk굻zz@.u^5Sz_Nޝw[$nӋz LJʨ~]z)ޥqf&C_}-z_mC,ޗG2-H>jPeO}ps?Z#ό>!}iFCIRܑ$EHKF63%IZ޲߶ IՐWK};ՓEKsĪé꫷d #@}S_WՇz}{3ac 7S߫y_HTARHߟ~3ufԷ?14H 걐}ӂh} 94hU_a ʉOӠGQ4m7ځ `>5Ŕ ;ރXS{4XM O`4XO{OE4صIviGfTu54xZ[I'nz 9=yHrZHNɩ*}kٗBrsdH.ʄ&& Hn!<$7=+$$ęŸ_yj7Jr{7ܶ+%HJ:U܉$wc#$wh9ɕtMf|+2?TwmF~[e=ɛAjyh$D㏐bT 1zܺǦɖg\s|gF|mڔEņ$;+2?1!GI+Asoe'Hλ:Ȑ|e??=^jw{7IAT4Sal=)xg)#CಌIaR-E A 06) S9.dbu(ЃqYRm))HZDjIQa )!BG[IQ;JREh7)2d=)_ݲ$v#Ÿ8b{Sm?)uGJGIRbHJj,HIl9,Is=)yy!)ڒ ܚYo9mk2)ż#V5&_'tH'G Bt_n YRځ.n}IzR@vI);1t#eŤ2Hy')g3Rv}00Đk)e"eoR;2HԒSEzSr)?EʏHQ1)?4'ףHj )L%lǛ\\E̙TƑJrRK*&"$TkeIEo/bO*'Ie+R E*ϓ45RA*s.J;RG*JlIR T%ա i9p/H5 %H5c*zT LRwTOǓɌ͙TlI,~Τ|GX Ρ4T }Fӄhq44d "MCЀI4tr LC]g8ky0?9ܿw|vk?aRSۑ3 BjǓ~RSTѤfcBj1jѕԂR ᧤qJ#Iݩʚ4^ Exz4f)|4;v5HS#i:摦m'ͅ4nfC\H9HsUi.;ͳGf'i_! >4J>IxFc*Y646u֤Y4߲^KliNZB5ŧHZ[jÚjDHkz{˳&IKad[Tå8iͻ@ZHk:eU-MZoY}CZUbSAa/PjDFm; 붟uyIÄgѰ>492oC }GFH0`ҎAQ{Iȃאf%)'0mt* =H]_._*޺qu:G l.}0tI\{{џtqj9VYL?ІIiHOV^"4<۔[,J$=kJz޸{:!jH/BՂ>%u!gԇ#2H'w=JKړ~ W'a/9#.SŦ}?Gq&UH^}7ҫNzZ~$ "Jү@ʏ kd ='dz _d!&dP҉SKs ɠ8; =x##Ƞ̟eҘ釐.dpמ fP$OJ72T K9dpqGd2 dД XaI:JsaP >'C"2XB dLfdha8ji~?"?)G$dx}+^.^4fEL!d4(Ցd45BQ2 :MFdp& a2JFF߈Q2Z|7ߝ'olzKXn#!c)ڀ[dP@NmJdغ3;~hs.'1 S8g2@ƞd@ƮѾֿ5x 2Kƹ)d9nG&~nd2y1L|I&dLޓIN2F&s$*L"K$(L d]Ud,L&ϐIx2Y?LJɚdɣVT #c!L dy*CG2!Qj|MiOd Y2M!wtA_BIGtyA4LgiGٿsQddՑL74Gɴt=Oo8AfsٛdvΕ*ɬL!3OYϼS'2o?q}lɼ'd.Zڔ#d~xr, GQd񐽣\{ww3yod8Y@dY*Dur&CۿjLײJYV ,i4Y^ "-V= /}|y^bdUMVW՚*dj=Y&C5 #bduZNVe'iDtFΦ3~U ˢш9iD'3Xn\A#oЈi+6[2FԦ7҈4bM)z7/M2_K#JOi4&oȧid-O*VL)Y'kd-擵d YM=e!nId}Y_'mdՀl_!ۯ|4Jh*I-Q9giJ-%F~IQ;jhԁ59 8/rX{>="W6tO"GGZwQÛǐcTr6%GKM*8UYNc=i{c9Db ,r'-g \oK9e##׮CUx-%WYkd@ \e\%JrMۋRTӂ9ﻗu\u#{PNH%gPr{\0nr<*;r;Cnoۚ(rw|Eֿxwh*ڳqKՒ{~r_Ik}r\Hϑ%yrCF~ ؤJ hJSe :p<6^πY?ˀi@l]ES~Z,C x] GS>I17C-}1{Ӏ: ~H`ǯ }iiLJ-{yP7@ c82n Eދdk r;hChs$Z{ӠVUi<fg7H;8~^OzyM~j~_{~y 7z_/7͟Yߌvfc34'8:]o{ _m >'>iyi p LY| ,6J|#dvo1l#+xSSH%AHC<BZ gB\ڻ&}dACFV#W=a9tQÔ-{a `؍ۊaot(KBH~tHۉ]g(:oPtt: /O\ᾎT+'C6~?w|uVCR]Mt|.a?F.s " 2?DZC$ "3B!2S"Qᬗl!1"^BdLl1I<4%]{J?tD63ѵ]( AW#5t iEj2]Mxkgl/EWI:Oȣ*ql ֯dV\nz~ԁi{:'B4E! =x% zhD_c? !z#g>g}.}فDhu@%;C8:U@LDb]4zy"wXC l i+, c=vFBlXI-N @L+_ 1;պ=Fjxrwxwku q^MA|?-CjG@|,j!n> f=CKcB|ǯC9;Z?g85V :G ~r'˟q6/{v [`t:nBm#tΪ)E7:t3IC7NEDƓmU[[Y[`ިo~)t;0GF̅dt7V]]꡻ t;{AtG`t5[+6gBнb5_&+yzDm@ik'GzdK'mE+fD4:X?= }$z;`zĢ!_ez6?%|2 ; C$VU@b\fw3G/Fs-Km`\ү$!)!9 9o $!i8$7H)dGH3]ˏ?bֵd/$1|F_u픅%C}%зV7Ķ6d+;G틾wZ-滢{^VBʃ{-}{y}H3ë9-ҤzCJ APRB;Hh@jJC*,R@* R!RBj;v Bj"HrH/YGH]G!jK U_ڄKwԁtgH·XC'{-t_iViHy$GvL!=:cRԷiya~7HA:}=B:!g6Wt+HMަ 3!}`1!]ҥy݀tm_~ F~ __my~k&_';w 5w]A?h\? 5렿c*&{}Au [C2d2|ntb!2E Ai,?2YD9dJ S2G s2'!s>d.$B+dBf?˙aY^ow~'!#d^<;mȎ6lpfwdH8wƞ)ݛSK7`!I io`gZ [AE13&\ŠI+0C ܋ɐ{yr@8UA ޫAc:Cfȷ.eu ;@Esկw eC~'!+ͅȫ>7ˌB9Պ ȏq!<SB~(/Rb@ BPjPwP^P0BPPPmNP8P(mL(ئAaš jPevPXmP <.p{*A?rĚ~Lz(`&ހ;|bn g8`;Nk]P(> W^gO(>Ժ>wf'q** @QyU%Eu{(j^-/k\(\ P,qb+/@#C(: ׫`%eY( ] %Z( %P2](E5֘z(9 qOIgCTArHXAž*NPq^P)< @%a=T=PY0+T6PIJ"T.ʵPM]4W0T xCc<jc@ P51oӫ6[e@}ԭ;Bݦ=ougC}C73q^Kh hlmC$q 428:/m.oc5Mu[h?M{hFJB3ʛU=G>V q, | ͯE%`- ZgAKhNp :ֆ\hBk+hm)֑к +;ʍЪeu_u aݏp0l)bf S70%;hwbX/^hmu5Sv@0Ե=Բ?w=ОW xih'|v6A;uAGо56p~gC [t,A13W@g l>$@gWg J98:@;<{Щev|u5}ڜ7t ;z1|ގ;8#=zMَi0TC)˦3@V?reЗτB1J$UB_ zAz9Ro}Gigi~WBWпrWCv?>C/ _0C@n) @W `0w`0 ad 3 VAdY0Xo-a}8{- .5Ư vq0C,ۻ܅~|-~fs4˔Ӝ> Fnq0|00F7`tI>݁a0/y0jc{Wqw:SazlָW`|+q=x g_ Os'$! &I>0YP0I]%0Y-+X_/̆I0]CaoLô-S\Nm`:*0u]rxqz]~L~apA}`:UO`:# 4R0]0 ;2"vFL`0]J0]f S07S3 fR0΁Y0S3Esń,v?a|VDlQ7a5̶[0{PΩ/UaV ft},٧]0uW럴h`, u B5XloʷŎpX>}_`v¢X! -d~e)=C OYr^Xҽ,=$`9q,wr>XΪebX&i3܆B/e:3rgwVgq-<ˣ`y,wX>eM,laY;UUVZ+2+2.6&/VSVjZ6U#?j*H`䘧|z9z~XOφ,TH-XmxAMyj67͚趽6 y̼=~4l;VX]~؊p<*FVy/lU`vlVg-l`z}?`[: ۊ.4ʹW`F2`[kۯ'0_(51FƨQ3q'8r=ّ[u$g4v`tva7c¥a7?aUvWaegal;첷.w5حuaBngrp8 HCQp0up^cᐔ G0[փp[ákGr8 lc8JhñH88j<>8Fz11ͽ] Sv8]Wm8u̇S8 ?!8u S#pc9I7- qpRb\yTIu80^ 'tv\8ͭ>q]SS=9}8/S$;#biG8[j8%eiq=,Ĭ/g$")Nyp=N{Vin8;T<NJp:y(68WɳpWtF bt9|_`tPs΂{< 48oKޘs\ޯϞupG8. we)\%\RO% .˔j|*\֞˺|lh m\vbycpp.l\ pAps.wpy)*AQpK+Jբ)\pP)| ]E8\wl롉p=l]w-$>`Lf: nfpp(Fh] p{n(rw0+σgܭ}ܭ`wG[Ng8o{7a-pp?~=0 7½i(,l?{ oJNW1f+<ålxLyC }UxN9Ƕ |?KG2x u / ɸ0켒 <-c1<% O #Z5\x- 0o3C޲ߒ4i ^Y^ xweN'|孧 g>'~8|l0 >*8>_DGM3|[ޑ>9U 59s>99 >DçAch Lp 076/DŽJ0ag &upb©՘p&?[. 10t &DŽ+1 Ueu ~Nl>ִji6$cf^iV1md{L-4u`w5ôYc0mg~!*Pe*^C 8dz_sC5k!44C-VLOڌ a.XS`z-Lϙ髽1=w}՘~P3U?ae6$9ĶH?nuHD$*A4$6B/$N$,$!G~$E5lGR3DT$-exkgc~o}0_ū0Z,VV`~ggۈ^ݐ\CUɪcf{tuH/h7@K},X ֎ IcAwX`Uv6Zn" X "\`g,{`ACX#saJ)JH3 %mR@r)_`:g/ۂH9ށa RN!S\ FJ'Rl摑%{V]w?sRwu6Զq ~=~'7L~T3yf^7w/z/eTAHwBh!UuR@}SMVc(ƺH51AL@g;CO4RCn u&?C:ԈH0FHi\Z"itE҆ C6Րf i&H3UB Y29mi.fĿ:믹G&xG)MC;yV!my_AUM܄w iH FڴHU~HBlEHis!-$ m2I33[[775ϚzgR -fJ"-Y/|$Vߧ5H]<}nmE!7%[{0%ĦAHȐDez uȘRȘmAj3dz!g$2}G#sud F ^̩QȜ&ж,7B9Wo@{5d߄55DYrȒEY?5o!O6kD ݑ膬QeZY+W!kTdBY_dUH B +d=쌬'ot-Ʋʥ O ]3כ==|ys1;jMYyD:7Tjً%CBqdo]퐽{$d {/Xldß}MamdW #hFo ]6aŨX~beV`e|EV>G>:g`9Xp0 .bgG9Uuȑ=j6:qGΘqNEKW不y#4GNTfwR99)Y 96-6)2D =9^ F4jWwjXk>bͧ4| kjr;al5O3yx\߽i<+6."GJ|DQJmF3?+g\H*y!We r/nFK书!f!o}Ee oR!/# /ɘ9Gی^1[뀼wy fꢑW/n&;wcE06X?"lpC~b;|.o/p!c-;#s(#_,+Vn݌kA6u ߴĚ=u3\3g q?#?4;2s}b8XM5eϵGoʐmswD"_A_j >ȩ/zP BPе y'@k9 e@GzQXT8E(C7 |tQ!R#(؝Pp NEy9܏aܹ_9kbaܹm_QpԂ;]-@Ad+_~WnFs?oFۦ~p}/7 > K6wyM5G{;vP`( UX68vܽ կPs u^P7 QhB(՛ Nб6B( Aᬵ(4Fa p|ƎjQ7k;0?G/w~`hz;Px7Q㾽z/sU=)iPZJZ4hQ$ Q!#;3{RY!t$ qߟqus|^yl=6 6q3\&n{l,M*MB1$M^$1$`S_Sr&7ؤNjM#3嬊տkߝm睦Ny4Yo;{tl M4+b°igSVlǦO?bؼTW~؜yؼw>\[92[9VZimN6%6=m× 6q;`1sl;qꇾcCv@Ӿ6c[]O(~(`Kzd.9,5 Q0GP0$C FP`QQ(g((p؅Gue]vv׻}x0 lGѧ(x{\Q 96`7ucm:K};uvtZkF`Zkc:;XݻaZtbpcOg1t=2#!=}`OQ9=3|iZc=#0[Ğ'{G{4԰H읣ћ7X>ޕwu-Kފ[xbG>7 栰;v} V}ƿqI͹OoܽoSwhS%?^hwva бNWQ8!W= S) }pj 0Pi2 7GV}@,F)9(<E\)(Љ":VxNq|?q-q#P9 E{z\@: ex"Rr4HE3EhJy3ESh2Ynrؽh67}oQtE <? _2ye[#|q@cxBo|Wz:9rۗ!ݡq_???޻x!GvӜ7(~8`9/P8qW8,SߩvƁ8pg}`<Ǟx5OFfވs(>E}QWϡo}E)(~_P8ťk/^M18&^pLz{twyK1U pCS+ƱR81;cqlyscV8cq80ǖDZ|8v%fx]m]l] .]DZI8ve]ƱpD{֍X݆x18P x./ N8$p@?TqR㟥pd( 8aNpOp'DpzvN/q:S=N:}֩ pJKVꋃ8&W ''53p*DL38#g4pYga8z g"xq&Rgfęhk8:{Wg:!?z,}g߻GXgS;wn9s',p|;sgzYV\p 8W >jܧ9&yvyQ8=GhNy8p^QZ~5y8of #/%O8