DNAcopy/DESCRIPTION0000644000175200017520000000125614710276573014617 0ustar00biocbuildbiocbuildPackage: DNAcopy Title: DNA Copy Number Data Analysis Version: 1.80.0 Author: Venkatraman E. Seshan, Adam Olshen Description: Implements the circular binary segmentation (CBS) algorithm to segment DNA copy number data and identify genomic regions with abnormal copy number. Maintainer: Venkatraman E. Seshan LazyData: yes License: GPL (>= 2) biocViews: Microarray, CopyNumberVariation NeedsCompilation: yes git_url: https://git.bioconductor.org/packages/DNAcopy git_branch: RELEASE_3_20 git_last_commit: f89937b git_last_commit_date: 2024-10-29 Repository: Bioconductor 3.20 Date/Publication: 2024-10-29 Packaged: 2024-10-30 00:27:39 UTC; biocbuild DNAcopy/MD50000644000175200017520000000615514710276573013424 0ustar00biocbuildbiocbuild37d105081cd044895840ab8d454ba912 *DESCRIPTION 42bd2e8aa8e5db3b0ec7beb6bc281382 *NAMESPACE 21159c86bcc5c2add3d9a21490f8d5e4 *NEWS.md 35ef5bd520d0bbe1e552ce74addb0c5e *R/DNAcopyMethods.R 71c7d50fe1ed0eafbd103637c5ad4982 *R/changepoints.R a189b53eabb881fc3a3e14556dfee518 *R/exonsegment.R 550d14ea05891d2100ba204f8ae030d6 *R/getbdry.R 76fd0225087cdd5e22e7c7195127c81b *R/glFrequency.R 2ff59c35b7b403086f9f5150a045aab1 *R/plotSample.R b5c053bb0fc7d59afc1a1756c7246cab *R/segment.R 68c979b8c3a660cb32789550fc439c91 *R/segmentp.R 6b0705a78740320bdb062783bd167dfc *R/segmentsummary.R fb7c7811b81addd437b14e9b5c5452b2 *R/zoomIntoRegion.R b21666310cb8463665bea63e76233ce0 *R/zzz.R 0e48433360b0f1e6f9f796a2515fcb69 *README.md 0a7aff298579347653faec8e9d94aeea *build/vignette.rds 0279c38d1b726df1db6a9d6a39817814 *chrom-lengths 7118a74df44aa3b08d250e9ae6314ead *data/coriell.rda 5d0a23cd6267712f5556996d000a2d47 *data/cytoBand.tab.gz 34c7856a55da9d1876c26d7569dee9a5 *data/default.DNAcopy.bdry.rda 53deebf9321023ada7c49539f0841a59 *demo/00Index 027f2877dc8867863453a2ac8b812d78 *demo/DNAcopy.R df4d315873ffe86635916a3681d35626 *inst/CHANGES e7f13de6e608011d9feba9573841e591 *inst/benchmark/benchmark,20090610,segment.R c73dbf47b41155a568dda22e689950fe *inst/doc/DNAcopy.R 1d79c602a154ff1f9eced567e7821c18 *inst/doc/DNAcopy.Rnw 4847b2face75fdc321eedb8cdc5ac8d9 *inst/doc/DNAcopy.pdf 88851970804962a02cf8c5d851d2adaa *man/CNA.Rd 21be50aa8b3b03e51de2aa7681e9dd6f *man/DNAcopy-internal.Rd e9ee65dabedc8df7f66027530649a274 *man/DNAcopy.Rd 8d8f14077a7884acdb3bcf377a1fdde0 *man/coriell.Rd 241193e1c40e6bb4da9a270221c5de27 *man/cytoBand.Rd 29e90231e7e3e2a3dc26af6000f86cf2 *man/exon.segment.Rd ecc67e79791299b694007f44d50a8a99 *man/getbdry.Rd 749997582dbaca3c9182813acfc6068b *man/glFrequency.Rd 76e361b06badcd86ec249c5764ecd60d *man/plot.DNAcopy.Rd 5c9d6c92314e38a24e57deb859c75ba9 *man/plotSample.Rd 8f029ca45ff824e90a60cd91d5815b0a *man/segment.Rd b71bcc1ac95f0e8182a4a65462a27827 *man/segments.p.Rd 03c3b7d820d48cacdb759da715ba86b5 *man/segments.summary.Rd e356b0e080240d4ea12948dbbd1a05b6 *man/smooth.CNA.Rd ad221e602b81fef1aa09ea564dc4d5f5 *man/subset.CNA.Rd 7e680b070c1274e2d015b3118d136a0f *man/subset.DNAcopy.Rd a22a7abda74e3b0b7ccfd8719c2a6638 *man/zoomIntoRegion.Rd 98846e9194410fc5a7000f3ffb74f628 *src/cbsWtstats.f 704350b55a7a2e1445b484c02bff4540 *src/cbststats.f c79b61d6a29bf2141c91794cd5222f55 *src/changepoints-wtd.f e1d75314d0b09708f4fa88b1d7b90d95 *src/changepoints.f 616c584748e80af8ec257f6429bbb9ba *src/esegment.f 297b8774b329b654f55d54c3ee24fdf2 *src/flchoose.c 51343d5479c471bf932582e80566f862 *src/fphyper.c 01d21026225f3dfd0c7486627fd6567f *src/fpnorm.c b12c72a352180cd4ffc0476ef71b4b30 *src/getbdry.f c5ecc3c6f0a904fbc5c74baa239ac926 *src/init.c 56aa712faf3ad2da3a656c7ae37da238 *src/prune.f 38d4530efe19e61b4d63a6f13da8a966 *src/rshared.c aa7465d2465c9ec3814ff188a60b8e92 *src/segmentp.f dcfd0f59d84fb2df3af4546bc70bafc6 *src/smoothCNA.f 2ca7e70cc80e4849e906b47f25807c4e *src/tailprobs.f 03aaa4d4404b5b57466df3f12e4216f8 *tests/redundancy,20090610,segment.R 1d79c602a154ff1f9eced567e7821c18 *vignettes/DNAcopy.Rnw 2d5b7fa4051ac05370e63dba81a45360 *vignettes/DNAcopy.bib DNAcopy/NAMESPACE0000644000175200017520000000060714710217127014315 0ustar00biocbuildbiocbuilduseDynLib(DNAcopy) import(stats,graphics) importFrom("grDevices", "dev.cur", "dev.interactive", "dev.new") importFrom("utils", "data") export("CNA","exon.segment","getbdry","segment","segments.p","segments.summary","smooth.CNA","glFrequency","plotSample","zoomIntoRegion") S3method(print, CNA) S3method(plot, DNAcopy) S3method(print, DNAcopy) S3method(subset, CNA) S3method(subset, DNAcopy) DNAcopy/NEWS.md0000644000175200017520000000103414710217127014167 0ustar00biocbuildbiocbuild# DNAcopy 1.75.5 (10/08/2023) * Fixed the bug in passing weights for weighted segmentation # DNAcopy 1.75.4 (07/05/2023) * Updated the reference and source for Coriell data # DNAcopy 1.75.3 (06/29/2023) * Added init.c to register native (Fortran) routines and to disable symbol search * Gzipped cytoBand.tab and converted default.DNAcopy.bdry to rda file in data directory # DNAcopy 1.75.2 (06/27/2023) * Added a `NEWS.md` file to track changes to the package. * changed all dfloat in fortran to dble (Ripley email for CRAN/clinfun) DNAcopy/R/0000755000175200017520000000000014710217127013274 5ustar00biocbuildbiocbuildDNAcopy/R/DNAcopyMethods.R0000644000175200017520000003571414710217127016252 0ustar00biocbuildbiocbuildCNA <- function(genomdat, chrom, maploc, data.type=c("logratio","binary"), sampleid=NULL, presorted=FALSE) { if (is.data.frame(genomdat)) genomdat <- as.matrix(genomdat) if (!is.numeric(genomdat)) stop("genomdat must be numeric") if (!is.numeric(maploc)) stop("maploc must be numeric") data.type <- match.arg(data.type) ina <- (!is.na(chrom) & is.finite(maploc)) if (sum(!ina)>0) warning("markers with missing chrom and/or maploc removed\n") if (!presorted) { sortindex <- which(ina)[order(chrom[ina], maploc[ina])] } else { sortindex <- which(ina) } if (is.factor(chrom)) chrom <- as.character(chrom) # added to allow arrays of single dimension - results from data.frame ops if (is.array(genomdat)) { if (length(dim(genomdat)) == 1) { genomdat <- as.matrix(genomdat) } } if (is.vector(genomdat)) genomdat <- as.matrix(genomdat) if (!missing(sampleid)) { if (length(sampleid) != ncol(genomdat)) { warning("length(sampleid) and ncol(genomdat) differ, names ignored\n") sampleid <- paste("Sample", 1:ncol(genomdat)) } } else { sampleid <- paste("Sample", 1:ncol(genomdat)) } colnames(genomdat) <- sampleid zzz <- data.frame(chrom=I(chrom), maploc=maploc, genomdat) zzz <- zzz[sortindex,] # check for duplicate probes (i.e. repeated maploc within a chromosome) if (length(ii <- which(diff(maploc)==0)) > 0) { if (any(chrom[ii]==chrom[ii+1])) warning("array has repeated maploc positions\n") } attr(zzz, "data.type") <- data.type class(zzz) <- c("CNA","data.frame") zzz } subset.CNA <- function(x, chromlist=NULL, samplelist=NULL, ...) { if (!inherits(x, 'CNA')) stop("First arg must be of class CNA") chrom <- x$chrom uchrom <- unique(chrom) if (missing(chromlist)) chromlist <- uchrom if (length(setdiff(chromlist, uchrom)) > 0) stop("chromlist contains chromosomes not in the data") if (length(chromlist) > length(unique(chromlist))) warning("duplicate chromosomes in chromlist removed") sampleid <- colnames(x)[-(1:2)] if (missing(samplelist)) samplelist <- sampleid nsample <- length(sampleid) if (length(setdiff(samplelist, 1:nsample)) > 0 & length(setdiff(samplelist, sampleid)) > 0) stop("samplelist should be a list of valid sample numbers or names") if (!is.numeric(samplelist)) samplelist <- match(samplelist, names(x)) - 2 if (length(samplelist) > length(unique(samplelist))) warning("duplicate samples in samplelist removed") samplelist <- unique(samplelist) y <- x[chrom %in% chromlist,c(1:2,samplelist+2)] attr(y, "data.type") <- attr(x, "data.type") y } smooth.CNA <- function(x, smooth.region=10, outlier.SD.scale=4, smooth.SD.scale=2, trim=0.025) { if (!inherits(x, 'CNA')) stop("First arg must be of class CNA") nsample <- ncol(x)-2 chrom <- x$chrom uchrom <- unique(chrom) if(attr(x, "data.type")=="binary") stop("Not smoothing binary data ") for (isamp in 1:nsample) { genomdat <- x[,isamp+2] ina <- which(is.finite(genomdat)) trimmed.SD <- sqrt(trimmed.variance(genomdat[ina], trim)) outlier.SD <- outlier.SD.scale*trimmed.SD smooth.SD <- smooth.SD.scale*trimmed.SD k <- smooth.region n <- length(genomdat[ina]) cfrq <- diff(c(which(!duplicated(chrom[ina])), n+1)) nchr <- length(cfrq) # to allow for some chrom with all missing smoothed.data <- .Fortran("smoothLR", as.integer(n), as.double(genomdat[ina]), as.integer(nchr), as.integer(cfrq), sgdat=double(n), as.integer(k), as.double(outlier.SD), as.double(smooth.SD), PACKAGE = "DNAcopy")$sgdat x[,isamp+2][ina] <- smoothed.data } x } print.CNA <- function(x, ...) { if (!inherits(x, 'CNA')) stop("First arg must be of class CNA") cat("Number of Samples", ncol(x)-2, "\nNumber of Probes ", nrow(x), "\nData Type ", attr(x,"data.type"),"\n") } plot.DNAcopy <- function (x, plot.type=c("whole", "plateau", "samplebychrom", "chrombysample"), xmaploc=FALSE, altcol=TRUE, sbyc.layout=NULL, cbys.nchrom=1, cbys.layout=NULL, include.means=TRUE, zeroline=TRUE, pt.pch=NULL, pt.cex=NULL, pt.cols=NULL, segcol=NULL, zlcol=NULL, ylim=NULL, lwd=NULL, ...) { if (!inherits(x, "DNAcopy")) stop("First arg must be the result of segment") xdat <- x$data nsample <- ncol(xdat)-2 if(missing(ylim)) { uylim <- max(abs(xdat[,-(1:2)]), na.rm=TRUE) ylim <- c(-uylim, uylim) } xres <- x$output if(dev.cur() <= 1) dev.new() int.dev <- dev.interactive() plot.type <- match.arg(plot.type) op <- par(no.readonly = TRUE) parask <- par("ask") if (int.dev & !parask & nsample>1) par(ask = TRUE) sampleid <- colnames(xdat)[-(1:2)] chrom0 <- xdat$chrom uchrom <- unique(chrom0) nchrom <- length(uchrom) if (xmaploc) { maploc0 <- as.numeric(xdat$maploc) if(length(uchrom)>1 & max(maploc0[chrom0==uchrom[1]]) > min(maploc0[chrom0==uchrom[2]])) { plen <- max(maploc0[chrom0==uchrom[1]]) for(i in 2:nchrom) { maploc0[chrom0==uchrom[i]] <- plen + maploc0[chrom0==uchrom[i]] plen <- max(maploc0[chrom0==uchrom[i]]) } } } if (missing(pt.pch)) pt.pch <- "." if (missing(pt.cex)) { if (pt.pch==".") { pt.cex <- 3} else {pt.cex <- 1} } wcol0 <- rep(1, length(chrom0)) if (altcol) { j <- 0 for (i in uchrom) { j <- (j+1) %% 2 wcol0[chrom0==i] <- 1+j } } if (missing(pt.cols)) pt.cols <- c("black","green") if (missing(segcol)) segcol <- "red" if (missing(zlcol)) zlcol <- "grey" if (missing(lwd)) lwd <- 3 if (plot.type == "chrombysample") { cat("Setting multi-figure configuration\n") par(mar = c(0, 4, 0, 2), oma = c(4, 0, 4, 0), mgp = c(2, 0.7, 0)) if (missing(cbys.layout)) { nrow <- ncol <- ceiling(sqrt(nsample)) if (nrow*ncol - nsample > 0) { nrow <- nrow - 1 ncol <- ncol + 1 } if (nrow*ncol - nsample >= nrow) ncol <- ncol - 1 cbys.layout <- c(nrow, ncol) } lmat0 <- lmat1 <- c(1:nsample, rep(-cbys.nchrom*nsample, prod(cbys.layout) - nsample)) for(i in 1:(cbys.nchrom-1)) { lmat1 <- c(lmat1,lmat0+nsample*i) } lmat1[lmat1<0] <- 0 lmat <- matrix(lmat1, nrow = cbys.layout[1], ncol = cbys.nchrom*cbys.layout[2], byrow = FALSE) layout(lmat) } if (plot.type == "samplebychrom") { cat("Setting multi-figure configuration\n") par(mar = c(4, 4, 4, 2), oma = c(0, 0, 2, 0), mgp = c(2, 0.7, 0)) if (missing(sbyc.layout)) { nrow <- ncol <- ceiling(sqrt(nchrom)) if (nrow*ncol - nchrom > 0) { nrow <- nrow - 1 ncol <- ncol + 1 } if (nrow*ncol - nchrom > ncol) ncol <- ncol - 1 sbyc.layout <- c(nrow, ncol) } lmat <- matrix(c(1:nchrom, rep(0,prod(sbyc.layout)-nchrom)), nrow = sbyc.layout[1], ncol = sbyc.layout[2], byrow=TRUE) layout(lmat) } if (plot.type == "chrombysample") { atchrom <- 0.5/cbys.nchrom for (ichrom in uchrom) { if (xmaploc) maploc1 <- maploc0[chrom0==ichrom] for (isamp in 1:nsample) { genomdat <- xdat[chrom0==ichrom, isamp+2] ina <- which(is.finite(genomdat)) genomdat <- genomdat[ina] if (xmaploc) maploc <- maploc1[ina] ii <- cumsum(c(0, xres$num.mark[xres$ID == sampleid[isamp] & xres$chrom==ichrom])) mm <- xres$seg.mean[xres$ID == sampleid[isamp] & xres$chrom==ichrom] kk <- length(ii) zz <- cbind(ii[-kk] + 1, ii[-1]) if (xmaploc) { plot(maploc, genomdat, pch = pt.pch, cex=pt.cex, xaxt="n", ylim = ylim, ylab = sampleid[isamp]) } else { plot(genomdat, pch = pt.pch, cex=pt.cex, xaxt="n", ylim = ylim, ylab = sampleid[isamp]) } if(zeroline) abline(h=0, col=zlcol, lwd=lwd) if (isamp%%cbys.layout[1] == 0) { axis(1, outer=TRUE) title(xlab="Index") } if (include.means) { if (xmaploc) { segments(maploc[zz[,1]], mm, x1=maploc[zz[,2]], y1=mm, col = segcol, lwd=lwd) } else { segments(zz[,1], mm, x1=zz[,2], y1=mm, col = segcol, lwd=lwd) } # for (i in 1:(kk - 1)) { # if (xmaploc) { # lines(maploc[zz[i, ]], rep(mm[i], 2), col = segcol, lwd=lwd) # } else { # lines(zz[i, ], rep(mm[i], 2), col = segcol, lwd=lwd) # } # } } } mtext(paste("Chromosome",ichrom), side = 3, line = 1, at = atchrom, outer=TRUE, font=2) atchrom <- atchrom + 1/cbys.nchrom atchrom <- atchrom - floor(atchrom) } } else { for (isamp in 1:nsample) { genomdat <- xdat[, isamp+2] ina <- which(is.finite(genomdat)) genomdat <- genomdat[ina] wcol <- wcol0[ina] chrom <- chrom0[ina] if (xmaploc) maploc <- maploc0[ina] ii <- cumsum(c(0, xres$num.mark[xres$ID == sampleid[isamp]])) mm <- xres$seg.mean[xres$ID == sampleid[isamp]] kk <- length(ii) zz <- cbind(ii[-kk] + 1, ii[-1]) if(missing(ylim)) ylim <- range(c(genomdat, -genomdat)) if (plot.type=="whole") { if (xmaploc) { plot(maploc, genomdat, pch = pt.pch, cex=pt.cex, col=pt.cols[wcol], main = sampleid[isamp], ylab = "", ylim = ylim) if(zeroline) abline(h=0, col=zlcol, lwd=lwd) } else { plot(genomdat, pch = pt.pch, cex=pt.cex, col=pt.cols[wcol], main = sampleid[isamp], ylab = "", ylim = ylim) if(zeroline) abline(h=0, col=zlcol, lwd=lwd) } if (include.means) { if (xmaploc) { segments(maploc[zz[,1]], mm, x1=maploc[zz[,2]], y1=mm, col = segcol, lwd=lwd) } else { segments(zz[,1], mm, x1=zz[,2], y1=mm, col = segcol, lwd=lwd) } # for (i in 1:(kk - 1)) # { # if (xmaploc) { # lines(maploc[zz[i, ]], rep(mm[i], 2), col = segcol, lwd=lwd) # } else { # lines(zz[i, ], rep(mm[i], 2), col = segcol, lwd=lwd) # } # } } } if (plot.type=="samplebychrom") { cc <- xres$chrom[xres$ID == sampleid[isamp]] for (ichrom in uchrom) { if (xmaploc) { plot(maploc[chrom == ichrom], genomdat[chrom == ichrom], pch = pt.pch, cex=pt.cex, xlab="maploc", ylab = "", main = paste("Chromosome", ichrom), ylim = ylim) } else { plot(genomdat[chrom == ichrom], pch = pt.pch, cex=pt.cex, ylab = "", main = paste("Chromosome", ichrom), ylim = ylim) } if(zeroline) abline(h=0, col=zlcol, lwd=lwd) if (include.means) { jj <- which(cc==ichrom) jj0 <- min(jj) if (xmaploc) { segments(maploc[zz[jj,1]], mm[jj], x1=maploc[zz[jj,2]], y1=mm[jj], col = segcol, lwd=lwd) } else { segments(1+zz[jj,1]-zz[jj0,1], mm[jj], x1=1+zz[jj,2]-zz[jj0,1], y1=mm[jj], col = segcol, lwd=lwd) } # for (i in jj) # { # if (xmaploc) { # lines(maploc[zz[i, ]], rep(mm[i], 2), col = segcol, lwd=lwd) # } else { # lines(1+zz[i, ]-zz[jj0,1], rep(mm[i], 2), col = segcol, lwd=lwd) # } # } } } mtext(sampleid[isamp], side = 3, line = 0, outer = TRUE, font=2) } if (plot.type=="plateau") { omm <- order(mm) ozz <- zz[omm,] ina <- unlist(apply(ozz, 1, function(ii) ii[1]:ii[2])) plot(genomdat[ina], pch = pt.pch, cex=pt.cex, main = sampleid[isamp], ylab = "", ylim = ylim) if(zeroline) abline(h=0, col=zlcol, lwd=lwd) if (include.means) { ii <- cumsum(c(0, xres$num.mark[xres$ID == sampleid[isamp]][omm])) smm <- mm[omm] zz <- cbind(ii[-kk] + 1, ii[-1]) segments(zz[,1], smm, x1=zz[,2], y1=smm, col = segcol, lwd=lwd) # for (i in 1:(kk-1)) lines(zz[i, ], rep(smm[i], 2), col = segcol, lwd=lwd) } } } } on.exit( if (plot.type=="chrombysample" | plot.type=="samplebychrom") { par(op) } else { if(int.dev & !parask & nsample>1) par(ask=parask) }) } print.DNAcopy <- function(x, showSegRows=FALSE, ...) { if (!inherits(x, "DNAcopy")) stop("Object is not the result of segment") if (!is.null(cl<- x$call)) { cat("Call:\n") dput(cl) cat("\n") } if (showSegRows) { if (is.null(x$segRows)) { print(x$output) warning("segRows missing. Object may be a subset or from DNAcopy < 1.23.2.\n") } else { print(cbind(x$output, x$segRows)) } } else { print(x$output) } } subset.DNAcopy <- function(x, chromlist=NULL, samplelist=NULL, ...) { if (!inherits(x, 'DNAcopy')) stop("First arg must be of class DNAcopy") zdat <- x$data zres <- x$output chrom <- zdat$chrom uchrom <- unique(chrom) if (missing(chromlist) | is.null(chromlist)) chromlist <- uchrom if (length(setdiff(chromlist, uchrom)) > 0) stop("chromlist contains chromosomes not in the data") if (length(chromlist) > length(unique(chromlist))) warning("duplicate chromosomes in chromlist removed") sampleid <- colnames(zdat)[-(1:2)] if (missing(samplelist)) samplelist <- sampleid nsample <- length(sampleid) if (length(setdiff(samplelist, 1:nsample)) > 0 & length(setdiff(samplelist, sampleid)) > 0) stop("samplelist should be a list of valid sample numbers or names") if (!is.numeric(samplelist)) samplelist <- match(samplelist, names(zdat)) - 2 if (length(samplelist) > length(unique(samplelist))) warning("duplicate samples in samplelist removed") samplelist <- unique(samplelist) jj <- unlist(sapply(sampleid[samplelist], function(i, id) {which(id==i)}, zres$ID )) zres <- zres[jj,] y <- list() y$data <- zdat[chrom %in% chromlist,c(1:2,samplelist+2)] attr(y$data, "data.type") <- attr(zdat, "data.type") y$output <- zres[zres$chrom %in% chromlist,] class(y) <- "DNAcopy" y } # Chromosome.Lengths <- c(263, 255, 214, 203, 194, 183, 171, 155, 145, 144, 144, 143, 114, 109, 106, 98, 92, 85, 67, 72, 50, 56, 164, 59) # names(Chromosome.Lengths) <- c(as.character(1:22),"X","Y") DNAcopy/R/changepoints.R0000644000175200017520000001674114710217127016112 0ustar00biocbuildbiocbuildchangepoints <- function(genomdat, data.type="logratio", alpha=0.01, weights= NULL, sbdry, sbn, nperm=10000, p.method="hybrid", min.width=2, kmax=25, nmin=200, trimmed.SD=NULL, undo.splits="none", undo.prune=0.05, undo.SD=3, verbose=1, ngrid=100, tol=1e-6) { n <- length(genomdat) if (missing(trimmed.SD)) trimmed.SD <- mad(diff(genomdat))/sqrt(2) # start with the whole seg.end <- c(0,n) k <- length(seg.end) change.loc <- NULL weighted <- ifelse(is.null(weights), FALSE, TRUE) while (k > 1) { current.n <- seg.end[k]-seg.end[k-1] if (verbose>=3) cat(".... current segment:",seg.end[k-1]+1,"-",seg.end[k],"\n") if(current.n >= 2*min.width) { current.genomdat <- genomdat[(seg.end[k-1]+1):seg.end[k]] # check whether hybrid method needs to be used hybrid <- FALSE delta <- 0 if ((p.method=="hybrid") & (nmin < current.n)) { hybrid <- TRUE delta <- (kmax+1)/current.n } # call the changepoint routine if (weighted) { # get the weights for the current set of probes current.wts <- weights[(seg.end[k-1]+1):seg.end[k]] current.rwts <- sqrt(current.wts) current.cwts <- cumsum(current.wts)/sqrt(sum(current.wts)) # if all values of current.genomdat are the same don't segment if (isTRUE(all.equal(diff(range(current.genomdat)), 0))) { zzz <- list() zzz$ncpt <- 0 } else { # centering the current data will save a lot of computations later current.avg <- sum(current.genomdat*current.wts)/sum(current.wts) current.genomdat <- current.genomdat - current.avg # need total sum of squares too current.tss <- sum(current.wts*(current.genomdat^2)) zzz <- .Fortran("wfindcpt", n=as.integer(current.n), x=as.double(current.genomdat), tss=as.double(current.tss), wts=as.double(current.wts), rwts=as.double(current.rwts), cwts=as.double(current.cwts), px=double(current.n), sx=double(current.n), nperm=as.integer(nperm), cpval=as.double(alpha), ncpt=integer(1), icpt=integer(2), hybrid=as.logical(hybrid), al0=as.integer(min.width), hk=as.integer(kmax), mncwt=double(kmax), delta=as.double(delta), ngrid=as.integer(ngrid), sbn=as.integer(sbn), sbdry=as.integer(sbdry), tol= as.double(tol), PACKAGE="DNAcopy") } } else { # if all values of current.genomdat are the same don't segment if (isTRUE(all.equal(diff(range(current.genomdat)), 0))) { zzz <- list() zzz$ncpt <- 0 } else { # centering the current data will save a lot of computations later current.avg <- mean(current.genomdat) current.genomdat <- current.genomdat - current.avg # need total sum of squares too current.tss <- sum(current.genomdat^2) zzz <- .Fortran("fndcpt", n=as.integer(current.n), x=as.double(current.genomdat), tss=as.double(current.tss), px=double(current.n), sx=double(current.n), nperm=as.integer(nperm), cpval=as.double(alpha), ncpt=integer(1), icpt=integer(2), ibin=as.logical(data.type=="binary"), hybrid=as.logical(hybrid), al0=as.integer(min.width), hk=as.integer(kmax), delta=as.double(delta), ngrid=as.integer(ngrid), sbn=as.integer(sbn), sbdry=as.integer(sbdry), tol= as.double(tol), PACKAGE="DNAcopy") } } } else { zzz <- list() zzz$ncpt <- 0 } if(zzz$ncpt==0) change.loc <- c(change.loc,seg.end[k]) seg.end <- switch(1+zzz$ncpt,seg.end[-k], c(seg.end[1:(k-1)],seg.end[k-1]+zzz$icpt[1],seg.end[k]), c(seg.end[1:(k-1)],seg.end[k-1]+zzz$icpt,seg.end[k])) k <- length(seg.end) if(verbose>=3) cat(".... segments to go:",seg.end,"\n") } seg.ends <- rev(change.loc) nseg <- length(seg.ends) lseg <- diff(c(0,seg.ends)) if (nseg > 1) { if (undo.splits == "prune") { lseg <- changepoints.prune(genomdat, lseg, undo.prune) } if (undo.splits == "sdundo") { lseg <- changepoints.sdundo(genomdat, lseg, trimmed.SD, undo.SD) } } segmeans <- 0*lseg ll <- uu <- 0 for(i in 1:length(lseg)) { uu <- uu + lseg[i] if (weighted) { segmeans[i] <- sum(genomdat[(ll+1):uu]*weights[(ll+1):uu])/sum(weights[(ll+1):uu]) } else { segmeans[i] <- mean(genomdat[(ll+1):uu]) } ll <- uu } list("lseg" = lseg, "segmeans" = segmeans) } changepoints.prune <- function(genomdat, lseg, change.cutoff=0.05) { n <- length(genomdat) nseg <- length(lseg) ncpt <- nseg-1 zzz <- .Fortran("prune", as.integer(n), as.double(genomdat), as.integer(nseg), as.integer(lseg), as.double(change.cutoff), double(nseg), as.integer(ncpt), loc=integer(ncpt), integer(2*ncpt), pncpt=integer(1), PACKAGE="DNAcopy") pruned.ncpt <- zzz$pncpt pruned.cpts <- cumsum(lseg)[zzz$loc[1:pruned.ncpt]] pruned.lseg <- diff(c(0,pruned.cpts,n)) pruned.lseg } changepoints.sdundo <- function(genomdat, lseg, trimmed.SD, change.SD=3) { change.SD <- trimmed.SD*change.SD cpt.loc <- cumsum(lseg) sdundo <- TRUE while(sdundo) { k <- length(cpt.loc) if (k>1) { segments0 <- cbind(c(1,1+cpt.loc[-k]),cpt.loc) segmed <- apply(segments0, 1, function(i,x) {median(x[i[1]:i[2]])}, genomdat) adsegmed <- abs(diff(segmed)) if (min(adsegmed) < change.SD) { i <- which(adsegmed == min(adsegmed)) cpt.loc <- cpt.loc[-i] } else { sdundo <- FALSE } } else { sdundo <- FALSE } } lseg.sdundo <- diff(c(0,cpt.loc)) lseg.sdundo } trimmed.variance <- function(genomdat, trim=0.025) { n <- length(genomdat) n.keep <- round((1-2*trim)*(n-1)) inflfact(trim)*sum((sort(abs(diff(genomdat)))[1:n.keep])^2 / (2*n.keep)) } inflfact <- function(trim) { a <- qnorm(1-trim) x <- seq(-a,a,length.out=10001) x1 <- (x[-10001] + x[-1])/2 1/(sum(x1^2*dnorm(x1)/(1-2*trim))*(2*a/10000)) } DNAcopy/R/exonsegment.R0000644000175200017520000000324114710217127015753 0ustar00biocbuildbiocbuildexon.segment <- function(gene, eloc, edat, ngrid=100, tol=1e-6) { ii <- order(gene, eloc) gene <- gene[ii] eloc <- eloc[ii] if (is.matrix(edat)) { edat <- edat[ii,] } else { edat <- cbind(edat[ii]) } ugene <- unique(gene) ngene <- length(ugene) nsample <- ncol(edat) out.stat <- out.loc <- out.p <- matrix(0, ngene, nsample) ss <- 3*(1:nsample) for(i in 1:ngene) { exondat <- edat[gene==ugene[i],] gout <- exon.changepoint(exondat, ngrid, tol) out.stat[i,] <- gout[[1]] out.loc[i,] <- gout[[2]] out.p[i,] <- gout[[3]] } rownames(out.stat) <- rownames(out.loc) <- rownames(out.p) <- ugene list(statistic=out.stat, location=out.loc, p.value=out.p) } exon.changepoint <- function(exondat, ngrid=100, tol=1e-6) { # # exondat -- is a matrix of normalized expression values # rows are ordered by location and columns are samples # nsample <- ncol(exondat) # number of samples n <- nrow(exondat) # number of exons in the gene # initialize sample specific output estat <- epval <- eloc <- rep(0, nsample) # calculate the max t-stat, location and p-value for(i in 1:nsample) { exondati <- exondat[,i] # center the data exondati <- (exondati - mean(exondati)) # call the p-value subroutine zzz <- .Fortran("esegp", as.integer(n), as.double(exondati), ostat=double(1), eloc=integer(1), pval=double(1), as.integer(ngrid), as.double(tol), PACKAGE="DNAcopy") estat[i] <- zzz$ostat epval[i] <- zzz$pval eloc[i] <- zzz$eloc } list(estat, eloc, epval) } DNAcopy/R/getbdry.R0000644000175200017520000000076414710217127015066 0ustar00biocbuildbiocbuildgetbdry <- function(eta, nperm, max.ones, tol= 1e-2) { bdry <- rep(0, max.ones*(max.ones+1)/2) zz <- .Fortran("getbdry", as.double(eta), as.integer(max.ones), as.integer(nperm), as.integer(max.ones*(max.ones+1)/2), bdry=as.integer(bdry), etastr=double(max.ones), as.double(tol), PACKAGE="DNAcopy") # list("eta.star"=zz$etastr, "boundary"=zz$bdry) zz$bdry } DNAcopy/R/glFrequency.R0000644000175200017520000000214614710217127015706 0ustar00biocbuildbiocbuildglFrequency <- function(xout, threshold=1) { if (!inherits(xout, 'DNAcopy')) stop("First arg must be of class DNAcopy") nsample <- ncol(xout$data)-2 snames <- names(xout$data) xmad <- rep(NA,nsample) for(i in 2+(1:nsample)) { sout <- xout$output[xout$output$ID==snames[i],] xmad[i-2] <- mad(na.omit(xout$data[,i]) - rep(sout$seg.mean,sout$num.mark)) } pfreq <- gain <- loss <- rep(0, nrow(xout$data)) for(i in 1:nsample) { # ii <- !is.na(xout$data[,i+2]) genomdat <- xout$data[,i+2] # ii = location of the missing values and infinity ii <- which(is.finite(genomdat)) # segment means as a vector segout <- xout$output[xout$output$ID==snames[i+2],] segmean <- rep(segout$seg.mean, segout$num.mark) # gains and losses pfreq[ii] <- pfreq[ii] + 1 gain[ii] <- gain[ii] + 1*((segmean - median(segmean))/xmad[i] > threshold) loss[ii] <- loss[ii] - 1*((segmean - median(segmean))/xmad[i] < -threshold) } out <- list() out$chrom <- xout$data$chrom out$maploc <- xout$data$maploc out$pfreq <- pfreq out$gain <- gain/pfreq out$loss <- loss/pfreq as.data.frame(out) } DNAcopy/R/plotSample.R0000644000175200017520000000424314710217127015542 0ustar00biocbuildbiocbuildplotSample <- function(x, sampleid=NULL, chromlist=NULL, xmaploc=FALSE, col=c("black","green"), pch=".", cex=NULL, altcol=TRUE, segcol="red", lwd=3, zeroline=TRUE, zlcol="grey", xlab=NULL, ylab=NULL, main=NULL, ...) { if (!inherits(x, 'DNAcopy')) stop("First arg must be a DNAcopy object") if (missing(sampleid)) {sampleid <- 1} subx <- subset(x, chromlist=chromlist, samplelist=sampleid[1]) # get the data for plotting genomdat <- subx$data[,3] ina <- is.finite(genomdat) genomdat <- genomdat[ina] chrom <- subx$data[ina,1] uchrom <- unique(chrom) segres <- subx$output # setup the X-axis based on xmaploc if (xmaploc) { maploc <- subx$data[ina,2] rmaploc <- sapply(uchrom, function(i, maploc, chrom) range(maploc[chrom==i]), maploc, chrom) nc <- length(uchrom) if ((nc>1) && any(rmaploc[1,-1] < rmaploc[2,-nc])) { cmaploc <- cumsum(as.numeric(rmaploc[2,])) for (i in 2:nc) { maploc[chrom==uchrom[i]] <- cmaploc[i-1] + maploc[chrom==uchrom[i]] } } xlabel <- "Genomic Position" } else { maploc <- 1:sum(ina) xlabel <- "Index" } # setup altenating colors if (altcol & length(uchrom)>1) { colvec <- rep(1, length(chrom)) j <- 0 for(i in uchrom) { j <- (j+1) %% 2 colvec[chrom == i] <- j+1 } } else { colvec <- 1 } # set other graphical parameters if (missing(cex)) cex <- ifelse(pch == ".", 3, 1) if (missing(main)) main <- names(subx$data)[3] if (missing(xlab)) xlab <- xlabel if (missing(ylab)) { if (attr(subx$data, "data.type") == "logratio") {ylab <- "log(relative CN)"} else {ylab <- "LOH"} } # plot the data plot(maploc, genomdat, col=col[colvec], pch=pch, cex=cex, main=main, xlab=xlab, ylab=ylab, ...) # add the segment means ii <- cumsum(c(0, segres$num.mark)) mm <- segres$seg.mean kk <- length(ii) segments(maploc[ii[-kk]+1], segres$seg.mean, x1=maploc[ii[-1]], y1=segres$seg.mean, col = segcol, lwd=lwd) # for (i in 1:(kk - 1)) { # lines(maploc[c(ii[i]+1,ii[i+1])], rep(mm[i], 2), col = segcol, lwd=lwd) # } # add the zeroline if (zeroline) abline(h=0, col=zlcol, lwd=lwd) } DNAcopy/R/segment.R0000644000175200017520000000737014710217127015070 0ustar00biocbuildbiocbuildsegment <- function(x, weights=NULL, alpha=0.01, nperm=10000, p.method= c("hybrid","perm"), min.width=2, kmax=25, nmin=200, eta=0.05, sbdry=NULL, trim = 0.025, undo.splits= c("none","prune", "sdundo"), undo.prune=0.05, undo.SD=3, verbose=1) { if (!inherits(x, 'CNA')) stop("First arg must be a copy number array object") call <- match.call() if (min.width < 2 | min.width > 5) stop("minimum segment width should be between 2 and 5") if (nmin < 4*kmax) stop("nmin should be >= 4*kmax") if (missing(sbdry)) { if (nperm==10000 & alpha==0.01 & eta==0.05) { if (!exists("default.DNAcopy.bdry")) data(default.DNAcopy.bdry, package="DNAcopy",envir=environment()) sbdry <- get("default.DNAcopy.bdry", envir=environment()) } else { max.ones <- floor(nperm*alpha) + 1 sbdry <- getbdry(eta, nperm, max.ones) } } weighted <- ifelse(missing(weights), FALSE, TRUE) # rudimentary error checking for weights if (weighted) { if (length(weights) != nrow(x)) stop("length of weights should be the same as the number of probes") if (min(weights) <= 0) stop("all weights should be positive") } sbn <- length(sbdry) nsample <- ncol(x)-2 sampleid <- colnames(x)[-(1:2)] uchrom <- unique(x$chrom) data.type <- attr(x, "data.type") p.method <- match.arg(p.method) undo.splits <- match.arg(undo.splits) segres <- list() segres$data <- x allsegs <- list() allsegs$ID <- NULL allsegs$chrom <- NULL allsegs$loc.start <- NULL allsegs$loc.end <- NULL allsegs$num.mark <- NULL allsegs$seg.mean <- NULL segRows <- list() segRows$startRow <- NULL segRows$endRow <- NULL for (isamp in 1:nsample) { if (verbose>=1) cat(paste("Analyzing:", sampleid[isamp],"\n")) genomdati <- x[,isamp+2] ina <- which(is.finite(genomdati)) genomdati <- genomdati[ina] trimmed.SD <- sqrt(trimmed.variance(genomdati, trim)) chromi <- x$chrom[ina] # maploci <- x$maploc[ina] if (weighted) { wghts <- weights[ina] } else { wghts <- NULL } sample.lsegs <- NULL sample.segmeans <- NULL for (ic in uchrom) { if (verbose>=2) cat(paste(" current chromosome:", ic, "\n")) segci <- changepoints(genomdati[chromi==ic], data.type, alpha, wghts[chromi==ic], sbdry, sbn, nperm, p.method, min.width, kmax, nmin, trimmed.SD, undo.splits, undo.prune, undo.SD, verbose) sample.lsegs <- c(sample.lsegs, segci$lseg) sample.segmeans <- c(sample.segmeans, segci$segmeans) } sample.nseg <- length(sample.lsegs) sample.segs.start <- ina[cumsum(c(1,sample.lsegs[-sample.nseg]))] sample.segs.end <- ina[cumsum(sample.lsegs)] allsegs$ID <- c(allsegs$ID, rep(isamp,sample.nseg)) allsegs$chrom <- c(allsegs$chrom, x$chrom[sample.segs.end]) allsegs$loc.start <- c(allsegs$loc.start, x$maploc[sample.segs.start]) allsegs$loc.end <- c(allsegs$loc.end, x$maploc[sample.segs.end]) allsegs$num.mark <- c(allsegs$num.mark, sample.lsegs) allsegs$seg.mean <- c(allsegs$seg.mean, sample.segmeans) segRows$startRow <- c(segRows$startRow, sample.segs.start) segRows$endRow <- c(segRows$endRow, sample.segs.end) } allsegs$ID <- sampleid[allsegs$ID] allsegs$seg.mean <- round(allsegs$seg.mean, 4) allsegs <- as.data.frame(allsegs) allsegs$ID <- as.character(allsegs$ID) segres$output <- allsegs segres$segRows <- as.data.frame(segRows) segres$call <- call if (weighted) segres$weights <- weights class(segres) <- "DNAcopy" segres } DNAcopy/R/segmentp.R0000644000175200017520000001016514710217127015244 0ustar00biocbuildbiocbuildsegments.p <- function(x, ngrid=100, tol=1e-6, alpha=0.05, search.range=100, nperm=1000) { if (!inherits(x, "DNAcopy")) stop("First arg must be the result of segment") xdat <- x$data xout <- x$output nsample <- ncol(xdat)-2 sampleid <- colnames(xdat)[-(1:2)] chrom0 <- xdat$chrom maploc0 <- xdat$maploc uchrom <- unique(chrom0) nchrom <- length(uchrom) bstat <- pval <- lcl <- ucl <- rep(NA, nrow(xout)) ll <- 0 iisamp <- 2 for (isamp in sampleid) { iisamp <- iisamp + 1 # genomdat = logratio data of sample isamp genomdat <- xdat[, iisamp] # ina = location of the missing values and infinity ina <- which(is.finite(genomdat)) # subset out the missing & infinity locations genomdat <- genomdat[ina] chrom <- chrom0[ina] maploc <- maploc0[ina] for(ichrom in uchrom) { # kk = number of segments in chromosome ichrom of sample isamp kk <- sum(1*(xout$ID == isamp & xout$chrom == ichrom)) if (kk > 1) { # gendat = logratio data in chromosome ichrom of sample isamp gendat <- genomdat[chrom == ichrom] # seglen = lengths of the segments in chromosome ichrom of sample isamp seglen <- xout$num.mark[xout$ID == isamp & xout$chrom == ichrom] # segmean = means of the segments in chromosome ichrom of sample isamp segmean <- xout$seg.mean[xout$ID == isamp & xout$chrom == ichrom] # xresid = residuals of the data in chromosome ichrom of sample isamp xresid <- gendat - rep(segmean, seglen) ibstat <- ipval <- ilcl <- iucl <- rep(NA, kk) # begin with the first 2 segments lo & hi are the start & end points lo <- 1 hi <- sum(seglen[1:2]) for(i in 1:(kk-1)) { # prep data from adjacent segments gendati <- gendat[lo:hi] xresidi <- xresid[lo:hi] # standardize data gendati <- (gendati - mean(gendati))/sd(xresidi) n <- length(gendati) # call the p-value subroutine zzz <- .Fortran("bsegp", as.integer(n), as.double(gendati), ostat=double(1), pval=double(1), as.integer(ngrid), as.double(tol), PACKAGE="DNAcopy") ibstat[i] <- zzz$ostat ipval[i] <- zzz$pval # additional data for CI routine # k = location of change-point # sr = search range # sumxk = partial sum at k (all paths are pegged at that point) # var.factor = variance for 2-sample t-statistic k <- seglen[i] sr <- c(max(2, k-search.range),min(n-2,k+search.range)) sumxk <- sum(gendati[1:k]) var.factor <- n/((1:n)*(n:1 - 1)) var.factor[n] <- 0 # call the confidence subroutine zzz <- .Fortran("bsegci", as.integer(n), as.integer(k), as.double(sumxk), as.double(gendati), px = double(n), sr = as.integer(sr), vfact = as.double(var.factor), as.integer(nperm), bsloc = integer(nperm), PACKAGE="DNAcopy") bsloc <- zzz$bsloc bsci <- quantile(bsloc, c(alpha/2, 1-alpha/2), type=1) ilcl[i] <- bsci[1] iucl[i] <- bsci[2] # increment to the next segment lo <- lo + seglen[i] if(i < kk-1) hi <- hi + seglen[i+2] } ibstat[kk] <- ipval[kk] <- ilcl[kk] <- iucl[kk] <- NA } else { seglen <- ibstat <- ipval <- ilcl <- iucl <- NA } bstat[ll + (1:kk)] <- ibstat pval[ll + (1:kk)] <- ipval # convert the lcl & ucl from probe number to maploc lcl[ll + (1:kk)] <- maploc[chrom == ichrom][cumsum(seglen) + (ilcl - seglen)] ucl[ll + (1:kk)] <- maploc[chrom == ichrom][cumsum(seglen) + (iucl - seglen)] ll <- ll + kk } } cbind(xout, bstat, pval, lcl, ucl) } DNAcopy/R/segmentsummary.R0000644000175200017520000000204514710217127016500 0ustar00biocbuildbiocbuildsegments.summary <- function(x) { if (!inherits(x, "DNAcopy")) stop("First arg must be the result of segment") xdat <- x$data xout <- x$output nsample <- ncol(xdat)-2 sampleid <- colnames(xdat)[-(1:2)] seg.median <- seg.sd <- seg.mad <- rep(NA, nrow(xout)) ll <- 0 iisamp <- 2 for (isamp in sampleid) { iisamp <- iisamp + 1 # genomdat = logratio data of sample isamp genomdat <- xdat[, iisamp] # ina = location of the missing values and infinity ina <- which(is.finite(genomdat)) # subset out the missing & infinity locations genomdat <- genomdat[ina] seglen <- xout$num.mark[xout$ID == isamp] kk <- length(seglen) seg.sd[ll+(1:kk)] <- tapply(genomdat, rep(1:kk,seglen), sd) seg.median[ll+(1:kk)] <- tapply(genomdat, rep(1:kk,seglen), median) seg.mad[ll+(1:kk)] <- tapply(genomdat, rep(1:kk,seglen), mad) ll <- ll + kk } xout$seg.sd <- round(seg.sd, 4) xout$seg.median <- round(seg.median, 4) xout$seg.mad <- round(seg.mad, 4) xout } DNAcopy/R/zoomIntoRegion.R0000644000175200017520000000301614710217127016401 0ustar00biocbuildbiocbuildzoomIntoRegion <- function(x, chrom, sampleid, maploc.start=NULL, maploc.end=NULL, pt.pch=NULL, pt.cex=NULL, pt.col=NULL, segcol=NULL, seglwd=NULL, main=NULL, xlab=NULL, ylab=NULL, ...) { if (!inherits(x, 'DNAcopy')) stop("First arg must be a DNAcopy object") tmp <- subset(x, chrom=chrom[1], samplelist=sampleid[1]) lrdata <- tmp$data if (missing(maploc.start)) maploc.start <- min(lrdata$maploc, na.rm=T) - 1 if (missing(maploc.end)) maploc.end <- max(lrdata$maploc, na.rm=T) + 1 ii <- ((lrdata$maploc >= maploc.start) & (lrdata$maploc <= maploc.end)) if (missing(pt.pch)) pt.pch <- "." if (missing(pt.cex)) pt.cex <- ifelse(pt.pch==".", 3, 1) if (missing(pt.col)) pt.col <- "green3" if (missing(segcol)) segcol <- "red" if (missing(seglwd)) seglwd <- 3 if (missing(main)) main <- paste("chr", chrom, ": ", maploc.start,"-", maploc.end, " from sample ", sampleid, sep="") if (missing(xlab)) xlab = "Genomic Position" if (missing(ylab)) ylab = "log-ratio" plot(lrdata[ii,2], lrdata[ii,3], main = main, xlab=xlab, ylab = ylab, pch = pt.pch, cex = pt.cex, col = pt.col, ...) segs <- tmp$output jj <- ((segs$loc.start <= maploc.end) & (segs$loc.end >= maploc.start)) segs <- segs[jj,] k <- nrow(segs) segs$loc.start[1] <- maploc.start segs$loc.end[k] <- maploc.end segments(segs$loc.start, segs$seg.mean, x1=segs$loc.end, y1=segs$seg.mean, col = segcol, lwd = seglwd) # for(i in 1:k) { # lines(c(segs$loc.start[i],segs$loc.end[i]), rep(segs$seg.mean[i],2), col=segcol, lwd=seglwd) # } } DNAcopy/R/zzz.R0000644000175200017520000000012714710217127014254 0ustar00biocbuildbiocbuild.onLoad <- function(libname, pkgname) { library.dynam("DNAcopy", pkgname, libname) } DNAcopy/README.md0000644000175200017520000000026514710217127014355 0ustar00biocbuildbiocbuild# DNAcopy Bioconductor package implementing the circular binary segmentation (CBS) algorithm to segment DNA copy number data and identify genomic regions with abnormal copy number. DNAcopy/build/0000755000175200017520000000000014710276573014204 5ustar00biocbuildbiocbuildDNAcopy/build/vignette.rds0000644000175200017520000000033214710276573016541 0ustar00biocbuildbiocbuildb```b`aad`b2 1# 'vsL/ +GbJQ& 7 h0XX%cؗZDh3ܤ"ǼĜbsxVDQU▙ sWHf e2|q  "9'= RKҊAjDNAcopy/chrom-lengths0000644000175200017520000000043014710217127015565 0ustar00biocbuildbiocbuildChromosome, {Length (Mb)}; 1, {263}; 2, {255}; 3, {214}; 4, {203}; 5{194}; 6, {183}; 7, {171}; 8, {155}; 9, {145}; 10, {144}; 11, {144}, 12, {143}; 13, (114}; 14, {109}; 15, {106}; 16, {98}; 17, {92}; 18, {85}; 19, {67}; 20, {72}; 21, {50}; 22, {56}; X {164}/Y {59} (total = 3286)DNAcopy/data/0000755000175200017520000000000014710217127014004 5ustar00biocbuildbiocbuildDNAcopy/data/coriell.rda0000644000175200017520000015267714710217127016147 0ustar00biocbuildbiocbuild%U{n$g*A`V8=fatLw$*J IA@@ " $ﳧ:ܻキ[ ;|w8U5寸׊׸|,1f42t1Zsc[e|ɘ~Ywd.|^?.7s&3F;3G|~җ -KdZw5|? i~2u_c s~KP5%2~+׭}HGd!ƣSH hBϫ~;1y phq~{3oyki\\>8i]JQ9C@>ўz/={mV)"Hw^ᓵOy_|:<+^l*|߆/>B>k|"|,<(cg'f=_WD"CuTc])G%ç[!k_1;:0Nuw^u~[zB.ZΛX emցlx,}٠eL5R~A7ߠ=;L,0vetF eƄ'f]r+=wrЅҎmK_؋ #^~-ȷ< I؇9/K}~xz ϯ@gk#b\cؗ=OBCEx_qЩ*cUDGE"S؃VЗ=F"6ZDo.³>|G 0s@\o{6`P "_qvPAeD6l+_0p3|+ > >}%냡7"VDQ"NWK@FVFne!K*""tp~8$ DvYoeG~{"c]Wz[AFU_y>\{/ì"8x9 `ex^z&/,o"/76TC?3r)2>_ ]!`^9(=Ƶ ozUnʌ[`@ (;nŚJB,G~vQ}S|MEքUצ.Wb2-"s_>[[A&zU@~oh=UĮ\Y2""xW\xmogQ+v͕>oٚ6`f73oY[GT~ΉK;L5/*V+UU_obG0p".Wd⿙E_t: "\Ğ`P{/WC]u |wC͘++eo SFK  {*w'%&Ad*P{+_zO0ذnAe,-sOxXL^],>cWYgE+w2t*k[2{-aS6+`Ktʚm?U 2>w`b X&~(m3WbQB z]dOE<2ns=S-aMN])*9}r,5%)BIt[.ѷ.c:_sHs!|aU`+O?Uf%ZB*Ȩ(%a4;mB9%#t؛{Syw{.%R9`:]qX^\tgw$8Q0[-1Y` ;4A+⃰QV F92[ %UY?x\FFd| 7G<)qEt= lk\Hg$;hU[OeZŶΰ2|3ز#:,NLFsz# `QI|5択G%ȲNlʕğ##XosEɃVo 20ؠ?#'%a*q> 6iХ 3Uaٔ QxZ沗 cGGxI QC#<` 8_YJl <-Il'2g]29#1'+DLb#ĎKߑ`Xb)[QeO4 4b݄UY4Ydͮءo-d\ɝo ~ VowYK ,aKUr"н*l6`wY_~%*b1@Ar)'E &%Pb.rEeb{%DU.~:`p *!SWW2-! )J.Nv[4~Ey+ ys[[y+"XRdE %V'F,UEtEA]؈؁|ZUZH<r%qmU^ȿ$z*1Cys%~$qeț+1%4`U`s 3C-%ހ7 vљ"y-oE͕мmAka$gWe?K_.NY$] +=rWr1P(K|,/]s$+$(zR_$֪H>#{]tM$O'e e2SAv\@+cEz\/26Wc⍒b*\"</.!˞|UaɟcYr~*U&4bo׉VKĶ2g VGH+ףe#Q۩JNfWEߤ *!}+R#A s 7Grog@/ TKS,_UD*,#9+% cQ SoKB]l0NyW/[+\W<ؤK/HTDP?$wvȪeqEl]BO%tĘU$!)c%\*;K *ؘ]t!q!Fr]Iɵ^DwGE%UBw+ k ",> H= TVY +Ȯ"vbߌ]D ^QjQ_.^$n./:?1o)JΧGJl^:Rr.|sJ)}Vn"8GEpqǑ:'Ěɿ"a -K΀}U,. c#EpW%n>oīF$8C\ZVi9V ?G{T!sFo]DW&6^H("'X\S%^qlt.!n iQc$!%́?*o$)a#eİ$Nfn#@? p$xSAϪ*-* UbE\&&*tQye=r[X*7k,I"6\ȥ Uͤ>,o,ÍRk!xTet,ޕ~$ **몠UxO]1?E>R%^2늎ւi$^\g=⃊Nf^UсSX{kW/Eqq }H= Y' V!5 u" 7Wrlp{\~J-Kb,xYk]Uk;Cê}`UłIY UI0?.Ì7b")`EwUj`hU&~Я,׉}7 a-eCŮEo%|Q _Q6CR_n+ё0*umJAGSA>*[K%Kƒ/$YWe%b3UM$?]ߢK.*YT-I>9I)4ed_0>">E  FAWvp$1ج؞$*5{b̪(P q%FЙfIjCI,q& 좫Uɷ%5h$b*SH WJ}RGr yg%M`e,6JcJP6 [yIb9 ":b+Ux_x9KS3 wuV LWo`e{|!6G>T>,Ҋ %fD*%^1r `}YrD^{p.6/ e|N[el9`DIH!XCز r,ae%< ]-I=@x$~HTr)wY*VàWI >cE-^oLVZ.k(J"2ZVH'~ 2//ö\J,5ЭJ.:O_Wj[oK< Z vmUjaUtUaΪ !5r93 ^!~rU" (Y&?M5"|1rߔyȨJ}MU!9,Am2|s#u+{hC v_.tHErX#%7\"k側̩ѮďR vq|L?bWrN'5K y.:R/@itVnWс:H|!NG*#1uBThp*rF'gr--Keb@WjGa9Ol/ &J^ z-FM25Nd_Ȣ*5ȹ7[$nIQW.Y{Uf?#*2(EKdV$u Kr>/elY<98z^^j}"Fb%x[DAhyM sG;o9k /I E,JƖ%;b"1qVU8#VO99P&,I<3Ƞ #Z 15:FJj^<" 9ĶȑZ^ĉKMT FbaEݥF8K#"Hȱ.]NJGF_i\(U"X;*FwԤD[}jdsY~+Zqò oEѢ:c7c ̌z/A N_Z=9fz0w9@Ģd@~O8Mu^=%y,0^6?-'dfț; wH‰M{ͦMB/!bo̫񬻕)lQX?fq8}MfA5hXo,kYNـZlN.*?-wMS|M?/.Ir⨻q8,.Iؙ6iAg%X%PUoh m$ G\׸i▞rqj aY_4E;kk\u40zJ9uAT{-ա)ʼaY8 !ѼƥDg6 Qk!m"[ݛZ8!ⰡC0/j0oXwv FBO kH¹^lgBHk 6Fsm6%.i#M%^מ6ek6߃fžMYmۥwL"CWE{Sxf~%`YnG4}I/ɲFWS oΦ~rR,5aԼFK7X9advk$Acȯ_m貜攙i}tw ښ唰65ޯj]G]g}5O jPV!f ̈́:X_NHz^"RAtQik8EVW]!7,*KgODa6 &ͺR,LzRiBԯrZ Z38 AT[`6DsʽXeĝ8b+ b֌.IAcbeBA2 m$Ɨvh?]aKhbUk Hn "I 4lCF x:ƵɅv͒ -vaʯk׮hY5zVzCZB C*xZ3<9waom;[UPإ[]G^ Džúkh GG4؅K5/ѕpf%:Q:jVkjV6-R6m7WCwj|azxZWЫ. YX3V, Zkݏe:C9t$EVim[Qv:#<)"c#ݺ06XL\) 3q̒P3ak:͍a٘sqYx6j( ! bkveRq -֦2Y,%5yiUHj&^gEhgegaOYؓxZo֛UfH_6$hЖV2 ,RhaOhH¥"֌uDͳ[iX3 DӋH-HYJWZ:YH #I-fafn $-w>MԶtiםmI.d$5%#:IFtH#ޗi:Hks )Ԥ~ imT+qZ[?sԳ^7bzo"~aRu;TX'A)10K8cUM~ט4j-FFcҔ&9i6[3VVڟ-XwdpLg#{0;eR^NhoxpS`9acQOQ=>z{L(]k5BRkfz@|yqAb<=<$ר}Aj)R.S&&+H? iZN$ԧ| A [Dk=[$]$]!WV_NrtH' :-Z1/U%=|(|/w3Aҷ@k-5%wIk'ڏCҧtR} iF-/OA xZ#Dֶ3}{/o6MX&]{6(oWG[X-F5xK4:yc+_ӷ4& }uHXXz5/}+ՀLMwif~Эe豰hP?E?҇ѐB, [< @A!I62aA֕-ZRwc4Ǣsci_bLձ|Lh5}O$ .A~ i!X~ OBpZ@߫2 ϊA ui[ 4k5chպ0 gm;AZd-z"mA< O@ҏ4@ :AוbdGI5 V_-mm.b`@~0\s{kM4 BOZAҧ6-~%0зB[YIrXiREYN-Ґz&`z]""-&O(=VO!-NnQj5 4ćZC}ǧ뀫)cc8;jV;?iF~ȷp"9d9($ ,,d-5XU/ i=f VQn'!Yb#:4n ,ٽ&HGi(շ_BҏB 𣺧't)j hui!Zy%,aLڞjҰ^ܼ{=ɱߢV 5ԫu> z,~:_^a,Uߌ#}I?R/;B[=Nڬ^=|,}b7T? .D'!Jǝ:({-1uیh?[exT{x7ezIrIMDHImT+m7c Z!Y$KIh$IO ' !IlE^IlS![&%~~~~dVdK$mƑth3jӪ|6uDɄR}& Y7=@үB;=V'!iDNk᠖LZTM"}s*X}vV40M,$LX4iof6juՠR+FM=~D+_TG5FtBcs֢J`Qd-Ƌid?#[f]5fgLp6f>DVuϾtl09NfSn0؜Уn@.'[DS zAU%1AC1[)Z#*$ j ӕrgᠦ<-VFy|W-Tx>잾y&}yK5z+ fed`Zu2!_w/zYs[gAТ9өg>Zk=rA7+ GˡӔ.ui|-Pǰ򼳦gPpuR > `SdSS:T#Q^P fA4髴 %Zq}UlJܥE"5NċhUHrATkkZҔ>fFrAL+ л L?UdzhFjdK5dc"ASwE]ʣ=ꞧ`6" P>?5zaLvB,u*%k_Bam@+%z>*k&<=ׄ©ksy: ^B[P#>Cz=.;zC(/}_`!ݺOúH)E"k%z~h9 °_s#{4e\%a,;Zzc|=Y4%Z E<7V)Jܬ7 مFeA *(G!]Uqk:4e^aҧ0* '1-Da27 AI,HJ~%Tޡ'A{94eAM_s-f_j]5jai3a֭,%ӡ\gPal\O5q+~jaraKMTv\?U)°r zQQ=˸JqcB#%TFu͚txz]4=FDQk%J"U)lbCToCOQ*=N*}~ۈZsgȦ)}V\ګFy!t%.,u~ES[OF~ߢvk¨ahb_3ӔdV kzv폢@䣺')(Qݭ=O0M.OmDPOsVC ùz~u_E( ǵV}UԮ hFG:2)c.#8P$ZblEܪ'u]ڜQEEE~Z(Jj Kt4!!-dHJ(͈G͞h{Ju)J^F{s E^YEj9tuD~N+J'YFLQ֩t-O68*QLSG]_^Ozs[=FXDTa 1E41",ta0u)k>qmBEIPEuRbMQv{J7WA S(j~j'tm,t =kzkUl &&Y)\w데P_guٵˈqO/_K9LPmӔau~fkXhVi)Ύbkq_Eo#l'e8Vq"KyzƑ QOq4bQ)5vc]N͠Xqr iʠE[ޒC_G֤3iRԢ"a)HtѼeFӔZE9NZi A=(S!NSz42BLg4gNF(Zو5X6tܮ ^",R2֏Q#P맦 Iݍ]KԤ㞦!NRӞ 5>Hjux&7{.h,c.nuO"ykK>OS*]N|}P 3빆$bXWT2u965:uJJߓW hV{@K#z;`L9$LH6n'u/[65IToNLg=Ik7d}D$/L9&HWŢï$iՂNt,Iڭ>Cɐ5FLs#iMR_aI-/},Jq5[>t@'t:J8bt6ϢʷP80A-lG$-*K4CC t)OdJA!UJOIu2gY|fLpZ!/ E#iHmHwZ2?cs#\p_JkԙәF5KoUY}kz.ܦްW^!ݥ~7@QD9>8#VN_fG?_@>is4Xd!IV6a~iJ=ԷcGЅ)vF4E}ZnԞGjɕF:J1u @',ƺƭC#,>HQX1㚒X֜wD|dsi4ѥ4vjeٛ[T앦WS}:NQ71Mi)c&f͚ϙ~f?)[S47{>M[diru@[Qۺ~P9j:p: C*5N:fYMEY>;UPVϗLS(%jd5]ͬnV+MSguoAXקRiR EsUlc$ =M_t)X^, 7YKHY YϗP6 5x@Q&=z=a^sKHYa2 'Cfs4עXRMYWԾb˚be>b}{Ӻa,^`GygVU4Y2_3*nf.8fɘ^a%r>zIߢV1,Fnʲd MhUR]9MЗS؞i{g ʳ>=퀪rfCW#DA!s0[G8''4g ! J$L"j~x# )#Ǭ<;eY2 OdפQPh9WU 7:{qsZwmn SewK$n6BwI~//]xұXZ*Ta?nlk+~>lZ??lʇakhۇ‡D[ai+}>l?lm ۪Wme[f5>lmmB#u7k h;d̆{=_u?`L3cv̘^cv~ޘ=fߵ|`c139Ϙc2[9kO9˜ƌ9}cĘ 7w5~ޘǾn+gcQT:jU3Z#i7ΜgYiݮ5^#nZޖc%;.8W=ka[w_Dq LWW6΋w^+6;29͸ŀe\~/m~ݸmWaܾ=.qʴ;7/5{ȸpO̸۽yyNl'23-}@{U&P|ʧCF)lX21O\79o)BL{>})촋)|vLa‘±5SLwL·67]` Wͺoe_2&1:˘dו3<@/N:Ҙ321:t6px[4Φgwv<2|8=e/K3s.UsY6d쒷]۞yĸĸ+oW4q>|qﳏՋL^688M3{’kMISmøv~ܘ/_91'pǁcNg"uy\w5rf]%o?o0Og9 1S~v<š1ObSǍy{" Dk̶U:y[ {YT㬳./g3ŗi`&ض=Xc9쀌?}q>qet|8`g7c-kwyqc0L887/{5Ώ33pۍEw9>qsio˟6ύ[[۸+`ܕ&б&n>}mn>͉is;y ƍ1nq?uvݧ6tۭ߸{,.0>wÍۿ8V|=yBfcޣ .Ӷ5휭{ƽ 4śq6M׌{+swNTG}q?~߸wָb kQ#w\1+Vr4t|d-~:5&|Ҙ杍iט3=o4Ϙ1:1ØS/1R9ǀ-keƼ/=2{WNA!Usڍ5gGB];77>1tnjs.ƹy6qCx]qo^ķ}yoyܧ[׸+nܕM;l[3{4Ͷ Ҹ]cܓi +{')hyI~ո7^DV= n_onu~a?0cWd \K >loc> oB̵)>| o;zuw=+{@vK38#g]Wsr;8J73-_6!v?08|.cyëB̅Sg3v<|@O|Nqq~pqn n݃y ~9ɋw'7cwW[w)>z|;r8._6Lb k;s<^l̊Jme5ׁwٍ/6 4oŶ:<9ս|0|ksO/c#ˍ}'-y bm63ζo5NX'>+ֵlqv'>co}ELj G4Rp@b*簟⑿5Q1щ1b}bK|bIbQWW#osnb}~bb^a>fÃƇ98OG><|^"yOrk{_N4jGwaĠ 6|c~cˣ6I`\sb\Nobmr;ؕuwb=7ɢyS189áW@d]%\8eicfĝs>[aKܒ ]نkSgycy{_y{˛k5`쁘$ⷭWM~7ƙw#nv튾;;{?p*wEÍӏs[-AڛG<~܋y;kWt[7v9Wӷ}}E/p^ƼVX\C8V{3Gm#&.{xj;rKX( N_#:׌t*|#5W'Nk{ѐf=[ 6`Ϡs͈ S.-u ۇ1/bb8ˌs4r z,>q惿 vyׅ50+nۘ~iJv1lU?C}ߴO7ueUphuwBg˶lܚ̷מ6NrmYJs||,۟kНQ 3{8r">˽'q`Y767[w /*w/'d] |՘]6oհtU6#1N? NŞwoϾn }>}у9ՐF _et_ n: zx.}c }Nunj_w?=a?|^jߙ~W^rJEV|}ց_lH1 ? 2#fH Nd͍3 {h 898rs6}:٠' s>1ʋ's_M\~ `݌qϷb})^sh?3d9_`ÿ?r?V$_"?ՠ~qs9 ġ+[N66.dcmEyh[9_̛wT" v _)mEg:yK,5yoPfBejQxM*`M޾vjWx>og&oo{ |]ǡױ[6xq;. w޽oߖ7\yfr4گK\6~7YBgq"RF7JG;GkVoFa8os6>lޝ؎<}%^E7For,1b#{ `+B{Sⵇ65Q]'AJD@`Z4dT%}ք7k#Ӎh!Oxօlw>X 8'^,xnM,D|21砋.Eb~,9n&!JqyVkHc?U䉿9Ŗ%[;ӏO6 mmI~b=>C˱`~ɍ&=dbm]^Hzyb{ /<Ǒ/-ӗs^,9ҖS\jGO;nNp0b>_,Byy$~48} {"qp@WV"F^ m}=}d)8˞7bK$Q;5;[TmG.<1ӱudSS?so]Ȟ/w.ȅy{bqد~ 5b7ɿo#y)9!4\#&7 ;=?yK:(x>fpqK& tz>yV#Y)[sf[/$%n']k.I2?A%a_OMr츝󳰓OƆOY#S/}qU\~#>zv5u]=M, nF.w ӓ >oL;x|1{#{%Szq(yٿzx\dwoνy|⓹/ޞXih*=n-E_Ͳ373{:;rU%ino¿C8Ǫ9y0^#^םn6z|Mjc5쏯̊ ;툭}P|x jz{<ױG.?b LvsO&%ƭЏJ& vq1)|2=HO!ם%a]b6n-{ uO&=|v<y\XI_]Ͼ|_7&[A`]9<ڞǤ>? ⊹ ^?Vx8k/>ռm/? mCܻy=~C8 !mD4c-̼ FJSN4 ЁmQ5¿;Lܑ}5?;a-a]`^[s=N^Jny<}>ǼI|-2x"X ,rM6%m+3h2N+<voqc%$ZּQd3J^v(u8xqy=񲛦~.&{}d fM|/1oM_=aw/@̸26T|> mʬu1::`q^ޤoUۡۃ}'}'o쥛53;r,&n |u?GnG-㥣1Q92zd~p)^;tAb'O:4|WЫ߾o#X4Րk_ d_<8ooPys>~g\xxjwۚzP[ /s?H_JCwv@.;4#6tئqmv /u=}>{9 vE{#-猑oT^_).xQ1oy~^p lwr?|In~TX _Sar=XdO~ }Nr=tqwwdv8yytq_&(-_$v '79l򏳱o+8+t'?R [^=ٸ?4nǶƝgRwdߕ˚YsyO}?צzWMg?O~߮p -M᯾u䭽￸*N~}7mڶ{tf]O.ztێo1k5}C.z4u]o;w:m:G?{k՚.u|-tC\I}hC.` GM^C)g_4ksKӕ{ѳL]|ӿ:kMw߯uJt̵o

o'g]^u:NiMwfxz[eMW޽{^|_4+?SxCf 6S<3ٛoΓ}}'MoX{IA}k/oj:9cf]c_/V}.9ko%4YctXMȶS~_=+~|? 'Mgn3 Y_U}b؊b ,@E:gM J؊""ߜ{/3{ܹ眽Z{|4sPr Yy"wC| ;B`>LpĕRl t md\4T_q%ddp =/| Iw̆|Hs+[;~VLXTg:t&=nѿp>#k`g՚[ZY*WiQbrӵ=C~ OGN)D~{CUDI**s} sj XRz7=pO#͡<c+F4܌l_b؄WBO[. K [G5e!;!3%\TuC\}s  vuw5Ʉ0E3.0qֵB /H vX i D0%N{ \wCÿ3i.gf ;% mCo*逴Eh-)=VE{ z72Dcˤ/cnҍ9xuD}XXzAqw~^6:r$ e磿!igu.ƵamӪ`mۧמSfF+w[dlLnh5ޓ A)btWD0lbWݷa[QANQ D: 7×ƣמ%B\={h3$5xAh%3]}y;WtADZ ?zaKL8OC1V5YuGK> =ig~<<ǾX\3R_qrMzL0Vc޲Bx8w{.ϖC6# a%E~W7iw#{yw\-Zysfps't"S tT&!!1QO2q$]݉oJNF hmxj" d|M1}.!{+r,h$MEE[+G 1ҼL"1u.{=x6~0nk0˦E]ðVQ$\ ]>(h:1ڿazU"a܊X;~دn1<35l/-,z^df+r]xcR'L2$uԆ1dD5xFJ,&Ջq snڮن0']:[C`=l\|J-LdG1^ ;~ǿ.*uy ֬W /.-TG/INUЏkmwW1F`cD= BL^tz}ex 8:ޖzDr:M%L'rz7 g0߬X2vjCQNMaPߴt9y楼 hȑȎ֜q0\Sn5 z[Tzpj{ܻנ3R°2+Z`č>-c/}~ .N>e(Z}T.E,ʁOԷBܩ6ClZ`PgGR MifpW,oq&J$7>0ÿ|ydW6뮋'riC yÅ=}bߪYS7-WLxծ:g`6wtIwvKq#^ɤpy}RCL7acPGf } {Vq rAForLa$S;1By_bΐIc'a<+Z&Ew.~9#&;%p&>h<9hck);̀HJd4|7x͚<Lm`D YO֊*BS2ԕ%G7M `Z0<61vq "r]vUHtӖb1R0g7&L<,8yaIEX{¬|޺zy|&] ?^/G徝0+rC* qr{[IOX|bIXpWǎ7QvzaGڥC0w)۷b7<")e9)kRE|CӐrg8wNDFMՁO1@dD$d[D_/ O$(<"tB9΀GE3O/ Tw&YW ^4|ԬFȪ1Li(Z(SLX)Z]q cUME{IiOy%4Pz y#)N>p戏) Fnf4`/).1Oˎ L-17Oizj e*zVT5`3ԁ^ TxDDK̥-(OA Qadw*-Fϣ!fQg6U2'Ny0ck*w:dj d[ ?eqyyqMPZX)*r}U ‹;!k.I@J,^z9  RGc&]_bJ*h0^Ѥ )756$C꒭[;BݳxKbnp&nLXw"^8w_/ ЉIFY%RӒj{%DDR}x.:'YA-w~f&MK9$3T`&G <3,{mXNC .PO+0!;!}\u$pLM>] T=1aI:#co]6[ *q?y/"h.e_4I¸qoàmG'[|ņ? NVAx"GpJ̳!)p{ay.Rj7-,?EaSMC=r{4ܛ eA[BM :lU Bΐ@Oa*5帩30<[^}Gp &TZ,$z7V:ӯ U,H~3hD>D9sFWs-y`\h[6TR=}v«ZӉorF I`E#K [gzƸvL Cr&yoy]I__\Bo\i$b y֊5Eؗ _C(B__#G}lI:t3Ňљ~4U6k$S:VW^?E[15K ڍw /.Ye:38=WTi}Rfu{"07u/FTwi4S( ]89MHc& bSJ6{I*='G/gؕ`/5C! TM}E߯8lQ;n˺t/3;= ²L@80͔q9 jL}I~23^v8\lzO Ʉ"ߎ>T3 C.ȩ'_\~.:LF<1Ąwm>q {}ABxxSS~I4 MG/ncH*| 1y+e0~nbzP(ƋhM !o܃5x=6x1t.kDw0ڇ0j+xf^c1A :^[h"a3o1# /oŢ#Zq3#`< Njx.̢#8O.-$[a4 0ì16q Tl(HoIp:݋a |(gt|Ҷ8RbcBǓ6¥N"8.~ѫdAvߘB,"},, I?H34߃K"?7ʤWgcUjC؍cZa{9ݓ7Y=&rzџ=h[c,,DSI7VhB& y*&"rxy| )I\7*٘ 0/tvM14AGBvc^dYy7&C0)w>a͋l/V:V:dpiÃ?UkIjrkerBiHlfGd~Vm⇧`'* *U{5՘Hv nәG5o1`?o>E&m@N5l ZaK~W'b\Lzxՙm,K?K? חƈiZ/lĖ•f@Єo!eL) ?tUWolcSwI]"!?80E!*IrqIa${ui _*z"suk0U-O;wN.DŽAXO0nYLrRΩw xJZTKP21.a7'.+#!MMѝƽLdK1yc_f!p"m86NinK[C=SK 8xG3wt6{<2Qwy3BkS߲11!Kh1tO4u hg.5ͫ룯nD1}@Wf)@3ww/~}qnLP_E)$hqve ~~.w VΆw{OqД E]*#=?_ihάkRʖ>U / M/3<4fnP7<[U;a|FD>(ʋTY2 r.2$ ˧ng~>&ro AooU`)^l9RH?O&cГ4^ )r~˷<5#ſ Mk=7AfɚkaH#L;E_;%P{>JK̠Rv]I^S\fj7pPY 1CF)dG6~OIL A`~:0n%bywon[.`DZ O~JPp|& U\R6ޟ2 nEۿ !_CKLddz#3Ń!Ʃ罭 Ӌ 14c>!Yr@3c=mx/,`o7>U%XQyrFPr4sY}\䈑*^Ud>b-Jy"4S0t`*ס fbۭJԏCo]P_4v14[I 6k2-TCi_NJF1<ޅ]zv2%®Ǽ 28'^QV8B},7j#AR^+).b-Z';ؗEK_YG(d˞u\,G !CqxZu(fY}/ny ү%b/޳lpŇ{4S*<oT(F'n2q~T7UFFNDqǜndIHgI `]6LSe'è4 &0K J2+wb<%Fgg0O"Q+bmzvssV ,V_AP^syqFvǬӐQ{(Z\ *pL';F-L@%;{RN?ں!L9o2t͡ #;f=U~A/SeP,`f͟^t71=W; uL ܏<A/2& *>l"}vNww2֍}lߟ!IρҘ:OJr|J #RDCƻRYc K#yi@ `3ӡIPƫt^UL]8/dC;5`$v.B[ \;-uB5g(~.H՜iC+3kCe,1 tsS7`ㄟ3P>7Ooړ1*CiO+l]Eʱ ǚؼev{0@A~6G1[uGixȭO>+NA% qژW6&Cî7&1zgOL`{=; h IbJ ?vpv{4Iu΄Z%ʛs]leru@lELgx̐:Ek[PwǾIv5n\;ǏzxϾt`ӷrdYw`A3ul`GvpdX5#(l/-'- <&VyQDx? <(e t?=WBi=קP#rh]fHPWگd<5JYy-W8G4Cc25s7kty@]]\>hxc>o'BgR!Le];bDnL5ώkP=O^t) z65%e"Ọ}<=Wj-0$Obؚ?”3w[.R_@/yȂ\k-`dxK>>=Q)p^wKvcqEC%5f UЊuӽL0K!a=>186Ljή=-#fPC[4y 9lSl;0z/O&.&SaBbx*CaW7.|ö)72OM][Tؐ2\D" h@XD/"^xx&j_*?GF?>_;P0bmآ, :9#<ʏ붎w/34C3Fߔ@329| A?@WkH ϡd؏-m-E4Lx(~wnY5uр j*<C șL=`lG~// ( OUbAUBٍ">hf3I >YWBvtǴb#ӣvswAVdԱO4k~AGi{;CZjNb:+Bh׃Sutg۱Y;w(7D >$Sl^wN#1rf_ $ \AxU_#bGoFCP,.`3L\;n6An ):t*Rq1D(A1>Z˞I4~E=ƥAQ,w:pm"QRU|qL :*y#oA땗LLۧB? 1t21*;٥LАSl @6<ܻC)憜=_-?wADII=PGH0oYh[QhVNjR8#Em!҇<$[μ3$Ӽ fv8XQ(Km&c z-P[atɌo3}m8{bw`B-KXּIs0]$=VaY| $9UmT0uXKt0u叒W nʱN13`Rlx`M('R)~ ty6pp=_3Bѓ7GF۩;Lx*1Z.I3R=fI& hZ1z"ڿ !=#9 2ݲ(c+E*=Ѳv/o,&|{DG.ٸmƥƑy4? 얮§G !+bv.-N9eS"p1;Tad1~d vC{#zx V]k&1.%L֫s|;}VrW4'jx &5YT4l.}QI"xyP6㨿bq-Pީakbߋ1+%b#8D X ~Tc.U8O1+!dC8e Ѭ1)2lEpfC2َj'φY˗HVW Z }8W(N<0:*O2yc+#i 6 1R]׶oGNrz뷉1v1;z e~x~Bbt:LǢdKNɳ%q^\<*I|)-x+E'8 icVga!<F-`AnGEmn [\wׄ:༗8hC A=j'9E0U!a>SF-/SjM"uL8ǐbh)e|=t]'z+^39EJ$hY3 i. i}yslp3Z~*|𤄎Ъ^=m`Hd.̌R'm]j Ihf t;=.xAk;ҕ߰ :J;Ȅh?e8mSh(J99>7>ՙM+9Ai.rR!th…w҄O ġdžP[3*ء{U{ @ǎAk앪]?2= 7,7ԮtbQ\En ;4Fb@3(2V)w't] Cr'B;oZĭx\):d4xB&~@N}QN S͡V8a# 2ws8R;Lx6jhpO+ɌEg 2xOϊ^G ח/FBU-B!ૂ۬Ï|2H\?+0@kȼ++{Sq^J59 }xsQFO1T"НFӛg07KG_~*uO9L'OaΕDH\k`\:ƉeG95`i>0L,T>zAw"UPG7pv·()DQ\WMo& it 49 '.F2 L8*{n!sj x]߹ eHXJj ` ^,ts-^ŶZ4'-YyݶȕGmn~3^WtVޡZ u.vBA2M&[q:+<۪Xh@B6_xQFʿlu@x/ԟmiCչMT ڼd%"P7dxhYFhBo~ D+3K;!I/wyI NVdQDhqSG׆CUJ몤>wo 9Yռ7y"4;I;w ^NҚqh,mޅ>_/Q /oO i{Ҏ@x jBQra&$/^: 3~cGǭ;6[^[L={]{b0` ͫB㯰bؐ Ր #L]{%VvqL㡤i}E ͊)y..ѻ2G0yvH!soѶS0ZD㽇ͣDg`mǧ͔aApǤ7 khmi~K bhZy VsCz#yOkbV ѣ.f0ȟ@ٗ6b %l]7^[eZW+%́@|U3%|љLUۏ']" VwB !L <[ȍϐL搱m㰑!cw8% `137]Cy dsY]h"q 6~ #U`PC u F s0Gl1Jn9XN L,h~ [FE'f~K(j U$n R,!8Wt7hH_?a"Ճ>4 }KBꚕCs(83FF7oD炼sN}FHʌN0Ş׾+;Zv`!柸b/HL >8#NL؇YBSo59oJo}Lwjt!YFpfE ͮ*tzt%*TrƂbl@cFTDdO) Ml F7ɲxͧB| c%kd,\ 0:brx{#țh{_T#:9v ص?3ᄶˁ8uUЃ} ˃WC殹1WH;OOk5YXs`R(ף C 됼=_E^HEd/B%Ⓝj|3,uuX@,q"؝6H"3稹$Llu|SB`Y/?/SȝBJ:Ө'1jjzcȥ))Jː=͊A hРs9+=YKAk|d q9Pci]/f uh&, mV(Bxu˨0qva>+>?$TZGMVuݧE̮=͋fpg=qA=ȧAL)e0{oD:OZa6ȡ]81]:-S,SLT6Aca5i "Pbn/R/:c>}hnjNJC1qT_B}ʆ-.2jܧ$A w,c9`_bEO2I'D&9V9@O?VZ6u8VI\oSEgřzUdRxS;F"cY֧boeԐkB!>N#MGv#z9-M1:dz0"!c=a8Et 1>'XudmۊX 0ۄ%d:#λH.b?{_;ڰXY(>`.QYUt=g'԰D XAو%ڗD"ӏID/b'k$~!^>)5]f.vL4v:Q cFj?bgbOv<}_-R-+K I.;oe`0y,E_uq$ʜ=,jyq鋹IR{;<i^Zbۃ;: d=1Dz Q'nWZ;V?>:撲G)F2v9-ҊL r)~'e"ҎVteM;X}݃.RzA{K1$>7&;w@eDfsk[:^]w $wkb^1"&Q>gðMBV6e8|e$c5jg#׳ .dgFaP"y@g.b|ñt];$i5cg4I4~D\J|]=(/#o%A<3i=$nUn*?=#xKyVtB֡ Ѽ>QL|*m ՏgCM#Rh{jb)Oc% (XZѥolF*)C+C;fR5aQ0&&M1cdTo(yq`CC+$]Ԅe4y͵nDnmfGFDҤ)2jJtۡ?1krͮ+ȥ8V1z ^N}cЅueϝX2B 4tp.rΟL6_U ]i>c=(D/7:2d^g#O=x9ҪV|5N ,F&:sSxh2(Y2o}& Nޒ3pMWPP}fגDwo0}Gs~O ̝* XFa> yeK,FG@C'Y{17fEPB@Fj1pC.vA2}y IS F" Ne $Y>5opu͏0*< ̼Bdr p>uY-!8c>bLΙ'lo&{OӔthP1~fveVcQO1a] |H9"h#gK;}"jyL-XfED"TE.d'|^XdBMxP A%TO!1s8$H NLd~YX$˪yyBvw?l};8F=m9Jv |z>7zʢ.@,C($.#P1AW]nDSc!YbjA|οތ!W u6_EAn laSoa w*%Y٠Ä}Q:1g umъwg|.7<{/בu,1%159= =7K 4ͧA@iO%(]g [GVATЦ|1S22uU6&=W> pTzp*F<(AV!a* QehϢ:]B(%yB\~A]~8.׾*ܾYM{9w>}[9m_gwikK*wVG!mxUO{櫯rur96xW^zWuYpxmJݖ6W:\TE G[pO[WKҼyDڏzt4'ΎxUG)AsWnKq7>/uSzauW7+;$9s7pO?9G>>}2^) lt:%D߆8.Eu^;lێEhQbWUۗqݓOjb{ΥQnz܎ .Jn١pܐQUt]tQRlHqy|\f}gn|{:Z(ãF7=7Qrc.[/8gju#zDO]},qkw!E7?4νv^o=暯>'{}Gڿãn[G;˒>ՎnkrOwח^p+ud5>qswd΀+o:Z@Û9A\s?\پػ'ч. ~/ -OeD7I.-Nkumnz;\_u vINTzFancrV>?[|$nI_ VީϢk8޻8VUϞx?]dm>|Ǎ?7CzJ6I͹k|܆rEt|/ZuKqsIEٟpI21ޏxt.$Vv#qxWU/=vGx9a総=&ra2ߖޕ,*Y–˾ts=\ޒ/tR?5 ;?ujѴw O[~m/9gN-]zW|gt+uGTs%Yk>ύNO W O?\[ G\c=o(Jns?hR!gq-t&?[[w;g\MK g}ƿ :nurFæG~ޕ9nѓq"Z ?Ҏ>[EW<>9}҃}~&_umwU$s <Naym|3/zsǯliu~=pqkWO|?yɺ@+Nj$;.r\ϭ5|RzY^{6:Gh=Seux'=3^ʵi^`#9+ѷuiOO^OC\}boS&&7,kn)$ݧ/Ygp%sK~A'}_^<%j[vygm\r]tm[ı4YsW^nǥ}+]9k+N 5[˓&мۅRcO\YWUͿy eQr0 $xc|\{_;밎7.םǓSM : ~];l/dR+Z7y^ބ7GijxR˗=_|,[o)ol|Gwl>ʻg̋v}yh79k^ !7G V\MN?|}ǿͮ,j۱54Z•soṋyboOgaOd=KW;nx^'}}#%s wQ|,_Ǧor74q_6Orsݢk=jn_T˸sɮv5>|AsH#J7I%./oDWA(Mi"ןs+S<ˉvgo yyWs<,U;=ѷg3p`弨gNф~hzitVTS>3뤟Ms腹|}گ|sڧ!nېkߺI5nƕ>osMroZ/mm{-Lx~b{_-m|N sĚxM`|nz򌶗ϫ6ʢv8>Nr+>mK~Ӗ.7Qnw+6V7'W닋l^uCMyerM** w״u??r<SAQ^qZ\{崯8+Lsr2;׌pr.k/-IG's$t8:_!4KW=u-~=Эcq1߭]|L閤66ď7uiU:G=/yN>ngŵRoW^}j^= {\p @[qa;mlkn~%\ou3[k>ʳysr+N}>Kjc yK2Ǐ'mM뢬-=?mp?yy^:iC6qҏ9XnR<[^Ήr%>}Cr#{M:t?XG9^s/% `&Q6<n.&ۍ$Ǖ< kuWK*Yr+_gOVR-qy0L̍9wǍ\^O4??Uh8yBܰ( yU&G^HϿW5ѴxZȟUG&Oҭ҆vc1^FǛCξ w5W۽X+ nQ<%}Ҹ=i\>>ӈh Rnr::orIN+iQ7\}EϺ ^9'8JIN\yQo6?[&?}|W^:p>\Xrd4ckz<˯{_ϫCOƒB.>[h |EB_C3I%˟؟Ouɾ&/eЏo3ݠwyq\7$s%Qlto:٭Vܖ[OO&vh ]\C4 \qIq1IuӴF+{-M΁U5v ҤN<-X~? ٖws&6>Eݞ [O;yܯ֦}Fo[1i_|Ӧ{-^ViS~iS]ߪ~>y>w>OT]I2 Mعt ve ׷pnS/q{K/"}xie@.y<+;9ե< Mi۸wܸ8JyҮ]Dn]6ztW'=;ɼ^1pE.I}/Ǎ볿j4d7uG|PknS^]v]Opuf7<==9ʋh'4qo퉃nv4nf\_&Ne43W-q[yL1zusUB%z蘭7NIYsI)^ߘCצ'y_@굣3'tg?Ͼ{QOG}Á ['R_oxpɔvkx|;Xn^`w=.spo?˅scc积WE\շy꾛9mEoMy/ Cxe8z\6k1TinAQ# їN}toNz~.ū_Z/T-X hd8h­Jw݂Î^(%Ӽ1k6hs>]/wv/DBk'sG.h]~W'tGΙa/w'>eɀh=o[|{f#WsYg7īqYr/qi܆+g4/4,YQ Vr- s~nCsp)RSeQqUCoΌc\~=7G\ o;2o:,0-4~⧯) M o\J<{`\7vv֋w>op%Aቪ<}+Mm\Wv\q}WwN87</j}GߊDrhM?>Uy>]Έ<{vTF5}>dȽvuͭ~xϿ{DtqS?ק8G5IDXW;SVOzE_xg}ԉ Nxaql=/rfq}gaWWn>d?^tRK;줱\Se3][71]|.HH/3 &nSvW=uݯov/?=N=Wkxyr~14>/7|yc'%jG+>(s z\ZwsU,ȑ'l{ki!g$=Ys݌9W+IQ,YeGolՍ_ׇ5~׎$?{_dN{>YK/;>y%siӲOs7}>WpEڟ_*;劢;lʭ&xF4&oxUƬEI]!ޘpiƙ wKz>.z==>sr#Sx ~kv]xq];?d|^M >O?^r*ws&wlr6wxgdW^vEٕʮtve+? +]e5(AY jPVՠe5(AY PY PY PY PY PY Y Y Y Y Y 0Y 0Y 0Y 0Y 0Y ?g5~VjY ?g5FAV#jY d5FհY հY հY հY հY aV#jY0f52 aV#; RɥK#\riRyR͓jT'u}C]P7 nu@P7ZkZkZBP7! nuCB]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW R4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2||||||||||||||||||||||||||||||||||||||||||||||||||**************************************************,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^Y*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B* No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A|?5>DNAcopy/data/cytoBand.tab.gz0000644000175200017520000001430114710217127016655 0ustar00biocbuildbiocbuildu˖dmE鏩u?SO4[Zv*%oFf(Jw| 2?~}/׷Ͽ6۟eoכ+?iU$aET!K$D-rUd]٧vB[A^ȤD*T \(SVR( NKz- VI}R( ]華Z !<"; [P( H/{25(ZdVʻO)9Owys~xl UB@bs]sȮ!Bnfv:Jv #4ˢ̯3-k2vrE!{Ag<|X9#~gm֔r Zk+8ގMA֖@֯F zX* g|xvSZdE(uBR8-u&bl]GQ UD.V*7e:G6zDng|rt"< c?j#י^a(UR_zR #򺶵ہzz~Q Ձ:_'3爤d))'y:_"8k^N5]";Q( \8<`ePHpj3U=J혔Tt5A"GeM{Gŭ: @F<T+YP)OUZEIՄ%I)?n"l7fP&v 2mXnWQ,:<ٙ`L^ pJ1Of(T.@+ےҌBiRZADmnfa6U,Phlp9;%*b- SBXcnȰ9;.8=D6xBi,+:ðlQ,->+Яc>JG3_Ju$lbq1`MË̝U NZg? /vQ(zR/ =RkyBck)&Uثgѻ*sPb.-M,!pSŶ~ `ʝ.ԡkR.Q;Z:'Z, 5Ҁo3Ҁ1@T %lح?BK5DRi=#MR5)"@-jI欐M_@&1v0 <:^Am =W0x@6:$rf*m#R!>;]<,jN=I%y ]Q?RVBRAHicqUj(x sWOYH\ x$ ן W#p\J2.͕2lM8CfǨpbC%Ywӏz'_I9W2YWrӔ2c8XpJ;YgY-ul&"J؍Dd8 X{eq8YC}@R#DUެ# QW7Э@m0J`ǥNh1RSlЭX{B[K [fBaia~DゥC[ΘjA0%52y4g87M#*=WE<[I?rRPj$.}7 Tպ)i$BNcӀt Xʍk= >-2,mF &qz&iE|1D8# ztK8u]S(xsEfE9V@Wc=&a/@ qkd,gUb-..KqΒ:^Df)jKR*u57 Ò.^:rcw/1)V4@O Ot =7Ձadf"Ċo-0w@2 y )6I%[Hqv #,(16ۉ%ro]Xb4e{j#-{,!$Iz`g9JC 2=w@q] | <4rVɈEđ-YtQq!N?u dW]yd8+;y+%Os:בx/[*ՁEKV ݫ.&BJ4DF6P*vm7[ d?X$f;^E(ױ1y!]s'OMK;63x)GsFQ(bN4֣9qc77lUZ!WϛAE MaƊTZVi1 or1Sci@Z=4`M n\ZIAq`_@֍}qC0 Ճf(1:7z-F""Ar_.<$ҝ灯{1d@$Q,]5EIde,V’CujWP2V)_rm[,E)5GFN.)Sr3rB9e^NN5kE -'/5E`ʝ&X7$bp-DFH?zSLubʄUf|Il$$o9K~ eFj Үpu)XkkIz1T@$o$j@Si+(:Yڔd .Zv @I]ԼӬT#4c"C#ɠP!V Z0s@an3iZQÁ8z( ҽ?k9V0 Pch&{#JH,]cPgEf6]$4*" Υ%wYK E'O% g/K^)f 9H(h9D6a}X}xx3#9t;r, әDЙ?l;XĆE !XT:DM—/J*׾"aB}N0.QAki&k:.WUqE>1H%6,Dfi(f$M%2+r JŤAJJ]H,qYN)M̪% Z7Mhu/etˮ7\pK#(џ0"71^{G/Zb0)h4Aɢ&@9W/Ԅ5&M *HϛXB&44Pţ ,c.K<煬{T=P7jCL`}lB%sIGC2Xƨ 1,%.qrQ,4[zded0I"Bpw]dKN4HAB%Z 03ڝTou[;J~z3OM)&r`\o] :J].m"&sH"&!1OԤ 5&z,gQeyHRCB/;`aY2~%Xʃi87L[  ?9I|gF?^=qzǻ dwPb@|I7:8ڞr#%j0yȔ"bXdE@\"kĹ[ HxMO#a|6=OEAā nM'ƨZ, H&UҀu3,aJt`bu|cD5 rF;$$+&k5vոlяodi@z[ܙX/Ż.=O 0+a>d%"Ș,f^'3N' ]W) r?SWrb8iAoEC_cq;!ɟFHi]RNvjd6xt]"MaDTZQ_UD[5IRCGqfVѓd椓LaI'[WiutExI72C PQgJރGDZ;h&"@O\AΧȉX_qd Zu!U%۔:  OM.|Kz:ih0*Vp d=wK,fz <ӕPk^[ h/$ 熐г󍇜2/p!=Кf.*!N$'&"޸xDS> q /mO'1SOcY/}УuNE@ʞ}?9+z\B}cQW2`c^cxoĕ=kWll DYdFk]EdmYӁr~]%Le񻜝 ^rl*Q8ߋ)% I汜@e3՘7$/;P-vUM(H ]5ϕP$jQ`GM͢5˗ad6Qyq[^)U pKq\$s킐^͵ q<~9w|~O{TQ̴!X{*JA* & 4q, 7VSZ 65͎ !mϵp=DOzrsjQX >*o28a{\YogH<:;jOw~'%%1- ;WҀ8*ɼbp ѻQ=vP3bI6UEt)B2NБ͟%Oh 1u0]aE@R6/ ޵(W_;=KjzOUyA&.:z/~YfWz^4/KpDvyۇH^g ߯xfޅ{]mz@'2ɦZ{</ >j*F|%dz@u}@'ҭ꿓-=P郼2Ih_Z~\zDNAcopy/data/default.DNAcopy.bdry.rda0000644000175200017520000002714214710217127020361 0ustar00biocbuildbiocbuildmw,U[ι+WEDDkD0 (A!0 k0 $AEDƀ"Jp0<{7tW Z{yO{JY*gu3yXZi99/^v}G-_r+^=~*"T3*JpjPxYX**Jz2;{$sx|gR]KaRɟT60W2{}R^xo^T^],d>K^p+Q ̲RfV*8 N>W*=d̹%s=!m07d\/狯s?l`Iϸ2>b|X_cgl'fMaFald\ѷ4>~) |]` bs_C?^KxCلRɐ_q=]Vsmde oSցc#,;ASx]'@J4sZW"_ҀqYsM \ O#gkg1N.0cb;W{h{'sjb~|7Eob]2Bߙ>ǜ؍hַ9gCp7&s^Ĝ_dN";'9\d=]d\^ۘӇ;'3;v8Y{Ch7>U23|Ƚw{4?t5Mm;XЃ>3ι̏ϟ`.6=<4`sh p!#\!?,%L Ȑw*{*˅Zjv>|8;ȅа<XG Ĭ7A 5 ωsrT< /Yw pͷk9`[?8`!:6bcXeoYspc>v^^-<1Z0(Ϡ;8Lm/e+Z Kvy 65—NXpg{G %z!z1g%`@A /NF`l4u iSj|=sз3{&υ7kh 2Є>9X"OصS RBsu4as h|tq`:Y~Lbzs;/@~K"1`c)6 rI6t' _`]MF;j]hs!? VM3tg<с<П%Cl4#mܗ.lȅ{,dWѶ9{m:Ȼ -=x71*ts` :X; b3("aӎ5:d6ȢI/ !<c1A\d<)4yb=l2÷d\mL)^/nC-xF;r^([W&` ϧxΰ9㝤7P*6RO9~wMyÙ=f6ٚp>uЁ.C^}7km@3C8q?]~ʳ3bn6G?>G%0{d;E%w)::!Ąe Lli&϶<ȫx}!6 2ctnžυSpx:}GY2ǒx!$΋6ă Iбb1GnZ -%2.ѝAmZPgClA#{|8ǦMo( .vv5K!>22%< ڡЪ,ւ{k)>u/kı 61Sĥ=-;NzC,2nL'v%>oBc-5S68, Jэ ?ag9q| d^T³Xb@]68F=]gb#lfl.i  ;l<Ğlsc|L&)v=u oGon C-ԱͿB~?փ֠}7߷m0ta~ό:~1EGg[~s=‡@b%t/7"jdz5#˱/=.cʇmZ:E6iz`R?>Jn|Ȕgߡ\Ç XsKh 3BLH < Ώs-ͺְ4kkб6zsM}<t:&fqcƜ,rf(d Z eCttl %Дb{('sb1yD׭ yXل8;]t! ~%]4{\kV&*ɔf`9Ϻ+&DC !:b+6;_9G1msbs_bO%^޼n}x [ÍWiKSzчۚuk;x9.Ofb26'X{X\-z$~ѻF^&>Ǧ/ /kö tadUUxMkmu]6 :&t/鳾Cd 'Ǔ 6%G| +;ˡ5"&丸'9X5G~uzQ|G{G6[֭5L ZWnCsآ VYwlgQ16K&kSS|l{4x脿4oŞF[I mݼA/-uos/ p06dP޺nYm-lv=`;`sOΩFy ~jB<䂵Sl;$-E<0G[r!`OMﴵ=bJ-5!Z<_\&SZ#Uش^t3u줁<MdYK@C{Ax| X:=39HtnLോ\}!ъ?c9>z ^\ܯ|4Y2fosO_}$^ )6~Z{~Qe%:5V5l`Mo6ez& >6@;m|<.6)>iz'Ӝ5xɃ>8sb%1 ܊ѭWIџfK9|Ϗ1IyˣպucU:: oKO{r"ԟ(]~~a z5Rq'ьa~bo;fA  פֿ/ѓ9",bx33%-5u(fjJЖ,*u-Q׭vt<&s6:(eN r\tmDL9&~J9fle0vV-v:G=d ;Xtl]025bx1O=$a~fk׵·笹4߫l竖W*cXcrlTyb51t ]}SY?tL7 9A\paj{gI)1 ]  wr*kK%h>&5{2blR-T,ydӯUYȺ> c7m|V]LJ񗉝G3BfKG:g'sbO` Tom?J ߈MB\okܚg9ϴ4>X˧mzK~āUN5Mt }j;Ce<Lg:aOSs#ʁb>,LbN~^䋈"b$9FM135[b|R_.йBLi~sut?m@sZݶ_{ǿџ5Dw_GsYFWg.{ijVxq 4'{m\8H舾8%ޓr3W{P9Xl~wYEI]z"x}@yWӯ&ܛ)2K%?naaz}^z3Myodo*XRCw~ȶ- uXoߺCz>>s!!v?dM0FG1=Fg'`tM~SSlpf۷4Gf^O;#Z%c~ɩ}`V9lS@^40{8;kll2g8tk ?3g9gr|߿VL/'8uUG?k9g+ p#}ˈ3+^ UN ]0n>SW߯aW׉w)ojp`c{>p<[;7܊A1Xm?&Fg3G6s9&s'-3­TG6Fw*˄=vQ}?@fr(s V}VqC.Wdm?VM'u|3ǀc̆;)7J#/xXmmpU1 +55Bp;Z,X́c_7C#g2M*v\ :5%#Еkd h/ʧ7՛ְ W*:S7gۄ|kU;:=Uq6G}d?`Ù|`7#tmCE\pfz85Q>_"]1"~Z¿%tUǷ*5a]'$/g6o#fs^3g4y|gQWn}UbձrnI{g|P5y>tQc=`D;d8F x8wl8j~sb9>rs-L^\ ,Yߒ=`H|O5C7&v4) wkiD9>57=>M-Ln6ھʇ \cQE54ƍ c{H`K]E^=;`WCpe_dW#e\;F'oRLNIz{l~+y|1{5і¿93ox./SO}}ǞcC<)PMW6u|5|dXfz} m#j }]=f  ,P>:)bm*w\?O/V>לtč]_gLml9=< ̎/BOÎ?$A̹t3#ʱ_l{W}')7W}byCxUY[xy[Kn"ۖiƦĊbnS.#}d?=|ar5NcwB{r_);_<̻L{`jvO#/?}QAL[1ivV=/rF.!_C/]㞺mM0yj`t3A~].Ak#l?C78b5f16'=5O&c7kl?ǧ/+,e'+bՔn+ gb=qmrC\ qPZht]>V3ԯ7{O|8 4ϱ=-|r9uL$?vGlC>:<0=#w~!op9ǷNn$j/fm|cgАC~[3PYU+L[5dUC_k- %sfaP=]4;x~C>9]!6:&cCsΜK/לAϧ,lM|s'ڃ9MxZM>uumq{\mC~HVGq\*-ONT5'}3Nsh_|ه`N|#l3D>|'o'Gy3T?2lo꜀UC}Qo˵: пW_ #JZ-M Սԓ_Ys"GUg~b79<ɞ.N[朱ϙ#;f~NU\Aѩi /LM>D4zL ǪhIOWᯪj߳i~/~i YTvRC'>7Gf=7%`ez ޘՉ7}ݩ<6;Љ1c%UPl)|Q3t|]sb9{9^'6Ys4s۫žY(2L=_bILNT /B#=o],sβ]'c5좊veC{54YFܺTFdAd=@qf {pb<^砈F1Y%\>Yɪ!s~fip_1)Yy;l-d!Dcy >F=gSd3q:;ȷў KE:V_=LUk`@} ̙Ft,ZΩlkv:[bC}t<6=)Ngh09c3tv1z^cliAz9็?>cO ] IEעK`klSC},Л/9-NPP_ɣr֗7gB{ʱzE9?O>Qb?RCİ547z[OTKPM\i6w q4s^;&mz3csל$ޘꞯZ)nTsk WFoef>0}:_^B!h -zĈNc吹'v}AN~cj*_ESJtρWp[vI{ytn`:yrr~ofαaϼ=)y bIl Kt~O{7 |a%/s`z"t_S O /¼?75uŷ s| ݫ"*:SC`}i`+m/j}iW;l_[tLya+rddߟni|7߱gV͝ƞ\嬉̈gvlc{{^}|ЍMǯ/{M^mdH\!Cg>HvҞL ~6)=RK˞EWy\ֹ$F-f%bt߱5YugDf5bF盦;O=Uw2}?Pr{.͙O3j=5Ŀ:ݣsֱ:U{ٝ?¾`F]+ؿVIgV꿼\y(F;V_x>|=Ee=<[q m%'W:wr}\u'_{cWq^Ce .Tιcŷb+hߜ[w˼o't;W?3y ozÞz\.־ۍ.S>Al9,M_>վNQXЦ.ՠXQ}Ϫo'.X#X*z͜B6y o!6:fMl'N{Mx}ɪ?29kڳ؜F6FG'/Ԭi_Non:G8Qo#EG';GGD mςBܓ3Wk9'e]_׼>U?/T6AϵI5tz 'ruӫuz=-0mMt}WGx]{zq ;*o GZ{zvhgUhKG2q'+{Vv}3*~kG>U_+7gS3Sv~OQli"OS1#:v%a{zh: C}7}䰿 [CS>x`MNxg˜}9~|vNvAoRq:mԙw\Mtn}oy9\!YwR|1YÞ< ~>3G)3!1GÈxfgË3g)'GIƚlw ʉUIgv/-tLhK9kUk?UviO`(k?:OV]ќ-E纞]ЃUE/Tԡ\`c+Fioݬ:7jN}GOw3:S8sbUx;W \?/־[cigUӛL>]љυ6 n-k, not and) in smoothCNA.f Changes in Version 1.21.5 o ADDED packageStartupMessage THAT CNA DATA FORMAT WILL CHANGE o changed filename of NEWS to CHANGES; file format didn't work with news o changed function .First.lib to .onLoad o in the function CNA, changed code for ordering by chrom and maploc because of "na.last=NA" slowed it down terribly o removed the unnecessary rownames command in CNA Changes in Version 1.21.4 o moved CHANGES file to inst/NEWS o documentation of CNA and segment say that missing values will be removed Changes in Version 1.21.3 o forgot to deallocate memory in the new code Changes in Version 1.21.2 o changed the code for htmaxp & hwtmaxp for the hybrid Changes in Version 1.21.1 o changed our affiliations in the vignette 1.19.6 became 1.20.0 in Bioconductor 2.5 & =1.21.0 now ------------------------------------------------------ Changes in Version 1.19.6 o added function glFrequency to calculate gains and losses Changes in Version 1.19.5 o Changed smooth.CNA from all R to Fortran backbone Changes in Version 1.19.4 o Fixed infinite loop when the logratio is constant across a segment Changes in Version 1.19.3 o Redundancy check by Henrik Bengtsson o Bioconductor fixes (license version, BiocViews etc.) Changes in Version 1.19.2 o Fixed a rarely triggered bug in the new code Changes in Version 1.19.1 o Faster algorithm to compute the CBS maximum t-statistic 1.17.5 became 1.18.0 in Bioconductor 2.4 & =1.19.0 now ------------------------------------------------------ Changes in Version 1.17.5 o For weighted CBS return weighted segment means (not ordinary mean). Changes in Version 1.17.4 o Bug fixes to wtermp code and how it's called in wfindcpt. Changes in Version 1.17.3 o Weighted segmentation code added. Weights per probe can be used. Changes in Version 1.17.1 o NAMESPACE file added and man pages fixed to reflect it. 1.15.4 became 1.16.0 in Bioconductor 2.3 & =1.17.0 now ------------------------------------------------------ Changes in Version 1.15.4 o make sure there are at least 10 obsns when t-stat threshold is used Changes in Version 1.15.3 o the minimum width of segment is user selectable (argument min.width). Changed from the fixed value of 2 based on user demand. Max value 5. Changes in Version 1.15.2 o changed to a faster algorithm for calculating the max t-statistic o changed to a faster code for undoing edge effects (redundant perm) o added basic functions exon.segment and exon.changepoint (workhorse) These functions are used for finding a translocation using binary segmentation. The data for this should be properly normalized. o fortran code re-arranged into different files Changes in Version 1.15.1 o updated the call to get(getOption("device")) to use dev.new 1.13.3 became 1.14.0 in Bioconductor 2.2 & =1.15.0 now ------------------------------------------------------ Changes in Version 1.13.3 o Added segments.summary to give the median, sd & mad for each segment. Changes in Version 1.13.2 o Modified the p-value function to replace p > 1 with 1. Changes in Version 1.13.1 o Modified the p-value function. Added pseudo confidence intervals for the change-points. o Windowing option has been removed (R & fortran code modified). 1.11.2 became 1.12.0 in Bioconductor 2.1 & =1.13.0 now ------------------------------------------------------ Changes in Version 1.11.2 o Added a p-value function for the change-points. This is based on binary segmentation and not necessarily correct but gives an idea of the relative importance of the change-points. Changes in Version 1.11.1 o Changed Venkat's affiliation from MSKCC to Columbia University 1.9.3 became 1.10.0 in Bioconductor 2.0 & =1.11.0 now ----------------------------------------------------- Changes in Version 1.9.3 o Added warning that windowing will be deprecated in the next version. Changes in Version 1.9.2 o Added code to not bother with p-values and split the segment when the maximal T is large (p-value will be tiny if T > 7). o Added code to not split when the maximal T is small (fixes a numerical problem where a constant large segment can have a significant split). Changes in Version 1.9.1 o The mod function in fortran inflicts serious time penalty -- code rewritten to fix it 1.5.3 became 1.6(8).0 in Bioconductor 1.8(9) & =1.9.0 now --------------------------------------------------------- Changes in Version 1.5.3 o Fixed the subset functions to enable sample re-ordering Changes in Version 1.5.2 o Bug fix in plot.DNAcopy (triggered only when #chrom=1) o Added information about stopping rule in the Vignette o Cytoband data from the goldenPath repository added for future plots Changes in Version 1.5.1 o Add a sequential stopping rule to declare change early o Bug fix - make the object from subset.DNAcopy of class DNAcopy ############################################################### ### ### ## E. S. Venkatraman is the new package maintainer ## ### ### ############################################################### 1.2.5 became 1.4.0 in Bioconductor 1.7 & =1.5.0 in the development branch ------------------------------------------------------------------------- Changes in Version 1.2.5 o Updated the vignette to include references to additional features. Changes in Version 1.2.4 o Seg fault occurs if window.size is set when hybrid method is used. Fixed by setting window.size to be NULL in the function segment. o Added options to plot command to draw line at y=0 and control its color and lwd of all lines. o If ylim is missing it's calculated from all the data instead of just the first sample. Changes in Version 1.2.3 o Modifications to the plot function to make par("ask") behave better. Changes in Version 1.2.2 o Modified the plot function. X-axis is either the index or (cumulative) map location. Incorporate col, pch, ylim etc. to provide better control over plots. Changes in Version 1.2.1 o Added the hybrid method for computing p-values to determine splits. This speeds up the computations considerably and so has been made the default. DNAcopy/inst/benchmark/0000755000175200017520000000000014710217127016002 5ustar00biocbuildbiocbuildDNAcopy/inst/benchmark/benchmark,20090610,segment.R0000644000175200017520000001230414710217127022414 0ustar00biocbuildbiocbuild###################################################################### # Type: Redundancy test # Created by: Henrik Bengtsson # Created on: 2009-06-10 ###################################################################### # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Startup # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - scriptName <- "benchmark,20090610,segment" library("DNAcopy") library("R.utils") # Record current random seed sample(1) # Assert that a random seed exists oldSeed <- .Random.seed # Alway use the same random seed set.seed(0xbeef) # Tolerance (maybe decrease?) tol <- .Machine$double.eps^0.5 pd <- packageDescription("DNAcopy") pkgStr <- sprintf("%s v%s", pd$Package, pd$Version) figPath <- Arguments$getWritablePath("figures") benchmarkName <- paste(c(scriptName, gsub(" ", "_", pkgStr)), collapse=",") logFilename <- sprintf("%s.log", benchmarkName) log <- Verbose(logFilename, threshold=-10, timestamp=TRUE) log && header(log, "BENCHMARKING") log && cat(log, "Script: ", scriptName) log && print(log, sessionInfo()) benchmarkFilename <- sprintf("%s.Rbin", benchmarkName) force <- FALSE # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Main benchmarking loop # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Sizes of data sets to be benchmarked Js <- c(1e3, 1e4, 1e5, 2e5, 5e5, 1e6) if (!force && isFile(benchmarkFilename)) { benchmarkData <- loadObject(benchmarkFilename) } else { benchmarkData <- data.frame(J=NULL, seg=NULL, weightSeg=NULL) } for (jj in seq(along=Js)) { # Number of loci J <- as.integer(Js[jj]) log && enter(log, sprintf("Case #%d (J=%d) of %d", jj, J, length(Js))) if (is.element(J, benchmarkData$J)) { log && cat(log, "Already done.") log && exit(log) next } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Simulating copy-number data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- sort(runif(J, min=0, max=1000)) w <- runif(J) mu <- double(J) jj <- (200 <= x & x < 300) mu[jj] <- mu[jj] + 1 jj <- (650 <= x & x < 800) mu[jj] <- mu[jj] - 1 w[jj] <- 0.001 eps <- rnorm(J, sd=1/2) y <- mu + eps # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Setting up a raw CNA object # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cnR <- CNA( genomdat = y, chrom = rep(1, times=J), maploc = x, data.type = "logratio", sampleid = "SampleA" ) log && print(log, cnR) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Non-weighted segmentation # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - log && enter(log, "Non-weighted segmentation") t1 <- system.time({ fitR <- segment(cnR, verbose=1) })[3] log && printf(log, "Processing time: %.3f secs\n", t1) log && print(log, fitR) log && exit(log) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Weighted segmentation # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - log && enter(log, "Weighted segmentation") t2 <- system.time({ fitR <- segment(cnR, weights=w, verbose=1) })[3] log && printf(log, "Processing time: %.3f secs\n", t1) log && print(log, fitR) log && exit(log) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Record benchmarking # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - timings <- data.frame(J=J, seg=t1, weightSeg=t2) benchmarkData <- rbind(benchmarkData, timings) log && print(log, benchmarkData) # Saving to file saveObject(benchmarkData, file=benchmarkFilename) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Cleanup # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Reset to previous random seed .Random.seed <- oldSeed log && exit(log) } # for (jj ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Benchmarking summary # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - log && print(log, benchmarkData) log && header(log, "APPENDIX") log && print(log, sessionInfo()) figName <- paste(c(scriptName, gsub(" ", "_", pkgStr)), collapse=",") width <- 640 height <- 0.618*width filename <- sprintf("%s.png", figName) pathname <- file.path(figPath, filename) devNew(png, pathname, width=width, height=height) n <- ncol(benchmarkData)-1 matplot(benchmarkData[1], benchmarkData[,-1], type="b", pch=20, lwd=3, xlab="J", ylab="seconds", main=pkgStr) legend("topleft", colnames(benchmarkData)[-1], col=1:n, lty=1:n, lwd=3) devDone() ###################################################################### # HISTORY: # 2009-06-10 # o Benchmarking show a major improvement in the algorithm when going # from DNAcopy v1.19.0 to the recent DNAcopy v1.19.2. It was # roughly O(J*ln(J)) and now it is O(J). For a chromosome with # 500,000 loci, we observed a speed up in the weighted case going # from 20 mins to 30 seconds, which is a 40 times speedup. # o Created. ###################################################################### DNAcopy/inst/doc/0000755000175200017520000000000014710276573014627 5ustar00biocbuildbiocbuildDNAcopy/inst/doc/DNAcopy.R0000644000175200017520000000422614710276573016253 0ustar00biocbuildbiocbuild### R code from vignette source 'DNAcopy.Rnw' ################################################### ### code chunk number 1: DNAcopy.Rnw:74-75 ################################################### library(DNAcopy) ################################################### ### code chunk number 2: DNAcopy.Rnw:78-79 ################################################### data(coriell) ################################################### ### code chunk number 3: DNAcopy.Rnw:85-88 ################################################### CNA.object <- CNA(cbind(coriell$Coriell.05296), coriell$Chromosome,coriell$Position, data.type="logratio",sampleid="c05296") ################################################### ### code chunk number 4: DNAcopy.Rnw:96-97 ################################################### smoothed.CNA.object <- smooth.CNA(CNA.object) ################################################### ### code chunk number 5: DNAcopy.Rnw:105-106 ################################################### segment.smoothed.CNA.object <- segment(smoothed.CNA.object, verbose=1) ################################################### ### code chunk number 6: DNAcopy.Rnw:120-121 ################################################### plot(segment.smoothed.CNA.object, plot.type="w") ################################################### ### code chunk number 7: DNAcopy.Rnw:129-130 ################################################### plot(segment.smoothed.CNA.object, plot.type="s") ################################################### ### code chunk number 8: DNAcopy.Rnw:157-158 ################################################### plot(segment.smoothed.CNA.object, plot.type="p") ################################################### ### code chunk number 9: DNAcopy.Rnw:169-172 ################################################### sdundo.CNA.object <- segment(smoothed.CNA.object, undo.splits="sdundo", undo.SD=3,verbose=1) ################################################### ### code chunk number 10: DNAcopy.Rnw:177-178 ################################################### plot(sdundo.CNA.object,plot.type="s") DNAcopy/inst/doc/DNAcopy.Rnw0000644000175200017520000001560514710217127016611 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{DNAcopy} %\VignetteDepends{} %\VignetteKeywords{DNA Copy Number Analysis} %\VignettePackage{DNAcopy} \documentclass[11pt]{article} \usepackage{amsmath} \usepackage[authoryear,round]{natbib} \usepackage{hyperref} \SweaveOpts{echo=FALSE} \setlength{\textheight}{8.5in} \setlength{\textwidth}{6in} \setlength{\topmargin}{-0.25in} \setlength{\oddsidemargin}{0.25in} \setlength{\evensidemargin}{0.25in} \begin{document} \setkeys{Gin}{width=0.99\textwidth} \title{\bf DNAcopy: A Package for Analyzing DNA Copy Data} \author{Venkatraman E. Seshan$^1$ and Adam B. Olshen$^2$} \maketitle \begin{center} $^1$Department of Epidemiology and Biostatistics\\ Memorial Sloan-Kettering Cancer Center\\ {\tt seshanv@mskcc.org}\\ \ \\ $^2$Department of Epidemiology and Biostatistics\\ University of California, San Francisco\\ {\tt olshena@biostat.ucsf.edu} \end{center} \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Overview} This document presents an overview of the {\tt DNAcopy} package. This package is for analyzing array DNA copy number data, which is usually (but not always) called array Comparative Genomic Hybridization (array CGH) data \citep{pinkel98, snijders01, wigler03}. It implements our methodology for finding change-points in these data \citep{olshen04}, which are points after which the (log) test over reference ratios have changed location. Our model is that the change-points correspond to positions where the underlying DNA copy number has changed. Therefore, change-points can be used to identify regions of gained and lost copy number. We also provide a function for making relevant plots of these data. \section{Data} We selected a subset of the data set presented in \cite{snijders01}. We are calling this data set {\tt coriell}. The data correspond to two array CGH studies of fibroblast cell strains. In particular, we chose the studies {\bf GM05296} and {\bf GM13330}. After selecting only the mapped data from chromosomes 1-22 and X, there are 2271 data points. There is accompanying spectral karyotype data (not included), which can serve as a gold standard. The data can be found at \\ \url{http://www.nature.com/ng/journal/v29/n3/suppinfo/ng754_S1.html} \section{An Example} Here we perform an analysis on the {\bf GM05296} array CGH study described above. <>= library(DNAcopy) @ <>= data(coriell) @ \noindent Before segmentation the data needs to be made into a CNA object. <>= CNA.object <- CNA(cbind(coriell$Coriell.05296), coriell$Chromosome,coriell$Position, data.type="logratio",sampleid="c05296") @ \noindent We generally recommend smoothing single point outliers before analysis. It is a good idea to check that the smoothing is proper for a particular data set. <>= smoothed.CNA.object <- smooth.CNA(CNA.object) @ \noindent After smoothing, if necessary, the segmentation is run. Here the default parameters are used. A brief discussion of parameters that can be adjusted is in the Tips section. <>= segment.smoothed.CNA.object <- segment(smoothed.CNA.object, verbose=1) @ %Plot whole studies \noindent There are a number of plots that can be made. The first is ordering the data by chromosome and map positons. The red lines correspond to mean values in segments. Note that the points are in alternate colors to indicate different chromosomes. \pagebreak \begin{center} <>= plot(segment.smoothed.CNA.object, plot.type="w") @ \end{center} \noindent Another possibility is to plot by chromosome within a study. \begin{center} <>= plot(segment.smoothed.CNA.object, plot.type="s") @ \end{center} %Plot each chromosome across studies (6 per page) %\begin{center} %<>= %plot(segment.smoothed.CNA.object, plot.type="c", % cbys.layout=c(2,1), % cbys.nchrom=6) %@ %\end{center} %Plot by plateaus \noindent If there are multiple studies, one could plot by chromosome across studies using the option {\tt plot.type='c'}. A final plot orders the segment by their chromosome means. One can take the plateaus in this plot to determine what the mean values should be for calling segments gains or losses. In this case, maybe $0.4$ for gains and $-0.6$ for losses. For most data, these plateaus are much closer to zero. The next generation of this software will have automatic methods for calling gains and losses. \begin{center} <>= plot(segment.smoothed.CNA.object, plot.type="p") @ \end{center} \noindent Change-points are often found due to local trends in the data. An undo method is needed to get rid of unnecessary change-points. Below all splits that are not at least three SDs apart are removed. The following plot shows that all splits not corresponding to the gold standard results have been removed. <>= sdundo.CNA.object <- segment(smoothed.CNA.object, undo.splits="sdundo", undo.SD=3,verbose=1) @ \begin{center} <>= plot(sdundo.CNA.object,plot.type="s") @ \end{center} \section{Tips} \noindent A function that may be of interest that has not been mentioned is {\tt subset.CNA}. It allows for subsetting of a CNA object by chromosome and sample so that segmentation does not have to be run on a whole data set. Similarly, {\tt subset.DNAcopy} allows subsetting of DNAcopy objects, which contain the output of segmentation. The original default segmentation algorithm, because it was based on permutation, took $O(N^2)$ computations, where $N$ is the number of markers on a chromosome. The new default algorithm is much faster. It includes a hybrid approach to compute the $p$-value for segmenting based partly on permutation and partly on a Gaussian approximation (available in all versions after 1.2.0) and a stopping rule (available in all versions after 1.5.0) to declare change when there is a strong evidence for its presence \citep{venkat07}. We no longer recommend using overlapping windows for larger data sets. It is still possible to run the full permutations analysis using the option {\tt p.method='perm'}. If the new algorithm is still too slow, one can reduce the number of permutations in the hybrid method using the parameter {\tt nperm} (default is 10,000). However, the lower {\tt alpha} (the significance level for the test to accept change-points) is, the more permutations that are needed. The stopping boundary needs to be computed for any choice of {\tt nperm} and {\tt alpha} which is not the default which is done automatically within the function {\tt segment} or can be done externally using the function {\tt getbdry} and passed on to {\tt segment}. %\newpage \bibliographystyle{apalike} \bibliography{DNAcopy} \end{document} DNAcopy/inst/doc/DNAcopy.pdf0000644000175200017520000112637514710276573016636 0ustar00biocbuildbiocbuild%PDF-1.5 % 36 0 obj << /Length 1355 /Filter /FlateDecode >> stream xڽVKs6WHD(K5>! 5IhHʮ-ڒ؋,7S"KBx-4gY^,_G{x#`yk0 c,"\+V[K, ѭjMcUI=`@\n"Uw}V\x_WW7/Et0fs2YS2a"("Yu4~0#N&V1hΨ!/2z ;0Z9PK#q3lAGn%K2tFb] F$=>^29 JuoKI*3V@/?-0Pb*S1 rN4XODQQ&I~i-"ksz4~-2 LZ'@Z A>zOi(Z"n8kqgႹū1ɱNM0.'a2g0Ӕ9 zmzkF\eƙ{5uHUnu=]B-N^p'IOӣ'QUP~o7("p|ܘў1$eI:A2!/ h>lPL4{PDq_)K6t̓2C"N/NȚ ͸/:`ueiEDЙr"J)"wJ)^8^e\Dba^ 9;vtn< #C̐tQB5`C> stream xڕWm6 _.-u 0(rc|ۯ)NrK"QD=|Hѯ6ojab-hWQb,rQN.~8 Q?ZZo2 ri`UjI[ݭȂFeLY0_26k{Էw2fB|HDQ 12:sPԲ0/n[oU3EVBgaU7iUaTaǣ":$ƃ70]J:M%HM GZ~vC*G$uR@iRimo*>TAC'%dQPV[rxla*wD9"̋dTv"Lfq$f",4$pǫS=\9J(iuNw|t$)<`VD3zO2B =F J_Nˆ)& 9]GHѺsus/ !`dG/,==Ya*'m_wpQ &^*m[AR|2:o|@&҆BO>D[ MvzRid[/뇇@7zBo߬`z٭q^T>Yph"K•Oqx\*1,/鰄zЩofN4;m$!Hm!HBjY\x3I22X_,k z=$ph܀o鉐Ie) 0R:*k|#AvfAm'R1n^QF Re5Sd/i#:^xV3wEyhDWCmfuϯ $K~$^2m[]e:~<1..ϏWw;c6 IV7WP|QĆvB@d0ؚLsH׵us{t d嘃X3!lزd4':͌&ZPU2rOcOx+d\ \AXX5DfVc|~ Ld>Qp)dvxPlrh:wثZYï%ڠ%'w33[ddMɡs4^C`lTDpO$Ўaom=X{Zhx}JJ ֍ES9`{Z4'E:[Xc~JoCxї_=g|Ԟr%?SDZZE%E>"("RyS f-o |'4Fu)'QXg7v ;M#QQ_Y jrqw{/ {dvYjxGH?Ɖ"B<uiA@[Zw> stream xڭRN1W4-ۃ&İ7Kv۲ "hzh͛7y3I2*K*F!SX7| ng9tlJ[ z2vKæշB)sX$X8 ⃌*Ř<.ԩOsJN\hE_YTQm4)6%<937ڌqێL⸌uc+l[-i.0c^ $wПfT{oU+R6ސYH#:ĥcfMAP8}o3 endstream endobj 59 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/home/biocbuild/bbs-3.20-bioc/tmpdir/Rtmpyr8nmo/Rbuild3d3f49675156c8/DNAcopy/vignettes/DNAcopy-006.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 65 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 66 0 R/F3 67 0 R>> /ExtGState << >>/ColorSpace << /sRGB 68 0 R >>>> /Length 14005 /Filter /FlateDecode >> stream xMw;RS! 8lSPH@K FM=H>~j٧+:nsovٮ\UN>~h|Qj#ǿ~_}?=|??糷g_gI}II~gҕ LWI` 5SL̹!,P,o ̟uC6Y $=Z(7+3m|)%.]ْ o{!pWV|wp?gۮϔ =`Wjؐ,> BB5lh?s-g7_gn†RR6 w6wv ڃw9zB=Z\f2,#]R-޶=!dC#'y`JjF ԟ#f=I% =gn;?K 2?.k3,+Е oF/?3_+$@Iiنj8AО; ڍ@ͷ†m|[P 5~6(*3f`{ [h2-p^KtvMa*1`Y`WFͷA hܠZ|^A"g00 F  +x5cqTb9ayIW5K6'xSW~{污 VÆ҈~+<ƿa l2 Ql#;=V`]`Y60s̶p 7QIbNDl1#n3ñݝMb]Ww֘?tb cVt6(٦a"&``r.xA+|^WLg†hT5wsLOEg5(k` 6ij6DF=ÆQϰ!-`CˆWV\ʰ z: ʆ*|oyjH U``iџ`CLx_;߭y֡eCqm\Ǣuȵ`k4`cyGnY{w/kA[om 6A?(~Yfa6+ԟŖUʵ!pI5> K^޶ ж5l(#+]en{hr"k&Ms)L#4Y~$>Ea)ZZඦ{lQ]-bn RI+2?6=Ą7(ew8hb*-(mIDԈh&d4dJދPe |͆g::||d-!Mh% /f=~6 #wvlJ ^|nȓ**%ʼK.ӶlXlm#3kl/O-tZf&f­zc27Y!Ga禽z[xJ3`PyeSs6\sļU3PQZ'",ݹ[Flu=J#ۮfL9v_ 45BmrDƵ+}4KM;  h9^RIdڞ2&B Hgq*pҙd"G2Mz+3hOz,q!UQwoY :Π3V`Ȑ{"炵= ލЂ*E/ǁ=(I+BߙlC4ϥe"ӾWާUYIP?7+&<[:( Tu\] *kkgp3C6WO-44lPF PC9f I τVk4#eGzi!۰=e;)!{ hZđbysʮE $e6Plm0$o&i|6"=g2"2a,V/J z4 ZB:z-t#I\]9p6i^*l.MlCG.eh+$[7,99`tX/w^ip(&BPq¾3vt;lt̷>G"odeU͑Ns$'h^F̶X`׺w&VzDRS\=|`~nh@p `)րrbVeڹ8' Ѻv^!t{hD d@_^R`6hh@I%TëWj Pkɟ؊YP!4Ihr /\]^5ѴٞfLPڄCLt^,iKaR|C}rЀ6zE\YfՇxݨڅN4 3Q}nyNծdT-cVg5Vk ҄QW/VsWW\ꬖVs@C/z5WcxB5WXרw7PysrMyzJ16iW,oHív?8ZONrрmTYsXhm`WUGjaW+=Y|-l\Y7**ʮwĸ̨kq@ VsYVk1C+&PkQ3/3F U*FClTū)n[?±$q|FuQT hsIhh@+Zc$:GUot1j+߲>To^GB$|2l8OʻչvEܵy(]5X;\}vıښz8BzbQwn2WHwz 'w(O|hG·Nښ86:EvytY/M]"ϼ9H2@(ZِeӘQKv/Oil'^e暍6+Rl["/sX*YL >XjQs73x4S~-CmeSѦ=0VnWF idR;w+C 6:H+ϵ` VF#7hq| q#G(,EA.JĨ۴]a H*$6ZAf%Xsr.{"%M"{Fly`fк^#7*/ve.z\=sI7WsUn\=յIoeGa߷[:ǧ7#G-) p uVA:Gݛ`42*=.CFCqdwaWh10+ڪ\ővz#ڳ]ӴpnE#;4A(jmc$;&~BB#s.zZ3Vݎ˾M7W~v5 |6:F q@Ѐ**;/cRyfpՋ9psi%cŪ͸*uӤYO2 Ep݅Z GNo4[#vt%mV:%]r%ay( +i}~Eqs3( `Tfʨu3x tZf'fw|8~6Z"V7:E 6FJI9hq%*v2苜}8mX,*LB.mc#bM*f,gCZ8\pFCܒQg9m49XI;-OI;a<:{"_)6gya/6}>W"jw74ѝUhh*>"?r灻gۄk =%}ȻUQ7W=9vEty׮o_*J9‡׍*Vz e^^#V0X0IXR™ ȇz7W}a V\]0uH/ꊗ皫 sqcx-'ukК2[YެkP;oٳ WOu}DӕN ˚8*8ji [{\V&s[ȯ^PS߈*WX~*/) EsʿHZyoӝWgmqˮ#znp+4WўK .YJV1nza G$5|:vkJUE5`Y(ߤpΫŘݤ={tӎt1ǗtI3S;kWߤp##c:q%ONyQ<̝UyPys-aN1*jӬ\~2ӬNPf/|g5vsEpD\~JU+[ۙnk3V5bUF}DrG>ޕ]ύ/#|g=w9/f=îx-SQ O(PZ@QJ\ ~+> w+U'L_`}I^ L.^ge^usu"'W}}9%wez FZJ~C5ѣ.ɹ,%H_+:I/\Kfh>>Veڍ"YUMˡ 9aL˲c's)^qyHzF=Qgċ6:MŚ',,zl깡ڲƍxOə\=sEejgs̚qz[2 mΦÙa 1p(oTki3 \ZVU:>@>(ƊEpuUNS%zPh>G =Qg0ʄvG4)g,eWkbšCУ- 'fx mOJJ0?)zc!TD*PB?Chs$Az`,RY@l 1jF BOpTheQK{lBg}Y(t'9Et`>&%۰Y*BnLq%x0G%U=ߟ;}-{J@Bm"BMBdrX^溔q8"棅VpWn=4 =3p=Oj@_P}9EJj{[YʮJ'V6V=PX8 D9 ج-!LD-} z¸(Hw2= 0"0H2ȯ%7k^HCP 8ETx W}09:8{ Z\]v;7 `ko_G!Ctu"~6 N`Tv$k5 ~|t^3})l)ZEΘ{ϵS['ClM*9d9 >n0b8h=OaE>DD{\ Rŧ=)&T [%~Έ^xP'*hX˜ _X֠|Vrq8bHMou5vxywO czXsmn+ bP?ds`Ps$6"=;xv1KTm9/6mGZ\yKsCG:oyp#pu@.t8փ:DJ5Wwe4[{"ݪ)KWXKag޸zK/4+~os׃՞Jz؟l#=Y}z@В/;~9Mh: SQyƅV_[\avZĚZ#͡zG-ˆ%|![:-iUn O\%⥕!}d.(CUؗtzO S-_{2hUVm93~o21§Y I@RћofcezrFMf\n 7Rsʮ H9Gb©W4~d ;Twe'4s pu':q3hǠ\5lMGA=ǣLܐh>FՖVny}x rqO^P0~⨷iaȁVUˍ°%M񸶹;^ eZSF=;ػ.~."g$؝LRfV⳥ڇ)Ϝ5|q9tɍ8 gUsYp>4&4Uq| 'F/k֌4>zO QoUE8 <E誯]±n)#N+iBϹ`Zy+* 4FUѓ sէО]j%ic~tŠ眷s:Sm>-**izb v[[k ԙy!kJ&dJsw#R=9;Ms<[>׶Wz^Bs ,sqn2W;e$3%44 d:_#} sk47m3-Bi+jISqex藏HD7,9cy!F+29rrR'8+?8B]V =.'@\(^V Uj?XWK⪿V%hD9 wpZv3-3 b(kvF3IeYvN-}{~OQ62xFˡ'/]8 VX/zXˮLK3Qq+GWmyHVW<)CA*'Bor zGiꨢ-s\QQ^f֭MZ2Wx kCu+Ḛn XJC9ŸgX;VAh6c?Bzs9ĩG<.PC8BX5l: xB[ƆB'.X[V`tn+y:>tQrϦIhvDBK{=ڜl `:ɭB#:HH>uުL?f)  O Ἤ _x9{BOB3º+t9r ۭ NBO 3({!oM6 u&99wPI(,aW"aEbg^\xuBQ:BXP- }#<)XShDqY&1Xg_| B5 4ڜ>><'Q:ia<\H2cVS%`DRr:^ srd"(*1`UZRG] hoB j #)(ݨ3lgkQ%B#慪*zcP|"q9 /tjL ^hQNJI-˕tq06BljpQNb|ØliX =zDG g-ي~ ]ԯ֏~Au9CBkCް8C x>FnhztH|+TLg#ĢOv3_S q1^rzQ %#4K1唤.X{B Pxaf4oyco>i _Ĥޘ!~;C̐3sr ,4ó֣v云-T;^Aύ弜\I(в5B'wwq"IwDx ^OQ{Ar~2L(4 O7z ,LcY>%#^!z+sB zϑޒ/zF6υt3fܗsinJ >ce=(ҋ.pM\p>Ǯr='e| >K;u<7ƪ]vi, XDx7*'M1c=֢@Vw3>J)A&9 GHwڃPv8A]'TْUZ L_8>0BeN3 >Wy;5|cUqQ2rG9rαCX41 +O*QK[V +% ֤ "~ZRLWz U{KO"T+u<7f朳NQ}B_r&%M1]%VfiҎ$Q- `މ" /X]ax~[UK"₆ ,@jG*wڿaMOu謁XՋzJTM |zO('VNG]H;-.Q7ëECYJv#hT،Ng]|`RR<~OvnΆ|ȩrbx)f\Rhrvi >'\-ʸ.[Uxc%V\ֲ`| z+SfLCieY1/^Pv^VywC}8([7Ԭϧ˵q?P|H8_ J]9]93bZOjT֪|]z<}j"'\1XN5ϬT3ڱkY?T3ȅ.W!FuN9QuBVjax2Q$hq 3@Uu-ުCU%} 7:t+.=ZNа+/Ѻmt`&RvUڮ2DxfUir;[ guϱs!a-4b;:ƓYjf[a\3O'/XU" 9$~BOUițDz]աs CvƖ̷Ri=ؑ7|uhBy)͇x$l9` aPu)1 G#Y0JxJWivl^݌m2ԋ kZ#Bs5ɿhfOy%fo6a31 m~. EofV\v޵Z]x&?zi[kb OՋ:$f^ytEFRcCKh0l0\h -sO'N5[%Tyc<7fV2O:А6>|j9ވfq9HQͺ' {-䁫E/ްsuDȷ9Ƹޏn S:?2,ⅳH**}Z%e^;zpü>_0;_%s0a{ >߬Jv{s.xGSxxDQ된Jvf8C(3uq̛牌g׿w2p׳&0Kϭ[ޙZ2x}=R/|N*TbӼ~M7.?)ןR?muSΟ~N5~pvΟ?`x;}?ߜ&^#}_>|݃uϞ?Ϳ_~wKu?^۞?8,puzg;pmY?\xN+K{FξNd'~?f_??c Ck,BP婆oO<>Dst3OiD30ˊloWFHXшg?sǟ?_ɽ򬨵qm~f٨:Oh[R؟?ϸl%;{}-^/O_rI:GR7RΉ7QE' tcuy>?Tퟴ2B-ޥRqҝ]C?Yt*Q$u'}En7Vcw,OĜWs'u$T'RT?O0.NoeQn9"NOz$JIb?t:Os\rgq=XwwYgɮc~Pۋb9lܿXn?>h'٧KvOE|Q9DiG#o䜻[!EE>''QE?w7)2 m'3jE ?Yw~wq endstream endobj 70 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 74 0 obj << /Length 755 /Filter /FlateDecode >> stream xڅUKo0﯈z#5y T7MM i)#K,zXg<?U)2NqJXT!`|* !U̷uVFT4DYq^UѶ]dYLLQ+'鿄?P4itV餾5s}7iI J!$;κݴ!2;5߶/yfFfи@̖^>}}Qd8-:',$#ݒl!f55r -Հ:І3;U1H1kŊ16$|54(2b2[@{?i4tc؊.]}sD?PsS?Ԣ$ulhmdV! A5/#8BK+D lw2$B x#a$Ȉ13īSQ2LNi^.t؄|08BN/1+؋q(p4c9ia"Kd?<,VإS9gA[NӉ~Ibm<_ǻݨ/)V;cs=Tb Ǯ٨ksOhUNMXc;H [X98^7>n9uMpZ|K8`=(4>]au]/گD :۟+=5%S56tWᴾ*u endstream endobj 60 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/home/biocbuild/bbs-3.20-bioc/tmpdir/Rtmpyr8nmo/Rbuild3d3f49675156c8/DNAcopy/vignettes/DNAcopy-007.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 79 0 R /BBox [0 0 792 648] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 80 0 R/F3 81 0 R>> /ExtGState << >>/ColorSpace << /sRGB 82 0 R >>>> /Length 19358 /Filter /FlateDecode >> stream x}I,MV\V-Hl HMI@B?"|]swsxN|۷o-jス>ۈ)ןۿ?WoBxo{!lQ-=Z{LDn. rBn{+8 3WK{%5Lewr>LI𞙼g}Q `@Q"^gg:B_z{!rDalɤ^®;u=>!k>D8 c{Whqf6ة{v\B|lɕC?va=trPpr Kpؑ ng;iɆ1ey75Ma1e\HS4P|OX135Ot>(v!g!EH͊"C3 s6]l=sCʉɤ]gPŔiyTchbLk6vT4 < :VTz¢*-T.C {b(_o~ķ]u[2FS͊MF:+ny밴ubpk[o:|޼uEo]Y~Gg?r]/W/rl/Rmt\kX殚uhQ걃6K~ͽ~ͽòfptA=>`3Q/^gW.Tcц0Vۺ{_֛ÿ&?S8*bNh5֑ig{W~i;OLMuw/?~?ozǷ?3qٗ-CtߖVwyǡ쇽Է/Ä!6/#e׶s\ԡmgǁ ϊҸ<$`\Yah0CNw~9X r6,NEL%S2SA"JĵdAE1x3j˖h"K\Bk9%wRj3/`%znjb# ]-sxHzAyRCyv7rjT}yӝ}D1J!Hߡw&T[sLK jF|NKe0ŷ9P tH;H )SBp}BQQ\3_FZPi9Zt X&ً@*7W,E;}e8ISzfBS  )S(}2,RaR5Rj{k,ۃF{gXOdwrT&ݽ3{Rnn).6csգ5s!.!)ڡ8>y" nuTV&bn!pͭ%r!xMl雽ho:zܺx{{Goߺ`æp<.kuc-]uYoKn/mWlb|MwvPzZl{rYvm;u5+ooͩK&wq̻lFw9]벫0bwS,W5[/5vvrgy/h K-2di,+IEqh^ڱ0&7,,Ca'1 jLQT94U34kTq2)/uR44"5#\)9Z~Mg%9JC|>`so-ʐUҡL}y048GM3/";RT-!F"2_ҩQLX14#}5=▗4/ 8XRp/}!j,R؝*}|֐a/ J9y>[ (.:K}6'QRdAWsM3Z3sěO+c>AuذYWtqKHǥnlƮYFߌ;ݟ|^E$鴐<R=D26u]$$cWqI" WgL $< ФAFʰ?󕱘l'=-0>k:!q3@jQc|&n\3ENإcEpt\\\-=;Ugisp;ySsĨszNgiDIGrYj m&{_ Mt^`Ps64ӓMu"=hǤsrġ^!: vs~d {s*!t].޾P!f{K̫.jy{rx~_5#h8בM|m[ڵPG]7XC4)Fk]A](u9,OqZGjs`mR6$\{g=v ʯٮ#A~A٠s&QۇiC9>e_*V_z(Q! b@jWMp7nuJ9XjqS@UTM)/9 jPbL<"\֢/L1Hݜf5W!@ 6y!/Vc[emxR8q6=_ z 4H 2 LQ2֐JZŰq.@j_vjK]lZ(ˬ l@eX$6EٜD헮ƒﻤCCziHqpjY5# Wިkca%& @3gwxr֒>Kc6ec-piU';Q92[jl^R Y7W2{Y5Ǿڢf/qazN<ѲScIfт"5] t$9a!љET]?ߏka=v u&z/^sa ; ~5M5)SFߝAݬt3J0t`vkL0H.0Ks&-x3Z 2_)v٘e_ ,^|4ŋ,@Y@J"UQkќ2{=U׵P^GJ9u-L?HIدR HR -+8+iWCZU!'!;>thy@9j#D@U셯&Q6oa xuK<[xGoo]~{{o_?`篅|ŷ_v8N]|xx- ]ܽ]6w(w٢ w(HI+Q(_M .wQo{?FA:h~ua<(ȓq ԇd~Ϧi4P3Go[p<*µKss!n /RjlI|fvOӵiDi "4_iO6"w 9ǖtjzLW@?_YSn2Kt+LKWmuV^/]j542OÀtxeSTviÚgR\*] uo/ȞE56ITK̺&'K Wi3u(~P*+jV)TUlb 8-⮱3oc,6Q )'o4QkȞ*f=UHҦΘU3[L3DM';]{= xCf<T]xN2^ļq݁B4i4$]d'l˾]-TOh'ߨY bcHz׳d3kR+Kkl1‘,䙣Tb:*ٵmn-UsŢ4iW'۲$f-6uSRH%g㥒׽T~k^*zh%y^)襪ir/G^ Fʓ^'=4/z^*q혗*1l[4v9X"'k z!56_zež:MVZ0=ϗC\z9 H㲔kyyURQVZuPAtjzힷNsf;LO%C&c` á&ȩ.h6n=_tFx HΫ/[mJ ĸif?v9rR.޺<lDwGu6SM~k]q@^CS8KX-s$n{{]N]esxö'Xe.ﲹ3.6엿 >Gv?Z #@{IF.iC w?2qap@)ej>A \I{q`8]P!4&%^'B%Yx$$2ȕ+YVi2BBɇRO*%|} %xHAF vu٬IbPAwBֿ@AU,f$SSdPf@ Tё1MX|]6elYq,&,k T Bl@i.^iR'ς8 d(%d5/ 06@)O퍄%@ Vr[ܖEMO\%bb5X٤L%[IICA.&1xInGw5hxIvƅ:%*+wUT|@B3M.nXld6IIN!;ū y<zDU+Cq Ru}&=SĮ2…XM`_lF(-#6,p9BUi*ܑFU/ck1#lOʃFWXjO]'. dKRW.Z*yZo+MU) >)Sr4BHsJ@Y3Yk n@T3I' @WT_9eU#;Wfv8egq(KXƕ~;8# jIO$ f6U)[ *[{`䁺*܅k_ʊĦ>IT2ϩ 7yAەiW4S/ ZbV)Yy}mRA'm7?11M#?d6Q̢7 Sd#Z(9gUO}LcAGTJ3Miy~HOP2rf_=DalOJt)g'(raMM$Hy9`ͭuuSl]Be%_sR]|oԒOT┻i(KFy'6:taJA[;XsOutI.Ȭ/P^,)a4>WvWKGP;JP3@4ELy$3g K+`ިHgV22!2D`v>RwzP@.!֝$7ͥvTSEB;ہKГ"&-^]H#EF\.󝿁\NsÆx{#Oo]u)+!k]~,E,ƗQ]H/ѡC#]?[{wS(M.N.?ݻK{.ݥn]vݺ|ƫnޯv5w߻_FónÕZ7w/uO㳌ϸןQQ >t%~dnZik(/ ZT:'3 ݳgx<1ne(4xh(߸ǃ*$0s1*"HMg#WɱfZR,lUIc@9C!Qe s9s.ڡ3'pqMӉ]-8%]oR`p>۔cb G%OiZS|ʾ^""0+kRϑcwl1`}-0/* sY@jIŒ:w>on~`\I}K4Үv87{m=sUtd^6E]K% nL:/Lr&zyl4P1W6]eÖf'ΒN󣑱*ɣkx}tX-St7+KNxY)w5 aXu [ # b~lo/S\_ :Zܹ6=_'6$ eq,WW) ͧDĬ\YCagihSa1!͇y9# wv,7(&-Δ%*<Y3ߙb`B <%\XAm3xo!m)#r"dN|Vj==sWt1zhZBhRFhIJ[㠺?-c>+ڏTg(Eq&2t,AoW2jyX'\Rdyz"V(\C ^ȃKS=ss|4v1’=N̠4Jv }Q9zq!m|5knB2F,薒]ĀChj1Hef3hzlT 6΍A3!A υ}^㐚hʾ-1Hbs+C: hhrLRfwMQZe-vJa/ s>N(΍YXFШ[6$>OZ;?)qi ٳ|؜l`7x [*(1;R ƬW(Pɺ@)Bo!T27J'$_[¤TMF f]6)0vkIӊh\H(bR©ЋƠs NH߫V5Ff$EJs׹@!Yw ]U/s#F>s5CFt:7%TgGZK::ZFCCd:7"*Jq&xܠyZB䩈RSeKeN4!$ܘX'VM0؝p媂's3)P4foʈ>$Rt$dئ;Wk(E4Ot#ُ`H3jԅ9<Y5t}IDڕ/ԗYBJݯ$Hɰun @.fĉ# ՋbiESA]9`%KU{&(.޻ CuEcl.޺ܿ=)B䞄wO~L`Q[V ڻEIwߦwqߦw|ŝFesooӺǻuo8_m6jۼw|ևoڇ/Gѷi7ԷYD~ی 87t~ >{GW m*[}ⷶuSXN@kV95@/rɵI_]!*dGr!:T=c27d[!A/# ȎꅡTxQmk{BM0 '& z4 ҮQׂ;^jېZELHd6R a0y ^ҬoğioW{!W,8C{̕@eaktlLg~cp}jK2f lg#mɵ!pT)ZUfΒ[H|&9O 17 k!7ʞo('J.Ƃv 碔 wnR.bFRApo%05<]OF+!m:ũ Utf=5@4U)Rs=5zcx_S(kM+h0P rYzUqQHyBo~Tc#Ĭ{ȞxqB*FSch !j t`nI-vy2ԠWʩX"(;؉3Ԩ\}CjUԌ7ʹЂa@ZU# T 9̀&zjg>K-G3P`R*fTsz8N JRɓ[(KIH -Tfyx#`HOI)m;[f!nD6VX A 䤃ԫa {f5(LvQH хHQdW["#[({ScfV$ϠE-~E~LN+Q4[R}}t5 >ۑb:xcUɯScHUvj4д&Ba;/BZu4 鰊 6VǩA2!mVξ"N8I;5KGv>;R~ㅐ|KzjbH%&DK}K` )7D[ʎ=NVEa!sp{A`:r:JaϬɀt\W$H`lFa-٩Az6sߵS)^iZD(ӋyP6&sbsߨĹ57yi!.ާ&poq6c}9BQkRnUu +d"0*a`6 Cރbuq"LgaK8*e @@p10ՇDbz,Yb=DiIZ @U{b[Nk-HМ4R5K緌;~hH RI5μ=;Rƀct[PQ Yʾ^4&5V-dRܞ#Umil1 tfJ:cG/+% |YW99^-TbtMn֗E 6 ˮm&A}E 0_ҩ6(w`+T7Ջ1ԲRWH^ِ<^,〒}BjH$F4*]G#rjG mHƝhTltlנ:%uԲ[f:wd>ٝ =3XwT +k=صV?)撚FA@v(q[i56M 5X5PB0y\`o*J޲j4[qF ҮAjZTM5F~sZ3ґ_^k˙'zF_^9{^X{s*@ٳw鷹&wF!-x{rx>GÕۥk]ێkCɜ.':- 7a77߸[7_î{SkYgh<7Z ܿѦ0ܿo@~ҿmq7п#˅0PvPW`/qV4}r:^00g8QΪEܖC\qVIҿs=9]%?J L*x $%}x'|;K)Zgyn_2bQXlpJdP|< iNdNɋ•,#F1 x b jj2Ɩ6.@2CORSp[/_ 3(C P=@V!ֆdi o/ku1IMn+&xOTdm9XNF9N¾ʬ:i:8mR#gJT 8 ؁J'Z)mS"2 sXh)_CE"sk 0bѶdP;xany[$[o: -޼u=n] C? ܮ|NnJ!UkXnꂢ:ZnͽCQwȲ;TaD?:hsOutIۨV/2 L|q75ѵ(O7gef2cyǸkV/V -LIݸԊVH1/}3]Ѳrڏ/F+:? Q/.Y F*:F}+3ukCm*XS)hbTB2+*'ͪSJ֤;,5*X:K*htr:W1;((QyQ+*kZ+U87jԫK[giRs*F`,-UNYuQ956QH΃, TtD2J)|WRPEe%J-6G/`K5Ah:Sx82]FyasJ2J P "/)YH?^Nv27N^,(gl0x|r7u 1g616Dxŀ)gN&ךsv-JeZa^z{N]n7A۠e3Bˡ[]۷.nz[Ϙ-jh7Ya`۠&i,O36铆xycUj1aߒgfZMBs0s6"pxTB)bQ<0Y%u:Q$Iզn4*UuT uJL:coJ->)[Q[5~jEo2vg,T(7W.Ojb%W cզ|َԃ<@vdÒ*g70,Q:u±IG{K­.k=K"[oo]^r{ -~a~o>o 'Uxͦò6C#M +ZX.l]ТuqλŻǻu\x1-`?0aYbxFܦepz*U5[CSXo N~dpz=P3.,hR!kVsLJ\'xㆂ>.O~J=Y':Y6e)mK"[t xKYHMiEW)Y؁DOTaעI4 >D6XM<{3{K+}\:MPԢtԊ)Z)"xit3*hUuό exrBS!!i:)c5jь>0y-0 ,.ULYMtr&_sE"k%uKj,Ep 1=L,D3EGUb$霼}ƍ6] ?cMvBIjBQ,qb;gE]/VO Haؗ}3͡6gA9"MpCTnR Y_/+.l7 n2aߺx{rͦ;[>lu.w/tl:tؒ_2T`f$(Ynyfyו˦+{f?ޭgl:xզ_jjqaYx錸tF\s}Ik<18{T+$U#$'Mg|q%Idԗ[xS(?jA*WRaFF~bH5 BzU? + \R@ٵSHB,F5( 4ՠ1ZQDtZ0FC8!d}#?: 2Q3FUrFi#wMKCŗN}#z"?|XAxԥMy 5k(qx{Vˋz0U 3\W'XojL޽ȋ#bV qJP.c!hB,M$t]G _}sGf~r}#Tc$QAV +tZ8T0d~y(Н۬r)ēKFQLic=jpV5f*w;Q {Ưm3 ?w״ЌH3 ~tgty(JĚ /5e}Cpe Ѩ{]!c$mϩi=1cJ_0MUiYG,\uQTbQ /7E8C)m֝aPlhUp-,^3LR5Ӱt/h< m mYgOZ_C=橏Ca 'ڏ8/ '<HE Z ʟ 4[2`A;_<ՔPCw39QǘΙ{֬!4/bGF_3#װ1@@hjPU+U- 8]CL-룜,9\##zڌeRsR5 Q]؝m@Qwj3dIGX/$Mzg))ؠpB\t^_\2|bL1 d=5;4|Fqy) p6-صF8J5ӄ͍:Ι#Hޙ,h9TT2ZZ̐ l KZf82YoӀ: t.G{њ]uC޺X[*,з.Ai7}Ok򂺏>6 vm~Zd]{c0.'T⦂wLr`L]T.px.1 ;US.T𫩩pF`48FT0_j*pMYgL'WCS+E؀+\_ŭǢH6HL+țFS:ީW'WATZ˹73?ɤ}hX pubD:EPNKΚIR]91P#vӄw K&bu9=! P脯*}N'Ә  |PFf@&ĹRY. hb 8t ` X Tk:^ B(~k0,*B G(|@b$䫐\~2~!\HW0M bXd &DCa)xO4zgITNSrNےluwЇpGry|>"0r !@"$r׼4)Rxȉ5hZs<"N*`k-IVX춂)i 8@q15 1d0 8C-yzdeG%&\vrG\>68Nd+@6 d b8q6:7qe9D@[# QW,Q]xX哑G)ta,^|B L%;-bB{lS]gPl@tT8_!~2a(xO`ȁΰF2 g%ӵUe$.NV/줼5Ҵ\] ew QN{g-I Ӏ1Λ -wConv0oV7o탰š[$Gkn=䷙ڀitOPk&O`4"u7zd/n;rf?P{~(G qxcy`͛~r uxsD>:XsЗGkn3:v ak~_@%Z=kB*٬%m'G}I+U5밇Vqj=\U{x /EXWB,'1@?\Usܶ##Nۯ(JUiU4aqޞR !nִML n|p{9G:8d`rq 5=ޕMV"l J ,h Ш^52A8NhbVCp4őpӤr@AOδb&4>UBeGCx-Bau({~ێV`օ R? ZS3$Dspy졐3h|h|d|xXGO=hWv>:=6G0o~h7??OwěNܴ8AnY#ͫǟAL,eLJl (X18 h": >_3VhBjt139E2flR*"CARj&P6 "ٸD_`*xH= PڲY 5FBH"P@Pf`J{N 3ΊȆ@%pxhY*kx!>Ad^FWt&RۤQA`Ȝ@`eH d`~`h~D.I5$Hujf QSB8#'@@Z/!0HB.7f0)Ψ>+H4nĦER@ ; J}F4Kf,> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 88 0 obj << /Length 627 /Filter /FlateDecode >> stream xڍTMo0 W=XJvT:+ mA؃#eҢ#%eK(r0ŏGG""YWBvYn~(s,9>o.*dqyZm&xNdu񬒼Ut]lXhrxL `\0U1M1cWS|NcBCBʫ2/$2F'-!T` \}AꅨK)#aY-<߽ͣ1Ѓsj~}^Ep :#h4RAA601r w7ʲ\N͘\7]Z3l-@&%[5[˙w4XlqC~tuh@BF"Ev`{ j5vXzJn_b2ZʹЧPD 7#m`g]UGTF4ieiAx{:g-KNQ5%>0YJ^AQ6]Ğ'oO`.N!";ټҨ.}sYuL:{MRO;@*'o7A[\X͞PtI䞕`;U(Vնޕ-~ŧ/ƍ[ endstream endobj 71 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/home/biocbuild/bbs-3.20-bioc/tmpdir/Rtmpyr8nmo/Rbuild3d3f49675156c8/DNAcopy/vignettes/DNAcopy-008.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 90 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 91 0 R/F3 92 0 R>> /ExtGState << >>/ColorSpace << /sRGB 93 0 R >>>> /Length 13878 /Filter /FlateDecode >> stream xˎn;r)j( TZS `6 Z 㛑AVoVAt׍Ldۏo>ϧ~YGs䏼g/w?7x>~糷Tg.3u?ǿ G<}etZ?^YL`i6i_9?'>s+kݿWYS7}e5Xm\|.hݑ>s%p^BV;ue|;g4OK;ԕsPIon[?mMU6"h*y ~ 6PN{?dCym Iؖж-cmaCywz`Jx#H65-4?xmY#~hT4(PYţyDNY%l#&=>|Y8=9LvK0?ӰQC#xض!2YvmMa~ snͷlC{e}|J,mlC<-"ÆR|ѯȆLwn0J V d&}o jA~{r/1< liRbz){Y~nN~j+QoP߾-,3̿ie+ lP3M`doPCzx53_hW@+1o;;W| YB=x6V+ ۶lsE۶NaۨWbú2x[ m~lW*? jm }flO vچд %gvtۆ %r JnP6~ lC_Ȯ66qscoĸAyIOoڷ)u!^|+q~rAO Nk0fpWom6(=0}ۨaߠd {3s ^U;27 j?$؏؆cܠdwP ʆ.R63m ړqK(aC`d\W Xciܠlh3: liB _H6 lքX ^wPi₍pq2DބXZ[TomEnmEmۣi~ iRQU4A# *#hwZH` 4Vmo AU &-(. r~ QͰ7aaC%Ea X uE5׺JQfCQLcUD$4(q&CaC eS k}mYDC&2R  -W#Who2(Tֶ6D=Q*s}~2(0*LU5ZBY% RrbՠHhZخlE%*gnb*c:VBB}+@h %MsNZh\b ڛE fdpݲ,B%SKprŹ햄=պB۫"tqW 8=:^aհ]erWPhM(JGsq~ۘaW 028B]aJb[.=x:dCzΦo-i>P,`F)uypݞe7F*P5_pDŽV˝U }? erHBQ6n{d3BӶA>vV읐"ש/ʖi*x*\Q2׷k< GbBeWj zô]N%}:=]X^,meD.{"OUۊX[NtE}$CtAszjaApڰnvvNlv/v6 ,{BcaYgqfe;V^qUH*Z%ரjņxFU8:У[ڃ@jO)HBAqd;@eWw^nn_YԃkU5OJ}QwpY@m<Ս_ic[&#WӘʬ>eg3ϓf5RoZhv lV.IFabv:2Xq zrtd;B|:N HU {&MT~]V_[mi,lTvU0lUB^njj&=oTvUpQh8"]T/V/ڋiVh^1ۑLkT+g_V)|Nhsɓ)_学bЮ kPŬ83q\pz/Elzn =[Bϭaui{Bll͢- 蹖4Oҝ5G<8_m4jgkqiV{XG:CSC}F =vEU1+_bVOjzge63+ObVx+OkPE(–3ICo8!>B#h=dQ%WPjBE#ő "ly ڭ># !p4\骣[B]dp7:NUu ՎB5a##4XYZ43*>N=|q;'^O5ߴ(ZY9j1DhsJv@X0M贒@) =ZnvZn=E%.A-8#mtoDtZK&[)4*U,)5az񵲫#Rh[Cj+&FyFî&v=zR06m`z .U5+/Ck2+0E>X9 fOwV{0uEhq ǹ~Yu^ԋ2V\dV6N:>5ڧ2SPu*Bp;Z\x9,K\wٮ&T^FO*aYs{;dNw֜+2fV'lfFY9gV?˅^hf墔f}fV yy`sw^VhߪC\rى`mGm';'CFlnFXEHf-uT/[c=ξ=yM#Jvg_lY)w}PºFU&'YyzekJk7grŜڠŶA~]_9WVf圯ӝ&j=iWhW]\CIՀ.}xD6zb{c{*pU="rKsgypu+ ngZI^U6z {^tK :djuTv?r̂H =1 ݃^u~X9| =nV`2\f{gG2&0ڭn>l6}9+覧}J푄Mu 4b{7vB@ 7rAV޽m޽ x'y!靋c0E_h: $ŕ~H^3Gg ґ/Dy*@r.#4;faVXWc :*r΄B`zXROh>dV͕t Ix ;WUcddLuO_gn]{2ȃh{O*>"~8i0[xr4\ܒf™pخ&򅍞 AZه>ZJme+q)1smVWa qX9GL6%=cָbr,&jB|\5W& 'MUj=So8< [s#c(dUn%RD 5n i'%{\^%SUѵnQ;[ȩ]bՔFC{m*7̙Ӭ%&pV{Ӭ\ |mu ,7vZYhӬ#koz}Oc :䷊r<[]3PIPE6/)*"VPPRKc :2;ۃeʮpZN&&sL.Za }yXBmA+4+QY.`Mf_ !/ZV{:P VӖ^u餖g:2+pj9V_^*ƬύF؃W5&71c\:"&7o6h[x;o}'c.K #T6IQˬk yA#eVaPuYf/|gVZf幢OX9˛/~Ej˓\b|U=/ڭ~Q6ZN"jzc{6-Ls2i~8c9W3ePmaW/oe]U,&T&s]QlTvU3[%C^*>*R7*Oneˬ%rV愊w܌Y+=r=L: fJ9rOU|--';buk'*u.${^p$éC_йM $3?1c4&(w춢/R:E sjBq*L-X9B2+G=kDy%Kf5Һ+_8_؀ $iÍEd6񝛯?ܐ!ǖrChqݞِ|V$Xi)qA؃x3Ƃbplׅ+ki8܅g3+,!v2c GF~ pn%͸m'=׬4(u]x<R# \ׯ*qu۳D Qe׃|ɕ1u/g1D-tL8U{@EeX<g1)DS T|2ZF X<$O7( 7AU |MlX9)Y GGX\k(͢r[Sf9\I,\ޒ9~.}]%a;7\73. ȣ'sR|M<~K9߹خ0=;j rzTD7irVnjeT!rhϖ~CĹn8 Ϯ)j1c)aFZi:U쐁qBߙTsl ?$ю2oU%._ĵhdȏcprW!9ZfV&2|Xyr<8+4/W$qAdŬ^L$y<ѿ/ou4~6$Xx`$"gU{;5`ڛۙbᙴv-4a=R#,9|oTs=Y` AF-dI)I5TQ-NwxHv6%D9Fm*ẔOrA\Vp=*`TL"sCoo1W g HL>#\6E?.83rįP{+kB/\aCh=X9(#ݡۃ7?c^ye51Q-)toZʸu{hO8:YAlW8kWGB_=F7)db[{vǝC) 49>ʬYW MVUօUwõw: =|Q|_ެ$PWQ >j1S N ӗ[47:HF7fXFQl>,cei7yśs5E#_6WmzaB#f OA}Tn&Y&/Vkɻf٬֛Eh3Yͫg~g++z 4RDsl2V4̛z \=-zPcku{H%>e'/zЇq݊ yE:?SKE{qt2ڛa_T4Bi&Ng6nQ=J̠;pۃGwAs Sp~.*3HQhdr=joVڍ#XD fu7z3| 4{BOۻzC#e{&t±.@7gq4c[Vu?ڃ'  YyZMAAR{ )8|V+rj+:o]QEߵHV"&)vOO@pu^V{8;IeW UTvU8uXܳꆋpzsg-!s#=r͓VbS <4G#*ʹ'2+hvd蝽`=s]~ٗᐮQ Tt!ԃ"E稷J3;6ai"\Fjq ̼lyPE_a+N=*"Wbjo5v7`w: aV8;ixȬϚzb{pL.Zak^rjTW;7[d o(4*b{^;o&ËK_ Kȕ3yUDʘ؂B;Vî*~j]ºտiT\z+Th>vÝ͸up tyV{ӬvZD8r!fuU{E3Nȁ)xڈs;Wӄ =տ|O`'b,:c*Q4N.S8,7f {DׂxǷ>kj}Z$/w֫"bKV=;=6nj%TaX#Ehqyȳ  f=\}v3nrh9jӬyX:T&ݱLؒݱ=}7"z 5$4AشS_XnOtr~Ph`յ<]67փ/s=%' V{gUጌ]jo.J ZտIhӬ+ ] ?gZ2+\aOYf|PNlL ++R{xtU9du˛ kCңSofb+Ճ^ܒ&+5V*"ˉGAQw/WUn Q :e.?y%S!L.|z3HXf^f%mJ3ԞeV^0GxuXya 7t9s@[s͎G"ֶ= 7\m".o9Σ_fl߾ƭۃo5® VzG=QT7Lm.WdZRKk<Ɲc+=*"slYʜ5Gھ;XEٱ=pDw7r뜔#p7ӱypΌSO )p'$4X('8cƜkitrO`U23J 2G 4ԞE U9E2zP7ޡ/jWmjm9:.4eWOɥ]hPr6eQp-zPzP8]D*W3}^{Y)ЬB*cuJž B,xy9)ke -e؄9s+srYY9,4b0:Ugr,f9X+ow' f 98}Ljf+'(׹n7U FHkI)Tj|-ŇbV Aǀ[i,Vim+ }-q5B[v9#~pK1ṊΆ3GXS`;WtŬt`VӵfAVE96~`K\~QK(V*e޺=ً1B> wv?C"+Ņ78v'ʳr& vU_7U\U{]ntN@\@qw]f ϋ)츚Kk#zb{;tO`'oz!ha [}e@E2 (16ؿ>-ONPeQjX,Uf~U{{zAZ%BK+ٮh. U>:6+Ugckvbԃ\h@]Q{R6_C CkJ5+0Tg D!jk3}h]f婱]3Cu{hO:>v]ǭL{u3Ю|C,0qBO~.vjo^a儘X X+dr~;yA.F"T*y2{usYyHfV"*շuhf 댕~X9GJՅjxv5_K^PQ?#B5}374 {T) qXXu&wjon|PLB XQh{݁nڔ;F=*bwzmRD1cvr,&$47T!Y= +?Ј˺YynW3N+urId9f==ؿ>6c%)2mtf[T~3hNko4hnBz:ØYgMUGlCUWE$okW)5Q,?bVyJϝaW ]#M3.422> auQ `nVް rs_i O*Z}-Yx3:\<*[ڛcNU99ݺ=K5D<|ph2~u#߳NgU{{>-vg:jo~g^X+ 2S rp^Qf3_n)+@eWO*F,*xа~¢2M_d=R&kV96Xy3dH# VvwT@3?Ӭ|e?7Cg~~?}<#}߿HQq|5ԥ?? _=N5ϟ~pN?8a|띾^oN~7#E6族?{7?&/M&=rNϟt@."OO 8ciz/#:'A??ИΟ?ϯs Skؙ9PS~ HoXh:OWޞ1|>gOL P׼2.1+uzYQ]oۧ", o_~{}~(G=Tǿ|<ˎ6?WldβӀ?{¹{D2F*\^OzzvOݳBǴ?ץ85ry3~p~ؤs )Ucx|>?YǤS'ǧX?)&3Oٙ$K;UNyCsNuQZe.wTD5tOsrO%v<Y4_9'4u`{IM7 OZr#Is12ROw[uHpyvpӊ/Zod{LkYZ[L bVy\ޒzy\''&7[~-C.h?9'nTɜN 9z޿ڦN6O`O\LCqvR\56DYm'ӥ2Zvqw~Qj endstream endobj 95 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 100 0 obj << /Length 1629 /Filter /FlateDecode >> stream xڕɒ4_NUG#Ya`8E  tx4ENC*ަ[$.N[%bivEs睰FʘV[R,^kMwC`yXx-$xrU"2JI~~[!jد8inZ>Mg7q8Ky>t'^1&?qzI}v#onaრ35HeZiuʓ0I| m"t\| \]w()vVNrxwQkAS>Zz6r|DI/&<!r55][蚾cشWb&.BԲcK|$#yOwM("0xy:wu@)h!usT}-AԊ8}7_Q?oy/BOEAO}/٫q l,K\+xiU ՙNWMt a~HICZ搖78)P=V'6uq#McZ'$Sу9rhofġ} 5k!Hbrd{@*TB.rd[H5d O.Z]Ӈc X qvJVIB[BId8!wdก/0pm2w-\/0c^LD 5𘒦r0$,JmQ%3*~ܚ `!]={r-Pbm^kvQ%3{I,z7@2N3)gck<̗ԄK*@i%C[(B_Ub=(>ԛ"%7C`8ӄ1[!Vװjz- 4 `KAmʷk\dZBq#3D9J[\\/4tU" b<0z6P0\Q`+'z4l/|GP)ga(J b4AC4Y4xjX cɐy])ش`pejk_dzހ5tiڰ966$=^M:i1A.(9oOoAe $1PvXgx:Hwy\+rak0Z8ܕ_8y@Hi@~w_Sd/G u)M> Z zF,(gL-n7[bo *R23ܔd s%#\/:Pa69XQ ,'K/2RsVIҽ2dS8@.`RT^PVZƂ$=_fzlRp^`Ԭx7 :57k #I![Q>xŊw/ZF.HRj̕m YKxl$7җisBb݌1]q"V#oi^?1Z~'VqT]U*t;|o~,;4֬SP /0"7KL&&[;J~0# endstream endobj 85 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/home/biocbuild/bbs-3.20-bioc/tmpdir/Rtmpyr8nmo/Rbuild3d3f49675156c8/DNAcopy/vignettes/DNAcopy-010.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 102 0 R /BBox [0 0 792 648] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 103 0 R/F3 104 0 R>> /ExtGState << >>/ColorSpace << /sRGB 105 0 R >>>> /Length 19307 /Filter /FlateDecode >> stream x}I,MV\V-Hl HMI@B?"|]swsxN|۷o-jス>ۈ)ןۿ?WoBxo{!lQ-=Z{LDn. rBn{+8 3WK{%5Lewr>LI𞙼g}Q `@Q"^gg:B_z{!rDalɤ^®;u=>!k>D8 c{Whqf6ة{v\B|lɕC?va=trPpr Kpؑ ng;iɆ1ey75Ma1e\HS4P|OX135Ot>(v!g!EH͊"C3 s6]l=sCʉɤ]gPŔiyTchbLk6vT4 < :VTz¢*-T.C {b(_o~ķ]u[2FS͊MF:+ny밴ubpk[o:|޼uEo]Y~Gg?r]/W/rl/Rmt\kX殚uhQ걃6K~ͽ~ͽòfptA=>`3Q/^gW.Tcц0Vۺ{_֛ÿ&?S8*bNh5֑ig{W~i;OLMuw/?~?ozǷ?3qٗ-CtߖVwyǡ쇽Է/Ä!6/#e׶s\ԡmgǁ ϊҸ<$`\Yah0CNw~9X r6,NEL%S2SA"JĵdAE1x3j˖h"K\Bk9%wRj3/`%znjb# ]-sxHzAyRCyv7rjT}yӝ}D1J!Hߡw&T[sLK jF|NKe0ŷ9P tH;H )SBp}BQQ\3_FZPi9Zt X&ً@*7W,E;}e8ISzfBS  )S(}2,RaR5Rj{k,ۃF{gXOdwrT&ݽ3{Rnn).6csգ5s!.!)ڡ8>y" nuTV&bn!pͭ%r!xMl雽ho:zܺx{{Goߺ`æp<.kuc-]uYoKn/mWlb|MwvPzZl{rYvm;u5+ooͩK&wq̻lFw9]벫0bwS,W5[/5vvrgy/h K-2di,+IEqh^ڱ0&7,,Ca'1 jLQT94U34kTq2)/uR44"5#\)9Z~Mg%9JC|>`so-ʐUҡL}y048GM3/";RT-!F"2_ҩQLX14#}5=▗4/ 8XRp/}!j,R؝*}|֐a/ J9y>[ (.:K}6'QRdAWsM3Z3sěO+c>AuذYWtqKHǥnlƮYFߌ;ݟ|^E$鴐<R=D26u]$$cWqI" WgL $< ФAFʰ?󕱘l'=-0>k:!q3@jQc|&n\3ENإcEpt\\\-=;Ugisp;ySsĨszNgiDIGrYj m&{_ Mt^`Ps64ӓMu"=hǤsrġ^!: vs~d {s*!t].޾P!f{K̫.jy{rx~_5#h8בM|m[ڵPG]7XC4)Fk]A](u9,OqZGjs`mR6$\{g=v ʯٮ#A~A٠s&QۇiC9>e_*V_z(Q! b@jWMp7nuJ9XjqS@UTM)/9 jPbL<"\֢/L1Hݜf5W!@ 6y!/Vc[emxR8q6=_ z 4H 2 LQ2֐JZŰq.@j_vjK]lZ(ˬ l@eX$6EٜD헮ƒﻤCCziHqpjY5# Wިkca%& @3gwxr֒>Kc6ec-piU';Q92[jl^R Y7W2{Y5Ǿڢf/qazN<ѲScIfт"5] t$9a!љET]?ߏka=v u&z/^sa ; ~5M5)SFߝAݬt3J0t`vkL0H.0Ks&-x3Z 2_)v٘e_ ,^|4ŋ,@Y@J"UQkќ2{=U׵P^GJ9u-L?HIدR HR -+8+iWCZU!'!;>thy@9j#D@U셯&Q6oa xuK<[xGoo]~{{o_?`篅|ŷ_v8N]|xx- ]ܽ]6w(w٢ w(HI+Q(_M .wQo{?FA:h~ua<(ȓq ԇ\< - R(Hm$ nr.6p(W$+fHX]}@_!'ВNM,">2%D@:ӕ'H+ MfiAO뮰M4 0'&^4>'x"7DÙT}uHݏFe:Y? Mm<O:K!TGwUK|,M# Չdl EA 8(*WTilcMT7މtT n;Mw[) %RU̳PgӺNW^ FlHaՐ3ꜾT54VՖY ҡ;0ZHK&шtM߁mY&5Kۯ߹Pl#iS!W048Cw̼]-Xye -U8^<┅H XU=Y&40)Ow{J:cǬ3w_:yAj3}ߥ2ܞ [3y1tO?+к |4<4Xs}El]Y!TyN öepKsnjG!0X_q2 Ri(TӤjC^/3te젗T.@:.{ьwW5,5/Azk]X ]=0IG'L4۵TH:2h2VHU/ۯ0i򍜤#Σ<ҩ 1u8 f\ o`{NGKi{J 'tEg`~[j@RWKgT ަT kmcaG-:˃FtWb[oo]o{o3۔*WLq(pVh5dTh2wI7]]6w9lyD.. n]>hK~k.~~m7 ]!>r]Лt`}#wKnx_&˓}EYƽ`Bʇ"<|ɓM31]z gfc YYi =JVTp:iYTӲ Iht' .n*"Ɩ%J2~U uRXT1e˃: |l2M(:+ u: r$㓱 >-N43 L#nr[( 3yRkKѩ!d)QxWa9@R"3\)`Xe&#Dn+dz*,/dR´wɪ iY"aXV@bI6/fX twY+Sok QUnkO25SO ԫ @ӄׅ&SƖ%HybRI+@ "pf p%~&t2,x B[BH&X" RH[d a.%OImYT@dHU"%/&Xq\M꣱Ȥ^ªu#Ibovt4!7]p%ui#s+;5N~V{|2Q@IDޝ lRTmR],R)%T!B@mY#sp_&.Z!n'h\]2.P5yIg+Dn+aXD̆OfsO_#^ʐwȓGT2?$ )Qgb!ڃ *clWV_ӐN]gYdBIv< zSĬ7O_D ,ޜ*HL 8Xf^`kUoz>A*1%}dR)Y̐6=] >i CU d˝K}}R4)EqJ,sjvʽ55ے 弃5C׍wWoOu:$}|?JvŹ]RKK?QSW',Iby㭃p;꠴A{)GmnJj`ͽ>a{'YH )R{@݋H\uH_1.YN y4$AMHU1II GA/H~?#4 ##-l]$Onxɒs1Hhz)RS!2WU"={UW׀2F߷YcQߗx!m€Z0=tqOAZմ>UeMVZ.jg28́9gT"Ãu3iׅ@Bi%NTEqBZ/# AhU:F7iYJ B)Khϣ{p'- h@}M1Prb0RJƤ0d_pFW'fCZӕSRugTIAS!ʷ=RӬJgQ%KJz57+H\crSEC}Q=9TPfb;H4w{Բ !4A< m|P(HJd6Ei 5TؾiU19Vw~Ff/j(d'&xdW8]; &:]OvJ>C#E@kg I _2:ܠv3Hdg183S _LTb봘rӤmW';~_ ZE‘e6}_oTt ! e,3}j&.꼡@:}I Ȑx3씄yzz! + ]fef9jP0Yw~6S;&qN72X e~C/;RՓ ҮuQS7Yݹy^V" 8{ k@jqN_ZiHnY~7'n-nI-GN3-,/[9';{"AZ-hHI Յ^("K>HZdܹBZwB^(7vSM Cl.AOvxIvQo#$@wq95~?|(6sWuĥ\J_էL`3.hf MMńR(>sع_k$8/8;St|0WX1Fvqd|gR#0Зpc⽅@?}A:OJYIZ]}CR󰳽 )3}MxʍS} )bأү% \"~cYw/{`$s/?;թ7G([Ʀ.Bo+o]$.޻fsjy{r7zh>b] {߮=r<}ň@{˞ j]usAse]Ask K')wn\Yj2_$?\ϒ?k$ezjzk?Կ$ř ?G A^Ha9OXpI-Ah93[ zp %x9 -Om%>ωK`ԟK5hK81(-􍊎F$$լu %[Jv鞣I  ddF<<~JR̳QY67|:7τ<ZyeCj js{*o  4Z'~1)JKmGlݹ7fDAj+acn0Оz b@:^3:7faBnِa%]N.qAq.s#.shIe4 '1/:^t48|:Z 2eEf(]F gy*Fmnd3tV˾΍hH8a=gR4m FE-):b0gŞX܈4(řnN-si v">@HenDNr-9%xgcnP`j XQ4bw"2Ù NԓS΁sϨB~@x횾%g(H k ÓHJVUXΓX\?!әd?F"NyP2Odg^ ij"athW:I_fa t  ֹ1(Fk'ޏW@j .T/6'k[(uOa&^K+ {JDJ=1FmYy7,bKkS{}}emzwyiM63Mc~շ闿۴ouPOMkLGߦURfAo3rO?|=5c7=u\U& mPڶNK`mG]`}iiWvHGJԑ@H&EU7 זTH\h2دX(t$t+UٞVƀN-L}ɑy^ kؓ(`ݎ4Vq{ѐ)1*i ĠCooZ¸4k9qVAەc^ؾJ˻'0h`dڇә3}/_0mR(tB9wF:Gj8r~8ȃ V(c>IB $RAj'So4;Ia/CS]*Ð(_,C靛8!RbT9uI cFSjHm#COuPx=5 aUĵ\OXi"ޗ}FZs0Ӫi ^U*^GҩsMo|Zf )/2x'3p>;L'qPؗ쓐07ZL -zN% ewAZ#/p=l'ӱS;#".IiW';4fkP2H 좐aȮiD^5P̬R5HAZ|3hF1; pQڏ }lSCڬ؜}})uq:5vjY{v.i!!!)ÐK4کRrW AXd! #v~K7[|t$uQžYO p>CQ5El#ZS mYckFaQHKr!$wmp+EKGB ;s> S8-۩ATB<4etkجIS.({R?&vj4 -ԸxF2#*vj~ss"vf;5(+|A:C›l&.{tm;hoS+ Z{߾= 32ނhW.1]<]8w9e_o{ͺqǻuL _jgpgWx4~y"8[|:V-8ۓ1lԿq6lL(v!'+Qs3koC]OWM =lFr lg#f2˛)}Hؠf@:4=(gs :8*  @V@p$1&0ՇDbz,QY=YDi&Z @U{b[NH-HМ4qR5K;8h0 RI5Hμ=;RFop[P! Xʾ^4&5 E-QdRZܞ͍#Umil1 tI:cG/+|YW99-ITbtMnFŗAE r6 ʮm&@}E._ҩ6(w+T7ZNՋ|ϲR?^CՐ$^,2yBj0$F*[G\cijGkHƝPSl\lנ:elR[f:몂wCd>ٝ =3Xw k=صV)W撚FA@v(Ai5M 5XNB0y\`o2޲j4[qƩ rAjZTM5F~jrZґ_^kʙ'zF_^9{^X{s*@کw鷹&wF(x{rx>G Õۥk]ێkCɜ.', 7a7_7߸[7i_î{fYgh<7Z ܿѦܿo@~ҿmq7п#˅0PvxOPW0/qV<4yZ9AU/+0 g8QJEܖV:\pV&ҿs=9]%?J L*x $zx'|:K)bAQgyn[2bQX!xoJdPs< iNdNɋ•,#UD1 x b jjU2Ɩ6.@2CORSp[/_ 3(C`G=@VaֆdiYp !o/kSq1IMn+%xOTm9(NF N¾ʬ:i:mR#gJT 8 qJ'Zm "2" pXh)_p?E"sjrbѶ`P;xany[$[o: ޼u=n]C? ܮ|NnUkyXnQ:ZnͽC@wȲ;T;?:hsOutINۨV/ ;L|N75ѵ(O7ef2cyGkV/M -LI>ݸԊVH1/}3>]ѲOڏ|/Ƨ+:? Q/.Y *:k+3uϸiAwCk*5Seb< +*gͪSդ;#5W#:K*h\rV1;(V+*k+U87ӫK[giRs*N,-UYuQ85QH΃ StD2)dVR Ee%J-6G-=KY3p8SH82]mya{rJ2J PǤQ";!s`KR8nT27صº'-g Npֽ;7/)dYH?Ϙ\Nv27N^,(gl0x|r7u 1g616Dxŀ)gN&ךsv-JeZa^z{N]m7A۠e3Bˡ[]۷.nz[ϘF-jh7Ya`۠&i, 36铆HycUj$t8$ HHBYj$t8G`[ s"9U(ݛ9s+3.@W4@f'Z705nMՋYU0mWuUP>pJHvw*ۅA b@)BfATb;<d4vmUU2eC|lN&҄CT5`w 0 ҙcDcLTa˽YP%F(K'e~hrE7S)!b 3p-W*AI o59Cp0֒gfYMBs0s"pxTB)bQ<T%u:Qj$Iզn4*TuT uJL:cLJ->)Q[5~ jEo2vg,T(VZ.Ojb%W cզ|َԃ<@vd}*g7'⁻:u±IG{K­.k=K"[oo]^r{ -~a~o>o Txͦò6CcD +ZX.l]ТuqλŻǻu\x1-`?0;aYbx錝Fܦgz*U5z[CSXoL~gz=P3.,!`RkVs4I\'x#~>.,~J=Y':Y6e) \K"[t 4 HI6HMFXEW)YD}OTעI4 =D6P(K<{3{(+}D9MPFԢtԊ)Z)"Hgt*%hUuόp exrBS!!i:),jь>лy-0 -UL)Kt"_sfE"H%uKj,E 1z=L,D3EGUbv$霼 }S6]=cMvB IjBQ,qb;gE]/VO Ha@ϗ}~͡6A9팴"MpCTnR Y_/i).l7 n\ߺx{ͦ;[>lu.w/tl:tؒ_2T`f$(nyfyו˦+{f?ޭgl:#xզ_jj+aYx錕tJs}Ik<18{TY)$U#$'Mg|q%IJSFԗ[xS(?jA*WQaFF~bH5 BzU? + \R@ٵSHB,F5( 4ՠ1ZQDtZ0FCd}#?: 2Q3FUrFi#wMKCŗN}#z"?|XAxԥMy 5k(qx{Vˋz0U 3\W'XojL޽ȋ#bV qJP.c!hB,M$t]G _}sGf~r}#Tc$QAV +\Z8T0d~y(Н۬r)ēKFQLic=jpV5f*w;Q {Ưm3 ?w״ЌH3 ~tgty(JĚ /5e}Cpe Ѩ{]!c$mϩi=1cJ_0MUiYG,\uQTbQ /7E8C)m֝aPlhUp-,^3LR5Ӱt/h< m mYgOZ_C=橏Ca 'ڏ8/ '<HE Z ʟ 4[2`A;_<ՔPCw39QǘΙ{֬!4/bGF_3#װ1@@hjPU+U- 8]CL-룜,9\##zڌeRsR5 Q]؝m@Qwj3dIGX/$Mzg))ؠpB\t^_\2|bL1 d=5;4|Fqy) p6-صF8J5ӄ͍:Ι#Hޙ,h9TT2ZZ̐ l KZf82YoӀ: t.G{њ]uC޺X[*,з.Ai7}Ok򂺏>6 vm~Zd]{c0.'T⦂wLr`L]T.px.1 ;US.T𫩩pF`48FT0_j*pMYgL'WCS+E؀+\_ŭǢH6HL+țFS:ީW'WATZ˹73?ɤ}hX pubD:EPNKΚIR]91P#vӄw K&bu9=! P脯*}N'Ә  |PFf@&ĹRY. hb 8t ` X Tk:^ B(~k0,*B G(|@b$䫐\~2~!\HW0M bXd &DCa)xO4zgITNSrNےluwЇpGry|>"0r !@"$r׼4)Rxȉ5hZs<"N*`k-IVX춂)i 8@q15 1d0 8C-yzdeG%&\vrG\>68Nd+@6 d b8q6:7qe9D@[# QW,Q]xX哑G)ta,^|B L%;-bB{lS]gPl@tT8_!~2a(xO`ȁΰF2 g%ӵUe$.NV/줼5Ҵ\] ew QN{g-I Ӏ1Λ -wConv0oV7o탰š[$Gkn=䷙ڀitOPk&O`4"u7zd/n;rf?P{~(G qxcy`͛~r uxsD>:XsЗGkn3:v ak~_@%Z=kB*٬%m'G}I+U5밇Vqj=\U{x /EXWB,'1@?\Usܶ##Nۯ(JUiU4aqޞR ph#>6 )~10֞',CƸ`ql$o @kPnN\[6Ԧ)ʑi CDve l)~ˤGijp須3fO_ ;rd&oCon9st%vr.^IWN΂ɞ_%ꇛclcEَ?ǟu؎?[uضǟu؎:z|3d?uwI6~9čwH<i ?<=||=w| ǩ fӧ*6l^= fE@,cRj Y6\)Im 0,? )U ץ #()VdHIo. adX2 0My"N3xW%ʤ@O{D@> ԖuRl-! !(EXq2 SbsRl9tVD6!?CRY㈯3q!%ڤ& *D+#D DpC"riL10 vSs 4Vi>)ȇpHleJl, ه9Gw1C H)2FYAB5PJaY| 6-R1'lI"GV~g6^ugЪF r1i7@At#}7Kۦ?t,`mnʛ[qù5c۔oCR"poJy{XYr6crS[ۭæ[C7RѦYۭæ?Sz!:կdA;pݡ%\O?FAo7(_9Hc9k0>7m? DBN~k0]p 9 5GgJMR pc6"c& endstream endobj 107 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 111 0 obj << /Length 1597 /Filter /FlateDecode >> stream xڥWKs8 W(ԬD[浝8vld)#M~#Lgv/6 |AM?|Q",ӨGi(+FuicD2GAԆ$z7+quUmHj /mY9*Y6 i,V xcD6-Y]]q<[_@w;[/pDfHB5DJ$1Ww~4 :0cn<Q%~]gXMM)W"ѯH"N=NbBũDDLa4(9A̓iM=7ݐV8!zn#+ep' .f5Ǖ g6-#;ck:^\n˩W,-nVgA0mǢkd0tHY03J=O/׷¸ySh<%Ll&3mIZ`/ -JD>@Sm`L~gf}ٺ5rʻ\"犉•1/c5w3Luw)4SDՋnAGIE83,%=x*vnMQ,Eo.2c.5ok֫T״/ 6sGCDczc鞪 V XOx-mb嘰2[?5DJz+mq3"Md $_T!ac!Jױ$,L  1k%P@I=cRanYp?Fe.[^7d~U2{o~1f(כDv.z[f]>ܜ( 6: rR*m*!SHGA݇2 endstream endobj 129 0 obj << /Length1 1441 /Length2 6590 /Length3 0 /Length 7574 /Filter /FlateDecode >> stream xڍwT6 "ED:COBW 5@P^HS( "ERJT_,{}]+gfyf7\췍0u$+KU ` ," LXz #PAàXN"KC$`0,7B}N@=!6T(4%ǑTPPuyvtzp!xd]X4+!.@_8h>0'ϒPO؟҄\@W8a@C`p.'h 4@?A@p/g#E.@g h+ @@PWP!O}G4a?k ;f5 b?Sasi;[r#"^0-? o KJHa^@+&(/#WCp :ʀÝa hoXp)  tGǩaοe\p?G?0'$_-h)_Fee0PPD((,B@ "qnC_-33|qw>HgBx Q7ӭb`G_.?23Re POX!qÀo9ޞmBq㠄pQZ"*c~0po֛88vbp^`pS莻F08n6A1jO框pD:>a1q pIb@nL`~  !X Ws0l$S[ %A @_5K4h\o׍SHG{n~T+1 mg.%-&L+;QXj5~fUQ*'K|6h4+n:˜ug5_U|fq׎Y8Iײz{G@/I|kp(ֿӨrx7#rzD [If?jA-"BϨ4jGRly zd]{ګ*@P7UdzSYxTh,hA+ ȕZxpr0/v}zޤc?r7klQ͚ kvbZXO5_ W]x!녽|I:[%Ihl4fF6S/j`۶JyinkBxL9*~tK+|,M,EӵPbG)*\D6LEvzڷp`Bq}ؗ?{sf+cfĿ(t:1g03ihmhi&~YK@ȏKG3-jq;ǏlShh3(aG8tPtRn-:*W[.M 16 E^ =+zz:CVO} f@L8X'egVM7"D3d0뮜tcK7ibCeBu/ꂜ< FXknEͯsɗE+ƈE3f.ݔ]F Ԓ<"3VmHavOVQG l[݊',Sa4^췌VHQgRK٣wPR%w7 ju-9'WY#7Un oETh3[ nd`=&ggrFX 9gԄҤp⛵rfףj^VIрZ{<kަv7@mxP n0H~X̝+ :S?<1ӽ7pS_rXp=A1-z+E>2Uݐ\ coRm`\M p2LllMHOivPۊ>)y@J xv±_ 2fc"CRIy%+-/ Ml}]#dx8GwȄV'bsɮxju*5&1+u@+*=573\Hd(¤&L|T\'( tto)}'hKRi&W0%2i2ҶjUp1!bSpB#Lꙙ?>rR^]Q+;=^1^4@X ix=k!k5/OknŎ7N޸J1Q[EŸpdUƻ=OYu8 ! j's>g)PtO%D|>BϑVY 7}=Q2m!rcaX.>(feP a8cHO jM橡͟/YQ=vo{ђכ^B3nVqήHwZ:iH8`dV ʝrbdsIO/9N2˙!#I *O&ϯ~z>HC%Nթ44go& "ǿwaS.q&{ʫӉ+9QnH~xHx^8iqfͲ5-2 VSed{5P]\ ^/]$(}\Ծ8} ut kWFvmD;l TzusG[\* D*S#'itxeU ⚲sCT;~6*)eԔdT3l*F& RkpHnU-Q5Eh[v]W,â)_[=4[7.Su{90GySݘfEZdL?=oI~=J$W=\5BY%8yvmMEWyeՏl/qpKP?TbkZ*H1h WFU訯uY]|#-!<b%:F&ϜVGR=|KXR:5fIX q&VpjiHƐeU[2W>ޭnT˹Ca2Sz8(" dyI1M5XYcfq$b|^*JMw 7oN͑<9[N`=D~M\#~db#BӮH[U56 !]-tWÊz]uf/ed-/Gt>o'oBw?eVzWXQ΂`$Vձn]UP1zʱ~k6?IѸ$Hr_Ӛ6X eTAU7t0mۦ(h+NRu}]DxMY&kZzqxYt =ꦎ[r⌽DDXÒ'kIJǩ9-WKYe( 5>ݽ I%aFqGrƸ,U\"mx *&ZXiƾCgLXhɑpwc^WSdir~ŭ=Dqڭ]&SWHD)?&_znJacqh7%IH{_VT^$%2[=WM 4jw+!zKe@Y BBڹ&(~%EUŗ>#;ӐÇFr?Խ!:>mwv? e!>Ж+u'ҝ,0'ij"Q+^F}~r9> 4W[l8fW4)J[2w+rPvpCMlM?Q`~Dw"= *"-,D#ƒt=xPgkѨ-4iy ㍂5( , X`䊡}oe狡c#\SSƏu-|a/z'?R Xlr37酻ϽŞ(ƐQzr؊>ޗ~+\6t »b`ER^D,aXZI6SFb_.FA:N?p8~]5!-/TNi[ {}_#Hfӯ# ]Kx=F=0gy\³b?TiObLM>Yx)uU,?I{U|V2bAckT` ~0)p P+ Wnc_8H+<1H_ECc wjEl} K97(uVU  ؈^3"Oi]p|h))A^>+DC}HfGBUԞ=8Y욈IMyg (`O^Jm`fr[}@%Toqh些j}/{NAhج%TK 1>\&eԺjZ+%.fRqB]{B4qTig5Vo GH\W:;jy TyfvD|lapH kEwNe.VneN^7m.{~%Zox 7Sg(lM12/5׫Qd8_ikIecfѓg ] `^a[=b:ۜNEv$lhz͉M7hkgcx2( e){?pm[ќN= > stream xڍtT6-! 0t%H3 Cw#!"]  ҡt %HJċq}5kg?{~ae3wہU0$/O@m ⲲAP_awyӆPPI $E#$J /@=pYn3-ow+ 3D{`!DI{{{\='N7 0{^`: WpYF?! BwbyyxCu-{7 z v]@0_ *Z|H$sEA=w / #P [=@+-+ᮮ`W~J}t1 qo {ՕR `N`$@D@@@LBv}7u6wwE!?\Dx;\ GN`?# > ;~^Y&&To+,Ln0z 4:5+c;ҁߩ -D>ov)W;!O(0\!P߿;z"@~7 6Vu$naN_#CvЃ nkʠXxZ_Ѳ|txI |79!89'eH I*7_|z1HУʜx`_a3CbڿdgƧI!MjAk``!YK)o A0U7đ k6[[NM]IL9o4s_{yç@RnYZ'o E¼d3 Z)XϜW&(R?%5pX@\uvO$? i7UmέgTBʶQYO $KՂ'++}RVDf~vOWZ\HT7'3nև)GvI:lz`M78QH,IAH^n|˳N;]#/F׆DBSm/y*ԕXKf5ffJ:ބȑ?9i{΁r?Sytf &?nh Q:W?C+-KR"d6ՐGK9coc{dMv0} Qg*&JuYˑdHl|XaYD:C63T%%8#Wyc>W4/b լSiӣZ(5/WK9#aoaJO&f0 R.`!b'Z' ÜUB@Vua%2tmONMҤ"PvfRIKaP} ח6 o6t=P<;Vyub&Kʭ7odle2l1-[}tGj(sRMMOƊ(ujS_J {zV%7u-l[}EֳaG-DP[B;L@eڔy' IzZј&߂&~v OEstQ&ϪDXX?._7R,[QnO{4Y42yr5Ǘ)fp ݋֮ʏd_|Wt.le՝?zn(`QH g2|ET"(`"losU$S>cOYnQrֹ_%<kyOaB_1i|wk0,t]c}uib^WAR*Ig`$<tIb|YTsG0&8(3.# 54;`6 3Skڛ!k? r i|3W GTͯ-]_߾W !V\bАc̘($*~3LX0웇P~)7 &o$/ЬЋ^A/oh9KJG&1DGFz'^O<)n7s`TOIPj3T#ڒkԏxM i+ =WZoqu6w[HbNhLA`8>q.n2E\}NgTSCˇrL*˗*Fv?'>r@s*7+&3&?[~ ) ^I4R<z8<͂%c߫,V,9EGe[RX*&aKq Fk$Jko >e Zl}}vtnd=P TpCEı˥PW+B;iZYD=++rYyq{:`jJgZEnLFWRbn>Tf+֋"U dĴy6 Mg_B8CHF |G{LG2R<~u|>aDS}TĦ@ὉgKzߓ9&+f gn^9tQə3e|',dF3JEeALeNDqPK,xؗR_Kn^wEM|p+ }$ݣtj"mV.V2!އQ`LBB-gz; Ѩ춫;9 I>޴9,tlP? A}ZȞ] ۢu&ݗy$M;T_VYwШpU,@$lZNlmË YK6Ȝڱ@d]t욹[jfhĝ͘E]+kMųˠ .#Yn3,8źZ`9k'A:?BO,el`Zxr?סT_?~e=|V {Tl\C쵲~P8%*Nst3_Bl~X~Ej';ͨOaglng~Cl܁wzh"MK#q#!~@SPV%_W;nǡ^?2p6 ~Ue&ZоLGw>B1SMfGS:y2>[W15 Yy+LmNablUI tW s<Q' ~Nj^~ ±W5KWX]{s 7A1fz~wN>d<HTUPI +QRKW*NH=UWKǩiYV5qMYdvi5<~=͕4e?]#g ئm+҆UM?jbR[*F8T/l 5!7#{x`s[oսZE`j2b|!w"M%IJ3[@}:W&mQ-9Ua8g[ԻC{TN$א5.rI}^ WP$5l^iyoc#RI45P$TK 2H =y}$Tv-nhF[   О1^ςMܯ#)jz 윟U˨\6oL0 09,};:zx&}ruϬ V4!X3{"g (- 3 Cč/HgZ>9"E/@kQ>JaB)'4A{,Я]`Ճ A泐!372U]]0YK-Y܋7$N5,ۆUu{9C5 [̖=  E$4G%rդBT)۲*c4מ3#nXfW~@/{WT3*;j{ޛ`xdj|xuZhU`212˨ֺv?]ftapFWAm3. yvEgPLCkoȥVR %͔ڂMQ9( #03y[(]{vuhur zUɸ^ǧB,@x3ۺmsV/W{. 3=q;E}&s.ivy*Q[IVȮy*nIk.^Uɘ?s#-YwfPGV)?+$4zHYh{YŕT#圜w\(:&8~рo;ڋ=ו}pCy`{@)J^xdJmeVjUOլ{? x7 +OjJ2nXN,teݨVr3cMR"{1eBaKfD!kFwƈNN%/RDy+xH9Wރ*; KXLzb~L 2,=bYvO}nG^䋡Αq@DB;>0%Oix#ɻ,ksɡo]YpM/uͺ=s4{?mA/c-b؎(uxScim@@ā.|YCo^:,s?A5Tּ(.qL7]7^Q2ۺ2ی½ŏ>7X[^=J!L1{KD. 'ao higJht'ɣKƊ#h\-h}N²:^ fMnqk?+II)>T%墽/cW2D^kw_x XBqcQy(OnٗwJ3}6ĥ1o(F6gF_M2O66+qFǦfl9':,^FfDO) }Bf?9Vp0Q՚FAZxٚܽ9Ņ9kr}30񋬼M9NiSg5۠]%ɀg?" -UDQm9R^=/JI Œeo<gJ6o P9F}}f=NG'd9!z}==G_Nʇ)dj_~l:AرIE9qo!(/}$;/\QlD /\1qz 2fn{scU6B%&˧=!87 QJ}otQuhoiXJpGK{ȟ-h*5[_- w۔"mC\?bK[/~">О.mvXPQY`=_|۫W#Hayi}VH`-7Lk4\'uy 0x0d|GODN#5mWjuۘc$G$2kf4h2/E(RoSbG0ҩ-3^ hDBMP'ORY䃜'hlJ>aˀ$ G9n)q;Ǘ͉ \hИ:Ãkf'F1Y!dU[ &_IC7b方T*khuDR'7KdТj6L^\y5-ӂ[́2UUDob11AIEZV)2(-1tk0:Fhŵ銭Lۓ.m#dǮXb{)x𻕗*uBQF:DOc|'ۉxfĎ|<\~6\kyp*=-2ي0g:d>W O/9L$* 1a|]ҁ7άjo01>qfX2x|G,WN'2Q&cXN:)YKp]j≬kI]Mt>fե4Ni9)ktr'fᑄXUWXipUwjQ|â)/Ķ1vEFn `cm+HA_oi$|,4c!G#h3jfPw~+ĤdBJӸU9zBV%̛#6q.~w s K 1xlU&$MGU`ٽ7x endstream endobj 133 0 obj << /Length1 1373 /Length2 6093 /Length3 0 /Length 7034 /Filter /FlateDecode >> stream xڍtT/]%Ȁ9H#) 00--J#tJK(ߨ9{Ͻkݻf<~mp/( P >"bc3?Z"6c0 $]:E ݡ#PT(&)(#! Py@Zu8 $bSz# (t\p Z #]m!`?Rp>vD\%<==A.H~8 /r胑`k\6{0~"6#GmGy`Z؂aHt;k 4:`g?;ѿA`ApWsC`&? ~9H8:@A6hߍrzzC" ($?54KV)]\0W} {|!0;_#ع  n`5ſ=*(vl~%7v6Vu#!`/`mD ( #OvlGFo dƖ *&yy(OHD̢ ݅b`pğfѷ=>36X0?7E0C,w?Po+/a@xuGG3߮OU Bs@%B/.e*Fp$׃ *[gD &?K*lv%$" ! o"ђ708 @#~SX ~~):(Ool4~ſߜDp[Pֳj9OQ)ͧ\|6 R4+>+q.0_~kÏhNkJҟl!8N7\m/!#ߵq3vf:[8nՙgWmopVƝI8XiW63tx(>&n/)ʗcIC6 nslj!v~ZIr `SĮ4&$ |R_R)dI@jHz&j3ڐR[iuӃr+Q^ujяza~(It)i/9K:*J(9镤+;xz$LiR8΀ہFmCRn|qnV.CǤ1K 2/tx;\<+1R]0sߕD55bM;EJp@*δ;3Ŧn(rD>IE7,(sA%V=0!J%a8.aS>h;Y&`=uʚK#H|!PSynf/1T4Shn^B!KIi!! 5J-#Q(ͼNqE3Ɠ#GZHLwW$wC>4l(B~ב:S6!U/~5&, YOlj hy̥U1 N\Id:v@ SQ/]tCG2uk@uѝ,$ ?c}Q0@u=44mg z{ I.DmX6WD(LkEhni(9}d{az 1,Ũe(ǻ3e,3&—$O^u'5oU;ЫM-([t` ?Rl}1Đ7N.ĩ2t7?ER=zYbf6]pD`@g31,ܹRo>3kMonFJy_^t.~X] |N"K#вMd Cb.ך"&z B##]],P A1±V^aV36~jzwQu0<~՚ζoULby[p#i:m:w \!ܾ-onVIz6(JhqSnuߧpk#Eq",_U@i CF)(؁XkaD5lPB- ^K=&j2}EHLjq2٩Y 13̾< fGSiU[x"5O-ݎ7u>1^E.)a&'ѩ' J:^DN.E\&mدg#bCbv^~v& -ޔ*,lc@+nNG)d_LQ0:}_U-!8]0ˎqksm1m 6. Ǒ$2Z{ګvZG7Ym&Ќw#0Gf}P${Ǖ])fDDzGbez"uO>sl"ɑÌxG^IĺO4Z >A[0OT_q"2Wng]ŸխTw ΧRټos`bA=swǴ-Wer{*RP)N{^Ou/|fYڏzΜ~4N NA)lV#xbg&G=We\[i3SSM/:Xа*s|^4OA#~kR2Vq`L׬=GY¨Eg dw%nMz.+1T SFv7rTr]LRSux·{pD+6:5YE#05.h߸=0п# lD)cZ͓_g)'IXg6}ܕM))=fL#C~}wiZ'I*屨{lּ.嵐]-u$#] pdi+t}%-ޮJ=ƭ? _(UwR&x@fTf֏;;Om-(a C䛨LQO'_y}#kjɔB̞UlU$uw:yx4tJlRB7Z+&2Y'cdy䴧}+ݔfmycj'DUzkɟX ܝ=XE-*b7x2G>[<9ЬOgș}u^=?XecYʀߨS0z@\)"Jҙ/~nwY1z:|wZpaťM*)j/b-HΫIƹ A’C _?cG>o\}ѭ$JrxdU=_!;YH}U, - o'PWoܳ L|] :Ut&UZl¥RFQ'iSW%bgGO i,CG_ޱwȓRi[J)`\R!zB+l[4Ct?4wSK5uƾ>VkS#9c^z`J"BNu0Y,e,5v;4fc>ج]™kXp8Hx>:4"9 P6!K@Hf./+w52:' 8G'0c@|#bySb?C(sv,l_}cu (g&1y6Qyt+z4TtHHVaGR#ikTʻe;m2 h v2\pI_c!@ڻ˛xԑm Pܽwyn@.=| joKLy[0c-lrF2[f1*1^5$WlyNvGZm A>Nh$!JRt6ܴѵ)cԄC]7ĔgWGScmVKZeWІI3/}FUTּXkꋪO%y~@5drjoSXz_yecvФ%^Fw ΂4:[Ay~Q5ewWHG)]3YgwIR!&y:gB;!]| +V\8t\GuX mz}mNv-N?(mۇS3o ;z?lt `VɊen" eԭ$ca~f6Us< /Gl#ڿhD;M2slFp^b*U yµR69 }$ܓlF_7(u"R%k9y:t5׼I bKc`UGܾ̃#-EKqiDr&"ViJ|Yςc9(C"U)7ݣ6%{5!9i!E͘0o"ؒ]3{Vp_} v Jv|'n`#uAAUcmͰw!}> _!1+m%O=XX%cpW/QjpAeRQ}zsJrKCy3PE5,('v\W`68cZ >,.hAQ Pgt}h=,J\"a.hR;LRXk:2#[\eCQiV[ٶ--dÛwQ+Bƒߕ^ȩԼUq)ey`ɖwڑ-^l7f@7-lHW0p+ YMyGQym!FF 2JcX>c3V<,oΦ jc-v/enHy.Qiʎ8UP*!ᅀfOnux\'x>|\vLgEO~ ͙T' CMk?n&_~5*^o5$ʽa]-M'}6qx,ez4rtxglޗt͛=!pk1!Z%xu@.;R Ϳ9sp Lo1;8!Z#xnÛxectk->g)6pzE ~F u`2٬ojrVS8tl-\5\KF PÑ4AM7=G6}S[C]IT"2VմV.^ۡ9 xW_-]` =1AD3M&ī^?-~){?g>cAM]Q?a|&_5jzhg4D\%&J=^Dt[)þN>ET mM$m}'݅{M0}C4C$M'{@͖L BN5S7R*9?ziZr. 8$x7{HH=5=ۊs]và)~YN8?S7 -) ʩb ?I#C>u"Љ*m9[OQE >OwmX3z`Ќ%}]nk;1Eq*- IuF%Jz{rAdEګgJ. Җ`^]e|lw3`(=y'Ǎ!գg'8Ы|[qM` e#&"VUp[&(D$_a1vy$ê endstream endobj 135 0 obj << /Length1 1379 /Length2 5902 /Length3 0 /Length 6848 /Filter /FlateDecode >> stream xڍxTT6"̀t "90 % H()] JZ߷f=繮=6;1#Re]cK! M(o;> EGm*(4PhyB"!1)!q)  J DxHT콠]F+#}=N(to\ n8p tQ`7tE= `A(qFܥݐ'9n>7 0#^`Gzn? Lȿ @`PDxtu@ gsBBJ'W"(w=psBN|P|{/= @{Cahj{C<( 54mV;*#pW*P0ツ@᎐_c8z ¡<*0hmN`@()&&*?}@΂ ;3#@(G{(Op:8BA( wv k> ;k4p῏XPLr*)!|’~I1 @HHH .. g{>#VA$jO\ g.=`׿( /BgWݑ' ۻAahz*Eo9/nD٣ՠwB3__v(R v4@//p AGC ~ 5Ϻp؄EFDBhU:}~ (G!nP'Ahߚ} 9H:exe"71յ$hQ3glGJv54#O *"y/} Y(@ao(};}frD9M? =J6d$¶L5z @r(='aɠG+wa>da[C [>$I 44|MPꈣa5܁"'Eڽb5~Z,#)ɹZ-H %s$VH,;3EEyT++Ŧb4t-ԝA_X`.5>1_Iӱhb鱸yZe ?n}1u`;dIMn=Gjƣ*מGtr''cR~ 0ɚh&B\hB:owR*B1xR3Vt`[*$w {ݶIr8Ƴ.zlWǩmKV9[)PadK^a${׭ ņ 磌2_Ovroh4]c; K Eە? PƘZ tyBϾY]H qn;r^HI@F̹!)Q!MmBU~)Tx. i߄k/QY=i%mRw?>e@^ 5* Ue [_EDw-kG*m8іWN#[I,gG, Tun7lִU 4}i)v9;ðһN%|qQ)=5 ,Kf+?ۇ) OS{ҘreGlUu=d֜M=etpH9};PhF/j$ӕ*RԼ4l^&/us]|Ob 765lkW!",k; $NX}_`ja/TL%Y1Lz><7lZ+ְ'3.E4O-l P'NU(K9I1 iFs7Vg>OE W'(J1{N~z 񏚴!Uq~&Y䟕>;xz`1) T>]Y|1B$ZFv}W}YU s0'+ԟ]1e=²Zbٿj_؞yxj3ĚTقl#nÝb/؞spqa*ӘP:q;8_Q$KLIt eWX?1uQAn-3=50P0!Jtd?Zh8_IWq̎Vsh_+ Tm9>m_m}-?Gyp*f:%ԏ-1mL2`_yD!vFAv+/iUF4 Յ@(wR(ܺC<+{hC7v}ƘXH66︇:T-l8rV~ok&x+!H`Mm$5]_xib:6GG]|̯yAcJ rn+4pn9r''+PCĎ-(ɹ,".\̛,_-l+6d6,p-N/1o_ač3o+~j /#HM\b&;}T\ԗJxr+Ew`o^朑juΎ\4Pn;bU $('<-ȷn*TNzUǵf6e5V& 7[(=Yy$BPMӛ^yD'yoZAx@[-րͱtZOעޮ.*nD5n 0LB|E1m5GeNôɧG ۳oI~$Zy%H=?3vd܀ĬBK9Ka>K^_z5s`*:GDB. ሳNNIU0%Q\xH轧Q_ ʕrl?9LFCmG z.=s/*^1c=w)j#b0_*aQRP񜯳)GMOHvFE(ܵXLVo03m7A3望ɡVQ~=#tHٺ!NccIբv$Y'<۵Ģ"%jN3 󔲶7s˫:8!f^}2u 7)8iPݝS9 <ˬ?HT=;Bg}x@`aѴr]jcYiPY7[<#8[8}1F\ OA znO?<`y20"2:m}'Εz6e'}nIyg@&J/&UQ:Z8ٸOˌEx]h<NV,G9M`25Hx暣e(@fuEAJ4QMpLc_N}LN;mfaMRƣۙrDc]"rZ~*z:,X%xt \"c/1Oc46zU. :(P>Y]"`4[rCY߫>AZ jI^)cg(~; 3}j9+aRV3G]jSض?fIS{pi'sIvㄸlXAG'r䡺ydlr ~s=ēv]ڨc_')c0dr W} [JUճOTWPSKN ٮ^R} ϕuTqXTe2bj0eK+;>_˼=I['DrSFJG @29/֕fscpȵe&-⮟j)iێNhvByFd2} /^ME铧j_M/ X_iGFVuL[vU\xPGzlFi'W\7d\Iq0_f)>+NiH5xf ڴJcп;lr*Z 3:y\ߩm+jB{p յ 5ZbkF+PLClݑHew*4q.q(R`u=aWH)SK\$/dkm,H{?WwfED~>1B94sRImuJ)wb, 4 XLw[TX֛/Rd,bܽIm|󕭍qPzlC؉W/q6__zxvP0ĠVh!Bc{Ik;_:gnfizo9r|Uq|V+5V1S:{mÙp -LՔ^ABzmeZL@`H(qHEo5iIKukFSdh߭O}&qʢN8}$lQO8cP\KXXi˅U 2Qrc=no9jNLF$đ΋%f$efo;NKjA9żO6,^*th3Ҿp9)x[CJͲFzv }a!V35],|ˋIpý[V9~)l`eYѧFv\ I}序7宒k|>l3]JWCzq, ^cIl?P(߱{ss!Fg̠ NJexގ6/hg[箄I{}n1Gy+9M&w߼a8Igj>Tfd7ݣUEGHz&w8e|񹏝1{[hreu%+p'~*8EoYk-h×tgu0s@--Jcvrmz[T|`3iRY]j97hc4TܐPTVnCga7_}oҪ,9W/,L'Yd5_=SkŦ _fZ#x^7$~5˚0M}dv[0U;zQyAշ̧Cc[޳?|-ӎwg\(\#mbf+i'0C/t7G1mvRa4ud'y3"\V{\,Tnƾ CFo}f0¸"k d#*j{oVUK5M,KR|3);"мYO0> stream xlspf6ۘ8db۾c۶m۶mۙsyWkZ&':ۙ013rńՙ,p"&N@_N&5cGڹ;X;Z[X8T@ #s33??A&&'s @D^ACRN@%. nbk`` Pp60X:PL,F@[car7[:m*Bbr*Q1@Fp['GM U-%k W_$z8&&_IښQ;@P!5ogkk9 46qnN&&m`ca<$ Cpp31VprS^?D'}5Zt r5i m5[ؚa6+Xe ,Zj=#_/aa'33ba/F&NZgv21q31[_YU@Ya]B27;½WsE 7ۻܕo&15A39EZLZaSV{ cc$q~甾s53FʾU)Je'nmVZ-C 䀦e*6n><njfB94vZ]^ bmaM=X"sS1:3RmDJa$3$Z0sGB˧ce J ([yeGv"EQ X/6zgKQC[ⲍu ꔼR"IMF1~rm)`򗻯͸M^:,'o_S-QJ]^526koY Cype\c/֞?gLՌ]?XBS{^e*okr-MS'XQ6O)g7oSfMgQc2!δb݌/By) 7pcc8;>5(cRTtR9YF%!z 36Qơtgl:mcoѫ p{::SJS$Vw{c7;\aSsI^D&y4Z "2K?u4A}wa"(9.;r˔_R"Q>ҜX#g)M/clu+ޙAEX9#nt8& وOO M+D~`uLdQ09 }; H mb(e3kms_oZ.?i,P& )QH/}YZzDn"mᩦ(]6v^BndĶK𳉠(?-P1'oIXktZdwE&‡ã@yx8無7xT%\kH$uf%F!`$[M̰iOSxVJ|}<\K';[00d31t4$FZy\_8NUiڲ)V&Bgpߔ1CgWH˙dIW8$!8;;?{M7hz达)Y cjP|G7`jX_dcsރN|;y;yi*tgޣNY0jV#!Tefb`_fnAJb/~ɌqMhjt'~vv)C*7OەڥbM)~YrѲ_ƽbP _iemp'm&.S5c~A,Fg @Wo_=%kE6 k`t‰ݤ_:J19D[40~a"::"8d>Y@< sj4BW~Vp[5Ys څ[Q FXq2dvӫ0߷aUhH?jb,(/Kv_26sjGUG!i$Y&{;cz_-MrCHoCA-HU7h>o+0<ߨOBeR)v׋cWZkIw6=M1\1j3R;caxɋ8^cx1w|UQx=SZVy8M(cg9{BǙ vn$ '՟ 3|;.zEY j nDUlK{`%LnеU@zFȈY0y}7mLoo@_VG# z.LYEmKUˍQLEn׏=*SUz/I P5pW+A¼@ ,q{ E( S9rgfԁ˅yP d[}nh K/fz!kȵ'xVTaj݅.: Y( r;\ϽFhKB#UMOYs8y/R$5NF{EQpjT[wG;faṳ?d%eJ@Nޢi{ȃLn&S ({ax*v׹V={d&R)X}${;U 1zy҃]Au=(ds;/R)w_Ƅ<7;HUɨ挀w F|X!Pԟ5[2*Ե{VCXޔҾPy׌9'=gs+RӮzҗֺBLv3T vgʗq˼sGL7\V"D"KFeedN2zbMش؛[->j̟1vc3jN`uv;A!=- ۤ_j\7Ҁ,a8f-HK8n'󾭹[4$M$X$"ݗ 7--s[;5_I`3Zk2+.ѳZwZ*G7>0ag.ulRjDlGd vM/}C˖2 Fus{>>j\}Ckȝ**a5x-)ݺ(`ߎl3s_/>*rb o͌/s^#=m{)2w ŐȟNU7Y $sT{Ut_ .}a=|$:e*Qf4 tuPd# õ׶WW}$Q(sU`PxHΏ4 |{lAI(7&@hÎCB9mA^'@r.n,:8ÔJ43;GBzsw yj3&V}0%4Va_178&*w٭{Q.Mebnɔرjl N}eR[mҚ"X4`a>՜ iY&Uy+zŽbB5sW2*Qɤ*M[YfA55hD K9eҢ|3P1͂hf ,۲Ch׿ǔ6hut$PM&RMIv}l+3 Z>w9W!6ۼsh;GACi81}U@aIxܤz(^p+ f!aҐOi*ڞu+"ryTXyݘcW4@7@"/>mF%r/CÈlzuФ7Se*Ds"(Ӝǂ'_H"jȯ&Yw D$a;2 <+B7"}+Q9fȏ;m> 31F] 6 0n_ g e]|luog60TB#GtewMd B7oxx@og&cDО!QSIh" !s T91 Q *.ZtclMkc=YsVO24샔z'ؗOopRsVgQt:ЏB|م%}ng9~yAxE#K/$ZxH^,c; B5Rff; J]@_ )[z 3^D7!Uhnx"zӚ3#Fy'~!U4i\@˕9 "ՉFxjN2XoUoCI(8ybXh?ʟ7Z\8[Vg7sU2s9(nAP$B{ftCS&~2ȵD(GH9T}2%hY`:pꈜaq/ *5bؔFѬ _8;7쎚PK.V ڄ% %%$b $46@Q׏Jڜ/J NKmTBE\(SX5EVYI7FW[XNItRJOn(kfOZ?>!ǗSAb_bkoX F~+CVwt<'K\[L\SfV& +̖1^(ddɤd(twO3!]u]kg8QD {sUF苈20H.pvJf#8tN_N{.e;J):yZq +Θ=bkHԺOX݃#fU2Ÿo+7:sA< ߌvPenXHqG$E>_9}$ؽPVV 0: o=́Qy\,OZ H1=B\G}qL!'&nh=p,8Wd}Ql&T OL6!:bhn?J뒤qWC@0=qcPf^1~>^y"AZ< (_fyぽ?X% [s#I |V(._.k^bMH&z)FE}? 1[+aj^1ZRi/[-C$VSFg:. Dp TpN|t1类6 w%ޥG>fSǙ8<#N \V(kP R{[LQ}[X޺{!7{;<6b>.F[Edh@ !rc8 (CT>5ej"Ӵ.; q`e:]|+Z@ݴPF:pU A "8$F zd&Zz3 F8Mn6:ꯀ??fAO46U"8FH3!調NE^0$0$=b;v@ˆE+ k%_Cz='NW9Uqz{H-#ۜkG-݈!CKHumX0L[1ݫ{ȏsw" qyA_G[МlL֯mRzT> ^=tŵ̉䢭1Td4z ^w UȋuCG4!ګ :Y_L&RYYܢR£jdVN(!Xϵ]2mZ0OhНV|We f Xu*DYnߘY '4dh=Y a#jqD9 _M~70 qLS'k2#Ur~.eiЛ:dg1BX_Nx+ĒTn;p9KaNz a,e!֕\G(#!-@_v\c*t6K^1vnwvbRbud{J. O@(s[hnxX0pVB3'By,[t4yXd֏,NXEI/F#C zU:ě2kf4uЗܗ\Vܙ*v2?cU&CQ^u!x_E/OĻ\'Dw4RNa4%;0]^f}W[~Ku >L XX&Ie5C Q:K_jnl%1W*Cd9׭1oP®B|}iǫlƦX?d S28ΞxY n,%mlJnۮJi`b(jrmHFZrϼ27cbaD3ԥ/M%}~Zi`~q%N׌P-^67r jngctfmFvck|xcbT MCǸ`~Y7`''#E%qv8c^Ļh*7QL.$e&&}mZabh3t|N@PȈBrV6} 0IcK[ge/rdw#\Cs&cI~h.A*{)֍`L/4Ha)pXAPY5U ѠV-Dnw#3~VY@> A IJйj{K!;R߾t_#H({Xc*_N\5g*i/5.:ki7IGjFU5J0uu<N AO^^|$ QQsX)1$a|?d*mZmM]) |OFFgI 5) /ө.5`lL"B4P٦ْ N:_oϖVm곛 0{oW5ѠLK1QR$ ,εKؑHe/8?S2}POXK&!^'ר* r6ǸoHKsAvb5<ąʮ&ڟr{dΐ`P|ε'v1/br6ZP^S8vb=NN[G r̞aGýXZa:fx-WjmD&"zS~;:? 8ȂaaINGxiTejn PpOڼ.@/fk)雃Q=৅OBz%h< pH]"Uyiq1Ul|6 oh}7YDٖ)" ojuD$ﮠoQ l$!.$=/}ݵҴag*$[-AO)9Q 2 _W䨬PIrd7fԗ(kP~\[)ء,8r'5#X]R r,a9 *Si$&-* L:˲RV<.e%3*)s <m?Kk"YaʊJ9Jh30ApַDogן9@릾X%-97S$s6(K2;ղᯋK7oխacporH%YuUpjs3<@!!*Hp,B3S0:xO6UA6 <,\x^ ))Cͱ/ϽPJ-LW932AwLU*\8,qTw_Nm፲be4DϚDql_,0B0@,&aKmyĶ3W ]0G62>"+_79 g^5;5KL3ē8#tࠨ]`1?`eRr3aO]oW΍zqW"c%3BE{@$x{rN&zF[d/,J ,\VU1ۋO7Ledq%x`R Tn&ryF;MBA*qqE݌ǸɡgM~;v5pȬ On԰`y(Pgmk$s%H}1̈:)a\+*RmrM7|~/s+%*U? |]~xjTgЙ$ص )C$V_0b(0h=mueJ}I$|>b݉<d@b` MLHM7vmeҰꦆRy(glag:ex#!>tPW'>319d?aE+dl3V^"+ɼ)3yQ4L15WȤ9!Y_g< J!0{LB$ *1cjԦ%@Iߦ{ORg#ʵyMu;Q"/ m:^m(:Z ]排 @WЛ?QK18?Kw (nKKHO $P:mS/c1V;[t4y[K" ,eۿ/x_mg8kvNR_,dr~SEKeF4k#|LAA"uNG ,mجe%h~ώ8lc`$$i툖n}<`ŧ!Z6\GGFlY" xCHU޽;[:0u;9u8 8PSRff ֖I-U ={fOr)!ٴ,0Fb%Toe[4 ٥H^Q.dt@'_ߘ:TR1Lzo^g(KP4' 3U{R-nBTWO$ޅ{.ZjOXQrC>wQV@P,?Ov8P#,zQU>e,RD(Fzc L`]ޠ4TW6֛agr~(bOHb1%>\u_(KSײH{8 (sn1UB 2\]d TS&y@i1_v7S*ϱ%!XT` TSf&+l̄_8\۳ڱh!#Щh02֛!C3*Fro3`M[gl׎h^or i +c{]:N++ڃuM9KAIm6̿JiſߓP,kZS۵/x9,/[}PS枇a9Fx5?Ҵ+z{t5TMl={4s%%]zPeyN4f*[}IYZr<~X&R]c$8meQ{jzL5U,vLu.xW=Kj"m3BTP^5+'%hh=v5-cWuŏ*ڋz2 ?Ta?$rA(%_,.a;mr4:6ڳڔi*JT'a۳MvZAPRf[6w@{a_> =hܠp ->Oݐ`yB 5vː6Y1?9 gn1czYᯎCĸ=4pc"557Dll]RRzi_Jn,eV zcW wrcuY(C~Q;l:gx7L' 39U /,%Uefo!Wer*[TzbS\ߚq3NP[˪+pořTM=279OE)8:nLcՍ1O3X@Y&g}VʚjHlD: {47Έ6YsЩ5޶#dAB'V`=\l:c΃8;dʽ/x!Rz<"e"veɊ-|,`;W\9ý^'5}&iU>"%Ԉ$:;:Z/nL}/M.a%4z=J4 }ҨBM. N`*뾧xje@S.LaU٬Wn#VTs`R\Z:Lĉڊ@_R1hBAr1#G3--a2#C]5!Q>ݩxcOl-OŔKr0=2gJe|@é>@Mӡ֥m(9nC]*,kXL#˵ц %6^C֥e.I6tĨvXVtϾgogi r2-&ᇁWB}O?{ߙm] B%e4qL՜,CRbl c4{NLWQDfQt .zAsMѷ7ʇrn2S Dk\ 6[]=ϴȢK^rQ5^ MκenROʇZ=ZLf64!"ԕUmZ)׮xi<?Eb~(MMnDה"nUQ}5<>JY+UqpXK%$s vC,0cUr'3|3o y!bIPm@05m?b#&Dm6Sfb32T Yg։N/M*$y*VO^mJReD@3Kxk\?(ٹa-4( e z#Tar8CDiCuWM+TYZzy:y)Xѷlvo &a%n(QkkJ D|a- ~~5|> ӼdI4N)A"Cc^1F ]7ᨇT]nҫ!DEL݀L@΀ϑ/ϥ:e'!X#K؅ d+Ϧ>f>Tg@8z#r`[ =# KPE #'i /PEA/+ᜮ2I.y{9ԇGF=U ^9֍R!asIgAcCj߷7*6&/\8]럷mt~bt`gϐ:i d~maXHaTO~)gbC F³I*#cd6H9?NJxTRWgٗY+Fwh Nlbа"e1y&~?d'3B:sˡ/VV ;ė;lֱޗ8Q*;qM+u\<PUb{au4 fϛ B#(&B,I}P ERXPgTf rTP ZR;k, z Giʜ@G J"Gb٘R,UJɼ96} e6op gYN\YЍy zROJw6BV#gM`v?Gv3)m!_LϩIb B0H⮟:%uXu优?~&p_,{. vEK@E@F~';w@CVE|waﹿE/1uOG[`_ъ>pGUHW/αij{`A&}G2o9bQubx83K>4Yγ3f&/0"V6n'f`/.> C"]0#g_J2?T'9(KS/0SHNG/_\ا@f|+`D{9I5}-Qe08onb* dPizISil864aPW!,b> n Z#0TAZɛf/SmCk1xKh>qG~? !FAQiS(GPBDsM3I](:%`L*8/j-5}1C/*0W7hQk6ڰ y)rKv ZNh. \֌{`mBWiR{XVKН%vx:R;}S"BU("Cy>3-6XXo)A >|\sM[L ~:e{6S5Xxds/ྉ62s1~eAad_/YY{ϒjz0``kfCݘιWӾv`4>Mȧ|u_:V_gp1,Uh:o~@rUy=qKB!( G2S.!l1lCz܍jOvhrעǀ\.Q鼃SX<%&G˘?yŃѕ$^ۚC ^@U*L|V0#m%45r!l]s~6mhf.fc텃aGb*>-~ d'y/Zu*J1J܉;1P&}, ?Hd0 "N hF8{0xkRgcUpjېߨf"CLBYAq~D˙dd\~aUn Ha{Fre.Xw@IA0Ek=Ź1`HM^}?)fUCBv#P${Km}jQY>$$<ռz݀nii.Dث\x(5)9Ȏmwh4w Xwdc`0  3Cbv "-2  +|q:?kj?"`<`>`xw h+m슀L-8OP"c.yyݝK%Kʫ(х"MW@ut2={E~_FETE~gv>80~-@ A mS/(Y:>\u%!˯'zYrwvoؘ:uZ|]لa YɞYI=ƱZ&^yTgLV[o >V/}N6"!-Qt IXU.rTI#ޣXH7"JV kmō[&_0Z,So#3&X>Vs-Y aֲ[^N@w?Ɨ~D!k -{#kum.+ ~!*M&QtKA=g[['T5t{7}F洤]˭5ޫǼX*,#D3wYB^} B&\pW_ߩ$wTq|г*K[5X aM7cvXd#5oZ3c=nÚ֔JRX}NMmP$F&OFd{ǎ0y1mD SeѨ͆]ްfo?Qb?]+yTWTAFJovϙƨKdʑLԃ*d+v<[aGPm+~2֘Okmx]pO!7?UL(B'+Z` dK3Wm; w An^Bp+X* ~up&}9;h j-dK$! ~H/u;v5sJj8!Whu:lq􂚙:1_l\sQ$.WZ^"ō#5u϶noq.O.2;H](l>mFg8^M//>FIۆW1k[XoEWGwsu ħkH66Rj [^C;L_X )"n&]jsp|vSuVN UbԺ>_!:w5 M~ЯF1Dϲk1(Uvef64X*Xnh#[b"9<5S<"Nhf d)Q;ƷV\j@dMW%'BP1g0c;0i{6`-c-6L2A2Ey{j< 1IDL n8 X4bûhn`廊]ܥIIܚ>rI/Z|ޙ }/$!K s90eo'aqCB6cx/_УVMijܡw꟡ti1#Km%;{r~E4 /du:c=!jBx^rʷ!Y(y4U%JK=B(0 ˆBt6zS9{O5c űBS'vo_U @HWxh)uH]%Q(~BUçz7)>]0_ Di;GiJܗkNqo<ۊrhStҼN>dhDNA.V̐rc|#K`KAYlhyd=k5$[``JP7\[j`4bCеqG)̶oȴ lAmH/v~^!G/ I[eC.spЫ2tsŇ[ * Bb0sRctl6\+Aw\n|E. %ᦲlO]MXb~L\׋hEHgDd=߹l3]NfYyҫFr`JVis)[/O'cpu: ~~CKVpN8!HȢG]|lr^p]WTsQP'"8 OϋRGuͽ &`8MClYE%uTiK"5c!n@z+$Q4 /dSQ!f+V5͌! )t@F- ħYVmOF 뱩Dl^I*0pmahB [IsrKЦFoR e9vfUC w;ga؊ddX_CnJƬ4) `k)4&s]4"D#"M ŻIH%0tS"[.TJLgeU ԯwc'_XH57;D:.` NLhBቓ_)PtE)NWnr֪FU O1/м -sbyT &q a$Pʃ?w}wRqC Y3<3\=q[ M>ur!p6n*;G;&,% m^ЏΌΠbHXfNssg٠+KL{iTaEdn>YRM[=J/W͹R$m5wjDfiֻh}pÈM>:0BmEzl%./qt^3 tnێBdظ:NyMSIsaɎ]XSvC+k3`> 4/2s7} u l|n/Q0ld+n1Zk_tUeM߅ӳT[vGepfdܻ\ֿdFGJfct 4]]k%ǁ4d 6lb2{d_y7gy&u4z5v_Et"cn)Qiv̵TEȧJ ̀JA& T:˜u\A>xRZNPo9=nq*1L*K .o"K#8 ,lZ>3K=,HUŰGoEnrM}Чy FfC1+XyƏ9xk )w)e6b3C`$N.u;qswWkC]B<2֨ưY B[S:ZWmdJ/<M]pG#7wd*}`lp-cv@~,fsl2&шzMYLpwlooGxBΔaq$1jRyF+ nqD[H&ؚS>cGJV`y/0ߍeYRPbWi1<,T6/}#73,5tpιi?[3ü ZJ%f#ii:@+^=8Dyy~3)nMwLAÒ4Si9:/ m zNgY'EPǟ< >Q:UbY^_{Drmd*# }$[~U*>lb0aK2=L)E:]3P:NU׷Ă"?WSeYR&6BjkE 0r* T3ںjݮ Ql5UŸa[WE>V RW-Ϣ}^P#of#T֖/׌ d+z]VS_LioGTdʶ*;,na \nUG]/X4?X jOXЊD WAVZE ? pM`nMaP9,cq G\٠30fC.ӳ׷Yi]5 ^.[r-H0L6.c PR_y- vr6a2Rd0%%grv5[kq{E,@E5E8Gj;'SUnh(7Uoln?BOC $`OyHy_.wȢ/&"7Z)(QSK3H7XN{a8>*ʙoL+Lj\&LBFnNsDӳ2:=0SH`')GھaJĞbT7rs8l }Ʉ'9gB2|b4f e?]tOPA ;"pf|,@X9 Cs*8q3UZZ'_bF7n%*<*P:hi63yFQ-W;)dw\ ];i>!ӸuaT"2zmϡR[{/NɀӅnTJj UoA|@5In 638K-4ضw clõFKI!>9dy/aJBpA:\_t0j ]T.B3n9ҍTMT H8<7Z1<Lt8ggs[Z*8 ]}G84s$'v4j 0+VOnqJ'?ϟϼK`a3d.fc`Qbك@35GBD#x# r|OKt#QiBNjUf endstream endobj 139 0 obj << /Length1 727 /Length2 13244 /Length3 0 /Length 13831 /Filter /FlateDecode >> stream xmcpn]-vضm9msb۶mض}oݪj9ػj۹z:213rTą5XY,0dd"N.v. SCwt4pPSP14tػY[xݜ]\9bj p0YژD%j S;S'C1@ٔ `fO03'gs3ur-@NLUH\A^ & *03Jsřǿ/1_d]'D0LLKc ÿt3l?GC*?hWyC[S@ locp1315/R.!dg)Y:[z(Z#?Raנg{5?Yd$5DhgM,*.(jd¿ۊS8Yzte=/JXÛ@`bgcp1?t]L\-?7LM=LaWyBZ *if hVW{nt-,L~^ܫ^H7ƛONETl+G_c˃D޹dl)ROfH;!K0u#m'->IPQdjÙT#Y\ ݐa((t8 48Bc 4ji(pdU$QInYGs4!QaZ5\cg T,%q,(7+|͡+x|vflGkIoK0̡ou(&w݋VQ.e=]XCM֯?,wGᎾH:IЗFx׿!.VqO( $znᒯU'È'Pr{괤C 7=#o0B:qA,_FK׳c;>;ni "KߵI0.t<}i^uC 13W4[X~ee=ك<.*Q;g:DVRtsB 8;qB@*pc$@DwT$BK-ϙ `D\5( /b|G.:c_LObaeȶxSV,~" FpNZK>ߞ𡜍9BNӳuw5*G*`Nen4 ݠ1Յs_/MaO8+>8$.Y,Z4gk^Mr͓T7O0`U5 a+ ^jVh}q>W*F),Fj.NA-=W4H|iՀTvqN^@uggH8Dģ.꡸u1` 1kJ*$Ai5qNP(2/1gm̈F\{){9}, )0p)?gyMdI8ԫY_ #hnbT^?C䘅8'N{g\EsNl-!>~PV3fwFI3'lu8y<6'\&˒ L2/g+Qv**KI, ],j A>_OKE:,X;* g fbo%;n饙@\$) 3Td9OgHc!O`94ĦWi2M<}5aJ$y-?-Rt(Be|_geT54Yw>Cáw܉a @͘_9ltL,zpЏߕ xX%n :5 5x=RGoVJ|V33t 0{KK@LAs4z%4CV+6olzrm3 {leֆmC5|+Xn&m+Z$, o~fpK|A3FY h{8S+tC>͔[b|<<Ǘqu|39852'.Hl~A)R9Hy#Ui Rdxmv3Df[aP!V6_ h]l]9>˵7E`zʢԻ 't7U"cVʩΉ[B#Y M6&f1 Tw-5 qT _3gf#3=Hz wKjTd{d{0Cړ`1jIi ?1{h5uve/o9ɒUeX䲧>X3GtL/'fAJ\}ֹ]9 옎 \^7z=(E`%olުF],fS/I N]R΁Up'V.z+8u_Rlgb`>+v!D-aq}g(ή۲']&}( jb'XS[W'ΐšzEdAQavXa{Cݏ& q\/*S^@VM*8Ȝ!< 8GNjIوC$bt=%ƘFUˆo8E@oqaDeW7Əg +@(HLWg0uw_fɤybFf,U<}bu\~Bz p =o0r os=N6)m !u&[#H꯷T:N|5ˏī>n=^f <*F#IRS Pit ,@*UnN~6NJ@T=t .v IҐDO 9i3GQnx` 84Ge;}J-)̈́xec¬%YP D #`o GFB_WN}O+GwzƆzKWriz5GFUG1.䑛 ʰ&u9خ2Pm! ɶt"GHA>YGݯն9H&텹T?}R r~L!_>[W?ꓬ.ݼnt┡D\3P>*]*/rޢаyete$kȠ(R 9?ގaFX93ZolU\[%lzCͮZOlt/D2e2Mr^}}Spy&FNQ1nGD5@?Cz}?Nc y[8,O1"Y'YOsdU1"ivdÉz7i2ե]պ!c}mtƊ#Ty\: nՄ%TdS(w-ᘥPNʐ~|wZÐ@>'fHs^-?p&\p5Pf;l{̙9îv& A/;x@Kng=] F>@ 0aY,{zk6Qt_pY[{C)k Lt {J/.JC=+Ƀ%wA?N43u|clFTd`O\$lŏ,(E;i5ъ9VQi퓌l9FZZr7~602e ?9O].<>.zzzW L!U|O(5:pCp`^"|ziq1&ʩ1Kι[Q.r{k 1Lk'c#Æe|)ZZEeﱆ.pAÙ8(@pT%z'=j}\ Sͩ_!EEPQ@֝b,CSP9>[)曒ZP¾ )9{$u?LĚ~at,kf]Ӈ"WhoSuT1'˫|B1>5Ut5@{c(mE寑_pkB[ILjQ X9ȴ;C_ssbr=Yܡ!WU)01%8ύI(kNRIm*oo&v Gh𲆴=֘3EΣ9 )Y0 gꐌbC$㺃naB_ر6=*iбh4{ ߉izώQ:H@nF8 sɨ-d#WqM])$@N΢y,NCQ@M[/3)ߕ.K塗dq"iOo;,,١Id]+:-xi` GFc!+&x!~-6d mMFEFܪ> Cjy7;( ㌒ȕ+IO'=3Xg/, n],z;Bb|K"395-ĸf<Բ.(_zu q{+)DPJYT2AQ}FdT 4*ʌRk`u 9pQhLz>]GXՔQ=#܃.v!hb&ΊrV'Q gbhy=,ܴ$8JJr L%V[4.&fw? TM!vc׭'Cʳl*`&=T#$D]'%"n ]ZsC<%"VDp 58M>iY$mzj.IFv l14 o|dmc+ CwTť3c¡45Ł8ry7#|kLogF2 _KqN1fis=-E~c(EAkܞ LPyFrHFtA~Oh3Mެ2h`"OȪΑXnnTEBS} lzp^19bO1K5ޔFu/J&8()^GW7PL?v#\-8Ii!yݙA6hB#ga^IZݔ. @jgȀO&*S-ZǞJf˗+!vbk`d …dR_K8ߐ:Ѯ hGWC-|]`&M֙P!ꩁJ)jNyX*6&O7}1 P43E}OKs~._gl Z5j/sS1!aϲ5+qiQeƳYS:U`^;{@_IL҇JCݷ@ %S>i6W%%G5l+_ԁ5[/ bi(_n]wR*⤒JyaIo=k -FUGYe`d!߶EkƉM,xYaEb#3ܧ}KyQyƾZL\"I,j\r`ZսFՇѧ= :|ɶ6wY^}]p!cCboyѝ]r:WbP}l%&0lZw5Uݦ<2+.xV8d' 1N!ǁOi=1[#eA4 KTX sMY_M=8:|WbQ7FWdR298&;X-i!}#s@Aǣ\Z/E ע·+:~?I ڥ~]c!;#&!NF1e1ۣ9A=kڮqL d>IBKH^SD4eI)>by4cUT,(|Uu'%S}:zmu2S1ƛ/2v=ؒ&;s_B}~̷kp>{wl+'o3tm㼢1w>vT?v(?~"yLA=zhBg cN2d=̊] oZ->ws .:1#ŇzFLi]+,+;㢋aE[Juy{HVw>7RǾ^c/(jU=}M/fb:0\9`l:޸ W.9zeVmW}8D6|X^0q$=MRbmZj962tYhPImKLRVs|JYH>'Oy-!ÕAm>ad̡]Ĭr۱~U翸{CKKgn=VdåD}*AuUj90d#k]{ɖt%֛WQexhCYaQ;eb_WYIGֲ YD{c+wɻv"Z1Q-kT~ŕms<95HnZC'?>Ԝh PՔ+\ypkVg#l6­.F}?μ%Ыi%^I;L>ڙ@%7Wt=VR(I`ܑ2F,~YE \jd4?WRzR/YkqæYLu0Hg[йe?+^$%NZ$uzF`58T]hqp@cXK3D )#[\|$ONlEl4<#CD3\ǪЏ^AtkO9卾L* 'U-Z,^|c08%֛lԝQ,@e*|Wjc43dqϏd/Vn¬".9Tdxfq7K5[-'+̾7\5meze hZ5m/<(ItF-R)iywL'CFȔZ4aL[$%.]<ghcGHR,wPվ+k v۞C_$HhǏ2S"}LܶY- /ĂϡP 578 T sIX8ߚSh 4ܢ"M.bڏOsBcRW#TaKEKE/Zp';uphE6Wե-%Z5+R-k[*чi l J8.sv!pҷuk.opV]vĖC<`c'uvjp\\RqQ #ˏK=#PEǐdT2bu!4?LrĽܾJWXHOl(} ْ0p\9CC&zQB :ؿg̕yċA&NII߇' Ym@A$QjO*77Sl=]\}NNbΊJ阭 eg+9 q8J#$ҿGۛ# !9Rb>R0QMgWR/Zӂ Pc1%7-F@lw`glĐn+ X]_MU6/GO: IWYKDapT`@0_}I) ZWa3KI`ĬtJ Wj;aP}$tR5tΘ2ʛYi8!q9&eMS|UC9Z6 lżMHBRkRt)Wkbl0}(_n^{U<-7uHج.UZ:HtT}4$4Zl_|f %dve1ΰH ٦'oAgNZW$#!|ЇK`@iZRuY(NwJ&|hrvS lWI0J?]gLb k贠C>IWvI <}oV}8 a ЮO6sͩ?r.'b+R)vf)lm;gnM#c'IқOoAeq\q }Kgz#Y7r~9owPm=tYO;@>[p rvA ղx7֋d2>0_&qԷ))I>44g: Th/fȄĮ9VN"vb71 ٓ ~r<ܣ-*o̱pj3n0A C'{BI[X)ˇeV&8ڍu򦎎Xc e4#~ |]"5`@Lws V"'{ ` Ūyl͏ +Bi-xp ZQ'LuY˽-E[_Y[\٢C9oE "ۿyE,=Q# y bMW֨LM ^KD(Gۜ|s֌^rS|ˌ$#[nTά&Uɒa'}S2\.z̎ϧ2!Aٚ_Ň"3A긢 yp8/ G$.wb竨Z'%R|i8rCY_z[إ[2Cև!O*غ њW`6A$31^d4ɺ^M)-:E[~pq9R$ 1p6|Ipj&hH%BÀ{m)4!B\b?MRb dKے>w=* X۳YpeY7"(q< x¤7?نP3OCTFA4F]"a #+`$fT@H Hn{F鶴GW8Q~NsJ.mG~$L<1h;"uO4B-S %70ZWlq{n} Vc7G-f BvYw .7=oZXlÚ!.en36.y6>䑞bZ9]S KKhȈ%f3R W_Ip[TB'<{eYJv?X "j$+RyHzZM%r68ӮqvKl m$ӟ03ى`>0vwҧxIƞ@9RYf xr)E)gei;|mȣ˒pPQ,B7>̡Q+c0Qa٦NZ¼y.4 D\<#߷w]#Pq~!(6@̱&2V|sJ<&P}ҥv&XycxY subKl-Lj_/{>7 Kt@a1F|Yų('0mHgk`8ܙs)JKh˙1q&c}&)䬌Qpzݾp B*L -i#[*NI[M!C6~!VSj25ѺmoPZ"LDiG4{*+t Қb&q^~L$"Ӝu~(+%8a)G08Sż-F66E,XO=5ь3"lS)R- :mhr"W^R]g:_oߜRMqsFZT JWF.v܀S8 WPgȥR,S Qu Jj0(=f ghK1 ?&p$*s[\YF2־dOH?z/RP13伜E2\c$⒅tDz[n~aoܦ$I?>yNY ; xaL[D$yh66 B bj%ॉ"Q*Ub9H}n ϡu絰D|ʀ}^O!8*27C50<5RPD`˚mCĴ//NEgNJb]dapq s +’?}Eg-a0j0YIvK"Kf2GJ!s݈<5ɼh[b{qna&+Qy҈n,Jt:%;t;@;$^=dufLke'!*.K%+|0_݇ә:=j`X(e+SOo֋E3eܞXuTtߘe#LW_ q&;=yƓ0|"4я ےtATW(o@SAXv<)?CNWOrhc;_#1wY?r/2`*uzQYM-JN"!s!N<6hPaBDg->d!kΘkq.2)ypML3/zuId,ȯeDvs"H[Ny3 _4Y` 6E35' ̐6;&Foq!pd3΋E{^*(>;?{:Gt, % KMCB &іPyM%a4LBIYhə< ~DN"d,Ș42w)ږA\9: '(1s&3I. ýw=t<%;]߾ A=B_*](ĕPe+7">7B:&ۮôu]~$“mL$gȻ@={b(Dd8ZE5&A9vW5ZY  TO+\LOCQAJph|{(Kw8ARTAa|Uusڥθ|qb/$e endstream endobj 141 0 obj << /Length1 727 /Length2 14747 /Length3 0 /Length 15346 /Filter /FlateDecode >> stream xmcpf-vضmضAǶ:VǶ{έgb̚c5(H$Խ, ,̼5IQm.Vn3# A ԀNV+33 @ @mF @hamfpugtqdH Yv@ZJQ tMf@W ```n/N&tq=@AB]DRIQ !Ƥ.0q0KShfnLg_?# ` vcn2ݝ?hH0ZvS4݀.Gs@ t0mbom7qGA]%nHnabTks>jZ9WsG;aݎIE\WUGkﴄ%@EM\wZ?;_*)L\žZ} JT˗ `dp5swq:[fufpˎf|6ųtt,+SzVFxwx?=gLv.eZHMGbI" ^~UZn6D^Ahڛ)B\Gݺe+a?u.@b5.DJ Ec@ܣA +2z]pMkdUTtsl5dDЎ+؃]љbh@N [c~e<4m `b.?̨΅tP~>s[8iEJ"ݙ9 - W)\G,btdJԂG❑GJp֤"2(+'V,Ɓ,(+h{2g&!Y=Jn[>[=d vS̋o\ l{-1oVsU=<7iAi2ԦQH\-;P DL.Xm֚t|}gdUwZhL eٌ]5XFR+a`w,Zl Mv|[ʮbqʂc&hxh$w(!gxrk y Wfw%灌 aqk5}niWg+W8oN&k2;M]s+. U K rNZC8v!œVH|gx_r Cuk6Ђ\"g[[7'DJ0:@IMB+2<\ugVw&PƁf=U9_r">$z%? rta(2V[-,x\s*[=)^r+>" LɆ0t8<XؑRCHt^=Q*"'n[ nQKQ5v(r4t D5ͪHm # ǒ8.X fefw %;He;Z7X*0FY: ;*c3)0z` ?8^tdM=uHC%nT&?;`hٞ:'/o?i(8fr^VOeg6"tE∻LOYX-u:NFK/pW#ks RƘIlILaf0 5}5|ۻfVR~)q%>&YJVx~G%̨~A\2nB%!#~pZE3VO$ף4[9R"܃=~P  ?!i߈ (FV#Q$)X&ࢊKJ;뢎Z4}  wL,4+vm k%)ysv|a9pNǿS&̦h mw J_@ X%KiVIE'Q3imbҾW X YFS4LݸP럚y>bV^ |\G)J>o08CNp8%'K+8\d1Ph}B-6 lqLʭOu<ͧ_/sJFB48D3XV"AT19#5j=:uv4G*=$r#!\#]WnoE5`W8ᦼDHPo+Y@w%3kK&~L%ƄFu$UvłjG$Q4^_B<'5l%_wB%"L;SC6;f'e4k O]; o;<~C>Dk7OGR KQ@ }8~# lס ΍nqg oʼny{.ɥU܍ܟUKOd,s(.Gv)i$0s56f=iia8甲1{h}7%u"~<0]QgWWj; t٥@l /,ӏoڴ_ n@MT[Casoe,Uѭ#0ӹ_y n Шx~t&Sl.J~~@ 2Q{\~EX,T?%DÙ1&v3 *ljFQr}0q\\UϝIGRr'$<`,cuWPVʐߖ;{l>~_.ot.Va^[,w{zq$-vbhAGr'7UKI=[ n$/ZIPyre%MrLn}[Dž`Iţ"5l9,9 -,)PTikS}eaLB?ϸﶺ3{6[^nGuEiXB >Ek=9a"ɠ,AJ-O>/9+gI4&d;=IpL JXٗR ,\G*5wyKי_2p4/"sYjZxu2Rş{v~}O OH]iz@i{YI]OE wvW K%M$_Rc:KԑJg*bXDfOYxE 4 oQVl[M,Q'L  (< hAڭ5 N#V#mfʮJH\gz=:*kQ)-uJ~QR`꨼|hĘ Ċ֜KZ盤ӗE@xB& JxXQA);>:;8Ѽ9BdG{r6Dw%#{铴Չm*iF#Ij"d)h< M@p89X0NPW{V|)-@.(|R!_(lTPg hW=PAhٖ0k?{#Yf_܃EoFzD JW K@Nzt19!O:G5+V&1"qxKAwj,?07jQ/yִlX%8kkebF3V`zk)-(dwFB>+,q{TcF \P 䥋rPbH$ -wtXТ3dY,!9=Ry~љFAIhnF ߇G_Y4 5sW#5GOeQABE6d< 26ͥ`?u_3=ňH߱]c}ozR>AG&J.WPa\ s&aLv?!D|"Uc"f~wKa?c'paoP 0?[XyHN0e^S϶~l |`bxEa>@0k'E f8QBizNshﴛlbLSfN!|].P$W*uW{kܘfxr5+*0=4 cMit&Cuž)<ׇ@qFp lR2\hҲjx!Yhn"0is+`-5Wny>"m%؜nI| .2w(>¾vاpSHi1AW3.&AJ?&,h⼴ۇ"Bt9WƤu*2 ?07;€psw =3,b {ܬd YWA{IH  ѝ\m7DټvW*GZE~`b[=0MUl޶1ng|\[ BPr&x)a  ޟL Pǝ;>x֔+/:uu=3~rp.c=QZm6bx$9쇵 p0iR%?#+KrEl{GScipZѪ3\0wq8.Ԓjqm(\MuU%$-++^]jyg3 ڒ,9E_xtndRjfs+l3Lar 4 YQQC;&%/5rӓ:bo<],†F RBř)yE& q::˓F(hD '?nID غ_n,BooCtM`zUvYXpQذJ(}^Cԋ-J|*1Cݩ+N MVEm%R |ÅǦE&VX[9p>BW0b[bl8:_- ˷XH- f]LYyPᖋws 2k& J$(z_hHO2~zqǭkzƌ3 ,h1hyA:!JN&|BFB8 CpD<i2S #u}*!?{E0-z-2)}d`\YB3 T(S'. yW8:<&q*X)`3_<=;z;mênR_sTt a~ނ[Zrsқn11FL:LJ yB'i/+ҹРp rve[1Yr"]72J v?Dǿ4rG;!4;SG|=<*E=JUWOбܹ%CUyhkP f'#Wv3TtӹK:?_`5k@= ;c8haia@׿I|;d~uٶRӫ hԝdɷT 2|&`jڭ c[RȺ9v~T۝TD #MwY7 `m ld;gMNo&ʏ%mV0MTX>8#5cvkFi*ssvayV dz?j-WhL ] 8w6?]X.~Β) ĀZ%k}ڍMʎR|ći?ҍ2_LlrHd<-5e{VI?x{c~a1KtCqwoC^2(4, 擥?Cwlc`'j3\xS ZgO'z' LHR1=+1> MaoԹ{vݗxĆ>!B`mX]FyQ[%JPUI%k- W,C:' (2pO+jec l0!@M".*vn*%φ76Smgs Kf_73|0+WKїiQk!—rj?~TA,e:ԗtɳ>&yd 94"5JodM0%:h"_j|٫X<!{]լ"ʌKvCS. 6=^tƣC|Aߨ3 =wݑpٽ$Rkwjʀ 55b=`vDTQֆpxFw{'5}z@_'U)[vjVBCtt-P֫j3:Q@A^hm_ޕu8aqcĞP ֜[tb[謆,_p,>JD_E_^PE[Pi?86@bҭy![4KL)NFP7'F/ Rҟl*6HLԃP#Js-6a٬G=F: h?JEa[ֱ4/zX25'̯TX?()h*-g˘~M'ԝ*aՁeo T%+ 7vWSS?c0=k*d0p\nzUf].Y-i244X.)K6,nrTmt^*vL1B1 Na{T*vn9٭֏"< J+[h.L0;=aHgi}h@ `փI}#,@|"L#Z ,Xd֫Fȇ/b-#j:M8FZ)zuDSEyacRR 2ϡ5T Frr\k4>I8| ^లI0by`;FĒ &mđlnp Ц;Q1Mܔ2^z3Z0VY'+&7`Ӥ)BAH(x7 (ay>Akd~RZE*3fvD#/Q 1~EMY雠W}p]񽻆:-}B1-JCCaOzQ6}?Mu3y0;Ƴ׸"uXVv\M׬"2]Wzաh~!;]Qp_>D)"qǍ 5(Rj10 6 T)'Ja<eBf8cuڴ$bU$v:O;Ƹ'>ee)X!O*DVᐸ@ru6wml6ZiJ$ 7{ܳZwz10Zr EHa#"<[ǡu;i%L+VUGwEF HK*8ö|=<0f1Mq!I qCYV >V6.';?O*%pR,,oQ }*n 95ݺj0e6j ge8CR'!Kݍ²@%ptdMH7Zr^7b=oMIaF3Q:‰nYO E3| a.Dm ȝx/a1gsA (Nn>6~nBI^fգQҖ+dٰ՚O%opMH) `aީi'2k-D'꓇ ^DbD?/|ϥr8l[PQ4R"٥[' hwY[-C}( eXFcOu{~˥?''m?`aL3B-MlGp*Xc&?-Q H4O.tjUc\Q yc[74jZ!ET<薇С<ZREJ`{VLkaTI6ʺhi NIG6ZR&/B=.)oqdY4X,(= mu*m/rbI'A).nP IqZ;0_ )]W;p,m[ [j(To/Z2YPq҂xokښ[3^h=fFz1Ce^i-UQ1_ov6B1݇e-Gz5㊽;8 O<{"|9N1:NJ0:_6Zr^ޯC)Ti|A'e3w ݗy!^cY#,RNi`&;H0ƒ$i|W}ިdj<n#<t F -1v%f8'Giy*vg}Lsބ:AՇN!"s Oy\bVD^@xI-g'tv/ˇa#QcʚT+>?69E} ҭ^oeμEWb||_ᢊYHslb-v:'^ߤAŽ:d _VŠCdMi]_V90Y;h85=8#E 1B##2O Od6mADir(YRf%?ID4Go7&LxG$PS .E SLڎ;pqHT,G!T.>MsF L?M y7,=_&ALpy;֊lz8H~Od2WZY4+$j0+4SSx{A#O Sn:>ccFo;ޏI0hO$AnzmÂ/fQ+6yx#D{#*.̀#AH:]>iN]hqV +ϫ:F\tгB3ꛩ11a((T6\VRUwJvZf_%Ӱb3QtNaaA_L 9{-ĺWF$5 rMz^+N֟y*ڡ8LHƦғP{辙|xTUhLF`3l{b~xK7f|Pk\se I-L5SKŽUT&Ve\K#=ɰ84Y*T2&={hr `*ٓI-|eBtPKj^)>W!a.l5?V *?6=Ai'|n|5Sy읩.nmD8!?IE =*(3k>bAAWzf҂`'_:(9U@Om #}- ED#)DtZF9HMUd_ NF=W_bS>|H͢sB!ϥ_ 3|B|n'hw5?c!lg@"r3"Xj@'>d>43swb" Z lDW]ż^ ;4*zu *;i_~H0 p;ֿӲW@0t-SZ>J i`;v&9Iwr@^7&DGct#1@JAcמ9=G%Wr4ȑE Olmu ^>F;gi_`-BxNކu3,'ٻ7sFm҂Ŀ΃;oool@JVZ#ӬOy[|%Aa<Iv)#U<._OLp$-\o;$^0Ń٤@F9%RݷO9.3% !<%t9Ê'`j損m kӇDvKɁK\ӫ ˣBGc5e";d<U [-(򌧗!DB؅O<:u̿"G]ۖEmzfhL mi:\*M/xC$:e%xDI ų66k*r)e/438ؕ:V:i14MuTeo=WPGͿgA]<i,/5Z1К!Pm] J\dExך2)8J(&m zdfcC+!*y'9 ~6aC eYB3?6rIΦf'@¤8z<LY4LFz]uqgMEU[@@$cH *"%x83#6p/ӪL-9ƕQ fA_BWM|(Ə  ] uuzE{JeGm/֩5.w P(4T:䦲m6F S*CߢtِmrjT@6pښLo7~zmJFq~%PS5TI;,hO26%`{l`k$̉.b)pr$Λg+.*ģHw LVV&N.#<FW݈pvRDœ3?.T".j6weZO$tN?O9K7+FR`x&.D}ߊd!56/'6'XOxm]8֞6ļ|q^=^A!?z_͵ϳV2в??Gu+ŦRgƦ㕿D0ǡWA3ͽ\+_4s4oocހȁhK}B8A~"1gZwFI \u\|&!%B1qzcY\MGX% LF);3-XJi12ܣ '?+C 1rj)dbI&L[cs6lrݸaF yPӑgjL/YD'V .+R“*wehЊ\q:?\pl*b@:=^DO *PŷEٞ~0:cz &AeldJd{re3}ajC.t~,j?WFffgN+h2o[e IٱUuT ǕbpUՖ{\5OR8Pνpe9[g%S;VLjA"-, #WXd,µ0в[ր1-z \iK'8 YlY14~t!^ ~&oУy0r}4a&cXA^ F0 >ca3U"ݼrhXzoX⺱MJLVFw@_[.MFq-^ 6aCHIeM3w)_٫/c4N#Vں\DNuA__, c&M$~L*JYX0|9 Ƶb kCb8bLQttٮ7#K= ka0vo| qPm{$j9v6(B&<3ex+OzN}RTZq OqQMR/$irs1hVy.FP$‰DJs|~=2-΋k A=ȱɯ<=ra"efcloo"ʎm IGatf'v>d{>.iw kUc#?3}S~Z2ȩg[,[;ue6{> cFD\+v0JF#TBU` ûs N~2mLSu)볘$/A' Sػ{%+cI޼>vi$7|b0E{ڣ =Yg<* j>K'NI>r裉xEmJ\q'քuH,{sZ h_`Y<%UҶ\%%P鿮,`$IŸ.#E9{3MDK2 Uur}Jֶ47ĥ"s;ݲ$ ʕ!Y1St]U4FiӪKė9'v-!dMELZ,}[+w|,RY6 JZmrLѱ7 BG`<6C$5%#tr'wxDeYz(n[ۍU+;bڋx+T?e/]j쓥zE~" Mq$g&5xߧ/Y/[Tg8HS>@{ Fp z埵+eyM:WsĪAc ׅlk~PVGX"4}Ӏbu*]]9uӓt3uR# ))1 #FzC~ns6@ M6g&ONr qI1m)c,$gw^:QE_$11VA?EX$E Q?εh endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 817 /Length 3475 /Filter /FlateDecode >> stream x[moG_1y+7%N4uU^je'rVʉl'vZR r8Cr8Jxa"iZh%3B[#N&Q,=V E^#bΠaaB^ 0%'1YY(L:)A-(,.AhrG͠xF{$A G2NЊ8X#QIxt; 8, !Ma&! N8F g΃,R%Ep2.g%R^C+4!KjXBaư,4H8KO|VdzȤ@äAƋ` 3.!6Dj+$g{)&vڃ$jXդ &K":{#\A2ń+@KAG 1.4L v/j8lAz|L%ґL%-SKSrb&qT#7$.$IB0=|(侐O''B{z 'J}׻ .jp{w#C!} 6"0&r _<'pA`m>zs}0kĞO '_qQ Zdf#žܫgtP(>MދCD SDx>#<%|*̶!)ZV6th r)ޞ}Z~S{;[qtxFxca3BϞx:_ 3;o.}x>*CA;ׄPU#3v'_ϩM-գu3{x09O⣣ 8ڏr|h2:(C|{FYyԙiA_x.GlXZC8<3|ԣVF͆t[`r0'lZSѯ4 x)fÙbn9GF%l>>Oɸ]ov(xZEʣ7EyQ!1$&|A N$A7 M'Hjb\[zm%ˁ(}@YJ_Y99-^6A9} #`qh̗NС+ [=] BEڅTEuUyam=ߨxh*R*}$Aߐ; k]Ci wսLJȉoǛ :aw⒮ybK*mJ`h"NroB=*dpNW9LS'fkwX|/|> yJ >F,_XjrE?^Ca.2Xٖ&CUspRLKS8,{3R(漒G] :.)4]|2o.a[ l9k1aS8TԎ3Vy h'}Zq.Q,+DM}3Gbk%a! <ހL QϨcL: Օp$uy>֑̎~Od L&A)H4םyebMkIr?pE? yD,h5eSB\bQĮ[Jޛ;83);sy˟P3Q¡%& j%O=9Ch'T-^ ,դm'I kui6Br("D-챙.v 眧!7ص^hSEN-LQzM9X2jL5%w()L's^=7-H < m'9I%@V4!Hn%REn/_V(Y:}%Y͚/,i,i(v}Of3sP7Rཹ?3MC#&9Xoh4{fRv>Yʪ-y}-es(r9NFniF+)C0k ^dvBP+// k[;mu{; JheQB.V歂^R ĬFee3m.M,| AQa^ȼ #7>1=є&sl G6B>b/_ 9LP_Xv{ cDMд`|Idhv MaӞ<@<(0{ zPP:p0Wvy[ aN]Y( WDLr;Ӷ8$u\,0ɨH_*."w0vNdC>єQ->0؜i .k-V+햞$9tqSE3rmlx\+t3 #z`x`wmkFPn/3&ۓ4 =鏆>ɃvLS'_]y!/pr|dl}z{s6B-oZ(FN&󩼠4.)NT-PTWiQ݉1lt2e:SyrpÛgPgMKWxM{_)>#ڨ+?E?<}7OhLNcmu,j\W-#˧bZ Kr$XXIZ 93F6gӚW<7~Re۴ب eYlmv[f@Y7̤c,nOX~1F4i1:|ņLF1 [sMsL`iu endstream endobj 143 0 obj << /Length1 721 /Length2 25933 /Length3 0 /Length 26533 /Filter /FlateDecode >> stream xlsom-ܶmmm6O6N۶m6;3wK ZOeTɈlUpՅG[q* o8}jYkC׽5]2l=06VΝ6[ Ҥ:p.[4?ᩈpT9F((4m#T/@SCe Hfٕh@r&k]Y2n@DэHt)mX~F v@ [cGÄ:0 UU)i[r>(*ڟ^[׊89TCcAe]{` Q|BJE`$)t:~ RA~ylBMM&[y=Px[q)05/&,i4{lcPjDyGӱv>ᗰp.BgzTMtasÿfS-IT DEBό*1y_\*xJ4uD1ʌIWu*҉G,q2NFgB )2zjhxNcjMV^x F؁l%"%JbhMXS.${o$A &aEG8܌KrͷE#~I0𭜮SSZ:䊽m0G'+{C'@ͽ Jܖ79P6|fTm v:rFoiƼ}T'U!׵qV& 4H?D;9xqs_HlN%Q؊A.':8-'߬¿ǖ:$Հ-Ywp?݃Ϛa;2}uƯ^6B$7M/ݏ+=2Y TSQ*R@k21Ҹ,˸o w dqB l.Ǟ#;\~xFpy"FJlǬA6^zx1F1?yZ6ӾWevѓo= 95 J(y1*c $B:7[V q-5s|}# PA!_Td>=;9*]:ZF;3Y,B{nI! A|az^9j2fq0pNbЀ7t'hAZْ0juKe=eM2'rG%c3rSkriI?x(=wdmk4T /3n; VYy.wS姤:Ɇ"cٸύVԡD(ѻ>pue!R_Aln`i?쉬1y4Kԛ*{c zyTMx]F s 38X&j {|V߿,iqX7x}9ӟ UЙA"m=J||֜{D:p=Zt'Q-2qXEޢB"r_^@ C:>""r OQ!MV PPXޘ,FywK.^}X,n剣τmz"e;ZSbߠ)z,lZ~h5zvɴ23aX_6S,H00ީz^ ;;$s῀W*RYgE/amp4 dMcql` Ѐoh?X{?vOQ9r*|*íC--,/)vX|KF;c]@@@ڨ~A ,sqh;p%kU a\N$(z bn-z3(1'b*{Z>-lv敛b ~4%r41_>Y %TPJ 9aGAX2 Aƛ Hh4~6z!+Y1: ,i6nΒFhIos%al>c=b 45;H; )Pf2\|\; ! Ts 07ҾAqn/Q_TAx:Jv!S}>o| ڡqjK=OQ6 FAt]ƴy#,i|a=U*QcëwPgŽNOHj\4Qnqwsh8pdm.* I 8HBgyXɢT^5Io5t  _+ʸ_)%`%;w3w#v{ T sakkzN1OcUf=`4MkTxVV3&GZ?^B:E8Y@ PfUKyBM*wztL.av: Xq^u?;|{[GTA]3fvC9b""4bDijfO,;՛#E&78HP@Z#|\jSĬ_TzpA|ft+LE&~4!d.Fxa\vZhrQnAi.ɜ N c)Gqx=xW^6UM!*em"#lcs6FChyh ^ɴЩ>k:.RR%faw=n@G5`("l²MÖ%EKg3"nZs{4c+JcT8r;}!jnq 6}oX'0&CkcLA>kBd%U!B#o30/M./ilXoue郪k&SŐ_'2F=n3jw)eˮq1hkkZ B6AJ)b}ёţİW5T?@\@d?o(y}17U}Ǭ/WPٌ~85AmC 6dyt3#fnh Ib3h B n1mF~o4A(KkXz~J d( >5ˁ!M>ݳȘASQEf#vr1f;5- "yF{[ekoݢg .tHp %7)(EV V ϝB%Lwq~ )xQaa-?ye=S O[*do0NjH BgZZ_{bW'0+Mw—>sW$儾||ؾ b`$OxHEn' gg!!kxm'i>7)7~axB~:oSٜhwjwDS%DDLI nn_)'Rz.:lBv'}6pvzCQFiPFHU"a *wq(^l!xPMqB^gl6pGA-ia緃uvd½Q#-TV/#F˰ՌyČUQ4gg̭)܌rmIylFqmU$HvY2fsθgOl{8ɒi`F]\yW*KS/{~SM@!:>wm'v,)sD2wiKOFiU0ULnBJ@}flx1H lk* Fh2L%YV/Sgߩ":D-ו_OuQb7l!OLrlfo#:+nw$aY(m)5Aߵq`_1||k]H8ReU")…PŌ1joʽZǭ0Tw5QZm>T> 2'T i*;2&2Y&utM4~2+e 9Wdx #~瘹ŖxYrU:(ѴϚV'~Ə(E)aӗ{q{=Nmޖmجq+NsĀZD2~g`)mڢ:'j wzbTҀZN1x%nIs@?$[H .Jf՚ `KϒMN=op i9(1"Otr!a*JeQ=%uT -9:+h[l!r(Pl"gӡvfLC;* \ϫA 9ʦ# _}2V,Yއ'j6fg =hb Wbb;p B)w/ 12wז&[BFLփW Zȝ2FUKGv,Acfޯ5 (!b?M]!_['f\nC9\䕥+fF Ėqs s# b+a'G";$Sfxو#Q $aB;?Z-nԞԵㆪϽGXE/51XNN>>"w0V [/PR-}:De@FwXNҾ{ NvV7}NԔ(k RBv=1\ &l ꫇Pz5#Co_PA]酘XEc}1cÙ>>EFv9;EcW줢5.(ԫ="g2f5z <"`Tf:)eh.m]v;67_\Ft9 >YF: { cX;e?oU&TzZe$[Nl|Ӥ1hx|sỒ:Q?i* L}f] j7ddQxۂ Zxٳ3F/c6~Vd qta3՜'l6 |r(* C{o!z#t%',ƍd؍ ݘיiQӄ;ӞBvB ܁&XtUj>O]X, fso08(YUztx6b?6(l^.J,/%75`$@z1؍鹤h|H ߿"*v]7y.0v[dNPA+f48X 玍q?@`4b7 BVs߫Sx"a1Q,xfKέΤ2Brؙ$=Sv}2X嘓 ܦqH N0gZÂznLXYyq_hG6@EJW qdB>EkAo@)'x|[h 8\qۄZpbB9]m"54O!X{(ƅ2ܭn 1DR3%=]~Zo^ 4SAi&ʒ&-1&U*G텭_iS{6g#.L-(DD ]"Jo//{ZMJ뎤/;Jx,:N(PA;7=} +oTҜ7:7.LgVfE46ӓ1& B:KeYjըgTSNӫq XZvz;O'y ZAOp-"}R15XoRP"i Z<՞01B^$o4Bl 륁pQc)IUK_d籋 ~1x6/0?yZ-?W/t,Rb ~:k1z)vV1Vy&'@0@ ?f3I7:hdɋlͅbÌZAƻJ^?בͬS[g*NzHV\h5 ~H yTe1O&}]ib|EH`Pѽɪddp:%O8& -S8W^ 'vն>4Jơޓo] 7-fXtXyqk"nRyIUN,Hv9z'FTCfU$V[ĵ-)_61sϚ@(!֩OO.b5^ A?+}M>Auu ^cDx>?u Eױq)tWppa5Q/ʒ d ^RJ7B*Ks0l4BWLO]v6Zp>Iʄ_|WfcΛCHѤz,p1iBrGWl\KB62ADnÓ){vC -vR{' }_e%FxDƶ?%}ɶ0Eq5]@i_yJ6 65PDT=JM=~m߽o[zgfkGLi*(qJkB6}NN[FR&ud5+ t abj#wH|\y!j7a5*>ʼnV< ̮Y[=2|#kàQ:V֧EZildGK=V\اzd\ZwI1[;H ;͜/6z.gzyxNm^O\y a;%Z"cqvT/Vaܘ ;o fz|`S05`_>EA4 6(9 gČ9u鋄tBZпͱt`mbLTPfQFkFhR@{ҌV` Ϗud컰rGv x-\0j6;/-| 8Hd WǛF:\+?찁J{2$anGQC^.nG5g*dI0cbNs(<pS[x&|e-zFCvs۲}Bl꟬i4[keE( @*`ĜhY.1ZV-QUlNa٪ kGID.k:;g|Cx}kJkf P:U(81k;VC\;1um{pطh6ZK'!3䇦;9 ~RϜ hqޭhW"k\ DSQ2C.[W@|bwxgFGU8 ۨ_es}?c~8 . Aؼ%Eml[[!@Uή S:蝉tbUIhhVw6 NB:y5F#m{lެ`B32,-,9&g2!x74rc7sǗW돜JX(x$6Q!wY(Z% V]Qoo}1S员4ućܫD%b"B4ۛ<[G+M3!ZwfQ\>S,YNe(!#`A)5kOC-]\ڄp Ty&q^C$`b5, '/!} (DIޥ"?\0X<@x#W{r*4PMX"(-7FL)BfsJz,Kg֕TDB9+ohh.m7j\YII8Nh֓Li8ӱ L\BwC\w}*CPHX!to7^g617,ou48!!7Β?+by" fOΣ1[MC D14ʣ\*\gUӴժwdi`S2v"/CxM=CXȊ#~?pw1L4gͱE|"%gV^7?|ԓJ])x^3=C(D1AZ*~gOJ"Fj BcayMqPi Ց5;qUl;;֪)y4"c3Өr.PehXP-o+Qϑ;ujqh)R$_mQ[c=10_I7]Ld8f{k_շyߒ V#˾J$*7d0GP [,fC1o)Ư;ϦUo!WclG-Tr]_1g^3d<eH1,i6tLWێKܥ'laS>c_R9Csc>:!RQ ,v>~~wrxV6{OLijT/r .A3.QgݡvT99=%+Z͒H*Wz"{uOkȦ[E;ܡ/礌ˣҨ RviW* Kny&~FdKL\J͢KN'g\#: mvv:ǡ+-4S-%էCj^\mF@*GEd|Ho ү=zP"xgsv{:'R\#y]Ve V!f2)Za+i/sP~$xrF@d s ؏p` KA 4Wӵf)V%Y۫K*"7Ku%\vY`~Dl}~Ȇ˰IYB߸ |jmmƏ:OM?1K =Vwֆt qLiU"A ewP`|o ]*zotj[Ekn;~4F^B~mꞑfwpϩ 4 h9-P&lJFbγ͉.@yŝ`y,P%N2ήEF[-Жmr(7;OPҜc&1v%pz_؈<6MD Ρ ~9Ƙq9`$n:[%Yc  VvG hv*^s?kLaYċ0t@G3Nh7z\(4Bb=Is:hGeOv!a^^NY"itnA(.{xdo\DdzQLVڻ-ZgWp@,`-l#ՋA®b;C*߲iT=-&Q4MFz*.+yvZ'@ V V()|DF4X0 &Hn.Rxܺ&+|N?pɨ QVSv!bIY "4 $:v{06z m a0tO&AU=:;<>FTa.[U妑ʁgB9s!gK&(x n`ʔ;R$p9\&ꡤ{r uW=ڛ xV;Al{e^c#KRd0P*_"jbiwMSYE _"e*F̂R!6Oh3)T}^t}fJ}JTA=62gOO+D|78_)S`uCt@YP‚M\lX#S>SF\DkA;j^Q 䘅՝ ˌ1:l|,zGN$9ZL*y0t9皸~ؕivrA6z7b&|xލ`m%OݞF|HggP\mwZP";dNט֨M1A_ʩ X~V|pcZi`@lp |YқQ&$i[fp Zw'ݼ"\ '=Ns~{Mbhy3Oȅ|Y8 ``~9^$9,j#JC~%eؒx2I_@g79}KVT߁d/UC?s@W]S_&L5l9 @H |T2uD@#񠯒~b{A(rE0hզKZ'okV } [e= b6W6GUy`!U'nyX!_dS&ה{kBKvZMw{tqKlJu_cR/^ ~?h̃iZ䀇ԔCbvl j>V%:Ğ_k{)kzm^ׅѻW j'@j2Z(`/>a&amHw <3F-hJg$Zk1*MbyÛffQm)ZeolUHlJ?-}A^L0z}!!$HoП.z!Sg:x(P;NbKe6hĆ. f14 [f\N*GEL7^H)|/ݾbz0!ֺ,fE=t?f' Jw:'H792 ǡi}12Zx('  ʳ92Lf0C_~HBUĸe{Ny" nnREAż~d%gw M!r7c]!hPM|߹Ϗ;9M}">֚n4OTmFhwtE] cPRSVU&%୩~' _5or&q)#|| *թ6ЎL8]Sx~p%+1{{FmzV\!LeՇemZH5[,;&>eY% \jۖ}'_Ng~CW@_Hx7Hs EEڿW# \ 5m'd*wMA`(iqBzٹsOc4Q%,`d6DS7pQtC3-cWch#f\bӰ•0]b}%W `7A"~4AADXb;gzĥò!H&NZGjssZAQ2ϗޘJ&>xc5+mLaC#4ħ3Ԑ!i7~6U),`/ bRwDoCX-c oL [JE募8-|jDۏ~5wjSE W(dC LW#2)6;6b:zs=Ma#>_A8wD=)cN3y'8_IhSΗ9RrH8'k I#v'+jvp/qm|7Jk*FƞU~{=ɞ?8cs͊Cx$!'4"08zz\7|-߰OHXiEâY|d9MZ⨿=_bktjx\?g0Tyr!t "[xUnq_GM'Emݶ|ҞhI.S+Gqx]dIsw4Z'+ x~n *"A)C&3aJxlG'd.7-jw>*~(`azJ7$ h:uE.,e5e@/Ha@Z`ild]Z]te_]_lsȳ5Z9RinvpzBL 1VWBʵ6" A3!2::_S*RDr䩟`ʄ>= Y'-˪O_J |,AC!] 2ndi!|Dgq\s4VKx%)*%< q/' Ix=Ɣ}ZML2blCEo ?mޘZVj+j =4w9SJg*C}0- v:s,Ѱv+G#^Hsd 5ฌ9A܃۟\s\ DQ0^7"G1GE{%Wa '!-R)o'+yGC;[}l̜], z҅VYeIcsʠ# ;xꑐp'oXoדey''ewr_w 7"A?ҳ`vU:2ime6/*|JBѼ@IrNA/YN-9d80ܜIfH}o@er}L8}@ֽC%q{2OIҮW>nNȺq'~Vi}k7 3}2D /Bƥz)(%غ>IJʈ['WؑAQ-vAʀ") \d 0 ?~dRJ3b/r ::l:썪޻XE c~Gjݡ'3]8_Yc6ګ[翭YC ٙ"kx+ZDTBcrLΎmF lߐ9Ks,-j2 XGeT:ީ}\+P>V|ItĜ*ЍES)j0'l{LN1-L_׫1v\dX>6)<\>a 9  _࡙I d`$Sö;Аyfi0vóG`e+8&fM Z+ OS:*, 0*=1} yDNiS%h}д0(bTsDw"O%񣊤2vb'|fSʜr :*+{RCw]uTX.#S5GcЅ<}\;mǁKJ$N;"za}Nh;UpVwVYQW;EZ焣!ԡ !FmR=Kʆ!xBy+D}HLJKt4;Yj']t(Pֽ,J]ΐr\w`ed\(/ ㎂DLDj $(}4hKF \/PE%7K~Q `zzd+'|5|е^uQF@"_{'o`yx5JK@w Z@:O_=`mح:"Jh!a(g{13s!DX݁bjsZsk_eB&33 =X1H.csJѽy+TJZvο )L f͔t#TcA'=HY+r0RSY&i4[wC,bw`gd%ĄnK S)091św\k?$Fh%k×꫋aOmZ-3]`%crHOoSq>%/'r;MTVSzŃ΂uㆻ6u;˂ylK-U}@Fr;E֋b%НY-%N&:XY~4јZ6zR(Ukț Wʕ1$^dIPBzIv~uF{/Tĸ*rnOmZ^[cHfq.{kl`A`! sDgd&eJbPaP=r۴Wt^.+ХH/G Q_>d ЋO@SUE *H*a/s8?2C2^:[od@Nۛb߮5(9R^'@)F0\}mht}T7~ٽRj[|A(/YM(rQ<` InDa&䙘ύO 3NyɵvW]j0 f\ o3[;[}ٕ}S;JY lk /R7Ŀxp56NAYi-\IY.RƠI''ؑh6$m> cni&;]SK萯KvEYjCmӔ̺GIn[3(KjPgi}uФ_ڎ(* ThfJI p8T~g!_ܹ.țqݸ!E6kGe4&p0oY^Y>2-({uz=Dydĥ77By",fSri_Nx?_<$uގkye]Ԉ2(q$pTOlɫY@P==gn7e<g\8%4K5ڄZ;Z:r>`&:BN visթk#B \boUFc Y~k1U+  @Ngi4S4 :`Oa gb377wྀ7-??&:7j|FOv8`!|Cɸ57M6CR_܉7P-!KL O?5ۃrhvA1I@.˱ctu?1EoӀUNZ2#md c#qsތ :[/YUKP Ys{[!2 șz((iSJtBx7!C p7L4V'`VWpvdM-4իWز}N-{JZ2YN'N|cp@@^k/oђ =a߾=vZtVxdl b7I@\F8~̤N>?H]0$Ef:9]K|ʅaRW0E! 0D`::V堉 sF F1~v&snms^b㽰\i?…UÞENĨtM+?"b4 łd 6?̤XUBhl?g~?zks$Qų5+Fz~SH*{7/+@5D<0 >^j8>b[T}-Zc\`=є\3s&JCF9X|$M)GH0 5iě#f@ UȾGIV~L8;76>0b=Yc0ҳ}EG7QRT! ,0I)S%?*!L!-MD£pB7j&2[ +{R:xhG co0$(%ٟSLs&:(^< 2 poa)7L*B/iVy!&W?X /ՕNy|&?cTu"TO* \0Ֆ vqA 7$[/Rw72QTHA;9rj& d?ƺ \@ji21AHRgPR>` # κVD.u$6b>\S$c`q5=%1(^ x{/4ACjFu~HpEpV"urnB포kUDf^6+;&xB$K=}hQCThxӅ `"3o0֏hB-!לbҶچ OogKI/l|6Ξfx5M<δκTV|Ûg>*(=gP`*frQڒ,^)0ךhr`=!DTsSZw.LTt>mtEaf^ob O3jOrlzodF  !FB:?uZIˊ-vx$ڔWyvԕhFXu/=c G',A Pא,(lpEt^jυ/]!`]g@/K@ƿَ%a^ū[+ƪۓ3k*W;"$N66V4)[]tXPlUT>dJyؐKdo|?"(J.H`m=#. ;SY(.6Sxt3S`7LSbfso? hRE0gm<UoA{Ъ}eFI/ bXMoCr!qY2dGT$%DkEDA@SL>&Mpb^ݺ.?F .sVܫ/n!%{"q XGoJm`+/ik=t*52*H[V33qegGxNp۷-avFD|sv 5#}ݪU>RK5Ni Ev4ItEb.٫Մ^ o0" VAt*ƨ3YhZ g,` Qm+ 3|H'\:PV*wwKd 2q+Q|HZZJ.Vd੉vP1&ǃ҃sy06x*έ8ZT_;$OMxo—$䉞mG zv,R5fLմyY(5=<Pxs U!Ȫ*WUeHF5s'JQ,khU~?‡wYDkǒ*cmuuVЕ ܘIMg@'wZrչvH۲i qʻ FZS-;,az$Zҹk>nc;ѣ_ZlLZ֙6O·, Pt٨Xb-7K}#@WdH8`Dֿ!יZܭd\AM=:WIDaǂpQpu~P8u "+1՘i#b~(^hlmS,{qxⓑ`6*Nr%ynCHGijgcGS֐*&I#h t-T薧=I3Pk>Sxn!)lX2Kû^3_ox6EnRT}</5ڡjRiv-?xᑑ#4HɾgW*C;/;<<, lYbj+SjaL)2l$|,s6`G&_r]0ӃZ".u B矜+f,N9Vo=s-}@)1)Mݒd:q&Fv^9g!2gwRJH?nywV+cŻ%e N@bgO<`EP}E?-F𶪙^f; E|.<&Ϙ֕5 ]A9U*}d{c'BqsiFިW!SH(3zXR>"[%w|Nm[r? &u)w2A,=U1(Ɗ}Ԭ@/ǁ]69&VJuxlh}sfGj/@"Ta4#5X\|76!f_AmE.^A͛(qxbJM/ ǝ xtQZ@'=~O(_LyEUrBylʗpG  l6h.i$Nr:wv;X}^?`9wSE)Qwץ 6H bbyn5CZ.匓H@ËGlZ/hm$Br~MHAS"ju^vL2GU?˨csFGMOw]վG 3h9}Ѡ}lzc!rt'Ko5AD>6[pFKciVOn.[\&PJꕄ፴\&]~yUdkӡD 7R) j˜  "2XDix8*}Ra-+VxJ:v+15)eY i< Լ@n^,pfb;KH,ˡ{ܾ'2~J$.\uO$>:&m8X3J-}S a&/BnE\`tɅh  pzL ޽F B^Fx'`Ezljny*Q͓(C[ e>˛PA,K̤T :6sowv(/ ׌כ4UHLKt#!$2ҏ*g#YJ Muk[*ϛu endstream endobj 146 0 obj << /Length1 721 /Length2 13718 /Length3 0 /Length 14300 /Filter /FlateDecode >> stream xmwL%%ݹݭqkݥqwmyo'J*[Y{TL]АVWbcge2s PQIm%܁%@ `caCH89Z۸h-UhۛY:غ?ƭ4 'u.H^w7mդ=llsUL>H NgDg, M&KcpͺGyS/@5 FG1}j+Y-QM*|!( m0=ŶqMbLWHs҈;0)a7B$#׽WS7,ͮN $mi 'j~'O(>JOd{߬ϺiZ ۏ`1g~86aiǥYCfGME,AEB(,܊+u`wG[}_QEд]!FCrrP_~0dկޟuWn4(ގrmTlz6{N)HK;vϛT4]dyz  o|4™jWT[f.G Α fy8=OgHODѵ1\ Gp0k6M:=ZөDT]9DGp9t7 R;~3'p=y%C36؝j,=/mWZ{4j0U_]vjEǝC'u?Jݰ<+@9h2 *,%ixжNq-Gc$dm鬉M/6ϛ31܅$-nys D~%ՓQhH{]]0HUfw~}LU poAJ$ HMwڏ<]>CƴyꢟIyC]4XPŢ@MEsl7o{ krXM, Uk7cYxKC{`uid|y_*3e6>ꍦ t`aiLdC0FM\ȔpmlRoُ;@azm0e[y )A5"r#&&;8I2eĕAB?[g{t7'IV *BD,7ʘ2CRǪY|@ɋIu8^5RE#w̎~-_0KuؿJ%T?e+e>m[;&WlE.CL|g+%,df}>,mc%3 㽑 @4B4wvXʰu!! % g4(^P_Ą vq,1x#%%gKxSrmsGpK2n@i7yɆ&loo 5oZ9i?}vچƴ+驑t3c2;ɼsq:~ndm^t&lv5\[m1lw3,KbvGOi*%8U`.&1WY=Je 9P~3#aruϑVq3zn4\ 2kٟz2fUC'inL~.S S7`lm;:])8md>4E ʏ/*L\PIYKRtō:ո遧`^rPDڙ׵ua ZVGcg-.Qvk7c/xн_e~cߐoMC 0(!idǠ*`4SXڥpu笑\RBd|"4 K@ gQM 0}KoI|R3I!ӊsn1 ~U]bIs6f,s x6vWJZ½2࠸DT­%&} w?cYc8I7/a `} `f9A$40k^:/=eRq-y4Xfy!ҝɌXi'/Aυt^uq)S7?@cap967JGP5>rtS9!@ۧ8JrHԗ qKe:Y\?`uK]ötI}O#o{jȆa]㚠/|˔BUƢb\ ĤX0|70χ'Ai )\֞KfE 2|CԿD́7!3A2(_ژN>+# pJ #@n9q-w2l>ڂ,Gs luZd0F[bq3 r̺ėpoKZG|8 Ihj}9أ=y\cm\hqTf[K:jngAPt,_J H&k qdƍfqBmb˖bq|TPR>[g%4v){xZ bwy7URU㽫rKL߿;ÜvqH':\pdX(@?~yq17P ;oH|`.>ZS˪JH9P#d0?VInbj"ebY_UT9 [8RogY~/EjUjCF1\|(>tN-7ȴ$ʮ$xa.4!"Hm#D_+0{Mh饠%&'G4N:dA.m3^12ㇽ#5cZ海&mr;aZ D&grLjRN*DKSIfnیua1ʀ۰;d ^ cl2d4 RiUȖm|!Bl7OSD\s-K8[wWW֦$yV&0~b;$$ SxΝ2\*zo[$~+g\ ʃnq,"Hwjj~g {ZQˆ0n3.bMLklAAH> r7)-nhO ) a WӖgv1kԓ:2?i,]sӟm7ڟXfN-d"D;5{O9bB\ٕ`13Vc7#$A^i1Vi_p)X>"j= ("B𨓗xvbS.Hԉ1ϟb;F3QI3l}~W؋\#3YMg62| X#!ZCo 2Gd+e7rgab۸̜=9 J͞mAJ.%f.`{&s w3(J(-5ӞvORJq`L> n*ϸ .s;)@:]n;ZΠOۨ#_=%"մNXL<ru{m+a|/.hhL؀ PYuJI.},Ja  aG/oZ/tpd-7>$^^(pedu܋܉)L)hShāv M4.W&_@R eb$CE=}Bucg*$)h.r: Ȫ)iBw͚G^w'U{Bv<qd{2dotQ]gN\sgjN=S#<)hTxZx贋G Zea929%YWÓE9S?L$VI#6%?&Y7C^7=cمxv@Q׌~Bq--"Ep2t^Eۺ\9+ę}rHK+F{PA1oY*`a?ȂoȥE;3~[`+Kx Ľ!SsLG՟AXOZ_-)\DtOJBY<HwP!1~67Ǡң3 G7ԥqB:l0uW‹F7> d)._ 4Ϳ݄BȘN[{S WS 藾!L>|9n>K#tVVU}QȽVǘI##Z )f~~_R(U.7djq?eZVw4UDh2Q..bYס4 >'$wl (G9FD>` de)m:M)j'u 8_W$ J!7 qB=1l*Ex6,}GxDi[ڲ'pDM `><O{D+Y*EK6 HBdbUV!U?>=Kv-ƚnX8~Bp-BX+UdK3M8FjFR|u/l!Wc3aBuFJMN`oŭOoweɫf6mNVi]sR ²05t,LrXSgҏ ż)?aTp f߂?𐝢+sN-cE>( C1#<Ђ`V9j@yBV }S} XN?ED}h$@!R(]AL߫Q[KW_5T]`5ƫ11"9J _5ClʸJŖ^ E:_+|0f1JCTHDIZb)N#a=26FqGq~OŐ.!D8(XIi9GѢu 䧿guD0/-!ж]g32$ҿy4ن=0HHk#0Y/ɞ|>F=چQ3F+^\ŞHP%Mvw3AV{=9Bx4+m ~Dl4{"Y<ʹ@Ax7+3z(Zn/b9d}+^+ErR{E^`@:T@B>BάU0'MO]ͦ>"".VHb)j)^9"y,e, O3ʗԆ0"lJ4Vך,vZQΧŇGyyz,fї9]1 fԱD__%5C(Z$3{_{N$`Ad,DoO=;Kjf!sV=U| iaMC6l-1SśBIf' d5l5|wz1VVDu_jdƢ ]2c 5D0dZĩ;<ܶi-i;1/~n ӛ!^C&p5WzC cvPLI QZ=e]c}h:4Zm %Ql (1}qWKVzR)H/˶]=ٿe([W4"vZRH1gOjYO l rI[!nuzn>0̗44 'V˷4ؕP]0<^,&C &h0M򝥖g6d˧:z̈́@ e*3n5iN fVK AqpJň\cfu%!`j*;m5Цs'Ktˬ+ < S|c -jo5N!h7ln'xLh$جM`4.6-'3(y6\Lxd R  .%)D~_$-Ƶ>zDB 5ޅ`JIhfs]I/ Ա AMU o"%mNF%g@2ED2hХsT!qcM$9sO@̪+E7y2Y>X5m]5fSG$l]GЯjt4_s%fY5 J۳qU[$x~`6)ޥuo/f}L s^P|L;/ xGdtyCD}ss ^F$/H 6~! QQM /ה+#m,Npy&ױzBa(|sN)3٧`V RᏸOC 0{ 0)*BU|C?mUâ=P *Iҟ O6tSoueϴ.e>3׼5Vm;1VDr3\SckLx^=s+l "QLs3Ve NgGD+\˕|~<#?v yF,,WZbS4umj:|_xa=-|a S Bdh4말̶;CN{bCHvz^n#!qTQJ\vNos^(6_76wN4ͻ%&`,AɪݲhCʢ\ϡ1hPD=-S.O kO َTp=:D1@]*?"Ui4xER{eYP9OgբSWo?(pFw8T95NMr&yaNen^5~LZsrtHNtM̆CC?|5lb 3jtrv >)F;b֚*^2r svTQv, o/!uLPDݹQB~q^2uV! ɽM*S|op6-K h"sW*+*2˧4{Qn*u*JXf]ټ=< mbᗈJoL(ziEgO&>:ƀWk@[K9e?hd4sutv|ཤ &-JSe;ข"t1 d]0gg:L})(,n6?YV  I5.Ln3i`5{ebW)98j@ 3TS{Jjp ?̪h$kqrro >S*.,3,/4ݮq*-uTeBLl^+c382s!rW~?w3[@h0O1ԩHbˀ5OW퇴ƝW^7YM)mYxELL_,XyQG7 Tr z%0_>>$mm2wC- N(XKZd'@(J@IfڻNAg!Lٴ{]J!.D]Y[ϰhUWtW_4gn^ҷP3sDG$olT\4 3yJ9gde˺-'/`iO\JԱLPt9%6-jwJ$v졿?B23kWC0? _Blwc!c͔ IQ 1>P?hYnNoC5 HJ#ψO* ȘX4 MyT6o:VM/&^`Y7IcbӦc :g6_X+Ҷ/nuNanT) ջUR|NU5\LK8 _LetZD`R%;EPsq8fwCDscǥkkFg"=0]33VROWS) riޮK!BR,s%lQb<爏~J.ϦcO0`pJgEL[K,$Oүq r3ΎbQ:mB0mb5ZS-Ak\[|i4#V tL׼.VT%L/:x^j#SέuhPž$?:ƨ#h>`4"RPv6+*H=v'ML*ѴaV%2%,L8bDiPsc8}Xes;,zM@S͜'VsmEj(QY\Dw37˸芌; )_y5eS&\QH hVu endstream endobj 148 0 obj << /Length1 737 /Length2 25510 /Length3 0 /Length 26043 /Filter /FlateDecode >> stream xlc&L6ܶ۶5iӶm۶m6m۶=sb#?ɪ̫2*22HIΘ$`g!#v0w2w2LfFF&2ҐB@ "L'%cc1 ,'GBV @)&31vз;X m&0C[#Hl\  [YPTNV[AYocɑkcCGeG p_J)W `dn0065an6&GO@C*?VVJa[k;g'c _ػ:KdoO&omn,$EY#6w5w367w{'gՌsO2F|a#[+w?iL !5%?4[V1521(9 7O5oL;94U.ZCi';dap m}? fm֐'"%wl8촞 2Tύ&ν2N+}3~1dQ2k1IOֻB[}5*,MSZ<$kfy})S^YG?8v£6J7>M5ҬYpHh^. YAaF~9.q\llm+=MWC֊Ni55- ?i m0{9RKN6WP͏gu71+#" vȄ 6d/ @m6rmNअOCN$Yށ Ltambn]:)ƄY2b=WϕM.V/iS*G.骩yC<ʄjE%q=Ijǂ:f\w/`}˳ FYA#wNJ ܳ`\gض/7̦ܶ<9"( y,opf#E}2#Y |ϲ/xIؙNXgb g,;%ڳ,@d j;{ۢD2-gh!Q"e1_): RP3J*_W*CM?UBbIIh5אa5p9CL&})A|O/E~ p$ ZS ](IN10faKC!FƯC@HޞY0+9ᙬ~WhT;*NѶ + Ўm7#`H-Rj aظLp!^|Coǚ:i%dzPX+E31 -&[ukV5g [2:~>caF>t7ݹN1N`#sɝ]wDUJ_Y*|v\3Kw;e(96X)ŴDOԚIbGԶgRb6_o knmہ@$$Y:\=nH H3$v\OzDoT7g QB0Q;{K@h/C~~b%5Vacڒeߛt%^p_ #}ĝ'jOBY$kaX kS|U"$Q):wTu?w(E0+,H \B5(`ƛiD.`h.2 Lrc;~C+?anٙxzq?b)6`?+BlGS{sA$|)۠_aV]Ü9G+9[bB+yGxtع EG/HGP5(Y9bک =sq{fA߈3vPMMģG( &\KD޻{`IQZ;gxj /"5ȿeUcM+15o+M oHn1)`g# ^i]g23- %Z1hhXte;Jr)刃-UpjYC˜uo&(Īu{Du6Ke( `~lZoG~> p tk?NylϼSDZ=<3\ ެMluo]6ZK=1mD_~sc^$ !__̛ɽx$![S1M\C8/SeM}>*%`忹\;ֶ*L=qM )۬Voy!aCQ%g 7#Ixs"d?gevhJƎ`,3h+_Ӥy-r tЀ2>@: b3H;meqW۶I?w~M4^HDŽ0* V. <dWKTO=+("8zإAo] Kh:pkېP>e|?t|#Bگ:v8nw ㇽVٸ"o*ō0ƃB ZCo}Vqȋg-VUd"m¶Fv~ X:Vљ0 Ĵ\E]V<>$ {_ ֑5&G h'S~e <(Y7ϩ ԅwT~^PR݅k->f.?xGf6\;w|z㮔YMy>cuj\^Rº`g;4+~{d=5#AһF^&S*T*̴YS2zO8$2]<빆7BF~YgGaԃH]Ԛu7 ȸsW#i 8ZE);j3j< fsʽ^pR ±9;X 5Xns^2_SMF|k)lj Zp`1)B u,suGNZ'#RH{?{:{m7=E ^Qęa0ukE_K( %t,4 MZoJ~\ _\j+?ͫMHuCu.q @15={o5<:Sq{VugvhvcukL,o,[$Q&ޤ rj#wKOm?Ձ{AH nb]K׋:j)83c:򹓂B<4˺H?8'yNQrw5~gur8*1^}z@{ >S=n9=dcgCA ?4{TIRnV HJy,v0 RSnN c%#V.|QG|dU;Xr<2cKuRQ'{^T&5EmB/QY8WOCTZ }:H;:M?*>tLYKҼIhJ*4W}GO"NuQ8oM)KXyluŌ"4H; a BCByZ-C`ϼO w3UFjj?_%wt9y~=* u` )$Wr"{mX!º2jY*P=j'`+[0*_ѽuO 3#Y`IYf; Igh4˜0/aAz(BP8^Ru?VDL;]&ɨ>GyVLl|t3-b# YF{ ч`hFmG\3],], "TCM0']]H;9dmR̩xIM_X~~&$XHcI4pk-Ǥ x~.O$ڣ"]tɿ{ o1 M$e۫!q]tskm)Nuߨ=G ~/py2 EY6%\Jć ce?鸑JX:D9;IF{cJeʷY%Cq"&h0m*~B# zz^ho2Q͌lh +nKͼ2_6夥 bҖ(`tϱP YR2XP3!O6P FR;n3 <5:Y~!'/ߘQ6PP QX㓂wN۱I'D=t2[)YtSm6fqiC2; wEDi"@$&_؀Θ˛êO,ٔ01u:{UURgpf=듭cȬ´spfCwa.4wu9O8]e%\f:6uzWƩXec7nldT`ہV.u9ՐR^AUS-s Md<4:? f+.LH[%ѻ+ēqJ%|@&KՒ+-޴<=g $RF~[䬺hO^vFetELfGg*dClA">n+4pW1J"0zAj [q:p2*ܖ| Dz<̧56\um:~~RY2 e"`krpƠY^hXsnZv.eKXvbvIqlqRUweU"\K\?/Tr,ou iɳlcgwLagkFNN32&䊱֙ץ̐>]d=s>}#K&T] u#oE]ohvxKnkSCKj[~볋P*l֌1' t7"h]FT(p1^U IR {ĽXH4mZݓaA]LiK|!Λ&KXL_9\R.S;्"][վE0r46L}!$ Mgl:z(*EwDFG7ߗ1hǿ攼0=:ݺ󶮌 $Ob_6)u/,@sAIKXFg&ZnXI tP BۨV<d~9cjxReUp+oTnnW)܍5Uݓs#nyn'L[#يr7E!7ܗLQa$ȏ]%[a0EKr_ jd_ mrS+Z,cןKd\{Ӣ0JۥЃBBFlE<$KݰCήcf2fxv${kr-ߐVB>lXkv(Ѡ(VvB{3o:] Snc V ̢%{jR-uQ7&Pw^`Q-mVe]%w0]T4t {VLqX'Dr<$NK31њ(:52!%?SW/N8d-^L#} DZ=> T/0'wyBtxvkqAmdSlZj "*F}1O;ZhtvDr/c[-9E򆳖w7hmd) JȜY\kۮԗr~3"y)9VB[C6/BKJzYQ}y㕌$Fo _M1NXG22P eŧxb"Z#j^]4>XW O}VK31S7<m5[MԄmS-JkiV*PL۞,Gu%f6?,PmC6s&tUSÚX2Us7.9Eк}R_Uk\g8?Btݧ"M%[z Zdg瓇jp$C.99sm Z!{=Г>4Q@VQA%o~]J o m< d7\pAnl+q$>b皺,M(R #Mk)8!-9FBI-BsU TERg2pJ#|Dxodb5S.;wײַ}J~j""C "ܾDw4UTk}x0f㡄-Gٟ5n-+L+?_ T*]S/դ8bݩCte8ZwVd;2ڸ%]Vgcմʗm2d ۵fLFny41lR?kf=Lʻy4}VIׄjzѳ:`VPL|3(*2]Bv?#c,.[¦GG<_C;6=MB[[3\T.Ņ dATBEdI/DsXulx߸׳w4R7Om*,a\ 2 H~ Ou=1A~Z5#MG!qN.Y @'褐 jzrym)ܔ{$ȅ0RMםY )h՛F!ID%m]4^srm+E̢/a"䖓ݮ:ル}@v+Oi)iR?,z.\g-7ქ:oHw)l}zBh 65^I9˦JKH3P?ސ= ׌''*k>c gG:#j*e+fN}~3AFcNj @@"3t~C dM**x]{3:8~NYԬ/2[7yU52: : ǝU;bSI3"21T:NT\{[wwΕTs|(j 2W4u D770ô~(5,nȜ*clH F_T v \ gitaWs$=дhjMƊ ih6͝ho^Gu e9(fw핪KRfpdts%l1ך0s%Pԕ!G4 HM PI9Kඒ"e()!.ޙ}-s!h0"4U\$?ߤ+&}j+!Z@^Dɚ!K3mIQI@}JtS$Ǥ͵3U?r*P;D1*Բ)"S$-` e>t4L$Q:,4&!=I#V:Vږ({t{6\b>W +nmJMuba Ghc>+-^ȤJbesޑo+;m׼Fcu \P=Jy.2+ V&-B#^ "-?l&[^\*~ODm`غk{7y/U_srVeF* Sol%b\ e@xdzs*}3 ƚYpN= .J<5#9BeOL9}8ũ)~*e|d}ʤ/q]>z1ALiUb1.=*[,jS"KG1&qkzؐSn8[O ͼgܵ" @iKvɂ 8SzANԍ r59L4VR]@tl uϪ (h3Ua=)ԑ}Y-:>t~K!Br&XG $C)gdO3{.| 317P[4ǙG@lldI $nco?P64"&m(L6rs9kw+9- uO\>T&ۑ4=_>c,`e|p*?^I>!J4"ȗomNh!9ޤ4G;Aܡo+vHI =02<[ܲ^!.qh~Mኍ_ {g6 J1Z9ɯmGiF9k͔<84egZftc$%`V-X_-?SV+lYA2 8> S lxB9^do$ѝ㞞G;Bv'eH|b#pLiQCNCۧN f{pb`D G=ݔJGг5"9niAA &H6 l}6܃ce'="\h&UaE yT;OUKeJ=4'>Ԣq6xZ_H*~qh׳'m~mM; "݁ n(.y䒉*+mU0A|0aΌ53OTPAk̞ L$<1yu[rfK 7^yO06WJ b*;$^ jOo~EN|I7Jl-ڝҪ6+a%myk-*:.ӣs1'(O o!Xs$~]}ewxBx6/iOߌ]\*F7Y{N t"f\'* te3 g8#.S'Ugk3B" oyu.1h@I@ Int`yu߆m\)Ei|vV]GZJ-2ǂ<r*pКze!Nr1p5mhIX'_CQ "\8GoėL r^2R:Ar]tOebm<=XfkA v98-RJ.[?=SSʓrĪ)Ӧy[ zTtEÒ4bey7a˼ 񵑯^c/cmyO&4s3D,қ3Mn4+B5?'JeQR[x '>_Xw>xuɚ]#3{k6\ Md(dV=&ԋ yʐhB;D~az:#+}$k6I,+po)1ޝZh!a-엕{ AK/&E95+2%"muXP]$qZ~j0)o-jdC:qI&iLY"(nO ò3G $-E'P]F:U|"Ah D68E9.hWT;J1*mv qT1:~EQ_=C!q[&χ''z xCdZQ7r]IMO`oW'z( NϧEnS, <53.̲M ,s:xKو Vtq 0I: Iݪ iDJdg@Ol0em7UNB/;iDrZ#/?;l=g d4)"PƓkP׬󑤆*Bz|I%:hTSA?m5gC#s|x9^JO! %N^ ?]NMq(PDʽ'gs:˒ YmJ96@ Z@SRE.-H%CNfH'|s[>Xuߜi=!_&3&  x?ӃRu:s"0H^h-hEY(yجJGSbv^Poboă/I*_f0j*2=lJUFW-PPתI鬳7/eQ{: >WE8Z6}uO+R6ͼ,Aƕ &}FʨڞBTG7{X 9 `CRKoE9K1sj8kebcY*vه1mF;jU'r͸x9G71+ c\L\A;JkQ;ŕ`vTh*dgTe]:+C+ l47=>z:XsȤHA 7 $B(ooZmaE)\l,'+Vlcq K<R4ZWaNgρ(E{޹w+6^,:"r=4Uf7[{𬎶.@t;0=\!Y#Kdj-l@HMni̗Lv&p>7@ K z#$J&89j팔mw }Rہf:vkA^7"F- *WEydRe:"w%ѝa ST?tԉ4ZClu6?V_K, /Jq@E~BQV ]-`'G;"o7}3d%!!gh\n1x42}qOR1 ~p}HIz7$Ǡ"YnŽMJqňKW+:q wH w铔i[x[q/3M ~uZ.7'cЀd^>9qnX%Bp|e_9qHpK3"cS3+Θ KL7Rn o7*Tay"!g'(EKIBLFh#G< [(ŕZEHq/.S/ ?kF2XiQ}* tNk/\W!5r)l6D*NٻZJl߯#?ܡ[o1MG&Rn8?]]K8Wcѕ9$_<-/-Z24L.6f\1=yJnx\턤|0a sOP;,W2SuCť.|aP |6 N,:?]ZJyMՁBLdj,z\*`Db;t*(R = հ+NÔ%冻£7lgՊtE(IĀ aQI 3[jL|mQz5&$a|c'+wzPԚeVɭ'p0L?_y/Dn+@d ĪuiW~w5q ~5?A{ vxhđ pV% ɬ2?!6j٣ޱ Ȳ=/HVzPB'\QyǺFLd~eRoG}g24W +(Əc4CSȎMel3׃ P⋒b^jQĊ0|,U=%8x,0I}8j&MˀM|? QVa&SOo!Zlbo~Xz"|#pAA$ }@yFlŨMO~)"!5 შL!ů#呫x(B`IL^q A]$9c6uתg'7'Db]I|aʠ܀2{?&Z @ٮMO&B>Ɓ>1|ڌL0w=SI73Mq3?v|k.`PsܼJ/͢ZOw8 [cE2])fA;rY6/A09.SPi [IʼnLd#'Zrۡ脿Ӱi >2Y3b'WPDlyPjfzNȭZ7!fTЍMr;Oϲ((%!xc& K 9ΙS^nTGޙiH Nrl)fQݵV@k-͕$;+v i&8z:4$Ě&QsܠYp}w^ǠP&Ƹ;9}Bm!ct/V}HϧGh}S6n7$d狀Ӎ8f%(V%E>`u_5* {WGru?ķQ`<2Q)͓k&*4+>5LG.{tB >p' oĭsit[4mJwk*ils}>kȧp4$&i?ÐZ+F͠`S5vj `8&KDmۘm۶i۶m۶Ӷm{OKUtoQNft|Kq? YA&B:Ǟ7~pkml|fi}W 6Cȹ A9Xu Oч\kQId3v<; ˱PʖBgkNƽI(?AM\'yn!4x҃̿}{~}[wX%*$I#֬f2IeU!0^%0cgc1iޤz c5}7PZ|g^,[xj{mLǭ2/Tx;|v;+kyW_U֞G eyH#2v{Bg/fM wC6P,(v=C#͙]CN."ЇfgxP%hbV1$'RJP=yr tDE.Rmђh /V`KBE4e!N!_..wSa?Jڱt 4ZG|u@-x[34T;uTdT#$6o1)(M$ + C-N,yÍdɝH˭nw^s86|. <ˆ3#yhMXtsMf3%ϏLV%/6$:s .1s|DXGS7j%'7cOPύyɸy/!:LD}^|VC|bvoZspk̽͞bi3_(%/l>ŏj}D.XR0ߌ|Ԓ(Nᤵ/_be.v+28tT=a)A?j]90Pm b42 SKGmS`C[& \ǁZw{{#۸v@^sJa׀l/JYOԒ诨{Cal!OYSpQ #P >OeSw۴$< a_&Z @? }Uz-%֣۠-*Vn'ժP]!M' +n 7(ؠC/:c8. ~O'Q-'1j *P% ϣ;=bʲjtm>/F>vqgO >EBE{Jt{r򫞼 ;0q q9_/oxV}_=jP+*ۛuP؉,kG2@pXF~X0RHA/Plb}:y>!MX#,#iߡ_1h甶mn\MtZ atߥ}^[Jy _7O2䱁3VG-O/.ca-"{򃜻]> FCu*o }W8a"3zw^ZD*rUt,n娂d Q#p-K/YM^~t05|-a V _pI%;b})SH@@{ܐJ 05K"_j˭_MiNIpn{:, T,EU屹?E2vpv0 IJ/1G)QuuEۭX5㟯p:%˘ZB%3j@M scN: yհ׫ܩ,vQ"l, Ƽ'Ց!7;04BAro,FIs$lT/ /ókēV螎'\_ 5_"ރ$ g8礦,N]V|^fshˡ#BBr,\|fH;#q`":xuHYYKǍ &"$y2PrCӔYjF1:$2)>>r姥-H%1@M`3`wsgW༻EeI)䓰sQq!.g/l4bLooDUlO 85ě"8OiOl=̳p7DUg>@J_XgwS军<2O~ӎ\zedƶr-۩5u{ J{cঙ0(3J{a0K (,-|!*WF\'4~pkl4^ eXSKdXEH8۹g7'TI Ot7ESj.-,~: p[8(=6XC4nM@}vDCD<eL֒գӠiFai=H1{ELKStDIq'թ4((~ D1^= ?MfZ|tb}]Jɤb ֯sLf$-1t!fX4reڷ6?)^f=]bm$u  =̈́JQ|HYg٧B-=88F }ӈcXO; uDSw=s1J]->0{ڙ7n4" J(?E\KKv\x`|4r]/ .מȺ*=Jj&% IwI7|:3)QhGlBĆeU^d;>n/6wX8:ub1&fBPy=3JY(24EIu4\v0x :,bS2%xjyvXQMhT|y Fܲ튞I#^vq "9bTp;y6ttnƄ$0='k}n@<. dHUrav~p q) Q eoiLPcT/bT٬:WÐmɹŐNCNT~θ5 InAiIJ|b U(J[\j_K-:ISc~"[" dA* AghF`R~+[JfK`qNY` N./YB>Zڱ#m]³/Qg*~R]u%"75G!GPIMe;VNqթXJG{֙ >!d}^vXD֔f``1i!>J ሞ%Ԏ0p H憊̘b~qN@D+\D2_uHrG0W^~mg3&5 Kڡ:*=,6[oeF,_?J GrU1iZ"eY~8elAqjc+-}CF=U&1*Z4<Õ̹*U@d7okٺB\}DI((k? 4K3hS~rD nl9젊r#raΪ:M r\Y1c%ވ"X1euoc{|R A @~m_6NK ܢfIQ> O#u>cEd d3 v1K{g(ޚDNcvϴ8M(` }(NpgAD3<)W 65O'A 8 \ĈKOt ouIC쾭C#'oܜ֙"tSi!7 N!޹me%m`BNL#6g#KY'a}}a R>y<(>]X./xK="&툙A r\vepBJ԰ j:0"ӡDABE.@%tU 4kKGe2TW&&P 'ǭG2Х,+A^aǚ'Im=mu[<wh ߎA!x $MˁAUJF;f=[e=Z| 7YBZ~08}6_ \U`ߵ\QOEmF 1Lw)3lSOBvJvqbυ u iNAEq]'ro9qJߛ\{UvWT%Huȸ\?|, ##?Ъb./Q/qױ(K6ܻHa,RximT#2EKv h9z?Lu('H} ^\s}+YݰU~nr9jo3gs aڱ}YBW} XP4#X)x"uBӢ%c8Mj%qʇ0eȲ E:p|wWN? l* T4-V+r^TnD[+ 1nrPXu^d)^J[LIg IKc(؝KDlAg=&7ewT૳HZ>ո̺,'Pmk}pP\}ֺ ّ(àQWh>()Gq&% (į)q( X3s4jx[ ('bŢ7q@P챀} C)J BV;)kEi! vYȤ7&"~庋-pp+26EWgcfCCY*Y)QeA`t]ZEr[ ZLU%3D̷N*9r r E83!;͌: Q}'g\OQIG&mu`׺PyQg Nu )d%4-\f x+5_a+| ;+" o5["Kb$,HW5\}K[5tvΌ1Ԙ˩Ԙ y2jXt"B̬6ϩe]Vnco]C0~lQ S3x&j)dg.,b&|9xIo#vXHcxEM߆Մ!)>MGgәX +XWdCvm O9Ⅼis36Þ iž50lCAд/4G}Df9Sc̲ 0Vhr쯓!6%3V7Qi(5uhY Fϧ$n$̀' 1j:z#D5H`Z`搜{5|j uq]C#%b,V`LR2?DMF%pI^y92C0NEjǟyIȺsD{K-pcMlCL[[=A*Bv۟ء9H~{ۍ~Hqov@DryʴGu&O#O齘O1t4C |7@Ccr"ŷ 8;u i;D|nar$2Twe h VXCg/qJgog20EnMbT{&c,VK'ay^4&qE2H\m/IS؞1S( qWqAU9bP#xޜf8ffDDڹX{ \@y)ҸMLD.S䅟yt?!3 L吳B#}Dז[Uc(TViVƌK1C%1%/+׏pLgG1)E[OVk|[RRtaS}PvFJ ,\ D{b*M9 pᙯ[hQ?&ٞF- ADNn(+9r,Ex2+9L؅a6-@0x`%ǽqsKM<ތ>tLUj/Ҕ6SX4#*F1OO{v0~Ax}O 8FJ+!$`#40CyM˃y8+[~`zf Lx!vBx?NyY E#ǨQ.:1<ثb>܎fцW@Y[$_^`'w|. U b^$LQ;4DPJ_ޞ endstream endobj 150 0 obj << /Length1 726 /Length2 18705 /Length3 0 /Length 19245 /Filter /FlateDecode >> stream xlcfͶ5e~ʶm۶m]m۶mv9#n?#39ceD&))#-#@YLE@ MJ*djbio'bbP75(:L Фa{O'Ks 1心5CK[K'MٕɕAʦ S)@X^ASRN@!. 73u2(Xd,MM)fN8c{;qr7;7S'9dEUT*C;?\AX:Z6kY'XtЌKc4t3'l?9@񏆔SЮ66r a{[WS'@fhki ?qKg1KSK73GM;&UW{;?{Uzu1iy mEM,.(jd -C>.Nm5 ÿt%$dMefb0df/ƮNNv.VRw7zCsXUQR0Nj#YY]c?`]J>4ƚžLNEF`-&0~WлUò5}@5ŒsQ#Xʋ$ePd'NK kz@]8gZpcw81; (4LPdȡL3&Jibܶ۱*XLrC٩ⱼm.U!6C ;l/q (Zӥng4C^L1o޼quX82Ձ7غykc^1stnQtS'/,v 홽k1BG;cL$I]e7gx4dAÝm4~ PՆr3fIZІfH)?vѸEhv 5S҉>nYs/&dZFЎ1gnsa)Yz% (6X}]*^ S>_-̦1o<}T~[KnI'SIDJѣMœBlyҎk18I 0e$6a{Z{٤Jp<*J_|Pn+] \P{/N# mT<\`= H]G di|QkG۫mtu7IHTWҰz 4y\={[**eٗܝeX/P(M^u*t6`@ܑD36 1 bE7%8HIGCt(L g'e@Z<-(Vյե#S/_ܐdJ{*$ޯ"ݡ2G-Ԙp-gQx\A"P޿k5;5tSu9WIk~JN׶ 1BQM>_gz4/K7Af !GLxK-$-˭u2Q$ !xUmg(\^p/YȼG(Ã$pIMiA,X-/Eo9.UFOtso ~ԩ c~PՋ8=ѳ@)I o('h'H ^GdCp3m b*=1PL"vЪT{ɇDŽ̋BmΖNZ2kZjG8 E'R!Ҍ ?&= ^δ'Jq80XkF{ 0T-] ]<.aXi$wO*E!p$bpCPKZA7eo:{P.@/qbm_iw[e}-@.{jkIu@[4I_[gU;CFLFXv42 3jvk$+dDT1LH_Qx5P*l C! 3_vD7<9sqABlr8ƆvWg?1aMCcfDPc.JQ|C8P.-i9˃Z_|7BjkYI3-ɴdPk9U9[8u1@k%~g:gC4='~K[G"k Gʩļbmo<֌ִΖj[;r]6 efclj~]XFx!2bhhG`R ګܑ&˓V;u~#d|&ul4"| /GP=7JMsR:XMe_Ƕhu8R5z TcN.D7M1rE@& c/]^uȻ_bTnLEpʹZ('+t͝|wQ,iX^nS@a'2A4IZzJFtդUzX?(? V֗΍°0K}acAw#nb<=滝>-أŖXD\*>,ѮK& I_K2g{3sEF p{{6G/؟UUps:/XM:cgפ|i,"i ìm2j*&'J ˮx@.-B\|t)1\0+7؃Iw+@ܐQV9y 4 8I0)t-PW86zb)B%3UU0Bxd2s1R]IBH^.5I8vP:QuQd:f& 7Q3^00qG <͞wP s/%GbX\2-!:#mObjBCO5Gb"EOtЈqD=Vcl8Ѽ`P2ܘF 47|#c7cfKahWƁЬA;oN`ev 5_Hk=ZCQT\Dϳm%/YՖ'ojU!)Aρ4#_Jb9%' $Z&/Asrieڳ~:a+kK[v VOYBq6#A)4~ _[Sfӄ#'>O/Ds d\}@ay=;7T@>(x%'>A.p+Q}\*t8LY%)oUƼ~RD-qiɷ2R(X~ 4NF&i-mh}2h(DŽ-f ozPaDޜ8~hd Sk\sևtUΘ(Ć2m2A&/+ 4*4 fltqb`?㕦.e(3HS,eX6#mc\&6y0x>NT~bhէDv?MÔ ? ˘3əy\Q2 {GS5\*j& Hf23cv:^b-iO -ud Ĕ;S$@NO., {Vah#k1alALTV?elF(Ѳ:FO}YŧUeUCDIqv]Sgԝ+G%c⤠79"_D%4!Lٷ/l@JS;0/-A<lX5(-$ܰU gɳJ5AĻX#Ң|ӍBź\wrV8J9˜+G2)#Ҽ*_JcpܠGZ3Hgm2o5~CnsxHvbS8Nzd RldyHf(Șv)B /AP3NG[{d5(gsDU P(]~)apݗ'GT//nV (f0ۏkI91qSɌT~5_ - 4" ,%C,}Š-]a@7b(6/1 =ؾ@gZH^?Ro`DY[+NX"X!Y&t^BlPnxS=xR.3GΉ+5ڋsqTw\ϺnSvf=zoW+BbX(QEBYPc8xd7m$v'lZqVAH a^u򌻐=PcIc뎶Mtv"fJdrdk >A.m ,xh,=xƓE}I Mh~,]N`=7ܦ(3^<lKW߆̵#(>72`L[gkAŗ܉ q8.tO~TjTP% i=ۿ^#^w o.{"n!鑉0AnJ~ AT!$zNgmO "t6h'>>G,1e+#ox`n*{`Scec&m9N@DruķO yufټPuQcbĚa,UIN3f"֗άmx4 n{` wFOeh/9 S5D/o*‹dԂϱsQn6Q]D(ӥ\d$ gRJ0 /X gR'ZBwC4xj,J_Q`7Y.hxr4W"|ӱRm+'ԛz] ukHV ?YǝIII<`i% p!7Hkҭ{iRTP#ّRY^.jiG^+ת xB%9A}&\gʯέC)~* 1?p禑~reo4F#kL|zϑ*OuIJx r6j 9v P.rjg! NWK1L`18$͑]q 3{q;Fh|p AYN J߮5O$5<e;U(!_h)yv2ʡ15CC^}Rn9njujZ\=ab'zB.T0s eLkgmȈj$+G_v-)R=73џfavϜA͂ʐ @ujÓTEډqiރ Gڈ]rEP|<'w†_7U \r#*NiZt;Ƣ4U ŏȚ}njhQ9Gq#C:Ke(|}I˫g0덄?=Sd]D4k¦$"W˅ɔ.*6b,}ms <+'r h1V|$$ܓg>y=5ݠ%(jt=X0QI=zԭQJGChQs2aYm*$ނC!1SQFշ_73`=aW_ƏQ_u SCo>uICbRѩXld5BGr {sO>b\Қo)=qgk[g]qw򹋊k st`HjtJN̵Q:?\$͘$F cK&]-S[5T+f(,nZ?qp Ɯ5c1]및~cfR N/~<%*Omx9`8f?d[d~j?IHu}0]DZQ'hz  SFuSTj `\ci#.d(7u[=d#:e䧘S;H=C$9?2ՄDg9x{'0E"$ ];qSmOLh* Qj+U,}[_/rSceEV r( Z:NB 䶎9χ=Tp7/ҿ6r5$A=zΆ7EsaWoP kn! iT;]F5ؙ*~p=*5Ӛ&c"y=xp2;6<#Ɔr* ~ʀKV >oj{[SfЋO1φ grKwH'\=UQBN7!|FyCʬ71읬[b%ް2VxYҫCG6W} lNj^wX =qB$mŢp zC[~߄DFbJyD++?#P#|De}qYFJXJsF ڜ`B$sj 1ၯcnij93㹋q(IK~ҝMV‡7^?!ǓK\K\$̒? 4T@T/7F-u8mvX <Bk6 j=_Rr6CZ ] \6wgDR$mRgBd;[2T B 'gHh8W7A'9H.bvLmME}1 e 8 JtSF۳ʑ_љ.k ]c*Cmt(FWpߙˆ[+2<ʸ-tIPv$kiQ GgFzxqG/QrP<-[a61Yɒl>Z"?qS2z[{c]R$L>ƙMC/蟈?J0ƹH?h,S~\(6.>IOfK۴MR$s#wMZlݿ K'@̳ùwR-iPh[nB5)^N~Z)mL 2] 9 (ćdk⬶_!e,(sRM!C`V~~+ԱD,츶x8 mx^&lV@V~0pRuIp޺]tJmfh,Lmʖ |R{E.%.{Evۀ[)PGpwvEh:q JŀQD`ZZ10 Gb[LΝ=a2e qvJIqn ۧSv&7&nMQ.,LNv}\V䀼#EJv˓C ʮ378qEZۏIECpfDZP说C;3:_vY36$iGo{_}-*@ߴef]MLt #«f(WP 1RPc+ -p{ZQ7nPTxTI 9)ՓR_geotUO Eq:r>W_fπ)0,MQ60?t 7|JLVl=灿iиnSMxQ0נC\2QWUI8etMoȣ`:guGh}U NHCƄ.:Qz+m拪`$`ѽȕCVus4 hXuYMeS4x ~jA<l$'O6hUُe@R$ D`mFuj60.qNY><nWҒj/0oX .xTt^:]![SG2DQp6 99ڰ :E&c*)1,:;1ҾX`*S_-a2dtd9mڽ4@&sY)ϩ7VudWB .;gwTc\?!tځ\Rt #$~}Kžѥ@!}9{յF}.*T\i#՛_&+O}\V>h{iMBLAZKӛ1 xZbq-ÓPŇavN<6s_r#j(x@$nd'tJq ~ՙ~[u/!BĩCt/Di^0NNJ e%Cd.#('McHkQ=V]XkyW18^4lEкqV,t#ܸb^/֕TELZ4V$agR"Dz:m:)ŜɄ%jo tqՒ0ȉ쵶t֚hhOk[yl|;>+K"tj?wZGm!|ݮ!EBOBb@FIb}} ~Ӗȗ|4Q;w,ĝ_jv[lB4 $MA{醖ؤAr{ b":߯+7lEGl5x4ҕ.R(smU(i0׹8>Cߦ0>*rpcѸR]K_+)%X1J` LrKG۶+vstQWjIKgO0.O-(LcM 6 ةD9pM{Q$ ΥSMhŽ8-ffdZ1$K.< 1EQp9C k1Ny2DUB_35f7@Խi Uj2htxX;@7GGC gvdRZ e ymvL& HL72Xf"ݢ^PHhB.\l##Y2? 4._vO %t=#u5Q pxc(YӻҼH)BJY(Y<is^_G4niOJQ7-J]|>:w]ߴ+N?גUT%؟t.]z;#als`M%ni*o"ʉNdgԫz}YK=N[\q]؉B#4R&ac<ި)(A}z̈́ͧgs{,?%ytgSfiֻ?PuR,[XS#؉o;O]Ak,{ݖڸ4fq9J9F#F? oBx_m.VSE'5wt{𬴖H|\gCFx!6d#z'dH.pqWmd۟nnᛟsmfՁP$\+-Q`󎿂cEҋ2>ׂnK+A;"bS_b1{$Zum&4#әU6 !L~RzIk*7"D.UHP!8,vjg+f9ILE *d wc̱OҲƓò}aֆ1#_rLn,F-东K'.0j`أ?\@m.'roҘ𴛯]eWN/8>T$=+|=*+ҞHuG "Y=A&rc3n8{AR<[G&oF<,°!=s>mHGZ=nj-< "2j]tOK c=Ǻc䆜kB$+OXFV{7oL 1-e#qgHJi㾉8c~/ǫoT6m :H_we <V܌r- }z=j)>zC_xymIY2)iP@Zqd&vc*>FiJTDqO"6Gmq?k0l HgBti5m3PG=IMXg ^CoYw'הdȗ1Z]Z?: $4ycՇV!XD>! ȢB\sKq6T' Nϳ Z2|o 6K(1쥖|?)F7cȣȜ6`4 m|ښ5j ١,͕QҖ`R1cjְPWl6LH _~#֋ڞE: ~P{8jT!kk & TԲ7m+IT+KylA2q!ad MP<Ղpzup \NX bߩ){'!zks/74 Gx;w,F]=EZʌ/0,Ջc1-:@ w{Q\|ŞS;z'Y#m_H-pSs׎tL_+*lَ|1 !M/"+˺DT"eT}borc/1#ǯ q،veŐxFAď^G/%fcب{Qf7;yeK7ދrH(jO֚wNQ^Yvv @u~#" lӄ$fQf-mӽ13A5/h6FRZiҘqkESɅ)+6^ȑ$9-*OdwلQ ^7Hȍ"ԩrj'qoY OADƧkBݦ n<{AFtCv).د~>`ɑl/?|!ުyU yG;4w>.om=oM&R!ɳ#JO2)2vBU[6^A/A/蹙_;;&Qddhd5o(1=M%4 MRBR"i}28".[pmӗ鞮!`O<1}O@VNAkEdӋl.לC@=FҠrΊWju݇$˸/y1~{Z]g$[͝hz4"wæCSѧcF2u5orkE @yJ11C# W.ϾE=dG3KO|[v#LMJ: @]Š7.%sLZ"nHҹG7Ǵ%l 0>iv Qϋb`Aմ 3x~&E>V(^:dqҔA??9OAvjjPW8r8&<py#eA9?;$jZ hJ`t1; bȨ+om< n0Jig`C+P < D,?шI.ٓ᪪}M1-`7X5F!z(IJyiݜPSv$iND?#xe#\gpjU&\T endstream endobj 152 0 obj << /Length1 725 /Length2 31160 /Length3 0 /Length 31688 /Filter /FlateDecode >> stream xlzcf]eڕvm۶m?i۶J۶m۞/bٌ:;>bv*FZF:.e1FNV:fRRaG3@`B '`d"`b``!%p03w&0@‘@؜UɅх$e@`ja WД'S% \- d,NJS;G(v&DoG:Ȋ˩ ӫښHnO4_8dm?HutDH`baL`0ovl1 P!% hkk9C3@hK/-7#$ !Ccpp(X8÷ ?fuF`bbt?&vwJzbj*vۙXؚ(;çV0O;鲆Ύ tj]t_- -3##3+#3ku7_a֖팹-ZB}E g+gR/3Lh#Y ^a߫`^H7' u_+|k԰ln"3XH9"3Fu#nǯ.<ڊS#gj}gC _@vnH ô,5$0rDBɶ]+b6ﯘ 7uG!" ox7eqo ?+yT#㶞xY*:}"wg\_|;D;%ݖ% d=Y^rq_UG-8MD'jLv<+xw!RJp0`+0 => ;mkJ+g~zħ3 c3O_uۏlvbO!`ldLZa?W1m#]EE]~Vq8RL뚡QEVڟW1-۸ϣ^Tߓ<9yXP3eJoyBĊ2+xXXkLͲ6̳n;r1UY{-R&? iOv췀~0o NT?֟@g3qDљx"NI^Y b% >qGeҝMa/ Y/PnvS2dKnZ]_֤ʝe,(9q*{xU6;I$ֿ ܉l2CuQ3ۖ%kǖع9` U_T1O;?{"hCqnfnZV'("sWq8s<|4syDms(֥ޥ7D1 R{,ꦈyԬoڇ.,Gݛ4Î>2H55U5 Mv׾/[*5m Crq_AY ;6t2*_@#-qs"\ LR:+:Xw~g!XՃA/7_Le)FgI:$.|ᩦhNdas;7#h,{EQ؛9Vcn͈^x[N,F\ 2<ſ)2f9Y62&NN^FP+R4S'^8C} ڪ;U NcsNLBM4WffB}$bG.SK3к(\ibN6Q-\ })HAaL"O ⋬ F\ N֛ V OmAҮyĚD7~,>FF+{1Ydh]gCvvvrs kVU 6Aٰ = Cp-n,~#hH"sU9tw /(Dj,J҅: bGe䞦EMo+0C\F|| ;TUQRuֿĮ7K\P'-| 0C ;YTh~7ź3ٖ"ObUl PFbӖ1-2#$G1²k{/(QxJ1lokOƭ5( uXF{-$*tzcyyawtM@#/_Gfm@~E[L0AĔ.H{Ƥ5P0ǾʕbghoxEH-W:qVF V1ޞzXqf,엿]Ux;[-D<@TtKgiA!E[.Ac|Џ;WÒ</q=bh3E7zxJ'/~W@&V`AFbSun$f.YQ\4u%nJpr2gokgat4:_#I)Uu_#raxX6TtFOUzG|Q؛=;IROiv&O>BsQ]=K n|sS1q_uq9 `YeE)bjęS m|u v)SQ*.M3D58f7 Zj+Xjr534˰B+{#Ez6ƃQ+]ݸ L1fio#p%U!!f =L{ qE/a {d.m!M?(Gqו:.v4 <NJ>7&ό aٵibʒRİb[CHlvЃBVh͓h7C;dW)/Ct-w<14i8VCwp^gaFDbEoھzx֐R$ώmm:4p, 6ᬞTS5>?#iӣa24RJE+ti37ޡ&&ܻfϬkؕg %O+Pd !TrdA$OoĈޝ: w8푠. µb8T:GlLpD9%Ԙ=9"#4M#07I$Q[Y5<|$Bz-A^Ș.wf{҃6!ky <O"?@ FDZ5>x)zu "J,|N)QQNL.yH%Dњ0>Xex'DyΈ%~{c"f$D5ƠBVW~4UkqTLTBVag'Qr7^FGӱa P|S%{f6L\?j0ԻΆ32?,JU;C3~i_ 8{<钪}R i1f2#]=*9ga7rbеS NA1chOr[0dK\Y&M?/_UlS+3|b0 |$-USIR_;U{,6'bHSÆE,_y,ĺcрC#{z,s[Խ!S7|1{g&#T?/ٲIZ .2ٺu)+'V|éЙ \LҎ:!T SCD?I➪?$pe >Uk\ͮʘ(70aUWz&5w\fvtvKϩz$Cs춢Psޞ]DE'/ b  HXhm2QoT OBߩC\h&qQoʝj7@;Weˋr3&ƍЗJdFhܫ G(EUsÖUEr(@ 4O%:9]^4E-d MBUd;.Mv8f"}f 2Cǽ?CyNJÈtfW\IˊZuG~`ኅzzғ(e#@Q>)r3rJd9>o "#Ȫp WltC|[Yz8nݝAth\b|gʪB)볽ՆPk1{7Y 27t5`}ot>.Gp7LYdm%*暤C{8@PP8BJͳǔnO֜^t-a-sĄM>D`fb"&m6;3οP-Bzؖ"$tpv%w:Ri.c¶2:GY aД(b8t4Mxj@*^<3$ɇC)NteSķz"vVE` o58k+Q1f4ǁbm@#lmo^̊eQC=_PxB]FPuBb&?M`LBD^%\NPg6U ;ٸ^Vޛ`+;DR`CvåCdl;#Lc9BB oБQ"fʾ 691~#Aw{%[M@,Rk{SOngȑ2^tԽ$z2@l^@Dw㍆6x]2 \$!1buJ+PlDZ|ZتϚZ`)l/GC b(uHڤISEwj'][axc0?O5dYG~#"}A?X|F550gDk=[[8pHvp}ʽs(Hjt p5SEZ/|ܓ̈v,D>2b'ux H[Deǣz3^PJf )tU 'w򾕃R|BI hz=M60Dzd=ЛDIf˾F#Ǜ״y+ ̺&nTt u%5Swlʕ8vm5Hf1o {};=Z'z3JN𡹣嚹m@O pźMuEQ1 KG%J¡"BlU+e}q̇B$:q^BPpcVdiaP> M!l6ğ(xM&^vH6V?nJ.8#i7_R9mcLB[҃l6Z1|Wɵ {Gޝ9|TٚhEw~&Z6o6w=tW:'Ob>ozV]/  M;`6-=EȂ(oy D'k7-dev4t s(8ԍ vjS|JHv͌Hj 1m`y߉i~,^cp}uo!YRđh!(Gɭ׎i ;S)4( W L!8ŵ​W3j5$-sVũh~XFAP\-I2ikl|01ӗ9M@] N/h/fOk=+VagL)UқFg?ɴ5,v_ƃ2 P {ŻXq`YȁT-Y=Lؾ{/g@{dɋ`ߔ&+A!ǒ[LAZl(jվA5|a?*8̉$bg(ل_qއvNvPQHD`7.*Xwۘ2 xkxlj2Lf NR۵l6ovn,-s/6Q4_K?$ioRy3 0ŧzQo V+]Rv;z@zkKO3[߂!y@ɬ3b&2i xsM[)xW8wY5'?(,o6~޻]NG{)s Շ[|l>Q^X*υ/ `>AnR f̹-?Vrac'1g=XSş BіpF^F=mBvG"<{#'fǠ$O~rA~,r%ur46IpՉ'_C l(w>4۾*VuED-\D9mqY׵vQqJb7@K("UI:N iȱi^$C4}lop_#_6x<X?ϷH8>8&@kƈyȥKXqߛΖDЦn9Pn5HBTW=%0*xfN44 u? 5G:!-J)y?(XǑf^fnE r,ϦqB@i*OڴXF &pDGz>Cϰ)arEL6104CJ8nO|D$A.('ٕI +ֵ9o܅9E!'|t㺲u =„b{²ƴ,.xfG=KbkT0LA{ŽQ'hGD%:L=CkYe@fމ UCf]NqCWX R`BkL%$}5$o$N}A6軯D.|2‡kv9B=]&x0 7]T_Bɒk֚=s+"Kq72GW'ːĹ\e{k1p+Nvhw nz6o1>ĵ cY.aϹH5KI;1 +]en`]F)X& J)-ynhC6H}tpaC" cC x2¡^Hy&0/ejB(:rlqR+lN9!d62^S4W媒EuseqU^U-Yv8'Js{YR癇 {gH-՞I pqZ[85yDP Kgކi̴z"}2 %Q+8w`ҥ#[/_ܐlFl&u|@3ۣZ%PWˇ:>eUL٢`[Xu$A|>+B$7XO_b*|BBНNDLxy5C*:c>П*q-Bm1%IAlV-ِ]g :N?cipS &SgB*dFl_ƋÜ`gkU3~)tۚw?ȴxF|e{ xs@ qW"xfxQָ])'T&l(!HaCLOY񅃒fB'\@_iH7D5 ͆\j7vb'R1$Ze&3яh с$ձS?ۂcrt#yp'#ڍT eMI5ABh>X< `p#?ٮ A`A?HX$Ou?kʕD:@{Xꥯ߱qm }5)67Y1wnV+C6w.|Y@*W*ܑ")>S8ckf2Q [Jʌ5ᝫM7POFKkIŤEbZI`,de攒scKJ߅*Omi Vjv܍L;S|".? G; W4%IO9:;&K[ͷ6nI=bJ" )z*G$eׂы05Z$C+5]وڙ (KdyΌ@I¤hjV;~SиŢƩXOGfF5y-))/π$(+lCFr{ ?SgY_7}BGܯhNUL^n6qVIӯT}E)_#t\(fIA8W,{7f@ݸU fT*G i혙w9K*0L4ԖL+.J<%Y9µ`[Ars$I@X!"H,nӻcL zX70ƘqW))L'C {Y.טX.[NF-4ֈҽ+lif-ʯ ;FzsFEb(Yc| ;!}Za>'" aD!S?5JbMj_2 * A@.^I_@seF`VmgkRL~55dfc!cpyY lHy-UtXbM\*<\ta`IL‰a'%BZ~t{: D)[3L wBg,d|qChMrqPP>4 T aVFV]sެ4&A$|խx OoN]9,P pua ar(Lb;dRc}(٘7gTT-S)WdGvPް]i#+ن=I>!M[1d]cSDz,I틼-oXQ!^˺KGA:3Eт~_=`L*@HKhm# (a&ŝW*fַ8]RU/;#Q菄1lkUXTsFl ;pZ 1AChL}#PI=/](JqupH0~0[62Ŧg!Gyk\]jW,LOJey\q[Q3ձuf8œl3=,gF&f62x1%F[6'H*7',/ ނf5Pc%Ȼ1ZG coP]*xJvE ab^UW>d3K10lF/ST@}~lrF9hsnw\:-Wg( b uK@定C:ulw5W]r$0hvMkFL#](Mk8i)'>'e25 =?:k(4 fq_ԥ{1&Ss6Nowdi\N.1t 2+?aK7/q1Մq9˜5r@h2σJIC/Tj8#cd刉-0w)c7aqw|"fG^9;~FdU)ܛWq;YTǶUKniYZ e"2b`z66d-f;u=pW:y Ul{!Z6eɪc Rs8 987Sw2{OP"$C4>M VkvnL AM`k5쳹|=lDg yF ])G FQ-V&ddgq1\&TH̆_ C%98F9 ކ؟ (Q.zW=-o5L0=㋹HTL{ct6M=x#/2*_{ڋ51z)Nh@i NM@~7U+?ϒa#Ժ9MtD {Ԃ@v$4v>d5 EݠEžh·J CA]1>ZL΃NMSrw64D2, Dy2,X5_0AA^9a)9]6OșHMˀ|@3=KqxiS=|`aM&EQL;(T(mG9aVmr3 ^<(_kxb_LZtּD' ,kŮVX\=_Do8G6DEe-#gPFJ~)@TiPX4c-&peO!mvav˜K~O;|˝SVGy,_pQ->ja-, mZu UMruا[3>MMI5`+vuM ?]HcCz&կ3"i(LѯdC/=uuXtV4%sp<&ӒAg|'Z(G {ͤq=Px+=3 =J%=)[c8[XLdj#&{YpV mJ{o7AcHM_'Cr 2p4)bo3$0-Dn"z@U (]Rً]W'4 f+)"Hzrqlly?eo6zҞ'_N2kw$ U.>(3kCwI  &jb;z0賲泹'J,=uО"uM҇%]pgW}w%Z "Š[>oCC)ҡ(t 4|I+ف}GHk+SctDž 2WvFbx]-yѯX89 uѿ*~ o/jj ]r!IgrtE:qEa: lS?c ҵUTօDP'[ՀujLtMcI<9}H|Ҍ=9gi / RD n6R2$xd:0?OMv Ziga@fl* fwgjܣv_k5?\ "8ڱa|?,ôC-0iKu)[-}_]kcf: AE-r~los F+@tpZ" 3I/3WtaPFƏ^ANC9Y4ZiCZh!A -pW˼dN?Q%Ԩ!s LR9Fg?5*e,HB"|$Ȳ`NWUٓVl`?v;(hY-ICAT\x.-@ɕIT^-\nxRim 7"3i>84+f^~څ| 魮cKqOjRI(h2oHuZ E!HbMcEHmxֺy JCFby+oPպU(0^t7rZ~儁,AMi6\tl$3)sk2,F,2hcJ*(HOI}/$UAE]^y~Bj1Ij}3tMAf =2E#HU^aS훗=~n H{,'L[{yqYn$%Չ=4@Jo)vxE_3oY"6]FxCu&`nh{O'[Y3A5} U?VzhMCIG+98uG e*K` e /CaҊW9\ Ji[!M76g0[۶m۶m۶ͫ6=s>=dNRU +9IYyUXJL7e $ޚJrz^ '&e1rϤ&7z-uB|굥njN)@Gce 7iwu$65M XbR6sMKM#֙w$bluk 6174LX ;nb^WozY|/\$p[ K7@XQOB?NF:@ t [jj, / d9[0w ˍa.F#X{&3pJwrs?6|?M?>|_eJ~7քA %Gd^n~1͝ 8S .4pewS+џFuWjiVO f(s@:_A_KXHS%]]Igq:'rT8G20 I{#q_bÈkv`)/tSF]'SZIN)}%h$],pz6*z U\6zxwP21Nl2D~{qmOFSW f̱Y\y!XBܴN9 uś<ˣ'kh4/Q!S`)ud]R P(R8j3؈r"\LR b?x{1'2|Ƒ 6ҟxMvփzqhzÜx:OQEe,z ShëZӚD?UPnĞz_g1IMFaQ]#YLW)%"-2ℚ2Dزv!(SNj:ۏU,¸8G4Dw0c'3Ri1SOoTU9~s!M:k`UFOnq+F"8=e_^VDR筵/GEc>3HGwCn!5x)_ͳRy UƭHBYeOTUSH9lhjv͈EI\XH;{")};[xz\HAGde C?tPϲvk_Kk^*|H'FiC*3Ek-0gj4טD̾OV![l];RKub[/~*?MEO`×kVODi~*`=y>ɛ =M!! AllO8_:U)w2& ׺x{6U u[\XbcUv=Ŀ4gFB{J10xkI:K}a`,9]Wtq&K=r,}fq(ȬD(ɂ h1n_iyL d<6] V4C. \J'9>ϊBn%6m(?^y^4c#dF=0udQ! 2 BY%͘LqG؄`]Lqh{MڼoܝOQ.*['[phQx,\6ݒvN_4U1@Q+/ M;.7|CPBj`lC)2[=XfXz:^C +j8V9k]g UPPJ&L-κV~"56Г/)* ӷoqK6ǝȋQyCH1(8 Kc{ Cm{iTEif l,1U?})f7߿Gݥ4daQ.Dh5$7iXop8=?G7ш h>v=Ό !"{6`$u!kZX4ke4b;ǃ 88xx\#ijF ~hO N<dt-Ag6nK`i[sRڹUnɈ L1H.4 ,E%ک1XdS4;BtndD+!n"Hw("XZܣxWd@}M SҘ[s-+_Ybo1»=}Rm=x /3 M> Wh"Vȫ@yUc\@*wU 30to[BhJQ/YwF}pYxq{7L Pcs hl:JL/LmnH(mK&D~mRx~Ƥlz$Fʊ/ I,Q@a;򟩴σAejDVT қJeQ%B*_%X}D.w@drq+ Nt_QY6 ZfMVX AA:AV"c3}}`Bk/}/0d4!Jsܢq=OF!L>Ukj HE~X<:<1o>Q:MJL4:i2Qy-ɪOnt#HJg|__Pd;g^#-MKE).u24  RFYB޿K/Sv,Z8\(|YP,-1%O~@Q'?125Mg #[^cU,g y. RQ"V֬QZ5Vq!XL_W8e]ınU\a0U-Մ}JJr6NM669d1T=ˑ"\G:X@ 7zCi7BNTKﻧG BТ慦߹O :I6d\Uxd\KA^귢; lsp2|}4+-p*Wȫ-3Mv !wns1Ɩ:r#?a$Ùpk_Zf-~R N̤vO%lSJ ? ԁl/C1$93ް;٠h?}0fMc_l,SX"\߲*RHh7*Ix_9Ikȸ5&Xܻb_St{G @-&=lVx?Ejx'ߨTgDۘCbL}N,A (Zf$)Wf9sd׼WM#w/΂fuy=>\zA?MXl+*t{4镭<`8(nd5SM"e$~gޘ(GgMzȬk1T)$18FX|[1w_.{=!ibYE_ʿToq~5=r܈@s]Gf|og${𝬽HwJru#W _2`MqRY$qLOBc6h 62=XC`TH?1Rb#<8'GA+8MQ`mdz{ k 0pA7>LIv-:^1q?Q0q6F }<&)j֧?yH)΀_i+թGOT5"0yo& 7o(m abAֹԜyV[֜c-lGf9C7EzбP=oc3mjQȇIO`O0rՊmJ. ÖT:ӅGsaޢl_EN6UemX ZK(GyC,eq4%FTk`bDU: e <>`]nEg!\6;IO URM@I+:^<#RK 2E:(=J^5fZ~/jc4墘zʅIz-_s:^2v䦨6L [k̓[S<]$^Qu,XUp[+7* (Id;lnKwbkdM)a*fG1Lj})vgm#?C;7_c@nߌw.f2I2Yt2@qs,*}n@pt<0FI@~6kώ 6qcWYOwoU[B8¨MSFUn @ _fGYM^ jÙپx?=CKQPvNcdV;Nx{{P2=[ f5Wt wUc\/SS#óKO׭w,R4#REw9j{+&lr iO#t/x%շXK V:Q=8̺_9/ϰҘ$!ct%BO=,&ORw".RAc _"*H1%Δ+tBNR36<5J :|؋c%t8C%V&i}?*oVTJoлzR=gY?%,/ b|0פ$G!zwt S\mŅl7I#a*qhBI.ysz3wWj[vsB 3OYU#a6 t5l, L®).@˴,epvQh}z1ґm]8]ol*c29<=۩o}]n9UT{ Ӭ^N*e㇉ fBd|GZف{1% 7c{ 1N=.ԱaU*;6۽xyEqJ>s p!xL5;cH1NZWhy`]w}ՠ>4$+ " P2.\sbeVo9#k:`z׃.8Q㳨VҠ1a,o$I\b ; pf.0J f}z_ oKlʤKt˜=j%i&}:;7ԇvt4Mcؓ153ч? ;oH0X4\ VBĥ)ү״Ի>6XKzWnӅU"4Uw׎4C2 D_ss1@2Yr"COsgm xcv@#ό TJA iOA :iW_G$PCKylYl@)8 l"x֜XZ<  >q WbR fg^d/t^lÕ ;Ͳq`;t?զ7bN41-1(8V_sA3ͨW\2qt|gƍz5*As KT;*g6 ԟ蠃״\AM28ڃSɓg.m,צAɎmh?0˯Yq.vZd'F]9G6ۍŞ[cԬ+\'[ѵl;@isupLY^.~ ?b^` 3T#-p#CgLOģ>N/a͂'jLXd,<߃>QuaDq$Y)BF秌5dOu [A p(:n  }2:bQtSlF~q6 P^>1VݮVVfτK#:,c(o G:zˮ mf=3y Qr ɮ ݝz HV1Ip$ޤ_}+)g5 {?-.y,NhB <Fأr -OCĜ#&1$Zs3;8BJ|R 3nw޿M >uh1yO5AqJ?Kc}4'_̭xEs#g ޤX͡%s'BӁe^]lyW'A @GG hMK7le@])ݯCƵ !7yu>xĉF(qiaҳ& f@ wlıv Z{2RV3M@Z 9 !OFv"TUt)~>苓mknM;}?!b$g?j[6>&⠵\L[Sv]X'RGiG߶mY v2=Z1h I5jNXfg ~ ⫍F5N\ m)֜cNC $&"RJK YthVe=GN0gT0l1D- }*Z Q2]9=Ds)~q!1 LBk*価Uu(2s&`JY.܎yy87Lb X/v Mo!"t3 5=݈}\J]/w$#8Au[ʺQi<%XKy3^p~Y4TE̝NMY zE2)Hw\ H&|^h!9{1ro{N6̄MmIj4k*V\Z>{̚*EIoTUc8 Dc&$MYl>zZ`󗥞=lSy*XF1"9lAwMdOM͐]>[]-,ic"쇍dX=(zß(%m=p@2Ǭ!LgCH8⼍] `ثNGkuJLUm8xڹ SWѪ/< wdX@;_g0kW4r).9kSgHM}5y_R r׷FRd>\K~tS,EŖ aYӤDzrx)$ɸ>S^{PGepK4<5rԶk39VK*qY#n!X]g&aЄp$" Sc؇VaII@.\a&4ky[="^#}7sI.3ʐlKxp5="xesx+o:F\VPG[,&'WL@:;-Vc6OҤXb9{si(:\/:ih 9ߌ}ҩ%Ztsb4 _d6wNx8 ҁSFT6LH ]/wEwUBqI`;3;B Ewnzрt!"O[=v`[PXR%1uOK UV6Q.kg'!1}Y.4|܅s+کQQw.'&bYw<$6 upd;\(R-`-:]fol)*l6nzxIy@{i =2:NWQsS{b^6/ Sŋ! irr8F?vЙAAs|p`ȖRy"&-eyP,3ְ GQXZ`ƆiFmv 5.M:ܯg)!ٳ#n9,9敠ڣ.`cZLLi:8Vrc婖φ[0-MEDVMP(^@4m.2-bnl}pehO>uGRS&yDۼj7cV Xdϩ'T,l"P-n'K/u>Ď VVCe9 W t^i wco^NY<" @zjzÐ DMLYy#3bzm&āqvx$y+ױ!Yi@f|tԥ=3k_L(QByД|3+1 L HotJϼP ?9YAOrIRXvVOcs&)߹p ~$<2G9rD/,"8~Ab5@}Pu@%꼳rE7ɍڛ-٫B 6A"v(s3 T}v*2f( 44aߟsU*$S3iC~$@R|&#*:USܩ MW}iaRa\%p m̟ns7JX^ rԬbhhlҝ~T48ceE67pFtqy5[&j/MWP ?6QYLJ@ "rS#&X>Ά@Ղf~ґ%4u|fCx|z':s+zP,ݍݲ&νF0䞢j5ڮn! ַer [)&kuDT S!o0mU!֬ TՌ[] j!"D{Cu}ݷx@uxr/ LSݮn7; 5;7[r*y$ e @@(2Xjm>&?'_UpΠ]Y^o=@bTg06?"bc& W] ?u߶Ŕ͌ K;ϻ4z U)nIDYCD~*[C-^^Tƞ@FϞ^kRa[05:ETPgR\GP_^2Rho~Føi`9DJ 3!jp0@kADo\XX\{yaFY[:0&F`B"2+.e(4tL|fÛι)6y/lJ/mcÉ7w-֛MlDGuy TSJOfST>z=}IxQ> W"0jP¼(nMi?_ gK?f+ԐC? {`'Ϲr|{Q * Ɵgph6W迫{Xi>YTQߌ1BU&K"@`rGE9* mp Ův|HK,!K4!Y>ԭF/,\ߗsIp8ھܭtTĄv]"i0t=Wbt Y.S%W{pVVk>X'E0BƋ zvvzbͤ]sSޔ]rIXO6d% xaPSw;[Pʠ oRS#w]K z8!y(z+aWS~1n9jkEq³DXG8v'2(iNPEI ASZC7erDd;C"]BIpF Ep a^XT:Q9[W7qN6 {w_J7,.p}B f=mQVh| 9ؚ.'9DY;roy8db, 6a>h\ֿQ1ǿ `kE?Ko%s ahf8Ak4w >Ut8t6^dҝ>; lDVUX2oyؿ*b kirk+w"\FR5 Q^b!,R2P0TsӺ.2 ~HH2]6^|`K/W[.h ao%g/",~5'/a莽 xg!s: ֛6vC2H$ b$VkB-rIJLq[0߽ijcZ Y ^ 4,ߺ5ϟIqa&599F? {>MBFRbBo># ::.wH'qd{@/r3V{Eǽ:}20AdRF4qsKN`hCMg" d* ķj`+(4V2SJ&  Rtp+zO^ p1 6Y.PX 6iHZ6t-)s݀\ɭxD-`^ό Ua<9s[M9X(xH;G|\:4@ğCUȜėf Z1A+CZ8[*+-z]%T*@],HׯU6nkYRp'j( jDASS',tLIsrQrrs%<0FM )]ϼ9w)3V<žtupiBuuVkn6q| 嫺}sշeпN:Y?EX%FJgyH]mUs#O)IQ>g̓%~EldS\.f…c{gL#$;OL$z5=(H9,A |¹% V.1ٹDK隵tZhsp$ endstream endobj 154 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS >_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZKq endstream endobj 155 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRd{nCN8oͰof-%6'&9Pu`L/"tkں(a[ duS $xqa MN{}m}gىx` tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vw%g43>\ 6 EJ78 1{~`W(-;]%=xe_,b+-O;q\L}UI--=BKE1p[! Mߊyu>.N5K)Wb٬8i[_uʕMzQ)V(Txޢjy!Z2P="Zd0\ÃGR\).2*Шa!U,H`+j.5Nα@VK-x%3%AYӀzΚ>kP#5m0Woþj.ZT$X/)n)#Wo(oRZ $Kp4Z-b\1ܰJ P"GXQi/8k^Zq:Zs9dB )sL-7xJ`aɽ)f$1 dъcCZC<73JgznHȰYɚTa,_-O87}KԴܗLloK+gJ.GZyVc48Wt]:P~`rZq.n1] S/Pu7Ue:?&?!d&1yHn5)yғBx#1ޞ]Go׏M?X endstream endobj 158 0 obj << /Length 867 /Filter /FlateDecode >> stream x}UMk0WhFCۖ,{Mlh$73nw҃ͳ,]}{\Olo$ɝиI}s \wwu8{SC߬Y]j7KF½ Q5F9LN&g3Hyޟ_= S)E~;en>ڲ?S0qj:vj Uo2ws!yv:ê|O~tHM0}Z7u@OX_W1JjoNMvt*aMߺqӸaӽ`BzoDݍܥڿB`nlB =@ )U 9yI(J5<T`, M%5֜RhR 1gcͯ yq( buX& &q,1+N978Nsk`q8 ^8% FMq.5Sh@kO ׏p$q1/]}/ȩ»p^`D3F?x[a 1ecf!/1g)cd?4dK^| МQV1Կ'1t?ƺ9Y?ГrYs֟'g)437YgD3\ib-z3zs ,>G|ZV|ƾ3ֵ33qgng3tZ[Yog,g[3 =L3z/gd ,gz)R؇O5_TTV *M2GZN(:pTy 0kn":q;~Y#[nh1z?F endstream endobj 159 0 obj << /Length 868 /Filter /FlateDecode >> stream x}UMk0WhFCۖ,{Mlh$73nw҃ͳ,]}{\Olo$ɝиI}s \wwu8{SC߬Y]j7KF½ Q5f6ӓ09]nD#y~/XOϦӾZkNTĩ(wA-&T9ˈ;n>yx#7ahݰ^g=a}9_(,u;_r985wѩƆ56}NMM₹ 5E9qv7rk u/A )`JbD>`2$`TY'``9&*8W`TR&4`(ZsJ5RH+h3}76Xš60aG+gıXF888sέ-.x]/+5MĹPN<1\?ǘt1:˿#7^YH{upQF^odž1BЖEQ?1^׆ƨqА.yaf%+CsV2GYŘS&ƞjЙ??grCOe zYJ|֟uМ8gΈrY}Ŋъ1LkYҊX׊ӊѻߊigngfg/>Cn!>_33/>?㓁EK!c?RMO #SZ1|8Gxp4aj9DQK.h. ljeuȢn( endstream endobj 160 0 obj << /Length 868 /Filter /FlateDecode >> stream x}Un0CƆ"RVmkN7RI̤߯]U=ooƾ4qݰZGNc'>wÍzeu[U gҿl Qķ&M'G3Hy_ S)E~e!jءC4qjz( z#neDvBwfs5} FzqۿitXoBjߙo{b?WWZ/ԼiL)͙ \݄Wb MLS!"q #u!`Nȩ(( LFUjp49cIMh ,hPE4pbvŢ !\΀Ѹ 8!\=#2:x 1v9/8vӺuSqk4 "nXCI8'ľ&p 2<Wcǘ,9Ϳ1bxb Ài',ymƌ&Q/kC^،1ۜ1q, Vu 3/d Ͷb l͘S&Ş c,Xu ֟_~CO` ?'>ψ:sh.Xgo\΄rYgBЏ>;gX|&}ggg݉gt3zw3|s3߉YX/gKzJrg^od ,gz)R؇O5_qTԼV j M2GFN(:pTy 8kn":qo{~Y=[|btD&U endstream endobj 161 0 obj << /Length 866 /Filter /FlateDecode >> stream x}UMo0+J! ᫊"Rj.RI73W3njNelܬ;WW\?pu4{SlY]jwOusR^u5sx0:gav8;FSw~/XOϦS7wj}`ݷp@c`.|vzk2ws!yv:ær~tHM0[7vL'l/㫃Jnz_~NͿvt*aкq׸q׿`J-zoD򼟸kյ:W ل0%1 " 0Z{q́0R0r0Qbkx,+0*NXSk0j9F)u\c?/߻Q,PXL#L X,cW c rn q9pZ.qJ{&\ k(AIcL_S_S/w": f~R (#c^g!ch"ƨ-kC^d cRɸh Z0 9+ãbLcOd5cYus~C9돡'g ?%>O:ShYgoΈrYgDЏ>[bghX|&}igkgig݊og3z3|3ߊYX/g z rg^@X"R jb&'x>T#<8d0UPt"%~4qDtz~Y#[nh1?kl_ endstream endobj 162 0 obj << /Length 866 /Filter /FlateDecode >> stream x}UMo0+J! ᫊"Rj.RI73W3njNelܬ;WW\?pu4{SlY]jwOusR^u5sx0ֳ0;]nL#;z,gS t;en>r8S0qj>w};B U5gѻ9x};a`TG?y:o&ߏE]&AjZu/?v_t|z;:ذfhkܸ_\zu \7g"NyOܵڿB`ilB =@ )U 9yI(J5<T` M55֜RhR 1ڟS(yq( buX& &q,1+N978Nsk`q8 ^8% FMq.5Sh@kO ׏p$q1/]}/ĩ»p^`D3F?x[a 1ec!/1g)cd?4dK^| МQV1Կ'1t?ƺ9Y?ГrYs֟'g)437YgD3\ib-z3zs ,>G|ZV|ƾ3ֵ33qgng3tZ[Yog,g[3 =L3z/gd ,gz)R؇O5_TTV *M2GZN(:pTy 8kn":qw{Y-7]%# endstream endobj 163 0 obj << /Length 866 /Filter /FlateDecode >> stream x}UMo0+J! ᫊"Rjn" W3nj<4nV~ߝoGM?k]{7[7rSmtɛy=TCA:fYsfi<WOlJQn}w̭][G46sCP=Co`BIFn!$o7ݾK54ޛ`~?n8t/3=NbV+պ};:5wɩƆ56}Ӯqî{qRZ*p]ߜ8y=W(_KdR$| 4hd52HHNsL FU*q8cMMh QEk%RWp |q"/!\,Ѹ8"\ 2:x0)ljsn l9ux\רi"EܰpJM}4$x0.?1Yſpc.\X7ьO*ezl,d mY50ymȋ,aYʘ8 xAf_14g%cxU>ob쉬f 9돱ncsO{(g1?\֟g Yg 9LsQ.(ug^/u ?L[ V|FV|oV|3[: 3 ~!>CO!>S 33>Y^ ?a!SMW,:?8ÇqG湪N$ոd< }ν_V,z薻\ endstream endobj 164 0 obj << /Length 866 /Filter /FlateDecode >> stream x}UMo0+J! ᫊"Rj.R!W3njNylܬ;WWМ~8׺2{SlݤMƓ7}zn݅9p/]A:fYsG7&3HyWOlJQnReT\`YQqJƚXQh)5HK Kw{7E^ kCXq pD zAet 8alSM3?rN%NbQDa 8>#h0\?I`\~KWc ]i/nTvc-+>c_ZZ~Z83z3[:ޭ ߬Lg3t3-g B|B|\3gg|2?z)BXIAup*^+&#sU-'H8qɼy5A78޽_V,z薻\&vU endstream endobj 165 0 obj << /Length 866 /Filter /FlateDecode >> stream x}UMo0+J! ᫊"Rjn"B73W3njehܬ;WWU\8׺v=ߩonTtƓ7]ziTCA:fYs/'7F3Hy:K)ٔ?p>ݝ2ZkXwm985];B U{hFѻ9z};}\< CC? F`RޗS/~g> ilXcӷ|5nu/.XjR˺^k3<'su_U4H6!L@@B@q\s *Tg ]i/nTvc-+>c_ZZ~Z83z3[:ޭ ߬Lg3t3-g B|B|\3gg|2?z)BXIAup*^+&#sU-'H8qɼe5A78{N Y-7] endstream endobj 175 0 obj << /Producer (pdfTeX-1.40.25) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20241029202738-04'00') /ModDate (D:20241029202738-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Debian) kpathsea version 6.3.5) >> endobj 145 0 obj << /Type /ObjStm /N 33 /First 274 /Length 1622 /Filter /FlateDecode >> stream xڽX[S:~#]Io3p @BIvxp5vj;ʲoI̙ĺە& .#Ŷo2`6ac!.G\A#v 3 -#N'pX.1npi3JIL"ٌY8ٴ fc'q;ʔ9kMb$(GW=0/\9XTNZqG1\Qv q̳81vđ/aQ¡ПD9{{3\\dKcev= vRc;C;2? ƻ405X#Lld(3pЃ#8ONΠ8 . n|caMt=Ix LaLFw!6(uHLoua#cjWw*'+-8]!9Ue/+~"-T#yCmFQH+}[Ԩŷ,oNߞJ5B`pe8zvl4rzAfJ~x1/x2:d==w_FHD^t*D݋Dt 7 ZdW <0122841A41F78FD0FEB10950DA6D1E78>] /Length 475 /Filter /FlateDecode >> stream x9OAEqAEP " +VMHH&d &$J! KڎF_wdffĔL7H gn) 2T렛6&((͐2[al/jdih^@*It\}P-+3X6PAهͰ AYweܶםòY2xt1hVٗXemҷE)hp =t8/.yNkʗH> W3[MM!p]H߼CղQc#g OO4ThgJI)1e+>OR 1 ARE REPLACED WITH 1. } \details{ The p-values are obtained by applying Siegmund's approximation for the maximal statistic from binary segmenting consecutive segments within a chromosome. This p-value is only to give the relative importance of the change-points as the CBS is different from the algorithm used here. The confidence intervals are obtained by a permutation algorithm. The data are permuted to the left and right of the identified change-point and the location of the maximal binary segmentation statistic computed. The confidence interval is given by the quantiles of the permutation distribution of the locations. The statistical properties of this confidence interval is unknown. It is used to give an idea of the uncertainity on the location of the change-points as the CBS is different from the algorithm used here. } \examples{ # test code on an easy data set set.seed(25) genomdat <- rnorm(500, sd=0.1) + rep(c(-0.2,0.1,1,-0.5,0.2,-0.5,0.1,-0.2),c(137,87,17,49,29,52,87,42)) plot(genomdat) chrom <- rep(1:2,c(290,210)) maploc <- c(1:290,1:210) test1 <- segment(CNA(genomdat, chrom, maploc)) segments.p(test1) } \author{Venkatraman E. Seshan} \keyword{nonparametric} DNAcopy/man/segments.summary.Rd0000644000175200017520000000171214710217127017457 0ustar00biocbuildbiocbuild\name{segments.summary} \alias{segments.summary} \title{Additional summary measured for the segments} \description{ This program computes the standard deviation, median and the mad of the data for each segment found by the CBS algorithm. } \usage{ segments.summary(x) } \arguments{ \item{x}{an object of class DNAcopy} } \value{ a data frame with nine columns. The sd, median and mad of each segment is added to the six columns from the segment command. } \examples{ # test code on an easy data set set.seed(25) genomdat1 <- rnorm(500, sd=0.1) + rep(c(-0.2,0.1,1,-0.5,0.2,-0.5,0.1,-0.2),c(137,87,17,49,29,52,87,42)) genomdat2 <- rnorm(500, sd=0.1) + rep(c(-0.2,0.1,1,-0.5,0.2,-0.5,0.1,-0.2),c(137,87,17,49,29,52,87,42)) genomdat1[sample(1:500,5)] <- NA chrom <- rep(1:2,c(290,210)) maploc <- c(1:290,1:210) test1 <- segment(CNA(cbind(genomdat1,genomdat2), chrom, maploc)) segments.summary(test1) } \author{Venkatraman E. Seshan} \keyword{nonparametric} DNAcopy/man/smooth.CNA.Rd0000644000175200017520000000314514710217127016051 0ustar00biocbuildbiocbuild\name{smooth.CNA} \alias{smooth.CNA} \title{Smooth a `Copy Number Array' data object} \description{ Detect outliers and smooth the data prior to analysis by programs such as circular binary segmentation (CBS). } \usage{ smooth.CNA(x, smooth.region=10, outlier.SD.scale=4, smooth.SD.scale=2, trim=0.025) } \arguments{ \item{x}{Copy number array data object} \item{smooth.region}{number of points to consider on the left and the right of a point to detect it as an outlier. (default=10)} \item{outlier.SD.scale}{the number of SDs away from the nearest point in the smoothing region to call a point an outlier.} \item{smooth.SD.scale}{the number of SDs from the median in the smoothing region where a smoothed point is positioned.} \item{trim}{proportion of data to be trimmed for variance calculation for smoothing outliers and undoing splits based on SD.} } \value{ An object of class \code{CNA} with outliers smoothed i.e the logratio values of singleton outliers is shrunk towards the values of its neighbors. The output is of the same dimension as the input. } \examples{ data(coriell) #Combine into one CNA object to prepare for analysis on Chromosomes 1-23 CNA.object <- CNA(cbind(coriell$Coriell.05296,coriell$Coriell.13330), coriell$Chromosome,coriell$Position, data.type="logratio",sampleid=c("c05296","c13330")) #We generally recommend smoothing single point outliers before analysis #Make sure to check that the smoothing is proper smoothed.CNA.object <- smooth.CNA(CNA.object) } \keyword{nonparametric} DNAcopy/man/subset.CNA.Rd0000644000175200017520000000246314710217127016047 0ustar00biocbuildbiocbuild\name{subset.CNA} \alias{subset.CNA} \title{Subset a `Copy Number Array' data object} \description{ Function to return a subset of a copy number array data object by a list of chromosomes and sample. } \usage{ \method{subset}{CNA}(x, chromlist=NULL, samplelist=NULL, ...) } \arguments{ \item{x}{Copy number array data object} \item{chromlist}{chromosomes of interest. Should be a subset of the valid chromosome names in the original data.} \item{samplelist}{samples of interest. Can be integers denoting the samples of interest or a vector of valid sample names.} \item{...}{other arguments which may be passed to \code{subset}.} } \value{ An object of class \code{CNA} with the data for the list of chromosomes and samples of interest. } \examples{ data(coriell) #Combine into one CNA object to prepare for analysis on Chromosomes 1-23 CNA.object <- CNA(cbind(coriell$Coriell.05296,coriell$Coriell.13330), coriell$Chromosome,coriell$Position, data.type="logratio",sampleid=c("c05296","c13330")) #Take the first ten chromosomes of the first sample #subset.CNA.object <- subset.CNA(CNA.object,chromlist=1:10,samplelist="c05296") subset.CNA.object <- subset(CNA.object,chromlist=1:10,samplelist="c05296") } \keyword{nonparametric} DNAcopy/man/subset.DNAcopy.Rd0000644000175200017520000000151614710217127016741 0ustar00biocbuildbiocbuild\name{subset.DNAcopy} \alias{subset.DNAcopy} \title{Subset a DNAcopy data object} \description{ Function to return a subset of a copy number array data object by a list of chromosomes and sample. } \usage{ \method{subset}{DNAcopy}(x, chromlist=NULL, samplelist=NULL, ...) } \arguments{ \item{x}{DNAcopy object} \item{chromlist}{chromosomes of interest. Should be a subset of the valid chromosome names in the original data.} \item{samplelist}{samples of interest. Can be integers denoting the samples of interest or a vector of valid sample names.} \item{...}{other arguments which may be passed to \code{subset}.} } \value{ An object of class \code{DNAcopy} with the input data and the results of segmenting them only for the chromosomes and samples of interest. } \keyword{nonparametric} DNAcopy/man/zoomIntoRegion.Rd0000644000175200017520000000507614710217127017127 0ustar00biocbuildbiocbuild\name{zoomIntoRegion} \alias{zoomIntoRegion} \title{Zoomed in view of genomic region} \description{ This program computes the frequency of gains and losses for each probe as a function of level of mad. } \usage{ zoomIntoRegion(x, chrom, sampleid, maploc.start=NULL, maploc.end=NULL, pt.pch=NULL, pt.cex=NULL, pt.col=NULL, segcol=NULL, seglwd=NULL, main=NULL, xlab=NULL, ylab=NULL, ...) } \arguments{ \item{x}{an object of class DNAcopy.} \item{chrom}{the chromosome in which the region lies.} \item{sampleid}{the sample of interest.} \item{maploc.start}{genomic start position of the region of interest. Default is the beginning of the chromosome.} \item{maploc.end}{genomic end position of the region of interest. Default is the end of the chromosome.} \item{pt.pch}{the plotting character used for plotting the log-ratio values (default is ".").} \item{pt.cex}{the size of plotting character used for the log-ratio values (default is 3 if "." and 1 otherwise).} \item{pt.col}{the color used for the points. Default is green3.} \item{segcol}{the color of the lines indicating the segment means. If missing the line color is set to be red.} \item{seglwd}{line weight of lines for segment mean and zeroline. If missing it is set to 3.} \item{main}{figure title. If missing will be generated by pasting the chromosome, range and sample name together.} \item{xlab}{x-axis label. If missing "Genomic position" will be used} \item{ylab}{y-axis label. If missing "log-ratio" will be used} \item{...}{additional plotting options.} } \details{ This command plots the region of interest with the log-ratio and segments. It works for a region from a single chromosome in a single sample. So if more than one chromosome and/or one sample are given only the first chromosome from the first sample will be used. } \examples{ data(coriell) #Combine into one CNA object to prepare for analysis on Chromosomes 1-23 CNA.object <- CNA(cbind(coriell$Coriell.05296,coriell$Coriell.13330), coriell$Chromosome,coriell$Position, data.type="logratio",sampleid=c("c05296","c13330")) #We generally recommend smoothing single point outliers before analysis #Make sure to check that the smoothing is proper smoothed.CNA.object <- smooth.CNA(CNA.object) #Segmentation at default parameters segment.smoothed.CNA.object <- segment(smoothed.CNA.object, verbose=1) zoomIntoRegion(segment.smoothed.CNA.object, chrom=10, sampleid="c05296") } \author{Venkatraman E. Seshan \email{seshanv@mskcc.org} } \keyword{nonparametric} DNAcopy/src/0000755000175200017520000000000014710276573013674 5ustar00biocbuildbiocbuildDNAcopy/src/cbsWtstats.f0000644000175200017520000005653114710217127016204 0ustar00biocbuildbiocbuildc these are the subroutines to do the weigthed version of CBS c which is useful in order to merge data from multiple platforms c -------------------------------------------------------------- c This is relevant only for log-ratio not binary data c -------------------------------------------------------------- c function for calculating the full max weighted t-statistic c new approach to maximizing t-statistic subroutine wtmaxo(n,x,wts,tss,sx,cwts,iseg,ostat,al0) integer n,iseg(2),al0 double precision x(n),wts(n),tss,sx(n),cwts(n),ostat c c look at the partial sums in blocks of size sqrt(n) c integer ipsmin, ipsmax, ipsmin0, ipsmax0, nb, i, j, k, l, nb1, 1 nb2, bi, bj, ilo, ihi, jlo, jhi, ihi1, jlo1, jhi1, 2 tmaxi, tmaxj, nal0 double precision psum, psmin, psmax, psmin0, psmax0, bssmax, 1 bsslim, rn, sij1, sij2, sijmx0, bijbss, awtmax, psrnov2, 2 psdiff, psrj, psrn, psrnj, awtlo, awthi, awt1 c c use local arrays for working within blocks c block partial sum max and min double precision, allocatable :: bpsmax(:), bpsmin(:) c location of the max and min integer, allocatable :: bb(:), ibmin(:), ibmax(:) c t statistic corresponding to max for block i,j double precision, allocatable :: bssbij(:), bssijmax(:), awt(:) c row, column and order vector for reordering bssbij integer, allocatable :: bloci(:), blocj(:), loc(:) c calculate number of blocks (nb) and block boundaries (vector bb) rn = dble(n) if (n .ge. 50) then nb = nint(sqrt(dble(n))) else nb = 1 endif c the number of paiwise block comparison nb2 = nb*(nb+1)/2 c allocate memory allocate(bpsmax(nb), bpsmin(nb)) allocate(bb(nb), ibmin(nb), ibmax(nb)) allocate(bssbij(nb2), bssijmax(nb2), awt(nb2)) allocate(bloci(nb2), blocj(nb2), loc(nb2)) c block boundaries do 110 i = 1, nb bb(i) = nint(rn*(dble(i)/dble(nb))) 110 continue c find the max, min of partial sums and their locations within blocks ilo = 1 psum = 0 psmin0 = 0 psmax0 = 0 ipsmin0 = n ipsmax0 = n do 20 j = 1, nb sx(ilo) = psum + x(ilo)*wts(ilo) psmin = sx(ilo) ipsmin = ilo psmax = sx(ilo) ipsmax = ilo do 10 i = ilo+1, bb(j) sx(i) = sx(i-1) + x(i)*wts(i) if (sx(i) .lt. psmin) then psmin = sx(i) ipsmin = i endif if (sx(i) .gt. psmax) then psmax = sx(i) ipsmax = i endif 10 continue c store the block min, max and locations ibmin(j) = ipsmin ibmax(j) = ipsmax bpsmin(j) = psmin bpsmax(j) = psmax c adjust global min, max and locations if (psmin .lt. psmin0) then psmin0 = psmin ipsmin0 = ipsmin endif if (psmax .gt. psmax0) then psmax0 = psmax ipsmax0 = ipsmax endif c reset ilo to be the block boundary + 1 psum = sx(bb(j)) ilo = bb(j) + 1 20 continue c calculate bss for max s_i - min s_i psdiff = psmax0 - psmin0 c if the segment is all constant then psdiff = 0 and so bssmax = 0 if (psdiff .le. 0) then bssmax = 0 go to 120 endif psrn = cwts(n) psrj = abs(cwts(ipsmax0) - cwts(ipsmin0)) psrnj = psrj*(psrn-psrj) bssmax = (psdiff**2)/psrnj tmaxi = min(ipsmax0, ipsmin0) tmaxj = max(ipsmax0, ipsmin0) c for a pair of blocks (i,j) calculate the max absolute t-statistic c at the (min_i, max_j) and (max_i, min_j) locations c for other indices the t-statistic can be bounded using this c c if a block doesn't have the potential to exceed bssmax ignore it c calculate the bsslim for each block and include ones >= bssmax psrnov2 = psrn/2 l = 0 nal0 = n - al0 do 40 i = 1, nb do 30 j = i, nb c calculate bsslim if (i .eq. 1) then ilo = 1 else ilo = bb(i-1) + 1 endif ihi = bb(i) if (j .eq. 1) then jlo = 1 else jlo = bb(j-1) + 1 endif jhi = bb(j) c for wCBS calculated hi and lo arc weights instead of lengths awthi = cwts(jhi) - cwts(ilo) if (jhi - ilo .gt. nal0) then awthi = 0 do 35 k = 1, al0 awthi = max(awthi, cwts(nal0+k) - cwts(k)) 35 continue endif if (i .eq. j) then awtlo = cwts(ilo+al0) - cwts(ilo) do 36 k = ilo + 1, ihi - al0 awtlo = min(awtlo, cwts(k+al0) - cwts(k)) 36 continue else if (i+1 .eq. j) then awtlo = cwts(jlo) - cwts(jlo-al0) do 37 k = jlo - al0 + 1, ihi awtlo = min(awtlo, cwts(k+al0) - cwts(k)) 37 continue else awtlo = cwts(jlo) - cwts(ihi) endif c max S_k over block j - min S_k over block i sij1 = abs(bpsmax(j) - bpsmin(i)) c max S_k over block i - min S_k over block j sij2 = abs(bpsmax(i) - bpsmin(j)) c if i = j then sij1 and sij2 are the same sijmx0 = max(sij1, sij2) psrnj = min(awtlo*(psrn-awtlo), awthi*(psrn-awthi)) bsslim = (sijmx0**2)/psrnj c if its as large as bssmax add block if (bssmax .le. bsslim) then l = l+1 loc(l) = l bloci(l) = i blocj(l) = j bssijmax(l) = bsslim c max sij in the (i,j) block, t-statistic etc if (sij1 .gt. sij2) then awt(l) = abs(cwts(ibmax(j)) - cwts(ibmin(i))) bssbij(l) = (sij1**2)/(awt(l)*(psrn-awt(l))) else awt(l) = abs(cwts(ibmin(j)) - cwts(ibmax(i))) bssbij(l) = (sij2**2)/(awt(l)*(psrn-awt(l))) endif endif 30 continue 40 continue nb1 = l c Now sort the t-statistics by their magnitude call qsort4(bssbij, loc, 1, nb1) c now go through the blocks in reverse order (largest down) do 100 l = nb1, 1, -1 k = loc(l) c need to check a block only if it has potential to increase bss c rjlo is the smalllest (j-i) in the block and rjhi is the largest bsslim = bssijmax(k) if (bssmax .le. bsslim) then c bi, bj give the block location bi = bloci(k) bj = blocj(k) awtmax = awt(k) if (bi .eq. 1) then ilo = 1 else ilo = bb(bi-1) + 1 endif ihi = bb(bi) if (bj .eq. 1) then jlo = 1 else jlo = bb(bj-1) + 1 endif jhi = bb(bj) awthi = cwts(jhi) - cwts(ilo) if (bi .eq. bj) then awtlo = 0 else awtlo = cwts(jlo) - cwts(ihi) endif c c if arc wt is larger than half total wt (psrn/2) make is psrn - arc wt c if (awtmax .gt. psrn - awtmax) awtmax = psrn - awtmax c c if awtlo <= psrn/2 start from (ihi, jlo) and go up c if awthi >= psrn/2 start from (ilo, jhi) and go down c if (awtlo .le. psrnov2) then if (bi .eq.bj) then ihi1 = ihi - al0 else ihi1 = ihi endif do 60 i = ihi1, ilo, -1 jlo1 = max(i + al0, jlo) do 55 j = jlo1, jhi awt1 = cwts(j) - cwts(i) if (awt1 .le. awtmax) then bijbss = (sx(j) - sx(i))**2/(awt1*(psrn-awt1)) if (bijbss .gt. bssmax) then bssmax = bijbss tmaxi = i tmaxj = j endif endif 55 continue 60 continue endif c c make arc wt psrn - arc wt c awtmax = psrn - awtmax if (awthi .ge. psrnov2) then do 70 i = ilo, ihi if ((bi .eq. 1) .and. (bj .eq. nb)) then jhi1 = min(jhi, jhi - al0 + i) else jhi1 = jhi endif do 65 j = jhi1, jlo, -1 awt1 = cwts(j) - cwts(i) if (awt1 .ge. awtmax) then bijbss = (sx(j) - sx(i))**2/(awt1*(psrn-awt1)) if (bijbss .gt. bssmax) then bssmax = bijbss tmaxi = i tmaxj = j endif endif 65 continue 70 continue endif endif 100 continue 120 if (tss.le.bssmax+0.0001) tss = bssmax + 1.0 bssmax = bssmax/((tss-bssmax)/(rn-2.0)) c deallocate memory deallocate(bpsmax, bpsmin, bb, ibmin, ibmax) deallocate(bssbij, bssijmax, bloci, blocj, loc, awt) ostat = bssmax iseg(1) = tmaxi iseg(2) = tmaxj return end c function for calculating the full max wtd t-statistic on permuted data c using a new approach to maximizing t-statistic double precision function wtmaxp(n,px,wts,sx,cwts,al0) integer n,al0 double precision px(n),wts(n),sx(n),cwts(n) c c look at the partial sums in blocks of size sqrt(n) c integer ipsmin, ipsmax, ipsmin0, ipsmax0, nb, i, j, k, l, nb1, 1 nb2, bi, bj, ilo, ihi, jlo, jhi, ihi1, jlo1, jhi1, nal0 double precision psum, psmin, psmax, psmin0, psmax0, bssmax, 1 bsslim, rn, sij1, sij2, sijmx0, bijbss, awtmax, psrnov2, 2 psdiff, psrj, psrn, psrnj, awtlo, awthi, awt1, ssq, tss c c use local arrays for working within blocks c block partial sum max and min double precision, allocatable :: bpsmax(:), bpsmin(:) c location of the max and min integer, allocatable :: bb(:), ibmin(:), ibmax(:) c t statistic corresponding to max for block i,j double precision, allocatable :: bssbij(:), bssijmax(:), awt(:) c row, column and order vector for reordering bssbij integer, allocatable :: bloci(:), blocj(:), loc(:) c calculate number of blocks (nb) and block boundaries (vector bb) rn = dble(n) if (n .ge. 50) then nb = nint(sqrt(dble(n))) else nb = 1 endif c the number of paiwise block comparison nb2 = nb*(nb+1)/2 c allocate memory allocate(bpsmax(nb), bpsmin(nb)) allocate(bb(nb), ibmin(nb), ibmax(nb)) allocate(bssbij(nb2), bssijmax(nb2), awt(nb2)) allocate(bloci(nb2), blocj(nb2), loc(nb2)) c block boundaries do 110 i = 1, nb bb(i) = nint(rn*(dble(i)/dble(nb))) 110 continue c find the max, min of partial sums and their locations within blocks ilo = 1 psum = 0 psmin0 = 0 psmax0 = 0 ipsmin0 = n ipsmax0 = n ssq = 0 do 20 j = 1, nb sx(ilo) = psum + px(ilo)*wts(ilo) ssq = ssq + (px(ilo)**2)*wts(ilo) psmin = sx(ilo) ipsmin = ilo psmax = sx(ilo) ipsmax = ilo do 10 i = ilo+1, bb(j) sx(i) = sx(i-1) + px(i)*wts(i) ssq = ssq + (px(i)**2)*wts(i) if (sx(i) .lt. psmin) then psmin = sx(i) ipsmin = i endif if (sx(i) .gt. psmax) then psmax = sx(i) ipsmax = i endif 10 continue c store the block min, max and locations ibmin(j) = ipsmin ibmax(j) = ipsmax bpsmin(j) = psmin bpsmax(j) = psmax c adjust global min, max and locations if (psmin .lt. psmin0) then psmin0 = psmin ipsmin0 = ipsmin endif if (psmax .gt. psmax0) then psmax0 = psmax ipsmax0 = ipsmax endif c reset ilo to be the block boundary + 1 psum = sx(bb(j)) ilo = bb(j) + 1 20 continue c calculate bss for max s_i - min s_i psdiff = psmax0 - psmin0 psrn = cwts(n) tss = ssq - (sx(n)/psrn)**2 psrj = abs(cwts(ipsmax0) - cwts(ipsmin0)) psrnj = psrj*(psrn-psrj) bssmax = (psdiff**2)/psrnj c for a pair of blocks (i,j) calculate the max absolute t-statistic c at the (min_i, max_j) and (max_i, min_j) locations c for other indices the t-statistic can be bounded using this c c if a block doesn't have the potential to exceed bssmax ignore it c calculate the bsslim for each block and include ones >= bssmax psrnov2 = psrn/2 l = 0 nal0 = n - al0 do 40 i = 1, nb do 30 j = i, nb c calculate bsslim if (i .eq. 1) then ilo = 1 else ilo = bb(i-1) + 1 endif ihi = bb(i) if (j .eq. 1) then jlo = 1 else jlo = bb(j-1) + 1 endif jhi = bb(j) c for wCBS calculated hi and lo arc weights instead of lengths awthi = cwts(jhi) - cwts(ilo) if (jhi - ilo .gt. nal0) then awthi = 0 do 35 k = 1, al0 awthi = max(awthi, cwts(nal0+k) - cwts(k)) 35 continue endif if (i .eq. j) then awtlo = cwts(ilo+al0) - cwts(ilo) do 36 k = ilo + 1, ihi - al0 awtlo = min(awtlo, cwts(k+al0) - cwts(k)) 36 continue else if (i+1 .eq. j) then awtlo = cwts(jlo) - cwts(jlo-al0) do 37 k = jlo - al0 + 1, ihi awtlo = min(awtlo, cwts(k+al0) - cwts(k)) 37 continue else awtlo = cwts(jlo) - cwts(ihi) endif c max S_k over block j - min S_k over block i sij1 = abs(bpsmax(j) - bpsmin(i)) c max S_k over block i - min S_k over block j sij2 = abs(bpsmax(i) - bpsmin(j)) c if i = j then sij1 and sij2 are the same sijmx0 = max(sij1, sij2) psrnj = min(awtlo*(psrn-awtlo), awthi*(psrn-awthi)) bsslim = (sijmx0**2)/psrnj c if its as large as bssmax add block if (bssmax .le. bsslim) then l = l+1 loc(l) = l bloci(l) = i blocj(l) = j bssijmax(l) = bsslim c max sij in the (i,j) block, t-statistic etc if (sij1 .gt. sij2) then awt(l) = abs(cwts(ibmax(j)) - cwts(ibmin(i))) bssbij(l) = (sij1**2)/(awt(l)*(psrn-awt(l))) else awt(l) = abs(cwts(ibmin(j)) - cwts(ibmax(i))) bssbij(l) = (sij2**2)/(awt(l)*(psrn-awt(l))) endif endif 30 continue 40 continue nb1 = l c Now sort the t-statistics by their magnitude call qsort4(bssbij, loc, 1, nb1) c now go through the blocks in reverse order (largest down) do 100 l = nb1, 1, -1 k = loc(l) c need to check a block only if it has potential to increase bss c rjlo is the smalllest (j-i) in the block and rjhi is the largest bsslim = bssijmax(k) if (bssmax .le. bsslim) then c bi, bj give the block location bi = bloci(k) bj = blocj(k) awtmax = awt(k) if (bi .eq. 1) then ilo = 1 else ilo = bb(bi-1) + 1 endif ihi = bb(bi) if (bj .eq. 1) then jlo = 1 else jlo = bb(bj-1) + 1 endif jhi = bb(bj) awthi = cwts(jhi) - cwts(ilo) if (bi .eq. bj) then awtlo = 0 else awtlo = cwts(jlo) - cwts(ihi) endif c c if arc wt is larger than half total wt (psrn/2) make is psrn - arc wt c if (awtmax .gt. psrn - awtmax) awtmax = psrn - awtmax c c if awtlo <= psrn/2 start from (ihi, jlo) and go up c if awthi >= psrn/2 start from (ilo, jhi) and go down c if (awtlo .le. psrnov2) then if (bi .eq.bj) then ihi1 = ihi - al0 else ihi1 = ihi endif do 60 i = ihi1, ilo, -1 jlo1 = max(i + al0, jlo) do 55 j = jlo1, jhi awt1 = cwts(j) - cwts(i) if (awt1 .le. awtmax) then bijbss = (sx(j) - sx(i))**2/(awt1*(psrn-awt1)) if (bijbss .gt. bssmax) bssmax = bijbss endif 55 continue 60 continue endif c c make arc wt psrn - arc wt c awtmax = psrn - awtmax if (awthi .ge. psrnov2) then do 70 i = ilo, ihi if ((bi .eq. 1) .and. (bj .eq. nb)) then jhi1 = min(jhi, jhi - al0 + i) else jhi1 = jhi endif do 65 j = jhi1, jlo, -1 awt1 = cwts(j) - cwts(i) if (awt1 .ge. awtmax) then bijbss = (sx(j) - sx(i))**2/(awt1*(psrn-awt1)) if (bijbss .gt. bssmax) bssmax = bijbss endif 65 continue 70 continue endif endif 100 continue if (tss.le.bssmax+0.0001) tss = bssmax + 1.0 wtmaxp = bssmax/((tss-bssmax)/(rn-2.0)) c deallocate memory deallocate(bpsmax, bpsmin, bb, ibmin, ibmax) deallocate(bssbij, bssijmax, bloci, blocj, loc, awt) return end c function for the max (over small arcs) wtd t-statistic on permuted data c new code to speed up this part 4/1/2010 double precision function hwtmaxp(n,k,px,wts,sx,cwts,mncwt,al0) integer n,k,al0 double precision px(n),wts(n),sx(n),cwts(n),mncwt(k) integer i, j, nmj, ipj, ipnmj double precision rn, rj, rnj, bssmax, bssij, psmin, psmax, psdiff, 1 bsslim, ssq, tss c create blocks of size k (or k+1) to span 1 thru n c block partial sum max and min double precision, allocatable :: bpsmax(:), bpsmin(:) c location of the max and min integer, allocatable :: bb(:) c variables to work on block specific data integer nb, ilo, ihi, l double precision psum, psdiffsq rn = dble(n) c number of blocks nb = int(rn/dble(k)) c allocate memory allocate(bpsmax(nb), bpsmin(nb)) allocate(bb(nb)) c block boundaries do 110 i = 1, nb bb(i) = nint(rn*(dble(i)/dble(nb))) 110 continue c don't need global min and max c find the max, min of partial sums and their locations within blocks ilo = 1 psum = 0 ssq = 0.0d0 bssmax = 0.0d0 rn = cwts(n) do 20 j = 1, nb sx(ilo) = psum + px(ilo)*wts(ilo) ssq = ssq + wts(ilo)*px(ilo)**2 psmin = sx(ilo) ipsmin = ilo psmax = sx(ilo) ipsmax = ilo do 10 i = ilo+1, bb(j) sx(i) = sx(i-1) + px(i)*wts(i) ssq = ssq + wts(i)*px(i)**2 if (sx(i) .lt. psmin) then psmin = sx(i) ipsmin = i endif if (sx(i) .gt. psmax) then psmax = sx(i) ipsmax = i endif 10 continue c store the block min, max and locations bpsmin(j) = psmin bpsmax(j) = psmax c reset ilo to be the block boundary + 1 psum = sx(bb(j)) ilo = bb(j) + 1 c calculate the bss at the block max & min pr i = abs(ipsmin - ipsmax) if ((i .le. k) .and. (i .ge. al0)) then rj = abs(cwts(ipsmax) - cwts(ipsmin)) rnj = rj*(rn-rj) bssij = (bpsmax(j) - bpsmin(j))**2/rnj if (bssmax .lt. bssij) bssmax = bssij endif 20 continue tss = ssq - (sx(n)/rn)**2 c check the first block ilo = 1 ihi = bb(1) psdiff = bpsmax(1) - bpsmin(1) psdiffsq = psdiff**2 do 40 j = al0,k rj = mncwt(j) bsslim = psdiffsq/(rj*(rn-rj)) if (bsslim .lt. bssmax) go to 50 sxmx = 0.0d0 do 30 i = ilo,ihi-j ipj = i+j rj = cwts(ipj) - cwts(i) bssij = (sx(ipj) - sx(i))**2/(rj*(rn-rj)) if (bssij .gt. bssmax) bssmax = bssij 30 continue 40 continue c now the minor arcs spanning the end (n) 50 psdiff = max(abs(bpsmax(1)-bpsmin(nb)), abs(bpsmax(nb)-bpsmin(1))) psdiffsq = psdiff**2 do 70 j = al0,k rj = mncwt(j) bsslim = psdiffsq/(rj*(rn-rj)) if (bsslim .lt. bssmax) go to 100 nmj = n-j do 60 i = 1,j ipnmj = i + nmj rj = cwts(ipnmj) - cwts(i) bssij = (sx(ipnmj) - sx(i))**2/(rj*(rn-rj)) if (bssij .gt. bssmax) bssmax = bssij 60 continue 70 continue c now the other blocks 100 do 200 l = 2,nb ilo = bb(l-1)+1 ihi = bb(l) psdiff = bpsmax(l) - bpsmin(l) psdiffsq = psdiff**2 do 140 j = al0,k rj = mncwt(j) bsslim = psdiffsq/(rj*(rn-rj)) if (bsslim .lt. bssmax) go to 150 sxmx = 0.0d0 do 130 i = ilo,ihi-j ipj = i+j rj = cwts(ipj) - cwts(i) bssij = (sx(ipj) - sx(i))**2/(rj*(rn-rj)) if (bssij .gt. bssmax) bssmax = bssij 130 continue 140 continue 150 psdiff = max(abs(bpsmax(l)-bpsmin(l-1)), 1 abs(bpsmax(l-1)-bpsmin(l))) psdiffsq = psdiff**2 do 170 j = al0,k rj = mncwt(j) bsslim = psdiffsq/(rj*(rn-rj)) if (bsslim .lt. bssmax) go to 200 do 160 i = ilo-j,ilo-1 ipj = i+j rj = cwts(ipj) - cwts(i) bssij = (sx(ipj) - sx(i))**2/(rj*(rn-rj)) if (bssij .gt. bssmax) bssmax = bssij 160 continue 170 continue 200 continue c call dblepr("bss max", 7, bssmax, 1) if (tss .le. bssmax+0.0001d0) tss = bssmax + 1.0d0 hwtmaxp = bssmax/((tss-bssmax)/(dble(n)-2.0d0)) c deallocate memory deallocate(bpsmax, bpsmin, bb) return end c the new statistic routine doesn't compute mncwt subroutine getmncwt(n, cwts, k, mncwt, delta) integer n, k double precision cwts(n), mncwt(k), delta integer i, j, nmj double precision rj, rn rn = cwts(n) do 30 j = 1,k mncwt(j) = cwts(j) nmj = n-j do 10 i = 1,nmj rj = cwts(i+j) - cwts(i) mncwt(j) = min(mncwt(j), rj) 10 continue do 20 i = 1, j rj = cwts(i+nmj) - cwts(i) mncwt(j) = min(mncwt(j), rn-rj) 20 continue 30 continue j = k+1 nmj = n-j delta = cwts(j) do 40 i = 1,nmj rj = cwts(i+j) - cwts(i) delta = min(delta, rj) 40 continue do 50 i = 1, j rj = cwts(i+nmj) - cwts(i) delta = min(delta, rn-rj) 50 continue delta = delta/cwts(n) return end DNAcopy/src/cbststats.f0000644000175200017520000006126514710217127016055 0ustar00biocbuildbiocbuildc new approach to maximizing t-statistic c dynamic memory allocation using allocatable arrays subroutine tmaxo(n,x,tss,sx,iseg,ostat,al0,ibin) integer n,iseg(2),al0 double precision x(n),tss,sx(n),ostat logical ibin c c look at the partial sums in blocks of size sqrt(n) c integer ipsmin, ipsmax, ipsmin0, ipsmax0, nb, i, j, k, l, nb1, 1 nb2, bi, bj, ilo, ihi, jlo, jhi, alenmax, i2j, sxmxi, 2 alenlo, alenhi, tmaxi, tmaxj, ixlo, ixhi, nal0 double precision psum, psmin, psmax, psmin0, psmax0, bssmax, 1 bsslim, rn, rj, rjhi, rjlo, rnjov1, sij1, sij2, sijmx0, 2 absx, sxmx, bijbss, rnov2, psdiff c c use local arrays for working within blocks c block partial sum max and min double precision, allocatable :: bpsmax(:), bpsmin(:) c location of the max and min integer, allocatable :: bb(:), ibmin(:), ibmax(:) c t statistic corresponding to max for block i,j (and max possible) double precision, allocatable :: bssbij(:), bssijmax(:) c row, column and order vector for reordering bssbij integer, allocatable :: bloci(:), blocj(:), loc(:), alen(:) c calculate number of blocks (nb) and block boundaries (vector bb) rn = dble(n) if (n .ge. 50) then nb = nint(sqrt(dble(n))) else nb = 1 endif c the number of paiwise block comparison nb2 = nb*(nb+1)/2 c allocate memory allocate(bpsmax(nb), bpsmin(nb)) allocate(bb(nb), ibmin(nb), ibmax(nb)) allocate(bssbij(nb2), bssijmax(nb2)) allocate(bloci(nb2), blocj(nb2), loc(nb2), alen(nb2)) c block boundaries do 110 i = 1, nb bb(i) = nint(rn*(dble(i)/dble(nb))) 110 continue c find the max, min of partial sums and their locations within blocks ilo = 1 psum = 0 psmin0 = 0 psmax0 = 0 ipsmin0 = n ipsmax0 = n do 20 j = 1, nb sx(ilo) = psum + x(ilo) psmin = sx(ilo) ipsmin = ilo psmax = sx(ilo) ipsmax = ilo do 10 i = ilo+1, bb(j) sx(i) = sx(i-1) + x(i) if (sx(i) .lt. psmin) then psmin = sx(i) ipsmin = i endif if (sx(i) .gt. psmax) then psmax = sx(i) ipsmax = i endif 10 continue c store the block min, max and locations ibmin(j) = ipsmin ibmax(j) = ipsmax bpsmin(j) = psmin bpsmax(j) = psmax c adjust global min, max and locations if (psmin .lt. psmin0) then psmin0 = psmin ipsmin0 = ipsmin endif if (psmax .gt. psmax0) then psmax0 = psmax ipsmax0 = ipsmax endif c reset ilo to be the block boundary + 1 psum = sx(bb(j)) ilo = bb(j) + 1 20 continue c calculate bss for max s_i - min s_i psdiff = psmax0 - psmin0 rj = dble(abs(ipsmax0 - ipsmin0)) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssmax = rnjov1*(psdiff-0.5)**2 else bssmax = rnjov1*psdiff**2 endif tmaxi = min(ipsmax0, ipsmin0) tmaxj = max(ipsmax0, ipsmin0) c if the segment is all constant then psdiff = 0 and so bssmax = 0 if (psdiff .le. 0) then bssmax = 0 go to 120 endif c for a pair of blocks (i,j) calculate the max absolute t-statistic c at the (min_i, max_j) and (max_i, min_j) locations c for other indices the t-statistic can be bounded using this c c if a block doesn't have the potential to exceed bssmax ignore it c calculate the bsslim for each block and include ones >= bssmax rnov2 = rn/2 l = 0 nal0 = n - al0 do 40 i = 1, nb do 30 j = i, nb c calculate bsslim if (i .eq. 1) then ilo = 1 else ilo = bb(i-1) + 1 endif ihi = bb(i) if (j .eq. 1) then jlo = 1 else jlo = bb(j-1) + 1 endif jhi = bb(j) alenhi = jhi - ilo if (alenhi .gt. nal0) alenhi = nal0 rjhi = dble(alenhi) if (i .eq. j) then alenlo = 1 else alenlo = jlo - ihi endif if (alenlo .lt. al0) alenlo = al0 c max S_k over block j - min S_k over block i sij1 = abs(bpsmax(j) - bpsmin(i)) c max S_k over block i - min S_k over block j sij2 = abs(bpsmax(i) - bpsmin(j)) c if i = j then sij1 and sij2 are the same sijmx0 = max(sij1, sij2) rjlo = dble(alenlo) rnjov1 = rn/min(rjlo*(rn-rjlo), rjhi*(rn-rjhi)) if (ibin) then bsslim = rnjov1*(sijmx0-0.5)**2 else bsslim = rnjov1*(sijmx0**2) endif c if its as large as bssmax add block if (bssmax .le. bsslim) then l = l+1 loc(l) = l bloci(l) = i blocj(l) = j bssijmax(l) = bsslim c max sij in the (i,j) block, t-statistic etc if (sij1 .gt. sij2) then alen(l) = abs(ibmax(j) - ibmin(i)) rj = dble(alen(l)) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssbij(l) = rnjov1*(sij1-0.5)**2 else bssbij(l) = rnjov1*(sij1**2) endif else alen(l) = abs(ibmin(j) - ibmax(i)) rj = dble(alen(l)) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssbij(l) = rnjov1*(sij2-0.5)**2 else bssbij(l) = rnjov1*(sij2**2) endif endif endif 30 continue 40 continue nb1 = l c Now sort the t-statistics by their magnitude call qsort4(bssbij, loc, 1, nb1) c now go through the blocks in reverse order (largest down) do 100 l = nb1, 1, -1 k = loc(l) c need to check a block only if it has potential to increase bss c rjlo is the smalllest (j-i) in the block and rjhi is the largest bsslim = bssijmax(k) if (bssmax .le. bsslim) then c bi, bj give the block location bi = bloci(k) bj = blocj(k) c max arc length of interest in block alenmax = alen(k) if (bi .eq. 1) then ilo = 1 else ilo = bb(bi-1) + 1 endif ihi = bb(bi) if (bj .eq. 1) then jlo = 1 else jlo = bb(bj-1) + 1 endif jhi = bb(bj) alenhi = jhi - ilo if (alenhi .gt. nal0) alenhi = nal0 rjhi = dble(alenhi) if (bi .eq. bj) then alenlo = 1 else alenlo = jlo - ihi endif if (alenlo .lt. al0) alenlo = al0 rjlo = dble(alenlo) c c if arc length is larger than n/2 make is n - arc length c if (alenmax .gt. n - alenmax) alenmax = n - alenmax c c if alenlo <= n/2 start from (ihi, jlo) and go up c if alenhi >= n/2 start from (ilo, jhi) and go down c if ((rjlo .le. rnov2) .and. (alenlo .le. alenmax)) then do 60 i2j = alenlo, alenmax c excess calcultaions to set range of i ixlo = max(0, jlo - ilo - i2j) ixhi = max(0, ihi + i2j - jhi) sxmx = 0 do 55 i = ilo + ixlo, ihi - ixhi j = i+i2j absx = abs(sx(j) - sx(i)) if (sxmx .lt. absx) then sxmx = absx sxmxi = i endif 55 continue rj = dble(i2j) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bijbss = rnjov1*(sxmx-0.5)**2 else bijbss = rnjov1*(sxmx**2) endif if (bijbss .gt. bssmax) then bssmax = bijbss tmaxi = sxmxi tmaxj = sxmxi + i2j endif 60 continue endif c c make arclength n - arc length c alenmax = n - alenmax if ((rjhi .ge. rnov2) .and. (alenhi .ge. alenmax)) then do 70 i2j = alenhi, alenmax, -1 c excess calcultaions to set range of i ixlo = max(0, jlo - ilo - i2j) ixhi = max(0, ihi + i2j - jhi) sxmx = 0 do 65 i = ilo + ixlo, ihi - ixhi j = i + i2j absx = abs(sx(j) - sx(i)) if (sxmx .lt. absx) then sxmx = absx sxmxi = i endif 65 continue rj = dble(i2j) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bijbss = rnjov1*(sxmx-0.5)**2 else bijbss = rnjov1*(sxmx**2) endif if (bijbss .gt. bssmax) then bssmax = bijbss tmaxi = sxmxi tmaxj = sxmxi + i2j endif 70 continue endif endif 100 continue 120 if (ibin) then if (tss.le.0.0001) tss = 1.0 bssmax = bssmax/(tss/rn) else if (tss.le.bssmax+0.0001) tss = bssmax + 1.0 bssmax = bssmax/((tss-bssmax)/(rn-2.0)) endif c deallocate memory deallocate(bpsmax, bpsmin, bb, ibmin, ibmax) deallocate(bssbij, bssijmax, bloci, blocj, loc, alen) ostat = bssmax iseg(1) = tmaxi iseg(2) = tmaxj return end c function for calculating the full max t-statistic on permuted data c new approach to maximizing t-statistic using allocatable arrays double precision function tmaxp(n,tss,px,sx,al0,ibin) integer n,al0 double precision tss,px(n),sx(n) logical ibin c c look at the partial sums in blocks of size sqrt(n) c integer ipsmin, ipsmax, ipsmin0, ipsmax0, nb, i, j, k, l, nb1, 1 nb2, bi, bj, ilo, ihi, jlo, jhi, alenmax, i2j, alenlo, 2 alenhi, ixlo, ixhi, nal0 double precision psum, psmin, psmax, psmin0, psmax0, bssmax, 1 bsslim, rn, rj, rjhi, rjlo, rnjov1, sij1, sij2, sijmx0, 2 absx, sxmx, bijbss, rnov2, psdiff c c use local arrays for working within blocks c block partial sum max and min double precision, allocatable :: bpsmax(:), bpsmin(:) c location of the max and min integer, allocatable :: bb(:), ibmin(:), ibmax(:) c t statistic corresponding to max for block i,j (and max possible) double precision, allocatable :: bssbij(:), bssijmax(:) c row, column and order vector for reordering bssbij integer, allocatable :: bloci(:), blocj(:), loc(:), alen(:) c calculate number of blocks (nb) and block boundaries (vector bb) rn = dble(n) if (n .ge. 50) then nb = nint(sqrt(dble(n))) else nb = 1 endif c the number of paiwise block comparison nb2 = nb*(nb+1)/2 c allocate memory allocate(bpsmax(nb), bpsmin(nb)) allocate(bb(nb), ibmin(nb), ibmax(nb)) allocate(bssbij(nb2), bssijmax(nb2)) allocate(bloci(nb2), blocj(nb2), loc(nb2), alen(nb2)) c block boundaries do 110 i = 1, nb bb(i) = nint(rn*(dble(i)/dble(nb))) 110 continue c find the max, min of partial sums and their locations within blocks ilo = 1 psum = 0 psmin0 = 0 psmax0 = 0 ipsmin0 = n ipsmax0 = n do 20 j = 1, nb sx(ilo) = psum + px(ilo) psmin = sx(ilo) ipsmin = ilo psmax = sx(ilo) ipsmax = ilo do 10 i = ilo+1, bb(j) sx(i) = sx(i-1) + px(i) if (sx(i) .lt. psmin) then psmin = sx(i) ipsmin = i endif if (sx(i) .gt. psmax) then psmax = sx(i) ipsmax = i endif 10 continue c store the block min, max and locations ibmin(j) = ipsmin ibmax(j) = ipsmax bpsmin(j) = psmin bpsmax(j) = psmax c adjust global min, max and locations if (psmin .lt. psmin0) then psmin0 = psmin ipsmin0 = ipsmin endif if (psmax .gt. psmax0) then psmax0 = psmax ipsmax0 = ipsmax endif c reset ilo to be the block boundary + 1 psum = sx(bb(j)) ilo = bb(j) + 1 20 continue c calculate bss for max s_i - min s_i psdiff = psmax0 - psmin0 rj = dble(abs(ipsmax0 - ipsmin0)) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssmax = rnjov1*(psdiff-0.5)**2 else bssmax = rnjov1*psdiff**2 endif c for a pair of blocks (i,j) calculate the max absolute t-statistic c at the (min_i, max_j) and (max_i, min_j) locations c for other indices the t-statistic can be bounded using this c c if a block doesn't have the potential to exceed bssmax ignore it c calculate the bsslim for each block and include ones >= bssmax rnov2 = rn/2 l = 0 nal0 = n - al0 do 40 i = 1, nb do 30 j = i, nb c calculate bsslim if (i .eq. 1) then ilo = 1 else ilo = bb(i-1) + 1 endif ihi = bb(i) if (j .eq. 1) then jlo = 1 else jlo = bb(j-1) + 1 endif jhi = bb(j) alenhi = jhi - ilo if (alenhi .gt. nal0) alenhi = nal0 rjhi = dble(alenhi) if (i .eq. j) then alenlo = 1 else alenlo = jlo - ihi endif if (alenlo .lt. al0) alenlo = al0 c max S_k over block j - min S_k over block i sij1 = abs(bpsmax(j) - bpsmin(i)) c max S_k over block i - min S_k over block j sij2 = abs(bpsmax(i) - bpsmin(j)) c if i = j then sij1 and sij2 are the same sijmx0 = max(sij1, sij2) rjlo = dble(alenlo) rnjov1 = rn/min(rjlo*(rn-rjlo), rjhi*(rn-rjhi)) if (ibin) then bsslim = rnjov1*(sijmx0-0.5)**2 else bsslim = rnjov1*(sijmx0**2) endif c if its as large as bssmax add block if (bssmax .le. bsslim) then l = l+1 loc(l) = l bloci(l) = i blocj(l) = j bssijmax(l) = bsslim c max sij in the (i,j) block, t-statistic etc if (sij1 .gt. sij2) then alen(l) = abs(ibmax(j) - ibmin(i)) rj = dble(alen(l)) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssbij(l) = rnjov1*(sij1-0.5)**2 else bssbij(l) = rnjov1*(sij1**2) endif else alen(l) = abs(ibmin(j) - ibmax(i)) rj = dble(alen(l)) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssbij(l) = rnjov1*(sij2-0.5)**2 else bssbij(l) = rnjov1*(sij2**2) endif endif endif 30 continue 40 continue nb1 = l c Now sort the t-statistics by their magnitude call qsort4(bssbij, loc, 1, nb1) c now go through the blocks in reverse order (largest down) do 100 l = nb1, 1, -1 k = loc(l) c need to check a block only if it has potential to increase bss c rjlo is the smalllest (j-i) in the block and rjhi is the largest bsslim = bssijmax(k) if (bssmax .le. bsslim) then c bi, bj give the block location bi = bloci(k) bj = blocj(k) c max arc length of interest in block alenmax = alen(k) if (bi .eq. 1) then ilo = 1 else ilo = bb(bi-1) + 1 endif ihi = bb(bi) if (bj .eq. 1) then jlo = 1 else jlo = bb(bj-1) + 1 endif jhi = bb(bj) alenhi = jhi - ilo if (alenhi .gt. nal0) alenhi = nal0 rjhi = dble(alenhi) if (bi .eq. bj) then alenlo = 1 else alenlo = jlo - ihi endif if (alenlo .lt. al0) alenlo = al0 rjlo = dble(alenlo) c c if arc length is larger than n/2 make is n - arc length c if (alenmax .gt. n - alenmax) alenmax = n - alenmax c c if alenlo <= n/2 start from (ihi, jlo) and go up c if alenhi >= n/2 start from (ilo, jhi) and go down c if ((rjlo .le. rnov2) .and. (alenlo .le. alenmax)) then do 60 i2j = alenlo, alenmax c excess calcultaions to set range of i ixlo = max(0, jlo - ilo - i2j) ixhi = max(0, ihi + i2j - jhi) sxmx = 0 do 55 i = ilo + ixlo, ihi - ixhi j = i+i2j absx = abs(sx(j) - sx(i)) if (sxmx .lt. absx) sxmx = absx 55 continue rj = dble(i2j) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bijbss = rnjov1*(sxmx-0.5)**2 else bijbss = rnjov1*(sxmx**2) endif if (bijbss .gt. bssmax) bssmax = bijbss 60 continue endif c c make arclength n - arc length c alenmax = n - alenmax if ((rjhi .ge. rnov2) .and. (alenhi .ge. alenmax)) then do 70 i2j = alenhi, alenmax, -1 c excess calcultaions to set range of i ixlo = max(0, jlo - ilo - i2j) ixhi = max(0, ihi + i2j - jhi) sxmx = 0 do 65 i = ilo + ixlo, ihi - ixhi j = i + i2j absx = abs(sx(j) - sx(i)) if (sxmx .lt. absx) sxmx = absx 65 continue rj = dble(i2j) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bijbss = rnjov1*(sxmx-0.5)**2 else bijbss = rnjov1*(sxmx**2) endif if (bijbss .gt. bssmax) bssmax = bijbss 70 continue endif endif 100 continue if (ibin) then if (tss.le.0.0001) tss = 1.0 tmaxp = bssmax/(tss/rn) else if (tss.le.bssmax+0.0001) tss = bssmax + 1.0 tmaxp = bssmax/((tss-bssmax)/(rn-2.0)) endif c deallocate memory deallocate(bpsmax, bpsmin, bb, ibmin, ibmax) deallocate(bssbij, bssijmax, bloci, blocj, loc, alen) return end c function for the max (over small arcs) t-statistic on permuted data c new code to speed up this part 3/31/2010 double precision function htmaxp(n,k,tss,px,sx,al0,ibin) integer n,k,al0 double precision tss,px(n),sx(n) logical ibin integer i, j, nmj double precision rn, rj, absx, sxmx, bssmx, psmin, psmax, psdiff, 1 bsslim, rnjov1 c create blocks of size k (or k+1) to span 1 thru n c block partial sum max and min double precision, allocatable :: bpsmax(:), bpsmin(:) c location of the max and min integer, allocatable :: bb(:) c variables to work on block specific data integer nb, ilo, ihi, l double precision psum, psdiffsq rn = dble(n) c number of blocks of size k (plus fraction since n/k may not be integer) nb = int(rn/dble(k)) c allocate memory allocate(bpsmax(nb), bpsmin(nb)) allocate(bb(nb)) c block boundaries do 110 i = 1, nb bb(i) = nint(rn*(dble(i)/dble(nb))) 110 continue c don't need global min and max c find the max, min of partial sums and their locations within blocks ilo = 1 psum = 0 htmaxp = 0.0d0 do 20 j = 1, nb sx(ilo) = psum + px(ilo) psmin = sx(ilo) ipsmin = ilo psmax = sx(ilo) ipsmax = ilo do 10 i = ilo+1, bb(j) sx(i) = sx(i-1) + px(i) if (sx(i) .lt. psmin) then psmin = sx(i) ipsmin = i endif if (sx(i) .gt. psmax) then psmax = sx(i) ipsmax = i endif 10 continue c store the block min, max and locations bpsmin(j) = psmin bpsmax(j) = psmax c reset ilo to be the block boundary + 1 psum = sx(bb(j)) ilo = bb(j) + 1 c calculate the bss at the block max & min pr i = abs(ipsmin - ipsmax) if ((i .le. k) .and. (i .ge. al0)) then rj = dble(i) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssmx = rnjov1*(bpsmax(j) - bpsmin(j) -0.5)**2 else bssmx = rnjov1*(bpsmax(j) - bpsmin(j))**2 endif if (htmaxp .lt. bssmx) htmaxp = bssmx endif 20 continue c check the first block ilo = 1 ihi = bb(1) psdiff = bpsmax(1) - bpsmin(1) if (ibin) then psdiffsq = (psdiff-0.5)**2 else psdiffsq = psdiff**2 endif do 40 j = al0,k rj = dble(j) rnjov1 = rn/(rj*(rn-rj)) bsslim = rnjov1*psdiffsq if (bsslim .lt. htmaxp) go to 50 sxmx = 0.0d0 do 30 i = ilo,ihi-j absx = abs(sx(i+j) - sx(i)) if (sxmx.lt.absx) sxmx = absx 30 continue if (ibin) then bssmx = rnjov1*(abs(sxmx)-0.5)**2 else bssmx = rnjov1*sxmx**2 endif if (htmaxp.lt.bssmx) htmaxp = bssmx 40 continue c now the minor arcs spanning the end (n) 50 psdiff = max(abs(bpsmax(1)-bpsmin(nb)), abs(bpsmax(nb)-bpsmin(1))) if (ibin) then psdiffsq = (psdiff-0.5)**2 else psdiffsq = psdiff**2 endif do 70 j = al0,k rj = dble(j) rnjov1 = rn/(rj*(rn-rj)) bsslim = rnjov1*psdiffsq if (bsslim .lt. htmaxp) go to 100 sxmx = 0.0d0 nmj = n-j do 60 i = 1,j absx = abs(sx(i+nmj) - sx(i)) if (sxmx.lt.absx) sxmx = absx 60 continue if (ibin) then bssmx = rnjov1*(abs(sxmx)-0.5)**2 else bssmx = rnjov1*sxmx**2 endif if (htmaxp.lt.bssmx) htmaxp = bssmx 70 continue c now the other blocks 100 do 200 l = 2,nb ilo = bb(l-1)+1 ihi = bb(l) psdiff = bpsmax(l) - bpsmin(l) if (ibin) then psdiffsq = (psdiff-0.5)**2 else psdiffsq = psdiff**2 endif do 140 j = al0,k rj = dble(j) rnjov1 = rn/(rj*(rn-rj)) bsslim = rnjov1*psdiffsq if (bsslim .lt. htmaxp) go to 150 sxmx = 0.0d0 do 130 i = ilo,ihi-j absx = abs(sx(i+j) - sx(i)) if (sxmx.lt.absx) sxmx = absx 130 continue if (ibin) then bssmx = rnjov1*(abs(sxmx)-0.5)**2 else bssmx = rnjov1*sxmx**2 endif if (htmaxp.lt.bssmx) htmaxp = bssmx 140 continue 150 psdiff = max(abs(bpsmax(l)-bpsmin(l-1)), 1 abs(bpsmax(l-1)-bpsmin(l))) if (ibin) then psdiffsq = (psdiff-0.5)**2 else psdiffsq = psdiff**2 endif do 170 j = al0,k rj = dble(j) rnjov1 = rn/(rj*(rn-rj)) bsslim = rnjov1*psdiffsq if (bsslim .lt. htmaxp) go to 200 sxmx = 0.0d0 nmj = n-j do 160 i = ilo-j,ilo-1 absx = abs(sx(i+j) - sx(i)) if (sxmx.lt.absx) sxmx = absx 160 continue if (ibin) then bssmx = rnjov1*(abs(sxmx)-0.5)**2 else bssmx = rnjov1*sxmx**2 endif if (htmaxp.lt.bssmx) htmaxp = bssmx 170 continue 200 continue if (ibin) then if (tss .le. 0.0001d0) tss = 1.0d0 htmaxp = htmaxp/(tss/rn) else if (tss .le. htmaxp+0.0001d0) tss = htmaxp + 1.0d0 htmaxp = htmaxp/((tss-htmaxp)/(rn-2.0d0)) endif c deallocate memory deallocate(bpsmax, bpsmin, bb) return end DNAcopy/src/changepoints-wtd.f0000644000175200017520000001417314710217127017315 0ustar00biocbuildbiocbuildc Ternary segmentation with permutation reference distribution c probes have weights due to differences in variances subroutine wfindcpt(n,x,tss,wts,rwts,cwts,px,sx,nperm,cpval,ncpt, 1 icpt,hybrid,al0,hk,mncwt,delta,ngrid,sbn,sbdry,tol) integer n,nperm,ncpt,icpt(2),al0,hk,ngrid,sbn,sbdry(sbn) logical hybrid double precision x(n),tss,wts(n),rwts(n),cwts(n),px(n),sx(n), 1 cpval,mncwt(hk),delta,tol integer np,nrej,nrejc,iseg(2),n1,n2,n12,l,k double precision ostat,ostat1,pstat,tpval,pval1,pval2 c new functions to replace tmax and htmax (also tmaxo replaces tmax1) double precision tailp, wtmaxp, hwtmaxp, wtpermp external tailp, wtmaxp, hwtmaxp, wtpermp call rndstart() nrej = 0 ncpt = 0 c call the observed statistic routine call wtmaxo(n,x,wts,tss,sx,cwts,iseg,ostat,al0) ostat1 = sqrt(ostat) ostat = ostat * 0.99999 c if maximal t-statistic is too small (for now use 0.1) don't split if (ostat1 .le. 0.1) go to 500 c if maximal t-statistic is too large (for now use 7.0) split c also make sure it's not affected by outliers i.e. small seglength l = min(iseg(2) - iseg(1), n - iseg(2) + iseg(1)) if ((ostat1 .ge. 7.0) .and. (l .ge. 10)) go to 200 c o.w calculate p-value and decide if & how data are segmented if (hybrid) then call getmncwt(n, cwts, hk, mncwt, delta) c delta is a function of arc lengths pval1 = tailp(ostat1, delta, n, ngrid, tol) if (pval1 .gt. cpval) go to 500 pval2 = cpval - pval1 nrejc = int(pval2*dble(nperm)) k=nrejc*(nrejc+1)/2 + 1 do 50 np = 1,nperm c call permutation code for data with weights call wxperm(n,x,px,rwts) c call the small arc permutation statistic function pstat = hwtmaxp(n,hk,px,wts,sx,cwts,mncwt,al0) if (ostat.le.pstat) then nrej = nrej + 1 k = k + 1 endif if (nrej.gt.nrejc) go to 500 if (np .ge. sbdry(k)) go to 200 50 continue else nrejc = int(cpval*dble(nperm)) k=nrejc*(nrejc+1)/2 + 1 do 100 np = 1,nperm c call permutation code for data with weights call wxperm(n,x,px,rwts) c call full data permutation statistic function pstat = wtmaxp(n,px,wts,sx,cwts,al0) if (ostat.le.pstat) then nrej = nrej + 1 k = k + 1 endif if (nrej.gt.nrejc) go to 500 if (np .ge. sbdry(k)) go to 200 100 continue endif 200 if (iseg(2).eq.n) then ncpt = 1 icpt(1) = iseg(1) else if(iseg(1).eq.0) then ncpt = 1 icpt(1) = iseg(2) else l = 1 n1 = iseg(1) n12 = iseg(2) n2 = n12 - n1 tpval = wtpermp(n1,n2,n12,x(l),px,wts(l),rwts(l),nperm) if (tpval.le.cpval) then ncpt = 1 icpt(1) = iseg(1) endif l = iseg(1) + 1 n12 = n - iseg(1) n2 = n - iseg(2) n1 = n12 - n2 tpval = wtpermp(n1,n2,n12,x(l),px,wts(l),rwts(l),nperm) if (tpval.le.cpval) then ncpt = ncpt + 1 icpt(ncpt) = iseg(2) endif endif endif 500 call rndend() return end c ******* code to permute the data vector with weights ******** c since variance of probe i is inversely proportional to weights c multiply by square root, permute and then divide by square root subroutine wxperm(n,x,px,rwts) integer n double precision x(n),px(n),rwts(n) integer i,j double precision cc,tmpx double precision dunif external dunif do 10 i = 1,n px(i) = x(i)*rwts(i) 10 continue do 20 i = n,1,-1 cc = dunif() j = int(cc*dble(i))+1 tmpx = px(i) px(i) = px(j)/rwts(i) px(j) = tmpx 20 continue return end c function for the p-value of t-statistics for removing edge effects double precision function wtpermp(n1,n2,n,x,px,wts,rwts,nperm) integer n1,n2,n,nperm double precision x(n),px(n),wts(n),rwts(n) integer np,i,m1,j,nrej double precision xsum1,xsum2,xbar,ostat,pstat,rn1,rn2,rm1, 1 tstat, tss, rn, cc, tmpx double precision dunif external dunif if (n1.eq.1 .or. n2.eq.1) then nrej = nperm go to 110 endif xsum1 = 0.0 tss = 0.0 rn1 = 0.0 do 10 i=1,n1 px(i) = x(i)*rwts(i) xsum1 = xsum1 + wts(i)*x(i) tss = tss + wts(i)*x(i)**2 rn1 = rn1 + wts(i) 10 continue xsum2 = 0.0 rn2 = 0.0 do 20 i=n1+1,n px(i) = x(i) xsum2 = xsum2 + wts(i)*x(i) tss = tss + wts(i)*x(i)**2 rn2 = rn2 + wts(i) 20 continue rn = rn1 + rn2 xbar = (xsum1 + xsum2)/rn tss = tss - rn*(xbar**2) if (n1.le.n2) then m1 = n1 rm1 = rn1 ostat = 0.99999*abs(xsum1/rn1 - xbar) tstat = (ostat**2)*rn1*rn/rn2 else m1 = n2 rm1 = rn2 ostat = 0.99999*abs(xsum2/rn2 - xbar) tstat = (ostat**2)*rn2*rn/rn1 endif nrej = 0 tstat = tstat/((tss-tstat)/(dble(n)-2.0)) c if observed t is large (> 5) don't bother with permutation p-value c also make sure there are enough observations i.e. m1 >= 10 if ((tstat .gt. 25) .and. (m1 .ge. 10)) go to 110 do 100 np = 1,nperm xsum1 = 0 do 30 i = n,n-m1+1,-1 cc = dunif() j = int(cc*dble(i))+1 tmpx = px(i) px(i) = px(j) px(j) = tmpx c the observation should be divided by sqrt(wts(i)) to get the correct c probe variance. But should be multiplied by wts(i) for statistic xsum1 = xsum1 + px(i)*rwts(i) 30 continue pstat = abs(xsum1/rm1 - xbar) if (ostat.le.pstat) nrej = nrej + 1 100 continue 110 wtpermp = dble(nrej)/dble(nperm) return end DNAcopy/src/changepoints.f0000644000175200017520000001417114710217127016517 0ustar00biocbuildbiocbuildc Ternary segmentation with permutation reference distribution subroutine fndcpt(n,x,tss,px,sx,nperm,cpval,ncpt,icpt,ibin, 1 hybrid,al0,hk,delta,ngrid,sbn,sbdry,tol) integer n,nperm,ncpt,icpt(2),al0,hk,ngrid,sbn,sbdry(sbn) logical ibin,hybrid double precision x(n),tss,px(n),sx(n),cpval,delta,tol integer np,nrej,nrejc,iseg(2),n1,n2,n12,l,k double precision ostat,ostat1,pstat,tpval,pval1,pval2 c new functions to replace tmax and htmax (also tmaxo replaces tmax1) double precision tailp, tmaxp, htmaxp, tpermp external tailp, tmaxp, htmaxp, tpermp call rndstart() nrej = 0 ncpt = 0 c call tmax1(n,twon,x,tss,sx,tx,iseg,ostat,ibin) call tmaxo(n,x,tss,sx,iseg,ostat,al0,ibin) ostat1 = sqrt(ostat) ostat = ostat * 0.99999 c call dblepr("Max Stat",8,ostat,1) c call intpr("Location",8,iseg,2) c if maximal t-statistic is too small (for now use 0.1) don't split if (ostat1 .le. 0.1) go to 500 c if maximal t-statistic is too large (for now use 7.0) split c also make sure it's not affected by outliers i.e. small seglength l = min(iseg(2) - iseg(1), n - iseg(2) + iseg(1)) if ((ostat1 .ge. 7.0) .and. (l .ge. 10)) go to 200 c o.w calculate p-value and decide if & how data are segmented if (hybrid) then pval1 = tailp(ostat1, delta, n, ngrid, tol) if (pval1 .gt. cpval) go to 500 pval2 = cpval - pval1 nrejc = int(pval2*dble(nperm)) k=nrejc*(nrejc+1)/2 + 1 do 50 np = 1,nperm call xperm(n,x,px) c pstat = htmax(n,twon,hk,tss,px,sx,tx,ibin) pstat = htmaxp(n,hk,tss,px,sx,al0,ibin) if (ostat.le.pstat) then nrej = nrej + 1 k = k + 1 endif if (nrej.gt.nrejc) go to 500 if (np .ge. sbdry(k)) go to 200 50 continue else nrejc = int(cpval*dble(nperm)) k=nrejc*(nrejc+1)/2 + 1 do 100 np = 1,nperm call xperm(n,x,px) c pstat = tmax(n,twon,tss,px,sx,tx,ibin) pstat = tmaxp(n,tss,px,sx,al0,ibin) c call dblepr("Perm Max Stat",13,pstat,1) if (ostat.le.pstat) then nrej = nrej + 1 k = k + 1 endif c call intpr("num rej",7,nrej,1) if (nrej.gt.nrejc) go to 500 if (np .ge. sbdry(k)) go to 200 100 continue endif 200 if (iseg(2).eq.n) then ncpt = 1 icpt(1) = iseg(1) else if(iseg(1).eq.0) then ncpt = 1 icpt(1) = iseg(2) else l = 1 n1 = iseg(1) n12 = iseg(2) n2 = n12 - n1 tpval = tpermp(n1,n2,n12,x(l),px,nperm) c call dblepr("binseg p-value",14,tpval,1) if (tpval.le.cpval) then ncpt = 1 icpt(1) = iseg(1) endif l = iseg(1) + 1 n12 = n - iseg(1) n2 = n - iseg(2) n1 = n12 - n2 tpval = tpermp(n1,n2,n12,x(l),px,nperm) c call dblepr("binseg p-value",14,tpval,1) if (tpval.le.cpval) then ncpt = ncpt + 1 icpt(ncpt) = iseg(2) endif endif endif 500 call rndend() return end c code to permute the data vector subroutine xperm(n,x,px) integer n double precision x(n),px(n) integer i,j double precision cc,tmpx double precision dunif external dunif do 10 i = 1,n px(i) = x(i) 10 continue do 20 i = n,1,-1 cc = dunif() j = int(cc*dble(i))+1 tmpx = px(i) px(i) = px(j) px(j) = tmpx 20 continue return end c function for the p-value of t-statistics for removing edge effects double precision function tpermp(n1,n2,n,x,px,nperm) integer n1,n2,n,nperm double precision x(n),px(n) integer np,i,m1,j,nrej double precision xsum1,xsum2,xbar,ostat,pstat,rn1,rn2,rm1, 1 tstat, tss, rn, cc, tmpx double precision dunif external dunif rn1 = dble(n1) rn2 = dble(n2) rn = rn1 + rn2 if (n1.eq.1 .or. n2.eq.1) then nrej = nperm go to 110 endif xsum1 = 0.0 tss = 0.0 do 10 i=1,n1 px(i) = x(i) xsum1 = xsum1 + x(i) tss = tss + x(i)**2 10 continue xsum2 = 0.0 do 20 i=n1+1,n px(i) = x(i) xsum2 = xsum2 + x(i) tss = tss + x(i)**2 20 continue xbar = (xsum1 + xsum2)/rn tss = tss - rn*(xbar**2) if (n1.le.n2) then m1 = n1 rm1 = rn1 ostat = 0.99999*abs(xsum1/rn1 - xbar) tstat = (ostat**2)*rn1*rn/rn2 else m1 = n2 rm1 = rn2 ostat = 0.99999*abs(xsum2/rn2 - xbar) tstat = (ostat**2)*rn2*rn/rn1 endif c call dblepr("O-Stat",6,ostat,1) nrej = 0 tstat = tstat/((tss-tstat)/(rn-2.0)) c call dblepr("T-square",8,tstat,1) c if observed t is large (> 5) don't bother with permutation p-value c also make sure there are enough observations i.e. m1 >= 10 if ((tstat .gt. 25) .and. (m1 .ge. 10)) go to 110 do 100 np = 1,nperm c******************************************* c the following is very inefficient c******************************************* c call xperm(n,x,px) c xsum1 = 0.0 c do 30 i=1,m1 c xsum1 = xsum1 + px(i) c 30 continue c******************************************* c changed to the following: instead of c full permutation sample m1 w.o. repl c******************************************* xsum1 = 0 do 30 i = n,n-m1+1,-1 cc = dunif() j = int(cc*dble(i))+1 tmpx = px(i) px(i) = px(j) px(j) = tmpx xsum1 = xsum1 + px(i) 30 continue pstat = abs(xsum1/rm1 - xbar) c call dblepr("P-Stat",6,pstat,1) if (ostat.le.pstat) nrej = nrej + 1 100 continue 110 tpermp = dble(nrej)/dble(nperm) return end DNAcopy/src/esegment.f0000644000175200017520000000250314710217127015640 0ustar00biocbuildbiocbuildc for binary segmentation of exon data re-use the segment.p code c with one-sided p-value subroutine esegp(n, exndat, ostat, eloc, pval, ng, tol) integer n, eloc, ng double precision exndat(n), ostat, pval, tol double precision btailp external btailp integer i double precision tss tss = 0 do 10 i = 1, n tss = tss + exndat(i)**2 10 continue call etmax(n, exndat, tss, ostat, eloc) c call dblepr("Max Stat",8,ostat,1) pval = btailp(ostat, n, ng, tol) pval = pval/2 if (pval .gt. 1) pval = 1.0d0 return end c looking for increase in expression - use a one-sided t-statistic c t_i = S_i*sqrt(n/(i*(n-i)))/sqrt((tss - S_i^2*n/(i*(n-i)))/(n-2)) subroutine etmax(n, x, tss, ostat, eloc) integer n, eloc double precision x(n), tss, ostat integer i double precision sumxi, btmaxi, dn, di sumxi = x(1) ostat = 0.0 eloc = -1 dn = dble(n) di = 1.0 do 20 i = 2,n-2 di = di + 1.0 sumxi = sumxi + x(i) btmaxi = -sumxi/sqrt(di*(dn-di)) if (ostat .lt. btmaxi) then ostat = btmaxi eloc = i endif 20 continue ostat = (ostat/sqrt(tss - dn*ostat**2))*sqrt(dn*(dn-2)) return end DNAcopy/src/flchoose.c0000644000175200017520000000023114710217127015624 0ustar00biocbuildbiocbuild#include #include /* Fortran function for log-combinations */ double F77_SUB(flchoose)(double *n, double *k) { return lchoose(*n, *k); } DNAcopy/src/fphyper.c0000644000175200017520000000027414710217127015506 0ustar00biocbuildbiocbuild#include #include /* Fortran function for hypergeometric CDF */ double F77_SUB(fphypr)(double *i, double *m, double *n, double *k) { return phyper(*i, *m, *n, *k, 1, 0); } DNAcopy/src/fpnorm.c0000644000175200017520000000022514710217127015326 0ustar00biocbuildbiocbuild#include #include /* Fortran function for standard normal CDF */ double F77_SUB(fpnorm)(double *x) { return pnorm(*x, 0, 1, 1, 0); } DNAcopy/src/getbdry.f0000644000175200017520000000665514710217127015505 0ustar00biocbuildbiocbuild subroutine getbdry(eta, m, nperm, mb, ibdry, etastr, tol) integer m, nperm, mb, ibdry(mb) double precision eta, etastr(m), tol double precision eta0, etalo, etahi, plo, phi, pexcd integer j, l l = 1 ibdry(1) = nperm-int(dble(nperm)*eta) etastr(1) = eta eta0 = eta do 20 j = 2,m etahi = eta0*1.1 call etabdry(nperm, etahi, j, ibdry(l+1)) call pexceed(nperm, j, ibdry(l+1), phi) etalo = eta0*0.25 call etabdry(nperm, etalo, j, ibdry(l+1)) call pexceed(nperm, j, ibdry(l+1), plo) do 10 while ((etahi-etalo)/etalo .gt. tol) eta0 = etalo + (etahi-etalo)*(eta-plo)/(phi-plo) call etabdry(nperm, eta0, j, ibdry(l+1)) call pexceed(nperm, j, ibdry(l+1), pexcd) if (pexcd .gt. eta) then etahi = eta0 phi = pexcd else etalo = eta0 plo = pexcd endif 10 continue etastr(j) = eta0 l = l+j 20 continue return end subroutine etabdry(nperm, eta0, n1s, ibdry) integer nperm, n1s, ibdry(n1s) double precision eta0 double precision fphypr external fphypr integer i, k double precision di, dn, dn1s, dk, tprob dn1s = dble(n1s) dn = dble(nperm-n1s) k = 0 dk = 0.0d0 do 10 i = 1, nperm di = dble(i) tprob = fphypr(dk, dn1s, dn, di) if (tprob .le. eta0) then k = k+1 dk = dk + 1.0d0 ibdry(k) = i endif 10 continue return end subroutine pexceed(nperm, n1s, ibdry, pexcd) integer nperm, n1s, ibdry(n1s) double precision pexcd double precision dn, dk, dn1, dk1, dn2, dk2, dn3, dk3, dlcnk integer i double precision flchoose external flchoose dn = dble(nperm) dk = dble(n1s) dn1 = dble(nperm-ibdry(1)) dlcnk = flchoose(dn, dk) pexcd = exp(flchoose(dn1, dk) - dlcnk) if (n1s .ge. 2) then dn1 = dble(ibdry(1)) dn = dble(nperm-ibdry(2)) dk = dble(n1s-1) pexcd = pexcd + exp(log(dn1) + flchoose(dn, dk) - dlcnk) endif if (n1s .ge. 3) then dn1 = dble(ibdry(1)) dn2 = dble(ibdry(2)) dn = dble(nperm-ibdry(3)) dk = dble(n1s-2) pexcd = pexcd + 1 exp(log(dn1) + log(dn1-1.0) - log(2.0) + 2 flchoose(dn, dk) - dlcnk) + 3 exp(log(dn1) + log(dn2-dn1) + flchoose(dn, dk) - dlcnk) endif if (n1s .gt. 3) then do 10 i = 4, n1s dn1 = dble(ibdry(i-3)) dk1 = dble(i-1) dk2 = dble(i-2) dk3 = dble(i-3) dn2 = dble(ibdry(i-2)) dn3 = dble(ibdry(i-1)) dn = dble(nperm-ibdry(i)) dk = dble(n1s-i+1) pexcd = pexcd + 1 exp(flchoose(dn1, dk1) + flchoose(dn, dk) - dlcnk) + 2 exp(flchoose(dn1, dk2) + log(dn3-dn1) + 3 flchoose(dn, dk) - dlcnk) + 4 exp(flchoose(dn1, dk3) + log(dn2-dn1) + log(dn3-dn2) + 3 flchoose(dn, dk) - dlcnk) + 5 exp(flchoose(dn1, dk3) + log(dn2-dn1) - log(2.0) + 6 log(dn2-dn1-1.0) + flchoose(dn, dk) - dlcnk) 10 continue endif return end DNAcopy/src/init.c0000644000175200017520000000346114710217127014775 0ustar00biocbuildbiocbuild#include #include // for NULL #include /* NOTE: Fortran is not case sensitive; But in this file F77_NAME has to be in lower case to prevent "undefined symbol: smoothLR_" error */ /* .Fortran calls */ extern void F77_NAME(bsegci)(void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(bsegp)(void *, void *, void *, void *, void *, void *); extern void F77_NAME(esegp)(void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(fndcpt)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(getbdry)(void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(prune)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(smoothlr)(void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(wfindcpt)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); static const R_FortranMethodDef FortranEntries[] = { {"bsegci", (DL_FUNC) &F77_NAME(bsegci), 9}, {"bsegp", (DL_FUNC) &F77_NAME(bsegp), 6}, {"esegp", (DL_FUNC) &F77_NAME(esegp), 7}, {"fndcpt", (DL_FUNC) &F77_NAME(fndcpt), 18}, {"getbdry", (DL_FUNC) &F77_NAME(getbdry), 7}, {"prune", (DL_FUNC) &F77_NAME(prune), 10}, {"smoothLR", (DL_FUNC) &F77_NAME(smoothlr), 8}, {"wfindcpt", (DL_FUNC) &F77_NAME(fndcpt), 21}, {NULL, NULL, 0} }; void R_init_clinfun(DllInfo *dll) { R_registerRoutines(dll, NULL, NULL, FortranEntries, NULL); R_useDynamicSymbols(dll, FALSE); } DNAcopy/src/prune.f0000644000175200017520000000561114710217127015165 0ustar00biocbuildbiocbuild subroutine prune(n,x,nseg,lseg,pcut,sx,ncpt,loc,loc1,pncpt) integer n, nseg, lseg(nseg), ncpt, loc(ncpt), loc1(2,ncpt), pncpt double precision x(n), pcut, sx(nseg) integer i, j, k, kmj double precision ssq, wssqk, wssq1, wssqj logical jleft double precision errssq external errssq ssq = 0.0 do 10 i = 1,n ssq = ssq + x(i)**2 10 continue k = 0 do 15 i = 1,nseg sx(i) = 0 do 14 j = 1,lseg(i) k = k + 1 sx(i) = sx(i) + x(k) 14 continue 15 continue k = nseg - 1 do 16 i = 1,k loc(i) = i loc1(2,i) = i 16 continue wssqk = ssq - errssq(nseg,lseg,sx,k,loc) do 100 j = k-1, 1, -1 kmj = k - j jleft = .TRUE. do 20 i = 1,j loc(i) = i loc1(1,i) = i 20 continue wssqj = ssq - errssq(nseg,lseg,sx,j,loc) do 30 while(jleft) call combn(j, kmj, loc, jleft) wssq1 = ssq - errssq(nseg,lseg,sx,j,loc) if (wssq1 .le. wssqj) then wssqj = wssq1 do 25 i = 1,j loc1(1,i) = loc(i) 25 continue endif 30 continue if (wssqj/wssqk .gt. 1+pcut) then pncpt = j+1 do 35 i = 1,pncpt loc(i) = loc1(2,i) 35 continue return else do 40 i = 1,j loc1(2,i) = loc1(1,i) 40 continue endif 100 continue pncpt = 0 return end double precision function errssq(nseg,lseg,sx,k,loc) integer nseg, lseg(nseg),k,loc(k) double precision sx(nseg) double precision segsx integer segnx, i, j errssq = 0.0 segsx = 0.0 segnx = 0 do 10 i = 1,loc(1) segsx = segsx + sx(i) segnx = segnx + lseg(i) 10 continue errssq = errssq + segsx**2/dble(segnx) do 20 j = 2,k segsx = 0.0 segnx = 0 do 15 i = loc(j-1)+1,loc(j) segsx = segsx + sx(i) segnx = segnx + lseg(i) 15 continue errssq = errssq + segsx**2/dble(segnx) 20 continue segsx = 0.0 segnx = 0 do 25 i = loc(k)+1,nseg segsx = segsx + sx(i) segnx = segnx + lseg(i) 25 continue errssq = errssq + segsx**2/dble(segnx) return end c c This program generates Choose(n,r) combinations one at a time c Adapted from Algorithm AS 88 Appl. Statist. (1975) Vol.24, No. 3 c subroutine combn(r, nmr, loc, rleft) integer r, nmr, loc(r) logical rleft integer i,j i = r do 10 while (loc(i) .eq. nmr+i) i = i-1 10 continue loc(i) = loc(i) + 1 do 20 j = i+1,r loc(j) = loc(j-1)+1 20 continue if (loc(1) .eq. nmr+1) rleft = .FALSE. return end DNAcopy/src/rshared.c0000644000175200017520000000024114710217127015453 0ustar00biocbuildbiocbuild#include void F77_SUB(rndstart)(void) { GetRNGstate(); } void F77_SUB(rndend)(void) { PutRNGstate(); } double F77_SUB(dunif)(void) { return unif_rand(); } DNAcopy/src/segmentp.f0000644000175200017520000000417614710217127015663 0ustar00biocbuildbiocbuild subroutine bsegp(n, gendat, ostat, pval, ng, tol) integer n, ng double precision gendat(n), ostat, pval, tol double precision btmax, btailp external btmax, btailp ostat = btmax(n, gendat) c call dblepr("Max Stat",8,ostat,1) pval = btailp(ostat, n, ng, tol) if (pval .gt. 1) pval = 1.0d0 return end double precision function btmax(n, x) integer n double precision x(n) integer i double precision sumxi, btmaxi, dn, di, ostat sumxi = x(1) ostat = 0.0 dn = dble(n) di = 1.0 do 20 i = 2,n-2 di = di + 1.0 sumxi = sumxi + x(i) btmaxi = dn*(sumxi**2)/(di*(dn-di)) if (ostat .lt. btmaxi) then ostat = btmaxi c ibseg = i endif 20 continue btmax = sqrt(ostat) return end c pseudo confidence interval based on permutations subroutine bsegci(n, k, sumxk, x, px, sr, vfact, nperm, bsloc) integer n, k, sr(2), nperm, bsloc(nperm) double precision sumxk, x(n), px(n), vfact(n) integer k1, nk, np, ibseg call rndstart() k1 = k+1 nk = n-k do 10 np = 1, nperm call xperm(k,x,px) call xperm(nk,x(k1),px(k1)) call btmxci(n,k,sr,px,vfact,ibseg,sumxk) bsloc(np) = ibseg 10 continue call rndend() return end subroutine btmxci(n,k,sr,x,vfact,ibseg,sumxk) integer n,k,sr(2),ibseg double precision x(n),vfact(n),sumxk integer i double precision sumxi, ostat, btmaxi ostat = vfact(k)*(sumxk**2) ibseg = k sumxi = sumxk do 10 i = k-1,sr(1),-1 sumxi = sumxi - x(i+1) btmaxi = vfact(i)*(sumxi**2) if (ostat .lt. btmaxi) then ostat = btmaxi ibseg = i endif 10 continue sumxi = sumxk do 20 i = k+1,sr(2) sumxi = sumxi + x(i) btmaxi = vfact(i)*(sumxi**2) if (ostat .lt. btmaxi) then ostat = btmaxi ibseg = i endif 20 continue ostat = sqrt(ostat) return end DNAcopy/src/smoothCNA.f0000644000175200017520000000623214710217127015667 0ustar00biocbuildbiocbuildc n = length(gdat) i.e. number of markers and log-ratio c k is the neighborhood width c oSD = how far the outlier is to the nearest observation c sSD = how close should it be moved c nchr = number of chromosomes c cfrq = number of probes in respective chromosomes subroutine smoothLR(n, gdat, nchr, cfrq, sgdat, k, oSD, sSD) integer n, nchr, cfrq(nchr), k double precision gdat(n), sgdat(n), oSD, sSD integer i, j, ilo, ihi, k1, k2, j1, ic, cilo, cihi double precision mnnbd, mxnbd, distij, xmed c temporary array for finding median double precision, allocatable :: xnbhd(:) k2 = 2*k + 1 allocate(xnbhd(k2)) c initial values for start and end of chromosomes cilo = 1 cihi = 0 c loop over chromomsomes do 100 ic = 1, nchr c end of the current chromosome cihi = cihi + cfrq(ic) do 50 i = cilo, cihi c range of the neighborhood ilo = max(cilo, i-k) ihi = min(cihi, i+k) c check if ith observation is an outlier c initialize the distances to be large mxnbd = 100*oSD mnnbd = 100*oSD do 10 j = ilo, ihi if (j .ne. i) then c calculate distance from between ith and jth obsn distij = gdat(i) - gdat(j) c if distance is less than oSD no smoothing necessary if (abs(distij) .le. oSD) then sgdat(i) = gdat(i) go to 50 c otherwise calculate distances from above and below else c mxnbd is distance from above if (distij .lt. mxnbd) mxnbd = distij c mnnbd is distance from below if (-distij .lt. mnnbd) mnnbd = -distij endif endif 10 continue c if all the points in the nbhd are above than mxnbd will be negative c and mnnbd will be greater than oSD. Vice versa if all points below c c If both are negative then the ith point is singleton in the middle c but distance oSD away from all points in the nbhd. No smoothing done. if ((mxnbd .le. 0) .and. (mnnbd .le. 0)) then sgdat(i) = gdat(i) go to 50 else c calculate the median of the nbhd c number of points in the nbhd k1 = ihi - ilo + 1 c get the data into temporary array do 20 j = ilo, ihi xnbhd(j-ilo+1) = gdat(j) 20 continue c sort the data call qsort3(xnbhd, 1, k1) c median is the midpoint if n is odd and average of the two if even j1 = k1/2 if (k1 .eq. 2*j1) then xmed = (xnbhd(j1) + xnbhd(j1+1))/2 else xmed = xnbhd(j1+1) endif c if point is above the nbhd bring it down if (mxnbd .gt. 0) sgdat(i) = xmed + sSD c if point is below the nbhd bring it up if (mnnbd .gt. 0) sgdat(i) = xmed - sSD endif 50 continue c beginning of next chromosome cilo = cilo + cfrq(ic) 100 continue deallocate(xnbhd) return end DNAcopy/src/tailprobs.f0000644000175200017520000000601614710217127016033 0ustar00biocbuildbiocbuildc tail probability of circular binary segmentation statistic c from Siegmund (1988) or Yao (1989) paper double precision function tailp(b, delta, m, ngrid, tol) double precision b, delta, tol integer m, ngrid c it1tsq is the integral of 1/(t*(1-t))**2 double precision nu, it1tsq external nu, it1tsq double precision t, tl, dincr, bsqrtm, x, nux integer i dincr = (0.5d0 - delta)/dble(ngrid) bsqrtm = b/sqrt(dble(m)) tl = 0.5d0 - dincr t = 0.5d0 - 0.5d0*dincr tailp = 0.0d0 do 10 i = 1,ngrid tl = tl + dincr t = t + dincr x = bsqrtm/sqrt(t*(1-t)) nux = nu(x, tol) tailp = tailp + (nux**2)*it1tsq(tl, dincr) 10 continue tailp = 9.973557d-2*(b**3)*exp(-b**2/2)*tailp c since test is two-sided need to multiply tailp by 2 tailp = 2.0d0*tailp return end c integral of 1/(t*(1-t))**2 from x to x+a double precision function it1tsq(x, a) double precision x, a double precision y y = x + a - 0.5d0 it1tsq = (8.0d0*y)/(1.0d0 - 4.0d0*y**2) + 1 2.0d0*log((1.0d0 + 2.0d0*y)/(1.0d0 - 2.0d0*y)) y = x - 0.5d0 it1tsq = it1tsq - (8.0d0*y)/(1.0d0 - 4.0d0*y**2) - 1 2.0d0*log((1.0d0 + 2.0d0*y)/(1.0d0 - 2.0d0*y)) return end double precision function nu(x, tol) double precision x, tol double precision fpnorm external fpnorm double precision lnu0, lnu1, dk, xk integer i, k if (x .gt. 0.01d0) then lnu1 = log(2.0d0) - 2*log(x) lnu0 = lnu1 k = 2 dk = 0 do 10 i = 1, k dk = dk + 1 xk = -x*sqrt(dk)/2.0d0 lnu1 = lnu1 - 2.0d0*fpnorm(xk)/dk 10 continue do 50 while (dabs((lnu1-lnu0)/lnu1) .gt. tol) lnu0 = lnu1 do 20 i = 1,k dk = dk + 1 xk = -x*sqrt(dk)/2.0d0 lnu1 = lnu1 - 2.0d0*fpnorm(xk)/dk 20 continue k = 2*k 50 enddo else lnu1 = -0.583d0*x endif nu = exp(lnu1) return end c tail probability of binary segmentation statistic c from page 387 of Siegmund (1986) paper double precision function btailp(b, m, ng, tol) integer m, ng double precision b, tol double precision ll, ul, dincr, nulo, nuhi, x, x1, dm integer i, k double precision fpnorm, nu external fpnorm, nu dm = dble(m) k = 2 ll = b*sqrt(1.0/dble(m-k) - 1.0/dble(m)) ul = b*sqrt(1.0/dble(k) - 1.0/dble(m)) dincr = (ul - ll)/dble(ng) btailp = 0.0 x = ll x1 = x + (b**2)/(dm*x) nulo = nu(x1, tol)/x do 10 i = 1, ng x = x + dincr x1 = x + (b**2)/(dm*x) nuhi = nu(x1, tol)/x btailp = btailp + (nuhi + nulo)*dincr nulo = nuhi 10 continue btailp = b*exp(-b**2/2)*btailp/2.506628275 btailp = btailp + 2*(1.0-fpnorm(b)) return end DNAcopy/tests/0000755000175200017520000000000014710217127014235 5ustar00biocbuildbiocbuildDNAcopy/tests/redundancy,20090610,segment.R0000644000175200017520000000727314710217127021062 0ustar00biocbuildbiocbuild###################################################################### # Type: Redundancy test # Created by: Henrik Bengtsson # Created on: 2009-06-10 ###################################################################### # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Startup # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - library("DNAcopy") # Record current random seed sample(1) # Assert that a random seed exists oldSeed <- .Random.seed # Alway use the same random seed set.seed(0xbeef) # Tolerance (maybe decrease?) tol <- .Machine$double.eps^0.5 print(sessionInfo()) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Simulating copy-number data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Number of loci J <- 1000 x <- sort(runif(J, min=0, max=1000)) w <- runif(J) mu <- double(J) jj <- (200 <= x & x < 300) mu[jj] <- mu[jj] + 1 jj <- (650 <= x & x < 800) mu[jj] <- mu[jj] - 1 w[jj] <- 0.001 eps <- rnorm(J, sd=1/2) y <- mu + eps # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Setting up a raw CNA object # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cnR <- CNA( genomdat = y, chrom = rep(1, times=J), maploc = x, data.type = "logratio", sampleid = "SampleA" ) print(cnR) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Test: Non-weighted segmentation # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - t <- system.time({ fitR <- segment(cnR, verbose=1) }) cat("Processing time:\n") print(t) print(fitR) # Expected results # These were obtained by dput(fitR$output) using DNAcopy v1.19.0 truth <- structure(list(ID = c("SampleA", "SampleA", "SampleA", "SampleA", "SampleA"), chrom = c(1, 1, 1, 1, 1), loc.start = c(1.36857712641358, 201.604291098192, 303.775111911818, 650.741211604327, 800.302447052673 ), loc.end = c(199.083976913244, 301.066882908344, 647.42697100155, 798.971758922562, 999.329038895667), num.mark = c(209, 105, 337, 138, 211), seg.mean = c(0.0256, 1.0099, -0.0084, -0.9792, -0.0289 )), .Names = c("ID", "chrom", "loc.start", "loc.end", "num.mark", "seg.mean"), row.names = c(NA, -5L), class = "data.frame") stopifnot(all.equal(fitR$output, truth, tolerance=tol)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Test: Weighted segmentation # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - t <- system.time({ fitR <- segment(cnR, weights=w, verbose=1) }) cat("Processing time:\n") print(t) print(fitR) # Expected results # These were obtained by dput(fitR$output) using DNAcopy v1.19.0 truth <- structure(list(ID = c("SampleA", "SampleA", "SampleA"), chrom = c(1, 1, 1), loc.start = c(1.36857712641358, 201.604291098192, 303.775111911818 ), loc.end = c(199.083976913244, 301.066882908344, 999.329038895667 ), num.mark = c(209, 105, 686), seg.mean = c(0.0259, 1.0004, -0.0233)), .Names = c("ID", "chrom", "loc.start", "loc.end", "num.mark", "seg.mean"), row.names = c(NA, -3L), class = "data.frame") stopifnot(all.equal(fitR$output, truth, tolerance=tol)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Cleanup # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Reset to previous random seed .Random.seed <- oldSeed print(sessionInfo()) ###################################################################### # HISTORY # 2009-06-10 # o ROBUSTNESS: Added this test to assert that DNAcopy v1.19.2 and # newer will numerically give the same results as DNAcopy v1.19.0. # This test is ran each time with R CMD check. # o Created. ###################################################################### DNAcopy/vignettes/0000755000175200017520000000000014710276573015115 5ustar00biocbuildbiocbuildDNAcopy/vignettes/DNAcopy.Rnw0000644000175200017520000001560514710217127017077 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{DNAcopy} %\VignetteDepends{} %\VignetteKeywords{DNA Copy Number Analysis} %\VignettePackage{DNAcopy} \documentclass[11pt]{article} \usepackage{amsmath} \usepackage[authoryear,round]{natbib} \usepackage{hyperref} \SweaveOpts{echo=FALSE} \setlength{\textheight}{8.5in} \setlength{\textwidth}{6in} \setlength{\topmargin}{-0.25in} \setlength{\oddsidemargin}{0.25in} \setlength{\evensidemargin}{0.25in} \begin{document} \setkeys{Gin}{width=0.99\textwidth} \title{\bf DNAcopy: A Package for Analyzing DNA Copy Data} \author{Venkatraman E. Seshan$^1$ and Adam B. Olshen$^2$} \maketitle \begin{center} $^1$Department of Epidemiology and Biostatistics\\ Memorial Sloan-Kettering Cancer Center\\ {\tt seshanv@mskcc.org}\\ \ \\ $^2$Department of Epidemiology and Biostatistics\\ University of California, San Francisco\\ {\tt olshena@biostat.ucsf.edu} \end{center} \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Overview} This document presents an overview of the {\tt DNAcopy} package. This package is for analyzing array DNA copy number data, which is usually (but not always) called array Comparative Genomic Hybridization (array CGH) data \citep{pinkel98, snijders01, wigler03}. It implements our methodology for finding change-points in these data \citep{olshen04}, which are points after which the (log) test over reference ratios have changed location. Our model is that the change-points correspond to positions where the underlying DNA copy number has changed. Therefore, change-points can be used to identify regions of gained and lost copy number. We also provide a function for making relevant plots of these data. \section{Data} We selected a subset of the data set presented in \cite{snijders01}. We are calling this data set {\tt coriell}. The data correspond to two array CGH studies of fibroblast cell strains. In particular, we chose the studies {\bf GM05296} and {\bf GM13330}. After selecting only the mapped data from chromosomes 1-22 and X, there are 2271 data points. There is accompanying spectral karyotype data (not included), which can serve as a gold standard. The data can be found at \\ \url{http://www.nature.com/ng/journal/v29/n3/suppinfo/ng754_S1.html} \section{An Example} Here we perform an analysis on the {\bf GM05296} array CGH study described above. <>= library(DNAcopy) @ <>= data(coriell) @ \noindent Before segmentation the data needs to be made into a CNA object. <>= CNA.object <- CNA(cbind(coriell$Coriell.05296), coriell$Chromosome,coriell$Position, data.type="logratio",sampleid="c05296") @ \noindent We generally recommend smoothing single point outliers before analysis. It is a good idea to check that the smoothing is proper for a particular data set. <>= smoothed.CNA.object <- smooth.CNA(CNA.object) @ \noindent After smoothing, if necessary, the segmentation is run. Here the default parameters are used. A brief discussion of parameters that can be adjusted is in the Tips section. <>= segment.smoothed.CNA.object <- segment(smoothed.CNA.object, verbose=1) @ %Plot whole studies \noindent There are a number of plots that can be made. The first is ordering the data by chromosome and map positons. The red lines correspond to mean values in segments. Note that the points are in alternate colors to indicate different chromosomes. \pagebreak \begin{center} <>= plot(segment.smoothed.CNA.object, plot.type="w") @ \end{center} \noindent Another possibility is to plot by chromosome within a study. \begin{center} <>= plot(segment.smoothed.CNA.object, plot.type="s") @ \end{center} %Plot each chromosome across studies (6 per page) %\begin{center} %<>= %plot(segment.smoothed.CNA.object, plot.type="c", % cbys.layout=c(2,1), % cbys.nchrom=6) %@ %\end{center} %Plot by plateaus \noindent If there are multiple studies, one could plot by chromosome across studies using the option {\tt plot.type='c'}. A final plot orders the segment by their chromosome means. One can take the plateaus in this plot to determine what the mean values should be for calling segments gains or losses. In this case, maybe $0.4$ for gains and $-0.6$ for losses. For most data, these plateaus are much closer to zero. The next generation of this software will have automatic methods for calling gains and losses. \begin{center} <>= plot(segment.smoothed.CNA.object, plot.type="p") @ \end{center} \noindent Change-points are often found due to local trends in the data. An undo method is needed to get rid of unnecessary change-points. Below all splits that are not at least three SDs apart are removed. The following plot shows that all splits not corresponding to the gold standard results have been removed. <>= sdundo.CNA.object <- segment(smoothed.CNA.object, undo.splits="sdundo", undo.SD=3,verbose=1) @ \begin{center} <>= plot(sdundo.CNA.object,plot.type="s") @ \end{center} \section{Tips} \noindent A function that may be of interest that has not been mentioned is {\tt subset.CNA}. It allows for subsetting of a CNA object by chromosome and sample so that segmentation does not have to be run on a whole data set. Similarly, {\tt subset.DNAcopy} allows subsetting of DNAcopy objects, which contain the output of segmentation. The original default segmentation algorithm, because it was based on permutation, took $O(N^2)$ computations, where $N$ is the number of markers on a chromosome. The new default algorithm is much faster. It includes a hybrid approach to compute the $p$-value for segmenting based partly on permutation and partly on a Gaussian approximation (available in all versions after 1.2.0) and a stopping rule (available in all versions after 1.5.0) to declare change when there is a strong evidence for its presence \citep{venkat07}. We no longer recommend using overlapping windows for larger data sets. It is still possible to run the full permutations analysis using the option {\tt p.method='perm'}. If the new algorithm is still too slow, one can reduce the number of permutations in the hybrid method using the parameter {\tt nperm} (default is 10,000). However, the lower {\tt alpha} (the significance level for the test to accept change-points) is, the more permutations that are needed. The stopping boundary needs to be computed for any choice of {\tt nperm} and {\tt alpha} which is not the default which is done automatically within the function {\tt segment} or can be done externally using the function {\tt getbdry} and passed on to {\tt segment}. %\newpage \bibliographystyle{apalike} \bibliography{DNAcopy} \end{document} DNAcopy/vignettes/DNAcopy.bib0000644000175200017520000000457414710217127017070 0ustar00biocbuildbiocbuild @ARTICLE{pinkel98, Author = {D. Pinkel and R. Segraves and D. Sudar and S. Clark and I. Poole and D. Kowbel and C. Collins and W. L. Kuo and C. Chen and Y. Zhai and S. H. Dairkee and B. M. Ljung and J. W. Gray and D. G. Albertson}, Journal = {Nat. Genet.}, Title = {High resolution analysis of DNA copy number variation using comparative genomic hybridization to microarrays}, Year = {1998}, volume = {20}, OPTnumber = {}, pages = {207-211} } @ARTICLE{snijders01, Author = {A. M. Snijders and N. Nowak and R. Segraves and S. Blackwood and N. Brown and J. Conroy and G. Hamilton and A. K. Hindle and B. Huey and K. Kimura and S. Law S and K. Myambo and J. Palmer and B. Ylstra and J. P. Yue and J. W. Gray and A. N. Jain and D. Pinkel and D. G. Albertson}, Journal = {Nat. Genet.}, Title = {Assembly of microarrays for genome-wide measurement of DNA copy number}, Year = {2001}, volume = {29}, OPTnumber = {3}, pages = {263-4} } @ARTICLE{wigler03, Author = {R. Lucito and J. Healey and J. Alexander and A. Reiner and D. Esposito and M. Chi and L. Rodgers and A. Brady and J. Sebat and J. Troge and JA West and S. Rostan and KC Nguyen and S. Powers and KQ Ye and A. Olshen and E. Venkatraman and L. Norton and M. Wigler}, Journal = {Nat. Genet.}, Title = {Representational oligonucleotide microarray analysis: a high resolution method to detect genome copy number variation}, Year = {2003}, volume = {13}, OPTnumber = {10}, pages = {2291-305} } @ARTICLE{olshen04, Author = {A. B. Olshen and E. S. Venkatraman and R. Lucito and M. Wigler}, Journal = {Biostatistics}, Title = {Circular binary segmentation for the analysis of array-based DNA copy number data}, Year = {2004}, volume = {5}, OPTnumber = {4}, pages = {557-72} } @ARTICLE{venkat07, Author = {E. S. Venkatraman and A. B. Olshen}, Journal = {Bioinformatics}, Title = {A faster circular binary segmentation algorithm for the analysis of array CGH data}, Year = {2007}, volume = {23}, OPTnumber = {6}, pages = {657-63} }