Seurat/0000755000176200001440000000000014744634036011530 5ustar liggesusersSeurat/tests/0000755000176200001440000000000014730427000012654 5ustar liggesusersSeurat/tests/testthat/0000755000176200001440000000000014744634036014532 5ustar liggesusersSeurat/tests/testthat/test_spatial.R0000644000176200001440000002331114731050553017341 0ustar liggesusers# setup shared test fixtures path_to_counts <- system.file("extdata", "pbmc_raw.txt", package = "Seurat") path_to_image = file.path("../testdata/visium/spatial") build_spatial_data <- function(assay_name, image_name, id_prefix) { raw_counts <- read.table(path_to_counts, sep = "\t", row.names = 1) image <- Read10X_Image( path_to_image, assay = assay_name, slice = image_name ) cell_names <- Cells(image) counts <- do.call(cbind, replicate(34, raw_counts, simplify = FALSE)) counts <- counts[1:length(cell_names)] counts <- as.sparse(as.matrix(counts)) colnames(counts) <- cell_names test_data <- CreateSeuratObject(counts, assay = assay_name) test_data[[image_name]] <- image test_data <- RenameCells( test_data, add.cell.id = id_prefix ) return (test_data) } test_render <- function(plot) { grDevices::pdf(NULL) print(plot) dev.off() } equivalent_plots <- function(plot1, plot2) { if (length(plot1$layers) != length(plot2$layers)) { return(FALSE) } for (i in seq_along(plot1$layers)) { layer1 <- plot1$layers[[i]] layer2 <- plot2$layers[[i]] if (class(layer1$geom)[1] != class(layer2$geom)[1]) { return(FALSE) } if (!identical(layer1$data, layer2$data)) { return(FALSE) } } return(TRUE) } test.data.1 <- build_spatial_data( assay_name = "Spatial.A", image_name = "slice1.A", id_prefix = "test-data-1" ) test.data.2 <- build_spatial_data( assay_name = "Spatial.A", image_name = "slice2.A", id_prefix = "test-data-2" ) test.data.3 <- build_spatial_data( assay_name = "Spatial.B", image_name = "slice2.B", id_prefix = "test-data-3" ) context("SpatialFeaturePlot") test_that("SpatialFeaturePlot works with a single assay/image", { test.case <- test.data.1 plot.1 <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.A") plot.2 <- SpatialFeaturePlot( test.case, images = "slice1.A", features = "nCount_Spatial.A" ) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plot.1, plot.2)) }) test_that("SpatialFeaturePlot works with multiple layers & images", { test.case <- merge(test.data.1, test.data.2) plots <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.A") plot.1 <- SpatialFeaturePlot( test.case, images = "slice1.A", features = "nCount_Spatial.A" ) plot.2 <- SpatialFeaturePlot( test.case, images = "slice2.A", features = "nCount_Spatial.A" ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) }) test_that("SpatialFeaturePlot works with multiple overlapping images", { skip_if_not_installed("sf") test.case <- test.data.1 suppressWarnings( test.case[["slice1.crop"]] <- Crop( test.case[["slice1.A"]], x = c(0, 5000), y = c(0, 5000) ) ) plots <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.A") plot.1 <- SpatialFeaturePlot( test.case, images = "slice1.A", features = "nCount_Spatial.A" ) plot.2 <- SpatialFeaturePlot( test.case, images = "slice1.crop", features = "nCount_Spatial.A" ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) }) test_that("SpatialFeaturePlot works with multiple assays & images", { test.case <- merge(test.data.1, test.data.3) DefaultAssay(test.case) <- "Spatial.A" plot.1 <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.A") plot.2 <- SpatialFeaturePlot( test.case, features = "nCount_Spatial.A", images = "slice2.B" ) plots <- SpatialFeaturePlot( test.case, features = "nCount_Spatial.A", images = c("slice1.A", "slice2.B") ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) DefaultAssay(test.case) <- "Spatial.B" plot.1 <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.B") plot.2 <- SpatialFeaturePlot( test.case, features = "nCount_Spatial.B", images = "slice1.A" ) plots <- SpatialFeaturePlot( test.case, features = "nCount_Spatial.B", images = c("slice1.A", "slice2.B") ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[2]], plot.1)) expect_true(expect_true(equivalent_plots(plots[[1]], plot.2))) }) test_that("SpatialFeaturePlot works with multiple assays, layers, & images", { test.case <- merge(test.data.1, c(test.data.2, test.data.3)) DefaultAssay(test.case) <- "Spatial.A" plots <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.A") plot.1 <- SpatialFeaturePlot( test.case, images = "slice1.A", features = "nCount_Spatial.A" ) plot.2 <- SpatialFeaturePlot( test.case, images = "slice2.A", features = "nCount_Spatial.A" ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) DefaultAssay(test.case) <- "Spatial.B" plot.1 <- SpatialFeaturePlot(test.case, features = "nCount_Spatial.B") plot.2 <- SpatialFeaturePlot( test.case, features = "nCount_Spatial.B", images = "slice2.A" ) plots <- SpatialFeaturePlot( test.case, features = "nCount_Spatial.B", images = c("slice2.A", "slice2.B") ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.2)) expect_true(equivalent_plots(plots[[2]], plot.1)) }) context("SpatialDimPlot") test_that("SpatialDimPlot works with a single assay/image", { test.case <- test.data.1 plot.1 <- SpatialDimPlot(test.case) plot.2 <- SpatialDimPlot( test.case, images = "slice1.A" ) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plot.1, plot.2)) }) test_that("SpatialDimPlot works with multiple layers/images", { test.case <- merge(test.data.1, test.data.2) plots <- SpatialDimPlot(test.case) plot.1 <- SpatialDimPlot( test.case, images = "slice1.A" ) plot.2 <- SpatialDimPlot( test.case, images = "slice2.A" ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) }) test_that("SpatialDimPlot works with multiple overlapping images", { skip_if_not_installed("sf") test.case <- test.data.1 suppressWarnings( test.case[["slice1.crop"]] <- Crop( test.case[["slice1.A"]], x = c(0, 5000), y = c(0, 5000) ) ) plots <- SpatialDimPlot(test.case) plot.1 <- SpatialDimPlot( test.case, images = "slice1.A" ) plot.2 <- SpatialDimPlot( test.case, images = "slice1.crop" ) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) }) test_that("SpatialDimPlot works with multiple assays/images", { test.case <- merge(test.data.1, test.data.3) DefaultAssay(test.case) <- "Spatial.A" plot.1 <- SpatialDimPlot(test.case) plot.2 <- SpatialDimPlot( test.case, images = "slice2.B" ) plots <- SpatialDimPlot( test.case, images = c("slice1.A", "slice2.B") ) expect_equal(length(plots), 2) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) DefaultAssay(test.case) <- "Spatial.B" plot.1 <- SpatialDimPlot(test.case) plot.2 <- SpatialDimPlot( test.case, images = "slice1.A" ) plots <- SpatialDimPlot(test.case, images = c("slice1.A", "slice2.B")) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[2]], plot.1)) expect_true(expect_true(equivalent_plots(plots[[1]], plot.2))) }) test_that("SpatialDimPlot works with multiple assays, layers, & images", { test.case <- merge(test.data.1, c(test.data.2, test.data.3)) DefaultAssay(test.case) <- "Spatial.A" plots <- SpatialDimPlot(test.case) plot.1 <- SpatialDimPlot(test.case, images = "slice1.A") plot.2 <- SpatialDimPlot(test.case, images = "slice2.A") expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.1)) expect_true(equivalent_plots(plots[[2]], plot.2)) DefaultAssay(test.case) <- "Spatial.B" plot.1 <- SpatialDimPlot(test.case) plot.2 <- SpatialDimPlot(test.case, images = "slice2.A") plots <- SpatialDimPlot(test.case, images = c("slice2.A", "slice2.B")) expect_equal(length(plots), 2) expect_no_error(test_render(plots)) expect_no_error(test_render(plot.1)) expect_no_error(test_render(plot.2)) expect_true(equivalent_plots(plots[[1]], plot.2)) expect_true(equivalent_plots(plots[[2]], plot.1)) }) Seurat/tests/testthat/test_visualization.R0000644000176200001440000000157714730427000020611 0ustar liggesusers# Tests for functions in visualization.R set.seed(42) # Tests for visualization utilities # ------------------------------------------------------------------------------ pbmc_small[["tsne_new"]] <- CollapseEmbeddingOutliers(pbmc_small, reduction = "tsne", reduction.key = 'tsne_', outlier.sd = 0.5) test_that("CollapseEmbeddingOutliers works", { expect_equal(Embeddings(pbmc_small[["tsne_new"]])[1, 1], -12.59713, tolerance = 1e-6) expect_equal(colSums(x = Embeddings(object = pbmc_small[["tsne_new"]])), c(-219.9218, 182.9215), check.attributes = FALSE, tolerance = 1e-5) }) test_that("DiscretePalette works", { isColors <- function(x) { all(grepl("#[0-9A-Fa-f]{6}", x)) } expect_true(isColors(DiscretePalette(26))) expect_true(isColors(DiscretePalette(32))) expect_true(isColors(DiscretePalette(36))) expect_warning(DiscretePalette(50), "Not enough colours") }) Seurat/tests/testthat/test_modularity_optimizer.R0000644000176200001440000001117714670622051022206 0ustar liggesusers# Tests to verify the RCpp version of ModularityOptimizer produces the same # results as the java version. # Equivalent java commands are given above. context("ModularityOptimizer") # The "karate club" network available from the ModularityOptimizer website at: # http://www.ludowaltman.nl/slm/ node1 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 8, 8, 8, 9, 13, 14, 14, 15, 15, 18, 18, 19, 20, 20, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 25, 26, 26, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32) node2 <- c(1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 17, 19, 21, 31, 2, 3, 7, 13, 17, 19, 21, 30, 3, 7, 8, 9, 13, 27, 28, 32, 7, 12, 13, 6, 10, 6, 10, 16, 16, 30, 32, 33, 33, 33, 32, 33, 32, 33, 32, 33, 33, 32, 33, 32, 33, 25, 27, 29, 32, 33, 25, 27, 31, 31, 29, 33, 33, 31, 33, 32, 33, 32, 33, 32, 33, 33) dim_s <- max(max(node1), max(node2)) + 1 # Note we want to represent network in the lower diagonal. connections <- sparseMatrix(i = node2 + 1, j = node1 + 1, x = 1.0) # Result from equivalent command to # java -jar ModularityOptimizer.jar karate_club_network.txt communities.txt 1 1.0 1 1 1 564 0 test_that("Algorithm 1", { expected <- c(1, 1, 1, 1, 2, 2, 2, 1, 0, 1, 2, 1, 1, 1, 0, 0, 2, 1, 0, 1, 0, 1, 0, 0, 3, 3, 0, 0, 3, 0, 0, 3, 0, 0) s <- Seurat:::RunModularityClusteringCpp( SNN = connections, modularityFunction = 1, resolution = 1.0, algorithm = 1, nRandomStarts = 1, nIterations = 1, randomSeed = 564, printOutput = 0, "" ) expect_equal(expected, s) }) #java -jar ModularityOptimizer.jar karate_club_network.txt communities.txt 1 1.0 2 1 1 2 0 test_that("Algorithm 2", { expected <- c(1, 1, 1, 1, 3, 3, 3, 1, 0, 0, 3, 1, 1, 1, 0, 0, 3, 1, 0, 1, 0, 1, 0, 2, 2, 2, 0, 2, 2, 0, 0, 2, 0, 0) s <- Seurat:::RunModularityClusteringCpp( SNN = connections, modularityFunction = 1, resolution = 1.0, algorithm = 2, nRandomStarts = 1, nIterations = 1, randomSeed = 2, printOutput = 0, "" ) expect_equal(expected, s) }) #java -jar ModularityOptimizer.jar karate_club_network.txt communities.txt 1 1.0 3 1 1 56464 0 test_that("Algorithm 3", { expected <- c(1, 1, 1, 1, 3, 3, 3, 1, 0, 0, 3, 1, 1, 1, 0, 0, 3, 1, 0, 1, 0, 1, 0, 2, 2, 2, 0, 2, 2, 0, 0, 2, 0, 0) s <- Seurat:::RunModularityClusteringCpp( SNN = connections, modularityFunction = 1, resolution = 1.0, algorithm = 3, nRandomStarts = 1, nIterations = 1, randomSeed = 56464, printOutput = 0, "") expect_equal(expected, s) }) test_that("Low Resolution", { e1 <- rep(0, 34) # java -jar ModularityOptimizer.jar karate_club_network.txt outjava.txt 1 0.05 3 1 10 10 0 s <- Seurat:::RunModularityClusteringCpp( SNN = connections, modularityFunction = 1, resolution = 0.05, algorithm = 3, nRandomStarts = 1, nIterations = 10, randomSeed = 10, printOutput = 0, "" ) expect_equal(s, e1) # java -jar ModularityOptimizer.jar karate_club_network.txt outjava.txt 2 0.05 3 1 10 10 0 s2 <- Seurat:::RunModularityClusteringCpp( SNN = connections, modularityFunction = 2, resolution=0.05, algorithm = 3, nRandomStarts = 1, nIterations = 10, randomSeed = 10, printOutput = 0, "" ) e2 = c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) expect_equal(s2, e2) }) test_that("EdgeWeights", { # Make 1, 4, 5 and 20 a community by weighting them c2 <- connections c2[5, 4] <- 3.0 c2[5, 1] <- 5.0 c2[4, 1] <- 8.0 c2[20, 5] <- 8.0 c2[20, 4] <- 5.0 c2[20, 1] <- 5.0 # java -jar ModularityOptimizer.jar weighted_karate_club_network.txt outjava.txt 1 1.0 3 1 10 40 1 s2 <- Seurat:::RunModularityClusteringCpp( SNN = c2, modularityFunction = 1, resolution = 1.0, algorithm = 3, nRandomStarts = 1, nIterations = 10, randomSeed = 40, printOutput = 0, "" ) exp <- c(2, 1, 1, 2, 2, 3, 3, 1, 0, 1, 3, 2, 2, 1, 0, 0, 3, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) expect_equal(s2, exp) }) # test_that("pbmc_small network", { # observed <- as.numeric(FindClusters( # object = pbmc_small, # reduction.type = "pca", # dims.use = 1:10, # resolution = 1.1, # save.SNN = TRUE, # print.output = 0)@ident) # expected = c(1,1,1,1,1,1,1,1,1,1,6,1,6,1,2,2,1,6,2,1,2,2,2,2,2,2,2,2,2,6,3,5,3,3,3,3,3,3,3,3,5,1,1,1,1,1,3,1,3,1,2,1,2,2,6,2,3,2,1,3,5,2,5,5,2,2,2,2,5,3,4,4,4,4,4,4,4,4,4,4) # expect_equal(observed, expected) # }) Seurat/tests/testthat/test_integration.R0000644000176200001440000005235314730427000020231 0ustar liggesusers# Tests for integration/transfer related fxns set.seed(42) pbmc_small <- suppressWarnings(UpdateSeuratObject(pbmc_small)) # Setup test objects ref <- pbmc_small query <- CreateSeuratObject( counts = as.sparse( GetAssayData( object = pbmc_small[['RNA']], layer = "counts") + rpois(n = ncol(pbmc_small), lambda = 1 ) ) ) query <- NormalizeData(object = query, verbose = FALSE) query <- FindVariableFeatures(object = query, verbose = FALSE, nfeatures = 100) ref <- FindVariableFeatures(object = ref, verbose = FALSE, nfeatures = 100) # Tests for FindTransferAnchors # ------------------------------------------------------------------------------ context("FindTransferAnchors") test_that("FindTransferAnchors defaults work", { anchors <- FindTransferAnchors(reference = ref, query = query, k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(GetAssayData(co[["RNA"]], layer ="data")[1, 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")[1, 3], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 0.4840944592, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], 0.05175486778, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(128, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(5, 5, 0.08361970218), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "PPBP") expect_equal(anchors@neighbors, list()) }) test_that("FindTransferAnchors catches bad input", { expect_error(FindTransferAnchors(reference = ref, query = query, reference.assay = "BAD", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, query.assay = "BAD", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, normalization.method = "BAD", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, reduction = "BAD", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, npcs = NULL, k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, npcs = NULL, reference.reduction = "BAD", k.filter = 50)) expect_error(suppressWarngings(FindTransferAnchors(reference = ref, query = query, dims = 1:100, k.filter = 50))) expect_error(suppressWarnings(FindTransferAnchors(reference = ref, query = query, dims = 1:100, project.query = TRUE, k.filter = 50))) expect_error(FindTransferAnchors(reference = ref, query = query, k.anchor = 80, k.filter = 50)) expect_warning(FindTransferAnchors(reference = ref, query = query, k.filter = 81)) expect_error(FindTransferAnchors(reference = ref, query = query, k.filter = 50, k.score = 80)) expect_error(suppressWarnings(FindTransferAnchors(reference = ref, query = query, k.filter = 50, features = "BAD"))) expect_error(FindTransferAnchors(reference = ref, query = query, k.filter = 50, reduction = "cca", project.query = TRUE)) expect_error(FindTransferAnchors(reference = ref, query = query, reference.reduction = "BAD", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, reference.reduction = "BAD", project.query = TRUE, k.filter = 50)) }) ref <- ScaleData(ref, verbose = FALSE) ref <- suppressWarnings(RunPCA(ref, npcs = 30, verbose = FALSE)) test_that("FindTransferAnchors allows reference.reduction to be precomputed", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, k.filter = 50, reference.reduction = "pca") expect_error(FindTransferAnchors(reference = ref, query = query, k.filter = 50, reference.reduction = "pca", reduction = "cca")) expect_error(FindTransferAnchors(reference = ref, query = query, k.filter = 50, reference.reduction = "pca", project.query = TRUE)) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(GetAssayData(co[["RNA"]])[1, 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")[1, 3], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 0.4840944592, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], 0.05175486778, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(128, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(5, 5, 0.08361970218), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "PPBP") expect_equal(anchors@neighbors, list()) }) test_that("FindTransferAnchors with cca defaults work", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, reduction = "cca", k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("cca", "cca.l2")) expect_equal(GetAssayData(co[["RNA"]])["PPBP", 3], 0) expect_equal(GetAssayData(co[["RNA"]])["PPBP", 1], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")["PPBP", 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")["PPBP", 1], 0) expect_equal(dim(co[['cca']]), c(160, 30)) expect_equal(Embeddings(co[['cca']])[1, 1], 0.04611130861, tolerance = 1e-7) expect_equal(Loadings(co[['cca']], projected = T)["PPBP", 1], 12.32379661, tolerance = 1e-7) expect_equal(dim(co[['cca.l2']]), c(160, 30)) expect_equal(Embeddings(co[['cca.l2']])[1, 1], 0.06244169641, tolerance = 1e-7) expect_equal(Loadings(co[['cca.l2']], projected = T)["PPBP", 1], 12.32379661, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(324, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 1, 0.8211091234), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "PPBP") expect_equal(anchors@neighbors, list()) }) test_that("FindTransferAnchors with project.query defaults work", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, project.query = TRUE, k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(GetAssayData(co[["RNA"]], layer = "data")["PPBP", 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "data")["PPBP", 1], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")["PPBP", 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")["PPBP", 1], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 1.577959404, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)["PPBP", 1], 0.1145472305, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], 0.1358602536, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)["PPBP", 1], 0.1145472305, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(208, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 10, 0.4984040128), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "GZMA") expect_equal(anchors@neighbors, list()) }) query <- ScaleData(query, verbose = FALSE) query <- suppressWarnings(RunPCA(query, npcs = 30, verbose = FALSE)) test_that("FindTransferAnchors with project.query and reference.reduction works", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, k.filter = 50, reference.reduction = "pca", project.query = TRUE) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(GetAssayData(co[["RNA"]])["PPBP", 3], 0) expect_equal(GetAssayData(co[["RNA"]])["PPBP", 1], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")["PPBP", 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")["PPBP", 1], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 1.577959404, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)["PPBP", 1], 0.1145472305, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], 0.1358602536, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)["PPBP", 1], 0.1145472305, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(208, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 10, 0.4984040128), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "GZMA") expect_equal(anchors@neighbors, list()) }) ref <- FindNeighbors(object = ref, reduction = "pca", dims = 1:30, return.neighbor = TRUE, k.param = 31, verbose = FALSE, l2.norm = TRUE, nn.method = "annoy") test_that("FindTransferAnchors with reference.neighbors precomputed works", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, reference.neighbors = "RNA.nn", k.filter = 50) expect_error(FindTransferAnchors(reference = ref, query = query, reference.neighbors = "BAD", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, reference.neighbors = "RNA.nn", k.filter = 50, k.score = 31)) expect_error(FindTransferAnchors(reference = ref, query = query, reference.neighbors = "RNA.nn", k.filter = 50, k.anchor = 31)) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(GetAssayData(co[["RNA"]])[1, 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")[1, 3], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 0.4840944592, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], 0.05175486778, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(128, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(5, 5, 0.08361970218), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "PPBP") expect_equal(anchors@neighbors, list()) }) test_that("FindTransferAnchors with no l2 works", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, l2.norm = FALSE, k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(100, 160)) expect_equal(Reductions(co), c("pcaproject")) expect_equal(GetAssayData(co[["RNA"]])[1, 3], 0) expect_equal(GetAssayData(co[["RNA"]], layer = "counts")[1, 3], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 0.4840944592, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], 0.2103563963, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(115, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(5, 5, 0.2950654582), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 100) expect_equal(anchors@anchor.features[1], "PPBP") expect_equal(anchors@neighbors, list()) }) # SCTransform tests V1 query <- suppressWarnings(SCTransform(object = query, verbose = FALSE,vst.flavor = 'v1')) ref <- suppressWarnings(SCTransform(object = ref, verbose = FALSE,vst.flavor = 'v1')) test_that("FindTransferAnchors with default SCT works", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, normalization.method = "SCT", k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(220, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(DefaultAssay(co), "SCT") expect_equal(GetAssayData(co[["SCT"]], layer = "scale.data"), new(Class = "matrix")) expect_equal(GetAssayData(co[["SCT"]])[1, 1], 0) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], -1.852491719, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], -0.1829401539, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], -0.1971047407, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)[1, 1], -0.1829401539, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(256, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 1, 0.688195991), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 220) expect_equal(anchors@anchor.features[1], "NKG7") expect_equal(anchors@neighbors, list()) }) test_that("Mixing SCT and non-SCT assays fails", { expect_error(FindTransferAnchors(reference = ref, query = query, reference.assay = "SCT", query.assay = "RNA", k.filter = 50)) ref.0 <- ref ref.2 <- ref ref.0[["SCT"]]@SCTModel.list <- list() ref.2[["SCT"]]@SCTModel.list$model2 <- ref.2[["SCT"]]@SCTModel.list$model1 expect_error(FindTransferAnchors(reference = ref.0, query = query, reference.assay = "SCT", query.assay = "RNA", k.filter = 50, normalization.method = "SCT")) expect_error(FindTransferAnchors(reference = ref.2, query = query, reference.assay = "SCT", query.assay = "RNA", k.filter = 50, normalization.method = "SCT")) expect_error(FindTransferAnchors(reference = ref, query = query, reference.assay = "RNA", query.assay = "SCT", k.filter = 50)) expect_error(FindTransferAnchors(reference = ref, query = query, reference.assay = "RNA", query.assay = "SCT", k.filter = 50, normalization.method = "SCT")) }) test_that("FindTransferAnchors with default SCT works", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, normalization.method = "SCT", reduction = "cca", k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(220, 160)) expect_equal(Reductions(co), c("cca", "cca.l2")) expect_equal(DefaultAssay(co), "SCT") expect_equal(GetAssayData(co[["SCT"]])[1, 1], 0) expect_equal(dim(co[['cca']]), c(160, 30)) expect_equal(Embeddings(co[['cca']])[1, 1], 0.0459135444, tolerance = 1e-7) expect_equal(Loadings(co[['cca']], projected = T)["NKG7", 1], 8.51477973, tolerance = 1e-7) expect_equal(dim(co[['cca.l2']]), c(160, 30)) expect_equal(Embeddings(co[['cca.l2']])[1, 1], 0.0625989664, tolerance = 1e-7) expect_equal(Loadings(co[['cca.l2']], projected = T)["NKG7", 1], 8.51477973, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(313, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 1, 0.616858238), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 220) expect_equal(anchors@anchor.features[1], "NKG7") expect_equal(anchors@neighbors, list()) }) test_that("FindTransferAnchors with SCT and project.query work", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, normalization.method = "SCT", project.query = TRUE, k.filter = 50, recompute.residuals = FALSE) co <- anchors@object.list[[1]] expect_equal(dim(co), c(220, 160)) expect_equal(Reductions(co), c("pcaproject", "pcaproject.l2")) expect_equal(DefaultAssay(co), "SCT") expect_equal(GetAssayData(co[["SCT"]])[1, 1], 0) expect_equal(GetAssayData(co[["SCT"]], slot = "scale.data"), new("matrix")) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], 0.3049308, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], 0.05788217444, tolerance = 1e-7) expect_equal(dim(co[['pcaproject.l2']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject.l2']])[1, 1], 0.04334884, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject.l2']], projected = T)[1, 1], 0.05788217444, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(290, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 1, 0.6315789), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 220) expect_equal(anchors@anchor.features[1], "PPBP") expect_equal(anchors@neighbors, list()) }) test_that("FindTransferAnchors with SCT and l2.norm FALSE work", { skip_on_cran() anchors <- FindTransferAnchors(reference = ref, query = query, normalization.method = "SCT", l2.norm = FALSE, k.filter = 50) co <- anchors@object.list[[1]] expect_equal(dim(co), c(220, 160)) expect_equal(Reductions(co), c("pcaproject")) expect_equal(DefaultAssay(co), "SCT") expect_equal(GetAssayData(co[["SCT"]])[1, 1], 0) expect_equal(GetAssayData(co[["SCT"]], layer = "scale.data"), new("matrix")) expect_equal(dim(co[['pcaproject']]), c(160, 30)) expect_equal(Embeddings(co[['pcaproject']])[1, 1], -1.852491719, tolerance = 1e-7) expect_equal(Loadings(co[['pcaproject']], projected = T)[1, 1], -0.1829401539, tolerance = 1e-7) ref.cells <- paste0(Cells(ref), "_reference") query.cells <- paste0(Cells(query), "_query") expect_equal(anchors@reference.cells, ref.cells) expect_equal(anchors@query.cells, query.cells) expect_equal(anchors@reference.objects, logical()) anchor.mat <- anchors@anchors expect_equal(dim(anchor.mat), c(249, 3)) expect_equal(as.vector(anchor.mat[1, ]), c(1, 1, 0.760589319), tolerance = 1e-7) expect_equal(max(anchor.mat[, 2]), 80) expect_null(anchors@offsets) expect_equal(length(anchors@anchor.features), 220) expect_equal(anchors@anchor.features[1], "NKG7") expect_equal(anchors@neighbors, list()) }) Seurat/tests/testthat/test_load_10X.R0000644000176200001440000002202614744456127017270 0ustar liggesuserscontext("Read10X") # These tests were added to ensure Seurat was forwards and backwards compatible for 3.0 data dname = "../testdata/cr3.0" test.data <- Read10X(dname) test.data2 <- Read10X(c(dname, dname)) test_that("Cell Ranger 3.0 Data Parsing", { expect_is(test.data, "list") expect_equal(ncol(test.data$`Gene Expression`), .5 * ncol(test.data2$`Gene Expression`)) expect_equal(ncol(test.data$`Antibody Capture`), .5 * ncol(test.data2$`Antibody Capture`)) expect_equal(colnames(test.data2[[1]])[6], "2_AAAGTAGCACAGTCGC-1") expect_equal(test.data$`Gene Expression`[2,2], 1000) }) # Tests of Pre-3.0 Data test.data3 <- Read10X("../testdata/") test_that("Read10X creates sparse matrix", { expect_is(test.data3, "dgCMatrix") expect_equal(colnames(test.data3)[1], "ATGCCAGAACGACT-1") expect_equal(rownames(test.data3)[1], "MS4A1") }) test_that("Read10X handles missing files properly", { expect_error(Read10X(".")) expect_error(Read10X("./notadir/")) expect_error(Read10X(dname, gene.column = 10)) }) context("Load10X_Spatial") # setup test fixtures path.to.data <- file.path("../testdata") path.to.visium <- file.path(path.to.data, "visium") path.to.visium.hd <- file.path(path.to.data, "visium_hd") test_that("Read10X_h5 works as expected", { skip_if_not_installed("hdf5r") path.to.counts <- file.path( path.to.visium, "filtered_feature_bc_matrix.h5" ) counts <- Read10X_h5(path.to.counts) # check that the shape of the returned matrix is correct expect_equal(ncol(counts), 2695) expect_equal(nrow(counts), 100) # spot-check a few of the values expect_equal(colnames(counts)[[151]], "AATGCAACCGGGTACC-1") expect_equal(counts[1, 151], 1) expect_equal(colnames(counts)[[9]], "AAACCGTTCGTCCAGG-1") expect_equal(counts[5, 9], 1) expect_equal(colnames(counts)[[2328]], "TCTCGAGGAGGTTCGC-1") expect_equal(counts[99, 2328], 1) }) test_that("Read10X_Image works as expected", { path.to.images <- file.path(path.to.visium, "spatial") coordinate.filenames <- "tissue_positions_list.csv" # only test HD the dataset containing a parquet file if `arrow` is installed if (requireNamespace("arrow", quietly = TRUE)) { path.to.images <- c( path.to.images, file.path( path.to.visium.hd, "binned_outputs/square_008um/spatial" ) ) coordinate.filenames <- c( coordinate.filenames, "tissue_positions.parquet" ) } for (i in seq_along(path.to.images)) { path.to.image <- path.to.images[[i]] coordinate.filename <- coordinate.filenames[[i]] # read in the coordinates as a data.frame - only keep the relevant columns # and rename them to match the processed output coordinates.expected <- Read10X_Coordinates( file.path(path.to.image, coordinate.filename), filter.matrix = TRUE )[, c("imagerow", "imagecol")] colnames(coordinates.expected) <- c("x", "y") # read in the scale factors as an S3 object scale.factors.expected <- Read10X_ScaleFactors( file.path(path.to.image, "scalefactors_json.json") ) # default/lowres scaling image.lowres <- Read10X_Image( path.to.image, image.name = "tissue_lowres_image.png" ) coordinates <- GetTissueCoordinates(image.lowres, scale = "lowres") spot.radius <- Radius(image.lowres, scale = "lowres") scale.factors <- ScaleFactors(image.lowres) # check that the scale factors were read in as expected expect_true(identical(scale.factors, scale.factors.expected)) # check that `coordinates` contains values scaled for the low resolution PNG expect_equal( coordinates[, c("x", "y")] / scale.factors[["lowres"]], coordinates.expected ) # check that the spot size is similarly scaled expect_equal( (spot.radius / scale.factors[["lowres"]] * max(dim(image.lowres))), scale.factors.expected[["spot"]], ) # hires scaling image.hires <- Read10X_Image( path.to.image, image.name = "tissue_hires_image.png" ) coordinates <- GetTissueCoordinates(image.hires, scale = "hires") spot.radius <- Radius(image.hires, scale = "hires") scale.factors <- ScaleFactors(image.hires) # check that the scale factors were read in as expected expect_true(identical(scale.factors, scale.factors.expected)) # check that `coordinates` contains values scaled for the high resolution PNG expect_equal( coordinates[, c("x", "y")] / scale.factors[["hires"]], coordinates.expected ) # check that the spot size is similarly scaled expect_equal( (spot.radius / scale.factors[["hires"]] * max(dim(image.hires))), scale.factors.expected[["spot"]] ) # the size of the two images should be different expect_false(all(dim(image.hires) == dim(image.lowres))) # `VisiumV1` image image.v1 <- Read10X_Image( path.to.image, image.name = "tissue_lowres_image.png", image.type = "VisiumV1" ) coordinates <- GetTissueCoordinates(image.v1, scale = "lowres") spot.radius <- Radius(image.v1, scale = "lowres") scale.factors <- ScaleFactors(image.v1) # check that the scale factors were read in as expected expect_true(identical(scale.factors, scale.factors.expected)) # check that `coordinates` contains values scaled for the low resolution PNG # also make sure that it has the expected column names coordinates.expected.v1 <- coordinates.expected colnames(coordinates.expected.v1) <- c("imagerow", "imagecol") expect_equal( coordinates[, c("imagerow", "imagecol")] / scale.factors[["lowres"]], coordinates.expected.v1 ) # check that the spot size is similarly scaled expect_equal( (spot.radius / scale.factors[["lowres"]] * max(dim(image.lowres))), scale.factors.expected[["spot"]], ) } }) test_that("Load10X_Spatial works with SD data", { skip_if_not_installed("hdf5r") path.to.counts <- file.path( path.to.visium, "filtered_feature_bc_matrix.h5" ) path.to.image <- file.path(path.to.visium, "spatial") # load the expected counts matrix counts.expected <- Read10X_h5(path.to.counts) # load the expected image image.expected <- Read10X_Image(path.to.image) # set the image's key Key(image.expected) <- "slice1_" # update the expected image's assay to match the default DefaultAssay(image.expected) <- "Spatial" # align the expected image's identifiers with the expected count matrix image.expected <- image.expected[colnames(counts.expected)] spatial <- Load10X_Spatial(path.to.visium) # check that `spatial` contains the expected counts matrix expect_true( identical( LayerData(spatial, assay = "Spatial", layer = "counts"), counts.expected ) ) # check that `spatial` contains the expected image expect_true( identical( spatial[["slice1"]], image.expected ) ) }) test_that("Load10X_Spatial works with HD data", { skip_if_not_installed("hdf5r") skip_if_not_installed("arrow") # since the "HD" test data is actually just the standard definition test # data re-structured to look like it's been binned at multiple resolutions # the `merge` call inside `Load10X_Spatial` throws a warning spatial <- suppressWarnings(Load10X_Spatial(path.to.visium.hd)) bin.size <- c(16, 8) for (i in seq_along(bin.size)) { bin.size.pretty <- paste0(sprintf("%03d", bin.size[[i]]), "um") assay.name <- paste0("Spatial.", bin.size.pretty) image.key <- paste0("slice1", bin.size.pretty, "_") image.key.pretty <- paste0("slice1.", bin.size.pretty) path.to.bin <- file.path( path.to.visium.hd, paste0("binned_outputs/square_", bin.size.pretty) ) path.to.counts <- file.path( path.to.bin, "filtered_feature_bc_matrix.h5" ) path.to.image <- file.path(path.to.bin, "spatial") # load the expected counts matrix counts.expected <- Read10X_h5(path.to.counts) # accomodate for the way cell identifiers will be reset during # the call to `merge` inside `Load10X_Spatial` colnames(counts.expected) <- paste0(colnames(counts.expected), "_", i) # load the expected image image.expected <- Read10X_Image(path.to.image, assay = assay.name) # set the image's key Key(image.expected) <- image.key # again, accomodate for the way cell identifiers will be reset during # the call to `merge` inside `Load10X_Spatial` image.expected <- RenameCells(image.expected, paste0(Cells(image.expected), "_", i)) # align the expected image's identifiers with the expected count matrix image.expected <- image.expected[colnames(counts.expected)] # check that `spatial` contains the expected counts matrix expect_true( identical( LayerData(spatial, assay = assay.name, layer = "counts"), counts.expected ) ) # check that `spatial` contains the expected image expect_true( identical( spatial[[image.key.pretty]], image.expected ) ) } }) test_that("Read10X_Spatial handles missing files properly", { expect_error(Load10X_Spatial(data.dir = ".")) expect_error(Load10X_Spatial(data.dir = "./notadir/")) }) Seurat/tests/testthat/test_transferdata.R0000644000176200001440000001662414731050553020373 0ustar liggesusers# Tests for integration/transfer related fxns set.seed(42) pbmc_small <- suppressWarnings(UpdateSeuratObject(pbmc_small)) # Setup test objects ref <- pbmc_small query <- CreateSeuratObject( counts = as.sparse( GetAssayData( object = pbmc_small[['RNA']], layer = "counts") + rpois(n = ncol(pbmc_small), lambda = 1 ) ) ) query <- NormalizeData(object = query, verbose = FALSE) query <- FindVariableFeatures(object = query, verbose = FALSE, nfeatures = 100) ref <- FindVariableFeatures(object = ref, verbose = FALSE, nfeatures = 100) anchors <- FindTransferAnchors(reference = ref, query = query, k.filter = 50) # Tests for TransferData # ------------------------------------------------------------------------------ context("TransferData") preds.standard <- TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, verbose = FALSE) test_that("TransferData default work", { # categorical metadata expect_equal(dim(preds.standard), c(80, 5)) expect_equal(colnames(preds.standard)[c(1, 5)], c("predicted.id", "prediction.score.max")) expect_equal(rownames(preds.standard), Cells(query)) expect_equal(preds.standard[1, 1], "1") expect_equal(preds.standard[1, 5], 0.4280746, tolerance = 1e-6) expect_equal(as.vector(rowSums(as.matrix(preds.standard[, 2:4]))), rep(1, times = ncol(query))) expect_true(inherits(preds.standard, "data.frame")) # continuous assay data pred.assay <- TransferData(anchorset = anchors, refdata = GetAssayData(ref[["RNA"]]), verbose = FALSE) expect_equal(dim(pred.assay), c(230, 80)) expect_equal(GetAssayData(pred.assay, layer = "counts"), new("matrix")) expect_equal(GetAssayData(pred.assay, layer = "scale.data"), new("matrix")) expect_equal(colnames(pred.assay), Cells(query)) expect_equal(rownames(pred.assay), rownames(ref[["RNA"]])) expect_equal(sum(GetAssayData(pred.assay)[1, ]), 64.46388, tolerance = 1e-6) expect_equal(sum(GetAssayData(pred.assay)[, 1]), 281.0306, tolerance = 1e-6) expect_true(inherits(pred.assay, "Assay")) expect_equal(pred.assay@var.features, logical(0)) expect_equal(ncol(pred.assay@meta.features), 0) }) test_that("TransferData can return predictions assay, ", { pred.assay <- TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, prediction.assay = TRUE, verbose = FALSE) expect_true(inherits(pred.assay, "Assay")) expect_equal(dim(pred.assay), c(4, 80)) expect_equal(GetAssayData(pred.assay, layer = "counts"), new("matrix")) expect_equal(GetAssayData(pred.assay, layer = "scale.data"), new("matrix")) expect_equal(colnames(pred.assay), Cells(query)) expect_equal(pred.assay@var.features, logical(0)) expect_equal(ncol(pred.assay@meta.features), 0) expect_equal(sum(GetAssayData(pred.assay)[1, ]), 26.59365, tolerance = 1e-6) expect_equal(sum(GetAssayData(pred.assay)[, 1]), 1.428075, tolerance = 1e-6) expect_equal(as.vector(colSums(GetAssayData(pred.assay)[1:3, ])), rep(1, ncol(query))) }) test_that("TransferData handles weight.reduction properly, ", { skip_on_cran() # test for custom dimreduc custom.dr <- anchors@object.list[[1]][["pcaproject"]] custom.dr <- subset(x = custom.dr, cells = anchors@query.cells) custom.dr <- RenameCells(object = custom.dr, new.names = sapply(X = Cells(custom.dr), FUN = function(x){ x <- gsub(pattern = "_query", replacement = "", x = x) })) expect_error(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, weight.reduction = custom.dr, dims = 1:100)) preds <-TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, verbose = FALSE) cdr.preds <- TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, weight.reduction = custom.dr, verbose = FALSE, dims = 1:30) expect_equal(preds, cdr.preds) # weight.reduction = "pca pca.preds <- suppressWarnings(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, query = query, weight.reduction = "pca", verbose = FALSE)) expect_true(inherits(pca.preds, "Seurat")) expect_equal(sum(GetAssayData(pca.preds[['prediction.score.id']])[1, ]), 27.83330252, tolerance = 1e-6) # weight.reduction = "cca" anchors.cca <- FindTransferAnchors(reference = ref, query = query, k.filter = 50, reduction = "cca") cca.preds <- TransferData(anchorset = anchors.cca, refdata = ref$RNA_snn_res.1, weight.reduction = "cca", verbose = FALSE) expect_true(inherits(cca.preds, "data.frame")) expect_equal(sum(cca.preds[, 2]), 43.61738383, tolerance = 1e-6) }) test_that("TransferData with l2.norm works", { skip_on_cran() preds <- TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, l2.norm = TRUE, verbose = FALSE) expect_equal(dim(preds), c(80, 5)) expect_equal(colnames(preds)[c(1, 5)], c("predicted.id", "prediction.score.max")) expect_equal(rownames(preds), Cells(query)) expect_equal(preds[1, 1], "0") expect_equal(preds[1, 5], 0.3973124793, tolerance = 1e-6) expect_equal(as.vector(rowSums(as.matrix(preds[, 2:4]))), rep(1, times = ncol(query))) expect_true(inherits(preds, "data.frame")) }) test_that("TransferData with other k.weight works", { skip_on_cran() preds <- TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, k.weight = 10, verbose = FALSE) expect_equal(dim(preds), c(80, 5)) expect_equal(colnames(preds)[c(1, 5)], c("predicted.id", "prediction.score.max")) expect_equal(rownames(preds), Cells(query)) expect_equal(preds[1, 1], "2") expect_equal(preds[1, 5], 0.6145459065, tolerance = 1e-6) expect_equal(as.vector(rowSums(as.matrix(preds[, 2:4]))), rep(1, times = ncol(query))) expect_true(inherits(preds, "data.frame")) }) test_that("TransferData with reference specified works", { skip_on_cran() pred2 <- TransferData(anchorset = anchors, refdata = "RNA_snn_res.1", reference = ref, verbose = FALSE) expect_equal(preds.standard, pred2) }) test_that("TransferData throws expected errors ", { expect_error(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, weight.reduction = "BAD")) # better message expect_error(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, weight.reduction = "cca")) # better message expect_error(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, dims = 1:100)) expect_error(ransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, k.weight = 1000)) expect_error(suppressWarnings(TransferData(anchorset = anchors, refdata = "RNA_snn_res.1"))) expect_error(suppressWarnings(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1[1:10]))) expect_error(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, query = subset(x = query, cells = Cells(query)[1:10]))) }) test_that("TransferData with multiple items to transfer works ", { skip_on_cran() preds <- TransferData(anchorset = anchors, refdata = list( ids = ref$RNA_snn_res.1, groups = ref$groups, dat = GetAssayData(ref[["RNA"]])), verbose = FALSE) expect_equal(length(preds), 3) expect_equal(preds[[1]], preds.standard) }) test_that("TransferData can return a modified query object ", { query <- suppressWarnings(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, query = query, verbose = FALSE)) expect_true("prediction.score.id" %in% Assays(query)) expect_true("predicted.id" %in% colnames(query[[]])) expect_true("predicted.id.score" %in% colnames(query[[]])) query <- suppressWarnings(TransferData(anchorset = anchors, refdata = ref$RNA_snn_res.1, query = query, store.weights = TRUE, verbose = FALSE)) expect_equal(dim(Tool(query, slot = "TransferData")$weights.matrix), c(128, 80)) }) Seurat/tests/testthat/test_objects.R0000644000176200001440000000173714730427000017337 0ustar liggesusers# Tests for functions in objects.R # Tests for SCE conversion # ------------------------------------------------------------------------------ test_that("as.SingleCellExperiment works", { skip_on_cran() if (requireNamespace('SingleCellExperiment', quietly = TRUE)) { mat <- pbmc_small[["RNA"]]$counts seuratObj <- Seurat::CreateSeuratObject(mat) sce <- suppressWarnings(as.SingleCellExperiment(seuratObj)) expect_equal(ncol(sce), 80) expect_equal(nrow(sce), 230) # expect_equal(length(SingleCellExperiment::altExps(sce)), 0) # expect_equal(SingleCellExperiment::mainExpName(sce), 'RNA') seuratObj <- Seurat::CreateSeuratObject(mat) seuratObj[['ADT']] <- CreateAssayObject(mat) sce <- suppressWarnings(as.SingleCellExperiment(seuratObj)) expect_equal(ncol(sce), 80) expect_equal(nrow(sce), 230) # expect_equal(names(SingleCellExperiment::altExps(sce)), 'ADT') # expect_equal(SingleCellExperiment::mainExpName(sce), 'RNA') } }) Seurat/tests/testthat/test_preprocessing.R0000644000176200001440000006345214731050553020601 0ustar liggesusers# Tests for functions dependent on a seurat object set.seed(42) pbmc.file <- system.file('extdata', 'pbmc_raw.txt', package = 'Seurat') pbmc.test <- as.sparse(x = as.matrix(read.table(pbmc.file, sep = "\t", row.names = 1))) # Tests for object creation (via CreateSeuratObject) # -------------------------------------------------------------------------------- context("Object creation") fake.meta.data <- data.frame(rep(1, ncol(pbmc.test))) rownames(fake.meta.data) <- colnames(pbmc.test) colnames(fake.meta.data) <- "FMD" object <- CreateSeuratObject(counts = pbmc.test, meta.data = fake.meta.data) test_that("object initialization actually creates seurat object", { expect_is(object, "Seurat") }) #this should be moved to seurat object # test_that("meta.data slot generated correctly", { # expect_equal(dim(object[[]]), c(80, 4)) # expect_equal(colnames(object[[]]), c("orig.ident", "nCount_RNA", "nFeature_RNA", "FMD")) # expect_equal(rownames(object[[]]), colnames(object)) # expect_equal(object[["nFeature_RNA"]][1:5, ], c(47, 52, 50, 56, 53)) # expect_equal(object[["nCount_RNA"]][75:80, ], c(228, 527, 202, 157, 150, 233)) # }) object.filtered <- CreateSeuratObject( counts = pbmc.test, min.cells = 10, min.features = 30 ) test_that("Filtering handled properly", { expect_equal(nrow(x = LayerData(object = object.filtered, layer = "counts")), 163) expect_equal(ncol(x = LayerData(object = object.filtered, layer = "counts")), 77) }) #this should be moved to seurat object # test_that("Metadata check errors correctly", { # pbmc.md <- pbmc_small[[]] # pbmc.md.norownames <- as.matrix(pbmc.md) # rownames(pbmc.md.norownames) <- NULL # expect_error(CreateSeuratObject(counts = pbmc.test, meta.data = pbmc.md.norownames), # "Row names not set in metadata. Please ensure that rownames of metadata match column names of data matrix") # }) # Tests for NormalizeData # -------------------------------------------------------------------------------- context("NormalizeData") test_that("NormalizeData error handling", { expect_error(NormalizeData(object = object, assay = "FAKE")) expect_equal( object = LayerData( object = NormalizeData( object = object, normalization.method = NULL, verbose = FALSE ), layer = "data" ), expected = LayerData(object = object, layer = "counts") ) }) object <- NormalizeData(object = object, verbose = FALSE, scale.factor = 1e6) test_that("NormalizeData scales properly", { expect_equal(LayerData(object = object, layer = "data")[2, 1], 9.567085, tolerance = 1e-6) expect_equal(LayerData(object = object, layer = "data")[161, 55], 8.415309, tolerance = 1e-6) expect_equal(Command(object = object, command = "NormalizeData.RNA", value = "scale.factor"), 1e6) expect_equal(Command(object = object, command = "NormalizeData.RNA", value = "normalization.method"), "LogNormalize") }) normalized.data <- LogNormalize(data = GetAssayData(object = object[["RNA"]], layer = "counts"), verbose = FALSE) test_that("LogNormalize normalizes properly", { expect_equal( as.matrix(LogNormalize(data = GetAssayData(object = object[["RNA"]], layer = "counts"), verbose = FALSE)), as.matrix(LogNormalize(data = as.data.frame(as.matrix(GetAssayData(object = object[["RNA"]], layer = "counts"))), verbose = FALSE)) ) }) clr.counts <- NormalizeData(object = pbmc.test, normalization.method = "CLR", verbose = FALSE) test_that("CLR normalization returns expected values", { expect_equal(dim(clr.counts), c(dim(pbmc.test))) expect_equal(clr.counts[2, 1], 0.5517828, tolerance = 1e-6) expect_equal(clr.counts[228, 76], 0.5971381, tolerance = 1e-6) expect_equal(clr.counts[230, 80], 0) }) rc.counts <- NormalizeData(object = pbmc.test, normalization.method = "RC", verbose = FALSE) test_that("Relative count normalization returns expected values", { expect_equal(rc.counts[2, 1], 142.8571, tolerance = 1e-6) expect_equal(rc.counts[228, 76], 18.97533, tolerance = 1e-6) expect_equal(rc.counts[230, 80], 0) rc.counts <- NormalizeData(object = pbmc.test, normalization.method = "RC", verbose = FALSE, scale.factor = 1e6) expect_equal(rc.counts[2, 1], 14285.71, tolerance = 1e-6) }) # Tests for v5 NormalizeData # -------------------------------------------------------------------------------- context("v5 NormalizeData") if(class(object[['RNA']]) == "Assay5") { fake.groups <- c(rep(1, floor(ncol(pbmc.test)/2)), rep(2, ncol(pbmc.test) - (floor(ncol(pbmc.test)/2))) ) object$groups <- fake.groups object.split <- CreateSeuratObject(split(object[["RNA"]], f = object$groups)) object.split <- NormalizeData(object = object.split) group1 <- subset(object, groups==1) group1 <- NormalizeData(group1) test_that("Normalization is performed for each layer", { expect_equal(Layers(object.split),c("counts.1", "counts.2", "data.1", "data.2")) expect_equal(group1[['RNA']]$data, LayerData(object.split, layer="data.1")) }) object.split <- NormalizeData(object = object.split, normalization.method = "CLR", verbose = FALSE) group1 <- NormalizeData(object = group1, normalization.method = "CLR", verbose = FALSE) test_that("CLR normalization works with multiple layers", { expect_equal(Layers(object.split),c("counts.1", "counts.2", "data.1", "data.2")) expect_equal(group1[['RNA']]$data, LayerData(object.split, layer="data.1")) }) object.split <- NormalizeData(object = object.split, normalization.method = "RC", verbose = FALSE) group1 <- NormalizeData(object = group1, normalization.method = "RC", verbose = FALSE) test_that("RC normalization works with multiple layers", { expect_equal(Layers(object.split),c("counts.1", "counts.2", "data.1", "data.2")) expect_equal(group1[['RNA']]$data, LayerData(object.split, layer="data.1")) }) } test_that("NormalizeData scales properly for BPcells", { # Tests for BPCells NormalizeData # -------------------------------------------------------------------------------- skip_on_cran() library(Matrix) skip_if_not_installed("BPCells") library(BPCells) mat_bpcells <- t(as(t(object[['RNA']]$counts ), "IterableMatrix")) object[['RNAbp']] <- CreateAssay5Object(counts = mat_bpcells) object <- NormalizeData(object = object, verbose = FALSE, scale.factor = 1e6, assay = "RNAbp") object <- NormalizeData(object = object, verbose = FALSE, scale.factor = 1e6, assay = "RNA") expect_equal(as.matrix(object[['RNAbp']]$data), as.matrix(object[['RNA']]$data), tolerance = 1e-6) expect_equal(Command(object = object, command = "NormalizeData.RNAbp", value = "scale.factor"), 1e6) expect_equal(Command(object = object, command = "NormalizeData.RNAbp", value = "normalization.method"), "LogNormalize") }) test_that("LogNormalize normalizes properly for BPCells", { skip_on_cran() library(Matrix) skip_if_not_installed("BPCells") library(BPCells) mat_bpcells <- t(as(t(object[['RNA']]$counts ), "IterableMatrix")) object[['RNAbp']] <- CreateAssay5Object(counts = mat_bpcells) object <- NormalizeData(object = object, verbose = FALSE, scale.factor = 1e6, assay = "RNAbp") object <- NormalizeData(object = object, verbose = FALSE, scale.factor = 1e6, assay = "RNA") normalized.data.bp <- LogNormalize(data = GetAssayData(object = object[["RNAbp"]], layer = "counts"), verbose = FALSE) normalized.data <- LogNormalize(data = GetAssayData(object = object[["RNA"]], layer = "counts"), verbose = FALSE) expect_equal( as.matrix(normalized.data.bp), as.matrix(normalized.data), tolerance = 1e-6 ) }) # Tests for ScaleData # -------------------------------------------------------------------------------- context("ScaleData") object <- ScaleData(object, verbose = FALSE) test_that("ScaleData returns expected values when input is a sparse matrix", { expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[1, 1], -0.4148587, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[75, 25], -0.2562305, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[162, 59], -0.4363939, tolerance = 1e-6) }) new.data <- as.matrix(GetAssayData(object = object[["RNA"]], layer = "data")) new.data[1, ] <- rep(x = 0, times = ncol(x = new.data)) object2 <- object object2 <- SetAssayData( object = object, assay = "RNA", slot = "data", new.data = new.data ) object2 <- ScaleData(object = object2, verbose = FALSE) object <- ScaleData(object = object, verbose = FALSE) test_that("ScaleData returns expected values when input is not sparse", { expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[75, 25], -0.2562305, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[162, 59], -0.4363939, tolerance = 1e-6) }) test_that("ScaleData handles zero variance features properly", { expect_equal(GetAssayData(object = object2[["RNA"]], layer = "scale.data")[1, 1], 0) expect_equal(GetAssayData(object = object2[["RNA"]], layer = "scale.data")[1, 80], 0) }) ng1 <- rep(x = "g1", times = round(x = ncol(x = object) / 2)) object$group <- c(ng1, rep(x = "g2", times = ncol(x = object) - length(x = ng1))) g1 <- subset(x = object, group == "g1") g1 <- ScaleData(object = g1, features = rownames(x = g1), verbose = FALSE) g2 <- subset(x = object, group == "g2") g2 <- ScaleData(object = g2, features = rownames(x = g2), verbose = FALSE) object <- ScaleData(object = object, features = rownames(x = object), verbose = FALSE, split.by = "group") #move to SeuratObject # test_that("split.by option works", { # expect_equal(GetAssayData(object = object, layer = "scale.data")[, Cells(x = g1)], # GetAssayData(object = g1, layer = "scale.data")) # expect_equal(GetAssayData(object = object, layer = "scale.data")[, Cells(x = g2)], # GetAssayData(object = g2, layer = "scale.data")) # }) g1 <- ScaleData(object = g1, features = rownames(x = g1), vars.to.regress = "nCount_RNA", verbose = FALSE) g2 <- ScaleData(object = g2, features = rownames(x = g2), vars.to.regress = "nCount_RNA", verbose = FALSE) object <- ScaleData(object = object, features = rownames(x = object), verbose = FALSE, split.by = "group", vars.to.regress = "nCount_RNA") test_that("split.by option works with regression", { expect_equal(LayerData(object = object, layer = "scale.data")[, Cells(x = g1)], LayerData(object = g1, layer = "scale.data")) expect_equal(LayerData(object = object, layer = "scale.data")[, Cells(x = g2)], LayerData(object = g2, layer = "scale.data")) }) # Tests for various regression techniques context("Regression") suppressWarnings({ object <- ScaleData( object = object, vars.to.regress = "nCount_RNA", features = rownames(x = object)[1:10], verbose = FALSE, model.use = "linear") }) test_that("Linear regression works as expected", { expect_equal(dim(x = GetAssayData(object = object[["RNA"]], layer = "scale.data")), c(10, 80)) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[1, 1], -0.6436435, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[5, 25], -0.09035383, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[10, 80], -0.2723782, tolerance = 1e-6) }) object <- ScaleData( object, vars.to.regress = "nCount_RNA", features = rownames(x = object)[1:10], verbose = FALSE, model.use = "negbinom") test_that("Negative binomial regression works as expected", { expect_equal(dim(x = GetAssayData(object = object[["RNA"]], layer = "scale.data")), c(10, 80)) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[1, 1], -0.5888811, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[5, 25], -0.2553394, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[10, 80], -0.1921429, tolerance = 1e-6) }) test_that("Regression error handling checks out", { expect_error(ScaleData(object, vars.to.regress = "nCount_RNA", model.use = "not.a.model", verbose = FALSE)) }) object <- ScaleData( object, vars.to.regress = "nCount_RNA", features = rownames(x = object)[1:10], verbose = FALSE, model.use = "poisson") test_that("Poisson regression works as expected", { expect_equal(dim(x = GetAssayData(object = object[["RNA"]], layer = "scale.data")), c(10, 80)) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[1, 1], -1.011717, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[5, 25], 0.05575307, tolerance = 1e-6) expect_equal(GetAssayData(object = object[["RNA"]], layer = "scale.data")[10, 80], -0.1662119, tolerance = 1e-6) }) #Tests for SampleUMI #-------------------------------------------------------------------------------- context("SampleUMI") downsampled.umis <- SampleUMI( data = LayerData(object = object, layer = "counts"), max.umi = 100, verbose = FALSE ) downsampled.umis.p.cell <- SampleUMI( data = LayerData(object = object, layer = "counts"), max.umi = seq(50, 1640, 20), verbose = FALSE, upsample = TRUE ) test_that("SampleUMI gives reasonable downsampled/upsampled UMI counts", { expect_true(!any(colSums(x = downsampled.umis) < 30, colSums(x = downsampled.umis) > 120)) expect_error(SampleUMI(data = LayerData(object = object, layer = "counts"), max.umi = rep(1, 5))) expect_true(!is.unsorted(x = colSums(x = downsampled.umis.p.cell))) expect_error(SampleUMI( data = LayerData(object = object, layer = "counts"), max.umi = seq(50, 900, 10), verbose = FALSE, upsample = TRUE )) }) # Tests for FindVariableFeatures # -------------------------------------------------------------------------------- context("FindVariableFeatures") object <- FindVariableFeatures(object = object, selection.method = "mean.var.plot", verbose = FALSE) test_that("mean.var.plot selection option returns expected values", { expect_equal(VariableFeatures(object = object)[1:4], c("PTGDR", "SATB1", "ZNF330", "S100B")) expect_equal(length(x = VariableFeatures(object = object)), 20) hvf_info <- HVFInfo(object = object[["RNA"]], method = 'mvp') expect_equal(hvf_info[[grep("mean$", colnames(hvf_info), value = TRUE)]][1:2], c(8.328927, 8.444462), tolerance = 1e-6) expect_equal(hvf_info[[grep("dispersion$", colnames(hvf_info), value = TRUE)]][1:2], c(10.552507, 10.088223), tolerance = 1e-6) expect_equal(as.numeric(hvf_info[[grep("dispersion.scaled$", colnames(hvf_info), value = TRUE)]][1:2]), c(0.1113214, -0.1332181523), tolerance = 1e-6) }) object <- FindVariableFeatures(object, selection.method = "dispersion", verbose = FALSE) test_that("dispersion selection option returns expected values", { expect_equal(VariableFeatures(object = object)[1:4], c("PCMT1", "PPBP", "LYAR", "VDAC3")) expect_equal(length(x = VariableFeatures(object = object)), 230) hvf_info <- HVFInfo(object = object[["RNA"]], method = 'mvp') expect_equal(hvf_info[[grep("mean$", colnames(hvf_info), value = TRUE)]][1:2], c(8.328927, 8.444462), tolerance = 1e-6) expect_equal(hvf_info[[grep("dispersion$", colnames(hvf_info), value = TRUE)]][1:2], c(10.552507, 10.088223), tolerance = 1e-6) expect_equal(as.numeric(hvf_info[[grep("dispersion.scaled$", colnames(hvf_info), value = TRUE)]][1:2]), c(0.1113214, -0.1332181523), tolerance = 1e-6) expect_true(!is.unsorted(rev(hvf_info[VariableFeatures(object = object), "dispersion"]))) }) object <- FindVariableFeatures(object, selection.method = "vst", verbose = FALSE) test_that("vst selection option returns expected values", { expect_equal(VariableFeatures(object = object)[1:4], c("PPBP", "IGLL5", "VDAC3", "CD1C")) expect_equal(length(x = VariableFeatures(object = object)), 230) hvf_info <- HVFInfo(object = object[["RNA"]], method = 'vst') expect_equal(hvf_info[[grep("variance$", colnames(hvf_info), value = TRUE)]][1:2], c(1.0251582, 1.2810127), tolerance = 1e-6) expect_equal(hvf_info[[grep("variance.standardized$", colnames(hvf_info), value = TRUE)]][1:2], c(0.8983463, 0.4731134), tolerance = 1e-6) expect_true(!is.unsorted(rev(hvf_info[VariableFeatures(object = object), grep("variance.standardized$", colnames(hvf_info))]))) }) #object <- FindVariableFeatures(object, assay = "RNAbp") #this breaks currently # Tests for internal functions # ------------------------------------------------------------------------------ norm.fxn <- function(x) {x / mean(x)} test_that("CustomNormalize works as expected", { expect_equal( CustomNormalize(data = pbmc.test, custom_function = norm.fxn, margin = 2), apply(X = pbmc.test, MARGIN = 2, FUN = norm.fxn) ) expect_equal( CustomNormalize(data = as.matrix(pbmc.test), custom_function = norm.fxn, margin = 2), apply(X = pbmc.test, MARGIN = 2, FUN = norm.fxn) ) expect_equal( CustomNormalize(data = as.data.frame(as.matrix(pbmc.test)), custom_function = norm.fxn, margin = 2), apply(X = pbmc.test, MARGIN = 2, FUN = norm.fxn) ) expect_equal( CustomNormalize(data = pbmc.test, custom_function = norm.fxn, margin = 1), t(apply(X = pbmc.test, MARGIN = 1, FUN = norm.fxn)) ) expect_error(CustomNormalize(data = pbmc.test, custom_function = norm.fxn, margin = 10)) }) # Tests for SCTransform # -------------------------------------------------------------------------------- context("SCTransform") object <- suppressWarnings(SCTransform(object = object, verbose = FALSE, vst.flavor = "v1", seed.use = 1448145)) test_that("SCTransform v1 works as expected", { expect_true("SCT" %in% names(object)) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "scale.data"))[1]), 11.40288448) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "scale.data"))[5]), 0) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "data"))[1]), 57.7295742, tolerance = 1e-6) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "data"))[5]), 11.74403719, tolerance = 1e-6) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "counts"))[1]), 129) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "counts"))[5]), 28) expect_equal(length(VariableFeatures(object[["SCT"]])), 220) fa <- SCTResults(object = object, assay = "SCT", slot = "feature.attributes") expect_equal(fa["MS4A1", "detection_rate"], 0.15) expect_equal(fa["MS4A1", "gmean"], 0.2027364, tolerance = 1e-6) expect_equal(fa["MS4A1", "variance"], 1.025158, tolerance = 1e-6) expect_equal(fa["MS4A1", "residual_mean"], 0.2362887, tolerance = 1e-6) expect_equal(fa["MS4A1", "residual_variance"], 2.875761, tolerance = 1e-6) }) suppressWarnings(RNGversion(vstr = "3.5.0")) object <- suppressWarnings(SCTransform(object = object, vst.flavor = "v1", ncells = 80, verbose = FALSE, seed.use = 42)) test_that("SCTransform ncells param works", { expect_true("SCT" %in% names(object)) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "scale.data"))[1]), 11.40288, tolerance = 1e-6) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "scale.data"))[5]), 0) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "data"))[1]), 57.72957, tolerance = 1e-6) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "data"))[5]), 11.74404, tolerance = 1e-6) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "counts"))[1]), 129) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "counts"))[5]), 28) expect_equal(length(VariableFeatures(object[["SCT"]])), 220) fa <- SCTResults(object = object, assay = "SCT", slot = "feature.attributes") expect_equal(fa["MS4A1", "detection_rate"], 0.15) expect_equal(fa["MS4A1", "gmean"], 0.2027364, tolerance = 1e-6) expect_equal(fa["MS4A1", "variance"], 1.025158, tolerance = 1e-6) expect_equal(fa["MS4A1", "residual_mean"], 0.2362887, tolerance = 1e-3) expect_equal(fa["MS4A1", "residual_variance"], 2.875761, tolerance = 1e-3) }) suppressWarnings(object[["SCT_SAVE"]] <- object[["SCT"]]) object[["SCT"]] <- suppressWarnings({SetAssayData(object = object[["SCT"]], slot = "scale.data", new.data = GetAssayData(object = object[["SCT"]], layer = "scale.data")[1:100, ])}) object <- GetResidual(object = object, features = rownames(x = object), verbose = FALSE) test_that("GetResidual works", { expect_equal(dim(GetAssayData(object = object[["SCT"]], layer = "scale.data")), c(220, 80)) expect_equal( GetAssayData(object = object[["SCT"]], layer = "scale.data"), GetAssayData(object = object[["SCT_SAVE"]], layer = "scale.data") ) expect_warning(GetResidual(object, features = "asd")) }) test_that("SCTransform v2 works as expected", { skip_on_cran() skip_if_not_installed("glmGamPoi") object <- suppressWarnings(SCTransform(object = object, verbose = FALSE, vst.flavor = "v2", seed.use = 1448145)) expect_true("SCT" %in% names(object)) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "scale.data"))[1]), 24.5813, tolerance = 1e-4) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "scale.data"))[5]), 0) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "data"))[1]), 58.65829, tolerance = 1e-6) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "data"))[5]), 13.75449, tolerance = 1e-6) expect_equal(as.numeric(colSums(GetAssayData(object = object[["SCT"]], layer = "counts"))[1]), 141) expect_equal(as.numeric(rowSums(GetAssayData(object = object[["SCT"]], layer = "counts"))[5]), 40) expect_equal(length(VariableFeatures(object[["SCT"]])), 220) fa <- SCTResults(object = object, assay = "SCT", slot = "feature.attributes") expect_equal(fa["MS4A1", "detection_rate"], 0.15) expect_equal(fa["MS4A1", "gmean"], 0.2027364, tolerance = 1e-6) expect_equal(fa["MS4A1", "variance"], 1.025158, tolerance = 1e-6) expect_equal(fa["MS4A1", "residual_mean"], 0.2763993, tolerance = 1e-6) expect_equal(fa["MS4A1", "residual_variance"], 3.023062, tolerance = 1e-6) expect_equal(fa["FCER2", "theta"], Inf) }) test_that("SCTransform `clip.range` param works as expected", { # make a copy of the testing data test.data <- object # override defaults for ease of testing clip.min <- -0.1 clip.max <- 0.1 # for some reason, the clipping seems to be a little fuzzy at the upper end, # since this is expected behaviour we'll need to accomodate the difference clip.max.tolerance <- 0.1 test.result <- suppressWarnings( SCTransform( test.data, clip.range = c(clip.min, clip.max), ) ) scale.data <- LayerData(test.result[["SCT"]], layer = "scale.data") expect_true(min(scale.data) >= clip.min) expect_true(max(scale.data) <= (clip.max + clip.max.tolerance)) # when `ncells` is less than the size of the dataset the residuals will get # re-clipped in batches, make sure this clipping is done correctly as well test.result <- suppressWarnings( SCTransform( test.data, clip.range = c(clip.min, clip.max), ncells = 40 ) ) scale.data <- LayerData(test.result[["SCT"]], layer = "scale.data") expect_true(min(scale.data) >= clip.min) expect_true(max(scale.data) <= (clip.max + clip.max.tolerance)) }) test_that("SCTransform `vars.to.regress` param works as expected", { # make a copy of the testing data test.data <- object # add a fake mitochondrial gene to the counts matrix counts <- LayerData(test.data, assay = "RNA", layer = "counts") counts <- rbind(counts, 5) rownames(counts)[nrow(counts)] <- "MT-TEST" # use the fake feature to populate a new meta.data column test.data[[ "percent.mt" ]] <- PercentageFeatureSet( test.data, pattern="^MT-" ) # make sure that `ncells` is smaller than the datset being transformed # so tha the regression model is trained on a subset of the data - make sure # the regression is applied to the entire dataset left <- suppressWarnings( SCTransform( test.data, vars.to.regress = NULL, ncells = ncol(test.data) / 2, verbose = FALSE ) ) right <- suppressWarnings( SCTransform( test.data, vars.to.regress = "percent.mt", ncells = ncol(test.data) / 2, verbose = FALSE ) ) expect_false(identical(left[["SCT"]]$scale.data, right[["SCT"]]$scale.data)) # if the `assay` points to an `Assay5` instance the regression is handled # using separate logic test.data[["RNAv5"]] <- CreateAssay5Object( counts = LayerData( test.data, assay = "RNA", layer = "counts" ) ) left <- suppressWarnings( SCTransform( test.data, assay = "RNAv5", vars.to.regress = NULL, ncells = ncol(test.data) / 2, verbose = FALSE ) ) right <- suppressWarnings( SCTransform( test.data, assay = "RNAv5", vars.to.regress = "percent.mt", ncells = ncol(test.data) / 2, verbose = FALSE ) ) expect_false(identical(left[["SCT"]]$scale.data, right[["SCT"]]$scale.data)) }) test_that("SCTransform is equivalent for BPcells ", { skip_on_cran() skip_on_cran() skip_if_not_installed("glmGamPoi") library(Matrix) skip_if_not_installed("BPCells") library(BPCells) mat_bpcells <- t(as(t(object[['RNA']]$counts ), "IterableMatrix")) object[['RNAbp']] <- CreateAssay5Object(counts = mat_bpcells) object <- suppressWarnings(SCTransform(object = object, assay = "RNA", new.assay.name = "SCT", verbose = FALSE, vst.flavor = "v2", seed.use = 1448145)) object <- suppressWarnings(SCTransform(object = object, assay = "RNAbp", new.assay.name = "SCTbp", verbose = FALSE, vst.flavor = "v2", seed.use = 1448145)) expect_equal(as.matrix(LayerData(object = object[["SCT"]], layer = "data")), as.matrix(LayerData(object = object[["SCTbp"]], layer = "data")), tolerance = 1e-6) }) Seurat/tests/testthat/test_data_manipulation.R0000644000176200001440000002252214670622051021400 0ustar liggesusers# Tests for functions in data_manipulation.cpp # change in random number generation in R3.6, this ensures tests will pass under older and newer Rs suppressWarnings(RNGversion(vstr = "3.5.3")) set.seed(42) library(Matrix) # Tests for row merging # -------------------------------------------------------------------------------- context("Row Merging") m1 <- rsparsematrix(10, 10, 0.1) m2 <- rsparsematrix(10, 10, 0.1) m1.names <- paste0("row", sample(1:10, size = 10)) m2.names <- paste0("row", sample(1:20, size = 10)) all.names <- union(m1.names, m2.names) rownames(m1) <- m1.names rownames(m2) <- m2.names m1 <- as(m1, "RsparseMatrix") m2 <- as(m2, "RsparseMatrix") test_that("Row merging done correctly", { m3 <- RowMergeMatrices(mat1 = m1, mat2 = m2, mat1_rownames = m1.names, mat2_rownames = m2.names, all_rownames = all.names) expect_equal(m3[1, 14], -0.17) expect_equal(m3[3, 2], -1.4) expect_equal(m3[14, 18], -0.43) expect_equal(length(m3), 280) }) #test_that("Row merging with a list done correctly", { # m3 <- RowMergeMatricesList(mat_list = list(m1, m2), mat_rownames = list(m1.names, m2.names), all_rownames = all.names) # expect_equal(m3[1, 14], -0.17) # expect_equal(m3[3, 2], -1.4) # expect_equal(m3[14, 18], -0.43) # expect_equal(length(m3), 280) #}) # Tests for log normalization # -------------------------------------------------------------------------------- context("Log Normalization") mat <- as(matrix(1:16, ncol = 4, nrow = 4), "sparseMatrix") test_that("Log Normalization returns expected values", { mat.norm.r <- log1p(sweep(mat, 2, Matrix::colSums(mat), FUN = "/") * 1e4) mat.norm <- LogNorm(mat, 1e4, display_progress = F) expect_equal(mat.norm[1, ], mat.norm.r[1, ]) expect_equal(mat.norm[4, 4], mat.norm.r[4, 4]) }) # Tests for scaling data # -------------------------------------------------------------------------------- context("Fast Scale Data Functions") mat <- matrix(rnorm(n = 10*15), nrow = 10, ncol = 15) # should be the equivalent of t(scale(t(mat))) test_that("Fast implementation of row scaling returns expected values", { expect_equal(t(scale(t(mat)))[1:10, 1:15], FastRowScale(mat)) expect_equal(t(scale(t(mat), center = FALSE))[1:10, 1:15], FastRowScale(mat, center = FALSE)) expect_equal(t(scale(t(mat), scale = FALSE))[1:10, 1:15], FastRowScale(mat, scale = FALSE)) expect_equal(t(scale(t(mat), scale = FALSE, center = F))[1:10, 1:15], FastRowScale(mat, scale = FALSE, center = F)) mat.clipped <- FastRowScale(mat, scale_max = 0.2) expect_true(max(mat.clipped, na.rm = T) >= 0.2) }) # should be the equivalent of scale(mat, TRUE, apply(mat, 2, sd)) test_that("Standardize returns expected values", { expect_equal(Standardize(mat, display_progress = FALSE), scale(mat, TRUE, apply(mat, 2, sd)), check.attributes = FALSE) }) # should be the equivalent of t(scale(t(mat))) mat <- rsparsematrix(10, 15, 0.1) test_that("Fast implementation of row scaling returns expected values", { expect_equal(t(scale(t(as.matrix(mat))))[1:10, 1:15], FastSparseRowScale(mat, display_progress = FALSE), check.attributes = FALSE) expect_equal(t(scale(t(as.matrix(mat)), center = FALSE))[1:10, 1:15], FastSparseRowScale(mat, center = FALSE, display_progress = FALSE), check.attributes = FALSE) expect_equal(t(scale(t(as.matrix(mat)), scale = FALSE))[1:10, 1:15], FastSparseRowScale(mat, scale = FALSE, display_progress = FALSE), check.attributes = FALSE) expect_equal(t(scale(t(as.matrix(mat)), scale = FALSE, center = F))[1:10, 1:15], FastSparseRowScale(mat, scale = FALSE, center = F, display_progress = FALSE), check.attributes = FALSE) mat.clipped <- FastSparseRowScale(mat, scale_max = 0.2, display_progress = F) expect_true(max(mat.clipped, na.rm = T) >= 0.2) }) mat <- as.sparse(x = matrix(rnorm(100), nrow = 10, ncol = 10)) test_that("Row scaling with known stats works", { mat.rowmeans <- rowMeans(x = mat) mat.sd <- apply(X = mat, MARGIN = 1, FUN = sd) expect_equal( t(scale(t(as.matrix(mat)), center = mat.rowmeans, scale = mat.sd)), FastSparseRowScaleWithKnownStats(mat = mat, mu = mat.rowmeans, sigma = mat.sd, scale = TRUE, center = TRUE, scale_max = 10, display_progress = FALSE), check.attributes = FALSE ) expect_equal( t(scale(t(as.matrix(mat)), center = FALSE, scale = mat.sd)), FastSparseRowScaleWithKnownStats(mat = mat, mu = mat.rowmeans, sigma = mat.sd, scale = TRUE, center = FALSE, scale_max = 10, display_progress = FALSE), check.attributes = FALSE ) expect_equal( t(scale(t(as.matrix(mat)), center = mat.rowmeans, scale = FALSE)), FastSparseRowScaleWithKnownStats(mat = mat, mu = mat.rowmeans, sigma = mat.sd, scale = FALSE, center = TRUE, scale_max = 10, display_progress = FALSE), check.attributes = FALSE ) mat.clipped <- FastSparseRowScaleWithKnownStats(mat = mat, mu = mat.rowmeans, sigma = mat.sd, scale = FALSE, center = TRUE, scale_max = 0.2, display_progress = FALSE) expect_true(max(mat.clipped, na.rm = T) >= 0.2) }) # Tests for fast basic stats functions # -------------------------------------------------------------------------------- context("Fast Basic Stats Functions") set.seed(42) mat <- replicate(10, rchisq(10, 4)) fcv <- FastCov(mat) cv <- cov(mat) test_that("Fast implementation of covariance returns expected values", { expect_equal(fcv[1,1], 9.451051142) expect_equal(fcv[10,10], 5.6650068) expect_equal(fcv, cv) }) mat2 <- replicate(10, rchisq(10, 4)) fcv <- FastCovMats(mat1 = mat, mat2 = mat2) cv <- cov(mat, mat2) test_that("Fast implementation of covariance returns expected values for matrices", { expect_equal(fcv[1,1], 1.523417, tolerance = 1e-6) expect_equal(fcv[10,10], -0.6031694, tolerance = 1e-6) expect_equal(fcv, cv) }) merged.mat <- FastRBind(mat, fcv) test_that("Fast implementation of rbind returns expected values", { expect_equal(merged.mat, rbind(mat, fcv)) expect_equal(mat[1,1], merged.mat[1,1]) expect_equal(fcv[10,10], merged.mat[20,10]) }) mat <- as.sparse(mat) test_that("Fast implementation of ExpMean returns expected values",{ expect_equal(ExpMean(mat[1,]), FastExpMean(mat, display_progress = F)[1]) expect_equal(ExpMean(mat[5,]), FastExpMean(mat, display_progress = F)[5]) expect_equal(ExpMean(mat[10,]), FastExpMean(mat, display_progress = F)[10]) expect_equal(length(FastExpMean(mat, display_progress = F)), nrow(mat)) expect_error(FastExpMean(mat[1, ], display_progress = F)) expect_equal(FastExpMean(mat[1, ,drop = F], display_progress = F), ExpMean(mat[1,])) expect_equal(FastExpMean(mat, display_progress = F)[1], 6.493418, tolerance = 1e-6) expect_equal(FastExpMean(mat, display_progress = F)[5], 6.255206, tolerance = 1e-6) expect_equal(FastExpMean(mat, display_progress = F)[10], 7.84965, tolerance = 1e-6) }) test_that("Fast implementation of LogVMR returns expected values", { expect_equal(LogVMR(mat[1,]), FastLogVMR(mat, display_progress = F)[1]) expect_equal(LogVMR(mat[5,]), FastLogVMR(mat, display_progress = F)[5]) expect_equal(LogVMR(mat[10,]), FastLogVMR(mat, display_progress = F)[10]) expect_equal(length(FastExpMean(mat, display_progress = F)), nrow(mat)) expect_error(FastLogVMR(mat[1, ], display_progress = F)) expect_equal(FastLogVMR(mat[1, ,drop = F], display_progress = F), LogVMR(mat[1,])) expect_equal(FastLogVMR(mat, display_progress = F)[1], 7.615384, tolerance = 1e-6) expect_equal(FastLogVMR(mat, display_progress = F)[5], 7.546768, tolerance = 1e-6) expect_equal(FastLogVMR(mat, display_progress = F)[10], 10.11755, tolerance = 1e-6) }) test_that("Row variance calculations for sparse matrices work", { expect_equal(apply(X = mat, MARGIN = 1, FUN = var), SparseRowVar(mat = mat, display_progress = FALSE), tolerance = 1e-6) expect_equal(apply(X = mat2, MARGIN = 1, FUN = var), SparseRowVar(mat = as.sparse(x = mat2), display_progress = FALSE), tolerance = 1e-6) }) # Tests for data structure manipulations # -------------------------------------------------------------------------------- context("Data structure manipulations") mat <- rsparsematrix(nrow = 10, ncol = 100, density = 0.1) mat2 <- rsparsematrix(nrow = 10, ncol = 10, density = 0.1) cols.to.replace1 <- 1:10 cols.to.replace2 <- 10:1 cols.to.replace3 <- 91:100 cols.to.replace4 <- c(10, 15, 33, 2, 6, 99, 55, 30, 25, 42) ReplaceCols <- function(mat, cols, replace){ mat[, cols] <- replace return(mat) } test_that("Replacing columns works", { expect_equal(ReplaceColsC(mat = mat, col_idx = cols.to.replace1 - 1, replacement = mat2), ReplaceCols(mat = mat, cols = cols.to.replace1, replace = mat2)) expect_equal(ReplaceColsC(mat = mat, col_idx = cols.to.replace2 - 1, replacement = mat2), ReplaceCols(mat = mat, cols = cols.to.replace2, replace = mat2)) expect_equal(ReplaceColsC(mat = mat, col_idx = cols.to.replace3 - 1, replacement = mat2), ReplaceCols(mat = mat, cols = cols.to.replace3, replace = mat2)) expect_equal(ReplaceColsC(mat = mat, col_idx = cols.to.replace4 - 1, replacement = mat2), ReplaceCols(mat = mat, cols = cols.to.replace4, replace = mat2)) }) test_that("Cpp implementation of row variance is correct", { expect_equal(apply(X = mat, MARGIN = 1, FUN = var), RowVar(as.matrix(mat))) expect_equal(apply(X = merged.mat, MARGIN = 1, FUN = var), RowVar(as.matrix(merged.mat))) }) Seurat/tests/testthat/test_integratedata.R0000644000176200001440000001412114731050553020517 0ustar liggesusers# Tests for integration related fxns set.seed(42) pbmc_small <- suppressWarnings(UpdateSeuratObject(pbmc_small)) # Setup test objects ref <- pbmc_small ref <- FindVariableFeatures(object = ref, verbose = FALSE, nfeatures = 100) query <- CreateSeuratObject( counts = as.sparse( GetAssayData( object = pbmc_small[['RNA']], layer = "counts") + rpois(n = ncol(pbmc_small), lambda = 1 ) ) ) query2 <- CreateSeuratObject( counts = as.sparse( LayerData( object = pbmc_small[['RNA']], layer = "counts")[, 1:40] + rpois(n = ncol(pbmc_small), lambda = 1 ) ) ) query.list <- list(query, query2) query.list <- lapply(X = query.list, FUN = NormalizeData, verbose = FALSE) query.list <- lapply(X = query.list, FUN = FindVariableFeatures, verbose = FALSE, nfeatures = 100) query.list <- lapply(X = query.list, FUN = ScaleData, verbose = FALSE) query.list <- suppressWarnings(lapply(X = query.list, FUN = RunPCA, verbose = FALSE, npcs = 20)) anchors2 <- suppressMessages(suppressWarnings(FindIntegrationAnchors(object.list = c(ref, query.list[[1]]), k.filter = NA, verbose = FALSE))) anchors3 <- suppressMessages(suppressWarnings(FindIntegrationAnchors(object.list = c(ref, query.list), k.filter = NA, verbose = FALSE))) # Tests for IntegrateEmbeddings # ------------------------------------------------------------------------------ # context("IntegrateEmbeddings") # test_that("IntegrateEmbeddings validates properly", { # expect_error(IntegrateEmbeddings(anchorset = anchors2)) # expect_error(IntegrateEmbeddings(anchorset = anchors2, reduction = "pca", k.weight = 100)) # expect_error(IntegrateEmbeddings(anchorset = anchors2, reduction = c("pca", "pca2"), k.weight = 40)) # expect_error(IntegrateEmbeddings(anchorset = anchors2, reduction = "pca", k.weight = 40, weight.reduction = c(ref[['pca']]))) # pca3 <- RenameCells(object = ref[['pca']], new.names = paste0(Cells(ref), "_test")) # expect_error(IntegrateEmbeddings(anchorset = anchors2, reduction = "pca", k.weight = 40, # weight.reduction = c(pca3, ref[['pca']]))) # }) # # test_that("IntegrateEmbeddings with two objects default works", { # skip_on_cran() # int2 <- IntegrateEmbeddings(anchorset = anchors2, reduction = "pca", k.weight = 40, verbose = FALSE) # expect_equal(Reductions(int2), "integrated_pca") # expect_equal(sum(Embeddings(int2[['integrated_pca']])[1,]), -3.13050872287, tolerance = 1e-6) # expect_equal(sum(Embeddings(int2[['integrated_pca']])[,1]), -5.78790844887, tolerance = 1e-6) # }) # # test_that("IntegrateEmbeddings with three objects default works", { # skip_on_cran() # int3 <- IntegrateEmbeddings(anchorset = anchors3, reduction = "pca", k.weight = 40, verbose = FALSE) # expect_equal(Reductions(int3), "integrated_pca") # expect_equal(sum(Embeddings(int3[['integrated_pca']])[1,]), 0.221867815987, tolerance = 1e-6) # expect_equal(sum(Embeddings(int3[['integrated_pca']])[,1]), -16.7881409595, tolerance = 1e-6) # }) # # test_that("IntegrateEmbeddings works with specified reference objects", { # skip_on_cran() # anchors4 <- suppressMessages(suppressWarnings(FindIntegrationAnchors(object.list = c(ref, query.list), k.filter = NA, verbose = FALSE, reference = 1))) # int4 <- IntegrateEmbeddings(anchorset = anchors4, reduction = "pca", k.weight = 40, verbose = FALSE) # expect_equal(Reductions(int4), "integrated_pca") # expect_equal(sum(Embeddings(int4[['integrated_pca']])[1,]), -3.13050872287, tolerance = 1e-6) # expect_equal(sum(Embeddings(int4[['integrated_pca']])[,1]), 13.1180105492, tolerance = 1e-6) # }) # Tests for IntegrateData # ------------------------------------------------------------------------------ context("IntegrateData") test_that("IntegrateData with two objects default work", { expect_error(IntegrateData(anchorset = anchors2)) int2 <- suppressWarnings(IntegrateData(anchorset = anchors2, k.weight = 50, verbose = FALSE)) expect_true(all(Assays(int2) %in% c("integrated", "RNA"))) expect_equal(Tool(int2), "Integration") expect_equal(dim(int2[["integrated"]]), c(133, 160)) expect_equal(length(VariableFeatures(int2)), 133) expect_equal(GetAssayData(int2[["integrated"]], layer = "counts"), new("dgCMatrix")) expect_equal(GetAssayData(int2[['integrated']], layer = "scale.data"), matrix()) expect_equal(sum(GetAssayData(int2[["integrated"]], layer = "data")[1, ]), 44.97355, tolerance = 1e-3) expect_equal(sum(GetAssayData(int2[["integrated"]], layer = "data")[, 1]), 78.8965706046, tolerance = 1e-6) expect_equal(Tool(object = int2, slot = "Integration")@sample.tree, matrix(c(-1, -2), nrow = 1)) }) test_that("IntegrateData with three objects default work", { expect_error(IntegrateData(anchorset = anchors3, k.weight = 50)) int3 <- suppressWarnings(IntegrateData(anchorset = anchors3, k.weight = 25, verbose = FALSE)) expect_true(all(Assays(int3) %in% c("integrated", "RNA"))) expect_equal(Tool(int3), "Integration") expect_equal(dim(int3[["integrated"]]), c(169, 200)) expect_equal(length(VariableFeatures(int3)), 169) expect_equal(GetAssayData(int3[["integrated"]], layer = "counts"), new("dgCMatrix")) expect_equal(GetAssayData(int3[['integrated']], layer = "scale.data"), matrix()) expect_equal(sum(GetAssayData(int3[["integrated"]], layer = "data")[1, ]), 372.829, tolerance = 1e-6) expect_equal(sum(GetAssayData(int3[["integrated"]], layer = "data")[, 1]), 482.5009, tolerance = 1e-6) expect_equal(Tool(object = int3, slot = "Integration")@sample.tree, matrix(c(-2, -3, 1, -1), nrow = 2, byrow = TRUE)) }) test_that("Input validates correctly ", { expect_error(anchorset = anchors2, k.weight = 50, features.to.integrate = "BAD") expect_error(IntegrateData(anchorset = anchors2, k.weight = 50, normalization.method = "BAD")) expect_error(IntegrateData(anchorset = anchors2, k.weight = 50, weight.reduction = "BAD")) expect_error(IntegrateData(anchorset = anchors2, reductions.to.integrate = "pca")) skip_on_cran() #expect_warning(IntegrateData(anchorset = anchors2, k.weight = 50, features = c(rownames(ref), "BAD"))) #expect_warning(IntegrateData(anchorset = anchors2, k.weight = 50, dims = 1:1000)) }) Seurat/tests/testthat/test_differential_expression.R0000644000176200001440000006632714744456127022650 0ustar liggesusers# Tests for functions in differential_expression.R suppressWarnings(RNGversion(vstr = "3.5.3")) set.seed(seed = 42) # Tests for FindMarkers # -------------------------------------------------------------------------------- context("FindMarkers") clr.obj <- suppressWarnings(NormalizeData(pbmc_small, normalization.method = "CLR")) sct.obj <- suppressWarnings(suppressMessages(SCTransform(pbmc_small, vst.flavor = "v1"))) markers.0 <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, verbose = FALSE, base = exp(1),pseudocount.use = 1)) markers.01 <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1),pseudocount.use = 1)) results.clr <- suppressWarnings(FindMarkers(object = clr.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1)) results.sct <- suppressWarnings(FindMarkers(object = sct.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("Default settings work as expected with pseudocount = 1", { expect_error(FindMarkers(object = pbmc_small)) expect_error(FindMarkers(object = pbmc_small, ident.1 = "test")) expect_error(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = "test")) expect_equal(colnames(x = markers.0), c("p_val", "avg_logFC", "pct.1", "pct.2", "p_val_adj")) expect_equal(markers.0[1, "p_val"], 9.572778e-13, tolerance = 1e-18) expect_equal(markers.0[1, "avg_logFC"], -4.180029, tolerance = 1e-6) expect_equal(markers.0[1, "pct.1"], 0.083) expect_equal(markers.0[1, "pct.2"], 0.909) expect_equal(markers.0[1, "p_val_adj"], 2.201739e-10, tolerance = 1e-15) expect_equal(nrow(x = markers.0), 228) expect_equal(rownames(markers.0)[1], "HLA-DPB1") expect_equal(markers.01[1, "p_val"], 1.702818e-11, tolerance = 1e-16) expect_equal(markers.01[1, "avg_logFC"], -2.638242, tolerance = 1e-6) expect_equal(markers.01[1, "pct.1"], 0.111) expect_equal(markers.01[1, "pct.2"], 1.00) expect_equal(markers.01[1, "p_val_adj"], 3.916481e-09, tolerance = 1e-14) expect_equal(nrow(x = markers.01), 222) expect_equal(rownames(x = markers.01)[1], "TYMP") # CLR normalization expect_equal(results.clr[1, "p_val"], 1.209462e-11, tolerance = 1e-16) expect_equal(results.clr[1, "avg_logFC"], -2.946633, tolerance = 1e-6) expect_equal(results.clr[1, "pct.1"], 0.111) expect_equal(results.clr[1, "pct.2"], 0.96) expect_equal(results.clr[1, "p_val_adj"], 2.781762e-09, tolerance = 1e-14) expect_equal(nrow(x = results.clr), 213) expect_equal(rownames(x = results.clr)[1], "S100A8") # SCT normalization expect_equal(results.sct[1, "p_val"], 6.225491e-11, tolerance = 1e-16) expect_equal(results.sct[1, "avg_logFC"], -2.545867, tolerance = 1e-6) expect_equal(results.sct[1, "pct.1"], 0.111) expect_equal(results.sct[1, "pct.2"], 0.96) expect_equal(results.sct[1, "p_val_adj"], 1.369608e-08, tolerance = 1e-13) expect_equal(nrow(x = results.sct), 214) expect_equal(rownames(x = results.sct)[1], "TYMP") }) tymp.results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, features = "TYMP", verbose = FALSE, base = exp(1),pseudocount.use = 1)) vargenes.results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, features = VariableFeatures(object = pbmc_small), verbose = FALSE, base = exp(1),pseudocount.use = 1)) test_that("features parameter behaves correctly ", { expect_equal(nrow(x = tymp.results), 1) expect_equal(tymp.results[1, "p_val"], 3.227445e-07, tolerance = 1e-12) expect_equal(tymp.results[1, "avg_logFC"], -2.188179, tolerance = 1e-6) expect_equal(tymp.results[1, "pct.1"], 0.111) expect_equal(tymp.results[1, "pct.2"], 0.682) expect_equal(tymp.results[1, "p_val_adj"], 7.423123e-05, tolerance = 1e-10) expect_equal(rownames(x = tymp.results)[1], "TYMP") expect_equal(nrow(x = vargenes.results), 20) expect_equal(vargenes.results[20, "p_val"], 4.225151e-01, tolerance = 1e-6) expect_equal(vargenes.results[20, "avg_logFC"], 1.796863, tolerance = 1e-6) expect_equal(vargenes.results[20, "pct.1"], 0.139) expect_equal(vargenes.results[20, "pct.2"], 0.091) expect_equal(vargenes.results[20, "p_val_adj"], 1.000000e+00) expect_equal(rownames(x = vargenes.results)[20], "PARVB") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = Cells(x = pbmc_small)[1:40], ident.2 = Cells(x = pbmc_small)[41:80], verbose = FALSE, base = exp(1),pseudocount.use = 1)) test_that("passing cell names works", { expect_equal(nrow(x = results), 216) expect_equal(results[1, "p_val"], 0.0001690882) expect_equal(results[1, "avg_logFC"], -1.967123, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.075) expect_equal(results[1, "pct.2"], 0.450) expect_equal(results[1, "p_val_adj"], 0.03889028) expect_equal(rownames(x = results)[1], "IFI30") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 0.1)) results.clr <- suppressWarnings(FindMarkers(object = clr.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 0.1)) results.sct <- suppressWarnings(FindMarkers(object = sct.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 0.1, vst.flavor = "v1")) test_that("setting pseudocount.use works", { expect_equal(nrow(x = results), 222) expect_equal(results[1, "avg_logFC"], -2.640848, tolerance = 1e-6) expect_equal(nrow(x = results.clr), 214) expect_equal(results.clr[1, "avg_logFC"], -3.322368, tolerance = 1e-6) expect_equal(nrow(results.sct), 215) expect_equal(results.sct[1, "avg_logFC"], -2.668866, tolerance = 1e-6) }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1, mean.fxn = rowMeans)) results.clr <- suppressWarnings(FindMarkers(object = clr.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1, mean.fxn = rowMeans)) results.sct <- suppressWarnings(FindMarkers(object = sct.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1, mean.fxn = rowMeans, vst.flaovr = "v1")) test_that("setting mean.fxn works", { expect_equal(nrow(x = results), 216) expect_equal(results[1, "avg_logFC"], -4.204346, tolerance = 1e-6) expect_equal(results.clr[1, "avg_logFC"], -1.353025, tolerance = 1e-6) expect_equal(results.sct[1, "avg_logFC"], -1.064042, tolerance = 1e-6) }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, logfc.threshold = 2, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("logfc.threshold works", { expect_equal(nrow(x = results), 139) expect_gte(min(abs(x = results$avg_logFC)), 2) }) results <- expect_warning(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, logfc.threshold = 100, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("logfc.threshold warns when none met", { expect_equal(nrow(x = results), 0) }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, min.pct = 0.5, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("min.pct works", { expect_equal(nrow(x = results), 66) expect_gte(min(apply(X = results, MARGIN = 1, FUN = function(x) max(x[3], x[4]))), 0.5) }) results <- expect_warning(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, min.pct = 2.0, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("min.pct warns when none met", { expect_equal(nrow(x = results), 0) }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, min.diff.pct = 0.5, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("min.diff.pct works", { expect_equal(nrow(x = results), 44) expect_gte(min(apply(X = results, MARGIN = 1, FUN = function(x) abs(x[4] - x[3]))), 0.5) }) results <- expect_warning(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, min.diff.pct = 1.0, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("min.diff.pct warns when none met", { expect_equal(nrow(x = results), 0) }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, only.pos = TRUE, verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("only.pos works", { expect_equal(nrow(x = results), 127) expect_true(all(results$avg_logFC > 0)) }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, max.cells.per.ident = 20, verbose = FALSE, base = exp(1),pseudocount.use = 1)) test_that("max.cells.per.ident works", { expect_equal(nrow(x = results), 222) expect_equal(results[1, "p_val"], 3.428568e-08, tolerance = 1e-13) expect_equal(results[1, "avg_logFC"], -2.638242, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.111) expect_equal(results[1, "pct.2"], 1) expect_equal(results[1, "p_val_adj"], 7.885706e-06) expect_equal(rownames(x = results)[1], "TYMP") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, latent.vars= "groups", verbose = FALSE, test.use = 'LR', base = exp(1), pseudocount.use = 1)) test_that("latent.vars works", { expect_error(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, latent.vars= "fake", verbose = FALSE)) expect_warning(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, latent.vars= "groups", verbose = FALSE)) expect_equal(nrow(x = results), 222) expect_equal(results[1, "p_val"], 2.130202e-16, tolerance = 1e-21) expect_equal(results[1, "avg_logFC"], -3.102866, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.417) expect_equal(results[1, "pct.2"], 1) expect_equal(results[1, "p_val_adj"], 4.899466e-14, tolerance = 1e-19) expect_equal(rownames(x = results)[1], "LYZ") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = "g1", ident.2 = "g2", group.by= "groups", verbose = FALSE, base = exp(1), pseudocount.use = 1)) t2 <- pbmc_small Idents(object = t2) <- "groups" results2 <- suppressWarnings(FindMarkers(object = t2, ident.1 = "g1", ident.2 = "g2", verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("group.by works", { expect_equal(nrow(x = results), 190) expect_equal(results, results2) expect_equal(results[1, "p_val"], 0.02870319) expect_equal(results[1, "avg_logFC"], 0.8473584, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.455) expect_equal(results[1, "pct.2"], 0.194) expect_equal(results[1, "p_val_adj"], 1) expect_equal(rownames(x = results)[1], "NOSIP") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = "g1", ident.2 = "g2", group.by= "groups", subset.ident = 0, verbose = FALSE, base = exp(1), pseudocount.use = 1)) t2 <- subset(x = pbmc_small, idents = 0) Idents(object = t2) <- "groups" results2 <- suppressWarnings(FindMarkers(object = t2, ident.1 = "g1", ident.2 = "g2", verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("subset.ident works", { expect_equal(nrow(x = results), 183) expect_equal(results, results2) expect_equal(results[1, "p_val"], 0.01293720) expect_equal(results[1, "avg_logFC"], 1.912603, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.50) expect_equal(results[1, "pct.2"], 0.125) expect_equal(results[1, "p_val_adj"], 1) expect_equal(rownames(x = results)[1], "TSPO") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, reduction = "pca", verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("reduction works", { expect_equal(results[1, "p_val"], 1.664954e-10, tolerance = 1e-15) expect_equal(results[1, "avg_diff"], -2.810453669, tolerance = 1e-6) expect_equal(results[1, "p_val_adj"], 3.163412e-09, tolerance = 1e-14) expect_equal(rownames(x = results)[1], "PC_2") }) results <- FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "bimod", verbose = FALSE, base = exp(1), pseudocount.use = 1) test_that("bimod test works", { expect_equal(nrow(x = results), 222) expect_equal(results[1, "p_val"], 4.751376e-17, tolerance = 1e-22) expect_equal(results[1, "avg_logFC"], -2.57219, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.306) expect_equal(results[1, "pct.2"], 1.00) expect_equal(results[1, "p_val_adj"], 1.092816e-14, tolerance = 1e-19) expect_equal(rownames(x = results)[1], "CST3") }) results <- FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "roc", verbose = FALSE, base = exp(1), pseudocount.use = 1) test_that("roc test works", { expect_equal(nrow(x = results), 222) # expect_equal(colnames(x = results), c("myAUC", "avg_diff", "power", "pct.1", "pct.2")) expect_equal(colnames(x = results), c("myAUC", "avg_diff", "power", "avg_logFC", "pct.1", "pct.2")) expect_equal(results["CST3", "myAUC"], 0.018) expect_equal(results["CST3", "avg_diff"], -2.552769, tolerance = 1e-6) expect_equal(results["CST3", "power"], 0.964) expect_equal(results["CST3", "pct.1"], 0.306) expect_equal(results["CST3", "pct.2"], 1.00) expect_equal(rownames(x = results)[1], "LYZ") }) results <- FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "t", verbose = FALSE, base = exp(1), pseudocount.use = 1) test_that("t test works", { expect_equal(nrow(x = results), 222) expect_equal(results["CST3", "p_val"], 1.170112e-15, tolerance = 1e-20) expect_equal(results["CST3", "avg_logFC"], -2.57219, tolerance = 1e-6) expect_equal(results["CST3", "pct.1"], 0.306) expect_equal(results["CST3", "pct.2"], 1.00) expect_equal(results["CST3", "p_val_adj"], 2.691258e-13, tolerance = 1e-18) expect_equal(rownames(x = results)[1], "TYMP") }) results <- suppressWarnings( FindMarkers( object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "negbinom", verbose = FALSE, base = exp(1), fc.slot = "counts", pseudocount.use = 1 ) ) test_that("negbinom test works", { expect_equal(nrow(x = results), 204) expect_equal(results["CST3", "p_val"], 1.354443e-17, tolerance = 1e-22) expect_equal(results["CST3", "avg_logFC"], -2.878123, tolerance = 1e-6) expect_equal(results["CST3", "pct.1"], 0.306) expect_equal(results["CST3", "pct.2"], 1.00) expect_equal(results["CST3", "p_val_adj"], 3.115218e-15, tolerance = 1e-20) expect_equal(rownames(x = results)[1], "LYZ") }) results <- suppressWarnings( FindMarkers( object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "poisson", verbose = FALSE, base = exp(1), fc.slot = "counts", pseudocount.use = 1 ) ) test_that("poisson test works", { expect_equal(nrow(x = results), 204) expect_equal(results["CST3", "p_val"], 3.792196e-78, tolerance = 1e-83) expect_equal(results["CST3", "avg_logFC"], -2.878123, tolerance = 1e-6) expect_equal(results["CST3", "pct.1"], 0.306) expect_equal(results["CST3", "pct.2"], 1.00) expect_equal(results["CST3", "p_val_adj"], 8.722050e-76, tolerance = 1e-81) expect_equal(rownames(x = results)[1], "LYZ") }) results <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "LR", verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("LR test works", { expect_equal(nrow(x = results), 222) expect_equal(results["CST3", "p_val"], 3.990707e-16, tolerance = 1e-21) expect_equal(results["CST3", "avg_logFC"], -2.57219, tolerance = 1e-6) expect_equal(results["CST3", "pct.1"], 0.306) expect_equal(results["CST3", "pct.2"], 1.00) expect_equal(results["CST3", "p_val_adj"], 9.178625e-14, tolerance = 1e-19) expect_equal(rownames(x = results)[1], "LYZ") }) test_that("FindMarkers with wilcox_limma works", { skip_on_cran() skip_if_not_installed("limma") markers.0.limma <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, verbose = FALSE, base = exp(1),pseudocount.use = 1,test.use='wilcox_limma')) markers.01.limma <- suppressWarnings(FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1),pseudocount.use = 1,test.use='wilcox_limma')) results.clr.limma <- suppressWarnings(FindMarkers(object = clr.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1,test.use='wilcox_limma')) results.sct.limma <- suppressWarnings(FindMarkers(object = sct.obj, ident.1 = 0, ident.2 = 1, verbose = FALSE, base = exp(1), pseudocount.use = 1,test.use='wilcox_limma')) expect_equal(colnames(x = markers.0.limma), c("p_val", "avg_logFC", "pct.1", "pct.2", "p_val_adj")) expect_equal(markers.0.limma[1, "p_val"], 9.572778e-13, tolerance = 1e-18) expect_equal(markers.0.limma[1, "avg_logFC"], -4.180029, tolerance = 1e-6) expect_equal(markers.0.limma[1, "pct.1"], 0.083) expect_equal(markers.0.limma[1, "pct.2"], 0.909) expect_equal(markers.0.limma[1, "p_val_adj"], 2.201739e-10, tolerance = 1e-15) expect_equal(nrow(x = markers.0.limma), 228) expect_equal(rownames(markers.0.limma)[1], "HLA-DPB1") expect_equal(markers.01.limma[1, "p_val"], 1.702818e-11, tolerance = 1e-16) expect_equal(markers.01.limma[1, "avg_logFC"], -2.638242, tolerance = 1e-6) expect_equal(markers.01.limma[1, "pct.1"], 0.111) expect_equal(markers.01.limma[1, "pct.2"], 1.00) expect_equal(markers.01.limma[1, "p_val_adj"], 3.916481e-09, tolerance = 1e-14) expect_equal(nrow(x = markers.01.limma), 222) expect_equal(rownames(x = markers.01.limma)[1], "TYMP") expect_equal(results.clr.limma[1, "p_val"], 1.209462e-11, tolerance = 1e-16) expect_equal(results.clr.limma[1, "avg_logFC"], -2.946633, tolerance = 1e-6) expect_equal(results.clr.limma[1, "pct.1"], 0.111) expect_equal(results.clr.limma[1, "pct.2"], 0.96) expect_equal(results.clr.limma[1, "p_val_adj"], 2.781762e-09, tolerance = 1e-14) expect_equal(nrow(x = results.clr.limma), 213) expect_equal(rownames(x = results.clr.limma)[1], "S100A8") expect_equal(results.sct.limma[1, "p_val"], 6.225491e-11, tolerance = 1e-16) expect_equal(results.sct.limma[1, "avg_logFC"], -2.545867, tolerance = 1e-6) expect_equal(results.sct.limma[1, "pct.1"], 0.111) expect_equal(results.sct.limma[1, "pct.2"], 0.96) expect_equal(results.sct.limma[1, "p_val_adj"], 1.369608e-08, tolerance = 1e-13) expect_equal(nrow(x = results.sct.limma), 214) expect_equal(rownames(x = results.sct.limma)[1], "TYMP") }) test_that("BPCells FindMarkers gives same results", { skip_on_cran() skip_if_not_installed("BPCells") library(BPCells) library(Matrix) mat_bpcells <- t(as(t(pbmc_small[['RNA']]$counts ), "IterableMatrix")) pbmc_small[['RNAbp']] <- CreateAssay5Object(counts = mat_bpcells) pbmc_small <- NormalizeData(pbmc_small, assay = "RNAbp") markers.bp <- suppressWarnings(FindMarkers(object = pbmc_small, assay = "RNAbp", ident.1 = 0, verbose = FALSE, base = exp(1),pseudocount.use = 1)) expect_equal(colnames(x = markers.bp), c("p_val", "avg_logFC", "pct.1", "pct.2", "p_val_adj")) expect_equal(markers.bp[1, "p_val"], 9.572778e-13) expect_equal(markers.bp[1, "avg_logFC"], -4.180029, tolerance = 1e-6) expect_equal(markers.bp[1, "pct.1"], 0.083) expect_equal(markers.bp[1, "pct.2"], 0.909) expect_equal(markers.bp[1, "p_val_adj"], 2.201739e-10) expect_equal(nrow(x = markers.bp), 228) expect_equal(rownames(markers.bp)[1], "HLA-DPB1") }) # Tests for FindAllMarkers # ------------------------------------------------------------------------------- test_that("FindAllMarkers works as expected", { pbmc_copy <- pbmc_small Idents(pbmc_copy) <- "orig.ident" results <- suppressMessages(suppressWarnings(FindAllMarkers(object = pbmc_small, pseudocount.use = 1))) results.clr <- suppressMessages(suppressWarnings(FindAllMarkers(object = clr.obj, pseudocount.use = 1))) results.sct <- suppressMessages(suppressWarnings(FindAllMarkers(object = sct.obj, pseudocount.use = 1, vst.flavor = "v1"))) results.pseudo <- suppressMessages(suppressWarnings(FindAllMarkers(object = pbmc_small, pseudocount.use = 0.1))) results.gb <- suppressMessages(suppressWarnings(FindAllMarkers(object = pbmc_copy, pseudocount.use = 1, group.by = "RNA_snn_res.1"))) expect_equal(colnames(x = results), c("p_val", "avg_log2FC", "pct.1", "pct.2", "p_val_adj", "cluster", "gene")) expect_equal(results[1, "p_val"], 9.572778e-13, tolerance = 1e-18) expect_equal(results[1, "avg_log2FC"], -6.030507, tolerance = 1e-6) expect_equal(results[1, "pct.1"], 0.083) expect_equal(results[1, "pct.2"], 0.909) expect_equal(results[1, "p_val_adj"], 2.201739e-10, tolerance = 1e-15) expect_equal(nrow(x = results), 222) expect_equal(rownames(results)[1], "HLA-DPB1") # CLR normalization expect_equal(results.clr[1, "p_val"], 1.338858e-12, tolerance = 1e-17) expect_equal(results.clr[1, "avg_log2FC"], -4.088546, tolerance = 1e-6) expect_equal(results.clr[1, "pct.1"], 0.083) expect_equal(results.clr[1, "pct.2"], 0.909) expect_equal(results.clr[1, "p_val_adj"], 3.079373e-10, tolerance = 1e-15) expect_equal(nrow(x = results.clr), 222) expect_equal(rownames(x = results.clr)[1], "HLA-DPB1") # SCT normalization expect_equal(results.sct[1, "p_val"], 4.25861e-12, tolerance = 1e-17) expect_equal(results.sct[1, "avg_log2FC"], -5.088014, tolerance = 1e-6) expect_equal(results.sct[1, "pct.1"], 0.167) expect_equal(results.sct[1, "pct.2"], 0.909) expect_equal(results.sct[1, "p_val_adj"], 9.368941e-10, tolerance = 1e-15) expect_equal(nrow(x = results.sct), 212) expect_equal(rownames(x = results.sct)[1], "HLA-DPB1") # pseudocount.use = 0.1 expect_equal(results.pseudo[1, "p_val"], 9.572778e-13, tolerance = 1e-18) expect_equal(results.pseudo[1, "avg_log2FC"], -6.036353, tolerance = 1e-6) expect_equal(results.pseudo[1, "pct.1"], 0.083) expect_equal(results.pseudo[1, "pct.2"], 0.909) expect_equal(results.pseudo[1, "p_val_adj"], 2.201739e-10, tolerance = 1e-15) expect_equal(nrow(x = results.pseudo), 222) expect_equal(rownames(results.pseudo)[1], "HLA-DPB1") # Setting `group.by` the group by parameter is equivalent # to setting the object's `Idents` before running `FindAllMarkers`. expect_equal(results.gb, results) }) # Tests for running FindMarkers post integration/transfer ref <- pbmc_small ref <- FindVariableFeatures(object = ref, verbose = FALSE, nfeatures = 100) query <- CreateSeuratObject(CreateAssayObject( counts = as.sparse(GetAssayData(object = pbmc_small[['RNA']], layer = "counts") + rpois(n = ncol(pbmc_small), lambda = 1)) )) query2 <- CreateSeuratObject(CreateAssayObject( counts = as.sparse(GetAssayData(object = pbmc_small[['RNA']], layer = "counts")[, 1:40] + rpois(n = ncol(pbmc_small), lambda = 1)) )) query.list <- list(query, query2) query.list <- lapply(X = query.list, FUN = NormalizeData, verbose = FALSE) query.list <- lapply(X = query.list, FUN = FindVariableFeatures, verbose = FALSE, nfeatures = 100) query.list <- lapply(X = query.list, FUN = ScaleData, verbose = FALSE) query.list <- suppressWarnings(lapply(X = query.list, FUN = RunPCA, verbose = FALSE, npcs = 20)) anchors <- suppressMessages(suppressWarnings(FindIntegrationAnchors(object.list = c(ref, query.list), k.filter = NA, verbose = FALSE))) object <- suppressWarnings(suppressMessages(IntegrateData(anchorset = anchors, k.weight = 25, verbose = FALSE))) object <- suppressMessages(ScaleData(object, verbose = FALSE)) object <- suppressMessages(RunPCA(object, verbose = FALSE)) object <- suppressMessages(FindNeighbors(object = object, verbose = FALSE)) object <- suppressMessages(FindClusters(object, verbose = FALSE)) markers <- FindMarkers(object = object, ident.1="0", ident.2="1",pseudocount.use = 1, verbose=FALSE) test_that("FindMarkers recognizes log normalization", { expect_equal(markers[1, "p_val"], 1.598053e-14, tolerance = 1e-19) expect_equal(markers[1, "avg_log2FC"], -2.634458, tolerance = 1e-6) }) test_that("BPCells FindAllMarkers gives same results", { skip_on_cran() skip_if_not_installed("BPCells") library(BPCells) library(Matrix) mat_bpcells <- t(as(t(pbmc_small[['RNA']]$counts ), "IterableMatrix")) pbmc_small[['RNAbp']] <- CreateAssay5Object(counts = mat_bpcells) pbmc_small <- NormalizeData(pbmc_small, assay = "RNAbp") results.bp <- suppressMessages(suppressWarnings(FindAllMarkers(object = pbmc_small, assay = "RNAbp", pseudocount.use=1))) expect_equal(colnames(x = results.bp), c("p_val", "avg_log2FC", "pct.1", "pct.2", "p_val_adj", "cluster", "gene")) expect_equal(results.bp[1, "p_val"], 9.572778e-13) expect_equal(results.bp[1, "avg_log2FC"], -6.030507, tolerance = 1e-6) expect_equal(results.bp[1, "pct.1"], 0.083) expect_equal(results.bp[1, "pct.2"], 0.909) expect_equal(results.bp[1, "p_val_adj"], 2.201739e-10) expect_equal(nrow(x = results.bp), 222) expect_equal(rownames(results.bp)[1], "HLA-DPB1") }) # Tests for FindConservedMarkers # ------------------------------------------------------------------------------- if (requireNamespace('metap', quietly = TRUE)) { context("FindConservedMarkers") pbmc_small$groups markers <- suppressWarnings(FindConservedMarkers(object = pbmc_small, ident.1 = 0, grouping.var = "groups", verbose = FALSE, base = exp(1), pseudocount.use = 1)) standard.names <- c("p_val", "avg_logFC", "pct.1", "pct.2", "p_val_adj") test_that("FindConservedMarkers works", { expect_equal(colnames(x = markers), c(paste0("g2_", standard.names), paste0("g1_", standard.names), "max_pval", "minimump_p_val")) expect_equal(markers[1, "g2_p_val"], 4.983576e-05) expect_equal(markers[1, "g2_avg_logFC"], -4.364959, tolerance = 1e-6) # expect_equal(markers[1, "g2_pct.1"], 0.062) expect_equal(markers[1, "g2_pct.2"], 0.75) expect_equal(markers[1, "g2_p_val_adj"], 0.0114622238) expect_equal(markers[1, "g1_p_val"], 3.946643e-08, tolerance = 1e-13) expect_equal(markers[1, "g1_avg_logFC"], -3.69215, tolerance = 1e-6) expect_equal(markers[1, "g1_pct.1"], 0.10) expect_equal(markers[1, "g1_pct.2"], 0.958) expect_equal(markers[1, "g1_p_val_adj"], 9.077279e-06) expect_equal(markers[1, "max_pval"], 4.983576e-05) expect_equal(markers[1, "minimump_p_val"], 7.893286e-08, tolerance = 1e-13) expect_equal(nrow(markers), 219) expect_equal(rownames(markers)[1], "HLA-DRB1") expect_equal(markers[, "max_pval"], unname(obj = apply(X = markers, MARGIN = 1, FUN = function(x) max(x[c("g1_p_val", "g2_p_val")])))) }) test_that("FindConservedMarkers errors when expected", { expect_error(FindConservedMarkers(pbmc_small)) expect_error(FindConservedMarkers(pbmc_small, ident.1 = 0)) expect_error(FindConservedMarkers(pbmc_small, ident.1 = 0, grouping.var = "groups", meta.method = "minimump")) }) pbmc.test <- pbmc_small Idents(object = pbmc.test) <- "RNA_snn_res.1" pbmc.test$id.group <- paste0(pbmc.test$RNA_snn_res.1, "_", pbmc.test$groups) pbmc.test <- subset(x = pbmc.test, id.group == "0_g1", invert = TRUE) markers.missing <- suppressWarnings(FindConservedMarkers(object = pbmc.test, ident.1 = 0, grouping.var = "groups", test.use = "t", verbose = FALSE, base = exp(1), pseudocount.use = 1)) test_that("FindConservedMarkers handles missing idents in certain groups", { expect_warning(FindConservedMarkers(object = pbmc.test, ident.1 = 0, grouping.var = "groups", test.use = "t")) expect_equal(colnames(x = markers.missing), paste0("g2_", standard.names)) expect_equal(markers.missing[1, "g2_p_val"], 1.672911e-13, tolerance = 1e-18) expect_equal(markers.missing[1, "g2_avg_logFC"], -4.796379, tolerance = 1e-6) # expect_equal(markers.missing[1, "g2_pct.1"], 0.062) expect_equal(markers.missing[1, "g2_pct.2"], 0.95) expect_equal(markers.missing[1, "g2_p_val_adj"], 3.847695e-11, tolerance = 1e-16) expect_equal(nrow(markers.missing), 226) expect_equal(rownames(markers.missing)[1], "HLA-DPB1") }) } Seurat/tests/testthat/test_utilities.R0000644000176200001440000002257314731050553017730 0ustar liggesusersset.seed(42) pbmc.file <- system.file('extdata', 'pbmc_raw.txt', package = 'Seurat') pbmc.test <- as.sparse(x = as.matrix(read.table(pbmc.file, sep = "\t", row.names = 1))) meta.data <- data.frame( a = rep(as.factor(c('a', 'b', 'c')), length.out = ncol(pbmc.test)), row.names = colnames(pbmc.test) ) object <- CreateSeuratObject( counts = pbmc.test, min.cells = 10, min.features = 30, meta.data = meta.data ) object <- NormalizeData(object) object <- SetIdent(object, value = 'a') group.by = "a" data <- FetchData(object = object, vars = rev(x = group.by)) data <- data[which(rowSums(x = is.na(x = data)) == 0), , drop = F] category.matrix.avg <- CreateCategoryMatrix(labels = data, method = 'average') category.matrix.sum <- CreateCategoryMatrix(labels = data, method = 'aggregate') test_that("CreateCategoryMatrix works for average and aggregate", { expect_equal(unname(colSums(category.matrix.avg)), c(1, 1, 1)) expect_equal(unname(colSums(category.matrix.sum)), c(27, 26, 24)) }) test_that("AverageExpression works for different layers", { #average expression on data layer is equal to log of average exponentiated data suppressWarnings(average.expression <- AverageExpression(object, layer = 'data')$RNA) counts.from.data.avg <- expm1(object[['RNA']]$data) %*% category.matrix.avg expect_equivalent( log1p(counts.from.data.avg), average.expression, tolerance = 1e-6 ) #average expression on counts layer is equal to average of counts suppressWarnings(average.counts <- AverageExpression(object, layer = 'counts')$RNA) avg.counts <- object[['RNA']]$data %*% category.matrix.avg expect_equivalent( avg.counts, average.counts, tolerance = 1e-6 ) #average expression on scale.data layer is equal to average of scale.data object <- ScaleData(object, features = rownames(object[['RNA']]$data)) suppressWarnings(average.scale.data <- AverageExpression(object, layer = 'scale.data')$RNA) avg.scale <- object[['RNA']]$scale.data %*% category.matrix.avg expect_equivalent( average.scale.data, avg.scale, tolerance = 1e-6 ) }) test_that("AverageExpression handles features properly", { features <- rownames(x = object)[1:10] # check that the average expression is calcualted for the specifed features average.expression <- AverageExpression( object, layer = "data", features = features )$RNA expect_equal(rownames(x = average.expression), features) # check that an error is raised if none of the specified features are present expect_warning(AverageExpression(object, layer = 'data', features = "BAD")) # check that an error is raised if any of the features are missing expect_warning( AverageExpression( object, layer = "data", features = c(features, "BAD") ) ) # check that features can be specified as a simple vector even when # `layer="scale.data"` and `return.seurat=TRUE` object <- ScaleData(object = object, verbose = FALSE) avg.scale <- AverageExpression( object, layer = "scale.data", return.seurat = TRUE, features = features, verbose = FALSE )$RNA expect_equal(rownames(avg.scale), features) }) test_that("AverageExpression with return.seurat", { # counts avg.counts <- AverageExpression(object, layer = "counts", return.seurat = TRUE, verbose = FALSE) avg.counts.calc <- object[['RNA']]$counts %*% category.matrix.avg #test that counts are indeed equal to average counts expect_equivalent( as.matrix(avg.counts[['RNA']]$counts), as.matrix(avg.counts.calc), tolerance = 1e-6 ) expect_s4_class(object = avg.counts, "Seurat") avg.counts.mat <- AverageExpression(object, layer = 'counts')$RNA expect_equal(unname(as.matrix(LayerData(avg.counts[["RNA"]], layer = "counts"))), unname(as.matrix(avg.counts.mat))) avg.data <- LayerData(avg.counts[["RNA"]], layer = "data") #test that data returned is log1p of average counts expect_equivalent( as.matrix(log1p(avg.counts.mat)), as.matrix(avg.data), tolerance = 1e-6 ) #test that scale.data returned is scaled data avg.scale <- LayerData(avg.counts[["RNA"]], layer = "scale.data") expect_equal( avg.scale, ScaleData(avg.counts)[['RNA']]$scale.data, tolerance = 1e-6 ) # data avg.data <- AverageExpression(object, layer = "data", return.seurat = TRUE, verbose = FALSE) expect_s4_class(object = avg.data, "Seurat") avg.data.mat <- AverageExpression(object, layer = 'data')$RNA expect_equal(unname(as.matrix(LayerData(avg.data[["RNA"]], layer = "counts"))), unname(as.matrix(avg.data.mat))) expect_equal(unname(as.matrix(LayerData(avg.data[["RNA"]], layer = "data"))), as.matrix(unname(log1p(x = avg.data.mat)))) avg.scale <- LayerData(avg.data[["RNA"]], layer = "scale.data") expect_equal( avg.scale['MS4A1', ], c(a = -0.07823997, b = 1.0368218, c = -0.9585818), tolerance = 1e-6 ) expect_equal( avg.scale['SPON2', ], c(a = 0.1213127, b = 0.9338096, c = -1.0551222), tolerance = 1e-6 ) # scale.data object <- ScaleData(object = object, verbose = FALSE) avg.scale <- AverageExpression(object, layer = "scale.data", return.seurat = TRUE, verbose = FALSE) expect_s4_class(object = avg.scale, "Seurat") avg.scale.mat <- AverageExpression(object, layer = 'scale.data')$RNA expect_equal(unname(as.matrix(LayerData(avg.scale[["RNA"]], layer = "scale.data"))), unname(as.matrix(avg.scale.mat))) }) test.dat <- LayerData(object = object, layer = "data") rownames(x = test.dat) <- paste0("test-", rownames(x = test.dat)) suppressWarnings(object[["TEST"]] <- CreateAssayObject(data = test.dat)) test_that("AverageExpression with multiple assays", { avg.test <- AverageExpression(object = object, assays = "TEST", layer = "data") expect_equal(names(x = avg.test), "TEST") expect_equal(length(x = avg.test), 1) expect_equivalent( avg.test[[1]]['test-KHDRBS1', 1:3], c(a = 10.329153, b = 92.287109, c = 5.620942), tolerance = 1e-6 ) expect_equivalent( avg.test[[1]]['test-DNAJB1', 1:3] , c(a = 42.32240, b = 15.94807, c = 15.96319), tolerance = 1e-6 ) avg.all <- AverageExpression(object = object, layer = "data") expect_equal(names(x = avg.all), c("RNA", "TEST")) expect_equal(length(x = avg.all), 2) }) meta.data.2 <- data.frame( b = rep(as.factor(c('c', 'd', 'e')), length.out = ncol(pbmc.test)), row.names = colnames(pbmc.test) ) object <- AddMetaData(object, meta.data.2) if(class(object[['RNA']]) == "Assay5") { test_that("AggregateExpression works with multiple layers", { object.split <- split(object, f = object$b) aggregate.split <- AggregateExpression(object.split, assay = "RNA") aggregate <- AggregateExpression(object, assay = "RNA") expect_equivalent( aggregate.split$RNA, aggregate$RNA, tolerance = 1e-6 ) avg.split <- AverageExpression(object.split, assay = "RNA") avg <- AverageExpression(object, assay = "RNA") expect_equivalent( avg.split$RNA, avg$RNA, tolerance = 1e-6 ) }) } test_that("PercentAbove works as expected", { vals <- c(1, 1, 2, 2, NA) expect_equal(PercentAbove(vals, threshold = 1), 0.4) }) context("BuildNicheAssay") test_that("BuildNicheAssay works as expected", { test.data <- pbmc_small # generate fake coordinates arranging the cells from pbmc_small into a grid test.coordinates <- data.frame( cell = Cells(test.data), x = rep(1:4, times = 20), y = rep(1:4, each = 20) ) # associate the coordinates and counts with a FOV fov <- CreateFOV( test.coordinates, type = "centroids", assay = "RNA" ) test.data[["fov"]] <- fov # dividing the grid into 4 along each axis creates 16 regions - label # each cell with the region containing it's x, y position x.regions <- cut(test.coordinates[["x"]], breaks = 4, labels = FALSE) y.regions <- cut(test.coordinates[["y"]], breaks = 4, labels = FALSE) test.data[["test_labels"]] <- ((y.regions - 1) * 4 + x.regions) results <- BuildNicheAssay( test.data, fov = "fov", group.by = "test_labels", assay = "niche", cluster.name = "niches" ) # the new niche assay should contain the same number of cells as the input # and a feature for each unique label from the specified `group.by` variable expect_equal( c(16, ncol(test.data[["RNA"]])), dim(results[["niche"]]) ) # exaclty a quarter of the cells should be assigned to each niche for (niche in 1:4) { expect_equal( 20, length(results[["niches"]][results[["niches"]]["niches"] == niche]) ) } }) test_that("BuildNicheAssay works with FOV and VisiumV2 instances", { skip_if_not_installed("hdf5r") path.to.data = file.path("../testdata/visium") test.case <- Load10X_Spatial( path.to.data, assay = "Spatial", slice = "slice" ) # populate a meta.data column with random labels random_labels <- sample(1:3, size = ncol(test.case), replace = TRUE) test.case[["random_labels"]] <- random_labels fov <- CreateFOV( GetTissueCoordinates(test.case[["slice"]]), type = "centroids", radius = Radius(test.case[["slice"]]), assay = "Spatial", key = "fov" ) test.case[["fov"]] <- fov left <- BuildNicheAssay( test.case, fov = "fov", group.by = "random_labels" ) right <- BuildNicheAssay( test.case, fov = "fov", group.by = "random_labels" ) expect_equal( LayerData(left, layer = "scale.data"), LayerData(left, layer = "scale.data") ) }) Seurat/tests/testthat/test_find_clusters.R0000644000176200001440000000415714744464264020573 0ustar liggesuserspath_to_counts <- system.file("extdata", "pbmc_raw.txt", package = "Seurat") # Builds a `Seurat` instance and annotates it with the requisite data # structures for running `FindClusters` (i.e. a shared-nearest-neighbor # (SNN) graph). get_test_data <- function() { raw_counts <- read.table(path_to_counts, sep = "\t", row.names = 1) counts <- as.sparse(as.matrix(raw_counts)) assay <- CreateAssay5Object(counts) test_data <- CreateSeuratObject(assay) test_data <- NormalizeData(test_data, verbose = FALSE) test_data <- FindVariableFeatures(test_data, verbose = FALSE) test_data <- ScaleData(test_data, verbose = FALSE) # Reduce number of PCs to avoid warning from `irlba` caused by the # small size of the dataset being used. Plus, we only want to build our # SNN graph using the first 10 PCs to get "interesting" clustering results. test_data <- RunPCA(test_data, npcs = 10, verbose = FALSE) test_data <- FindNeighbors( test_data, k.param=10, dims = 1:10, verbose = FALSE ) return(test_data) } context("FindClusters") test_that("Smoke test for `FindClusters`", { test_case <- get_test_data() # Validate cluster assignments using default parameters. results <- FindClusters(test_case)$seurat_clusters # Check that every cell was assigned to a cluster label. expect_false(any(is.na(results))) # Check that the expected cluster labels were assigned. expect_equal(as.numeric(levels(results)), c(0, 1, 2, 3, 4, 5)) # Check that the cluster sizes match the expected distribution. expect_equal( as.numeric(sort(table(results))), c(9, 10, 10, 11, 20, 20) ) # Check that every clustering algorithm can be run without errors. expect_no_error(FindClusters(test_case, algorithm = 1)) expect_no_error(FindClusters(test_case, algorithm = 2)) expect_no_error(FindClusters(test_case, algorithm = 3)) # The leiden algorithm requires that `random.seed` be greater than 0, # which is the default for `FindClusters` so a warning should be raised. expect_warning(FindClusters(test_case, algorithm = 4)) expect_no_warning(FindClusters(test_case, algorithm = 4, random.seed = 1)) }) Seurat/tests/testthat/test_sketching.R0000644000176200001440000001447614741546375017714 0ustar liggesusers# setup shared test fixtures path_to_counts <- system.file("extdata", "pbmc_raw.txt", package = "Seurat") build_test_data <- function(multi_layer = FALSE) { counts <- read.table(path_to_counts, sep = "\t", row.names = 1) counts <- as.sparse(as.matrix(counts)) if (multi_layer) { barcodes <- colnames(counts) counts.layer1 <- counts colnames(counts.layer1) <- paste0(barcodes, "_layer1") counts.layer2 <- counts colnames(counts.layer1) <- paste0(barcodes, "_layer2") counts_layers <- c( counts.layer1 = counts.layer1, counts.layer2 = counts.layer2 ) test_data <- CreateSeuratObject(counts_layers) } else{ test_data <- CreateSeuratObject(counts) } test_data <- NormalizeData(test_data, verbose = FALSE) test_data <- FindVariableFeatures(test_data, verbose = FALSE) return (test_data) } context("SketchData") test_that("SketchData defaults work", { test_case <- build_test_data() result <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = 50, method = "LeverageScore", sketched.assay = "sketch", set.seed = 42 ) ) expect_equal( dim(result[["sketch"]]), c(230, 50) ) expect_equal( as.numeric(result$leverage.score[1]), 0.9036446, tolerance = 1e-5 ) expect_equal( colnames(result[["sketch"]])[1], "ATGCCAGAACGACT" ) result_2 <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = c("data" = 50), method = "LeverageScore", sketched.assay = "sketch" ) ) expect_equal( dim(result_2[["sketch"]]), dim(result[["sketch"]]) ) expect_equal( as.numeric(result_2$leverage.score[1]), as.numeric(result$leverage.score[1]), tolerance = 1e-6 ) expect_equal( colnames(result_2[["sketch"]])[1], colnames(result[["sketch"]])[1] ) }) test_that("SketchData with multiple layers works", { # (and one is less than the number of cells in that layer) test_case <- build_test_data(multi_layer = TRUE) result <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = 80, method = "LeverageScore", sketched.assay = "sketch", set.seed = 42 ) ) expect_equal( dim(result[["sketch"]]$data.layer1), c(230, 80) ) expect_equal( dim(result[["sketch"]]$data.layer2), c(230, 80) ) expect_equal( as.numeric(result$leverage.score[1]), 0.9036446, tolerance = 1e-6 ) expect_equal( colnames(result[["sketch"]])[1], "ATGCCAGAACGACT_layer2" ) }) test_that("SketchData with a different number of cells per layer works", { test_case <- build_test_data(multi_layer = TRUE) result <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = c(50, 30), method = "LeverageScore", sketched.assay = "sketch", set.seed = 42 ) ) expect_equal( dim(result[["sketch"]]$data.layer1), c(230, 50) ) expect_equal( dim(result[["sketch"]]$data.layer2), c(230, 30) ) expect_equal( as.numeric(result$leverage.score[1]), 0.9036446, tolerance = 1e-5 ) expect_equal( colnames(result[["sketch"]])[1], "ATGCCAGAACGACT_layer2" ) result_2 <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = c("data.layer1" = 50, "data.layer2" = 30), method = "LeverageScore", sketched.assay = "sketch", set.seed = 42 ) ) expect_equal( dim(result_2[["sketch"]]$data.layer1), dim(result[["sketch"]]$data.layer1) ) expect_equal( dim(result_2[["sketch"]]$data.layer2), dim(result[["sketch"]]$data.layer2) ) expect_equal( as.numeric(result_2$leverage.score[1]), as.numeric(result$leverage.score[1]), tolerance = 1e-5 ) expect_equal( colnames(result_2[["sketch"]])[1], colnames(result[["sketch"]])[1] ) }) test_that("SketchData with specified features works", { test_case <- build_test_data() result <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = 50, method = "LeverageScore", sketched.assay = "sketch", features = VariableFeatures(test_case)[1:100] ) ) expect_equal( dim(result[["sketch"]]), c(230, 50) ) expect_equal( as.numeric(result$leverage.score[1]), 0.7202897, tolerance = 1e-6 ) expect_equal( colnames(result[["sketch"]])[1], "ATGCCAGAACGACT" ) }) test_that("SketchData with specified features and multiple layers works", { test_case <- build_test_data(multi_layer = TRUE) result <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = c(50, 30), method = "LeverageScore", sketched.assay = "sketch", features = VariableFeatures(test_case)[1:100], set.seed = 42 ) ) expect_equal( dim(result[["sketch"]]$data.layer1), c(230, 50) ) expect_equal( dim(result[["sketch"]]$data.layer2), c(230, 30) ) expect_equal( as.numeric(result$leverage.score[1]), 0.7202896, tolerance = 1e-6 ) expect_equal( colnames(result[["sketch"]])[1], "ATGCCAGAACGACT_layer2" ) }) test_that("SketchData when setting your own variable features and specifying features works", { test_case <- build_test_data() top_features <- VariableFeatures(test_case)[1:100] VariableFeatures(test_case) <- top_features result <- suppressWarnings( SketchData( test_case, assay = "RNA", ncells = 50, method = "LeverageScore", sketched.assay = "sketch", features = top_features, set.seed = 42 ) ) expect_equal( dim(result[["sketch"]]), c(230,50) ) expect_equal( as.numeric(result$leverage.score[1]), 0.7202896, tolerance = 1e-6 ) expect_equal( colnames(result[["sketch"]])[1], "ATGCCAGAACGACT" ) }) test_that("SketchData when setting your own variable features and not specifying features errors out", { test_case <- build_test_data() top_features <- VariableFeatures(test_case)[1:100] VariableFeatures(test_case) <- top_features expect_error( suppressWarnings( SketchData( pbmc_new, assay = "RNA", ncells = 50, method = "LeverageScore", sketched.assay = "sketch" ) ) ) }) Seurat/tests/testthat/test_tree.R0000644000176200001440000000427714731050553016655 0ustar liggesusersPATH_TO_DATA <- system.file("extdata", "pbmc_raw.txt", package = "Seurat") TOLERANCE = 1.0e-4 setup_test_data <- function(cluster_resolution) { counts <- as.sparse( as.matrix(read.table(PATH_TO_DATA, sep = "\t", row.names = 1)) ) test.data <- CreateSeuratObject(counts) test.data <- NormalizeData(test.data) test.data <- FindVariableFeatures(test.data) test.data <- ScaleData(test.data) test.data <- RunPCA(test.data, npcs = 20) test.data <- FindNeighbors(test.data, dims = 1:20) test.data <- FindClusters(test.data, resolution = cluster_resolution) return(test.data) } context("BuildClusterTree") test_that("BuildClusterTree works as expected", { skip_if_not_installed("ape") # TODO: this test doesn't really check that the phylogenic trees being # generated are biologically valid but that would be more useful # for testing purposes we'll over-cluster our dataset to introduce # some structure into the resulting phylogeny test_case <- setup_test_data(cluster_resolution = 5) result <- BuildClusterTree(test_case, slot = "counts") tree <- Tool(result, slot = "BuildClusterTree") # check that the tree contains the expected number of leaf nodes expect_equal(length(tree$tip.label), 6) # check that the tree contains the expected number of edges expect_equal(length(tree$edge), 20) # spot check a few edge lengths expect_equal(tree$edge.length[[1]], 1127.60199, tolerance = TOLERANCE) expect_equal(tree$edge.length[[5]], 182.42944, tolerance = TOLERANCE) expect_equal(tree$edge.length[[10]], 59.24525, tolerance = TOLERANCE) result <- BuildClusterTree(test_case, slot = "data") tree <- Tool(result, slot = "BuildClusterTree") # check that the tree contains the expected number of leaf nodes expect_equal(length(tree$tip.label), 6) # check that the tree contains the expected number of edges expect_equal(length(tree$edge), 20) # spot check a few edge lengths expect_equal(tree$edge.length[[1]], 1206.4312, tolerance = TOLERANCE) expect_equal(tree$edge.length[[5]], 657.0097, tolerance = TOLERANCE) expect_equal(tree$edge.length[[10]], 982.9843, tolerance = TOLERANCE) }) Seurat/tests/testthat/test_integration5.R0000644000176200001440000003415414744456127020336 0ustar liggesusers# Tests for IntegrateLayers set.seed(42) # checks that the absolute value of `x` and `y` are within `tolerance` expect_abs_equal <- function(x, y, tolerance = 1.0e-04) { expect_equal(abs(x), abs(y), tolerance = tolerance) } # setup shared fixtures # update `pbmc_small` to use `Assay5` instances test.data <- pbmc_small suppressWarnings( test.data[["RNA"]] <- CreateAssay5Object( counts = LayerData( test.data, assay = "RNA", layer = "counts" ) ) ) # split the assay into multiple layers test.data[["RNA"]] <- split(test.data[["RNA"]], f = test.data$groups) context("IntegrateLayers") # setup fixtures for standard integration workflow test.data.std <- NormalizeData(test.data, verbose = FALSE) test.data.std <- FindVariableFeatures(test.data.std, verbose = FALSE) test.data.std <- ScaleData(test.data.std, verbose = FALSE) test.data.std <- suppressWarnings( RunPCA(test.data.std, verbose = FALSE) ) test_that("IntegrateLayers works with HarmonyIntegration", { skip_on_cran() skip_if_not_installed("harmony") integrated <- suppressWarnings( IntegrateLayers( test.data.std, method = HarmonyIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 0.3912 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 0.6668 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.7248 ) }) test_that("IntegrateLayers works with CCAIntegration", { integrated <- suppressWarnings( IntegrateLayers( test.data.std, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10 ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 0.9174 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 1.4885 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.5442 ) integrated_sub <- suppressWarnings( IntegrateLayers( test.data.std, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, dims.to.integrate = 1:10 ) ) # check that the integrated reduction has the specified number of # `dims.to.integrate` expect_equal(ncol(integrated_sub[["integrated"]]), 10) integrated_overflow <- suppressWarnings( IntegrateLayers( test.data.std, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, dims.to.integrate = 1:100 ) ) # check that the integrated reduction is the same as you'd get if you # didn't specify `dims.to.integrate` (i.e. the same size as the initial # reduction) expect_equal(Embeddings(integrated_overflow), Embeddings(integrated)) }) test_that("IntegrateLayers works with RPCAIntegration", { integrated <- suppressWarnings( IntegrateLayers( test.data.std, method = RPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10 ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 0.1785 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 0.5832 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.5442 ) # check that the integrated reduction has the specified number of # `dims.to.integrate` integrated_sub <- suppressWarnings( IntegrateLayers( test.data.std, method = RPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, dims.to.integrate = 1:10 ) ) # check that dims.to.integrate is not being overwritten expect_equal(ncol(integrated_sub[["integrated"]]), 10) integrated_overflow <- suppressWarnings( IntegrateLayers( test.data.std, method = RPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, dims.to.integrate = 1:100 ) ) # check that the integrated reduction is the same as you'd get if you # didn't specify `dims.to.integrate` (i.e. the same size as the initial # reduction) expect_equal(Embeddings(integrated_overflow), Embeddings(integrated)) }) test_that("IntegrateLayers works with JointPCAIntegration", { integrated <- suppressWarnings( IntegrateLayers( test.data.std, method = JointPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10 ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 0.4092 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 0.3246 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.5442 ) # check that the integrated reduction has the specified number of # `dims.to.integrate` integrated_sub <- suppressWarnings( IntegrateLayers( test.data.std, method = JointPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, dims.to.integrate = 1:10 ) ) # check that dims.to.integrate is not being overwritten expect_equal(ncol(integrated_sub[["integrated"]]), 10) integrated_overflow <- suppressWarnings( IntegrateLayers( test.data.std, method = JointPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, dims.to.integrate = 1:100 ) ) # check that the integrated reduction is the same as you'd get if you # didn't specify `dims.to.integrate` (i.e. the same size as the initial # reduction) expect_equal(Embeddings(integrated_overflow), Embeddings(integrated)) }) test_that("IntegrateLayers fails when expected", { # an error should be raised if a v3 assay is passed in expect_error( IntegrateLayers( pbmc_small, method = CCAIntegration, orig.reduction = "pca", assay = "RNA", new.reduction = "integrated" ) ) # an error should be raised if a nonexistent `assay` is specified expect_error( IntegrateLayers( test.data.std, method = CCAIntegration, orig.reduction = "pca", assay = "DNA", new.reduction = "integrated" ) ) # an error should be raised if a nonexistent `orig.reduction` is specified expect_error( IntegrateLayers( test.data.std, method = CCAIntegration, orig.reduction = "lda", new.reduction = "integrated" ) ) }) context("IntegrateData with SCTransform") # setup fixtures for SCTransform workflow test.data.sct <- suppressWarnings( SCTransform( test.data, # use v1 to avoid potentially different # return values depending on if `glmGamPoi` # is installed or not vst.flavor="v1", # set seed for reproducibility seed.use = 12345, verbose = FALSE ) ) test.data.sct <- suppressWarnings( RunPCA(test.data.sct, verbose = FALSE) ) test_that("IntegrateLayers works with HarmonyIntegration & SCTransform", { skip_on_cran() skip_if_not_installed("harmony") integrated <- suppressWarnings( IntegrateLayers( test.data.sct, method = HarmonyIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 1.1520 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 1.0302 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.1886 ) }) test_that("IntegrateLayers works with CCAIntegration & SCTransform", { integrated <- suppressWarnings( IntegrateLayers( test.data.sct, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, # `CCAIntegration` needs to know how the data was normalized normalization.method = "SCT" ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 1.6113 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 0.6927 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.0855 ) }) test_that("IntegrateLayers works with RPCAIntegration & SCTransform", { integrated <- suppressWarnings( IntegrateLayers( test.data.sct, method = RPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, # `RPCAIntegration` needs to know how the data was normalized normalization.method = "SCT" ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 1.6492 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 0.7343 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.0855 ) }) test_that("IntegrateLayers works with JointPCAIntegration & SCTransform", { integrated <- suppressWarnings( IntegrateLayers( test.data.sct, method = JointPCAIntegration, orig.reduction = "pca", new.reduction = "integrated", verbose = FALSE, # since `k.weight` must be less than the number of samples in the # smallest layer being integrated, it must be set to accommodate the # small dataset used for testing k.weight = 10, # `JointPCAIntegration` needs to know how the data was normalized normalization.method = "SCT" ) ) # the integrated reduction should have the same dimensions as the original expect_equal(dim(integrated[["integrated"]]), dim(integrated[["pca"]])) # spot-check a few of the integrated values - since the integrated # reductions sporadically flip sign only compare absolute values expect_abs_equal( Embeddings(integrated[["integrated"]])[5, 5], 0.3427 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[40, 25], 0.1015 ) expect_abs_equal( Embeddings(integrated[["integrated"]])[75, 45], 0.0855 ) }) Seurat/tests/testthat/test_read_mtx.R0000644000176200001440000000275414670622051017517 0ustar liggesuserscontext("ReadMtx") test_that("skip.cell and skip.feature work", { skip_on_cran() mtx <- "ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE126nnn/GSE126836/suppl/GSE126836_SN_MD5828_matrix.mtx.gz" features <- "ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE126nnn/GSE126836/suppl/GSE126836_SN_MD5828_genes.csv.gz" cells <- "ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE126nnn/GSE126836/suppl/GSE126836_SN_MD5828_barcodes.csv.gz" counts1 <- ReadMtx(mtx = mtx, cells = cells, features = features, feature.column = 1, skip.cell = 1, skip.feature = 1) expect_is(counts1, "dgCMatrix") expect_equal(ncol(counts1), 1436) expect_equal(nrow(counts1), 29445) expect_equal(colnames(counts1)[5], "MD5828a_GGGCATCCAATGAAAC-1") expect_equal(rownames(counts1)[2], "A1BG-AS1") }) test_that("ReadMtx works", { skip_on_cran() mtx <- "https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSE127774&format=file&file=GSE127774%5FACC%5FB%5Fmatrix%2Emtx%2Egz" cells <- "https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSE127774&format=file&file=GSE127774%5FACC%5FB%5Fbarcodes%2Etsv%2Egz" features <- "https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSE127774&format=file&file=GSE127774%5FACC%5FB%5Fgenes%2Etsv%2Egz" counts2 <- ReadMtx(mtx = mtx, cells = cells, features = features, feature.column = 1) expect_is(counts2, "dgCMatrix") expect_equal(ncol(counts2), 22063) expect_equal(nrow(counts2), 22530) expect_equal(colnames(counts2)[1], "AAACCTGAGCAATCTC-1") expect_equal(rownames(counts2)[2], "ENSPPAG00000040697") }) Seurat/tests/testthat/test_dimensional_reduction.R0000644000176200001440000000464614730606211022271 0ustar liggesuserscontext("test-dimensional_reduction") set.seed(seed = 1) dummyexpMat <- matrix( data = sample(x = c(1:50), size = 1e4, replace = TRUE), ncol = 100, nrow = 100 ) colnames(x = dummyexpMat) <- paste0("cell", seq(ncol(x = dummyexpMat))) row.names(x = dummyexpMat) <- paste0("gene", seq(nrow(x = dummyexpMat))) # Create Seurat object for testing obj <- CreateSeuratObject(counts = as.sparse(dummyexpMat)) test_that("different ways of passing distance matrix", { # Manually make a distance object to test distMat <- dist(t(dummyexpMat)) expect_equivalent( suppressWarnings(expr = RunTSNE(obj, distance.matrix = distMat)), suppressWarnings(expr = RunTSNE(obj, distance.matrix = as.matrix(distMat))) ) expect_equivalent( suppressWarnings(expr = RunTSNE(obj, distance.matrix = distMat)@reductions$tsne), suppressWarnings(expr = RunTSNE(distMat, assay = "RNA")) ) expect_equivalent( suppressWarnings(expr = RunTSNE(obj, distance.matrix = distMat)@reductions$tsne), suppressWarnings(expr = RunTSNE(as.matrix(distMat), assay = "RNA", is_distance = TRUE)) ) }) # Normalize, scale, and compute PCA, using RunPCA obj <- NormalizeData(object = obj, verbose = FALSE) obj <- ScaleData(object = obj, verbose = FALSE) pca_result <- suppressWarnings(expr = RunPCA( object = obj, features = rownames(obj[['RNA']]$counts), verbose = FALSE )) test_that("pca returns total variance (see #982)", { # Using stats::prcomp scaled_data <- LayerData(object = obj, layer = "scale.data") prcomp_result <- stats::prcomp(scaled_data, center = FALSE, scale. = FALSE) # Compare expect_equivalent(slot(object = pca_result[["pca"]], name = "misc")$total.variance, sum(prcomp_result$sdev^2)) }) test_that("pca is equivalent for BPCells", { skip_on_cran() skip_if_not_installed("BPCells") library(BPCells) library(Matrix) mat_bpcells <- t(x = as(object = t(x = obj[['RNA']]$counts ), Class = "IterableMatrix")) obj[['RNAbp']] <- CreateAssay5Object(counts = mat_bpcells) DefaultAssay(obj) <- "RNAbp" obj <- NormalizeData(object = obj, verbose = FALSE) obj <- ScaleData(object = obj, verbose=FALSE) pca_result_bp <- suppressWarnings(expr = RunPCA( object = obj, features = rownames(obj[['RNAbp']]$counts), assay = "RNAbp")) expect_equivalent(abs(pca_result_bp[['pca']]@cell.embeddings), abs(pca_result[['pca']]@cell.embeddings), tolerance = 1e-5) }) Seurat/tests/testthat.R0000644000176200001440000000043714730427000014643 0ustar liggesuserslibrary(testthat) library(Seurat) # # # Run tests for 'v3' # message('Run tests for v3 assay') # options(Seurat.object.assay.version = 'v3') # test_check("Seurat") # Run tests for 'v5' message('Run tests for v5 assay') options(Seurat.object.assay.version = 'v5') test_check("Seurat") Seurat/tests/testdata/0000755000176200001440000000000014731050553014473 5ustar liggesusersSeurat/tests/testdata/genes.tsv0000644000176200001440000001005414670622051016332 0ustar liggesusersENSGXXXXXX MS4A1 ENSGXXXXXX CD79B ENSGXXXXXX CD79A ENSGXXXXXX HLA-DRA ENSGXXXXXX TCL1A ENSGXXXXXX HLA-DQB1 ENSGXXXXXX HVCN1 ENSGXXXXXX HLA-DMB ENSGXXXXXX LTB ENSGXXXXXX LINC00926 ENSGXXXXXX FCER2 ENSGXXXXXX SP100 ENSGXXXXXX NCF1 ENSGXXXXXX PPP3CC ENSGXXXXXX EAF2 ENSGXXXXXX PPAPDC1B ENSGXXXXXX CD19 ENSGXXXXXX KIAA0125 ENSGXXXXXX CYB561A3 ENSGXXXXXX CD180 ENSGXXXXXX RP11-693J15.5 ENSGXXXXXX FAM96A ENSGXXXXXX CXCR4 ENSGXXXXXX STX10 ENSGXXXXXX SNHG7 ENSGXXXXXX NT5C ENSGXXXXXX BANK1 ENSGXXXXXX IGLL5 ENSGXXXXXX CD200 ENSGXXXXXX FCRLA ENSGXXXXXX CD3D ENSGXXXXXX NOSIP ENSGXXXXXX LTB ENSGXXXXXX SAFB2 ENSGXXXXXX CD2 ENSGXXXXXX IL7R ENSGXXXXXX PIK3IP1 ENSGXXXXXX MPHOSPH6 ENSGXXXXXX KHDRBS1 ENSGXXXXXX MAL ENSGXXXXXX CCR7 ENSGXXXXXX THYN1 ENSGXXXXXX TAF7 ENSGXXXXXX LDHB ENSGXXXXXX TMEM123 ENSGXXXXXX CCDC104 ENSGXXXXXX EPC1 ENSGXXXXXX EIF4A2 ENSGXXXXXX CD3E ENSGXXXXXX TMUB1 ENSGXXXXXX BLOC1S4 ENSGXXXXXX ACSM3 ENSGXXXXXX TMEM204 ENSGXXXXXX SRSF7 ENSGXXXXXX ACAP1 ENSGXXXXXX TNFAIP8 ENSGXXXXXX CD7 ENSGXXXXXX TAGAP ENSGXXXXXX DNAJB1 ENSGXXXXXX ASNSD1 ENSGXXXXXX S1PR4 ENSGXXXXXX CTSW ENSGXXXXXX GZMK ENSGXXXXXX NKG7 ENSGXXXXXX IL32 ENSGXXXXXX DNAJC2 ENSGXXXXXX LYAR ENSGXXXXXX CST7 ENSGXXXXXX LCK ENSGXXXXXX CCL5 ENSGXXXXXX HNRNPH1 ENSGXXXXXX SSR2 ENSGXXXXXX DLGAP1-AS1 ENSGXXXXXX GIMAP1 ENSGXXXXXX MMADHC ENSGXXXXXX ZNF76 ENSGXXXXXX CD8A ENSGXXXXXX CD3D ENSGXXXXXX PTPN22 ENSGXXXXXX GYPC ENSGXXXXXX HNRNPF ENSGXXXXXX RPL7L1 ENSGXXXXXX KLRG1 ENSGXXXXXX CRBN ENSGXXXXXX SATB1 ENSGXXXXXX SIT1 ENSGXXXXXX PMPCB ENSGXXXXXX NRBP1 ENSGXXXXXX TCF7 ENSGXXXXXX HNRNPA3 ENSGXXXXXX S100A8 ENSGXXXXXX S100A9 ENSGXXXXXX LYZ ENSGXXXXXX CD14 ENSGXXXXXX FCN1 ENSGXXXXXX TYROBP ENSGXXXXXX ASGR1 ENSGXXXXXX NFKBIA ENSGXXXXXX TYMP ENSGXXXXXX CTSS ENSGXXXXXX TSPO ENSGXXXXXX RBP7 ENSGXXXXXX CTSB ENSGXXXXXX LGALS1 ENSGXXXXXX FPR1 ENSGXXXXXX VSTM1 ENSGXXXXXX BLVRA ENSGXXXXXX MPEG1 ENSGXXXXXX BID ENSGXXXXXX SMCO4 ENSGXXXXXX CFD ENSGXXXXXX LINC00936 ENSGXXXXXX LGALS2 ENSGXXXXXX MS4A6A ENSGXXXXXX FCGRT ENSGXXXXXX LGALS3 ENSGXXXXXX NUP214 ENSGXXXXXX SCO2 ENSGXXXXXX IL17RA ENSGXXXXXX IFI6 ENSGXXXXXX HLA-DPA1 ENSGXXXXXX FCER1A ENSGXXXXXX CLEC10A ENSGXXXXXX HLA-DMA ENSGXXXXXX LGALS2 ENSGXXXXXX LYZ ENSGXXXXXX RGS1 ENSGXXXXXX HLA-DRA ENSGXXXXXX HLA-DPB1 ENSGXXXXXX HLA-DQA1 ENSGXXXXXX RNF130 ENSGXXXXXX HLA-DRB5 ENSGXXXXXX HLA-DQB1 ENSGXXXXXX HLA-DRB1 ENSGXXXXXX CST3 ENSGXXXXXX IL1B ENSGXXXXXX POP7 ENSGXXXXXX HLA-DQA2 ENSGXXXXXX CD1C ENSGXXXXXX GSTP1 ENSGXXXXXX EIF3G ENSGXXXXXX VPS28 ENSGXXXXXX LY86 ENSGXXXXXX ZFP36L1 ENSGXXXXXX ZNF330 ENSGXXXXXX ANXA2 ENSGXXXXXX GRN ENSGXXXXXX CFP ENSGXXXXXX HSP90AA1 ENSGXXXXXX FUOM ENSGXXXXXX LST1 ENSGXXXXXX AIF1 ENSGXXXXXX PSAP ENSGXXXXXX YWHAB ENSGXXXXXX MYO1G ENSGXXXXXX SAT1 ENSGXXXXXX RGS2 ENSGXXXXXX SERPINA1 ENSGXXXXXX CTSS ENSGXXXXXX IFITM3 ENSGXXXXXX FCGR3A ENSGXXXXXX LILRA3 ENSGXXXXXX S100A11 ENSGXXXXXX FCER1G ENSGXXXXXX TNFRSF1B ENSGXXXXXX IFITM2 ENSGXXXXXX WARS ENSGXXXXXX IFI30 ENSGXXXXXX MS4A7 ENSGXXXXXX C5AR1 ENSGXXXXXX HCK ENSGXXXXXX COTL1 ENSGXXXXXX LGALS9 ENSGXXXXXX CD68 ENSGXXXXXX RP11-290F20.3 ENSGXXXXXX RHOC ENSGXXXXXX CARD16 ENSGXXXXXX LRRC25 ENSGXXXXXX COPS6 ENSGXXXXXX ADAR ENSGXXXXXX PPBP ENSGXXXXXX GPX1 ENSGXXXXXX TPM4 ENSGXXXXXX PF4 ENSGXXXXXX SDPR ENSGXXXXXX NRGN ENSGXXXXXX SPARC ENSGXXXXXX GNG11 ENSGXXXXXX CLU ENSGXXXXXX HIST1H2AC ENSGXXXXXX NCOA4 ENSGXXXXXX GP9 ENSGXXXXXX FERMT3 ENSGXXXXXX ODC1 ENSGXXXXXX CD9 ENSGXXXXXX RUFY1 ENSGXXXXXX TUBB1 ENSGXXXXXX TALDO1 ENSGXXXXXX TREML1 ENSGXXXXXX NGFRAP1 ENSGXXXXXX PGRMC1 ENSGXXXXXX CA2 ENSGXXXXXX ITGA2B ENSGXXXXXX MYL9 ENSGXXXXXX TMEM40 ENSGXXXXXX PARVB ENSGXXXXXX PTCRA ENSGXXXXXX ACRBP ENSGXXXXXX TSC22D1 ENSGXXXXXX VDAC3 ENSGXXXXXX NKG7 ENSGXXXXXX GZMB ENSGXXXXXX GZMA ENSGXXXXXX GNLY ENSGXXXXXX FGFBP2 ENSGXXXXXX AKR1C3 ENSGXXXXXX CST7 ENSGXXXXXX CCL4 ENSGXXXXXX PRF1 ENSGXXXXXX GZMH ENSGXXXXXX CTSW ENSGXXXXXX XBP1 ENSGXXXXXX GZMM ENSGXXXXXX PTGDR ENSGXXXXXX IGFBP7 ENSGXXXXXX TTC38 ENSGXXXXXX KLRD1 ENSGXXXXXX ARHGDIA ENSGXXXXXX IL2RB ENSGXXXXXX CLIC3 ENSGXXXXXX PPP1R18 ENSGXXXXXX CD247 ENSGXXXXXX ALOX5AP ENSGXXXXXX XCL2 ENSGXXXXXX C12orf75 ENSGXXXXXX RARRES3 ENSGXXXXXX PCMT1 ENSGXXXXXX LAMP1 ENSGXXXXXX SPON2 ENSGXXXXXX S100B Seurat/tests/testdata/nbt_small.Rdata0000644000176200001440000133013714670622051017433 0ustar liggesusers‹ì½œVŹ?Kï[XzÙeaé°ô"x¾TQ©ŠJP@é¶¥ vÀ^bÔ5&7ÑhnÊM17É5æ¦hŒÑ$&Á^b¡)]ÿù3ÏœüæygÎÌœsÞ]ÈÝçóIVÞ÷œ9ç=eæ)ßï÷™2zfßú3ëW«V-§ZÕ«åÔøçÖÌùçÿU¯V³Z½þ­wÙ¼Õ½V-›»tiµj5 þùAcñ¿Ùß®Æ,øåälm÷½)üóðû¿5Ýðúßljú^®›`YÎÿ¿ù•¶íÃýÚÿóèÿ<…ŒÏûOüõ?í7@'ý÷Õ¾wâÄ1O‡/ÿÊ+õ‡ÿëû.Ÿþ÷­³»bFέ³»|ú3tiyÏ?í^×óÊ8ÞéÇOŒü}ö‰mÛÏÕ?qBÆñZžøYíÃo¯©ß®U¿ë¤ÿßóykƒ×}±ÆNsz.²ezr?ƒ½'nÏ çýÛÑß7ÿóWlx=ü<×ïzãÜa'žL˜ÿÏÃ/ĸ]>=×Ì9ñܺŽî¿ê'ÿÿi޳m|ü=eüà õ½°çünÊs‹Zú÷3ßÂnßà›'& ãøõ_W¯wÿw”ý+Ê0dhäû|(î—ï¸Ág #Ü~bb0îÿf²÷ËÓŽÏçñàì¾DŸ·ÍøüP×|³¡rßå<НG_¯êÑÏŸq¿ÚêïE±˜ÿQ]Ì»Á[êý þ*æàm¿y$8(ž÷`·ïÒþô»îs׉û>Ãi>ó‘ºÞœjüÿwëŸëxâq ïgpìÄ>㟣M²÷ÑwAuþÄño\ÝàÄ ƒ›ÿªõc‚ÔyÕz^?ýÿ_Ïɺnî·×ó¹{í×›ºâÄ|üÅí}Fm1Ÿà–^~ׯÖ+‘ókÆöuÕy*8"žÔðûÎÇk©ÿýrþñ/ßo}÷¾úûpίç!øLsÕô×½ì5å|]§ ·ÖDä_Σ^ÿ9űÖ_tŠ~~Q"æSäyŽÛq®WÈ8NÏÂlªÞnÁ¡èu-øXÿžã´6âù›U-+qopT}îP3Ή™_Á5Õüó®n".ÜÍòâ-Þß»{©ïY?ýü<W­Ùñv~MÜ×–Ñë&gœ·åq§û‰:éä×0~}¬ºn°×í:¢½>o€Îúç…·ŠybŽ>ák¸´‘ÞÏâV‡F~ôûn·ãgzÿ¥¼£ø[Z½ÿØ>b)ÒûÁ2ŽC]ªÛo?¦æ),uu”>o+ÞkžÂÍ ôñôyj›hݼþF§ùk/WòØøœ~™Ö@Ÿ¿¨ãÏïòD¹~ó€q|™g õóè8óîSŽKEa ¨%âM·¨ëîÚKÕÏý±}Ëwü–žƒj†ç…êè#Öçà5u¾BKÊ×ý^¼oÁјþà~u“¡Ëã"Î/üçãüjd§þŽßB×Pìæ…Û÷ŠW?ÊçìÿMeãøµÔ÷ ›êˆ÷}×÷¢ëÃëd§þ³`™x®¯ì¦_ß_`ÿ~“æ7G\¯oâ*zÏvLÐ>—Øðœòyð©x¯PH‡êý;“€é¢>‰?<ñŸ{âO&ïPó6»g¿—NÞ¹){þ»<]¸rœÖ¯ òÔnPã©e•çIζó Þëw°G]°b‚XO Y½¸¨Wdü¦¸mŸD~iÍ/½ò·¸l€ˆËv¬<±:¿(Þ§&â:àÞâ¼FPu$åÉÕûÏÛ-ž«U „ÿ?y•¨«m*~ÓŠ¯Š÷ã¢ĺ!ý…›Z‰ñšRýík[Gþ¿ófp@ÿœbæ‰ÄúgÁÊӪ׃Äó‰>«ÔçaÐýâù=ÄâßI7«þCmÇëvÕMâwœ3O}žg‰çãnç·ì›Z¿1øêJäçÇôëÛê:Xøq¬<–Üæ4¡ü~Q¿¿ñõùÜøâ‰ûgª‹¡@}/ƒ×õ~ŽÌ«cí¯ô~ž·†Žƒ£ó´5¨þÑg¢“ß|æöׯÍoḠ>Á~·õSØú0ç‡N¿Ó8^Ûtëó¨Íü¼é?y¤)Åûß(Úïå84L ê°GÉÏí¨ŸçQBóÌÜ+"ãWôùÔ$¿ó[½ü=›¡Ø-jÜÓ‚D÷3c¼/&ª/aý|±.œÿu5nêççßbéh·ðij†û/{ gØÐÓO™×X”ùQ‰GÁU¿Ï þ&xÝGösKžq_ºï¡É°áq1OÌë´Éÿóµº[M~?Z±û¿ö?TÎ'~ñ\8Nóèû‚} ~ïóÕŸÆy„ÏÝtµŠKˈß~(üËÍÛ•ßÇñl¾†v–úsgò›k3?¼«K¿Luž¯˜6AøC“?~nmZoäç#ºåŸÚR>d?­gÓ£ívúù!>˜ãÙ‚}Éü›´ 9ôwAy<E ÂeýL¼WÁçê¼ìÏ7Ê; ¼­ú\I<Ƽ+êh#E×å xÔduÈ¡ìy¹pPô¸–ü<ê~v’?Õ‘âˆhž_0ÂP§tãU–¡«7uÍýO Vq¥1ëÜ‚ƒô‘ÿíŠ ÏoË!ÁØÃüÕí©ÏÅ„îÂOÈu«ëcúËñø†bðb:þ–4TgyÀÉ/¹ÅÑ_úZt<1¦Pñ'øõOˤñ9áOÃõj]}ñ·”ðúµhÞÿ¬þü—.Wódwvuª7fŒÓ€ñ\·/ÖÍ)ûÕë>Zï¿cœ/!-C¿»œæ éï¥vÜÁ«œž¿Øãßð¿ÿ¶íïéÔëÌL„÷À‚‘/fx=ÉǰíÏãæØç±®¿¿œÕB}_Ö¥®ã—¾¡ÇPÝ—" Üõ˜È뾫ëPªò&|yZ[¦úIŒ‰íôǽQÍ“Êú‘íx²îŠy%úø¶­Å¿íÇòÄTÿEI¼uEÞºáIqöéé¾÷Þ‘z<³Åƒ(‰ÆÇ5ä¿âŠÜôpÃn8JOÜ…¯¡È-OŠžéÄèZ.þÖ3¬ÿ-|'èùï¨Oy‰M££ßCÿœ`Áñw݉Âõ#²îfù9ÿÚ¿ãŒXþzðA:ózxÕU?+?ˆç¯øW'«¡ß…±æ5œcÑ}èó¬öóà}†û]x]…âå9Î\æC*êøÒЫÄ/pÃ'~Ûok#ò—ç¸ñµÐ‚Õ û&›·‚7 õØMkýpG­Ò}Ïe¾=8d¨G_»Yäk‡‰º1rÝp—Þça¨‡ ˆòÎõ˜?֟劷m‹ê½â7ÿ_è× +?Ëp]pý-¯šîvR—ÕÒáw¡«g^®F<a¸ÿ™¢ƒªŸÎë:q-mÞ[p”å?–|77òÍA?Ò½¯Ánõ:»ÆàÆWÀØ»ÅûWÝq܉Éâòà¸[ž Sžˆç¼Ãæ×¼èó ¾ˆ©ƒ³ø%¯ü qñ‹µ÷ s'dÕÏö5äfg\ŽÛmÈΧº@ž…þ_Ý:øÈ/ŽAÙ¶è:’g×ÐÎó÷$äw›ôÓ6±<Ó Â†olÁ“2}Ósü™ò$—^­‹ñ¶ÛuÄÚåÚx Ó'µGŸ?±éöà®ÿëö3-E~nÞGn¸¶WHŸ ¯[ÞÍ£ó3¨AùîÛF‹üöýŸD뺔ÔRq3])¿Ø…Õù;\?ÇíbK‰XﯸÊ)o$ëÁ¨Áêì&ÿ¸¡ãuÁ»±ò68»®[¾KÎg ŸWùdó®‰/Ö'üËSJ¼³ïxãoì*ê +šhý‰ßËø¼4:¾Àæ§Åû¸åZýúW‹å ZQ|ñ¢'ÞéÏéæÓ¸¡1ûw;ý:Àuò|ã§Ãã5eqÿØébý«ÿÝh!î‹Ôç ?¿QÏßÆÕ ãé7J||w5NÆåÕÅó_Óð{9潦›B=¿úvÿ´áô/])â4†pöãǧS§CÀpmCÇÄó{Ç©ùÍàÆ®–®ne›g4„½/µÓ‰C] [ˆúÕC/­ñyƒ—ñì›–ùñ¡ë%Ëï¡Ã;Nñ·)Ÿ|š§¸õ§ý%ßÒÄ 0é¸ÈóÆMo«|Ú3²¤‡Ø8^>ùÙ]ÃãÌ{ÜO²¥î²ât>k„Z'®eà»0€× ±pXd^7ƒØŽÕO_ |ãÉ÷'Ê{¢È/Œ~ÌÚÞWàS „Ÿ>ů2¿†ó/TùF—o|ž& ‡²n£Š³6½ïù·ïöÎãZòÈÑã÷p[~ —èõ;¥¾¡ÿ³ñ[²xwíG‰Ö!´&E[‹ŽÅé’§I¹N=O¹NNâq{JÖÇë‰ ,J·ë›wæ8éaÒd§ë/ó\¸öláwró/y<~Þ€®ã U×ÈUÄ×$>8ü7«£û÷ ¼ê`&C+?Þ‡M¯>cüZŽzI=X½ª¹!¿Q>BÅß›ø.ƒË]OQÝo6é®>SïüL\WWû>›ø¨I µÕû|æVç¬l~ꦣ›ôº¢·A¸‰ÞßGž_„<ÂÓx×iÊHëƒ?6üÍD<ÑŒñZ0Œ§ÎTÆxõ,uK=9§†…Ç^ƒÍ£ÅûŒóëªyÚ.z]LØ$Ö™NÄ?ë æa×z×ñµYð ;ß™êu‡¾ Ð?ÏóˆW¾]ÜòB¾ºóquԤ߅˓é½`Å(½ÞÆ„›²‚¯7_ß³mØòŠ2ëvPq!Ówˆ:È¡{…~¿Pë¥Üƈcj¾lþÙ'Ö§°oKnº8œŒã_9É¢;(æáPG*‡â¿¹Äû"¾Šôx'Ž{ö1}ªc Ïàˆß@-ÊŸÌß.ø¼†üwRóÕ…ÌØ¿ ‹¯g¾«æ{z¥ƒ—Ew?/dëHÿÞÆýËl6ÍfuwZGn«+ônþXޣϯÿ­>¯¸òy1O=t¦~Ý x¶¸ãQõ¾ß÷ñùÒëõóø––bžŸÿ?2ϺQF¿‡»÷Gó“=y¨iàÙܳ]Å[­{"~ŸÇ-}D¨ïDpÌ--q|òº¢3­Kó¯ÏUoÒtì[Ž{$;:;ØAçu¾úÜ„ú™c¿ê–ç¼Rè±ò>eØ1V¼ “J>,äÿ,›âTg²éœáºgE†ê$¸å®hS]†³¸w×ù˾ È·ð×[PòS6Ž;ì+4ôoÑ}“êúáí9®1-ãù¤ðóÎt=&+Öº€BGüsÍhžF“®¡…nLSç£i~çÕk"×]œ·‹ú!Pó€a»þú|Ô35Ž?±‡:/¾D¯×]]ß²m¨Ît1y¿îúƒï:ÙÌ–gÆìÍ©êÃàüÆj=êæ÷­»¦~š¸ÿcÕ¯<_J0^¾qío…^]®áÛù\2=¦«nÓ…G#Ρ®˜ŸÐMö£¢ÏsY„ðFœuÇ'úãØ 9nï—Ä+†<›;‰|ÃÀ2}>ªã)¯Üé‡Ã'½“¾Π¾˜üz­[¥â ®ø#ÓÃ`yÆmõ³’?G'Ê÷Í)ÔãO‡ ~ú²¸é#ÿ”Þ³‡»½¨íSÆðñXô‚öù°éÝcŒ›înyUäaö¹å‹0Îï~›,Ô§·èYaNKÏÒú…O&[g×ëÜÚ¶^ù%ôŸ¦÷¾¶¤–‚{é¯n#ýPÌúN,V K7[eÙµà{¿û ¦ìמT_:<Înú+õ­Pëß½ÒáG 8éŽ?¢ð«Ð%Z—fùñ1ëÇó+3ô°z©}¤n*ßã°°Á€+¸p¼[Ý,ß3Ï¿×'­mˆg.-ýÕ–WÎ'Pýª¡ºŽÉú ys·éŸ=åñ0ò™hþ¡÷ŠYÔã†ï(×;ÄÝLâ÷<Õ1à‹ ýÆl&óYhjྭ¿.ÞÇɲރóy¼D~Ïný÷èã×ß‹ZF?·CÊõŸH¦“€ï…‡nh,‚uÏ©¸_Yꙮη¯¡/ë'I¼,rRémqÃ#ÕulõïbÕpÍÕn÷ñî¯Æ{Ï <@®k,û ‡Ç+ ^)ãk!ú¯´!†¯mÓñ5l£^÷–ä·¤|oc¦o”//‚³ô¸³ðûfúy-øØ1~¡þšÁÛñÞ?Ì|ÖwuÿbªÏýÊð;^`ÿfþbÚÆõßmºý®†þB(3Ç)ï× öJþ¬Ÿ®¦õøíÓ¹n¦ü‹ì»g<¾Ä­Oú^4NøÑ7×ýJýürƒ¿Éó3üêÈRgãXÐÊ‚w,ÖŸÍPVªúÇM ~ߜբžÎæG©GŽú¬nÕØ ›ÔWè`l7Á»#~¥ÄƒbçÏ£çh•ׇÕßþhkVO^}•à•PþŒúœ¡x¤¾·§¶7ÖÎOfâW¹ùão|Z9uúð< ú¾ÆûT†ŸW£û-ï{!‹»¯Pã1œÛ\äe?Í.ìý8Wø±xl”º^oRûãú¶Ñ¸‘™KcÍKÈg|Z®8\}nMº‹'›áwôø½ê–üÿ!ò‡v4sÓö|ÞÓæ#føyc©»y´¨´ˆž3ÎoÕ~{ö£Ê<;Jø÷¨Çžã‹¨âDwvùè!‚ljÖÉÖMÉ猻¿É°¡švÝ0á ÂïøÅéh¡_Ÿ‚w uš¥-Ô¼Qãxzhèý|âü£B¿Å ë™±ý™Ä÷¯íÏqý_ôÚ£öí!=$Ìê¥ê5gÏó–­bž]ü½æY‡EÞ¨6‹k6ÏxYª£3õ'ZRM]ïÏÚ¯òk :’hIñãÅK½Y´¡ø{Üú;I}¨š”·™&ôÌ9^«ë×åUßÇ­Åx0ãïßé\¢õ‡¨üÌÌÓãíÊÔ:ôWåóŠ®þÓš<ágÒ¼Š&”gë'ˆÏ’w$ã(L¸0Üy{t´›x^p™è‡RêkpýKÙÁ‰t*þ¾ˆþûú|v¡ºâ¼›Åý¨Æüå,¾½ÈMïÞ®¢Þ[‡ü¿óŽèó¿[7ŠúÎètð²˜â¦#|Z1xiW£$YÝÍõó+6ôQyi3ýê”2¯ñ9ãá:}Ÿ£pûÑ~Wp0f=ÛC*Rêxñ¹>N¨Exï2u>GÙ{ÑñhÊ×RÚU·c ëcC'=1Þ¿Õh]¹«\7˜ù˜ª#wáWÒÅÃÆìgoÚk±ü3×zr ëê¶Ö*þb• ÇÓÛ¬²ìjdǯ2a2o™ñùaÏúí«†õ¬ÍßwÞ üÕ¯Š|Ó¹D^kŸAo¾-ùu—oT× ÎÆÕ0ù´ï;¦ì‹æõ ÐóŽPÀòj+ ¾ÒëñòS(óÝÃ0NS>mT®>9ÿt5Ϲó½ õ»2Χf2]n”Eû—˜sHø¿‰›äË™ê™Ç7ð” ü\—#Þ“>ª®0×?FsÆê«ú'Ør\õ#Û3bé7£óǹ¤lÂŜ樇қñøöR}–ÎGö-<ðŒýG»é=Ä543øa_~÷êÇôŸ7´è´”IäÉÚ¦Ç{ Ÿ“®yð–A‰t·ÐŒåa%nöοªùGM,o£Ï4d¸¢îêuÅrªS]¥†ñçÞ‡éJ\˜íüÂqºDë:÷ šJyÆ+oOÕ?ÁåOF?GWvy‰Ä;š|¾ÓúbãE†Û±ë™ŽGú>ë´äq¤vÜ.¤_¹ÛqûnnuBtfúÝWGçñ±ì€þ=ÙòW‘§ªÇæùÉ/$Ó+QÇ3õ«Â¥OeGŸý£tðAò½çúqhj¨#NÀ|Üp³ÈkµÌŽÌ»(ñ ¥käMNëÊú™­‰Z†ûÞ/§-óôhÀòЇØÉ-†ª×“¾$J™¿2w·ºýuŸðƒ\ûbέ©ð¹ÞôÉnØ^ê…O Þ5¼/MýÞ½£\'“ÞcZ&ë*&µuOþ‘I×?÷ÞçOzýÃ>ƒ£×ñžñp(i[ðûuRóúèEùÙºÙ™?}Mö«ˆ»?Öÿ>ŸžóàEŠd׆™OŠx©M²ßŽWÇ¢º¥,}! .uÕ¸>[ý2Ž»èXù£à#ï“ú;àÌêj½eâÑy¥ójÅ«·‹Æ™†Ûå1?ui1é;±íÎ|Z­×–Pýõ¬V§Âp«({ BñßÁ!v¾‹¿×~Cœç9Ýõ<’~ gô@³h=‘ž~ñ0i†¾4´\ü-0äZ2\¹–>]í*ïÏÍGb3Üú¼ºN‹7©~ê¶ëõ<‹_‚T‡dúéiæ‰|6mrò+Lxl+‰Åè/€6h<Óã;Ú¨ûßöS1_öû8«zµ8㺬øõhS_Æÿ ŽVLÿ¬_¿\í_Ìë;Ø"ä¸á}ý¦óDíó…\Š'{‰ø›–‰üßü;T<ñþ3ð-sžºAE~ÈÖÈÏã"ôaëEƒdù(‰ÛÌV߃¸ÆqêÜ0R­£Gȸ{ŠÈcNRêõñ>Xhä÷~`´Ê°ño3~Ï? yV²Ísá~…,>jÞ9”÷î'†ç»Ÿðn5ÜÖ_´PŸ3ë¼þNJ|™æ¾.õp­›…ûVñ‚&ÝõpûŽ|^ï,í<ÆV÷û½Ô7 ×ÕJuˆ«ƒÆqWÆíº 7šVÌúUцUÝýøIÄ“ÁéÄu9ûƒtúR|&û•8¯oº­;ÈIz†4Î7Ý®ÿ‚Îôwãf=ŽÑ¢hêÓŽñ´Ï§­ÏF¸?½ Á§nuÂàgnºªi›kÿJl*Óçƒ×¯þYM†sŸE|Èõúëh<ΈIÑ}foP뎖¸N>(0èè•FóñM¸2®ç$y~RÇ ó…n<{ú5WÙ·Sþq4/³E:ëu˜Ï”óUïtôT¤áš¯«ïw óK,úR-ü·£®¦÷yvzö¾}ÿÂýïø/â ×?%øjq Òå[òø n}Ç8~+G??7ýCÉ×”ÿæ¿'ì×òµyz<ù{úóÍóo]÷J­yUÿ«ùËBŠ{%ç¼eÑñº¡–qû=ù%ŒïUßm4á8=>CêÁÈßïz~Ç•}%ë9ê³WO–§ÈïÁÿqÛþtô¼ŒÇ9“ðgl]FI¼ã¢¹Åœ&ˆÎò²®÷!ñërqŽew©¸¶þ‚Ÿ‚ñÎ?ÄIÖ‰©ÃGø?´Žö£d¼ŽÖ¤÷Sï$äã;â5ŒçÓŽáLäý >4Ù®·róÍÇbäsâ9>[ð¶|ëÕh–^Ê“¿+yXá¿ÉFžÛókÄ•P¿Wœ:ºå2ö›&pÖ}¤ Ýp®ý*±åkÑ:ЯëXû²X÷—կ﮺?½âÕ[јå³7æÇŸð>©6<%Ï+šð‡eu‡Zǘ.êî¨Kóå|Uçg¯÷ÓÙ›ù­ÿa,®lÍòäEžº [Ö‰y& }„†ÛõÕ ({Vü-Œ7¿"‡æ PݺEô8(&¿¦«'¶‰Æ`®àÓ£)­Wžt[Ÿs£ç1ÞO¸ÝíôœôqÓ%ÎØßÀ÷¿·èu› “EA ³p Ûæ‹ëÓE­ÃÉu:ܯg2ýŒ˜Éô[¨¾7D_ÏÅ5ßWã„ bD‰¥Ž÷7½_ÂO\C1ñÍøë!þµ!Õ#›ŸíŽ#Â/fü5L¾MÅϤ”O5™IŸ/®á®m¢Î´ü ÕOD3O?ËÀï=U MãáŽ}óUÁa·¼¥ÔgÃtÁwD̈’û¿¾|_Ãøm^ßxñÕA_ÞQLݹí=Ô§sý°µ¦Šß~™ê÷‹¿k|Œ{,ò¹ uòœRž­(Y>÷.‹öOš%ãðyyŽ|ÑŽŒ§YK}¿1(Z÷‚ûãœ/‰;ͳÁgžuú&ÌŸ-qü½»ö9âÕ,ùœKTüì~ÏphÃxD¨"u%­ßÉúœp?g Ü®úŽð‡o]«æ3‰í%^Îæ¿„:ÛËé§…º!بâskSÞµù7ý£g2´¬XEŒÿ†ê·¦¼y¾¥ŸMÓèù%ôçŽÆ¤ƒPцb=_\êv9S;:ÿƒŸF¿OË‹Äs³õ;"μK˜N¸ƒC~qfþÄù?ïŬ·üp]YÂÍ¡—g7‡ô×Îï%½WRŸ5<ß#Ñy¿`›7¤õ¦>©ð<\ ;^PçAǾxh©â0ËÖ™ÔÄïúZð\–ýÇázÜjx|Ç/µ•E÷/’u>ìü‡ZO{Ïï½ÇE¿ÏÕG±h…ú<Ž$?d¥^®Ê’%{ßyþLæópDÐ'ºÎÈ’^V§èûï=Þ¹+œâ[dW~³Ô§ÇÅ]êT8‡ú£Í›­æ£-|#ßûŸ´obس¼Ÿx/ªE_/WCC7?_ÖÐÓ¯þ|Áòêržé¨Ïcñ>šÎÇ1ðÑÐ"Ý<ƶЮ¯hÄâáë¿™.ßô¦Y'~ï×…:Žü±šL/lÒj~„ú4 1ùÛ½ÝøT8ø|ÌE×w´ñ´ä-¢4šÏ|Bù˜6–úØ =ÅsÉü/ΫÃp‘'Æä9ÑÇýܧö¦¾sTÜGð>­SÅž8ýkÅý4ôNÊ÷GOO}0G—¸&õ*Ð&ݾ»áøûÕç„ãœÇy™x,}/SŸŸ~z¿‹Ö}KåÉìeóBÇ%‚MK¿€v¬Ñë3¾?Ã웲‚ûpÕo²m¡eñøµ«¾&ê½92®òôƒçÔõܰð*7œQW=>’ŸO\“yIÛvR·©õ<Æ¿GgýïÇꇅŸuŽž·•OäO„ó Õ×± z•úÉáñ«yò滉|‚ä¡óõ…‡ß0\¬GŒO€Q÷êû%9>ç½H¡ÿ‚ÎÚûã­‡Rƒ]÷êŒ7q;þ¹·‰÷ê‰Xq¸¿…¤gÙ‚ã%©Îó ýû!u-CýÐBâ1´4<·=i»¥’g:6;ui,y0É_ÅX·üVëñB2.±Ö™«Ÿý<1ë ߯’OôÌû$5Lk«ÖyëÓótÅéú¼XƒMºŸ¦~&Þç56º¯1.ÐãÑ0©Ž~¾ú­¡ßrzÏóÙ{Î~9F®Òã~g‹Ö½’zº\ß°:wá<±>ÞxµÚ§Â¢?ׂÏó>GÆK}õý’šôË0¥ŽÈKî¡ÔµÂã÷tÔ±ÊqÔ+í®Ç}gÛ°¬…ø[Z…¬²*«²ŠµàûL¯‹åŸm:i÷²ÀŽ2Ćý]ñªûM)tÂ¥ÙÆáqbÆ÷¿¦¸$ÇPϬKëTs¦‡UÆxsŽ:”رNøé7«ù0ê·Šb_ÎódáçO >ãôTóËèã†F ‹Nþ°xy “Õ°ýtÒg~ºRðd®fÊ?ãÛOéß·˜º0iÚÄÛOöãy[ýSÖû8^pÔ3?Wô[öfÉOwì£ì<žG•R^1[†.éö©àÆ×!t,wÛo7ý%ý¡à3·|bXõ”ŠÓ¨cзdú,áçSD]EÖ3ŽcÈeŒÓÖ/Ÿêƶ£÷ÍSÇ%©ÅÅÅW¶¡môýHÊ6÷ì;²’WBÛtÏ7ÔÇläÈK¬™LW»¢ ùñp˜ËòÍ ñná8¹,_rý½Úë×߇àS?¼†²|}ÃìμßKÚ†\}|÷>K qõç|Ã+³ÿ Í×eäÅ:ëq$ÿ®†æúûdÓ‰æø‰ûÄâ¥Y©+`å¹"¾kcà=Õ´è,9â–Âí[^ÿ ¦ÛCš+þ,C×¾óËGƒ.Gôõ€<Ò?cøuT¯`<{=¿ã¡…¯Ý€xñõ q~Jýj3Ž[—ñ=-ñÔ{LíøŽÏ©äW‡“ý¿.æãƒ.Ò‡L_«Ì÷…V4ß7dñG…×xîËnxÞçbÓ¨dú–¾Íáv‹oÒç:ëqЍ™¿×ÕpÃã©âKMýuÂã|Õë9 ÷ D>Mò‚0Zèe„8ý<îîoEݱå8 +6„æL¿÷¸›Éõ™Ñ:»<.tbuↆ<õUÏÖyd¯=-=×™|?œ„äùe|Þˆáƒ[»åÙMfê#‹®Ñ8g›Éó Þ&à÷öM2œgÆqÛ'ëÏÈuµ$® ¨/ƒcìk<ÎC!ñI?fx-©ÿZ¯¯Ÿk½>c¿bµ."7]Iãx5-ü׺~×EnÏ+ø¿Kôx,D¿¯¦ø(߸ªKt^¼áÁÚèý:Ôf}VŽÆ!]Lîcnß·iðƒ·õylœß\¯wÛCø]èßmÓ½ ûu‹—_G£ìÆ)©ë¦¾í™ªmÀ%.h¯ú<üÉnI¯3ç·Ký™Œí&.RuE:%Ô—ìO|¾)ýÕ×÷«,Ckq݃ƒ,?×!ÞxÁz> ¼gÎçŽ2\짆øyõ"ṟägÑÏGÚõ›á‚»á2z«yWÞWÆ8§E÷¡ŠkÁgâ¾Ê~*¸È±NY#f‡=Ù­o ùwµd]©bqR˜»-Ú0ô G]Ãö#²Ã‡Cº>Eª¬Žî“ÂpvXvÚwKêDyæAÂñYpçþÚ§‹5§av⿌ã\¢òÑAÍ×ïœZºÏϰg³{¼n¤càˆ‡rí;ò&Kbê‚ìsÄí‘Î&þ.™^Þâ‡Kò@¶~›úþZümëq{”¨x‰=Ñõ¢ ÿ¥€pÅL¯ ÄzjÒ%áøqÔ4ôè¯êÐã®ïˆø°­‡Lržåˆ[»èN‘'{Çw],®#F~(øµoF×ë‚}†û¸q]Vùž&ÃÔ2õß›EãuLZJ¼ïÉú8jXC??pÉQW½}“ø÷üÝúzç–Ÿ‹÷öÌ¡ªß>ä>^e<7î§dŒßÑÅ÷‰üó׸þ}°?a¿–í«U=ÝfË/ {îGªnÓ-5.ê æ›B·ëÿÅó=¸²\ÄU×|_ÌŸ–þP\ßÍ /rËi±ò!R›ç7‚ƒ|ĽgFã6,q9rôßK`ÔŠ‰7ý¬Š‡]{¡¿æS÷לås65Ñǽ}®VŸ³|7ÿØ¡žO 5ï#ë›a·½!ÿ^,â?‰ë@Ù³âó›Ô|«_‡}ЖՉÎ[“þš¾çù­Ñþ'nz)z^»ÿ&uýî#ñ¯Íüò9¤£aê?„wªqìë¾!áÌ1<º¯˜¯¡š£ž×ÃmK÷­Oºõ!©w—ñ9é bê7Ýç"üЂžÏú,ž›ÂuÜé¹ç¿».áÔ‹ò7¼p?½~]𪾅ŽBŸñ -õ>¬¾OäKÖ\©ÏŸ®~@Å×7sÿf«Þ‡¡l‹‰óçfœÿëp=FƵôÕ@{‹ßS‹áþÖëõÃï’¾p;ÕóÜîËyâ½~éV6­_ÛYò½ÜL:ÀØöŠþ¹¶ð©ÐÁ ù#ÎÛßôFVq†UVeUöïohjóG\-Ø“]\v•Ú–”ïZeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVen†.gG÷ÈÖ÷æ¯Lï{íU¢t4RÖ Ç/!>înúw©¡Î`¡û-û,ðþ.Æñç¾,Îßзko:³[üðš÷/ÖW^ž·ñø}ËÅvŽzŸá¸¤{ ˆ¾˜ô]ÁÇé­kOzM‰ÂôÕ‘gàUtã¡”x·=’ö3ð®˜GÏã>³îO'ø÷ÜÍCÀ ‚׺mKÜSÓ»á¿?o›ÞëW‰Õ›´¸ÍàÏÄ Gã|Þ½Øý¯C¼·–¿fz¤ï[ç.ytçýž¥¿W3ê·yÝmB—`ý·SÑùÂÔ«T=á¢rq>_ÄÓËÀ…‚‡yO ~QÿÒhž^y©Ú¿¥Avu$0ë»'^ôàÓÁi¤âƒqSOÁ÷èDü¯7Ô÷S >Wë?8ö­¹ýcÁîÇx(W>(øI×>¯\,[(ú–u»/XnÐe">)¦> æ¥a¢o –,WùT[¶éûÉ~Nº‰]QžÔü¸é‹÷3ôêDú£Õ,ïKÛuâýŸ­Û¿¥ÇWc¤Xpþ3âzÞýuñïê¾%銘tÂãôÇÐ_¬û8_ðímºûh¥ÎS\7 7þ\ðsI“ésÒ‹@£ìöUŠkR÷*õq_Ñó°þçz]´:Œ/Kýç˜îŒÔá·6-‘.8¦ëu›$Ýüâ¬(ž'ÎÇ-a¼_âKåp»Ö1yÕ è|I§ˆëI.î{P÷šÇ~úÐ))X¼w#„¾ò¨ïʶï©:P?¿âáÛO}y0©†ö|qëçÑ}ròYœ´î²Dë1Æ"&ç«à½Ê鯇ѼÊl_·÷£~3(o¢ê–Zø [§Ê¯Àiúu–Çáöõhz¢™›^Ôm‹’õ¥©AýÀ^ÒÇ{&¾i\“}æãê¶ceUèúkáÅ —ßïÀü™êy'싃Z¬Ê –í§Wõ$ªs>5Ó¡õ±vþ‚Fzÿãš-Â!ÿë»E>($Ý¡zÉò¸õ3%žý÷ÐWèTà¼üxÏÅÈ:‰îOÆxã…n¹©¯B¸]1[ç þ¨Ô- ÿÍüFì$ýÕûÚ2ý.¬»0ZÅ’Äê?¤×É÷(øµ¡_ë†mD¾hì/qŒÙ)ž×YÔ'’úc“Èb‘ÐÁµì>\õ31ÿöÑûÀ(ñ¼^5EÕiùŒõS¤ê®GH·s\‚§&ée,êP;YŠ×#GŸõùÚ[ŸTïK-Êgœ­Ïã`Êq¾M)ÿ2·Lï5Êû]QWõ¿/÷:oŒ§ø·—þ|3¶Ÿ”£}þ¥Žv]ãwü>B7ƒ©g—Ôy€Å¸þVUwb˜ªO‚ëÏÏUzN§ÏáÕ¯‹þNÃÕ~´¸ý›bûUMSy/±õ»ªŸ4Hk0BèÁáæéúõaçKê¿'NRïïíÏ‹ó-ß.®÷y{ÅûyÉãÑþØì‡Åºp}5qü­_R×ÁZ†8o.õ¯ì#òª2?ì|=¶ÿQ—¸nÄ}YS7úü«ÅìÓÁ ¯Üå9¥/ºÔ#GMC_=ʰô£·ô+ÏØ~ÙËÒ? ø‡c¾¬»ªgƒbÒbëšÔÏØ?Ç-ÄuqÓ_ļþ¥¥ú~¦ÝW´M¨c-cÐ¿ÏØÞ S~ÿ¥u=Xÿ[u^û0ÚO°éWãîÔñ/aºÔ}1›–qÿÐç1x^Ħˎ _Ðטžò(ïvåv¿þ†&=ŸK&EŽ“m}wãq y5SÜ~/ãŒ"Ï~åý£ók¼ÞmÜÎÒç7ã¸wü·ÐÛë3K䩆©u¬zJÏŠ(ÏzÕ§ÑõÊ"Ž5ïzÅQaß.¦+Èûp`Óz?=©ñôF0m¦ê4¶ôÝîÀê/s:kt_¤®­qÿë.¿ÿö-z?î¸[ÝÐTWGõÊé+éjh“>9È×1èo~Ìòá¶ùÓ Ó‰yÿ«ÿ|û²“RßÄWOúþ-+}Þ0W0ã’ßD÷•œUKø«—þ>ZÜa3Sëð{Ò§ÅäEÿñ³ÇòÒ|¾ƒÔ÷ÒkSÁ±‡ 8¦eÿ£Î¿—Ÿ¯Æuƒ©¯ÆÄÆbþºí×"þíÎô}ÛÏVòq±ÏÓ‚ó5´¦ø½¾E¯wé¡XybL{*YóÕT|@¼:ZP5ü }^~åNÕoÜGõ,Ù§¯%áØ>2à|† |“üÞ† ŽSžl¿£nèZ?=O®ÇiÜ./ú¾Ë¸’¯#2¯Ëý[ŒyR¹_&½Y›™ú „êŠ :1üÅ=‘ÏYFœÈæ/ä0Ú‘ÿ‘ó¶Õþ¢ì×]=žî7†þÂ-Þ]õc¯ë††çRêOúS*ý¾²eغ˜òtw«ýq ~ŠÉ‚nb¥È·cÁ«ñú‚šô¢ ߆.jßTùéGcv±/?­æ¿n¼MÌÏm(¯:Ë-ÎAJJŠ6zëyt0àcæ|-Õ~6=^tñ«/TY•UY•UY•ý;Yp(;ýº«¬Êªìä5”úÅ«@®šw!üCÔA‚#Ü{kÏêœò¤§(Ž„úç5eý _K†oöêóªÁ›Ä/¥~{˜ÛTåŸL§Nƒ"ƒ½ÊðàE3bÕ½°®®øÛÊ—kgX¢ÎƒC^á«‚ßèçC,ƒñ”üpÁKÄ·ðòl†üìÌS®–Ñ(ê üž›°ÿá>6^7ª_ÝQ®ÖµŽ%ë?ƒ!‚·€!½Ry¾ƒßëý€pþÄâDï¯Éç6ß{“=gI-8š†¤fâÙfl÷¦aÞ7ðnãìaû׋æû¨l‰àW¢„á:çOu¼]¿Ö눬>MÔõ‡”ˆ:çç ‡•e<×Y0ngè+ŽjêùoÇãc…ãQ} ))Ö%Œj!æ™eÌC×ÌóÅ µŽ&ÜA ¯k›~—ñüúÜ%üâMK$ü¾ ñ, Ýð/ÁÄÓ«ß1žAÿF^Ïðß;ĺ.ñ"I›qüòè2Rí/œK÷¿DÏË>"ÞÈYÔ_þÚïÚ;U…B ÎØ ÿ“-C]v|zÿ‚Ï®ñ–)ªÿ"ým¦w‚mO‰ç{ÌÕZ?ËÕ‚ÃÄã>³·z3ŠÝx17<©÷Ç;¨}å±ü˜ø;±¿öyGÏè÷ó÷½›gGîþšÁ̧½w7oóöRÁ×ŪGoæ®sô¸ï,ã®Uq[ßßð¾ßz´× ;ô9ùc1ù¤¸y‚þóõ<˜E/øB?¾äã_Þ[¿NQûr›âiœfy¯?¦udëbýOÇú[=ÏlÅYb¾é[.þkà­¨êÅ4¦yª§zŸLÏa†Þ åK%î—¼,Æ«nÀÙ,¸Vy?]ãE¿ÜÏ’º?ÁþŠáà|µ8éqVèÀp0cǹå=w;žÇ¥¿‰\·l:èà‡#²™ÔµóÝ%nþš^±áK;èuDŒçG|!®d<^-ƒž^.å¥sè=½ò/‘×9ƒyþ/£y½—¤‚ÇU—ˆxñ?Ü\¸»¤g Zð&Ý·™o§“‡Ë£ñêòk9ñ$oŠó™½Ïgdå¾GÔ|¦÷ÓóäY¼/õ"âžG\‰àtüzçã™ôŠ2~v¯ìöÆ`Ãçóôüii&¤õx¾ýçOWç\ßJäµ?Ó?÷áù¯Aê„ðü+Úëï7.ÿµþó­£õë|#®?©ÇyK|´ñwÖæ༉z]™ñÖàMǸ÷pvëX\×Lvtó÷š_êy¶Þ©ñxo¸ñ-âæ“Ñ0»ºMaž¤A—’ø‘¸ð-ýs|…r@ùÃ3Ù|³¡P_˜Gq×€=ñpÓ4¿"ϳNyv™Þ?ßMßç1ÒÍB‹Óó…ß¼mᯑ®¤Ì3c<ãíäê$Rç°©úþo°ë›Ç~‡a½Â‘'ÀÕcb­‡²žŽ WFÎã¸|ut]¾ˆâ Z§å{!ŸCïóZ5M??6ø1“Å:„%Tg»õ…È|=ú\˜þñxwÞ,ž»™/ ½«ÝìûšéÔ—pcñÞ¶PŸÃ´x|i™œŸùó~ÿ"{¯òÅ{Ëëšû‹w>ÿŒ“g;¾qü)â=C«èùÅÈaùépÜšô·kvü@äòùÿ}Þ¥.›OkÒúqù™ªÖC؃Oõ×ÎyäèBõ•£’O£êìà¬/yåOQý^à<1¯lj—ná•óø£ã|õ?O\l¸Iý7þÍÖ<ñ·L­Ÿbó¥"VÓnÂ[˜æWWC~–øè¥~ü(W ý^%¤›T,òòG-ÏC¹êÿõ|;LŒ|¥î ¦½*üˆÍ³ÅßÛgWŠ®§¬ŸŸÒ߃ y\[W¨ï}C‹žÜ–“²n]Ù†÷Åz¯C~î†ÁnëšìÃ0}ˆù²ˆ¦\(æÙM%¢ÎrçÍj‡éê üAÇ~¦<%jÄÃ1»Ýê•èæ—G þH:é¿d¸ª«~/>‰ß2å³1IÔÁ°q›ÈãÍ¿Êë}4áPŒ~DgÁwÄìkÄ:÷¢›ÿŽ:éÄÿ8ûYõßע꺲ü90]œïÆÖb¾¢üuðNºy{_ãù cüvÅåúûpõXñ¾8 l›.ÞãñSUœ"ÍÏØø õsV¯Âˆ¿}HOux2½HɧÿݘÅ?÷ëƒ×x ÔO縦¾,áq.jI83½¾n¸]ƒtð´ÿ×ÍÖ÷Ë‹£¿Æòº¿¹>`ùßEkX¹Ûù Ñ÷CÁY„®Ç^Ï\- ‰7ËØï"ÒÕ¼½™X‡;~þ­÷¨õ’[扺xc6/^w¿>_ziG1îÅ Äß;rŸ_µäÄüòØÔ‰;,.ÎÕ4ð0zPÂWSý3Ö¨ú«ïó÷–Uý¨7ë¦IW#ýSN· ]P©ù¹o?Ÿ›¿!æÝ nùœ6ÆMŸƒúF×ßKÚ©ø;ÒI±é+r uîGwSëª õ¤GŸKU(wüÿŠºÊ¶~"ûrpò¬.vÙÅÓ¢6Ë/<Èt©~ÃñZ®~®¸Ý)/ƒmÄsW"ðsR›ëý ¯>Oh«[~¸²à9ºO,¿€Ö¤g³¦o´^;  |yoÂótóŸÄÿeœï‚f‘Ïeˆ›rÔ9MjØ(„¥?gÓŽÛ'#»EŽnWð†t#Îhþ-ú<Û ¤ÇdÀ £•ŸŸˆyßÏKn:õ-,¿Õ/>ÛGxV¯Æ(ò“K.µð2çªúJòyçq^Æñ :\2?Œk¿­_¹ì=ñ7‡áÈòã׎x±Ñ ‡~ãÍzÞÎÑbý^ù’ÓuG[âˆJZFžn}|°yž?Ôů ç¿LèUá’çE€ø]FÅ"½¾6õ+¦§‹î~ùuÌõUL Îßgܨ½¾ÁôüÖñË{` á,¸”oP×áõþ§ìG‡æô~Ô¦¿ú„«oÈ>'œ=Ö|vâB¸æ2Æßö¢gIKñ°z.®x(:îc‚p,!ÐðÜYÏŸðw(¤ëÔ(æ8ÛÇ蟳Wýðü&ˆQ×pæÙj¼5·–r<Ëx|n:mãþœ/Ï0[†¢ÛÓá“Ðï ^×ׯ¸^·Ô±ô>ßqúz V¼)âê¾"^FWCÝd{›h¼A½¾îå†ú©æŸ‚×iÜ]ñêÕÕúžÔÙÛú Õß=[øÈc}›?c áZ¨ó0ªu#, :Ó|\ðk§y<ãwP>óë©çß%z]CWVwtŒ‹Ó6Ž··®ùk´ÿuSuq=ú ,fÞçæ÷œû±x\qb¦ú`M¶ÝKnë~FÇq´N>;—&Òk²áDxß*nÈeþl¿gãž gÐ ÏM‡çŠ%óUú‡~~^8N[·ý0s³Þß{<òy óý# Ôz[kÒ÷ðÍyÖwQÈâˆÞž:«ýo\ Ç­:Ÿ×(†gº½ØÚÂé_ ŽZú§oýÜŸOý­°©¶˜×-¼\òWQo1øõ®†fÑq¡­‹|ž2tÒ; ]âúÂþÅ’ýËo¯|R=¯Ñïäm†ÿ¾x?ãÎÊ´?Ó½ûD ÷ãÏa¨¡OÀE"F±a}©cˆ¯]ýAºî(4ðñ–¢¯×õ3ø¥ÃÔ¾$¸ø°Šwéï§ ^“µyë~}Õ8RòX3¶ô»Tû_žª†ë.ÏíõõøÎ÷Ù{Ù¥bû…¡µ!ß(ëýÕ÷Öµï ZߺŒ=·¬‚Eç‹ø¹š»|4ñ`ÙúsÍ1,ÿ­:_Ýq–Z¯,¦úØeDçcwž£/7‹÷ù+;ÄzwÛÛj¼·ú7çýPŒsù]Ñ}ó ¸‘pœm¸Å¡WÝ)üTÖOŸjÁÒÛ 'r•¸~[¨ßê–GÅï87WoSõ÷¬l+®›üûÕgÄçwݦÇ{^q}7mסùA#IiûqÿÖÞ¥>G›zŠ÷åªËÅsPHõ§k׈çïöijŽâªNÄ×ܹÎ/%ã´ýEþñ(åéu‡Ò6Œýe<Ñ×Ó'Çñ6x¼‹ŸwÓa—yà¬9h€X·Ngyñ{^þu>Õ™:óþ¬Î3ï95߈ò"Œ—a³`Ã{ΉοfôŧÇ'„ß×㺜,Ž=à‡{D?º¤ÿ‡ü˜º‡Üð`hmØßÂ/3Ž·ðެ̛ºUÃH¤Nvù·&C©#ÿºV:}³’šìÿÁ?GMÏç³ ù[G*'ˆfz\ú°ø+_}^‚}žx`‹ƒeçüæ^s¦ÇÓQÈ!Ûõý#ë*àGêóƒ©\?nÁa‹¡Igbqºü¨Œãâ#Sœeg·ãv{õ×AÎc9ÁÉßå:-·î|¾/:Öu[’ß)ãi–?Ao Wþ(pÐÈeßø‚¨ë毘,øËcz®kÎlj‰×çýÞŸÇ~ÃzN¼hçþDÃ…î…+_,-3Í£¦|¡÷øÕ+×ï2ñ—ÐŒâɳ\Žx|®‘9½ÿ¶y8cÜ9¤ÛZ×Ó_’8Ù‹E¿ï pãtªÇ[ô8x÷¯•ó –\¡äïK}šðx“¯Pÿ=BäcÑ-úwau{±Ý@½¾F’¿@ú‹XR¦žÿóÑñ‰ü=—Ž‹¯ ¨nU×ðþpžôЛÄuicÁež¹Nä_>:9xåÒЊt†¿\‹òË»ŽªuÓÅBï-ÒÕɲáµy]]ê¡Æ=ºÿñ¶GÜú@Ìù­6ê¡®Ù)®‹ßm_¢dÿ>ïýûDëWâ¦Çâ[¡åÇ66‹~~qÑDßÖ'mõ×Kò2¶ÏM§^WY†aéèÆ>~5ÆSlÉôA^HVG‰}^›U=ÏØú¢)ïV¢ò 0Q?G,uúÓ„^!Ÿk°AW·ÓcàÇo@ú0ï;ÖÑÖ}K_ßœ×_赿’N}‚ç9CÔUÇ(8Lyæ÷³‹—Áèêúú¾!ï#òÜtšÂý¯#®z*Ö¼ÃûÛ££ŠŸCÉž åÁú®¤¥ßº„5ÔºÃÅTßÈ5໓ŽÒ[Œ×Eë¡|îLº¼ãÍùYä<÷{ŽmýÑqqGêûÈêKŒWóüÁ \Ý_Ö)ŽÑï•øMê?†ÉÏ©º÷ïõñù‚“¡›ÙšÖíó…>~¨¿=Zõ—C}¥ó¿ª÷o[1ýªË¨?P íךÕÉŠ™NƨGÕç½XünŒù±^?{Ó2áOW'ÿóÒ—z¤§Š“¬í`á̤¾Á eê}XúžzÞù–ùå¨N U\ º’>Ë-müp8M+Ÿ˜q×|ê÷¾Áý ëq¦®Sq»ü+n¿[ïFßGãq© Ö©zhä©ëU¨.1÷kêûÙ–ÞÏ-?ÿž¤ê"ûöýpíÇ…mëÔ:ØŠ÷´ëÇ …Û¯](â¦I„ »²ÐOëdtöëSˆ|K=\êÈ–]¦¯»:öóC5ÎrÙæTtÐç=ŽÌ¦‡ø?gœÒÅÓ¯+ïEø»kÑ|7ú=í{“q<Æ Ç%óò+±«¡ºÎ¯ýpá÷ôïí­ôù „ç0@¯ÃnÜÿ0ùµÄ›0ñ/Ð[ærÕç´¾:ñþÇ3éí–-Vס´ŽÞ³QøW~/þ'úZ¢•#n¿ã…Lz#ò¯÷ñ›±üÕ¤NÑësMÃøò ¾Ôu×ëë§åõçy±n/ëÔŸ³U>/ZÆ[OÐŒéÞl¹\ðÁ>¯ þÝ Oûž_ýõ)oÞÔO¯@öe2ñäe_\S_‡Ê¶à ?v÷bÞÛò„¯ê3}¦éðüx_Þpü†ÄŸ¿®¿ÈÇl¾ZÅíWc}†[òhçbÙoTžÄ¾ŠÁe»–Ÿã§{ºê+"®®OÇÁù8¬ïA°;Y}ÚÔ/øßÕ’ê΢&ʼn7•«uŠôyÝxq‘±oó¦g#ýj_¾¾‰‡‰Q{UÞ÷Ö—ýê›ú‰÷zž^ï,<>̓ùµó÷GëÉïW4W×Ïk‘Êó‹)jžcÞGC?7Lk©æIjŸîF‘ÏÆÆKÅ¿ }qÑ‹Ö͹"ñ…|Æ#é*ü2®+ž—ìk½£}äïÂu¢õ=SÂk Ä°>,)ÖÇqkˆïîÉ#F{¿÷íÓÍ/Øúš[ÏÇTÈ5ôþ¬z|ÉsܵS]¯woÒ‘wlã'™të°ùês?æ™X~ 龜·ëjm>Žëa`ØÐhÝ”¯_z¡S=/Ì맬+åk8c˜_]b éLîeu˜®"à7Õá¼Ï«ƒ¨Ë£n<|a8ÎM‹û2ë!·<ûø"åß&¿’óÛMu:ÉãăK¢ãº+¯ÑëŽQ½ í®¡í—Ä34fùÅšñüÔˆ—6pàÅÉÅÛ•†æ—\Úú Ðü0ã]/ÿ>xƒádʦ9͸åK^yšàZ }½ÂqKhû?ÆÃ-¤eð4õYc:HmH¯s¬Š/F¿ruÿ&TDzÍOW„ã–ŠØqJ…n±o^Ãf˜¬×Y=ÞÙW©xÉ÷+–?Œžéô;ˆkqýPlì%æóºê¼hÃA„Ûôq*ÊðÈ;‡wUž¯=S²JÁÙ1‡à˸­,:¨Ý*ŒŽÆ=†Ûq½³‰ôþ×bõã+ﯘüe#O½Êq}F›IÝ%4uÄ‘^æ‡'ÆÂv±êíh—ÎüsÿS¼O‹ßRóÑ]Äý•ë’ô¯Ðô~ º©²¯iÆçÇãù hNëÉx·ç4ܯ;å÷—<%ø6ÅÌ_.vÃûIÿdU'ÁO9Àô©e]hËïUœåp‰¥¯—ÑÓÅï¸P­_bÒ ây6à†Âñ-}j} +_ŠÞ½üâþºß=ÇKøkt‰É¯²¼ïÁ¡ìà'°v“È#µ5ð™ê±8¤Ë#5¡úØß ßw_}³ùK²þ&¨MÏó¬§Ež”å/Ðù9êkîVÇ ^¶\ß¿3|ÀÈߊ÷píUgóOì<úPcãçt¾ôþ÷ï;6>~J÷¡ç:¨Ø1Ö‰×']K6ßàL!Ž‹Ê”í±èWú|PŽ£ŸÅóÃ…LWKö;3äóù}5å§xm›áºÿû½•NÞ'­¾‹Ánâ…v}‘Ö+Šjp15üÖS™Wàx;Eë«Úú¸[[H¿+Wÿ¾KHô˜ë~ ×-?‹"ο§­ó÷{>ƒŸ³ûÃð¶ÇéÁx™ÉÖýàhÌ>”Bo7=þàÕ3ç.Ïj<†Í[õz ylþ® ¼)VﺻÝö_ØVß7êŒÃÑñÄŠ?‰çè²õ©ÆÒl<‡´ -ܶ“ýÒÃýñÑÆñ }Ãþ]-øD?Ã>§ß;ëļ?€âä’ÁÑýŠk9]\¼C}×~ú”Š|/J<ëÂÍßžòYØ”#übÞÏrùwÕu¬”êH-éß5H¯z¿¥¯ÒbSŸ¦èy܆§BmOÞÄòMâþÌj¥ï–çÉO¸Zèà`G 1îBñB¢]—C”o3à)Ò2,9W¯³B¸*k.ê?`ºŒ¿‹KÄs1Ÿœ;ÏO?à-öœúK†ßÿGËòon¬~ÞŽð'à }¹d^ªo‰ðæßÍ?“~Ù%GÕç~å⹟}©ð›Ñ}µà°0cé+/Cit\€¬¯Tuöžom/ò‡óƒX~z3½ Â#ÏrßÊÏyˆ wk·ÃªKæò¥”GÅÔ˜ý6~íæŸ ­[>«YÝ­‡Š#Ç"}¿Hl=]\‡³‡Qþå5zéì¶K'_‰e½ôç³²–>ž^Ø@}î[Ñzvï“âù)ùHÙ§ éùŵ¸xQt¥¼={.dß%t$<Œçl—÷A½z\²øèà7>ï?sªX˜‡¥<'®[*ÖCÎÖïó·Eûå|!S`³ÐÀ•GÕ÷ëúÿÖ¿ŬŽ~Ég³ïo.å›êuc• ªK?õ(¯ÝS{Ðã5¿@:`ҟö'ÄöË/ÏJ}=x•ÕƒþÌó³/ˆùcÎöè|ø«ñÞknظN¼çŒgaʷ㌷E<Øå¯y uh,d<–·÷Õ„«D-w=?Ÿ;ö}¡Æ&ÿè¹Y¿D}/n|Þ Àïoð¹ÛóYßÐ÷ç¨çÇ„ýÂkëó˜Áï-ñ ³Ä|ÄtB$ÈzþùÌï]¹P}ïäûéY—÷?NóäÃÄ8w}êvß;D篱27ß{8¢¿¯Iý®êùù˜õWíï û€1|Jp4]ÝL›q\™Ä`š¸Î¶þÖÁ;ìùº©¥ˆ+NH̃-Ùü¸p¡Ð›ú“~‘¼zþù?çuýüqyu—Öaõþ;U¼ÍÊÇÄ:9ÿs7¼0áÝlÛýëü6ºÍ e–uÛh}þ`MXyݸ}j“Š©Þ'ë=×:êÞÓû&õjú¾©êÈt0ðóÖlÒû;ËÓëÊXð—ãlŸ¤öIû±>.ä}zÃýIççSõœ>d~ú1ògZ°xôå¥ú›põ õ}X=^}R|਀Ž,þëFü•úü(6ÃèC÷Ѻ‡˜O÷8ÜÿÊ¡"î`}ÑAŸÏDk N·.›ÝíñþhR ]“õÃLÛ\ù·+ýQÙŸ]öÃÇãÖ¦:&õà³ýêâ¬.ÌûY¥m˜•ý}—¹^¸qô æ¢ïêëX+'ÐüéV7Ä%ߌ¼~¶ü&?­}ÿ¼ç~•³eœÇ²¾zbî#z½‰§Ù7G÷%Ê_ ‡éb©Ð7ùM˜x&ãø©;Ö ¿“Ï{sºˆ¿³V‹ïñôè têÐ@³–þlð9Íg3 züíX¼ÑÅWîwþr·íH?4c>Ù°%Ú?»gŒŸÿ?'_ͳ\wðï.ps¤ÿ€]tý´qß}_Qq;wߪçÓ-zz¾}àÏÁ‡ªŸÂâs¬ôó“Ç©m˜/š1\Gè|¼<НÏþ~"|+Æéu Ðp]éóÏ7Þ=Lj¤õ$O€ëî †¬Çò,eâ|l}båûŠBz?>QÇ“ó†É¿Í8nÓk6ñNkêç™ßÃ'…¿Ð:ú9~ý|àêQŠ¿ìc~ŠAï[ÞOSçŒóðäp¼zªúŸ2oï:^ÆùPˆ5NuÖß·0ÿX“öo£ŸŸC¾maýgï#®zLŒ;DÄYR?>ã|WwŒæQ|Áü—ÓÕõ’æ/ɃǪNÖ^.æ¹Î¼íg¸áVrˆÇIøg¬=Màd¨Ï9džyÓ.3¢q$WÏó/ÃÂñÉ’}$01;ü ”ß.â9ÉêBxûú8™ã(ÂÏ¿Ÿìüxœi=ïEëõëu×ÇÕºf_õ½øëùæ}¿†Û1œvý\Oº¨™Ø¯)­ eW ÿe}ý…’Ç{ÝÓ_žt[äû‚+~¦ÇÉ9Ö×l¸_œFþKSÂÓ®jP¾Cú£ŸTyÔ½ôë>Êæ‹çî´ U¿Ÿñk13W|ÎüÉ‹õ`»‘_–ÏpŽ£ýtÉ“âuoãu˜¥¾®âˆÿ—þ4Vß©çëLº üd²ydá—Õzˆ¡®žq~&Õ¡ {Å|á.yU_¯·Œ¥®êôÓêâ¶›UœÊ^懓4ÖåFç!fl¸¬cÔ7í¬M‰ò/£Þ?ê®ê­q½´‹~žP@óöò¬„ê×qÝÙp;òÏЄžG©8ù€:ÿN µ\ßÿ5.ÍË+Öž’#מ&î_¾>’q˜ ‡|Jyc£ÈPÇ 7]¦aê}Fo—ú3elßCÔ1Юãbñ|£q4“w¨ÿžªâÒBœrm¶ž1zS=2_ÿ!‡ö#½ò Šçǽ¦Í‡ßçRŒøE«0óQÕŸ/ ¿Ž:ná~}ž¥¿çèë>Lÿ ÅT'jÌøŸuØz2ù»z}Éfìýëëg…ûudy¦j~D'O¼E†#®Ãîߦzœ<ùM¯t5W üНN:ÒºÛ!ú:¡ ùuôÇ·çrÂç÷£ù¿ýBuÕϨžPß‚WßÚZä 82>1ìû7 Y½+oEWâ“úõ{ ÷7ðYCýê–†ïûP߆{—yõ…ì=jÃò›7D¯OÅ&^•…:©ŸX‡Z. ÕCЯØôœ5®Vmö·Mã¥e®þŠÍPÍÐw5Ì?ÒßÕë…¿R=O «#ÎÈ׿·äCÂíl8LW¡Ö£†­#üôX§Fçù¥õ\„Çùl²ý;ÔÇÕõãé)¡LŸgq“-üôü}óá~¬áZ3ªGÇß&^Ç)îá$Pæ‡s±÷¿ãš©îlݯàå©”dwžÁokçiãŽo ܃/ޱŸ¤‚w öQño~ï£q¼„¸ìÊê›Î N®¾ Ù2“mêÓŒN%‰î¯>ºê×¥ðû¡ÉÎ'…Ö ÷Šß°ÎP/V翤ýH3Æ_¼•åw^s¯!ÏÉõºS»z²z}\Cítûr z2]=ä§£·l3׸SoH¥þ×2p|~ ú¼—L‚õCLû} Çý.ñΛ¸=ï&],ä3ÞWM?ÿç="ê‹?%¼ÐŽYn¼ÜÊѵGß Ò{kžÎºƒÙEÞ¼ßãNÏ¥‰*ñ,IÏ'®aÆ/Ôu«C<ýT›Ùú‘¢ÕcóØçWÐÆoIu %ï*îþá8ÜòùÙ2©»lÝî4ýçÁoýòX(› æ·ÍÕºp>«Ç–Q}%WçPBüÞŸˆë‘úš¹Zp(îžtü‘cSY§e¾_é+Æ}jãIü‡ðü†FçЋp‡5ýžOôŠ—âøW ¢úf7u<,™§ú­„/A-–8D~5áf9Ÿ&¯mvpèÇqÔ›LË$ÿ%<þ¨ÕÑx—Íw‹8Õ3î ±èïµç:x#„?ÑŒë 8ò·mõÿs{ºáÛVŒ}ªšÌ{bzBÝ,‹¿$㌌<Φsž`æ7.êçŽú€ Ï×ߥi¼|Z®Ö‘/‚òß*~C¨Ë6Ó-ÎtÕMÁZŸ¹»#OÐÀ_IÚ¿Ãd¸XÅK|†ÎéúÛ„> é¢â¶ÑÑóÏÝÿË_—|JŒê¡Ç™ŠçŸ} ¹ yÓ„Îú¦ƒw ÇmšN}Ò8~1Ã-ëy62ŸoÂÅì|ÏÑ0üspH¿^bóÀè÷f΋Ñü¢-OiŸ{©£nW¾BĹ«žÑã© ü’P?Ñ€ïÀØ9êö”_—¼Ïp;Ç>¢Ù2<õæãÚü ñ·°³m¥ÄïÁ»Žz–>Š’xñ¿«Þ &Xtʺ¨ºDè÷C{ª‹^ÿW½÷5ñùib>’}Pp#é_´xþxý,ÐÄoý´õB'õz¯ŽÜ7.ø§ü™Í“úI¦ú[E.xM}>‡Ó¼"ý®Rñ†:žø©à=Ãqk%ó œÿy4Ád(”¸ð£õÚf/Ök'먦Ý÷6ã¸Ò?k–Î:™–I|°é{8F&¦z^ø=ùç&>¡Ípõœ¬úw&óÅ•¢MLÿ©-«;ó:ÑmóbÕ)¸¢ó~†zgøýa?ÿuhþ*Ë£¾f†>>Í ü‚kÊÓ­k¶óëÆÅ§e’Ÿèº½ ¿!ûŒ¤svfÃŽÿqïyûÄý?çÇYéÓf=^úº•w±=ã=J>¨©Úpîü¤«¡ñUo<®âÞfóFƒ®j̾Âáþ–þ4èP.þZð!ެț᪟ߎx²õ‰™Guùyõd8®à ýûdã³Ø uýæÿ¸ó³óùS¼°åGñÖÝ<êÇ`ÐçŸb]?ëO">þ7¾OÂùcÕ:ip îHžÇ5ð¬Âï‹×Ī"'Ýùã üв¯Gú8f…øY({'+õ äÑó^è†ëýCdŒú¥Óûˆú³~†ÇL¯ÇÕ\uùL†¥K¼ü”Š6 ýú–íWNEÖ+ú¸áñ-y6ŽÿÇÔå~ãbðïG_Z¹ý¡˜ÞZ¼„é^ìÍNŸáð¸5 ŸÏu»>¸s‡Êç0ÄSÒ|uߌÇÅö 幄ǽìxt}ýôîz”„zZÙ6ŒHGŸ7ñTÐÆ-ß—m]wãq uc´‹Žƒ1LàoПòº¯;Ö¹óãá@¥N„ï~áq«9êË7MVÂ(UŸYê§q=D“™ú5¡¹Ûu«ìº–¯É8Ÿó?¸¡ÔÀ´ðÑÜ“ß~$üæõ‹rp<ËüfÒ³ËÖøÒd<ž”ÎÓo‡zÑÏ1ΈÖ÷ ÷¾'òÄÚ¼¦@ø£3ÿ/oÜ¡ÜwÅLz²•e6_C?Ý ïñ‡ç¤ºN‡ã5ä+]±|bn¨Æx\8nqûaÏžºRYæasü ò“ñ.0 %ÄNé>ÿ¡6Å\O»þSÄMgw©Î“v}ÝTAƒ>”‰wTÊên)顨x¢h®ÿyéò÷| xN¿~Õ6ø­ýî+úéû®ó:E°ßp=ñ‹¶>CÆýL8´®~u<ûëÞÇ¥xШyWËlFµÐç÷ ³›ï°™ÔÏFsƨaÉk$äÃ8Ÿ_nvãc®"mCûìäE‚˜ŽÕS7ŸÀ«-VóFèÍÇñ#ÑÐÏŸD™È´®8¯ï´ ÕK¨(C]Òq±àHœÇcõ1Îúãxù4s[gqWa4Þ¬¶þs×> ðšÏ´:oŽ< [ß©Œã ÑóI3Æ% ›ïˆ|_Lë2V×Ôë—l[kýÈÐ…NˆWHË\qªRŸ7x#¥üº¬G¨~X°']\’Ô'OkÏ‘¼Íü¥U/èy]c™Ó€G³‚«0å5+Ú*ZÿQö#H{\\¯ÏˇXiW«Ê­‹I–E?êçе<ųò8þ¦æÊûjÒ‡CkÒ{_|PÏ{þä¨_¡qLý±7´¤†å?N4ÿð81cü¹ù*oñ~™1Nãè|0îì.p¨w<Ï}AžŸïžt|ƒaܾ©AŸr~}}RöO[z¯WmYJqÉåM”up¹[ÞËÏŠù{+W¼öÃRyOd»¸ûKÜ­õ8ŽøuÙdžëXdŒÇüŸ¸ë-V^¢ÏÏ·§¼€¡ï^\Sõy =ëC½“é@qýöpÜ’tp„¦¸;O£á_S?7éÊÏ«¤\=óxù>`¨Z—E‰^ß§æ: œ r˜>ÊÆ‹Ôü-雡(¡_4yœÓþ²O«÷ø‹n‹îßòN:8<›I]3¬ûF²ëuÉ5ª.û¡ŽA«{І«_†…ªS‰òͬc†üPKßs _\!¸.ÔÏUŸ2¼Zp¦>…ÉꟲÏÖç;ùU&²ÍлI"?£ë,1*žŽä©où')éô6§|[Ûèù©ÏaÂzŠ“]W“ûëlE7èý•‹&Џã7nx,lOOo{ÿȼHXW=w®[¿ØÂxþ:zêÀ¼“¬Îd{^ƒúu>­>R'‹¹ö[Ǭ]±òJÆþªu,ø'Ãõw>®'ïƒÜtÁ­Çý¡cÜšÏò ×yKËä|{ÿ¤ TšÐ/.I—/–ÔpÏtõþ (<‡ u'<ûƒÏoÝÝz¼ã•gmÕ¹X Xô¢úѺvÊó ç‡`ï{ë/ôzï/ÄúYÿÚÿˆí}H7ÂxvèNyÂ\‹MB¼upÌm½´ñNuËV]ÜUw1©¡:{~ÚòP Tÿ½áOjÞa®h¸†üèù08¨þ.Ù_í ·õ)ÕǦþU߯•ðÛxlæ\å}÷Ô‘C/¶ŽÍ¾&ÑüŽó÷œhä…v)×YnZ­ò=˜¾Š„ßð¯ytûžºþë‘ñÓªwõóãQ—ÁÍ*®·m‰ÆW.ú­XWoÿÜï÷yòÂås ýZëºÙÏG¿^&õßÇËuÔ-oO¿×·ÞÔ_ß—^궸Žã«Ã`ë ˜q>,‚«¿-êkïyöà8®üdº_Æó]P¨æqfõVq¢äÏcú[nu|êw‰bêk1t¨>ÜŒéà·ô¬µv»²›ÍÏVë×oû½ÏãuÈκŠK>©U?&žõÌQ‰®·©î޳èT¿CÙþdÇïjÈõK§îüÃRïª'Ö}Ô?µÖyôJ÷yÌÿ´Û£ó›‹¾“*.ÊÔ%c»×ôq%®xHø=³«ß†sŸ÷ÃÅŠîOn×Ô±Oî‘ì>§qûbaz·¾'Mi>®cÈãµÏA\ž¾©orÆvwWý¥Âèëš¡gr–¥ÈK,þ5øƒáö¿2c;Ö§CöG5â=§¤wŒÉúy¹ƒ~½B©èÛ…A‡T=Á¯ß­òä¶¿£úa‡›ú'qsíO'õhŒ¿o€à?c¨¾FÖ—Òê‡òß‹¼ò}ùnël¾gßë.œë.×ãÑ{ˆ€õyî×a×F5Ö+º/¨ìÃþ›áãö1¶õ3¨²“Ãx½¨N’Gùâ”ûÐKœS°áÏgÎí%}œ’´^†Nø¡âAÇ€,ᣠ:јßKÿy>Ó]qw¥èߢI:õ(´HÈKí æ)ßPš±oÖ„u•¢‹Q§‹<ñQâÖóqîìTyøÁaÙçç2µ¾Jø‡à3¶Ä쓉œ´Î8ôë)†ëãR“>¬ÔwÄ™j\.u%0ÑT‡I ?ºª•Ö?í¿ùÓ‹Ö ^Ç®×ôø¾I¢ñ¾>¬\=»SÍðí–ÝÓÀ©`ùÂïþ‹H¿ bÖ™&·SßoÒ‘ þÌòëìþ#OïÿK}7t¤º£¥¿5:êùš®zßû1>ªäË£¥áø--¸0CŸ.MY¾¿ùMŽúGr^ ñýžõjäGãù3ê%žº˜qG<|ó=ïк_ù½ª^ÀI¢#åj˜{‹žŸkÐÓpÕ£KŠ»C=·ú1žxé„_Ž)TWÛMu&®cu »º.RËø}‡xøeŽgE‘ß~_—騵¤u½•#ßa±˜(ƒct›~ø²-b½ezõÎ}Š{Óýù³¥~Õ^Ü7.6®¥Å¯ã}žOUCKCüJ}[$®Eì¹Ât¡Ö.²ctþ¦¢ K™^C'õ¼lëxp bxÅÙ2䤣wûø=+WoØ×ðí ¤®ãÑq£ÔÅϾ»óDÜÒKÌ[œík¦<À©b¸î6½®u7Ž7q5®×.ý€×äxýw±2ae¾ˆ .£î_‡ðâlĘ㌺+•|†4®w_ÛMðJYž Û~ªòÿ;îºáF y;4 |hu†—mM~É#›ÕzÚ]¿ôš·1CÕƒÆLáàbÇ.q½//þÎSóp¸Bô¹DsŠ'[éÏßu ^¡ßÙŒê–ü¾®oÎ}µèÿc„¾ :G×ñ3¶¨ï‹f2ÙÏu*&~2åÓ2Îë퓌÷VVê†ó¥×9GwCŸÝ› UÝŽ­Ù¡ÐÚp°¶>T(tÃ…I]„p¿hý!´ÐÏ×’w€aª~:–=«?&‘>«#b…*ÂàCÚë·ÎŽ¢Så›ÉùÕTÅEháÊ/ÁÛ*TGÕÕpý©Æ•xæ÷¿Sž3@âd}_~B]φ¼vJùËm&\}•š–‘Ç—¸ÂA»òj|õïqÿoE6ïšp>§ƒ^ÿöoCß(_ã}²1ê6·uoÿÉÁ»A±[· Ò×)SîÓçk8ï¬dõCß•¸¸/ù<˜ôMp^mµož¡jêý+©'‹qלÿc}] 4aÿÖ–¾%gž'òË~¥¯ãuróÿÐH‘K~N=ò×<û}eÛPG?¡ºA§¥‘E·µƒ]óߙ/?•td•Ñ7ƒô±6O­tM3ÎÃ&ýsÚþæ?¢ËI áiQfè'ëÆ\5XúF±Ôs }§¸þŠ(Nž{¯öúŸ¤3ÿ£Œpœ …þ×J»Î·®îjè³³Bô9Бñ÷NËÏ¿£nÆÍ¯”¸).nÖdh“]þVZ†oÕp«g3} ~/uö¨-þ«õ¥>6eXVê…¾ý€\õÄÒ9^X+Çý‹õ:±®†¶TÿÝ÷ϸÿúê£/œ{j¼/Òð½wç“ÍXÇ®DèÊîÿžÏÖ¦éð=uí2öÿ“Û:ˆ††x”üþà­“«ïºÍЧ¡Šãë.æS›.ê©b®:¨ÁA}Ü|ÁüfKÿçÊ2ïMÈÿwÔûÂÜxüKô×óˆ%Oƒ×ãlúí¶|Ž-OrŒc¦èõ¤eœbÛ?ø»©ÿ8Õ1VÿU_ÿXðRvyö¬*rôyŒ~ÏDêï¡›Ê;A™¾>¾ìþ^rÈMïsn¹>¯2³G¬¼sX¯ÔÒ+®É¨§o*ŒÖY´ô •uu”ø<‡€Ej“>l7uKܨGtŸ´ôÔþÔoþÀÆ?TŠ‚ùÓÔ÷ƒx¯<C›ÿI?ËÕÿGì𱦣×ûjñð—ÙAÕÝ:$æ•“]W ¥Épx¦¼jÄ‹ã‚Æ<Ó^=>7Ôi;/šßÌõ5Ó6‰GuÞ~·Á‡3é|`ÙËêºR+z]Æ–:"¯¸âõhÿÖwÙ¯eW(ó i^ ë¤?\„òè.^ Û†‰*^08LqÍQâ}ÉþV­hüœñO=ûÿâ,vëøá~¤®WÆç1ûgsü.š:ö²Ä¨OxîÓç&š—Âã1¾¨}Ÿøïà}èƒWSÒ¡êø#½_Y#¥|xŽ¥neY_ÃzCÛìêÊÄ5Ô¥¿ßøÒšTóÀ7 ÄQK>jìñS|@ÄQÆïd3\½:Þ~RoožŸÎP°›ö_?G¯cIó®kß×øª›í>ܾú÷¦8>£_â¸Ýâs6ÏaåmÚßãú¼J>ÚFûÏÒ_písQYfÂããû–œxnsXŸ:eÉêÜ\yg(y@_wî®~žÑõQÆåsÄq™J¨nQ,ÖSŒ¯ßÜU=SÁÑ„ú Î üTB}“Kö¼Éxu‰ÛÏ:cü3,þy÷hÝ4N„yYñ¿qß«'Eýäd7Tgºkê-_J¤#„•§‹³ÞÖã‘Z¦£³oŠëÿu|‘?ÁS¯þÀ‹ÇqOMûN¹¿QZú®è½†ÅåÄ£ýLVúÉÇ5 Qû`#/»¸3t'¿#ÉxÔèNº:Å¤Ç ·J"²¯wÒñ¬Ç£õ_¹D̓w‰÷¼£‹O `ýÊÆAá¸ÝÈOlæÙ'†ú„G¤Ž¹~;WÞ;†oŠ^™BÜþ­Á¾ìà„eú´ÇŬUÊ}1éµ ®áó ½òZm2xœ"½Î\ø}5ÖW¶éFÈ>Ku}û‰oއšþÕSZ'€ëš ý?Ž•WáýÙqù §Œ«ûÆ Eå~Ûï:æ¦+K¼‰ßF/µNŒÒtòøÑHõßÍIÏò#ÊGö~I°ÏS6Ÿòn-hÝ øÜÖ·kK¿Oö™B³x÷+ØCø†sÜò("Þ9ã‘¢¹å¼sÈŸrä?†ûÕ³èÆçèý&NÆUß9Üþ`B<õµ²ñ¬0ùˆÈ õËç£V6ð8?Uë ®¯à·ü®­žM?<?&ê^%p‡ßYÓëÄóuÑjí1àúšYpüÔï ;[Uª®·¸|<´ õBmê;`È_fl_‡æ—'/NE<®¡ç §8ýÎKâÞÑŽõcxØ&Õú;Š÷TîÙÄûðÇÔ×ësGþëjãŸÐ÷¯ì¥Ç³glw.ÃΛ#ü¹‡ÿçDAÄU¿£»‰<ÿž”u@ÿT}È­¿æê ¢N5í%5qözñœ^ÝRø{kôM·O¢¯¡QÅ讹ÎÃÒËê„;~æWïT7«ùan¦>oijÒßäéש{ÿS̓ڈóyŸáÚ>ÏnÜlº¿¸­¯àAÈzR÷“£/‰ÉÐÞÍo ¾¨ Ô^oP‹x†¾Ê2ÿ‰: wÑ:o3ÉÏ)a8Âöt†>°!r¤NOø|D¿G × ß~ö» ðdhäX÷¤× ÇÓï¾ãþÃjÞ᎞¢žšOñíyEêö× Wó‚~˜ Î ¾=õe?— Ÿ_šlÿØÇÍ¥þ×p»%–|vBü¼Mg?ÜÎòÜaÃß7"\Ùºkõ<úÖéè}¡kÂß¿ÿÔî÷6’ßYÃo^hàI÷Wõ‚wižhnÉ÷Ð×õ‚£é^ßà >?†‘^`Íd¼šàpÅøÇRïMöé³n0^ÝOMüJRÒ xºþŒ8”Ï)Ž^þw·üHù|¯çYö)÷ÏeºŒ?‰úzÿ/îýFý¾ñú¼:Yú›µ"¼Ë9ßÊjþuÓí£ˆçûá˜;Ý æuîÜé—òz¸M?Wâ­­çÓŒæƒzêúæ\Ÿš#lÌc~q'ÎÑQûd5äþ„ëè&ü=é7aD ½ÞÛ–÷³‚7 þA}$zëûJ§e¸ál}=ª¶E÷ès·|bØ_÷Û]T¼Ñg–¾MåÑ:vÇÉR k©%Wñà²tŽ÷‘§]ÙÓn}>HOÜÄ@‡wRésøŸ3DÍŸ—ýAYßW›¡ë?»yŽ~]£çm r¶ðkm¸yœñ[1o./Vûwå;ÎÛMÔí¸pð2ÅE[ç‡7T¾éÖÑï'ã}øöaÈÞW¬¼*•:Ÿ¬3alyäv(ŠÖ]È—ú¿£§çúÕÄ·¶Hæw`pºº#I-Ä·u‡³´Žÿtã9t‰§Çž1ã)§5ne™ ß|aÁUÎuRèÇ»âD} õÓ=õú=‰Ç…¾Ï#7©?eëcgO:ñÎ]šh@m†sôläöœîwÞôDq¾Ä¡͇Ãõº;r¿à%Ü‘£ÌãÜ?D KŸøßÓº—#üà(Ó±æ<ŠŽåâï­#Þ‚p–èsµŸ¾1Õu±tˆÀ!Ìb8JòÃ¸Ž€ÄAââó£ë<ºëçW_~j©×UöÅ4žAÏ =…Nï †< >“ñr‘O׫À’)aÇãù»k2Ý‚+Å€¸õ%7~œá½É8N?.‘ô†Çò ²Ïá¤ÿL5nÈ<>á_ª3ùM‹Þ"ºŽl­§éâÁÓ2´'Þü¾xùj`Lºyöè=øj1¯´0ä×O¿"ò|³—k²ß¼äµg|?ò=ƒK::ãaŸEC}ËÖœ‹ÓöÂóqÔYBíd÷½²Ëÿ>£õW®‹ùô^É>ÞM˜NgG½6çµ£XÏ÷D¿»ÔøþSÙß°rð§ªÙæí*«²*«|Cê_ÿã ”çù齌ÿ_‘_Ÿò› Á/cþ‹YíK‘q¼BC_¶£´.åú-©n¾þˆg¿ÞŸ¯³>ž´ÃëL¶¸Î8NqÅè?&µ´úiš }“Õ M8Èðû½†þ2=ôñcÆvsf ÿªvêuèìW/à&uqmýÐ’ò8í˜^]Qvò„•m_À-Ø}rêHCÿìÄóa¿¦óÄý}çñÎÇ=çþtùÍdŸÆtëò¾¢£î]SÇühW7œ…«!Ï/Šé\Î·Éø~Ÿ#}S7cMCݦÀÏÅušÐ=»} ìö?ã¼iÁ§É~—ìË—ìì"Æ÷œ“¦µ®ó8Ʊ?¹›Š÷—nܕԜû·#ÉÏ ~€¯þ{Ÿìöo”fÒ Í<êoxœôź²º¬Egÿ¦}ŽPO]GЈt” óZ¶ ¯ÃhÁ¯ÁPKÿ¹^¤ÓËqbÇé÷å¥ë?„Ç­Ãò,ï¼ÅëÏéâŠÑÌQ߀tªm:gÎÇ5èÜ¢&Ó×ü'¯÷ e¢ž‡ÖªÔ²ßœïêóNûõ~xÈ ¢ï‡mýAG|d™ßü’´Þ”m“ü¨´ÆC!{,Ù<„?xwÙÏñªõѺÝÕ(¾ ü† '+ñ´qÏ‹ë’Ú õâÅ]¼ÿºdWg§±ùÍÀÓ@aÅæSP/¾AÏ|E¡þyå¼|ô¹!Öûì¥õËà_£ÌM7Ð8þQZ7÷GçÃ\ µ-< ªS£4Ùó€&¬_æú|õÁϨmá³/O_×ðxôùïfú}ôùYy|ôŒ§Ç„1û/©ëš2ÝžúõPö5ÍpäœÏ~ÿ襑zÝÛwTï‹IÏ9ŒïÐÛ§Š£çwƒß€žÝŒú¬ßÀ1y>ÝÕÕMÕ>Ÿp-šGë¢aý®;ÊuÉ‘÷–ëÙwâtµ®‚e¤‡LùÚŒ¼kÜÆmoáÕ£ù¬‡ãy®= öÇtÔó>UÍÏþ»†>šn½—ð“ÜÏÂäæ*îip²8£Äú ùÁáçM³Û¯™›ÔGÅð×¼ò¨(µè¢/¬¼€+^mÓ­/£õkb¼AÔ¦úg]¶¾×¬\ýNÔ6¬'Í©ÎÕ åëÃøhNœ'ûÍ¢ƒÐ¡â}¦Qªú%(‰é¿‰ÖÙD+ºÏÍ ëy½èë‰q—мÁ0Š3Y\ƒ1“²R/ãý"ÃÏû¸Í;²>•öyU¶Åå[I] tHV¯ÃìsÔ|WQ4$í~¾Æãi¨_9ý©l:îhsœ¸í8hí¦ïjЇ’Ö³| # }ƺ$Ãq >ñ•ì›Ö¸2¿æ¼}n̸·¥á:5Tï7º¥ë_»êñÛðWÞǵàìÑGßg¾žÈ_°õY·;îÉWwä— ©e}®V1ýÌ“šäÁ˜¾G?}ŸcäVL³õù±ŒíŠÖÄò+Ð:»ë ï·‡á'¡(:Ž«:¤—âüh>¯±Ï8éÚºâžx=&xÑ/.>#œQ‰ÊoŘë¢ñYý]©‚®éðǸÉ:žñûžéê,£†¡>TR9z(ñ”kË`oåúŸÜ¸nFëu`Ã~Ñ“åÐ6Ù:<`ˆÇ±Nðz»ÆÃKãϺÓì—“ÕOÆý¯š'»ã¯Ê÷’×{üuõ´ç窻j7Ÿô·òÔx%Øo™Z²¼N ý¼€«/»~L¨+AñxM¿Y]í õÜlŸï1K.Çú¬­ÿ ÉxÿJïý‰‰ý²[¿ðÕ{‘:¶Á'Žú²ŽózêãTٗϺÿT½ŽcÉK\€í8Áû׿/®–ú‘Ö혷w×0u¯þý´è7ò¾ËÙ6ÔL¶ÎU¶¡ñYF®RëýbæågþÙéýÃÍ›ãõ5àw1†úugúÞ4Hßãq3½_(o¯× â¸Ðƒ~ž'¿ ©¡4Ý¾ÃØñšWÜaÒ÷G ßÃÔ÷5W¿¾¡ å,øgü×e't³]uH‚#=§¢óc‡ìeú½Îùýñp®ê/ºö#Äc_}1ROhêÇ⎥¢/„uè㯾—Åó{j‘Žœ±}©˜×ùûkܾÄG,ÍTÁ¹â ž7”ú.ÆãWç×…x ©}ë/üðË[ºÇÂé`Á»‘óÜ$Ö¥G¿žÅîz½›¹êÇ­ÿá¡¿ |2åõÐéô¬97ºî˜°_JZê]6XÄg—öü–ò£Nù×z_Æ~‡Xü¿þ":îý¢èAOþ^kúÔy‡¿h}¿qžšï >3¬_w¼žÈ5é"—ð¸ÅúzQx^{oÁ§aì úuöÌ D~yI§¸À5Ž”~=¯7apt“zˆxuXô{+ù¥èí÷Âv¢ÆóXãÆëÍKV—EÃ; z›ÁúçBêá'ã7½@ûW7ô»òQUÿüï¼±eÝŠkÁÊÁ1˜Lò÷øçhB:#Þ×΢ž…NÑýrÑšòzÌF öÞ”ŠúˆüD¨£ÚÉOO­h¿©¿È îµÜò9ÈwÌW¾”l}DqJ}—‰¯ŽMw«ï«Ûp?}£y èa‰7ÞfÏņ/²¢ë#q–Áë”—û©šÇ’|=LañN}‹¾imÕo~ºF×»QϬ²*«²*«(CÇSC_.©I]ÚÊ>*;9 ÿ=qñUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVeUVe'›¡ìͬðwqίÎ}Ê“iŠa˜Ÿ>¡«Y8þº/ålÒgüul\¡ö3aºBøö$ѧf¿äÔ ^ÏÔ¢_îg}¿’x}©P`à‡¶óéÔ4‰Ë—zhKúÝ’·±¶G,2Ú0Öš*¯툷0çAe|©§i¿³¸ßh﨓gÐ[ºr|4_zv=µ̺Á›{üJ7ÝáÖÉô0‚×,z_0ÝÕ×»é¼wÔ¿O®}î’šœPËÀk©ë9ÿ鯓ç‡>ÝÅüBýlú)Îç3|–úÜþ(Ú2½¡7é=hÉø3OÌÖóßæ6Ö¾Á/ê‘W×ë€p> Î~)š¿Ö8¥¾P¥~}NÐTÏÓ°õÍFým㦃bzŸm}SƒŽý ýYþu¾^ç饱tBЈõÇ*ˆž1`‚_ª‰.<8è¹ý§Ñó*š;ö…;ëŠÞFð ës2·[|(ú­à'YúËT–™úøšìχ+ÇݮƬ¯½¥ofpܱ/GÞ?Œ´ð¼Z[xlïô»h>AZ/˜^&~C¯·*û00W¾ FýÙM?‰ñª¹^±OÎòꟚq‹ðx^øßÓÄ<Œ¤ËÕIèÓH‰pÿ‡–©<»«KSáK  Ùz,ûî$>t†±ç9ïú½Bõ›-~bÚ†nb‚Çòu±ô¹ÐÔS§òÜtûaûjмr.œüy|íÆD¼Q´¦¾´,Ž–ºrÁ;)ë«×Š×ÿCòc9ï7xƒÎÓ ë‹ SÑ¡âý?2¾ÿ±ßùÅB·3¾™H—¢ý¾ÞáË5µó±\÷l:é!ÿ™ôö¹n\“ý“QByÑÏÄëÁâI“¾”«¡+õ}9lÑo/ûªkeèñßj•¯ì¦Ï±~xµÓé¿‹Óÿ~ÓVõøŸ³~nwž›ýk[?4ί÷54%=‚vä?œ‘£^ϳÎy•Iúù¿ ÎÃÔthd…BoÖäWá’Ѫ®Îúâý±èœgÄÁMÕ÷2õù¯ºåµv>¢úŸù”ÏsÔ™ u9ÎZœÊ¼i–>ȬŸi¨ÜÍMئ«ŠžùÃLŸ‚÷õ¨A×£åk¦©z=¸ï¡“²zQ"]RŒqÓ5ż’Èzîþ‘>¾ì»Mè }iæ‰û‘Ѳ‹¡OuÒÍX~µv>À}Õ¼þE‹<ÞWϨåÕ—¸O²þ!á8Ǫý%è,îÛŒÞêüŸP—Åz¢× ­kè–ï¦ë*ßÏŒýK+¶O@ðWæßÅÔ]ˆÂO9ÈæÓQéóÀµã/†n÷—ÇŠóeùQ›¾2ºÄìGrÅU"aÐuÀnû@Í»ííÏ\.”I¿Ú÷¼¤n_ðgÃy}Ìêu7Ÿ§ê|¥£ãп6¿ÝúµoÞ—º†¾N·}K_±äpÖzýû¾õ½ íë•Ôd}Ä·mÒ^ úQ|7ŽcÈgÇ5ôSuRQ*ò¸ýÞh¿aĶdëù空å‡Y=ç¿?zS™?öŰžÏPŠÛr=ó,}Y?ZK=Ç·¿ºQtð|5ú™a^²èéʾ@®Çw5g½úCnzm|ýŒk˜ü=½¿Çôy¥¾¢qœƒÎyI¹v{®×°äV%ïƒÓœê>¬÷ƒƒã ûMô‰Ö»Ë¶¡)½§yÙésÀ×ÃmýpÁ—µóTðA¼þéa>eÇ ñòI®}W5qëg;ýJ}Ýû=ÒsoLÿ¶è¬[ÓÍ¢#Û%:ÎËØÞ1ÿ„Î鮯e~“¨vŽsÐ…Åï;g¨~u ýú¼®Ÿÿlþ5ªùåýP­ÛŽâç”÷Þu=AQô¸Á‡”gkFu‹õ:˜òhIMâY2ηÓáHù‰É½æ=ä»ù3üz&«ËJ|îÞáÆ»k™zKZ†>ú:&Jõø.tôëC­Øø—ÌJµzëïŸo>ÌùxŽ<œŒó9îØG³c<Þ¯uÜ’ìà…°^ô%Æ£CZ*øÁ#¢îŠê y|ƒýêYè¯Ï{Z&ûîáB†­–°ŸÙÊêjŸÆ)„ë#^)îð†žj^üóxý¶y_p4"¼ «'àl¿þgá~y”Ol®ÇÉ ‹ÈcþV¯¼>N¿Pí³Çú]áÌU~óãû†ºr5ºÞuÓÅÉ&µ`Ÿ_},ØËp#?UD—2ˆúGK¼$pÊcOî ~NõdÉçÍM©ÎÙWÔ÷1Màm±\Å¡ßwÄç¹nóêJ~îÉQG³Yð&éÝŒøeä} >5è3p„ôý#ÑYI|t°‡õ^9Eå÷Œ^/Mï»qûW’ùŸÁnáqßåÊïöÑsÂxà˜5Iôñþy<~VÔ\]qÌi†6׿%þCâøÑÚ ŸbàÁg§¦¿MüAL)pã»Omㆠ|èætp‰ÄoçëDø}«˜¸{ÆßÆÎÓÞstéèÌ´¶è…L~WðÛÈB‡xë?ŸgP&x˜X~‡^O€é ©#~ÿúyÛ¤KÑŽ–b>Ã01oâ¢h¾šùá/1Éo{é e¼uÓWß÷Ö|E?õ=‹‹ëÌ÷?žëúÚíÊsüMÿûãæ[PÍ€ï;è6^pØÑß*VóLXü¾þ¹Ï#þÜÐûÅß –FÎc/|J¼kW=¢–ÑøÔ¦ùý’N~sR“þŒóöLoÇW ÍÓßÒÒ½‘†¦ä_°uà¢A‚w³âÔ„î Q²|1jÆÃ%£ áq«¥ƒ—B'6œ¦÷³¤ÙâÝlÏOÚ ÝR:îáèu+ØKëtc½¿¶~y/Ì89߯“?P`Ø¿»…ïtİ~]þ#+¦|Öü\Í£^ô·X~rýïF¼fM懦£[a=ÌJ´ÞdðuI×*øqJy‡‹.dN¼:@eF»é„™LÆÿåÇ@] ¨®¡nQƒé]¹ê¿6 u5 ~牺Îã£ý¡.z}žà/Ñù"T3äÇî»^ø¹çˆ©?ì7/Çé>ãÄóê1eYï€[ŸÅz‘·»öÑÈûRŸ,ü…r!ƒ2%x3úþÈí|ϧ1ê:nþd°ß¢“9éôJåc€[ÝÕ¨šcˆ¯?a~kuzïꯨ•XŸ%¯/ÜÏ [a=ŸéŸ¹ébÄäO{i}îíG6è$~ùùHôM'¯“1¾£¿<¦Gyåi6Uë’ÅùèÍxö}[ªüšÎnz}’‡‡>êó‡6Y[ñÞÉ<3¶ýQÅ] ÊÓëvÆÌ3ãÉŸüÉ ‡RHïCÓ˜xâµb×—£ŸK›ÞÝûÙᣧž¿ê»Îp1©qT¨¸›Þ§ÎJ}6<Þ1ƒn´c#Ø›.£ýt¯½Ç™Çþ¿nqu&x~Ëy?âibS}¯x5HO ý»:˯tlyJ_“ücëùóä½wrÓ‰KÛ°}Pt|0Æ0¤Œ/ >4'&nÍfX¹Ö'Ý rêîÁ1–ç¨iðg_g<ôÙ»c+¿Pùå3øí=ëßïÅ‹ÿÐYèp?jUpÜ÷Ó j–ï»—Nå¯EëïV­w.fÒwÞÿ“dûW–áüÿÒó¶wQÿÝÊ€c3ô­À¢uz\NM†¯ùJ-;`:ϸ¬^úÔúÓ|©X›. ]²è÷Å–÷·ûŒø,¤w¾Â0éÏs¼^W3c»àY·ñúR}6ß ÿBõ`W\õxÃT‡E÷Eê•¿·äw­ç—Ãò”ƒŽNöI“­ã,õË †qpqôõÆYcñƒ­zÊ×]='½é˜ùWWÃÂûÄuØ9Ey/ƒOýòŒè“îyPÞfÜo³Â£A§×b­«(ÒëfáÞn¢†¥]ÕõlüÁ?Èeë_™¡n™¯¯gè°â ù\#/gÀqÑáçM øl .ÔuÝà8Ûð¸ý/óµA'7cû~ú|gø}±Xo1ûÙh?¹­~]F§¹~}øÖoȦ/ØßçnF<½F4aõd>LÞ?´ðËŸpؾ¦<ŸXrKt=Œtš¥N $^þv÷ÄGåZêT&ÐÚê{cÒûvðw¬ïšøÅ¥Xw…¨C7³ÔeYþ8ü¼›çušé§Óå]½ÎÓ¾ªÎÛ+–ˆëJרù8êw¤üüƱ·òèöwc…~"Ö}¤úMä¿ ¯úüñ~]6݈´ mSÖ¼¿±èד®Ë¤;oÒ%Í8ˆ:'†[xNl= >¢~Ãtб<ß/N¬¯s˜òÅ|ç}£’öC)õ×亪–¸4öñjVþgžÝJâ;G¦£Ëã««ŽžS_ ödG8®I¬+6ܯfå⮓šcê/”±éËKÞoÆq(ÿ:†x ºÞOKç×f²ÎdËóeìGxl­J}ÂÔWwü#—cˆƒQd¨S’®«ì;šà”ÕãÍñ3ï|ë„T¶aˆ^/;öxr¾ùöò .~ƒ ‚Ç{þHw9¿½R·7`üça‚G/û´†yKKìpÿnÑx>´vÔ…0ð‰Ñ4Yœ‡‹Tü5¯ó‡Û•zænêæ‡0èY»Öðµ…G¸ê¥h¾ê¨QÑõÆgÅ`òKw;üˆ*Kl8KÏsG‘ªïãÊwHí¼ªò” ÔuõÅ ÄûÅpã~¢+îËù|™Þ &Mu 5ÛÔxýÛU~úŠú"Îî¥æ‹¹®¾}¡>O²Qªp+åXŸ2|y¸àoæèýdüìæŸpí8õx#Tþ=¾>EÄÿsT]}´d¸=Â_°ûôÈŒ?Õ~ðXÙXœÿbµ_6wRçIªçãú)"î-Sûrâ2¦ÿqÛm¢Þ'ýÅ]­Ä|õÌ‘gO|¿ãQo¸{®—xžx¨ü„Þ®Y,®çÉ|ÇÃO‹qþÝsZ¼Ã:î³Zð‡6-yñÇ.®Û“+ÅïÿÆ÷qÚ(ÎãÎN"nÝOùtÒ?À·ŠçhîÁÛ“:,÷ß$ðŸZÖó&Ñ~úBý÷ùãôü§Öäç bÛÿ°‚;Çm›Äß]w‰ëyO-ñ;.Íc»ú>ñœÊ¿Rç©sö(<>;…¿så×Äu;s‡ê?ÜÓP\Ÿ]ãEþë‚»Ô<À3O•‹óûèÄ¿ù¼†ë:ªÏÑ×]ë„_þØ»âþO{QÏ·øÖcâ|Eûý(0ð5jêxŒŸ‚ÿPß¿û¦~?íŽTân<ú˹'øbË–'JkÁâïyê¡!>É1Ôi^F¾§áQT+º®Sþ¨:ÿ‘.λ«Bòœáyìº^Ì+­hž,$<Æ—n‰~ÿ/~,W1·šŠc ýO¿8ñïè'øé<Ž3£û’ygÉ`õß}x"îÁiϦuˆk >6èÙô =½,ÕÃpy»JÕu5Ž‹>ÏÒû²£gdþ3Ì÷wÑÏÁa‘wÊèwòYÅ}”óµñ³Bñï8ëa¡#hÐñ²™é9FÏh¼çÙ`ÎÌ ÍOºêäI}dS?Ñlã(Ó2t÷ì^­;‡Qc¢ýÁÚéèöÇ_³BÌ˦¼á€‡üppg¨ú'¾<>çã\û¸ÈçR^uXÞ7æCâå˜øÁ’/È-- ôŽ©{5™ÄYᎧ³? åן'^û¦2whЛÃ7Þ/n¨úïRáŠë‡3ý Vï“õfÌs«£G‰?ðŽÁ/%=®à G}G ^Û¤»pª.~<+ï}¶ +ÿSÜÏŸF¯·û]¹Æ G(yȘ>ÔgàÓ¢-ó/Igc;8éf¢†ê¿Jž *G瞛ijG(/Ïò“r¾ ··è1y¿5Í3ïèýrt0äÁûÆ71è|¬«Ny¢Êáobéªq›·8“oJ‡—gÐáÉØÎÀ_s>ÎÅX/JÒÍÿp 1~ò“Cæ*ëW˜:A+£ëÑÁ»”¯ë0CK‹oƒÕõ] ø–Féâ*QB¼È£óèä†güJçã_qˆÏ ºð»†<¹ôcúZÎàOÌqªÎçY”lþÂ`½“©?·p}’ºN«G¹éiµ#ý#ä cuº˜@úÀCôu$4Ë.¾>8ÎÖKÒ=7⛚²zNž:ÿŸ9úÄ Æ ÏGü¤Vñâ;®ÓƒíãõõŠz~‡a<.Ý_Þ8ãø—÷t»>ŒO.qE®y|¹vºzD3“­3qͦ÷g2É“Jz|ôMIÇz]` …vþ—¸qÉËØ¯[·,úß&sÅÃÇ5¹Îe÷Wnñê°ù¦y¼óˆ‹¯Á7ý:ãqÿà·~ñ>qß{ꪛ -Å}GkÂoÔgúó–|Ãú9#;ú†áñ{ê=Ë>j-ȯ’¸”a´¾Òïé øÐÁ?y 5Ýâ>´ˆ‡ÏŦ]zþ”'O2Û†ÓîÒ^/‰µíïÛ(ãøµU¿ÂW_)Üå•pãaÁ;òì«îOýLP$t/ÑŒén¶ÕÇ è{^öìóÑ*;8l_–p?Oyëx__ÊùTâü\õõ€Ú•Ã'bzXX_,üÞ\qdÞ6îø\?9ãû„º'Öã‹þÅ•£×g3Üñcg«í·_ðõ+hJø§[ÎRñ¼\Ϻ)Å·ýotÿ†ÿüæwG*¸Z6/à’_‹8jS?>T>Ógzƒ¨lžA²7«¯æzê®ä’_Ëú5¡SKm|vÙ© Õɵ¾JÃÚƒ±Î ÃvúÝÿj¤›Ü‰ú9>ý…êgoüBÍ×>C¿LýR"ýèSÅ‚¿ºù£\WsÚ ¾£>Q¨;R4RŸG+Õ÷-àýƒ] · 9%úcÆ5Œ;9ßó*«²*«²*«²*«²*û¿aÁ/Yܽ7:.Àâè<' ©>݉ôжöñû0§ß)xÁq†š*pÓ;úºÿ^·ºnþÀ3¿M:°»Ýò2¿hªs¹š©OòÒíËâ|>Õâá·CœÅœ'T½2ÒWÄ}w¹Õ#D_Oœ&òRSãéÇ5›î¾½F<ÏýJýú(È>¢M£ë¡øÉ¯gœÈ»²:‚äµ÷ð¬þ¸][ ¬P£¯¡^åê.r¼:2= G½÷´ ]Òá!à\z¯»³ÏÏ[­æGwïCµìàPyß´ ¼“A'"cÿ˜ø_Ã@Uÿ0Ô¸ÿ£JÑ!Âè7½ê\RŸ1ø”ð÷E4_åÅÃ?†ã²z&í—G®ÃÞ¯U§ÄÔŸùd1´¦üéºÑ^ë>÷WlõK”Ÿ±ë‹YàV§Æ×½§Þ'ûtÚ¶ Ž8âðöS¿ÂêT_ÝÍŽ7÷]}ÝŸëU-ŽmpÀ€ÿÞ& l¼NÈù$øÊ#g£ &®Å5j]£•{ÏêýäëÑ׿¸AÁuÞù¿ÂŸ~vð þñaoñÇÆï_¼¶ýBÝ·¥ª>¯ä[/Õ3ÑŽÕ·×ãr)ޏëQö‡Xë•×××mý-­çñ`þ‰‰‹÷ÉAGC?„³…~~È‹šsA<ÞꞸgìg(¸4ÞÇÕÈŸ¸ä'¾ò :¹ûØ{™Gx±.#i½b¸áWüðuq뺦yÙ†SÁ”—΀ŸC ª~#wƒ2O½õR†Ó¬ÆÖ›®gŽãqŠ+‡/Çùÿßÿ÷ù'f4<ýuÏžÏøóíÊ Äì¹në¤ï€¹_s;βíz]~Æ—µÅ•¦ýQ ž7[~$CßÜUl‰“KŽeË1Á§¹}R¢º?êTnŸ8ts|ŽjŽô‘½_óŸ¨x¿ÖÄø”ø%éÄE¼/\âñ®m=ñ¶žx©ð¸_°ãöfþXQ2ýVÔ‰ÆM¢ùcÔ|§/üò¨=ÿcþ”X8R›Ç£ù È#?¾·þú¡–E¿‘ù[qLõ;y|YË ÝìäèÓq²jÄÇû_Ü]Íë8|ŸÍù„˜û«Èã™tÂïIߥėÜñV,?»~¬æε^×ä|l<¿‹¿©×šõƒÈu4ØcÁÝîÉòïJد5mÃW O¢8>üþ4AìH,y‡(p[oQñ®Õ#~?IÍ•g! 9”¿›×G^ùìxùAWÝ9lo¬}.ÃügJ}U} £ô:Þ¨Ãüõ&žº·4ñzžƒ}ÄGÊ#?ÿÑÇOL°¶&Ò¿àz¥ÆóéèÈ[šûK¡tËâ¾ü½bçy|÷“zÂÞÇû[Ïeº|»“énaô嫳Vó$ë¿«Ÿ×Cþ|ÊÃŽí£â 9ÎÛO ]´¸|®_7ƒOÒéÿ¥LTgÂ5oT êdé3‚ê1u,&ÿJÍ£L»RõãóH§$ŸéËx“˜rEtÝ¢®ÛyÙüÿŒí y%”ozQÔ—ÌU,ܺžÿ“qüØ~7Ü)x,¤Ï„;æˆ:–kþ«Z:þ9fÖMÅO [ôæçޫ擸EÑoq>ß­õ¼òض>£Á>Æ{5ô+Âãgù郙tݯ÷/Mõ÷Içf¿_?gS_êŒý÷Ip²>˜S/nÌS'[_QçŸ`[4îiÅÙêü•ï§·ŒFL¿Ø’ÏJÛ$ÿ*ØÃê·Õ:×]±îéo=¨Oü;Ö_ÜYcqƒtôMÚ1>ièü+êtÚúêëÁs¬‰¥?V8^IvøÊ¸ÿñhÝÉ÷Øö—<¢Ï§6H–Çs5Yäy]SþÕ×P/ú:Å÷®ë‹ÄGàÆïª|hWþdm·yEö%²m—q~YæÁcUM5¾œ'õ (^)x-ÞÇ»ÆíõóQOÌ£é¶Îùê߸ZðÅlêÏÃæ¯ÎŽqdO¡ÿ†IÓU\Ž “#®êXLü÷1ŽøHºõ}Tg}o¨¯'Êô~UÚ†f~õFÞgÙy?ƒ®×Iu54"¡Åe*.á [^4®~Æ8_Äßøý‰' ›ªëÉŽo«ëôKžuÑjYÖeü¨ŠO>ïl/—°¾nyéöI5žg¹ñú(Ëú4 |÷t3,ªO÷(/åú ÓsæqœŒÏ0FßÏCú™ÁC߈„yR?ºnÏûöñ¾É€˜g]qsÁÒ}þÐq}kBëtg½Þ>F—Óv„o¹ø·zTÔ=Uë&˜÷ª›?èè¸ZÇ‹¯MýrŒÛ[xyçuoCá÷v#¯äkuŽ©+¶þ®ÊÑ»¾aP4ž¯‹W¹Ž‹ñX'+žÜƯßîå/ª:_í)°J࣠:‰hHóDaô{’gÉeq*ãiâþߺ½wþåGê{Û#òú¸êËfÛ0¯(Ö<ŠiÛÅsÀêªHzSƒ¾ã‡«Q’U]욬<_‡nS\æS]ãbãy6H·o0:S\TBuúÏSÒ¿Í¥x‡†IG޶à(­ou,}C‡u—Ç+¦>²=˜¾üÃϹé4w(Wˆ:¼)횇æfê×RQ&ëéèHõ-î½ÒßdHö ”y]4¤udŒ·m3É[Æ3çßà…çõ:›ÿZD¯S(`|ývÉÞGT·Ô—¾§÷Ÿ'\-®ÛiÏEãÿäWã²®‰òØÖLåß­(;9êÄݳÜOãp²ú zèõgqÓÚ¬ê:cýÊT×+n6œnë™U<¦ÉÂxàúÿIÆóµÔaÿ¯^ "¾ùeÑÿ}ˆ^1Ü~èßÜðsß_ ú)?º±üÄßGž8½o^zâx²FØ'ª®ÿZè‰ßì Ÿge7Ùß¾©çï}Fz³ÊN Ý]ÜyƒÞ¯ÙùˆÀæÇã Ÿoµ­«Èß(Ë«T¼˜ÄÃðÏq†¨áªþ‚ÇÉt­C]γ¦u8ü÷0Q·çuã´prȧ|÷=Kµy 9¯YÇi`é÷·GŸßÇí„ßVBÏýÃSÖ= Oç¹ÇÂ5ïÅt†PÊòÏ­XÞ’ú¤¡£ÐQÀùEÏOELaE;=ަ0aß/™'1ñ¡[PþpóH·þS ïÜ!âÛëãf߸7ìã%ëTל§âv-}3L†jÞ¢ý[çóe:·mz_x?tþ#òÿ†õ ¢-nßy 8nÀµ²>G¾<ò&éæ?dW]œ•~G2¯ˆA1ñ 1û!ÙöCíèü8æþÆižŽÐ|·­•˜¯ë²uêè+ò}¡þȼ³Ô÷…ü)×>-çÁq^¢‘пæÕǼì=~Ô@±Îb8Õ™öÓºxW/u¢>"2_+qIõ,2Îë+'%v?ö·yƒó°ö—â>uÐë7es<Ý¡%~:JÔ·¬Rý>KIé'¡ ÃL×ÇÓ®¸sôùÃà¨#?ªo<<ƒä/‡ç÷Ž#¾'&~"Ü?&^"-“ó†|x½XæÑâöñ Ç)oå‡ÿìÝÏ>ÜnH›Èq3pí-Ýô0mü)[_–ðx(?ŸP‡Ó8þ9ñê 7ä‹uà£dúháxÅL¯k]?݃E½ÏZ®c«}3®=M5ð q&ýr{´ǰâìôA1ô“¿¿ªrëi×á±™MÿóPO?ï`€_}yúyZÖ1¬çý]½_cÂ]cù?„cÉ“˜ôš¸éìົý®ÿžù²úúâ-G\-ÚT,Ö†[·kaÉs·cÿÿ˜Ï‹é Ç4°rô”M†¦Ñ~|ˆGÏg:pã)ÿF|]É'Æx·ãG <×9n<¶pû. ¶á™J­_¡$žþʨÏSm¹\Ô ¯Yà†ÿígÊ|šïùIÝŒãõÝT!<›aÔ'z<Óúüh}©{aª«÷}ÔëzGnq`¼õµ.¬Äß]/øS¨ÅðW²^¶jt¬ù×4¢)ÍcÄz‡ô:%íØ|qú·¼s-ÕàýÕÃíݧ¯ °ûˆŽGÎظMÌ_ÍÙ~«úh×s®‡)õDqïwÅßMT^ÀÀG)Íu»,þjm?^mì>ß­Ø8&?çËoŠ|“Oš±ý’µz= aª?Ùz¼„uü¡*.ynïnZ}.çïq›WûNˆ\'1yŸŸÚˆá<;Òz:ÊÍÏÀÕå"~¢| JX]eñÝb<êKmÃ_cÔ…©â-ÐÉÒ XÅw˜ê|<®·™Iç†×MÆýëö½8,Øî:”ÖB¾ôÄ«£ãϺ¬žöKýïå8L´róÛmz~Û—øã¯©ë/&ÐbuCÞ M.lý³bþ¶èúšÑoJ¨ó'u¢ƒ£T×[@»®/ÓÉEûýO­þ݉¼;ñ@Ð_?/šði˜r³xk§S7ç|JäN¡„ô“»ê®ýÜt·Mxp߸9<îŽß¹ñ׸ÎCAºü“a°ÛüöO-³äE_Ö¿'ÁÏö!š¼¾Bòä’‡{ÖHêþK~4r©¾2HÅ qõYý(ßQÇ žþ} ŽÑ}´ô‘}Œß›úJ7£ßWÊüÚE/FÇŸ¬^¹uÜüqKEÛðÜ÷“ø›æž¸ÚÎê<Š"©·µô!Øü;w5¶ä—1=‚öÙÑgB]ÂÕ ¼Lý=MuY^ÒÖgÅæ¯™ÖÃŒóÎeÿž»Hà8òõûs]z4¦8µƒ\/Ò<&à0áO>qô‹ }†äº#ÊéšuÚ ¯Ñ÷ãuês6ª±vœŒóÉ¡ù`Ð}>ה÷D|ÜžâÜŽâ¹ úñ„­}¼X]ÖÕP@ý&‚è:»)_êóŽ˜)ü‹>÷†úôÞÔ ß/âKÜv§:OoÈÓÏÔ? ƒDü¼J|¥Cl»äÇ3ÿ;8$ð$ÒA™È³¡ãÿÔazg¾(ÚzŒDzå9Á÷ =aÙ.ãºyêò8Köi±î÷ºa}ÛËð^-Üòê²îÍužãâÖÏ<ë/é/ÅS¨mÑ c8ýàmñû3ô9ªùÙÿ<7®îã†W2éëõ×ãÕÂï[[ò‰oÔŒáF9Öñ$¾¨@ü^~Eÿè|Q7öÅQ¡†e¾3àlpÃb1ïLø±Î>¦Ç€R‘åy(iRƒî…t?,ý@ùs‹2áwH\D˜—æº] ‡¾4Î^'­#ï³£?cÐÓA7YçŠ~‚#lþ-õ[lâO`ÐÀÀrñïV´~-ü¹êr½ƒ®†1õMþQÆv- ~ÓåD=?EöÉD¯èó@)å_cê¦`Îñ¾—þŠéá£áisÞnÚt½ŸSç5Œç&´JUo ]Ýð]ûu¶Ä¥õþF^,ôÖh¾F'Ê}­_­Èü7ÜôÜåóŒNñxda<Ö‰xû­­÷럞Áìoû‡çS­çuõhßCèÇ)‹ÆËòø %Ä—ï£÷ÐÒQ¯}n»Èç,-5×þ#hS1y=_ÃH½N 7¯¤~üþÉð@hcX«ùÝ_É—Ci“hÿÏѯð5ô0ðò¹x뉫qœBøù^¦#µæÏš”O!]Ùê{¾†UW \(ëêkÁáxõW]Õ“Ílq”«q]…pü_,Ô®›ø¯›æº¼o2ï÷¼0™ò†<6–¹ÍgÜlýŒ²eØöŽßº\]wF±ºÞúÖËOC-üŸkàô”_rË;¡†_}Èç W:8XS?,kÞ}ßqÐ5Þ{+óȸLÇ3¯¦¥ëÛlëûš¶¡÷k©Ü¿p¼ú”ß=pœ E]Ä÷á,–¤uËjFçWúČߚU®ÿ›Á§á†ãD_–‡ê´FäíßMØ— €á³Ï–ê<ÉÓãå1 )?vnvúu¡¥_óè÷ņCäu»R]¿ÄWOyNíß{\œ‡ Ÿ›-Caºï©ñ8¬®Ñ#Þûˆû~%ê-7©ùjÔ5ô}ø³¾pä/ž¶-Ý<×p‘MSã 40à>M¦àŠ—C7Þï{ák¨×ýÄs¯eÃÏð#ÑÒ‚‹ý”⪇ÞùÒçèóVt¿ÑÉ1aè+…BÆ7+÷1ø‚á ¨¾Íú.Žœò"\ß”ÇÝX~8×x‰htäꙌóU°õ'eÑ|%©ÀuȬ㖤³N¢—àé£=«ý•Ê$ü”I§?8(ž©˜qðåq| *6/oÍãÝy“Êÿ#ç;fŒ{Ào]ç8Wly[¼ŸÍU¿=ø}Júâen×5¢ý׺WŽŽ ŽsÿžÊu”}†1ñd::%Žë×·C<ÂK¹é lì*Ö© Õú¹¬‡aý›õõ qÕ¹<Øýuô~™ì‹g‰—Гp1 ûÎaÔK*žê47¼G¨[–ŸÝzÎ÷Ä‹ðŒ5 Û_ù†:ÿïg~äy¬¥Ûyð<þ@ø5ņ¸§=á ©—ô?ÜŽöÿwïzC§tû0¡uZ#™Æg~]G=ÜÔ?3‚¬öÅIÚoQš0<¼¡/UE¶þRͺöc=ó!á'ôÖûñÛOÞ%æ×;ïuã›”°ç¢¶a~hËôöúûxjã9òîû·c¼·‰–¾CÇY|r¨‚ó%ÓG»ñKßÔ¯kè[.þÎ,Pû'uôÓ×ò5LùF4Ž`r-·ËæõŽ£qR·÷Óú…hŸ°TDøÀ6žüû†\¿AïÅûüÖuò ly=´õÓû°žWp¿š_ºît‘7kéÈ_;“Õ£®ê.pi¦çÚ¢€éÑù%J¾†íü2ö7ð„P=Ç%Î:Ùõ–øpïóäó×g¬.\¶8:¿GøÀÏ“áРbuÙâšÔó@G~—%NŽŸœõœÍÏ—:UÎã ùU¬õ}UžpÆóiá5™,ØG|žszDçILüŵéù©9”×ì2CÏc2èÙ¢§XoMzF¦zò)¿{×'©Ä ¿fÓ_v5S¿½Äã¾á—oâýVƒÃ,ŸlðSãšIwÎÉJÿGS}ÉdhfÑXvG"\–OÖ¯ƒôý´ðoÌO’_EMz¯·ŽPyq¬l¤ï_°Ÿ·)Î ÛYàcQ‹ô™-¼T#>øÛáõ!É+’ŸûöEޏ^|žã|‹¸}"ÂýW®Þ879Ïqý<çý ,yÂÛ.Tu®^¡©!þ0YpŒ½Wo³º˜£ÎŽÍ0äÞoiç6¿aûÞ˜}:,ã.^Gùë”~çЧ³Ú7Xšo¿xn˜êˆ›?(Ñ<޳¾Ÿ›¾iýLyÚ–íó+'Œ:†~ŽõFÜ{“Ø>fÞ6øÐ°ôãÀÚíúyÝ¢÷‰~ñâ&›ñ>#˜ØB?_Ô"þĤÕu‹tiŸý37Œ£ñâüม~³r¨ÊßíkÐá›t…Š3¶Ä5qõ2Æ•{JòøþÝMêq~gpÔQÈ CTYfÃc ápæ·ðz}yûÆql}|G¬Qóý%'®ÿ65™>#ú³úÓá”úÒÔuä‹tÏžmÒÁá˜ÌÖïÍbê–¶¬¬«¡ivñÉ(Õ¯_ÆíïÿY²ç¿¯ˆ;‘¯¬~Íȯ¦ŠWǺ]à†6õ>¢$»Ï\Cmæwm¼\­7ŽÖ8U ý³ã·bØýZÿ1ø„á òÒ­_ZÏ‹Õ!‚*çùÿíƒCéæ»¹qéë"á÷k¢uæp[«tð$N9ãx².„߉¼ÑŸÓ‰/2ŽÓHï¿¢=év-ÿ‰š—4è‹£ËSYx¼ º¸õ±Èg þý6Õ¿\͵§ñ¼ºèqÄ&}~4HG/GâƒC„0àß}--ý)i¶÷:cû'¿4R«û{õ);ì†kÀÒ«Üú­¬ú†ŸÞIO½Þf»éºÖ'Q˯>"ëTÈgŸ;öͶ¡}vúŽV–¥õ>K“yþ|àLÒêÄü™NýAƒnªñø —bÕå/ù\ÅÕ£ÀøÝúÏ‹*Ö‹k¾<‰JÚ¿9÷i¨Cø¤¬ÿÏ›ÔHVŦÑ} 8zÔ³à fýIœÿib~żæn}LÞ¡:ö1·ç ýdúÌÍé­ï0\ÏÓø¸ðß«·¹_~È‘?[Ñ&ë¡¶í°Fð:‚wÓ™O¥þ1ÏÛºâêx_CãvuÅ{&û͇Çy3úy6áI0ó’hžKõ¼x_[_o×¾Gw쉩ËôôÐŽ­[‹Îþ+Ýo_|R¶Mêß¿Ÿ·+Ös*ã ô6à›âDË:œ-ãý&mÆßwÔõ¥)é¿\²Ö-~n¼y +ûkçq€Õ:¥«›ö_9Iæã¸ýé\ Ó·¨<ß·+˜}̾MEZ°?¡np©Ÿß˜±ÿÒ÷]\ æg1pšv”º€¸ä±x:_Þ•ú7oÌfè¨×mOÛ0g³^ÔÐ/Í{ü SÕ¼Þ¿$¥<jUì<€&žq®¥O Ç£`õia9/{ùKR‡Åu{[_$ëñ u{ÜÀ·«(“ýÁøç¦< O.^‹É0øŠ×UÎk8ÝQº_‡÷A̯¦EOÍS¼/z\C~ô{€z (ו+Ô~(£¿ÓF©|²y¿Pë)m¨ÏßqKZâU¡(Y½ »6¥šWCñfPþ΢K˜TÉûürÆÏ·öÓ¯‡#»eU÷‚›o\-CŸÒèúâüñj©È÷¡„òº¸¿ð”À»,Lº]CÅúÈóÅYž»¥\²ÛoÈdržç::èNýÑιÛi} >о¯²^e Ú‹ZßáEæ/ïöÃpþf\3áð²e¸â»Y­3IÞz¶Æ7·Qô|†––> µ,ýÈûå¸Õ•û¹ñ=]-ø±¡ŽØ“á:jòw³£õ¶Ò64óÌø×(×ï'Ü¿)­“Ó&žúBØò€šo^zŸð7¾ðÌkǬכú¢ñögèŸ[ìd}bú–D>ßXøSáDZ~•üù ÞJ‡šyÕë]=¿ÇÕÿt>Ÿ ½‡¦¾ˆǹà·~Õ³‹ªø©1¬¢òøxà/ªŸ•ë¸_©ªßæ˜!çebú8¯ü›ì㎷ =¦c‡›Eëjìú¡¾î³>ì‰ÎW†¸œ–¤W2@ßçÙf(ÖëÜâÊóD?j¬ÑŠú©O c ý¥Ûºå[Ñ—ÆÙ´¬Bp²Èóˇ²‹ß >sŒÓV-K¥ž"ýëvŽº€¼ïˆ)ÿâÍ pì׃n¢ÑÇ3Z÷›­öW«hPÚôô»H_KDc £þ(ÓÝÆÍ«ýæÕ&Žº¨ Hÿë=ËvÀQ£™ZÛ³.\û¼kÑmµÔŒû=­gnW˜Tö¿Áˆ>~ó¨­ž2SèýbÉ—*4ÿ^eÿfů˵Él8È`/Õ[ó+¯w²™äÕóÏѯ~ KvfXó+¾ò£È¾¼¸b@,<+Æ>&úœ®»:Šû}¦ÐAEÒWìgÐ)ÝøÝh¾îÃcáLº õq…ú1UmÁÖ·ä‘[N$`]ûš¹úR¼^~"`ý ç?¡S<]&çãwŒ^ïeýSö;ÉÖy¸ª3 ^×8ΘÉúÎ^ë’Õ+L:°(vä[´7Ì_³ÎÒ÷ËxÉ/€‘éq·×>¥®›(H–g`õYÌÒó[çYS}_“Æ…´Sàa[dGo6ïÕdþ}¨‘e^;ú·I5ÿ‚í3´ÏKp$Ÿ–‹¼ÔªKõºâšxb>Û €gøêæÇµú”û¨NÞÇ­Ïo¶ s;$º¯ »ÏO‹¢ŠíÃwþ5Nׇ÷ qï»V0þ‹È3 %­ëM£¯J^Ôëø¾í6Ï`M ñ¼_üqÜ3h½nD¼¡\1/"_ŸwC; îÝ¢[c<¯Ö,o=¶ éþ¸=ÁçÌÿšó¿8óÁÓžóª“/aú™{IÇÑ0?£ƒOb³àÍtx7ÁgŒ‡a‰COVC·tâÿàX̾P5yßÛ%âÇnÿžõðÖŒÏ Ÿ ‰§ÏW¢þžàš/—üêŒývÝ£æZD_!ŸüáVŽ×sŒXׂ½ oÚ<¡îk±Ð=”çcÞŽòBýŸÌn|Õ¬bø¦PvRãzoÈ“Ïjp=pÒ?®Éž³o¿ù¬2ánš±õd‘ªÇƒíÕõý†qñúŸæzö™Î±ô15?ÿSÇ3-ã÷›Ô•ÀL}žAö3}ü,ó¹±(þuáxÏŽ™k:“òí‹Dc+Ä««#ÝMCßÂp»”úÈøšI÷‚Zêó#®8o4ˆ/sžiƸµâÕ“ö•ûÂ}õg' ”ÿ–ø“lþœr“À}›úsÝõ¶à3~xp(;ñYowûïø»E|uEW=þdšÞïÂWÏ=á˜cWs=nò±Öjž‰â"L™"êÃD¼ÿ¨¡Ô%0²U2={ƒ~p¨ïpå®ü›øw-ÂÞþ á§,|‚t¦ÓÅiãáNƒ~OJùm4d}o_t|¯[ûá9qé•nyÒ/¿$®_]òS×þ,«ú‹áqǺõ‡©¬þ#&C[·u5 ý:<§Ï¯œ¤¾ï]k¥¿ç–GE¹È·˜â p;CýÛ·_s8^ž!î’ý¯ûøõ‘â}ÑÃÏwëWoѤ›†11õIÿÜVOÂük*µÞÔ°òj•§5¿Ós#õœ¬ã×säÔR×y̺€6þAÆ89Ùå}VY´¡Iåâ?Læ«Oè=~Íd~§ /è«[fÕÁú„úÅŸA¼i‡Dÿ‹n©ç!Çq=/ã¸÷ׯ7 7Êu™Ðí“ò9ã†q?®”åFªucÜ»•xò_×÷£¶ÄsÙ6×:7Ù }®ÎN_²éõëþ`µî!ùí²/né&ò=9Ýž>z¡ðûöÉæÜöW}|X*üMô¡xkjž¾ŸZ¡[Äõö$_…gäÐ_O½þ´ 5 ø’¶†íÇÅ:ŽÇ¶a†Ê+’y-T'Ǽhðz2wF?(–ÏEÙij§zC=O (Þ¯m‰Kò-ïUÿ‡„Ž¡AŸˆë˜a„>¯Áý Þ]^oÓyØ sÄ:#õ±0ë'¢¾æX‹}ÜU³«_2,ZŸÍ³óû¸Ž¬uûÜ,ë¸ä1Š:´N°÷×&Ã7b°Oød79¿Hà:<2/M"ƒò'O ýÊ´páxGôó"r-ulÙ—±ë’D<ž\ù;“¡ZvúØfËð̳©ðÜP7Þ~§º^†É\u¼ÐÄ £]-:AEúQãÝ2áÿ{NŽün¿K¬èý7›I~¨u;ÃøÜŸ ŽŸzéÒ‚OY¾3?jëìúZÖWâåy02//òDµx|©êúó ~¨ÆáÁ{=€íÍ´ó4Î|iœ»%«~}\“8ÝðߟVæ;ô9Ç­~—%Blý›xHåòsd¼‰¦ú<Zªyé·£ƒ_ÜâÊ;6Š£q˜­g‘¶qœtÖ7âo/ý÷Á>Æ£qÌJ¼°?;}Äqzw?:âÑMñ@8ÞèIÚß|Âú‹-£ße¨·ž,†Ññ –þ62ì1|ž°obÆx~VðBZ#V®ot:²oýBílÀÙ`Ôvu½µàðâößAZ×>tóçyßæðsê'·O!&ŽKåý2áÐw°>>RÅ]R_¨‹žúŸÔïu ýÑ›yêû ŠÆóÆ5´gü•û´ œõ–ï Äb7?"xÇ¢SCxôu;×ç/<ïÖÌ/eýë¸N$–]•Šÿ‰fz?Õ£ýœ·Î o††¾X}·ü Zâ;Ù'i–¾^¶MÖËÐoLªù¿l›sªVßk^B>áΌLJCy¡ž§þ)árë9ú{–þ¹áñêWLž'8\9ºGXÐ\;ÏØúêfŒÃû¶NPëZè¬×AË–ÏÄ»oXz¿^‡î»û_Ôú–~#Æó{#Ýü¿ì»…Žz\(ºª}6¸î¬‰GÏõÑpy û£ßûµTêÿò9ÅÖ ÄSIˆYøÕ¬®3xä÷åÿï¿}õÚТrú¦Å5ëùêhzjÕ•’š3?¿¶%ሳ7îŸçÆâ}]b¯}´?Ûˆ8â¾6úºQ?¦ÓV=!ïéñIM"õ Rêû¾*Oço~ló“«>ˆNªfŠ[MÆû3Kä)PšN_d”ˆçÀ† ˆÛG)ãxy´î­úŸ ñÑeˆ‡o{O­?ÆÔ‘È¿¿^xFïÿä:ò±zðƒý$p…~÷#̯^¸¼Á>ƳÔݱfˆ¸žÃ,<ÿBõ{ßþÈÙ6Ù¿uIÇÉÀßñ÷c¦aС–üû¤Ç«h3éK{ãé·Ÿ2 ÚŽ8áYÂ_ÇÜ‘*¾kÛ:7ÞÚ@ò‹ûyê*õóã•¥eP¬ê¼:âP¦×}“y+ã~¬n3·z:ñˆ%jÊÿ§e¦¾ÃÁ nëtˆ lLóî¢_*ßãö…~z€ç=¯ÇÕoš >×M©ÖQÊuˆ‡g Çk«¾g®|Ïp{‰óË‹çocæeâý½È-ž”ùŸàë¯6ðþÈ8;8FuÏ>Oü8ß{ÖñP+&>¥³¨d«?.&«ýîPÏq^i“gÓÌs¾¯ê`âŠtóÜXúN"œ VÍÓ®<_„ºŽõ£VÉômê#,H†Ï­lC®ŸNOZ8Šà¹“#¿„â˜óîôz~ýô,ýÈÂí$_¨-ñOš§¤C_`éÏDóbð™ß{O7ÏÛñ>¬˜: .i£æ+ºÅÓƒpí/y²z«uw,ù¯¬Æ©œ÷ë½L^6ŠæªxË5V~ñ(ǧ³£‡†>*/]õ8 Ì=¬ÖW¾´ÇÉï§‹³F÷±|J´ÿƒ|™‡°àº¿u×ÛnñÇ!úËú`[u´ªq^<éêÖcü¨ÂB!Õ‹-¼bãñJ*¦Ÿ’M?;¿O¢yôz.ûÉV–~›ÍpÑO£û=Š— >bõêΖóX@qñÎöbýüñy/ÿ>UóbI×¥®0Nk¨êÈ5òãMg['ÄxÜE_¨ëK'Ÿiìz‘¯`ý˜ƒ£”7è¦êW¢å7bê*¹ZZ}ˤáþÛ¢ýÓ?Å[‡Lù|ëtUo÷"¬Iޝ[ÁéÄ3Á±¤#èÍÖ7Ëyœmkœâ]ÌÂŒh ®&¿¥úÓ}£ýiù|‡ÛרŠ7 ~+ü™ÿäßcJmÑÏÝп;ÏSçáæ†:\µ~ŽV„Wn ¯Ëºê]à¾?«y¬iUÞþ– N)^`Z†KÖd…¯ƒþí¤ÈÓ¤m&>ªÔLûx¨]1yÔcqkÙ"óGRçž×e1ÀÀKÈè#lÐuü‹[5 Õ8Yæ¿z¼¦Î3WÎÔóRVÿDߨŠG6LCò§·å»åßö§§ãkMµý>ÐÛ/oŒë_qpâ­.Ü!âÊë·ˆß7¤»^7ùú?¨ùóó¨<ä¯ÎSúHb®LÂÆÛTý Žêz|AþçU‡Üú.?òSõߣŸ´4¬Oçüï)o¯2a8¯bqÚǯ^1º•ÁQƒ¿ó÷Šñgƒ?G¯;8땟u$Y¾ ƒ¢×›ŒóÛGüìÉ¥‘~g¸½cÝ+V¥2O :åïvnçÇø\¸ùl1ÿ®›¤×Q?_À¦;Õuîš:¢>/ûçYò£&½ <ÝW¯s]’®N{8îØËâõD ÜêÙòyñ=ÏÃùš¬“ïüFÒÉ3ég˜ð¾:†û-u÷3>gýéЊò?TŸæ}ö€ÿÑóE ¢ß+t¶ð*?Óë꣺£ô–ÝÑx&V?EŸ7UüÊ쇜ž‹PïpÒDu¼Iu³Š0é¬Ç¯ïÜDñ„éyʶIÝÏ´yIÖãNî¬×·¬¦¯'ãæ ‚çãX·ÇÕwŸøë… Xeñ —ÎëqñãçßÏ­E¸oWò~Ãè¯ÇƃA÷^Ú÷(ØŸÿ ÏÐCõýo“ö®(}9ù~¡¦Ûûâ‹WÊØ¿ËÛÇÔ3«hC^ÅòP¶J}?Úpú&ü¾…oê2íúƒX¥µ7~2SÞg¸Þ¯Dqôû‰®’Sàõ¼aº_VöÇÊø|ìáJ‰±þ×YñƒÐÁOO·¯Qëq]“É:éçqW]ÂljYð#ëzÕ©9NŤEýhÑßP=wsVâC7¡ãÿTPŸ[+WVÓºŽ±†õyÄ7âáF*¸ï–Ì{Ûú/zëÙ?}á…ÿÃÂ'ôþ{}_ϸfÂ=£Ãúr'5Ž¯ÂŽ™éð¦O¼çà]C¾=ߢóEù8“`theé+Gõlø‹X¿«¥„K,6äqÎQžS™ïÁ¼Í‘ó$|¢Ïv%6õ© ^¶è6·ÐÇ7RG.ü÷Ñy-Ì]ªâsÐ[è%’n!ëwÃÓ¦>`ÏÑÊ £JüÙß-<öL§¼¦¥ÞÜw“Š œ²Kè«8ò\ã"ô0Äi-è9ÍUg¨ :õTê"¦8Äy{é==Ûð|ž-f.Û'íkU”| ¯q´¤¼€¡œu¼—ôÏ+7œ®Ï¯p|FŠ,ú~ÙÒ9Ûì¦¿ŽøØà¨[~—êëÀ õó7 Rê¿.׉júº7¦|!æµÛÏQq†{+wO×chÃT®_ð¬e}=Mè” ±z¿xŸXt2ðñý ø’>ÑzUVeUVe§šaõ7²ÊÄØ2÷ü@g]>#ÕüΊîû™ÚqzQÁt¬ƒO©áJe¿Mçq¿u[y¬ó™¹S¯[ÍP¯–ý‘G}Kø½üp¬á8‡X|´è6õß×9÷~AÅö+>Ù õ)^” ÿ`ÊÊç3ã¸mÔ ýa²mX{Qºóbè:Œì”ÖñÒ6”éã·¤&ûå ¯K\ü…_~½Xßr^w©Ez“u 8iÚž÷[ Ï'fCëy“þ8“^ILº¸f㜬†\Ë{³o“õ¸£õþAâq;¦›§zÈ®8 ®§ˆñ†z‘#ÞÒùãéÅì|ÊxÔM™ŽD¿< Êꈺ(Ó™@sKÃs‡¹õ •u{ª'¡[t¾%xË2Ï4qÔu%Ý6”?ëÆ_npràZÒ2YÇ4ªÓ:ŸP'fŠøâN ³Ì“õë¥žË ®ÐdÁaz>ó<ãgÖý‹³êW¢«ã~®ŸO‚›OñÕG÷+õ;OpGÕRê4–të }hÑA<—¶÷Ë8¾Ì§tŽ—ïί±¥>]“ô},ýî}ͤ³~ŸRŸt~_y_«ðó†Ô϶W<Ü zÇ›oКÅÿ ™Býçùõ²òõê&¯{Ös bâM{ëçqœnÁw4èXuøõ©ùí},ßH}šÐ\ÿžËþÖó/*z¯®ãÛL/¯§gÿŸ}žý NSqòè-žcÈ—XúWÕ5à„òmÏå—»¹=7X}žr]¸ÎÄÉbèjÀMzæ]óC7’ñ'¸ïôQF«üx”Æã…û“Þ::0=ÞJÊ¿s]`›¡Eåè~Äí‡ÜtëáÖ¾§å“•y-8ï¼Ó⢡§[C¼?&׸bþMÃdz`Rw ET_ncø=>f¼€!oFûŸÍ©Ÿç!ýûŠf¼cÈ/þ8†ÿ°nõ#i­Ï™ü¢WÃõ ÔúpL=P'4?aŸã³YOKþ"8Ï1öMO©Ÿ‚M [†\ _¤ZÊuʦL÷g±'`¨·ÆÕ¡ˆkn¨ßv¢þPW¤£×ìÍŽƒ¯ž²ìóà[×E¡A祋«Úùõ‡0™ì-o¢Èguª˜x×Uç4õã6§8ê”ÁN)Û}¥Œù¦Ãeúó#}ôKÆ£ówyÛf¾:gq Ó‹X¼l©SÏØ¨ê÷c¼×.ªžl¶û‡‡Ç=÷3¯u3äTWŸ'“¿a¢þÉû_øá…b«dÒHKoõç7/ŽÁ‡ôõ‘ͳô¼ˆê~ó8†ÎPŸ³æ´Î 2à-x‹kékB×#øÄÏ?G3ÃsQ-;ó£ÄG¢>Ew‘o6és¥ehä‡Óäú8ô#zyê[M_ï×GÙ³#rÒÉcA3U÷¿_<½ûpÿqª. Ÿ7‚cÑyE^/Ìê^U—cäPUŸfë»nõ·"CÞ±«;êøH]zÛvÆóé@ø9¬Ð<Œ¯¹âòNV þAóR™Š_@çxë¦>“L¿ä𕱿?\´[ðmKÊÕÏ×oH5Ä^íç£ÒyP¯‚ãÖVÙÁr%šø­k¦~œá÷l§ë¾ÃÂ×Ây‘,­À¸$;÷g¨:G{ÝŽƒßñVw©çÆò¨CXüð¥µ*BóoN„ÿÈèÛzô˜,ùJÌ;ËúFÆïÛ³ó1ø«ñ }O:½$^Àm_©Ôus®OG¿-xVü½ç>‘§@¼à;OÄ]ëòhàˆÏ¦ø¾‹g$uëÑo~vú+]ûjüÞ¡ru©Ò2\ xèè–ïDß‘=å;é⇠øZãö%/-¿ ý <Ü]ˆ^æONV§®eп§¾ÕhcYW=u¼3ŽOþ0nø™Ó<Š.nq éoÒÓ<#KúÛŎϧ§ Î\‰ùRî®Ø¢Î{OüAÌ‹×nMWÔ‹êÇ]ýðpRSÜúpÊ>ÉÎÖÝ8ÿÙ¸Ý ê¿ÑSß5ƒç䘟 ·7¬ShFG&Ì#ȾÚu oÞÔp<ªë ŸéÈ×SóN¸¬O:ù’îôœl>”|”¬çY·Ûö‘õ†6iáp ýBY݆ÿ]K¢ý×R .û0{vΊŽ8.ïúëñR‡5ãs ßÕf¡Þrïrõ|víöë×ÓÁÂ'›3§Bê?UVeUVeq ­Níü´«Ùú'WÙÿmCõ“£ÿ[•UY•UY•UY•UY•UY•UY•UY•UY•UY•UY•UY•UY•UY•UY•UY•UÙ¿»¡ËÉW²õ;‰k(Ín,ß®þ*OgÏÄïã¡ÇO(Ra0ñ…;©ú'Áž|ˆ÷÷‰Fz»˜óªª×]ìÖ÷&Ü~FÝhýðÔÐÙ1´¼lý…Ð%]~W¬÷…ë\ OÕ5Ccƒ~ùkŽº=Äó„ÖÙÕQÄ̯*8mÜ)ˆÁçn:)hžŒ×e??Þ|Vý¦”û ÙúŸ¢5Ó ~àtÁï*4ðW¯«¯×glnÐÙ4èä‡ûµWqø¨žÎïǙϪÿ.&ÞÀÂïŠß×.%]ç Õ³«ãGýÙ0e{vúgN¤çÙôB.ø‹à}|y“úÜÐó‚*ÿPêk†Û !Ý®cR@ûw¶ô þ”ôd¢çµõŸÛxg&~f]¡ÿœúö XÏË”¼&ìÚ&ÖÁ }›> jû鮚ø}9Ní ôNtаWuǾMò>Œ©/Þ‚ôö¡ŽgwŒÚÉtª‚ýäǵS¯×ѵžG+K¿¶‹žÏwm¶Ž wëc‚Ë~¯×Y3è·GÕõ<øµ_õ<õgó/¯ÍO=£y\ß…êqMº¸ó¡K¿eÐßúé9'>/YÜÇ!¢O¸\g±é+êºùóÆu•ãôƒ¿zöÓ\{n"Þ…oßpçqÿæ6¿{Òí;! C*·oªësŸ±ñMQàÏeK_:ã8–ß|îvßqc©à-¯Zë>çZÿ‚—ûu¸ÍƒÁ1Ïó[ðŠèÿE:IÁj"u¬}ûÊøZðb²~Θü²ºn¬ªí§ó8„ñ©Áô¶ŽÖ¯/·îïjè“–1N7šùçg%ã«Éù -²«çëkè,ÖßàK¿‡!L×ÕQ_ës´ùÌÝ¡Ì hžÎü‹ªÎoŽàƒ˜}@Ø{ƒŽ>z‡ttCQBúž«z©zÍK =ªÃ´>”1}‰6´_#ƒ.ngzÎØé_àŒÊ|(×g“Þ®qœ¼ìòA]ŸWîÿ›úÆà‘öz}Þ{/ýwÓ¿û%˧aŒð·|¯gZ†6}z¦Žó„n Æ Aolz¦˜ó¹Ð9¹ô5oysuñýÔG"×UŒ>[˜ßå{cÅèÏÎÿ¬u"ŸtO^ô|xß%z]ëI?þ}ðuÙX¯³¾«Xí{³¹L}Oæ8ÝwtO–gÃ5׫}¨n‚s â¤ËVfåùÃõºÎ_SóL­D<Š|ƒ>5éÇ/QœÜ­—þz¯ä§“]Ìrµàp¼þ7B~!ësü]¿žG=㦿†›ÞÒ®§Á>‹ÿÐ!º^e=ç&ÕAÅ×>™›Dÿ(ØméOoÑ©wÖ-ÛØ';z?ÁC"ÏS+»õi6]Hlø¦>ÒÐ/ï™–!×зªÀ¢ï}ûZá7uðëÏ‚nªŸüEç‚?¹å%mz¹áv»~&æÓ)iŸS”ÕÑ×Tw‹£„`Tü~®m™Ž}«+=ü‘Þo]µÅ¯È+žuð†~ù/ôdºÊµÒ©‡Øq&}Oÿê¹§m&ý0nèÝ'4-C7ò6ý—¾nÎúÒK¿Â8^MVOýHs º1û­gÛxŸu_CÏ'³nªÔ|nدæŠßŽ’Îê—šêõ Þ¤çøö³Üêˆ-âÕ·ÐoŒÈxö4ŽwyƒD~µÔÙ6Ž?Ô³.R‡úw3àhŸ‚Ž1Ï÷'N=ŸŽžÇ:QÕ §Šý¼…jnyñŒýš{ö¥aõz+eÀ§z2š[üÓKZ òÌ/ ¢ý”©q(6¶Vë/Øðµôý7»¾–Êüòôgª©Û£ ^~ §³þ%5 õÍ£)å…{éŸ[‰ÏBÙM~øÄÔïlÝŽ¬äóñØmj^hÇý©àX1ó¡TæïàǪŸ€Á·«øÔvÑÏ•Ô7·¿ýaõß 7&ýGäù;u¸lJ ý¢gÎO5þæýQ;žæÿªû“á—ªìä6SV[Ö*;9Í?ReUöÿšŒ›+û<ª,™ŸWl“*;µ Ý£ó6 >öËsTùÂÐÓ‡…e7¨¸¿®éð{‚?GçÝmqkÚ†}þ 7^,âÝj'§ˆ>ߘtP͇5Í.0ŽãƒÏ+&ž Ïgçåú~ÔìzáÁêƒþEõdþ¥Í‚ƒúºJÜ𾆠—«ºäÇaàÐÈãIÜ.ò |ÓÜÖǰÿt¡oóÔ_ÓùYò9ËØ~pi4^j’¸ŽÀ/?ƒ ø”Ö¤•rŸiÎs?O¨û ùÑøLØ«¬‡hhØ®!ñgÆ]§½î¼Öîâ=Çè±7øyôº‡Ÿ{=÷¸Èí=áë}¸6/½íøß6Õmý^ÕůW—Þ¯ÆÊs¤Å—<·ðß]Ë“7©…ˆ+&wøáÍûÕüÚÈh>f¸Ý‚ï'Ò1A x|’׃9;á"lx¼püÖŽÛu$Þtß&zžÂYyªÊòrþAÆ_Þk˜'s£Ÿ‹à­m¢Ï»²ñ÷hiX7Æ Žô{P3æñúéùvÁéâÜ¥þ‚IËÖ:ùK÷L…ÄÛ(q{΃ÉpZqó@<>ò5S\à}ä?§y½¥£ÎÆÑtqÕ¸`…Óº`Õá[û©ÊW*M‡ï‰Ž[¤~–ñý¨ãÉË/Ú¹Þ„º}¹àÝèß-yhÉâ¢É׈|J©šwÇâgNLÀÁ×_ÀŽ·×í÷›â nXñr*xÁ`_¼8Ï•W`Êß?UŸ©[àkh[¹¸IL™~ú¤+“éáìüx¾›úåI‚Ïâù§úŽõãPGêtáOa¤ãóß™òàë®ðã]î±èBv××ða(¼Ø=L§®ý}øÒdzÅê¸R·3îxÜLuð{­c¼!ïtn™v?,üºà›±<®_šj~ÍÕÏ>u{î]ãɸ†>3?I]m®k~ÿ;¯zôÞ­ý~Vø 8óÿcï½ã´*Îöñ-ôº]ØÂÒ˲ôæ¹@@ÄFÇ.EÄŠ Økl{5£¦˜hÌ«ÆÄ5M“ƒ½+¤þ~ß™“wîgæÌÌ)Ï.¾ÏýÏ~v÷œ9óœçœ™»\÷uK߈vüÙ2^¶Þj~Qޝ-‡çOnÏæ:íÆp|¡¹vσ·_½¿â®'å~•‰©û—¸_/~êxjQ-ÇIh­Î"òÕ”ÿžò0 ›ùg®|ðÆë_sÿrûÏÔýÐx\wÙu,¾.°ó‡P©é«Àxs¼Fß%5Ûº««¥Ô»>æ}Ȇx%eœ7ÔÇl»}>ʼÀêùB»pyœ(ÏèΟ§‹·ËQ\¨ÆG`r¶•ô²N|.0îÅ@õ~ƒ|M ѳ@Ç r^*\æÙñÚ-Ê«ˆÖC1Œã˜lq—ý ÿ/³ëOÁ¢.ê¼qËóÚú͘LtÕšï®ýgègèë¸uª†¿’ÿú–wªó½=Ùû‡B¾ÞÄqŽ£ò×mŒßd·®/b÷½fóy ]ºFì¹Cw5nI;NkM= †×˜ðÃñ¾ÿh}Ý‚_û \= Lù“VJÜ Í8_··w†¿–×ëÙ×ó.Æ1SjÙx‘õ'kòšœo˜æE¢Îýëß¾2Ü~«Ó»¶í©oÃh;r_¿ú™á¯×á²"Æ“Öók‘÷†óyÛžv KD ?[×ç„E'©ëF|èçMòX5j§®ï퓹¿8dŒÃé£ÉÛïÖÔG*Ü®çíŠÖ?†j?oþó Ãe~˜³N ÎÃWGÓ3˘›aþeê~€‘r¾S§§€q×$ƒ×t¢Z·Lèºwày÷Ùg…òo…t<³ýÿçÕ’è]>p^ÝŽÑ$ž¶…åßg³8}ÕïYK­A×ö®Uj>€³dëÿõì«Á½Ø¾™Cø¼ÖÞÉò wtd|œ÷[—ÀÝWÈõ@¢×‹GdzúÇš_±ùžÈâÁ†f¼®Ðƒóõ¸ýŠ}Þ£×Ëëýù³ù.|ŒáåÞæã•¯”?çïŸQ—¾q#û¼·´—ù¨.þ‰Œcz$û é¾ßÓ‘åKžé\÷Àâ{ûÙ8«—³¾7?aÝêú`PÁõV:ù×ìóþg¨ü<ú»Æu|X?ëÄÆ}jRЖüžÝ—+ŸfyúebþÒ\·õì9YÏ6ü°ãÕªâùýgOÌ©»wÏ”?×a2=ǶºS˜xF ˆÅ?b÷çÆ‰rþçñfì¾þ𱺆F<ÑæðºçäåSsëp /g~íÚ9¯®ûç²< ÿó…Þãëîó(=G\ï×NgóùlÃÔ ÙßOľ§•'²ç½œÔ-ŸoÁžÃ{[Ëy³GÚ³Ïñ£;eÍ=£Ùu.]ξ—ãÊÕóúÓ5¬_K­ûç§Ñ?|LÞ_‚ã\°J^gŽx‘ýlÇïËú“~>îVÂßÖ&Z>Úû,þ…ÚÜAÿø•, ¿ïÓC§pþ¦Vã®Ú,û7µeûï1…‰äS°ì,¶¯ßz¼ü\Œ³ì/ÖàÒ­¯¿fx¢uW]̆j"î¤G;–õ6ç?¼Ï |–«ŸW×Ç'¬pã«bqtXµ°FûÂEÇuLûšõGhêH&ÝSÜÌxm°è9îÒTö÷6}£hú 8§½òïZ}Æq³åãøsì½EôÖº¸í?ȲóK„î5Æ_ËüÐ3ÇÏ|Ø^»ë•×^—¬uzŸŒý3íF…·ÃÄ×¢þ;n]ÃâÄÃ~jW¿èËpûº>Sãù-Õó|4)Çiø¾æ»ñ\‹ÏQë÷3íùoß_[COÍ>³ê²`\ÝÀ‹ìÞ«šãˆ,qVÞ{Ñâ/´ }y–ñr,qáwKôÙɾ:^®o`é²høëZ–/ñ>çû>^%ÞíÆ½²Wàÿþ_ ÕpL0Þ+݆{©ýÿÙo²<Ù“w¯ûKoußv <œ¤#,/VÊuRó- ~}´äy<)¿?³w³Éc5%çaù}+xû8ßM3Þÿ•îó¢¹eŸT{ÍóùR8¼ž«ƒõ¸„/^Ä-º~¾¸ü'í|¾H/žÑÕè÷‡¶ñôÓ &Mx¯SþG§»öL5©/‰/ËÃÍÓµ^¢ãÙ×ªÔøwÁ­Kd\V¥¼^{û\È<Xži Z)Lùy¬ÏÛ¨>/¬¿I -9Î'‹ó@\ÝI]oêÿìˆ3Æ´¿ÈõM>L{~×5á~Ïß ŠèUt2Ì;¤î‡èÏt>oñåû[_ÝêËÓšgƱW)óÞ»ŽxíÞ_åØç¤ÃÓ¥\gÖXß¶eŸuÊuöp<ÕÁŒÇ Uòz~êÏ-úŠ]¯§3t.,lÞ7nþJ]ǵï5nûù}<~D¶Úråµ×YÜ:ƒÞÜxÅhÿœ÷1ÑÝêÍñv5Áýóé6Lg‚‚Âú¼\¾ßýØ%³ä:lGÒGËù"D?‡n\¡v•¼çëL/^g?ö-V·ÌsË;¢&2èQáž6,ž=ƒç! /0åÅH9Ÿ÷Ç¢áżøUuŸ@u•Õ:žrÞ]kå&øçã×½®^'&¯ Îö Ljr‚«¾e#Ãm%ü&†|åwÝ„þ†¿Ûux|…*®ÿ›Çß³Õ/0<‹F7ùÜiä†ÃÄE&’¿ðÇ?çÑDÇÏXz 7œ\/zÏõm˜xO":ËXÆ2–±Œeì»k¿õƒ®ùA4žˆá,¿Hu¾¬ÏÄ’XÒÍ*_äíÔŒS±’ý³ºÏ„êÙjç³òE–GY3$R]Ãû·:7Åç(sã/Ö°ø¬ØÀ7ïÈ»êí5à ¸ÎN©Pó”VËŸ ý?óþä®Áø“áô ¼]$ÿsá©øñǯ‡É‹â¬Fìy:þº`>Ø__–¯Ä…4#ý¬ËQº2\J-ûtŸÆú3Î;ç€êGÃ0RwüýštM¢}¯Q-×W¼Ýõ£vñäП½¨ÚHxZîgÏç7öÿÞÄnÝÇ¡ßÄ'zÈ(äõÓÛþmÇg8¦‰Sý w U÷À h:Cq†övÚÏÑ‘¯»xݽïsÚoߪ·+/?š“|pW‚ÓÞÖ0ú}t†<^—Éwñç}\›Dó%h¿',tÛogœÏðó~Œojí{ÒádE¿§YŸ}~Àšþú¦Žú­„'íìú?Pj{…ï–¡wzùüër>_ dϳ÷·|œxïuÿ×ò’GäÄxÓo‡iÝüòÔ*˜ç}Œºÿ;å¸";?ÓÔùœ™ÑOWæ`ßçÍs3l“ä|ýfvï¡­ÎzÛñ„ljˆ{öã¯Å—EêÃCÍáVykï)­ ækœ°4˜—Îï$m8H­÷Fã ÌIV×9ÜÿíÀ?ã'Ì/¼~Ç݇îmá8ò˪Yœ±™Ä§ï$[ßÁò.iÁi óÞ×Ä«ûíö¡†j:}4o[zqÛh«ÑÕZÚ‘Õ;4zzÞ>»<†ò>’A ^g <ˆQ ?8#‘ýŸæãâ64?0qüTO¹Þæaè÷wæ<ÊŽ<,QöW'õ?Üÿj]áÂû3ÁŸhtÔu†›æ³:¨cü¢ç—„»„×q®zB®o®~/–ëaÖcÉûètÌqÇ/ýfLúyà{Òú‰O] óÿ¨Kã7`ž:¾˜Q7‡ênv²‹ü:_ó˜ûÁþ]fœbòú¸1P­·ãÿ¿H½ïyßpœAáE1ð»Çmh«^_¼]ˆö2þÀVÏÛcYwì’¼oÂqAO‹_±ºF×±ì 8"μ/íðŒ®ý¥Bo(ÚìãjêÓ(²‹ßQÆq#ÜxÚÑ&¾/a)z}çoJ„/ò´y;d-Õ§ú®™+¿×#HágÓðÞ ?ÿwC_fµòËL¼ìþq¤ÿëNa8– Êe¼ã¯"hÌc h¬¢ŽO4ý("ùD?„öú«ùŠ»Ür›ôÄ9‚7Óöx´ ÉÏ&tŠ’Á¹ãÄ߆ÛG bâ!;ùxVÿ?rAgëÞü.8ðvºádêËPë†cÇ8¶Oyÿ ø=žŠy^a§à8ÚÀkQ¾IRÆÜßÛõ{•DÛ?Q ÏUTC¿ß ¾¥*äx+ìpV¸÷Åxu6g×Q ï'¦¼,¨ÔstžWSŽëÁñ§óòÕ}p\WÉ•‡cd\»÷Ç<´ ŽN„¯×{-f¾¸»²Ò?Îà}y$/{ë WuvkYWqY{å~‡#˜þ .º'‡Õ1ZS¾: ü_ïÃxë³èÌq»Ýžg}Yê<Êù›òõ± Á­åkp"7MaÏKÛ˜ò“ <ñ¼_÷¼f—hÁq„—= ï‡nr^@ðPbj8\,Æ> óÅU® ;µXÌ÷_9W׿‚¥/FÓ•\{I¿ºþžE•ãCwÉýLGý)ðûÂeÕx¯•'²ÏÃud±fI8^\Z_èÿ¨^¯k4ÿV‡o0ñó ÝOtwËc \tØùš w6aùµ¹=‚ë²?9±yuç÷+‡¯_ÀúÏn¸Õ*nÂÉÁº:}P[ÓåcÑѲ¿xðJõßs‚¿o'Ÿ‡í»òÏO¿= ¢í×é~ŽªyL¦j"þ}Îeu}“Âø‡ë×¢?÷kZêË?_®Wþ쾺…?½òDÆóÌÆuWo“g¤«cžù”ý /•­©·esªÁ¯9âoÉäß ¸@ xåkxý ‹Î ®ôPBÏ3¤~ll×çz8:œÀ»Ðz¯À£Š~yó,,¯ßu,ª¡¦›òýë[X<r’­ç74£ýãÚãH„òûPC ŸYE8ÿضî…~¤ßp‹#l?o}ÎLîËäxo ÇíÂxÀ¢ê ‡5žÔdXu©:>ìŒÁ¡+Ùuÿìö>c ÁÍ”tèæ]ÃÖÇæ¤Ï>Ë.ß Ó ¡:ˆ¶}˜ÖÞM¯¨&¤®ÒÛ²ŸDqÆë.ùµ›~W9ç½0¬þ|z_±nc°>옘õfÖ-;Ü •œè‹ùnǤ ó/Ëõ7›÷?| ŽºW­“Z^š–õ Éü½Oìð¸4›å.~Fù½ 28j«‡ç}¤és"ý÷ÇŽ¦Ñx0reØSƒÇ혞¼W}º5 ܲâÍbíS¡êÍ>?ÏFÔ‚^ÿ¯S¸u]‡'ÇÊ/bÑÕzÄ(g|˜|p¬øô—õ+ý>ì1YþcùW¬¯`G<ûÎ>;Ðoù,\°.8ŸvÑqò:>9š~…Ï/RѰòÏ(¶‹×EŸ³ÿ»&/ˆŒ?GãnãÊãLŽ pÞ¾zå•@WÇüÖXyLé¼á)†[ ©«—yûÔë?†No}q¡á9ûiu_·¥Ÿ*¾¯Ásm'º}ýÙù&=Rú4&qY3M_ãÍØùA“^ž?Ž7‚íóŽd‰ùÇ'veu…ÑKØ~váXæŠKY=áÁù>ÓŸýÿî vÏÛ¢Å\çÐm}Dv<ù]ßæóϹê2y_ ¾$œÅo‚¯ÃÔû·vü›·³ï•烜uÐ'Œ’û¸ û¶q¼eãä>NžD>ÉC¾çö|ˆ¸-å{ëkéטtÜ-y¦0“ë{pÞmñ\Ú|iœCo ¼ùò÷Žþ¼ó:7«ùcÑ'Z'†DÄ…}ìoÐ~|TÛ=ŸQù›SòÞ_iô~¸ß†ÊWCõEˆ~ëh³MÞt¼Dö©ãØ &p#Þ—<_BxÂSøŠË8nçÐ2~¶@ã_5'ë´ÈcOZö·8žÉÇôÑðfó|øeGÊñ%é{DvðûJõüó ÙçúÝþñ†zVãõ1ËPOkì†kÄ$†÷¢q®œÅò7BääÎÊçw|ɾ÷™,ÿn?¸9yΊ ®ùÊ©±ðüyoðñf<"}ïºøÎd‚o8ê¼LæíP?wÞ>ÿBy¥ ùûQÎq~#sX~³—c½oâKì{?§ŸÄOÂàûçmÞ‡qìHå~ïíâxÒ÷Fdý8úZî¿ê˜Ãü y]?ÊÖèZÌ:;ü¹ï;‹å½ªñBaÍ–Ï&õ< ¾³/Ë;ãܾvñÔHþ½væÏ ï—ó¾å~äf~¿Oª”ã–K¿e8ÍäûjÇ÷‰r~ŒâQ1_—ô‘RþWTsÞ¾9Î8VÓçøHtgq–®^·?¥Œ§ñGLzþuNüQ¤õ ‹^–¯û­Ýu]ýyS_7Rÿ}æÃ,ï÷)éךù«ó~l¡k#tŽÄýs­s¡JÓg6¾)óN/.<à•Nùû çÔùÊ<Ïh¨£’¿¤þŽ^¬ßÇÄ‹"xÅ{%ò£Þ§ä½ZÀø¿©Œj¶£œynùï“Þvƒ¾¤ŽçÓ1NÔŽ/úó þZþœÎá÷3ßÀßÈó`ð4¯óÝ­îCmJóæ¿6Œ÷ÿb¨#öÙ”ëödBÞ‡<~ýu'ö ôE~ŒæÛ„^ŠÂñÁ¡„êðŸô:ÕqrÈ<5uÌ™)ãx‡ÊÞ#W»ë5võ„бrÜÁqÇ(¶ÌOðúºÛùkº>zïO<³¬sú×ÉpÎhàËçGû‚óÜ5ÞÝnl½Õ­3:þ=ߤ¸Ùj– AS.‹ü®‰tO3ªƒ×WÜۘᛮý;Ñq¾šùÓù<0MÈÛjÈÃhú q|»`üÉV²lÕŒ?ýáÀõ'NJg¼´Ÿûßó5ö¨† Û*ãËj»øÒÛ©·0Þí”ëtâõ=Q?]ýw6/Mÿr5ñåe®âüCo…ãG³Æ÷muË?Çeó@´8ذû×)Œ'.Æ’/X}qÕ6¹^[Bê·ãvr~‚«›5ˆá8ºÏ ŒO¬û¥/*•ÁÙO³zΡç1œŸ¡^ÖD_„q>=쮯{Ÿ¯< uíì¶OµuŒSÇ»ñýÃ[©ü»¨ãët/RÆ©fÏ·àõÿNô(Ñ›ãw 伺ò:b™‡àË-ãuþænû,íOF W|]zu˜¢†ã›Ñ›×«º¸=çhN×9¥/d¯[Ó¾XOÎ×£×P(~4‡=—; |r%éÙ¯0¤~uâ±êµÿpãñÅÚINüü'¨½.©3bÑV© u¢Íñð2Øê†¢RÿÀÔñè™ ¸.-øâ¤ gßÎâù)·Dª'¡Òn_ÒéV£Ô®.€ëZ3­Œ NY×›¨ßw4!zÃd}x¬l¼£™î®ÿÜßrõÃìïxüyÎðPë-ŠÝÖ9]Ÿ»ÿÿ<òùN-UóðøXÔ©üã{ò¾®{ãmÞSú *HÿèügÂz¶† þâ”@˘øœZ¤'Oìˆ|‚}‚ñsX|4Ë3Îë)¯ëD¯ˆàwpd8¾YW£ü ÕÐŽ÷ûçXâ\4¼N~_{"³Œn‚‡%®ñ¢öéú|—Þ*Çs!y’2Ÿ¿e›£_€`žCä“< á1ƹìêÈ TÈ÷‹÷ÆÓ—׿añ êŒúI™ð0~½â|Q ÿnÿôߨûÄÊ4ü}ƒƒû›tüþùœ×’ò¢1Áçq\Ö.&óhâK=)¯* åcÒéõò{¿›÷3v‘ã0ÿïêö_£á®«Øº¥Ñ[¦üÎã·rìgšóY¢ü’hÇëòån|~þù~;dñ:½7óŽ•û¦šE«c`ø–Dò/º<æ°Þþ–ãÉ&Þ?û0˜§bù.¹^ß”¿gçoˆ¥nLï+*ãÁ {›8þDÔS[ð~™üdùRhØTF¸‚%[Âõöˆ†ëEMpÊzœ¼xu>£âLüq6&zj^ÇÈã‘÷Sï3Ž[väÕŽ}^]ä¸H§·›ø<ºÞ\¯û5z_ÐÎϽ1™ú#z?ŸÈ÷ƒ±—©ó§œ‡Éò¬¼OÏc}ýlõ¾‹*u? _XÕXÎ;oŒgúñºÿ£LíW„ÕÂìÚxü¹®šyixÑ5žº$Šåû¥ãp5ª—…rËþ"MžÃu×,+þ oS̼F†úLÊ<'húh›Ãp½ ¼Ÿ–ñ‰k½Xç›ò‚/^;ßõŸŽ#>áø$â6Z' =NÓhõ/j‚÷ÁÛLxÆÀø½ Þ½Mðú‡lǾ1’O3­ïx[8\ô;áö ¡Ïåz^C5œwã£Ø3þ³9Ñ5+Q»òƒõ¢4y[½ì¸ ×?ÈúÕ®¹Ò)>ñ6p\V•v×éÌó˜rüpë}Bî{ކç¥Bk£ýM¾OU¸8&Ý<2´Ï ³¾´ó3Þ_ïcùü°ï…Ïkßšðîy½6ðŸhÏÛ¬á+7äk‰Ÿ…üp8ÿü㊣J ®Fóþa,Ë“ÅcUI¨ñ(ŽP{ÜŒBùÛb]F…¦O­ÛJõy­\¯Í0€ <ŒÎ ~9 ~?9ï€vÉöQ£¯GM-Qó\OÞ.†}0+~Ýû£ãÓŽjØTÆë9òÀt<°ùI‘Åû^~¯®Ñ s¿±ë_6éFžô9þ=„ñÙËØæOt²mup­Ç¿élu½¨«Ûþ.ò/ÖÇ[Ö1P3B—úm¸÷ÑÄãlœÏÊ å¼çËòÞt{OQûk Ÿhãh8G‹?þêÉëcÀ»\;š_•ç•ï¨ûãó4u¯áêíhœžu£®bu³€‹þä´Ÿ#ߎ÷ yO4Î’ïçÒͲÕÃëϾˆŽ”†³O’÷Ïêõ#…ÿód˜x:E}Ü>O ïÞƒS‰Çlù…þ;º}ž¸™­ãÈ!õ·ÑÁú;q›­>i\† õú–r܉ƃ»ævyÝ™Éú½/yþ®Qzâo“á$¦ ‡Cï|Êû5ó£XòY¡¯ƒÓdÝ Wœ~0‡3¦=ÃÝêøÑ›…¬³.ë)®CGž·w¸ºCìu‚BïÑ CÐÛ’w–à/Røézr}ÎÏâÝçÓÕŸîj‚ŸAüŽï«ùÖ\Màk0$\ÿŠ,ãŒòp¸*W~;êŸ"—×]bâÍl(fÒ©öÛ’ÇìøÆë`ñ¸‰—>c Ût¼•IŠ5?û¥ßŠY$ï£ÉcEž×ôBá¼=šzÈã—$º¢mD>›A÷ªñל¨~ØÓ’¾àÑŽß…óvLî*ãj:ðýl€º¿Ïþø‰Gò¬y2ë¹ÛÂåÍ-û•ýëP=·I²ÿîý‰à;4¼Ëº÷ 4zcƒåü«ž†Îly PÕOöW 4¸ZòùÑOæiöùZ;;ö„¬‹ØÚÈ÷Ýû<\_Ž÷2Ñ¡ßÓ‰aEpKèªaÀB»¾ÿ‚G‡ëËœsºZ¹Xþ|Xû†Ó}B¾€¶·¡©ùÇMøVîOüG4tU¯QMàŒüßôüÇÒþUŽ÷U–< }ìâ>S_æ>K^ó\[ðs†¿z±tD÷Œ}7 K®®{âê¯3á%â2,þ³ÕuÐF½~ºêàÜ ì縋ãí'Ðà“/yÊßoü}¤º»Ÿ€;Z[­‚<ªyß|Ϊ5,æû%¦4 ÞǪãÑ=1õ!Ïß’LEÖÇD·®ï8åü|þ³¼q¨øÌ§¿ZG$¬ ~B”±ü¯)ŒÆ²™ÑôRÐCw¼vDÇëרõ¥PÏø&žäóxT“—LʼOêWGÍd܈bõzªãÏ5Y\ù$ܹXæGù0&>«™/»õ_ gú8|µ•Œ)ÕOëˆÔbçØ“NÄíÛá‹y_X#MÞk6«¯„­óbáZ;ݼ;›Ëz#eÜ_# /öËvÏóõþàߨó9ÓþÅð³“>|RpÅò÷Gñcq›ïÿлÁ¼hëO•ó'[Ôë šjú† }WÞ~KrG>î¦1¿w¼Ï5²?—ßï§Åô=ñàšV-“óŒ•áô’üóÊËg¬a˜ðÃSþ^m½¢<8í6Y7“¬/tj¢¼,ºøÕÿ?ç!ÆÀ«’Å)pýb¬¿q—„ëøH^?麆,MÞÀÐOµ?ˆòm…§µ]\¨=¿…N¯H½Oéô 0ùÐPùå¨qyÊq韂ë•.³Ï˜ÎpîWõè¨õDQÔ^ÿöóÝpܼOÔui½5q@¯Oö½™ótö¡^ñàu¸etá8êJõ~…Ž]Mß›‰ëîS¯]&ôg÷#E/S3í8\™¨Ž3‹%n5­wÚëçD½²åu¦0´`þRÜ<¶ü_aMì×ÚëYö½­o_'Ô„»>—ñY–~“T†‹û‘KøªL|ôD¶ÇÿZê% žG‘ïF!ÿ{§hù´·ì¨"|n;ÓÛ‡<7‡·3‡QWxszp­èªÎÏ‹xD«/xÖX9>¿³Ý÷ûƒ§ä¼cc²¯ûa,¸ao/‰O›öûZ¢ø—dýÌ~<–< ž¸n™”·Éx]mø¼S¹]ç¦r·ºEUÃâO§†V7ø”'Õ Íü3c=•ó zØO‘/ ;¯Ð<¯œÙ/Œ¿bÒéˆË¼–ýž-"êkê†ÞÆàü ŽÄÛ®åDÿwú¥ç‹êO];tá8D’'Âe½YÜCt°qQ ÃCÇT}µ4¿—òù ÔßSJÿâ¨ñlÞœ¿ËÈ:¢ž•OGy¶+Ÿ‘ñÞ~¨>ÿüá¸MÁ|FKÞb¸›j>Þ¿ˆ¿öÄÕ÷ù]:ý<,’óºº}8e<nE†õìúÏXž†|P¿ÃU9ßO¼ºm&‹Kÿ%݆Þóã½Ô:Õ¸ø ¹¯À‘G_g)ñHcúbÐù Ûï…ùÔ¸§î³Ô¸¥ÏyÜ4ÊÏÎä×§ôÏûFý>zï…Œ3Ïn?™×B§k¢WÌý\¨TëFÄeQñû)ãí³ËÃàk7JþæÀp¸1×¾ùŒe¬!ÆÉøÁ'`«+ë,kêœ(":b[‰N¬#ï²mßå/‰Ë0BÓï~ÉI2Ï×ÒÒ?`2t·Ó…À”(×_o[´uÙ¤fÂ%ch8< :ñ8g@8\aÞ7nñ-ÿ•)o‰áGÉxÆeʸŽ^ƒu=7p}”q4xkô´ìmMðŒøßËÙüÅ}ˆŠƒÅâÉáÎ+ЇÕ+å߯>K^Ú°ù ¼FŽºÇ<¿äóa|b÷\{ßÚÕß°à u=s¯÷òz0:<ó-]ÙÏf¼?xF_‚󚣉F—æÙm´ù1Ü SÒÔÀoÈó(·ã‰ÛÐ^ž¿·5^|°ëzçj2>V½(ëëÖ0œ í{‡!ù¹Žþ’­ìýÜo½ •ò÷6¯Ö¼ÝñôÅ`ô§ _Më°µeÊç5%?{öiå¥4Z˜t ìê¼”wA{=‚çô6ó¼JsËõ½ŒãdÖ ÇoÖ*=ücÅõøOçó5¼¹õe˜-ç]D ÍcÖÝk•,ÏF\†¾ÑúŒãwö«h]Eן‚ùw7身ÎЛÔú žÑôôÃ'm&ž"“ù<~+?eõAÇo³FŸ£ ['’æëÀ°ôâÅýnx%¼DæËke—¯}3ÈRßf=Ÿâ§_c§ØÄà/ð¸že=óK¾.ô¬üë×^$ç‰ ë½-ï…ñº•êõb¿­7×ÆÒ¯Ío˜ùѯí}/#Õywœ»ŽÅ±"êÈÝÿŸÒú¨‡¤ËpÓ»áx:9¿5Žþu¸ó‡Þ¦ÆÅq¼­­Þ„ÀѯWšÞü§–ÇoÅ §|½àkDÏ`]W,Ë~éíM¯Î•«Ñú‡ÿwÂû€ÙÇ©ñ,#x=6‡ðq¬x4TýHäÍlG»|ÁŸæÿ®ÿ”m/Y׫8ðîô¼g¢·Þ+ÏÛ w¡3ô$ëLWÎÛhành†,ôzû²#ÅmÞVâ/äüB•ZWÝ8¯ü^þ¼t¼6‰xô|Æ;³S¾­ßàø_1ÜFÇxâEä7ûÂ:ZúµÏÞ,á1œéozÿÔààÛñü`‘%Ž¥éËÜ¡é³ÉçüjSÔùVïçj?7^.ó€òÞ‹ÇPÊëÂë¶?úIç…Éàb—¾MW=a?¯bÉÛeâOð»î®@Ê{›÷-¬¡>¿v}0ÏŸ7«ý,ظ~aùOäz÷Ï1ž’o-ïÃò,»zËý£ßQêZ ²‹«ÿ$¾Ç qð‘r|ÑŒ÷76Óð÷¬ë¹Rú}éóxfi‰S“ûi‚'3²”÷ ]ˆŸÝ[Æ)a`M°.N¾Ÿ\~`òÖfL6Ì»Ú Ÿ£Ñ7 }ý¦é‰´zã¹hèãLÊ0WÎK¡Û5áxfnîÉðkÃÜp[Èc÷ÁÛü^ëÖå°úÆÖóãü98JÝŽ5_±Ÿ7nWóîêäIÕKðÔ *þÇ¢ÕûïÿFÇdã}oOD|\kCŸuQð~.ú Q(ç™luB¼mòs"úÁÑ•ðúµ$}&¥¤¿~ð ¦o@x…î‘öóÕ:òÅ ÿ ¥¦^9“öù’|~­¬/«å¹=ªZÓüT½¡”çý-‘ïÛØ‹]Gt†µ—„ÃÝõV—A§úñ£.]ôѤýú‚ëÇwmÛç»Z²8Ê1þʘ›áøÏÙº’òüÑê:>íWõt2àfû«×ooK¼õo‡&ΪŽÇ£ö=èúÛ’2äYò!–DÃu¡:YžUãõû…Ó9x¶úª£â‡³åø})‚y´³Iü?ós%ç3ýI‘Ljk¾¾Nö”·Õ~C¹z¼ëÀò$÷M{8^|8‹ó½ê} ÓNLdýü^qk¼®¡¿EÇ •rÜ^Îãþ1á§ÑèMbîoêŽÃ¬Nùd'„£Ô<×që CŽÛºŽnnusïKõû‚ñòÕêøF1ôi¿û6á?É”r ;=ïS¾î9ê°àé‹Û*Ÿ_KþoŸ¥Þô®ÛÝ/\žÑçäÁþljûí–}ò&óýŒΓ~Up_‚÷E¸¾, ½Wö§fÿ!pòöô4yiëùŒH“nø­GØùÙœŸ{àÂDâoÑ_×xÏ<½ídêš Î<]¦íohì?böýuÏ£ˆ»mû:C¡ÐcŽ'¯€ª„øPÇüÞ¿/ø G…Ôýãñ‡·5ÜÆ¼.÷™ô‰¦oƒB¶®£Ç-×ÙquQ ~-D¬[~óÏay¹&$É?Ô¸„ìþx{ìê…¸ìM™Ÿâ{o³ŸœGD‡ŸE©³ ÿÀë'`¨›Œ'¼ ‡±À–ö ×À¯ØOÍo$Öô‘ý=øY¹?‹UŸ1M#ާéªö§E_nŠnüAn~„·‘Ü…?e×íÏyVþjÐg!Ï%Ž{^cìGòø7…Opé«Éôíßx›G¾%_Q1Ï_\{´u¡ aðx¡õÏ뿆g/ª‰zŽbü'(qŒ£æ7“ûä ¼õe¸ô¯j\J¹w¥ÁÙ¥7øº`ïÛ£zçÞ>¾µÕ¬ã…¦+‡3Ûx ¢åGÐ'Ï„v\M¾-I}¿˜äS?Uׇ¨Dûbp÷KŒoo¨Ì_ˆ•y ò9ÏX°¥ —±Œ†Ç÷/KB§“¾fqÊ+Ùï º¤…¯3ó"Õ[ÐÕÍÏÒñi í?B8ì|¢š÷guFÜ-ï—ÕŽõFÎo‹ÁuC–V׋¾íwÕL:½:Ü1jÔ¼ªé6t¶ä}hBtWNgü§–ºÂ¨aÏ?º‘¼ÄªÑvù™V¦#–¡…''æ~ƒ¸ ¥ÉÔkE=â¥Ñ?\^Ò•Ç5$_Ùƒð)Ôò~µÝþÎO¥ãÅÂé‰ÔЖÅÍèÌu*‹ÒÌË“cY§ÝㆠDNÂýÁñwb¸„iG$ÓçY£æÉBópõVÁCŒö†õê3^Ù™LŸÔøQÑÆuýh£èÍu=<Ð ë÷ú&(Z³ï›Ö RŽ3ð¢Ð-~C/®ëÄyþ16;™ú‚-n¶–­"žD?‚§n—£Op_™·…ï+¥¼m©gek&>%Š[1†ôcyp]¼cË©¿½zÿCáËûÆÀ_lx®SŽß¼>aÜ<«õ ]x?^ŸhýI¸‚óðj>'ò PwÇúÙ|Æ{Z@êj]\\vë=ú‡JŽ>×¢Fð±¢2‡hÄÑ•êìœ 3¿Tïy/1Ž ¥ }ýôx_¥·ïGôÛ¡‚óÝV‹¦£2æj†«ÉâqXwúьèŽhð÷è Uˆä— ÜŠñ:ydŸ¨±[Â:1á ‹ ùV®‡r»¾wíuF|'Ás£X½_Ûòèj¯›KêêÔÏZr^­ovÊù=ÂÕIP.ï“èÑïáýû(Òôßž8Œ, Ö‘è¦Æk¥׊àÄúªßþD`úgþßûó}yÖr¹ÏBð]éxx‘Mü?/u·{¿Êÿ‚¾nz†(p쯩ñ“Eþth8ÞF“Þ­·—ãï}ð*î¶5[þ±tzÄËÿ” ]q4—÷]̾AÆyvŒ¨·ýPq]Ÿj?•ùI4:ïÞödpŠ˜ò[·;ê «ã:qÞôp$æm´ô߯nÜ|×b×õ]ãÚgäß;$›75²4ñH1ÿ¥1ߟÆr¼Œ7?ÚûZ3DÏcuU×ÕQE∖áò8ÖÐ÷דùG:žZíyy‡=èEöûÆ_„¦¼XÔM]ßÇ&vq>úkâ‰Qê>œ4ø€Âõ¡]Èx-Ï®î)LÄÑBï•ãéù²ÿÛ*ÚþR_&ü²t_‚Ÿ´‰8~–ì¢,9š¦·cš¦…RøÞ_Ü>Ÿ©/ñÝݽÁûJ4'¼ñhžAôŸPíüºÆ“W²5ñ®œö³w4^ÛýMà=Çä}ó–u1Ãz`Í×6œèøXâäâ2L¼0œÞGßhú&ó¾åùø“¿°Ê¢[¸<ž÷U¼q®·‹äÿ4ý”ÞÞ˜ô(¦ÙÕ—qêõþúhò0[4ßåV×¶5\UÎò\5r~ã'ÈþüŸY~¢Þl=Ÿ1vúíƒß[tKO= mÒ‹#÷DßèCCÿ쾆Ù( cÏT×I³xÝ U4^‘¶]ïMøqÿ8î *=u[Lé*×+Üô)1^îw ¸œÄthÜü ·óG3^qœLAèlcÄ»iŧè ÃdÞÏÊùãG®×‡ƒ»¢æë3ðóbú_‚qcç<)¦ûƒÐe;žÎЄóä\ÞNγ¼<Nx¸Ó­[Nóèšy;ÙOŒ”ãMT3û€ÓýÄ 3œö šWÒò<¶2à€g/`ñ,Á• >e4±Q¼†NržM÷ùüãÓÌLõ”#7!MyÌ·ÝꢿR¬g:ü#^y®O»„ä“ý9-|ÿÞ¦ýC?X/õ³[çÇ~pË«øòѤNØ+=q%ª5ü€÷d¼Íþ@íx‹kÿ™ ßq©·ÔNÿ²‡ó¶-ý—Œcè ©ÿ­»ƒùÓ8âÊ-ñ¤þñ<ï‹+Î’÷á3߉z÷5}ï5Þ×<µ&T¿åmCgo¬ëC1}ŸøáƺÑ—*;:Ìž¯ÖuyÉ /Dú€ñ??¯#"Á¹OÙáÓ»úÊ+Vš†ç³—ôcåØñ↿Êz«KÕ÷ãK7þTŒhlÕo‚F]·êõån}Aè¨áÍ~Ë Öž÷moâ|õ?{fXý»þ¹¢ûJ~=þ^ áëñ Ñú1ù8u?o#Gþà^¬ê>†íjèbÉ·‡óiô÷lyîeÙç‘«Ž'0±ôÕ¡ŠóRix?°¤:=9Þ7æí0ðà |ͮ￙#ß÷fžúùç0½û~båOxïqÞÉ"ÃçèËÎtº&¾'œ|»ãRÏãýIûÓËlk¨J¦?ÈÛåÖ/€%Ïî/xøåÿ×øú·‰ð¾üœšô^myˆly@½ýÁ}™hcÐa Éû‹ù=Ðõ§ã´>Ìÿk¶?=ü—~uïѸuì=éËãZÎ+1á™Ïçž dÿÙ-±¬SQy»£öcÈ›ê¸Ãr}p5ïÏšuðΛd=ó12¿„X÷’™UªaÞ#õ;¸êMàŠViåÝæ}+¿/hã¸~{U¨ï탿ϸôL¼¿q~¸Æáö!_/ü3¢_Åye½Éèˆû×ÙÜ¿n¾6Ú§oâcÔ²åï·Ü®¾×ÃA¡†§Ú #kœG_¶þy»Ã#âIø²»ñçj—!®Y"ó¢ýÝ®Ï?%¾~âh§]r. Z°ã(Š­aé¯e^…á½áC¤æýÓ ·&ø¤®þ)ã8îõÀûO SÏb|Kx>ÏQ¿8.Ó=‡®¼“èÌu“ÖŒe~Q£úÉâÒUrž­5Ïk.úÌû5æ5OñhÔýŒªgéwØsŒÏèÌ%,Ž=¹]¨8CòÔu Þwt|‚ÇÛû€½×Èãqä9=%¿ËÛ`üB)¯„‡ ž·Š‹WÞ-ßsõod?p¤üyI¾r”&_QÆßg¾ïS}ô‘ù¨pèooÛiÅòú¸î»$>±3‡²ñr4ùÎþD/™ì›&ýïsÃú¿þÖXâWÓuüë ¾MÞoßSg ßh)û»Îß·žß?å¸1l=Äùº;Ãé /çÇÜ)çtûò,ëUyä>¼Âó¹žåä×¢3ï#ê7Ó:›·‘ø·ÈKª ùªª•a§Â¯ïv<&Éüjè/§àå {>®º)-¼5hfÈÇ|±·ÿýŠÕ+ŸŽã”wz Î:Áƒ þâf;þ&oK¸¸zÕMÏÌ£Ô¿ŸÏ&½‰Õ$^Ë'¿?¶¨T®‘ýöé;ZÅÊ“ü³Ÿ³:i×/ õíAÿPûƒƒåz*ò‚ã>Ü›Ëü¼ãñÀï Þ·¼ “_CËg9ýÆôòÄç8æ¥òå|4Vþžå}Qëžbˆ:~¨oóöDË/aH2q(ªëès'Ç=¥yo‘u`ô©Áx‹§Æ³ï |äiôYúÛÝ?ÿø¬ôâ¼ðð¿cí÷A¦OÎÐúz}›h>…ñâÞ1‰áºŸ ž^à}PÎë ×Âú·ó>äW¢åÝEýw½m×§ÕÜPßÍå¸8Šï&}•¦yã‚®«Õ:¦ß!÷©Ð¾ÛËn‹å½¸a”qœd Ñ-Ó­oÍ ºQz¶¦.Ü)œ"Ž›Úª^ÐçØ•=O[ìêCBŸÛÿýs7ýù”ñþ¤ÎçyïsܯfþЉºJÊß5ŸÛdÈ#ý%~Ѝ}¸Æúø1!\?JÊxWþÙêùÒž¿ö„±þï#»Ï‡ Ë:ln´<ºNÐÖPØ0òø&ÃÒnuçvï/®xŸáŽ4ý†ÞlÇ_^0$Þµ+åëhúëÃâÎLf»~RýLÿïM‰þ`H=Ï”qjüòVÏA#ÍÿÇÿ¿ ×ÿì¬#Kãí¼Ëõ$ÜòcùzCV±úu+;œ´·›û?í’Ýg¼oâÕï5^oŸü{›ƒ÷à7j=UÂGbª§ãG=¹ßÆ÷ŽšýßZ¼Å‚“#íÚù=ò9Nçº×Þ^ò\}¯Œ{ÊæëŒåsÛ|+ít¾1÷²Xpiþ\ Mà±ÑI³N[ö™"_ÃïÒÆíþо Ûãqùí‘ü"‹G?6O ‡>j=ëQØù™ —t Ž»æ\%÷é7®ßãL5¯‘÷7â§àqÔ°{íü¶*M#úHÐTó<ÿ›¬ §ü0=ýE|},HOŽ­¡Æ ÷o2¾ Ù/?ž>ö¤ 5vQô¡¢‰¥ÿThÈKpÞ<\õAà:Dó;®†žÌ¤qZç—t:ó¶æ}oÞ6‰Õ¯ú¸ÈÒèÛß8ή?eF/§xÈûy¸ïÓÛf‡{[£Õ£i¾ÌÖ¢òÁ u]æŠÕÊw%ÊÛ!ÌÛïWÀã¶¾sdþƒBÇ>оÁq™èAÅ5j¾ >[ãÏáG3ûòµóh?¨Îh~P˃jÙ…>éñ?𳟭‹Ô?«ó#†<.ó…äOÔù#þÿÆáâÒ—É`ԶߟUÿq]Ÿ"ºÙÅ©þyù†úO¥†/%OÞotÏwÊy×þ‘Åïº1~²Ë7Ú½O¥!ñÿ‚ý1ªY86p?EW¹?Õû]Ý&eœ¼~èÈ'€UV}ü¦úZ’¸ê„¡2âäJÖ—s߯d~¤&v}ÂI›÷ûIŸco—Ãã.ôw«à{­Ô/&xªçNdûÙ>æ?bÅçŒ{ÎÊõÜ*ô)pÉËlÝX|:ÃS]]Æò1wü“]ïÔñ,ÿ>ç!5Žã©S—Ôñ òST‡A;¯³ngõBËz“q¼q+íŽëÎ÷§ý¬Nà½Ìý žÿÀºofIû~{²¯ìsÃ…b2á)›^^°†|D'»üÍ›Æõ½ùãw&uã§n»7°^íˆÏ¥¼¸)ÿçϵ÷††·vyo‡[â¢48Oëys\Ô’úÑoID?u—·?"ÿû)ÇÚíçÝ0Üûãûò˜¬+õ¾cžº­úyC.ç¯ô4¸­#?ýø£XVàXýù¼‡‚¶œ_©€ó,nt<ÿܧ÷Ô„ãÝC‡pu„¸ Ço’󿓸÷T!Ç{(ÕàšðŸ'þ(¸~’k¨;µ6¬ü™ÈsëÎÓŽWc×g©=«o ^Vãñ}Õy9̬dÏe%ïsZÿ»@~QtÓð„ws䥛ðK¶ŽŠºþ%«×i\v‰Óó <ã‡{ûy=Æ‘gH<—®|ÅûF0¾r×YÊ6ôÝ5çßÛ¡ ЈbžO© ækKgæÔuô»òXÞRÃo.ô LzpÚë6"ûyópx$tIOWþÖÖ𽾜ïËÑô›;_oU–zs]¿Ê•?JÔoEGµÿ úuçyÛÓw¢ULüç[ ø¤÷H>¥e¼øXÑkûîS&Ý ÔªãªóöùÅ÷°x¬XÓ;ûYoAäÇžý~SÉï¸ôE¶Ž³|›Ž7¼#ÿþìÅÊø³æõÔ›¥}HW'M9ŸÄQèÄqá§*ã'Vž'ãökeœ–Î; ú M~5ÎèÏð–¼§ÆëiÖqñs5ßù­å¯Ñþt¼âxúÂpüuì¹=¾Õx)|ÅCä÷Óo¨O•æïÅÉÔ—¼Ý¤Ÿ~ò’áC%õºñº—Fg-ª¡ìÀ¬ÿÆmÀe,¯öÝ}F³dx×´×[±LµÙG3³U²xÅ¢St[%«WS½Êö\Çzí#uºXÄpé¸gE¸üÃág³þöó×0¿“Ô‹„®šð¼Ã)]ÔyÔ™Á:P8ï æOœ$ï3èdÙÏuçClž·ÈqÌ-Ÿ°÷ö/4&÷óÙNr}zꯕë òäß½/4ý.7OcùŒÎ>Á»±ä6ùûÓô¡cÓ)ÛX_Ò)Ÿ°ó—öd×éÉúE³/aõÒö¼Þ$êƒOýºnÁÄH®?Ú6øýÔñ·…5œ|‡[á¡Æìç̯ÙsÜš÷täu¼Äp)WVÊûüý_ ÔU¹`9»{òóÂñƒ(g}_˜<=×+O™ò¿õ1ýRösu§áÇ+Ç×Íï±9u/(äïE7&HЉ„go4ÿ<Çp]Ùçþóº2ŸÈûÛqË5ÁýG]Ôß—-QÊx׌= ãh´‹‡7Xà9SþžÏûÚ‹ÙïÞ׎õµ[×óÒý_äòu£·š/)ÃŒ3Øó÷ÀÓu™LÁ‰ÚׂóãGÖ—§¦|,ÕÇnùó[C>¯ÆÏqé=ê¾›‰Ëê•_Í8Ìmw%çh¦«û‹¾xd'£ u XJ}ig4|¯÷ID|TwuŸ'ŽÇâ]_%çÏÕéÔ»š·‘÷!ñ<ž5¿Àˆl_p¡\ϺèPµÈuÉБàÛjð#y½ñ¼juÜÑU³o‡ä¡E-_Oz&ÃßÖ0<|ÐUÆ©¯ØñÍ-½xÓŽêÏiËû+òŠ´_Ýìú©1—iÿŽöøˆ<±þ¼5y­”ë]¸"­ae¿PûªØ—éßEߺ¿Œ§›—éˆxøuÐZ^otüñXt›ßôuÃa¤Ôcóå}Æ´>{{qwWæ±8q€Œox4%¸’‰¿UÞOïwÉø"~4w®ÌžnýªQy›M†ÛÞ Ü¯qv±Œ{›ù‚ÚŸ»ãç„—ÑO~ÆrÞ¤œái-®ü›Õ¾@ñ Zó®¾È|7| ^(z.ùÎt™Žs.l}z¶†×Æ]]—¯YuM,óFO9¯GuPQOÝþ¢…ÙO øo̽D½¯iôP”f\hgõß½]<ß\Äyj¿5¼—ãÅå Šç=š¨ë€è¡Æ%SOÊyåýó¬¨T¿W¶õ•¸Ìû–òTÉ÷A繚Žç‡uˆ•Oô Øö„5Ê—ƒ\%û'¿ wßpηêç¼èDÎk£ÎS¢Rí÷èð¢a =ØsK×Aï3ÙE–]<áíŠæï$UöÇß² }´ø£Õ¸Á‹o{ßÐÒÑ¿y² ö¥ÐÏÆPyóë(ƒ?Ÿ·9\ü¤ã§J™'ÁùÝÈ:Œ29oe‹ßüîÉûÛóx?'\ÞÛú{l­Þ/E>Åõº¦þ°F몂¯Ã{§añ† K*ÞBVȺ]Lý@P ­X>ÈÛêÈk<ÈNg(å¼^¤Ÿ¸v=Ëî"ú€“õS¾«†“^rzßD|…nj|#zjú"K ÏÆÌUVþ–1~JñÓvžÆq½xxï¿«†³á£<€ ÃÊê•G+cËXÆ2–±Œ}wÌi=Þù#Y=õW)óeË8Üôn`\çíÑôékxüPù4Ã5húèµ×±íSX5P¯Óàe¼Ýñà6tõíñ!ëMÇ^'çWN~éüƒçwzºéñé,r¿Œ£¾\Êù»I>îßåøõñ*ÖßPi§KçŸ×–ç㪃Ïß—þGÙgšCð°„GL×'Gùü0ãôòâ©SÔ—™xæ½oÒË/ŒŽ¤ïkK2ø ㇾŽü²K/Só3^ùT¼øÓj’—ÔàÕÓeNYè!%¥—á}®ÞŠ Ñ]æ±FÓôâm]MàÓP톡ý.˜ÿyp_w7Æ«èí“×wª‡à½gÙÏqÕQ±ÞWŸsÊq›ùz±¨7Ãu·$ûØÕOªóÐõWú!tqž7í x*/Géïu³äEÉ£|rÿ˜‰× CùótËGj¿sþ•óÀËŸ.ñ45àô-a~ó[êÏ%xWpˆ.*­ß˜ œ7§ï+ZRŸ´aèøºšÀ½¢E´}…ééËG G[Ÿœ5_qï§îÄqU¼“΄. ípÂX{ëÿ X'špŠÞ»Ür9›¯·=ÚóIõiŒÇ×~èyÿ4íÓ¦þÜŽ8öG®{Y–º”÷Ací¤euþíaCÕ8üR²_n ~(ž“Üt R®¿â”À}$¬€Ð½ð¯3ıoøc¾¥§î®ë×Gÿ`¼$n/ ÇÏew_mýçëw°óQ¼îà¬2Ù?^ÓÛ'rDðz„Þ\ÃQÄd)zî–< ÿ=Þ’ç“èÄy[ÏöAr]í’űQý/´ˆ‰ƒó cÞÆDò=hdпØÉýÔîš¼l3Ò§h໡|”×­5~jÛxx4¾ë—Ά³†Œgx!ª·ëm2ô—í•÷%\u?óÏæ<N­æ:äyÃ0–Wº-¶z÷Þ˸ïÞÓ÷-“þ±?Ϊ‡ìð훓å›8ÐLÄQ( ëý¸ÍסВ_¤À.…‹žj¸GW>4‘÷Q±ïad4ž?S¨ñü˜yø] “FYÕ+°@§õvpþƒ#ûËý¼Üx‰Ä÷ƒ"ù{5éa'Æ ùý¹,Ÿù~zù»qý‡¡Î «ëŽ®,žÄ(ÂSÝÆ±¾¾úpö=ZîãŠéxvcô‹I ­4ï¯ééŸN—!—óXÞz~¼uÍÊç9^@Î÷yÛ’Ý/E}Ùúø­¤ŽÌù¥ñ`DžŽËÁêà‹'÷QU¯´;ÅFu’óâìfj¾—ë7ȸ“C7„›ÿŸÆÒï@ã7ãuÏ­Wª¾ C4¿ñBe&òè"Ob}j»}M9î¨s<õoCÔ‚ê >/”Ùåð0‡õK_óÏ å½ÜAp——è>ŽÆì{8:ú“kìóÉ×Mv¿7Σ½Ûñ:<úÇ7 î#£jެ§R¡î׳]Ͻ¿«óG~mäýùØ”óöiÆ3ð/SžCoŸÜ›„§%_ö+èÿµ×/±{ŽPNÿÃoN¤¾€Χ9¿‚ÅãW©²ÓãÄá2ߌmý—šÀõXoÉÏFy“ë˼-œ7Œè΢¿†¿sÆÙÏ«¹†õã{n}}hdÀ|ÿ`–Ó)\ÝX£k‰ ü<%^œ¿ZzÏE½yÖÙéÑQ`T¢ý¯B÷OÇ;–—ÜÛËÖ17 œ¨ó¶žGHÞ ¬+`¸àÿ¸QÂÙ­;2˜Ÿuqß@¿VôGx›äûíý-žøƒÉ~;ç+æo÷&õ…ühþ·àÏ6Χ±Û:ˆv<þɃ„òúÁ¹ë %éÍë š÷SÌhÏxÎ_V__𧥜Æ^ÞŽÿË„/s5ô<Ã-ïÂu°(O%ú®TŸÅ×óÊàøÂÛ¯öïðƒžlÍÓð™kø)RŽ[¹.ÖüòÓÓOc«S" ž/KñóºÑç%GTAüß{vÄâ/¢’ùíèÇxÈt|SÞ.¾mäùŒÙ'[íËXûþ±ðv¯ŒçzôNåókÂczÿlØñ°ÉPÂqÃÝä¾" ázfc_wëÿøí™¨ÿPy×õ;šø¶’6”ǃ ô¾âuë+Æ…kA Ç1RÞ¯nñÄ“XzS žC¬ þñ‡>“ZÎyé¹yM0þµ'ѧ|ˆ O¤Gtyý¿W\“¨_‡_­Éºšm_“?ŽËѾG}“å‹}M˜“ǾçQïªó˜†ú+:F{ß½7ÈxyÁ÷ÑÛ@xëäÔpÓ¥‘ü1ôPë3ûÿŸzDzuRîü£]~òoɬÓXÛZot›“è~1ŸÃ5ú"ã¢é«áû—ó ÷ ;òwÃPfÇs‘1;à 1\ã…¼¾{p½ÖûÇ=8y¥ôûÍO°ë\qËïžÙÈé{Ć;C)ïçÿ°Ïð>Â}¶Ïxÿ\¾e¶iÃÈ×› Å!ó±?Ó_©ðwQ¬ö£±üNö¢#"ÎóþMøuÇÊÏ·«HJÞºÒдþ·,.¸z¹º?lõHu¿Ik®oô9ï'.‰–Fqýèøb°áʲŸË?v«ÃˆºÊc;Â=ß[5ù·J®÷ø–úýÆ´‹Õ?†÷ñ¶ãx•vñèÉàŽ¿©q/q¼ôìñÑpç_ò|N#¢£tãC7Õm‰÷wìïÕŽS©Žg´uùÿJŽ[{ü'l½ïs`ã\1~«O¿7š‹üdÖ cx Û>GçñÛ§7Ÿ‡ZþóŠ£Ôï©çª#‰õ'ÕÔå¾U?ð†Éø³6„ÿˆë~Ûîo®:ɶ†™!u•Þ#x˜CvÔK_$æ©õ"RŽ»X~ÄñýÓÔz5b=§áŸ¿ñˆ\c¤: ¦ïÌ3ˆyPžATØ}_¨´Ó8ãxÇÞ+ç‹?2ð½ Ï õ¼zÛäçÊûÖ.ŸGûe0sŒ?ã ŸçŠdq#˜{¨ÑÏc©“©3á§:Ï««eôœ[‚y6éç) öC¬õÛYâÎn× ãDï³eè_÷ÛGòü|6]íôüèôäpê]ê<‘úùÂ)ÃíúU‡¯¤[†Æý¤AÁ~%Öúê\w†Ê†ÁÃiÛ¿‰ †ËÏíÒG•Ï'Å ‡Ís£Â7Ë'oé}ÄyÆžZ¨¼žk1®Êáõw@õÓpÇêpý¢#d•¤úo] •Áý¯h«^½=!qƒ¹<5rDƒêç¼uÆãÈJ-ô5½wØsíªÓ—áÌa Èý+ŒV¯ë”N¯5ôx—s;~q°n‘‘çMÃË«Ëÿ`âl§ùE5m¾«ëÑ‹îŒgtñµþˆ5‘¾O å¼]Ÿ¶ÊŸ ¾4œ·IÆå÷Tó ãžßºw·ìßñ¾¡î<ï|Ë~†¥Û‚÷½¹'1žÞž!û08c/ ^¯bù&o3çÃyƒã¥ŠÂá~±z»OÎÙ“ÙÏ«?`xÏ|Âõäà•u?vd?—<›·-Üýr5äqÞ­+vÆš§£ü}þõú%SOCǧŒM†}x?DH>C´#üÈD‡Ý8~ªDün——}<Úëæržì¦éÁ¿ãoØçh£ÁG€×ƒ*íâ~Ûö7ô¢±Û÷o›÷@>‹?Sú÷gŒRë{pÿQ§7Ž^ê÷Û¶¿ÚûK8qï—$O Ög…“ï–ñ},ûï/($¸ÁjõûoÚ‡m «ž‘ëÀûyQŠÒƒ/AA´÷Üï&|¯è§Öí ù} ™¯#}Dþß§/gû_“p÷ ʼéš>ÝÒá½1Z£û©Áûx÷äÿ£Ê­ïCìxÁ(ÝÕyt:Ÿ¸MËß´‰ã—‡¾ÆâÕ êõÈûLí‡ëú°­ç¥ÑmGãxë·è Þ7Mylo+ï'/“ë7Þ^Â;³‡û –ü‚ŸÞÿ}^ð>'žo§F_*]×Ä ‰¹LCǦÃ?aî*ö|Œ"ïí¼ýë¸àGCóôàþ…®8ªØzb›ßC[²´âø‰®†~°Ïx+ï×Çô|eüˆ„?¤0™¼˜ÐòvÇãÿ¡3ÿ|¼ˆ­_BñÞ¤€ë £Œð±¾¯©ÿÅ<®áú0ÄéfÙÕQÎó®ÙWÈqøây¦ï¹xÿµŸŸôOã`Ö¿#òi)Ç?_ćp¯ÝóÌûm1\Ý¿‰bMßç„'Øz—ÏïcÏcjê!a cÃñš"Ë.ïèmÔô»‰÷ô Æ?…ÁìyÀÃÏ×!'ÐHøYü~ŸÜTÆ%xö þÿá3¼*ï[¦~.:óqÛ’ºôVòœr}+œ{˜Œ?,´äçyô_ÉÎãz)z1y”ÿX§ì°Û×´ó « ð™ÓÈ2nâýé(‡·‹úªyk4¸Bí¼8¯;йÿÕÜ€Ç;„ñ° ¾;ôäyÃ\;¾×þû”ùмÜÂwÃ÷Wô6ðþw ö¯QÅów$žÇðëØzôÀþÃù{8ïŸÐY¡}ßþxcÔõôf:ŸèÁŸ—FŽüþÍ øÍzäŸÏùáÑÙ_W®.'xÇvP¯û¼/Ã8þ¸œßÏ Ã÷šOº3¿ù†÷ ‚ãps5¼Z}\¥\¿xº¯ßÕ•õzïÏ‹eœ*ø:ªÉ3`@SõzµêHöþjx)h^Eèï¤|Ží¤~ý™ŸQKp𣯠®{4Óô°ã]@å;‘ò°(2äùº½Êöí<õþ„Š•òï¹$ÿñäÕm­ü¾ê¾Sÿÿ½8ï(×ÕÄœvy³>|?\ö>áëONOÛ\ß{3\œ,pN˜¬Û—.C{®E¿mJž«§&Ï3ô69ލ°{1ÈQ¯³@ç‡ÖuGV þ-îêñõm²²Žÿ1ý£‰·YÜ/,?ÞϹâÃXüy æÏéÑ_«×ãlçu1Ô/ ý½¶Fû†ýñ©^±é¾Zê3¦¬?mÒ)ýƒ#ßí¬Iõò~‹xÃÕu|¢ãËÜ­‰g‰¿ŠîÉð@š ýxè¹ËÔŸëk¾þ¬ÞîTÃŒO×!ÑoŠ«û¦·ï3‚ûJÚċ˼¨Þ>î÷?vÑJåu_xº7ã#¼ZñÄÓ&ô/ÙüDyÙ¥Éòýßò°:/ÞKö?PÊó¢ïg¢¾b}ýåïÞWt¯_þœ¤Màx\õ¸‘­…–¼¾²Ár¿õu`>#ƒqy¶æý<\|]ß<ÙÔ0°•GmŸ¸èoÃ$Ê{ã_¯4æñšðõ•çoM|ÚqÎíÃú˜u¡D~g|ÌG3X®_(z$˜þÿŒäùÔ^ ˆÎä@7ÁÃk{<šÇ/(gu(]~Þöùü·GbÌÇ5#¿÷u‹ãýëjø|RŽû­ºÞ„âpñú©ó†´O—œoǃ†N®3äçõ$¸•wDÓ«¹õîà¼nþÁð<‰ºÊß-ýe]Du×}^YÂî}aW‡ñÇÍÕĵÒ?Žã»\ëNI™«¿fOó}XŸ¿£~ùŸ½­ñð„Äe‚ÿ§ `~È- Ù>™ÃñpüûC­%OÒÏT×1Èû¶îkü<Ûõ^S×½­òïhÂu)j4u•›&Êø§c G¯a?tãËÆùo¥Õ?Ae8±óušÄÃ×ñÏ0üøØMv}¿ºuu'9îèÊóO‚ów(¯C9êjîFÅ“oÀ¢“£ñRÄÌûšàï_ä ÐÑ1¾ª‰'ŸŽJ^o¼n‰¼–·Mƒã~ßïÕ2L§ÖRø}{‡ó›Péâ‡\êvM„ûsaó!¢®Ÿz}ž×*áùGžW÷vr<ÎR™Ç"E7,7.'lÇï¦Ñ'6ž7󉚷U§—’rÜì'Æñ~˜µ«”ø#“¡"x_Ðñ<øyųvºñ@~›þ­6ê}ßvÿòÇ“Ëp}Ånû®ywÎt†³9¿£ÛúzC‘šÏÁ€cûÊÓ«ënktF6_—w‘¿“>}Ú¯B µÁ|&Úó.eD ¨bqÕcC{ÞÀ×M­ÆšÌ‡¡ç…·2\Uµ[ ‘Ç«S<}8Y­‡Œ*¢ÿñÀ­ÓÉŸ.Óéø%•¿§¸$íq Ö·ÙN“—l¡éãZ5!޹O~÷`¹N}ÝeœIu%05?­8†þno¿ì7¡U²¸Ìßà–¿iÉñŠ5a)} ¤ß:E§ì†[•û¹ ¯æŸ0¯qÞ7ÚO„SN“וµŒ9-Þˆ?_ó)ósøMÝqXR)?Çr|4ï»2õEùŸ‹öÙ·ÒôEmÓøñ›^tásrX;»| N}^ý¾žü>Ë®ú¶(ûPʼ5ùQ,?ˆíëbºÎNõ߃XüqØ=l¯å}KOgõîÓþ_ŠÓ÷~\·ó6jÖ»"žo=¿”õmtXýñ,u'ýã-ýy¡Âíxѧ‹bù¹ÖõQ'e¢^7žAV]O¯À¿ÿ÷:/¸ñö‹~MÎ…É% €žÁ¼e8óÇNÏ+N½9T¼íóO âqÏe‡ÉÏûò¿ÃvžG*ò/:~Lʶ..=¦aá=›ózØ! Bí»:Ñÿ¿èÛe‡ûÅ!ŒXBô ¸ÎÇgïGÈ6Á?ï?ü2ò{Ûàü3^\þWI_Uè¼URï©­a€æóær&Οÿ•G¾Ÿ~,ÿMñ:8¿:®!úÞFõócªGë «.Ž¥~Fût¸PÑÿ‹µ£ãá÷|Ç—©ã_v5‡0ÕÓ´óËÕà)4ú?þÿ I}· k:~fëó‰. ª ýKûŽüð°W&ã þ÷Ù'|ãKì9+!}³xÞkYžÌã®Ñ;AïKuÔ ø «õœyÊõ,ûÞã2œÁ×MÞo'p+ô8Qô': 8¨DŽwó"ê1hꬶ†‰·Ëõ>Ëú1zõ«¾š¨¸ÓtÕ­‰}üÍ„—á…†¡÷.,*^Ó¤Û”´áÁ_I|ó¸{»:߯²ßaŸ›ÿ˜nC n£Kzø©pâ݉¾/¸òy™¿åaKþ8â·aõÛvüã'°ü× ?s7Ck·}]åzšè‡7ÅmF=”,ŽêÑo«ûâ4ºEÚëkê¬Iíkñÿ¾¤]4?Ñ?Ù:ØÝŠÏԎיçW‹ }ž–qhC3ô—y\P¼o¥ðª‘þ€Mnñþ¶q"¸¸6÷ñ"ûÙŽó ]÷7®ge©#<÷Uåq‚Að‚úç:€qéúãn ªË3.ù›úïíy4y !ßq=Ôô‡¯Óšà´IŸñÿ®ã×ä<–‚_‡ôkèøFt¸IÜyv|qQͶ¾ˆÉ[Xœ›¦:í·õ3ãjâW[C¿•ê¿kžWt·ét5“2 ’qnèm÷þaQ¥Sž¥†¾“o‚×GoÑ×k$ ÿ×à·1m¥ìW’>ÎÇHy¦Ñ•ñO£H}ŸÅ>ë½Ëó¡×6e¸ÌRË<Åø7Y¾«Ozúµmû0{T½ÖémÍÛ¤ÖÇÀˆôæaDž eéÁ«áþ¿S÷/Èë&õch_f1ü¸À³¡1¹¼nO÷AŒŸÎp”\ïmã¿qT3†ëõ¨ºo¡‹z=ÁHö>éðθ²Æ­¾êÈÿ›r½ ™ÃƒRK>•¦ééOJ¹nÛàõ#˜^¡«.XT£8Ko/ÏÚð—EÜß3èâ¤ôI\0º¹å‘1Ä/i¬CjxS޳ü>lÇ£†cºÄ£SVÛ­‹ß åס¬~qcÔ´ziö…¾³óy<ž0éÀÙê™ £¾.E§QÃ+jªƒ»ê“Q#Õï©mß6n>?¸o\Wß×ð¡×›$?cÉ›3qʼ4¼r¶&Þ4%ü$ß[íôž FíÔ—¡©ës±té1èòÞÈâúu9Ïy>0Hý\âœÇ‚×î_ãüÛX|s¬÷™n0º>Ð~5mÊ8–ú<ÔÐ=\?¯Žw T«q ÝÕë³-n?cÁ–”nˆÉ°b ÕLéÜWÕä)…iq²qfJNÍ~¶ÙÀç^=+øóÝpR¨x§üƒåM9âÿv¸ùK¨‘G¹Ü÷.ðq8KÍû†ûÞ`ñJ/‚ä8Œfü/ßïë‹Dž·¶•÷ÏSú°}µ½[¼ˆ!nºÃÞfGýGþC[Þ7TÆ”W6à]pIOÖßSDêB?HâE&÷ù¡›¦îÚÞmþ®<>¦†ß8e>Ío”ã÷ì“ÃýŒ¿ñ~©šyn¸è­æcêŽ3ðc»š¯S!øqnù:o<öƺQôÝ?àô½`ñUvuJþ¾7­þÉ ÎïµEóÿ ·÷Ýây¯°ê™Ÿ7‡ä ×ÿ]æçû4ÜuE\…¥Áy Á â:¾õ<õrÑÔÀ[Ëû±Ÿ«ö8M<ÖÿFq¼|–‡ ýÃñuÙš÷­!ŽùP£§ÂupýL5_7í¯sĉꮋuÙ*y² ýØýwÉõ§%÷Iϳ®ŽŠùÿQã ~œ­¡‹c?cD<‹q|>@\}BW·ü"TþM ¾oÁ…ÒsƒrÃs1÷òàüá¤üiÒ+ÈX4Cwµ¿Žf<.z#丗Çm8º@®ToLtÿD×±Á|ê£ØþŽêd÷ÑÕì®fÒñL™G›¨WäãŒØ©¾‡Žn~¨–_ãÒ•¡æ!üR“îžõx!q‡È‰v]L|W®¿îây­â¯ðº"šjúOæ\çô†7uÓ]žd·ï ãÅ5ï«y:ýžÄS‰+ ÖǦyÏnò>‰6¼>õP/ö¹ŽäylÁ'ÙžÇM <]å‡Ëø&eÊü4ºc)ãgóü£—Ž.!yr;&8?=qºNAùgÆÕÈÿüìúå‰ËЄë‚–ù=PÄq9Å~­¡¤võ»ì9kÏñH>Q<ýê^鼓ÝüJL=ÞN÷bñ:Ëÿ·Õkxh’ÔHyBc»Îÿz³jóöÎË6ô›=òã3¢ÜÊÕ¼×Ôþ9®ÝjŸÂª>rŸÙã4º°ŸûS/·x¼Û‘û—ùœeÁyáêŽüþ<î©iÐuG Qþçqã"ißsÍ÷èLôƒÿ÷znu=\úkÖ×2_)oÿ?—à‘¯½”Õ«8°¨×øÿ?æÊütÔ¼µÎO¥ýо¾x3®Ës$ãLÑ{¼Œá¡øþím3Ô«DßvwN½¿îu'²ß˸ŸšGîãC¿yÇ ïyÊ.æÇm$þÕ‚/Hx²ÏÀ4–oÊçqP{ ïåç_ã„oÁóØ'S'Bc¯„N—¯[2yf >ƒ=ïôy³äýïÆãß¾ÎÖŸÚàçΕ²ƒ¯ïµò{.psXÃp¡8fµíTb1ooL|w•Ñô?)~F{œF×ÌŸ× Ä²?ÉûVÖÉ‹ÖPv`ñô6t£ùÛ†nhOü6®³šžxñ¾Hù@ï MßÇ»nû$f‡»>†ÛåÃPÎýä…צ•O6eˆ^ñºÙ¬?NðóbpŸÍ[ñôM`ÊÛÊû¦ãñÿOù;kVÙáêKxüß3™¾êw`I Óm ~:ßÜj–—Óô­ùÇõ Ƶ *"S';ÿM«ÖÉ’w”ðÝùxÿ|àùíë‡×F§„bu^RøA”_Í ý(!ûmt¦‹·0L®+â´gþ@ðš¨ÆÓˆ~˰óÁò•jY¾~ˆñÑA§Ç ðš>§‹Äôê÷D‹1 ¸¾n« (ú:1«c·FîJ¨ß cÕþ3Öe©ï+áuÐñ<¤‹ÿÃòÍ÷û×iGÞÏÞŽýÀ]’­KèxKo*Ê,uÇúþ)¿°ÎÐÓ€³<—¿ÿTo§ç¹¿‚_Ïûœçï¾úná"¨ÙâD^þ%ÁχàGCaD]ú2žÇ}Uî4=0úÀ… DÔqÐÒ‘¿œó‡ {zuRpýs¡âkŒ²Ó¡7Y P—ïVþ=?`§†¡¿*,ê>e‹gÒžOuczÿÒeÈ ÇcV¿ çîP÷}?>,ùºïâµQrœ@óa:dïjïfq˜†gÓ&F‹çãKo¯Ý{^d½ëLîC¿hùü¨fëß¡¦›ïÿ×¹ñ}pr‚‡ùšç£%ÉÃÕÄé†~XS|ìíày€ ^P×ÛJ u¿óÖ5ÈõN§Ïjk¸ü÷r\Ñ‹çyhüLú:]ñÅÈM†—$çøy›š9\'ˆä7×ôc|èuJ’6ÔF«ëyŸž¸wxþ§I8Ü·®?ÁŸk?"ÿ‚ɶxûCöç÷&|ó_ô…r8¯ðÆ6͇ó?EDe³fݾrºï<ï‹G{M~ó¬%i‰#ló›Â01[¾ü¹ü~‰çm);Jërã.³ºXù}u¾óõóèí“ß“½¹_èOŸZðõ£ŸºO!e_8ò›’yR.o3ùcv?„ìòY¤ë–«ùÉ]õ0¾±š­Qðó„»úò5}Ýû°†&në0š \Êe¬>Ö/^ܼ*Æ÷óþ ø½-VþÌÖh^Äú<Ö°¸G„‹“0ãuüÌû ©Ž‚NWÁ–G]I½6$þж7E¯·:š,Öuݼqêþxt\š[æÝn•n¬ì[Á£=”xiä|pB~¦ð3tÿÇñ¬‘…š>ÑîòþAõ(ÐH=oúþ [sGƒ75–ªõW]Mèsz»9OòŽxêÌbßÃò¢Xóp8êI7þ ŠŸÉJo}!¬ ¾ LuÓÉú®š·Ñ’W.&>,¡’Åm&¿mâ© ÿMûÿÞ|û~õÿ;hôlV°W“ã½_®¸I¡?[°Ñ_ös? óx#wЬÇÉy0:qþ‰¬ˆ8ºskƒq ìûÒñIZ_§ŒíWÆüo̸Ýtåõ¼o9nƒ¬(Œ7‡lÒW6 '?΍qÕ¬Ÿ ÅáòcBŸ4,ÿ¥ÏÏSið£*IÿxûpõQ?ñ9O™ß˜¡rÏŸò77kúšPaoWLûY¾]žÌ¿.ÉŸ~Œ²Ë«à¤õáæYi—GK9OèÌÛšLÕýš¾ƒõOM’ülŽó@ÿEzõ¼uFã ŸšúêŒãï´Ô‘OS¿õ'Pk×ÿ¨ïOþÏ7b™fÚ ÅÉêy¡ ǃlq‹üóWý^ÖGÝhÙWVAðf·àª£!úÐü|@«˜ð ‡|-ûEs¶È¸Ðîvëîûg<ý çMvòCÐÍίõñü¾†_È·£PìÇ¢ÏÆgz®Œ×0ä¯Å{LõÙPNp•Dï4壿I;¯Ë¶EôY)__ôƒO›&Ï»YpÝKnSójp'ޏ/“QþÛþR[Ã¥qÊ›Š~°¿”Ä'&þ-¡ÓáÌӵ̿ILzä{÷]·~šøµüãBöiÇ{†ðƒŒ |'ã9~£Ôî¾ýnÝÿÑØðÿµUßé~cjè.ïW¨|>žºç_D‘%n-_ýÞ஽rüÔ™ï­Y1…ß³G<|åøÞYn%.C×›‡qoq´:mU2|VQ +ÎT㞨¯køD0r?ªAŸÙ¤¿—yßœ !_âãÙhýn•ú½«'ù‰æ>^»€ôpÿhT°^‘¯ç˜CüÂ'[µ­‹2¾~?޼ë9õõoŒõUðºœI/ÊÇØòÕ´Ðô}Öîü…ßcx™Ÿ-¯C ¡–áPÊëPK^ÖÇ õGŒàø›¯bëü‹ÙUÆ+ŠBŽŸZxŸüœœùoöü|ªö_ýþ›¾r½•Áydž3Ngý¤ºÿgìÀ0ä×/¾ÃÛž|«g•÷+)³Õ%Öž?Ê-Ï…|ß|o^Kgl¾ÜzººNýìu„Á8aËGp~)ÑWwNM×ç€u/GÒ¯pžÇæ`ÜN Ž'ÐÝîûÛ'U'JÄEþï=äxÔÄ,úÕSü¬ K^eÍ:Bûþtay:qØN†l7U«^gÐGÍû‹¦†¼£&Ñéæ„Æ•«Ñ!ëªé[iAúˆ’î²å¡BNÄ}¼ŠðKXâ5ëÛ\ñÒÚqæ²F?¬žËê'š¸«~­x‹üœÓu–úÅhc·èô@¼ÝÄáy0Ô,QçºüƒBÁ³è¦ƒŽ‹pã»ÊÒà_û ^žKtKô|]ÂÙUŸÒ÷ޱ²N‹·KSÿ"ñnËòbî^£Ç¨ï>»õ(.C‡˜ù&ÊH}¥=çÕÚËãÙš¸q ãkÛ§€*¿~yýàGÑ(xß°Å/»âxSúÚË,¯ó™¥þ—ë{¸Qý½ ^F,«Ž5N1éQCW7ÿy¾‰¡v8qÑú¤¶¤é¸²¸tVQh‰?"xÌ¿ˆ Æ3þ(ñý²Xæ,°äkÚi˜ÿ€»e½Ñ®¥2~ØÀ/›¢{_Q.Ç¿ÿ¡a_\ó{ÖO´øƒàzŒ©F§óZfX¿>ÂØ–c÷¶Dé?‹ïOW@ ©»ßÁéþxßr>¡ Ƈãí$øØ!lßE÷Rõç°ä×J¹.ß¿éùè¡©ãñ>§\îw”pš?—ÞÿïÄãñ"Žˆ‹Á™-Õyó*g‡3™Ã•Rש2|Ï"Îó¾B7E7Ÿ”ó›ñûÍ÷;‘8Ø §‰ófÈqIÇ“hú&qÏ%¬_¸¹ü¾¡wð:’2ŽÐþ±ÀC{·ÙÕÁD]U£Gè_§œèðûŒ"ŽCÔÜLŸÌîg×8ûÃÆç•8~Ê_Îý<пƼË>Ù è}iðOÛÓ ø!QJ⓼h¼ŸÞ –yãÜpøRÚ¦ÿ‚Gd¾÷'Õç§ã›ôçScè'¢~¾Q¢Áq}ÿ+p’hÎÞ>ZZ×EžÎ{Ÿ¬ÛšþÙÈó±ì'E»hy+Œ¾?¼‘-orÉ>lè/ÑŽÓX“÷¨™¸^ãòIr?ÀÁ\/±Œe,c ÒpìR†Ÿšñ”ÓºŠ!¯0?ú¨hq¯õõÆ]N'ã—áðAÈ"¸Ž#@ï×tÔ­ÀÝPû#<ߌMþ#ÖA6‰4x̽Ãþ¦o©;n#ºnWߘ–ïý»bXØÇ)n¡8Lc¾]SC¥%×7¼e\úÂùmÿhªËø×iÄ.zñ¦ò<"ÎÎÿNöÓ¡‰!ßÿF'ÂP›lÿ‚·à¯³ÚGh}<¥þ½¬KpÜÐWÆáÑú)²Øûª« Ë·étÉpei¨º‹É~Y7”•]oÿú–|íÞvG]”œd?ª ý‰½ÈÐ×xf2<×ÑxùRÆk!ø²-ñq{yž³¡^œ3ݱ/µÓCõ-ã–פÏå}Sßø)wؽ?{Ôû†·ÔY.n\_ëDðYyÉòã Ø'd蟰¾n‡hyCo[¼ºPÔP~`è\¸š·Qç½=ÿ¸Máú¼÷Ó»¿QC¯3kú&ëgpùÝdùmu´Ñ‰û9¼N†rR/3èjt³ì+ãõI4‰·ÕX¯mᨇØÍPϨdúãÏÇ¡_ó„lR÷-^Ç£òΦ\лv:Ì¢Î^Ïõu:3TgµuzŸ0ˆñ™ 1yÞ{ø©G®Wî´¾ãífq½èÃA׈ýμoÒAÆèàùûóãþŒ®/#.³åï_ð`XOâ[ý]ú¿—'ÌoWIâuKý¤LàÎДûŽ}TÞ|¼ú¹ò¶†ó{u}.ÈÕôùuã8ª>!ë»…ügMLõý½Áþ¤à»«O¥÷}»¼†÷µ›‡,×QœÕ¸Bõ÷¿‰÷ÙT~¬þ>ç77ø3ÃBõ¡|¬Œ×ð%ØòRø|äyñô'‰¾:ãuIž ]ÕßÊ 8÷šø`ÌϬ®tø4–×WZïñëÃuG4:JB‡Ë?¾½£nsž¦¡Á‹`ìÏåýe+ÇÝp|*:‘ùô¶{½ýD_^£G‹NvýÄ8µHŽW·DÓÏÁß%Ò†ÒxÖ3´Mv¿n(7ß¶Ž7å>yé±oh0ó/QHžsM¿hܺ€)óYv+ËXê>£"Þ>ï[»÷8,¿¸·-Þq<&×™Òñéâìéòz?HXxe><~~ˆ·?Þþo#ñwÚÇ3.:ðxlPc5N¿'é_û6Ü:ˆCƒùŽÓ–oÂ?¯üivß+Y4†p~Á¤¾Y¡þ|:³ QÆûHÝ=4ºsÔqlC±°yç”qö…ä#å}C¨tû¾¨aæ`¹ïÇ óæ¤Oh8W‡ÊýBè«ñCòŸ™ yñÔ{\ÍÛfÀ±·ˆ—‡ÁûÌ’/]ÃWë}•ÞüFÜûµÎ„ÿ@ý÷¨fâ]ˆí:m5q^cÒ¯”ï~IñŽ ÝÐ[Ís·Ù¾gÂÂòy¥\wgH¼ÜÖp<ÈJÏû™näϭÖ„¼ßdÿ÷vļî´ÕäK[’ý× +y3Öÿ¿XÓo¥É£Ûò½<§-Ï1jXž%ÄÿÇѱ쿶}Kþu z_¹¼®cÀE¡Kzø†Ð)Ùç(åzW>Çx;ò¸vw¸ø¸;ÖýÐÕ("½¢ôCEEðv"‡ç)‹Üò9Þf7ÄÛi‰»ãú5h›LŸ"5L üµ³Õý$XðwµîèxY_!…ïHÓO\߸h4ß?™ïfÞ_²ƒ×÷ ë¤.o…> {?Gïxù*…ŽSŠž«¦Nf[‡†Ë侚Î̓©ûñçÛá[RÎkÂ?×N·<ˆŽg Í’åô¾®kàôêdqØ×EÂkA9lýtj"<¸ }Ý í½ìˆ£p¬ÿ[ϧ9y_ |7)ç2˜'lÇk•jt£çM­×>2¯ñ™ß7^GÈc_’óâ$Dõ$Âêf†5W~¹tZYâP 4jÙzŒÅsüÌh-Ϻ`e8<Ä”ÌO, yú¦†ò×чÇ.î-àõ4Á§T á‘zö—uý]É÷oÉï‰*7é¸ Ë8L´5øýy]äé[‚y‰†ýC~Ÿ®þy0îË ïé3\—òÿß#Z½&e^œWç]\‡˜Õ#ÜúÓYŽC|Þ+¯æùFa<ø+þHgÁyä6ðßg¯LT'}øûx×5nèLWËÕx$ïM’WÔðõ鯮^!p®çÙÎ8JÆÕkêša sœ±h²Õþ†6áòy¦8ÐUJô¥á §ý^œ´Ø©>­ã¡ÅÈ«q(º¸\ä]½]šx^ä­ø>¨Íûèp„Y\&Á‹¢”í;˜Ìu6Ÿ ~~ÑÍn¿ü ~_ÇK|ý8ÙÐßÏyãÄú€ãïT¯Ç<þ@à})å<¾hUk9ÒÊÎÏB^Ìzëµüû8/ø¹¢æóJlQûII›©/Ƈ ~Tï·ÉÖm±àQv=˜ë¢aæíŒÏÒ±>âSÄó¡Ý ýveì'ų¡5á‰;‘Åwô>S>q#s÷eNñ¯÷÷à ³;~‡]ž]×7aß²?Ê¿Ž£>«¡©ËM?Aæç( ~~Ð'X'ÜÛGúäBöŸáò&v}e‡¸õÿ{{ƒý8Ä ‚y§bûµIß§.÷QýÛï ú%(×üýÖ•jÞ®—μϿ›ýêËXÆÒg(MV—¸¡˜èkªïyd,cËXÆ2–±Œe,cËXÆ2–±Œe,cËXÆ2–±Œe,cËXÆ2–±Œe,cÿ— }ãé k¶< q†ÛádqΙV}Y)zz‡"ãÁOÏ•ðó8xS0Oùé1ÞOÉuxÿºm¤­ }Oï+ ®¾¨~úêË_«øÜ®¼¦ÔМè®4gød¡gŠ" /¢‰G]èW¼É~æ%£…›V«y ¿ÿ2ë÷Ùa×G„yÁšYêP]¹é(çåÜ¿‘GÔÛ­î#F±ú¾yohtUyîýóò8ÿ×OîüÿÖ=¬.Œ¥_µrÿ:ðë4•û;týQùéÚ·…ð\æð¿ó~'tå:E;’áéð¯Û™ô }£^/pO3Æ7稓ŠY¿‘õ÷}o åÿð¶Èß'~ÐÎŽW`}ÛR%QA°®f¨uB0ã]»>¦âà~$“þ *íú …Œ­ 6·³RMð1‡æ±;¬·ߨ·oS¯o\ß ¦NJbú>ˆž€nýÖñê «¥ÞÙ>¢ó2šø§îwò>©+ð±Ÿ$>Ö­P¯+'T•²þâkþèö|R~;]ÿõª_°ñÏþ5ó«~¼ç¢ºýjñÙ¬º?ï‹kÆý¯%]å}â™Öÿïu/.~¿¨¼[h¦áÇ0ô§¿•üþMpŸ&úů 鯭•ùìlu;ÂÕ‘ƒéø ê¿ =FoÜgŒê†Ís% MÓÃÏŠ"5¯¤àuˆ›'ÄÛާÉûœë`¼¡ùÄ8Òx}?ç[nýÔÈuó»Ñƒèv‘ïãžôu÷]ø•ÞÎàë žo ÿùZ<ë€ßGßñ¼#/Ü8#ë©âÊÍ‘ø1„ñ ÓüBÊq2¯åóÑ}Ž…~†#¯8ïÇ—¾„'™”ï£ù'ïÕxùËmÍûÐwáÿ·õw´ãpÞ(œú¬Ì;pÚ ¦£;z%û}ÂbÙ«QûÑÔ0sOàçÀ€GÕ:7ŽüN‚ÿBÜ—¸õEpÆÅVyÌ>WŽcyŸ*θÚj>sÌË8tÌÇZä¶ž`|ýò  ¾4º€”—-x>ƒÇ%4Áúòsxû_:‰K(ÿ¸ÿw ?£à÷·Ô?Ã@—׆ßwþÜtª<ŽÇâ\dkôŒ;Zò¢<н·k~Åâƒi/Èù£×HÏnîK~M/á¨çBÕWlõ¼w5¼ýò<¼ qi S;XíW-˜œ¨Þ›Î¯2ž÷Žús¢‰ÝùèöfƒàõAëôò²ÛÊâ‰k¢øžqúÁ¡ü+š‡ÖüÚŸøãB¿Þo~Q¤ïâ‹E¾ëÿg•2¾|³yœÁy¦°õÓ¸ µÁùSið#—×*ñÞ/¿¦«¾#ºË|™Æúz¡]þ¯ó8óøyl}´Í+êðW˜2*Úó_Êq_×3Gq~XMÞ W)ý´qÌG=8_ºÿÈ ô%yÚ¯Ôu ´Œ'‹|õ}ñ¶'[O k󑬿— ¿„LãÞ‰e_¤85Œ$qc/ë’ßÉzÄ_Á Í:TÊ÷½=vër†ŒŽšÏsá¿bÕs¡uà”ÿ¿m—gú¿jI×W3–±Œe,cõkÞöpzBõmIãÄ3–±ï²¡*žø'cn†J·ûŽãïg8Œ¨‹gÐ.ZT{ɹrWÕ½V8P×¾.íõs5uú^LçĤçS_†r¼ï½Çñ[;ñž¼ŒÉ(Þ§¾ ƒšªëJŽ8Ù¸M×ÿaêE§dðfèÞ6‘ú?κ€á®.~–Õg—|ŸáṎPT\šsüÃ.Ž9s‡:3€Õ»EŸ!nüÂMGÉÇÖÎoéP7÷'^Ç8ã¹þ±ŸM5ýDÙìþ"Ÿãþ¾%:¼ŽzÊþyoß¿àxì7‰NZ…g€–\ON“ïòöðãz‘¼ã䳘îeÑ)ß§þ~¼ƒ×gž¾¥Õ~¨ÓúZ Wã}åÖ¿Lõ1.Þuýô>ÖṞ_GòÜdG«+ #Ôøgçñ:ZêU/ý*V|Úû1Þ[Á÷ ç=¦îÛ ½N“dü¿ú6³uÝ,ñŸäû°ÕôÞçëó6;¼ž?¿[²õ}¢Þ1.Óõ·RC‰z½ uw]¿¦·ÙÍŸÇ÷»éò¾$ô#ú»Mø÷_?À›y/³ë`–ŒßÆ ÌO±¬s ‹ö}ŽêÇ'x%ï=Kœ¤&ÿ‡Ãú¨ëõ£ï¯ûž¼ír=5r?–Îïö?·Rþ>Ú¿ÂIùûÌÓ­âBôžãVßÿaQãÿ}ÿÇžO¿÷ÿþär½· ÷;‰Þ)æ_¼¿˜ú 9nOàóiÜ";§.Ž¥î‰–}%ýhÚ÷¬=¿¡~þÃùñø æÉù§Ç] Þ‚¯Ç8{šºæ¬f¡ð¸ùJ9®yW'ôõiŸí”*Ökð7¼ÑÖWtí8ûÉüëEé6ºÎþKÿwŠwïá¶èø“t<0þÿÿÆ÷Å,M>¬Èm€£”ùEL›ÈâÌ-<ÿ;Aƒ/®~Z™·õ统órXö!øçYò—¢€Äkó®g|/7ïÿȶì×>mh¬ùW4vû~¼ìâºßáœÍʸÌă£û¿)?¶Î·éøE¼M꼎ʋÆÇ)xÊØíKÿÁï Á³ï"ñ±cÞ5,ÄH¹ÏçÿT½ßvÇWê}¦¾ß"¿‰‹¯‰´¯x_G«Ï£;ÛL}Q «ãcQ§¥û VMf~óaO„âgùQWòþ//jJ~šô“kÏ3åÍÆ|ÃꯗŠ¥oOžQ¥ÇÛ7M𜢱†¿„ÔóÅã jÁ{£áá˜5*ï¤_[å'tû³qü,ž×® ïà‰"å>+ö ”÷“z7Ô¯4õ´âÏ¿©¯·­¦oãR™‡#ß0N‡¶þáQ¨ ¿×>#òCU߇ߟÎã@Áïà_qƯ‰çM<¨Ôàšn) Ü×¼OøûÓÞ­CÛÇýu<ý˜tx¨÷O;^ëxúÚRxÈgü¢n_~¡XÏLë«­áÉŽ,®ÔðuŠç*åï‚÷í–áÁùUÿ¯ó|+ëÞºÀõmHý®×Jåq ·Õüý*—à|v6 <žÎ0~[/ç³¶ì æ<&hÃy9 ¼Â‘çùÌuü†è@xC^±Ë³`Pp75³Šš¯´5Lc‰ ÌΓ?_D]{=®üÖ.Íþ‘'Ù¿þ[e|ÙÚ"·~÷VõÓ¯)òHþï{“åUÇÈ5²_|÷ÚÀü Ÿóõúú[׆¡OCõGÐ>ž¼ ªƒy„*‚¯‡¬†…7ü¿bX°1Q¾ ¸L«¿²‰û£Š9¿ò@8¤Fwùá"帘Ïöõ3ײ>‘åwÈyN.’­áÜìà<Üú¯ûÕá@ÏBó}àÆ•ÿ柳×8å¼û^W×ÉÓÔ·ˆQêï!å¸~Áý2¢ŽíŸ¯É÷°Û_p¬'‚~jüwT%“Ѻ®éÌüŒ&–u‰Ž4O¯ÿ…–ò:Ž5ײx~ ïg0àpé5ÁqÐÑüo/á1Åu=~ÕŒXöÁ‡§Ã3{/ñ|ÈQÁyz]ÞÚÖ°jJ0_Q?NËÕè÷¢=.¡þ&Ûü«.¯ƒòàçÅvïÅÝ Ezî¿}žÃ] ÔïÅ`&°…Þ¤®ÇùåðÈj÷l™ç7Õ=Q­Ž/1€×¹ÆmRïÓY–ü¢…–ßÏgr^Wô¦ŒÇùmõ=ÐWλbý‘òsЃå1”éêpd(Ö<Ÿ–ŸÏ?~”ÌKFןžTÍ}ÐŽ?ôëPï1]§Ð7˜Mx}cÇ·}O—d÷¼pü:*Ùý¸ô Γ§ŒCxA1ö&¶oäò~,M~ˆÖénÂöº‚Wß?ß‘§HôïE­gjõÆBö/:_Ÿè»àêÏXýâsƒYÄýJàßÅ}Çɧ¨ëV×}]¯y_Q?ÑþßgÓá L†Gtǘtu48_íñ!ûÆqSžšWñè_±ºFW¾ž4ÖÔ½Z}úØR+²®¿.k[oÜÚ7˜w¿¯÷¿Íë@º~Ò7Ã}ïB?ËÿÇù~?Èa?g:xãYœèíâýN]Hž«„àÿŠÙz­«'ùÇå©ý]=Ð?¯'ÉCº§^ð†T?Åx¼¡_×ßÃú]¯n“Ö~Iog4ÿXË“šÿç¸h<µÈ7?¬ÃÓ#7ÞjÁ;ïÊ€é5vÇM¾_§Œ™aåçal8?”š·ß‘¤BÖwñþÉó–øöú6¡¯‡U¿ûÛ/ ŽãÎáýë‹fëus»:Õuþ®™É†–í;ߟ¨ö“;«Ÿgäht=ûãŠÑ•Ũ­_>ë¤Lø€Ì“¨Ãg`ÊÓiís¢_2ÜÌâÃbíÓ¦õOjtÒñÙ%m&¿ µñÔ’6_‘ÿÿã~ÜOÛ8&~Љ,¾ÆYyñøK µ¡‚ÕcMõÿøÙýeÿÕ2¯çŸ_î†óŠGY6ƒ5΢¿.Ç9¡F®¯Q]_\¶^Ý«ÁY>rëùñuÛׄ!këV¶&öÙ¨þ‚ɨî%¦É÷]Ç_…Ê`<¢àá¢|õÈç¼¹Gÿžåilõ‘/éoýoé»ç8B Ž'F%ϯÝÔ-OË®†cÖe ‚GÈÖpGKæ?õLÿUEôÍ`.ë£Âƒ%2>b<¾ÀѦŒCúß1žçH]Ãû¯ë~U¡0ÞïÐX³~õWç—¼PÅœßTÃç‚Nšþ—ÍɾçÞV‚SßBøòbâéH¹.‰ãLõÌÈ׳ä†óát¼÷A0-lŸN±ã7A'Òw¡©ÿÓz´à÷µåƒ²žw5ßO ~òfY×6ÎOà`C׃kWŸÒðϳìKÔž?ôu<ÜÙ±¯Uà‘5~#ÅûâæsY¥3¯§ à}Møñ†uCà,½oÂá*±ö#u>e ¼>S? µeÁ|fmHV£nœ_#î¯öb}KhÊýÇâºKŸÛ­¨R×—\ó¥þxÇÝL?!áY׿›¥‡¯ËOm:6º¾XS~ÜÖÐWæKq´k?RØ>\ò5Þº·Œ ñLqÑœDpU&C¥\—Au<ëãº÷êgÄï6áWã6ô¹&Ž?4ûµ4Îö6ÅÃ[v\_¬ Ç…u×àW‡ó+ÐαOð²9r>£ÖPß"üGÈ㟣„Çk<ŽÀˆ½òq§ÜËýK™AolêqêúùÂÔ}—†zZÒ{½NôW5çϸöé`å;½›Žn8ˆ”yÑ<\KÒg[£ÆI¢4\XםжÉèœ%'µžÇ>î|·k߉÷%)C±¦.Çõ>7ÝóŠË¼M†:Q9óL8Ì”qÿæ†óAwÙÏ:\Æó9ö3 rd?…òâˆü òƒý‡ãˆ‚yŠHIõgý¿“þKªŽóp&ót}2Þ^y=HÁ—½dè{x‚+Àp¶O§ÄÑÇü§Aó¶yÛâí+óù68žW£Ö»0žWe§kÂÁ~×ÍÏ»oÐü?&^!,Æ~«÷5ô`õ`Ì{Q®Û¶àë˄ǃñ†O÷ÏeS˜ß<J½è¤f,c‚al0ŸÆ2–±Œe,c˘ÎЛô Ü5ÈÇðôáÑfu\ æ}»×}ÃâK}gÜ÷%Ë—kê§T§Åÿ;¯{_júè_vì?±Ä‰ø'å|Mÿ]\ýüÿ×­Ÿ9¬›”ÿ)":½Žx[C¾&.¯¾ÃâéC8u*닪ùà1•ça)þpCÔ+jæÑŠäc9ß=nÙi÷þ§ïÑxšÁVu[ÝûÈóA8} ï[^ÍsÃ㺃íp¿§&óhï±Ü_‰>*‰^–¥~q}Zs\ƒ¡o)å¼ÉåýsF×Àïý8~“à5½ÄÐð^Š|²i^&žUíy_?WÞ«¼îHëGDçÄ„ÛMWÓ—ßz4Wx<ç‹XôÇÄß´ò/vu½rþ< c:ß¶ºTÞ»¯9âlò^¬êÏö÷'F·•ö§Qü¼§{3Þ—ûs™.ZSƒ?Ö‹ãÊ8¿–·‡ó¬Ì•·ô·ó+M¼)×ç}z¾.úx;•”ë~‘Œßëj¨ÙǾ9¿AÒýþuvkp¹nõH´!¿QëHŠ:/²ùÏv¤,øÎaµ^¡‰%^7Ç’ÏO£ßäsê~ÆS²!Ξ[ ¥ï€ðê¾GÑŸ`â‡÷¯SX?úfº¾ Wâ×÷ÿ¦î¹8w«ŒãõËST;^/f~[Ìù «·ëúÁ4¸pTÚÕÍýãód\ƒØuÇ ÜÚÚá_(^Ï7£wµŒ—G Á§”:ö ÕŸó±ÅÃÖÐÞn]A¶aßþåÅ2±àÅxä?vû´¦ß-å¸-D·ëº.±âòÿGJ?ȸ?©ûü²Cò=åüeWy=Ežëˆn&î·÷-óD~Ó¤3„ù ćy?`Ï æ²˜¯öÿBŸ “ŽŸÝÍÂÁmeÂD/aÇ›4¡88MÙ²?'ª ^´O†¾¡Ê9L?ÞÇGúQ¾2ð|ªsh¼^že~uˆÌÿIó1Àæ…lÞ—¼Úòã㡲XqL8ê—v¼h½ÿk&ô¼Üåý ™ ŽÓ9Oe¾]>Íï‹UØå ,ë$aͶ?ƒ9?óÀÛd¿íª^,ÿ3 |=Áñ#æ÷CÅ¥–”a˜†g‡›KëŠh®Þopckõõ¾ýÀü½˜6ÛöÒòø+JB­;´7¾ÂxÖŸ¥†Âpq åƒNù¶úsxÛ4¼×‚¿?!>“ÙÆÂpþÇv¼­íòþqÕ&â= áÏ}{³Û4¤Ž×/5ùõ’‡t5oO²õtO¯,VN´Š;¼O ãĬcÖ¼Ýù¥Xý=´ã}1†>*ÿø£—ÇRoEnD}I·#xL°îBÆ—ÝÍ1®8ýlæ·4s‹qÙí,ßrÌû2N`ùHu¿íƒ?½YÊ£ÄÄo…é“bÍgéòNZÞ¸Ÿþ2Ú÷hàuÖ­ëÎ×1ä=m ƒW(÷iÌ$ç™kx]â¶«Y}Í?ƹž^¥Vñ¤÷!þ u>[:Ѷ<_®8äÿóZ㽸^z[ÆQÍHüß$ͺäšüzªý¨¤ã9ñçE¯Ò:|Ü&êôÈ'ßËmk‚u:uïÍy|û{µ×©ZÉ~Þ|t´z]GŽ×\~)Ë9êOëÌÛNêx{ u‚—º„ã5z›¿gåò~ê}Ï}Ö¦ïcÏDZÕv8ª§Kð-Þ–zVù–yŽBËu§]zù¿QNø#ç¯g8ŽÊ`Þ]×äkÇs\?tú)ÇYâ–¢šÿ#tš<}Oõ{áí øÜ<îÇßw¿Üß/XWM u¢‡2Ø’7ežïÈñ¬ð+\ÇÑί¿Åø¢–fž÷wÕA†FÁû3ÖÜk½ M¸ŽÕ^u¾J§{”Ñz°­á–óX½å©så:ï’á‘üVÊ ¡=.dCÅ4Æj™ÿÓÛšž|Ú¸=·br­·ù:–ý<鲸/í¨*ça5õ«8òòٺƒ—ó[©ëƒ?uíþ ócËìžÏÀ¡åÁǵá÷•ø“xø‡u0Ý_…YëôTŸ!/šNU'tû'‹'Àð¦nùø^?üüû¹Qn¶åƒÂ#§”ÆZï~ðë`>F2/ºž§ð5Þø:‹ û½)_‰v_SÉñ] ׳Ï1xÜû’·›øµ%ê|Â Ž‹)$|P›a?åóp ó™ÌÛ"pÃd´„=ƒŸ%¸ƒ>÷"uþ/¶ùrýl”šxËÝöA¡·­ã­u54‹G—@ÌGà9Ñ•éuéü]çñ9>ÛÛEðb†ûûqD½AQ_o¼£L£ÏöIð>Bþ}R^Âv–ók¤ÁËíÖøEYÁß7ŽÌ–üݼÖ&Óõ5¥Çý;ñû´¯Ï/Ý¡vÑðShÂó|K›È|¹ÿà<ê¼ó>Qó“ïY«¿Èuê0ûªpü¤Ÿ }VÿO‚Çía§Ó©3Üxu¤÷ýÇÚÕsòÃSæsïoä¾½%¿Rû>]ü¸öñ8ëӥkÔÏ2í'hKúP4õ TDÔáy'8_…VÉèè ›÷Í}Kø²û“6äG{/ÂæË¾k&ôqð?×sÉJ濌 îÇpµßžr܉¿—ù)º±:0.ÈêÉ?>¦.¡oÛgŽ »ü à{Gk _ðØB¦;Îu1í¯ÁþÀÕW§o¯a)˃ K}¿ÐÄ-¿…Æ?vþrö¦ôæc©‰xNèÄëŽÃÜbö}_ü„¼ž‹þбódá}ÄžZí7êÖgðFŽ”¿?óþº¸õÙçÔ¼ãUªûPÛñç¸=ÿMÃñC` ïƒnËpžðwâñ?Pf§éú†)_SÊøs{ÈÇ[æõÑÍPo>úhµžÃÖמO©¶Ã·¸šàÒéJ‰ø:e~÷ÿS‡àq ÐEB7‹¢«Ÿò~v]ŸmÊõ Òs3Ô=0TæãF)ïcZÕÕëÊç4ˆüX^+ÌÌœ¿ˆSqI·þõÅU‰ôÝ$­¿aâIO9žãÖÃòàÞ1©k¸<#jÔ¼&£¸‘ÿÁ¢k‚ó{`z¹qñÍ C¸z<ò }Pû3"þÅe Ù:XOxtŒ‘óH¹¾éô ½¿‘ºÐÙ냯W(×A¬çÙ†ðOu λépœT7S{¾%žÕû¹ekÊRÙÓì{˜™Ç~GçŽÆ»¿ÒuH»ëšp³Çå3œÚèp¼1&ÃSO^Øw‘ï3·°<ñòåìçÌÛY¾Ò×41ä•& BÜ_ÃB‘AÿÊÒOô¾±ô_ ø/œõJ$>5Ì_ÈsaúÞ1j¼œoíHx'›‡{n´: [4}€M¢ù•¨fë‰Nß%ô¸†ÿ_qP½ÆÑqîÚ#ãê4¼¶Úó[ ¼6ïwáS‹özÃÕ}=xrU½ê¢¡Ï/½§ÞŸð½W9ÞëÛí ÷ù…yûy}xàÓnq‹!ÿÕ¼Mvë7²dæÑ½WuɸµO#Ýý¹:Co–`AG»uŒÖKñØ—ìü#ÇÈõÊ¥ßsËë.oËâÜÿ¨÷Qï·áâAª£êÿ}gzô“MÌU>XpB0>bcðºŒQnz‡·Ž/²ŸË'»ñÔ6!¿W©óW¸[Ý:Ž5‡Èyî üÿ7üšå'1¼$jo®wŒ›ÍÎ'¸yRÿ ·P÷.þDöyß´+îZà¬'}jè¶ÒöTÉP«Ö릸8ÑÏÕ Xž‚ÆûO=[÷á¡{´ã…2åeíˆs¶ìòÇÈòhKð7ngþ†Ï#‘óQÜÏŽÎÉè¬"_“/˜ôz<:æÝÕ¸CÿÿçÝÜ÷rÖeòû¹àŠÉº1ÍCžŒÑÛÐoÃõíu:Ú¢ÿyñ®ã:^ a8Eä<Å'O¢ hâo¼Ã¶ó~™é8QwE3ž=·Iðó@øURpHÇnæOn"yaM¿”÷k»¾ª¿Šáêç 7|$¯ÙÞOÁg{ä‰r~màxå¸ôþ¤\·:ø=HûõÞÞ`¿H>cèmNyf¾1åzíxÿ˜†_Çzœ¦ìsaéUò~×Y£'ó á¿,×ä݉OóÁ:œŽ=ˆÅ‘9áêÆ("¼¨9¤tÆEìý+æñ+×%¦u&ôä8““îvú^¼áúÅ~/ô~MëõŸOëu“2_g¹Üo%u4ä|HAÈ8C‡ýÑ×ËÂé’xûòÑ”ã¼Ús?È’' eòçøWO9þì^lü]üý1𫥜¯ÑE kbÿ|‚w•Ÿƒç©«Û9_GãWh¯»Ä]y^³#ïsoÏuÁ7jÎ7ôå‹~Eo‡¥¿¨ácëf ß©ÃP|ƒ®_ƒñš)ÇÝ¥ö4ý×ÉxæE}5¼>­Áãà–ùáúª]OçñûŒsN‘ñŒƒ‰üVðó„Z‹byp¡s‚Vr=7ÿ^:OWÁq‡²ñŠù{ÈýÄ”¸÷Šþ<\ñœlâ~Þ˜78îŒ<çˆ^ŽŸ(Ö/ã}hDpñ‹w=ö¯Ó38žvÕŸBsžÇä.êþ mñ|.œÿššOììný“¼Oy|ÚÉû½,ýCï#ò\t"¼ÜOðy±vkÖ“G6ø«< Å5àêAìü¶†~ŠÃÿ;ñ¼Z¿–Dt:Iþ¼øçCkîÿìåëD¯Ó‰ºW M6ß7ћü.þùŸç¹tu'ÿÿTWJÓ·€™—‡ê}sÞf ÷›ÑƒÇ«‡¼Â¾ÖÝ G~†”yÃôPÃã=¾¥×lÉûIŸá‰xÅ„3ó¶“8§˜?W­ÂÅh¤ùûÇIþ\]ŸEc»u Iž·–Ä¡¼¯ë›üï<ΰË'•Eô3 -qcííülï£<É]góueõokȼG+>?QGÅê4Âϧ-?LXC;î'kô«ÒmÆý!O]w@_™×]Õ<)çõ®Ë£%É ´ ׇ'øPÀü0ñ3à½k“•uü¯S_º®Bßìàiêø —ä[K O Á£$’¸ø¥tÏ]Êq–úlé6Lç÷Úòõ¯? ¸ïgãÚ{¨ëàauÍpÉÁ8ÑýÑ>·Ÿº¥µÕñ‚ßÂõ:´ÇûØ€7Îâ~¾'ë·›øeáæéŸ_!ë``´_‘”1YÂð×Ç(vCD¿Tœs ¼nH1‰¸Óÿµê¼ÐªÕ‹Ž1æÞ£Îc¯›ŸÖù €àcBöueÌÎtû·Žï=ÒÌÇIêag޾v¼Æëû€Jî?úÚ\ûÞpˆ[<åüÉ+Ýøsù˜Ek¸Ù¹Õ¡<žW{^eLþ°%~ýë'ŽˆÛlqgè(/‚?<ÙÙE7Ñ€lËú¦†GB{|;C®ÏÅgU[òtr^ÊñY¥éáMJ™Çñêõ=…¯j¶ŒGÆÈ•ì8Þ_–œoKð瑾víõ/(°«Kæ7̸”Úú_6ïº|½-ï.å;÷çÕ\~¾“Ò¹û›mƒÐ±ÕÑúYÒm´O×ÕëˆÓ;}q¼:¨÷{oCâц³¹nÔãÂÎ2N°‡¡NËý6¬kô¨²ßdozx„pÅó¡Ö5 X\oìÏ£ Çÿ d¸ 4²\oÒ¤ïL ]Ò£#¶>B ·ìcuò[íBuø5Ï$£{¢cw¦WωÕ§uθL·¯Ö—Ùö?†5tc<–8„ë_ˆzÇáà¡ÁVï=ÕÇÅcÙ{ИðWtåø%úwÎË„¦„÷ëÚc"KüyÛ º1ë~øq ŸËôƒyo\Mè0ëúC;ÂзÅuÉL})çåÇóþ£ŒÏ ø’7¡é¿Méÿ#õgd…ãAr5ªSCqN‰_¿O0-&-ù¾Ï ¯>IŽº#ðEºqé÷‚Y콦ºÙq™mžùáêq=ßIzÆÃ‡“ïŒÔO‡œpy'Qòù]/ʉeýÀ¯Õ}^¡q¼î¬O‡ê à+…£ZÝ߀ß&ûÞC6:õ“YöqÄe˜Ýžý¼îYuÇ¢qêuûKô…êþš§Žú ×ã‘+ÃÕcE_3r4<©Ù¼áãhþeT^~ÜÒ‹ù=ÕÁø.Wü³¨÷‡—qüޤïjvp|žrþ”›¬æ‡©WãÞÚ%ëÇ{_‡ÄWYò×…5,êk½]{µƒêi8sk¸¾ÄMÜÿ{z0^W³^˜xè“6œÓ]Ý·çØßy'4 ÷n0üŸø×hg¨ßjú­çÃy„pí]2¾c9óS0k[÷kXÂŽæí°÷;ÜÍÙ2ÏÆÁëY}Bóùqú7v:K#8ÛÂS¯Ñ?ªo£øº”ÿå8¨CHýÁÀw‹Æáð ¢.Ç?–ã±\Kž‡ÞŽ:æ%–ý»¢í‹:=—¸ CšÚá «nJ×Ïœ“ì¼i ŠâÍ'à9n¤Ðh³kx&øjÐØÀËR®ž.p`ÖÇoL/ß¿­ÎXX³åωËD\'xå´óZ=T]Ÿp‘ìWÞæ©Ñ>f׋µçµ?°ê ß5C×pq˜÷a]!}xxô™:ÏÓÛšLÞÇ=®Þ¾«žønù(Qÿ —MÖ÷Ô5âz“.׸•Áÿ?·¨ýÛÛ£Á¯p¾MLbñ jÞLäy¼iôï(±ô÷¶óý`^Ïdæ·ÏÀGs=‡/a8“cé½@Sõzæí×àââ‰"¼ Qq7þ8!qi˜¨ö·PèÈ/}æÔú†ç#݆žv|m‘¯³¶m,ø6okÃпҽª¡(™¾,´µ»OèïuMúµ)×_R)îÁ¼gÝxÁ»ý¶†ùo°Ÿ%ñ~®Õ6ÑöOEº ßïËð•½ìô9„ßàm&zhšçåÁ8û”ãG©ñ‘þu4ºƒ(Ñèþ™ÌóS»y¤ /–”ád†‡ríGÔŽÇëQ¦þµÈ×i£©׸ù="ŸŠó™ƒˆAÁÏ•œ†¡+Jö]¢øás¹¢Læq?gª\}ÈS_Õ?,ô£Q-ë–a ×¥j«ŽcÑ4=ø3ž`Ë÷€&_½—ôsW3Þi9Œõm'„7¥ºXXû¡Zgu°Ì£±/$ÚW_ßæªKÕP˜ì{ŽÉïÈü]ê'Ÿ‹kŽUëÓì‹Ö/¨ÃZŸñ‹Ñøn µ{ßó8Ìøó4ÍBæ3òÓ„K›3$Y^³ïgxð¹ûþR£÷”rÞÚ®uÀ]¾•†þÝûÿ*ß6…üýÝ9ÑÞר–nžaí‰u7iü’êdø‡\-êºIÍÛW¿}1Ôtú+¡Ç;HæIzÖç—GãŸH7¿†Éús¸i+ýÜý ËUèU‡HyÊë#úñ0$~OèÜE¯«¡Ç05OÌÍñMÜÆ÷ö§g=Ag‚ïÊ w]Û|6ª-÷ÝT~O?Ó¯>ñJhÁòèTÏ}Š•êõMuú¼!y!ÒÔÏè_O£ƒŠòà|"ÕÅHÚ„ˆÿ{Lº5º~}aºþàL9ß Óç#ú©¨âxúm'Mu™¹þ6J¢=÷¸ét–¯Zñ—`ü̘ϕߧIgÎzµÉàâ6Üsˆ:_?¥gZãܰú:a gDÓQðÇ)¿7XïR“ÂM/Ê: Do“&÷½”…Ì/,ù$šŽO'ÞX`ÐÜrü¨y¨ÁûÚ‡û~uqhXºÄhièo*âºÈ޼>8Qö—“â£4ñ©Õ—™ô½Â¦0{LE¸óó þÍ'ÊqÜìúª­!+ÙÏéíIjd>¾®OÝÀ#ƒ}¦sÿlÜøÃcÎ |_iÿQTKé'>ëOõR÷Bçkúܒǵ§:Î@»ˆúÍíÏæE/Õ«.½¯Ž/ ýÆqÜOl¶¯‚ö$¾)"ý˜kVËy–¥¿´ë»íñxxøÛ‡ÃbU?™gÈòyu¾Î 0ýòE¹2î'澺~yŸ¯/Þ_¾[8Mj¸~L28vÇ•œ†Õw]߆î7×5ËãõqÁqÑêÄÇ,®WÿM‹ ¬ Æ øÇY⳩¿â}Ý0t£Qe§{$x )µ?N>ï¯2ôOañŸÔõ’öážKôÍ7G[„nxÜ<žt}3ñiÇÙ@øÁkžSヲ5ëuo_cÈUrÜ¿zŒ\7yô0å¾â½—^ ÎýY8$¡>]¾ÝäõµáÞw\róã¿'XgùòÏ­î n}Q®wu‰oàŠ ¤çĵ?ÆÛÑ0ò‡SšÛ½7Þñ^×û@~.Ð5"?„A'IîÏÖJú™¨àzÐíâíg÷þ²/ŒèO{ÛÒÛGë_7&\šiþ~²]¾MÙó‚2Â_}<ÃG¢§ÝóƒÞc£ñ¼Ý»:Ö}ãf¸ñÏdEãRæÏú‡ºxפe}ÝF\¤àj© þ”kp&¹ñú|w´}ù¢¯Y]eä£j}¸572¾š›Éxón¼7𾣸a~/ Ý0i¥üû’^¡ê÷8ú;\Ò3¼ß%Ž:ÃÚñÉõ~¬¸CŠïp«œÿxn4á:•EWpÝÉ`ÜZÝ#ŽçÀÌ`¢v¼S(¿ÛÿµýPy ဗ<¦æQÒð;Ñ}\ຄ¾®ØãÔׄó>Ž/‚ª†‰·òv¥7‚ìdð7(Ž'©ÓwÂøà<ÅGhçyß-l_ñäý  ƒ¿Q:×eP£Áíæ‘ßK‚q1ííäxž\ËûÙOæéD6ÏO‰˜WÍ·{žÐ9½}Þ¶úåé kÞ–xô™tõ(W1ŒMýü6'}ã§?&ÇCÉz›˜Ê~ÇÂõNŸÃ8¿C?Ã…ò¼¢êÍ{ï&³[_?M:q:‹Š æýMS·¼r},ë<~¼ç(é9ÛD­‹>íh¹/äÑ^+ë~dþ0²¢åc¼÷-u·7Œz 5œ®ùû”k­ÖYoW¸çÖ„¿Ç’Âñ+ixèýq»ç¡ü'8N™ëª`âä@Ü ~Ô·NèÍ ý©†ü®ìKŸ’.&¾\Æ€8²M<þ|úyÆÒσó¤w«®/]<×Nçóü²àï÷ªžj>ƒ3wËß{'Žsš2ªn¤ ?iQ„E›L¿\Óù[³‰nèLx>º?ÏpfÛëGÿ;nC“hþ‡÷)á“JX§/nC+KªžÑt2Lf«Ï·á؇ã=ni—ÏÑå§pÇü`œë¤p<þùÝÝŽ÷vÚísBÇÀÿ½ á³/Ž™×øüm‰ÄU¨´Ë#Q®¸LôÇ¢•f~ÍåûˆRù¾‹ºñ:~´7Ô;ðYß}@g8ÿiö=%ãѺdlãN† µ¾Îè|yÿãøGGC16@š7nzØMù ŸòûD–&/º•ÿLhj(†žmíôÏŸ)ï7Ÿ’Ÿ¿ÍÁëíÕGôBPBtM4õ-SŸLX£ú[qš¹Í=—û_¿·WÍ7žÃóÊ{H}½£>Ûá;äüîÞxpá:^Cãy{ˆÿÓ><¯·—ó+ô±ãárÕF áu$ï÷ éþ]LýšM4ºC–þ³qü|CßÅvÍõ*¿ßšyÆm¸ô&;¾ø¹upE¾Óƒq‹ë†ÿ|šþï·Œñìßaù,ºáúÏ"­ó8ô©X÷ LnÏž“ëÛ­dÓ—f¾ïÅxyL†vüMÆqrã¹OÞÎúÍ¡XÃÛ´h3«Ëî$û9ç5Ľö»øç¢üÂÖó:kpßùä«ï¸׊*ù¾RždÛõ­{Ûø>]-nãÔá:ââô¶°ýÜûèÀŠðh›xôï:¤^ò‡:Ã܉l=žøéÿ ½¥°†U+ä>ÄÆ²_¨ë}½2»uZøãq]×dx¹uÿ u×5I nÍÛO]•²?ŠZ–'BcROšó«úÕ+êBp?ÍÂÕƒ¿ž‘´{þÂò‘‹>DQ·BN²q ®ýBŽÓ”×Ã@ÎÃAx–P’0ÎjðE’㪓¨·˜½WB7ì8:=%“Þ2†q¿e݃þÉ{ôæÒmhGòp[Ó/DÝpÊÏÒË£ð5[ßt¸]çñöº½h-ž ›OŸénú¦Gœ]÷þx›ÒÌSz‚ºŸÝúüšÁ¡î¯·#8o†“ßJÿ⥉衄5‘gñ fž)ã“Ë-ùRÆã pižG·%õÞB·y£?Û'1½†}ŽÝ„ofƒÛxþ¸ýcü¯e?JôÛÑþaíuª®(‡ÝÞÀ6/›ép¾éöÞ ýe]þ8…/9æþÖtºî”§@#þ3'\_ ¢õÍ⮫ În¤îwiÂqøSú0~‘ë6Øõ¿deúÆCŠÛog¼Zì½v¿üqË̸J~|ø)^-æüï$~2Åßô9GEýø¸vŠœÿuìkFõ2æ¶$ú œ×;)^¥¤ yòó™ÂƒÒ5x}©o ÇS£}N8o~,û9N)‹—ô×Þ°£™~•®Žâ|½M ç~ ˜I í8~è[;| š[Çó :}.¡Ëéí=°p5ßuÃoÖë{‡[–'ƒóÿ“šA‡cŽ|½-õ£«&x™Ï»åce]'­e^þx½~eÏ{ YoõÜ¡–è$ŽeøDÜÞƒÅ\w=c§›R_Y;¿Qj=OÔØïí`ñ2Öþš}žN„'ö–‹YÞԱИãn*”q_“³ãﻞݧ۾TçÝèøŽÏ6BÍ3|È.»üJW¢ÿRœÐåmP‘ýôŒ%k®ýIq[X?WCÒˆhè?L®çGÌ K‡+êÈ)ÿ Ù¼Úóüà‘¯ªûïº1¾Ür¼ºÿiêíºAç«QßâÃÓe4¯÷]3Á[¬Ãc¡ÏÁÇ–´Ñz™0”Îã<+(á¸ÁAjÝ-¡›æ{i¦á…Øfà×®P×çtº–aMW÷Áà翼0Þ.»õLðù„½jÌ<2 cêzº][›qОäjX^­-ùœ |ñbD5Ÿ³ úU—N ÌËaéÿȼ »8n ·æø¾j¿Dè>á§Ë©Ã­ö_©»¤zÜ+^sÃ7$´ÛòV¥Ìçôû’™Ï7ný-8ø6¹ê þó•}Í'÷uŠÓÝŸ·!Ÿð}w`þ½èGÀ@M<²z=«Ó$įƒòÆrpåTߓɼÏÔÏ…Ž ƒW*ÇÁ0_G×G5Ÿ–IG$ôõu@Ñ7žú âíWÓú«ÓÃ#¢úÑ5±åYuæ·*¨ßõUðêÒz‚÷¶Æ/Ðäýÿ‹¸d]ÝÊy¾ßºÅ&}d›ÉÐM]תosíç²5žLXCßxâ6äþ©Ž“2™î¹¤¸nj˜yZ½ô¤ËPJú #öA üÍdü»Í÷·ƒø£Cìp ˜}mà>ަ½`Ëz>†Úåá}]ÈjÒ¿ß’è¼÷¸&ÔzFñðü¢_©º^FòHOp—!q*¢?—« ÞfL™ˆGð¿¿#ßG–©ïW‡Ôºí-åz‹‰‡Èüi‚Ëû–÷×¶#<“› ã±XæsåõpäkŽ_YÈî[y{É|õÆ>‰Þ³+ûÙás4~xÊxÕÏ!†²u¹j|4½«nNÊø¹\Õ‘'U†<ôä¥ãÅŽËjÿ¥0ïËïfß ªÕ~"Ž>R­WÌñ»û Ÿ®®®‚ÇžV×g²ãÁyx»ë‡gc’íÇÀ]ÿ’ûÍ* ŸáÆÚ®O«ò Þ?äuÓ۬ѡ¬2èdž¾÷€î7ÊXÆ2öÏðد:ñ½Ï~Ý)^Âh¶àð×Õ}Æ–ú@Ö×›üË´êêiã‡æ<?ÝÖpÃb¦—¢ÑcL9¾0\nÊbñ1õòù“6<±>QÞ,¿1ÿ ‹VÉxÉ3òÔ~h•¿†SÁø‡Ïï–ŒnH¹¼`yy¨ú‚÷‰%~5äµ&ÿ²AñÆÅe®õªú2Ì>Uý|æÅ«ï+L×g‹Ún¡ê /¬ãðùvË?NÁ7 ¾@ n…<¾ü§&mÀ%…5³÷êGÇ9ÉèáQýèE&m82Þ%oWÌü;y¼Òò{@™ßQÜ:gèšžz0–ç÷C«Ñ‡LÊ0PÆ·¡q²ù!ïÃd×%ÞÐÛí=8z,>>\ÊÜÖ7X¼*ÔP¬~P.¿*ö÷tóƒ#ËÐç”å¶ÏûñiûdqVÞ˸¢‡œ_E·÷UZ}~±îyûë_fk¦~aäp›¢íwº¼FÊu ïAX=Dýõìž Q_ÖÕ=¯KÖ{o?ÏkåÓ¾uNë?Ú±¸Œòj#Ï Ÿ<ÝŽ‡Þû†ÅÁÞÞ×{ø#‘pˆèœßÝ&î¦ùßCS¶þ†Ö-ãüBBxo8ð9¯kôGÐ$Íû›#O¦vœ‚dý>t$zé ÷ã'mhãæ7x[ÔùÞ¸yŠ_)ý;Jy|xØÛ¡òAhÏõìbêËEk»÷E1÷G>ÜvºŸÓ’G7ª!‡÷Ÿ‘¾rëóËÕ|Æó:ãš#ù=Þþs£æz“÷wÊWpín5N‹è»ëôLºÞužÝoj?°Z×Q¤~®qæÛòõ>QûWÔŸIù?Á¡ƒÛº-ô‹mÇ@5O‹÷÷{…[¿ÐÂÐ÷)p†]íúpɯÝw“êsóÇwô÷ÑܲN3ª´ï ÓÙל´aòrïœ7ßóÉÛáȼ¯“å÷wÍ㢜èþôK¿—.ZÜFu|Q*¿:¿+]F×uªËhêKs¾Þ²µ‰¶> ï ^+ÔÔÿþÝÛ²ýà`Þ¡«¢ï>MÝðkÁ'À¾tÅ>On´¼’í÷‡&êºÚ5lütÒæý3Z½ m¢é™à$·|ZÔŠVÁ÷IðÛšÿüÿ]ý< ¾"<»´Î/@ç<ê<·ºþ7œŒ}¾n œ=¼¡îÏ›ÈøœÐEÞ—0i­<Þ×v8<Ø!˜ohÄN¹.9kqz➃~¥#¯šý` ß):aV˜÷ynq«®žˆ§v•ÕGž‰·%ñ^7¾ˆÁÓ—ÖÝæöþY__ƒóÒ™·—í“¶ü ÈWÿóvÊy´$qà¢ß¥w‹%ÿO?þQmX¼Pœ,>ÄÔ—Gü\[ÞG°=^¿2±þä*øüóãÍ ½]œ p¸ÚqZ×µSpN=ê×””¹êLCW–·ˆ»ÁÄ—‡©›#ùõhÉñºå†þ¨všùqûu¾þúSÏPù[ÞÎdyi¾J{œ¥Ž¹¼+^·#ç}o“~ÂRÇ%*þ—æ+P»7Ôú€ËÞ³Ó Xô?NuoŸ%ÿÁÌÁñ!ÁïàêçeœÄüY?š§ˆòàõG'‹À÷¯þNò‘f,cKŸ¡¨~ð é6ʳž±Œe,cËXÆ2–±Œe,cËXÆ2–±Œe,cËXÆ2–±Œe,cËXÆ2–±Œe,ý† ã*‡ëY×—a˜šE{ü‰×ÆÊIûãRþÿÀA¬ÏõêÓ™ï'IŠ÷Öçuä'ˆj¸¦U"z‹qÕlj«Ÿ ÙD7¾$Z:¥wˆ9Sd\÷ƒ×8õ…Ä¥‡ 3dÉ÷•êùaéY2^½0½¼¢ß™þÝÛIŽë~/ënëÈÏQ ÑÏ0õvM׉.r˜èóóçµÛ0¯‘êõž¡oàœOÁŒe2ßÂì "­çxìmÖ7þx³Àõ§ Ö¿9ò:+ÞTttãmF~Hùÿ`ü?\d×OØÂ‘Çk¹|ß=Öî>ßû‰Z‡b§Wz/YŸsâé#D®¥ŽB±ÝõÐ4Y,úc ?ãí3ð;ü'\ŸjÊ8 §ŸŒ"Î^Ð0ùìÑ©aðI¢ƒzŸGcyÄù×È|“à }¸ÝŸ¥oÕ{?fÞ!êøBòØ·$úz¿ã|uϯ÷çGßà:¯Y¸¸ ßµª?aòS±Ä}:<‹IÏ'nó>±äÙnAüÝvÑÞ;ï®ÿtlðóh=ÞKÄ??æe¹~] ‡¡ãsE›n”÷aý¬×8y¬¬ ÐBýžà8;žiª3 =nƒa^OT/í@7ñžÔ÷<2–±Œe,cÉÚ¦×ïËXÆ2Vÿ†r·¼PÆâ1”YÖ¯¾dqnø¥O¶OV·Æ¿N;=ï}7ýjíõ«ã Üþ—Dòèq™Ð{÷þBòFŸCº åœÅÉöE› òCõ x»’ÑC~²ý‘È“Ÿ;‘×ÓÕA­Çm¤Î%Õ—a¸Œ?ó6F¼3Ôºè"Ÿ‰lÞ@ð€ÞŸ-õ¡ÆÊó³ÕGëpï™ÐËöökêG¼ÎÛÿ¸žá‚ïɸ+’?²ÅëÌû‹úóy›¾ë¬÷¹¦ž§‡b¢ÇZªÙ_/n ¿…JV‡ªµ|NK 8Úz©£eýîSÿ×MÔÁ1Z®kàPõºämTƒ ÷ãSŽ#:‚³ÿÄxV÷nÐz£Ö}&šý‚þÝû,þUfíSãÞÛsÝÉ,MßË ™‡@àõPÏ ªØýB?Ž ¿µ³Ì·1àn¦¬ÑS§&ôB½ýšzÜ3Ï}} îC8ñ§ú$z«Ÿ/tp«/â¸ÆÒ}ôö÷—èü'œ\ ~X;Ï£É>úýÃìö¹ËΗž{\ÿI¢|@(·‹+°èyyý+ÇSbÂõŠú«®ÏŖ߀â 4CÇð¼ š^ùb­³z{â¹_ÞnCëàyr?SÓpû‰÷G¾îOfàWÍ~Š~žó¾R®·Bw¹š¸À¶À±Ä6Þ@÷ïÕQ¥NxXÁ3æíŠÖ‡Õpõ'rþ+ïÀÆ&eh/ã¯(/š·%…Ú%¡êubÿx7¼Ó4ûùýM½¾¿¶äŒÀ¸Ið‚¸Î7ªá¼õ‘pWÞW [—Uð пãÔóœü ”ñüõ?ÓËÛ¦3ï›hüI¸0+T}¹ñÄCQòç¡ü»¥ƒŒ’˜ðî_Øátï1†­sº¯¶¼qh¦™ÇÇÞ°¿…[o¨Ÿ†ãwÄš5ñ¤¢?›7£ñÈ£û‡?¾c^wO‰Tô>"©Bæéð¾Uï(NïqË9J3ÞVÞwÌœÆxÑ.ÍbëGS7YWÓù&»¤ =íx¾RÎ{âªp¸žOÜ>/åóÅ`7^%L‘ûšPäX'9wT,y=Ì9Væ';+Öz·à‡Šk¼ŒE3ïKõs†2žW?çìp~e3æ¯y›ø¾4yG2üçþ]éùú çwv»žÈy￟ކxù—¼-éí¿ÀÁ–ü` o§Æïº|5Ë+–p¾ÍqÖók—ÏÀ÷ïKwdêûA‰úÿBÍ?®Y¼ýL8XÖß@cy¿ÄÚrM¾ù:=)ÿüóFÄÚï@ó/è[¿qæõ°ËS~ü^à‰Ÿô ì˜>)˜_ÿ »|½Ð 1§=ÿÊQjžnN‚«¹æüy5æõ‘'“÷îî¼ØpÖ<ž)çu‘ýS dükÞ’§iÍùª/#ý“†:Ž\np=GðÂjÏŸ®öW½í1ëúô!Ÿûñå}EçïZ¾ÒN«¿üýP^8äÉ÷QËk›­É·¶w{/ЋôW6â×ÕðçéòþÿÉy¿¸Å-°}þ¬Çãz0Þ¶àº3n<…á7r¼ ÷ý¾‹nÝÀÓ›m÷ýRÀd”ÿÖûÌ?®;’O䔼àÿg[âF&?Àò-†çÖÖâÇd˜Ãøªñp¯Xê’¨Œ7®ÆÄ…ÊçÐÔ‹&ÉÔÛüë ]ì×{+ž:z¨yïá±û &Ï6QÛ¯iÀ)cZïâæSþß½±y×:õ<8?¹èß׫½ÞŠÓÔ¸ÙÙDµ”ä±FjxeÆúšÉñ²íòyè¦éï¼ì<µÎS_¾î\–0á+oGzë‚(p«¿bB÷à~äkƒ÷vzu¸£š¶~Ëóß×”nC÷˜u} Õã¡ILz D‡=iœœÎ0à»÷¸sýàÎÑ\ö“âçÛpY8ý¸È×=¨aàå“2´¶{]upœìïëðG4½Aê'e¢OÆUw@WGcyÜõ–~œéŒ"«a>¿8çÐ9/“áÔén¸žû^°Ó«ŸðB,û bê» º7¨f~¢ÀW ¿QäߌãømL}¨þqÿàïá¹F£xžóØì¡ò}è¬Ã©‡«Çãˆkåýx{²ñ(Î=‹éîõwôÇţߥHzøîºa!Ç%´®Ÿ~J“¡ºJé¯{»Â½8æœDãïKRw»}.ã[l%ãCðô›l=»²?ËoŒPãrRæÿèA¯*õŽÖÎd¸¹{š³÷mÍòÇ>ÿœkåïwM«ÇÍ•uá±âav½;îd÷µwýuD=¸óZuçê‡äÏ7ónö=¬k¬Guïõìyzjþ£ýöÝÚªq ¶õ髞’ß“;²û|ñöž/j[/¸Fï_áüo{eêë{¿ ®ÇP= ïs ïÛÈ™Ÿw“Ì¼oNƒ/ ËC‹Å™Û»ßwr}ÀüYœsÚ3vºlÇmHìâ3»¡ºÕhk™ç~—ÇUÿ{ïfGq¥+ç0A9ŽF9g¡êWåDÊi$¡DA€„H&c¢qX0¶Y§5¬íÅÆI,ÆcLN&HBIð}êTûWçVuUu÷½3òÎùgž¹·»ºo‡ªÞ÷=[vœ’ùˆ\÷÷‹k($=¢~ïipüÔÌ¡ï•Ú|6Ý¥âœHZ⥤‹vËÓ‰éqÛÝØH̯ãòŽŒtkpNvx€Öóis>o—:«Q¯¤ßÝòF- qQc?ÿLâZPÍQ—» «“ïgóä Íœâ>\Ÿ«+uVþu>•¼~JÔ¡³eÁ~ƒÿ3áÔŠSÐŒžÇÅÙ鋞q¼¶¤ÛS˜—ª<’5ÿPó.›«Å­UMÖG>gù‘g‘î¼…š¬_ˆ÷†L?rœ_ÚŒñ úàá÷MãÕÒÒÁÍ–aöÏõñ‰á}O|¼ssZW¾Ê1¯}ÑÂD¼çpœÇ£ytЈÕ;ŸŠ*ïHGlëGjÞ±rºù.Ïö~™¬¼çÁL¸#L빪%Ôõ çÿ£‹¾þ)ç’ê> óÏ“>S…ÞMe o©F²~åxKK(ôQã²þGûÝÎGò±Ð[4Êë~°7ŽÔµþ€Ç>ö=ƒK|”«y3x!¿$[|­ƒ—k³ñ«\ Å?uŠÇrmh¢þ>+¿‹ò«ÈO6_XÏ«´@å‹éýW¿Lz½Öqbê¸b°[ m ÞÓß§àËtüM‰[Žé…â‰âoßù±æãÄçç©·|DzPlýBWï†]ßÍNɢˈé/‹÷ïÜ·sz=Ñ÷H™ö™fÒ¿/kC«dë„ÄËÉ~ ¨Ép ¤3’qÜât×Ë´u9Âqë”<=Ç KCUO>ñà²áë˜æ39Ÿ›~Ÿóø ûurCÏã`¯Mù®gáÜÕÿ[‰uç´õö¿IÇ Üùl%n ¾$=Kß ×þv®†ênó ÎpÄÉÞºN]_«øÌSÜxž(¹ÎÑñøÙê €K«ÅÔ½r»ûÕrÔW9Í­ÞXazC%·ù]öÓ1Åi¨cXGŽÄÔç¹aw¹Âuª†’6å:?SaVaVaVaVaec¦¾èiÆît‹÷ïü»à^?QàC¿1Zß×ìm}žXßËoܯÄ%ÁKžy¹ê ûˆÆÃÅ>Þµ]#g«Çùš+ÑÕ0¹lûOÛ }ï§±tÞ.Ý"òt£ëåxùùJ’ú0Xõ¤[ø=§Û÷”Ò3ã†)~}W³mÁ¦'úÇÜàS¹açëéà Ú­)«¿Ž{PÝ®•[^“†Š|5éƒÉ¿}TgýYàŽ&©¯ÐoÂÔ–¾Ç=o¦¾Î5ýÉTﺪ<»´óåÞç“ïú®ÈË'Ên†á¯PÄôƒª¤»¥mRÇ­ýt±æ°W} }…NÇ-£ñ!SÒqõ5WÝDôaø½'ÔŒôkfPq‹-£ëøR¯:ã8ƒÝp¸ïFu9DÅ9yêbÃ(1öQðê¨~.9?aõÍb>¾Zÿ»¶¿£×ûY½ï6Ý=tg8•©§~ oùDåè¾ä¤Ï%ùá®|`—Š¿··»èóˆÅWDÖ-ðèψ÷}9Õ,8œ g)yiž“ÎÐPž¨á©VÝÿ"û  žá=¿­—Ózˆ¼x¸Œ8êt¾õšªo1Tü ¾Òûïè:^_W;Àü²æ~ë×kæ8 lj¬¿ŽˆWë:;êÖ;Ÿ÷¢÷Ýø¥šG÷1øé÷NÞ<¸LÛ_ÆÖ·-W&y±üs¬Ü­×ã¾øÞè~#L¯Þ×.ûV¢ZvóEáñ~kÐumkéS1ñÅxý€ ó‡óþMH¿«Ivû&`Îíb=½O;¯áÉ¥ºý\yaX¾C_ç_ü[Õ瀞›~šhí¨¯`Ѓ²Ž_C—‚à ß]=»ø¼àŠw—Ìñ—¥lx^ç6 Ü’çÛ#;yÈàåèùÕ_VÝÐW 0]þêŽcð'P#»8Rôÿk¹ÒÙÄ]¿ÌwÖçj|ÞœæÁ1â} >ó»Ïx°4š?ÉóFÍÈÿ«íÙGi‰ª›‡Ùá3aônü®kºù©géû›TX´¡¶ÁÏnNóÔY›³2O"/Ý|‹Ô Mk¼¸ü>z zÆ{ï¤?‹{[— >@\C»Üæ'ðg”þáR/WꯇÛ}swò胱S„îÆ–åš?Î Ní<Ó¿«ŸòRÄ@ñ(î«úýUýü‰àwÑu²¼ça¦>~ŽëM˜Ü2'ý‘167u“>k} Ea#8ž[yå£þˆÎÑz6³õ ŽQÿ¼Ç^Ñçy?NŸâ¼Æ^uèàýñ$Þ ëŽ•÷Ãàh¾6¾¶GÔÁ©g4æbåk±¹oªñ9:ÅÌ?­ù¥×{Êûç·£>PÁ±„8¶9+Dïxܸù$ÙwS꨺ ˨ùÇMaýº=ûˆUQãÞÿÛ¸_a:ù@_=Ù5éqçCu¨àˆ¥¯íýûŒK¥.€ª,¿S/ú:™ð¸çWéòV›¦ë¿¡Kº}xPá,¼Þ¤ìgïÏžlÉp|Ͼݱów7ÄUw 3ä$ÀÓ£n¢3«ï®8&ð4ÓåÏâÖ‹S­÷†ùNÏD×výC¯çã‰÷¶FEó²1²G"?µw9â4¿áö„A~ôsÃýiÁ!ªSпÏhs};Œ¯‚Üäue|ìº= H¿|¢äQP¿Â¢ò¡ŸåjøA‡Á‘~WŠ×ã}v3¶øáÿŽüC¢xUê>b˜¨Ç£‹wìcþw½x×߆·1žgOÖ§ô¦©øYh)Éò­ÞÇk.ócÌ™ôˆx_åêLÜÌÔG’[°/^Ü|žNý•õ½z:ö¿,¦8x4\:öyÖ õýKŸŽæÑã»ú¹ÖãW±àöÚÇ‹ÏM¼eL}À ÿYÉ­nÌpò“Ö¡²U7•q³IÍê¼ßðßnùä…}®Oð™ZOÄöºÂ:Bÿß8)Öóü‰­ŸGýü¨¤üÔMVïCãòÕÏÜü5·ç¿y+xϳ.缓Òpzq §ëßÇà ññ‚xþ«ë:è=îßļ,gu—„õ-,‡Ö?âyÓŒýÚEó¼MÆñpØ>Jßõá÷î±1ýþ³âÿ^z^~® }­ó?Võ'%‚óöqM¿¬ÔÛÑÕr߆ŒëLëtòÁ¯-|ð~ãâñ‹±þŒ£WR=<ž‡?ßÏøÉ¬`ÊãŸÚW·¾}_Z‹çƒû¹ÖófõW¼”¯q¾Y\}y›á´×ˤ‹É°ú5??·•gžÇ,õ{Œß×2<‡cöµðÚseÁ‹LWt°ÈË¿ˆ¾Îh.æ%y}Ñ^_—‘ýš²vþ†<ªŠ÷\®ß¸ñ;¢î5çWN×½^szn| õqÏ¿›ÙtËÊ‹¡JÂúÍû1û¶ŽÖ+ÉÞÍUÏýÖ þáçÑ«T?Þgñ®GxœÎÑxز2[<ˆ>w¦Š#•x ô._ºÁhì–?A- îkm7Ø-oüE¼®x¬ð<æ¬RñÓ¯Uë¿*[\)ê»Õ#|ªæw&ú{_ÞÎOnzvüAÔÑçÑ;»¼ WCooúÎÞ‘×ÃÚ‡®ØM‡*x[wBŸxõfÞß ôç-‹œâE´ò›wPÓmÞ7ñа°³övÔóºì:µ>µé-§ç- ÏgS‹nèãùéÔ}ïí"ø+×Ö×ë~çìê'uT½üd=àÞÑúw)ëßû î_ÍÀs+òËׇûmº"äˆãâæZçB×d~>fïT{PÍ[ 1Ã#¼ïVï Þ´ä“ßcÔ$üíýL%޵ñËÐȱŸß‹~þ<Ç¥eÁ Ï<“E‡»¶«ó\ëd:ì‰qá5Y}¸ŠãºwÔ³OI#ýs-u©}ñ\i›ïïñŸòIuž%_Vꇟ7uóÇÐ$ú=Á7ü®´¤ý—3Ž_‰ù?µÅ<Ê”ŸšúS­_…Bª;}’®&Οãµ=¯/‡Ÿ3¼3”Mÿ®­©~ºË-žC¡A×Åq ·$v¤®‚q»¬ú.íŒãUc}rÈÏB5 ¿®*Í?†û‚ëôqJdëwð¡!_Oó²IÿPò‚\ •y³žxšŒãT7Ì'çv}ä:‰"ñ¢šg½‰õ0õçÈØÏ‚3Çð%ìù¢õœð6} ‰wÃòÿô›Ç†éãT6è÷-‹¨¿WÂå´¬m=ýöwãÅo2/…6z¿ KOõ/C¾p»®â}GczNjP~’Þ«¸þšXênLâÉäç<¯š4OÖd¸°ªŽóÿ§¬mà%IÿÊõ÷eÛœ×7O>F_é—W¹X½Eb=A]Ò3¸ôtõúZxá8ƒ„>Ç»'<ùñGÊ6ïÍ ÿ­dR´nSéù}À>oáv|é?†} <8´$ž]tcq0Å!ØyÌëy &‹cMþ7Ì~.ÞøG©Þÿ7CÝ¡Ÿx?P—üØÆôœ7fóO;•‹;^Qó¾¤gTçw‰GPœÑRõ°úÇ‚/@:i¸¡¹>ž’ë`>ë3óíÿ7¨TéÂè—EcÁûeÔ7ñp´Ÿ¼Êò!­H×g»cD( H¦{×µžbëÓØ-¯ˆ®éÔ!|ñ6ÃÄ—²Šß³¿ßm‘8ëþ]õyé¸ü] ÔçcÂïcöÙ˵a¬úûQ`YßjÐß)•Å|ônôzËçQ ø"Öõ¶™Mg¾¿…÷IúðÒïŒ{œ\šü¿VÙÕsÂsÆžŒÃØ<„Ç÷6?é×›ð}ýøŽÒLú(ùšIÈ×Ǹxϯ G]aªI]ïÄãú+št¸«/.Pâ!2Žgðo2úðMÿR“§Ó_Ô”·³=—¾üa x1+>î®úñî=2N|¼å‡;v>Ÿ®Ñ~)ÚÐß&Šèý ¸2Wý¦2γùIýG¦›×o”]þ" ߯C4¯w}¤Îë³9%úºK|”÷~Ÿg¿Žë>Qq_#Zá÷%Ï“å˱ò ö}–ø'‰WÆÊB_v(ó­i+Ž·à58ï,ñ<·'ÿ¯¶~~ÍÐã«JøH¦„ö–ùò ±z/ÏŠþGð…¸n¸ZÿP§|ÄŸ63ÕA0I$¤-ñ«hS'Ä1O!ëÙ²-ª¯…ú:ãöây;ŒÀAçYî-ªûŒúyw½Þ¨ìÇÍûþ;ž[OýjCßµp¼f~ña°ŸõÝùQÏN'ñ²=Ýâ îÿf|Oz6= lϮߌ|³ŸñÊO³ä}0Òó8ۮѿs£§WçMz>ávß_a:ü¬_¹¯Îºõ¼ £ýj™÷Favãw¬Ý›Ê<|I¸ôö,ïÕɀñà8N'msÏÊ›áî?¾£E[‰‡ëcz haá‡Ü|ž[¼ýáX:XòšMˆ?Qr§àkôù•à€aû¶¾è–nN|U¾!§9­Çã’å 2Žë©›ãj¨æÙ'aûÿÃù[p'i™Äý ?ñ6º®,pÝ(Öçý|õS°ªØÇaá1Å5äëùU¨Ãð­ y‰|Š“^‰‰Ë²é˜®±ŒÏlý&ƒŸ°zJeò[eÿÔʤ' ?Ï‹‡C”ç-õ/2Îû²Éü“¹ÅGÚ íhŸqa¬õƒ×³ŒÛúHÍsMfñóª‡Õü¹gúŽ:Jƒ³3áÌ)Ñõ—ÎÑ÷5bÆ“–þI #?uòw¹¿`ÓŠ}>²Ã›Ç´¿ˆ|L¾Ÿ®®ùŒꪇoâUøΗêq1„¨ïbª^ˆÍÛ¸lMNý=Tb}-zóá~“¾H•׌~úFqóœÎçÓEÅm¢Ovð¾†ÆÙñ·MyÔ&½º±BŸózÒ2cÁjbÊóþk{†ý8ú¬¿ƒºý?CÿŽŒñ³¤3…îžù‡6é¬ãèÎt÷ªž¯Zž|*ñò—Áz¿–ëÅâ–¼èçë¯Åå°ü·ÔÇñ=Ï´ #~“h¾BQvu}Ðóæ-úéæ&Ï€ÿ^}(‘—î¼æÓXÞ/Äßu`õʼ“Á7ßS=£Ÿã´ûͦ¥WWÞŒ÷ÑÂí÷$›_ê³ywËr‘§¿íjµn<³…Ч`àYt›€±òhÝÿ]ú£XE¿ãöo;+ù!\'!xI_7µÕWxôˆ®{ šÞŸÃ{ÕõÛÀ£Á}\c<¿7›¡_-Zpm™~tm¿uÛÔ7ÊÖwÀ×$^,ü¿ã^}鿲Ó?õ£×1_ˆ‡ZõWQ‡Zsg¬y[ÆE¿‡ÒÅÅ£O+5þ¬ïÙO¦}²|aÒ¾{q ÷=$ða•©Î„º‚_*ãÔ[wDóiæŽÒ>·Rÿ0ÄË“~Fnÿ[øJÞ¿£ Ã'ɾ+ó—úá¿4ø— ÿnÀ§ù­‹6CÆö¯Gǃ®8_|¸«þ˜ÉpÅÔTêÙÒý >gu;G\¡ä#q< vÍŠî6&nSuˆ¿¼'ŽãÙO3cÿ~ÛõyC?S[?ÅŒíC=„ã–ÎVãHùü¡™%î?á7ÿ£À bL<= ýdCçðûÝðíy–ºs-ƒî󖿪yŽ,²âQ¯)Vëëè-ü=Î/”<4¤|õÑ—EÄßš[ >´Ãwû§í‚wôuìúT¯“`Ñ5·K©¯‚õ8WÂXÇùÑ8ëíœöa‰·Æ5,/ßÓÁð~´ ç¹.Ã)L¯$p…3Sß—sæ¨û×õÄÏ¿8+õk‰«öNó+ÐÈ3o\LïÍÅs‰înz½!ï|a-?~×ÙÉú™ñ>™\—ýcê§<ŸÈþxhgwåídìWz®ªcÔ‚ž#Gœ—­¿v¸ÝqG^XÉ®Èç5n>,}¯.õ2úx+Ec¥¸ú(ö‹w¹î”÷ñªXtŠšùõñ9Uͦ3á=žc?mO:­zM\Ãw.=y†þòx*ÿZøŸ¸ákdÙTN6¡@¼¯¦¸Éf²ß4ÚGë ¿q½ð£[g—¯!ÇÝÆóê®ââ‚7I¿á‰Ž/)yž7,ÇÛÿ\µãQÞc¨Íc¡›ÿrá2=µçãÝæ9Üÿx:ËþWŸçj@ñ˜…¿z¾ú´-j>¥_$å¯;„Æ7è¯VX2ãz¹2ÑnÛáýÙÔBÿ>Ö‹ÞÏw^áùBÉÀÊ“BJ]9ïŸs÷¥GÏ'MSêóqéÇ×÷û"_SOœ§o½/Ç g~ßKôóÄ·úŠÿ[‹÷\æïÃ~ëçE÷»3ŽßÚâg®ÝEø#ÇÞ3'VÞÑ—_§ë{бßÇùßñzŸPᦳ\_uÍS ­Û|‹Ž* ½ô¼(4öÄu{öSrÕ‘Çý­…^ë‚eÃSY¿²Ö£aºyv‰×G[Ê{]s@¯—ÕÌ¢××ÚÂ×oéú¼QÝÆR/C¦óù§d~e‡G‚|KŸC´,Ø›%ý¥BÒÓµðî¼Ç=WÌÁÞìè§báÕNþFp,;¼;W3éfV˜ÞduõÏc¶u×L†)M¢qnç_§×§ª*q ÿŽò ÁkÉÞ ôj/x(ƒ6f¿žqEG-8«ÉòȼQZ†:¬?²¡Ïuœëª¨8•§~¡æ ' ¿3Ôüú!µ>²ö¸¯§wRñ’ŸJue<£ÆS¨Dù@Çx놺åkžzwGäüUÝ74ÛÆóH¶yDú¦ïqïUn}{ÞcgÌLõùèÍk·ž×ÚWÓÍ œ‘NÿÖ KÇЖñ/üI®ßìÚçÒÕøxèé×ÿÝ×ÐÄÂS(ôÀ0èµr±Ž£ššO4é0Ç˧¼ì{—øx—Ô×÷ÙÛçX‡icЗúZ=Ÿpe¼öäÏ1½÷à˜ú?&¿!þ^Ó7ÖúÍûäÊ<®m]1ž÷µ§ËÃ"Þz«|_T£øÃJõŸxØRW{?‚?[ðˆƒú­s‡¾ß¶¯éy‘ß+ü;Âqãé³çêæ™·Aÿ×Ë7 ‹¢ëî§Šaýc±â W7ny*]ŒÕ¹~VÝ%â‹sT|r°Ÿø~]IW¤éƒuÕ÷—FM®ƒãv~Áûú÷$øHOP—x*= tŒWWÄŒ¶ÑxÆúaG\hc†SÿKùÒçÆö•)N+mý6ëñRî3) =ôý|Möû@w?}Tu|¯û±xK§¨8:¬ßW/¶ß#cªÇâO{:Ήé±ÜÞTføÑ| ß÷§4!ÉŸÏØÿ{†þ)­âš9ön“]œeðá>LèwUÏmþÔÄ7Lj¨eСÝGùÓ®†þ~­ÕóÉèØ?Yj}$Ú°óýÓݪÁ¾?˜Œß€‚ìè´YûÍ‘â}¯•Ûu(ã<²Ô—Rš¬+bɰxyêmw¨uóá*_MÜòßè%tz0Và‡Ð2¯6øK–pSýžÓoOÚG2ÀZ5^ïª××G­xïÍÅÓĬçD¯¦¾p˜üXtþ.ñ96ñÀÆ?‹:†ÁD3Ž÷ˆÆ¹_úáüdœ¼eÑ3ðÄdžç[õwÿüøIàÚYpžsª|Z¿ñÃ+•÷ö›xùøþ‰è¼Ç#õ…Y@~Ô×k4?Éëaº+hÅÖ“IýÊ´¿ˆÉP=ž…®”wÙòxvðÅ5 ·týçéæ G'Û%Å÷zOòæ¥_ÐÎí½ ò— yÁ…ßSëˆ{r«§žGUÖöYÞ¤¾žÛ•÷.ù•Ÿ× þŒCU^ Šôº¼á÷•Ôûfëû$õ±‘—oYæé}ó2aßë Tÿý5½Ô‘ç–ÙòÒI wž–®Þ¾7Œ+nSó÷ô‘ÞI·nVaV-8 ΃Ã~óKð¶#¿§2ù‹ )ÿ_9ÚoÎ8Ž!¯ׂ²>ÇýUü.ŠÔøˇ™òxè½~†Ûí*›ü‰´à‹„ºC](^(Ž7Ÿÿ´ð·F¾(ôïžpŠ5«DÝtx{­ß†aB¿õÕúx~ OwVÿ']ן\#Þ¦cŠÛ/Qyø\·hå|5/_hÀk¶"ý†Ñ×…nþçJ<£ôå:ëª7‘Ôpî·>¼G<ûÕ´<'–|”¯®/ÈUè+o†{ÿ¤×¹çý—±¾’2¿]›ø§}·èã¢+oqoóèßu°ôÖó$žÁYª‘EwÜ’¯Šk¨Åú‚öJÆɵ™ôH³~ÜþWžt4\ëM®:ui6|¢=/›Þ-úæGæ©Ñ!Ž·¼YÆ:ÙÞ_©š›õ$©á®±zݬ"·:=6=/p¿°ègÔ3ôé"=ncLʯ¢8YÿCÉÛ ÇýkvæÇ¤fë$-Wõš\òüpÚ®:(åÍœõ+ xP®Ë"ùœ|;ŒÛ™¶´ ]æ2ÿbáãÊŸ» ü`7¿ú¬Œ3çÚwÙ€ÜÃþÏ’¾F¶,8^ÆÇ'Ü|°ß-¯`‹¿seÁ†KùLÿšøz˜·4ZÏæ¢xqW\sÕAëwß™é%ÿ|ªÏ?®ø"ÖºbÍÓ ãå¿/¥;ß!âÛ&†º_+Ö§ê >Ø¢ç±ôU.&3ƒÿ…ö–¾A9ÊÓäÚpïN5?6`¨ÈK1\;ïê‹2áü’ò(Ÿæ˜Þs«§K_Sïÿ ã¬àçåû¹À½«I]یϿŠW5õ­Cƒtu¦ÃqgU)W8ôŽŽPÏ×oý"Öñ\û€‡Çé ò9Mý¦qëSâýõ½È¸Â„O+ï†q«u zÞQWü•ó ¨‹ ÑØs~02ÑsjŠïâòû8þNöA0mûjž¼^¶¾ÔòyÂÀîN󒯨}0‚/¢ã^S_o_CCM™g²ä©2öÛœ§ö³©ý;8ÿ<üü‚³TÜGãòù>¢!ë7ùŠ_^Æ8îÅ3³ŠCGG¡¿…­N©ú¸«á‚{âõÇÌ£úó™¥Û?‚p‰®})Pű®Õ07ý¤Ϧƒçp­·aV7}^çˆßñPC½î¸qþ)•’†?Ñç/{ïäú|Åð1¤‡ó ¯¡®S =Üêoè¨ï§žŒwÌú¤ ‘þ}à}IÐðyô½çúŽëÙ7³éã ÂabúñÿW õº~‘Uœ#nøA´Ÿßeúõz ádbö¯*+C½ìÄo§š¡6ÓM}àV•ÇOø$4ɲÎ}gÇõ±q2? õHÆ‘ƒÆñpmhåVŸÄ¸Õ1?Ž7Ÿeoàú÷øüTÿý–$òC“ö—D¾¸?’—ô¾Ûê‰è"ú ™úc¹ºPÿ©½–ü¯£n9*ê– Ôûe‹cÓ2S¿ôÍ.ÿxVÕqúm:|]‹ûŽ.~uòàã¯Õ4è†RzS*Ü¿[t>…¯¯È‹Ùߒ×0ñˆª×V<ÜJ‚w ø˜fñò»áþk• ÿÛÔÿ™[p¢“ÚÜÏÿâÏ#*ûùÿØöF¼>žÓžôZǤþDøÿ‡)×ûV}Lö¹Å¥®Ûað•n÷•õçzé˜ún:ºóTÿ1Äy\‡7­÷7ã8ŸÄ[_þ”WDâß-ªí×ÙÒ—‡ëX õs yÝüð¦Áa6o·`󙡾n¿ö?Ôý+Q>ºi´_Êq‚²^'¾ì·óGòÿ™:Xλ_¼õ%øÜ’wÄ……ÛÇäbh+µ®ôw·çg>è6þ¶ÇÓEjó÷XtÒ²léqHæ_‹:Ö•gâ_ïx@¼3Dõï{°—Û,»uÛ{~ª˜©†qûm+´ø±¸ýy3Æù"·¼7©+›õãÔñä£ µ’ééH žN¨ç4³iªñhpÌÀƒ[úh¼^•´ÎÀÏÐ7Yß\×®\âî} ’áy¬ãwJ6oóz’)ŽÏ8n[—0k þf™ö{7©|b®óhÝ^Ÿhý¤÷üæcôÑ÷ ¿oãÈó8!æ«àù-|,Ǿªáø–~F6Ã$1É:Pp‚ñ-‹Ô¸#Ž«qà_ºé¨[ô.Ó2kÜr~t\†bÂÙ^¬×ýÊ–~cÆyÌÿ*V>‹_Ó×%©Ok¿M9ø":?„u³„¿»åáÿH4ÂÃÜfÇsŠöwJÛP›øËõY[ßÒGªû¿ãm9ÅÍÈ~˜hÂt:Ä«£?ë_M:Öqû”•a¤Ûü€ ?Keƶ7ùcz¯?H§~±ùòhÇÏÄëkáÙïÑxü—ŠA U]²•¤Çqù+âùžv…ÀÆìcYÈÞÂtõTãö÷úw1™7䟇¸¹"½ŽJÆö¬œ)?'ó°¼oîÙ&Ö×”ðhXP»\áÁ°ðÊ´ŸuRÃÏ'}Zø§i6VWóöÄ3 ŽegÝä8¸l™­ÿbRCÛtçM´0èr[OMú:¸çRÁ“ø€é¼¯¯+ã¡cmÃy¤eèä–GAéçzÔ: ¯`ðc±s“ž÷Ø_èýàæçÜxk ÿ#u=]û»ã¾ÓÔy¿ø¥Èyµ }Ú•¯~+ÜÒÖÉûw5ŒÐ÷)ÏÙñ sƒo•y g}Ij•ýÎC›„ýÝGçÅÃìµè×W.øœñeòôó o4ñn]Ìø'g¾>h¢?ø¥xq÷*e~C%ýüˆjñÞ¬ñ5 z}²ßvž–ê|Çu[m†.éÌ·èý|ûšÄU ½ú¡ƒ¥ÿ ¡™¯¡ËãtÒëB£Z<<36èK|hâ6¢ª_}ZyùO¯ˆö/,urÚÐfÁ!š—ûëxO|}tNÌŸšþ¸“Èû¢9Ëÿµ/Mzjej¨fÀ|ÍÆÊåêyLËЀž»ªToM¨ÃŽÛIíO|æ?._îÖᆠj_ˆÖžóÔ®]‰âÞ—%ö8 Näw_N­÷è¡_¤Ÿ.ýðŒó¨/Þ ÷—ùÇb}|kÝß±CÆ~¢œ{júá\‚ƒÉòL²~‚îë”øDòÈpožª3A|,ëÓ~Iÿ;ÐÞï|qáÇÊ{&u¤x]Ħ'%õ±ÐO¬»¸yÈo4!>/ÃY¢¹%ÿò9«û®ûÈôdבú³G©ŽÍñÖ]nÙV¿ ·7ôëÂö"Ÿ`‰{œu÷ú|®?N ÒñÊ7à†ŠÒéÛcÒyF qx½Ìd˜t¹ÈC-ÿ^¤?‹é³£õH.­Ÿ]ïâ{b­K(ñ·sã±þ˜X»(VÝÄ—Çî&j|gz^7:ò˜ óHY™|¿0õ?õë齨–N>,äu7ÐãÉÐH¬#\oùÙᡪ#?°NÂüãˆìòL2p<__%pøÕ)>ö7nxÃÊ,ïgÂKöQõP|ë&,x£¬Ï Â*¬Â\-ø^²úΦ8鼇rR7ÃEƒsŠCA]CêW‚ geÈ÷X3!:Äëaá~K¨ÿ|¢º>¢ó?潨ǣ÷Sû–Ëúïï9U-ÔtìkåkØþ@Bž¦×XŇiaؾA/³ÿü¬ð Ñ9YŸaY7·õËC+úÛ†Å÷-Ùx)éÖúZð»tõ®lý¬³eqõò¸¡gvú K}^žÏA¿nùŠËÔÒ-cÿ¬ïÃm *ñH;ת}W zT&½Û¤&û¡£È‡¡Snûvºò»}óåÁGÙÅ÷ yÙô7Å„-YÁW £~ý7å‘l&õÑܱßœÍßgd·Ï€4_Þ†/‰‡ë»èö¬èŸ À ‡gz|õ—ÑŽåkŠ’é[——]¿u |MO\HÆþGZ†6ñpm˜yí)Yoæ:Ñ’7üovñŽÈ‹žç}ý"O†û³<;êyêZ’k¶ûJ‡Üæ œ&ôãƒOiþ/Vý*4¶èÏ¸ß ç.ñOhP>yÕXÿ=Qê= ù­Ç øÆ„ú &>Dp”õemýܹöu>¯Iî[p‚ê·Ý£y÷®fÒ!C!{»y¾‡D_)4d:1yÑþ.^è§w_@uàv~ºÛã8òV}ß/4&]oGB¬ús™øÑIí_ó›Àíñ>¾†‚×)û¡¢g40xS]—Lý”Ñ$·¼!Ù‡ýÝâniÁq†ì݇$©¡£Ê¯1õ7w5_¼xÆþ{輊cò»¦„¯‹‰Ã6ŽW`èïÚ3Ù¸2bÊÛ{税ÉòW§öäøS_ˆàOÉÖ_®7„š†úxMÒyì³¾qþÁxýÍÕLºRÁ§ž¼Àö cŪ÷gÑÜ¢÷Ù—RÎCGKö‘߇6†þÖ Ç%y"™Çó›WÐ_è2»Î§®8–pûÞ^d âEt‰7Úô¢¥®#:¹éØò>¨Iù†—./ÈfÁkžþo˜}V>N‡—pªj°ºí”/T¼ ¥ÏuüÓo£|,ÃËæ6~ÆÎå'稿îW\6º®Ï§ä_gý|>ÐÎyœY¶zÛל ù³s/#?ì—w·j¨×ßÖçÐf²ÿ&ŠÅù¢å™>z³ÿ›ÄËûbÜñh 5õýj`è;XÙ¢ƒßƒüå3> ½Èdñ‚+Ïm ¸ƒÁ?*“z|R‹‹Å5ï¨zçžý)ÂýHXüïˆËÏgÚjþ¯jô|aÊÿñþÁ‡¬¯\¸%Ç„‹jW6º(’7dü¾0ݺš;öç4ô¥´é¼¥müK}<Ñ6]^¬¿/¥Ü³¥'°ALþº!ÁuÎѲlÖó¤}ôPÇ3~4èe¢‡¥ïl+ ®ÒÒ¿$§‘Ÿ‡BGÿpŸm¾Èî<Æqލâ‰o¢øƒãåeQÃóx}ýÞgÉÇÄùt«S6Š·.¡ut\œ7ÐÄðyÓÜö}Àô6ÑuÚsõx’„ý)xëy6'þÕ–?ÄU‰Þ'É»¿Íly5tÕ_߸&ur2ŽÓ¤lð¤èÌò—-¢ï»©>^^ à þi~:qn𥘯L:HÛïSý,?²ÛO4ø õ‹žòwUo·›¿cïÖÇù¡ßü¼ív=Qß³Oã{£.ñý™'uºƒX¡›!Ïmè#Š®„ß5ÔulÓç-Ò‰ßÐ^è:øêܦe¾ù&t&~áP@+±u¦º_½ËK¢¿¯B<ã|K¿½,ß×Jï§'í ÜÏú‹~ Þ?©w|n˜âÇGA­dφŠz0Ço¿¼Ô™Bï×Tÿ²³Ð›¶=ŸÜ0é†DÏe\Ý+Ì;Jý6Ùò³lëapœþ¾˜#œ»î²ÚžüôÒd}z†½.ÖÍÕ}vÔߘù‘a?ˆ•¢€Âèu ÷¶rÓù,Î2߸ª#_ûËxq›÷{\μÂÇí³Ôª3ùޝEãÞºG_/ÎKÅâGcÝ?ìå6/¹Jà·üMž«¿îègÁ%ìW¿7úómêwpxá÷ öWôÿ­° «°rmIùw§ŠË—þr…•/ã}ƒ+¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*,;†¶ÙåãÒ9åÓ¸z¯ËªÎFõUõÁW<¬òd>·ð"Ÿ‘õ ¼Síà©§h3É; ŽΧoû¬è;¿MÆOÂÒCY壣§ÎÞ‚ z=ѺªŽ×- û$1¾,ª8ö5j/Çuã_˜tzã_ÖQÕ‹ÉóJÿ,øºéÚ ~vqahÊtv_pã¡®ì×ãÒ]õÇ]ul1ù+Á ôóRð¥§î_Kƒ®me¶•äùI¥_EÆø²¾§EôüT÷{0g¸àåt¨­ëÈëFe?¾gð‰úœàánȆJÆq¿ðãÁ˜x÷®:CøñŽ“‚XÚ1ºOSeÃq¾$ "®3å§|AºŽ+ލzÀ«î:Ýœ)&ˆ¾Uh‘°?Ym‹^Lñ3nú\•<ûXÖJ—·‹F–~ݧo‘éGïS?¯jŽú¤¾/ ç5%ýðvñxâÙ6ÔK‡×Èu+8_Úºÿ>Ò}lÝ QçƒzŒ—zZ²óNt€±õöˆ›þŠí}°é[¢(žž2šªÇ5éáºOD?€§|¿ñÖËOêšoh,to ú£ñ<7¾¢®o?¿QY'†¤ÓÇ>ø*™Î$’ž@Üã.y<½ñàφ¾Pg°ç0e]!›aâöDzXXõûKªäD÷%©aB+7^ê×ÿ‘èù—þ¬i^ˆÛ÷ m ~G|yæ'ʾžÁõ~iZçoënë#‡>C…N'ùؾ+‘Ϊ¦ÓÿÕ˜Þüä>'ÿr>¹Ì' jÊ:þ¯R|Ô–ü¡'k ÿ²;¯‹^ãúèjèüSq^¶~=T[SŸÙŒó5èÞ>W÷¤ÿ…ÍϪóÄôåjë‘«“õï¸àvå|pÿq¡ã½Šõ1­DúÞ×o÷ßÒ—›&œŸÙÒï Û[ÍÏI=$4ÐÏshhXg.Ý“¨~„Ç®x-Í>GiÇè/î ª3=ü=úë”´/¾½C;Øêè­ƒcܯ†þsé'‡Û]¼Ê+>ÄüñYíq¼3ÞSë5-Òíè[ûÿç±H?È_­•NÞÊØù® ÂÞ=-U½¾´ m=óûïˆu =ë~ý£uÊQ×Í?võpËÍñú(tu\ÌÊ~~Îëù–:¾¸ÿ/j„÷__ÕOŸþtú«¢çöT?ÂÖosî‹×_ü®Éªaék†'.Ìi¿¸îoâDõÿ͇õunþ×ôµ¸ú¨&ÃŽ{Üôrçü>+yuTÏn<§ûOÕzúü#j¯Óc¦Køù_ñJE˽ꎧŠÉþ­˜ÿ®[NÇëÅ SîÑóö·}[Ô5ÏŽÖ3AOËAßqÙß²£ïaX3ŽßÔð|íu«ÓÜð“&^z¿ì+Ÿý­“cXݳ:­›Å¥b; ÿÊz~=Tœ-nÜ¢ÖŸ!øæ(rú2¢‰Ï“nJ%>ÁƒÕžˆ….t‹ƒãžxÙ!z\Ú;êxÞ[4Vý#‰s ÿOˆ“ñ5Ü~·â§oÑsÍô†ÐPõçåï“xW=—Äx³?Mô¼á¡#÷{Õ“GÏ“Ág”¯¨®÷{å÷ÖãäßáÖÿUù/ôbN ý|÷ëèëÎõ²e(¢çaôÔXõ÷¤ujœñP¬ý±Mø¦ç#ž§ úO¥/¡©§I¥èy5ȯ¹úõ:4fqE£îÞ¦¿]¸‘EžoT=§óuՋ匇ûßËúÉêNèÊôõ$¯Âu;”.ù×§þvçÿ;¯‡y„‰“é/Ôïïzž¾Æy§¨êæ—û²_æÊÐB<'(4ä9ø”p}Oð+–|%ÞüI“ܞǷêL—¿†šÄŸí˜Ný˜׉âü#¿™ô}±å{©ÆßhÇêŸýÔ¼Yð†¡ŽÉü L¯)ž¿ö¬ÚDÑHø‰¨â©l©Cá¾îú<Òæb^kÍôžh=Çè·„ÿÕÚõL,ç¹/7ùN_3ᆜ÷_ Ä‚çÕõ¾®æ'秪3b3©Oˆÿy—Â+îæOÄ5̸ÑÉ/Hª›…§»LøçaäF‡«Â’†Cü­Eñè§~óÚR ¾ŸU¼_ð‰cýµ¿^Û8î›b¶â͘ÿ‹ï<«®ƒ+w ¿÷±»âÕ…Þòÿblw±Ž—Üíå?¡JºzŠw¼Ëô»-~—k¾9msÕ§LšWÀ%#Å{E~qðñì—¨þ°%_æÊÇ7žG×h&WúšhÆâ÷–éð—¥~¡u»å-"ï'òõy “®v…Å3S¶¼–Ý¡}\u0v§Ð¿>숓ha™?¥Ó–éúxäºO½ü7̽æä{äZ÷@5K¾¹¾E'øá‡f3ok´ò‹#ÌUâ?ÔaëÎ%ÛÕ¸üÚi~º³gÄ›e܇ÅßpÃÛÔŠ‡+ >´ð„WF뢇ÛHø04£úiçèù8cœ<Âin½@]_{¾*žÿF~óZ°ŸõßjÈòå†~ZÆñÏŠÑë z'[9ÿÊxœ ÅÊKK…qÜ –] ?öòE¿»?§«ãÔ°ètu(Tç+ÎËÍØßû<;¥Ó×Çö1uÆÉëG: xnð–“zÏ×FÖÓyZ¬óKþ¡â»û²¸ãK‘åq]XÇ]ù'}¿:º¯¼^~_z«8þãMôýKf>(ð  _¾õEáŸ3^ Θ¡æõ{«þúPßǹ/5{HGhœÈ§¬üJ¯—ö ÆŸÜî¶R±é ¤šøÿg¿>9Ïýÿÿ‹ñºPžüúÊÂïü~CñÒjAù›§¦m%×êñtqùõ×í¡žN}PãžýM¾²®Ïw6Ô?gÿ¹N\ï-E¿Ö×÷}®¾?;·Šóßz·¸?Wîþ—þ zjaÈ»x((]¢¾GO]ü}eÞ/òs»Ð±Ô!Ê›!ß·‚oÓßWê—Œ•Qñ¤¯æê÷…ãUï•ÍŸäë"êP¬RvóýÁ{zü HWèÍ·-çoÁƒáÑÙz?qÇã©ô Ç»½–¸õ)ßÜEűŒh!æ…ù“Óé×s±Ð½Ãä›#ã޳„™âtþup<;yòàY'ulX.ïçáŸ'Ãýàæšñú—Îo"ÖÉ"U77ô³Gndù_U}b©;¶DÄwÁ†x1áûœˆö{eÞ Ýh>Õ]íÇmÒ¿”uùšêø\WçNþYkò£ò ú' Ç9¯®€6ô{:”ÏzRR“yX”ü\ù}¦~æ®z”åÍ8þ ½눟ˆù!8æ¨ÃiYÇ3Æ'\V&8ç\™)^”†ã…?Ö+ž?†vª.¡Ô¿ÿÑ"‘¯Ê‘þ·`/ÅÍ´Kžšïû„9ó…?44:?†b–G¬jÐÃYVÉ ÇÿàÏŸ\ŸšÑï`zȾú5ã_[äWÏ&}àsϸ$hŸÊ<ü.ç(xÙ¨G5®÷-Üp¾¨Átd Õx_+pÃóëq¦ïÀqYáçµ=߇ÍÝœp´qû8”•™údcÂ½Éø#žl0Ÿz=µ u˜ëv«qwgu^’úX¨eÀƒüÃíývå!`îT1ÿ~ë:‘W2Õžuõù"ž]²Bä¾p[ßQ›Å?[i¼ê†y¸inë¸v·²Ùü{´bÿ7Jæ£ åªéÇ‘ºÛò® m·ñ“ ó*úèãÐà‹ìèɆÇ}ædÁ̸>J=«´Žü“ê±gOe2ß/ñøUÕü+¦²¸ñ3? ga´Ž6JÖˆy ¸¹—šÞç®j¼ò®*Yô ßô¬ëðöy1y ¯Çä-ˆë`ÅW_þýº?ãi7}Û*†|Ö·~·\ÁÙ1!%Ô›q޾>ÞO|1ï íuã8M4ô›çñÃoŸÌ{4#=´3¦!Í£w¾cèO|ÙÕµå:6ÿ-Y|V•ñ;ùô’€A”“}¯:Zú"x Á·çíôºäqûá¡Zvæéà„ZW•}âöQÉ•ûËF÷#C¿¯^:u ÉWqÀïäV߃õýƒÐ¡—òž™âFÙ¯Ê4¾ ב±ý—žu¾Ný7š_ñøÌÈãûYý¸Vnó¹è—Pßú•tu¶|u„ŒãÞMÅý‘y.¾ú=“jÒùü«ÿ3™¾jÍtxl®ÆyˆÞû³ç>­uPòtlþo¸ýÕª~\ ¦/Ö‚ñœ»òež|jëyUqÔIZõǬè’fÛLx~T÷ãÿaÐÔüÄǹÉ/¢T-¥ùüý²ÅÝ{Ùÿ,ƒöÔ÷æ¡JsOÆãÓ.Ư>– ë Xù}ÏRñ·†Ÿ_£¸®ŠA·â„Ïq4ZwNêȹžFÔu¥ ­DüÔ…åUd>‰åÐ÷ûz݉ÕWˆº)×g¼VàîºYÍžõ?¼~MZŸqthA<»³kéýÛÿeùªËaÔf­ŸŠ?uÛÒšå2ŽB!õì1l7Ið8ðýñõNæÅwåO ¥þyã}Y¤Ÿè;~…ùî}Lüíb¨ËµgþFñ¾£M̾"+;œ’þ€«aù»9Á½à¬+s£{uQi¶QaVaVaVaVa90<ñâ ‰úF?ô†> ET­iÑ÷¢>›ý¼š÷¬]׈Û'ÒfÁ!Ò5:ÎtˆOðýütªLÆû¥`x4/?8ï÷ó|Fø¹¥î“Qÿœuš¾oåQ©y\àé¶ôuËÃŒÏKÍï¶NUÿ¨V"~æ~7gý§{JNþ]=F­ï¾¡æå9ÞMõh¥nË­7GçûŽ”o|«o]+Û†&¬TFýÐ>¥qO²ÃoŸ¥òzpõËsćW¦ù½²Û<„Ž*.Íüêu˜ÿzNtÐ1€õt¬ÛÅíCh=Ÿü˜¸!êç„–YÂЇçD=ö§/ÔzÙ›¹Õ•C#O½`9ï¶1èÛÜûhð&nõüç ­Æú/²ëcãOÇõrVq¸´ÚÉ¿RÏ#ü|ó_T½‘÷üð¨ÁACöÛŠynõjQéÄæ›Ù«u+O\’ɰëY7\¼o}…NzÈ¿mÈæ“×™®J7Âÿ.yV­3Q= Ö×ë‚ü¢ó´“}!ïþàä ¾²ð…Ú‰÷ çмðØO„ÎÆîbŸGýŸ\Ýßâ ÔË&~ÀqG\@C†Ï t:°ë%¯õÕÆ{*¯êVOØ?â#?Iê†båC‚çèŠC¡º3¯â‘§½ø¨hèV7’ø‚P¹«'3½%ëqòP| %Ë„®óÞdþ67õÛt¶ð,ü×~~È+?=x×€s 8 ÏwùƒÇõ|Çú~~YÎy1ל¡ÇItö¯‚=„+#Þrpاò×I·VŽ—q“×êùR…éä_ÐWÅKáÁv¯¥«–ø 9’Uþ–ÉPÇ1Žê)xCXcðkúöJ´^ ›Ûü‹¼¸GÐ[ð‘ŠãF3ú{æ'Uêù—ë… ›ªCˆJÙõP…å û0`ÍÇ¢Ï÷øEÎ?XÝ2]ݦ&”ï´õ-—}Š ù)4ôägO~F̓±ù5IŸ›éŒ£¾á=É2¿Ðf!æIßy¸¼RžgÄ£‚ÇçÙ7^Öœ·ßtPwôÕÃÀN¯ó”¿ Ëž‹ÞΠ+ù U–ÂÀæÚ<&•‰îÈ©nÆ~Ræjq™ÞãOøNœSE½uÝüIWÜ7ÚW/ºI’‹ZñxmX°Tø1§=–hƆŸGÆ#¸ñ‘¹âÖTyOiFîÓçk2\eɘȼ#žqð‡özÿóïŠô+Bÿ·1ýÝÕ)žÎÙÈxýÈ2ƹ}­ˆ× zCÙ2œ÷v¬< -qócŽçoœ8çàLgã­²áÝr“yÇŒÏgŽ¿Äÿ»/PõFã2Æ ç/œª&unƒ¯RŠÛ.Ðê±#/YýƤ‹kÜÞ³¯Qy7©_iêû×Be¦w!u Ò:NÆq=uK2ö§üŸì#w,€,^½îîøX¯Ë|ÏYÑññTW¹ªYÜSŒ4ÌJ§_K\ËèO³Nkì R%Ùú‚›„±àRÉ Þo@o}~ßÂ/8@uÄÊôþ¶Iç}å|Jûöžýî«u.<òÇÈû‚‡;©ùŸ"?]h4`óšAß:[†JT/{ݯž-ÍUÇÌù|ZÒóR¬Þ˜ø¢´·Ûþ!ÎtÔéB7¯!>/T×eГ‰iÿˆœçQ‡Æø€>_XËÑoó|âZ¥{ŒÛ­÷#†¿î—'è`À=ôM_®ý;Êkÿvÿeôab:‚øæ‘‰éo„ã´ ç”øÁ»†~AG诧®:©÷Iâ\½Ïsô«Ùás8â¸Ë«azgêsÅü‘«'‰<ÈÂçTj‚^ï)ü~Îå:?`³àh:ñkðEºýóЊt˜»R^:~‡¬;¡ÃÝEë·'5©c†öãÕü¸ 7ô~+üqœ¾+V|%uíâž±ø²’¥¿ú¸ÁÑuï…Ï•+þ…ÄY¡9ù¿üº{æåϾÙ)oŠÅW¿é :Ë<ŠûçéõG‡R×SÔ?¶†Ç4¶ð‚.Vqk|ò>þš®‰òèï÷¾f×Áö‰êõ¬_>ü& ê£ÕñúÏS©‡ûÖáqG•Ǿ¸ÀÏ=UCõ×f–ÌOÛy X5Z¹Ï˜_K¼‡kk |Ï×7‹çùY⥜Í—r5ɋƃóãß>øÂH¯yºmJñîÔ-"î¹mº[½pðl•×Q¬cø‰'ùÜèQ¶úîÒ‚wböã2C¯Gõ~¼ùËîõŸFÙñ‡²Eq<¼`\6ž•¬_Èénï1v=£êg4Rï/ï'1WtÛvý 1ÏÐ'ÆÄóÇýshü= 6ëyaVÖ÷=ý%å;¦¬þ(á1v]nëe3¿.øõg3¬{ÁÛn뫉‡÷Òùbž®í‡ç—|wçíYü‹¶„ïÍsÛߨW{ «3WrÔO§n'óMeàãžVêv¢Ìx5×:G\¢pÖ¿GöÙ;^RÃX}\“xÜ)‡•ùAö1 ^ÕçeÑÚÒÏ}õ9"ïiy¾eŸÑp¿VŽ8¸ŽÑ몸­è®_0úïz¿¿¥'_§.ñ&~¯ŸZðb2ü¹ÔCC±á½ßÔÛË@â#7cþq¦opëÏDü"ûž8êñe/ÓŒq{” Ž2׆Yo—ë¼™\QËWäºngìGú<’7ˆÑÏòcòI¤ÎÚÂщêçÓSÅÿ OºüÇà ùqÇ(ljÿ¤m¶ç ®Uý˜ž‚§ŒUÿ¯OL=zNNjׂO²¤¿ÙÄQ¿¥.‹C¸_L|ZŒtÄq²>](ŸŠ?üWvûÙÛ -ÓÕßÁ†^8lhš•ú ꋸSò,ÃÏ»§—Å­wâ´%ú<ýuu£uÆ-õ. ÙýÄ1ÏJüjÆ÷%mõõüf,>ëÒ^Ï×;³žˆó™Žªø½ÁWŒÏ–¯Ç㇘îÕ,Cþ€ù›èŒ'‹³¢ïuë$ïš®›÷ñ7Ÿ$vÍÐ7'>®øo‰¸Ž?ÇX÷´_Ýÿ¨_}Iêoºÿ":/G½^ïq xE4cú¾ ùÓḵ¹þj:yóp¼¹ÔçŠ÷3øÆZ¯û‹ªÔWR®›Ôw2ÄSmé¦oÒF}ÿÆC†¸zäó®ç¿Ž•Î{Ò‡òößÓWêƒpþ¬ÉŒùIɾûyO{À³»%n·×m;ihkÉkLI˜Oú\]‡ƒãÉô`3ø8Žü„à^D®³è¦Æá8“ò¬Ov=ÂñÖ×ë!õ ~í©ÃßÈ€Øç7[SÏ/Þâº:¨CëÎSãŸPê‰Ýó^ÝKõŸÏRõy1ú|•wÎûÚï'î¯!ÞûÊ~y-ãù] ò>ÐA¬ãÒOA±`ÁA¢¿þ¹FÂC Ôëâ :éÉÆÌ¿…ãœ×J­ÿ:òÐ0åé¬è™ô€ÑÜ/N P>$¦’k ÞÑ¿'ñ+UW̧z¼Ó]FUŠˆŸˆi"ÑyÕüfý|$õGÃÿiåÇôbÀÉ õïÇx%/»Õu¥>F²÷úÂ[#ó È£ümAW¹§Á/éHyì7-ù²fýÃ{Vx­sÁaš/Z;æ9Ö s4¥ÿŸºýdæ.ÌgYt ÂãþÎSG4?;ºqÁ>ÂÍyâL†î~õ߸&qmÖí |`÷¡‹Àûc~7êqA2?©’Xwƒ—£ç9FÇ5R—Üù÷l¹Q­Ê¼ðüõÚù‰÷¯ ߃3ô÷ ïë0ÂÑÉü幉¿½ÓÕkòÕW÷«gÁm;óä¼fË󣟈%¾U‰¿C<#_]9T’z}ÿ&yËò<‚}„CëD÷¥×Caãäï5bqgÒ·¶èòÈüqÈã8`ðƒ°zܤ?d'ŸØ/ÙóÃy“¨«_O$ž$ü_êÄ5ή®žoÿ‰_ ŽQ³{-:ëØÊÉïÆÆâ}°Äm¸bžÓý‘ÏSæùXòuM¢¯òÅ÷œGŠA¿ÿçE·+~[Uâá5 y‹üw€ð5-é=Ÿ$ú'કjþ³%í7Œ¶«çÿçë·—8înþJðØýÓúÔø¿›Õû• …‰ÞT÷ßú'ºžÑó êÒûÕŠžã©ÏªõütHIòQ$Ö%ô¦>N÷‹ùhÞkgÈK^d †ëaùðpûÎêºæ%¨ï’Ô 0þ>†‘:5qùû¨lˆª²ø¢…~gC—åª?TäMýRãts<^GQ/5Î#¢yÞÁ1VgZõ²ö¸¨G÷o‹ú•¬/Êü ¸=ƒŽ°G<§=GFÇA glÒk_õbýgþ,.¢ý¶üC¼g3(<›â±ñôžT§¸2¦¥«¡áÃÏHÖ%µói}¿ÐÖðÞœ®ê㣅›ºøé ‰ÅßúÌ óW‹þv§õi&TžcfýºA¥J~×õ¼Âqæ©âZðOÂûtÀQD~飑ß9é^q},z Á¯ÜêW¦þÏ<Ÿi34qËo¢)ÓõØï~˜øFq CT~Jó¢ý°aéâuŸP·¶þy޲x`õ¬è¸p]_×öÑç÷þuXQ,ò0 _Uóo--ùò"_dåw.bzTƒÞÕÔí‚ÏÔû‰’Z©è†_¦“À”Så£dŒß8úŸWŸ¾Ÿx¾À1Œ·Nºšp7=ÌðÙÁñÆ5ÏÞ»>–°¯Wp„êIY¦&z0©lô©pu3½Ý":ÿ„©ÛEݦt®¾>³¶Hy³Õkôýt0d»žÇ qÖ½¢ëШf™ÏóY}òüvjþù‚­ª¿ÖÛÐ_·6åûÝídèË &|ûœóvÂí‹,ú‰#VZîÿén}`ë¦S¿Àq>ØÐIÕãëoÐÅœü5_rÅŸ‚ëL¼F]—7ü,Y?¶ª†û<šð/¨ójdç½p}ßdÿ­ðÿ‹îÇS<ä— >ð=‚0ÌŸ›(×Ðç ¯õ_pë7³äúè|m¾ÞâùiQþ˜çkiËÈëJ>FŸŸÎÁRÿžSEŃsÝ…K~.ò·#®\ÿseØÚ0ݾZ}>ˆŽ«›Ñõ÷ô³‘Ÿÿ¡­k ™ÞHO¦ßLu%SßÛ|‘ fH=ëð{Ò!–Ï[Òó6þžŽÉtÚÂqJÎtã©p–qM£ómw>¬_W7tqß6Aï·Ôcÿ_ö¢X÷˜¿ÁûgüCÝ3ãx¥œü¤ƒïÇ™Sãõ¸è¡tûÆržj¿ßÓç“ÎK¦SÛÔ‘·WòŠêçQþ %ωï]]CxŠQCcÅEÁ‹|N'}Þ”ú6J=YlZç™' &~‰Ìg÷ßõ¥Àù­¾R¬w- ¼—›«ü´ÕoˆëSÕ€Gq¬ÏcZg}“ë¶§ËŸ§üFÞèüWÄï^¶Iä³K»¨þçÃmÅs3g—ȃ­^Hz»†<Ê^Cëö¯‹ü½Ÿ„>¤çFžq®ò¿&CÂ^÷3GiJõç·Å›Ÿêg—ÿ„Zl¾jl¸Wž·êny¬Žö¯±¼YVñEÁAµ>’uü[ç½Ñúb’牪3‘áÿž],âK ?$c|®ëØŸðaà 8ªó>RßßùÃÕ<øš—ôû 'ò/±ëËðIû³ãŠºÑ~S K>½¤†¾Žù±¿5ø9éb_7!Õ8޼$C^ÓçŠù·Ë?2¿Î”¯T=–¿MO‰õo×fá×ï8¤Ö7¾VCàh/¸@Ìw~[øý7½$þŸx»Àu/%®ëµźx=ákKÄ£„k®®Ÿ›¯5 ~†¬K¬*ÌI~›oùò=ôÿ¬¾‘ïïKå‹« [Ý€ÛŸ›À è¾>çkñ[û®Enøœ¡æŸqýKâ½µ3«u#ëyRžbO:ã…ëãèxº+XýH4±±'ÿ®³!¯q,åþ‡ƒ£óãÎãtJ7Ÿ‰*Ù©sáb¿¾Øá~=ýô7]óJ\GÎyü.¼g#–Z2P¼÷ßþo¯õ×Ê–<4ɯ­Ìtö.ã^×ûEl¾M«ï\Æq,x!ïñ>H·î>ú¸ ÛþÏ5ëÔzÙ-7¦òÞIœ¢õü3¿ï\†ïZpŽ¿jÓ•~ïS+CñÐ%^ùU\ø¤wœûKñ^œB]ÿO0þÚA°ÃÈ+Õë‘[}Äd&püº„O>nø¾é”LùaÄC$þÎxòºq|Eøù?ãÕë±LIJŸzÆïÚã8NªëTaþñÚÕNÏ5®ß”“~_ÁqÊKNÔ×ãÃóéI<¸ÁõX?fÇ:féŒh<#Ó; ŽéówÆüÖ¦>* ã ßy}VuÝÁft\nàÿ9™ŸƒÙú~E®æ«»÷²"®\$êŒÁ±tô¤2ŽÓ‘ðØMÓéw‡&†¾P5Üü0¬×ÛÖ¯“TÞl°/žÜ×Э|è7Û ›ê{=¿Xûýdù®óDÞÏ1O‰ÍT'¯ÆÖ•£D~hÕõâ/ã}c^nú3J~~Æçm™NÕâ‰úy²áíbæm%¯(ou¾šŸüŠùÅg»ÍWØY*ê#¯øÚ§{æmSÊKK=Ìóôeë Ó C·x³ãõá|\IýÛNÏ–OTdzôOÁÍ7¥¯ ]s§u‡ëÂx§ »>óõ:ήìµÌû›nÕë©ÆäédŒ?{[*¦ÖÅ×OQžktó««S¼Ì+fo#éõöß"ârÒuãõTOÆ#G CYhÈ·ç>¿ó×*.ß²ÎbúÃÊsW'Ȥ»š´ßeRC{½ž‡)_Žš ÏDúºè¨¿Ž¦:0QÞã3‘:VûÑ÷‹ó}Âý5ˆæIyêûƒæÌŸ EÌ8Ü[ª÷7x¯Ï²“ou5tÕ㛂ã®<&·¸kyÅÿ¦¼¬Ô5îg‰KÒ²à@Âý÷e_ékÁ‹>Õ0¿8TòÌLz˜¦æÉÐ‚Ö ?æ„_ÞÂ[g³½[+Üþ²O½M4õÓYCK×-³cœ—––'Ò]Ç¤Ž·ü;6©uo†»ÀÊ ÑõÎií’Õž×¢;aÜÿÁö·õ‹'ÍòŒ¾õuÙ/åEõ½®ÇQ£±Aïí¦bw.|RÔ}Ï!~Àj £ ­ÇS†©ø–,Høi¬ÝyBÞ÷Eyâø§‰:>¶}©o¤ž V_%x»GX½æüçs¢»€9ç¨õŽIW;æáE|‚÷¨~ï 5cÕ‘Bé¢ûT~éä”â„›D|9ä1=o(/Ú_7öu)´ô ˜U‡ðXS÷9Í£Fÿ`Á©Öë8OKQÏrŒM}d2¶sõ{»Ð߉;¢×kÞߦؠ§5éÕxõ*z/ÑHý}!.µ–aOè7qC‘EOkã§/^ßí>àÖÄûVé—?!æ±ù3ÅßÎ"ÿƒÛ>Nφ›èãÚËô¡FnRë“}—;ù“¾ú9\,®%í7·~ˆÛÞ¸ëƒ~ú¦®¼­´,ØËŽ?IÏ÷ÂÙãSÍ»É>5Ÿ¿”¬Nˆ¶ÉâZLÖ±KË0KèãüM99^¶ÌÔ¯Ms£o„9ó½âY̹UÌËíÝü”ª?Æôÿ3ú1ß~£ðs×2üoÉ\§ºMO Ë£u)8OÑÕPä©ËiÒ½Ÿ,x¶ò¹úD¡|éEÑ|ÀâRãÜü—”ûuÆ5¬éÚcØï–‡Ýô*>ÔÏ‹aß K~Êf¨å–·wÕá—}fÑÀó<¬§~YANðŠÁ;„[nËú¨W÷¬ß«y™ïvï]ëÃÙ2ù~ã±3¾ÝÑO˜w y_²ç\òP|ëª|ªÎ«’‡i<Ïêýá÷;ÇP‘ýŽ2Ƶéõ7QëV¾þPZº{˜2ÃéÈ×6oåÓÑ“Ý#+õáà([÷÷ª×ÙÄ/¿·è4gËGëî×òËtD;½nKð¥Ï„æžyÿ/hþ<®ŸyZtMˆ[êDø (OVä—3õ½µîwæÝñô{˜.êZòd#»Eã jGçA‚Ï :>W.PóDEúz ÎTõ>1GÄM¼ž <®®”§CËÅ!·¼ §’-T_ÃÀ٩̸j«^ffng®û“c÷³¢ŽqË­?(&<䙕Ýpÿý(?xnc5_\“٧Êz>]Ôº–Íu+òe|ŠÙW þÃæ¦bžÙv¹Êk91šGpëÀdyžû. >Ì Óa³¤úhfñO»Œ•—LšÍ8F4ÏÖöSQ­»dÜoÞGj½¦U–øî1ßL¾Ëi¿Øý[gýDœ-ê.¸k˜¨^R'^^z鉼=¶¯åaúR¿|‘!JËdÿîðÿ„y丆ÑæúZ³áËÃí>tÄáÖµÄ7†üT¸ÿe"ÇugÄÓ ÕG™?Ð_ÕsÇÅz=¡•“ã½'W?§ú§¼ðåï¦:¡ÿF·|´g_E,z›áGIǪ‘º¾øâg$~2üõP1/°úåïå$OüFû\¡2ÓKñìG‘–aÊ=.¦»ŽëWˆúnõ˜8ß]oøõ3ûŠx¨çýRÅy”6ðz$?¯ÐãkbÆ9Îêÿ.WO"©¡*Å]Û:«¿ÊûÁÒ–âùƉynþgjžÖ‚§FmzÏΪ¢_§êý}ì¤âßd_ì™OˆüûÂO¢~m¯FûÇoèWq&å{†Σ”ák°|:ñWPM¼ç®úQ¸=/r}‰õNöËÆ÷¨ñe¾ˆsÃ~t‡IOõÆÕyõÂbÝ[]KŒ³{:ß-"Þ{šG.£þÞÝBH×/ñöä+T^Ôîgm?Uÿû+ùñ€¹Ʊx{(ÃKðÓMËÀoÕÒŸƤƒ[@%KŠ™KÄýªïÈo¦ysùÙ.¥Úí¼ëI;æódÏRÇÏwÚÄû{Íze½‘ï.áµnbVtƒ´Œã£ç3û4·þ—²Ž½tŸø{Y‘ö¹@u]Æ5Õ¼QOÖ¿‚Å(p[_$ïÐGb@Ê:“}¡¤|Áx”_°~Ó¬/«aˆÛsîÊ3ÃʳÜâ yÄ:Èúd¸îª³™-7d}—çã°ëmѯX”µq½ “^»õ¼Ö½§â [3ç†u)ÕQ§üJ}>Z±çç«txò§š¡¯¥nvþ™"¯LxÌí©çâ?Üp?lýÆŒUnûyƹØ2Dõwçj½pÃ.‘7¬bÀÝw¶ôœ¿Cõ—òi¾ïî†v5Þç%üüKƒsM¥¬Öå­ý™çôPõ… ¼µ9Åߎ*. ÚF®O§€¡úúj8νT|Ûñò§ÁçeË+åÆõÅÂÏ?eúržïâ¦S*ñIû¦…sÏ‹ü2‰¿³¿¶§TìÆ3Ž['ÙïÂÀ„ÇocеkN~!øž¥õÝæúuÿ×ûçÜx?Ãðó÷búy«¾Ÿ(OuE¼?£¯ºPñL&ž0:XøÍ£ëi¿Gé—úçwëÇÂïíéxþ%Ï»áÎ=ûؤmÁ ý<Š3ÜÎ 5(î>jxï ÄçÁú¿Ø Ï±ézõ>·'^ÙyðüE´ÿ%ñêÞÎãW#žk#æ'’. Ç7¸âty]Sçī߯Þì†c©gø¼év/û­¸%W©~Ê„'¹f”š5à¯Ð@?Äíc’1~ûè~bXx‘šWÜú²8ÿ|¿<õ<&0]Õ‰EÑxšÓ óî+Žyž‹ø ÀÍoäý,1„p«6 >.é¦Ùø¼Ù2lZ“ª>c…eÇÐå%Hï§žŠß•ñœÎú®À±1Ý&¥ƒ7Áe7hýJ®gŸñ=á™ÑÞÔŒøÞ=OÂ5²™)/gÍañðSXûËDó9š¥Ãß‘ºuÞǯFë‰Ä™~çsë|o>OÅaçaÐéÃÔÆ©Ô5M¿E„¿-ŒÇ7ÈÀÿT³lÏy«2ÿÕRÅ-à¬ë¢ëT#†ÎÕIÎ×ë¤È¼7¶ ütðó÷Ny}©»•qœêŒ§Ø<;<%›aËH?ükÂ>#¾fë#{\êï‹Û”õNêÚ¢Ã\¹Mü)¨Ãâ/áÀћƫnˆ/ïªú£74UŸïŸÌ_Ký\ñšÈƒŽ}È-ߘç¿™ôD­ûQ¿Hl°à†3üã3U\ÿš/I'£¯Š•OCéß“õqí§nè×”1ÞÚi*߇ò·¸úbý>Þß Ï>¥âC§üEàL?±ÜÇo~P]ôQ§ëÝ ™ÞiZ}›÷ 7Ü:6t¡`óÚ÷×ÔO“óÄPËož“ç5õ~ï5^eŽ_~?ÿYý|U-$ÔKé'tT±p¢:2ýl­$x³‡¨þ4é‡*ß}÷FO{Æí+øRÿ8©aûQåþò~E˜7Høí(³öuq¾¬^€B3x„ÅeKD=ÉÔئã†;©x»‹?ïÛ–;T<Íî)âóvã_öŽšç;ÌîËâ—H/T$„PEÝ?œo™¿Ž6„ =@œáØ×­s4n'©¡’…ÿ|†ÁOk›]\CÚzÎÜPÛ’OZý‘êéX.ñŽhª÷;ySM õòM<ΈÿaãÏTüõî•Ñý.66Qæ ž‡àæÚ•óÞÑÜ ãÛXÿypˆüØ®ž~c†~5ñéãW©·mKÅßuѺW7ñd} ïÿ,Á§‘¼ãñ7=*Ÿ ×ÿBK&‹»pËõ9ß¸Ü _ûÇ>zïYžßOõ×£þ«‚Wx ˜k’ fâIšúýH^¡ì[‚óŒß´áÛ|ûÇ¥ÍSŲª?Û)ºŸ/:úé—¥ÝoÔ×PÇm¾Äʽ®ì½»£û=xöÅàúÁ[Ñ}[¸ž¤¯¡g–ýømˆ•DòkV¿¥¿îcÎSùHÛŠÕï “Õµ¹ŽDÆ÷õí¸æÛz^D¾[¿TÕß?é? &å­+ëó;\G"mÖ¿jŸ_Ü4N¯§Àx.R_Á7Ùô®|-ø ^}‰×m᫇ÇùØ1/µyö÷‡üpY¯dq& œ*òéû|ƒ¾õúFÂ/Kþñ8}_HtkݧÍÂ{ Ž¹âž©n¼NôéĄéâ¸1ˆõ§ŸXWÔYß®à÷”‡Úp,<6ã±§mèüÓ¬èˆYKz!®õ›NgÚ†¥¼Vö^rœ1UÅ]ð}’eâª|Áò¡LÿC…ÿ†nñtú°êg©ö²ÏÔÇô̳RÅòõ#ßÏ›¥®na2?Vâ0}÷ ^Í-®ÕÒåž*VÞãi4£8´%áÆ:»ÕÁÂýwüÉ '·ì.¯÷.Ø—Ý|y® íXÿ³¾ßþ­ß•kÃMùY¾ý¾­ã9ÖÍË‹Ùâ,Y”“ß¼!ÞcߣJ¼y×Ä“ÂÄïÅÏ_6ñòƒ—Y>ÃÐôuPT#¾Õôf*^«–ï™û™©?ÏçdèJ²ï‡êy´¶qM†5“üt6›Yt×Nóº1|ÃŽ‚Tñê6üFÈjHúgå©qp¦óÖË ›Q+ú:âÂínñk}Cÿ ¿K*ŸÒ}ÓL†ëÞUëQ¦¾öû |sÞŸìuý|†ª~~?î„cƼ»½ò¤qõÈyß5ù^ÛðR®:TÙ2tL¦?+q˜iž“ö8´¦Å‹–†KÝtŽÃóp¯çmŽ™ÿŽ®_sÞ6xÎŇÕ~#ýO›>v8þæß«ø%®3ᘵá&ŒûÅÔÙð>οz Në¥æ!IŸ×¸·=ôyGÑ·‹óåLúÆã`ùuŠ;8NÔd&ÜaÆvŽ:õ(dýnõådŸS}KÖ=ÑÁ1ÿ‹ßþµª*~¿•§¾iJy“^¨|L:aXö­gÆvU-|œ"7~¬-¿›–^¹k?"Œ¥þ’ÐÝP£þxhàÇ7vÅkÅ5Ô¿“÷»úw1ÜòF<‰êƒS—rÖ}|Û’æEGÜqð¶å½Dóºg?MãxcêºÍ×L§Oö#“8ÈàwLÏÀà·bò"?¸NàÇ1}…¾>8ÿ7éü¾Ún× ê±UÏ®.;}^?¯ò§Ú8§ÓïşaΟ¼øÇXDÎ#èù…àT6ð‹X”éNsÝ+Éæ~¯ô/Q‹ê¬+Þ‹ÇãÙq³›.àÖ¯‹:øº'¢ñ'¨¯—j=ÞÆļMu5,;ï÷µ7è>­ â«vöwËOT§¼`ÝtóµR×*­ñþ¯ú;êLýÙÑ«mÐ]øZ*ù9[ŸÌp»Ê)­{•-ù³u îékmÒ9Þ’è[³ªõœ"ÿâÚ‡ÊzXœx õ$žtRŸñ¸£žôEêy‡<ã$ ^1ãxùéøÃ( }7 8[ÒÑå¼ãx%Ÿ‰¼Ý^æ]ñwâ‘o¹(7øUl¤÷¢ä5Žm›ßÚÄÇÀè¸7ØGŠv# ßï¹—üCÿYίضMï—þJøó¢ñn¨ÉòU²ÓçÑÕ8ž ]Õ~ð®y8ëqÞ`~žìû±ûÒœäy³miõ™Ež_Þ@òÂÿõm±®‹øÛÞ_î?âU?Ý}ê3á{çñ[éý Ô÷¡rÅó¢×{ñòËYê!û}»n—¦Š/Eéã^ë+–|C9ßàKñžÈ>¦ÿÿs¨Önñëëg<îã÷4WæYò7e‡"Ùgk„[Ýeg¡ûzǯ‘ü \5_àú yVë¸6=®îz>…Ä18§™xn¤®‰äi /z½üW¿3¿¼Jð¥…grÐ1Nh“wqaá§pCØöl²ñÇÇôWòýò“8§P܇æžýN6Þ§âPgf—Ïîk(yWŸ«Dùч¦ÎˆNùÙí{š–î7Œ|:+:GÆãòÆíW?Hߥ¼™«NOÆ~Cüü¼às?ýØ0/X';ºWiºSœ,ùþÕ-<·^nçÏ"óî¾:Äq ×ܬæO yVïqW ™ãZpV2~Ž©ïOÚ†üdq*ò£yÇÈK˜WIþõ2õÁÊØñ:¹_‚z~²Ä]pŽSuVß솃¿c²û;Cý­!ÓiíèÖ_ ^ršWLzEÆq)þ?Lø—2‡ߺOõ¸ËÄ;0ô Ïó#7ÿ—ݼ–Žº#ý Ÿ_ö°ú|°>q¨IñÅÒ¢^Ö&ºžˆéWéq¡½ùp¿‰¯¦’7‘ø\qH.¿/ú½mýû‚§³Ë'Nj8?º‰©_OÆ8ëþ;:Ž[Ôí9]v¥ˆËî©*êqK&‹ºã»úøÅxÞ1qqÙ6W¼X¸ý[ §}e¡ÐY;Áp±R÷±µAg¦Óe«žüŒÉdÜ€›ŸRç‹Ú–~’Sjéù ù,ŸJ<Ö´pTá¸Ïf‡¢õ!PùåèûºÀgq[‡0úœž÷Œ~&Û¦úé\‘¡Ä¹¢z:8ëà¸þsœý†úÿyžù¿q¿Lõ9ç|©—Fôþu•ú²Ÿ°š²éÉð>°Á±ò•¯ð5 X—Žžø{)ÕÖ< ç¯“ß+ó.ûmª£òyLâYqïê<+ŸƒªLgoÃW‰îkØwò å‘7÷*—ëÝ©f¨Oý"þÞ©x=1f¬[Ü7”p½Ý…ÿ‡BOuN Ÿ]/7ºî\W 8lÑ#œ]†>”©ß@Ûïú(¶íP2['F ]_tq«3p}L}RÄ[sç ݉#¼sáû–‰ïû¯ëÓðR1ñGm¸q¬›!⤉?r‹ç·ŒÐÇ»ý¿OMý/1_.$¿è1Ñ¢¶ÄçQ¼vsWQwâ}`ÖŠ¾jXð•Z׿˜~ÿé4_>öýåÊ:+ýÖÏ ýÚ œ¦ì?yÏÛâø  ú½õú¸õ~•ŸÒˆt‡.î¦Ï«1à‡FëÄUØ©aÀ£Y»‚¢ó”9ëg¨§…ÿ‹k˜7Tä§Ö6WqŠÍãõ¹ ÷èwr?߸Ý'ÙÖõuñµ]Ò‰ÇþJóäî%úºñuˆ|âÊhܸÉpÓ9YÑ=Â÷9þäüz‰þ?öñV?#Ö©mãÄz»QÕ¯D¾i¿"^,pä㽓]4ãq-}íт➺œ(ñ¸N~ðG꘾¾ƒ<¦S`àùM¦~©ÅÄs;«µšO+ˆÆi Øo¾’þ$*9ò™7<­O?*ÏëýÂâ³¢uº'Wýü’'ʤ"fÇÓK!úc`ÛŠxý9r´þqÃ"âÚgÛyÜÑEéŒSÕR§™;F &Ýóàm7-:éÊóÏÐ} :WÚ:§šÙúÀ÷ëÎt wÿẊYÜü©~¾Î¯©Á¿cõcSÿ=W Þ1èõ6ôÃ8”°ÿîÛÑë]Ú†zŽ:<¡õ8ÅéÔä_˜tWsåSYÇyè#á–œëùpÕõ°ñ7d} sžqH¥túmâÊWEž¤á[¬ÕãÁ›Xð®—`'>nÓ7ÝæÒÇ2èl£UÙèÛáìÛS¹Ü|qÑØ5OÕqÔOÁôAbfu44pŒ/¤PL¦¤†ÎéÔmQSü°Ó’xjÔ‡ýÔ<]p˜ê3Ô§cç(ãñü°¯…øŸ¢dým†7êuå ¢ßc×~ó&žŸ)ß·^çê»ö/ ·7à'y¾_{8Ü)ƬôÊ? _|oî;|¿ÓüiÓ±²§Ã_°ü„¯N–·¸ß<¦ç4ï·çó·ñâ:\,p_Èê¹_:Λû,º>T—ÂÆÞ¢¾ÜþsV¯n,_V†>ÝE½ÖÀŸµê£žç§³˜-CéÇn¸ƒu‰ù§«¯ÔµŸ”«¡%ϵ ƒÓ:ì%Ü×шGæ—­û¥õ`£ŽQkÃüz(Þ$fž©Œ/y8-ºO‰©.ƒb=Oý-ýë.QëÝ>ZÎlãñ=Ó{çó¾Ôõ3Ž[lÐ}£ð?kðMéý]z^VÖQT'ý°ý_ö¿NqžŒçßßöpô|^»|öAÏøhþ”Tò&|Ë ‡öìžO¬%¾7ÕIÂ|´ÄÿLeû½2+ú“R88êW§KË$¿6×ÇMj¶þ¦6žx\Ã9'R}ÐêÉ­Òå'  áPO¸]‡à+¦+5áN=Ï;eü°o~†ó6] s¢y“q UÙ|WEý^úq&Ý?®¥Gó)ú©ùSÿ¦´Œ÷!rÅŸ;<üfƸäOc®ÞOË–™ú”™úžÒ©ÏÆÅï¸ZŸz‚6C5‹~<Å™®8NR_'҇źÆYYwœû´§úœ<Ÿ<ÏVŠ~NPü‚N›Þ¯`_nñì®zmÒÐq|4/¿Ðo0Õ¯“öQ—ñQÆçL—Èv}yO¼'74räÏ~DõÆZÉøáx†¾¬¨ÂêнüüR´k/êGYßèj†zݘN·8Ö±?ä zÏé9A•dë–­ïL¸Ýp½¾jð†út¶ ‹¯ÕŸÇy«³º^H¿)ìóU›Õÿ¿pÔu@|Š.ä/ÅѺªaŸ‹ž> ã­›( <¥'Ÿ@êÐH¿ÔµŽÌû=›ò­iŠÕ>!¨™oŤwê|^•âáîÑÒo>ްü'éêŸúéä[ó¾~•ë<®æO› (/Ú.¥þ.‰¾~Áëôž&˯ñõ@®oáÿ–:6Æuš_që?Ôq÷²ûÝNß×N¾hß>^_€ÎÑþŽq¿bÆo­á;‚j¡.lK.ðšA~óZ‹xëšèóµ6¿ üºÂ^ÚÛ xÜÀûaï¹é½çºbã°¼ÚPžÓ•'¾ß³Hß'ôxÉ4Ÿ´‰‰ï9jñ©ÏZ¸á~ƒw²ÛÇ!Ûæëï#ÏñºäWVÞͤ‹³™ÎG³dõIô}JÌÕxBïÚú?Ç>]õô=žû”n„k_´àÃE§¬_m«cbÜaµ^_µlëÀÈ7ô+¢|1j¤¬óÌô"¹®}\ Ï· ùÇ ‹V ߟïºãLƒŸRŸðõy„4áFŽô4ÈÏ@'±nb Õë_<¦„ oŸqþM¨Ïøph—Ю•]ÒÌã¦ÃÛq½~ûQ}•„_Wï³òÕzwÌùÊÄ/sVa*z,&í˦ÿ¨­n(qsÆï«¹åÓåqPÏÀÓwäÑK¿ [ïʉ~º”EZ&uý·'‘«ÎŒ4T×oÏëžh“Ì×Ë•aã4M¶^¤wÈ| Ç-˜ •,u¿,몢%ÃMòÃ×bpM_кã©ß‘- þD¸¯I—yÆïò¸hs½³ôóö%ÃQÉ:ÿœëûaD:úî&ä×#¯#ÚðÐÕs‹?Ήõ‘õÙB?‹nÎnù©´ ½HÏ´†~} ûŠ¥{yž9üÜз%Û†"ÁËu« yJiñÝiéô%‰kÜ_Æ`ý|Æ_C…ž_×] I¯åM·x •OÑÒ·*­>@ÖóSYÕx?zýÄ̇Õ÷ºoŸè¼9­Sé1gÂ|ŽÌ/gàíšQ½¥Ë+ÐA¡z}‚ÃüBKâÍS~‚û¨dÑ•7ÔéÒ2t¦üÉ{T·C¼:Q\ã×Ý×P37øèàò+÷Zü V¯DCýûMæWòü0†±ÿÏŸ¬Ï;Qþ؆Ê8ÞÎ_øù¥3 öûØò7¿þbíÄsˆ>YÒ_¢:ä'Ïc†—㬻RÉoñ>¨hÿ’öú`‰h8‹Ö–ubX´îÆN‹|n±±DüÏpĺÀû§ðz8ÖéÏ?ã8pÔÑ3äSÛ[úìdœÇÙßÏñ²pÛýpt{YÜÖ#»yOWÝû¸&qi‹)¤ã3ã€X_†‹oG¸ª‰E㥘.6Î>Ë)_†n,þ8k¡>Ÿ?è9·ßÓ—ü‚f·S'qÚ¹éèMÕõË£ðç7Ûf›¿¼Ç»ànñ\µ5à#.¾[å­,]á¦Ëq‚ቇŒfÑ~fï~­ëÁg?ðxöÛ'›PÙ ßú¯”޳4Œ™-â}„{µø1QO̳ßìøZ4E½N˜¸6ÎiÁß¼ü*L5àVÎ{%V+¯zXž—G*që¸òA½Ÿø‹ÒóE:°X&òj˜»§.ýV¦—íWêuÀìO¼æ+ܼ^¼„ŸÍà^ÿqþ£ªˆ|ÑÙoG×Ó üꢸáíèzÏ]¢o)æÿZÍãM0äû®K¼‡¼zÆöÅ1q£Mqøž~O8þšï«z‚ÜægÌûnªùz8>IhªžŽÂíNŸ%t1 ¼ª´Læ{°ö=ŽooôþèÊx•µHwoŠ…ç×Â2¯ŒPëÇV^ºá:Ṳ́#ÎK,úÿ;—©õ¥‰úùȯìGþûÄ£õ\»0ýÌÃE½þº¿©zŽÄÓÇð1‚GÐŽt€ºåxŸËŒßMu ´¤uâÌ7Ôý¯ê-ê9KÇŠóu‘ß|ÛÄðùÒÇÕ¸®ù5Sÿªç¾nÑ{ÜTÍû’>(nmêõÞÉzÇA[ú™>_ž¥<™­?\ðÓ¿ªqªùo¬þRÔ¯iýF‘AG´:ÍGs†$â× áXH/žãÃí (ïÍêj¨Ïú}©ž¯Ìw£³çyµ¡:¾å¹Œk¶¼^xµâÅáãé·4Qçlþ£š‡.vÓy–þ_Æçœ¿}€¿ÈÒ¿¯S´_#ë¾áÿoZÖƒC†çzÉ…nx¶Å¿×¾ÿ2O…îLGéx:¼eôþ*®}#ºþ±¸¡˜×1>Õ1‹ë‘çÈšnÅ·>9¥ñ@VaVö†ü²éÿ™k³­cöÛ’Ö³+¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*¬Â*ÌÍÐÙ‡l3®7ÇùRÞãýpÜ Tçà/)áUXôïHŸ•âõõÀŽU=ÉŽj_ZlzBÅ¿`<ø§ç4?ùûwô4-º$á8ë7:oðñˆ_‰ù‡…NöAâÔÉ-O¶¼˜äOI>q;EŽÃõw3ô“ó üÝ 7ºõím'ôïÖ_7øG:ú»xèô“&uÒ÷9™w¿ªC”ô€¶ó-Ž`íïs˜ŸÐ¿ºxÏ©ò³ƒk4ñGÂï×MüЃ]âšž}Nšêy&­p¿æÄ{éÚ×7BûžcÒy/-º×&?DæPù‡gxêiI=¤ç¨Ó1víÓqeñœµsÓ5À êsÊâTŠw?±¡–úKò«¯÷ëßöE½àBƧuº¦[Üžq~­HG “AwuÅMí÷ªù&Ãói÷‹øoí­"t–¾Ïœ­ê«4%ÝÔ‹_S×…y§ ?µq<>× Ã] UþºÅ?kXBºjçŸÍï§çMIßÖ‘Ÿ.·CZÆ0ýˆÞBZê“Ç9l‰Ošâë«Vˆû2åe}ÿez.]uôQúwô¦÷ÏXÇõ²º^ÒÓIÿCYÞ@êù^r¯ú\.¡÷¦^YÆ;è•,…ÿxɯS]ŸœO:$Xõ¢^ÿ›õÏÅòûÕ÷‹úŒ`Ë`ñ>ï»]ï_ÏA¼MêËOY÷ô‰†s•zÚ-ÕRÉÏ`ÕA½.î-ÍÔy£¡Z?AñŒXþ[Æq.ªêÖ§ôKæßnûĭŊÓmýHLúý˜x_™ô?3ºêçég†úbmüôµÐ%Úsí«aÓa·{—òdó/Uýš’ÍÑuí<·¼úÆëŸ$õçPÌt*¿bïËö¹ªgè~?§q:úЖ¾v˜tL­Su/:ÖnúS6=ÀÝsÅzyýü=Q7¢Pýý2®àÛ¿-ßú2hšÝ¾®¨ÍÖÉÆ¾¤uY`éZ}¿Ñ7èãêm“³ÚÄfÁAòwW}¬öI9^AºÆóC½Sò®vžÂÂWsÚ·-x•ꇵôߣé—JyŸŸýý©Tæ¡ÒªxŸ¶1õ‹ûêuK3¶ð¹¨ŽY’hþ@ÒÑ~©|é?™ô幡 fÿãu3“å6>žŽØÜ’ï)hÃüûß fè7E>iš¨S¿gøˆŽ”o*ô«¡Žßz„ÎËýté›PÞ¼¤Fä¼€N†þ»½ÄßPÏ8ß JÏìuÿ}†~E¿ôë† ëó2/³äªî²%ß‘q>üên˜õÿ*ñü<´gúïêëµ××ÐÜÐðD¼ºvß‘Õu˪:úëÿCïžáÙjœ¾o‹÷ù±>E¯©þyK¿¼:®ùªÿœÇòÙk)ŸÖ‰Õ§nŽîwSÙÐøUK¿¸7hÿ+ÏJE×mX=ï)/z¾>ׂ?[æ÷z¹­³—W3á$+¬Â*¬Â*ìßÛ‚ÙíG_aVaåÏÐ*·uì †6jÞÌÖgþRÅC7ÍN¿ÛyJ þš¾!Áa}¾»›eµnRCmqx µýò[§º¡ÈÀk0ôA’u€¸Ç“}K%À¸‰ÿ³ÓR¿¤~託VÞð©j¾(ø<¾/ð Q¹ï6‘§^¶¨kUÏ¡)¯èjŒÛÆ ÞˆÛNÎCÁów«Î ÁaÂ1gî×s]qß–ý8'ü$”lWóMo§»î¯™ð2Ï†Ž·©õDOÞšñxÔO˜÷ Eóxó²¼OÁª)åóל‰§àøG‰Óÿ7̨§_Ï\û§ÞÄ’ÇŒk˜ñ`ÚCjãU0ŒÞ«Þ~ùc‰k@–—n*Þßà õz#/a»7çð†^õ–pÿ…ÓbÝ7 NÕ/À™G¢ylƒ?ÏÐ'ó©/ýü¨}‰Ï¥þŸgS›ÿ·+™Ç}Î1}m¹ö÷QÓârÄÏ_Íÿ“ºáöÝÄ<Åu¢ë¢·.K·Oñ]ëµói°×€WzÖÍOý1ƒ?³õá"=>?®aÐ]Á…¢î„+¨qÔ?¹ñ—Ê<'~Ô ¡s¦Ô‡“x¬¨âyÛªߊ½Gíhž©çÉ¡À™ÚðLáyï'>ÚCÝûsuÅê šþ^ºqjÄÓבë§óqºèý|´`~-=ÁOÔí1h ¸_.ë¶äù‰>à ÚîS·ë–­~Ý\ï·<¬âãÏì¥u¸¤­xéãÉïáó’ÉpËVñ¾ÝzµZnäˆÛ™ÌêÓ}ôü‚ðû«Nèy–ÅѼ\L~™i>{ñ½äS.¸Y]O'+læ{šò2@!ùE‡˜¿´`e*¸D4~‚‰ÿ…ãc͸mþ¸eLaýSÔ{½_Ø!º/³qÜËÇ«ëÄ[WNŽ ÚR\?ˆü¥„“{W#Âz¾Eøý¨_EâªpI3ýçÕ üš+n }( ŸjãSªŸ½éyí}àó™É¯4™ŒëQº?V|üÜ/FSƒ®Ò†#êïmå|ÓO¸ñ7¦Ç H‡g×PD¼È”Ÿ±ÌÿRG ƒØç¤¯ƒ[Æ©ñ7ÿaÌE"?4òNóMpÄð9õ¯ó[ç‹<ÓÅÙáeÑzÆý6=)ø•âñ­P;.£ëócôýÄ¥™x Æã4"¼uU5nÂ2q½P:&'Ï7º¯cK§èøyÁïÝø8ï'ã=˜ò½ÖýÞK˜NKO³&ó/×oWÿ1ãxÚæŽVé¬ <¾Íø~ý5ðÅP×sÝë'†ú†3 ヮjO›×‘.~Hï~ÑV?4ž¯cü|èÈsÛz4žÎËß ~Ýöïúáç×¾.ðæoFŸ¯ô73öŸ¼LÍ ³8Þü_ɇœ¶aDG'\3Ç»ãÆÆÑ~ôÕ¯¤ò»°àw^ñ¦ëãLtæ?dèÖÔó¨uÞ¼Õ>— tó?ÐPÏŸ³ég™ô1±~»˜OjÄ[W‚c†óáù˜Íqp-C¼S$æ‰à5?~Š)Ok¨ÿ“2¦5Õ×ÿ§¾¯æÕ6«ñ6%[·Ÿž/0P™ø8sˆÊOè!c>npÈ‘üR:x<“n/®|+'xo™Ï>7àH˜n’äšÖƒp»>u¿1⥬âýqÛ,‘ï?+ZgÕpMï—Ôù⸌íŽéý9Ïsyøý‡Œ_ÒZ?_˜_Ò…x`_Û ê¾tñÔW«òpЂéètRñ®ùúpÿÎL/~õMz<ÊW¤bÈï‡Û±| ÚÄô»ß§®OÃTþK¨ÿ™ï¨Oß̢ÿö±TëWizŒOÄuÕÄ`Áוq–|OÔý†}?7<íMD¾äܾ~zw “îwÆvWÿHäCÖÌL¥î„ Ô8µ]vó}¦–•oÃ=…»u”>/ºý¨Þo+i#òóõ¨®Ãtœ“ê%¸šÍ—†ž?bÈ jÝŽðT¼ÎŽ"‹ÞXé]>§ÿ¯ýîî.pc–õƸe^¶¶þ|m¼~재çiÇÌ/Ø wÿQø]ÜxìR'7íó°÷ýtð™6Ä»ôñ×(·Áû§ >á+‹©ž0ü§‰pph½žbÖÖœàˆxÞ)8˜ŽN†+c^ˆ<ž ¿Ìõ þ¯[ðYvuŒ2Žçˆ“ʶa.é¥^ý„ú¾N»Ný¿á'ïøºŠÿ|à3á§Þ|Ž'Üñ„ð㽤â*S˜Ígªú,õÁ«¾ë÷­Ž#%®~ÌXá¯n¾EÔ÷X~4Å6‘úŠðÞ‹TÝ=”~&ö¿r‡¸g¨ó=6ÿXäå7ƒÛ~¤Ïú&˜ ëþ¨ê#ìüÏXúè¶×i?·oþ‡éúàÆ«×…é$-þJëó0ú7êud3SüxÇÒTt.2Χ¶Þ/ÀMÓEĤµøIµOGCO[tå¼Ï³¦¸nRoÝÔþä:Ðóºn©Ê[ < Óz:îÊtôò.٦ǹ³ü/š¸Õû0j€Š·X»0ú½&æ°eðÑ_ÕµÂ@ØN%–aKíg´K——Œ™}»V&ÿìij&ÝÂŒãïs¬»­™k½CÛxñZZþ°k=WŸé? ·è¯SÏ+ÔÛ.©®âR?¡÷ÚR×1Åñ1î´3õñ×¶*bükþKYçƒÏ(³ÿæ®Òë _r§êT'=Ãñª®2FíëÁ¢ÎN8atˆŽKÑÜ1ïvõýå‡â:©× s¯¸šÏsÔ÷ªN:ùÌÚíÿ±ç•bÎwÃõ<94¤uua´ŽÇÙÉ~ɘr—ð»'½­¯?’N;FøÕOÂý 80þ¼q|6¬Õ¯»‰?@úæÿ‡Ó¨ŸÙd1ObºX0ºSt=§ÃgTgz¿$8ÊûdÑù]­¯w†ã©ºÌx°DÅ[4ËŽo܇kDû…+[‹¼ñuP-·zߘßFà@öêý(ôÐϯ”±½¡¬÷yÍîë§“¹é3•÷Êê‘¶þÐÖñ›ëý¬?•>é|½N{]Ç}Cý_êçrì—ÎëÌÇÄ<1(¥õ`þ½Ö/“^1jåFo&ã¸#W¸Õµ×þ"ÖøIõÿMz5Ù2É/•þzÒñPÝ‚“e}J$>&cœj´~Öó£qÕŸÅóÝó m<†ÑWéñ­¢ãä´tˆ‚OD¾ÛÚ—eYwÕO¼t-隸ñ¬çᩇžÇ5KôuÛ ëH3âSÖÈN “ãé*cE«2™gl†ÁÌœ|ºþ"7ž†c}3nrÏ‘w‚ªäŸOlª÷g«8ò8n|ç,¡7ð1Å•E†¸?f_Yðÿ›𠤣„óê©ñxUÃö4£Ÿ¾/‰Í‚#ă“ý WÎÔ«®`yæ÷¯¹G­ê)ç%ëw• ¸ò£yZÃÕú\°ò u }Ô® œxk\w&cœN^鸉YñÏN5ÃŒÑ"Îü‰cÞ|Âz†¹Ñy‚ØçׯPGù€“ 8Ç4/`SÓ¬êÒÐ_Ò'ÀÍω÷æüÙjßûE¼„‡Fˆ÷|Õ‹bžyüÊ‘ ~½«ãmy Tñà¸û›¢ÎýÌš“Gƶ!b’ºa›ã?zÉI ¾»âGJÞæÑ™b»ÛÏæ-<òÎÜ“~ÙmOª8{Ãü~_ƒò—V~¶_ªçÿÐ3'g*Ì… t¡í'©uT\-ú†â®šâº=ýχNò³¤[ÒXäÉI?7Ü"ôX¨;Vü@ÄCWÛÝ;^gíOŽ—â8”þNçbâ¡^/nnÙ%®ÿåÿãm8S­—?±[|ÿGÄ}Ÿ9OäÅê.Ž÷ˆÿÜsR g œ2¾VCüž;ö‰óyj‡¸͉}g¡øþöŽ"ÿÓM噯þø:ýýÃ’Ún}ˆZDÇ­XÔZÜ¿îì¹|b±ø½7=+æõM¤Ãóìýù'ÏëÖ©¢Ntï!‡¿úK•g<õ#ñœÊ¿O>'~÷Î&j>iCkq=׿ûÞÊb»u Åño¡þÐO,,Þ¿íjþéÉãâ|œ£âcvˆÆ/Øõ¶Š'¸¶¹xž‚WøÆ§úë Š[6ëý¹p;Cœdª/aË]êùìê¡^ÇƉ뵲¿xþ1ÞaýÜôcà¼i¡aA5•L]?ù³¥ãrµ!RˆÞïÊnùç¾UEªÞ †“ßxãk¶]³bÁqù; 6öýh¦¥ï$¾sƒŠº¬®˜o¯þ0+<ì%擨õ…Anù¬Œ®CY÷¿øBqý6Õó¼›d§_ð ƒß²Á ¢êªcå}^x^üZ.è£è¼jGßO,xÅ+b«ó¡vnûÒÿdz¥1óK¡^Õ´WÕupY=á眧ף ·»c¡¨÷6äÅÛORöMÚü¹W—¼KC¾î¾&z~Çêc©æ31€æÕF¬~eâ9_ç¨:)ïŽ_üÎõ·ªóùÄ'Åq[0 Z°Qɧк‡Q T?§€ü„ß÷¥}¼|A8^¿{µu+àxNqÒܼÁÂ躚44¥õûÁ7_(K½_ ŽªyV´2àXÏ!Ü(ák°øé·vާ ±è'~õMæ·«^¶}pý6ýû|ÈðÞ>ÐSŸNþOÓtêœÙ6/_ïs2n—}Åmã  Õ,:áöËÿ(Ö‘{E|YIúnëe°Ïq»=t¼+¾-æÙùsE¼VÚOÄ‹4‘óó–yfÛøÆß7z¾ŸV=/s~¬ž×õ`ú°ñp˜¾&q76=\Ù*ÏP3^½õó…3ÔëêñRWEë(n)âú¹w«ñl õ{gõVÜtŸr=8~C)ÏÖ[ŸÇ ·£õœ÷QE®ç¹£L×׸Æõf¥aª›Ž_RÃYѺèÒLzR8ƒæõÇÄ”Ž%zÞq¸ý¤‹õýiÙ¼…nÑqÄ{…}É/z[ä[&TÌ[dœÏÄo‰ù¶%ù;ãH'B¾}©ïÆmõç}T}.Ã:Y-·ùͲ۟ óz‹xâ0å]w]­á¨óê|ü&b^øøŒï[Ä‹ßÑ8zÚî"/ÒYÕŸˆ[‡w>¯­ª^.Ruàƒh>["ô‡}žÎfR'¤Nœ¾Šñnï·ñ÷\v«^ÇÞO0áHÂñõT2tXnݣĵÆüìäh¾9&Eë‘àl‘¸A>ÑÉùæK¶ît5\‡Ï£ñ羆º”ÇIˆk’fÊOawÍè¼.á¤^¾õ8l~ôz‡ûísËÏp½ ›n³ÍpZqŸYþ §‹~$Xý‚S<&u°ùÛnøÛú‰y!âôþ´ŽÜò¸ÈUfùŽÓ_Wõ¹©¿{¶û=£±Êë‘u1ÓöÏœPïWðCÇûL¸ôï·ÄuÚxµÆñ8þÍ„Ë-Òî««îGõp¬¹/U½ ®ÃòA÷¤uÏó1ðƒÊ«¡²§îX}"t`ü÷¾/ÆÃq~9[2¶'¬`¿A—±[·*1^Ó®sÝxƒÃôùMãö5£×Al{GÍ£wÖ¿Ïò}ÃâhÜ0Ï“Äå¸Ö3Žß=Þ~q ›îëEõìèb„z©5I÷`?á .i®>O7ÏëT÷d:Œ˜s‡'vÛ/„¿»ù5•|LäMLº/sº>¾–<¹”ÿ=ƒp}v¨ïÅ-Åý)‘Æû)†Ÿ7·èQM;k³¸¾;Æ4¬¹ QÞ:Œ“Æ_ëGÏ{[Å5¦ø}ÉšTã=äQÿ-Çú!º÷RëMòü?ÁuyÑàgN:R·"ñ﨟ºBð«Üä÷Q‡ñtYQö“ÊØ¯–ŸÉT§5nßWåÿaäžxº4 õ|êw‘”Gkª»z3ŸbÓûAsÂm.øžŸ¿1âKuýê÷;1;ºï$®ý£Ègíó{åûò‡ðuEïÜüS¢ž_aVaVaVaVaVÍÆgAcﯫªÏûˆ¾:è+ôå1üs=_àÖÏE|çF5ï½U­³à Ò×Ýr£È¬yI¯hè'€&”mEõíõWª|R ‰Ì§JÞ¨éûpœ5ÜúpðØòâò‡×ü2+ý4¹Ž:Z{îÏê×!>hé{ú< ×I²èV¢=ᆠüêGëõc’ª—ê)°ºš+>8há=9HÔŸêgG·ßüò%%¿,ós–¾o²4ÿÜÔÇã>È©ŽYÚ¼S¾úÉþƒòÿ¸z¢‰Ï£i:ý-Јê¯ù ÷4­‹x?¯WñÔ¦<\\“¼4ÉC”8<ÞiùpíüÏù¸¨Äë¸øúÑóM­OÕYŒñÃÏûDçU³eÑ̯щðN_QÝ ž§®ò€h½Ni¶>¦Æý2ôíY¿òª¹Ñ—ŒkhFº5ýps¸ÃÓ,zÚ‰tX½>RŸ$Ü®£ÞÓæ.úó"œ>?Fp$º'u¡‚wØ|ÊðF¡îËGìsÎþ¾?~ßKö+x\L#ÜþÇl÷̧Å<Ö”ð!­UK£÷_LþÑâê¿é^¸FÔuë„yó³ºnc»è›ë‹Û–}<ã®(Ö¯?Kö >Õ¢ên:ûÛ+Ç‘}tmïm¸5ÂÏNcóï¼gÀý£‡Ê» ׫ö÷‹x¯¹e~ù›'hÐ;Ë–aµpplõ÷Œýnù½xoÇÒ{^Àpä3­CÙB}Ÿ9~Þf6m 'Îp¡®ü¤iÑ÷¡y2|9×ÇPñð•šW+ðÔE/Ö¯ç(PçW®w’±}×#Òxü½•ýE&¨úg¸Œéëͺm„±ÔÇa¦Š/ÊàÝTaçÝ‘}ŸeýêWÿ&áŸõÄñ€Hý»Œqï'\Ó½¿DÆÆó%~ G®Dþ@[ƒŽ}ïª?›±ÿÀq §mø=%B×ɤ3/ ôy…lYØO<Çý-çS5¼:ˆ¼FlÏóöý®/ôñÆ¢‹‰‡fÀÙ“¾™é¹ >´ä‹ûÜ­[Ù'š·™-“~¶ëö8³£Sü€[£óÞÁÑÜêc••…¼Êú†zÌ Ñ7AâmQzw¢y ì¹s¢à‡¯9ìä—˜øëç»öªxýߺ¸åé\-ìÃ5GÏ ·£:&}(üÿ³ÅýÞ"ý±þñp³X2RäJV¨øbÇ<£<¾ïqÓ6ô™á†ãìoÀ•}Ôº_ž¡~Z•â³iäGnî÷_ßQåiÍX•N‰R±0›òwÙ2|»Îà8ó"Ö#úû-ëô~ØÛj=žyÆÃéðû9nÛy?GÞty·àˆ!ž!¾+úˆ8CUÿã 0ê7‘ó”¬[¥ÿ ÊÆpú.‘7ô±î?÷ §¸IÆòÎK¶î_ò¶W=^öIrÝÞ8Îô3ýŽ[úDVâ “^««a‚ÞÿDÒq¶á&>ês/õÝ]·Géÿ¨ÿŸ.êRÁñd*ýî„} 1k†ˆã¥¿?ô=7ü›AwÎxœš,7šò25 8¦?Së’Méïµ;Üt3™.†ÖÙ‡˜Ø*–?ŠÕj¾LêX÷;³S*ë•õ85)¿òOG^Y_„+{¥Ó×ý+7ˆ‹÷‡êWX öËFÃtpI(yNø‰W OTÄÎÖ¢ž}£ÊkÅúÅѸÃÍ+Ž‹Êê}³ÕmqÅý{UÇñ¹lËê–úª«ßcxŸ6 Bñ ÚéóÚX8V<Rß¼Í[üúìÕÿÎ \‰cR/8W†eêu›L8¢†*ž{ÙÂéà™wÜ]*âRÏ8½£õòL&uð­ãôpæÝÚ÷½Ôº¤¯¿i<[ Å:Ïxéh熓ÂÊ«ŽáÚ³ÕûuV4ÿÕ¢ŸO¬~PäQ>wÌ‹ýE½îRo4üÿw¼1ÓëÃæèx9ã<»‰ú5ïŸí¼ÿu÷•iü™Ï¸õYÈð1[ ·þ\L=¨‰ƒµu>^O5™­Žë|µÜæÞ×?º\ômº}“º~ß98:ßbÁ `be7Șy.´3è[æ1=BÏ>¿6ž„q?GþJ¸½#®+c?ªO£‰Ûz‡>ÉæW\°Óí¼ÒÊ—J=²:Žý JÆÇÒ¹ÁÜA‰üzÌd|ž[Š£ó4kþKÔíÇÕ£~Gy¢.V,ðëèA¸-Ǹ Õ·`Y§±ý91?‘î3¶nˆîTÙ‚/»À°þ¼Ï®ôë.&!}«¯[Ý.c¿wúáX}î†Èë6’ágŠÙº-óM xßêÑó FäFwË׸(Çs]y¬yi4J†w@Câ’'6lÒû¡„+Å”KDRdЕYWÅÍû•þ¸ Øï=}_p†Š²×õyIm¼žã´ô½Ò6ìšè†˜ÛOÄGõ˜ßÚŽpó ó.¬{®V¾=Vs<ÿöÉô=‘†1SÓÉ¿™-ìÓŒâý¦„;N=Xö“1¾s–ûaâ7Å|Q?zECÞr‡l}²Ãí q<Ï“$5Éc dz7Õõ×û|Hß½‰g¸ßàǦSÏ ¾dÏ×fÑ(ÕdýÙÀ›_6Ä-~ù’]_<ïU/âë'ú{Ö_[&ôï»zâ“©Î"ã?´sÃíùâìâ6Þ©Ö&ûõ£Ê–¡­Áï[ÙQÍwJþí[ì¹j¯^g\‘§ÖíYÝÀÔ—ÝdFÞÏ–‰â$©KiúI´›#îšéãüšç7úµžô†Äu[t¾½WCòŧ?Õ ÿ»è¤gŒkxºv–篙c}á?®Róû_¯Wý¤±öG"¹èVÇŸ¡âÌxŠpÿa~yylí æÝß³8ó‚?“n»ãïØtžÏìÍÎùÏf©ÿ åñPò3¯çLæÛ}y"òÁ¤oeð‚Ñþ¸Iÿ=ãxk ~,æëñÏéÇ“ø¶óÿKŸ]ýš¨Ótµ’VþÊo±õ íº-qÓèõsZGyÎU?<®a¹ÁïÜV+ψɂ—;êª}/„}ż”Çâ³î%Z¿Õf²¿žóöÌ_AgªË“G¿'ÁaÂ×R×It&¿j’ø<ÍòЛ:èý˜~L§k¿þ¹Åú¡âú]p³Š[Yì¶®ǘ^<ë3a2\PMŸw«“Rÿɘýó\ ·ÕUuMóÌê©òfPÖݯŸ¯Ö}äû,Qq˜ Ýøtk™_¹Žb}Ëö¤_€&Ñï Ï·ϯ´©Þ/I)ÿïj, ¼åöœÏýœá}vŠxi⇱þêX úûâœB7¼ù™&=&x¯¼Ýºq~úL½üú¬8Ûñ†H?ÇÔgs—iÍ×Ðü¿I—ÀOo[ØwÛ¢Ûpª.œ&Þ‹Vêç\O•üâ"?#-CÎ þ”#ÿÓôyŒWõ½Ð¾4µs>9^MKrÁJ7?;ß2NUæ·Ìþ(ž^êîeó> cô’…j¾à—Lï‘~J:875ü[J8þp¼„}zQ-Þþ˜¼I¿îÍÚ+þÞˆó³Õ‡n\ ¿ž1΢Õ7àsÑ%·8+cŸûEÓõyÊ…&ãU¶ò‹Ÿy}íÿ ýâ ë#âàYBM õÆe=D]þÒ_«ù¯)¤7÷¸øÞ×_j¬§‚ƒª†é*> g À׃Cg¦z†%¿zMûXü Þ÷[î‹ÖýšŸ¯ïzòÆÛF«qóÝË…ÿûÐÏ8y½çtqÎÎâ¾o£úÅ·_<é bVo7ܹ¥dÆy5Žg‡’ùsÆóYþ¥>/ÕA?_d!üÎÒã@¾4𠆉ˆ†T¿£<†oŸl›¡J<¿Áµî|nÉ÷v¢< ñì0O4ÁÅâ=¦ùXö´ñžƒ}´ý¬WM¸Öà+†—jD¸kÆ»ÎØnéž?X]w&©yC›þ$Š©Žcˆ{‚c,nZÔ\w1àÅÂýªGÏgÁÛny[,¼Nÿ|s‰I·»‘ÞoË–Ngð½¯êkÞø5yäGô¡y¾[ÖÕƒÏÈߨfñ›æ|âæ;æŸ0æz©…Á?oCë¼…÷‡V¤§•GgŠÂ3:«õÖàcCÀËüY²V%ßÓ3â‘ñ.ªæažÿ0àdx¾Åx<6Ký„Œñx< –Ç+¦¼ƒ×ò`1<¾#Ï3<ŽìÏÔÓðÜ× ï‰_ìeþó»3ê¹”4âeˆÿÌûûÇØóÝZ\Ÿà¸~¾ÄÖq~,O~?Vôµ‘óEØß¡#å=(ï ç9¬}\¼—ýÜðnhMû[âAÙW½õyÒ¸†óüt•Âý±ù`u5ÏÕå}}¦Ÿš÷DCšÇ H/ÄP/Fÿšn׳ÿsâoLÊà Š'Šï ÅBG Ûþª¾ïÃÂy½A¥J~Ýãé’åÊ0àJñœ}ià{t-›Rq»naˆéL` Å1ûÏo“ààên~ýµ_æ´— •±#ŽÔù¸†¾c&½4Mö¾ºê:‡Ç;÷#uÞdugßþ‚Æã,-òÛ¾ÅG®8‡KÞ¸‚ɤ³wñwüpcTׯˆµ~úŽ,>D}¯ucùQÊoûê¶»®½Mƒ‹ ù¬ñü³Ÿ:o ð›Yßjã~ëÕþ\¸àµx¸¯©¢y!èeØŸpŽ<ÏiâÁçÊpÑXáÏT¡xú ­¤'ÿÏØ¯HèÅ`Ãl}=õ—z¿3öyöÜ›Õëd;ß §™s"ÇC¾Aß`í»â9*6äßoºGÄÝ<¿J~ò ñb'7¼¦þ]­t¨.Öå˜x+9ocÁj¯uí(_Ú‚ò7kžu#®±±µz¾Lï0<꓃)ôž^ØAø·}.ü—÷ ë¡e}6ÝǸ†™[³R·F~týĤŽÞ¿fâ‘9æÍvv×?—ÍžÃѲoÉ—úøu¿[Iê8¯Zny‰ÜLùP“ኟF×öEëwùÆ)Ùæ›—µeô¯¾z¶ž?ÑÜ0ï ~B¿èã Fnâf,<Óm½èCyuòxŸ%´auåº~ÏAØß½-­oUþuœ¸nxðe£k†â—rÂß1éys:é 4!<…-/vÁµÂ:W䓯›.îÿqq½Óί†ÇÍçÃÙ‹Õ|B#ý|Œ¥[ÅѶëâÈ ãz¼ õ_ >LÄýàhvû}¢ÏlQžs¥ßP/Ì ­¯yÝÐI­§Éy׆Ÿ ·—¸bU‡ €hÔeõÈb‘ÿBU^ÿ$ýæ÷s=n_Ý æýzVûéÄo©úS\ÇsÍd‘‡QC¼ÇÅñpšŸ%ï[‡QïÇÓØ)ºoAcÂO×ó«¢Y:øOtuQ䳺};ÖGèšÿ¸póEb^5àBÂí sç£ûàx|Ä;çb×j½_´ö‘çÚr‘š/oEx’ÔqºÎPóW¶8­ »×\*žÿeûÕ<£¥®âUAü. —ü­?JAJz7žóL¸ßOüŽoÊgËBþÄd{Àöiñòƒ-Üð‘÷‚Óçªø¯cF4ßTöÅœ?©º~ü‰´„øGïEÇw¸³½úÿª?êý­IíÕ¼ý ¡W„–ÙÑCÅ¡âÐÖ[à!ºR_‡¦”ÏX{šê/v¦û[ Ž'uæ°”ñ¶/þÂ% ¿eÅ2eþÁm¥ªÙ†K‰z±Ÿ¾úumÄß®œM[†c§lõœÑ5z~|NçñòÝò’ç:n8~;öÿ•ßÐÏçK_ó~§xÏ-Ëú4ùЬæ$—¬ùÜ„ºC‰ÏGê-–Ññ›ÿ¸>jÆö…}a%üÖûÅû½òSu^–ñÀ½Þ§Ô±G7Â9Ⱦ?kñÞ´îbËÔºú'Ñõ %]ƒ©ó^Ýòÿ‚å;Ö¾ï|õëÓ•ç:Í‹¨œnþ UÒ]Ÿ1{·Š®cÐ}šp·š×xy† >ï5×åKí|7+ž ÷7èb„ßÏ­ì7/­Üã†÷øWµþQú€È.Y¤Í_óyÃ×$Áº]=·û$qZÎúÚ—7ëÔÝâŽÂÿÈ€+ë§âþMý ¤^køÿ ý­À@†è?;':®XOäL<ëZøÚ#nøòžz?Ýù×.Öc´`|Šǵ~äcK3?ÃJnñ*j{ÆG¦coÙäǃ¯ ¼èUÑ~vZý”­ú!Œ¿ƒñŽú€×~,òÕÇ¿þ^ª|&_3­Û¦þw6ÃÒñü«/X^mù%"ß·Ò-åx¶à¨%´íg©äÐÿ›NyWý™lºW<Ô·è 9æ±ÐØàçô²Ü—Å—Ðûk¾zKiúfwݰáѹ¡’_œèë—G º(í'jáéÈ~d®Çó5tróÿ1jL:ú‰¤«Šª,_׌øjÇ,yàA‚§Æë¤Ø8>Yþy,ñ={ÄÓAQ¼¼°Ì'¢dt¬ü[ÆyÔgúh1y`Æñ©¿™k_0ïñ×/ÖwG<¨ ?ßGïOÅÕeIËâöY ÷DñùüÓví3¾núkáö+÷èØGõYÞµ—_^=.…Ñy\›ß·êò_›îqö¨)âþ~™®NExœ¢Rýç­ w3à!5¸µ¶þ|óY~ó=V_óãXóÔ‰5éÁ`ùÂDy_´3ÄÑóâé~…û71ès73ä÷Ž$óKÃñI/Wо˜&}ÎoA# ^~ÜJíºŽÙG+õ*3¾¿²£>ÍŽ‡³ £y(ýÆëóŽìwØðW¾†ê~~VŠúsðiL|¸£n|å×WÈP”ñ‹iÛï}¯ôŠgP/þAcuãzúÞã ›šŠ_à—Ø,äûxiÈgù® ¾g­›^`\C‡txÎÇk•ìx¼ßŽuûŸ§Ãw2üTÁ¡StÝÑy\î_Ý0X䓹.Õ»0ý?T\ܧ„ƒ´ô×v>zO°fa,ü¾¶DàBŸ¸VÄ¥‹š©ßlªŸ×$Ï`†[ÜbÃç}nSÎ8èÒÿVñžíY}mŒª£ˆ»F‹ëÐT]ùúŠ©WEÆÙá~²Òw«¼+Gý°lºEçÃíª’Îе¥Ã/$Ü`ðOƺbg:ñ;ñ1P)¦~ çÕ¿˧yÅÁ1Ò)=7¡»b~*~i8^uæ÷5öÄ+7sÔÕ™ŸÀÁõ ¾uõyzLê'âèå Ôl>]¼×]Ô¼f.Ð×¹¶ÔŒ®‡ÌyA?ŽÔx“š |Y]Cܲ~Ÿ«ñ> ÜPL¼Í«~!¶ÿ”Ń„ÿiÏ œ~ýxñ³¯aqK=ž~´ª—„éð.“Ö›| ÍtŠ;Lº²Öñ¯î/ÏQ;]ý±pÜ)ÝôïÇ£ÍÛ®Ït¤õ¥8:oÔ‚ÑyzÞÇ›ì÷ø8﯉âbî—uÈWNóíØ¢¸‡Ê‰™êp6“xÌlœ“rœyë½âXÙŸK/Ñã ‹Ôø[Rq„£ýAl­Îß´aêÜè>:ƒH'~Qý÷í£ó$ç¼³/ckÂ׿á–_ãz8‹ôîé â$éW­þ‰¨Ÿó?Â?è«ÏO…ãLùÜÿ•Z7[{‚pÏLßb¿_þÀÆwŒk˜×>Òä}ŒÂýfYpžXZ:œ2obÝÎñxÒO±ÅO¡®óŠÏÅßK„^K°ÅßT§áxû`/½Ï›îHkÃá„Ûu&}1ÊËþ$ÎÇév›Þ/îàÖG—]­âði1õ?ð5L>¤ê’tPŸCœFõíG¿Wýä}1Ïé½Âl½®Žì£ÆõR0â{ ¿Úfy›÷-y¿5C³‚ïF3 ž¨€=ßžº ¶>Þ\OSöMÉgþr?±Ž7j¸ú>_Ú]¼·ãHÿâŠ[£ñi‹æŸœd`S(\o /í:_¯ð˜¤ûŒ¹¿UuÉ ~]ðóÿè9KŠsv5Œ~Y½¿Ä»IŠçJ|^ô<à„!OßÂo]ÃE"!dâ…¥m¡nï¢_ëyX…½›ÓÅï–~’íx²¯iÆç] ý¹~«Ÿë6Øô:¥þ‚õ¼jEçULxN”ÎVýä<–OÚ¨ê>`¾x‘Љô9P=Žñ|CÝŒ’¶"OÔ„pø5 <½ /WóUÒ}ù›ô_‹¿¤ëóõ|[L¹.žß]Û¢ƒ‘¿îj¡Õ-Ù8¸à)ýõŸÝüº3Ý5KØÄÇ[ñ#5>¹v¬ð‡J?ÕçO/Ñësat=Õ¯šü)éQVÕ¯o&ÊÄöê¼oȃJãz€\ÕX?ímàÝN4|N:r2¿ÇëhIïóök¢ù6Sïù’Z¤S²l«ŠgxÅpke1Oäg'ïˆqßJ¤?ÀëÔß=’*? ‰U‡—ýñdŸKãvíD¼c¿„Ûå3ÿÊ™jýiÈ8áO¥Ä?’ì7ø'‡)ïIúkœoŠÞ¤S4LÔé°6&>{ ËûŸ)ü8t¦zÇ5kÄ:¶cb*ùW\ò€wkûx¸•N{£ó`k¦«z)å)ÐJŸG1é znÖÏòb!¢s{·<ÓÍ”ýâøv¨gÁ}ÆÌ;†ãÏj­ÏFõ¯ñ/GÎÓ6|sRãý.ƒ– ¯Œä]Ï@5·<æN×ã+›ÄÄážÿ¨˜çZ:ê°ÔŽw_‚w=×óæìþH<ÇæFÉðN9òM§ŽÓæiÂ~í·ëç§þLwü9VëcÀ=Ï[§Ö)¦ÞÇô¥¾£õÿ‚¯(_Ù–þ^Ò-Þ„i~Gåm-ý>“šäEaÌ”Tü9#/þ"1¯ÚðióQÊÊ0±E¢¾¾fÊÃeý¸Ÿ`Ógb½Hy¿Ë.Uý² H/æâ›îøÓR?ï u|´¡u¹Ṗ!^©õ¹Øü+Wz+éŽß'ü´ž„Ϲþf·¬î¢Ž_LùŠõ?Ç!}aþ;1XèG£Ûkz¼;ñc0ḗ‹•Šu©€ÞÃuޏµ57ëù¬Ô:a¨ËÚõ! \s8ß7§üÏ-Ÿëù ë®8¦ ÍÕüÒM¿…Óˆ·¶¹êçïü¾ˆË¯ý§¸_7>¥Æ)7?"î×E“½ê‹&½;“ñ|!¶6ŽîƒZÒKŸ÷2õc«¡úk‹T½Ï±¯¤¢#$yÖí¨Ï—¬O›ü= WuyP\*þ²÷ǰYRü˜IïAÆÃÃH<ÞÂù=Ý|¤#v,Ý~­áøÎÐã)ÖwòãÅS/œeÀÍ0ݵùõ!Éw¬ïæQÞêEo~è§©â¡Pœþšì‡iÒoæ¿0Oü]þ;QWèã7Oñu=ØKãN \ý¹†ý¨Z΀A§*<Ïɳô}Lú£×<)üŠš4ï¿kÑÿÙÑ+§ýsLfêÓÇyÒß;ê…Û3¼ÆSÜSËmT&\lj„:ÉÝïOg¦8°«ï¡ãõß%ž»%=ÄúV×Pç›øçdº|Ó®ÑûÃÓõ—ŒÇonX¯»ºåÅmÆñÇ!ç³ý_7ôµøÓ«îÒ~ìs«ãð¾ï².|å–ïæódˆaº@g¢z®|T¼‡»î‹<¯ ~ÆÂÇD¢_tŸ†pûyź¶üLK0ª«7¥yÍ ‡`=ÞÁËâ|Œ¶¬? ¾(Ü®£Ôë1ä5Ð’_Ä”zzƒ#?ÍHïj/ý_›üœ†<~'Ï>w,/J)ñ‹k©ï%Î`x±•Mãé’p}çé%âïu—‹x¢-åYëꎗÏyµz}©‡머Y!oÔ6= ›?Ÿ±ýê%©æ»±õˆðû®™¥âyÿÏÞj~%“Ej¸š5Õ¿Púªø{µ¾ÀµƒN¾¿&~DZIþ®ôë0ZàÞ±³¥z^M’ÅXüXù\ñUNðº–Ìpš^‡„ã°Çk`À•ÏTõž%^2üþŒèþI Å”/h`àµ$qŸµéÔ?cò^Ãó©ÅêñÜ—qœùKâq {]øE,žâ¸bnr¶ŽŸ—WÚÔ ôáËH7üÜpýmú &ã~ƒs_rYWÃ]êþ’G¹ð/|UpÂ𻞇Ӓº¡¨Gu@Â/Éú+ªXöw|.Q]?CÞ%[† CÔzårµ.-ý^ôÔïæ›Æ¨õ$`¤Ö/—}TPú~>ì,êÝ6^çýÄ5Ô§úßì<‰×%uP3·:áùµ5ø›Îñz®1ñÜœæ °û§j~ùÒ{£q¼³_Ñóž,ºÌ(¦8h¸ÐÑtå9ÚLòÓeþKòØï¢¯#Ö“çEóÅÑëZ2Ü磻'ú±#o–êÇX>\Ô‹v Pñ„SE]CÝ3ßr};²u¯[óÈõ#(®Óó u$u‚n¦#ùóžëþ<|Üs¿mé°DóŠ<ã¹Ùj¿dl¨¦þçUñtßç|#«ø¹ð8] õ¡fº­§'ë`áŸK×Gë˜â‡§Ï8é—”Þ!æ™bÁ9/DÆsqûD {©~<‹ÿŒ&,Þ«~3Æ=ÆðÑ<®3ŽB±=òu†»Ñ¼µë1Ïî£y¼.Í·}õþ–OPyçÐ<+ó©Mh=ßý~!ŸôçÖ^*Žc„>ºïüVgå·>™póÞçuF½TƉ}üZ†ør½G yÚMt=·B䑿ߢÞÿ‘¿ünÛh}¬Ýo«y÷ U5\:+žj5õ›N%>Ò6l} Z?„ü‡`o´Ñ×לãÜéÛ²‚¿5áŒÛW!üÍR~q™~=D¥d<÷gú­j' L0¾^*t.æ‹æ)Þó?b¾LùšBâ=ÆÄ-/—MÓ¿päÇûjÐzô¡_ž µâÍó²ït&j±>Äù„שDÏc1ÓU¼i¨ˆÏ¯¨+p{ÄçÁçl½oDù¥I3Ýò—¯Ôú§8K}1êmuÞ&úyâ2u>ÇâÑâ:o3ào6¿ þ®5×P=ám}žèå%®~‡ÔaóßüD¿>m_í´N`‘^çÓE½—ž-Ž3]ÅycskáW¸Žpèb¾“}h1:®í(¿1!~ãoÐß×ÚÄO2ô‰—zÏ|B‘8³éñYÏëR½¹«þD®-[z ØÖ,Vž ’šæ£Òªùû”ô9±õ Šs_ü+ívá:lÃGpóËl÷-Ìçé'ñËÀ÷üôæ ×Í/¸æå} Û¿æÇw þ%¯[`Æs"þëA÷ç<=o7Üþú¦ú{°l]d]۸ߤžês·»ŽÀ l9;Vü`Ì7mPñ#¦¾®è7XÏ/l®žƒý8²òh\§»Ââ.Ú«ý<اÆèÅæ£åªÿàšÇ7¦ž$A[²~œhÈŽÛ–á÷»á ¸?žq]ÈÏ?Cø÷˜¶W|>çÙÈñ1ô„×|€n3bÕÓ2 îsƒš’Wp~^}`Tªøôà?×»u5ôËñB·¾¡ØðݬèNJã~‡ìGo<Ÿ9Ô¸´Dí§ÖÉüB¬ií—½*ýŒúu´²#Ÿå5ƒWèy«IñÏÎ1ìÓç7Ó6¬^©Öá;ôk¶þRχØÃ¶“:[ûÔº ŠX‰ÉòßX(â®_·og8n+–ßœÓ&§ø)™‡³m‡­ýÜüG9.é3K=ðûÕóÅ<ÁÁPæO޾OØöǬÖÑ•é_´×óÐ\ëX)ð‹˜rVd>†ãÅÂþiyŽóf½dº:¼¿ ÚR}Æq¾Í•I¯²>WÃsSÑ•@?Ü6ÎLGW0cÜÕêqX :÷ tüDS~kwnãù6KY³Œt˜¤¡½š¯EgYç)[ó¤†1"Î7éÁ¸ï›ëêGçÚ\ýápûýéê\`Ë»‘yÞ_!®N f4UynLχëáŠ^Ñýšüé•OŒóN˜×ÏÃíÚøÏ&EãG¦ßžÓuÐU§­Xý±ãïŸY´ÞµÄ_ýP¢ß¥ºH›xu7 Të°Xóúxõæ§ô¯’J|Œu¬vz}6Ž'ÄP½¿e[—dÞz>ƒ>ׯ-,¸Æ/ËV'[†Í;Eü{“4 ‹!ÏÀòÊÒOǸ͑óVø„ê~~}¿¢Œí¶¿Ÿ“ùg­Vò3Ÿü—Ç¿rw™â Ð)ŽÃ¤;aÓ1Ž·GïO™ðޏjANôzrehë‡çB?ÁCÇ…¤£ù„xîß ÿñŽu©+Õüz æŸ|ýü$í“•+“ë¨ëöÔíÃüÙ¬›Ôüäˆ*:‘ÿú|£×zÎ?õó[ßdx~Gý_×þ^¨ÁòÕUù9–zFð)õÇìæ§ûâQQléoó†ëH~†<}~y–ýJæŠzS¾MoÊ2ÎZ7#Éû’:áçÓs›Í8¯fTwý™6“q¾íë8o°ãÜ9MÕMö¬ËfœwSzž ˆ˜n­¼fÌ÷{ÿäßÛž~¼èy¿uŠ»$^Û„ŸÃ¤;Ež»#¢Cnw0%=–FŽóãkaî2Q¾4ßÿ·€ô@‡Dã3°x£vþöÅÄÕ¹ð5ÌêŸjÞ K.W×ç]Gô<²ï®{êdžƒå祾nXã·®·fúÙ—öHGˆ§ÒÐÀ‹*Öã®Ãïkêëjæ/òˆ?׋p哊üâ¸Ñ?qË·œ·JŒßã }¼!qíË…Þ6¦=™¬.3f Êãî/ô<Òꛉ]ç«:þ7MqÓ)}GðÖ ýÐN5û¿†# ¿ÓRÿEuƒ.ØÀ§R©/¡6áJR=¸¾áxc’‰Æ©cѹ»|…àµýìßÔâÝ ýœ€ÿŠÇSØ52ò¹3å!¼Ó‰ñŸ.8 ôÅ6ÔˆåO£›‚†~óz²þ¬Ž}ìeïð¹¦ù1ø{t<ˆ6é¼÷hG¼«ÏÕu‹ãá“ò¡QÒ\ëæfþÅTA(ÃüN*¾©Qºqn]¦Æó½ yö7êpµ£x¨¡_^(ì‡3ˆx¬Uôu¦Pjë"ýùK}ž>+#Ïûà‡â=¯W¿4<Ÿ+G>¿Á¸#Ž'ûýT2ô7tÄ/…Û—Þ0ÇïÇ5äùéÊH=Ûpÿê ¯8ß×x…ê{Ãbò|G}=^ûîKe~–ù_ôg:žGØñ.é«ç{~éØWpém× ú½¾˜ñ®ŠY^öütúÑØòëR§(ü?f\ާ¿Ç CX¾aó?©ìQß*òÏ’?ƒÇ…éµÕqfõy É7g}ð5µ/˜ôC}*Ò²~~z Û_Ô5/îWÌòÚ%ÕÄs5ò¯Ñycâ}bú•—sHÌ“ÁA·y­é} êØ  ú¹Ä†ëÿùˆ§>T5KýÆÔw{¥a{K=Èx ¿†1u£u-vSëY¦ø`XxÑË¢?ºP_÷7ôéàÆó^¼?«q?ƒ?êÄ3þ˜M—*Ü΢ãk¸~—ŸQ“ò#_?wîÉyá†s~õ}ËóZ™ãÒ™ÇÂñ^3ð™ }4m†I÷”I¾Õ=ujÖ¼”S¼6~UÜ r“ 8êÇH\‡äßWr{ϱâ:Ÿ™ŸGºùiéçgŒßÝo{_žG¸õë´ñ3džÚw|i¸˜ñÊŠ×ÅzîqM®™&ê‹çŽõ¨kúå„w—q>“W$‹ó“ánmy/T5ôèQê6þ/ãÅ_²o¬sóõÝ£ùļ_1*ýWn¼¿%~âÖ‡öJêc°¤j4kŸE×±3éP˾ž§uRûjô}LýθÈû“­C~z o—éÅbÓë~ùO¿[z ?䪇±8ÍÔóEßš"ÞOæÅŸs;Nóx<~] ·”èõçÎ)Rÿ/¹PÕ5Ù=š×LüŠ´ýÆòfX³[Í ³¼1¶¯Öóý›Q集‹÷h£ŒáÒïŠõ£)gÁ{fŒKë–/ÍŠÎN®,8L×gñ_Nþ/q‚˜p·ï“~’i@UƳi—,oj3,¼\ä7ˆï‡•#Åyo-RãÑ¢½~y„‰ÅsÂøíR§#îûÏãü²eá‰K]½I¬ õ¸þp»-[TÞåÉqãÕÑþ£—ü“½×¤g~mXë< u¦,ñ21óÞTžsô3_s|ÜùBhýÆÞ¤úÞ~ÖŸ«a<Þ#&?Ý/Þ/•ÔP'K÷ug ò°G³¼Þb½~›ßFócpÜ ÁtyŠÄßóÔó >>訟ç0¬UtÿèÓïd:›-DÞ·˯_¸'+üØ´ -¢ãW L‡ÿ×ÐMÜ'꘹©öõ‘ù·ŒãÜz~*u9bÛ/ôz|÷ž-âðK&ʯH=wWÉ+A‘·z÷ç®;Gõ›/MÖÊdè@¸‚Õ?ˆ‡—mí—µ¡vtýXò¯Œß÷*ò>K/QóÔÓ®sÓó6ÅcÍYÞ¹=GÞ4zëçî/K|Lø}1ËüaÓû'ý(Ù7Éöû°ðOz=®=úíƒwÅïÆ‚½z\ÆÆÇôy섨âºÑw»¾î´p”ÈëTqÃkûê¿ø 4Kæñþç¹2™7sçpy^vuáf}¬êÃÞ S¦‰¼ùàèübÆxµ¨^Õ¸|é«qà ‹'ëƒ|•2ÞgÔâh½S~jÙ‹Âo) ~#žüYô­ç­5eúR²l#KžÆïÄÅ7˜Lö}É8~Ÿ‘Y‰‡l}·R?žcß#ÔK¦ƒƒ"?nRç')ÞÞ×PÜ0?!ò»Ç }:dîQ"þßÑQ™pûÁ‡,¯ÅxÐ!Ÿržd0éùâkÃñÓyCõ~{[ ¨ÐsÆiŒõ£’cŸC¼Ù?~v²¾‘Xqz4nk±8?âëºö—}‹Ïã±ë´u;ãø ßÉ×ÓóÅÇ•}I9ž'®aWCý{öÞŸwÅq‡Ût¥Q“òÏ’_¼VÕ“Ç@ÿJâ‚YŸ¸àÅ”ò4!ê¥]üêÞÆqëZÞçÚÑßsýãv¤c‰-oª×ç¸!Ñ=Ýx ®^H8/¿k¨C¼JuŠ…wŠûSÒ*™^'=wÞx•Î~ù!LÔß7´qŒ/¦utò;L¼ŽKÃ…Wˆ¼Ë”tõÖÑŠÕYK÷ëëºï2žÃäçE§þÕè÷œú¹#þSê˜xÀËNñŽäWÈ>V˜(úcÍ(‘ÿ¸îcuÞ­©¾ÁG=,¦+…;zEç› :áq=ù•ã÷/_ù:éG¡qvt2ãòsM†ö/©ùµµ+âá[ª3œq}ÿà´ —ëˆ!>Oj¦¾Áh¯À¸tù=qÍÖ¿Ñf<ïŽ;ñE¾ã•ttØÑ#]ýt\:UÌ{Mû¸TG¾öÏj>™ñº°´Pøã5ôñPZ}Êqá›N÷ ýßüöœò¾R˜ø]=þÔÖls]uýT$þºÁ\·+cÿj¿4³ôa³SïÊ:ÞœË#ýaœÅôÉïà}æÃïMÏu½dï FÜ(âˆýïmï¨ùÝç)îÍÇ0ÖOÚ ¿ÎÕÏÀ…uôqå¥,ãœaÀ-Ox:‰ËÀ¥o‹û”GyŽflüƒÑï7¦üpˆë¨L÷ÏÐ_ Ëþ,⎟î÷Ÿ¿>œõÕnIùöµÛD¾ÉpÝÃß%ùq]=t^®>Ÿïµà"Ρ>–œGì§8hÍú“çâ¸zê·|[—´#?‘p,X÷èÎü`LÙ£î7¯Vt]}NqäóŒiÉòžÙ24§¿>ê¶n´J'/mì#P—ðá “.*ݧ~*®)0b Š¯¢>ñr~°=Ϲ6‰sÃt=~›èûc×J§žîbÞ öÒ{Lù6YßÀ°oŠü4Ó›µéÏÆ5W½T×¾Û&ÃiéúËRo©~‡è+‰ÉËÄçÕY¾ÀP§Ê÷íh?½èùéRÃKÃLóP…UX…•ãº0(ùŠ›úlr}Ã/…¿=°^Vq-áùL^œ(/bêÇb²à3CüP™ü*þù⟉¸â*‘³ÕaPâó(’~‹Ç1Bøa¸a£ª·tÅéb½œ³IÝ~â‡j~µ‰[\ÊãTcý¦YÜ›4ïZ^,äéýŽüK’õ©4Fªýk$Ãù<ß#ýPOÐóÑ ýÈrm&J›oˆýd||aéDÏ-š°^3\ø­cY¿1†ÝSSÞ¿)‹ãN&+<¹àÃõüˆé—u"©o]ƒñÕ-}„Ñ9š/*ù²/*jæ¶ß ×±ºEׯÐå6¡/f¨ úö_tµà;,ÿc™ÇÓÂцÇê†3”󜩋¯™pëRç%ü¿£IòYx¿w´Öã0‡È+ûs7üîÊÉ÷ª0ÙõÀ”Ó’í¿¹¥˜7 Ž2|vŽù(i[p„p ,ßfžúêCÄý qü½,¼¦ãeÂ+Ký9Ÿß”ÄL~¦Íx_'™wM÷ìþŸãuÎÎ:×$>.n?;cûª,Q—ø­ŽúìÎÇ©dÀOµJÖG UˆÇóinó¼ÏsâñXÞUÒ½þÆãp!ž«M<¿ íãé} ˜éVKˆ¯«JïSBüC8^cGžg}–ìlðÛ-}¾ÐÂðyÂO\º):ßHq=*üJVÏ ê t6]špûÑó*¨þ¬ôk2ÎïU¿a°Zôžš_v̳ ‘E7“tNÐÕ †å«ú†[úå¤n×pË%‰pvhn^®¬Í7΋}C_`ŒTõPì|°ê=74fqÎiãõ:()ûŸ‹;§ |ªGjÜ?í¼¯a¾ËØî=Â9Ëz¤¡Kð Ó‘mš.OAê{˜úÅ¡;;~A:}:ãš33áMP™úV¶ð^›ù=¼¹I‡Ï×P$üS\‹ª¾AÜ>£Çõ£­;EtÿM<£š†ç¢HäÏÑt-y¦÷cËËeŒ[Ç-NAKÂ[ìcøûö„ÇܹJűÓ'¥‡T._úýqõÉQ…þ%«‹`šŠãò]¿1çR§ç…ëñ¤m¼_d®-xËÐ4åõSöUн?Õ¤Î~Zçe2ôK–_Ai3·ç‹t$LñB8^žï×t_ã×Pý÷ýXÞpòýÂ?:ÁÖ³ÚéÎ_qû½eÛ2xÁ‹¾/ôÌZ³õ£zvüsßü›s?Ãc–|®kŸµW˜Ÿ7§w¬÷3÷¹õg[¼NÍ3ÇÄý£ªßû‡®ž¸„|â5Mø‰Ó¼ÆñžŸàS Ÿ;aŸ:T3ð7 Õç'i?3ëyœóM•‡ÈôÅÑÖàO™­×½øUvò˜ÔQÌ­XÝmÌ9‘þ‘ÆÉú¹Ç¥<½ÌO·k—²nƒásÉM<þªv~þc[ñþ…}m*gG—#ßO5—–1‹ÖÿÁÿ…¦žñV¡çºdÀŘô ãê ¢ÈíùÁ™y¯16ºaÆ~«Ç«ÿw£x¼š¡~ñ½,áùkúÕsMûsýX¬û_‘—ëý„ˆËiž”z¬R§Nêg™ü4´\Ÿ±ú;z>Ë`êSqö³ªîœ¿þFÜ_NÇ-¢üVQŸ¯xóN\bWNnX×Gü-¤q~áXO¨³Ÿ ñXƒ£~(y˜ø¼^p*Iã ® –ñý{†y`¿Ûs‚>”ojé9/ç5ÏpÝ!Ÿ }ýæIWC5o„ÉÇÔóz;ú=Á™Ñx%\·Ng/l¬_o®VûMbç>á¿ß]WèjP¼‹‹çu”ø«¢Œã«;ÉÍÔ×WÖû⎋K…Cm·žÝ?'øÿØ{Ë;Žc T ­˜aÅh­­ùÄ`Y̸bfæZ2ŠÌ 1íà ù:7Éu8r;vì82³#Y²Åò{OU=y]§{¦gΜ•ì»õg¥Ý™ž9szº ¾ï«ƒã|LhžÑ¸]òï¯TCYóûããýsèMz~³ëç/«\?^4FߟG%û¼]ãg ÷ÉþÂꙉä=d½ÄÕ$?È;r|š8ލ¦x'‰·çk´îlœÑ÷Nñm±ñIG=q>/lùÞ2âo×vìÏbÑ»²"x¿ð^ŒY[ ?jï‹`¼«Â'㩇êï=ë´(¥µž—ÆÍÇ2Zç÷ŽskÍ‚`ÜÿPÒ÷ǬAnº¥\ß´áåÕ¾†ÎŒšÑŒpó 7'q¸ÂGEöCUÝ™yz˜5ÁŒ3µéüo{“®[Ÿý¬¾'Â_CƒyÇuzïÖ { o±ø%Ó)b!ã ýpÜ\˜ôTûŸ4ëÝ÷*ÍÏÁ¯ýL‡ÞÇ»Z›ãyÕ¯&;Ú¾Eô=Ê~µ)Ç¥›Ï<|Šuýx¾ÖàùX“ñ½x,üN2xÿ éù36Þ¦Sÿ#”OïþB¯—;ê@ùÇŸ§ŸèðIZëžÔoWz ®÷‰m5ƒu€_`ã'ª~Nè¢Ã¬ö…©zœŠëý§V5÷WéU„Ö-ÜâÆ#—8Ö­SøóÎÕõ”g§õé Š;•~5ö?¦ë,‹<5º¹åU5™/µ¸wðþÓ b^®Ž¸¯ù]ç!tP0ËÜǿχIgE騡%ëð|:Z}h"ós,ýa°ëœ^oÍûfàsÆŠ6‰Ölq¨ÿwÎ_©ü“ô»°þW±ð¶þ*Þö[·Ÿuxõ\Zë*jp(Ã’¢^NÔÃ* <³Ò ìö,ý}Ül=ŽêPÝ8ßÑ(ï+j½?,¾÷ï£H´|?®‹×gGñÇ£žgoâãz^ùU¡+$q`­ž®Ã… ÷U_ ×ûóy٢ϕìl½Ÿ;Íþ¶EÿÉ»ŒóR:[¡×í?šÞ‹U·“NÈû"Ÿ¨ö¹û_#}X¡g…BÁy•ßv5×>xþøßV »X`V`iYTß—ÕTœV`f2W]¥+°+°+°+°+°+°+°+°+°+°+°+°+°+°+°+°KÏÐ(38 ¿å¤f=R¥#ÑJ×C–º ¶¾#é:wã1joü wêz?ësu|÷ÍR_[¿žïã'—x^·”'\»Ðßò>µôS°è¯†™Â£ûúýDïwP#Y='dåŽ|T“<”âþÂ륥Ó.qÖÞ9Á§›{ÞÈÀ”’<,.J|‡ÆÌKh ˆÑOë|é›y×ù ñ?gêzn¸óÄ_<ü[7…]Íý°ZÅëƒßÐ× G½(4f=šãôyÑ×¢óþ¦EO™u=°çÑ/³T¤y‚ž‚ÏoÑMSë «®šâǦŒ¢k¬Ã»·0áõw5LKWÈwÈV¿ÛŒx¸înⵊÇ×A?½¼ë¦¯×”õ_Î…ð¶™…EEu^È’§¢Ýç YFþºò÷ʺS’·èW#b_¯±KõçÝ–õÍËp¦,Á›»ƒ¾‡¤»„¾‚³zo¼¾/[þK¿ÎÎ9f]¾=u¾ÔÂo’îZQÖ¥º óP°¬#õéfæ+§Œ?ùõci l{/êG1[Ǧ˘rüûÁ¼`ä¼éư‡ø8!:þu-ýFщ×É1¬º?oÕhÝFVft Ó5Õ÷ÊöwÙŸÍÕPRèVv%ýsl¼Î¬£Þ!¤³â늾2Øî¦Wì#øb6Ý%ïe¡ÓpÚµŸ‰¾aÓït>X?â9ÚúãÄÕÇÞ»ißf"«^ý-#h½X~šâ˜'_#¾çÊö´N6£¾hHñ Öþ^ÿ¿;õÿ 0>R:ŒØñ¿éõ™Í½‘ü¼Ó꯮úEøÿ.¸¯ŒuœçõyU÷}îMKã¤?ïÎñú:%e˜Û+X/µéš`~ãØãÑôI§­Ëˆþš«)þ&öÿÁÉßÅC÷7JKŸÒ¢§…µˆ—¢3äß·Œ»¦•4ûÉÿfÝ×ÒÑt5}¤¾Oé: JïŶžMþv":·a}lºqX@;(%âßu/ë‚[x¶èËz‰þqK;Òþôº%Îì¸C×­ÄÏMé=´ýÒ‚+õšÕçòºõ隯W1ž„BpýObƒkÔ-ÑxÙ¬7; xÜØ}á­4÷}©ªïóªÿf<žO_]¿Ié¨ÈãO?Lß-ö}Loàvܵ Ÿón‹5ßTß:úà¬Ëˆ–÷¤~K¿'ÿ¸²–<ái^§5ëá“ÄÏg}f t\WU??Î'{gÉýâškü„%žî”c]©S3šöO¬ú„ú0~N÷ë¯ÓJŸ£ïj]‡áh´ûFöÿFêûLŠM§§"í3ÖëÔu²q°D _!õsñd}]=ÃÏa2χû×Ò¼YñWz~k/P\8ïŒîÏß¶‚ÎÛS‹Î+"®ò—°`y >ª„Ä]M³??ž®—÷8ÝÏî£ú¾³ü;´NÎn¨­ƒ¾îÞÚ¿Óù”¹éaÙXý9Ö}Pæü=X×pW=/ÕŽuÛnZMù—uUôû»úþxzÓ¯ë°à†7é½Ü=^Ë·gJÏÞ¿é1sž·ãDózV"X' C¨®1ë5y¿µ¬“›ÝüÓ¨†1º>6Þ«çqÿÙ’7Ö×1ì™MqAùW¥Or]KÿÐûÍ¡ù…ýY4Ï=¡ß7j£1T:‚È6÷³YŠ®Ž£ŽŒ«áÎr”—]x-½×«¾é|ÙÁwá¿éùàúû²y»¾¾ qÓ§³íJ7…âécê=¬7};Åa……Þëð§èÚíz—öÃw£Åýaý(±zœy¾®y.‘8kû%¢okÓ7ö÷}•ﯱ¿OˆºÒY ½¿çƒŸ³ëqbá>Ú滋ý#\[FÏãïuËC¡ý±¾7¿î_\ôy]Ü]NßO¯ïéûõ>öÞ ×ëš ]¶j">­C÷éÇ‘Mõ}9¬_7æn§ïc¤9À®‹úºÛãϤ¸âi=ú²y?óÏ»e²Þ÷ê™+£_š­/xÆ®7í:sÃsÑÖ7TÖã(´Pú–~4‡>ÉH_GéXï—ë´)ç§ÙÇ u£é¦å—Éþ^a~¯ó¸Gè§-ÎV†ž¬yðM½®ÚÏ->ƬׂóÃ5Ìþ Åó÷RÆ™Bþ³­¯º÷'¿@ô'Â䥌ûø=ùÜÙÖÏRö%GWè×94•p–þOþq»ßŽ–â–ßÂþ ñò4ìcßo©3„õ1‘†å¼O4ÔãûEŸÃ&ÐÏ ¬+y‘õvû?m|¾¨ ˆb¾ìx.8^_{³¾o|”~väüWÿŠNó@íï¶¿«ýTåó1«½ÏC÷êûqßõ”HXw4å~Óú…)ºn3Véu”:ºCËëÇ÷áïsìCÁýÝ&Q^Oê"«>Dªÿ¹óý·qÃë¨>éXðY!ùOëxËû›×¯_[â†n¸…CÎûåQ½Å,}˜_±ÔÕmõ‘ÑÿHÿløŽ¶Õu…±|@4ÿidMÝ¿Ïø¡ñߢ|p«¼H÷é}³ǽØY=žîpc±®6°àtÇÔIÄQæÑÓÙ—îÿŠÙðV`V`öÕ°¨ºúV`öå74ʻܷðÒÐPÿ¿÷çmýŠ–½ª×Uf\H'ÍÇ]ZxŠh‘Á8iÜÐ$¸îi郃=í®hýs¬ý›ž÷šMýªPšù–úxbׯÅx±q¯FŠŸqý¾Dy£hd®ËzoEë›”®y¯ |Zï‹æ~o·w Äã¢×//Ð÷çʇ´ŽWqÐå2“w@ÆÕ>¸†ê­»_ ~¨o1~ÁÒßÐy|Q?Á¤efù¸úqCt>Šß—)¤náoé7ˆ)­ç»ß'iÝïtœÚ¿ôºuÔ<¶ï£<ñPâxŸÐú毛µ˜ÿ}LÜ­oê£;¢õ!ã¾×²_$v~`^¯û ƵmJ¸©O-}Õ*qžGe3ß°5$ÅÊ»ôz„ÀÅÈþŽhNÚ°¾Yþùªž÷$ÿÞÂ/þ²6}NïóöÑøfñ: úý¡!óL&•Õq>N¯ÎÝ’úÜ£×—£Ÿ¼ÍP:Ë?Ðïõ<}Õdî+å:qn{íeñŸ°ê£h8$îSµí̸2ÕßÙãõ6j?ÆoóyŒïÁ¡ŽéÚá´žïÎ¥º´ç ï:ù7ªÏ¥ë}9ßH`ÿúeÌþ¦Âߨú»íù¡”…‡TN__½S¼žŒüW`]È;o‰kºè<>Õ5§DZïl†FÊoãú÷`}C?ÙÿtÖ³n@1ö£.ºÕ³±9÷ç½mö;P)ž¿ŒÎ7¢Õ wŸ î×ü†¾/Ë~“)×é¤ë/`oWšu¢í¿Ø1Z§R°.ƒ÷…y|Ìþy—O×”rÂoÅý£u¿éãÝ.ECô1,ý‘±¼²yÝ‘ã÷Ÿd~ÍŽeÒhx Þ–<@“`^ ûôV]ª+܈ÊȾ¬ÖqÎ2^¬Žàdz?š˜çÅÒ¶:IðÑýe}¼Óãq`”×~„W#š@æò6þõ&MW…&Áº^èÑ_ŸWEË !‹çÂ9ï(LñSÃçéç`Âó`ÌC:_`Ðòænß;ã–_ñÎXâȼ=ŽjÉñÕQ˾u>o‘»ÂŒ/©Ä¸‰JÌßÙÝÉ¿´éÖøã.¼GÇ›æ8­tþà°þãz„ ú¾ˆéá¾P•ßï©+(¾ìL8)…³Â†o0ŸnWà:‚œùú÷[&uQÐ'äïÙæç$¿OTa]—…ÌyÒ\èÿ/$öuÞ/0gºÓ>B–ûbÜ*ŠŠ8Ü⟢_pÞ =BÖ™œÊ1îÙûòï¯YèW ©YÿDñ€\õüózGë+Ÿrþ†qn¸õÂ/•üŽ?¡ø?—„$9eœâ<¯ú¾iýNg ®…ËõûZp‹q}’|,+––ßfÃS‡žgÁæ·á*Á£ ñ³üãºEóëÒ5¾3ÌЬf"ë¯Ìó§üó`Þ'–x¶#"],<öÛ}œdi‹ÎÂ{ÁükïC:Oå9ýßÿ;8Ó)±~ž*™‰’6´/k¼Oï˜y]‹[oCîw»Ö‹õ\]u»¬÷QÔ-ðÚhD|¬Õí:‡›ë7ÙO˜÷ñù‹Óš/ØÜ•ê_%£ù_’—áW™óx Í|‰Ã÷N¸å•|S§V”7ê­ó°à}³¿_—ã™7DÅÂ?÷ÿþ…àÏhAû6ó‹-¦t‹½Ó´Þ„鉅ép &¯£¬oæK/?§ôXRîƒóP)ùÔ1P~©<××niBÇy Áç÷ó Šo´§%ñ–,Ñ󎢈öô}Kÿ6ª©÷óþFyýXÿ¼ƒ×/`E¬}½o2Ç Å3”¯~—ñ–}Zîs(Çyiþ=ªXtöW5ÿÐ=YÝí”ñw>D|÷FÁút6óÎZtÙŠ2ÿ¥RfxTÿ‰åÍÍúÙíDÞ7ïНvŒÓýÕÖÁñOJ¾}ú)Ýÿ¿NÇkH¼TTCm_LÖy?~» ǵE‚ç‰÷¢þ÷°º3öUÓÏWy˧V¸ô½Þñ-ò—>BûM7æ³UãõnhËhúÞ†÷Ap‹ÙÓÜâÎæéÅ·)ãµN†g‚Êâ{¾a;­¿[WÓóœ1ŒÖ—úFʸmBtlzŠ3FÐ÷|Gš_9ÜôÚÏ„NÒ‡ñÏÏe\ Ð±ÀOŸ¿Ç‚ïO/E5ܰF_V®^ü¿…3Ûïm¸&WC7·ý@擱&í¯‡~NuïM\§EïÁûïŒ%z~¿!ÅíjýV?Q“ýœnÑtÃâ$ôokœOVBÄ}h­iÍ_¶çúSÿ·ÍáÖçèyžÎï [<=3i*O€¥ëE‚óþqC[×·<ªû ».Dãíb=¡[›&‚p5ïC{°Õ…JEË«ø¯Öçíb~¿€nÂïñ#ý~þ¢xëYô‹ÎgÊõ-º¨\G²õ5IÚdž%“©oyâü溾0×iÑ"DW£”Eÿ*b½àÿªÙð¡çYò*ŽËãcá€ü©“îºÑŒç˜Hð'ÊKçüÄ]Ï]šOÞyÞoe½ƒž"?ñdsãûÉÔßòx·þƒâ™=¤ß¾ž~®¡†;ªn¬ÎWø0ìxŒÆ[?‘Þƒ§u=Ý]ëɯðù³õøK:QrVEÊ£¬~Yß6ž£¼ï{8ð0ó$¸õH1=¯¹Šü]ô­çÉʉõ¡U2ú¸)ϵwOã~#û©)YÏRñ"öK³×3[þcººáÿ5#zþ¶þhÈû+ó‡Üü/Ôëq­d÷TùÕGÒ{PHõ±ÉÖëäJ·°ézbiýàø¾r°«ø]?Ù¼nã|­šÿ½×”뎠<¥« ‰ýó¸_‘Mïëw›çÛX·ï#ßÔý•*¿zÙkÑðB+›êëÌZJt`k‰Xy=t"œ'òÌøzïä•Q Í/úf¼|hÍxõn”ÉÌ:k3‰·”þ-ºÌ }¦¦¨\eñÏqx¶ú"²™ï0ö¡@ÿý w‚Šú:ïg¿¾é }ÝyV¿g`ùQ3.}gžžGâz·Ô7Cº×ú(ÆUúœöµõß >®yâúÔG–çì¾ÃréÿCÆèûçf*˜ÛâÛ¸Öûì¿ZÏk+žóúg¬¥ã£8/‹utþYH3+ñ,hO_´Ê[Hü”ãs9OSˆùwTÞ›óÍÃyß+/æ]csþÁVÇ {î²>šò÷2ä’p,æƒò£°îšc~·¿IçW ÁU ŽOpÝ?õï½Ï/Œß“ÿ÷¥ãèýã÷…Óä“ÞÕ›â„,K>b̧ù5Í£ñ†÷̦÷¾×4òWæ‰ù5ϯˆüeaýúBïïöäo8ŒO?r§’á¡XÇW¸çÉà±âÖ`~ÐC ÃY¯3džÿ;Žõ³·£ùѲnL|!ø{ù•e?(Ïþúö@mDC3ΨzµÄL.fÞ¿öý/ÅC)ïí}láóÔÕu^1NıÃ9._û æ› ~I1Gã,Žû×S`r\o¥ëåÂ+¢Ç­Íxìoó×0ñsŸ…7¾œÔQ󕪱ÿÿÜžõþ63Y=CîË…½[Ó—EÕ{ÆH=¾Âšz¼¾¨fZõ[[œ¥ò`qÇÅ’;Ìõ#Å3]µ2Ñ:vÊõnןoˆ¶ãU7tî)“}ŒÏ> 7àoá3ƾŸU¯¹ñzþ”ž^?¼§ôõv´ÞÏEÖ üß‹{Åh7On3\?È8¥¿¦ò›ª/¡ä‰úã©~ƒo1¾O¸ëçÆ|’ ˆ£NÚÔ~õ<@é6%ƒ«Pñ ªGû¾±â´y<ÅóVº$ý’ú7‰VðRà{†YÜoéD0Þ5ô:×dÖïŽj¨æ¶¾`Ã)7ÆùãúûÉOî{4ÒýH?SöƒBq ^ºxp¾ÏÖÏ'å8á¡ ãA^ç|ÂìÒ¼ý>l:PŠ÷o»ÌÒÝÖ×WEãaW7]' 3¿çWçã{§4§¸¤¶%/jÑcpÌWøøå>s¨âö9Ñåùà¼Fg N¸/ñ¥±þúž76¢<ת§ƒçÕþ)ü ›ï–¯iœ‡,0²ZÝ7̤žwʲn}ÊíþrÄâwàÖ5´..î8?pS¹à:úIKíñ«ótÍòÜîo–G~Õ2ó„ÁtZˆQ•ãÖö[t?~ØïóÈç;ïž«ç7,x^U·B/w¢t Šðû“»@ŸÏ»†.÷”àõÏý}Î~¯ˆþšXy³þÞ-.\çmà¦obë”r\SÎŽ1ã¯ÑP×ÕÅ’Ö´ÿ1þÔ:.ë|ZyÝ6ô˜yWÃàU”ÿË«KûâÖó:<"žÅ†ûƺáÚ¼w奌3b]$ÿ-¨ßJE‹þ)å÷¾‚ÔaA;}?÷N ÅæûXêãþq#NÞ·Óª!ôä™Ïç÷)áz:²Íû¾Ì—ùãäÝøÞ`æó:zu²8!W½*ÿx¥öO…wÍl܃ÂÜÐÎ\ég~¾UÒÓùDטëImy^L$ v~+×PŒ÷޼…à u¶%ï—÷Œ¡ç®æeˆ~ Â‘º|Ö8–Ò'júG~oŠNñBWØ‘O¯tnБó™ÜWWÅâ˜åÌþJ˜®žu¼œN\óõõØÁ䜤/‘C¡„ñbÝ@%¡ïaãņìþq^ öKZäÑÏ6´OÆž'e£­¯²ÿVÊxì×a+ç­ªÆÔg8ª®çˆ›+ì'bé&½^×Þì'*¾¤Ê#YÇ+$ô9-u‘0Sùê”ß¿òyÚ¤‡WŽËR<ô”ß[ôU£JÒ})þJJ=°¯ÇÍÌzëñ¯+⫽ÿ4ãþÏó~;5Çm\0/gÅzO9Ž@oöï^wÕ;´ÿ†|ïQÍÖ— ~H~&çßÑMø¡ý-øÏ•ÝòÖS æónj‘H|„ë'šó3ó '«ÿ0¦ª/Ê<L«“(O뿯éžbÑu‘Öi¿~U‰ùb’;§­ñýÇUÉê¡ç™GÅËÚÌ;ËŸkþÑËš‡Sü”¼n©ˆxávÌS_Ciô Yÿ{OÄ¿CóšfêÉèV„égÚlùe¨Ï~ì¢ëÍþZKs?¦t ¾˜ODÿ£—~Úpê6SŸWé}¤ÄQ…-zÈ…‚盌㕮úL¥8yé7aðŸ)ךóŸñ~½ùIÇÿã³®åzR Ë}ÝJó\Í#ïgºNÊ`W_§ó{U™(^ºè¬çMýþ ›ý›”û=ø B§ýYg|ÖÚŒò“6õ}ØþŽÎOÐsýͰøOÁqJC·÷Gá¨1ëcò¿'®Õópoëüç(Ÿíÿ‚a†¹‰œhuaeÞ9=~EYÎq6Tã}}Æfúi©#!+fݤsþaXX]ù†¦éé XXå—av[Ý¿_9ð× ÿ¯š¯ÅƒªVÊ8).DmJ=ÃêÌKÚ´CèJ×·P}@ö­ ½ÏŠŸNåïwÅšhù³z#žXpu¼º™#ÞÿÇ™y5EBÎkdÆÙò%Þùüåõ§k8p•®Ó>5Xÿ/¿ Õ¤.b2õÐÈ÷Q]Õ£¤UÿB΋KüG7Ê_cmáö¥.¤ÐépÖ…:ÍèÛQ_Ë„àî6üUÇŸ7·ð-|?tüs¬¼ <€Â¯þ‘®ãŸ!hÊýàÞH<¬ªÙø¡ç}(ø Ùz]Ç;ŸîE¼Ÿ}á”ãUŸ«2ÑpÁØþ¾îWux9Xg =ëéJ|Š˜ï6\&ºFÔ ËáýºœÛ¼–}-üß+]ëUÿCu•‹¬ÿËúÉ("æcî(𧽝ÓwíûH¯Ø;.ôÞßd½¬/éºwÜFã䵡:“ÀAû}‘¾Þõ _‘€I‹u|¶Â¶#  ¿ªßWs »?ãÒúŽëëïòŸ®¥z&Qÿ3¬\Bǚ̟÷ª§œѧ¾š¯ÇúDu3,&ànßËø3±OdYüÞ•ŽHès[µ‹êx÷^C×mÅûÛ¶^:þnôÁ8Ù"Žü¥½/e´^¯F[—k«þÔéõoóNÅóGÃu×7Ctߎ¨ãͼfä\ˆ´Øú.`E]Oáô?6‹ýþ¢\GìÎñ™xO±v`0ßý¬#Þ°‘x_gT1ÇýÍu~Ÿ'}mUâ_¾SG{Ý÷Õw«[ûçÕ¸ºÂzœ%yœ˜ûŒàEï¯o–¾Ð¶þwþõ¶>éÔ÷…-¼ˆÏÍþНðëB.ÿóš.ýÞm„¿™ÔˆtTäþ‚cñ÷/U'-fé‹7Ð ·ƒû»Óóë®Ï_¥h=oö|ú¹g½›î­ècë÷Í^}o-#¿ß`þ¹¡¸žoiOþ³w‚ëÃméóbk?zî7î3/*2¤Ó}[ó?Ë^%\I—1f}ZÁËJÁoT`}†þÝòU¿Ü{‹÷µr"2æ¿Ìëéöošó1_à`eý{iÄ8G¿ÅÆ“x$¥?ƒßÞ_YÇÓ•çìßw5^çw~]³yþ5zN…âå5¼3"îl&ð|‹çd”‡¤úíøÿ?&ü©^Áþu\õ>_ã†Ûu5ÔfüÖÀ`ž‚ßLèeøãŽæ— £®ã‰ù#õ÷Ù¦ÿ¹£¿¹¢\<ý¨ú!ºabÞcü=´¾³žâG½n˜)¿ÌÕ€$‚wÄÕ„+(þ°ñg­ç—qÌK׎8nû²:Ÿs…Ð+hÏ|š]lÖýHìÌ—ûÄR?ÙFùz¿¯òôªzœ;ª¯™·?ÄmC _#&_åËj*þQý¦d>]9¾-MÇ-D}cÓtÂ¥ª¼Á-×0Ð àªóƒ‰/$ƒÿW9Ò~)ûÀ§èwDðõ6§ç/øGè¾4Ð/ÀêvÁºÕ[¶:}oØý²þ~¨uYòôÒÐ ÆßËu·Ð•u*?ï¿êicÜdíCØí!ÝOÜÀy0Ž÷1öRa÷£°õÃt}Æ0¿0SuE,"]ã¨|59O£zDËÓø× ‹këYtã_ý×ë:G!ý¨ãŠÇÞ31yÏ7 _Ìç•_W¿Ã; o1çµÉ¦{©àûXÜòšG2[Ggœ)½C_¿½µÀíwŽæÏ¤ôÉa]aG—âEÿâ>"òÇ£ÂB ·ç†-óíó‡"¬ïbé§–zý–z^ëÚ¿¦µ^*óÎèþ¾Ä[à±z=ñäOZî/‹çƒôôù1?‡Ö»šn8¦ÐñŠr|£ò؇ÿœî4®Àa„麢zH\7ûæ> ª¾SUŸ'¶õÊùþ7n4×5>Õýj*}0tÍ&\šgíßh^üZèôä½"âT3£u=ï„cÝ$¤.šßæ÷·©'žÃŒ¥”—¯oYo¯íXÏI9~ÁšÌô!pŒûQ‰ßó±MôüN¿Âf¼ñÆöfÝ·…Ã÷7Ì­èGøõ–…õºT=Z7lóí?Ÿƒë%½"âDª?'µcÙŸãñßÙG{EÃÃYÇYý=^ýűûWFÿÌW‰úŽzl}Òóû­ã ¾ƒ4[ßòÐqg¼BþQQ7õfF>‡ÍÔzõ<<öß—»¡Ë³úïŸ.YS«ï±œßÿ˜¹ÎÁx l(ø¹GÜ·|œ]]KÅx‡_“?:((ñørŒÇ‹¨çè÷ã«ì¶/¢µùû±?í¥˜z‹Éè`Ú×w0ÜM߃¨>ˆ&‘[4^çŸwRÌ¿]çÝîw,ãDFÕãÑlZÇ¥ÞtÊõÃx§…?¢ûÁ%ùãO|†ö·ißÖßñúsÓýÅøOhœ>?®»þÍÒ/–q@aºö®†"1×í æx kΛëÅkÍùëøó'ëÏ•Ú=ÖG›®Æñe~"åï?»\ýZ†Ö“dõ”øñg<ð3Z¿Æ?“%8þhÊy°B–ùƼCï×™—m3ë¯m%!Ô¶Ôíe<£÷£ûYpœ7AèŸo 7±°™9稫Õ¼÷Ò‹³QÁ‘o·ë›Ÿ ýCÖuGMáO­™b森{Ûgôì«n‡-W›ù›MùýmËñ¯…W•Ò‡µ•[cçNã£1ž› Çã×½$p´5¢­ë¸¡Xzu›ñtoÑ,î3k˜»ÅiÝ÷y +$ªû›r#|_u¿ýÜÖÿø¾Áï?rŸ“ÿßùSêS\½®¤Žƒ¿µµ›.㢱fÞ7‚糊׭¼à½Áû¸µ~ÇzÙþ÷œ}ƒŽŸc\0*%´ï¶¸Æªnut”¾¼:­_5à 'ò.ý<Ô™Öù¦Áñ¡ÒÉ ËwãÎZú÷»ê6ÞOÈ_Ý÷ͧº4ŸÂêé¸Jð˜÷…Òæø{¿ |«ˆ«±Žð êz˜’/Îû޹NÿiÈ{:ÑœÏÿÏùBÿeB®tó Áùƒ¢žö¶[QÕ‡1ÿ}½ÞäØÏ ӆᄗÅ\Ês£›Àõþ’ãÔî"®>θ.:‹çëy¤y ¢Å—ã£ã]®c{—X5‰~ÿÔK”×½Iߺ°{?ý\×üºÓÌšªóÁÐôsW½`½—6æü6ÒþŽ• )*pSj¿Uúàþy9Áxl}ÔþÒŒÿhÒ¯óœà›ôþ®»4d}¿7üx³£Þ×וMד,øZ”‰›Vô¥|Å-ýôïµ:ï]i–ýëUžAá%Ð ¢.ÐÞê4o;“~²Bt~æo”òß‹5cõﯩ…ºŸÞìâ„ËA•ÌêÉ †¥,ð¯XBx.Üøoz¯ˆõÑ1|¥?[Ö¼OÒëÆ\i$Æe5›žš4¥{‚1Óþ>ó®hýÔñ¾ ŽÖy®Cë׉Š×Çcþ@s~ñx°_Š,Ë:´oªž']ÀºE›³oÓñ1=?¶{ ½¿7}¬ã5gÓúØ€yzÃÈñQ|å”ëÖy·†™ÑûÁžúÚ:£x–þßçøo(üoºì²èlcÙ_9ïʺ U-|}ÙWcgs^êǼ/,^NßÓâ.GÎç~³Rþ¥÷õf¿“õHÍ~Û­Ói}}0Ð*xžcyosüÉ}}0âd°Î~ ƃUºƒ³gëx¤#¶Äx]:EÊ££­˜Gk§¹áLß¼zŽ£}^ãP3½O¤‡¯*ö§~ÂSº=“Á§¤\ÿÀ(ýyåí%Ü)¯o¶~è®æÇcúR\·µˆqÝñÞø®¬àú‰kX9Ï0Ã|}ÿø|´?NÉà8 Û+Òû¼­‹¹N¶üó´ðœþýª8Í¢7ã'øoz'½§ 9Å9ØqÒì6柕Å{·¸X¤¼œÊ/I¿sGy…câº7T¡õ¨•Xgæ$?£…£NËšÑÉ@Ks}Úÿû͘çÅüÑ×KÊPÉQ—`Á”ßgœŸÔ«=¿—ÎC½o‹[š/æÃŒ&òž9ßç‚sÞ„pœÈæ=¢¤¨‡ï®BqU¿&ÁùZ~ïeý3¿O‡iá43w—†]sh4|‡Þßž‚_–!>8êå9æ¼jŠ}jOs]ïxHßÍ–Ïëù´¼¿gÿÜiŸEÞ§—ž[Ò}S®ÓÈÐP×;BMöÿXoÓ¯Û,_ï4_T߯4n®7Iϳbe™ËÚÕã}.é—bóG´> ¦|;¶Lëé{!×ßü¬Î?:J6¾»­ï¼ÿw¹_WãùÜ ^Ý?iCîzóïÛ§Ç'C»hù‚”óg£÷XÕÕ†ü$XGéÑ­Öù%¨&t(*s=.¯ëZê~¡ßNéX²-ùu˜6ËŸÖã•GMÑÏÜ^Á¬Ï:œö5,aúfãÞ Ty(W=¤)›è¹í ç“+Šx藍ß_žu*¦VÔñókëø›_PÞë¾S”î^’òý;j“p÷;´Ï<øâÍ/ïg‰ï™¿cÓ´™kœ„rÂ)!þ>ýHõUYÇõïç¼¥>Ýü í÷¶z4ê[ø¤ãH7ktGÔä}(Cºh?`@Èß+‰x_à–Q…ù4^â¼P%úœ_¢uVè\+]|…•¸ ºHãá¿fѹU¼ƒQnzZ˜qgØ!tÜuÏæ¥Ž'V¼dôgåzz]QÆæ×aO¸Åa(‘wP–×^=›UO¾ß˜òEp}yYö”¾¬å}i ôµ¿o¹Ÿš¼îp]Åúÿšˆ·F‘ž³ÒÙ´? >~0×˲D>}ŽÈWŒšÌ|ûƒëòU,xÄöß |m>Üÿ\§\6ìŒh†É;ͺº§ÒÓP}L|\NyÆÕ50?ï-‘¬)pæÙOQõK¥›0j´¾ßOü‡J¬1’x¨J'Qá‰üã– ÜÿSüK‘D;®gœ¥ù£t²1N_wÑPÿ\Þ»nõHÌkIù¤Bªÿˆ¾ÏºW÷#”÷êõý­Où¾¦¾dÜÿd µÃî, }s/ýôõ‡è¸ Ù·ÀÏŸãzÜߦï]í'û¯‰‡sî{ñOy½ñë@RwôÕ§©\°ÎÅžï™ß¿Ìñ5æ¿bö‡%ŽH¬ÈÍÖýÄ Miß¾n;ÍWµT2LJêýõÿŸ¼ßààíôܬ þüƒÖ™¯Ç}°¤¾¢ÒöÛzÄŒ+¹ízOöõÒß45óŸtß7ÿ†òB;ÚÐó9¼K~3Všùõ¼N¨üݼOôçç^‘çeßï»wT"¿iüL]/@é‡ñ—Y"L?8E·¼‚9þVzI)÷¹¦­Ws^Æ…±ž£Ì·`)ùghœ¿N¹néàü†Ò‹§¾ùó*|5Jð÷[”ý’cÁïƒwLì˜R—ýêç¢uÉ’—Tºvê:ØôssýT­W}_ÿþöUÑëÅj~–`ü}±O´ÑyQ>î­ãDsü%ü2¥/ƒ„¯ÂÚõü‚…‡„΄GSó]øgˆ~yÑà÷? þûfþP ˆõa°xsa~ªê?Žºœ×jOþªâ]úûýÊ n¼ æ‘ ÝPý{¼®‘¾Î×e?î3‘o®Éþ×J€ )Ïcѯs¾GóºpÈ{©tBø¨Æójåi7þûB…¾W݈š‚?iç–7•¸-ÌßLë{QöC¶OÖ×a_·à_âñ`SÆ™R–æ‰ÄeE¬›ø:¢Yì?Š–ÿAUž§íy½ßþ7ŠÛÞ YŸV-¸Î¬p"¹#Ìç[ò7þßk‰x²…àõ0Nê¡ájK¾Ièg)?6%¯~ó âO¨u<ç0=7Γ¢Ÿÿ¹ªop>v}·xRéü”0ïWÿdç8ï#Þ¤ÿyjºÍÌ8²¼¾Yt—°~­+õ>ŸG)á }7lÿ«þ=‚uUFižçé}ÇðÖìsÜÉýLИ¾t ÑÃ8Ç~ü™`¿,å<Ñ7•x©¯¨ï×?¯ã¹Æšõxl|=?Ï?¾=Wq¾â_û×)cþ|2®÷/ú¢Ž¾.`þñøšÍCüZå—_—^}ÃKæýUKÕ¡Rþþ&ïc9„+óÎYúïXü=t–~6 áèõºTpBæ7¼7Ø?YJ_4ú2ν¯Ó-©nî÷bž4&ü̬ºj”þv8¬¯¯ÕBÖû ü^¶w«O‡™Â!aùŸçzïS~ŸeÉc©>{ÕÅû1¨2??áoÕpŒGÚ»í×Fº±hÌßÓþœHõyïcöãªðzÚûƒ°üTùB…¦|×uüü2µ¿Êßcփ߃/Ä÷V<8ªòKéßq2&ý ›…ᯒGˆjè{&žîÕþ_î®ú¨ìXÏ]bîw`Ûç]óý)×±èøã¾1ÎÝR\÷J$g Š”§‘z’)ãUµì›¾‡w†×­âìïTOæsE5,úÌ /u\™·ŠúÞe§e½îééÚ„}Nü袹>ÿs¯f`Þñ­¨ñ¯¥ßDÖ™·ƒü½º é\¤Ù§íù¾®ÖqqQûX%m¨ýÕäLJå+RŽÿ<=Ü–Í¿‰k¨wyûXIÞ¯ÍTËNå+Ž2¬ÏŠäÿ§ü}ˆ9Ï×°›8ôÍ£ÿ—¶¬OÍïåçI¼FÆ[Ç1ñ¹xxS¥+¢…Šéáüq&½¨ƒ…œ7ü,§xªQï?®Þ­u¼˜þª2`spÜ$ëºO ÿFò„¶ö œÇÞÙà<£ÂeØòQÖó>0¯Ó Gz¾ÀHü—Ä÷Ø øQzùªbœ÷õÌúXþqÛ‹êóþ*æYŸuû¼éšì‹ÕÐbá«„þ ºÝAû†…ß`ÃyZ¯S&ø=õ~Ì¿°éɤð˺/2ãá-qJ»ÅÿQ 3²)ß/êô®õœ½µ®^?“HþÛQýÿDp]Ñ;¼©:JÏ!]sÖõËð}D54áŸw?¯×EýÕi¿Ä¦Ò‰äãšM=¬€ÔãÇÚèõìÃÆu3+™ñ+¹Sôý¨f²ëzXŸ ¨†Êù3UÞ;îùÈ&þFßÁø·üŒ-÷Þ ‰'=—}›éŠS|=‹N 4TÉß>—WºÙòbŠwv¾ªÿ+œ›œÿ(Æuà „3Æm 擪Ÿ‡¢ºÚÊç5Jéñ¡2ïs×Z‚ëëXá—±¿VðçêõN`žŽGãI4JOw"ÌÔ>‹Ñ-õú÷íÄÓ»®‚ÿäøÒûâòðûÏ\á›mÇ)][¿ä°xWâÁÑ#™º±4©Û•ióN ×§‚O q´sWêu÷_Ld?•ùK츗âDÑ4L7ÓÖWBF¿îôÞâêx|ߤú1DÕk÷.d&^ 3ôˆ—T¦ð_¡×é/ÎSy½¾hÿ9øË`¼û¶[‚ó[:Ò>Õî)ã÷5ßãŸÇ}U•VÔóýûk÷ž›óÐqý=>êxŸjÿh–™ü zQ¾Håë¼OÒ㯪¼ð ~3(?÷û EBüßBn<é”óF³Ž™E·ÅþÀ|uö²ãù½®y½ÐûmÌS<ž§—”Éùjù“7”†MËWÝ,/D8ÑùÉ~_‘®/#qÚV7x½­`ÉK—¸þ#ô³²9_‹ƒïèëÙi=~“ýQ05x^âñù”¿®Ç8Ãr—w…»^7óÕ_r˯Eµ°|räñ_è# ¾zÑâc ìKûu–è;2zn@v0:$¿Ž;®ºˆe]nDû²8Näþ°(âþ™/¿ïj¹ö¨^gúöÊâ‘ôoû€âãBéÕó¥©}Ðù>j‹:Ómߤ}î‘k\üW]ŠË…#’†Yý£ñOBt •…á•zÊøC¿ì¯ˆ×²ä‹­ã¯ø•¾žVv;?E—r! U»ÆeÖqϧ·Æõkþ1tœ3é­Ï¸©­kõŸ¿¬†Yn:xÒnTéÓ`Ô_u¾byǺ|LܲwJ÷;ðÔšà|ﯘ¢çßDï+‡Š!üú"òÿŠ¯ÑŒâ§‰¯$â/ fº#èæÇÿßK4Ÿ·•÷£º­%ÿ˜´¡ÕùñTÙ!Iê+#+ZŠ2™õ«ÑÕŒg@ádø)ã–`Þé?‚óø(bñƒ eÆŸ÷ÇW¼>Çõ×–¢<Ìú¿ÒO”ù8ÿ÷1ç/F¿\G7É)/¢t½¤¾WŠ~ã+1÷àeÁ¨xåâÍÔ¾§#®ÖëöƒXßaÛ`Þ‡oÐÎ ë·–rþÜ;tþy]=ŽPù<|§î/¢Y¾ô‰Ë¸R »*õ»°é¶dã?õþf¸Ï•Ês‡§òÌ 2[M×PCà–¿³ù¹/³?ýõ“É#OÌsí[A_¿Æžb5å‡JH]‰ü‰Û’6,®œl~Mà›1ÏM·ƒwóâd6f¶ø%¿Îz˜a¼Å¤ «½ï§ëJÝÎ0]…¨æ=Ê~Ý¿…®AÕ+‹/œ”¡hfûªY¯[‡ýÆÅiº‹)ÇUsË«Hœ›+ÏUß8iÊ¿÷> ¾oTaý‰Ù}£áÞMï¢ðÇ®ýmüóBtfüãyÞÖóOãúqÝñøLª E¾ˆ¼×¤ 1+ÀR!S抋÷?MûGº<)Ùÿ@ú=žè~ïú~¤ô=ÐDÏ{Zô³mýŽý¿÷¿:ÖúÚ¬»4ba¤}󮢸¥p¼u ‡^É(~Aé$fjüËm¸~Å å£Õ³œÇ/aÞï“®—G5™OL·Ÿþ§:nÊy…¯0ÔÕ¿*¤.2 Kϳu‹0)ZÞ[é]¹ï>®y½õõ }† Õ×Ñ@Ä÷eE¾2/+˜ßÞôòÄ-®}w3v}‹ßé}–!žeƒà÷ÁÖ'#S†ëÿAuÖ\‹Nio3îGöc½Î£/wÂ+K–çŽÍ÷Gzß/&©ëgÚ$Ï#+'²«þþÿCð"QçC\CÉüY§¼ã¯ÅÓ£PúN)º˜w¼O:¨‚_ìK6ߢô}]w݇SΛ¸5ž^5½¸þJ3ÔaTš~¡´”þÝmXiæUE¬7†¦ ',εž?ô'1§µ¹>_›`œLCýÿÖ~^åÝêZ’oåŸßDè"œÒãMå×I¿}oI+Ÿ† GýHÙ>F%溔2Žk·™/¹é9mLz}ãNèùø‹ñü`…+—x×üaèý‚tÕ¢®—a¦údÙÿ.ê¼_ _p•ü6™?GÉ`?ý£õ÷È/Cÿ³F«[ÇOéyÛttlï§'>úÇŒÖÓÐO×ÑP}]ÏOéÿ\U_ge>1íûílÑe®kÑËn þ¯ú¶IêŽòÇÐù7ÜUÄ|¶?þã«ûGèõþ~ýûÉâ÷FøIõgNÊÒåû¡¨Ðû,óvXúoݱäOSt"®ÕuÉ’ÂÓ_.˯øÝ®Ï(Žw>®¯¿ßU•}À’6¬\žV~Oâ+Ò¾Ÿõˆ÷»pëçT^]HèÒñ—=×›õª…nZºuõ¸†~Áº¤Þg]ÑëO^ï¹wÑ1nsÄA«>0®:œQõï¤áÐ×ó—§\Kÿ>£ê^á*‡pßìhzEðÃ,cyûý¿îƒ4ê†DòÖaºùÎãØôÌ—Ï6ç…ÎXús'„{JZ¿ÖÕ°®PZ÷™Ácbå3Ã#wí9áñ|õ¯Ñ³¤ÎSH(_“®Ùú»Øp4(‘Þõ°áÓŒú¨Âº&5ãá#°|⥠ÒÖ§=i“:8X}W2ýŸBêQªOªü=îºYÿI³ß†¥wS?ˆrŒ[*Ïú9oëë·Ôÿôñ‘¦Oîú_½ušº=)ãçqÚ‡¼ã—‡ãjX׋ðÚ²O3ZO”øÁ0ÜvL4>ÅÖ«òå=FYŽ“–tòû1rˆ^× Éƒ'ma:ˆ¶uÀæE¾~ļŠ1¯zˆÎ£äŒû…›îsš8å°|*p|õÜåá ø÷Q–û„èv£œ#/wBâŸdYü…S™ÉWÚtàS9nÀí¿ÓëÅóò’ñç?gÞ5Ïo<Ñ' ¥Ð.&O÷íüÅO…™ 7¦›y¥XÒøå¨zNþy?Ì;{yôŠPÝÒ7D¬÷˜S1£z/W Ó{=šˆ¥ÌõP¡¿„[Ž´® ¤¾¢ãåÅó¡OY‹îDþÄW¸®fp}~:ëu‹¼ʆôe´G×÷îÎ|³kIŸsƒû';ßvš|¯:©÷©.3jÆëëÈ:ÿ=>½xï;ßÿRÄY_UKJ?:ª¡½ÀáÚôóOZpêlj¼æRý 7|–Ñ| ®É ¡þSxèsŠGbꥌ×~¾q ‚Èûpœ¥ðˆ>žë®[Ïî£<ÒãÝt=×ì·$Ýs4þÅÖ}Á<à§ï&½°oÖ?%¯µïpÔþ˜QÍ•'µÏ—uœÏÜxŸjÞFÅ_ZûHGìËäºùÇ;âqèiÒÉ8KlÛO_è¬{¯qž£=ñE1;¸Ÿ «až.ô€ª½Ù­Ý#ʼn*¯kó'$ž.jßx×ü­ ƒuÜNµ„qç¢ï|Rù•GPÿÇÈ,úykMòKcòÙUÿtïϯwþè²`ÂûÁþúMµHo-·‚ÛÞ3ó·WœJFohDÿHóã'\x’ÿ«†IOkówÍ3ã–X·Ã;veèY _yÇ>kɬwÞÜGµkÅ|ùüÞYËþtçǤw3ë¶XõP×ú-Š›ý ¹Þûǯíä‡aeK=?ðõ>4žw¯ß9íøVVÞ¥ûQúµ“‰¼¯,Þ¼²”¾¶Ë£õsò޳Ž_áôx’™z>ª¾ûü†ü~Þø^¬qd_g¥[“)|»4Ô0×'>Ó×÷û®}‘¿øúü“Ä5dó.d”´¯W1Íów°ZïüÑu•fâ®Û¼B_ƒ…ÅI²]Ê8ûŸ‰·?:ÆÙVÙXÿ‚[.ÍìjÂOå~&}j¿o}X]}Ë3/up4+© ç‰˜g8êz$Ï:¨šì{/qÛ(Ïïâßê<ÝÖ:OQåIBûôV1×GÕz‡Þ­t<öq~Þ»”'̰¾ ¿îG䵦‹W†%íÌþäì‰ÄÃzæÈâ|éׯÃ16à÷*"O-ëÚ×é~Y)¾Ï6–|¼Å.°ÿ&ûnaHpý#íë©:ƒÐÅÁ#õ»Âð|(Ãïq…+COâY\ûÙcîUnxXÇ:–Ï®ÿU¤º‰÷¦¸ÿÓÑê.RYá%pà}?œÿY´ü^#±†ÄXžÎ30¯»ÜçÌû<.(L6ª©÷Qâ’•æ—%ÅEhõ4²ð“?¸²ú\nýº0ÃŽ#ÕÕ°òÁ Þ»aÎ9ÝÏßsKFüc¾£X0Nx\²xMï„Ï(ú¦ÊúXÊ}:DWŠŠéÝ·Oõóǽ9pMe2ƒóV¼Ó”ß;Æ/Þûúq¸{óõž&¥_k[Ÿ14Dg2ïj¨—?8T1Ϥ9n h}1ÂÙä½Gó¾Á«ï_/ºyx°üèlÂ;Ìú¸ûÚßß¹üʼn£b¼¼¿÷–À©…èÿK|‘Ò öÎGÛOñØw4]Ñtyu®–_<&Ì΢yÓ"žßs¹y¶hœYü5úåE;¾÷alÄ?÷ÔU'ÃOJd_Êïu;fŒ£â¸þs^p| q7®|o›a“[\›) ëÛ˜ñëŸÌ§÷¸~¼z¬wTÏ_â¶5f¾â…^éõÉ_«Ió “óß ÍÖ^®IOï ÓìÓœ[Ñœ§ý®lúÀaÖŸ‹¯ÏW\ô{Vÿ%ñ9¾gè%\(Ç)˜ñmçÑj(õkºãOù•—Çü»Ýêp× ‰–?È¡ï742ëó[ÖgÜÑÁ¬§»õí;çhóÓuýÂê½f]HG~0nžo8X›ø7ÓuÞ>òæR~¯"½w’¯¯ê-r>c`[³þEGæù´aÜîà£a·n¾ßæ!ú Çãá!ü~aãŸÍH¾]õǪ3ÒïäËjÆ»37Ç=بãq÷édt—¢â÷Côܾ=ÝûòÇ;i®££Ï÷«Òäõ¼/å·aøÏ‚û“–|ÅZ!y²yO$}‹ùjxhBžÓq•ÒËÇØøÞXÿÚ‰—,°ˤYù–ûxEã±`ÏJê â¨ké_'&ÿÍûmpÁ–—¸%串e©³cÅ2ªf¶ûu5lšäíD6›~QèyÜçYêXxOXowâT½OƒŠ7D Oùß‹Á~¦£qÂŽ+“žÚ?÷˜óYŽýˆ_qWï<ú=çÇÃüH™wOÚpÇŠ|y?QèòêŠc¹ßi~™Úglxg”æ|F)óù(ÂïÕ)·÷Wò üߟ ž·aû 6/#=¨!¤ŒÍeò÷…ÁÉò>óÛP+3zFa}ŒQ4Ú>‚b™é§)MåKÑ"C8ûÂR·þùmx`›N±„¾ è•7KºŸ’«aI%§ýÑæç£Pðû˜>¤.r¥˜wÒQ‡#DoßúƒS?Ðt ³6Dëûþ‹®›%>B›>ƼHRýØ’65_Q>$_VÂòBôñØ}WÎ;S&û-¢*ë¿$ÜWñrY\Ü‚¾ˆãö©r¾^>á©1¢[¾òyÂô=\ O¼å„¿Á€`À0sÕ µõÀíKƒùÝʨ¿ÖÇÐfªèSNø“ƒÍß#Їà|,þ:zý9Ò:ãÚÿ•󩯲ežøùŽw,¸_©‹PÇ-_€±3u]¶˜ù2Wû²÷Gs5”7ç¥lúâ˜{ÚMOídRw(®_<™ï=,ï¯øGé^'¿ %/O|f³¤û¾E5l˜tYõ*l}½CÏs'å-ýŸRŽÏ!þµÜ·¬Ç÷$–ì“í½š^üêeË.?IV/ $ï•rü©hû 8>·Rä÷H^JÔýuÒÔõ9÷LËxoïv³þu"òo0kM°^Ø·Yÿ!¡õ·>’È|÷Þ°Ôõw}®ãXŒÐÏ˰.Ô•ftÛÑÏær›«Ž Þ”ÿÏ7ž®^$jð~ì˜×ÆM'£õ­^}s<ç¡àþôªYÔqSƱá"%~òHz×AUÁߊØw%Äý¸öIç>gÞyÇ>ìÇ8Þ/Ê:{G\ïÐ2žÒçéo˜îu”aê¯ißKH'ôzýt?Dåwðøªç’¨‹`E7㺋b™áo{Ÿñ÷eÑù°ž'úŒÅ­W¢×ês²®IÜ2Jæ¯nnT ë{œøõŽ&Ûg"¿,)}Æ0=kÌ® çÇ,øçëõ6×iÃòFè<ëKù=)Ãò¯¹ñl³âñ¿½D}1ïOùÓÿ÷cÇÖâÄsùy´}Fø}Oúa:àXÓȬ[w1Úºìã´ž3¬.†[)?:dt4~ÒëæúŸZ¯\õŸqë»Ô'yÈ-Áù}K¾ÍûîëŽg$ÿŒ®ëó%žFw~n¯Dì%ò•ØþcÂ?çéK>Ú~/ÙüvŽ…9ï^QàßRÞVñÛpýÆHÏ×ûBèÕ~4Qÿ%©~p—Û¼Ñüΰ¸ òï“”ÅÕ[Anéhøß¨õbÖ݉š§ÃÒÝæxkÈ»Áa R´Ï…Þë ‘/ýJ¤Éï÷ÏÖò a}‹­ãŠü5nž|Yð¼ÞÓ éB^Ìl_ôtq)8ˆó‚EôzÄÙÇÅÍD5ä¾–Vuq#¹O>çæÃǹÆáª_{θß{o³>Xuñ\oz;÷ö)çw†äßø=Sy8 ²èç±?a›˜S=žþV.Ê;³ŸH¶#®"Í>ÒþsÛ¾'Þ ¥‚ãµ+¿h«3¢n´ú#†<ü÷þ[ÆÃÊ·H/ö¿ëϺôsþ§”× ùž…¾þ©4¬O~Ç•(+tBxí)ºÖuÅ-/kû½ÒgÆœ—´ã¼Ï£ñ|žÌùƤøƒùeÈû3Õ=Ž»åO‘÷hFqSaõ-©êã +¤‡wVõ¦¸ç[Ç áɆéG*C¿™ó+RÏqÔÞôö#É÷úüÊÞ? sK$’µéò¢-ëµíέûÍeÍ|îo"qØÖû±ùQÛéëìºo©Žeé¾³ùïu‰ ,³†a[®¨¾(I™ÍrÅkF¾^D]¯ü¶¤qÍ®†ýwi×õã³Ï2ÿ«ÿ* ¸Úi=ÇCµ‡šâ)Ôt䬨Mþâ£{È¿èHóË@ý!ºomÌû;v#8_»¿©O]@ñÃj8TÕo5ØÏóuºî5¢¥¥?î(£÷+Âw;mÆoâæÇ®è~¿æfÞi¡?ÿX‘ûó³nà}’¿xeuòò\×ÒçFšw8Aé•#;=ýt-j?aWÃCÔ(UD̯?ÐçR]zÌ+”—`ýzïÝhñ·+ÿYŽ÷ûì±—#^Rx\çãw?@ó¦Ô•­s’.õ?ãè~'®wë£çµð- éÏ-l¡*ÏOQï Ó_Béˆ}›ÎྱŽóºiH_ÏGëUF䉠‘¨C”p¬sä=“Ñú—«y'¸^ÙO >(¬V¦ …#Ö‹çŒúRå1½w¸ÉøÎ ®ƒX°aD<œ-ªYô¦?3ÏKï\pýeóÇ´ÕÏ0èË­KªÌ•7™®IÜc~[Xûy éA2¯DâÔQ#DÇuz^º—¾¯÷Ó«›(ÃÁ/(̼HTЧ—¨ôŽQ;"þªßfs™q¯H~‡ÔÓÄúìŒúÞ›Ž}©‹úc?+ëx…,úQz™û%_&þ ®Í£Ÿ­#ò—ÄóQü7ÿÿÅÉWõT3ûûxð¡K`ÔÍL]W‘߉]û(î›22Qœ²._kÓCÎ×ÎöSÆËÐü³á–ýyÑ1Y£ÌxTëñ¥’¹>*eÿ‚Òbßúo’·7²Äû[:æ8›n‰„'@‡º®á{ŽéqXô“Р½7ÇÌã«øÅv}ìzˌߞ[K#åçS)xÿÃܶfÞêÉh~9F,4ëÈ ¾²ª aÆ7¾Ê`Šs¼3Œ›»(tSCô¾RõR߯ çÏsÑ—ÚÖïÉzÝ—,¸Ž-o»á õg½c–ëômBzž…-x™ŽŒ£ìP2#û¨úÞÕOt¹×­þgÑùr5™¸RÌ; Þ­îO/•§é_¿òåÁ“$mÞKäˆÛº‡ñÁyNõþª|?zƒþÏ늺>Z‰¸údðßÞbýzÝq=I3ÿ.ùí™6©…I/iï™M¯ÊU× YBŸYÅ_ó3«ƒ€"_N] +Í$N$ê>^`v%²¾º¨Oë&šý<ôýºÖÉ×~qJ¯1å>ŠQü®t-òë~°¿´[?Ÿ!Ãu®Â1u‡O ¥£åù°ý×WdøËj®õæ”ó,úJèÙ5tž–’®7 ;ê‰÷âü û³ ­tqÃt·½÷8Ÿ êQó™2Ù§+íñ"öc¹ÒÌÖ×܆sˆjÞ{bÜ,Ç>"ÿçÊ#õ¯céêgÉ«Mµù±ß#=’[äË~ã½Åù»Jý<¢j\ž÷M2sݨzŒ¡ãñûãsÔù·c_£O3ƒÈoKªoˆwœóåCt\ûŸ=øFà<ðÎëß§ÍoNÊluÕÄÆÿÀ¼Î£DA^áJ0 æuä³/×þdíëÂߌª£üý+e]Tù _§Xô«C‘ຉwÂíó{s]Ï‘§u¹ •CðDŽûcÒ&õzÂú̆õ‘H9Þ¢kí|>÷ÛSú{Þédö©kîÿþ _(­n£êØ*õÇ)ÂÃii^×dŸÿ÷ü^¥Ûw Ý*f'Qïýê&šOÄòœüí÷ÀëUTž-ú}Õ,Æ1°~jºå Âô¯P&3z$I›zÏýÿŸË캎R¢¯Oš8…¤Lá_ps4=áÄúy[êè±Ç³Ô©Q6½|’^®+•Ãû(øýUº‰÷ ŽØï')CKÿ­³Œo/ïûA÷ëãé’K>BB:6¿ÝÍ}c¬ã\Œ—ÇE5s^%ƒ?ŸwÂ’Çg¼öÑý·¿›Ç³á餮¢íü¨u ïDÄã#ꇢ¦ž×W~js¤áxÁ'sŒ'uPÜ †Ù?Òër‡ç~¥û8†é\U WÏHÏØy¨ž?c¼§äÍ!Gï{›n= ÕYç¼ðåÑ×E]}~¨¾6ò8©_ïŸ_ú ï3'ô˜Q;3z >^]áq߇­ïèþsBz±ïÓÒ?)ß®ŸPŸ`åïÙxÞIý{¶å“•¡šo»(8O¤xŠ–~†*f½®êWT߼ޠufæ ê™ã8¹2â­/›yÇ\2MdŽÐ¿ Á GÕ]J7ÿçj¨—é+ij0=tÏÃfqyÔþõþ Ï®…õëFåÌø‹¨”PÜøqþÔ›ò«_rÊuÏ_^=¡¨†v:>#ûeFïÚ‡àïèg„éÚòý)Ç%ToÇ!¸Ý÷ÛBo1$Of'¤OhR†Nn×ñÎÇÓ[IéÑTÇUFÕ;HßG§ôhO¯£t~ —¶¦F°CB¼&ë}v[ÇQÌòûfO×™#æû®0.n{úRÞ.ËQ?½t>í?ÞtƯû×Í2ì—Dõ³âê˜ßû¤úâ(܈«ŽB ßùHðñ(“?y!äèõ°x9åül=ï­ž;Ze6?$u²ðàþhõƒß0žAÄéaó_ê‚ÛðßRO9ª%ÕØZoþfÒº4¡÷õÛ˜º«3ú’þœc?ΤLêᮆ!}-¿Ï°þˆw!3y>[=*å¸tõ *±žA}Æï8^£ñö£ö‘Tq:$›'C«˜~ãâ…”gnꦿƒU1×=;6ç/-:ƨ™áù¢7y<ÑgÛw&ê`ÒR³îç'I廯케«¿(õ9”~6DìóÐ¥HZþ›«NCÊu[æÑùog&nÆŠ¦ùâï%¥ì|=Ç>œQ +ªgu@!ƆôÇÄš]j´å½Çõß{ÿiÖ*“Þ×o3Ž+ë¹¶|ž|Jÿ‡‡âék>zkà~!õUqè;ÁýCOdÿÁøýé¡™Ò¿F}˾yð°YLè½Ù¾/âpïXñEÔü6ЉïgBC걞«ò¤¨Ìý–u Ð>&Îk[Ñ`î=ߢ÷oû3:¢ËÄDÖ+‰guµ°ºrЧ÷à‘ÿÑó–í.O?\›~_\¢é9ãÐÞ‹†ó‘ú7è‘ÌCfüÊçOý‡÷ŪӨ|·Â-XÇwÄ㥜·áG:ßㆉÆ|êñúÑ=Ç©>cã›ãÞwõx¾ÃËù’wEYÆ JOoã±aÄÝZü€¢ ëWaµrÑÞg…'Æõ7›ñÀžÀom¼.Θ“hÞ:,?«ö3›.ÖÏI´îÆgQ¸û¨¼0ÿüB¬Wié§ê`½!K^Ú;«ïÓ˜Ò–tc+ <–#ŸÐ?žóY(mÞâ΃n|Ç|UT<­¿^V²øƒu,¸¯rù«k$ëÀ¸õ÷Ázì!8 É Äí?…c õƒú_í‡D›Oùpa†^Ô7 WW0Î7TrÔ»\UZóËl:z(syêƒV`V`ÒâæS ¬À®$ó>KSÁ/X`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`é™÷Á—Sç0nÿIe¨˜ÙþI¸öq÷qÝ5\.¶½â†ƒ½k.áiK‹þ¿Èç~¯W%««ðAª_}Rã&mÞEÖ9Xý|$>E˜^ fïÕùßÅ,º©®}ÑJÑ÷“.ŸÙ;bÆgKÿº?Ürá’N’£î”·§Ê®‰3¿°éo‰¼ÇqõÖb_ï ÷kú¶ïÛû<Ú:Bñt«dŸ¡¤ åõûQÿOWEZÒ}ư¡[°^r§üÑÇ´ñÉ0Ô<ÿÓÝ×Ãúø¢;óÜj1_sñ·I¿bå/‰ÏQÙ:ÿ9]Œ^ã'aã†h|%Õ·9DÏUõÎþzyûÀ¡õÐXº˜Ê¼ÏûJ„ða­ç]ÅüÁ“ù»»Zº}ð1¥¯ÝY‹ÞDûUf]òQ}ÝöYÕ7ùúaÄ+Ñ&­u ]‚yÛénýV¤÷Ã;Íz!+³"]GÍc¥S¤tïüûØõéV¬§>m˜A_ îÚ@üÅ\r\Q•ùŸ¥¸Q®èÏ÷è]4=/¶N4œ¼ÔoŠj²}¦®“i“º°(Ÿž—Ô¯Ío“ó0ôø÷¿\¼GÞžž?báÙª8+Ý|€2Ô`¿4M]Tìgö׿·¼,ýmâN¯ŸÐŽây¯0‘×ï?êë'º°ßöoÖS˜w4QZðþñ@uÒý9#ò2Kÿü{¨ïpî“ñЩôtQ/Ð:¦ƒ¢B×õm·}»éz·7 \wÂxêQÍÖ§Úÿ{B}¼w¸ô¤?Žbu¡Æõ¥o¡t‘£ë£÷©¾`‰ûrÜ®‡ÁûxRºCÞy¡kq™ú;É}Ü–ÏÊ/C݈zI&³ùã…èŸH=MŒh­Å9hÈ:e;J’~ÉM¿2ë¦öjø9mq!~ôÿ Lÿ¨â•hŸ.yýÚ*. =¯õ;Úþ…•tK®õZÙ7Ã;)òl_›YúozÇÉßUõ,>pD}=K\§sëOi_\t‹æ©þ³Øu·¶î$­Ÿ´…é*ÃÚ·âõéñ%²Ì~“úž£ŽïÛóóÿ1£~ÚGÓoUµfÊuë¦Wç°ŽÛâ˜[ÿ¸|®ÿ`õ뤛wÛíç =bö»”ÿÚÀís„™òãT|†ÂÁ~¼eü»­1^§Çuå"Ö8¢ö#ÌëãwÐþtFô’ÑJßgÂúŒ¸ÖWQ2ž®‘ÒéŽz^R†¦‡¢JH=ºbÈ8E“í×u½AÉàü¶5ÖÇÿÔ-‡2–¾ìUôïÍ;i~~(Äïá=Ÿj럊Ë®ÕP>™uVéåÛô6CÏçuý¢Í ×÷È5o:αx~±-ŒAÜŸàú×Å¢2׃-­¯¿ûÆ'â×£a´þ0Îã6~Uƒhºú:_ÏÿZÞ[ïóÌÜÒ†…åµûô¾°¬/ƒþ‘h?¢¤úÜXXX}Í;óåÂ?XXú†²_Žøá«f¨Çcè ›/z€pѪê}ÕJ¤—ï@eǺUiL(_k3k\X"Ùzw\ÃÒêf¼Âö”§hqVï{~ñÊŒ?3…ãBsëróul†Ú!yð çùBšu°Ö4?¼cqG°Œ{ßã:>HõÓC/”ÂÁ¹Ö«C¯wèëT‚yk»¿¯ç½úRÿ"Ù‡Ôÿû܃Nùïgæº$²Îiß÷õï‹y²^™}Ï;Æxiæ£âkMò´¿;ò•¡¾¹Nb»Ôˆ÷ý*ü² à}Äü§Ç‚ûH£QpßÕ¨øb¬ø³¶n„á—‘•™zëå6ŒŒVRó ů§$ÿ~]½xãwÿz´xT¿õôx‘—Û’î›™) ã_)†©­âúĬJÿ·év`ï:³Ÿ6j¼y=="Ž{`ÂeÁù&eÞ KŸMG>? Ö³ï{ŸYø³*Ÿ'qŸÅAä?(<’÷v2uuߺûׄ¯h¡¯k¨Ä:ï¹áº? E2«w×P5®"Œ—ŸrÂþà!:7%~á9Æÿ Ð÷57û/(Ê8ÈþSÔãÇñnªü¹Ÿø;á~‚7Ù_Áéú¸{‘ÑÏB³ày?`ã·…õõþEþ¹wÒì—¹ÞOnoË ßcüèDü…ŸD¯ûÝ3m*ÏdÃé"[Clß3Ö¦u¾°›ß‚ëhSxkî§÷ë¾ãÇ_*Aë¿Ìy#ÛïS޳ðómø[Ï÷VB¸#ûÂé7pŸLï\<½¨úhü=7ÝŒˆ}­óÛ¢êêdÊP4Çw ñS¼O8ÏRÜQLøQj>{§ÜæI˜Ž‚zÂÆIÚP=Ï'ª¥Û·3Ó– “©ÿbt°>€÷ª%WH÷¼ciêXê¡çYâ¦Lj¸é¢‚ÛçÁÄãM®y%_ë+(›O:oE‚×wïtĸ§j0î_å'mú7*¯æýÁ³ ‰¬×É£ò>wû¼#òX—2)=\ìÜ’h½Êöœ‘ûñVZóïCÇ?2OΛ¿ÿ0Ã=mâÅob¿GcÊÓcE5â1W×÷q,ÿ9_s׉è)xo&›¿´ézéþ¹w:Ú¸ÈÎãŸÁu ÿøޑͼßï¿ï]Öú7JÄ[—RÆéñgÒ½¨“O`ìlòWþÿõÒä7¿<ºÈ¨.x»–:¦´°ú<ÐŽêšöã±ü—5¾ñyÁE-ï§Ð_óû”n/V7ˆµ¢Jfñxìw—Ö5TOï:˜uB›¯ê¹ \†ò™b=Æ¡ÞÆõÆûXÔýëe7*÷G×ímçñnÿŽæï$U·ûª™Mïÿrî¬M~Ò=/šóú‡n»ôS­C2îãºiÂüC[\œrœ¥î/×kËì}¸:ý9ð=ŽÛ·#®Î[äëü=C¼íwR]~ÑËWt ¿Í»Èúb«Î˜ë¼3?N4~Æ ã:>ò,×·8_‹{‹%ª£èjJ#òyÿH&¿ˆÉ£ƒëÛŽ¸‘KÏÂâܨ†ûë]8Eï=ú‰šf?ÏûÔ\ÀÄ<3cë#Tê¯Ã/á Šñû;m+é;s¾·“?³¯«aªøÿײiz Sèä?àÀƒóc%Dý|ê¡du*§»é­£ã¾ ±ôãàøXùQþÿÃô™eÜR1D¿òÖ;2ºn‡ù¨`Ágì«çÅ>Ï,¿Gá×ýë?ù§šŸ¸¥áßß0¿è_*ÐÏÂàò‘Ö'‰ßOÁTwéòš÷ã!Ŭg,3ãB#3íé 3þ³³Òoã-óµ™6¬ü}¬õ 7õæK”Šw?éöÅKÚl:^ÞIK•×]Œ=ìß½¼.ajëKaû˺N:×yÑÄ¢ÏüŽ¥î/ÖŒŠ§ß‡ñ»(¾ï¡÷=B%Ɖ=ã–Tü7«î“E/2å¸Z\`QGêÕßc< X'oéAùQÕ·$Í|jD›×J?4 ÷œr^̺8zÜø¼\ñŽXT‰ð¨7µ¦uŽûß |4|0š¢=otãúL6}_²ÏÆÒ°ç§‰¬}G¬q°¸)Å·!øô6ë-‡é*\³÷§à÷ -ëƒkì8ï¿Å-º•Õ,8‡¥?uÞýÕÞ3×%±óW”'LˆWŒÕMâõÿP¼ËƒÒz1¢ÍÇÞEÌ|…¨}¢ÂûJC G]ÆâÁy°¾[)~gÌü n~ŸøÄ2ß:öªkµL¦ÎšÒÄÒïÖ¿þµÑÖat¦u¹/Gñü¬.¯ê<ä:Î_ñ0„t_QWèwÑûÊþŠWzW‹qïÝNùÕMôúéÚ¥:/´¬X§‡éßë—UGÏ;yyúոꊣý4§z{é8ïÇ7ó¸¬x ¨ý“à -_5ú-I÷¹ðLjgŒj˜xÀ¸¯¨ýÉz÷qF•dæm®,åúÕ ô€þ/˜kGW\€kÜ…õ«ÍïùÙ4ã¶Ùï'ãoDÄAÄÍ{]nóqy£žŽ‡Nz×o0Î/Sëö•nxhåÞ >Nñ°P‘ù\½¿Íoí“'ð‘[ü‚ÖÁzÕ€Ê"N´ôQ°^¯eˆnŒÌï?à„—Àmý˜/—~ Üê(­NUßÖo¢õ7Á=9Áúsõ¢áïÂô÷Ñ#ÏiÏ=†ÿŸ\O¤¡÷1ZÕÊÜÿüàú{˜~5]‹º(C.å)%]ýµÐë=~ŽûÕ½cÖ9´‘êæs©®‚!õÏG?1çËî=HøÞ±\‡ÿú­¿=F žø9áE— Ðù;ßúôó>©×ƒgÓÖ<|îR"wÓÏõ‚¾žŽ¾ŠòÍ8Ï^…ñG¬'õ>0ð1úûÌ3”7î–Çϯ…þ9îEù‡Õýèÿ÷ÿ”æ/·%ÁÖ7©oó:7†â\ÕGcÕý‘ûuÊWßsŽöW‘·ÂíÝt¾äƒŸW¸tüŒ”=üwã~†¯}LñôÃ].Ý7¾]î¨04¡ŸËkÑõïkDÏã¾(N[Õ—¾§ï.rI—ˆõ0ðôš—þ?e0ùC!y«ü6üðù\ú\·¼Cõ«Ã7Ðó¿ÿޛꟸ«¶Î ñ¾ïó~äÿ¼½ wß]ºŸÒá¹­Íû~;é9­|„~ç8z゚UöÒßw=«Ï×ïÞ~©Ï&ö>Düй÷Ð<½ë8Í“o×çãyÿIJ¼Kÿb˜%îàx»ZHÞTöÛëð;‘‡ÔѼ/8_Ó««þ^>ñ}žÉç3“O¾q¯7´éµDöƒÄt/ou[õüäh¸öU—†Üǧï—mt\>–ëþ6F·¤õ/MÞNäûœq•¾_s]T ÎócÎáàþfû²Íý~³’ÅÑùãî^HûÁïêëCíÿÛ|Î_œ*†¬cÍþŠª7„Õ+ÃLö“ ½ßK_QøÙäô|ØŸYU:-œ¶ÂoZÿþàç?¥÷ªêÆcÏEÓSS:Co»ùá(bÑUúÀ絡¼‘ÄëI_æ[¼wYwìƱÿÕ-ßúyfö%¿¥ffÖÑÐë|-£ë)ŠRýiY³.û~ïʈ/#âýQJè÷U‰¶îaêï/Ÿ¼Hý¨eþö{k¸ã³`=¿Ê!¸œ§ÿg¼q]u=ì=Jñäúû—oÕ¼÷ܾÈü^æÇª|YTýÎÐññGè¨ë=£½9O‡;~“ÑõÒUgžÈc„Ä}Î×WýÅ÷}LùŽñp$¡×‰É¯uÖA}AU½@áhñõσó]](U÷ëñÖX¿ŸÕ\‡›°p }>ùy ™¿sšß¸ãí`Ý+$Õ¼s¢Þ²ïÊ£äLüRõíÂúù4?¦MпÿåÈ_¾©—ñ<‰?F•h:;(Íïgµx¸ ¬iM?û¢ï#ÌÏÂrÎûí¸×¸ÎIeÑO®›xÌ,Å¿wÍ~«ê¯ã½,ô±gš ªŸˆÜ”ùiÅ(Çú¸-,~¾¥ÿJ„äßBp>6oÕG>쾓♦Œ+x'XCLÔõ£_‰åçà`Í´ü#uÿ6}g¬Ìˈ~:f|WÇ-Æä­cøÖÀç¬úŒ ªÐw²à$¥nŽÿû„õqQ5q¨c~¾Þ‡¬Ÿ¦ë—GÕiL¹Ïý9Úu¢ââRÆ«b>•X×gV›hñèð˜ºý9Ï=dí?%õû²éBæ7+·½òWº¾ˆÐÿ‰¯¡ ŸÇõb©‹íX·“úµþù?ŠÙI¼QûUÉý9ÌphßeÁwcüŸÜðÏ+Ïçk¿ ¬oÖ—áý7n]Ê¿|š÷WVè‰%„·Sý[pï”ç|ï Çõ:¢?U¯ Å,ïÇwhW2p}“z÷ù­cŽÚéé›Å­Ó(¾vÜëZÇ=LÏ]ù9ÞGü  µ3ã7cæéúŸXê\!ú )Ç+^©êcÂû)êÏ_é{eêùZïï¨ü?=o,jh°ô•/@›Òª·É:Qäó3Ôï »V^š¶xuÅúóoKßÛz<ï.êëêåÿöUÇqÛtùÂú ©ý ßSöòÔ]PÙ²Ï,N2®EÕõ åOfÞúþ¦ÉÜ`š†ÂŒßñ&Õ¥E[ŸÂðàè#x¢œ¯Õ Êо„ ¥§s<À\'Qø•tõϤN–n4ç'”~¥#Ž!ªI¾B\C·ï wÔ ž7SoÑŸKI·q]ûE¦œwÄñ¸ 㹿,†ÕÇ2:¾Š¯PÈ’GgÞ ¦ Öóÿ“Ö¸ñλtÒë®§ºÝÄë¯( +°+°+°+°+°¯‚á‘=—²˜ù‹Œäw±w,ó0wéø¼3œÙKøNtpì+k©ûÛt1±ñÅXõÜú'§øÒ;jѵëeÖÙ¾«k0~¹ÿï™G<-X·zõªhz“"† éÜ÷^lÆ]•}—f™u?ü¿—¤:=æV¦<Øêéé.ÜP#šžBn?ºQ¾žŸ°îcëÿèÏ­˜èC(êªh·Å­'çKŸ6ùO ®÷|28yú…6oÐÞ-¯)“u t’Ö㼩ÔMa|¦0^èæ›‰g‚sñ^1ë*bí–àõ­4ó‰†ržÚ¢Çœ´aùóæºÛÕÜV­üé'îjhîÖLšâ H&î*¾ygõ:J}9úÓ¡ë_Ÿf>g•hõPéW`ɯ iÃE|{ß%á‰0]ÌA"xñ¨õ]÷¼>óKÜIupY—¹®©Î/¬h®`eÆ!Y®±¾†}$òž£-5dWý$>1ôû»ï»ô|îé¥û +º¾ä€¿ñ££Ÿ\Ê«ç’_åÖ»E)Ưˆ:úpýz÷Âé8â‰\uãÿs_jEIò¯fþð¹h¸HT²Ä /›×󯚡Uþ\Ç;͸öl¡ÿûiÄu†¿²ÔûT;ï¬âÓTÐñ¯\GnÙ+jŸŽÛo ¥OñˆxÉ‹ÿ¢ûr¾zÞ!¼Qïß—‡çž²ž>¯ãð³69—tc~Õÿ ã>jÑÉóÿ^Žü=Ô0ÏS”M†—á·\ÿê>æýnÚŒöãòïë¤Ûq˜yRç÷Vu[oÃêú(”Þóµ­‡Øü¦[_ƒçãáçlý¡ü¿ŸsÃ7©x}‹R\tAìÏÓç{Y7BTà—2ê‡{Ÿ˜ýŒòˆ'³àmý´é¦bЃÁ×zë¨/ÖLj¸³¨æ÷Éœð×XykŽý)~¾î¾àyÒÇc~jæ3XâzÿïÜg¥-ýv?‹æI^r¿¥÷w8Æ?…>L˜ÎbèuÞÇýΩ“޹ãÁë¢&çmšÕ×Yæõ]雥{ÖëŠ8ÒÕ/ÂêŸæSÑã“dçO Ëó‰Ïàëuó…7~¥˜ì·‹Òœgh xYW¶ÞŠrÜ],3ûyT“<¨0Ãòõ¼y[Ö=(ìO©zŸ5þsÔåÀêñ—¥u˜¡†…ß-êœ8ð¿Áùòûǘó>[Z¸éˆü:ÆäÒ|+q]9ø¦¹:er4îmmHW0áþ͡ךO ¾×­¿^·ùÑò’ýW¾Ä}_V³Õ;U^>,fèhî?ôe7Ôãz±%Kê½”ýÊ2m¨ŸÞ÷×TÞ,ô¸¨þòÎWbùÅ~_¹fü€÷ ÷¡täƒáÖÒúþÞ®l,?%]} ´fUÍ4ûmþNz÷qàgnñCgÁÏ]Kï‹X1ž~ ˆþŠ=“C.·yŸºÕ“pÏ~_T^·uœ‹f¿[Ì8Ìrëß—r^õhøï|²:A™²tûªºf÷-÷ÿTï\u'’Š¿Âú<].‹{_xèîšqê©RçÔ;mÿ³å/q•…ß3™áiÛü«Èãp¿y æþ¯gV§…3Ä Þ0'­çŒaæ~V6|p˜yŸ;ò‡/ä¯ëj($ô¸ûržbÉè™âÛ眞JEä³;æ_múîQóSéšÍoG–Û¼Sóµ"ê ^‘ÑýÞ׉¹ó\¢qoÜ>_a†]+Ýâ—%¾¼}‘-~¨ÒC²‡~?0ãçuv[·òYwHîý'ñ˾]ëGgV?¯é$ ü¿qYtôýë¸D0oý*}½õNæ¾KT¼½wŽõÞŒ¸Þ\dÝxÇø+¿,¿æ±÷c¡s<à›Áø÷#™¹tz9=ÒNÓó…#êd~k)ýìKýÉÂð´jžÙúùÇ ¹îÆoQ}yYw½^{Jé)©~€#ŸGæ…Òíïâš×ËoCIÆ 1Þy•y?A¿ôôÔ2exêo&Y§ÆCÿ• Oæ"Ç[¬#në×åë,…ÌTÐãXYïTxš¨÷‰JìW^Û2n:ì½ø²ã§ÑÖÜ7…ù½)-ðFÙÉÄKI™÷ºùùÇÕ•O ç–”~•?ÞûÌ;+ÎøK‚Øã‹ñ¼ÓÓ• ÓÿWþƒšgê÷¨”Ìû„QGÍ¿/쨿+×öÐûªûe¶x=¿Lùcª/«í=B¡„tØ,æó\g‰ûÞpˇû}?ÇN$ßáu£›ªãC½˜u>ÆCÇÅWâ–C”‡(rÜžzœöDŸXyjçûÚû³L –Éþ5X´‰ðWË:™óŽy+e6ÞŽóý-ÜcæSŒx"-ÿ•‚çò Ï÷í_×׿7¾:¶aýb•ζì'í½™?zÿW / ¼„8Ç@Æ7–ñûKºíûøyçiFýöúï®Kqñ5f~Pº†åÿ Ü_¼c*î¾&pß½#íªnƒœêÁ8ë[¦Gë[±¸kྜéúÙå6L7?O¬~‡ðÐ"/èãpY7÷½d®»ökFñfînþfDÊ1¯d@¯xø‰‘}‰s°¥¢ÎZþ`ðñMÏó%ϺíŸ6VWöSï1ªˆï]ô;Â®ÞÆxe…ßXÄÂüþƧŒx3æmª<^ÔÏ•ru­Œ}H¬ÇOºhîow œŽÃîó5-¤ú¹ F¼¸t=¥û;Jÿ>Í>¡×Ÿx§¹^.òMŠŠµ7ëñ¸¥OA~™Â)F=mÌù¿ëž_ÄÓ¯þ»ÒC¾ãŠÀàÆÛ¯(¾YJ?Ë9ÏÅ‚ß[ìmÎï÷<ŸÑ:ÄÖ·!eœ‰ÇÉŸ)Æû݊”/x:föÛ}3ªWŽ ? uãÐ=ÌïqR8£t וŸÄþÞÆ8Õ;Ò®a´ün¿Šô¯>¼ê*Áë –¾EúwÄÓu8æxÜ·ãÐÙ×[Ç=+xÐûG:ùé²ÿ–ìÇn}.ûCnÌùý/›arqÒ}zÇï\*dݱ#Ö:䌽ÿOt¼oçš×´Ž¸é—Š·ŠiÛƒë¢^#uUPˆ÷ŸU3ƒq@²®Í}¡dc”f}?Ç>ÅÖë]•™ýÄÖó«f¨@ùºtûÊ+4üͶB÷fgàý««ÎcÃØ»ÓÒµôÇéû‚9¿¼÷™@ü ¯7Þùˆúm9f\pÊq7Ä«£ È¯géÏß;ŸÎçUéåÙÓ¾þ®\³ÞoH_ Ïç®óÑðÀߥtGmóÍ.N,Š;öG:â6žkþBÕi¥ÿÕ°­£Ž qä²î·¸*Þ>…·™×¡Ï…™f}ÿï7ÿw ?—?fÃi¨ý9êxÖëDÄwú÷‘m¹¿¿1¾·ÞøÂwÉ/hù2´.X|IÞ¹LÌ~Ü?lÓÛB®Kµ\ÿÁ2H‡#š‹åï›y¶§ùïåOVÇ<ßáéùz”Š÷^DÅÉb€Ð7ÞúâœwÙÛ‹ògsæ®Tè$b,㬗î׿Ï3ÁŸ+ê};Ç;]žÊ—õÑ;nÁ©Ts«„êÊç¡Ï0npÛáHŸÃÝðg(r?·îߘÕDÏË>ª¿„ë}û罨<šäÂ+®¯s;Cê‹Qõs® Æ#e g®úV§ÜO‡àû÷~‚? †Ýg’ÁÇu«oý²ä_ÐмyÿÖuбï#·~"!|·{'¢é!§kè;÷ûR4cÜÏcµ£¤ùº·,ù¥j\?nfX4±àêy¿WõKï´¥~,t±¼¤ö†ÍOY•ø ›¡˜ˆkç]£ãøý„^§(ó¸Tþeùñà~V ï%! ?^õa·ž_™ùê7ü3ÿ%úk (¯3=»GZ¿0bT°þtcæSõýÔ/ÆË‡£dfð—8ÔM×Á·è[¢*Ÿ'Câîü¹ÛS¿#t ?[žÀÕ\óU>0{†/ÐÓ܇Éï'²t½¾O¼(â…~&ÞQ±ž|È:· ,ëÀ§–üIŸ­t?å'Ò€¹˜¹:QÿåCê€]Í~\ºýÁT¼ ô¼hðNòOÁCK\[RàÐx½Eq±Žõ²nwN‘ë˜Fu ï¡ëý}2?¦Ö·¸Ÿ?åy~‰Úg¤MºxS´kêTÀºNy+”º!Ý‹¯‹sÚ¥UOôNFŒ‡{ãeÞ\¾¿)ãõ¥ Þç)‡èÞùþBÞú¿XOp_9½ž6`ƒ>>³è¾ÊyÁyb©ó‘rÿ!:ç(l‰ã³óG2þ÷¤ð3²é|ï]ÆÍÕcÿˆù=Èf?-‹ŸW]^÷wD}o•7C öÎíÞKÄÏÂâ®±¾O©[iÿ4ç{›ˆzÎ1þyÂ-ϨtÁÐ Z_wÙ×ù÷¬ÓÙ¥ôùÀõ ä–N”ωöÿcÑ=oTÅ¡z<|ʱNîGzÞ ë‚ëF›Ê“ÿÌy6LëýÂÌnä÷¤õCù)ǵ8¡±Áx´%³ª b[½Å;ž™u x>r¿<™O9¾­Ï؉ޗ÷Ezuô¢¾KØÈó N´ñ¼ÏEßÉ\süëÿ½lHž³:çQ¿ù-î3!y#*®Aåçè~^íôy0±ŸŽÿîHŸCÆë)Ÿ_ÕéY7KþH÷Ïù9«¾±M‹ëŠ*eËßbyyÊWåÿƒùMBG@æ°â»Œ3¥ø-gš»ÕM?ùtz<ª”Ï3eª>ú%£C‚æ!~þQ>.ï÷æ÷µ¢9¯â}’/ÜR†òm7|Ë'£Š™?Рߣõ¼w¼ü™êÏíã«Kó< Ñ©õÏ/œJéÏ×4³¼ˆÚüÏ`ül™4y"éó#·_¬|päëUïï”t\ºEUêË`Þ=‰Ôw%ŸcÎë~ÇÂ)`—®7ƒÑ¯›ß¯¼næ:Z's¿@4O¶>m3¬:|égJõ}‡¬Ê볪k‡ôA¥hºŠXøSÊ'Ôã|IÏëÍ:»¢žªêd):&b½Rq°íú¶Ïãý]䇮±•ΣŒÊÇrÆ{Éÿ·q½‚8oÍTGœóKý9‰} óP|0ë}>ðý¦¼½tþ}º—p¸ñçÁ8§ñ5Èß°ø{)÷§p/•Å{½¾%Å«#¿–OÜÚngI·}¼J4>ŒŠ£¥ÿ…ãñAùåþuª¹½‡èÌëaDž›u¼±„›«ŽRn~'t¡¸¦ ¿ š“ßÓ³"á ^yt?¼n´-&¾Z3žJäOÐ׬»‡B!ñtïªB?­=Ícæ†õ)ÀrÊ/`Ñ4T^qÄ“nóuÄfzŸëó ¹uÿ»åA%n> õpÌJ·¾\uÌß76<â†C)é†+Aÿÿ5×Á©z&ד‰[‡Qžbãoèü±Oè뜌ûšÓº‹ÜbúzÜóeÌþ-Š2þ¯½ߎšì¿É~ˆ¿…Y¥Õ°Z3þjxG£?‰ÑÖ;TJhýpÔüû,¯ž¡¸`æ_ƒ÷µÆééœ+³Õ|<î Æ‹n­AóîÚ]Ú¿›ýNÅqQ k/‚*œ?î£óÃd܈•c"ÕçQ…ßß¼ki=^“GºXŒSºÕ¾¾1×±Þ<ƒQÆÂŸ]Ôœ—f}t#Z…WǹÑê œxTCß·Íù×Z"¯V9„µà¨qžºö A?J”bîXZ¯ñ• ×›_u ‹Ò£EO¿¶À‹8˯“äÄë_¡òXxôÏÈOØD×g\0và×–'?wï½´îý—ž?[SŸâ±ÁÏÐ{¹·>wëToù|=.X.x¼{¦iü=zþFàâ1žï¿ÿž<Â\÷Äæ²úÿ·{ä7ˆ>9Øõ=ýù.ëfõ;Z ü–ãô=.¡}«ÎãBŒ˜Dq·òƒ…޲u]b´ü^ðº[M蛼ïW`YMOt:äø•×éúš}fQ\Îër/š÷û*nù2´cÚ¶%füAeö??ˆÆÓ“ý¯ÂL擜ÏSy‰ºŽþù¶5úsìýxpß  å8Ë>çj(– n ̓uË0!XWÄzÞÔA7Ÿ2çi0q“_¦ê„~ÿæm¡nzõ¤¤ ƒœ/®-U[¢åŸš1?§…À Õc?ùν*ö¡9„‹Å¦ñäg3BÖ%±¿ùÙ).Qº±?W;ÁëÛÏñ3ó#0a‚žg«çæwI}¸”ëìNŸ·ÇI¬Gã}Îy€bnñ­uüÏÒÏ9Û2¢…Æãu½®#c3éubm.̓"¼¿÷ =d[ÿnÁûXöóùŽ_¢âO•ÿí÷ÓYÑZ;ßûŒã¢ânï!îÜAûkDÞ„â¯Xÿ®òå×çó\ ­ÎbûU‘Þï­Ìò¨”)þ~èq#MG€*œ϶쿅9þgý;ÌüçQùôbþïyá/¸5ý°>Ha}Jl†y3ÍyÿÊÁøá¨&yèè§çï½³æëaÝË”—³ÕAÛG˯aÝ3Á:®™ñ›’§ò·¶~ÔØp'ù!}ÙSt>GÏÖñÑÙnë‘z¾¨ÆyÊ>ytþžïëãYüw¬¼MÇ|ì¡¥n6ïUýýhs,˜ßס¿1oœòùÒó¯»0+øï8î($ÖÏ¿Ðñ4ù¼²ÿ†õúOçÛ5?ÿ”‡AåG§ç/IÝ*•ß =O¼/Î×;)þ/ü4އóCNvp×á1zöý˜ü‹÷Ö?¯Ip>-åøÙëÍ¿ÏæÑúÇUḤ¼ÛúŒv?IÙJ¯ øg©à}s*èú3³º1?›ñm1÷­L›÷i¼º£wœãÜ0þwÃàºõ¼j×›7㽇)×Û™>WOçóhu€È÷aѯO9®‚[~Ï–—G¿×¨ŽÕàuM)åü£!÷z«ªå¸7šyÔ}ÍÖÿý ÑäÕ×5+ßWÔcë¬þq¤º!:>K?«Š<æˆFúz<@×YÂ7'?oÄY }ç8¥¸ÛûŒwGÂ) ™y½ÂÕ´¿aÕ Áx/ î-席¿ŠÆsSºdõÅü¸ ê #u}É0}Ф uÒÃbÝŸÎǤæÕRfËßÅë@)ù± äH 9½¿~ʾçYTý¿È}¬ZSüŽÊéñ¯×0XÿAZ˜îfèõŠÅÔ‡Šø•.œk?¯Ðñ. üÞ8®ó-ùÂXÇÆ’Ù:^ýítû §Ü— ÒõÏõu<Þwè¥zÃO–_t£›ˆŸÚ[âTU÷}(8¯Øòh¢Úå1}?í\ÿ–ºˆØó:å©û–×ùóÓ¾oö϶>KõDÆ¢‰å¾XïÈ¢ü»#~\êÆûãþz<}ˆâúxX»“ð !ëöÝHëHÞ×ôy[/ßPá­SüÓ½Áÿ\7„¿ÎøÊ¨zŽaýj°}’6¿^Æÿ¿äƒ—¶î*ÿÀAÏ5’a’®,Qœózð>õ‰ðS7róÛfÜe|þÖüVqßž}-½)ß„ÞÍô¼íøo™qZ«6ó37¿iÆßcžScDZ$  úð`÷}º_\Šö æ• P2ß+M$ÿBôB+Ýï ëéëZu#^ªäaÛpÒlõxt7ëV`œ¹>P"_é~£‹™ÿ•rž%êߟØ×€ÅWD~?]ÿGFYxtK­ãçŸßÿ}“Ÿ§•ßD§FwÓñc)üœ¼z\ó æúzGó#SîgMó|,iÑvUà{ëý›õêë÷‹EË#å+1ãÝ´pP¥ãm~,FÞBu‚ߊ´þZ¯Û$3:Oa}­÷“O}Α{ÒŒ{ÏìW¨|6v|ä–?Øp3áU^ bpQõ1@væëñy‹ÊêóBôiC7Þ¿j[pÍÜ/ÀÇ£ûÊê4ׇ†Ñòú²/–ÿ³¨Ð§ô±²í×cf1{~°¾àÜ´oŠ÷Bõ Àà;t/êù#o½gg£úrZÏçxÕ†;F;îÇÐ,„o»â·ôÜo¾p޳6R~¤/‚?÷üMÆý]áØýõí]þ¿êk©ôÛäêñ(ûÞ§Áó_æmºÏM:hO¸L¥‡o÷U‹_=Ð¬Û ¿÷”¿ ]äN‰†S,üý«|>füˆò\ß@c„ß0O¬Ïñµô÷°˜Ï8»'ûNWû׊æïcþ(šœ_÷ù³;÷P\´’õ³¦Rü)çð§dêšU㭯ؾYË›±.tš0¨W2|úÞOëùŽSŒC¾}}zx¾—Òä43û‘¨nÙäE¿&½‡6>1*%‹/òûw D–ô“•?ŽëZ™ã™Ä'B?Ç<ãY÷ÿ‚ëj½ü$xßIÁqTyÆ–÷whO½FÈþþ¡îo)Ü+VtÒ¯?HèVòú¯t<ý:I#æu®ø/3ÞZéf¼Æü˜Ú|~ ‘Oe®Wª¼=ÖW¡×ó¾¬ß™õÍÓú×›qX×KZ4-Rü&¬Só’ª[±»ŠÛ`ú’~ŽÜ’–Ÿ¡êŽ~ÜóåoóõG‹5.6Ñ׫\¯Y±3V>eBê‘ÓÉŸÇÈîäŸXxX‘¯[1¢.AÌüe\‹ÿ?™,®ÕãùÒOôÇúè)8ŪŽ|çõÖfdÞ_ü¿ïü[Zó Ûþ+8¯;a„þÿ½ÌÇ–üôæœ÷ÚØ:RÝ…ÝÞ¥7ïÿ¿!­o(Ì|ùÏEüÛêK¨ÌºrçY×içmjG{Ÿüq«‹ë¬ðÌûíü_çO`SI³ÿ1s[Zù^‰ûóǦÏG¬4óu±ä¯Ìçú­àãbÅ5ŠÏ€vÑú¯â—æÜñ ‘×yG«Þ檗tœó5±\è„Îl ÷vR÷gÿs½Ê4ïBâÓ¨&ëjèÌñᾦn¸Öö‹È>Êÿ¯Çù%¥U)".Ä1ïûU1¬*ä¶Þ‡ð¾RŽÁ÷$e˜õ)­ƒÛ)¾÷ë} æ{æÎÛï£ü¿ê[·µI°>Ú¦«éz<3Ñ:Øõu?ßyög0æ/f`'Öó-dË·‰8®ëMúþuë Úzç÷=Z$ô5N‰ûRõ÷\ÏW^?»¸ùá(ÄëëäcÂ×è{™Åyyå/'B1js~sñ—0=ÆY0@¿þÈ3z¾éáIk´}tÝm䯶e|Ãè7õçtp!ŧÜÿ 7•×ãß{ —žÑôrmúcÖ㋈ýco)³E_Ž—? /Ž"âÿ•¹.6c­À[Âm¼ ó‚ãë}J‹®F•Óñ+\‡@žG-Å>¡ôXûVø÷ù~4¿Õµ¯ ö¾EuŒŠ‚opŒZêt)ã4Ë£Ÿ¢¿½ÚwÑ÷¦Œâ©ÐIäŸz1NLèÿØÌ×qâúj»ûÿ¯»‡Í=éø)è~ÞiËûR>8…¢Ǻk)OÒ xWé±­¢†^R‡õùûèbÑÛó]s}RÄØß_ÛŸüþä öÓçêÈ~qws^Ïç–Q‰æ“6é÷JSóÖy¼B÷\<š§ô$Q)='˜'çjÊ_µ^¿ç‘óºWºE}¿l†&Ÿ?ºU7ó~ÞbÝ'‹k3Ù_ã?¿wó×1©í‡#õ>T蘌þ6Q"ÓûƒE?ð¯ÂXGMÝò Øò4½Ç3s‚+"ôÒö¾Dq ÷™Å5‹"=wì* ³æõjìAZg™ŸŠµÌ7[ÙXÏw3/ʦ+†,Χ ŽËQÓÂטaη¥Þï=t=™‡Æý¬ÑÛ¬Ûƒ]»¢éª¾.âlÖE3>Ã…ß±k¨[iݯô¼àŒ.ÉÄ·}I¯ë:Ó<Îf~ÛXÎËô#Ü©ì7np‡²œÿ[ðWý½8ô´®³)ð ˜ò z–?­ñ9üãG œL×Tý‚1 ôõ¢ç‰EÿOì¼ò‰+âÕE¥ù}tzû˜¯ã¥°€€!h`žÿÞ)ý¾>«ˆï„%Óõz`vž¢ßvú>æü\ÿžØ¡×7pÝòmË{9MÄß‚Ÿ`Ó1Dñ=tÕýpk_ˆ¶Ç¾ûùWÅPÊ‚ã/ï„™Mg ¥xñCýýiþœöþJ~—«aEs¹6ç-ºŒèLõ`4`®¿‡=IÇEòÃ]Í;O‚ºæ<‹ê{Œìh¸Ð¤ «oÖuЖ°N¦‡”®aV_Ý®nöC±å:ZG›[öÛ9ÇUcHÏûF×ÝD?+àhàýû|ôýc Ô /å/*êó7‹qÜïÇÆCò¯/ðn}êÆÂùúú1ìO+¼ë¨lÙ§8ßì`>NÊõ,úŒ¸†Öu,êlö÷%¾ª¨å¾JñóíÍz>/šýf›aÙ_ÓòÓüqzYô«"âdŸYÌ»6Öýaî5”7šx·^·hÊxÍS"áíÑ=$߸öŠÇŠ ½¦Ï8Ìé)Ï2~]7ëùÃÒã7*|«ÿÿášûá3ô^mùƒ‰o~~¿ŸÒ7=ÜNñt…Q‹÷ã#¢ñ{}WŸO-¢ŽàÛ‰>~¨Ê|‚JŽºAЇ7…ð®(Êõ÷œß›e¾Ïµ%Í8òYë)OWÓRG,Ìã³n èzMh™¬®ˆÊ+G>Oè6ÙøäÎã‰Bô|QÍ’™sD÷븄μ¯ü¥9.¹ó¿ôz¦Äk=x¢Q .S'=x'8ïåŸW\¼7ÜW¨ÞåÑ·á{±´†Ùß~WŒ?gš¨¦ýw~Ç¢7¥úh¤ü^á¼ö•0ã6Îóþ÷sö“v˜q¥¥Dœ¿»v4ÿ='Ù:'ÆüBÇ&ÞFþѤâõ™d¼-JóÏï~;ûÒ|Xȸ±[§Ÿõ…0±~_«ï¡xièËôýVN7µ_ÞëÁþ‚õ¼ªkÍYIñ£Mg£¿ÙÅÂÞúû±­4+Ÿi$ów,}‰PÉüÜ¥þ^˜¡žØ'¸o Vì ^œÒ‡*£Çw8°•æáª;¢CŽ®—ñè]Å/å;z0¾cÍOhÝ á«bæïÈOlcù^êÑúî]ù©i„KTùôuÉ[ªç5‘Ç•§ë®(=Ùqœ?`>˜Š/0ì;ôþ Ô×+Ÿ§qÛuäw¬y‘>GOŽóú1^a¶Î÷ñÞä÷ù¦õçÛßœ÷ÁÊa:œõe°‚rxhi×Kþt%‘šû'ÚïÚ±>A)Λ0O y=ع30ŽW8%ôäþ€ y¼Õ¯Ñ÷˼;ÌÙ‘¯…Å÷<|¸çèdöÓÚã‰1ø¨ö}½Ê¢ë__ø­*nYûT"y»苦¬÷3¾_ˆN¥£îü’‘p¼¶þÈa¼Yd›÷uï·n}ŒÐàjcŠ 7éþËš¾zݹ_H<õ<çc§<£çsª‹ý³i×`'Ä/Vë‰õïZê%‹²ÍëßÔ7Íþ룥Û~¤ò’¶~µÖó„ÿ—³_ÑxßÞg–ýJåG§¼­~qŒÏ«&ê©³Þ ?yD3'ÜVIFiÇË´O´+¢ë±Äôs°õ,í?Ÿrœ9òÚhÏÇR‡KákYt(UÿµÎù¿Ï¡zг®¿T`öU2,(­çç‡~Ÿø¸çüç/±rŒÙP~ë±¾’åØÏÌaœQÂßÈø³Ñ߇ÐŒQÔãt®³J¾³ô£æÃýë/ÊÒï§¹èo”ó˜Ž?èÅÏ©×X§m¸^þEþàl†j&?ï8û y?0ç‰î9‘ˆˆ%Åh^I]kÏ÷÷ÍI„WSº‡‘¯—ÍzíÍýýãêFįïøoz^“(¯ŽÎŒÃš¢ãkmù$…ßJ©kÏ™¤ÇíhÞ)ÿBå#T=õ‚ë+ÞûÌGh`‰7ˆô‰P¼âáïšë’µÜ¾”ÑýNŸŸÁºôØ1žÇéá†âYòªKîÖ¿ÖkÇ 2f|R!Ͼ_ÇíYø;þß…^_˜9óS‹3ïò#ö‹¹ÿ˜êËr|C'°®i˜¿‡M¯ý-_'QᙫrÞ¡ÿTFmž¯ ÍzÚ¸…7ô2ã,R®{Aòb)‚æ–:ûŠ«mýüã|ÞÿòŒûQïål]Ç#îþã_gH½÷ü½añ¿è½ÏÕy½ØÚ&­gÒ†µÃi=*­¾›T>Oâ·£î—ÛP,¤N9ÿÛ×v‰¦§äjª>á`½Žâ¾G)|²#ÁÇc÷ ”÷°è)>š÷1ûõËY+÷å,º%þø­ÌÏ +k™ë`E¸=ãmºÎÆb!Ÿ8“ñQÊß9¡úSøºûuÙÿÚ~†öé¦Áøol½'utIó>Äù’°Ÿü}Êõwt%?t÷ªÿ·Öq~Oý`dž•X?ëßâû[¹UÏÏiHó¯h´}MÝpç˜û“üÑol¯çg°ú3MGßzÞšiݸv9Þéñf¬8Êù¾sš¦•ñǽK÷ Ç‹§SúGu%Ze^‚ä÷õJ÷ÎÅõÿìgýw aÞãô_ÄËÏ·ïËõ5Íx±!z|ù»tÝ£âøNŒ×až‡Ÿü4šÿ‡:n>¬ß«w,8àT:–ü£cˆt-ª.;úèúQjýíWÑçQ8-æÏIvT‰Æ_@ïŠN~½÷¹y³â>Žç§+ÿÿ Üö#×uÍ×÷Þ·Ðú°b¦g,u®ºE¬k5O†7‡2žlXbÕ_dõ=ÁùN[ŸÚšO,}ØiD) bâÐDßCÔ†£õãŽ}ï˜ui~—^^Ú5ÕT_+Ù§ã«b˜U1’ߦúî¨z†œ <ßÚ÷}°y}Pë°ÂÙ†ÞO_ƒKÿ›e῟M‡7Ä¿ð;"®³oÅ•5bæûßÃ-8÷™[ŒïcX?ø”qŠ8Ö_¯ýÝ‘7Sæ½'xiKW™ó»?¦„Ÿª?ú¿_ׂü¾‰ºž¥ÔUMo~§òÍõ-øˆOï½wð|­É¼¡Šfÿ[êV§|Ž*¢>\‘ëå ÷0ú}EŽ«¯Ž§;ˆ›£y90DaëlMxÞŒ7=Ë8„I‹ w²Ò²®¼=R¼ƒâ¼Ní8–Hœä{ð·z¼”·ÂÍ*Æy¦å'£ÕŠtb°|yºC˜ƒá:Zm¸}\KõïtÞâºÍzœØÕ\·éÒ àY`ŒYï΢SÕ0d™Ž“y¡^§yø­÷ÍzyCtˆ÷¯—S`^‹[ÝK‰gƒ[{ú³IõOñyÙœ¿Pùâ™÷R>m õýÄØ±òyŠ úû×íŒ'‘<dë`ZÇá¸Ö;£ç?QRè-1.Uå Њù¸}ƒqa†*̃°ÄQèDóZé;[B䙿§y3Œðþ®õ-Ù?;ªášù´ÞoؘkÊ÷Çñ3š—íÌï“ô«¥n]ÊýO:Ù•çV5æýª¾ëŘ·X‰×å¯.ì¥àu@éߣnH?ùzBß¡X¼<–ò|yÍÔãÆãGý@÷O¯q=f¿$q*ÿêŠ_òïwX2ó5]Ãðhz˶: ªrÝjÓÇf\Ýö\ý½*,ÞQo“ºñ)ã Ù+Žt>~ÎrÂë3ÖU¿ |ܧõüg!w¬¹ÍìןtÄɵpÓÛ’ùïbzxTÿú]x”ûùXW½ ï³¼ñÈî7Ì0¥ ÕïÏPÔ±þ·8jKŠG³øÿÌ+÷û’<ù‚^ïá~*~߇†üsû^·ývÿ'¢GäëËô¢}Tñ뜟ÆO‡ä‰3óÏpô 7ܺ²^à‚gY#D'z$ñÉ1zU¤}À;Çu‹ U g±â-Ö]OÏKÔwPÞÒ?FÕ¥Oūנ­X&þ5¸Þ^‹ãý) ·ò|È{1‡Xo%Ÿß\§rå)¡4×Ó¾ÖÒ§ÇÕÅÆÚiÕ÷•^¢uüž³œöclFŸgs%³ É*uÀåè=[ýOŠÞ×÷M©ã¡â7œVÉæÇ­õ®ãéáÑã×ùÊ[C…ˆ:¯JÏ#çÞXïá•f¨¯f²^dÓ#ÂÔv¾4çEE¿ì;c®K¼<¿½o‡è,Yúvù×­hÑ#õ`,ïèTw†WG_YwÍ;RÏwÔ£ˆªCr+óôx¸QL^ëÐí´nmû'ù9«úR|9PÇW¤[_ ½”÷sí[ŽBþb¯xúq®ËÌA3.kÿ ã‚O‰÷¥¸£~ICQǺ-xÜüžrŸx.BšMgÝ/§ˆyœfÉ?¸0ÇþæØÔÐé{ô.ïgJ‡Í×+ ãɰ&›ü¾õÔ— Åz¡ôå·¢ã*‹ï¯×s«‰ýþ¼ø~j²¾l)å?wü‹pÃÇq#‹÷]úœÞçì÷å- ö‡·T ¸ ¯[‚/:_ˆçˆÑò<¨âg]kÖ%rÕ‹÷gœ/VÞ+σJæûTuEïùƒ'MÚ|þnˆÎ˜24uÙ/èy¾­mƒßÿ%ÌÓ~¸Þ¥‡öÓ÷Ò”×™ýë¸ëVQÖñ¡Œî3Q ûR)Vk)p”¸ÕÇs»™óËçE¾¸bfõf°¡†¾N5åømu=þ®’/®ÄuÙb}­,ñª¬ß`ÑŠkÞ³ñø–®†Ý5Ìû^;ÎÏæºÖu{õýþ¯1qëˆÐªôpUŸ%ÿï‹Néõ%KÞÁï3ÅëgôøZ˜w'ý¼šöuÕ?AÖߢê|‡ádïoå¡ÐGðG ÓuÏf ¢ùz ¬™—3ìûfýrîc¥ôHüã-üò+Ý€VÝ÷°ê5ÝŸš[_×|Û¼/cžØ—®£ú÷¯³»_4󖿪ãrwo7®ßX3FÿY®«•Pú Éøè-ÞÛ‰fœ®ÿ÷’b¿ØQßm__uM,½ŒiOgáç—¡ ãÁ¾Y7^¾µŸ…¿\’çWÉxëvRæë5ö#Ü&=K÷Ç|€0¾–Ço³†Þáÿ+ž¥¯S]NåoÙQù\QïöÎ üœè烞Œ³ä¸•Ä}}"x™!ñ¦º¾äa˜yÝòÎYxxŸ„ä—,u>l¼HþP~ž)/‚†‡óHX~ ÕåW4×ó4S©ÎÍïÐóUú»›ÿNûôD½?žÒÅ$ÒÑ Ë?ùç9î§8ð-3Þ¨¥[~ +)Áþƒô\ªþ]Ó•Å[è¸Ä;T}žÞëÿ¥ó'¼Ç<ÒÛéçþoÒº¼ë.zŽ çÑx[Êï@eö«›siV!}ž…ð<×ó™\遲*a™/טyªöå2¬íŸ¨Î–ôÔýãs¢¾ÙPàJ¸åGâò—üómqƒ+¾«ëa7Ì‹{ æqÛR|Ãtÿ©¦Àg·Óß7•ïòÿ?¨(óóÕñÁúqÍÖ·³Æf4~W¼AÜ2ÇÌ|xí+ QžH|ßXùRpŠmô|g^·‡ô5ûOãY÷°×Á‚zèK_0V]HV§lÑ/Ì:ò¹¼?Œ7ëÙúPÃãù]Á-¯•T¿†¨†â!yûRÌ3ý‘…OÔ?'÷kóß,XÜ?΢»‚Z"N®#üP¥#5ŽñÀ¬£*ý8Œþ–žGq^Ìã¬Hq¶žE,¸‡3‚ïqó"=ßÂø?UÃÞùÁ8мcôù:²žôà—t=Yæ¡"û3ã&éyÀÜ­Áã'¾uXÂöyý¿WÕߥ—­ð•J?Õv¾?N ]§…"ò‹³’Á¥E5 ¹ÏM_M}O-ÒÄ7÷ÉéýJ9¯%å·0³Q¤zˆßï0¤oJŠÎ½ÅßµžŸ¦ž äå{óò“Ìθú}ØÂýR¸ßµkßÿ|©/2v­õ,<–ŠÁqêYðjo%ÃëöÇ{ײ¯ä¬‰Tçs¾žMÇd¼÷)ÌPÑW5=¼ŽÔÙ•uÒ°ºIXåLY _À£çöŸÓ|RžâñlñùÏò~[NäI7Œ1h»N_·Œ–úz¢ðÈØ¸Œò!:¡×Ûy”ë~Ä»R}ãÐ>ÇèW¢ç¡…n†Êƒ)|:ˆä?#7~Öv«kÚtÖ±Œý΢­ÛþŽ%[¨^6ðgNþšÂóýçºçÍu™£ü÷¥;u¿±§Û:‡¼ªÆ}_æÛ0ú–`?¬ÓR=?*꾿Øâ~}þŽ|Ò·àz³îÙÅ+³‰5:ãjýóaÜ‚â6å¼á,æÅu©iÖ)SñnQÁ¯SúùGyü ߉Æsaþ¶üRçYF¬cJCM :Ÿ†aO¹ÅŸ–zš­Ÿ1?sô„Hþ€wÒõÈhæ6¿¯)új›{˜ùý££Õ3QÏm}ðõ jGÔ‹Z9•ÖI•çŸÒ—Öýœ n:wÊqœWõÅÀ½’ÌÓ¹âUÃÌ×QÁµz§Åy7iÓùD%Æswäýnâ½Ô x_Æ êÛ¢ú^Xë!ÖãNÄ“sÅ•HÞ%3ŸdÐ"ýýW¼Ÿ&æ~ªæ}Êßç¿Íþ¤¿æœvËÏ´çç·ê^WöÉá|‡ä›a†Ð‘,oŽ»-p>‡&ó¿Î¯«qû¬ú×·ô‹°^/æ{€Qw;íJ÷-còh{<¬Ëš&ž<åz­ÝôBÇ™,ü§¬|Ò³‹‰» 347çC•^¯õ¼‘¿Ì?9¿ Ë7êy¡™£(oÉ}šý~.M£é¨¾bþ¸-Ø/lhÓ·mÄ›¡V¿™#ÿl:9j˜9öÓ‹ÿi2éF ¬yò>–7ÃÆ³ô¹w~¤çZö öëRúTžþ’úý1þǘëÝÂýúÿç =ÛU:Î.¥ßŽÂÔ´Ä•WsÝhî7ÌþëßcÛVýù Ö!óóžü=ºêŠ#ÇâþÝ2/³è¹zg¹ÞÔ’âŒéoÎßU¼@Î÷ Ý–ÀýËû¾À ¯ÝHqxî\³®NŽYÅ×霬ë§Ô§‹³ÿÚF¯ŸJܹߧmÍ7è{V¸àFb„ôQý\¼Ó\·Ry†b–|&û )u£vQùÀâs_ÅyþUOßt$äücœ9Rgi t~+ñúÕ’ê&¸J¼ÏœGFGÐñXWCá¸^Á·´[¯×›æ´5¯g‹I˜AõMDîûÁz"*Ÿ1«MpÝiA0$Wg¿×üþ”[[FÊ«¢¡ž¿ÀÄîÑê_ëÍõLtf|S?®_V°èhõ}Pÿÿö>åÅÅ5Œ2¿Ï˜u£_°ë­WCu|·÷nH¤¬cÇuïsÁ—b}Yµ`Ö¿ôüSÄ>}®fËç¤÷Q¼¸Bz¹é »šŸ§V~Yîï ÇW‹qÖ¬«†²Œ?m©¯Û¶ýYê1H]‰ÿøŸ:>á ЈüRŒ¹M¯+œW¯(°+°»R uBô T>2›ySøùƒãém¥\¿q°Ÿ¡‚ùÛ!ùWt ΋ùÇõ"‰o€¾œoµÔÕЄ÷ÿS¢Î=ÿ}ßb>:&¾Ç¼\ö„.4z2Ç•²_Ðæ›É¿Þý?:>8`Ó§SzVþ8u«0Ž/‹)Þ6üò){¿™ÿ×ï‡U‹¾÷°ç‡YKt¿ã(ÿ¾žEåñK¡©~p%7þ•Ô!MÊДçu7¿Už‹ña*ªïÒœy7…ù=T:ªcnÒuZ,u”Ȱ.HŸ‡Ýðò«:¸á.Ât-bâÓRî'DO_êÚ:ÛTä‰ë˜a¦p€ÞÇÿÓЭ®ðŸþº‹4>×룱Ðíª'ôáJ³Þ¨?`ú:=^}í½‹œG9\'#¸F…—C þ)úÒ»®º²p'*ÞË”¡ˆØ/×Óç‚ñ@±¯;´afúØÖM÷éóüBô!ýãnºIp}Ȇ›Uú7‘ï³X´~õhP<Öz…ÙÿÔ÷÷¼”ó¸E?lÞ­Æç'óÆþï ‰yŒþ*òôÿWÌðþY>³ù_©»åÿÞR×s—ý=li“_PáŒÔÿe½\öKÊ׊üåì@èôubÍo›ÿ’¢¯Õ•õUè8Y¬Š§•r½£åõ9ê—fýHZÇå~kë©ú¥ü¾vþÔGl¼É3U}á>uļ­¼ÏH¼PÊõØ¿÷û5Zðþ)ãvޑȾUÿ5Bphõ‚×ϰ>\¡×¯löceCâ+U~"îue?/,}Zßgj;êTàxÝ1ž ½¯#–ë²£ñSКq.â9¢lHƒñûœö?_Äú–hr|î ×õ§úp.ÓR?B§—Íñté„õŠMéŸû׫l~¾aº×ißóM® E‡¤gï¶K'ýøne‰7ʺÚóÝ= ›hkÁÍÔ©3Ö•t•°kF¤õecâØ…^¤Ô‡KÚÐXü?f_æ¤LåwQ6¦^ovp\‚2âùZtšP6ÙçnÓÝA þ{Ì8]ù‰èx¿Ù/Ê­éýë¼9²Ó‹“åº$û.`hDxŠR·@âPшñ"3…žµâs7t«ŸHC‹x¼NÔ÷WC<'KýEê ú¿g½ÙÝ?wV$¿Ù_pÜæW‰ï³e¼ZÁ8CÔ°ì» (>ÇÁ£úþQAêo±~BaË{>ûv7}éÆÄ;Æfnu…JŒ§ éïé_("¶£å¹¬?MëgËàü…uÜb!ºiÜÙÏ»Å3ëq϶[ÒÊß*ÞxÜóÃÌÚçÃñ{tí+Œ©?ÐçmÖ—S3®¡È“°î¯Œ·p]=ßQ2Mþx;ÒO–õ{ï33Ž …3Ó_NqÇ»þÒ§?¶aðû‰Ùñú4†™Ì»Y¯_HøÿEÒã…§ŒÏ}Ò¬º¨3ugT]ޤ ÅN²G„õCa ﯮ*ta¤^väûßp/á^”^%ã}Sô}› œDH#Õ)åz}:®³Š_gõg*2Þ`ÆR³?Ü–ýºŽ)ã—c¾â¤ãnx“ò1u¨ùBQMÍ{[-çZÅÔ XÖ ¸äó`¼j}‹[Ô‚ÏùÂm=ªW€ý+Éï­"ð‚ñ6]ºÐûû{¼óüû*Æze,~xsÆ4Ο¾S®~(:¼—,>¬©Îƒ ]mù©3_PZè³ËÌûŠVwÕYèYp^SŃŠ/¬ôUpU´ûò>àýТƒ”rQêøxøÚñü[¾Æz_?ÒyíÇBð Ýt< š±þ÷Õ̧—y³Æù£#fÒ¯@y®Ûó³Ã7(O_ƒõT°)åݽ‹dÉ£>×£¹^ÙMƒ×ïuÍ„Dð:¯„ZKK·'e¼ÎCÌ<ÐÓ–yÏý®Âøðÿ¹_î§¢xª\ŸÆz3…/öõº>ö¼1s’E'+3¼Táyf©ß(8[> ÛE?¦¬‡q®ÿöœ>Þù¾ëù1tä÷²÷Bó|²àt1{E4ýÞ¾Ó˜ØN÷³[/ÊÈþ6b½Ü6Sèë˜qĺҽkæ!ÐyÔóŸ'ÞÓY‘ÞZ™ò¥,za7\Ôq Ìy}tަ›`Ó…NÑ“>ê:bÈõØ¿Ää_Q½¶÷´~ì® ¯ÿ¢n6ŸÑŽÖ=•NænÿãŠWDík€ Ñt¯S®gѽÊõTŸ]’û[±>ÇÌÝ”¿ŸFïÚã0^_G14½û 3ÌÉ\Ï´‡øHåÎkÄOœâ…ËEÞÒ9qyê¬(Ÿ¿}/P3ÙωY¿%}ûE=§ü™}Y§e])ô¾*2¾#¤ÎˆŸ¯»´p«þ”þï¯ûSFê»Òl<:…3²§úóøÿ/ãØý±Ã:î8g¨îg´ÑýP’/ºè˜=U_ç ÍBtgéºÅ~¿Ë­mÌz÷Ûûо³ú å)ÿ‘çT‘ñÆ çÖÀ61RýÌÑ¿¼Pà¼Má»Ì8˜?ÂÒS¬¿ÓžüsÎ'`+é ÷T}^XBoLÌqÚWÑLäãöo ÆsÝ÷*ázÖŒ•··=_Å—FS·øU®î¤¨gçm¼´p÷XÛ™ê¼}¯'¿¯‘Û}*þ7æ×¡y<%½¸^#m=qÎós>2å}@TvËŸIœ§«…ñ?\ãYe¨Ä<ç]5 6뤣À7–༔M÷°¹y?¶é°ªzž÷šÞ+ ›qyþjnŽCñqýÅ<¿­½¾¿ìøûÌÑùø&á~gM û©²ß64ç90GðÒcâ-0êvZÏYÿU,Ï—qBJOSê‚ å;æxèE£û·Ï?)ë6ï‘û³àu^ꚌÖõOpG/ýúùs¯îɯT:žeü~Rö›E÷úu*/aÃ%D5 yϹ~·î‹>üÄ@³N¸â%bò÷ô÷¤ÇU£Þ öW—¼OTã:ãPAäE‡¯¦ë—R}·Å÷Sžy†¬ó†!¥ÌþGŸ0åø¦„_·õm”µ䚯BQþ\ý9ßx,d½^u#ǽÁuMdëz¯aýl] Y<§Ôùý¶Ž“l‚ƒo'¤¿¡¥Žk8.ÖÝÑ”ÐõΉõ°XðsóñßCÊPܵêN/i©ƒÈÏŸò÷Ó¼.íØ¼¯Tæuwé1bM!=Oªô†æÍ1~4êÌ'³ìk6]ÿ¨†§ûU¸ý§ ,3†>e/K?ÓûrÖ®MÇPÅ7Xý_2ÎLý'¿Lò½ ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À ¬À®TCó„ûg >µÂ¦Çü'§þ¡À»– Ö›Âègõÿ³–´1óÃÛ ]Û6Ä»“|Tº͈ßí½Îzwsºé3tå>}Ÿ3N½¨Ð·_¥ë{cÁS:ïï›+. EãzꉪÌó9«úvFÔ!_3O¤ú#yŸ1~¾éH*þš÷=ûª™â-¡?íˆghÑUO9_Ì{”f}VÖ“ÓçÝâ#æq>sÔ÷­Í<¤Fn·\oþiÆçz'-ëÆŠ'I§ã€¼EÁú0ëÿbž5x>UOOçãÊeFo·JzýÔóöNˆ}D[úe¤ðà†ëë#ª9êc†ðýñf˜ù—J—Ë?®<¿¯¥D¿ *ñtÃ0µ-Ç:E’ëû}³èøU¤ˆŸÖ¢Ÿëè!‡tmQ•uNÖ]õ«ÀÏ÷-ÒÖùµ7'Ógõ‚å½uÔgQ:®þÿ“ç]XþÞ©üÑ5Ä´;(ÎÛ5C×l›—Ö¸)óàEÇuu1ñ‡éõÏé øÅë+ód·ç¶üžÿó{Þ_×¾éö¾ã#òS¸áSäûÈ2¯[ª Uߥ½®Ã†Žf>¹4ïŒþž)þjèyJ¯tàÛšÿçë4Žø·¹¤â‰§Ù/ ì}öÞú ¢?*Џuý+œÿpÔ—ýEGfëz-Û‚ûˆ¤¬ÿ ^é¬Ï¤/Ó~Áþóžófžßy^æ>Fþðô’”·)Ÿf¿•‘Ôµ8ÿ²¬s¬÷58Ž8jžÏþqÍYÏpÂò›Zæ7ï˘—g§ëQ\³_ÞóyhÉù-î#®tš½•^/ïÛ[¦ÓõCòyþ¸ÃƒuXQŠã·µsh=™×HÄÑñüùÞ`û›w½É‰GŒ±¿¤üÙ/"ö_®ÆþCcÿŽVÜÿpÁ$ò'ʉ~ê58>«̳³ùùÿoœHïǶuú¾³ä§ä'Ñý8ïx0-8þܱ…ÎWýåsÇFòÇe_{Ì~™ÞóѬ;ËyïW–8%wÍ»†ôü”>1Ö½J糎Š÷KÎwЏ •tûÿ×ן{Dý>ôŸGëO‹î/릠yz:ŽXöš'#Å~Ç}+Ñ€ýÒ~z~Aê¦áðs´Oqž›î#?wêÇô¾íœuÂî£ÿ/¡„ nî¤ë—Ý¿–ÖK×ßkq_^ÏÖ‘>†MÒïw¸Ø–Ž¢ûÎ~¼þ­è¤çSæl¥÷"WÏËaJYºÞlÒÑŪ›iYO Û1ûº¿G掿ôsã×iþŽ>FçÏÿ‘ ¡< v^Gó‰ý_Õ—³GëyŒÙ¬ã[Fß6þÝO‹®”o?ÍǪ·‚u9Ž¡û:]Ÿ&GÎÊßMª:Î×õGø=C-‹Îí¹•Ý¿¤uòZ]o7tB}Ðåç‰æàéyTLÖûübæÕæÏùc¡4˜îË×EŸö-z¯z¼fö»{’ÿdûž¼÷Btx¼Ç¼Tãü˜E÷Lõuµk½ÞÂ)”Oä¼€Ôƒ³åŰûïÁ:¸ŸÈ»t¾Š¿šEû~¥.¿ÿ{U_ë/ê#3êûD=Ë}õù¦¾~­˜©n†ŽÏÒ}½ë>¾º½ß»×ëùðkXêMQWíÎúu½]ÌfœwÞ –8p$ ÇaæƒúïÇ}—ò”¢Ï@\ÃŒ§ãÅm»êùµO;­o¨/â¿çBÖ§œ1Á:rŽúÆ®} P‡ÞÛžöÓ(z3 ©þÙ)çeÓþ¤ütëø>1Ÿ?»…›ž¤è…R"Ï™[AÏß´ y¾#h>¡»¹îb?/O¯«²èÇO©Dã7e?©?똷 ýÛ9ÿÇ}(T½Õ;¥?GŒc=Ƶ«Íïkk À}ýÈMÔHž[Xçþ*!ú™)ÇIè=­ê–Ä¢ó‰ä ÑÖÒo´ÈçYÖOÿø’¢~5;‡ÎûÀ2þ£‰èŽù÷÷kžw9nžÑÄœïjÅ~TÞÆïWêÉùç•pËg¢fHŸ•çh·çe† ÷§i4Ýu›_’®¡ÏqºŸ¹u˜ëo€ÞÇßwƒÑ?ZÍ5Rñ«¯ûÙè~ó¾ûAH¿…µo˜ãàN;ô|BÍõ~ø÷͸ŒÎ«h_ÿ2÷ùTy®×­ôôz–¨3âºkõü ëþ{Ÿóú×íoŸw¦Â*ÅËkcf.ùÏC>gõÌèý£åšà8¤µî‡ø¿ßù¿nx²åÈÏjù|°niCчó,ãæ¶âø›ã“<ïò>â> ¼¯UЍóoDËwmÐñyØÐ"ø¹u¬H÷Õxhà÷†l³ÿïÇ­9.g?gèù>î{…zô\|<œ­_ë{¿ ÎÛ`Õ£1ºçø÷µ8Ruüë¯2×õBòîªß:;æ)'̧<ƒÒ ç|n«i]Gg·<…k_ÅÐë5ºÁŒ·9±¿KƒôôÑ7ØoÁ¬Ðû´äkô½çP¾ ‹ÍëjYtM˜÷aL{1žNû³º?ˆzü^ô©NyÎz|ÊÁãaéí:žk¯ž¯@-áOMæu¾q´ùà]H³ÏÑxç¡¥À!Õ³äEæ^—h^IöIOé9àî|ÅGXXX]I¦ê%—û> ¬À ,ÿ ÍãÕ! ,=CcYwç< ¥OVÿ…ò› ÔÄ2.“èGx2ôbÜS;Îû4wãWy¯0¥‰¹oTÊñŸq¾gý×Íõçâ,”¶ðSÖ=Dy•¶Éà)âFu1Ç­-<¿"Œ\Q1£ýXÑŠû9â¬ÑëÌ9ÑúD†ŽÛÆ×Ûúj§}½"æz’ìŒT'‘õLú5áŽVÖä:¾À¯•Ðç›÷~4<¢õ¾¯ûŽçýZ#×—øÏµ˜òcwô¡üÿ­?¢ÏÇý¥T½ öu¸·wœù•{Ѻ$ûÆkÏõ_Ú_¬x ^ö‹•ù6ÿüš\ç[2›>÷œžÆy†ézžŸaóÿ¹ß5ŸD¹J¼Ÿçσj¼~ævÓóMó7¯7|/Þæ(ç»E¾;®1ÎO´âïßÒ·Ñ»Èyü"‚W:’û Vg|ìÖÍïÛI^çŠú”x½÷ôç†bŒÓšû{ó÷Û3Ç)®paý3CÇy+ÙzŠG{¯SÖ­ÕÜÏvBGzļÃêÖæ÷Šû ÊσƬë0o•ž¿Î¹>RUE>º=Õ­Ð!ÞþŒUE¡øçõÆ …žße‹Ž³]Þ*‘ýÌõIÿïåÓëÇ’f|ħeÚÐ(¤N;¶¹îRÒ¼¢ãˇ–ôc0׳,õÄ‹œIÿ{ ϵ|$Õ“&ßOþq‡¦´¾Í)ܧ|Ö8ýýìÝPÇ_Æì×éjò}öÎ[x\sXö[ñÞ6·àÀG?Aëþ´Á|Æó`9áÏÐû÷´0þÂçÍVxµY7Ðï» þÔy>¾*û‹wÄZüë4æºü¦Ê´?Må~ŽuxnEü”tÄY•ÓucâÞ—2ï%ó|ñ>Õýrï<ŽöýuÜÁþ»ê£ŠÝŒû"òÞ!þÇ'Ñú>"§ˆŽ‡QºÙÇM¸oTfœVeá— ûW;òsSöµZnz6Ü­óý.öᣢþ{['½Ï:ã |=‰Yíè{°ôÅ¢cùW\ŒSñ0Äé9`­[ØÕCÇ[V°ì+–¸ÓÌ—¸þ&ZÏ™W—µ1ãRÆá¾ãè4œæI³ÃÌCú€ù壃ñí•×1ú×ÑøF{×»JÇïZaþ~¯#žF®3—è~ܤxû6nî¡ÅŠw-u Ðn~¬ü>3.ǃôqU|(óû“O|Õ¸Îúy­¼7åï‹yG)º³Ô¯[Ñ-aÝ/›YâPÁÓC6ãôú/ W›Ÿ‹ê'ñâmÔŠ7œa=µGòÆq¬Œ‡3µÞß‚%ô½ˆq1VøÙÁ8³ÐëŒçùü~ÿk³ØUðWíI?z_+KÑ~× gnãÅøãTæy_‡ñ‚–¾ÌþñœïBŽyÝÄÖ1Æñýûá} EÍ}¶1Eä+lÇÕgÿ‰ñ¡X¹›òG,÷]Mĵ=õ÷Ù{#—;™ö+¥e;.å¼…OÓ¾ÛÄì熞ßÀ-ß‡í¿ ŒçàñzÑâlŒ»1™<"ókQXàTyÝòù\̓ãMŒÿ¯Dê¿Ø¾48î]}»™ÓIÇ›"âu%®[ñA"“¶îŠô có¹Ð‘h”Þ:ê|Ýçƒñâ’_¨â]t&©g˜r>ë ñ¢DæÊø¯Š¸ !óó>³ð8jYxïýÌú…¨ò|”ÞQ‹»@ š·Š‡‹ÎÝô*¯};£yŸ¤â]ëø–ç¢¾7ï=Kœ,öWLäß[âê0Cá7az›h~\o˦û¦x)ãÙÆ9¯êÆ"nî÷8í37£}§©/-âÿ÷)¾—nå5—a¦ºÙ/ú²(Ëu“Ó!÷·ò;´¯®":›u>SΫÎëMDÝï¼ÐÈázwU®»ŒºhÞ7w½¡ûUs‡ëyˆóâø¹ëÍóîœÙÏóÏ«/ôRÆ Šä/(½'Ü|7ùïËîÓëgÌÆì£z<¡ôSg½Mþ%ç·±ï¯æüîОÂâü׌}zý¯´Ðo人›ßsÌ2Þ<¯Ïþ½Š£Ctüû ñ_Ëyëò¢^WÕÍÿP|ÿ¼kϬrzuâ”ë}jÙE¾\éU…òÃW¼ ·þÙq†\çh¼9Ì~…Ö¡Íi~·=×¹l²¹ZŠßƒZQGt3/¨º8¦Xêèeøïƒ(ãcn÷HÿuÎÈ?~ïõó[îS©„Á¿\!ô#6V×óåœ?Gwη5ÒóNX‘m^?*òûZ˜×™¼çÜt:ßÑsš÷m¾ª<~ôR oÓuÀ<âà¬î§†ñÖqãó~øn4ÝÜ”qYÿ(Ý:{ʸuãñ’PSüV¡`^ú²›8?Êóv:÷¸ýo‘ê±hKñÖT7úhÄõ« £Èz˜ØQ÷jÜIýüv‚G=æA}ßóŒ9Þé$êJ!y—¨†!üͪÑêC_vS¸ëß8î×ׇfì÷³þ,F¸á4ýóï>A~Ñ?£}ë¦ÓÏqÈï¼¹ÍßùÍñH)šGJ;¾NûÇÚÛòàê_£åŒà¼b=¡ê»¨ u¥¨®7¿ƒ‹Ì¸¯Ñ>5û¿õ1eÞGæ¸0LŸ*åz ouy}°ž'üå¤ ‹f“¿ÔÊR—©.òÆÅò—§‚®ôÓ;)ð~B÷à8cÜC‰¬§Ø|qDœÇ޹´ß\Íxî¢WǼpTåúÀ„FñæéÊùô³È«ø:ŽìÉŸïAòõÎ<å8Î÷` PÂxÊRS²¸n7³?=Ça§ý¿¨ú‚Öq"Ö5¾*¦xRÇOFÌvÂùyÏ3î¢/q„ŸÁà“Nã¥k˜´ßüû'~uÉïÇHÒÁôN3~öÐ7).XÞŽ»ívúýh‘×>ôq¿GÖß<´‡ö•›†Qüt¸3íkû¿Eûü”Ÿ˜óÞySi_Wx£v–÷¤'ã鄊³þZ·: Üõª™´®µ¿/$ò_3Åõ±nØÎÉôý5ä뎢:šìçƒMÍùGÝ8œ§u¼CÇÉô5ÏÔa\"ç1Ð_¯#àæÍ¤sö…wqÝ3ç0½1í×°N÷u"oÓ^Ôß;Òç–ñ$òöe¦Þò‚9îõñ5,ùìAåõ﫚ø{¡ôp”ÈÖëò(.ü¹GÕÞ§b".âýÝ;ÅûÝòãáš›mÏOBÔõ#—9ÂŒßTzËþÿ%.f%åó1ö€—ò ÇïJ·™óêª?Ϊbfó]áw?È?¿Oeýó ÛiÎk­3×Ùü¿Ob¼Ç?ªÞáÿû{aíaŠWjÄóSQ›¿‡E?&?nåPú|œgÁì©ä\’çÉŽçwYÇc¼‡ê3Â;Q:É«™ßð<ê ÖóØ*ð¹I\®²ðqº_HT¿ÅwåÃb}:â]úÞAð†P™óú³D~±[ÿµúÿgœÆ=LóeÁPsž´!¿_[xOê{ á}¡¨Xï'YðÚ«Ÿ3ã3³Eý«%Ï—Ñýô|Òè‘Æõ­ƒë˜¨.Ö³·Ìqª[ίê¨Ï Ò5G±Ž³Î2zoÏÎÛg®ïwˆÆË@æ½lÞ©çru]!•/ÅTÖ•-+ž›âÿþÛü¼1À炱«ÝŽ+Ë?çÖ&ÿr,½·hAï‘ÂÇ{çYü|BY=œýô¹$N{ãÄ>²·~¿ax9ÿ8‘WCÑhym¬oçôþI~è}Ùð¥EÔº±•üC“ÁÐÇâaI]®oôÑy(ŒãÁT³Žÿw~b¨dÁÁìXcæc÷Òë;Ø0üÔEUôï{Dc·¸Mà?\ó¢6CU}ŸöŽY®ûªÙ?õÇ©–^½$e¼Qßùwަ§£ç¿µùw6={{PýRÆY¿Îì×Õáü’…w‡íÔ-83ÿ ³_rÖ¢ÓW“qsX/º²àc—þîÒ¦ºNªGÓ‡oÀ}w˜/†1´aÚt"1štìÔû†\î/ØžóàÅÄýkËqž¨ÿôxÇ­)Þ¾³?í'}tþêºÅ­¨ ¿GX¶‰Ö÷¯êqâèÞ´ß0î-D|ãÅ{%eX;Ã<ÏyßÁºÙ„;ñè{Eÿhu’”ë͉†ËGV¼8Ö†£D þ\׿ª­×ù÷hx…9 "åo1ô¨þÿy:_[zÅÂcøç—·Ô¿«&›gÆìÛ©+öiÕÇ8©ë¨ýKÆCè“g¾¯ñô<1ƒu—;±~ËΩ^ýI0HÖ—ýq»Fãc+Þ Jr‹×iŒ}šÖ‹“æïCåqýÿ¿#âÅÜUø2ëýdqQä=â*3^°—øþ¹ï²ÿÿ:NNîCÊlþqXÉó3ù|3eRBæ…lû¢ª· œeßÜHÀoë¾Ï86ï˜ðëG¾)®‹k* ë+¥gô8§5ÅãÎüák{~•ç¶f‰êò¤ÜG;ÎKKv\Ÿ¿Ý=ßÐÏWá¼Þä5ùªg`½/GÝÌ æËûã±:†ñúÚw±9O¾¶ƒŽçe¿Mƒy*oíÃùpY'I¹^7Å÷¯ZðzÚü¹˜çËz’ª®)óƬãÑ1*ïÚпh‹×åﱺå‹G¦8¥ãû[QäŸÛ1?õoJçÀ¼¾ÙtÕUß!ÿ¸7Eþrý^ú½Ê; þÞýó®¶Ô?K[ôåZrÚ¯*ͯ.–½©ÞŽ¥GôxeIëŒè‡}Ù ¹Ì‡µø)ïY{â»c¤^—ÀŽbùc¡÷×È‚_bÝ\«ótýüǪ,óx¹¢Ž´HàAŽEËÉþ)úY;Òýþ_ý>¦S=Û¸ê8Σß4.xÝÚÅz(#Gè¿ßxœÞ³‡ö,ºôþìü·þ¬kCùˆŒ+¿ûëzàqî‹pç=»nÿ?~Žü“{Ò{¥ê!²Þ©x%D~Ï_èsjA~É¢ ôû½·ÒñÃhŸÇ^ÿVåêïí÷À¥Ÿw=OÿxåÕZ=b çO*2^öVOõ¥ÅM•è~ïú­·?AÏcUUÖ5aœxîFÊ e¿æ¾¿Ñó½ÿ§ôs)ãû‚{·Ñý?}`Ç¥ã™KÇßÌýKŸ~þåK×Yõ}:¾ñ®±½]ÿkÓq·§xIé`>°>×­è¹çßsO[,ÿ¾ ‹ý{ç³ßÌÿ^=ÏŒëÿÉßËtÛ™÷½ߦüÐOÒ¸ÿ°èFU6×¹•—ò{¹ßP\¿ï)®ón^­ÞŠÑø'Q %^.Z}ÓмÏâ8eÞßôûp"Ò¾‚Q-éûËù‚Êì_–‹ö|Æ194NIŽ#*KŠñz]tùaš£Êf”g­ê£*žÀ®#b^âE~®½ ÌS¢nHœzý>}¿ßxü€»¶d$žöu%n:%ü¹Þ”Où ”ûmX“Þ¿˜:%Xý­Dq’‡ëë99æaÐëÅ‚ëKaü€¤ÍÆÃC5æY;öK}}Ž1æ´¿t¼ÞéýFÇ¿éë{Îaã~h=ÿš-Áûm{ÂM¦èÙ,oGyO£A×Ú/GU5ûáÜg ‹;ëëÚÆóÕÁUìú>퓹gÍ|Ô[:‘Ÿ²®¥Ouú†îµŒ 0Ý_Káï-ÛÌùW æ8qôOxý6óŠ}þëÈÓúuFÀ'c?ò¿‰åWéÿoÊ~_5•ŸþÒ`ο×á|ÒŠ¹:âw‡Á\‡ëòžÇÂqxºÙI®‹ÉSQz23éùoKž“.Ò÷Ë~fü;ŽxŸ;ÆèßçQýï6>¥šÇ¨)pQïòKá· fœóqý¹¯æ ~\š÷‰À ÑëX×7#q}Ò†ÃÃÌu¥3ÝÜMÐ?oÙ÷ƒ×Ón:؆³’æ}¬‹`½Þž!·îüíkÖã+›æÑõŸË†ƒÆˆ,ú¹âÇÏ ¶è:XðŸ¨nÑÃÙE÷‰ž$ì>„ Åœ,ÚÖwÑó eÙOÏ¥<=ú1?iÖ!O°†uC:~/Ñùé×'™¢OtZ<ÏûèùÛ®æçf3Ô: ×mv›Gìç©>îhœg—|oÿ÷ót ¥û—r\1OõÆ-ûý>nü»^¯f|¦Ÿç=<^.ˆ|œÒ-«ûEXÚ•Þƒ^Ïéëî¢õãæ<¤û“‰§‚~¿ÖëdÁIæ-×õîN‰|(÷˶=‡¤ …Ò ~ÛüýaÔ±àó˜ß†nxç¤ Cž3ÏËÇž)n\÷ùûEÛh~½Ò×õÇù?ÿT—ó‰ýo¡÷¯û9#ç•ëUì÷ßu†ÖÙ¼ŸS>adò+‡4Ó¯7¯©^?Wõ/©#Úžóv%ùïÏ×mx¾¤ C¤ŸÅù¹ Gƒ<‡pÜŸÑY÷£Ñݬ‹‚º_sZåý¿Wy{®3bâÎÀýDå³gµßûù ‹nT¦ Û‰ï‚É?5â=ýùñÌ ýï²OÍd¿™—TuKÿ:޼ˆ”ë}65ŸãöŸw¾îû".]«ëJ¡¸·#ûüäˆudÕbãõ0‡ö{¿^GŒÃõaÌ÷•­¯kÞÏ8(t+ý¿ÇìC‚â·z¯&ƒ›sí.¯ç¦ólzþq¿ öƒB¯{&Þû‹ª!xƒ+ƒy^9œ¿âOÌuó QŽ×±!fœ¬/`7>|¦¶œçØ“Eg¿U9ïÒŒãZžOÊ?Sý~Rîgÿ°Xù?©+$Ÿ/²¹ný ~PîãeEþÕ‚oLGáRÚÓ>£ðâ(õñx6Ýû&­k™UâéÉJ}t¸:·3e¯Óûž²¯n(CüóÏÝž/fý)n1t¼Ù-ß_ïužçíú;åÝ]õŒ¤?f½¿Þ‡‘—Œvf>(š'“÷÷ß÷²Áß_ /²›G„l‹­(ðY"ÿÄ|zä~®Ç›KÇÅÂÙ£¡%nXþßúûаñûS¸Z\_;p¾xDœP!š^§Þ˜E~»õ¼Vùù×-dÁ§½žžŸæë0Ÿíkéã„6æ÷Bæ3C¯«xúB/•Ÿ³æA}¾ž´äÓZêC§õ§+®råöÕ—g¿I×¼ƒñÎh@ûV¥—gE™¸ÈÏaöÿûãWsÞi_´WßïОpXPE[?¤Þ‹¯+P:„§ß‘׿*æyà]àë–àãú¼à¶þ"¼šp¾Ç‚KÂPÖojeñ;Gv¡8„uÈÑ©$ýŸ÷õ0\ Ú¿LyÃó–¿×~ì4â/ãjƒý4Íy¤ü€“Ì'z;8ÿa3×>Þþu÷m ΃æüÜi]ôÞþ7ÿVéb¢¯}®7çáþĤ~FSâùã_6ÃÖáä¿Zü„0>šuÜVGaÄzÜ$ú@(PÔæ÷nB9QOáýäÚ‹ÑöÃI’åív5óQ ¬À ¬À ¬À ¬À ¬À¾ †Ü1ÁxÖV:þ“鸎/îmäË‘òÒ˜³™êµª/Ð0âç`o;çñoæ[MžD?Gަ8ð@Š÷öN1ãè§›ã‰3Ç }iœÅYçîU·ºz® ¼g©ËöïFŸgßï)NªbÁ‰yŸ \ïZÙ+0.ó.0ŸæWŽ:£Ì ðÁ<)©“Ýöy§z$¼£×çFs~âY…8jΟK]¾BòL£8ÎFù#¥‡>5œò*èĸ…Ç»†y.ÝÝô7Âòßx¤Ï1ÊϺ=·¨†ÿêØÊÈ;°ðMüóÚý.x> ^ª÷E²º„Q £Ö_ýÿ+\qq±m~(_ù"a†:ú¼N—û>Ÿ©7óRx'ÛKºÕ;q>¶¶X/¦>AuŹÓ)Ë:W²4¶Öó¥M-ëh+¡kØ’óNƒ~CïïÒoBó®t²¼>44×SÆï­žê¬ÓÓ]ð E¿^ÅÄ(—…"ü÷×ã錻ºXøt‹sŒùd,/MÏ•q (±~5È /ˆz®#ŠóJ |Wït|×ÉxãÆ5×ü:&PaYéî kÅhøŸÆ¢îЧ{ ?€®gµ_\²àè°wºÎÇàz6–çc]y×s6øþ§ßò÷›kèëË8Ö›h!ÖÜ[Wª/ù<†]§ôúè 4ï súSQ÷lÇü¥ÇÿBþÞxæ«n{?Òþã}&ð¼²/rWuKôc?kV}îÝÓ¨n6|§þy–w§çwý½N²îNZ?ïjÏçñóyÏÑ’pR¾¾ËÔC:ìàhz~+ïr«)½ØnŸèûùXK'÷¯ô¹×_KïÏâ«(žØt­±^…Vf\²çgÇà:®šŽk‚×IÌû—>ûîgüFzõ,ìúTÇW¿éˆ êí†CöŸ^¾§ñÙúüÛç„—ô¯dÁù²ëëßõ'œ–´¢Ÿ]Ù_èÎz½³ÛÑÏ¡K™·#ø}JgîCÆ9‡øÙÖûí¿Ã̯º*OªúÖDÆ=M.Dó¢=ã[Gà ¡¶þ>¨Ï­ uD?^ö–ýflæ}¯ŽªÁÏë ¨cÛ‡Uüì?|¼¾žþð =·ýCדêEüRþü±àûQ:dÞg”ïHLJM½èûÈýŽKÂõÖÅoš×¹‰çôýû¬ðK…^=®®ë«ý9¬Óµ¶åQ6}AŸ7„Wè¸klÓqz~ݱŒ“œÜSÇ«œ¯ï>™ãµªÌ[ó0¿Mæg±ð{nù,Îã¯,Jë/ãøÐšðB’'ꟷ¹y^䞥ó'¼ÌK9ÊÇWa~ØóÑðËØWKïÛ2nz×RÚg{ë>y_8úÑ£zÐ{º¢åÍ9¯ï÷yœJ†3n‘óPŠ!uÔ^¦õz^ˆ>Ĭô}&§ÎWZó*1>ÕÌ_ANý7ŠŽëš^:Ì8ì¾nzý(²7e¬Ç+_¸ëŸ_Û·æj>¾BÈúÍúöÈû;á[å~Û…òÈ5ã1aÕÃlúšwM |1õ§ôþm¹MóW“ê ‘®¡«Ùò>yÏ"ÁºaþzR™ù?#‹’ÿ4ÜM·ÄçãÍøíK+§ŸÕ‚ýalk™Þ¹£é{Rº ;ÞH„OãÆsT}”oé‹§ŠÍçÓ†¿cü<¨Áõ‚y ¼¿ü6[üe=þ\7ÊÛìo«~…ŒËG¿3ZQ}Xåï1¦ Õ‡7ÜDyÑJèù·ÊnusêÛ‘rýñíÁI(~ Æý‚üÏf¬ŸšÚ§W4×ý¹º¿åÓŸ£â;a[z’1ÛÌO缓w6=}b[ÿ2ÿúÍ,}Z–üÑŒX¸çÒsŒª[Šnõ Ÿß—•̾£ðpØ“™PQêzg8_9…Ÿç0„ðNØUUç#©~yÁ|6ÿø*Bìs/è}j‰—VLä½Âª_SÞGàä°ífýÙߊû½ êÊÕ‚ù®þqu¿Î£pw…ÒWÿgN‘DpdRŸGênÙxõXp'Õïø{Â(ÒƒñëYĸÅÜtjlf«{)Þbäñ0‘öÙeyÑÞÿlªCËú Jðû¡~·øs)¯†}tþê{â¸Îœ—:\ªÏªéù|[ßQWóõWÕ4®W˜Eú¥ÞGf}0l¨¬Û"ôÒœõ~ëy¨Ío‰kŠçz?K¦ÑóÌú‘‹øýh`~Î)ãd ž³ÈàŸÏ;^ŽÖƒùÔa:p(ÄûRK]×Íù1ˆ [ʺá×*Ïì|˜Çk+ô½ãHîŠN:>_éçZÏ+⨳w<ž¾‡Ôöõ ç˜õ–’2Œ¨š¨Îv׿—v‡Ô‡øÞŸb⶯ Ü_°bœžw_Íú÷£H`6,.EcQ÷V†êì¨þþßGšu0ëXÔædÞ G]t¡¯¯Uz)ÿ2û6½ÎñãÕÏâgj„Äw}*Sþs_¡X: ÖûÿŒõ‰<öHþYEàÕE ©Ã‘”Éú·Š«ìÇÇÓÑQë±k‚ö'"í‹(¢ß·wÆ‘¿q1ý%_¬ßi³ÎÎ9®{°^4®ã:îì3níM‹¶£¡qÝV<k¾¬÷7(Ïz•˜+¸ïËÜeÁº7¹Chý^Ëx‘&Œ³hÌqýÌÆºî™àÅ ççǒΩª¤\'¯¸gœã<ÂÈëƒïÏ–ÏÚÙŸó|¿ÓOé÷¥ÖÑUÇ /0í¸Ñ¿Ã®Wí¿‚Jnq—«)>WÊu/¾è’ÿû–/ «'TX|õ,¸¹#Áù~ïüeâµìoO~ EÏ Õ„b™¾>Òvæ#6IS¯§4×;Zq~¯—^GWzB>?¯ï/ih1ƒòQRw°Fp~)eßìß§?¯? Y?xùÝX·M¯Gáöùªq¸©9Þpå'fÚT_2¿ÿùµÁ}9T¾£¯,ê‚èK|Wlè¤û#˾­ãëëïUŠúœ=4/–½‘èsBþ¼6=ä÷LgŒ7kt¢õ7ïl²ý­Ð€ßŸ¹œ—û,ž.Vʸ¹Ç.ý”ü!¥gf=¯¨#þÙ’Ae®{–7×½-¸í¹éaHGš×³7™ñzcséçêZ„Ÿ>cñ/j(¼ã“Â}£0¸„>ÿ'I¿Ö‘5TÇãa–ˆ—ëH¿ºFFô›P‰~*ýO xåÚ1ãe7õýÉÜcä7$ÿÌïÒÆ¢§¾+„ï5²½ì/£^4|š÷)ø²Ê!çÉüÏêéåUǦ·^Àyâ]äy¼àD,¯óýÜp'íCËŽè×?+ò!ú”i߇үïÌûYSË~!x/J'W‡ä3~¥Ç "yZÕ“~Î8&p¸ ð8Ö>GÛ_ Î »‰ëßÉô½ðÇ-)ò5™—4“ê½~]òµ`? bê„2¿W2¾@Ñôêƒqóe_“ü¼¸î‘w½Eë~KËyÌ;CsÖù(8‹Çÿ¨oSÈáÅ‚ëÈŸè8ö±Ænõ(d‡ð?‡~Mß¶T¢ëu‚~Ü’Ýä—q|ˆ­«ƒë䃄Ñ.¤?EÏxóËÆKQ8ql›DÏkü½æº})ÁÿnpÞbËÿÐ><¢,å‘y=Am¾®ÅßÊ”ajuúœS_ÓqýU-:¾¼¯cÄBòE¼©úô`ùµ„úÄâ·LeýþEOéó•qD²¦÷‘È÷)iòD½ÞÍu<õÐ%âî|Ü'aþ»ê·¡ÖWäO7—¦ý°lH¾}ÍÝfÞÂü;(nÌ.Nï/ç$¿Î?¾åÑ‚ýÌÂæ÷ûè|) .DêÏHþ¨÷¹ØÏ'äiçû}nV¦Ï1ú3çÖ®·-É2þ^ògRÎ[GùI[ÿTŒb\GEsžIâ$üó:XòYüþ§à+F=Hxôˆ?ç'~¸â‡ªë(ܣ׋›¾AóõUäþ™’穇{ƼŸc:ñ²±â¨þ^²N‚>ã¤TÜí×€ýçéÞÊø 4ÌŸºwÒÐ:‡Oêï“¥ÞêÚÁû Mœ™ÐRyÙ¨xl¬/¾ä›®N=‘Oît8Vü‡Ê\þŒy=¬Roïà7¢ÇÇ‹÷Rü]Oà¦öÜi^·wýšu28Ï;òÂmZê2þyÝ›’Ÿ$ü>䱞CÅÃ+þÃÖÛé>˜¦ú}a õñ´ÇU}80{-íþ“hž.åz–>‚ØrþüûµsÃG̤ÂF|¡ãôWr]¨ºÐ9S<Ë6¼žÍrÔ)šÑ—Î[õÃH<ëþ´â·¼XY3 óƲ¿Šê^ Í:†˜—¾oôú5ÍÕ·/Ÿ¥úoûÿŸmžçRAéøÿx)™ùÏõBôjq|,úDc×_ûäÚN¥ãVÏÎ(¯‡*êõ›Mÿ6êbÞ¶xïù2¿`ù”q;¯FˆîHúž1?˜7¡üTàç=æ›ÁÊ  Hå,¡ˆF‘  äd ÆÆÆ‡Åëkcl¯íc ¶1LRNéû=ª[í¯nWuU‡w$vçþ3ϼowu¿ªn8ç\ô©«¯WeE<Ç‹ ÐóÈ0ZÅÉþ"þsœOõì–Ofq\Ãz9ņ7»ùäŸÚô8¾sêñ§ý)O¶µ½:Oê@ýÛ¨ë4ïË týú‡ëÆíkÈK4dùÞGJæW.. =CÜ{åê±ùÚDùvT&éÄøçcáÓp¿´ Ånó²~?›ÞÓš„ç”y°íê¸8›ô®oQŸ«^DÓݹ˜é߬œp^ã{4ŒÆÛÀ$QßCÉ=úçpû ÏÍ"ž×ßYü¥Í#Åún¨Óp|´ÿ¹EØÈ[ìà¦W“iÃà_ëy7³ôz!è!êÕ<Ø®OûDx´7ÔµØ{ï}Àê2óª ¿"¯‹6j…ëEYò‘dxf™ïÆð#ŠÞ º ÏÔ ¿jÃ!5ßëY1îa¦ÿ´é»úy¸PàÆp­ š£óÇ:ºå0ñ¡ù)T`ùãSTÿ4;ü}ÄõuôuØ”ÿ®Ûúç[¾&æÁ¯|"â§™‚Ç*û~b¯èÃýŸ‰÷¼ \ÇNÇÇÛ s® Û1Æý”óÌØvÜôuüúËhCÜSÍPo)fÏÁ›ô~ÑUªž'Ú—¨ß_Ìø• ç14àªÃ„æáùTÜ|I8þe¢ÊoF–7¯A×Sæ ÊYâNÏô§Çr=¬n¤ËDýî¥^ÖÑ×iŠõ¸-¾^àŽíá¿s6Õ³ÖÕVë4ÅÄW‘|GÆ‚§×‰Z¯wÅßûÛ¿á¶^ŸçKé÷f±ÏË1ü Ç-mû0™îæPáGz§)ž‰å†öÐꌡíKú÷dâ¿Ä:3s¸ø=³…ž ú„ãS#ÖdÝÿì5B„pÐ~Ÿ•5Oˆóg×Íf~ýAÆes¯]g8 7ª÷ipgq~ÿÜ(Þ5i]¨M7pÞÇ)ïqq+õüÛ…¿/ç-ëÁóëFywÒM:02nó»j²˜WfLó áCQÞPž¶(|ÞXy­: føÆ~?Ð<–Mó$‹/Ñšâ­·D{.)Ÿ-ëðþõ’º“Òèñ3ÊÏ××GâôGªuIÌeyÅë/uÔ¯ª~^{7€›ÔÝCïpÎø{±yý2Uϣͻ( ‰á-M8ã8Ý(.çy{ƒ®1æMóéúŸOù‰úûVÿZå]¼iÐ ½Ô-éeùSúÒÇp1Ö.Q¯kuC½»çdzã^QÆ ²î¦ä7L˜¯æó%^VêD¼i8®ä…ô‚þwîgÿK>ÂÎ=bž¾û÷ês¾îúp¿¥%«Ó÷dïùö·ÕzÙì߈¿£¾§_·vÕ ÷ï³h^jÊÖÇAØÔWÅ{ÞJÌ+Þ{ô{kQ\ÔÀ0¿­Ø/æÅ|Á3Æü…áqúÚ·Õy +žSêÌŽ3Oàç1«³v½2Õ=ç]É kX@|¼q„ãÚüLxýî–§Õ÷›½¨Èü„É"6é `÷.uýèBzmDž#Lj÷ÑCøïÙS=¯‡éý¡xZêÿr+€« Ïgúº0+Tdç”Cïù/Õß)ý<~<“nÇÍúþPWýz·jóB,VИޣn¢N‹^áz è ÖEWÿv†Ïƒþ¦Ç²¼‰¿ýDQ`ñŽÑºÞXÿÞúú ½Èß%4¢¸Jâ£HÃèßÿ¹ŒOG¼ ì,æÉ‡ÇñNèCº¹‡iû†ä¿’_!q÷(¤úl56Ž;)ü³¿éó‚þºDõ0ô¥õƒë¤ÐïD-VëÑÿví×Ñ,Yý sÐÀOâëªÿysKÞ]ú}§Äü/õŒz‹hýÌêC ú†Îÿü~ÉzªS=ù`´øíeÚ¢ûu­èSiÊ/ ˜žÃ±ýCãh__kª>ï„–„ã+óØ{ÐMå¡2=ÿ<¯ÑÁ¢ЖÖëÉÔ÷úÈø£g ½6ùíEtÝ«P^¢™8ž÷/Š#:R|‘"ãÿ¼†ª~Ž)ï„•_'¼2=w ·,¯‹ÿU7^N ~íDëÁÆôõΙs WIõ¿k¾&Ö'ÞõßçÇô$?-~Ô¬G×»»ŠSE5ºÎ’ß6]¼ßhhXï/º_5ý:àÿþãôÈþZ5)ž›"Î=Ådž?…ãgYÞÞÇ›´‰†—G~‰ø;è—zÜ?ÓkGUý|‰lÆë}›p½Çïm‚ïûýk‡L8»+BñMþ~ó/¡ü€>äo·Xiqæ¶÷8‹~ÇqýóíûKÔ§Ö;aÈÿŽ'ÿ·À€Ãèõ©ÖBwQWD+Æ×gü[´ ¸—pâ˜;UïŒ@õo©/îº^<ÄÇGÏSÂ?ì)ó-´ÝxÊ;¬ Lm§¾?ƒwÂí™ åÈ/íÙ Už֝ޅ»ÁÀp¿ÑÄûD{–Ê ÇíùÛõvûݨCu5VÇðû¿®[¢Î³SO«qÌ¢B±5¢y#‡âïk–‹ï{ˆùøÿ‡¬S®Ü´ïÛÎëB14´|Oü¿YÑà—Ë8©ž[~Þ{>|þõ^5Ô½Ÿ‹V/põ[‘ `29Ï%GÔJ4ºvI„£Ãpý|뼑>þ’:G®ãøx•âôyzž¤Î]Üóu5|û±ŽƒçlÆùA¾Nö¿ øÆ»ò?§øÍÏcV§÷”é½ ]ºxJL¾B÷€¥îY.ü½rÕÛ@–ê_É~Ÿ¶ýl:ei™Ô‰‘ÿK?—°¸©nº|&®×„?Ôݤå>Ý#.&0Þ²uáñâýÍôq&á_°iA¤ãùy¡uõCý #o´åm~@q‹E÷²´,ê¼ñe1TÖ×/ŒñEþÌD¸IßVöa |nÑ“ÄeL´îýû8ÑÖ9?C½+°ó‡Ð]ðx\óQ¨¯Ž!õ”¥^¥õ8ã]‡¸††é¾WÈ¥øöhļÁè{cé Hó¾GñÓ…2õ¥GwUWÒô¾q¾–÷Q´uɔǷî÷Œ£ÞumÊ{ïŤÓ,ñTþÿ¿¢ùݰ½óyøÛ±ÇsüÝÆýO²<Öc¿îö~K\½±ÎX,pÀÞÙhï%Æp•m%Â2¯ø$Ÿ¿Ö*¯äj¼ÍPà–gù¿ž4ïQ}Oöåó v¼'~ç»—4п/6]L䦫µO®«¡‰£nÓ¡Á’ÛDaª×gzg¿ [>Òט=.ÎMäË|·ù{·y'ê:òe3d…Ç]¼>Ø¿B4ÿµ2ëÏ£Mfy=Q ¯×ÆÕ(8•(Þåz]i¯ƒþ¸‡7@å™xä~¾¾ã‡1Ü…¬ö? ë$¬ßÚªóƒI×Ðß¾ö—SG¸á[||n—á¿S—ºá£Š |Wâ%HýDä.£.͇ÔwUéÿòì9'™ç¼þžr ×ùÁ”µÑp+Õ#â‹N¤[‰jèñ»p}Î|ªüs“qî³ñꤿø|¸žß&ùG¸åF‘þÜQ?Tê4ÖãXç—cÑͺ·žŸu‰^çã|³ëåÔ‡ޓճÑÔ¢SqSA¢ç[öˆû4ýÇb~ÞóC•gW‰åÑwœ¾þ?*nx–Š“Äž™â÷\WCÔ/ö^¬âŽKòD]¦áë÷ 묡_uà¼çî5›}¾f*én¿¡ç?É~¬¦¾Ø×0ü쬽ú:Ô Yá|Š›9Å£¼N‚Zêõ–õEž ¯F<üÆ_ÚAÏûl?ß çïm>©ÆA+ ¢ñ­ÇõÓþ®çâ<^Ëhu?Sß5ãöl]‘¼ãù̺…øÞµÕ÷|BUe¡ðžaCq²u2 ãNÏ/úéu<’²Üê±þìÔGÝçCËú¿c?í¨–)üºV–WÛs2Ö}°êî^½-Q\Õ°ì§Nú=<oï‘=â9í>[økL']â"8_Üÿþâ-*ŸáŸO=†Ã˜¿ÄÉï àq1Yvþ3#÷É;mý±ây+éÇÃ=sR=\Ît=¨¿ *R¼lÀµØ,*.Õ,×ãîU±â9ï} N&Ç€wú$^>Ï—ôq×ÕOd§q±¯ðV%ýªÛ|nê3ñnun,é§<·Þ‘tq¿åw@¸~6¶ÊHþ›Ÿ ûqqÅTê\ÅU¿Ô:®Éºd´êO9ö3çË£Õ5wÐqµ~rʱßÀÖ¢ŒâöüãT°|ßâƒuÕ<»¿zÀ0ÞŒ÷cÍŸ>çî6úúO¶[>PÞ?ï`<º¨¼<Þ)ªÉó@·óã—`¥®³‹å_x'äõÓQßP'´éÛר¯œa?Ì?ÎQÊë1Üšÿý±tð¹ÈM–ÿˆ|<©û³¬»ò¾ùëüœ¬ðýÁæÿÞK½h÷ é)]tS<]ã–‹å½1û‰Tpa¥…ŸÇÊÇJ—(qÄÖóéýd¬ëjîª^Ç¿õÕ¸Ä;í†Ï”yŸèñ67i?x,ñ¢ñ[E›oð¨×G뇷տoO³“Õù ù¸Àq}º¾yÇõóTÒ¼£Ô3œÏ<ê¿y»D½³ý´¾ÑôëÇ7èÊ>®íy\,õèÆnWqœ†u£éØòZh¤÷çy‡]‰])ô}Cè‡ZxsiòJWÃxUÓñ§Q#¼†4¿ÞcÒ‹^~Šg’:°„ GÓ·0èj„çC-x¿®Éô£Š?ÈqÝ}¼iK…èã’æ¦Ã¯ªÉü«%]TFu¥’âÆõçýó¹èùp|ûýŠ<Õ÷§×:çןró‡$¾×ܬâNfÓëtúåàRâP2£?÷Õ›')ñ²ÉŸk¯^iêç}BÏÏ¡?/ñXD}’šE›ЭSèù¡³AßçñV6uÃPßQïl²¼­?^u串¯lˆÇlæëúúmñü·óyß‘oÁß3Ý«ê¤Ãòi†ô "öÅñÏ+—é’îŽ?®Ôµ$âÃÒâÛaÈOÃñGÓÔz¾ÌïùÿË>+ÇãJB.«R|/ûEöû¸tô¹¡Qø}áõä€d±Ê×CÌâwüó0ñFvVëýðºqØ)éáJ¾k=4°LÿÈ;âˆY·P­÷V.åx¢ãµÆ¬÷D>î®Nú8ËÐßÓyÜ:Éö—ú2±¿âe·<.éaf¶^—jܘRyÏ3e(Ò÷Mý8WÍM†ç±ô±ÁŠ­*_ªr<ÿ k® ¯ë-»XðÒ·ÿQ¬õ óïÊEáþ…Wd<~Ëhë1.ºS˸ï:¡¿à9mŸ@”Ü«ÆÇÄ/A!}_žp³f:½ÇQq‹™ªÙôñL<$tý‰“_bÂ9™pQMæalu×ë‡t_³Üü,Ü(ø%§ã­Ó| ®ûo¡¿jÐ'ˆkè÷:ã“DÔwm©2miáD}¢Ç×ÿÊ1ïô¸|Òiãü;‰ßõã w¤âñ<»é¹–¼T2¼þ´©†–Ñêõ‘óïeFÏ̦/æÚ_Ò×ÙhH¸ª{óy‡ë±Ëþ¤˜û¢¸óïRó˜äߣ»Þoâ¸TÎk´ž7ãCúI·×÷IÄТŽnˆ§üñbê"Æá:+µèïîçRÅóDGP´FïïW3ðšE¼?ÿ"žÄ ×=’™ÿ/þ¶ÂÏyDã~RêeR§Ûv<Îû±cŸšJL_ĵŸÜ¿Âç+S?FCŒîƒU¼{–!H:ݨO×{wá§œf¼zƳ‘q?æLu÷}ÏÆêï‚ÙãÅ8«ÿ[Ü/ƒŸçªø}–ü`ܼÚ„÷m5î·ú¾D8 Üÿ¨ðÿ;±þ€Ãê§êq ô#ߟ©#Ñø‡ãõ Bã­/Uû™`zeá77$¼拺d¶Eo³‹Úßш·¾Ì  ³¾²›~\O}¾BæuŸS|Æõ¯½³´^7'¾àNáha J£"ëÇ÷–œßæ‡n¬*ø`Ûw»Í1ûØðßÖýk…×#ÐÉQ·‡ùµò>q|RìóÌ’%½U}mKþmH—­&>…œ/]ãìÿçw«y3Nȸÿ¹Éô9†?qq±Æñ˜n?Š(ÞJº=c¯uÂsð8Òf¸îsáƯL¯3Óú”þqR¾®®†fÒÕJÈ;kXûŽ›ó¢×ôŸW ¿ßØs{<ÞΪ:zÜü×ôëŽßÂpÑêéŒà1±c”ðO«é×Q ùa¢uR®Ï˜5\àòæ­ÇOø©Ç=r“ˆ›·ß ÖgŽžoï0ñþ>³ê°2Ï×KÄÿ·–Sõºîú‡Øÿ޹b»¹SÔ<ë ¡‹}Ñò¬hËqûØ48ôýÚßDêè>ß2\õßg»õƒ±¯ªc_¿úú|†Äm÷+6ø•U"òq@~=ÃpÝMúÀXs³š¿™:Èé9ò—®n\›Îqľz²‰ÔƒÆô‡ô¼¨¦_{ãs‘üX×>ÊÈçcÃ…¢Ïåáø~Ç~;þöm3ƒ›‘ºº<>ò¿/ˆÇÏÇ-B÷#Ãu/ÒîoŸÔlù[ŒþplÞJ Ÿü{ÿÏßî®¶©èO¦m˜vs¤uåÿŠaÕôüdÉÿ\'p˜/æw[e\©ò:¤®YäóºqE8ÎísYüHÙügÒ÷‰š?EK©#“?@}‡M}ºÇ«eàÙnØ.üÇ„ú˜þxÓ‰_xŸf©{….Ý£+竺íÝò»¸ûg¢Ÿ*ñˆ½7#®ß²BÂ>±6ýÇ´ÌûŒÕ—"þ^dSýªn2¼6Š^Ê,?Rɰ]C^óÊþÉt>z°þ¹‹ôý42e\7Ùÿ¼}:}£­Ç—}Ó ãÕ‰¿ìæ6èùu ¿þ¸á_éæ ¸Yçý O‡!Hë”·y†Îáú†þöÕ)Ž‘uDCƒ¯7þþ gÇÓïÑ÷÷2™©¯³­O%®l,ô›³É¿2ô‹ÅÚzâ>–‰ßÏb: “»„Ö/±f¡ÈåÐÿž¾_æÏ´~ð¸ZöÿÂå«õãOê'ž—%?Œ'Wgùì£ýGÜe[½Y½oîVáGK¾ÀmÍU¼(ó“1æÙðóuÄáÙ ÅbÝs­Û¸ê¯8¿õ /4£‹úù½§TÆ’×ÔüæÎöb¿¦ìù:_‚ãey°µ,¿ié¿ÂÇ |Ÿ².r™]X†–êúŽÆ"¿åÊP}Šô=8ŸDÆQÇÃä?:í'ñÓF^n'‘7D÷ÒÕ1Y€_“W‰ûW(Ù§®Ó5HW3©þèIƒNò°3á8‹†T·*x‹NÙ Ûå'¿ù?Xüˆ¼­i´ßcé§a2 š.ꋇÂó–&ýPäü³ü˜zõhýgz^¨MõÀ*éä%ß)é86KÊßAßUÂÏç}À x‰GÁ¶…ª.ÆÊýá|ö§mÞQv?óÄ{ÄýD©‚îôžÝ^í¼ðêpS±êŸVÌìõIËÐ5<-Çw·þŠtyH™^þìn½^äçˆÿàkÕïZ -<ð|ÆK|#]žÄ{£ž¡^Ý(3y$Ì«×!²ÌCh/òR'K®ïÞ‰xëJRsí¿Õ’Æ?¼xÚfª3ú6~á¨óiÂá'ä]ŒzWqñ](ÇúàÝ\E‹úÏæ‚‡ÇtÔÑ€éÜ´DË/MËgéÿÖ‚xmÓ‰Ö¿ës–‡²Ì ¸VÕ‹F#ÂY4vÄAŒ½Jà¯I¿•i½­ž°R.ád º²þvu“ç|›Œ“òV0²Nx~lB:õxT1ä‡e¼¾A¯‰ú^£ã!¯ú…à{3}:ìzI£ÇÍRóvsÚ©u:Ö×/®Šz,eèèŒùÓ§£Í‡¸µm©ðpù3úxÒuþ7ðøqäÐëŒëþŽci ×dÕ!a8zÉÁÚWÅi˜I}Û¿–‰‚3Ëu{¥N$®Dp4KX®|añ,¸aîÂó¯L¿BâÕ%¯ÛˆõÅŸZxG±ÏûÉfª°ö¿Üø–>+¦çÖÖ¿ µXÞ{æwˆ÷Kx Îo&]TïS¶ß–ï }Ä›žë«)Ï.ùR ÷€É*žØï»¼Ÿí³z_1EêÄ6Uç÷,†×lj‰+¾úܹH wÿ^?åæD^Lö!ÿZ>?øJyò+è{ê_áÊsäx'¬×Sê;`×±’Že%Ò£l)ü[  ²HWZêR.¾EàZ«0?täNëøÿ‹oN%ÎBµ˜û—ÄÚëþò¡’ç}†ò=‡ôþH\ÃB}½3ïvÊÃs>™)NN O6VÅA#‹}ßTÄyÞáð¸Ê”GSOdí÷T¿lï©ø/¸t˜ÊÏÜ|{8áhøutíSÀu4°³¦^¡ža’úâ]+¸ñ/ç œ'??ëúA|eÙoÛvœL*Ð|Ú†é%—;?ùÿø³:¤ÓQÎçk^‹õ{$>p~3³Ô¾"†º‘ÿ=ÓÏ–ë‹q¤®QÔó+³2»ÍäÏ›tî¼ã¤ x Ççr‹x_AÜòX(Î, £bÉ[qC½„8D6ß`àÛú>†ëûÒù#QÓ’§|¸HÕ¡>¤æÍÑ*%½šG>X£›·½ç,yÈò1õž† Ý_ï£S‡ÅÕLy2TµàîF^£Æïï2\]K7ªqü<·z õïš8â kèß T ø‘âŒóåß`ß¼™çâq6aƒžBfÒ­FµpœBÚ¸(ïtD=žg #ùPÕY?÷¹Zoe~PÔ~‚¼/ê±ÿç\M:Áä÷¶ÕãÔQ‡âùÜd}“ÐRâ.j œð Q§AeÊëXê¨Xñ¢“––~hà8mõó¯;¥ÍCöûxYø‘q ]3“W´÷î¶"?åX?@«2ҷئË*ß/›Ž~»xz”iYÚºÈý©Vz™÷Å]ƒE>ð7n÷ÝÖʇßߨ}°óMë6à8¤>€ÿ¿¡_¹­o2®¼.VžÈuýÏæ‡Ö%}áU'Íލcºø|þÓ—¨úb]À~­/I濬úe¸Ž©EïVöõD?£é§ùo½>åß,ï¯Eeü¬ÌúGzȤ¤ íj<.DŸ߆á-rÔó’zch§êºšô¨Q.ݺº¼ˆ}ã­ãÑõø;\çwÖ ¡¯š¡[k Î埰îM¡w6oZ$ÛU×ïcT‰ò£LïÙ¤wÄy¡¦>42ÏT#©Ùú£b’ŠÓA5)ù‹Þ!†+ó%j2ÿ |´¸]O$ãáU3¼§ÙñæGï,›ï»­KœG8ŸÊ„7èþ©þi¿å{žóøþ–¸6¥|/Š Ÿw¯ËOĵ«Õÿ-ºO6=`»\¯ø²ëÏòUćÛðkQW yUÒ™/pÃë•Rž&0~Uª‡¹°ý€¸f‹›M† ”7¹ô-‡uäãûxm†Ÿóލó¯kþÃó„˜ý¶ˆ÷ ¼Ÿ¨}¼QÁ7ÂêxäWâóˆyx”'~TSCž{… Æ`ÕNýyXpâñª;örÔ/>_†ê†yð©ÊƒÏÕGk0?ŒÅ¯&½ÿ{òwÒîãóvs ~l›N*_õ@mƒ®õgê}•ñŸìëµï±¼JnyBt½'õ©ÄKÐûÿj2~2–ïxÇWXŸ0“ÞIQ´øk—©|G¿[Y›×0ñ%¯›«ñßYf™1×ç3‹·FcþhË&ç–•ŽŸeêwí}Høš‹6 ¿ÿ?jëûö±øPâ01á6½Žîª‡õ}?täÝÄì³86lþy1Â%§Ò2üŒñ¹¢Å§ÞIV›óXx¾´HàP'aý\öaµà“ê½s>‹wŒú~}¯Å#ýU£c:¸@SüŒ–zQDž³ôPLׯLôÜ{§ óÉG¤ÿaÈ#JCçð>%\ŸÁÖO*p1õÅœÇgøàLñ2Lñw&~é|õ‡’õ¡´tY|^ueÇ>,ì:Ê~’ÇìðuIÆ·‘Ïs|xßÞ¯ãžçÓKàlü0Ã| ýJïc‹þÈLC|ZΑç^ŽçÃŒ½bØÚYý½¢Íð ï0駤jÃç{ÇÏîËÊ+È¥øéý¥¼=æ·ñՆߋíé[7.jwµHyUìý½Q•øÑgß9bD‚½ ¿°á¦ë3¾¿cþDÖíðØÊsLSÿjÿ¸×^£Ç%Küô~Ëñ~%uY„0X@¯dý¯B÷w}Oǵù/†þ\7)j¿ãñó!R¯ãîqß<}}yBgá¯É~­LWDêöká6ïJ6Æ>¤©cœñ±!¾¿ôÉHþF\C¶[Þ×¼¥ò†)‡ª”ŸÿÑäsH |V|oáCÈ:©?žc=òÿš!++n?žÀqû^~Aà7Q?æ¼ö~´¸Ú;æöÈ>ª²ž†º¬±ÏœÉ0:3}×l~Xâñ#úOqãcŒ€ú‹xãx0ÝlŠÒŽSÐ+]¾+üLŸ÷j53³úŽ9 u«¹îþ¡pÿÃ?nÒþ‚â Æ¿F—hùtŸ¤âlçþ9Õú¶IoÓ¡}?МñX¯^Ô‡,:i¨š¬¿|[Õo,x/Z£ù;ùáógÔ>'2OëÚO-p¼{ˉz°ç,ÃUÎWx"Žocè{né×€aÍ"­OX`B[ÌTwòÇmbù¾ƒ/Ú”N wgë_šiä"Þ—|ßñW«ñìʡõ,þ†ÀÛ=ô7ñÿs—Ô9W¿XúM¡_v(æzÖ63zÁqͤ»h2 ûBÍOg ?#кš%Äúu£Efp9ÒxžWnùˆ©¿WñzùñÖoþ{džVƯÉûãÌÖ‘°íiíóÉõßÇìwcóûy ë~þ\å’n‹äûÿ!šŸê—ê¾Wûé8#ÕõÓ{†ô-ù[ïó„|Wò»½tsTqyL¿äòźW‹òІú¬É°æ5ÿs"ü½v¯¾ìæ½gÑÕY’hT%ËÐ75Õ<%êtö–WRŸ±Oˆºt:¾…?ïjèÀþßÞŸ¦´ 7ÿî|ŸB"Ãã‹ÏK=-ªáòªçA÷Ë!\W1ñms"Æy£ºŠzVVøüš6žÊdü½äÑ©Þæ¦:6á^8_s ñ~´øÍfÁê'2ÿÕªrèü€ÉKD>üÑï¼ ¬; ö üöÊ!J¾Ù–õžâS¾<®aü.}<ÞkŒ“ß‚›_óæÞ±¢N–JÔq¶´ùñ=]Äs;§½~¾Þ»[ÕýÙVåÜ_¿Ð}ï©ñÉîE݃õËÂWÄsrÝ b]o)ô>±ù7ÜÿÊ#*~§¡¥ýÞ_@Nfýõ2+Üúê|³A?ß8·âM}—"½Ÿ•×¼Òé‹…É»ãÅý–>n¸._]N'«“¡M4}<Î*°á%e¼ãþbfëzÞIÂî<)꺌o‹íµÅü»c¯^_Ù±‚¼h}vä} ’/þƒG:;ï/§ÊƒyM©çŸ÷IâÕmë®×“~Ñ2nÇúØg™ÍC˜Ìï`È[ÙòȘ÷²6¿ƒ 8å}$ïÀ?å=PÀp±9ú竦ˆ¼boÁóĆí ^J˜ïM¹~`3ŽG4ï§ù8m¿œï“Ô…Jáêê³õô ‘m]ÀºêúuÙ‚?è»W3è²8öÃÂ'Cyâ‹R]ƒôyt±à ZJˆÂHñ×1D‡p< ª˜Þëxú±ÿÕ°q^4¾ù–<§| fgEÓÍføÞß5ªá¢ˆ÷ñ¨£^À)­óŸ3ëxNñ2ºNEââÛú&PÝ/KUßÚ?¯VñôHLfÒà·¦œ¯:æ}Q΀§¶è[b¼(ÌcûQQ¯µèGdJÜ;Èt-H¿Fê€Útýý zKí"ÖùP+b¾„×7~K‹tûÑËõ„ç Ñá¦wTy}n“^ïÏ*užÛñßO¶)O†¶–§Ôçù/ GÈø¶˜VÍr|ÍÓ(u{¾.Ž¿´$Ú Ì•GaÓ9Çœšê:~Ý~}ŸÐzzÿ„çéPßÂ{<`ÐKÌQý%©ça‡ý~Ô¤8~õ#ú<úìÓáy~OÑfXS]øLѦ[$y|hHyáˆqžÄ×¢Šáz6ˆçGóëŽÝg…ÿ¾®£>/i¸Ÿ¦ºªñ•wÔ¢‡Á® ÚŸ·`ðÛ±÷5›òЄÛE«±¸ Ùä7gëÏC®3Èf8Ï6ÑÖžÇôõjVr«ÿ9êôÒdœKÏ[u}ü%׸¸bëùNó8ñ™qI¸î%戅wü%_µÓ‡Ò2äEì+ù»2ZÏÁú»Å|2WN¨hИ+Öð:¸´¨ý2£šUgaw/5Ù”Õëé½ãñJ²ôù Çç~®ƒOñ³¯÷¼æU§Žü?ÔdquùÌäíeÕºÝÉôë02³ýÀó9{nQ‡}¿à{úõ²äçj_ Ÿ EÔ<Ëó`èì2¾}™•Y™}© ›î Ï˃ŽõЇôLƽ‘‘úŠ^¤w‚Ëþ\ª:ƾ政áõedé×ï¯Äk3øW6C[úýRoú´Hüˆ¿ÝÞ[„Ÿw ÓËm7‰ðõ[.ÍÀæq"ïcËu¨­}–j3=Ï”ûx¦m™Öª‹ØŸòû¸gµ>oó͉‹]ò0çËЈÅˆ<–Ä¥z_c}žI×ÇÉ!¶mUXæU\õÖÏ$Ë·Úúk¥m²¯¢ñ|Î“Ž¤«¡sfÆõ¾ ¼D-–çiQw‡êަþ·í¥ÞW ¦;ÊuÔh¦áú'¯&× änÚ¦Ù™Õ­É¢x¶€ÞÄõµ¨&õR%î#­qQ>³y#Ù§#Sãë¥S ŒÛ*Ýú›ï7Õuì7Rò—”gEU?Û2ÿE54‰6_¢I<'LÙÉø¬éðLg&=<ÔHöœÉþ2ÉÎ.d|z½ÃŽyÀˆº¥eÞqC=ƒÕéåzèOë÷+½–zû—Fz^mzñ'çÓ×§üµ!þ6鎚øc¨I¸)Ò‡Å޼¥ ¢áZ_wÓ@!éøP^¹,nmdéÛÓ_ƒ tœ3¥‹ç‘8×í‘oÑÓ/ë¹QO8S¸Œ† tÊ¢3ÀtppõÉDó>ºmvZ·PŽê»Mӹϼÿ¬›¢{N;•D…¢NÂýNäéç7Œ_(¶Ÿ<<4äÿ/ý"Ygj3)<ßgÉ¿ðºJTCë>z¢ñ…¡g„ìttù¬Ç¹è¿úódñzo‹úâ¢Z"þëù¬~û|7=S4ˆ×Ìß¿w{¡ëuÄmþçxŽÏ2'‡ÅÅ_d6¦§—§ÿ}Iy)Q-êsä&^pçˆú¿1-|¤¯×cªÃ¶K–§DåýJ*¦ç{,:mrþmœ°/S1ëÎê¼Ïƒÿ¹Eç4pœªŒ/ñ9Ãåçèï3êN³Û#ñt;úÆ›ÑRí¿ˆÂ;nÒmØŸ´ýKn<Ï£ ÿQx§žçs6ü:¡¾ÁohN~õ¨¿©ùòæ,^•p­F­Vóó&ž®Äãòܼ¿%ê©<Óïó·¯ñ>t´ð»Æ«;¡vøóåãŠÝðF¼ß°ÿ½ÇüŠ#ŽãNz;#x7ÙÄÿ?êZ ©®[!ݼ ʱ÷§V::-hM:Cù"Þæ¸4dÛ׊§ó‡aùáß7 }åSÚЗÛÿ¾-ù ýq&ÕÉ}þd•hë¦k^ …d›ÌÌ/™¶ÔúyÅÌëI\ ²“ù˜=T}_,ýQ9Þúnê÷¿{<œ´«_Úfí?ÒÈO>í9²ñômæ÷w³ôµKËÐù…Ðû‰Q7¥‚‹—ú/IÇ ŒkàE™ U 8; õôߣýGìwf39ï[õ «–î<-õx½->ÿŽyȨü)×¾¹¼ßGÔï­ãÇÄ›ZÇM©Ow¦Í;Mu¢™uË‹7‰O™tTÒ²@Ój”G=TºuNÌØ¥â2†Ú†üÔuÏèóDŽñH@Þ¦7sTòÊY j>Ü7YÏç•ÌÔ!lü-dF"pœrÉòÙ±[ò³®órÌ~g¥e&t dÿrù¹¿Îð,ÑüÞÅR§÷{éÂÚú¤µuËo'5Œ÷ Ûç³÷º7ëÏÖ'[ß%“Yù -U³¨ø=ÙLjãG|ýéŽzÿX¥¦¡b§SÚu) 3\$~¥þ«ÿ¿Ew"ª¡[IZC‰ñ†}+Ò¼µÏ’¯/F¼w©C€™Uµ÷Éu³Wê¨[ôB:qMõÏ£w$™_è=Ìæ³?3üÌz¿Ü;Ly¾›fdtÞFVB|CQwDÇp< 7×8Aâ0^$ lº(þ~û»Ú2ýœÓëÊýº¨ëØðp æß«âªJæ üÒô~z<ãšÑü•{— ý¯=UùÊ­éÖç·-¯¿^#ø_h?â´Ôw‹#Æ7’çjá?»ÖïŒçu÷LõºÇ¼âXþQ§5ë‚à7cÖ£ÂÏXø|Fùö¼Þ,ûHýïl´øÇ;Jzxƒ/ ÝOêrFÕ ñ÷§|Šì×È¿ÇB·þ'¦þϾnç ï„®/¦õ SÇ«<ƪ„ýSµ¿ù¬B‘_ÔÛǺº‹ŸsÏ)7²û? k~ì¶ncó±>P!tq«z§ ãíÛ&®÷ú_Šç§ª#ïð¨!¯u÷‘é×Ûê¹èD|û•ÿ ïNóno«ÏW0?•,~•åû¨f‹÷%~›ãüï ýÇbŸ¡^ƒæ4ŒØ›Œï² ·ÀÓ^ÒUä»Þ4<'Ù”Gb:z¨ÍòéÍÓ‰ã‘/ê.<jÝ/ËÀ¡ü…ÔAåù3ãx–¾¿í¯ÌuÃ["ˆÔ—idðÿf¾•J5˜>3ãY åÓá8xKïÓ‡´éÔø-¶:£>×ü^Ä] ¿ãí§¿ì9†e<ÿ9p\¦ËŒIã´~V~,ô4î(Qu¡òÃýTÍ,_KF^ÐzPeVfe–ysïL†_NÜpTË´>]™}¹ë”Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•YfLâÕ36þìÜp¿_iR*<7ÿxÃÆDÓѺöh$^®wˆáa'žPy~“G…óâö8ö»óϼ·Ôþciã¯$¯Á׸ï›êùæŸ~rçËP t`Дt»¶uqâ1<·ï“ ûùÿ3ý]tއ÷!ÀÕ× þAKÒÿÈO—_8ÞMßQñãS„Þû‘[Š™í;UODê6¡±ž÷àˆx|Æ'ãü.ù?j®m?¦×ËÇ# Éw3—õ B Ç€Ëóùtü~¥¿˜ Ÿ=U=M©—lâ 9ö1ÁµÏ„¾Þ½^&–WuëVŒï{Õÿ =šéÜ!?³ú®>²•^?ɤ»ŠGÞ©›¯xßÜô+}ŸõËTޛẚt‹PÑÀk¼fƒzü¯|]ð¾ëù|óÞdý+böQEMâgæzžg¨¯Ñâ…Jþª¥2Z»Í·Þ‘hω÷Žc?#Kßï#âÕ;êÅb\ÅDz"ØðSUÇÁ±_ÚüL\ÿœ ³?tZ}î¤>†ÿÿ'û?Ÿ0Ìocf«:=«—ª: ©[GPÕ±ùA=ÿQòÒpµhn:¿À~‡õ~ V~*üPÔß®Ëp}뚆yqÂD¡—bÑ)ÂΗż{ínÁ»þåœc°bíjÁ_kGþasšGVÿCð'¥ÿüÓ'w+ºRÖÎS6}ãÀyÕŠ¶}àxgÒéÏû‡ûŸ¿¦Ÿg0òýöŽ};m†_Îþ5ÞûÄnÍüŠi_ ×cvÔiË”I½|w/\¶Ç¿vN÷íãõ7ê—“¤w2^ÜcÔo;”L/QÆëþÿÔoŠûéi›mÞäçeÜNê¯8ê¹JÃÄËÄs1ñj±Þ0Ýp\± <ÖÀ´cÆo…nCD=MWC[¡OŠ*ñøüQãIëùÜ2Vôá,\ê_¢Ó‡uÔMá~#îl¤¿îÕõë¹÷F´¼דµé[ã®òêóÕmq*ùù¡ÍÃázƒ_ë~L,œúlþo¬ÿ¤4®§8nÉMj¸giž2¬ãÆã®4V½uî½KkžÃhG=iy¿¶ŒQó)µõóŒK¤^ ÷é´çŠëîëØ-o—L¿uPp#®sübÄñ›ZúâÔ ÿdtûÒ¡|UÄã²$¯z=r»mªú&}ôùãyQœ‡®­TýÐÛ¿÷qöâ½bÏa ÖÜ‹óeùÜÜZ¯ÿ¿ËSß³Û:ª¿ˆxßqëóâw_׊úkéç\|•^?jߊ™Jþ„å%ù:Œ>ýsŠßøç¦ü°ÿ>ìZ#þvRõúMù–´ ņ|ª¡ê8곸¹ÝJƒ>W\ÃÃCÄó0h‹o7t‹cP¤ö%GߦÔW›ùI¹ú<¹MÏxÜKn:Ò÷TÓÞwT´ô‹êš°r%¦+,ãž=Y±ò*˜ý´šÜQ)ZÿÝç¨_Ý¿X]æêŸêu’>Uã-”üG©êê ì¼½·ôï²-ë}G½ïáë9²õó Æüù‚ª¢¼¡/ŒÚþ¥ßG·Y´ø}6†ú)\ʸÝAG¿\êHCÌ;(ë$ö} æ×·|S]§›…¯3~þªÏ‰DùÔg:S˜Nx5îªóŽßu{^ÿièCÚÈ76Ôç¤"ó¨Èò·¬¿fsÓuHùî‡~®=Oïcƒ^[Êu<ü‚ÛóæØgˤ§˜)óÞ1äÃoø©ºA×NÞ_T‰˜çXûFfú.‘`ª·ÎãRÊG ¿Y设gð¯ýž[¦ÿ³1Ï<Cw·zHZïA ¿ñ8:)}‰¸îæÍMÒÑq\-ÏÊû…ñòU¸³¿¨OÌÙ?4q|žj;ê°tÝm}¹qY‰ØîÕtãÔ!<Å?QëüþåÅì«wM^Fp+˜m&7mß6<ÞA+á?øõkg¦\_5æå yuìú™šŸÙY-ü¹­ïVŸD1ó'ø{}±èÇ„j”ßz‘ï‹–>¨w.ûí§ÿ¼«ÏPA—gõãÞNân*è×WL+òT‹~¢_¿FŸ‰–wÉ#éåE"þª³ÿAŸjÞÂp¿«$«ËÉû$ßoï‹{^Œ7.. ÏëÆ5çr?ÙÑü"42è Ï|5ÿ #žxÒýôgv¾ùïEÓëgºØ|À°Eâ9/Òã`po‰>ß‘R?ó¨èïk¸¸*^&0ž¥ß¥÷V:õû2+³2+³2+³/£y¿œ:Ë2þ8ßçQfeöe44Ì,~®Ìô†"5^ð2Xý%j}<'˯‰4_¢£þKæk¢âÓÇ«cÈûlo!ò‘«¯=¯|T7Ô; ô}Mu°ÿ­†Ö†~;i÷«Šˆ‡Co~ÆÒŸ Õ2ƒ Ç#RÅ×£6áÇ«Jùìžÿÿ|¢w„pÝÇÝò¿&ãxtPóÕÞKjÞK⋼¿ßšñ%1è7œÒoæ=Y}%Àz)Z>‘ã‹dÿCdn —êþóÖ*¿ÏÄÓ1ç]ï¯}Ïøjh­¿»œÓ„{¨l˜ßêP]íšzü§ÄÇ]Áúû}¨ÎÞÖ,­ºã qþ<ÏyÃú…õÅÊKü¯ñ{†«ðŽI¾¤¨çaÄsuíºhÇ¥q½ÏXÞµ5ÝÇ›G0þ¼‹?ÖæSÑê ý‰…§“Ϭ?Äí#í|g~2æý§xnúVóM%CüNñV? _ÁæIÓ<%u…Ÿ_ýšÊ_›§ß¿÷‚Ðyçêu&¿ŽK»ø^u¾¡ú .5ð—ötrâù‘Øy·þ±ãç<´!‘?$y¨’,omºßí ù!ïS†¿¯làE:â¼QðºbÎ+úç®6Å…q½gY^™~ê†ãEe^ýg†ž¿ã/¾¾zGÓÁy¯EÔý1Ì7®†nçÍy Æí6õ‰{*úñhýó¾Ðû¯¸)ÏßÓ/ /7üzaÉ7ÞÃ)ÊS ii^÷÷‰sãýêÛxôQñd¯øœ½·(ާËå|3¬#Èó-Ezýµ´ C»Š8Ý€¯Gv´ß‚ðçÊÇ×V7èž ¼…A/"î{Èù‹®†j,ŸpãJýs}ôüàC¼O"æ>u\× ×7oU×áüxzJÞépÿÄU?.p~Uõñ¯›Ôs>~ù·´ˆ÷¼U¤üA㈺¢–ú!vmÐç[ë1Ü4Å¡¶¸Ó;K|êîO  Ï‘ïSø´¡>bɾÉêfLŸw G‹ëŸŽIMµÞbȳ،ÏOhHõ;Ò“ßc~¸nœóñxÝðÓw ¾8ÖüQÌŸ‡Õë‰=Ð>O_ Λùû¨Éê.Žó®Ì9ÿ.6®wاeÓ)lŸ2ÿËfØü3Gþ*ñ§ò’ì¾#‹æ‡Ö¤›b¨ŸaCÝX:ôS7}ƈq†?þ£WžS¾AaÌ9?ï"ï_¾ªOê½Íâ¡ÁGœü%þÜÊ:5 _ºñ¼Îƒj†:ÝÞ·U<æñðøž?w2NAªg~L×û´%ïP»tñݘÞçèB7ï{1ó›ÿ:°ý~¦_ññùñK°½ŸÞûî_g+y©bÊol›,þ^Õ@èápIøöãz}‹@êúß×¥ßÕ‰õ[Š›”ûc¨ÈK¹æ[l†‘•넪úùù¯`ªwb¥À»I<|@ŸÙ”ïXõ¦~¼A*þ º…%¯Çª£Ù †Ï}Ûn× Ø:ä¨Ûç|ž5^kßòsž³ÔsFCÊ;5£ü&Ëó¹öõ0×i øÇX~²w`È?Êú–+ÿ w <™÷Í XnðcNùGï·|‚©.Š·…ë-_M‡í*9÷wÏßÝòõ•¿0ý»"ºÅdž|˜wF¼gWƒA†ùºm8³êk¯7êRþªZ¼ú_ã7ÇŸæz”q͆K5õµ®ãÝ#üâVêõG®AêòáŽ8o ~y֟¿¯hXdmçLu}îËÖ·ÖÂÏ÷ç©•ãôyK¯šð¼hIùGü *ëçÊKáÎ.¡ûKRäâ¥ÂIÑê­U¼©Ä‹ûß³>œäo·y…7ß+žŸÈë­\ߨÿ\®û=j;†[–ñbžšpµú¼Ü¸TÕï2ÔY8¯OˆûrÕ‹âÿ*ä6!µÃ†¼c@ÿOŒ+Ÿ'Ù_7=©¿¾-¨Î@<' ‰‰ËfÏ·‰'g'¡¾*Çaì7XÝ”Å!ÌE}Ù¯1NÍÔÁÿ¾Rfô1üþ;|#Ö? _ÊõÏ¢îØ,t_÷óy‘ñ@?ÒûSX>UðÑΆçÒ2Ôs«7špLþ87EÊCzÆÄÉ™ð3[W ¿¿Åkuô¿‹÷ýô?—õbƒ^3riÞ ü;ö90ô4®¦qX]».qÃ}îØ¥Æ³ýXt6ÅýÞ/ü‚– ÿáÚ¡­·3þK¬Ïs„*@óýE?¼Ãç5e˜¶¹öéô·7ð¤áګĺD|B4Ì,¯4-“~ÿõ-øŸ%‡žG™/F£hõÿSìù8”g]Ÿò® w†)óYU'æz›øøΑ¼ï^ñpÏñ,8ÄÀù8Æó޼†¤æ§D—ÍgXtµÈÒ_çqÎf†‡}¡j±xÊà/#'ü¹Á½3D^×€ã4é’ ²¸¾<ìïG8D¾ÒÕlñ¾q¿—ñƒÇÂçÙ÷ÓFz®°½•~¼ôWÖ {íxx   þ×fÞIÊߟˆy }Fη¥Uÿþ÷xt?¨.t:ò”\ M’ÕÏe?ï·‡ÐÉù<‰+÷9ö9ùÌR¯eüa©³ÇTw±ôµ½¿&=¿vWOqœ&†¼a~r7üßaÐiqåûÅÝxDOº­Ru>²øÙ­Ýp©¨Ìp‰ìºr^½w"‘ÿ-†O ¿}¶^·žÇå¨gX¯¯ü{Fp hdŠ÷™nØìb76|¼=Õü¦Eȶ¾ƯÍêÌ»v ¼ÜýEj²Gã`ÎïD\]‹ú£°ë+×?¿¯×Òâ{±ý9CýÁä~çxŽÛªªñ÷x/Å„ÇÛú5µÞññR6=¯æ#úSønØó¢ðŸxÿŽ,†ºAà“±øq5OüèÿŒ{^ÿ_7]üî=Ýżמü/мãê<§ºœ+ÄcÉáoÜ7Rô…£>©˜ÛSœÕÙ°¥ŸÈÛI=5ªŸà!Ñ _?%Ž?UðæuÚ¯‹qî©.p¶wu½;ßÕ®ßÞQÒËûúÀ5çÎo =—w‰ëñ£ûÎõ/ƒy"ßtÇâùÈ£õ{ßú>çöÿÞˆójLŸÉǧöÁ•ßmYŽß­äØGPêÚ 5èr];Pë—ã;Eâ:5&¼Ä¾-âyúÎ{⾎ =Žs£z§])®—üûÄ·Åý~²ýßA}ЀxU èþ.%ÜÝA¼_ÕóÛÜaêû·ïâþïj#p”Äýµ÷KDœËÄûÛ:èã‹»+Šë·ø²ðø%Kïÿ9óû³Ø¼|›pP"„q׋B÷Jê¥xýþìh4ÿÀz÷ôKŸˆ*4ÿUd}ó#âQò‘¤C(ë·œç8‡Ô¡µàñÿÊ;îƒõδaáŸÅs¼d¦˜·Ñ{×È‚»Ï ¿˜ó¾º.I}å 3’·A'Š'ïü©:÷-póÿnð›ðå ×€e2ŠW5õß’õNþ9v+Z;fÞ!ªu·ŠJÄ÷Ç-º ÿ°è–}ež6¾àdº¼DÏ{2½è´ók½Ïãå•0z{¢¼%nàÐùaýúýh“s_à;·©øMªgI]ÂîLú ÷>¬«L¼ô¸zœh#t±1ê¿ÕõoÕÚyÖ;Iøó,vŽžÛÆ„Céøžï¢Ç]y_ò‹¾çîj&ü¿üh¼’À88?z þñkü™S÷U5>Èp»þ*pIói:ÇãçJ ôSk â.Ý<%ni"ž;‹ÎnSªý‚ç19|Ý7áМüÊ¢x¸ÀÀxó69áLz©quëñTsáïÝì4o¢½aÞ}Æ‚£ßO¹Îõ)õñðmUœô7pc-å:›p×~½`áD¦{ùñ;çˆ~íèÿ X·?çæ÷™tp ¸}®ïŸåE­}GoŸ§âC;\ÉOÃô\±®²¸Ï¦WìogñŸ¬ÇŸš—=Ãæå͵ô|“,·õ¨7¾ñû™ÿÿ<Ši¾°é8™t­ÇkÞ§jä‡ð|GëFz?çL´|©ÍP¨çõ›øê6‹ªçïGïq\Ý@,ì§äü“^Uy þ}¸’óº3ò“åÛÐí»z&ÒCÇœqnqGcò{ ~+:°<õCcÅ:šCyœn"ïá¡zH†ã]=D_ÿ­™YïDLþlŸ?gÄïÇðèë/”¿—¸ÃÀ÷Ž8=“ù¼ÆªÃNØ„›DçÌêUb¢?‹QÑðd¨AõØ‘B÷ ³ŸóòÑ×AêÌÈõØu\W¼*ÇôŸ¶?™QÜœ©ŸDäq^tÛ7ݯ÷ãÖM½÷£=‡˜å¦G€¦”pì§8/V÷F}Æíù´ÖïEVº¼ d»Í㦼¬qû¸×Å¢WØÞR·ôuO¹Þqˆ8¾UcýžÀùFÄŸ Ó硜õü,ýÇñèëg±>é|ü§« ÓêÉYú-£XßoAÖ7üúñK‹/––¡Ë?•+ý(WC ¦ÃnÉ‹eì<¥£«Œbêû“ÇêH3ƨxñÛ—ŠúfEK?̘:\<_.ûCa™£oÕÏ[‡“é=ñõíT¼Ÿ»lp~ò½¸b¤Ç¿õ%½³ÔÓ-G×7ï·cäe}E+Öílº:T®æëÖs‰•ú›¨?°éªÎÿ-:G…"o+uùýýXw“î%¦,WÏ?b]ÖfÞ)G½ƒ1Tÿöû\0¼á¹ßeâ;yŸ“Ã⮿‘®„×ôÕ>¯,Gº±ÓU}‰¨úq¨@벬¿Õ žÁ~ï§þþâ߉÷ô¶ûT|!õ¯Æ5õ™WY}¢!ñ¹î-¶#¼1®Öó@ÐSð_Mue[Ÿ$âãzl[²ýÊŸ7›Î»§ÐµÄ®õy>bégxõ©ð“ýw¬uÇäoÊ:½õ¸Ûþõâ¸g#>×»^ztLg:*5Üð|’7#ñ-}åb=nÞ<ž›ß†}ƒñW0„ð`báðÎèkª?béXõ?Àxüú Áx2þÄòýzÃi·û‰l†78@-zpqÊ1ÜÆÊöb^ÓF£ïÛEÞ¯_ö_O‰¸õ¡Æ¢~Y‘ç+ÑøI6]uÿ¼Ö½®+Cë-® }«jYò0$4 gÈ‹øß¿£Æ}ÞAæßÏ«ê¯úç—Gñ¤Ag:Ð_}ÊY±}J:•h­>¯Xûw§¸ׄÿ>TÎL\ïj6I»Y‰çÏh½þü×.{]‰Ór¢áT°áÙð>ÞÄW–ú&hM}?d¿ØîñðlœßŒº4~“p¿I?ôt<}RT`ÿ·z]Åw×L/ÚLò°‘Kÿ³þ$sJ¯tË×DüaᥚúK'>oÖ‘ëfy'i¾hnÐk¨lÑÙ²ð QO]ïM~ ç“oãj¨ôCTòÑ«‚ðû#êå˾4hhˆ«™nVÜ~/<¾ÅÚ©Â/Ûý™Àw¥”'ŪwTÜZZß§³yfÙR§çcލãM¥ø‘é‡z' ×ù7{~yR¥eFýùá[Äúaшk¼FÌÔûMùóHe×xÃvˆ÷jOS‘o™ÖNÕ56&ôº£¼E7®ŠåˇT'ž‘Ô|ð¼ÌÏè3ZŸ§>Åü€¶uïÓÕ³U¿{òK‘ê$¨Iqéðb‹'ø÷œs€ÏŠðó4ÐA>å}æ aw®ïži½ûغMMbò„)OÌ×#[ÿÍ/«ñ¸3ãÇ3ÔƒQ@<ø.¤‡=l‹:O×wÛþ$ðÊÔo3½3fR¯+îþX¤Ï›¤eè¢_÷›Ùø*©™ô¹pkÎ…¡¿Cù4tˆ–´™äoó>©Æí³X=æ`<þ˜ìï¼ý¿2ƒÀŽý±Ö©æÚ?»nUëê+þ¢Ö—×Mˆ§#ëØ?Ýf¦8\ò1 i*< SßXãöÌ_6é’Èú\\¾=ç š Okõ¼°ðñ~®ù»š¯¥¸½^Ð÷ã8©ÐÒ’ï‘:#Ô'yéÄwRG‰ûÑiY@gôFŒóoE–/$½Yµñä‘ÃŽÇò‡Fœ!{îlõ_S_*Sÿ7LÛr^âqT•:nç—·‹šŽ<Ùnä¿•§ü3˃¢Š~]ÀšY±æEtJÖW8Óæç[‘þOUKþôž»B×ç€þ·¬;}(ëòjφ[Hjg#ó¼¶üp Ít»ywýP;*;â–ÖväIF}Ð2ßáñË+Ÿ»OmX=nMQo(.]jN#°=ñο†Î&]k×|¾ì'äz^ÆqÎâÌ|âÓÞ1E¿£>ð¨Dy¨~jœd‹ëPÕ’[‘'æÇ˜}vucšP˜’žÕl¡›Öwž×xJÞ‡Øû;úûÆýÉß0ö'4è?#›xOVyó)÷´™©¿ u¿[Ÿ÷ÿ¶†*Îó7©ëáû\ýqÙ¤C)õÐFŸ—°žw±Ú7Óˆ÷—­H¨›Y\“ÌŽvý!–µ‹¼Ñâ¹î"Ç-NÇæj¢hÑñÇgz­˜3ËmýÍ-õ, ÏÚ<|þ5ñƒ¬Çy1ü{\ôx$\=®½GÍo^ž­þŽ–BßÁ5¿ŽÝuwÇü¨YïëëlÙä7ö·ø¥Lß“ºýJZG{Ž)4o*癸ûsÃ¥cõóüîçÂý Ù÷«uµ¡;Õx–ðêh¢Wmë… ž)³õKáº0¼ï×ãÆÝ?¸„˜}¦ýqrÉ?-$Þš—$q̲>¿LµÏ šYô¨ûÅ{>1ÿ^Á_ؘ_*ù€ÒêcíOâ³T? I÷·ÓÍõG1ßúMË>þö[õ:àÖózÇ€cjW¨ò: } eY×ãá–Þe:yBTHG—\êZ£ù ‰÷—n<ÏÚtŸ+°>(ùz}Dÿ¼uö°é›zÖ(Òµ7Ä‹þvôýǬÇmH~Ý[1ýñ\†Þ­^kŠ[°+Wåä³÷dèMéèþÊm>—y* Ù.òĦþ(¹û«·0¬«äŸÿ»ƒø½¦÷<ªÉx#n#€;°èšÊüŸüæÉô§9¾ßz¾Žú·Æã=».+£zÙÛóõŸ_­ê+G͇E>\ÊÓô&ÿ¤h’ê§_t"ÑzËûȸÐÄ °žoEÃzvÝU™Õ{¾îŸ¡ó9¶ß+/…DžúU ¿RfòÀŸgòßQ;aüã¸>üo5žÇÇ?W¿tŽŸyà ÇÜUÕ›ç8S4#üî;áëž^S¢üß–ü× âÆbÁâxÝ„‹­žŽá<¬€?»å5±~­½WÔ(¯!ÿ¢­«óþÎ×èäæJˆ­¾ŠJz?ÊZÿ½ùçáyˆ6ž¥w˜åAXýÍÆw(-“x´;¥ÕSÀ¶{î‡=?ÞAŠciÞçq·¿ÿ¤kôu5×¥‚¯Æö?‰çìi¨ï•¬£Ì¹7¼R‡þÖŽ—ÏÀMôû©ßºÏãž{[øóvûoEüÿ5}<0C\_ª{™xˆh¥ò™½C´½E¯Üßá“LyñcŒWÈæwï}ƒ¿\+<.B=¦ß»nŸZ¯ ü°ýæ‡Çcó§ùÕˆ»8HñäuCÔßù…!¯xû|½_ÿO‰3ð,>ÕÏs¨G|xz¿pÝ7TÞò Ö_ıþl3<úß*>b×G¢žnàç 9û¿]·}GE·ˆ=‡]«LjÄô7›é?÷ÞŒ™/k+ê—XvsFòX‘õÆû`þ5ϵðáHþ¶i°·˜øï†|Žw:Ü/F?=/2°ÝÌ¢Î7sˆ‡ú1|ÞÎõïéZñ£˜øh«&Š|ÁQZ þšk=ë ã=gΜÏ/XÚCøc¬~&×E‰‡ðu~&¤Ó2òùçάwûhù•Ïh×W”d‰ßý¬~ý‘¸| Êu{ú¾Az/ÑLú˘¡ÆÕÞ!Â#Úú‰4Óû«è+ø ~|mÈûö›?^¬3¤ÓbåÓ÷Qót7þÒ)ÏÉŸCηÀünz]…ný´QO¾nù Œ—‡ÇöM±òi˜.„’Ö3|}“Åm…¹Ã±/dýp¼k ‰cG}š/Ê…ÿ”wì÷æØ7)nÿOWÃÌ_$Ò síK‹Å¿ùßéÿ»gˆûy{wñ·"‹'©óÆWó· ïHºƒ¡Ö‰PÍ0/VR×/Q=³½#þ¶ïï2ƒ/²è_=¼NwÞû›/Uÿèû¶»|l²ã\-žL©"æ“=õº´Ž:6þöŸü¶˜ú¨Xš£òÒZÖ«lCÜu8<¯e2Þ7M®/Xþ¶ðÿ–¾®×i’ë+«Ÿ¢›þ:'5L½^¬/„»‘ý¨}ÞGÊut\WMÅ呎…¯µMÌW¨b‰ÿ§¬'(û•9ÎÃ×ü¬Tø™Èqäñ³õT>?r°õçæû™)Õ/³Õã¥ù×Ï‚ãÅ’ŸŠ÷zóR7^WŽôa¼çÚ˜GëÙ ‘_’–áŠuÚç^¯XøÝè‹HçÁõLÑšp ó4¨Åp›…úº3¾²QÔ9–TëâŽù-L,§ÇïUeuöӒ϶3Ôe€vª~E7ÎkC^´|M@ß¡N:ý}>!å¹ýx§—à1ã»7:ç÷Ê<«Ô÷ï#úbëýjÝbwõðødk4œ·-ÿäo÷.ó$ëŠ7båWLù#Ô1ðK yƒÈÇ=Àê˜ÙnñÚˆ<0¶DÌç´¦úž'¿-ï‚íß„>gzjÆý‰gŠááýô$þÏ{“ôcäóQ7Ò?Ï’qáüžÄSh¨Þg,è"ü®wŠõ,—Ý¿júß9ü#ÿyQûHxj>¯[Çg¸F¿ßƒÄWêÄ®z£?†J†óèú3õ>ôX¥ç'Oo,ž™w­gȳùÕ„Gó¿gy´ª¬êàQÒç½î;n\„{;Þ'Õ-º4hÅÖë}<÷} o‡ðFýd:ÞiúK<,´î$Ö™|7ýh42ð³ê…û)hnès¿ù‘'¯jx®ÿ-?†,¾!éTdþÉ)Ê'Ý ôºlï+÷cx9©™úH <ã·æ&äññ>ÉŽuuþ<ûºb½éïìÃuU¹žý¿2£Gl3Ìñµ÷”xž$Î6€#|R{8ïGê¶ùÿŸ¡q9ö£^¶V­w×´äOi]DUòK_eø¹îSýƒž×óy9ÿ„å…Lx@äQý(›él+'ê>–|3†,ÑûQz…ú?‘ã¨öT”¸¯ÍBý_w»&Ó 8AûÓ¼‰\½ßàë^Ûx@ìú ~D\±«Žw6ÕSÓÒ­ñú_¹ÝÉŸE‘ê§Dí'}D䧈ç&û!âµZqûŠQ}‰ø"Ò¿0ž¥ßvÕ ÷K¦1¿©ÇªßE8\ᨠõztҿφ¾]èKÇiDuµ¶„Ãsìçàj²¯Oäýˆ‰zÝløŠðóÿª_g%žÝùÙ†ÄO®,yr”§#=lzUø—¤'mì»þ=Œ¯Åun‘KzÚ )ëÒÞ‡ÄÃkE×=‡ÅU¹nyWT¡õˆøÞ§ú|.j–åú=ÌÏqÖÍ&ü£ÄëbÉ;¡ó4…óšL<´²è^±øÏÇ'SÞHêaÙ~¿ÿÚß„óáýÉj%ã½ùù0Ã:„¶–ù±óß§úyhDñóËÑ…Þ;YG2ÄË2Ž‘zø¦~)hb™§ÓyDíRÓrÿð›k¾#æ›Ï©^”E:aÄ—B¯ªy“.6Å˽.¼ÞKïÑДëñ÷æÅÒ9A-Vºþ¨˜W¨­Oëõ»±¼(çÇNÑâdÇÃKÝ?Ù'õ­yå:åÊMû~Ôã¸fÓüêX³Ž·Ò‚ƒi.õÒû zêÞðþÃ_ÀqB–|·~Y×éé¹³åKç÷¶¡Îœ!].§Ë•u™Èû­º[ÄW³øÚ+pZ—Еðh“»=׃TÞ"–ÿVÔÓ¾×ü§#~Ø{M}L¼pnŸ•]œÎ_æw±xÙ…­§nÁápCE7¾­¿}CKž”âYïl:º¦hê·_wúÇ«_Èy>n¼…6"¿ÅçÍÀv“^Qózi¾¤¾Î>?㸺î`¯ÇtYX¾<Ÿp@S‡¿Ñ…¡cÓïCãðçSþ~lþµçÓüÚ†üd#ªß\êQr}M“>ŠÙücªÿ½­^ ù‹ÁÏç·z~ÑûçGÃã|þž™ò3þx¶~‚•-ñ®×g<¿ÓçGâB1ô¡|}þºÛæ9ÌWóñ¼Îç»ôV±Nú+p“:¼ÆAÅeSÀx‚¦¸@ÖY1\àÆp™àMú|ûËDÞÕº€ßGrô•©æûl†"}^ÁÿþÊOÃqh¿tÔí`õ‘¸~:V >fA=7 x¬O™Þ2ñÎ$nη¨D=Îe/Gò’Z\]ãxË~-òû-Ûu%ÿ–á¯Læ7Ä]ŽýKÐ8ž† ¬T>¼¬ñx• y…>ä_xµÂñ±²ïÐ3Eq£Dx¨¸-T¥üSÂ/Ý"ä çNQ§—¸¦ñÙ"oßüs¦ã+q~œcÁ¢¤–êoqc¿h:˜÷Xyçñ—?¦Ö¯þ8.¡ïèp–T¿n±žØÎ ·o§ ÍoØü–Ïtv$>²[ÿn¬!êé’¯}‚ø‹Ô·Rê¹ V:õBëï)*å¾O–|)_gxñ¡Åáúö]ÄzkÒ{ó·+õìñÔñg×Wq.Ãqà§õ¢%Þû˜~΄{¶î×RÕ@‘‡jgÚ=åã’>ÚùËÔ/³gªñ ¬ã zÀ‹1Ï£Àÿé×!f~_ü½z·˜ï›~æG}”Õ¿WžG_/a²šW èuçÏ£áÏæ=Ž'ëKyÕ÷ÎÑßðÇ1èó~Bè®ê``ãZáoæEÃcŽ¿ëONÛEíïÂûû¸ð»Ÿ¤2Å%³ú‹ù{ê0õwÞó¸Š+ÞX'¦Þ(ñ¡ÛQ>‹ñÐQ@󑬗ý+žß›V] Ý£­cVÝc žÒÇ5ßÍâ$tdx´M¿ÒãoÛˆy õ¿œy ïáß>ÿc±ˆÇ\õ¸2eXÞKÍÃRÞ #(®_"‰<ÿgë÷Àõ\±ë9Ág\TEëÛôЈørÁx·äp¶U8cƒ¾½¿]ßÕõ"¢þ‹Í0u^O˜õûõ¾H7ŸÙÉpñÈ£u×2¯Iž˜¿_ãÝq¿î‹dõ6ìk.âù5îðÆöjþé–Nâ9î'ò¸ç×â¹¹þSQolIóú¬Êâû ûÔñïxEäÓoj¨~¾ò¿Õ8äûcÖ8ñ•$Bâçåª~Çýó/ù¨L¸î«ÞÖú½¨ÌêÛ&>¾Ôé1éW°ðŒ)oóÃ|þ»¡_œ¼z¾Hj¶ù³Ô¾E˜ý¬øýÍ Ït(f}=š¼­NFüSï,[÷:Qýqáÿèó´Ž~¤óñÉÿFÓˆûüŸãŠßˆu¸¾?w¾i]õkÑ Àqë,ôõï¥ÃoqŠÜÓ#å—P5|¾䥻G«['5ôxVœÇþðçšûX¹ÃÉO²å¬ûŸŽ¨wد6öNÑzyû_¢é¿U´è'±¾Ö¸˜Í‡­/Ñ?¿{¶ˆº„/¡z¬Ò2Ô`ú.£óÅßbÒ-»:™¿ÖÚ ‡Ây÷Øý#áW,ÿ–.{ÛWUœI)ñ¢ÐãÓR©p¿Sú©oÀŸbÅE*ÏsÕjŸºÅ¯Æ‹ÏïxB_÷&Ý,ÓëµE5‰7ò›ã¨Wx8ž:®I¼‹m;“Þƒÿ}á¢å'¤ÞÄ+Âë*å¢ÅépÃÜDù2›¾)®X«žîóÀ÷‡ogâÛ M©NhÑYñÏGâÀ^‹–ò÷ÿ0Zžu3›B£x¿#òq ‰oÒšpõ- ú°}š†ãÂF…ó*àÅ»^¸|…Èì~=V¼ÇóZ‘÷/©™ þ™ãy2e(ÌL݆óZ]ßôŒ‡ÇÄÝUÃç­^z×¥ÀÆ™©Æç6ãxySŒÅpZOlü#ãytˆ–—°ÕË’òX¶{8¾Î:^ûˆuÕWôuUä'ÿŽC}l0y ¾Þ—CóíˆË…ÿJ3Ïóó¾r‘Ïã€' Ÿ†B†ËU½î¨Sõ¤O`Ð{wõüq.‰¹n̨¨çivÑóQPÝ ÷hèù|²Ôÿ¥þªu¿k‹ÂóÎ1yoX1ê‘L¿³ê·Hoã8w¿«×Ï8ÆòKåÓõ·\ë¸þñ{Yê·[*„ûGÙnó¦þ0Zó¸þ¹“úÃÆýÎÆÃÅaø“áøÂ#SÄÚQ7;Ó†µ§Ãë+U xíÉåÜê–:,ÇDµ´ôÏýñšR?‹Úáë¾ä`]OÁ»X®slg~uí:í!}œréÔcІþö&œ¸¬OT ¿þ<ö,®ŠX/7éúã5àކݛJ¼…Ñ¢à'>N×az]C6ßÊ>>ÆqÙºˆ{ļJ:Ž®}Omfë;ˆ‹…ÿ€ D¾b[G½¿bÈ—št”Qh˜(ŸÍu7P>¾ÓÆSõÏOêjæYæMOÄ«zŸ[žÇM;®qåǾs‘ЦêôbçâzP]Á×ç3Ô0Iè`¸êbyqÞ~½ÿû޳çØP4îÏùu£[©yâE RYÇÐKÅE"+z™©”óyu5àtsôëŠÝòÔ’/‰ßù÷SéÌ®†,Š›úVñGÂöúûÍ©N(u—ãŸ)¯È¢+Q0Øí=jnyï{«zghFëýĶjÜÛQÍo¡:«ƒN¥¸Žúü¢ {Ÿ† Rq"²MÂcŽ-Ї›»êrµÐE_¯Ã}_RëøkLJû ê·m<ŸiÿJ„“ÀÞ·õuû‘¥£#'­´õ±q®ð{êûQøÛ}í65nbú Þ‰8€ò•ë^¢çþïaở‰ìÒÕÀ5£ôþ7­{œ€E·ˆ÷³ås'>'þŸ tõ0u»>¿bÉG8ŸoâY´RãmŽï•:[‘ǯ“,‡F¿>zN`»\öûdžoý‡nüKþSæPDz]Wz~^Â}W«z-¬Þ‰aÅs’ÿtº¸-ëaG~ß’§2’÷ÂÆÛEœ5éÖËzÄÓWèّü[aëþ^¨©.iÒóÉ”Ùðû‰ÇwÄãÛtF0á€>­dÈË[N³ G…ÅžüOåsd¼Ñ%_×㊅_‰=Ã=\—Æ;–®?ƒzŽú9yÉŽ#ñh–Lù†÷ÅÓO§[¸¿ä|>+>UëåDü‚òŒ¿gÑuäú}X,úö&í …¹íõy‹¶Ìÿ#þ˜Ì§cδyy©7†bÊ‹0NcÔz0ÆM‡S¨C¸·#”G’úâÝTÿÄÔ÷$ð»~ìØ‡ ªˆN1uöÞ«}¤ÞPÔñþ¯¦}3#ñUR˜¸†,Ççn€¡¾W#íÑ^ä§Wöb}¹ãŽøìm¯Î?wÿPÄÝ+’­n‡j,޾ëöp>@÷5‘æ1dë벿ŠkHW³á«1…òÔ‡ÀV¿G#¦gÐý=¿¾r4Óöª¸Ǽ6M.®O2® <£yÜ5Þ“qßb¿~;4fyáWDº/Èrãy'ÈŸ9bÉkô~Žì[ø>'ZÝ$ò3MÆy“Ø6J̫į´é@› W lÞ΋:Tºù_›aƒ%¿6z®XGOÅÃ1¡d’S~«§‰y•òbèþ5þ¸÷P©æÿË,™a™ÈÿÙúÕJü׃·Ž¿}®[Ÿ¡ª®— ‹ékÕxôqÝ=Â/ʧ†”§þ<ü}4^ŸÜx< ›îV]¢òØ&ˆuÈt¼þç¡|ÖpýýA/ýqúCûÙ~¬Ï6ÊÇão9÷‹­b¸î½.=W©z.¤_,ý/Üó{Õ•}Ÿe?æß-ž.@ZtfºüÞ66?ŸªÞ¡ßgS¯Ð÷Õ×7¯F¼ ÒËFA4ÿÓ…ÿŽ•]Ãór+ßUó6cE¾€ó¤ñø ••ÿ ÝpˆÆãÓŸü¨ÅYªÕ{ÕyYÊLoØQ“ñÓ‰/›•YQÎGûp¼Wb~Nóp¿— ž5Ú¥«ŸîßPÿ¹ Ï…jê:wýÀWrÄü2åcQÉ 'Ч·­÷4~B}#ç<ÙèY‰âHëø~ßgÀ9b,ÓãºÿŒÈc’¾1r |ø{š¨ïÁÎÛÕqF…ëÝ`Üoâñ³XÂû|òú&×ËÅöÿˆÆÿΰþ–?ª1PÔálüa4!ÿzŒ~~Ū‰ò ¨qûëf‰y"bŸÌl’ÊuÆãµoÕꯠH8 Ø»SàD%Ô;Zºõ;žwHjè¤Ïßšt9ŽÕcê·üDÜÕSbå/$.Ðu{‹ßƒõ—¨¼R§Tcz³_«:øÜ{[ò'‘÷XU©'æUÂ1ÈùEæw|<¥á~âáqúõ¹¶ÁOìÊÎ÷†»…1pÕŒÿ¯yZ=ÏÍn÷7åìZâw6!~ê=w–ñغ—EÞB®K9?=öguûõÃ…ÿ»ßR‡ë$pXS_]X[Ÿ~ϲgÕýGоæ¸ôâ¾PÜVÄô»mf”÷ ='Š?¬ã7Ÿ_My ´¶Œ;úÏN8xÌ.®Ûq ,}VÄõÉß\×CœÇ¡xú>K¿3ê:Œéƒ´çÅû ;Ÿ·Ô‘hw«Gïù±ˆãe=¢­ÒÕ+½íë©êàÄ5ç> _D{>1í ß‘aÞI™ýï4Þ‡âB7ŒÑóG$>·Ís{ß¹Õmx~;*NÐUßßÏ÷—7øÕë·ˆ<:{ Ô| ï'†înø?û?)]gãñ›â½éï1 ¾aã¢túÜøízeÓ·ã<0¬Üïöjûðuý+Dã_hôfÿ} ÷}]â—õù'Ïcïñ\'ÊßÕ2Ä‘­êH45ð¡Î»/Ñ×%ZºáReãÀþ• xÝ ÁÇIØ×—ÇìVÅW-~"Ôo•:þö,_.ë9Þ~³-x2ÔŠª¿në‡ÍëCþû.uÁNºÏ5ï‚¥oèõ2ØüŽVj~H¾'È¡üCkýñ$o8©#züúlý{û…á½øÎqnmz~Çꟛ¸ ǃåă<+ù wnœ¦>gŽþ°«¡ä'â>dgF‡=˜‘q­ÇmKº Ž}äqSfëÆãVÔãb×ÀMÿ%S†vzýÙ¸&ù̲1Zëu/¼O(ÿ» áÿëåWŸ*U]Ü~µ¨@q«A7,pœcÿ¡õkѯUx’ú¸Èüøù]_MfÔåü"fDG¿IŠYÿGþ>¼ÉÞ›3TO,ÍŸÅô®j~`Î?BŸS,ÿ•x?-}…ýó¢øýÜtM} ðØFá‡pø¤¯‹zÛÕ]3:ŸbðzŠGéÿzz|÷“O¸µî‚¿ŽF,_ÖÁ¯ Ž÷ž¹Öùüã p»h“Œï`3_1[ÿ»½3äoeéß?ä³~tÝõ¸OëyXtspóÉð¸³%h8ÿ/»áÁB¡;Eý€Ð]§bÙNUßåU}ÝÒÄIKÇ%0n½hy‘¸ø¦@?•!”ç2äA1TðC¤?…«ÂqÔ™2tPû#Gžg&<¥çCäÆÔÕ6ô±ññëÇd´_jÒ~NXñQ§¾óñtÌÛªúÃØUYíÏ`èk¨g|oVw—øG®ÃWÖÝwm¦¸øm5OiÀ™Ûð ’w(÷7á_вQ¢|~¦ Póê2o‰ô»^¤íÿ#5%ñêÎÇó’á.M:•®õÉÀùTgþNn::K¨Iñ`'·8Z>÷\OÉ8~†³>`Áe6KI_¬Ð 'a¨ÃÚŒ÷G ÃûSÖ—jŽçÙÀP·K‡ÕЗtp7NÑΦ>l63ñIýïߊ—‡”†ÆT§¸HÏKù²æ<O‡¦èi?Nü~ªyEL¹5ŸÇÍÔ?×o‡‚AmÆçŽ©Ÿ€ª†y˜Õ½8/Mê'¢Q¼u -óÜ2=î2jd1½ƒ…z™˜:(¥e¸µ½žôƒsи.¹¬xÇȘ‡A7;Åß¶¾kWQÔ}ÚP^¦…7Éúø²Ùz\B /˜ÌÛ6¦zSïx¼tsÄKXp£¨FçAºèm]µùý;Vlgók÷;æ]îØ¤òb·OÕ߯­ÅïªÃx–µ’ñxÇYµô‚Èc—™0©×˜±ñ›ºñŽ_oZg±ª–ø[‡òÜwîÐç–7$¾5ù³»þ©Æ_?ÎçÚ=nóÍ'éè´ ›ºþa4ùƒÕÜ®iŠ'©ùìdu-ÎÇ;Buótœn¼“¡á+[tj ºñºêõŸQò¬ZŸX÷ ®££õ»ìOº}2èçzg6ߌÁáýcmë¥iD±Èÿ¢ÓhºTó>¦ç§ã'’ çMÆ¡z õþ®?×­hm>ñ‡w‚þ‰gñÇc¼ ôí§Ö dwà4Ôej¨çcÓ;ÁUÞÑ7 ­z=š„¯7˜ö{5~+Ïâ¢rÑêXùËxº‘ˆ†‡æºÆ˜´ÖM|ë‹úu{ö “¸l˜ò¾Ùðõþþ»ÿå”7Á%GB׿›—øó€“ÓÑg³Ä¨Áú7~”®¿‡•ßVã<ÇùGöÅCÒüBêÕ’> å/0«À ÿ¼úöðºë¦ë›+üD9¿ ƒàH½Zk¾vÞÕ¢NôÈ–DßÙPö}vì·Cý]}¼dý¸zV¤Oè˜Gþ[ä9ëÒº/qà -ókí˜y¡šýʳú:®Ô%’.øBÞÇñj¤›¿àÏ ø“žØ…ª—ˆ¼h~w<ž>É…j&_ë~ó¯ˆôþ¡¢c½€úCÊþœ(`qóÊ:NÚçÃçPýù_´~sù¬ªÏSýž¯s²oS`û¤ü‹˜þU»xulŽ;ÀºÎBÇ%¡>v¦ ôù´,Éìq¥?eñWM}[½Oï-×í9@kê p˜ð(õ˜ßÞÖ‚ïc+V6~ËL‘ïqíoÕÐQÍÿ £cžò®-nu¡S–<Ìk£Ý‡„?ë—b¾(fýkIÏZêJúûÕ y°ùÍÔ| ¿ÿ¼Ï VíÓ®S~ˆräwï9áuÚ€Î:Å×R¿šëe£Íß;Šz]·'Õùd«g¸~£ÇDÓeŽ©g,ñùÜSŸG_¿X¯Ÿ5¥±ø_÷‹áP0N43ùEIãb±üxqTK NãÇünÆ›÷MµþyççáuÆy=Dþq×o…ßûäVñ|^"t £ÖËýó7ðῬ†agD}˜ó6-yï$Ë?µ>?üLù­Š;oa©ûò+Èc8¹Ž´ÞpÁ™6És‘y ×ý°¾¥ÞßXó¹¾Î#ûuÎøE"üœÄ‡¢*[?.}HÍ??Ãú0.ä.cöÄsyåMñt¨/+O;ÅYþúµí‰ðºÄ[éö!”}êýñ>s~,òy¼Ÿq\ê3é½Ë®oËúü^:ú?6½Sÿ|òÏNsZ&õH1K<çhCÏ]mò[êôCVôQÿo}§~»»žQŸ‡lz?V­ÏÅðËBuçâçwžoÃefX›¡&áö¼gpGW±?ñ_h†šlý¤>€~<7ŽÂ„çµÕÒ2ÙÐÿß’¯“ëï—`î‹Àüûþ«œüJÞÊßïǪ<†tqÛ«õsï]vŸ6=.Öÿ¯V×åµO‹8ó–7Õ¸àžÿròól[½~}"Ö‡¦tü½_ˆubí+á8Žƒ4.Ã5¢(¼:ïãê>L¯Pf_.ÃÊú*ÝЯ%cÇwÌÇ_(†ÍgcåOÐo]¨ŸŠ Ô¼•c¿r”£|ü~úõm×'’_ìã&Þw?xœ¶¡2å÷5;§Íãj(ͯXß=UÄõìܴΤt̤u¢ð'u[°à·N~‘÷cz»èy²(T×ï ÅG-ýZ›úϦܟїDw½Î£÷y2œŽ÷&ã±[Ö×ØÇ¡<ê8â& xqWCÇÌö—É”¡1Í+Žxi|ÞÀ·Z4Ò>G®Š•§4éšÉúºÿÓp\jîãC¦OfèOèWw‹ZŸößßQOêϯ•þ½õ¿¿a…¨«tŸ GŸG<ÝS„o¶ð¼PQ_wÆŠKÅwÜe¡ù™ß”ºÌ®ý¬£Öÿ±¯¶Ò‡ãCŒÇ1è4`P»HÏ7çÿ”–I~†èqÆý?õÈÿ{ƒô½[^EÖ ûxhÅÄê§?)^ͯ7­¼EŸO©o½ÉPݧ±ðû¤I=£@¼aÐÑG‘(LbÁ Ñò‡câxŽ…ã¸þ£ÿ¹Ì‘Ÿ´hh*øiôŒ¦§‡‚ˆ} n|Mù_âÑ)!¿”ñádŸA”¼"x4Ï €õ»Ëa:ó9þ~<~Ïs¬ܼTÛÛ[ê„kðç…åR>ŽúDïסۧâ:öQã*ëûÙ‚å9&‘^Éš6úí ý;¤ùxã‚düYÿx3nãÚø¡\GùgFÓV–8$_­³bÏöpœÙúá‰ê(èV:um×uå¨nU4)#y ¿EO·ñm8xtއæ×ƒçÑæÂâõD5Œ ½n¨dÑQšöŒZ^_)ܪE»OQõ-Ï£ñÓ)Åëüþññ¿è>ïÙð¢˜÷Sý}êNùÕ®áó Í/¨fÈûK¼\yCžó:‹ó„ßGLþTÅ…ö7èÈ ¸‡é%¡2Õ¶·ok;2\1°ø—ë¾N­^‡ ÝGêu-mú³ÞÑðçWò“ŸS¿)4r«³ø}ºu¼Ï™Þ¨<Þ%¯dQ݃Ö_¿ÏÆŽFª®ša} þNæßÎýŸëUá½Î¦-xPêç¬þŒòô\1Ôy–õõ¼Ë?V×ù,É_`|C-ÿûËU¾?êÐú™mè˵­„ŽÇt^;D[oÑ@?¯ø÷Í’ç–¼kíBÆ'™(p#˜õ¬øß°ž`æ½â‰âLÕë·`î_Î=¸~Ÿ_‹î%6ŠÎôÞIã:ÿqj\}.¸¡I´8  béœp=W½Qï´a¾cuЀžâ’wS©s¡ýÓám ÐP_Y´@TvÄEOÿH~é>Èëèϯل[ÛSQ ÷!©yŸ¹Å1ÈIØ÷±kfê=•yUEþcÅf5°éI·üÁÜ'Ôñ©ŽŒªŽº©ùA‰“ñÿŸµï¼ä¯Ë¬ÌʬÌJË0îgÑü—Q„‹VUð ÞÊ,ÿvEÚžç/]ë22ï!û?¾?CñZ-V¾k¶šg—qÛ&CècÒdzÞqªܾAè#ÉüݪçA}0¾š:n›BâwGà r¾.ÎW¾ÇÊŽ‘òÍX5<^[¦ ÒáÝÇ_ÿ’À‡ˆ‚›5nG{V·¡z×…ð·ßþ;ýçcžqówóè¹ÎʾCK·íxÞQâ½Ct~Mmý¥¨¾Õ‚ÞcÂ1¢®[ýÇ;›Y~¹)/ ÜúÞ¢|x]Á”_EÏp]ÏÒ2l(ò¬5Ú'ã¥ÊþäÞqƇî/¯më·Í íYÝ“õQ–<`T`ù®uB7AÖCL}gÒÒ]œw3ÊCS½ßΔÉëusRå[šðirÃýäf&îÇ¥·0Ýë%ý%d;Öu*1ÿ¨½žŸÍó×IMâí\·GQL½Ë±ßM¤sk·>áPkXòʆ:*EìcÒáF,úI 3£¿#ÍÄ+òN&{¼O3‹ÃCíÿ}5±å´Êû~_· Ž>>ÃUMÔzÖ­}Bý#\¼9£üI_Ëôúß—7Ô™ uŠz¯¬ÇºòÑ¢šk¿/t"¼¦Ô£o©öûAËïïæÆ[‘º7¨œòzð²E¿ÏQgEZßš§G{ÂEpÞáøâêRZÏ«ëod‹+ :®Æq¡↻“út®}Y¬ã3èQUS?G—Z‘®;zS¾Ô±à)®ÐÇ„OG ºÅ<„¥7&ß«¯«]ÆòmÄŸEƒÌæU8¾5ð=é¡£°S¤ü—q¼×ôñ»|ž½/hÞ­ÿ{¹ÀíàRÒ§ úD£ ùÍÔW›ãGüýëÓ¼ñ"aÞB³xó#.ù¹8¿{EãuW`øGÜ ;Óê›j<^6ßžÑ?W¦þì63áêÛK}ô¬xþ.Ú„ó‚Ç;cÀ᥄Ä¢.ÿaÀõAþ÷y±ø ¹â{žWk²ÿ’m;tMz$6^U–7ª3_u–åï/×)Cc=?Mêb£[´õÏß¿k4þ¿_'5?‰ö/8Å_¨bÈwNÊ;jàḐ¡!á¼õTýý ¸´Ž–õ¹çŠÞE¾lãæÐû+× S|‹M©×»¦áyh§ÇcúÇau&´ë.ïŸiü•"æYûµÒ^7Œº«Ïú8â„û¿¨D~E› [î|*$Œö§x24ì˜ Ççï?ú ªÃS×àß»GÅ«$«·cðñü¶Uãqï´Á¿ÍP}_+>Çã6éà÷³ôùÉ”ÙúùùÛÅäË9Ÿ‡¬oq=ÁŽ%âï$oÉýðÒ647|N<èñ’õxì=BV²|¯¯Üˆpµ ïiG¶Þ°úž«>FXôÎr„¿ ùœï›Zòÿ=ĺ‰>¢ÁõÆÑ>Z¼,ã^Ûvh¥¯;£­èokßÿ_¥ïîjÞë1û‚W¦ç²g™O<û‰l¾ÈÏÇÅ=ß´âIï”!o—Ùúñ|lú–>ÁR?Ðõx¨m¨ 0Ý_Œóþ3mè™Ù< 4Ù¿ ]DÜ)u#’Ž+ùhÎÛ“®>&|+\·øÃôáùüŠzÉtã¿ÙüZ\óNëëâ™îßä?¢þ¿Ÿ&C–…_/û8[æËÇç‚©?ÕëíÇ!`Ñk*NkìÏ3èÕÇi™œÔ ‘y@\åx=ZÆÌ³VJw^Œ_“é™K¾hV:}0\û›`üWÃyÔÍ y¥Š’Ëê–ºª¿]Ôuqã3W—Ët6.úŸ ¢¯¶ÉP3ÜFËtõ ¼õë™w(Zþ-ñyÈ>‘”Ÿ•z-Ubö‡Š©¿ìjÈׯ“|Æ0ƒnk-š×‰ïÆutσ®ë|ïbú,¿×û…˜¼JÄ·…™ÁøÇ'\..}.Z¾·ÐýE×gÅÿýÂý–¨y+ïˆ#ßPt5¯Réu2?Ï×=ëHuþyËTÞI5ª·ˆ³eŸ@ÿó…€(òÕz –AäöÓqßÏl\tHwžñžŠ6_Hý3ã÷LŸ)_zë·D}>/Ý냦úë!q6¼_`†#C¾¡ÎT!­36œG®…ŸQÌú¡ØôýürÉü"ôxVt{)ÎaÅLQ‡+ Ç«I^XÔ>:™Š×ÑSís€ªGãu [^´Ü_Ì<«æ[°¼íFÒIî&ôK1ïM¡óv$ÚõC{ý}áy,ž‡Ž×XÏ£õ¯û"\¿ÈÀß)-C¥tûí¥mRoÁô=òhþì.ð >Orý;âó©÷‡ûßc~ÝÔ{’áÀõ:¿cñq3´^áu‚L*E{>Ñ´”óŽÙéí©N1¢8£ü9Óú€1…j\ÛKøqRïJê2¢Ž>®ÀÓÃÎ=H\G'S¸b|ò§¼ñöÇ%;Ô÷°º[þvAÁñNVq4èÖ@­«_þãRé'öݦÁ«…¿_hɲyåˆ7ׯj¸þèdPàºzây±ø!¨@º)MH׆õA5ö')gø}̬¡Ï]>?»š§¼{©àGÝÚNÅ+[ty­ßvýJä½^4¼Ç®~Ièc¡æÿûèõ¶ûolÞ§§ýÌhqõ¨Öb±è$àòÉò™;öªï_#Öxàóáýsz¨ºN¨žÙ|«aõŸ-І»j÷aüÞQJò$/ÇÒ÷麿…ó ØyI}<_kìnQ—»ÚRÏ`u(žÿ5õ§ò³@Ô5Lü(ï¨>ÏÏõŒq½àéxG˜¿ÞJè_aÉ!7þFxÝmëAäGÅÕKǬõNñ*ZŠõùnýípó_ôø’.L7+×±ÎÒÔ¢‹h©Cbнê}j#âtïÝh8\ï#Ò•xŸÇ›ï‰üÎÌú*vNËpüùMëÒÅ/Í1ä™ÿ*ù½¥œ§7ñ ·Ü.ü‰‰¹‰øËh&uÚ)/:÷¨Š›’:ç•H'7‹ëÊ“NN?Ê__¾VÏ)ï×ãv‰¿SS뛽Ž×CÏ» ù,ñ¾,0ø™w䑾pM5~ªaÑuo»Æé÷øßŠ˜Ø÷ÄyÁi•Y¸að‘óšo,³ÿ[†[“ío¨Çÿo3Ÿ”Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y麜_NiÞaÃEEâi<#på6~ª«þ)7Wt\úóXýæP•ôÖHw8 C=ÝSÎ[êõIt<ýÑçðãÛ¿ª×_;±/VU‹¾×gß ¨Þ+ÿ‹Æéôû²þ"ú "Œ÷A<],yFÕU®ÍxD†>eÞqË}#¾ ˆÜNËwÖy­Žÿç¸u|ýuÑwùÁªz}ö½•TÜýÙh¼EëùN^åýLsãËJ¾ÿÿ¦Ó‚w¶¶¡àáon&úDQŸÑ×ám ÷éÏw}6ª¼’/ô¼%ÞÉßÞÐGõ÷Ûû—¥/d{Á‡E‹tuÐCÕ/AñüÚ»ñ¾LÆæ,:V?5½Oâýð^ލ¸Zè~ð>cX\^Õ+¨îe:šÙ†>µha}¸°çeñÞÏÂŒR_5ôóµ÷ñµªý3°º@}²ÕyóéùV†>‘&¿%Ÿþb©Êû öpì¿Ó{Œªç´á ºÞ>¯?_¬ºKðï\+æŸú çŒÿë}Gâ…þ&®œ(ôïiþǾ+;)zv›×ÅÓUìÌôû«&ÓwÕ)±Ž3ˆéžWë8~–Jôþ!ÓsÍŒž¯ñøýÂõ¸Qhé»Êß×[—_:ܤžƒÔÃŽ©nzw~YLÿÏWˆ×÷z´Awúh2Àüù1ÅW=•Ñþõ6}bSÑÀv”wÁŒÙÑüäújüб˜ÿP¼þkåØ8[þ¬½ŽÒoCyê?éØßÑdÞ»ªÿ"ûZà¾ÎÕ;ÀÜpÞ¹¿õS¶ö{èªêtyo¹åÍþ:õ—ó޳|Q=CÜ2Hí'åý1LÌߣÕ~qR7ÚûM´<Ê‹y]!ž”ú\D5lF)Žõž¥¾ßg¤® /ù×Bô³}Qìç¡õ £ñy1‚úïvùÓ8¦þ(±_üê3ý=–ïÃ}·‹õž7ÌfºÌY,oÖ”ô+'ÿM?Ö_&æ%zO°í á7WdùŽ%t_ò^×ôWÏïúFj?n§šÇXKóÿ}7êûaÝówU¯pÂVÕ¿¾çGú>»·?ªƒ†,:n5Ò;|¼½¾?ö²ºjÞwJ}ñœõ]Þ/Ó§Ø óîÏ¿£®‹¼˜º þqÛ©ºcRw Ãuè­ã^?1£þ“Íd\LÇüÑNïm@¿µë§¢)ÓICCþö˜E¯Š¯Gl½Å׉|[!ÓíœÞïµY2}'4Õß_GD]/ð`n2ÿüM}ugô:WϲþRîw$õ ;ò>ì}D%Êj¸®4_`ê ñþ@ûõÎŽU¿òXtÑÿj¸ž×,U]°¤†‰Â@óˆúš]ÃçW”w{^¢ößÀ¶"¿;ü—b~½cš:/íØ£ú餳‹ẞ蕬¿ òX?¿ŠlÞ»¸³š—ëêæ%54q»¯2~ÇöC"Ÿ·b¨¨Ï`ÙÏ Kg<Ÿ{ÞÐ÷Í3åßw‹ÎWÿ4tz8#ë³)¯ŒùU´ï•w†å_,þ*±üÛªëŽÖ÷™Ç7:­IÕOŸØ_}?nø¶^¯x~µðø¹³>/Ž=Ýò ]6¦’ý²6œuÓ;ì.æCÜÕ!•øLúeR'mãõïÁ®¿Šxû9Kþ¹ãâðïGÿC­£o|X­·4guê?iÒ“ö·kÌêók>ûp qÍ;Kõ˜©µµ×Ñ;@ë^ãx~,¶NËH]Yë­©ïBÖ¹û w62ô¡m#õ4…ßlVóz†õÂÔ7£+ÿ²YÄ"&oÆ'eœ­é|M††Ÿu±¸/û£#û°ygX]kV7ñ>Ôgxón—;ýno?=×}Ù}î÷¶¨ƒ ý󗺿òÜÖÞMâùýÿ#â¾ç3y¶~ݪÂêV†ùÃ8nýzƒE?=¿þGUÂIW ¯ŸùuÄcú¼…ÔÙŒß}·XÏ®ø®¢^÷{Zßï¼;ôü¼¿þzü‹n<ÜRíƒçZçǵ;õ|ýƒl~©¬¿N|]±ž—¡®$ù›&ÿý^¥¾€Äã¢A43~¡¯µ{Zà‹§|S‚Ï*ý<ëï¤z’IW"püÕâéÝÜ}­ê¯xhÞÛj}Æ{9¯Ú¤;8žìOÛñ%=Ž¡àNõ¼-ë1_oQÛÿM-+[êy?`¸Þ.ÉøLÞµ¦|/¼# ß¶ç)•_D~réïB¡«‚ùcâÝŸQ‡UÞÆMW‹çz¥ª€áÏ%æ"΃â9ŸE=¼V†ºôLêŸMþšž_O%0^ ò;º³û{Ýûâ:ìùA*zQUÅÙ–wðùÕgñ¢Æß«÷ÿi~”ú7Îç{Ë×TþÐtê{3NŒßNÿžÿûx÷>ÿ¸Ëþ&;Úüƒ–èíW×{´£y¦/ûÍ ?³÷oã/ô:œ7ü–þyG‘~žà¸Wû^%êÿƒ~¢>— žtª›{¿Ô××чÅu>PïóŠ*¾•æoŒ¬iÝôy3ƒoF;æo Ÿ0amè|`𝰍¡ò^y'-øÍYµœò8X1SS¹±¿:OÜ÷–^W^K+öœ_ó_bþÜÏžs‰ºâû¥^ž>¯“~MM§¼exÎË[xФ£…m‡Cëp¸å…ð¾Þ㯠ç%û{,pR“ñˆu»=5åïâЉ{–ù´®Ê8ƒ[‡¿W/¹­Ã¶ý}'Ã:†Uúü°äÕúÿ7ï_n=Ÿñø–ÞédºŒiåï‘Ëþ‰gw>Þ¦ÿrŠSLy(ŒRulùl´¾$Òýõ>7à©-ø=¬BlwÂðý˜Í‘ð´hÏ{S¡¼á| m£\¼çÞû0žN*¸•uÙyÇ®&õ°\ç'L.rËc~dàM_Ÿ¯úYõ-ñ«A uÃÏפK`óðÀcñô^¦Óþ”\—yÍ×…¿¿8^žÁûK¼üމƒ!B †øò„ú|#Ï‘ÿPžê8˧‹õŽÏ_ C>Ò¢Ÿå}Äôk (.’| ÊçcìC¡ë€Ô¡ÁØ!"¨›Ž_f”Ÿ“u Ï$òø)ï;”]‡áÂoñïÇbUßTÖñ°ü_·%´ ÃÏ q®¿WÔE©÷IæµdØtžÞßõó†wÈ #ø"û…L‡†å©‘EyÒ½1Õ=±i¥¸ÄÅè±±ôº2mrÝ0^·™ßW‘òòwÐ×Û±ú¶x8€Ñn|‰Èz=Ãÿ(žÃÍÿyª‚ðu5ª¿-õ Ð,]½gÿ|ˆ'ï×AÆWÓ×Nèî|VÍOöÏöß7\§[‰|™ô“Ð!\××6Ðç!W¾#ø ùÝ{ª? —ü3¦ bå;Ïy;žÿuïõjÞ«©:øø…Ë÷ªz9áq†wŠé”Œ÷Í;ž~Ê×m1äë£ÚFË{úçAùxtÕÇ•þøÝ®ùÉ™—‰ü=ÓÃÖ%áÏ×èE±ÖQ¬{PïçõzB[“:æQc=nBÖ{“é þÍͯ7Ž;>Ký¿^2S™Å3,¿4t]@9–_üÚóç>±½£ð‹šÐçŽ ?ëÅáz&ù”G¬›Õd¼¾éþsu~3éÓ£cÄ8ÃP¯Ä¦7Äߪ\Á¾Nñæ҃IJ¬p¿ólJ~|Gšw"â’¼Óäÿÿ<Ýø»´=÷ÛKËlxi®8¬XÍ?tD­«³û€Á¬>ÔËPŸ_­ê â¾þzÜa±êgb…_‘i“ýüóÈ2ÄùÌŸ¶Ý‡À|¸}ŒzœM÷9ùs¨žÜx¼õƒ3:ß–¶aº›ÿˆZG«+/\­â·î¢‚¡?ÁªrïKýEçMó ZÒ}jMu—ù‹Ö‘€á$¡Ëå½AzŒ†>¦ù#ðûLëS-ú;P¬“®ºvqª%Ìnü«x: <‹_·ßß)~ôǹjH,Üî½D­'²:Z'ÓåýÈüq×ü@üÕ) z™®ë³‘ç8o 8¬Ÿwת8¹_ú€þ˜êÜuüâ;âpºXø½.ŽË3é£Yûü"T¤ù¤ õU6FÁµ£­ŒoƒQ‚ІÉïŠuyõ­ú÷¾¦`ÙL•_ë˜×ôñІ:¬·_¿¶=­®Ïëþ!ÖÙ ´Ÿä‡ðøæz5¿‹±w©þ~W1qàÎfâÿz _Pè6×¥ºÜ¦­b}éIqÁMgÔúêÕo«~Rk†—xðŸ*cÂ÷K%ïÄûô¤eÿ[ïpìŸÕ$.]ö7–~AÜúšé=F£tòèóÃDó½ ¾‡{ÿžŒGT(êXÆò\53ÃKà}ÈlzÏ®†&áxAôfø¦1ÃõóÜEñðuÜdÞÏu{äëñ¹%.:Ó†‹ÝÞ3ÎÏö÷—ú­ƒô¿ßxܪé<7¥mÈeq§Ÿè`xµãúçRâÖLÇóqƒ†:&‰õ.З¶È¯¹4Ñr+äüu,êî¶>¯¿)ܯÚOÛm|?ÌÕ¼ã¤Û1‡åÊQÜY#Ï‚¶?-ü¡Šñò·RW<­óIËpÿÂó»³úŠzŒAß$°=é7`î?ÄsoðKÒÜðx“þèV«ÆúÖI]…„W–ùèýóÈ{½î×p^)V\¤¯o/ýR1ü¹ÂŠ»Ýt&ªux4b|äöŒWGñ£I"*_5 : “ùÍü<0p’ÓyÉø ãáq9Ë_mé¥ÖiîÜ+ê–ÝÒÕÑø²Ö~,üä’—Üð(/ê¦]§däz"Ç€ó>N\çó:½ ]_°£\h|Çë$ü|qÛïEþîñ:)ñM=šÏîû‰øþÅ"/ÝúÎк*¾[u´Ö_ZßY¼7ÿѯϹq·vy‘ZôûJZ‹ñw}_ÜïÍŸ«øê§>?w`tWó¸ìjú[7.>··dù–J,¿0JàC1S­'ã:Ê¿Ïþ®šwŸò;q¬ù†®tÞ»;ªy„dõ;—׸OÇ¡:¯`Ù]"n–¼ä›GæqËíâºo»OœßŠÅvUiÞiAùŽrTÏ™(úÕàŽ„ßóÄ)±Ýý ôõÇë>þJ‰Gõ•ÛEžjQº›Ï«ð՗ϽIèN8ñ'z5:w¿¾7übKEÀŽúô;¾9ó\ 4÷µ»Š°ò#W^ë¤c&qêFõ%–ýÒýÏ¿ó¹€×þ§¨ìú«ðGž×êÜßûöŠë¸}œúÜ}õ­§•ÿ³è>È¿OüL\Ïo|W­IüÉúšâ:]5LÜŸu¯‰q¨ÿ8¾2ZàJæ²ü“_û™À£TPýŽ[ŠqîPý$Ü!ÖsÜ%ãÑÿÒû yt?¿Ò9týG]½ÿ`âµö¯Âê’{ç©¿oW3õÿ®â€¼?«aÖ+™å 74Ä‹oEÔmªhÈ7äÎVª§Œ çöï®Ó¨“ ¥|udõ ¨†[ E¾œæc¹Nr¼J`¿Üð8› þ¾™Ä(œêùûü‹^Ÿàúž Ž¿Pß›þ«R‡LÆëXÞ^Ÿ÷0áÁ«P>øt:ñ5rÒÑó‘ëj`ü´Ž$ÔóÆ Bó \ï Óõü{ïÆêÛ¶þxIëµxŸ‡ÇÞ}õ/¦“åûœò>NÔ¦Óêl/¨y?c}Câ!'®Wqx&}š|ª'"O¾Dz¥*n•âá!ÿ~nÇŸB\Cg·øÓ h­á|I‰{™;<>aR‹¬ÚˆóíÃã8YÇóyâG’ž±á¼ çÝúßïýªú¾dxU^æ|Š º Wëû§÷ ÿ§Ø‚»¼Lä1õ 'ŽèwÖÌLÝFâ³±úæHó únþÇ ŒÔ÷9 ð]N1Üàγz<á¢ÑøÀe¸µ­L×lÜÝj>†Š„_+ uhů®PêU8êšxÕØîÆÓ÷·o$u ,xס*•„Ÿßau^‘ø¶ÀvßK÷yB[ý|„¡ªþ×)ÀŽ¥zþ€Ç,󿸢™ê¿W¡yï åc¶íJ…Oá—ñùõþaå—†=çVß%¼¾I,ð~ ‹Çë.m“õSþ9f× ÷O ºYçËpçõb~4Ì¿˜ÜB¯£òA4žÌO`DE5~Ü\AÍÃI«‰,1H=5›¾J¦R§E1Ï¡!݇:†úV±!^X¿4t^@CÂô\¯÷‹M8‘Àþ#ÇÓ$Ü%ö‰õsÛ gñn²¼‰ñ¸Ÿ³zGw_æºÙiòhÝ ?„ŠnxŽ€nVö½!ЉáxF\õ“p?b¸¨“ ð€ZɦüÝõ Ôì)âî4´¢üÆæ'D? ãáù*K_&ɧ²cÜæz=¿Ø´þÔgz× ç튣õ눅è –~lÔßá}®¯Op8´2ð,ýŒÇ%ù¨zðÖqY~ *uÒåãº&áùbÂÏȺjZÇåq¯«ñº¹õ8¦ºl÷{Ôukçðx~Ä~·|8Ö/ñ9ùÑè×OÿÞö‚êd±üÀåá¼6ÿ¼"ö•ðކãq•ŠWÁŠºú8÷}ÊKÞ},Ãÿ>b|ØŸx«2å! /âáC±êOê:Ñ,Ús†YÍ¢m?RðAQŸâ“>‚燋ˆç(óàùá}Ž㮟é”CVL]çìÌð\P$ò¶˜õq©ât±f-é3°úáŒç“=·u&LxºÀù’n4ïkâcÁ}z§iž®C8ˆV§ë¤_‡ÑÐõ—¸™IÏ8ñ¸UÒ1žy' õÛjÑÖô#ÝZG:¥ƒëF×Vúø¶ñêç#“ïz’M§À×-\5,#¸ŸÏ=Ï¥ÌʬÌʬÌʬÌÊÌd ×WfzC9¦ÿ^ŸÕ3¶´Rùw–:|`üyž²äf‘ÿXE8Ï[þ ¯k_$ðõ˜.ü~\ÓG|¾ä"YKÍOÈ:M`™7%\3®<[‰ó0ñèýqYþÍ;ë¦ç‚±†ú;Ãwøã¾ã—ßôO§ë.ñ@¶ü*«¿Ç;¢Æ‡6<¯ËI}F\*ʲŸ¯í|çÂÝ]IÏ \ÜJs5õõ0î_Á‚7ùþ -ÛyüJ–ñÿóaQ÷byWÉk‘ÿt¼»ø”l;¿ïR¯'¿ºCÞaÒŸ¹y«Šë½Tÿ^•–¡ åE$î™ñAx_:ÿó„uRëyYôˆMü½À8ƒÿ•׉0Nðª%/+¨^Ëê :[ëp>­¿]{1>Æ4} ÿ‚Á„+Í#œþ0·:¬©~,<ïÄÿ~K[u½l«Ç¡¡gº¸WC~þ4ö_ÞšEë&åÛó˜P1%=9Î;q]³XÞ¹ª³ìÚ_'Ó†ê o·b–ðrIß"'.Cªz@Ï„çS1Pà‚¼S §Åx³&\&©Øz‹þþîë"ô\žØ%Þs©³¹ŽÞŸî*î?¶0ÝÚlÚoï-„¿w‹¼Ï#êUÕ'ü‡Î- èdÀ–|/ܯª—Ž.ÆÝž¨®„åå#‡ÏG2ô{·oPKñ\oß/µ÷öhÛ/óÆìTu’êGÓåsí;íëB7¡x¯.á(¨^ËûRØôPPÓQWžüÌ»)QŸL(ÞãU—Dã{6`ës!ÓA›Q'üw6f:s\ù 5žúiVÏs<õ=õ8üZáþÇ¡›útÅ5ìê"æÝ¹3ôøß¥ßÓ¯7ç¡3=zαéŸûü_ÒݱáÓýþË’é«rC_Üpƒš×0ô àú Èbù„|Gô¥úxßxü+4u»Nè,ñ±?îþbnÌî¯ì W>Ï¡¿à3¢’áû©ÄSqœ\Ï;¨EñŸEgs?~ce^¾7ÃÅð8„÷‰ì ú½hž.ÏŠ›\—Єx”qá¸é;Zü–÷0ÝïžéàÅ}sO[¶§ëŠ–úïMºhþ÷ †^w¬Û¨ÆÙ¾^–#ÏkX4ÿ¬Ìô†@ð¹†ê¶<µ£ÿ÷^²÷ÝT=ôyEïCòï6Õ ßÏO­û"\¸šA7«:å[Æ ÝW>.»]]·~Ëæ¯âìº^ÏŸ¨ÌÖ…ƒé®Ïª¡²OÒŸôÖ¤ñ†c©¬khDyâÏ ùyÆKDEõþcà:õ½:Aä+Fß®õ«KÛ¢òÌQÍÅ["¾øÐ§¹cBxÞëÑ }Bý™­BˆÍT7ôã¹ÛJ2ºÎϯ¿AæÓ7¹fmxžã¶¡ªNÙ(ƒnÁŽßëë’Ôç#„®‰ŒÛ±vK¨ÿ€jo“^BTÃÆ{Î×û4³þWำ¯Œ Z:üVgûÿ[êÖ™2ÞÞfèèVïIËx½)p>†~¸õ ‘_l'õ£û¨yØo;üü²ãuJʧɴúQÞGêuEM)ž±ðŒQ/3|C›EÅöO©ïSR3­kIMö¿å}l½nó; â]¯Î¸=ã ûxŸ3ÉÞ7¬ÿG¬~iXùs‘×Ý~RÌ/MÅùõs7\­®Ÿ,@õ˜|çq SÑ[ó牯«ñÒ Ÿ†ã©N²<³_ä}Lóïìßeæ9^–Îo³ä=Ó!·„.LGvͳçq}G¾c_TÉÛi–ÒïFõÑ}Ýô• :Þ~ƒ_Z›ñ»ö\®ÏÅu_òE¿ZWÝ{ä1\A9Vg^ÓH¯¼ YÝGšœGz0J¥O£óy¿ŽräÿôQ‘éÐ]üõT®ƒïÐz“Í},°’ߜ۵ÏÏcºòÓÕ9äq¢>28™^’?^5ú;ý3‘c}C‚ÛÇ[ý¼nš'{]K}¿¼3„;{)|]ôÞbñsÃQ²~>¦:žkpäF«ÓcwÛTÞ\*tOe<ø¾ëW1ÿ-ñžµÔ_?Ù—Át<“žºõ<ÛEÛÞÖ×Í·¦~Aáæ·Ìˆ>aàx7~C<—¼OTKC_+¶¢Íý£Í:é'ãáøzz\ªÍ¼C,O9Oà‡±·J*q¾_'þF‰Þ?|'3ú’ã¼™,Žm›Âó”ÃÂó¶6ÜËÿ‹Ôõmï$Q÷ìKø¹CÌŸYÑÜéºÙú¾»Ï_;ï÷ˆ¡¯îïGíÖÆK³wˆç¯yxü.ûYú±4¦÷læ$gf¸J\âX‡i¯úû¸Zôí@WUµÒÕ½3™­ß7äŠënêWo<ÎYÂEÖvÄK*ü-Ä‹“ãuŸ)æs þÃ?ñ¾á âýÓüýf~/<.}Ñr~[>Rõ©×„ûã¸éŠð<\WQ¯Åº<·yƒô@¼ôñe`”xÚ¥}Ü*Ô_€ÅE~ÿÆA´ÝÌê{¶ñ3u~œl¨'M‚Ÿéótp¡ Ò}¾e>$pœû>‹† Yœ-üô†lþënxw|%¼ŽÝHêYðCw|5ÑzxnºZÖÅ,Žkcz=¬î‹Þ%<÷âdýªj^½á± 8WÉOø7¿Bâçî»qøºÃû9K¨šgE?}ˆ®Ýx4†<·)Þø²@ÄØóR“ðUne[ËpÂßÀ²³©ðh0útx߆ˆuyÉë”ó8úwITIÊ Œ×’xH‡ôL:¸Cä>®»Ïáºâ|~1Ž?c¨~>X#ËœçØ®½>OjÓuB‰OÿE¼ºAýtëIÞÉ _äÇ›¹ô¿IW¼E:ü½@ô½«Å:z$ü=q_‘OùÏ’µ±øZ\gU,<‰T¾;Ú\âtÐOÍ›clE1ß´Œ‡OåxnëöR_nÆÚTãnX÷;7Ý€Õ¹"þÌTýöƪßÓI/£s]7Ýár¬N1µŠ>’ì}‘ø£Àq7¼®OØÌm~1ñlýðÈ·ÇñQŽâ˜WÝt$’º©¸ÜTÇÉà:íQ-Sýf¾¬†·çN<7ßõœXç¼g 3ñ«(ÏÉã»§&©÷÷kfŸó_¿Úlð¹¼ÓC¯‰ý)ߋقÿç0ð¾ëFËû!—ü/‰{¾úÞsᅵW¥.€-Ÿï'‘üC¬þµ¾ênq¸_ïÜüð“VèßT"¿Xn?ÿªHüOìùºÊ«£n-òl¤WƒB–Ï.ù@ͨþÁúõÙüq#N@ò¤]8_,j ÞßÙ=ÂyÁ?—yzžm<`‰×D<ûãýˆîŒ_¹g€~ªÀ?aßZâw®œ/æÅ"àÆh†¯|àGzÿ¨ËCO¹EÄíÐÿc…?€iÏ—*^ %ÓÂñý+¨|Wª£øºx‹ç‹çbÄŠTxQ ›ÿáTw‘õ¿™é×M îC„ÃjêSiª_¡s´¸Í¿Î Wîœ/Ü~BÏ_ž8_ø©« ÿË€Ï ìçE[7ÐCŧšêPܼcä×Jܵ#_×ÇÓ‡'ž·Ì[aȃᛸö!÷·—~!áR1ïgb~ŒÉ3ðù%gÉï[ÓÒÇÜÈ¢38@äë8o4p|©£B¼Ì>^gjD÷ÃÒoÏÔ10^ù ;¯àªËcÊü??štíXýaV¼>é˜Õ[õï×cÔE¨nÐQ­ç¨CÑ÷Ù¨§èdè68ô¾ã®Úù/SyÔLGÃåóþ.Ò_CušoŠÔº×ç;gÞ¡òMhÝÂõgT]½>4Ÿf¨k¯:á6ÏWq[û5cñÚë,ÿÌúiúy¯ÝÛBëÚ&\ ¶vˆ•§Å³Åq×Þ®ê—ô‹§ck=^[UÿÐ÷;äú3ÿ›©Ô_%n.pÝ(§ÇÛÖ÷KЇãb“ñRP›â×>oG{RÖk œWG¯!ãÕ1\5÷KmuÔ¢üÉõëb½oþ8™.’Áo.-KšWÀ(ƒÛˆøÕ±8î?›xN~¨©!:ÙΨt = Ÿ ߤ.¸qÜ>ÏF;ë««ùË®‡wäŸc¤Ê/D3ƒ~ÖPò›nš¢âógÞ«¾Ž ”÷¬Èôao!t)øüz}#½~/Ç‹‘&fDìc»bŸX/ùË<ÏŽ"UÛ;Àæõ…¯éǹ¼§šGžBü§ëþ¨òøf®¼ÅÛþ$òR%—ˆëw©Ð…ƨÅ]jüˆV–ºG%7ýßãYðxR¯ö:¨¿?;?ƦÀyþñ:ü3Æg ä%¤|?ã¢)êõ¤þÁQã`WC{ŠãMx×ÕC¯#×AM–×kFu» _QóH剋×TüÂ!á§šú>à†É"n–|ÃÊþÙ/ÓáUøÇ/bóÇQGÅ”„grã-DÕgAĈ ó?T‡tÛâÖApO>äˆÛxçn€_[•ñQû´wšozú4/øú7ݬæ ²çbI/Q×`þ$z¹Åkóù€xʤ×ÎõiÛ¿¨þl–ßèW5#ø+SYWóŽQ½ŽÅ»h§>ßÀù{&9á{1uˆ·/^,ðà3ôýP—êS†þ»˜-„!°º³~‹Ý×жD|߀kIý n ×õÁæWµñ –}_Ÿw·ôæº:¦º>×WC–åùt¬ûF5¿þG¿ K_ïí¿(Ú,<Ž ð]ä~ 3Z¦÷k&¤»>êQ«ÿ¤×³? Æ•¡â¤pËNQç:Kxü|ÒQqÕI¬ÄüÒšŽ<îÛ›«÷üdï3âYJÜËM§ô~ñâ0þ6ñ\ÿ²ÀËXž;l,_¡ÎÛ¿ú~£[¾Á¸ÿ@=ĸ=ñYPÖ[^bìZQ¿¨Íü³e«„ÿYŸæ¹èïk\Ý,LÛ9ùs·õ™xéiå›ÑÅà?þ²÷+·ü‹·jÑò8¸ï??¦µ8?‰ãG?Ò)yHï[ß¿ãtÝe<+õºQÅ‚šV%—ÎðHržðûf\ù°g6fù6¹^ zLÏ×ÿÀpÜÕç¾Ðç…0ôoâºïÅtÜ*éâgKyý|½_‚KZéë :uY^ÐçAUš¯ûÒïkN: ‰—Bñ±ì뇕ÛÝêÕhÞi­ò•¼#Œ¿Ðœâ³ª ×C|™ÏD¾ÄñQž[òKo-÷#ÿ½ðçò9ROWêøì¾Fõ?l}ùüãÔJw„Ï“pœXø|¬<™q\‰³;-o/ù–ÞAzþ˜®40(7Rî§äo7ìbqœOÜøðþùýÝ  Âã¿è}2Ä!è-ð>hhÑSo,ñi ŸÛa±ÛºwÞß:´îKü`­ éÿì½{›òLtZ Ü ×«°rôó£|ÿm¸”£|ü[$ûø±ø¡v< ƒÞ%~{}ý}•uÖšÇrhþ¨Åü~æ¡ å= <)ä…óýÏûÐï2]ͧϯ¥æ•+K\7{NJéuåò (_Ù”¯sÑðë’×lÝNâ¾/ Ü—€ŽCÕ¿ñçÿ~†ÿf´þW ü¢ô/‹f œåyù}âq¶w€ü‹¸zW5‰ïß;]|°&ÖúŠ&ì}žñ€˜zѼ\T¨õ¿ÑSÅ“¢©c~·«¥oËðeª?žïV ŒC}»P›Ö™•ë…_9ÔøüÔ)WnÚ÷£ÇÆ+ lo¨ ›Ì„Û“yrã~¬¿Úüý^4¯­úa¼ú‹w¹¾žq¿§,ërGG¼鬠¾#þuùcÚ÷â½ÏÆãÌ}=÷R‹ýßüʃÉp(¸Šø$C?K¦s\ ÏëÆíûŠm…÷wiÑOþWœóBQŽG6޳þeÇ|rDþ”ßïL&ë'Ï q»‰—ãŸOߦ©øÕXñh8?Ù ßç}?\Z†ªõ câ´]óšÑn¦¾.Yð„6~´ê°øô«+gºÔ;0ã»úçïpÄëWòPÞº¿]¯tžÛÒ6´§ºOñÇ;“?U9ž~úEÓ‹E59›t§%_ÊÈ»4ÔML&õß^À;n˜7Ä߯µA7¡À±þ]…åE:߯T»dþŸkß` 8>¬ÿXäyFR¾”tÑ–žÛr†ûV5Ï -“íoÕyµä] âí'ëOhlà‹å0]—¨îÂxxô)ýsÉû~Œ9/Ĉ'Ý{D¼¿=œÀöÕ)ïÚÁ-߯u¤/t³ñu¬û7̬¿Õ|žêЧ¢³™Ô°qœvA—ðøÒ–W“<{›äªÓ‘ÖY”÷¹n!.ùu´:žÔݬ³ÎV—ò˜ƒ7©ø Â{àRˆíbâð“úZtéß2äywÎבWŒ–?ê/>“ý¡°±Žcó«z¿=¥þ—i™+9ªy‡ù}M_·‹¾¾ÁûK¼¦3îëã˜ú¤K±ßëÜc»¢Ëpå³j}»´ó‡§ò9¾·Ow{:1­›òÄuàùú>T_âzGͨÞY›ÕE²û³/†¿1ýÕЭîöøß^Èļ‡å¢Ÿºª¸±¤úTfá ç‹øM£ñ…Ñ,ü :ˆ< Âñ`Ò¯ô>gõíG‹Î%¥ž*êãM2ßúÇéÑÏi^IËüÀZ,O3ìãp½©7U•tóßÔßWSþYæÓ9?Û~#âC¦笻¼øáùéϺ½¯)ሗÿ"£ºcqûÅE5®)ëH˜zo2^{«˜ý…/:­Sh@¸ã£–üÎâ?N•­ÿ²è÷ŒÖûèA~Ãã=Oè&xY˜üõHó¦­Nc<^aŸŒÆ¨žŒáÓkŠÞo;kÁ[.zP÷ºÅã½áþáŸwÒ_/äÓº#õšböóÂây±ôOã\tSº}˜²ÓåÑÆoÅø“»jŸ—<¦Ç˳ºšw”áJ‡:ê_TŽWÿw5léÆ[–ùæŸû7”ÓûSù-}~ðÚ®*îšÕ+9.ØûLÏ·ñõðd}½¯è³ãróïpÑèTŸŒ!Êk¾mà‘ê?O|Üütñ²ºä#ûŸK>Öav¿ò-:b]¯3Ö½Îÿxôº’sG^&üÈ:–<\-õ{Œ{ÊMϯá9n&ù*s„¿aáö/dý²Ãó¹¦þ þþMÝâ- 9ŽÞÓÄÉÏ2ñ1Rôãóu±lùÔñµ“áV&ï ]Ÿ$ž…ëÉ-z ?ˆÍ—êqÿÕÔßïí§|ßæß…ãÛ/»,ÒódªGºÚ&Óóûܲ>®xðo©ø5ÆãJ_óÒ©‡`ÜßÜú!ì7|Nó'j»Í’ïlüžp&>Óù2‰÷Lm¼?¦3G8*©‡‚FÄGø”áð[Ä‹ŸœÏƒæIô¾ïT¨^Ó5ÆEŸÑ¿Ç(dy峩Μ°+ Øõ­žR°HÏ“C‡—"ù9˜ü/1_ >)æ«“Ñòø¤wh}ÕÒé[f=M¢N¥ÿ©}Ïx]#òø»_ró— ÒÑ Fc¦"õ¥çëßOôÉL½ 9ô·Ãá4duŽ–†ýcâµ¥Yý¥"‡z9¶ñ¤>­?>ñq%>5iÝfŸ[ÇõÜø X|q$¼?šªýÏ¥ÃCHËP“òÚ·­ŒåßH~œñû¦¼OKQ7Ã÷Kh¡)Ë×sóƒp¹ í5È(žÃ;@¼Üo4~B‰‡Qý묘yµQ·«<·ÑïŸÜ0Vq–>²®&ë1XÛGŒÛ.~ã£é’¡U<^¨-_ë_13ù.4Ó¿èY’hÜ ­ÿžw*"vÒÚtü³þ"OoÃ¥™tY¬ã—KŸ¢b:ñ‘ìûmÓá ìwŠùßsV«ø‡\æÏ ×Ç𷻌òrŸòTÃÂëèšÙº"ïoûïã®c×cFx>dù?Õ8_ù–Ð9xè9µþ°|§^çâCu]4ñ £šäÇÏ{#)e]=\Ät9FísÛï¡«/h^NÚ†ÊL?£ŠžJöë´Ž¿û—‰ògÞ{Žþ`–…ïןtÈNE‹»0èT×sŒ[»p.ª¹Õ?8^(òùôg¸–Š”GÙöžˆF>ÿu¼âÖ.TC=âÕ ÷óÐ=&ž¶ñˆ^tÜÞÐÇTš÷»¿/Üþ §¬ë¼Wr¯[~Ñt£àéó/x|ë`'ѵßlnÄ>Dµ yK˜é>Þ{¤Ø1Ý<°w6³8V›!7Ýß#uŒy¿ò ŸTðpø{yÂ1oq€Æë1ÏÜcw©êQ¡eI*ã¸òÊ1$¦~ẫÑòÈï¦üå0¾ÜŒ«žRö}ËËǬû¤ŒKÂH‹.ìÎ}Âzú¾/¢ÌS>OɳŒ¿¦ƒ¨W6‹¶ÆÉez¸I4u¬Ç_¯ÆéἬ¯ÓKQŸ;ÉûBûp<6UèÞ|ý³Tp6hH8æz'W8{_*y8”3øÙáû™ú­`õ*¡ãmÈ£qÍ£­ÛÞñhú“Qëaþy1\:žìáOýó°òëúëX¾tõ?¼Ó,/ØÁÐG¤gxÝOéß{Ò@{Áäør´4èwU·>`Øb᩼“4oÖ'äoŽþv«›ôϦ/ùóBC½~OC¿ÂoÇš·¼O ºDñÐï´y§Ð…|ÝR¯Ë‰6bPùó¢“ÁÍ5_žÔ°é;"‘Wºþ8ÊŸ½@?ÿQ ú«‡$Ó-^ö5Î~Ïðø1 ùâ‚Âï¥ehXJy­á<}ã~›~¡Ï?tSu±´Då'ÖK‡?fä®uãçs? ©¡EÄ<Éjµ~+ëÌ~зު®Ï7´Õë!È~,­…ž ª¸ùMQý±óe¦¾Ex¦ß—º§«®}\C½”óåMÉ/íਵáÊDx ™[ª<t¹JÅGåDì«Ðí»Éôwú…ç­b;ó÷zÝý\†#©DõíoÎUõ±O[Æ¿V¯Wãç7gÞ­ÎsE€Ãù;ȶð‰OèÿezÎ\ݦkü= uvƒŽ:ZêC7êûT9ŸOe /îƒÌä1LødtuÄYµ×ǃXù±.,»ËMß,&>ª¡\Ä>tL7 zdÇ„|¦§@ønÜy¬TøWÆóê¨ç½£±¡ÞÒIÇsã}Q©”ø®SEŸ{“~<Æ÷ ]O1c¢è·rL_§p>U?ã°lÇêe²_²’å‡P?gê—…‘*ÏùŽ}À®l'ò¶yNê#µJx}G=çè‡ÆÔ7Ê ÷$(ê¸QÍU?Òf˜½Z¿Çÿ£TãÜ´pèq äFÊ#xÙ–zóOYd®È#øºØ–~óó퓌Gbwýߨ¿§!ÏßZð61‰ùÓÝ/×ãÑŽÞgþ*‡ëÍÑt,ºÑßzœkÌ÷BÖ‘"ïG|4÷c0´J¬y-õ¼áŠÐÌ‚/”z¡Ë!ðYÜŸ¾LßÅ™‰÷ãÖi2e¯‰VÄg\øÛTë9賟iqľÇ)­/æñõ~†i޹РC®L/êϺö;F–§[!Ãù)–ï@Q²:4‰cA—pÝGd1µRòËçÑ$Zþ]Õú‚'èT9Ñûˆbšº3¿¥Ãùé7'ÖªyâÓb÷}ç•wç}NþÊE¿ñ^eõê6jœËq hnѽ·UÜÏ»©zÁ/:žÕyy¿ë¨†ÎzÿQÖLøé´ =Ãu°Ë¬t +Z$Zoãö Hj6¾›¿Ý%úϳÃó ÞIò“WüC;sݪÀø³ŸO%o+ëkIÇñ>`ÿS4ÔL×?Ç=ëÂõ`Ú‘îœgÊ‘ŽÜ΋Ãu/÷üL?lÈSî{:<¾¹Xðöq÷}ÑúGäÕ ýHÂ/âþ·Ãõ/DÔwÌuÔß3èÝG54vÄçQê·ÃŸ/L®¤Æ‹Ýõ¸U4‹¶ÙtÓ“j³º£.o`œÖj¼œÖ}âøj\5(]]ê“€,ê×ÚWgý6ÐåÎHø<´rÔçj,Þ‰ã3n7Tõ£1÷[±ð‚¨Kø‡ñogÄOB^øs€úñpS¼þbÜîLéôIË|ý­Ž:#Ÿ1ÜæúWÂ×󉟪q€üÛ%š^r¦ -õº’enÖXàã ýtüí&,ùz o—î(•û€ñŸ…ã)d^šéîc:}ÿrDœB·öÂî_!YŸÒ#LçÏÀëõÎÀç»ÿ)ê#wvQ4Ò¸ë+†wýƒ&üÁ >ê™+²£áŒòˆ{qøuÆîwSñ۽ϓÍ_(—™ø—ݬâ”ÞS×#ïpÄç·ÅsÅÑtvã´×WÜd²/<ïóg<¾Aÿ ¾¯ž½¹XäÝš9¿Ð çù^™6SÏ Å0¸]x‹Ê†þ%¢Í˸–ò/ Êf(¯ëÙ@·~F¨ï6Ÿ¢Vft£ýñwwy îݸ_ªWXê”hAqcŽA¡™x~\ë]ý³ãáþm¸`ôQù’cÊßs8ª‹yÖT¿Æý/»á&ï¦Æ/Y¬?â]#âõEvÔ¹G£ðû‚Áz}¿ÿÒò—UJê×È[”Ó_'îĵ¨|Ò´çïLýhœÇ\Ímþxôý{7Hô3´3ê}¸Tÿ^`"ãÝŸ™Î¨c¼»à¶µ7þIfûŒ•Y2C3ÖGHò÷ûÈĵϩwAFñC6+º > :„÷KjR/Ã-}ű:w«5¥ª¿è·q:ï¯w6Y]Ëï·Õµ®“ž–n±w‚tv^/OÑJäqãƒj]á·ø.0ÞÀGR}O$ÎE“”û#õ‡y݆ëáί×E=‘éÇ!‹õÃ=–Y9®Áà!óz­Ídß4ï}®Î±Nœhþ¾qœüð<zÞgû‰tü¸›#=ß6ý/® h§cˆªŸ¶®Qàx·üX™p™ã~ÛïŒ5?áÎßD‹ã»öÔóƒˆWÊõçÛ55èÄP]\æé‘gѯhÉøƒ‡¢ÍϨÊêCc(?ñÐÊ—‘ßbèÅëÃï ySô ŸoѪDû¹Iß3°?é©¡ãÏâሤ4?TÖ_Sß·´ ýÔx’÷Mó>/e=–'‹"?„6Í%úýgLÒó4š®oÌøÊÕpÛ?…¿YÉ‘Gþ÷gžË_»G#›êß×úuÚ†B•nqz@(ÛRg¬Ãx§y4ïä»õ¡ÄäIâ9ºX hNºFy ñ¢…ú>[íÚ¥3?dÚP݃»7ݾŸÝVed^AžÏ^Žò°- óÀw€ãóuÛUnÏAnºø4Pç-‰_4mïªj<^†[*—™ç ¦èñ¥ŸŸ_¹.EÞïêð>!˜¨ÇÙ`yd}Ÿÿã8´Ÿoùk¸?uïûb½t¿¨Ãf'äW¯»9Õú°Í\ó¨ç—˜ò´¸ö·¾ Ýêý*©xQÎoÀ”kBó0غS¯gQ'ž?Éûáa¤ª‹ˆöîqÉÆZbÿÓjý ßxíÜ àýN½c1õ&ûÄôß=+þîÙ*ò&ü:÷y>´n$ãH<øC‘£:(Šõ~¥©ÿÞ9é÷ãæ#n}¥v]f‘ÿT—åƒ~OqäÅ"ÿŠü”òŽ/é×ã¤}Œ¥¡}8o] øv¯ÇÓ=6èþÆgº°œï~¾Ì5.ŽèI:G7ÒëBÅ磪¥Þ³zJh\åóaÇÿsÜàìëE>¯¶…OyCMÅäë; KL»ªã,ðy‘>î”}qp©ˆ3°ëV}}+ß O,}µˆOK} l:'™2ÌùO}ždº^§CâüÛWçñ¡!Ã&ì{µ~‚Ù߸LªÛÊ>mþx¯éýyŽÛŒÿð-õq/òKÄßn%úóŸw“à]çXðÈ»O„×zRžãÒ{õ¼¤šŽü Cý{Ÿ;A[uW“ýê±ø1qÞT¯*øn&KïD¼ãáÎB_tIÆ3Ž?8^UçñGªz‡èLñRG§²ùþ~=K·>‰-‰¼âé”õÀ |îÒ2ï·÷É{ÓícºG]Tn èdÿÜ{½ÚgiQFðc<ÏlÝÞÖo|F–Û82ÿyý„P„Ca¸†ì/ƒÞn¼“aHx=Û:=¤wίúéÌÛ¥e¸µv*õhÔ¹0~7Z¥¤‡[L—ÊÔO–û3&ðËjœ‹b~@³ó»Ž¤e6½'»wõy®/+ëiŸgÚ†’&·™’.MRóްÿOêã!ÎÔÕðä?ê&Ó; üû®ÍwÙ[_O3á†1!/¼Þ7ãÒRÍ» ßàÔSóh§òìщÅsí’õý ÁÌtuvWžþQÛˆý75Òsgê‹é·üu‘÷)©®çëµbý‘/5ämF„ãP5îÕ-¼ÙÆnõRïÍtt»PJ!Ìý–š_ë.Ö;©"±ð{Ÿ0œñ ½¬:†ü@VÄ|ì$·yÕèïmëÄyúßùç}Öqäþëï„÷¹Àt¼¹¡Oftä°«k,¿ˆ?GþxˆW½ù65ï–P_cKo3®‡Ë¢éÉIãúãh§Æ³Þ!qÝlýœdžÍ§%ÃÕZt¥üí*éã(ï4Õîž‘þC®fzîüïÏ2œÈØj½œöÇ57ª~Bo¡÷Èë¨-Ÿ…¿Sï_Äþ{&~Ÿ·¼Üð¼.êŽ8ªáó!Ê“Ž(~í?¸æ-ýñ{±ûþ{y¿‡¸†v†ü~5æ76sô#ްë_ÙR7˲ð2Æg‰¿†ú¹ÝWCȺ+{ cûtëa¼¯Eà¸+š'ë×Ô‘ò× ÿ_©Û€ÛvÇÃén“ºFºŸ¾žÂ¥ú÷Dê¶z:æÍ8®_ ÒÁÏbí4·÷›÷ç»6&_á®ßˆúØ*ÁFk½>VŽ××Ë"êР˜Õõ7ÖóG+„ûmhžL'ÆdÒÿç~MàøûQ€ólð½ßžcî¡–zþX$ø¼®Ïû+޳äTó>ÎÂÄ3î®âdßTÿ^É;À·£úJÂ>½IyLÜ|þôœ•t^³¸áDÆ ž#ÇÝ£^fyÄe–óN¸Õ“’öÁ´ŽßÕñ<òÒÑ}A¶žÁÀÃzæÅŸ)qŽ%>|ÍH`Søz'8^?µ>ŒÉÔ/té¾Ré ëjhÍò9™­‡ ݇íï%Š¯ÐŽüA>±Z2],Qç_׸Ӥ—é|Ü1[´ó<ú¼Y‰1*~›÷;Òm®”lÝAGñœaÜ7"ÍoÞ{â>{~%Ë€ïrôW1Àâ¨z¦ü•õ8÷ý,ù³5Ë? QuTRë«Áû•£xê0ËûUÎŒži³á‹ÛOX¨×…tÔð·Ïfú|Ùô<;Öƒ0ïl<Þñ7½Ì¤†ú–ù× DÇNÚ8 LsŠÐ;WMÿ{eÿÞSò“2‘aßU÷÷ 'å½ež =âùc&|4†¨yEyŸP‰â¸ ë;-D¾Ðû‚úCVŒ©X9烶”·nÍê.MÄusÕ½ESÒ¬Kõ„iC„~CËûCúïX­>jâù÷þEõ ×ÕuÎûœñÊI·{êêy„¼ŠÉäºîŸÏµ-ÜêUô~šôbz†ëvÃtþ¸nžq¿Žz?ƒ?ÕÏs{öªñýE*Þì|éBùç3¼µÇt ¼v}zN— JÌ<ã”§DƒÌÆ ž+©¡YÄúV…tâõ¨†[nÉHŸߥ=nà8ÕÜê©’g)û±¡ <œ÷½tñb¥m$æ+›nUZÆý ôLÖ×÷Ž:¯zTq …ê<‡‚ÌÆeh!Ö¿¨}3¤ñ¾FÜ¿0·[¹®O¡Wpu‰Ï{µT?çTfæä±:ýÀSÕ£@ùduIô¦ö‹ì êV{û©ž4¸–6ÿÆô}# ¯ÜÖ®@Ô¥Mþ/õ/6ÕgqßÏÝúxP¼"ã ÿó†,¿hY,LmT*ýåã¾oÒÐåTèþÞ//,\¦Ì¶>ÙêΘQ$Öý[D<0U䱇 ý8©oŸ™³/=ÃÕÜâœÀ~•H—³%õ}Ëe:ã2_µIÏ#:Éêœí“õ³‹jFÜr§xó,òYÝkÐCb~K¨ß)3é aÑ¡xxÞ”táL†Y9zýÆS;sÔpÄÙb8r”/±à/Ñ÷»áóH[–gÀúB•™§êEõ•«Ÿ }o°ö;â=ÌŽ6_a8á°™ ²,ùו×|©ã›¸†óõºÆý®6èÁQÐûÂ1ŸhÐãÆ®êó—OuTâa =õY¹÷n±Þ­ZËoE9ö®¬|^ôLÒ6Ôûß±Î_¨fòGÑ(3y=4*ü‹ä#ùÿW _‡ä:èxESýüP?]ܾò–>ŸnÑ{ÇE¢>©«õ;®º NëOòwv˜ôvÇ¿÷Y7~ØS…ôõ]G§m‹Å|¹QôEÇ•"Á[: ^ìíEÝlý2ã#½ ¬û‰ž»j½š×úî{‹•ùsól¡×Âúbè߀á¢O2nÞ!â“Bæâ”´}:vÿYä7Û…óŽgè—Xpaè%”Y2ÃÕwg$‹ÖŽøœ ¥Ã›4ê/²Ô[·=z~ú´4vÔiêg¨·÷–Ÿ—:tQÏÓßߤŸvÛ´tú,U ý»«ç?zûàsuÉ[zþï ÂÐü‰KÏOŽ'>KEÏÅfg‚õBg{ZGŠ+q±H<¢M·xù¸¡?Ÿ¥ƒ­_õ<Yð9áûKÜ Ê³úÄiÇã³~鲟K€ÓÀð>¬+ü¥áý½žÚâ‘á×—é*zGÈïÊq›g½¥£C)õÓq5»ž}Dÿû¾éöñôÇ}ä™xz¸ãñ¶ýýž'ÝO¦sbÝ~æ÷ôëL¿Å¥O-l'žã&†~jb:É”_Æ×f´ó—Ý0ýhxŸ”N–>—i~™&Þ[,>íô>à"}6Ù_3ðy=˼Øõr½þvt×}ÙŸ pœÞ†í'ãx/•.¾ yŽú¯Ž×ÕįA·ó3ï%5´T뫱û Û™(~Æ¥*¾õ ýr°)ôüøó‰z†|tžc_ÖQ}UÿCöɾü}¡ØÀC%?-I¿w4½z\lÐ!ù­!ŸQ×­î‡ú™Á=¡dP¸~éoôï ×'²™wšôL» bdEÔ³¶ô Âò,ñ÷JÁ÷÷°>.yýŽ:¥««„Mù©êYBÈ“v—ú¾èÒ^äõ¨®ƒÑ¼Íú-b¿“éÎÿ²ßz¦ûãž nÛÕ·ÔS9Æ)Ç©~µõ/HÈÿ 'a¼Ê “):ôik3SŸ“¡ë³©m ýêÅì¯Xžð¸WœUëõ φî³|ƒ ïa3©³àÛ’Å«×Î×ÎgœjË3rÃ5{ÕãÖvÔ]ªææWÉóC¡³è=géß°ëIÁcc::˜!òÞßâùÙÞ§Tûûd}///ò*WÝê4{Ÿ°¾˜= ÿû—ˆùºM8NÉ;ÈpM•è¯Ao)éüŽÉxSi›Ì«¡0^_O›yï ?Ã?H…ïˆöéà:Q‰éçµO†S?߆z½{d‡ó¢pÕÓê¼ÕýËÍwà†þé®Ûè¼&.뺭nùâ-Ûxò¸â7¢^0KßÍß®:õÍùL¿ŽrÞx\ÃŒ«Üê†t$´S×g©oޝˆ¿}Ôë‹.Žýá7VׇAbžÀÄ+õ¿Ÿë¢çO³¡¿Ûöÿ _o+êã$Ì­©ÇiÌx¹>{G üÈ¡%êyñ™³>Úö?†?'ÅÔ׊ù[¼®!ýwÛñ¸ÿå×Eõï0Tð-¢òQ|‰Ÿfñ>Ò=•çGöËäzX(&¼$ˡ귡"«;±z ò7mÐOîD¸OÆ«D×hëªüò[òÜúÕ8ÆEèÕ^ÿ.ÿDÔsòMãoWó[=Òë0ù°À÷:ö[Áhá/¢Õ áùð)+ÂùIu.L:õÁ’õHäàmºÞÙŽxnÆ ÀãµNië[ƒÞÕçý‡vyޛ߿ ç› Íx> Ìʬ̾<Æë²ÆíÆ_'ê0#îõ¯1—” ŽãWª}Ò¼×ôy`ä’éác¡~¡´ã¡M¼l6ýgÜÙFïçGÔÅ™»?#÷=ßPys¾­ß©ô÷'Ž}~‘Gù«n¬ŽPDïíœßÄÿ)˜ÔMk<´‰–ÿÌ”aóÒXq/.ÊPŸhªGøÌùzÜœqœá”ûÜ‘O0hŒˆ[:²¼UK–ïj%æeï”!¿Y‡Ž{Ì€ïùg´÷ÚÕPŸò4…•sìsóTï>©ô}p¬ÓzÇ£ép '³ñ Z¦Óÿ&òq/Õçc'û^7MW7E¢ž‰F޼¦–ªî8v>§çÒî÷Ìõn¬Ûwpã?öü=•ï]'<'š©ó ïoæoWSïWz"êŒØ®òV[FÃÓùûí{Ù­~’›YÞ¤I—5Ýð›&CÅ ë8:ò}ýí¤û~ÆO¨Ãäc¨G¡Aº~T\üu\KùƒC×%Ô¶n¡¥¨¯H\5F>šÿª².Tý[tÙ G7Èõ|È¿o‘2ÞÓÖ—7'Z¿yt·ô9/ê6¥Žodõdä±úó£ËÔíYÿmëø}#´r¬ŸW%p‹ÌòÅ~Ïðºe`ÿ.ÔG,—Õ!ŠJÂ÷›£¯Gp“ý^dÿ\tH¨{—'Æ‘:†Æí ü¦;ê>ÔÎLœr¡šwšxÓ§“õëÂPñ¼¡Õ•»„÷1áz¦&<*ºÆ‹P> 7Þ«øÓÞÇücmöÞ´Ì,ù¯3=úÌÄ‹Þ;nÏ…\w¸§«¡C´uIæ×ãÔN¿ïÔó„Ð-ZŸÀþ?ÙÖkW3é1øß¿+ó$éÆ#¨ËÖº€„þµ÷ÃiîMÊt‰ÉÓëîß÷kÃòeæÕáxf䑜áý“ýµÏ¯ˆÍ·†þÇhÌô ‹ by“PÏ#/^]#Ãq5hA<®,}œ‚V–õeéõºœ—‚¬hëÌ¿Y·ëøº¾ÑWÿþs<Ë…fœÏ{œCu¨ÿ˜œ·_¢~oˆ³üïY|ƒ…L—ÃÒ×Õ3ÛwÙf¦ú7šž]“¿, …)ëÍÖŽßsóö“~Øžº¥ÒϨ¿Ýð`*ljªçájœ×dݾV< Í õG΋JY¿Ø{éËÅ3ÅœŽ¡þ¢ìÓhüÞ g8Ž#þÅß¾–c|yÝÂpp¥˜ù–&¥ƒC‘ºG¸ìÖTóƒi*‘®Úª_¹ñ}Ç«ï£z8Iâi¬ãdé×kž—õqmý³¤†9¿÷' |ÛËõý¢¼Ýò¦Þ ÆOþ$ܯA_‘oDõ¹Äàd:r™6Ô×?XÈ{Û¢o–[º}DÐ>ßËf2>É´ûº;¡¯÷Õ§záP¼W ñä>9×'‹÷›MËÐ!ü½²ñ¶pß$¡ÃÅt’1v²ŠªàÖ—Ï |žõõŽ™w»>;Ò~è©ï ‡öñú«£ù£Ýˆ7ø†©.Lóá°hëò#òªæ¥M„_>¡PÕñrÔáø>Œÿ“Ÿ'ùr½Äì‡Ô¸kåüDñˆ¯W3øY1ÞöÇÄqF\¯âìz Þ'¾õ†ÀmÝU]ÏçVL%.BOõïÿŒ‡Bý®¯øþñ½b~y'î_颯•íâ=ïšaþpkªÎR·<­ãxgÕyóÉ£òºP°†ú/Å‹¼¿ðBû u¬ÙUôÏeÂïô ýíªêã`¿/UÊ—|bØîEø7­Sü#NyéB ú¹êOV6ôCïÃð3õzõI }ŸP×DZņ¼áÖ6ÑënK=évŽ<ÝÇß<@KÃõzð±.ÍþçµL¹Þ•ú/xòÏë×ï-ÂÙ}äæaâ´RÅ)Zug©_´©GêçCxôRñ¼þüqù¦Dq¨äÑ¡H<Ÿ&Þ$šÐyTäx%ú¼ä”¨Œ#¨2éÉÉ|÷°hzèBúsï2¿ãÊ—“åMú \2ª:ÖkG«ObÏ?dö‚HxfFŸPÏÿq^ÚÍ õ£Ññ‰Ð߃[ΪõÒ-âñ–îû·ºÊ¦÷ô~vECüUɱïÓÉp—¿(îïC]Cq)˜ÿ¶wÙ,ü<ÇîËu©æ™°iÞÿ)^`™•Y™¥oh}aè_eÚlõ¢2û¿m¨÷åÂo–Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™•Y™}Y ]KôŸ?^7Ý2ïd<] t¢¿E*ŽÞØŸ®O-Âa;â—‡<£lç6àc—üCàÉ·n„·ÇP1žì‹áý@à˜%ãÕß…5Ôÿ¿÷‰ØnóJÁW¿d¶ª;t&3ºZ&Þ:%ÓÃ7ϱÿ‚É€hý{œÇmH:…BÀ77I¦¯’Çú/æ©|5´1ô÷mç¦v¤/Þuv"7[ß<½D¼®üõêáðÑ󻉸Ñ`g€j†>wüìý ¸$ÙUß‹J]Ý5u«%¡!4´f©DÆÞ;& œÈˆ+#3£"óTŸS`¤FBbHÌbB #K Œc<Â?sñõgóág›‹g0Æøú]c°1`àd1½½#"cý׊Ìsòœªj‰{•_wý[{Þ±çñ×ç;Þó²úÞ¸`{½qðGâ>œo}çm½»Öº#Ò!ùÒW×ùí%Íy§çˆûS.žñ>ê—ìŠÏÉç$;÷4ǯܙwÿœ¸—øyo©ÿ>­9'÷)ßÎÏWOšsã¿/îßx×kjóÅŸøv³jÝ)~èlç¿ðKêû­O|·ÉOßÙóüâ]ªäåÍ;bùÎäNò±ÛëÕ]÷g'ß8åç+v”ÓNxgÇ}O÷íxWâ»êó?ïïi¼é ÛÐÄ?ÞÑ>ß#Üyê~÷ê%#~ÇIæ6÷*$_ñ¢íç›ûνß;\ÉÓÎv¿ÔÁoÝÙö}×;­þ…;ó.Ö¾ïðuì=§9‡þ„sÞSûªoçåòs¿å¬NœìþSîÎý`g~Oñ¡ýîuJž êÍþõÛºusßÛÁ·ðzes³å÷îYo¼ÿä~…tWþ’¯ß˜<¿>¯·¹wa×û+É[þnÝŸúŒ§Ôý„¿ó5uûüš/¬Û¿WŸw{YsŽó3¿‘Ÿ#üÁgñöìk¿õöÞ“ šûv¸½û ’+â~œsÞÞûÖwÝ+»ïïà?6ý…[¢ü¿NŸáúÜßp»õuòQâ}•O›Ü•{ÃÏúÛ÷<úi¿äÝ¿y[ß]Þ7¾ùüL3N»Rÿ=øG·wßú枈ÓúÉ;í¿¿¹Ï%áõúæÞäøÙ[ïyL’úþ†äÒíµ3›wµý Í=Ù»ì'Ï»½qþÁš{Ÿšûžþ'¯'’OùÕý?ø=^ÚûF›÷À’¯ñqô'ów‡6ó É•º?sÚ;¯gý%º_'ïükç»éèåwôœqr­¹§à”{½“˜Ï帪•ÿGq?àê2oÇÞù-uýûi¾ö÷°º ãÙò»Ý©ßÁïŠy“½‚ß?xé.ÝvÿÉý²Í{XÉ#g»g«ãÏ«¿¸îG¼æA¯7¾€ß–½•ßË´ç=™rÊ»wè}ŠÎ;y÷ßÙûà“×íùóxÈÓíþ¦ÞÔïº%_ðyý²£ÿ·yG)?ã¶î3Ië÷Œ’5ï=îyÏü™ýydG»ò¤æ=ÆÑÑö{!^tʽ êêòþßTÏÏ}ï÷²qs²~õö{ãwæ^ñÓ~É×ý ¿úó^Wï^}ÏæþÔä³^Y÷šùÌÍŸnÏ!ù–ÇÔßóøÇïJ»”½™Ï—ýÅÏÚ«¾K.‰wnÿ\]¿$—šþÒŸ6÷èï¸'>y°ù{ùl÷£mÞßN~臶ÎWüÂÉã—äfvb¿Pö:ú¿º}~)ùÞ¿t®õ›äÆ'×ñùΟë=¶Sï…ýŒŸâýž/ç÷o'O¾3ïPïZw”áÛ¼÷×úÿ qoÑ󶷷Ƀ¢?'çKë«¿±}| ûaûþ’·<åÃê½<ù^ümÖ—“~ö™æ1ÿ”{¢ÜoO®/œ÷—¼üÛëÅï7J¯¿­~Jbø;È¿+ê½ïÿ ~ßê¾—rg¸žr¶þn7ó _ÔÜGý„“ç“·þÑùîùäûø|ÁfûiGg{÷òkþò]ywoÿŸ·ß:ð©îÛßMÒÿ±ßýˆO>ãw¾¸½_ž¼ò›·ï‡øÿô?ßÛußjrq¿þxÒû…»Ò_Ú÷·¹ùQóïߟ2>÷Ù&?üº/`ígÓ;ï{ÍÐÌk™sÞ³ý'|^às?gû=«_pO=OóޓÙÌx½Ÿ|Ê‹êúïóßÉßxÿßxÌÝy“Üoö 4óÉ?Ú^žÏû®Þd{{úhÿ’ÛŒ[Åþ±×ýp=ÎÞŽý[/oæ^ºý~²výy¼ßsZ»,ße:5ü/=ÛûÉ×¾­wÿé'–ͽªm¸UÜKýÏšöôÛó¡œ:øÙ÷Å¿ñÍwæ>ô—½¥þ;äïãÈúïàOž¯?ø3–ÃWùºð•ó½C˜øû­'Ÿõ½öä›_´½ýzÁöñ¥üΧºÿ}ÿà£ñiò¶ÿ“ïwú—Ÿí–ß±¯æuŸ{{ë[?ß´7_öÊzžêÍzQó@ëOïÒ™Êõ¦kí?wÇøCqÛŽ}Dwêwðþíýùƒ_ãägì¸?þ /õôüøo³ßúCŽü>òûÈï#¿üîÎO¾Ãý‘ßG~ùýßÿ—|Üÿu[û§’Ç>:ïÖÿßí—h1¾{ÌÉëHÉ_\ðuGµýÑö¿ò|ó,IïÑ%Ï9y½.ùþ{žQzߣó~}Çÿ›sû¾ŸÙŽ÷¸ŸÿÁ3í«?øýfÞõ.íÿ;í—Lý¶ÖáõÜíçï½»ïuü›¬øzèŽw”~ÿäù“ƒÞ÷ “‡îÌ~‡Ž»o}{½®ú¼ú\Frëázúj=ßwðÁÛ+7ÉáN^ßyŸW<øƒSöG‡ÛËÍæ½ûäKÞugÞÿÚ·óý¿{wÒ¿Ý÷Üf¿ôŸòù¶äò)É“w̧ÿ­_ŠÎSo$÷4éý81ïßÌÛ'Õû“éOžíýèLjüp›ï¯ï<_Ô¼c~ð³wé\Ùôß=:û/ÓÜkМ›HÞø%õß/û¥úï'ï·ßýàwš÷ò^À÷Û&ϯç¥>ÀÛu¹o9YïØßšÿÛíóЮ9¿5ý²ÛêOîûÛõþè®_òεu|»Ù¶É7ÉÓ÷|¿íQš7N>ûo?÷{ÿ9_úáöKžq¶õ-ùlòÆï:×~™äåÑ^í|òîwœØ~Þí÷:~i¿õáä9¿²}}ïOj’‡êzøn¿w¿Ù›Ûþ‚¤xe}ŽëWšòò´æ\…jÎ¥§Û÷K%/ç`?¡wGÏÇm~ïß±Oá _¿¾ï_ø“­õL¢:׺Jâq΃Í>ûá·Ÿk¾"yíÉçQÎûKü³½Ç½ïOÞg‘øÍýÿåΞ“<í—]?q<¿w­'ßßö}‡OiúŸôÅûõW/ˆöõžæ>¬Ïœü®ô³šsÐvÌ3|ý›ë~[ÓÏ9øã“ÓýàÅyÖ|{;yêŽ{Ž^÷k§Eu{<Þù÷wOÂû§º×Û^ÿËßÁ¯ï¹¿üÍ9Ø?ÜÑ¿NëlõHÿ+îê¼sòÿd¿~í'þmõ“Î;®I¸½þâ¾÷õ´þ=r°ý<é}â|OïîÌCo~›s’絟äÿålû_q¶yº¤¿ãÞÁÇœrÞà¿7ý®Ç︧í‰;ü‹Þ¾µÞN‚“ëóM}ŸÛ¾ƒ÷m7oîÅIžºãÜóºO“&vø·™NÿUÝ¿n¯ä/yÆÙÎo´þ¶Nöšr¦u»äþ¦ÿö¸ýêõ䞓糓—6ëÒͼÇiç¼ÎûKÞe¶æ¯Í=ÊÉ#ÿåäpæõ½¢ÉƒÍúÇôiûÝ_yÏ)÷ã½éþsãä½ïÝ/üé)óhßôwõ¾‰;õK×Ì—íè_ÈyÎä±Íøæó¾„¯O5놿×䃯<ßz\2ÿ‰½ÌüúùÖɓϫÏÉ%/:ç½ßò¦í㟦–çÔîÔ/yâ~íû®{ “G.ðvóÙg[çN¾æ7ùúcï›I^ÒÜ#×ô›’PÜï§¿{ë¸%ù¼úü]¢Å¹°ÿºãþŒ§4óûO;ã=¢/Úo\×±÷ÃÏxÓÖqÛ_~s=¿ôÈ×Õ÷Ú<ålë»îã8øƒSî­}ø|óU·ûK^zßöðžÒÎ$ý„ó ¶çƒÖ½÷ÖßõàOżÈ#O¾½û>ýyÛïÓùþ7²óqÉãë|—¼æ·ëzñß§÷¡þ%Ï»;ûjþ¬þöý¾ÿúîžçî܃þW?¿¾Wò÷›ùÀï|;¯¿ø{N^gú˜¦|—Ï¡ßî/‰>õLóY?½çxøo9[8»c]è³_Z÷gvŒ_ÚpýÛ;;ÿ³kÕ®_òÌfžñWosžèÙ¼]M¾çk~åLûÉîÒý”§úû o‡äüA²¨ï‡Mnñögó>ÍÞþ|v}Ÿòî¹Õ^gÝã |ÿþÁÞ¡{ç_üø“ÛÝsÞKæp|”ˆïCûWØuoK«ÿ§;ö;øMñmÿ[].Ÿ~Ê~ôÎVŽvºóæ'}XÝëõ‘ßù%Ÿº½?|ÜžûÍæ¯Û>=¯ïÏK>ÿ)|üü@3~)êuÉv?Õ&WãÇëßvG׳äOîÇëèŸò~ÙÁ/œ­“÷$œöK¾íkÏ·?0ßï¼MÒkî§}B=N–ý‰äïãç~Ä=õg×è'8ïx¯-yÇWÞ•ù¢ä™Íýb_ò7þEu¯SböÛÿ–¼XŒçoóÞöŽû‰þïß{ßgoÝGþúz¸éçt¾ßS·¯Ïœõž­ƒßû­/4ód›ûæãíí\òÆŸäé4ÏXøÎºÿ}×:iò©ûÍwßî/yÛƒ'¿‡öZo¯|›”wèÞí¯ÿŸü¾¦3Þt§íý[ùíweœµÙ‡yf{Ïݾ¾•<ëŒåà¯þK>õ£ø8â›w_*öe>wûû ÉÕæ¼Ë‹ù||òÍÿ÷7Åúèæ>”ͼvòÆÃ“×#¾¬·µ½Iž¼£ã…ÄìùÖüÓö{ÇȫۧÍùSÍ¿h{?º}7æeÍ=hO<ù;&oý‹Ûë³çœmþ+I‘ó='Ï3üÖÉý yŽ$ùÄóõκOHÞó¶¹/îà½;Úï‡Çõ>†ãæï 5ïH%o®ÛÙä1 â¯\¯~ñWÕõJñwk{Olö]¾ülëzÉ}§|w9~ûøfß÷ëþeÝ?=çy‰vþ¦¿õš³M´÷~Ÿñ>µÍO¾‡ØÖ ‡Ÿ÷{ÍÍú>|u¶y¨}É{þ3¿7ý;î9ÛÑŸJ.ñ|»ïüAò¥ïãõìgR]¼ûEü=³ßº³ûïÏúKêóÈÉ ¶ß£{ð{;öüÇ4ç7û¯’=ß¾ùÛµ®Õê‹yæ]ûNûmö‘väoýÄ:½›û “OøÝíóXÿcǾ™kÍ~ÒÍ¾Ž—6û·^ûâz]øAqOû‹ïÎý¶Ésv´{â>¹äè ÷Êß›ó³-÷ÿ6¾ú u;ú]ÿºN?qþ¾÷l'Ï­çí’·þb]¯¿úMõºñÓO©§?N܇ÿº×óyÅSö÷Þ©ßÁßÙósÉçÕ Îû¾aǽ·>çQ¹—a×{ŽÉ“šõš/úÛZ§Ýô:îÿ•KûÝ«Ê;Ögý%ÏØ1û¸»sÎõàýÍþ æ¼iról÷èîíX/Ifï?ù]÷üJ]þ£îÈ»Fg¾Ïö…;öå?ûŒçzþÚ3ïê<ã‡Ëï´÷Àþ¬ÿ~MŒ{û|kòôæüÍ/ï¸÷ÿÓßr²?;ö‡%ÏÞµïó.Ýß±c?ï®_òõŶÉg½áΜÃ=¥ÿvf÷v¼G—|T3~z²X}ÍsÉä|ó‡Éšö-÷¦|ì£ûŽÁyÉ·¿~¯öss/Êæ{'½'î7ÏyõöÒ!yizGÎãmÞ#ÜìßLâ¦ü¿¿®/6÷&%Onö 4óèÉ#ÿlûþÞSÞñKžò¹ðÍ<é®ùÄÍzÌN÷Ÿºçyû‡ø|âfœÒê¿âlýäƒ?Ú×dãþcvôÛú½#ûÈ6ïÜ&éÙÎÓ&ŸXoîô>•Ío“¯î´»VÉ«^µ—¹]ý¿¤¼;ïÒ$½þó¾šäõ÷òspoûº½æc>°_¿7y’8wûæ/®Ç?ð˜GØüÖÖ=Õ¼ê·~q]Ͻ¯Ù‡ü=ÿŒ¯6óÑ›÷Ë“üƒÕ}\ÉóÄøúþfýà;þM]~û¨6ÿÜf]â‡ÿI5 I¾õf½åðñuþ¿þ܇ªùzˆÏ‹þWòCŸ[ûsü \~Ê>ªÍ=eÉ÷üÔ+*ûßüP=óŽÏªåïþ´z×4õýæž°¯úü¼Í÷ÿójÿkòm÷Ôû¾5åëËÿÖìÇmÖ‘ÞV¯O4ït$ïúƒºŸò®úþËäÙÍzÃk?Ççró=^ÿ¤zû õ÷OÌ k{¯úo߇ñÖWÔþ~ßÔû#~¨_õ˜’Ï©ï¹JÞZ§ÿ·÷kw¼–?ücuø²_­Ó÷|És«tyas/À7ÔÚ$éßñ}çÿ«i/Ÿuò¼â©ëb>&yÆŽó‘ïyi=ÿü_W‡ë±Í¹ ý5ë§ÖßóS~´–ÏWyò®·×ß÷Ç~6eë#ržèZ½ß­ýû÷_]•›äo_äùàõÏ©ýûüŸ¬ýûº›uºz=/»9|רÓõ‹ïãëõ?ðWê|ø-SçÕ÷ÔæXU'ïþG|œýž×Öî|îëw%amy¡ä©Ûûò]‹Öü›Þ/øF~)y××ÖñxÕöóLÉžíÜö©áçÿº#ãÔ͹ôä™;ÎéÆçÖ_´ßzXra‡;͸/ùèfœò}÷¾‚­Ó~Ìí½ûœ¼õ±|>6«ûOÉà9çur?“÷òwOªûµÉÍù–ͼԳNyñ£Ä<¾XGKn}•Øï=¬ËßÑÝyÏ0ùªïªëÅÏù|Þ^ç?±Ÿý¯ùîsÍ'¶çÅ;L÷¿ôËoïÝñgü{ÿú¼î|¨´cüðЦÿ~Êþ¡]ïöKF;λ?ñC³Ÿ{×ïà×ÅúÒ—?û®Œ;’wÿ½“Ë÷—ý˺ßòb¾TŽ7O»'$¹gG¿à›ž^·Ã?pÿãÙüÏ·þ³í§\í¸¿âÉÍ~‚'6ûB¾ðà;ÚÍæþλÞDgUßï¼¹ß4yÏ—Éw~e­ÿ¼ÚßÍ{’Éëê÷_~oûzkò´f>æ ¿{ûú䛟Z×s/9y>âÏêoóNsòÙÿï+øÔÞ~~åó¯ü™˜—Ûü6ãyxrí”{D~Fì{̇f>"¹ñy'Žk“¯HªrµÙ_*ϋܱp|QxWã/çÙN5ÿ¶ÿº}|÷¦ø¼O‘¼av¦ôIÔ;¶Ÿßq?áÁÄ8ÿ©gÜ·µcü™ü¥üÄþaò Ïåícùêúðs?Ÿ÷G~ûzîÞỹý<ðNóÛŒ^qòü¸¼O0IþóÉípÿlã°Íyåä Ù×Ê™~É;¿¿7úŠýÚ¡äc÷ÛÇ”<Ì×Á“‹b?íÑ?àûÖ¿úÇø|Îßzk=/õÕŸ¹}pú³½ÛùÆŸ¨ÇCl¿¯c~öÕ'–»äI·—/?T¿äIbŸ^³O4ùô§Üÿ{Ö)ó|߸ßþú;õK¾èWx~Š?ãL㾃ÿ±ßúJ;.\þÀ™Æ»²—¿äV}KR>§æûÅ9Ð×ü‹ïYˆs$Ÿûu¿t3ï9Þï~ŸÍüݾñÙ÷—|r½Þ“<¡.²ÝI–?Ê÷I?ãlëä§úÿœº¾ßuÿYð}Ù?·ß8|s_JÒÛ±¯º·ýœëÁ¯>:÷ëüL3.y×'óöó÷y{žŒ_tr¾|Í_Ûë<îÁŸÜûc:á™<¯.Ͼ»÷AüÚÉ÷¢œõœûæ—¼ñ}'÷ ÞÚ«ÿ>[Œ ŠÝ>ŸùŠû]/mÏgÉ»¿ô|÷ø¾ðΖË}×ÑZóÿ²™¯½Òäëþ~ýŽƒ÷?ºç¬’ç<ãöæ‡ïÜ>î¿§Y{ÛöõqOcòôfŸÄ[¾s¿{'Þ9®çé>аWßœ|YZ·#O=åÞÁ_jú O½³ãByϾ|Wëà¿Ò/ÿúWðõ›‹â\Îc÷¼7­Ißdܬ¯Þß´¯O:_¹ØÌû¶üÉÍ>–kbüÕÛ~¾ãàGÎyØw7ë­ßûʇïä8»ó]þY³Î{‡ÎÜ­_2¹;áKjöaýñž÷i>ý35·÷îæmûÿmÏÜ~.ñù|Ü-ï­Ù÷^¼äí¯:S?c׺DëÞk^ÆËa´ãüäïîÙÞü±h·w¾uÓîíÜõKþù‡dÝc×}Tï»3û+“G>º®OÚù±ÿý Í91ûüirøöó¥ç½ûõk7÷]ííîf_Â'Õó‘›w²“É¢'mÞiû¶ß>ùþÖãåùÎYÝßìklöñ&_ýÓûÝó?ïî;TÉÓîÐû"ßðÎÛÚ/¸ë]Ͻý¿Ò쇹ïöÎùuî1}|sÄ®{ù¹tòzÃÅ:äsø=ÎÉÇï8÷Ü;».qÖ{š÷v÷)çëüô)î>÷lù>¹°cüµcËNw‚áÙÌïx'÷¬¿$æï¤mêñä‰u¾Û÷±×ßÁNÙóÂGg>㬿ä9Mù?cÿ@¾ç”|mÂÏ›Þ+î¡kžE9íÿÓÎa'£·Ÿ¿{n³Ÿñ3·¯3ü›Sîsú`3ÿvó™uà>“߯ҜGî¼§ö„³Í¿%ë©÷åþñ~õUò¬fŸÕ…ïqÏ:w›LL½¯öŒíe½«ÞGûÍ¿µß¹ÐÿQ÷£“5óuÉûÙˆ{î}tßÿpû%oýåºùö?Ûy‹?ß«ÿö{w¥½ŸBo7*ñ߲ݟ›~ç•3¾GvT÷—7÷µ÷‘ßÿ3Éë¿éCzOÈG~ù}ä÷‘ßG~ù}ä÷‘ߟµ_ò•Ç×G¾ñ§ø:óôG÷¿%Ÿ÷®z>;]ñ}}Ok湿õÕÜÝ·ü\=ßôžºýþŽ·Ï·®«¼oǹ„‡øýÉ×ézÞàÝ_TŸúÅÓbÐØýäéOîz?-yá앞göï'Ï7ã±–?{û¾ü}›sÌ{‡ï”yÿ$}R=îû”¿Uï3xÇ·mÿȯßÞ:ÔÁ/¼Ž›üØWÝÕqFòsãçªñò«~Šï£}üÉóYÉlÇ=y;ö'o|ÑŸéû•’7ÝÕ÷lOûÉý}òž¡ÓÞɺ[?yOà¹ÝùŒzj¢ùþÚä‘ç°toïŸ)F|ÞùEbøË›ù¼{›óY÷î¸ÿÙˆ}£)ßç<ýŒóHݱoî•ï¹£û Íï=;øÝí;V‰¿ý¾ÒSíÝßìzÚݹ‡%ùªÿí|÷x|´Ø÷–Çü^„Û|únÿ6÷&Ïܱžûê[Ûû _þ¯W~âäušäù?ÃîQjíIÞ±O=¹±8ßùÜ{÷[7NîÙÓ=±žÞÙÏüàùá‘7ÖûF¾ìon¿êƒ;ú‹ß÷ Ï8ñ^'ÓÔo?ü«÷°õóçñž·÷¼ù¿™Ooõ›{“vÙ—÷°%½fßÁWu}údQo~ÛŸcù&Yþbý÷»x•›<Ьc½ú·ÏëbsÿI³$)ßÂëõ¿ùÌú^¿úûÝ3ßÜ¿»ë=æŽùOçÌösn{ò¼ïÓ><Öy“OyÂ~çOšý®ÉšwkÿÃí­svL'œ}¾ýÉß®ïkã‚dyñLýfy_ñ潃äÿ¹>࿬¹§§Y¾Vƒÿy{ë±ÉãÏ×oK^wÿùöé¾°Ùvá|û‡ÚõÒÞÏ;>_ô«.‹}½,î©~Ãcëþ`óžYrß~ëÊwzŸø¾¿äS>nû¹œoú¡?ùÅu½þ·ÿ߇mšûÞ?Fì_‡'Ž—N»ð¬¿ö]ÍWñ~êÁ5ûBN9¿”˜íë´ò~½ƒßã˜Ï{Á‰ã‡ƒ÷5ý÷§ž/¿&ïÖwdßj¢O~ŸâÜî¾ôîÞS~Úû—Éó÷<—öï©ëÃ/ydûy··ýc~ÏcïÎ>®ä±û…wßw6ï.&¼²~Ïä—šwM~c¿ýtÉå³½Óúû+¼|RÂݽÍû¢Nõ¿™ÏÜÜ—œÜ·_;–|ýº®'–Ûëÿƒ÷6çX^÷nᆱ—íG?éä~ÕæÌä£wÜߣoo¾Bž‡:ø÷¼`¿óZIrügz¿ãíþ’§Ÿï6:S8ÚzñjÓÏîž÷Ô¢~<í|ç°Þø>¯÷ö£ú>äGéÞÖß¿þÜü\óÏ΃ÿ"ÎI~P¬'Ýæ»›ûAÏkÿNÿþðѽ·1¹¸ã¼Ó'¼ºîo¿ê§¶ë?ýäõtùŽÈÁ?ç½/ÝóOÖos^jó.øm»·ã^¯äcooÜÿ™^ϾÝ_ò˜z|*ß—»mwŸÔœûÃ=ïcþ”ÿÁÊõæ¾³®K'¹CçäÇ·ùÞÉ{~þŽÞ+"Ïgµò3ž+Þ÷—ÌÎù>ã@œûéÛ ÇÁíõïn÷wð'çßäÓ¿ÿŽÌï$ÿ½Û×o~R=Oÿ…ïæ÷}­šuŒ¯ù¹³«Úó˜ƒ?jÞ1xÆ9§–¼j]¯·è»Ó_ÞõÎl«ÿòÏæíë÷¼‘ß‹&î×8í¾íä©¢ßõâ¾/ü·wõ|Ù®{‹þdG=q—Ç)ÿ¿Íz”H‡ôÿÜ~ÿÙKζî´ï/yPÜtÊ} É•íå!yÉöûÙήÞö÷ ÏíÞ§ý|}ß§yõ9wŸ<®y÷äeu{›<é”üÿu¿¾W|~A¬5÷¦%ŠÏCìš=5ÜÇ¿¹ß»Ñ¯{U?›{þ’×íûÊû“xÏûhNyŸ¾5÷üüC²Þ¹ë—¬¿°y¿VÜ3ùÖM=~¾qú®}¥{Ûÿ/ûµ_û®/µ÷4Ž~œ™ßµobswkÿeÍû3Ÿp{û¡“¯ü½ííÿsNÞ·²™MžÕÜ{ó÷lçyŸqÊþàuÝÿ8íµÖü[~žŸ³ïx¶æ¾p}òúÏ÷Èw½Ïû¾øyûÞ{»¿ä»¾dû;Ÿê©}?øÝfXSN’LjyÖÞoßÐiï@ìž?9ßx+ùAµõžºäïü·½Ö_vÎ+æÑY/IúͽDÙgÕßí¹¢þzV³oê¥o9›»ßüÏù|Ô7}g=¾ÑŽûFÿtÇû,ÿlǸå¿5ù-ù´Ó)¹ïœ÷ß©ösÏ|tÚ½­›~]ò’zâ:á|þ™ßL¾âOù=f_óõ9‰æ¾¹äèóOG7ëÿòÜP«ÿûM|Žþê¹Æ›÷¾Z>ãx0yÉ9ßuŒ›rðô³Íkwƹ×öç½ÿÑ9¼ãMVïRn~‰Ù>ß·«ê˜û÷¢¿ñÈ{øwø¤íóÄ{‡ïkÞRÿ}ž8ò™Ÿ|W÷ƒ&Ÿû g7ïû.ÈæþÑÍ>öÛ åÙÉž¬Í}|7¿'ãy··Ïu3üȯþ%ÿþ=½:_ô)Í8õ”÷“—ìwŸòýßÊËÅßú¡ê‚Õä+–u=ú7¾ü-•üžýê¹ä1"ˆw)åýýÉ»ßÉýÿDqN·Ù’|Ñã¶ß;ñæ÷×ç®þÒï|HÞ/H>ælïi$5〃³½3¶ùüŽxçã±ÍüþÇÿñ¹§a§¿§ÔO¿'¾ë_{Ó}ÛïÙë°¸ß9ûäyM<Ÿ¼_ý/ïåI^ûö“çúõ{gÉ_ùœýÎn}¡zò"ñÎïžóã;Ý}Ûóy…¦œŸv?y’l?œ<çä}R›÷X“¨ÞgÒî×}óožißiò=ßX§ÞõÖíó)ü÷ËIò®bû~É'Ÿö~æ—ÕåÿMmŸü’úœ’œ/ßìoK^q¶õ÷ƒ_õÙ3Nž¿’çì[ù{··ß¿ßŒÇ/mï"ù «³ÕCϾ3ý‡ä/ÿÚös¡;îuNâëÙ›õíäï­ËSïÃcßå®qæi¿äÆ;êþ™Xÿ9íÜÏÁûO^÷Ø÷üÞN÷ÿÅö|º™7Ø¥nÿľÑä%wvŸË®_’ÖïØìZ—>xÿíí[oï­î×ç’Onö=M¾ë•û­ëžrÛÞþ?Þ¬û¼ílëœâ~ùäê)÷×½m^Ï÷¾ƒ÷ v½›Ô±ñýæ:é^ò ÿjk:%ÞÿÁ÷g2O>ù÷Ïu¿Üg¹yç+ùœvóýwoÝ×¼¤Ñÿ¬ï½#ùxóÞ|ríξ[w»¿}ïÛI®ˆï/æÑ“°¾0¹¶§{ëo¨óÕÏÞf½žß7´çºêÝú%/Øo~|³ÚÚû+?°}þå-¯¨÷ï}ÍÓöë‡|ûo|Žâ5¯?×ùýÍ>9¿”˜;{ÎGî;ÚÛ^¶c¿Õë~ï¶ÆÉŸ;y½8¹(Ίq`ŸbÿqÛð¯×û¤'ú³ÏÝQO}âös|mxšùõ³ŽO彆›÷=åû³É#?²½þTþ¾mâýÃsÍ_'—÷[ßßÜ Ø9—ŸsQû~»öéW&µ¹ïû懪þðÛ~¨®ÿÔêñÞšþì_ûÙêÞÖä‡^r¶{%ϸ/J®wït÷µGÜÞŸŠ}~ßôÀ‰ã˜äiû•ÏäI;ι½l{º&O:ÍÅ&¼Íü§<™”/®ëÉüïÜ{qÌßlÞoÜQÏ|Ü)ó-Ÿ$ÏðÚæÕ=Ów]Ï{üÉ)þ6ï}|àÑÙOrðÍ÷¹ö–Í%ÏÙsÿÓOŸ­¿$ßUH¾,>¹~Üóˆ,'§ý’gœržñãno^6ù¢ï­Û‰·äU…|Öy Ö¨™º$Ú­ç6ç3ßô'ß¶ãÃäSv”ÿíhÇÃÝÙ÷}ûÓ~?u¶qhrôš;zÏ®ù”ä…ûÝW´ë·¹¯%ùÊßâý„—í÷^Kò¢ŸÙ~žûŸŸÜîìº×=yr3zaÇw_ÿ¿N®§þˆùƒƒlÂ]÷§’'îÈwêËëzôÉ'—¯Í{ö;õÿ¯³Õ—ÉÅ=÷±<Ä×!“ÇßÙyáä3ÿ÷½Ü“÷ë&ïza=o»Y‡ûÀ>Øœ#zYsµ¸×7ÉÞ]ŸÏú_··/>1çë'žõ×ÙWâÕó2É÷|à~>nÝÔWíºÜÓš~â_×õl+ù9ù(>Β㳤÷–úï•íé}ð§uøÚõ´ŸÝ^Ÿ¶çãúܾÿ×w”³ïüòº~ñ”··¯ùÒ»³Þ˜î¸¯ä3ëû³“áŸÔíØÇ‰qÓæÞõ—ìyþïóÞTïz)—oòKò”“ËkòñÍ=]Ç÷\¿4烒/×áöùÖAÞÊ|þ{›u¸ßýÍËç[¯Þì“J¾àßnÏw¢^ÙéΫžtò:Ã3w”“ïrÈó ÉÕ&œ×šïßû…:<éœéüÍûí;ÔèÛêþÑE1~å¯6òçb~®ùï;ã;¯ÿÿðqíæïô·‡WÌÏmòAòI¿»½¸gG9ÿÔï¯Óï‰M=¡›}ð=¹ÿ~ðŸÏvÎ0ùèýÎqvì5ï,mîÿjý볉:eœôñõý¿É jsÉ ›{Išõ?Ù8øUqŸ³\ç~bSÿïïÊû³6û¥’'Šö(ùóõ|Æ6ñ{yÝŽtÆëOàëeßûcÛß«º§YÝä¿]ç]ùO·5zZ¿ª5÷ýÈWî·ßôà_‹u„Sî?ìØ¿CçCw½?²«½í˜kömöß%Ïhú_Ïjòϳ¶÷cþ§¯mîe~{ïäý^ßò„º^ëÿËóÓ¯ˆvö«~älçŸØô_~ò>÷äùõ>Ëäi;ÎGÿ÷òæÞŠä†_×G·ê |›ï™\ªãµ9ï–¤o­Ëûo_¿kÝýåýÎSÞ1Ûì×KÆwf?Öíþ’§ž¼¿ YýËí÷|’Øÿr1Žþï;ÆÁoüÍûãíý)ÏÝÜÛ|¿Ãןí›'4õc3Ižµã†«›ü{¯ñ<ö1÷>æŠý{ß_xäs>ýMVñûÿƒðþÉg¾rü°ò^¡^©Ñ•Jä¯TRJAÜ®n^OJ”îH‚®ß~WtÜÞ„ç2äñ@+OÚ :ödº¼úõ¼i“.áÕ×<òù¼âµo´I&Œ_yã¾è”Ÿò÷{û^:nÔ—úZå‘^6Úø×Wù`£q¡¯æò’U‚klž#¸Ø7ã~¾nµÌx±nýé÷R÷W¤ÎV­u«.Èåþ ŸµAp+Žš£A›ŠþpnŽû)y=£dèÏ 2´èC¸Kê¨Wd¡\)ŠD¹BWƒI›öŠÜ^A:¬G ž‘õŒ}¯¢–f}J{½6EyÓTŒ43è¨BÐÁGB„!H1ðiøš<4ˆÞ¦èmŠÞ¦èmŠÞ¦èm†ÞfÌÛÌãzЦD†i”1 l¶ ì• X1²‚>B´y¿AæF'Ãè ÐÅÚ`°¬!Ú1@FèÀÑØãçC¨'H[ =F½«5ABÕúTô+J™¦fš¦¿©¼ÖÏŽ=n„Û÷™fÐç˜b‚F0>B€°I[’§Pª§ ÔšB7ÕiA:9ØÈ!sæÓ¹ÇˆëmÜ»ÐO—ä@Au}Z’¸ì“ÝÒV«¤³†°NP²dý¾‡€:Y¾AÖÇìàD1BŽ0GX¡s+æÕMŠRÖ_€¥}-0à…X£±5K!CX0>B€Rh2jR¬:o?O6 åŒÁïaé!0MV&CÒ˜.(7eù1iÌWÔÌe‹˜ÔK°°/–kÊ}8)F­17 B€"D–G:}„žÁç/ B…µjJ‘£¡Ô›FÙ~¡’Ì—Px³2›F«tÌ Â¾1€ˆ¬ fé"³š£¯sÕg”¢At|ŽŽÏÑñh…á^k¬Ö}HÐ5Ó5ÕoÎX†vÆT™;( êAn[çX«¬ó Ï}ËC¦Bì×y„9n½ÀP-0¼ Œð€Û% Séõ¡¿Xˆ×¥FszcîrMmÞݰÏLgè Dh ‹´%Åbw³ƒ7)5eH˜Ã,mL^­‰5ùVm5ßN žc•}ܦÂ;håƒ>ô,P†ôsЀÒà Çˆë)F>£QÄ(Fï˜#jãÝåš æ¡ò˜®'t¹Kš €Š‘4‹¢f®hæŠî#ùF#@"„c0fT„-¯W,‚{‚•`-Øö‚CÁ‘à˜Oxß~­F[s4}ŽÇcÄqŽû´…D„%I—K}‘T¹H*hØô ,)›FÍå€2õmÌ]­‰ rØ]`wÉõKTE ²™‡ 4‚A€hPuq±ÈLŽ0’Ù1:ŒÎ£óÇÌù!Dˆ eÇ”¶W,©R P é> ¾Û`LÃ`âõ˜NFV&Ô>¨PC5 ! STÉÔ´XÞ Oî>ù¥JR „šyFÊ9¹?‡H/ ‚Y`¥¾¤0,Ë>xa©m\L™Yø°ÅxFÂÏ®E9!w,äG…Fçä‡ NŸQÊh€¤˜IÅL*(%Œ±%Œ±,@ý\¦3œÃ7\å ¦’UCWr°.)ù‡)–a ßb¸ %ZF˜Ë°Œá¹@ú죑j”kPSÝ:ëf¸RðF4ͧ4|QÜFëbÒÊÇTœÆ}h^x¨¥4‚Að„!B ÞÁ8…2Æž°`¨€‡4`æÆ86n“ܦ•Ë1u‹Æs˜ Ï©Ž‹>ô)FšÑ&˜Wkº6v}F£hõ丠ÉÓ1LÒŽa¼;. ¦o?^Í æ›^²Êsüx]2€(®Ë> íÆG4'kÕ4Wår|…äÈ$[CžŸdÇ sœ{Œè«MXšR'‹þŒìX â0¡ùIIYc²‚±˜JÄÉj jJ¸iÖö¬ïíOQ ³ˆVÌQg®èKMÇ©)Ú˜{9h€íy¦ jšBp ELË!¨iâç:v{®¦ýÖ%È$˜3ê¶´]«ôI’’Jø ë=F\O1ÒŒ¨ töÑ…  ‚ „úå¨E³B3^ͦ0‡=›–4ÅÔ å°Ù‚ZA«†Éá™3JÁG=Ž>šÍ˜ÍL1ÒŒ :“åÌ"Î Ûbr¹&ü¬–!ÕËòî ª<«†ÙR†Ö³õ”ª˜¼?h5rì±ä4"¸ÐÏ©#˜gýyÎÜv ƒ6QkŽ åX¢â¨¦Üp›x÷7í>ˆ¸“P§YdzšFóÀhî»N™®áv}ŽÇ£H“ªÇ|°ì#¤ÔåΡ±µj*ãRÔbæ‚F09:}§|Œj jÔ¨#PoʲÍ?Ô€ä³tâ1RŒ4#ÃÈg0 A0rêùæs˜ r@ݼ|ykAÑ\X……b†}fØç†}¨ù-3³~Ÿù:„T-¦d«€Ñª…€VrPƒÃN)ç°ŒlÕíÚËåŠJÏ áóÈ5ã>Ôq9¤¥ÿ9Í[ßÛŸ§ PShç)º¬T’óÁD%Ä|˜!“ £Ÿúó ™™@Ok>ÅEîùt¼ä¤Q-5Ÿ³’¬FZR™C ad¾\“{Ë54 Ž N´z˜¥÷†sêHÏ×Ôû˜ÃPÞBŠ(4ÖfzëØ-þ-HŽ[Ø2-ú̹UÔã(t5GŸ#ͧU(äÉ8›{ŒP¯ì3@ ;êqºÔsª°WÞp*8<àÎCn:®Gׯ4<(¸¸`1S̸êµÕÐý­ m˜H¤ i­ãŽ–7‚vн•DIÚ:öJqÔ Ç€!€i›F ì‡#Ž1KHÝë æ)o9g±±‚‚_󌣅®æî‹|£ðßHýŒ;çs ¸év¡ðê†ÛÔ"‰ O.34¼n×ðOexà Ïó†fGr³>÷Ççþøü ûÜ[ßgo|}bM¶e¹Vôˈl䎄Œ0ä+V® ´„ÚÊ0­´S¬´nÁÌÊ"§Æ~±„qÙVWNj륵µêÔÐ,#PC$ ݶàWk‚i°ËµÛQË)£ŒÑ€mëXC¨ÆÖG°<ëˆ:*‹#èW9è1âz­A>:‚áoƒBW£;ªDw˜£ÁGB„½Šr#‹*ÍW,û´!Óªá#X½LZƒš2î3YµÕý}öãõK¤:€‘Fá(€9êÌQg…:+¦C Y(²Zc*EôG¡Ó:eèêÌ 1æÔ¤ÔÊ8`+/…" óù>ùÌØ-€>LNiŸB€„LñûY€YE‹h«]‹¹`;´m6Á^p‘  ŸTQi»Ò(¨BF³^âê_A«ÖþÔ5ÕÅtÝàþš®eË’F$E>5N¬òtŽ™8‡ÉÆbÞ‡äYÂ,Šƒ”é)ƒao§Wœ )n¨ú‘¶ýÈ«~e*LHÎOx€0)¤Ø’…ÓóÑ»‰‡@MY -i™CÃhªÜÜÃæ4W„2c¡m«.7˜£Y!@7CæC˜B7á½êÔ×V‹#X˵Ø<_B?¥ÌÛĪ Cøh “-÷3p>|àv…†£Ï1G#ô.ÂxR“_ÎaÚA‘Bƒ 4‚Að„!BˆÑ×#¢#ÅH32Œ6>?XÓµqQöW·ZAþlO†ÞçÔ úÀ¹"Âg >iÉU`rЙvpm½Îs¦ï££>x_Pƒ]‘‚^H NàF½’6êY;å¿·%®×žA®‰mwÃ:d«>¨!«ÁÉr5õÔÐ\M@=õuPÏH s%t À©¡ã¸†p®i掼ØDºÙž:¶=VZ\é9å‹Uj7 ”tRЂÙkÐ2Tº ½‚¯¶J¡Ž\áéS A#!@"€5Ì€ÚuêÔè&åX«†!Ã*Ë(ˆU–£±å̘A€È`vÂ|¨1l§[a.r5i'D®TÀ¦†VEmÍjŠÑ˜b4¦)Ô’ Ûy‘ }ػœ7_Cp,ðà,`|µ ´V #ãUÉP & 15­é­ \CwÙ£˜ƒz¦¨X]²´Ê`¾we‡@ŒÂöy¯Öºx¦iµ†ýZ«CšZa9†9¸5žÂY÷¡›ä E‚.‰#®—¡#>ùuÖ§=SÜn¹†-Æk¯a ¼†1ðzDEÚªSРY«ns×¥š(mÖc¨cÖ¸çg{~ÖcèxY`^»B´›,@ Æè AS°‚b!C€}ˆù8C1ºƒ[Èkë)u°Ö(‡9Z~¿Ð_Óvíõ|JmæÆõr Dˆ ?³¶cü>£”ÑÉc&=f²­a6é’#ܬV¡â¨9Ž>: [ô*Z®˜®b¤¤”%AÊì¥Ì^ŠöTßc¤¡=Å|PÌ•r“̇ŒÙƒÚ{]`.- &¿Sö–˜VÆ´CHiX`ý†Ãsb&±$þaŠp-]ß8ñ@M׊5^Ô`e9Ç2]øKÌ~Û^¹(8¡U£ÐV¨}³Çr—c©YÓrÊqS®4Øv¥ëáü@8?úCL£ŠÙD‚“µE²¶BùzÃÜ Úý»aÅpm"ÚçÛqí±0Þæ“ÇoøÚ`p¤ÛJqcLsW1 …˜çCÌØ+‹+‹+}QÊõ4#ü¦Q g7×VåEŒžÓ‚ÙÕšØÈÄIÐKºêàjMÂôŽ™¬KÒ(ûS(¯%ìv^— 0¶ÀF ë#Ø+å Ç(Gƒ µÓÒ¨¥™M9À†Ø¡âšµ£¶*¿Ð?¤p¸€XBoý°œQÞw0…Âî¸X1Ã)5ê‡ktßRËzsJ]ß›9í¾Iäf1¥ä½YàQuG)„®üÃØ{ PM T„#ú·Æ0ãÖnMQM¸…÷ZÜj—.¤í…V—S=îç š>l¸ýž·Ú ]ÃÑçpl+{‡´±"ÅH-˜É3¹& #ŸQÀ(d1Š!Ø ê¸]NH0ÃlÃZ0¥‘á jx‚V¨9 »>Ç€c;NcYu›+Ò~¿Ý_~¯…v—oÚOéä¿5FW#]®àZ{UY¥ f´ÖÎN\HûòˆÖ­¬ZZƒÚ€Úuê!ù5ÆPŒÛ}éÊý þ-A"õ§¨† Ò-DV }‰š oÔ¬˜iˆÞ <ž§S‚Ý”baä!@ aK­…‚ÔØ }¨Ö8µ[¸V¡­#С«ç.UP€·íÝl÷¥0p¬ Ĥý#’ߢ9)€B²¥)Í^¤é"—҈ƚZÝ“PS¨6 öA‚ºmÒ´]^Oé‘S·MršÁú_Eš•õKÁ¬Ðmr€vVhgvÖ`'£aw𠦋v?Çý âz)]ƒdC?LúŒècYšÀm2¼>#ú”«¦~œ#êCÔÔã(tGÍÑpô™?««éZÑO‹$ÍÓXu± þt-NL'û1hÄ9„v^¥Ù| þÓvK«.Éʲ„Âk‰n)K¡¾ÈÊB!@ŽYy€ãâ<˜ š>Ò`7ZTDa,Fm*[55V Êè°¿ }Óá¸ßNhX­´I4‚Að„`‚BÐT ÑÊš:ÉÚ¾¯5Um=sjpéˆ*“m}LGp‰§ Õ8o·‰]HÇ‹6a'ù¤Ù×aŒ”ÆhtH[ÝkÔ i™·FŠÈ„¦xšÂ5ÅÖq uÔ°Ó=é´]I¡»™ÂW«¦/0-3…Àt|„!DˆÈå››jùªS_–tÏäÕt¦|;ï½¢KóŒÎª§9Ä¢=îg•TÓçíQ,«^ÌÚÔÌ—mB} Ák%],ÒQ5Gñ]Clðš+ÑJWcˆ%¿Yö¨FÊiÇ÷…tÞ.w¥sèßÀ‘q§î!ø`J†š†µ5Z@‚C´<ì Rõ7ÇaVEhn9HᄤSœ#ÃÈgPšQ»¿ ¬šRcÝ’Ìm; î¢ƒµÚcw)”M—Ðe³êœ•º%åÀ%»¬%]æ}k)jµGn*`eNÕÞ:}Kº3-†+H’bL…¥˜PäÚc¡ÖÂtí¾#ň …#S fÊ,¦Ì"MîTdQ1±”ÐÀ͆—®N ºüÈ©SúN´Ñ©Û髆–¤Ìú í£OKxÐ+§F3Ô4ZµêME ŽA½n¿G{ßÃ%«d9§öÁójr•p«µŽå œB[YÂh§Ä2ê€òY¹¤±BY@ÉÄ:Âå ]^Í nõJÓF0]3ãä*®ï¦+Ú«p!m7 X%5Ô«œâ¿×â€l0^å1™‚ìG}ë.¥Áû‰ëj=F\/`2ŠÅèBÐBˆ!Ðxi‘’Fþ40¼èÔt¶ÔmN¶ǨV Ö 6äµGëœj¨õ.Ͱ¤Q£ìH ©™Q 5•#Hœd L'B â¸.©"¡Z÷9u äÔ!Ýæì@SâÜlìÔ¬?^QŸÿl”¾Z3{ëaT·Ó™×{Ã_K›17ìKA(‘pº-F )ž(a@É€«Ž‰H b!Ð2 tŒ±ˆÄ¢¡5·{|Üð5Üѳ1%lÑÖ݆CÎí9Å ÁÂ=_ØD¨©/’6ôœ#á^$ìÇ">±p/ácJdÏ¥:i{˜#7pVB_ ûÊpÖ¼æµ4ï þážî%X¸g"Á1g_ØÇìà‰ìà‰Ï_±p?öž@Ø„ýPÄ7ñ …û¡_(ü‹„{‘ˆo$Ü‹„{‘tO|ŸHħͮMvÉ‹èÄ"8±N,‚‹àÄ%²³c¥ ó*欕`_°°¯¡t96\Ûˆàá¼Á3Ò¾ðÞï„¶/¼ó=ÁÂ{_xï ï}[Ìü‹Ô „ÿð?á „ûX*î‡ÂýP¸Šø„">¡ð?þ‡?í¾®ìSò¨K¯4Øë”øBàER ¤@šÐÒÓH+¾ÒJûm®¶‚T‘Ž„2¨a(2ºQO d@ÚªItÈÃF”ðŠ#Î:,õcÎF¸‡EÐq`8‡Â>V¸FÔh¾¯/j¤ŠCÁ1g¬¡|?ã÷à†¯á9é)á*VT¾hf}‘*¾¨¨|ÑÌú¢¦ñEM㋚¦b_°H_ÄÒáDøþ@„›éà ЫÞ0d:ÇÂ8fŠŠÁ·.Œcê"u‘:H@¤FÅ‘à˜sû&8Â:V«¨V+Á EpCÜP'Á‰„‘p?©‰ðFÂýH¸ ÷cŸXø‹øÄ"¹c¨ÖªïI'J ´)𥠔‚H b!ðdÀ<ˆj(jGÇ8ª8æŒ=ŠŠ=ÁZ°pßîµåòñ¾V䫬Î"ØXéVì ‹h"¡ˆV(ü …mÇá†Ù‘ÖF&ü ER„" ‘C$‰8FÂ~,â ÿcá?£7° C%ÙpÆv¨bÃÙ}_èû½@øûæÁ‡ØÅoàÿŠ•`a£[±ì (TóàdØ]¬X¸¡EŒ³a6Â=#Âh„ûX˜cÑ(Ç¢Ù‰EáÅ'ŠE³‹f'ÆÂ}©æ€k"zÔ9‡Â|(’7Á …{¡^$Ü‹ÚéçÌPÈqëØ•i5&ónôAÝ.b8uhÐé A# Ä5íPjPqÜØ|\ƒ×ðNÍÆŒpÐçp 9FáÛT¸‰ø†ìoÓ³¤¤(s²ZæÜØŠ´X;ºaO°/8sö„{žp+…7àÄ膅žðO ûØ—Õ6 áÕ"|F„ßH}á~Û:?®aïÚ‚îöߊ‹@"R0Š@…Â|(!‰ŠDˆ„{‘p/!‘ޤ{">±p/á‰yü”È„ª¥H4 ã"O)O æÁWJØWR?,‚+òÒš7d¨=Ž>CÃíÒ…~5r»¾â(ìòTó†w*àvn7à "†!7qÃ÷7â©q§bîTÌjóÉ=uæ•\ri‘hiÂH7Œ_šð¥AO 6Ñ\+ÀåÚFj!ˆ¥×±/P6­JEõ<)PR …Fp Xxi„}¨˜jŽÇœ¡¢©8þcœëæ (›µ€rPÅŠkCÿ°æ3 ¾”X{P¬PmXxï ûð?yð„÷‘p†ÑŠÍÝ?°ákô2§5SÍ¿kÁ>g%ôñ›W,Í‚#Á1g-£”š…ZØ7¼á5"|m‹|_¦h/ßÅ rÔÒ¨E·±T”2ÊQGU‰ öX¬k§*/}Á)3®b†´±1c)Ñ æh8†#ŽÜ#Ÿ{Í [“h{äóûÜ߀;ð(<ñîTÀÃð0‡<Ì!÷(ä…< !BÈý ¹¿÷(âEÜ£ˆ{q§ÚòzmÍ4퟿7Ót&!ÓUÄÑçrŒ8Æ é ÃGÍ‘û«ŽÜ_Í]ÖÜeÍ]Ö< 𻬅ËOOŸ/Ÿ'/[^jûës}î¯Ï= xbÜå€G0àµ÷žvcýŬZ>jUD©ÁgO°ö¡U¯U }èôÔ,üƒi…šC\Ÿk¹@x“ó5 û¡^ÌõUÏÌÝWžÐWJ°0¯„û*±èBÑ x¶+ylå®AnØç†ªpÕ­Ö„j­aÕØNÖß“‘µóRƒš¡ès 8Æ aª äiÈ+‰jˆ6ܰáþî‘Ï£às»má}°Ákùa‡ák)OŸ{pÖ€;pïô€'YÀ= ¹Ë!w¹í^È"jOÛ£VÙÞÜ™U 2Š¡âŸ'âŸ'⟧Âv§r…\Z=¶PÓàÆð ^[gÜ3¨È#^b"^bØ:OƒB7fp ¹¿!GÈ]Žx<"¡» ä= ùbV_ªÙãÚ0G\s 8ä µQÍÂ;-܇E¢š…y‘VìKþù":"¸0ï ²®Y7Þ‡Â=øFlYíb…šiB÷›-‡5èqäv ·ës»>7ìsÃPļQgËT Æ CnzÔÕw &'cž%c¬òë´áþÄ<öí\Ô: soFj85ʨ5¨ 9£HIU{G5ÜÞoêÔ4GaÕth6ëCÀBRF¤lFd}8SŸõSMñwÁÞ–òáJ g˜›Ó1>B°BŽK F6¢“"–èZŠlA/r7˜rÜÌãÜß ¾YI"#ESº©¢ 89Ž8޹sc¼ò¨M8N9ÒCEw.5¬oÂúÀ†Ùªx-3†‹Ôc¤iFÌÞ˜Ù3{cfoÌíùŒF!£hݪvt˜£ïÇí¯ÍÝí %«œ{4Ýí6Uºòé }vúb`i<„>™“Fžz`%Ïú)}™<[fKO0³ ÁBZX*òÉœ“bÑÌ1yò9ú5‡˜ÏsN†‘Ï(G:y %T€ù!¨ÉÐ|±°0`4F¢·*J1{ŠúwްNs¨Ð{ƒy`f ‰™;º )nóü‚lT!Áçë¾ÇB ÷+9@5$þâˆÔÈé) «“eº7âb=F\O1ÒŒ :©4‚ „BŒ­XV–EÉ®_¤¶¸'±`+hûŠ[ø,)F•[÷àmÄš iÅícæNMÛ·Ò¶o¥ÔªT 4¥k ,)¤„UãAQËÔO©,¤C-kA!h! wÀº[Ū©º´êu ôtëŠU£«!¨#RƒoÇäC¦à‹ŠR$Åôèn€ ïwʲtˆ3PРeƒ ÷‘UØú¶á”× GŸcÀ1äqŸbˆõA®©ÇQèò8y<¤Çéñ@Bï;¬x(…†¹·Š{«¸·Š§ ,ã8ÜÄçjMl¤RIx¸4ˆæÑ< šDó€À ‡Cî’áÞ(˜©Ðô§‚7Ë•†9wÔð€¶Si÷7ØI$ÃÓ”§‚Ï£âs«>OPŸç/Ÿ§Š/\æá„I½ c†°¸ÂöMˆÛÛãÜ瀧PÀ}¸Ïíd̓ ^[-'9ÝÅUI¹ !O¤'RÈ)ÔÌ%žØ§PÌOÅìÁ¤˜#Ÿ j'ބВž÷¨,ê#®Ç<Ô#V7ð¢¡Y” óÁxŒX:Ū=Ãc˜‡†yè3/|æ…Ï\ñY”|æ¦ÏÝŒ1ÍXÜæ]À¼ Ø ˜ç<‹†Å6`ß3à²p,œ '3²pò,Ò}t²bš>ÇMHïo¯R®D,ð! nȂ˴"܈y±dX²F,Y#¿Ï1å˜1«,™#Vˆ"^ˆ¢ˆ;q‡X´XE÷úÙgY4c͘E3fY7f!YŠÇê†[­I̬«ºe3²1£Kó,´Ï†Z Ø‘¢K!+Ð49éàšû×G}Bˆ!Ä èÂåm7¤ “bÆ0€Ê `h†FahT€ï’k˜äs¤Á|±Ü0s†žœÈè™§A ~ÂÄWF/½T€:)taîy`4™2“ÐE´2@+¨$ƒ”¹=d‘koªtc45FSPOÁÐ ]ë9h@ö]`.]`2/– ±FSk4µ™Þ»èÔøÑ êy[KÅŠ>JX]ÉJp&³Ò€>€²B Y¡„â]bléé:ÚraÚ;ಌŠÙŠ®]Ì2Œ9 ~³5„o %dô *[0óá]ƒ˜¬¡Î_Gø}nATàrâl@³ ¨*ÀÊ€:ª‚e\93hPÏ@å2 3(¢ø‹aèƒ:uê¨7K12(]:Pr©˜>©1G³!F¡‹* H)e [&+!„ Ä›ê£!zF›Õ.Z á¶%Ý£'p*ÊÑr•£<å8à8âHsÄ!=´‚/¨5¨ ¨!*:5$Œ†¯©‡î!­Aû8·ýÎàt‡­&ßMA0 ÃР逪¯@ 1óÑ ÄÀ‡,ãS5ÓAƒœ ÀjÛß´Æ!`!¤m¡Á|ÒÓ ¬`ÙŠ)â$Üõq)Ô¬z mßrAè2^«Q¢’¤„£cz÷bP7:Êgü¤£»kƒ–¥+ÈdíݼV Küƒ›mXnÀrÓ•Çðõ±Ós% 'q ip Û‡ýŒ^Ô¹Ü` 8s† õ5oÜ»Òp;EÝø§9Ž>Ç€cÈ‘ª!§R«ZÁaˆ0F¸E€c×aùi˜A•9¤Qê• Øp`HãÖ hGß>Ç0‡ `-o£W¤™ž†(æ#A!hƒà#P4Ì ðgUzŒ#p.ìφ8_2\à§YÀI'°ÿÉbƬ F„)Âu„BŽ0GX , „k„›¥›ÐÐT¨ÐèÃÝ‚VG+‚– kë(BÒ>’ÏìÌMØ‚\~$x1½tFù轊‘t«ç1è"Œ¡mÏÓG€¢k!G[F€B]„èS¨´aâD~ŽZ1@ŒÁ‹C¨q¦xXÂ#K– w•3ð¦ÄJ „ÍIC¸%ÞAð 4Bó9ÄÇ#*R`ÕàÍÊ@é[Á:€Ìð€¯…@c) íÖ§õF}!Qƒ3‚rlÕ4æQU<À qDz„ÝÕvWGØ]awuDÝUëÖ”Â3•V èFÐmåíäþ• Ø=;#Ší¨}ó¾lÜk /dã>))Æ©jjÔ!¨©Ç¸1|L5Ôxq—ÃR íÀDѸ٤_ÄfҀƀúr“þz‰ŽR 9¤å„žèË&lgwE=¦©iF†‘Ï(`2¢^óÚ«ÎA¢L/X€§÷‚—÷‚‡÷‚w÷ ÏbPCbaŒdú[ 9˜ KÊ\“-*MÚ åÔîS\Xq±šR9ŸLñsOa£ßdŠ)4…šn2?Û7J¯:õµÌV‰”¯éɾ Ù„*ÄÉ2Í}F)’bz°ci2‡ý³ 3h˜#0+4™ÃÀɶNèaBØÖ< n²lóý• ØÖɲ¤i,ks>TÀè¡X5¸^À¨cRöÑ­v³žÓà·µD£‘I9²}_ø¾%ìÿ¶ 4‚A€UÒrÙ¥šzLS1ÒŒ #îhÀ(d#¥#æ_ÊüK1‹Âúò“¦¸…#®§iF†‘(`˜!DˆèflL1Y3€à®G0+b a ÕÌáŒì–mf¼¿¦k£ÅšŠã´¿¤\2íð~Z6MQ­@­AMÛ2§T\§ƒa!E ùÔŸN×TAMsÐÈ¡NéÕÑl ‰iÙ4¹R›—˜–B´‚:Ò‚B€È­&9j§ë!Œi)FÔÞLamoÖ‡u 9jêę́Nžµë=WúZ6_Ï©–žÍÉíùjfG”ú3xh/›­ ÊŸÁžòœmçÎa—vEm“v!ƒÀ9<:å¬dôÄM¥e2´4BX0P]ƒã „³˜õQåXÂpÐk½"–©œ„“bdùŒF!£ˆQŒcÀÒ×ÓŒXP`ï‡%`˜±!DˆbôhÀR§-&—²|˜y°?È¡ÇQ L®p 9F¹S톦cÈ9¥HŠé)®7`”#ifO3{†éÁåVŽ˜›fÈhĈV˜*ÂÂlyŽä3F!#ž2mOæÞ,‡ÁK>Á=å 4‚Að œLq÷JŽ{|rxýкMOCfù  V]€†5,o_¯¿TÁrEææ Pƒ[0á/|P Ž@MMw¾XA‹•/Û½jÖtPó"5x '#­:žŽ ª(¨¹TSŽQèñÞ+°n‹(ø«‚‡æ«5Ö¯«5Vh«5&ôò5Äq …bÁ@¥=¬h5qÞ#?„¹¨ü抄úλ̡1›÷'hÐgŸ£èôÏaô=o—S.fóY–y1c@!–½¦£ ‚ „T]Ïû4¿ð'Á+ȽE ÁôÜb¶€—–P¥¾,Ò,FT-,Æž‚F€ŒS´ÎÅ”†âV­4µz‹Ns;RŒÀqè/à@âòôbÈ‚B`Æ :K²8è¡–BÐÌ…]rÔ h»Ì‚²ß¢( Û»(Ž(@è?/¦ ¼Áiuà¨Üb^®aŽf±F;5â ‡Œƒs– œ³\¬ñƒ¬ÛžË• Ør+ðhÉÉ®W¨8Òî‹S®m8¢?%5û–T‡-áRŠe_ƒš¬/û«cÒHÉ©%¹sT¢cí']ÂFÍ%ì9]ŽÁñµêÔ!¨©­ZNélÎ2·½9Ñ“¨×Õ GŸcÀ1äµxƒì"‰VÄ‚à EAhTñh*MÅã¥x¼—âñR<"*b¡PŒ4##hÞ«5±‹“P†®(-˜®aä3 €|æ«Ã=G(`&f2`¡ úäkæ¦}Fžù BWø×Ž…ž†à)=ŽPªòäÌ|3äõ˜¦b´ññþš®Á#éµÃÈg0 EŒh&{ =Ôå| ¦ÖÐæ/aMwY@Slâ K¸ËbŒ¦Æ `Å@#"W¬`0â(EƒÀ- Ã-Hêl½u2œ_Þ€úñÔ7 ~¼õã ¨oÐ`}YÂ¥(Ër CIG)£ I1“0wn)@Øx|× ØÚaÃRR+¼\Cxyï9`y+``|„!Dˆ EŽ`Âbyd0›[‚rä÷ ­ŽXmrÄj“£ ez)º@±ÊÂTñŽr°¢ç!s2Ì" q;§pOFE­€†º Ï­ZƒÚ€Ú5•û™a‰ª€IZ*˜—š-r¶[d¬’Šl1„‚mA!h]º"?b 4Í´¢T@go!)ð`M±2`|„!Dˆh_w»1Ć¥}Þ¦7DغA†àî&«¾6…é‰b5b ¨ut£–A-ôˆÏ¦ œìµ@g1 8òRܤîdq„;¡Š£9Eñ¾Õ*a@Ç3.d0(áž±š(þe@çJ·ÌLƒè²]g¶jÈØ%´8% Ë”æ]JXI(3ø%æñ’²õ¥ ÚŠ±AÅQ6èµÄ e &X,•#¤[#pdŒA£-¼7ʤÀpN‰N#ár£ô÷X”¸Ç¢œÂ'.q­ÄY´r ë´ú3ÔZƒ®8RŒ¨çˆ"µaÊa%Mpáf›·¾•¸õ­Ä­oeX‰[ÕÊÅ€æJËÅ f.Ë4ËeF3Á` X!d»åšB ß}UD@kÜ‘aiŽ_jÍŒÁ$©MþÐ5Q%\"R¸½<î÷¨å*Shñ)F)e&¡I©¨àºi ŸãxŒa§Âa°Àv<‡ ÍÙ-1åñ-ЭÖÖ=íIÀ{³UŸ¼\õ¡ZPôÁWpäŪ!s­ðÁVhµVC¨Ø°5°ê4èKXuÙg”‚9 èW³Õ¸Ÿ/úTß‘„*ŒÕÄ5„÷y¬¨€¯æÐ¯æ°<ºšÃ†žÕƒÐ|k}[Á\ÚjAõêj1£Qôåi³FÍëœ`ÀhÈÜj?hƒ_ïoíü¨D,,ЇÅbÁµú óUÑN¦\® ðŽQÓÀè” AŠ|öó] Õ“¨û-BÖ…–vF8 øk´`@íƒ:uêÔ1xCþ‡Ùül?X­±`¬±0XX£$Ä:ÇhP[´68+áH1ÒŒ #ŸQ„3õ8 ]ŬrÒŒ #Ÿ@È(b#AŸi Wr¬m5×gDŸ`Ý3ƒp|¬¢^ÁÙì̶aDË Ž‚‚aÈmRÖYSïñJl„ºNa7È:¥Š} K0ëŒzYVMS•ëÁbåh=€Ò·¬)FèŠ%œSY7>_ÈÖ²?)1xS^Ž9a±À,¼À}Zލ®r”3£p ‚£)Ll;憜 . jwצ{×p]B{}õu™šªƒõªêÔ`~5õÔ#PA=55fëtñ@ÅYa„F‚— †,·zÔ·H½^'ëåØ+ . 1!_BŽ`éÃÓ¡ ¦4Ít8¤}Œ5Ñ·8„Jó0G9Õ¬‡9l%·‚)Ô!¨i^ñ*ùÃ5}ÉC8ót3‡· ›ñp³Kgp°òáL1:fððÈ‹áãVö&p“Ò‘Î ÿ[‚áÑQP¶Ž8€R!%ÐsÅB×SŒ4#Ã(`¢w ÄGbŒ' Ñ/UP0=tvÞe%úT¢O%õržú.ŽÐ«#Øîa¾£7à[0Go`ï ñGŽøûGüÁŽ CŽC¸/Q!w ž¢>ª®Þï N™qý‚‡ kLû^_0wÍçañy´|î\&wÄó8âw÷ñ×;ŽøUþr—êh§>¼?^Ñ@2å[Ë}„ÝfÈ‘B*™^Éõ4#ÈêV;¶m#aÕt®Ó€”°òqœ¡zEØž;œÄ:M¡·àˆ*UðãTÌqž1+9µwÇp!õqÁS¦bÈ ãj—EA ©uöjMl¤t\ÀÚçe‡*Æp°ÕN‹À”cÆÇA…ÜpÈ ÷¡ju0 ‘Ò#†s(ƒ7ú*ŒÑ.\Úæˆé ˜»ƒóE¡†ŒFÌÏq›†•æuü ªdWŒ=ŒŽjþÍuß fßh¦é3Ú$׃5]«þ°d2üK9Tþœy™Ù‘bšðpU…¦`†5ÓÕ0L©Øç¦ñã™›ÌÛ#L,s‹…ð–Â,îóârJ‘"è—mmi‹6–©U¾.BÐV¸ ìx=a 4‚h7Ÿ9€5ÀããÖß+å­T/ŠÚIÒšŒÛÃN—f¥t»Ûô¾AŸÎ“WÐÖ`ƒ>>­ºˆSS8ýlâ!(€5꬙Žnƒë'ýý¨ÇàÄ8ï#lªä ƒv2Û./éžèAÑ>äà ]l·V–äDzm°—ÙtÒ€¶Y§`¯Ÿ…€Ær4V@¼h$5€»àp¼Õ8:"õ-°| ÌÜÒ 6”·¨˜×„vÚuRã8Hé´¹SSú¦RN[GÓiÞ–ÊK5‘)í µêÁ€šËÉmJlºFÜŠ×$>‚ÐQ–Ìú#êºWä1j«žšÚ¯²aî’fºšN*öŒÚþ³£¶š®€65*4ê#Ìň¸‹s±}…À†+…¥§ŠÚ5šA»Db•²—@9€ÔÐÆøJ >YyàÉŒä9”ܳ=€}Ú6:y9¤ó5¦!à r„Î0VÐŽwñ"«¦ò†ó©˜C½ä€Þ±¾P&ÌÖT´ŸñJ8µå A#òÔš* ¤ÃuÌT5GѪ¿Œj–ì¨]¾ h[¯UOP a¤ô¡™‡s½Àò,Ó&«¦}²¨*s@•Ä`AÊ%YX®èÁÕ2ºZÆ:TŽgT­ Àš*DºÑå>§î!Чv€ýéJÕJ=®­8úc ç‘×öS*C„ÍÑ!ŽŠR0¨0è #¥4‚AðÁ90ç0t;¢í%ÍB¤YˆôÂ1$9†Á`PBÀpÓÛó0píøÜ¹ìƒ†)â£7>zã£7>Íg®a|L€¦èÆí ÚEñÁ°Oë&Æ Ú«0­Ìø àb›{ÃUCClR‡t5ŒUSÀ†#êéWÐö±/V˜¢I`|„€æ«+èµ£6œr6Bß}_èûB?úÐ…~(ôÛƒcWj¦;¯¶‚,…'+jT5GÃÑçpŒ8Æ •Ç‘û«¸¿Šû«¸¿ŠûK“j5ò`( Í£¯y¨4•æ¡Ò+85Ø=»G†vhvÙ©Y 4‡=¡ƒyºF/çð çô çch糩axNw]æ%úPÂL¹JQ ´DQ‘BJ™^´«5±¦±’¤Ì8ø ÛŸó‡!^GÐû³@é Ûš¬š³5q=ªéý œ@gÌ×SŒ £TÌ3!@`D1ôd-`€®ÓRjM…Ït¹YÍ£rÖ×j¨8jŽÜ%ægÊüL¹IÖ4`2Ú$ÍÕšð,j%‰‘2x8{Y£ÐU5GÃÑçp 9Fy¹·ŠJ ]Švdý¸¯c˶5¹¿AV +QÄÂÃã­{L“}¶Œ'=V㘙e5c5ãˆñgì2³ìP¬Ã“O1+À«5å’•`ÍlcÂ[¢!ÒCZÜ[LP#¿EjXÞ\Ðe(—0 áÐxp*»9„uŽýÉÅœî,«€§u^Å5]TQʈÚöE1¤u±E»=ú’SÞЩò[Ò…FóÆhÑ{ëôyh]‡eN ÁGB„ÇË 5žKè',¡Ÿ°„ÎÖ’îÿ·jÔ¨CRç4^æ4ô˹¾EZ‹U{u½¥bxì1‚´XÓ#„ƒ¢?†!J«jÎä°iÙB ¸Á…ùº¡Ò©ÁÌÌÀ* Ê.:u¦(•Š9È!“tïÉ  ÷¿­.c²êÔ!¨#PÇàh_! w0á\À±ÙAQÒàÛª[ß/ *Å1ì"½Ò ”“J ¸>mlZ wRs„(kH¾ãMޏìÔ¬/^¯(zÇp«SEš‘aDIt£íž^@~+q—GI»<@΀msV­@­Am@M>—c° £ŠrL­\®&4õU¢ì ©4°ujÊ+ºÍûJz€Æï—*´W+º›ð¢…–öV°[ÖA"„ö¨ñ€ö³[%­%® IV$+h­` µZÐÇ[Q¥¿jï³bü¬ÖT?Y5Ô!«õ1MÂ=ƒ5µ’pÑs½èƒšš ··l?<`@ZàhݎÞêÔ…wí°˜iw꣘¯,¢IJu«†àÀ‚àúxN¥Ã%¬ÎZ bÆFŽ(9ឤÁኞ ³ 4‚A€1¯ƒ#®§iF†‘Ï(`1Š1(ÌÅ^À…Q¡Õ¼L=Ž Í®™M˜[8.gt¤¬"šû´¤4Õ^Çt’gp uÓñ‘³Ž]ÇG/nõmGïjM¬ç| vfW£V[—i3®S+P£jÔ¨CP·ý—¡÷ûLM~õé ’!ìæ»o˜öÇm'w˜‚íl§ÒBšN59”ÓA"mΦ‹¾Gg“. iCU¶[h†m§ôÞa6ô@M͆´rR5ÕCÚðyѪá„REŠ…ö‡Y'¦¨§ç Ÿƒ¼¤DÍV´§ÓB{‘³5µ†¬E¸=î}ŸUªviÓBÙFÒªûJ ºS·Íp0˜Ó¸­¢”ܦÕå 87SÓ4èö”!] ìÔ”ŒƒEÙGhGÆÃaÛþ]Ûµèáp»œ+RHtEŒ£ö& h2×a›S¨éÚüpÝúSÙSXF謚;«ö¾p«E óÅá(£ Ç—jêqºŠ£f.)Fš¥ÅøSfÖg´©®Ö„3^•$dÁóJ5QŠŒ&´ÍÎ}éÑ$ Meh€:ÐY Ëð¦¶`|€HÑ(uaê öûR¤×‡øy-QÍÔª½d•¶ØPñè𛃡í9hWk²ß†*Ì1Ý@9c…9¦ ³*~ã%U%cÚBhÕ Ô`žÆ à õ“/U@=‹!ÌL a'ä^5Ò«&†“öz™ádÒo—®Ö„ ãpBSJãSEi1…L!·Xu š)Mà;uÀèˆÑ19GÎ8 Ý2Ì<ŽŠ£æhÀ•zŒ#͈Ûó‘2æJÆ\ɘ+tžÑFíTÄ¡5\KP>,`ºè ,é,G­Âa„0F˜ L!5\äð: …aÁƒ»(+RŒ0¾£Ø/¹T­4UÈioÿº\£ +Áí4LÅ žU͘ójÌÂÛN2ZðAƒ.P¯³©Óß¡ðЦýa÷9Píû'-Ðè£&ÅH3¢ÂœCÏ1‡žc=Ç|„æ)vù*B `{a™Ñ½/NÜQ-•ç$ÎÁ!: óùÒCP¿ùÚ GŠ‘&?äÂ>|¾di¹¤´¼Zk¶D32Œ|F#À&V iT@ÚÓ’·U·«TÃ|UÀ¼Ê0§)š Ã9¤9ºw8‡\5§Å4§¡@­Am@€:uêÔ›”¾ìÔ×ho¾ u’ç0z˜!c+¼_å€ Ô|šÓó4 ]ˆ 4¨sÈoóÍ@ŒiNÔª!ö˜¤ð çð çÐøÏ¡ñŸÓ,¡UÓ£zÃùX I)§nW‡. iro%oÑŸ€zNjh¯ƒ%$¢¥1Â!ÂMòcLöÇ}š¡.&K²1;¤áÐbI•¯UãÜ´eòRƒš Ïb »Ä,Á-Y–ŽP]ë[ \X@c4/åÀ øåõE{I‰ L„Ö¤€ ¦W½v¯[M¬jqÃÈg0 QI\SZ/Çí­IÃåœ6Ö Ýë˜.U° &½Àc‘Òg¹@Å‘Zç Û‘Ó†èoÌ¤Ü =WTßÐ3²N †hÆßœëÒ\NMíBAc«+°ïã=4«4‚Að„!€q”ô'ERô'E§Ð#tà8æôöwp‹ÿ®f0gdÕüZ†W-SÕO7ªZ%¯ : k5JÈ£+Ú©QTâtËóE§†öÛ‘b¤Ö0uDïôÙ°‘ø˜¦Jì³ÁZWTÌÊ>…º¤K/U@§jjpà:¨!íó¼ìÔžW-g×zö§:Ý‘˜Ž$–¯ãŽ×qÇë¸ãIØ‘tüR¿TÇåvS I")ÑÔÐ0ëŽËºã²î„°ÝòL’Ž_¦ ÓñÝt|73xù¿üŽË~Çe¿“ò~×åNLƒNLƒŽïA'¦Aǯ ãrØq'ìÄ"ìÄ"ì|°“baÇ÷°Ó°ž¨ž¨ž¨ž¨ž¨ž¸“>qÇVܵՉE܉E,cáuʲד¶¼Néö<w¯SÞ½Ny÷:¥Ûë”nz¬œ$wTÇݱÕ)Ë^§äÒé.’t£;©Ñ)§^§œzrêù=Óñ«Sr=¿¯N9õüN,:%×ë”\¯SN½N©ô‚N¼‚ŽïA'^Aǯ°ãWÍ<Íè@!hƒà#P÷ÕA»•®&æ ufËáfraØ^œm•4:)ÇSë8RŒ¨ÿQÒP©„n@ +Hå”: å—ªJØYïˆÆž5Aøç0ÿQΠªrj°½¤í`Ѐ¾¤e÷ bCㆲM!l7õ5êž•7Gå€ñÌ#}ûáo·¥6×ÐþMA”Z+è^¯2˜­±@“õtsãp³O+XíZе£âœ E,P® 7¿‚Qöª¤Ñ-Þ‘;„;rÀ:˜…¢VЋ^¯(*ë>=ì0„­ðVÝ5y¸ÑSâÃõ„iY»Šä†ÖëÈo‚ü&Ê!€7i«ŒjÔ¨7¹îÂðfÖŠoBpsJ»EÐÔæÍ©>-ªÞ¤@Ü,èÀÄÈMÃ<Œÿh€jjšf8‚¼y´Ì(ZGp£Û Gƒ6øTí9HQ+Dˆ ¸c°C{Û.ÕÔcšŠ‘fdùŒF!£ˆÕ3G°÷sxü#(Gpµ”¦CßäÊÉ1,b÷Ñ Í·»ïÞ¢=«VM5Í­Í òÝçs.ó¹×*ÁD®<9fÍ´Ë-÷´óãFí²ÿ}VIñs tk—T~« [Uû±GøMOS95¹ÐNuŒújBêvîï>§¦pà{0-Á ´Cï ¸Á!D€ÒVM“H‚FÈ>Õ£>| Œ4LÃ9 §’*J)–èíQ:'7¦s… ÉÒÜëÑ«Ä5¦ =®ëq]ÅuÛà\®^ƒ«ØpÓ†»ås]ŸëÒU5¶Q­µCn9ä¡ü×p*8ã¹k1 ŠÇÌë ÝŒã€!ONÏcá„w7¬˜qžDžÏ½ ¸nÀÃÅSÈ ¹nÄu#¦«Ú_i°³oô…q.Å3‰Rܰâ†57¬¹aÍ ó ¥x†R<µÏPЧ–â©¥xj©Pèò`ðì¢xvQ13¬yм@iæI§µ@–{´nËDÃVF4O-ÍSKî3O<ÍOóÄÓ‘@n8â.GŽCŽíÖŽ 7_­ §ª+IʈydbVe˜8e…ÜçÅØçyØçŸÉçŸÉçÂ×B—…Ãçéîót÷yBû<¡}žÐ>Ï¥>Ï¥>Ï¥>Ï–~ÌrKÐãueÅ9ú)«‹ž@O €gÜ€—ù€'_À“/àIð$x< žϘϘO €—Ûç°Ç’/ôxò…¯ªCž¡by1¤ÇKjmž !Og g g §^ÈS/ „nÆ‚ò;ä©òÔ yj†<5CžšO͈—¶¨ÍL÷7ˆ‡@k·ÀóWÄóWÄ“3âÉñäŒxrF<9£@ 7Ì(â E,ËD1Ï2Q̳LÔ¦XU™ ·xåµ…ñq ^Ëe{#`e&æIó$y ÆZ 7Ì“,æIó$‹yŒy Æm V}‰8„9f) }N˜’–`TNg&*H2Œ€aEܰ.Šñúíyì +4ía$Œf.±~µa‘0,±MÀô®Ç|`IoXò–¼†%¯ 7éš®­Ö)Ë †åHÛJCMee6fþ²‚ï³ÔôY…é³ôñ5×Ãðú,+So¿"kŸÅÚg±ð#z^Õ! 6uå]Žð`P¡@sBÏèÀçÄLrØçØçnrÀK^Àb°ÄèJÈb²O²z;ô¸sÅÃ!hHçvT G\w„Ù)d¥=TÌOVû…,õy?4¬ßòiŸÐ°~‹Eì·„>·ës»>·ëK»>Ç€cÈ0ãeÜ£×pÜß÷wˆÅ9dy*dyІ 5¡^ľ?0DŠ¥RZVÈÜa_*Ò\/c4`4d4b4f4Abe/b~D«Ú¢€ É#zRærª`ÚŽCŽ#ŽŽ×±6ŠXyåã–ˆ%tL³ Wl¯Tn*Äþ¿1$±ÇÝçÃîXqïÜ[¦ø¡cÖÁ²Ìw1Ëw1Ëw1ËwqÄõ0OÄ,mbVS·Z0vÍqÔ§VõRðu‘Ñ™%GC„ÂaŠ#ÀÚ-Ð^õa}–'­|‡õh¨³bÐGHɘZ^áQ.‹ù˜ü\-@c=KpçhƒŠ£æè“£kˆ³j jXBZ!qÉÌ}O:Ç|a”RO1ÍáUrK9‚BðBò…¶ZXµ5…ÎJŒàEÑQÚîG½èÔ´Ït”Á›~iF†‘Ï(`2е{ºjbß<¥;ô*Ãí¦¬šXP•BkÁ øBˆ€\z=F#ŸQÀ(dKŒØ’EeIûHkbóÞNb±(æ¥b^âç[j'Í<Ð,pšÛcžk_ÍR­Ý~Zyάæ¹ažæ¹ažî ‹¹aA1, KÌKÌKÌKf'çfùáa–ö0>Ì€zA Ìçc˜Æ`<ŒÁx˜’4ëÏ˶gíAý‹#w]pŸUû–¨ägtüd”aÄ‘™ –RF’b&3©˜IÍL ×Òš`²ô(7d“ŒüA\ Ì(§š Ãm nkÈÊœ3>B€ÐG è ²ön" #hU5oV·igµh#–Sçd¥à½F3f´S`8§§}¤ÔÁ!«ÑòŒÍ$tȯ"ŸQ»µ³&V! Ë]Èl nñ«H1ÒäýŠ‚¸>¤.Àð&…–õ²jú^Ã[mÖ½Rk5¬€ŒBW¥¦C÷I™¶~Žiç•U+PkPPo’í²Sã1Ë´óc %oL;y*`: ¡=Ù[‹²Ô5xQ·!B„CÑo…ATè²bÆ YF¨†$¢+e¬“$ujªyÇ#Üö3†nLM‚Bï V°¤aEì’sÅ€pÿhL}Ññø˜Ô9|ð¶‚±Æ7EížÙ =ägn!MèÒ–ÑœœÐÁN«Ö ¦Jj²DWétðÅÑ4Í@kšNÛ‹—-Pß~J×ߌ¦tùšUÓXbJO :ù1^@Ò}¢i×qÖDõƯ„M!oOáYH”S¨®Ó³–£Y 7UÄõ #ŸÑ&Z«éÚjÁûZXp稪áÞ³fÈî=›ÑÞ³ „!BˆÑ×8G­vGéhÖÞd­ÆŠJôlMc¦Þåíaæ #cÁÍç#¸ŽË©YÅ–O§¤wÝëõèõ芃ÀCö”ö‘•n{”5GŠék¯=PR³R̼ñz!çö KÅmò¯YÎa{¤Æ±êõ”ÇØ÷0>Ê3=ÆÊ‹ ccBÆa{|¡bíùŠq0ó¾Vgnß}¦(ã3ŽÚÇšûgë{¦§,=t/bßS{ÖcùŒƒ@1Ž<æ¾µÎÌkôû,?XŽ<ÆfæbßCŸÇÇ13ï÷Xþ±©±ðúZ˜7Â|²øû±aôz̾Í_ø}uØcù_‡ªÇ⟅?ô{Ì|DÇ jöyxb:f×pÄ‹ôsæþÇ!Ó7=/6ŒUqŽãˆå?ã)–>–CfßÓ>× óßzñ3Êë1÷•bñuÌìÛê‡Û×±f¨qØãö£ÐgL_óüctÀʯe–Ÿ-ÿÜ|ÄÊŸ1¾ÇÌ›€å›Ý¹yûy™{¾1ܼÏÊ£ñãÐpŽ˜~`+pÆÊ9³úÏß@³ú߯p÷bVŸÄ½Ð§ž`N÷®Zu jZÍ—ÐÕµ@-p^¢NÉu¨÷”à ®|tjléÅÍQ~“Z9 Í:æÇÓ9«©iÃÈu³}óŒV狜éPàé §g—hÆ€šºóePĘ¢> ÝöqÙ©YD-·_åÂb²h/PºèÔt=áh}x9jQ'i':€ÙG)d¶|„!B ™”Üå€q±îƒš¼\f}Úú¿Ìé]`.‡Á§… è-4]³¤ÃaFí®kkf~¬ Ÿ,WOàÆß ˜ø~”¢±e¨“¡ÎuÚ¡ñ• ØÐtIÇ”* I0t©FÅQsv}Žx3Ä 10sà@„u„q£ÎaÊíLѯëhì:»ŽÆfhl†ÆðÓ±O;G4¶@èIe K´SÃRÔBKZ*У=*ÐÎ ´S2À¯]Gt>RáG4=PŒW ÞŒšïwêkëÅbÚVCVÖ¬ ˜-Jjïʾ׃ëÉF%æŽÞMt@á+ábSL‡êá2”U§ 6ÆôªšƒMCwaTÎH>‡òg>ŸXQv”¢AaS`®T€—Åo ‡í£1@•^Îáz Š¨{V‘0KY¥„ç+ Q--:5MÛ•4õRƒñ[”¶+˜ÚXÁê*ƒR³Ê Ô¬2X6[AB[u¤Õü›”d[–µ,Fí5õV§ hƒ@3gk˜£YCócÕt)­%Zz»0ZÓdË:‡+Fëùš µW_Ö+¨¾,(ðdu¾·#Šåº}Ðztº9 XfÐLY ë‡Ô‡8dÝG”«*‚VûpI ؇å”&7©®8„¢lÕ=L«Ðc<\Pû @‚:uLjŸáQS{atDsGPiAÿáèò¥¦£ ‚° ëý\ë8CY瘊Í1‚·ršø;^¯aJé„Ϊ{ ¡@­Am@íƒ:uêÔ4Éu‹ÒkÜ£Jc¬¨0Ö© h‡N­4˜Ú¾ ã~ÛAÓíÌN­@­AÝva¬º_¶[*®4H³lJ Ú¢giÝš(Äý´èƒVÑîjMد$ ¨ì{Œ¸žfdùŒ¤”¹Éý£K£ †hnÌÜ37ÆÌášcIV–Ì>Õ>'í!±êm‰m0å8¦¤®Z+ÉÆCŒ…9dI¥3ŽŽCŽ#ŽcŽŽSŽ×Y 4’ê3JeŒŒ†kƒà#!¦ÀÛB7#eN!ÏõŠ^·©QqÔÛ*Çbj*ÝûZ”ê|‹Å5_°P,ÖøU ]ÅQs4ÌaÅH3â&}F£QÄ(fÞç<¬9kn8úH,(Ž0&v  øåkRSeÜ_ùE?%34#äÞU…º ho¹XÁŠì´¯b9›Xà±’(a¾ÅØ/!Œ+°½‚ï´R¹ÇˆëË«vžÎ©¯qÐ „^êÔkJzµ…  ‚yhM•㥊TŸ#|—5”¬õÔPdÖ+L£õ ÓhM/{]§Ôܦt“„USRx¯Ë}­trZ€§ð Ý&§œ‚~u_Ú€ÚujúDð>®UoܼgÜŽóÆE2£÷Çt?•SS`2º]gœ iT:ÎF­+à\‡(òrLεkÕV=óô¶½5?#330Õh–ÓdžgKÆôlÉű‚Ak˜QÅYBЉl‰þ¬¨Ø[uA™ˆ^;±JZ‘®‚3€û/ÇÈ<zor o•8uéø`œ¥]VfP‡ ŽI=… MÁÍň<†—½(`¨ñã6….Œ‡íÝ÷VI7‚ÕdùŒF!£võ§&(N´Yɪ¡µ†ÈcÚÅdÕ4-çÔT _Œhvf<‚½@§€¼htJ¨JGeŸéhƒÐNŒÇtŽU+PS^gkPµ`Ǻ>Ǻ>/!Cçôä˜U¡#´~„Ö6±›:¬9 #òµ]î|­|‰h6 YK‘ ønët f®€9|½¢ï!2‡ m_«Á‚ï‡9i·=ÝKÀȳBÅ|8ÎúsøqÖrÎÂ`sîµ;#îÓUðV#ß@¡œVdnÅÏEe>JAMéù”ŠýœºóEjÑ΋¢Ž%h”àsAá[ô¡ÏiA!hƒàLÑ):E|ÑÏAƒ6 X¸êMÀ.;5{,`%Íú³Fn‘’~A5ŸÓ œoÕ9„ƒ4‹”ŠÛ‚æzcè¾[ðhÖÌØhÓ¤U£ü§§¬:uŽb ¡…]` s”ÃÎ5$P~Lj˜I|·(ú4²(0ýëˆÊÞ¢€Oç4×íŒse=&(aìhA!”ä‚jé`m™!ŽèTT¨c!ÐÁåFà3ûš‘aD3WŽèØm)ÇŒã€ùÀ ~Ã=aÀöÂ:"Ûbö'äxT"¡›1—#:#\óãˆã˜[n«º*X)~¼éœ*œe>G­b¢ÁUK9h®éRE”×– C9| Ë6˲q,û+àWHq¹‚Æa W,—Ç­Jl/³ã´°ñ÷˜zÇÕ5m—ß*c²Ø×‡EŸ†ÛœÄuÆ`fÛl/«Qèjކ#M)œ–Ã\—*€t€iÆt–q¼PÐ[VM¹ÜªY­ÈÐÃm6DY œÍ(`1~\@·¢RS‰/ØX€Q@1YÐ× åb:ÁÕÁb¶|˜ GïçAšjxHfLÉ85|çÅ,Àd³U÷8…Œ"$:äP³ç)Fš‘aä3 A>-¹“Š9©˜“Š9©˜“ŠEA375sS3W4Õs¥3f6F2,a óÑ0 ‹…aá6,܆% ¨Ï¾ŠÏ<÷™ç>óÜç®0Ï}– è…šØZ®•,×SpælÈ †,p!K™.diÁ’)b!‰Xì#ÖÐ :mæÀCÀÐ+!@ NíîrÓè˜fÆ zÃr¡sæ^ ¾¢ ]ð1r>ÁgÆp ã —ìk… ËA@ÏÒT`sRŠ®„!ZŒÐgö)#ô9BŸ#t-ÂŒwŠT”2ÊÀZŒn´˸¯Ášú›zçJæ÷¥Œ2F¤íÁ›)FÐôaóS¼ á€éÐ EA³¿tý X:*ŽP>A£{íÝd¨#(G”†e> KìjL9RB9TŒ4# ír¹o ŠU¬ÀX c1 àŒºË”2C9„§pvgŽqw渜@.éteFßåæ„,(`ڞÕ ز„G?+€©Ùr:C›3´Ù 03ž†æ Y¦vyºÏ(e”1 ifö;êóc^àlh9C5d€™êÔ”©KXï)çah3®Uƒ›sêZ5ë–sðcŽ~ÐBI}I:~i•CXÖv!ÁË5¦ÏÃ0%We%'e¬h>iÓ÷«Á¼"d²O›”: px¦û4ô¡‹yÆ+\C[QEf •¤¤é«nRXá&…nRXá&…Õ¶œY Ðj7É:˜¡Ûs”Lý£¿s`‰v–pæÚš‚€¯¡œY‚儚â0‡épÑ[á7©¨ÇÑcf#ÍÈ0òÑ@öætµÂÑq¾æDmË1¬ØÃY«†0[+9l‘8nWœå¨iéðšÈcXr¿)ykÞu ê ¨g n÷Lè*’‰7jû‚V½X,—`j³ÖvÙ©qLm#sê>BJ¦Æ`jê-LÒ>ªÛŽÙ$¥Œ–Rgå”ÏRÈ@é°½ÆjŒÁÍ1¸9'qFn€;tÖËÂ-šNR*KÌM;Pô²Œ¾)쀼Tº@û-ÀrŸƒ!PhGi!@)pc&öTФÝ\iÍäÙàŽ³ Üq6ãjVmHM»Q'YI5UÓ@¢"p‹6 Otòb=FTÁ øBˆ!PÂО±É`€^hÕa2h³äE§¦•}Gt#iƒÔ ÔTËSʃ£Ö«aÕ‘b¤µ+0Ñq’Sf6`šíâ—kL¹7›”»¿¦kë5|€!,m8 Ï>l÷[g2:ÉU“bDi1ÌöÀ=¨ †t5žUÓþ 7@½5úá¼Ýçè`[ÐEs6iŠ~Ö.—]nÂSLÈb³>–ôH}Tñ;€.^ÍŠ£æh8†côG#rBYÀ¦›!¶Pi W(× 6 öA€šJ%¼k5Ž õY“8<‚Ï}ÔY›îGtçmM²cpàåÔõO«$##ptœ¯hgQ'ã)Û-ÑVÙÏH¾"»«m¶ŸLúTZ5unlÀIÝ6T—šu9-眨B™ä4Ñá€éP^˜ÂV 9'*•Ó;oÓ´½òÞ ½íÔäÑtÔö®T€«®•`fi€;™ŽiЏ¦”Q†¤˜I&ó‚vá[‚ÞÒtÑÞEî`:k…@™æº˜¡ÎL!h* ÓB]NÛb}y2]­½‰×œ ίé;8Vý¾¤RIÁ@ †R0–‚‰L¥àº̤ —‚M |ÿF@ !3©Œ^*£—Êè¥2z©Œ^:’ßTÆ7•ñMe|SßTÆ·íÚ¶‚…,ù×Ö"÷h‘{´È=Zä-rOûÎÀ†Ç‚'‚§‚¯s6"|F„ψð>#ÂgDøŒŸá3"|F†o&xóI®:V®ôèŽÄàGQ²@)Y ”̤JæI%³ ‚,x¹ð/­Ä—UâË*‘òJ¤¼ž($ åæR-Ј†æG'Ó›C:RŒ¨¼~XRç–nþŸ´õ¦U’é\Y:™ÁÐ*·­ BŠÐNñ: õ‰S†K®»¤$qXЋz5§’ãÂü¾ÐöoмcÅeŸi—ÂxÙî.Úp€ñ"PuåW`Œ0A¸Ž@’¼ó^˜ä4"Ï×”'­¼±Æ¨3§ ᜚ucæéú}ó”ÆÖó ¦fæcxo®"úæsÚÈy©ÚîPÐ_LGƒ©.˜Aоdq©‚ f%1ÃXZBßhkA¹ÄAaÔÔ:gáˆæ¬+ƒè Î')$öœú1sú @` ˜)¯hžfŽß6 X5õaBa30 ì.Fì=ÎJ70}„19Øn5¾4Y”‹¢ßãHý‚ÛþìÕF@íƈ¢÷ojæú”+}êo:¤ú·"èM;01‡&Ü]ZêQ3«3æÍ¬àº9£9£’Ñ!KŽCøµË‡¹äM°Üðµt•Á0aQô¿Èé“/a·õd9–œ#Êó–h¬¾\BgÛ‚B Îú²h_íœ,Ë9%¯üZ÷§eÉŠ`°·\¯aüµ¬†¡Z0•3¸ ïb›Ìõ@M×ÜŸ˜™ Zѵö@C­­Ñm…ÀtX|„!Dˆ!©ˆ–ct&Åh¥,T)†*e:ª”9‡¡J1Ti„€AÌ H.8SèÈc¤a¨2 U†¡Ê0T$À X)©Ó`€!°P<®§a( 0È X{)Ñ=ô˜Ö¤è…ÚP.+<¸I`RÀ$œUCå¨=¹9E*ÐVÝÎwÜçÔÔ#(¤¤&¥ ËQ­Ýª!H0KTÀ,Q³DÅŠº6VMé]ܤ;­&-žt(ë:Õ;)¡|Yu;Qx©&űÝV?)iV¸ÌÖäcImEqjj jJáö¦=+^Pµ\® È+øx–Ô fkVZu"ièŠVœrÓ†‘Ï( ˜/ùrµ&Ö•sʺ¸~],Ò5y—Ü“+ttk̹¶B ¹évòmXê+ÁZ°áÎ ß4Ga8ษϮ4XÇhem5`ßÄ’b‚E+¬«mêµP ”õhW…SƒÛ#zÞéPS¸AÐø8:†ïj¡@ƒ°N½¢í56¡‹¸×‡.Yͦ‚ à6Ra#UÂFª¥ÀPeè˜YjÔîÃëÒ5RΡfdõq{Ôí±¤˜†™ó„!Bˆ07)¬ž­hœú`×l‹ù†7¾³Q­·ô>EïSô¾m£]⥸®¾*Xé/²^ˆž 0pírïÕ ®Í—ÐyXc´Hw=LÖôåÖý5ìótH™ÿJƒ°µ†QÉÆWk\Ô_—0±0@"Œ: Ð•h4¦Ñ˜fÆÐSM«´¼ç4ÚÅ=§€º={áÔPJ×pèÜBÀäèSƒµ¦±ÖzÍ–céJžÉá‚Ú5Ü `ÕÉÇaÿ&\’:9îç ‚F bd¢vW˜µÐqÉG¨¦‘CNul޵j~“¬ŸÎçðX§#EÅv£™9Íg[5%Ò¼€qÕ¼€® …ö²ËŠh’Þ `jRàÈ]¤ çpÚÔ*44XdЩ]dÃU! ºðΪ)f‹1˜£\ƒÚ€Úõ©'¾ í4©WZ EȨ纘BDÚoñ€S_ÙQk+Kº’¡‚Öý5]{»RN”10¢†vQ µ¢ 7h*J‘|¦çs½£!££ëŒfHôPï´½Rê²U^ƒÞ¨M«Äm5{Œ(§-VЧ³`|„f tÐßùZ‚F °†¾—ƒ#…h„vþ»‚œô„!B Zf±>$õMšc)Zöu ¨ë]dCšòžsªuŠ¥ç!Pq*èá:«öA‚:u{X` 3BE»(oÅí}>Ó8×sY·zê!X¡mèMZÐÁGÀå1¨ÛMqNÍÚúÙ&ÛßïÔ×VÙ§EndTnŒaÊ·"ň>ÍÕ0ó)FôAnRURöÛï~¹8]àX!hJ.Qœ–?J5–|˜Xòab…9XÔ 6 öA€:ujÊù%Ôüå8õÔ7H  N•Y5„çÌ™#ÿš‡ðQá]a&^e0Xe‡¤1¦[-´]ÐK@ï”.âwj”SEµÊ¡WAõœSÓ7_-3lÐúõtSœ+j"WíÖU§¾VöSº¨ÉJhvêÞéº--÷M×#èXP”×°Ù¥‚# *Ô¢%GÌAƒà#!B„# †9Âá&­±U@eià 3 Q§ƒv@VéaŒSŒqŠ1N1Æ´¾êæPÖ8EjA!hƒà#´·ëMéØéšVà °R*ãëLÑi‚+°Þš0£)BP¢˜š\Ó]UÐ` Z3X]a4W´®2½9 eÞÚ¿¹Xy}Zgž>L;C§ÇÔ»uHÏËÖ¤µÕÓõ>U‘VÝ̪ 1Cµu›Ï¬zN Zƒ“÷7ÉÞ˜ÐäÖÜm'¿/^ïÃ-;6X4t¥ld¯¨¥¼>̽¶4^ŸÑÙæ‹×ç×é¸Ë}Ž B€°)«àZ‘÷þ¬L´»ëóãV¾„×PÔh©Õ©Q®AÝ® ]o·ß\¸N›[¬²ÍNÙùúª¤ó¿×Û·o/\?lGÇV™‚z@FÚzbÖ‡Œ1ƒõC«n‡ÙàrK A#´ó©¨­ºZæ‹Z’3㊑¦pъᬿ¦jÁAJ¦Ú5§ ©M… ŽÈÇ55Z—*Ê*4›‚æ­>]B€"D”3CxÛ¨"…T2½’ëQ˜l/²(ÔQ¨£QG£N;¿z¥–¬€ÍCýj'e¯T œ÷ÑE] Ðè è²ÄÙ $1ͅΆ4[uaF‹‚³!­ÍÆ£šG”í'ð@t9R{­ü%Ke ýÄ Çvqd6™‘‹cê±NVíIÉ˳i¿ßëµy³a#¸½ü¶f¯×ìqná6B¿ÝÒp{!oñ°sóª]Ø»²áœÐÜA%"¤ jïý­Y{¡à˜yh™{¨}bÝ^TÜpÌSÀô¸¾Ñ<€&Þè ãñJæÓfóšwÓ÷yªùç  ~HÃ9w1ô%ódŠÄwŽbŸ%“ežLq§k,¢+þÝb‘,1ÿn6Ɯەà+ι­9Ïã´Ì= ;×7,ÌçX2wOy=Á‹€å\à*-4†³/ܼ̇)¦eŠiž«<ruÄSĈ4Š{(rºeÅ™çZ[Uý@¸ÏKšçó,d™'ˆoxxD©ðü˜»ˆxܽ@$x „<"½Â·z/ œZZƒÚæirØ­æ€é(`|„!?!\#×Ãåƒ:5ºšrU½òK5õ˜¦b¤F>s¦Ý¾Ø`Ê0⺴­Bªcrº îb=F\O1ÒŒ #ŸQÈ(BÏ™“Šy®˜çŠ›dž+æ¹bžÓÓ;EŒX:0'5 ŠfAÑ,(šÛcAÑ,(šE³t0>B€ÐžÞ¬€ J­€¹Ø.ÞÏrXZÈgX¬fÓQÁ @a˜Aá™Aá™Aᙡy(<3(<3(<3ø*³X@u’/(1K8[c%Úë (° ðý\³ÿbªÁÁ #èæuƨCw Íæí•ͳEFê\&4ÃYêÅ"QÐÒA A#!@hЬhG÷V½nW¼ftFý¾Y™BXJºE÷¢¸®eVfP–Ã9½jÞ å¢r Öà‰åYY‚&þ¬º‡ 4‚Að ÚYS#s$D þ¦ƒÂgŽÆèJ\@×F¨ó,(¦…>+ ¾BŸè¦]@§è˜ÆôƒêÌôu¥hƒ 1ƒ 1PËYˆ!<è˜ÁD0ªcè Ì­•ëƒd`ý1¦!¦nˆ bhBô3Ĩ…ÌiŒZˆQCsg„¡‰04†&ÂÐDš³jT,4Â*×îmvO°L³,÷Z W[A¯#éšQÒ™Ž@K‘‚NP)¥ ’‚˜ (þ@uJ ´ˆj醖nh醖nøÒ@ B)ˆ»%Z ŒøRHA(XÁõ %²%à†µ`ÕñP2³(™Y”Ì,J~W+PR Ü_^É/¯äwUF äWSò«©P¤Žî°ÌSKzi®y6$K`_p 8 æUŒLŸ*ŒVà J°lû‚Á¡àH0q ¾I ˆðÈo Ž;¬kÁFp${ YŸuE2ذlq@ç¿f+èÑ+¾÷ÍÖSút«Äe§Æý^3ºêžYûVöìxÑîŸÍ=º\Ü,—æj2nï^¾”ëy /×ר8jŽmc—÷©Ÿè`ˆÐÞÞï ÝŒu±‚6Ž9±jÚÎaÕC€ié!(‚œÞ3Îû´_BÐÁHѺ¶§‚‚é¡{)º‡)2Ï0 Úa®h¬`Æ|ÃzI' kT5¥òn ¬H1Ò”êt ¼U¯i™¶Aør¼ –÷Ëñ ß,¤¨ePË0­!¤@Ñö¶.ĸRŽ¢ó>¼Ã‘Ã{šrº=§·§­™5Ú¦s)ÖÔäÅváôBÞÞÃ|RÈÓvM8OÁbÚnŒ¿ìÔXhó òšUç A…Å–¢>BŠ! †#…®)tM¡k ]ÓhG£v4³ƒ!0è€Ð .ätð#ÏrxŠ&ÏæèÁÝ.NÝCP>XAë¨#PÇ`9‡/¶,IcYÂ+À½žg”é2º‚?Ð@ݪ¨© ÒF—œ:¦`Õ¨¤nO?\rj¸²²FÅQ3„Êi@‡".V@¥m£æÃ ¾™Š#¡ºìÔx^ßòú˜¸÷3çC¸“'ÎémÒ X0¤G^+ êt¸hWs0ö"„˜B¿¤¥µmÅtõ©S)uåGƒV—kJG9„ }t@U¸…h®Ûƒ(9\ ’ût/Ñ¥šGÍÑpl;o5¶3صˊ‘fféàE­k…Ì›0ešíKá5±üâ$1³ÜÞÁÐ`ÆÌR Ó‰g«V Ö 6¤ž/H]‚¼ôAMÕ ½"z!ŸP9ÉÆÔNLF”(V ´#ÅH·©Pnn%܆aD¡œÐ±Â|-Õ„ŽpYµµ5¸CÏ1[uj*-Óv²ñB>‘xD‰@‡VZƒš"0ÍéF€š#͈ÛóH)s3en¦ÌÍ”¹™27if0§÷`î³j ò<£È– ¾šÊújŠõÕt>D4ÆX1ML_Áµ|™›t.VâœhAW!ÔDÙwº ÉA ¾B0t7‡t ¤öiÚ6³—­:»V¶­ëǽ^¯m±´“ŸïI4ÑNȵ‚@ B!ˆ¥íƬFàõ„ Ïó¤ cBKtÔó¥@„Ô“‘óüH DŠyAO dHéh CˆòBi"”q eÐ#i"!U½ž()¥@DŸvVmÊ“é¨ ¤@LûR ½ÕÒŠ‘á0Ò[#ÒCÉœ¬|iB~J%?¥’_N76q¹#€™±Fv2ðòû«P~™P&Q$ÝBÅ2z±ôECKocñ!tÏ“-F |)¥ ’é­Ì‡ZÖZÖZÖZÖ´?µHo•ôVIG•tTf­¤/Z:ªe\d­¬µôVK_dÒ²iY„´‘Þé‹‘¾#½•¥NûÒQY£ê@úJ‘t4Þ™?Œ¬§ŒürF~9#¿œ‘©ndš™„FVKF¦©‘ij|‘¦FVKFVKF¶0F&¡‘-Œ dÐC鋬¥Œ¬¥Œ¬¥Œl¥LèK ˜¬ØŒ¬ØŒüúFÖtFö@ŒìÙ1‘ôE¶–FVŽFVŽFÖ…¾lO}Y±ù²–òeäË>Šï‰ú²òeÖöeÖö•tTfm_ËpÈ6Ù—5Œ/k_V¾¬ |_]Ö¾ì€ù²æËê—m²È Ò ™×}™×}™“}™“}™q}™q}™OýH†TæB_æB_ö”}™-}ÙDû².ôe> d> d‹ô)¥@øÈö699½í@¶·lo™×Ù» d^d5ȼÈQP ;¤l‘ Ã×Åxé1RŒ¸IëÓ½SVÝ^!áÔ0‚+† †~1õÔSP_õ ÔsP·Û«¬f-ÀØsݯÀÔLOæc˜J³@Ãö¼ á}ù¼Oo‚U£–B-Zi ¶,äH¦£ûyË]t¾Ü©)tóœfžæt1œUÃêÔ|³Ètã…S£\ƒÚ€šõó%L$ZP4u:_ÃìƒÐ9‚õ 45½€)ÛE“§‹ö“]vj<(а³õù2ózn,´ôFë í“‚¬­i™§l·BIYÒá…,Œ¢ŽÝ0nëÇVõÔ™ßq/ê…ÞYЕuÃyA×=o‹]…‚ÌïÄ7R[ÜSÝøFª›VõÛAt㦷Äôµ%Éü¶j™×uÏ—ß×ɶ¤3µ¥ »ßˆÚ)’a7,AÔMƒÐëúúݸ…áYÛÓ#Y¤º~DQ7¾±é~󸸧:~Ä=Ý sÜëº÷üNĽn¾½n>ˆ=³EÖMÓXy]÷”× ‹ê¦i¬‚Nõ»Útý5[ÒÅD]?¨K ²nÞý-iêo 3õ#@¶Å½@wãvó†•m1wÃùÝxÄ[«®Ý¸[Þ¬¬›¦q§ìkWGwež´«]Ý‘yü§mÛõCuòŸîuë5+ëä?+ëÔMæ‰@¶Å_ÝÉãVæË4Õv€¿EæwÝ3úYà d|ªíG–+Û¿S—è^Щ­,îš ·|˰Sg[™é¦}¸%‘é†9ÚòÍ£°›.Ñ–4ˆ:ùÞɺ~Äréd]»ñ–<wêl+ë´Ú뙎9¯tüµ²-æ¢N˜½^7nVÖIS¯[kfÆAÖ©¯4œÙ–°èN}ee[âk¶øa¶„Ùï–Ï尿tê:+ëÔCVÖÍCÞ–üìuëNíÑöV¦zAçûª^؉¯•uÒYyþ‹•uÚZ­T·NTª›¦Ju˪RÝ<©t·.±²NšZY7,~7]TØëúvÓ^…¦ß°[çØNá6Y7ÌQ÷»©-eÐVlpÃ䮹PŽÁœLö¹Üpz‹Q'ïºa·ÌãVÒýnQOÖ±NÖµyÝ|uÚ'“í “Éñ‡›ý+ÓÝxD¦›ï#ÓMÓ¨3^­dÝøúrŽÂÊÝÉCî£weݼa#×õ#ê–™hË7²Í~7­â°ã^Üó:ß#îuóFìuã{²aeJwÒ Þò=bÝ-qgîËMÓÈþš“É6ÏÊü^7¹/'ÛâG û>•¬“¦qgœç¦Pä8JÙ‘}§ÅÆë´=±mãE:WÃîž”éPŽó´ö{2µ-Ñ2O[:de\X|7ÛÌK™ý¾º+“ã(+S²ž´2#ëb' ‚-²-vÛ9ä§ ìZ/Ë‘'3q¥)ï÷ìøBwdΈï2ÍÙs2ÓY™/5'“°’m±+?ª“ÉA¾“É`e,´N&+ÑJÖ-oLVHN&'¼*ÙåGu²-ñètŒœLV N¶%9èõݲn7¾¡ìxT²-veƒèd[òF§ãæd²©d[ìnIƒP6ö•¬û=Â-iõºîEr`Sɶؕ>'“ÚJÖýF‘¬¨,ØbWNV²n˜ã-aŽ·|xK>íL(U²nÜâ-å7îÖAOv´œLv<*Y'nvì´E&’JÖ sЙÈr2¹¨ådÝüt*Y7,žœlt²nt:Z•¬fO6j•¬ó}ON6V²Î÷°UØ–ðuó} äĉ“ɵ“uó‹­þºiªºõ} ecåd²óådªëžÞ’.´™dÝ:"Ðr±´’m ‹\Pt29@«d]÷Ì–0›-ùÀlI¿Î$»“ÉN½“mùæ[ÚÕÀȉ +ó»mmzºiàˉh+ëLT:Ù–t¶¤_(®•¬›J'“¯J¶Ån·ý¶´ Á–úÞö+»iß™4p²-ñè ä*Ù?ä Íɶ|·Î¾“m s¼%]:ENtÓ*ÞRÄÝüö䤕“ÉA[%Ûb×ßb·Û ;ŸVæuÛP+ë¤KèÉΰ“uû„¶«Òõ×ëöYÃN‡ÛÊÔ–4èL~T²® 'ëæ+Ûb·Û¾…ªÛ¾…jKšªnùµÅ¨ë^g¢·’uýè +Y×_Ý­ÃÂÎÀËɶ¤½–ONÖ­³­l›¹-ñÝ’¯L·ü†¦Ûþ†[êçÐtÛ™Ðl‰›é–·pKnG…[Æ=¡¿å»ùÝú*ôå@ÓÉä$±“ÉIv'ëöõBË÷ð»}$+ëÚ ¶„9ØRf‚nߢ;ÑVɶøÑÍk¶‹.ýUa§x/ëÎÀ­¿D]™ì¯ÙžŠ–ý«ÀzÒqÏÉâ®L¶—N&'²œLæ]+‹å¤‹“ÉrncæË1Id[s¾(°Õ¤’2È~qdc&Çnþ¬í \q2·4×cßó¸ÀvyB¨÷=[ÑAÀw›W‚6ý;¯=!PàɾJ€GB*Aľв¹ƒåc+ðtO‚ Œçq/¼õŸG.è)nET¯¶ðh?ÒHÅÜŠ° GEº§µDBà÷„ Ï7xuR „·^,L(O ø§Œ4[l>˜ž‡1"¤¼ ³߈€ù¾pÃ|)V%‚Λ_'ˆ:‘ÈA¬¤@X =QÄ\$‘A ‚ËTy!Œ o;œ@i!yL–¹È(Ï‚@š!ùÃV¦RŠ€iñ¡ŒŽ…Àx"r2ã _|^F†7YN ²” D>5V‚@ZÙÁ„ÒÛÐ… c%‚¨'Üàý'DE‘HÓXÔ&•íäpoýžøú¾¬a܈O"!P=0_ófÍ x%ÙªßOš0Ò„ôÖ—nø"ø²ºð}ñm}?”&DAö—@…R ‚.k?½ʆ¾X()&"™b‘ŒmJ+"Ãø1ïnDvü ¨ ƒž(êçI¨èÙœ^$­Dˆpx1O±@‰†/P¢­ d¦ t Mˆ¦Q Àˆ2Ì mk1V±9+êVÀ;hVja…}'ˆ…‰ÈÞÆ¬ÑÒ¶i`#S·w‘å1'ˆ;îmÌcëö:²’í¬ñ¬±hi%¾ð"f|Œä2.¡HSÛQÒR t4 ¤ q‰b!ˆÙ°ÊvXzü3XëÒV#±x=á†ç 7´/Lø½H<0¯Çú·6‚(⎚˜çdS€÷P´e=!`›a}KmFaÂæ0w.ŒEÎúÊê1+YÆ "áF„W÷Te¤€uY¬@óôˆ"ÃË\ñ¾¥ðzÝ ÂX8yÂJd„£|å2¤±áé÷DôcÞD;%’0æ½q+0"Õ 5ÀVòÊÀ )ˆ…[‹<Å=áhÜ‹xÀb·Ÿ ”ÈR¶¬… °¸ØrÌ ðdFZá_ßvœ¤•ˆU}Æ]¨ û.NÀ>ãî6 ¤ âã ¼ã¾=áKÀJ¶È€ñál%ð¥@D.ˆ¤£2rA$ÜY1u‚XX‰Xrµ§LÓØoc}¯çõ„@xëñJÚ bžðHáF ÂáñG'¤ Vx¥dzžßÅÓÊ“ᨎ…£&A7Ò„/¾œ‹/§x½nÜ…S<úaÄZuSÍt¢ÀVÓ9{8AܰÈvE]-à»JT!`Ãj'`-²¨H8Ê;ŠV {Â>Uᾑ‚€ øô¡"`x—K-DHް+¾D2 yÓX DHcéhÜVø¤­(iÂoã[“ØN Ü𔈋,n‡¬‘á†Ld›‘¥ àÑW2)Oso•ñc!à&Ö!XlDíàv÷z\À+iß]…¾Øñ¯a³ü•ó‡î² ‘J LðzÝv`¼ÅZd'`½ ;2õY dû‘KÓ „¬R Ü!ÝP "&ˆiÓÖe'Ð1›‚µ] >6³Þŵ‚-F¹-KZ4Ë •@˜0,²•@˜ˆ¤/k<¬ f;Mq{cku­µ°Â;ŸV`¤Ó „ÀH‘0áË€ù†]"úšÏu9ß‚@8²á¾HGC-¡p4ꉀE2 céhìóì`øB£„J"tûµylïó¸˜À+Hiáh,²¥‰E¶4¼!t›êD>õUO <%"¤¾ ä–J¤€ÇÖç+ÂVˆ¸ø¡Èü~,¼ ¼€[ ”Èꘅ@‹ŒðªÐ ba%å6=áF¨¥ £… à‘ "‘A$MÄ=a")Ä1GØ_.äã+Ð"¯‡‘/܈E¥Æ!71O±(ê ±¨rìÀŠ{kQ'ÇZ|ý˜OÑÛºBñÏà³[E+æ_ßï‰:ÈW|dî¶½ðòb!÷VóþªˆºÐ†žpCäußÖtBòeÂQ[~¸ cX†6&¬Ëo|È ø„€°þYè¶ÕøBÀš['ˆD<9°ñŽ´D„úB +Šu`@ ÏÉN`DÀt A(­ˆ$ŒøÊQX­zIpÃôzRàKð…¯?8«>Ãj¥ˆ |-ÜàÍI% ô!ð„£¼ºƒ­ÂJ(¿m¨{R âvõEF2ú‘Ìq(âGÜJÜq‰{ª'Æ_º +žV¼0þbðŠ ‡1„/¾Kô´ˆ"=b¾jl¡VRJp4ß%Ž=}>ªv‚@Åœ€Õün-k,¬€÷ð+þ¡¬€ÇV÷”¾ð«Û£Çš+ˆxä´ÇÇ"NÀs¡ö Ïün§B,<[º >6n¸¡GÓatÇQÎãT ›TlhY¾fº¼©áÖCÇ6Ó›€1Í+×LâÕL{ó+¶ýÚcš®XQϯbM”k¦Õ”ŠƒÀ÷&žÊJO0]>¸Äk-ÐË=ô[×Û|¸ yûî€U‘™£ Ü…¸<ÊáÓ[`6XBЦu½½Fó>«EÞ¶±Àt4‚Að‚6àEF¯'Õ¤iF†hŒ¯.“…aš¢±)›.(‰‹œ”KRn.¼d•pÏ£µ\`Š%ÓÑž')ŽèÚÌÞþ*á…¸_å° 4%R™-áÑr´` 4‚A `‹ÓV}8#˜Ž@g:f À›é­ÑXûÕ­Ÿsº{³„ÒcÕ=¦£R°Oy˪St|,¨Â°jö ZYøà4¼‚F¯Á9uÞôáu¹Ò~õŒÌA®)KxªÊÁ&r—jJ™¦aš†kúL^⪛ EŒb œB-zFº"ÍÈ0òŒ˜çŠy®˜çÔj9`*9 æz,Üš…T³¶ÃÙ*tû&ÌÕ=o“[.7%˜‡2ì›B|) îgÊõÓ‚Ç…¥PÛµ©‰}Vxè®¤Çæ+-ÃË0 K,Ã˰i؇4ìCLÂÉsªÉ|æ»Ïüó™>óÏgþù,ã0k‹lÀõ˜5æ~ÈR,dŽ„,Ì!K1x—È‹yÄb  ‘2¬"༲M ˜é ‘fõ{9Cà¢ä²ÄÖ¢\0€µÑÂd9xEÀÕ¤iFOW}x<®\s7ÖËùš´†uJ›[kP¿‚w¼VàºU÷˜ùkÁô¥àœ5xÙÆÏ©}P ÁC¸n{5UÔUYQopµ"ómÓz!_SbÝ7’§$OMÙºï@´¹˜ŽF è­ÛçE­FfVä刔t‡:=lÕ7É·Ã,¤¬ä@1¢48œ“¼ÿx©&j£W”YoA¼,(ƒ´þ@'í8€šJìq0öSFRÀiÀˆ¹ŒÀý ¨)ÝŽÛ×U§¾– tòÞqDÃ$«†FóB~“±˜²ßq¿$5”ã18›ƒ3tßýñn²?. ‚F0>ÕÎRÔŠ@+‡wëm¼ºTô}Ë9…`|j Ž¡@Ö¤iFTŽ!ÓßBêÝ"ù- é-kY0ô±nM)/ÝZÀ[ë¡ýîW*`#Á[ô„ð=múÜ;ÚB/Íû©òèIÐÇö“ÎáMí+ oV0‡²’nïopãîý bOoÞP8©–.×D¯vV d}ˆ]0 õ°êvØ7§7¬¬ŽÀø(5šS¸Fc>Xž‘c îx؇¤p´i†lðZõ×熄ÅTL³}<¹ÖÔŒ #ŸQÀ(b3/bæEÊ—Òx¦Æ€#s7eIYXSÖ”….ó1W2æÊ€™0“mÙ½T‹ÕY2‹#¦7aDEÚÒʈ^Fè}×JWÁDC+ÐhœÁÀr!XN£ RgaÞŸ‘|Ö~$+o[Ñ9MY—àék§“ƒÎêb•¯!9æü6– œç‚B€O8ÏñÎWë’háõ=F )ez˜eªÏ í)fO¥L/ƒ0/Ú)›‹ä 5D­!¦éb:+ªU›<ÖÜêŸ%|ÂÞ1q°Ñ¹ì ÏÚ'Ñ7Ü47¬„ ][‘ŸÄ»P3×ÓŒ x`©à6}F£HÏ VqÔã(tGÍÑpô™?Š‘fdq{#öˆQ ©Š.–ª†…ݘ·çƒ‹Ž`e´À0…XŠ,)Flµãc«f¤oP×SŒ4#è]ˆ¨hJýöÊG`„¡Ö¯€FËV‚™д³>·kÿS‚µàöº„ C%_9™²P9)FøÖàѪ¦TG—¸Tà´s;0cBˆ!Äè@C` "e6[Q`aU_fK€êÌ [À¬XbÆ(gPQ–+ÐXÁç*o©íذԇǶy…™’Æä@KE£ï ˜ŽF0àôkóµbÎ54Ö4ˆ¾RïT¬ A#@ Ö%DüP‘úf;†Ÿ÷H¹ÁÜ3§N’@¥âˆÜI¡"J™œj«†n¾#ň›4Œüÿ[²Ý¸’­Ý‚#{l/vDü÷Et‡h6 €Õ 8ÉIïßFŽìäû7r¤(aÍ: —¯I«–Õ%Ìàc€Ìß “Ýõú4/ï&yÚ 7Îd)Y_P‚ˆ ô¼b‡k"'„Ê9yk¨72MÇnP²”lV½É²‡ GÈ›3äqÖ£±Á@ƒõÈ €¼m¶[“w°´›Ÿ¡û1Lðò´ÛýŠ€/&#;[ÉKg8°UÇ,o>ùçƒdºÖØš]’#är ¹‚¼†2˜›62üm®§ËJHͬª6ÝÑëQ½›±@ºÙì?åãë¬\ÛX$ÛÝq¶ŸdËìv¿Y, [h’än®}±Ÿ1ûn‘-Ò·½ÀNy0/mõä¼Å¯Öhm¡ñv³³±Á¶¹žé°m¬ؼð_Y~&ˆ‰åQ†<¼B$„’PÖGíµsŽà ÔÀQG 5pÔÀQO ü ©hƒý$KÚ¢ýݶ%ä 2BÙ¡÷KðQÔ¾MpùÀÿ¼ãíL‚­ûlwo&ïQ€öÐc?ï]%y‡qn&¤øžm¿«6Êßá[ä l‰n™á§Á&1PQ¶'lñªæy{AX×›¼ærkSÈ 5çÛùÕdÐÏ#”&C‹Ž2üæXi;°öÍ«£ß²|ÄRÄv4ßF¬ê?¨C5öõ—h<Ñ—DYúý«Z¢W ŠQ±P,+A§z¸9'>¸^ðG©þùÁ˜ <~i5‰Ó˜8É\ãÞ±–ôBA( i ”êk©¾VB¨ÿ7¿!Ô„†Ðΰ۠´íX8˜úN4 „¨|9ÏK»é÷ýÖÝذíæe»ïY–Fow¡ì ïMîm´·0ÚËð,¤fŽ4g݃jzé  }(N4* a=§ÖÞ¨öër÷Ä'·28‚ePÛe¨jè,Ò(Z}Ù7ùÏ‚«ù»Ù‰qÛøƒíLì;'Œ‰ÝÊž;8¿=¦l'3—ö¼ç;WV=3GA»T$Ûöù…^r°{w³u_–TƯ}IåC¬žŸ…튣ÌWºf.Nél›){O¶~¹?ÛtaŒÆ‚óžÓâ=§Å{›9?²üGŸúMm{ëéÙCM®Wa¿±²”dÌ139!k3͈>dBaîØ¼Blt%ùØÑîÛ‹¹g¯}ÜöŽ€¤³Eäã.ìm´sÄL÷x¢_g,ßí½î$c‘ïx¹bi¢Ž¦ãs ÛZ5°ç´¿M€FùØ]™3ýêIÉ‘P’':ì…Íí;a¿Y-xa^/Ìk5 ÿã“ÕÛÌvòîµè^ m„j:´»üßq-8WÏw\)ÚÞÑ„aÖyþá“ ¯?Ä¥“E2†Nè½bPÔpWîªR”Õ†²ÐN»p’Á…s›KÒª¤vYEP5‚F?jÀÚCÚCÚCÙ­Î﨩U¨jÄ…Eé7íZïwT%I¹H ÞÚ#Ùý­ï(U@»«¢Ô`µC*´C*Ê…[})ƒ£bÙÙÕ¢_ÕIB{GU¥*Õ³jé»NÃÒëÍ‚ë7êÁº]-Xú¸]ðNRVs_û§bQ»µ*µ–:O(WR3JiuDQujE™œ”\ñ¥®ÀdV õ«P¿¤h”óm¯*íS«×ÕVQÒµ”6¦’†¹’Ž ’”‘<¯¥k­í§®½y›8N%a½ZåüƒD@—ؼ-±½[÷K÷þia#,m„e…¢ê¯Íòz%Eq­ ñZgOk=­uº„{¬¸‘çîU5~aYõÖ)ÏZ§lXîÆå>lÐ}Ø|û¶¢jV©f•”O§z®Uϵê¹V-ÖªÅZµXkr­U©µ*µ5t -è~l°û1ÞÑ+ŨX(–Š•¢$•W-Vªãjaª:®TÇ'Ø õtÎôýª½RµWªöJÕVŸœªíTm·°¬j;MZm‡¼SêèTG§:j8^t Û 1ªrP•ƒªTÇà>K)\¤.à"Óò<¦æ-†w E½Zþ°BõñªOЈKßBP¯ä QB]ÈO¬)4¨¨Ai´O Ú§íD‚v"A;‘ HÐN$h'´×Úkí5‚öºítÛ?èÆ~ÀÍêtOŸ~PÍ´# Ú‘íH‚v$A{Ž cßÔÐ.þ}àR±j©X¥ŠiÇ´ã•*V-ÂÖ$Ó®"hW´«kUC;ƒ AX/Ú(ÖŠ\oIåV(â8黹WŒŠ•ºÖE¾é·ü'QÒ2£Êì4Ñ>j'µ‰ÚkD™1†¸Rݵ‹ˆÚhFí"¢Ìn9ù rþ$¿º°Y°FI{”¨Ístš\.,< Ï4RÚ@Gí'¢vÐQ›ï¨}Lôš˜>J¾z›ó<Ò@mËRaÐAt¡án¡á~á¶P,+EIB»‡B»‡B»‡"¨VAµ ª•öEP­´‰Âã FHO?¨*Ú¹èZ]еº ku¡X$½v=…v=¶t÷ý²Z”YÊž®Ö]­ º<ty.ØòÜÃëB$VÅ´o*´o*´oÒ廄š\ÚÚéZ_е¾ k}¡Í§„‹Æ°(׋ŒÔIŽîÿ]ú …vLºt%0?1¢¨Šj?Uh?¥‹rAå‚.Ê…Bû©Bg8…Îp áÚ©Ú©Ú©•:Ã)u†Sj/Uj/Uê¦Ô9L©s˜òYÃÕ§Ô§ÔYK©ý®X†RûŸRûŸRûŸRûŸRûŸR‡ô¥v!¥v!¥ŽðKá—:))µ)uÀ_ꤤÔî¥Ôî¥Ôî¥Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ôf¾Ô C©†RÛôRÛôRÛôRÛôRÛôRÛôRÛôR§eT­´ /µ /uvQj‹^j‹^êd£ÔÉF© z© z© z© zYʲ,«?ùUTõ²Œj½Xº/–îUY”ºrUj£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^j£^i£^i£^é²U¥m|%Ç;ƒld„JÍ¢è[Éô„2’—“ÉA×2¤]ËèWÚ\îA¢ÛZt›ÓòA*´Ê‹…戅æöÊõ¾v'ºu 8F©ŽòÕ`ŒÒ%GsÈd-‘Ô™º%zV\)r’”P'IÓ™{$,¥•Š¢W!íR!Q/$ê…ø"“¾h«a߈ë \«õ KÅEPª¿ŒJuý+â Ü:-Gé‡za¡Yºhœúè5"kˆv˺H ù'Ê<9ê’YB§èƒbT,+ Vz¢Rò_>£‰¥ýRJƒ Šr„-ʶ(s½(³»(ß™FÍg™±E™±E™±E™±ECË-®%òT”Ì)d°]<ë~ÅóJÈ y¡ …*! _V2*ä`U±’ðä›ÀB¾u-ä[Âb%¡; Ok2´*dhUÈЪóð…Œ• §áIlå,|!gá cÙþÒƒ$~òå~!§æ 95_ÈHM·’Š ­%¬Å®àvƒÚíd*k»JÉñ¶cô Ioéœ éœ éœlwèAžÄ¿Ð¥ÐSÛE!ßF$”øJïa{D’ðK ±”¥Õ)䳿Rv-K™”²SHj¬¶¥Ô§RjB)·+”’n¥¤[)éVJºÙâëƒÄOI™R._)¥Ïµ•Õ‰$Õ*iu*iÇ+iÇ+IÑJR´’V½’Ö¹’õ´JZçJºÝj-넵 SS©QkÉSýFÆVZ&’6j-m”ùE¯ÿŽâ+®L$Ax¥ … ¡R¨bÂÙ àïé¬6³[°_°è$ÓʵL+í¼ðÍ‚ úÍ‹âøè´K™\N?¸åT1ÿðáÅÏ–+.ò/͂ۅ‹ö“‹í"ÐÝR-™£å–>Ø ÒÇ]è`—X|Ÿ¯É#® ?ÎoÃ%ƒ.ò~9b‡$Ã|“Ü×óËü¢@’O+ÈÎÜŸp‘Þ‹]k÷c¹&?ýw¼»ðÏf°Â ìHk¨‡Ë·_ìežÓf¾hïëù„›¸OÛÆd¼&”dDú4çF’p=Ou“<Ûÿže¼ ‘ø¥”ÛIO/öì®täņ§¼žï|Ͳ]zâ?¬2NÔ©éŠ=ÁÎJf J?Ø“D'»øýtéMîf+³¸-Ï2Ø5§§{c÷&ž7ÈÖ´ž7Í¡µ3}9Ÿá|^ûH?Û÷îç-Š÷yϨg¼oœALÁ! BIXCúì¨ú„ø2SM‹TÁQGU˜°Y¹„L;vCð™õôÌzzpœù<8gåN.|ÁêÒR¶Ì¿à ¸ jõÅîňç+o ¾Ö¸X;A=;¹Öž¶¢ 8 ;³ÔÌ÷nf@Ià~Vþj£¸ëžOT\÷|¢âŠKyS ûÁ<° ǯFòÂH"G®=ž¸Ú£Ò?&ª~µWŸ'°IùµßÜÁ:á‡G¿ã«‹õ¹0<…’Àn€ž“6%ÆÐánæLNÞ½a)*ýõFOn­³Ö½C %ùÓ»kq¹l×þ1ƒíÞ g·Ÿ“·;$åh’? ®l×:wGíFõîô‚Ž©»´féj?ãvØW¿w¨è½›ä¹€l-F×áÁ¤­Rª§‚öç¹{Ô=ƒ]ò;‘µÜ’ïtfp«X½E¸ßXí7ˆ}¿±¡K1^Z?÷ÛÕÊÚ ~kõµßñIª‰pmn¿ïúVh+´²¡L·•¢SôŠ–kýq8[!ìíY§¾+<€ w',ÊdR3'ä…‚P*„J¡JhMÅ$8'Š9QÌ©ÍÅ~>H·É¿ˆªNÔÁ+‰$†^ð¤W›€—´ð’^÷’^ÒB¼ ¢JØáŽô‰: >ˆ¢A}â2vÅ ŠQ<ˆâ¸ 1Q]£è%„(ºEÑ-F&¤ÄRb)±ƒ”ÑAÊè etÀÑÇL¸PmÂZ±nƒ„(Åtpjæ…D7'º9ÑM ìà˜ôƒ”ÑÁ£iÊÔIˆ^I—2;Ø[t™˜ƒ˜”ÌösC—d¦Ïà0ÌíÇ«uûýÞfÍ ‰ÁÎuü5Á³òBA(ÒKGWó èdi4Ÿ ЖK¡Ì ›Ëˆ‹è'tŠÁÿ÷ŸÆóv·[¸ùˆË—ó`%pØã‘‹áà {ÈòG„þÎòÓ°éø„Øp°ž@ß2á5¦üÉ¿#O|#gÀ¤q˜­KÚó½œáÜY aÝúÐ#kúzEpëð†!Â=FÛIF‹—ÉàD=!õÆ ,]éÛ£Éá†0oåæ*#F#þWmƒ-ää=äãÊÿqõ}:A>C¾™<¯k~9ãq¤À¸Að.Ĉw!Æ BÅlilð€YÀCCæ'¦’-b·íí€MT¬ "tÂTrÄÛxãî<0w(yãÞòz*f*­HãëyìŒÏØ_z{ËþÇ?/,¸û‡Ç .l«+c½Œa3 êލP¯LW¼XžASë ¯7ŽhŸÆ·’öŠq’Á"¡ ”ðŒî±À•€Á8'±†A¹„%ôK¯”Ï––I¦Io=éëPÁ`°Ö^{äõËùÕZ‹×ñ~˜³IøÛ‹‰Ö¥Ý̤ø }ï ÍÕ ©Þð‚Ý­ßDBI°ºwß´ç9lš=‘M³ï6P¹×5£»×˜ußù8ë½¶å’©™‡³yYx2:ØZàÝ’þÞàÎ Þý|<âœÁìþÎ\¿7øsÁÚܽÁ+H÷¶BRmÑÖÞ·×7ó!åÔ}![¼£O»°xœ@L#t çîÎÝ´_£²†AÙFêwf0—àI³Lð #¾;6(îØ ¸£—ºŸ RУò–°vtŸ_WüžeiÒ;‚' O ›îÀݯŒò•÷ågªiñ#?&%†ôC%.+q¹&lb­!´„-aGØÏp<É4‘(F[í¾_‘e×’NJ:YÓdœ½26 cƒæî~E¶\Œk8ÊÛu„Á:ùC'à¤CæwW4"=Í÷ÏæÞÙlŒx‡üþ£?xüìšàúÿcŠÿë°;›a>N`kît´:O¸.ÅÆÞ{YÜØ”y‚! €£Gkž&^L*@ µH˜™|M0/¶$ù´±sËœ£ÿÁæÿþ`<Ûš¼³œH2’€i¼±4N¶æêþ•eG˜Ws3мǾÍÏ/ÿ•e›'$î(·…¼ƒl/9&ùÅBÙŸ^݇­pg9ý0˜Í#ý¶R~Ùœæ¾òÇlZ/›s7\æÚùm‚yröWFk 'rBÈ™Ky0[\CŸÈ y¡ … óNžïYÖÔéj‹L·íN-Œöð°‘ݰ!Ôæfžþ+Ë'ÀÅbÛgÙc dÉ`@ 1ð‘Õw´±CDz„W#G¥­sÊp‚­µÉoH®7TÈ·\Ù‚#ìZv×¶Ñr©·sÿ˜edw&G²å‘‹ ?$yóül·Š}¹ÔsK~©»<ìð`ôDj„¢Ð|Ð9“›—s&CÛ]Ïä bRJ‚%oÝ#’6ã¾4›¹,f°^0ƒåm3˜òW’±:‘‡#ç ɆåÀˆ %†âÉ^Ó#w{4óÒl0ØÁýÎ9ØB„æ$Lò |zAà/xŠúA'1ŒbOÀc7/­|¹4V䛢p¶9Å¥¹nVGð„@ˆ„‚PzD#SûÚ#QPHùÝ›ûÞŸæu©Ÿ /©–àúöôËk·±–ç’lK™—¶™»½´[³ÕnQYÛ½ ú yžö ´³_.sùH>^¬l/Á´–Ée@ÛïWGðË€ïÜfpO°6 }ÝÙ±Ê=+.L¢ŸœšY£9ÑIíF¡B¨ª„Ö¢N­Êï¼â|üë»…ë¨(:jÀµ¦a8#ÊL&N¥¦_$ÝjÉ«ZÒ©V$jI§zMj$¼yìöŸ=½4c»’`UÁA²nuu'ê¢î ê¢î›„÷&á½YIÞÚáËek#’mm-ã¶±Rñ 'äIØ´½ºË¶mW‹e†>"òs‚§sÛ‰Kë·»ää³9ØÏÍà p 2™OŽ`‘í l½`$•`[2]Èr¹„\AFtOÖnOT>/ÛóÎä ä+rÚÆU[¦†-›OO_ÍWþŽh¾ZCº}í­÷Ì`_N脼P Ã+f?:Å…åBp¯n÷êvÕoóÊÿCíî¥ß­lì8®Úml+5½fŸíD&Od'Y'öBVfv[K®$£7ͤf§Ýü{–kÈP÷(nfðR¯䥞=~P-Ô Í¶ODÍþ±ú(ˆ‰ÖånwƒJvÌ<ÜÓ;<š—‡¿\ööó£ŠývgV¬®ìç-¶oYæ´}º[ÈûÞÆ?‡-Ƈí?;ê=%æáÔ£„dR3/d%â€!õË;_.›4‡mÛ±Á"‚=pŸeó÷¸óH㣠»-ÒÇ â™ÀZ†ãÅÚã£ÿK2ÆÅ `ÇY]&5óBžÌÕ÷ÃŲëÇ;Ïk™ó6¥8õ"Ö7dÙÂÙ/+!5óB–Q/˜$ùk8[yyi)["¾ìçCE——c-ŒZ–¾tôÂNÏ\^æÌè ·C$²»P¤f^(E¡B¨y ÁK…˜ 3k—N˜Kœì¨ÊŽ` '7¡oì>Hfóö@­h£úM€!O†g!5sB^ˆþcÜ”€jtbMÔ(%¡"¬¶Ÿx9[y®mºw¶ýÄËykõ*ÉOéƒ!e: #är ¹‚¼6ýŽsjñÜÿƒœ¥ë¹ß  <÷/Ö·Ÿmòåbß\lY Éèd¯õÕºßkc>xB°v;!%Kí|É[wM¿Ÿ0t½ž°†µƒºÉ+ ®¶#—är ¹‚¼†§ ôÃéz¾ 8¾\Í £êV[~L ëÎ× šWT¥k ´îl”͵è$Û Ö¥¿bU:y5̹o Æþh‹kWœWz'ºœÄÔ !íG¤Åøú1¿IÙûf¿¿¡kMmoȈRø†nÖš\oôévµnçzë·˜ÈuuÌ…Ž½S·Aru¶üû5Õ’yQý¯$þ¶³HYdpn ˤà;‹K×ÒÚGÖ3uVá»ÝÎLv;›ÕÃÜ*ÿ{‚§¼Ó³²öññÛ .@LP®:Ì ’l_&\0xèNW »3Rk¼mt^:´@66ºÅÆF×Õm©µÃJbǼ葯=†˜]OÕmPÚ ˜ŽgÐ౞ØïwvÂhë º7Áw¿M¼›õû|3ƒ#DBa¾þ²ócI¶ ûg4Ùý36ûªEšg@8‘Ö"­Ù…b]úMkÇS/=£°éi`§¯©47úm|ßlÎæýc¿ýð÷{–¥ØõØß´UãïY~:ÚtîÆõ{þ [îTóH5UÞÆŸ½õÛ=âAo’mÐ_m*Ë û®‡ ¢€ÚÖßhë†uËßÁ×–=z˜¥híˆÖe°ÖuØìˆJ"(Ì©êpÞÀ͹±ÏÅ&²ÒŸÉÎÙ_†©=¼" ¯Öa'yGÙTLò v‰XÄ$“ƒ£`2R»Ej·v~5Éfß>AúzÝÛRYž¶ë~wEÂe2mŸ$›ôÈ“½]fpÝ[Šî­hçÕËïYæ€üŠA÷õd­o’MÉÓÎV”28‚'Ìý`; ;‘ÝÁõÀZì›ã~Ep(kóä«u_®óÍ2IÜ›8/]/Ûæu\):E 庵gÛ)ß³,ÉØÙ’$ŸlßæÚ5ó× 6ö¿v–ÆÉQšlü&ç›läh8ü¶mX˜ä9ZH6=ËðB8ÎˆÑØ@ž—Ù®ýÊnÂ} BQ¨š7\&²Ýç í¾ŒÐ^ÂßKø{ ÞÔyP%´&$„ƒ„pÂAbøøò¸ûGl¾ˆÍ ¯³_B½ØÄl³7IÐ7; ™ñ·8¼ ý!­6B’ô«ƒH¤†JAˆ%Š¹Ö 1 ½(c‹&›MŠB•Ëo%„”I/%Æÿäv4ÂÆ3¾áH—Á¶um ¦IChim>¦1AléfK7ËÝ\P²ÑžŽŽQûz÷Ux¡µ“€'Ð}‚”¡œéÁE€ü¢É kŽ¥ÉmXzÝE0Y´þ!ÃsG›.Òf QÐÄ^I{kñp+jí•DÉ¡NlŽÔÄNõåÀkªU{RÞ±¹†ÖX⬆fØÑÍŽÖöt³g zp ›è$n¾™¥_ã\ñmðÌœÚwÎôáLÎ,0gzw.RGæV&R3qÆøŽ®ZÓ"“bôJAˆ ŒÊ(&̪5Ó½1ßÞ¨íošüf’ý¦×wZûðG@Œü& áú¤€ ¬—¡Fª‡f¥ä„¼PB2…F,±Ä"ýP‚g¡-:ãÒŠ(a‹ö,ìVž ·“¨ì$áv«’äVB ó«@wT‘C¢^(E!ææ “ã…a±ó gº¹0—/¾£ãq¡ßM~1îì}+¸Ñä†Pãj£„JR-6k±YG¡‚ÄâW[%ñs'f;1Û‹Ù^ÌŽbv³“˜…~ B£ÐI:óè8ñˆNRÉI*9I'éâ$%ÜVÜmÅݶ"Ä—£’øÉ)Bt/bóElJš9I3wQwÑú"éÒ‹;Î b±QòBAˆ~µ¸«Q1"ò(e|Ó½ }JĆ=n$²XnË$ÚHáÙ¼’j6æ‰Ð„D)-µ£Ò,ENJcËö*¶l¯B,+[/"‡OQJÑA|Ä%™Mjäˆ=r9./bÂ8¾0ÿØ‚FŽ¥¢Ç3{«DtÅ!S—œ•œUlk«šcýª #6­UªTa±¯¯˜$W**WQ¹jÔ®8#«ØÔØ«aŽ4áâ@ŹZÅv§zÊ¢U½ ¦kÖßõ‘[3r뽘 ¡Y³\³Þ¬YÒ׿`²¡›ÍQLÐl®öY6ntþŠ ¿âú毸½9Ëra2hû3ú©sËñÁÙî]xÐ|æj7?^»ë-ËÖç&°ã«¿#oõyü´ÀÍbF'ä…¢P!T UB–qC3'›MÔ°ßZ}Ì€töø´`"géb»Iù7» vÈ!ÉvÇ^’óteÆ™gŸó~¹b¡}¼n Ïß %y #¯€#xxÖC,l+#Žgd€O¯-M°à“ ,gØí›Õ¤RÌìò£+î:»ÚIÄïYæ!Ïë·ßpSa˜ì‘•Ö¶~Üö„f·ËÛ}7¡Û\Ì’“{À7Û­»Ù…x³ï&pO„løÏOãæ¶²Ëg&s¥› £Q °þy‚g!5sB^ˆÊ݇»˜„¹™ïÂÁ&a.â j؉ªnãæöÿÛ6[ï6öÝõ_Ý¥}{ÐG©øñŽó&æüÃG ß?Ø|db/Äóùó‚‡a$]D;ˆ˜4næ»ÈLÀO²§h×jLgž6Ñad\˜ZyÙ´ÇÁÄZ ÌÝV·±]ÔÎ<¥Øns°v F&væÓZí·È…5Ï?yBkiOζ¢™ Gl.ˆÍ\d¾g™ÍuâGðä É@77$œ}ÍÓmº6"¡4'êH7CI¹Ø]O¡Zhg-âëÊDkd"hþ«÷„@ˆ„‚P*ÂÚêŸìænÃLêQ´Jߢn%¨IÅFHÍ>âçƒx"ý‚dê™Õý ò G`\›àƒ)ÉOþ&R3'„¢PÁ¨:ÉMÏnßüe¨Ì‚ÎÆÔn‹Ê0¢0÷oBM@âÙQï”,ó§É`dk7nÁ…ñD7'ºùƒ`~÷&ßðû µï†²5<²Œ&ì†l¿U‘t7k$¿tõËl©¶[–ºÚæT XhêeÙC¶2Q#¸ÿ±¯oºÆ¾°H2²¬©[° '†w2Mà –tÍ|­Ý÷,K}j+Mk«‚|TˆoÍwƒ¿ã]ì:¡(T UBk’Ý3˜©$T„µ¥I‚';Í8ÿàé­]ìó gÅ…©STŸ$š5 B’v:i"I$ˆ]ä3Q£Ê5~-†µÆ«^-L¢W ŠQ±P,çG‹h'&V•%ÉjI²Z’¬–$«%ÉjI²Z’lo'éÞñyÁKs§ÎèƒbT,KÅJQÕÖÌÜתF­jÔªF­jԪƜv×U'Æzݨ×ö|Bt˜Í¶µU™‰>’ŸÒ– —ïuÍ~{†Ñ~'àž Öe6G6˜¸ä²Ã r]ƒ¡qsºšLUpoj†V \Т^62KjpqE¶ÙA!ßàâvrB^•äzj¶–Ì™¸töøjv”áM‡ ë®^ }‚ !"¡ ”„µ©0¢a¸ÛÇÌßt‚áȲuÇ‹™L¥vƒ~}þJ'ýŽt&x² ÓiïèÐѪ}¿Ÿ)"Á*\»[5£OÚ†Þ¬êZ|"ÖµÛÕó†d÷Fgr1© H™­£5/@7&ALè[h-æ óm¤…ý+è_Ñö„ ¤o%}«hRÑd¾¢:•ý¾ßm5¡!´– ù2!¡Z¹Ìå% RY˜W”²l³Ìöˆ5¨Ödèh‘PÀÑ ÖwÚãÉš ­c‹Ö±ÅÂAûb­F{²Ûƒ䄼º‹B¨h*[ fÛŽÊuȶ€É«!»v`q"òqhm@LoˆÏ­ÅX+“=â“ð2~¿Ûô¾ýƒ³S™Á¡$T„5àmÖ.úüûƒ¥#È¿¡³nÿàÁä‰L…-îýN€¥”­Íóà›Ê –¿[ÜOû5‘Íñ¶èÙ·û¹Nóå÷,ËPa{: 8‚•Ìí܇g£íÙŠøöbù¶ílk‹Œ­í¼$`ack_³w[ôõÛqõüLÂ4(“ô-–›’ G·úºLµÐžÎÁ¡ ¬¡Ý»ˆö ¥á6_ž› èà#f_péqm[²ÛÙWÿÝ®µ#!"Áš±Ý‹Ý,ú 'ä…,ãv/'ÈgÈ–¡» |¾¬0fÚ]({È»6;ȲEe‹38B ÐMG7Ý`¢¿çÒÁžK ÄZ Øj´}!›DŒ¦ö¶X;ߨ÷W·ßÛX,Åô=Èþô‘õß’|·u¶wtŠ^iˆveÞ&É'š æüže˜'¶{ »½E÷©m€†™Nf¯7{ý#³Lˆ2ß4Mû:E¯hQ>lnsÐ!Ø,:ɶߟdþnépØÞætH²,ùÐ*ìŠô ÄÄøéåt°gt“'×›Û!rÖ0=‹Õ¨€B:¿“õW–1MKd÷o=ÈÚîã*BþÈÔ/ŠéŽášf2Mmf¯3 ¾Oèhî809â*¬ ž`5âXc×÷Øp¿ìÈ \Ø™d›\·®+!K=.níu$×È;È{ÈÈ/‘äû3ä ä+äò/È=äòùòäßoïÿX pà|"'dMíñÅKÆ¿øÆmkŽùô‚o'ÚÕB­Ðžžâ¶ŠŒ½’’û … ±»¿ÍïDuÇ“½“šå«Må²l +Ž4e£l»5›à²D/ttºw0ÂNÊq¾ôèK‡ŠìPß±Vl€ñeµQ¬?, ó?1–ÁŽöz]„Ð{ó£ÚI¥êQ dûÐc)ñ8²¡;ŽÝ¼|øóA2NÉ¿ ‰01Íx^ SD©{ <¸‰-ƒ#ÀÑo\ð<‘R›6rùÇ>ðO²•§D=É'%'äI(m/-í9ñÞ%jõÛÌȲàÛÈú—c´îåÅ.ÜNr ÙÚÏ—ÓG‘øÒͳŠ"ÞK–.”‘ ˜Š¿àNÇÁ ãï²u<§ ªÂiãöØø˜p®V\«õ¨X(ªe§A¡NNØ*nm>‘Ñ‹aPƒ4œ á 'h8Q¨*Ižæ'ÉrúbôŸáD#G`¦4”j*»„kÀž¾ïOJ*_áÁ«uº§ÁpŠxâñÔÐZS‹‰' B }Ã…WhmKk{†s É&L© Å©¹¡IɤfÔ‡N-e¤§]œä9B¶yÄiÛ@¶s'{7â[î:O¸0õŠA1*Š¥âG ûñކ\/PiÕt·@µ¼WÓýÂTã4ŸŒüþ޵k÷ǽÆñ 4àƒüZžûÀïïØ©±úuV¿.ê×uêÖ®³ëpœë´Ç¹¯˜ÍeBéÝ÷/£9;bÑìtÄ¢Ù‰(OG¬ %@©Å@,ɘ¢ž°XsÂrÿ çO/ði~¯û‹hK¡]Ù\Ù²\Y«Ð‘0Õ:Ùú}2 z8¾qŒ‘39!µ„;‹ÞÞæ‹J“µwÛ2ÁûÛe³R3/Hµ¸«Å]-î$ô ¶³{^ùrÞðÔç¹±9u’Ñsd²œ>om‹õ¼í0^;ϵþg–ŸêTb-λ ƒg›"ž1…8c qF&'™`/lf°ÑÕÙÓÁè$f˜LeòBAÈ ƒ½Êý5­­¿¤Q»¼´-1.'+0ɉ=Pü}[ëü`·`«¹—3Ö”8‚X³¡KœÌÔµ$”„L–A¸Ô¾»ØÔþb×%'¹1+ˆ~wBÈ䄼PŠB…P)dÇø.mó\¸ÞtéK¼kƒð+nnài¿9]ì›ô›ŒkkÛyIÆäÚÞN0ºaÎqÝaÇæº{ż/“%úu^hù–äÓ+¦ ×y=ã_nJ›Ì†³AK[hz¯'Œ€®6¢ù–ስ÷ =|ßÂÙ–néái‡NîjÇ(²Áòò ää3ä ä_–˜§«Á™j¡F¨Ú’œøâÄ'¾8ñÅ©/;¡½ÐAè(ô2ϼ£W âôEè$t&y‰¢—(z‰¢—(z‰¢—(ú=Uó{ ÞKŒ½(:·5‰Î«ù“÷oúÐæçO«ù¤¿¸åÖä>~XZK/ªåóÅTÆÎ 4Ú_X-ç›ýRù>£ñ¹Ú“"9RX0ë¿bÖÅþá÷û]WtR×ΚÄkÇaI¦ù›Ënþö.iÕÛÕš¾LžQ÷q»!Ô„†Ð¶„aO8P&_W˜X\_?J¸ 'äA^lz±é6Qy^F8É’[þŠѧ(ªGkï¿?pÎý☢~1›ý|œáèV®À)ÝnbiÙØá:‘®+ŸíÕÖŽ#»ýG7¿üw–ŸÚu›Mc¦ZÈVRó/ÖÉ~°Íî&vŠÖ…t,IçO<{xÚï5Ì5bcë öeÄ_YÆð³kæcɾ¶êÚÎJ±œTI`YÖíŽïdR3/d}m¢Óð áòpB3ÑÍ+Žß²| ¬ÅVq«¸SÜ#P$åitl![­Oò ;Èôô?ux“3ƒ'B…»ˆOÝ&üðäK‡¯¬º3| jBKØv„=á@ø‡ðB ΄ `‹Œ¾Ú¡ßTŸ±…”©B.w«Gû'´IÆ„XÙ}p½àFÙ/Ìç Þ9,ü ûaáß\ß9.ÜÇ…ûba^Ô½R±RÜ(.Ü6LFœ»˜h¥X(–¢•C»þàµX÷ê·Šê·×(yƒ×8xÍ|ß*nwŠ{Áà$9J!M×µê´fytRV]C}æˆÓq½SÓ¹lþýŽxÉ÷ÝF£Ø zõΫw¾Ö>4ÿÄáú †Q}‹ªzTM¢j·ðØK y©Í¾¡ ÜóÍ„†± ´zF$ô8!ŸÑ ¡í"}‰˜(v]A£B4)ÄÇß’v¸b¤ëFÊ6€IòÓv¿³+UÓ/êìÿÔxÛV~‡oö»;œþâÓ_§FÀl`Ýo,zý† 5ý‡ŽzžÇK`*¾!àó‚—ænÁ~ÁaÁqÁÅ‚ËW ^«º‹àÝB]·P×9uîƒbT,KÅJq4ÆŒ§¯);ÈÈHœádáë›r Ùfj}‹cêž…ÔÌ y¡ … ç â¦$T$[‹û 7t$` 7ŠC»ýÖ·~{:bãgBø¾×û³3$íîžgšû-v®û­Õo<ÊÕq½pux„«Ã#\]?ïúüÈòS×÷4DA>\o83ÑW¡–›{}öƒ?\ÿûƒÑqð·ÿÍž_øµddÇ‘M ?™H€™Eÿ²Y#ÕbV‹:žLµÐž´_öÖvO$3âü Z†— ;ù kA§¦8{׿`Í?˜´pÕ´ø¾=á–°'GÂ/D ÄÞºÄþ…ÿk§ ÀžnötÓ3î=xe´-…þåù£Š|éz›Xõ'è|:Àí 2¶]zl»ô¸m£ç§Œžiäâ( BI°úþ‚V;öóÇŽ)U®«²€“+zékƒåîD= =À^‹Ãýõ…Ž^P®/Ôd¢«]h {8ýµÚÊ¥½+û#æã­-釱p¥S›òíj§ûn‡ä3¡;è°,• x¢j£X‹]ñ&ÐfxÞ(ŠC|ú—¨ G;ÛŽÕ Trà©«„Žf<›9!¼éq2=˜xúì'EE1*a G_bfª…¡VM™ÍA'p´çÅ/þû†ÎÁ{|¿$}å¼þï,?múÃ~Ó1¢øÐ§ï1íK9ÛÞ÷(G=ö®¸P-DíÙ’ölIm0#9Ò Û¯~n¿~L ß’¥è + ï;ëy§N'TТ9qæÔÌ •ô=k{òaBqç£P!T Uâi'ÊQ4¨™$ˆP‘ægå$ŠÆ $~Fñ3ŠÚ±b ã®åÀÄ`Äñ—þõbÓð ¶DØÛ§4=¤wkyœrH2§aƒiî0`¾tƒuwN‘ 8ï2àܰÅ!ž–ò ¶¶C3`l–ägëqAŒšŒšŒš‡}„\@.!W?êô÷n8ž›ñ ³w^Vždx’aàI† ¡$T „3< Q‡š:ÔÔ¡¦5u¨©CMjÑa hhÃ@q¯F|L”:4Ô¡¡-cÛJlÛ•š9!/ÄÀZªØ2]Z±FæÓ?&xâ‡0é&TË„j™P[&Ô–l©Å–Zìèf/@öô§‡4x³çŒ>Ø-Ž;´8Ã<¦É²­è\F;Ó1Œ ¾£i9næGö2``8r¡kä•N#¯tyðvl#OᎮ·v˜&ÉX·H‰önÆ}Û››ŽFŒ¶ägrB^ÈÊÃDLßýV<ÄôÒ}ŒþûŽO›M?0OðŒâ{Â`IØKŒš Ö¯6Ø+›Žh‘“Œ83âJ—ñ÷JޏrÄezãyy05?»;íDz–0va£ä„]×lÇn>7ûm¬XMèhµ†/<«1v~Y)9!/„*zé ÉÅ=o©ËÅI€Ntžž B$„’°`“=AMh mßl:šµ„-aGØ„/„3Cæd%ü"ô„0^é÷[GÂ#cÔ³ÕìÙjöl\ŒtÄaø èà‡q?ßÛ’BÅ] #Öm_wóûÑ_»W¬ð¼b…çµß@®!Ûü+š$ÃS{ç7É%,•'Áo›¹V}éÞ,ñßúã@=öùØÜ,ƒÌÍÒ6f}ÃhûwGÙ¼ûÝc(ý»ÇPú÷ož\ÉdÅýÆYÄ­½ÀàbŸøÝ¬ Þxz9A0KŽ¿%Q¦Å7,¶Ýi¹7hßï Ú÷{ƒ{‚îl÷î-¾ê¿ãÓÞ;>Ͻï­:Ý÷×ÁRæ~àMÌ÷þzkhÝÊÝæH÷»ýüg.»¿6sûúË.âùòëe>áù«k暘哨—’¿úÝ\U²<÷š¿ú£^äÌ"Jæ/®¬ý°²–ÁÜŒø 3ƒzhì³Ê`ˆ=¤‰œPš³±ß`F’Á¬Nô‘“?„"ôcúOÙÏ?¸å~ùCXþ©#xB ˆ›’PÖ„ ¡Ø5žVHçèÈQG}õ™iL>”! —ºjH´æ©Þ¼ˆ:ƒßÞo„Ä *ë©ì¼D3Sr^ ™¼[‹çkñœšk° a>t“÷Å|ðèY±»NÈ‹UÃBh «¨0ÙpoS|4fC@ Ó­öóäìû;:áv@ì;vy«»Þξj‹’Ñ)zÅ2ñ÷;jMÍ?EÅ:&dCÛö¦@o‡Â³\CÞ›ç}¿eТ‡ÃÁBÂmùýfجbâ ÁüNРË6lû¶î烸þ1ýBÙ>ÚB†ùÊ”rCΦ͂ë#[‡}ÏlÍè;5í¦^1@ý£8=­8\ÈX ®Ô”Mì`ódDáaÇÁsBµê…‚P*„J¡Jhmô†%ʼnæP?_É– ÕÍ~¶­ˆ$6è7ëÍGƒüß,?®¯ÖÁvºúÚîÏœ  BIl(^ãZ©¾ž¯³Mjíp»ÈDNÈ*Ký2˜|‚oè¸j;I7ÁŠÏvüüçƒ8ïÏ¿‡§ô7Ð8Ò/ ú•„Š€ä8;êéÌ80TÌ8Ì,ôwÔbžs¤Ä:Ów/À <Ÿf|]$C`‘ô9ˆF"ê¨@¨¡@„\@¦k •ë³$Ì@-Ñ×ç XÏ7´£™ÔÌÚ¤ú|_ah1¡=->q-Ô m…vBÿ0g/üM¸ôswœ"Õ¡šØõ<½² #qçzå,qºN€y±ý¯ †-xô?X4öœñbbI›ac!5õˆ–-“…ËV®iàŸíM%ƒ-B=Üa€†¥¹PF¶Þ7×~EpXc‡Ú¼Í+Ë_좯I´a1Îöxåd‚Á68!À=Ó-b)íbOv$¹„LUF‚^ó²mò|9ÀÛùIš$ÛdYÆ"ĥÀêÒa-0ƒXÄ`åòº°-ºËkØŒóɗר>­ˆ[Å`ñd—p?p-8·ƒô^1(FÁ n£ST¯"ÊiBUªÐpŠ…i©¨1(5º¥jQªW¥ª\ªW•z5·%9 äB΢ eìŽRy·úr­íL]Gð« WÛˆù6&Ó׃Åë¾ÌñCÔ$3Tœ\ž ²¶+V¬l™4ËÈ5d›,Ù÷¬_l‡ðï$>­Êr_üß¾ý'?‰žÊc<¸çÿÛtìV˜ÔÙóJöpù×$Ú˜W“õ¸š,ɲ¥h·9^HÏ߇f°½þnk¿o ›w8 Ñíö¼ñ-ËGœhx MºŽ¡d°<°K¼’µ†böKt¢ÅÁ<ÍáþxRøøÁîýxÿÁ/8.Ø*Wf, ' 1ùö¿¤ql•Ʊ^¯¨x%ɲ¦ëN"ìî :W)*e·˜Lpb2:¦œ“”s9]Ü⇹±ûøanѾ¿ÿP.,TºÇÆlBQ“‰ì U³¤š%Óɉ‡kú±ÆVS‡cI~&01}jˆ²§úÞuâK@\}U‰ôC„Î>Rgû6u‚£ÿ>èépIæA.6¬ žÉá%9<“ïio-^ :ž˜ 5‡ÝºS¹„ƒ’5¶<Ñyy 'Ý3âÖ=³u:±Ý:11çŠO¾ì€eÈÈ‚ˆÇÐ1Ѻ@;bÝw=^ñžÈdASûz#ËÕ–lÿžàéòÚŽ6|È?áCÇEÝŽ‹ºu;.ê&@œ»]îǃ:,w†LØ® ogXT´S ¸ÕÛ TÙ1dfÓà¶ ƒ£F˜èfz:°…xð9•g{1°½Èw¢#*…]¼n7xî+!ú€Ú30¥ { ï?\ýý޼çíñ“W ŠQQ«Õ+, glÔ”õw`š–£ƒš=`ø2làYê-œ"z»„p7bäb °ÉÚë€Õ¶LNÈ YÉùÅMö~3c’äý†PB ÷ P¦q®!ÁvNç/}o+渦·hþ•eeâÉá,cæ›É Ñ&—¤{*ÃáBßaXÒwh¶úGðûIh×U-ÛzŒ‡Ñõ <Õ<àÓÃ~¨1JÏðQ1>HV_†f…ð€).È_ºØg:‰\`àÖ~›`>~÷ýíZÊ&À¾i"œšO´\Ü•þaê“ À»þG¸œ?ƒ5 ëŒukÛü£ÝÕ-~ŒÛ¹úþw‚§ñ²KIWX^ŽHÇñŪ݈g·ú­Àx¡ ;vIw’­=J2.BÈØÓ̾€{Gøˆ®cìø;BÂ)¡­ÆëIšÀ<Áòáõ‚gÌ'ÂÚí„VS^í9¾H À2KBG@øCoȘ1ý`Uýõ­Æ®R&óó7w2àã…L5-z‚µ·2)#x‚%ø säæÈ7û¤²¿Ï[±_ú»n¸cÚ}Ç´ûn §Áϳõ‹zV\˜:E¯ Ç ©A( ©/¥17ŸßxÒ@*¡¹ ÉTö„Ž!ØÕݓكΠŽà 0wèƒ]¨—åyÒ—å§ôÇ\mì$á×…•ÖaÓø–d÷?'GóÅâIÞ"Ø¥ÂÆÞ,ÿ2l,A6{;/7lp$*ƒ#x´¨j…ö–xW$$šÝÆà ›ÂnË Âå Žˆn÷Èà0ÒÚÜ—¥Ê2Zø#Ç×z»rB¨· dhvg©¸³TÜ1&k±n1àÒ‘·y öN–­—IrÀø#ƒÕ›¶ip/ó­{j·ÉÎwfw;÷nI>XH2ºƒLŽÔ‰Y§fˆÕ¡†Ü@¶Æ¬E§Þ¾@çù¨ZŠZ¿*šôë×08dkۯ秾 ­ ÆÛÁšÊmmϯ Û—sLÔ˜ÅÓ®Á®¿£}ùøÁ).\ŨXP‹Bt²› 2u0²{4T 5$/6ílæDGñ4ˆÕ¹µùù Zç_$˜Ð‚¼¤­_1ÐbµY):Ø-VµÐ)P8‚õÞÛæ8X%ùñÁ'x4b̽=¬P(N+Ø;áAú‰¬\oçç¿g‘g³È'ÈgÈWÈHö“=œ · øô%Éofë¼a®&ª…¡Vh+´Ú“‚„$„ ! !ˆŸAüŒâg? 1+ÔLÂ+$AÍ &kj±¢4±« ´6“ÿN:Œñiß­êšæž±qÞ“ú6‘¥r¶ HÄî7÷dÂ+‰vlUúÆV[›ºüw‚§f¯ý®ðp°·g Píû[ðþxÁ wÂ…©W Š(-=KžÎp´ùÕ~^þðɆ[þà~.9,8.¸Xp¹àµr½Ð¨^ê\/u®—:×KëEºÔKóEêEêEêEæË{?x'»!öÁí‚·K^è»]è»[Øß-ìïæ‡—Ìâ7âÌ.L½â|yÇ;j/ÞKÇ8\5i°{Ô¾ óGÉ`”ú:¶¬¯cËú:bÝ,'B$„’PÖ µ°ú±Ï›áfê^Ç›ÉП E›pØåÄÃÎoÁ M†@#:ªÅ‘X³u€Ý¾ëQ Š^ÌI÷Ëd¬¯ïØRízô;» d[ZÚ ¿±$µñ éDNȃ6ö5q&G =;-ø ZìjBCh n(Ñ ÁÁ’x?ïJf¹†ÜBÞBÞCþcò‹Å$ÉX¢O´.`ÏÁÄÎyg“°6…÷øp*ƒErÅÌ%ƒ¬è¦`§›t6CÛÛ›:IFÛ‘À øˆ$´ËʆƒÃÚóÁ¡ø'°¸›‘L5ɉ™WjHAÌA+“  ”æÈ×vPôAó«™ïèìéMc&'„"ƒéâ †­}$ÉÑSû6øûƒº%;±­äèþdçkè€/µxÜÝ,>yä¹ÈœÉ }ûóAÒ=üØ(Ñí›s‡ÍåEÉ6º&RÓ/ˆî&w²sk‰õ |í:0/;`Eç€Cƒ|lpÍØƒNFkâÖDŸvvcÄp8˜¯ÇÓåL^(E¡B¨ª„PÄ×I+Ü«UöÊ$™×Y²Á ó½‡ÉÀ®N¿TýÕNÄ¿£SôŠ‘þŸa>T?7ó)ð$c7#X/pl»–ÎÇý±·ªÜŸ¶2>ðyÁKs·à°à¸àù¢w.; ?*Š¥b¥¸Ö°ìðJâ³½Lñ…²ƒl#Þ$ãØHJ¸ì±ìháeyÀÕï#W¿VŠ2œè‘•}g­} »29Zl {#…'‡20${a(C$„ÒbOŸßpJáx£Œô¶Û'’ GÈ6ŠxŸ/Ø8yÁXôSd°áâ‹íq¾[zu<Áä2’ÞœÍý'²ôzÁç)à ºÁ$chñì˜$Z=/xiîì\,¸\ðG¶üüàù@÷»Â ÜBa·PÈ-rQ½[X÷+5Š Ç…b©X)²„9msœ¶9NÛ§­ŠÓVÅ…¥å Eç¨ùùùùùùùùù-ÿ?x­ê.‚w uÝB]·´¿P×-Ôu uÝB]·P×-Ôu uÁù…º~¡®_¨ë—îêú…º~¡®_¨ëêÎßœýxçn¥ú/ ýÃBÿ°Ð?,ôKÿú‡…þa¡¨T½ç¿#¯+yÿéƒ~p·´±Ð9z Cê‹v»nÑíº‚Çž'vŠ^1Pÿ„¼bãñST\(S*VŠRµguÚ³:íYö¬N{V§=«ÓÎÒigé´³tÚ;:íÝzi™žõU?´L-AŸpaê½¢儼âMè÷b… ¡R¨bnùg)gþY£æµ÷:`÷:`÷:`÷:`÷:`÷ÏRˆü³ª¥Ãy¯Ãy¯Ãy¯]œKtŠ){)û¸´%¾±V¯jõªV¯jõªQ·ºmÕ´]˜ªÏ[µ¼e³“±Vã…cUk§~í4àºÝ-ÜjêìÕ«½zµW¯ö ·R’ Í3mû¼¶}^§^['¯­“×ÖÉkëä+­+•¶É™WjÝ)zÅ…ßQ±P,+E©;kUs½Ps­C­ÌnÁ~ÁA½wŠ^qa9*Š¥b¥h˨ e£ÃØ s°Z¢S¤ÆA[°ðYÈAÛ– mKKËA‘i´å Úòmy‚¶7øL)y8c#ÿŒ³ çÙ5o?gÙ¿3^˜Ï&HΦ„nz»Ê&SE@îl_Vk àûm;þW–qJÿ¼‡Öû²5ØI–ÏOÏøºæ¼‡6¶›ý#Û„dóBšâr†/ÃùjÞ]›Y€³çŽ5£cÍèX3:|†—àd7@<™ÝÁ÷ûð jSÔ¾§9Û»YÆ œLPûš¾2K^y(bqgüî­˜xB XÁºà1à Ž`½Ä%Ug¥(´&…’´^‘%'$!à`P& o>{ô-Qÿ„é4w ö ê½SôŠ ËQ±P,+ŵ šµ UFM›…©*Ù¨’’šýS+´ډýºwb÷ d½åe>úW–LjÈvtŒÊ“,ÇË-&î¸.Ôš ÏBjæ„"=ñ„@k¡$ˆJÖ^ì»Û/ÃÅZ…˵Gï8ѳ"cÂzÁÍ‚ÛoÕ;§èÕö|êóƒkµÕ¸XX/ÖKÅJq-è4ÞNSÅ©ÞÎ+ŨX(ªVNµr ­6еäœjá5^cà5~áVcà5¡ý"¡}Q/¸QçEìÏ=P³É¯%RªIÐHTÐHTXx¥Ù4[‚ê4[‚fKT­¢jU«¨ZEÕ*ªVQµŠªUÔ”ŒëÍ‚5e£–ž¸0m$Ý5àBcXh a¡1,4†…ưX¤1,4Ý M÷òYâ[>× nÜ.x»àÝ‚÷ʫ͂á-Z¿rnýÞÕuj¼hÞÊEóVjB•šP¥&T© U.Js¾ÔvCVš¨Õ³jUiÖWA¼’`Û•x•pÉ«ÛTýÁvýïÇõÂEXp\8ˆKå‚«…ƒõ2H­Díj¡ó2Žø‚î?Üÿ|ÿÁÏ×ÄÛ/îÓ/áÓ/ñÓ/ŧ_ÊO¿¬¿„9ô¿í—çÏ?ý/¶ÜçŸüçŸÂçŸâ矊Ï?•Ÿª>ÿô9>ŸÕrŸãã>ÇÇý/?ÇÇ}Žû÷9>îs|Üçø¸Ïñù¬ƒÿ¿,CáS‰ ŸJLøTb§žªO¿,uŒŸÊPü\†âç2?—¡ø¹ ÅÏe(~.CñsŠŸËPü\†âç2?•¡ø¹ ÅÏe(~.CñsŠŸËPü\†âç2?—¡ø¹ ÅÏe(~*CñsŠV†ðÓçøøÿůÏññŸãã?ÇÇŽÿÿ9>Ÿ Ÿã>Ç'|ŽOøŸð¿xÿ9>á³òaYWâ§:?Õ¹ø©ÎÅOu.~ªsŧ:W|®sÅç:W|®sÅç:W|®sÅç:W|®sÅç:W|®sÅç:W|ªsÅç:W|®sÅç:W|®sÅç:W|®sÅç:W|®sÅç:W|®sÅ\çì—e‹\|*ŧÒQ|*ŧÒQÌ¥ãcбÕ¬–æ‹1ÌbœåV›å‹a“ó ^Œ»\\p±à…‚né£7 ^D P\ø^-\W‹ÐªF/Rk9âÛ(.LeÚÔÊL¨ÕU„VWZ·°ìƒbTÔÐU„VWZ]Ehue õ:¢õn³`°.´^K‚_äœ_ Àkíbí ]¬´^³Ö/²v±xÐKXÄ%,â¢+mи„E\Â".!ª®º„ÐêB*u¼^x¾(uAK®ðɨÕ->o¬~é‚D« ­.H´º Ñê‚DµbÇb’fW\dW\ÔÄXi½_¬`´¶‚ñˆ¶&°.J´…æ}±Èûb‘÷ºJÑê*E««m±Y³VW)ÚBV°Zµ[ªÒ¥f.´¥×RPª’ºBÐê A[.V%KUR +URçüm¥JV~³`MèJ•®TéJ•®´U‹T- PµhÊ+•¶{kª¯u9'±ê½Öj²Öò²ÖX­µF®ÍÜzQOÖš7kMþµ}ÓxéìCëKÿbžö/rú*?Ðãž‘m™£b)èÕ4¨[.x&œKí¿âóÜ ›Œjá[ÝD p`$JT&œEÊìéÍ–°#ì v}èe¤Š¼4ù2RÃqO\ÀzáÙ+}~íwfk¾ +É7xu[=ÄÄ^Y¯¬WÖÇ+ëã•õñÊúxe¼ZÌaZÿ‘ä§ë{Q¿1œ¹bdƒ9B. £ÝøG‰ÿ2à,TgKðV„¹øk»ïŸöÛCÃ|ëM£‰vèm¾^1‰•‰V;Û‘MAn÷Ìä…‚u]ÕbX"œÈ€©Ü„t¸Çƒ™Ä›@°=† Ò¤ ‚xR˜gjy¹mhëLEImÔ tˆÈåÖµB[q¸S. tŠ^1(Fįo`Ö7'¦*{·y"`B¸g”ÓÑÓO…b©X)®ûq£aa²>¡†ã–ƒbTQ..¬BV¡ «Ð‡Åº+߯éð`õƒœ=ÁEŠ P„¯ :»üºÃÑÛ³±®;1÷ÕBygïÛ¦ˆ÷f«çÇ™œ"»þ“KGW=>¿ÊT“œ˜95k„Z¡­ÐNu½Ç V ÐHö˜)òM½ Ž@î(<ýwmfR3TýóØŽà PoäkÜà s7"•Æšõ=‘ B¨ã‰M"'„ˆÃ°²Õ‘n¼»¹€üýŽr¬»ûcò¯“-üê[ë)~ #Zä³§¾Æ¸½ØžoôôÍ£Ÿ¾ékܓ޷¼Qd"ÎÌNÈ6†&’Ï„ú-ŸVÊd9ÙÛ©ùïðÔfoųßñ>û~o`¿çË™¬k¨COìNÅþh¢Í zûì¤?[_Õãñã k@¤IQJk’úŽNÐ¥%p(Ûõ0°gÜ`p³†x¾0ÙÁ\µçë^xõÇ2ÐO?xB Døn³>¼ú×ÏBjæèLÀ! BI¨Hl狀ÏQ°Ç•ÿÊ2¨™,Mç:ü¯$b˜ƒ×&ðÓ??ðe°ÃÅwöJZ–ù;¼²ûØ“Awl/7 ¸ÊnèáQï![ó–dÆ£GUJên,µËäaÄÅÌ ÁÁ¦”¤¤ ¯¨.°¬—d«Ê p°}ÀýƒÃ ¡ÞB ƒ¹€\B¶õ…ßí%ÙžäLD.æñíÏ,?ÇÃî£Ùø6Œ~ÏO©&tŠ^1(FEÛÖ RôË0Âr¡á÷ç/öªýòÙŽÿôKøôKüô‹-—Œ6qK™åNèˆW|µ8!’Ï8ŒÕpÄZ„NÑ+ŨhMʸÁè#ÐqÓÀ qØÓýžÖpGæNF§¸°Œ„ØœáéÜ”ÿ•a^èýþ •é³aõ-¾Œ˜ÐV*ˆLûkúÉ#ÐD—“˜¢´d’ABþ% B¥P%´FlFFmd¢ÌÌfàÙ—L5-²DŒÀ+Czµ~4ƒ´ncÕo[¨È2Ro»ÁÆÂDµªU/d딣m¥G›áGôú#o·ù<Ýø‚åÒP(ÁÜàNfÈž—U¹ªi¹ó‚Õ–Ö˜Ê%ÅâÅ»P-ÔЙø ¡¢Õ‰Fkhd%’¬ú2/$§‡gLBÇ3nóOà ¨Ã׳©s=cè‘É Á ›îþg‚§ý¸s¬éŒWÏÍñŠNuìØJuøÄlÄ·JÿÊT*Úk7B5-¢ÌôµõØã<+Éò–˜Pý%Ûàãˆ/A ÀW6Úܹ 2rd´íÆOðté¶Ò^rÿcääxcé¾á“åñ†O–G\•qMè4 ØNŪ:Äpñµ{ó¨ÙøÖ{G«¯>Oàž6Î|}óëÃJÑΆ¼¾÷Œ—Œ@þ`û(–EÞæ®2Ë5dë&ß¶tp&óuø}´Ûïacv§Á½¶Ú{o°ŠœáD#G°òro.0@õ¿óQ× ô e÷ÞbÙÿÎIïsþîvÉýÜÙë‰wé;ŠôEú~±½À$÷sÂflx]ëPôBÝ.L{Äk‚/e,a¯ä„¼P€Ÿÿ0謭ʀO¿M?Ì]ùÞñ©¹Z?šÓà ßæŠ¿&pð*ã?/sý˜@†]÷Ë|CgÊ +¡wvÖ +³ë¿³üÔÖ—§Oî,¥# ÄÄ<Á:Ö 'EBA(¡µAÂt÷>FÈHâ‘þT׌I3ž‘#r ¨þ†!ퟙ?Ø,úÿþ¿ÿ?ÿÏJ(}(úÿš‘ƽã1#xB$„Š0Ý1qÿÊy{’½É ì4ü=˜§¶e:#@E{q:C/@7s´¾%ðÂܸ±W,þÊ`Sž‰jZ„®;eK­ˆ‰#xB$l5¡!´„´AJï¨%Rtgëq z¤OÈå]Aƒ% *ÈkXšW7{û}oó’óµSMà„“—ÞäÊÏ .NíYy>äÄ¥@z]^Ìàú²"8”é @K½Í=Á F#TãÛ¥!}[#}lÇ 5_B–å–º˜$ê_ ©™¹Ùæ·=+zÅ X(®íJÄ Õ'¯áxÕb^1xǵø¤Jõ)¨Ov{ÃU‹ù㊇ÇQ £z\htJ¡JõÁÎf¤ú0š­±½¬„œÔLóÚn¥èÍË?sPõf´F¬nVvÅ̃ìsŽw®<¡ì½bPŒŠ…b©¸55;°ò@„=rþÁµZW-jéTK§ZÚçM\+Ö¢´†ãUi¯JyMØù…íwÜ+~L¤þ¯vi u¸…çNÂÛËÁïE¿ ¤f¥ÆºÒhj¬­+©íÌ$ó÷ØÉ’lÒBž7س|‚Á‹Év%ÉØüëÓêfŠ%èÅìn^ØÈ4ÉVkÐÖr>Ð×~/ÌÖ XþÊ a ÷Žî}vPÌ´’LUæcYæñ†ÄÖÒÕ·ëI°×8ë™›Íye}Oƒ¼ÙÚч Ž`½K[]È ©Í … ¡R¨"ÙDðAÔ¬¦Îµ˜P“Ú×Bô1Ñ †V*¾=Ⱥþ†ƒÀ†ã¾k²<ÁŠà -[0ðkv2R)ÜVBTíÏì]É,cÄÕlŒÓYš†± ¬-hælKò~]üuÔñ$[›ád)ÉÑæŠfxðVsšªŽÛaÞHËpcïù`·`äÇx¡OŒÝx±F§µÑp»·CÑ Goçý¤±½šê-FŸ-FŸ­ÍÿšàYH,zB$„’° ×ÛþeÞ™·¸Ÿ5ƒ#x¼¹0n­ŸØ6†«™,ÚÛ¦7÷M /Xݶ­½”:·…“_»³ýlÃÿí˸"8‚'Øh"C'-9·'dÛv.?²üÔ´/ðò‚91V “líîÖN“%Э­ž~›àHG£Eu°Ÿø5`Ö“Àšæí`Ÿß%7#eÄŒisC±Ë°¢‘€£={œy¢š!¬óÜÞè³7Ä39Ba¹€ûàÓJ ÚU„5À¾6ËÀÄðôÀG¨ûáþF+–»ùLÁ_YÆq—¦™¡Z¨j…l€µ³Ýêõê p[Íý6ÆE»¶pëv[Ê5äÆd´÷;,`ìvÖîö•£µîÉÒ|Eõ¿² ×Ýh2šÝ\yþgœoß÷­U‰ýΚ‘ýÎ6u&°»c3:‚'ÌÏ£f@[–É yúßûù¹ð qJdÜwÞüw‚§Æ=_ûæ7ù×ÓMÑÂ{,(ìϲ‡ GÈdU쯶p“Læõ?v"b<`Dt°]ë (çž…V´èž‘P>tþ1W¸óaM«kBj[‡;ÔôþnœÀ,MöeG–#©´=­mœà8t{t°h²y0øË‹¸dzăÝxB$„€.ì`G$ÇCo­X’Ñbzkóý`í÷{~lr ÜÁ‹qþŠ<%Ê+nÇ~G§Eî[Nã3#×›á,`•þؘу,‘[ŠF)ÉÁãÉ’À°¦]·rBž)JˆÕF t>¯z‹~ž¹ûxæîcZ»Š5D$¿t#TÓbA°&ùŒÚ&øÈÚï¶@fLÎ[³-º† áCOð´è»Òoa Ew,!Û¦©çíÙ. xÇ•âÂrPŒH„ó…8ÿþ`Þ_óþ[½àF½,+EÆë¼R]çüøï;>_[ z·¤1ÀNÉ„…¢*cwÈMè°…óàZ¬; ›!jÚ¹báY±ðLUqš.ØÉè5O½f.{çzÁÍ‚ÛoÕ{˜×öšÂ^SØk<¼Æ#h<‚&hÐpƒ†4Ü ég7¯=P;h™ [‰\ä{|®¬égÏ~°†Uñ¨ŠGM°¨ 5ÁŠg ©X„\Ì!ÿûƒyöõñ›¦j¡ÊZj‹r@©Q+TÛB«o)nËE²–‹êTªž¥êYªž¥êY.jW¹¨]åB•ja½ZX׆ ´ì&ÖHWZˆ+†Ý³ö@¿Y°–­*,ÌÃÒ\Ë^ö£Æ¤ÒÒUi-™oZûï;>½Ö[÷¶’Øj \k \/J Ý¿öÁZÕÖšëEt×‹ŠºVõוÚ^dÛÚÖ JHîYK_âzÁ¢¨Ó~Òi?éž½bPŒŠ…b©X)Jr;íÝJÕX©Ú÷9íûœö}Nû>§…Úi®;÷¬¨Z9ÕJ;B§¡sëÍ‚%ömÎkP^ƒÒ®Éi×ä´krÚ59¯  =•ÓžÊiOå´§rAµÒžÊiO傪¡— ªFÕ©OQµ˜¯}Ø-„$ÿ¼Q¬:õÒx/…4JÑÊê×jªM¬&wXmÕ®D;ˆ~sNü|в7´ÛaßQ}.…8?KNDMO0L£$ æRuu¤U¹¨ÊÍã†?è©ÿݶꛨ¯#‰¸>ч­2‰Â…îÂokE):E’ÂRHù,D×¢’:PŠª¥¨:dýóA²ñ”‘ôµ·Z†L%ÁTâM%)REI‘ªTÓR¬¤¶W•ªB!µiûŒ‰ÄÙZ4_Ká[K†¬% Ö’kõÓVaÎØ_:·f K§Â\ötø°øcY¹;_[Gð,=Ì«ßß³¬þuBëúa°äæ>"ô÷üÃüeïl§]þðÉÛMÆŸ?ÌÏ™~ÿÅ-Ø/­Jf§èƒ*½hÜòO ï ÅRY<Ô8—š‰-QÆšvÃMènI?r…gä ÏÈžgÒÏøÀ1Ön(jóâßßY~jÆË¥¥1–¨æ#[_Æù¸RíXàe·9bmgB§è Åùù¡wœ[ç>¼û?óOCs9²çñÃt»ÈfùC½ü¡YþÐ.~X-ýX-ýpK~iÃÛ¬ãñCXp¹àjÁëo\+ãêƒ#RW¦¼£É¸R\qeË;®™UŸÿ{µå¡ìÝ8(FEkZ3!5³…ðËÑŽÐàåÇ ÁJþ›l\^ÓþeXñ¬gbX<”¥T_l;åÂcþú»\Ž49ЉM2 6—‘ŽF:ìÇ\åëÃøöjÛª¹ô|ß0 ú¦ØÕBv–â‚= »ß-ËÖ]nÈÖO^ñÉÎÕîöÌ2âuµïÇëé„FW,Ú'ù¤ÿÎgÌÕ&:‰¡XõÄ¡Ýû¯Œ‘PJº²Eždvì¨ñ’|Ij†Ì½Ú‰œ j€§ ‘^»Zü»â+Žk–'ýìháõÔ¤gàý¼ˆñeœ?ðýŠ[²ì![qé¢5$I–~(q½DG<®VŠVÃ2ŠÏÇ "ú`GÛó­ô“Wã~¥(~%¬ܨuÛê ‹xW›ÒËž_WÛi$[Ñëœöìx–µÃà ê„ Spt{ŒX>u¨tÀïG+QIfÚWhr;4¹Ý™2ü:#ŸÎ¾[Ã%c®!_FœíÀŽc‡]én>Âø¯,;‚5‚vÇZqÒ¢³³¦?&à½7ÓÈþÅš5»Þ1ÜèãÍÚnÀUC#/:LÐÒdO×Ey\i9í$^’Q°6eôŠQÑæ§œíð ^ó Ìç—¾M`Ïþ>VÛ€C/½}s8ÕŸ l»üaùß,Ûsß<= „H(63LÐR?»2'Á M^¨¹]Ž=Á‰qz§ß\ÄŽÎ:{íýû;>/xiîÔ¹ScgS¼/ƒóŠA1ªoØxp­Ö+Å5¢‰¯ûöŒÀ}{1yk'Àû-Î?õ[¦à7ìL„4Hä;1 biȳÏýö&ðáç—±‡R‡ÖfĤbö€õG½ìµ€#XÓÚOð€G¢2­„¼PŠB6“›Hƒ(¡ ÓøÈcU™ÔLBwº“бD›©ª„ÖTEð¢ŠU¼ÚU¼¨âE/ªxQe^ÿ÷ƒžúÔÝ0ÏL| ¢le±Ý;Q-†ê©èD÷ ºÑÝžü~P­h“Ü ÛNù$±¢Ä2®è0rhb|ܓى©ß¨©Dñ g1ôBA( B¥P%´ÙkrBª9]~àJ1*–‚Ž*¸:QY/ yôôûù¦ò½ζøôz°õïX{ðãƒO´måôxFQ9á¼fG°âˆ« ^qD’iÇb˜d´O™œ¹:_çÙW–QXÏÝ0›\ûžúÛƒjÚed©Y#Ô‚ì‹Y[riæ]Ø 6±Fßcs¢Q ˜?É`߃$Xc°”Éw&üX[ÿò:Ï’øb6^làuùU„u ®ç/[¿Øk!__;Ñí([öw;t¥ ,ÎÝ‹Ÿ@ڀΖh“‡h»zø‚<Ê`í¥½âPÚk7_‹÷õõ—ÝT›äíG&S&Ѽv3 eÂFÉÑêno´y8Ñè׬VtííèÉkŸ¦Âïðï žÎ}78ëJû#¢î펧dpm!Ï{6¯ƒ]ñò:ì(›ÃÁn¥Ï° ?l†³½|®ð™–lz1qO„H(ó—œæ[2¾=Ø)zÅ Õ¯báW©XQ 5ÒtLÇtpbQwŒºàÉPÞhD 5`ªÎ_»þ˜@êeúA€IçqXíTØKÔÞS{ÏŒ³•ù TÞSyz˜| *Ä T P@ ûH"+RÛÖMÀ+0–æ{ë²Ìà×ÌÖõ0w}_^kêl‹à¯×1߈K²E—‰¬Š¬T# ðÈršÀzâ±£l‹öà\’í¦º,·„~V´h½õöÄë›=òýõõfï¯¾ÞæYàÛ[do¸QsGðq %a‘½m.vØƒæ®æm3oKd¹6Ùÿ¿á ‡ö"ñðjÞ9Ïrgòv&ÌÓÞ,ãùèÄ÷,snñ¶¹Q67hÌßp•Ý×ócÞoó%‰óŠYñ´øÛ< INíÀr’­KÏP›ƒ»ýŽm·‹Oa^×kçU½·-.ùÌPƒË8_ 9µh´b°íYÛ?Öc&˜É¿íw³½í¯Màž0øv°=œL>Úø6É–òdzý<¯t~±Gƾ%q3Ìmç¿Ú¥jœ¹™?†y{¹Úçûƒ“S{²d>oœivžŸìMò¿£<]ì™’oö!ãoôÐYž[Ô ÔŒŽæÅ”,_h GómhðÞÓKA»uç Ó¹¦ünwv®,ƒ#|¤Ô ðÝ×d -<éKœ¶‡MåLÀ MþÁ<¡ ”„аذ8C D½ž“)+N<õôbBŸ=}öôÙSéy•ƒ¡ûÀ`ƒ bmî›&8ш˜R6iJ@¥çvÿÇ‹ŠT)R¥(ž0æÕµµ+˜Aƒ)X †Y0Ì‚aâ5#^0®4(©@É0K†Y2Ì’a– ³¯™ØãV1œj^á˜À„gdHóMm?&XdKÅ + š9±f|×ô`M¥ÖŒü|ÇZ*jxÙ:Ù Édt?Ø4ç÷vKÙ¼ÞÙÐß&°ï8÷Ä®„œ§§‚˜DBA¨kSãøòrY)ÎÝào¬!þ>lÎó&í6Ay S4½’!ÃiE3 î8öœdôgÇNÁ<àHkGXÂ_1™gm¿fñ4/OþÆÅ¿qqD’=dë·ìË¿²lçG'š#™V„>8ØËοíˆl0r²A€-ög ó%m•Ô«¢IE“5Mlãw¿±5¦‰JKÕy;‰³ƒk;¾þjÊû÷‚g°±yúèyv>Ú÷-Yî`ïàÛ£Ù³û$~ÿ¶Uêß6¤ûžeŒ²™eùoÛøýQùÒõ{œG?&ààñ†Çjov ç¯Ûf¿µ“€ÕBP+4ïÉÑÈö™3yÂ<пÙpîë­9Q6UíÉÛ/·y/õnó*Ùmo‡õ¿ÞŽöõËíhç–&€­yÁðæóg_o/¶qŸä9B. —+ÈkÈ7Èó*O–çÂu›—Ï’ø‘ÚßnÝ¥³/ßßÑ)š¾vK–ä¹€\BM¶ñä­ÇáÁ!>Bü>ó»¿P†ßv7Â_·Ûýd“šV¨`0Á\øî›­=höõއƒùTü³œ;f9_ïõön²MDïöxá×{ûÏ\)îÛ-ò>hNýûÖ:´ûO g¨ ÐßÜÙßÜÙßd„H(ó^ùýŸíÎIÜ_¬A¾Ÿì»·¿îç-ŽÑÝqܽ۞Áa.t÷¾×Æîö™É_÷ñ`£•9ÒNÌvjfᦾ¿&l {Âð‹0÷Âw;8ŸD+,É`Îú?›ù0Ê¿þlÚyåúËŸÍ‹‰°ÒÍ£àäÖ*W–çy蟺žw9þÔvþŽ0O'à05ÿ‘PXPœŒ¶"1Á³š9¡B¨¤—bqž%þ|W§_ÔvŠBñ4òâ‰W3ñÒ¾­Ÿ¨Z3q$a‚Ä HàAê‹Ä'HQ,ˆbA‹ñÃ6'ª…R%6ín؉l–”q»ÿiÜ¡±/…X+Z ?Ø"ãDtšÐ-°Vl[ñØ ¡(4OC2yB t„dÌTÓbEµlëéû;žèÒ:Ï?M˜Šä²94L›Œ+Å…e¯ ÅRÑJRFõÕ-£R³(T•B ݦGcÓüî~+Y3×ÖÖÜÿi–Žß´@§èƒbT,KÅJq-Ji°víÛUG·°¬:"2z!5‹B…P)4¯!?Ȧ%ÏãÓ?¶'ô=Ëœ0ü±wƒ³™S3{ùïÏncŸ|›•{ÂZìz¡ …¬ÛÚÍïÉϲt#»\Óçâ³;ØŽkOøìÇ£Ò(ÉÏi/;´8 zAkó"p6€vìd+ƒN+Ezhkœ Š@k‘Ö šØê^‚Š&kª4/]ýœà©¹Ìç'c:3ÈÀ(H• R傌+‚ ‚ÔŠ ýJjœø)ݤÄ 5$H Òi¯î$²ÒMé&ƒt“AœÉX5hÚÊX5¨Ò _$¤.… ‹Å(ÁIW¤O …Ø”ª¤zéC!YYŠŸÒCé!ƒô¡”(H2È Rá‚ô]A†µ¡âÜ"T2·•±– ¤îéÖ‚ zƒÔ½ u/HÝ‹2Ò2;‹Ò‹ÅùŸBd¿¨‹BˆZD©¼Qúĸâx;®\-†^(I€XÙÌTmÕW–(Cç(ƒË(õ>J½2<ŽÒ Dé£Tü(U=JåŽR¹£ÔÙ(u6JRg£ÔÙÔOÑZÊx ¢µŒž£Tá%t©ÐQæ¬QFÊQFÊQúÉ8›ÿó §?œvNV¤­ˆÒVDi+¢Œ­£Œ­£tÁQºàXhx¢ Ìœ5&ÒàDipb)ŠIó¥ù‰2@2@š¥(VJ¾IKeeØ¥‹2lˆ:lˆ6lxØÝ*©{x‚nBQNÚ±(íX”ñE”ñE”6.Jµ[3¼BZ¼B¦ï…´X…´X…Læ‹gñSZ³BZ³B¬B¬B†)…4_… L i  ˜Ò\2”/dÐRHSVÌMÙ¿”«×ÂgÑHš·Bš·Bš·Bš·BF$…›Ò„Ò„Ò„Ò„2š(¤A+¤ +¤ +¤™*dB_H£UH£UDN€±@ÒÒìÒìs³óß=í6çÕój#v$`i~ i~ âs‹óŸåì,¤ÎÒ Ò Ò s3ôóA‹irQª¿’þÒ0Ò0Ò0Ò0Ò0Ò0Ò02¼*dº_ȪUCM/NÒ -’MššBššbn\òzçŽÒ”ÏJ\x*Ÿ]'†^(ˆUiƒÖŠ­â^|*„J¡Jˆ‰&e¦”–®\©™(.-])m[)S°RZºRZ ÒIJ9Y{-¥y*¥y*zÊœ/e¼UÊ$¿”ñV)‹¥,üKG]ÊÀ¬”ö¨”V)íQ)Cª2n„Z'^Ê@§”6¦”¡M)­IY¨/¢X!±#-ËZ"¤)¥)5¤Í(5B‹ðØÚ–ºÜXÚrãdWZRZRZRZR&e¥ _JiQJiQJiQ¤9+çéÚÏ-Ír­$ªÊÀ§”V…ù"-f5·*ß&’©„µØBâ)õªdg¢’J]­ØU«Ø‰áGþ÷A¹Z,4V2V©p($S¡VK!&»äk%£Ê³Å¨¼?¥®WR×+©ë•,œHÉ©dÌRÉ(¥ jS‚ œøWÁÉ(6¥U¨d”RÉ`£’ÁF5Wö)„RÓS:âJJn¥Åª’lY?SQšH°"p?;÷ÉÀ¶fÂÎç~L æ`ßv>È y!;«€«DL 'F/xe*Öt+EG«¾îüÒ×ù³þ?v†öÏìA½‰v’¡³+G³láu'»WðO¿¹ÔJ>Hc>~qâÂ2¤·Kõÿú£'#&zV´m…v ë…b%^;1têµSŸÜ²W\ ¢Òëy鏯FÑÂá÷ÑŽ€O䄼PŠB…üò5ysöþÆxé÷ñÔ̲]ìÜÌ­Ý@®!Û.Â}¿Â/ ñ¸ZÊxžõ& ÑîDC–B}{ÛÅ…ÄoúçËÏ]ï²Ï+5j{P·`‹ºÜ¡’CáÞãæ¹âÆý0VPéhé3ÖT:»á¸r|ÂV˜½{ò̤ҧ(.ýsè>?Æå5…¡nY¼0'œ2K¨×ô à?ÑSeurat/tests/testdata/cr3.0/barcodes.tsv.gz0000644000176200001440000000012714670622051020257 0ustar liggesusers‹?Fw[barcodes.tsv%‹Á ÿîâÃ.IEND®B`‚Seurat/tests/testdata/visium_hd/binned_outputs/square_016um/spatial/tissue_positions.parquet0000644000176200001440000013050614731050553032444 0ustar liggesusersPAR1€­Ú³LÀÀÖTTCCTTCAATCCCTACG-1ACATAGG CACC CCG+CCTCTGG,G $CAGCGTTACT,GGTTGAGTZTGCTj CGAA , GTGAAT…ACT nGA?CTCGG CVmA,(TAACTGCCCAA. ,AXGCCGG²AA TGT€ AGTTÈBAªTCATG! ,A“! G, ÅUB ,”CÇCG! nAš„ AGGG1!,!º ,Á!^ßA5CT“CF!® ,C!n!#GT Û )AAT1`CTA×)C1G!­“oG1J!äATTA X%¶!{GC´ nÆ!!6AG ò!ÎAGA!^ AAGT,G!lEC ÆŽ ATCG÷GA„T!F2 BÃA(E&T BEŠToCEj °«!›CG1!`ArAÊ ,!‰!BAzCC,A%TT!‡EÝ ,!îA!U Be(!ÿQe !ŽÜe.ÃDY!®KG1¢TAJ!¦!èyœA¾®GAašA§!†!¬1J!Æ©A .°A‘C!â! BALi>aþBCTAªATY&ÓA( XGAa‚A%y Ôm/ T…2Tv,)!#rG1ä%[…’t,a”A!çaU”!!F%‹QAºH1Á,§&*7C¡i! qÞ%¡eŠ1¸%a'Ûù!Œ%§!6ñ¦eAaˆ µ–=:¥ÇT1äA÷–!½ Æ%D!!vù!-¡¿!ËB%4]!Ìu.i$Átå XÜE«òXfòÁèXeÃAX9Î!ðapòA9&a‹1¢!A!¢Ai{ Ü&!åÒC1A !JàaÌ ,&!Q ùNa~5 ˆ" !0%ž!e"‚ò•Á¡"A¾! !Ñ na›„ H¬ B îé( ÆE¹)` M¡/. ,!–a±X!]ÜaláèaJ!Õ B Ó!e®1ÎQ TA:@ ÁÍ©ÁÖ BÉ–!Ô QìÙAÁ±Uì•a!hA> BB AŒ!0 A½A%bAÙXe­A5!êCõ Ù!e°!0Æá* XAÖ!äÅ¢up¡>…%qpáDZ!FYÀGeS%I-¢AvENanA•¤a¯!ç5Œê aR% AB!å‰!구A~ã! !c Æe¡š)~Q&EA A°"t Aöá_ET±je²ŽòA ¡€%4**©‘!”£ „AöamAW !îE !§CñÒ!*Á†!`A, ,%….ÁÒ54a“E†2ö!t$ ¡vB¦A¼¡†U&áŠaßAòC1+á¶j¡W BÁ¨!v¼ i²¤ÆÁÜXGf ZIN n8rî yœ%)au…)"®…/ÃbQÀX!r AÈ šÌ E•E~qÃI‚!Âði… BÃ-a‚!; ê¡Ø~"V!!! Áø ,A‘Æ!ÿ¡` AÒAþC25%¡¡ÔaÇ.h TeË BMá‚ÁÓ Á! !! ¡Â¡° U&Aó!{Aq ,*š!‰£ e&ÄAƒuDXeG ÕeA=Kuœ tIlU&­åƒñž µaÅ÷!× š!¸aÀ 3Qh¡¦!¸ß ¼ ,Aaa1,A#Ae.Ül%yT– B!ä$!à!5 !óa*Aë¡ !CaÁÁ ñ’v ¥h”á©QìË r!ü!ì ,ð³%Ï‘ŽA‹A¡E!7 ,a%"%du!!üCÑÊA%Å/epµjAaAPaÉ"H A!ûÅwuÞšï!Ô"ø A9ÁáÔCµTA=¥¦ L °!B¡¿!` ©gy AT Ü!eÇ* )´a !8 B¥ A|!hy²A6!%zš!+ˆa›!Ä B¡ A˜î¡Ê a*C‡±Ta¡–!ÐAq ,GjI>AË +ÁA= ,Ë¡ YRÑaAl ,á!¥„!}  Á-E&1äAfáÖJ ,¡Ô-%> Á•éÀ ±(TaÞaùõ¦Áà›AhᆠBAáaÇ!Já EËá5®QìÅöò!ÿ" A¡AÚé‘,aþp!zz Xei!Ï!ÁµT,…tx "Œ Ee‚á [!rA± X…aWÒ "â ÜaŒ"n 6>¡àAð B¬ÁUAÈN , ˜Ž5`\! !#Cš!òaß>GBÿõ!Ó ¿ A§MÄ!­Á°"ü(ßA„!]k¡)" á/ap[a: na…¾Auô¡¥SAÈa ,Á¨ Ø.±Ø,aì¾yp!?êI AŠ BøP%Ö"$ƒ! ,óeBa±(°!ú!ž!® ,Aãá€A— !á%!bABa|amAÁya0mÙà!1á!=U”=lŠ& ¡~á e»Ú!‰E}„TÑàa¯S! 5Jaœ™!KA  ƨE ¸-{ëE.& )A~J .T¿!|&ô!AÓA•ü!JE•LEOa‹a[õ ÆA*C!M BA§A¾AÁ• :Êja’ ,´ ó*""ýs¡–"P Ya•AyXaÈ!KÙr!-aÜaêt ¶ ¶ø *"–æiD!6šaAÁT0"â%¡QA/• %UÁ!ieªaŸµjA-KaQh´ –o,ÎÁ…¨aß-J¡aTØYh-£©´ò{M¦-òÁÜÁˆAÚ XáÐ aä"¨ A¦A=Î=v…HE!T"¾ !±A8I– ÜÁr!†  nÆñ’"îA‘öEx!ôÁ¡qñ¼ÂA½•xM¯z nAxš¡­G‘ òIìAUA3A ¨ AÈ Be!Ía‡Ê ¡'A¸,Yìa‘º!v ,Á¨%¡‰Õö a‚( &Î a‚aõTñ8> A~aG XÙº " (!F%á"P?!e.<Oà¥É X¡zAìaò]Å)=!ê„!‚^°±jAŒE!ŽaÉ X!Øg!t: AR!YAÓ5!0¡P!Já ,…W©éÅ  A§ †a.XAÔXu— PJ54Iú½¡pÑà!‹)³AßQÖÌ Y ¯aº „A©A!Ëõz¾!á!?,F 9 °!án , ,ëy¡ AÓ]u mÝ•b!tq  B eе(efAzž*v e\†å „‰|A¯qD6Á0E nÑ¥U!3BEc¡ áUªiœ Ù2`« $ !5 Xa”¡N¡ôáD óqô!?!ß¡E!| ,¥%Á²Ʊ>e@á÷a¥"¨!jaÞ!äˆ BAiA<…qÀ‚AßõdÄéÚî $áf¢Q~Á\!Ò ¦ n)spx±€aÛ• AÄ1Œ A8EDná»­W[ Xan"Úç!Òg ù !Åà A‚A š!BÅÆóQ~)Je—%c ,)aŠE‰ q A Á6BA^etA«Æa¾R£ B(8%ú1X® %71`(þáÕB!¥åca9 ¡HÁqAX» ñaó!·° !, ˜!HÆ…raqAFiøE— nAÖ!ò!ÀA XÁ”¡Q5`A$AÁ ,!,?üd Ìåª!«õdBAÀEÜ @Aª«¡A BÁ}% aà1`A”…¤¡.Ù0:‚W ±>e½á‰åêqpáB!o)À®A2\¥?5JE!ÅnŽ òáJò¡‡A™ °ið¥ô!? ÆIæa!í ,!EyA<• e%0¾&j!ðÅ"ΡºùÌ!! X!ž¥<ÁF.N ‡%# „!>A¿Ž › BX¡Âà QÀÆ!SuôaíaÈÁýÁ5 BÈAÙâuZáŒE"£µ–L)…èÆa~ÅüU&:Õ p"ê!Ü¡,e·!¸…P }œ!ÆA,=¢¡ÐaZAÖ-!™rá|Æù! ¥A"Èa"¡© !)E¡!…!¤õè¡AÔÁ2 ,…/%M%h I¸!7!¡ ,N)¹E… °=žбA]<Á a®ò!´E¾•Leòe12 šÁÆ¡Ñ! A@ e™oá'"Î ˜+!j,áàaî%¤ ò!n…Ž…Ñrah¡y…PU” ™%Ê„ „>¡aa5 n¡†áÐQhA'¤™L¡¾á¡'"˜Á’añ¡] XÐ i2‘¤a}Åž!‹uÞ!Ã…_)ì-¸bA¡ XAŠ%³aÜu.EÍ1¢Ó¥áù¦aQA’!_• W å¼Aï"èA@%9"²¡ë!¨BJóšáp °A°áfö ÅÀ%Ñ!_ ,™±Áò!¦ ,A!y!=  elaà"° ÿ¥À!? ,!F%¦½Ø#¥ X¨AÐa\a1 a‡0ex±(‚!ÆAÕ&, !ó¡‘A"Ê B )Pp¥Äeµa¤ ¡Ð!r6 –­!"¤ZEé"2 –…9‘  !Ê%GÕFAM¡ö!§ nÑAvå”"v  Á‰€¡ ,á\AþC ò<.&Œ aÁÈi  ,¿…J,upi†á%!б–!ˆ!É!L n¿!Caç"f!úEg¡à•æ!Áñ%ÕX%­e?‚Q”ARc")!ó…‘6êáöA9! šá1¶3 °¡»ÂáV!Á ,¡:¡Æ ,XáC…A@•LØñ.&þÝ¡Ñ!"j&A·=!v" E#EbaÜaÜ©AY&¤ É‹ ÜA¢¾¥ÝÊô%Ìm ò!4!r¥ òA V¸ !EWÁ¨QÀ!ráh\aÑ ,!rè e/5âo a_ ,îAz!va$ am|!©j …™EX na±!á®!) ,üÁUB"N ù Ao54!U?…Ñ1äA"c!O" X¥LA%é.<¬Ñ\ ¿!¹¡ƒ,BEªBñ ° Þ"øaÅ!a$ „!>áa¶uDá E@°U&e.-%ÔyDa!ùt±>EQAÀ™uZAÊé -v!rA&ep54R “a °!ô!H Á´Q#5 ,åà@óõþeì!‰!ù"*a®•AÙA› Bb%e5älÁ w"h AÌE«Nõ¼AÒa—Ñ !ë XkAKË U&E¶A°…d Æå¢AŽaõ&’ ¾AK„ U”!öH nI6aàA®Î !î!!M!þ ,a”!C¥T„!€%úÁ±&  O( 0.ú!Cjš X¡ö %<µ–!ÎaAÄŒ ,ª!x4]~œWâ °¡ ©¯AÁ‘Ža@Á?A*Aõ X4%JÁó"œ!`!è…$ÕÊA¦Áà!hA B‡‡!y¡Æ ,¡TA~† $a±F!ì !°qÒ A/ emAû¡¬µ¡>XØF ,á…eÌÅ "H!š¡¡ÀJ ,!¯ažÇu.A”PA"At ,!…at¬XÃ¬Æ ,AË— EØ‘xA; jg ,aNEþ!v]&¡!ar Q<t ŸA³°!Â%Aô"ì !?AèÁ,AV n!ÎV{q l¡UEíù …DD¡õQ<%` *A.B¡ÂA—Aj nPó™uZ"–Å"’ !j¡}Un X)‰ˆ I ­á¡Ë• Iza1I±€X!à!da_ B}á0Áè %KA°Arò²!á¡™bw –!½–¡§!_%(-¡|aR¡ nTá7!ìÑ´á¸!ðyp p! BMðA•Tñ ¤( n1ŒTE£EAQ”e +½Âe-o –-v) êA›AH „!naq© š%]!a!5J7E!½"òA´Ê\ &€Izaòé „A‹¬¤, „!—aô Åan!c"Æ áöáNAZšÐaÕ.º.Eï „ÄÁ‡\M n!¤…¿^c¯ Ü"< ¼!n)7qÞÕE#q¹Øaíi* A=!ç Qª!>%"!ÿ5`c!NW¿ °…HR°æ)3EhµjA½!³EZ•Ž¡yI!9 XaC¥g‰"6ª!ÁKaa,)H!  !A+ù ¡a«ÜUR!WDA(ýN-A¬aö9Œ”!üqp¡‹ataå' n#!`™bÃ%åA%"š …û!!A|1JA 'aÄyœ¡2èaX! néAA©-¢áó¡:!5AÞ ,¡¡!ýd Á!0ÁR!aI qÈA¢i*…ÄBK¡ò2-¸E|ô Xf|-5n¡U%½IV ,!Ë%‡I 5váA…5&f ‘¥ !7š °•aqX%ÿå(  a_!”"e²…Ãâ éE‰ejA'A/ n%@a™!•uZ%¶!ÿâ™biù¡ š%±¾ÙžcAeÁvò7a¬Á"š !_AÔÁv¡0 ò8!uÂaK — A”! •L…³…¡1ÁA!‡¡á B°!!è ªETaý"(&I!¹IÝ ,Aè!HAÁa )D<5a×yXa'°!_¡ï B!ù"Ð…Fa_!`eaUá§"¬&aÄA:"Æ L% À Æ!®Efå1¸!!»„á‘ š¡bœ Lm€A4EÔ.nõaG¡n,a=Ù Anñ¼½!³%h"ÈA”ÁvAz! „Â6  ž eA"LÆ!­‡ „¡ AŽAN.ü Û ÇuôaßA•u²| ²!‹E „%ÃáËY”Á(!’1`ÜELa"ÄDÔÜ!Ä X)^m!9 n!³aãA. ,ua24a/ E‹E¨Áâñ>!£Ášn AZ¡á BAäA*æ aÒ !J„M¡Pá?BÇá ¡•6AS!½aý5úxárÁæn%‰á`C ò!ó!òRA\ ,)X¶AžQ~á3a-P aº ,W !R!8 !¸ðŠ"²Aàah!1¡ˆ , èAçp "$ ›‰˜"˜4láhå "²!˜'!¦ Xe%6 Aµ¡éá¾ Â!þau Aµµ>qpgÆ!ö!“ ,!à aðC 2 !aÊ¡õ !s¥„A“™xúSh&L%a$¡!AP"Ò¡gA£ž XaN³¥Ê54añ AZÙ , Û!hÁþ A5!áA˜a a—ÃA–!K M¡SFÕˆÜÒ…&lÁ%z!¨õN%XCgõþ…òeàZ‘L!ÉeWŸ"¶ Ia‡,ì !ÒÆa °AèeWIÖ-¸Â…a54¾† ä.b.ßA± XááAª!e  ¡°AÈ"< üá % uÈeD!äK "$ aÿ¡:Ásç ,!òÝ AnQh!ÇeÌÀ"r…¤h¥ÃUÖ…šAþ%%-¸!³!€YA¼n!é!9 „(á!Î( n%Gµ"& !ŒA~QÁ ,òí ´> AöárÁàac …6EzH aÕa!5 ,aƒ…Ha"Ò…[›Á¡5Ρ¼! 2,ìÎ1¸áa’L)"HÑÊ!(!a,ÁXjC5¸…Ž…·!ŒÜa{Ö!A9Ál0! ò­e‹ &‚1!Ñç2BÜ!xÕr‹©a*!¦ XgAv‡ál !¬•ä=v˜ÅXŒ1ah,"lJa.ávùè‘m.„A á¾ „ B=!QMRAÑ!s¡¹ ,b ´ °%D!Ô6 äo ,){a¸Q~A=ö!k ,Ah!t!‹!R a²A~Å9!oª A°Õ»mA"Áé B fax!£ !—!æ FÕÊáZešÁ6Ð)Daµ¯ B­9!8 Æn)9`® !s‰!%ú , ©À!&Æ)DÁœQ”¡â!›´!R Üa&á"…–9v!I ÆE§ATÁ9õ +!r0 B!ñÖ àt alë!žå „AŸT’ õ8A&âÁ° ,!Œa<J¿ ö °0!§IçG E‘†% ,%ARAÅ\ ,& AÒ.!M al!Œ´ Aº€ uœ¡ (!£=`AÐ %1`aþ!u!£,¥faqÙ"à6Ay!ª¡³ „å{¡Y!qD!³Á4ùy.agat›AÚ B ËAŸ Ü!v:AE ,Aý!Ï!d !GÁò!"žÜÅÄñNa l AE B­!±¡Á÷ TGe-]ìA… Aœ ,a†!¦aüC åöaÛa9JÅ­)0A ,)E« !T 6!‹",³!‡ì „7!r!› ,¡xEd%tXAãZÁÈU! )e¡´1vi³!‡ nÅÖåÕö !4 Œ °!ã¡y!©A˜ šA¿!Ao ¡îé&·°aµ":!€”–aI BP®Î!9 B›!"â òP—£ ,aD)^!ë„!1![!ñ òá‹aÄ!£ B ‹ Ü!+†!0aŽ ,… ѱ"Î åÎ!h•¤aN!² ± B'! !å•üai…P!B!*”a"úŽa?¡¡ Xås%E† ÖAìa¸ [Isup‹I«A–шaa±ö! BEÏ—ap°ïAd!A@ ,¡¡!V A#ah¡ …a×a", Á\¥UÆ &æ! E AyZÁ[ ³"Ö j!Nö9` !ŸÁž¡ „Á¾fŸ ¡!!ËÎ EæeúŽ1vdEÛañèaÆÈ!/ BgAÞAp }!Í"á!r!‰Aô ,!%¢54¡ØöE‡š6× E˜mD!H5ò!æE ¥Õ!ÿA"Ã! !Nšþ ¯X: o Ja: ,ëËAØ*ü!qw»BZa!Ê!w Bxó%Ö,¡$A‘¡Sê ,;!wÞ ‰'e- X¦Ä!♺eZ1ä& ÂSÎM!µMáR nAì!Ê!b7 AÂEªõ"i­A¶Qì!CaS! © B¡;aDA¡B º|¡:aø ! ªÒÑ…ÌÖ £-Á"AÕ¾ B¡JUP XA !-ù!­}¡(*bA;@aänA$¡´yi”Ì Ž „–%h"I7eI!? „!œAk‹Y%„Á/3&Öea61v!e÷¡,eÀAõ !š¾!Œô °AíŠòk !»kшÀ¡Öa¶a BAR¡'嘙ü Âaݵ ,ÅaAW ‰ê2 ¡%FÅ]„%˜ñ !y9`¡À¡C"ª%ú!!z" ÁE¯•x© ÞÉK šS›å&UìÒªÁa!Ú ,EËa'A~ùþAJ!Œ!"j¡KÁ4E*"˜ahTeº•Ð|Õ AÙ!ln€¡ A£ -…l Ó^ÅÝ"¸p eqa7õd!ÙÁ.\AL!^Ä¡¹a‡!„!4!y!ÀU&;a_!š­!è!´A BEN“,"ª  !¼E½µÂ?Ai¬ B!˜“Çqp%n!¢aÆYª o` ùþÔÁ*ß"RbF!G"ØAEp•¤…ƒ»a39v aµaF  a!ˆ!è„E¹A›ål Qô6ñN6 …/´qZx…&Ì…²á1ä!HaÄAká= n@ ÇAiAþËšAtåäA˜Q<‡ VeX&  !ÐE!*ðþ%œö1Îéš!Œ š!ÆaŠ!Ó/ !Â!ˆi2qZA7ƒ¡¾!6 ,ÿ!A¾ a*“!ÐÕ\)¢©Ù ,ÓijA³ ARIãž aÖ¡š( k› ÉH I ô+ a… • !qa¶kÁ8 X¡åI9¡H1vA<)!ÿX¡S-E? B­ !^"p!€3 +1ä!ðA!Oñ Ba ¥ïC"r'…©a¢5¢ÆÓWA\ BÁ'\%dUÀƒ™-%`A¹!¨•baôAÃXÕžÁ 3 4AD n%ä!KA$BOP Åz5¤(¶ú B!Ρkñ!í Ã!aö ä, !vY Á ™üáIÉK­ ,1%§UìAÕ!$".BÁØ–A BbÈ %ÿ"ú A¦AAmò ,e@sAž1v!ráv6A¬ ,C AjaýÑ=! AÁY ,Asa‚Á¼w ÉSeïÉ A8!¡A ¿Q!]¡ó à!!ì&züF%`UÀ!3¡9A¯p BÜ!¼Å½Ø!3aú1Aî up!Ú¡#a&B!Í÷!ÊA[ nA‘a!xÙraqYæµj—-aò"@AúG!F XM (TGAGTAGTT-1þˆ,À6(TTGTTCTAGATACGCT-1AAACAATCTACTAGCA-1¿ ô¾À €@€àH€À€8àˆ€&@ XàÈ€6Àxà F@‚˜à(H VÀ‚¸à0ˆ f@ƒØà8ÈvÀƒøà@‚†@„"áHH‚–À„&8á Pˆ‚¦@…*Xá XÈ‚¶À….xá `ƒÆ@†2˜á hHƒÖÀ†6¸á pˆƒæ@‡:ØáxȃöÀ‡>øá€„ AˆBâˆH„"ÁˆF8∄$&A‰JXâ˜È„&6Á‰Nxâ …(FAŠR˜â¨H…*VÁŠV¸â°ˆ…,fA‹ZØâ¸È….vÁ‹^øâÀ†0†AŒbãÈH†2–ÁŒf8ãЈ†4¦AjXãØÈ†6¶Ánxãà‡8ÆAŽr˜ãèH‡:ÖÁŽv¸ãðˆ‡<æAzØãøÈ‡>öÁ~øã ˆ@B‚ä IˆB†8ä!‰ˆD&B‘ŠXä"ɈF6‘Žxä# ‰HFB’’˜ä$(I‰JVÂ’–¸ä%0‰‰LfB“šØä&8ɉNv“žøä'@ ŠP†B”¢å(HIŠR–”¦8å)P‰ŠT¦B•ªXå*XÉŠV¶Â•®xå+` ‹XÆB–²˜å,hI‹ZÖ–¶¸å-p‰‹\æB—ºØå.xÉ‹^ö—¾øå/€ Œ`C˜Âæ0ˆIŒbØÆ8æ1‰Œd&C™ÊXæ2˜ÉŒf6ÙÎxæ3  hFCšÒ˜æ4¨IjVÚָæ5°‰lfC›ÚØæ6¸ÉnvÃ›Þøæ7À Žp†Cœâç8ÈIŽr–Üæ8ç9ЉŽt¦CêXç:ØÉŽv¶Ãîxç;à xÆCžò˜ç<èIzÖÞö¸ç=ð‰|æCŸúØç>øÉ~ößþøç? €D è@J‚Ä 9èAŠ„&D¡ YèBʆ6Ä¡yèC ‘ˆFD¢™èD(J‘ŠVÄ¢¹èE0Š‘ŒfD£ÙèF8Ê‘ŽvÄ£ùèG@ ’†D¤"éHHJ’’–Ĥ&9éIPŠ’”¦D¥*YéJXÊ’–¶Ä¥.yéK` “˜ÆD¦2™éLhJ“šÖĦ6¹éMpŠ“œæD§:ÙéNxÊ“žöħ>ùéO€ ” E¨BêPˆJ”¢ŨF9êQŠ”¤&E©JYêR˜Ê”¦6Å©NyêS  •¨FEªR™êT¨J•ªVŪV¹êU°Š•¬fE«ZÙêV¸Ê•®vÅ«^ùêWÀ –°†E¬bëXÈJ–²–Ŭf9ëYЊ–´¦E­jYëZØÊ–¶¶Å­nyë[à —¸ÆE®r™ë\èJ—ºÖÅ®v¹ë]ðŠ—¼æE¯zÙë^øÊ—¾öů~ùë_ ˜ÀF°‚ì`K˜Âư†9ìa‹˜Ä&F±ŠYìb˘Æ6ƱŽyìc ™ÈFF²’™ìd(K™ÊVƲ–¹ìe0‹™ÌfF³šÙìf8Ë™ÎvƳžùìg@ šÐ†F´¢íhHKšÒ–Æ´¦9íiP‹šÔ¦FµªYíjX˚ֶƵ®yík` ›ØÆF¶²™ílhK›ÚÖÆ¶¶¹ímp‹›ÜæF·ºÙínxË›ÞöÆ·¾ùío€ œàG¸ÂîpˆKœâǸÆ9îq‹œä&G¹ÊYîr˜Ëœæ6ǹÎyîs  èFGºÒ™ît¨KêVǺֹîu°‹ìfG»ÚÙîv¸ËîvÇ»ÞùîwÀ žð†G¼âïxÈKžò–Ǽæ9ïyЋžô¦G½êYïzØËžö¶Ç½îyï{à ŸøÆG¾ò™ï|èKŸúÖǾö¹ï}=ð‹ŸüæG¿úÙï~øËŸþöÇ¿þùï  HÀð€L ÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›&Ð 5barcodeÀ¤ÉˆÐ&ˆ´&6(TTGTTCTAGATACGCT-1AAACAATCTACTAGCA-1,LÒÚ,À(©ð¨À†øøX·ã F:c¸ºW]At¶t9áà]ïwRQۇűØ~ Û×ÆÔƒ×ød«T ätòVj­))ÑÕbð TP7àýZ˜,ÖUEBƒ4ƒð]ÄέV¥î aŒ[×4«"jr²} *ü‹'§#YJ’—ªÚì^’•írw?š”®BPmZ¨q½T±£ xžu1QA4bŸ*CkÌê+P{ çù, ²Fåƒú‘[ö3ÝN…#5¿#À¾/õÔÎQ7 Ù¢\“ÐNôvnèa¦­WR‚uý•%œl’Ï¢iym.ÕeÊæ fYÍVg1%üŠlZWIB„FCËrn ~ ÿŽ«,ÞÑ&.R´Å<‘(â} @×<7¤SÇœS)0xH{'=‡ ¥·Ø;Û†v-žðe“h?K/K™|p ©–§¡9‰ût$€ÒE)ñTED\!dXÓ}V5È¡OhGwp¬‹H kgcïšj€0f`2øä™;µY$M"Š'+…‰°ºî¼_M› —ƒ*zŽ˜,À¢(¢‡ ô†À @ €(XÀ ƒ"H˜@¡‚… 2hØÀ¡ƒ‡ Bl1‚D 'P¤P±‚E /`Ä1ƒF 7päÐñb=|üDÈ…!DŠ9‚DB%–8`ÒdÅ'O D‘2…J‚*V®`É¢e —' ˆt¹àå *aÄh01æ™2fΠI£f ›6n´¼ƒ Žsè¤iRÇÎx€°“GF:zö8àà ?4g¡B†!ê‚#‘¢EŒ9zéC$I“(U²t S&Ml6qâÑI…Oˆ> %j©R¦œB•J*«4±j•ÁÕ+X.bY© kÇ,Z]jÙº…‹S®7/t ØÅ«N¯R¾~ùìM„ #VlCYÆÚC&Bƒ(ÉB(St#Í2f‰šíqö,T±:rèØø-š´W ¦Q£Q ’µkŰMà•M[£m¸uóöêÛ-pωG®\ æàHˆt!é|dù NÄRëØ]k÷ÊÝ;xæÅ“WÝ…ªTÙÂE§Ee—3Tä0uePñrQ½øp[U«Srú±ÁêjȆ撼ÂÚ"e›Y‹î,vîÀÆ–"¨hÝà4j·­ìÂ8I’Í=\3¼Úœµ®Xµ"æÕͶ¯Q¯y‹§¶oʽ0–PE¯bÉžAæ,A´²g¼™=‹ög5i±ªE ²ÒZ©Òö ¡öß™)Äb\5‚á]!ªGnXcÈvÅÚš<¶õN·¾  ô¶U{œ²[´´PÂQyŸi™­†z>†¨ôAÏ+l£RºcL(JŒ0Ûy;8iœIMÔ'þ E€¬“Bd±]9„ñ?¾Hg7~%<ŽìăÁ‹×xª3™œø–!›m§ß1{Èj]»1€f+B¢O#6tlQD`„õ‹êa ,)r©ksŠ0¶ugLÓýÊÑ*”  •Ššsw \qГ)ØÌû[š7¼ŽÙ—? ‰DC-µóü‘exu‰|èe‚on"ä_d}•nKSFÕ5hçáÆÝ3ÚY…‚PÒ¸’¡.U2¹ $f®&Å4N…aS XK° ÿúpbŸ(¢zͤ‡³8"Uîo\W˜ë‡M—ˆùG.=5!¿ž~²=ítk^62v_}#:PW@Ãq&'VòF*¥NÇ|JCcÞpŽ˜,À¢(¢‡ ô†À @ €(XÀ ƒ"H˜@¡‚… 2hØÀ¡ƒ‡ BDX b‰ Lœ@‘BÅ -\¼€CÆ 5lÜÀ‘CÇ…}ûø)éçOY¢MÿZ “0 Àp 45È Gi©Á“*:ÈaB…eÔð ·0– ¯5 hšq–Bx‹“p F 2Db•‰JvP¡XÑâÅr3jô¡ ÀFŽÑ2uôøæ#Ht’Bvð&ÒÎH$ ,yåY*“'¹‘9…2eÈa*¹ù[¹‹e( o4ò©Ô²Ã‡._é‚•³ƒžùàÁÈHL™&s¡bb`¦/*G" Y ¢oô> ëG¤ŠÄ˜1N0±‚Í›8_fô’SçNC5'ðŒàëæ•žº|þuD º7RÆae@ÉÏvpƒ'çiÉ‚V‹(€€¡D‹ÊBPϨ2œŽÎPˆ”” ]’ö‘E…Nm{Æí¤”ÃÒ0a®õ‘Ó¦>…ÆU%.Pwè(ø3–p'£*€s 7¹Ä“:uÌ@ªU‡.Ù‚à€Õì ô¹ Ôßµ¢X³jåƒéX¹Ž¨LéVuëG®m®"tÒužW1?9ûùlU$}P°µiF+РX9n0ª‹`MÕØ1r!²BÖ©ŽsŽ‘ 2EެÈð5yH¨4Ç ëHˆ,YŽ;(%R¤êÙ:Šç ¤±^º‘άãIHo¸ª˜›{CÏ3&”¹5 array_colÀ¨0¼0&œ¢&؈¢(¢,€œŠœLÀ€Nôÿ&õ=~¿@’Ö3¯¥¯@r1J+š@º[®Ú¤@©ˆ7xÍ¡Ã@D2$—À@®Ð/m¿@„z&ßÙ»@ï<>iÉ@úZ³òÏ@X¿Šk­@Œ—›i2Ö@œ=Uƒd‹Ö@ž@5ãh´@ ƒ°60µÉ@€ ,OþêÕ@p\LÆcÉ@BP$Å ®@ðβ)ŒåÑ@˜\®Ùê=Å@È´‘[Ñ‘@jë.ÑP•Ò@à·ĸÓ@€u‘5æ¹Æ@ÀSoLáÄš@Œh óT)Ô@¸”œæ(”Ô@¢¹nË]Ñ@@ÑfÉ’ÆÑ@VÒÏ/`Õ@â„6h-Ò@þ!£èÅÕ@i;Cd'N—@oŸn„ò-½@bmâe8wÑ@†R!¹¢@èGžO;Ù¥@ÀfRNl-³@Áø={°@Þð6žcÆ@_óÚ×]Ú„@XÞ7œÔ@'JD¨@Ê@„Žrµä³Ò@P=‘X­Ñ@˜ºùª%(Ô@2Ò®1ÇÝÁ@êiØâëtË@¥3¢c[ @¤{¬žÕÿ·@(¤áϰH×@h(¤ÙY›Ñ@é6E¡ñÄ@æ ‚å6¸@övÐdl(Ÿ@³€—ôÛÄ@¢Ø¡»ŠÖ@<LññÔ@ºïQŽÂ»Î@†tXëHw¸@¦8ü@ @Îâ´œÞ Ð@^ –?Í×@ºx%œÙ½Õ@¹ëHHf±È@·¥ ­Ë@ŽeI¶0­À@ÕÂ'èÊÊ@î|~^Ô@hŸÝC_Ç@J„ÜÓŸÆ@O\)3¨®@9HßÄÀÊ@C,±¼‚‹´@ÁÕä eRÂ@SÊû¾bRÀ@´¾¤Ba¹@œlÿ¢,ÙÑ@"­šƒÕܧ@t—öw2¡@>Bgm4Ò@˜]B¿¸Ù±@”[î%ÅÉ@ðÉ*ÕǾ@áìöÑë/Î@ˆ¿Q‘åæÐ@ÌÅÆÆ]¶±@uƒfÁë·@Ä¬Ñ )ù¬@èÿ\è Ä@(Xx’˜µ×@…Dn—†Î@lÔ¥05Ò@®‡.Æ@é íWÏÏ@Ô«¬ÿ{àÏ@Þ«*‚’xÐ@qê“’Ó@™¼kyÉ@²Yˆ”'׿@<|TË„ßÒ@¦ï$n°îÔ@ÆÜ8€!Ó@<‹h`¬@ªt§2Ð÷³@b¬k3ŒÁÊ@õÉiX™ß˜@à°W@!ÇÆ@‚ ƒ­™LÆ@ÇO‹¼‚@Hϰ Ö@ø2J×tÌ@ED)!ÂÆ@ýëòÄ@Ú}fKvuÒ@Ñp—Âd^‹@ éæ?ak‡@4¶üF×Ö@g0EϨ¬Ä@úÍ_w•KÑ@$jù†!Ñ@™»åƒá¶@Iþ…ÛáÒ@ãëõ’6@BÅ´§3ÉÎ@×ðuSLgÉ@Û¤`¯féË@Hðú Ö@€§Î332—@Ž25v»Ô@åÆHD—ò@;¢“38I‡@¨×©±eùÍ@¤%¥â¨@˜Hïúj°@qÉ‚„ÀÁ@ÿÀh±½Á@¶ÜhÉ"žÌ@Ý·Jþ“Ã@ÂÄ#<,˜@…;ªkŒ”°@âåKd3§@8Ÿ…àÂ|Ñ@‡-lÆúÜÆ@¹{Œï²@”ÀrÁ/Ê@ý¢„²@w”ù‹.ËÉ@Œ‘k¦Ë@h΄ù›Ö@=æ¦*Í@)$}Y è·@ŽØÄ‘Ö@˜.Äø Á@¦…ç«1$£@ñŽ=‘ùSt@ãýOZIP¤@j³šÉ Ô@žQ `;Õ@àé¯;_2Ó@Óg5ÿ5vÀ@èÏof¶@`^©2yî¸@Õ:ÎÛXÂ@Âñª»F™@0dÒîÔ@Ü?m;SQ”@Iéê̈’­@‘¦¶È‘Í@††äweˆÕ@¯ï×KüÕµ@ÎÆ‰RɾÑ@'üí©È@‚·™fñ Å@ìŒ^”„«Õ@Ý÷*íº@pí&ârr@^F°Á×MÓ@"Äã ÞÐ@OÅÿí׽@Z#ivaÅ@¨Q%3­\Ã@r³õáoYÕ@Úa¾pw`×@48®\˜ÕÖ@Ì;œ¸ÞOÑ@pG>ŽË@¦ð”+ñÓ@¢NÊÈ×@ .ÐJ<›Å@Æ,†´¯Ò@›*ùÍ×@.ïcäŽWÐ@gއ•pÂ@˜VVe—Ã@qÐÜ]t @šØeŸŒ°@\ß))ŽÐ@h5·ó1€Ã@ÕÄÂB0¨Í@ê|]n‰íÔ@  Ë*qzÆ@Þ“ç’Ö@„ßÜ"0yÓ@ây /ÏUÐ@`ÍðÅÖÕ@,ÓxªÕŸ¸@Á á]¹²Ã@¶±§××=Æ@Ò\Š}ŸöÉ@4à±›ÐÔÖ@’Wk ½@G$å×DôÉ@d6Z†î4Ô@½ê ÿÍ*Ê@pD‘Õ@Ö–…¹´Ã@®„_ÂGË@- … µŠÇ@ªæR$lÐ@d˜7y%”Ò@ bíSÃ×@vöú3Ð@¥FX§eOÈ@Ûu{²@Ðm6u|™@[$ˆ¬Ô@ªVôx‰„Í@_»®Ÿ*ûÆ@Ù¥;ìMÀÊCÕ‘ÝÓ@Píñ“Ò@Y@ðÀ^Ðy@+ûbÂç ¡@:{ÚÔ°Ï@jÃ2#H²š@3÷a È@øù%÷¯f³@—E¼o°¨@n“pëýÃ@:Ã%™|ïÔ@¢¤EÛ–5Ñ@lªvuôšÑ@>b*»?Ñ@¹ºÍ4†bÅ@î©]cÒ@pÚW9jÀ@Z™•¯ÿ–Ö@’@Â(žÜÖ@&ÚýÝ¥¥@"™“w²i¾@Ü›ªZ`³Ì@ÜÔŸ‰Ì@ߦBÃz]±@D©ÒsVzÑ@Ϻq»<½@îܲnï®×@ª ¾PøÁ@ÞF2œ Ñ@GôèÑK|Â@Ž\–´ä×@q2íÞ«¢@%ÚßPÖÂ@ÚhùÅ‚’@MgÍ@S®Î@ ¯·±@Ìr…Ö¼@³©ð“º—Á@Vdn’Q°@ yƒ™D±@3Zv‰}¨@̧k½¦¯Ö@`Ô;µ´‚²@ДËÄ@:ê> @ªÑ@³¢Ú•bÍÍ@2néÝ6ºÑ@=Ê íÎ@¸o˜iAÕ@¬VÄu£Ö@"ÇL¤G È@ÊÝãç:(Í@Ü"ƒ®w¸@i­ˆXgª@p£ó³ Å@†{œ$£@Ã] ™Ñ@;’D:ù*±@5íµè8Õ@åy¹ Ò$Å@ŒÔ(¬7³@ÿÓ±õÏVž@`h7ô\Ç@¢¥ìë3‘µ@݇e\6u¬@~x̆.‹Ò@,]@ È@\8èô”‘@ê@ÜðeÅ@¢Jl9Õ@̵îÏ”Ð@r“ç òÐÆ@UƒÑnšÁ@!¤¯FíÝÁ@ÃS°Q¬@CUŠ3ΰ@É„høyqÈ@A—¦}:5±@x5 ié@«@ä)3¹8ÎÁ@•T4¿@…g÷¸¹@µ¢õñèÎ@ØŒ`‚¦áÑ@àyןY»@œZdÛºÕ@“ ;Ã@û×Áàµ@7O\xŽÉ@8ÆÿÝÐ@ØL IÁË@˜§ûø¿@2©J¤Õ@xÌ™H´Ö@þñÔïû§¢@ ÿ_ù1¦@Z°Ï®Í@O‚6Þ˜]©@B»PNxÇÒ@D"àŒ¥Ñ@¾”qœ[øÒ@Ô÷žé)Õ@i4£9a´@ØÒ´HSÏ@Í3àR­µ@_ãÌ]Ûµ¹@²Á²•.­µ@’y©XTÐ@!«µ!‘?µ@GΨÀ‡W¯@Ò*5†ÑÂ@˜}^mÔ@ê8òwÈ@¶ '“úÕ@;DSÌ${¦@@õDÅl¨È@+  }É@Ø\ßEFåÖ@Jè„Iã$¸@È~%@„ا@ÂͧptÁ@j^áB:ŸÐ@dY<.ÍÌÑ@ÚRË èã®@s ÷¦í<Á@ÚÄâr«Â@ú©o1Ô@Ùy ÁvÏ@¢A¤¹½ÖÔ@›÷es’@)LýuC¶@¾#maÖ@¥:m"Å@}øbªo6Í@"æ¦ÛÌ@j b±›ÆÓ@½³“Vi{¾@"Ï1Iƒ=»@ÜÄö¼6öÔ@’> <Ö@¾ä :ÕÖ@Œ¹²$qNÆ@ ™±lüÇ@)Ð~¿µDÊ@ÅGíõŸvÃ@†âÂŽGÊ@¶ÕqÅ@á‘çÀ¼@^IìTÄ;Ã@ŠS‰® Ô@ú¼HÙUÿ½@Ì9’îð=§@„#ñÑÅ÷Ã@Ú(ÇG-Ñ@ÐuJðÊFÆ@‰¬Ö¦¹@úéÇ”qº@<¬Ê£ßÝÇ@/©Æˆ‘“@Ú(c#a6Ó@æ’²?KË@úOú(É@cR>óŒCÈ@}a Ê@ÐxŒªÜ­@aTâÅ#Æ@®Ýû.˜„Ô@ü’¤ò±É­@0% ‚?=¹@t„¨ «µ@)–v'ŽÁ@Ù…ýÁ@”k*Ï< y@2 êng*Ó@jsÏ:ªÕ@3s+À@›]J$ÎW±@©tŸó¹@î°6.¾@DÙ¼k´¨™@ #¦_ÀÅ@RÓšusÊ@ÄÎÅ÷û°@.®§òÐ@‚,%%·üÀ@îk.p×@Ç" }a´@Ø( }“áÕ@‹4Vefv¡@œ}agùÓ@×:ÿ«“òÆ@S™¼~–@Ï@Ò%üîl “@½ãVy'µ@Ȇðá«À@ú>¾i1?Ë@)qØÛ¯{Å@´“ Û„¶Ñ@.ó*ýBÓ@R‘Uìc.Ö@0÷»Qã»@‡I™§ôÒ@¤€òLÆÒ@*_6h¯HÅ@€¼ÛZµÿ¶@:´plŽÒ@¡IŽyÕ@3VÚ%Ö@Áù?Ô+—¨@@º³eÈ@ð5±ñäÂ@,ûŒ—€Ð@˜s([,×@¬¡ÇYEÆÌ@ñÃÐÊ@e£]¸Ò@ðX ðšÊ@,Yþƒ¤s²@ìÖ&5°Ç@æƒ6ícÎ@ŸK¨”ºH­@T+˜Ô@b,~'gÔ@ãn»³›E¨@Ìá¢glÔ@§|úÅ3²@ä]qVÿ¡Æ@õ¬÷uæ¼@¨µüØÀ@Þ8]Z7?Ð@:ÃÖ·XÕµ@Æ…9n¤@9¿ŒÐº@o¤Ç"ŸËÍ@LÛ¬’OÄ@fÉ®‘#0Ã@´œ(½Ò@JÑ—‰@[7?†‹Ùœ@ÏÉ >^¼@}>ß(Q¨ª@÷?ã̾@œ‹e±hÍ@|L§ò§6Ô@³¿ksgrË@VSJƒÓ@¸8—Éà–Ö@%N±yº@LËn0ß³@(qL /«@R6ÂÄèÓ@²’Ù/B²@JíWÌé¸@°ˆTÂã}Ë@ñŽBÏS³@œÂ;S`OÄ@ôhб8Ñ@Î=–8±iÈ@KA·_Š6Ì@;”Éi0¿@ƒ8«Nf¾@þ¾êèTIŽ@öP‹k&¹@ÿ–X+úÁ@˜ÜøP¿§@ûf»Ô飯@¾Ñbtà×@“·ŽMÇ@’ǃÝÐ@ΘdmÆÖ@a¼¿¯*ɦ@œƒÇVi‰¬@’TºQëQÔ@öú<”ˆÉ@$аâƒÖ@®m“4<°@X쟅±lÑ@ëæ¯×c@xܹœ×åÒ@Àžè8º‡×@ õ¶ÎyÉ@tz ævÌ@ ÑdN·¤Ó@¨±ö¬-Ó@Öƒ¾*úR¾@’‡”¢5X…@ zûZÒ²@’áýœÐ@d[Joûž@ ªüí¹3Æ@³ièH®rÊ@æ}A „P…@I¶\„µç§@ü?¶âÛÒ@ aûçuœÖ@›Sœ`ŽÌ@!ŽÁ@ŸïPÊMYÍ@ú…Ï:ù’Ô@* +mÓÔ@ð(ðŸàÂ@³«îï3 ¿@ÿ5–âÐ@¹àã?iš@ÎíÕÿ,)¼@t÷hý}W×@ÒÕ·ÔÃ@ ²o´ëÉ@D è2OÑ@ú÷ƒR[ÒÎ@0 fÛdŽÑ@–|…=œÅÕ@È{–øË@™FtîÎ@(ÚÔºD÷Ä@f(¢ç6´@«^á S Å@)åý~³®@´ggïûkÆ@ÀÇ|ª˜­×@‰ÁâE¾°@eƒqQý޲@ÛúÕXhs«@¯ê1d«À@Jã4½qÀ@­¤®ñÒÇ@>²žÜ6œÐ@Ìëä@Êÿ|k‡AË@‡8t£ª£Ç@”wšöµ@ Z`çÀ@ªf…ç%ùÖ@>óÃý¶UÑ@ÅjXºÊ@˜»a¦Í~·@Xк‘šÀ´@Ì—¢,½‘Ô@кpª÷c»@ÆÊ42©XÔ@Á™‘|=²@ ×ࣇÉ@ýà_WVÄ@v8$M5Ó@”mÅÜmâÓ@ ¤¦Ìú@€Ù¥›Îº@è o°Å@Ó@ßxVÈ@ݪ©=ϵ@ü'TOÄéƒ@7y-šÏ@ ’½B'cÇ@=ráäYñ¢@¯èÆåe«@ÒæÒ­Ë{Ò@*2u}NЍ@ß~q7‰Í@éè&|ˆÈ@´¸2ÄW°@)~Ç@áì ”ÚÉ@BùZ焪Í@á)ÛGɯ@vÐD^½@Äå²{†^»@U(¶¿ž@è„캨Õ@9©3ñ]¾@ îQa6ÕÕ@bAD 0È@àUðˆBÖ@îm¤-ÄÒ@:C ؽÖ@:2bëç¯@PågèFÐ@È/ØŠÚX´@ˆ1ny1¬@øô ‚¬W¸@°å¾(¶?¶@êMËÁÎÑ@í‰0ju±@ÛÖ>À£@ ¢xïÁ®Ô@¢e«ˆOÉ@¦Ò ±¡XÐ@ö™j@ ‰Ò@R™ì04À@Ñ/ ³Q"É@iáV¶g¶@F(aç¡«@Ù %T·Ç@ÎÆw’"¡@^»l#JÒ@ÀÑ>M´§Ö@jÌý¶Ö@ï(KØýÆÄ@×Q¿ä÷ã¼@zTQ÷ÁûÒ@tŒïè!¼@¶íááÍÐ@qprþn¹@õ¼Õ…§@:÷ÌÙÕ@8zêø9ÐÔ@]Áí¶Á@.Ôç½ÀÆ@¼¢xepÔ@ø¸.èqƒ@¬th˜\íÈ@F|6ÛÕ@?^Å:(éR@Mr¶ ÆL±@t¢]p¹ÍÕ@R)ìv ¼@#º:ŠÕ@j‡¥kÎÄÍ@kø¡‚ˆÇ¡@0ð¸ZYÆ@Žâ¯0Ý›E@´DĘÕcÑ@¤BýñPµ@DA;‚bHÖ@2߈ßU*@~×DÁíƒÖ@’—û5«Ò@tÔ;ÃÁÆ@*#b厢·@aèÇdìÇ@jSÅP(@×@¤ÿYœ0^Ñ@ DOºÜçÀ@¥EÈIðJÊ@ÈUÅ|DgÓ@Vcÿ[}k×@~_-Ç1Ð@Fz6“êÒ@0õwý³Ð@¹jÒ³ïÁ@Kʇ1F@¢@¨ †ò×ÝÑ@.ÑLࡎÉ@ï ©˜C¹@ãå¸=»É@{€°¦öË@xkr@ÓÓ@”PŠTט¶@ÒTTyó«@¶ ™ò(œ£@"éœIPCÖ@L [¾êŸÑ@ˆû@)’@óD….§@˜q7I‘Ì@„JSgÊÔ@êlj(FÕ@JéQ„”Ð@–Ý(~´@¨™ RJÌ@å&»^*/”@Mè3(ÆÆ@¸"Ð˃ÍÓ@êÔ,_IÓ@Šnw°dï±@XúËbÆáÓ@KxÔS–@x³@b×@Ìv¾K›ŠÒ@<±]ZDÎ×@0ßÛa¼@µ/^œêÏ@DÁñé3 Ñ@¾«¼ƒÒ¨@†šöÊVvÒ@ÐîœSÅ@¨ÀTmÒ@ ¸=!DÒ@¥¦uoÄ@ãì*§ü¹Ì@¾þ“[Ä®×@èuöÓÖ@ða¡K_DÎ@øÜ©ËŽÞÔ@}\~®¨Bª@/f ýßÇ@ÿŽý§À@E(ÐS`l½@Êûl=Ÿ@`ÁzíF¬@"º«Æ/Ï@6a&õ»±@i¼0u‘¹@0C‹ñëÍ@¶®?Nl¦@mk_¾@îÎÚ ¼…Ò@¦)Øö9Ò@}“¼]Ì@Â?¤J×@晋AôÒ@˜’N,EÂ@¿ÇnJ†¤›@ÿ@žP™GÏ@ Ýc ¨fÀ@;Ö_&zÀ@ ÈGLë#À@Ü^üœƒÖ@õÁZÉ]¢@HVØòšüÅ@J£ ´CÏ@oUT4€©Â@J¤àÇ6NÑ@ _ù1;«Ô@}ÈÂÍú°@HdÝ Õ@vz¼½TÃÊ@ ²Ž?YeÂ@ŽóDHbÖ@gÞÚ5‰Á@üûûGŽþÌ@²LÝ(ØÒ@T$G Ñ@8¢E´Ôº@/—Ú¼ç·@–<>ö½ÒÐ@¤FÍC_WÒ@;` “é‘@R¸”™ÿ®²@Œxœ‘ÛÉ@ñƒ¯š ²@Áx jŠeµ@ˆøß97§Ò@DÜbƒªÍ@­.ÿJÄ@¢r‚À>À@„D˜÷˜€Ô@¡!zÔóÃ@öc-ùu×@î=³_jÓ@bâñ­Ò@ÓIxòf¯¾@w×îãÎsÏ@]k(}Ï@[ªùŠQQÂ@ Ð%@Š^¸@úsçùàçÐ@ žFÎ÷«@4‹ÂzWÃ@LÑ>Ÿ§qÐ@b ®|¸Ç@“ÿë'¾Ç@;^ØXÌ@w]«Ó²@äÏñá1Ñ@R·ÙjÓ@ þ Óm¹@èb¶!ωÑ@ä¹ÏÓã×@_i"\Á@¯qÖÁft§@,u†‹¦z¬@È_4à ×@è}ÏnñÂ@Ù‘‚^éÉ@¢)r.øÔ@Ù“×^u´@Ûé ¼XÏ@é3„Žæ®@I`fãy§@ivÜYÈ@Ï@UO.ú`EÃ@°yÀ õÂ@{[”=(Å@±Ù¬§ÍÅ@ÌèŠn <Å@_ÉË^sÄ@O?mÄ>Ç@33~;,Ó@ÒLX±,†È@,·/•¥žÓ@·“SlI@Î@hó-ö¢Ó@ä9Tß9oÒ@Áª{_Å·@TÈæí9~Ö@¬C6Yˆ8Ö@þËÉQƯ@Jê”Ò@ 7²ï„Â@125(Á¥Ç@ÌV#Ša×@„A¾P¶ÓÁ@b~nϺÑ@ï:Xé¾2Ä@ü϶|YéÓ@øæZ/äùÎ@JՙΆHÖ@R¤—D€ö¤@Gxk¤@ä|š|×@ŽÖÞ¿’¹@´Q iÓÍ@Ø&Å5–’Ö@“†±¹*Ë@ØU´G rÕ@¥ïoûn¢Å@/ƒ¢‚ªíÄ@^/ë6æHÕ@p´ó~öÑ@OAõlü=Å@„Ô’Ÿ q½@¸ì|ùnÍ@*b×9³Š±@æ.X sËÔ@¤À ¤lSË@,’1mlÑ@‚_Á÷ƒÔ@ŠÅçguÊ@:í§¦ï¿@ '€Ü(~@™¸1ø^Ï@ZŠŒ¢>Ñ@§ºý.Á@Pθ8¿Ô@H Ö/Ñ@äu¶ÑÌÒ@ ‚ÆBÀ@žq¾ÛÝ'Ò@Ù’_Fçö¼@­âÐ{uÀ@$H‘ú7~Ð@¼ n.rm¤@ôïsa($Ä@`¡cðXæÖ@‚7X–ËÊ­@r‚–øØ´Ö@€©ëé§šÐ@˜bûЏĢ@«@Yƒ]“@ÏcGcë¾@Ý1"SåË@sª\áË@Ùâ@ £?˜@•$‹°ÅGË@Àªý"\´Ð@\¤ª)ZÀ@è«-ŸP°@ßéGðÈ@.…f=g—³@‘¸¾4ÍÁ@:Ú $Å@@»c4—×@Â/[ƒÎ²Î@Š^þÒ@Øjxìñä§@^¡UøÂÎ@v‚RrEþº@WN,ìÈ@NÀÇN»¼@ŽJåNMÌ@Ë¢ä‡e£@[+îdðÅ´@~Æ'æÐ@ÙÚ×sM8³@ælÑÊÜ:Ó@~£gELÆ@—i¨z9£À@£0°.ù˜©@mxÕªÂ}¹@uMÈ•K À@0@RW#Ó@vÉzìÕ@U„Ž¡ÛØ¢@ðSz_Ò@©‰¥´Az¶@¹Ç Ö —@˜?PLHHÑ@3„¹øÒ3Î@,PÁp«Õ@¢]m÷² ¸@ª$)å/ÏÕ@œQ«%ÊyÕ@ïI;€!>³@@9{,BÔ@(kޝ—L×@îAA ?Ó@ ÖǥȲ™@$ó‘Õú•@Æ…j‰~³@K0 æž@"ÔðËÏÓ@qd‚Nô²@Û#8Äv¤@T›GñŽ6Ñ@ì¤pI!Ì@k§­ø†»@£ó ‹CŒÇ@3%‘×»4KÀš©˜¢”Ì©@¬Ò2×™Å@V žG÷•­@³ÁÃg‚Áª@¢Ô·wCº@Ú@FVQh§@ÜÒÉQ¢Ë@zoÄí~¸@Z™»3ê®@2Šaš"Â@b?j1qmÊ@Èc ë6GÖ@¶†…6­Ö@nú—TÈå²@VîBëº<¼@㬭 `»Î@þõÌê<ÞÓ@0¦{ÎdÕ@-¬™©¶ä«@ˆsg£$Ö@çhOŠÀÏ@¬Ù·¡°kÁ@û‡AK®iÏ@†ƒKÁ»3Ñ@I؉܇°Ë@†T ƒˆ‡¡@¿&@•Œm’°Ï@BFîD¤©Ì@úNOVoÕ@ÆšÌÈÁ@l°ôÇŒÖ@IzàòÚÅ@Þ²Ðô2=Õ@ÔùmG§{Å@'M¦bƒÄ@œ¹DfhG©@¡9óºK©@ÌQå}™òÕ@&p°][ÖÓ@·MµžBÚµ@¾#j[×@ªs'~þÁ@y$æÐF¦Ä@ìÎøÙÕ Ñ@@7H±ùŠÍ@ažu)oÓ@¬ Ùq&©Í@t:àÙܶ@3A7®@j¼»ãáìÇ@ÁpØ«Ÿ¸@oâÚÚç£@ŒJ¸ ¿@-mŒç‚@¯Ú¹N, º@”è3ÞÐ×@‰ÓôíÁ@ç1FÁÓÇ@Jëü«QÖ@Mµëƒ…²@ðôô„nI¦@á ž÷Ê@͇!¶³ëÀ@‡*tÛ›åÌ@LÂlä°Â@‘ß‘)ÕÍÁ@”‰¬¤CëÀ@®&ÚÄÏEË@â?ºÌ¾Ñ@†~a ž×@J¸äı@ãd\Žb+¯@.q„_¢@ã#Ïîhù­@ì ØcÌÀ@Õ(Iñ!²È@¦™7•X¹@ö©¹²—îÁ@¼‹ÓÒÓ@ì}%e(É@Ü·*ô½¼Ç@wÉM§ÝM™@´aϺ×@|=Yµk¾Ó@8ON šÐ@~X&ÇLxÖ@R»Û€Æ|×@V$2JmÑ@ú”sþ`qÒ@’¨JDæs¿@èÔlב`È@1_ø–/»®@"¾@¢Ç@·Çu<=àË@¤‹=Ê@b!óÉpx¨@€ÍáÔ@Ðxµ«?¼@¹í¦ì»@@cæ¸]ÿÖ@Š–_HpÂ@:š9Îä|{@D%¿ÖŽ›@’¢»Ñ¿ Ë@€d"CÆÅ@±'lÑ@|öHúÜQPÀ¹§º•I3Ç@GÿÐ=ËãÏ@táó+¢ÿÐ@ôîf ƒ˜Ò@¦+2^°Ñ@ˆ_>JÑ@äÀûqˆÔ@d ÖÏ]Ò@šÐýùkÅ@tFJiÓ@½Œ¥TK"¹@ïEåæ1-s@£Isiž@û·½´“v@üÃ&'Ó@L˜x[¾Ö@Z)ÏâGÎÓ@ìÕו'HÆ@·0ËrË@8·<#¾@£šX¤É@¹Ô³~tóÃ@ûg7Ìv®º@(µÿ2¨Ï@XÖ'¢@F†¶pÛñ@a°ïuf ™@&ÀÈ{üi@´î¬Ú¸@i>¾ÌìÈ@‰Iò[mÃ@ÊÆ'CÖ“Ñ@j”ò[Œ·@âP‰‘‡Ñ@ˆhá_—¯×@WšiKzÍ@–u«0¼@ïKíã±Ì@Dµ§…ŠŒ¼@þ_µ+B¶µ@Î$‹Ð@Š+!⇩@ v¨UšHÊ@›UR>Ê@>åªÉ3'Ô@6l“W-¬@oÔ1Û3žÉ@ð4azªÇ@KSî:ÐÇ@Zvê4×@š¢ àäîÏ@ˆ{öu°³@&Ý´æÁÐ@œŒUDŰ@`­äÀ§@K3KÁÍ@¢à^\Ï@¬,º~1ÞÊ@XwÚƒîhÄ@Œ˜¾¯¯Ð@\*œŽÕÆ@tñ§;¡ŒÎ@ª[Y­C ¦@WC¾ŸR·@wÔÉÌÃ+²@Ƽ]ÊNÂ@‹Sä-&þÁ@‚*Ê´×@úãÅ&ÒÑ@6õ´r”Õ@eFý›˜Ò@—ü—4¡@Õ Š´@ªKÇìæÒ@KpùR¶Ñ@!68lÔwÅ@w € É@*£&X~8Î@²{5ZŸÒ@”3}‡´†´@ŽƒÇRQ<Æ@\‰´‹(Ô@fÏëýòžÑ@ƒª6<€€Ê@ü¯²Ó@l0­±Ö@ÄÖWj‡E°@cü=Ð@É$¬#…%´@ø‡`ŸGèÈ@>.lj”@¸ÉüÞÊÓ@º¨:9̆Â@‚ë7½ÞÒ@ËR¨ÅóÑ@¶7à9}xÃ@8V/·~nÖ@Nj”ÂÙuÕ@2!)(3à”@J™s¶Ð@°)1¸fÒƒ@‹Qò®4ÌÍ@õ qrR@ä¾³¹lÓ@ w5MþÕ@´ô÷È@Ö@¦'§$Ô@† ë´$›Ñ@ܶW*¼@–Ïò-!¿×@³ Õ¤NÂ@îxjÒ_¾Æ@Ô°M¥´@À‘î™\Ë@¼«Ÿ¯@G‹ˆe@½¼@U_·ŒI³Í@òŽ<楣@¢÷,®¦!×@‘z`²dlÂ@XVW\.“Æ@ÖUþWøÑ@yµmÜÕ@ü2˜+Ñ@³ÿ½ø¦@ü!­ÙûÛÍ@­!j‡¦®@âž^ÕÕÖÒ@âë‹oš‘Ò@‚Ú_jŽfÑ@‚ê ãÑ@ÈãÞJ¾Ñ@{%2%ÝÆ@ÈŇ «@‹GÛ•[Ô@ŠôLò@N¢@¿Cˆ²íl½@¸aáÁm°»@lBÍ“bÒ@6b×&Ë@öoô;—·×@ZÐô¿Ò@¡ô|vîÚÀ@èþv:cØÐ@_—ãØë”@´bÙÒË@ëØJ™ÌAÈ@¨ô츮ð˜@º¯¨Ø=ÄÓ@‰&ôýSÀ@d¡Ñ¼ç³@Ì[ÎHº×@ ’³å·Ö@2C6ÚÒ@ê¼/¶:Õ@öa5ŠäÓ@ …ç‘ÅÂÐ@.ùÍk Ð@ƒ0ö ´@(¿Ê?'Á@ó‚[¦(Ó@øá€„ AˆBâˆH„"ÁˆF8∄$&A‰JXâ˜È„&6Á‰Nxâ …(FAŠR˜â¨H…*VÁŠV¸â°ˆ…,fA‹ZØâ¸È….vÁ‹^øâÀ†0†AŒbãÈH†2–ÁŒf8ãЈ†4¦AjXãØÈ†6¶Ánxãà‡8ÆAŽr˜ãèH‡:ÖÁŽv¸ãðˆ‡<æAzØãøÈ‡>öÁ~øã ˆ@B‚ä IˆB†8ä!‰ˆD&B‘ŠXä"ɈF6‘Žxä# ‰HFB’’˜ä$(I‰JVÂ’–¸ä%0‰‰LfB“šØä&8ɉNv“žøä'@ ŠP†B”¢å(HIŠR–”¦8å)P‰ŠT¦B•ªXå*XÉŠV¶Â•®xå+` ‹XÆB–²˜å,hI‹ZÖ–¶¸å-p‰‹\æB—ºØå.xÉ‹^ö—¾øå/€ Œ`C˜Âæ0ˆIŒbØÆ8æ1‰Œd&C™ÊXæ2˜ÉŒf6ÙÎxæ3  hFCšÒ˜æ4¨IjVÚָæ5°‰lfC›ÚØæ6¸ÉnvÃ›Þøæ7À Žp†Cœâç8ÈIŽr–Üæ8ç9ЉŽt¦CêXç:ØÉŽv¶Ãîxç;à xÆCžò˜ç<èIzÖÞö¸ç=ð‰|æCŸúØç>øÉ~ößþøç? €D è@J‚Ä 9èAŠ„&D¡ YèBʆ6Ä¡yèC ‘ˆFD¢™èD(J‘ŠVÄ¢¹èE0Š‘ŒfD£ÙèF8Ê‘ŽvÄ£ùèG@ ’†D¤"éHHJ’’–Ĥ&9éIPŠ’”¦D¥*YéJXÊ’–¶Ä¥.yéK` “˜ÆD¦2™éLhJ“šÖĦ6¹éMpŠ“œæD§:ÙéNxÊ“žöħ>ùéO€ ” E¨BêPˆJ”¢ŨF9êQŠ”¤&E©JYêR˜Ê”¦6Å©NyêS  •¨FEªR™êT¨J•ªVŪV¹êU°Š•¬fE«ZÙêV¸Ê•®vÅ«^ùêWÀ –°†E¬bëXÈJ–²–Ŭf9ëYЊ–´¦E­jYëZØÊ–¶¶Å­nyë[à —¸ÆE®r™ë\èJ—ºÖÅ®v¹ë]ðŠ—¼æE¯zÙë^øÊ—¾öů~ùë_ ˜ÀF°‚ì`K˜Âư†9ìa‹˜Ä&F±ŠYìb˘Æ6ƱŽyìc ™ÈFF²’™ìd(K™ÊVƲ–¹ìe0‹™ÌfF³šÙìf8Ë™ÎvƳžùìg@ šÐ†F´¢íhHKšÒ–Æ´¦9íiP‹šÔ¦FµªYíjX˚ֶƵ®yík` ›ØÆF¶²™ílhK›ÚÖÆ¶¶¹ímp‹›ÜæF·ºÙínxË›ÞöÆ·¾ùío€ œàG¸ÂîpˆKœâǸÆ9îq‹œä&G¹ÊYîr˜Ëœæ6ǹÎyîs  èFGºÒ™ît¨KêVǺֹîu°‹ìfG»ÚÙîv¸ËîvÇ»ÞùîwÀ žð†G¼âïxÈKžò–Ǽæ9ïyЋžô¦G½êYïzØËžö¶Ç½îyï{à ŸøÆG¾ò™ï|èKŸúÖǾö¹ï}=ð‹ŸüæG¿úÙï~øËŸþöÇ¿þùï  HÀð€L ÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›&þò 5pxl_row_in_fullresÀ¤¸¸¸&öÖ&ƺŽ\–´ä×@|öHúÜQPÀ(Ž\–´ä×@|öHúÜQPÀ,€œŠœLÀ€Nôÿ&˜ÓùT&¨Ê@ÄØE@~›@%ÄôÀ@]û)3ó¸Ï@âç¢M±@z¤£Ò×hÅ@¼½)ùÝã¼@H¬F‰ØÉ@ñ x’ˆøÏ@]sí¥ã´@(§–´µÎ@±²@AŒ˜ Í‘È@|eß@vª@»UÞøš³Å@º¸~&«Ô@Õ²bÏ$ Â@5 ¼¦Ï·­@ŽÎò†¾@nt³ [W«@ì„äÇ“RÁ@«#‡Ixg½@áe¸ãB¿@࿞Ÿìª@Îâà͸ïÒ@„ïÈÕ!‹Ä@Ðæ iÏ^¾@ øüÁ²Ò@š& »§7Ñ@‰X¤…À§1’ ¿×@ í`@ôsŸ7*Ñ@><:ÿ€îÌ@F"ÑÜr®@<×Ìõޱ@´³žÑ¶@ÔäÎ Ge±@kš‚)©@ecp?¸§@xy °/·Œ@Ì Ÿo£ùÓ@aÉ«ZÕ@.Ü5;6º@ðõ6þÍ@:@`ý„Ó@yrê ð½À@n.̲ðÀÞ&Í@lYƒ.ª@ÄZ•ØœCÉ@ìM!0YoÀÝ´F^‚Ñ@÷²»ÒF±È@$Mg”Ñ—Ô@U:p,1’Î@à’­‰Õ°@+bÞ+°@‹ z>sŸ@­r¡cÓ Ô@Ú¨/|Ð@ÿà ¤˜BÓ@ìz|}–«@O³áÌd±@³–‘'f~Ò@Ëb9,NÑ@6eÔ È@_ÞÛº@‘<ùÁ|µÊ@– ¹@J€%Æ@ý²mw‹…Ç@,Çh>›@„³ ’•Õ@™.Æ—§`Àé&HB|±@ *I™ÎÞÆ@§=–‚¹ÁÍ@ý_ ÊX¡@Z ‹œÔÏ@íËé’»@w¨ )Ê@Љ×+<­Â@”yB•bË@)jP kwÀzzjFÇfÑ@NæÛ"³Î@žgÏ~ÐSÄ@3oz<”Ò@Ùm Oôs£@ƒ±ëª@YÄg`µÓ@³Ü×W¦/º@œš"»{ó¼@ç½/}ÓM·@ÕõéÿŸ¢@ABtj•¹@VmÔ^^wÈ@{¶$eú–@@|pЂ½@ÌÔ0èrÊ@@ñ¾~¥@mû®³Ö/Ä@OäZ2a&Î@l[yíïÕ@Ï‹¨IðLÉ@çm³ÚýÄ@—fyñ¾@î÷¯”CÓº@²Jî0ˆÄ@¹} Ú½@( B¤Ç@°)‰ãM½@eëó™34Ç@P|tiLÒ@T§žÑ„@'µ:œÆe@¼ïÞ¿¸@»¾¿Ë«¥Ä@`L™}ZÂ@Ø „õ¡@ebm2ÃJÒ@ܼ‚·ÕzÀÙëeAÉ6Õ@ ¯O6¸†Ö@–„˜ßáf@dé¢d¨«@vÃô*ÁÖ@ÛüÀ?0ÊÖ@ùö ©AÎ@b^ÍÔÐÊ@>ó“¿@Ì·ÅÌ0Å¡@`*¯,Rš¡@$1÷ˆ¾¢Ï@K…U¶Ù¬Ö@(“&kls„Àw¡³æµ@+§—œA˜Á@2&nêÈ@†œËC4Â@.Vli…@h´ÿðBÚ«@g_¾*„ @`橤ÓòÔ@°==1ÓîÏ@íÕÛizÉ@.gé6DXÅ@WzÞ¼Í@RQ£,PÀ@: 쥱†@rLæ‹ Ç@ш›L†—±@ÀôÊ@2‰ `ö´@ÜEñØ;Ó@‹AC 7¾@ÔåÙæÛÃ@ÍfjdäÕ@)µÌ`*¼Ç@ÝùµÐ@ŸŽ„ªÕ@5X¡bš@ÿ0/þ«k´@O[;e/£@¢Í›|‹}º@ʬÂGö²@h‹îhCÐ@â٥ľ¨@¨u¯ZÉøË@»S{ À°£ÕlðÁ@½ƒQàÒ@ò¥Í°)€Æ@…µæ„Ë@¡M³üœŽÅ@†n“åŽÙÆ@ƒ#‘=Æ@ÐLC—R Ï@£¹ýjw-’Ê@{שWPéÍ@SÝz–âº@ªK_z Ñ@;ðe’´@Ùä‹£Ð@)@Ò¤„OÖ@n`ê/IXÏ@Êá1–toÀ˜LÍýÔÿ|À‹jOÖØ¾@;‘ùwFƧ@­ÌóSÒ@*jû¥P¼@gx¦­$ßÉ@ž1õ Ö@¡]ýÑPnÏ@Þ¶¸àb·@-†ÞÔÃ@«Jñûθ@ö!)µÉCÎ@n Â4Ó^ª@¡:] ¹ôÖ@@ü 'ØQÖ@ºŽô´-Á@,œÀ ¾Æ@_+{]jÚ®@<˜~ã.Ó@5Vv¿5¶@Ò¹u”¶@\avÉɇÀ“ú›åÙÔ@|$4m×uÀ)ïžB]%­@m(QœVÆ@¦k]§«…@éo³HùË@¸W"%6Ö@"]}}Ñ@ÚÒO½²íÕ@Å_®H,Ð@Î÷°t½Ê@®fÖ}A;Ç@Åy¹¿Ì­@—]Ç Ð@w7cë_²Ö@ühîH7­@B•Ÿa+5Ò@;)ù-Ô@bG»è)£@˜¼ ¸LÉ@Û.,Ž)÷’@‹ŠðØ óÅ@Ý1µO`¥¹@×y¡ $Æ@ÍÅcrìË@8nѾÓ@o©^MòÖ@á”°4êw½@ÚpåOiÉ@Ó¢ñÀ@Л5UˆÌ@D}!¯HÕÀ@íè`fkëÓ@IO!j,çÓ@ú[¹ÇãìÀ@®„i%fÆ@GgÒÉ$¨@ȇdxÛ³@HQ¯NaÓ@"ÅÕæx vÀÅMËÂŽúÐ@žm±™@k¢ÿÄ@ΠMéκ½@ºáòÞ©*ª@ò~Wüw¾Ñ@*b=8¨@gø»3›G¨@hóL&þÐ@ÑE­®C£@íð³eµ=Æ@›S0¿é#Õ@ƒ&ËëÁ@^ަüeÇ@BG)¯ÿYŒ@GvÇÃålÖ@EX¦ùsõÕ@»Pç ͹±@@ÛžG¾Í¦@­ó+½‰“@ªÐ°C¾±Ì@Ì¢ÊøÇ@F×öûs/‰@3Bº?‚¼@¯û X8©@(Ó–žI²Ñ@|Ž·N'pÐ@%2çG™r¦@yªùÂÃ@Å+lü+>Ê@ôv@cyÀ»É„Á¢@³úkeÎ{À”‚P›Þ1Ë@Kf(Ùû-Í@FMôÜ>Ö@9Ÿ+›bݺ@ù[™},Ö@¼– '¢Ó@߇’½Ô@‘õšŒó·@!Ë<‡Ô@B¯õÿ¿Õ@¸U6ebR¹@Æ„“°«¥µ@Ô½û0%M»@r!ঠÕ@ÞïDÕ@SÓ³‰UÎ@¬AüOÕ@DZ£ø†ÄË@³O©n| @p’ ÄÏeÀ„pxoó&¼@jYðS2 Ö@‘súþôòŸ@K¶Öõ{Ó@0êM­t¥¢@(Ã8q.Ç@qz@w:Î@ùÉÙø îÈ@|úÏÿ¹sÒ@æEòž*´@ôð—¯Ã<Õ@v~õ}O¶@V–¡—US­@¼äýùI @$±q¢ª„¾@uKVšü¶@òfn6 X¶@WDjŽó”´@ 5Šlå¼@¯®ü?ã~Ê@~Æÿ€¹‹Ï@âidÐPÆ@Ì40¯¯gÈ@×0$O1À@Ö]\¯mÖ¹@=*ÒÒ•'Ò@AÐù³äÕ@¥BéÛùÖ@‚ž÷ø‰†@Á…3/”>Ó@’þðv+Â@xʈ«‚Ó@ùN<éë9Õ@ÕU,ñ ¯@šTXŸ]÷Ö@çÓ¿"‰·@DÝeqÈ ½@_faRúÔ@EŒ eÚÎ@‘çŒmÆ@„jçXFˆŽ@Åk¬5kÖ@n»\i×Î@ Rç<ãÔ@BE¦Ã¦@;ÄÇ«ØO±@kgÅóeÑ@Çê¢dÖGÎ@É…mŽ0Ò@°Ï"«Ò@‚ P,–ª@c]‹›…™¶@$ ÉFÏÕÆ@ýœyøràÐ@`ñ%IÃÔÓ@£(ÙÐK<È@àc$ #Ô@ pÌCÿºÊ@Õcµ£ùÈ@x“qÉâ7È@È“F×·@Ì6HÍ ëÁ@{–ÈÌ€)Å@s:G-¢Ç@_lUùž=µ@; ÎðÞÕÐ@‹¤!’dHÇ@ˆÐ´9PÖ@‰çŒ%i¿º@Añr‚ñÒ@V‡È%Þ©ˆÀÇD^Ú¢õ¾@ãb¦p„»@Û}AÏ& Ð@ZŒÝµZwº@‡8 ¸÷Á@¿)ÚÕÓî@[ÿŽì¯Ê@¼;/™‡Ô@·\Ržþ‘Æ@îGýpÕ@*U›ÂgŠÐ@Ë­R2 @ˆG< hÃ@ÂÆFü,Ö@¯Æ²ÿAmÏ@B~ç,¶’Ó@ÁßÉšÁ@Ld§b?Ö@O*ç3Ù8Ì@}3:R\éÒ@Pû:¿q"É@ÀšHÈÀ@¶qd_Ã}Ï@€KaOÓ'Ê@~ 9º_tÐ@ñmDà.¾µ@‚»-•ì«Ò@gXgü"ÍÊ@Ég•’cB¹@Ô„¦`µ@Þì G^ÑÓ@4™*a~|¾@ô Ž„LÇ@AyX*¦Ð@$¾§‚éÞˆÀRΞŠtD@¼ ÁÐX±@ðPt| Ã@ ñù yÏ@“`íÙâðÆ@PôØÈ³$6À^yÈš«@ã¬eOñþ´@¡ÿ¹€.^@E°+É ·Ô@Œ-1å1»@òM 1¤­Ð@ƒŒgâ.ûÇ@ÆXl¬‡Ò@»R§^½@«Z“ Ç@ø4üØ>G–@ϕӱÓ@Š€'“0Ã@6?ôÂ&£@|-y­äÈ@Guå’³éÖ@²Ïa÷Ò²¼@‚C•ŽHÂ@-þ‰ ±Ç@Oñ“3€@ª ¾‹âÀ@°Í u&Àº@¦§ÏÏ@»–l|^é•@äÇ®ÂÅ@¾"Þ›ëd¢@œ=Ä_ ÃÓ@ìx­s¼@n]OÕRÇ@¸pö{)ÖÐ@J#{Ð ÜÕ@€º0.5%Ã@÷.¹šÕ@PZ6pÂÎ@Éi^MÖ@yå4ðž„”@vïï` É@9{zÌÆ@âü¦Mw«@8×ãU/D™@rR:XÕ@#¡…Óv`½@^î©ÎæÐ@ô™éV£Í­@îL—ùK{Õ@P1kˆu$Ï@oÁ§ùØÐ@ë-”¥ÒG›@\?~†ÛË@Êq]\€@YR|16³@1dmª@Ä@®ÈHËPèÄ@€Wh,õª@½huÝÐȯ@§ÞöfÎó­@5ÿ‰âîÎ@mssŠzñ­@;P@zGqÕ@ξí–G!Í@èB;ðÅ|Ô@„ó}žØÒ@š]è§x#¬@ç÷ÝMM“¿@ïÖú¿Í@sºqVFw¦@fÄZ‚7Ö@…FDzÔ´@ä–Þ=fj}@s‚s§Õ@æ,ýoÀ@çÿ  µ@ö“W½@Ó»À¡K¦@1R‹°-µ¬@B1Mã’Ñ@H#u¸TŠÓ@ÙW¨Ë‰Â@ôT¡åäô‡Àkø Ò»©£@64nKýkÀ'š×ÐË@s') éµ@7æs®Œ´@6Aûþ€®Á@Wï#èy@Õ3f“{Ë@XA ì[Î@‰>ÆÎ|Í@>ÛØp·Ê@°ž²ŸRÀ@¨È‰¶½‡@#¤“¢Ë@€â@‹Ë@¬ðšEÐ@+ì¹ HæÏ@Ùo‹Ñ•sÖ@$g»éV¶@ûÓòtæxÀL öëmÕ@"yR©¿@E»þ•j³@=ÐqÂVºÔ@\䱈½¶@ømÜÍÏÀ@€î æ*©Ö@rÚ°i}Ó@]¨˜TqÔ@]úPœÂ@Û·è®ÓÐ@ñ~˜w¾—Ñ@"ÈPÙÈ@O‹Âl»@ÚRoFðeÓ@°zá¡Tb‚@TÃ’ªzêÍ@¸<ÏÎ5Â@H#-ê ×@e;ÜÝ,±@CÀŽO $¤@oéܪ×@]7‹ZKÑ@Â}vß\ã¸@h²§nþÀ@bšÓ }5Á@4™F±[Õ@Ø!)bV¦Ç@vß>(¢)Õ@]c.ôr¿Ð@eh·Uõ¼@œú'+4ÚÅ@ Ò}Ý€t@gÙ*Ö@]«ò_Á@@U˜¢Õ@7!*å]Î@Õ\±ßÔ@OåœTÛÃ@Ô¢[‹ ,Ç@ÔŸºöÁ’ƒ@¾¤îúõÂ@ÛQ1:ád±@”†]`o'Ó@¨V»Õ$¹@-ÂÞ™ÌÙ¬@’Xy@)·@«Æs¦ÒÁ@xf%öû^·@ITÒ²"Ö@J5" ýÑ@¿ѹF©Î@KøTý=RÎ@Ÿ Š-@UÒ@Ú9üàíMÑ@çTò&§>Ï@ŒUÑÀ/|À0:èºÄ0Ô@T^ŽÍ…@¤U¥÷Ð@> OF+EÏ@déÂ>@„b1ÍPÒÃ@¡J™±¨…Ô@*ûLX“@%ümפ°@¬ÏR^ÒEŠ@˜ö¢\…Ƹ@VyZØŸÑ@9”Ð@éî+2úÝÉ@œ«ämÂÙÕ@PÑ4fß²Ô@‰eã·-Ë@¬£¤[Ù¼@ˆ}Ãh*¤Ñ@ýañ=¶É@xB$ˆ¶Â@̲08¶+Ê@T: ±CÆ@pPûVíÊ@Syf|EÔ@õ½@T`bÌ@GóÙ Ì@Áê[¾@Ñ•dˆ±Ä@œ SК@§»„»·@[j^ÏÐ@?vîwîÍ@¤!蘭kÑ@ÀÖLzÂÔ@’Ï×ú[mÀH"‘§°@ Á¥=²@}ÿ\2ʺÐ@²àôsåW‹@©$,vu¤@â½ÕÉ@J°F­áE´@³ZrvðÓ@ÕöCÇÍÒ@ Ÿžÿ½@ç!j“‚”Ö@häI}Ò@"içÈïÐ@Dü !ÃÖ@Â8¤xk@אָ­}©¬@ˆ.‡å‰QÉ@ußâMì»@Èiô °@„åì °@l$Õµ¥¥@tÍ ü½.»@0ô½D–þ?OZ{—Êc¦@õ°‰vÖ@ÕÑ utÖ@O¹ƒ%1xÆ@ó²8u+Ë@`«bKbÍ@¥îšê„gÏ@H‡È/p±@C¼_‘`­@¿Mfá§Ô@s‰FÕ@+"¾`¯¿@ðôV‰Ò@a·c8tã@ !HÿSûÆ@Ì%_™2DÇ@*IJÍE®@9åµÉypÅ@{±Æ„éÔ@Ä'þ¢zü»@•3³Ã@“Rt¿CÒ@$…Ę”À@ï(+ ¯®Ó@ø©ÿâ½@¡AúýÊ@ô@Ö)4Á@ÕÀÚóºDÓ@Ž!ï[P`Æ@ªí-ŸpÒ@â˜X'xÅ@ýû/veMÑ@,SÃê†èÆ@&xã©Á>Ó@V0ÊNÈÐ@뛟Ö"Õ@ÊÑ>`Y¥@)Lß1Ë@ð4Ur jÀi‘H>»@àzF5(,Í@¼\P?„öÑ@T â½÷‰À[^óx#«Ì@;eŒºÐ@ßQ½°@yoj[žÎ@iŽS×¥‡Ö@ÊNñ4#ò³@}[;ýÔ@•q³ìÒ@®œ­ÔŸ@ó„HU Ì@üá_ŠûÇ@1ßöÉÅ@dÝýÚ´Ò@œ tqq¼ˆ@NîÎPà„Ð@3¤ñ÷vË@ Á[ÒTÑ@¾ ×» º@÷çÛ‘¢¡@ì@R«Ô¡@ø´¸—R³Ô@‰/÷ aÔ@ì®ÇJÃÌ@ÉÕ\C^IÕ@Û“Ú^­…’@›öU®‡Ñ@ßA»FÎcÄ@1 Ÿ›!Æ@•ªÑæ,+Ò@Y§*»Õ•Ò@§/3„šAç´@Tâ 2ØÃÅ@%ü|eÚ¶@Ið™‡Všµ@Ϲú­ÀÍ@«È‘ÀH¹@¡b§laRª@Ië« õ Â@>QÐï[ƒ@ŠácdR¨@‰ÃLtÊ‘µ@^ݯ\pÆ@¯îN!„É@(,ɱº@?¬T62‚Ñ@Õù:,®±Ä@ˆ‚51¶±Å@à••ã6Ö@û^¸ Ÿ²@°¶KäõD¬@4y Há’Æ@är4’¼q@ð*€ ïÑ@‹e2}¬Ì@·DŒáÐ@Ý€cª_LÕ@PWŠÎ@wö(‹þµ @ï;£3)Â@žU"=Ü>Á@{Ш#Ê·@©L¾z¥²@N*”ƒ5µ@„„(J¨†@Ô¶ʇµÕ@H{u¬NÂÍ@ö«yz™PÄ@í&ùÐ@Þ9«6mÓ@bw¼ê/”@ÏGõ±@¶@ÎuÞsT²@ç‰^zˆªu@`³€ìª•Õ@+ÜeÓ7ñÕ@?ò~_¦@Y‹Í@²@]5ÍçŸÃ@>šŒ|„z¹@÷œ0ûÔ ¯@“u¨Ï@û]mîhÀL| »lÒ@–¥%ÎÆ@*b62ì9Ó@öØw"rq¿@ߟ)¯Ñ®z@Ç1G¡î¤@s_ƒÔ…¶@´ÍýŽÐ@©;3yJº@ƒè³eÒ@~½î´ä¦@ ‘ýÕø–@Ô‡×ÒRž@ünó‹±@ÕÀ“  ³Ä@ª¾XˆÄ@Nç¼>jkÔ@í+µ Õ@^š Ý2Ã@€œž/QYÊ@ŒÌj¹§@âMïOyÉ@Üu›ô·@ÕìŒýÒ½@×)7Püv@Üøð·—κ@Õ(öŒnÄ@G6§òãÕ@gÃzÆYÁ@†¬f£¶N¡@Ü{{RWtÍ@ znºÏoÐ@]N Þ©°¯@R1tÅ@pf¾ÆÄÇ@MÅpÛð²Ä@ºãfõv¤»@±Ò©}]wÖ@—(¤ÉÐ@:Ë>6ýÑ@%$º†µ@öå7'¹@ß’¯±ô»@njCÓ2Ó@•düÔ@ªPíeƒ©Ö@D¤ã©nÈ@s8gd Õ@ è5)·Ó@þïìJ!Ð@¬= ›ŠÚÅ@»eï¾¹8Â@ ÒêR-à¾@¨„¤ãB‘@ôPP9]Ð@å]Cê‘«Ï@¾ìD8UÔ@flŒ:ºÐ@à—Í/»„ÀÔÄ‘›i§@3«5ŽÔWÑ@UªîxÆ@É®Q?–£@œ‘Î@A];¿Ã@âÑ$÷à@˪Ð7Ð@«¦áZÐ@3¶†»@pi\d»ÿ˜@"9áVƒ`½@źPlv0Ö@§e'd—½@²GypÊÖ@@VIh´€}ÀÁh·&‹µ@Pñ{Z̨@Î¥³¤Þ¦@Ó6͇Ó&Ð@„BR‡ÊÖ@Yp¶vö|Ð@x¨G›8ÏÐ@ŠMDŽ]ï´@в®§\‚Ô@ØÙïÚÒ@äºUËÃ3·@Q¿'LôçÍ@8rÀ‚˜ª@+üïOϪ@ù‘·£˜0¸@/újø©Ö@R`¢¤Å@x cV8¦@Úpiºô»¹@–=ø¯’Ê@/Rk5£@˜üüJžÊ@ïõÕ[Ë@ÓxÈp°Œµ@×ÆÆ•“ÇÌ@@Ó•–eð @¨sp¡Ä@*']S‘±½@Íœ*ëOÔ@õ‡ÉÝtX’@G‘¥{†°@bÕ°‡#•Ô@Ìo«€Wµ—@ŸÀ-äÞÑ@¬D³ÞD²@P`ƒfSÏ»@ ”;d)wÌ@3B T˱@8IŽvÜÔ@øBåtÑÍ@˜?h¦WÐ@C“=ÝÉ‘@ÌÈ:9)“Æ@y½”&¼ŸÍ@Ñ~Š™Û~Ð@1»¦œÜdœ@‡<{ä$®@˜6÷Nc¢@“K©ÑCÖ@ÌéÝøî}Ð@Äã ×6nÖ@I±îr Ô@ûј¨P¾Ò@Å7—HšÉ@ÿ0JtÑÐ@®µ•úÁ(Ñ@•Iྫ§@M*‘)@®@`ïCÍ,¹@ã—$UÂ@¬wÁä°Ö@üâÌHl,Ó@ªÓ=…ÆÂ@¬2¤ÊaëË@çÓ[\(–Ö@Ø¥«ëåªÕ@\vÇ<|ÕÌ@`tù"³ÿÖ@šÓĶ@&2ùÓ@ÅÃÐÔ@éuͦ˭Ô@í¼âzàÅ@§Kë^ûÞÄ@k6 ·> Ô@VGÉ¢¿ìÆ@‹ò@Ë|ÀÆè<ÓxˆÈ@K6·P´›£@˜aaîZ`Á@û—‚ÇgøÖ@¢Š‚µá÷@m GOÍ@÷Ðc2‚Ö@ÚX&¦ãIÒ@‡Qõ{ÆÎ@Õ+¨>ލÍ@ ä^˜èÑ@¤}›ÍwÆ@ÐßP:¶@ͽŽ5Ò@ Âo+·rÑ@÷±‚ÖtDÕ@æïá¾Æ@Hæ^ËåÓ@ÿ¶Ñ¤^ËÔ@ œo™¨Ë@E8rnÑ@¾'ûï5Ã@ë??ºÎ®@²}úÛ»Ô@°*éžëï­@~ ?rjŒ´@f··Lž@¨Ã-d Ö@h,'i¼½§@b-ëoŽÀ@mŠgˆ Â@ðUæ†}Ò@BAÖ>9é½@˜Ú¹CÃOÏ@h«¬cÍ@ND±²ë~½@e)fè[½@Ãà¼` Â@Ui#¬tÕ@©ˆÏý(µ»@¥»xa$›¿@n¥Zg-ÛÂ@çg÷Œ_ ×@ÕÌžóYÒ@]Y–ýL”®@¢Z ܼ@Ñ–¼Lº$Â@øïÚ|Ç@£—ÿ™ÙqÐ@HQ*·Ò@€…AÐ@ª~ñY/Â@yuj ÇÊ@ ­*õÆ@²Œ¨‡Ö@Õ~.šÏ@ %çþ~Å@žŸHg§¢@hÍו‘@‰ýá[µÔ@…Ôä¯ÞSv@/”X°¿¸@5,O™”—@¶<ÕüSkË@3ßX¶„ûÌ@ÞùjºëÆ@çu±Aи@iÖñ!¥@9õ•= þÔ@âÓ™|ê»@ìêê]>Å@CºÌae¿@7(õ¶é¡@R¨Ä8£@º8„¶@GÏôæø†Ì@c˜´—Ë;š@aû/e²¼@ÌpBbE_†À²'³ÖM†ÀÖ%¬†‚m¬@èNWè1ÖÔ@ó=CZv‚Ì@^MIÀX¬Ï@­—²S¤ý¶@¬zÌ(>e­@×kê9î£@>ûµ´ÖåŽ@íeÖ=ì½Â@Ãß¾–±@q[§lÊ@9/e˜ïüÐ@\”ÅoÇ‘@@(¦DiM©@…(s€Ñ@[³JÈl @`9ÕX¸t³@”Î 8ÕbÎ@†<>²ÐÈ@‡åõ‰µ@2Å4˜‰Ó@¿&‡ð¦°@Ê`‡H‡«Ã@3áÄ™õÑ@Þé¤õpÍ@F<•ÿض´@ ’›Ø·e¬@t¾wÖ„¶@¿ÝÁ !˜Æ@Ö ¶r¾@~ᣨù¿Ç@æ¥ëENÔ@©ãB`Ò@ïkëšDÖ@¯¬WPØÂ@7^“%>Ö@Ê¿5Q™@»?pÌÖ¼¢@(šGº@J€žYÔÒÔ@{I¡Fã´@¤-áçÇ¢@”"LeÍÆ@PîÞ†Å_Á@7ÔÎSœÐ@€©Oà˜Ð@ß–4T­¼@¬aÖÓ@\ÿ/jÖ@—328E½@»CÉBžóÐ@;ü¦ˆ™ÀÄ@Bøá€„ AˆBâˆH„"ÁˆF8∄$&A‰JXâ˜È„&6Á‰Nxâ …(FAŠR˜â¨H…*VÁŠV¸â°ˆ…,fA‹ZØâ¸È….vÁ‹^øâÀ†0†AŒbãÈH†2–ÁŒf8ãЈ†4¦AjXãØÈ†6¶Ánxãà‡8ÆAŽr˜ãèH‡:ÖÁŽv¸ãðˆ‡<æAzØãøÈ‡>öÁ~øã ˆ@B‚ä IˆB†8ä!‰ˆD&B‘ŠXä"ɈF6‘Žxä# ‰HFB’’˜ä$(I‰JVÂ’–¸ä%0‰‰LfB“šØä&8ɉNv“žøä'@ ŠP†B”¢å(HIŠR–”¦8å)P‰ŠT¦B•ªXå*XÉŠV¶Â•®xå+` ‹XÆB–²˜å,hI‹ZÖ–¶¸å-p‰‹\æB—ºØå.xÉ‹^ö—¾øå/€ Œ`C˜Âæ0ˆIŒbØÆ8æ1‰Œd&C™ÊXæ2˜ÉŒf6ÙÎxæ3  hFCšÒ˜æ4¨IjVÚָæ5°‰lfC›ÚØæ6¸ÉnvÃ›Þøæ7À Žp†Cœâç8ÈIŽr–Üæ8ç9ЉŽt¦CêXç:ØÉŽv¶Ãîxç;à xÆCžò˜ç<èIzÖÞö¸ç=ð‰|æCŸúØç>øÉ~ößþøç? €D è@J‚Ä 9èAŠ„&D¡ YèBʆ6Ä¡yèC ‘ˆFD¢™èD(J‘ŠVÄ¢¹èE0Š‘ŒfD£ÙèF8Ê‘ŽvÄ£ùèG@ ’†D¤"éHHJ’’–Ĥ&9éIPŠ’”¦D¥*YéJXÊ’–¶Ä¥.yéK` “˜ÆD¦2™éLhJ“šÖĦ6¹éMpŠ“œæD§:ÙéNxÊ“žöħ>ùéO€ ” E¨BêPˆJ”¢ŨF9êQŠ”¤&E©JYêR˜Ê”¦6Å©NyêS  •¨FEªR™êT¨J•ªVŪV¹êU°Š•¬fE«ZÙêV¸Ê•®vÅ«^ùêWÀ –°†E¬bëXÈJ–²–Ŭf9ëYЊ–´¦E­jYëZØÊ–¶¶Å­nyë[à —¸ÆE®r™ë\èJ—ºÖÅ®v¹ë]ðŠ—¼æE¯zÙë^øÊ—¾öů~ùë_ ˜ÀF°‚ì`K˜Âư†9ìa‹˜Ä&F±ŠYìb˘Æ6ƱŽyìc ™ÈFF²’™ìd(K™ÊVƲ–¹ìe0‹™ÌfF³šÙìf8Ë™ÎvƳžùìg@ šÐ†F´¢íhHKšÒ–Æ´¦9íiP‹šÔ¦FµªYíjX˚ֶƵ®yík` ›ØÆF¶²™ílhK›ÚÖÆ¶¶¹ímp‹›ÜæF·ºÙínxË›ÞöÆ·¾ùío€ œàG¸ÂîpˆKœâǸÆ9îq‹œä&G¹ÊYîr˜Ëœæ6ǹÎyîs  èFGºÒ™ît¨KêVǺֹîu°‹ìfG»ÚÙîv¸ËîvÇ»ÞùîwÀ žð†G¼âïxÈKžò–Ǽæ9ïyЋžô¦G½êYïzØËžö¶Ç½îyï{à ŸøÆG¾ò™ï|èKŸúÖǾö¹ï}=ð‹ŸüæG¿úÙï~øËŸþöÇ¿þùï  HÀð€L ÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›&ž­ 5pxl_col_in_fullresÀ¤¸¸¸&–‘&æôؼT»è×@T â½÷‰À(ؼT»è×@T â½÷‰À,|5schema  %barcode%L% in_tissue% array_row% array_col %pxl_row_in_fullres %pxl_col_in_fullresÀl&Ð 5barcodeÀ¤ÉˆÐ&ˆ´&6(TTGTTCTAGATACGCT-1AAACAATCTACTAGCA-1,&ÈÕ5 in_tissueÀÞê&ŽÒ&ÞÑ(,&¦‡5 array_rowÀ˜0¬0&®ð&úÖ¢(¢,&”¹5 array_colÀ¨0¼0&œ¢&؈¢(¢,&þò 5pxl_row_in_fullresÀ¤¸¸¸&öÖ&ƺŽ\–´ä×@|öHúÜQPÀ(Ž\–´ä×@|öHúÜQPÀ,&ž­ 5pxl_col_in_fullresÀ¤¸¸¸&–‘&æôؼT»è×@T â½÷‰À(ؼT»è×@T â½÷‰À,ŠžÀ&Ê¥ ARROW:schema¸/////6ABAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAYAAABEAQAA9AAAALwAAACEAAAAQAAAAAQAAADk/v//AAABAxAAAAAkAAAABAAAAAAAAAASAAAAcHhsX2NvbF9pbl9mdWxscmVzAADG////AAACABz///8AAAEDEAAAACwAAAAEAAAAAAAAABIAAABweGxfcm93X2luX2Z1bGxyZXMAAAAABgAIAAYABgAAAAAAAgBc////AAABAhAAAAAcAAAABAAAAAAAAAAJAAAAYXJyYXlfY29sAAAAmP///wAAAAEgAAAAkP///wAAAQIQAAAAHAAAAAQAAAAAAAAACQAAAGFycmF5X3JvdwAAAMz///8AAAABIAAAAMT///8AAAECEAAAACQAAAAEAAAAAAAAAAkAAABpbl90aXNzdWUAAAAIAAwACAAHAAgAAAAAAAABIAAAABAAFAAIAAYABwAMAAAAEAAQAAAAAAABBRAAAAAcAAAABAAAAAAAAAAHAAAAYmFyY29kZQAEAAQABAAAAA== parquet-cpp-arrow version 15.0.2l{PAR1Seurat/tests/testdata/visium_hd/binned_outputs/square_016um/spatial/tissue_hires_image.png0000755000176200001440000037640014731050553032004 0ustar liggesusers‰PNG  IHDRpÇsµ§ IDATxœìÁ€þ¯î €Ùƒ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU&ìùM IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUµ³ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUª3< IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU/rôß IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÙ!$I IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÇbã— IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU*zUT IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ›#h IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU7)~ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUðjÙ• IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUèùÚ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUµ[#£ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUå\Gm IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS“ˆ÷ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUƒµžîIDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¥=8$ôÿµ#¬°-­ÍC”IEND®B`‚Seurat/tests/testdata/visium_hd/binned_outputs/square_016um/filtered_feature_bc_matrix.h50000644000176200001440000070561314731050553031567 0ustar liggesusers‰HDF  ÿÿÿÿÿÿÿÿ‹‹ÿÿÿÿÿÿÿÿ`ˆ¨ˆ¨TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàHEAPXÈmatrixHHhTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ80HEAPXHˆbarcodesdataindicesindptrshapefeaturesSNOD Hh‡ ÿÿÿÿÿÿÿÿ deflate€ %z‚]PSNOD(°8°6Ø6ø8 ð(0$0p-TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPæwj6ë † GCOLATAACGCCGGAGGGTC-1ATAACGGAGTCCAACG-1ATAACGTTACCTCCAC-1ATAAGGTGGAGAACAT-1ATAAGTAGGATTCAGA-1ATAAGTAGGGCGACTC-1ATAAGTTACCGCGACG-1ATAATAGCTGTTGAAT-1 ATAATCTTGGAGAACC-1 ATAATTAGCTAAGTAG-1 ATACAGGCCCTCCAAT-1 ATACCACGGGCAACTT-1 ATACCGTCATCCATAA-1ATACCTAACCAAGAAA-1ATACGCCGGCGAAACC-1ATACGGAACGTCGTTT-1ATACGGGTTTCGATTG-1ATACGTACTTAGCCAC-1ATACGTCCACTCCTGT-1ATACGTTATGCACGGA-1ATACTACCCGTACCAC-1ATACTAGCATGACCCT-1ATACTGCCTTACACCG-1ATAGACAACGGGACCT-1ATAGACGAAGAGAAAG-1ATAGAGTACTGGGACA-1ATAGAGTTATCAACTT-1ATAGCAACTAGGGAAG-1ATAGCCATAACAGTCA-1ATAGGCGGCTATAGAA-1ATAGGCTAGCTTCGCA-1 ATAGGGATATCCTTGA-1!ATAGGTTGGGCAGATG-1"ATAGTGAAGCGTTCTC-1#ATAGTTCCACCCACTC-1$ATATAAAGCGCTCGTG-1%ATATAAATGTAGCTGC-1&ATATAACACGGGCGCA-1'ATATACATGTATGGTA-1(ATATACGCTCGTGACG-1)ATATAGAGTATTGGTC-1*ATATCAACCTACAGAG-1+ATATCAATTCCAGCCT-1,ATATCGGTAGGGAGAT-1-ATATCGTTCCTCGAAC-1.ATATCTCCCTCGTTAA-1/ATATCTTAGGGCCTTC-10ATATGTCTCCCTAGCC-11ATATTCAGTTAAACCT-12ATATTCCACATAGTGA-13ATATTTAACCCTCAAG-14ATCAAACACTGTTCCA-15ATCAAACGAAGGTTTG-16ATCAATCTGGGCTGCA-17ATCAATGCCGTGGCTG-18ATCACATTAGAATATC-19ATCACGTGCTAATTAA-1:ATCACTTCATCCTCGC-1;ATCAGACGGCACGCCG-1<ATCAGCCTCATGCTGC-1=ATCAGCTCGTCCACTA-1>ATCAGTAGGCAGGGAT-1?ATCATAGCCCTATGTA-1@ATCATCCAATATTTGT-1AATCATTGTACCGCATT-1BATCCAACGCAGTCATA-1CATCCAATGGAGGGTCC-1DATCCACATCGACAGAA-1EATCCAGAGCAACAACC-1FATCCAGGATTCGTGAA-1GATCCCATCCACAGCGC-1HATCCTACCTAAGCTCT-1IATCCTGAATCGCTGCG-1JATCCTGCGTGGAATGG-1KATCGACCCAATACAGA-1LATCGACTCTTTCCGTT-1MATCGCACGCCGGGAGA-1NATCGCCAGTCAACATT-1OATCGCTGCGTGCAGCA-1PATCGGAGACAGACGGC-1QATCGGCAAGCAGTCCA-1RATCGTTAGCTAGCGGA-1SATCTAATATCCTACGG-1TATCTACCATCTGCTCC-1UATCTAGCTTGTGAGGG-1VATCTCCCACGGAATAT-1WATCTCCCTGCAATCTA-1XATCTGCACCTCTGCGA-1YATCTGCTGTTATCGCC-1ZATCTGGGCTGTTCTTG-1[ATCTGGTTAAGACTGT-1\ATCTTATCGCACACCC-1]ATCTTGACCTGCAACG-1^ATCTTGACTTGTCCAA-1_ATGAAGCCAAGGAGCC-1`ATGACGCGTTCTATCC-1aATGACTATGCGACATT-1bATGAGGAGTGTTAATC-1cATGATGCAATGGTACA-1dATGCACGCGCTGTTCA-1eATGCACTACCGCATTG-1fATGCATGATCCAGGAT-1gATGCCAATCGCTCTGC-1hATGCCATTTGCGACCA-1iATGCCGGTCTTGCATA-1jATGCCGGTTGATGGGA-1kATGCGACAATTGGTCC-1lATGCGACAGTCCCATT-1mATGCGAGTCCCACCAC-1nATGCTCTGGCGCGGTA-1oATGCTTAGGAGTTGAT-1pATGGAAATTTAAGGAG-1qATGGAGCAGGCCGTGA-1rATGGATCCGGCGTCCG-1sATGGATTGACCAAACG-1tATGGCAGCATTACGAT-1uATGGGCCTCGGCCTCT-1vATGGTCGCGTGGTTTC-1wATGTAAGGCTGCTCTT-1xATGTACATGCGGTGAG-1yATGTACGATGACGTCG-1zATGTAGCGCGCGTAGG-1{ATGTGAAAGCCTAATG-1|ATGTGCATCCGACGCA-1}ATGTGGACATCTTGAT-1~ATGTTGATTAGAGACT-1ATTAAACATGCGGACC-1€ATTAATACTACGCGGG-1ATTAATGAACCAGTCG-1‚ATTACATGTCAGTCTT-1ƒATTACGCGCTGGCAGG-1„ATTACTTACTGGGCAT-1…ATTAGATTCCTCAGCA-1†ATTAGGCGATGCTTTC-1‡ATTATACTTTGCTCGT-1ˆATTATAGCTACTTTAC-1‰ATTATGCCATAGGGAG-1ŠATTATTATGTCCGTCA-1‹ATTATTCAGAGTCACT-1ŒATTCAACCATTTAAGG-1ATTCACTGATGTTGGA-1ŽATTCAGGACCTATTTC-1ATTCATATACTGTCCA-1ATTCATCGTTGAGGCA-1‘ATTCCCGAAGGTACAG-1’ATTCCTAAGACGTGGA-1“ATTCGACGCCGGGCCT-1”ATTCGCGCCTTGAGAG-1•ATTCGTGCTATCTCTT-1–ATTGAAGATCTTAGTG-1—ATTGACCGGCGATGAC-1˜ATTGATCACCACATTT-1™ATTGATGAGTCCTAAC-1šATTGCCTTTATGTTTG-1›ATTGCGATCAGTAACT-1œATTGCTGCTCCTCCAT-1ATTGGATTACAGCGTA-1žATTGGTTGTGCATTAC-1ŸATTGTACAACTCGGCT-1 ATTGTCGCAATACCTT-1¡ATTGTGACTTCGCTGC-1¢ATTTACAGTTTACTGG-1£ATTTACTAAGTCCATT-1¤ATTTCCGGGTTCTGCG-1¥ATTTGCGCGAGTAGCT-1¦ATTTGGAGATTGCGGT-1§ATTTGTCTTGGGAGCT-1¨ATTTGTTCCAGGGCTC-1©CAAACCCTCCGGCGGG-1ªCAAACGAGTATCGCAG-1«CAAACGGTCGCACTTT-1¬CAAACTCGCGACGCCG-1­CAAAGATTATTGGGCC-1®CAAATCTCTCACAAGG-1¯CAAATGTCCTTCCGTG-1°CAACCTACCGAGCAGT-1±CAACGACCCGTTTACA-1²CAACGTGGTGGAGTCT-1³CAACTATATCGAATGC-1´CAACTGCTCATCCGAT-1µCAAGAGGGCGGAGTAC-1¶CAAGATATTATAACGT-1·CAAGCAACGTCGGAGT-1¸CAAGCACCAAATGCCT-1¹CAAGCGGCACATAATT-1ºCAAGGATCGCATGTTC-1»CAAGGCCAGTGGTGCA-1¼CAAGGTCCTATAGGCT-1½CAAGTGTGGTTGCAAA-1¾CAATAAACCTTGGCCC-1¿CAATACGCTCTGAGGC-1ÀCAATATTCTTGACCTA-1ÁCAATCCCTATACCAGC-1ÂCAATGCGAGAAGTATC-1ÃCAATGGATCTCTACCA-1ÄCAATGTGCCAACCCTT-1ÅCAATTAAGGGTGATGA-1ÆCAATTGGGCCGCACTC-1ÇCAATTTCGTATAAGGG-1ÈCACAAGAAAGATATTA-1ÉCACAATGAGCTGCTAT-1ÊCACACACGCTAACGAG-1ËCACACGCGCTGTCTTA-1ÌCACAGCACCCACGGCA-1ÍCACAGCTAGGGAGTGA-1ÎCACAGGGCCATATAGT-1ÏCACAGGGCCGTTGTCA-1ÐCACAGTCCCGCTTCGC-1ÑCACAGTTCGCTTCCCA-1ÒCACATATTAGCAGGAT-1ÓCACATCTCACCGACGA-1ÔCACATGATTCAGCAAC-1ÕCACATTCTTTCGATGG-1ÖCACATTTCTTGTCAGA-1×CACCAATCATCCGTCT-1ØCACCACGCCACACAGA-1ÙCACCAGTCAGCATGCA-1ÚCACCATGATCGCAAAG-1ÛCACCCAAATCTTATGT-1ÜCACCCACGAGGCAATT-1ÝCACCCGGTTTGTGACT-1ÞCACCCTAACAAGATCT-1ßCACCCTTGGTGAGACC-1àCACCGCCAGAAGGTTT-1áCACCGCGTCCACTCTA-1âCACCGGGCATCACAAG-1ãCACCGTATCCCATCCG-1äCACCGTTAGGGATCAC-1åCACCGTTGCGCGATAT-1æCACCTAATCAGTTTAC-1çCACCTCGATGGTGGAC-1èCACCTTGCGAAACTCG-1éCACCTTGGCGCCTTTG-1êCACGAAAGTTAGTCCC-1ëCACGCACAGCGCAGCT-1ìCACGCAGCGAGGCTTT-1íCACGCGGAACTGTTGC-1îCACGGCGCGCCAAAGG-1ïCACGTCGGCAACCTCT-1ðCACGTTCGTGCTCTAG-1ñCACGTTTCGTACACAC-1òCACTAAAGTTGCCTAT-1óCACTACGGGAGCTGCC-1ôCACTCAAGAGCTATGG-1õCACTCCTATGTAAGAT-1öCACTCCTCTCGGTCGG-1÷CACTCGAGCTGAACAA-1øCACTCTTCTGCTAGCC-1ùCACTGACGATTGTGGA-1úCACTTAATCAGACGGA-1ûCAGAACTTAGCCCTCT-1üCAGAATAACACACGGA-1ýCAGACACCGATCGCTG-1þCAGACCTGTAAGTGTT-1ÿCAGACGAACCTGATAC-1CAGAGACGGTCACCCA-1CAGAGCATGAGCTTGC-1CAGAGGCGATGCATGA-1CAGATAATGGGCGGGT-1CAGATACTAACATAGT-1CAGATCATTTAAAGTC-1CAGATCCTGGTTTGAA-1CAGATGTTTGTCCCAA-1CAGCAGCCCGTTCCTT-1 CAGCAGTCCAGACTAT-1 CAGCAGTCTGTGCTGC-1 CAGCCTCCTGCAGAGG-1 CAGCCTCTCCTCAAGA-1 CAGCGATTCCCTTCAA-1CAGCTCACTGAGACAT-1CAGCTCGACAAGTTAA-1CAGCTGGCGTAACCGT-1CAGCTTAGTAGGTAGC-1CAGGATATATCGTTGT-1CAGGCAGTCTTACCAG-1CAGGCCGTTTGGGTGT-1CAGGCGCACGGTGGTC-1CAGGCGCCATGCTAGG-1CAGTAACTATTTATTG-1CAGTAAGGGACGTCTC-1CAGTACATTCTCTAAA-1CAGTACCAGTTTACGT-1CAGTAGCCCACGCGGT-1CAGTCGAGGATGCAAT-1CAGTCGGCCTAGATAT-1CAGTCTGTATACTGGG-1CAGTGAATAAATGACT-1 CAGTGTCGGCTGGCCC-1!CAGTTCAAATTGACAC-1"CATAACGGACAGTCGT-1#CATAAGAAGCTTGGCT-1$CATAAGCTCTCCGTCT-1%CATACACAAAGTCAGC-1&CATACACGGTTCCCAC-1'CATACCCGTACCCAGT-1(CATACGGCGTCTGGGC-1)CATACTATGTAATTGT-1*CATACTTAGGCAATAC-1+CATAGAGGAGATACTA-1,CATAGCGTTGCCCACC-1-CATAGTACATTGAGAG-1.CATAGTCAAATACATA-1/CATAGTCCACAAGAAC-10CATATACTACTGATAA-11CATATAGGTACAGTCA-12CATATGTCAGGCTACG-13CATCATTACCCTGAGG-14CATCCTCTCAAAGATC-15CATCGGACGGGTTAAT-16CATCTATCCCGTGTCT-17CATCTTACACCACCTC-18CATGACTTCGCTGAAT-19CATGAGATGCACTCTC-1:CATGATGCACAATTCT-1;CATGATGGAAGTTAGC-1<CATGCCAACTCGCAAA-1=CATGCGACCAGTTTAA-1>CATGGATTGTCTTCCG-1?CATGGGTATGCCTTAT-1@CATGGGTCGGGTGTGG-1ACATGGTAAGTAGCGTT-1BCATGGTATTAGTTTGT-1CCATGGTCTAGATACCG-1DCATGGTTTATTAATCA-1ECATGTAAGAGACATTT-1FCATGTAGGAGCGCCAA-1GCATGTCTCATTTATGG-1HCATTACGCAGGAAGGG-1ICATTACGTCGGCCCGT-1JCATTATGCTTGTTGTG-1KCATTGCGGGTCAATTC-1LCATTTAGCGGACCATG-1MCATTTGAGTGGTACGT-1NCCAAACAGAACCCTCG-1OCCAAATAACAAGATTC-1PCCAACGATGCACTGAT-1QCCAAGAAAGTGGGCGA-1RCCAAGACTTCTGCGAA-1SCCAAGCGTAACTCGTA-1TCCAAGGTTGCCCTTTC-1UCCAATAGTGCCGTCGA-1VCCAATCGGTAGATCGA-1WCCAATGTCACAGCAAG-1XCCAATTACGGGTCGAG-1YCCACAATGTACGTCTT-1ZCCACACTGAGATATTA-1[CCACAGTACCCATCCT-1\CCACATGGCTCTTTAT-1]CCACCAACTTTACTGT-1^CCACCCAAGGAAAGTG-1_CCACGAATTTAACCTC-1`CCACGAGAAGAGAATC-1aCCACGGAGCCATAAGA-1bCCACGGTGCCCGGTAG-1cCCACTCAGATCCGCAA-1dCCACTGGTGGCTGGTT-1eCCACTGTTTGGATTAA-1fCCAGAAAGCAACTCAT-1gCCAGATAGTTGAGTGA-1hCCAGCCTGGACCAATA-1iCCAGCTCGAACGCATT-1jCCAGCTGATGGTACTT-1kCCAGGGACGTGGCCTC-1lCCAGTAGTCTGATCCA-1mCCAGTCAAATCTCTTA-1nCCAGTCTAGACGGCGC-1oCCAGTCTTGTCATAGA-1pCCAGTTCGGTAACTCA-1qCCATAACCTGTGCAGT-1rCCATACCTTTACTTGT-1sCCATAGAGGCTGCCAG-1tCCATAGGTTGGCGTGG-1uCCATATGGAAACTATA-1vCCATCGCAGTTAAACT-1wCCATCTCACCAGTGAA-1xCCATGCCCTAGATTTC-1yCCATGCCTGTTTAGTA-1zCCATTAGCGATAATCC-1{CCATTCCCTGCCCACA-1|CCATTTCTACCTATTA-1}CCCAAACATGCTGCTC-1~CCCAACATACGTCGCG-1CCCAAGTCATTACACT-1€CCCAATTTCACAACTT-1CCCACTCCACGGTATC-1‚CCCAGAGGAGGGCGTA-1ƒCCCAGGTCTGAAGGCT-1„CCCAGTAAACTTGGGA-1…CCCAGTTAAGGCGCCG-1†CCCGAAGTTTCGCGAA-1‡CCCGACCATAGTCCGC-1ˆCCCGAGTTTCTCCGTA-1‰CCCGCAGCGCGAACTA-1ŠCCCGGGTCGTTCAGGG-1‹CCCGGTGTATCGGAAT-1ŒCCCGTAAGTCTAGGCC-1CCCGTAGCTGGGAAGA-1ŽCCCGTCAGCGTCTGAC-1CCCGTGAGGGCGGTGA-1CCCGTTTCGCAGATGT-1‘CCCTACTTGAACAATG-1’CCCTAGGCAACAAGAG-1“CCCTATGTAGAGCAGA-1”CCCTCCTCGCTCGTAT-1•CCCTGAAATGAGTTGA-1–CCCTGCCCAATCCGCT-1—CCCTGCGCTACGCATA-1˜CCCTGGCTGTTCCTTC-1™CCCTTTAATGGAGTTC-1šCCCTTTGACAGGTCTT-1›CCGAACACTGGGCCTC-1œCCGAACCTTCCCGGCC-1CCGAAGCATTGACCAA-1žCCGACAATAGGCCGCC-1ŸCCGACGGGCATGAGGT-1 CCGACGTAAACACAAC-1¡CCGAGAAGTCGCATAA-1¢CCGAGCTGTGCTTGTC-1£CCGATCTCAACCTTAT-1¤CCGATTCGAGGGACCC-1¥CCGCACAAAGACCAAC-1¦CCGCACTTGCAATGAC-1§CCGCATGTGGTACGAT-1¨CCGCCGGAACTTCTCG-1©CCGCCTGCGAATTGGT-1ªCCGCCTTGCGATGTCG-1«CCGCGATTTGGTAGGT-1¬CCGCGCAAGATACCCA-1­CCGCGGAATGCGTCAC-1®CCGCGGGTACGAAGAA-1¯CCGCTATCAGCACCAG-1°CCGCTCCAGGGCGATC-1±CCGCTCTTCCGAACTA-1²CCGCTTACCTCACTCT-1³CCGCTTGCTGACATGG-1´CCGGAGCGTACTTTCT-1µCCGGCACGACCGTTTC-1¶CCGGCCGCGAGCATAT-1·CCGGCGTGAGACTCTG-1¸CCGGGCGGTCTCGTCA-1¹CCGGGCTGCTCCATAC-1ºCCGGGTTCGAGGTTAC-1»CCGGTAATGGCTAGTC-1¼CCGGTTTGTAATTGTG-1½CCGTAAGTTGGTCCCA-1¾CCGTAGGAAATCCCTG-1¿CCGTAGGGTTGTTTAC-1ÀCCGTATCTCGTCGTAG-1ÁCCGTATTAGCGCAGTT-1ÂCCGTGGAACGATCCAA-1ÃCCGTGTTAAATTCCAT-1ÄCCGTTACGTTAGAACA-1ÅCCGTTCCGAATCTCGG-1ÆCCTAAAGGCTGACGCT-1ÇCCTAAATTAACGGTTC-1ÈCCTAAATTGTATCCTA-1ÉCCTAACCCAAACAAGT-1ÊCCTAACTAAGGCTCTA-1ËCCTACATTCACAGACG-1ÌCCTACTGCTTACACTT-1ÍCCTAGGCGTAGCGATC-1ÎCCTAGGTAAAGGTAGC-1ÏCCTATAATGAGTGCCC-1ÐCCTATACCGTCCTGTC-1ÑCCTATATCGTGTCACG-1ÒCCTATATTTGTCCTGG-1ÓCCTATCTATATCGGAA-1ÔCCTATGAAGTGGTGCC-1ÕCCTATGGCTCCTAGTG-1ÖCCTATGGGTTACCGTC-1×CCTATGGTCAAAGCTG-1ØCCTATGTCCACTCCAC-1ÙCCTCAACGATCGCTGT-1ÚCCTCACCTGAGGGAGC-1ÛCCTCACCTTAGCATCG-1ÜCCTCCGACAATTCAAG-1ÝCCTCCTGAGCCCACAT-1ÞCCTCCTGTTGTGTCGT-1ßCCTCGCCAGCAAATTA-1àCCTCGCGCGATATAGG-1áCCTCGCGCTGTGCGAT-1âCCTCGGACCGGGATAG-1ãCCTCTAATCTGCCAAG-1äCCTCTATCGATTAGCA-1åCCTCTCTCCCATCTAG-1æCCTCTGGCCTAGACGG-1çCCTCTGTACTATTCTA-1èCCTGAACGATATATTC-1éCCTGAATATTTACATA-1êCCTGACCACCGATGGT-1ëCCTGCTATTTGAGAAG-1ìCCTGGAAACGTTCTGC-1íCCTGGCTAGACCCGCC-1îCCTGGTCGAATGTGGG-1ïCCTGTAAGACATGATA-1ðCCTGTACTCACGCCCA-1ñCCTGTCACCCGGGCTC-1òCCTGTCCCTCACGTTA-1óCCTGTCGCCCGTAAAT-1ôCCTGTTTGAAGACACG-1õCCTTCAGTTAAAGTGA-1öCCTTCGTATAGAATCC-1÷CCTTCTCAGCGTTCCT-1øCCTTCTTGATCCAGTG-1ùCCTTGACCACTTTATT-1úCCTTTAAGGGAGCACT-1ûCCTTTCAATGAAGAAA-1üCCTTTGAATTATGGCT-1ýCGAAACGCAATTCATG-1þCGAACAGTATGGGCGT-1ÿCGAACCCGCATGCGTC-1CGAACGGCCGGACAAC-1ACGATCATACATAGAG-1ACGATCATCTTGTAAA-1ACGATGCATATGTTAT-1ACGCAAACTAATAGAT-1ACGCAATCACTACAGC-1ACGCATACGTTTACTA-1ACGCATTCGTGAGTAC-1ACGCCAGATGATTTCT-1 ACGCCAGTGCGTTTGC-1 ACGCCGCTAGACGACC-1 ACGCGAAGTCAGACGA-1 ACGCGCTACACAGGGT-1 ACGCGGGCCAAGGACA-1ACGCTAGTGATACACT-1ACGCTGTGAGGCGTAG-1ACGGAACACGAGTGCC-1ACGGACTCTCAAAGCG-1ACGGAGCGCAAATTAC-1ACGGATGGTGCGGATA-1ACGGCACTTGCTTGGG-1ACGGCCAACATGGACT-1ACGGCGACGATGGGAA-1ACGGCTGGATGTAGAA-1ACGGGAGTGTCGGCCC-1ACGGTACAGTTCAATG-1ACGTAGATTGCTGATG-1ACGTAGGAGAGTCGCT-1ACGTATTACTCCGATC-1ACGTCTCGTTCCGGGA-1ACGTGACAAAGTAAGT-1ACGTGCGCCTCGTGCA-1 ACGTTAATGTCGAAGA-1!ACGTTAGATTTGCCCG-1"ACGTTCGCAATCAATT-1#ACGTTCGTTCAGGAAA-1$ACGTTCTGTACAAGTC-1%ACTACATCCCGACAAG-1&ACTACCAGCTCTCTGG-1'ACTACGCGTTAGAATT-1(ACTAGTTGCGATCGTC-1)ACTATATGCTGTGTTC-1*ACTATCCAGGGCATGG-1+ACTATCTGCCCGCGTA-1,ACTATTTCCGGGCCCA-1-ACTCAAGTGCAAGGCT-1.ACTCAATAAAGGCACG-1/ACTCCCATTCCTAAAG-10ACTCCCGAATTCGTTT-11ACTCCCTAATGCTAAA-12ACTCCCTAGAATAGTA-13ACTCCGGCCGACCACT-14ACTCGCCGTTCGATAA-15ACTCGTAACCCGTCCT-16ACTCGTCAGTAATCCC-17ACTCTCTGACTTAGGT-18ACTCTGACCTAATAGA-19ACTCTTGTATAGTAAC-1:ACTGAAACGCCGTTAG-1;ACTGAATGGCGAAAGT-1<ACTGCCGTCGTAACTC-1=ACTGCTCGGAAGGATG-1>ACTGTACGATACACAT-1?ACTGTAGCACTTTGGA-1@ACTGTCCAGGATTATA-1AACTGTCTTCTTTAGAA-1BACTTACGCATCCACGC-1CACTTATACTTACCCGG-1DACTTATTAGGATCGGT-1EACTTATTTATGTGCCA-1FACTTCAGGCTGATCCC-1GACTTCCAGTGGAAGCT-1HACTTCCATGCGGGACA-1IACTTCGCCATACGCAC-1JACTTGACTCCCTCTTT-1KACTTGGGACCCGGTGG-1LACTTGTAGTCCCTTCA-1MACTTGTGGATGGAACG-1NACTTTACCCTCATGAA-1OACTTTCCTATAGCTTC-1PACTTTGACTGCATCCT-1QACTTTGGTCGTGCTCC-1RAGAACCCTCAATTGGG-1SAGAACGTGGTACATTC-1TAGAAGAGCGCCGTTCC-1UAGAAGGTACACTTCAC-1VAGAAGGTTGCCGAATT-1WAGAAGGTTGTAGGTCG-1XAGAAGTGATTCGTGAT-1YAGAATGCGGGTTCGGA-1ZAGAATTATGGATTCGA-1[AGACCAAACCACACCT-1\AGACCCACCGCTGATC-1]AGACCCGCCCTCCTCG-1^AGACCGCTCCGCGGTT-1_AGACCGGGAAACCCTG-1`AGACGAAGTGCCGGTC-1aAGACGACGATGCCGCT-1bAGACTAGCCTTCCAGA-1cAGAGAACCGTCTAGGA-1dAGAGAAGGAGTACAAT-1eAGAGATCTCTAAAGCG-1fAGAGCCGCCGAGATTT-1gAGAGGCTTCGGAAACC-1hAGAGTAAACTTCACTA-1iAGATAACTTCAGGGCC-1jAGATACCAATAGAACC-1kAGATACCGGTGTTCAC-1lAGATACTCAAGATCGA-1mAGATATAATACGACTA-1nAGATCGTGCATAAGAT-1oAGATCTCAGGTGTGAT-1pAGATGACTCGCCCACG-1qAGATGAGGGTTGCGAT-1rAGATGATGGAGTCTGG-1sAGATGCAAGACGTGCA-1tAGATGCATCCTGTGTC-1uAGATTATAGGACGTTT-1vAGATTCACAACCGATA-1wAGCAAAGGCCGCTAGT-1xAGCAACATATCTTATT-1yAGCAACCGAAAGTAAT-1zAGCACCAGTACTCACG-1{AGCACTACCTCACCAG-1|AGCACTTAAGGACGCC-1}AGCAGAAGGAGAAAGA-1~AGCAGCCAGATGAATA-1AGCATATCAATATGCT-1€AGCATCATTTCGAAAG-1AGCATCGTCGATAATT-1‚AGCATTACGAGGCAAG-1ƒAGCCAAGCTTTGTGTC-1„AGCCACAGGTTACCCG-1…AGCCACTCCCGTGCTT-1†AGCCCATACATGTAAG-1‡AGCCCGCACTACAATG-1ˆAGCCCGGTAGCCTGTA-1‰AGCCCTTCTAATCCGA-1ŠAGCCGTGGCTAAATGT-1‹AGCCTAATACCCACGT-1ŒAGCGACAGGAACGGTC-1AGCGACCAACGATATT-1ŽAGCGATGCGCCTAATA-1AGCGCATAATGAATCG-1AGCGCGGGTGCCAATG-1‘AGCGGACACTTCGTAG-1’AGCGGCGGTTAGCGGT-1“AGCGGGTCTGACACTC-1”AGCGTGGTATTCTACT-1•AGCTAAGTACGCAGGC-1–AGCTAGAAGCAGAAGT-1—AGCTATTTAATCCAAC-1˜AGCTCCATATATGTTC-1™AGCTCCTTCGCACATC-1šAGCTCTAGACGTTCCA-1›AGCTCTTCCCAGTGCA-1œAGCTCTTCGTAACCTT-1AGCTCTTTACTCAGTT-1žAGCTGAAGTAAACCAA-1ŸAGCTGTAACCTCAATC-1 AGCTTCTTCTCGAGCA-1¡AGCTTGATCTTAACTT-1¢AGGAAGCTGTCCGCCG-1£AGGACAGTCGAATCCC-1¤AGGACGACCCATTAGA-1¥AGGACGCTCGATGTTG-1¦AGGAGGCCTTCGCGCG-1§AGGATAAAGTCGGGAT-1¨AGGATATAGGGATTTA-1©AGGATATCCGACTGCA-1ªAGGATCACGCGATCTG-1«AGGCAGATGCGTAAAC-1¬AGGCAGGGAGCGTACT-1­AGGCATTGTCGTAGGG-1®AGGCCACCCGTTATGA-1¯AGGCCCTAGAACGCCA-1°AGGCCTGAGAATCTCG-1±AGGCGGTTTGTCCCGC-1²AGGCGTCTATGGACGG-1³AGGCTTCCCGAAGAAG-1´AGGGAAACGAGGTACT-1µAGGGACCGGCTGCGTT-1¶AGGGACTCTACGCGAC-1·AGGGAGACATACTTCG-1¸AGGGCGAGCAGCTGAT-1¹AGGGCTGCAGTTACAG-1ºAGGGTCAGTAACCCTA-1»AGGGTCGATGCGAACT-1¼AGGGTGCTCTCGAGGG-1½AGGGTTCCCTTTGGTT-1¾AGGGTTTAGTTCGGGA-1¿AGGTAGGTACAAAGCT-1ÀAGGTATAATTGATAGT-1ÁAGGTCAGGTGAGAGTG-1ÂAGGTCGCGGAGTTACT-1ÃAGGTGCACGTCCACAT-1ÄAGGTGGTGACCTTCGC-1ÅAGGTTACACCATGCCG-1ÆAGGTTGAGGCACGCTT-1ÇAGGTTTCACACACCTT-1ÈAGTAACTATAGCAGCC-1ÉAGTACAGAAGCTTATA-1ÊAGTACATCATTTATCA-1ËAGTACGGGCACCTGGC-1ÌAGTACTCTTATGCCCA-1ÍAGTAGGAAGGAAGTTG-1ÎAGTATGCTGGAGACCA-1ÏAGTATTTGGCACGACC-1ÐAGTCAACACCACCATC-1ÑAGTCAAGATGACACTT-1ÒAGTCACTAGCTCTCGA-1ÓAGTCCATTGGCTGATG-1ÔAGTCCCGCCTTTAATT-1ÕAGTCGACGGTCTCAAG-1ÖAGTCGGCCCAAACGAC-1×AGTCGGCTCAACTTTA-1ØAGTCGGTTGCGTGAGA-1ÙAGTCGTATAAAGCAGA-1ÚAGTCGTCGACCACCAA-1ÛAGTCGTGGGCATTACG-1ÜAGTCTAAAGTATACTC-1ÝAGTCTCACAAGACTAC-1ÞAGTCTTCTCCTCAAAT-1ßAGTCTTTAAAGTGTCC-1àAGTGAACAAACTTCTC-1áAGTGACCTACTTTACG-1âAGTGAGACTTCCAGTA-1ãAGTGAGCCTCGCCGCC-1äAGTGAGTCGAATTAAC-1åAGTGATAACCTGCGCG-1æAGTGATATGAGTAGTT-1çAGTGATTCAAGCAGGA-1èAGTGCACGCTTAAGAA-1éAGTGCGTAGCTCGTAA-1êAGTGCTAAACACAGCA-1ëAGTGCTTGCACGAATA-1ìAGTGGCCCGCAAATGG-1íAGTGGCGGCAATTTGA-1îAGTGGCGTCTGAAGGT-1ïAGTGGCTCCGTCGGCC-1ðAGTGGTGTTACCCGTG-1ñAGTGTATTGCGCATTG-1òAGTTAAACACTTGCGA-1óAGTTAAGCGGTCCCGG-1ôAGTTAAGTCAACCGCT-1õAGTTACTCTATCGTGG-1öAGTTCCTACAGAATTA-1÷AGTTCCTATTTATGTT-1øAGTTGACGGTCCTTGC-1ùAGTTGGCAAGGCTAGA-1úAGTTTGCACCTGCCTC-1ûAGTTTGGCACGGGTTG-1üAGTTTGGCCAGACCTA-1ýATAAACGGACCCGTAA-1þATAAACGTTGCACCAC-1ÿATAAAGGCTCGGTCGT-1ATAAATATTAGCAGCT-1AATAGAATCTGTTTCA-1AATAGCTACCGCGTGC-1AATAGTCCGTCCCGAC-1AATATCCTAGCAAACT-1AATATCGAATCAATGC-1AATATCGAGGGTTCTC-1AATATTGGAGTATTGA-1AATCATGTAAAGACTC-1 AATCGCCTCAGCGCCA-1 AATCGCGCAGAGGACT-1 AATCGGTATAGCCCTC-1 AATCGTGAGCCGAGCA-1 AATCTAGGTTTACTTG-1AATCTATGCCGGAGCC-1AATCTCTACTGTGGTT-1AATCTGCGTTGGGACG-1AATCTGGCTTTCTAGT-1AATGACAGCAATGTCT-1AATGACGTAGGATGTC-1AATGACTGTCAGCCGG-1AATGATGATACGCTAT-1AATGATGCGACTCCTG-1AATGCAACCGGGTACC-1AATGCACCAAGCAATG-1AATGTGCCCGAGGTGT-1AATGTTGTCGTGAGAC-1AATTAAAGGTCGGCGT-1AATTAACGGATTTCCA-1AATTACGAGACCCATC-1AATTAGCGCTGCAGCG-1AATTCATAAGGGATCT-1 AATTCATTGTCATGCA-1!AATTCCAAGCATGTAC-1"AATTCGATTCGAGGAT-1#AATTCTAGAGTTAGGC-1$AATTGAACGCTCTGGT-1%AATTGCAGCAATCGAC-1&AATTTGGGACATAGTA-1'ACAAACCATGCGTCCT-1(ACAAAGAAGGTAGGCC-1)ACAAAGCATGACCTAG-1*ACAAATCGCACCGAAT-1+ACAAATGGTAGTGTTT-1,ACAACAGCATGAGCTA-1-ACAAGCAGTGCCTAGC-1.ACAAGGAAATCCGCCC-1/ACAAGGACAAGAGGTT-10ACAAGGATGCTTTAGG-11ACAAGGGCAGGCTCTG-12ACAATAGTCGTACGTT-13ACAATCCATTTAAACC-14ACAATGAATACGGAGA-15ACAATTGTGTCTCTTT-16ACAATTTGAGCAGTGG-17ACACAAAGACGGGTGG-18ACACACCAGGACCAGT-19ACACATGATCAAATCT-1:ACACCCAGCATGCAGC-1;ACACCTTAAGTAGGGC-1<ACACCTTACTACTTGC-1=ACACGAGACTCCTTCT-1>ACACGGGAACTTAGGG-1?ACACGTAGGCCACAAG-1@ACACTGATCAAGGTGT-1AACAGAACTGAGAACAA-1BACAGCGACATTCTCAT-1CACAGGCACGGATCCTT-1DACAGGCTTGCCCGACT-1EACAGGTGGAGGTGAGG-1FACAGTAATACAACTTG-1GACATAAGTCGTGGTGA-1HACATAATAAGGCGGTG-1IACATCCCGGCCATACG-1JACATCCTGGTAACTGT-1KACATCGATCGTTTACC-1LACATCGGTCAGCCGCG-1MACATCGTATGCAATGG-1NACATGGCGCCAAAGTA-1OACATTAGTTTATATCC-1PACATTTGAAACCTAAC-1QACCAAACACCCAGCGA-1RACCAACACCACACACT-1SACCAACCGCACTCCAC-1TACCAACGCTTATTTAT-1UACCAAGTCATCGGCAG-1VACCAATATGCAAGTTA-1WACCACAAGTTTCTATC-1XACCACCAATGTAACAA-1YACCACGTGCAGCTATA-1ZACCAGACCATAACAAC-1[ACCAGTGCGGGAGACG-1\ACCATATCCGCAATAA-1]ACCATCCGCCAACTAG-1^ACCATCGTATATGGTA-1_ACCCAACGCCCGTGGC-1`ACCCATCTTGAGGGTA-1aACCCATTTGTCCCTCT-1bACCCGGAAACTCCCAG-1cACCCGGATGACGCATC-1dACCCGGTTACACTTCC-1eACCCGTGTCATCAGTA-1fACCCTATGCCATATCG-1gACCCTCCCGTCAGGGC-1hACCCTCCCTTGCTATT-1iACCCTGGTAACGCCCT-1jACCGAAGAGTCTGGTT-1kACCGACACATCTCCCA-1lACCGACTGAGTCCCAC-1mACCGAGTCTCCTTATT-1nACCGATGGTAGCATCG-1oACCGCAATAACTGCCT-1pACCGCGGTGGAAGTCG-1qACCGGGCCTTTGTTGA-1rACCGGTCAGGTACACC-1sACCGTCCACTGGGCCC-1tACCTAAGTACCTTTCA-1uACCTAATCGACTTCCT-1vACCTACAGTATGTGGT-1wACCTACTATAAATCTA-1xACCTCCGCCCTCGCTG-1yACCTCCGTTATTCACC-1zACCTGCGTGTCATGTT-1{ACGAAATGGGCGGCAC-1|ACGACTCTAGGGCCGA-1}ACGAGGATACCACTCT-1~ACGAGGTTTACAACGT-1ACGAGTACGGATGCCC-1€ACGATACATAGAACTA-1AACGCATGATCTGGGT-1‚AACGCGGTCTCCAGCC-1ƒAACGCTGTTGCTGAAA-1„AACGGACGTACGTATA-1…AACGGCCATCTCCGGT-1†AACGTACTGTGGGTAC-1‡AACGTCAGACTAGTGG-1ˆAACGTCGCTGCACTTC-1‰AACGTGCGAAAGTCTC-1ŠAACTACCCGTTTGTCA-1‹AACTAGGCTTGGGTGT-1ŒAACTCAAGTTAATTGC-1AACTCCAGAGCGTGTT-1ŽAACTCCTAATCCCATG-1AACTCTCAATAGAGCG-1AACTCTCAGTGTGCTC-1‘AACTGGGTCCCGACGT-1’AACTTGCCCGTATGCA-1“AAGACATACGTGGTTT-1”AAGACCAAATAACTCA-1•AAGACCCAACTGAACA-1–AAGACTGCAAGCTACT-1—AAGAGCTCTTTATCGG-1˜AAGAGGATGTACGCGA-1™AAGAGGCATGGATCGC-1šAAGAGGCCCTTTGGAA-1›AAGATGGCACCGGACC-1œAAGATTGGCGGAACGT-1AAGCACCCTGCGTATC-1žAAGCATACTCTCCTGA-1ŸAAGCCGAAGCGGTTTA-1 AAGCGCAGGGCTTTGA-1¡AAGCGTCCCTCATCGA-1¢AAGCTAGATCGAGTAA-1£AAGCTCGTGCCAAGTC-1¤AAGCTCTTTCATGGTG-1¥AAGGAGCGGTTGGTGC-1¦AAGGATCGATCGCTTG-1§AAGGATGAGGGACCTC-1¨AAGGCGCGTAAAGCTT-1©AAGGCTGTGCTCATCG-1ªAAGGGAACGACTGGCT-1«AAGGGACAGATTCTGT-1¬AAGGGACTATGCATTC-1­AAGGGTTTGATTTCAG-1®AAGGTATCCTAATATA-1¯AAGGTGATAAACCAGC-1°AAGTAGTGACGCGAGG-1±AAGTCAATTGTCGTCA-1²AAGTCTTCTGTGGCCT-1³AAGTGACGACCGAATT-1´AAGTGAGTCGGGTTTA-1µAAGTGCCTTGACTGTA-1¶AAGTGCGTTAGAATCT-1·AAGTGTTTGGAGACGG-1¸AAGTTCACTCCAAGCT-1¹AAGTTCAGTCTGCGTA-1ºAAGTTCGGCCAACAGG-1»AAGTTGTGATGTTATA-1¼AAGTTTATGGGCCCAA-1½AATAACAACGCTCGGC-1¾AATAACACTAGAACAA-1¿AATACCTGATGTGAAC-1ÀAATAGAACAGAGTGGC-1ÁAAATCGCGGAAGGAGT-1ÂAAATCGTGTACCACAA-1ÃAAATCTAGCCCTGCTA-1ÄAAATGATTCGATCAGC-1ÅAAATGGCCCGTGCCCT-1ÆAAATGGTCAATGTGCC-1ÇAAATTAACGGGTAGCT-1ÈAAATTACACGACTCTG-1ÉAAATTACCTATCGATG-1ÊAAATTCCAGGTCCAAA-1ËAAATTGATAGTCCTTT-1ÌAAATTTGCGGGTGTGG-1ÍAACAACTGGTAGTTGC-1ÎAACACACGCTCGCCGC-1ÏAACACGAGACGCGGCC-1ÐAACAGGATGGGCCGCG-1ÑAACAGGTAGTATGGAT-1ÒAACATATCAACTGGTG-1ÓAACATCGATACGTCTA-1ÔAACATTGTGACTCGAG-1ÕAACCAAGACTTCTCTG-1ÖAACCCATCCCATGATC-1×AACCCGAGCAGAATCG-1ØAACCCTACTGTCAATA-1ÙAACCGAGCTTGGTCAT-1ÚAACCGCTAAGGGATGC-1ÛAACCTCGCTTTAGCCC-1ÜAACCTTTAAATACGGT-1ÝAACCTTTACGACGTCT-1ÞAACGAAAGTCGTCCCA-1ßAACGATAATGCCGTAG-1àAACGATATGTCAACTG-1áAAACTGCTGGCTCCAA-1âAAACTTAATTGCACGC-1ãAAACTTGCAAACGTAT-1äAAAGAATGTGGACTAA-1åAAAGGCTACGGACCAT-1æAAAGGCTCTCGCGCCG-1çAAAGGGATGTAGCAAG-1èAAAGTAGCATTGCTCA-1éAAAGTGTGATTTATCT-1êAAAGTTGACTCCCGTA-1ëAAATAACCATACGGGA-1ìAAATAAGGTAGTGCCC-1íAAATACCTATAAGCAT-1îAAATAGCTTAGACTTT-1ïAAATAGGGTGCTATTG-1ðAAATCCGATACACGCC-1ñAAACCGTTCGTCCAGG-1òAAACCTAAGCAGCCGG-1óAAACGAAGATGGAGTA-1ôAAACGAGACGGTTGAT-1õAAACGGGCGTACGGGT-1öAAACGGTTGCGAACTG-1÷AAACTCGGTTCGCAAT-1øAAACTCGTGATATAAG-1ùAAACAGGGTCTATATT-1úAAACATGGTGAGAGGA-1ûAAACATTTCCCGGATT-1üAAACCGGGTAGGTACC-1ýAAACAGAGCGACTCCT-1þAAACAGCTTTCAGAAG-1ÿAAACACCAATAACTGC-1AAACAAGTATCTCCCA-1GCATTGTAATTCATAT-1GCATTTCCAAGGCTCC-1GCCAACCATTTCCGGA-1GCCAAGAATACTTCTG-1GCCAATAGGGCATCTC-1GCCACAATTTAAGGAC-1GCCACTCAGAGCGCGA-1GCCAGGAGTAACCGAT-1 GCCATATTGCACACAG-1 GCCATCGAGCTGCGTG-1 GCCATCGATGCTGCAT-1 GCCATTAGCCTCAAAC-1 GCCCGACTTCTTCCCG-1GCCCGAGAGTCTAAAT-1GCCCGATCTGTGGTCG-1GCCCGCGCGTAAACGG-1GCCCGTAATACCTTCT-1GCCCTAGCCGTCGCGA-1GCCCTGAGGATGGGCT-1GCCGAAATTCCTACGT-1GCCGATTGGCCAAGCT-1GCCGCTTGTGAGAAAC-1GCCGGGTTAGGGTCGC-1GCCGTGGAAGAAATGT-1GCCTACGTTCTGTGCA-1GCCTATAGTGTCAGGG-1GCCTCATCTGGAAATA-1GCCTCCGACAATTCAC-1GCCTCTATACATAGCA-1GCCTTTGTCAGTGGAC-1GCGAAACGATCGGGAG-1 GCGAAACTTAACTGGA-1!GCGAAGAATCTGACGG-1"GCGAAGCCATACCCGT-1#GCGACATGTAAACATC-1$GCGACGATAGTTGTAC-1%GCGAGAGGCCATGTAA-1&GCGAGAGTTGCGTCCA-1'GCGAGCGCATGCTCCC-1(GCGAGGCCCGAGCAGA-1)GCGAGTTCTGCAAAGA-1*GCGATTGTTAACGTTA-1+GCGCAAATATATTCAA-1,GCGCAAGAGCGCGCTG-1-GCGCATCCAGTCAGCA-1.GCGCCGTTCCACGATA-1/GCGCCTCCCACTCCGA-10GCGCGGTCTAGTAACT-11GCGCGTCATTGGTACA-12GCGCTAATTGAATAGA-13GCGCTATGCCGAGGCA-14GCGCTGATCCAGACTC-15GCGCTGCTTTGCATTT-16GCGCTTAAATAATTGG-17GCGGACCGCGTTGTGG-18GCGGAGAAACTTCGCA-19GCGGAGAGGGAGAACG-1:GCGGATTACTTGTTCT-1;GCGGCAAAGTATTGCC-1<GCGGCTCTGACGTACC-1=GCGGCTTTAGCAAGTT-1>GCGGGCGAGCCTTACC-1?GCGGTCTTGCTTTCAC-1@GCGGTGAACTGCGCTC-1AGCGGTTCCCTATCATG-1BGCGTAAATGGCCATAA-1CGCGTCGAAATGTCGGT-1DGCGTCGCCAGGGTGAT-1EGCGTCTCTGCATTGGG-1FGCGTGGTACTGGGTTA-1GGCGTTCGGAGACCGGG-1HGCTAACTGAAGTCTGA-1IGCTAAGCCCAGTATGC-1JGCTAAGTAGTTTCTCT-1KGCTAATACCGAATGCC-1LGCTACAATCGAGGATA-1MGCTACAGTACGGACCG-1NGCTACGACTTATTGGG-1OGCTACTATAGTAGAGT-1PGCTAGACCGTCTACTG-1QGCTAGAGTAGAGATGT-1RGCTAGCAGGGAGTGGG-1SGCTAGCTTGAATAGCT-1TGCTAGGCACCACGGAG-1UGCTAGTAGAGCTTGTA-1VGCTATACGTCTCGGAC-1WGCTATCATACTCATGG-1XGCTATGCCAGCTTATG-1YGCTCAATCCGTTTATT-1ZGCTCAATGTAATACCG-1[GCTCATTACTGCATGT-1\GCTCCCAGTCGGTCCA-1]GCTCCGCTCGCTTCAG-1^GCTCCTGACATACTGG-1_GCTCGCTCATGTCCAA-1`GCTCGGAATTTAAAGC-1aGCTCTAAACCCTGACG-1bGCTCTATGTTACGTGC-1cGCTCTCGGGTACCGAA-1dGCTCTTTCCGCTAGTG-1eGCTGAATCTTCCAATC-1fGCTGAGGCGTGAGTAT-1gGCTGCACGGTTTCTTA-1hGCTGCTAAGTAGTCGA-1iGCTGCTACTGCGTAGC-1jGCTGCTCTCCGGACAC-1kGCTGGACCCAAAGTGG-1lGCTGGCATATTCACCT-1mGCTGGCGGCGCATGCT-1nGCTGGTGACTCGTAGT-1oGCTGGTTTAGGCCATA-1pGCTGTATTACTGGCCC-1qGCTGTTGCTACCGAAC-1rGCTTAATGTAACTAAC-1sGCTTACGTAGTTAGTA-1tGCTTATGAAGCAGGAA-1uGCTTCCATGTAACCGC-1vGCTTCCGTCCCTAGAC-1wGCTTGAGTGACCTCTG-1xGCTTGGATCGATTAGG-1yGCTTTCAGAGGAGGTG-1zGGAAACCTTGTTGAAT-1{GGAAACTAAATGGGCC-1|GGAAAGTGCCCATGCC-1}GGAACCGTGTAAATTG-1~GGAACCTTGACTCTGC-1GGAACTTTGGCGATTA-1€GGAATGCGCTAGCGTG-1GGACAACCATGAAGCC-1‚GGACACAAGTTTACAC-1ƒGGACCAACAGGATAAC-1„GGACCTACGGTAACGT-1…GGACCTCTAGGCCGCC-1†GGACGTCCATAGTTGG-1‡GGACTCTTTGACTAAG-1ˆGGAGAAGTCATTGGCA-1‰GGAGACCATCTACATA-1ŠGGAGACGACACCTTTG-1‹GGAGCAACATTTCAAG-1ŒGGAGCACCAAGAACTA-1GGAGCGAGGCCTACTT-1ŽGGAGGGCTTGGTTGGC-1GGAGTTGATTCTGTGT-1GGATCAGAGCCATCAG-1‘GGATCATCCCGTACGC-1’GGATCCGGAATATACT-1“GGATCTTGACTCAACC-1”GGATGAAGATCGCTGA-1•GGATGACGCGAGTTTA-1–GGATGGCTTGAAGTAT-1—GGATGTCCTTACCGCA-1˜GGATTAATCATGGACC-1™GGATTCCGCTATACCC-1šGGATTGCTGTGACTCC-1›GGATTTCACTTCTATA-1œGGCAAAGGCGCCAATA-1GGCAAATTACTTTACT-1žGGCAAGCCCATAGTGG-1ŸGGCAAGGCGAAATAGC-1 GGCAATAGTCAATGAG-1¡GGCACGCTGCTACAGT-1¢GGCACTCCACTGGGCA-1£GGCACTGCGGTGGTTT-1¤GGCAGCAAACCTATGC-1¥GGCAGCGGTAATCCTA-1¦GGCATACAGGTAGCGG-1§GGCATATCGGTTCTGC-1¨GGCCAATTGTATAGAC-1©GGCCCAGCTGGTTTGC-1ªGGCCCTCACCCACTTA-1«GGCCGGCGTCTGCTAT-1¬GGCCGTTTGGGTTTCA-1­GGCCTGCTTCTCCCGA-1®GGCGAAATCTAACTTG-1¯GGCGAGCGAAACGGCA-1°GGCGCAGGACATCTTC-1±GGCGCATGAATTGATG-1²GGCGCGGAGATCTTTC-1³GGCGCGTTCGAGTTTA-1´GGCGCTTCATTCCCTG-1µGGCGGAGTAATATTAG-1¶GGCGGTAGGATCATTG-1·GGCGTAGGGAAAGCTG-1¸GGCGTCCTATCCGCTG-1¹GGCTAAAGGGCGGGTC-1ºGGCTAATGATTGAAAT-1»GGCTATTAAGTTGTAT-1¼GGCTCGCGTTGAGGTA-1½GGCTCTGCTCCAACGC-1¾GGCTGAAATAGCAAAG-1¿GGCTTTCAATAAGGGT-1ÀGGGAAAGAATGCCAAC-1ÁGGGAACGGGAGGTTAG-1ÂGGGAAGACGGTCTGTC-1ÃGGGAAGGGCTTTCTCA-1ÄGGGAATGAGCCCTCAC-1ÅGGGACAGAGTTACTCC-1ÆGGGACCCGTATATCTT-1ÇGGGACTGCATAGATAG-1ÈGGGAGAACTCACAGTA-1ÉGGGAGCGACCGTAGTG-1ÊGGGAGGATGCCCGAAA-1ËGGGAGTTAATGAGGCG-1ÌGGGATGGTCGTAACCG-1ÍGGGATTTACCGCACCT-1ÎGGGCAACCGCACGTGC-1ÏGGGCACTATTGACCAT-1ÐGGGCAGACGTCACTGC-1ÑGGGCAGAGCAATCGTT-1ÒGGGCAGTCAACGCCAA-1ÓGGGCCCGTCTTAAACA-1ÔGGGCCGGCCGAAGTAC-1ÕGGGCCTAAATGGGCTA-1ÖGGGCGATATGTGTGAA-1×GGGCGGCAAATGAATT-1ØGGGCGGGTTCCCTACG-1ÙGGGCGTACATTTATAT-1ÚGGGCGTCACCACGTAA-1ÛGGGCGTCCACTGGCTC-1ÜGGGCGTGGTTTCCCAG-1ÝGGGCTACTATTTCGTG-1ÞGGGCTATGATCGATGG-1ßGGGCTCATCGAACCCA-1àGGGCTGCCTAGGGCGA-1áGGGCTGGTTAGTCGCG-1âGGGTACTTCATGAACT-1ãGGGTATGTATGCACTT-1äGGGTATTCTAGCAAAC-1åGGGTCACCGTGACGGT-1æGGGTCAGGAGCTAGAT-1çGGGTCGTGGCAAGTGT-1èGGGTCTATCGCTTTCC-1éGGGTGACACCTTAACT-1êGGGTGCATATGAAAGC-1ëGGGTTAACATTTGAGT-1ìGGGTTTAGGATAGGAT-1íGGTAACCGGGAGGATA-1îGGTACAAACATGCTAT-1ïGGTACCATTAAGACGG-1ðGGTACGTTGCGGCCGG-1ñGGTAGAAGACCGCCTG-1òGGTAGACCGTTGGGCG-1óGGTAGTGCTCGCACCA-1ôGGTATAGTGACACATA-1õGGTATTGCCGAGTTTA-1öGGTCAAGACTACTTCG-1÷GGTCAGTGGGTCCCAC-1øGGTCGGATAAACGGCG-1ùGGTCGGCCAGGAGCTT-1úGGTCGGTCGTCCACAG-1ûGGTCGTAAGCTCGCAC-1üGGTCTCCGTCCAGGTT-1ýGGTCTCTGAATGGACT-1þGGTCTGAGAATCTGGA-1ÿGGTCTTGAGCGCTCTT-1GGTGAAGTACAGGGAT-1GGTGATAAGGAGCAGT-1GGTGCAGAGCCTATCG-1GGTGCTGGTACACATT-1GGTGGACTGCTCTGGC-1GGTGTAAATCGATTGT-1GGTTACCACCCTCGGG-1GGTTAGCTATATGTCT-1GGTTAGGCTTGGAGAA-1 GGTTCGGATTATACTA-1 GGTTCTACTCGTCTGA-1 GGTTTAATTGAGCAGG-1 GGTTTACAATCTCAAT-1 GGTTTAGCCTTTCTTG-1GGTTTCAATCGGTCAG-1GGTTTGACAAGAAGCT-1GGTTTGTGACCTGAGG-1GTAACATCTAAGATAA-1GTAAGCGGGCAGTCAG-1GTAAGTAACAGTCTGG-1GTAAGTAGGGTATACC-1GTAATAAAGGGCTCCC-1GTAATCTGATTCTTCG-1GTACACTTACCTGAAG-1GTACAGAGGCAAGGGT-1GTACGAGATTGCGACA-1GTACGCTTCATTGCAC-1GTACGTCACGTATTAA-1GTACGTTTGCCCGTCA-1GTACTAAGATTTGGAG-1GTACTCCCTTATCGCT-1GTACTCCTGGGTATGC-1 GTACTGGAGTTAGACC-1!GTAGACACGCCTGACT-1"GTAGAGGGAGACAAGT-1#GTAGCCAAACATGGGA-1$GTAGCGGCTATACACT-1%GTAGCTTCCTCTTGTT-1&GTAGGTGATCCGTGTA-1'GTAGTCGCGGGAATCA-1(GTAGTCTACGATATTG-1)GTAGTGAGCAACCTCA-1*GTATAGGACTCAGTAG-1+GTATCAAACGTTAGCT-1,GTATCCTTTGGTAACC-1-GTATCTCAGTCTTGAC-1.GTATCTTTCATAACCA-1/GTATGAAATTTCACTC-10GTATGTGGGTCTAGTT-11GTATTCTGAGAAACGA-12GTCAAAGAAGTGGTGT-13GTCAACCAGGCCTATA-14GTCAAGCGGACTCGGG-15GTCAGAATAGTCTATG-16GTCATGCACCTCCGTT-17GTCATGCGCGAGGGCT-18GTCATGGACATGACTA-19GTCATTAGAGCGAACG-1:GTCCAATATTTAGCCT-1;GTCCATTACTGCTACG-1<GTCCCAACGTAAAGTA-1=GTCCCAATCATCCCGC-1>GTCCCGCGACGTTATG-1?GTCCGGACCTGAAATT-1@GTCCGGCTGAATTGCG-1AGTCCGGGTTCACATTA-1BGTCCTACGAATAGTCT-1CGTCCTACTCTACGGGC-1DGTCGCCGTTGTGTGTT-1EGTCGCGTAACCCGTTG-1FGTCGGAAGGATACCAG-1GGTCGGATATCTCAGAC-1HGTCGGATGTAGCGCGC-1IGTCGGGAACATGGTAG-1JGTCGGGAAGCAGAAAC-1KGTCGTACCATCTCGGG-1LGTCGTACCTACGATTG-1MGTCGTATTGGCGTACA-1NGTCGTGTCTGGTCATC-1OGTCGTTATTCGCTTAT-1PGTCTAGTGAGCCGCTT-1QGTCTATCTGAGTTTCT-1RGTCTATTGCATGCTCG-1SGTCTATTGGTTCCGGT-1TGTCTCAAGGCCCGGCT-1UGTCTCCCGAGTCCCGT-1VGTCTCCTGCCAGTATG-1WGTCTCGACTAAGTTTG-1XGTCTCGATCTGCTTTC-1YGTCTGGGCGGTCGAGA-1ZGTCTTACCACGCCAAG-1[GTCTTGTAGCTATTCA-1\GTGAAACGGCGCCACC-1]GTGAACTCCCATTCGA-1^GTGAAGATTTCAAGTG-1_GTGAAGCCGTATAGTC-1`GTGAAGTCACGACTCG-1aGTGACAGCTTCCCACT-1bGTGACCGCACACTACG-1cGTGACGAGGGTGACCC-1dGTGACGCAGGTTTCAT-1eGTGACTTCAGTAGTGC-1fGTGAGCGTGCTGCACT-1gGTGAGGACACTTAAGG-1hGTGAGGAGCGGTTGAG-1iGTGAGTCGACTAATAG-1jGTGAGTGGTACAACGC-1kGTGATCACTAACGCCT-1lGTGATCATAGATCTGC-1mGTGATCCTTGTCATGA-1nGTGATGCACAACATCT-1oGTGATTCGCCGCTCAA-1pGTGCACCAGCTTCAAC-1qGTGCACGAAAGTGACT-1rGTGCCATCACACGGTG-1sGTGCCCGTTCGGATTC-1tGTGCCGCTTCAAAGGT-1uGTGCCTGAGACCAAAC-1vGTGCGAAATCGAACAC-1wGTGCGACAGGGAGTGT-1xGTGCGGGTCTCCAAAT-1yGTGCGTGTATATGAGC-1zGTGCTCAAGTACTGTC-1{GTGGAACCTACATGCG-1|GTGGACCAACCCGATT-1}GTGGACGCATTTGTCC-1~GTGGAGCGTTTACCGA-1GTGGAGTCGGCGGTTG-1€GTGGCAAACAGCGGCA-1GTGGCGGTCCCAGCGT-1‚GTGGCTGTTTCTGTTC-1ƒGTGGGAAGACTGAATC-1„GTGGGCTTAGACACAC-1…GTGGGTACTGAGCGTA-1†GTGGTATAGTCTGCCG-1‡GTGGTGGCCAAGTGAA-1ˆGTGGTTACTTCTTTCG-1‰GTGGTTTCCGCCTTTC-1ŠGTGTACCTTGGCTACG-1‹GTGTATATCAGCGGGC-1ŒGTGTCGTATAGCGTTC-1GTGTGAATAACTTAGG-1ŽGTGTTACTATGCGTCC-1GTTAAAGTAGGACTGG-1GTTAACATCACTTAAA-1‘GTTAACTATGTTGTCA-1’GTTAAGGGTGCGATGT-1“GTTACAATTGGTGACG-1”GTTACCTACAACTTGC-1•GTTACTTTGGGCCTAG-1–GTTAGCCCATGACATC-1—GTTAGCCGTAAATCAA-1˜GTTAGGCTACCCGTTT-1™GTTATAATACGGTGAA-1šGTTATATCAGGAGCCA-1›GTTATATTATCTCCCT-1œGTTATCAAGCTATCGA-1GTTCACAGGAGTCTAG-1žGTTCATCGTTTGGCTG-1ŸGTTCGCCATAAGTGCC-1 GTTCGCTGAGACGTCT-1¡GTTCGGATCGGGAACA-1¢GTTCGGGCGTACCATT-1£GTTCGTCTAAAGAACT-1¤GTTGAACCGGTTCCAT-1¥GTTGAGTCCCGCCGGT-1¦GTTGCACGGAGTTTCG-1§GTTGGACCGCATCAGG-1¨GTTGGATTCAGTGGCT-1©GTTGGATTGAGAACAC-1ªGTTGGATTTGCGTTGG-1«GTTGGTCATGCTATCC-1¬GTTTACGTTCCATCTG-1­GTTTCAAACGAGTTGT-1®GTTTCATATCGTCGCT-1¯GTTTCCTGGAGGGTGA-1°GTTTCTAGAGGCGCGG-1±GTTTCTGCAGTCTCCC-1²GTTTGACCAAATCCTA-1³GTTTGGCCCAAGTTAT-1´GTTTGGGCTTGTGAGC-1µGTTTGGGTTTCGCCCG-1¶GTTTGGTAGGGTCAAC-1·GTTTGTTAGCCAAGTA-1¸TAAACCCAGGAGGGCA-1¹TAAAGCGGTATTTCCA-1ºTAAAGCGTTAGGAGAA-1»TAAAGCTGCAATAGGG-1¼TAAATGCCGTCTCATG-1½TAACATACAATGTGGG-1¾TAACATACACGCGATC-1¿TAACCTACCGTCCGAG-1ÀTAACCTAGGGAGTCCA-1ÁTAACTATTACGCCAAA-1ÂTAACTCATCCGCGCGG-1ÃTAAGAGGGACAGGGAC-1ÄTAAGCCCTTACGACCA-1ÅTAAGGCAACATAAGAT-1ÆTAAGGCATAACATCAA-1ÇTAAGGCCCGTCACCCT-1ÈTAAGGCTGAATCCCTC-1ÉTAAGGGCCTGTCCGAT-1ÊTAAGTAACATCTTGAC-1ËTAAGTCGCCGAGTATC-1ÌTAAGTTGCGACGTAGG-1ÍTAATAAACAAGGAGAT-1ÎTAATACACAGTAGTAT-1ÏTAATACTAGAACAGAC-1ÐTAATAGAACAGAGTTA-1ÑTAATAGGTCACCAGAA-1ÒTAATAGTGACGACCAG-1ÓTAATCGATCCGTACGT-1ÔTAATTACGTCAGTAGA-1ÕTAATTAGGACATCCGT-1ÖTAATTGGAATCGGGAA-1×TAATTTCCGTCCAGTA-1ØTACAACAGCGCATACA-1ÙTACAACGCACAACTCA-1ÚTACAAGGGCTTCTTTA-1ÛTACAAGTCTCGTGCAT-1ÜTACACAGCCGTGGTGC-1ÝTACACCTCTTCGAATC-1ÞTACAGAAACGGTGGGC-1ßTACATAGGCATACACC-1àTACATCCCTATCCCTG-1áTACATTTCTAACGTGC-1âTACCAAATAGCCCAGA-1ãTACCAATAAAGTACCA-1äTACCAGAAGTAGGTTC-1åTACCGAATAATTGTAA-1æTACCGCGGACTTGCAG-1çTACCGGCTCACTGCCC-1èTACCGGTCGTTTCCAT-1éTACCGTAGGTTAACTA-1êTACCGTGCCTCGGACC-1ëTACCTACTCCCAGTAT-1ìTACCTATCCCTAGAGG-1íTACCTCAGTTGTCTGT-1îTACCTTAAGATTTCCC-1ïTACGAACACGACTTCA-1ðTACGACGCTTGCTGCG-1ñTACGACTGCCTCTTAG-1òTACGAGAACTTCACGT-1óTACGATGTTGATCATC-1ôTACGCAGTTCTTTCCT-1õTACGCCATATTCTAAT-1öTACGCCGAGGGTACCC-1÷TACGCCTCCATTCCGA-1øTACGCTATAGAAACCT-1ùTACGCTCGGTATTGGA-1úTACGGAAGCCAAACCA-1ûTACGGGATGCTAGCAG-1üTACGGGTAATAACATA-1ýTACGTAAAGCGGAGTG-1þTACGTGGGCCCAGGGC-1ÿTACGTTTACCGGCAAT-1TACTACGTGCAATGCG-1CTGGGATAAATAATGG-1CTGGGCCTGCTATATC-1CTGGGTAGGCAGTTAA-1CTGGGTTGAGTTAAAG-1CTGGTAAAGACTTACA-1CTGGTAACACATAGAA-1CTGGTAACGAGCTCTT-1CTGGTTTCGAGCAAGA-1 CTGTACTTCTTAGCAT-1 CTGTAGCCATCTCACT-1 CTGTCAAATGGCTCGG-1 CTGTGCAGGGTAGGTC-1 CTGTGGTCGGGAGATA-1CTGTTACCCAATCTAG-1CTGTTCACTGCCTGTG-1CTTAACTTACAGTATA-1CTTAAGCAGCGAGCCG-1CTTACACGGTATTCCA-1CTTAGCCTTCCACATG-1CTTAGGTATAGACCAG-1CTTAGTAGGCCTACAG-1CTTAGTGTAGTAGCAT-1CTTATGCGCTCAGGGC-1CTTCAACTCCACTTGG-1CTTCAGTGGTCGCCTA-1CTTCAGTTGGACAACG-1CTTCATTGTCAGTGGA-1CTTCCGCTCCGTGAAG-1CTTCGATTGCGCAAGC-1CTTCGGCCAATTGTTT-1CTTCGTAGATAGGTGA-1 CTTCTATGTTGAAGTA-1!CTTCTATTAATGCTAG-1"CTTGAGTTAGGGTAAT-1#CTTGATGACCATCCAG-1$CTTGCAACCGCCTCCT-1%CTTGCCCACCCACGCA-1&CTTGCCCAGGCTCTAC-1'CTTGGCCAAGCTGGGA-1(CTTGTACTTGTTGACT-1)CTTGTCAACATTCGAG-1*CTTGTGCTCACCGATT-1+CTTGTTGCTGAGTCAA-1,CTTTAACTTTCAAAGG-1-CTTTAATATTGGTCGA-1.CTTTACCGAATAGTAG-1/CTTTAGGAACACTGTT-10CTTTAGTGCTATTATT-11CTTTCTGTGCGGGCTT-12CTTTGACGTCGCTTCT-13CTTTGCATCGCTCTTG-14CTTTGGCTTTAGTAAA-15CTTTGTCGAATGCTCC-16GAAACAGATGACCACC-17GAAACATAGGAAACAG-18GAAACCATGGTGCGCT-19GAAACCGAATTACCTT-1:GAAACCTATACAAATG-1;GAAAGAACAGCGTTAT-1<GAAAGCAGTGCACTTT-1=GAAAGCCCTTTGGACC-1>GAAATATCACCATCAG-1?GAAATATGCTTGAATG-1@GAAATCGCGCGCAACT-1AGAAATGGCGGTGTTAG-1BGAAATTAGCACGGATA-1CGAAATTGTCTCTATAA-1DGAACAACTGGGATGAA-1EGAACACACATCAACCA-1FGAACAGATTACTAAAT-1GGAACCCTCTGTGTTCT-1HGAACCTCGACCTACAC-1IGAACCTTTAACGATCC-1JGAACGACCGAATGATA-1KGAACGCGGGTCACACG-1LGAACGTCTCATGGTCG-1MGAACTGTGGAGAGACA-1NGAAGAAACGATATTGT-1OGAAGCCACTGATTATG-1PGAAGCCTGCACATTCC-1QGAAGCGTGAGGAATTT-1RGAAGCTCGGACCCGTC-1SGAAGCTTGCTGACCGC-1TGAAGGAGTCGAGTGCG-1UGAAGTCAGTTGCACTA-1VGAAGTCTCCCTAGCGA-1WGAAGTGATTTATCGTG-1XGAAGTTTCCACTCAAT-1YGAATAGACGCGACCCA-1ZGAATAGCCCTGCGGTC-1[GAATCGACATGGTCAC-1\GAATCTGAACATTCTC-1]GAATGCGAATCGGTTC-1^GAATGGGCTTATCGAC-1_GAATGTATGGCAGGTC-1`GAATGTGGTCCGGATT-1aGAATGTTGGGTAATCT-1bGAATTATAGTGAAAGG-1cGAATTCACCCGGGTGT-1dGAATTTCTCGCTGCAG-1eGACAAACATATGCAGG-1fGACAACGACCATTGAA-1GCOLGACAACGCAGCTTACG-1GACACAAGGGAAGAAA-1GACACAGCCGGGACTG-1GACACTGAGTTCAGTG-1GACACTGGAACCCGAT-1GACACTTCCAATTACC-1GACAGATTTCTGGCTC-1GACAGCCAGACCTGAC-1 GACAGGCACACACTAT-1 GACATCCGTCGAACTG-1 GACATCGATTTATAAC-1 GACCAAACGTTGACTG-1 GACCACACTTCCCTTT-1GACCAGAGCCCTGTAG-1GACCCAATTATGATAC-1GACCGACGTGAAAGCA-1GACCGACTGAAGCGTC-1GACCGCGTCTGACGTG-1GACCGTGCTGACGGTG-1GACCGTTACATGCGAC-1GACCTTCCACGTCTAC-1GACGACGATCCGCGTT-1GACGAGGCTAATAAAC-1GACGCATACCCGTCGG-1GACGCCGTAAAGGCTA-1GACGCTTGCTTCTAAA-1GACGGGTTGGCCCGTA-1GACGGTCAATAGAAGC-1GACGTGTAGGGATTAT-1GACTAAGATCATGCAC-1GACTAAGTAGGCTCAC-1 GACTACAAAGCGGTGG-1!GACTAGGCCGTTAGGT-1"GACTCACCCACGTGAG-1#GACTCCCAGAATAAGG-1$GACTCCTTCCAATTGA-1%GACTCGCGGGAATGAC-1&GACTGCAAATCGAGCT-1'GACTGCACCAGCCCAG-1(GAGAACGGTTCTGACT-1)GAGACCCTGCAACGCC-1*GAGACTGATGGGTAGA-1+GAGACTTCGCGACCGA-1,GAGAGGGCGCGAGGTT-1-GAGAGGTGCATTCTGG-1.GAGATCTGCTTGGCAT-1/GAGATCTGTCACTCCG-10GAGATCTTCCATGACA-11GAGATGGCTTTAATCA-12GAGATGGGAGTCGACA-13GAGCACCTGTGTCCAG-14GAGCCAGCTACCTGTG-15GAGCCGAGCGTTTATT-16GAGCGCAAATACTCCG-17GAGCGCGCACGAGTAG-18GAGCGCTGTTAGGTAA-19GAGCTAAGGGCATATC-1:GAGCTGTCGTCTCGGA-1;GAGGAATGGAGAGGTT-1<GAGGATAAACAGTGCT-1=GAGGCCCGACTCCGCA-1>GAGGCCTGTTGATACA-1?GAGGCTATCAAAGTCG-1@GAGGGCGCAGCTCTGC-1AGAGGTACGCGTGTCCC-1BGAGTAAGGCCACGGGA-1CGAGTAGATACTAGTTG-1DGAGTATGCCCGCCTTG-1EGAGTATGCGCGTGCAT-1FGAGTCAGACCAGAATC-1GGAGTCCGCTTACCGGA-1HGAGTCTTGTAAAGGAC-1IGAGTGTCAACCAGAAA-1JGAGTGTGCGGTACCCA-1KGAGTTCTGTGGGTGCT-1LGAGTTGATGGCAATTT-1MGATAACTCGCACTGTG-1NGATACGATGGGAGTCA-1OGATAGATAGTACAGTC-1PGATAGGTAACGTTGAC-1QGATATCAAGCAGGAGC-1RGATATGAGACACTAAC-1SGATATGCGGTAGCCAA-1TGATATTGAGATTGGCG-1UGATATTTCCTACATGG-1VGATCATTCCAAACATT-1WGATCCCTTTATACTGC-1XGATCCGGGAATTAACA-1YGATCCTAAATCGGGAC-1ZGATCCTCGACACTGGC-1[GATCGACACTATCTGA-1\GATCGCGGGCTCTCCA-1]GATCGCTACCCGATTT-1^GATCGCTATATCTCAG-1_GATCGGATAGAACCAT-1`GATCGGTGGCCATAAC-1aGATCGTGACTGATATC-1bGATCTAACCGTATTCA-1cGATCTGCTATCTAAGG-1dGATCTTGGAGGGCATA-1eGATCTTTGCAGGGTAT-1fGATGACAAGTAGGGCA-1gGATGACGATGATCGCG-1hGATGAGGAACCTTCGG-1iGATGCCTTCTGCGGCA-1jGATGCGTCCTGCATTC-1kGATGCTGTATTTCATC-1lGATGTAACGAACCACC-1mGATGTTCAATCCACGA-1nGATTAACCGAAAGCCC-1oGATTACTGAATTTGGG-1pGATTCCCTTGTCGCAG-1qGATTCCGCGTTTCCGT-1rGATTCGACGGTTCACG-1sGATTGGGAAAGGTTGT-1tGCAAACCCTACATTAT-1uGCAAACCTTGGCCATA-1vGCAAATATTACGCTTT-1wGCAAATGAGGACACTT-1xGCAACACACTAGAACT-1yGCAACAGCAGTATGCG-1zGCAACCACCAGACCGG-1{GCAACCACGGCCGCGT-1|GCAACGGCTAGTTATG-1}GCAAGAATTCCTTGGC-1~GCAAGATGTGTTCGCG-1GCAAGCTGGAAACCGC-1€GCAAGTGCACAGAGAA-1GCACAAACGAGGCGTG-1‚GCACAACCTCGGGCGT-1ƒGCACACACTGGTAGCC-1„GCACCTAGGCGAGTCC-1…GCACGCCGATTCCCGC-1†GCACGCCTACTTAGAT-1‡GCACGTGGTTTACTTA-1ˆGCACTGCCTACCTTTA-1‰GCAGACCCAGCACGTA-1ŠGCAGATCCATAAGACT-1‹GCAGATTAGGGATATC-1ŒGCAGCACACAGCCCAG-1GCAGCCTATATCACAT-1ŽGCAGCTATGGACAGGT-1GCAGCTGTCAACGCAT-1GCAGGAACTTAGATCT-1‘GCAGGACTATAGAATA-1’GCAGGTAGAGTATGGT-1“GCAGTGTGGCTATAGG-1”GCATAGAGCACTCAGG-1•GCATCGGCCGTGTAGG-1–GCATGAGGGACGCGGC-1—GCATGCTAATAACGAT-1˜GCATGGGTACTGACGC-1™GCATTCAAGGCAACGC-1šGCATTGACTTGCGGAA-1›CGTGCATTGTCGACGC-1œCGTGCCCTCCCGAAGA-1CGTGGCCGAATATCTA-1žCGTGTATGGGAGCTGA-1ŸCGTGTCCCATTCGCGA-1 CGTTAAACTAGTTAGG-1¡CGTTAATGTCCCGACG-1¢CGTTAGCTCACAACTG-1£CGTTATCATACTTCCA-1¤CGTTCAGACCCGCGAA-1¥CGTTCATGGTGCGCGT-1¦CGTTCTTCGCACACCT-1§CGTTGAATACCGCGCT-1¨CGTTGAGCGACCGTCG-1©CGTTGAGTAATTGCGT-1ªCGTTGTAAGATTGATT-1«CGTTGTCGGCAATTGA-1¬CGTTGTTTCAATTCCC-1­CGTTTCACTTCGGGCG-1®CGTTTCGCTCATTACA-1¯CGTTTGTGTAGAGGGT-1°CTAAAGAATGCCTACT-1±CTAAAGGGAAATAGGA-1²CTAAATCCTATTCCGG-1³CTAACAGCACAATAAC-1´CTAACCGCGCGCCCGT-1µCTAACGAAACTTGCTG-1¶CTAACTGATAATCGCC-1·CTAACTGGTCCGGTTC-1¸CTAAGGGAATGATTGG-1¹CTAATTCGCACGCGCT-1ºCTAATTCTCAGATATT-1»CTACACTCGCAGATGG-1¼CTACCCTAAGGTCATA-1½CTACGACTAGCTATAA-1¾CTACGCACGGAGTACC-1¿CTACTATCATAGGTTT-1ÀCTACTATCTTTCAGAG-1ÁCTACTCAAGGTATAGT-1ÂCTACTCTAGGCCCGGC-1ÃCTACTGCCACCTGACC-1ÄCTAGATGTGAGTGTAA-1ÅCTAGATTTACGACGGC-1ÆCTAGCATAGTATAATG-1ÇCTAGCCGATGTTATGA-1ÈCTAGGCGCCCTATCAG-1ÉCTAGGTCTGAAGGAAT-1ÊCTAGGTTCGGACGTGA-1ËCTAGTAGAAAGGGATT-1ÌCTAGTCACGTCTTAAG-1ÍCTAGTGAAGGACAGGA-1ÎCTAGTTACAACCCGGT-1ÏCTAGTTGGGCCCGGTA-1ÐCTATAAGAGCCAATCG-1ÑCTATACTTAAAGCGAG-1ÒCTATCGACGAAATACA-1ÓCTATCGGGTCTCAACA-1ÔCTATGCCCGAATGCAA-1ÕCTATGGGAAGCGGAAT-1ÖCTATGTCACTAGCCCA-1×CTATGTGAGTCACGGC-1ØCTATTCATGTGTCCCA-1ÙCTATTGTGTTTGGTCA-1ÚCTATTTGCTTGGAGGA-1ÛCTATTTGGTTACGGAT-1ÜCTCAACTAACCCGGAT-1ÝCTCAAGACATTAGCGC-1ÞCTCACATTTACTAAAT-1ßCTCACTGTGATACTTA-1àCTCACTTGGCTGGTAA-1áCTCAGATTGTGATAAG-1âCTCAGTCACGACAAAT-1ãCTCATAAATGTGTATA-1äCTCATGGTAATTTGCG-1åCTCATTGCTCTAACAA-1æCTCATTTGATGGGCGG-1çCTCCCTCCTTTCGATC-1èCTCCGCCCACATGAGG-1éCTCCGGCCTAATATGC-1êCTCCTCCAGCTCACAC-1ëCTCCTTTACGCAAGTC-1ìCTCGAGACATACGATA-1íCTCGAGGTCGAACAGT-1îCTCGATATTTGCGAGC-1ïCTCGCACCTATATAGT-1ðCTCGCATTGCATAGCC-1ñCTCGCCGAATGTAGGG-1òCTCGCTAGGTAAGCGA-1óCTCGGTACCACTGCTC-1ôCTCGGTTGTCGGCCCT-1õCTCGTCGAGGGCTCAT-1öCTCGTCTGTGCCTTCG-1÷CTCGTTTCTAATGTTT-1øCTCTAATGCATTGATC-1ùCTCTACACTGGCGATT-1úCTCTAGCCCTCGGAAA-1ûCTCTATTTGGCTGCAG-1üCTCTCACAATCGATGA-1ýCTCTCTAACTGCCTAG-1þCTCTGGACGCCTGGTG-1ÿCTCTTCTATTGACTGG-1CTCTTGTCCCGCTTGG-1CTGAAAGAGATCCGAC-1CTGAATCCGAGACCTC-1CTGAATTTATTGCCAG-1CTGACTGCGCAGCTCG-1CTGCAAGCACGTTCCG-1CTGCACAACTACATAT-1CTGCACTCCAGTACAG-1CTGCAGAGAATCAGAG-1 CTGCCAAGGTTGGAAG-1 CTGCCATGCATCACAT-1 CTGCCTTTCTAGTAAA-1 CTGCGACCTCGCCGAA-1 CTGCGTTACGATATAA-1CTGCTGAGGCCACGAA-1CTGCTTGGCGATAGCT-1CTGCTTTATGTCCGCG-1CTGGAAATGGATGCTT-1CTGGAAGACACGGTGG-1CTGGACGCAGTCCGGC-1CTGGATTTACACTTGA-1CTGGCATCCGAATGAG-1CTGGCGACATAAGTCC-1CTGGCGATTTACATGT-1CTGGCGCACAGGTCTG-1CTGGCTGATTCATCCT-1CTGGCTGGTTGTCAGT-1CGCGTTCATGAAATAC-1CGCTACGGGACATTTA-1CGCTAGAGACCGCTGC-1CGCTATTCTTAGGCTC-1CGCTCTCCGTAGATTA-1 CGCTGGTGACTACCCT-1!CGCTGTGACGCCGCAC-1"CGCTGTGTGGATGTTG-1#CGCTTATTCCCGGTCG-1$CGCTTCGGTCTAAGAC-1%CGCTTTCTTGCATTCG-1&CGGAAAGAATCAAACG-1'CGGAACGTAAACATAG-1(CGGACCTTTACGTCCC-1)CGGACGTTACTTGAAG-1*CGGAGCAATTTAATCG-1+CGGAGCATGGCGATCC-1,CGGAGTTTGAGAGACA-1-CGGATCCTCAAGGACT-1.CGGCAAACATCGTGCG-1/CGGCAATAAGATCGCC-10CGGCAGGGTCGGGTTG-11CGGCCACGCACAAAGT-12CGGCCCAACCTGTAGT-13CGGCCCAGGTATATCC-14CGGCGCCATCAATCCC-15CGGCTCTAAAGCTGCA-16CGGGAATATAGTATAC-17CGGGAATTTATGTAAA-18CGGGAGCTTCAGTGTA-19CGGGATCAATGTAAGA-1:CGGGCAGCTAAACCGC-1;CGGGCCTTCTTTGTAA-1<CGGGCGATGGATCACG-1=CGGGTGTACCCATTTA-1>CGGGTTTGTTAGGGCT-1?CGGTACGGCAAACCCA-1@CGGTACTAGAATCAAA-1ACGGTAGAGGTGCAGGT-1BCGGTATAGGTATTAGC-1CCGGTCAAGTGGGAACC-1DCGGTCCGTCGCAAGCC-1ECGGTCTATCAACCCGT-1FCGGTGAAGACTAAAGT-1GCGGTGCAGATAGAACG-1HCGGTGCGCGTTGGTCC-1ICGGTGGGCTCCAGCCT-1JCGGTTATCCAACAGTG-1KCGGTTCAAGTAGGTGT-1LCGGTTGACCTGGCATA-1MCGTACCTGATAGGCCT-1NCGTAGAGAGTAATTAT-1OCGTATTAAGAGATCTA-1PCGTCACGTCCATTGGT-1QCGTCCTCATCGCGTGC-1RCGTCGCATGTGAGCCA-1SCGTCGGATAGTGTTGA-1TCGTCGGGTCTAAGCGC-1UCGTCGTCCTTCGCGAA-1VCGTGAAGTTAATTCAC-1WCGTGACATTGGGTCGT-1XCGTGACCAGTCCTCTG-1YCGTGCACACCACTGTA-1ZCGTGCAGACTGGGACA-1[CGATGTTGTTATCTAC-1\CGATTAAATATCTCCT-1]CGATTCGCCTGGCTGC-1^CGCAAACACGAGTTAC-1_CGCAATTAGGGTAATA-1`CGCACATGTCCACTAC-1aCGCACGTGCGCTATCA-1bCGCAGATCTTCACCCG-1cCGCAGGCGATCCAAAC-1dCGCATGCCGAATGCGT-1eCGCATGGTGCGATGCT-1fCGCATTAGCTAATAGG-1gCGCCACAGGTCGCGAT-1hCGCCATCCGATTATGA-1iCGCCCAGCACGCCTAG-1jCGCCCAGCGTTTCACG-1kCGCCCGCTTCCGTACA-1lCGCCGCCCATGCCTGT-1mCGCCGTTCAGCATAGT-1nCGCCTCCCTCCTCTAT-1oCGCCTGGCCTACGTAA-1pCGCGAAGTGGCATACT-1qCGCGACCGCGACAGAT-1rCGCGAGAGGGACTTGT-1sCGCGAGTCTGCCGGGT-1tCGCGCAAATGTCCAGA-1uCGCGCATGTTTGATTG-1vCGCGCCCGACTTAATA-1wCGCGGCTCAACTTGAA-1xCGCGGGAATTAGGCAG-1yCGCGGGAATTCCTTTC-1zCGCGGTCACAAACCAA-1{CGAGAGCGCGTAGATA-1|CGAGAGCTTTCACTAC-1}CGAGAGGGTAGCCGCG-1~CGAGCTGGGCTTTAGG-1CGAGGCTAAATATGGC-1€CGAGGGACTGCGGTCG-1CGAGGGTATCCAGGTG-1‚CGAGTACTAAAGAGGA-1ƒCGAGTGAAGGTACCAG-1„CGAGTTCTGTCCCACC-1…CGAGTTTATCGGACTG-1†CGATACCTCGCGGACA-1‡CGATAGTCGTACTGCA-1ˆCGATCCGACCCAGTGC-1‰CGATCTGTTGGAGGAC-1ŠCGATGGACCCTACGCC-1‹CGACCCTTAACGCCGG-1ŒCGACCTACTAGACAAT-1CGACGCATCCGTACCT-1ŽCGACTCAGGATGTTAT-1CGACTTTGTATAGCCT-1CGAGACCCTAGAGTGT-1‘CGAGACTACTGCTGCT-1’CGAGAGATGTGAACCT-1“CGAATGACGCATAATG-1”CGACAATTTGATCTAA-1•CGACACGCTCCGACAG-1–CGACAGTTCGCGTTAT-1—CGAATCTGCTCGACGC-1˜CGAATGAAGTCATTGC-1™CGAAGTTGCTCTGTGT-1šCGAAGCTATAAATTCA-1›TGAGAGATTTACCACG-1œTGAGATTAGGCCCTAA-1TGAGCCATACAGTCTC-1žTGAGCGGAAAGTGTTC-1ŸTGAGCTTTAATGACGC-1 TGAGGAGTGCCAGCTT-1¡TGAGGCATGTACTGTG-1¢TGAGTAAATTAGCGTA-1£TGAGTGCCTCTTAAAT-1¤TGAGTGGTCCGTGACG-1¥TGAGTGTAACAACGGG-1¦TGAGTTAAAGACATTC-1§TGATACATTTAGCCGT-1¨TGATCAGGGAACTGCT-1©TGATCCCAGCATTAGT-1ªTGATCGGTTTGACCCT-1«TGATCTACGCTGATCT-1¬TGATCTATCACACTCT-1­TGATCTCCGGCGCCAG-1®TGATGGCTGTTTCTGA-1¯TGATGTCAATTAAGTG-1°TGATTATGGCACGCAG-1±TGATTCAGGTCCCGCG-1²TGATTCCCGGTTACCT-1³TGATTCGTCTATCACT-1´TGATTCTGTCGCCGGT-1µTGATTTATTAGCTGTG-1¶TGCAACCCATCTGCGG-1·TGCAACTACTGGTTGA-1¸TGCAAGAATGACGTAA-1¹TGCAATCTAACACGGT-1ºTGCAATTTGGGCACGG-1»TGCACAGTGAAGTTAT-1¼TGCAGAACTATATCGT-1½TGCAGAGTACCGAGCA-1¾TGCAGATCGTCCTAGG-1¿TGCAGCTACGTACTTC-1ÀTGCAGGATCGGCAAAG-1ÁTGCAGTTTCCTCCCAT-1ÂTGCATATGTCTGTCAC-1ÃTGCATGGATCGGATCT-1ÄTGCATGTGGTAATCTA-1ÅTGCCAAAGTCAGACTT-1ÆTGCCAATGGGTACTCT-1ÇTGCCACACTAGAGGAA-1ÈTGCCACCTGGCGAAAC-1ÉTGCCAGTACGTGGAGA-1ÊTGCCATTACTAAAGAA-1ËTGCCCGATAGTTAGAA-1ÌTGCCCGTACCGTTAAA-1ÍTGCCGTGGATCGTCCT-1ÎTGCCGTGGGACCCAAT-1ÏTGCCGTTCTTAATCGG-1ÐTGCCTAATTGAAGATT-1ÑTGCCTGATCAAACGAT-1ÒTGCCTTGGCCAGGCAA-1ÓTGCGAATATGGGATTT-1ÔTGCGACACCCTAGTGC-1ÕTGCGAGAATATTACCC-1ÖTGCGAGATGGCGGCCA-1×TGCGAGCCCTTCCGCG-1ØTGCGCAAAGCATTTGG-1ÙTGCGCGATTAACGGAG-1ÚTGCGGACTTGACTCCG-1ÛTGCGGAGTAAAGGTGC-1ÜTGCGTAAGAACCTGAT-1ÝTGCGTACGGCTAATTG-1ÞTGCGTCATGACTGAGC-1ßTGCGTTTGTTGACACT-1àTGCTAAGTGTCTATTT-1áTGCTCCACAGTTCTTA-1âTGCTCGGCGAAACCCA-1ãTGCTCGGTGGGTCACC-1äTGCTCTTGAGAGTTTG-1åTGCTGTTGAAGAACTC-1æTGCTTCCCAAGCAGTA-1çTGGAACCACTGACACA-1èTGGAAGAAGGGAACGT-1éTGGAAGGATAAAGATG-1êTGGAATATCCTTGACC-1ëTGGACCAATCTAAGAT-1ìTGGACGCAATCCAGCC-1íTGGACTGTTCGCTCAA-1îTGGAGTGATGCGATGA-1ïTGGCAAACTAAATTAC-1ðTGGCAACTCGCGCGCC-1ñTGGCAAGCACAAGTCG-1òTGGCAATGGGACGGCG-1óTGGCAGATTACGATCA-1ôTGGCAGCAGTAATAGT-1õTGGCATGAAGTTTGGG-1öTGGCCAAACTGAAGTA-1÷TGGCCAATTTGGTACT-1øTGGCCGTATATTGACC-1ùTGGCGACTGCTCCAAA-1úTGGCGATCAAGTTATG-1ûTGGCTACACTCTACCT-1üTGGCTATGTGACATAC-1ýTGGCTCTTGTCGCGTA-1þTGGCTTATGTATAATG-1ÿTGGCTTGTACAAGCTT-1TGGGATGCACTCATTC-1TGGGCAATAGTTGGGT-1TGGGCCACAAGAGCGC-1TGGGCCCATACTAATT-1TGGGCGATACAATAAG-1TGGGTGCACAAGCCAT-1TGGGTGGGATGTCATT-1TGGGTGTAATAGATTT-1TGGTAAGCAGGATTGA-1 TGGTAGAATATATGGG-1 TGGTCCCACGCTACGG-1 TGGTCGTGCAAGGCAA-1 TGGTCTGTTGGGCGTA-1 TGGTTAACTTACATTT-1TGGTTAAGGGCGCTGG-1TGGTTCAACGGGTAAT-1TGGTTCGTAGCAAAGG-1TGGTTTAAACGTGGGT-1TGTACCTACACGAGGG-1TGTACGAACAAATCCG-1TGTACTTCCGGGCATG-1TGTAGCCAATTCCGTT-1TGTAGCCATCCCATTC-1TGTAGGAGAAATTTCC-1TGTAGTGATCTATAAT-1TGTATAACAGATCCTG-1TGTATCAGACTGAAGC-1TGTATGGCGCAGACAG-1TGTCATTTGTTGGGAA-1TGTCCACGGCTCAACT-1TGTCCTAAGTCACCGC-1TGTCGTTATCACATAT-1 TGTGACTACGCCAGTC-1!TGTGACTAGAGTTTGC-1"TGTGAGACTAGCCCAA-1#TGTGCCAGAGGCAAAG-1$TGTGCCGGTGCCGGAA-1%TGTGGCAAAGCGTATG-1&TGTGGCGGGCTTCTGG-1'TGTGTCGAAGTCGAGG-1(TGTGTGACCATGAATC-1)TGTTATTGTATGTGGC-1*TGTTCCGCTTCCATGA-1+TGTTCCGGCCTGAGCT-1,TGTTCGTATTGCGGTG-1-TGTTCTTCCATTGACT-1.TGTTGTCAAGAAGTCT-1/TGTTTCTGAAGCGTGC-10TGTTTGAGATCGTCAG-11TTAAACTCGAATTCAT-12TTAAAGTAAGTCGCCA-13TTAACCAACCCTCCCT-14TTAACGAACAAGCAGT-15TTAACTTCAGGTAGGA-16TTAAGATAGGATTGAC-17TTAAGCGCCTGACCCA-18TTAAGGCCCGTACTTT-19TTAAGTATTGTTATCC-1:TTAATCAGTACGTCAG-1;TTAATGTAGACCAGGT-1<TTAATTGCTTTGGGTG-1=TTAATTTCAGACGCGG-1>TTACAACTACGCATCC-1?TTACACGATCTGCGAC-1@TTACAGACCTAAATGA-1ATTACATGCCACAACTA-1BTTACCATTGATTACCC-1CTTACCCATTGCCGGGT-1DTTACCCTAGGGATTGG-1ETTACGGATGGTTCGAG-1FTTACTAAAGGACTTTA-1GTTACTCCGGCCGGGAA-1HTTACTCTGGTACGTAC-1ITTACTGGGATATTTCA-1JTTACTGTCTAGAGCTC-1KTTAGAAGAACATGACT-1LTTAGAATAAGGGTCGG-1MTTAGACACGATCGTTG-1NTTAGACGAGTCACCTC-1OTTAGAGGGATATACAG-1PTTAGAGTTTAGAAGGA-1QTTAGCTAATACGATCT-1RTTAGCTGATTTGCCGT-1STTAGTAAACCTGCTCT-1TTTAGTAGGGCGGCGGG-1UTTAGTTATTCGTGGCA-1VTTAGTTCAAGTGTTCG-1WTTATAGGTAATTGTCT-1XTTATATACGCTGTCAC-1YTTATATTTGGCAATCC-1ZTTATCCGGGATCTATA-1[TTATCCTCAAGGAATA-1\TTATCTGACATTAGGA-1]TTATCTGTATCATAAC-1^TTATGAATGAAAGGGA-1_TTATGACAAACTGGAT-1`TTATGATCTTAACGAA-1aTTATTAGAGCGTGTTC-1bTTCAAAGTCTCTAGCC-1cTTCAATACTCTGAATC-1dTTCACGAAAGGATCAC-1eTTCACTCGAGCACCTA-1fTTCAGCCCTGGTCCAC-1gTTCAGCTGGCGTGCCC-1hTTCAGGCGTCAAAGCC-1iTTCATGGCGCAACAGG-1jTTCCAATCAGAGCTAG-1kTTCCAATCTGGCTATC-1lTTCCACACAGATTTGA-1mTTCCAGACGAGATTTA-1nTTCCATCATGCGGTGA-1oTTCCATCGACAGCGTG-1pTTCCCGGCGCCAATAG-1qTTCCGCAGAGAAATAT-1rTTCCGCGTGAGGCGAT-1sTTCCGGCCTTGAGGCT-1tTTCCGGCTCGACTTCT-1uTTCCGGTTACCCACTT-1vTTCCTCGAGGGTGTCT-1wTTCCTCGGACTAACCA-1xTTCGACAGAGCCCGTG-1yTTCGACGGGAAGGGCG-1zTTCGCACTCGCGTGCT-1{TTCGCACTGTACGACA-1|TTCGCCGCTCGCGCTA-1}TTCGCGCGCCATACGA-1~TTCGCTATCTGACGTG-1TTCGGCAACCCGCTGA-1€TTCGGGACTAATCGCG-1TTCGGGCGCTAGTCTT-1‚TTCGGTACTGTAGAGG-1ƒTTCGTACTCCAGAACG-1„TTCGTTCAACGAAGTT-1…TTCTAACCGAAGCTTA-1†TTCTAGAAAGTCTTAT-1‡TTCTAGGCCAATTGTG-1ˆTTCTATTAAACGCAGC-1‰TTCTCTTACAGGTGAT-1ŠTTCTGACCGGGCTCAA-1‹TTCTGCCGCGCCTAGA-1ŒTTCTGCGGGTTAGCGG-1TTCTGCTAGACTCCAA-1ŽTTCTTATCCGCTGGGT-1TTCTTGAGCCGCGCTA-1TTCTTGCTAGCATCTC-1‘TTCTTGGACGATCTGC-1’TTCTTGGAGTAATGAG-1“TTCTTTGGTCGCGACG-1”TTGAAAGGTGTAAAGG-1•TTGAACGACGTGCTGA-1–TTGAAGAATTCCCAGG-1—TTGAAGGATGGGCGCC-1˜TTGAATATGGACTTTC-1™TTGAATCGTTGTATAA-1šTTGAATTCACGTGAGG-1›TTGACAGGAGCTCCCG-1œTTGACATGAACGTGGA-1TTGACCAGGAACAACT-1žTTGACCATGTTCTCCG-1ŸTTGACCGTGTTAATGA-1 TTGACGCTCCATGAGC-1¡TTGACTACCATATGGT-1¢TTGACTATTGTCCGGC-1£TTGAGAAGTTTAGCAT-1¤TTGAGAGTACTGCTAA-1¥TTGATAGTCAATACAT-1¦TTGATCTAACTTTGTC-1§TTGATGTGTAGTCCCG-1¨TTGATTAGCTGTTTCT-1©TTGATTATGCAGATGA-1ªTTGCAAGAAGACTCCT-1«TTGCACAATTCAGAAA-1¬TTGCACGGAGCAGCAC-1­TTGCATGCTGATCACG-1®TTGCCAAGCAGAACCC-1¯TTGCCATAGCCCGCTC-1°TTGCCCTGATCACGGG-1±TTGCCGCAGACCTACA-1²TTGCCGCTTTCTAGTA-1³TTGCCTTCTCGCCGGG-1´TTGCGCTTGATCAATA-1µTTGCGGCATCAGAAAG-1¶TTGCGTCGGCCAACCG-1·TTGCGTGAACGCTTAG-1¸TTGCGTGTGTAGGCAT-1¹TTGCTCATAGTACGTG-1ºTTGCTCCCATACCGGA-1»TTGCTGAAGGAACCAC-1¼TTGCTGATCATGTTCG-1½TTGGAAGAATACAGTC-1¾TTGGACATGTGGCTTA-1¿TTGGACCATCTGGCAA-1ÀTTGGACCTATAACAGT-1ÁTTGGATATCGTCTACG-1ÂTTGGCCTAGAATTTCG-1ÃTTGGCTCAATATGTGT-1ÄTTGGGAAGACGAGCCG-1ÅTTGGGACACTGCCCGC-1ÆTTGGGACGTAAGAGTT-1ÇTTGGGCGGCGGTTGCC-1ÈTTGGTCACACTCGTAA-1ÉTTGGTTGCGGTGCGCG-1ÊTTGTAAGGACCTAAGT-1ËTTGTAAGGCCAGTTGG-1ÌTTGTAATCCGTACTCG-1ÍTTGTACACCTCGAACA-1ÎTTGTCACCGCGGTATC-1ÏTTGTCGTTCAGTTACC-1ÐTTGTGAACCTAATCCG-1ÑTTGTGAGGCATGACGC-1ÒTTGTGATCTGTTCAGT-1ÓTTGTGCAGCCACGTCA-1ÔTTGTGCGGAAGCGGAT-1ÕTTGTGGCCCTGACAGT-1ÖTTGTGGTAGGAGGGAT-1×TTGTGGTGGTACTAAG-1ØTTGTGTATGCCACCAA-1ÙTTGTGTTTCCCGAAAG-1ÚTTGTTCAGTGTGCTAC-1ÛTTGTTGTGTGTCAAGA-1ÜTTGTTTCACATCCAGG-1ÝTTGTTTCCATACAACT-1ÞTCCATCAATACTAATC-1ßTCCCAAACAGACAACG-1àTCCCAAAGACGAAGGA-1áTCCCACTCTCTTCCGG-1âTCCCAGCTTTAGTCTG-1ãTCCCAGGCTTAGCTAA-1äTCCCGCGTACTCCTGG-1åTCCCGGGTGTGCTGCT-1æTCCCGTCAGTCCCGCA-1çTCCCGTCGCGTCATAG-1èTCCCGTGTGCAATTTG-1éTCCCTAGATCAATAGG-1êTCCCTGGCGTATTAAC-1ëTCCCTGGCTCGCTGGA-1ìTCCCTTAGATTACTCG-1íTCCGAAGTAGTCACCA-1îTCCGAATGGTCCTGAG-1ïTCCGATAATTGCCATA-1ðTCCGATGACTGAGCTC-1ñTCCGATGGTGCGACAT-1òTCCGATTACATTGCCG-1óTCCGCCTGTCTACAAG-1ôTCCGCGGCAGCATCTG-1õTCCGCGGCCCAATGAA-1öTCCGCTGTCATCCCGG-1÷TCCGCTTATCCCATTA-1øTCCGGAGGAAGGGCTG-1ùTCCGGCCTAGCGTACA-1úTCCGGGCTTGACGGGA-1ûTCCGGTTCGTCCGGTC-1üTCCGTTAAGCTAATAT-1ýTCCGTTTAGCCTTGAA-1þTCCTAAAGATTCAGAC-1ÿTCCTAAATTGGGAAGC-1TCCTAACCGTCGGGCA-1TCCTACATCCACGGCC-1TCCTAGCAAAGAAGCT-1TCCTCCTAAGACATTC-1TCCTCGGGCTGGGCTT-1TCCTCTACGAGATGGC-1TCCTGCCAACTGGAGA-1TCCTGCGTTGATACTC-1TCCTGGCGCTGCCTGG-1 TCCTTACGACGGTCCG-1 TCCTTCAATCCCTACG-1 TCCTTGTCCTTTAATT-1 TCCTTTAAATCCGCTT-1 TCCTTTCTTACGCTTA-1TCGAAATTTAGGACCA-1TCGAAGAACCGAGCAC-1TCGAATATCCCGCAGG-1TCGACAACTGAACCCG-1TCGAGACCAACACCGT-1TCGAGTCTACGATTCG-1TCGCAAAGATGCATTT-1TCGCACCAGGAGGCAG-1TCGCATAAAGGGCGCA-1TCGCCGAAGTTGCGTC-1TCGCCGACATATTCGC-1TCGCCGCACCGCGTGA-1TCGCCGGTCGATCCGT-1TCGCGTAGCAGTGTCC-1TCGCGTCCAGAAGGTC-1TCGCTAAACCGCTATC-1TCGCTACTGGCTTTGA-1TCGCTCGATATATTCC-1 TCGCTCGGCACCAGCG-1!TCGCTGCCAATGCTGT-1"TCGCTGGGCGGATTGT-1#TCGCTTTAAACGTTTG-1$TCGGAATGCGCTCTGA-1%TCGGACGCCCAGCCCA-1&TCGGAGAGTATCGGGA-1'TCGGAGTACATGAGTA-1(TCGGCGAACCCAAACC-1)TCGGCGTACTGCACAA-1*TCGGCTTGTATCGACG-1+TCGGGAACGTGCCTAG-1,TCGGGAGACAGCGTAC-1-TCGGGCCGTCGTGGTA-1.TCGGTCCCGACAATAG-1/TCGGTGACCGCTCCGG-10TCGTAAGACGACATTG-11TCGTAAGCTCCGAGGA-12TCGTACCGACGTCAAG-13TCGTATTACCCATTGC-14TCGTCAAGTACGCGCA-15TCGTCTTAGGCGTTAA-16TCGTGTACTATGGATG-17TCGTGTCACGCTGACA-18TCGTGTTCGACCACAA-19TCGTTAGGAGTCCCTA-1:TCGTTGCTATCCGGTC-1;TCGTTTACGCGACCCT-1<TCTAAAGAACAGTCTC-1=TCTAACCTAGCCTGCG-1>TCTAATACTGCCTCAG-1?TCTACCCAATAGAGAG-1@TCTACCCGCATCATTT-1ATCTACCGTCCACAAGC-1BTCTAGCAATCTCCGCC-1CTCTAGCATCTTCGATG-1DTCTAGCATGCCCAGAA-1ETCTAGGTGGCGACGCT-1FTCTAGTGATATCGTGG-1GTCTAGTTATCAGAAGA-1HTCTATAGGTGGGTAAT-1ITCTATCGGTCGCAACA-1JTCTATGCTATAACGAC-1KTCTATTACTAGAGGAT-1LTCTCAAATCAATCGGG-1MTCTCATGAGATAGGGT-1NTCTCCAACGTAGGTTA-1OTCTCCACAAGTTGAAT-1PTCTCCCTGGGCAGCGT-1QTCTCGAACGAGGTCAC-1RTCTCGACGTATCGCCG-1STCTCGAGGAGGTTCGC-1TTCTCGTGTTACGAGGA-1UTCTCTAATAGCTGGTA-1VTCTGAACTCGTACCCG-1WTCTGAAGCACGTGGTC-1XTCTGAATTCCGTACAA-1YTCTGAGCAATTGACTG-1ZTCTGATGTATTCTGTC-1[TCTGCATACCTTGCTT-1\TCTGCCAGAAACTGCA-1]TCTGGGAACCTTTGAA-1^TCTGGGTAGCGCTCAT-1_TCTGTGCCATCATAGT-1`TCTGTTACCCAGCATA-1aTCTTACCGGAACTCGT-1bTCTTACTTATGCCTCT-1cTCTTAGAGCTCCAATT-1dTCTTAGAGTGAACTCT-1eTCTTCCCATGGGCACA-1fTCTTCGAATAGACGTT-1gTCTTCGATACCAATAA-1hTCTTCTATAACCCGCC-1iTCTTGATGCGTAGCGA-1jTCTTGCTCCCGATACT-1kTCTTGGTAACACCAAA-1lTCTTTAAGACTATGAA-1mTCTTTAGAGTCTAACA-1nTGAAAGGACCTGACTC-1oTGAACTGCTATGACTT-1pTGAATACCGACGCGTA-1qTGAATATGCTATAAAC-1rTGAATGTCAGCCGGCC-1sTGAATTTCACTTGCCT-1tTGACACTTCTCTTTGC-1uTGACAGGACAAGTCCA-1vTGACATATATGACGAT-1wTGACATCGAGCGGACC-1xTGACATGTAACGTGAC-1yTGACCAAATCTTAAAC-1zTGACCCACGTTAGACA-1{TGACGAATATTTCCCT-1|TGACGATGCACTAGAA-1}TGACTATAATCCTTTC-1~TGACTCCGAATCATAC-1TGAGACGTACCTCTCA-1€TATGGGTACGTATCGT-1TATGGTCTGAGTAACA-1‚TATGGTTAGTGGGAGA-1ƒTATGTAGAAACCCGGC-1„TATGTCAAGACCGACT-1…TATGTCTCATTGTGCC-1†TATTAACACCAAAGCA-1‡TATTAACCTGACCGCG-1ˆTATTACCATCCTGCTT-1‰TATTATGTTTGCCTGC-1ŠTATTCAATTCTAATCC-1‹TATTCCACTCAGCTCG-1ŒTATTCCGAGCTGTTAT-1TATTCCTCCGCCCACT-1ŽTATTCGTGCCAGAATA-1TATTGCCGGGCTTGTA-1TATTTAGTCTAGATCG-1‘TATTTATACCGAGTAG-1’TATTTGTTACCCTTTA-1“TCAAACAACCGCGTCG-1”TCAAACTTAGATTGTT-1•TCAAAGAGCTATCTGT-1–TCAAATTGTTGTGCCG-1—TCAAATTTGAGACTCA-1˜TCAACAAAGATAATTC-1™TCAACATAGCGCCCTA-1šTCAACATCGACCGAGA-1›TCAACCATGTTCGGGC-1œTCAACGAGGAGACAAA-1TCAACGCAGGAAATAA-1žTCAACGCGACCGGCAG-1ŸTCAACTGCAGAGTCAG-1 TCAAGAAATACTAGCT-1¡TCAAGCGCGGACGGTA-1¢TCAAGGTTACTACACC-1£TCAATACGCCGTCATG-1¤TCAATCCGGGAAGTTT-1¥TCACAAACCGAGGTAC-1¦TCACAGCAAACTCGAA-1§TCACAGGAGAATAAGA-1¨TCACAGGGAATCGCAA-1©TCACAGGTTATTGGGC-1ªTCACCCTCTTAAGATT-1«TCACCGCTCGGCACTC-1¬TCACGATGTCCGTGGA-1­TCACGCATTGTAGATC-1®TCACGGTCATCGCACA-1¯TCACGTGCCCGATTCA-1°TCACTACGACCAATGC-1±TCACTATCCCTTCGGT-1²TCACTCGTGCAACGGC-1³TCAGAACCTCCACAGG-1´TCAGACGCTATAGAAG-1µTCAGCAAATGCATCTC-1¶TCAGCCAATCCGTAAA-1·TCAGCTTGAGCTTTCG-1¸TCAGGGTGTAACGTAA-1¹TCAGGTTCTTTGAGAA-1ºTCAGTACTGACCCGCG-1»TCAGTAGGGACTATAA-1¼TCAGTGTATACGTCAT-1½TCATATGAGCTTTGTT-1¾TCATCCTCAGCTGCTT-1¿TCATCGACGACCGTCG-1ÀTCATCGATGGTCCCAA-1ÁTCATGCAGGTTCTCAT-1ÂTCATTTAAGTCTCCGA-1ÃTCATTTAGAAGTGTGA-1ÄTCCAACTCAGCTATCT-1ÅTCCAACTTTAAATTCT-1ÆTCCAAGCCTAGACACA-1ÇTCCAATAAAGGCTACC-1ÈTCCACAATGGTTTACG-1ÉTCCACATCGTATATTG-1ÊTCCACCAAGACATAGG-1ËTCCACCTCTAGCCTTT-1ÌTCCACTTTATCTAGGT-1ÍTCCAGAGCACCGGTTC-1ÎTCCAGATGTACGCCAA-1ÏTCCAGGCGAGTACGGT-1ÐTCCAGGGTATATACGA-1ÑTAGGGTGTTTCAAGAG-1ÒTAGGTCGCCGGAACTG-1ÓTAGGTGACGATAACCT-1ÔTAGGTGAGCCCTACTC-1ÕTAGGTGCTCGCCTAGC-1ÖTAGGTGTTCCACAGAT-1×TAGGTTCGAGTTCGTC-1ØTAGTACCACAACTTTC-1ÙTAGTAGCTTATACCAG-1ÚTAGTCCGCAGAGAATG-1ÛTAGTCGATCACGGGTT-1ÜTAGTCTAACAACGAGA-1ÝTAGTCTGTGACGTTGC-1ÞTAGTGCCCTCCAGAGT-1ßTATACACAGACGCCTT-1àTATACGCGTCATCACT-1áTATAGATGGTCGCAGT-1âTATAGCGCACGTTATC-1ãTATATATCGAGAAATG-1äTATATCCCTGGGAGGA-1åTATATTACAAATGTCG-1æTATCACCCAACCGACC-1çTATCACTTCGAGTAAC-1èTATCAGTGGCGTAGTC-1éTATCCAATTGGTTATC-1êTATCCATCTCGGTTAG-1ëTATCCGCACCGTCGGG-1ìTATCGATCTATGCATA-1íTATCGATGATTAAACG-1îTATCTACCACAGCGGG-1ïTATCTGAGCCGATATT-1ðTATCTTGCAATACAAC-1ñTATGAAGAATTAAGGT-1òTATGACCTTGCGCTGG-1óTATGATCCGGCACGCC-1ôTATGATCTTCTCTTTA-1õTATGCTCCCTACTTAC-1öTATGGATGTGCTACGC-1÷TATGGCCCGGCCTCGC-1øTATGGGACCGAGCAGG-1ùTAGATATGGACTGGAA-1úTAGATGGTTCCTTACT-1ûTAGCAGATACTTAGGG-1üTAGCAGTATGACTAAA-1ýTAGCCATTTCAAAGTC-1þTAGCCGGCGGTCAGCG-1ÿTAGCGTCCCTCGATTG-1TAGCGTCCGGTGTGGT-1TAGCGTTGGGTCTTAC-1TAGCTAAGTCCGGGAG-1TAGCTAGAAGGCATGA-1TAGCTAGTGATGATGG-1TAGCTCGCCTGATAAC-1TAGCTGATGTGAAGCG-1TAGGAGGCTCGAGAAC-1TAGGCATGTTACGCCA-1 TAGGCCTATATAGTCT-1 TAGGCGATGAGGTCTC-1 TAGGCTAAAGTGGCAC-1 TAGGGAGCTTGGGATG-1 TACTTTACTGAGCCGG-1TACTTTCCGCACGCCA-1TAGAAAGGTGGCGCTA-1TAGAATAGCCGATGAA-1TAGACGAAACGCCAAT-1TAGACGCCCGTACCGG-1TAGACTACCTAGCGTT-1TAGAGATCATGCAACT-1TAGAGGTTCTACTTGT-1TAGAGTCTAAGCGAAC-1TACTGAGGGAAGAAAG-1TACTGCAATCAATTAC-1TACTGGACAGCTCGGC-1TACTTAAACATGTACA-1TACTTGTTAGTAGTCC-1TACTCTTACTTTACTG-1TACTCTTTCGTCTTCA-1TACTGAACAGATTTAG-1TACTCTCCGAACAAAT-1 TACTCGTTTGAATCAA-1!TACTATGGTTCCTCAG-1"Gene Expression#Gene Expression$Gene Expression%Gene Expression&Gene Expression'Gene Expression(Gene Expression)Gene Expression*Gene Expression+Gene Expression,Gene Expression-Gene Expression.Gene Expression/Gene Expression0Gene Expression1Gene Expression2Gene Expression3Gene Expression4Gene Expression5Gene Expression6Gene Expression7Gene Expression8Gene Expression9Gene Expression:Gene Expression;Gene Expression<Gene Expression=Gene Expression>Gene Expression?Gene Expression@Gene ExpressionAGene ExpressionBGene ExpressionCGene ExpressionDGene ExpressionEGene ExpressionFGene ExpressionGGene ExpressionHGene ExpressionIGene ExpressionJGene ExpressionKGene ExpressionLGene ExpressionMGene ExpressionNGene ExpressionOGene ExpressionPGene ExpressionQGene ExpressionRGene ExpressionSGene ExpressionTGene ExpressionUGene ExpressionVGene ExpressionWGene ExpressionXGene ExpressionYGene ExpressionZGene Expression[Gene Expression\Gene Expression]Gene Expression^Gene Expression_Gene Expression`Gene ExpressionaGene ExpressionbGene ExpressioncGene ExpressiondGene ExpressioneGene ExpressionfGene ExpressiongGene ExpressionhGene ExpressioniGene ExpressionjGene ExpressionkGene ExpressionlGene ExpressionmGene ExpressionnGene ExpressionoGene ExpressionpGene ExpressionqGene ExpressionrGene ExpressionsGene ExpressiontGene ExpressionuGene ExpressionvGene ExpressionwGene ExpressionxGene ExpressionyGene ExpressionzGene Expression{Gene Expression|Gene Expression}Gene Expression~Gene ExpressionGene Expression€Gene ExpressionGene Expression‚Gene ExpressionƒGene Expression„Gene Expression…Gene Expression†mm10‡mm10ˆmm10‰mm10Šmm10‹mm10Œmm10mm10Žmm10mm10mm10‘mm10’mm10“mm10”mm10•mm10–mm10—mm10˜mm10™mm10šmm10›mm10œmm10mm10žmm10Ÿmm10 mm10¡mm10¢mm10£mm10¤mm10¥mm10¦mm10§mm10¨mm10©mm10ªmm10«mm10¬mm10­mm10®mm10¯mm10°mm10±mm10²mm10³mm10´mm10µmm10¶mm10·mm10¸mm10¹mm10ºmm10»mm10¼mm10½mm10¾mm10¿mm10Àmm10Ámm10Âmm10Ãmm10Ämm10Åmm10Æmm10Çmm10Èmm10Émm10Êmm10Ëmm10Ìmm10Ímm10Îmm10Ïmm10Ðmm10Ñmm10Òmm10Ómm10Ômm10Õmm10Ömm10×mm10Ømm10Ùmm10Úmm10Ûmm10Ümm10Ýmm10Þmm10ßmm10àmm10ámm10âmm10ãmm10ämm10åmm10æmm10çmm10èmm10émm10êENSMUSG00000025935ëENSMUSG00000025937ìENSMUSG00000067813íENSMUSG00000025932îENSMUSG00000054493ïENSMUSG00000025930ðENSMUSG00000032769ñENSMUSG00000092083òENSMUSG00000025925óENSMUSG00000032719ôENSMUSG00000067795õENSMUSG00000043716öENSMUSG00000025921÷ENSMUSG00000100868øENSMUSG00000025920ùENSMUSG00000089982úENSMUSG00000025939ûENSMUSG00000079658üENSMUSG00000097744ýENSMUSG00000025940þENSMUSG00000025779ÿENSMUSG00000101640ENSMUSG00000042686ENSMUSG00000100110ENSMUSG00000025777ENSMUSG00000099899ENSMUSG00000067780ENSMUSG00000100053ENSMUSG00000085125ENSMUSG00000025776ENSMUSG00000099895 ENSMUSG00000025774 ENSMUSG00000073735 ENSMUSG00000067773 ENSMUSG00000089787 ENSMUSG00000042596ENSMUSG00000025927ENSMUSG00000100538ENSMUSG00000043760ENSMUSG00000089914ENSMUSG00000099906ENSMUSG00000025929ENSMUSG00000041872ENSMUSG00000041859ENSMUSG00000102121ENSMUSG00000097934ENSMUSG00000025931ENSMUSG00000041809ENSMUSG00000041779ENSMUSG00000099971ENSMUSG00000067879ENSMUSG00000099827ENSMUSG00000025912ENSMUSG00000045210 ENSMUSG00000097893!ENSMUSG00000025915"ENSMUSG00000046101#ENSMUSG00000098234$ENSMUSG00000099032%ENSMUSG00000025916&ENSMUSG00000087199'ENSMUSG00000025917(ENSMUSG00000056763)ENSMUSG00000067851*ENSMUSG00000042501+ENSMUSG00000048960,ENSMUSG00000057715-ENSMUSG00000097171.ENSMUSG00000101314/ENSMUSG000000169180ENSMUSG000000259381ENSMUSG000000994982ENSMUSG000000424143ENSMUSG000000058864ENSMUSG000001014765ENSMUSG000000259056ENSMUSG000000337747ENSMUSG000000259078ENSMUSG000000900319ENSMUSG00000087247:ENSMUSG00000033740;ENSMUSG00000051285<ENSMUSG00000097797=ENSMUSG00000103067>ENSMUSG00000025909?ENSMUSG00000061024@ENSMUSG00000025911AENSMUSG00000025903BENSMUSG00000104217CENSMUSG00000033813DENSMUSG00000002459EENSMUSG00000085623FENSMUSG00000033793GENSMUSG00000025902HENSMUSG00000104328IENSMUSG00000033845JENSMUSG00000102343KENSMUSG00000025900LENSMUSG00000089699MENSMUSG00000051951NTram1OLactb2PXkr9QEya1RGm9947SMscTTrpa1UKcnb2VTerf1WSbsponX 4930444P10RikYRpl7ZRdh10[Gm28095\Stau2]Gm7568^Ube2w_Eloc` D030040B21RikaTmem70bLy96cGm28376dJph1eGm28783fGdap1gGm28784hPi15iGm28154jGm16070kCrispld1lGm28153mCrisp4nDefb18oDefb41pGm15825qTfap2drTfap2bsGm28340tPkhd1u 4930486I03RikvGm28653wIl17axIl17fyMcm3zGm28065{ 6720483E21Rik|Paqr8}Efhc1~Tram2Gm28287€ 3110035E14RikGm29520‚Mybl1ƒVcpip1„ 1700034P13Rik…Sgk3†Mcmdc2‡Snhg6ˆTcf24‰Ppp1r42ŠGm15818‹Cops5ŒCspp1Arfgef1ŽCpa6Prex2 A830018L16Rik‘Gm17644’Gm29663“Sulf1”Slco5a1•Gm29283–Prdm14—Ncoa2˜Gm29570™Oprk1šNpbwr1›Rb1cc1œ 4732440D04RikAlkal1žSt18ŸPcmtd1 Gm26901¡Gm30414¢Sntg1£Rrs1¤Adhfe1¥Lypla1¦Gm37988§Tcea1¨Rgs20©Gm16041ªAtp6v1h«Sox17¬Gm37323­Mrpl15®Gm37381¯Rp1°Gm1992±Xkr4¨+³Äÿÿÿÿÿÿÿÿ  deflateÀ%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð#dýin,s BxÜ(I}Ò0%‚î8÷†ã@å‹HÈÙPÝ•ØX¶š`ŽŸh’¤Æp¡©xg®ã€x³ßˆ[¸ó:½ä˜-ÂÓ Çô¨äË °ØÐÒ¸åÕ À·ÚȳÄÿÿÿÿÿÿÿÿ  deflate%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÂÝŽã¡é•¿îŽ Tô¯(âùÂ0‘ÿ”8SŽ@ç lHu»Pá€Xœl`!ƒhˆ&œp ,7x§1ƒ€Þ6zˆa<„ÛA¼˜_G± M½¨ÌR‚°‰X­¸ ^šÀ¸cȈ ÿÿÿÿÿÿÿÿ  deflate@%%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0 Rg?‚sÿÿÿÿÿÿÿÿ  deflate€.%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%ÁwØ6ø8TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€:(HEAPX09feature_typegenomeidname(dÿÿÿÿÿÿÿÿ deflateÈ;%z‚]PSNODp9øC 8M(xVTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcdÿÿÿÿÿÿÿÿ deflateE%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýbdÿÿÿÿÿÿÿÿ deflateHN%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿadÿÿÿÿÿÿÿÿ deflateˆW%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa¸_x^í“ÇRQ‡â¿À†/†d%H"I@É9#9ç$ð† »™^³ìÞuï„;U“‰¢è¹ +zã%DQNŸcÏMøÿسþ{Hø=ò˜÷¿Dþ ó®á7ÈßÂïßž=ø~ìù ?@ý0öLÂP?Æþø)î9üsÌ»À=c˜÷óÆÑ?þIì›B~ófà³Ø?ŸG~¾ˆüîYF~%¤ï_Eÿ|ý¨o·Búýÿпüê…èÿÒï)‚#_ÒÿO)æ—ÁËá˜WÒßë#öW¡¿:¤ß÷ õϘ_ƒz-æ×a=ú¿ ߀ý¨7¡ÞŒý-¨·¢¿ õvxGìy ïDý+îw£¿õ^xòýxß÷þžÈ"?ÿÒßã'úaþ0úGà¿á0oô­(""""""""""""""""""""""""""""ïÊ+üŸþx^íеVCQÑÈÃ-×Á݂ۿò]¸»-¨`jÊ™æ¬Ýž8„pœJ„â_>„÷áxÞ…÷àu8oÀ›ð¼ OÃ3ð,<Ïà ð"¼/Ã+ð*¼·Áípœ†;á œ…»àn¸ÎÁ½pÜÀƒð< À£ð<OÀ“ð|’üëSø >‡/àKø ¾†oà[ø¾‡àGø ~†_àWø ~‡?àO8àï\ÂI8‚‹àb¸.…Ëàr¸®„«àj¸NÁ1\ ×ÁõpÜ7ÁÍp ÜýŒ™™™™™™™™™™™™™™™™™™™™™™™™™™™™ýc_?˜umx^íÇÅR‚a@ÑÏ™ÿ|i[±» »,»»ã-vÎ]»¼gw¢Bª° äýD!Dþâ_øþŽàø#þ„?ã/ø+~‚Ÿâgø9~_âWø5~ƒßâwø=>/à‹ø¾Œ¯à«ø¾Žoà›xÏà[ø6¾ƒïâ{xßÇð~ˆáÇx^Œ—à¥x /ÃËñ ¼¯Â«ñ¼¯Ããx=Þ€7âMx3Þ‚·âmx;Þwâ]x7Þƒ÷â}x?>€âCø0>‚â <‰áãx ŸÀ'ñ)|ŸÁgñ¹|$I’$I’$I’$I’$I’$I’$I’ô¯~Þ]–—x^íÇENPÑOÒ}Ó+àZ(îPÜÝiq)^Üîà ¬È¬YÎl&/BøŠå„Ÿ>#!Dÿø~ƒßágø~…oá;ø~€á'ø>†Oà,| ŸÁçð| _Á×ð <ÏÂsð<¼/ÂKð2œ‚Óð ¼ ¯Áëð¼ oÁÛð¼ gà=x>€á\8· àB¸.†KàR¸ .‡+à8\ WÁ ¸®ká:¸n€á&¸n[á6¸î€;á$ÜwÃ=p/Ü÷Ãð <Ã#ð(<Ãð$<OG~gffffffffffffffffffffffffffffÿØ7ÅsÓx^™é®¤5 ›aß7Þÿ1™]šÒ‘ûŽÄ£$Ž·ØÎòu¿{<ïÞãó÷øä ÆŸfüÙs ñÕÿò9V2Ðäß>[mÀSýò_>H§¿>ý¤}9uT7²»Ö/žôÚ”¿þÿñœWFÝ@ÿ®µ€®¥¶ËóÏãƒo´oùâxã ðMZçvÝõ_}ÊVüøø°¶Í™-|Æ¥²ÀøÔÛµ[`Wë銥<µ%à§.œ“O}ø¡´_¥ŸõQZ}øûñ_˜ÿ>|Ý ú·9­ŸE÷NmvmÕµm×)¾{Òœ_ÝåUòšçÒ‹_ž­uBLWÏêßyÆ/!¼V®ñ1êxÕâ[í´ViOÿªcÑxÔ§ú»ýÚ[9ñÓãÃ:ߊù+¨³gÅΙÿ÷òµ®vŸ©ç‡ð4Fî³òÙ·¥îɾ^qùùI'·î¹ž#ÅÆª¶×wæØöá+O«<­¹Á×(ä×oÆ[7 øäáÔëÙ1y+móAëåÝTך¥·Fwž³¿¼øÐ˜Tï¯Ï±ww׿õÒÌõ,»l€ß2W™ÆK^û¾@k€¸šÃµ ¸{h©ïìµgï\À»–V•ç\dŒœgù®×ÒßwðÛ£çS}Øx¸´)_}þгoívl¿ºõÍzvÍÀøU¦ké½H.vÞX]¹¤¿{»óÀ:q/]kX™Åíâ—ÆY}ñ¼|æ»2­›¾]kîÚûèœãëP·±í°ýªŽæ™1ûI™ò_¶.ì7õÖ•(ýz«×yvn¡nÇ­‡Ú¤oÉßœWVï;ùÖ‡•¯n`nåÛ³`û}7밺ѥŸ½›·ÖÔåc¿¹^ù²¹iJÖí[oœž+;WûW½sÎ(W^ѹßý\ãµGV/h>¥—§ýŸß9¥›;Ûæ[›µ¥m­ëïúd~*Ï»¹Íoe}çÂÓ8î÷7iëKõsöà3rÞÂ-Ms¶¹ß±ñó¬Øyß êýëÙ‡ÿªËûÀØõÛÈu6¿o¡¾ÿŠÚ©ß{oï¼Ø8_v‹W9uÒÕë¾_;…1aîªW¨Ïøåú_y­ƒkìºâ±ý·jOè—ôžçµ#/4c¼ob[¾éSßÞ÷ô×Ðû¾kýÒV^ºöœ¿ò¬L74“¾§û}wA]Í­ü½ó6÷bc¼ó‚ßýëë§Wò¯ö}ÏÐ7€zºß­}§t}—ÎiËÿ1¤í9µ:Û·Ëïÿ1×Û¾`n¿—ê«ç`e®ïZu­þòl½‚ž{­SõÙï»g÷ûúr­Cô÷RÚ+w«kmˆž•]»:7û^[ÄâUŽAããÿ'K/¿ï­ÿƒ=‡l[ÿÀ="ºÓï«Î×Nulìíû»ûž¾¬Ç«§ë¸|¹âxõ—oõmt kÛߨ ÷7Úë}¡Î‹V½€½ºgêêÝ=Pÿ"x^•™çªmEÏ5çŒ("‚ïÿR¸ Š^ýÑÌLç4aíýáíííà >~wô/G†¼²ŒŸ†|22ð8‡·¸õ{àÑQ;OPÝÅ]|ÎÕ_¿Õ£]y¿záÁ•Nù'û;_Dž¹²æ¬ú•‘öøX[ú*½þ7x}Q¦:¡™FmÊ)ÛÑyk»¾0þžÏ_cåª×¼7GÕÏømæŒí³örŸ½h Ð+wѱ£Ns¤Lk¦­âèmý`ýdKÌw¼× «g×Úš?ykzãÚØ¾ úA¿êìXÝ­·ü€òµ¥lõv•G>Æúì™"/~_¹ÿúíßÞ‡/·6•·qþý¢Õí0²þ)üÄñMøk¯¹¬/â»ËgìÚW/ãoÿúLœÆ¸<À·}çzñÍgçÀ{6úbeWÆœšçöô´&W {.´Ø©¬y¶&êwä¼´ní“õ£q®ùJkíô×;ºr¹£º6vcaþ{ÖÍIõ_°zËßÚ6_Ëç|yóº4ã]]Ögy{Æ*×Ô— ·@]œoŽÕ[ÿª“˜ßÛgBëÁ|ébÔÎÓ™»çHßÛ# ­i{¼`ÜûfÐí‹•w¯wŽNÏôÝÿÖÕºë“:=ãYsþ*Ûz•_º÷ÃúÕ=zÝ+W^ È÷]QÛõe{HþÍw³6}s(¿¾˜ m©×{É<¶6æ@½?¿èðö]°þ¯‹Þø„Æg<ô móTùú*4žòÇNß4õç¿ègDw¿›Úo•o.êoYëµ¾~;èï•·÷`cº ´å³O¯~š#ãX2Å÷µoj¢]c¿jпճº€ö•>z]ùl-JÓÆ¯¯¹ûå)áÒe|=.í6¥ù^ß·Kó¡ëË_¡ÓgŒèPWýißv¾=|ÿõ»omyžêÙzÐ'GÚS/V¯ßóO|À“Î9Fk#½¹çŽp½ß{¶vòzg‹ë¹»¶/~Ÿ[çÎ/Ö¨¾•§>Á³ý¾ lu•¶rÜ#Œõá’]ýKo^r×¾€Ï7Ù¥oïêï9Âx½”ñ›Pœo%û°ûã²%®úÛÅ-¨ksйú=Àÿ6²Ìñ•}®Ïû^Z½öèÚ©Þ ÍËÊt½x ïÌ=Ã.ùK—=Á|ûRÞž»Õ¥,ù€Ç¾WßêWeÍeçSÏòסù”Öó `½sßw¢rèõýlÌÀ{gM{y÷XuKÇîõ»@׋ºßÚ×[—K~ýh/æÆ^=Ê.M~uà럯¹çh{|ý‚®ŽÒ}³–·~T~s²{BìeFó©_k»ºÖ¾ó•i9ï»~.;Oë=G/ž+¿¼øÌ¸½W¬Iul¼Ý¿Öñøkÿt_®Ï@ï¡+†ú舵¿'UN¿û ÄÅà.ïåÏÞ;ß>i®ôQÚ¥¡z¼£Ì™ùôþh.ë¿ñ]}²ào+æîÿúº|Íǯõæäš÷l|‚§{BâÈ‹±×vóá772ž# ½":Ê/®cÇ‘‡ï(ýÛ·µÓ.{Ó>å¬ROï+õ@ƒ§93ÎÆˆLßdðïï(3kû®¹S7ôþoáo&æÂ\^½'ŸvÖW/—ÙîUA\k¨ßý¾Ú8[“Ú‘¾þÁïwŒqʧ=æÖ«úñQ?«Sà?Dý÷²gßú¦OÅwÍÞ«üêÛÚ6õѹoœýucÙõê¿è‹{: àûÉkûx^™ÙÎTEFEÀ Â%ïÿ†þ+9+¬|©Óz±SU{žjèӯǫøù¿»Æo®QÜ·×XüÇ N¹•‘õëxüi\צ4ÖèÔÏŸ®yAÈë›~(§ÌñMü×üû‹þË üYækOYÆ7׸9‘Ž­Æ ø5¸ŽÒ×Þû‹`³úªczchüBuihΤ5NiÌÉ£|Îk³2•ëx’±.âZÓæ¡ðOä+³ºö‚q’—Ò æP?7ø¢¬ø­‘4eÕÙ˜Ô¥¬ý³y’î¨ÞÖk}G_èAp[SÖµQßíùÔ6u`T_m¸~›u÷ÄúU€íáÒú¦k`ss'SÁú6‡­[kÆ‚ú(žóкk£9nohký9Ùßzý~ÍÁ±ÍåINÛÂæ†úh_››‚þ»®Ý9rÎ\½ùT÷<<ò­NýðÌ’Oª§úNº„S^òYÙSÁ»ÏJs¿<³³~±î9*Ø£Úk\ö”çOý¨ÝÍ͇kDÆ»õÿBã<Áæ¨÷¸øÖzãe_èÿ)ww¶«›9¹Äö挹>y¬Ïø`Né{ão}8áêgæñnNz9ŸÔQŸ »æì"6b÷þ2Nc·w˜Ó¯æÛ¼io÷‘y—}yâÌ4tÖÏò‚¥o-ýYÀxä×ÜÕ¯ÊY+cò,Ø>v}zûVß\y¤Õæ¾ïtx ‹ÌÉîê[½€÷߉ ¿ÈýžÏü¤fÌÉ;yßóumÕæ½ãµ¹ö„Ö÷T?uí>º³¿o¥×Ïrcë\9FÇ(÷åšËÓ½Óx8õ¡ÿÝ µ+n÷Š<=7”i.Ì»=Ñ\ÊÇÞROc—ß¹6eå)®¹òœ)ïæ]š1š»Æò[æÄ³tààímmÕ÷Ê5Õµ´Â_¡ã³ºkØ}ÈÜ3fm2î¾hožgžã•¯ ùÔq·GN½´ï uœô×Oµ^oõúvܾ³¾ÛKðÙ¯{–ùÛq1·ßú{ ^{výŒ =ž)€¾tʧ^y‹ì!ýkÞ|S1·¥Ÿ|,”¾ß¥Ê£Ýí- ç˜wG}—Ÿñshú©~çÚí™|çOs\Àî߯¶û}DÝõgm­~W[Ûê0Âî““Œï´ú¥MbÁV¿4W›§úÊÜœ£Çߣж…­Ãh·ýÚÞ`^]ëWcôýflå[»ê–iæqeå­¿¥“rdÏjcù\ïw6i›¿žw»ÿW®4u˜“ÂÖ°z|'ï`ý~&×·¡²®7Ï@s+<}ÍØ;Y½ŒÞÙ®9ój«oam9Wwõ·g¶W:/lnúné~wÊGm÷û ßé¬k}P—9ë· úV›èoÞ÷7ÏIØZ•èݲ½gŒàíuãéÝPÛ­ðçãë9Ç;mßÎ'{û~Zí›Êûþž¾}åõî?Ù¯ÒšëÍщ¿zº–§4{Ø>«ÌÆü,­ÃžqåßwGéÞoÞóÖxmÔîêØ»S»+ÛüUŸsßýðl¿”¿5¨'ýÄgl}'žì/Þ|ªÃÎ×øíÇS_®niŒÜ«ÏôÝÛî»ê[~àký:oí-ßêöÛ)?õ±wZãU·öZsÆOרmk\{½/8ËVWõuoœ|¼‹µ'^ùÆ¡“-À;£8¡ùkmèŸî c®\õë«}S]õä8ßÿK+Ou-¾ëýº¹YYý:ù×Z û»îä[õìq}ë{è÷¿›˜x^…™Ùª$G ïxßÇ;ƒßüÿ¿è ¨€à ¾~©Rj—R•ÕýáíííÃ'øì|þà|\>dÊóJÇmÙoŸ•çâ».”®½¥ãÛw¡wŸ½Kÿú^ý°o®~ž=äØ×—êù>¸<Ådå¥mL§qÕÿê°n_>øUÇê®Ï<#'ñ7†KÐ|üùúÝZ_å™õ§×çW½‰~õcó/?úÕÇs}¿pxðoŽ}`chþéGù´-/{ð·xã­ìÆÞø¶ÚU_cV~eÊ¿tàÇ‘ïŠö°g¨óeyÚßÌôÀÏÚ~ U¦°4sZšçVúÖO™«.PN]ÿß~ÖoV þ5ÆË&çQysÝ>)Ýgòè~k _2íSi}^_Ú«×~ëÓ>ÿø¬õ¸j¥®êy•'zgí*Óy¶z€Î>kÅ~{Âú3#º']¹ÚÙ8ꟸ|K8‡Ðw¿q\¶XÍÑÆ²º^åp¾ö":™“Ê;3Éú.½g.ñ¯>+¿ùlÉ èKgÇÂÏž¾:[͇º¤öCó¦}öŒÍ¹uÕ}}šñʰJ—¯à»¼ñ^vvïŠIèŒ4®õsõ5fžywW§¼ÞÑ}ÞØê¿8y5Ê8ÓÔg•oqÖú ®Ú,oç úû®.Ÿú.ßës}¼ì—κ³X0öÖNÙÕ×øë_cÙ¼þ ^”ñ>Ïl¯þžΚ=Bï•o}C¯ºÛ§®î¯<´?ûv:‡ö¼ï¹fÎZ¯ËŽôú±þƒ÷ÞP7d=S«gã8KêÜsVŸŠW÷õΨç^Ý{÷jäqû`ñúé]·þ7îÆ®Ÿµß}ukoû_ü=P§²[{Wße8µÝýÊÛçúÚßÀzäé{hoþê›ï¶ÖU{È<4VeÔïÞÆß½=/@k£ÌÒÚ/ò¿>´ö?ÏÍ«÷'Ï®ôͳúkG8;úÒ»‘r—l}Òž::Ûä1ÏÎ]åÜ3Ÿ«ß¨Cß–WhýXí`kî=µ}·½¥L×΋W¼Ë_»îµ>+»Ïû{[yô›µ=¹¹]Yæ¶ò{VÖ7stÍ—þv¹5¨¼ëÞ‹ôã=9€~µ°Óš¾Â='Õ}õ©¸¿}9ó×y/yÏÞ«¼GÁ¿ßªË¿´æÜýž)í‚ëÇê\]¯žëTyõk ØïªKŸßOì5ÿ彿©6ÀûûOsäsqtYïhÂÚ¾ü•ÆR¦s¨<é´Þê…†¬ý¶_=[ø¡}ólÑ .û}qŒ®ê(°·±ÿ“¾<ú ˆKÕ[»m•ÕŽòË×XÈ£±#ÿ)ÝK—&¾1úvmVÆùêÕoñÓ³-½¾6Οӧ­ï]gQŸ6~ì®Ïö¬Mêk×¹úä«=Ú"Ÿ¨¼0Ö09ßʯŽWôöÿþäwýÓwá¿tv-h•%7Ь3yŒcó~{òÊS=µ±9ZÚ¥{y{†÷xs%½rÆ·v]góÀþ« åZ‡ éìïÆ_K'gÍy× ^åõËZ`Ζ9ÏÕ]+@œòK¿ö»±|¾Ú—Þs³<•m\מÖ¯Ðïå§u®˜Õ%mëhý¿ú¶úÀ1ÆÖÍB9r¢_»¡¿§Ë<¬Ÿ€ý©œy¨Ý•YyÇ=ó*[ðQ¼º—TW×ïð!Ï÷je×·âZÓ½×ìüúÏ=#¬£æ¬÷5}­Nïø¯çh¿5œßõíxë²sШ!¿OÎAkó•®ó¬0Þ÷tšÓ]ËŸòpfÊ‹~¬)æ ³ûÆ í¾Wïå«¶ë7w§úYÞKÞ>û\ÛÐÛªË8ÍËê·ÿçsÜ}TÞå¿æ…w`àݬòt]¡ë‹<=?k‡ø¥í}e±5qé|ch¯=¶ò´ÆgÎôÁý z'Ò—µ úAoãi½éû®>iÇš\p.wÞz^ß6?;Þ‘DyÍÉ%»þ—Ï3Ø8«wm”Î9tñìd× 2;W({Ùæ‘¾ß¬ò/˜³F´¡LkJ^ÚæÄùÊQK´W¬¢ùï™Ì£skkk«o5Ú¾ƒ÷ÍBÛ³‹úéï úÕ¾0¦¥ù¶‘ý­muì¹â}Eì;yQ;×ïÁµ<¯@w}s›óæim{ÖÔÆÕßÖºÛ< mËSyæ¹OéK/“W=׺ëåÊØzvÜúSÿƦŽå/^Å­Žú]¥££¿åyx¥³{E½ÆZ;¶½Kï^½l˜ÿú¡Œ-õmmv?6—ô¹ƒÉÙî:‡²ÕåwZÏ÷]›ú½>ï|kž–z&¿»®ÍC}«^ãûö/¨Gc{Ô¿¥igeÊsô=W ïD»?–ïÍ|h³wsZ_È™sÕ¹þ–¾´õôìmÍécsCß1mkà£{´uQí¬Ï«[úÆá÷§yZ™ ê¿êñz‡¶¿ºõ¿öÍÕò‚þÒ3§9µ妺]£Ýw ï+ïšÖ¼{U=½‹ó±õÑ<ù~Roý†Þvi»Žý&éy{{ûê>{§ÏßéÓ×|ã'/ÚÜkν7úN{Æ1^ÇýðpÆü‹wúR{ØÉhÞo4÷Ù0˜kz!ö!ö¾~à,NæaìËOpðƒ=lÿ=kÇ}¬9/8ìÕËüý§»†±8Œà³œçècßó¿^ç£ù9ˆ[y;"âuatœý?¾ý·.ªöuäü•®:Y½W†ùöocŒgözýÛkà[c[߯šûŽŒüaÏ–áPSõçòÁëî5G=Çwl²í»£Ä þÖ.ȽÅsßð/{Ÿ¾Ù˪¬÷æ7:¯š›mÈ@O:Áx:/¶×›»¾|f½ìÿùâ¯>÷Ëß¿ý›3ç¸ã¨õf\Û0½î=µ­rW×ÄÝqn½8æëÝëÚdŸ×KàmL/œ¾æ…z÷Fëû¶_³{ 6zl[c±ÝŒßf´mÕwÑÓùögŸó@ÎÙsýì/–íž}ÄwÄ<àRG­cb쬆È+Øð7G¶Í>Õæ‹ÊÚïŒîƒ]œ’ýì]_-Y±ÑùËk>ŒæßõÖX?‘χ×|›Ç½Á´~ƒÜµïšqŒÈßèõòU ¨ëQùÀô7Ñϯ5Øð®OlÄÆ¹Ç}¤ûâ#?õ ­£ÙDÏó>²WÔ€÷wët_ÙÜßs®;ëAŽóÚ²8n\¯µLk¯ß ž;Ö¶´w—;òtJOûÄuofy‰ÉFçlçŽ[1á3ž××ÀâÎqæßÖ³Ú_såZ©­Ü…gÃp>ZoÖíþäßsãoŽ·×;ÀÜ{ܱ¾¹ÐpŸj˜óÊÀ6ø–ÇwóW¾Ø®kbTÙ‹ϋʃ­à_o+|Ž‘e/^¯¯ß à‘|ï<Æö7þæŽåFþ0öU ðQ÷`¶þ·¹Ïöþ´z¿Û›[ãÕnË”¸÷Ý¿È|þ–49†Ý¯žòU¦wÁáûÆ{ðÿ¤µs½ÑýßrÈ}d©g®CðFŽïÕ/éu›;¿È^:ÁöûH¿³,'(^©øà‘Çš÷ß²Íúì£yÖ³˜÷oMàòûÝÆ2]ú?ú;Ðè©gâkïùm·OððŽÍw¿—Œ—-è^Íú½*Ÿçã©¿>»â´ýÙÕ~Î]±¬Ï‹ÑõܶÕoh²Ó;¬ÖÒè)ÆÅìý­^óºg96ôÞòCÎÉlåÞõÜïzcÚÖ¾]åiþÖ·ª÷ÒáµyýžX—e¹ëÔºïpó=<îyð=²-Äžsü~ß ô{½oáÉ’ ç—}ä°Œ<~5ô„¿ ‘1/~øžÙÿ‹ŒÝ³äF–ù¿ÿWØÇ[[+³ ÿÚ÷à·Žæ²äß`Æ»j’\^11ï%;ZÝ¡ƒœÏ.ßg¿{ØåßÔ¼±©)æ–·½ö‘:±};§Ïñ& Ëœ±ÞÈoJßÛº¿açd_c{4i½þf¥ß cmî~çÞh>ÿö5¦¶LŸ3G[9oܽ³8¶©÷˜¹qÚSg÷”Ê?ÝǵzðËv³÷ô–AþýR;/~ûöõo;ÁÝØ;fÞ즆‹}É·±Ãø®Üƒ>þ„Ï^¿+³sî£m€jç¥ùþ&¶¹ãv6 ‡¹É±19îO¶’#øxO‹Ç>X=¯Ï—MÓõ~[úx^™Ù’]5Ç`À6»yàÿÿgp3"£¢ÏÀC…tÔ­êE­åÎ|~{{ûðÂ÷ßðÝ«oû1rú+gNeŽŠ Ww9+—ƒo9jãÇÑŸ3]ûr¶•£cà×÷Ægßï_Þþå@ï§è\~™‹f¼úyåà÷Ñ-Ïê.žòY>|«ÌX×'A®7×»ú¼ª_;[3àç×}ò}q›ç²ÆL\Îqͱ£Ê]í®/Ú²Ïú£'öä¦ïÒ†õQ~ýÓoy­qðgúãòi×õI¦­+¶ê,GÛžúµù2Ÿ×b<íårÓw¯Ñ¿|·~k¯¶úý_ñ-vß>aã³%»:¯º…ñ_2¹”µ/Zã=¯ÙcÕµ6±·u§¬5m œòÓãU¶¬ëž=ìç«–j p¹÷Z»—kn*¿jÆ3¤¹rNÛúV{Õ)ê÷QÁ<ÖäšÓþÖî_ÍÑò3ö[Æ*ëwk@¸Ÿ÷\\Ž]ýxÊ7 ¾øþ™sÊU{ý6ß»Ÿ;¿-Übó¤Úì ~ônÜZYžäµ}Åc÷ìÅS ×ó÷Í»6ßkÑó]÷ÄU½õccÛ½xùÿ§\Ž]gÚrÚ'[Èü²|ËStïs¹×o¹—Ï}h­*/~;Þ:Û{pcs¬¼=«~|éÚ¨ã»VžW»¼»ony®;þŠ ðžPÖ·•Ÿøàh¬õ¿>ÐßsÔ¼mþ›Ïþ>íuåû?g9ðwGýYÀ»wŸãö÷¼,Wõ6îêÏæœ6wŽwžr9¼§:NëûÄ9êÕÏÚn¿h|Þ«ùìÚ+·o¬¯cž»Æ]Ç î]ý«½ µ¿2x.yù¼³7îæ´sÙ+k§ó¯õÔNçx†‰Ëÿ¢÷AëÏY{÷ŽîãêmŽ®¹›¯ú°ú…gŸvÔ¥Ý5–ÙÞKÝ~¯Í¯¯¹Ô"5ÐwL¹ æ‹æ”=Í5õa×¹ûÓ½¡?èv>aó©o»^ê­¯ŒS·;þÖ¦k]ƒêíã\ÝþÆì›–q×Þoe­9ô§v'\“êÁsÅÑ|SvýÔÙufl9®|—ßxô³²ÖÔż«;æ¼Þg«ÜWÍuí·¿sä¼t„¹Sg÷¸ð<ñ›sÂ|ßµ¿÷ {«ïžkOí\}[4W¿1‰ú®ÇÌ‘þ´Þ xñ»ï„êÕ—Ž{möj¹ÊSßÊYnï¦ý}²±m×l ¶ìuëòú[‡í•Ó…<ë£óùÞ=º@Ÿjo¹\³'?v®÷´ù7gí#òÍßPè.7pœ[®CÓnýwn[±5Qh£þ\z‹¿_mý½òhÝ€ë<[l^–¯1VϾ>¼÷&_Îõ yëfc³¿g`±k´:|[KåÜåþŽº|_.až;ֳйêìyÕx•­ýåwí;z—ö÷míëÏ“Ûßk¢óë‹<´] åû¿ÊÚè>ý-ö,±õwú{5±o)‡4&Û¾¯z¿òí8ð~¥ïù!ãúãÞÕúÙ÷—ò§VÎú°µ%¶µc[ý]7Ñ=ƒÜ¼ýªØ—x^…™Ù®7 ¯ã,ÎêìÈÿiR@R8à\?’Hêp“ØÝ3ÞÞÞ>üG_=ãÇgü+kyêHdþmt¤¯³×9£¸ÅcýÓ#wo±ÖÎ7á¹_lI d¿>#üïž±¸µ³Ø?F&^å?D¾qI`£v¯9ôéáuoI_Œýæ|ã€~yøÝ™»æQLy›ãõcôÌèGsÒü1§ž®[s1­7äyosM­üõÆAÕéHm«×ü6Žê´^­ùq/:ëï×úé—<÷Ô®Xê‘Ë›ó ^©ºœî¹ìjÇzµVæ ½Úßü±ÆŸÊ õ™Øå‘ÓÍOí5'ÍŸ>[×??k0”­ýb³9(ŸüYë.÷|ªßœ8JÝï^e~õ–ÜWù÷¯>4Vå‹Ë|sR;Õ‘Ïœ{ëº÷E,hýÿ-¼Ë>*ßÞ«/b÷9VÛâ¸n¿„Äcë¼xæó¨ÞÖQ{ëÓê:î93oîk¿w?==ìl-Õuoñ+_Ý’¹0NÈø®º©SÞçgs|¬«[_ÿ’½ùåOi1Åh>å­íâðt﹤¯ŒÍ7<î‡øŒí­Åpmýûî(_Ýæqik];öùëCÏ,8k‡þb¬×}.ç]ß•à5oêÊk^¬ÁÊ”C}Öo=‹£~ñôOû×l{ïœmÖVÇί3^ŒµóÏÛÿýؽOõÉš©§oíÆâ°<³Ä¼¶»ÏXú„Þu¶­ï'«×Ü6øÞwiŸ7èˆÛ÷UùÎÕßÖ‡kyVšŸÅ‘·ò+ÆbWŸyßsö.wn_¾|èºûVNz66[“õAþ¾­ÍîQF7>é:Œ{ûmÅn¸ö—´lû ´÷ú=þ…/õ;xõºî9/ŸÑ^lÙ‰ãl®öª>Šß:Ø+´Ý}ëŸ69sÆ}=7¯÷ëWä»`ûæµ×Xv¿ÔžyáTfL‹µWjoí*«u¬‡:Å»lnÝÌõÚs$_Ö¯>*ß½¯H=úÑöyÉÞÒü)[»ÎÑ>×\]÷¥ß”=SMùöäë>•ôÿÊË®Kô¥Ú®Ý÷{x¹÷³¾Ô¾1•¿yn~Àj-Jè^ߦ|£(ïùÎc¯†W_Ö×å+c¿G‰ã÷ØÖµ¾×gÚuß×ÄßÑû ·9üynÌŸ{ÄÑ/ù¾‡GûÞ=¨ß¢Õi ä·âï7©¾3÷¿|ïYÖNcZùRcú’~í©ûÊü+‡Æ³üæakqÙ½rí{FqÖÇ}î]ù„È>ï3ïv1{ßKÙûÊvùÞ¯â-¶¼ëYê}4¿ûŸƒ²bT¿xÍíú$õÛñU~œ_ÏŸÆ(Ïÿ «ã]ÜgÃê¸æ7´Å½l•Wÿ{÷yåü¢/éšÃýÿfsç»Åoû:µY}dýönÕ.£½Ü=‹Õ3Òýêþ=kílßPî9CÎoÖæ¤çÏ9ÄïgâáK¿áÕ©¼~úmUAj¿ªï¥ú¶|Λòêç…õž¾*ûsäÛ£šë³~1¿î¡Ôý¡6SúGjÜx^™×®dU ïsð@úÿ¿„%¥’{@‰ìècñ€7b\¬ÑgÜæÁ¬]X^ÿ4<—ŽñÌfìÃ~cý 5Ë~)^ûl¿,7j |ßJvXöÃrÌÛ·ú=úFü¬Û&ú³ÍóÆ1nù±ß›bÙž/ž~íiÝ_ðëCé»g}±·ïpwÓ÷üúkÁª¯¶çóƒãµ[¯5YœµŽ›ósùñë!kùbÑ7ÆÅë|¼ç+C-Øï×Êûõkxÿø´ÕïœY§u¬Æ6G- Ë|•حŘ??ò&jÕ¼W±Fõkvc}plwý†ý¶‹ñ%KŸ:¶ÿ¯d¼îü`ÃÆ×¹P>ûtQkË´äþµàVÆr­?ö§ë“3þ•þbÛÞÖ<ðÇuãz~¼»¼fþ^µX_Æ·ó—8L'z³Þë®Õú‰}ÈÚFˆs;9;Á»Î•Úî9û‹=ëÿööîŸè+÷21qNÊk¾õ§Û6ONãúõõó>q0fsîØ3·Öv›×º<Ïš÷“ç¬Û8WÞL?I†XÀo¼ËÓæº×÷fC¿í¨|ãüËӲ篼¶7lkq‡êA·ùba>ð7ï:y…ù~1cÎ:ââµÎ}õ´ö£60æîmÞÈCu47ËÚ½íÖ"_{-Ç|uÁ³Zq=Óx•-ÿ°F¾ˆr¶a¼—x‚qíåW´Z¸ò~ÉvŸš¦—ýS<ÇYÞeæ/câmž­oÿ0g]Ô¶…w&ctSÇ[ëY^[¼f½èF§qvWÀÇ÷¢e±·gëkç/}ߥøãó¼ò&æM`¸öšgÆÎöë­»Ê2F·ïx®¸×GZ÷+óŠê²®%ßyÆ®¿Ø¾–ûÈ<ÆöøÂóß”ì÷êºöÑEØÕù½ 迯ý[‚óBÞ*ç3f¶ë¾ì¹î{äö¦CÏd±¾öáwŒXçwÏÓõ÷ž$‡|w^öƒqunìx4^¶¡sãûãiK¿±Ýš¿Ã{FÀ»½·ñä‰ÕeGmZì¨I¯#?}|^ëgÛp{ó^þÂo,ô!W]³©¿¡¸>zÏ­Ý:óİwRutŽBæjK{ƒâëûÞ“— #dýÛÒ«Ú5–e™#GŽ?cÛä¸{ä{Û11ÙŸµýÞ°m¯j¯x³ë’m.Z³ÛÏ6×B}m.ªËuz‡•«üÛšÏW¾9?×~„Š×š¸xÜá¿ýü·|nü-c]¯tzíÕþ¯üçæÿÑß1ĵµ2âíèZŽyÁµØö§øFøê“sÇ¿ñ¡Ï7•±.ýÄǹÝÜÞðÁÿZ¾oF>Ã̳5ÛÇYaŸÞG=ï!dY¿ì¯Í|/³ç­ÿ•-v÷yð×߳Ϳù÷­E½ø6ßeÌÃ>2¦õ7É0¬Ç6ùÍX=çœaúY—ßÀh]@¶½:Íë·QkÊ8ký½h¾Õ(u‚=—þb÷=‚Ü+ŒÊ/¼ý®·ÇEõ}Î~È{ÃoËK–˜AÎ?qñfDyãú^ìÿH¶Ï6p/Ì×32–­ý½‡ý›ß–1¾ó›^íù;‚X:#æª {]—-¿?-:ÊŽ÷'çkðObl]—aõ‹x^…™Û®7EÏ!ÁSþÿ+9Kê%-m¹‡‡’ír]·Ë—žy~zzz~¡¿®öÕ ½½ú¯´ÈÑ—þy¡?¯¾s´o®öƒŽcí–>\í»ƒ^uhñ¡û•m>Ú« c‰8µuòYÙ—÷yx•5ÞÕ…ÀOÙm¡¿¯Öø”ßX~7f­ìKeè[°¡Ýõï1w·ÖƬ\ÛS ´ÆÊØu<Ù=ùtþ}ÆõGÍ‹!9¬®6[SêÃoŸößð!ìóÚÀ§~¹xò•Uïã% ‘¿üæQ‡5 ýwÉšGã…°)¿g@e–w·f⼺Ë+Öå›gùž'ŸædÜ;·9çþ¬LõV—¼Äpc‘ŒSÝÅ ~œ·>V¾±Ôõ…,ë †{N;}ç83*Ó³§òµVמcy{ìyVk·úÄܽ²öOºúÚùSµ׿´¾âèÞª¼çbI;b¨Íb*ïSôôAתºàÒõçQÞsrq¢~h=ר¿Æ§¼cí§gwyê [ìÖ÷#BvkdI{wX׿õÕÜ žom™óLòÚ:í›ðN¦¼Êq–â^³/ö7ž!Ú“z>Kç÷Ì?µË“Êï[¬rú•çÙqº{ª÷¼¶Å˜þîIez&ô?bhϨ%Ïfäz_4ž¶»¿Këð_ ¬x^…™G®1¿sÎiçûÓn@ iÑ çåÀ!©Ñ³§§§çÿñLãûÛøò†ÍÁd äÌ7íõmþB°Ü­sË1ŽÿYr¯"¿çáÍ?ÙæŒo7Þä¿Jþ£ù=Újíw’Ûó߃þèô¡5üx£¯ÆDß8ÚæËìâ×½Y½ˆÍ1Ì.²õcù‚Mó³ù•­MžÉ ü¸ÎϺ“¿êÅÖxåÞ½¶]_üU§vêý6tëÔVe'ë—ÞU–øL_-Èçô¾R[xØXÌøiý©o}ñþ8lÚ篧³mçjšé¬½áèäϹò.[ßqmܺh>Ãêà½ÄõÄΗÛÈ;wZcùŸdŠÊ|:È ôΰšs‚Gƒ×ƒsià ¬÷®Oë79Çç÷Ãör¥Þ¶KŒØf4¯1yÛàü+lc{ïj÷è.¯±bŒÞ3mà\ãyky#ûòâ¨ÍÚ°_Ç=»ÖåÙ´ùc]CÇ9}—g𩦠W5ñ» Ï{ºãtL›{?;Õ‚5j]Ûl<5Ã^u·&œOmпÆã=¤vwî6žÖí*Wàþ1Ö/sÞËÖ|x§ü6÷ºÝÝ8·>m¿O˜î›;ö˳—»>ø²MÃúh;¬¥é±Qóì{õ5¾ó„U_ïñ]›Äo㩆ømGß^Oün9žÆV­ï•´ÅZ¿£ï™O6±{:'ì§þG«k£wšúò3ñv!7:}ðšwŒèÛ¶×[e~ƒçä‰nõÇGß~,sÒÛ3µ"7ÖKeO6Ñ»'ï¾×Nk>ðžGìU‡ØGcºÇƒæç­ehWö-?ø¼n?‡­ ÖS×´mW¯k ÙÑÙK9ÅG,ô]øî‘ÏPzqŠÏ1a»÷}ÞüÙ'óÆ }ïò½{¿“ýN6®^ŸÐ¯°Ü‘aoÅ®åšKa?¾³Tnx´Çã5ûØ=ŽÚŸëÀsÏ›úô=ÿ^ÍFo},Ë|wæömûŽ{óî¶É{9[ü~sœ­#ùœ¾…ŒFý'W]ìRûÍùv‚¬ímäN7yÛc̓õ¿ÑûšýØîh=ó|Çh=Çó™æ>¶F}—ÎÈodlÂ+Æó˜ê±çõˆ~»'cð¾PtÏ,ÿTbâ÷€åN1tóIä{’Çüß^Wqî'ö6÷÷è~7 hÎ{p}O±Ãë·Ç1˜WÛí!²ì 6¼Ï ‡œé=_®ú>½Þ£·çÚ–ç{ m\¡¹¸^ðögç¿q nÞSëÇß©¯z°ç5S™b2þVà¼6çΊœßkû¨/×°}¾Òi_«Ã^bÚÏȹ–¿osïµ?¸^]k'ì«û7tÍbotöõ¿¶‡Ö–³Œo­Ôâž~kç˜Çšz6×§¶[WW°/¾™Yît6T¯ó®ÕS,öŸÊØ®cfîZ ô»½AÀëýÌw é8wçว—ŒÿèÎÚ~z/1z¶o<Å,Ë]œ¼îéú\´¬,ëÒý¨ÛF÷Ö5@›Ô÷v²;ïèó±/â„ßÑ2¦û7)úŽÝÝoà]õÆv `osÎÃyÖžãrgýñÿo÷>ÍÓñÀçÎܸOýÜœj0ð¶w‘¢±ñÜY×£³ÿnÎïâÖ×v}î@Ÿ|.þÀ³x^™ÉŽA ö}½pàÿÿž˜¡PV‹ƒåLïv:]UÝ·ÛíÉxúˆŸi=x¥ýðø–‡6é×ÿÏÛ¿|z•oœðO>Ù¯®íëö±œ®øƒÖ”u{¯{Ë¿9È9÷õ˜÷ôKs?Á‡ÛßóYn®…ukcþ†§cúIþ^¬Ý³Ð¿…oÝÁ—È7Æ{Àý4`‹^åÞ«ýô‰Ék÷9ûÆî2LŽº¢Ëú”çúlëadÛÈö^aÀVe¡q>ðzîîùçNëè<êk~FƒNí\{רµ…6ÝÑ{Ñëy8žò®`²žÉø¾gão@MkêïZræØ¤vîEôv÷XSë²ï|c ìXKÏ€5ñy^Û–Áq'Ørž Öœ¿Á¹4çµ"n÷ã•ÞU ~vý±ï:~•|mM–y][­Wó­?|èxfýx”w=<;ñáç¨g˜ëfh¬Ø‚î˜{¦;tkcr«6<§,KÎä[{äÐy~’i.Ÿµ¾êb¿³¾uûž=11'š–54Ÿ©{²ÈÓ ð:—K{šžòÌ"–ÞžîCd[—ÑÜo¼Ãl}’ž¼û©2}†~”¼é¶ãºz|ùÓ£æWïèÀ£îµëü –·ÞÎeô«~¥'j¼{g¿î¯“û^cÛ»Eó¶o¯ÍŸžã=ÝåÁîñÒ»£»G‘m=© {¾‰ŽÅú­ ó »⟠ëõKs¡n=æòUÝü ¿µëo9bõ¾ö|F¾»è:ÆáÖ¢6 ØÙú×ãž;ÔØ&CoÍÏîpcq­ìƒwYÏ1Ûµh=k¾MðWÐád*?ðŒ?=‡»¦WÊsŸ×ï€Ü3 4Ÿ5­ÍÆã¸Ð;atZÿöËéù^>¾Õ*c¾õê»ö¼nÏülÜœqž¡÷¡þ <÷™ý[×7tÖ®­kåD®|÷ ôí÷ûÙøôkðdÁ}_j йÊØ»Ð|ͳÛö±qòì²ÏÏäBã²íÚ3¯ßË€ßmÛ>·gþ_Ýåáåͳ²5¶-úÐù8VÀïA~Çpœ›ÄÕf{txõYìß\7÷ÏÉG×õ³»H,ÄÛš×¾ûÇw Ü;á8\³Ñ— u(õbb1oÁÈ:¯+ú0ç<ýS?×úè “2Η³Ù÷*wαþ/œf8`«™ã…¿8ô ´úaö“Ÿ}Öoý—²‚ÓL¸ê/øµq¢_åˆÍöÂâhÿž|ï>{Ž˜o]Óƒ}ÑÈ S—ÞA€Yb±aøm—µ}¢ƒæÀ½ØïØç;ŸŽ³{lyÏÝë¹ü~ëï@p¿1Ñçw0æ ³¥µ˜.gÁóÒq^õ7µAÆõ«¬å­‰ãBÛ¥Æìyw¢Nätò‚>/¦Ç|b ½° øœ×xžwÍѶN±ôb¶ßaÎÓçŸßÅØŸj\àÿ‹Ðéì¢&Ãû“íŸãêsÎ2§¸vÇÑÙ¼¶~¯‡ïõ¢¡ù!¿¸ª×F–œøv¦W-çØŒmºu-Çœô¹Ô€ ~AÞ¿C[·ñ¿sFbx^˜Ù dE[÷]Qýÿït:˜àÝúTÝÊýd­÷Ããñøú#}ñ‘><ÛÏžôy¾éçõ=eW÷"t¾:Æ´ GÇVžöçô¿þ¥Û1ûW¼ß½ÑÃOó§%Öµ±üõ#ï·g™bYºìcoãø!òåµ~´Å_¬6>0pLùµ³´ñ´&ÕGè(·ó°rÄ$.â‡|cTç׌Ëŵºô‰å›g¿xCbýªfÐOOm5NøŒõ[œ¿ž¶êç¯ç7|âÓN}«_LôiŸ¹GÛÜl‹qÏÚÒOeVÎõDÌÚ«ýÊ^T™æR~ÇÁÂ<›We¬cb¹ñïü]ŸµOê&ÞÕ'å©Yë%.âh\Ê3ŒóÕ¾¸¸(Ãx× íÎ]m*g¼­Síþ“¾q¿ÅÙ5ýãã“eŠam-bm.Æo¬Ê³®31ïÆ­ûÔª¾ì‹ù9¶ó¥ñwé|®¼Ü·ÃÚ4IÅC2÷êRÚ§êýÍϘŠkíCì1Ê•'þ•­ýr}‰§öŠE1mÎÎõõ 9gÞÅP[¯¨5þ¿:¥­qIiç@í¬¼ûJñ¿p*ÕþÚÏÝ×^Q}v¬kò"×Ö®ÝÝÛ÷>³k©sŘ+¯]Ç®¹×³²óyãÿ>ãsB>}}þn=ó•Å7>š»9é§9‹ë®Rlw¾k³ü™=jmv !/áßýX^ÏÌÎI¨±ýòø„»wžæ\Æ¿qU¦1xÈ×¶ñ(ûwäÄG¿©wSú­÷ÆÔ{‡±tÍ7¦%äÄÙsºõ©ÝË·ÔõpùóŒØµŽ/ýÿùøTÃú¥fúÝsVûöÕsŽÖ_ãò.©žûÐګήùÎ3ÇJ¼+‘Ùµ[Ž3Ë«MÖFß’ïjrÅ Kåà7ybP,èWv×ÿb_•{5Þ»‘spóƒ®û¾{ØÖ¡ßÞùvMm=× Þÿßôû.s/iÌ |ü˜‡äÿ‡ægÛ³KÚì>{Qó+í k¯¹Öo[ÏD1òMr寽ݟ‘©ïŽ/i[¬ÿOÛâê8¸éÓu¶>à+Ó÷c«CK½º*« ¾Ý³:W+³ñöì_˜+öwÏ€ÀE=±pÎû>ÔouÌ÷U½õ-6ƨþæåzWÇ7üy6ÀkŒÕ1Ÿ‹×o¨wtó_9m­kuöÐW¿»Æ”]Õµ^«']o?õ*'N΃îm­[©5D¯÷«îkõyÝ;®=ð÷§ßºo>ö;¾þ–üÇÿÊ·ºÖǹÀ÷…‘{xöŸMq¡ï;¢ºü7©¿}ÇÈÃ'k‰Ö·_åô£rÞeüÞ\¡î³Êëo©±·ÖÐ…7ã¾e¼¯Ö¿}ÇÅnׯïd–™ƒ1°ÿ7î•ï¿§ækÛÿ º›åx^•™Ù®7E$)³Äÿ',ÑKYÙr_.%Ûåv vwŸóâñx¼üB/.úå ý5Ô}ç?^ceὺƵ!ý~ØAæ§K~å$d ý2¢ã\9æëÆýê«ó”ߥ_ÿéöîlþ|à™è”3ã”Üo Þ\£ëƺöê—‘Z5g‹}s¶9^þ»Ç>ëudÀjÌòŒA>˜jÛyí²n=Ü¿‹÷ìŸdêk©ù|.} |sU2ÿw±ŸpÀû-óöLë‰ s Yõì?æúq­Ü_¯} ŸQl‹k×òð_§üÀ·¶Ê¯Le•¯ÏÓy_LįíÞAÍ:æ³¹#v䊯öÿ¼öá½½äðçݨlë½µ2_ÆØ½£ÇØZ.žÚYœ%ï'ö¹;™‹éd¿òâ¯mδñ>§[çáWV_ÌÁE}Ô}Í3Ä~í³gýÛ÷õQ,­ÍReÁÜ>©Œ½b.7^ˆXÄ\ã§ÇW<ÔHß§ÞaKçêÔ¿¼ÓÈÝÉÜ–öy¶9Ó~mg¶²Ê-Ns ìöYk»rkgå!ÏÒö€2òkÇܯmFä[Úl}‡Ä]nOöükgÎ=Åžç¢1¹oÞÝ_›%yÖP?õuÒ[•9ű{æ„9÷Kq¶^ŒöÉö©8[ol¹·uQ¦5Ý=I½­³²+ß»ÂýƺþzCÍ?zb4Ž>×è‰Æ¼X\û,E>ïsRrm/ú¼¸£ž—Åà\[‹ÜÍMëÀ³Õ¹˜š£}®Ý¥½N²ð·ð׸ ž?ße”9Å/»ÖõÞƒÕãý‚Ø«/žµís§v7Žê0÷ý®üÕiÿjwGuµõ;ÁþÚ¼ÈSîïkÞûÉ3^ûÿ\û¬É=··Nù*5®;õ6Þ•‘O>}§OÜÍgcglÝÄS_ð½g´¡}È{®Ö×ΡڬßÚ›öå­-ˆZ›‹Æ»½$)‹ýúði,ž=õÈñžyÎ"<ðyê£r«§oÆö«r¬µ[›òj_]yæÓ}žùæÇ½S¾šõéweÖïÆØwêžïÅWÒg}<µâï\î1Öâ6®¾ÓCÞu'Õ¡^æžö%ß Nç¯v¤~_ºWíˆÝ}ŸEµ}×÷=~wf«O<‹i}ØKÞ3ö)û›Ëæ~{È}iñœä˜‹ßx˜×¶Xöãèžçû9¾ï¨çzñ™ŸÅ´s×­‰úÚõ;µqo=­ü~ÇÕ~ã¥Ö­gëýT^v¯ïiÚØ;”qŸ7+²¿6̇½Ê|±W·¾êO²Ž•]=Ö§wbçw¾÷9×úÀw_,ÎkÇoøû}¸õ*–Ê0Ö¯=ØßZŠò·ÓÅ©îú‘¼c7ïb[+³}`ÎÖÆRÏ{ëâ>1ìwŽ2•-Æê;·×›ûÎWþDÈ6§Œýÿ²/[·õq¢•1‡»ß)ÎùMŒôH¿u·†s}Kí¥ºÅ&®Ú;ÝÝ_^÷îbgîsnßôUí¿õSâý€±ßnÝ_ýb»#mù{„ÝíŸÚ>ñNk¿WFÂGcØgjm4gê7oæÚüÖf1!ãûäúU¯ý±5d¸O½ÎûŸr}^-É?Ý×Ý×ÿ’rÞûM°vj‹±}²Ö‡z<7÷]Gžòû;Vsù[ˆy*öÆË¼g©vjÏß0ŠkcÒWõJòƒµ½yÒ±k×óÄÜüz×ú»ö|5çÚ¬/çê´Ç2½/êGbý1{ƺ=­ìò–¬$–﹋”µÆ›è3­Kx^™WŽ$7{å½7÷¿©ô€ l(5«Éôަº?¼^¯ÿÂg?kýåÛø…èËÐ>­v¾ Ÿùg^ã«ÀOh¥›X¬ÿm|£9öúÈܾ}¥ymol.zý×_ç ßXÿpÌŽ™¹}j.ç¸_ßæƒù~å_X«ym ðÍö 5~¯¿Ö¼:m“þØè¸Í_pOQ[ÛqÙ¶sõýÛˆìâ¬]×ÿÒSþር±4•s¿ñÇ×ÇÚTc}ùPòg}Î#ëúï51מ°ÏÐ6.·£Ñ§ø`?Ü{êñx†'w͹Á¸íSûç2\±{~ÉÜçÄk—¿Í!±B+/¹!>žöÁÎkÖÓOî±ëZØgl[×àª?sÇb}¿8€ýEý—;zƺÚkWÑ ¾÷Kã¬|a|Í«c¶îú,vì<ÓÖ·ý楧èÊ_8Î=t7ÿäIJž¯Ö•)8'µe]ÔwgQõuýh®‹˜ÜC¾Ÿ ³¦ÿ u26ëª[ÿùúX³ö} ß7_¯”n;›óîØš½m¿ìsq¾wìÓuçØ¶qíçÚ@fãüÃÎo<£õþ[üîû}2p. ¾­²Ô3ƒ3Œµu#Ï›Û>oÌ_›½Ÿ¶^ì肎ÞÖîwñðÖ¶¾ËÇ»ñÚ÷ðð\çÖõ®ÝöImÔöFïÃÒŒ7;Èç?ÉÚoÀúÀyõ¼¼ïÁõþ}êÙá®óhí*ëóbë3Á½e=|#¿œØGØulÂãýpg~Ùþ3^çÈÕûÈÀ_½eûà–_bòcÙ>9/òfÚT÷æÔÈïÅê±-Ç>yÒ»µsá•¿¸÷dlÃïoÛ÷zÂ2Þw¥M‡ß:®¸§üo½û^ò7ؼgsóõtNÐ3Þ{ð]ñ"_=õzëé{ýÒï<#ç=„ è¿½É ;úbö[¬úÿ®dzÇßÓ¿ìÿøfÛüWløîïŒË¾½ÐëÅ{éµ~Þ€Ô>÷¥u8÷WL>gló© ¶UÝè3Þ÷¤í1šw¹.Ÿy/ð÷øÆæÞóöµ\¾Çß9y_írožöñ¥—|Lßbk­ð‰¾vOù»vãd陯b­µœÿŽ§ç øê´çàSPûÀrðž½Áµ¯,sÉÙ·ò±~ÊÙpؼün>9ŸÞ±Ž­¾”ß4ûi]Õ³>hŽÌ‹¼×öŸ¤Ÿàõh¿˜ªï»gìûìøá+ï”ñúíÔ?Ö×Û”ù•ïÆè\]1º—žh†Ñ÷ïWU¶s¿Œo[»̇=p˵{éÒ·ó€šÙ‡Ë—ÆÒ½UŸ ÞC¼;[Ûv>ͳ‘7 ñBwìÖ7|Ïñ'ÝÙ–·-Û©>¿ù¡Ywc¾ÆÁÕÓ@Ï`¿5È+4âéÛºªà LÏÁk\ïLôø7ÿæmÞÉrŸ÷Þä4n€<÷;øýV„Oƒ~¢ß7oÿNÆ6ùÞÀ¦ÏAëß»~#¹íÿwãwÿã¿z‰µ{i¶Ù§ÞÿÖaÙŽµm›À_âóÛÛgHcmküpN}ŸÔfý3LGkÓý`9|Ø|£ë´ï&ðãã­]ßZpµµšüÓ¶îx^…™ÙT7‡„„ Jþÿ;C‰[¢tä;<´l÷æÓíö2w^<C/¿ÒO_é—kLŸöç‹Vÿ÷K§6%eúi áSô~lWx'ZV_̵[kÛ1k$oëbkàÔ–¨ëäžê/¯TL­+î„â0Æ]cö+9D¾gÝ®CÇ_Ý;ŒÜƒÕu7?=óäõž)g×vç¯ÿîI‰ñ—Ç÷;ÕÔû¶ûHŸðöÌì\ô©s1¿gˆzí;ÖÏîm÷âb…¬WýÕoõNüS«ÃÙ«ž1Ô¾ºw~{öʳFó’º'Ÿže¶ÅpÂyÏÃo.½Wlcù­bZŸ¬ïê¤wB ›¿äšu.©o§â-‰Óz•<ß×'Äš›‹Ú‰·ùíÞ¾Õ)õ\Uw鮯;wûÞ§êUç„ai÷ÙÍ —¹«Lû¿®¾û¶~9Nõ¶¾7†Î×u(õ~¬9“w××ý®ýéý_cä|wã^¼Ö~[¿â‘ÌŸ¹ê|µÓ·w›¿°ë=·káüúeÝ”mþåu16WðÜÞõãž\ßÜ͹¸V·cs+¯ýæ©ö‹}öß<É«¬˜Ô)Áw 6ö¶øëì<«'œoÞ7¶‹ËùÊkœäÖ­soçD.¶S èûŸŒ‘÷½ÿ„{ヰs1´U.­Sî9§ô&ÕO}Ñ/vç¶å­Ÿ{]ïªý„çΧw%ý­AñxƬÆ®åž%ʵùÅÑzª¬¸–Šw¿ÖÆþžÿð»ЮosX[¨˜ksŠÛîSL~/h ÎÛXi7ïlƧó¬ó˜+ì{'/æž!~Gú^3»¿õ_ðvŽ“¾x‘Q?Ú™‡=/k³ýåu,fɳ™~ßûë«<ô{º;^;.®Õ—ò­÷;›¾SÍõ~ Ù5xF›·’gƒãÖpeýö·gªï{ÆÌµ>ïrµãê™7I¾¾÷·À)âl}«§OdÝóòÝ/÷ÉŽ=ƒðÕoâ']sEŸü9Þ8:ö»tÏvmlíožõåo|uÛÿ‘mû;gu=×Äzò±gÃê©+–b¢6Nû·µ[ZÞæï”÷;_K›+ß/]ou¬3±ö7²z›Ïú÷Û8rë«Ø{H½Ð3Ï}¯âu(v}¢¿kSÿúx&‡œCŸæÇ¾±¸6ðúVÊ‘çuQÙæCÛS]5?Õ)ß–ëÚ=¾:ún¾º~ËÖx6æÚ÷ÿªÅð,•¯oÞ8ê#kMÀoßù0Oÿf¼sËó7 ýÿ"/ý÷n½Û¯Å ¹½³ øê¸ê¯Øù‡sR×î™î¿Æ¥\{ÿZû’¸Ø»Êhûmcm.;í×Îÿ‘ƒãƶ*x^…™Én1 íìû‚$· ÿÿ™qSH¡ ‰„$Šj6)J??><<¼x’ÇK^=ÉËK¦­ùé6fn²>ëþ\ºõÁaÝÚ7šÇÇ«~ó›³íüÑ·_sFÞ]­çlûõáŸ_°j?ÿÕÏvØ^çõ“ÒC±áB>øøý(ý[­_êÓã÷W‹Ùcƒ}ÛO—Ýúøö¾ƒsòê#æT[û"_`ÃË:dùA¿õ`xÍIðÿùj]Ÿ•»ýC\§ŽíľՃC.|6lGßþ¾Ißù‰kÕg®¬!wæØXÀö9\]6wØS³•óÑ:†x³3·;?Æ‚#Üê›Þäl÷cî78N¦ßZ¸Â ù~éæ»<'Üq“ù*?ü8''×LØúlk^õ»Ö{ŽŽÜ4ÿ^7áŒ{'Ü?`nŽ=býrz:¿Ë'k¨5ûôž—ßéÞZÎñÍþ®ïweqlŒ8~ÄgÏl¹–óÄ5jlæ›ûqþrÙ`o;ô`›¹ímËœš¿Ýä‰wüÐ7GÏ1vL‹yxpªc¹Ã[ÎKûóêSðî9íZó«0G>ÈçĹÆ-zîlœ§ñäßxwžù4îúê˜ÝôØ»_ᎆ¹[†Gì¶Áû‹óö»:¦Ï9c}×:.l¹7 oÚì9çå…mψ} »SØ?rQðÀ>Ýe^g}ïv„Ú®Mm=vìèO<ö]AŸzwLàôý÷Ù]¿gÙ8|›”Ø]gáœ8_>ù~0ëzFX×–9ºåûqöþþ°0׺sŒ×èÚ;¼;1c;'훇¹ ¼ƒÄÐyðÝæ¾q¼Æ6|û­ï3`>›õÔK}ÚÖ÷®ãÜxítþÎ0ξ5¬¿Þ1抮6›ëÝ /öÕ8`¡+7ÄoCó`ÄÝõÖqÇ›ÃÝË ‹ñY/ÖI×}¶ù2¯tÅaÝÎ÷[×B¿=àO}—7ŸÙw÷½o¸5þŠï\¯Eç8éûÞ/?ô«kÇ:ñ}pú;͘æ8ñ»Óûßr‡Ï1†GùøÌ¶¾ÑÕ¿ÅwÑÉ<ót¾ÑÙ¦Ò¸,þÎç»Çç¥ö'¬r27ð‡Ùu¶«¾àVŒIóæBçßylS<æ{OVϘ¸ÛÇÆqtß&«YcznÂúSŽáηŸ9Wîâœø½«~ûf⫹÷™å÷ˆâ±Þsþ–sŒÌ _þ­Àù™½ù°~{16~ï(û<å’9óºû^Óù4WpŠ9Nõ}‡ïïH0À^ëÓv¿¬ÛÙºYk¿w{c|bvÜ«ñÍóÑ߸þ'=·Ž©5É<}Ï›un§?ågâ\ßíÇt>ËõIn‡¶äÿ݆_êÖB¬'ë¯Øã³÷öåo,Ûä”#Æw9rß\N{Âïe=+õu¶Mûv\´õÏx-6ü3?>;Æ+¦ãߨu€0þ-Ý©îŸw®çÊ­¹µ6Œ±ïBb…Ssuçâ3€Î뉽-\Z¿´ÏUÆÆó|…œ€õ?Lp“ÇPÿŽƒØV—Ó37ÿ®7b%ïÎÎQyööƒÝô~kýž—ßÉ7Ï›ÖsyöÛζ§3~÷†0®þdC¿~ïjž=Yœ+ï±xû6v½CŒ…­¹•焜S'>;qm÷¸-6Ô+¼lç=Ý>û.rhù;uýËÆi9q^û-û®x^™ÉÎEÇ`6³ >XH\xÿW„:äàSÕ/©®Ê}«¬žžw¯×ëÝ_d½¸÷Ùõ/|ùìYKc ü^àó”;Ù*þÛ×g½â‘Uø)üØe­LýE^ù á“´µOqß=xän~ýЀo\ùûÜusézóÄ^zc«>àç¬Cžê¿ù°ùh ¨ÉÒ­I}8­íM=õiq€}Uãr}Ó Üê'ßÊ Ôvã¶Ÿd6¯ÖËüQ—Õ]Kû!ôövmUÖþ+øþÁW~y ­÷æµ²ê:é=Ùà UöCŸoõcy{óÏó÷ç ´÷qóß>¨®b÷Ö7âW®|'>ó%ó½úœOúäY«Ú± õñœøþ|èÚ\¿OûÚXOê¤Ý¥­¡ýU>÷ÍŸki=#樺kóÖ®é{óàsuÖõ•Þ>:åžû‰|·Ÿ—çä›°çcùNkžõ•8åÙÜŸl.­{€+qŸ²;÷9[ê°fž§òYgóT>½>Û@Ö»bóᓚ@:«síÕ çMÜÆ}Ê›9Ä+W{=Kédÿ;§*ÛwÑú¡ÍÍ)ଷ÷Í)žÎðúÖýÒN`Ý<ï+§ß¯¡·.úK,Öz{´¼›ëƵ¸Í—8×ú^ÜoY#Û¾¾ÙBž9âÙ!¿êäÙ3e^¼OÚßÕg?ÈïÜSÏß1ô½sßWhMôckОÇÞi6H·xaïÏå5î›|yô­ç hÜ«»ùw½¿ZãöAõé·ýÒóV õMÝêòœwš¿ÔŸçé7¬scmSsx«­{íÔŸÿ  ÇYQ°wúBgcõ»çyªÁÒo:ûëy⋼ëÇÿÅ5O'?šsl²÷Î×ú Ãã|©^ãP‡k÷=×êäî_ôt&¹VÿæO_›{¡ïT'«ge‹¿Ñý¶Ð_ã5Îúº¼ö%àÜ/OcÜÙÓo%…å+T§ïºu©¬ëưzúìÁÆ¿öNï3ë‹sît~Öfý]Þέۜ¹Áé<[Ë•Ú þî3ÞêôÞ>ÝÑ«³wýè¾ï='zÏÚ©o´ÑyÉSO2òRG×›³õ¹°´õ¡ºj¿ß_›¿òpfnýY°–'š°~öü"W»µµ9cßÞj»sçV÷Îß+¥›Ïš½ªмۼ;ÄÛ³ì™臧ßòåÑ_e»^¨_òð› ݽߪ‡à*¿>7v€³~cä¹ß‘û½ÌgÏ׿ù´. ¯gEÞòkK¾ú*›r]·^õe¿ò^^>{´¾¬O¥±¦^ÛÛ[¯¾ÃÞþ[)@·?W_mõ¼7ŽœèÕ±~-?´ÎÄåq­Ž½÷úèt.j¿ßæÙÛs[wöÍ x¿A«ïÆ_ž·òç<öŽªìö×I_ï÷}ÿ­Ÿkã„|Gí·†Õ¹ÏêÓÿêÜž(¯tg%´öweðÉ[o÷ÖâÛÆ½ç è½p¢KkÝO}’O½ÕYŸû¾}²uó¥ïŠðôn¯ì;cõIžöYg—§Ð¸öü–§gl¿ùÕ8k޾õO^õù¾¯pòáýö«­®ÑU}]3G¬Ûúê{‘4ý÷ÚMüx^…˜ÙG /K ²HòÂÿ%iJ”J=7Vo^Žínwϼ|</¾Ó«ïôúêܽTûëµþSÖá)¿ûÖùÛ57=µg¶êúåja|ð¬ÿóÕN÷Úw’_ûV}l0þtÍÁ¾úpÂÖyëþpÃWÝèk\æwuVÖz“÷â'vÈþ)>âktM9l-ÞÆÃ˜üζsa¬'üØ2Fh9±=Û¥o¼µ3,w~ZÞñ¿uwý¿óV½ýu˜ƒð¯¸ Ž¡¹ç ÔöI–¹ù?§§LÝã?Ôsñ9Vµò^Öîjú7ðsœ;xmƒ=lÔAä9›Æ÷ùšC¿×‰]ñBèî>,-ŸkwF‹=:˜ó<;ä= qnŒÞê«NÎÛç|>mÓõ‡:Ïÿ‘ÃÆ['=¯'²õçDÝ«ë;—Õ…Œ‡­õÕО¦=a Ì)÷­ÙÈ:?ôÙg¬›Ÿv¸×¶®øŒ›°áþÚ/W]œòz®kk9só³5ª¶MÃë³þLŽþîvÇØsÔŽÚ²_ãeÎ:&òÈœõ2ç|8ï¶M\àé:Äþ°~¹é Žz}âùí!ì®~2îÖpËvŒÜÞ‘¬o\ží‘“NÓ¿W똺E¿ÛÖììMÉLð×îè¿Kn4±éœzOÕ¦ý³ïË:V{ËÓÝ{‰Øw¾:ñ»9‚xlÞuýðó]¿4Y×%ôCû}ê›–|éuê›ün(ÇÞ·ïÞêô93>ÌW–^û«=ö§{ 1Øx5šñø¼§Oôû%7\~+Y7x×/FóЯåÿ¾Ö;ï±å×ïw`íA«q¬îÜgcâ3ýø^~ð-NðsîÍ_9èTO=öÜ]l]Yó],k=;§úÀZï©“ýÎÓNu’\âCÉy7Q—Á[Ì›7~ûéÖqæð~˜Š›oQã²=úw9;é.¯õœtØ'|Ž÷|fÝyáËbr:#–³ ¶<ï8øí¹¶ºÓæ¿~û¼›{äÓwEu‚yvÇßœÖîèÙ7±óƒoÎ!qfÞß­¬[ØïÞÈÒ/¨wˆmÎŒßv膗üVONïqë-†â‚ðsôU}tÝ{> ü4OiwÌÖœ“ê"è\Ûss‡aï¾µØÀÿñê³môÛw:ŠkgÝöG}³šìŸylËkΟçˆIõXG÷ý݃ìåÅÀzÀ±ø:^§}XÚÞ%Îððÿ£¹áØö}f,¦†åü`µ¾î?æíW××òyÔRîƒvZ¯½çà_зø ·qšÌõkÔzßÉמ›­»ÞµfY–}„Æk¾ÖÍ»}9ò}‚ÝŸÏ¿õŽ_‘ç¿/:îÞN#ÖÈ™ß0Ų–œl­˜Œßò&b³µæßoÛ‘kMóÎþ7ÕÖ³ü—¾÷w³õKãJK.ˆ‡×=Þ7õèÙ{9ƾË×ü56öÃ|í÷œ˜xîeâcYÆ|'2&ÖÆRY¾Ñï½OqÓbkmeüo…uÛÅ2öÙ>´|òjyëÀ7Ïù½7ÄZÎR}uýé{Õ6Ö6ß&¯ÕgxøögÞñ›mêŠûÕ9îadùŸ¹5ßCõÃÿ¶°ßX²æqy ï|©,ä8°ÖýgŸks¼>#Å:Ú÷Hw}æ‰ ;Íÿ©ýëñÂÅq|/îx2mó$ïÆâ·­ñZ<¯å£v<¿ó±~sÁxv½çœÉ­“_Ë#‡úÈ#[~å>]íâĦyºßÚdZ+oËx;®7Û¨s¯ ð¾Zï½s@Ÿïéì<Ãö̾¼Öø½Öz+ƹ9ŸýñÃ'{?;_5Gn«ÿ·ÖáZÎ]ï[üZϮsâvß:lþzÍWfpw_{}kÎñ›_ Ù6g‘±ka`}säÏú“·/îdË…¹ÅY_¯Áûf=û³}w?yžœrÇø®¶çžþrÓZªî°;¿|Ó‘sùÁþg²zÕ\kCyºVNß—­õ–síŸ8ÃÓz^ãîÿÎcêʶ°ƒžÏ!²´È5n£Í½~ÜâÏgŶ›ŸoÛµ¾[®½'‹¾sUÛ¬›o=ä˜ï÷n2|ë7öù·Ïeû¹;C#gÿìÇìpg¶Îç‹\œê¶þàXÌnkcy™îÝï l;§5Æ'ß|s‘ó®%¶ÞŸÃéÛèñx{œ¿Öªm cÀïævŸa»6ëïdÓçŽ{×ë¶g]ó¬Nχm¹oÞìsmî¼â—õƘo-Á‡ö”+ûlÿôα̉ï¶5¹å}pâlÍõw v{N‡®9ì’{rÂx­çÖîMF-<©°oââ˜þ¸y å+2Öm ØŽk„Ø+㜟ޞÈn?<î½vâT»µ‰Ç@îÈ{9¯=wÆÜæd}î}î¿Ç©£áî,ðNÂoUë˜ÏÝ÷Û²pqธÃþIÏ1có¡®ïÍÓÚÅ—÷bu…íÞ!EsR8–Áï—ÊXÖ܃ki­¿e~o"ï·îjœº«ïýVÚ¼sjŸŽŸý4¿ò¢å7’÷bkÖ/xwt4/Î æ»u¾yƒóQ=ó\Üýí¶†MÞbØ£½S¾ÞÅ;§¬÷;ß¼Xß2æfytþÕøTÛÖµ æË£0çÚ·.¹pžœsd«CŸúØ»guì:¤åïð´l8§¶kÙæÚïªS°k¾ö‡mm×ß­»œÔWùÞ°®w£ò§3Ášï\ß';àÙzÿþf»sæÔüÖîÿát¯Zξ«[l=-̸NZ3–ã]Ð< ×¾QyÆì«õ­CQçãD®åLÂËy*—½U7‡ßÖ{¹”§åª·7*œ/ïp¾•¬ñÿ/ËÖö°;šØvvÆ›¸/s›õÎmO›Óî¿•œ[Ö‰¥µ² ÇÞ5¶GÛj¿EØ;ÇoÙŽë>È-­¡œ2&÷Í•}úŽ4Ïrò|ïÒµüÖ©Nõ點œÇjyü¼æ½ãÈÁæ©%ßÁÈúüâ×¹ûré͵h? ù¶×>sä~ãgo¾æ¥ºý{ÎøÚV¹Õù eÝ­¹3Í¿]c×cÏÿŸ³ÖïÞÒYUÝÞÞÞ>ÿH>Ògé“ô©h럵þFû“g^o#kóѵþ°-Wü¯_{£/"Wû¶9ŒÅXÞh<Ûüþµž-ä.]¯Ÿì£7_iŸ¸gÃ>Ú—+¯_fßùÇê#sááÓxËçSîIÎl£ök‹õ·šÏöd± ¶õlÛ6–ö8ÕÅNkgjݶ^ý§‹Þp[#ø=ŸW^œã'_.½Qãµ/¥éΖóh\Ÿ¿Ñw¯}óŒÍœÚàû|bþû‹·¹mƒ ï·¿ÏÁäéµÚÄŽý-5FÓö¨c}·LõL¾ç æþе}¸ñªûwk4²¶·õp½æ<âûõ“½Ñd×C•»i|z›àÕ‡¸è6hg¾û¨9fß1«2gܵ°NkõD>Û–­/O>¢3>÷ùÚ|¹fM.¬óãkNÞd›ev–í6ì´ÞÄVÏ‘ñ½ö}\BÖ:¾FûáxçÃxÃåùpå¸&{Õx|ΫÏðèêIð+clÈ5þUkxWLÃk¯-F|ÜÚgÍ÷¾ÇÉÌzírZÿÙǶig\?åŒbâó%ç¬?äîçÖ¸ØbÍïø›3ȶ|®ë ù»l#»s…Íë 7.úÛXömkÎöƒÊz}ÉM†\{>r|Õu Ý_Yû=”Ø«<ßÄËšØã³âzmô»‹{ö7òܯ}dë'Ôý+/µÉºýc;Æ™/å³®}ƒyíoûZ_|>­Ïz=´ñêa°»_üæÊrÐdžrÈYx¯ï+ÄóÊ2•ÏçïªÇÑjãØ¿¹ï¨ý4òóÔïJÕÓ#gøk9ãnÏ÷bs÷žÍÊ[Ïwˆ÷9‹Ãà¾äÜãøÉ3»uÜ;ú­]eMèÛòÁ»°{'m¤[÷{ÊúÛw½.Ÿ« ñÝ3¾Ï"xððÉsÛù»ÝräóÒõ»gößlm$_m³²`ò½ìoš;ÎÚaÜ=¯?½ý“«öûÊñ…Çh»Üì[î=,÷ÛÕ÷ÿ‡zï]öyŽ!c^×älû>_`“³÷r8=žËOrWÏÚ—úõ´ï{¢üâÛþx®{ÕŸÎâA׿ ×>¼°¸“··z€‰LãòzröÝ¿[Õßòg§ß²ðlÏ¿Yø¼€ë¾ñ{Ðöz׃Ýo,ë=Qù¬Á*ÿ’å}ó=Ù÷hzÎ×FÇR>ÔwõÑ/¯±5DÞù³}¯Ÿöçg²Ë7Ï6îßb\çÐs丳àÓß×s½ënã{wzë¥ÍÉieG=[&|zï\£;ºjÐÞEÎöÈ-s0Ý'ð/?·Ç9èóDZ[wxÔ®XÌ]ÓÆV½' ×u¾ø½æª_}dí:ñì®ìy¿÷7¸Õyâü<^ßÍŒáy¿E¯x‘CÆ5)nŸ OßE&bq.}>ŒÇï@[ãÓd¿õ®<0߈g°w~0ŽçwC߯Þý‹wœý³OÌÿ‹ŒëUzê¿­Û§ö×Ô÷ö&üÖ§8Pïõbë‰öîjt{G=¿ÍYß½:j?á#ñ6gý›Y±ÐiŒìó>0öb± |7&þ¢oŒê“üB¦w­÷7ΗæÁöm>òîŸÍý Õým~ÙÜhýúbÜÖb#ï(ð[› ÓÿX÷/äàQx^˜éŽV7¿@ !@%Rž€÷¨¤[Jåà;Ì–ív/§û.OÇãÕÐÓŒ¥wÙ{=:¿\£$z;üî-igåžÓ)Þ7£[ßûÕù-|¨q4Öò–ÏXòĸ9QV¿>~ôYbg¿öOôå’Ãþ™CÚ‚ô­œqlÌK [oøÌÿºÖï/™â$¾Ú[ÚZAöXãWqˆYŸõ±kó÷ùÒm,õ½¾:W¯¹Y™]rä59r¿ø«[úó’Õù`n^jÇõö;ý-ž•ý™ÿíKy¯9\[æ™ye˜Û/íCi׋£q‹ë¯á3n?@ÿ·ÁþúYŸ;ÒO̱³g òœ)_,Í£#öÄàR|ø1ê¸oìÞ‡kÔŸgrõë‡ùæë%ôÇã?[Û’¼Ú/þÊÚ»ò›³’ûÍ™vÉÙ§¬·ÆâÑO1˜Ïŵx×fÏëò‹cõ zÀ:·?wרÔ.ÄÁx¼v¤“ìê­Tüæjõ×Neœ« Õ&qý¹æomïÜ;÷%²‹Í3S|Ž•]½õ£^÷¹÷VoÇúä ôܯõîpœä˜›Ÿå¯]Kž÷|Ï)óõU;ê)»ûõ×8ÛóÛ¿ò|G‘ÇýPÙöšrÔ¾u+­ýÕõ]²üê1¿Ãê¸~|gš#ûÔZ(ÓÜßÔýv§û¶¾¸7Í£gT?w˜œk·8[Ó•Y[¼»¯^uʳæÔfÏ‹y8õõ©·ÈùžÏꨧ½ö•µß¸8ò<§.öY_mTþNwýœøµ×ú˜Ó“Sþx¯€§îÆé|ñ÷; vOcóT;Ź÷Nß;ÛØðYßÜSNßúç[¹}@tÿ”£Òé^j<}—Ù:6—Žèè“sÁè7ueŠiï‰j«ù<ÉîÞ>WNÔïÚê‹ymîüħv¶ß̃öÙ__Ú³O\/.t¹/Ìñø=ZyÏlëhïõ<ƒóž'FûK;•ïØ~eguÀż5B¯kïUcÒ·=¦\}—ú½Ø*¿¶ŠËøWnýçqöÌVïÃÚVO™æÝû\ÿõã70üâs®Öôô=ËèíûGmo/@>wÔ“o,ÕÙçý¢ýâñŒ¡oüÍŸøÑoõµ©\ï–}?ß®·e}1ïó¥çSÝÓ¹>ÅU=ŸðÛÓ‹÷%„Nÿ‘6ç͉ã~9wÍ¿ÆÖ½57÷®ûì«/ûQ;ícÿÊ;ÕºøôÑ{¿ûõßoÂú3õòýTߕџçfÿƒ çÝÒ»­þ6†Ö’ºŒÆê9ê^{·wXÌ£5Zßå9oïX¹íaI¼í‘âhß´j³ÔçÍ]>«/¯µ–èuüõŒÖ¿6Ê3½g»Ï?æ§;µóõÅZÝÞõÕ½>ï›ó“>ã>ïk¯~ μ¼ò­±ÊgÞïÅbpý}ä+a³øÔÃ_ï”ÓsB{§»§g¤öÕcÏñ[žwyæ¯Nw+Ô÷ºò[ãe}ggãØ~ÍŸ˜åm8W{vŒNd°Ë<œb¶ø]+Ï·á×úòµNšû“OË_]æ¼þ:'ôÇÕ‚eœÍÅúh¿çXÛò¸O›ÇÆ¥¶Õ®úW^ÇæÚ}Uòþƒ–3UÿZÆÆ˜1ÿÏ5fû¥¾n\¿®¯M›ùïdJ›CeŒC±kgçÕÕøÈS]gÝY<¨wïúë¥5åÝ`}{oÿÚ ¾S}A`!vc°òæ»ò`Š[Ùµ±±ØÜWOëc1Œ‹²‹Uù“Õi•¯²¬•û'ûµÙ½EN8¯V¶míw¯0æÎ1§Œµ±Xµâ]bŽ<7Ê¿±Û¼Ù*g]@ž?‹ÇØ,vuWÆ~ï™ÊjãÚÎÝT¾Ö‡~€©\ψò¸o”mL }vMyçö-NùjoÉ7ë¾-¶Ö:6‡â2Ö߯zqîð—ÚȨeÛªW]mWçI¶6¸Fm7f§x+[{¥Ó]¸ãµ¯k•¡Om5ÚѬÜþy6ïûÑxÓùÅ1&ŽÍý¾Ù·kcF-WO±mù&éšo}ó\»îúòÛ:oŸü\ªlul[2Þ¶»¾ùƒô·t§cqÛ×zé™àùÏå'âíþY¿×fú§3öû¯íÎòìbý”£­'ÈœÒï7uóN«öª~Ówïî·ÀêgÞ7Q󨏒KïHßV½ùqþÔWWc#¶vÕçÆB9úØÑs©X§|¶¿ûÌ7CùN²k?ýú]žú°ø®õ7yXëûÔómõ§zÿ­Œãæ}ýì|õwÏã»Üï~]žó7“½iÝ_y”Ùš/ô5ò´èÜ;Š>s`~ºÆÎ{ï—Ö»xã·ù低û»Õ);÷l\÷–ø+'õw¤¾§o|[útеòýÞ,ÖÚ²cy™?á¯ÌÉ?÷ÕiÍ:ª®öÚ-îê¶öŒä^¦ßs®øPßÿ­ùµycAl—×I¾¿äYLó}Ú¡Íòô;|ëX^íªýwwÄÖ—ß›ç¾k{þKõ˹¾ãÚï[g2ÿ^}xúÆ.Äý‚߬yÞë‡òÐú£þÆâÜO½®Y¿Ú'^qÍÛÖDßƨ1álT–ú©]%ãU{íÓšãQ±j<´Wžêu®ºÊ YKòïzqºÖº½£ÆMÿ¶¦ m®íÄTÅÛ½lÜëóÉwyWwyµ­6.ÄûŽ5ë³¼¥ó§˜ö7„µãôݳ<ΟÖ$mÙ5÷ªu&_m·í™d]WoϺÕóŒNç¶viKÏ#Úî eמ®ùæØøŸx7VŽ»ßå%ÿÞç3ínî ã¸çGq%~{kïAõT_[yzþëÚ#yÎko±8KµqýaM»öl^;;^¿Ål»þ.ÆæªÄ¾Òo×·_,ûë_ùýŸgõ‰küœVw>ZêÝßä×ׯyß2ÍÿIwÇæY;Ö~û‹ávÿøêjx^…™É®\EÆ`0£ŒØ±@âÿÿ‘wD‡ å5‹TUå<Õp»?¼½½}x‡ïðÍ;|ûZ3~z‡ï^ãèƒá‡ózôÉüð‡ÿ^st,ûËK~sð[ƒ3üôöŸŸÓ[Ÿí vÌc€ÿÉŽõÌÿóÁ_Ý?~…Çú¾ÚÆæ³3ÚæðÕÇ® Ë­}#G|jÞܬVà]CóÖwó´‡L»t­ÞøæÜàÿÖ{ù±Û„ßòæŽ<Ãg¬—¸è¿†Æ|6¨¡{x95Ïæ‡±û€Ú4@ë…Þæ§ù0­ëÁì¯Nл'/Ëš‡\Ò«Wî*3`OckÌÈõäÇuV|yÑí‹eF7ÎÀÞ4ÏÕgØjzsqép\î#ç ¿|.c‹~²ÌÎéò>¼À½e;Ï‹×ô}m¿IÆõªŒ×›/ÿøàËužVÞ=ŠÃ-Î7xÆúµž¾¹,ßöZý›MèƒÙÌ¡µß®ãìÛo×í)vƒc¬ÏàÌÍ|ßùµ1øãE#×õe´ÅU¿é Ÿg—®äcõªßó™w4ìA· ÷÷æõ;Öo0Þy„Æèí¥«Ö_;}-nÇZjÃwTûdy?(Ï€|üæ×¹ OqÔŽ»²à©gãdý$Ïœw¢mn~ùÿYóÚLW}`œnŸíöÛùc¿Ønó ÌÛ(Ý€>ïûn^¿ûÙK¦_rÌ9º—ˆ©2ÜûÀðžÓÈ‘CÖW¿×®mC·Ž³³Ñ¹FÎë~3 “3½ç <ãŸ.ô9ÖúZùÁöùx]?ûæ]ò¾ÓJ¿pö«9fœkhYçðf_66ÏÈ´—ª×3¨rÕYè;¾¼[óÞ%þÁßâZøÝÕþdoÆÇ;ÞöÑï|ÙŸúvÑ—§á[¯¯ék>}÷ûÉ×Wx¹‹ÚÇöÉú.ÝØ.zp?xë]ºÀóæC^ú7ÖwëÚÚçµñÄ ­qôÖèä ~b¬îêY—o‹æëšón5Î{Åý`yŸ•õ—ÑöÑÙþ"†ž­Ìy_Áƒ®òY—ý7Ý2ø6øëµ®ÞËŸ÷8ýc]£ó¾‚ßìSëØ{Ø6ÉõÖãC—s¶¦‡ÁŸEðcßÀ{i<ÄXü݈­Æ¹‘ý@^/{ægÞþp^.=Íã“,±TéÕíXÏ¥}9C½× ]¶¨›}r [dêëd^tѯÖ{»xç£~v&—^mʇö‚÷é¼!›x:÷wr£]ùhœ¦¡§{¢qÌo~1¾|½“±—n½Îøáxë´ õ¯4ӛ꽹ý†Þ•þ´|î¡Ã±pgÐ#æÛÈû?ë¿{À4Ç·Ñߌè1ß›‹¯8üؼ=bžÚ¦Æ@û9îÓü½ÍyÝè³Ö¼Ø}Ê¥Áßë—¾Á•ƒ øÛ¨ü͉ó y×ð)_['ëòWÇÅã>3~~R?p>Cœt¯‡÷7^ã¾ògû®“ïãˆÚæWlÀÞìÑíëÊ5v¿.>ÿgè~¶,ôžþöoºõìwSjáßøËWÛã·nŸ-ÿ'[ß“Îǯóå¸ÿh‡|Z÷5§O8§ŸòWèïéåwÿ™6ŸÜöúÆ':õ¾ô_yõz°ß= Ñìü «BÇx^í˜ nÃ0 Ý6½ïãÿomð ƒH!‰ç’¢l'§mÛnÏts¦'­ïvÊÚô"ytOÒË{fÖÑk_¡û7ÑãÀkŸû 6ÖmJ®èeݾ&Šnlr× e%1Ñ·OëNyp6c:wèmŸ‰ÓrdÔ˜Ùzæ¥87fë?9fMŽÆm áÅù$&zø³_×äs×3Ö‰ý×}o» kã2‘oû° ½Ô~z?9Ùø¼C}Â{ìÚWzÞ¼ÎÁge¾×‘QÛöå¸ðÒ7ĉmp:WßÁÉkÛ$ÿìý|à]«îøSýðû]2äöáÿæ«}¤ƒÓ÷§sõÞDwÜÉ–yª3sÛº~ŽÛ±Ðíz„ç{Ÿ™{Í<õ×vé»®ã"Ÿ0:f(µŠdÉ.4½kЉz~ÊÓ3ï˜è´ÏÆ}ÄO¬æ½o—ü:§Ì±q_w¾]W(ýÞçÔ:ðÌó\(ù£3É'ŽÉÞ¹â7DMs6¶³¯>Çðû9 ñ¬Œ{gº?Øã?:ÈÍ7ž?Ùƒ}({bg]Çaý£µû ;p€Å¹P/ËÀÙ5:"tí[îz¶ñÙ‚Á¸§šSú-ú!¿?)ëÙ4Ž5O<ž5Æìú€!1áu¶_ð³&VûÄG×ÒyCî#l°Kìöá\:'רÏÉö¹ÔÜu²?pÑ‹Æç}ÖܵØú=k½èðŒí¾n}b€…ß(ÈX#Ï3˜ºùLì»×Ý?¡þŽl"vê=ÿ.¿sp<ÖÓ¹9F?áÁ÷ß};Ôw ,Ô¼¿'l?ùôY¶,~“OfôàCáQÇ~¦²¶­gÿ¾ åÛ}xÙ“G÷ò®q~!缌çY·ýâ}˯8ðòµ®ãL¸Ãë³Í»“39Â?í‹×q2;VˆïKwLxÝ#œ-9‹ëÂ7ºïûžÒ;Æãš„ø?ÇÏ)c°?»ß=­ÓþúþöÝ0nÈ÷¢Ïp5ÖXc5ÖXc5ÖXcãñО ºx^X[‹U¬‡Q¼/(:,jƒ$j”A1ˆ¢ëƒ¯‹£ÿÿGxŠó§¦¦Ï|.œ—Ýéêêêê>3{ÀËí¼ÚΛí¼ÕÎÒÎ'í|ÖÎçí|ßÎÚÎíüÔÎÏíüÚÎÖÎKño Ç¿×·Ûù²oѱ~Àï>&±ÞAÇ{sAÇý›¸ß ãVxÂz{Žo·ó.ö˜Äûƒï×èØäýç:¤Ä'÷ÌAÞžã+Œ<ÄOÜ{蚟xâÊøŠãþ½Äeý¯ap·pÔÀ¹Õ^å¾ê?ëßCt)ß“vžbè.¿dÞ ]åf]̱`ï]áVþ¨¸§>É[ºÓ9®Øãÿ‚žãÃמÇçLZˆ¯¼Àx¯Ñ9¾ŽÎS3+®ÙËÄL 6 Uy4ÏÂþG|úå†.Ïp>çÔ„?Ê›žÑþXpÔǽI¯øÌPó çµhîÕW×Ky<‡t[q¬cÃè+ùÓgHšp†ˆÁ¸ä¥º³oÎÁkܰ÷„c¨®½ÎVÖá5Üa®WzKXpì‰zá{l6³9~gT³–=¿Ö‹ªŽÔÆ5÷3Þ®S…¼Ó¯ôAÅ[¸³ù“§*M¤Çlÿ÷ßèøüaŽÄ¾Ö[Ÿ³Ê?ÌAÞÂO÷…só˜œM÷Á‚ÎA¼|* Æûl/¨k©´Ú°ßË©¹Þ´Ïwæ¹êùõ¾q»Î+GÕË<Ù?Ö,¾‰­º«ü†î¿™÷ª¤É ŽóI§'gûÿOt툯žðç‘;¨ê©çÕŽ]qÜ Â#>Ãß_«[ï.ª;ï=îVÕΞ©æ¬uÃðªjz€ùì [µÍÞgÚæN©jcn¯oÁ±Ÿòã,ïÚ¬¯òfz‡y„_Íc5WâH~¾ô sVyfþ̜ޫôŸïq'–ãƒ\C¿j‡‰ƒžU®ô\ΙÇz?ªÝà}àOåék~>{G¶Ï }D,òRmôHƨ7Ò0ûðÝ%ÖãäßД—µ°ŽJ£Jb¹öââ©1¹ ‹/°÷Dö«ú¾©vðYÿ˜#ñõ®º`ô‡±Ú1ÒëûÞ$?}ƒVܼnßÙû¿°Ï‘{$1‰çu kÃ~2–º)Ο—誶3½å¯¬Ç÷Jê”wô‚½F³ÁÞ W˜Òñzoð8>Ëš¼×ºç¼W öšÎî8çÀÚÒKúN”Þ‰ïõÙLÞ¾óÿÀ±—9 Ú/7Ø×q†»a+mÎúí>öæûHi·¤Fò@â ;ßkVçdÃ^ÿôW¥½s?ÓÝ{LüÊ¿ù!m„û56µ—.•Îr8~µCª™cÜl>ý9å­4«âµc®Å»ß‰C]f}ݰ¿7„·àè?âøûÙŠ£GÒs©gηÏó?¸Äå]^yõj.ä¡îø^Û fî›íã~åßø{ÇóÿQÉ?×záú¥vîMß ù> ̇èzøûóSÌ{í;Èñ}7?÷ÌŠ#× Ã7ì±ï½ÜuÄ_б]OqÒsÄÊ9Ðýâÿ³prf÷‹võ™Õ%ÞÕþ!&1¤±{â†/G]“ƒÏÑ#ÔóÍÜw8bêî$jÜK®»ëã½Ö7KΦs¤Väy¶W•‹9ìû%mÎxHÎbæ­òm8î‹jÿiÖÈûÿô[š§§Ü·ä÷5NÅÉïYƪçäD>³•¦Ä#Žz$mòeÜÙ“Ex^¥YÛŠ%EŒ‡EQ¼±Štµ¯  ʲÞiчyßk÷ÿ?Âú•ÕgÄz:U‘™‘Yuæ<ðd[ë¶~ÝÖoÛjÛzn[/mëÕm=ÜÖëÛzg[˶>ÙÖO—ýÜ÷âe/÷ðó·õ¹í!æ?è¸Ïoë;÷:öGØñ¿ÚÖ×Ûz¼­ï°cý‚Ž÷v¼Ø1‰Á³ŸÙYžYc?c¾±~æ9±nÕüz^Ÿâˆ­œˆÏ<ƒç™×Ûè8 v,rĹKÎè#Í å@­åÍ;Ïj6$'îǬ%¹¿¶ä½Šãs³òkÿç}å3 û*{àëିŒ#ž|®ª¾¬­açsÌçê¥ú¹GŸ ³]>'=¤Ul~îu%_®+q²nÍüÔ©¡×ྫôγâ^\ÈK3 8/ÄQ¥µfÅYœk1Tï‚c/Wµÿ…£7SËjî(WúF^áL¾6ãö\™'qè5yƒŸ±.ÆöXžwΞQýšõòžòô¦ÜO5‹?ñöu­ÄñwÆŠ±FñçydUý•xâËõMM}žyî ù"µô ™s’–™“j¼ÃˆŸsÁÑ{Ž=«Ù=žØ>S¤g…!Þø§>©z$õQ~‰Çœn°ã>CŸOŽSõ†ûî>=Ý0Ö\½ÙäC÷c»N?gÛµ7Š8hè<(_gU÷®÷sgß+wúa¯š«ªÃc2Ö»¹ò;í¬6ã~™i ¾9§áÈuòRõG•ëlÞyž©Ar?ëAñ^ñà>ô~^pœ§é»äAÞs¿åœÉ<üì-º~/«>ååµ Ë9kû_šÊŸ•òdò¢óËe/÷ð3Ÿ3©;ï{åš8³ùàšäý–¾ñ^âù<Ëøª«ÒèÌŸgoDÆÍw⊺iêš0þCt¾¼ç/½¶b޽Gîù:ËÏû‰<ä÷—êlÃx羂㯸Mýª÷YúoÁ~V缇¸÷沿âB³Ro¯Í{€yœý_ ûÓuôþª|$ì'˜{^s®òŠ×’úøŒ#næÝPãÌús¦ÇßgЏK¯òŒbóïZMîÞiùVsÏø õÅjÎê¦Nª£ê冎£™²`Ï+÷Ò‹ÜŸ±y®ò1ª“Žw‚û9ß~O¹î…™ÉI僆±&ŸõÔpÁ|îx=Ž‘œ0¶æzjL ×3ϺGÎæ§øU_?EÇÍû&甸È:ä¯ÌI;N•Sj”óålžú»²ª3qôù‘ï’*'ÖJÏøLU¯¦+?Ww†°fßш¥;XܩΙ¶Ì÷Oìóªaì½ç+û}Ò0j¬^ÐqTsöÞŠ9—Ù‡®ô­°Y»î÷câ«^ÏKYq䬡×Zå$iý!ŽõS'å&mVÔõóÏ5ñ·Oåç#Æ5³WÄ#sãŒÿuŽê΃Ùƒ®“|:ãÀ½åžôYɽÏ0Ö—÷wΩÿËÕ‚^<—˜ž¿ã KÜä;kÖk #ϯáèÝÄ’GÈ5ßä>»ˆë9ªüžKÞr¾To€k\fÎÉâx/³W¾ÅÜ+×b¦~•'Sß]þK,éêõøŒ'žzþì7×ãF½«·`UËYÞÄ%Öìâ¢úMgV{õbÁï>w§f]Uã#Œ¼Îðæ>Èü|&I÷1âjÞÝáØ‹Ò>gCz˜ú“x•®åYõEÎ׸җš>×ýü-ößÙ+ÿi.dÏþ ¼O4x^X[«E¬Q/AÅ(&º¯ BPNäCQÄ}ßNòÿ„S¬ÅÖÖvïùýœêêêêž9y àéŒ3.3~žñëŒ1ãõoÌxsÆ[3ÞžñÞŒf|4ã“ËŒ/f|9ã«_ÏøfÆw3Ïx†=ö/XñŸñÇŒ¿±æRæ ¾°‰ù-V¼ï±b>AI¼Žó‡X1Ìøo⓯rŸØ?¡Æ'žp¬~VõêœêØsK-ïc«ùöš_u?ŸñÃŒÑkÀ^;ñÉ—XÄP¿«ïkX9 ëlœSƒäÚõ}`ÅÍ³Ò û#îÄs]‹<ßÅÊõ}l¸Ù{çLlêzƒž÷KsIçNܪþôB…ã3Enwù} ö¼÷ªê“4>ù²þ.OrýûùÔ9¹3®ùT½uo^Ðû’õ¦öäãž$¶ï¢wàØ‹Ä\°q¥^9Îq`?ÄÒîY°õ@Ú'ÆYOs_°ÖÏÐ÷–u3GW»ruyrÆ…{†¥‘˜â˜ä|—Ç_aÅàÏSçÓËüŽçèÁõ|ò'öX~”~<ŸtOÉ+òÈ‚-oê¬ï=ëgÝeÚÕ.®üžú¹‡º³ª·:Ïz哪û}íþHÍš´`mÕ=õ猰žçïù²¿¾O…/ÍYå3Ýõ9¿ÂàNðçÚ“kM½¬çù­4érËçòÕ‚ú®é<“ý#fµß:ïûÖÀæÿŠoîMá©wŽ£¿Ÿa=ÄÑÕÞôzs¿wØé9q­0‰G¯ 1ù.Ð çgõJ=¶x¾Dï¿ëùz¯röC½›‰MKçuFªfíæ"7ú’ÿÆzn°í¨äïÜ¥‹üëºTo÷nÎQ§óYÿÔ·k|àsÕùLÚªÞ{èw™óâù£ª71kŽ8ù\ŠÏÀOXz3|ŠZ3ÕË{DØ•ˆG3Gê™Ü½Ïz jNˆ§3üÖgð. ޵úÌлg|RÓìÑ‚ýNÎ÷R5“îkêñ·N§­ôºàXÇ¿Xs¼Bÿ{˜vXæQMª§›SáÉoy_J÷–øÝbÓ y©ŸÂ{ˆ#&5Èßç+ÍÏ|¬|òLÞWùfá7Þsê“w&Ï ìóñ¼´ößÕ™—5iW¨ŸÌ?Ps–>Õ}ž~¯z–¦ó!k{Ž»÷à@Í3{™>îf§óšr1Oæ¨ð‰- „# ÍCêZáˆ'ß}âéooõþZïyÓ 6îÊWåº`_“ï%þÜëâϲ&מcŸ«8jÔí&êDÎ×ø³Ÿþó=´ ög\+ˆïõ9µOÍ•#ïkz| öwçmÍNWÿÀ†§·˜ö—¾ã7üSqwßT; 5«8°.iuV[b÷¬·+Ï“›ÏF7sîÝÜï~gWùXÃÀŠ«Æïø3îÛåÿ¿ó{~˼¹?Õ7oøÜ:_í›{X1r¦œs7O¾¿Îæ)19§Ý¾îüª§òªkM|άvL‡[yP8°Ýaô=k'Wõý‚Ú#•®yGúLI¯_}Í™wüüLbÊgê·ê<ó¨æ|A=gšyÖÎ;ó½žëŸ.W5ßé éí~«ô®ú—s­Ztç×=!\bÞâ|6º½AlâRõ0ylx©·<šòLçw¾IÏîXõË÷ÔG¿_5Vý`/äù Öó¾›ræÉgÁ^ûkv´O<ù3wš×YaJsúÞu#Nbø¬ˆ‡æ%9Pï™×¦÷djýös‘žÍ•Cúå žÕ«~ú¬³ê±º7ÇÀ¦A5 öóêZtï\í³£ù¦–üß½­<ÚE×äéf9§“.8jK-G\ŸúTi qJ>Ý,s¿ø.>›%¯Ûï†{ø›0uÓ ˆgůòÓõšçùÿÍu¯²vÕÝù~àè%í¡3¼n–Ü;ÿÈŸHdx^•XÛŠdEŒ‡EQ¼,*^P´¯°‚dUViQpß|¬õÿ? N'*NÖ™q¡`驊ŒŒŒÌªîžëű^ëÕ±^ë½±ÚXõéX?uë×±~ëf¬?ƺ«õæóoŒõæXoõŽx_ŒõÕXߌõx¬°Çø{ÆèØð_ÀCø î'ذ?ësl1asWŒ±Å!¾ør?ÿÎÏ©“8xü÷±ÇVLÆãÙŸqŒ—y¼]#b5ÌùH«»ø‹£jÙPçŸç”WzÀ9©nÔ•xßbÎ/1ÅExéaŠ›çUá$¿Äk˜9J3ò¼¯nYÇuoUš^pŽ+î/cÇwþàØçŽ#¦ãÉK 3o×äÌ›¿ãØÏÒú]̸îõ±a&×JÛ‡XÏú‚Z4ÌüÉû;Ôšs5'\kéâýUé’yÛçñ]óªg}}‰ ÿlÎuœ×µêC÷áJ×¥ÂÍþ!nö¶ðn0kA®Êûù7×ßç4õÏùæúK#ŸŒ¹Â$wžW½|¯ïÓŒyrݧ\ž^÷ºæ¯\ÏUºÈƒÙóÂËžO­+<泃:ñ3þßù¥ž {½äòJÿGuëØy‰Oö˜êγÜÏØ¯]÷JgùõöÚÈ£ÄËœVyT:‹‹÷dj=/UÿpÖø\L*žî5éwÁº2†òð¹å~I––}¬gØÞ¥~>õSÝÅËgTòJ/{î©åª/ÉÙçu5'cd„§Z]PÏ®[Ìœ³t¿4̽|]—äªÕünØç­0‰ãò•|š=¥š“[•ëÓëÙ*?{Ƀՙ9ÓµËþ¹O½ƒï‹³:w¬g0ï“oÆXájF%¦ôlظj~ŸùQõùG=„É7iÞ ³îŠ£Þ¿ ölG­‰{‚s\qRÝí«8Š‘QoaH Í÷¦÷N•«ÏïŸêá\ªZ¹¦ uŒ|ûul|…CŒ†¹WõŸÌµaÖfuG¦¦ÄP½”Kê%Nš/5b?v¬ûÜõQ÷ÌoGõšãH'½ïμêXù­áÈyÓߣ®‡ú¯cÓÖk*LÝYÃʳÞ7 ûYÕ“X«üVõÔýq6c;Ž>ÉZæ¬~Œú"GbèlÎ÷—ÇÎ9[õ™×H³Üµr:jÍU«|ç:v¥“ænÇ^ƒÔjõ>'>g ¼±ê«Žc¼v¼Š«cÝ¢Æ#׆ãÌë™sb‰_êÉ|Ùë^£U¾g¸«~%wiª¹’~¨â±o]Û¬“ûó‚ºO’/ïB÷{C]§ÕïÒÙk–1Î4¹Ë»É˜òÎËܯ½ŠïóMy)Žö?‹3ÒE¼ó¼sÏÜ틇Øuh˜u¦Vù—˜ª»ß sýÉ­ò‘f?Ïëog9gˆ¯y¬þàÍ8äëZг+=4/ùæc<÷ƒÞOPψŽ5®tÖÕ0÷_~¹`í·Ä®ü ÿ ïÿÌHçK›šŸ}ÏèØ1å÷†ûËçMå‘jn®f ±ˆsŒÌWþâwªê·fy€œ•ûטçPÆSbç{Z|+®âÉZ“Ÿÿ¶G>îéížÎÞ‘§½GS;ϼ˜“ûCø÷÷1ô¨z¸ÒWxâ)¼7±çK­ÉyÃà,l×6uÇÊNU#÷ña®¡ûÊëfïWøä÷ççðŒ+Lð¬<ç1¦‡å]ê ž¥Æ<ó)¦Ö<‡Þâ³ü]r๮·úésrÂÄo<µÇõå>ùV{µœx¶Î} Sã÷0ý©óåMec¥ÿ«Þ§‡ˆ™œäñ; îS=Ê õ•:sò,yä’&O0jù 纪–ô‡8){„§ÌɼQ]ϰÏÉ ×ùz¶é bÿ€c¯eV3Tér©†¶Ï÷†ér&Žö7¬sQ{Ùß*WF®æ¬È«•^¬%ý•Ùì5øÜå´pOØÏ¡°‰«~j~ä_õît¿Oºº?ÒÙ'ñHÞŸªïÔÊëÚ0ßmê}5 ä¨÷¼ëçÚ‘'±ˆq‹Cüøü†Ù'i"ÅÑýÃ߯¼S½£\'æŒêÒÌ“™Õ0jr½äG÷ûH¼Ô)uÏùõÞ§&Úã5é|Ï‚GØg±ûÐß É%uò;“°2ÓO˜ýÊLÏ™ÉLYõš­î ~ÎØû—Øšï ûÚÕqVFˆŸ×ù|†ÿçz\aÎ{5•ÖÔh5®•߃…MLîÏÔÒsp5|®ªž{OÜÇ®au¯¦s¢w¼—«ó+¸Æ™ÕÉgåCÿ¬¡s2³›¸º»$.3WXâÉýÎKµ®úuéž!½èŸQëœØÒÍýéØG9}if_¶7¨ÏÉ3ß5û@-ª÷;ñ„%M7ìgX϶ûgÓëU®±ÏJϹ¬'ýë=`å½Àu£f~GV¯òŽþk8×.ó“½öwªs®Þ‡ÕýÎóìE´h¨õH|÷ºf,kn¨½¨w]ÎÐÊ«¬jØ{Pó³abdTõ¦Ž+ý¼Ï^Ãy­Ä”w6ŒzV3,_ð§Ò­š1å–xõ£ªùH{ÎîÔw„†Úƒº· '=w‰kõyp>Â"'ÇJN•öU¬oÕKrú5f•£U›¸žÑ°ž³ ;{{Â9ß0ß•Þe™ôLžêMâ5ìó65ä~ßÇ=|–g¦¶Ž{‡=G¯™ß‘<ƾæÕ»(ï^®¥gLÕip”ŽÏš¸>Ì÷ÿ_ýL«lO¸†+ ÏË|©'Ô}|ŽÁ±ÂvTå ŸPŸÁ?#sA}ØPë ïÓVù(ìÔ„¸üžN˜žÙ+ö´aÝ/i¼šéô³<"^ªÏ©ŸäÇç¼Kóê}ãç­<™~¯|’zyEØÔ&=BÜÄZiò§ÒWX«ï$œ£2¤òÃ*K+¿eîˉ™úVü+ÎêqÝÇþöËôO¹utÎ3ì3Ü}çglØ÷”º_šù†ã*/+ëª;Àö9îXù7b^cjw”Ô¡¡þÜߟ§?^än ï­æÐ1]× —Þó»±23¼Ú“ýåùš¥›ûý'œ×Ô°×(5ϳ}_å}^Hï爇û”9ìE¹N/åþ†ÑõA—•'ÚÇ=¼7e þ·Í}f‰×³úþÜ3%Ïp/®ðWy’=S­Ù7Íô-öu7óaÍUÎ]šgòÒ¼%îê>F\ÿ|UÕëZz¶­jÈŒ{„ý#m³ŽŠ{êQñm8ÇÊÞ»Æ/éZÕ{…óšzG¿þ´µG`x^X]«%5¬‡EQ\?P4ˆŸ  ʲ¬®rP¼ˆ"û¢¾]ˆþÿá9ÅÔT:sÄ yºIuuuu'sžø~[?në§mý¼­¾­ç¶õü¶^ØÖKÛze[¯oëím½³­÷¶õѶ>ÙÖWÛz„CŒŽqþÅâ,Ï5ìg¿¸žû{ü_·uÃøÂyˆËq>ÞÖç<ˆuÁ1âõm=À9¯pÌI¼.ØñëLŸ÷qäHÜÏ0r&þרcTœ3Î[¨õ¤ÄÿÇÉ¿Â|÷iýçz¯<äøâMžß`Ç–c°nÄ OñÜwŠ'ÞÅ^[å±âÞ1bãe ŒÔÁu½`œûǼå1ž»®Ž%=Ý·®á3Ì9yx­vÌO±k³ê‰Žñ'lò%¶ø¦·¤ó–v·jž}+ÏV:8_ÆàË|5ÓæXª×*?±çàøò‘j(žÔýUqs f?jV¼˜•3=^á¬|íµQzo¦^ôïÕ§šŸÇy¢ºsžd¾Â^õsMLïkêéor%ǧ˜1‰÷ž÷tug3_žW^®çR³ÊËÌç[ϧ&<ç|9ëªxÙCšÍ©çõ55à¼ì˜u}ßqsFdí³V•¯Ò÷ GÎÒꂽN3??4ìüT+¯sÇüPü¼s}ÿ*–k ü«¾'Ö=æšÏk×0ø³Ï=ÿ³\OÇȹ&ž~W_0×ʱ+?kå#Þ YëäUaøyòp§ö«·¨rUŽU¯3Æö\ÿÁè)õ¬×ŸÿÏþöÞÎØÒØ=p¦-µy {N©óÙ¬w}Ä‹}ºÒ:ë->ÊO3¯á¨å*~DZ/4w+m仪7¤‡ãTZx]Ó3ÎÇ5á;Ý=Ó¶õ!ŽóË¿‡ô¾¸`oåƒü†8Ãë8b[ÃñœjÅØÜ›žc,ÇÖ¾Ô:fÈë9›¨?ëê5uÎUMåÿ|Ï1½OvꛣâÜ1û£açæÚ1.cº7åKõŠpŸ]÷‹'ñ[gt_8·ŽY?ÍÝ; {-¼®ÊE{©µf‚ö9¯ô•ë˜ï©†Ù«:ýº¿óÞK\úÀõgéÁ³'ïãJSá—ê˜Þ¹uG1çì¥{Œ<Óç‰×0ceoR»;ìµ$fÃî-σÿ÷Zgêá=«X©‰ú¶c¾›Ü9ˤ·{ÿ‚™cú8kŸXÔålhư¿:n•¿üÎ=ž“~ ñZ¸¶êÝŠ7uà|¬¼A­ÏÞWƒ§óÊÞ` õ9ïå¬'cqÆç=Xùˆ%÷¤ç ìÄè½’8>c}Tù3÷¿qœƒ·z#1”jN>Äh×3Êÿ¯ëÿÅÙcq¯sÍ~ÊY¸š3<›ý(~uMÝŸ©ûª2çn¥cöÓê=±:jßgœÌÁ{Àïñÿ§ò±…«w”ãvìs]u÷ù¢¾qÿ-²â',õ~ê,/匽àèÿŽ9_¿ŽZ“’Æ ÏóðÚð¯êé|{HòɺHKá(?åä5ñžKœŽõŒ!–¾KvLiN,é!ŸHóô¬4•7øv-é{¯™Îéþ¨_>¨µV7OÐÖL¿àzžÂDð»ò!zù/=ï=ðäwÎMÝ?Åa6vš¤oßU ®0…¥zt½åx5÷?­ÝwÅPçÜÜ»Kmxž‹÷e­óÜ×]x5Ö^¯î>”¦®Þš9è5¹ãÍԖꂘ‡]=RGàÀ5ë 3ä¥(6~S^Ô>9R›Î_ôÑý:»'³©á¹Ô‹ûNõéâÛµ±Ô~^ûS³ÎA÷T¾U–ê=3›'î¯aâe>–øy}Rïà0ßoêx߉˟uΓZs/+ߥv=$yÍzÇŒ8èb6·¼V:Cô1ÄUw…×îêŽXëìsŸµ]üŽG[òάÇkõøªã•fËuÈ=ÓÊ]³z­í{µO÷>¥„7óQêøJ{êÅFöCsWxô’÷šÎ27»³®7ú9{/g?;~G1è­×‹Y°ÔŽ+,ÍTÎ_qÌÙ¹Ô¹§ð”Þf^!V~×êb^Ý¹Š‡wfúöÞ ›^¹†µ—ÜÙÇ\IÓ}êýE9+uÞç®÷ó®{†ú×k!LjŽÏéçMõ5_ëÈ3½Ðéíª—ÂÌžÍtLÞôªã‰&\¼žðM~â¦ÿ½¯âÉýãXŽÓͤ™?Ð\¤ }Ïì0¨ÚÒ]à¾ZêˆuŸYÛy†Y’^%Çì¥k-ï…³§ëç3º>»³^[áø¼¢.þÞïµäô¤Žš×¿uî_Îjå^ežýTç^$ÿ×ýà3Ìc0W¨Ólž¥‡·Øô¼|WÀùßê9Ïü+fUÖÛë : ÞQCc¯ö¥'ñƒÏ7ÕÈsñ<O½Ìz?¼=ëê´â\fuH Î<Ÿµ¶ü»þ“¼º ãYí8/<îzM=q'dÎ]¿,M­h¸$å¥Zƒö³7çˆöÂõÃÚg%3³ä«sÌhqŸ(7éÐë×åÄ™sѽ¢º¥WÀ¾ëûp7Gü÷ÁôÜý^Íþ§ÇÁÆKí½ÕYÏ×¹äÜÑ9xÌršÕîêmJ>]/<×Dj¨ó^w]tç™ÛKí½Lo ã>žšåè}»OÏ|&i®ù Á›ÒÖ£:×l­ë\›°¸©U×ÇÔ…ÿ.°Ôqn|]óûb­£?ýw~oèÞ9›ÒWõä=8ÓýÏxÄòûï¦Î9IŠÑibö›y‡»»Àñÿ­»{É5ëü\9¿:¯tq©g»¼.:çú¥¿:«ýìÑçêƒf‘øk†ºîžÔyîû Ͼ\q_ëØ´–y u3Mxkm<¼fú\w=wzêÞk9 ò=!þOë<—éaâ?¬ÝÏ'„é^îx.užW³Y%~×q¦·ÜÛWµp?ÏbŸ¾íæ-XWžZëìWǃ'uuÍÍjrŸß"²wKñ}®]ñOìÄ£–žÿ1ÌM\x^Y]«\E¬‡`Pü"Štj"ˆ"¢$aQ\$ ñA|[<øÿ„Sœ-¦Nž³7^˜—{gª«««{f÷¾ðz_oöõV_ïõõa_÷õ°¯Ö×ç}}Ù××}}Û×w}ýÜ׳¾N}ýÒׯ}ýÖ×ï}½èkéëµ¾îc࿃ŸØÂ|Ü×}ý„OXÄy[œ÷ûú[Ž_aåù × ›¸—¾îaËÓcPâK‹Ï0b}Ñ×÷¨u ¶0už{–ëïGz7lù?ÁŠÍ3•3¾â)~ª±Ž4žÕ,õV. [¾î‡çXñ…}ÆÐC?žá^rX°þ¸Fò¥<ù)öž¤^¬u•›çUåôö~®0•SjæZÉ×Þ3^ƒÿËÏý'LÇ"΂q¾êãÔLz±n3N3>®Wöê9ù,½pä1qži(Î3/˜Ï›ìãÔCõqìÔ¢âëøÉ›¸Ä¬æƒk‘ú:–Ïç©™v [¾dÍ|ÿ~¹îqߤßf:U1oÍåÖ0ê:Ã;cà¥`häþà"gÝØcÎú,=÷Ûú%ÎQ®YÇôﺬ!ñ«Ú%Oáf]ˆw«'2ßj¦Ìú âF¼†õ¬fˆëüòº¯òAåó†}-Å…õ¬¸Ð#®UúlæaÇ&wásVÍê›úI7yn6GìÏ¿‹½?仼Y ]‰Ù°rQÚ«}wñ¥ë‘1«ÙZÕòèä1¨7çÖSÔÞ—wîa?kÙûU¼†mÏ*×ã.uå{r†­Þ}‚­w|+Îk b~‚Z;¿?2‡Êÿ³»”?ÔÊcxmª\¼ÏŽ|F®Ì—¹òýèõʘU^ùNÈþv¿3Or¹u§ý‹}ÌŒ—zJË Wž ïf¸¼?«y’ùõÐÌw®×«Æ¨Þ¥'ý0ÓG˜þ†¯ð„•÷¸û‚û¹—ùUw–ç“:ñ¬z‡çÅ•ûôwùNø³œ¤}«÷€r:cäå5÷zk4¬xê{Çñy¢ó<ã\T+?Ãýé×Éç§{·ª·ë¡9¦žÏ÷£÷Ï“Ë?õåyíg¾^×ÊGé¯Ó‚ùý£z17éZõ½ô幆½ž•×]ÎóY?ylŸo' m…K¼·±Ï¡a‹I,Ÿ§•O¤‰ûͿà ¯ì'žãŸÚŸú»GÔÚd‰WÝ > *¬ G÷—ð‹3wA­‰ð„¥·VÕKÌûÓãŒç¼ù3ë—†mgsüŒZSõ°z¯òœf¸ûŽÚ<žv©¹sv¼'NØßm®mUû†­Æš7³š)÷䑵"'ÎÝ ç‚13UƒÊ?ŸöœÔy²ÿuw7¬¸‰á糦äåwAr¼Õ÷Ëu~aO¸¹O¾d|ñoãšž°¯÷Ì/pÜóÒYßÊ“'lµús½Ò[òù Ÿ¹Íúwã^õ—zÊgÎ ûÙ·>‡+m܇ĦFUéÇ™>ÕwŽŒ¥³~&6qtV³Ž{ÒG³ØU\é—³é(G½qÃ{%}ïùͰg>˜}?¨ºûý\³·ˆå÷¹{ÊõxŒíÌ–·ª8gŒù(½©EÃþ^ÒÕ)kãyùœ¨¼åó³]Ï‘3Ϲ'Ò·>ÞÒtÁW«é}’1ŸØ®ñ„Áóέª•>ÏWßiJ_ÿ+ßOɯÒ8ãÉgÊy§'Ò›šo +?ñQÿþ‰1OÜÏÿR¿Jx^YM«E¬E0(&´?!BPTLTŇèº{0ñÿÿ»˜[tMÍé¹Oô&wººNªÓsožh}}Þ×}ýÔ×Ï}ýÖ×Ú×}½wùl¹|Æ¥¯û}½Ú×k}½Þ׃¾^ö¼Ù×[}½‹mÿlç|Ô×'}}†íÌg}}Ù×W}}qŽxü‚Á…gòá&&±œ'÷®—=þŸñ:XŸ!ob¿ƒ³öˆë Ìù GZœÕ®šgXÔ•0øÌ°ÈëÛ¾¾Ç†÷#ö˜Ò®ê•zëXÉ)ë’FäÓ°íý£§¬í»¾žcÏÇû‘\ˆé5¶¾>Ä›üžbèÇs¼ßª5±É·Òν—u»ïîaè ¼ÇØ{„xŸbã8ëíŠ}nÄOZfͬõ žÌ‡×ì=®ú${Ý©gj™þ‘Ä$OeÌëð3ݳԈg€ãùÒJõyfæažÓ°aŠWòæ¾Jõ°¡Ö%µ§Gœã‚ú,÷JæEž¡&ïãèÅ3\ÕÊg]£¬M¹>›?™£Ôí¦¯_±Ízˆïü…ãR†*î•çÉïmŒÜÏ´Q_Ü+™ýÙ™UÏ¥ Ïþ™ïoq«aú6׉ãû=Ÿé‡*› æŠsŸeîˆÉÌåeß8Wx‡T礦äÉgäó̤ÉóåÞËÌëÜìcêæži8ÎNÏð]r«ZxFr'ž{|Áãw ñäûOöŸ{ô¹×ReÓ35{b6WsEmäka9ïÔ˜XÞ?÷²xè|>?ë·{¹¡ž3ÞƒŠGÕoŸe³w ö[zUZ%nò–‡|$w÷é‚;û  6ó§ÞzÞ¼·Â­ø’gæ:9žé[ÍŠ†}í³{ÁëUòJjÏ稉žSÿ2WÔD9õy絓®Ç#ßoª¾¥Æ®¯sSæÅ+kçóüsJdzy'o&—ÔõÛ÷0Πÿ‰M<Ö¤žpß †é3?ËûAìY~½⸎³9TùA8™Íô“öÍø¨·ª©z×7’0ÓçUŸÜƒwég}òÕühØóa¬¨ß‡ª'~yo{FŒ3r&©/ ƒïzùÈ9¹÷˜/îS/U“4RªŒ‡çò·Õ•ú¨õqÁ±éœúäw/¯Å÷‘ƒß!ÿwÖe¿Ýç Gj–©7ªI¿æûôkÃà<›õ³>V:TøÎÿš§äÛ»ðUf“|}Wšˆ3ߥ’wÎZs6«þ¼ì‘ÞÊ12ûÜ—õrÏž›Ùœ}_—ÇÞdï+ÙÏUãŠI<îõ¹)Ÿs_öÕù¤¾y¶pä½ì§ð4¼ {½5Gì9ñÏq®yM3{é—z7Û§ž¯Øk¡su^ê"}³–ì 3é¾&nòwÍg×wÅ~¦{–gZT\Ôç¡ýYSÕëÄZ±ïSÎGŸð™¿`¯ëªòà^TÜÇ©szYwÐL£Ì…ãÉÏ·³Æ† Ù¨îcáTúpŸ|§3Ò{³™Ç½«ˆ;ñ¸GÞ”—ćžç†ÏÈoÉ]žËœyÈï8•w˜ ï™Ïå†Ñïj®ß`鼓¬­ÊçŠãÝãw£R­ž¼‡…G>ÿ ÎD5·\·¼7òޝô«ü®ó”iÕþ_zá¼õ;]ÅÿZŽÔ£®üÜ0ú¢=ÒÏŠKÎêåzËëÜ“}T ÕoηÂÒg┹L/¨O•¯´çšvìÑl†d¿•]÷zÞOò–ÎPÿÏüDßW÷gö¥Ê\UßrîWç²&âð™ô_âj¾ÌðøGŽgäö Ž`ðÉïÊ»þ:J›¿/û¼?Ê`öጻÎw¯ùYøUßäi÷O5Óϲ]a/¹Ípªú+í+ŸWkü|/˜×]ayn<ÏOQß7Îï%6މ9›“ÒÀß­Î2ñ†~F…í¸=%¾ÄP½Üó/ÏÝK&x^•Y[‹E¬‡ (^/âðáB‚ŠI”AqEò"¾-ŽþÿaóSSsºg ôK¶»Î9uªN÷ì>ð¤­ÚZÚz½­7Úz»­wÛz¿­ÚzØÖÔÖ¥­OÚú´­ÏÚú ÛùŸÛú¥­ßÚú+Þk¨1?hëC¬ØVLâ}ÙÖc¬x?aÃü+î+m½Š#®çH,á|kÆXK[pÄ{+æ;Xóö#løªÿ ¬±Èã}ƒ:ó‰5fUƒÇ™päCÿˆ=vÖáœ0â ‹¹ŠÛ{ žW^Ù/ïUÅqâ‰ß;lõf¿ˆ;aÌå ±¥ƒ[ÎÄö¾Ý`¯3å-Èå¨OÂ'væìXêËÓ¶ž¡î1ÔýöÜ&ìûDÔóGn¬ç仿±ÅÈ|'ìõD~¿Ã–óŒß±ØÏÓ{ÆúÅ'qtžù0úFÚs»þÈ‹kÂ÷Î×}ž›÷ç\ŸžŸêýÇy˜®'ï{…ëõ°þÿ\ÎÿK8¾Ïæ,lr{6Ç39qlטj~¥_Åà?Æ‘n'g‹pxÆ{4Êé‚ g4Ol:ÑLrMŽÎU}u?÷øqnf±½>Ý™—4ó9öó͵3â]º¬´ÃxyG»×çl>9G½£YÕó±4‹¹?÷z özqÏñ\úLçôÎðÜ3歹ögÔ¼ á9†´ª3Ιô9]÷²ö]=¨âT~yµF½×SUÇ-Ž÷š¸rž˜ï(†óŸ½“F+í¤nÜ~çkFë~f_^`¯[çì/l|Ñâ›1ä5÷ñüÎ#–sBœÌ÷‚/±’ç—9é^ä¾;ÔÞâ{å-çâ„ãÊxä ×Óœ ½÷[Þ|ô¼Ð‹åµÜ'¦ôTÅáŸùÙu”:{çŒâøêaj¿fCÆbr#Ìô¯°è[ž¡·z\'¿>›þOÝ©ÝašÄ”gñTWâ¨_Þ{Öës7±þD¦ôîºì°Ïî;y¾š×Äsýô0˜[ö#ßUnŽ·`«Só†<%ßÏ#¯¥/±¥×¾¿e7õÚ›äçìûØÓZ¾'¥aÏû>ï¿ÓÄ¡ûÉ÷%w<Ï;©ªQšwœ¼?ÅÖ0ã˜SöUù|Œ=/îŸÒ¥ðªųkÃë[°Ï+û%¬ V¼Š'Þ ŽùT³+}ç\Ý¢ž[Âô™˜ù »7lÔ½ü[õ¼?ÇQWâH~™°žzÝ;ãØ£åzF;?|÷î:æRñ­zÓù©¾Á*=TsïìÀ7Øú[õU÷HO» ö˜ÉƒðäÍ^_‰u‡#^¥“ô­z<£ž•^ïn’gõ¾Õ;«š=~忊 é²ÂKß«wo8^¥­ÄaýÄQ9C¼Ÿ®{5?&¬ñä#î®8õ}Ôfæ“Í}kä\q¿8×9OÎ2™¾w~glØÒ÷H—Õç­ÎhNQÜ;âÖuŸÜ¦Ïzyܢ֪ߕԻÑwK寬Eü¹/ظ×Çù»Ã±'ÉQå r“Ú;óF/ÿ¼#zßw®ñJÛU/2VõæÏ¹ý¢K|x^X]«\E¬‡ (~¡¢EGñ+p1„ DY/¢H^Ä·‹“üÿá³Å©S§g÷.ÌC²Ó5ÕÕÕ=³÷€›±¾뇱õóX§±~ë·±~«õ`¬WÆzm¬7Æz{¬÷Æz8Ö'c}:VëKlxÖŸ˜8¯bÃzÞc}ˆ‰ÙÆúj¬¯Çú·Â¼Ãüïuìù«â(ÌG˜¸OÆú 5þ˜¼Çý®UÇ<ó#lg5ûž8ü\Ê›qcãùö\ÉSµZÕI<;êZ¹ [úJÖíDZžažñ .Ÿ#½‰O\¯}zÈóWœkð>&G×1kFžÊ?}ձϛ˜ÄjØâÝ—KÚGM´OùVÜWž%yV= íþÂ^“Ä#ï¬S•÷-jnï`ÓtUs÷¿¸VõNm3ž! t–û7Ï»Ögóãµ”O”×}|¢~¡Ÿ«óªY”5uÿ0å lõËJ;åô|¬ÿp¿>XååõÒy<çÅù{þÿ]å¤Ú´ó^ÕÄsP]”Gꔵ{_‘ŸëœÞÉœs.5lõ«r=á¨kÇ–gúÜ}]ùJ<¼Þ®;=œþõ;Èõy€‰+LÖÐsáýâ5»EÍÁÏ÷³¥Å}¼Ö±Ÿ+òSÃqþùÞU¤®âô î?;^âzý/õðjftL\×Q|+ÍÐöï°iA,ñb|ãû+ïÉ¿ÔFµ?aÆË+©¹ó¦ÆîÆVºV8>ûsN6Ô¾ÒûϹæyœaGþÒ^3LM‹UéÙÊ×|˜9¬¼’ç8g÷ájîVæJÕÃ{»õê9LþO±ÎAzeÝ«wTêÅsT Í‘Žï â;6ýóÝ9Ž1Ü_i©{Fo¨F«s;Ž>Rí5 É¿Š%çê>uðY ÒŠSL;ïå>晘9cäá*Æ=¬ýÕ,—Ÿ¤}ÅŸû³öÉ©Ù~ïÔNš¹g…Õ°_i–\TϳšŸŒç~ÏKù S~P-ä#ö‡çÒ-Æõ éáÞÉØ»UÏò}#->ÇQÓUvìûÂë¿zÛix/gdUûüû9{νy /}¤È9PyI<;Ž3xy·ßàúÛÙëSÍUï éGŽùžMŽž»crîÓï0婿ŽK¾•šËy‡åû cÆŠ‹4ÒwÔ‚zòÿò¬œäN|÷U¥qåÕ<–p*/ISá4½Ä¹@¬g¸Ì-ët‰ŸîÐkxÙ;ÉQ½sÉëŽWqËþVÞþªðÒ¿ô#ûg•kÖ„9Û®½ «¼o±aó“þsM5ãWHWâ>ÇÞƒ©¥¿eª¿‹©NÞó'õÐïﬓxzîŽC Ͷ—Øî ×’Xʵêµê}âµeg¶ê*m²ŽŠÓɹºªã]ϪöîÏêw@zžy(bÝX }âÞãý'¾îƒÕ›Pçä\’ÖòDú‹òÍALjÐqôkê!=ÅQ>ÍûéÚ¼Oï[qÔÝ,®Ð<ªrYiÊ|^`ÎEï¿»<ùžþ\Ýûãø·¯òTù]Óp¬«z!{ؽ”úeª™BŒœ>¯VýïÜ.éz‡ºgWu&¶cVù®<˜p_+ÿŠç-&Þ¿Øsõ^ñùÚ°÷U5û;Ž}'×Oy*.Ïf>ú-ê:{h¿fˆ<š=#?æ•^ ûz_ª³ôû{|yÚ{==‘wcriØ´–ßèaj¾z'Uþð:xM¥—ò佦YágÛqÓÏÄÔßÈ6Þªur–O|>8¿ô¯4·¬¯ë*^oaÃk8rr=—ê*Ϥ†Äã¼Ïé½QÕ¦ªßA û<Õ[«Ë:ÿvÉHwx^•XK‹&EŒƒ(Š«¢âD QWAAwñI£8È‚xoƒíüÿamPQÑY=ã@žæ«¨ÈÈÈÌî~`ïñB—z¼ÜãÕoôx»Ç»=Þëñ~Ö㣟ôø´Çg=¾ìñUo{üØã§[Ÿ{üÒãWøÏã¸ãEw$~ÃÀ&±üüÆyñ$Æ[8pÃù­xÝôx†Á/sçü…-Ü 3&ñˆEžÄz#ÏÖãcqà|ËõK¼½Çs¸É³ÒPù?E¿ðRSÇuLñ.käØÄÜ1çþ:,éØ0ø¹w*wÌù>¹6ñåwøv•wê©zïk̘U­*ÜŠ«tdí+LyÉû抧jDÜÏ1|Ua;_¿ƒý¤z¥ot†ÞQ~ükÄ3~ÇÍgv̺¨oyÞuQÄZÕîq–ÒÉ…gïó|jJõ憹6;ήq>Àœ›xmX¿a®…c‡9噜 ÊÉûƒºêÞÕ¼Ú1Î{«äÙÿã©ì߆Q«œj<æé5SOy~Ž¡óҶꡬ5ùp.W;m¥™0Ó;ò±f¼f‡{²ÒJù¹^ôT5?äsõú•~ª¯×µá<‹ÄQ}ï8ÿ`Ößsæùìžq?ËWy·ÏWù*÷ÕÕ,q­ªy(ä5ß9©“ׂ¸Ò¿šQÒ]xÉyå»ôŠÏ†ä·ÊßySZ’“|{å3Õƒ¹U\\7÷ņÚ_üÓÎg~ óïCÖîÌ^w}\÷‡x]óÐïÈçâ\ùlGݓαâ'Ý’§cû¬&5&gm>ìrÝqÎU;C¼œòeWçÈ#µâù•¿s¾KO}䩪~Âq>ù ÊóÕYéúÎ÷}Vñ¹Ò8÷rê%\÷‚|¸©ñò™ÖuWo¨gÀŠp\oÖ¿šë·˜½žõS>ôŽfgʼn|„å8Õžýg/¬ru­ª^ä»UÕ‡Òþ)®Ÿ³¾•^“ô®óÔÜq~še鑆¡ú¼â˜Ü2ÿÜ%©«ïÓ 5®ðèEö¿0ɹaøY<ÓC9VWû1ÆŒ"g¯Ù}~¨|–;>sP/$öŸ˜çrz—xz–«<»£®•soªVäUá’›úëçgþÔ:9Sãê>¯eÕœ§;ê|ÜsÂwìpÎ#{®âïå ΠꙜ>kZ«öžxQ×ô¯z"{Ló°ê¯Ìó¾Z5Œ¹H-ɵz÷%¹å^”þêOÕíêÞ†ù¬zĽø j?®z±ê{ïÉ|®<É{9·«;¥éï˜ë¯;sƒgyF¿kûYÿßQëÄý"űšÎ#ßÛr‡xÎîI×9±É-{$ýM<¯›r»ò¢×k57Výò<Í"Ç“¾OTæ»òÔŽ3ŽÞ ˆ•³Ý=äs}Ãy×e¾ÌUÏ7ÒõÈóâUõ’fºs©Î³o1ôr¯T}ÒpÎÏ{D}¹š=;νá~Ì{ÿ»'uÏj–S[å•uã¯aÞ}™ï]yØ©wî‡Ôæ Ë}J<žõ} ¯0Ÿ¿ã·îêåÉs«=ª{¥ s¨öfbJsÏaÇà•³à!¾y‚ó·Çv½«o*ÄåÞ#¿‡jí=§y ïY _z/ë—^&7žõ<¥×мsæºÎ®ÅŠÿŽ“x«¹èúúŒtœJƒì÷†áe÷ÀÕ÷ qäÿ«šUžXåOüô¬ð…•}rß3Ü*?iÅýÎZ_Í/é¦ïúÙ+Ù{WºkÎæûXÕ3ÌUûsÃàµcî»UŽ9xöó.OnÂôgתfßã~O¬r¿ê‰ÔsÃŒMþªy•Cro¨ïpm¸¾CžRÝT+iì:CçxF¿å¬ò¾Ô\JÏ^}sô$oÞy‹ó¾•æÄr¾Î>Ïzå\o¨g1ÝÿÖ~P¾œ¿ùì_§~Ix^•XíŠU,0(JÄ5J4(:ø Á`‚¢rQ\į<ÁÂèû?„§˜[LMM÷Ü›Àù¡;]]]]Ýçì>ðÓ8§q~ç·qîóú8osœ·Ç™Æy2Îçã|9η÷ ÖØK,ãŒóÞ8b‰ýªˆÑ÷oŒó&¶9ßÁ6/ã™÷ö8ÌýV¼Ä"Gã|<Î'Xq¿ç›qžŽójÜ«&âI\ò#îXjþ„û3,¼¿À¢sÿ÷¨s‘ÿK,ù˜'µHîÔC˜Þ댿ÁÚ‡Ž#ù=ÇÂ-yIÛ?±rs}Ïù¨âáú{nÕ¡¼®yæ’ªÇõPâPiì>‘¦Óù»J;Ï÷K¯Yc²z©óÑŒ½/…ÛõÄ1Ÿ¡ïÍïXjª2WW‡viæÕlTµUùR·K¾®rVõåÒ=Äú|NXëÓüTØ®]5ëÝ®bžÇXr°Ž£¹<âi_±7¼KåÍñ%LÍx7¯—R‹Äõy˜°j¬þéQé0£ö&5MOª_É+ûÓy-=@]ÂSmŠc_GýÉÇ÷\ú'yÉ7•ÿ…›sv¾aÏ3}ÉÄϽ$î¹£‰?cíoêXiHW}QÅõÇÞÉ9JMÔ#éLu3¥<•ÞÇÖ öót­ö3êZrf?±ä glÞ{GwÞŒýnªtÍ»$g_uw5W»°ª[y>ÂÞ×^ƒp0ÒgεÛÙäx‡­*ün¸&—î#äµ£9ë®´NÎïÒ¾®f¹Û=ÚÝ®NÌ#¯Ñö»G{§«¹ê[îíâüˆ'ëN¾«ÈÏ÷arñzSÃôPê'ßh†R;Çã?iè÷úà3É~tý•׳ÒL<'ì½wäqb¿Äªcú»«Ÿ;TÜ;Þ·X÷‰óÏ~¹§¼ŸO¾}ª¾¯„MÜÄb,ãø-ÿÛïrbT¼Ä)ß|ö^ï¼à®ëê8^g…sÄÑùù½" Ù§WÑ0sÜ Þw™+ýFýÝzÂÞÛ3¶y½®JsÖÒáÉËÄáÏ»z¤Ù5¿‡²ÿu¹]ÇªŽ ûžH'׈½¯4º‡}z÷MØö@Ø•—œ+õ!ž°\oߌcÌŒåã¼ÆXwî„UCq8a¿oXOöç¨ïê…ïðJ§ô’ã+1ûöñG3z¹oŽú{Âv®õ÷¿Ìwi÷h_è^<¡×#±«;ƒ˜Üë~WVœ{:ë=V.búÎáÏflÿþH.ªëñ9†<ãyÔË|ä¿Òž3Ûi$O/ßnô›|Âoªý”ªÿÊÏÜÝï0·ØöHýñ¾S›îmL|a»Ÿfl=ì CuU=ý÷GÔWw“ߙй;ÇäÌIΊjy•yqÝN¨yæþðœ]>æÊ;ê.ûœ9Ôïƒþ.ãgc^;Ç¥&zÿÉc¾§•{ÆÒ‡ÿ°æâwüY…—uJWßá'ÔµiÓ×ÂÕû^󩹨4ëÞÒ.ûBoW¾N=:LÝ;Ùó ®tKžœ=b¨æõå7ÌÅo|.‰íó˜^Ê<Ú1Ò8ñÄY½£Ývo¨þ¬W:&Ÿm×P\¸Wµw*U½9a[çߨýžóÇÙÖ>V|ŧ»s^ÓÖŸýô·Fî~ÇeÝGû²ÒÓqÅ“ü´kºûÈ1“ë öóÞiAÎùæPŽ;¬»3µÈûL~ôþWs/ŸÏØóÎVZWœÓ»•ÎÄw¾z§w¿ë‹õÏØó“¦ÖÚ¯½’ÓÿmUDÁx^Y˪%EŒ…(Šâø@G-/>AAŸ/¢ˆ.Ü­ÿÿVP7è8ÑYÕg‘«©ŠŒŒŒÌê{æ1€÷z|ÒãÓßõ¸ôø±ÇO=~îñK'{<ÕãéÏôx¶Ç£/õxµÇk=ÞèÑz¼ƒùAz|Þãëßbà‘ãóüÚã÷FNÏ÷\ç1r>îñ&ö|ïbäü£Õá9ˆ¿õx£b ‹Ü܉%î‰',iò"®kç]Öžº:Ÿ¬Oµ½‚kM«:ůÂ%7iø/FÕJlÞ'Þá9‘Æêå—爫ZyŽ8üwròÅa³³Âd=º#þg½ïSãô›kãº÷³_¡Æ—ß6ŒÄ–÷žwýÏW³¼ŽœÒ®÷ŠxôfÃÀzûL}Œ%ŽÔú¥Ç|†^Æž#y»ÏVžåñôJ•£Òæ–~1—çpÜ;ùˬøÕ<+dž½¿®™f§á8ãêý¦wA­Sú&ûQõ€}'wöZúT;”{Üݓ䜺 Wü«ÞVZkßW˜ÒZ'ž<.]µw‡¼Òk®ßo8ΟêL¬ô—pÙ£Š[µoX¯fº¡Ön†KÌ{\{ʱ¥#ñ«=Æžg×5y«÷+U;3çDùXvKå5æÕ“s¯=M?gO”/{ :\ß}ä§úyþÔšúμ{¸ësÄ9¯>KéÑœ!ò×Þõ÷Êy‹ËL‡ô‘<¤Þ:Ÿ jN^«¾Yöúˆ¥ý3ëÙ†škÎPåç»ÚCv/º÷²ÿÕù•wÆL§œá™çU qôTuèÍ‘ÏÝâå{†þÈ=@¬ÙlæÈY.¹j'V<½¯UŽÄ¾CÝ×3]+|iü:¾x§O.8z„8Ò aŸs÷™Ïšûß=á5T¹ØGö@ùäsÖÏ;gßP©§ú%œ†k_­°f³—=òþ¸&³o—Ä'6ù¹~<—ï¦êðùŽôï­úOþ/`ß“­ÇÛ¨ýÅÙ˜ù¡â‹6î•/°ÆNÞÄmxÄáüªvÝç]ο×îÚùn!'Gõ]¸šâŸíå˜Õ}ö·µê'fµÝgÉ1ûâܪž8¯[æJ½å}žåþÛJÜ—¹ÛÕƒ³üÒ]=Õ{;x…±â¹â(ô^¨o3üªþê›×{éžö]êuø÷©|­=N¬ÙNÕ­™h˜óÑ\ønb½Þ‹JÆcUgŸ3v¶¥e~[¬z”x9«¸ª~~{&g}ó‘ó78æ!ïj÷T³Çš½ Çw@Ö,=åÅKÜS®kRU¾ ǽ¦Üôor—6–÷.ý–~u¬Š[å[÷BÎõy ÇÚ½Úí«Ý›:¤÷ª¬cå?é+¼G¸~—ÞL‹Š[j˜o{Ùß8úgõwŒò‘cÃÞ{¯‘ÿî3¥Bfo–ò¯úÀ=·ªwÖÿ†c>驜ÕÎñ\ »g\qã¹ô†÷’\®çüì›BXªC¼ýÏo¿Wþt½Ùgõ¸Ê«zÿþ+m}®®µÕ{-¼ÙÓé×äǹq/ç¾a`Ëc+ [ï ñ|¦y_z+¥Ñê·Ò[|ç^çÿ¥xÚ7·¾sÔ,çFoOC½gÅᯇó9Ëê~É“^KN¹SÝÒo†ëuÎðf{A|S»|Ó+lXcçŒkf3N¾+ÿK¼*7ìœü~åÿÔoõ»à†Á‹zI×ê{‰¹È[»æÌãjmýMŸÍuµÓ]+åºÇÈõg¿1Ï©\^õŸ½‘ª­ò¢Ïúâû„¼…¹ú k6+®½vœë>ãUí.ï¥ë*M«þïµtÌ~_¡¦šãUÍÞâ¨Fÿ»P³”½LéÑœ{ösö Ÿ=`ŽÙ P»Ù>Ö|ÇyºNä¦{©«Ï·úô?°”I‚x^™[«]E„ûAÅKŒâE¶A…¢ˆ(Q6ŠAÉ‹¯åÿÿN1~¬Zµ{Ö9æ%™®®®®îY'y\UOÆùzœ§ã|;Îwãü<Î/ã\ÇùmœßÇùcœ¿ÆÙÆyuœ÷ÆùhœOǹŒóù8_Œó¸&ÎuÄÆ6Îëã¼9ÎÃÚc‰ƒÃOÕs ¿âßçãšñܯ×jæxÃî)WòUÎ/kæýªöÚ•;óR»ð÷ÚS5ÇëV|rŸjbˆ—ã<ªŸ¸©?gü¶:â¿5ÎÛµçîg5±»š¿¯[Ì?kâ¾RG]áÿ~ÝÖ.Üojï¡0­[\ú(ìÄM-À…¯cº¶ŠW­Äª^Å¢ÝÊS[Íjôþ¬xtu‰µ½¨‰K?VXh•}u¯w~¦§—Ú±˜c×ÿYÝÖ‹—½¯Â}·öI®òŒ°5Óÿr7€)2£âè{Fž[a #ýLÝÝÌÑŸ“Uœ'¾q|°ÕŽ ïkë¾þ·ŽøÎ=wã«wér°Rßk9Û‰Ao:?i¥®à‰ßjO¸¦7úu©c½¾#®uÄóà½ÑÎç'uäzßþ?¯žoǯ®ÞÄ­¦¦Š§·—:jG¼¼»µ«Q8ÔåZ‘:O{o»º:o€Óù–XÅøý.5\,ÿø~Ë™I¬ôû\=9ÃzYM—£»ú{a¢GêÉŽ<ãu©½ÏÌGç;´íæ/çNxø®úµÕŽ›}H\yÒçd5è¸ÕÄ®îuüWó™y»š¼žŸ^þS·»zU=v½V}Øjâ<¨}âÅ«ÝUn¯=뾋 sßñéޕƼÑwåcW¯úKο«÷š¨_xšxÝGr»?¹#¬‡uœ9ý9±Ô ¿ƒÞk¾]u—9Ö·HW›Ï„c\jç›ïƒbŸ×íÜçLuoomçå­&–÷ò¬¾C®µ®K¼ÄGúvxâ$/äï_ªq«©qÖæ;MX®¹óÃ[÷y‹ÒÇž‡ïÌ.¸+ß›÷å †»4Õ}qìæ ]gj²úÆò]ßõ¼Û¿÷¢&§Ì§ztw«ùƒG;þ93äd޽GÌ£ÇùœœÍ™Ï ÒŽï åõ¤ØôGú¢ÓÚ{é~¸Ö‘“üöé=×FoTæÈ7JßâgýÝ꼆Kõ¸¹+½ï[õÜ7ž\q×ì0§šÑÔßù«þ¦e äXñï4¹‹÷YÑ\ÜwæI¾+\aJNƒ­æ”ŠU}ò:{œÚ/Þ“ô:eŸé»G»ËëH_úÎÉZžÔÄÖ³Zë²Õ¾o¤ù¥v|ß\ëv‡nuÜY^ßê­êÞ¼œ4£>¼ \a¹ÖÄPÃjŽòZÕå>÷Ú²]}ôìZ»/û•~OaPW7gÜ÷ýܽq¹oÈ›{Ÿx_ÀØjþÐiáóž¬æºzøž£~¼ïñÛÿ±ÒL=%w^þÛ߯ïL+Ͷ×Úí·¬Ùw;(¿¡ÈáÞv_³‹.u‹ o×"9 Ë÷®÷Ayñ²¿‘?kr_eÒéáU¹»Þç ¤n>CÝ÷ Îû#So…gß%þö—ºÍážÏÿsîtRN÷ïjç3Éø;V§³à;þZ·ót¦«0ºÞtu%5ÁCzÁã?ÇGUx^­XÛŠ%EŒQW×U\EÑF¼Â ¢x_¥YqEöÍ'ÿÿ#¬ 7è¨è¬:gÀz늌ŒŒÌ¬3OüÚÎóí¼ÐÎKí¼ÜΫí¼ÞÎÃvÞnç½v–v>lçãvµóE;_·óS;k;OÚù;ÞïØñ^Äyî»8ð>ÂŽI¼/qà9Ö†3žó#^rü &y~šë v|ià1È÷MqôŒ¸>‡1žò'ßäúvÌŸqæé:‹œ\¿O±ßÕi$Þú†±T?j£˜+Ž»ŠUå ̪†Â'ö˜ã¦.÷±c/8t!ëVaI“[œ¹óÆþ%Ç™/è çêþ½”{…'®â¨œßB%œì…Ô/k⾎cŒüD}ÈÁsòžÉø>+¤³÷µ°\o×Ç}7êÇiÂ;©óxãž­tUü¿Ðë›ÞÕ^ž¯´NÏS:I“ŠïŒæˆf_Ö®âÄþþó>zŠ3GßÄg-}†|‹:âÿ†~6*†4¥Õ’é9qãlöü?@ïrüGŸ+rÌú¤—”»ûÙ5õþÈ<9“È™wÄG¾KÏmϾ­òËWsŒ|fµuí}ÇK¿Y yIuþãç|sÝıâ—ýQõ³ïù;·Üe£ü‰ÿw;ÿbÿ«´æ®`œª>Aÿ–¸”‡zÖsq¿¦§Ò³ô«zJ±Fzÿƒzä,¬Þ³Ýàe#*¦6Gj±`Ç#Fö•ûJ5óü¨i5Ék´Ã6œk$hÞ-8p¼öêý ù}/»nŽ]íHÕE^VݳÞμ5«¼—œw°“ûµÞM}ÕÔÅçêŠÚ£ÄÍÚ;ïgytäÏÔ"wµeÞ®¡î(~#}øû¢òþkÏv­¾šâìx¹c¥/gwx¥GÕ[Þ÷ úùRiKœ ç÷†ó¬f°0«wÀŠ>ÿ‘®3lq­<æúÞ ÷Dö_ê<Ó¥z¦ßWþMîÒ%gbúâµöÂà=}Ïïf:Žf¡|~iî{žŽK/ wÁŽ)½4«VìXþÞ˜qMŽ^ïÇèó¾“xž¯zòRM/÷§æjzGqü-ÂýíºŒtÖ¾PÝ3÷jr'Fò¾ô^ºÆç9«äubúÂ}ÉÚKUrЯçïWµÈ:TûLXÄIÿÍð\Ÿìaó-£Z2FþvXqÖkc6o¤EÅ?{qæOÿ TÅñ\ïÒ,ÝpÖN1{®£{‹º©Wô1¼Ÿ=†÷Û(§k¼[i–µõ†úW9Tï½kc¥Ç2–÷ÃȬciN¨'sN,èç¨÷Wò­ê*ís‡HŸuä]qeŒ§8×Õ}ã{Dõ¬ÞéþžN¬*ïœÅ×ô—Þ¦©í+{|Áï.±6Ôyäÿ0ˆ]黡çøgånJ~z› Ïóv^ÂÌ™;{‡m8c‰ãˆŸpGºqN'ßUÙCéyÞß°ÿ‘Û¨O«}™~ÒïrjøÆœYë?qè›ñ*/ÍòYÑcûï‡Äà}êy­ÝOÄS½4ƒG5óùx×®÷;èsH fø¾C<Æ‚#÷8qt_~Õý çúè·´øem\[Ö'ÿW!ÜìŸY¹ÏFØêÕóóÙ=Ú›éåä,¥‡´È9ò-¹kor><Æ™{å‰Ì!ñÅÛõõņKó1²ß/Õ@ú¸ß¢Ÿãä-ÎâK,i‘óˆúÞ5w×öڞμƒ5¬rg é6Ârœê E¾ì9ç7Ó.sO¿z?°Ïª~ ö j¾Cs­ÚµÙÿ§ÞÞ7©»{š¹åœÅšÕ"c¨¶ŒQ½±þ±zEìx^•X]«]5œ‡bQ¬ŠŠXtSü b©biå TDÑ냯cÿÿ0Ãfس'+9UȃÞÉZ³f&9>ð[_­¯;}½Ò×ݾ^ïë;Þé냾î÷µõõi_Ÿ÷õU_ûú¦¯oûú¡¯g}]úú©¯ŸûzŽûUœ±?D½ÂšÕH¬ ;Îg8°X㬾?°c¾À¹Æ×°ãßÃ~ƬNb?FÝpÔš}¿‡óKÔ8¿âÜ»×—<~Œ‘â²Ö¯qÌëvNž >SçùYªû}|ëLñÁ3V¸ #¿Ä%¦ó‘õ~9&ù!/âã]ìx₵‹8Üÿ2}æl4kap¿æ2›qjÒgA¬ªÕC=Îp³6qÏÚž¢Æe­ £~ïì˜0j¼Â¼ÁŽ©Ó3š«keCÍ…49›±¹Ÿç¿;7éiiå…*·òÌäßû’ÆV3&þ,tFæâJ7îÕx™‹âbÃy¦î%b4ŒÚÈüw>‰3ó£ó·ÒëòÙ°?Þ)×0‰õ6æ^ð¼“_/˜ãe¿žkF/¸fÒcÂU_<_<Ýb­[jªºkgþãYbÔjÅwÅ“8’¦Vóüós\³:#ýÆsÒg/PãyÝŽëZÑ,x/÷GÔuÿŽ:£üÖ]áú!vz$g<˿˪ šé'}#nå_îuÏë[ÕÁó勼Ÿ7Ì羪‡šý×ýœó¯¼øósˆÇ}êÑ9ÐaÕ“Îa/+7캛éa6;žñæ÷¡ëB¸Ä‘®*ýóÛÌëäP}1Wsj8´ ¼ê™}ð~ºÆ™<äZ›q¶á\·ëlv6Œ³à¬7ÔÈ}Ü“z”>\«7߬—Ìb]óIÃÈr"<GV¹E-5œóuÃŽ¡¹e_UvÌæ£ž4ÿï°çèµþøÏÔ: þ†c^œûŠ3ùe¥}õ¨=·Ïwͼ…‡÷hb±&é‘^òÚª°¶ªÏä33"çsÁˆÛp®]˜žeÌÊ•_\k3Ÿ§g½’׆ƒ[ÏtõèuU÷¢÷¥¼–¸5¨ÖÀóuîËðœ~¬Þ,¬ÅsX^p$î†ÃWÙ[Îí/ì¸Äâ=K ÖÄÞô-ÿ^iS|zhöìc6;翪)5븳¬u¾kr´áà7÷ò{Ëoøwþwb(Òÿž]âßivžÊ¿Ó²·ÔUÕcÃÙß¾}ÍòEû’ge ß✽ÌôžØ™ƒìÓyO/Wû¹oU›4¾âJ]qæ5Rúÿ¶â‹ßè|Íó?HÊx^X[‹E¬‡ D¼Ä F‰˜!DQPEE2²ˆ/û"yraüÿÂ.æ+¦¦æœù6Ð’îê:UuNÏîcŸõåX¿5õçX/Çz5Ö2Öc=ë­±Þëñ>½œ{ŽõìWc}=ÖwXqþÀ믱þ문ÂÞ„O<Ç}~ÿÛ—ý_΃Î}#—ïÇú='òYp¼Cu>Æy­ÄÿµvžcMØj%ÆÏ8bP¯¬û¬ç?dž!NÄI çA¬ª¶ {ý¾Áƫ“ î§W‡# Ö¤=¯/ÿ&?[\Å“ºËÛ6qÓOr©ö=°½º‹Ùªê.º3k¹ÃÊýMlx©É„½ÖÌ‘ëýãX¿âÈUwdÏt˜žûÇžæñ”FäIœÌ’ÎQ'¯íìëc&ŸbŸKõI×ÌÒ‚ÍÇ—ïòƒ9QÍ™ïGjØÕ®ìÞâxo•µÄ÷^χ{ùÿü?áføìòþeÈ[þWz)Ûé]öß„:gš,è=𜠯šYÂQ¿IÇûG§÷u¥A••GØæcfƒº&&q²Fϱüö^Ì>öìƒÄȾԛqV×™Êÿ„½^¬í[ìs_q^°ê晩zI¸âK|bw˜äêž’'ñˆ¡¼y™….[Ù®Q—}ö•°„ãózF­wæ)}õ¼:WâW3;ñãGØ¿aÂð\äyiF^>Ÿœ ýÒœ­j”æÜŸ¾džÏ²ìÙà}™¹*×9_\cùvm¾{™÷ìͬ™ß˜¼‡˜Âp}ÅCþVuê¾*?]=9 &ìkP^:Ÿ\×dŠãoÏuÙõœœõ·óIïÈIÊX•yî½Ãžïwîy¯¿Õ®…ëš3PýSyå¸Wÿá˜õª—„'ßÓ§[ì¿;ï«,{ß3[Òá'g·ß{ƒZ›ô›½ä}4¡ö]÷*K3úž­îâ{«¹xvŸßUÝsv±©<¡^Âɬæ¼to«YRå„/Xÿ#{1qò<ï÷lQŸk3ôš.ÔÁû?¹s—dzž©üQÞ+m=ÝÌaþßDZ§žaï¡øû[ç8Ù?6Îä«ù_õçr9Ç3žuî}qÙ?Ûþª§¤ò­9œ\Tø¸†3Žó'õRïhF(ÊyÕ›òØý­´r­5gù½^ñ;ÓA$v5CªÜ÷_ì6Î|v?oŸœ»™¸ ×C3é 6LŸîY÷í–Zø›Zeáì J©A¾ÌÏgoT<ÜŸ‘ÊOÎ\ÇÊzôf¨&ùëÞvu˽;Óáû³™…k߀¬-1}6yf‡ò™çÒ_Ÿa䙙ߤŽó[Zë;fFŸQ¯õö?ÏIsiÆó Žïypozâûô{yZqÎó9£\ b<Æã™â™¬Ïç…zCµ)S®—sðLu³Í1YK÷†.ؾù*…ÏßY¥â©yYÍ6Ïó&¾rSiŸssÆÑ bÍeäæ²Áùœ¸ö]èuWœ²Öì¿«ëßü½œò£zøw÷JXä&^é¯sxýŒæÔ¾û9Õësý”bùï63ƒ÷ñtÁ>'Ê6qªsÚ6×¶ãÒeWµª7ò›•wpþå»@ŸýnV ÷¾Þ,8òžpœOÉQzߢ於X³óéð¬5 Ëq2wgù_°Ïšôò™¤ɉ8Ô(}u^ô#ëìæ\õ]”x™™ÊWÏò<ã|V “^úŒºö­#]Ïî`)—šù¾å¼ ~5O‰ç8¸ö-Džôê7Ô™v;}W¶»o©µÍ^ì²~­oÔxùLØøêgˆ.óäJLb¹çòB¼ªógœô}×Íg×2q3ŸÿuøHx^•XÛª$EŒYQ\=®â*Šö.ÞDï2(DV΋ì›Xëÿ„ô•Õ3ÔËLWdfddTõÜðR_/÷õJ_÷ûz­¯7úZúú°¯ûú´¯Ïúú¢¯Ÿú:õõk_w}5ì1´ÿa_ïôõ6,b|Õ×רp~ÁŠõG_÷°âƒû߯ŠñÖ<ÿKÛË}¿÷6¬ûgõ(—°åCÜ'Xóú+þscŒÛ¾~Çë¬ñ^Ä3ySΟ`Åý+îÏënX1˜³j^°ñOÎ~ÀXw;ïá÷üîÙù»kû¡Ú½¯Ê‹µ¶¾žc«5qo0Ç–n£Â§^…ý6lñê<¨/ cŽêû‚-'åây0õ1y»T—ô<ëï‘>‰Ï~ ?±Xÿ æ+±\ƒÂd¯«>(?×ßûØ×<Ó‰tËYs-,¨ýÃçW9SêŸý¾x^ÏV=sݨ–ìß‘&«WéKÄMžˆÍ¼¥‡æš'vUC¥;×ñ©9q3ÓÜ_˜ÇÉ~U¼¤âzÞ°â-Øëϱ¸_¹ÌêUÿ3vò–œy-ÙâUçŽ|”xþ<}[üúsŒí1åK©íä*ù_ÒjêjÁÈ¡bÐs*»Ã¼ßÊ÷Mlñë1ÆÙƨãj½6Ÿ×—×Xõ$5}m,“/¾\?ÄhØë•ûróQ3.?Î+1^ÅÜó2¾¼¥¡îKö=ùI¬[ìç!5¹ ÆIæL-ç=ò/7Gš:š¹K}•ß>Å6'Â~û3í6l÷¿ögC•ç̳Õ{ú“Ï×·X±+omØß‹2žß;ýzõlûùèw‰j®Æys‘'õ>qå”®…ãs‘Úó™PíòֺȜÈ÷Ì›'9V~ê§ßë=†÷Õ=³aìçy6Cª4ç½!¬Ýý@¾¢¹'ëšÍ¯4Âø|G©z(,ê1kfåQĬðÄ»z[áU³”Z¾ÔÛÔsöØã‘Ó£óµ¤G&Çî‘ï¦vN˜çOî3cÜ`CX0Æ þ7XgÞßñ² ›ßwÁºŸÜrîK^='×CrI½eÝÂLŒäNÚn˜÷S±Ý=~r¤Õ¨^[êÃëÐ>Ïkv>T:Йày#Lù¤z˜ZpÎ<·–¸rMã£Ïª^qÃç…ýd.Ú—=L­æfæžOžîÂ|Œ±ŸÂo'ŒýxŽ:wå]½{1fêçèP-œ™Œ“gpžíªC^WáWçLÖ1Ó˜û„ótmîägÁžæKœÔׯžV<ä3yþdÞ'•~f±ò¼É˜©)Þ³|.«y?ŠÏ¸ù.Ï>ïÞbU8Þ[Ý¥ìýÃó­ôãý­f-ýnÁ¾—z N|¯áö¹ ;¹Hì#ÌJGÙËÊ[Oã´¾þÅvV ?'+]æýèÿä]qN|å™zöŸ}<û˜ÚÎ|Oqj_Y°â¸Ï27ßß0æâÿÛ/ØÎ„ô¡*z6?™ËìÎzNöÚ—GÜ`ß“jÜÄcUƒû´÷Þµ¯ó–yñyÿƒ¿ËW¶{„úðèüŒòºF×âÿ¥p‰•>¢ºŽtw¤çÙ» qÅÕ¥ÿª…ï½Ñ;_ziÕóĽņ›9WÊ^ËOůråü=ëëoŒþO|ÍŸc&îÍö1'¿W«¶äJ{Èýì÷KäïÓ FNg^áÏÚ«9]0rá¾\Å þƬAç‰â¸ïÏ´@¼ì?óPlaüd<×ãL‹•vŽþÇsþÄz©gô{zòÌ×ï-×u£ßþAGix^•XÛª$EŒQ/«+^P´ÿÿVÐ'è¨è¬žõ@½ìLGFFDf×Î àÙ~žïçÅ~^éça?ïõóa?÷óU??õ³ôók?ôó‚}ÿµ~Þìçí~š=÷Y?_c{ö—ûgëçwlk?wý<‡­¾c>ÀÆãõ~Þ†ý.6^ c qóÂWoŽM\áµ~>†õ)6<öûM?ߢÆvþÄbïäèüç{Œ8ÄX±ý¹ö/aïýUìš÷}l¸7{ÿ[êÌZ?¢æ|‹óŸý\0jã>²Ÿ70ÖnØk~‚]'¯í=VÈcÕò•§ÄVOÂþǾTãÔ9Ê 5ë¸~¬õj Y#ó$ÿ]'æÉ{¨°Èû1v}œoÃÈQü„ã}gÏÌŽ|œyHÿ¾CÍ‹XÌ¡çÚg/ý‘/|žœÜëô!±ÆÙSŸ³¹SÏ>+ê•Ø {‰#Œ¿0êæX®=ù°ÇYÔk•çÌBú˜û@˜Â#ï#¿Ë略™mñ÷ÝüÿŦup-‰¥ WÏóΟã÷ÝK=“û€Ï/kð;ꋟ]î?ÏÙr_f»B9äìºWê“ûnņëÞH#q Ì„ô—ŸžY>çžr>¯g{Pz»†•æž9b¤ÿÕ»Â3$m´C+nÕwÿ¬÷™÷Ü·âã<þƨ?ñrO6ÔÞó 3³àØäªû@ÃŽ«^+×k–Ͼzfî+¬ÜÅ™7qÓ,Îò±¢Þ7Õ;ÕïO§[œóâÌ óŒï åÎç-kð^FlbªÇ¼ÇúœV™Õ<87åŒYÓ}Wª)ÏÉ™rUë1ê9aÝœ;eS¾_ËÑì=¬™¦Æ £>3]üÎëy?ÃÏ!ïÈ{ö^UÎìõn:«‘Ù¨æÁ¿+ ù=ïOõr7h^fÚ c¦MúÉ|h¿(Úƒ jìÿ“íiÕàž•þªã54?¦<$OÞ+ž™‘äI r9®Ï¦óºÅ†í¸ÂÌ=¤œU;B:ò^e®Ôól&ÜìQ|ô¼?ÙŸi3»sH#zÉÞÎæ_Z­8Ö¹VÃw8=>›Õ§ñººóWýTw~ß9ü“_Äæ»[8ÄÆä‘ï–¼/¨Oé˜u³7aé½7Ãòì.8â宿ôƒ˜¼H¿+kűOùš:çpž ŽWŒ÷˜œ‰†ãÜWwpúÈÜÌt§ÿ`××3ãü³Fr_×@ÿ”nÚw¾ç˜é­wÞ‚c†ù®y×gÓ5öL'_×ø»‡93һᨵgV¸·ç½ÂoÏñ¤QrM<Çšqs²_Ï<5¥®i¥§ru-¯Ú?ÄnØ|È;?§&¬ÉÕÌò{ëýwù=ÞåÔë Fý.·à˜ñ㌦™!bÏ2ã{Ð1…÷çù$ßîŠ];b$'Ï´ßS|®}¹`ôÆu³ZªQéKì'3åóZéK窱j–ª:ž¯ Sœ…“y;óKÙª¼ò]’¸®ÁŠZ[Õà| ÷ŒØ|·xŽée¥Á-Æ>ª 7ìóäºV¼søžÒï©ïì}%éê;.1Ô¯g—xÎ+{%®ö0qf<ø¬?C.ô6=õÍ:zïó;ÒMØü\=©ŸÌ†ô•Ìëósÿwþñ³ô-5’ožáÙî‘gÕÎÉ9›ÍÅ,»>Ã×~S­öÅ#{`Í ¶½QÕ<ÓÅñåå}5ã©MÃq×}‰ã{hÁÈ]w%eÌy ÛçpÎÊÝ‚óŒ³ó½Áˆëï€jr†*_u‡ö»ˆï£®÷L>Þ›êy/ {^ÈY;ÎsÈç2×<Ó{£â¹bŽ×0bGwåÛóÙCÅÁ÷ÄŠ:Óž¿ Ãû¨îÈÕÜ'7Ï^Ãùl Áèiþ6›5òÿ™ñ™â/LâñX݃ŗ;PzxVˆ%^ò$yx;Ô>U»®áè¹é7DßYkÅõ:®çHáx^XM‹dEŒÃ¢(®.*~àW±¨«  .²*« Šƒxñ"Þjýÿ? Þ/^¼Ìn±¡.=U‘™‘QÕ3|ºÖgk}¾Ök}¹Ö·ký°Öóµ~Zëf­_Öúu­ßÖú}­?Öšk½Xë=l8<ÿ ¶ó<ÇýÚ÷`­—Öze­×Öz¸Ök½µÖ;k½¿Ö‡k}¼ÖÀ†Çœ˜sÉ<<a¿Œ ÿUcûløGlqý{ ñ$¾ð˜'qT/ž{zF9Mì90¾øñÜÀ1nòòàYžó3ÜÏœnqä¨ïb¯¡÷ô+l=ùn­g8sõ¾zUÕ+5PkHqY§kñþÁ9c‰ ñˆÅü;ï¿×…Úìr}‚-ϯ±á{/=?j<ëÝéõ¿rîê)¾Ì«Âîùýÿá,ž7¨óâçÒ,¹ÖÆZq½ÿœ“Š‹ô,NŠ+.oc¯OÖ:ã)VåŒ3q®U5/î]^Õ!gmà8תïÏèyNÔ5~[^Öz{/G1¨×äx ·Ó«k¢òÁÌ?cTó0°×#µ@tý¹TÆ`=ÜG•{jøº·Øƒý™Ø9Ë~ÿ ì¾)-Ü`Ïó»G«Wâ¯Þ+Öƒû½®»jŽºº)~ò¸V/å–>ðçò>ö&ûâ3I<ÍJΚחòÎ\È—óì=¬4Rå0±ßI©çZˉÓÕL¹ l8ž‡ŸU|çäýË{@^ªp:-¸Æ‰Õ½Q&Îw@by­Õoާݼ—ZŸèõÕÅ!~7çÇ^v8âî9Wxâϼ\[:ÃwOž«ÞŽ·äEÌĪôYùÊ'8×èÚ;áOëO¤N8×Ǿ‹\S#}ÿä]îļ6“^wÕ¯ÂÏ løÄ“§¹.º^(ÏjFÈŸyÊÇò»æü0ްsV*/QnžKjžû:>|ËhF;>ûÂWÍÓû9OÄOÝ9ÞÄYÃ>SÊ1¹fm©[åÓÝwÌAÜtžg'¶÷v¥)iÓ½0u$ ž×œpŸ¾S˜Gz¶|±ª7kí¹øoKá¨Æ>7™ßÄyf¼Þ•6Ò «ü\ÓÂ’4sÜ/=æŒ*nõ>t©8ÝâøV¾Þ³Î‹ø©÷JGœ8ö-uMœ<ϳÇ:û|ä½í\5Ž©Ys~ész§§Ï‹£ÿƼÁyfœk…Ï·“sÏ>]škiWµâ÷óþ»Ô3c%y`—sê9sÏzìõy‚³çuw¢k‚Ÿ.¦îþÏgàÜ ÅªbLÔ¾Mõ{‚{ó`Ü#<âÈs<ÏAû²vêyöÛùÐoèÇ]ÝÔ«äTý_'çËãùýZÅa zÿŽsËŽ­¤®¤S¯9Ï œ»T³”ÚÈzòýtIYWÝ—øNôþä^'m;–ëZš«zC¼³Ž+̬…p]Sw⊳k)ïiš˜î«îŽë:çYžI>ԯϿk‚zú»¦^`ï«{£ô•o*qrÌäÐÍDu “9gÿž'1å®~Ï8Òbâû¬eO»¼½öŽÅß1”Kj-ùÒ£‰UéÌç€ZSNé%žWzqnq¬“û1¼.Ò|çwžOõÆæÀ1/ÝEù[â9Îqòήâ0FÎlzh5_ŽÍ=šaש<5gI˜]=*÷ÅKþCÆS,Ÿ§ã\ʪ:$NÅ=ýFy—ó÷=ν#¶ëMÞMA¼kZun®ÑŠqŸáì?Y¯ÄëüÌûziÆÅÙõý6Ïe☃4ªzòïôqî!oâqOõÛÀ}°ò.j7¹UõJ¿öóZW9“¿úÜÕÑï±ê­8qö^y·ógÎê…ç[õ–¹ð­›ïŒÞ",iO¹To˜ô¯gêdbŸ)öEç”÷3v5CŠ+šžífè5ŸKâ:áºÞ½ÎMæ8°c¯«¹×›œ•Û#g³Ò•׽ŸØq¯4¤>¹Gkÿ¿ŠÙIkx^¥YYËE¬‡ D<âŠÎƒ¨Ä‹E1ˆyß>\óÿ„SlŠ©©íÙD |3ÕÕÕÕ=³_nx®¯çûz©¯Wûz£¯·úz§¯Ö×û}}Ü×§}}ß×Ö×}ýÔ×Ï}ýÚ׎ñ&Žó­¯Ïûºã÷k/cr±?ÄÀ×ÞPÇà^îûæñ¾íñßÜóL_·1çò:.oãÈç]œc^åDÌgqàJ'â*?b}€÷ æÓâ9×J{Ç'65ý¢¯/ûú‡f®GÆ}ˆ#ö-ÌñûñYשahus~Œíq3æ ÎùɉÿŽœˆ¹ÊãÔ9d ×M¼‰/Ý*®;/ß—±®rQP“ïŸß0â𬼘µ%?¯í“´M.Ä\ÕËý-Œ˜ýè:®ü§}‹ÑËÞo/`ðy ×8Î+k,^~Nõ`ƒ?ã¿q¯j”š¤\cÕ(}PyJ¹(ÇIm…“þ¼ƒy5œ5aͯ¼ïz{ŽY{×Xâ<ÝpöÒŽë~ª<Ë÷pà†1*þUŒÔv…ý¹;nòÆê,yù=&nª{•ëÊGì1{³¡®W…ë}Á|…›9®<¹c>'/3&÷¯tfLî—~™}§z„ó,¡çy·¸–9˜¿ß-ªý•§\ç[žò¼rîñ\y…ÜfMRÃÌÍçîí¼æÙÃü˜S…­zz?Èo¹Ÿ¹ÿ…#žÓÏéI|è¹UÍw¬óæ{¨ñ6 ¬Ä^ÚŸ~õúòûÜkÄó«s;Ö³ÆgYÅŸ|øžªp¥ ±äiùM>æ½íµÒràþ+îÒÊù^ÕP÷qâè¾ðج97Œ³ô"Ïr?ãj.¹çäKù)=¤·À†#þßw_úF¹4Ìš©ßÔÊãó¬É¹ÉóÙä›^[½CTsõ¥c‰ƒk(<åîµ®|r õ¼‘¬GUã†Ù“Î/gµâîñÒCîÇ%–Þ@Îü+î•/æz<'ÅÓ5q,åÌ» sU§¾ê±ô¨úºÒÍç…óѼqí4/ȼܳj87bÊëÕ7Žæù•îÎI½Cîcä¶áÌ%uò»ëiüWyoùOG|sF¯ê1ž«j¹âçõUWl˜sO¥!õ×ë^C÷nÃܯé£ä”|æ|‰Ãš_åê3@;kŸÞQ<£šòŒræÏ®x®úR|”gúC:;ŸJÛJ+Çq/{ç¬jΤîò-﵊ߎ™“¿”›0òì*7rÑüÈ\Ò?Ù“Ù+ò³÷‹0ùîQNÉé!/ïAjÔ0§÷òþôûˆ|«oæÌ_˜Ì¿ºC„WaùÙqæ,üêwÚÂwΫï×YØž?Ïðç•nÉAuU\ÎIÿ½*GÖ†ø`Ô'=çºûÛzùÅ'59ñ¬úg²n/ãü^¯ª·\GaKÃqÞ½éû¥«ëɸzï7Œø|s¬<žs,1óåù\aU}’ïÀ|«m8cq–‘ñ4Voaaé;fÃ<Ãv ,÷â¿T»GÒx^•YëŠ^E¬bP4†D¼‘1x1ˆF¢Q!¾€0æýÂ)NŠ©¯NÏùvó'{¦¦ººº{f÷€÷Çúp¬Æjc}:Ögc}>Ö—c}=Ö·c}7ÖÓ±~kë·±~ëϱÞëͱÞëþXïŒõ;îc\bó+ì˜Äû;æ/ØqÅŽMÜ>Öë˜øÂm¸äù&.y>ÃäI¦OÄQ9ñ:uopsö±Š;ó¶ªìgÕ9ÄOOùl«0;Ö¼ÅÙuIÌÔ:{Öj^Tš‹óŠ+q+5My-eÜ/qî‡6Ö'8êÉysÖcÿÂŒ?5%~åÎv÷yóy!ÏèXç=a•·³º«rÕ°ï_í;ããçk¯ö¨?æÎÏ«cHïm«Ù/NŠ%±¨ñVµæ¾àþ‡˜ºVùSMS…ױςì“ĽÖײÖ75$ߪç<Áí¼ ýÈUu!×Î{cbt¬çjÖ˜û+ïDêÙ˜«^ LbU÷«ŽºO)× “Ÿ|—¼¤×ß8⹯³¯VžT®]ל7GÎÄô7HbIÏÄXq¬ü“¹—®AÇÑ7 —ž¾V»7˜XUÍxÍ™}­7wã¾MÌ^/ꕟœwuÆ~öÈŽ¯¾å7vM®a罂~ZÍki’9ÓþJOíá÷º»J›•&™ËœãÒƒwÍ»æ‘8zÃQ é@ß1†ê.L¬JËœÓÊϪ¿Ó³ši³÷­bm8zKyJŽ:ãlf[±¿ºWñŒŠ¿ë©Úõ^àïð†KLŸ{·yǺ¾ÂK?ò;þSœ®Îæ}ÉûˆûÎÏ“NÚO¼GÇ}‘ÜS›JwŸg®u5+Ò#é_¿¿ý }¼¿ÊCù|ú¹?äkqõn8æïÖÞ~€º¥Ç¥1q+Mý÷jg^öš©Þº™GÕ¨ê'ÏU.‡çtu~žÍþZå‹gþƒ9y®ÿþ„¸>·*îgÕfÞÉï¬WUž^Uã^kìËŒñ9α…ù;nú¹¿•ôÐs+Ï­pr(&æÏ}s¦¿ã{Mù› }B¾©QÇ%Gy aßG>ºå?W¹J]¥‘ûP8Þ{„'¼?Vw«ª—¹.ê ÂRy¯!¯3_vÌÝéù†éæ°ÂR¬þ§æoõ¦“?å¬ë*þ*?~ŸLßÿˆ/s”^Î;zæÉ=@þwy+ûy<‹½ø¶½Ðs{í?cõÞw<¯Í ÓË}¬ÿpÔÉs+îù÷å‚g$¶s~U+ŽïØÔÅýãµ,ŸËËÜ+ =ÞJ?ÕXú,,¬Õ,¿AóŒÏýKýæ×î ë÷ÿªîä'Ÿ3įúqÇì7Ä[½©•‡UÏ!×ä§ø+s”Xë“::?r[å;{AæÝ{uñwU<³Þ3nÍë³{œßVø^ãâÛpìÄòø‰Avìû¹WóŸß¬òO®íÕwÒ`•+Åÿ;†Ç/=Å/{DÆÙqì›ÄIÝxß –úñ*çÂ\y²Ê ñü ´áˆ—õ'Œ*¦UÝæß¼5×™O×û)ÎcKlÕHÖ…z熃4ÿäÓäá³Oûÿô*EÌx^Y˪%EŒÅ (>†Q| h >ÁQtðI£8ˆ›q!îÖüÿOXAß £¢³úz¡63U‘‘‘‘YuÎÙü:Öocý>ÖŸcõ±^륱^ë±Þëý±>«õñX_ŒõõXßõ3Ö8/Žõ2v¬×±ã½5ÖÛ8pvÌOÆút¬Ï±ã5Ö“±~ÀcÃã_ÌqÄYqòŒöÏ;˜óP îåžGØ1œyùÞín?±o˜y(çW±ÎûØÊ›93Æ·c}#Nê«^Ÿ†³ŽÄR^<Û1×WܪzCú$qp žý{|ÅþëÌÙSiý&ŽÜ²o”›{VØOqøH¤®4_ùç›çý÷ßîöVõV¯2¶´äÙªÏ`­Cú†üǹ?ÃQ[ïŸk ;óaU³R:T¾ó¼Tky.½¦äù¨7½~®£ö†r¸êsam8óèø÷]Ñ›øqÖ¯p+®Þ£ÎµÒ,½œøµÇˆ[Í“ªç;vŸ§âx¥«÷3ù>ÆÜ æX`'Mr~ð¯òºÏÇH+ÝÕœ¼ªg›rl˜ûqUWæ°ÒÞñªù$ªO½¿’sÇ1‡Ý—š^¯õ}¾Þgª{õþvÃÙónÇŽC Õƒ{TÛŒ#¹fO9­ü¤â~QŸúíÿ—ô:ß2äá=ã1=ÇÔÊgzÃÌŸõH=Ü—Î_XUïº]sùa¥ÏTý í²ÇÉã¾¾î8c‘KÃŽ‘~¬øxºãæ>¯z'{^˜émרï‹ÊsŒ¥ðö8UÝV3ŠX¬ùªö®{ðι»W=(_¸©kÎ(ñÌ9.m+ŸK¿ä¥>I¿ç3Ìw×Ê/É­ÊU9ÞwÞµ{ óg¿üÌ+^fj¦™ë9çŒbÎÙ›Éó†õìó¼«ÙQé)?¥ïŸâìýÊWò@ÖÎñ™Ïênb>3~5ˉKÞ†¸ªÈWwÏës 1ª¹Çóg]•_ÖH=¢óõl¨j" ŸÅÞsÊ+ý“3§ª³æLö°p*^ ³GVžö7CΨ÷p®ýÕ[ŸXÒyf~ù=IæÊ~‡¬¼% é‹«úä›´¡žW}ÙQkäÞó>Tý=Ö­zSÿŠòf yk¥8Wx gŸÊšf¼Žº²† ³‰M¾üÎD÷䆚·{&uH ªºç/ß®ü×pàéþѬLN<Ÿ^UžÕÝEv¹¸^ÙÛy)öŠ71r&KÄPŸÇÊWÌCZj¾äáµIOUŸ©“—ÞH©“ú7}•x>_³·è­œýηòíʳþ^J-³WSƒä*Lïý 3žpbæäÚ=ÁY7õåjn¬¾‡P?J·ÕÛXün8÷dúQuj˜ç ü˜˜ëyêù§Ÿuï{ ¹·ªs“—7Ì}ùó}ËÏŽ%×ÙŽ¹î•ßýî¯æBΔ*Ÿô8s¹Âq-f=T[žÑþ8êɘò+crö±•¯×‡^ªú¤c~£Ñ‹>¯\›û|¬3òƒ´¨ætú“=Ù0×&g…ôÌœ…µê'¯5uð;ÍkÃý®ÿç+3ÿ>1ßî³ÊçÎuS½\ÃÜGÄ÷ºêß+~ÒåjNWoVÅtß*Ï|oJß«y‡x_^}Çâ½¹z?éÎì8pé'÷ßቛ˜Ž§Þ«îªÖÉ[sM¿=m8ß Ä¶ê“ïqÍÚˆ'ÿ<÷GØ9:ëRq †sXݹä¡§žNœŽú· é•o)饯ðt>ùh?÷Þpíû|ó4œëUé›ý–ø~¯úïWÉ•1¼O7œg™pÿVÂH²x^íWËŠÃ(Êú@ÅŠ6âDQPViñ²= ­ÿÿfPTLtuÏ®ç*ÈÓNFEFFfõEÄŒÛw3îg<È2g<Íx‘ñ:ã]ƧŒÏcÆ—Œ¯ß2v?2¦Œ‹Gw¢bëI¼gÏ£`y'sîùŒ Qò¯I.~‡;ðüýÒür×»†9GïC /£Üù& Þû5ÿ¹(<®FÁ¢jAÎÐàûü{ðaÍ—ç¼ëQ¹)'êù6Ú¦¨x¬‘˜ÀÛªš²WÀÿñ1Ú÷°VjM|úà^,y˜Ž\;Õ„ØÎ›˜è¼ÕÂV®ÀU]\jAoQb:žúXÊO}ïüÈMy!yÈá}øôð{Ô³Èá]ô%°͹®¥ûK9Ó®¡öGkEŽz÷£ÆãXbx”“ú¥µ;ˆ»¶;”ŸckÝ3[½¥WtGP+ç¨ûáU¬ûܽ£±«´z‡Î'xs&ÝGÞoö‰<™O O½¥{âVT¢æs¶¼¬š‡þÔ|Þ>ª.Sl÷Žº¨Ô|ÞÇRo÷D«—Cì룘|¯Æ¨˜?£j žì™úŠú¶üäs¬Ôà3ÈÞþ‰~úé§Ÿ~úé§Ÿ~úé§Ÿ~¶Î?"ÔÄ5x^-Ùux×Õð/-u ñZצ‘.5ºCr°*Œ5BéÁ®Ähé )Á!0ÆE¤¥J+péæ:á~|ÿøü·óœó}Ïû¾çý= ‚ ÈI^> ]ÄÖ²ƒ®’&M¼IYšA1Ìfû¹ÀSr¦ ‚7(FušÒýo#™Ç"¾c;§yD®tAŸâÔ¤íˆf< ,c3‰ìåwÉ’>^§ •hF;¢™Äb¶qŒ¤Ë¯òe¨K8]ÁD¾`%»9Á9®ñ€lƒàŠR™0:Íx¾d5[8À‘J¶LAð¨H#:ò1ý‰á æ°–üÈ“ñ1æ_” 5hN7†Ï×$‘Â2e‚×(HyšÑ1Lã+²Š-ìãOÉE¼ÈO9êÓžÄ2›U$sš›¤ÏoB}:3„ Ìa ;ÙÃynóÜÙ‚ !Ôå#zòoæ°žÿp„;¤Ë9x—²Ô¢‘ e,sÙÀ.Žs—4ÿ‚RŒJ´¢ #ù’ù¬çGR¸K†ö¡2-éÁP¦±„mâ2ɤÐÞ¥ gc˜Ã:~âWî’%W¼LQªÑ’Hbˆg%«Hä'Nq'dÎo‘—âÔ¤1]Ì&±„Ds•Çü4/Ú›‚T¡!ù”©Lg›8Ä5ž“3O¦<µiM/b˜Íjör+<á/É*ЈVô!–ñ,`)_³™Ÿ¸ÂS²ÿÓ7RšÆtc8ñ,à;~äîòœo oSš4'’¡Ä³Š#…³Ü!c~9E)êÒÁLa [9Âî’¡@¼H~ÊS“vô#†Ö±—³Ü$cA½—‚T¤1]NËÙÈn~à8×xNžBÎF]ÚIâH` ?r’›<#Oa¹AeêÓ–HFÏ26³‹“\å99Šˆ!©N+º2˜q|Åjvs’‹ÜàYß7_BcÂèD41Œg ›ÙÇ9J΢AÊÔ¦9]éI,ÓYF"ÉâÉU,ŠJsº0œV“Ä R¸EPÜý‘ЖNŒdsù†]á"÷ÉTÂlHaªÐ–hb™Éb¶‘D HWR~QˆJÔ¢3€ñÌg+G8Í]Ò– ‚w(KujÒ€OÂçÌa Iå*7Iå¥ÒòªÒ„Žôfø’Mä$¿ó'¹Êˆ!4¤éËh¾d9›9Èï¤++ï(DijÒŠn a:sYÁöq‰T2–Só£ MéÆgÄ1Ÿíœàµ¼5¼MA*Ò˜ôd8ñ¬&™SÜ%/S˜PZA±|Åb9ÄE‚9ŸÒÔ£#ƒÉt–ó=‡ù'd±%©KQ bÊR›D2”É,%‘C\åÒ×ÕyŸPÚÑQÌd-{Há6÷ÉTO\y—bÔ -ô#ŽV‘Èa®‘®¾u¼G)êÑœOÆ4¾!™ã¤pì |ÕhIÝÁ4–±ƒÃ\âiêK”¦2Mø˜Œå+V“ÌQÎsGähä ¡!]ÂD¾bkIæWî‘­±3R‘&t¢/ã˜Å&r™<%GµGêFú3™¥lã÷ÈÚÔ»GiÒœp1•Ùlbû¹À=²}(—©F{¢H³XÏ6ŽqžÇ¤mfÞ¤µøöôe‹ÙÎ1n“©¹÷м”£& #’^Œb*óYÊ’9ÉMÒ´0ŸQ˜PZÑ…^ôe4ñ¬d;Gù§älioªÐ˜öô`“ù’lã(ÿåOr´’“¼I *S—ôcñ¬`ǸNÐZ­S€2„ÒˆÎôf,sYÇnRø/iÂà5ŠP–tg8ñ,c;ǹJš6òŸ×)F%šÒ‰>Ä0ƒ•$r ülmÕ6ŨI½Â4f³‘8Çž‘;\,)C}ÚÓ‹âYA2G¹Æs^ŒðVR‹D1Žy¬e§¹Ácr¶3Bu>¤+C™ÂbÙÇY‘»½xBmÂèÉh¦³‚uüÀIns‡LìG~ÊÒ€pú3%l`+G9Ï2ttǼCYêÉ@&2“eì`7g¸Oú¬¡E©I¢Å<¶r‚[düØýR’:´¦ØÎJ’Há>é?q.JR“p¢™ÀÖ³—3Ü"m'uEQjÓŽ.ô$–é¬á'Îs‘ ³=(LyêÑÞLd‰ì`?sƒ‡d‹ôŽQ‚J´¡?1|A_³“\ã.é»ÈW P…†tfSXÎŽsT²tõ÷T¦)øŒQÄ‘Àrvr€Kös…´ÑÎÉ˼A~ÊS›6D1‚6’ÄI~ãA{óåhJgF25ìdçxHúrž|„Иpz2”ÉÌe[8ÄnòœìíGUhM3™,b+ǸÊ3² ²Ž’„F{úÇ<¶qˆóÜ'í§bó·"Ô Q b,sÙÀ^Îr‹à3ç$Å©M8]‰e+ÙÅI.’JžÁî‘J´¤Ÿ3›•ìà87I?D¥•©EÑÄ2‹MüÄ%n’q¨ØS”j|DoÆ0Ålá(×È4L_§Òƒa$°‚dÎrƒ`¸óSˆˆb$3YO'¸IúfÊPžÆD0€±Ìa#G¸Aº‘æŠRƒ0z2–9¬'™#üN*¹bôsŠQ‡Žôg4 ¬"‰œåÙFéå„ЄÎô!Ž…,e;Ç9Ï}²ŽöÛ€âT¥9]èOóYÅ~åébÅ‹w(O#ZÉP&3ƒÕlãçyHú‹E¨DcÚÍXf±ŠíìåIÞ—Ô"‚®Œd&sYÍ·ìç É!”V|DƲˆDŽqƒ§d‹×Ó)E(-éÂ`Æ0‹õ$s‚ëüIºér‘w¡QŒfë8Â%þTD0x^íÕûwÏuÀñ÷œb«TB÷ë!GI™ 5§Ô1gèµQÇåÔ\Ž24§'vBÑ1´²¡\›fÌ=ÙÜbŽ\ʽ¹¤ •R-JêñCÿDç|žç<~üœïù¾ß¯Ïëóׇ!ÔBcÚ‘ÊÆ‘Í"J8À ª¸Äµ9!4à1ºò2CÎT øœÍ§Š¿‰É ázî£5]èÃf°œ Nð3WÍ¡My‚gI#L²˜Å<Ö±‰#ü@™!ÜJcéJ_†3‘¼N YÏ.r¸¹!Ô§ OÒ‰^ cù¬ Œ}œåOêÌó;cg¨Qd—Ñ'™Ä¦’Ïj*ØÍqª‰[ê^iEºó™d1—%”ó5UüÅMËì'éÆ@2É¥˜-ìå;.Sì>¸‡x’éA:o3“U|A%¿Rk¹¹¡%y‘Œa2sYË.*ùØ!ÜÉ£´§'CGKYÅvös’jbW†p-èHéŒa Yɾâ{®Z垈§=½È(²™O1[8Ä9γ:„Ûx˜ŽôeSYÀr¶QI5±kìhâiO/óïËÊØÉ).Ps­=AsÚОçÂ[Le‹)a3ßð#1Ÿy–ûiEgz3‘LaÅlà+ÎPc¹ç¥/ñ&ÓX@!å|I%¿Pãsï9 I ™>d0‰\Š)ãç¨UbvIà)º0€‘¼Ë,f³–=Tq…:ëí!ÚÒ•> &“l>¡”}œæêlp4'‰çèÏÆ‘E¬£‚cœ¢ŠPê»É4â1ž%ÑL&elfßs…ú MI¢+ýË|J){8Èi.S»Ìs´¤3i åm²)`;¨äWâÊ) $Ó“t2ÏG,a9ÇOÔÜäMSÚ’B:ãɧRvs–ˆÛì¿Ñ˜DRÊ;Ìd>+ˆŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠúö/÷`x^íÁA 0±{£s^°Ž%m_µð±¿töx^]ÙÓ†Ð4v[m›mÛ¶m7¶mÛ¶mÛvîdîK»ÎËÞëöœX>Àÿ/p€þå_þëø'þ‚¿âoø;~ƒßâwø=þ€?âOø3¾ƒïâ{ø>~€âGø1~‚Ÿâgø9~_âWø5Þƒ÷â}x?>€âCø0>‚âcø8>OâSø4>ƒÏâsø<¾€/âKø2¾‚¯âkø:¾oâ[ø6î‹ûáþxˆáÁxЇááx‰GáÑx þÅãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðnüˆáÀ8Šƒáà8‰CáÐ8 ‹Ãá?qxGÄ‘pdGÅÑptÇıplÇÅñp|üN€âD81N‚“âd89NSâT85NƒÓât8=΀3âL83΂³âl8;Îsâ\87΃óâ|8?.€ âB¸0þÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Áü¯â@80‚ƒâ`88CâP84ƒÃâpøOGÀq$GÁQq4ÇÀ1q,ÇÁqq<ÿ…à„8NŒ“à¤8NŽSà”8NÓà´8N3àŒ8ÎŒ³à¬8ÎŽsàœ8Îóà¼8Î à‚¸.ŒÿÆEpQ\ Ç%pI\ —ÆepY\—ÇpE\ WÆUpU\ WÇ5pM\ ׯup]\×Ç pCÜ7ÆMpSÜ 7Ç-pKÜ ·Æmp[Ü·ÇpGÜ wÆ]pWÜ wÇ=pOÜ ÷Æ}p_Ü÷Çð@<ÆCðP< Ç#ðH< Æcð?x,‡Çã x"ž„'ã)x*ž†§ãx&ž…gã9x.ž‡çãx!^„ã%x)^†—ãx%^…Wã5x-^‡×ã x#Þ„7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãø$>…Oã3ø,>‡Ïã ø"¾„/ã+ø*¾†¯ãø&¾…oã;ø.¾‡ïãø!~„ã'ø)~†Ÿãø%~…_ã7ø-~‡ßãø#þ„?ã/ø+þ†¿ãø'þ…¸ÿü×q ÁAq0‡À!q(‡Áaq8ü'þÿöïþoGÄ‘pdGÅÑptÇıplÇÅñp|üN€âD81N‚“âd89NSâT85NƒÓât8=΀3âL83΂³âl8;Îsâ\87΃óâ|8?.€ âB¸0þÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀñ <ÁCñ0<À#ñ(<Áÿà±x'à‰xžŒ§à©xžŽgà™xžçà¹xžà…x^Œ—à¥x^ŽWà•x^×àµx^7àxÞŒ·à­xÞŽwàxÞ÷à½xÞàƒø>Œà£ø>ŽOà“ø>Ïà³ø>/à‹ø¾Œ¯à«ø¾Žoà›ø¾ïà»ø¾à‡ø~ŒŸà§ø~Ž_à—ø~ßà·ø~?àøþŒ¿à¯øþŽàŸøþ=øÿí?p@ÆApP Ç!pH ‡ÆapXÿ‰Ãã8"Ž„#ã(8*ކ£ã8&Ž…cã88.އãã¿pœ'‰qœ'ÃÉq œ§Â©qœ§Ãéqœg™qœgÃÙqœç¹qœçÃùq\Â…ñ߸.Š‹áâ¸.‰KáÒ¸ .‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®‹ëáú¸nˆáƸ nŠ›áæ¸n‰[áÖ¸ n‹Ûáö¸îˆ;áθ áî¸î‰{áÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx þÅãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?Äðcü?ÅÏðsü¿Ä¯ðkü¿Åïð{üÄŸðgüÅßðwüÿÄ¿ðïÿÿ8xPPx^]ÚC´†ÐÛ¶mÛ¶mÛ¶m›mÒÆjcÛ6Ú¤6NÛô¿þsr’;‹™¹ÛÙÌb&j@@Àú(AcîÿJÔ¯<ϳñ4<ÏÀ3ñ8<OÀñ$<OÁSq?ÜÀñ <ÁCñ0<À#ñ(<Ácq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q<'À q"œ'ÁIq2œ§À)q*œ§Áiq:œgÀq&œgÁYq6œçÀ9q.œçÁyq>œÀq!\ÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuñ¼€o=/À ñ"¼/ÁKñwø{¼ /Ç?àñ ¼¯Â«ñ¼¯Ãëñ¼oÂ?áŸñf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ð/øW|ßÁ¿áßñ]|ßÇðCü?ÆOðSü ?Ç/ðKü ÿÿįñü¿ÃïñüÂá¿ñ?ø3ò­ƒà 8ŽCà8Ãà°8#àˆ8ŽŒË×ŽŠ£áè8މcáØ8ŽûÅÿ1 HÈoÃÁq‡Â¡q‡ÃáqG‘qGÃÑq DZqÇÃñqœ'‰qœ'ÃÉq œ§Â©qœ§Ãéqœg™qœgÃÙqœç¹qœçÃùq\Â…q\ÃÅq \—Â¥q\—Ãåq\W•q\WÃÕq \×µq\×ÃõqÜ7ÂqÜ7ÃÍq Üò‹ÿ¿oó׊ƒáà8‰CáÐ8 ‹Ãáð8Žˆ#áÈ8p,_;°ÿÚÑptÇıplÇÅñp|œ'ĉpbœ'ÅÉprœ§Ä©pjœ§ÅépzœgÄ™pfœgÅÙpvœçĹpnœçÅùp~\Ä…pa\ÅÅpq\—Ä¥pi\—Ååpy\WÄ•pe\WÅÕpu\×ĵpm\×Åõp}Ü7ÄpcÜ7ÅÍpsÜ·Ä­pkÜ·Åíp{ÜwÄpgÜwÅÝpwÜ÷ĽpoÜ÷Åýp<ăð`<ÅÃðp<Ä£ðh<Åãðx<OÄ“ðd<OÅÓðt<Ïijðl<Ïýâÿ$ø·Šƒáà8‰CáÐ8 ‹Ãáð8Žˆ#áÈ8 ŽŠ£áè8މcáØ8Ž‹ãáø8NˆáÄ8 NŠ“áä8N‰SáÔ8 N‹Óáô8Έ3áÌ8 Ί³áì8ΉsáÜ8΋óáü¸.ˆ á¸.Š‹áâ¸.‰KáÒ¸ .‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®‹ëáú¸nˆáƸ nŠ›áæ¸n‰[áÖ¸ n‹Ûáö¸îˆ;áθ áî¸î‰{áÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx ‹Çáñxžˆ'áÉx žŠ§áéxž‰gáÙxž‹çáùx^ˆáÅx ^Š¿Ãßãex9þÿˆWà•x^×àµx^7àxþ ÿŒ7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãø$>…Oã3ø,>‡Ïã ø"¾„/ã+ø*¾†¯ãø&¾…Á¿âÛøþ ÿŽïâ{ø>~€âGø1~‚Ÿâgø9~_âWøü'~ßà·ø~?àøþ ÿÿÁŸqàAåkÁAq0‡À!q(‡Áaq8GÀq$GÁQq4ÇÀ1q,ÇÁqq<'À q"œ'ÁIq2œ§À)q*œ§Áiq:œgÀq&œgÁYq6œçÀ9q.œçÁyq>œÀq!\ÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀñ <ÁCñ0<À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñwø{¼ /Ç?àñ ¼¯Â«ñ¼¯Ãëñ¼oÂ?áŸñf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ð/øW|ßÁ¿áßñ]|ßÇðCü?ÆOðSü ?Ç/ðKü ÿÿįñü¿ÃïñüÂá¿ñ?ø3| üú¹‹x^í×E°—eÀáÿ½tÃ¥;”APRQJ:•TQBIéF°Pº»»»»»»»ÛÑ•<{wßosæY93ïæ…B³„…þ)}äP(â?N‡ÓâT85Nƒ“âd89NSâ88.އãã8'ĉpbœ?‰ôºŸâgø9~_âW8Äþ0Ž#áÈ8 ŽŠ£áè8މcáØx÷íÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?ÄðcÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀ?ãxþÿŠÿã?ð`ü'þ ÁCñ0<À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñ2¼¯À+ñ*¼¯Ákñ:¼oÀñ&¼oÁ[ñ6¼ïÀ;ñ.¼Ÿ ݧði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?Äðcü?ÅÏðsü¿Ä¯pˆ÷†Ãq$GÁQq4ÇÀ1q,ÇÁqq<'À8!N„ã$8)N†“ã8%N…Sã48-N‡Óã ø ü&Έ3áÌ8 ~ gÅÙpvœçĹpnœçÅùðÛ8?.€ âwp!\¿‹‹à¢ø=ü>.†‹ã¸$.…Kãpü!þ—Åãrøü).+àŠ¸®Œ?ÃUpU\ WÇ5pM\ ׯup]\×ÇŸã/pÜ7Âq܉¿Â_ãføü-nŽ[à–¸þ·Æßãpü#n‹Ûáö¸îˆ;áŸð°°×=À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñ2¼¯À+ñ*¼¯Ákñ:¼oÀñ&¼oÁ[ñ6¼ïÀ;ñ.¼ïÁ{ñ>¼Àñ!|ÁGñ1|ŸÀ'ñ)|ŸÁgñ9|_Àñ%|_ÁWñ5|ßÀ7ñ-|ßÁwñ=|?Àñ#ü?ÁOñ3ü¿À/ñ+â†Ãq$GÁQq4ÇÀ1q,ÇÁqq<'À8!N„ã$8)N†“ã8%N…Sã48-N‡Óã ø ü&Έ3áÌ8 ~ gÅÙpvœçĹpnœçÅùðÛ8?.€ âwp!\¿‹‹à¢ø=ü>.†‹ã¸$.…Kãpü!þ—Åãrøü).+àŠ¸®Œ?ÃUpU\ WÇ5pM\ ׯup]\×ÇŸã/pÜ7Âq܉¿Â_ãføü-nŽ[à–¸þ·Æßãpü#n‹Ûáö¸îˆ;áŸpgÜwÅÝpwÜ÷ĽpoÜ÷Åýp<ÿŒâAøü+þ ÿŽÿÀƒñŸø/<ÅÃðp<Ä£ðh<Åãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|"üßô?÷7ùoùSeurat/tests/testdata/visium_hd/binned_outputs/square_008um/0000755000176200001440000000000014731050553023755 5ustar liggesusersSeurat/tests/testdata/visium_hd/binned_outputs/square_008um/spatial/0000755000176200001440000000000014731050553025412 5ustar liggesusersSeurat/tests/testdata/visium_hd/binned_outputs/square_008um/spatial/scalefactors_json.json0000755000176200001440000000045114731050553032012 0ustar liggesusers{ "spot_diameter_fullres": 29.22254153479092, "bin_size_um": 8.0, "microns_per_pixel": 0.27376126715315274, "regist_target_img_scalef": 0.25404352, "tissue_lowres_scalef": 0.025404353, "fiducial_diameter_fullres": 1205.4298383101254, "tissue_hires_scalef": 0.25404352 }Seurat/tests/testdata/visium_hd/binned_outputs/square_008um/spatial/tissue_lowres_image.png0000755000176200001440000000254214731050553032177 0ustar liggesusers‰PNG  IHDRX.cv)IDATxœíÁ  ÷OmÀ³ršl ]>IEND®B`‚Seurat/tests/testdata/visium_hd/binned_outputs/square_008um/spatial/tissue_positions.parquet0000644000176200001440000051004314731050553032443 0ustar liggesusersPAR1€´ ´ÍL€N€Ú0ACGCCTGAC GCT-1$TACCGATCCAT ³Î šGlCCF TA!5GTTCA ,A!BrAT ,C)2GTGñT š!*G²A) ,T#%#„ B«!TGTCAG1ŒTA¬AG à14CT!!%j nšÊ!RT1J)·CC!_ô „!4GGm BG%£šGA!© ,%‹›A>„TGpCA ,ACI>CG%= Aì)AY~A£E—!– „ê!/%4Uh!Y!"™T1ÁATT ‹TUAŠðCAžT š!ÄA­A¨Aš!üm¡ XAA™u!–a/!!K BAAGa/!“ nA"A ACU÷ ,A)VA<5ΛA5B"Ì a<%5ÅÉQì!á£!Xaò!qDÅEnµÂARaÅ!º!© Báµ!ô!A eìTIi ,ņTÑ0¡åaAÌ BAdA4AAÄ ï!†A‡µ>)ö!DX!¬¨!øA˜ BA áJ/ ¡$A¦aú Ivz I ÜA¨¥á,! ázq²¥¨Aõ¦aÞx¡EA= B.Aä€ .(!W!Þ¡1¢Áá´a ` B!!KÙ=%]‘x!€a²ÁpÁÍ B¡jU!z/ e§ABa=e†ä GÕ\?åᬰçŠE XAˆü a Uh¡ãT‰‘ a+!‹!”Ùö!€!5Ja: X!Æa˜ F : ¡Nò¡ ê!oÁX}È!¥X! Æ%óô¶ „Á-%eXa‰‹ aÚÁÇ!¦!Á „e]!ÁUÖA÷Ù*AÅ ,aÁ! AAG ] ¡gA € Á“î A9`Es!£ šArp¡Ô… B!UÁÞj8 …,ß á¯5䤑ð!; ,!wa!µ"l%úáAöURÁUeß!¥1úØ‘7„ X­ˆeý¼%_á~ ,!Xa2ùa6 eU}Aq"ZÓ :%· ,ÅÜIW°% •aO-¢eëAV‘ A]eq»µÂ-­I! šAå!8a¹ !aÌAð g‡!wAñ a¼e !£".%eÌ¡;µ(a8iÞ‘æ!àö©‚ nØ\ÁÎ n!0A{A'A ôžw¤ âE E'X!Ÿ…µ   ,eÀ•aúqZº¼ …£ š…·a_AG Ü-ãAá ,̾Á!¿ n=¬!»¡t ¡úAú%#ùd!ðåx„eÉ!:[-ŒaSˆ!öA( XP!Ê*P !àaÛ—Y+!s#!Ä ,E%#!fn%µáaÜAqY!áÜ¡:áxµØaVÁš…¤"Œ Ž!`!O „AÓà%Ó,Á+ŠIׄa‰aL-€%¼Emup…ŸA" ! ò!Õò…,—¡QUìA2 ha QÖáEìaù"çʼnÏ -`¥EæAžUªoy áÛ5úE!¤!¶"4 €!³XU”!›¡¼“TAv!X–!@1`gaJ QÀ!°aL ,EÔ! ˜&„ "á¡Ex¨Éyôeìÿ¡'QÖ-%ztÆA0%Z‰~ °)!æZq²!àa†¥09¢Ç!ÝžX…ú¡lé±j€ka]"š !Á¬ñÕˆ–=0 ,^f!ÿˆ-4!½ !¼Õˆár!äa]q ,EÞ!Áò!+ ´à5ŒœAeaÝ5:O ^ Xèa!x XAÅ Aœ !sFÎa_ =eO  Ie¡q.bô.à ,AE¼ëyZ” laÏq²!œA»¢•xe¡QKu.Aù,Uh!u!£uáþ!¢a™æçáRA°)[a·AyDÅ…ý-á-’„!¤ò!‰ )B élòAD¡^1ä!²Ù Ù¡R Jqpa8aóaCa „½RAð*ª %ι-Ρ|!ËAø B!Ye°"–A_ÞŒ ,a*A’ßòa0!c®EGAìm»‰o"HÑ ÊoÁý Xá ¡Å!Haâ S å "Ú!FM'Á °“ ao?"VåaÀAó!cXé 2XŽÏAéß ,A†e£UÀaU%8C9äªAçA­ B2I!¶1¢k ‡!0r nAwA@"Œ AË1¡¹aãUh!°©Ö!$š!„EÀ ÷ n‡ …2e7Xå A…Š-¢á"©šåQªjAçmŽ,ã ¡©µ °.LAhP „Ae!wÁ· !X5Œ"¢ö “A.!a ,Ay!èA= !GÅ Üa-!GEÆ5ú !M¡ž!• B² bepõ¦…6Ì=`f!LD1äaYæ/ X!Äá ¡ÆA ¬!!;AÈ @ ¡›T1`Ü©! Ë ,¡¥ ƒ•æÅ0 a76¡`%Ë!1và&Öˆº ,%k!‰!û& ®PÁq š¡4!F­¡—°…!Š !,ásA"!U a yœ‘!Ya ,…Š%Du!k-a3uÈaÁÁ¡G !% -¡~!7P!"še¡“¡í °a.á6!2 ,AŠ¡ý!€ YAÔi·X!­A¨ =JÙhæ9úÒmÑ náD!Gj¡™ n¥ !Á•La¨¡ AÄ!h ,A AP! að¡jÁÒ!Ú e­) ÐMaìÆE#"| e!C¡á"ðE{ !½µ)Z~aÇ•üaËŒ1¢»EÄ- šaV£\u EA¡"` ¥dáÏå"1`ð P•"Î AŸA ¹Y~á¡ÖÅ,A!ó£ Æ‹AAh"â aè T8 °sÁqÉöòA]ˆv"¦EïÇ•¤¥ê!º!bõ8!JaD¡÷,BÁ÷E®"…Ð=E‚ÜaÖAf| "6š€!‘რơ^!¢XA¦a›Ahw ,ÁÙ!!x!¥ ¡·Ž!Îû !™a-!¼a1 AËEa L°¶Eò+j6"¤EyA&%½QÖ·ÜÁ¡õ n>!vM! ¥ì!IóÑ´!†ÇURÁ}%è-‘ B‰¡ÃLá$ F}ü5Îaì)!¡AÞ ,-ÁFŠ M At jÕ )3‘ÐA¥!IaI ,á¦!ò!&9Œ¡¬'AU¹ ,¥ga…—"¶a'Ãgñþj!š+!N BA !¸. á|A» × ¥‚!Ayz ! ,—C F áNÁ5aŒupc!--,š![A‰ B%äÐ"ü Ê A=U?a %ÿ"aÿe.¶,TEÕ a1`ÒE,¡š !qoX F °!\ZAœáh »!‡!h!ð !Ý[ÞU!´aômI,RábI B¡ Ù>*| ÁV!7A*`Aºa‰  B ¡Ü%úÕFm!aA+ ,å‹…Ky!va²™¤á]!Èe qœ6!d¡¡n X%ZA!½"Ü %cá("œa¿Á®!° Bf!áþ!z ég!Ó> !µWA™™x'Aû5õ¼!!ÆeŠÜý!þ+!Ò X!1‘-¢ ¡aW!× ,¨ap!“A2 AK] AA A ©#ÅXó‚!Ñ&Äa>!÷AòyôÁÝÁo¥Ñ´|õ .²A6Ø„åæ~eä Æ%÷b"öà rAgš Af!‰.†AuÁžY nâ ?µ2¾ !z¡•!)IèZ† !\!{5äòa²¾ B!ŠA¯ša²ÁÚa¶a³ , A~¡ˆ ÁÔÁ­Al- fAÏAn"¸ Å ARaø! ,)Z!†EE-ç%ž¡QU”“AD B![A!šY¢aP BfùÁ…U<çáµ(×A¸py!(aVpqô%-)UÀA0}naL „r E­aÛ•6™Á²!ü&~¬f"Ê¡!½ XaaG !£ …aÌX‘.áeaâ ,)oÁÎç-vÈfá¡F ,E¦ÁäQÕàø Áå &äxa`A,UÀ±c  ,¥¤e-‘t i’ê‡ä AI%vÅ^ á![òA1ä %š Ù=œÝ ÜEª!m"¸¡ Å-¡î"öPAME§õ¦a“QI"R Ó÷a&f!U!áÁ^"L%a8Aé;½îíH¬!Ò °%±åf¿Ü²µ Ao14!! AÞAÅ B¡w!:"ì9RA; ,É æ %&u²…u¡–¡“uœ2A~!* BxàCá' §a\a´* Uaƒ9J˜­á1úA *áÏy!I®%æ „!ž_DZ „A ˜ a!5¢Árá‘mAC ,!—$!öÁ¼ pëˆA  §¡­EE1Œ!!r¸| ,60!x5`e/%§±>!ñ¡Óas¡´ BÁ‡¡þ !F}c"E£¡Ñ¡²uœAéAªas` B› ¤!¶.^A!!Eá ,Á„A&%1".$A”!ŸÁþáU ,Aäƒ Á` …ÁEá®1価 µ š![,©B,AìÏ AYÏ XæAdalÁ9 ÁÙÁáFn%œ¡…Á’1¸ÁE&!šA¼ý¼c!¤ÁÇ5`AR¬aç „!È!±mÑ\Ɉ!Â"˜a1"„,Ü¡¼Ag XAF!ÁÆa! á"EÉ„ %È”! &®“¡|¡î"À!?aÇo XÁAԹؓá«A("R Ö Áµ¡, Ba&A¼!7¨ !]!š-"ð¥x[`.eʦ !¾BáœpAÑàARÞŽAð ,E”©!$upA#A&a¡A® ,!89! ¿%F)Ò ,°tYRÁ¬e†QÀ, ’a`a X¡ý!ú¥'"zÃ…t¡Þ5ÎáXAA”á­ Be–À¸Õ0!ö¡¿=ú)̉"¸!,|A® XA\¨!GA‡ òA¾ž!ª ¡…f"¼¬A½…euÁ•5 ¡! BA#Af!; Ð_apÁ: ¡QÃ"Æ AdAÚ‰Ô ,!¯Aw%Ë"$ saA!”aæ ,aR!û)¦"¸ %ÏM,&Ü !)/ óuÈ%2!.…9 °!òaY"ú"¡wjy†s A' .Œ ¡«+» °!õ½Š … ò!=•ÐaN!ˆ´!? BÁ=Q!÷5 AäáÊ!_ò!—a²!ì!a ,%€¡-v@AÒa³ˆ , á”!”a …p!ÎAmyô¡QÅ5· ÑEK!."° U!ˆÁÝá. X!T BÛ"*õ)FµÂAªÕA¦f BïnE*&î’hÁ†* af!¹Eà-J?ç A™áR n"A!® AQÅa†‡¡x!\%– a&aFa&ÎÉá-' ,ÁSeG!zUÖ…óç¡Çu.aíàÁ¡f B!ø$Ið´ °ANa  A· e™ VôaÌÕö%2A>EEq† S1!« „Xa2aä AÐQíÿ-4eÕËk°máåA…°† -¦%“Xî!!³ a½ï"Š AGF £ ,Aá¢!½¡, ¡w!7¡š î%xÆEâa[ãÕÊŽ!\ß B¡Aþ ]”8dÁZ&, AAy…ï °!TážT : X­¡'!ÒAl ade@!#uÞÅ©…a7"el(S"ºAäÜ>¥ Xa;ªÙ""¦!¼aŠ! ,X!/aÚÁ& !,)µ¡u† Æš Üú?) B!ƨ  Xበaˆ¡4 ,ÿ°AÚ!Q !—AÂ!ÁÆ!A¬X!0‹ Aîq!k>Åqpîê!&| a@A`Åy.!i( š!ÙAªÌ »I’M-aöAÒy ,!Á¯¡×™xAÒá¡'n„˜5Œ!ƒá½Á^Aô X¡¤oa3a ¡SÍ]—!Ée/!!5 . °8 á A+¹TA[áA‚ næ>$¡4 n¡!Õ¡G AsAVÁÞ™æ¤eH¹5¸a„-F!¢-v ûÑ Xœ%žVuZ°aÈ!ºò…AÁá ú šÅ•Á ""@Áë`AÉnÅœ«AB”a3AFu.ÁôCùdA{±k•ºÁka^‹".$!«/J „ a@Áú „ï 1vZ ,¾ UÞ ÆnEÚ¢"< ¡Í;!7a BÁÇAl?ô Æ;%NÆu¾A¼aM ,!ËTåd5,!³!2AH ,Ä„¡]&¡IÝ " E ¥"¶:)EAk1Œ®¡­Ë n¡f…PÇ.&A)aÚAÕ ÆÁ©»‘a BENÁ¹¡s"ðiô‘aš AÒᣠB!FAaÊ"š!4EME˜BAžÖÅ·&t )aA˜qÈTQÖù¼B´Á\A[ „xa<Ê&Ì ¡Ñq ï"î¡ ‰LA[Q~AãAœ!= XîaH!ÿE AÊåv!cuw !ßAd ,… !©& A ­AEURk JuZ!v!¢ XAÊ%!¢ùè†%]á, E5: ¥Çª :¡B!v Xa{ÁYAÆšA5†ï™æ‘enQª9¡7aßQ XÅ­o!O"º§E+ Þ ,€ A»!é"b!r|A×a2 ,ÝÁaѱj2 i^!wñd¥©AE$ÑöA}jAÿÙ´…%¢!бjƒ !Ÿ!NYR!4àç&ð¡uÁÌ!bnáôa2ã ÆAü ž%i-A”!JAha£ ,¨!ã½ÙžUáae "ê ¡‘¡ Ñ B!ä*Aî"ÚA¡náU ,aal !A~¶qD%±%Ùˆa½> pµj!¸!oIEX!öA"®UÀ!ö!‹a2› „A¦!`iù1ú%áºáî"` A¼ÁɈ!w BeÅ; A§•æ!·%KaW"š La4” B!I%Î)&ø E|!PáUh!Œ A'&, I!!Î ÜØ!3A…Yh!,!÷Aÿyœ)‰¡ÓaÇyôd~H °aN!¸» A ÆV!Ô "®F |%¡"ÖBA@ Bœa”Áx!' !v\-"^@Á¾â: Ë ,áJ%dÙý!²µÂA‰a,ß Bq!c!¢0 .Ü¡„Ea\ap&ü¡¡V^9¸E•Ra`QÀaa~nu !M…ê"Ì Æ=!¡A¯ š%³ô%üqD–-Ar1Î!™‰QÞ B'ûÅQ<áåe3&@A§¥KÝ!3AÑácQ&AŽK½ n!ËÁmÅcš@ ¥f.B<aæ• Eá!Ý?"$ Õ! °-Χ!{á#Õà- „¡à£ šP¡{AV¡ A-’ 1¸* ae›"–ÅÉa•MS B!0©!{Õ©ý_!w1v… …Mâ"¨ IS!^¡Â Üú!ž!ã´ n’a[FŒ aô…yYh!BLá"€¡¶i!eÖap¡Ùeù¦$A=Añ¼Äu å "âš!þáªA[ šß !ŸuÞaef%e5¡»!d 31æÆ!3¡/ XaI<  %D!e_9ÎÍÛav"å£Í‰•Ð… aa!Ž X!ÁT!ˆè AÒBð raÁ¡<X¡AÈ¢ ,!1áhÙ,+!’CÑ´Ì!wß4 ,N±q!q ¡À‘6Aa.ÁMAï BA}AŽ!¡!æ¡JaÑž!rYa[a‰ ,é\´!1¸©€%E ,Å©a„ÇyZסաÃ"€¥„aW&ê+)w!ÍÊ-4!±)õxòAªaL „ç!cA At !î!FL!è Ÿ!šÙ 0 aUoɘAF?á™uôyê !Î"/2%3¡C9`˜.7Ü%io „aamAz¡¡¤ar!u5¸ae­`ÕžaÙ!dE²"Jƒ«a$ XE£¬..Ø1`,šAÅ ,Aa-a ¼ INjü Aó¡îá ,¡a²aÈa$ IHM°Uªj !n °QÖŽ¿? B!?j !1"Va²Œ9ú¡jA8^aè Bÿaîª h ¾AØ. ÁV!! Æ!eV™ŽA]A!«•ºX A8r! nAÁ‚Ÿ A ï ì o AÓeœac"ê AäÜj8 ,%ÜC!¦5ä,aY.ˆAN…•s B>.!<à !eÈA+5…1Ejø AJí !a"H Ùa™¸!£ Xð!þA=ƒ Á€!nAª!ÜÁÜ!• ,Areݨ !vA&!A× ,¡%!´` "¬AAU ,¡r-~ BŽõ ,ªAÂ0 QÀ¯–¡…2 ,aÀja³Õ´¡ !rűµåNa‡ÁY"„ aڈ᩠X¢%§)f -øÉK‚¡;AW!‘ ,A¢e@É" ÁSaƒ!žá‚ ,eašã1!ÜAΗ5`!÷YaÍ BÃÅŰ,!¸u%¼¹T-6!ÿ Ba¼!!Í!@ Ar™5J!ÎAΡ ,AŠ¥}‹ 9 -!!¦ ,!aZ¡}a A¹EB1úŽA'%h"îaV±Á[9vAdo° X%kE"A×*¢ !Aýv „!)Î!u†¥aØ­ X Ô !’‚ëA»!’ ,¡ á °¦ ÁÄeWbUR!Úä£ ,!VE=V*,h¡h[ XÀ eaH™6åOEÜÝ Æ­!‰¡RÆ¡2!C%Ò"~¤aÛ!z¡Ç š¡!Aa¥ "t Å …q! Ü!Œ¡EÈ"Ì (y»¡á Xa»¼ ÜeÄ)§ ò%à×?ÙF麬A B¡¶A@Á_a1 ea\%•1ÎD!¥¡%" ,ÁÁ¬ !i A %ÉAÛ"âA´¥79J…0™a`1¸ !Ðc X| !ÊK X“!ÁÒ áœ!Ï"d‡ e®aZ5A\¥Ta3"(!š%~5!±áAîa‹np@!øuôC¿!]"àA¤s=JB!xõè­ ¥’aY"R „!¤ùUÀ¡%ráP, ¥…aÉ‘L¡(!àP !5 Æ!Ge/¡V,!ø† a°"A½!ò%÷YìÁµEOa¢‘baNA@d!< n©»!ê±î%ªÁ°!û ,¡TEzÁ‡ò!0¥Å"˜)AMA»AháC BA9x AÕ!³:!e^t.: È% °î A,N ,!Âfáß !ÊA+ÿ A#%öšòe[a!uÁà!`ˆ B¥yáø8 ‘æºe¡ð5`eQ(¡+%¸È y&°!ù!`A«"H AsÁ·EUµÂ…aÞ &¸ `¬a"‘¤éDÖ ¤¡€¡D Üa×…Ñ "v !V¡/"ðÁ¥iD‘6añc !¸"<¡(aÀ ˆ n!]X!"ì Pe„"h#CÏ A•AA Beÿán"ÄÁ¯ CaX™x!V!Ha̱(aôAŒ¡F X!Œ!3¡lµ(òáa†D ,Ár"t !>AÎA˜!,ðaF AÌ'A(šPÔaßAt ,A·!0»W nÁö…͵–š!¸ ,©j…‹\-úAàv ) qpA3¹kUh……A§AA°Ì A|–n»!ú!ï-!eø Ë eIÍ1!ƒ_ n õNZGaù nªô%JÑàÙAaõ"®{%\Ë&á›k÷¡:|‰XAŸô˜qZAK!,-¡ šeôá•a^"¾ ¾a­) ,TåNaup!a!úA˜ ,!È<FµîAMQPA— ,AŒ-eEuÞa™%a7õ8!Îq²BÓaå¡+M<LÐ!4Á ,UAÐ%uU&mHA B‰ I%Êqá'5v%l%ÎbQªI¸%æ „AªE¦[ šEŸEd¶QhÕáØÜ!kaö%H°!ÊÅ¢ ³ X±Aå¡´œ nA\ådaøÕ0dâ,!" , •að« œ>…ùÙ¨áËÁ "lEhjá§UÀ!AVE±¹¬A]à®ÙžÁoA IõÒÁØ!‹!ˆŽ š!AÎAœ‹%Ç!]ƒ1äóA6eu4 æA`íh ,á3‡!d X’!5á95Jã !ß…¤"xÿa¡ªÕƒ!s!«u² ? a no„!ä¡ a§ Áä! !Aáèð¦ Ð)!â"~Ž:A!} ,¬!„n! A½!þ¯=`%F!3^ ‘æ¥e?äq!AÕÎ! XIeÅv7 a9A8E'"Œ Aúåã!fn¡>!›d BA`ARä áiC õ Ó,Œ !,,EœÆ„ Àìò!Gºë¡J X–áÖA{` Á’Ø-"˜aN”V&ÄÖA(‘LæÁ¯Á! Xx aZ%½µ¬  EÿA"Á,¥)nAuE&%`ÕFÒJ幨;a“ µ¬¡ga®—rš ¿EZ"$ ¡Ša³!øA ,aA{%ä"t*EN©Y1 ,!>a†- ‘k aü"ì,ahA± ,!µ!O ± XÁ¨%…J1a‚!àÁ B¡ ¿¥±*rÁ·+!Ö X¡©!IA ! B“!•"Ì%ˆ]!h&þ!AW "ª ø š!J¡4 X!¯TAÖ!" A8EU" *È Mõ,e©! !·¡ã¡òõ"ÄA%á!\„ ›`Xâ áA)X¡6a‡AlA¶ ,¥!"ˆAQANY&^ ÈàÐ Bn!¢ÍUÖaè¡, ,¡Ì« %gyp%¹¡Á¡jÁ‰ B2Y !ü !à%Ýõ"˜aœ%ä"Š 6|¬aã BAPa¯  %È ‰8 APâ"Î!÷–A©a^ BA1ESVA!Catáð ,$ai· ˜ !X!"—& Ù&ŠÕà!`šA.áZ Bºi‚Åön]a´‘ü¡5!Ç Bú A{áµ–7 ¡%bMR¾²Aq B¡á I" aÁaƒe\1Î-äÁ7 šÛq  &VÛa!½"†½4Œ „ó¡Ý›&\!—A•Aé"´¡ûÀ …¨u†AcT! XeÀQÇ5¢J M9¢…´á òEêa÷ X!!á¤aŠ náÆ¡NAªa aeÁ?"ò>…4a±Ñž…x¡¥!1õèAé Aÿ"üXŠ !ÊaP nQ òaA˜ðac ,¡#!!½§ ¡ú˜qu²)A„!ÐQªÑ ÁvEÃÆ!T!¸áhšÔ!| aFn!¯A˜1` am%7 °Aª’!3aa BeÓo? upA 1¥ ,ESEJ BA·/!#AŠ ,b¥Ôiv °”¡Å VðAN%CWµÖ!vr A‰ X¥á "ŽAãA5Fl ,@áÒõÜA»­…"¢-%·A'%•šaDÇA‡"ø !Î!è¡)! n¡s!Õ´& œ7 , a²)\ n!ᇠ!ò…^ }È-á?"t d °Aù B!!wI E¼I ¥ß ,Aù!ÁBaê !ùAé)¢uÇéw¢,IOÁ¢¡? |Ála X%+œaä&*AÒË%IQ”åEa€a["` 9¡Ð¡y.ŬA=¡óBe,&˜"l>Å@ŶQÖAûB&h áüAAõÒñáì!ýab Üæ¡Æ°!Ò AŒAN¡oò!K…uAÆ"ÔI9¥ò! BÅ\ÇG X’…¡] ,eÈÆQÖe®•á§&Œ—” !j]&á Á^a… „Aeá *‘xAž%KÅœnÜ0ARg šá!AN!uù ¡“a-¹Âh¡¤u†!E!` B|!¦ „ ÅlA}QR!!á¡XAH ,!¬AWn  !q©!a FåR.°:çÁ4 ,¡Ñ“¥î1°!±i1¡ …üõ Ba­A@ aã !rAÁI9å0íÁçX­A¾%ê BaW0 š Õž!šAï3 ¡ä ,ÁÜá¾&à'orý¦!xE°AsnØÛÉa X9g!5"Ü aÃ!š`a ,!áAq•ŽAã²^Ád ,O+¡ï™ E½ 2t ©Aê!ª Ba²Awa["na›AÀ!Œ!Ñ,!ŠAÿÜõz!ÝAfÝraà!p¥W-!]î!ê"˜Aá%`þ "ØÅ;Y!5¸A ”4šÆ:uD¡½a”aE&¢ AhÔaE!V B õõ °6E;­µ–M Y¡óÒ Ba9A)³=`)Ú´ °AÊ!´!1 B¾áû×qÈÆÁY¼ – ,©$@è9ä¥×Ð%à ,¨A5&Æ %!çaYBAsÁÞ!O&@·A"}upiÈaƒå n%ôA)!"€A a¡!Ö šÖEºÁ 1vAb¿¯aÉ ,6E‘AYµî¡j¹ a ,ž¡s áaµa‚!½ %!4ÑAA@¡1 , ARA2 âEaöu!ôA`!&!R , aò&Ü Aí€aE&  !)5A& ÜfÁ-aÞu£  "š !ÅÁqAd!8 „!®AÑá¡Ü aN(d á{Èß & €EgA„ B°à %ª&ê QAÒšÿ! s nñÁö!Ê!l Ac!!ˆö ÍgaQ<¡¶% áþµ>ŽB…¹"°áäÌr X!ža™Iœq†ºa¡?€ ,Áð! "D éaŠ!9la@Å!~! BûÅsÏ1`![Ûà!E¡N­ÆPIé!î1Œ…Þ| ¡àµ¡æÊA.[ „A#“ax£ a“¡í!žz !T:!Oáô ….aCw°f%û!^1ü¡Ð¡aº B¡?…àAÇ,iWáS% ,a%!äaŠa: PEØ!¿BÒšK1`A7¸A B%óAe!áUì…/!b? "bAüîöA™ B¡¼!ýv 5 ®A‚ ,¡H%B aE ,¡(ʃ] i €¡«A A3%Jaœ&6y;a»°%àsµ–Eì…“ š!Ü!7ÁÆY%1!!‰á$ B¡;i]VAâ!zaøA† ,/}™"î&’ ¡$“ ¡¢ ,!mA¸!g l !ö  ¡]ÙöQ!d°}±!H…4‘¤(–5ä!õ¥¨!¹µ€ÆaÚA½"®x%á ,O!° !Ú °t !»…Ò-JA!É%" ï¡ÙA B¡M œa{ z¡ÿeå" Á,/E­"$C!ÊAX m!{AD !ma!& " j!àa1Aèá"-Î a´á554¡–žaaãBÁ°%a Ü)!Ç^"œ$ Lp54¡Qî¡,¡/ XÅlAMÉL!@Á´J( ,%.!$Eg Ü¡¤Ž ¡¸ ,!š!X¡W9v!­!ò!¹!O ,A¦~!¤U&A~ ÂÁžu†FM®P BVAî">Ae¶•Lù Awiõ™ü!ða81ì!!aƒÔ nEç’!æ"nÁóÇo9Œ!ïÁZaæ BÒ!Uˆ PüA ç Vañ!Á" üA{UÀ¥_ VaG Bba¶a®i ƒÁ€ÁˆL As!Ç%d5AF!þr9¸I3a\!¶UÖÚ!Eï"ž‰À‡9Έ u²AG!taX**%L„á¿M<üÁ AÂ!~ ƨ¾Á÷! Ô/Å"l!Ãf°5`mÞÁŽò B%F…&Œ ï©×"Ð)!³)°Ð%¢EX±jAÀ-EÔ °‰†!¥dn†à!£‡, ”Á…  AvœT Áf¡òõ"aÔ’Õ¡ ,¾Qe[1|ß ÁæÜ)W!‹ÁcrþA~n XóAå˜"®Ñ©!¹õz+A6¡ö!® B(!yACa6 aÆaªA– g;A+UÖÁEû"ÞalAÚA¡u BÓašÃ5Œi×óª eÓí.vº 3 XAÕ¬Ë"Š ¡PÇaÆ"†a§áœ": ¬AþA€Á X!Ás5¸aY!à![ ,¥ï ã q†( @ C„ ,µ Áe_QÀׯAi"60Až!¼ naÖES›U&!ÃAü!£ n ¡ ,&üAÓ­"f ¥%²a3Uª;ißÅú X!CÁWAôa¤ ¾a) U!U‚ ÁR ,ÁʰA3 A'!!Ô&Î Ò!sË&¾ !a¶Æ*¶!ÌaVÅ‘n(%( n%†n™x¤ !H!çQ”$%ó&â ‹½ ¬UÖ¡_ÅÆe·qÞe²!骰 Å0AP¶ a†¡xÁH)¥IØŽÜ!C"!’"` 8 m y"¶ !…2!ëXAÙæy ‘W)¹9r\°H æ!%¤ XÈe†ÈÜa%eW!‘&R#áAh!•"((¡ïAÛ!¥ Xª³ Jq&aáÄ„ ša%5ä!›i·,!A‰– DXT X!wª!Ð9¢eÁAá9*(¹ F™ºªáØQ!µAÄ7 Ï B!!Øa_ ¡ %EÔq†!J:1¼ ,!!!‘U<­-¡oy|Aþi/X{3A¨"¢ !YžÁ#õdEJõ"ôe˜« "4 …û­¡Ç"NIEøAl†5Œ jA* Ü!Îa!ä!¿lAºâñN%a^EÜ"¬¡a!á&B%é¤1:!ä!IÉ n‰¨åg „!vÁTá7áë ,>a@‡ ìa)$1úšÆ!P‘ a+ iF XAsP=A­ X!J¡{rÕF!CAÖ!8 ,ƒA¢A†Á Ã!òAì¹(•AUw "š Açá„A® BA{A¹A¯õ8á´a~o!ç ,¡2™=ä!AW²µîa ¬A~åB<¡þe5¸!Ü¿Á…õdØEð%6±€ë!‹× Xá!÷¸"v"¡T iSñdE¸iAöñ¼!]ÁßGq X§È!£"ê )á9ìQª!jö áÕy.Á›Á[á¦!! X— ö° …W L " !ÎmÅ"LQö”µÂ¡ø!àÁAq X!ó!„1a !†ádja» !uÎ!! !saE!• Ð ¥ƒÌ"ÚÑA!c! ,ýAðem5ÎaÇîa§ ,! àò%qAê©p ,æávA® ¤AwÒ Î »AAa²Õ\Aª„!&¡n,!Ž ³¹/áú©-º! BýA"œ‘6%4A$kõ"!ä%F‰©°!^Ç"æ!YÅv ᪠n!2é'…Ô Å,Á²!&ZAL]¡±™ !ð!Ï%¤A£ÞE#µ€Aé=  náÎA¿Êa5 a€A@Ye¡¨€A« ,¡¬AÎ!öA™ Áž(!Ó a›a”  ÉnaA!‹qÞAR:¡nY ,¾Aé‰AÚ ­!8¡,Ao %Ü¡“aã•6.Þ ‘ÐÔ%õ%«ÑgŸ‚ 5`& Cˆ"h a¦P åñ"= Æ4Ÿ šA >!x1¸AÖÅ EZ"6¥!‰%‘"¦) A«&, o ỉ ‘æk!-žat „ÉF¡Çp5á¢!ÇÅL1aNáN+!z BÁFíØ ÞE !_5Þ%Œa"Laô¡áú¡ñ BA"­A®Á AsšiŠš…\ÁZÑr!¬A!ùAœ BÉóAç·áw­Áç•6!¸:©…шæ¡„%y54 !¢¡Pá na! A,! !é ])""¬wB¥ AÜWBå!I‚‘ºAŒaÛA.¾ nAÒ!wIž a×gLþ %ûÎ ÒðÕa¥±&¨ %w¡pe òxAU!J\ X¡HBa %›ÅGa¢Ü ¨Waê ,EèaîZqD!>!Í‚!@ ,¡$%¸!x"Ü a|Á¦ ,Ö!½A$"@¡(E>9ú9A$ U”!äQ a"–á!‰!Óû n!úeZAßu!€óåÄ"  ¡Qa?4ý¼! áë.1ú%\! ¥h5J;8 a]‘¤Iéž…c-`'E a.Ž< !¿d Æ!ú) ¡«xaÝ%D òEw=4½>. ! !&¾&ÁôáÛq²A§¡ÔaÐa X % EÝ-ú!Ü!) qÈ2 ! A*B!xaG.ä ¡l_aç ,E&¡©&î¨á! 5!Ü ൖMe†•º-2aU”!† a"¸ ¡¤¡˜÷5¢IO¡è.V%Ë!Q" ¡g!‹aÈ!# Üq á~Å!¹ á >E5Œc¡¥"ˆTÁlÁ÷ Bðr`&1>Aåo•baR¨%R54- ¡ XA$¾‰5•xl!\u :rC Ba‘ëÍ™¤%÷A áaÕ¿!ao",Üj X PAýA °aes¹îE×Áø¡G1`‰ !"(&: !‰i},eC!-ò!Ï!a" < A—¡%A- °eje b aea2…üµ–n!tŸ& € â!üYhÁôG!¹A¼¡“eu1¸e^UÖ‘ah…NµÂ9!w °A”a×–A …̉ŸF Š%ÍE•x™š!!1Ja|ñÏ"Š Á´en † X!ÝÜ!5Áá ÁPo4at ÂE®¹5»T!85AhØ!’™6¹ZÁs"vÓIro nañE 7õ¼!j¯Eay , ávA#°!Æ1‘æ!Æ…s!i}.¯!Ða¶"f !2 AY n¾ÊaA „aNT%NUhB!%‹ù¡¡åvE­¬I!“ÄL Qªµî Å{ Baô!!Öi š¡Ãá õN!se¬!ÁURA’Aÿá *ä ¡%¡­ XÐ%äÅúñdaVD…c"æ¡6Â" š e‚΄U%´lµ€AŒa+Á„² BePA:±1¢ÃA§[.ÀÁ'GA-¸Þ!uà X!ÜAœÁ# !Œ 9Î…L%2AQ Ü a®ì¡ B!rAÁédµj÷ Àµ"r¤aÝK&²…IfA> °A¦!·ž… nš!!¶Aø À ‰!!Óñ¦7aâaEN , ´õaâ áGa]%v ÞA-AÊYö BaA\aWA !!Xö ¹Âz!Ÿ!˵jI‚ï‰ ABQª!at½ØŽ%ÞE­ „Ø« ɵ š“!ŒÕ áí Í/A„! B!!ê9¸ºóå u.AÔ‰ë Bæ !£ADAí n­ á&ÄI½`Y•L¦! !¾Q&ÁnA Ì X!›LBê%ÒAÁ"Ì õ!°g A B%‰!xÁ{&t !È!KeXQìXÛa³1¢8 Û …·•¤? al4!½ nS[A«"D!EPaÜž ,a‚E~Áá½T…£E›¡4 ,a<> 2¢"\!8A ,a!BÁùÁŒ á’¡^Ü !k©½ò!0Åa^ X%„aòE[U”aªaÍ'"2 %¡Æ…"aìÁŒA– š!TãEœµØMÏÁqQ~Á;¶AVUaA”¡Ç· X!ß%% ÕˆaÛke†Æt!5aÁá&ÅÆ!! ÜÚ~)÷2Òa”" ¤ ša‚¡O,• ƒ¥8A™•Le˜ïÁ.š¿ AÙ BÁ«¾a!ç %+a=ž,!? Ç1 ,Ü!d^1va%"ª } a B!(Af!Ïy XA4 "xÁ˜aA}aÌ ,Ú’‘6AªÅŒ­U~å^A$!×"æ-AÁraû š€A*¡ˆYh!ÜV aM „…Ž›! 5…¡RaŠUìq!š!cú B姉-vÁQáæEœ" Æ!´!&!¥ BARQIùda:a‡!÷"Œ ¾«i[nEÿa>ë nArrÎ!w n®Aeaò9ä%ÈôÍ , c 0±>ç P šA‘ÂuQRš!\a…!Ú X?ãáV ¡a¡š!Ó øÁW¢Á }Áa[ö …!LA+" !Eá~A8A³ ,Å´a¬H"~ …¡¿!w™x¦­!wL¡ª!pa8ò!V@AfµT…aò¼•L)Ë‹ä šê©¡°Á¥ !5¿ A[.¸á8!<-!n!†“!¼ BøA¥³"ŠÅ•Dl"¦(%J%º!qœ!k‡%NõNn!3| nA EUA‡"^!äaŠó!g ,ë¡L¡X*tanw5JæëA a^ Bx´! ó !ŠéÀA1ŒAÒ%¡Ùˆae!†%é5¢%™{ %! XÃÆa Áv á AØ": !W ú!< ,!V%ýŠnaÜ]Ù7!žˆup!!ÆF! X!µa‹AgX¥Õ¡(!Šñþ?e©o š!šA­JX5Î' %¡%!‰"ŽÐA‘ž&` !aA­a "–¤A‚¡faŠ X!JX)Ó5Œ]©—A ,ÁÜêå  a“La!— ,!>!XaG!c ªAxI´ ¨U ¡SÈ °!na 5äÛt!è+ ,!œ–!Ô• ¡ý!µ©"ŒA7AŒ…5ÕáÁ)ö { XE*Ùuœ¥%é8 °QI”%’ B !!ŸB!-¤ B!Ú n!p-X!]ÖeJ X¡#aaœã BU Æañq Áš!Áe Aª)AX%= ]ш%vk%O naÃõ…P&X!Èâ°QìÎ ÁG!^&òE¡.å'šÉ !΢µ€IðaÉ| åE®Á¾š«ˆ ÆMÀÅsä"ÄaìA€a* ¡d¡×!B!Ya=„ ¹–AéasAÙ)`%ÎaÛAÓ5`EiIКX¬eáB¡Vh%j-¯˜!¦AA ,“ÅA!ÁUìEMî¥ÈÑ\ª ¥sÑÊéN á£"žUT‰• ÜÂ!`Aa3 „ªEƒ´ 2 ŽA ©B¡6ÖÁYá­ BA¼aÌ{¡Ü XK5Å %‰ ,!%[%$MªQ¡¢± X%!Œ¯"ÄAèAÃ=A² ,%¢aðAé*J"aÊÅ!ú«A ¡ B© lA\ VÛE " 1 a@%Ï54Áë’ ® . q ¥UR‘5 Ù"P ã!X! šAûa\ðX¥G aÞ!% ,…IA Ð"v ~ !q!8 ,aa )þQ~­ ¡î!ÿ ,ÂAëÁ‘ I9ÁH£1Îa×ÜÁ¦· ,¥ Gáš XEwa×!N&t ±eô‚‘ü!° UsuÁ‰¡®A••x!T¡cÅp5¢Ez\1¸ ÁX! ú °eBÁÚ! ‘Ð!°…ŵUÖèHA–&& -÷AÚ XA~fiâq.x!Nà"O Ta„Q<)›F K „%naqA&"A0a·ê„a‡˜ Qª¡ü¡Æ} ; ,!‡aB*Œ !ž!s&`A:º aãXaסÓAn54 TaÝX X âAd !ð Á¿ ,!ˆ!Á"¡ž ,aA*!§Î »o!e.Xñeð×XÅÄEé"° ÁÆ!E'"lç!`A¼as n¾Á*%R"° æÁ‰A;# ,¡e ›QhÐÊÁ* V¡× ,!²¬aEq!q!…ŒUh­„@!' „áâAÚ!¼Aø !¡šÇA µ aàe ‚U†‚.°lH!?-`Á\!V!@ X%åE¨â ©ÁÂA½áÈ ,Aø!óA=Ak M*Z"  %?A”%&êi $¡: BLA<Y\ ÅYK ‹ æîA°•LaYƒADòÁ”¡l£Qhåaã !ÎuôPAN„A® ná‰eq¡.±jc1  &¶ $aÄA± BAi4AÛ X¶¡:áSa| aþA¥U”îBᑎ!–Â!1aO BÁpAíaº b AS · ¾¡–aøAÇ AúAv!ú> !1"!l !ÂøAD!= —a)Ô ¥­"& !k!„¡Éà ,aÛAÞA^  aÌŸŠ ¥ÑF a1äÁ«!ã Q‰s EAt BAø!Az á.a˜a²2  ¡xÚùzÁA `U”e!§Š &ô_ %õ3„%I‡ aá1¢, 'a m%¸ÁÕö…¼A¯„¡$!X!¹ ÆAä,‰¤X^!>&˜…!aQ~!±!AÄK XcA'!ý&ò a‰áM ,ali¾! Á«A•A'¢ êœkÙö%¶âó š‘ö%N BrÁr5v!Ã%9a& AÁŒ¡1°ÊaDú X¡¬!ÌÄAÌ !ÄAa&ì )ö%Ô ,AÀ!áð¦ Рẅ !ÛA§iã±Øj!+õþÒ!1Ð AÞ X%ž ]¥ÍkI&l!“Aà ,Aä%à!9¹ý!J…7°eÅáç!¹jÅ!ôŽ5¸ÅÝé 9`!õ' AQ EÁÁ"f AK!ƒ!ÿ °A£á4!& a—!5yD!õÃe ñ衊ùú BMC Ç Iª*AÃB!lA¸¡ÜYáóA—!l BèáíÅIõ?AyA;¾ Ã!QÊ B!m¡aA9aƒ!Æeá&Ö!Ã.1•ÐA4¡ÀAl!Ž X> ¡h³" )A’p°A;ÁÚ‚’ ü)Áf1Îr!‡e6yœ›!xE „AìÁ­["þa‚͉-á!‹L !lÆð‰e¤ Õaß"Ì !0!zo¡s ,) 9 % šI7 y ,©|áùQ~ÁÖ! !n¡ã> ÆU<ê€!í XÁ AxaÚ AaÁ8á' iA½X ‘ Á,A#“ XEKa_":A!G! Ç ,E¹%‘!ÔQª!Î%-%Ž5a¿áê%,Áš!Nî Xa…É0a_U<¡’ !ÍX!ƒA‘¡: Bú aDA;!ê @ %Ôƒ ÕáàB!— aÈAÎ!w9ŒA£Å)eQÀä a†xÁä BAvaÖau Ah!C!|"x%a(!w!& ,AÀá|Îuô ! AÇî , !ß9 „e!w!¶u²Á¾0¬A‚ B¡ù/ "âe©¡Ø!íYì}A¹!s5ú¬%v!Ë5¢±!Ž !9 nÆ'¦ õ¼å!5!ãO ,ap!Ú"%-‰Á£"¼Ága‰¡. B#P\\ Aý!/ n:A×e`ш¡2¼a[.ráºA7Eí X!†%`2"ÈêÃeüõ8!¢a.Aiè šEK)v!Q-¢eé%ÿ µ ,A’Ý1qZa@…§á§YhÅ* ", ðÁB–aa Xše(EnAKA-‘Ðò'/„ B,o ¡Ô9¸ÁAv!FA2 ,Þa=Á‡Áù AåaŸZ!/!â±îÕ¾!à! ,ÁAk! ¥6åwÁôÁÁ!¢Al ,A”åú,Ù¡Ž! ‡ ,ÞÁÛA""Æ$ °)a¥ñB!]¡-!Žâ A%Òa+Ùád""H A’! !¡A Xa)&x !Ëaa"Š la´œ"J AFA®ˆ BÅaÚ¶!& eÕAÓÛu²e)EÛa_ A8!°µ† BA¸a†!¹! ™Üe›"¶ Áž¡j!dK ,iX%;Aq!Í eËÆ!©ž"(…tAÓÊ"öA<¥“¥‘ amAÒ\„!€¡êASq ‰w š<åJa³X![„ Ü¡xA¢A^ B¿!±AÖ"F2!›¡!5!¼,ÚA…¥ XUQ5`[ A–Áˆ!? BeCÛ‘ %VìI+ ,%A“aM9J-±auA XA”A!~™ŽAAç%N&ÐÕ%‰e nME§aÝ&”AO¡‚!U”A AJ!~!c „çAháÚô ÁA£", Sa…¬uÞ •éP!ë B)+ÁvaŒqpá/E#AÂÕ%Ý/ A%õÒ%ž!ŽÌQÀ!ùÉsı–ºAÙ  „¥ª•Ñ´|%Q&¬;/•ba¾a.A> XñáxáA„Mc ÉUÖ¡ç©—!ÌjAç™!Ì XåZñ,"–b)1!VL A95ŒiÝaW¶xA¹n!l nʼneFÁˆ-¸² AÄ!a½ ,A!i ,1ôAì¡ ,­àËò…¤AÓ¡oÕ\kAðv! B,Á´?5Œ%`E§A…"Ä!‰%µáƨaœ…S•º X!¢ynaRÅÚ!%Q& ¡¿É š%ˆa¥1ÎA! v9ÎAå !8Ê B!¢Å‡á¯µ€Ø …$a‹u!œ¡Ž4 ! BadaÄ ñ€²Ahš5`e ©-ÎÁ…A¼!z­ XÁ;á´&Ô !!ra u†¦ åL• A#Y…xõNE]!5Î6%Ii"X aÄA%!N™Ð!!¦!·÷ ° !nF!® ÞT!Ia÷¸ ±>üA{± ,eX _Q<X!4¡J ,ûÁ²!w!h !YÞ€"¨ mÙ)á* ,!JŽaŽ! Bá¦at!é! ›Y"T%,ô)w ,Áa-yaA–‰ ,A %!áÕàÁ­!ÙUªa:A¸mA šj!"A%¡I =a× 4 A¿ 9Œ¡P¡-!‰U<Á !-Án& Á×ÁFA!O XaióÖX >!0A¼Ak ‰Š¡h!KÑžTAìAdaq ,à aŠ!IåI¬ao e~)º <Ã@"Ê!Âr!‚ ,!n¾^"š£ WÅ£-¸ß! Èõþ%A!'" UD¡BY”A¨aT”*® ;EqÕr!Ëá Q<ÁmE¡("D®! Ü<!!Fá§ ÁÚT?"Ø&ÆAaÔ ,+ A!AÞ¡õ ¡¦%_W-veÃ`"Âò u.s ‰A‘"h.áþáˆA²± n!ÅARt´ ÅšÕï"P g§ !K , aqÁZa’ AG: (!× æÆGA2 !ØÈ¢u !,_ %9"H iÝA© Ba!ˆá¸ˆ BAž!ý!!¹ Á¾‰ÏQa'M ˆ ,A A} Œñd!XÖ  ,ùÁŒkþ ¡(Ahaðᘠ!YAq9¢!Z!)µAM¥+ÁouDa"¡$!OÁ X…ºá1\• Õ…_ Vz!\ B!nÕa¯"Ì5¡§¡Üp !l ,I£aot ÇÁ6ÚÁ/±yœa®å z õþ?!üt5úAGAè‰$¶  Š "xEíû˜ °¡ºaîA#9¸Ð!C‚9viðÃE›BÁÝ!ˆAò"f!?ˆ‰&Ü,EŽt‘æ%¢!ÏÕ"Aa²Ü!» °!ra”=¦ ¡ =a›; šE-N E!¦AZ&º!Gu BANT MR¡PYa/AŠ ,PI!wÕöAû!AèA ,¥åAN Ï .a  ,!ñ!"%"ná¸Á¼!“ ,*“Eð"¾ a”a*Æ¡J ,g!¦ Aø Á!au A˜ !ñ¡%Aa» aÁA5!'u†kaõaý.0!A”a{ B AP!Êž Xð!ËȈ ¥auAEU<áó!ÒµÝ ,!„Œ!ü"| !0Aè¡ÊY”b!4a]¡E Bþ!å!‘"b„R!úA† ,!(É1!Hq²Ñ]¡ÊÆ ,a*aZá a‚!Ë5B )( "âÌApò ,!…Á?% "¨aDÁØ · ,AÍAð!FaH©ò A½C¹(A‰!9¬"R ¬!ÞÅJ™æBASÕ\E~!å!x"è/ará „eÁ]µ!>:´! ,mm E¯"\!Ø€ ,AúÇ ó¹€Az ^µjávIh%e-Aa Œ7 X%Ÿg!ÏÕÊÿ!½ažn!±a¯á"t ¨¿I(1¢aeÁœ!&â-ÁGï9ú!ž¡“ ›MÖýAå´af °¡|%É¡luÈÜ !õ8)óE¡È B Á¯!#aw AèÉÜ!¬÷ž¡Ü ,6aa®A¶ AŸaï!\A. ­8‡&ˆ%!a%P X¦ú!Æ¡Q!M€ a X8p!_! I«Å_!h !á|"Ž!p %Î" EãAÅuaR®Z XÔA~Aú aþA~©DQ~„¡>Å"6A‘!³áÁ4 B!\|¡Â.,A’.qX Ad¬að¶ B!La˜¡, a;"Ö & WeEQ<…È!a¡‰™Ð%aAŽ!¤,™%ÉAOUÖU 0A¬ ÜA”! 4@ š!AO !µÚÁ‹u†A£!‰å×"‚ýa®¡¿¡— Bm!òU xÏA ¡xPiæ AQ(a/.îSs %d Bá¢i¹ XÁ•A*€A= ,%òÅ,eö !)Adä ,y!õAð A‘!þ!! ýá A€"p!žƒb "Ì aÆ)§…= B>Œ5 XAÚA, I"AºAB14 A@¥´µ–!µÁ!' Bb\ÛA  (Á¼ a†)xa8õ¼aƒ.6¹!|µ–!Ïg""š,,!KAA¬ n)ÄaË¡=14aìàaða2 , A½áO"ð![!,Áö!! ,‚„eã"f d $[Ž24" A,TCGGCCAACAGGT-1CCGCTTACCTCACTCT A(GTGCTAATTAA 8GGTGAAGTACAGGGA ,GCTGT&CTGGCCC ,AACATCTCCGG ,T?ATGA ,TTCGŒs B€GTAGCT yGG CCG ,GT}Gi CGAG ,CGG‡TArA ,(TGCGACACCCTc BC%GÝ TCGC,CtCTA9hTA TCAT X!CT 2TGXG)K CCAT¸ nLG%w BC!_!/AG%‘ ,TA°!¦!j,G!™ÆG!— X Ý!¶1ÎTØ1AG!K X!r ‡14!ECGT%GTTT ,AØ!!ìCC%5­W )œð!¹G ÜòTG!ëQÁ9-AûB&ø cA{-"& !ÜÏ aÇ!§XPÐ ¡QÀ-¡Á01JÑaA¢ AQÀaáa_– X !Ü…9yôïÍaŸAÆ¡`y͸ B!µA¥E'&t házAñ š…‡…E˜Uìè!è‰T"‚8% Þ „ !¯A oÜ(,òqZaAy!z¡ ò”ðA/n (5[±Âa©!]÷XðAL%H,Õ¡<¡.C„ÕE„1J!_!ÜE¹îu A:)"14!Œ!‹IyœA )_"¨ )I!D/„AÀeDAm• EΡ’ uœA;aAeI".wAaA \ )JAÀ5 J=OÆb ,a*j AV!b BA¢¡B!! )EïI ªAha´ Í m9`W¡r,®%üÁÕ X!rÁ³U7 XáÒ!à!R°A!á"!RÁë ,AŽÁzÕ ÁáùA! EuEg¡l5äA!ŒAi"¨ aª^ ¡¨¡Í B¡O­ •¤é8gAÜT%¡gµ¬eªÁF¡™ !·aa7"¶ A"!ÏD „¡¨è A*a^ ë¡:! A² Eáêa¸Ü !Me ,!kAv!©t B2 ¡€ÀA• A‰å‘!61䤡—!IAï BA~a˜ ! ¡åŠáÓa á8WØ!@ARA=a[„!ÊG2¹(Á0!Ç!duZ¥:¡ !? nLA< 5¸¿Aaÿ=!þÁ~ n©!ÐÛ QÖ!)E'A:ù !‰A¼f Ù´%]A„Ñ ", …ýYA¨Xoar"Œ a/…ÕõNA !IØ °%ïE(@ÜÙ¡9‚!S ,!E!š!â4 Le+!¾„a$(!x ,E‰á]! "Œ X)vºòA}oû9‚kï, !HH ne®aíXÕžxaô.!Ú š¥!!Ê[ !Ý!š!‹‡ $!N)`QR!aÖžÁ ,¡6Aéf v AÊT…f": gŲßMRe.Navµ>&aÛB¡Ë XAAy!µ!é :A Y &< ¡c% Aˆ5ú!ü%¹‘L!àaI›òa|a1XYR„N Eg ò!ÂR¥C" í©5Ja…^a‘L}!±JÑžaR×ÁE¾ ò!¬a,©QRÛ!£; ,áÐA!e¡"üba% Õàæa€í Ù]±!c™ X!ó%¦-"V!Î…A "¾ %Û.¡©õ¼á\M!v½j3 ð™¤áüÁóAƒ°aÂAéAQ•üÅTa‡!5úa¼-K³Q<ÅŸ%Š¡/-4!,!ÁòA> òµAé!ð ¥ Ãaý"¢ )Ç!ŽA¬Ñz!ša c B¡NAd!\yÈœ àÁqÁN ,‰ !¨µ€$P]A÷ ,-!up!0a·E[%r˜!Ü!æÖ¤ aÜ!áAf5ú!¬ÁI!ùÏ „,AçAô! TEqp‡A ,‰Š!øñ Á!r¡ž!@ ,Á´ÁAN Å[I@A1ä!Ǫ!K"4 aÀAc "ÌØerAŰ¡R¡Ç ÝmœdP !IõE\ šA“an&f‹ )dÿ ,AHaDAðÁÍ B… !K6ÎAºAÚ!‰ùÒA!I¿ n™Á°| AàˆA/Ænað%e5Œa !B ¡+!¹‘Ðì!ÅC&ÐE5%Ž]&Á‰(Ak òá5A!§a´ ÁË ïEp íeÌwñ8EÑ| ÁoÕe*œa_q%¡?"ö!J!œ›ÕàÉBaXeþ š!G¡X!÷!@ ša¦a³qAm Ô\E.U”!!D¥-•æ­¾ïòÁ, !¢Á& XeTpA1¸aØÔatq ,-*Áû ‚!§ß &Ö…Ia°ñ ¾A%%vÙ#Ie" XëEMÈ.Ž!¡…ª; ,¡Ìaø< A@ êàEr-J!0!oeæ„AçENÁÿ"ò 8aaŠAC XAa¡Óam*ºkAwáÛ•Žl!"AÇ B¤!!RÁá AÖø AœAj ¡z!òaÌ¿!nØø !äAðšypå{APD•xÁ®Á!’õN…ŠÅVæ‘bië!†!¾!™ _aÎ „—AëAÒ°8x rB¥½ai%5Õr¡šbÕ\!â!±auÕ´aª!„¡~¿ „A½A@6 ¡áG à‘Ð!–!Î…_µ!+!…! BAì>al!Ö Á´A¥'™ÐE Ù•qZ>!aBu.AzÁu!1Õ X!ÙÇv á1ÁÙ)Ñ AK¨¡/ ,%sA&v %‰Ûe naÀ!Xk ¿B!yA™&^ ¾ÁÅÎÖ ,!Îa.¡ AŸ‰ ‚n AhÝY1ú)J †` Bf gETBašA+UÀ!)at%÷"Ž!Üa^‡!Ú X¡áçe"  !/![óA^ ,Ðe«ažu!û¥)uZaÄE¿"„ á0Ä ý,a«¡Aõz¡(õM Gµ>!÷!¼A§UÀ!µ€ A‘"È&!aŒ!" Æa;¾5 ž%úu!a@!yaã BAÕAí"4 %G¡!·"¸ JYáëa  BA0øe·&2 A9GÁsBA‰µD&¬%˜%ÍAÆ ÜiÛaF!:±î¥–½aÜ ¡Qeø!S5úa“Ç /a| °ãÇÅÓqp~aìá•8 ,a«A{!å? !³´ !°!ÇaJ™æyjA³5äa¶eÞõè)ˆRŠ¦Ž áGI˜qÞ!‹ypà”Â1på<Á{¿8  AU”,A¹ý"2 ¡%Î"Hº!ã!R!1%3AR§ -ÎA"A*%ú• ÀAaóᘠBAw¡ç%½µØ Aï!Ñ-vÁX!O) B!0AìeÐÕžxAÿ¡ó , A¦ÇAÅ ¡!w½¬A   U윓Î!® B“Á*1z ­E:aF1¸!?rsA˜ ,Á:ÿ%RqÁB!‡!ãa ,2¬a·URa!1Ë]~!Ü%öa‡¾ %4)"Ö¡b¯!RáW n¡" U<Áa¶A×d ,!]E—aÌ" !‰Åo!>Qª½Á¥C‘ aæ´p XÁAS¥U• A AüaÄZ ,ÓA¡o& “!wBÅ@ÉŠ°aãaæ*Œ×ì!©ÑÊÅX!½".jÝ Ý¥¿¡&!Ákõ ý¡é&Q‘Ó®i òE ¥} ¬A*áÒ9Î rAª BA<!F,‰²I(aM ,!ÉD½5 a9H A×!¼ a!N!4õ"!ˆˆalõ ,?´¥}"¾ 2 R ÷,ÿ!©K Bá1ÂAÆ"”ÑAïJ B¡A!÷ a2AÇ! !al?aü !A@eŒ1¢A¼!õAg! ,A!ޏ"V)AHa®äAY,![ö A‘6:!‹ Á2 ,!õ“A®U<±¡AÀ ,…q¥\14AÀÈA!d ,;u…vµ–Aé1)î ,AöaRa¡0 3( ß ,eV¡¼JuœA !!Áe BEú1å"| a…°á!a ,O!ý!:… ckE‡u²}AÕÆÜ AžAzAO  B!ܼ Ü9Œ!²Áq!wqp¿C !û!º B!0G"ºA3aóò!h ,ÁÅ+þ"ØŽ!Ç]õ"A1A‚­14! áÖA["îEìEÿ!çòê$!ª!8 „2…Pa¹(á±áÍuœÛE8%h±ÂA! ¡. X š¡•Á a°ó@eÊ¡—±>…CaD!Á"|{!s µ(Ea'c ÁŠ n!žº!{v áFWu!oáÖJ ,Òš!á.¬B¡œA)Q Œ Š&t !a1e¦-A¥!\A¡ó nAL &0*aÅí õd:!3u X¡ ! XáÊå&Éb Ü­aøTAÜ ,P m)> A¥ý! "$ aÒ!ûA<¡Ü ,%!…A”Uç A,,EH©‚¡á ,aj¡ AÞ&â `i3aF-`!–;ax¥ B%-O A©!0a: i!¦¡!Ä E{!cð!aÀ!HG ,!à´n":EŸñAO*ð¡Mý ‘æÁ0¾! „ciÙa´â AèAea®4„…F…û½îAt!.a¤•b!¸ÖáÏ"|  %±á ÆÁ}!]A!º na™‰ uuZf¡çÅÎÕʉ_!bq†¤Ô N Á` X¶ASeY&Ê!—!åá"ˆ¼ añ¡"A&aœ!éF X(ÅFA• A&2 _Æ > á=a B!ò¡,Ap! %ó½ÈjÀ aÙ5vAAaøaG Be@ ETñzaÄ¡±!@ ,ÂõA?*Œ a˜!þa¼¦A^¡c¥k&¨ +aŸÁŽnAOaª¡’!À n!B¡„!ŸaÐ !UAKa"(ƒEÙò2´¡u ! BT!!2 !Æ¥Ã!‰*’N ,eq† °%š A³"Aùa2!ÖY!¼"0Ah!BçAŠ ÆERA#au.áE¹!f"Œ aèAà r B|ï&•x “ I0 ,!ú+eq]aÊ…Nº ,¡ª"®Ü'á÷¯Æ ,e˜e‘6ÁA!q_ ,!âĸQÖåEÜ &œ?A¦A‡5Œeaßw XAì_›¬ –á¸!Œ E8ÁY ÖaA&Qª%™ B!ÊE<&F!˜ Ý"° AQÊ€’ „%5IëÁ ¡g·¸A[ A5aí AH Æ!¥Á…!! A´>Á£¡ö !µˆ&25…uS¶yDeÅAP- X¡‹¡ÇAZyD­A½ái"X !Æ—óa9 „AìF Á³AU  ¡6ΡB T%£Õ1M …KõáIçx"léAîA½5Œ!Ta²ER5äE !f!>‘ —ଠšÖ˜ ^ !ÜŸ áAl ,¡7A%^"蘄ѹ ,kÅP BÁ|!1A-,á^ö!g°¥Á÷ µ–!òEk!¦"¤ÑA9Y‘ºÁF%8)ù nAþ¡¼©ˆQŠ¥¬âBá¢ÁnÍAF °Áí¡óÍ"^  kû "¬!›A—Éñ¦²!°E™ e¶)y n!­aj%¹X A`E¼!GU&%ÄeÉü B!VE© XAh! ^!& , eâ {,' Ÿ!5"Ž0UEî "& a&’eb5ÎeRE§ac1äAFxG¦ „áeÁG!§Xa®I v"Ì D!½U&ááRá X;Áî©A? Am5"vh á%85!¡OŽ !— B!ë!P•Ž”!û- ÜI3AýV.0¡Ùá&E Xîamc!HøA­„…ÜÇàQ&¡^…c:™6QÀ!9"¦­…ÔA•,á3ê!r!þ „¡'e´&Îý p!cÑrÁU족a B Å…A},(ARE©u†a+?ÁÐN B½!oA‘& ØABÁ’QÀ¡ýV¡± BóaÝ1Œ ¡B°• , °!w „A­A8Š ,h¦ -Îaè!Œ. AE ,!„³Apaâ d%5  AÌÜÁ¼&Z$%ÏKa®!ž}ao£ X›:Áa —A Ë"~ %A!&jG A5ð"` c! ¡,' X…ba_!§Ba¡ee6"C :  BD ¡ÚÁÿ1JÁ¸#; ,A‘aXY!K aOár¡A= !rA×A† iö!u g!ñ“ IªáüEypA¿AægBA¥ „ B#a‰xß X4 !!!þ !Ja‡!ª!& !5A'Aqµ(!Taä ,!zïá’ ¡x ²Ú1`b×¥)‘ºAžìr&ŠxÕA9uD…õ!‘?"²eë†"ð–!r]j š­!ÊA> Æa®Bê&ò Axa¬a‡U&áEÁˆmA XR!W"ú ¡Ra]¡”¹j,a_AA°aÄa<ý! X!¹; &8> !ûáÕ¡¢î!d¡È BðaataÓ %Ã!½Ü  Á¡A®É ,AK ÈXa›Á†¡Aò AG€¡ªAÆ Báþa±´, YÁr"Þ%µá Q&iEÁuA¡ÅB¥.¹–m¸^ n!,aÖò!l ¨%o!w"r¡>!á%n0 ¡‚!Qyœ!Þ!/éX¡ %|=vaYaHax]ì!Ü u.A´! X§7¡Á1 % aqp"aÞ!þá~ ,'ÁvAÚ× Ah>&| IAÇÅ» ,Aÿ"AReiÏõz!¸!.!RG BeUa„"n ¨ð¡gÙr¡zá¹"€Ñ%噤E½0õþ!!ÁO=ä!Ï]Á\-J!\!n)çBa=e®\"@Øåeá&"$ bm¡öA òa!`Y•ü Ô!–$%)ò4": šÊ !i5v÷…JD nÃW¯! a+á½á!• fIõþi+e°Aª-¸Ü¡½àó BAá9AÓA£. aR“AØ"¸ eT¿!Ô5`A YA© °!!G¶ „Å}³ ¸1ÎÜ%q!Nn¡H!F¿ "Œ-V´8 X! (%¤&¦‘ A2 B¨aõAÿUh…Éeƒô M<åúeID1¢']ý X!E8a¯")!iÊ … %^ð!.Ù „y ÁÜa!µ>ê %¼.Àx iÈqp¼Ê(Aj °§!\A. aX!±]Æg!C¡iÙF-È ø$ A!° XP!ñ y‰ !)Mì ¡!#"@!ßCA¾&“Áåa"2 AROó nÁXêtu aaKñþAcሢ"€!Ü ÁW BeªEéð1ÎA\aÉå*YÖ;²Áý±Â…2î o14±+ÃU~!B%ËÇ ½¬ ¯)õ¦iØ!$– °!å¡–•æ&ná|šA#!ùE–&|aXã!Ð&” å¯a1þ ±ú !å)4aâÀaü ˜o² AÄ å¡¡áƒu.ÁV!à°aË ,!k- úu.$ᦀ9JZ/A!k BAÀAÙ; a Üï á”Uh¤ÞaF•Ž Q…º!ê B!­A Z-d!Afyô¥¹Ä!k š¬Awá !î Xn¥!Á´"t  !"©1ŒGÁ(Õ A@ Bao%ªup?QAup!îAë!ŸA® B!já¦áX !ja2A†I  A8Eš¥Û!Ô‘LAžAçúuD¡4Á4¹ X ÙA>!îuDÌAéaZ"ÈŽ%³Aq„AåEÙ!ÿÕÊ>AÑr¥P¥ƒñÒA½!È!Fó šA]Án…P"ö5ÞÌõþ– -´M~Ah0ä!S XaÅA  nÁ°Æâµ¬°ª ²& "ª ná ¡­!Ð.báý%è¡3 „áÉ!\!@ ‰†aÙ@U~§a°…ŒñdjUäA* B!r!` E XEKxè • A!.Að=Î%AòÂBnˆAË n0 ! Áša· ô Ee -`$ÚŽ!Ò ,† a˜q2 ÖÝÌf ½àåUý8!oaÅAÊ5Œ„åA| ¡–+’S nc ÅJ1"œÞañ%v&¶ÁCa„!è"’ c! BµØu!,a†¡± n¥–q‹up%v¡lÁb"< ¡‘A5u Bü¡:!"AÚ ŽA[AÑaÎ!¿ B³Ÿ!2!> ,ÕÉs X¡ ²!{5,laAQªÁòx¡ ,AAßÙ\A Ae°1¸Ê%F¡ouÞ!J!!ª¯XAº!2V!\a\!Ð ,Žajaa‰ A~¡$û !­œa r nDe…ø Aà:6a ,A5á1á]Ã"@–$J94ü%ÿ"^ a9%sa¹(õ !I*6eÊ!!?1vIá“-t/Eê™Ð…“!µ"dÁÝAåÜ Aâ ò!náŠe" EeÌõò¡"!{ B!¯q­A* …É!‘a[„üA'¥5: \ aä­ BŒ –Eš naèAhaÍab ,ðÁ?©AÇ *¾)Uª±I a*>e÷ÁÍ B'N!½!@ Â% q": A`!o"#!·AÙ Á BU×> E`A5U‰%^å1`fÁ! ,cÁ!`ˆ X ‰Õ A1á:•LYAaÔ ,›j¡k"æ!JaÛeã9Î!1aÚ) nÁQóIAÜ XaeÅE*µ(eXtE ,%K!]¹î!÷a³í}p!AÙÒ!¸aŠ!L!cXí‡Åù À :ŒA) !‚Û%¸n!B%vá$"^  !ÊÇ_ B:A‰ A® ¡6—¨5ŒÔá©…©"„ )AA14)vE,! XamIØÆ BØl UÀ%Ìa¬ °aóá4Æ×!çD -¢ A¡©!a ÜAx…e "¾ AMx¡¬H ,>ˆ ÁÊAÉ aíðI•EH!İy¡XÁ-"ÂE%ÁE«14hŽ T naA`‰A² !¢r!"v A"•»°¬•A— B%®Á*!vùz<¥˜áü ÚÉ!4Aø B!,D !¤` ¡Øf ô ÃAW¢ ;!£¡v Ar!v!8! ï!(‰‘&!ÂQh–2 !G¡4 ,a“A9UF AŠ!Yˆ"At[AS,' š Âa@a cº •¤EÀŶ!ŽQª£a!û>Báä Æ¡×¡¥E?"Ö a RA 2š¡¹}à BAòø 4 °%l oA !ˆ;¹! áŒ!å!ŠYÖó_áÔuZaÚ1Ì B…³( ]„%¶‰A©1ÎAª…Ðã"ˆ…b¡š…9¸‰"a Xå1+%:q²ARÁAÛ! šai!µ¼ qÈEì àuÞ~Ž‘ºÁ°á7‡"” A%lXaœ‹: AE „áA 0¹Â!ËÁ± ƒÜ» aÁar"\A_AéIWf |Ápò"ì !ÊAèÁÁÍ„‘µ%Ø RaSAeÆaèÁJ%s"ø '%ÌA¿*„ÚIAaÍ X£ !3„!åAå_Õ!òTE¬" ¡¾%¡Ä"„ —…–•æ!ŒAAèX²VAS„…ug1nä! È-×- atq.åp¥²%) òœ Aç!Ö5 ˜ )a6 !jaf‹ Ã…ÁÓ": ÁøaÚA² ,!,Za± .:Aþ j ¡AÁ!’  àJ¡l Iaø!R ‰³A¯q dž«1¬0 !Ön ,!Êa…\5ú6! "XI %ø¡· nÁ€9 X¡d Ð, aØ¡ƒq.RA ! ,!ù îa| ¡Ô)!ùÙˆz)‘, š–e×õ>Á?%ÊB¿%ó!b&œ%BÁAö~ | áûw,‹!"™¡Ã °!\¤i^Œ 5A`A½Ý´eA¬!S"²Å;%á¿™ü)³ˆºï¡Ýˆ&ˆ%]…a-Œv +E"ôAú%÷Y1äAža‚á Ü®a@AzÑ Wˆe6òAåAûß"VEarHõd,\ ™üA;¼5!¢aó\!× „¡g!]aã! Å?…Ò!3¢ ej†±î©AR?!®B¡ÑAŽUÀ’apA="l!€á‰Í!” BM!C¡!’ ¥êIW¡Ä ,AÌ-¡ ÆÁAvE’"`-AÖ%Œaß9v¥ªaúŸ1ÎiA! ÜÁ¨%£¡%ùè!Ýß!w&¢ E=AƒÞ B!vA ýa Ü"H ÌaJ á!Ç› 5ÎAŸÉ‡æ°½A4x B¡%AÚ%ÒYª›Ö!éø X…a‹=4!îùÆá·!÷ßaÐ nA\ alÁh Ñ¡Ý*Ì¡%!ã1ÎaÅ7Õà!œaüÜ!4!Æá n¡^º¡X! a'Á]Gé !å¡ç!]U&E»AM "Î %Ãá•5v!¤ aÊ"hŒ A¬A] nØ!1!}F œ‹aÉy.&]!45¸fÆg BZ !ô‘º!!ž\A ,!AÔá`Aƒ Áá²ó*2 Õ¬25ú!!Ca`uE !=54î¬A;¡Ü nñÐ A"p9$µ# ,ÆA!– PEÚ)Ô ÜÁm;e6u†ê·5 B!µA€‡ù a²¡ÃióM&AJÁn’  ,)Ä!ñN¬a(aE5 ,! ñ"éKÚ ù ,áè¤/ aV¥ß5Œ{œÕžaÞaõá»a¹ Bï!o!Žõ8: !FàA˜ ,E&!L°AΡr,eÛh5ű‰!‚ Xá!Ë™LAwa+UÀ!´A!èA  B)™EíãM!rAÁþ· ,!*Á·  )¡ÁÉaû a®sÅN" e%aZµ(¡$_ åQ~Ű;kUI½¼ !",)õ2eˆ ÜÅ! Å÷õz$ H+Ý °EÁˆ&h a¥—A™1¢ÅÅAüe.¹î„!¨…d„¡ៅ"°Acu!&Ä!Þ¬I¯Ñˆá…amÁÝA‚ °ÿ±! &Œ"›Ÿ ÕTA¸©–"@A÷AåU"ˆ«¡òaJ n@!ÝÀy ‹²a&ØaÓÅé9®A}ð14:Að¥VE ¡Ç%a‚aWž£„_œešd !Ëa¡„!ô,a+uôa†!]•a XA¡ÁEÉ8Xa“!¹äÕž!—!´XAè!”URáda7 ! nëaE¡"ò a‘ÅŒÅN"2 ¡ë!¦ , aÐ t ´)!Ô¡a¹ •eA¾=` ž ÁÜÅ8 Bé…’!"Ô !·AÄ¡ØÁ ,¥áÖ¯"Ì áÊÁVb ,%Z `qÈ!õ¡U!JÁù ,!ÏAÿ!ÓU<„Á›JAÈ ,AáN.Ö”?‡"J aðA£A°µ–ï Ü/ X!s¡’!s!© iAªaµ@!ˆ!F!^9Œa&År!"Ìáš‚ ‰išÁ¡ëAO"t òÞeLÙ´I=$ü °Ac!KAô§ °!C‰ ‘6Az!þ!$5 ,AÕœ °9 !+%AÀ• â aUXÁý ,!u%á!Ð"š !ÆAÕáQ ,$aI… ‚a*!òaæ , !%Ìy²ÁÁ²Až%Òa»*2 Ö0!a54Á!÷%§‘x!>êalŒ „¡_~ÅœÕÂeÆM ,Ü¥B£"ý黌4 ¡P%¸yœØ!]K*.I¾% uDš!ÏH!U „ÁÜò EÓuD;!4¡i# ,¼á‹÷ A9A¹· YÀ!âA€•üý!å"*!ÇáH!8 Xɶ ›J 6Aìab!! ^ ¥C•b)'–B5a URaÚ žA¨,7e>áÕ š!Óa¼¹(Ù!Ì%ü šÐ > QO!]¡Æ ,EÄs"ú i=ÁËeˆ X…ßÑ!ÁYA«%Ë! Qªa†áI¡ÃA n!ah%v"Í! \¡F ,2 ¦! ÆaðA!vY&!JÁ¢AhA' BAžA ! °%±!¼ "š ,¥kÁ\.˜!úAà Æ|A !a¸ n%AåÅÿuDY…a¡1J¡7ÜA!y B»ï µjE¼E–¥œ Ü!ä!`¡g³ B%)9E„ A¼Ah!v¹ eaa\•¤A%ÒaÅ"DA4!Óö Bè!Ï€,eõE…§ ,!-„…–õ¼+Ah÷54!áa&˜¡ª¿!O"†ÄmÁÊ"V¡ê·£ °a– E‚&2 ã át¡ò ¼árA8Áä Ba‚Ü_,A0’-A  ,!0 AZ iJ M1În!…Cõþ¥b!õ Õ0Á¡ÎAt XAyál !WA;!â ![O ¡…z !s)J áŒ!0%c"¢ ÁCANIAÝ ,„Aý!8 ¡°!Ž5¢¨aSAac ,!A¢!a zAî!ñ}áé!h[ , $t!¤ AµÀA  ,Ô!Í¡, !aœI*1¢VƒN ,)ÁHeDqÞ!¢áÌ%NUìARÙ±"€A"%d®Ü!Ba61 n_¡†" iĦ åì-¸jÉ " Aÿ%váûµ¬¡H!on n±…P4õèÁÂ!-¡ä ,!Ãe%c BÙAUá4» ,!­î!!Ð AÒEìÁà"< !nA½E«"V¥)!^YA2Aï¤&H þaTÞ °!*¡ËU”a¦EaùB&dB #a` ò¡^ ±!è ܵÜá a¤qñAYñþ ›!#5¢…³%.Amnaéi ᥠXa!F$ A— a•!Ü!_aº “G!Ë"¼!¢EÿeÑö»U%ØB-W/ XêáA~ !DEÏEØòÉ›Áô*Qaª!  nÁ­a0e5Œë¡Y!i&ÆÁ>{¥µUhAáe!»BAu[EeBê!dE» „è-A„ !(A“!0 c!´!è ½Õ S!è aèiC qÈ™I±.N8AAGTGCATCTACA-1„Ž,€N6(TTGTTTGTGTAAATTC-1AAACAACGAATAGTTC-1Â?ôÁ€N  €@ €8 (€À€x H€ @*€¸ h€ À:€ø ˆ€@J€ 8( ¨€ÀZ€ x0 È€@j€ ¸8 è€Àz€ø@ !@Š€8H (%Àš€xP H)@ª€¸X h-Àº€ø` ˆ1@Ê€8h ¨5ÀÚ€xp È9@ꀸx è=Àú€ø€ ‚A@ !8ˆ (‚EÀ#x H‚I@ *%¸˜ h‚MÀ :'ø  ˆ‚Q@ J)8¨ ¨‚UÀ Z+x° È‚Y@ j-¸¸ è‚]À z/øÀ ƒa@ Š18È (ƒeÀ š3xÐ Hƒi@ ª5¸Ø hƒmÀ º7øà ˆƒq@Ê98è ¨ƒuÀÚ;xð ȃy@ê=¸ø èƒ}Àú?ø! „@ ‚A8!!(„…À‚Cx!"H„‰@*‚E¸!#h„À:‚Gø !$ˆ„‘@J‚I8 (!%¨„•ÀZ‚Kx 0!&È„™@j‚M¸ 8!'è„Àz‚Oø @!(…¡@Š‚Q8 H!)(…¥Àš‚Sx P!*H…©@ª‚U¸ X!+h…­Àº‚Wø `!,ˆ…±@Ê‚Y8 h!-¨…µÀÚ‚[x p!.È…¹@ê‚]¸ x!/è…½Àú‚_ø €!0†Á@ ƒa8 ˆ!1(†ÅÀƒcx !2H†É@*ƒe¸ ˜!3h†ÍÀ:ƒgø  !4ˆ†Ñ@Jƒi8 ¨!5¨†ÕÀZƒkx °!6ȆÙ@jƒm¸ ¸!7è†ÝÀzƒoø À!8‡á@Šƒq8È!9(‡åÀšƒsxÐ!:H‡é@ªƒu¸Ø!;h‡íÀºƒwøà!<ˆ‡ñ@ʃy8è!=¨‡õÀÚƒ{xð!>ȇù@êƒ}¸ø!?è‡ýÀúƒø"@ˆA „8"A(ˆÁ „ƒx"BHˆ A!*„…¸"Chˆ Á!:„‡ø "DˆˆA"J„‰8("E¨ˆÁ"Z„‹x0"FȈA#j„¸8"GèˆÁ#z„ø@"H‰!A$Š„‘8H"I(‰%Á$š„“xP"JH‰)A%ª„•¸X"Kh‰-Á%º„—ø`"Lˆ‰1A&Ê„™8h"M¨‰5Á&Ú„›xp"Nȉ9A'ꄸx"Oè‰=Á'ú„Ÿø€"PŠAA( …¡8ˆ"Q(ŠEÁ(…£x"RHŠIA)*…¥¸˜"ShŠMÁ):…§ø "TˆŠQA*J…©8¨"U¨ŠUÁ*Z…«x°"VÈŠYA+j…­¸¸"WèŠ]Á+z…¯øÀ"X‹aA,Š…±8È"Y(‹eÁ,š…³xÐ"ZH‹iA-ª…µ¸Ø"[h‹mÁ-º…·øà"\ˆ‹qA.Ê…¹8è"]¨‹uÁ.Ú…»xð"^È‹yA/ê…½¸ø"_è‹}Á/ú…¿ø#`ŒA0 †Á8#a(Œ…Á0†Ãx#bHŒ‰A1*†Å¸#chŒÁ1:†Çø #dˆŒ‘A2J†É8(#e¨Œ•Á2Z†Ëx0#fÈŒ™A3j†Í¸8#gèŒÁ3z†Ïø@#h¡A4ІÑ8H#i(¥Á4š†ÓxP#jH©A5ª†Õ¸X#kh­Á5º†×ø`#lˆ±A6ʆÙ8h#m¨µÁ6Ú†Ûxp#nȹA7ê†Ý¸x#oè½Á7ú†ßø€#pŽÁA8 ‡á8ˆ#q(ŽÅÁ8‡ãx#rHŽÉA9*‡å¸˜#shŽÍÁ9:‡çø #tˆŽÑA:J‡é8¨#u¨ŽÕÁ:Z‡ëx°#vÈŽÙA;j‡í¸¸#wèŽÝÁ;z‡ïøÀ#xáA<Їñ8È#y(åÁ<š‡óxÐ#zHéA=ª‡õ¸Ø#{híÁ=º‡÷øà#|ˆñA>ʇù8è#}¨õÁ>Ú‡ûxð#~ÈùA?ê‡ý¸ø#èýÁ?ú‡ÿø$€B@ ˆ9 $(Â@ˆy $‚H BA*ˆ¹ $ƒh ÂA:ˆù $„ˆBBJˆ 9!($…¨ÂBZˆ y!0$†ÈBCjˆ ¹!8$‡èÂCzˆù!@$ˆ‘!BDŠˆ9"H$‰(‘%ÂDšˆy"P$ŠH‘)BEªˆ¹"X$‹h‘-ÂEºˆù"`$Œˆ‘1BFʈ9#h$¨‘5ÂFÚˆy#p$ŽÈ‘9BGꈹ#x$è‘=ÂGúˆù#€$’ABH ‰!9$ˆ$‘(’EÂH‰#y$$’H’IBI*‰%¹$˜$“h’MÂI:‰'ù$ $”ˆ’QBJJ‰)9%¨$•¨’UÂJZ‰+y%°$–È’YBKj‰-¹%¸$—è’]ÂKz‰/ù%À$˜“aBLЉ19&È$™(“eÂLš‰3y&Ð$šH“iBMª‰5¹&Ø$›h“mÂMº‰7ù&à$œˆ“qBNʉ99'è$¨“uÂNÚ‰;y'ð$žÈ“yBOê‰=¹'ø$Ÿè“}ÂOú‰?ù'% ”BP ŠA9(%¡(”…ÂPŠCy(%¢H”‰BQ*ŠE¹(%£h”ÂQ:ŠGù( %¤ˆ”‘BRJŠI9)(%¥¨”•ÂRZŠKy)0%¦È”™BSjŠM¹)8%§è”ÂSzŠOù)@%¨•¡BTŠŠQ9*H%©(•¥ÂTšŠSy*P%ªH•©BUªŠU¹*X%«h•­ÂUºŠWù*`%¬ˆ•±BVÊŠY9+h%­¨•µÂVÚŠ[y+p%®È•¹BWêŠ]¹+x%¯è•½ÂWúŠ_ù+€%°–ÁBX ‹a9,ˆ%±(–ÅÂX‹cy,%²H–ÉBY*‹e¹,˜%³h–ÍÂY:‹gù, %´ˆ–ÑBZJ‹i9-¨%µ¨–ÕÂZZ‹ky-°%¶È–ÙB[j‹m¹-¸%·è–ÝÂ[z‹où-À%¸—áB\Š‹q9.È%¹(—åÂ\š‹sy.Ð%ºH—éB]ª‹u¹.Ø%»h—íÂ]º‹wù.à%¼ˆ—ñB^Ê‹y9/è%½¨—õÂ^Ú‹{y/ð%¾È—ùB_ê‹}¹/ø%¿è—ýÂ_ú‹ù/&À˜C` Œ90&Á(˜Ã`Œƒy0&ÂH˜ Ca*Œ…¹0&Ãh˜ Ãa:Œ‡ù0 &Ĉ˜CbJŒ‰91(&Ũ˜ÃbZŒ‹y10&ÆÈ˜CcjŒ¹18&Çè˜ÃczŒù1@&È™!CdŠŒ‘92H&É(™%ÃdšŒ“y2P&ÊH™)CeªŒ•¹2X&Ëh™-ÃeºŒ—ù2`&̈™1CfÊŒ™93h&ͨ™5ÃfÚŒ›y3p&ÎÈ™9Cgꌹ3x&Ïè™=ÃgúŒŸù3€&КACh ¡94ˆ&Ñ(šEÃh£y4&ÒHšICi*¥¹4˜&ÓhšMÃi:§ù4 &ÔˆšQCjJ©95¨&Õ¨šUÃjZ«y5°&ÖÈšYCkj­¹5¸&×èš]Ãkz¯ù5À&Ø›aClб96È&Ù(›eÃlš³y6Ð&ÚH›iCmªµ¹6Ø&Ûh›mÃmº·ù6à&܈›qCnʹ97è&ݨ›uÃnÚ»y7ð&ÞÈ›yCoê½¹7ø&ßè›}Ãoú¿ù7'àœCp ŽÁ98'á(œ…ÃpŽÃy8'âHœ‰Cq*ŽÅ¹8'ãhœÃq:ŽÇù8 '䈜‘CrJŽÉ99('娜•ÃrZŽËy90'æÈœ™CsjŽÍ¹98'çèœÃszŽÏù9@'è¡CtŠŽÑ9:H'é(¥ÃtšŽÓy:P'êH©CuªŽÕ¹:X'ëh­ÃuºŽ×ù:`'숱CvÊŽÙ9;h'í¨µÃvÚŽÛy;p'îȹCwêŽÝ¹;x'ïè½ÃwúŽßù;€'ðžÁCx á9<ˆ'ñ(žÅÃxãy<'òHžÉCy*å¹<˜'óhžÍÃy:çù< 'ôˆžÑCzJé9=¨'õ¨žÕÃzZëy=°'öÈžÙC{jí¹=¸'÷èžÝÃ{zïù=À'øŸáC|Šñ9>È'ù(ŸåÃ|šóy>Ð'úHŸéC}ªõ¹>Ø'ûhŸíÃ}º÷ù>à'üˆŸñC~Êù9?è'ý¨ŸõÃ~Úûy?ð'þÈŸùCêý¹?ø'ÿèŸýÃúÿù?(  D€ :@() Ä€z@(I  D*º@(i  Ä:ú@ (‰ D‚J :A((© Ä‚Z zA0(É Dƒj ºA8(é ăzúA@( ¡!D„Š:BH( )¡%Ä„šzBP( I¡)D…ªºBX( i¡-Ä…ºúB`( ‰¡1D†Ê:Ch( ©¡5ĆÚzCp(É¡9D‡êºCx(é¡=ćúúC€( ¢ADˆ ‘!:Dˆ()¢EĈ‘#zD(I¢ID‰*‘%ºD˜(i¢Mĉ:‘'úD (‰¢QDŠJ‘):E¨(©¢UÄŠZ‘+zE°(É¢YD‹j‘-ºE¸(é¢]Ä‹z‘/úEÀ( £aDŒŠ‘1:FÈ()£eÄŒš‘3zFÐ(I£iDª‘5ºFØ(i£mĺ‘7úFà(‰£qDŽÊ‘9:Gè(©£uÄŽÚ‘;zGð(É£yDê‘=ºGø(é£}Äú‘?úG) ¤D ’A:H)!)¤…Ä’CzH)"I¤‰D‘*’EºH)#i¤Ä‘:’GúH )$‰¤‘D’J’I:I()%©¤•Ä’Z’KzI0)&ɤ™D“j’MºI8)'é¤Ä“z’OúI@)( ¥¡D”Š’Q:JH)))¥¥Ä”š’SzJP)*I¥©D•ª’UºJX)+i¥­Ä•º’WúJ`),‰¥±D–Ê’Y:Kh)-©¥µÄ–Ú’[zKp).É¥¹D—ê’]ºKx)/饽ėú’_úK€)0 ¦ÁD˜ “a:Lˆ)1)¦ÅĘ“czL)2I¦ÉD™*“eºL˜)3i¦ÍÄ™:“gúL )4‰¦ÑDšJ“i:M¨)5©¦ÕÄšZ“kzM°)6ɦÙD›j“mºM¸)7é¦ÝÄ›z“oúMÀ)8 §áDœŠ“q:NÈ)9)§åÄœš“szNÐ):I§éDª“uºNØ);i§íĺ“wúNà)<‰§ñDžÊ“y:Oè)=©§õÄžÚ“{zOð)>ɧùDŸê“}ºOø)?é§ýÄŸú“úO*@ ¨E  ”:P*A)¨Å ”ƒzP*BI¨ E¡*”…ºP*Ci¨ Å¡:”‡úP *D‰¨E¢J”‰:Q(*E©¨Å¢Z”‹zQ0*FɨE£j”ºQ8*Gé¨Å£z”úQ@*H ©!E¤Š”‘:RH*I)©%Ťš”“zRP*JI©)E¥ª”•ºRX*Ki©-Å¥º”—úR`*L‰©1E¦Ê”™:Sh*M©©5Ŧڔ›zSp*NÉ©9E§ê”ºSx*Oé©=ŧú”ŸúS€*P ªAE¨ •¡:Tˆ*Q)ªEŨ•£zT*RIªIE©*•¥ºT˜*SiªMÅ©:•§úT *T‰ªQEªJ•©:U¨*U©ªUŪZ•«zU°*VɪYE«j•­ºU¸*Wéª]Å«z•¯úUÀ*X «aE¬Š•±:VÈ*Y)«eŬš•³zVÐ*ZI«iE­ª•µºVØ*[i«mÅ­º•·úVà*\‰«qE®Ê•¹:Wè*]©«uŮڕ»zWð*^É«yE¯ê•½ºWø*_é«}ůú•¿úW+` ¬E° –Á:X+a)¬…Ű–ÃzX+bI¬‰E±*–źX+ci¬Å±:–ÇúX +d‰¬‘E²J–É:Y(+e©¬•ŲZ–ËzY0+fɬ™E³j–ͺY8+gé¬Å³z–ÏúY@+h ­¡E´Š–Ñ:ZH+i)­¥Å´š–ÓzZP+jI­©Eµª–ÕºZX+ki­­Åµº–×úZ`+l‰­±E¶Ê–Ù:[h+m©­µÅ¶Ú–Ûz[p+nÉ­¹E·ê–ݺ[x+o魽ŷú–ßú[€+p ®ÁE¸ —á:\ˆ+q)®ÅŸ—ãz\+rI®ÉE¹*—åº\˜+si®ÍŹ:—çú\ +t‰®ÑEºJ—é:]¨+u©®ÕźZ—ëz]°+vÉ®ÙE»j—íº]¸+wé®ÝÅ»z—ïú]À+x ¯áE¼Š—ñ:^È+y)¯åżš—óz^Ð+zI¯éE½ª—õº^Ø+{i¯íŽº—÷ú^à+|‰¯ñE¾Ê—ù:_è+}©¯õžڗûz_ð+~ɯùE¿ê—ýº_ø+é¯ýÅ¿ú—ÿú_,€ °FÀ ˜;`,)°ÆÀ˜{`,‚I° FÁ*˜»`,ƒi° ÆÁ:˜û` ,„‰°FÂJ˜ ;a(,…©°ÆÂZ˜ {a0,†É°FÃj˜ »a8,‡é°ÆÃz˜ûa@,ˆ ±!FÄŠ˜;bH,‰)±%ÆÄš˜{bP,ŠI±)FŪ˜»bX,‹i±-ÆÅº˜ûb`,Œ‰±1FÆÊ˜;ch,©±5ÆÆÚ˜{cp,ŽÉ±9FÇ꘻cx,é±=ÆÇú˜ûc€, ²AFÈ ™!;dˆ,‘)²EÆÈ™#{d,’I²IFÉ*™%»d˜,“i²MÆÉ:™'ûd ,”‰²QFÊJ™);e¨,•©²UÆÊZ™+{e°,–ɲYFËj™-»e¸,—é²]ÆËz™/ûeÀ,˜ ³aFÌŠ™1;fÈ,™)³eÆÌš™3{fÐ,šI³iFͪ™5»fØ,›i³mÆÍº™7ûfà,œ‰³qFÎÊ™9;gè,©³uÆÎÚ™;{gð,žÉ³yFÏê™=»gø,Ÿé³}ÆÏú™?ûg-  ´FÐ šA;h-¡)´…ÆÐšC{h-¢I´‰FÑ*šE»h-£i´ÆÑ:šGûh -¤‰´‘FÒJšI;i(-¥©´•ÆÒZšK{i0-¦É´™FÓjšM»i8-§é´ÆÓzšOûi@-¨ µ¡FÔŠšQ;jH-©)µ¥ÆÔššS{jP-ªIµ©FÕªšU»jX-«iµ­ÆÕºšWûj`-¬‰µ±FÖÊšY;kh-­©µµÆÖÚš[{kp-®Éµ¹F×êš]»kx-¯éµ½Æ×úš_ûk€-° ¶ÁFØ ›a;lˆ-±)¶ÅÆØ›c{l-²I¶ÉFÙ*›e»l˜-³i¶ÍÆÙ:›gûl -´‰¶ÑFÚJ›i;m¨-µ©¶ÕÆÚZ›k{m°-¶É¶ÙFÛj›m»m¸-·é¶ÝÆÛz›oûmÀ-¸ ·áFÜŠ›q;nÈ-¹)·åÆÜš›s{nÐ-ºI·éFݪ›u»nØ-»i·íÆÝº›wûnà-¼‰·ñFÞÊ›y;oè-½©·õÆÞÚ›{{oð-¾É·ùFßê›}»oø-¿é·ýÆßú›ûo.À ¸Gà œ;p.Á)¸Çàœƒ{p.ÂI¸ Gá*œ…»p.Ãi¸ Çá:œ‡ûp .ĉ¸GâJœ‰;q(.Å©¸ÇâZœ‹{q0.ÆÉ¸Gãjœ»q8.Çé¸Çãzœûq@.È ¹!G䊜‘;rH.É)¹%Çäšœ“{rP.ÊI¹)G媜•»rX.Ëi¹-Ç府—ûr`.̉¹1GæÊœ™;sh.Í©¹5ÇæÚœ›{sp.Îɹ9Gçꜻsx.Ïé¹=ÇçúœŸûs€.Ð ºAGè ¡;tˆ.Ñ)ºEÇè£{t.ÒIºIGé*¥»t˜.ÓiºMÇé:§ût .Ô‰ºQGêJ©;u¨.Õ©ºUÇêZ«{u°.ÖɺYGëj­»u¸.×éº]Çëz¯ûuÀ.Ø »aG슱;vÈ.Ù)»eÇìš³{vÐ.ÚI»iGíªµ»vØ.Ûi»mÇíº·ûvà.܉»qGîʹ;wè.Ý©»uÇîÚ»{wð.ÞÉ»yGïê½»wø.ßé»}Çïú¿ûw/à ¼Gð žÁ;x/á)¼…ÇðžÃ{x/âI¼‰Gñ*žÅ»x/ãi¼Çñ:žÇûx /䉼‘GòJžÉ;y(/婼•ÇòZžË{y0/æÉ¼™GójžÍ»y8/çé¼ÇózžÏûy@/è ½¡GôŠžÑ;zH/é)½¥ÇôšžÓ{zP/êI½©GõªžÕ»zX/ëi½­Çõºž×ûz`/쉽±GöÊžÙ;{h/í©½µÇöÚžÛ{{p/îɽ¹G÷êžÝ»{x/ïé½½Ç÷úžßû{€/ð ¾ÁGø Ÿá;|ˆ/ñ)¾ÅÇøŸã{|/òI¾ÉGù*Ÿå»|˜/ói¾ÍÇù:Ÿçû| /ô‰¾ÑGúJŸé;}¨/õ©¾ÕÇúZŸë{}°/öɾÙGûjŸí»}¸/÷é¾ÝÇûzŸïû}À/ø ¿áGüŠŸñ;~È/ù)¿åÇüšŸó{~Ð/úI¿éGýªŸõ»~Ø/ûi¿íÇýºŸ÷û~à/ü‰¿ñGþÊŸù;è/ý©¿õÇþÚŸû{ð/þÉ¿ùGÿêŸý»ø/ÿé¿ýÇÿúŸÿû0 ÀH  <€0*ÀÈ |€0JÀ H+ ¼€0jÀ È; ü€ 0ŠÀHK  <(0ªÀÈ[  |00ÊÀHk  ¼80êÀÈ{ ü@0 Á!H‹ <‚H0 *Á%È› |‚P0 JÁ)H« ¼‚X0 jÁ-È» ü‚`0 ŠÁ1HË <ƒh0 ªÁ5ÈÛ |ƒp0ÊÁ9Hë ¼ƒx0êÁ=Èû üƒ€0 ÂAH ¡!<„ˆ0*ÂEÈ¡#|„0JÂIH +¡%¼„˜0jÂMÈ ;¡'ü„ 0ŠÂQH K¡)<…¨0ªÂUÈ [¡+|…°0ÊÂYH k¡-¼…¸0êÂ]È {¡/ü…À0 ÃaH ‹¡1<†È0*ÃeÈ ›¡3|†Ð0JÃiH «¡5¼†Ø0jÃmÈ »¡7ü†à0ŠÃqHË¡9<‡è0ªÃuÈÛ¡;|‡ð0ÊÃyHë¡=¼‡ø0êÃ}Èû¡?ü‡1 ÄH ¢A<ˆ1!*Ä…È¢C|ˆ1"JĉH+¢E¼ˆ1#jÄÈ;¢Güˆ 1$ŠÄ‘HK¢I<‰(1%ªÄ•È[¢K|‰01&ÊÄ™Hk¢M¼‰81'êÄÈ{¢Oü‰@1( Å¡H‹¢Q<ŠH1)*ťț¢S|ŠP1*JÅ©H«¢U¼ŠX1+jÅ­È»¢WüŠ`1,ŠÅ±HË¢Y<‹h1-ªÅµÈÛ¢[|‹p1.ÊŹHë¢]¼‹x1/êŽÈû¢_ü‹€10 ÆÁH £a<Œˆ11*ÆÅÈ£c|Œ12JÆÉH+£e¼Œ˜13jÆÍÈ;£güŒ 14ŠÆÑHK£i<¨15ªÆÕÈ[£k|°16ÊÆÙHk£m¼s¸17êÆÝÈ{£oüÀ18 ÇáH‹£q<ŽÈ19*ÇåÈ›£s|ŽÐ1:JÇéH«£u¼ŽØ1;jÇíÈ»£wüŽà1<ŠÇñHË£y<è1=ªÇõÈÛ£{|ð1>ÊÇùHë£}¼ø1?êÇýÈû£ü2@ ÈI ¤<2A*ÈÉ ¤ƒ|2BJÈ I!+¤…¼2CjÈ É!;¤‡ü 2DŠÈI"K¤‰<‘(2EªÈÉ"[¤‹|‘02FÊÈI#k¤¼‘82GêÈÉ#{¤ü‘@2H É!I$‹¤‘<’H2I*É%É$›¤“|’P2JJÉ)I%«¤•¼’X2KjÉ-É%»¤—ü’`2LŠÉ1I&ˤ™<“h2MªÉ5É&Û¤›|“p2NÊÉ9I'뤼“x2OêÉ=É'û¤Ÿü“€2P ÊAI( ¥¡<”ˆ2Q*ÊEÉ(¥£|”2RJÊII)+¥¥¼”˜2SjÊMÉ);¥§ü” 2TŠÊQI*K¥©<•¨2UªÊUÉ*[¥«|•°2VÊÊYI+k¥­¼•¸2WêÊ]É+{¥¯ü•À2X ËaI,‹¥±<–È2Y*ËeÉ,›¥³|–Ð2ZJËiI-«¥µ¼–Ø2[jËmÉ-»¥·ü–à2\ŠËqI.Ë¥¹<—è2]ªËuÉ.Û¥»|—ð2^ÊËyI/륽¼—ø2_êË}É/û¥¿ü—3` ÌI0 ¦Á<˜3a*Ì…É0¦Ã|˜3bJ̉I1+¦Å¼˜3cjÌÉ1;¦Çü˜ 3dŠÌ‘I2K¦É<™(3eªÌ•É2[¦Ë|™03fÊÌ™I3k¦Í¼™83gêÌÉ3{¦Ïü™@3h Í¡I4‹¦Ñ<šH3i*Í¥É4›¦Ó|šP3jJÍ©I5«¦Õ¼šX3kjÍ­É5»¦×üš`3lŠÍ±I6˦Ù<›h3mªÍµÉ6Û¦Û|›p3nÊ͹I7ë¦Ý¼›x3oêͽÉ7û¦ßü›&ðÍ 5barcode€Nª´èÍ&âÍ&6(TTGTTTGTGTAAATTC-1AAACAACGAATAGTTC-1,Lž ¨ ,€N(ôŽ€NH6¢ÎÎi]Ôy bZØO·Yn¤G~cÙ¤›‰[{¤9cV£÷_nØËà À½~/7Å^<ö3°»‹×NI·ŸíJ<Ì’ã!Ò¸“RA^$@…)œW¤>E¿vUÑyîJG{ì¢_ؤµ;˜M5:;Öø†JïÄètß—HØæ"›Ãt×Åj¾ŸTì;ì½jhÀî¨â„-…cä[¥YØÔåOçJÆs¢òÓ¼d§ ðu¬iÙ‰»2j„HÆÎÂMie«Ä£zC€†é¯¸‹´èx ™‹Ó9…oOCW%u‹ª—}–Cxí6$Ù^ŒXÚË#q t}¹¥Gå”;îXˆjÛ…Ý Z~«çx~VùT¡¼q5>¬ò’구V;{Æüˆ¹áÊ¥‹Ô×-Æ‚Êv=“L¾:"˜•W>áYmYu5‚G‚Üo¹×´=‹ƒÖmë°æ†_6zö÷H‘ü5uí‚ð"¦,ah÷ŠãM¾c‚ZÂ`D8R8Tã}¿ ‰ˆa øOŽàÊO?{œNKZ\Ïoš)в2‡Öl·K¹do€Ÿy¢Í `2 iSÖ‹*wZ-¶œCçAá÷Rp! BèmøsÊ ân;"«%>ž’"jý„ìí¶ÓJ¤âáš@®DœœC>Ó“åAqÆôx#[Õñxabëß,W#3‹nÝâñœ2&öÚ5 in_tissue€Nª ¸ &îÏ&¾Ï(,˜ LÆŒ Ðï›eAEs<V%(ð[΃PÏv‹øàj u-A·?9Ô}´_Dô+v™?H êY˜²S„‡ó¤Üq'n‡ˆ hx“b»T’ ©r8t4IŸ\Z"Oikc×C½“^_S; iQd@†B^O&,mF |¢ú‘¡›9>ȰºíŽF5TÇR#!Ýn2…Y‚E{ާ-0ñˆÄ;,(Q¥R\û3`KäÁ–6 užDŒÓØ.œa5g&ÛçI±âbëÚ%0Þ š•Z„H$ÿŠM¬< ËzW¦L~6/c pmG7]É+l” 8@"]¡™žroNÀ}=jÂ#Öùœ®a˜þýxJz‰¹p ü2!BÍ*Œy š—¶=£$(‚d`³gfLGhDŸy÷ª­Ñ¿…¢11ãÅ[”ÐU[îX3 Wlt'k+{Ê«Ùsò€¾:w•ÉÒì|q†’*V߃K.oŒðµ)/:‘NôwåÕX¼CöÆP¯è€Ìéf¸õ–>æŠU¨)ð~á7JM—„XŽX,€N¢(¢‚,ô€N @ €(XÀ ƒ"H˜@¡‚… 2hØ`a‡>€!b‰&N H¡b…-\¼ #†Œ4jظ#‡ŽÑ+ÛF+ZŠwTE´*Hs4 Ðò ¸¤Ý’~S‘GéGù\ ‘íØRCL7¬b‡áOS^ByÚÔZÕÜA•Ôà]5@"æH U4ꎤRL¥2‰Õª’’X•qµ)œ ’ÁšU’>eH¨ $ I›Öa ·9Ú¨Ó# ¸L¦ì4IM¢¨Ã ǵkÔ—/zåøËÖÒ|®½/ÀĦo`2£Hq„ePìX3‚Èšä§,Žž%%BŒg6‹9(>‹ðiLÎYb+®Ez÷ï#Ú´cÕú»–K™YM|#x0Û‚ÝÚFsK‡ÍÛ7¤à’ìÐÃ4°zú˜×AÏ[r)ÌÍç@š78дõ¶kí~¡>õIÕÏ,‘çèjËqÊS•øÉáY30´ }QE¥¨î1dÊÐ. / k’üYZ¶5\hеíÍ]¼fÜ ÆPà½3GIRËDwtožÉ»]0SuÕÓ»—ï[bxÚçvϳt+~9IwwÖÙ3†ŽPaÑÔ*Pæ6;Á¤= 3õmÈó\‡B.˜È 5%ù]£VÖ_½A¤ S+b†ÁIGjO\‚‹Þ Ω€SD¦, ˜¥Éôp´£)Êqj »*l–­¬²ˆ9;Ë+O¤ »š¦•R by¶XÇ0šÃJ,4‹xdU§^%ø•B5K5hå¾áîK+ìË]Wµ0„E“<&~R¼èSÀ‰üzé+s'j>®`—dq“XïLÄÇ8 Î7i2üªgS@CQ}n÷s,Û}´Ù-ô¨ ¡·¬f%s0Ç”¦½R`ÅX(GM`¸(µk¥<<’ Ã[7’Á£(b¤Pénãmýh+3j^£°ñ¬Åéø¦ «ø4nMôXä©£ò*%X¥Æª"p*’Ë1r?–tøù„ ÛСsÆ6Ü@u}ͳñÊ´ l´’œìèÆ+Ää1h°1Û­Û6y[eÕµD ÖñP¢–+C“ý±0£`߀Ò(çMáN ·,ÖJäú1–ˆ‹®òíW¹h˱OÎÈÅå8%O3:LÆìºÛê¼÷¯ŽÐ,ÕtœÐ™cw³üÅ/„<'äúA\G˜N’šËcpW8ºs$úàÉÒ™E“Ñpªy Öƒ‘tßòô²år¥‘ÆÊ¡Ë ãÓH|HI£„Ù‡&*ßDl™9ç"ÈZÅÀs2]pL@´ÉŠ6C”ˆÞÖ…ŽÂ‘£)Ѹ¸Ð1³åfšñÅе..£ø„|Xx÷X“ íx !€ Ë®#¡ úÜų€CÖ˜¥ÕÂC‘mA§¡•#8ç* ú `¥xˆCBéêÁíÌ©a‡x$ê¬Â7bdö*¥©ã~e°>•©H¬0MW´¿„KŠk†ß1'òè8´ìÎ$Q¨½:5Q² Eí²Éq–V&ß°Úº5Ö96»l3&Ê_áC=“JJ‘TÑP¬¶ûTt,e)eæ­zõƒ›Ç¸B‰Ø¨ˆ¢º–:IË0g¨äÊ äöÛÄ£Ú¿›,AäÀâLnFË}M”yÎâ5Cb•á‡ÉE—²Ü8A·fFDW,ß:ˆhœ#8®Þ]Àyë,WK.›¶ \²ÈS¬ì}Cìø2?ÑØ)°æÅ JûNŠSÝW( Ͼ¤•TÀJ‚µŒ„$¥"•h– 7’óO+{ªI²Û© þÖº¦±NÃfÙhس€±ŸšM C”â>KQDŠÆ³XÕH¼JVIëˆLC³¶cAå‘™Mu®ëiŽãK®Ki·Á ¸Î+*Ô*!bzÔ¶P´ˆnŠÕ…JÔéٕщCúQœ%Lc‰Yò¤)÷ÑcM\›|«ª.Å>Kg=꫈#ÃpšÔp1Äè.‹—|üÈmD‚Aâ-ê˜&+¸caãXŽËˆÆµÄ¥Únôsf•‹-PòÜdæ»d²\eÅj«5úˆðs'òв5ŽËI43/Z¼ ÊÀ…aT…4#œÊä8ÙC1*8µR¬vÔY)P:Ã\(°nú^̰@jû­1¨ÉΙ¥*±ΠSÎyb*Qybi {ѼeÔ€æoÆ´}nQr†¿Cµ)ÍÖF)‘L-Ì‹U±òH?@R †éÂþcó˜áÇÈpFÆ+µ§mCu9`´I‘áÁð&®-–,È:‹ºÐ–—Û•NPA”0Eq;¸€xù´¨M9D¦¼"ñè)_ɵŒ²;UÑLiÕàà,1…¬%@‰mðÒÖ^{‘¬Ñ´W³„1¬¦×É Æš5¸³ÉËÂ2,ÇÀÕ(Œ¢A”Á%,,ìˆ –êõÕæÒ˜ °ŒËQ£>68>: ÁÌ”P’D 9°‡CnÇ A`ƒÄ_à7Ò"°•ì‘Õp@9½Ð³3Q–Q|G}ÎÆ™Ãöž5wDœ˜¦è˜å¥ü„i´Î‚A‘7‹j<–NÖp{G=±JlÑb癆'C°1…Ø…‰ßåZóùÊã_¡iÍA àe“#"qƳ,)ƒ|(!(H4°è‘)*/àŠ€±"¨ñÁ…‡Î”ìðJ^ªY$cíå¼3×Â2Q¥Y±Ä#XS{p¾ÄQ Ò€ìza<õh—X²¶™ K„›Ê <¡y|*î3…þüqÓ’†S´n"=s£°h(Vd™à¹†®Ø¡Œ§ÈáÕI–'lÍ;™s¾µÃ0—u¢õÆš5F~6ô‘çhÖeóÖ¡M/Ÿ€h‚@¶HÍZad1k†-ëÏÁãVv l¸˜Å!˜M)ZŠ¡KˆIè…„êHª²Ÿ|”z›œRL@ÑZTc%ÞÜTÙB%Ÿ"Z‚1ǯA ›”ÄY²ƒÞÃqY*1Ʋ¨¸2‰yÜ'IºdY:à Eè£ct× —j YÆ?±Â¥|ÌáÖ*”Õ¹L4WäRÿ€8šmˆcub:ÒÔêQ,ðv< "…Q5; yX· ÐAæ¸H(ϘÔÐÁ3'¢K#¨j!z¨Ô«˜ô <Î¥¢hZ5kC§£²9¸½ú©­lñªð[™”^¡%œk1²CÙ(Ìòj:›Ž­A÷$ijˮ' ¾º²òHÕ³‘d¥¨h°Ú8Î>38EìÁD©;7%tƒ²B–bÔÚׯ®Q?Y²°Œ@—™­Ã…’>HœÄºÍso„œÆÐø}@wEW@A´âmë—ŒT@jÁ*“PfkqŒ46‘Ý6ñ*Κµm0ƒ0l„Û •«½qޏ¸éL¬ˆ0çz†ÁCS^t! ÏÛ•†O"é~ªB*„^)>)ÈY&¯Xƒ©¤M€±"/Q >8Öpå Wm&)x fÜ>¬çlg-fóy‚)ç‡x´abF×V1@¢¤qœD>Ø‘("ãÃb¿4€J¢6x¹~>#/S?]-@´BWᎱhÈ„DˆÎWY@÷²¨È9Ëžm„’hP;Uì‰p1û‘TM_:6¥dÚu’Óõ°3T£Ì‚P7á!X ÏŸ|S,Õd¶Ò#¸{@³iÆ—›5‘Zûû–”Ö¹`»tEf"L’ª Þl!ØI\œ¡Ë:àUæ_±'û¢ø£3`ÈÜ&5°0G³dèÎÂu»ì <öìsq°/y¹é Tt@ÑÏõˆ`ÚhòM$˲ù]›çüˆV›5ݬ‡¤¨IñàYâ¿B´ØMñ,ÝšÊZ{¬LÎÜðÑ_i?Ra2iäEMÊ lõG ÍzkwÕ¥‹bJ*_ë.ûÂq+2/ <)«Ö{c±y©U¥ÌƒŽÂ:æÈj¦Ó4P0è(>9€þ\¸FHâ#NÄúéô–İa_ÀÂÇQ–JX”R™ 7¯nøáà|sê%G‹DÜS¼+´œ±:ºÔ¤((wž¶âœ” 6n¸¨ 4mÖ0ƒI’ –Î…!9&~3‡2e ŸÒ ›p¯–€= éÚáÒ[šBé„QäÚ„o)ŽòÚ»£Â}Î"ÍÝÁyò|ŒlYÝ‹?TåR€c„ÉdŒö( ‰'Í…ÃÆ!h9­raåWÞ&íÎe‚Q%%OÍ~r)¯­Ì|íûQÖV s¸¬ÕݧÂL0ft¸ R!‹`ä*"¼¥]ÂÒcÄé‡3 ‚‘¡U_[ +e ºÂ¯º>¶áHÒ¥ŒP‡:±Ƥ• ÖÂÑ!VöìÆÀ¾ÊMv䮟1ýòæw*Ö9¼v4ùƒï9ÐZY…5k¨c”(üÃÆÔÞ°4[áÖúnŽE%$˜}òc•T1£vóm*wl„å*–¿'Esµ€!®Î¬ –d)uÎ6\qôŠ—Jo±娪Å.qÎ*ÖªÂ#e¡Œü¯”›O7wªÓj\¶J¼A…É×äM5z2Ëz”Ô*˜ê‚Ûˆªð}â˜rѰÙ׊;eüö`S E.c,œCá„ Aªcq”E…5Fô„eôÙ@…'†°‘ÔüÑ1–V«1¡²ÖKqFÉâ „-]æÕè L-Zè#šS ·Á¹qVüÃÊ"%%¹¬i@ÑU¦“!‘fx.èIJs„®®KVU …9_B™Ó¤B&L°¢Zž‰fðÐ׳‰ýnpÙ9™"ΤkP°âÈ%M>kŠý|ü’‚‰ÆAen´99Ö4X-a’D’Ô5Úµ«9.Ç)c©¢'pÄ™hYÑñ£,x‹‡ŠÛºW&C5‘CvdJ§6‡ad9Ö”·±ËŽV>Tu꺹Zü‚:'b›?v0R²IäÂY¶YL[·ãR‘¼¬j¯guh©dÕDR-³7gÊšL6÷« ,ºMÀ^J*ÎSA€Ô ŠT,ë×£ø¡Éái ”“^ã @è‚ϯh¯8(çh`¡¯òdü@`!ˆk}P,*•ÀƒšðöŒÜÐ…H0ÍÕ„™×E+E^5ñŤÆÊÁ4aaœ‹L:'¥¶VªÌÓFlãÆdÓ}2–‡ªB´Æ;ÏfV{3É”ê|©' \œ« %f³s2O…d¤íž±bëÄÄ ËÕCˆ°±`Ía±$>"ècHƒ8f ¤«UVŽ)­­úB2  òaP¢é”kí|ê<ÄN¡wšp°D@E`˜:‘ã4%®U)eÂ1ëˆeäÙ#š,¢¡3ÆÇAÞªj·Ó•ÆÅxåÛ íT#¡ª19úƒ3'h– (`L˜Æ.Š×&{Ô9‡îПU0+Ë2t†Þ¯Qävtz¢é1g·»BD‹*¥ì– F Q¡‚bZLɘrAfn›z‰uæG1¾§“ÂrÔ÷lJp)U>ñæž&Þ¥5ždÇtõ€ÔÆ«ݘ€(‘¸¨Š%ùF“è˜W½æŒ–Êjà)ºo(n쀢§âJùÒíTŠb¥:Ô&‚Î^.¡ (³±:oû…UM2munQŒà#6 Ü™!SeOI” 4ÈUÈ2l›”Ù[ÙVÖjUÓÕÔ›ác\:@ø1ÝÜ)KC'¶A(RÉn ö“ºŠÊ 2_&uóiY‹‘ò€‡4³F`üX\q°'kXJ˜ìPåBªZŒ½wB PpøXÙ;+‹EL”L '®“œãŽ'Τ Ørë‰Zc™Z™Å·ìt4AÙäd : ê…bɨÏÐa’Ü$¥ ×&ØÏ5 array_row€Nžs°s&êö&¨Ü¢(¢,˜¤LÆŒ ô¬ʆºAÀKœYZ€85à?‚t°?v,ÕtAZл9EÌ*\¹2õ3why¸; ScF¾jjE¬–z&å/²^Š›-DB,Lš”(ö òª:“`s Ó4ù'=.W—­ÒNÍ„)1â66I•û¢‰T~”%¢}–+ 1‹†ÙoŸšq$¼ÛþÆ…@Q‰LzvwáýOJ«}4-dÈX[y¨x£.aÁ¿A€ôÚn± µOs÷GI´ f[€³fM ™iÿ#ðMdk^k—Ÿ>KoŒ3RÞ‹äÚˆŽ(½{VÑX7R"è#ŠHlÔ" …ã+0œØ*~UeNppŒËCß¡ÜÖˆú“%SbHr_¡>cF¶ n’ηƒVu¤!§mg`mŽ’)@=qJÅ_ô‡¯Y‘˜PCæUñT$W Ã: ©îøï0ìÝlë˜é7{ó®hiBb›/P‘Ä]]'2ux;| • Gü¦Âê<‚Q‡ É95|ÇeÏ™ƒíמ\gçž<&a„¥r!D„XŽX,€N¢(¢‚,ô€N @ €(XÀ ƒ"H˜@¡‚… 2hØÀ¡ƒ‡@„1‚D 'P¤Pa‹.^À€!†Œ4jظ#‡;x0(ÑÃÇ A„ !RÄÈ$IP(Y¤‰“'P¢H™B¥J+N\Á’EË.3ºxù&Œ˜1dʘ9ƒ&š5lÚ¸y'Žœ sèÔ±s‡ žyôìáÓÇÏ@Uj #hBAp24å¢\)ZĨ‘G@Š$i¥JE,Mªr S&M[^lâÔÉÓ§HU@…%iÅŠ£š*uÈ”;§P…Ñ” Ñ*ª4¬R'F Cxp¶ÆÍ3hѪԉ&Ë“4Ó¨e¨öl¡Cµ¹°v-lÙ´ÀÀlD˜mܺ)µÉ[–`?Ü|k.œ¸qÖ8 WΠQçA—* uëØµ“`"…;SïàÅ“7O=C¬VØ©gˆÆ7{Çî-Á—Oƒ}xÁ1ůŸ?kÒýË0 B)Ö”4`®Wí8f0&TÉ LÈHáÂN °t…͆ Ð8|1¢ÄV“þLüÅl‰BFc(fèP±€™J®ÌX¼ØcÆb@ùÑÀ ‘*=¸!ÎÇ Z:ëäÇãÇE‘@†ÄBF䳑.‘,i’D‰“Å"…r¡ž”œT²'‹$•,-±ÈÐÒ%¬z/aŠº·O®bî9s¡²”4Ö©!@“^M›,«ÜÜã'\ý6Ñ’óφL:è¡M ;üîítQ’gOŸ’)Ìr˜+íW*ø!;„ñ@*“-J ÎMÜ ½á;O)Kz™P›ÙgêÄ‚°êE騛aÊQ̙Üc’4U cÏåfrëZqçF „_¯ÔAyÉJœ¶Z{æ’$OÉ9+3«uͲCt€?> 2šÙˆˆÍm•ŸTݺO¡ –²À9™¶B«e@Ռ͑,šE¸r”†ˆ¹³7þiÄ1ZÎTçÔ¢¨bî1P Ú}óIò¥ nà2ù˜Úh%µ6—­ÃzQePM-)bÖRˆ=D,!¸‚©70¸$Ø´s<‹jŠè'XX©nnîq¹®TâwjÇš6"ÓšOìµ ’\¡.W: kX#(JÌ=ßlàP%s×#}|"F™ß’$5ã}€rÝæš:f@x˜£r qPâMã‡YT’žñH´ˆ)´O9F$ÌäÙK+)‹x” ÉK¹IœQä•q ;”ý)axãäâbÕc cB`–RÜöA@«@¿Ü=«ÚµÓÊ.,<½Òø%g›CÜ÷Ì!‡:02-ºsÅQuf` èí\—!DÙ{‚C W½èvoÜdïb„ÕÊ`F%e4K¤ê—/g?- uæ¸Ó˜–`/øˆô—¯›ìõýÅã0µÌË$Q¡$eðž¼SK´i†ã_r¶œýÛ‡GÌn>dEqâÌ6óÜò 6O0¶8UwR!ßüݹ‰*-åVÐmQÓ×1–0GÑÐ$F4S˜û5†»ù/·Z#´yt5gî°n@†ˆŸÖhýEÁ3ŒPÃrƒ*”;JRE›]±4^Hr"ׯ¤P¾Í0ÍJ$ÉV2Ã뺬=)±ó†S]ÉÃIÒÜq•Ì+—-ê`=[F¦Ç´æ e±l1œEApÑ*ØÓÝN–*I@Àkâð‹KÕâ± ÑR ÁŽ€0IK}L.ƒzf\e–Ȱœ÷‰HLË%sqÁÊBãN›c¦ œ3´DüÎi*³ˆ…À«O][E©Òç͈(=á.cÃ:¶ev€²ˆ(. ‘Bʨšœæ¾^cFÃâ|ü è£×’m»šò⎃šlEÔU¸¹->¡6ƃ@*b”ÊnÐK ˜Ò¦ÌÇ—s»w9“‹8²ÞQ“÷ÖOc-ƒN‡…’tiS1$ôÆÈs'·òcæð#oó%I‘Ñe #Pp yaÑ*bTÍà)â…§,ì‚Ë¥®Y! &—©¸Df+2²pHl*Ûc$u',{Ù§Ú8úEõeMœÆdRó<*H¾Ä,lÔ ×çO²‰ŽÕ3kV‚•îâìF­[J*¦ùZÏцftëÅÖÉ" éêÜA»ÁHs]ݵúƒ09t”ãÞühð‰¬r)ø‹2’VÆ ’9Îóöì)LÔ`îu¤•±® .UÀgÏÂ`–$‰±$1ªW}q Ø\5B°ƒûÂÚ@ÄXÉ%6„1*‚¡«²Fþ äYîCD±È‚šÃ˒辈G¶Å,åÚ˜9#LsO²5 ¹ m›¯¦¤Zû|7 ?—RRƒ2'.eŒ5ÊÜ ‘ßE¶BLjM„uLn€’¨oå—Ap.¿ øD ‡éìm6—$+3 ÔŒ”G5Ôe¤o=ÎÁÙÔÈà¨Æ’ÌjǹšSÉg1r\ŒT%}wbêìÄ‹ ašWN8AÊöê§i‰ÉE!Åf@”‹V¸ö0a­.•‚l+÷fΗ8eè"I ¨"c ¥ÇÀU­ÕªI*>¶}Ũ• šY@g òQæG†·{¶Z!ÓÔœÊa7¤8å2óòYʹGô:$xçSuÃ6F!è9 ÉøÂªPJÓ[ºVÔ†-#£2Å©ºô}j\æŽK†)à4¡Ù{¼hÖ2É “K»KqÁ”*I ÀÄdÒ²&ze3SCÇŒJR¬Õ†ÑˆW#qÉ.•0œÉ¯Ìž‹imqsõr @Ì"LØS­WÜa°2Gg˜Ñ„&v´yåˆ&j–„Õ/šfF˜üæÙÜeÜ1bÉgÃuxiÀXà„ŽpG#[-ð˜¿BòuB+QdÔx “ñá×j‚U]9àåG½)ƒ„î+–¬¶Rˆ*ùtàJV{1€ÝÓ²›BHyâÊ Ó1:­jwñ}G7Æ©( n0Y]ÑgSư1WM¾n±l¡{1\ɹPl¶¶Qk @Ì*‘倌á-Øh%¼ _Ñ‚pľ´,U8'’Íêói¯¢…¼ #´sÈ=¢üåúøÈZo >7d j®¼·¿âòÕ„Ç¥¢Z bâàæ²¼Íò îsŽ.æPúäÆÙ'—œ ŸªŠEˆ¬¬-HúmNœn N™Í²Z¥Ÿ)ŠšÒí½÷ÔÃÍb5KÂÜ8sÆ%ˆ’³5â仞¿*f–í-•Omª5V{V&¡ú¨,³p­Õw/Ä´´wA… –([}pFš‘'°m—aE‚Œ,:Ò½´áÛµ»@¤›)g/Eèòò3ÃZ :ýÓo-V;ž(¸EFçn^ÊÌ*É¢ Ö¬˜Ã—Yb& «05H¤-²îIÌf/j¶äYabò#£`iÙqò’Û@vá…âKC2ɺ·´¤`€žX`èÖÄèÙ oPçWc¥<^ïîj•cºÈ¾ÀõDà(ô£bl8$D"ƒSX2b\°JPoNL>úƒ,ʛՎÁ,ÖaÔëá „*Ài´s =«XÛ CR1[6$Qöè› ²‚&(ç‘ ¾aòˆ•øó”'~6œâ±¥Ók¦¨^±6­ôá^°íÈI] \d7zŠº‰ Ó V¯BttúÏ–* ªú'®N–Bä–h·Ã%xLú€†³Û×%â ß$÷òdËÀ* WÖ:J¶ø(²RÄ ó—PUš‹ú¨ûGE^c®PÚºY‘qPÅÕ Ì–¡AjÕ‡ƒPØgŒ/aÌÜ•49ĪDC~e+§b|‰âè«'d §+$sK†ùlá“n2é¡kP©+tÙq@c²Ô96*WŒMD¥9ü¼nEI©è"…ôöI¬×"Ý 4 Z©€¹™¤@1á•›žŠÏÆÞ83œžÛ¸`ï_Iuº\ʽ|å1jÀqOa_Žq$f¸ìT1WR4$ÜÊaðªèŒ"2‘-(Raô(7£ôæè4´ŒÖTÜàL~f¯_D³ø“ çc…T ¯]ée‡‘$‚G‡µ’¸¯Ù2v§x+‡ 2Žq“Œ“²›ÀÄ(Šö¡â ¾“Dx#£óªb‹eÆb²G8½ÀÂc-ñçÖŠ“â,„^á@»ÜÞÂa àBL\Ä2Ç=Û%”¬0£„bzíqÂq‹§Þ€8­ØO¯Ó>"@!ir`GD[{¦sZIÍÙ»î Ë“»Ð$µ±PÄÂMûþ¥2³—´j…Ý!UXÔ ©PA–Ç :¶BÔzƒSXJ{lß|ÍpC•èºxMùg5 Ê`ˆTü–¶$§Ç.¤)v„X›v´ŠdÍXoj+uAšua& W-o@s…¸ªð<«îPÄÔÛÌìÅh G±zƒxZ…,õ 8 îk+†j†2(ÛÙ27läûW¡Zý¢¢¦‹Èt7@^[6žŒË6¿ÂcÈ`J:.’p‰òíÈ.²¢•CñãF=²r›ôó݈˜äòÅÃêyA©S‰]¥`0³¶þxÁã ‰¤¾ÖAžºôHß]liƒ©2 €^VlVõgOwxûÃÕåbβ©#â—\6x 4|K¼©‰D=´¬Â‹”j 3«@Ðf®jŠÀñó©€³`s3: cAgâ­Ü«#7¶UTÒîÄ·•ââZñŠU>#ùÒÒ¤»]hIM `X³¸Î]o¯IÄð2UEl¸å !|G ‹¸t–¿e…Fä¶F…- o‘øŠÊªÅ k|«ëÝ¢éÖ©‘x£#<é ƒg‘­¤[µ…h6®ÅYhã¶5À9nÏ'<)§#9A…]]¼˜lÌ’QGmn¹’s(ÛѲ öú4¬2“î£u¦ÎK’Ï•¡r((¯"Ðý9Ÿ‡Í\9äu ‘Ull…·—¯¨\Â) á‚’! +%Ñ"gš‹íþm Fϳ_{±DŠ ‹¯lû¦Âèp ‚ÈÑb…c„'`‰j"³U4¥†Ôm3²`NE~Iò‚€Œágqh2$¨0TC,йQÍÐ"§›Û=òÊë¬C‹ß>™ŠÎe¿¸Q|%ákç­ÇüFGç¹ ²úp晄žÈ‰í‘êy"iÙ¹uuQ «ÙÉÇÄ·¼Ö똸¨´; t¢äÓÓ#Iq¹ 4>2•!ÝÑq[V„ûúÂ Š´QZ"öz»ˆêã+ {9Êê·NVúH"0Œœš­ä§ BWS.5ïjTr´‰[O0† ÁµXî¤û§ÜR Ò°Bƒ!*¦cvœì¦ë_N3AMašæŒ¸s–)cäp) 8J®™!é' ÝõS%vÞ³ \ØÊô* ¶zƒn`‰Gãɘœö½á°9ʸ±IºJAœl–ÙiBžÐu¢1rë6­ë„y3õšl§.–¡VŒ¥ØBÊ FRn¬]ñJ, Ää¼eJtë=òf’pÒS‡¦Ö&qâP 8å #³‚&‚Zh¡£±‡"uM›¸±(FƒÙFª8RÉeÄÖv¸kˆÛå#ÄtÙPW¸Qò F*Õ£(A|1,½ƒî‚¥¦x€MÖeŠP;(œ©ºu—Í9Ù)%5æGk&¾Ä5 array_col€Nžs´s&Ðë&ŠÑ¢(¢,€ðŒðL€N€¸ôÿ›²áš?œ<À@÷÷ØÃ‚Ä@;Ö_&zÀ@áìöÑë/Î@žq¾ÛÝ'Ò@Œh óT)Ô@ä$c[áÓ@† ”ñ À@ÎÏ Ï%¥@†“=ZcÔ@'£ã…8¯±@%\Rã²´¼@³~_¬ÅO”@,T™EmÌÖ@ è—+Òç«@;!w¾¦TÈ@帑Qyp›@8Ï­¿°<Ó@üO¢Šr!È@ú÷XN¥¡Á@ô¡qc*Ñ@ålÞÚ5–@x5cŽxlÃ@ŽVlo:7Æ@ŽîÝÝÙÑ@V¹±I×@z CÞ&¥@p¿¤£*º@Ѷ0‡qÃ@õqXÁ—ÔÁ@߯¡ú¶@B²Ü!ÙÊ@âS~@!GÔ@5{Û‰E¸@– 긟Ç@v“ 윽Ð@ÝÂï—ÀNË@K0 æž@ãd\Žb+¯@bþ n¡×@à}å&ÀÏ@,j±a®£@I7opIÎ@çw+JYà¶@È/ØŠÚX´@œ‹e±hÍ@£sƒ,\U¬@œ¬ØéÄ@6ZAÖ¾×@‰ÁâE¾°@ËúV™ýCÎ@7c1ÊÂ9®@•$‹°ÅGË@Á™‘|=²@¾ä :ÕÖ@¦Ò ±¡XÐ@I᳡ˆ˜@ñ¼\´ñÃ@ªf…ç%ùÖ@ ÂÔé(Í@öoô;—·×@æiƒæ~Ð@ûf»Ô飯@D©ÒsVzÑ@Ž(ðg,¼@x2y¤§@‰Á8Ð@RjÇ¢‚ì×@Îâ´œÞ Ð@3WÕýÀ@äáñ> ̪@õÁ²q£@‡ n<Í@ò+Åê,ÔÀ@¥:m"Å@ÀWÒ@<ÛPP—QÊ@tŸž¬)Ó@,‘ìéÎ@ j 1Ó0Á@8¿-¿6`Ì@úÍ_w•KÑ@?&­0¸@û×Áàµ@¯Š„ó¥@G¼ëî7¹@F(aç¡«@i4£9a´@ЂZàqyÍ@솬Á‚Ò@Êž”!â³Ò@oŸn„ò-½@Ýr¦hþ²@0\£ÒDÖ@l0­±Ö@ÕþÁöª@}–€ª*©@,ûŒ—€Ð@¤H$waš¬@êa)JÉYÇ@‘KÚõµ@ v¨UšHÊ@b—B„?Ó@üoÑä%ÿÎ@ïY¡¬¹@øöÙòŠÑ@l‡‘< é¹@téþô™@äu¶ÑÌÒ@wÄ]¥ôaœ@¢òò,!µ@l†ÀƒhÒ@‹4Vefv¡@þŽÌW¥Á@˜/‚wÏ@¢’÷M˜Ì@&Ei[Õ@HdÝ Õ@MˆÄD°-Ä@Czù”½@.곓=Ô@À%«"—@\#Æ¥`É@AµXæå°@ü¿¸S}²À@ÞµÔø±·@ @þKÖ@blÂø$ »@‚*Ê´×@ò׫ô"¼@RÜö §`Ó@Ö{Ó—¤FÓ@~X&ÇLxÖ@§üj‡é°½@ȳTyq·@µÎ#ßR¥@Lr^ç©'Ó@Ì[ÎHº×@@þRPòÀ@ 4ŠöîÌ@´aϺ×@žæ”šÏ@wÔÉÌÃ+²@>“Uä”ç¯@è}ÏnñÂ@§œ æÔ@̧k½¦¯Ö@niBcÒ@òLa² (Ó@NÉr}¦„Ó@B»PNxÇÒ@ê–Þ΋@ü¡éàS!Ñ@R™†è¤¸Å@w”ù‹.ËÉ@•ìæE†@ìAÆIÖÔ@6ø–ã8Î@Ðm6u|™@jÌý¶Ö@r]b™<Ñ@Ú åš³k@¿úß(Q¨ª@À8y½G¸Ó@äy“ð×üÔ@$nŠ ÷Û¬@ÞŠIMŒPÐ@(³Ž²Ñ®Ï@¾Ë¸¢¨ Å@zÊ,õ†ûÆ@ıœ=ÅÕ@JR—jɹ@PÚÀ XÆ@^»l#JÒ@‰ÓôíÁ@pOòWlC×@ò»¿n;µ@¥EoLçÖ@DÜbƒªÍ@~/Æ@ '€Ü(~@Šã€{%nÄ@5þ{„o›Î@Àžè8º‡×@Áx}”@§‚òÏæ·°@™Ê‘TÑaÄ@lm‚€àv@Ldí<,Ã×@¬ Ùq&©Í@ÅØ‘'¦â›@Z>nŠx»@l¶‘G9Ó@•þsŽÄϵ@m²æÝŒ»»@ aûçuœÖ@¬:º¢”»Ó@‹ÌÔ±{¶@{û£~-½@!ì%ï Ï@ý+öÕÉ@…®òqÖï¬@ Z`çÀ@ ²ÜγÂ@w]«Ó²@*dâ-HÕ@_—ãØë”@k„°*®W³@j"Õ‰·Ÿ×@Ú(c#a6Ó@Èc ë6GÖ@" ÓI¼$Ô@¬°Dl’4Ì@fpýžUÏ@¥ÒX!°‘@×÷ÐA_}·@#̹@^g“uÞà»@Úa¾pw`×@é: ï Â@ÃCÌë%Ó@ Ô6ï±ÀÄ@ìþ@ –É@+AŽwŸÊ@ö§SJš×@/Ø„M!ŽÈ@£ÑàŽ¿ÿ¢@6C9N©…Ö@úÆ‚ ]¸Ï@ÂóÕŸÈ{±@¨ân1ªÌ¹@µ/^œêÏ@‡*tÛ›åÌ@ò ] sÏ@x5 ié@«@x’¾}Ó@tÛ` ‹vÒ@×kF¨ @ˆÈ˨ ÄÏ@›d¤¡°»¸@pD‘Õ@¹í¦ì»@0@RW#Ó@@·ì ¡;Ò@˜s([,×@bµž>h×@rj:"Ñ@¦^ÖÄÔ—Ñ@zà *|Í@M‚‡—’Ã@\LøM™)Ð@®l{³‡×@ ‚=Rº@¬RsA©BÔ@ bH9=Á@©tŸó¹@ÃÎç €Â@hÈuܮɴ@&5åJÍ@ú|´§Ô@!{ e°@ÈähF»ÐÈ@àyןY»@¯ûš®iÆ@ãç-,Û¸@•˜"¥7y¨@}ºç î—@eªL,ƒ¸@¼§ÌVþ‚Ó@¥Ç-QøÌ@ü|VHèŠ@ÚCÃê–@‚Ö[!ñø£@s°h>[Á@³ì°¡Ô@µZ¼¥ìL¶@ˆû霒fÖ@(ÚÔºD÷Ä@˜§ûø¿@(Ht_³@Lù¹BŒñÕ@¾Œä3`.Ñ@!z؇Ò@ücŽî>×@&Í¿›øÍ À«,ÿÏ‚@@7H±ùŠÍ@X+í ˆ‘À@;DSÌ${¦@òÖÄeY@LD¯*Ò@N/ÔðoÑ@°Ê_ ö Ó@iñc{³@+J¦ÄËž·@2>!P-9Í@Ù‘‚^éÉ@JéQ„”Ð@ƒÙ~9  @û«Ä\€+À@æ9Ã0©K‹@µÖ©8*W¶@ØÑe¯Â·@ÿ¸ ÇÌ@°Y¥€n³Ö@Cäå}¦¶Æ@ŠE˼‰dÔ@pµ6½Ö@w € É@ÏûÀ9‘%©@ª$LýÙp¯@&$[oE…Ö@ õ¶ÎyÉ@#öl¯+w@´Ôé1cÑÑ@i(œ½@¬C6Yˆ8Ö@aèÇdìÇ@31CQ;²@O?mÄ>Ç@ö\¾ stÊ@=?å¶wÃ@¦Q%(ÑÅ@´òÌv¨ÑÍ@u¸ƒ,4êÍ@âŸx~®×@Gh*VľË@°Ùö _'Ò@ ²Ž?YeÂ@ÞC95Åõ@å>”Ó@Ö˜Ù>½8­@a„bêõ‚@PÝ8r>Ò@à•£pªÓ@¨ °¬=ÅÄ@Š Ñ§Ê™Â@¦<—39Õ@âÅÿÏùÖ@âë‹oš‘Ò@;”Éi0¿@³¡sÒ@<ó_¥Õ@†È$…ÿœÔ@å1‘ýÄÂ@6SÂÇè]Ò@d–Fj¸Ø²@‰•ä-¥Â@ltTLEÃ@˜ç!wj!Á@h-iìú•Ñ@€<(c%ðÐ@‹Ä›7Ä@àUðˆBÖ@Ïï_uõ©¾@°®üB“ÑÑ@ªt§2Ð÷³@q´ OÔ‹@F›<ÉÝÄ@$eº^ÀèÐ@"L…™®[Ó@§Ÿ%éì1Ç@Ë«k®1˜@5—nm¶@ÅjXºÊ@— JYêª@#+ÿoX§@ÛD;XgÇ@Æ…j‰~³@Ð&øh>×@߀³ß"ÍÅ@·†Ð¼t Ã@>WœUúÕ@^0øNýÔ@Á–RLœ½@&ÖÞî8çµ@V$2JmÑ@´š¤¨Ÿ`Ö@Æt€œlÈ@vèºJiÕ@žo–£_=¸@% [ÊÿÒ”@ŠôLò@N¢@åÚ¹„o²@L•ÒÓØÑ½@é—y9õ;»@F°÷2v\Ó@ïEåæ1-s@ ¤”‚zFÖ@*£&X~8Î@Uwq–~Ê@nå·ö»Â@¤xª©(t…@zѦ0AÕÊ@oÔ1Û3žÉ@~z:“š×@»™;K…—@J‹I>Ã@ˆu""µ¿@‡t©"HqÁ@E(ÐS`l½@äCV”Ú·ª@¦ð”+ñÓ@~JÉÚRq†@xS•ÒÓ@ö:DC<+·@x‘º–H'×@h)Ö ÄÖ@Y›gѲÆ@¯æYO¸mª@ºá9þ¨”@@8ëÙÖ@Lâ³×ƒ0Â@VêL0¡×Õ@ 4fÁXÀÏ@Sä˜CÎ@#2¼)ôïÁ@}øbªo6Í@ú烯ÎÁÕ@÷Ü”Â]Ê@äh–å‚Õ@p\Ι³‚Ð@Õ*PëÓ@È9»ñ¬@RºWIE@_+qh鶴@§Š{A¥Í@kO·Ó5 Ä@¤â·‹Å@î @’ßÊ@)(üÙ¼=Ê@1Ž=¯«@æõÅ r:Ð@Q°“¸í›§@R'º=iË@¦Û5ËòÑ@Š^þÒ@³åœÄùî³@ù¹Í@¼À@xkr@ÓÓ@pðÆœgÒ@¸ì|ùnÍ@¦ȉëÔ@Ò’g;çÕ@¬,º~1ÞÊ@¾“~_&n@ØÑqÖ@ŒÔ(¬7³@Âñ‡±@GôèÑK|Â@#ÉTa4ê²@Yñ¶QòÂ@¸$;tã½@+¥S¶g´°@öÙ‹½Ñ£˜@<Í¡/Í@¤ÛlÊÉ@IY²Ô@]Ñ/k „Ä@Ï%Ä…5-Â@ì¼ÌœùÐ@Ð,xÖæ Õ@K‘7K‰Ì@²QóB`Å@‹Sä-&þÁ@ݪ©=ϵ@„w Ï÷T´@ºx%œÙ½Õ@ìo·1E·Ì@¹&óYÑÅ@ÏŠQ%‹À@E>ЩË@¶ÕqÅ@Á á]¹²Ã@ O)JtÓ@ØŒ`‚¦áÑ@*½@ü¹ò6?Í@⥲¾'àÊ@„D˜÷˜€Ô@(œ°R"çÈ@»¡a°Ô@`Ei ¼xÌ@e/[HÌ@GTŸ©ç¤Á@gx¶m¥ûÇ@Ò\Š}ŸöÉ@H!(|ÑÕ@ƒx–×È@¦ÃH`DÐ@¢]m÷² ¸@3%‘×»4KÀ[ªùŠQQÂ@WN,ìÈ@ê¼/¶:Õ@ø‡`ŸGèÈ@qprþn¹@ž½”u“@%$kc€ÓÌ@Pc¡¿ÆË@…ÿã¹Å@Ôä C„Õ@&mƒ:%±Í@N?ÛybÏ@ 4Îzã^É@M$ y5·@òŽ<楣@\‰´‹(Ô@ȦáeB¸Î@b¬k3ŒÁÊ@Ùy ÁvÏ@™•؉fOÁ@÷ƒ¸>‰È@•1El·x´@–%¡à›Ö@¥4ËU³@¨±ö¬-Ó@ âŒØUÐ@À4ÑÖ@ü2˜+Ñ@sX,šÕ®@¦™7•X¹@´o.ç…~Ó@Vdn’Q°@`s"&WªÏ@*@›áh°@hÓàê)¥Ì@Îg§#쌴@°C‘DSÍ@$¡äöS~Ä@C±_äº@·[I¶›Æ@¾Ñbtà×@`®LÎñÒ…@/9¯èßÉÍ@Kßf«¡Ç@§ûöRq·@«^á S Å@â*qw Ÿ@ŠDöi׸@¬ISðÊÅÒ@\A8·³º@VSJƒÓ@3¸öc¯@äÔ MÑ×Ñ@YCÔÀ” É@´¾¤Ba¹@¬VÄu£Ö@ž@5ãh´@ÂͧptÁ@Ú²} t?´@âž^ÕÕÖÒ@ƒl$²Ø‘¹@iL•Qx³@±§Í½gzÍ@ èÌ’²˜@RÅÖ:–@ÎlS›–#»@@mîDÇÑ@2C6ÚÒ@ìÆW;ÐÖ@iE¨¢eò¨@€5g“u•@l»É¼…©Ë@A‰òË@Ä5$A‘ÂJ@àM5tà³@éTÆAÔ¸»@*¬p•™Ò@‡© (IÏ@^’ûët[Ñ@è«-ŸP°@˜?PLHHÑ@@Y’̵’@FêÌošÕ@Ϻq»<½@Ö…%f©œ@Œ—›i2Ö@ÎÆ‰RɾÑ@¨…„¹9UÕ@¶äp%•ÆÒ@ïÈØÔOêÎ@¨Ô2¢ìéÐ@4¶üF×Ö@@õDÅl¨È@Z¼“ŽíÓ@¥Ûì»þÌ@ÅGíõŸvÃ@b'þHM¡@hŸÝC_Ç@úË»û.äÑ@"æ¦ÛÌ@†1;$KÇ@pc¢“ÍÅÒ@Œ’[ZQ¹Í@¢Ô·wCº@¸¨Ö’ Ó@|²Ðyн@Äÿ¼ÇÍ@ö;¹Q Ò@š7pÙºÒ@ÌV#Ša×@h÷°C?\Ñ@–S°ðÒÖ@Û¤`¯féË@ ¹»3!Ä@IÒDÓà Ž@3÷a È@wÝ3’ûÕ@ç÷ ²T·@âP‰‘‡Ñ@Í!²«Ã@`9^f>Õ@vßj÷«»¾@°Ñ%ÚñÓÕ@h)V•±·@–ú„ð“sž@˜»GÊÊæÀ@ ÆÁi-É@Ûé ¼XÏ@pw_IîîÖ@rÄšS$þ¿@¢©V…ø¢Ê@³÷ĺV @GÞ6m @râxŸþÉ@¤è%Ï@*wÿÑ@Î=–8±iÈ@Œ·.ä-×@Ç zIc¨·@vüQO†hÈ@Kʇ1F@¢@XA/SEª@é6E¡ñÄ@ã0=Éé±@ÓÌæ­Ó@¸L~4*Ò@˜meD£@ÇO‹¼‚@åŠeu ¡@H­06îÕ@öàó«bÖ@þÕÎdWÓ@æƒ6ícÎ@òwð<ª|ˆ@¶7à9}xÃ@S™¼~–@Ï@´Q iÓÍ@„ÂW{C©@šÒ°¯Õ@^¡UøÂÎ@NM‰öÓ@î]¨ÙwÄ×@×ðuSLgÉ@RíR°¡ÓÕ@üooüF[Ô@r‰äThÐ@/f ýßÇ@ˆhÂ*ª…²@b?j1qmÊ@eØNç‹À@ªÉŒ3àÓ@U(¶¿ž@˜’N,EÂ@½|pÓöÛÄ@;#HÏÂ×@%ÓSx%òÉ@¦¿Üf0×@Z¼2»h´@ZŠŒ¢>Ñ@qI¼¤-BÁ@ ªdD%¡@¾«¼ƒÒ¨@8ì-Ú{×@if®•ÔM´@ây /ÏUÐ@ì ØcÌÀ@$Dé ÏVÔ@¾‚ç(}Ò@ffŽÐuBÅ@½ãVy'µ@ý$@„¦@Œ‘k¦Ë@ªVôx‰„Í@ú €ó&Ì@D%¿ÖŽ›@ÈeÖ†õ>¨@6^G’sžÐ@Ë¢ä‡e£@¼}h%Ð@Ñp—Âd^‹@ÕWv±„âÇ@Ý–z9»@³ Õ¤NÂ@|›žÇ@Û™"yq¾@wÖ¬cÁµ@øÐå`BÖ@–Ïò-!¿×@_uX×ÚÇ@È3ž#€ÉÏ@BFîD¤©Ì@áì ”ÚÉ@ø)«žWÃ@m:+{ûÀ@Fz6“êÒ@S~纽@ÛAË m‰Ï@~£gELÆ@œ=Uƒd‹Ö@êv ƒïPÐ@œ=û-iGr@j³šÉ Ô@Ô°M¥´@N°ÈSf¤Õ@ß²W\öÌ@úéÇ”qº@ŽeI¶0­À@Ú@FVQh§@ö/Ö­:Å@ý¢„²@|”K4ÓÂ@mk_¾@èQ}µDÖ@Œxœ‘ÛÉ@¦J„? Ð@ÁAŸ Y¶@j¢¥ÿ›ÝÊ@%ù~î~@d¡Ñ¼ç³@å¿rüµÉ@2ÉMÔÔ@T$G Ñ@sª\áË@ýîÜÊeÔ}@©º,aŸÓ«@¸"Ð˃ÍÓ@ÁÕä eRÂ@^Y?Ëê @å7Vš ©@G§àÛ§ “@‚â¡z×@èÆü(¬ÆÂ@‚,%%·üÀ@¬0äÁ ñÓ@P^öA Ó@Îö4½WÖ@˜ŸÓScµš@zÁ/kµ#»@&ÝŸÆp@d+ì ØÑ@˶èB¿@Œsè/Á@ô‘x—›À@3vG8ÿñ¾@éÖô2¼@Ò¬Õ[zÅ@ï^eA:Õ@~k”J¶ÍÉ@JœÈÿˆË@]%®¡“Ç@>%ÚßPÖÂ@2 êng*Ó@\âUí¥Ã@¸ý„ÒÛw@D~2Z FÑ@}a Ê@xéR¢:4Õ@í‰0ju±@ºþw"¶Ò@áf½×%áÌ@ü–ž´wÕ@°£u iM @ø›YÃwsÁ@R™ì04À@ëlÅ$Ã@{~© uQÉ@ApŠ}ï¾@êKä‡}²¶@ .kls$À@ |"°7(m@ì`õÓîÀÆ@Yºdò„Ï@‘Ãa·Ð@RbûŒÈÕ@ì‚™Éw@\L™—•Ö¢@¼„KË@bmâe8wÑ@'¹í>}¹@Ü“ôHÅ"Í@ Ò’ e2Õ@¸aáÁm°»@=WV6u1Ê@ÊP Í'Ù…@Pθ8¿Ô@ÚçnÄI¡@øÖmjýÒ@È8Õ/Zq@VÞ’ÃÍÄ@²D;-³@ýÁ©†Ë@û9.mĬÎ@Š—pÑ@`<#:ÎÖ@JªóÑ»·@iP²ÿ!êÇ@0÷»Qã»@õ}xuŽöÌ@°®t_€ƒÃ@7¶§Ù7n†@ü/æ¼@”ôê¶;Ñ@?-‚¯ï¼„@ª3ÈÕÒhÕ@_i"\Á@*#b厢·@:ê> @ªÑ@fÙž×@ו2¡‘¡@ÞF2œ Ñ@ZfâgãÕ@d¬¥õ«@FÉ9¾—“@ w5MþÕ@®ïÏ'—Ñ@:š9Îä|{@¸8—Éà–Ö@É×+?ÉÄ@ªæR$lÐ@ª[Y­C ¦@‚GáÊ€Ô@ô]Üåg»Ö@èL6‚º@ðôô„nI¦@r‚%|ߌ@ç7× ¦Ó@cÔS.oŒ®@qÐÜ]t @«¾a城…@¡59§Ï@ܘ‰žÈÑ@”²€gÉ@‡sÛ{Ö@îÚw~öÓ@°^&Ûæ<“@ß9ûÙneˆ@>óÃý¶UÑ@SÊû¾bRÀ@Ûý ˜Íí@"Ï1Iƒ=»@)z[±7ŸË@Ôõ¸2žë½@ûg7Ìv®º@ Sƒ:RÔ@*ªô4mÞÐ@h(¤ÙY›Ñ@/Þpº²Â@ú÷ƒR[ÒÎ@ü»¥—×@ÂL†à&¼Ó@qÉ‚„ÀÁ@t„¨ «µ@•׎Â@!¿JZÐ@ã#Ïîhù­@³üêB•‘Í@Áø={°@¢à^\Ï@}¡zu•.Å@ Ð%@Š^¸@˜UœKŠBÑ@V0ãªÕ÷¨@ƒ“jà¿@’Wk ½@àu5¹A3í?Ú‡ÒnÐ@¿€hó¾@Ù‰ î7º@ÁÆ2Á£‚™@,½ÎYcÇ@ ³ƒÈ@·“SlI@Î@WÖDÕѳ@$áý^cÒ@} Ú'Ñ@¡KËÃØt¡@þ¾êèTIŽ@dTJ~­\È@u©ý~È@˜Ù†`Úg³@Ó@ßxVÈ@âJ×@¶B€[JÖ@”žJ }ŒÖ@fZÁ²øX¶@ŽÉAóŠÖ@—+\4yÉ@Ø0ð¾@û ÙJÞÏ@ûC];`6¾@9gOΊyÃ@åy¹ Ò$Å@P@ËcÌLÀ@æê^àãÊÖ@–<>ö½ÒÐ@æ>»è!c@«p†]’½@æ‡R›öÃ@aë£ÓëÈ@™~Úô§¹«@.›ÍÒ@ÕÂ'èÊÊ@.m‡lœÕ@š4RÌ,Ö@‘ß‘)ÕÍÁ@Ða t¤Ä@hh$™É@jÉÂN޳@¹Ô³~tóÃ@ ¨ü8ÞžÓ@͇!¶³ëÀ@Å^;Ô&̺@GBœ&ðÎ@ælÑÊÜ:Ó@ä9²gGøÔ@cR>óŒCÈ@ Ì{{ºÑÃ@œ`@®w3Ó@sê2Â@Þìdz†Ï@à°W@!ÇÆ@·z­iGÂ@/—MWJ»@¾«hè¥@¯™FGà ·@QKFŒÎÍ@ô±ÞüñÍ@®åF䦿•@|éÇ-‡Ñ@öÌ MCÕ@&ÜS4ºÎ@¶Ä˜.óÒ@ÌiØñ¤E @y&ÊU±&ª@þõÌê<ÞÓ@Òöî ] Ñ@‚ŒäésXÒ@†røÆïœ£@;‡nÍ@¶Å›ƒ¶@I^HgÖ¥£@â9WÀøýÌ@ÌÛ‰Ç=@4à±›ÐÔÖ@z#z–ÏæÖ@ ƒ°60µÉ@ºïQŽÂ»Î@ª$)å/ÏÕ@#~(ˆÕÇ@Í3àR­µ@†ÁŨ¶Ö@a‡ø‹£qË@Ž AªÔ@ÚhùÅ‚’@6/hF/ÆÖ@EÙf{„ϵ@i\dñŽ ·@ÓÔ›æ Ç@¨b —–•Ð@›Ovéd}È@pF¯ÙÅò—@ÄÎÅ÷û°@¸D93ê Ó@Fýçr£åÐ@ãÀâܰ@;¼@¸ŒÂ@Ñ/ ³Q"É@âäEÜ_ÚÖ@[$ˆ¬Ô@)bfW<¼@c|ð×@Í>”¢¨„@’£Ö³i€@L;@•R‰Ô@¨¿ePÁ;Õ@ä¨ûYÿ…Å@Zò\±Ò@}{ŠÞ­@•“2G£Ç@g=åæ™5¹@TÑ]JÒ@¢)r.øÔ@5íµè8Õ@WS"/Å@qúwAÑ@”wšöµ@¦ö ^Ö@p´ó~öÑ@Š t žÁ@[1쨱‘@á˜ÜTÖÉ@ðβ)ŒåÑ@æ#x˜ ¡@ Ü2™´ð×@@»UþCuÕ@í€T„¤e§@Þð6žcÆ@Ý1"SåË@þCôÛ<À@}…àƒe×§@ .,º[ Ñ@âÚMœ!Ð@®l0¶‹Õ@ÀSoLáÄš@póõ\š Ï@–Âuj@IÓô=`Å@;^ØXÌ@”êoHÂ@&pƒÛÑ@è o°Å@Üçèpe´@Ì.ðA¨×@{m73™Ï@š¢ àäîÏ@¼«Ÿ¯@Àð;“ÝÖ@>.lj”@¢¹nË]Ñ@(< Ö”ïÇ@‘Ã’]/r«@íàœÏË@Bž×vAŸ@z_!`Ý·@ÛóÅ:œç¸@0.2)?cÕ@Üào‚ÙÒ@&ÚýÝ¥¥@€y–jç°@Ì‹Üf T×@Su™$IÍ@¹§º•I3Ç@8zêø9ÐÔ@ËÙ{Aÿ @¡IŽyÕ@?^Å:(éR@‚˃¨,´@`4Xy Ð@ºyzOîÇ@Ÿßõ*¬@bš>Ž âÎ@9‡ÿpÀ§@K a‚®‘¾@TÈæí9~Ö@JÑi¾•Ã@F‡3)6µÀ@^nR9ñÑ@»À9¸Š@|L§ò§6Ô@¦)Øö9Ò@ul>ªoi¢@NS+ÙyÕ@l´]gñû³@­¤®ñÒÇ@×Ò_×Î@  Ô±.Ç@ÌÅÆÆ]¶±@DFÖ—¯K¡@ü'TOÄéƒ@Iéê̈’­@¦Q–¬"1×@z×fêÑ@hÈþgÕ@mxÕªÂ}¹@xJsGîÂ@¾”qœ[øÒ@JÌhF«š@à "NÔ@‘žÌÌ@dØ8tÀÓ@l™Ò{µ@ÊÐÓ‚R­Ì@>xêlÔ@)LýuC¶@h>|TþN¸@6õ´r”Õ@Š£Š¿K°Õ@}‹™!¾@1_ø–/»®@vÇyõvø»@ø2J×tÌ@³½eª È½@²è åóÁÊ@%Ô0%Ñ@”[î%ÅÉ@‡1ÛiÚ±@À—ä‰K&Ï@€¼ÛZµÿ¶@úÄdƦ‘×@Lݹ½§=Í@Ì["€Ó@ª1ØPÑ@êL·RcÇ@HË/.€Ò@_»®Ÿ*ûÆ@¶ô9ÞGÐ@¢·Q!#×@A™Vý»©Í@<àßM~¾@{4K|ƒ À@cÓQ¾à³@ i¸À¼ÀÏ@¶¥Žÿø×@ήq—Ñ@úãÅ&ÒÑ@Õ?ªcJÊ@ x…üÈ@F1§N•ãÍ@@ÄÑ®.Ö@ÜÛ+žPÊ@û‘mq§Ã@“†±¹*Ë@›]J$ÎW±@¦+2^°Ñ@z´{+IÈ@6Ri¦iÔ@¢Üëœ|¡@A#<‘4Á@`Ô;µ´‚²@‹ùÃFÏ,Î@Õ™½…×?´@Œ"¦?Ê@ yñDù5Ô@˜vŠñëXÐ@8šíoéÑ@,PÁp«Õ@av"¼[lÉ@‘”’„Ý¢@ïò“@˜Î—Öi=É@ý²-fºÎ@f~Â7âàÓ@Ì[ÝÔ‰NÔ@‘â˶$DÊ@0C‹ñëÍ@>ö ¤µ<²@Äå²{†^»@ZûÏõ·@Ú""‡§Ò@ÏpW‡h…¹@QtVkÅ-Å@´€‚s³@Jëü«QÖ@@q¯ò5Ì@48‚gÝÒ@Jê”Ò@ŽÖÞ¿’¹@÷IŠºÁ@ËŸ4Xʲ@fÏD WýÖ@œƒÇVi‰¬@˜í`0>Ö@x&¨`rÞÒ@R»Û€Æ|×@4(yÎ0Ö@ƒOB&•Ç@8Ù:Ò»›@)–v'ŽÁ@C?Pã)Ê@þËÉQƯ@"Z¶°Ø  @ÄÖWj‡E°@¼³G«2Õ@>t¾ MÐ@Þ‘Tær Ö@L󕺄Á@C¤@Ö§ÞÞbÍ@XVW\.“Æ@· êC±@ZÀrV?NÆ@4‹ÂzWÃ@&¡U5¶@JÈ ]QÓ@TŸn¬ûÔ@:r&—e‘@Tùµ¸Ô@œIH|ø$Ã@èþv:cØÐ@¹ú'ÃKŠÎ@ôŽéƒ½©À@Ú(ÇG-Ñ@ôîf ƒ˜Ò@Tûüu¤Ë@ì{[EÖÔ@ˆ¿Q‘åæÐ@týÁuÈ@ê,'̺ƒÂ@Lt3ÒxHÑ@Ì;œ¸ÞOÑ@n@!}5ÈÌ@«þeÄ|Ï@,ÓxªÕŸ¸@ wùB-Ä@ü¢d9K:Ä@†ƒKÁ»3Ñ@pTı×jÑ@¾f»n±#Ô@B9vV°ÑÔ@ù/ŸöΫ@¦ŠG¹xÈ@ŸK¨”ºH­@33~;,Ó@ñÖXR¸É@d…·ÄúÓ@ Ëtàœ±@z«z'ÒÉ@u OÂs°@R¶qÓÓ@ÄËtýÙÅ@¨ù‘×À–@=IÞý#÷Ì@ŽwF¼Ò@â`¼šåš»@l£>ÄíÊ@B%qáêÞÐ@EÉÎ%žÍÈ@k§­ø†»@ºÛþºÒ@¦—ÚÝÇ@g+0ÇZ¶@v¦T0H÷¹@F|6ÛÕ@Z)ÏâGÎÓ@ÿ–X+úÁ@qF¬ãuÕ@,]@ È@PÞDëË·@Î=NÉ»dÓ@=í=äË «@,'ß6Õ@Ðr—h£»@B¼(=i/Ë@oˆ¾ÒÓµ@ô|´ßYÂ@"ð +Ë)Ð@<øƒIÓ@´Üa8•º@‰¢ZV zÏ@Ü~-Í·@æïOÑ2³Ó@v¶êš#×@e¬‘þÐg@ü!­ÙûÛÍ@%y“ÂÎ@H²ŸœŒÅ@•a{Hžä“@¸®ö~ØÔ@øù%÷¯f³@É|G¹$™@èàŽ»5¼@¬héÖ¸•@žò…i§Ð@ Ýc ¨fÀ@Wè™s¶@¬@"¾@¢Ç@$H‘ú7~Ð@9b•¦ð©@‰ÃÉ00Î@0dÒîÔ@¦ï$n°îÔ@ïœkEòìÏ@Œ¬¼øé¤×@\¾¢t“Ð@ÚùÅ“IÖ@&š¢žËÂ@Ü"061tÓ@½õA{팦@Eè– $Ì@¨½èžÔ¦¸@Ìá¢glÔ@'઀l­@U_·ŒI³Í@.r‡¹Ö@L† $A4Â@ßcGàKÑ@䞥'K×@e_j» 6Ë@VŒ0 ž¶p@ÈUÅ|DgÓ@‰ý,Ã;&¥@ÂBfÛU®Ñ@”š“,!mÖ@ض| Ò@”ø qÿÔ@B(6ó’’@L˜x[¾Ö@,Ç{ccëÏ@¾» Ç@ý¦*À£3Ã@X_¯baX‘@¢Jl9Õ@Û²§³ÚrÆ@^ÿO JÕ@NÓ‹õ‘o…@*2u}NЍ@OX¼çÞ Æ@¥7•­›¡Ã@ìÖ&5°Ç@a¼¿¯*ɦ@›¢‹<—ž@w×îãÎsÏ@ú>¾i1?Ë@Ý›êSö¹@1­'’®É@îLDSbÇ@t1n#×@1ª•›zÁ@F†¶pÛñ@ÙCAYН@€d"CÆÅ@lÎÆ•ÜÕ@sJ­I¯Ì@T~€Í“²@Ö\ÀüÄ@Ï¥x¸³î±@0]󜑋Ñ@}“¼]Ì@Z™•¯ÿ–Ö@€‹'Ñ3È@]Jí²×=Í@Ö@¦'§$Ô@&ÄØÅ”š@…Dn—†Î@¨YU¿Ä@r‘#¿sÇ@XwÚƒîhÄ@¾þ“[Ä®×@]X¼”|qœ@`­äÀ§@·p묙œ³@ )­Œ´@¶ ™ò(œ£@}^%Çk­´@Ì>o_”(€@¿g{eAÚ¦@LJûÑ@%pfÂkµ@šØeŸŒ°@Ȇðá«À@¶pìużÖ@—]RL¾º¡@¸)ŠÊ@…Òä Lã @/j¥¢ôø­@Œu)c=š@®·åRÙvÓ@ÓR,\½@Û“¤‘fµ@ ¸‰êÀ@ðÛM0¢@Œ$¸ ÞëÓ@$0D»c×@VÎËÞÁIÒ@ëÐ3~;†@³ç´k2'¿@|öHúÜQPÀ²~¸ßTHÖ@æ C+_Ä@zn1¸¡Ë@aNÿ³(Ï@Z°Ï®Í@­.ÿJÄ@÷¶V²¶Î@.ïcäŽWÐ@hxÅpk¤Õ@âõ|áTu¼@±'lÑ@¯Ú¹N, º@™¸1ø^Ï@a°ïuf ™@ìÖ@)ä•È@»>Ö}üË@k‚Š«‹Ã@"J§ª¡@* 4×…Ô@4ÙºN7"Ô@Ýx³MÕÂ@3__e´Ê@æJr0Ô@QK÷ú4+­@–nö6HÐ@ ¤¦Ìú@´EüÉÈz@!¤¯FíÝÁ@”L.Æ·x@N½ˆCn¤É@@cæ¸]ÿÖ@·Çu<=àË@h9„¦zpÀ@}¾ý(0yŸ@>EÊýÎ@ ÖǥȲ™@ ´ëqÍšÖ@ ʬ•ËÇ@IzàòÚÅ@ðþ¿kÕ@­¼½öHš@€Ù¥›Îº@¤{¬žÕÿ·@ú6o ŒÎ@ [µÑ¡Õ@Áx jŠeµ@'JD¨@Ê@z$ÙÇÓ@`wC7®¸@èNÑm£Â@ú¿ùXÇ@®k˵Æ@7®yjÅ@.9—æ/Ê@ïF„4Í@u|fnÊ@.kdcöÑ@a{fÖ‘&¹@±ÒIõË@öÍú"|¨Ô@†–•éÉ@¶ª,)q×@ëÉ?8§8È@xä¶`yþÑ@/{Á‚NŸ@.®§òÐ@cw=[²þ±@<ñGF×@J÷Áª`'Õ@9¿ŒÐº@(l¸°¾²@Ú“Ý-„Ó@> ¶ºµÐ@¾¾±ú‚Í@ÜÑ©ô·Ë@º¨:9̆Â@< r´?Ñ@M¹šÁâôÇ@®Ýû.˜„Ô@'€gï# ³@ k á·hÖ@ÚÄâr«Â@¥9 G$Ç@Ø7à(¯—–@I`fãy§@† ë´$›Ñ@$¶`«Œ­Ò@¶€%%éÐ@ #òž®@¹jÒ³ïÁ@ åCŒr#µ@ILºŒ¾v@°KEaÆÔ@" œ2ÅÕ@àÕ°פ¥@bãݬ@=¿@&‚a²$À@_FvmÎ@Í)N‘ÛÂ@Ë lßÎ Â@Ço—áË@ÕìQuÄ‹©@ó‚[¦(Ó@hâáfãMÈ@¢— 3º`´@òŸÿ×õ¨@2¢µã²4Í@×jã:+×¾@(%Ôgš×@âø-@«J£@Ì,hµ5U”@g× k@^/ë6æHÕ@ÂÄ#<,˜@}›\ïÐþË@Î?è.6RÔ@É$¬#…%´@lBÍ“bÒ@Œ†ñ)º@$ó‘Õú•@—Âë9¬wÀ@1ààf6Ÿ@%{å„Â@‘Ÿÿ7Ñ@nLSGg‘×@N_ü-)Ó@ùXrnÚ?È@}%Gm‚@¯'V~ @†Ô'ö+NÄ@àâÈ˧À@4N àéìµ@%«öKâ¸@Ø( }“áÕ@B]Ÿ ®@J\Áó¬!Å@¨ÀTmÒ@Hϰ Ö@4Uv=Ð@‘*[ <Ç@‘¿3:ýS£@q2íÞ«¢@4DKö”iÑ@táó+¢ÿÐ@Æ•ÃÁÀ˜É@(¿Ê?'Á@ÔL¥m@Á@æÝPã¾@„Í™)vÕ@.¿Içðó¾@ùÕO×ÛÆ@ kxeW‰Ó@¨· 4…ÉÄ@1*DwhÉ@¡n „`ö§@8ÆÿÝÐ@aMl«§@ö'§ŒæÕ@Âñª»F™@C}UÌ@ìcެ§×@íU;lr²@jm¹ËØ>Æ@øÕ@½µ@Ù¤½’ÎÂ@ŒˆL€-×@5øºGÒ@qd‚Nô²@ÂÖ­;,×@‚BKʬ×@;?lßÎ@ã¤~"‘@Fç|%Æ@FRRü±öÕ@OÅÿí׽@?ø,ìÓ»@ NPù@Ž‹°ÕÑ@Š+!⇩@*µä@ÿšÈ@0áƒBVµÅ@é40.ÉÅ@Äþ:%Ð Ä@p7ƒ›¹#Â@¡ô|vîÚÀ@K3KÁÍ@ –2*Ž@0 fÛdŽÑ@“Z©>Vj»@<êZË#Â@=0ÄC¦Ö@”«ªiй@ ÉЉœš@šÐýùkÅ@ªt<¸sRÖ@¤‹=Ê@¸%GÏÉ@±äfbþÑ@ÿÀh±½Á@cü=Ð@ì#€ÐhÓ@ÁZ1É$¦Ç@ˆ=œ0)NÖ@ÏhÖ2 ׺@!±†ZË@45©œ²Î@IÕ/wœ´@"ÔðËÏÓ@ #¦_ÀÅ@hB„ö@šzÝÙ¾iÁ@\äϤ ÛÓ@5&̘åSÈ@gއ•pÂ@ºÂ»0ÂMÔ@$[„YlßÅ@þ3 ËH"½@ºn¸M¥Ã@ÌGËzÙPÑ@ÈP€#N¢Â@x‘Äiä>À@1‡HÿŽ»@ú¿•»’Ö@™ŒºO!å¦@†tÛ\îˆÒ@°ZùŒ>Î@e)Åê§7È@:›‘m¾ËÑ@Úž™8œÕ@€m²’(PÐ@ÀÃx¬Çr×@ÒÉÄ—Ü»@[]‚~$¨ˆ@Pwè<ÁgÓ@ÀÇ|ª˜­×@`h7ô\Ç@n` ë0Å@<¬Ê£ßÝÇ@ñŠjâuÅ@ÔHæ?AÍÖ@ü™MÊÐCÔ@ºq =4.»@èvg³@DÙ¼k´¨™@fóÊ·kÇ@£·]0UÄ@§2´”Šˆ@,Uv‹íkÃ@ÖUþWøÑ@Mµëƒ…²@hÐÿ&[I¡@z2˜>µ¬@ü;JX.ÕÖ@Ùd÷–Ó@È䤻1Ç@¨:‹MVÁ@|w%ˆ"¿@3PÏÍ@`Ä_ ™_³@ü%9 Á@”ó*\„Õ@ÛÖ>À£@övÐdl(Ÿ@—¥eóKÄ@•oßYõÕ@Ù C œ‘È@0åªÉ3'Ô@’‚íˆW©«@á°˜nÊi€@-~u|6j¢@Ö–…¹´Ã@ðt²KíUÕ@÷_¥¡d…@s ÷¦í<Á@öbÓ}xy²@ú…Ï:ù’Ô@BÞ>™LÆ@€ú9¿JDÓ@§Ë´ü¹@Õ9zn4º@Ðêˆ?§vÉ@:‰xrœÇ@`ÍðÅÖÕ@޳zWõ™@ž_štX?Ó@h5·ó1€Ã@ ‚ÆBÀ@uҴ郋@b²¬×ìÐ@Ü@FÃÌ™Ó@˜¡€/*¦Ó@ œ°¹YÐ@“¬j¾ÑÀ@ /1%‰½@1yŠˆ¿Î@ì¤pI!Ì@tÔ;ÃÁÆ@XS)í±.Ã@”¦ Æ@P­ÜãYÆ@tAŽø3Ö@þ-ˆ"LaÐ@,1î=öxÐ@° ªAh¨¤@þõkü õÔ@v CÿÑ@Ãç6;)È@îm¤-ÄÒ@©&ª­ÐË@±£3ÓаÈ@ôx–cº@KxÔS–@°„^«¦'Ð@:{ÚÔ°Ï@—â°ƒݺ@ Jˆ†©½@ÒæÒ­Ë{Ò@Hj Ÿê-×@r>¨yPA’@á)ÛGɯ@Mr¶ ÆL±@± ¬ýÁĸ@­!j‡¦®@fÏëýòžÑ@‡I™§ôÒ@„A¾P¶ÓÁ@©GCÔ»¼Î@•Œm’°Ï@y;3WôÊÎ@4źfÖ ¯@≾H«6Ã@ü‚C “ÿ²@˜0“€U’@¬)¼åÑ@¨Q?™¢µÓ@QK—¥õ–@è¯Å mÕ@2îÃgaÃ@Zõÿ¼@!ŽÁ@nú—TÈå²@Z¡À…!Ñ@lý»˜Ç@:1‰Ûb…×@Ð[9ÕáîÖ@h»ž,NÐ@¨AUËÉÝÖ@Ðû2r¿èÑ@)¦Ék€Ç@º4cdûÃ@\šÚwÖ@c01ðfš@.…f=g—³@,çmñÔ@ugÉ?0p¦@õ¼Õ…§@LÛ¬’OÄ@"ÇL¤G È@U'Gâ9lÁ@¦•£¾È@"Äã ÞÐ@“ku3žÀ¾@¡ëø/ݸ@œ£6麷@ªÛ7vÒ@Ö@Ó¨¤õTÞÂ@ Yê û±@¢Ýê‹PÄ@€Ñš:üÈ@Üø»^AÏÖ@@žµ§8Ã@P[BÞžº–@¼®ªû!Ï@V žG÷•­@˜¤t[NÖ@îÔ*t¥¬@{žÃ$aÁ@`É’`ĺ@¾ÇË:½@j b±›ÆÓ@ñË*É#É•@“·ŽMÇ@^›7xV+Í@ÕS– uÅ@9Á³ß9XÊ@2]m%ÎË@p d€Ô@,·/•¥žÓ@Ã2¶OP‡Ê@Dâ+I%±@ˆ1ny1¬@0qySPÆ@uMÈ•K À@(Xx’˜µ×@Èáwl×@,È|f×.Ë@g÷×ÖK­@„M©RòÖ@î$˜.ˆ‰@h¯¥CíÕ@mUÀ lÊ@YÍÑöÔ@Zf‡½þ/Ë@hMµïÍÓ@G]øÞÃ@o¤Ç"ŸËÍ@"{wìÔ@ºU3LÏ×@§ä¨Ó¢@p$Èyb}Á@&Ý´æÁÐ@¦èv_M×@¥x…¯@¬ƒzç÷Å@0-$Cç÷Ê@‡w•¶QŠ@•Þ"›œÇ¹@„º¬ Äv¬@¦q{€ëÕ@Äuɸ×@â…¸àÔ@††äweˆÕ@ĵ0h@¾×@ÐxŒªÜ­@ާܯh•Ç@¼¡AâÓÏ@/5çQ¹@±±z¦ï¶@Žâ¯0Ý›E@Õ¢a!Ç@þ!£èÅÕ@Úô¤ŸÁÓ@f3µlÒõš@¬óóÙŽ_Ä@p8«½Z˜Ç@œZdÛºÕ@èb¶!ωÑ@²s,VÚèÐ@TeæÁýáŸ@šm—…Õ@p\LÆcÉ@jyÒæo}Î@/ŽÖ›÷Ü{@IÁ@ùÙq§tÉ@_1†üܨ@l°ôÇŒÖ@…„Ð òÁ@Àq{Ò%ŠÖ@>®7±¸@C2fÉÝÆ@Á 3ŠCÁ@­ÄHgXWË@bâñ­Ò@š6ÎI2^Ä@HøeE·ÛÖ@˜i6“ØÃ@A=¾… -¦@„ÉÈÿu×@x¹/9fÊ@-àGðót¸@Ì—¢,½‘Ô@¤Ã(íÿ@¹@D"àŒ¥Ñ@ø:×@,¤ìNª¾Á@¡k“?)ж@`^©2yî¸@$”žiOëÒ@¦S’”Ž Ö@˜ÞªI·Ð@pY–Y¬Þ°@ÌCPSŽÝÄ@º#ÑR8’´@ _ù1;«Ô@‘z`²dlÂ@ÒÌ"œÔÑ@‹Ø™:‘WÁ@É€¦Ë˜æ«@º[®Ú¤@„JSgÊÔ@oâÚÚç£@æ¸fYæsÐ@¨™ RJÌ@Í-+i¼@ øÇ2d‚¿@Öf6Ð@¢’-&ŒÁ@Ù %T·Ç@„M#ùlš@àé¯;_2Ó@¸l昇Ç@!ñ uÁ@”3ΘCÒ@¶ÑñWÀÂ@•r¸Dú¶@z-ôxÆÂÐ@‚·™fñ Å@ô0Îq­Ð@Âeµ›§Ò@’¢»Ñ¿ Ë@H•j•Ù×@Ê@e£]¸Ò@úô81& Õ@XÞ¯ Æ@³¯6Z“á®@\f¦Nÿ@Z›B>BÖÑ@­[1DÀ@¥Âó'Ô@cí¿hù @بÐÑ@*¡ îUÓ@ÿŽý§À@~_-Ç1Ð@tƒ £µ@ÏÉ >^¼@PùØIØ Ì@Hp©vaÚÕ@GΨÀ‡W¯@PLž[Ó@¬Œ®Ã‡Î@\`Àm}.¾@ÄÆ&EpšÊ@DÁñé3 Ñ@Å©w Œ“¡@v8$M5Ó@.ýZbçÇ@vÉzìÕ@8M%f4Ì@^IìTÄ;Ã@8:ÅîÊ@Áü‡ˆëËÇ@³¢Ú•bÍÍ@(£–ô×NÖ@J£ ´CÏ@lë ×ÄÓ@ˆsg£$Ö@WŸ_´«Ï@ÙÅ —õ»@OAõlü=Å@gˆU¯‘¹@†Ö4ÆCÝÕ@¨¡AVÕ@6”ïŽ[7¯@ãn»³›E¨@þÄBØvÒ@E¢´{ªqÏ@êXÉâŸÓ@ÆÜ8€!Ó@þùl¿×@>xA¼Ë@Xz´4þŽÔ@—ÄŽ)|Ï@>²žÜ6œÐ@r£¤ÿ°Õ@j¼»ãáìÇ@ Qý)ÌHÊ@T›GñŽ6Ñ@U4¢ÚðPf@N½¢Ø‹È@øj †×Ï@VÑæÚÍÀ@˜ý$[<&Š@kø¡‚ˆÇ¡@Š¿Û‘_—Õ@þ:05²@nTHh~åÖ@¼áš¹ïaÖ@@9{,BÔ@­›‚[ò"«@“.^BÜ(Ã@òrµ,§@¾[T¾Ý8°@´ÌÂ@ ²o´ëÉ@G$å×DôÉ@GZ;Á¢@KY¸ƒ ö¬@YåA½ðÎ@ïìN€}Ë@(; TˆÁ@ŒÍ(PÔ@Z.¼ôk»µ@UKu °IÀ@¤`u‡,Ó@ Bìl8Ò@ Ë[üáêÌ@˜}^mÔ@ù¶« ‘‡Î@™Ü¹UÍ,´@_Jz3‹âÇ@ÉÎF¿×@—‚ Æ@¨f0» `Ó@f‘{Â@Ž{³Ô)žÑ@Aª˜¿@©m¥7#²@z²ðÛ×@†C(À@Cݧ *»Ì@ÀAÚåÑ@ (ļy5Ð@ ¼ÉrÏÇ@q®¶H7·@wn””0Î@@z½Í¬©@¼p>ç”ÎÆ@K7ç⚤Ã@ªpèòò\Ó@Óûޏ@eFý›˜Ò@žnBíb»@"Šó õÇÒ@ÂËñ[]»@D:ãxóš@$hoó>/Ð@SOC°]úÍ@* +mÓÔ@fGÂ~8CÀ@¨»ðJÙÊ´@Ù@¢æ)®@Ù“×^u´@’—û5«Ò@q˽)ˆ@‚¹¢8¶J @b~nϺÑ@tŒïè!¼@}_zIÃ@ÅÍÊ蔆}@3xRxÕ@N,¯§bçÕ@ƒª6<€€Ê@=ráäYñ¢@6ÌY"ži€@$œx8ÃÙ¤@.wߊ®DÓ@®&>[ÃÀ@û‡AK®iÏ@RN­v­Ó@ß™eO¹@“~Ñ•Ã@™¼kyÉ@6U¯]¨WÐ@Ð~ÕÁà¿@'`­8âÐ@zmÏÓ’¹@ÅäÌ,­Ç@JՙΆHÖ@0¡8¢‚ÓÌ@MÙ€‹ È@fúÄ@>ª[~x_Ó@Ž9»Žy[Ó@ºE1}¡œÃ@©QºzLýÄ@0”G1 §@œ¹DfhG©@?ÔtÅG ª@4ëKOhÐ@w7˜&Æ@É{7jäù½@aeªÁ@QØžFuÁ@¤FÍC_WÒ@ìŒ^”„«Õ@6}RÀ@ëèî¢x¢@gxÕ®ÆÕ@˜VVe—Ã@F¿ÁV8Í@Ѹ†%S9Ë@USÏâjrË@çd•ß9º@]k(}Ï@ZA©ÖpYÔ@tˆ°CšÎ@D2$—À@ÜFu4Ë@e¡¨g_`’@éè&|ˆÈ@b,~'gÔ@ ¢xïÁ®Ô@ºDû(¯1Ö@„ñ vy:×@Ûâ0Yã%Á@{®sÑiÀ@XúËbÆáÓ@{Ó€Y…È@ð(ðŸàÂ@5L=`ÐP¾@"éœIPCÖ@ü¸ 7ÁÎ@Ñ”ù/•ÏÁ@úlS[ç˜Ô@WšiKzÍ@Ò‘ýÅ¿ÉÁ@ˆÈ d!,Ñ@®ëŽ Õ@pG>ŽË@ Ýb2¡ÄÆ@F¤^ÐþÛÐ@y0ü* B¾@î|~^Ô@C,±¼‚‹´@emŒº@uˆ…ÖÎ@§§­»ÛÇ@‰ÅZ\¬@ª ó#gÐ@S~ÂSÀ@õ=~¿@x Ý×oËÐ@6]ÊÂcäÁ@¦FRÓ†xÆ@:è´DÕ@/S”íü @´²Ó@„l^åK½@¼NkÝ*Ð@Þ8]Z7?Ð@)Ð~¿µDÊ@D~I ·@ Ú¶`Öº@[²vÁ_Õ@ßUK0Â@:ÃÖ·XÕµ@#æqk±@æ4> ´@’,yaWÁ@nP·iÍsÓ@ÿÄDðÂ@pcâûÿÉ@–lâ6öí¼@ø°A—Ï@â½v¿Ó@{íOXV¹Ï@lLOê½ïÌ@6ô½m*”¬@‚Dkty’Ð@_å'”þ§@ºÙüg¢Ò@¿çWxÌË@¨AkmÄ?×@t‘ežðTµ@‰¡º±%®@)|$k ¦@ï:Xé¾2Ä@"²¬I¯@곫ÎõÖ@Gxk¤@£Isiž@lôÀ ]&Ê@-±¼°=¿@r“ç òÐÆ@Ì9’îð=§@ì[Hêd}Ö@M‹7}¾É@æâJ™Æ@`åSÝmÖ@=?Í)qÇ@u{Ìi@«±@9“µôUöÈ@°ˆTÂã}Ë@¬A(B§}×@Õ Š´@,c+ç•Ö@§ºý.Á@ÀfRNl-³@z¨¬¥2ÙÅ@’Ö3¯¥¯@þk¬¬Œ4×@–u«0¼@pBb¯³ßÑ@ï<>iÉ@æÁFGŽ @˼¥=ƒˆ¬@”Q7F°•Ð@˜äÛÓ@^ F÷Ó@=8ùi?Y¿@Ìd„¶·Ä@nÄ^øÊÇ@— ÕÖ5NÀ@ÞzaîíÀ@D7‹§®Í@î/¹©Üº@8ON šÐ@Æ,†´¯Ò@-}“<¯ÿ¼@@F ÐMÅÇ@NÀ¦ÃÄ@´DĘÕcÑ@ÊäMKSpÖ@'~t5–Û@>1ѵ€Ö@°å¾(¶?¶@+wC‡ZÖÏ@–¦½©Â@w9n œNÏ@ÞÌâ«ÝäÓ@ÄQfêù<Ð@´œ(½Ò@`e™ò¢º@O°%â‹­@ŽƒÇRQ<Æ@@Ûc*2/Õ@b âz„½@ßSÓ¿x ³@;Æ4%÷ã´@b!óÉpx¨@¸”œæ(”Ô@-¬™©¶ä«@äVÒRT@猘¿ž©@ìØØ×ŠöÅ@Ã@Ô„øÃ@(CöÙÿÓ@,Ƶ–ÃøÉ@ ÒUkÁÐ@½³“Vi{¾@áyâ¿iÃ@êlj(FÕ@©#‰Ï½±Ï@¿S_Ò@Âi$ÒÃqÁ@y$æÐF¦Ä@wÉM§ÝM™@JÏÉmBÎ@uã àØÆ@‰ì1  ³@vÀ¹‘HÕ@KãEƒ@ÏcGcë¾@èâeê^Ö@‰´Q€$¬³@<LññÔ@îTõ^(Õ@lU™9G^Ð@KÉ|³& Á@¹ëHHf±È@³ÿ½ø¦@få„£"Æ@-mŒç‚@À•w<À@r’æwÁ@—³VþÏÄ@²Ô>ÿKé¤@;iš±Ê@£šX¤É@ìÌì…äxÕ@èuöÓÖ@\EçñÞLÖ@´ggïûkÆ@Zê‰æXV×@î_ûÿÐ@û¡ñ€²@Þ“ç’Ö@þÎË(¹O@*Ž&÷Ã@ÕÄÂB0¨Í@VîBëº<¼@dI# Ý­Ô@˜\®Ùê=Å@Q_^‚Õ ª@’5Ó=òèÐ@Ü›ªZ`³Ì@Z|°Ô;«¾@4ÁÀçTy@Œë`ZDXÕ@5Å51&!ª@Ó1sÛ•×—@Û­f„¶Ã@ÙËmЬ´@Êð®áKÓ@6~ð¤gêÆ@VÇiÞSÔ@<“›I0Å@Ƽ]ÊNÂ@ŽóDHbÖ@6BŪ­×@JÄ‹qQÔ@~Q¨s¸@{[”=(Å@˜Ês5¶@0ßÛa¼@`òòÑ$ –@r™ Ö’F·@å&»^*/”@%C‹ªøê­@¤€òLÆÒ@<8Å£×@Ý·Jþ“Ã@î=³_jÓ@vÐD^½@äºMʯÁ@7O\xŽÉ@ñ¹ÈhÆ@¢Ø¡»ŠÖ@…ØZ8—œ@Ú™u‹·@!ݧ+Ó•Ç@¶ íÖkez@(µÿ2¨Ï@¾„¬^@Š^›oÓ(Ï@6úuõÄ5Ð@[7?†‹Ùœ@–Ó¥²Õ@2Ò®1ÇÝÁ@ÎÎX:Ô@å]8¯\+±@ ÈGLë#À@Vcÿ[}k×@ $‚[^á¿@!6°ëVÃ@J«É¼Ÿ@ð5±ñäÂ@3YY 0aÁ@¹mŒ~N¬Ä@d¡¾åÉÚÖ@ zûZÒ²@Z¤RI’Ö@•T4¿@tn:Àµ@¼îžìÁÒ@ÉÌ»”éÄ@|°‘våÒ@¶j@jµñÐ@"™“w²i¾@[Ò‡)pÁ@©oš¨ [„@b ®|¸Ç@(†¶ˆ@VµŠ²&Ò@è¾]ÆWdÃ@}ÈÂÍú°@WC¾ŸR·@ ꃬÔ@$iÙEA6²@FU¸•ÌÈ@Øe`EXÔ@Öûzå=Ö@Lƒ|J˜e@.ùÍk Ð@ ™±lüÇ@hðÀê®™@5þ‹‰Õ@ÿ5–âÐ@x`:_ïóÍ@€©ëé§šÐ@n¯¡áº¹Ò@ís¥«Iµ@ý?(`È@Úäåk|iÏ@ø*»$/ù¤@ƒ ŒO*ÿ¨@ÜÞ’^K¹@晋AôÒ@MgÍ@S®Î@iáV¶g¶@/‚ÏSø¶@ä.Ð97ýÔ@Da,—]ŽÌ@BÌr¼ˆò@_5›ò &¾@`¡cðXæÖ@W‡ÃiÌ@ X¸²¬Ä@ssUGêl¥@6ÌŠøõWÑ@ך}•îÌ@>Bgm4Ò@à³#Ô@º7INõýÃ@ÆhçkJÃ@š>Þ.nêÃ@fQ×fUİ@{+¦ñ¿Í@lªvuôšÑ@ïYWDÆ@4bFí{ŸÖ@AW÷¤ öÇ@l9j#ºªÔ@+ÚÏÐßy·@ ¾D¦!±@SG(j¸öÊ@ä9Tß9oÒ@³ÁÃg‚Áª@ªS튗8Ð@ÒPØ0{€¹@J™s¶Ð@´$pIIÄ@å’ôó1…@žÂ“Í¢À@Hðv$ûÓÀ@;`!ã?i@ÏÌgš Ï@f‡j˜Ó@ 2ªƒUl@ò- A:×@°Ç)GCV|@¾@êý@cÏ@x¤rrÿÆ@žÖ—øü7@Bôä•ë¿@6ø‹›É.Õ@Î$‹Ð@Áª{_Å·@ÀùI„4†Ç@*·kGšÆÃ@ƒ,P<Àv²@þ6î/qÒ@Ýxm¬*Å@oÁç!ÈÐ@8ïY=tÃÒ@69Ã0°Ò@¨YlIÇÊÕ@tñ§;¡ŒÎ@pü]8e°Ò@%Àz‘í¸@™#Ø×³Ì@ÛS6–³@Z™»3ê®@žò<fw¿@ þ Óm¹@€ÍáÔ@¿ÇªÁ…Ê@ø™g’Ö@n=QÈÄ@{Ëíu¨ìº@¤A³u2Ð@"c*TÊÖ@p-—$@MÑ@ñz£©nsÃ@[¥´FLh¢@!«µ!‘?µ@`â5²@nZ‹WÑ@‚ƒ^@dúÖ@¦SÉ ÌÝ—@÷’°ðKž@û¬e´Ó@êÔ,_IÓ@qü¢¾ŒÈ@#&¸ì›@ÎïÁPj×@"ã/·Õ@.¬½‡v_À@è„캨Õ@îܲnï®×@")±Æ©Õ@Âë2QÅgÔ@5y΄ ËÀ@aTâÅ#Æ@LÀõ·%®@N‚Ãê iÇ@„Ÿ­ûÉÐ@•ýPnb@”JD%Ö@²Š6)AÇ@bAD 0È@i;Cd'N—@§*ÅÁ@β£Ûô9¨@O¶0}Ì@z A‰gÑ@¨ðáR-vÖ@ýŒâÌ“PÃ@›Rͪ,Ã@˜ÜøP¿§@8èî©j¬@¼. ,+Ó@- … µŠÇ@¯âG–_Á@²uŽ”sÐ@ŠÍÚ¿e1Ó@,’1mlÑ@N¢[y2Õ@VÙ‰ºD0Õ@B¹'üjwÔ@]J¶Ü@—i¨z9£À@Öƒ¾*úR¾@H_ï)«É¾@lØ zÕ@>߬åižÀ@`ÁzíF¬@ΓÀ÷oÁ@oõ×ßüêÍ@Õ¶jÒ7¬@}`èH=‹¶@—E¼o°¨@ªÕÐÞÃÖ@¢¤EÛ–5Ñ@ØÛ‘Š(Tm@ë‘ë ÿÊÅ@ì´†úLw@’ƒHåò´Î@Vj›÷ÆÔ@R°™°Ö@¯ç²ŽûÈ@ßÖFƒ@÷ Ï]ïüž@ ö.Q^Ä@ äp‚Uã¹@œØäÃ@r‚–øØ´Ö@züõ°Ð@]"ÐtµÖ@@¡´á68Ñ@9 d“˜ú @yµmÜÕ@ žFÎ÷«@@uC+ ¶@žTï,Ç@êþ Fö¡Õ@}”¬|âD½@š™Òëeº¶@8 ~Àô@^̼2Ë@Ú®ÿ$É@6b×&Ë@ùǦmH…w@q^Ýë$¥Ê@†ÍÞˆC²@’áýœÐ@R/™ä)Ð@  Ë*qzÆ@Ò/C,bÐ@dZ±©¯œ@²ÀÞ—¥Ó@& áEwoÇ@à6G hÅ@±«ÈÃu @‚¡$ˆpèË@ôNq¸7Õ@KM lÊ@‰¬Ö¦¹@hY¡]²ßÐ@Ÿä­L¦È@ï©~³E¾´@p£ó³ Å@ÌuÐTdÓ@|%½‹‚Õ@“‡âI!À@…Á—ëcÓË@ÄABWðÐ@>b*»?Ñ@ÎR¤w,…Ö@,Ád‹Fül@ñÃÐÊ@d6Z†î4Ô@¸ük úÊ@xÌ™H´Ö@.mk5¾Æ@ÇDY—ÔÏ@´%³!¾¸@Dò§ÅÖ@^jfNþÓ@LɆKCu@\ðÞ€ÄÀÆ@œiÞôÅ@ÒšäþAæÀ@ܶW*¼@rùMŠÆ@bÈð¢NÕ@º]*x ÉÀ@ë¡Ú^2t@§¡Fž@Ï@Ûuh˜c@®÷1´ÔÖ@éVù a™@ïKíã±Ì@žHAË sŸ@â?ºÌ¾Ñ@<‹h`¬@ì}%e(É@6a&õ»±@‘ÒeuÊ”@žwA e³Ñ@RDWÈÈ@V¸µãhoÌ@Ê2u À@È~%@„ا@ljñœAÊ@:÷ÌÙÕ@Êÿ|k‡AË@\!çn !Ó@Jôd0^ŒÖ@0º8§+Ñ@Z˜§¤ð¶É@Y@ðÀ^Ðy@†šöÊVvÒ@pí&ârr@“rØö3×@¬wMÏøÕÕ@0Ëž0pàÄ@î•Ûdc%£@?2mßr¶@zç6ˆXÐ@¶¸ ¡’È@GËæiëº@ß-T¡q×É@¤BýñPµ@‚´[ì§s·@!4Ó˜_Á@~3.³@È&U8ÏÑ@r!÷µ`Ð@Hx 4°@ò}â%eÖ@~ÇskÌÓ@þU Ûœ“Ì@ĤHʈ¿@¼zd—ZÄ@h¡’U²Ò@ç¾ë:½*Ë@’‡”¢5X…@vz¼½TÃÊ@ýëòÄ@ß~q7‰Í@jû^¨°L×@­vwÚjãÁ@Ë)ÜÞQÄ@Åóû1 ¦@RQéÒ6×@‘wûÒ@–c xIÇ@J„ÜÓŸÆ@d˜7y%”Ò@@÷­5  È@€ÝÆÁh8Ñ@ÍÿÔMÏ@0&x6•ÝÔ@T+˜Ô@¦GÎñIDÖ@ãýOZIP¤@ž”ZED¿Ñ@. ™’(<¤@æ}A „P…@žIõò3Ö@°¤AÛí›Ñ@ÂQ{:RlÒ@¦–&xu°@´íåù´ƒ@îYp%³Æ@A”8b¶Bs@6Žq-ø¶@oZ{íÊ@!ZäùSÇ@ÅÜmݯ–@jW[ÕåAÕ@sB¦ ¿@d(¥þ^9Ð@š–¬`O×@¬Ù·¡°kÁ@¹{Œï²@\œ ;Ô@Þ³=.T×Ï@/kKË"²@‰Iò[mÃ@Jã4½qÀ@ñƒ¯š ²@Œy—iÄË@ažu)oÓ@¾9X%Í@¹á%yÄ •@N·dá0©@-hƯçÅ@ˆ_>JÑ@,u†‹¦z¬@P¡Â5áÂÏ@´ËšN¦@ñŽBÏS³@8ºmòº@BÅ´§3ÉÎ@6µ?ÐOWÔ@‡ÉåqA4B@-숕IáÄ@Ìëä@\ Z7³‡Ã@§@(¤áϰH×@Ê»ËжÔ@Ȉ®ÙÝ.Õ@à“ì^h!Í@‚ ƒ­M´§Ö@KSî:ÐÇ@}û®Ã—£Ã@:Ú $Å@Œ˜¾¯¯Ð@¿KøMgÂ@ ÑdN·¤Ó@ ôz¬ÊbÖ@ŒÆb_äÓÊ@&S+®¡°@tz ævÌ@Á帬Ðí»@ ælP”Lz@ØC®ÎTì¢@‹wk£@Á«-òeS©@Gø{ZÀ@2óé]6Ô@pÚW9jÀ@j^áB:ŸÐ@.Ðé#K¬@“l!L¡@ø¸.èqƒ@\vÝ'š<Ô@}\~®¨Bª@¶p/Z6jÇ@<|TË„ßÒ@PßUŽwN¿@ß@<:¶Â@ÃâråÏ@t÷hý}W×@VÒÏ/`Õ@°5}¨ï>×@ÌHOÕ@Ü·*ô½¼Ç@HVØòšüÅ@ÊÇ2tÌw™@±Y(¯"Ð@àE5îÎsÏ@RÀ⧃‘@7[Î%xÊ@¥Ýà[¸½@†÷H à>Õ@çþå´@QV§$S±@.=w.§èÕ@‘d4xÒ­@‡Õ‚›ò%È@nyËnkÑ@Jf}¹É@ƒ8«Nf¾@Z´ÞøÐ@ˆÿ}´°É@òñ§Ð@Ùùä[ž¯@48®\˜ÕÖ@2néÝ6ºÑ@ì»9ÛÙÑ@°6ÿQuÑ@Œ¯¶J×@´G.µt‹@uEU¯18{@7SúV@…;ªkŒ”°@¸¹Šä¢Ë@Þ•)Mšýˆ@2߈ßU*@¬ÊÁÏÐÛÒ@­ Š!]"Â@P]§a$Ê@•Û¼£tÃ@ I Ñ@’> <Ö@#º:ŠÕ@ö¡¼‡v}Â@¤¡¿ŠÌ{Ñ@‡8t£ª£Ç@.„Èí´)Ô@‚ê ãÑ@+ûbÂç ¡@g0EϨ¬Ä@Ò%üîl “@ÕÅ›¾Qt@´˜Ráñ5¤@@¤!À†l@<ŸÒ(Õ@R y×Á Ä@¾-NrüëÄ@¾Ûø”Ê@ýb!2t›¿@HE·õš¨@œ!€KФÔ@Þdê kÈ@m[¨¬*¤“@ "•Õ Ï@k©²á5¤@yM'³8»@Ò7KÒÕ@0”s½Ð@Æ…9n¤@¡Óœe5§@”Yd/»•º@ÈãÞJ¾Ñ@ü’¤ò±É­@zz{ÇÍ×@ lþa°@ûh‹q®ÜÀ@’ǃÝÐ@Ðû›¯µ½×@¨0œ§Æ@ 9BÏSÁ˜@ q–è8ÁÕ@fË ô9ßÒ@ÓMyÔ Ê@&ÀÈ{üi@3ùsÅâœÁ@ê-ªÏÊ8Ó@[ï>¤‹À@êè²slP±@ú€k>`¯@Ed1 ¹@èÿ\è Ä@¾FÞ‡CÖ@b¸?äh¼@Ú4´Õª»@aèf<)@À@÷±RZ ‰@³í M`À¥@¹ºÍ4†bÅ@Ç\_ PŠ@«mg†y³@ÆÊ42©XÔ@ÍGºŽÕ#€@¬bøW¹Ò@WZÂxÏ@Ò ÛÍw`@*< $—\×@Æõ¶ðLlÐ@ÏÛùç •@°)Á!‚Ó@²{5ZŸÒ@¾aªÐ@RȯÎäTÈ@Ž25v»Ô@á-ÎÛÿ0|@MÁ>ö„ïÁ@ÆW¯#9Ô@ä¾³¹lÓ@›$#æ´¾š@†{œ$£@üÃ&'Ó@|µÜBü¹³@$jù†!Ñ@«þeS´@ó2扻èÌ@ø¶þÔ³aÑ@´bÙÒË@;¢“38I‡@=¸NˆÊ@ôìÑJæÉ@×:ÿ«“òÆ@é íWÏÏ@ꃼ€ Ó@"º«Æ/Ï@úY»`Õ@õ¬÷uæ¼@¸£üVüUÂ@OòŽ›0À@RwÜö×@ÌîTê°@ã â—6”¤@˜÷>@ò¦@•Ú¸ø©Ã@FL¦@ ï?‚d¡º@ôO Ó™wÐ@ÎÚ]IbÆ@2©J¤Õ@ê­<—n®@Â?¥éHàÓ@$•·×8¼@(Ÿ7XŒÔ@“6Þ¿¦Ÿ¦@Ñ„ÚBX®°@ÊÆƒ¦_gÃ@hã²·4±×@‹GÛ•[Ô@¬Q§ÑªèÓ@6—aêöÁ@`¸ê2$ï¡@žŸn­ ÃÆ@´)©3µ@`-˜ …ºÒ@¨×©±eùÍ@,”aãϺÒ@LVù'½G¸@ŒJ¸ ¿@ Û->ØxÄ@Pm¹Ê×<Ë@Å]‘PçÒ@ .lJ\èÕ@¾þn™h"Â@9;ƒŠ®@ýà_WVÄ@KyIòÊ@°Š¸¦q~Å@—»YHJ­@éa¼ÿ®©@¾#maÖ@¡9óºK©@¶dP•0ôÊ@z1ãméÐ@VnÌ\Ú„Ñ@«å=±²+Â@{‘’w¡Î@‡g¡´*»@D5¼yÑãÆ@@»c4—×@;TL½ôžÂ@ƒ‘cCæÂ@ôYXâ@ÎÌ@¯ œ-Û€Â@òa‘ÖB¦Ò@Jôs¿CUÔ@]Ä• Æ@È8Å×dYÊ@¢vg‡ ³@ŒV¢QÑ@®Rm °åª@’”9@„½F,EøÖ@Üœø~¤—Ó@-$(´V—@\î,P)y¦@”€pIïÕ@ UÖìÀj@¿ϯ º@p¦ ƒ#íÕ@gÕ“kË@1º*Ã4C¾@+  }É@ÿ@žP™GÏ@MU4ýÛÍ@.ëŸÍ w×@.‘òBhúÓ@ MÄŠ(Ö@2Šaš"Â@™¡òHwg»@sT´}Ò­Â@ «`oœœÑ@SU«,ŠÆ¿@zæË47u¼@zå!t‹@LyEØ£@¿Cˆ²íl½@J¤àÇ6NÑ@ô’‚œ@wÕ5×Lo„@ªõ\/.×@ÓíÈ!]¸“@hTuFY¸@ž /3×@ÔjN¸o¦Ö@Œw3É‹É@W¯áÈ@ÂË*nP§Ö@P=‘X­Ñ@:í§¦ï¿@«5ÀVOb¾@øÜ©ËŽÞÔ@%N±yº@Nj”ÂÙuÕ@?#¹Û#Î@p5œˆ¦Ò@غְ+—Ö@ã½ê¬I¼@ð&<¯Ô@/ó\Zı@~Æ'æÐ@ DOºÜçÀ@ëØJ™ÌAÈ@™ŒE}½?Ä@‡-lÆúÜÆ@òšÀnßÜÎ@ØýP‹vÃ@‚_Á÷ƒÔ@Ðu¨¨«@¢®½6Î@6þ22Uª@¢–ÿßÂÌ@äBÄ¢TUÑ@ ìƒ>»×@R*º|ÀÃ@ V¡p$Ñ@ºDd`^,Ô@ðSz_Ò@øå«ÛLÑ@„+§Õ@Hn-H]ÃÓ@¨Q%3­\Ã@¦¢&n1|Æ@º¸²Ÿ‹ŸÉ@1°¶ÈIÅ@𰦀UÈ@Y²Ý·Å@"98kððÑ@B.Þâ£Á@Ë–L}s6Í@¾5Pª2y°@ö0Öýv'Ô@ðbQñÖ&]@Ü4[ÃÈ@ξԕ Ð@{žî…®Ñ©@>QÔ XÛÇ@ Y°†ÁÓ@üûûGŽþÌ@¢f)D²_Õ@dÌ*Fl0Ï@FÑØ\îíÖ@N€ÎÉ«AÔ@ôÖ?²ì…Ñ@Œ·®Ñ@`•}\GÕÔ@Œ¹²$qNÆ@ƒ0ö ´@xØ c}×@©^,¦¿@Ê ‘ÀpÓ@2þKÂËÓ@¼ÏîTÊ·@‘¦¶È‘Í@ƒö—姀@Îw>²@ãå¸=»É@”ƒRûÖ@ž.ELý ³@¬rOo§@äŽ]ŸŠÓ@”ï'—å½Å@"sZ¯Õ@Èd©kN_Õ@žÝ¿êÎ@D‡š¨?Í@AhA· Ï@Ž=|ò©Ô@,×ÕŒÇÖ@°D×” ¹Ñ@˜bûЏĢ@†tXëHw¸@ñ ØÜÆÎ@¶[™rìÔ@-’æP‚°Ç@ˆ˜Þ|ŽËÇ@ +þ+>Ò@èsIfÆÓ@Ø\ßEFåÖ@Ë܈ÈaH @X‚ÕiÇ@[÷^me³@h™º ¢rÕ@Ûu{²@=3º½ ÏÎ@T}臬·@§Ìæ%Ò@™»åƒá¶@Øï½-Ñ@oÁcá´@GŽ07Œó@@ɧH£I7¼@žôc¯©@t½Ë 5Õ@œ½Ï;^i @î\ë‰×@jSÅP(@×@:îq·Ü[Ô@¯ï×KüÕµ@÷f>ÖŽ›@ß©ÂÉêßÁ@麷ôšÅ@jÚ¼¤¯WÔ@sŒ&B K—@€§Î332—@S]Ê·¸›@ÿº#‰Ðe³@Þr·M‰XÐ@V} ˜ÊÄ@i ŸTDÇ@‚n·†¡×@’Ð_¤´Ø×@Ìä·ÀŵÖ@2« |Á@ÊCÕ‘ÝÓ@Ûõ!FOŒ@ $áùݸÉ@E]d‡‘¤@Ù’_Fçö¼@Bµ äÖ-Ç@šßA×Ã@fågxG»@m.P»|‡¼@þI‘Œ/Õ@ߎ5_«@ÜŒù¥š@(qL /«@˜YHÉ_–@u³¢1Ž ž@€<ž`»³Æ@õÉiX™ß˜@L4Õ+™¿@Î/†Ä|×@­ÙRŒTÆ¿@l¯«{µ!Ð@Z¤³øŽÌ¤@\¤ª)ZÀ@ô¬)ü±@«ç!—zÏÄ@Fç´ÒçÇ@¶güûO—[@[+îdðÅ´@Å3´zœË@§D…-DÿÈ@ìÕו'HÆ@);|  Ì@/©Æˆ‘“@{+‹&XY´@z’,[“Ñ@þXU+m†±@©‘%—ߘ¤@pOïáÐ@ž³ÁjÂ@ìQ×l]«·@LËn0ß³@O\)3¨®@Vêýô ¸@8‰gβ‡@ ×ࣇÉ@vº ÿlÕ@êiØâëtË@„<¿rîÄ@“J,†!Ó@7¬pYaö¹@v-¹-bÒ@“D?Í7ùº@ºV\xˆ†Ã@tdhaäÒ@‰ÐB´É@”øç×Ü+¿@úxIàÀ°@‘³Õ9–É@˜\T&i×@þñÔïû§¢@Þ²Ðô2=Õ@mÇ×#ï&’@ráHñfˆ´@,íì ‚oÄ@…g÷¸¹@-bbÀ²žŽ@È;o³ÄìÆ@¾%×7‡YÄ@Þ¾sòÒ@ÌèŠn <Å@ZÐô¿Ò@:ÝòJ‡È@ ñÙ—MÐ@sr„fãv@­éTVm Æ@Øl?zù¢@\ß))ŽÐ@`¥eò÷Ð@¶¨«,™ÈÌ@Œ€@ª–V×@¹‘機EÍ@ îQa6ÕÕ@–ä>6c¶@ÌÂ/³iYÐ@ôÌš×%µÓ@r‰'æ=´@æà™­éüÓ@ éæ?ak‡@x³@b×@á ž÷Ê@?›'>¡«@Æ@FÉϳ­@!68lÔwÅ@¾có/AÔ@})™g £@Æðˆ4¤öÉ@Jõœ{c+Ê@øÝ@®Î@*m‰@úŸ@¨t1_›Ç@N0Õ=Ä@¤©—mJ¼@õ VÏÍÓË@‹ƒ»v€Ë@xGðeÌÀ@Á!õMï5Ì@³©ð“º—Á@º­UèÌ@_ËÞ¢"¶@+’ØÈ@ü:%Øo-Ö@méAÁÄ@κ63÷mÑ@ñb=Ϋ–•@aÿEÊÍ@Ý+9Ú?‡¥@,ÃR1MŽÈ@È{–øË@¬´3²CÐ@Wx Õ'Á@®À•³z¿Ó@v‚RrEþº@ê£L¹7Ã@Êôö;”Û±@à¯w~YfÍ@ÈA'¼NÍ@õÁZÉ]¢@´Ü’ÖÆÃ@â£Ñ,6Ð@ŠŽ–í¬µ@tðžü"Ò@ú£Ã)í“@ãºÌÅ@uƒfÁë·@œQ«%ÊyÕ@ Å?kÈ@ð;¹%‘DÎ@­âÐ{uÀ@Pâ]®;Å@[hÎc„ÈÍ@*îÚ¨¼Õ@¬/R‘ÝËÖ@—Ù±¶²TÁ@¿ÇnJ†¤›@xÌZ"Ñ@Üë¹PiÔ@çhOŠÀÏ@të(ºà¸@ãëõ’6@ù¯‹Þi¡Ê@Ž%Ҙġ@ mšþdÏ@©‰¥´Az¶@uPÙ•{™¹@ 骬#×@hÉ»Bp>Ñ@¶š¢51èÔ@Îà¡l¬o‘@"Æ9`døÂ@b)jç¡×@¢G`¤Ö@XÞ7œÔ@ëµ­ÿ1¯@"…;ÐWÑ@…Êîf§¶È@‚Ú_jŽfÑ@~§Ð" Õ@ã”^›yË@ïI;€!>³@Àõ>"¤ï»@ÞJ³Z²˜µ@’AܽtMÖ@?c¥†ÇÆ€@Ô+_‚œÍ×@/dw¤NßÀ@´´ãhÿÐ@Ngè”E›¤@ìú­æÓôÒ@Þ÷\ù+Ö@„#ñÑÅ÷Ã@Â?¤J×@%m(–¼@krÖˆü¥@Þ¬·´Ð×@ÓIxòf¯¾@ @5’F3e@ÂÞÌ+ Ä@žQ `;Õ@£É£&1Ë@õ*2D˜Á@qÖM² €Ä@hi¹ p±@ ìÆŠ:Ñ@ÿ…`—»@dïAËw#»@œ}agùÓ@€¼iAcÑ@'Y¶‰OÃ@ªL-¬BÕ@÷?ã̾@NÀÇN»¼@ÎËPÔË¡@& ¾Ø–Í@¯èÆåe«@Bq«„uíÂ@Øn¿5WñÀ@“ ;Ã@« ¤«ö¨Ä@¨Óº<„@ñàxîZ‡¾@L†p/,‰@õdcÙ­ @¥EÈIðJÊ@ÿCˆá¡É@>æg—Ñ`Ö@ãF¸Ge“@Nà&¯± Á@aÚ^3WÁ@"ìûìå·@ª×õ=Ò@µ€2”s4±@ÙœÒ|Å@ªtQ=Ë@œ{“Ë@ÖQŠƒ„JÑ@j‡¥kÎÄÍ@Ž´*º_Æ@E\Ò È@Þ«*‚’xÐ@ÊbIæYÔÖ@”#ÕÓ@$TLºÁ%Õ@ÏúÍ:Í@öQÀ´ì&Ö@;¼îòwµ@PÂÏÛ‹ž×@hzO?¶;Ð@Ý éÜÓ‘È@F3y‚ϲ×@øæZ/äùÎ@”ÀrÁ/Ê@˜-|»ëCÖ@#êS?ÖÅ@c,¸Ò¾@÷¿Þ9 áË@…ýÁ@8·<#¾@¢r‚À>À@âñÊcîáÀ@˜½)DÚ·@¥ˆéåóÉ@Ø3ñåÕR×@)~Ç@ƒ¦•N¸È@+÷‰·…Í@Z›fŠÓ@âo³äÿÒ@MRÙôÀý´@ƒ–¿v¿áÂ@ÈŠN±Ó@É\;òñ4¶@h÷(ÚðÔ@hpIˆ°Ô@Ö1È‹=_Ì@BùZ焪Í@´î¬Ú¸@‚ë7½ÞÒ@$s»LBÉ@¤À ¤lSË@0ø3·ÆÂ@Oß'¶z4~@oÞ[·X¤@9HßÄÀÊ@•¨ }nvÁ@xÑLˆ½ØÖ@…ðgáAÇ@\ ÷T¦Ì@Å€ 52È@Á[$ö’Ö–@t:àÙܶ@–•¬¡ËÓ@%I‡;67Ë@’ÿ¬ÂA²@4E!†MÌ@3s+À@LÑ>Ÿ§qÐ@ï$Y©ºÕ´@ é‹wîhÊ@2“D’øË@ˆå70ñË@¿õjÌ·½@bý"´@û†üÁ+Å@ÃZÐolÙÇ@‘¥%Å@‚ŽÏŽ`5”@R×¹º"Ÿ˜@2]å.vXÒ@cb/>0»}@)æüaÉ@LÐHèÕ@Î3Åp9`¸@¦¬ì%ŽøÓ@™'ˆå••@)x¼ó¹@*Ô_›)©¸@"IùIáŽÏ@؉‹œÏÊ@•uØKÄ@âTÂýë4£@{G´WÅ@í«¡–ª@ºFå-™É@M“Ñ )E½@ñVwéc—@L+Ø×NÑ@ à'oËŽ@†G¾ÊOÓ@ê@ÜðeÅ@p<è‹ù^Ñ@ÚS¯å´øÃ@~«¬]@áŸ@{%2%ÝÆ@®Ð/m¿@=æ¦*Í@÷OzZ½ôÄ@’ Q®@:é>}ÎßÑ@"Ï{°‚×Í@BP$Å ®@$Œ¸WË@„roßwý¿@²z2•„Ö@ÌQå}™òÕ@³€—ôÛÄ@<…϶Ë@Z¹J)=Õ@ bíSÃ×@JËÏF…¯×@ñSo¯u»Í@úOú(É@KA·_Š6Ì@ôÌÓ—°Ò@I"×s…g¢@¿l³wÝ8À@š©˜¢”Ì©@†R!¹¢@U?£ux¿@:W¥¤‹šË@©C` qU«@@ÑfÉ’ÆÑ@Ž\–´ä×@»ÛÞ“a(·@ðOQÂ@J&Ç0@ÓÒ@‹ÄÏ@)-íeÆ¡±@XÛœ»]Ä@{«zk¯Î@€ö¥C–¿Ò@ÞÚÖ{ƒÓ@\ãD5qÈ@¾‰f=­@RlKÀ Ž×@hûïÍ™¾Ö@êMËÁÎÑ@i>¾ÌìÈ@œÂ;S`OÄ@2Oðžƒ!Ð@y*Î1 7Ï@ÚgmQV3Æ@9cnáË@i­ˆXgª@nÊ™Y±Á@Í!ÈÅà@>dÀSócÒ@½ê ÿÍ*Ê@–ä Íq’Ì@ ¦‚ ‡…Ó@¹Ç Ö —@Ëo>ùñ»@3ÀƒóŽÌ@ŒÔ³î¿€@¤ôß9ËË@˜»±«ÎÓ@¥]që ­¼@Bˆ‰N»QÑ@úPÝÊ@‹÷¦k^Ê@µìÏ%2´É@ðX ðšÊ@w™n±[K»@ç1FÁÓÇ@Úóqh É@H³2ݸ\Ð@ªs'~þÁ@Àx4­‹À@ÂKQ’¶×@ ±ZBYÆ@GÿÐ=ËãÏ@¥FX§eOÈ@é4n‘OX³@–J£|Í@¢¥ìë3‘µ@j#PÀü…Á@ŸÐã¶%Â@Öôäw^—@©ˆ7xÍ¡Ã@®m“4<°@¤1ˆ™@9NzûGOÎ@–ד”Å@É„høyqÈ@Lö5vªµ@9©3ñ]¾@O¢Ôæß@õÇ_©èÏ@jÃ2#H²š@&51UÆ@Ù¥;ìMÀÙ?,Xq¬@q0žðÒ@®£“h˜1Ñ@úZ³òÏ@èÔlב`È@_ãÌ]Ûµ¹@¸ÉüÞÊÓ@URײµ@²E½Ï$ôÐ@]àFJÂ@ërÕ–"Ñ@vÞfC¥¼@èGžO;Ù¥@¨àˆå0Ì@–Y*ƒhÏ@<íy¾ú@Ò@J+š;ÄSÑ@òhùÜ‚4Ï@œ„¯{ÏÒ@VåuEÑ@è†aÑ|±£@\vàÇ'Ä@àƒm{êÈ@qs¥ÃñåÈ@½Ïƒƒe@ÔÐu?Õ@ì(½Ð”Ð@A|ðmÏOÈ@:òá ÆÒ@ï- ÷°êÇ@Ê][*;½@çÎËt§ò@I¤AtFµ@¤%¥â¨@wO$úk~Ç@¼¢xepÔ@û€žŒô²@ž_±Q Õ@¯: ‘b¡µ@:VµC?Ö@S  qr­Æ@€ã­››è×@Ìv¾K›ŠÒ@ñŽ=‘ùSt@,†Õ+ Ý‹@P¡¤Fê)Å@³x:aÔ÷Í@lÿX±_¸@ÿh»òÄ@Zú ˜ÆíÃ@ £)á0ÆÓ@3·”ž€@”‰¬¤CëÀ@iÖâ¶Ã@\(qªAAÎ@ó>Ê@Bá¨s]¹@9PAZ°°@{€°¦öË@˜¯/˯[×@’…‰›Ó¾@úNOVoÕ@³¿ksgrË@’VÕúÓZ©@6úó:ðÄ@íÔY ¹@ M¯›c¼@XÖ'¢@®§¢ {ÕÇ@…×»¢jÆ@C7{AwÈ@('ùìrYÅ@¿:'TAá±@F<¨lÚ_Õ@üúÚªÕ@øéÕ p¦Ô@±âù‚±Ë@xñ¤Âr¬@3VÚ%Ö@€'éC×@2–TÑ@Gé7¿wË@V lg·²È@êüe\RÕÉ@—ÇÚýG¯@ޏfQr&À@mn7Ú³Ã@ÓöÞGµ@α;°ýÐ@JÑ—‰@#íüšŠe°@•i gÎ@Þ»‡º¼@#_MÌ˨@Ei$Ò~È@ ÊînŽV¦@öÿ°²vç@ÓP&÷ð—º@Þ/VDjÕ@r1J+š@©æ«¹ƒÀÆ@¸šþa’Ò@;` “é‘@ÊîAI­!®@í,Â@Ö¾Å@ ~0›/tÆ@p8çY[Õ@ôÓìž+ƪ@˜Hïúj°@¨ðÒp¼Ð@1°æ/ªžµ@h2%2.“Õ@aáåÕžÀÅ@ÕŒ¼ b¸@|zèÃÒ@•Áµ.°Ï@—ü—4¡@MOÒ|À@R&± žâÑ@HÜ͈”?¹@5‹óÇ@t¢]p¹ÍÕ@nöÑÈmÒ@ØÒ´HSÏ@"ýCÑàÉ@ü?¶âÛÒ@·¥ ­Ë@–Ý(~´@©¡8xJË@†جçŠÖ@$wdAň@Y¸òs±Ñ@ªí†Œ˜@‚^¸l³Æ@BŽƒêüÒ@ãì*§ü¹Ì@´¸2ÄW°@šñg¢ËŸ@úí€y{HÖ@Ö(‰ø”ܼ@ÎÆw’"¡@LÂlä°Â@×Q¿ä÷ã¼@‡å)ûçÁ@”3}‡´†´@;H)Äu½Æ@ŸcJ/'æÆ@)~EÀÑ£@´ô÷È@Õ¿‡ ¥@p¡HîTvÑ@ 9ïßIÔ@¬¯,YˆÐ@j2ˆxª €¾Ô@¤KX†rÛÖ@a°´UЪÇ@.ùP“D‹¯@|eU&(¿@–ê—/»½@ÐîœSÅ@:ko;Å@\ÊÜ/Ê*¦@æ ‚å6¸@žˆùñy Ô@^F°Á×MÓ@  N„T%Õ@CUŠ3ΰ@"ãî¤hxÔ@Ž JÿlÑ@ʵ>…`Ð@ñf}J”J°@•u)pÅÂ@nr reé½@¡º_YÒû¸@æÝ'ZiòÔ@WEyèl»@õ¥%ü§¼@ƒ ܨ@Õ(Iñ!²È@2Ô¿Zõ¡@˜[_×ÿJÑ@R_€£l@˜@°æ³àŸ+Ã@‹Qò®4ÌÍ@^0*‰•óÓ@M?@b¨»@¥ïoûn¢Å@:]+ Ô@:Ã%™|ïÔ@2!)(3à”@€ÑÝ1X‰Ö@ÎQØ€‰ZÈ@€&Õ/ÙƒÁ@âåKd3§@{DCoÜã»@–%;»@ÿ!ÖüËZÀ@™FtîÎ@FÈ ¬è²Ò@ÿæC¨Œ¼@¢÷,®¦!×@N4*ÛÊÐ@é3„Žæ®@¸I2gØ­Ï@%‡ ?W¨@ÅžyvÔ@ºªÖ­AÒÔ@Ü?m;SQ”@«Då/¿@m€²–«@]9Öa »À@öQEÙ»@œÔÒ‚Ô@¸o˜iAÕ@u`Ð{GÀ@£«¿ÇÁP¡@|žþ"¨ÃÓ@•õ‹Iù2Ã@3úE;[LÎ@¡QUßÕ@îjQô©P×@jë.ÑP•Ò@A—¦}:5±@ògÐ@?²é²àöÏ@ {”J¾Ð@Qž–ª³@I؉܇°Ë@0É ¼m¢@©CŒvŠª@9ƒÅ”È@BµÃúY6Î@¦…ç«1$£@mbbïÍŠ@öó¦MQçÄ@DcX’«}Ç@G‹ˆe@½¼@éµËoPš@[ÈXDÃ(É@5/ÅñûÏ@ÚRË èã®@„æqâ£@ ÿ_ù1¦@¯ê1d«À@ÇÇü¼¸@öY „sy¤@öP‹k&¹@Þ.ÃÕV×@ˆ—ÂÍ×@¥¦uoÄ@"¦¢¨™×@(´<³ºÏ@¥Šôt@®Ä@ùù¨!ÂOª@6å–שÀ×@XjÐäeÆÒ@ ’½B'cÇ@£$rTch³@~07¾ç‘Ó@ÅW^„˜®@¯ÐbtÞñÊ@VtáÛ_Ô@d—•Yº$Ð@Ȥ'mäb–@×dî2‚öÈ@EÄkX+~@‚¢ãÑ@]£0·Á@~Èmô\Ä@‘E€[Ýî·@Çr-Æ s@ ÒèÚÃÕ@î°6.¾@ÊÝãç:(Í@âøB»@ Oëµ²Ð@U„Ž¡ÛØ¢@ùãÿû?Í@¦¸µnëîÓ@üÚ'‚Žt¨@Š[ÀˆŸaÄ@^ –?Í×@Yàe(X&Å@€Ïz!¢‘@¼Eµá³"Ò@mÇæÁŽ´´@ÑÂÕÔ²@\*œŽÕÆ@ÒK@BÕ@™YtHxµ·@ ¸=!DÒ@¢e«ˆOÉ@ÞºdÌ)Ä@7y-šÏ@ªRW\±pÖ@Ùâ@ £?˜@&•k%£¦Æ@˜q7I‘Ì@ºA,űæÂ@{œ§aÿøª@AÚ\¸¸Á@Ÿ…o÷™Ã³@•p‚WoÒ@ªôÊòÈ@<EtÒ®Á@(4óØšˆ@šW=¸…¯½@Dו×ù5Å@?—ôÈåÊ@ÅL!8Ö@Äq72fÀ~@²!­•Ä@8¢E´Ôº@ò£’-9Ð@–:,î§Õ@lÔ¥05Ò@„z&ßÙ»@?ÿÜáE–@¤ÿYœ0^Ñ@ÎðÈ@ —ªý=Û×@e ¹„‹¿@Ô±yÒ@õkõ¥<Ë@!ëÜi·@.ó*ýBÓ@ã0gèË@:C ؽÖ@Z^”­Š¡@dó—öÔ@àîà×@ä]qVÿ¡Æ@b[m~·`È@ž2:’ò¿@Á‡1Êú±Á@çû0l<ù¼@›NÀmÔ¯@Ï[ÈZ„…Í@“an8úÊ·@ýt–,½‡¸@œŒü‹§Ô@3Öòõ•Î@XW‡^ÕÐ@ôÉ1áŒjÑ@KpùR¶Ñ@„éȱæ±@ßéGðÈ@¢+žúZŸÓ@²LÝ(ØÒ@)qØÛ¯{Å@áOÈš›r@÷ !:µ¹@^/üÜ6Ò@~×DÁíƒÖ@xÈ"ÎÁ×@Ü^üœƒÖ@|÷s_2Ò@Ì~;øZÑ@j”ò[Œ·@Û`Ÿq¹@D7êPÄ@.ÑJ«@¦hõv×¢¿@†˜B›`Ð@OØÇÙÔ@0õwý³Ð@h΄ù›Ö@¨¶z×TÏ@7Ûs•Ò@/ƒ¢‚ªíÄ@þÀåUÇ@¶±§××=Æ@㬭 `»Î@ˆû@)’@¾îJO²Mµ@ÛMÕKË@Xк‘šÀ´@œcͪàü—@b ‹ 9‹@&I!ó3@Õ@»µ ½Õ@ªKÇìæÒ@CÀ¡ô¢6¶@125(Á¥Ç@pl vÝÑ@¿«m Ë@dÑ~Ý“Ò@Òe\hµE§@ÐZ¨~Õ¿@ùT;×ê¡Ë@ v ¥b[É@ZŽÛÚ_àÎ@ÂF ¤Â@ØL IÁË@xN$öT^@Œl×Â6öÒ@Âq>à€ž@öú<”ˆÉ@E³B‘g:È@F‘¹ŽK•Í@=šnŠ.§@†Íß’e§@„ˆµ ºÐÕ@~Z½Ù¸zÓ@ö _ÓÐÕ@,Çz¢¤Õ@´šãÙÌ Ñ@»êo8Ë@ÎKÖBÅÕ@€wBÜ¢Ò@ôïsa($Ä@¡!zÔóÃ@ñ±3X’éÅ@³]þÙ\õÈ@Ø&Å5–’Ö@:U3¶íÖ@ªBo“uj¶@^œ0ýaÖ@¿¥ò.‡Î@žsŽžš,Å@jsÏ:ªÕ@»Rkí˜Æ@Øjxìñä§@{Ð9h:R¹@÷ £NÊ@·0ËrË@*zjK˜ÂÔ@D;˜îè1Ô@\··Ò–Ï@ØëŽÈÅOÑ@û9¨‚xvÇ@<û/*Š×@œ—Ë B ×@„Žrµä³Ò@Ç" }a´@€Í 1ºTÌ@>ZòD_ëÍ@Å’WâhÂ@$аâƒÖ@ ”ŠØPÅÒ@óÿõê½Â‘@Q:šEkâÄ@/—Ú¼ç·@’¨JDæs¿@ÌDßùp\×@µ¢õñèÎ@ƆDåÓœ²@>ZËTÁׯ@öç=-iöÓ@ªmò^ÜÕÒ@Ã] ™Ñ@£7ôÑÌ@þëä-SÎ@e`¾^öÌ@Ëžýê\Ñ@Ý[;ö—ˆ@ñŠØ;ø²Å@ìÎøÙÕ Ñ@ÜÀR_¥'Í@xܹœ×åÒ@”¦Lÿ‡¸@leUF›²@Ðxµ«?¼@Oî˜y{@ÅzvìÙi¢@Ýe›U²@Éê…¶@ä”ÒG½¾×@öÔË‚@º@œ 0ñÐÑ@ÄF8â–ŠÖ@ ¯·±@Ú}fKvuÒ@èR6Ð;Ó@Òroì.ãË@›à­Êíª@®&ÚÄÏEË@f(¢ç6´@ŸÖ¿ÑÊ¿@.ÑLࡎÉ@º¯¨Ø=ÄÓ@'üí©È@ûÒ&h­~@Ð¥f¹üXn@ ®¯â³@§³9CJ0³@Àªý"\´Ð@ÒSÕ$&†Ö@ú‰Û¡º–@xÜä?uÒ@ºíšÊ,¼@èÔ66ÐÑ@þË5¡@Æ@ÜÔŸ‰Ì@8V/·~nÖ@æ’²?KË@PÒ? jÌÐ@µ°ÓlsÒ@{Â.+ÿ±°@ñO/>^Ê@›*ùÍ×@¨oÛ”†Þ¼@†T ƒˆ‡¡@gÞÚ5‰Á@Ð@‡† ×@ÔÚxèÒwÔ@Iþ…ÛáÒ@œÕs™sñ¹@ÖWt¦øÒ@áÌJ¯@úšÓÄ@¾#ÊôWe@ºÛêgFSÐ@ èc¥KŒË@ŸÖ"Ä™½@Bˆâ±ú©Ó@ED)!ÂÆ@ˆ³éõ[×@@º³eÈ@²Ø@yœ@кpª÷c»@g¸oŸó°@„Õ¨ˆ¹Ä@M߾ͦÈÉ@uÏöGÏ‚³@¡b¼Ï@@Úèqb–@Þœ—hVÒ@i¼0u‘¹@ߦBÃz]±@[lÑ©Ã@Ë` ü¯ÊÄ@·MµžBÚµ@ΘdmÆÖ@ˆ wYh¬@ˆ_Â05Î@—æ²O £@ä|š|×@~#¤­®Ë@î¥Sa¬Ò@[_EÉ @@?œØ“mÓ@†~a ž×@F'wÜàÖ@APÕ/©“@4 ž¥)ñš@H¦.Zc ×@ åšËêÍ@6ü‚«GOÐ@O΂K›oÇ@1¯éºËi³@¸n¯0û-Ñ@ õ|r}’Ó@©u½@’y©XTÐ@’h±6ÐÑ@s Á_˜Ã®@d[Joûž@V<—õ¿Ï@jiUo"7Ð@wò=J°¹@p ÿŽQÆ@PÚàwÓ@óD….§@_*þšÍ²Ã@fÉ®‘#0Ã@Xk IKÑ@¼‡wCaÀ@ø¤ØæÔoÓ@²ŒtL¯×@ö¦Ð(„²Ó@t—öw2¡@Þɹƒ¡YÒ@ ]Ä‘Ÿ‡Ë@<±]ZDÎ×@C±ûÌ_Å@¾)£ZŽÊ@‘¸¾4ÍÁ@.Ôç½ÀÆ@ï ©˜C¹@m.ˆ¯]Ú@îÔƒßÏJ¬@{UOX½3È@Ûò/›>Â@ðÉ*ÕǾ@J8ø÷ý†Õ@A±Ÿ@õœ­@ k!5ºÑ@h>K$QÑ@§H•2À@KŒ›åÔÇ@BøÇIO†Ò@>WÔÀPÒ@èÍäyÏœ@Ü"ƒ®w¸@>07#jÃ@áLÕYaš´@ˆhá_—¯×@pvó‡3Ð@Ö®}„j~Ð@0¦{ÎdÕ@û#Cd¾œ@»5· úº¯@R‘Uìc.Ö@R axÝ#Ñ@ ^§é ÐÅ@±’y¨tâÃ@ .ÐJ<›Å@lò¢XÉ@ËR¨ÅóÑ@\8èô”‘@w¿”¾¦Ú¸@Œ"»ÐÜÊ@ŇTY´ÝÇ@äzõ‚ÆÔ@¯ ,‹Î@ ÜÎéÚ|Ð@¦'Ô(ÅIÃ@TµJ?¬TÖ@­Lo[¿@¬¡ÇYEÆÌ@ŠS‰® Ô@Úò9|Í=Õ@¹?`z ª@)åý~³®@ˆ:R—!Ä@P¥¯Ç'ÿ£@‡¾N[•·Ï@ð4azªÇ@˜ÃÉàÒ@û29ЛgÃ@„Ô’Ÿ q½@£0°.ù˜©@ˆ{öu°³@*t€ìó#¢@ Œè¤@©ÎQܸ ¯@Mè3(ÆÆ@ØŠ¥mbï·@Öåh7Í@JíWÌé¸@¡£õÔ¶@­SP\Áy‘@ôzç&ô»Ð@ °Öb·Ñ@‹{؆½Ñ@¬ÄÝL“¿@åV[Ói´@Ž:׈Ï@Â/[ƒÎ²Î@Æ:›ý£TÐ@0?Ü•€Ó@`¨=e2Ó@=Ê íÎ@(Ÿ=`À@#|öH Í@γçS´eÒ@‹_Ø'Ú¥@8¤em®¹Ÿ@Šnw°dï±@„Ž,€Nd “Íð×@|öHúÜQPÀ(d “Íð×@|öHúÜQPÀÂ?ôÁ€N  €@ €8 (€À€x H€ @*€¸ h€ À:€ø ˆ€@J€ 8( ¨€ÀZ€ x0 È€@j€ ¸8 è€Àz€ø@ !@Š€8H (%Àš€xP H)@ª€¸X h-Àº€ø` ˆ1@Ê€8h ¨5ÀÚ€xp È9@ꀸx è=Àú€ø€ ‚A@ !8ˆ (‚EÀ#x H‚I@ *%¸˜ h‚MÀ :'ø  ˆ‚Q@ J)8¨ ¨‚UÀ Z+x° È‚Y@ j-¸¸ è‚]À z/øÀ ƒa@ Š18È (ƒeÀ š3xÐ Hƒi@ ª5¸Ø hƒmÀ º7øà ˆƒq@Ê98è ¨ƒuÀÚ;xð ȃy@ê=¸ø èƒ}Àú?ø! „@ ‚A8!!(„…À‚Cx!"H„‰@*‚E¸!#h„À:‚Gø !$ˆ„‘@J‚I8 (!%¨„•ÀZ‚Kx 0!&È„™@j‚M¸ 8!'è„Àz‚Oø @!(…¡@Š‚Q8 H!)(…¥Àš‚Sx P!*H…©@ª‚U¸ X!+h…­Àº‚Wø `!,ˆ…±@Ê‚Y8 h!-¨…µÀÚ‚[x p!.È…¹@ê‚]¸ x!/è…½Àú‚_ø €!0†Á@ ƒa8 ˆ!1(†ÅÀƒcx !2H†É@*ƒe¸ ˜!3h†ÍÀ:ƒgø  !4ˆ†Ñ@Jƒi8 ¨!5¨†ÕÀZƒkx °!6ȆÙ@jƒm¸ ¸!7è†ÝÀzƒoø À!8‡á@Šƒq8È!9(‡åÀšƒsxÐ!:H‡é@ªƒu¸Ø!;h‡íÀºƒwøà!<ˆ‡ñ@ʃy8è!=¨‡õÀÚƒ{xð!>ȇù@êƒ}¸ø!?è‡ýÀúƒø"@ˆA „8"A(ˆÁ „ƒx"BHˆ A!*„…¸"Chˆ Á!:„‡ø "DˆˆA"J„‰8("E¨ˆÁ"Z„‹x0"FȈA#j„¸8"GèˆÁ#z„ø@"H‰!A$Š„‘8H"I(‰%Á$š„“xP"JH‰)A%ª„•¸X"Kh‰-Á%º„—ø`"Lˆ‰1A&Ê„™8h"M¨‰5Á&Ú„›xp"Nȉ9A'ꄸx"Oè‰=Á'ú„Ÿø€"PŠAA( …¡8ˆ"Q(ŠEÁ(…£x"RHŠIA)*…¥¸˜"ShŠMÁ):…§ø "TˆŠQA*J…©8¨"U¨ŠUÁ*Z…«x°"VÈŠYA+j…­¸¸"WèŠ]Á+z…¯øÀ"X‹aA,Š…±8È"Y(‹eÁ,š…³xÐ"ZH‹iA-ª…µ¸Ø"[h‹mÁ-º…·øà"\ˆ‹qA.Ê…¹8è"]¨‹uÁ.Ú…»xð"^È‹yA/ê…½¸ø"_è‹}Á/ú…¿ø#`ŒA0 †Á8#a(Œ…Á0†Ãx#bHŒ‰A1*†Å¸#chŒÁ1:†Çø #dˆŒ‘A2J†É8(#e¨Œ•Á2Z†Ëx0#fÈŒ™A3j†Í¸8#gèŒÁ3z†Ïø@#h¡A4ІÑ8H#i(¥Á4š†ÓxP#jH©A5ª†Õ¸X#kh­Á5º†×ø`#lˆ±A6ʆÙ8h#m¨µÁ6Ú†Ûxp#nȹA7ê†Ý¸x#oè½Á7ú†ßø€#pŽÁA8 ‡á8ˆ#q(ŽÅÁ8‡ãx#rHŽÉA9*‡å¸˜#shŽÍÁ9:‡çø #tˆŽÑA:J‡é8¨#u¨ŽÕÁ:Z‡ëx°#vÈŽÙA;j‡í¸¸#wèŽÝÁ;z‡ïøÀ#xáA<Їñ8È#y(åÁ<š‡óxÐ#zHéA=ª‡õ¸Ø#{híÁ=º‡÷øà#|ˆñA>ʇù8è#}¨õÁ>Ú‡ûxð#~ÈùA?ê‡ý¸ø#èýÁ?ú‡ÿø$€B@ ˆ9 $(Â@ˆy $‚H BA*ˆ¹ $ƒh ÂA:ˆù $„ˆBBJˆ 9!($…¨ÂBZˆ y!0$†ÈBCjˆ ¹!8$‡èÂCzˆù!@$ˆ‘!BDŠˆ9"H$‰(‘%ÂDšˆy"P$ŠH‘)BEªˆ¹"X$‹h‘-ÂEºˆù"`$Œˆ‘1BFʈ9#h$¨‘5ÂFÚˆy#p$ŽÈ‘9BGꈹ#x$è‘=ÂGúˆù#€$’ABH ‰!9$ˆ$‘(’EÂH‰#y$$’H’IBI*‰%¹$˜$“h’MÂI:‰'ù$ $”ˆ’QBJJ‰)9%¨$•¨’UÂJZ‰+y%°$–È’YBKj‰-¹%¸$—è’]ÂKz‰/ù%À$˜“aBLЉ19&È$™(“eÂLš‰3y&Ð$šH“iBMª‰5¹&Ø$›h“mÂMº‰7ù&à$œˆ“qBNʉ99'è$¨“uÂNÚ‰;y'ð$žÈ“yBOê‰=¹'ø$Ÿè“}ÂOú‰?ù'% ”BP ŠA9(%¡(”…ÂPŠCy(%¢H”‰BQ*ŠE¹(%£h”ÂQ:ŠGù( %¤ˆ”‘BRJŠI9)(%¥¨”•ÂRZŠKy)0%¦È”™BSjŠM¹)8%§è”ÂSzŠOù)@%¨•¡BTŠŠQ9*H%©(•¥ÂTšŠSy*P%ªH•©BUªŠU¹*X%«h•­ÂUºŠWù*`%¬ˆ•±BVÊŠY9+h%­¨•µÂVÚŠ[y+p%®È•¹BWêŠ]¹+x%¯è•½ÂWúŠ_ù+€%°–ÁBX ‹a9,ˆ%±(–ÅÂX‹cy,%²H–ÉBY*‹e¹,˜%³h–ÍÂY:‹gù, %´ˆ–ÑBZJ‹i9-¨%µ¨–ÕÂZZ‹ky-°%¶È–ÙB[j‹m¹-¸%·è–ÝÂ[z‹où-À%¸—áB\Š‹q9.È%¹(—åÂ\š‹sy.Ð%ºH—éB]ª‹u¹.Ø%»h—íÂ]º‹wù.à%¼ˆ—ñB^Ê‹y9/è%½¨—õÂ^Ú‹{y/ð%¾È—ùB_ê‹}¹/ø%¿è—ýÂ_ú‹ù/&À˜C` Œ90&Á(˜Ã`Œƒy0&ÂH˜ Ca*Œ…¹0&Ãh˜ Ãa:Œ‡ù0 &Ĉ˜CbJŒ‰91(&Ũ˜ÃbZŒ‹y10&ÆÈ˜CcjŒ¹18&Çè˜ÃczŒù1@&È™!CdŠŒ‘92H&É(™%ÃdšŒ“y2P&ÊH™)CeªŒ•¹2X&Ëh™-ÃeºŒ—ù2`&̈™1CfÊŒ™93h&ͨ™5ÃfÚŒ›y3p&ÎÈ™9Cgꌹ3x&Ïè™=ÃgúŒŸù3€&КACh ¡94ˆ&Ñ(šEÃh£y4&ÒHšICi*¥¹4˜&ÓhšMÃi:§ù4 &ÔˆšQCjJ©95¨&Õ¨šUÃjZ«y5°&ÖÈšYCkj­¹5¸&×èš]Ãkz¯ù5À&Ø›aClб96È&Ù(›eÃlš³y6Ð&ÚH›iCmªµ¹6Ø&Ûh›mÃmº·ù6à&܈›qCnʹ97è&ݨ›uÃnÚ»y7ð&ÞÈ›yCoê½¹7ø&ßè›}Ãoú¿ù7'àœCp ŽÁ98'á(œ…ÃpŽÃy8'âHœ‰Cq*ŽÅ¹8'ãhœÃq:ŽÇù8 '䈜‘CrJŽÉ99('娜•ÃrZŽËy90'æÈœ™CsjŽÍ¹98'çèœÃszŽÏù9@'è¡CtŠŽÑ9:H'é(¥ÃtšŽÓy:P'êH©CuªŽÕ¹:X'ëh­ÃuºŽ×ù:`'숱CvÊŽÙ9;h'í¨µÃvÚŽÛy;p'îȹCwêŽÝ¹;x'ïè½ÃwúŽßù;€'ðžÁCx á9<ˆ'ñ(žÅÃxãy<'òHžÉCy*å¹<˜'óhžÍÃy:çù< 'ôˆžÑCzJé9=¨'õ¨žÕÃzZëy=°'öÈžÙC{jí¹=¸'÷èžÝÃ{zïù=À'øŸáC|Šñ9>È'ù(ŸåÃ|šóy>Ð'úHŸéC}ªõ¹>Ø'ûhŸíÃ}º÷ù>à'üˆŸñC~Êù9?è'ý¨ŸõÃ~Úûy?ð'þÈŸùCêý¹?ø'ÿèŸýÃúÿù?(  D€ :@() Ä€z@(I  D*º@(i  Ä:ú@ (‰ D‚J :A((© Ä‚Z zA0(É Dƒj ºA8(é ăzúA@( ¡!D„Š:BH( )¡%Ä„šzBP( I¡)D…ªºBX( i¡-Ä…ºúB`( ‰¡1D†Ê:Ch( ©¡5ĆÚzCp(É¡9D‡êºCx(é¡=ćúúC€( ¢ADˆ ‘!:Dˆ()¢EĈ‘#zD(I¢ID‰*‘%ºD˜(i¢Mĉ:‘'úD (‰¢QDŠJ‘):E¨(©¢UÄŠZ‘+zE°(É¢YD‹j‘-ºE¸(é¢]Ä‹z‘/úEÀ( £aDŒŠ‘1:FÈ()£eÄŒš‘3zFÐ(I£iDª‘5ºFØ(i£mĺ‘7úFà(‰£qDŽÊ‘9:Gè(©£uÄŽÚ‘;zGð(É£yDê‘=ºGø(é£}Äú‘?úG) ¤D ’A:H)!)¤…Ä’CzH)"I¤‰D‘*’EºH)#i¤Ä‘:’GúH )$‰¤‘D’J’I:I()%©¤•Ä’Z’KzI0)&ɤ™D“j’MºI8)'é¤Ä“z’OúI@)( ¥¡D”Š’Q:JH)))¥¥Ä”š’SzJP)*I¥©D•ª’UºJX)+i¥­Ä•º’WúJ`),‰¥±D–Ê’Y:Kh)-©¥µÄ–Ú’[zKp).É¥¹D—ê’]ºKx)/饽ėú’_úK€)0 ¦ÁD˜ “a:Lˆ)1)¦ÅĘ“czL)2I¦ÉD™*“eºL˜)3i¦ÍÄ™:“gúL )4‰¦ÑDšJ“i:M¨)5©¦ÕÄšZ“kzM°)6ɦÙD›j“mºM¸)7é¦ÝÄ›z“oúMÀ)8 §áDœŠ“q:NÈ)9)§åÄœš“szNÐ):I§éDª“uºNØ);i§íĺ“wúNà)<‰§ñDžÊ“y:Oè)=©§õÄžÚ“{zOð)>ɧùDŸê“}ºOø)?é§ýÄŸú“úO*@ ¨E  ”:P*A)¨Å ”ƒzP*BI¨ E¡*”…ºP*Ci¨ Å¡:”‡úP *D‰¨E¢J”‰:Q(*E©¨Å¢Z”‹zQ0*FɨE£j”ºQ8*Gé¨Å£z”úQ@*H ©!E¤Š”‘:RH*I)©%Ťš”“zRP*JI©)E¥ª”•ºRX*Ki©-Å¥º”—úR`*L‰©1E¦Ê”™:Sh*M©©5Ŧڔ›zSp*NÉ©9E§ê”ºSx*Oé©=ŧú”ŸúS€*P ªAE¨ •¡:Tˆ*Q)ªEŨ•£zT*RIªIE©*•¥ºT˜*SiªMÅ©:•§úT *T‰ªQEªJ•©:U¨*U©ªUŪZ•«zU°*VɪYE«j•­ºU¸*Wéª]Å«z•¯úUÀ*X «aE¬Š•±:VÈ*Y)«eŬš•³zVÐ*ZI«iE­ª•µºVØ*[i«mÅ­º•·úVà*\‰«qE®Ê•¹:Wè*]©«uŮڕ»zWð*^É«yE¯ê•½ºWø*_é«}ůú•¿úW+` ¬E° –Á:X+a)¬…Ű–ÃzX+bI¬‰E±*–źX+ci¬Å±:–ÇúX +d‰¬‘E²J–É:Y(+e©¬•ŲZ–ËzY0+fɬ™E³j–ͺY8+gé¬Å³z–ÏúY@+h ­¡E´Š–Ñ:ZH+i)­¥Å´š–ÓzZP+jI­©Eµª–ÕºZX+ki­­Åµº–×úZ`+l‰­±E¶Ê–Ù:[h+m©­µÅ¶Ú–Ûz[p+nÉ­¹E·ê–ݺ[x+o魽ŷú–ßú[€+p ®ÁE¸ —á:\ˆ+q)®ÅŸ—ãz\+rI®ÉE¹*—åº\˜+si®ÍŹ:—çú\ +t‰®ÑEºJ—é:]¨+u©®ÕźZ—ëz]°+vÉ®ÙE»j—íº]¸+wé®ÝÅ»z—ïú]À+x ¯áE¼Š—ñ:^È+y)¯åżš—óz^Ð+zI¯éE½ª—õº^Ø+{i¯íŽº—÷ú^à+|‰¯ñE¾Ê—ù:_è+}©¯õžڗûz_ð+~ɯùE¿ê—ýº_ø+é¯ýÅ¿ú—ÿú_,€ °FÀ ˜;`,)°ÆÀ˜{`,‚I° FÁ*˜»`,ƒi° ÆÁ:˜û` ,„‰°FÂJ˜ ;a(,…©°ÆÂZ˜ {a0,†É°FÃj˜ »a8,‡é°ÆÃz˜ûa@,ˆ ±!FÄŠ˜;bH,‰)±%ÆÄš˜{bP,ŠI±)FŪ˜»bX,‹i±-ÆÅº˜ûb`,Œ‰±1FÆÊ˜;ch,©±5ÆÆÚ˜{cp,ŽÉ±9FÇ꘻cx,é±=ÆÇú˜ûc€, ²AFÈ ™!;dˆ,‘)²EÆÈ™#{d,’I²IFÉ*™%»d˜,“i²MÆÉ:™'ûd ,”‰²QFÊJ™);e¨,•©²UÆÊZ™+{e°,–ɲYFËj™-»e¸,—é²]ÆËz™/ûeÀ,˜ ³aFÌŠ™1;fÈ,™)³eÆÌš™3{fÐ,šI³iFͪ™5»fØ,›i³mÆÍº™7ûfà,œ‰³qFÎÊ™9;gè,©³uÆÎÚ™;{gð,žÉ³yFÏê™=»gø,Ÿé³}ÆÏú™?ûg-  ´FÐ šA;h-¡)´…ÆÐšC{h-¢I´‰FÑ*šE»h-£i´ÆÑ:šGûh -¤‰´‘FÒJšI;i(-¥©´•ÆÒZšK{i0-¦É´™FÓjšM»i8-§é´ÆÓzšOûi@-¨ µ¡FÔŠšQ;jH-©)µ¥ÆÔššS{jP-ªIµ©FÕªšU»jX-«iµ­ÆÕºšWûj`-¬‰µ±FÖÊšY;kh-­©µµÆÖÚš[{kp-®Éµ¹F×êš]»kx-¯éµ½Æ×úš_ûk€-° ¶ÁFØ ›a;lˆ-±)¶ÅÆØ›c{l-²I¶ÉFÙ*›e»l˜-³i¶ÍÆÙ:›gûl -´‰¶ÑFÚJ›i;m¨-µ©¶ÕÆÚZ›k{m°-¶É¶ÙFÛj›m»m¸-·é¶ÝÆÛz›oûmÀ-¸ ·áFÜŠ›q;nÈ-¹)·åÆÜš›s{nÐ-ºI·éFݪ›u»nØ-»i·íÆÝº›wûnà-¼‰·ñFÞÊ›y;oè-½©·õÆÞÚ›{{oð-¾É·ùFßê›}»oø-¿é·ýÆßú›ûo.À ¸Gà œ;p.Á)¸Çàœƒ{p.ÂI¸ Gá*œ…»p.Ãi¸ Çá:œ‡ûp .ĉ¸GâJœ‰;q(.Å©¸ÇâZœ‹{q0.ÆÉ¸Gãjœ»q8.Çé¸Çãzœûq@.È ¹!G䊜‘;rH.É)¹%Çäšœ“{rP.ÊI¹)G媜•»rX.Ëi¹-Ç府—ûr`.̉¹1GæÊœ™;sh.Í©¹5ÇæÚœ›{sp.Îɹ9Gçꜻsx.Ïé¹=ÇçúœŸûs€.Ð ºAGè ¡;tˆ.Ñ)ºEÇè£{t.ÒIºIGé*¥»t˜.ÓiºMÇé:§ût .Ô‰ºQGêJ©;u¨.Õ©ºUÇêZ«{u°.ÖɺYGëj­»u¸.×éº]Çëz¯ûuÀ.Ø »aG슱;vÈ.Ù)»eÇìš³{vÐ.ÚI»iGíªµ»vØ.Ûi»mÇíº·ûvà.܉»qGîʹ;wè.Ý©»uÇîÚ»{wð.ÞÉ»yGïê½»wø.ßé»}Çïú¿ûw/à ¼Gð žÁ;x/á)¼…ÇðžÃ{x/âI¼‰Gñ*žÅ»x/ãi¼Çñ:žÇûx /䉼‘GòJžÉ;y(/婼•ÇòZžË{y0/æÉ¼™GójžÍ»y8/çé¼ÇózžÏûy@/è ½¡GôŠžÑ;zH/é)½¥ÇôšžÓ{zP/êI½©GõªžÕ»zX/ëi½­Çõºž×ûz`/쉽±GöÊžÙ;{h/í©½µÇöÚžÛ{{p/îɽ¹G÷êžÝ»{x/ïé½½Ç÷úžßû{€/ð ¾ÁGø Ÿá;|ˆ/ñ)¾ÅÇøŸã{|/òI¾ÉGù*Ÿå»|˜/ói¾ÍÇù:Ÿçû| /ô‰¾ÑGúJŸé;}¨/õ©¾ÕÇúZŸë{}°/öɾÙGûjŸí»}¸/÷é¾ÝÇûzŸïû}À/ø ¿áGüŠŸñ;~È/ù)¿åÇüšŸó{~Ð/úI¿éGýªŸõ»~Ø/ûi¿íÇýºŸ÷û~à/ü‰¿ñGþÊŸù;è/ý©¿õÇþÚŸû{ð/þÉ¿ùGÿêŸý»ø/ÿé¿ýÇÿúŸÿû0 ÀH  <€0*ÀÈ |€0JÀ H+ ¼€0jÀ È; ü€ 0ŠÀHK  <(0ªÀÈ[  |00ÊÀHk  ¼80êÀÈ{ ü@0 Á!H‹ <‚H0 *Á%È› |‚P0 JÁ)H« ¼‚X0 jÁ-È» ü‚`0 ŠÁ1HË <ƒh0 ªÁ5ÈÛ |ƒp0ÊÁ9Hë ¼ƒx0êÁ=Èû üƒ€0 ÂAH ¡!<„ˆ0*ÂEÈ¡#|„0JÂIH +¡%¼„˜0jÂMÈ ;¡'ü„ 0ŠÂQH K¡)<…¨0ªÂUÈ [¡+|…°0ÊÂYH k¡-¼…¸0êÂ]È {¡/ü…À0 ÃaH ‹¡1<†È0*ÃeÈ ›¡3|†Ð0JÃiH «¡5¼†Ø0jÃmÈ »¡7ü†à0ŠÃqHË¡9<‡è0ªÃuÈÛ¡;|‡ð0ÊÃyHë¡=¼‡ø0êÃ}Èû¡?ü‡1 ÄH ¢A<ˆ1!*Ä…È¢C|ˆ1"JĉH+¢E¼ˆ1#jÄÈ;¢Güˆ 1$ŠÄ‘HK¢I<‰(1%ªÄ•È[¢K|‰01&ÊÄ™Hk¢M¼‰81'êÄÈ{¢Oü‰@1( Å¡H‹¢Q<ŠH1)*ťț¢S|ŠP1*JÅ©H«¢U¼ŠX1+jÅ­È»¢WüŠ`1,ŠÅ±HË¢Y<‹h1-ªÅµÈÛ¢[|‹p1.ÊŹHë¢]¼‹x1/êŽÈû¢_ü‹€10 ÆÁH £a<Œˆ11*ÆÅÈ£c|Œ12JÆÉH+£e¼Œ˜13jÆÍÈ;£güŒ 14ŠÆÑHK£i<¨15ªÆÕÈ[£k|°16ÊÆÙHk£m¼s¸17êÆÝÈ{£oüÀ18 ÇáH‹£q<ŽÈ19*ÇåÈ›£s|ŽÐ1:JÇéH«£u¼ŽØ1;jÇíÈ»£wüŽà1<ŠÇñHË£y<è1=ªÇõÈÛ£{|ð1>ÊÇùHë£}¼ø1?êÇýÈû£ü2@ ÈI ¤<2A*ÈÉ ¤ƒ|2BJÈ I!+¤…¼2CjÈ É!;¤‡ü 2DŠÈI"K¤‰<‘(2EªÈÉ"[¤‹|‘02FÊÈI#k¤¼‘82GêÈÉ#{¤ü‘@2H É!I$‹¤‘<’H2I*É%É$›¤“|’P2JJÉ)I%«¤•¼’X2KjÉ-É%»¤—ü’`2LŠÉ1I&ˤ™<“h2MªÉ5É&Û¤›|“p2NÊÉ9I'뤼“x2OêÉ=É'û¤Ÿü“€2P ÊAI( ¥¡<”ˆ2Q*ÊEÉ(¥£|”2RJÊII)+¥¥¼”˜2SjÊMÉ);¥§ü” 2TŠÊQI*K¥©<•¨2UªÊUÉ*[¥«|•°2VÊÊYI+k¥­¼•¸2WêÊ]É+{¥¯ü•À2X ËaI,‹¥±<–È2Y*ËeÉ,›¥³|–Ð2ZJËiI-«¥µ¼–Ø2[jËmÉ-»¥·ü–à2\ŠËqI.Ë¥¹<—è2]ªËuÉ.Û¥»|—ð2^ÊËyI/륽¼—ø2_êË}É/û¥¿ü—3` ÌI0 ¦Á<˜3a*Ì…É0¦Ã|˜3bJ̉I1+¦Å¼˜3cjÌÉ1;¦Çü˜ 3dŠÌ‘I2K¦É<™(3eªÌ•É2[¦Ë|™03fÊÌ™I3k¦Í¼™83gêÌÉ3{¦Ïü™@3h Í¡I4‹¦Ñ<šH3i*Í¥É4›¦Ó|šP3jJÍ©I5«¦Õ¼šX3kjÍ­É5»¦×üš`3lŠÍ±I6˦Ù<›h3mªÍµÉ6Û¦Û|›p3nÊ͹I7ë¦Ý¼›x3oêͽÉ7û¦ßü›&°¶ 5pxl_row_in_fullres€NªðÀð&¢¶ &ðÅd “Íð×@|öHúÜQPÀ(d “Íð×@|öHúÜQPÀ,€ðŒðL€N€¸ôÿ›Æø<ª@†Å@ÈZn¡•»@•3³Ã@DK6aÿ¡a@ŠácdR¨@„ïÈÕ!‹Ä@ãp3Ò@9ަöEÀ@Ù$¥†ÃâÒ@ΨòtŠÓ@#éYÝÎ+z@%«ûD"º@¥¨ëJÝ£@i9ÊH)÷Ð@‘ÙœI=ùÇ@Ñ݇jÅÛ¦@ÔFP8Õ@¨a‰Ô@«ªáLœÂ@ÆjB1tqÑ@üG§ZÙ¸@¶Û68›@>4ÈÍÆ@ñ˜'X©½@©Ú2©­·@nö Þí¦Ñ@æž\ÐyV±@m4§Ã®0Æ@M ‹xÕÃ@ør©§+ò£@•^ÇxÃÑ@¸ÿí³ÃÒÅ@d h×;ÜÃ@nA±‚{ä™@S(« ²@Ý!ª/ö²Ã@øÏþÒ¡@€œž/QYÊ@@Ó•–eð @0û¨~ƒ¸@}I‡ø_ÔÓ@M?éçµÔ@5:Õ+MÃ@bF®Z@°¤@]¨˜TqÔ@¯Æ²ÿAmÏ@C÷JÙ^‡¯@PÕc# ‚Ó@S_!»ý«ª@1dmª@Ä@62ÈöSðÓ@œòÝÓ@Ý€cª_LÕ@çÿ  µ@ºáòÞ©*ª@¸<ÏÎ5Â@Úu4fÌ@tˆª5VÎ@ç÷ÝMM“¿@Ò!01©õ¸@7ÔÎSœÐ@¾|‰á ·È@ðPt| Ã@a²Hí¬Ÿ@Ï$¦dÅÂ@S³evÉÍ@à«y3á£@—Ò†œü¢@ÿà ¤˜BÓ@`wh&Ì@5­aAP¼@ÞÀï®À@ŒG¿ÈXœ@•gŒ‹Ï¹Ñ@GgÒÉ$¨@¸‚ü¼(‘@×òQ/KcÐ@Ìf;·@Ò@#Y'u ®Ö@ù‹z_¼¾@֪ǜ*Ð@ЧaãÏÔ@q±Œ·„Ê@¡:] ¹ôÖ@õž2Ê@óÏkU$ÙÁ@]7‹ZKÑ@¸W"%6Ö@¬G”]Ó@£ÍTÜ›yÔ@?¾S©~9Î@><:ÿ€îÌ@½ û×·Æ@å?Îi>`¢@âÓ™|ê»@¤§T×ÒÊ@1žºøÇ@`ñ%IÃÔÓ@T¸£ò Ð@"3âã…À ÖŠÜ–¥@f··Lž@§Ÿ®ÇáÒ@4×ÂÀš¿@·¿cg Â@ÄáƒB¥'Â@ÌÈ:9)“Æ@¡‘}Ò^Ò@’òx੉@¨½•×ßÅ@ *ªpÕ@ìù[·š@ÉUtÊ” @ ±NÝQÈ@ÒN°ˆ £@Ê“´MÑ@¢~k}Ò@ÇD^Ú¢õ¾@ƒH£Ë@½U$¿Á@cQ`áúÕ@~•h¶Ò@áxÄànº@±6ÞpEÖ@$¬À"í Ð@“{ZJ¬ ×@‚Ï”Iâe¹@»R§^½@I?³¼YÖ@ lï`ÍZÐ@ËûˆÑËAÍ@ÝùµÐ@\^kCÛÈÕ@[³JÈl @AnÐ'ŠÕ@Ãà¼` Â@n]OÕRÇ@k6 ·> Ô@`tù"³ÿÖ@³ SÏuÀ"qÆ;5À@ul<&e\Ô@Û|¨”@¹w0ø‹ðÃ@1{º¿õÚ¡@- f§8cÎ@( B¤Ç@ÉEúïÉÅÅ@ý&ÃtÝË@ baä"Å@ªî)q‡šˆ@J$‚yrÕ@Oiv$œ@«¦áZÐ@B1Mã’Ñ@‰¤Ã¢ î@ð("ÊäÌ@Ït÷#¼@ööüä˜4¬@p;÷9á¦@bÉ4 ´¿@`:=øòÌÔ@ŒŒÔ“o@º¸~&«Ô@ã©䑬Ô@s>N0È@HUЪJ Ã@KI÷µÿQË@ 1-”jÒ@äK¯œ‹T@·—2èÒ@Ië« õ Â@ïjÆÛ+ïÔ@Y½H‘ÁÊÐ@¼;&ÝÔzÐ@xʈ«‚Ó@Ž}}ê[Ð@é~«®ÞÎ@mxÚÐ@ŒâÅS¢@â˜X'xÅ@=žrpálÍ@†Äû–ù„ÀÓ@Y±< Ï@ö¹ƒÃÒ@Wpx:7Ä@±Ö¥Ô„ì°@¹:ê­ Ó@<ùâq€¸@ž ƪñbÎ@ ¦ yD Á@ª~ñY/Â@5¦É!¡@6`|Éë–€À „ñH¡¸@øBåtÑÍ@YFÂ;ÅøÔ@.“t¹(OÏ@vÜlÓHDÏ@g @gg|Ï@^­c<8ˆs@ˆr°ˆàÁ@Ë6Ht(Á@ ”;d)wÌ@è°]i¼@£—ÿ™ÙqÐ@ü=…»Ì@\ðkrÂÈÕ@Ê…o©vÓ@A†@K$vxÀŽˆÓäÆ@FZ&ŒÏ@^AŠ*Õ@)ïžB]%­@¢xËÕ §@!Éç«Æ@1Dûˆ¦ˆÄ@Õëá“–œ±@ƒúÔõš+Ä@ùÝ ϰ¨@t¹%W‹CÍ@2‰ `ö´@Ø!)bV¦Ç@„…å¡X¯@}äFW#ÀÍ@~gRñá Ñ@WŸÂH1úµ@TMZ¤#l@Æ3½¹iÒ@WÞÂ׬и@ÂÄsSÆÂ@J5" ýÑ@D¸ƒü ¿@5ppuZ‘@&(üŒ¼ÓƒÀ±Ú|þ^Ã@F€eC¦·@÷Ú}ùµ®@§Zï‚)ŽÃ@uKVšü¶@£ Pc‘Ñ@¥Íºö´ËÊ@´¹5yNnÄ@qèZd°úÑ@ßz‚7g±@€Wh,õª@ë??ºÎ®@ÿÔ7Ö&íÂ@ðpóNÈYÀ­3AÒØUÖ@]Z=×m @t€Ñà<®Ó@3B T˱@ ¦•+‚±@6“ýáÄ>Õ@ŽÆÁCÍÍ@áe¸ãB¿@-­ÐkßÃ@WH[+éíÔ@+û0Ê%Ã@öàR˜´@ÏˇUpV­@ƒž“6sÀPÏVlÔ@ˆG< hÃ@ñ©t\4À@ƒIKˬ¸@mô?#!ÎÓ@=þû6Ÿ®Ë@V6”Â?YÐ@ÍÂûšS@½ÉÜÜ„”@8ý3$$Á@õ,$ÖàÕ@Ï3ù ÉÍ@bšÓ }5Á@äºUËÃ3·@6Ý'¼+mÏ@Ý ¦˜æÒÉ@OÄ›ëUÒ@ÊNñ4#ò³@¼¥¨úбÎ@Tâ 2ØÃÅ@¶|ÛœãÉ@îËfÔ9ÿÓ@ø4üØ>G–@'±jûÚ6²@îÏŠ<£@¸`Ï?‚Àé|=¦Å@E cc…âÑ@Áh·&‹µ@E22ÒÚßÀ@ííoª¹@…ðóˆÖ@½¸µÚ”À@e„íÛ¤_Ñ@¾"Þ›ëd¢@d{“GSÍ@ѹrli]Ñ@aˆp‡æ­@ ƒ³MÕKÎ@÷¬ì–uÀœ­î;†Ã@š]è§x#¬@v~õ}O¶@›öU®‡Ñ@畸¨nëÕ@\ÿ/jÖ@ Ÿè_œÎ@ƒØÔé(‰Õ@3Bº?‚¼@:Ë>6ýÑ@LÔï ?ƒÕ@L8·FM(ª@øˆÐÍÐ@Ü^„äyÒ@ö&b •µ@Oµc–zÕ@’ÒªÊÇ@°)‰ãM½@¥¢)ÎìÈ@»:{9çkÀ@u0¼É§z·@uŸ)hõúÓ@ÅÎGº%ü @iùÌÆ@Ü?âgÇ@ÈÒi³‰À˜ìµˆ-^¼@±¹yÅ%ù³@ì£V…˃À‹nàµû°@ Ÿžÿ½@x cV8¦@úѹ°•À@*jû¥P¼@˜·jࣺ@mH©‡È†À@ã\.¿ÊÁ@q½4™@÷ûØÄ@`橤ÓòÔ@ûј¨P¾Ò@L| »lÒ@~CÝAÁ@£(ÙÐK<È@]öƒ܆Æ@ŒSì ŸN~ÀßäEÚ’íÒ@‰˜9ªÌÄ@Ç#O/µk@?ðnk£@õZÙQçÃ@±“7Ú²¯œ@A©3ÿÈö¯@¬AüOÕ@~Æÿ€¹‹Ï@ŽãqÁÔ@Cü7¡ÊèÈ@Ûò™ã´ÄÏ@Í;¿ 'ÍÕ@¨Ó1ˆª@ñ¾Ó?Â@«Jñûθ@¹BØÔá‚Ã@jÖy ÈŠµ@çîxSoÐ@Ñ»Ü Ú“Æ@¹k‰7˜’@..·Ú"Ö@(sjÆŒÌÌ@®§$wø»@ƒ‰`ÑÔ@ù†°y2wÎ@iÙØÃã®@ضº=KÑ@ÁUÎ)0NÏ@ŒçÞ ¼Ð@P1kˆu$Ï@_+{]jÚ®@,ŽT›JqÌ@ñ‘µ¦’À@¡êˈÈ@žK Æ ]Ï@%´£œ@mµkZkëÖ@# {Á.Éž@²GypÊÖ@JÊ7ÀØÇ@bG»è)£@b›¢‡0Ð@½ƒŸË ÕÃ@Œ¢ÆÝÍ@<²¡ Ð@2y=rÐ@Ë ¡|'w@Ÿí1˜Õ@#òÂÒx°@[j^ÏÐ@ûQiJÒ@{+Ãe)‘Ï@a™ú$'ͳ@w*}ºÖ@]²ÖÆ_­@ð6oƒµFÔ@-èbÁη@r,QtÕ@ì^W1¢Ã@m5L§r'Á@…Ôä¯ÞSv@/†—ñÔ@9»Ï`îd¶@w¶í=åG½@ϕӱÓ@¹¨¹n§GÄ@K{þ<…ÄÅ@.ôCøAÄ@ʪê=!ùÂ@> OF+EÏ@0[ØYÇÖ@KS¥k3Ï@“>wÍ@ô+ê¡–þ}À½§–ž¨@ÑßJA @pß ÙÈ@U¬Õ¼4 Á@lÆ"ƬÔ@5 Ç“U¶Ç@,SÃê†èÆ@ôkp`Ìd¸@Bm…«}ݸ@9ùðÖ “Õ@;¨5}#™Ã@ê9çÎ@OÙ1S%Ð@”–1¹­Õ@g½kÿwÈÕ@“õ?6B-Ë@Êér˜˜š›@©ãB`Ò@4™*a~|¾@Eº«2¦–@n])Qm«Ò@aZ_¢È„Ó@Ô0¸¤ãõÑ@y4¨©•R¶@æSÉÉÐ@‘°Ëþ”@Ø@V[»·@[³áfÁ­@wäîÔ@p¤3×@]·KíšÇ@=ÐqÂVºÔ@ŒgÃTi&™@³[òÐ5TÓ@ŸÏTŽ*ˆÑ@¥ÕDñE„£@«—È ×@…1jU €Ä@Ýn37"£@È8 +¬’Ó@Œ[ûñºñk@`TRŠ_f¢@sºqVFw¦@&bbóli³@”üØKyª@wüÀÜÑ@^š Ý2Ã@*»÷¡•Ä@‘i\ïdÕ@šó‘C‘¯‚ÀÂã §6bÔ@!ˆV:Í@,"›ë*‚»@æmŠ5º$“@±óC¹¾Á@˜ËÞm+Î@ƒj o Ê@ÕÕÞÏÔQ¡@Ô­‹]Z±µ@¹ K¼ØÕ@ÝÂL:ŽÔ@C3d8Ó“@éløQÏÍ@ßM—ÄÅÓ@[šŠ¾üÆ@+ýœã.Ô@ȇdxÛ³@ …\Ïy Ó@þEHÑòÔ@B¯õÿ¿Õ@/ÆS[.™@Ødt‡“®@N<>½ßi‘@[š({ªÓÇ@Ô%¢DÊêÕ@¾Ô~Sº@ ¬›;ÌÎ@I9ðøkæ¯@I"!k‡–Ñ@é J65Ö@ Vï÷&Ð@¿05ÄØ‘@utÞXÓ Ï@Ø£¯Ë¬e§@‰çsÄcÑ@H{u¬NÂÍ@ž•ð:–°š@*5¾ì=Ð@xB$ˆ¶Â@¨ùIf`Àžõ-¹û¦@ž0&Èt¼·@­òvö·@n¥Zg-ÛÂ@Ò¿&™f>«@–ñ“û$Å@†n“åŽÙÆ@Y@¥Þª³@ÔÝ1?â²@¨÷)%çpÌ@nôíh­±Ï@Q”ú/¦Ë@/ßÛedX§@v_^•@íð³eµ=Æ@(“&kls„À‚NS;]1Ö@-†ÞÔÃ@¥ÛÎú+Ô@ò– 9ÇNÓ@Ü‚G'µjÑ@®œ­ÔŸ@«•ö›Æ@c*˜i$¹Ð@C Å‰îµz@ЛUÖ|¨›@Í^þ¦§¿@!ìLKx ª@+§—œA˜Á@׿ÁåÒ@IÎ\1Q±Ñ@LFÊÔÈ@ƒè³eÒ@G6§òãÕ@ Á[ÒTÑ@bw¼ê/”@E€5×L¿@R¨Ä8£@gÙ*Ö@!kVß@ôžzS!À@¥÷bŠ2UÒ@lsN¶Ò@D‘fdóÔ@åõˆ[E*Ô@€—Ul{Ê@=‚Î>@ž@ö¬OD(ãÇ@’ôÄwëÅ@­—²S¤ý¶@”ŸÝO¼e°@ äW>SÐÂ@N‡ÂŸpÀxtöR%ÎÂ@¼—“™ÕäÃ@ v¬ EÅÕ@9{zÌÆ@^î©ÎæÐ@\‰ »6oË@࿞Ÿìª@¦ð*ù÷úÏ@)žô›¦Ï@¿&‡ð¦°@ÞùjºëÆ@Zðj‰Ô@nsçoM†@D}!¯HÕÀ@ýµ;¿#½@!46øÆÄ@8r‡Ï@9É]O"¥@w-ŸV§Ã@|-y­äÈ@î ûjCÝÅ@-"íÖVÌ@t¾wÖ„¶@4NG‘/eÀG‘¥{†°@Í(4 ¤3Ð@1ÛW´Á@ņŒ¥4Â@~7ζµ@N|¸-¥Õ@GSê=ã—É@?l }|ÜÊ@`È…ñ—ÄÐ@O;rvK¸@°×'4­@ ñù yÏ@ëÐ5(‡Ë@-¶!"UÖÉ@I×Dšzƒ¯@„pxoó&¼@ë-”¥ÒG›@ñ½Ü¾¿žÕ@Æ.É-Í@ºÀMÇX»Õ@Om,¿¤Ê@Ld§b?Ö@eybŸAÎ@…}Ô°x¼@bÆEÜF“@ *I™ÎÞÆ@ê-ú?ö¬Ð@|eß@vª@ÍÅcrìË@!ŒfÂ9/Ï@æ¥ëENÔ@€§p¡À5±@ˆpOÅ@¾SbŸ@/E.Ñ6QÉ@wÅKs?vÆ@i¢{jÒåË@DMç_ö@sÀØÉÈ… M@UÇÜúzÍ@—EU"&"¾@æßUlÎ]Ð@(Ô‹Ã@p¬š·ÈÔ@"³! hÖ@Ág”T5Õ@–råÅÑ@Ñô{¯{õÕ@ ‚ÿÊÇ@í´¤ýRÔ@ï;£3)Â@s_ƒÔ…¶@ØóÄ~sÑ@¼Û5ý±ºÐ@3¹¼‚(Ô@øÐ )Ö%.kÂ@]N Þ©°¯@7ðÔžxAÐ@(?£ÌÂSŒ@E¤ÊÖ@'ºØºÓ@0T žÊÓ@ h^Δº@)²Ó±¨ð£@‡ÑiŸ³Õ@9à;¼2ZÀ@ë°"5œÃ@-“úaótk@¢Í›|‹}º@$ï‚íïÅ@Å'3{éÑÓ@Hæ^ËåÓ@Ÿg.4 ÉÒ@´ÌœGTÓ@/L  œ³@{–ÈÌ€)Å@³Ù Ü$Ã@²'³ÖM†ÀšTXŸ]÷Ö@¤ÃøG&Öš@cÄ»¶§Ö@W‚?+9.Õ@í&ùÐ@òyA|3È|@Vùöó*Á@: Ö°VŽÐ@Väñ¿‹>Ñ@µhŽyÎ@æøó'Ò'¦@OZ{—Êc¦@9 Œ:{¥Ç@—(¤ÉÐ@‘è‡ðãÕ@…«ìÛ_§Ä@$g»éV¶@*IJÍE®@îäxLZù@åEKy˜Ã@˜Ñæb38Ä@:x·ý4¯@È’Ùƒë}@Ið™‡Všµ@›1©‚TÆ@`l4á¡âÐ@häI}Ò@~]uÁ:TjÀCœ–FöÊ@`*¯,Rš¡@Íœ*ëOÔ@bZHT›Â@M (“âÉ@MëLŠa9Ó@DÝeqÈ ½@ë¸ç}_Ò@¹q%ãì¡@‹AC 7¾@<'ƒ½@•Iྫ§@gp%à¶Ô@v³?êÝúÅ@ç‰^zˆªu@ž{þëÿÕ@òB‘ºÈÕ@è§Ç“t @=½hPÓ@…(s€Ñ@ÉUM3`$Ö@ü¯Z½6””@b¶ù˜ÒÍÄ@‰ÄÐxèÈ@@(¦DiM©@’¦Ðéu@;Y=Ñ@¾ìD8UÔ@#¤“¢Ë@¶ÏiužäÁ@‰pÅ¿Í@VyZØŸÑ@æ0 íbãÂ@€UÊø¥¾Ò@]5ÍçŸÃ@AŒ˜ Í‘È@ù[™},Ö@{MƒrÊ@NæÛ"³Î@`9ÕX¸t³@.ÙØ~=Ó@C¨ ¤¹@ªÐ°C¾±Ì@6eÔ È@R1tÅ@§Ñ*ЩÕ@о$ ²@§ þS Ë@s‰FÕ@ÍŠ+Hnݘ@;eŒºÐ@ý¤ÙòvÐ@÷¢èz¯@‘õšŒó·@“Š1ªå`Æ@¼]MßUƒ»@+‰4ÂRÃ@Ó^jË@’Xy@)·@Éí ¸K%˜@Ó+Ò—KÒ@Q8¢(éÒ@¹®©6­È@á6m»ü›¤@Ùäþ%¯@6}ÞL7l²@ó}â”Ô@xNbß…Ë@}ë´‡òjÂ@3šÖ{­@,æîÄ9³Ô@Ú9üàíMÑ@?ò~_¦@"öÏÀ¯»@o–ª‹Ò@÷îrÞüaÌ@¢I–$ÿÊ@BR9S¢†š@ó94²tf¬@QIÕšÄëÄ@j©Âc©Ò@‘õ¦A\»@Ò:¾Å ßD@rLæ‹ Ç@9[Æ^i‘Ó@¢´ m"Ð@I5ÉâÑ@KNCØC°@?¥2Í‘XÐ@ˆ‚51¶±Å@iWÐ{èÂ@À|éki£¾@ï©4û'Ñ@¸%Þzê Ì@Éi^MÖ@ä)Ë^\Õ@:6 ¡âÍ@Åå¸7kÚÌ@OXn)YEÐ@lõ Ñ7µ@*_RÃ`Ã@ºA:P¢Ç@™<3”«@¨sp¡Ä@F¦í)“£­@®ÈHËPèÄ@®ž¡+§À@Xóß'zÊ@²Jî0ˆÄ@xy °/·Œ@ñ=ŠqV¨@-úM×Å­Ñ@.[û©™Ç@jO¡ÊvÑ@À€#; [Í@ô@Ö)4Á@ëÕÏ”»@Oeh`¶Æ@Õ(öŒnÄ@èš^Äø¤Ê@l[yíïÕ@òm_Û×@-*Ûj·±@°1%2]Ë@dIÏ97Ñ@¬9³úæáÕ@ì„äÇ“RÁ@[²RÖCÎ@¼†FE[€@BoŠŸÂ@šÓĶ@~é xù3Õ@u-ŽÔÕ@â٥ľ¨@,UÐˆÊÆ@&j:ÓâðÒ@·Jñ2¨Ä@$q{œ¢z²@‰çŒ%i¿º@98Ñ·˜‡Ó@úì¶vTÿÔ@×N듬ƒÖ@nhN¯óÂ@Ußå'œÒ@ÌŠ±«šaÉ@º™.æ‚ô‚@ý«TB‡¤´@Òâv#]3­@I~v&FáÓ@ ¿¿ÓH}Ã@°áò/žI±@­Z²t»³º@§1’ ¿×@„BR‡ÊÖ@¨­q’Ž·@€¢6: ؤ@ Ò}Ý€t@„†q;Ñ@ÉãTÛòÔ@U¿ ß›]«@“>ÄÇiÂ@ÏË(ÕzÓ@7ÓȆÊ@kgÅóeÑ@™ï–¦¶Ò@GÝÍÌuº@svÓÛ3y’@eº­_«Ì@èžA3³@PÑ4fß²Ô@‡og“J\Í@\” $…øÐ@èXÌ]»Ñ@ó×â<þÌ@ÆXl¬‡Ò@¨þª#mõÊ@(¨ÖL˜ÁÌ@5I›B4¢¿@ª ¾‹âÀ@RZÊ8Õ@ƒÎ±J[ÿÖ@œÝ] ¼Ì@HÍ¡h™Ñ@L¾3Z{ÑE@¥BéÛùÖ@#Ê#¢Â@™P·žÕ@–9Ð>-Þ¾@0êM­t¥¢@n¤Ói‚Ö@ a¦”½À@•Ö!¤²Ç@ùNþe`Ö@G«È<-wÀ>â|K B@HÅܪ2{ÀSÐMVÀsÈr™w÷Ó@z¸”…Õ@é¯0äøI­@ âé\I|Å@Fvömb€ÀØcêaš1É@òfn6 X¶@Ñ;{}•ת@4š¦’.SÀ#¶ífº@%2çG™r¦@p² …–Ð@O‹Âl»@ÄêWö´@±@/d„0Õ@7›ÔyªÀÓ@’éóî$Ï@¢§+fÿ±Ë@e;ÜÝ,±@1\ÁˆºæÎ@"¼+”ÌO·@Øóa÷Ñ@–(|‚£Â@^6¹vŽÂ@Û×®SÊ@(—aIå½Ã@:âæôáþÆ@ó†²Ë@Ð}9PÔ©»@È.&àEÑ@•îvÅ¡@Üþ)Î÷ Ò@F"ÑÜr®@þQhô›N½@ĶîC& Å@fy‹é Â@¤-áçÇ¢@—(2ÏM>Ñ@&ï›õÊÊ@«È‘ÀH¹@«É?)hÌ@“£Ú¹@³í™kÓ™½@æËfŒb6Å@¬öäÜé–Ò@8¦2ÝÚÆ@Üq“¥dÖÍ@ÁÇÅÀ>Ð@p®¶t G£@ÒJžT„Ê@dnF¾?ÈÀ@ Rç<ãÔ@X ¤ß!j¹@pçe‡>ÉÕ@Üçñ¦ÂOÅ@s{‰èÐ@‚~® òœÐ@¯ÒíTvŸÊ@A§NÁûÁÌ@[fíøføÈ@Õšjƒ†–Ò@ïÖú¿Í@é&HB|±@ã“7¦¸Æ@žm±™@û¬ÄE[Õ@7©*±"¶È@÷Ðc2‚Ö@φ@Ô™Ô@%îèªcLÐ@ìM!0YoÀ1më ×@rR:XÕ@dÝÎh¶Ñ@¬,/!áÖ@0÷a3=3hÀ”‚P›Þ1Ë@‡|æÐœA´@{l¿ñÁ*{À*']S‘±½@ëÅ͋ح@kš‚)©@¥»xa$›¿@KÐUÉ#|Ð@¾ ×» º@¹³C’|@L.þ8!‰¼@5¾¢r)L¯@†œËC4Â@ZIzØŒÕ@ÿXq1oÓ@%Š&Þë¹@FMôÜ>Ö@ŠÄaŸ+×Ê@ mlàsË@“‡öÔ@$¹¬Mqä„@ꀂGZ¤Á@aü {äøW@… t¥²@¢='¸ÃÊÕ@¡´ÐÌfÐ@œÃ­ú÷³@Mª7ÃÎ@SÓ³‰UÎ@éo³HùË@¯ßû¸l”Ô@B–WXBÔ@vüWâ”@ƒÞÚ´]HÕ@ÐX1ó×¹@P õ(àÓ¨@0x<üé”Á@ª™)8ž„ÀœS¨ÖFgtÀºpyþ‘É@Û›Ö4Ç@Aªm0˜Â@”ìÕ¶Ý=}@÷çÛ‘¢¡@èd¥ÚÇ@§=–‚¹ÁÍ@Ë5ŒäíÖ@OÈHbÀ@iŽS×¥‡Ö@éuͦ˭Ô@¿õ ›6¼@Yf>Ó³³@«?žÊ³L§@VëÁìÄ@¶ãˆ(&Ó@Ϻ|¿'@;ü¦ˆ™ÀÄ@`SôH›½@™aÅ™ÄÏ@”Î 8ÕbÎ@6 ZUIÏ@È“F×·@.¡r\#µ@h»+û¸¬´@¸BW@ôñÔ@.£òå†Í@QŠu?¥î¤@ÊH—ÔäÔ@‘súþôòŸ@Ì·ÅÌ0Å¡@1+¡†wÌ@gwhN=0Ö@ÿ×a”Q´@$öy'À@«Ù©díÈ@¿Œ¢U‡Ê·@nWàÊÉt·@ü‚ªQ¼¾@1ÿÿáŸÓ@AyX*¦Ð@BK£Ñ@‹þ\Ga›Æ@€82Īe±@kø Ò»©£@ÅŸqdÔ@¢ýL|j¾@Ô$Ë/Ȩ@DZ£ø†ÄË@µ0O]à¶@§\¿kïœÆ@¯í]ÿÚÖ@¹@'[ÞÎ@€ dÃKëÃ@øÞ$F #Ð@¡M³üœŽÅ@jpsÝØ+Í@_”Ÿjn£Â@àzF5(,Í@ºp§È,ŠÀ·Äû%x›À@‚¾»QMÖ@“Î^Ô—~Ò@rø‹à,»@¡{5‡æÁ@_ÞÛº@ÆoA¸Î@1/ÔõnÃ@–=ø¯’Ê@#R•V¶@t“¹&Å@r l-qÀ@m GOÍ@î|òÞD·@R`¢¤Å@ÍúÛ"ZÔ@@Uåá­@Y‹Í@²@ÎISýc¡r@|Ž·N'pÐ@»Ù‡Ê+¡½@1 ®ðýßq@NÆ{î¿tÂ@¢5zWó÷Å@Üøi Ex€À™Ù¥EEÓ@ÙDëHtÀQ 1+˜ˆÈ@a£~ÙÒ@(Ã8q.Ç@* ‘/ ’@Ë­ùýr²@‹Ö8 Ô@ÓÏ)‰¿ùÕ@®ž¨ð–öÅ@j¶Â€Ž…È@ì`Ì›Š$Ð@¹ø?õr @•düÔ@ì.¥`òÌ@Z²ãËSÁ@¬[óÐÊ@`d}ŒÍĵ@¨™ Xß¡¹@›Öòß•VÕ@ëË•ôÓMÕ@ª•¬À§¬@2&nêÈ@vTõ[ôžÒ@»UÞøš³Å@‹ z>sŸ@~½î´ä¦@1žsm¬ÿÖ@ÚÒO½²íÕ@åv”ú&¥±@Œ‹¢—Ñ@ÿ £@u„Ç@Ê~6¨UÓ@ñXƒÿÔ@[±ïCèÐ@9ô $ìEÖ@eðÖ^—Ê@wö“°.Ð@5 ›T+œÐ@s–Zµ4<Æ@=*ÒÒ•'Ò@1|×y²@³NE÷í!¬@íC)¸Ö@ŸÖ%Êú Ñ@CÀŽO $¤@+^õ±œÁ@ÜEñØ;Ó@_!{ /¼@'%Žw¤Ð@>)`lûì„@dÕ1ª+'G@z¢ƒËÌj°@³úkeÎ{À³Ü×W¦/º@õºðgINÃ@ÁÚË7/ª¢@9úžU9½Â@2Àlýa¬@Э a*@€L‘Âð»@üá_ŠûÇ@Ìo«€Wµ—@¨Ð7Ö@Õ\±ßÔ@̲08¶+Ê@EYá4;Ð@ùã.\âÅÇ@ HíihË@•‹£ '$Ö@Ž•~Æ­@W”r!î™@X‰THl5Ñ@’üÌsЬ@–þ™ŒCÏ@Ég•’cB¹@]äª:³@ȤkÆ Ä@*–MWÈÕ@£ÂC¾viÍ@¡}J=|Ö@ô•±%]¬@;JaPï¿@‘˳À@„éÔãúÑ@'÷»ü™Ô@è<{oˆÂ@tЩ Ó@™$HHv@…µæ„Ë@<¶l¿@<ÊÎF ‘@„ó}žØÒ@pEq숌²@L  ¹@qñµ®¯ž•@Y²½sâ“@×ðÝð[5È@ŽÎò†¾@ÄØkÝ}WÑ@ ˆFfðiÀ¬!ÉãÕ-Õ@FÏ¿€š¶¢@ecp?¸§@ð*€ ïÑ@žp6S¸CÓ@çèd/׊¤@>mvƪ@l ¥éåTÏ@¾o°\ €ÀÎâà͸ïÒ@¹ëf)«@N`yò…HÀ@CÉ•m¡ÀÈ@Û“Ú^­…’@:\¦iT'§@OÐ`-§–Ë@ôT¡åäô‡À&-?÷„ö—@$v­‰^€Àá$Xò>Ì@h«¬cÍ@†<>²ÐÈ@9žâç Ö@º8„¶@ øüÁ²Ò@4¡²|r,»@G²àŸBÈ@Uc…­.ÂÏ@ŠÔYÄíúÈ@N¸Â´"éÐ@èÄT%òy¬@ýª-ù,×@DÑùU´@S^Âw'@ÓÁñùpÐ@7Ç×@~OÑeÐ@üâÌHl,Ó@7!*å]Î@—ŒúH ¤@°Ï"«Ò@”†]`o'Ó@ݴЋÃ@"'§n¿×@±ï»äÿ¼@—„2GÏ@7÷ÄŽè†À Ñ!öÁ@§«üúIÖ@›ƒ¾ÖüÓ@ñ Š_Ös¿@cK]½-=Ò@Ìýrù:çÑ@Mu_¾öÄgÀB~ç,¶’Ó@ðôV‰Ò@ËnN “ÓÒ@a$¼PÒ@èåiƒ°À@5ÿ‰âîÎ@K¶Öõ{Ó@ŸùœwPÔ@öœµDÄ¿@Ktæñ¦Ö@'š×ÐË@ABtj•¹@TûÀöʤÂ@ªßì©úÖ@ŠÃõF÷DÐ@“u¨Ï@aE&Ô˜FÌ@¦k]§«…@ï _oo”Æ@vU§&ÃÌ@MPíÊÒ@Ôj7÷žÇ@‘wöúdù«@ÃɆ- ¡@ö¸¬° H‚Àú[¹ÇãìÀ@m>ÞîÁ@ ­*õÆ@±Þé¹âŽÈ@—ÿü a ¶@1»¦œÜdœ@»\‘Ð7bÀDtEýï˜@Kaˆb»}Ñ@2³sèHÂ@†ÔÕô Ð@+I]§ð¯¸@‚攕ÏÓ@„ÄF%Ë@Çê¢dÖGÎ@O¤z؆°@´‘vY¢ÃÓ@1(”+Û“Î@ ÄŠWºÑ@{XµPÖ@ôH_%íXÆ@ÔåÙæÛÃ@U‰tCg¢@~Òt€Á@3qÈÜÛ´@4šÿÄ‘ Ö@ÜÝZdˆ À@¥Èz•­È@§“8ÎÄ2Æ@(ø ûÌ_­@é/á\(Ó@yuj ÇÊ@¢ZáÁÒ@µÙCó”Á@ê'”©Ü\“@Л5UˆÌ@c=f7¹É@@ÛžG¾Í¦@ÚûÛý,ÏÓ@DÙžqLªÏ@JeVjìÃi@µ³ßu>7Ê@ôqÅîæž@X:Nš^þÁ@ôð—¯Ã<Õ@I²ƒ£¤–@×I£ÆÈ@»–l|^é•@ú)í: ~Ó@{ѪéÔ@~¨›„DÓ@cÌœ:Ö@Ôc‹LA³@Üm¬E¹Õ¾@@YXîm>Ô@»ƒ¡âöÓ@1K?"‘`É@t½Šª»Ã@õêUâÕ@Ô<F|Ö@”dUܲÎ@ r4¨ÜÔ@ºuºýÇ“Ô@Î÷°t½Ê@b-ëoŽÀ@éÞƒuªµÁ@ãù£áS¶@îÍ/Dk¾@:@`ý„Ó@¼«fÝ 3¹@|¼B°{LÊ@ÌßW˜Ö@Ä^å¼Y”@Þg꙲Î@Bû³’¶öÕ@l$Õµ¥¥@Ou!YœÃ@p:5Ù[Ò@Þv∗¼@G¼G§Ò¿@Î¥³¤Þ¦@×ÆÆ•“ÇÌ@(ð˜”CÐ@ Òò$¼§@Dn5É¥òÐ@„jçXFˆŽ@å±ô´@Xn„dcäË@ð…ÅÎ@ë¶™[T¬Ð@€äÛ:]¥@cWа}°@¯®ü?ã~Ê@Ø¥«ëåªÕ@øÌï4Oå¸@[Þ3»4м@JYÄEÏ Ó@ÞÛÅRŒQÎ@³ÁÎÖÔ@“^av8Ã@ª•ÉÃÏ@nŒÚÖÊ@î釤õøÓ@ö—–C~Ñ@x§FÑË@©;3yJº@[Ä4%Î@Ö¿TYGâÒ@»| ¢ÁÖ@ÝäÒ iÇ@šàŸø_ÙÅ@úæXßÚÃ@ŽDÙÒ_¶@6ª„ªˆÇ@C¼_‘`­@+fw }µ@Ùo‹Ñ•sÖ@Oœ#£ÔýÓ@¼ƒ3móõ´@¥UŽaŽƒ¸@Š— ¸NÀ@”²¬l¥@8rÀ‚˜ª@p4MËÜÆ@éWèÛm§Ð@äJÏÿz#Ð@ߞܭò~É@7™*×Á§@¬É˜AæÒ@høâÕµ@¡ÿ¹€.^@‰;jô[µ¸@z°ztü.½@˜?h¦WÐ@ÈjP ¨Ö@7¿‡‡¼—¾@°+nk>ºÃ@Kf(Ùû-Í@ Ÿv9íÓ@(:îçÌ´…ÀÞÒñN‰Ô@ìêê]>Å@·yG“LiÑ@±ájnVÊÏ@:DÒ\c[Ó@Ÿ¢•Ôj@'š…öÍ@Óiö¹*0Â@Þé¤õpÍ@âûç¼5Ô@€F:kÍÑ@ø´¸—R³Ô@­Ñ³n>àÀ@xö™¢5^ÀTÊæDói»@˜J 7Õ@RrÍ/K}Ô@~ø>†<§º@¬aÖÓ@õÑ~uÐ@Wi6æÿšÕ@»Pç ͹±@çÓ[\(–Ö@ÃõejƒÆ@ E³ÅœJÇ@7s†BºäÓ@æè¼¥˜v›@§®rn9Æ@“k”4È&Ì@P|tiLÒ@Ð4§É¿Æ@«;‰óVµ@K…U¶Ù¬Ö@Ьöz¹¹@c,ˬ£@»eï¾¹8Â@‹‘—ÜœÓ@W F[´@4 >Ø®§Ì@(…g¶ Ë@©*é°½úÑ@s:G-¢Ç@ø9zÑÏžÕ@ñ#±EÒ@›ämmÔ@œ=ÇYXDÔ@:HZÞK†Ó@)^à1o¥®@Äñ9N9(@p5îKÂ]Â@Èn;4!™Ë@¡?Y׺¸@.[™ãTš@ésß–¥*Ö@F2ëís³@¦vˆN§Ð½@Uõ–š¯pÄ@Üøð·—κ@Š*Š6í¤@ löø¹<­@ä[5Ãè'´@DÀ¼\JÎ@ÛQ1:ád±@Æè<ÓxˆÈ@RΞŠtD@õNFؾ­@{שWPéÍ@ÎOí\­—Ó@ÑÓ#”¶@ž“ „V=Á@¦˜Á9ÔÎ@…&rÖå÷Ô@r­‰ïÙŸÆ@Ïj¡»ËdÐ@,æ™Î@‘ž´Ñ´¢@ž0ÆîFýÖ@ÂûÎx6@©þ‹0åbÍ@}›Lu ¡@þ ´Ö‘Ó@Úk=cÁ@L-›;S¢@Ö ¶r¾@ ¯e`$@À¹o7_¬,¸@ñúL >J¹@ÊKX äÒ@ʬÂGö²@Ó»ˆÄ©_Àu®œ9À@Ñü0ËÄÍ@ Èü 1ö¶@Ä'þ¢zü»@œ°±§-Ì@‡<{ä$®@¯îN!„É@¬Ms[8Í@åà^_Ã{Ó@ç½/}ÓM·@Ö Ë`×@åI&ÆÐ‡Î@ÇÏf!µçÃ@e¡‹ r·i@®CeÄõÀ@äåZÌixÏ@ŸØœø?Ö@9)£È_BÒ@Ý8M_=À@–Ën?ì¥Õ@ˆÐ´9PÖ@ºG_øÎÑ@2Å4˜‰Ó@w—†ÄyÓ@+ŸƒÐmÁ@(7ÅÎK£Ô@Æ |o+¥@8¡H4¤ÂÑ@% ½Á·HÀ@%ümפ°@ö݉Ä@[ÏmÖ3ý¶@¬r\Æh±@qïfø(ÓÇ@ö Þ¾ÖÔÊ@Öq'Ÿd^™@‹ò@Ë|ÀΟ¡‡qÏ@HµÝ™¨FË@Ð< ¬«€Ó@¾©a9Ê@;ðe’´@Ÿ2ó¶2DÏ@8òqçÕÔ@Ucœi«Î@XA ì[Î@û¥CýÎlÔ@Óއ±@Ì6HÍ ëÁ@ã¬eOñþ´@ŒÝ¿{WÑ@NîÎPà„Ð@EŒ eÚÎ@Ϭ¦9pÕ@¿=Tè”É@e¤v¾Ì@!´P#Ïo@I<Ùóü£@Õ+¨>ލÍ@èè§?äÔ@`ïCÍ,¹@Œï/×Ô@@³¬­Ò@m¯†TÒ@—jkÔ@ ñ‹'ª@zoëzYÑ@3«5ŽÔWÑ@Î&ÉzˆÃ@åX 9T§Ð@ÙW¨Ë‰Â@lYƒ.ª@)=ljäÏ@·Æï+?°@yoj[žÎ@aÉ«ZÕ@g¶ÃNÐ@%xÁ#cÔ@T´éˆúœ@p’ ÄÏeÀÚ+”´Ê@°²?¢«Å@‹˜ü3)³Ñ@¥W-ĵ@ÊaõÅ¿@þiã‚+1º@®kRß Ô@~{wÏ‚‚Ê@Ž‹ðhLXÕ@“ ªò¦=É@“Lýƒ¸@¼– '¢Ó@à DPIÄ@ˆt™Ò6Å@AÐù³äÕ@!E)J×@go¹nQ»Ö@sÄM!ñÎ@‡8 ¸÷Á@u¹U\èd¬@¬7q·ÛÈÉ@©Âõ¸ß¥·@1 “ëFÀ@­HòÃS«Ö@c˜´—Ë;š@&Ø&¾6Ó@Љø%_Ö@ôv@cyÀ”úȉ‘@UTþfõÎ@Ó¢ñÀ@xØåÎ@fº’á¸Î@bwPˆñ3@9/e˜ïüÐ@ÌxAö3ÒÒ@­°Òe—@ET^8<й@éî+2úÝÉ@~e@‡À5¬¯_þ¹Ó@×V ·>òÔ@ÕûWEæÐÁ@J\„íúŽ@Ó<×¹¶@ õ8ñÕÇÑ@šìI—ŽçÃ@Ï7Í·ÌÆ@ x¿’O×Ì@b¡õÛ @¡þÖAh³@!•bZÆsº@¤Æ…ó"ùÕ@”¬Ä¡@ûÝw–²ºÏ@¸*·„cÖ@‘"2|W¬@½]-Ì™€Ö@ZÓ«V¹:¢@#ž)»"ŒÅ@øUq—ª}¹@½Í .j›±@ +š;Â@I´Ægdž@ êŠÂ8‹Ô@7(õ¶é¡@”"LeÍÆ@ʦ%þÕ@í+µ Õ@q®³&Ó@¸éjZÔ@Üúw*$ŠÅ@¼<ì––Ð@ëž)>]Õ@ÜvÂìgãÍ@{7w—°…Ñ@ûzcOžžÈ@Þ׊JaôÇ@ÁÖÛ?í»´@@èYð-Ö@äoà¤\ °@ƒjªŽÖÉ@’þðv+Â@¯TèÈ€Ó@ï%sC©@Â8¤xk@œ«ÆQ­@÷)$wÐ@žÿÞû›Ð@T…Mù±€™@P Mpµ@Ô\uÅ—–Ç@¬2¤ÊaëË@mÀ,>Å@ÓîV‚¸¹ž@G kq[Ç@0s„&KÁ@T<Èw6È@ÐÆ¿Sº†Àï%…^†Ó@,Œœ²}¼Ã@o²é½kÔ@ÁïF²6Ð@Ì„†)vÑ@ºŽô´-Á@{†œ6oùÑ@ûâõ³¸@œš"»{ó¼@,Tµ þ1Ë@svðË.jÀÕÚ [×Ò@tsa[ºË@'Œ÷âÍ–Ó@ØY\a‡Ò@gQ¬þÓ@z((¬ß“@âMïOyÉ@jUõëã»Ô@ujé®ÇË@”7"×@ÆÎª§º@E)ù<™ÊÅ@’5õ¤¤Ë@î÷¯”CÓº@àù–ÆŒà´@³› agoÁ@T‰ù[FÑ@~ ?rjŒ´@ÙhòL Ð@]ÕµNyÆ@"¿ƒ¶ªµ@ýÃ'B£ÖÃ@Ä#bá!Ë@ß–4T­¼@©ˆÏý(µ»@aíP®™-F@#¡…Óv`½@]¯X„‚¬@ß½‡´´@]—nvTOË@5³hèÙÔ@ïÉK×Ió©@&2ùÓ@ì—Ó ñ¦@“K©ÑCÖ@žïÌ9Le¶@up=ž@š@Ó`Þ»1ÉÑ@CºÌae¿@ʬÔfeÇ@éî"¥¥@]]!¦»ƒµ@$áåxÀ¸Œ[¸žÞÏ@r¶k&#ÄÕ@§GëGÅ@ŒÌj¹§@×0$O1À@û´$éPÍ@[æ±]³Ð@‡H,°*³@A£ÄºGJÇ@ܼ‚·ÕzÀçÖc9C3¸@ôÒJFÝÐ@d y-Ð@ࢸbª@*žRTVÂ@îÖãmÅ@káP(I˜@GÚa`Í »@œ8%,¦»À¿ëÉŽ©@Æ×ŽÓ (×@2ªÂ2†P®@d ú¸Æ@l7ºõ‰¶@UêϪØÕ@DÄz#Ì@hñ3j_g´@𸙠É@—C`׋Á@ÏbE®`¯@YR|16³@ÐLC—R Ï@¥»¤´™Ï@Ì¢ÊøÇ@3K:ßmGÕ@zä‚‚ƒÀÙÕr²†½Ç@ -²1´÷Ô@ç$ F ±@Ì40¯¯gÈ@Ÿù¥@ªID¨@À®\ý C‡@öš3ñŠ!Ô@F<•ÿض´@+üïOϪ@ñÛë>ãÑÖ@Ó©¾L»íµ@«cÔ@ešŸ;U%£@#ñÕ“G¡Ó@M(¸@s%‰êî @e¢ ÷ÓÔ@Y!߈‡IÂ@AÀÃãÀº@7âãÉ„ù½@Ú “®Á§Ô@ε@ïÐ@ò¥Í°)€Æ@Z¥ëC†XÕ@9YÝP*Ô@MÅpÛð²Ä@*FÓJæ§Ñ@UòûweÎ@rÚ°i}Ó@±%j€Ìµ½@Õ¼þ¤£Ð@c‚—t˜°@×ô¨™…”È@ÚÄK~Ç@ã«ô»ÿË@+"¾`¯¿@`v¡*ZÁ@ö-c-1Ó@ÊíøÇºÑ@0a°Ï0.€@+|TQ•ÞÖ@~.ô†Ü:È@~°5b§¢@ ½¥0ŠÁË@†¬f£¶N¡@Á’Ö9Á@\°d@Ü’_Ï ž@vÃô*ÁÖ@>QÐï[ƒ@å‚%uÀb¯@ ÐíH j¿@š·Xd›‘Á@ÓÓ½1Ä@A¬“÷&À@Ϻ™? ª”@•Ëux‡;Ò@óg‹ïS¶»@×)7Püv@T^ŽÍ…@ÀALS^{®@å5¦^a2Ô@QÛLù¬E·@c¤iÛ@߬@î›È,É@r%*¥£½@•²UàXƒÓ@Y¥w•HÈÄ@émol—~±@fžažò¼@\䱈½¶@y›íHg#¼@Ig8ªÒ@ñJ¼fÐ@©$,vu¤@{7ÁX©Œ¬@ÿ0/þ«k´@1¤hRÏ@€ÝNÖ@Õ3f“{Ë@g¥Ò*ÞhÆ@ó°6²@¬ðšEÐ@¨V»Õ$¹@Å*ï*AÑ@~ᣨù¿Ç@çu±Aи@BE¦Ã¦@^c­ÁåÓ@›°•ZŸâš@å]Cê‘«Ï@ÿ]ŸöƒDÍ@µ—›jB¿Õ@¤H¦Bø‡—@™;´‹*Æ@fm¤<ë|®@¯FB\µÐ@"·UŒª$Ò@Ô²–à+ð©@åÛ 1zv@¾Át¾+¢Ä@©Â´ÛnGÉ@ìx­s¼@öå7'¹@7V¡yqÆ@J¹9X•¯@òùE¦@CDN´qÖ@ láÔzŒÂ@–»_½]<»@còLÞÖ@fÅ$~AÖ@•™åºõ ®@HZég|Àé)i&è™Ë@{Ш#Ê·@"/ ©°@¬©¾Ø^Ô@]«ò_Á@[ÿŽì¯Ê@§qµ‘^KÃ@3pCkÿ˜½@W§`æâÈ@—fyñ¾@W5Ú®I»@,«q1,´@^z"…@³@½ý‚Á‹²@ù7 ÑÒ@¼;ÑŒ" Î@‹TÙÊ@„b2¿,Ë@SÜ«ŸÎ@þ­´f\ëÂ@‚Èõ2–Ö@^-T†?¶@Ü{{RWtÍ@>{œßµ@qyå¾ZÖÐ@e øKÄMÅ@Ĭ5‡t‹¡@V“Ö¯œAÕ@"ÅÕæx vÀx§W#ßÖ@“`íÙâðÆ@êöi}±À@Õerɱ@½Äf6Î×@xRk„ *Ð@*‹(Ù‹tµ@4Ÿ††Á ×@J‡UA¿s„@XÕÐ Ñ*€À]úPœÂ@êsðœÊÜK@û]mîhÀ:)zs"þh@ZP¶-Ãp@õªŽcì Ô@›¿µßP-Ç@¼ÙÈe©ÆÇ@ïHˆ­w³@³~YŒmТ@†0žâÓpQ@f6zÕ0Z’@.­èú4HÆ@L@í"ª‚Õ@ŸcM—Cš@¿)ÚÕÓî@˜ë%MþÈ@¥ÎÔŠm¢@:~$è!Æ@ìÔ•[ àÅ@e)fè[½@C׊ˆSÉÃ@V,÷툓Õ@²r€y„r@.3·{=éÄ@/™”iÃ!Ò@Ç#¢ÌQó³@½u© kÌ—@n€èÜò¥Ç@ºë ë&©Ï@š؅ÿÌ@{¶$eú–@¡©„&i­@yªùÂÃ@‰¯Ù)à"¾@*ɶ5{[À*3 dÖ@ kP‚ü´Í@¿ѹF©Î@B¿Æ€¾{€@ í`@R ü&ý?Æ@Ä*jÁ@“ð(®Z9Ñ@d‡ÿs£yÎ@ö!)µÉCÎ@Y§*»Õ•Ò@Ôø£þ"š@[)S½\Ö@‚u¾œ¾@Õ²bÏ$ Â@ñeØ1MÙ¨@(¯µ&¿¾@†Ãr¶››@m¯täÈ@cŒÙ(ɰÑ@ÔÄ‘›i§@°7ÀþÅ@SžåiÞ±@¸4e0ˆè§@v'9-t‹Ò@'»¤ˆÅ@h{nÏ»Ð@dÝýÚ´Ò@|@Êh)M¥³@ =I ©Ô@]û)3ó¸Ï@œ SК@Yp¶vö|Ð@5©á>›@¤!蘭kÑ@¸½ïÈ@÷ɶâ”BÕ@àßã]ÉÏ@õ¼À6hÊ@Â}vß\ã¸@ªjË Da„À3oz<”Ò@ŤÆb´+Ç@‹£Ù RóÕ@’*“`\Ò@‘î«Å@fžã3ØàÏ@Ô½û0%M»@mû®³Ö/Ä@Án-ERÓ@å<ƒ8MÖ@M*‘)@®@ÔK ¤Ê@MÔY€Ü`¾@Ks…‹ÈÅÏ@y¯ÆD†OÈ@¶’|äÑX@Ÿó³+PÒÒ@Û·è®ÓÐ@‘®{Ñ@˜LÍýÔÿ|ÀTh­ÅÉ_£@ç†\€P€@o×ÔuË@mw²ÖÁ@[^óx#«Ì@ rÌš_›Ç@Z-›ùº@ø_$rW¤@ jd]_PÀ,jÈò/EÃ@Vµhi‡fÖ@«‹“Út±@D“³ÉÉ@;jœv2'Ò@˜è0!E¶¡@,§K·MÉ@}6þÅ>™Í@ò;±ÔrÐ@ܸ›:W·@>°°˜üüª@f¿ŸÑPÔ@—óXàæÕ@¨Ã-d Ö@Õcµ£ùÈ@Pܦ¾x‡²@»+}ÛÑ@:ja5'¾@V‹1žîÖ@ûýž¦ÈÀ@q(ÜÁ@«J2³8¡Ó@šŠWÚ Ç@é Í¿ÕÕ@²ju~~·@õ°‰vÖ@˜ö¢\…Ƹ@«´Z™´Í@Ë­R2 @ÿF±‘g¹@°ãý²@—]Ç Ð@WуJÚÓ@ ú…b3Ñ@¢Jq TT¤@5ÿÿ츹Ô@ç!j“‚”Ö@;S©h´Á@1R‹°-µ¬@ª†À ,„@–¥%ÎÆ@¯‰ rÔ@ƒ&ËëÁ@M·eÖT²Õ@¦¸ÍvÎ]@dËgsÔ@àž¯x¹ê³@¡AúýÊ@¦±¶rè{Â@s8gd Õ@ê­%Ò5Db@° +YnÑ@h7FX‰Ô@¢¡u‘ª±@‰å\¨—'Ô@§¯{¢Ë@Ï-Y0k¤Ã@‹¤!’dHÇ@?=£dÈê}À߈ž¤.}<@ãäÏ~œeÑ@ÖÜÏŒnÀ»9)ÂÔî§@;µÇmÇh±@y‚—ÈÇ;Å@<û­—ݼ@mssŠzñ­@˜ yðª@Ó6͇Ó&Ð@JREþb@ÕìŒýÒ½@’e)~5Õ@k"7‡¿Ç@Hã/} ÷É@•qæJv£@ vðFDîÒ@ITÒ²"Ö@‡.s%‰Ã@–~Göž£Ë@ƒ§OEÑh¢@î™wɩ֢@ünó‹±@u–ÒÝÑ@iΆ\ž¶@¾,ªÍÁ@<, CÕ@$$ÅL˜‰zÀâü¦Mw«@.Vli…@¥æŒºj®@÷RåœÂ@6²ÓÌ®Ô@Ș¬U 3¶@y¤»ßf2¿@ŒEù±_ó²@@äM–¥@”–WHÿÎ@² OÇcÃ@qÍ]¿í@n Öì*VÒ@ühîH7­@µô›eÁ@¤8ÎûÃTÒ@XÚÙ…¢;Å@»ÁXôŽÇ@¸U6ebR¹@+Í^²™Ð@·”3e1²@­°ò³;pÎ@§¢V—@ã….<6³Ñ@iqSÙõ¬@`nèèÖ´{@RðÔ)eÎ@R[ìÒe¢@V…¨rê$Õ@‰rʃ˜¾@ª`!m!ì»@·xI“‹½¤@8ꌶŒ±@¹¶7hFßÌ@¯uM3¥Ô@mªµ{ fš@Ý"wü¦@²Œ¨‡Ö@îL•…ãѲ@µ‡Vݪ@ZFb hŸÖ@j €9Ñ@÷uàû³µ¾@-U…½@J#{Ð ÜÕ@5|®ï¤Á@hzn%‘È@Lx·ÉîãÈ@µèÅŒ'ˆË@0:èºÄ0Ô@–¡UdZ[Ô@Å Œk*¼¼@³ ­ ’Ï@œú'+4ÚÅ@€u—Z¾sÊ@5_÷ìq»È@³O©n| @\IN™ÇÖ@iÖñ!¥@6Aûþ€®Á@€ˆUV9l²@ ~׸ë4½@T,mp8·Ï@=`÷p¶@¬= ›ŠÚÅ@ÍàÁÌ@ ;%$­Ö@f†Xo¡Ï€À–AO.AìÓ@·Ý@»ôYÃ@bŸzØÁ³@¯í_Û¡Ö@r!ঠÕ@<ë÷§CÂ@Æ|Çix`@ ºAÛŸÐ@¨õB‡Î@ºpzgœ|˜@GΘ9sÁ@OxÚÙi!Æ@¸mÜ‚üÖ@2¸9ΚË@d’—R]ƒy@A];¿Ã@ÒaïµVø¯@h€€Œ£ôÀ@%NÝós+Ó@Ã¥=h0õš@EÐf@ÀÍ@=™HqO¤²@¼\P?„öÑ@OäZ2a&Î@]¦^ƒu£@(- h†ÀËå¤~!FÐ@ÙëeAÉ6Õ@… w%¸É@·'Çr{'dÀØKô•\Ñ@c›µz åË@3¤ñ÷vË@åaÍÅŠ ¿@#h3›fÇ@z¤£Ò×hÅ@Ô/{6N”@|î/RÞJ«@>ÛØp·Ê@; ÎðÞÕÐ@°zá¡Tb‚@jYðS2 Ö@XòèÃÎÈ@È¢y玢@Ð+‘AIÍ@²àôsåW‹@«jÆT6ض@€º0.5%Ã@ë‘‹MQ¸@Syf|EÔ@FP=ÛÚÁ@“Á›£É@¹ÌÞàDêÕ@ œo™¨Ë@Î=ÇwÌ@ÿ}YáÖ@DÃß±â{Î@T§žÑ„@30œ4Ï’Á@ª†‡öÅTÂ@ ¿~pÖ~À@‘<ùÁ|µÊ@„³ ’•Õ@¦XïÄ@p³›¡¼Ô@P`Ên':É@r<»‹˜k«@.ôËʸÑ@‡„e¬QÕ@˜ÓùT&¨Ê@üøÈ›ÝÒ@3[;¹¹@«d븧‰Ö@ ˆƒåk»@´4Uîàh¥@®óeW¹·@|$Âü`_Ä@ÏÕ8søš@ãb¦p„»@gø»3›G¨@õ9{OÒÓ@¶ü~nÓÓ@gðû6³«Ð@:qØÒS ¹@Û}AÏ& Ð@@ ’úQ~µ@¤Ò[$V·@¾7d·LåÊ@f!ßezÖ@#}˜Òf Ö@=*å…[<Í@ Úõ´Ñº@|Õ”±Ëø@”€>r Ô@UX¿þÔ²@QXû!˜³À@|b¡Î~Ð@ã¢ñßåÂ@á…aü|ŒÀ@_¹3‡»@«aúzúÝÀþ¥=riˆ@ÆRŒF0‚@Íªé‡ø®°@ò¨OcÓ@}÷ŸLLuÊ@Ñfˆ÷;É@1ÌŸdÒ@ÀR3J ÏÎ@§Kë^ûÞÄ@Duè~Ô@ÈA)j{ÛÖ@)@Ò¤„OÖ@GvÇÃålÖ@й0fµ«@Lн•—¶Î@Y!Ïþs’Ñ@’2Û©Õ@ÖØÌåÙs@¿!÷Wà'Ò@:rÆœÓÎ@ñmDà.¾µ@Áœ`¨Ï@ %çþ~Å@)$o.ý\Í@Ϲú­ÀÍ@ÔäÎ Ge±@PÒ|KÛÑ@ÄØE@~›@˜xláL½@E8rnÑ@Û Ò[Æ@ñ x’ˆøÏ@w3f¾.Á¡@Ê2kÿêYÑ@Ê׺C‘C¾@Î)HéÕ@¡@EØË@‹ È+™@\$´G¦PÀ¸ös@‰¿Ñ@R•‹{Ù¾Ö@Ú“ÍÎØŽ¸@4+zŬ¯@H,«…¬Ï@8IŽvÜÔ@`L™}ZÂ@dšñ݃AÕ@šÓ3;Ìs @4n\ߎ%Ë@KøTý=RÎ@ ¯6޲Æ@Ì©*(Ã@k¡xÃæ—@ñ~˜w¾—Ñ@'nRâÕ@Õà¯Ñ@}7I!ü˜Ä@U¤š¶%Ð@jÀV ûaÀ@·\Ržþ‘Æ@ÎŽ~ÓÔf¼@ k¡Y Ï@3ßX¶„ûÌ@ô3«§KÆ¢@©¦¶ØÐêÒ@ì:˜_ˆ@W˜éW.@ÌéÝøî}Ð@Ðæ iÏ^¾@D¤ã©nÈ@H¹,Ì@w›¢–{È@þÃ<ãoÊ…@1‰5Ì’Ê@ä€àçeÍÁ@„LaÿãVÀ@j¨ý·_ Ð@ÅMËÂŽúÐ@n4vfÈ@§»„»·@]µÇ»»@Øòž/l•³@–Ÿ½Á£ëÖ@źPlv0Ö@P`ƒfSÏ»@~—8F¬Ç@b3úäêÒ@~k䷉π@X³¡^±Õ@¢ ®ò»DoÀär4’¼q@ÿOŸÚjÑ@¶Ùf…)÷Æ@+bÞ+°@¸íO@]¹@0Áç¾µÌ@¦ûç‡&Õ@³–‘'f~Ò@¿ÝÁ !˜Æ@’òâ²EË@ŠMDŽ]ï´@ìaÍ1ï`Ó@t™®ŠhÔ@ß0pkúZš@çfZ—J¤¸@O:÷ÙòÞË@¢Š‚µá÷@û_âevÅ@„åì °@vT‡\Í@Êq]\€@ ¿øë'“²@tȳÅû³@_ži< µ@>ó“¿@Ó®±òïé©@”(˜³2$Ë@ÛüÀ?0ÊÖ@ß’¯±ô»@Íg?²…KÃ@nt³ [W«@ÇGpœ¯@…fžEÄ@²nÞzÑ@Í–U¯ëÃ@B;­ÓȹÌ@&|_£“É@è[ǹ¡Ó@·oèA´Ô@¼ +ù(d@U2cô»Ð@žb¬ÑÕ1Ô@³Ø*u¹@1KøÕç’Ó@án½/öÃ@HQ*·Ò@&xã©Á>Ó@*ºý²ÁÀÊ@n["£û˜®@­&—9.È@ÿíd a @#é´xÛ%Å@ÕöCÇÍÒ@˜‹ ë·Ç@!J¤œ'¡Ê@ÀÖLzÂÔ@®(`,Ñ@;ÄÇ«ØO±@š_*)‚Ÿ @ˆsh!ÛÀÀ@1ßöÉÅ@+ì¹ HæÏ@ؼϠ@‡Ð@@ü 'ØQÖ@†JaÎpš@à’­‰Õ°@×¥ ¨`ÁÄ@jüÁ©Ç@œ7Õ@mõÏ@5r.4ºÓ@ÚX&¦ãIÒ@8‡ŸÑ·@Ì0mcšÿ°@|šx ßÓÈ@*U›ÂgŠÐ@•0’BÃ@yrê ð½À@6È5\x“Ñ@Q4–òbÆ@“Rt¿CÒ@¬ÏR^ÒEŠ@I®á3ËÏ@j¹UýŠ@F“ߥ9º@ýœyøràÐ@D¸K86Ó@·Æt¥kÔ@OWx~ Í2@‚C•ŽHÂ@ßÍÄ‚²À@ž1õ Ö@Ía‚:€Ô@ÖØ—ež½@ƒ©NøY’£@# €©@®öÞ¯Ë@qxak£@ÊÉAþ¥¢Í@²pÚÿBå©@ì®ÇJÃÌ@ÈU/zkRÀô}ôŒ§‘­@Xì¤7[Ö@ªí-ŸpÒ@øïÚ|Ç@¿‹dÉ0ž@>\¦=æÎÍ@3îó¿gZÅ@¦‚¤ÙäÀ@øDã¥d¹@2-rã¿Ö@ôs¶„çõ„À*b=8¨@BÝ6ÓòÇ@¼lú&ŸÂ@PZ6pÂÎ@*n—`Þý‚@û^¸ Ÿ²@#Â÷t¢`Ç@²k:ªœí¡@‰‡hˆ¼À@`*Ö1e£@›ˆþdY(Ë@ßÖ4X\Î@äòQ¼H¸@Ì%_™2DÇ@Þr”­ìÌ@oéܪ×@ªŽQ‰u9Ð@Ì©x{èÿÌ@LÑÍ1ÁgÆ@ð,×úæ·@ZrT¶È@Õù:,®±Ä@àÀìîÕ@ZêÒ~@zÔ@BlC¦zN´@w•¸èE´@.mÛ¢@Ñ@íLœWÔ@ ¾îäv!·@4­$ËS=É@N„³é5è¡@¿ãàÕ@ znºÏoÐ@NÖ|…~QÓ@a}8 ÜÎ@^MIÀX¬Ï@AIè!«º@2—ÜKÕZš@ôˆ$±x•Ð@(7õþjÈÑ@@D¹ÐgVÂ@Ãñ9§ƒÔ@âÜ5™Ð@pýúJWDÌ@PÓuª Õ@|ÀýRÎ@.¿¾ŸžÉ@š«ÄXÁ@³9÷ÔT"Ã@à¿×¡üøÖ@ 6ÖbÙDÆ@°*éžëï­@m?-KÆ@ˆ¢Jžðf«@¯3ù`Í @µq4Oºµ@›—ÍÆ@/WÀä®Ñ@=.7tô~­@ؼT»è×@UncžGqÁ@~ë³EÁË@¢Z ܼ@Þ*cbH@!_4ÖņÆ@rÑ[×#ºÁ@è#Bú/•@ºãfõv¤»@âµ'P͘Ì@•ªÑæ,+Ò@Äã ×6nÖ@îÆ$®‡‘@i8‡åÅöÐ@ò–")ghÈ@ *‰±ÞÊ@ÎßZ‚-·@Ž›ë]¢‘@f–gVSÃ¥@f.Xº,‰@]ÈXˆé¥Ä@Åy¹¿Ì­@MÄ™ïd Ó@‡²Þïù&Ì@HÏ\/3lÏ@_ZÞÔyÔ@{’ Ç@¦þJÖBœ@ Á¥=²@@B¶Z­W¬@`2=ì…§Ð@B¼ØtÒ@žÚo¯À@^¹„57Â@ûÓòtæxÀ…—ùDÉ@°ìÊ%ÁƒÀj àQ¨„Ààò†YhÔ@Å+lü+>Ê@èð|–ôÌ@'מ}]_Ô@‚}ʘ–Ò¤@‘ò*ê 2Á@V–¡—US­@(edv >Î@E»þ•j³@ôsŸ7*Ñ@x‘8zÿ¨Î@5úIŸþÈ@7Lé·æâ¾@“ –àüÉ@~XV0§k¾@A0Xp‡£@7gë%1‚Ì@¼ ÁÐX±@#v6ëÅ@÷_±`Ë@.gé6DXÅ@ÌG¾|7Æ@¸G×j~À@#1Iþ¥˜Ò@ÌÆêF:¼Ä@¶ï Rƒ†Ñ@˼³—¦›@ wPL»Ï@Oê”l;äÄ@>šŒ|„z¹@Guå’³éÖ@#Sh'\#Ì@|IübÒ@/¾Ó [Ð@ó²8u+Ë@P‹$õÜ¿Í@ä0÷&IVÔ@½e€ Â@èX/õ;*Î@h‹îhCÐ@ÑÅˬÜÚÊ@»S{ ÀÈ9À;Õ@Xx¯gœÖ@ÜR+H.Γ@}PŠÆÚÕ@Lå°ššÔ@VÈ¿ÉË¿@ÛSp£Ñ@èXúi¯Â@·Ñá0Ò0Ö@ëz^Zç¡|@•?ÔóàýÂ@ÇäðKY @à••ã6Ö@>ØaÐ`ÿb@lì¸K= Ê@¯0°Þ­ñ¹@™tÖxǦ@ ’›Ø·e¬@ì@R«Ô¡@…„÷à’Ñ@{’µ &Ð@a»‚`ªªÔ@Ó€Œ>Ò2Æ@ ù‚Ô¼Ð@€‰ ˆrÙÊ@hmEmÈæÒ@¼äýùI @PîÞ†Å_Á@Ìãk±ŽæÑ@ì¼Z»U–Ñ@¾xBÿÍ Ê@-þ‰ ±Ç@˜—–0Ø ¢@b^ÍÔÐÊ@ +9Ǭ@(÷.¤õŒ@¤AŸ%¹ž@÷ºå3'©Ò@½)?KÛ|¤@@F*ìÝsÓ@~:3ÍTÑ@úÆZÕÜ×@«.?«cAÁ@­ó+½‰“@™Þ¾6ý»@Àó1¦‡óÂ@:)Êû3¶@æÓ’“V«@QJQAÝÌ@¸)˜ip³@-— š@óÜûGB¸@#¦FáüêÖ@½ƒQàFÈçVÅ@å„ÉQøÔ@hs^·oÇ@ðøæaGMÕ@Ñ’ÓÏ ”@ž¸°Ú¸@{Çê¿|Ò@§‰ð¢·„Ì@Í$‹§ÖÈ@\”ÅoÇ‘@#õ.TmtÁ@w?÷qr0Ã@î ¶Ð~È@‰¬LlÁ@U.;V¸@Æt~ªÀé¼@¬¬×vq·Å@–áü¤h!Ô@¾'ûï5Ã@JÏ!±…@ïõÕ[Ë@ ÇsîAÊ@ŸÀ-äÞÑ@¥îšê„gÏ@žb=yÎ@€ò-Ù­Æ@Íø÷œ©@  kFÔ@|Ë‚Âν@×y¡ $Æ@HjyGÎÉ@@U˜¢Õ@ξí–G!Í@ÿCÃyŸÓ@8‚¨mÇ@³<<›A&µ@) é㫬Ä@ŸŽ„ªÕ@"içÈïÐ@Ï‹¨IðLÉ@kB$«¾@ë!*Oõ¿Ï@©òÅcqƒ´@_™Äž´@À“3f˜@‡¼)9±¸Ñ@û®)£(óÒ@çÅSË@úq˜cÛ‰@Ÿ Š-@UÒ@¡J);]Ⱥ@^œŠõ`Õ@õôö(¿@[¹ ¿¾@(&]Ù|Õ@Éý¼x³`Ê@ʹíÁÃ¥Ñ@½¿¦t»Ö@½»¦¿£‘@‚>P.€^©@Pˆ0µ@á@7—ݽ@ù]‚(]É@²Ïa÷Ò²¼@ýû/veMÑ@¯/ ¼¸rÀ‰>ÆÎ|Í@­v½¾Ó•Ä@9Ÿ+›bݺ@Kvi¼e°@Õò’ÇÓ@4l†ÜóÔÍ@íoÀŸ¤½@ ÊÙ§eVÉ@J€%Æ@RQ£,PÀ@)êÒÎ@(nž¬Ñ|¹@;6Tÿ {Ÿ@ê¿» w½@_lUùž=µ@©oÖ½j³Ó@zzjFÇfÑ@sí±,Õ@4çÓÎEW›@¦§ÏÏ@ɸÏ4VÈ@¾ä)Ï”ã¿@ÖÌ:ÕǶ@[çSÈ@??\fÁÍ@‘V£]MÒÖ@aFîl'4¡@Ô".»¼Ð@:Œ!ÊCÖ@ Âo+·rÑ@§ÞöfÎó­@ßQ½°@Qí·g{Ó@@VIh´€}À‘ˆÎJ$qÃ@êôÒ±~·¼@¬áYÇ@w»\œË@\vÇ<|ÕÌ@þÕ Æ;“@Ž×-hñÄ@¬18±Ò¶@‚»-•ì«Ò@3«²å7^Ó@§ ÞqKÎ@“š#rQ}@ä+ÚÄÛö¾@Ö<ìâÕÖ@;P@zGqÕ@þ]âܪK«@›õ n6#Ö@ÊÖUà,µ@à—Í/»„ÀíÕÛizÉ@ŠA|æÄ´@ÄZ•ØœCÉ@>p@'êÉ@Íï¢÷¢Ó@ÐOû'§ÖÅ@ö¿b®®Iš@f×eÏŠ¦¿@@­zBÖ!Ä@.F  Sÿª@ùcâÈmÆ@ã„÷œuÌ@)|P*iUº@y8óå±·Ç@ƒ#‘=Æ@ÙYÿ»d`´@‘ÔItÏϹ@”ò¾y"Ô@;ƒ PÛÀ@Ý1µO`¥¹@ ·}4‘†Ô@q|TÝgq¬@ñ×^÷£@OÄ‘7ð<Ê@Ò÷u¯¥Ñ@Љ×+<­Â@Óp¸‹Ô/²@1 Ÿ›!Æ@ „™t“¾@Ë”Eª.Ï@+aþp®•@aŽös®lÀ@‘#SÍEº@?C>ïåËœ@ÌGs©Åœ@ûÊç”4I­@;)ù-Ô@yå4ðž„”@ˆ Ïy‡‚À¨À&™ƒefÀäµ/÷¸@á•·ÂÎ@¼ïÞ¿¸@Aüa®­@îr\Úž0…Àó:q×ÁÔ@Š%ò9ªwÑ@V:]ûÀ@¶Oä*ë¬Ó@!¤y€ß1¡@Ѭ—ìÍ@ÿ0JtÑÐ@Ÿ»ßC’ÄÅ@ûÍVY Ò@Ɇt…¸“@IO!j,çÓ@ðôJ@êÃ@£_GZÇ@‚ž÷ø‰†@Þ&Í@´@VÛsHƒÀ,¶)B…Ã@¹Ä†Ò(©@æ§þ\‚jÒ@§¦ÕT#Ð@÷:èÂ!¾@°Í u&Àº@n šHfÒ@=ñ;ÚU!£@, ÓhH@É…mŽ0Ò@ßA»FÎcÄ@s+:O÷g·@MÙ€y‚"Ð@‹á=1ŽÔ@’cZìbË@ŽˆÆ3FÒ@(á/£OÕ@ZzÀÄ@gx¦­$ßÉ@õ½@T`bÌ@&êáG¤@ÉÄI;žhÕ@QñœU/¯@šH›ÍÆ\°@î°ÃgÃ@k¢ÿÄ@2»ÅøÓ@ß$î^—²@bÕ°‡#•Ô@µ,5¥9À@ùÉÙø îÈ@R:¬€è³@ ZÄrÄ¢Æ@Њ% ÔÌ@.CÉ*„É@X'’xÂ@ãDDyªÂ@­¹OÎÇÓ@ï2•Yã«@Ü*ámœÂ@ç'>;×@ÿd×–ËÏË@S=CÓ@5PPêÓ@%$º†µ@žXx@=ïÔ@tª‚AT7Î@x„•ú÷î¥@߇’½Ô@Za²¾²”Õ@÷Í9é½@¤N´Ÿ¾È@N*”ƒ5µ@ÕÌžóYÒ@üAŠ—áÅ@6?ôÂ&£@÷\D %ÍÄ@s÷|óÕ@ª'˜GÕÖ@Š€'“0Ã@NO~’Ò@ø­”…ôÓ@&ës¥sóƒ@°ßFDÁ;º@Q²«“Ñ@ã °/Öp£@òš<ˆ¾Ó@•¬·ÌÂvÔ@8nѾÓ@è|ÛbäÛÕ@ÃG©)mÒ@ÔŸºöÁ’ƒ@€ÆãR°Ð@0ô½D–þ?è;ÍI‹3Ô@Ü=B¬º@´ÇïuÇ@úéJgþÖ@9@{¨+pÏ@vïï` É@‰X¤…Àœ< £€VÒ@žsQ7§šÎ@¬D³ÞD²@ø©ÿâ½@Æ„“°«¥µ@_8ëWHê¹@¦þ– 2ƒÀ<óÎx!Ô@Ãdžº|LË@Ás'9&¦@¢æ·5ƒ›@ÕùÇé$ïÉ@ÅåÓÖwÝË@­6»A¶ Ö@‰îŽÄ@æ>-WEÐ@wØjýƒkÅ@~߸W0»@ô Ž„LÇ@ƵLJÔ@Qe×zr’Í@›ÂcåS_®@kx§KRäÈ@eëó™34Ç@b£¢¼¡a½@„!&Œ9õÌ@ü²¿)œÈ@þVïS2þÓ@Ï6zX‰Õ°@F¬*pf‰ƒ@›? ÜNÏzÀ£X+î•c¾@ƒ¦e…®:©@ªbp…•Ï@çTò&§>Ï@_ú÷J¬Á@ê~Æ—íË@ˆ±†ž”¯@DâØWÂ@dZø-ÍŸº@ΠMéκ½@«Æs¦ÒÁ@Î!Þ¨ƒ±@.Ýífû‘@èB;ðÅ|Ô@ßÌ6LšÒ@¯¬WPØÂ@5X¡bš@r÷æS}~Ç@çÓ¿"‰·@NœXƒÀ@ŽˆÂR¡@eqízÏË@ÆöÞx,•Å@rqXâùˆÀàFráÒ@~±T‡Ë@ã¯ÉÄ\¨{@@åMgŠÖ@U©\-”¹@¡Þ-Ä;ùÕ@Ã~ÖH/Z@¿Â0æÊ@N+£mWÓ@œ€OmÓ@ŠàyX&Ö@ë³Áì6d¿@ZŒÝµZwº@çTa{“ ×@qÀÁ`½Â@7^“%>Ö@»É„Á¢@âÊ©9Ô@Ý§ŠŸ º@ÕlgsŸº@PôØÈ³$6À’k’ €Õ@ºt UfuÁ@\™”: :¬@\þåxÓ@à;\>Œ[»@ÊìúJ0´Å@¤}›ÍwÆ@snk“ ›@NΖ”¦ÑÖ@?"dgt@W£ù©Ì@Ï€K››Ô@ Œýˆ!Y²@™#­Ô”»@pŽføA2Ç@3+´ø¨Ñ@Ô V<ÁÓÓ@• EÔeKÒ@¯o^@© Ï@)$?±l¾@P< T°þ“@ÛU£á·Å@ÁÌàËÄ@æ,ýoÀ@ê {qšôÌ@¢;G~ÕÇ@³6‘è ‡Î@2–½-Ó@rÓ˜½@E½Êß9eÍ@{åÉc°@dž »[.Ì@5,O™”—@n >Ò@ê§ßåHëÓ@›^rƒæÍ@{Q êGÏ@còÓyÇ@ò/Ñ@>ûµ´ÖåŽ@}¸ËˆÐŸ@WHÔ(ˆL´@VGÉ¢¿ìÆ@Ö¬Ÿ¥Í‹@¥ƒÃA L¥@íô½<Ö ½@˜³ö¹TÏÄ@¼{ãñx~†À—328E½@;S7-qÎ@_×$roÖ@pp±zP&Ö@ÕU,ñ ¯@É^È ÂÎ@õ šSmÎÊ@`«bKbÍ@Ì J`¡Ð@V‡È%Þ©ˆÀ1Ú“²~ìÏ@ ~]v÷ÛÖ@GÛ®eÖ@Q`&kiSÈ@-øÑ"ÿÔ@€Ø‚žfÓ@BÇgýÜž@ß\©…~·@“!µŽzÀT: ±CÆ@`‘§dj¬@ø=>Èz Ð@(,ɱº@ƒH)6 œ@eã·*‡$Õ@ \Ôc'ŒÇ@lÁÌd Ò@´ÍýŽÐ@¾¤îúõÂ@ 3?°­Ð@E°+É ·Ô@` ùzªÕ@§/3„1W@ÄR“ähÓ@eÖtŸÝqÈ@÷±‚ÖtDÕ@(Å€(ßÌ@XÊœÃ@à×Jû €½@ Ú’k¬Ó @òo3ˆ5Ö@éâø…Ö@@MÖ©‹Ö@Ó»À¡K¦@VAN¯UÈ@¾M Õ·ÄÒ@bÁ ¿gÇ@†â1VòÊ@®„i%fÆ@âÑ$÷à@>NÙ|k×§@úàÙ\òhÒ@0:Ò!µ±@¼!p9GsÆ@l5"Ñ¿‘@g€”ü*{Õ@ɯÄ¡ÆÐ@„„(J¨†@3MÒ”ý¨@vÀYÚî«¿@®¨Ý?*Ò@!Ë<‡Ô@ßµŠí·@Õ ÙÀŠ€š@{ð¿wL‚Ã@>àü *ªÖ@ì¿Ò"UŸ@ƒ<÷çH È@ŠL È´@ìPjEwÙÏ@T»´•ÐÀ@ c]ÙS™Ò@PÈ,<‡À@ù+ q­@Æ@X©EÑûøº@Cõ+Èo™½@Ë+Ê5tØÅ@I&¦ ÍiÓ@xê¾Íþ†Õ@ Uå 1'À@Û.,Ž)÷’@{±Æ„éÔ@åfÜß+Ð@å(Â% LÆ@‰ç_L¬@òLåØÒ@±Ò©}]wÖ@"íêHŸ#Õ@ë ÍãÜÏÏ@sÿ ’J¾@VªÉ(€ÕÓ@KË£ò<½@ÐíazbÕ@¢œÀhÙ”¶@{I¡Fã´@ÕÀÚóºDÓ@ˆt±k¼Ó@d7õ•èÆ@8AþVÁ—Ó@îýAo‰Ð@—c©L½@ÜÛ “€\À@æªê&”Ö@)Ìœê»×@RгúÍÉ@,RU–Õ@ðõ6þÍ@e>šAç´@Ñh‰È¬@tÍ ü½.»@}3:R\éÒ@èNWè1ÖÔ@X+MÃÕ@¸2$åíÖ@Åë£È4áË@`^ ¸TË@ ìØº£…Ñ@pÝ’Ï—Œ·@+ÜeÓ7ñÕ@¡J™±¨…Ô@»CÉBžóÐ@`P˘‹@¾ýšÆ@ ŸZ±‚ýÄ@òŽRçÁÃ@%{覙wÀZó‰DàÕ@*ø‚@WA¨@[ÔvAêÓ@$cö}ܸÕ@³ëòÀ Á@€z÷Ô@½5uC*rÀ*ð!a•tÉ@B=4]Æ@뛟Ö"Õ@W¤Ð§yÀpU4›$Ó@8šó\LéÌ@´©&Ü=@Ê@?IUåñý­@Ÿ¬ù'˯@±M‡…ÆÔ@ò~Wüw¾Ñ@§¦ÓÌ@}ÊÙ^ý@X*Ä9èÏ@ZxFј¾@HJ€™Ç¹@j†­@ä´Ó@VmÔ^^wÈ@W¤½o¤Ô@-’éãCÖ@ˆ}Ãh*¤Ñ@)€u‹G¥Ñ@ö^ ³¸@Ã4מmÄ@H Ôò#‚@L1ãì×sÁ@‡†³b[É@á½T)ÔdÀb½² Í@æEòž*´@9I¦œcÉ@mÉ\2}Ô@ù ¥à€ÑÓ@¼–eÀ@°¶KäõD¬@­r¡cÓ Ô@-Gp>½@p‹[M ŒÀ@Ñ»üC´¸Ð@ê4ˆh”Á@®ƒ×QòÓ@„ï y¨À@‹ŠðØ óÅ@YôwÂuk½@„µÏ¿¦ ¿@ûƒ!(ÞÕ@¥-…7¸Ö@ÀôÊ@œì8Ã+³@I)]\z²»@8mEÕ@åeí¨Q£@ää¥J¶@ú {K©òÁ@ø\Jñ7³Ð@~nÙº&¿@µ›o-³@¸Õͳ½@Y›ì0 Ë@ô€¾Ù2Ñ@déÂ>@nÑË;EÊÍ@@|pЂ½@rµå’£@梞#ù¾@; ð ¬9Ó@½æ€É"”Á@”E8¸GÑ@Õs%p1Ò@܈šÀ¬ôÃ@ϓ⺃ÏÕ@âdç&ºHƒ@ÝAà¯ë?Ô@*ÏI€hˆÌ@¡ç[ìJ«@èž’Q «Ë@§#'qT²@æL”…Ö@)µÌ`*¼Ç@)Ç—ú:ŒÁ@ 5Ga7P“@ë}…>7É@‰ÃLtÊ‘µ@?©» kÅÔ@Ï‚ço?ȶ@‰¯´<Ï@Ê[»âÇ&¹@|ä¢Õ|Ô@<]ÜèßÄ@o©^MòÖ@Ôü9é©@<>Ëé’»@¢/&W¼@ŽI׬¬Ñ@Œ".U™{”@÷.¹šÕ@Ùm Oôs£@[ZV/÷Â@œ=Ä_ ÃÓ@r!ÌbQÐ@_“æ¡Ã-Ð@k ¤mþÇ@>jw-’Ê@4áO£8Ð@{ÛWàÎÓ@P‘<¹J@Fæ`ö,Á@†¾I–¡KÂ@ôéO én®@—(¼RKxÑ@n.̲ðÀDÑÕzcÕ@ÆÊÅòpVÓ@ºq¥Ìº@ ‚<™H0Ô@ëSã\+Ô@W¬'â×®@Öª‡ˆÊ¿È@' Õ÷äbÆ@1*ÐèÏÐ@dm˜´©ªÒ@=:w.XºÆ@å0ˆ†¡@Ò¹u”¶@UªîxÆ@ÙÇßÈí²Ö@wòým Ö@š³5çÉ@¡]ýÑPnÏ@ú0$B—÷¹@æ§“leMÌ@x E.-þÒ@»°Ôçͳ@›f jÕ@€©Oà˜Ð@ÎÕoâMRÄ@S¹>»³*@»òkÌ©¡@›¿]½ó÷Ó@NÑøÅiÔÐ@dé¢d¨«@ÄÖÈ*ï“•@…±µ[…Æ@vDk#H—Õ@å¯$ÐË“s@"yR©¿@ºŒ…ïªõÔ@ÚV'ykÍV@3ji³mÒ@:•„¹¤Ï@¥uRX,Ó@àÎR€Ï/Í@â½ÕÉ@/újø©Ö@ð"ïu§@ÐÁö#JÕ@‰ýá[µÔ@ÍQ’ PÒÊ@æ˜ð;&Ï@®ÙøR[Ñ@Üš(Kž@»V´‚ïbÀóÀ|7¡ÇÉ@åq8µÏ4À@Æ` ôÃ@hp«¦~ §@SËl¬×@8pµ_'Œ²@+ÚÚÔ@ˆ¢£Dö¦@BqgckZÔ@¯Q-ÌLZŸ@ù‰Œ¼èÐ@×`^šPÖÂ@­µ Gkº½@ÃæT8´Õ”@t¶3åîsÂ@žñ^`#Ð@á² ]Õ@è«Ä PÔ@>y}ǰ¨@ô™éV£Í­@§ÆËÚ·Õ@ƒŠê)Šü›@¯åcÕ´ÂÈ@Þ9«6mÓ@ÁE ¤ëMÒ@ˆà×7ãÓ@ös‹ðßZ¿@ÿ…ÂáFñÍ@ï(+ ¯®Ó@hV.Ž¢4Å@6€‡\Ã@‚Ǭ-c‰z@È.fSûØÌ@ôE° 1Í@¸~Ø7HÒÔ@àJS™Í@ ‘ýÕø–@ZÚæ-î0³@³ÉÊ/Ù0¥@^ݯ\pÆ@Ç=߸Î@µ |X“àÕ@¢}Ù/Ë@Ù?Ð#ê²¾Ë@p¹eç”Ë@Û•¦ôÐ@ïkëšDÖ@ßì BÖ@WÐýX§Ãº@Ô‡×ÒRž@Ä:€}tÃ@D“­V· ‰Àð[Å»¬Ì@îÌôáƒ&§@v7Ô&Ç@û»0~^×@ o.ê¦Ê@3ô¾ëžtª@¨/7·œÙÓ@=ª¼îm“À@EX¦ùsõÕ@ !HÿSûÆ@Sð&q©VÖ@Í“èÜ¢dÇ@G KƒÒ@œ tqq¼ˆ@ŸBô§u…Ö@‘Éq°U]Ï@žgÏ~ÐSÄ@€‚ýÄé¡@Ó3!ö¨@ Œöº¨Ç¾@DåHrþDÒ@¡JñÙ0<Ö@7hÍ`°óÍ@ä¹ñ¬Žµ@ùN<éë9Õ@uZg}IÆ»@ݹäs…À@IEïdŸìÅ@ÂÆFü,Ö@ÏGõ±@¶@bÑç¼²wÊ@©qPOÉÅ@Wï#èy@¨Þ¤þ9·@ù@+eUÂ@n Â4Ó^ª@ûÅ_’©É@·bÿÅÖ@eâ7šº@ ýÆ¡KßÍ@Ùxö_†Æ@*ûLX“@>è…l-уÀÜ‚©ÂÛÔ@:ñÍÆ@ƒ—Eç÷/Å@‰§‚Ò¦-Ö@Ð&ŒOÏ@N|ȸNÊÑ@A­¸pÒ@gØ,Ù @PTH!Úš¯@\‰ú›ÁxÓ@lk›–GÁÉ@xf%öû^·@àå'g¿l°@22,%Ø´Î@pŒï[¾@(ÚírgF®@-P‰`‚Ó@&w³T‹°…À ëžC6 Á@;¬zµ¥@˜Þ«@>¼—p8Ö@%¨Â aéw@ü¦Ð.Í<Å@“YÆXéÒ@à KœEÒ@r\žË¼Â@0TÔ~f½Æ@Ú.;jNÄ@D×åPÕ@~÷<=”Ó@@µL¾@û{ ˆÍ@wmG÷ÅP@wû]fõ±@4y Há’Æ@©jQ«¼Q¨@ážÑ¢VÓÀ@ÑðJä†Ï@F½üË™Ï@ÝEzù*Ë@"~CýÑ@ò82¡Ù¸@´ZÛ9Õ@²}úÛ»Ô@ðD%rºÖ@D%‡§ nÒ@MõåÁwÎ@íè`fkëÓ@—…¬[E”@9/hg²ý¥@ )äL£¯Ô@íYf\›€@×kê9î£@€KaOÓ'Ê@¿â KžÈ@J¼B;\²@¯ºƒbãK²@*rÜ9í×Ò@Ç] •Ó@ÎuÞsT²@=Üò–‚À@Tn”ØÒ@ßáØ`yÇ@0ú ÚÐ@SòjRH±@ØÙïÚÒ@vÞ/îëÖ@´?ÇÖÄÁ@d_©3âÕ@U&àFA³@BìêeJô¬@ì‰9o¿ÐÒ@Ø—™N•+¨@ùg{Š·aÁ@òÜ1‰OÓ@•#—qÒ›@vß>(¢)Õ@Û€¢QÃ@¡b§laRª@Ýçê|¥DÄ@¼féFÂèÖ@:l ïϧÍ@ÏàU“§óÎ@}4¸› …½@8?íj©VË@ ­X>¦Ò@ŸæÈSvþÂ@¶Æ}À@ w*à_Ð@|$4m×uÀ޼yn–°@¿Mfá§Ô@n`ê/IXÏ@²¯¡fÑ@þœA6=Ƽ@6ëÔ_…á@´I%DÜ´@Ùä‹£Ð@w7cë_²Ö@Ø‚˜­³@%^ºÍÙÎ@ûÙϪ#ǵ@bÁ­’þ„¹@pi\d»ÿ˜@E‘–Äeµ@ÑÍåòÈ@à+ÓGeÆ@ùÓ­‰V¿@äE-‘@< ÆX×@ÑE­®C£@2ËF0(SÈ@O¹ƒ%1xÆ@»?pÌÖ¼¢@w¨ )Ê@6Ŷ÷\ôÀém Õ Sµ@±ºøŸÃ@‡’ï È@©z•÷BË@k:Tð¤Ò@eb| ð™@*vÙ߽ʞ@aÎXŠ'ÞÑ@€[Ó§Yj@­«Æ ÆÁ@oÙr6xÊ@U«ö4†Ó@ûæ¹Ü˜vÀp9¿J4¿@>•gR<³@ƒ±ëª@Ãÿé¬Û\´@­´Hui3±@¼þ zé¿@¢Ö*§Î@œØ”–©@coÄÄíÓ@c)— ­@¨«=äÊüÖ@p´Ûñ€§Ç@<>õ^ß¹@„y˜^Ó¤@žŒAš&¡|ÀVŽýHÛÖƒÀ _¶B8f´@eh·Uõ¼@e$²L7>Ð@Šön5äÌ@å¹oé Ä@OéÃÐSçÑ@$±q¢ª„¾@û—‚ÇgøÖ@•q³ìÒ@:ä Ðu´@Œ}v~þ]Ñ@`sP*D1Ã@dKŸÊº@¨È‰¶½‡@*Ï·»¯@Ƨ¢V<Ëš@=îûÌÑ@L¾Õ 8Ñ@ÒËÒ®Ø;³@ÌÉÔß8v…@ê@Jm¶Ï@?òF @û¦@¡É_Ê@H„÷¼#C‚@Aì²î¥sÐ@€â@‹Ë@ÐßP:¶@aû/e²¼@PA«Ò†ÖÒ@Ô¿Þ{0ˆ@|çaåZ4Á@åAßi‰Å@DBˆvÀ,Çh>›@ó§7Õ@üDÖ¬^w“@=™¢ÄÄÉÍ@»D^‰MÕ@J¯êÉ@ÞïDÕ@Pñ{Z̨@÷‹ånïÔ@yVÈòÑ–Ñ@¯~<»à‡²@.(ôDã¤Õ@ 5Šlå¼@‰/÷ aÔ@â&_Å@žcU½Ve@ ”'$9,¯@3(Y/“·@ £cIÅÆ@ˆ‰'€GÐ@çý߇hÚ¸@îíˆÛÕ@¦Ô°äyý®@‡Õä8 ˆÔ@ÖR%¶¶õÕ@¢LÅn·k@EjÝÉWª@ì|YÄaÒ@8ГFµ@êµö»í¶Í@b¼ÄA-|²@–MèƒP¾@’—Ö€Ì@~•u¶GNÕ@>*äá<@÷gå¹MDÖ@2¨6ÜOÍ@¯é’ì¯@³o#«3Ð@Tö4ÏÉ¥£@ô×PGô“Õ@¾TáXÜ£@$¹”3å‰Àv:TVSÓ@@¥åŠ©Â@íºÈ´Â@ªK_z Ñ@Œœœ¢Œ@;ÊùÖz:Ê@¶žš‘›Ë@Ê¿5Q™@¼½)ùÝã¼@à‹$ªyÀ@hA̹PÐ@ŽŸ£1ÎÖ@2ˆââÏ‚£@ë„Ö{Ñ@5 ¼¦Ï·­@Õ<‹•ËÀ@ЬÔYÔ@¤¯Uña€Ò@˪Ð7Ð@U:p,1’Î@;Qn4ÖÌ·@^´­ß!KÓ@: 쥱†@i÷°•È@¡:ºæÐ)Á@(Ó–žI²Ñ@Þì G^ÑÓ@Ž"|&QÀ$Œ® ÃÄ@µ³XKª@gÃzÆYÁ@<×Ìõޱ@šXâ+^E¶@•’PÖ¹Ö@TsI8OÌ@š& »§7Ñ@›Šàn_C»@ÂîØS$Û‚@8tΡÃ@ã7œŒ1µ@ÿ¬:Œ5Ï@'œ)´yîÅ@$ºéÐP˃@³3­8ÁÒÀ@ÅÍÙ†ãÖrÀv[áÒÙÕ@?ÝàJ«£@:}4h;Õ@.ý7¾ø¸@|ëw5‚Ð@"ÈPÙÈ@ͽŽ5Ò@gXgü"ÍÊ@+Ü[ÃrÏ@»çáZIÁ@Œü½æùÁ@¨qÖ£/Ó@"²¾E΄·@|â  ±@²1½ëéÎ@J;ýËW @g_¾*„ @Æâv—@û3Lë§Ô@Ç1G¡î¤@˜†"Û2ÅÂ@ãŸõAÆ@rïÖ?Ç@ÛÍaô;Ñ@4£AIÈ@ëûyØâ;Ð@5W<.¬uX@<í.8Ï_“@¸WUVó?°@U­ µÏœ¤@x“qÉâ7È@/+¶‰)°Ð@Q¿'LôçÍ@áJû‘¤Ã@"WîmÕº@"9áVƒ`½@»Zoc늳@뜽ÓxÀE›ÎÏÉëº@ªÓ=…ÆÂ@ш›L†—±@Ke톺@‘W,£üo¾@£¹ýeuy²@ÍfjdäÕ@W+É!v@™„òmÎþ@™£öçœ@]sí¥ã´@Ñ~Š™Û~Ð@Å_®H,Ð@GÏôæø†Ì@“'9Ä2!Õ@Kf:†Àõ¶î,Õ|›@¥Àsù³¨@˜«â˜þË@<Ûœwà–@'Ã-6³¸~ÀÒNPʯÉ@D…ù´Ä±@/µü[i½uÀ6jŠ2 É@Èâ„ß…À@Bðv¥ßÓ@7[)«9Í@žqü5µÔ¶@Ô¢[‹ ,Ç@SÆND){°@K27ZÒ¹Ð@á‚Ðôº@݆ç¢2¶@Þ¢7ã¼@ª2ô0"²@J°F­áE´@)jP kwÀ• µ»­%¢@.rÈÃ·Ê «@·`UBß#É@fTî¤Ã@=N€Ý^¯@Oü‹¶ßµ@b_*&ØË@qz@w:Î@ußâMì»@°ž²ŸRÀ@°gïÆ> Á@õ΂R?Ñ@äèÃüÔÑ@h²§nþÀ@Úpiºô»¹@]c.ôr¿Ð@¢äˆBÇ…Ö@¶<ÕüSkË@öh¬uÓ@HhhXÐ@l¯u®z Ã@Ãß¾–±@ZNÍŒ½Ã@Òi=ApÕ@Vc—k mÀV[é––K»@tNÃË@L`ìXÞW¹@H#-ê ×@?$ù{„ô˜@fÄZ‚7Ö@c]‹›…™¶@¼2•ÀŸáÓ@×'‰Ä{Ô@pf¾ÆÄÇ@¶*§‚!ÌÓ@r Ÿþ¯ÇÂ@y×òùÓëº@¥Ž7‰“%Ó@Eìm¾AÀÂ@ùš ýàŸ™@Š£~ðFÔ@â_þ¡‚Õ@¶qd_Ã}Ï@lÞ¾æÝÐ@É®Q?–£@ÅÃÐÔ@œýﲚÖ@ÉÕ\C^IÕ@¸‰ùöŠÓÌ@&.ÙvVÍ@«±0v„Î@ÐQ,TϬÉ@€ôꬿëÔ@^š™sÕÄ@)¡N;ÎÃ@­».‡¨Ï @‰Yw>öÓ@«‹p5èÂ@õÚÂ?B—Ñ@ÿ¼®hŸXÎ@DÐÑÞÌÆ@ñ`êdkÒ@IýÏ…ì¼@òºOº= Ç@e­@´¿Ñ€ ¾@ã wte8Ç@¦±^¶lÀ@¿Â;bø¿Ñ@¨u¯ZÉøË@ó=CZv‚Ì@­ÿv‰L÷Ê@=šö­CÒ@Ò³-Ñ@`KãÓ0@b«$· §@iÇ9ÖªÓ@¤¹j_ôÄ@îL—ùK{Õ@ þç¢]Ï@:s‚4/ÒÈ@Ê`‡H‡«Ã@7 Í)LÅ@å½ÎÊ‚Ï@–ñ‹ÙH¢Ð@¼å—ÐÎ@G MüÕ…À‹ûÉ©T‹Ö@ÕõéÿŸ¢@8šˆë±Ò@s‰µ«#¹Â@?¦¼ö†Ð@¦8U÷Ê@šêÂÒ8aÂ@8}hb3n@RñCäeD¾@øã³¡9aË@mªžg|Ò@£Éjëbp¤@ËnžØrw@ò[G eËÄ@¡Ü‰÷-ƒÐ@«#‡Ixg½@­ÌóSÒ@±JÕCoÂ@ùæ´êÔ@ãžýhÒ@C ÖÞlÇ@ ÒêR-à¾@ãE›sgÙÃ@ @À~ª@pª{RÒ@°'RÛA»@”yB•bË@:±ç0î²Ï@Ñøeƒ@Ô@•…Æ´§ýÌ@‡åõ‰µ@Y‚œ-Ï(¸@­h [fcÂ@МöQnÓ@á”°4êw½@©ßˆ&b̾@\avÉɇÀ½huÝÐȯ@6ÚÍ7PeÒ@*~׈*ÁÌ@$¾§‚éÞˆÀõÉjÅo±@7žä#Â@ˆ.‡å‰QÉ@c’›s`À&—èk¼É@É{›ù’ÙÓ@!W àH5Ð@™=áÒOžÅ@Øñèƒj±@7æs®Œ´@V«[Ž!´É@u.O?ûÏÊ@Î3bÛ»„Õ@Ûô8ýårÈ@ª˺|É@„ȵ ®Ë@1Ç  é¼G@Þ™×Zó/»@E3¥¡&qÓ@zO_€~É@ÆŠnìÔ@ì+ "‹@ó¦>›¯Ì@Ô9ÏZèÆ@”àP»íÑ@âidÐPÆ@ÁE¤tA{Ñ@sóÍð)Å@۲ͣ4¹¾@*b62ì9Ó@p> X Å@‚ÉPÎY_›@EÎ vøÆÐ@ÐÎ+Sʹ€Àìz|}–«@ÖÙ ¶3œ@ˆëÁ@º±Áw$¸@*FHKÙç»@ CÛæÛ[Ñ@]Y–ýL”®@ y¨S×Ð@õ•ÀPr¶@אָ­}©¬@TÃ’ªzêÍ@±·ÊO#§Ð@Á&›ôÀêeÀ0å<%g²@¡@‹'L¹@@ Œæ"É@Ú¨/|Ð@ÕÀ“  ³Ä@Y#­µ¸Ö@$ýNànÒ@.˜{ò׿Š@ä¯Ï°YÊÉ@Ö]\¯mÖ¹@ã ©-,µÏ@s') éµ@þ¡ã.\Ó@·DŒáÐ@m¥¾¬yÂ@Ñ•dˆ±Ä@0ƒ Ûû\Ð@¶âàâñÔ@è·T»@³ ZžÐ@txZþh¯@ö-ƒ?Z·…Àöp^*­´@2—„(uC|@s"H›°@ôQÅQ ¢Ì@…¾€›”ϼ@O•rº7f“@eÙwß’Ò@§’ÖtYèÑ@ð4Ur jÀXvà[ÕÄ@Y@¿Z÷@Á@!1ùeFßÔ@H¬F‰ØÉ@Æ„È@„b1ÍPÒÃ@4¸`R(®@•“]7|³È@äì³CR¡¦@qî‘¥d»@Ng xº½@Jë‚®ÙCÅ@Åk¬5kÖ@V«Œ5¤Õ@ømÜÍÏÀ@$c³9’‚Ó@ÔË©ÂlÖ@Wÿ ©Ô­@Añr‚ñÒ@À[õ ôÆ…ÀAÚ”Ô÷âÊ@þÕáßLÉ@Ô2543´@D³ø{Ë;Õ@pÙqá§Ï@*†§ðÆ@l×måá~@CUÛ$0³@3AãÿSÇ@K|¸‹/¡²@Ùj¤ùbÈÓ@hÍו‘@ÖúÛÙÂ@žU"=Ü>Á@(ÿv—¸ ¶@ÊÑ>`Y¥@‘çŒmÆ@0’V²€‡­@õÇ¡Ÿç7¯@ê4ШD¦@ŒUÑÀ/|Àäm€öÞ#Ó@$…Ę”À@@•c/vïË@lDZÑ[ZÔ@æïá¾Æ@@¹ã:à&@¶gÄs²@!FÔ:èÍ@æîÄ$‚Ý„Àiôt™øÉ@ ŒÔ!ä.Ã@9”Ð@µS 9­¤@ÌÜÚòÀ@«J^0DÐ@n²šsø“@å»ÃD}@w¡³æµ@njCÓ2Ó@GóÙ Ì@Guø³ÉuÄ@ê{#ýÁÙ§@…FDzÔ´@†…ië…D¡@²~šôxÖ@ vM{ Ò@ŒFÓ‡&ºÊ@žŸHg§¢@Ï:â ÿ°Ä@úÃÃ^í¥@q[øJ¼È@I63Ã@héƒvÀ•VshÓÚÕ@yLƒU@¡£zÍý‚«@JÈ4»¥W§@žêöåiÀ€w¬“)ÑÐ@,œÀ ¾Æ@Þ@-!°@tä‡Ü¼ëž@è¿w­\Q@Œ-1å1»@ ø _°Ó@ oKÖìÃÓ@Ýã _²Î@ÒOú(I‚Àƒ*ïC3ËÄ@GV¯PmÒ@¸‡]ü­Ä@;wf½] @%V²z´@::ÓHÀBÁ@}Ú!÷¶È&@Lð)î’‚À?¬T62‚Ñ@ó„HU Ì@ÊÔø€uŸÕ@ŒH=F¯eÏ@VCʪ!ŸÐ@•¢Ãªû ×@Û_ðvÙ¡Æ@š@ر“jÓ@/ñÇÂ4_Ñ@ƒNØ•þÀ@WDjŽó”´@àÄ`˜Dð²@ö«yz™PÄ@˵¨ÜH8Ö@©æ˜‡~ó_@˜aaîZ`Á@ËfÇ69Í@Ƥwµ@§ê'`Î@¹‰7×[Ò@ Éì®K›Ð@¸~Æ¥yAÀZ ¥2<‡°@.Ü5;6º@Á…3/”>Ó@•ïM%nˆÓ@ó/òÎSÇ@˱  ô¹@òM 1¤­Ð@ЏÁyêÊ@:WAˆÔ®ƒ@ ¶çË<Ê@i‘H>»@y½”&¼ŸÍ@£vCà*Ò@Þ¶¸àb·@ ªïáÛ€dÀ¥9*öEPÔ@@w£·@³ïhpWàÔ@3ïqBJ>Ò@ohƒyEÁ@©˜W;·»@Žæ“¸±ðÍ@VDzh86Ó@®7ҖάÑ@§.b*œåª@§e'd—½@¾NV²§Ñ@«Z“ Ç@0à+綘Ñ@¬ŽLÿlQ@I±îr Ô@+Óïî3Á@‹!ò:{kÄ@Ä1ÛöHEÒ@’`ëýÏ@ϺôßÙ «@Øý*ÅŸÔ@J¿-öòÕ@‡ÈIäLÕ@îBgêpTÐ@, Tq?sÑ@\':× Õ@ÊYp¹Ò@BuŠ^^Ê@˜üüJžÊ@oÁ§ùØÐ@ãÚcÒ4Ó@‰eã·-Ë@BQO1€@tc»Fhûª@ZâŸý“!Â@r>OzèÊ@uW™Ä|È@+ÄQ*i“@ØJ(ÊBÉÏ@Þc˪†ÀÆDïÒ@´"lõ°È@$ ÉFÏÕÆ@›‚8ïÔ@s‚s§Õ@”˜†wÓ@C+>Ö[ŠÐ@ÐïD0”´@þÿ€~ñÁ@Ù¡CrëïÈ@±ÐËŒSÁ@{KãÖòÃ@H‡È/p±@âT‹¨®@ Áïº9Å@átÔ@3¶†»@^yÈš«@Ë)¥o¢’¤@hpì_œ;¶@^y {%»@°n ¤r°¶@ß9$±óÇ¿@]c–d|Ó@üüЩŽÅ@4foŽ’Ñ@ÓxÈp°Œµ@—]>h÷Ö@íœÊ±%¸@ÄZ½qÁ@¾(Ö‰÷Î@—”ˆädÔ@¦=êWY$×@¼y6©Á—@_ê0‚A°@ù‡­Y Õ@¡cÕ² Ê@ç-‚qÓ@®fÖ}A;Ç@Mg¨²ë=Ô@ÆÈ]ºRÒ@Oñ“3€@”Ñ3´$¦@'aµ°q¨@D,Ͷ—ÒÀ@J?}÷ÀÔÐ@%·`AѧÐ@Áê[¾@XBŸºàzÐ@¼;/™‡Ô@ •6>0Ð@镦Y'Ñ@@Çâ˾@ÃAĘ0÷Ô@îcœ1øÓ@Z ‹œÔÏ@Î8C÷}À‰ÛÖ H©¤@³ZrvðÓ@¸lo³mc @x'{:ghÏ@©L¾z¥²@OåœTÛÃ@¬£¤[Ù¼@cF-_X@^{èa™Ê@ÐþÜ_‡¯@„—_cÜÌ@¿41åéÖ@à%îàƒZÓ@Ù7ýgmÌ@Î2"1ÏÏ@¦ã¸\¯þÁ@.{OܯË@DáÌu4¸@Ç®•%b#Ð@Aè„€Ó@®¤9ž¥À@ËäF›ãr§@ j¤+È@¡`j Fë¡@ÿ¶Ñ¤^ËÔ@Èȃƪ´@ƒH+3‹V°@ªPíeƒ©Ö@ʪ’^ýæÁ@-Å¢…yÁ@n»\i×Î@9FðTã®”@?~%Ô‰Ô@q#3¤@»¾¿Ë«¥Ä@¥·z¶M¯@ÌpBbE_†ÀSÝz–âº@~!?WžÖ@PLÔòˆI”@§ja.šÔ@x´N[*®@l½gf;Ð@Žõõ!Ë@o#AÑÀ±@¶5Ëà:Ä@úž“Àjj@àc$ #Ô@^ަüeÇ@œ2y/Ç¢@nø Œß¤@\?~†ÛË@IîâÇaÃ@ì²”'zÍ@?…ŠpÚË@ðUæ†}Ò@øÿ R«´·@Ü*`$o§É@Í@¡<,ÅÕ@÷œ0ûÔ ¯@ND±²ë~½@'•5­Ù°Î@8{Ü)¬É@wp=9vÕ@’Ï×ú[mÀá%¸aØÖ@!ãs;´â±@~ 9º_tÐ@ÞÉR¸jÕ@ÑB =\`ª@_x‘cù`Ó@ßX¤¾åÓ@sÆ!ÆŸµ@ÁÒìä‰~Ä@¬`ó5ùÂ@öE«–¶Ä@Ô¶ʇµÕ@HúçV©§@¹eD.ÒÆ¹@"ý?¬ê@…íXÈTÄÕ@lð°–XÂÁ@Åä<}rå§@–É*ì’@@a=‚/—¶@ •šä­º@}ÿ\2ʺÐ@„Ž,€Nýª-ù,×@ºp§È,ŠÀ(ýª-ù,×@ºp§È,ŠÀÂ?ôÁ€N  €@ €8 (€À€x H€ @*€¸ h€ À:€ø ˆ€@J€ 8( ¨€ÀZ€ x0 È€@j€ ¸8 è€Àz€ø@ !@Š€8H (%Àš€xP H)@ª€¸X h-Àº€ø` ˆ1@Ê€8h ¨5ÀÚ€xp È9@ꀸx è=Àú€ø€ ‚A@ !8ˆ (‚EÀ#x H‚I@ *%¸˜ h‚MÀ :'ø  ˆ‚Q@ J)8¨ ¨‚UÀ Z+x° È‚Y@ j-¸¸ è‚]À z/øÀ ƒa@ Š18È (ƒeÀ š3xÐ Hƒi@ ª5¸Ø hƒmÀ º7øà ˆƒq@Ê98è ¨ƒuÀÚ;xð ȃy@ê=¸ø èƒ}Àú?ø! „@ ‚A8!!(„…À‚Cx!"H„‰@*‚E¸!#h„À:‚Gø !$ˆ„‘@J‚I8 (!%¨„•ÀZ‚Kx 0!&È„™@j‚M¸ 8!'è„Àz‚Oø @!(…¡@Š‚Q8 H!)(…¥Àš‚Sx P!*H…©@ª‚U¸ X!+h…­Àº‚Wø `!,ˆ…±@Ê‚Y8 h!-¨…µÀÚ‚[x p!.È…¹@ê‚]¸ x!/è…½Àú‚_ø €!0†Á@ ƒa8 ˆ!1(†ÅÀƒcx !2H†É@*ƒe¸ ˜!3h†ÍÀ:ƒgø  !4ˆ†Ñ@Jƒi8 ¨!5¨†ÕÀZƒkx °!6ȆÙ@jƒm¸ ¸!7è†ÝÀzƒoø À!8‡á@Šƒq8È!9(‡åÀšƒsxÐ!:H‡é@ªƒu¸Ø!;h‡íÀºƒwøà!<ˆ‡ñ@ʃy8è!=¨‡õÀÚƒ{xð!>ȇù@êƒ}¸ø!?è‡ýÀúƒø"@ˆA „8"A(ˆÁ „ƒx"BHˆ A!*„…¸"Chˆ Á!:„‡ø "DˆˆA"J„‰8("E¨ˆÁ"Z„‹x0"FȈA#j„¸8"GèˆÁ#z„ø@"H‰!A$Š„‘8H"I(‰%Á$š„“xP"JH‰)A%ª„•¸X"Kh‰-Á%º„—ø`"Lˆ‰1A&Ê„™8h"M¨‰5Á&Ú„›xp"Nȉ9A'ꄸx"Oè‰=Á'ú„Ÿø€"PŠAA( …¡8ˆ"Q(ŠEÁ(…£x"RHŠIA)*…¥¸˜"ShŠMÁ):…§ø "TˆŠQA*J…©8¨"U¨ŠUÁ*Z…«x°"VÈŠYA+j…­¸¸"WèŠ]Á+z…¯øÀ"X‹aA,Š…±8È"Y(‹eÁ,š…³xÐ"ZH‹iA-ª…µ¸Ø"[h‹mÁ-º…·øà"\ˆ‹qA.Ê…¹8è"]¨‹uÁ.Ú…»xð"^È‹yA/ê…½¸ø"_è‹}Á/ú…¿ø#`ŒA0 †Á8#a(Œ…Á0†Ãx#bHŒ‰A1*†Å¸#chŒÁ1:†Çø #dˆŒ‘A2J†É8(#e¨Œ•Á2Z†Ëx0#fÈŒ™A3j†Í¸8#gèŒÁ3z†Ïø@#h¡A4ІÑ8H#i(¥Á4š†ÓxP#jH©A5ª†Õ¸X#kh­Á5º†×ø`#lˆ±A6ʆÙ8h#m¨µÁ6Ú†Ûxp#nȹA7ê†Ý¸x#oè½Á7ú†ßø€#pŽÁA8 ‡á8ˆ#q(ŽÅÁ8‡ãx#rHŽÉA9*‡å¸˜#shŽÍÁ9:‡çø #tˆŽÑA:J‡é8¨#u¨ŽÕÁ:Z‡ëx°#vÈŽÙA;j‡í¸¸#wèŽÝÁ;z‡ïøÀ#xáA<Їñ8È#y(åÁ<š‡óxÐ#zHéA=ª‡õ¸Ø#{híÁ=º‡÷øà#|ˆñA>ʇù8è#}¨õÁ>Ú‡ûxð#~ÈùA?ê‡ý¸ø#èýÁ?ú‡ÿø$€B@ ˆ9 $(Â@ˆy $‚H BA*ˆ¹ $ƒh ÂA:ˆù $„ˆBBJˆ 9!($…¨ÂBZˆ y!0$†ÈBCjˆ ¹!8$‡èÂCzˆù!@$ˆ‘!BDŠˆ9"H$‰(‘%ÂDšˆy"P$ŠH‘)BEªˆ¹"X$‹h‘-ÂEºˆù"`$Œˆ‘1BFʈ9#h$¨‘5ÂFÚˆy#p$ŽÈ‘9BGꈹ#x$è‘=ÂGúˆù#€$’ABH ‰!9$ˆ$‘(’EÂH‰#y$$’H’IBI*‰%¹$˜$“h’MÂI:‰'ù$ $”ˆ’QBJJ‰)9%¨$•¨’UÂJZ‰+y%°$–È’YBKj‰-¹%¸$—è’]ÂKz‰/ù%À$˜“aBLЉ19&È$™(“eÂLš‰3y&Ð$šH“iBMª‰5¹&Ø$›h“mÂMº‰7ù&à$œˆ“qBNʉ99'è$¨“uÂNÚ‰;y'ð$žÈ“yBOê‰=¹'ø$Ÿè“}ÂOú‰?ù'% ”BP ŠA9(%¡(”…ÂPŠCy(%¢H”‰BQ*ŠE¹(%£h”ÂQ:ŠGù( %¤ˆ”‘BRJŠI9)(%¥¨”•ÂRZŠKy)0%¦È”™BSjŠM¹)8%§è”ÂSzŠOù)@%¨•¡BTŠŠQ9*H%©(•¥ÂTšŠSy*P%ªH•©BUªŠU¹*X%«h•­ÂUºŠWù*`%¬ˆ•±BVÊŠY9+h%­¨•µÂVÚŠ[y+p%®È•¹BWêŠ]¹+x%¯è•½ÂWúŠ_ù+€%°–ÁBX ‹a9,ˆ%±(–ÅÂX‹cy,%²H–ÉBY*‹e¹,˜%³h–ÍÂY:‹gù, %´ˆ–ÑBZJ‹i9-¨%µ¨–ÕÂZZ‹ky-°%¶È–ÙB[j‹m¹-¸%·è–ÝÂ[z‹où-À%¸—áB\Š‹q9.È%¹(—åÂ\š‹sy.Ð%ºH—éB]ª‹u¹.Ø%»h—íÂ]º‹wù.à%¼ˆ—ñB^Ê‹y9/è%½¨—õÂ^Ú‹{y/ð%¾È—ùB_ê‹}¹/ø%¿è—ýÂ_ú‹ù/&À˜C` Œ90&Á(˜Ã`Œƒy0&ÂH˜ Ca*Œ…¹0&Ãh˜ Ãa:Œ‡ù0 &Ĉ˜CbJŒ‰91(&Ũ˜ÃbZŒ‹y10&ÆÈ˜CcjŒ¹18&Çè˜ÃczŒù1@&È™!CdŠŒ‘92H&É(™%ÃdšŒ“y2P&ÊH™)CeªŒ•¹2X&Ëh™-ÃeºŒ—ù2`&̈™1CfÊŒ™93h&ͨ™5ÃfÚŒ›y3p&ÎÈ™9Cgꌹ3x&Ïè™=ÃgúŒŸù3€&КACh ¡94ˆ&Ñ(šEÃh£y4&ÒHšICi*¥¹4˜&ÓhšMÃi:§ù4 &ÔˆšQCjJ©95¨&Õ¨šUÃjZ«y5°&ÖÈšYCkj­¹5¸&×èš]Ãkz¯ù5À&Ø›aClб96È&Ù(›eÃlš³y6Ð&ÚH›iCmªµ¹6Ø&Ûh›mÃmº·ù6à&܈›qCnʹ97è&ݨ›uÃnÚ»y7ð&ÞÈ›yCoê½¹7ø&ßè›}Ãoú¿ù7'àœCp ŽÁ98'á(œ…ÃpŽÃy8'âHœ‰Cq*ŽÅ¹8'ãhœÃq:ŽÇù8 '䈜‘CrJŽÉ99('娜•ÃrZŽËy90'æÈœ™CsjŽÍ¹98'çèœÃszŽÏù9@'è¡CtŠŽÑ9:H'é(¥ÃtšŽÓy:P'êH©CuªŽÕ¹:X'ëh­ÃuºŽ×ù:`'숱CvÊŽÙ9;h'í¨µÃvÚŽÛy;p'îȹCwêŽÝ¹;x'ïè½ÃwúŽßù;€'ðžÁCx á9<ˆ'ñ(žÅÃxãy<'òHžÉCy*å¹<˜'óhžÍÃy:çù< 'ôˆžÑCzJé9=¨'õ¨žÕÃzZëy=°'öÈžÙC{jí¹=¸'÷èžÝÃ{zïù=À'øŸáC|Šñ9>È'ù(ŸåÃ|šóy>Ð'úHŸéC}ªõ¹>Ø'ûhŸíÃ}º÷ù>à'üˆŸñC~Êù9?è'ý¨ŸõÃ~Úûy?ð'þÈŸùCêý¹?ø'ÿèŸýÃúÿù?(  D€ :@() Ä€z@(I  D*º@(i  Ä:ú@ (‰ D‚J :A((© Ä‚Z zA0(É Dƒj ºA8(é ăzúA@( ¡!D„Š:BH( )¡%Ä„šzBP( I¡)D…ªºBX( i¡-Ä…ºúB`( ‰¡1D†Ê:Ch( ©¡5ĆÚzCp(É¡9D‡êºCx(é¡=ćúúC€( ¢ADˆ ‘!:Dˆ()¢EĈ‘#zD(I¢ID‰*‘%ºD˜(i¢Mĉ:‘'úD (‰¢QDŠJ‘):E¨(©¢UÄŠZ‘+zE°(É¢YD‹j‘-ºE¸(é¢]Ä‹z‘/úEÀ( £aDŒŠ‘1:FÈ()£eÄŒš‘3zFÐ(I£iDª‘5ºFØ(i£mĺ‘7úFà(‰£qDŽÊ‘9:Gè(©£uÄŽÚ‘;zGð(É£yDê‘=ºGø(é£}Äú‘?úG) ¤D ’A:H)!)¤…Ä’CzH)"I¤‰D‘*’EºH)#i¤Ä‘:’GúH )$‰¤‘D’J’I:I()%©¤•Ä’Z’KzI0)&ɤ™D“j’MºI8)'é¤Ä“z’OúI@)( ¥¡D”Š’Q:JH)))¥¥Ä”š’SzJP)*I¥©D•ª’UºJX)+i¥­Ä•º’WúJ`),‰¥±D–Ê’Y:Kh)-©¥µÄ–Ú’[zKp).É¥¹D—ê’]ºKx)/饽ėú’_úK€)0 ¦ÁD˜ “a:Lˆ)1)¦ÅĘ“czL)2I¦ÉD™*“eºL˜)3i¦ÍÄ™:“gúL )4‰¦ÑDšJ“i:M¨)5©¦ÕÄšZ“kzM°)6ɦÙD›j“mºM¸)7é¦ÝÄ›z“oúMÀ)8 §áDœŠ“q:NÈ)9)§åÄœš“szNÐ):I§éDª“uºNØ);i§íĺ“wúNà)<‰§ñDžÊ“y:Oè)=©§õÄžÚ“{zOð)>ɧùDŸê“}ºOø)?é§ýÄŸú“úO*@ ¨E  ”:P*A)¨Å ”ƒzP*BI¨ E¡*”…ºP*Ci¨ Å¡:”‡úP *D‰¨E¢J”‰:Q(*E©¨Å¢Z”‹zQ0*FɨE£j”ºQ8*Gé¨Å£z”úQ@*H ©!E¤Š”‘:RH*I)©%Ťš”“zRP*JI©)E¥ª”•ºRX*Ki©-Å¥º”—úR`*L‰©1E¦Ê”™:Sh*M©©5Ŧڔ›zSp*NÉ©9E§ê”ºSx*Oé©=ŧú”ŸúS€*P ªAE¨ •¡:Tˆ*Q)ªEŨ•£zT*RIªIE©*•¥ºT˜*SiªMÅ©:•§úT *T‰ªQEªJ•©:U¨*U©ªUŪZ•«zU°*VɪYE«j•­ºU¸*Wéª]Å«z•¯úUÀ*X «aE¬Š•±:VÈ*Y)«eŬš•³zVÐ*ZI«iE­ª•µºVØ*[i«mÅ­º•·úVà*\‰«qE®Ê•¹:Wè*]©«uŮڕ»zWð*^É«yE¯ê•½ºWø*_é«}ůú•¿úW+` ¬E° –Á:X+a)¬…Ű–ÃzX+bI¬‰E±*–źX+ci¬Å±:–ÇúX +d‰¬‘E²J–É:Y(+e©¬•ŲZ–ËzY0+fɬ™E³j–ͺY8+gé¬Å³z–ÏúY@+h ­¡E´Š–Ñ:ZH+i)­¥Å´š–ÓzZP+jI­©Eµª–ÕºZX+ki­­Åµº–×úZ`+l‰­±E¶Ê–Ù:[h+m©­µÅ¶Ú–Ûz[p+nÉ­¹E·ê–ݺ[x+o魽ŷú–ßú[€+p ®ÁE¸ —á:\ˆ+q)®ÅŸ—ãz\+rI®ÉE¹*—åº\˜+si®ÍŹ:—çú\ +t‰®ÑEºJ—é:]¨+u©®ÕźZ—ëz]°+vÉ®ÙE»j—íº]¸+wé®ÝÅ»z—ïú]À+x ¯áE¼Š—ñ:^È+y)¯åżš—óz^Ð+zI¯éE½ª—õº^Ø+{i¯íŽº—÷ú^à+|‰¯ñE¾Ê—ù:_è+}©¯õžڗûz_ð+~ɯùE¿ê—ýº_ø+é¯ýÅ¿ú—ÿú_,€ °FÀ ˜;`,)°ÆÀ˜{`,‚I° FÁ*˜»`,ƒi° ÆÁ:˜û` ,„‰°FÂJ˜ ;a(,…©°ÆÂZ˜ {a0,†É°FÃj˜ »a8,‡é°ÆÃz˜ûa@,ˆ ±!FÄŠ˜;bH,‰)±%ÆÄš˜{bP,ŠI±)FŪ˜»bX,‹i±-ÆÅº˜ûb`,Œ‰±1FÆÊ˜;ch,©±5ÆÆÚ˜{cp,ŽÉ±9FÇ꘻cx,é±=ÆÇú˜ûc€, ²AFÈ ™!;dˆ,‘)²EÆÈ™#{d,’I²IFÉ*™%»d˜,“i²MÆÉ:™'ûd ,”‰²QFÊJ™);e¨,•©²UÆÊZ™+{e°,–ɲYFËj™-»e¸,—é²]ÆËz™/ûeÀ,˜ ³aFÌŠ™1;fÈ,™)³eÆÌš™3{fÐ,šI³iFͪ™5»fØ,›i³mÆÍº™7ûfà,œ‰³qFÎÊ™9;gè,©³uÆÎÚ™;{gð,žÉ³yFÏê™=»gø,Ÿé³}ÆÏú™?ûg-  ´FÐ šA;h-¡)´…ÆÐšC{h-¢I´‰FÑ*šE»h-£i´ÆÑ:šGûh -¤‰´‘FÒJšI;i(-¥©´•ÆÒZšK{i0-¦É´™FÓjšM»i8-§é´ÆÓzšOûi@-¨ µ¡FÔŠšQ;jH-©)µ¥ÆÔššS{jP-ªIµ©FÕªšU»jX-«iµ­ÆÕºšWûj`-¬‰µ±FÖÊšY;kh-­©µµÆÖÚš[{kp-®Éµ¹F×êš]»kx-¯éµ½Æ×úš_ûk€-° ¶ÁFØ ›a;lˆ-±)¶ÅÆØ›c{l-²I¶ÉFÙ*›e»l˜-³i¶ÍÆÙ:›gûl -´‰¶ÑFÚJ›i;m¨-µ©¶ÕÆÚZ›k{m°-¶É¶ÙFÛj›m»m¸-·é¶ÝÆÛz›oûmÀ-¸ ·áFÜŠ›q;nÈ-¹)·åÆÜš›s{nÐ-ºI·éFݪ›u»nØ-»i·íÆÝº›wûnà-¼‰·ñFÞÊ›y;oè-½©·õÆÞÚ›{{oð-¾É·ùFßê›}»oø-¿é·ýÆßú›ûo.À ¸Gà œ;p.Á)¸Çàœƒ{p.ÂI¸ Gá*œ…»p.Ãi¸ Çá:œ‡ûp .ĉ¸GâJœ‰;q(.Å©¸ÇâZœ‹{q0.ÆÉ¸Gãjœ»q8.Çé¸Çãzœûq@.È ¹!G䊜‘;rH.É)¹%Çäšœ“{rP.ÊI¹)G媜•»rX.Ëi¹-Ç府—ûr`.̉¹1GæÊœ™;sh.Í©¹5ÇæÚœ›{sp.Îɹ9Gçꜻsx.Ïé¹=ÇçúœŸûs€.Ð ºAGè ¡;tˆ.Ñ)ºEÇè£{t.ÒIºIGé*¥»t˜.ÓiºMÇé:§ût .Ô‰ºQGêJ©;u¨.Õ©ºUÇêZ«{u°.ÖɺYGëj­»u¸.×éº]Çëz¯ûuÀ.Ø »aG슱;vÈ.Ù)»eÇìš³{vÐ.ÚI»iGíªµ»vØ.Ûi»mÇíº·ûvà.܉»qGîʹ;wè.Ý©»uÇîÚ»{wð.ÞÉ»yGïê½»wø.ßé»}Çïú¿ûw/à ¼Gð žÁ;x/á)¼…ÇðžÃ{x/âI¼‰Gñ*žÅ»x/ãi¼Çñ:žÇûx /䉼‘GòJžÉ;y(/婼•ÇòZžË{y0/æÉ¼™GójžÍ»y8/çé¼ÇózžÏûy@/è ½¡GôŠžÑ;zH/é)½¥ÇôšžÓ{zP/êI½©GõªžÕ»zX/ëi½­Çõºž×ûz`/쉽±GöÊžÙ;{h/í©½µÇöÚžÛ{{p/îɽ¹G÷êžÝ»{x/ïé½½Ç÷úžßû{€/ð ¾ÁGø Ÿá;|ˆ/ñ)¾ÅÇøŸã{|/òI¾ÉGù*Ÿå»|˜/ói¾ÍÇù:Ÿçû| /ô‰¾ÑGúJŸé;}¨/õ©¾ÕÇúZŸë{}°/öɾÙGûjŸí»}¸/÷é¾ÝÇûzŸïû}À/ø ¿áGüŠŸñ;~È/ù)¿åÇüšŸó{~Ð/úI¿éGýªŸõ»~Ø/ûi¿íÇýºŸ÷û~à/ü‰¿ñGþÊŸù;è/ý©¿õÇþÚŸû{ð/þÉ¿ùGÿêŸý»ø/ÿé¿ýÇÿúŸÿû0 ÀH  <€0*ÀÈ |€0JÀ H+ ¼€0jÀ È; ü€ 0ŠÀHK  <(0ªÀÈ[  |00ÊÀHk  ¼80êÀÈ{ ü@0 Á!H‹ <‚H0 *Á%È› |‚P0 JÁ)H« ¼‚X0 jÁ-È» ü‚`0 ŠÁ1HË <ƒh0 ªÁ5ÈÛ |ƒp0ÊÁ9Hë ¼ƒx0êÁ=Èû üƒ€0 ÂAH ¡!<„ˆ0*ÂEÈ¡#|„0JÂIH +¡%¼„˜0jÂMÈ ;¡'ü„ 0ŠÂQH K¡)<…¨0ªÂUÈ [¡+|…°0ÊÂYH k¡-¼…¸0êÂ]È {¡/ü…À0 ÃaH ‹¡1<†È0*ÃeÈ ›¡3|†Ð0JÃiH «¡5¼†Ø0jÃmÈ »¡7ü†à0ŠÃqHË¡9<‡è0ªÃuÈÛ¡;|‡ð0ÊÃyHë¡=¼‡ø0êÃ}Èû¡?ü‡1 ÄH ¢A<ˆ1!*Ä…È¢C|ˆ1"JĉH+¢E¼ˆ1#jÄÈ;¢Güˆ 1$ŠÄ‘HK¢I<‰(1%ªÄ•È[¢K|‰01&ÊÄ™Hk¢M¼‰81'êÄÈ{¢Oü‰@1( Å¡H‹¢Q<ŠH1)*ťț¢S|ŠP1*JÅ©H«¢U¼ŠX1+jÅ­È»¢WüŠ`1,ŠÅ±HË¢Y<‹h1-ªÅµÈÛ¢[|‹p1.ÊŹHë¢]¼‹x1/êŽÈû¢_ü‹€10 ÆÁH £a<Œˆ11*ÆÅÈ£c|Œ12JÆÉH+£e¼Œ˜13jÆÍÈ;£güŒ 14ŠÆÑHK£i<¨15ªÆÕÈ[£k|°16ÊÆÙHk£m¼s¸17êÆÝÈ{£oüÀ18 ÇáH‹£q<ŽÈ19*ÇåÈ›£s|ŽÐ1:JÇéH«£u¼ŽØ1;jÇíÈ»£wüŽà1<ŠÇñHË£y<è1=ªÇõÈÛ£{|ð1>ÊÇùHë£}¼ø1?êÇýÈû£ü2@ ÈI ¤<2A*ÈÉ ¤ƒ|2BJÈ I!+¤…¼2CjÈ É!;¤‡ü 2DŠÈI"K¤‰<‘(2EªÈÉ"[¤‹|‘02FÊÈI#k¤¼‘82GêÈÉ#{¤ü‘@2H É!I$‹¤‘<’H2I*É%É$›¤“|’P2JJÉ)I%«¤•¼’X2KjÉ-É%»¤—ü’`2LŠÉ1I&ˤ™<“h2MªÉ5É&Û¤›|“p2NÊÉ9I'뤼“x2OêÉ=É'û¤Ÿü“€2P ÊAI( ¥¡<”ˆ2Q*ÊEÉ(¥£|”2RJÊII)+¥¥¼”˜2SjÊMÉ);¥§ü” 2TŠÊQI*K¥©<•¨2UªÊUÉ*[¥«|•°2VÊÊYI+k¥­¼•¸2WêÊ]É+{¥¯ü•À2X ËaI,‹¥±<–È2Y*ËeÉ,›¥³|–Ð2ZJËiI-«¥µ¼–Ø2[jËmÉ-»¥·ü–à2\ŠËqI.Ë¥¹<—è2]ªËuÉ.Û¥»|—ð2^ÊËyI/륽¼—ø2_êË}É/û¥¿ü—3` ÌI0 ¦Á<˜3a*Ì…É0¦Ã|˜3bJ̉I1+¦Å¼˜3cjÌÉ1;¦Çü˜ 3dŠÌ‘I2K¦É<™(3eªÌ•É2[¦Ë|™03fÊÌ™I3k¦Í¼™83gêÌÉ3{¦Ïü™@3h Í¡I4‹¦Ñ<šH3i*Í¥É4›¦Ó|šP3jJÍ©I5«¦Õ¼šX3kjÍ­É5»¦×üš`3lŠÍ±I6˦Ù<›h3mªÍµÉ6Û¦Û|›p3nÊ͹I7ë¦Ý¼›x3oêͽÉ7û¦ßü›&ب 5pxl_col_in_fullres€NªðÀð&ʨ&˜¸ýª-ù,×@ºp§È,ŠÀ(ýª-ù,×@ºp§È,ŠÀ,|5schema  %barcode%L% in_tissue% array_row% array_col %pxl_row_in_fullres %pxl_col_in_fullres€Nl&ðÍ 5barcode€Nª´èÍ&âÍ&6(TTGTTTGTGTAAATTC-1AAACAACGAATAGTTC-1,&öÚ5 in_tissue€Nª ¸ &îÏ&¾Ï(,&ØÏ5 array_row€Nžs°s&êö&¨Ü¢(¢,&¾Ä5 array_col€Nžs´s&Ðë&ŠÑ¢(¢,&°¶ 5pxl_row_in_fullres€NªðÀð&¢¶ &ðÅd “Íð×@|öHúÜQPÀ(d “Íð×@|öHúÜQPÀ,&ب 5pxl_col_in_fullres€NªðÀð&ʨ&˜¸ýª-ù,×@ºp§È,ŠÀ(ýª-ù,×@ºp§È,ŠÀ,䆀N&„¡ ARROW:schema¸/////6ABAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAYAAABEAQAA9AAAALwAAACEAAAAQAAAAAQAAADk/v//AAABAxAAAAAkAAAABAAAAAAAAAASAAAAcHhsX2NvbF9pbl9mdWxscmVzAADG////AAACABz///8AAAEDEAAAACwAAAAEAAAAAAAAABIAAABweGxfcm93X2luX2Z1bGxyZXMAAAAABgAIAAYABgAAAAAAAgBc////AAABAhAAAAAcAAAABAAAAAAAAAAJAAAAYXJyYXlfY29sAAAAmP///wAAAAEgAAAAkP///wAAAQIQAAAAHAAAAAQAAAAAAAAACQAAAGFycmF5X3JvdwAAAMz///8AAAABIAAAAMT///8AAAECEAAAACQAAAAEAAAAAAAAAAkAAABpbl90aXNzdWUAAAAIAAwACAAHAAgAAAAAAAABIAAAABAAFAAIAAYABwAMAAAAEAAQAAAAAAABBRAAAAAcAAAABAAAAAAAAAAHAAAAYmFyY29kZQAEAAQABAAAAA== parquet-cpp-arrow version 15.0.2l{PAR1Seurat/tests/testdata/visium_hd/binned_outputs/square_008um/spatial/tissue_hires_image.png0000755000176200001440000037640014731050553032005 0ustar liggesusers‰PNG  IHDRpÇsµ§ IDATxœìÁ€þ¯î €Ùƒ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU&ìùM IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUµ³ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUª3< IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU/rôß IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÙ!$I IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÇbã— IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU*zUT IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ›#h IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU7)~ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUðjÙ• IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUèùÚ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUµ[#£ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUå\Gm IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU…=8òmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS“ˆ÷ IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUöà@ÈÿµTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUƒµžîIDATUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¥=8$ôÿµ#¬°-­ÍC”IEND®B`‚Seurat/tests/testdata/visium_hd/binned_outputs/square_008um/filtered_feature_bc_matrix.h50000644000176200001440000070561314731050553031570 0ustar liggesusers‰HDF  ÿÿÿÿÿÿÿÿ‹‹ÿÿÿÿÿÿÿÿ`ˆ¨ˆ¨TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàHEAPXÈmatrixHHhTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ80HEAPXHˆbarcodesdataindicesindptrshapefeaturesSNOD Hh‡ ÿÿÿÿÿÿÿÿ deflate€ %z‚]PSNOD(°8°6Ø6ø8 ð(0$0p-TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPæwj6ë † GCOLATAACGCCGGAGGGTC-1ATAACGGAGTCCAACG-1ATAACGTTACCTCCAC-1ATAAGGTGGAGAACAT-1ATAAGTAGGATTCAGA-1ATAAGTAGGGCGACTC-1ATAAGTTACCGCGACG-1ATAATAGCTGTTGAAT-1 ATAATCTTGGAGAACC-1 ATAATTAGCTAAGTAG-1 ATACAGGCCCTCCAAT-1 ATACCACGGGCAACTT-1 ATACCGTCATCCATAA-1ATACCTAACCAAGAAA-1ATACGCCGGCGAAACC-1ATACGGAACGTCGTTT-1ATACGGGTTTCGATTG-1ATACGTACTTAGCCAC-1ATACGTCCACTCCTGT-1ATACGTTATGCACGGA-1ATACTACCCGTACCAC-1ATACTAGCATGACCCT-1ATACTGCCTTACACCG-1ATAGACAACGGGACCT-1ATAGACGAAGAGAAAG-1ATAGAGTACTGGGACA-1ATAGAGTTATCAACTT-1ATAGCAACTAGGGAAG-1ATAGCCATAACAGTCA-1ATAGGCGGCTATAGAA-1ATAGGCTAGCTTCGCA-1 ATAGGGATATCCTTGA-1!ATAGGTTGGGCAGATG-1"ATAGTGAAGCGTTCTC-1#ATAGTTCCACCCACTC-1$ATATAAAGCGCTCGTG-1%ATATAAATGTAGCTGC-1&ATATAACACGGGCGCA-1'ATATACATGTATGGTA-1(ATATACGCTCGTGACG-1)ATATAGAGTATTGGTC-1*ATATCAACCTACAGAG-1+ATATCAATTCCAGCCT-1,ATATCGGTAGGGAGAT-1-ATATCGTTCCTCGAAC-1.ATATCTCCCTCGTTAA-1/ATATCTTAGGGCCTTC-10ATATGTCTCCCTAGCC-11ATATTCAGTTAAACCT-12ATATTCCACATAGTGA-13ATATTTAACCCTCAAG-14ATCAAACACTGTTCCA-15ATCAAACGAAGGTTTG-16ATCAATCTGGGCTGCA-17ATCAATGCCGTGGCTG-18ATCACATTAGAATATC-19ATCACGTGCTAATTAA-1:ATCACTTCATCCTCGC-1;ATCAGACGGCACGCCG-1<ATCAGCCTCATGCTGC-1=ATCAGCTCGTCCACTA-1>ATCAGTAGGCAGGGAT-1?ATCATAGCCCTATGTA-1@ATCATCCAATATTTGT-1AATCATTGTACCGCATT-1BATCCAACGCAGTCATA-1CATCCAATGGAGGGTCC-1DATCCACATCGACAGAA-1EATCCAGAGCAACAACC-1FATCCAGGATTCGTGAA-1GATCCCATCCACAGCGC-1HATCCTACCTAAGCTCT-1IATCCTGAATCGCTGCG-1JATCCTGCGTGGAATGG-1KATCGACCCAATACAGA-1LATCGACTCTTTCCGTT-1MATCGCACGCCGGGAGA-1NATCGCCAGTCAACATT-1OATCGCTGCGTGCAGCA-1PATCGGAGACAGACGGC-1QATCGGCAAGCAGTCCA-1RATCGTTAGCTAGCGGA-1SATCTAATATCCTACGG-1TATCTACCATCTGCTCC-1UATCTAGCTTGTGAGGG-1VATCTCCCACGGAATAT-1WATCTCCCTGCAATCTA-1XATCTGCACCTCTGCGA-1YATCTGCTGTTATCGCC-1ZATCTGGGCTGTTCTTG-1[ATCTGGTTAAGACTGT-1\ATCTTATCGCACACCC-1]ATCTTGACCTGCAACG-1^ATCTTGACTTGTCCAA-1_ATGAAGCCAAGGAGCC-1`ATGACGCGTTCTATCC-1aATGACTATGCGACATT-1bATGAGGAGTGTTAATC-1cATGATGCAATGGTACA-1dATGCACGCGCTGTTCA-1eATGCACTACCGCATTG-1fATGCATGATCCAGGAT-1gATGCCAATCGCTCTGC-1hATGCCATTTGCGACCA-1iATGCCGGTCTTGCATA-1jATGCCGGTTGATGGGA-1kATGCGACAATTGGTCC-1lATGCGACAGTCCCATT-1mATGCGAGTCCCACCAC-1nATGCTCTGGCGCGGTA-1oATGCTTAGGAGTTGAT-1pATGGAAATTTAAGGAG-1qATGGAGCAGGCCGTGA-1rATGGATCCGGCGTCCG-1sATGGATTGACCAAACG-1tATGGCAGCATTACGAT-1uATGGGCCTCGGCCTCT-1vATGGTCGCGTGGTTTC-1wATGTAAGGCTGCTCTT-1xATGTACATGCGGTGAG-1yATGTACGATGACGTCG-1zATGTAGCGCGCGTAGG-1{ATGTGAAAGCCTAATG-1|ATGTGCATCCGACGCA-1}ATGTGGACATCTTGAT-1~ATGTTGATTAGAGACT-1ATTAAACATGCGGACC-1€ATTAATACTACGCGGG-1ATTAATGAACCAGTCG-1‚ATTACATGTCAGTCTT-1ƒATTACGCGCTGGCAGG-1„ATTACTTACTGGGCAT-1…ATTAGATTCCTCAGCA-1†ATTAGGCGATGCTTTC-1‡ATTATACTTTGCTCGT-1ˆATTATAGCTACTTTAC-1‰ATTATGCCATAGGGAG-1ŠATTATTATGTCCGTCA-1‹ATTATTCAGAGTCACT-1ŒATTCAACCATTTAAGG-1ATTCACTGATGTTGGA-1ŽATTCAGGACCTATTTC-1ATTCATATACTGTCCA-1ATTCATCGTTGAGGCA-1‘ATTCCCGAAGGTACAG-1’ATTCCTAAGACGTGGA-1“ATTCGACGCCGGGCCT-1”ATTCGCGCCTTGAGAG-1•ATTCGTGCTATCTCTT-1–ATTGAAGATCTTAGTG-1—ATTGACCGGCGATGAC-1˜ATTGATCACCACATTT-1™ATTGATGAGTCCTAAC-1šATTGCCTTTATGTTTG-1›ATTGCGATCAGTAACT-1œATTGCTGCTCCTCCAT-1ATTGGATTACAGCGTA-1žATTGGTTGTGCATTAC-1ŸATTGTACAACTCGGCT-1 ATTGTCGCAATACCTT-1¡ATTGTGACTTCGCTGC-1¢ATTTACAGTTTACTGG-1£ATTTACTAAGTCCATT-1¤ATTTCCGGGTTCTGCG-1¥ATTTGCGCGAGTAGCT-1¦ATTTGGAGATTGCGGT-1§ATTTGTCTTGGGAGCT-1¨ATTTGTTCCAGGGCTC-1©CAAACCCTCCGGCGGG-1ªCAAACGAGTATCGCAG-1«CAAACGGTCGCACTTT-1¬CAAACTCGCGACGCCG-1­CAAAGATTATTGGGCC-1®CAAATCTCTCACAAGG-1¯CAAATGTCCTTCCGTG-1°CAACCTACCGAGCAGT-1±CAACGACCCGTTTACA-1²CAACGTGGTGGAGTCT-1³CAACTATATCGAATGC-1´CAACTGCTCATCCGAT-1µCAAGAGGGCGGAGTAC-1¶CAAGATATTATAACGT-1·CAAGCAACGTCGGAGT-1¸CAAGCACCAAATGCCT-1¹CAAGCGGCACATAATT-1ºCAAGGATCGCATGTTC-1»CAAGGCCAGTGGTGCA-1¼CAAGGTCCTATAGGCT-1½CAAGTGTGGTTGCAAA-1¾CAATAAACCTTGGCCC-1¿CAATACGCTCTGAGGC-1ÀCAATATTCTTGACCTA-1ÁCAATCCCTATACCAGC-1ÂCAATGCGAGAAGTATC-1ÃCAATGGATCTCTACCA-1ÄCAATGTGCCAACCCTT-1ÅCAATTAAGGGTGATGA-1ÆCAATTGGGCCGCACTC-1ÇCAATTTCGTATAAGGG-1ÈCACAAGAAAGATATTA-1ÉCACAATGAGCTGCTAT-1ÊCACACACGCTAACGAG-1ËCACACGCGCTGTCTTA-1ÌCACAGCACCCACGGCA-1ÍCACAGCTAGGGAGTGA-1ÎCACAGGGCCATATAGT-1ÏCACAGGGCCGTTGTCA-1ÐCACAGTCCCGCTTCGC-1ÑCACAGTTCGCTTCCCA-1ÒCACATATTAGCAGGAT-1ÓCACATCTCACCGACGA-1ÔCACATGATTCAGCAAC-1ÕCACATTCTTTCGATGG-1ÖCACATTTCTTGTCAGA-1×CACCAATCATCCGTCT-1ØCACCACGCCACACAGA-1ÙCACCAGTCAGCATGCA-1ÚCACCATGATCGCAAAG-1ÛCACCCAAATCTTATGT-1ÜCACCCACGAGGCAATT-1ÝCACCCGGTTTGTGACT-1ÞCACCCTAACAAGATCT-1ßCACCCTTGGTGAGACC-1àCACCGCCAGAAGGTTT-1áCACCGCGTCCACTCTA-1âCACCGGGCATCACAAG-1ãCACCGTATCCCATCCG-1äCACCGTTAGGGATCAC-1åCACCGTTGCGCGATAT-1æCACCTAATCAGTTTAC-1çCACCTCGATGGTGGAC-1èCACCTTGCGAAACTCG-1éCACCTTGGCGCCTTTG-1êCACGAAAGTTAGTCCC-1ëCACGCACAGCGCAGCT-1ìCACGCAGCGAGGCTTT-1íCACGCGGAACTGTTGC-1îCACGGCGCGCCAAAGG-1ïCACGTCGGCAACCTCT-1ðCACGTTCGTGCTCTAG-1ñCACGTTTCGTACACAC-1òCACTAAAGTTGCCTAT-1óCACTACGGGAGCTGCC-1ôCACTCAAGAGCTATGG-1õCACTCCTATGTAAGAT-1öCACTCCTCTCGGTCGG-1÷CACTCGAGCTGAACAA-1øCACTCTTCTGCTAGCC-1ùCACTGACGATTGTGGA-1úCACTTAATCAGACGGA-1ûCAGAACTTAGCCCTCT-1üCAGAATAACACACGGA-1ýCAGACACCGATCGCTG-1þCAGACCTGTAAGTGTT-1ÿCAGACGAACCTGATAC-1CAGAGACGGTCACCCA-1CAGAGCATGAGCTTGC-1CAGAGGCGATGCATGA-1CAGATAATGGGCGGGT-1CAGATACTAACATAGT-1CAGATCATTTAAAGTC-1CAGATCCTGGTTTGAA-1CAGATGTTTGTCCCAA-1CAGCAGCCCGTTCCTT-1 CAGCAGTCCAGACTAT-1 CAGCAGTCTGTGCTGC-1 CAGCCTCCTGCAGAGG-1 CAGCCTCTCCTCAAGA-1 CAGCGATTCCCTTCAA-1CAGCTCACTGAGACAT-1CAGCTCGACAAGTTAA-1CAGCTGGCGTAACCGT-1CAGCTTAGTAGGTAGC-1CAGGATATATCGTTGT-1CAGGCAGTCTTACCAG-1CAGGCCGTTTGGGTGT-1CAGGCGCACGGTGGTC-1CAGGCGCCATGCTAGG-1CAGTAACTATTTATTG-1CAGTAAGGGACGTCTC-1CAGTACATTCTCTAAA-1CAGTACCAGTTTACGT-1CAGTAGCCCACGCGGT-1CAGTCGAGGATGCAAT-1CAGTCGGCCTAGATAT-1CAGTCTGTATACTGGG-1CAGTGAATAAATGACT-1 CAGTGTCGGCTGGCCC-1!CAGTTCAAATTGACAC-1"CATAACGGACAGTCGT-1#CATAAGAAGCTTGGCT-1$CATAAGCTCTCCGTCT-1%CATACACAAAGTCAGC-1&CATACACGGTTCCCAC-1'CATACCCGTACCCAGT-1(CATACGGCGTCTGGGC-1)CATACTATGTAATTGT-1*CATACTTAGGCAATAC-1+CATAGAGGAGATACTA-1,CATAGCGTTGCCCACC-1-CATAGTACATTGAGAG-1.CATAGTCAAATACATA-1/CATAGTCCACAAGAAC-10CATATACTACTGATAA-11CATATAGGTACAGTCA-12CATATGTCAGGCTACG-13CATCATTACCCTGAGG-14CATCCTCTCAAAGATC-15CATCGGACGGGTTAAT-16CATCTATCCCGTGTCT-17CATCTTACACCACCTC-18CATGACTTCGCTGAAT-19CATGAGATGCACTCTC-1:CATGATGCACAATTCT-1;CATGATGGAAGTTAGC-1<CATGCCAACTCGCAAA-1=CATGCGACCAGTTTAA-1>CATGGATTGTCTTCCG-1?CATGGGTATGCCTTAT-1@CATGGGTCGGGTGTGG-1ACATGGTAAGTAGCGTT-1BCATGGTATTAGTTTGT-1CCATGGTCTAGATACCG-1DCATGGTTTATTAATCA-1ECATGTAAGAGACATTT-1FCATGTAGGAGCGCCAA-1GCATGTCTCATTTATGG-1HCATTACGCAGGAAGGG-1ICATTACGTCGGCCCGT-1JCATTATGCTTGTTGTG-1KCATTGCGGGTCAATTC-1LCATTTAGCGGACCATG-1MCATTTGAGTGGTACGT-1NCCAAACAGAACCCTCG-1OCCAAATAACAAGATTC-1PCCAACGATGCACTGAT-1QCCAAGAAAGTGGGCGA-1RCCAAGACTTCTGCGAA-1SCCAAGCGTAACTCGTA-1TCCAAGGTTGCCCTTTC-1UCCAATAGTGCCGTCGA-1VCCAATCGGTAGATCGA-1WCCAATGTCACAGCAAG-1XCCAATTACGGGTCGAG-1YCCACAATGTACGTCTT-1ZCCACACTGAGATATTA-1[CCACAGTACCCATCCT-1\CCACATGGCTCTTTAT-1]CCACCAACTTTACTGT-1^CCACCCAAGGAAAGTG-1_CCACGAATTTAACCTC-1`CCACGAGAAGAGAATC-1aCCACGGAGCCATAAGA-1bCCACGGTGCCCGGTAG-1cCCACTCAGATCCGCAA-1dCCACTGGTGGCTGGTT-1eCCACTGTTTGGATTAA-1fCCAGAAAGCAACTCAT-1gCCAGATAGTTGAGTGA-1hCCAGCCTGGACCAATA-1iCCAGCTCGAACGCATT-1jCCAGCTGATGGTACTT-1kCCAGGGACGTGGCCTC-1lCCAGTAGTCTGATCCA-1mCCAGTCAAATCTCTTA-1nCCAGTCTAGACGGCGC-1oCCAGTCTTGTCATAGA-1pCCAGTTCGGTAACTCA-1qCCATAACCTGTGCAGT-1rCCATACCTTTACTTGT-1sCCATAGAGGCTGCCAG-1tCCATAGGTTGGCGTGG-1uCCATATGGAAACTATA-1vCCATCGCAGTTAAACT-1wCCATCTCACCAGTGAA-1xCCATGCCCTAGATTTC-1yCCATGCCTGTTTAGTA-1zCCATTAGCGATAATCC-1{CCATTCCCTGCCCACA-1|CCATTTCTACCTATTA-1}CCCAAACATGCTGCTC-1~CCCAACATACGTCGCG-1CCCAAGTCATTACACT-1€CCCAATTTCACAACTT-1CCCACTCCACGGTATC-1‚CCCAGAGGAGGGCGTA-1ƒCCCAGGTCTGAAGGCT-1„CCCAGTAAACTTGGGA-1…CCCAGTTAAGGCGCCG-1†CCCGAAGTTTCGCGAA-1‡CCCGACCATAGTCCGC-1ˆCCCGAGTTTCTCCGTA-1‰CCCGCAGCGCGAACTA-1ŠCCCGGGTCGTTCAGGG-1‹CCCGGTGTATCGGAAT-1ŒCCCGTAAGTCTAGGCC-1CCCGTAGCTGGGAAGA-1ŽCCCGTCAGCGTCTGAC-1CCCGTGAGGGCGGTGA-1CCCGTTTCGCAGATGT-1‘CCCTACTTGAACAATG-1’CCCTAGGCAACAAGAG-1“CCCTATGTAGAGCAGA-1”CCCTCCTCGCTCGTAT-1•CCCTGAAATGAGTTGA-1–CCCTGCCCAATCCGCT-1—CCCTGCGCTACGCATA-1˜CCCTGGCTGTTCCTTC-1™CCCTTTAATGGAGTTC-1šCCCTTTGACAGGTCTT-1›CCGAACACTGGGCCTC-1œCCGAACCTTCCCGGCC-1CCGAAGCATTGACCAA-1žCCGACAATAGGCCGCC-1ŸCCGACGGGCATGAGGT-1 CCGACGTAAACACAAC-1¡CCGAGAAGTCGCATAA-1¢CCGAGCTGTGCTTGTC-1£CCGATCTCAACCTTAT-1¤CCGATTCGAGGGACCC-1¥CCGCACAAAGACCAAC-1¦CCGCACTTGCAATGAC-1§CCGCATGTGGTACGAT-1¨CCGCCGGAACTTCTCG-1©CCGCCTGCGAATTGGT-1ªCCGCCTTGCGATGTCG-1«CCGCGATTTGGTAGGT-1¬CCGCGCAAGATACCCA-1­CCGCGGAATGCGTCAC-1®CCGCGGGTACGAAGAA-1¯CCGCTATCAGCACCAG-1°CCGCTCCAGGGCGATC-1±CCGCTCTTCCGAACTA-1²CCGCTTACCTCACTCT-1³CCGCTTGCTGACATGG-1´CCGGAGCGTACTTTCT-1µCCGGCACGACCGTTTC-1¶CCGGCCGCGAGCATAT-1·CCGGCGTGAGACTCTG-1¸CCGGGCGGTCTCGTCA-1¹CCGGGCTGCTCCATAC-1ºCCGGGTTCGAGGTTAC-1»CCGGTAATGGCTAGTC-1¼CCGGTTTGTAATTGTG-1½CCGTAAGTTGGTCCCA-1¾CCGTAGGAAATCCCTG-1¿CCGTAGGGTTGTTTAC-1ÀCCGTATCTCGTCGTAG-1ÁCCGTATTAGCGCAGTT-1ÂCCGTGGAACGATCCAA-1ÃCCGTGTTAAATTCCAT-1ÄCCGTTACGTTAGAACA-1ÅCCGTTCCGAATCTCGG-1ÆCCTAAAGGCTGACGCT-1ÇCCTAAATTAACGGTTC-1ÈCCTAAATTGTATCCTA-1ÉCCTAACCCAAACAAGT-1ÊCCTAACTAAGGCTCTA-1ËCCTACATTCACAGACG-1ÌCCTACTGCTTACACTT-1ÍCCTAGGCGTAGCGATC-1ÎCCTAGGTAAAGGTAGC-1ÏCCTATAATGAGTGCCC-1ÐCCTATACCGTCCTGTC-1ÑCCTATATCGTGTCACG-1ÒCCTATATTTGTCCTGG-1ÓCCTATCTATATCGGAA-1ÔCCTATGAAGTGGTGCC-1ÕCCTATGGCTCCTAGTG-1ÖCCTATGGGTTACCGTC-1×CCTATGGTCAAAGCTG-1ØCCTATGTCCACTCCAC-1ÙCCTCAACGATCGCTGT-1ÚCCTCACCTGAGGGAGC-1ÛCCTCACCTTAGCATCG-1ÜCCTCCGACAATTCAAG-1ÝCCTCCTGAGCCCACAT-1ÞCCTCCTGTTGTGTCGT-1ßCCTCGCCAGCAAATTA-1àCCTCGCGCGATATAGG-1áCCTCGCGCTGTGCGAT-1âCCTCGGACCGGGATAG-1ãCCTCTAATCTGCCAAG-1äCCTCTATCGATTAGCA-1åCCTCTCTCCCATCTAG-1æCCTCTGGCCTAGACGG-1çCCTCTGTACTATTCTA-1èCCTGAACGATATATTC-1éCCTGAATATTTACATA-1êCCTGACCACCGATGGT-1ëCCTGCTATTTGAGAAG-1ìCCTGGAAACGTTCTGC-1íCCTGGCTAGACCCGCC-1îCCTGGTCGAATGTGGG-1ïCCTGTAAGACATGATA-1ðCCTGTACTCACGCCCA-1ñCCTGTCACCCGGGCTC-1òCCTGTCCCTCACGTTA-1óCCTGTCGCCCGTAAAT-1ôCCTGTTTGAAGACACG-1õCCTTCAGTTAAAGTGA-1öCCTTCGTATAGAATCC-1÷CCTTCTCAGCGTTCCT-1øCCTTCTTGATCCAGTG-1ùCCTTGACCACTTTATT-1úCCTTTAAGGGAGCACT-1ûCCTTTCAATGAAGAAA-1üCCTTTGAATTATGGCT-1ýCGAAACGCAATTCATG-1þCGAACAGTATGGGCGT-1ÿCGAACCCGCATGCGTC-1CGAACGGCCGGACAAC-1ACGATCATACATAGAG-1ACGATCATCTTGTAAA-1ACGATGCATATGTTAT-1ACGCAAACTAATAGAT-1ACGCAATCACTACAGC-1ACGCATACGTTTACTA-1ACGCATTCGTGAGTAC-1ACGCCAGATGATTTCT-1 ACGCCAGTGCGTTTGC-1 ACGCCGCTAGACGACC-1 ACGCGAAGTCAGACGA-1 ACGCGCTACACAGGGT-1 ACGCGGGCCAAGGACA-1ACGCTAGTGATACACT-1ACGCTGTGAGGCGTAG-1ACGGAACACGAGTGCC-1ACGGACTCTCAAAGCG-1ACGGAGCGCAAATTAC-1ACGGATGGTGCGGATA-1ACGGCACTTGCTTGGG-1ACGGCCAACATGGACT-1ACGGCGACGATGGGAA-1ACGGCTGGATGTAGAA-1ACGGGAGTGTCGGCCC-1ACGGTACAGTTCAATG-1ACGTAGATTGCTGATG-1ACGTAGGAGAGTCGCT-1ACGTATTACTCCGATC-1ACGTCTCGTTCCGGGA-1ACGTGACAAAGTAAGT-1ACGTGCGCCTCGTGCA-1 ACGTTAATGTCGAAGA-1!ACGTTAGATTTGCCCG-1"ACGTTCGCAATCAATT-1#ACGTTCGTTCAGGAAA-1$ACGTTCTGTACAAGTC-1%ACTACATCCCGACAAG-1&ACTACCAGCTCTCTGG-1'ACTACGCGTTAGAATT-1(ACTAGTTGCGATCGTC-1)ACTATATGCTGTGTTC-1*ACTATCCAGGGCATGG-1+ACTATCTGCCCGCGTA-1,ACTATTTCCGGGCCCA-1-ACTCAAGTGCAAGGCT-1.ACTCAATAAAGGCACG-1/ACTCCCATTCCTAAAG-10ACTCCCGAATTCGTTT-11ACTCCCTAATGCTAAA-12ACTCCCTAGAATAGTA-13ACTCCGGCCGACCACT-14ACTCGCCGTTCGATAA-15ACTCGTAACCCGTCCT-16ACTCGTCAGTAATCCC-17ACTCTCTGACTTAGGT-18ACTCTGACCTAATAGA-19ACTCTTGTATAGTAAC-1:ACTGAAACGCCGTTAG-1;ACTGAATGGCGAAAGT-1<ACTGCCGTCGTAACTC-1=ACTGCTCGGAAGGATG-1>ACTGTACGATACACAT-1?ACTGTAGCACTTTGGA-1@ACTGTCCAGGATTATA-1AACTGTCTTCTTTAGAA-1BACTTACGCATCCACGC-1CACTTATACTTACCCGG-1DACTTATTAGGATCGGT-1EACTTATTTATGTGCCA-1FACTTCAGGCTGATCCC-1GACTTCCAGTGGAAGCT-1HACTTCCATGCGGGACA-1IACTTCGCCATACGCAC-1JACTTGACTCCCTCTTT-1KACTTGGGACCCGGTGG-1LACTTGTAGTCCCTTCA-1MACTTGTGGATGGAACG-1NACTTTACCCTCATGAA-1OACTTTCCTATAGCTTC-1PACTTTGACTGCATCCT-1QACTTTGGTCGTGCTCC-1RAGAACCCTCAATTGGG-1SAGAACGTGGTACATTC-1TAGAAGAGCGCCGTTCC-1UAGAAGGTACACTTCAC-1VAGAAGGTTGCCGAATT-1WAGAAGGTTGTAGGTCG-1XAGAAGTGATTCGTGAT-1YAGAATGCGGGTTCGGA-1ZAGAATTATGGATTCGA-1[AGACCAAACCACACCT-1\AGACCCACCGCTGATC-1]AGACCCGCCCTCCTCG-1^AGACCGCTCCGCGGTT-1_AGACCGGGAAACCCTG-1`AGACGAAGTGCCGGTC-1aAGACGACGATGCCGCT-1bAGACTAGCCTTCCAGA-1cAGAGAACCGTCTAGGA-1dAGAGAAGGAGTACAAT-1eAGAGATCTCTAAAGCG-1fAGAGCCGCCGAGATTT-1gAGAGGCTTCGGAAACC-1hAGAGTAAACTTCACTA-1iAGATAACTTCAGGGCC-1jAGATACCAATAGAACC-1kAGATACCGGTGTTCAC-1lAGATACTCAAGATCGA-1mAGATATAATACGACTA-1nAGATCGTGCATAAGAT-1oAGATCTCAGGTGTGAT-1pAGATGACTCGCCCACG-1qAGATGAGGGTTGCGAT-1rAGATGATGGAGTCTGG-1sAGATGCAAGACGTGCA-1tAGATGCATCCTGTGTC-1uAGATTATAGGACGTTT-1vAGATTCACAACCGATA-1wAGCAAAGGCCGCTAGT-1xAGCAACATATCTTATT-1yAGCAACCGAAAGTAAT-1zAGCACCAGTACTCACG-1{AGCACTACCTCACCAG-1|AGCACTTAAGGACGCC-1}AGCAGAAGGAGAAAGA-1~AGCAGCCAGATGAATA-1AGCATATCAATATGCT-1€AGCATCATTTCGAAAG-1AGCATCGTCGATAATT-1‚AGCATTACGAGGCAAG-1ƒAGCCAAGCTTTGTGTC-1„AGCCACAGGTTACCCG-1…AGCCACTCCCGTGCTT-1†AGCCCATACATGTAAG-1‡AGCCCGCACTACAATG-1ˆAGCCCGGTAGCCTGTA-1‰AGCCCTTCTAATCCGA-1ŠAGCCGTGGCTAAATGT-1‹AGCCTAATACCCACGT-1ŒAGCGACAGGAACGGTC-1AGCGACCAACGATATT-1ŽAGCGATGCGCCTAATA-1AGCGCATAATGAATCG-1AGCGCGGGTGCCAATG-1‘AGCGGACACTTCGTAG-1’AGCGGCGGTTAGCGGT-1“AGCGGGTCTGACACTC-1”AGCGTGGTATTCTACT-1•AGCTAAGTACGCAGGC-1–AGCTAGAAGCAGAAGT-1—AGCTATTTAATCCAAC-1˜AGCTCCATATATGTTC-1™AGCTCCTTCGCACATC-1šAGCTCTAGACGTTCCA-1›AGCTCTTCCCAGTGCA-1œAGCTCTTCGTAACCTT-1AGCTCTTTACTCAGTT-1žAGCTGAAGTAAACCAA-1ŸAGCTGTAACCTCAATC-1 AGCTTCTTCTCGAGCA-1¡AGCTTGATCTTAACTT-1¢AGGAAGCTGTCCGCCG-1£AGGACAGTCGAATCCC-1¤AGGACGACCCATTAGA-1¥AGGACGCTCGATGTTG-1¦AGGAGGCCTTCGCGCG-1§AGGATAAAGTCGGGAT-1¨AGGATATAGGGATTTA-1©AGGATATCCGACTGCA-1ªAGGATCACGCGATCTG-1«AGGCAGATGCGTAAAC-1¬AGGCAGGGAGCGTACT-1­AGGCATTGTCGTAGGG-1®AGGCCACCCGTTATGA-1¯AGGCCCTAGAACGCCA-1°AGGCCTGAGAATCTCG-1±AGGCGGTTTGTCCCGC-1²AGGCGTCTATGGACGG-1³AGGCTTCCCGAAGAAG-1´AGGGAAACGAGGTACT-1µAGGGACCGGCTGCGTT-1¶AGGGACTCTACGCGAC-1·AGGGAGACATACTTCG-1¸AGGGCGAGCAGCTGAT-1¹AGGGCTGCAGTTACAG-1ºAGGGTCAGTAACCCTA-1»AGGGTCGATGCGAACT-1¼AGGGTGCTCTCGAGGG-1½AGGGTTCCCTTTGGTT-1¾AGGGTTTAGTTCGGGA-1¿AGGTAGGTACAAAGCT-1ÀAGGTATAATTGATAGT-1ÁAGGTCAGGTGAGAGTG-1ÂAGGTCGCGGAGTTACT-1ÃAGGTGCACGTCCACAT-1ÄAGGTGGTGACCTTCGC-1ÅAGGTTACACCATGCCG-1ÆAGGTTGAGGCACGCTT-1ÇAGGTTTCACACACCTT-1ÈAGTAACTATAGCAGCC-1ÉAGTACAGAAGCTTATA-1ÊAGTACATCATTTATCA-1ËAGTACGGGCACCTGGC-1ÌAGTACTCTTATGCCCA-1ÍAGTAGGAAGGAAGTTG-1ÎAGTATGCTGGAGACCA-1ÏAGTATTTGGCACGACC-1ÐAGTCAACACCACCATC-1ÑAGTCAAGATGACACTT-1ÒAGTCACTAGCTCTCGA-1ÓAGTCCATTGGCTGATG-1ÔAGTCCCGCCTTTAATT-1ÕAGTCGACGGTCTCAAG-1ÖAGTCGGCCCAAACGAC-1×AGTCGGCTCAACTTTA-1ØAGTCGGTTGCGTGAGA-1ÙAGTCGTATAAAGCAGA-1ÚAGTCGTCGACCACCAA-1ÛAGTCGTGGGCATTACG-1ÜAGTCTAAAGTATACTC-1ÝAGTCTCACAAGACTAC-1ÞAGTCTTCTCCTCAAAT-1ßAGTCTTTAAAGTGTCC-1àAGTGAACAAACTTCTC-1áAGTGACCTACTTTACG-1âAGTGAGACTTCCAGTA-1ãAGTGAGCCTCGCCGCC-1äAGTGAGTCGAATTAAC-1åAGTGATAACCTGCGCG-1æAGTGATATGAGTAGTT-1çAGTGATTCAAGCAGGA-1èAGTGCACGCTTAAGAA-1éAGTGCGTAGCTCGTAA-1êAGTGCTAAACACAGCA-1ëAGTGCTTGCACGAATA-1ìAGTGGCCCGCAAATGG-1íAGTGGCGGCAATTTGA-1îAGTGGCGTCTGAAGGT-1ïAGTGGCTCCGTCGGCC-1ðAGTGGTGTTACCCGTG-1ñAGTGTATTGCGCATTG-1òAGTTAAACACTTGCGA-1óAGTTAAGCGGTCCCGG-1ôAGTTAAGTCAACCGCT-1õAGTTACTCTATCGTGG-1öAGTTCCTACAGAATTA-1÷AGTTCCTATTTATGTT-1øAGTTGACGGTCCTTGC-1ùAGTTGGCAAGGCTAGA-1úAGTTTGCACCTGCCTC-1ûAGTTTGGCACGGGTTG-1üAGTTTGGCCAGACCTA-1ýATAAACGGACCCGTAA-1þATAAACGTTGCACCAC-1ÿATAAAGGCTCGGTCGT-1ATAAATATTAGCAGCT-1AATAGAATCTGTTTCA-1AATAGCTACCGCGTGC-1AATAGTCCGTCCCGAC-1AATATCCTAGCAAACT-1AATATCGAATCAATGC-1AATATCGAGGGTTCTC-1AATATTGGAGTATTGA-1AATCATGTAAAGACTC-1 AATCGCCTCAGCGCCA-1 AATCGCGCAGAGGACT-1 AATCGGTATAGCCCTC-1 AATCGTGAGCCGAGCA-1 AATCTAGGTTTACTTG-1AATCTATGCCGGAGCC-1AATCTCTACTGTGGTT-1AATCTGCGTTGGGACG-1AATCTGGCTTTCTAGT-1AATGACAGCAATGTCT-1AATGACGTAGGATGTC-1AATGACTGTCAGCCGG-1AATGATGATACGCTAT-1AATGATGCGACTCCTG-1AATGCAACCGGGTACC-1AATGCACCAAGCAATG-1AATGTGCCCGAGGTGT-1AATGTTGTCGTGAGAC-1AATTAAAGGTCGGCGT-1AATTAACGGATTTCCA-1AATTACGAGACCCATC-1AATTAGCGCTGCAGCG-1AATTCATAAGGGATCT-1 AATTCATTGTCATGCA-1!AATTCCAAGCATGTAC-1"AATTCGATTCGAGGAT-1#AATTCTAGAGTTAGGC-1$AATTGAACGCTCTGGT-1%AATTGCAGCAATCGAC-1&AATTTGGGACATAGTA-1'ACAAACCATGCGTCCT-1(ACAAAGAAGGTAGGCC-1)ACAAAGCATGACCTAG-1*ACAAATCGCACCGAAT-1+ACAAATGGTAGTGTTT-1,ACAACAGCATGAGCTA-1-ACAAGCAGTGCCTAGC-1.ACAAGGAAATCCGCCC-1/ACAAGGACAAGAGGTT-10ACAAGGATGCTTTAGG-11ACAAGGGCAGGCTCTG-12ACAATAGTCGTACGTT-13ACAATCCATTTAAACC-14ACAATGAATACGGAGA-15ACAATTGTGTCTCTTT-16ACAATTTGAGCAGTGG-17ACACAAAGACGGGTGG-18ACACACCAGGACCAGT-19ACACATGATCAAATCT-1:ACACCCAGCATGCAGC-1;ACACCTTAAGTAGGGC-1<ACACCTTACTACTTGC-1=ACACGAGACTCCTTCT-1>ACACGGGAACTTAGGG-1?ACACGTAGGCCACAAG-1@ACACTGATCAAGGTGT-1AACAGAACTGAGAACAA-1BACAGCGACATTCTCAT-1CACAGGCACGGATCCTT-1DACAGGCTTGCCCGACT-1EACAGGTGGAGGTGAGG-1FACAGTAATACAACTTG-1GACATAAGTCGTGGTGA-1HACATAATAAGGCGGTG-1IACATCCCGGCCATACG-1JACATCCTGGTAACTGT-1KACATCGATCGTTTACC-1LACATCGGTCAGCCGCG-1MACATCGTATGCAATGG-1NACATGGCGCCAAAGTA-1OACATTAGTTTATATCC-1PACATTTGAAACCTAAC-1QACCAAACACCCAGCGA-1RACCAACACCACACACT-1SACCAACCGCACTCCAC-1TACCAACGCTTATTTAT-1UACCAAGTCATCGGCAG-1VACCAATATGCAAGTTA-1WACCACAAGTTTCTATC-1XACCACCAATGTAACAA-1YACCACGTGCAGCTATA-1ZACCAGACCATAACAAC-1[ACCAGTGCGGGAGACG-1\ACCATATCCGCAATAA-1]ACCATCCGCCAACTAG-1^ACCATCGTATATGGTA-1_ACCCAACGCCCGTGGC-1`ACCCATCTTGAGGGTA-1aACCCATTTGTCCCTCT-1bACCCGGAAACTCCCAG-1cACCCGGATGACGCATC-1dACCCGGTTACACTTCC-1eACCCGTGTCATCAGTA-1fACCCTATGCCATATCG-1gACCCTCCCGTCAGGGC-1hACCCTCCCTTGCTATT-1iACCCTGGTAACGCCCT-1jACCGAAGAGTCTGGTT-1kACCGACACATCTCCCA-1lACCGACTGAGTCCCAC-1mACCGAGTCTCCTTATT-1nACCGATGGTAGCATCG-1oACCGCAATAACTGCCT-1pACCGCGGTGGAAGTCG-1qACCGGGCCTTTGTTGA-1rACCGGTCAGGTACACC-1sACCGTCCACTGGGCCC-1tACCTAAGTACCTTTCA-1uACCTAATCGACTTCCT-1vACCTACAGTATGTGGT-1wACCTACTATAAATCTA-1xACCTCCGCCCTCGCTG-1yACCTCCGTTATTCACC-1zACCTGCGTGTCATGTT-1{ACGAAATGGGCGGCAC-1|ACGACTCTAGGGCCGA-1}ACGAGGATACCACTCT-1~ACGAGGTTTACAACGT-1ACGAGTACGGATGCCC-1€ACGATACATAGAACTA-1AACGCATGATCTGGGT-1‚AACGCGGTCTCCAGCC-1ƒAACGCTGTTGCTGAAA-1„AACGGACGTACGTATA-1…AACGGCCATCTCCGGT-1†AACGTACTGTGGGTAC-1‡AACGTCAGACTAGTGG-1ˆAACGTCGCTGCACTTC-1‰AACGTGCGAAAGTCTC-1ŠAACTACCCGTTTGTCA-1‹AACTAGGCTTGGGTGT-1ŒAACTCAAGTTAATTGC-1AACTCCAGAGCGTGTT-1ŽAACTCCTAATCCCATG-1AACTCTCAATAGAGCG-1AACTCTCAGTGTGCTC-1‘AACTGGGTCCCGACGT-1’AACTTGCCCGTATGCA-1“AAGACATACGTGGTTT-1”AAGACCAAATAACTCA-1•AAGACCCAACTGAACA-1–AAGACTGCAAGCTACT-1—AAGAGCTCTTTATCGG-1˜AAGAGGATGTACGCGA-1™AAGAGGCATGGATCGC-1šAAGAGGCCCTTTGGAA-1›AAGATGGCACCGGACC-1œAAGATTGGCGGAACGT-1AAGCACCCTGCGTATC-1žAAGCATACTCTCCTGA-1ŸAAGCCGAAGCGGTTTA-1 AAGCGCAGGGCTTTGA-1¡AAGCGTCCCTCATCGA-1¢AAGCTAGATCGAGTAA-1£AAGCTCGTGCCAAGTC-1¤AAGCTCTTTCATGGTG-1¥AAGGAGCGGTTGGTGC-1¦AAGGATCGATCGCTTG-1§AAGGATGAGGGACCTC-1¨AAGGCGCGTAAAGCTT-1©AAGGCTGTGCTCATCG-1ªAAGGGAACGACTGGCT-1«AAGGGACAGATTCTGT-1¬AAGGGACTATGCATTC-1­AAGGGTTTGATTTCAG-1®AAGGTATCCTAATATA-1¯AAGGTGATAAACCAGC-1°AAGTAGTGACGCGAGG-1±AAGTCAATTGTCGTCA-1²AAGTCTTCTGTGGCCT-1³AAGTGACGACCGAATT-1´AAGTGAGTCGGGTTTA-1µAAGTGCCTTGACTGTA-1¶AAGTGCGTTAGAATCT-1·AAGTGTTTGGAGACGG-1¸AAGTTCACTCCAAGCT-1¹AAGTTCAGTCTGCGTA-1ºAAGTTCGGCCAACAGG-1»AAGTTGTGATGTTATA-1¼AAGTTTATGGGCCCAA-1½AATAACAACGCTCGGC-1¾AATAACACTAGAACAA-1¿AATACCTGATGTGAAC-1ÀAATAGAACAGAGTGGC-1ÁAAATCGCGGAAGGAGT-1ÂAAATCGTGTACCACAA-1ÃAAATCTAGCCCTGCTA-1ÄAAATGATTCGATCAGC-1ÅAAATGGCCCGTGCCCT-1ÆAAATGGTCAATGTGCC-1ÇAAATTAACGGGTAGCT-1ÈAAATTACACGACTCTG-1ÉAAATTACCTATCGATG-1ÊAAATTCCAGGTCCAAA-1ËAAATTGATAGTCCTTT-1ÌAAATTTGCGGGTGTGG-1ÍAACAACTGGTAGTTGC-1ÎAACACACGCTCGCCGC-1ÏAACACGAGACGCGGCC-1ÐAACAGGATGGGCCGCG-1ÑAACAGGTAGTATGGAT-1ÒAACATATCAACTGGTG-1ÓAACATCGATACGTCTA-1ÔAACATTGTGACTCGAG-1ÕAACCAAGACTTCTCTG-1ÖAACCCATCCCATGATC-1×AACCCGAGCAGAATCG-1ØAACCCTACTGTCAATA-1ÙAACCGAGCTTGGTCAT-1ÚAACCGCTAAGGGATGC-1ÛAACCTCGCTTTAGCCC-1ÜAACCTTTAAATACGGT-1ÝAACCTTTACGACGTCT-1ÞAACGAAAGTCGTCCCA-1ßAACGATAATGCCGTAG-1àAACGATATGTCAACTG-1áAAACTGCTGGCTCCAA-1âAAACTTAATTGCACGC-1ãAAACTTGCAAACGTAT-1äAAAGAATGTGGACTAA-1åAAAGGCTACGGACCAT-1æAAAGGCTCTCGCGCCG-1çAAAGGGATGTAGCAAG-1èAAAGTAGCATTGCTCA-1éAAAGTGTGATTTATCT-1êAAAGTTGACTCCCGTA-1ëAAATAACCATACGGGA-1ìAAATAAGGTAGTGCCC-1íAAATACCTATAAGCAT-1îAAATAGCTTAGACTTT-1ïAAATAGGGTGCTATTG-1ðAAATCCGATACACGCC-1ñAAACCGTTCGTCCAGG-1òAAACCTAAGCAGCCGG-1óAAACGAAGATGGAGTA-1ôAAACGAGACGGTTGAT-1õAAACGGGCGTACGGGT-1öAAACGGTTGCGAACTG-1÷AAACTCGGTTCGCAAT-1øAAACTCGTGATATAAG-1ùAAACAGGGTCTATATT-1úAAACATGGTGAGAGGA-1ûAAACATTTCCCGGATT-1üAAACCGGGTAGGTACC-1ýAAACAGAGCGACTCCT-1þAAACAGCTTTCAGAAG-1ÿAAACACCAATAACTGC-1AAACAAGTATCTCCCA-1GCATTGTAATTCATAT-1GCATTTCCAAGGCTCC-1GCCAACCATTTCCGGA-1GCCAAGAATACTTCTG-1GCCAATAGGGCATCTC-1GCCACAATTTAAGGAC-1GCCACTCAGAGCGCGA-1GCCAGGAGTAACCGAT-1 GCCATATTGCACACAG-1 GCCATCGAGCTGCGTG-1 GCCATCGATGCTGCAT-1 GCCATTAGCCTCAAAC-1 GCCCGACTTCTTCCCG-1GCCCGAGAGTCTAAAT-1GCCCGATCTGTGGTCG-1GCCCGCGCGTAAACGG-1GCCCGTAATACCTTCT-1GCCCTAGCCGTCGCGA-1GCCCTGAGGATGGGCT-1GCCGAAATTCCTACGT-1GCCGATTGGCCAAGCT-1GCCGCTTGTGAGAAAC-1GCCGGGTTAGGGTCGC-1GCCGTGGAAGAAATGT-1GCCTACGTTCTGTGCA-1GCCTATAGTGTCAGGG-1GCCTCATCTGGAAATA-1GCCTCCGACAATTCAC-1GCCTCTATACATAGCA-1GCCTTTGTCAGTGGAC-1GCGAAACGATCGGGAG-1 GCGAAACTTAACTGGA-1!GCGAAGAATCTGACGG-1"GCGAAGCCATACCCGT-1#GCGACATGTAAACATC-1$GCGACGATAGTTGTAC-1%GCGAGAGGCCATGTAA-1&GCGAGAGTTGCGTCCA-1'GCGAGCGCATGCTCCC-1(GCGAGGCCCGAGCAGA-1)GCGAGTTCTGCAAAGA-1*GCGATTGTTAACGTTA-1+GCGCAAATATATTCAA-1,GCGCAAGAGCGCGCTG-1-GCGCATCCAGTCAGCA-1.GCGCCGTTCCACGATA-1/GCGCCTCCCACTCCGA-10GCGCGGTCTAGTAACT-11GCGCGTCATTGGTACA-12GCGCTAATTGAATAGA-13GCGCTATGCCGAGGCA-14GCGCTGATCCAGACTC-15GCGCTGCTTTGCATTT-16GCGCTTAAATAATTGG-17GCGGACCGCGTTGTGG-18GCGGAGAAACTTCGCA-19GCGGAGAGGGAGAACG-1:GCGGATTACTTGTTCT-1;GCGGCAAAGTATTGCC-1<GCGGCTCTGACGTACC-1=GCGGCTTTAGCAAGTT-1>GCGGGCGAGCCTTACC-1?GCGGTCTTGCTTTCAC-1@GCGGTGAACTGCGCTC-1AGCGGTTCCCTATCATG-1BGCGTAAATGGCCATAA-1CGCGTCGAAATGTCGGT-1DGCGTCGCCAGGGTGAT-1EGCGTCTCTGCATTGGG-1FGCGTGGTACTGGGTTA-1GGCGTTCGGAGACCGGG-1HGCTAACTGAAGTCTGA-1IGCTAAGCCCAGTATGC-1JGCTAAGTAGTTTCTCT-1KGCTAATACCGAATGCC-1LGCTACAATCGAGGATA-1MGCTACAGTACGGACCG-1NGCTACGACTTATTGGG-1OGCTACTATAGTAGAGT-1PGCTAGACCGTCTACTG-1QGCTAGAGTAGAGATGT-1RGCTAGCAGGGAGTGGG-1SGCTAGCTTGAATAGCT-1TGCTAGGCACCACGGAG-1UGCTAGTAGAGCTTGTA-1VGCTATACGTCTCGGAC-1WGCTATCATACTCATGG-1XGCTATGCCAGCTTATG-1YGCTCAATCCGTTTATT-1ZGCTCAATGTAATACCG-1[GCTCATTACTGCATGT-1\GCTCCCAGTCGGTCCA-1]GCTCCGCTCGCTTCAG-1^GCTCCTGACATACTGG-1_GCTCGCTCATGTCCAA-1`GCTCGGAATTTAAAGC-1aGCTCTAAACCCTGACG-1bGCTCTATGTTACGTGC-1cGCTCTCGGGTACCGAA-1dGCTCTTTCCGCTAGTG-1eGCTGAATCTTCCAATC-1fGCTGAGGCGTGAGTAT-1gGCTGCACGGTTTCTTA-1hGCTGCTAAGTAGTCGA-1iGCTGCTACTGCGTAGC-1jGCTGCTCTCCGGACAC-1kGCTGGACCCAAAGTGG-1lGCTGGCATATTCACCT-1mGCTGGCGGCGCATGCT-1nGCTGGTGACTCGTAGT-1oGCTGGTTTAGGCCATA-1pGCTGTATTACTGGCCC-1qGCTGTTGCTACCGAAC-1rGCTTAATGTAACTAAC-1sGCTTACGTAGTTAGTA-1tGCTTATGAAGCAGGAA-1uGCTTCCATGTAACCGC-1vGCTTCCGTCCCTAGAC-1wGCTTGAGTGACCTCTG-1xGCTTGGATCGATTAGG-1yGCTTTCAGAGGAGGTG-1zGGAAACCTTGTTGAAT-1{GGAAACTAAATGGGCC-1|GGAAAGTGCCCATGCC-1}GGAACCGTGTAAATTG-1~GGAACCTTGACTCTGC-1GGAACTTTGGCGATTA-1€GGAATGCGCTAGCGTG-1GGACAACCATGAAGCC-1‚GGACACAAGTTTACAC-1ƒGGACCAACAGGATAAC-1„GGACCTACGGTAACGT-1…GGACCTCTAGGCCGCC-1†GGACGTCCATAGTTGG-1‡GGACTCTTTGACTAAG-1ˆGGAGAAGTCATTGGCA-1‰GGAGACCATCTACATA-1ŠGGAGACGACACCTTTG-1‹GGAGCAACATTTCAAG-1ŒGGAGCACCAAGAACTA-1GGAGCGAGGCCTACTT-1ŽGGAGGGCTTGGTTGGC-1GGAGTTGATTCTGTGT-1GGATCAGAGCCATCAG-1‘GGATCATCCCGTACGC-1’GGATCCGGAATATACT-1“GGATCTTGACTCAACC-1”GGATGAAGATCGCTGA-1•GGATGACGCGAGTTTA-1–GGATGGCTTGAAGTAT-1—GGATGTCCTTACCGCA-1˜GGATTAATCATGGACC-1™GGATTCCGCTATACCC-1šGGATTGCTGTGACTCC-1›GGATTTCACTTCTATA-1œGGCAAAGGCGCCAATA-1GGCAAATTACTTTACT-1žGGCAAGCCCATAGTGG-1ŸGGCAAGGCGAAATAGC-1 GGCAATAGTCAATGAG-1¡GGCACGCTGCTACAGT-1¢GGCACTCCACTGGGCA-1£GGCACTGCGGTGGTTT-1¤GGCAGCAAACCTATGC-1¥GGCAGCGGTAATCCTA-1¦GGCATACAGGTAGCGG-1§GGCATATCGGTTCTGC-1¨GGCCAATTGTATAGAC-1©GGCCCAGCTGGTTTGC-1ªGGCCCTCACCCACTTA-1«GGCCGGCGTCTGCTAT-1¬GGCCGTTTGGGTTTCA-1­GGCCTGCTTCTCCCGA-1®GGCGAAATCTAACTTG-1¯GGCGAGCGAAACGGCA-1°GGCGCAGGACATCTTC-1±GGCGCATGAATTGATG-1²GGCGCGGAGATCTTTC-1³GGCGCGTTCGAGTTTA-1´GGCGCTTCATTCCCTG-1µGGCGGAGTAATATTAG-1¶GGCGGTAGGATCATTG-1·GGCGTAGGGAAAGCTG-1¸GGCGTCCTATCCGCTG-1¹GGCTAAAGGGCGGGTC-1ºGGCTAATGATTGAAAT-1»GGCTATTAAGTTGTAT-1¼GGCTCGCGTTGAGGTA-1½GGCTCTGCTCCAACGC-1¾GGCTGAAATAGCAAAG-1¿GGCTTTCAATAAGGGT-1ÀGGGAAAGAATGCCAAC-1ÁGGGAACGGGAGGTTAG-1ÂGGGAAGACGGTCTGTC-1ÃGGGAAGGGCTTTCTCA-1ÄGGGAATGAGCCCTCAC-1ÅGGGACAGAGTTACTCC-1ÆGGGACCCGTATATCTT-1ÇGGGACTGCATAGATAG-1ÈGGGAGAACTCACAGTA-1ÉGGGAGCGACCGTAGTG-1ÊGGGAGGATGCCCGAAA-1ËGGGAGTTAATGAGGCG-1ÌGGGATGGTCGTAACCG-1ÍGGGATTTACCGCACCT-1ÎGGGCAACCGCACGTGC-1ÏGGGCACTATTGACCAT-1ÐGGGCAGACGTCACTGC-1ÑGGGCAGAGCAATCGTT-1ÒGGGCAGTCAACGCCAA-1ÓGGGCCCGTCTTAAACA-1ÔGGGCCGGCCGAAGTAC-1ÕGGGCCTAAATGGGCTA-1ÖGGGCGATATGTGTGAA-1×GGGCGGCAAATGAATT-1ØGGGCGGGTTCCCTACG-1ÙGGGCGTACATTTATAT-1ÚGGGCGTCACCACGTAA-1ÛGGGCGTCCACTGGCTC-1ÜGGGCGTGGTTTCCCAG-1ÝGGGCTACTATTTCGTG-1ÞGGGCTATGATCGATGG-1ßGGGCTCATCGAACCCA-1àGGGCTGCCTAGGGCGA-1áGGGCTGGTTAGTCGCG-1âGGGTACTTCATGAACT-1ãGGGTATGTATGCACTT-1äGGGTATTCTAGCAAAC-1åGGGTCACCGTGACGGT-1æGGGTCAGGAGCTAGAT-1çGGGTCGTGGCAAGTGT-1èGGGTCTATCGCTTTCC-1éGGGTGACACCTTAACT-1êGGGTGCATATGAAAGC-1ëGGGTTAACATTTGAGT-1ìGGGTTTAGGATAGGAT-1íGGTAACCGGGAGGATA-1îGGTACAAACATGCTAT-1ïGGTACCATTAAGACGG-1ðGGTACGTTGCGGCCGG-1ñGGTAGAAGACCGCCTG-1òGGTAGACCGTTGGGCG-1óGGTAGTGCTCGCACCA-1ôGGTATAGTGACACATA-1õGGTATTGCCGAGTTTA-1öGGTCAAGACTACTTCG-1÷GGTCAGTGGGTCCCAC-1øGGTCGGATAAACGGCG-1ùGGTCGGCCAGGAGCTT-1úGGTCGGTCGTCCACAG-1ûGGTCGTAAGCTCGCAC-1üGGTCTCCGTCCAGGTT-1ýGGTCTCTGAATGGACT-1þGGTCTGAGAATCTGGA-1ÿGGTCTTGAGCGCTCTT-1GGTGAAGTACAGGGAT-1GGTGATAAGGAGCAGT-1GGTGCAGAGCCTATCG-1GGTGCTGGTACACATT-1GGTGGACTGCTCTGGC-1GGTGTAAATCGATTGT-1GGTTACCACCCTCGGG-1GGTTAGCTATATGTCT-1GGTTAGGCTTGGAGAA-1 GGTTCGGATTATACTA-1 GGTTCTACTCGTCTGA-1 GGTTTAATTGAGCAGG-1 GGTTTACAATCTCAAT-1 GGTTTAGCCTTTCTTG-1GGTTTCAATCGGTCAG-1GGTTTGACAAGAAGCT-1GGTTTGTGACCTGAGG-1GTAACATCTAAGATAA-1GTAAGCGGGCAGTCAG-1GTAAGTAACAGTCTGG-1GTAAGTAGGGTATACC-1GTAATAAAGGGCTCCC-1GTAATCTGATTCTTCG-1GTACACTTACCTGAAG-1GTACAGAGGCAAGGGT-1GTACGAGATTGCGACA-1GTACGCTTCATTGCAC-1GTACGTCACGTATTAA-1GTACGTTTGCCCGTCA-1GTACTAAGATTTGGAG-1GTACTCCCTTATCGCT-1GTACTCCTGGGTATGC-1 GTACTGGAGTTAGACC-1!GTAGACACGCCTGACT-1"GTAGAGGGAGACAAGT-1#GTAGCCAAACATGGGA-1$GTAGCGGCTATACACT-1%GTAGCTTCCTCTTGTT-1&GTAGGTGATCCGTGTA-1'GTAGTCGCGGGAATCA-1(GTAGTCTACGATATTG-1)GTAGTGAGCAACCTCA-1*GTATAGGACTCAGTAG-1+GTATCAAACGTTAGCT-1,GTATCCTTTGGTAACC-1-GTATCTCAGTCTTGAC-1.GTATCTTTCATAACCA-1/GTATGAAATTTCACTC-10GTATGTGGGTCTAGTT-11GTATTCTGAGAAACGA-12GTCAAAGAAGTGGTGT-13GTCAACCAGGCCTATA-14GTCAAGCGGACTCGGG-15GTCAGAATAGTCTATG-16GTCATGCACCTCCGTT-17GTCATGCGCGAGGGCT-18GTCATGGACATGACTA-19GTCATTAGAGCGAACG-1:GTCCAATATTTAGCCT-1;GTCCATTACTGCTACG-1<GTCCCAACGTAAAGTA-1=GTCCCAATCATCCCGC-1>GTCCCGCGACGTTATG-1?GTCCGGACCTGAAATT-1@GTCCGGCTGAATTGCG-1AGTCCGGGTTCACATTA-1BGTCCTACGAATAGTCT-1CGTCCTACTCTACGGGC-1DGTCGCCGTTGTGTGTT-1EGTCGCGTAACCCGTTG-1FGTCGGAAGGATACCAG-1GGTCGGATATCTCAGAC-1HGTCGGATGTAGCGCGC-1IGTCGGGAACATGGTAG-1JGTCGGGAAGCAGAAAC-1KGTCGTACCATCTCGGG-1LGTCGTACCTACGATTG-1MGTCGTATTGGCGTACA-1NGTCGTGTCTGGTCATC-1OGTCGTTATTCGCTTAT-1PGTCTAGTGAGCCGCTT-1QGTCTATCTGAGTTTCT-1RGTCTATTGCATGCTCG-1SGTCTATTGGTTCCGGT-1TGTCTCAAGGCCCGGCT-1UGTCTCCCGAGTCCCGT-1VGTCTCCTGCCAGTATG-1WGTCTCGACTAAGTTTG-1XGTCTCGATCTGCTTTC-1YGTCTGGGCGGTCGAGA-1ZGTCTTACCACGCCAAG-1[GTCTTGTAGCTATTCA-1\GTGAAACGGCGCCACC-1]GTGAACTCCCATTCGA-1^GTGAAGATTTCAAGTG-1_GTGAAGCCGTATAGTC-1`GTGAAGTCACGACTCG-1aGTGACAGCTTCCCACT-1bGTGACCGCACACTACG-1cGTGACGAGGGTGACCC-1dGTGACGCAGGTTTCAT-1eGTGACTTCAGTAGTGC-1fGTGAGCGTGCTGCACT-1gGTGAGGACACTTAAGG-1hGTGAGGAGCGGTTGAG-1iGTGAGTCGACTAATAG-1jGTGAGTGGTACAACGC-1kGTGATCACTAACGCCT-1lGTGATCATAGATCTGC-1mGTGATCCTTGTCATGA-1nGTGATGCACAACATCT-1oGTGATTCGCCGCTCAA-1pGTGCACCAGCTTCAAC-1qGTGCACGAAAGTGACT-1rGTGCCATCACACGGTG-1sGTGCCCGTTCGGATTC-1tGTGCCGCTTCAAAGGT-1uGTGCCTGAGACCAAAC-1vGTGCGAAATCGAACAC-1wGTGCGACAGGGAGTGT-1xGTGCGGGTCTCCAAAT-1yGTGCGTGTATATGAGC-1zGTGCTCAAGTACTGTC-1{GTGGAACCTACATGCG-1|GTGGACCAACCCGATT-1}GTGGACGCATTTGTCC-1~GTGGAGCGTTTACCGA-1GTGGAGTCGGCGGTTG-1€GTGGCAAACAGCGGCA-1GTGGCGGTCCCAGCGT-1‚GTGGCTGTTTCTGTTC-1ƒGTGGGAAGACTGAATC-1„GTGGGCTTAGACACAC-1…GTGGGTACTGAGCGTA-1†GTGGTATAGTCTGCCG-1‡GTGGTGGCCAAGTGAA-1ˆGTGGTTACTTCTTTCG-1‰GTGGTTTCCGCCTTTC-1ŠGTGTACCTTGGCTACG-1‹GTGTATATCAGCGGGC-1ŒGTGTCGTATAGCGTTC-1GTGTGAATAACTTAGG-1ŽGTGTTACTATGCGTCC-1GTTAAAGTAGGACTGG-1GTTAACATCACTTAAA-1‘GTTAACTATGTTGTCA-1’GTTAAGGGTGCGATGT-1“GTTACAATTGGTGACG-1”GTTACCTACAACTTGC-1•GTTACTTTGGGCCTAG-1–GTTAGCCCATGACATC-1—GTTAGCCGTAAATCAA-1˜GTTAGGCTACCCGTTT-1™GTTATAATACGGTGAA-1šGTTATATCAGGAGCCA-1›GTTATATTATCTCCCT-1œGTTATCAAGCTATCGA-1GTTCACAGGAGTCTAG-1žGTTCATCGTTTGGCTG-1ŸGTTCGCCATAAGTGCC-1 GTTCGCTGAGACGTCT-1¡GTTCGGATCGGGAACA-1¢GTTCGGGCGTACCATT-1£GTTCGTCTAAAGAACT-1¤GTTGAACCGGTTCCAT-1¥GTTGAGTCCCGCCGGT-1¦GTTGCACGGAGTTTCG-1§GTTGGACCGCATCAGG-1¨GTTGGATTCAGTGGCT-1©GTTGGATTGAGAACAC-1ªGTTGGATTTGCGTTGG-1«GTTGGTCATGCTATCC-1¬GTTTACGTTCCATCTG-1­GTTTCAAACGAGTTGT-1®GTTTCATATCGTCGCT-1¯GTTTCCTGGAGGGTGA-1°GTTTCTAGAGGCGCGG-1±GTTTCTGCAGTCTCCC-1²GTTTGACCAAATCCTA-1³GTTTGGCCCAAGTTAT-1´GTTTGGGCTTGTGAGC-1µGTTTGGGTTTCGCCCG-1¶GTTTGGTAGGGTCAAC-1·GTTTGTTAGCCAAGTA-1¸TAAACCCAGGAGGGCA-1¹TAAAGCGGTATTTCCA-1ºTAAAGCGTTAGGAGAA-1»TAAAGCTGCAATAGGG-1¼TAAATGCCGTCTCATG-1½TAACATACAATGTGGG-1¾TAACATACACGCGATC-1¿TAACCTACCGTCCGAG-1ÀTAACCTAGGGAGTCCA-1ÁTAACTATTACGCCAAA-1ÂTAACTCATCCGCGCGG-1ÃTAAGAGGGACAGGGAC-1ÄTAAGCCCTTACGACCA-1ÅTAAGGCAACATAAGAT-1ÆTAAGGCATAACATCAA-1ÇTAAGGCCCGTCACCCT-1ÈTAAGGCTGAATCCCTC-1ÉTAAGGGCCTGTCCGAT-1ÊTAAGTAACATCTTGAC-1ËTAAGTCGCCGAGTATC-1ÌTAAGTTGCGACGTAGG-1ÍTAATAAACAAGGAGAT-1ÎTAATACACAGTAGTAT-1ÏTAATACTAGAACAGAC-1ÐTAATAGAACAGAGTTA-1ÑTAATAGGTCACCAGAA-1ÒTAATAGTGACGACCAG-1ÓTAATCGATCCGTACGT-1ÔTAATTACGTCAGTAGA-1ÕTAATTAGGACATCCGT-1ÖTAATTGGAATCGGGAA-1×TAATTTCCGTCCAGTA-1ØTACAACAGCGCATACA-1ÙTACAACGCACAACTCA-1ÚTACAAGGGCTTCTTTA-1ÛTACAAGTCTCGTGCAT-1ÜTACACAGCCGTGGTGC-1ÝTACACCTCTTCGAATC-1ÞTACAGAAACGGTGGGC-1ßTACATAGGCATACACC-1àTACATCCCTATCCCTG-1áTACATTTCTAACGTGC-1âTACCAAATAGCCCAGA-1ãTACCAATAAAGTACCA-1äTACCAGAAGTAGGTTC-1åTACCGAATAATTGTAA-1æTACCGCGGACTTGCAG-1çTACCGGCTCACTGCCC-1èTACCGGTCGTTTCCAT-1éTACCGTAGGTTAACTA-1êTACCGTGCCTCGGACC-1ëTACCTACTCCCAGTAT-1ìTACCTATCCCTAGAGG-1íTACCTCAGTTGTCTGT-1îTACCTTAAGATTTCCC-1ïTACGAACACGACTTCA-1ðTACGACGCTTGCTGCG-1ñTACGACTGCCTCTTAG-1òTACGAGAACTTCACGT-1óTACGATGTTGATCATC-1ôTACGCAGTTCTTTCCT-1õTACGCCATATTCTAAT-1öTACGCCGAGGGTACCC-1÷TACGCCTCCATTCCGA-1øTACGCTATAGAAACCT-1ùTACGCTCGGTATTGGA-1úTACGGAAGCCAAACCA-1ûTACGGGATGCTAGCAG-1üTACGGGTAATAACATA-1ýTACGTAAAGCGGAGTG-1þTACGTGGGCCCAGGGC-1ÿTACGTTTACCGGCAAT-1TACTACGTGCAATGCG-1CTGGGATAAATAATGG-1CTGGGCCTGCTATATC-1CTGGGTAGGCAGTTAA-1CTGGGTTGAGTTAAAG-1CTGGTAAAGACTTACA-1CTGGTAACACATAGAA-1CTGGTAACGAGCTCTT-1CTGGTTTCGAGCAAGA-1 CTGTACTTCTTAGCAT-1 CTGTAGCCATCTCACT-1 CTGTCAAATGGCTCGG-1 CTGTGCAGGGTAGGTC-1 CTGTGGTCGGGAGATA-1CTGTTACCCAATCTAG-1CTGTTCACTGCCTGTG-1CTTAACTTACAGTATA-1CTTAAGCAGCGAGCCG-1CTTACACGGTATTCCA-1CTTAGCCTTCCACATG-1CTTAGGTATAGACCAG-1CTTAGTAGGCCTACAG-1CTTAGTGTAGTAGCAT-1CTTATGCGCTCAGGGC-1CTTCAACTCCACTTGG-1CTTCAGTGGTCGCCTA-1CTTCAGTTGGACAACG-1CTTCATTGTCAGTGGA-1CTTCCGCTCCGTGAAG-1CTTCGATTGCGCAAGC-1CTTCGGCCAATTGTTT-1CTTCGTAGATAGGTGA-1 CTTCTATGTTGAAGTA-1!CTTCTATTAATGCTAG-1"CTTGAGTTAGGGTAAT-1#CTTGATGACCATCCAG-1$CTTGCAACCGCCTCCT-1%CTTGCCCACCCACGCA-1&CTTGCCCAGGCTCTAC-1'CTTGGCCAAGCTGGGA-1(CTTGTACTTGTTGACT-1)CTTGTCAACATTCGAG-1*CTTGTGCTCACCGATT-1+CTTGTTGCTGAGTCAA-1,CTTTAACTTTCAAAGG-1-CTTTAATATTGGTCGA-1.CTTTACCGAATAGTAG-1/CTTTAGGAACACTGTT-10CTTTAGTGCTATTATT-11CTTTCTGTGCGGGCTT-12CTTTGACGTCGCTTCT-13CTTTGCATCGCTCTTG-14CTTTGGCTTTAGTAAA-15CTTTGTCGAATGCTCC-16GAAACAGATGACCACC-17GAAACATAGGAAACAG-18GAAACCATGGTGCGCT-19GAAACCGAATTACCTT-1:GAAACCTATACAAATG-1;GAAAGAACAGCGTTAT-1<GAAAGCAGTGCACTTT-1=GAAAGCCCTTTGGACC-1>GAAATATCACCATCAG-1?GAAATATGCTTGAATG-1@GAAATCGCGCGCAACT-1AGAAATGGCGGTGTTAG-1BGAAATTAGCACGGATA-1CGAAATTGTCTCTATAA-1DGAACAACTGGGATGAA-1EGAACACACATCAACCA-1FGAACAGATTACTAAAT-1GGAACCCTCTGTGTTCT-1HGAACCTCGACCTACAC-1IGAACCTTTAACGATCC-1JGAACGACCGAATGATA-1KGAACGCGGGTCACACG-1LGAACGTCTCATGGTCG-1MGAACTGTGGAGAGACA-1NGAAGAAACGATATTGT-1OGAAGCCACTGATTATG-1PGAAGCCTGCACATTCC-1QGAAGCGTGAGGAATTT-1RGAAGCTCGGACCCGTC-1SGAAGCTTGCTGACCGC-1TGAAGGAGTCGAGTGCG-1UGAAGTCAGTTGCACTA-1VGAAGTCTCCCTAGCGA-1WGAAGTGATTTATCGTG-1XGAAGTTTCCACTCAAT-1YGAATAGACGCGACCCA-1ZGAATAGCCCTGCGGTC-1[GAATCGACATGGTCAC-1\GAATCTGAACATTCTC-1]GAATGCGAATCGGTTC-1^GAATGGGCTTATCGAC-1_GAATGTATGGCAGGTC-1`GAATGTGGTCCGGATT-1aGAATGTTGGGTAATCT-1bGAATTATAGTGAAAGG-1cGAATTCACCCGGGTGT-1dGAATTTCTCGCTGCAG-1eGACAAACATATGCAGG-1fGACAACGACCATTGAA-1GCOLGACAACGCAGCTTACG-1GACACAAGGGAAGAAA-1GACACAGCCGGGACTG-1GACACTGAGTTCAGTG-1GACACTGGAACCCGAT-1GACACTTCCAATTACC-1GACAGATTTCTGGCTC-1GACAGCCAGACCTGAC-1 GACAGGCACACACTAT-1 GACATCCGTCGAACTG-1 GACATCGATTTATAAC-1 GACCAAACGTTGACTG-1 GACCACACTTCCCTTT-1GACCAGAGCCCTGTAG-1GACCCAATTATGATAC-1GACCGACGTGAAAGCA-1GACCGACTGAAGCGTC-1GACCGCGTCTGACGTG-1GACCGTGCTGACGGTG-1GACCGTTACATGCGAC-1GACCTTCCACGTCTAC-1GACGACGATCCGCGTT-1GACGAGGCTAATAAAC-1GACGCATACCCGTCGG-1GACGCCGTAAAGGCTA-1GACGCTTGCTTCTAAA-1GACGGGTTGGCCCGTA-1GACGGTCAATAGAAGC-1GACGTGTAGGGATTAT-1GACTAAGATCATGCAC-1GACTAAGTAGGCTCAC-1 GACTACAAAGCGGTGG-1!GACTAGGCCGTTAGGT-1"GACTCACCCACGTGAG-1#GACTCCCAGAATAAGG-1$GACTCCTTCCAATTGA-1%GACTCGCGGGAATGAC-1&GACTGCAAATCGAGCT-1'GACTGCACCAGCCCAG-1(GAGAACGGTTCTGACT-1)GAGACCCTGCAACGCC-1*GAGACTGATGGGTAGA-1+GAGACTTCGCGACCGA-1,GAGAGGGCGCGAGGTT-1-GAGAGGTGCATTCTGG-1.GAGATCTGCTTGGCAT-1/GAGATCTGTCACTCCG-10GAGATCTTCCATGACA-11GAGATGGCTTTAATCA-12GAGATGGGAGTCGACA-13GAGCACCTGTGTCCAG-14GAGCCAGCTACCTGTG-15GAGCCGAGCGTTTATT-16GAGCGCAAATACTCCG-17GAGCGCGCACGAGTAG-18GAGCGCTGTTAGGTAA-19GAGCTAAGGGCATATC-1:GAGCTGTCGTCTCGGA-1;GAGGAATGGAGAGGTT-1<GAGGATAAACAGTGCT-1=GAGGCCCGACTCCGCA-1>GAGGCCTGTTGATACA-1?GAGGCTATCAAAGTCG-1@GAGGGCGCAGCTCTGC-1AGAGGTACGCGTGTCCC-1BGAGTAAGGCCACGGGA-1CGAGTAGATACTAGTTG-1DGAGTATGCCCGCCTTG-1EGAGTATGCGCGTGCAT-1FGAGTCAGACCAGAATC-1GGAGTCCGCTTACCGGA-1HGAGTCTTGTAAAGGAC-1IGAGTGTCAACCAGAAA-1JGAGTGTGCGGTACCCA-1KGAGTTCTGTGGGTGCT-1LGAGTTGATGGCAATTT-1MGATAACTCGCACTGTG-1NGATACGATGGGAGTCA-1OGATAGATAGTACAGTC-1PGATAGGTAACGTTGAC-1QGATATCAAGCAGGAGC-1RGATATGAGACACTAAC-1SGATATGCGGTAGCCAA-1TGATATTGAGATTGGCG-1UGATATTTCCTACATGG-1VGATCATTCCAAACATT-1WGATCCCTTTATACTGC-1XGATCCGGGAATTAACA-1YGATCCTAAATCGGGAC-1ZGATCCTCGACACTGGC-1[GATCGACACTATCTGA-1\GATCGCGGGCTCTCCA-1]GATCGCTACCCGATTT-1^GATCGCTATATCTCAG-1_GATCGGATAGAACCAT-1`GATCGGTGGCCATAAC-1aGATCGTGACTGATATC-1bGATCTAACCGTATTCA-1cGATCTGCTATCTAAGG-1dGATCTTGGAGGGCATA-1eGATCTTTGCAGGGTAT-1fGATGACAAGTAGGGCA-1gGATGACGATGATCGCG-1hGATGAGGAACCTTCGG-1iGATGCCTTCTGCGGCA-1jGATGCGTCCTGCATTC-1kGATGCTGTATTTCATC-1lGATGTAACGAACCACC-1mGATGTTCAATCCACGA-1nGATTAACCGAAAGCCC-1oGATTACTGAATTTGGG-1pGATTCCCTTGTCGCAG-1qGATTCCGCGTTTCCGT-1rGATTCGACGGTTCACG-1sGATTGGGAAAGGTTGT-1tGCAAACCCTACATTAT-1uGCAAACCTTGGCCATA-1vGCAAATATTACGCTTT-1wGCAAATGAGGACACTT-1xGCAACACACTAGAACT-1yGCAACAGCAGTATGCG-1zGCAACCACCAGACCGG-1{GCAACCACGGCCGCGT-1|GCAACGGCTAGTTATG-1}GCAAGAATTCCTTGGC-1~GCAAGATGTGTTCGCG-1GCAAGCTGGAAACCGC-1€GCAAGTGCACAGAGAA-1GCACAAACGAGGCGTG-1‚GCACAACCTCGGGCGT-1ƒGCACACACTGGTAGCC-1„GCACCTAGGCGAGTCC-1…GCACGCCGATTCCCGC-1†GCACGCCTACTTAGAT-1‡GCACGTGGTTTACTTA-1ˆGCACTGCCTACCTTTA-1‰GCAGACCCAGCACGTA-1ŠGCAGATCCATAAGACT-1‹GCAGATTAGGGATATC-1ŒGCAGCACACAGCCCAG-1GCAGCCTATATCACAT-1ŽGCAGCTATGGACAGGT-1GCAGCTGTCAACGCAT-1GCAGGAACTTAGATCT-1‘GCAGGACTATAGAATA-1’GCAGGTAGAGTATGGT-1“GCAGTGTGGCTATAGG-1”GCATAGAGCACTCAGG-1•GCATCGGCCGTGTAGG-1–GCATGAGGGACGCGGC-1—GCATGCTAATAACGAT-1˜GCATGGGTACTGACGC-1™GCATTCAAGGCAACGC-1šGCATTGACTTGCGGAA-1›CGTGCATTGTCGACGC-1œCGTGCCCTCCCGAAGA-1CGTGGCCGAATATCTA-1žCGTGTATGGGAGCTGA-1ŸCGTGTCCCATTCGCGA-1 CGTTAAACTAGTTAGG-1¡CGTTAATGTCCCGACG-1¢CGTTAGCTCACAACTG-1£CGTTATCATACTTCCA-1¤CGTTCAGACCCGCGAA-1¥CGTTCATGGTGCGCGT-1¦CGTTCTTCGCACACCT-1§CGTTGAATACCGCGCT-1¨CGTTGAGCGACCGTCG-1©CGTTGAGTAATTGCGT-1ªCGTTGTAAGATTGATT-1«CGTTGTCGGCAATTGA-1¬CGTTGTTTCAATTCCC-1­CGTTTCACTTCGGGCG-1®CGTTTCGCTCATTACA-1¯CGTTTGTGTAGAGGGT-1°CTAAAGAATGCCTACT-1±CTAAAGGGAAATAGGA-1²CTAAATCCTATTCCGG-1³CTAACAGCACAATAAC-1´CTAACCGCGCGCCCGT-1µCTAACGAAACTTGCTG-1¶CTAACTGATAATCGCC-1·CTAACTGGTCCGGTTC-1¸CTAAGGGAATGATTGG-1¹CTAATTCGCACGCGCT-1ºCTAATTCTCAGATATT-1»CTACACTCGCAGATGG-1¼CTACCCTAAGGTCATA-1½CTACGACTAGCTATAA-1¾CTACGCACGGAGTACC-1¿CTACTATCATAGGTTT-1ÀCTACTATCTTTCAGAG-1ÁCTACTCAAGGTATAGT-1ÂCTACTCTAGGCCCGGC-1ÃCTACTGCCACCTGACC-1ÄCTAGATGTGAGTGTAA-1ÅCTAGATTTACGACGGC-1ÆCTAGCATAGTATAATG-1ÇCTAGCCGATGTTATGA-1ÈCTAGGCGCCCTATCAG-1ÉCTAGGTCTGAAGGAAT-1ÊCTAGGTTCGGACGTGA-1ËCTAGTAGAAAGGGATT-1ÌCTAGTCACGTCTTAAG-1ÍCTAGTGAAGGACAGGA-1ÎCTAGTTACAACCCGGT-1ÏCTAGTTGGGCCCGGTA-1ÐCTATAAGAGCCAATCG-1ÑCTATACTTAAAGCGAG-1ÒCTATCGACGAAATACA-1ÓCTATCGGGTCTCAACA-1ÔCTATGCCCGAATGCAA-1ÕCTATGGGAAGCGGAAT-1ÖCTATGTCACTAGCCCA-1×CTATGTGAGTCACGGC-1ØCTATTCATGTGTCCCA-1ÙCTATTGTGTTTGGTCA-1ÚCTATTTGCTTGGAGGA-1ÛCTATTTGGTTACGGAT-1ÜCTCAACTAACCCGGAT-1ÝCTCAAGACATTAGCGC-1ÞCTCACATTTACTAAAT-1ßCTCACTGTGATACTTA-1àCTCACTTGGCTGGTAA-1áCTCAGATTGTGATAAG-1âCTCAGTCACGACAAAT-1ãCTCATAAATGTGTATA-1äCTCATGGTAATTTGCG-1åCTCATTGCTCTAACAA-1æCTCATTTGATGGGCGG-1çCTCCCTCCTTTCGATC-1èCTCCGCCCACATGAGG-1éCTCCGGCCTAATATGC-1êCTCCTCCAGCTCACAC-1ëCTCCTTTACGCAAGTC-1ìCTCGAGACATACGATA-1íCTCGAGGTCGAACAGT-1îCTCGATATTTGCGAGC-1ïCTCGCACCTATATAGT-1ðCTCGCATTGCATAGCC-1ñCTCGCCGAATGTAGGG-1òCTCGCTAGGTAAGCGA-1óCTCGGTACCACTGCTC-1ôCTCGGTTGTCGGCCCT-1õCTCGTCGAGGGCTCAT-1öCTCGTCTGTGCCTTCG-1÷CTCGTTTCTAATGTTT-1øCTCTAATGCATTGATC-1ùCTCTACACTGGCGATT-1úCTCTAGCCCTCGGAAA-1ûCTCTATTTGGCTGCAG-1üCTCTCACAATCGATGA-1ýCTCTCTAACTGCCTAG-1þCTCTGGACGCCTGGTG-1ÿCTCTTCTATTGACTGG-1CTCTTGTCCCGCTTGG-1CTGAAAGAGATCCGAC-1CTGAATCCGAGACCTC-1CTGAATTTATTGCCAG-1CTGACTGCGCAGCTCG-1CTGCAAGCACGTTCCG-1CTGCACAACTACATAT-1CTGCACTCCAGTACAG-1CTGCAGAGAATCAGAG-1 CTGCCAAGGTTGGAAG-1 CTGCCATGCATCACAT-1 CTGCCTTTCTAGTAAA-1 CTGCGACCTCGCCGAA-1 CTGCGTTACGATATAA-1CTGCTGAGGCCACGAA-1CTGCTTGGCGATAGCT-1CTGCTTTATGTCCGCG-1CTGGAAATGGATGCTT-1CTGGAAGACACGGTGG-1CTGGACGCAGTCCGGC-1CTGGATTTACACTTGA-1CTGGCATCCGAATGAG-1CTGGCGACATAAGTCC-1CTGGCGATTTACATGT-1CTGGCGCACAGGTCTG-1CTGGCTGATTCATCCT-1CTGGCTGGTTGTCAGT-1CGCGTTCATGAAATAC-1CGCTACGGGACATTTA-1CGCTAGAGACCGCTGC-1CGCTATTCTTAGGCTC-1CGCTCTCCGTAGATTA-1 CGCTGGTGACTACCCT-1!CGCTGTGACGCCGCAC-1"CGCTGTGTGGATGTTG-1#CGCTTATTCCCGGTCG-1$CGCTTCGGTCTAAGAC-1%CGCTTTCTTGCATTCG-1&CGGAAAGAATCAAACG-1'CGGAACGTAAACATAG-1(CGGACCTTTACGTCCC-1)CGGACGTTACTTGAAG-1*CGGAGCAATTTAATCG-1+CGGAGCATGGCGATCC-1,CGGAGTTTGAGAGACA-1-CGGATCCTCAAGGACT-1.CGGCAAACATCGTGCG-1/CGGCAATAAGATCGCC-10CGGCAGGGTCGGGTTG-11CGGCCACGCACAAAGT-12CGGCCCAACCTGTAGT-13CGGCCCAGGTATATCC-14CGGCGCCATCAATCCC-15CGGCTCTAAAGCTGCA-16CGGGAATATAGTATAC-17CGGGAATTTATGTAAA-18CGGGAGCTTCAGTGTA-19CGGGATCAATGTAAGA-1:CGGGCAGCTAAACCGC-1;CGGGCCTTCTTTGTAA-1<CGGGCGATGGATCACG-1=CGGGTGTACCCATTTA-1>CGGGTTTGTTAGGGCT-1?CGGTACGGCAAACCCA-1@CGGTACTAGAATCAAA-1ACGGTAGAGGTGCAGGT-1BCGGTATAGGTATTAGC-1CCGGTCAAGTGGGAACC-1DCGGTCCGTCGCAAGCC-1ECGGTCTATCAACCCGT-1FCGGTGAAGACTAAAGT-1GCGGTGCAGATAGAACG-1HCGGTGCGCGTTGGTCC-1ICGGTGGGCTCCAGCCT-1JCGGTTATCCAACAGTG-1KCGGTTCAAGTAGGTGT-1LCGGTTGACCTGGCATA-1MCGTACCTGATAGGCCT-1NCGTAGAGAGTAATTAT-1OCGTATTAAGAGATCTA-1PCGTCACGTCCATTGGT-1QCGTCCTCATCGCGTGC-1RCGTCGCATGTGAGCCA-1SCGTCGGATAGTGTTGA-1TCGTCGGGTCTAAGCGC-1UCGTCGTCCTTCGCGAA-1VCGTGAAGTTAATTCAC-1WCGTGACATTGGGTCGT-1XCGTGACCAGTCCTCTG-1YCGTGCACACCACTGTA-1ZCGTGCAGACTGGGACA-1[CGATGTTGTTATCTAC-1\CGATTAAATATCTCCT-1]CGATTCGCCTGGCTGC-1^CGCAAACACGAGTTAC-1_CGCAATTAGGGTAATA-1`CGCACATGTCCACTAC-1aCGCACGTGCGCTATCA-1bCGCAGATCTTCACCCG-1cCGCAGGCGATCCAAAC-1dCGCATGCCGAATGCGT-1eCGCATGGTGCGATGCT-1fCGCATTAGCTAATAGG-1gCGCCACAGGTCGCGAT-1hCGCCATCCGATTATGA-1iCGCCCAGCACGCCTAG-1jCGCCCAGCGTTTCACG-1kCGCCCGCTTCCGTACA-1lCGCCGCCCATGCCTGT-1mCGCCGTTCAGCATAGT-1nCGCCTCCCTCCTCTAT-1oCGCCTGGCCTACGTAA-1pCGCGAAGTGGCATACT-1qCGCGACCGCGACAGAT-1rCGCGAGAGGGACTTGT-1sCGCGAGTCTGCCGGGT-1tCGCGCAAATGTCCAGA-1uCGCGCATGTTTGATTG-1vCGCGCCCGACTTAATA-1wCGCGGCTCAACTTGAA-1xCGCGGGAATTAGGCAG-1yCGCGGGAATTCCTTTC-1zCGCGGTCACAAACCAA-1{CGAGAGCGCGTAGATA-1|CGAGAGCTTTCACTAC-1}CGAGAGGGTAGCCGCG-1~CGAGCTGGGCTTTAGG-1CGAGGCTAAATATGGC-1€CGAGGGACTGCGGTCG-1CGAGGGTATCCAGGTG-1‚CGAGTACTAAAGAGGA-1ƒCGAGTGAAGGTACCAG-1„CGAGTTCTGTCCCACC-1…CGAGTTTATCGGACTG-1†CGATACCTCGCGGACA-1‡CGATAGTCGTACTGCA-1ˆCGATCCGACCCAGTGC-1‰CGATCTGTTGGAGGAC-1ŠCGATGGACCCTACGCC-1‹CGACCCTTAACGCCGG-1ŒCGACCTACTAGACAAT-1CGACGCATCCGTACCT-1ŽCGACTCAGGATGTTAT-1CGACTTTGTATAGCCT-1CGAGACCCTAGAGTGT-1‘CGAGACTACTGCTGCT-1’CGAGAGATGTGAACCT-1“CGAATGACGCATAATG-1”CGACAATTTGATCTAA-1•CGACACGCTCCGACAG-1–CGACAGTTCGCGTTAT-1—CGAATCTGCTCGACGC-1˜CGAATGAAGTCATTGC-1™CGAAGTTGCTCTGTGT-1šCGAAGCTATAAATTCA-1›TGAGAGATTTACCACG-1œTGAGATTAGGCCCTAA-1TGAGCCATACAGTCTC-1žTGAGCGGAAAGTGTTC-1ŸTGAGCTTTAATGACGC-1 TGAGGAGTGCCAGCTT-1¡TGAGGCATGTACTGTG-1¢TGAGTAAATTAGCGTA-1£TGAGTGCCTCTTAAAT-1¤TGAGTGGTCCGTGACG-1¥TGAGTGTAACAACGGG-1¦TGAGTTAAAGACATTC-1§TGATACATTTAGCCGT-1¨TGATCAGGGAACTGCT-1©TGATCCCAGCATTAGT-1ªTGATCGGTTTGACCCT-1«TGATCTACGCTGATCT-1¬TGATCTATCACACTCT-1­TGATCTCCGGCGCCAG-1®TGATGGCTGTTTCTGA-1¯TGATGTCAATTAAGTG-1°TGATTATGGCACGCAG-1±TGATTCAGGTCCCGCG-1²TGATTCCCGGTTACCT-1³TGATTCGTCTATCACT-1´TGATTCTGTCGCCGGT-1µTGATTTATTAGCTGTG-1¶TGCAACCCATCTGCGG-1·TGCAACTACTGGTTGA-1¸TGCAAGAATGACGTAA-1¹TGCAATCTAACACGGT-1ºTGCAATTTGGGCACGG-1»TGCACAGTGAAGTTAT-1¼TGCAGAACTATATCGT-1½TGCAGAGTACCGAGCA-1¾TGCAGATCGTCCTAGG-1¿TGCAGCTACGTACTTC-1ÀTGCAGGATCGGCAAAG-1ÁTGCAGTTTCCTCCCAT-1ÂTGCATATGTCTGTCAC-1ÃTGCATGGATCGGATCT-1ÄTGCATGTGGTAATCTA-1ÅTGCCAAAGTCAGACTT-1ÆTGCCAATGGGTACTCT-1ÇTGCCACACTAGAGGAA-1ÈTGCCACCTGGCGAAAC-1ÉTGCCAGTACGTGGAGA-1ÊTGCCATTACTAAAGAA-1ËTGCCCGATAGTTAGAA-1ÌTGCCCGTACCGTTAAA-1ÍTGCCGTGGATCGTCCT-1ÎTGCCGTGGGACCCAAT-1ÏTGCCGTTCTTAATCGG-1ÐTGCCTAATTGAAGATT-1ÑTGCCTGATCAAACGAT-1ÒTGCCTTGGCCAGGCAA-1ÓTGCGAATATGGGATTT-1ÔTGCGACACCCTAGTGC-1ÕTGCGAGAATATTACCC-1ÖTGCGAGATGGCGGCCA-1×TGCGAGCCCTTCCGCG-1ØTGCGCAAAGCATTTGG-1ÙTGCGCGATTAACGGAG-1ÚTGCGGACTTGACTCCG-1ÛTGCGGAGTAAAGGTGC-1ÜTGCGTAAGAACCTGAT-1ÝTGCGTACGGCTAATTG-1ÞTGCGTCATGACTGAGC-1ßTGCGTTTGTTGACACT-1àTGCTAAGTGTCTATTT-1áTGCTCCACAGTTCTTA-1âTGCTCGGCGAAACCCA-1ãTGCTCGGTGGGTCACC-1äTGCTCTTGAGAGTTTG-1åTGCTGTTGAAGAACTC-1æTGCTTCCCAAGCAGTA-1çTGGAACCACTGACACA-1èTGGAAGAAGGGAACGT-1éTGGAAGGATAAAGATG-1êTGGAATATCCTTGACC-1ëTGGACCAATCTAAGAT-1ìTGGACGCAATCCAGCC-1íTGGACTGTTCGCTCAA-1îTGGAGTGATGCGATGA-1ïTGGCAAACTAAATTAC-1ðTGGCAACTCGCGCGCC-1ñTGGCAAGCACAAGTCG-1òTGGCAATGGGACGGCG-1óTGGCAGATTACGATCA-1ôTGGCAGCAGTAATAGT-1õTGGCATGAAGTTTGGG-1öTGGCCAAACTGAAGTA-1÷TGGCCAATTTGGTACT-1øTGGCCGTATATTGACC-1ùTGGCGACTGCTCCAAA-1úTGGCGATCAAGTTATG-1ûTGGCTACACTCTACCT-1üTGGCTATGTGACATAC-1ýTGGCTCTTGTCGCGTA-1þTGGCTTATGTATAATG-1ÿTGGCTTGTACAAGCTT-1TGGGATGCACTCATTC-1TGGGCAATAGTTGGGT-1TGGGCCACAAGAGCGC-1TGGGCCCATACTAATT-1TGGGCGATACAATAAG-1TGGGTGCACAAGCCAT-1TGGGTGGGATGTCATT-1TGGGTGTAATAGATTT-1TGGTAAGCAGGATTGA-1 TGGTAGAATATATGGG-1 TGGTCCCACGCTACGG-1 TGGTCGTGCAAGGCAA-1 TGGTCTGTTGGGCGTA-1 TGGTTAACTTACATTT-1TGGTTAAGGGCGCTGG-1TGGTTCAACGGGTAAT-1TGGTTCGTAGCAAAGG-1TGGTTTAAACGTGGGT-1TGTACCTACACGAGGG-1TGTACGAACAAATCCG-1TGTACTTCCGGGCATG-1TGTAGCCAATTCCGTT-1TGTAGCCATCCCATTC-1TGTAGGAGAAATTTCC-1TGTAGTGATCTATAAT-1TGTATAACAGATCCTG-1TGTATCAGACTGAAGC-1TGTATGGCGCAGACAG-1TGTCATTTGTTGGGAA-1TGTCCACGGCTCAACT-1TGTCCTAAGTCACCGC-1TGTCGTTATCACATAT-1 TGTGACTACGCCAGTC-1!TGTGACTAGAGTTTGC-1"TGTGAGACTAGCCCAA-1#TGTGCCAGAGGCAAAG-1$TGTGCCGGTGCCGGAA-1%TGTGGCAAAGCGTATG-1&TGTGGCGGGCTTCTGG-1'TGTGTCGAAGTCGAGG-1(TGTGTGACCATGAATC-1)TGTTATTGTATGTGGC-1*TGTTCCGCTTCCATGA-1+TGTTCCGGCCTGAGCT-1,TGTTCGTATTGCGGTG-1-TGTTCTTCCATTGACT-1.TGTTGTCAAGAAGTCT-1/TGTTTCTGAAGCGTGC-10TGTTTGAGATCGTCAG-11TTAAACTCGAATTCAT-12TTAAAGTAAGTCGCCA-13TTAACCAACCCTCCCT-14TTAACGAACAAGCAGT-15TTAACTTCAGGTAGGA-16TTAAGATAGGATTGAC-17TTAAGCGCCTGACCCA-18TTAAGGCCCGTACTTT-19TTAAGTATTGTTATCC-1:TTAATCAGTACGTCAG-1;TTAATGTAGACCAGGT-1<TTAATTGCTTTGGGTG-1=TTAATTTCAGACGCGG-1>TTACAACTACGCATCC-1?TTACACGATCTGCGAC-1@TTACAGACCTAAATGA-1ATTACATGCCACAACTA-1BTTACCATTGATTACCC-1CTTACCCATTGCCGGGT-1DTTACCCTAGGGATTGG-1ETTACGGATGGTTCGAG-1FTTACTAAAGGACTTTA-1GTTACTCCGGCCGGGAA-1HTTACTCTGGTACGTAC-1ITTACTGGGATATTTCA-1JTTACTGTCTAGAGCTC-1KTTAGAAGAACATGACT-1LTTAGAATAAGGGTCGG-1MTTAGACACGATCGTTG-1NTTAGACGAGTCACCTC-1OTTAGAGGGATATACAG-1PTTAGAGTTTAGAAGGA-1QTTAGCTAATACGATCT-1RTTAGCTGATTTGCCGT-1STTAGTAAACCTGCTCT-1TTTAGTAGGGCGGCGGG-1UTTAGTTATTCGTGGCA-1VTTAGTTCAAGTGTTCG-1WTTATAGGTAATTGTCT-1XTTATATACGCTGTCAC-1YTTATATTTGGCAATCC-1ZTTATCCGGGATCTATA-1[TTATCCTCAAGGAATA-1\TTATCTGACATTAGGA-1]TTATCTGTATCATAAC-1^TTATGAATGAAAGGGA-1_TTATGACAAACTGGAT-1`TTATGATCTTAACGAA-1aTTATTAGAGCGTGTTC-1bTTCAAAGTCTCTAGCC-1cTTCAATACTCTGAATC-1dTTCACGAAAGGATCAC-1eTTCACTCGAGCACCTA-1fTTCAGCCCTGGTCCAC-1gTTCAGCTGGCGTGCCC-1hTTCAGGCGTCAAAGCC-1iTTCATGGCGCAACAGG-1jTTCCAATCAGAGCTAG-1kTTCCAATCTGGCTATC-1lTTCCACACAGATTTGA-1mTTCCAGACGAGATTTA-1nTTCCATCATGCGGTGA-1oTTCCATCGACAGCGTG-1pTTCCCGGCGCCAATAG-1qTTCCGCAGAGAAATAT-1rTTCCGCGTGAGGCGAT-1sTTCCGGCCTTGAGGCT-1tTTCCGGCTCGACTTCT-1uTTCCGGTTACCCACTT-1vTTCCTCGAGGGTGTCT-1wTTCCTCGGACTAACCA-1xTTCGACAGAGCCCGTG-1yTTCGACGGGAAGGGCG-1zTTCGCACTCGCGTGCT-1{TTCGCACTGTACGACA-1|TTCGCCGCTCGCGCTA-1}TTCGCGCGCCATACGA-1~TTCGCTATCTGACGTG-1TTCGGCAACCCGCTGA-1€TTCGGGACTAATCGCG-1TTCGGGCGCTAGTCTT-1‚TTCGGTACTGTAGAGG-1ƒTTCGTACTCCAGAACG-1„TTCGTTCAACGAAGTT-1…TTCTAACCGAAGCTTA-1†TTCTAGAAAGTCTTAT-1‡TTCTAGGCCAATTGTG-1ˆTTCTATTAAACGCAGC-1‰TTCTCTTACAGGTGAT-1ŠTTCTGACCGGGCTCAA-1‹TTCTGCCGCGCCTAGA-1ŒTTCTGCGGGTTAGCGG-1TTCTGCTAGACTCCAA-1ŽTTCTTATCCGCTGGGT-1TTCTTGAGCCGCGCTA-1TTCTTGCTAGCATCTC-1‘TTCTTGGACGATCTGC-1’TTCTTGGAGTAATGAG-1“TTCTTTGGTCGCGACG-1”TTGAAAGGTGTAAAGG-1•TTGAACGACGTGCTGA-1–TTGAAGAATTCCCAGG-1—TTGAAGGATGGGCGCC-1˜TTGAATATGGACTTTC-1™TTGAATCGTTGTATAA-1šTTGAATTCACGTGAGG-1›TTGACAGGAGCTCCCG-1œTTGACATGAACGTGGA-1TTGACCAGGAACAACT-1žTTGACCATGTTCTCCG-1ŸTTGACCGTGTTAATGA-1 TTGACGCTCCATGAGC-1¡TTGACTACCATATGGT-1¢TTGACTATTGTCCGGC-1£TTGAGAAGTTTAGCAT-1¤TTGAGAGTACTGCTAA-1¥TTGATAGTCAATACAT-1¦TTGATCTAACTTTGTC-1§TTGATGTGTAGTCCCG-1¨TTGATTAGCTGTTTCT-1©TTGATTATGCAGATGA-1ªTTGCAAGAAGACTCCT-1«TTGCACAATTCAGAAA-1¬TTGCACGGAGCAGCAC-1­TTGCATGCTGATCACG-1®TTGCCAAGCAGAACCC-1¯TTGCCATAGCCCGCTC-1°TTGCCCTGATCACGGG-1±TTGCCGCAGACCTACA-1²TTGCCGCTTTCTAGTA-1³TTGCCTTCTCGCCGGG-1´TTGCGCTTGATCAATA-1µTTGCGGCATCAGAAAG-1¶TTGCGTCGGCCAACCG-1·TTGCGTGAACGCTTAG-1¸TTGCGTGTGTAGGCAT-1¹TTGCTCATAGTACGTG-1ºTTGCTCCCATACCGGA-1»TTGCTGAAGGAACCAC-1¼TTGCTGATCATGTTCG-1½TTGGAAGAATACAGTC-1¾TTGGACATGTGGCTTA-1¿TTGGACCATCTGGCAA-1ÀTTGGACCTATAACAGT-1ÁTTGGATATCGTCTACG-1ÂTTGGCCTAGAATTTCG-1ÃTTGGCTCAATATGTGT-1ÄTTGGGAAGACGAGCCG-1ÅTTGGGACACTGCCCGC-1ÆTTGGGACGTAAGAGTT-1ÇTTGGGCGGCGGTTGCC-1ÈTTGGTCACACTCGTAA-1ÉTTGGTTGCGGTGCGCG-1ÊTTGTAAGGACCTAAGT-1ËTTGTAAGGCCAGTTGG-1ÌTTGTAATCCGTACTCG-1ÍTTGTACACCTCGAACA-1ÎTTGTCACCGCGGTATC-1ÏTTGTCGTTCAGTTACC-1ÐTTGTGAACCTAATCCG-1ÑTTGTGAGGCATGACGC-1ÒTTGTGATCTGTTCAGT-1ÓTTGTGCAGCCACGTCA-1ÔTTGTGCGGAAGCGGAT-1ÕTTGTGGCCCTGACAGT-1ÖTTGTGGTAGGAGGGAT-1×TTGTGGTGGTACTAAG-1ØTTGTGTATGCCACCAA-1ÙTTGTGTTTCCCGAAAG-1ÚTTGTTCAGTGTGCTAC-1ÛTTGTTGTGTGTCAAGA-1ÜTTGTTTCACATCCAGG-1ÝTTGTTTCCATACAACT-1ÞTCCATCAATACTAATC-1ßTCCCAAACAGACAACG-1àTCCCAAAGACGAAGGA-1áTCCCACTCTCTTCCGG-1âTCCCAGCTTTAGTCTG-1ãTCCCAGGCTTAGCTAA-1äTCCCGCGTACTCCTGG-1åTCCCGGGTGTGCTGCT-1æTCCCGTCAGTCCCGCA-1çTCCCGTCGCGTCATAG-1èTCCCGTGTGCAATTTG-1éTCCCTAGATCAATAGG-1êTCCCTGGCGTATTAAC-1ëTCCCTGGCTCGCTGGA-1ìTCCCTTAGATTACTCG-1íTCCGAAGTAGTCACCA-1îTCCGAATGGTCCTGAG-1ïTCCGATAATTGCCATA-1ðTCCGATGACTGAGCTC-1ñTCCGATGGTGCGACAT-1òTCCGATTACATTGCCG-1óTCCGCCTGTCTACAAG-1ôTCCGCGGCAGCATCTG-1õTCCGCGGCCCAATGAA-1öTCCGCTGTCATCCCGG-1÷TCCGCTTATCCCATTA-1øTCCGGAGGAAGGGCTG-1ùTCCGGCCTAGCGTACA-1úTCCGGGCTTGACGGGA-1ûTCCGGTTCGTCCGGTC-1üTCCGTTAAGCTAATAT-1ýTCCGTTTAGCCTTGAA-1þTCCTAAAGATTCAGAC-1ÿTCCTAAATTGGGAAGC-1TCCTAACCGTCGGGCA-1TCCTACATCCACGGCC-1TCCTAGCAAAGAAGCT-1TCCTCCTAAGACATTC-1TCCTCGGGCTGGGCTT-1TCCTCTACGAGATGGC-1TCCTGCCAACTGGAGA-1TCCTGCGTTGATACTC-1TCCTGGCGCTGCCTGG-1 TCCTTACGACGGTCCG-1 TCCTTCAATCCCTACG-1 TCCTTGTCCTTTAATT-1 TCCTTTAAATCCGCTT-1 TCCTTTCTTACGCTTA-1TCGAAATTTAGGACCA-1TCGAAGAACCGAGCAC-1TCGAATATCCCGCAGG-1TCGACAACTGAACCCG-1TCGAGACCAACACCGT-1TCGAGTCTACGATTCG-1TCGCAAAGATGCATTT-1TCGCACCAGGAGGCAG-1TCGCATAAAGGGCGCA-1TCGCCGAAGTTGCGTC-1TCGCCGACATATTCGC-1TCGCCGCACCGCGTGA-1TCGCCGGTCGATCCGT-1TCGCGTAGCAGTGTCC-1TCGCGTCCAGAAGGTC-1TCGCTAAACCGCTATC-1TCGCTACTGGCTTTGA-1TCGCTCGATATATTCC-1 TCGCTCGGCACCAGCG-1!TCGCTGCCAATGCTGT-1"TCGCTGGGCGGATTGT-1#TCGCTTTAAACGTTTG-1$TCGGAATGCGCTCTGA-1%TCGGACGCCCAGCCCA-1&TCGGAGAGTATCGGGA-1'TCGGAGTACATGAGTA-1(TCGGCGAACCCAAACC-1)TCGGCGTACTGCACAA-1*TCGGCTTGTATCGACG-1+TCGGGAACGTGCCTAG-1,TCGGGAGACAGCGTAC-1-TCGGGCCGTCGTGGTA-1.TCGGTCCCGACAATAG-1/TCGGTGACCGCTCCGG-10TCGTAAGACGACATTG-11TCGTAAGCTCCGAGGA-12TCGTACCGACGTCAAG-13TCGTATTACCCATTGC-14TCGTCAAGTACGCGCA-15TCGTCTTAGGCGTTAA-16TCGTGTACTATGGATG-17TCGTGTCACGCTGACA-18TCGTGTTCGACCACAA-19TCGTTAGGAGTCCCTA-1:TCGTTGCTATCCGGTC-1;TCGTTTACGCGACCCT-1<TCTAAAGAACAGTCTC-1=TCTAACCTAGCCTGCG-1>TCTAATACTGCCTCAG-1?TCTACCCAATAGAGAG-1@TCTACCCGCATCATTT-1ATCTACCGTCCACAAGC-1BTCTAGCAATCTCCGCC-1CTCTAGCATCTTCGATG-1DTCTAGCATGCCCAGAA-1ETCTAGGTGGCGACGCT-1FTCTAGTGATATCGTGG-1GTCTAGTTATCAGAAGA-1HTCTATAGGTGGGTAAT-1ITCTATCGGTCGCAACA-1JTCTATGCTATAACGAC-1KTCTATTACTAGAGGAT-1LTCTCAAATCAATCGGG-1MTCTCATGAGATAGGGT-1NTCTCCAACGTAGGTTA-1OTCTCCACAAGTTGAAT-1PTCTCCCTGGGCAGCGT-1QTCTCGAACGAGGTCAC-1RTCTCGACGTATCGCCG-1STCTCGAGGAGGTTCGC-1TTCTCGTGTTACGAGGA-1UTCTCTAATAGCTGGTA-1VTCTGAACTCGTACCCG-1WTCTGAAGCACGTGGTC-1XTCTGAATTCCGTACAA-1YTCTGAGCAATTGACTG-1ZTCTGATGTATTCTGTC-1[TCTGCATACCTTGCTT-1\TCTGCCAGAAACTGCA-1]TCTGGGAACCTTTGAA-1^TCTGGGTAGCGCTCAT-1_TCTGTGCCATCATAGT-1`TCTGTTACCCAGCATA-1aTCTTACCGGAACTCGT-1bTCTTACTTATGCCTCT-1cTCTTAGAGCTCCAATT-1dTCTTAGAGTGAACTCT-1eTCTTCCCATGGGCACA-1fTCTTCGAATAGACGTT-1gTCTTCGATACCAATAA-1hTCTTCTATAACCCGCC-1iTCTTGATGCGTAGCGA-1jTCTTGCTCCCGATACT-1kTCTTGGTAACACCAAA-1lTCTTTAAGACTATGAA-1mTCTTTAGAGTCTAACA-1nTGAAAGGACCTGACTC-1oTGAACTGCTATGACTT-1pTGAATACCGACGCGTA-1qTGAATATGCTATAAAC-1rTGAATGTCAGCCGGCC-1sTGAATTTCACTTGCCT-1tTGACACTTCTCTTTGC-1uTGACAGGACAAGTCCA-1vTGACATATATGACGAT-1wTGACATCGAGCGGACC-1xTGACATGTAACGTGAC-1yTGACCAAATCTTAAAC-1zTGACCCACGTTAGACA-1{TGACGAATATTTCCCT-1|TGACGATGCACTAGAA-1}TGACTATAATCCTTTC-1~TGACTCCGAATCATAC-1TGAGACGTACCTCTCA-1€TATGGGTACGTATCGT-1TATGGTCTGAGTAACA-1‚TATGGTTAGTGGGAGA-1ƒTATGTAGAAACCCGGC-1„TATGTCAAGACCGACT-1…TATGTCTCATTGTGCC-1†TATTAACACCAAAGCA-1‡TATTAACCTGACCGCG-1ˆTATTACCATCCTGCTT-1‰TATTATGTTTGCCTGC-1ŠTATTCAATTCTAATCC-1‹TATTCCACTCAGCTCG-1ŒTATTCCGAGCTGTTAT-1TATTCCTCCGCCCACT-1ŽTATTCGTGCCAGAATA-1TATTGCCGGGCTTGTA-1TATTTAGTCTAGATCG-1‘TATTTATACCGAGTAG-1’TATTTGTTACCCTTTA-1“TCAAACAACCGCGTCG-1”TCAAACTTAGATTGTT-1•TCAAAGAGCTATCTGT-1–TCAAATTGTTGTGCCG-1—TCAAATTTGAGACTCA-1˜TCAACAAAGATAATTC-1™TCAACATAGCGCCCTA-1šTCAACATCGACCGAGA-1›TCAACCATGTTCGGGC-1œTCAACGAGGAGACAAA-1TCAACGCAGGAAATAA-1žTCAACGCGACCGGCAG-1ŸTCAACTGCAGAGTCAG-1 TCAAGAAATACTAGCT-1¡TCAAGCGCGGACGGTA-1¢TCAAGGTTACTACACC-1£TCAATACGCCGTCATG-1¤TCAATCCGGGAAGTTT-1¥TCACAAACCGAGGTAC-1¦TCACAGCAAACTCGAA-1§TCACAGGAGAATAAGA-1¨TCACAGGGAATCGCAA-1©TCACAGGTTATTGGGC-1ªTCACCCTCTTAAGATT-1«TCACCGCTCGGCACTC-1¬TCACGATGTCCGTGGA-1­TCACGCATTGTAGATC-1®TCACGGTCATCGCACA-1¯TCACGTGCCCGATTCA-1°TCACTACGACCAATGC-1±TCACTATCCCTTCGGT-1²TCACTCGTGCAACGGC-1³TCAGAACCTCCACAGG-1´TCAGACGCTATAGAAG-1µTCAGCAAATGCATCTC-1¶TCAGCCAATCCGTAAA-1·TCAGCTTGAGCTTTCG-1¸TCAGGGTGTAACGTAA-1¹TCAGGTTCTTTGAGAA-1ºTCAGTACTGACCCGCG-1»TCAGTAGGGACTATAA-1¼TCAGTGTATACGTCAT-1½TCATATGAGCTTTGTT-1¾TCATCCTCAGCTGCTT-1¿TCATCGACGACCGTCG-1ÀTCATCGATGGTCCCAA-1ÁTCATGCAGGTTCTCAT-1ÂTCATTTAAGTCTCCGA-1ÃTCATTTAGAAGTGTGA-1ÄTCCAACTCAGCTATCT-1ÅTCCAACTTTAAATTCT-1ÆTCCAAGCCTAGACACA-1ÇTCCAATAAAGGCTACC-1ÈTCCACAATGGTTTACG-1ÉTCCACATCGTATATTG-1ÊTCCACCAAGACATAGG-1ËTCCACCTCTAGCCTTT-1ÌTCCACTTTATCTAGGT-1ÍTCCAGAGCACCGGTTC-1ÎTCCAGATGTACGCCAA-1ÏTCCAGGCGAGTACGGT-1ÐTCCAGGGTATATACGA-1ÑTAGGGTGTTTCAAGAG-1ÒTAGGTCGCCGGAACTG-1ÓTAGGTGACGATAACCT-1ÔTAGGTGAGCCCTACTC-1ÕTAGGTGCTCGCCTAGC-1ÖTAGGTGTTCCACAGAT-1×TAGGTTCGAGTTCGTC-1ØTAGTACCACAACTTTC-1ÙTAGTAGCTTATACCAG-1ÚTAGTCCGCAGAGAATG-1ÛTAGTCGATCACGGGTT-1ÜTAGTCTAACAACGAGA-1ÝTAGTCTGTGACGTTGC-1ÞTAGTGCCCTCCAGAGT-1ßTATACACAGACGCCTT-1àTATACGCGTCATCACT-1áTATAGATGGTCGCAGT-1âTATAGCGCACGTTATC-1ãTATATATCGAGAAATG-1äTATATCCCTGGGAGGA-1åTATATTACAAATGTCG-1æTATCACCCAACCGACC-1çTATCACTTCGAGTAAC-1èTATCAGTGGCGTAGTC-1éTATCCAATTGGTTATC-1êTATCCATCTCGGTTAG-1ëTATCCGCACCGTCGGG-1ìTATCGATCTATGCATA-1íTATCGATGATTAAACG-1îTATCTACCACAGCGGG-1ïTATCTGAGCCGATATT-1ðTATCTTGCAATACAAC-1ñTATGAAGAATTAAGGT-1òTATGACCTTGCGCTGG-1óTATGATCCGGCACGCC-1ôTATGATCTTCTCTTTA-1õTATGCTCCCTACTTAC-1öTATGGATGTGCTACGC-1÷TATGGCCCGGCCTCGC-1øTATGGGACCGAGCAGG-1ùTAGATATGGACTGGAA-1úTAGATGGTTCCTTACT-1ûTAGCAGATACTTAGGG-1üTAGCAGTATGACTAAA-1ýTAGCCATTTCAAAGTC-1þTAGCCGGCGGTCAGCG-1ÿTAGCGTCCCTCGATTG-1TAGCGTCCGGTGTGGT-1TAGCGTTGGGTCTTAC-1TAGCTAAGTCCGGGAG-1TAGCTAGAAGGCATGA-1TAGCTAGTGATGATGG-1TAGCTCGCCTGATAAC-1TAGCTGATGTGAAGCG-1TAGGAGGCTCGAGAAC-1TAGGCATGTTACGCCA-1 TAGGCCTATATAGTCT-1 TAGGCGATGAGGTCTC-1 TAGGCTAAAGTGGCAC-1 TAGGGAGCTTGGGATG-1 TACTTTACTGAGCCGG-1TACTTTCCGCACGCCA-1TAGAAAGGTGGCGCTA-1TAGAATAGCCGATGAA-1TAGACGAAACGCCAAT-1TAGACGCCCGTACCGG-1TAGACTACCTAGCGTT-1TAGAGATCATGCAACT-1TAGAGGTTCTACTTGT-1TAGAGTCTAAGCGAAC-1TACTGAGGGAAGAAAG-1TACTGCAATCAATTAC-1TACTGGACAGCTCGGC-1TACTTAAACATGTACA-1TACTTGTTAGTAGTCC-1TACTCTTACTTTACTG-1TACTCTTTCGTCTTCA-1TACTGAACAGATTTAG-1TACTCTCCGAACAAAT-1 TACTCGTTTGAATCAA-1!TACTATGGTTCCTCAG-1"Gene Expression#Gene Expression$Gene Expression%Gene Expression&Gene Expression'Gene Expression(Gene Expression)Gene Expression*Gene Expression+Gene Expression,Gene Expression-Gene Expression.Gene Expression/Gene Expression0Gene Expression1Gene Expression2Gene Expression3Gene Expression4Gene Expression5Gene Expression6Gene Expression7Gene Expression8Gene Expression9Gene Expression:Gene Expression;Gene Expression<Gene Expression=Gene Expression>Gene Expression?Gene Expression@Gene ExpressionAGene ExpressionBGene ExpressionCGene ExpressionDGene ExpressionEGene ExpressionFGene ExpressionGGene ExpressionHGene ExpressionIGene ExpressionJGene ExpressionKGene ExpressionLGene ExpressionMGene ExpressionNGene ExpressionOGene ExpressionPGene ExpressionQGene ExpressionRGene ExpressionSGene ExpressionTGene ExpressionUGene ExpressionVGene ExpressionWGene ExpressionXGene ExpressionYGene ExpressionZGene Expression[Gene Expression\Gene Expression]Gene Expression^Gene Expression_Gene Expression`Gene ExpressionaGene ExpressionbGene ExpressioncGene ExpressiondGene ExpressioneGene ExpressionfGene ExpressiongGene ExpressionhGene ExpressioniGene ExpressionjGene ExpressionkGene ExpressionlGene ExpressionmGene ExpressionnGene ExpressionoGene ExpressionpGene ExpressionqGene ExpressionrGene ExpressionsGene ExpressiontGene ExpressionuGene ExpressionvGene ExpressionwGene ExpressionxGene ExpressionyGene ExpressionzGene Expression{Gene Expression|Gene Expression}Gene Expression~Gene ExpressionGene Expression€Gene ExpressionGene Expression‚Gene ExpressionƒGene Expression„Gene Expression…Gene Expression†mm10‡mm10ˆmm10‰mm10Šmm10‹mm10Œmm10mm10Žmm10mm10mm10‘mm10’mm10“mm10”mm10•mm10–mm10—mm10˜mm10™mm10šmm10›mm10œmm10mm10žmm10Ÿmm10 mm10¡mm10¢mm10£mm10¤mm10¥mm10¦mm10§mm10¨mm10©mm10ªmm10«mm10¬mm10­mm10®mm10¯mm10°mm10±mm10²mm10³mm10´mm10µmm10¶mm10·mm10¸mm10¹mm10ºmm10»mm10¼mm10½mm10¾mm10¿mm10Àmm10Ámm10Âmm10Ãmm10Ämm10Åmm10Æmm10Çmm10Èmm10Émm10Êmm10Ëmm10Ìmm10Ímm10Îmm10Ïmm10Ðmm10Ñmm10Òmm10Ómm10Ômm10Õmm10Ömm10×mm10Ømm10Ùmm10Úmm10Ûmm10Ümm10Ýmm10Þmm10ßmm10àmm10ámm10âmm10ãmm10ämm10åmm10æmm10çmm10èmm10émm10êENSMUSG00000025935ëENSMUSG00000025937ìENSMUSG00000067813íENSMUSG00000025932îENSMUSG00000054493ïENSMUSG00000025930ðENSMUSG00000032769ñENSMUSG00000092083òENSMUSG00000025925óENSMUSG00000032719ôENSMUSG00000067795õENSMUSG00000043716öENSMUSG00000025921÷ENSMUSG00000100868øENSMUSG00000025920ùENSMUSG00000089982úENSMUSG00000025939ûENSMUSG00000079658üENSMUSG00000097744ýENSMUSG00000025940þENSMUSG00000025779ÿENSMUSG00000101640ENSMUSG00000042686ENSMUSG00000100110ENSMUSG00000025777ENSMUSG00000099899ENSMUSG00000067780ENSMUSG00000100053ENSMUSG00000085125ENSMUSG00000025776ENSMUSG00000099895 ENSMUSG00000025774 ENSMUSG00000073735 ENSMUSG00000067773 ENSMUSG00000089787 ENSMUSG00000042596ENSMUSG00000025927ENSMUSG00000100538ENSMUSG00000043760ENSMUSG00000089914ENSMUSG00000099906ENSMUSG00000025929ENSMUSG00000041872ENSMUSG00000041859ENSMUSG00000102121ENSMUSG00000097934ENSMUSG00000025931ENSMUSG00000041809ENSMUSG00000041779ENSMUSG00000099971ENSMUSG00000067879ENSMUSG00000099827ENSMUSG00000025912ENSMUSG00000045210 ENSMUSG00000097893!ENSMUSG00000025915"ENSMUSG00000046101#ENSMUSG00000098234$ENSMUSG00000099032%ENSMUSG00000025916&ENSMUSG00000087199'ENSMUSG00000025917(ENSMUSG00000056763)ENSMUSG00000067851*ENSMUSG00000042501+ENSMUSG00000048960,ENSMUSG00000057715-ENSMUSG00000097171.ENSMUSG00000101314/ENSMUSG000000169180ENSMUSG000000259381ENSMUSG000000994982ENSMUSG000000424143ENSMUSG000000058864ENSMUSG000001014765ENSMUSG000000259056ENSMUSG000000337747ENSMUSG000000259078ENSMUSG000000900319ENSMUSG00000087247:ENSMUSG00000033740;ENSMUSG00000051285<ENSMUSG00000097797=ENSMUSG00000103067>ENSMUSG00000025909?ENSMUSG00000061024@ENSMUSG00000025911AENSMUSG00000025903BENSMUSG00000104217CENSMUSG00000033813DENSMUSG00000002459EENSMUSG00000085623FENSMUSG00000033793GENSMUSG00000025902HENSMUSG00000104328IENSMUSG00000033845JENSMUSG00000102343KENSMUSG00000025900LENSMUSG00000089699MENSMUSG00000051951NTram1OLactb2PXkr9QEya1RGm9947SMscTTrpa1UKcnb2VTerf1WSbsponX 4930444P10RikYRpl7ZRdh10[Gm28095\Stau2]Gm7568^Ube2w_Eloc` D030040B21RikaTmem70bLy96cGm28376dJph1eGm28783fGdap1gGm28784hPi15iGm28154jGm16070kCrispld1lGm28153mCrisp4nDefb18oDefb41pGm15825qTfap2drTfap2bsGm28340tPkhd1u 4930486I03RikvGm28653wIl17axIl17fyMcm3zGm28065{ 6720483E21Rik|Paqr8}Efhc1~Tram2Gm28287€ 3110035E14RikGm29520‚Mybl1ƒVcpip1„ 1700034P13Rik…Sgk3†Mcmdc2‡Snhg6ˆTcf24‰Ppp1r42ŠGm15818‹Cops5ŒCspp1Arfgef1ŽCpa6Prex2 A830018L16Rik‘Gm17644’Gm29663“Sulf1”Slco5a1•Gm29283–Prdm14—Ncoa2˜Gm29570™Oprk1šNpbwr1›Rb1cc1œ 4732440D04RikAlkal1žSt18ŸPcmtd1 Gm26901¡Gm30414¢Sntg1£Rrs1¤Adhfe1¥Lypla1¦Gm37988§Tcea1¨Rgs20©Gm16041ªAtp6v1h«Sox17¬Gm37323­Mrpl15®Gm37381¯Rp1°Gm1992±Xkr4¨+³Äÿÿÿÿÿÿÿÿ  deflateÀ%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð#dýin,s BxÜ(I}Ò0%‚î8÷†ã@å‹HÈÙPÝ•ØX¶š`ŽŸh’¤Æp¡©xg®ã€x³ßˆ[¸ó:½ä˜-ÂÓ Çô¨äË °ØÐÒ¸åÕ À·ÚȳÄÿÿÿÿÿÿÿÿ  deflate%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÂÝŽã¡é•¿îŽ Tô¯(âùÂ0‘ÿ”8SŽ@ç lHu»Pá€Xœl`!ƒhˆ&œp ,7x§1ƒ€Þ6zˆa<„ÛA¼˜_G± M½¨ÌR‚°‰X­¸ ^šÀ¸cȈ ÿÿÿÿÿÿÿÿ  deflate@%%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0 Rg?‚sÿÿÿÿÿÿÿÿ  deflate€.%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%ÁwØ6ø8TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€:(HEAPX09feature_typegenomeidname(dÿÿÿÿÿÿÿÿ deflateÈ;%z‚]PSNODp9øC 8M(xVTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcdÿÿÿÿÿÿÿÿ deflateE%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýbdÿÿÿÿÿÿÿÿ deflateHN%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿadÿÿÿÿÿÿÿÿ deflateˆW%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa¸_x^í“ÇRQ‡â¿À†/†d%H"I@É9#9ç$ð† »™^³ìÞuï„;U“‰¢è¹ +zã%DQNŸcÏMøÿسþ{Hø=ò˜÷¿Dþ ó®á7ÈßÂïßž=ø~ìù ?@ý0öLÂP?Æþø)î9üsÌ»À=c˜÷óÆÑ?þIì›B~ófà³Ø?ŸG~¾ˆüîYF~%¤ï_Eÿ|ý¨o·Búýÿпüê…èÿÒï)‚#_ÒÿO)æ—ÁËá˜WÒßë#öW¡¿:¤ß÷ õϘ_ƒz-æ×a=ú¿ ߀ý¨7¡ÞŒý-¨·¢¿ õvxGìy ïDý+îw£¿õ^xòýxß÷þžÈ"?ÿÒßã'úaþ0úGà¿á0oô­(""""""""""""""""""""""""""""ïÊ+üŸþx^íеVCQÑÈÃ-×Á݂ۿò]¸»-¨`jÊ™æ¬Ýž8„pœJ„â_>„÷áxÞ…÷àu8oÀ›ð¼ OÃ3ð,<Ïà ð"¼/Ã+ð*¼·Áípœ†;á œ…»àn¸ÎÁ½pÜÀƒð< À£ð<OÀ“ð|’üëSø >‡/àKø ¾†oà[ø¾‡àGø ~†_àWø ~‡?àO8àï\ÂI8‚‹àb¸.…Ëàr¸®„«àj¸NÁ1\ ×ÁõpÜ7ÁÍp ÜýŒ™™™™™™™™™™™™™™™™™™™™™™™™™™™™ýc_?˜umx^íÇÅR‚a@ÑÏ™ÿ|i[±» »,»»ã-vÎ]»¼gw¢Bª° äýD!Dþâ_øþŽàø#þ„?ã/ø+~‚Ÿâgø9~_âWø5~ƒßâwø=>/à‹ø¾Œ¯à«ø¾Žoà›xÏà[ø6¾ƒïâ{xßÇð~ˆáÇx^Œ—à¥x /ÃËñ ¼¯Â«ñ¼¯Ããx=Þ€7âMx3Þ‚·âmx;Þwâ]x7Þƒ÷â}x?>€âCø0>‚â <‰áãx ŸÀ'ñ)|ŸÁgñ¹|$I’$I’$I’$I’$I’$I’$I’ô¯~Þ]–—x^íÇENPÑOÒ}Ó+àZ(îPÜÝiq)^Üîà ¬È¬YÎl&/BøŠå„Ÿ>#!Dÿø~ƒßágø~…oá;ø~€á'ø>†Oà,| ŸÁçð| _Á×ð <ÏÂsð<¼/ÂKð2œ‚Óð ¼ ¯Áëð¼ oÁÛð¼ gà=x>€á\8· àB¸.†KàR¸ .‡+à8\ WÁ ¸®ká:¸n€á&¸n[á6¸î€;á$ÜwÃ=p/Ü÷Ãð <Ã#ð(<Ãð$<OG~gffffffffffffffffffffffffffffÿØ7ÅsÓx^™é®¤5 ›aß7Þÿ1™]šÒ‘ûŽÄ£$Ž·ØÎòu¿{<ïÞãó÷øä ÆŸfüÙs ñÕÿò9V2Ðäß>[mÀSýò_>H§¿>ý¤}9uT7²»Ö/žôÚ”¿þÿñœWFÝ@ÿ®µ€®¥¶ËóÏãƒo´oùâxã ðMZçvÝõ_}ÊVüøø°¶Í™-|Æ¥²ÀøÔÛµ[`Wë銥<µ%à§.œ“O}ø¡´_¥ŸõQZ}øûñ_˜ÿ>|Ý ú·9­ŸE÷NmvmÕµm×)¾{Òœ_ÝåUòšçÒ‹_ž­uBLWÏêßyÆ/!¼V®ñ1êxÕâ[í´ViOÿªcÑxÔ§ú»ýÚ[9ñÓãÃ:ߊù+¨³gÅΙÿ÷òµ®vŸ©ç‡ð4Fî³òÙ·¥îɾ^qùùI'·î¹ž#ÅÆª¶×wæØöá+O«<­¹Á×(ä×oÆ[7 øäáÔëÙ1y+móAëåÝTך¥·Fwž³¿¼øÐ˜Tï¯Ï±ww׿õÒÌõ,»l€ß2W™ÆK^û¾@k€¸šÃµ ¸{h©ïìµgï\À»–V•ç\dŒœgù®×ÒßwðÛ£çS}Øx¸´)_}þгoívl¿ºõÍzvÍÀøU¦ké½H.vÞX]¹¤¿{»óÀ:q/]kX™Åíâ—ÆY}ñ¼|æ»2­›¾]kîÚûèœãëP·±í°ýªŽæ™1ûI™ò_¶.ì7õÖ•(ýz«×yvn¡nÇ­‡Ú¤oÉßœWVï;ùÖ‡•¯n`nåÛ³`û}7밺ѥŸ½›·ÖÔåc¿¹^ù²¹iJÖí[oœž+;WûW½sÎ(W^ѹßý\ãµGV/h>¥—§ýŸß9¥›;Ûæ[›µ¥m­ëïúd~*Ï»¹Íoe}çÂÓ8î÷7iëKõsöà3rÞÂ-Ms¶¹ß±ñó¬Øyß êýëÙ‡ÿªËûÀØõÛÈu6¿o¡¾ÿŠÚ©ß{oï¼Ø8_v‹W9uÒÕë¾_;…1aîªW¨Ïøåú_y­ƒkìºâ±ý·jOè—ôžçµ#/4c¼ob[¾éSßÞ÷ô×Ðû¾kýÒV^ºöœ¿ò¬L74“¾§û}wA]Í­ü½ó6÷bc¼ó‚ßýëë§Wò¯ö}ÏÐ7€zºß­}§t}—ÎiËÿ1¤í9µ:Û·Ëïÿ1×Û¾`n¿—ê«ç`e®ïZu­þòl½‚ž{­SõÙï»g÷ûúr­Cô÷RÚ+w«kmˆž•]»:7û^[ÄâUŽAããÿ'K/¿ï­ÿƒ=‡l[ÿÀ="ºÓï«Î×Nulìíû»ûž¾¬Ç«§ë¸|¹âxõ—oõmt kÛߨ ÷7Úë}¡Î‹V½€½ºgêêÝ=Pÿ"x^•™çªmEÏ5çŒ("‚ïÿR¸ Š^ýÑÌLç4aíýáíííà >~wô/G†¼²ŒŸ†|22ð8‡·¸õ{àÑQ;OPÝÅ]|ÎÕ_¿Õ£]y¿záÁ•Nù'û;_Dž¹²æ¬ú•‘öøX[ú*½þ7x}Q¦:¡™FmÊ)ÛÑyk»¾0þžÏ_cåª×¼7GÕÏømæŒí³örŸ½h Ð+wѱ£Ns¤Lk¦­âèmý`ýdKÌw¼× «g×Úš?ykzãÚØ¾ úA¿êìXÝ­·ü€òµ¥lõv•G>Æúì™"/~_¹ÿúíßÞ‡/·6•·qþý¢Õí0²þ)üÄñMøk¯¹¬/â»ËgìÚW/ãoÿúLœÆ¸<À·}çzñÍgçÀ{6úbeWÆœšçöô´&W {.´Ø©¬y¶&êwä¼´ní“õ£q®ùJkíô×;ºr¹£º6vcaþ{ÖÍIõ_°zËßÚ6_Ëç|yóº4ã]]Ögy{Æ*×Ô— ·@]œoŽÕ[ÿª“˜ßÛgBëÁ|ébÔÎÓ™»çHßÛ# ­i{¼`ÜûfÐí‹•w¯wŽNÏôÝÿÖÕºë“:=ãYsþ*Ûz•_º÷ÃúÕ=zÝ+W^ È÷]QÛõe{HþÍw³6}s(¿¾˜ m©×{É<¶6æ@½?¿èðö]°þ¯‹Þø„Æg<ô móTùú*4žòÇNß4õç¿ègDw¿›Úo•o.êoYëµ¾~;èï•·÷`cº ´å³O¯~š#ãX2Å÷µoj¢]c¿jпճº€ö•>z]ùl-JÓÆ¯¯¹ûå)áÒe|=.í6¥ù^ß·Kó¡ëË_¡ÓgŒèPWýißv¾=|ÿõ»omyžêÙzÐ'GÚS/V¯ßóO|À“Î9Fk#½¹çŽp½ß{¶vòzg‹ë¹»¶/~Ÿ[çÎ/Ö¨¾•§>Á³ý¾ lu•¶rÜ#Œõá’]ýKo^r×¾€Ï7Ù¥oïêï9Âx½”ñ›Pœo%û°ûã²%®úÛÅ-¨ksйú=Àÿ6²Ìñ•}®Ïû^Z½öèÚ©Þ ÍËÊt½x ïÌ=Ã.ùK—=Á|ûRÞž»Õ¥,ù€Ç¾WßêWeÍeçSÏòסù”Öó `½sßw¢rèõýlÌÀ{gM{y÷XuKÇîõ»@׋ºßÚ×[—K~ýh/æÆ^=Ê.M~uà럯¹çh{|ý‚®ŽÒ}³–·~T~s²{BìeFó©_k»ºÖ¾ó•i9ï»~.;Oë=G/ž+¿¼øÌ¸½W¬Iul¼Ý¿Öñøkÿt_®Ï@ï¡+†ú舵¿'UN¿û ÄÅà.ïåÏÞ;ß>i®ôQÚ¥¡z¼£Ì™ùôþh.ë¿ñ]}²ào+æîÿúº|Íǯõæäš÷l|‚§{BâÈ‹±×vóá772ž# ½":Ê/®cÇ‘‡ï(ýÛ·µÓ.{Ó>å¬ROï+õ@ƒ§93ÎÆˆLßdðïï(3kû®¹S7ôþoáo&æÂ\^½'ŸvÖW/—ÙîUA\k¨ßý¾Ú8[“Ú‘¾þÁïwŒqʧ=æÖ«úñQ?«Sà?Dý÷²gßú¦OÅwÍÞ«üêÛÚ6õѹoœýucÙõê¿è‹{: àûÉkûx^™ÙÎTEFEÀ Â%ïÿ†þ+9+¬|©Óz±SU{žjèӯǫøù¿»Æo®QÜ·×XüÇ N¹•‘õëxüi\צ4ÖèÔÏŸ®yAÈë›~(§ÌñMü×üû‹þË üYækOYÆ7׸9‘Ž­Æ ø5¸ŽÒ×Þû‹`³úªczchüBuihΤ5NiÌÉ£|Îk³2•ëx’±.âZÓæ¡ðOä+³ºö‚q’—Ò æP?7ø¢¬ø­‘4eÕÙ˜Ô¥¬ý³y’î¨ÞÖk}G_èAp[SÖµQßíùÔ6u`T_m¸~›u÷ÄúU€íáÒú¦k`ss'SÁú6‡­[kÆ‚ú(žóкk£9nohký9Ùßzý~ÍÁ±ÍåINÛÂæ†úh_››‚þ»®Ý9rÎ\½ùT÷<<ò­NýðÌ’Oª§úNº„S^òYÙSÁ»ÏJs¿<³³~±î9*Ø£Úk\ö”çOý¨ÝÍ͇kDÆ»õÿBã<Áæ¨÷¸øÖzãe_èÿ)ww¶«›9¹Äö挹>y¬Ïø`Né{ão}8áêgæñnNz9ŸÔQŸ »æì"6b÷þ2Nc·w˜Ó¯æÛ¼io÷‘y—}yâÌ4tÖÏò‚¥o-ýYÀxä×ÜÕ¯ÊY+cò,Ø>v}zûVß\y¤Õæ¾ïtx ‹ÌÉîê[½€÷߉ ¿ÈýžÏü¤fÌÉ;yßóumÕæ½ãµ¹ö„Ö÷T?uí>º³¿o¥×Ïrcë\9FÇ(÷åšËÓ½Óx8õ¡ÿÝ µ+n÷Š<=7”i.Ì»=Ñ\ÊÇÞROc—ß¹6eå)®¹òœ)ïæ]š1š»Æò[æÄ³tààímmÕ÷Ê5Õµ´Â_¡ã³ºkØ}ÈÜ3fm2î¾hožgžã•¯ ùÔq·GN½´ï uœô×Oµ^oõúvܾ³¾ÛKðÙ¯{–ùÛq1·ßú{ ^{výŒ =ž)€¾tʧ^y‹ì!ýkÞ|S1·¥Ÿ|,”¾ß¥Ê£Ýí- ç˜wG}—Ÿñshú©~çÚí™|çOs\Àî߯¶û}DÝõgm­~W[Ûê0Âî““Œï´ú¥MbÁV¿4W›§úÊÜœ£Çߣж…­Ãh·ýÚÞ`^]ëWcôýflå[»ê–iæqeå­¿¥“rdÏjcù\ïw6i›¿žw»ÿW®4u˜“ÂÖ°z|'ï`ý~&×·¡²®7Ï@s+<}ÍØ;Y½ŒÞÙ®9ój«oam9Wwõ·g¶W:/lnúné~wÊGm÷û ßé¬k}P—9ë· úV›èoÞ÷7ÏIØZ•èݲ½gŒàíuãéÝPÛ­ðçãë9Ç;mßÎ'{û~Zí›Êûþž¾}åõî?Ù¯ÒšëÍщ¿zº–§4{Ø>«ÌÆü,­ÃžqåßwGéÞoÞóÖxmÔîêØ»S»+ÛüUŸsßýðl¿”¿5¨'ýÄgl}'žì/Þ|ªÃÎ×øíÇS_®niŒÜ«ÏôÝÛî»ê[~àký:oí-ßêöÛ)?õ±wZãU·öZsÆOרmk\{½/8ËVWõuoœ|¼‹µ'^ùÆ¡“-À;£8¡ùkmèŸî c®\õë«}S]õä8ßÿK+Ou-¾ëýº¹YYý:ù×Z û»îä[õìq}ë{è÷¿›˜x^…™Ùª$G ïxßÇ;ƒßüÿ¿è ¨€à ¾~©Rj—R•ÕýáíííÃ'øì|þà|\>dÊóJÇmÙoŸ•çâ».”®½¥ãÛw¡wŸ½Kÿú^ý°o®~ž=äØ×—êù>¸<Ådå¥mL§qÕÿê°n_>øUÇê®Ï<#'ñ7†KÐ|üùúÝZ_å™õ§×çW½‰~õcó/?úÕÇs}¿pxðoŽ}`chþéGù´-/{ð·xã­ìÆÞø¶ÚU_cV~eÊ¿tàÇ‘ïŠö°g¨óeyÚßÌôÀÏÚ~ U¦°4sZšçVúÖO™«.PN]ÿß~ÖoV þ5ÆË&çQysÝ>)Ýgòè~k _2íSi}^_Ú«×~ëÓ>ÿø¬õ¸j¥®êy•'zgí*Óy¶z€Î>kÅ~{Âú3#º']¹ÚÙ8ꟸ|K8‡Ðw¿q\¶XÍÑÆ²º^åp¾ö":™“Ê;3Éú.½g.ñ¯>+¿ùlÉ èKgÇÂÏž¾:[͇º¤öCó¦}öŒÍ¹uÕ}}šñʰJ—¯à»¼ñ^vvïŠIèŒ4®õsõ5fžywW§¼ÞÑ}ÞØê¿8y5Ê8ÓÔg•oqÖú ®Ú,oç úû®.Ÿú.ßës}¼ì—κ³X0öÖNÙÕ×øë_cÙ¼þ ^”ñ>Ïl¯þžΚ=Bï•o}C¯ºÛ§®î¯<´?ûv:‡ö¼ï¹fÎZ¯ËŽôú±þƒ÷ÞP7d=S«gã8KêÜsVŸŠW÷õΨç^Ý{÷jäqû`ñúé]·þ7îÆ®Ÿµß}ukoû_ü=P§²[{Wße8µÝýÊÛçúÚßÀzäé{hoþê›ï¶ÖU{È<4VeÔïÞÆß½=/@k£ÌÒÚ/ò¿>´ö?ÏÍ«÷'Ï®ôͳúkG8;úÒ»‘r—l}Òž::Ûä1ÏÎ]åÜ3Ÿ«ß¨Cß–WhýXí`kî=µ}·½¥L×΋W¼Ë_»îµ>+»Ïû{[yô›µ=¹¹]Yæ¶ò{VÖ7stÍ—þv¹5¨¼ëÞ‹ôã=9€~µ°Óš¾Â='Õ}õ©¸¿}9ó×y/yÏÞ«¼GÁ¿ßªË¿´æÜýž)í‚ëÇê\]¯žëTyõk ØïªKŸßOì5ÿ彿©6ÀûûOsäsqtYïhÂÚ¾ü•ÆR¦s¨<é´Þê…†¬ý¶_=[ø¡}ólÑ .û}qŒ®ê(°·±ÿ“¾<ú ˆKÕ[»m•ÕŽòË×XÈ£±#ÿ)ÝK—&¾1úvmVÆùêÕoñÓ³-½¾6Οӧ­ï]gQŸ6~ì®Ïö¬Mêk×¹úä«=Ú"Ÿ¨¼0Ö09ßʯŽWôöÿþäwýÓwá¿tv-h•%7Ь3yŒcó~{òÊS=µ±9ZÚ¥{y{†÷xs%½rÆ·v]góÀþ« åZ‡ éìïÆ_K'gÍy× ^åõËZ`Ζ9ÏÕ]+@œòK¿ö»±|¾Ú—Þs³<•m\מÖ¯Ðïå§u®˜Õ%mëhý¿ú¶úÀ1ÆÖÍB9r¢_»¡¿§Ë<¬Ÿ€ý©œy¨Ý•YyÇ=ó*[ðQ¼º—TW×ïð!Ï÷je×·âZÓ½×ìüúÏ=#¬£æ¬÷5}­Nïø¯çh¿5œßõíxë²sШ!¿OÎAkó•®ó¬0Þ÷tšÓ]ËŸòpfÊ‹~¬)æ ³ûÆ í¾Wïå«¶ë7w§úYÞKÞ>û\ÛÐÛªË8ÍËê·ÿçsÜ}TÞå¿æ…w`àݬòt]¡ë‹<=?k‡ø¥í}e±5qé|ch¯=¶ò´ÆgÎôÁý z'Ò—µ úAoãi½éû®>iÇš\p.wÞz^ß6?;Þ‘DyÍÉ%»þ—Ï3Ø8«wm”Î9tñìd× 2;W({Ùæ‘¾ß¬ò/˜³F´¡LkJ^ÚæÄùÊQK´W¬¢ùï™Ì£skkk«o5Ú¾ƒ÷ÍBÛ³‹úéï úÕ¾0¦¥ù¶‘ý­muì¹â}Eì;yQ;×ïÁµ<¯@w}s›óæim{ÖÔÆÕßÖºÛ< mËSyæ¹OéK/“W=׺ëåÊØzvÜúSÿƦŽå/^Å­Žú]¥££¿åyx¥³{E½ÆZ;¶½Kï^½l˜ÿú¡Œ-õmmv?6—ô¹ƒÉÙî:‡²ÕåwZÏ÷]›ú½>ï|kž–z&¿»®ÍC}«^ãûö/¨Gc{Ô¿¥igeÊsô=W ïD»?–ïÍ|h³wsZ_È™sÕ¹þ–¾´õôìmÍécsCß1mkà£{´uQí¬Ï«[úÆá÷§yZ™ ê¿êñz‡¶¿ºõ¿öÍÕò‚þÒ3§9µ妺]£Ýw ï+ïšÖ¼{U=½‹ó±õÑ<ù~Roý†Þvi»Žý&éy{{ûê>{§ÏßéÓ×|ã'/ÚÜkν7úN{Æ1^ÇýðpÆü‹wúR{ØÉhÞo4÷Ù0˜kz!ö!ö¾~à,NæaìËOpðƒ=lÿ=kÇ}¬9/8ìÕËüý§»†±8Œà³œçècßó¿^ç£ù9ˆ[y;"âuatœý?¾ý·.ªöuäü•®:Y½W†ùöocŒgözýÛkà[c[߯šûŽŒüaÏ–áPSõçòÁëî5G=Çwl²í»£Ä þÖ.ȽÅsßð/{Ÿ¾Ù˪¬÷æ7:¯š›mÈ@O:Áx:/¶×›»¾|f½ìÿùâ¯>÷Ëß¿ý›3ç¸ã¨õf\Û0½î=µ­rW×ÄÝqn½8æëÝëÚdŸ×KàmL/œ¾æ…z÷Fëû¶_³{ 6zl[c±ÝŒßf´mÕwÑÓùögŸó@ÎÙsýì/–íž}ÄwÄ<àRG­cb쬆È+Øð7G¶Í>Õæ‹ÊÚïŒîƒ]œ’ýì]_-Y±ÑùËk>ŒæßõÖX?‘χ×|›Ç½Á´~ƒÜµïšqŒÈßèõòU ¨ëQùÀô7Ñϯ5Øð®OlÄÆ¹Ç}¤ûâ#?õ ­£ÙDÏó>²WÔ€÷wët_ÙÜßs®;ëAŽóÚ²8n\¯µLk¯ß ž;Ö¶´w—;òtJOûÄuofy‰ÉFçlçŽ[1á3ž××ÀâÎqæßÖ³Ú_såZ©­Ü…gÃp>ZoÖíþäßsãoŽ·×;ÀÜ{ܱ¾¹ÐpŸj˜óÊÀ6ø–ÇwóW¾Ø®kbTÙ‹ϋʃ­à_o+|Ž‘e/^¯¯ß à‘|ï<Æö7þæŽåFþ0öU ðQ÷`¶þ·¹Ïöþ´z¿Û›[ãÕnË”¸÷Ý¿È|þ–49†Ý¯žòU¦wÁáûÆ{ðÿ¤µs½ÑýßrÈ}d©g®CðFŽïÕ/éu›;¿È^:ÁöûH¿³,'(^©øà‘Çš÷ß²Íúì£yÖ³˜÷oMàòûÝÆ2]ú?ú;Ðè©gâkïùm·OððŽÍw¿—Œ—-è^Íú½*Ÿçã©¿>»â´ýÙÕ~Î]±¬Ï‹ÑõܶÕoh²Ó;¬ÖÒè)ÆÅìý­^óºg96ôÞòCÎÉlåÞõÜïzcÚÖ¾]åiþÖ·ª÷ÒáµyýžX—e¹ëÔºïpó=<îyð=²-Äžsü~ß ô{½oáÉ’ ç—}ä°Œ<~5ô„¿ ‘1/~øžÙÿ‹ŒÝ³äF–ù¿ÿWØÇ[[+³ ÿÚ÷à·Žæ²äß`Æ»j’\^11ï%;ZÝ¡ƒœÏ.ßg¿{ØåßÔ¼±©)æ–·½ö‘:±};§Ïñ& Ëœ±ÞÈoJßÛº¿açd_c{4i½þf¥ß cmî~çÞh>ÿö5¦¶LŸ3G[9oܽ³8¶©÷˜¹qÚSg÷”Ê?ÝǵzðËv³÷ô–AþýR;/~ûöõo;ÁÝØ;fÞ즆‹}É·±Ãø®Üƒ>þ„Ï^¿+³sî£m€jç¥ùþ&¶¹ãv6 ‡¹É±19îO¶’#øxO‹Ç>X=¯Ï—MÓõ~[úx^™Ù’]5Ç`À6»yàÿÿgp3"£¢ÏÀC…tÔ­êE­åÎ|~{{ûðÂ÷ßðÝ«oû1rú+gNeŽŠ Ww9+—ƒo9jãÇÑŸ3]ûr¶•£cà×÷Ægßï_Þþå@ï§è\~™‹f¼úyåà÷Ñ-Ïê.žòY>|«ÌX×'A®7×»ú¼ª_;[3àç×}ò}q›ç²ÆL\Îqͱ£Ê]í®/Ú²Ïú£'öä¦ïÒ†õQ~ýÓoy­qðgúãòi×õI¦­+¶ê,GÛžúµù2Ÿ×b<íårÓw¯Ñ¿|·~k¯¶úý_ñ-vß>aã³%»:¯º…ñ_2¹”µ/Zã=¯ÙcÕµ6±·u§¬5m œòÓãU¶¬ëž=ìç«–j p¹÷Z»—kn*¿jÆ3¤¹rNÛúV{Õ)ê÷QÁ<ÖäšÓþÖî_ÍÑò3ö[Æ*ëwk@¸Ÿ÷\\Ž]ýxÊ7 ¾øþ™sÊU{ý6ß»Ÿ;¿-Übó¤Úì ~ônÜZYžäµ}Åc÷ìÅS ×ó÷Í»6ßkÑó]÷ÄU½õccÛ½xùÿ§\Ž]gÚrÚ'[Èü²|ËStïs¹×o¹—Ï}h­*/~;Þ:Û{pcs¬¼=«~|éÚ¨ã»VžW»¼»ony®;þŠ ðžPÖ·•Ÿøàh¬õ¿>ÐßsÔ¼mþ›Ïþ>íuåû?g9ðwGýYÀ»wŸãö÷¼,Wõ6îêÏæœ6wŽwžr9¼§:NëûÄ9êÕÏÚn¿h|Þ«ùìÚ+·o¬¯cž»Æ]Ç î]ý«½ µ¿2x.yù¼³7îæ´sÙ+k§ó¯õÔNçx†‰Ëÿ¢÷AëÏY{÷ŽîãêmŽ®¹›¯ú°ú…gŸvÔ¥Ý5–ÙÞKÝ~¯Í¯¯¹Ô"5ÐwL¹ æ‹æ”=Í5õa×¹ûÓ½¡?èv>aó©o»^ê­¯ŒS·;þÖ¦k]ƒêíã\ÝþÆì›–q×Þoe­9ô§v'\“êÁsÅÑ|SvýÔÙufl9®|—ßxô³²ÖÔż«;æ¼Þg«ÜWÍuí·¿sä¼t„¹Sg÷¸ð<ñ›sÂ|ßµ¿÷ {«ïžkOí\}[4W¿1‰ú®ÇÌ‘þ´Þ xñ»ï„êÕ—Ž{möj¹ÊSßÊYnï¦ý}²±m×l ¶ìuëòú[‡í•Ó…<ë£óùÞ=º@Ÿjo¹\³'?v®÷´ù7gí#òÍßPè.7pœ[®CÓnýwn[±5Qh£þ\z‹¿_mý½òhÝ€ë<[l^–¯1VϾ>¼÷&_Îõ yëfc³¿g`±k´:|[KåÜåþŽº|_.až;ֳйêìyÕx•­ýåwí;z—ö÷míëÏ“Ûßk¢óë‹<´] åû¿ÊÚè>ý-ö,±õwú{5±o)‡4&Û¾¯z¿òí8ð~¥ïù!ãúãÞÕúÙ÷—ò§VÎú°µ%¶µc[ý]7Ñ=ƒÜ¼ýªØ—x^…™Ù®7 ¯ã,ÎêìÈÿiR@R8à\?’Hêp“ØÝ3ÞÞÞ>üG_=ãÇgü+kyêHdþmt¤¯³×9£¸ÅcýÓ#wo±ÖÎ7á¹_lI d¿>#üïž±¸µ³Ø?F&^å?D¾qI`£v¯9ôéáuoI_Œýæ|ã€~yøÝ™»æQLy›ãõcôÌèGsÒü1§ž®[s1­7äyosM­üõÆAÕéHm«×ü6Žê´^­ùq/:ëï×úé—<÷Ô®Xê‘Ë›ó ^©ºœî¹ìjÇzµVæ ½Úßü±ÆŸÊ õ™Øå‘ÓÍOí5'ÍŸ>[×??k0”­ýb³9(ŸüYë.÷|ªßœ8JÝï^e~õ–ÜWù÷¯>4Vå‹Ë|sR;Õ‘Ïœ{ëº÷E,hýÿ-¼Ë>*ßÞ«/b÷9VÛâ¸n¿„Äcë¼xæó¨ÞÖQ{ëÓê:î93oîk¿w?==ìl-Õuoñ+_Ý’¹0NÈø®º©SÞçgs|¬«[_ÿ’½ùåOi1Åh>å­íâðt﹤¯ŒÍ7<î‡øŒí­Åpmýûî(_Ýæqik];öùëCÏ,8k‡þb¬×}.ç]ß•à5oêÊk^¬ÁÊ”C}Öo=‹£~ñôOû×l{ïœmÖVÇί3^ŒµóÏÛÿýؽOõÉš©§oíÆâ°<³Ä¼¶»ÏXú„Þu¶­ï'«×Ü6øÞwiŸ7èˆÛ÷UùÎÕßÖ‡kyVšŸÅ‘·ò+ÆbWŸyßsö.wn_¾|èºûVNz66[“õAþ¾­ÍîQF7>é:Œ{ûmÅn¸ö—´lû ´÷ú=þ…/õ;xõºî9/ŸÑ^lÙ‰ãl®öª>Šß:Ø+´Ý}ëŸ69sÆ}=7¯÷ëWä»`ûæµ×Xv¿ÔžyáTfL‹µWjoí*«u¬‡:Å»lnÝÌõÚs$_Ö¯>*ß½¯H=úÑöyÉÞÒü)[»ÎÑ>×\]÷¥ß”=SMùöäë>•ôÿÊË®Kô¥Ú®Ý÷{x¹÷³¾Ô¾1•¿yn~Àj-Jè^ߦ|£(ïùÎc¯†W_Ö×å+c¿G‰ã÷ØÖµ¾×gÚuß×ÄßÑû ·9üynÌŸ{ÄÑ/ù¾‡GûÞ=¨ß¢Õi ä·âï7©¾3÷¿|ïYÖNcZùRcú’~í©ûÊü+‡Æ³üæakqÙ½rí{FqÖÇ}î]ù„È>ï3ïv1{ßKÙûÊvùÞ¯â-¶¼ëYê}4¿ûŸƒ²bT¿xÍíú$õÛñU~œ_ÏŸÆ(Ïÿ «ã]ÜgÃê¸æ7´Å½l•Wÿ{÷yåü¢/éšÃýÿfsç»Åoû:µY}dýönÕ.£½Ü=‹Õ3Òýêþ=kílßPî9CÎoÖæ¤çÏ9ÄïgâáK¿áÕ©¼~úmUAj¿ªï¥ú¶|Λòêç…õž¾*ûsäÛ£šë³~1¿î¡Ôý¡6SúGjÜx^™×®dU ïsð@úÿ¿„%¥’{@‰ìècñ€7b\¬ÑgÜæÁ¬]X^ÿ4<—ŽñÌfìÃ~cý 5Ë~)^ûl¿,7j |ßJvXöÃrÌÛ·ú=úFü¬Û&ú³ÍóÆ1nù±ß›bÙž/ž~íiÝ_ðëCé»g}±·ïpwÓ÷üúkÁª¯¶çóƒãµ[¯5YœµŽ›ósùñë!kùbÑ7ÆÅë|¼ç+C-Øï×Êûõkxÿø´ÕïœY§u¬Æ6G- Ë|•حŘ??ò&jÕ¼W±Fõkvc}plwý†ý¶‹ñ%KŸ:¶ÿ¯d¼îü`ÃÆ×¹P>ûtQkË´äþµàVÆr­?ö§ë“3þ•þbÛÞÖ<ðÇuãz~¼»¼fþ^µX_Æ·ó—8L'z³Þë®Õú‰}ÈÚFˆs;9;Á»Î•Úî9û‹=ëÿööîŸè+÷21qNÊk¾õ§Û6ONãúõõó>q0fsîØ3·Öv›×º<Ïš÷“ç¬Û8WÞL?I†XÀo¼ËÓæº×÷fC¿í¨|ãüËӲ篼¶7lkq‡êA·ùba>ð7ï:y…ù~1cÎ:ââµÎ}õ´ö£60æîmÞÈCu47ËÚ½íÖ"_{-Ç|uÁ³Zq=Óx•-ÿ°F¾ˆr¶a¼—x‚qíåW´Z¸ò~ÉvŸš¦—ýS<ÇYÞeæ/câmž­oÿ0g]Ô¶…w&ctSÇ[ëY^[¼f½èF§qvWÀÇ÷¢e±·gëkç/}ߥøãó¼ò&æM`¸öšgÆÎöë­»Ê2F·ïx®¸×GZ÷+óŠê²®%ßyÆ®¿Ø¾–ûÈ<ÆöøÂóß”ì÷êºöÑEØÕù½ 迯ý[‚óBÞ*ç3f¶ë¾ì¹î{äö¦CÏd±¾öáwŒXçwÏÓõ÷ž$‡|w^öƒqunìx4^¶¡sãûãiK¿±Ýš¿Ã{FÀ»½·ñä‰ÕeGmZì¨I¯#?}|^ëgÛp{ó^þÂo,ô!W]³©¿¡¸>zÏ­Ý:óİwRutŽBæjK{ƒâëûÞ“— #dýÛÒ«Ú5–e™#GŽ?cÛä¸{ä{Û11ÙŸµýÞ°m¯j¯x³ë’m.Z³ÛÏ6×B}m.ªËuz‡•«üÛšÏW¾9?×~„Š×š¸xÜá¿ýü·|nü-c]¯tzíÕþ¯üçæÿÑß1ĵµ2âíèZŽyÁµØö§øFøê“sÇ¿ñ¡Ï7•±.ýÄǹÝÜÞðÁÿZ¾oF>Ã̳5ÛÇYaŸÞG=ï!dY¿ì¯Í|/³ç­ÿ•-v÷yð×߳Ϳù÷­E½ø6ßeÌÃ>2¦õ7É0¬Ç6ùÍX=çœaúY—ßÀh]@¶½:Íë·QkÊ8ký½h¾Õ(u‚=—þb÷=‚Ü+ŒÊ/¼ý®·ÇEõ}Î~È{ÃoËK–˜AÎ?qñfDyãú^ìÿH¶Ï6p/Ì×32–­ý½‡ý›ß–1¾ó›^íù;‚X:#æª {]—-¿?-:ÊŽ÷'çkðObl]—aõ‹x^…™Û®7EÏ!ÁSþÿ+9Kê%-m¹‡‡’ír]·Ë—žy~zzz~¡¿®öÕ ½½ú¯´ÈÑ—þy¡?¯¾s´o®öƒŽcí–>\í»ƒ^uhñ¡û•m>Ú« c‰8µuòYÙ—÷yx•5ÞÕ…ÀOÙm¡¿¯Öø”ßX~7f­ìKeè[°¡Ýõï1w·ÖƬ\ÛS ´ÆÊØu<Ù=ùtþ}ÆõGÍ‹!9¬®6[SêÃoŸößð!ìóÚÀ§~¹xò•Uïã% ‘¿üæQ‡5 ýwÉšGã…°)¿g@e–w·f⼺Ë+Öå›gùž'ŸædÜ;·9çþ¬LõV—¼Äpc‘ŒSÝÅ ~œ·>V¾±Ôõ…,ë †{N;}ç83*Ó³§òµVמcy{ìyVk·úÄܽ²öOºúÚùSµ׿´¾âèÞª¼çbI;b¨Íb*ïSôôAתºàÒõçQÞsrq¢~h=ר¿Æ§¼cí§gwyê [ìÖ÷#BvkdI{wX׿õÕÜ žom™óLòÚ:í›ðN¦¼Êq–â^³/ö7ž!Ú“z>Kç÷Ì?µË“Êï[¬rú•çÙqº{ª÷¼¶Å˜þîIez&ô?bhϨ%Ïfäz_4ž¶»¿Këð_ ¬x^…™G®1¿sÎiçûÓn@ iÑ çåÀ!©Ñ³§§§çÿñLãûÛøò†ÍÁd äÌ7íõmþB°Ü­sË1ŽÿYr¯"¿çáÍ?ÙæŒo7Þä¿Jþ£ù=Újíw’Ûó߃þèô¡5üx£¯ÆDß8ÚæËìâ×½Y½ˆÍ1Ì.²õcù‚Mó³ù•­MžÉ ü¸ÎϺ“¿êÅÖxåÞ½¶]_üU§vêý6tëÔVe'ë—ÞU–øL_-Èçô¾R[xØXÌøiý©o}ñþ8lÚ篧³mçjšé¬½áèäϹò.[ßqmܺh>Ãêà½ÄõÄΗÛÈ;wZcùŸdŠÊ|:È ôΰšs‚Gƒ×ƒsià ¬÷®Oë79Çç÷Ãör¥Þ¶KŒØf4¯1yÛàü+lc{ïj÷è.¯±bŒÞ3mà\ãyky#ûòâ¨ÍÚ°_Ç=»ÖåÙ´ùc]CÇ9}—g𩦠W5ñ» Ï{ºãtL›{?;Õ‚5j]Ûl<5Ã^u·&œOmпÆã=¤vwî6žÖí*Wàþ1Ö/sÞËÖ|x§ü6÷ºÝÝ8·>m¿O˜î›;ö˳—»>ø²MÃúh;¬¥é±Qóì{õ5¾ó„U_ïñ]›Äo㩆ømGß^Oün9žÆV­ï•´ÅZ¿£ï™O6±{:'ì§þG«k£wšúò3ñv!7:}ðšwŒèÛ¶×[e~ƒçä‰nõÇGß~,sÒÛ3µ"7ÖKeO6Ñ»'ï¾×Nk>ðžGìU‡ØGcºÇƒæç­ehWö-?ø¼n?‡­ ÖS×´mW¯k ÙÑÙK9ÅG,ô]øî‘ÏPzqŠÏ1a»÷}ÞüÙ'óÆ }ïò½{¿“ýN6®^ŸÐ¯°Ü‘aoÅ®åšKa?¾³Tnx´Çã5ûØ=ŽÚŸëÀsÏ›úô=ÿ^ÍFo},Ë|wæömûŽ{óî¶É{9[ü~sœ­#ùœ¾…ŒFý'W]ìRûÍùv‚¬ímäN7yÛc̓õ¿ÑûšýØîh=ó|Çh=Çó™æ>¶F}—ÎÈodlÂ+Æó˜ê±çõˆ~»'cð¾PtÏ,ÿTbâ÷€åN1tóIä{’Çüß^Wqî'ö6÷÷è~7 hÎ{p}O±Ãë·Ç1˜WÛí!²ì 6¼Ï ‡œé=_®ú>½Þ£·çÚ–ç{ m\¡¹¸^ðögç¿q nÞSëÇß©¯z°ç5S™b2þVà¼6çΊœßkû¨/×°}¾Òi_«Ã^bÚÏȹ–¿osïµ?¸^]k'ì«û7tÍbotöõ¿¶‡Ö–³Œo­Ôâž~kç˜Çšz6×§¶[WW°/¾™Yît6T¯ó®ÕS,öŸÊØ®cfîZ ô»½AÀëýÌw é8wçว—ŒÿèÎÚ~z/1z¶o<Å,Ë]œ¼îéú\´¬,ëÒý¨ÛF÷Ö5@›Ô÷v²;ïèó±/â„ßÑ2¦û7)úŽÝÝoà]õÆv `osÎÃyÖžãrgýñÿo÷>ÍÓñÀçÎܸOýÜœj0ð¶w‘¢±ñÜY×£³ÿnÎïâÖ×v}î@Ÿ|.þÀ³x^™ÉŽA ö}½pàÿÿž˜¡PV‹ƒåLïv:]UÝ·ÛíÉxúˆŸi=x¥ýðø–‡6é×ÿÏÛ¿|z•oœðO>Ù¯®íëö±œ®øƒÖ”u{¯{Ë¿9È9÷õ˜÷ôKs?Á‡ÛßóYn®…ukcþ†§cúIþ^¬Ý³Ð¿…oÝÁ—È7Æ{Àý4`‹^åÞ«ýô‰Ék÷9ûÆî2LŽº¢Ëú”çúlëadÛÈö^aÀVe¡q>ðzîîùçNëè<êk~FƒNí\{רµ…6ÝÑ{Ñëy8žò®`²žÉø¾gão@MkêïZræØ¤vîEôv÷XSë²ï|c ìXKÏ€5ñy^Û–Áq'Ørž Öœ¿Á¹4çµ"n÷ã•ÞU ~vý±ï:~•|mM–y][­Wó­?|èxfýx”w=<;ñáç¨g˜ëfh¬Ø‚î˜{¦;tkcr«6<§,KÎä[{äÐy~’i.Ÿµ¾êb¿³¾uûž=11'š–54Ÿ©{²ÈÓ ð:—K{šžòÌ"–ÞžîCd[—ÑÜo¼Ãl}’ž¼û©2}†~”¼é¶ãºz|ùÓ£æWïèÀ£îµëü –·ÞÎeô«~¥'j¼{g¿î¯“û^cÛ»Eó¶o¯ÍŸžã=ÝåÁîñÒ»£»G‘m=© {¾‰ŽÅú­ ó »⟠ëõKs¡n=æòUÝü ¿µëo9bõ¾ö|F¾»è:ÆáÖ¢6 ØÙú×ãž;ÔØ&CoÍÏîpcq­ìƒwYÏ1Ûµh=k¾MðWÐád*?ðŒ?=‡»¦WÊsŸ×ï€Ü3 4Ÿ5­ÍÆã¸Ð;atZÿöËéù^>¾Õ*c¾õê»ö¼nÏülÜœqž¡÷¡þ <÷™ý[×7tÖ®­kåD®|÷ ôí÷ûÙøôkðdÁ}_j йÊØ»Ð|ͳÛö±qòì²ÏÏäBã²íÚ3¯ßË€ßmÛ>·gþ_Ýåáåͳ²5¶-úÐù8VÀïA~Çpœ›ÄÕf{txõYìß\7÷ÏÉG×õ³»H,ÄÛš×¾ûÇw Ü;á8\³Ñ— u(õbb1oÁÈ:¯+ú0ç<ýS?×úè “2Η³Ù÷*wαþ/œf8`«™ã…¿8ô ´úaö“Ÿ}Öoý—²‚ÓL¸ê/øµq¢_åˆÍöÂâhÿž|ï>{Ž˜o]Óƒ}ÑÈ S—ÞA€Yb±aøm—µ}¢ƒæÀ½ØïØç;ŸŽ³{lyÏÝë¹ü~ëï@p¿1Ñçw0æ ³¥µ˜.gÁóÒq^õ7µAÆõ«¬å­‰ãBÛ¥Æìyw¢Nätò‚>/¦Ç|b ½° øœ×xžwÍѶN±ôb¶ßaÎÓçŸßÅØŸj\àÿ‹Ðéì¢&Ãû“íŸãêsÎ2§¸vÇÑÙ¼¶~¯‡ïõ¢¡ù!¿¸ª×F–œøv¦W-çØŒmºu-Çœô¹Ô€ ~AÞ¿C[·ñ¿sFbx^˜Ù dE[÷]Qýÿït:˜àÝúTÝÊýd­÷Ããñøú#}ñ‘><ÛÏžôy¾éçõ=eW÷"t¾:Æ´ GÇVžöçô¿þ¥Û1ûW¼ß½ÑÃOó§%Öµ±üõ#ï·g™bYºìcoãø!òåµ~´Å_¬6>0pLùµ³´ñ´&ÕGè(·ó°rÄ$.â‡|cTç׌Ëŵºô‰å›g¿xCbýªfÐOOm5NøŒõ[œ¿ž¶êç¯ç7|âÓN}«_LôiŸ¹GÛÜl‹qÏÚÒOeVÎõDÌÚ«ýÊ^T™æR~ÇÁÂ<›We¬cb¹ñïü]ŸµOê&ÞÕ'å©Yë%.âh\Ê3ŒóÕ¾¸¸(Ãx× íÎ]m*g¼­Síþ“¾q¿ÅÙ5ýãã“eŠam-bm.Æo¬Ê³®31ïÆ­ûÔª¾ì‹ù9¶ó¥ñwé|®¼Ü·ÃÚ4IÅC2÷êRÚ§êýÍϘŠkíCì1Ê•'þ•­ýr}‰§öŠE1mÎÎõõ 9gÞÅP[¯¨5þ¿:¥­qIiç@í¬¼ûJñ¿p*ÕþÚÏÝ×^Q}v¬kò"×Ö®ÝÝÛ÷>³k©sŘ+¯]Ç®¹×³²óyãÿ>ãsB>}}þn=ó•Å7>š»9é§9‹ë®Rlw¾k³ü™=jmv !/áßýX^ÏÌÎI¨±ýòø„»wžæ\Æ¿qU¦1xÈ×¶ñ(ûwäÄG¿©wSú­÷ÆÔ{‡±tÍ7¦%äÄÙsºõ©ÝË·ÔõpùóŒØµŽ/ýÿùøTÃú¥fúÝsVûöÕsŽÖ_ãò.©žûÐګήùÎ3ÇJ¼+‘Ùµ[Ž3Ë«MÖFß’ïjrÅ Kåà7ybP,èWv×ÿb_•{5Þ»‘spóƒ®û¾{ØÖ¡ßÞùvMm=× Þÿßôû.s/iÌ |ü˜‡äÿ‡ægÛ³KÚì>{Qó+í k¯¹Öo[ÏD1òMr寽ݟ‘©ïŽ/i[¬ÿOÛâê8¸éÓu¶>à+Ó÷c«CK½º*« ¾Ý³:W+³ñöì_˜+öwÏ€ÀE=±pÎû>ÔouÌ÷U½õ-6ƨþæåzWÇ7üy6ÀkŒÕ1Ÿ‹×o¨wtó_9m­kuöÐW¿»Æ”]Õµ^«']o?õ*'N΃îm­[©5D¯÷«îkõyÝ;®=ð÷§ßºo>ö;¾þ–üÇÿÊ·ºÖǹÀ÷…‘{xöŸMq¡ï;¢ºü7©¿}ÇÈÃ'k‰Ö·_åô£rÞeüÞ\¡î³Êëo©±·ÖÐ…7ã¾e¼¯Ö¿}ÇÅnׯïd–™ƒ1°ÿ7î•ï¿§ækÛÿ º›åx^•™Ù®7E$)³Äÿ',ÑKYÙr_.%Ûåv vwŸóâñx¼üB/.úå ý5Ô}ç?^ceὺƵ!ý~ØAæ§K~å$d ý2¢ã\9æëÆýê«ó”ߥ_ÿéöîlþ|à™è”3ã”Üo Þ\£ëƺöê—‘Z5g‹}s¶9^þ»Ç>ëudÀjÌòŒA>˜jÛyí²n=Ü¿‹÷ìŸdêk©ù|.} |sU2ÿw±ŸpÀû-óöLë‰ s Yõì?æúq­Ü_¯} ŸQl‹k×òð_§üÀ·¶Ê¯Le•¯ÏÓy_LįíÞAÍ:æ³¹#v䊯öÿ¼öá½½äðçݨlë½µ2_ÆØ½£ÇØZ.žÚYœ%ï'ö¹;™‹éd¿òâ¯mδñ>§[çáWV_ÌÁE}Ô}Í3Ä~í³gýÛ÷õQ,­ÍReÁÜ>©Œ½b.7^ˆXÄ\ã§ÇW<ÔHß§ÞaKçêÔ¿¼ÓÈÝÉÜ–öy¶9Ó~mg¶²Ê-Ns ìöYk»rkgå!ÏÒö€2òkÇܯmFä[Úl}‡Ä]nOöükgÎ=Åžç¢1¹oÞÝ_›%yÖP?õuÒ[•9ű{æ„9÷Kq¶^ŒöÉö©8[ol¹·uQ¦5Ý=I½­³²+ß»ÂýƺþzCÍ?zb4Ž>×è‰Æ¼X\û,E>ïsRrm/ú¼¸£ž—Åà\[‹ÜÍMëÀ³Õ¹˜š£}®Ý¥½N²ð·ð׸ ž?ße”9Å/»ÖõÞƒÕãý‚Ø«/žµís§v7Žê0÷ý®üÕiÿjwGuµõ;ÁþÚ¼ÈSîïkÞûÉ3^ûÿ\û¬É=··Nù*5®;õ6Þ•‘O>}§OÜÍgcglÝÄS_ð½g´¡}È{®Ö×ΡڬßÚ›öå­-ˆZ›‹Æ»½$)‹ýúði,ž=õÈñžyÎ"<ðyê£r«§oÆö«r¬µ[›òj_]yæÓ}žùæÇ½S¾šõéweÖïÆØwêžïÅWÒg}<µâï\î1Öâ6®¾ÓCÞu'Õ¡^æžö%ß Nç¯v¤~_ºWíˆÝ}ŸEµ}×÷=~wf«O<‹i}ØKÞ3ö)û›Ëæ~{È}iñœä˜‹ßx˜×¶Xöãèžçû9¾ï¨çzñ™ŸÅ´s×­‰úÚõ;µqo=­ü~ÇÕ~ã¥Ö­gëýT^v¯ïiÚØ;”qŸ7+²¿6̇½Ê|±W·¾êO²Ž•]=Ö§wbçw¾÷9×úÀw_,ÎkÇoøû}¸õ*–Ê0Ö¯=ØßZŠò·ÓÅ©îú‘¼c7ïb[+³}`ÎÖÆRÏ{ëâ>1ìwŽ2•-Æê;·×›ûÎWþDÈ6§Œýÿ²/[·õq¢•1‡»ß)ÎùMŒôH¿u·†s}Kí¥ºÅ&®Ú;ÝÝ_^÷îbgîsnßôUí¿õSâý€±ßnÝ_ýb»#mù{„ÝíŸÚ>ñNk¿WFÂGcØgjm4gê7oæÚüÖf1!ãûäúU¯ý±5d¸O½ÎûŸr}^-É?Ý×Ý×ÿ’rÞûM°vj‹±}²Ö‡z<7÷]Gžòû;Vsù[ˆy*öÆË¼g©vjÏß0ŠkcÒWõJòƒµ½yÒ±k×óÄÜüz×ú»ö|5çÚ¬/çê´Ç2½/êGbý1{ƺ=­ìò–¬$–﹋”µÆ›è3­Kx^™WŽ$7{å½7÷¿©ô€ l(5«Éôަº?¼^¯ÿÂg?kýåÛø…èËÐ>­v¾ Ÿùg^ã«ÀOh¥›X¬ÿm|£9öúÈܾ}¥ymol.zý×_ç ßXÿpÌŽ™¹}j.ç¸_ßæƒù~å_X«ym ðÍö 5~¯¿Ö¼:m“þØè¸Í_pOQ[ÛqÙ¶sõýÛˆìâ¬]×ÿÒSþር±4•s¿ñÇ×ÇÚTc}ùPòg}Î#ëúï51מ°ÏÐ6.·£Ñ§ø`?Ü{êñx†'w͹Á¸íSûç2\±{~ÉÜçÄk—¿Í!±B+/¹!>žöÁÎkÖÓOî±ëZØgl[×àª?sÇb}¿8€ýEý—;zƺÚkWÑ ¾÷Kã¬|a|Í«c¶îú,vì<ÓÖ·ý楧èÊ_8Î=t7ÿäIJž¯Ö•)8'µe]ÔwgQõuýh®‹˜ÜC¾Ÿ ³¦ÿ u26ëª[ÿùúX³ö} ß7_¯”n;›óîØš½m¿ìsq¾wìÓuçØ¶qíçÚ@fãüÃÎo<£õþ[üîû}2p. ¾­²Ô3ƒ3Œµu#Ï›Û>oÌ_›½Ÿ¶^ì肎ÞÖîwñðÖ¶¾ËÇ»ñÚ÷ðð\çÖõ®ÝöImÔöFïÃÒŒ7;Èç?ÉÚoÀúÀyõ¼¼ïÁõþ}êÙá®óhí*ëóbë3Á½e=|#¿œØGØulÂãýpg~Ùþ3^çÈÕûÈÀ_½eûà–_bòcÙ>9/òfÚT÷æÔÈïÅê±-Ç>yÒ»µsá•¿¸÷dlÃïoÛ÷zÂ2Þw¥M‡ß:®¸§üo½û^ò7ؼgsóõtNÐ3Þ{ð]ñ"_=õzëé{ýÒï<#ç=„ è¿½É ;úbö[¬úÿ®dzÇßÓ¿ìÿøfÛüWløîïŒË¾½ÐëÅ{éµ~Þ€Ô>÷¥u8÷WL>gló© ¶UÝè3Þ÷¤í1šw¹.Ÿy/ð÷øÆæÞóöµ\¾Çß9y_írožöñ¥—|Lßbk­ð‰¾vOù»vãd陯b­µœÿŽ§ç øê´çàSPûÀrðž½Áµ¯,sÉÙ·ò±~ÊÙpؼün>9ŸÞ±Ž­¾”ß4ûi]Õ³>hŽÌ‹¼×öŸ¤Ÿàõh¿˜ªï»gìûìøá+ï”ñúíÔ?Ö×Û”ù•ïÆè\]1º—žh†Ñ÷ïWU¶s¿Œo[»̇=p˵{éÒ·ó€šÙ‡Ë—ÆÒ½UŸ ÞC¼;[Ûv>ͳ‘7 ñBwìÖ7|Ïñ'ÝÙ–·-Û©>¿ù¡Ywc¾ÆÁÕÓ@Ï`¿5È+4âéÛºªà LÏÁk\ïLôø7ÿæmÞÉrŸ÷Þä4n€<÷;øýV„Oƒ~¢ß7oÿNÆ6ùÞÀ¦ÏAëß»~#¹íÿwãwÿã¿z‰µ{i¶Ù§ÞÿÖaÙŽµm›À_âóÛÛgHcmküpN}ŸÔfý3LGkÓý`9|Ø|£ë´ï&ðãã­]ßZpµµšüÓ¶îx^…™ÙT7‡„„ Jþÿ;C‰[¢tä;<´l÷æÓíö2w^<C/¿ÒO_é—kLŸöç‹Vÿ÷K§6%eúi áSô~lWx'ZV_̵[kÛ1k$oëbkàÔ–¨ëäžê/¯TL­+î„â0Æ]cö+9D¾gÝ®CÇ_Ý;ŒÜƒÕu7?=óäõž)g×vç¯ÿîI‰ñ—Ç÷;ÕÔû¶ûHŸðöÌì\ô©s1¿gˆzí;ÖÏîm÷âb…¬WýÕoõNüS«ÃÙ«ž1Ô¾ºw~{öʳFó’º'Ÿže¶ÅpÂyÏÃo.½Wlcù­bZŸ¬ïê¤wB ›¿äšu.©o§â-‰Óz•<ß×'Äš›‹Ú‰·ùíÞ¾Õ)õ\Uw鮯;wûÞ§êUç„ai÷ÙÍ —¹«Lû¿®¾û¶~9Nõ¶¾7†Î×u(õ~¬9“w××ý®ýéý_cä|wã^¼Ö~[¿â‘ÌŸ¹ê|µÓ·w›¿°ë=·káüúeÝ”mþåu16WðÜÞõãž\ßÜ͹¸V·cs+¯ýæ©ö‹}öß<É«¬˜Ô)Áw 6ö¶øëì<«'œoÞ7¶‹ËùÊkœäÖ­soçD.¶S èûŸŒ‘÷½ÿ„{ヰs1´U.­Sî9§ô&ÕO}Ñ/vç¶å­Ÿ{]ïªý„çΧw%ý­AñxƬÆ®åž%ʵùÅÑzª¬¸–Šw¿ÖÆþžÿð»ЮosX[¨˜ksŠÛîSL~/h ÎÛXi7ïlƧó¬ó˜+ì{'/æž!~Gú^3»¿õ_ðvŽ“¾x‘Q?Ú™‡=/k³ýåu,fɳ™~ßûë«<ô{º;^;.®Õ—ò­÷;›¾SÍõ~ Ù5xF›·’gƒãÖpeýö·gªï{ÆÌµ>ïrµãê™7I¾¾÷·À)âl}«§OdÝóòÝ/÷ÉŽ=ƒðÕoâ']sEŸü9Þ8:ö»tÏvmlíožõåo|uÛÿ‘mû;gu=×Äzò±gÃê©+–b¢6Nû·µ[ZÞæï”÷;_K›+ß/]ou¬3±ö7²z›Ïú÷Û8rë«Ø{H½Ð3Ï}¯âu(v}¢¿kSÿúx&‡œCŸæÇ¾±¸6ðúVÊ‘çuQÙæCÛS]5?Õ)ß–ëÚ=¾:ún¾º~ËÖx6æÚ÷ÿªÅð,•¯oÞ8ê#kMÀoßù0Oÿf¼sËó7 ýÿ"/ý÷n½Û¯Å ¹½³ øê¸ê¯Øù‡sR×î™î¿Æ¥\{ÿZû’¸Ø»Êhûmcm.;í×Îÿ‘ƒãƶ*x^…™Én1 íìû‚$· ÿÿ™qSH¡ ‰„$Šj6)J??><<¼x’ÇK^=ÉËK¦­ùé6fn²>ëþ\ºõÁaÝÚ7šÇÇ«~ó›³íüÑ·_sFÞ]­çlûõáŸ_°j?ÿÕÏvØ^çõ“ÒC±áB>øøý(ý[­_êÓã÷W‹Ùcƒ}ÛO—Ýúøö¾ƒsòê#æT[û"_`ÃË:dùA¿õ`xÍIðÿùj]Ÿ•»ýC\§ŽíľՃC.|6lGßþ¾Ißù‰kÕg®¬!wæØXÀö9\]6wØS³•óÑ:†x³3·;?Æ‚#Üê›Þäl÷cî78N¦ßZ¸Â ù~éæ»<'Üq“ù*?ü8''×LØúlk^õ»Ö{ŽŽÜ4ÿ^7áŒ{'Ü?`nŽ=býrz:¿Ë'k¨5ûôž—ßéÞZÎñÍþ®ïweqlŒ8~ÄgÏl¹–óÄ5jlæ›ûqþrÙ`o;ô`›¹ímËœš¿Ýä‰wüÐ7GÏ1vL‹yxpªc¹Ã[ÎKûóêSðî9íZó«0G>ÈçĹÆ-zîlœ§ñäßxwžù4îúê˜ÝôØ»_ᎆ¹[†Gì¶Áû‹óö»:¦Ï9c}×:.l¹7 oÚì9çå…mψ} »SØ?rQðÀ>Ýe^g}ïv„Ú®Mm=vìèO<ö]AŸzwLàôý÷Ù]¿gÙ8|›”Ø]gáœ8_>ù~0ëzFX×–9ºåûqöþþ°0׺sŒ×èÚ;¼;1c;'훇¹ ¼ƒÄÐyðÝæ¾q¼Æ6|û­ï3`>›õÔK}ÚÖ÷®ãÜxítþÎ0ξ5¬¿Þ1抮6›ëÝ /öÕ8`¡+7ÄoCó`ÄÝõÖqÇ›ÃÝË ‹ñY/ÖI×}¶ù2¯tÅaÝÎ÷[×B¿=àO}—7ŸÙw÷½o¸5þŠï\¯Eç8éûÞ/?ô«kÇ:ñ}pú;͘æ8ñ»Óûßr‡Ï1†GùøÌ¶¾ÑÕ¿ÅwÑÉ<ót¾ÑÙ¦Ò¸,þÎç»Çç¥ö'¬r27ð‡Ùu¶«¾àVŒIóæBçßylS<æ{OVϘ¸ÛÇÆqtß&«YcznÂúSŽáηŸ9Wîâœø½«~ûf⫹÷™å÷ˆâ±Þsþ–sŒÌ _þ­Àù™½ù°~{16~ï(û<å’9óºû^Óù4WpŠ9Nõ}‡ïïH0À^ëÓv¿¬ÛÙºYk¿w{c|bvÜ«ñÍóÑ߸þ'=·Ž©5É<}Ï›un§?ågâ\ßíÇt>ËõIn‡¶äÿ݆_êÖB¬'ë¯Øã³÷öåo,Ûä”#Æw9rß\N{Âïe=+õu¶Mûv\´õÏx-6ü3?>;Æ+¦ãߨu€0þ-Ý©îŸw®çÊ­¹µ6Œ±ïBb…Ssuçâ3€Î뉽-\Z¿´ÏUÆÆó|…œ€õ?Lp“ÇPÿŽƒØV—Ó37ÿ®7b%ïÎÎQyööƒÝô~kýž—ßÉ7Ï›ÖsyöÛζ§3~÷†0®þdC¿~ïjž=Yœ+ï±xû6v½CŒ…­¹•焜S'>;qm÷¸-6Ô+¼lç=Ý>û.rhù;uýËÆi9q^û-û®x^™ÉÎEÇ`6³ >XH\xÿW„:äàSÕ/©®Ê}«¬žžw¯×ëÝ_d½¸÷Ùõ/|ùìYKc ü^àó”;Ù*þÛ×g½â‘Uø)üØe­LýE^ù á“´µOqß=xän~ýЀo\ùûÜusézóÄ^zc«>àç¬Cžê¿ù°ùh ¨ÉÒ­I}8­íM=õiq€}Uãr}Ó Üê'ßÊ Ôvã¶Ÿd6¯ÖËüQ—Õ]Kû!ôövmUÖþ+øþÁW~y ­÷æµ²ê:é=Ùà UöCŸoõcy{óÏó÷ç ´÷qóß>¨®b÷Ö7âW®|'>ó%ó½úœOúäY«Ú± õñœøþ|èÚ\¿OûÚXOê¤Ý¥­¡ýU>÷ÍŸki=#樺kóÖ®é{óàsuÖõ•Þ>:åžû‰|·Ÿ—çä›°çcùNkžõ•8åÙÜŸl.­{€+qŸ²;÷9[ê°fž§òYgóT>½>Û@Ö»bóᓚ@:«síÕ çMÜÆ}Ê›9Ä+W{=Kédÿ;§*ÛwÑú¡ÍÍ)ଷ÷Í)žÎðúÖýÒN`Ý<ï+§ß¯¡·.úK,Öz{´¼›ëƵ¸Í—8×ú^ÜoY#Û¾¾ÙBž9âÙ!¿êäÙ3e^¼OÚßÕg?ÈïÜSÏß1ô½sßWhMôckОÇÞi6H·xaïÏå5î›|yô­ç hÜ«»ùw½¿ZãöAõé·ýÒóV õMÝêòœwš¿ÔŸçé7¬scmSsx«­{íÔŸÿ  ÇYQ°wúBgcõ»çyªÁÒo:ûëy⋼ëÇÿÅ5O'?šsl²÷Î×ú Ãã|©^ãP‡k÷=×êäî_ôt&¹VÿæO_›{¡ïT'«ge‹¿Ñý¶Ð_ã5Îúº¼ö%àÜ/OcÜÙÓo%…å+T§ïºu©¬ëưzúìÁÆ¿öNï3ë‹sît~Öfý]Þέۜ¹Áé<[Ë•Ú þî3ÞêôÞ>ÝÑ«³wýè¾ï='zÏÚ©o´ÑyÉSO2òRG×›³õ¹°´õ¡ºj¿ß_›¿òpfnýY°–'š°~öü"W»µµ9cßÞj»sçV÷Îß+¥›Ïš½ªмۼ;ÄÛ³ì™臧ßòåÑ_e»^¨_òð› ݽߪ‡à*¿>7v€³~cä¹ß‘û½ÌgÏ׿ù´. ¯gEÞòkK¾ú*›r]·^õe¿ò^^>{´¾¬O¥±¦^ÛÛ[¯¾ÃÞþ[)@·?W_mõ¼7ŽœèÕ±~-?´ÎÄåq­Ž½÷úèt.j¿ßæÙÛs[wöÍ x¿A«ïÆ_ž·òç<öŽªìö×I_ï÷}ÿ­Ÿkã„|Gí·†Õ¹ÏêÓÿêÜž(¯tg%´öweðÉ[o÷ÖâÛÆ½ç è½p¢KkÝO}’O½ÕYŸû¾}²uó¥ïŠðôn¯ì;cõIžöYg—§Ð¸öü–§gl¿ùÕ8k޾õO^õù¾¯pòáýö«­®ÑU}]3G¬Ûúê{‘4ý÷ÚMüx^…˜ÙG /K ²HòÂÿ%iJ”J=7Vo^Žínwϼ|</¾Ó«ïôúêܽTûëµþSÖá)¿ûÖùÛ57=µg¶êúåja|ð¬ÿóÕN÷Úw’_ûV}l0þtÍÁ¾úpÂÖyëþpÃWÝèk\æwuVÖz“÷â'vÈþ)>âktM9l-ÞÆÃ˜üζsa¬'üØ2Fh9±=Û¥o¼µ3,w~ZÞñ¿uwý¿óV½ýu˜ƒð¯¸ Ž¡¹ç ÔöI–¹ù?§§LÝã?Ôsñ9Vµò^Öîjú7ðsœ;xmƒ=lÔAä9›Æ÷ùšC¿×‰]ñBèî>,-ŸkwF‹=:˜ó<;ä= qnŒÞê«NÎÛç|>mÓõ‡:Ïÿ‘ÃÆ['=¯'²õçDÝ«ë;—Õ…Œ‡­õÕО¦=a Ì)÷­ÙÈ:?ôÙg¬›Ÿv¸×¶®øŒ›°áþÚ/W]œòz®kk9só³5ª¶MÃë³þLŽþîvÇØsÔŽÚ²_ãeÎ:&òÈœõ2ç|8ï¶M\àé:Äþ°~¹é Žz}âùí!ì®~2îÖpËvŒÜÞ‘¬o\ží‘“NÓ¿W똺E¿ÛÖììMÉLð×îè¿Kn4±éœzOÕ¦ý³ïË:V{ËÓÝ{‰Øw¾:ñ»9‚xlÞuýðó]¿4Y×%ôCû}ê›–|éuê›ün(ÇÞ·ïÞêô93>ÌW–^û«=ö§{ 1Øx5šñø¼§Oôû%7\~+Y7x×/FóЯåÿ¾Ö;ï±å×ïw`íA«q¬îÜgcâ3ýø^~ð-NðsîÍ_9èTO=öÜ]l]Yó],k=;§úÀZï©“ýÎÓNu’\âCÉy7Q—Á[Ì›7~ûéÖqæð~˜Š›oQã²=úw9;é.¯õœtØ'|Ž÷|fÝyáËbr:#–³ ¶<ï8øí¹¶ºÓæ¿~û¼›{äÓwEu‚yvÇßœÖîèÙ7±óƒoÎ!qfÞß­¬[ØïÞÈÒ/¨wˆmÎŒßv膗üVONïqë-†â‚ðsôU}tÝ{> ü4OiwÌÖœ“ê"è\Ûss‡aï¾µØÀÿñê³môÛw:ŠkgÝöG}³šìŸylËkΟçˆIõXG÷ý݃ìåÅÀzÀ±ø:^§}XÚÞ%Îððÿ£¹áØö}f,¦†åü`µ¾î?æíW××òyÔRîƒvZ¯½çà_зø ·qšÌõkÔzßÉמ›­»ÞµfY–}„Æk¾ÖÍ»}9ò}‚ÝŸÏ¿õŽ_‘ç¿/:îÞN#ÖÈ™ß0Ų–œl­˜Œßò&b³µæßoÛ‘kMóÎþ7ÕÖ³ü—¾÷w³õKãJK.ˆ‡×=Þ7õèÙ{9ƾË×ü56öÃ|í÷œ˜xîeâcYÆ|'2&ÖÆRY¾Ñï½OqÓbkmeüo…uÛÅ2öÙ>´|òjyëÀ7Ïù½7ÄZÎR}uýé{Õ6Ö6ß&¯ÕgxøögÞñ›mêŠûÕ9îadùŸ¹5ßCõÃÿ¶°ßX²æqy ï|©,ä8°ÖýgŸks¼>#Å:Ú÷Hw}æ‰ ;Íÿ©ýëñÂÅq|/îx2mó$ïÆâ·­ñZ<¯å£v<¿ó±~sÁxv½çœÉ­“_Ë#‡úÈ#[~å>]íâĦyºßÚdZ+oËx;®7Û¨s¯ ð¾Zï½s@Ÿïéì<Ãö̾¼Öø½Öz+ƹ9ŸýñÃ'{?;_5Gn«ÿ·ÖáZÎ]ï[üZϮsâvß:lþzÍWfpw_{}kÎñ›_ Ù6g‘±ka`}säÏú“·/îdË…¹ÅY_¯Áûf=û³}w?yžœrÇø®¶çžþrÓZªî°;¿|Ó‘sùÁþg²zÕ\kCyºVNß—­õ–síŸ8ÃÓz^ãîÿÎcêʶ°ƒžÏ!²´È5n£Í½~ÜâÏgŶ›ŸoÛµ¾[®½'‹¾sUÛ¬›o=ä˜ï÷n2|ë7öù·Ïeû¹;C#gÿìÇìpg¶Îç‹\œê¶þàXÌnkcy™îÝï l;§5Æ'ß|s‘ó®%¶ÞŸÃéÛèñx{œ¿Öªm cÀïævŸa»6ëïdÓçŽ{×ë¶g]ó¬Nχm¹oÞìsmî¼â—õƘo-Á‡ö”+ûlÿôα̉ï¶5¹å}pâlÍõw v{N‡®9ì’{rÂx­çÖîMF-<©°oââ˜þ¸y å+2Öm ØŽk„Ø+㜟ޞÈn?<î½vâT»µ‰Ç@îÈ{9¯=wÆÜæd}î}î¿Ç©£áî,ðNÂoUë˜ÏÝ÷Û²pqธÃþIÏ1có¡®ïÍÓÚÅ—÷bu…íÞ!EsR8–Áï—ÊXÖ܃ki­¿e~o"ï·îjœº«ïýVÚ¼sjŸŽŸý4¿ò¢å7’÷bkÖ/xwt4/Î æ»u¾yƒóQ=ó\Üýí¶†MÞbØ£½S¾ÞÅ;§¬÷;ß¼Xß2æfytþÕøTÛÖµ æË£0çÚ·.¹pžœsd«CŸúØ»guì:¤åïð´l8§¶kÙæÚïªS°k¾ö‡mm×ß­»œÔWùÞ°®w£ò§3Ášï\ß';àÙzÿþf»sæÔüÖîÿát¯Zξ«[l=-̸NZ3–ã]Ð< ×¾QyÆì«õ­CQçãD®åLÂËy*—½U7‡ßÖ{¹”§åª·7*œ/ïp¾•¬ñÿ/ËÖö°;šØvvÆ›¸/s›õÎmO›Óî¿•œ[Ö‰¥µ² ÇÞ5¶GÛj¿EØ;ÇoÙŽë>È-­¡œ2&÷Í•}úŽ4Ïrò|ïÒµüÖ©Nõ點œÇjyü¼æ½ãÈÁæ©%ßÁÈúüâ×¹ûré͵h? ù¶×>sä~ãgo¾æ¥ºý{ÎøÚV¹Õù eÝ­¹3Í¿]c×cÏÿŸ³ÖïÞÒYUÝÞÞÞ>ÿH>Ògé“ô©h럵þFû“g^o#kóѵþ°-Wü¯_{£/"Wû¶9ŒÅXÞh<Ûüþµž-ä.]¯Ÿì£7_iŸ¸gÃ>Ú—+¯_fßùÇê#sááÓxËçSîIÎl£ök‹õ·šÏöd± ¶õlÛ6–ö8ÕÅNkgjݶ^ý§‹Þp[#ø=ŸW^œã'_.½Qãµ/¥éΖóh\Ÿ¿Ñw¯}óŒÍœÚàû|bþû‹·¹mƒ ï·¿ÏÁäéµÚÄŽý-5FÓö¨c}·LõL¾ç æþе}¸ñªûwk4²¶·õp½æ<âûõ“½Ñd×C•»i|z›àÕ‡¸è6hg¾û¨9fß1«2gܵ°NkõD>Û–­/O>¢3>÷ùÚ|¹fM.¬óãkNÞd›ev–í6ì´ÞÄVÏ‘ñ½ö}\BÖ:¾FûáxçÃxÃåùpå¸&{Õx|ΫÏðèêIð+clÈ5þUkxWLÃk¯-F|ÜÚgÍ÷¾ÇÉÌzírZÿÙǶig\?åŒbâó%ç¬?äîçÖ¸ØbÍïø›3ȶ|®ë ù»l#»s…Íë 7.úÛXömkÎöƒÊz}ÉM†\{>r|Õu Ý_Yû=”Ø«<ßÄËšØã³âzmô»‹{ö7òܯ}dë'Ôý+/µÉºýc;Æ™/å³®}ƒyíoûZ_|>­Ïz=´ñêa°»_üæÊrÐdžrÈYx¯ï+ÄóÊ2•ÏçïªÇÑjãØ¿¹ï¨ý4òóÔïJÕÓ#gøk9ãnÏ÷bs÷žÍÊ[Ïwˆ÷9‹Ãà¾äÜãøÉ3»uÜ;ú­]eMèÛòÁ»°{'m¤[÷{ÊúÛw½.Ÿ« ñÝ3¾Ï"xððÉsÛù»ÝräóÒõ»gößlm$_m³²`ò½ìoš;ÎÚaÜ=¯?½ý“«öûÊñ…Çh»Üì[î=,÷ÛÕ÷ÿ‡zï]öyŽ!c^×älû>_`“³÷r8=žËOrWÏÚ—úõ´ï{¢üâÛþx®{ÕŸÎâA׿ ×>¼°¸“··z€‰LãòzröÝ¿[Õßòg§ß²ðlÏ¿Yø¼€ë¾ñ{Ðöz׃Ýo,ë=Qù¬Á*ÿ’å}ó=Ù÷hzÎ×FÇR>ÔwõÑ/¯±5DÞù³}¯Ÿöçg²Ë7Ï6îßb\çÐs丳àÓß×s½ënã{wzë¥ÍÉieG=[&|zï\£;ºjÐÞEÎöÈ-s0Ý'ð/?·Ç9èóDZ[wxÔ®XÌ]ÓÆV½' ×u¾ø½æª_}dí:ñì®ìy¿÷7¸Õyâü<^ßÍŒáy¿E¯x‘CÆ5)nŸ OßE&bq.}>ŒÇï@[ãÓd¿õ®<0߈g°w~0ŽçwC߯Þý‹wœý³OÌÿ‹ŒëUzê¿­Û§ö×Ô÷ö&üÖ§8Pïõbë‰öîjt{G=¿ÍYß½:j?á#ñ6gý›Y±ÐiŒìó>0öb± |7&þ¢oŒê“üB¦w­÷7ΗæÁöm>òîŸÍý Õým~ÙÜhýúbÜÖb#ï(ð[› ÓÿX÷/äàQx^˜éŽV7¿@ !@%Rž€÷¨¤[Jåà;Ì–ív/§û.OÇãÕÐÓŒ¥wÙ{=:¿\£$z;üî-igåžÓ)Þ7£[ßûÕù-|¨q4Öò–ÏXòĸ9QV¿>~ôYbg¿öOôå’Ãþ™CÚ‚ô­œqlÌK [oøÌÿºÖï/™â$¾Ú[ÚZAöXãWqˆYŸõ±kó÷ùÒm,õ½¾:W¯¹Y™]rä59r¿ø«[úó’Õù`n^jÇõö;ý-ž•ý™ÿíKy¯9\[æ™ye˜Û/íCi׋£q‹ë¯á3n?@ÿ·ÁþúYŸ;ÒO̱³g òœ)_,Í£#öÄàR|ø1ê¸oìÞ‡kÔŸgrõë‡ùæë%ôÇã?[Û’¼Ú/þÊÚ»ò›³’ûÍ™vÉÙ§¬·ÆâÑO1˜Ïŵx×fÏëò‹cõ zÀ:·?wרÔ.ÄÁx¼v¤“ìê­Tüæjõ×Neœ« Õ&qý¹æomïÜ;÷%²‹Í3S|Ž•]½õ£^÷¹÷VoÇúä ôܯõîpœä˜›Ÿå¯]Kž÷|Ï)óõU;ê)»ûõ×8ÛóÛ¿ò|G‘ÇýPÙöšrÔ¾u+­ýÕõ]²üê1¿Ãê¸~|gš#ûÔZ(ÓÜßÔýv§û¶¾¸7Í£gT?w˜œk·8[Ó•Y[¼»¯^uʳæÔfÏ‹y8õõ©·ÈùžÏꨧ½ö•µß¸8ò<§.öY_mTþNwýœøµ×ú˜Ó“Sþx¯€§îÆé|ñ÷; vOcóT;Ź÷Nß;ÛØðYßÜSNßúç[¹}@tÿ”£Òé^j<}—Ù:6—Žèè“sÁè7ueŠiï‰j«ù<ÉîÞ>WNÔïÚê‹ymîüħv¶ß̃öÙ__Ú³O\/.t¹/Ìñø=ZyÏlëhïõ<ƒóž'FûK;•ïØ~eguÀż5B¯kïUcÒ·=¦\}—ú½Ø*¿¶ŠËøWnýçqöÌVïÃÚVO™æÝû\ÿõã70üâs®Öôô=ËèíûGmo/@>wÔ“o,ÕÙçý¢ýâñŒ¡oüÍŸøÑoõµ©\ï–}?ß®·e}1ïó¥çSÝÓ¹>ÅU=ŸðÛÓ‹÷%„Nÿ‘6ç͉ã~9wÍ¿ÆÖ½57÷®ûì«/ûQ;ícÿÊ;ÕºøôÑ{¿ûõßoÂú3õòýTߕџçfÿƒ çÝÒ»­þ6†Ö’ºŒÆê9ê^{·wXÌ£5Zßå9oïX¹íaI¼í‘âhß´j³ÔçÍ]>«/¯µ–èuüõŒÖ¿6Ê3½g»Ï?æ§;µóõÅZÝÞõÕ½>ï›ó“>ã>ïk¯~ μ¼ò­±ÊgÞïÅbpý}ä+a³øÔÃ_ï”ÓsB{§»§g¤öÕcÏñ[žwyæ¯Nw+Ô÷ºò[ãe}ggãØ~ÍŸ˜åm8W{vŒNd°Ë<œb¶ø]+Ï·á×úòµNšû“OË_]æ¼þ:'ôÇÕ‚eœÍÅúh¿çXÛò¸O›ÇÆ¥¶Õ®úW^ÇæÚ}Uòþƒ–3UÿZÆÆ˜1ÿÏ5fû¥¾n\¿®¯M›ùïdJ›CeŒC±kgçÕÕøÈS]gÝY<¨wïúë¥5åÝ`}{oÿÚ ¾S}A`!vc°òæ»ò`Š[Ùµ±±ØÜWOëc1Œ‹²‹Uù“Õi•¯²¬•û'ûµÙ½EN8¯V¶míw¯0æÎ1§Œµ±Xµâ]bŽ<7Ê¿±Û¼Ù*g]@ž?‹ÇØ,vuWÆ~ï™ÊjãÚÎÝT¾Ö‡~€©\ψò¸o”mL }vMyçö-NùjoÉ7ë¾-¶Ö:6‡â2Ö߯zqîð—ÚȨeÛªW]mWçI¶6¸Fm7f§x+[{¥Ó]¸ãµ¯k•¡Om5ÚѬÜþy6ïûÑxÓùÅ1&ŽÍý¾Ù·kcF-WO±mù&éšo}ó\»îúòÛ:oŸü\ªlul[2Þ¶»¾ùƒô·t§cqÛ×zé™àùÏå'âíþY¿×fú§3öû¯íÎòìbý”£­'ÈœÒï7uóN«öª~Ówïî·ÀêgÞ7Q󨏒KïHßV½ùqþÔWWc#¶vÕçÆB9úØÑs©X§|¶¿ûÌ7CùN²k?ýú]žú°ø®õ7yXëûÔómõ§zÿ­Œãæ}ýì|õwÏã»Üï~]žó7“½iÝ_y”Ùš/ô5ò´èÜ;Š>s`~ºÆÎ{ï—Ö»xã·ù低û»Õ);÷l\÷–ø+'õw¤¾§o|[útеòýÞ,ÖÚ²cy™?á¯ÌÉ?÷ÕiÍ:ª®öÚ-îê¶öŒä^¦ßs®øPßÿ­ùµycAl—×I¾¿äYLó}Ú¡Íòô;|ëX^íªýwwÄÖ—ß›ç¾k{þKõ˹¾ãÚï[g2ÿ^}xúÆ.Äý‚߬yÞë‡òÐú£þÆâÜO½®Y¿Ú'^qÍÛÖDßƨ1álT–ú©]%ãU{íÓšãQ±j<´Wžêu®ºÊ YKòïzqºÖº½£ÆMÿ¶¦ m®íÄTÅÛ½lÜëóÉwyWwyµ­6.ÄûŽ5ë³¼¥ó§˜ö7„µãôݳ<ΟÖ$mÙ5÷ªu&_m·í™d]WoϺÕóŒNç¶viKÏ#Úî eמ®ùæØøŸx7VŽ»ßå%ÿÞç3ínî ã¸çGq%~{kïAõT_[yzþëÚ#yÎko±8KµqýaM»öl^;;^¿Ål»þ.ÆæªÄ¾Òo×·_,ûë_ùýŸgõ‰küœVw>ZêÝßä×ׯyß2ÍÿIwÇæY;Ö~û‹ávÿøêjx^…™É®\EÆ`0£ŒØ±@âÿÿ‘wD‡ å5‹TUå<Õp»?¼½½}x‡ïðÍ;|ûZ3~z‡ï^ãèƒá‡ózôÉüð‡ÿ^st,ûËK~sð[ƒ3üôöŸŸÓ[Ÿí vÌc€ÿÉŽõÌÿóÁ_Ý?~…Çú¾ÚÆæ³3ÚæðÕÇ® Ë­}#G|jÞܬVà]CóÖwó´‡L»t­ÞøæÜàÿÖ{ù±Û„ßòæŽ<Ãg¬—¸è¿†Æ|6¨¡{x95Ïæ‡±û€Ú4@ë…Þæ§ù0­ëÁì¯Nл'/Ëš‡\Ò«Wî*3`OckÌÈõäÇuV|yÑí‹eF7ÎÀÞ4ÏÕgØjzsqép\î#ç ¿|.c‹~²ÌÎéò>¼À½e;Ï‹×ô}m¿IÆõªŒ×›/ÿøàËužVÞ=ŠÃ-Î7xÆúµž¾¹,ßöZý›MèƒÙÌ¡µß®ãìÛo×í)vƒc¬ÏàÌÍ|ßùµ1øãE#×õe´ÅU¿é Ÿg—®äcõªßó™w4ìA· ÷÷æõ;Öo0Þy„Æèí¥«Ö_;}-nÇZjÃwTûdy?(Ï€|üæ×¹ OqÔŽ»²à©gãdý$Ïœw¢mn~ùÿYóÚLW}`œnŸíöÛùc¿Ønó ÌÛ(Ý€>ïûn^¿ûÙK¦_rÌ9º—ˆ©2ÜûÀðžÓÈ‘CÖW¿×®mC·Ž³³Ñ¹FÎë~3 “3½ç <ãŸ.ô9ÖúZùÁöùx]?ûæ]ò¾ÓJ¿pö«9fœkhYçðf_66ÏÈ´—ª×3¨rÕYè;¾¼[óÞ%þÁßâZøÝÕþdoÆÇ;ÞöÑï|ÙŸúvÑ—§á[¯¯ék>}÷ûÉ×Wx¹‹ÚÇöÉú.ÝØ.zp?xë]ºÀóæC^ú7ÖwëÚÚçµñÄ ­qôÖèä ~b¬îêY—o‹æëšón5Î{Åý`yŸ•õ—ÑöÑÙþ"†ž­Ìy_Áƒ®òY—ý7Ý2ø6øëµ®ÞËŸ÷8ýc]£ó¾‚ßìSëØ{Ø6ÉõÖãC—s¶¦‡ÁŸEðcßÀ{i<ÄXü݈­Æ¹‘ý@^/{ægÞþp^.=Íã“,±TéÕíXÏ¥}9C½× ]¶¨›}r [dêëd^tѯÖ{»xç£~v&—^mʇö‚÷é¼!›x:÷wr£]ùhœ¦¡§{¢qÌo~1¾|½“±—n½Îøáxë´ õ¯4ӛ꽹ý†Þ•þ´|î¡Ã±pgÐ#æÛÈû?ë¿{À4Ç·Ñߌè1ß›‹¯8üؼ=bžÚ¦Æ@û9îÓü½ÍyÝè³Ö¼Ø}Ê¥Áßë—¾Á•ƒ øÛ¨ü͉ó y×ð)_['ëòWÇÅã>3~~R?p>Cœt¯‡÷7^ã¾ògû®“ïãˆÚæWlÀÞìÑíëÊ5v¿.>ÿgè~¶,ôžþöoºõìwSjáßøËWÛã·nŸ-ÿ'[ß“Îǯóå¸ÿh‡|Z÷5§O8§ŸòWèïéåwÿ™6ŸÜöúÆ':õ¾ô_yõz°ß= Ñìü «BÇx^í˜ nÃ0 Ý6½ïãÿomð ƒH!‰ç’¢l'§mÛnÏts¦'­ïvÊÚô"ytOÒË{fÖÑk_¡û7ÑãÀkŸû 6ÖmJ®èeݾ&Šnlr× e%1Ñ·OëNyp6c:wèmŸ‰ÓrdÔ˜Ùzæ¥87fë?9fMŽÆm áÅù$&zø³_×äs×3Ö‰ý×}o» kã2‘oû° ½Ô~z?9Ùø¼C}Â{ìÚWzÞ¼ÎÁge¾×‘QÛöå¸ðÒ7ĉmp:WßÁÉkÛ$ÿìý|à]«îøSýðû]2äöáÿæ«}¤ƒÓ÷§sõÞDwÜÉ–yª3sÛº~ŽÛ±Ðíz„ç{Ÿ™{Í<õ×vé»®ã"Ÿ0:f(µŠdÉ.4½kЉz~ÊÓ3ï˜è´ÏÆ}ÄO¬æ½o—ü:§Ì±q_w¾]W(ýÞçÔ:ðÌó\(ù£3É'ŽÉÞ¹â7DMs6¶³¯>Çðû9 ñ¬Œ{gº?Øã?:ÈÍ7ž?Ùƒ}({bg]Çaý£µû ;p€Å¹P/ËÀÙ5:"tí[îz¶ñÙ‚Á¸§šSú-ú!¿?)ëÙ4Ž5O<ž5Æìú€!1áu¶_ð³&VûÄG×ÒyCî#l°Kìöá\:'רÏÉö¹ÔÜu²?pÑ‹Æç}ÖܵØú=k½èðŒí¾n}b€…ß(ÈX#Ï3˜ºùLì»×Ý?¡þŽl"vê=ÿ.¿sp<ÖÓ¹9F?áÁ÷ß};Ôw ,Ô¼¿'l?ùôY¶,~“OfôàCáQÇ~¦²¶­gÿ¾ åÛ}xÙ“G÷ò®q~!缌çY·ýâ}˯8ðòµ®ãL¸Ãë³Í»“39Â?í‹×q2;VˆïKwLxÝ#œ-9‹ëÂ7ºïûžÒ;Æãš„ø?ÇÏ)c°?»ß=­ÓþúþöÝ0nÈ÷¢Ïp5ÖXc5ÖXc5ÖXcãñО ºx^X[‹U¬‡Q¼/(:,jƒ$j”A1ˆ¢ëƒ¯‹£ÿÿGxŠó§¦¦Ï|.œ—Ýéêêêê>3{ÀËí¼ÚΛí¼ÕÎÒÎ'í|ÖÎçí|ßÎÚÎíüÔÎÏíüÚÎÖÎKño Ç¿×·Ûù²oѱ~Àï>&±ÞAÇ{sAÇý›¸ß ãVxÂz{Žo·ó.ö˜Äûƒï×èØäýç:¤Ä'÷ÌAÞžã+Œ<ÄOÜ{蚟xâÊøŠãþ½Äeý¯ap·pÔÀ¹Õ^å¾ê?ëßCt)ß“vžbè.¿dÞ ]åf]̱`ï]áVþ¨¸§>É[ºÓ9®Øãÿ‚žãÃמÇçLZˆ¯¼Àx¯Ñ9¾ŽÎS3+®ÙËÄL 6 Uy4ÏÂþG|úå†.Ïp>çÔ„?Ê›žÑþXpÔǽI¯øÌPó çµhîÕW×Ky<‡t[q¬cÃè+ùÓgHšp†ˆÁ¸ä¥º³oÎÁkܰ÷„c¨®½ÎVÖá5Üa®WzKXpì‰zá{l6³9~gT³–=¿Ö‹ªŽÔÆ5÷3Þ®S…¼Ó¯ôAÅ[¸³ù“§*M¤Çlÿ÷ßèøüaŽÄ¾Ö[Ÿ³Ê?ÌAÞÂO÷…só˜œM÷Á‚ÎA¼|* Æûl/¨k©´Ú°ßË©¹Þ´Ïwæ¹êùõ¾q»Î+GÕË<Ù?Ö,¾‰­º«ü†î¿™÷ª¤É ŽóI§'gûÿOt툯žðç‘;¨ê©çÕŽ]qÜ Â#>Ãß_«[ï.ª;ï=îVÕΞ©æ¬uÃðªjz€ùì [µÍÞgÚæN©jcn¯oÁ±Ÿòã,ïÚ¬¯òfz‡y„_Íc5WâH~¾ô sVyfþ̜ޫôŸïq'–ãƒ\C¿j‡‰ƒžU®ô\ΙÇz?ªÝà}àOåék~>{G¶Ï }D,òRmôHƨ7Ò0ûðÝ%ÖãäßД—µ°ŽJ£Jb¹öââ©1¹ ‹/°÷Dö«ú¾©vðYÿ˜#ñõ®º`ô‡±Ú1ÒëûÞ$?}ƒVܼnßÙû¿°Ï‘{$1‰çu kÃ~2–º)Ο—誶3½å¯¬Ç÷Jê”wô‚½F³ÁÞ W˜Òñzoð8>Ëš¼×ºç¼W öšÎî8çÀÚÒKúN”Þ‰ïõÙLÞ¾óÿÀ±—9 Ú/7Ø×q†»a+mÎúí>öæûHi·¤Fò@â ;ßkVçdÃ^ÿôW¥½s?ÓÝ{LüÊ¿ù!m„û56µ—.•Îr8~µCª™cÜl>ý9å­4«âµc®Å»ß‰C]f}ݰ¿7„·àè?âøûÙŠ£GÒs©gηÏó?¸Äå]^yõj.ä¡îø^Û fî›íã~åßø{ÇóÿQÉ?×záú¥vîMß ù> ̇èzøûóSÌ{í;Èñ}7?÷ÌŠ#× Ã7ì±ï½ÜuÄ_б]OqÒsÄÊ9Ðýâÿ³prf÷‹võ™Õ%ÞÕþ!&1¤±{â†/G]“ƒÏÑ#ÔóÍÜw8bêî$jÜK®»ëã½Ö7KΦs¤Väy¶W•‹9ìû%mÎxHÎbæ­òm8î‹jÿiÖÈûÿô[š§§Ü·ä÷5NÅÉïYƪçäD>³•¦Ä#Žz$mòeÜÙ“Ex^¥YÛŠ%EŒ‡EQ¼±Štµ¯  ʲÞiчyßk÷ÿ?Âú•ÕgÄz:U‘™‘Yuæ<ðd[ë¶~ÝÖoÛjÛzn[/mëÕm=ÜÖëÛzg[˶>ÙÖO—ýÜ÷âe/÷ðó·õ¹í!æ?è¸Ïoë;÷:öGØñ¿ÚÖ×Ûz¼­ï°cý‚Ž÷v¼Ø1‰Á³ŸÙYžYc?c¾±~æ9±nÕüz^Ÿâˆ­œˆÏ<ƒç™×Ûè8 v,rĹKÎè#Í å@­åÍ;Ïj6$'îǬ%¹¿¶ä½Šãs³òkÿç}å3 û*{àëିŒ#ž|®ª¾¬­açsÌçê¥ú¹GŸ ³]>'=¤Ul~îu%_®+q²nÍüÔ©¡×ྫôγâ^\ÈK3 8/ÄQ¥µfÅYœk1Tï‚c/Wµÿ…£7SËjî(WúF^áL¾6ãö\™'qè5yƒŸ±.ÆöXžwΞQýšõòžòô¦ÜO5‹?ñöu­ÄñwÆŠ±FñçydUý•xâËõMM}žyî ù"µô ™s’–™“j¼ÃˆŸsÁÑ{Ž=«Ù=žØ>S¤g…!Þø§>©z$õQ~‰Çœn°ã>CŸOŽSõ†ûî>=Ý0Ö\½ÙäC÷c»N?gÛµ7Š8hè<(_gU÷®÷sgß+wúa¯š«ªÃc2Ö»¹ò;í¬6ã~™i ¾9§áÈuòRõG•ëlÞyž©Ar?ëAñ^ñà>ô~^pœ§é»äAÞs¿åœÉ<üì-º~/«>ååµ Ë9kû_šÊŸ•òdò¢óËe/÷ð3Ÿ3©;ï{åš8³ùàšäý–¾ñ^âù<Ëøª«ÒèÌŸgoDÆÍw⊺iêš0þCt¾¼ç/½¶b޽Gîù:ËÏû‰<ä÷—êlÃx羂㯸Mýª÷YúoÁ~V缇¸÷沿âB³Ro¯Í{€yœý_ ûÓuôþª|$ì'˜{^s®òŠ×’úøŒ#næÝPãÌús¦ÇßgЏK¯òŒbóïZMîÞiùVsÏø õÅjÎê¦Nª£ê冎£™²`Ï+÷Ò‹ÜŸ±y®ò1ª“Žw‚û9ß~O¹î…™ÉI僆±&ŸõÔpÁ|îx=Ž‘œ0¶æzjL ×3ϺGÎæ§øU_?EÇÍû&甸È:ä¯ÌI;N•Sj”óålžú»²ª3qôù‘ï’*'ÖJÏøLU¯¦+?Ww†°fßш¥;XܩΙ¶Ì÷Oìóªaì½ç+û}Ò0j¬^ÐqTsöÞŠ9—Ù‡®ô­°Y»î÷câ«^ÏKYq䬡×Zå$iý!ŽõS'å&mVÔõóÏ5ñ·Oåç#Æ5³WÄ#sãŒÿuŽê΃Ùƒ®“|:ãÀ½åžôYɽÏ0Ö—÷wΩÿËÕ‚^<—˜ž¿ã KÜä;kÖk #ϯáèÝÄ’GÈ5ßä>»ˆë9ªüžKÞr¾To€k\fÎÉâx/³W¾ÅÜ+×b¦~•'Sß]þK,éêõøŒ'žzþì7×ãF½«·`UËYÞÄ%Öìâ¢úMgV{õbÁï>w§f]Uã#Œ¼Îðæ>Èü|&I÷1âjÞÝáØ‹Ò>gCz˜ú“x•®åYõEÎ׸җš>×ýü-ößÙ+ÿi.dÏþ ¼O4x^X[«E¬Q/AÅ(&º¯ BPNäCQÄ}ßNòÿ„S¬ÅÖÖvïùýœêêêêž9y àéŒ3.3~žñëŒ1ãõoÌxsÆ[3ÞžñÞŒf|4ã“ËŒ/f|9ã«_ÏøfÆw3Ïx†=ö/XñŸñÇŒ¿±æRæ ¾°‰ù-V¼ï±b>AI¼Žó‡X1Ìøo⓯rŸØ?¡Æ'žp¬~VõêœêØsK-ïc«ùöš_u?ŸñÃŒÑkÀ^;ñÉ—XÄP¿«ïkX9 ëlœSƒäÚõ}`ÅÍ³Ò û#îÄs]‹<ßÅÊõ}l¸Ù{çLlêzƒž÷KsIçNܪþôB…ã3Enwù} ö¼÷ªê“4>ù²þ.OrýûùÔ9¹3®ùT½uo^Ðû’õ¦öäãž$¶ï¢wàØ‹Ä\°q¥^9Îq`?ÄÒîY°õ@Ú'ÆYOs_°ÖÏÐ÷–u3GW»ruyrÆ…{†¥‘˜â˜ä|—Ç_aÅàÏSçÓËüŽçèÁõ|ò'öX~”~<ŸtOÉ+òÈ‚-oê¬ï=ëgÝeÚÕ.®üžú¹‡º³ª·:Ïz哪û}íþHÍš´`mÕ=õ猰žçïù²¿¾O…/ÍYå3Ýõ9¿ÂàNðçÚ“kM½¬çù­4érËçòÕ‚ú®é<“ý#fµß:ïûÖÀæÿŠoîMá©wŽ£¿Ÿa=ÄÑÕÞôzs¿wØé9q­0‰G¯ 1ù.Ð çgõJ=¶x¾Dï¿ëùz¯röC½›‰MKçuFªfíæ"7ú’ÿÆzn°í¨äïÜ¥‹üëºTo÷nÎQ§óYÿÔ·k|àsÕùLÚªÞ{èw™óâù£ª71kŽ8ù\ŠÏÀOXz3|ŠZ3ÕË{DØ•ˆG3Gê™Ü½Ïz jNˆ§3üÖgð. ޵úÌлg|RÓìÑ‚ýNÎ÷R5“îkêñ·N§­ôºàXÇ¿Xs¼Bÿ{˜vXæQMª§›SáÉoy_J÷–øÝbÓ y©ŸÂ{ˆ#&5Èßç+ÍÏ|¬|òLÞWùfá7Þsê“w&Ï ìóñ¼´ößÕ™—5iW¨ŸÌ?Ps–>Õ}ž~¯z–¦ó!k{Ž»÷à@Í3{™>îf§óšr1Oæ¨ð‰- „# ÍCêZáˆ'ß}âéooõþZïyÓ 6îÊWåº`_“ï%þÜëâϲ&מcŸ«8jÔí&êDÎ×ø³Ÿþó=´ ög\+ˆïõ9µOÍ•#ïkz| öwçmÍNWÿÀ†§·˜ö—¾ã7üSqwßT; 5«8°.iuV[b÷¬·+Ï“›ÏF7sîÝÜï~gWùXÃÀŠ«Æïø3îÛåÿ¿ó{~˼¹?Õ7oøÜ:_í›{X1r¦œs7O¾¿Îæ)19§Ý¾îüª§òªkM|άvL‡[yP8°Ýaô=k'Wõý‚Ú#•®yGúLI¯_}Í™wüüLbÊgê·ê<ó¨æ|A=gšyÖÎ;ó½žëŸ.W5ßé éí~«ô®ú—s­Ztç×=!\bÞâ|6º½AlâRõ0ylx©·<šòLçw¾IÏîXõË÷ÔG¿_5Vý`/äù Öó¾›ræÉgÁ^ûkv´O<ù3wš×YaJsúÞu#Nbø¬ˆ‡æ%9Pï™×¦÷djýös‘žÍ•Cúå žÕ«~ú¬³ê±º7ÇÀ¦A5 öóêZtï\í³£ù¦–üß½­<ÚE×äéf9§“.8jK-G\ŸúTi qJ>Ý,s¿ø.>›%¯Ûï†{ø›0uÓ ˆgůòÓõšçùÿÍu¯²vÕÝù~àè%í¡3¼n–Ü;ÿÈŸHdx^•XÛŠdEŒ‡EQ¼,*^P´¯°‚dUViQpß|¬õÿ? N'*NÖ™q¡`驊ŒŒŒÌªîžëű^ëÕ±^ë½±ÚXõéX?uë×±~ëf¬?ƺ«õæóoŒõæXoõŽx_ŒõÕXߌõx¬°Çø{ÆèØð_ÀCø î'ذ?ësl1asWŒ±Å!¾ør?ÿÎÏ©“8xü÷±ÇVLÆãÙŸqŒ—y¼]#b5ÌùH«»ø‹£jÙPçŸç”WzÀ9©nÔ•xßbÎ/1ÅExéaŠ›çUá$¿Äk˜9J3ò¼¯nYÇuoUš^pŽ+î/cÇwþàØçŽ#¦ãÉK 3o×äÌ›¿ãØÏÒú]̸îõ±a&×JÛ‡XÏú‚Z4ÌüÉû;Ôšs5'\kéâýUé’yÛçñ]óªg}}‰ ÿlÎuœ×µêC÷áJ×¥ÂÍþ!nö¶ðn0kA®Êûù7×ßç4õÏùæúK#ŸŒ¹Â$wžW½|¯ïÓŒyrݧ\ž^÷ºæ¯\ÏUºÈƒÙóÂËžO­+<泃:ñ3þßù¥ž {½äòJÿGuëØy‰Oö˜êγÜÏØ¯]÷JgùõöÚÈ£ÄËœVyT:‹‹÷dj=/UÿpÖø\L*žî5éwÁº2†òð¹å~I––}¬gØÞ¥~>õSÝÅËgTòJ/{î©åª/ÉÙçu5'cd„§Z]PÏ®[Ìœ³t¿4̽|]—äªÕünØç­0‰ãò•|š=¥š“[•ëÓëÙ*?{Ƀՙ9ÓµËþ¹O½ƒï‹³:w¬g0ï“oÆXájF%¦ôlظj~ŸùQõùG=„É7iÞ ³îŠ£Þ¿ ölG­‰{‚s\qRÝí«8Š‘QoaH Í÷¦÷N•«ÏïŸêá\ªZ¹¦ uŒ|ûul|…CŒ†¹WõŸÌµaÖfuG¦¦ÄP½”Kê%Nš/5b?v¬ûÜõQ÷ÌoGõšãH'½ïμêXù­áÈyÓߣ®‡ú¯cÓÖk*LÝYÃʳÞ7 ûYÕ“X«üVõÔýq6c;Ž>ÉZæ¬~Œú"GbèlÎ÷—ÇÎ9[õ™×H³Üµr:jÍU«|ç:v¥“ænÇ^ƒÔjõ>'>g ¼±ê«Žc¼v¼Š«cÝ¢Æ#׆ãÌë™sb‰_êÉ|Ùë^£U¾g¸«~%wiª¹’~¨â±o]Û¬“ûó‚ºO’/ïB÷{C]§ÕïÒÙk–1Î4¹Ë»É˜òÎËܯ½ŠïóMy)Žö?‹3ÒE¼ó¼sÏÜ틇Øuh˜u¦Vù—˜ª»ß sýÉ­ò‘f?Ïëog9gˆ¯y¬þàÍ8äëZг+=4/ùæc<÷ƒÞOPψŽ5®tÖÕ0÷_~¹`í·Ä®ü ÿ ïÿÌHçK›šŸ}ÏèØ1å÷†ûËçMå‘jn®f ±ˆsŒÌWþâwªê·fy€œ•ûטçPÆSbç{Z|+®âÉZ“Ÿÿ¶G>îéížÎÞ‘§½GS;ϼ˜“ûCø÷÷1ô¨z¸ÒWxâ)¼7±çK­ÉyÃà,l×6uÇÊNU#÷ña®¡ûÊëfïWøä÷ççðŒ+Lð¬<ç1¦‡å]ê ž¥Æ<ó)¦Ö<‡Þâ³ü]r๮·úésrÂÄo<µÇõå>ùV{µœx¶Î} Sã÷0ý©óåMec¥ÿ«Þ§‡ˆ™œäñ; îS=Ê õ•:sò,yä’&O0jù 纪–ô‡8){„§ÌɼQ]ϰÏÉ ×ùz¶é bÿ€c¯eV3Tér©†¶Ï÷†ér&Žö7¬sQ{Ùß*WF®æ¬È«•^¬%ý•Ùì5øÜå´pOØÏ¡°‰«~j~ä_õît¿Oºº?ÒÙ'ñHÞŸªïÔÊëÚ0ßmê}5 ä¨÷¼ëçÚ‘'±ˆq‹Cüøü†Ù'i"ÅÑýÃ߯¼S½£\'æŒêÒÌ“™Õ0jr½äG÷ûH¼Ô)uÏùõÞ§&Úã5é|Ï‚GØg±ûÐß É%uò;“°2ÓO˜ýÊLÏ™ÉLYõš­î ~ÎØû—Øšï ûÚÕqVFˆŸ×ù|†ÿçz\aÎ{5•ÖÔh5®•߃…MLîÏÔÒsp5|®ªž{OÜÇ®au¯¦s¢w¼—«ó+¸Æ™ÕÉgåCÿ¬¡s2³›¸º»$.3WXâÉýÎKµ®úuéž!½èŸQëœØÒÍýéØG9}if_¶7¨ÏÉ3ß5û@-ª÷;ñ„%M7ìgX϶ûgÓëU®±ÏJϹ¬'ýë=`å½Àu£f~GV¯òŽþk8×.ó“½öwªs®Þ‡ÕýÎóìE´h¨õH|÷ºf,kn¨½¨w]ÎÐÊ«¬jØ{Pó³abdTõ¦Ž+ý¼Ï^Ãy­Ä”w6ŒzV3,_ð§Ò­š1å–xõ£ªùH{ÎîÔw„†Úƒº· '=w‰kõyp>Â"'ÇJN•öU¬oÕKrú5f•£U›¸žÑ°ž³ ;{{Â9ß0ß•Þe™ôLžêMâ5ìó65ä~ßÇ=|–g¦¶Ž{‡=G¯™ß‘<ƾæÕ»(ï^®¥gLÕip”ŽÏš¸>Ì÷ÿ_ýL«lO¸†+ ÏË|©'Ô}|ŽÁ±ÂvTå ŸPŸÁ?#sA}ØPë ïÓVù(ìÔ„¸üžN˜žÙ+ö´aÝ/i¼šéô³<"^ªÏ©ŸäÇç¼Kóê}ãç­<™~¯|’zyEØÔ&=BÜÄZiò§ÒWX«ï$œ£2¤òÃ*K+¿eîˉ™úVü+ÎêqÝÇþöËôO¹utÎ3ì3Ü}çglØ÷”º_šù†ã*/+ëª;Àö9îXù7b^cjw”Ô¡¡þÜߟ§?^än ï­æÐ1]× —Þó»±23¼Ú“ýåùš¥›ûý'œ×Ô°×(5ϳ}_å}^Hï爇û”9ìE¹N/åþ†ÑõA—•'ÚÇ=¼7e þ·Í}f‰×³úþÜ3%Ïp/®ðWy’=S­Ù7Íô-öu7óaÍUÎ]šgòÒ¼%îê>F\ÿ|UÕëZz¶­jÈŒ{„ý#m³ŽŠ{êQñm8ÇÊÞ»Æ/éZÕ{…óšzG¿þ´µG`x^X]«%5¬‡EQ\?P4ˆŸ  ʲ¬®rP¼ˆ"û¢¾]ˆþÿá9ÅÔT:sÄ yºIuuuu'sžø~[?në§mý¼­¾­ç¶õü¶^ØÖKÛze[¯oëím½³­÷¶õѶ>ÙÖWÛz„CŒŽqþÅâ,Ï5ìg¿¸žû{ü_·uÃøÂyˆËq>ÞÖç<ˆuÁ1âõm=À9¯pÌI¼.ØñëLŸ÷qäHÜÏ0r&þרcTœ3Î[¨õ¤ÄÿÇÉ¿Â|÷iýçz¯<äøâMžß`Ç–c°nÄ OñÜwŠ'ÞÅ^[å±âÞ1bãe ŒÔÁu½`œûǼå1ž»®Ž%=Ý·®á3Ì9yx­vÌO±k³ê‰Žñ'lò%¶ø¦·¤ó–v·jž}+ÏV:8_ÆàË|5ÓæXª×*?±çàøò‘j(žÔýUqs f?jV¼˜•3=^á¬|íµQzo¦^ôïÕ§šŸÇy¢ºsžd¾Â^õsMLïkêéor%ǧ˜1‰÷ž÷tug3_žW^®çR³ÊËÌç[ϧ&<ç|9ëªxÙCšÍ©çõ55à¼ì˜u}ßqsFdí³V•¯Ò÷ GÎÒꂽN3??4ìüT+¯sÇüPü¼s}ÿ*–k ü«¾'Ö=æšÏk×0ø³Ï=ÿ³\OÇȹ&ž~W_0×ʱ+?kå#Þ YëäUaøyòp§ö«·¨rUŽU¯3Æö\ÿÁè)õ¬×ŸÿÏþöÞÎØÒØ=p¦-µy {N©óÙ¬w}Ä‹}ºÒ:ë->ÊO3¯á¨å*~DZ/4w+m仪7¤‡ãTZx]Ó3ÎÇ5á;Ý=Ó¶õ!ŽóË¿‡ô¾¸`oåƒü†8Ãë8b[ÃñœjÅØÜ›žc,ÇÖ¾Ô:fÈë9›¨?ëê5uÎUMåÿ|Ï1½OvꛣâÜ1û£açæÚ1.cº7åKõŠpŸ]÷‹'ñ[gt_8·ŽY?ÍÝ; {-¼®ÊE{©µf‚ö9¯ô•ë˜ï©†Ù«:ýº¿óÞK\úÀõgéÁ³'ïãJSá—ê˜Þ¹uG1çì¥{Œ<Óç‰×0ceoR»;ìµ$fÃî-σÿ÷Zgêá=«X©‰ú¶c¾›Ü9ˤ·{ÿ‚™cú8kŸXÔålhư¿:n•¿üÎ=ž“~ ñZ¸¶êÝŠ7uà|¬¼A­ÏÞWƒ§óÊÞ` õ9ïå¬'cqÆç=Xùˆ%÷¤ç ìÄè½’8>c}Tù3÷¿qœƒ·z#1”jN>Äh×3Êÿ¯ëÿÅÙcq¯sÍ~ÊY¸š3<›ý(~uMÝŸ©ûª2çn¥cöÓê=±:jßgœÌÁ{Àïñÿ§ò±…«w”ãvìs]u÷ù¢¾qÿ-²â',õ~ê,/匽àèÿŽ9_¿ŽZ“’Æ ÏóðÚð¯êé|{HòɺHKá(?åä5ñžKœŽõŒ!–¾KvLiN,é!ŸHóô¬4•7øv-é{¯™Îéþ¨_>¨µV7OÐÖL¿àzžÂDð»ò!zù/=ï=ðäwÎMÝ?Åa6vš¤oßU ®0…¥zt½åx5÷?­ÝwÅPçÜÜ»Kmxž‹÷e­óÜ×]x5Ö^¯î>”¦®Þš9è5¹ãÍԖꂘ‡]=RGàÀ5ë 3ä¥(6~S^Ô>9R›Î_ôÑý:»'³©á¹Ô‹ûNõéâÛµ±Ô~^ûS³ÎA÷T¾U–ê=3›'î¯aâe>–øy}Rïà0ßoêx߉˟uΓZs/+ߥv=$yÍzÇŒ8èb6·¼V:Cô1ÄUw…×îêŽXëìsŸµ]üŽG[òάÇkõøªã•fËuÈ=ÓÊ]³z­í{µO÷>¥„7óQêøJ{êÅFöCsWxô’÷šÎ27»³®7ú9{/g?;~G1è­×‹Y°ÔŽ+,ÍTÎ_qÌÙ¹Ô¹§ð”Þf^!V~×êb^Ý¹Š‡wfúöÞ ›^¹†µ—ÜÙÇ\IÓ}êýE9+uÞç®÷ó®{†ú×k!LjŽÏéçMõ5_ëÈ3½Ðéíª—ÂÌžÍtLÞôªã‰&\¼žðM~â¦ÿ½¯âÉýãXŽÓͤ™?Ð\¤ }Ïì0¨ÚÒ]à¾ZêˆuŸYÛy†Y’^%Çì¥k-ï…³§ëç3º>»³^[áø¼¢.þÞïµäô¤Žš×¿uî_Îjå^ežýTç^$ÿ×ýà3Ìc0W¨Ólž¥‡·Øô¼|WÀùßê9Ïü+fUÖÛë : ÞQCc¯ö¥'ñƒÏ7ÕÈsñ<O½Ìz?¼=ëê´â\fuH Î<Ÿµ¶ü»þ“¼º ãYí8/<îzM=q'dÎ]¿,M­h¸$å¥Zƒö³7çˆöÂõÃÚg%3³ä«sÌhqŸ(7éÐë×åÄ™sѽ¢º¥WÀ¾ëûp7Gü÷ÁôÜý^Íþ§ÇÁÆKí½ÕYÏ×¹äÜÑ9xÌršÕîêmJ>]/<×Dj¨ó^w]tç™ÛKí½Lo ã>žšåè}»OÏ|&i®ù Á›ÒÖ£:×l­ë\›°¸©U×ÇÔ…ÿ.°Ôqn|]óûb­£?ýw~oèÞ9›ÒWõä=8ÓýÏxÄòûï¦Î9IŠÑibö›y‡»»Àñÿ­»{É5ëü\9¿:¯tq©g»¼.:çú¥¿:«ýìÑçêƒf‘øk†ºîžÔyîû Ͼ\q_ëØ´–y u3Mxkm<¼fú\w=wzêÞk9 ò=!þOë<—éaâ?¬ÝÏ'„é^îx.užW³Y%~×q¦·ÜÛWµp?ÏbŸ¾íæ-XWžZëìWǃ'uuÍÍjrŸß"²wKñ}®]ñOìÄ£–žÿ1ÌM\x^Y]«\E¬‡`Pü"Štj"ˆ"¢$aQ\$ ñA|[<øÿ„Sœ-¦Nž³7^˜—{gª«««{f÷¾ðz_oöõV_ïõõa_÷õ°¯Ö×ç}}Ù××}}Û×w}ýÜ׳¾N}ýÒׯ}ýÖ×ï}½èkéëµ¾îc࿃ŸØÂ|Ü×}ý„OXÄy[œ÷ûú[Ž_aåù × ›¸—¾îaËÓcPâK‹Ï0b}Ñ×÷¨u ¶0už{–ëïGz7lù?ÁŠÍ3•3¾â)~ª±Ž4žÕ,õV. [¾î‡çXñ…}ÆÐC?žá^rX°þ¸Fò¥<ù)öž¤^¬u•›çUåôö~®0•SjæZÉ×Þ3^ƒÿËÏý'LÇ"΂q¾êãÔLz±n3N3>®Wöê9ù,½pä1qži(Î3/˜Ï›ìãÔCõqìÔ¢âëøÉ›¸Ä¬æƒk‘ú:–Ïç©™v [¾dÍ|ÿ~¹îqߤßf:U1oÍåÖ0ê:Ã;cà¥`häþà"gÝØcÎú,=÷Ûú%ÎQ®YÇôﺬ!ñ«Ú%Oáf]ˆw«'2ßj¦Ìú âF¼†õ¬fˆëüòº¯òAåó†}-Å…õ¬¸Ð#®UúlæaÇ&wásVÍê›úI7yn6GìÏ¿‹½?仼Y ]‰Ù°rQÚ«}wñ¥ë‘1«ÙZÕòèä1¨7çÖSÔÞ—wîa?kÙûU¼†mÏ*×ã.uå{r†­Þ}‚­w|+Îk b~‚Z;¿?2‡Êÿ³»”?ÔÊcxmª\¼ÏŽ|F®Ì—¹òýèõʘU^ùNÈþv¿3Or¹u§ý‹}ÌŒ—zJË Wž ïf¸¼?«y’ùõÐÌw®×«Æ¨Þ¥'ý0ÓG˜þ†¯ð„•÷¸û‚û¹—ùUw–ç“:ñ¬z‡çÅ•ûôwùNø³œ¤}«÷€r:cäå5÷zk4¬xê{Çñy¢ó<ã\T+?Ãýé×Éç§{·ª·ë¡9¦žÏ÷£÷Ï“Ë?õåyíg¾^×ÊGé¯Ó‚ùý£z17éZõ½ô幆½ž•×]ÎóY?ylŸo' m…K¼·±Ï¡a‹I,Ÿ§•O¤‰ûͿà ¯ì'žãŸÚŸú»GÔÚd‰WÝ > *¬ G÷—ð‹3wA­‰ð„¥·VÕKÌûÓãŒç¼ù3ë—†mgsüŒZSõ°z¯òœf¸ûŽÚ<žv©¹sv¼'NØßm®mUû†­Æš7³š)÷䑵"'ÎÝ ç‚13UƒÊ?ŸöœÔy²ÿuw7¬¸‰á糦äåwAr¼Õ÷Ëu~aO¸¹O¾d|ñoãšž°¯÷Ì/pÜóÒYßÊ“'lµús½Ò[òù Ÿ¹Íúwã^õ—zÊgÎ ûÙ·>‡+m܇ĦFUéÇ™>ÕwŽŒ¥³~&6qtV³Ž{ÒG³ØU\é—³é(G½qÃ{%}ïùͰg>˜}?¨ºûý\³·ˆå÷¹{ÊõxŒíÌ–·ª8gŒù(½©EÃþ^ÒÕ)kãyùœ¨¼åó³]Ï‘3Ϲ'Ò·>ÞÒtÁW«é}’1ŸØ®ñ„Áóέª•>ÏWßiJ_ÿ+ßOɯÒ8ãÉgÊy§'Ò›šo +?ñQÿþ‰1OÜÏÿR¿Jx^YM«E¬E0(&´?!BPTLTŇèº{0ñÿÿ»˜[tMÍé¹Oô&wººNªÓsožh}}Þ×}ýÔ×Ï}ýÖ×Ú×}½wùl¹|Æ¥¯û}½Ú×k}½Þ׃¾^ö¼Ù×[}½‹mÿlç|Ô×'}}†íÌg}}Ù×W}}qŽxü‚Á…gòá&&±œ'÷®—=þŸñ:XŸ!ob¿ƒ³öˆë Ìù GZœÕ®šgXÔ•0øÌ°ÈëÛ¾¾Ç†÷#ö˜Ò®ê•zëXÉ)ë’FäÓ°íý£§¬í»¾žcÏÇû‘\ˆé5¶¾>Ä›üžbèÇs¼ßª5±É·Òν—u»ïîaè ¼ÇØ{„xŸbã8ëíŠ}nÄOZfͬõ žÌ‡×ì=®ú${Ý©gj™þ‘Ä$OeÌëð3ݳԈg€ãùÒJõyfæažÓ°aŠWòæ¾Jõ°¡Ö%µ§Gœã‚ú,÷JæEž¡&ïãèÅ3\ÕÊg]£¬M¹>›?™£Ôí¦¯_±Ízˆïü…ãR†*î•çÉïmŒÜÏ´Q_Ü+™ýÙ™UÏ¥ Ïþ™ïoq«aú6׉ãû=Ÿé‡*› æŠsŸeîˆÉÌåeß8Wx‡T礦äÉgäó̤ÉóåÞËÌëÜìcêæži8ÎNÏð]r«ZxFr'ž{|Áãw ñäûOöŸ{ô¹×ReÓ35{b6WsEmäka9ïÔ˜XÞ?÷²xè|>?ë·{¹¡ž3ÞƒŠGÕoŸe³w ö[zUZ%nò–‡|$w÷é‚;û  6ó§ÞzÞ¼·Â­ø’gæ:9žé[ÍŠ†}í³{ÁëUòJjÏ稉žSÿ2WÔD9õy絓®Ç#ßoª¾¥Æ®¯sSæÅ+kçóüsJdzy'o&—ÔõÛ÷0Πÿ‰M<Ö¤žpß †é3?ËûAìY~½⸎³9TùA8™Íô“öÍø¨·ª©z×7’0ÓçUŸÜƒwég}òÕühØóa¬¨ß‡ª'~yo{FŒ3r&©/ ƒïzùÈ9¹÷˜/îS/U“4RªŒ‡çò·Õ•ú¨õqÁ±éœúäw/¯Å÷‘ƒß!ÿwÖe¿Ýç Gj–©7ªI¿æûôkÃà<›õ³>V:TøÎÿš§äÛ»ðUf“|}Wšˆ3ߥ’wÎZs6«þ¼ì‘ÞÊ12ûÜ—õrÏž›Ùœ}_—ÇÞdï+ÙÏUãŠI<îõ¹)Ÿs_öÕù¤¾y¶pä½ì§ð4¼ {½5Gì9ñÏq®yM3{é—z7Û§ž¯Øk¡su^ê"}³–ì 3é¾&nòwÍg×wÅ~¦{–gZT\Ôç¡ýYSÕëÄZ±ïSÎGŸð™¿`¯ëªòà^TÜÇ©szYwÐL£Ì…ãÉÏ·³Æ† Ù¨îcáTúpŸ|§3Ò{³™Ç½«ˆ;ñ¸GÞ”—ćžç†ÏÈoÉ]žËœyÈï8•w˜ ï™Ïå†Ñïj®ß`鼓¬­ÊçŠãÝãw£R­ž¼‡…G>ÿ ÎD5·\·¼7òޝô«ü®ó”iÕþ_zá¼õ;]ÅÿZŽÔ£®üÜ0ú¢=ÒÏŠKÎêåzËëÜ“}T ÕoηÂÒg┹L/¨O•¯´çšvìÑl†d¿•]÷zÞOò–ÎPÿÏüDßW÷gö¥Ê\UßrîWç²&âð™ô_âj¾ÌðøGŽgäö Ž`ðÉïÊ»þ:J›¿/û¼?Ê`öጻÎw¯ùYøUßäi÷O5Óϲ]a/¹Ípªú+í+ŸWkü|/˜×]ayn<ÏOQß7Îï%6މ9›“ÒÀß­Î2ñ†~F…í¸=%¾ÄP½Üó/ÏÝK&x^•Y[‹E¬‡ (^/âðáB‚ŠI”AqEò"¾-ŽþÿaóSSsºg ôK¶»Î9uªN÷ì>ð¤­ÚZÚz½­7Úz»­wÛz¿­ÚzØÖÔÖ¥­OÚú´­ÏÚú ÛùŸÛú¥­ßÚú+Þk¨1?hëC¬ØVLâ}ÙÖc¬x?aÃü+î+m½Š#®çH,á|kÆXK[pÄ{+æ;Xóö#løªÿ ¬±Èã}ƒ:ó‰5fUƒÇ™päCÿˆ=vÖáœ0â ‹¹ŠÛ{ žW^Ù/ïUÅqâ‰ß;lõf¿ˆ;aÌå ±¥ƒ[ÎÄö¾Ý`¯3å-Èå¨OÂ'væìXêËÓ¶ž¡î1ÔýöÜ&ìûDÔóGn¬ç仿±ÅÈ|'ìõD~¿Ã–óŒß±ØÏÓ{ÆúÅ'qtžù0úFÚs»þÈ‹kÂ÷Î×}ž›÷ç\ŸžŸêýÇy˜®'ï{…ëõ°þÿ\ÎÿK8¾Ïæ,lr{6Ç39qlטj~¥_Åà?Æ‘n'g‹pxÆ{4Êé‚ g4Ol:ÑLrMŽÎU}u?÷øqnf±½>Ý™—4ó9öó͵3â]º¬´ÃxyG»×çl>9G½£YÕó±4‹¹?÷z özqÏñ\úLçôÎðÜ3歹ögÔ¼ á9†´ª3Ιô9]÷²ö]=¨âT~yµF½×SUÇ-Ž÷š¸rž˜ï(†óŸ½“F+í¤nÜ~çkFë~f_^`¯[çì/l|Ñâ›1ä5÷ñüÎ#–sBœÌ÷‚/±’ç—9é^ä¾;ÔÞâ{å-çâ„ãÊxä ×Óœ ½÷[Þ|ô¼Ð‹åµÜ'¦ôTÅáŸùÙu”:{çŒâøêaj¿fCÆbr#Ìô¯°è[ž¡·z\'¿>›þOÝ©ÝašÄ”gñTWâ¨_Þ{Öës7±þD¦ôîºì°Ïî;y¾š×Äsýô0˜[ö#ßUnŽ·`«Só†<%ßÏ#¯¥/±¥×¾¿e7õÚ›äçìûØÓZ¾'¥aÏû>ï¿ÓÄ¡ûÉ÷%w<Ï;©ªQšwœ¼?ÅÖ0ã˜SöUù|Œ=/îŸÒ¥ðªųkÃë[°Ï+û%¬ V¼Š'Þ ŽùT³+}ç\Ý¢ž[Âô™˜ù »7lÔ½ü[õ¼?ÇQWâH~™°žzÝ;ãØ£åzF;?|÷î:æRñ­zÓù©¾Á*=TsïìÀ7Øú[õU÷HO» ö˜ÉƒðäÍ^_‰u‡#^¥“ô­z<£ž•^ïn’gõ¾Õ;«š=~忊 é²ÂKß«wo8^¥­ÄaýÄQ9C¼Ÿ®{5?&¬ñä#î®8õ}Ôfæ“Í}kä\q¿8×9OÎ2™¾w~glØÒ÷H—Õç­ÎhNQÜ;âÖuŸÜ¦Ïzyܢ֪ߕԻÑwK寬Eü¹/ظ×Çù»Ã±'ÉQå r“Ú;óF/ÿ¼#zßw®ñJÛU/2VõæÏ¹ý¢K|x^X]«\E¬‡ (~¡¢EGñ+p1„ DY/¢H^Ä·‹“üÿá³Å©S§g÷.ÌC²Ó5ÕÕÕ=³÷€›±¾뇱õóX§±~ë·±~«õ`¬WÆzm¬7Æz{¬÷Æz8Ö'c}:VëKlxÖŸ˜8¯bÃzÞc}ˆ‰ÙÆúj¬¯Çú·Â¼Ãüïuìù«â(ÌG˜¸OÆú 5þ˜¼Çý®UÇ<ó#lg5ûž8ü\Ê›qcãùö\ÉSµZÕI<;êZ¹ [úJÖíDZžažñ .Ÿ#½‰O\¯}zÈóWœkð>&G×1kFžÊ?}ձϛ˜ÄjØâÝ—KÚGM´OùVÜWž%yV= íþÂ^“Ä#ï¬S•÷-jnï`ÓtUs÷¿¸VõNm3ž! t–û7Ï»Ögóãµ”O”×}|¢~¡Ÿ«óªY”5uÿ0å lõËJ;åô|¬ÿp¿>XååõÒy<çÅù{þÿ]å¤Ú´ó^ÕÄsP]”Gꔵ{_‘ŸëœÞÉœs.5lõ«r=á¨kÇ–gúÜ}]ùJ<¼Þ®;=œþõ;Èõy€‰+LÖÐsáýâ5»EÍÁÏ÷³¥Å}¼Ö±Ÿ+òSÃqþùÞU¤®âô î?;^âzý/õðjftL\×Q|+ÍÐöï°iA,ñb|ãû+ïÉ¿ÔFµ?aÆË+©¹ó¦ÆîÆVºV8>ûsN6Ô¾ÒûϹæyœaGþÒ^3LM‹UéÙÊ×|˜9¬¼’ç8g÷ájîVæJÕÃ{»õê9LþO±ÎAzeÝ«wTêÅsT Í‘Žï â;6ýóÝ9Ž1Ü_i©{Fo¨F«s;Ž>Rí5 É¿Š%çê>uðY ÒŠSL;ïå>晘9cäá*Æ=¬ýÕ,—Ÿ¤}ÅŸû³öÉ©Ù~ïÔNš¹g…Õ°_i–\TϳšŸŒç~ÏKù S~P-ä#ö‡çÒ-Æõ éáÞÉØ»UÏò}#->ÇQÓUvìûÂë¿zÛix/gdUûüû9{νy /}¤È9PyI<;Ž3xy·ßàúÛÙëSÍUï éGŽùžMŽž»crîÓï0婿ŽK¾•šËy‡åû cÆŠ‹4ÒwÔ‚zòÿò¬œäN|÷U¥qåÕ<–p*/ISá4½Ä¹@¬g¸Ì-ët‰ŸîÐkxÙ;ÉQ½sÉëŽWqËþVÞþªðÒ¿ô#ûg•kÖ„9Û®½ «¼o±aó“þsM5ãWHWâ>ÇÞƒ©¥¿eª¿‹©NÞó'õÐïﬓxzîŽC Ͷ—Øî ×’Xʵêµê}âµeg¶ê*m²ŽŠÓɹºªã]ϪöîÏêw@zžy(bÝX }âÞãý'¾îƒÕ›Pçä\’ÖòDú‹òÍALjÐqôkê!=ÅQ>ÍûéÚ¼Oï[qÔÝ,®Ð<ªrYiÊ|^`ÎEï¿»<ùžþ\Ýûãø·¯òTù]Óp¬«z!{ؽ”úeª™BŒœ>¯VýïÜ.éz‡ºgWu&¶cVù®<˜p_+ÿŠç-&Þ¿Øsõ^ñùÚ°÷U5û;Ž}'×Oy*.Ïf>ú-ê:{h¿fˆ<š=#?æ•^ ûz_ª³ôû{|yÚ{==‘wcriØ´–ßèaj¾z'Uþð:xM¥—ò佦YágÛqÓÏÄÔßÈ6Þªur–O|>8¿ô¯4·¬¯ë*^oaÃk8rr=—ê*Ϥ†Äã¼Ïé½QÕ¦ªßA û<Õ[«Ë:ÿvÉHwx^•XK‹&EŒƒ(Š«¢âD QWAAwñI£8È‚xoƒíüÿamPQÑY=ã@žæ«¨ÈÈÈÌî~`ïñB—z¼ÜãÕoôx»Ç»=Þëñ~Ö㣟ôø´Çg=¾ìñUo{üØã§[Ÿ{üÒãWøÏã¸ãEw$~ÃÀ&±üüÆyñ$Æ[8pÃù­xÝôx†Á/sçü…-Ü 3&ñˆEžÄz#ÏÖãcqà|ËõK¼½Çs¸É³ÒPù?E¿ðRSÇuLñ.käØÄÜ1çþ:,éØ0ø¹w*wÌù>¹6ñåwøv•wê©zïk̘U­*ÜŠ«tdí+LyÉû抧jDÜÏ1|Ua;_¿ƒý¤z¥ot†ÞQ~ükÄ3~ÇÍgv̺¨oyÞuQÄZÕîq–ÒÉ…gïó|jJõ憹6;ήq>Àœ›xmX¿a®…c‡9噜 ÊÉûƒºêÞÕ¼Ú1Î{«äÙÿã©ì߆Q«œj<æé5SOy~Ž¡óҶꡬ5ùp.W;m¥™0Ó;ò±f¼f‡{²ÒJù¹^ôT5?äsõú•~ª¯×µá<‹ÄQ}ï8ÿ`Ößsæùìžq?ËWy·ÏWù*÷ÕÕ,q­ªy(ä5ß9©“ׂ¸Ò¿šQÒ]xÉyå»ôŠÏ†ä·ÊßySZ’“|{å3Õƒ¹U\\7÷ņÚ_üÓÎg~ óïCÖîÌ^w}\÷‡x]óÐïÈçâ\ùlGݓαâ'Ý’§cû¬&5&gm>ìrÝqÎU;C¼œòeWçÈ#µâù•¿s¾KO}䩪~Âq>ù ÊóÕYéúÎ÷}Vñ¹Ò8÷rê%\÷‚|¸©ñò™ÖuWo¨gÀŠp\oÖ¿šë·˜½žõS>ôŽfgʼn|„å8Õžýg/¬ru­ª^ä»UÕ‡Òþ)®Ÿ³¾•^“ô®óÔÜq~še鑆¡ú¼â˜Ü2ÿÜ%©«ïÓ 5®ðèEö¿0ɹaøY<ÓC9VWû1ÆŒ"g¯Ù}~¨|–;>sP/$öŸ˜çrz—xz–«<»£®•soªVäUá’›úëçgþÔ:9Sãê>¯eÕœ§;ê|ÜsÂwìpÎ#{®âïå ΠꙜ>kZ«öžxQ×ô¯z"{Ló°ê¯Ìó¾Z5Œ¹H-ɵz÷%¹å^”þêOÕíêÞ†ù¬zĽø j?®z±ê{ïÉ|®<É{9·«;¥éï˜ë¯;sƒgyF¿kûYÿßQëÄý"űšÎ#ßÛr‡xÎîI×9±É-{$ýM<¯›r»ò¢×k57Výò<Í"Ç“¾OTæ»òÔŽ3ŽÞ ˆ•³Ý=äs}Ãy×e¾ÌUÏ7ÒõÈóâUõ’fºs©Î³o1ôr¯T}ÒpÎÏ{D}¹š=;νá~Ì{ÿ»'uÏj–S[å•uã¯aÞ}™ï]yØ©wî‡Ôæ Ë}J<žõ} ¯0Ÿ¿ã·îêåÉs«=ª{¥ s¨öfbJsÏaÇà•³à!¾y‚ó·Çv½«o*ÄåÞ#¿‡jí=§y ïY _z/ë—^&7žõ<¥×мsæºÎ®ÅŠÿŽ“x«¹èúúŒtœJƒì÷†áe÷ÀÕ÷ qäÿ«šUžXåOüô¬ð…•}rß3Ü*?iÅýÎZ_Í/é¦ïúÙ+Ù{WºkÎæûXÕ3ÌUûsÃàµcî»UŽ9xöó.OnÂôgתfßã~O¬r¿ê‰ÔsÃŒMþªy•Cro¨ïpm¸¾CžRÝT+iì:CçxF¿å¬ò¾Ô\JÏ^}sô$oÞy‹ó¾•æÄr¾Î>Ïzå\o¨g1ÝÿÖ~P¾œ¿ùì_§~Ix^•XíŠU,0(JÄ5J4(:ø Á`‚¢rQ\į<ÁÂèû?„§˜[LMM÷Ü›Àù¡;]]]]Ýçì>ðÓ8§q~ç·qîóú8osœ·Ç™Æy2Îçã|9η÷ ÖØK,ãŒóÞ8b‰ýªˆÑ÷oŒó&¶9ßÁ6/ã™÷ö8ÌýV¼Ä"Gã|<Î'Xq¿ç›qžŽójÜ«&âI\ò#îXjþ„û3,¼¿À¢sÿ÷¨s‘ÿK,ù˜'µHîÔC˜Þ댿ÁÚ‡Ž#ù=ÇÂ-yIÛ?±rs}Ïù¨âáú{nÕ¡¼®yæ’ªÇõPâPiì>‘¦Óù»J;Ï÷K¯Yc²z©óÑŒ½/…ÛõÄ1Ÿ¡ïÍïXjª2WW‡viæÕlTµUùR·K¾®rVõåÒ=Äú|NXëÓüTØ®]5ëÝ®bžÇXr°Ž£¹<âi_±7¼KåÍñ%LÍx7¯—R‹Äõy˜°j¬þéQé0£ö&5MOª_É+ûÓy-=@]ÂSmŠc_GýÉÇ÷\ú'yÉ7•ÿ…›sv¾aÏ3}ÉÄϽ$î¹£‰?cíoêXiHW}QÅõÇÞÉ9JMÔ#éLu3¥<•ÞÇÖ öót­ö3êZrf?±ä glÞ{GwÞŒýnªtÍ»$g_uw5W»°ª[y>ÂÞ×^ƒp0ÒgεÛÙäx‡­*ün¸&—î#äµ£9ë®´NÎïÒ¾®f¹Û=ÚÝ®NÌ#¯Ñö»G{§«¹ê[îíâüˆ'ëN¾«ÈÏ÷arñzSÃôPê'ßh†R;Çã?iè÷úà3É~tý•׳ÒL<'ì½wäqb¿Äªcú»«Ÿ;TÜ;Þ·X÷‰óÏ~¹§¼ŸO¾}ª¾¯„MÜÄb,ãø-ÿÛïrbT¼Ä)ß|ö^ï¼à®ëê8^g…sÄÑùù½" Ù§WÑ0sÜ Þw™+ýFýÝzÂÞÛ3¶y½®JsÖÒáÉËÄáÏ»z¤Ù5¿‡²ÿu¹]ÇªŽ ûžH'׈½¯4º‡}z÷MØö@Ø•—œ+õ!ž°\oߌcÌŒåã¼ÆXwî„UCq8a¿oXOöç¨ïê…ïðJ§ô’ã+1ûöñG3z¹oŽú{Âv®õ÷¿Ìwi÷h_è^<¡×#±«;ƒ˜Üë~WVœ{:ë=V.búÎáÏflÿþH.ªëñ9†<ãyÔË|ä¿Òž3Ûi$O/ßnô›|Âoªý”ªÿÊÏÜÝï0·ØöHýñ¾S›îmL|a»Ÿfl=ì CuU=ý÷GÔWw“ߙй;ÇäÌIΊjy•yqÝN¨yæþðœ]>æÊ;ê.ûœ9Ôïƒþ.ãgc^;Ç¥&zÿÉc¾§•{ÆÒ‡ÿ°æâwüY…—uJWßá'ÔµiÓ×ÂÕû^󩹨4ëÞÒ.ûBoW¾N=:LÝ;Ùó ®tKžœ=b¨æõå7ÌÅo|.‰íó˜^Ê<Ú1Ò8ñÄY½£Ývo¨þ¬W:&Ÿm×P\¸Wµw*U½9a[çߨýžóÇÙÖ>V|ŧ»s^ÓÖŸýô·Fî~ÇeÝGû²ÒÓqÅ“ü´kºûÈ1“ë öóÞiAÎùæPŽ;¬»3µÈûL~ôþWs/ŸÏØóÎVZWœÓ»•ÎÄw¾z§w¿ë‹õÏØó“¦ÖÚ¯½’ÓÿmUDÁx^Y˪%EŒ…(Šâø@G-/>AAŸ/¢ˆ.Ü­ÿÿVP7è8ÑYÕg‘«©ŠŒŒŒÌê{æ1€÷z|ÒãÓßõ¸ôø±ÇO=~îñK'{<ÕãéÏôx¶Ç£/õxµÇk=ÞèÑz¼ƒùAz|Þãëßbà‘ãóüÚã÷FNÏ÷\ç1r>îñ&ö|ïbäü£Õá9ˆ¿õx£b ‹Ü܉%î‰',iò"®kç]Öžº:Ÿ¬Oµ½‚kM«:ůÂ%7iø/FÕJlÞ'Þá9‘Æêå—爫ZyŽ8üwròÅa³³Âd=º#þg½ïSãô›kãº÷³_¡Æ—ß6ŒÄ–÷žwýÏW³¼ŽœÒ®÷ŠxôfÃÀzûL}Œ%ŽÔú¥Ç|†^Æž#y»ÏVžåñôJ•£Òæ–~1—çpÜ;ùˬøÕ<+dž½¿®™f§á8ãêý¦wA­Sú&ûQõ€}'wöZúT;”{Üݓ䜺 Wü«ÞVZkßW˜ÒZ'ž<.]µw‡¼Òk®ßo8ΟêL¬ô—pÙ£Š[µoX¯fº¡Ön†KÌ{\{ʱ¥#ñ«=Æžg×5y«÷+U;3çDùXvKå5æÕ“s¯=M?gO”/{ :\ß}ä§úyþÔšúμ{¸ësÄ9¯>KéÑœ!ò×Þõ÷Êy‹ËL‡ô‘<¤Þ:Ÿ jN^«¾Yöúˆ¥ý3ëÙ†škÎPåç»ÚCv/º÷²ÿÕù•wÆL§œá™çU qôTuèÍ‘ÏÝâå{†þÈ=@¬ÙlæÈY.¹j'V<½¯UŽÄ¾CÝ×3]+|iü:¾x§O.8z„8Ò aŸs÷™Ïšûß=á5T¹ØGö@ùäsÖÏ;gßP©§ú%œ†k_­°f³—=òþ¸&³o—Ä'6ù¹~<—ï¦êðùŽôï­úOþ/`ß“­ÇÛ¨ýÅÙ˜ù¡â‹6î•/°ÆNÞÄmxÄáüªvÝç]ο×îÚùn!'Gõ]¸šâŸíå˜Õ}ö·µê'fµÝgÉ1ûâܪž8¯[æJ½å}žåþÛJÜ—¹ÛÕƒ³üÒ]=Õ{;x…±â¹â(ô^¨o3üªþê›×{éžö]êuø÷©|­=N¬ÙNÕ­™h˜óÑ\ønb½Þ‹JÆcUgŸ3v¶¥e~[¬z”x9«¸ª~~{&g}ó‘ó78æ!ïj÷T³Çš½ Çw@Ö,=åÅKÜS®kRU¾ ǽ¦Üôor—6–÷.ý–~u¬Š[å[÷BÎõy ÇÚ½Úí«Ý›:¤÷ª¬cå?é+¼G¸~—ÞL‹Š[j˜o{Ùß8úgõwŒò‘cÃÞ{¯‘ÿî3¥Bfo–ò¯úÀ=·ªwÖÿ†c>驜ÕÎñ\ »g\qã¹ô†÷’\®çüì›BXªC¼ýÏo¿Wþt½Ùgõ¸Ê«zÿþ+m}®®µÕ{-¼ÙÓé×äǹq/ç¾a`Ëc+ [ï ñ|¦y_z+¥Ñê·Ò[|ç^çÿ¥xÚ7·¾sÔ,çFoOC½gÅᯇó9Ëê~É“^KN¹SÝÒo†ëuÎðf{A|S»|Ó+lXcçŒkf3N¾+ÿK¼*7ìœü~åÿÔoõ»à†Á‹zI×ê{‰¹È[»æÌãjmýMŸÍuµÓ]+åºÇÈõg¿1Ï©\^õŸ½‘ª­ò¢Ïúâû„¼…¹ú k6+®½vœë>ãUí.ï¥ë*M«þïµtÌ~_¡¦šãUÍÞâ¨Fÿ»P³”½LéÑœ{ösö Ÿ=`ŽÙ P»Ù>Ö|ÇyºNä¦{©«Ï·úô?°”I‚x^™[«]E„ûAÅKŒâE¶A…¢ˆ(Q6ŠAÉ‹¯åÿÿN1~¬Zµ{Ö9æ%™®®®®îY'y\UOÆùzœ§ã|;Îwãü<Î/ã\ÇùmœßÇùcœ¿ÆÙÆyuœ÷ÆùhœOǹŒóù8_Œó¸&ÎuÄÆ6Îëã¼9ÎÃÚc‰ƒÃOÕs ¿âßçãšñܯ×jæxÃî)WòUÎ/kæýªöÚ•;óR»ð÷ÚS5ÇëV|rŸjbˆ—ã<ªŸ¸©?gü¶:â¿5ÎÛµçîg5±»š¿¯[Ì?kâ¾RG]áÿ~ÝÖ.Üojï¡0­[\ú(ìÄM-À…¯cº¶ŠW­Äª^Å¢ÝÊS[Íjôþ¬xtu‰µ½¨‰K?VXh•}u¯w~¦§—Ú±˜c×ÿYÝÖ‹—½¯Â}·öI®òŒ°5Óÿr7€)2£âè{Fž[a #ýLÝÝÌÑŸ“Uœ'¾q|°ÕŽ ïkë¾þ·ŽøÎ=wã«wér°Rßk9Û‰Ao:?i¥®à‰ßjO¸¦7úu©c½¾#®uÄóà½ÑÎç'uäzßþ?¯žoǯ®ÞÄ­¦¦Š§·—:jG¼¼»µ«Q8ÔåZ‘:O{o»º:o€Óù–XÅøý.5\,ÿø~Ë™I¬ôû\=9ÃzYM—£»ú{a¢GêÉŽ<ãu©½ÏÌGç;´íæ/çNxø®úµÕŽ›}H\yÒçd5è¸ÕÄ®îuüWó™y»š¼žŸ^þS·»zU=v½V}Øjâ<¨}âÅ«ÝUn¯=뾋 sßñéޕƼÑwåcW¯úKο«÷š¨_xšxÝGr»?¹#¬‡uœ9ý9±Ô ¿ƒÞk¾]u—9Ö·HW›Ï„c\jç›ïƒbŸ×íÜçLuoomçå­&–÷ò¬¾C®µ®K¼ÄGúvxâ$/äï_ªq«©qÖæ;MX®¹óÃ[÷y‹ÒÇž‡ïÌ.¸+ß›÷å †»4Õ}qìæ ]gj²úÆò]ßõ¼Û¿÷¢&§Ì§ztw«ùƒG;þ93äd޽GÌ£ÇùœœÍ™Ï ÒŽï åõ¤ØôGú¢ÓÚ{é~¸Ö‘“üöé=×FoTæÈ7JßâgýÝ꼆Kõ¸¹+½ï[õÜ7ž\q×ì0§šÑÔßù«þ¦e äXñï4¹‹÷YÑ\ÜwæI¾+\aJNƒ­æ”ŠU}ò:{œÚ/Þ“ô:eŸé»G»ËëH_úÎÉZžÔÄÖ³Zë²Õ¾o¤ù¥v|ß\ëv‡nuÜY^ßê­êÞ¼œ4£>¼ \a¹ÖÄPÃjŽòZÕå>÷Ú²]}ôìZ»/û•~OaPW7gÜ÷ýܽq¹oÈ›{Ÿx_ÀØjþÐiáóž¬æºzøž£~¼ïñÛÿ±ÒL=%w^þÛ߯ïL+Ͷ×Úí·¬Ùw;(¿¡ÈáÞv_³‹.u‹ o×"9 Ë÷®÷Ayñ²¿‘?kr_eÒéáU¹»Þç ¤n>CÝ÷ Îû#So…gß%þö—ºÍážÏÿsîtRN÷ïjç3Éø;V§³à;þZ·ót¦«0ºÞtu%5ÁCzÁã?ÇGUx^­XÛŠ%EŒQW×U\EÑF¼Â ¢x_¥YqEöÍ'ÿÿ#¬ 7è¨è¬:gÀz늌ŒŒÌ¬3OüÚÎóí¼ÐÎKí¼ÜΫí¼ÞÎÃvÞnç½v–v>lçãvµóE;_·óS;k;OÚù;ÞïØñ^Äyî»8ð>ÂŽI¼/qà9Ö†3žó#^rü &y~šë v|ià1È÷MqôŒ¸>‡1žò'ßäúvÌŸqæé:‹œ\¿O±ßÕi$Þú†±T?j£˜+Ž»ŠUå ̪†Â'ö˜ã¦.÷±c/8t!ëVaI“[œ¹óÆþ%Ç™/è çêþ½”{…'®â¨œßB%œì…Ô/k⾎cŒüD}ÈÁsòžÉø>+¤³÷µ°\o×Ç}7êÇiÂ;©óxãž­tUü¿Ðë›ÞÕ^ž¯´NÏS:I“ŠïŒæˆf_Ö®âÄþþó>zŠ3GßÄg-}†|‹:âÿ†~6*†4¥Õ’é9qãlöü?@ïrüGŸ+rÌú¤—”»ûÙ5õþÈ<9“È™wÄG¾KÏmϾ­òËWsŒ|fµuí}ÇK¿Y yIuþãç|sÝıâ—ýQõ³ïù;·Üe£ü‰ÿw;ÿbÿ«´æ®`œª>Aÿ–¸”‡zÖsq¿¦§Ò³ô«zJ±Fzÿƒzä,¬Þ³Ýàe#*¦6Gj±`Ç#Fö•ûJ5óü¨i5Ék´Ã6œk$hÞ-8p¼öêý ù}/»nŽ]íHÕE^VݳÞμ5«¼—œw°“ûµÞM}ÕÔÅçêŠÚ£ÄÍÚ;ïgytäÏÔ"wµeÞ®¡î(~#}øû¢òþkÏv­¾šâìx¹c¥/gwx¥GÕ[Þ÷ úùRiKœ ç÷†ó¬f°0«wÀŠ>ÿ‘®3lq­<æúÞ ÷Dö_ê<Ó¥z¦ßWþMîÒ%gbúâµöÂà=}Ïïf:Žf¡|~iî{žŽK/ wÁŽ)½4«VìXþÞ˜qMŽ^ïÇèó¾“xž¯zòRM/÷§æjzGqü-ÂýíºŒtÖ¾PÝ3÷jr'Fò¾ô^ºÆç9«äubúÂ}ÉÚKUrЯçïWµÈ:TûLXÄIÿÍð\Ÿìaó-£Z2FþvXqÖkc6o¤EÅ?{qæOÿ TÅñ\ïÒ,ÝpÖN1{®£{‹º©Wô1¼Ÿ=†÷Û(§k¼[i–µõ†úW9Tï½kc¥Ç2–÷ÃȬciN¨'sN,èç¨÷Wò­ê*ís‡HŸuä]qeŒ§8×Õ}ã{Dõ¬ÞéþžN¬*ïœÅ×ô—Þ¦©í+{|Áï.±6Ôyäÿ0ˆ]黡çøgånJ~z› Ïóv^ÂÌ™;{‡m8c‰ãˆŸpGºqN'ßUÙCéyÞß°ÿ‘Û¨O«}™~ÒïrjøÆœYë?qè›ñ*/ÍòYÑcûï‡Äà}êy­ÝOÄS½4ƒG5óùx×®÷;èsH fø¾C<Æ‚#÷8qt_~Õý çúè·´øem\[Ö'ÿW!ÜìŸY¹ÏFØêÕóóÙ=Ú›éåä,¥‡´È9ò-¹kor><Æ™{å‰Ì!ñÅÛõõņKó1²ß/Õ@ú¸ß¢Ÿãä-ÎâK,i‘óˆúÞ5w×öڞμƒ5¬rg é6Ârœê E¾ì9ç7Ó.sO¿z?°Ïª~ ö j¾Cs­ÚµÙÿ§ÞÞ7©»{š¹åœÅšÕ"c¨¶ŒQ½±þ±zEìx^•X]«]5œ‡bQ¬ŠŠXtSü b©biå TDÑ냯cÿÿ0Ãfس'+9UȃÞÉZ³f&9>ð[_­¯;}½Ò×ݾ^ïë;Þé냾î÷µõõi_Ÿ÷õU_ûú¦¯oûú¡¯g}]úú©¯ŸûzŽûUœ±?D½ÂšÕH¬ ;Îg8°X㬾?°c¾À¹Æ×°ãßÃ~ƬNb?FÝpÔš}¿‡óKÔ8¿âÜ»×—<~Œ‘â²Ö¯qÌëvNž >SçùYªû}|ëLñÁ3V¸ #¿Ä%¦ó‘õ~9&ù!/âã]ìx₵‹8Üÿ2}æl4kap¿æ2›qjÒgA¬ªÕC=Îp³6qÏÚž¢Æe­ £~ïì˜0j¼Â¼ÁŽ©Ó3š«keCÍ…49›±¹Ÿç¿;7éiiå…*·òÌäßû’ÆV3&þ,tFæâJ7îÕx™‹âbÃy¦î%b4ŒÚÈüw>‰3ó£ó·ÒëòÙ°?Þ)×0‰õ6æ^ð¼“_/˜ãe¿žkF/¸fÒcÂU_<_<Ýb­[jªºkgþãYbÔjÅwÅ“8’¦Vóüós\³:#ýÆsÒg/PãyÝŽëZÑ,x/÷GÔuÿŽ:£üÖ]áú!vz$g<˿˪ šé'}#nå_îuÏë[ÕÁó勼Ÿ7Ì羪‡šý×ýœó¯¼øósˆÇ}êÑ9ÐaÕ“Îa/+7캛éa6;žñæ÷¡ëB¸Ä‘®*ýóÛÌëäP}1Wsj8´ ¼ê™}ð~ºÆ™<äZ›q¶á\·ëlv6Œ³à¬7ÔÈ}Ü“z”>\«7߬—Ìb]óIÃÈr"<GV¹E-5œóuÃŽ¡¹e_UvÌæ£ž4ÿï°çèµþøÏÔ: þ†c^œûŠ3ùe¥}õ¨=·Ïwͼ…‡÷hb±&é‘^òÚª°¶ªÏä33"çsÁˆÛp®]˜žeÌÊ•_\k3Ÿ§g½’׆ƒ[ÏtõèuU÷¢÷¥¼–¸5¨ÖÀóuîËðœ~¬Þ,¬ÅsX^p$î†ÃWÙ[Îí/ì¸Äâ=K ÖÄÞô-ÿ^iS|zhöìc6;翪)5븳¬u¾kr´áà7÷ò{Ëoøwþwb(Òÿž]âßivžÊ¿Ó²·ÔUÕcÃÙß¾}ÍòEû’ge ß✽ÌôžØ™ƒìÓyO/Wû¹oU›4¾âJ]qæ5Rúÿ¶â‹ßè|Íó?HÊx^X[‹E¬‡ D¼Ä F‰˜!DQPEE2²ˆ/û"yraüÿÂ.æ+¦¦æœù6Ð’îê:UuNÏîcŸõåX¿5õçX/Çz5Ö2Öc=ë­±Þëñ>½œ{ŽõìWc}=ÖwXqþÀ믱þ문ÂÞ„O<Ç}~ÿÛ—ý_΃Î}#—ïÇú='òYp¼Cu>Æy­ÄÿµvžcMØj%ÆÏ8bP¯¬û¬ç?dž!NÄI çA¬ª¶ {ý¾Áƫ“ î§W‡# Ö¤=¯/ÿ&?[\Å“ºËÛ6qÓOr©ö=°½º‹Ùªê.º3k¹ÃÊýMlx©É„½ÖÌ‘ëýãX¿âÈUwdÏt˜žûÇžæñ”FäIœÌ’ÎQ'¯íìëc&ŸbŸKõI×ÌÒ‚ÍÇ—ïòƒ9QÍ™ïGjØÕ®ìÞâxo•µÄ÷^χ{ùÿü?áføìòþeÈ[þWz)Ûé]öß„:gš,è=𜠯šYÂQ¿IÇûG§÷u¥A••GØæcfƒº&&q²Fϱüö^Ì>öìƒÄȾԛqV×™Êÿ„½^¬í[ìs_q^°ê晩zI¸âK|bw˜äêž’'ñˆ¡¼y™….[Ù®Q—}ö•°„ãózF­wæ)}õ¼:WâW3;ñãGØ¿aÂð\äyiF^>Ÿœ ýÒœ­j”æÜŸ¾džÏ²ìÙà}™¹*×9_\cùvm¾{™÷ìͬ™ß˜¼‡˜Âp}ÅCþVuê¾*?]=9 &ìkP^:Ÿ\×dŠãoÏuÙõœœõ·óIïÈIÊX•yî½Ãžïwîy¯¿Õ®…ëš3PýSyå¸Wÿá˜õª—„'ßÓ§[ì¿;ï«,{ß3[Òá'g·ß{ƒZ›ô›½ä}4¡ö]÷*K3úž­îâ{«¹xvŸßUÝsv±©<¡^Âɬæ¼to«YRå„/Xÿ#{1qò<ï÷lQŸk3ôš.ÔÁû?¹s—dzž©üQÞ+m=ÝÌaþßDZ§žaï¡øû[ç8Ù?6Îä«ù_õçr9Ç3žuî}qÙ?Ûþª§¤ò­9œ\Tø¸†3Žó'õRïhF(ÊyÕ›òØý­´r­5gù½^ñ;ÓA$v5CªÜ÷_ì6Î|v?oŸœ»™¸ ×C3é 6LŸîY÷í–Zø›Zeáì J©A¾ÌÏgoT<ÜŸ‘ÊOÎ\ÇÊzôf¨&ùëÞvu˽;Óáû³™…k߀¬-1}6yf‡ò™çÒ_Ÿa䙙ߤŽó[Zë;fFŸQ¯õö?ÏIsiÆó Žïypozâûô{yZqÎó9£\ b<Æã™â™¬Ïç…zCµ)S®—sðLu³Í1YK÷†.ؾù*…ÏßY¥â©yYÍ6Ïó&¾rSiŸssÆÑ bÍeäæ²Áùœ¸ö]èuWœ²Öì¿«ëßü½œò£zøw÷JXä&^é¯sxýŒæÔ¾û9Õësý”bùï63ƒ÷ñtÁ>'Ê6qªsÚ6×¶ãÒeWµª7ò›•wpþå»@ŸýnV ÷¾Þ,8òžpœOÉQzߢ於X³óéð¬5 Ëq2wgù_°Ïšôò™¤ɉ8Ô(}u^ô#ëìæ\õ]”x™™ÊWÏò<ã|V “^úŒºö­#]Ïî`)—šù¾å¼ ~5O‰ç8¸ö-Džôê7Ô™v;}W¶»o©µÍ^ì²~­oÔxùLØøêgˆ.óäJLb¹çòB¼ªógœô}×Íg×2q3ŸÿuøHx^•XÛª$EŒYQ\=®â*Šö.ÞDï2(DV΋ì›Xëÿ„ô•Õ3ÔËLWdfddTõÜðR_/÷õJ_÷ûz­¯7úZúú°¯ûú´¯Ïúú¢¯Ÿú:õõk_w}5ì1´ÿa_ïôõ6,b|Õ×רp~ÁŠõG_÷°âƒû߯ŠñÖ<ÿKÛË}¿÷6¬ûgõ(—°åCÜ'Xóú+þscŒÛ¾~Çë¬ñ^Ä3ySΟ`Åý+îÏënX1˜³j^°ñOÎ~ÀXw;ïá÷üîÙù»kû¡Ú½¯Ê‹µ¶¾žc«5qo0Ç–n£Â§^…ý6lñê<¨/ cŽêû‚-'åây0õ1y»T—ô<ëï‘>‰Ï~ ?±Xÿ æ+±\ƒÂd¯«>(?×ßûØ×<Ó‰tËYs-,¨ýÃçW9SêŸý¾x^ÏV=sݨ–ìß‘&«WéKÄMžˆÍ¼¥‡æš'vUC¥;×ñ©9q3ÓÜ_˜ÇÉ~U¼¤âzÞ°â-Øëϱ¸_¹ÌêUÿ3vò–œy-ÙâUçŽ|”xþ<}[üúsŒí1åK©íä*ù_ÒjêjÁÈ¡bÐs*»Ã¼ßÊ÷Mlñë1ÆÙƨãj½6Ÿ×—×Xõ$5}m,“/¾\?ÄhØë•ûróQ3.?Î+1^ÅÜó2¾¼¥¡îKö=ùI¬[ìç!5¹ ÆIæL-ç=ò/7Gš:š¹K}•ß>Å6'Â~û3í6l÷¿ögC•ç̳Õ{ú“Ï×·X±+omØß‹2žß;ýzõlûùèw‰j®Æys‘'õ>qå”®…ãs‘Úó™PíòֺȜÈ÷Ì›'9V~ê§ßë=†÷Õ=³aìçy6Cª4ç½!¬Ýý@¾¢¹'ëšÍ¯4Âø|G©z(,ê1kfåQĬðÄ»z[áU³”Z¾ÔÛÔsöØã‘Ó£óµ¤G&Çî‘ï¦vN˜çOî3cÜ`CX0Æ þ7XgÞßñ² ›ßwÁºŸÜrîK^='×CrI½eÝÂLŒäNÚn˜÷S±Ý=~r¤Õ¨^[êÃëÐ>Ïkv>T:Йày#Lù¤z˜ZpÎ<·–¸rMã£Ïª^qÃç…ýd.Ú—=L­æfæžOžîÂ|Œ±ŸÂo'ŒýxŽ:wå]½{1fêçèP-œ™Œ“gpžíªC^WáWçLÖ1Ó˜û„ótmîägÁžæKœÔׯžV<ä3yþdÞ'•~f±ò¼É˜©)Þ³|.«y?ŠÏ¸ù.Ï>ïÞbU8Þ[Ý¥ìýÃó­ôãý­f-ýnÁ¾—z N|¯áö¹ ;¹Hì#ÌJGÙËÊ[Oã´¾þÅvV ?'+]æýèÿä]qN|å™zöŸ}<û˜ÚÎ|Oqj_Y°â¸Ï27ßß0æâÿÛ/ØÎ„ô¡*z6?™ËìÎzNöÚ—GÜ`ß“jÜÄcUƒû´÷Þµ¯ó–yñyÿƒ¿ËW¶{„úðèüŒòºF×âÿ¥p‰•>¢ºŽtw¤çÙ» qÅÕ¥ÿª…ï½Ñ;_ziÕóĽņ›9WÊ^ËOůråü=ëëoŒþO|ÍŸc&îÍö1'¿W«¶äJ{Èýì÷KäïÓ FNg^áÏÚ«9]0rá¾\Å þƬAç‰â¸ïÏ´@¼ì?óPlaüd<×ãL‹•vŽþÇsþÄz©gô{zòÌ×ï-×u£ßþAGix^•XÛª$EŒQ/«+^P´ÿÿVÐ'è¨è¬žõ@½ìLGFFDf×Î àÙ~žïçÅ~^éça?ïõóa?÷óU??õ³ôók?ôó‚}ÿµ~Þìçí~š=÷Y?_c{ö—ûgëçwlk?wý<‡­¾c>ÀÆãõ~Þ†ý.6^ c qóÂWoŽM\áµ~>†õ)6<öûM?ߢÆvþÄbïäèüç{Œ8ÄX±ý¹ö/aïýUìš÷}l¸7{ÿ[êÌZ?¢æ|‹óŸý\0jã>²Ÿ70ÖnØk~‚]'¯í=VÈcÕò•§ÄVOÂþǾTãÔ9Ê 5ë¸~¬õj Y#ó$ÿ]'æÉ{¨°Èû1v}œoÃÈQü„ã}gÏÌŽ|œyHÿ¾CÍ‹XÌ¡çÚg/ý‘/|žœÜëô!±ÆÙSŸ³¹SÏ>+ê•Ø {‰#Œ¿0êæX®=ù°ÇYÔk•çÌBú˜û@˜Â#ï#¿Ë略™mñ÷ÝüÿŦup-‰¥ WÏóΟã÷ÝK=“û€Ï/kð;ꋟ]î?ÏÙr_f»B9äìºWê“ûnņëÞH#q Ì„ô—ŸžY>çžr>¯g{Pz»†•æž9b¤ÿÕ»Â3$m´C+nÕwÿ¬÷™÷Ü·âã<þƨ?ñrO6ÔÞó 3³àØäªû@ÃŽ«^+×k–Ͼzfî+¬ÜÅ™7qÓ,Îò±¢Þ7Õ;ÕïO§[œóâÌ óŒï åÎç-kð^FlbªÇ¼ÇúœV™Õ<87åŒYÓ}Wª)ÏÉ™rUë1ê9aÝœ;eS¾_ËÑì=¬™¦Æ £>3]üÎëy?ÃÏ!ïÈ{ö^UÎìõn:«‘Ù¨æÁ¿+ ù=ïOõr7h^fÚ c¦MúÉ|h¿(Úƒ jìÿ“íiÕàž•þªã54?¦<$OÞ+ž™‘äI r9®Ï¦óºÅ†í¸ÂÌ=¤œU;B:ò^e®Ôól&ÜìQ|ô¼?ÙŸi3»sH#zÉÞÎæ_Z­8Ö¹VÃw8=>›Õ§ñººóWýTw~ß9ü“_Äæ»[8ÄÆä‘ï–¼/¨Oé˜u³7aé½7Ãòì.8â宿ôƒ˜¼H¿+kűOùš:çpž ŽWŒ÷˜œ‰†ãÜWwpúÈÜÌt§ÿ`××3ãü³Fr_×@ÿ”nÚw¾ç˜é­wÞ‚c†ù®y×gÓ5öL'_×ø»‡93һᨵgV¸·ç½ÂoÏñ¤QrM<Çšqs²_Ï<5¥®i¥§ru-¯Ú?ÄnØ|È;?§&¬ÉÕÌò{ëýwù=ÞåÔë Fý.·à˜ñ㌦™!bÏ2ã{Ð1…÷çù$ßîŠ];b$'Ï´ßS|®}¹`ôÆu³ZªQéKì'3åóZéK窱j–ª:ž¯ Sœ…“y;óKÙª¼ò]’¸®ÁŠZ[Õà| ÷ŒØ|·xŽée¥Á-Æ>ª 7ìóäºV¼søžÒï©ïì}%éê;.1Ô¯g—xÎ+{%®ö0qf<ø¬?C.ô6=õÍ:zïó;ÒMØü\=©ŸÌ†ô•Ìëósÿwþñ³ô-5’ožáÙî‘gÕÎÉ9›ÍÅ,»>Ã×~S­öÅ#{`Í ¶½QÕ<ÓÅñåå}5ã©MÃq×}‰ã{hÁÈ]w%eÌy ÛçpÎÊÝ‚óŒ³ó½Áˆëï€jr†*_u‡ö»ˆï£®÷L>Þ›êy/ {^ÈY;ÎsÈç2×<Ó{£â¹bŽ×0bGwåÛóÙCÅÁ÷ÄŠ:Óž¿ Ãû¨îÈÕÜ'7Ï^Ãùl Áèiþ6›5òÿ™ñ™â/LâñX݃ŗ;PzxVˆ%^ò$yx;Ô>U»®áè¹é7DßYkÅõ:®çHáx^XM‹dEŒÃ¢(®.*~àW±¨«  .²*« Šƒxñ"Þjýÿ? Þ/^¼Ìn±¡.=U‘™‘QÕ3|ºÖgk}¾Ök}¹Ö·ký°Öóµ~Zëf­_Öúu­ßÖú}­?Öšk½Xë=l8<ÿ ¶ó<ÇýÚ÷`­—Öze­×Öz¸Ök½µÖ;k½¿Ö‡k}¼ÖÀ†Çœ˜sÉ<<a¿Œ ÿUcûløGlqý{ ñ$¾ð˜'qT/ž{zF9Mì90¾øñÜÀ1nòòàYžó3ÜÏœnqä¨ïb¯¡÷ô+l=ùn­g8sõ¾zUÕ+5PkHqY§kñþÁ9c‰ ñˆÅü;ï¿×…Úìr}‚-ϯ±á{/=?j<ëÝéõ¿rîê)¾Ì«Âîùýÿá,ž7¨óâçÒ,¹ÖÆZq½ÿœ“Š‹ô,NŠ+.oc¯OÖ:ã)VåŒ3q®U5/î]^Õ!gmà8תïÏèyNÔ5~[^Öz{/G1¨×äx ·Ó«k¢òÁÌ?cTó0°×#µ@tý¹TÆ`=ÜG•{jøº·Øƒý™Ø9Ë~ÿ ì¾)-Ü`Ïó»G«Wâ¯Þ+Öƒû½®»jŽºº)~ò¸V/å–>ðçò>ö&ûâ3I<ÍJΚחòÎ\È—óì=¬4Rå0±ßI©çZˉÓÕL¹ l8ž‡ŸU|çäýË{@^ªp:-¸Æ‰Õ½Q&Îw@by­Õoާݼ—ZŸèõÕÅ!~7çÇ^v8âî9Wxâϼ\[:ÃwOž«ÞŽ·äEÌĪôYùÊ'8×èÚ;áOëO¤N8×Ǿ‹\S#}ÿä]îļ6“^wÕ¯ÂÏ løÄ“§¹.º^(ÏjFÈŸyÊÇò»æü0ްsV*/QnžKjžû:>|ËhF;>ûÂWÍÓû9OÄOÝ9ÞÄYÃ>SÊ1¹fm©[åÓÝwÌAÜtžg'¶÷v¥)iÓ½0u$ ž×œpŸ¾S˜Gz¶|±ª7kí¹øoKá¨Æ>7™ßÄyf¼Þ•6Ò «ü\ÓÂ’4sÜ/=æŒ*nõ>t©8ÝâøV¾Þ³Î‹ø©÷JGœ8ö-uMœ<ϳÇ:û|ä½í\5Ž©Ys~ész§§Ï‹£ÿƼÁyfœk…Ï·“sÏ>]škiWµâ÷óþ»Ô3c%y`—sê9sÏzìõy‚³çuw¢k‚Ÿ.¦îþÏgàÜ ÅªbLÔ¾Mõ{‚{ó`Ü#<âÈs<ÏAû²vêyöÛùÐoèÇ]ÝÔ«äTý_'çËãùýZÅa zÿŽsËŽ­¤®¤S¯9Ï œ»T³”ÚÈzòýtIYWÝ—øNôþä^'m;–ëZš«zC¼³Ž+̬…p]Sw⊳k)ïiš˜î«îŽë:çYžI>ԯϿk‚zú»¦^`ï«{£ô•o*qrÌäÐÍDu “9gÿž'1å®~Ï8Òbâû¬eO»¼½öŽÅß1”Kj-ùÒ£‰UéÌç€ZSNé%žWzqnq¬“û1¼.Ò|çwžOõÆæÀ1/ÝEù[â9Îqòήâ0FÎlzh5_ŽÍ=šaש<5gI˜]=*÷ÅKþCÆS,Ÿ§ã\ʪ:$NÅ=ýFy—ó÷=ν#¶ëMÞMA¼kZun®ÑŠqŸáì?Y¯ÄëüÌûziÆÅÙõý6Ïe☃4ªzòïôqî!oâqOõÛÀ}°ò.j7¹UõJ¿öóZW9“¿úÜÕÑï±ê­8qö^y·ógÎê…ç[õ–¹ð­›ïŒÞ",iO¹To˜ô¯gêdbŸ)öEç”÷3v5CŠ+šžífè5ŸKâ:áºÞ½ÎMæ8°c¯«¹×›œ•Û#g³Ò•׽ŸØq¯4¤>¹Gkÿ¿ŠÙIkx^¥YYËE¬‡ D<âŠÎƒ¨Ä‹E1ˆyß>\óÿ„SlŠ©©íÙD |3ÕÕÕÕ=³_nx®¯çûz©¯Wûz£¯·úz§¯Ö×û}}Ü×§}}ß×Ö×}ýÔ×Ï}ýÚ׎ñ&Žó­¯Ïûºã÷k/cr±?ÄÀ×ÞPÇà^îûæñ¾íñßÜóL_·1çò:.oãÈç]œc^åDÌgqàJ'â*?b}€÷ æÓâ9×J{Ç'65ý¢¯/ûú‡f®GÆ}ˆ#ö-ÌñûñYשahus~Œíq3æ ÎùɉÿŽœˆ¹ÊãÔ9d ×M¼‰/Ý*®;/ß—±®rQP“ïŸß0â𬼘µ%?¯í“´M.Ä\ÕËý-Œ˜ýè:®ü§}‹ÑËÞo/`ðy ×8Î+k,^~Nõ`ƒ?ã¿q¯j”š¤\cÕ(}PyJ¹(ÇIm…“þ¼ƒy5œ5aͯ¼ïz{ŽY{×Xâ<ÝpöÒŽë~ª<Ë÷pà†1*þUŒÔv…ý¹;nòÆê,yù=&nª{•ëÊGì1{³¡®W…ë}Á|…›9®<¹c>'/3&÷¯tfLî—~™}§z„ó,¡çy·¸–9˜¿ß-ªý•§\ç[žò¼rîñ\y…ÜfMRÃÌÍçîí¼æÙÃü˜S…­zz?Èo¹Ÿ¹ÿ…#žÓÏéI|è¹UÍw¬óæ{¨ñ6 ¬Ä^ÚŸ~õúòûÜkÄó«s;Ö³ÆgYÅŸ|øžªp¥ ±äiùM>æ½íµÒràþ+îÒÊù^ÕP÷qâè¾ðج97Œ³ô"Ïr?ãj.¹çäKù)=¤·À†#þßw_úF¹4Ìš©ßÔÊãó¬É¹ÉóÙä›^[½CTsõ¥c‰ƒk(<åîµ®|r õ¼‘¬GUã†Ù“Î/gµâîñÒCîÇ%–Þ@Îü+î•/æz<'ÅÓ5q,åÌ» sU§¾ê±ô¨úºÒÍç…óѼqí4/ȼܳj87bÊëÕ7Žæù•îÎI½Cîcä¶áÌ%uò»ëiüWyoùOG|sF¯ê1ž«j¹âçõUWl˜sO¥!õ×ë^C÷nÃܯé£ä”|æ|‰Ãš_åê3@;kŸÞQ<£šòŒræÏ®x®úR|”gúC:;ŸJÛJ+Çq/{ç¬jΤîò-﵊ߎ™“¿”›0òì*7rÑüÈ\Ò?Ù“Ù+ò³÷‹0ùîQNÉé!/ïAjÔ0§÷òþôûˆ|«oæÌ_˜Ì¿ºC„WaùÙqæ,üêwÚÂwΫï×YØž?Ïðç•nÉAuU\ÎIÿ½*GÖ†ø`Ô'=çºûÛzùÅ'59ñ¬úg²n/ãü^¯ª·\GaKÃqÞ½éû¥«ëɸzï7Œø|s¬<žs,1óåù\aU}’ïÀ|«m8cq–‘ñ4Voaaé;fÃ<Ãv ,÷â¿T»GÒx^•YëŠ^E¬bP4†D¼‘1x1ˆF¢Q!¾€0æýÂ)NŠ©¯NÏùvó'{¦¦ººº{f÷€÷Çúp¬Æjc}:Ögc}>Ö—c}=Ö·c}7ÖÓ±~kë·±~ëϱÞëͱÞëþXïŒõ;îc\bó+ì˜Äû;æ/ØqÅŽMÜ>Öë˜øÂm¸äù&.y>ÃäI¦OÄQ9ñ:uopsö±Š;ó¶ªìgÕ9ÄOOùl«0;Ö¼ÅÙuIÌÔ:{Öj^Tš‹óŠ+q+5My-eÜ/qî‡6Ö'8êÉysÖcÿÂŒ?5%~åÎv÷yóy!ÏèXç=a•·³º«rÕ°ï_í;ããçk¯ö¨?æÎÏ«cHïm«Ù/NŠ%±¨ñVµæ¾àþ‡˜ºVùSMS…ױςì“ĽÖײÖ75$ߪç<Áí¼ ýÈUu!×Î{cbt¬çjÖ˜û+ïDêÙ˜«^ LbU÷«ŽºO)× “Ÿ|—¼¤×ß8⹯³¯VžT®]ל7GÎÄô7HbIÏÄXq¬ü“¹—®AÇÑ7 —ž¾V»7˜XUÍxÍ™}­7wã¾MÌ^/ꕟœwuÆ~öÈŽ¯¾å7vM®a罂~ZÍki’9ÓþJOíá÷º»J›•&™ËœãÒƒwÍ»æ‘8zÃQ é@ß1†ê.L¬JËœÓÊϪ¿Ó³ši³÷­bm8zKyJŽ:ãlf[±¿ºWñŒŠ¿ë©Úõ^àïð†KLŸ{·yǺ¾ÂK?ò;þSœ®Îæ}ÉûˆûÎÏ“NÚO¼GÇ}‘ÜS›JwŸg®u5+Ò#é_¿¿ý }¼¿ÊCù|ú¹?äkqõn8æïÖÞ~€º¥Ç¥1q+Mý÷jg^öš©Þº™GÕ¨ê'ÏU.‡çtu~žÍþZå‹gþƒ9y®ÿþ„¸>·*îgÕfÞÉï¬WUž^Uã^kìËŒñ9α…ù;nú¹¿•ôÐs+Ï­pr(&æÏ}s¦¿ã{Mù› }B¾©QÇ%Gy aßG>ºå?W¹J]¥‘ûP8Þ{„'¼?Vw«ª—¹.ê ÂRy¯!¯3_vÌÝéù†éæ°ÂR¬þ§æoõ¦“?å¬ë*þ*?~ŸLßÿˆ/s”^Î;zæÉ=@þwy+ûy<‹½ø¶½Ðs{í?cõÞw<¯Í ÓË}¬ÿpÔÉs+îù÷å‚g$¶s~U+ŽïØÔÅýãµ,ŸËËÜ+ =ÞJ?ÕXú,,¬Õ,¿AóŒÏýKýæ×î ë÷ÿªîä'Ÿ3įúqÇì7Ä[½©•‡UÏ!×ä§ø+s”Xë“::?r[å;{AæÝ{uñwU<³Þ3nÍë³{œßVø^ãâÛpìÄòø‰Avìû¹WóŸß¬òO®íÕwÒ`•+Åÿ;†Ç/=Å/{DÆÙqì›ÄIÝxß –úñ*çÂ\y²Ê ñü ´áˆ—õ'Œ*¦UÝæß¼5×™O×û)ÎcKlÕHÖ…z熃4ÿäÓäá³Oûÿô*EÌx^Y˪%EŒÅ (>†Q| h >ÁQtðI£8ˆ›q!îÖüÿOXAß £¢³úz¡63U‘‘‘‘YuÎÙü:Öocý>ÖŸcõ±^륱^ë±Þëý±>«õñX_ŒõõXßõ3Ö8/Žõ2v¬×±ã½5ÖÛ8pvÌOÆút¬Ï±ã5Ö“±~ÀcÃã_ÌqÄYqòŒöÏ;˜óP îåžGØ1œyùÞín?±o˜y(çW±ÎûØÊ›93Æ·c}#Nê«^Ÿ†³ŽÄR^<Û1×WܪzCú$qp žý{|ÅþëÌÙSiý&ŽÜ²o”›{VØOqøH¤®4_ùç›çý÷ßîöVõV¯2¶´äÙªÏ`­Cú†üǹ?ÃQ[ïŸk ;óaU³R:T¾ó¼Tky.½¦äù¨7½~®£ö†r¸êsam8óèø÷]Ñ›øqÖ¯p+®Þ£ÎµÒ,½œøµÇˆ[Í“ªç;vŸ§âx¥«÷3ù>ÆÜ æX`'Mr~ð¯òºÏÇH+ÝÕœ¼ªg›rl˜ûqUWæ°ÒÞñªù$ªO½¿’sÇ1‡Ý—š^¯õ}¾Þgª{õþvÃÙónÇŽC Õƒ{TÛŒ#¹fO9­ü¤â~QŸúíÿ—ô:ß2äá=ã1=ÇÔÊgzÃÌŸõH=Ü—Î_XUïº]sùa¥ÏTý í²ÇÉã¾¾î8c‘KÃŽ‘~¬øxºãæ>¯z'{^˜émרï‹ÊsŒ¥ðö8UÝV3ŠX¬ùªö®{ðι»W=(_¸©kÎ(ñÌ9.m+ŸK¿ä¥>I¿ç3Ìw×Ê/É­ÊU9ÞwÞµ{ óg¿üÌ+^fj¦™ë9çŒbÎÙ›Éó†õìó¼«ÙQé)?¥ïŸâìýÊWò@ÖÎñ™Ïênb>3~5ˉKÞ†¸ªÈWwÏës 1ª¹Çóg]•_ÖH=¢óõl¨j" ŸÅÞsÊ+ý“3§ª³æLö°p*^ ³GVžö7CΨ÷p®ýÕ[ŸXÒyf~ù=IæÊ~‡¬¼% é‹«úä›´¡žW}ÙQkäÞó>Tý=Ö­zSÿŠòf yk¥8Wx gŸÊšf¼Žº²† ³‰M¾üÎD÷䆚·{&uH ªºç/ß®ü×pàéþѬLN<Ÿ^UžÕÝEv¹¸^ÙÛy)öŠ71r&KÄPŸÇÊWÌCZj¾äáµIOUŸ©“—ÞH©“ú7}•x>_³·è­œýηòíʳþ^J-³WSƒä*Lïý 3žpbæäÚ=ÁY7õåjn¬¾‡P?J·ÕÛXün8÷dúQuj˜ç ü˜˜ëyêù§Ÿuï{ ¹·ªs“—7Ì}ùó}ËÏŽ%×ÙŽ¹î•ßýî¯æBΔ*Ÿô8s¹Âq-f=T[žÑþ8êɘò+crö±•¯×‡^ªú¤c~£Ñ‹>¯\›û|¬3òƒ´¨ætú“=Ù0×&g…ôÌœ…µê'¯5uð;ÍkÃý®ÿç+3ÿ>1ßî³ÊçÎuS½\ÃÜGÄ÷ºêß+~ÒåjNWoVÅtß*Ï|oJß«y‡x_^}Çâ½¹z?éÎì8pé'÷ßቛ˜Ž§Þ«îªÖÉ[sM¿=m8ß Ä¶ê“ïqÍÚˆ'ÿ<÷GØ9:ëRq †sXݹä¡§žNœŽú· é•o)饯ðt>ùh?÷Þpíû|ó4œëUé›ý–ø~¯úïWÉ•1¼O7œg™pÿVÂH²x^íWËŠÃ(Êú@ÅŠ6âDQPViñ²= ­ÿÿfPTLtuÏ®ç*ÈÓNFEFFfõEÄŒÛw3îg<È2g<Íx‘ñ:ã]ƧŒÏcÆ—Œ¯ß2v?2¦Œ‹Gw¢bëI¼gÏ£`y'sîùŒ Qò¯I.~‡;ðüýÒür×»†9GïC /£Üù& Þû5ÿ¹(<®FÁ¢jAÎÐàûü{ðaÍ—ç¼ëQ¹)'êù6Ú¦¨x¬‘˜ÀÛªš²WÀÿñ1Ú÷°VjM|úà^,y˜Ž\;Õ„ØÎ›˜è¼ÕÂV®ÀU]\jAoQb:žúXÊO}ïüÈMy!yÈá}øôð{Ô³Èá]ô%°͹®¥ûK9Ó®¡öGkEŽz÷£ÆãXbx”“ú¥µ;ˆ»¶;”ŸckÝ3[½¥WtGP+ç¨ûáU¬ûܽ£±«´z‡Î'xs&ÝGÞoö‰<™O O½¥{âVT¢æs¶¼¬š‡þÔ|Þ>ª.Sl÷Žº¨Ô|ÞÇRo÷D«—Cì룘|¯Æ¨˜?£j žì™úŠú¶üäs¬Ôà3ÈÞþ‰~úé§Ÿ~úé§Ÿ~úé§Ÿ~¶Î?"ÔÄ5x^-Ùux×Õð/-u ñZצ‘.5ºCr°*Œ5BéÁ®Ähé )Á!0ÆE¤¥J+péæ:á~|ÿøü·óœó}Ïû¾çý= ‚ ÈI^> ]ÄÖ²ƒ®’&M¼IYšA1Ìfû¹ÀSr¦ ‚7(FušÒýo#™Ç"¾c;§yD®tAŸâÔ¤íˆf< ,c3‰ìåwÉ’>^§ •hF;¢™Äb¶qŒ¤Ë¯òe¨K8]ÁD¾`%»9Á9®ñ€lƒàŠR™0:Íx¾d5[8À‘J¶LAð¨H#:ò1ý‰á æ°–üÈ“ñ1æ_” 5hN7†Ï×$‘Â2e‚×(HyšÑ1Lã+²Š-ìãOÉE¼ÈO9êÓžÄ2›U$sš›¤ÏoB}:3„ Ìa ;ÙÃynóÜÙ‚ !Ôå#zòoæ°žÿp„;¤Ë9x—²Ô¢‘ e,sÙÀ.Žs—4ÿ‚RŒJ´¢ #ù’ù¬çGR¸K†ö¡2-éÁP¦±„mâ2ɤÐÞ¥ gc˜Ã:~âWî’%W¼LQªÑ’Hbˆg%«Hä'Nq'dÎo‘—âÔ¤1]Ì&±„Ds•Çü4/Ú›‚T¡!ù”©Lg›8Ä5ž“3O¦<µiM/b˜Íjör+<á/É*ЈVô!–ñ,`)_³™Ÿ¸ÂS²ÿÓ7RšÆtc8ñ,à;~äîòœo oSš4'’¡Ä³Š#…³Ü!c~9E)êÒÁLa [9Âî’¡@¼H~ÊS“vô#†Ö±—³Ü$cA½—‚T¤1]NËÙÈn~à8×xNžBÎF]ÚIâH` ?r’›<#Oa¹AeêÓ–HFÏ26³‹“\å99Šˆ!©N+º2˜q|Åjvs’‹ÜàYß7_BcÂèD41Œg ›ÙÇ9J΢AÊÔ¦9]éI,ÓYF"ÉâÉU,ŠJsº0œV“Ä R¸EPÜý‘ЖNŒdsù†]á"÷ÉTÂlHaªÐ–hb™Éb¶‘D HWR~QˆJÔ¢3€ñÌg+G8Í]Ò– ‚w(KujÒ€OÂçÌa Iå*7Iå¥ÒòªÒ„Žôfø’Mä$¿ó'¹Êˆ!4¤éËh¾d9›9Èï¤++ï(DijÒŠn a:sYÁöq‰T2–Só£ MéÆgÄ1Ÿíœàµ¼5¼MA*Ò˜ôd8ñ¬&™SÜ%/S˜PZA±|Åb9ÄE‚9ŸÒÔ£#ƒÉt–ó=‡ù'd±%©KQ bÊR›D2”É,%‘C\åÒ×ÕyŸPÚÑQÌd-{Há6÷ÉTO\y—bÔ -ô#ŽV‘Èa®‘®¾u¼G)êÑœOÆ4¾!™ã¤pì |ÕhIÝÁ4–±ƒÃ\âiêK”¦2Mø˜Œå+V“ÌQÎsGähä ¡!]ÂD¾bkIæWî‘­±3R‘&t¢/ã˜Å&r™<%GµGêFú3™¥lã÷ÈÚÔ»GiÒœp1•Ùlbû¹À=²}(—©F{¢H³XÏ6ŽqžÇ¤mfÞ¤µøöôe‹ÙÎ1n“©¹÷м”£& #’^Œb*óYÊ’9ÉMÒ´0ŸQ˜PZÑ…^ôe4ñ¬d;Gù§älioªÐ˜öô`“ù’lã(ÿåOr´’“¼I *S—ôcñ¬`ǸNÐZ­S€2„ÒˆÎôf,sYÇnRø/iÂà5ŠP–tg8ñ,c;ǹJš6òŸ×)F%šÒ‰>Ä0ƒ•$r ülmÕ6ŨI½Â4f³‘8Çž‘;\,)C}ÚÓ‹âYA2G¹Æs^ŒðVR‹D1Žy¬e§¹Ácr¶3Bu>¤+C™ÂbÙÇY‘»½xBmÂèÉh¦³‚uüÀIns‡LìG~ÊÒ€pú3%l`+G9Ï2ttǼCYêÉ@&2“eì`7g¸Oú¬¡E©I¢Å<¶r‚[düØýR’:´¦ØÎJ’Há>é?q.JR“p¢™ÀÖ³—3Ü"m'uEQjÓŽ.ô$–é¬á'Îs‘ ³=(LyêÑÞLd‰ì`?sƒ‡d‹ôŽQ‚J´¡?1|A_³“\ã.é»ÈW P…†tfSXÎŽsT²tõ÷T¦)øŒQÄ‘Àrvr€Kös…´ÑÎÉ˼A~ÊS›6D1‚6’ÄI~ãA{óåhJgF25ìdçxHúrž|„Иpz2”ÉÌe[8ÄnòœìíGUhM3™,b+ǸÊ3² ²Ž’„F{úÇ<¶qˆóÜ'í§bó·"Ô Q b,sÙÀ^Îr‹à3ç$Å©M8]‰e+ÙÅI.’JžÁî‘J´¤Ÿ3›•ìà87I?D¥•©EÑÄ2‹MüÄ%n’q¨ØS”j|DoÆ0Ålá(×È4L_§Òƒa$°‚dÎrƒ`¸óSˆˆb$3YO'¸IúfÊPžÆD0€±Ìa#G¸Aº‘æŠRƒ0z2–9¬'™#üN*¹bôsŠQ‡Žôg4 ¬"‰œåÙFéå„ЄÎô!Ž…,e;Ç9Ï}²ŽöÛ€âT¥9]èOóYÅ~åébÅ‹w(O#ZÉP&3ƒÕlãçyHú‹E¨DcÚÍXf±ŠíìåIÞ—Ô"‚®Œd&sYÍ·ìç É!”V|DƲˆDŽqƒ§d‹×Ó)E(-éÂ`Æ0‹õ$s‚ëüIºér‘w¡QŒfë8Â%þTD0x^íÕûwÏuÀñ÷œb«TB÷ë!GI™ 5§Ô1gèµQÇåÔ\Ž24§'vBÑ1´²¡\›fÌ=ÙÜbŽ\ʽ¹¤ •R-JêñCÿDç|žç<~üœïù¾ß¯Ïëóׇ!ÔBcÚ‘ÊÆ‘Í"J8À ª¸Äµ9!4à1ºò2CÎT øœÍ§Š¿‰É ázî£5]èÃf°œ Nð3WÍ¡My‚gI#L²˜Å<Ö±‰#ü@™!ÜJcéJ_†3‘¼N YÏ.r¸¹!Ô§ OÒ‰^ cù¬ Œ}œåOêÌó;cg¨Qd—Ñ'™Ä¦’Ïj*ØÍqª‰[ê^iEºó™d1—%”ó5UüÅMËì'éÆ@2É¥˜-ìå;.Sì>¸‡x’éA:o3“U|A%¿Rk¹¹¡%y‘Œa2sYË.*ùØ!ÜÉ£´§'CGKYÅvös’jbW†p-èHéŒa Yɾâ{®Z垈§=½È(²™O1[8Ä9γ:„Ûx˜ŽôeSYÀr¶QI5±kìhâiO/óïËÊØÉ).Ps­=AsÚОçÂ[Le‹)a3ßð#1Ÿy–ûiEgz3‘LaÅlà+ÎPc¹ç¥/ñ&ÓX@!å|I%¿Pãsï9 I ™>d0‰\Š)ãç¨UbvIà)º0€‘¼Ë,f³–=Tq…:ëí!ÚÒ•> &“l>¡”}œæêlp4'‰çèÏÆ‘E¬£‚cœ¢ŠPê»É4â1ž%ÑL&elfßs…ú MI¢+ýË|J){8Èi.S»Ìs´¤3i åm²)`;¨äWâÊ) $Ó“t2ÏG,a9ÇOÔÜäMSÚ’B:ãɧRvs–ˆÛì¿Ñ˜DRÊ;Ìd>+ˆŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠúö/÷`x^íÁA 0±{£s^°Ž%m_µð±¿töx^]ÙÓ†Ð4v[m›mÛ¶m7¶mÛ¶mÛvîdîK»ÎËÞëöœX>Àÿ/p€þå_þëø'þ‚¿âoø;~ƒßâwø=þ€?âOø3¾ƒïâ{ø>~€âGø1~‚Ÿâgø9~_âWø5Þƒ÷â}x?>€âCø0>‚âcø8>OâSø4>ƒÏâsø<¾€/âKø2¾‚¯âkø:¾oâ[ø6î‹ûáþxˆáÁxЇááx‰GáÑx þÅãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðnüˆáÀ8Šƒáà8‰CáÐ8 ‹Ãá?qxGÄ‘pdGÅÑptÇıplÇÅñp|üN€âD81N‚“âd89NSâT85NƒÓât8=΀3âL83΂³âl8;Îsâ\87΃óâ|8?.€ âB¸0þÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Áü¯â@80‚ƒâ`88CâP84ƒÃâpøOGÀq$GÁQq4ÇÀ1q,ÇÁqq<ÿ…à„8NŒ“à¤8NŽSà”8NÓà´8N3àŒ8ÎŒ³à¬8ÎŽsàœ8Îóà¼8Î à‚¸.ŒÿÆEpQ\ Ç%pI\ —ÆepY\—ÇpE\ WÆUpU\ WÇ5pM\ ׯup]\×Ç pCÜ7ÆMpSÜ 7Ç-pKÜ ·Æmp[Ü·ÇpGÜ wÆ]pWÜ wÇ=pOÜ ÷Æ}p_Ü÷Çð@<ÆCðP< Ç#ðH< Æcð?x,‡Çã x"ž„'ã)x*ž†§ãx&ž…gã9x.ž‡çãx!^„ã%x)^†—ãx%^…Wã5x-^‡×ã x#Þ„7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãø$>…Oã3ø,>‡Ïã ø"¾„/ã+ø*¾†¯ãø&¾…oã;ø.¾‡ïãø!~„ã'ø)~†Ÿãø%~…_ã7ø-~‡ßãø#þ„?ã/ø+þ†¿ãø'þ…¸ÿü×q ÁAq0‡À!q(‡Áaq8ü'þÿöïþoGÄ‘pdGÅÑptÇıplÇÅñp|üN€âD81N‚“âd89NSâT85NƒÓât8=΀3âL83΂³âl8;Îsâ\87΃óâ|8?.€ âB¸0þÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀñ <ÁCñ0<À#ñ(<Áÿà±x'à‰xžŒ§à©xžŽgà™xžçà¹xžà…x^Œ—à¥x^ŽWà•x^×àµx^7àxÞŒ·à­xÞŽwàxÞ÷à½xÞàƒø>Œà£ø>ŽOà“ø>Ïà³ø>/à‹ø¾Œ¯à«ø¾Žoà›ø¾ïà»ø¾à‡ø~ŒŸà§ø~Ž_à—ø~ßà·ø~?àøþŒ¿à¯øþŽàŸøþ=øÿí?p@ÆApP Ç!pH ‡ÆapXÿ‰Ãã8"Ž„#ã(8*ކ£ã8&Ž…cã88.އãã¿pœ'‰qœ'ÃÉq œ§Â©qœ§Ãéqœg™qœgÃÙqœç¹qœçÃùq\Â…ñ߸.Š‹áâ¸.‰KáÒ¸ .‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®‹ëáú¸nˆáƸ nŠ›áæ¸n‰[áÖ¸ n‹Ûáö¸îˆ;áθ áî¸î‰{áÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx þÅãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?Äðcü?ÅÏðsü¿Ä¯ðkü¿Åïð{üÄŸðgüÅßðwüÿÄ¿ðïÿÿ8xPPx^]ÚC´†ÐÛ¶mÛ¶mÛ¶m›mÒÆjcÛ6Ú¤6NÛô¿þsr’;‹™¹ÛÙÌb&j@@Àú(AcîÿJÔ¯<ϳñ4<ÏÀ3ñ8<OÀñ$<OÁSq?ÜÀñ <ÁCñ0<À#ñ(<Ácq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q<'À q"œ'ÁIq2œ§À)q*œ§Áiq:œgÀq&œgÁYq6œçÀ9q.œçÁyq>œÀq!\ÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuñ¼€o=/À ñ"¼/ÁKñwø{¼ /Ç?àñ ¼¯Â«ñ¼¯Ãëñ¼oÂ?áŸñf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ð/øW|ßÁ¿áßñ]|ßÇðCü?ÆOðSü ?Ç/ðKü ÿÿįñü¿ÃïñüÂá¿ñ?ø3ò­ƒà 8ŽCà8Ãà°8#àˆ8ŽŒË×ŽŠ£áè8މcáØ8ŽûÅÿ1 HÈoÃÁq‡Â¡q‡ÃáqG‘qGÃÑq DZqÇÃñqœ'‰qœ'ÃÉq œ§Â©qœ§Ãéqœg™qœgÃÙqœç¹qœçÃùq\Â…q\ÃÅq \—Â¥q\—Ãåq\W•q\WÃÕq \×µq\×ÃõqÜ7ÂqÜ7ÃÍq Üò‹ÿ¿oó׊ƒáà8‰CáÐ8 ‹Ãáð8Žˆ#áÈ8p,_;°ÿÚÑptÇıplÇÅñp|œ'ĉpbœ'ÅÉprœ§Ä©pjœ§ÅépzœgÄ™pfœgÅÙpvœçĹpnœçÅùp~\Ä…pa\ÅÅpq\—Ä¥pi\—Ååpy\WÄ•pe\WÅÕpu\×ĵpm\×Åõp}Ü7ÄpcÜ7ÅÍpsÜ·Ä­pkÜ·Åíp{ÜwÄpgÜwÅÝpwÜ÷ĽpoÜ÷Åýp<ăð`<ÅÃðp<Ä£ðh<Åãðx<OÄ“ðd<OÅÓðt<Ïijðl<Ïýâÿ$ø·Šƒáà8‰CáÐ8 ‹Ãáð8Žˆ#áÈ8 ŽŠ£áè8މcáØ8Ž‹ãáø8NˆáÄ8 NŠ“áä8N‰SáÔ8 N‹Óáô8Έ3áÌ8 Ί³áì8ΉsáÜ8΋óáü¸.ˆ á¸.Š‹áâ¸.‰KáÒ¸ .‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®‹ëáú¸nˆáƸ nŠ›áæ¸n‰[áÖ¸ n‹Ûáö¸îˆ;áθ áî¸î‰{áÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx ‹Çáñxžˆ'áÉx žŠ§áéxž‰gáÙxž‹çáùx^ˆáÅx ^Š¿Ãßãex9þÿˆWà•x^×àµx^7àxþ ÿŒ7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãø$>…Oã3ø,>‡Ïã ø"¾„/ã+ø*¾†¯ãø&¾…Á¿âÛøþ ÿŽïâ{ø>~€âGø1~‚Ÿâgø9~_âWøü'~ßà·ø~?àøþ ÿÿÁŸqàAåkÁAq0‡À!q(‡Áaq8GÀq$GÁQq4ÇÀ1q,ÇÁqq<'À q"œ'ÁIq2œ§À)q*œ§Áiq:œgÀq&œgÁYq6œçÀ9q.œçÁyq>œÀq!\ÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀñ <ÁCñ0<À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñwø{¼ /Ç?àñ ¼¯Â«ñ¼¯Ãëñ¼oÂ?áŸñf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ð/øW|ßÁ¿áßñ]|ßÇðCü?ÆOðSü ?Ç/ðKü ÿÿįñü¿ÃïñüÂá¿ñ?ø3| üú¹‹x^í×E°—eÀáÿ½tÃ¥;”APRQJ:•TQBIéF°Pº»»»»»»»ÛÑ•<{wßosæY93ïæ…B³„…þ)}äP(â?N‡ÓâT85Nƒ“âd89NSâ88.އãã8'ĉpbœ?‰ôºŸâgø9~_âW8Äþ0Ž#áÈ8 ŽŠ£áè8މcáØx÷íÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?ÄðcÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀ?ãxþÿŠÿã?ð`ü'þ ÁCñ0<À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñ2¼¯À+ñ*¼¯Ákñ:¼oÀñ&¼oÁ[ñ6¼ïÀ;ñ.¼Ÿ ݧði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?Äðcü?ÅÏðsü¿Ä¯pˆ÷†Ãq$GÁQq4ÇÀ1q,ÇÁqq<'À8!N„ã$8)N†“ã8%N…Sã48-N‡Óã ø ü&Έ3áÌ8 ~ gÅÙpvœçĹpnœçÅùðÛ8?.€ âwp!\¿‹‹à¢ø=ü>.†‹ã¸$.…Kãpü!þ—Åãrøü).+àŠ¸®Œ?ÃUpU\ WÇ5pM\ ׯup]\×ÇŸã/pÜ7Âq܉¿Â_ãføü-nŽ[à–¸þ·Æßãpü#n‹Ûáö¸îˆ;áŸð°°×=À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñ2¼¯À+ñ*¼¯Ákñ:¼oÀñ&¼oÁ[ñ6¼ïÀ;ñ.¼ïÁ{ñ>¼Àñ!|ÁGñ1|ŸÀ'ñ)|ŸÁgñ9|_Àñ%|_ÁWñ5|ßÀ7ñ-|ßÁwñ=|?Àñ#ü?ÁOñ3ü¿À/ñ+â†Ãq$GÁQq4ÇÀ1q,ÇÁqq<'À8!N„ã$8)N†“ã8%N…Sã48-N‡Óã ø ü&Έ3áÌ8 ~ gÅÙpvœçĹpnœçÅùðÛ8?.€ âwp!\¿‹‹à¢ø=ü>.†‹ã¸$.…Kãpü!þ—Åãrøü).+àŠ¸®Œ?ÃUpU\ WÇ5pM\ ׯup]\×ÇŸã/pÜ7Âq܉¿Â_ãføü-nŽ[à–¸þ·Æßãpü#n‹Ûáö¸îˆ;áŸpgÜwÅÝpwÜ÷ĽpoÜ÷Åýp<ÿŒâAøü+þ ÿŽÿÀƒñŸø/<ÅÃðp<Ä£ðh<Åãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|"üßô?÷7ùoùSeurat/tests/testdata/barcodes.tsv0000644000176200001440000000252014670622051017012 0ustar liggesusersATGCCAGAACGACT-1 CATGGCCTGTGCAT-1 GAACCTGATGAACC-1 TGACTGGATTCTCA-1 AGTCAGACTGCACA-1 TCTGATACACGTGT-1 TGGTATCTAAACAG-1 GCAGCTCTGTTTCT-1 GATATAACACGCAT-1 AATGTTGACAGTCA-1 AGGTCATGAGTGTC-1 AGAGATGATCTCGC-1 GGGTAACTCTAGTG-1 CATGAGACACGGGA-1 TACGCCACTCCGAA-1 CTAAACCTGTGCAT-1 GTAAGCACTCATTC-1 TTGGTACTGAATCC-1 CATCATACGGAGCA-1 TACATCACGCTAAC-1 TTACCATGAATCGC-1 ATAGGAGAAACAGA-1 GCGCACGACTTTAC-1 ACTCGCACGAAAGT-1 ATTACCTGCCTTAT-1 CCCAACTGCAATCG-1 AAATTCGAATCACG-1 CCATCCGATTCGCC-1 TCCACTCTGAGCTT-1 CATCAGGATGCACA-1 CTAAACCTCTGACA-1 GATAGAGAAGGGTG-1 CTAACGGAACCGAT-1 AGATATACCCGTAA-1 TACTCTGAATCGAC-1 GCGCATCTTGCTCC-1 GTTGACGATATCGG-1 ACAGGTACTGGTGT-1 GGCATATGCTTATC-1 CATTACACCAACTG-1 TAGGGACTGAACTC-1 GCTCCATGAGAAGT-1 TACAATGATGCTAG-1 CTTCATGACCGAAT-1 CTGCCAACAGGAGC-1 TTGCATTGAGCTAC-1 AAGCAAGAGCTTAG-1 CGGCACGAACTCAG-1 GGTGGAGATTACTC-1 GGCCGATGTACTCT-1 CGTAGCCTGTATGC-1 TGAGCTGAATGCTG-1 CCTATAACGAGACG-1 ATAAGTTGGTACGT-1 AAGCGACTTTGACG-1 ACCAGTGAATACCG-1 ATTGCACTTGCTTT-1 CTAGGTGATGGTTG-1 GCACTAGACCTTTA-1 CATGCGCTAGTCAC-1 TTGAGGACTACGCA-1 ATACCACTCTAAGC-1 CATATAGACTAAGC-1 TTTAGCTGTACTCT-1 GACATTCTCCACCT-1 ACGTGATGCCATGA-1 ATTGTAGATTCCCG-1 GATAGAGATCACGA-1 AATGCGTGGACGGA-1 GCGTAAACACGGTT-1 ATTCAGCTCATTGG-1 GGCATATGGGGAGT-1 ATCATCTGACACCA-1 GTCATACTTCGCCT-1 TTACGTACGTTCAG-1 GAGTTGTGGTAGCT-1 GACGCTCTCTCTCG-1 AGTCTTACTTCGGA-1 GGAACACTTCAGAC-1 CTTGATTGATCTTC-1 Seurat/tests/testdata/visium/0000755000176200001440000000000014744634036016017 5ustar liggesusersSeurat/tests/testdata/visium/spatial/0000755000176200001440000000000014731050553017444 5ustar liggesusersSeurat/tests/testdata/visium/spatial/scalefactors_json.json0000644000176200001440000000024414731050553024041 0ustar liggesusers{"tissue_hires_scalef": 0.17211704, "tissue_lowres_scalef": 0.051635113, "fiducial_diameter_fullres": 144.5324756763478, "spot_diameter_fullres": 89.47248494250101}Seurat/tests/testdata/visium/spatial/tissue_lowres_image.png0000644000176200001440000000270114731050553024223 0ustar liggesusers‰PNG  IHDRXWO0* ˆIDATxœíÁ1 õOm / àfó2ÅÛ=ìIEND®B`‚Seurat/tests/testdata/visium/spatial/tissue_hires_image.png0000644000176200001440000003640414731050553024031 0ustar liggesusers‰PNG  IHDRÐΣ䧒 IDATxœìÁ€þ¯î €Ùƒ ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU&ìùM¿IDATUUUUUUUUUUUUUUUUUUUUUUUUUUUa€ü_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¥=8$ôÿµÌ|û‹{IEND®B`‚Seurat/tests/testdata/visium/spatial/tissue_positions_list.csv0000644000176200001440000055173214670622051024654 0ustar liggesusersACGCCTGACACGCGCT-1,0,0,0,1487,1480 TACCGATCCAACACTT-1,0,1,1,1607,1549 ATTAAAGCGGACGAGC-1,0,0,2,1487,1617 GATAAGGGACGATTAG-1,0,1,3,1607,1686 GTGCAAATCACCAATA-1,0,0,4,1487,1755 TGTTGGCTGGCGGAAG-1,0,1,5,1607,1824 GCATCCTCTCCTATTA-1,0,0,6,1487,1893 GCGAGGGACTGCTAGA-1,0,1,7,1607,1962 TGGTACCGGCACAGCC-1,0,0,8,1487,2030 GCGCGTTTAAATCGTA-1,0,1,9,1607,2099 TGCCTTGCCCTTACGG-1,0,0,10,1487,2168 GACGACTTTCCAAGAA-1,0,1,11,1607,2237 CCAGTGAGCTCCTTGT-1,0,0,12,1487,2306 ATACCCTGGCTCAAAT-1,0,1,13,1607,2375 GGGTTTCCGGCTTCCA-1,0,0,14,1487,2443 TAACCGTCCAGTTCAT-1,0,1,15,1607,2512 AAACAACGAATAGTTC-1,0,0,16,1487,2581 CAAGGGAGTGTATTTG-1,0,1,17,1607,2650 CCAAGCTTGATCTCCT-1,0,0,18,1487,2719 TTATTTCATCCCAAAC-1,0,1,19,1607,2788 GAGCGCTATGTCAGGC-1,0,0,20,1487,2856 TATGGCAGACTTTCGA-1,0,1,21,1607,2925 CTTCGTGCCCGCATCG-1,0,0,22,1487,2994 AAACGGGTTGGTATCC-1,0,1,23,1607,3063 TGCAAACCCACATCAA-1,0,0,24,1487,3132 GACGGGATGTCTTATG-1,0,1,25,1607,3200 GGCGAGCATCGAGGAC-1,0,0,26,1487,3269 CGCGTGCTATCAACGA-1,0,1,27,1607,3338 TGAAACCTCAACTCAC-1,0,0,28,1487,3407 CACATAAGGCGACCGT-1,0,1,29,1607,3476 TGACCCAACTCACATT-1,0,0,30,1487,3545 ATACGCCGATCTACCG-1,0,1,31,1607,3613 ACTTATCTGATCTATA-1,0,0,32,1487,3682 GTGTGAGCCGAGGTGC-1,0,1,33,1607,3751 GATGATTTGAAACTGG-1,0,0,34,1487,3820 GGGAACCACCTGTTTC-1,0,1,35,1607,3889 GTTCGTTGCGGACCAG-1,0,0,36,1487,3958 TGAGGTTGATCCCAAG-1,0,1,37,1607,4026 GATGCCACACTACAGC-1,0,0,38,1487,4095 AGGCAAAGAGGAATCA-1,0,1,39,1607,4164 AAGTAAGCTTCCAAAC-1,0,0,40,1487,4233 AACGTAGTCTACCCAT-1,0,1,41,1607,4302 GTTTGAGCGGTTATGT-1,0,0,42,1487,4371 GAAGCAAGGCAATGTT-1,0,1,43,1607,4439 TCACTCAGCGCATTAG-1,0,0,44,1487,4508 TACAATGAAACCAGCA-1,0,1,45,1607,4577 GTGCGCTTACAAATGA-1,0,0,46,1487,4646 GCACTCCCACAGTCCC-1,0,1,47,1607,4715 CGAAGACTGCCCGGGA-1,0,0,48,1487,4784 CAGGATCCGCCCGACC-1,0,1,49,1607,4852 CACGATTGGTCGTTAA-1,0,0,50,1487,4921 GGTTGTATCGTGAAAT-1,0,1,51,1607,4990 TCTTATGGGTAGTACC-1,0,0,52,1487,5059 TACAAGCTGTTCACTG-1,0,1,53,1607,5128 GTATCTTGTTGCTCAC-1,0,0,54,1487,5197 ATACCAGGTGAGCGAT-1,0,1,55,1607,5265 CCTAAACAGGGTCCGT-1,0,0,56,1487,5334 ATGGTGCTCAAAGCCA-1,0,1,57,1607,5403 CAAATGCGGAGTGTTC-1,0,0,58,1487,5472 CGTGCCCGACATTTGT-1,0,1,59,1607,5541 GTATCTCCCTAACTGT-1,0,0,60,1487,5610 ATTTGCCTAGTTACGA-1,0,1,61,1607,5678 ACGTCCTAAACGAGAT-1,0,0,62,1487,5747 CTGGGATCGCCCAGAT-1,0,1,63,1607,5816 CTGCAAATGGGCTCCA-1,0,0,64,1487,5885 CATTATAACAGGGTCC-1,0,1,65,1607,5954 ACCTTTCCTTTAGAAG-1,0,0,66,1487,6022 ATAGATTTGCAGTCGG-1,0,1,67,1607,6091 CTCGGGCATCGTCGGG-1,0,0,68,1487,6160 GTGGCGGGCCGTAGCT-1,0,1,69,1607,6229 CAACAGTGCCAAACGG-1,0,0,70,1487,6298 TGCGGGTATTGGGATC-1,0,1,71,1607,6367 GTCTCGCCAACACGCC-1,0,0,72,1487,6435 CTGGGCGGCCAAATGT-1,0,1,73,1607,6504 TAAAGGAGAAACTAGT-1,0,0,74,1487,6573 TCCCACGGAGGGAGCT-1,0,1,75,1607,6642 AGCTTCAATACTTTGA-1,0,0,76,1487,6711 TTCCACATTTCTCGTC-1,0,1,77,1607,6780 ACAAACCGACAAGGCG-1,0,0,78,1487,6848 AGACGGGATTGGTATA-1,0,1,79,1607,6917 AACCTAAAGCCGTCCG-1,0,0,80,1487,6986 TACAAATTGCGGAGGT-1,0,1,81,1607,7055 CCCGCTAGAGGGTTAA-1,0,0,82,1487,7124 CATTGCAAAGCATAAT-1,0,1,83,1607,7193 TGTACGCTATCAGCTT-1,0,0,84,1487,7261 TTCTTCGCAATAGAGC-1,0,1,85,1607,7330 TGTGATTCCAGCGCTT-1,0,0,86,1487,7399 ATTCAGGATCGCCTCT-1,0,1,87,1607,7468 GCCCATGGGTGCAATG-1,0,0,88,1487,7537 TTCCCGACGCTTCACT-1,0,1,89,1607,7606 AGCGGTTGAGATGTAC-1,0,0,90,1487,7674 GCTGTCTGTGATCGAC-1,0,1,91,1607,7743 AAAGACATGAAGTTTA-1,0,0,92,1487,7812 CAACAGAATAACGCTA-1,0,1,93,1607,7881 TGCGGTCTACGAGTAA-1,0,0,94,1487,7950 AAGACTCACGCCCACT-1,0,1,95,1607,8019 CTTTGAAACATATTCC-1,0,0,96,1487,8087 CTGGGCACTAGTCGGA-1,0,1,97,1607,8156 CGCCCTTACATCCACC-1,0,0,98,1487,8225 CACGACCACAGACTTT-1,0,1,99,1607,8294 CAATCCATTATCCGTT-1,0,0,100,1487,8363 GTGGCGTGCACCAGAG-1,0,1,101,1607,8432 CGGAGTCCTAACCTGG-1,0,0,102,1487,8500 GGTCCCATAACATAGA-1,0,1,103,1607,8569 ATCTCATAAACCTACC-1,0,0,104,1487,8638 TGCATGGCAGTCTTGC-1,0,1,105,1607,8707 TTGCAGGTCATGAAGT-1,0,0,106,1487,8776 AGCTGCATTTGAGGTG-1,0,1,107,1607,8844 TAATCAGGAATGCTGC-1,0,0,108,1487,8913 CCATCATAAGAACAGG-1,0,1,109,1607,8982 TCGTATCACCAAGCTA-1,0,0,110,1487,9051 ATTCAGATGAATCCCT-1,0,1,111,1607,9120 AAAGGTCAACGACATG-1,0,0,112,1487,9189 AGCTGCTGTGCCGAAT-1,0,1,113,1607,9257 CTAGCGCCAATCCTAC-1,0,0,114,1487,9326 GCTCGACCGAACTGAA-1,0,1,115,1607,9395 ACAGTGCAGCGCATTT-1,0,0,116,1487,9464 CGGCTGAAGGTTACGC-1,0,1,117,1607,9533 CACCTCTACGAGTGTG-1,0,0,118,1487,9602 ATACGACAGATGGGTA-1,0,1,119,1607,9670 ACTTCCTGTCGTGCGA-1,0,0,120,1487,9739 CGTAACGGAACGATCA-1,0,1,121,1607,9808 AAATCACTCCTAAACG-1,0,0,122,1487,9877 CTCCGAGTAAATCCGC-1,0,1,123,1607,9946 ACGCTAGTATCAGTGC-1,0,0,124,1487,10015 AGAGTGAACAGACACC-1,0,1,125,1607,10083 ACACCCGTAAATCTGT-1,0,0,126,1487,10152 GCTTTGCTGCCGGGTA-1,0,1,127,1607,10221 ACAGGAGGCGCAGCCG-1,0,2,0,1727,1480 AGGCAATACGGAGGAC-1,0,3,1,1847,1549 TGGTGTGACAGACGAT-1,0,2,2,1727,1617 ATCTATCGATGATCAA-1,0,3,3,1847,1686 CGGTAACAAGATACAT-1,0,2,4,1727,1755 TCGCCGGAGAGTCTTA-1,0,3,5,1847,1824 GGAGGAGTGTGTTTAT-1,0,2,6,1727,1893 TTAGGTGTGACTGGTC-1,0,3,7,1847,1962 CAGGGCTAACGAAACC-1,0,2,8,1727,2030 CCCGTGGGTTAATTGA-1,0,3,9,1847,2099 GACCGACCGCTAATAT-1,0,2,10,1727,2168 GGTATCAAGCATAGAA-1,0,3,11,1847,2237 TGCATGAGTAGATTCG-1,0,2,12,1727,2306 AATTCCAACTTGGTGA-1,0,3,13,1847,2375 TGCCGATGTCATCAAT-1,0,2,14,1727,2443 GCTGGGTCCGCTGTTA-1,0,3,15,1847,2512 TGAACACCCGAAGCAG-1,0,2,16,1727,2581 AACATTGGTCAGCCGT-1,0,3,17,1847,2650 GTGGGTCTTCTTTGCG-1,0,2,18,1727,2719 CATCGAATGGATCTCT-1,0,3,19,1847,2788 GCTACACTGTCCGAAC-1,0,2,20,1727,2856 CGGGTTGTAGCTTTGG-1,0,3,21,1847,2925 CCTAAGTGTCTAACCG-1,0,2,22,1727,2994 TCTGTGACTGACCGTT-1,0,3,23,1847,3063 TTATCATACTCGCAAA-1,0,2,24,1727,3132 AGCGTAGCGCTAGACC-1,0,3,25,1847,3201 TCCCTCCGAAATCGTT-1,0,2,26,1727,3269 AGGTCGCCACTTCGGT-1,0,3,27,1847,3338 CTAGCAACTAATTTAC-1,0,2,28,1727,3407 TTGCTAGCTACCAATC-1,0,3,29,1847,3476 GCCGGTTTGGGCGGAT-1,0,2,30,1727,3545 TGTAACTTGTCAACCT-1,0,3,31,1847,3613 CGAGATGTTGCCTATA-1,0,2,32,1727,3682 GTTACGAAATCCACGC-1,0,3,33,1847,3751 CTTGTCGTACGTGTCA-1,0,2,34,1727,3820 GCGTCCAGCTCGTGGC-1,0,3,35,1847,3889 CCCTTCTCGTACGCGA-1,0,2,36,1727,3958 CCAAAGTCCCGCTAAC-1,0,3,37,1847,4026 CCGCTTCGCGGTTAAC-1,0,2,38,1727,4095 GTTACGGCCCGACTGC-1,0,3,39,1847,4164 CCCGCTTGCCCTCGTC-1,0,2,40,1727,4233 TAGTGAGAAGTGGTTG-1,0,3,41,1847,4302 CGCTACCGCCCTATGA-1,0,2,42,1727,4371 AAACAATCTACTAGCA-1,0,3,43,1847,4439 GCGCGATGGGTCAAGT-1,0,2,44,1727,4508 ATAAACCATTGGACGG-1,0,3,45,1847,4577 TCGGGCACTTCTGGAT-1,0,2,46,1727,4646 TCTGTGGCTACATTTC-1,0,3,47,1847,4715 CTCTGTGCCTGCTATG-1,0,2,48,1727,4784 CACGACTAAAGTTCTG-1,0,3,49,1847,4852 GAGGAGTAATTCCTAC-1,0,2,50,1727,4921 AGAGGTATCTCGGTCC-1,0,3,51,1847,4990 GGCGTACCCTATATAA-1,0,2,52,1727,5059 GCCGGAAACACATCTT-1,0,3,53,1847,5128 AAATGTGGGTGCTCCT-1,0,2,54,1727,5197 ACCAGGAGTGTGATCT-1,0,3,55,1847,5265 TGTGGAGGAAGCTTAA-1,0,2,56,1727,5334 AAGGAGAACTTATAAG-1,0,3,57,1847,5403 CCCTCGGGAGCCTTGT-1,0,2,58,1727,5472 ACTGTTTAGTGTAGGC-1,0,3,59,1847,5541 CGTCAGTTTATCGTCT-1,0,2,60,1727,5610 GCGTGTATGTCGTATT-1,0,3,61,1847,5678 ACAATCGATCTTTATA-1,0,2,62,1727,5747 CAGCCCTCACAGGCAG-1,0,3,63,1847,5816 CGCGTCATATTAAACC-1,0,2,64,1727,5885 GAAGACTTCAATGCCG-1,0,3,65,1847,5954 TTGCGGCGACTCATGC-1,0,2,66,1727,6022 ACCAAACTAGAAATCC-1,0,3,67,1847,6091 TTACTGTTTCTCTACG-1,0,2,68,1727,6160 GACCAGGTCATTCATA-1,0,3,69,1847,6229 TTCTTCCCTTTGATAT-1,0,2,70,1727,6298 ACGCCCAGCTGTCGAT-1,0,3,71,1847,6367 AGTAGCGTGAACGAAC-1,0,2,72,1727,6435 CCTCGACCCACTGCCT-1,0,3,73,1847,6504 AGTTATTGAAAGGTAA-1,0,2,74,1727,6573 TCAGTTACGGAATGAT-1,0,3,75,1847,6642 GAATCTATACTCGGAC-1,0,2,76,1727,6711 TCGGCTAACTTCCCTT-1,0,3,77,1847,6780 ACGTGGTCGAATGTGC-1,0,2,78,1727,6848 ATATCGTGCCAGACCC-1,0,3,79,1847,6917 GTAGCTAGTAAGCGCG-1,0,2,80,1727,6986 ACGCTTAGTGTCTCTC-1,0,3,81,1847,7055 TCCGGCCTGCATCGAT-1,0,2,82,1727,7124 TAGTGGAACTCATACA-1,0,3,83,1847,7193 ATCATCTGCCCAGTGT-1,0,2,84,1727,7261 GTTATTAAATACGACC-1,0,3,85,1847,7330 GCGCTAAGTATGCATG-1,0,2,86,1727,7399 CCTGACGCAACCTTTA-1,0,3,87,1846,7468 CCCAAGAATGCACGGT-1,0,2,88,1727,7537 AACTGGGTTCGAGCCG-1,0,3,89,1846,7606 GGTTCCACCCGCTTCT-1,0,2,90,1727,7674 CATGCACGTGTTACTG-1,0,3,91,1846,7743 AGCGTTCCGATTTAAA-1,0,2,92,1727,7812 CCTACGCGACCTTACA-1,0,3,93,1846,7881 CGAATTACATGGTGTT-1,0,2,94,1727,7950 GAGGTCTTAGTGGGTC-1,0,3,95,1846,8019 GCCGCTAGATACGCAG-1,0,2,96,1727,8087 GTCACCTGTCTATGTC-1,0,3,97,1846,8156 CCGATTGGTCAATGAA-1,0,2,98,1727,8225 CCTGTGCGGATTGTAA-1,0,3,99,1846,8294 TTACGTAGCGCGTGCT-1,0,2,100,1727,8363 GGAGGCGAAGAACCGC-1,0,3,101,1846,8432 GGGTCACGTGCTTATG-1,0,2,102,1727,8500 GCTCCGGACGTTGATA-1,0,3,103,1846,8569 ATGTTTGTAAGATCAT-1,0,2,104,1727,8638 TGACCCAGCATTCCCG-1,0,3,105,1846,8707 TGGTCGTTTGATAGAT-1,0,2,106,1727,8776 TGTAATGCCTTCGGAC-1,0,3,107,1846,8844 TGCTCACACAACAACC-1,0,2,108,1727,8913 TACGATCCAAGCCACT-1,0,3,109,1846,8982 TTGTAACTTCATAGCG-1,0,2,110,1727,9051 AGATTCAAGCGGGTCG-1,0,3,111,1846,9120 CTCAGCAGACTGCCGA-1,0,2,112,1727,9189 GTAACATCAGCTCATC-1,0,3,113,1846,9257 ATGGAACAGAATAAAC-1,0,2,114,1727,9326 GGGCCTATACAACCGG-1,0,3,115,1846,9395 TCAAACAATTAGGACA-1,0,2,116,1727,9464 AAACCACTACACAGAT-1,0,3,117,1846,9533 AAACGACAGTCTTGCC-1,0,2,118,1727,9602 TTGAGGGTCGAACGCG-1,0,3,119,1846,9670 TGTTGATCACTGTTTA-1,0,2,120,1727,9739 AGGGTGTGCTACACGC-1,0,3,121,1846,9808 GTAGTTAGACAATATA-1,0,2,122,1727,9877 AATGGCCGCCAATGCG-1,0,3,123,1846,9946 TCGGCGGTATTAGATT-1,0,2,124,1727,10015 GGGTCACTGAGTAGTG-1,0,3,125,1846,10083 GAATTATGCAACCTAC-1,0,2,126,1727,10152 GATCTTAGTGAACGTG-1,0,3,127,1846,10221 CTAATGCGCCCAACAA-1,0,4,0,1966,1480 GCCACCCATTCCACTT-1,0,5,1,2086,1549 TACTCACAACGTAGTA-1,0,4,2,1966,1617 GTTCGGTGTGGATTTA-1,0,5,3,2086,1686 TCTTTCGGCGGGACAC-1,0,4,4,1966,1755 GGAGACATTCACGGGC-1,0,5,5,2086,1824 GGGATTATCTCACAAC-1,0,4,6,1966,1893 TAGAACGCCAGTAACG-1,0,5,7,2086,1962 ACGAGTCGCCGGCGTT-1,0,4,8,1966,2030 TGATGGGACTAAGTCA-1,0,5,9,2086,2099 TGCGAGAAACGTTACG-1,0,4,10,1966,2168 TCGCCTCGACCTGTTG-1,0,5,11,2086,2237 AACTCGATAAACACGT-1,0,4,12,1966,2306 AGGAAAGCCTCTGATG-1,0,5,13,2086,2375 GAAGGACTAAATTGAA-1,0,4,14,1966,2443 GTATCGGGACGAGCTG-1,0,5,15,2086,2512 CCTGTGCATAGGAGAC-1,0,4,16,1966,2581 CATACGGGTGCATGAT-1,0,5,17,2086,2650 CCACTAAACTGAATCG-1,0,4,18,1966,2719 AAATTGCGGCGGTTCT-1,0,5,19,2086,2788 AGTCCAGCGGGTACGT-1,0,4,20,1966,2856 CATTCAGGTCAGTGCG-1,0,5,21,2086,2925 CTAAAGTCCGAAGCTA-1,0,4,22,1966,2994 AATCAGACTGCAGGAC-1,0,5,23,2086,3063 AGTATCCATAATAACG-1,0,4,24,1966,3132 CTGGCTGCTAACGTAA-1,0,5,25,2086,3201 GTTCCAAGACAGCGAC-1,0,4,26,1966,3269 AAGACTAACCCGTTGT-1,0,5,27,2086,3338 GATTAATCCTGGCTCA-1,0,4,28,1966,3407 CGCGCAAGGAACTACA-1,0,5,29,2086,3476 CAGTAGCGAGGTAGTA-1,0,4,30,1966,3545 ACGGCGGGTTGCCCTG-1,0,5,31,2086,3613 CTAGGCGGCAGAGAAT-1,0,4,32,1966,3682 GTGCGCAGCTTGCTCC-1,0,5,33,2086,3751 TCACTATCGTGCAATC-1,0,4,34,1966,3820 TATGATTCTGCTTGGT-1,0,5,35,2086,3889 TAAGATTTAGCGGGAG-1,0,4,36,1966,3958 TTACGGTGTCACCGAG-1,0,5,37,2086,4026 CTACACTAGCTTGTTC-1,0,4,38,1966,4095 TGAGCAGTCGTGAAGT-1,0,5,39,2086,4164 CGCTGAGGACGTCCAA-1,0,4,40,1966,4233 GTGTATGACTTTAAAG-1,0,5,41,2086,4302 CTAAACGGGTGTAATC-1,0,4,42,1966,4371 TGTACTGTGCCAAAGT-1,0,5,43,2086,4439 GGCCACAAGCGATGGC-1,0,4,44,1966,4508 GTCAATTGTACTGAAG-1,0,5,45,2086,4577 AGGGACAGCACGGCGG-1,0,4,46,1966,4646 AGCTTATAGAGACCTG-1,0,5,47,2086,4715 AACTAGCGTATCGCAC-1,0,4,48,1966,4784 AACTTTAGCTGCTGAG-1,0,5,49,2086,4852 CCCAAGACAGAGTATG-1,0,4,50,1966,4921 GGCATCAACGAGCACG-1,0,5,51,2086,4990 ATGCATTCCGTGATGG-1,0,4,52,1966,5059 TTATAGATGCACATTA-1,0,5,53,2086,5128 GAACCATCTGGGAGAC-1,0,4,54,1966,5197 TGCTATACAAACGGAC-1,0,5,55,2086,5265 ACTTGCCATATTGTAC-1,0,4,56,1966,5334 TATTCCGGCAGTCCTA-1,0,5,57,2086,5403 GACGGACCGCGTTCCT-1,0,4,58,1966,5472 ATGTGTAGTTTAGTCA-1,0,5,59,2086,5541 ATACCAGCAAATTGCT-1,0,4,60,1966,5610 AAGTTTACTAATGGCA-1,0,5,61,2086,5678 CTCTCGATGTGCGCCT-1,0,4,62,1966,5747 GATTGACACTCTGCTC-1,0,5,63,2086,5816 TATCACAGCACGGGCA-1,0,4,64,1966,5885 ACCGTTCCCGCTCTGA-1,0,5,65,2086,5954 CCGCCACCACAATCCA-1,0,4,66,1966,6023 CATTCACTGACAGCTA-1,0,5,67,2086,6091 CGGCTGCAAGATTAAG-1,0,4,68,1966,6160 CATGAACCTCTTATCA-1,0,5,69,2086,6229 TTAATGCGAGGTAACT-1,0,4,70,1966,6298 AATAAGTCCTCGAGAC-1,0,5,71,2086,6367 ACCAGCCCGGTCTTTG-1,0,4,72,1966,6435 CTACGAACTAGGTCGA-1,0,5,73,2086,6504 ACATCTCAACGCGTAA-1,0,4,74,1966,6573 CACTACTCAGTTCTGT-1,0,5,75,2086,6642 CCGACTCGCATAGTCT-1,0,4,76,1966,6711 CATTTATCGTTCAAGA-1,0,5,77,2086,6780 CAAACGTGGTCTTGCG-1,0,4,78,1966,6848 TAGAAACCACTAAGTA-1,0,5,79,2086,6917 ACTGATTTAGTGATTC-1,0,4,80,1966,6986 TCGTATTTCGTCCGGA-1,0,5,81,2086,7055 CGGAAATTTCACATCC-1,0,4,82,1966,7124 ATCCACGCTAAATGTT-1,0,5,83,2086,7193 GTTCAATCTATGTCAA-1,0,4,84,1966,7261 ATAAAGGTCAAGTACG-1,0,5,85,2086,7330 CAACTCCAACGTTTAG-1,0,4,86,1966,7399 TAGGAACAGCCTCCAG-1,0,5,87,2086,7468 ATGGGAACGGAAGCGG-1,0,4,88,1966,7537 CACACGTTTCAATGGG-1,0,5,89,2086,7606 GGTGTTCTGTTTCTAC-1,0,4,90,1966,7674 AGTAACGTTCATCCTG-1,0,5,91,2086,7743 GTATAGTGGCCCATGT-1,0,4,92,1966,7812 TCTACACGTTCATGCA-1,0,5,93,2086,7881 AATCTGGGTAGACCCT-1,0,4,94,1966,7950 TCGGTTAGCCATGTAG-1,0,5,95,2086,8019 TGCCATGGCTTATAAG-1,0,4,96,1966,8087 TAAGTAAATGTGCCGC-1,0,5,97,2086,8156 GTGTCCGATAAGGCAT-1,0,4,98,1966,8225 TGGCACGAGCTCGAGT-1,0,5,99,2086,8294 ACCGGTCTGAGTACGG-1,0,4,100,1966,8363 GAACTTAGCGCCCGGT-1,0,5,101,2086,8432 AGTAGCTAGACGCCGA-1,0,4,102,1966,8500 ATAGGAATCTAAGCTT-1,0,5,103,2086,8569 CTTCCTGCATATTTAC-1,0,4,104,1966,8638 CAATATGTAGATTTAC-1,0,5,105,2086,8707 ACAAGGCCTACCAGCC-1,0,4,106,1966,8776 TTATAGTCCAAGGTGC-1,0,5,107,2086,8845 AAACGCCCGAGATCGG-1,0,4,108,1966,8913 CCTCGTTACGCCTGTT-1,0,5,109,2086,8982 GAACGGTGTAAAGCAG-1,0,4,110,1966,9051 ACGCATAAATGACATG-1,0,5,111,2086,9120 GGTTCGATGCTGAGTT-1,0,4,112,1966,9189 CTTTGGCAGACAGAGT-1,0,5,113,2086,9257 TTCGTGGGCTGGAAGC-1,0,4,114,1966,9326 CAAAGGTTAAATTCAG-1,0,5,115,2086,9395 GTTTGGCGTCAGGCAC-1,0,4,116,1966,9464 GCTTTCTATCTCAACT-1,0,5,117,2086,9533 TGCATCTCCGGATCTT-1,0,4,118,1966,9602 CTGAAACGGCCCTCAG-1,0,5,119,2086,9670 TAGCAGTAAATACGCG-1,0,4,120,1966,9739 CGGGCTACTTAAATTG-1,0,5,121,2086,9808 ATTATGCTCAGTATTG-1,0,4,122,1966,9877 TGATGCTCACGTAGTC-1,0,5,123,2086,9946 GTCTAAGATGCCCAGC-1,0,4,124,1966,10015 AACCCGATAGGGCTTC-1,0,5,125,2086,10083 CGCTATCGTGGCTTTA-1,0,4,126,1966,10152 CGTCTCTCGCCGAGGC-1,0,5,127,2086,10221 AGTGGGAGTATACACG-1,0,6,0,2206,1480 GGTCTTGGTGTTAACT-1,0,7,1,2326,1549 GGCTGGCAGCTTTATG-1,0,6,2,2206,1617 CGCCAATTATTGCGTT-1,0,7,3,2326,1686 GGTAACCGGCAAAGGT-1,0,6,4,2206,1755 TGGGACCATTGGGAGT-1,0,7,5,2326,1824 CTGCAGGTGCTCGGCC-1,0,6,6,2206,1893 CCGGTGCGAGTGATAG-1,0,7,7,2326,1962 GGGTACACTCTGGAGG-1,0,6,8,2206,2030 TAGCCAGAGGGTCCGG-1,0,7,9,2326,2099 CTTGTGAGGACAGCGG-1,0,6,10,2206,2168 GAAGGGCATAACCATG-1,0,7,11,2326,2237 CAACATGGCCTGATAA-1,0,6,12,2206,2306 CAATTTGACCGGGAAG-1,0,7,13,2326,2375 TCTGACTGTAATGGTT-1,0,6,14,2206,2443 TTCATAGCCTTGTAAC-1,0,7,15,2326,2512 TGGAAACGGAGTGAAC-1,0,6,16,2206,2581 ATCGCACGATTGTTCA-1,0,7,17,2326,2650 CGCCACCCGCATTAAC-1,0,6,18,2206,2719 TGGACCACGGCGTTGA-1,0,7,19,2326,2788 GTATATGTTACGGCGG-1,0,6,20,2206,2856 GTATTCTTACCGTGCT-1,0,7,21,2326,2925 TTCAGAGTAACCTGAC-1,0,6,22,2206,2994 GCGGTAACCCAAATGA-1,0,7,23,2326,3063 CTACGTGTTGCCACCA-1,0,6,24,2206,3132 CTAGATAAACTCCTCG-1,0,7,25,2326,3201 TCCATTAGTTGGATAG-1,0,6,26,2206,3269 CTGGCTCCTGCGGGAT-1,0,7,27,2326,3338 CAGTCTCTCGGCTAAT-1,0,6,28,2206,3407 GTATGACGTGGGAAAC-1,0,7,29,2326,3476 AGTCACTCCGCCTCAT-1,0,6,30,2206,3545 GCAGCGGTGGGCATTA-1,0,7,31,2326,3614 TATGGAGTTTCTCGTT-1,0,6,32,2206,3682 ACTCAACGAATGTATT-1,0,7,33,2326,3751 AACACGCGGCCGCGAA-1,0,6,34,2206,3820 CGATATTAGCCGCAGG-1,0,7,35,2326,3889 AGCGTCTGAACCCGCA-1,0,6,36,2206,3958 GATGTCCGGATCACAT-1,0,7,37,2326,4026 GGTCACGTTAGATTCA-1,0,6,38,2206,4095 TTAAGGATACGGAGGT-1,0,7,39,2326,4164 GTGCGGGACCATCGGC-1,0,6,40,2206,4233 CCATCTTGTTCACAAT-1,0,7,41,2326,4302 TCCGAGAAGGCTAAGC-1,0,6,42,2206,4371 TGGCGGTGTGCGATTG-1,0,7,43,2326,4439 ATCCTGCTGCAGATAG-1,0,6,44,2206,4508 TTATGCGTCCCGGTCC-1,0,7,45,2326,4577 CATAATGAGCGGGCGA-1,0,6,46,2206,4646 AGACATAGATCCTTCC-1,0,7,47,2326,4715 GGTGAAACCGGGAATG-1,0,6,48,2206,4784 AACTGGTGTGGGCCTT-1,0,7,49,2326,4852 GTAGCGCTGTTGTAGT-1,0,6,50,2206,4921 TTGTTTGTGTAAATTC-1,0,7,51,2326,4990 GGATCAAAGGACGAGG-1,0,6,52,2206,5059 CGTAGCGCCGACGTTG-1,0,7,53,2326,5128 CAAGTGAACTTTGGTT-1,0,6,54,2206,5197 GTAGACAACCGATGAA-1,0,7,55,2326,5265 CAATGGTCGGCCTGGG-1,0,6,56,2206,5334 ACAGATTAGGTTAGTG-1,0,7,57,2326,5403 GTTATCACCTTCTGAA-1,0,6,58,2206,5472 TGGTATCGGTCTGTAT-1,0,7,59,2326,5541 GGAATAACCTCAAGAA-1,0,6,60,2206,5610 ATTATCTCGACAGATC-1,0,7,61,2326,5678 CCGAGGGATGTTAGGC-1,0,6,62,2206,5747 TGAGATCAAATACTCA-1,0,7,63,2326,5816 AAACGAAGAACATACC-1,0,6,64,2206,5885 CTGGTCCTAACTTGGC-1,0,7,65,2326,5954 TGCACGAGTCGGCAGC-1,0,6,66,2206,6023 ATAGTCTTTGACGTGC-1,0,7,67,2326,6091 TGGAGCTAAAGTTCCC-1,0,6,68,2206,6160 GGGTGGTCCAGCCTGT-1,0,7,69,2326,6229 CATGCATGGAGACCCT-1,0,6,70,2206,6298 ACACGGCACTATGCAT-1,0,7,71,2326,6367 CCCTGGTATGGGCGGC-1,0,6,72,2206,6435 GGAGGATTGAAAGGAG-1,0,7,73,2326,6504 CCGCTGGTGCCATTCA-1,0,6,74,2206,6573 GTTAGAGTGTGCCGCT-1,0,7,75,2326,6642 TCGGAATGACCATCAA-1,0,6,76,2206,6711 TTCAATTAGCCATAAT-1,0,7,77,2326,6780 GATGTGTTGTCACAAG-1,0,6,78,2206,6848 TCTTTCTCTTAAGGAG-1,0,7,79,2326,6917 ACCCTTTAGTTCTCCA-1,0,6,80,2206,6986 ACCACAACTCAGAACA-1,0,7,81,2326,7055 TATGATAAATCTAACG-1,0,6,82,2206,7124 GATCCTCTTGCGCTTA-1,0,7,83,2326,7193 TTCTACCTTTATGTTG-1,0,6,84,2206,7261 GAAATACCTGCTGGCT-1,0,7,85,2326,7330 ATTCTGAGTATGAACT-1,0,6,86,2206,7399 GGATTAAGCTAAGGTC-1,0,7,87,2326,7468 AGTACGTGGCCTGTCT-1,0,6,88,2206,7537 TCAGGGTGCACGAAAC-1,0,7,89,2326,7606 AAATTTACCGAAATCC-1,0,6,90,2206,7674 TTGAGGCATTTAACTC-1,0,7,91,2326,7743 AACCAGTATCACTCTT-1,0,6,92,2206,7812 CACCGGAGATATCTCC-1,0,7,93,2326,7881 GACTGGGCGCCGCAAC-1,0,6,94,2206,7950 CACGTCTATGATGTGG-1,0,7,95,2326,8019 TTAAGACGAACGAACC-1,0,6,96,2206,8087 TGACCAGCTTCAAAGT-1,0,7,97,2326,8156 AGAGTTAGAGACCGAT-1,0,6,98,2206,8225 TTCGGACTGATGCCTT-1,0,7,99,2326,8294 CTCGAATGGAACGTAT-1,0,6,100,2206,8363 GGACGGCTTGCGCAAC-1,0,7,101,2326,8432 CTAAGTACAGGGCTAC-1,0,6,102,2206,8500 ACAAATTCAGATCTGA-1,0,7,103,2326,8569 CATGGAAATGGGACCA-1,0,6,104,2206,8638 GGTGGACCACGTGTTA-1,0,7,105,2326,8707 CACGACGTAATAGTAA-1,0,6,106,2206,8776 CGGGTTCGGCACGTAT-1,0,7,107,2325,8845 CTGGGCTATCCTTTGG-1,0,6,108,2206,8913 GTATTAGGGTTCGCGT-1,0,7,109,2325,8982 TCATTCGTATAATTTG-1,0,6,110,2206,9051 AATAGCAAGCCTCCTG-1,0,7,111,2325,9120 CATCTACCCGAGAACG-1,0,6,112,2206,9189 GCTTCAGTGGGATTAC-1,0,7,113,2325,9257 TCTGTGATGGAGGTTG-1,0,6,114,2206,9326 ATCCACTTTCAGACTA-1,0,7,115,2325,9395 ATGGTTACGAAACATG-1,0,6,116,2206,9464 GGCCCAATCTAGAGGG-1,0,7,117,2325,9533 GATGGTGAAATAACCC-1,0,6,118,2206,9602 AGAGGGACAATTGTCC-1,0,7,119,2325,9670 CGCGTACATTCTGGAA-1,0,6,120,2206,9739 CAAGAAACCCTAAACT-1,0,7,121,2325,9808 TTGGTGCGGTGTTGAA-1,0,6,122,2206,9877 GGTTCCCTAGTGTCTC-1,0,7,123,2325,9946 CGATAACCAATTTGAG-1,0,6,124,2206,10015 GCCCACTGGTCCACAA-1,0,7,125,2325,10083 GAGGGCCGGCAGAGTC-1,0,6,126,2206,10152 CGACACGGATGCCCAC-1,0,7,127,2325,10221 CTGTCTGTGGCTGGCT-1,0,8,0,2446,1480 ATATTATCCCGTATTT-1,0,9,1,2565,1549 GCGCTGGCGGAAAGTC-1,0,8,2,2446,1617 ATCTAACGTCCCTATG-1,0,9,3,2565,1686 GTCAGACAGCGTTGGA-1,0,8,4,2446,1755 GCCAGGCTTAGTGGTA-1,0,9,5,2565,1824 ATTCAAAGTACCTGTT-1,0,8,6,2446,1893 TGGACGTAGGCGAATC-1,0,9,7,2565,1962 ACACATTGACGCAACA-1,0,8,8,2446,2030 GATATCAGTATGTATC-1,0,9,9,2565,2099 TGGGCCTTGCCTGCAT-1,0,8,10,2446,2168 CAAAGTCAGGTTAGCT-1,0,9,11,2565,2237 GGATCCCTACCAGCTA-1,0,8,12,2446,2306 ATCGTCCAATCGAGTC-1,0,9,13,2565,2375 ACATGGCTCAATTTAG-1,0,8,14,2445,2443 AGGCCCAGTGACTGGT-1,0,9,15,2565,2512 GCTTCCAGCTTAGATT-1,0,8,16,2445,2581 TGCTTGAAACCATGCA-1,0,9,17,2565,2650 CAATATTGGACTAGTG-1,0,8,18,2445,2719 CGTGCTGGCCTAGTCG-1,0,9,19,2565,2788 CCTGCGATAGAACTGT-1,0,8,20,2445,2856 GGGTAATGCTGTGTTT-1,0,9,21,2565,2925 AACGCGAACGGCAACA-1,0,8,22,2445,2994 TGTCGGCATGGTGGAA-1,0,9,23,2565,3063 AGCGTACGAGAGCTAG-1,0,8,24,2445,3132 ATACTCTCGCCACTCT-1,0,9,25,2565,3201 AATCCATGCAAGGGTG-1,0,8,26,2445,3269 TTAAACAGAGTCCCGC-1,0,9,27,2565,3338 CCACAGCTGAAATCAT-1,0,8,28,2445,3407 CGGTTCCGGCTTCTTG-1,0,9,29,2565,3476 GACGTGAGACTCCATG-1,0,8,30,2445,3545 TCGTTGGCTCGTCAAT-1,0,9,31,2565,3614 GGTGAACGGGCTAGCC-1,0,8,32,2445,3682 GCACTGTGCAAATGTA-1,0,9,33,2565,3751 ACGAGAACCCATCACG-1,0,8,34,2445,3820 CCAGCTACGCCTCATA-1,0,9,35,2565,3889 TCCCGGTCAGGAATTT-1,0,8,36,2445,3958 TCGCATTCAATGACTT-1,0,9,37,2565,4026 CTGGTTCAACGCATCA-1,0,8,38,2445,4095 GGTGATTTCATCTTGT-1,0,9,39,2565,4164 CACCCTTTCCTCGCTC-1,0,8,40,2445,4233 CAACTTGTAGTGGGCA-1,0,9,41,2565,4302 AATATCAAGGTCGGAT-1,0,8,42,2445,4371 ACTCAGACCTGCTTCT-1,0,9,43,2565,4439 TTGGAGTCTCCCTTCT-1,0,8,44,2445,4508 GGATACTCATGAATTG-1,0,9,45,2565,4577 TGGGCACAAACAGAAC-1,0,8,46,2445,4646 GAGCCACGGTAGTAGG-1,0,9,47,2565,4715 TCGATAGGCTAGTCGC-1,0,8,48,2445,4784 TAACCGCCCGCAGTGC-1,0,9,49,2565,4852 GCCTATTTGCTACACA-1,0,8,50,2445,4921 TTGACGATTCAGCACG-1,0,9,51,2565,4990 TTAAACCGGTAGCGAC-1,0,8,52,2445,5059 ACCGAAAGGGCCCTGC-1,0,9,53,2565,5128 ACGTTCCGCGCTCCGT-1,0,8,54,2445,5197 ATACCAGGCTAATAGA-1,0,9,55,2565,5265 CGGCTTTGTATGATAA-1,0,8,56,2445,5334 CTTGACCCGAAAGATA-1,0,9,57,2565,5403 CGCAGAAACATTTGCG-1,0,8,58,2445,5472 GACCCGTCGCCGGCTA-1,0,9,59,2565,5541 AATCGGGACACTACGA-1,0,8,60,2445,5610 GTCACAAAGTTTCCAA-1,0,9,61,2565,5678 TATATTCGCGTCGATA-1,0,8,62,2445,5747 CCTCCCGACAATCCCT-1,0,9,63,2565,5816 CGACATGCGATCTTCT-1,0,8,64,2445,5885 AACACGACTGTACTGA-1,0,9,65,2565,5954 CCCAACCACACTAACA-1,0,8,66,2445,6023 CACCGCCGACCAGCGA-1,0,9,67,2565,6091 TGGTATCGCATCCCAA-1,0,8,68,2445,6160 CAGAGTGATTTAACGT-1,0,9,69,2565,6229 AACCCTGGTGGAACCA-1,0,8,70,2445,6298 GTCAGTTGTGCTCGTT-1,0,9,71,2565,6367 ATTGACGTAACTCGGT-1,0,8,72,2445,6435 GATGTCGGTCAACTGC-1,0,9,73,2565,6504 AGGGCAGCGGCGTGGT-1,0,8,74,2445,6573 ACATCGTTAACCTAGT-1,0,9,75,2565,6642 TCCATTGTGACCTCGT-1,0,8,76,2445,6711 TGTTTAATACTTCATC-1,0,9,77,2565,6780 TTGCTGGCCGGGCTTC-1,0,8,78,2445,6848 CATATTATTTGCCCTA-1,0,9,79,2565,6917 CTGCCTAGCCACCAAG-1,0,8,80,2445,6986 ACGAGATATTTGCTTA-1,0,9,81,2565,7055 GACTACAATTGCTCGT-1,0,8,82,2445,7124 AACGTGATGAAGGACA-1,0,9,83,2565,7193 ACTCTCTTATACACGA-1,0,8,84,2445,7261 CGCATCATGGCTTCAG-1,0,9,85,2565,7330 CGGCTCTTCGTCGAAC-1,0,8,86,2445,7399 ATTCTTCGTACTTATG-1,0,9,87,2565,7468 AGTGAGGGTTTCTGAC-1,0,8,88,2445,7537 GCCAGGCGTTCGCATG-1,0,9,89,2565,7606 GACTAACACAGCACCT-1,0,8,90,2445,7674 CAATGGAATCTACATA-1,0,9,91,2565,7743 GTGGTCAGCGAAGTAT-1,0,8,92,2445,7812 ATGGCTGGAAATGGCC-1,0,9,93,2565,7881 ATCAGGTCGCCATTGC-1,0,8,94,2445,7950 TATCACCATGTAAAGT-1,0,9,95,2565,8019 AGCGCTTATGGGCAAG-1,0,8,96,2445,8087 AAGCGGCGTCATGGGT-1,0,9,97,2565,8156 ACTAATACGTCAGGCG-1,0,8,98,2445,8225 GGCTGAGCATCGTAAG-1,0,9,99,2565,8294 CGGTTGGGTTCAAGTT-1,0,8,100,2445,8363 GACTGATTGGTCACAA-1,0,9,101,2565,8432 AGACGGGCCGATTTAA-1,0,8,102,2445,8500 ACCAGTGCCCGGTCAA-1,0,9,103,2565,8569 GTCCTTTAATGACTTC-1,0,8,104,2445,8638 CCTACAAGTCCGGAAT-1,0,9,105,2565,8707 GCCTGCTACACTGAGA-1,0,8,106,2445,8776 GACTCGGTCGGCGGAT-1,0,9,107,2565,8845 CTAGACATATATGTAG-1,0,8,108,2445,8913 TCGCCCAACTGACTCC-1,0,9,109,2565,8982 AAACTAACGTGGCGAC-1,0,8,110,2445,9051 AACTGAGGTCAGCGTC-1,0,9,111,2565,9120 ACAATGATTCTTCTAC-1,0,8,112,2445,9189 ATAAGTACCCGATTGT-1,0,9,113,2565,9257 ATTGGGAGTTCTGTAA-1,0,8,114,2445,9326 CGAACATAGTCAGAAA-1,0,9,115,2565,9395 TAGCTCAGATCCTAGT-1,0,8,116,2445,9464 GTGTCGTATTCACCTT-1,0,9,117,2565,9533 CTCACCGATCCAAACT-1,0,8,118,2445,9602 ATATGTGCACAAACCA-1,0,9,119,2565,9670 CAGTCCAACGCCTTCT-1,0,8,120,2445,9739 TCGTCCGGGTACACTC-1,0,9,121,2565,9808 GCAGAAACGTAATCCA-1,0,8,122,2445,9877 TTCGAGCCGGCGCTAC-1,0,9,123,2565,9946 GGAAGATAAGACTGTA-1,0,8,124,2445,10015 ATAAGCAAACACCGAG-1,0,9,125,2565,10083 GCATAAATTGAACGCC-1,0,8,126,2445,10152 CGCCGGTGTCGCAGTA-1,0,9,127,2565,10221 GACCTGGTCTGGGCGT-1,0,10,0,2685,1480 AGCCGCTTGATTAGCG-1,0,11,1,2805,1549 CCCGGCTAGGTGAGAA-1,0,10,2,2685,1617 CGAGCCGAGCACTCGA-1,0,11,3,2805,1686 TAGTGCTTGAATCCTT-1,0,10,4,2685,1755 CAACCGCACCTAGACA-1,0,11,5,2805,1824 ACCACTGTTCAAGAAG-1,0,10,6,2685,1893 AGATGCTATAACGAGC-1,0,11,7,2805,1962 AATTACTCGTACGCTC-1,0,10,8,2685,2030 CGTCAATCTTTAACAT-1,0,11,9,2805,2099 CCAAAGCAGTTGGTTG-1,0,10,10,2685,2168 CCATATTGGATCATGA-1,0,11,11,2805,2237 CGTACCGAAAGTCTAG-1,0,10,12,2685,2306 CTCGAGATCCAAAGCA-1,0,11,13,2805,2375 TGGATAGAGTAACAGA-1,0,10,14,2685,2443 TCACAGATCCTCAAAC-1,0,11,15,2805,2512 AGAGCTACGAAAGCAT-1,0,10,16,2685,2581 TGCGTGATTGGGTGTC-1,0,11,17,2805,2650 CACATGTTTGGACATG-1,0,10,18,2685,2719 TTCGCATCCGGAAGCA-1,0,11,19,2805,2788 CCCTAGTGTCAGGTGT-1,0,10,20,2685,2856 TTACCGCCTTAGGGAA-1,0,11,21,2805,2925 CCAGTCCATTATTCGA-1,0,10,22,2685,2994 CGTAAACGCTTGAGTG-1,0,11,23,2805,3063 ATTCCTTCCAGGCGGT-1,0,10,24,2685,3132 TTCCTTTCTGTGTTGC-1,0,11,25,2805,3201 AGTTGACATCGGCTGG-1,0,10,26,2685,3269 AACTCGATGGCGCAGT-1,0,11,27,2805,3338 GATAAGGCAGATGCAA-1,0,10,28,2685,3407 GGCTGGCTAGCTTAAA-1,0,11,29,2805,3476 CCTCATGCAGCTACGA-1,0,10,30,2685,3545 GACGCCTGTTGCAGGG-1,0,11,31,2805,3614 TAATTAGATGGATATG-1,0,10,32,2685,3682 GAGGGCATCGCGTATC-1,0,11,33,2805,3751 CTTGTGAGTCTTTGAC-1,0,10,34,2685,3820 TCAACACATTGGGTAA-1,0,11,35,2805,3889 ACTGTATACGCGAGCA-1,0,10,36,2685,3958 GTGAAACGTGCTCCAC-1,0,11,37,2805,4026 CGAGTGCTATAGTTCG-1,0,10,38,2685,4095 GTACTGCATGAAGCGT-1,0,11,39,2805,4164 GTAACTTGCGGCAGTC-1,0,10,40,2685,4233 GAATCGCCGGACACGG-1,0,11,41,2805,4302 GGGAGTAATGGCTGGC-1,0,10,42,2685,4371 CATGAACCGACATTTG-1,0,11,43,2805,4439 TCTGTCATACAAGAGC-1,0,10,44,2685,4508 GTCGTCAATTATAAGG-1,0,11,45,2805,4577 TAAAGAGCCCGAAACC-1,0,10,46,2685,4646 GTACTGAGGTCGTAAC-1,0,11,47,2805,4715 AAAGACCCAAGTCGCG-1,0,10,48,2685,4784 CGTCAGTGCGCACAAG-1,0,11,49,2805,4852 TGTATCCTTATTCCAT-1,0,10,50,2685,4921 ATTCTCGTCTCTTTAG-1,0,11,51,2805,4990 AAAGTCACTGATGTAA-1,0,10,52,2685,5059 TGTCTACAGTTTCTGT-1,0,11,53,2805,5128 TTAACGTCGCAAGACC-1,0,10,54,2685,5197 CTATGTCTATTGAAAC-1,0,11,55,2805,5265 TCGGGTGAAACTGCTA-1,0,10,56,2685,5334 TGTCCCGACATAGCAC-1,0,11,57,2805,5403 ACAGCATAGAGCCAGT-1,0,10,58,2685,5472 ATATTCCCACAGGTCA-1,0,11,59,2805,5541 TTGGATCGACTTCTGG-1,0,10,60,2685,5610 CACCATCGGAGGAGAC-1,0,11,61,2805,5678 TCGTTCGTTATTATGT-1,0,10,62,2685,5747 CTTAACTTCGAAGTAC-1,0,11,63,2805,5816 GCACAAGTGTCGGAAG-1,0,10,64,2685,5885 TACCAGCTAGGTTTAA-1,0,11,65,2805,5954 ACGTACAGATTTCTCT-1,0,10,66,2685,6023 AATTTGGTTCCAAAGA-1,0,11,67,2805,6091 GTAAGGATTTGTCGGA-1,0,10,68,2685,6160 CATCATCTACCCGGAC-1,0,11,69,2805,6229 ACGATGGATCCGATGC-1,0,10,70,2685,6298 CACTCAGCTCTTGAGG-1,0,11,71,2805,6367 TAGATCCGAAGTCGCA-1,0,10,72,2685,6436 TGAAACTTATGCAAGC-1,0,11,73,2805,6504 GCGATTCTGGAAGCAG-1,0,10,74,2685,6573 CAAACTATTGAGCTTC-1,0,11,75,2805,6642 TAGAATTAAGGGCAAC-1,0,10,76,2685,6711 CGAAACATAGATGGCA-1,0,11,77,2805,6780 GATGGTGCCCTAGGCA-1,0,10,78,2685,6848 CCCGCAGGGCCCAAAG-1,0,11,79,2805,6917 ACAGCGCACCCGCAGC-1,0,10,80,2685,6986 GGTAAATGTGCGTTAC-1,0,11,81,2805,7055 GTCCTTCTAGTGGGTT-1,0,10,82,2685,7124 GGAAGCTCGCTTACAG-1,0,11,83,2805,7193 CACCGATACACCGAGC-1,0,10,84,2685,7261 CAGCCGGGCCCTCTAT-1,0,11,85,2805,7330 CGGAGCTTATAACACC-1,0,10,86,2685,7399 ATTACAACTACCGGCC-1,0,11,87,2805,7468 TCCTCTGGCCCATTAG-1,0,10,88,2685,7537 CGGCACCGTTAGCGCC-1,0,11,89,2805,7606 TCGGTCCCTGACTCCA-1,0,10,90,2685,7674 TGGTTGGAGGATCCTG-1,0,11,91,2805,7743 CTGCGGTAGTCACGTG-1,0,10,92,2685,7812 GTGCCTCAGTGTACGG-1,0,11,93,2805,7881 ATCGTTCACTTTCGCC-1,0,10,94,2685,7950 ACTTACCGGGCGCGCA-1,0,11,95,2805,8019 CTAGACTGCATTTCGT-1,0,10,96,2685,8087 TTGCCGGTGATCCCTC-1,0,11,97,2805,8156 CTGTCACGCCAGGCGC-1,0,10,98,2685,8225 CGGTATAGGTATTAGC-1,1,11,99,2805,8294 CCAACGCTTGCCAGGG-1,0,10,100,2685,8363 CGTTGAGTAATTGCGT-1,1,11,101,2805,8432 TGTATTTACCTAATGC-1,0,10,102,2685,8500 TAAATGCCGTCTCATG-1,1,11,103,2805,8569 CGGTTTATGAAGGAAC-1,0,10,104,2685,8638 GCAAGATGTGTTCGCG-1,1,11,105,2805,8707 AAAGGTAAGCTGTACC-1,0,10,106,2685,8776 GTACGTCACGTATTAA-1,1,11,107,2805,8845 AGTACCTTCGAGTGCT-1,0,10,108,2685,8913 ATTGTGACTTCGCTGC-1,1,11,109,2805,8982 TGTATCAGACTGAAGC-1,1,10,110,2685,9051 GAGACCCTGCAACGCC-1,1,11,111,2805,9120 TGGGTGGGATGTCATT-1,1,10,112,2685,9189 GGCTAATGATTGAAAT-1,1,11,113,2805,9258 ATAACGTTACCTCCAC-1,1,10,114,2685,9326 TGCGAGATGGCGGCCA-1,1,11,115,2805,9395 CACACTTGTATTGCGA-1,0,10,116,2685,9464 GCTGGTGACTCGTAGT-1,1,11,117,2805,9533 CGACACCGCTTAAGGA-1,0,10,118,2685,9602 GTAACAACTGACCTTG-1,0,11,119,2805,9670 CAACTGAGGGTATGAC-1,0,10,120,2685,9739 CTAATTATGAAGCGTA-1,0,11,121,2805,9808 CCGATCTTAAGAGGCT-1,0,10,122,2685,9877 CGACTCGGTACACGGT-1,0,11,123,2805,9946 TGCTGCGTCAGAGTTA-1,0,10,124,2685,10015 AGAGTTGCAGGCCTCC-1,0,11,125,2805,10083 ACTGGCGAACCTGCGT-1,0,10,126,2685,10152 ACTAAGGACGCACACC-1,0,11,127,2804,10221 CGTCCAGATGGCTCCA-1,0,12,0,2925,1480 ACTATCGCCGGCTAAA-1,0,13,1,3044,1549 GATAGCGTACCACGCG-1,0,12,2,2925,1617 AGGACTTATAGGAGAA-1,0,13,3,3044,1686 TAGTCGGGATTCTTCG-1,0,12,4,2925,1755 ACCATTAAGGGTGTCA-1,0,13,5,3044,1824 TTAATGTGTTTGCAGG-1,0,12,6,2925,1893 TCCGCAGCCACCTAGC-1,0,13,7,3044,1962 GAGGAGATCCTCATGC-1,0,12,8,2925,2030 GGTCCTTCATACGACT-1,0,13,9,3044,2099 CCCTGTTGGCAAAGAC-1,0,12,10,2925,2168 GTGCCTAGCTATGCTT-1,0,13,11,3044,2237 GTCATCTCCTACAGCT-1,0,12,12,2925,2306 GCGAGAAACGGGAGTT-1,0,13,13,3044,2375 CGTCGCGGCGGGATTT-1,0,12,14,2925,2443 CATTGTGTGCTAGATC-1,0,13,15,3044,2512 CGCGGCAGTATTACGG-1,0,12,16,2925,2581 GAAATGGGATGTAAAC-1,0,13,17,3044,2650 CATTCCCTAAGTACAA-1,0,12,18,2925,2719 AGTTCTGCGTTGTATC-1,0,13,19,3044,2788 ACCCTATAGGACTGAG-1,0,12,20,2925,2856 TTAGATAGGTCGATAC-1,0,13,21,3044,2925 ATTGATAGCAACGAGA-1,0,12,22,2925,2994 TCTCGGCTCCAGGACT-1,0,13,23,3044,3063 CTTGAGGTTATCCCGA-1,0,12,24,2925,3132 AAGAAGGATCAGTTAG-1,0,13,25,3044,3201 GTACGACGGCGCTGCG-1,0,12,26,2925,3269 CTTATGTTGACTACCA-1,0,13,27,3044,3338 CGGCACTCAAGAAAGT-1,0,12,28,2925,3407 GTCAAAGTTTACATAG-1,0,13,29,3044,3476 CTCCTAAGTTATGTCT-1,0,12,30,2925,3545 ACTGTGCTAGTAGATC-1,0,13,31,3044,3614 GTTTGGCCGCTCAGCG-1,0,12,32,2925,3682 TTATCCAATCGAACTC-1,0,13,33,3044,3751 CCGTACCCAAGCGCCA-1,0,12,34,2924,3820 CATACAAAGCCGAACC-1,0,13,35,3044,3889 GGTCGGTAATTAGACA-1,0,12,36,2924,3958 AGCGGGAAGGGTCCAT-1,0,13,37,3044,4027 GCCCACCAAGGCTGTC-1,0,12,38,2924,4095 GTAGACGTCGTTACAT-1,0,13,39,3044,4164 GAGCATCATCCCTGGG-1,0,12,40,2924,4233 AGGTAACCTCCTATTC-1,0,13,41,3044,4302 GGTTTGAGTGCTGGAA-1,0,12,42,2924,4371 GCACTAGTCGCGCTAT-1,0,13,43,3044,4439 GGTAACTATGTATCTG-1,0,12,44,2924,4508 GCGGTCCCTAGACGCA-1,0,13,45,3044,4577 CGAGCGTTGATCAGCC-1,0,12,46,2924,4646 AATCCAAGGGCCTGAG-1,0,13,47,3044,4715 CCGTGCCCATGACGGC-1,0,12,48,2924,4784 GAAATTCACATCGCTG-1,0,13,49,3044,4852 CTCTGCGAAGCAAGCA-1,0,12,50,2924,4921 AGTAGGTAACATACAT-1,0,13,51,3044,4990 ATTGGGAATATCTTGG-1,0,12,52,2924,5059 TAGAGCTACGAAGAAC-1,0,13,53,3044,5128 TGCGGCATAGTTCAAC-1,0,12,54,2924,5197 CCGCCGGTCAACACAC-1,0,13,55,3044,5265 TCGTATAGTGCAATTA-1,0,12,56,2924,5334 TAGTTTATTCTTGCTT-1,0,13,57,3044,5403 GATATCTCATGCAATA-1,0,12,58,2924,5472 CGTTTAAGCGGAGCAC-1,0,13,59,3044,5541 CATGCTGGCTCCAATT-1,0,12,60,2924,5610 GAAACAGCCATGCAGT-1,0,13,61,3044,5678 AGTTTCGCAGGTCGGA-1,0,12,62,2924,5747 CTCATGGCTCACAATC-1,0,13,63,3044,5816 AACCGTTGTGTTTGCT-1,0,12,64,2924,5885 ACCCTTCATCTGCGAA-1,0,13,65,3044,5954 TGCGGTGAAATTTCAT-1,0,12,66,2924,6023 CAAATTGTCAGCAAGC-1,0,13,67,3044,6091 GAGGTACATCCATCTT-1,0,12,68,2924,6160 AAATGGCATGTCTTGT-1,0,13,69,3044,6229 TCATCCCAGAGGGTGG-1,0,12,70,2924,6298 CGTAGCGAATTGTCAG-1,0,13,71,3044,6367 CCTAGTTAGTCGCATG-1,0,12,72,2924,6436 GAAACTCTAATGAAGG-1,0,13,73,3044,6504 TTGTATCACACAGAAT-1,0,12,74,2924,6573 TTCAAGCCGAGCTGAG-1,0,13,75,3044,6642 AGGTACGATATTGCCA-1,0,12,76,2924,6711 TTAAGCCGACAACTTC-1,0,13,77,3044,6780 GTCTTAGTACAGCCGG-1,0,12,78,2924,6848 TGGGTAAGGTTCCCGC-1,0,13,79,3044,6917 CTACGCCATTTCCGAT-1,0,12,80,2924,6986 GACCGTCAGGTCGTGA-1,0,13,81,3044,7055 TAGTTAAGATAGGATA-1,0,12,82,2924,7124 GAATATTCGGAGTCCC-1,0,13,83,3044,7193 CAAACTACGATAGAGA-1,0,12,84,2924,7261 CAGGAAGACTTTATAT-1,0,13,85,3044,7330 TTCGTAATCCCAGCGG-1,0,12,86,2924,7399 GTGAGGAGCGGTTGAG-1,1,13,87,3044,7468 CAATCCCTATACCAGC-1,1,12,88,2924,7537 AGGGAAACGAGGTACT-1,1,13,89,3044,7606 TCCTGCCAACTGGAGA-1,1,12,90,2924,7674 AATTTGGGACATAGTA-1,1,13,91,3044,7743 AACTCCTAATCCCATG-1,1,12,92,2924,7812 GCTCATTACTGCATGT-1,1,13,93,3044,7881 TCTCGAACGAGGTCAC-1,1,12,94,2924,7950 TCACTACGACCAATGC-1,1,13,95,3044,8019 GTGATGCACAACATCT-1,1,12,96,2924,8087 CCGACGTAAACACAAC-1,1,13,97,3044,8156 TGGGATGCACTCATTC-1,1,12,98,2924,8225 TTCCATCATGCGGTGA-1,1,13,99,3044,8294 TGCACAGTGAAGTTAT-1,1,12,100,2924,8363 CTATTGTGTTTGGTCA-1,1,13,101,3044,8432 TGCGAGCCCTTCCGCG-1,1,12,102,2924,8500 TTGAAAGGTGTAAAGG-1,1,13,103,3044,8569 GGTGCAGAGCCTATCG-1,1,12,104,2924,8638 ACTATATGCTGTGTTC-1,1,13,105,3044,8707 TCCTGGCGCTGCCTGG-1,1,12,106,2924,8776 GAGCCGAGCGTTTATT-1,1,13,107,3044,8845 AGAATGCGGGTTCGGA-1,1,12,108,2924,8913 ATGCGACAATTGGTCC-1,1,13,109,3044,8982 TTCCGGCTCGACTTCT-1,1,12,110,2924,9051 TGATTATGGCACGCAG-1,1,13,111,3044,9120 GGTTTGACAAGAAGCT-1,1,12,112,2924,9189 GCAGCTATGGACAGGT-1,1,13,113,3044,9258 CACCATGATCGCAAAG-1,1,12,114,2924,9326 GTCGGAAGGATACCAG-1,1,13,115,3044,9395 GGCCCAGTTATCAGCA-1,0,12,116,2924,9464 GGGCCTATTTAAGTAT-1,0,13,117,3044,9533 GTTGTTACATTGCGCT-1,0,12,118,2924,9602 CAACTCCGTAACTTGC-1,0,13,119,3044,9670 GATCTTTGCTCAAAGA-1,0,12,120,2924,9739 TCGCTTAATTACGAAG-1,0,13,121,3044,9808 CGATCATTAGAGGCAC-1,0,12,122,2924,9877 TGTTCTCTACTCCCTA-1,0,13,123,3044,9946 GCTTAGGGAAGCGGTA-1,0,12,124,2924,10015 CAGGTTTAGTACTACA-1,0,13,125,3044,10083 AAGCGGAGTGCGCGCA-1,0,12,126,2924,10152 TCAGATGGAGACGTAG-1,0,13,127,3044,10221 TCGCACTAACGTTTGT-1,0,14,0,3164,1480 CACGTCGGGTTCTAGA-1,0,15,1,3284,1549 GGAGTACACATGAGCT-1,0,14,2,3164,1617 GTGTGTCGACGTCGCT-1,0,15,3,3284,1686 GAAGCTCTTTGCTTAG-1,0,14,4,3164,1755 ACACCGAGCGCTCTTT-1,0,15,5,3284,1824 CGTAATAATTACGAGT-1,0,14,6,3164,1893 CATCAACACCTACTAA-1,0,15,7,3284,1962 CCAAGTTTCTACAGAT-1,0,14,8,3164,2030 ACGGGTCATGTGACTT-1,0,15,9,3284,2099 AGTGTGCTAAGATCGC-1,0,14,10,3164,2168 GGCGGTTTGCCGGTGC-1,0,15,11,3284,2237 GTATAATCTCCCGGAT-1,0,14,12,3164,2306 TAGTCCGTATGCATAA-1,0,15,13,3284,2375 CACTTCGTCTTATCTC-1,0,14,14,3164,2443 CATCCGCAGGCCCGAA-1,0,15,15,3284,2512 CCCTGATGTAACTCGT-1,0,14,16,3164,2581 CCATAGTCAGTAACCC-1,0,15,17,3284,2650 CGGGCCATAGCCGCAC-1,0,14,18,3164,2719 CTCCGGCTTGTAGACA-1,0,15,19,3284,2788 AACTTGCGTTCTCGCG-1,0,14,20,3164,2856 AATGAGTTCGCATATG-1,0,15,21,3284,2925 CGAGGCCAGGCATTGG-1,0,14,22,3164,2994 TCTGCGTCCGGTTTCT-1,0,15,23,3284,3063 CAATCCTGCCGTGGAG-1,0,14,24,3164,3132 CTGAGCAAGTAACAAG-1,0,15,25,3284,3201 GGGTACCCACGGTCCT-1,0,14,26,3164,3269 ACGGAATTTAGCAAAT-1,0,15,27,3284,3338 GGGCGGTCCTATTGTC-1,0,14,28,3164,3407 ATGTTACGAGCAATAC-1,0,15,29,3284,3476 AACCATGGGATCGCTA-1,0,14,30,3164,3545 TCGCATCCCTAAGTGT-1,0,15,31,3284,3614 ACTTAGTACGACAAGA-1,0,14,32,3164,3682 GAGCTCTCGGACCTAA-1,0,15,33,3284,3751 TCTATTACGCTGGCGA-1,0,14,34,3164,3820 AGATACGACTTCATAT-1,0,15,35,3284,3889 CGCTATACCGCCCACT-1,0,14,36,3164,3958 CAGTGTCCGCAGAATG-1,0,15,37,3284,4027 CCATCCATACCAAGTC-1,0,14,38,3164,4095 AACCCAGAGACGGAGA-1,0,15,39,3284,4164 GAAGAACGGTGCAGGT-1,0,14,40,3164,4233 GATAAATCGGTGGATG-1,0,15,41,3284,4302 CAGCTCGTGCTTGTGT-1,0,14,42,3164,4371 GAGTACGGGTATACAA-1,0,15,43,3284,4439 CATCGCCCGCGGCCAA-1,0,14,44,3164,4508 TCTTACAGAGGTACCG-1,0,15,45,3284,4577 TGGAAGACGAACACCA-1,0,14,46,3164,4646 GTTGTCGTGTTAGTTG-1,0,15,47,3284,4715 CCAAGGAACAGAGAGG-1,0,14,48,3164,4784 CTGCACCTGGAACCGC-1,0,15,49,3284,4852 CGCTTTCATACCGGTG-1,0,14,50,3164,4921 GTTCTTCCCTCGATGT-1,0,15,51,3284,4990 ATTTAACTCGTATTAC-1,0,14,52,3164,5059 AACGATAGAAGGGCCG-1,0,15,53,3284,5128 TATCCTGCATGGGAAT-1,0,14,54,3164,5197 AGGCCCATTGTACAGG-1,0,15,55,3284,5265 CCGGCGCATATTGGAT-1,0,14,56,3164,5334 ATCTGTAATTGTACCC-1,0,15,57,3284,5403 GAGCGAGGGAGTACCG-1,0,14,58,3164,5472 TTATTAGGGAAGCATC-1,0,15,59,3284,5541 CTTCTTACGTCGTATA-1,0,14,60,3164,5610 GAAGTGCTGGATAGCT-1,0,15,61,3284,5678 GTGCAACAAATGTGGC-1,0,14,62,3164,5747 CATGCGTTAGACAGAA-1,0,15,63,3284,5816 ACACACTTTCTACACG-1,0,14,64,3164,5885 AGCCCTAAGCGAAGTT-1,0,15,65,3284,5954 ATTAATTCGGTCACTC-1,0,14,66,3164,6023 AACAGGAAATCGAATA-1,0,15,67,3284,6091 ACGTTTAGTTGTGATC-1,0,14,68,3164,6160 TCCTTCAGTGGTCGAA-1,0,15,69,3284,6229 CGAACGCCCAGTGCCG-1,0,14,70,3164,6298 CCTCGAAGTGGACGGG-1,0,15,71,3284,6367 CTCTGTTTGAGGATTC-1,0,14,72,3164,6436 TGGGCACGTTCTATGG-1,0,15,73,3284,6504 ACTATTCGTCCGTGGT-1,0,14,74,3164,6573 CCTCTGGCCTAGACGG-1,1,15,75,3284,6642 CCATAAACAACCCGAC-1,0,14,76,3164,6711 CATAGTACATTGAGAG-1,1,15,77,3284,6780 ATTTCATTATTTCGCG-1,0,14,78,3164,6848 CAACTATATCGAATGC-1,1,15,79,3284,6917 CTAGTATTCGGAATTA-1,0,14,80,3164,6986 GTGGAACCTACATGCG-1,1,15,81,3284,7055 CCTAAAGGCTGACGCT-1,1,14,82,3164,7124 CGTGACATTGGGTCGT-1,1,15,83,3284,7193 CCAATCGGTAGATCGA-1,1,14,84,3164,7261 ATTGTCGCAATACCTT-1,1,15,85,3284,7330 AAATTACACGACTCTG-1,1,14,86,3164,7399 CACTCCTCTCGGTCGG-1,1,15,87,3284,7468 AAATAACCATACGGGA-1,1,14,88,3164,7537 AGTTACTCTATCGTGG-1,1,15,89,3284,7606 CGTTAGCTCACAACTG-1,1,14,90,3164,7674 GAATGTATGGCAGGTC-1,1,15,91,3284,7743 GCAACCACCAGACCGG-1,1,14,92,3164,7812 TCACTCGTGCAACGGC-1,1,15,93,3284,7881 AAACAGAGCGACTCCT-1,1,14,94,3164,7950 CAGCCTCTCCTCAAGA-1,1,15,95,3284,8019 TTGCGTGAACGCTTAG-1,1,14,96,3164,8087 CCGCCTGCGAATTGGT-1,1,15,97,3284,8156 AGATGAGGGTTGCGAT-1,1,14,98,3164,8225 CGGTGGGCTCCAGCCT-1,1,15,99,3284,8294 GGCAGCGGTAATCCTA-1,1,14,100,3164,8363 GCTAGCAGGGAGTGGG-1,1,15,101,3284,8432 CTCAAGACATTAGCGC-1,1,14,102,3164,8500 CACGGCGCGCCAAAGG-1,1,15,103,3284,8569 TGCAATTTGGGCACGG-1,1,14,104,3164,8638 ATGCCAATCGCTCTGC-1,1,15,105,3284,8707 GCTGGACCCAAAGTGG-1,1,14,106,3164,8776 ATTCCTAAGACGTGGA-1,1,15,107,3284,8845 TCCGGAGGAAGGGCTG-1,1,14,108,3164,8913 TCGGTGACCGCTCCGG-1,1,15,109,3284,8982 TCCGAAGTAGTCACCA-1,1,14,110,3164,9051 CATGTAGGAGCGCCAA-1,1,15,111,3284,9120 CACAAGAAAGATATTA-1,1,14,112,3164,9189 AGGGTCAGTAACCCTA-1,1,15,113,3284,9258 TAAGCCCTTACGACCA-1,1,14,114,3164,9326 ATACCGTCATCCATAA-1,1,15,115,3284,9395 GGACGTCCATAGTTGG-1,1,14,116,3164,9464 CATCAAACTGGCGCCC-1,0,15,117,3284,9533 AAACGTGTTCGCCCTA-1,0,14,118,3164,9602 AAATTGGTGAGAAGCA-1,0,15,119,3284,9670 GGTCATTGTAGTCATA-1,0,14,120,3164,9739 TGCAGTGAGGCTCGGG-1,0,15,121,3284,9808 GAACATTAGTATGTTA-1,0,14,122,3164,9877 GGTTTGCGAACACGTA-1,0,15,123,3284,9946 ACACAAATATTCCTAG-1,0,14,124,3164,10015 TTGGGTTTATTCAGCG-1,0,15,125,3284,10083 ATTCGCAGAGGACACT-1,0,14,126,3164,10152 GATTTAGTGCGTACTG-1,0,15,127,3284,10221 TAGAAACACAATAGTG-1,0,16,0,3404,1480 CAGTAGATGATGTCCG-1,0,17,1,3523,1549 TCTTAACTCGGATGTA-1,0,16,2,3404,1617 TACATCTTGTTTCTTG-1,0,17,3,3523,1686 TTCATAGGGTGTCCAT-1,0,16,4,3404,1755 TGAAGTAGCTTACGGA-1,0,17,5,3523,1824 GCACAAGTGGATCATA-1,0,16,6,3404,1893 GGGCGAATTTCTCCAC-1,0,17,7,3523,1962 ATGTTCCTGCCCACCT-1,0,16,8,3404,2030 GCTCAACCTCTTAGAG-1,0,17,9,3523,2099 ATAGCTGCTCTTGTTA-1,0,16,10,3404,2168 CGTCAGCTATTTACTC-1,0,17,11,3523,2237 ATCTGATAGTGTCTTA-1,0,16,12,3404,2306 TGCACTATGTGAGTGC-1,0,17,13,3523,2375 CCGACAAACACATGAG-1,0,16,14,3404,2443 GCCTTGTATATGCAGT-1,0,17,15,3523,2512 ATAATACCGTTAGCCG-1,0,16,16,3404,2581 ACACTCCAATGTCACT-1,0,17,17,3523,2650 AGTTGCTGACTGATAT-1,0,16,18,3404,2719 GGCGCTCCTCATCAAT-1,0,17,19,3523,2788 TGCCTGACATCGGTCA-1,0,16,20,3404,2856 TTGGCCATCTTGCGCT-1,0,17,21,3523,2925 CAGTGGTTGCACATGA-1,0,16,22,3404,2994 AGAATTGTTTGACATA-1,0,17,23,3523,3063 AAATGCTCGTTACGTT-1,0,16,24,3404,3132 CACCTAATAGAGTCGT-1,0,17,25,3523,3201 CATTTCTAGCAGACTA-1,0,16,26,3404,3269 CCGAAAGTGGTGAGCA-1,0,17,27,3523,3338 AGTCAGCCACCGCCTG-1,0,16,28,3404,3407 TCATCACTCGAGCTCG-1,0,17,29,3523,3476 CTCAGGACTCACCTGT-1,0,16,30,3404,3545 CGGTGTACTTGATCCC-1,0,17,31,3523,3614 CCTACGGCTCAGTCGA-1,0,16,32,3404,3682 GTACTTGGGCACTTCT-1,0,17,33,3523,3751 TGATTTCCTCCTGACG-1,0,16,34,3404,3820 CCTCACCAATCTTGAC-1,0,17,35,3523,3889 GGTGAGATGCAGATAA-1,0,16,36,3404,3958 GCTAGTTTCATTGAGG-1,0,17,37,3523,4027 AGGACATCGCACGTCG-1,0,16,38,3404,4095 GTGGACGTGCTGAGAC-1,0,17,39,3523,4164 TAAGGAACTTGTGGGA-1,0,16,40,3404,4233 TCGCTGTGCGTAAATC-1,0,17,41,3523,4302 GCATCCCTAACTTTGA-1,0,16,42,3404,4371 CACCCACACGTCACCC-1,0,17,43,3523,4439 CCCTCATTCTGGAATT-1,0,16,44,3404,4508 AGGGCGTGATCGGCTA-1,0,17,45,3523,4577 GGTGCGGATAAGTGGC-1,0,16,46,3404,4646 TAATATTGAAATTCGC-1,0,17,47,3523,4715 CTTACACTGGGAAATA-1,0,16,48,3404,4784 ACCAAGAACGCGTGTC-1,0,17,49,3523,4852 GCCTTCAGCCCTACCG-1,0,16,50,3404,4921 GATGCTACAAGCGCCT-1,0,17,51,3523,4990 CCGGGACCCGCAGAGA-1,0,16,52,3404,5059 GTTCCAGTCTGACCAT-1,0,17,53,3523,5128 ATGATCGGGAATAGAC-1,0,16,54,3403,5197 TTGGATTGGGTACCAC-1,0,17,55,3523,5265 TACCTCACGCTTGTAC-1,0,16,56,3403,5334 CATGGCAGGAAGATCG-1,0,17,57,3523,5403 ATGACGCCGGCTCTAA-1,0,16,58,3403,5472 AGCGACATCCCATTCA-1,0,17,59,3523,5541 AGTAATGTCTTGCCGC-1,0,16,60,3403,5610 TTCTTAGTGGCTCAGA-1,0,17,61,3523,5678 CGTCTGGAAGGGCCCG-1,0,16,62,3403,5747 ACGTGCGCCTCGTGCA-1,1,17,63,3523,5816 AGAGCGGGCTAATCAT-1,0,16,64,3403,5885 GCGTCGAAATGTCGGT-1,1,17,65,3523,5954 AACTGATATTAGGCCT-1,0,16,66,3403,6023 CGAGCTGGGCTTTAGG-1,1,17,67,3523,6091 GGGTGTTTCAGCTATG-1,0,16,68,3403,6160 TTAATTTCAGACGCGG-1,1,17,69,3523,6229 ACTGCCGTCGTAACTC-1,1,16,70,3403,6298 GTGCACGAAAGTGACT-1,1,17,71,3523,6367 ATCTCCCTGCAATCTA-1,1,16,72,3403,6436 ACGCCAGATGATTTCT-1,1,17,73,3523,6504 AGCTATTTAATCCAAC-1,1,16,74,3403,6573 CCACGAGAAGAGAATC-1,1,17,75,3523,6642 GATTCCGCGTTTCCGT-1,1,16,76,3403,6711 GTCGGATGTAGCGCGC-1,1,17,77,3523,6780 TATTTATACCGAGTAG-1,1,16,78,3403,6849 GTAGGTGATCCGTGTA-1,1,17,79,3523,6917 AGTTAAGCGGTCCCGG-1,1,16,80,3403,6986 CTGGCGACATAAGTCC-1,1,17,81,3523,7055 TTGGCCTAGAATTTCG-1,1,16,82,3403,7124 GGCATATCGGTTCTGC-1,1,17,83,3523,7193 GGGCGTCCACTGGCTC-1,1,16,84,3403,7261 TTACCCATTGCCGGGT-1,1,17,85,3523,7330 TTAGACACGATCGTTG-1,1,16,86,3403,7399 GCGCTGATCCAGACTC-1,1,17,87,3523,7468 TTCGGCAACCCGCTGA-1,1,16,88,3403,7537 GATATTTCCTACATGG-1,1,17,89,3523,7606 CTGCGTTACGATATAA-1,1,16,90,3403,7674 TAATAAACAAGGAGAT-1,1,17,91,3523,7743 AACCTTTACGACGTCT-1,1,16,92,3403,7812 AGTCCCGCCTTTAATT-1,1,17,93,3523,7881 TGAGATTAGGCCCTAA-1,1,16,94,3403,7950 AGTGTATTGCGCATTG-1,1,17,95,3523,8019 GTTGGATTCAGTGGCT-1,1,16,96,3403,8087 TAAAGCTGCAATAGGG-1,1,17,97,3523,8156 AGTAGGAAGGAAGTTG-1,1,16,98,3403,8225 TATCACTTCGAGTAAC-1,1,17,99,3523,8294 TGATCTACGCTGATCT-1,1,16,100,3403,8363 GGATCATCCCGTACGC-1,1,17,101,3523,8432 TGACACTTCTCTTTGC-1,1,16,102,3403,8500 AGCCCTTCTAATCCGA-1,1,17,103,3523,8569 CACCGCGTCCACTCTA-1,1,16,104,3403,8638 TAATTGGAATCGGGAA-1,1,17,105,3523,8707 TCGTAAGCTCCGAGGA-1,1,16,106,3403,8776 TATATTACAAATGTCG-1,1,17,107,3523,8845 CGCGAGAGGGACTTGT-1,1,16,108,3403,8913 GGACCTACGGTAACGT-1,1,17,109,3523,8982 GAAATATGCTTGAATG-1,1,16,110,3403,9051 CCGTATTAGCGCAGTT-1,1,17,111,3523,9120 AGGCGTCTATGGACGG-1,1,16,112,3403,9189 AACATCGATACGTCTA-1,1,17,113,3523,9258 TGAATATGCTATAAAC-1,1,16,114,3403,9326 ACCAAACACCCAGCGA-1,1,17,115,3523,9395 TGGCTTGTACAAGCTT-1,1,16,116,3403,9464 GAATGAAGGTCTTCAG-1,0,17,117,3523,9533 AGATACCAGCACTTCA-1,0,16,118,3403,9602 GCGGTCCCGGTGAAGG-1,0,17,119,3523,9671 GAGGCATTTGCAGCAG-1,0,16,120,3403,9739 GGCAAGCCAGGGATAG-1,0,17,121,3523,9808 TCTACGGGCTCAGTTG-1,0,16,122,3403,9877 TCTGCGAATCGTTCGC-1,0,17,123,3523,9946 AGCTCGTTGATGGAAA-1,0,16,124,3403,10015 TGAATGAGATACAGCA-1,0,17,125,3523,10083 ACCCTTGCCTGGGTCG-1,0,16,126,3403,10152 GGCGAACCGTTCTGAT-1,0,17,127,3523,10221 GCGATGTCTGTGCTTG-1,0,18,0,3643,1480 ATTAACACCTGAGATA-1,0,19,1,3763,1549 GAAATCTGACCAAGTT-1,0,18,2,3643,1618 CCTGACAAACTCGCGC-1,0,19,3,3763,1686 ATGTCATTTCCCATTG-1,0,18,4,3643,1755 GCGGTGCGGAGCATCG-1,0,19,5,3763,1824 CGGAAAGCAAATGTGC-1,0,18,6,3643,1893 GCTGAGCAACGGTTCT-1,0,19,7,3763,1962 TCACTCTTCGTCTGTC-1,0,18,8,3643,2030 GATCTTCATTGTCCTC-1,0,19,9,3763,2099 ACTCGATGTATTTCAT-1,0,18,10,3643,2168 TGAAGAGCGGTCCTAG-1,0,19,11,3763,2237 TAAACGTCGTCAATGA-1,0,18,12,3643,2306 ACGTTATTGGTCACTC-1,0,19,13,3763,2375 ATAGCCTCAGTACCCA-1,0,18,14,3643,2443 CGGGAGTATACCGCCG-1,0,19,15,3763,2512 GTCCTACAGGCGGCTC-1,0,18,16,3643,2581 CGGATAAGCGGACATG-1,0,19,17,3763,2650 AACTTCTGCGTCTATC-1,0,18,18,3643,2719 GGGTTCAGACGAACAA-1,0,19,19,3763,2788 AGTCTGGACATCCTTG-1,0,18,20,3643,2856 TTGAACGAATCCTTTG-1,0,19,21,3763,2925 GAAATACTAAACGTTT-1,0,18,22,3643,2994 CCCGCGCAATGCACCC-1,0,19,23,3763,3063 TTCGGCTAGAGATGGT-1,0,18,24,3643,3132 GACACGAGTTAGAGGA-1,0,19,25,3763,3201 GAGGTCCCAAAGATCT-1,0,18,26,3643,3269 TAACTCCATGGAGGCT-1,0,19,27,3763,3338 CTTGTTTATGTAGCCA-1,0,18,28,3643,3407 GATGGCGCACACATTA-1,0,19,29,3763,3476 ATAATAGTGTAGGGAC-1,0,18,30,3643,3545 CGCTATTCAATGTATG-1,0,19,31,3763,3614 ATATTGCTGTCAAAGT-1,0,18,32,3643,3682 GGATTCAGTACGGTGG-1,0,19,33,3763,3751 TTCTTAGTGAACGGTG-1,0,18,34,3643,3820 AATGGTTCTCACAAGC-1,0,19,35,3763,3889 TATACACGCAAAGTAT-1,0,18,36,3643,3958 CTTCATAGCTCAAGAA-1,0,19,37,3763,4027 CAACGGTTCTTGATAC-1,0,18,38,3643,4095 ACACCCGAGAAATCCG-1,0,19,39,3763,4164 TCTATCATGCAGTTAC-1,0,18,40,3643,4233 CCCGCCATGCTCCCGT-1,0,19,41,3763,4302 CGCTTCCACTGAAATC-1,0,18,42,3643,4371 CACTGTCCAAGTGAGA-1,0,19,43,3763,4440 ATTACTAGCCTCTTGC-1,0,18,44,3643,4508 CATAGTAGCATAGTAG-1,0,19,45,3763,4577 CAACTCCTTGATCCCG-1,0,18,46,3643,4646 AAGTAGAAGACCGGGT-1,0,19,47,3763,4715 GCGGGAACCAGGCCCT-1,0,18,48,3643,4784 ATTAGATTGATAGCGG-1,0,19,49,3763,4852 CTCGGTCCGTAGCCTG-1,0,18,50,3643,4921 TGGCTTTGGGTAGACA-1,0,19,51,3763,4990 TATCCATATCATGCGA-1,0,18,52,3643,5059 GGAGTGCCGCCCTGGA-1,0,19,53,3763,5128 TGAGAATGCTTTACCG-1,0,18,54,3643,5197 TTAACCAACCCTCCCT-1,1,19,55,3763,5265 TGTTTCGGTACTTCTC-1,0,18,56,3643,5334 TTGCTGAAGGAACCAC-1,1,19,57,3763,5403 TATTTAGTCTAGATCG-1,1,18,58,3643,5472 CTCCGGCCTAATATGC-1,1,19,59,3763,5541 TTGTGGCCCTGACAGT-1,1,18,60,3643,5610 TCGCCGGTCGATCCGT-1,1,19,61,3763,5678 CCATAGGTTGGCGTGG-1,1,18,62,3643,5747 GAACGACCGAATGATA-1,1,19,63,3763,5816 TCCGATAATTGCCATA-1,1,18,64,3643,5885 CATTACGTCGGCCCGT-1,1,19,65,3763,5954 CAAGCACCAAATGCCT-1,1,18,66,3643,6023 TGCATGGATCGGATCT-1,1,19,67,3763,6091 GAAATCGCGCGCAACT-1,1,18,68,3643,6160 CTGAAAGAGATCCGAC-1,1,19,69,3763,6229 CACCTCGATGGTGGAC-1,1,18,70,3643,6298 ATTTGTTCCAGGGCTC-1,1,19,71,3763,6367 TGGGCCACAAGAGCGC-1,1,18,72,3643,6436 CCTTCTTGATCCAGTG-1,1,19,73,3763,6504 CCTCGCCAGCAAATTA-1,1,18,74,3643,6573 TTCATGGCGCAACAGG-1,1,19,75,3763,6642 TTAATCAGTACGTCAG-1,1,18,76,3643,6711 CCTATCTATATCGGAA-1,1,19,77,3763,6780 ATTATACTTTGCTCGT-1,1,18,78,3643,6849 ATGGATCCGGCGTCCG-1,1,19,79,3763,6917 CGCCCGCTTCCGTACA-1,1,18,80,3643,6986 GGATTCCGCTATACCC-1,1,19,81,3763,7055 CGGTCTATCAACCCGT-1,1,18,82,3643,7124 ATGCCGGTTGATGGGA-1,1,19,83,3763,7193 TCATGCAGGTTCTCAT-1,1,18,84,3643,7261 TGAGCTTTAATGACGC-1,1,19,85,3763,7330 TCCCTTAGATTACTCG-1,1,18,86,3643,7399 ATATCTCCCTCGTTAA-1,1,19,87,3763,7468 AGCTCTTCCCAGTGCA-1,1,18,88,3643,7537 TCGCTAAACCGCTATC-1,1,19,89,3763,7606 CACATTCTTTCGATGG-1,1,18,90,3643,7674 GATATGCGGTAGCCAA-1,1,19,91,3763,7743 CGTTTCACTTCGGGCG-1,1,18,92,3643,7812 CCAATTACGGGTCGAG-1,1,19,93,3763,7881 GCAGGTAGAGTATGGT-1,1,18,94,3643,7950 GTCGTATTGGCGTACA-1,1,19,95,3763,8019 GAAATTAGCACGGATA-1,1,18,96,3643,8087 AATGCACCAAGCAATG-1,1,19,97,3763,8156 AGGACGCTCGATGTTG-1,1,18,98,3643,8225 GGCTAAAGGGCGGGTC-1,1,19,99,3763,8294 CATCTATCCCGTGTCT-1,1,18,100,3643,8363 CAGTAACTATTTATTG-1,1,19,101,3763,8432 CATATACTACTGATAA-1,1,18,102,3643,8500 GCGTTCGGAGACCGGG-1,1,19,103,3763,8569 AAGTTCAGTCTGCGTA-1,1,18,104,3643,8638 CGAAGCTATAAATTCA-1,1,19,105,3763,8707 CGCGGTCACAAACCAA-1,1,18,106,3643,8776 GGGAATGAGCCCTCAC-1,1,19,107,3763,8845 ACGGAGCGCAAATTAC-1,1,18,108,3643,8913 CGTTCTTCGCACACCT-1,1,19,109,3763,8982 GAATAGCCCTGCGGTC-1,1,18,110,3643,9051 AATAGCTACCGCGTGC-1,1,19,111,3763,9120 CCGAGCTGTGCTTGTC-1,1,18,112,3643,9189 GATGACGATGATCGCG-1,1,19,113,3763,9258 GCCTATGCTGGGCCTT-1,0,18,114,3643,9326 TTACTGTCTAGAGCTC-1,1,19,115,3763,9395 AGCGGTTGCCGCTCTG-1,0,18,116,3643,9464 GCTTGCAGCACAATTG-1,0,19,117,3763,9533 CCGGAGGTCTTATGGT-1,0,18,118,3643,9602 ACAGTATACCGTGGGA-1,0,19,119,3763,9671 GGGATCCCAATACAAA-1,0,18,120,3643,9739 ATTACGACTCCACAGT-1,0,19,121,3763,9808 CTCACACGCAAGCCTA-1,0,18,122,3643,9877 CCAGATGTAAATGGGT-1,0,19,123,3763,9946 GAACTTGTGCACGGGA-1,0,18,124,3643,10015 AAGCCGCTTTACCTTG-1,0,19,125,3763,10083 TCCATTCCCACTAGAG-1,0,18,126,3643,10152 AGAGCGCTTGTAACGG-1,0,19,127,3763,10221 TGGGTTCCCGGACGGA-1,0,20,0,3883,1480 GCTGCGCCTCCCACGT-1,0,21,1,4002,1549 CTGTTGGCTCTTCTGA-1,0,20,2,3883,1618 TTGTTCTAGATACGCT-1,0,21,3,4002,1686 CCCTCAAGCTCTTAGT-1,0,20,4,3883,1755 TGGTCTAGCTTACATG-1,0,21,5,4002,1824 ATGCACCTTCCTTAAT-1,0,20,6,3883,1893 GGGATACGGTAATAAT-1,0,21,7,4002,1962 AGTTCACCGGTTGGAC-1,0,20,8,3883,2030 GACATACTGTCGCAGA-1,0,21,9,4002,2099 TGGACACCGTTGCTTG-1,0,20,10,3883,2168 TGCGATGCTAATGGCT-1,0,21,11,4002,2237 TTCTGTTTCCTGTCGC-1,0,20,12,3883,2306 CGTTGTAAACGTCAGG-1,0,21,13,4002,2375 GATCGGCGATAAGTCG-1,0,20,14,3883,2443 AGCCTTAAAGCGGAAG-1,0,21,15,4002,2512 TCCGTAACCACAATCC-1,0,20,16,3883,2581 GAATGCCGAAATGACC-1,0,21,17,4002,2650 TATACTCATGCGGCAA-1,0,20,18,3883,2719 TAGTGTCAGAAACGGC-1,0,21,19,4002,2788 CGTCATACCATATCCA-1,0,20,20,3883,2856 TAGTACCTTAGTGGTC-1,0,21,21,4002,2925 CTGGCGGGAATAAGTA-1,0,20,22,3883,2994 AGTGTGGTCTATTGTG-1,0,21,23,4002,3063 GCTATCGCGGCGCAAC-1,0,20,24,3883,3132 CAGTAATCCCTCCCAG-1,0,21,25,4002,3201 GTATTAAGGCGTCTAA-1,0,20,26,3883,3269 CTAATTTCAACAACAC-1,0,21,27,4002,3338 TTAGCAACATGGATGT-1,0,20,28,3883,3407 ATGCTCAGTGTTGCAT-1,0,21,29,4002,3476 GATGTTTGTGCGAGAT-1,0,20,30,3883,3545 CACTTCGCCACAGGCT-1,0,21,31,4002,3614 CTGTATGGTGTAGAAA-1,0,20,32,3883,3682 TACGTGCACTATGCTG-1,0,21,33,4002,3751 GTATCAGCTTGGGTTC-1,0,20,34,3883,3820 TAACAAAGGGAGAAGC-1,0,21,35,4002,3889 TTACATCGTGGCCTGG-1,0,20,36,3883,3958 TCTGAACCGGTCGGCT-1,0,21,37,4002,4027 GGCTCGTGCCACCAGC-1,0,20,38,3883,4095 TATAAGTGAGGATAGC-1,0,21,39,4002,4164 GCCCGCGCGTTTGACA-1,0,20,40,3883,4233 TGCTGGTTGGACAATT-1,0,21,41,4002,4302 GCCTAGCGATCTGACC-1,0,20,42,3883,4371 CCATGCTCTGCAGGAA-1,0,21,43,4002,4440 TATAAATCCACAAGCT-1,0,20,44,3883,4508 CGCTCGACATAATGAT-1,0,21,45,4002,4577 CCAATTGAATGTTAAT-1,0,20,46,3883,4646 GCTAATACCGAATGCC-1,1,21,47,4002,4715 TTCAACGACCCGACCG-1,0,20,48,3883,4784 TTCCTCGAGGGTGTCT-1,1,21,49,4002,4852 CAACGACCCGTTTACA-1,1,20,50,3883,4921 CTTGTACTTGTTGACT-1,1,21,51,4002,4990 TCTCTAATAGCTGGTA-1,1,20,52,3883,5059 ATTATGCCATAGGGAG-1,1,21,53,4002,5128 GACAACGCAGCTTACG-1,1,20,54,3883,5197 AGATGACTCGCCCACG-1,1,21,55,4002,5265 GTGCGGGTCTCCAAAT-1,1,20,56,3883,5334 GTACGAGATTGCGACA-1,1,21,57,4002,5403 GTATAGGACTCAGTAG-1,1,20,58,3883,5472 TTGCACGGAGCAGCAC-1,1,21,59,4002,5541 CACAGCTAGGGAGTGA-1,1,20,60,3883,5610 ATACTAGCATGACCCT-1,1,21,61,4002,5678 CCAAGACTTCTGCGAA-1,1,20,62,3883,5747 ACATAATAAGGCGGTG-1,1,21,63,4002,5816 TAATACACAGTAGTAT-1,1,20,64,3883,5885 TCTTGGTAACACCAAA-1,1,21,65,4002,5954 AACTGGGTCCCGACGT-1,1,20,66,3883,6023 ATCACTTCATCCTCGC-1,1,21,67,4002,6091 TGGAAGGATAAAGATG-1,1,20,68,3883,6160 CATGATGCACAATTCT-1,1,21,69,4002,6229 TGCCTGATCAAACGAT-1,1,20,70,3883,6298 ATAGGGATATCCTTGA-1,1,21,71,4002,6367 CACCTAATCAGTTTAC-1,1,20,72,3883,6436 TGTGACTACGCCAGTC-1,1,21,73,4002,6504 CCCGACCATAGTCCGC-1,1,20,74,3882,6573 CGCGCCCGACTTAATA-1,1,21,75,4002,6642 TGCCACCTGGCGAAAC-1,1,20,76,3882,6711 CTGCCAAGGTTGGAAG-1,1,21,77,4002,6780 TCTCCAACGTAGGTTA-1,1,20,78,3882,6849 TTCTTGGAGTAATGAG-1,1,21,79,4002,6917 GTCTCGATCTGCTTTC-1,1,20,80,3882,6986 TACTCTCCGAACAAAT-1,1,21,81,4002,7055 ATCACATTAGAATATC-1,1,20,82,3882,7124 TACGGGATGCTAGCAG-1,1,21,83,4002,7193 AGCTGAAGTAAACCAA-1,1,20,84,3882,7261 CATGGGTCGGGTGTGG-1,1,21,85,4002,7330 CACCCACGAGGCAATT-1,1,20,86,3882,7399 TGCCATTACTAAAGAA-1,1,21,87,4002,7468 CCGTTACGTTAGAACA-1,1,20,88,3882,7537 GCCAGGAGTAACCGAT-1,1,21,89,4002,7606 GGAAAGTGCCCATGCC-1,1,20,90,3882,7674 TCTTACCGGAACTCGT-1,1,21,91,4002,7743 TATGTCAAGACCGACT-1,1,20,92,3882,7812 CCTAACTAAGGCTCTA-1,1,21,93,4002,7881 GCGGTGAACTGCGCTC-1,1,20,94,3882,7950 CCTCGCGCGATATAGG-1,1,21,95,4002,8019 ATCGGCAAGCAGTCCA-1,1,20,96,3882,8087 AGATCGTGCATAAGAT-1,1,21,97,4002,8156 ATTCAGGACCTATTTC-1,1,20,98,3882,8225 AGCTAGAAGCAGAAGT-1,1,21,99,4002,8294 TTCGCTATCTGACGTG-1,1,20,100,3882,8363 TTCCGCAGAGAAATAT-1,1,21,101,4002,8432 CAGTACATTCTCTAAA-1,1,20,102,3882,8500 GTGAAGATTTCAAGTG-1,1,21,103,4002,8569 AACGCATGATCTGGGT-1,1,20,104,3882,8638 CCCAGAGGAGGGCGTA-1,1,21,105,4002,8707 GGAAACCTTGTTGAAT-1,1,20,106,3882,8776 GTGAAGCCGTATAGTC-1,1,21,107,4002,8845 GAGCTGTCGTCTCGGA-1,1,20,108,3882,8913 TGTCATTTGTTGGGAA-1,1,21,109,4002,8982 ACCAACACCACACACT-1,1,20,110,3882,9051 AAATGATTCGATCAGC-1,1,21,111,4002,9120 CTGCTTTATGTCCGCG-1,1,20,112,3882,9189 GCGAGAGGCCATGTAA-1,1,21,113,4002,9258 ATTGACCGGCGATGAC-1,1,20,114,3882,9326 ACCCTGGTAACGCCCT-1,1,21,115,4002,9395 GTTGGACCGCATCAGG-1,1,20,116,3882,9464 CGTTTACAAGGCAGCT-1,0,21,117,4002,9533 CGGTCCATGAGACTCC-1,0,20,118,3882,9602 GTTCGTCTGGGTCCCT-1,0,21,119,4002,9671 TGTACTACTCTCACGG-1,0,20,120,3882,9739 AGTGAAGATGGTGTCC-1,0,21,121,4002,9808 GAGGGCCATAATATTA-1,0,20,122,3882,9877 ACTCCCGTAGACTAGG-1,0,21,123,4002,9946 CGTCAAATGGTCGCAG-1,0,20,124,3882,10015 AAGTCTAGTAGCTGCC-1,0,21,125,4002,10083 AAGAAATCACCAGATT-1,0,20,126,3882,10152 GAGTGCACGGACAACA-1,0,21,127,4002,10221 GTTCAAATCAGATGTC-1,0,22,0,4122,1480 CATGGCTCCCTATGTC-1,0,23,1,4242,1549 GGCCACACGAAAGCCT-1,0,22,2,4122,1618 GAAGCCGGGTAAGCTC-1,0,23,3,4242,1686 TTGCGCTCTCTCGCTT-1,0,22,4,4122,1755 TACATGACCTTATCCG-1,0,23,5,4242,1824 GTCCTTCTACAACCCA-1,0,22,6,4122,1893 TATATGCTGGGTTGCC-1,0,23,7,4242,1962 GTTTATGGGATTTAGA-1,0,22,8,4122,2030 GGAACCCGAACAAGAA-1,0,23,9,4242,2099 AACGTTATCAGCACCT-1,0,22,10,4122,2168 CATCGTCCGGTTACTA-1,0,23,11,4242,2237 AGACAGCTCAGAATCC-1,0,22,12,4122,2306 GCAGATCCTCGCAAAT-1,0,23,13,4242,2375 GGGTCATGCGTACCAT-1,0,22,14,4122,2443 CTGGTCATTCCAATCC-1,0,23,15,4242,2512 TCAGGGCGCAAACTCG-1,0,22,16,4122,2581 GATGCCAGCAGAAGGC-1,0,23,17,4242,2650 GTTATTAACGTGGGAG-1,0,22,18,4122,2719 AATACAATGTTTCAGG-1,0,23,19,4242,2788 TTGCTGCACCTATCCA-1,0,22,20,4122,2856 CCAGAGACAAAGCCGG-1,0,23,21,4242,2925 CCGAAGTATATTGTTC-1,0,22,22,4122,2994 GCTAAACCTGAGGTGA-1,0,23,23,4242,3063 TCATACTTACAGATCC-1,0,22,24,4122,3132 CGAGCACTTCAAGTTT-1,0,23,25,4242,3201 TAGCAACCTGTCACAA-1,0,22,26,4122,3269 TGGGAAATGCCTTTCC-1,0,23,27,4242,3338 AGACCATGGGATACAA-1,0,22,28,4122,3407 TAAATGAATCCGTTTC-1,0,23,29,4242,3476 ACAACGGTCCCTGCGA-1,0,22,30,4122,3545 GTCACTCTCCAAATCT-1,0,23,31,4242,3614 TTCTACTTGCGAGGGC-1,0,22,32,4122,3682 CGCAATTACTTTCGGT-1,0,23,33,4242,3751 CTGTTCATCTCACGGG-1,0,22,34,4122,3820 TTCTTGTAACCTAATG-1,0,23,35,4242,3889 GCTTGATGATAATCAG-1,0,22,36,4122,3958 TTGGCTCGCATGAGAC-1,0,23,37,4242,4027 GCCCAGTTGGTATGCC-1,0,22,38,4122,4095 ATTCCTCCGCCAGTGC-1,0,23,39,4242,4164 TCGTCCGCTGGCGTCT-1,0,22,40,4122,4233 GGAGAAGTCATTGGCA-1,1,23,41,4242,4302 TTGTTAGCAAATTCGA-1,0,22,42,4122,4371 TCTAGCATCTTCGATG-1,1,23,43,4242,4440 TTCTAGGCCAATTGTG-1,1,22,44,4122,4508 TCACGGTCATCGCACA-1,1,23,45,4242,4577 ATGAAGCCAAGGAGCC-1,1,22,46,4122,4646 AATGACTGTCAGCCGG-1,1,23,47,4242,4715 CCAAACAGAACCCTCG-1,1,22,48,4122,4784 TATCGATGATTAAACG-1,1,23,49,4242,4852 GAACACACATCAACCA-1,1,22,50,4122,4921 CCCGTCAGCGTCTGAC-1,1,23,51,4242,4990 AGCATCGTCGATAATT-1,1,22,52,4122,5059 GACTAAGATCATGCAC-1,1,23,53,4242,5128 TAGGGTGTTTCAAGAG-1,1,22,54,4122,5197 TGGTTCGTAGCAAAGG-1,1,23,55,4242,5265 CTGTTCACTGCCTGTG-1,1,22,56,4122,5334 ATGTGCATCCGACGCA-1,1,23,57,4242,5403 TTGTCGTTCAGTTACC-1,1,22,58,4122,5472 CGGGATCAATGTAAGA-1,1,23,59,4242,5541 TTATCTGTATCATAAC-1,1,22,60,4122,5610 ATCGACTCTTTCCGTT-1,1,23,61,4242,5678 CTCATTTGATGGGCGG-1,1,22,62,4122,5747 GTAAGCGGGCAGTCAG-1,1,23,63,4242,5816 TCTATCGGTCGCAACA-1,1,22,64,4122,5885 AACGCGGTCTCCAGCC-1,1,23,65,4242,5954 ATTAATACTACGCGGG-1,1,22,66,4122,6023 CTTTAACTTTCAAAGG-1,1,23,67,4242,6091 CGTACCTGATAGGCCT-1,1,22,68,4122,6160 GAATGTTGGGTAATCT-1,1,23,69,4242,6229 TGCGGAGTAAAGGTGC-1,1,22,70,4122,6298 CCTGAATATTTACATA-1,1,23,71,4242,6367 TTGCTCCCATACCGGA-1,1,22,72,4122,6436 CCTCTAATCTGCCAAG-1,1,23,73,4242,6504 AGGTTGAGGCACGCTT-1,1,22,74,4122,6573 TCCCGTCAGTCCCGCA-1,1,23,75,4242,6642 TCCGATGACTGAGCTC-1,1,22,76,4122,6711 CAGCCTCCTGCAGAGG-1,1,23,77,4242,6780 CTTAGCCTTCCACATG-1,1,22,78,4122,6849 ATTAATGAACCAGTCG-1,1,23,79,4242,6917 ACGATACATAGAACTA-1,1,22,80,4122,6986 AGCCACTCCCGTGCTT-1,1,23,81,4242,7055 ATACGGGTTTCGATTG-1,1,22,82,4122,7124 CTGTCAAATGGCTCGG-1,1,23,83,4242,7193 GCTCGGAATTTAAAGC-1,1,22,84,4122,7262 TAGGCATGTTACGCCA-1,1,23,85,4242,7330 TGGCAACTCGCGCGCC-1,1,22,86,4122,7399 ATCAGTAGGCAGGGAT-1,1,23,87,4242,7468 TATCGATCTATGCATA-1,1,22,88,4122,7537 CGACTCAGGATGTTAT-1,1,23,89,4242,7606 GCCATATTGCACACAG-1,1,22,90,4122,7674 AATTCATAAGGGATCT-1,1,23,91,4242,7743 CGGTAGAGGTGCAGGT-1,1,22,92,4122,7812 AATGATGATACGCTAT-1,1,23,93,4242,7881 CTTGTGCTCACCGATT-1,1,22,94,4122,7950 TTCCAATCAGAGCTAG-1,1,23,95,4242,8019 CGATGGACCCTACGCC-1,1,22,96,4122,8087 GGTCGGATAAACGGCG-1,1,23,97,4242,8156 TTAGCTAATACGATCT-1,1,22,98,4122,8225 CTCGATATTTGCGAGC-1,1,23,99,4242,8294 ATTACTTACTGGGCAT-1,1,22,100,4122,8363 CTAGCCGATGTTATGA-1,1,23,101,4242,8432 TACTGCAATCAATTAC-1,1,22,102,4122,8500 TAGTCTGTGACGTTGC-1,1,23,103,4242,8569 CTCGTTTCTAATGTTT-1,1,22,104,4122,8638 TTCGTTCAACGAAGTT-1,1,23,105,4242,8707 CTGAATTTATTGCCAG-1,1,22,106,4122,8776 TGGAATATCCTTGACC-1,1,23,107,4242,8845 CAGATCATTTAAAGTC-1,1,22,108,4122,8913 CTCCTTTACGCAAGTC-1,1,23,109,4242,8982 TCCCAAACAGACAACG-1,1,22,110,4122,9051 ATCGCTGCGTGCAGCA-1,1,23,111,4242,9120 TTAGTTCAAGTGTTCG-1,1,22,112,4122,9189 AAACTCGTGATATAAG-1,1,23,113,4242,9258 TTAACGAACAAGCAGT-1,1,22,114,4122,9326 GTTATATCAGGAGCCA-1,1,23,115,4242,9395 CAAATTGGATTATGCC-1,0,22,116,4122,9464 CGAGGAGCTTCCATAT-1,0,23,117,4242,9533 GGAGACCAATGTGCTT-1,0,22,118,4122,9602 CATTGATGAACACGCC-1,0,23,119,4242,9671 GTCAATGCTATAATTT-1,0,22,120,4122,9739 ACCACCCTCTCTTCTA-1,0,23,121,4242,9808 TGGAGGGAAACACCTC-1,0,22,122,4122,9877 CACGGACGTGGATGGC-1,0,23,123,4242,9946 AACTTTCTCGATCATG-1,0,22,124,4122,10015 CGTATTGTTTCCTAAT-1,0,23,125,4242,10084 CCTACTGCGGCGGCCA-1,0,22,126,4122,10152 CTTAGGTCCCAATCGT-1,0,23,127,4242,10221 CGCAATCGATCATTAG-1,0,24,0,4362,1480 TGGTTATGCTTGCGGT-1,0,25,1,4481,1549 GGCTTGGCTCTCACCT-1,0,24,2,4362,1618 ATTGGTAGGATCCGCT-1,0,25,3,4481,1686 TCAGGGCGACTTCCTT-1,0,24,4,4362,1755 TCTGCAGATTCGAGTC-1,0,25,5,4481,1824 CTCTCGCTGTACTATG-1,0,24,6,4362,1893 AATAGTCGCGAGTCGG-1,0,25,7,4481,1962 AGTTACCCTTAAGACT-1,0,24,8,4362,2031 CTTAAATAAGACCCAT-1,0,25,9,4481,2099 GGTTGTGCTCTTGTCC-1,0,24,10,4362,2168 GTGAGTCTAAGACGGA-1,0,25,11,4481,2237 CGCGACACTGCGCAGC-1,0,24,12,4362,2306 GCTCGCGGTTCCGCTC-1,0,25,13,4481,2375 TTAACTCACGCGTGGA-1,0,24,14,4362,2443 GGAACGGCCTGCAGCC-1,0,25,15,4481,2512 GTAGAAACGGGTGGAG-1,0,24,16,4362,2581 TAATGAAAGACCCTTG-1,0,25,17,4481,2650 AGGCTTGCTAGACACC-1,0,24,18,4362,2719 TTGCGTAGTTTGAGGA-1,0,25,19,4481,2788 CGCCCTTGAAGGCTGA-1,0,24,20,4362,2856 CCCGGTGGAAGAACCT-1,0,25,21,4481,2925 TTAACACCTCGAACAT-1,0,24,22,4362,2994 GATTCCTATACGGCGC-1,0,25,23,4481,3063 TTACCCTAACAGTCCT-1,0,24,24,4362,3132 ACCCACCTACATGCTC-1,0,25,25,4481,3201 AAAGGGCAGCTTGAAT-1,0,24,26,4362,3269 CACACAGGGATAGATT-1,0,25,27,4481,3338 AGAGCGTACAAGCTCG-1,0,24,28,4362,3407 TCTTACGGCATCCGAC-1,0,25,29,4481,3476 GCCTATTCCGATATAG-1,0,24,30,4362,3545 GAAAGTGACTAACTGC-1,0,25,31,4481,3614 CCGGAATGGTTTCAGT-1,0,24,32,4362,3682 AGTATAATACTAGGCA-1,0,25,33,4481,3751 TAACTATCGAAGGTCC-1,0,24,34,4362,3820 ATGAGGAGTGTTAATC-1,1,25,35,4481,3889 TGTGTCGCGAGTTGCA-1,0,24,36,4362,3958 ATCCAACGCAGTCATA-1,1,25,37,4481,4027 AAGGCGCGTAAAGCTT-1,1,24,38,4362,4095 AGTCGGCCCAAACGAC-1,1,25,39,4481,4164 AACGTCAGACTAGTGG-1,1,24,40,4362,4233 ACTACCAGCTCTCTGG-1,1,25,41,4481,4302 GCAAGTGCACAGAGAA-1,1,24,42,4362,4371 ACACCTTAAGTAGGGC-1,1,25,43,4481,4440 TTCGACGGGAAGGGCG-1,1,24,44,4362,4508 TTCGCACTCGCGTGCT-1,1,25,45,4481,4577 TATTTGTTACCCTTTA-1,1,24,46,4362,4646 CGCTGTGACGCCGCAC-1,1,25,47,4481,4715 GTTGCACGGAGTTTCG-1,1,24,48,4362,4784 GTTTCCTGGAGGGTGA-1,1,25,49,4481,4853 ACACCCAGCATGCAGC-1,1,24,50,4362,4921 TCAACCATGTTCGGGC-1,1,25,51,4481,4990 TTACAACTACGCATCC-1,1,24,52,4362,5059 TCCGATGGTGCGACAT-1,1,25,53,4481,5128 GGGCGTACATTTATAT-1,1,24,54,4362,5197 AGCGACCAACGATATT-1,1,25,55,4481,5265 ACACAAAGACGGGTGG-1,1,24,56,4362,5334 ATCGCACGCCGGGAGA-1,1,25,57,4481,5403 GCTCTAAACCCTGACG-1,1,24,58,4362,5472 AATGCAACCGGGTACC-1,1,25,59,4481,5541 TCAAACAACCGCGTCG-1,1,24,60,4362,5610 TATGCTCCCTACTTAC-1,1,25,61,4481,5678 AAAGGGATGTAGCAAG-1,1,24,62,4362,5747 ACGATCATACATAGAG-1,1,25,63,4481,5816 TTGTTCAGTGTGCTAC-1,1,24,64,4362,5885 ATGCATGATCCAGGAT-1,1,25,65,4481,5954 AGTCTTCTCCTCAAAT-1,1,24,66,4362,6023 GATTCCCTTGTCGCAG-1,1,25,67,4481,6091 CTCGCACCTATATAGT-1,1,24,68,4362,6160 ACTCAATAAAGGCACG-1,1,25,69,4481,6229 AACCGAGCTTGGTCAT-1,1,24,70,4362,6298 TAAGGCAACATAAGAT-1,1,25,71,4481,6367 CACGCACAGCGCAGCT-1,1,24,72,4362,6436 GGTTTACAATCTCAAT-1,1,25,73,4481,6504 TGCAGGATCGGCAAAG-1,1,24,74,4362,6573 ATAACGGAGTCCAACG-1,1,25,75,4481,6642 AACGATATGTCAACTG-1,1,24,76,4362,6711 GACAACGACCATTGAA-1,1,25,77,4481,6780 TTGACCATGTTCTCCG-1,1,24,78,4362,6849 AGTACGGGCACCTGGC-1,1,25,79,4481,6917 CGCCATCCGATTATGA-1,1,24,80,4362,6986 AAGGTATCCTAATATA-1,1,25,81,4481,7055 TGTTGTCAAGAAGTCT-1,1,24,82,4362,7124 CAGTGAATAAATGACT-1,1,25,83,4481,7193 CACCTTGCGAAACTCG-1,1,24,84,4362,7262 CATTTAGCGGACCATG-1,1,25,85,4481,7330 CCAGTCTAGACGGCGC-1,1,24,86,4362,7399 TCGCTTTAAACGTTTG-1,1,25,87,4481,7468 GTGAAACGGCGCCACC-1,1,24,88,4362,7537 GGGCTCATCGAACCCA-1,1,25,89,4481,7606 TTGATGTGTAGTCCCG-1,1,24,90,4362,7674 CAGTAGCCCACGCGGT-1,1,25,91,4481,7743 AGCGCGGGTGCCAATG-1,1,24,92,4362,7812 TAATCGATCCGTACGT-1,1,25,93,4481,7881 AGTGGCGGCAATTTGA-1,1,24,94,4361,7950 CCTTTCAATGAAGAAA-1,1,25,95,4481,8019 CTCAGTCACGACAAAT-1,1,24,96,4361,8087 ATAGGCTAGCTTCGCA-1,1,25,97,4481,8156 CGGTTCAAGTAGGTGT-1,1,24,98,4361,8225 CAGTCGAGGATGCAAT-1,1,25,99,4481,8294 TATCACCCAACCGACC-1,1,24,100,4361,8363 AATGATGCGACTCCTG-1,1,25,101,4481,8432 TGGAACCACTGACACA-1,1,24,102,4361,8500 GCCAATAGGGCATCTC-1,1,25,103,4481,8569 TTCTTTGGTCGCGACG-1,1,24,104,4361,8638 ATTAGATTCCTCAGCA-1,1,25,105,4481,8707 CCGTGGAACGATCCAA-1,1,24,106,4361,8776 GGGTCGTGGCAAGTGT-1,1,25,107,4481,8845 TCGCTCGGCACCAGCG-1,1,24,108,4361,8913 ACGCAATCACTACAGC-1,1,25,109,4481,8982 CTCTAATGCATTGATC-1,1,24,110,4361,9051 GTCTCGACTAAGTTTG-1,1,25,111,4481,9120 TGGTTTAAACGTGGGT-1,1,24,112,4361,9189 CGCAGATCTTCACCCG-1,1,25,113,4481,9258 TCCAGATGTACGCCAA-1,1,24,114,4361,9326 CATTGCGGGTCAATTC-1,1,25,115,4481,9395 GACGTTCGTAAATACA-1,0,24,116,4361,9464 TACACCGTCGTTAGTC-1,0,25,117,4481,9533 ACGGGCGTATGCGACA-1,0,24,118,4361,9602 GAAGGCTACCATTGTT-1,0,25,119,4481,9671 TAAATCTTTACACCTC-1,0,24,120,4361,9739 AGTTTATGTAAAGACA-1,0,25,121,4481,9808 AGGAGACATCCACAGT-1,0,24,122,4361,9877 CAACCTGAACCTGCCA-1,0,25,123,4481,9946 AGTCCCTCGCAGAAAG-1,0,24,124,4361,10015 TGTATACGGATGATGA-1,0,25,125,4481,10084 TTGTGGTATAGGTATG-1,0,24,126,4361,10152 TCTGCACCATTAGTAA-1,0,25,127,4481,10221 AAATGTATCTTATCCC-1,0,26,0,4601,1480 ACTCTAAACCTGGGAT-1,0,27,1,4721,1549 GCTGGCAGGTGCCGTG-1,0,26,2,4601,1618 CTCATTCGTGAACATC-1,0,27,3,4721,1686 TCGCCGGATGGGCAAG-1,0,26,4,4601,1755 GGACTAAGTCAGGAGT-1,0,27,5,4721,1824 TATCAAAGGTCTGTAA-1,0,26,6,4601,1893 TTCAGTTTGTGGCAGC-1,0,27,7,4721,1962 TGTTCATAAATGTGCT-1,0,26,8,4601,2031 CTTAGCCCGGATAGTG-1,0,27,9,4721,2099 GATGCGAATGGTATTA-1,0,26,10,4601,2168 TCTAACTGTATGTAAA-1,0,27,11,4721,2237 TTAAACCTGGTTCCTT-1,0,26,12,4601,2306 GCTAAGTAAAGGCGAT-1,0,27,13,4721,2375 AGTTACCGCACATGGT-1,0,26,14,4601,2443 GACTGCGGCACGTGTA-1,0,27,15,4721,2512 TGGTGATCGTATTTGT-1,0,26,16,4601,2581 TTATCGCCTGCGAAGC-1,0,27,17,4721,2650 TGGAATTAGACGCTTT-1,0,26,18,4601,2719 TCGTCACACTGTTAGC-1,0,27,19,4721,2788 TTATGTTTGCGATAGA-1,0,26,20,4601,2856 GGTGCTGATCACAAAG-1,0,27,21,4721,2925 CATAGCCGCCCGGGAT-1,0,26,22,4601,2994 GGTTAGTTACGGCGCC-1,0,27,23,4721,3063 ATTCCCACATAAACAA-1,0,26,24,4601,3132 ATTCAGTAGCAGGGTC-1,0,27,25,4721,3201 CAGTTCCGCGGGTCGA-1,0,26,26,4601,3269 AAGAGATGAATCGGTA-1,0,27,27,4721,3338 CGCAATTCTACAATAA-1,0,26,28,4601,3407 TAACGCTTTGAGAGCG-1,0,27,29,4721,3476 AGGCTATGGTTAGCTT-1,0,26,30,4601,3545 GAGGAATGGAGAGGTT-1,1,27,31,4721,3614 TCCTCTACGAGATGGC-1,1,26,32,4601,3682 TTGATTATGCAGATGA-1,1,27,33,4721,3751 TCAGTACTGACCCGCG-1,1,26,34,4601,3820 TTATGACAAACTGGAT-1,1,27,35,4721,3889 GTAAGTAGGGTATACC-1,1,26,36,4601,3958 CGCAAACACGAGTTAC-1,1,27,37,4721,4027 TGGCCGTATATTGACC-1,1,26,38,4601,4095 ACTGTAGCACTTTGGA-1,1,27,39,4721,4164 GCTCTATGTTACGTGC-1,1,26,40,4601,4233 TGCGCGATTAACGGAG-1,1,27,41,4721,4302 GAATCGACATGGTCAC-1,1,26,42,4601,4371 GACTAAGTAGGCTCAC-1,1,27,43,4721,4440 ATCTTGACCTGCAACG-1,1,26,44,4601,4508 ATGCACTACCGCATTG-1,1,27,45,4721,4577 CAGATACTAACATAGT-1,1,26,46,4601,4646 GATCGACACTATCTGA-1,1,27,47,4721,4715 ATAGAGTACTGGGACA-1,1,26,48,4601,4784 CCTACTGCTTACACTT-1,1,27,49,4721,4853 CCTGCTATTTGAGAAG-1,1,26,50,4601,4921 CGCGTTCATGAAATAC-1,1,27,51,4721,4990 CATTATGCTTGTTGTG-1,1,26,52,4601,5059 CCAGGGACGTGGCCTC-1,1,27,53,4721,5128 TATGGATGTGCTACGC-1,1,26,54,4601,5197 GTACTAAGATTTGGAG-1,1,27,55,4721,5265 AGACCCGCCCTCCTCG-1,1,26,56,4601,5334 CGCATTAGCTAATAGG-1,1,27,57,4721,5403 GCTCTCGGGTACCGAA-1,1,26,58,4601,5472 CACCGCCAGAAGGTTT-1,1,27,59,4721,5541 TCCCAAAGACGAAGGA-1,1,26,60,4601,5610 ATGGATTGACCAAACG-1,1,27,61,4721,5678 GTCATGGACATGACTA-1,1,26,62,4601,5747 CTACTGCCACCTGACC-1,1,27,63,4721,5816 TTATATTTGGCAATCC-1,1,26,64,4601,5885 AGCACCAGTACTCACG-1,1,27,65,4721,5954 CATGGTCTAGATACCG-1,1,26,66,4601,6023 TCTACCGTCCACAAGC-1,1,27,67,4721,6091 CTAGTTGGGCCCGGTA-1,1,26,68,4601,6160 TCCCGCGTACTCCTGG-1,1,27,69,4721,6229 CAGAGCATGAGCTTGC-1,1,26,70,4601,6298 ACACGGGAACTTAGGG-1,1,27,71,4721,6367 GGCTCTGCTCCAACGC-1,1,26,72,4601,6436 AGAACGTGGTACATTC-1,1,27,73,4721,6504 CAATAAACCTTGGCCC-1,1,26,74,4601,6573 ACTTCGCCATACGCAC-1,1,27,75,4721,6642 ATCTGGTTAAGACTGT-1,1,26,76,4601,6711 TCGTAAGACGACATTG-1,1,27,77,4721,6780 GTGTACCTTGGCTACG-1,1,26,78,4601,6849 GCCCGTAATACCTTCT-1,1,27,79,4721,6917 CGGTCAAGTGGGAACC-1,1,26,80,4601,6986 TTGTAAGGCCAGTTGG-1,1,27,81,4721,7055 GGAGCACCAAGAACTA-1,1,26,82,4601,7124 TAATAGTGACGACCAG-1,1,27,83,4721,7193 CTAAATCCTATTCCGG-1,1,26,84,4601,7262 CGAGTTCTGTCCCACC-1,1,27,85,4721,7330 AGGCAGATGCGTAAAC-1,1,26,86,4601,7399 AAGGATGAGGGACCTC-1,1,27,87,4721,7468 AGAGAACCGTCTAGGA-1,1,26,88,4601,7537 GAGGGCGCAGCTCTGC-1,1,27,89,4721,7606 AAGATTGGCGGAACGT-1,1,26,90,4601,7674 CCAGTAGTCTGATCCA-1,1,27,91,4721,7743 AAGGGACAGATTCTGT-1,1,26,92,4601,7812 ATAGAGTTATCAACTT-1,1,27,93,4721,7881 AAATTACCTATCGATG-1,1,26,94,4601,7950 GATCCTAAATCGGGAC-1,1,27,95,4721,8019 TTACAGACCTAAATGA-1,1,26,96,4601,8087 CCTCACCTTAGCATCG-1,1,27,97,4721,8156 CATGCGACCAGTTTAA-1,1,26,98,4601,8225 AACATATCAACTGGTG-1,1,27,99,4721,8294 CTATAAGAGCCAATCG-1,1,26,100,4601,8363 AATATCGAGGGTTCTC-1,1,27,101,4721,8432 GTACTCCTGGGTATGC-1,1,26,102,4601,8500 ATAAGTAGGATTCAGA-1,1,27,103,4721,8569 AGGTCGCGGAGTTACT-1,1,26,104,4601,8638 CTAATTCTCAGATATT-1,1,27,105,4721,8707 GCCAACCATTTCCGGA-1,1,26,106,4601,8776 TGATCCCAGCATTAGT-1,1,27,107,4721,8845 CGTTGTAAGATTGATT-1,1,26,108,4601,8913 GAAACCATGGTGCGCT-1,1,27,109,4721,8982 AATCTATGCCGGAGCC-1,1,26,110,4601,9051 GACTCCCAGAATAAGG-1,1,27,111,4721,9120 TATGATCCGGCACGCC-1,1,26,112,4601,9189 CCGCTTGCTGACATGG-1,1,27,113,4721,9258 TGGTTAAGGGCGCTGG-1,1,26,114,4601,9326 TTGATAGTCAATACAT-1,1,27,115,4721,9395 GGTTTAATTGAGCAGG-1,1,26,116,4601,9464 CATTACATAGATTGTG-1,0,27,117,4721,9533 GGTACACCAGATTTAT-1,0,26,118,4601,9602 GGCCCGTATACCATGC-1,0,27,119,4721,9671 ATCTTTCGTATAACCA-1,0,26,120,4601,9739 GAGATGACAATCCTTA-1,0,27,121,4721,9808 AAAGCTTGCCTACATA-1,0,26,122,4601,9877 GAACGATAAGTTAAAG-1,0,27,123,4721,9946 TAATAGCTAAATGATG-1,0,26,124,4601,10015 TATGGCTAGGCTAATT-1,0,27,125,4721,10084 AGGAGAGTCTGGCTAC-1,0,26,126,4601,10152 TGCTCTGCCGGTTCAC-1,0,27,127,4721,10221 CCAATAGATTTCATCT-1,0,28,0,4841,1480 GGGCACGAATTGGCCG-1,0,29,1,4961,1549 TCGTTGACAGGGTCCC-1,0,28,2,4841,1618 ATCGTATTCCGAGAAC-1,0,29,3,4961,1686 GGGAATTCTGTCCAGT-1,0,28,4,4841,1755 ACGCGTTTCTTAAGAG-1,0,29,5,4961,1824 GAGAGCGCAGTCCCTG-1,0,28,6,4841,1893 GTCCTATTGTTGTGGT-1,0,29,7,4961,1962 CATCTGCAGGATCATT-1,0,28,8,4841,2031 GAGTCGACAGACCCTC-1,0,29,9,4961,2099 AAGTGCAAAGGTAGAC-1,0,28,10,4841,2168 AGGGTGGATAGTGCAT-1,0,29,11,4961,2237 TGATAGCGGGATTCTA-1,0,28,12,4841,2306 GTCAGTTTGGTAGTCG-1,0,29,13,4961,2375 GCATTCGAAATGAACA-1,0,28,14,4841,2443 AAAGACTGGGCGCTTT-1,0,29,15,4961,2512 TAACAATATTTGTTGC-1,0,28,16,4841,2581 CCAGCTTCCGCCCGCA-1,0,29,17,4961,2650 GATATGGATTACGCGG-1,0,28,18,4841,2719 AGAGCAGTTATGAGAC-1,0,29,19,4960,2788 TCACATCTTATCTGAT-1,0,28,20,4841,2856 TATGAAGACAGGTGCG-1,0,29,21,4960,2925 TACCTGCTGCACTGTG-1,0,28,22,4841,2994 TAGGTCCAAGTAAGGA-1,0,29,23,4960,3063 GAAACTCGTGCGATGC-1,0,28,24,4841,3132 AACAATTACTCTACGC-1,0,29,25,4960,3201 CCGCACGTGACCTCGG-1,0,28,26,4841,3269 AACTTGCCCGTATGCA-1,1,29,27,4960,3338 GGGTATGTATGCACTT-1,1,28,28,4841,3407 TTCGTACTCCAGAACG-1,1,29,29,4960,3476 GAATTTCTCGCTGCAG-1,1,28,30,4841,3545 AACAGGATGGGCCGCG-1,1,29,31,4960,3614 GACGTGTAGGGATTAT-1,1,28,32,4841,3682 TAGGTGAGCCCTACTC-1,1,29,33,4960,3751 CTAATTCGCACGCGCT-1,1,28,34,4841,3820 GAAGCTTGCTGACCGC-1,1,29,35,4960,3889 GGTTAGGCTTGGAGAA-1,1,28,36,4841,3958 ACAAGGACAAGAGGTT-1,1,29,37,4960,4027 AGGCCACCCGTTATGA-1,1,28,38,4841,4095 GTGGGCTTAGACACAC-1,1,29,39,4960,4164 CGTGTCCCATTCGCGA-1,1,28,40,4841,4233 TGGAGTGATGCGATGA-1,1,29,41,4960,4302 AACAACTGGTAGTTGC-1,1,28,42,4841,4371 CCTGGCTAGACCCGCC-1,1,29,43,4960,4440 CGCAATTAGGGTAATA-1,1,28,44,4841,4508 TCGAAATTTAGGACCA-1,1,29,45,4960,4577 AGACTAGCCTTCCAGA-1,1,28,46,4841,4646 TTGATCTAACTTTGTC-1,1,29,47,4960,4715 AAGGAGCGGTTGGTGC-1,1,28,48,4841,4784 ACTTGGGACCCGGTGG-1,1,29,49,4960,4853 TGATCTCCGGCGCCAG-1,1,28,50,4841,4921 CAGTTCAAATTGACAC-1,1,29,51,4960,4990 GTCCGGCTGAATTGCG-1,1,28,52,4841,5059 CTGGAAATGGATGCTT-1,1,29,53,4960,5128 TGATCGGTTTGACCCT-1,1,28,54,4841,5197 TAGAGTCTAAGCGAAC-1,1,29,55,4960,5265 GAGACTGATGGGTAGA-1,1,28,56,4841,5334 TAGCTAAGTCCGGGAG-1,1,29,57,4960,5403 GGGCGATATGTGTGAA-1,1,28,58,4841,5472 CTCGAGGTCGAACAGT-1,1,29,59,4960,5541 GATCCCTTTATACTGC-1,1,28,60,4841,5610 GTCATGCACCTCCGTT-1,1,29,61,4960,5678 ACTTTCCTATAGCTTC-1,1,28,62,4841,5747 TCGCTCGATATATTCC-1,1,29,63,4960,5816 ATAGGTTGGGCAGATG-1,1,28,64,4841,5885 CAATTAAGGGTGATGA-1,1,29,65,4960,5954 ACCGACTGAGTCCCAC-1,1,28,66,4841,6023 CCTGTCACCCGGGCTC-1,1,29,67,4960,6091 GATCGGTGGCCATAAC-1,1,28,68,4841,6160 CCTATGGGTTACCGTC-1,1,29,69,4960,6229 TTGGGACACTGCCCGC-1,1,28,70,4841,6298 CGAGGCTAAATATGGC-1,1,29,71,4960,6367 TCAGGGTGTAACGTAA-1,1,28,72,4841,6436 CGAGAGATGTGAACCT-1,1,29,73,4960,6504 TCGCTGGGCGGATTGT-1,1,28,74,4841,6573 AGATCTCAGGTGTGAT-1,1,29,75,4960,6642 TGGCCAAACTGAAGTA-1,1,28,76,4841,6711 GCTTCCGTCCCTAGAC-1,1,29,77,4960,6780 CAGCAGCCCGTTCCTT-1,1,28,78,4841,6849 TGTATAACAGATCCTG-1,1,29,79,4960,6917 CGCGGGAATTAGGCAG-1,1,28,80,4841,6986 TGCATGTGGTAATCTA-1,1,29,81,4960,7055 ACAATTTGAGCAGTGG-1,1,28,82,4841,7124 GAGCTAAGGGCATATC-1,1,29,83,4960,7193 CCAGATAGTTGAGTGA-1,1,28,84,4841,7262 CCACAATGTACGTCTT-1,1,29,85,4960,7330 CAATGGATCTCTACCA-1,1,28,86,4841,7399 TGTGGCAAAGCGTATG-1,1,29,87,4960,7468 TAAAGCGTTAGGAGAA-1,1,28,88,4841,7537 TCCGTTTAGCCTTGAA-1,1,29,89,4960,7606 CAGCTCGACAAGTTAA-1,1,28,90,4841,7675 GCCTATAGTGTCAGGG-1,1,29,91,4960,7743 ATAGACAACGGGACCT-1,1,28,92,4841,7812 CTACTATCTTTCAGAG-1,1,29,93,4960,7881 GCGCTGCTTTGCATTT-1,1,28,94,4841,7950 GCGCATCCAGTCAGCA-1,1,29,95,4960,8019 GACTCGCGGGAATGAC-1,1,28,96,4841,8087 CTGGTAACGAGCTCTT-1,1,29,97,4960,8156 TCCGGCCTAGCGTACA-1,1,28,98,4841,8225 TCTAGGTGGCGACGCT-1,1,29,99,4960,8294 ACGCTAGTGATACACT-1,1,28,100,4841,8363 ATCTGCACCTCTGCGA-1,1,29,101,4960,8432 CCTCACCTGAGGGAGC-1,1,28,102,4841,8500 AGTGAGCCTCGCCGCC-1,1,29,103,4960,8569 ACGAGTACGGATGCCC-1,1,28,104,4841,8638 GGTACCATTAAGACGG-1,1,29,105,4960,8707 TTCTGCTAGACTCCAA-1,1,28,106,4841,8776 TAACTATTACGCCAAA-1,1,29,107,4960,8845 GCATTCAAGGCAACGC-1,1,28,108,4841,8913 AGTACATCATTTATCA-1,1,29,109,4960,8982 GTCGTGTCTGGTCATC-1,1,28,110,4841,9051 AGTCTAAAGTATACTC-1,1,29,111,4960,9120 CGGCCCAACCTGTAGT-1,1,28,112,4841,9189 AGGGAGACATACTTCG-1,1,29,113,4960,9258 TCCCTAGATCAATAGG-1,1,28,114,4840,9326 TCCCGTCGCGTCATAG-1,1,29,115,4960,9395 CGCATCCATCAGCCAG-1,0,28,116,4840,9464 CTGCACCTAGTCCACA-1,0,29,117,4960,9533 CGAGGATCGGGAACGA-1,0,28,118,4840,9602 CAATGAGGTTCGACTA-1,0,29,119,4960,9671 TCTGACGGGCTAACCC-1,0,28,120,4840,9739 TTCTATGCCTTTCGCA-1,0,29,121,4960,9808 AGAGTATAGTGTTACG-1,0,28,122,4840,9877 CCATTGTTTCCTCCAT-1,0,29,123,4960,9946 CTCATCACTTAGTGAT-1,0,28,124,4840,10015 CCGAAGGGCGTACCGC-1,0,29,125,4960,10084 TCAAGCTGCCTTGAAA-1,0,28,126,4840,10152 CTCATTAACGTTGCCC-1,0,29,127,4960,10221 GTCTTCCTCACCTAAG-1,0,30,0,5080,1480 GGTGATGAAGGAAGTG-1,0,31,1,5200,1549 TCAATACAATTGCTGC-1,0,30,2,5080,1618 GCAACCCAAGTTGTTT-1,0,31,3,5200,1686 ATGAAGTGGACCCAGC-1,0,30,4,5080,1755 GAGAATCTCACGATCA-1,0,31,5,5200,1824 TATATCATTGATCAGT-1,0,30,6,5080,1893 AACTTTACGGGAGCTT-1,0,31,7,5200,1962 TTCTTGTGTCCATCAG-1,0,30,8,5080,2031 ACAATTTAGGAGGCTC-1,0,31,9,5200,2099 ATACTTGTTCTCGAGC-1,0,30,10,5080,2168 CACGGGATTGAGGGTT-1,0,31,11,5200,2237 GTTAATGTCTATCTTA-1,0,30,12,5080,2306 GCGTTATATTTGGAAC-1,0,31,13,5200,2375 CGTCAAGGCTATAAAT-1,0,30,14,5080,2444 TTAGCTCTGTAATCCG-1,0,31,15,5200,2512 AATGGTCCACCGTTCA-1,0,30,16,5080,2581 GTCATTGCATTGACCC-1,0,31,17,5200,2650 TGTCCGTGGCGCCTTT-1,0,30,18,5080,2719 TCAACTAACGTATAAC-1,0,31,19,5200,2788 TCCTCTCCAGTTGTCC-1,0,30,20,5080,2856 TGTGTTCGTATCCAAG-1,0,31,21,5200,2925 CCGCGTAGGTAAGGGC-1,0,30,22,5080,2994 CTGCGGGTGAAATGTT-1,0,31,23,5200,3063 TATCTACAGAGGTAAT-1,0,30,24,5080,3132 CTACTCTAGGCCCGGC-1,1,31,25,5200,3201 ACAAGCAGTGCCTAGC-1,1,30,26,5080,3269 TACAAGTCTCGTGCAT-1,1,31,27,5200,3338 TCGGAATGCGCTCTGA-1,1,30,28,5080,3407 TCGCGTCCAGAAGGTC-1,1,31,29,5200,3476 TATGGCCCGGCCTCGC-1,1,30,30,5080,3545 GCTGGCATATTCACCT-1,1,31,31,5200,3614 GTCAGAATAGTCTATG-1,1,30,32,5080,3682 GGCGTCCTATCCGCTG-1,1,31,33,5200,3751 CGGAGTTTGAGAGACA-1,1,30,34,5080,3820 AGCACTTAAGGACGCC-1,1,31,35,5200,3889 TCCACAATGGTTTACG-1,1,30,36,5080,3958 CCAACGATGCACTGAT-1,1,31,37,5200,4027 ATTTACAGTTTACTGG-1,1,30,38,5080,4095 CCCTGAAATGAGTTGA-1,1,31,39,5200,4164 CAAACGGTCGCACTTT-1,1,30,40,5080,4233 TGATTCGTCTATCACT-1,1,31,41,5200,4302 TCAGGTTCTTTGAGAA-1,1,30,42,5080,4371 CACGCAGCGAGGCTTT-1,1,31,43,5200,4440 TTAAGCGCCTGACCCA-1,1,30,44,5080,4508 CTTACACGGTATTCCA-1,1,31,45,5200,4577 AAGGCTGTGCTCATCG-1,1,30,46,5080,4646 GACCAGAGCCCTGTAG-1,1,31,47,5200,4715 TCCCAGGCTTAGCTAA-1,1,30,48,5080,4784 ATTGAAGATCTTAGTG-1,1,31,49,5200,4853 AGTTCCTACAGAATTA-1,1,30,50,5080,4921 GGGCTGGTTAGTCGCG-1,1,31,51,5200,4990 GAAATGGCGGTGTTAG-1,1,30,52,5080,5059 TACGAACACGACTTCA-1,1,31,53,5200,5128 ACCACAAGTTTCTATC-1,1,30,54,5080,5197 ATATTTAACCCTCAAG-1,1,31,55,5200,5266 GATCATTCCAAACATT-1,1,30,56,5080,5334 TCCAGGCGAGTACGGT-1,1,31,57,5200,5403 GTTTGACCAAATCCTA-1,1,30,58,5080,5472 CACAGCACCCACGGCA-1,1,31,59,5200,5541 TGCAAGAATGACGTAA-1,1,30,60,5080,5610 GCGAAGCCATACCCGT-1,1,31,61,5200,5678 TCCTTTCTTACGCTTA-1,1,30,62,5080,5747 GCTGCTCTCCGGACAC-1,1,31,63,5200,5816 ACTGTCTTCTTTAGAA-1,1,30,64,5080,5885 TCAAACTTAGATTGTT-1,1,31,65,5200,5954 CTATGTCACTAGCCCA-1,1,30,66,5080,6023 TGCGCAAAGCATTTGG-1,1,31,67,5200,6091 TTAATGTAGACCAGGT-1,1,30,68,5080,6160 GGCGGTAGGATCATTG-1,1,31,69,5200,6229 GGCAATAGTCAATGAG-1,1,30,70,5080,6298 ACACGAGACTCCTTCT-1,1,31,71,5200,6367 GACACAAGGGAAGAAA-1,1,30,72,5080,6436 TCAGCAAATGCATCTC-1,1,31,73,5200,6504 GAGATCTGTCACTCCG-1,1,30,74,5080,6573 ATGCCGGTCTTGCATA-1,1,31,75,5200,6642 TTGGGCGGCGGTTGCC-1,1,30,76,5080,6711 TTGTTGTGTGTCAAGA-1,1,31,77,5200,6780 ACTGTACGATACACAT-1,1,30,78,5080,6849 TCCACTTTATCTAGGT-1,1,31,79,5200,6917 GGTCTGAGAATCTGGA-1,1,30,80,5080,6986 TAGAAAGGTGGCGCTA-1,1,31,81,5200,7055 TATGTCTCATTGTGCC-1,1,30,82,5080,7124 GGATTTCACTTCTATA-1,1,31,83,5200,7193 TGAGTGGTCCGTGACG-1,1,30,84,5080,7262 CGCTTTCTTGCATTCG-1,1,31,85,5200,7330 ACCCAACGCCCGTGGC-1,1,30,86,5080,7399 GAACGTCTCATGGTCG-1,1,31,87,5200,7468 AGGGTTCCCTTTGGTT-1,1,30,88,5080,7537 GTAGCTTCCTCTTGTT-1,1,31,89,5200,7606 GCATGAGGGACGCGGC-1,1,30,90,5080,7675 CTACCCTAAGGTCATA-1,1,31,91,5200,7743 TCACCGCTCGGCACTC-1,1,30,92,5080,7812 GGCTCGCGTTGAGGTA-1,1,31,93,5200,7881 CTAACGAAACTTGCTG-1,1,30,94,5080,7950 TTAAACTCGAATTCAT-1,1,31,95,5200,8019 TACTTTACTGAGCCGG-1,1,30,96,5080,8087 GCTTGGATCGATTAGG-1,1,31,97,5200,8156 CGGTTATCCAACAGTG-1,1,30,98,5080,8225 CAGACCTGTAAGTGTT-1,1,31,99,5200,8294 GACGGTCAATAGAAGC-1,1,30,100,5080,8363 CTGACTGCGCAGCTCG-1,1,31,101,5200,8432 CCATACCTTTACTTGT-1,1,30,102,5080,8500 GTAATAAAGGGCTCCC-1,1,31,103,5200,8569 GTGAACTCCCATTCGA-1,1,30,104,5080,8638 GTGGTTACTTCTTTCG-1,1,31,105,5200,8707 TCAGAACCTCCACAGG-1,1,30,106,5080,8776 TCCCACTCTCTTCCGG-1,1,31,107,5200,8845 ATCTTGACTTGTCCAA-1,1,30,108,5080,8913 TCGGGAACGTGCCTAG-1,1,31,109,5200,8982 GTTAGCCGTAAATCAA-1,1,30,110,5080,9051 ATTTACTAAGTCCATT-1,1,31,111,5200,9120 GGGTGCATATGAAAGC-1,1,30,112,5080,9189 TCCGAATGGTCCTGAG-1,1,31,113,5200,9258 TGATGGCTGTTTCTGA-1,1,30,114,5080,9326 AAATAAGGTAGTGCCC-1,1,31,115,5200,9395 CCACTATCCGGGTCAC-1,0,30,116,5080,9464 ACACCACATAATTAGC-1,0,31,117,5200,9533 CGCGGTAAGTCTAGCT-1,0,30,118,5080,9602 GCGGGCATTACGATGC-1,0,31,119,5200,9671 AGGATTGCTTACGACA-1,0,30,120,5080,9739 CTCGGGATAACACCTA-1,0,31,121,5200,9808 GTCGTCTGGTTGGCTA-1,0,30,122,5080,9877 GCAATTAGTCGCACCG-1,0,31,123,5200,9946 GTGACCTAAAGAATAA-1,0,30,124,5080,10015 CTGAGCGAGACTTATT-1,0,31,125,5200,10084 CAAGACTCAGAAGCGC-1,0,30,126,5080,10152 ACTTCGCTAGCGAGTG-1,0,31,127,5200,10221 CCATACTCGCCTCTCC-1,0,32,0,5320,1480 ACGATACCTATCCTGA-1,0,33,1,5440,1549 CTCACCAGTACAAGTG-1,0,32,2,5320,1618 CGAAGACGGTGAGTGC-1,0,33,3,5440,1686 AAATTAATAAGCGCGA-1,0,32,4,5320,1755 GGGCCCTTATCTATAC-1,0,33,5,5440,1824 CTGCCCACGAAGCGTT-1,0,32,6,5320,1893 GGACAAGTTGCAGTGA-1,0,33,7,5440,1962 GTCCGAGAGCAATCAT-1,0,32,8,5320,2031 ATGGCAGCCGAGAAAC-1,0,33,9,5440,2099 CCTCGGATGCTACCTG-1,0,32,10,5320,2168 ATACGGTGAAGATGCA-1,0,33,11,5440,2237 ACATCAGCTGGGACGC-1,0,32,12,5320,2306 GGTTGTGTAGCCTGGC-1,0,33,13,5440,2375 CCTGCGTTCTACGCTT-1,0,32,14,5320,2444 GAACGTTAGGAAGACG-1,0,33,15,5440,2512 CTGATAGTGTATCTCA-1,0,32,16,5320,2581 TTCTGCGAGCGCCCTT-1,0,33,17,5440,2650 CTTTGGCGCTTTATAC-1,0,32,18,5320,2719 TCCGAACTTGGCTTAC-1,0,33,19,5440,2788 TAGATTCCTGGTTATT-1,0,32,20,5320,2856 CCGACAAAGGGAGTGC-1,0,33,21,5440,2925 CCATGGCCCTTGTACC-1,0,32,22,5320,2994 GAAATATCACCATCAG-1,1,33,23,5440,3063 ACGAAATGGGCGGCAC-1,1,32,24,5320,3132 GTGAGCGTGCTGCACT-1,1,33,25,5440,3201 CCGCGGGTACGAAGAA-1,1,32,26,5320,3269 TCCCTGGCTCGCTGGA-1,1,33,27,5440,3338 CAGCTTAGTAGGTAGC-1,1,32,28,5320,3407 CACGAAAGTTAGTCCC-1,1,33,29,5440,3476 ACCTAATCGACTTCCT-1,1,32,30,5320,3545 AAGTAGTGACGCGAGG-1,1,33,31,5440,3614 TCCGATTACATTGCCG-1,1,32,32,5320,3682 CCTCCGACAATTCAAG-1,1,33,33,5440,3751 GTTCACAGGAGTCTAG-1,1,32,34,5320,3820 CGAAGTTGCTCTGTGT-1,1,33,35,5440,3889 GTCGGATATCTCAGAC-1,1,32,36,5320,3958 CGCTCTCCGTAGATTA-1,1,33,37,5440,4027 CAAGCAACGTCGGAGT-1,1,32,38,5320,4095 CCATTCCCTGCCCACA-1,1,33,39,5439,4164 CTTTGGCTTTAGTAAA-1,1,32,40,5320,4233 GGCTATTAAGTTGTAT-1,1,33,41,5439,4302 CCATTAGCGATAATCC-1,1,32,42,5320,4371 TGTTCTTCCATTGACT-1,1,33,43,5439,4440 AGATAACTTCAGGGCC-1,1,32,44,5320,4508 ATAGACGAAGAGAAAG-1,1,33,45,5439,4577 GGCGGAGTAATATTAG-1,1,32,46,5320,4646 TGACCCACGTTAGACA-1,1,33,47,5439,4715 TCACAGGTTATTGGGC-1,1,32,48,5320,4784 TCACGCATTGTAGATC-1,1,33,49,5439,4853 TTGAAGAATTCCCAGG-1,1,32,50,5320,4921 AAATGGTCAATGTGCC-1,1,33,51,5439,4990 TAGTGCCCTCCAGAGT-1,1,32,52,5320,5059 GGTATTGCCGAGTTTA-1,1,33,53,5439,5128 CGTATTAAGAGATCTA-1,1,32,54,5320,5197 ACTGTCCAGGATTATA-1,1,33,55,5439,5266 CGGGCAGCTAAACCGC-1,1,32,56,5320,5334 TTGCTGATCATGTTCG-1,1,33,57,5439,5403 TATGGGTACGTATCGT-1,1,32,58,5320,5472 CAGCTCACTGAGACAT-1,1,33,59,5439,5541 GGGACTGCATAGATAG-1,1,32,60,5320,5610 ACGCATTCGTGAGTAC-1,1,33,61,5439,5678 CTCTGGACGCCTGGTG-1,1,32,62,5320,5747 AGGGTTTAGTTCGGGA-1,1,33,63,5439,5816 GGGAGAACTCACAGTA-1,1,32,64,5320,5885 ATCAATCTGGGCTGCA-1,1,33,65,5439,5954 TCTTCGATACCAATAA-1,1,32,66,5320,6023 ACGTAGATTGCTGATG-1,1,33,67,5439,6091 TCTTGATGCGTAGCGA-1,1,32,68,5320,6160 GGGCTGCCTAGGGCGA-1,1,33,69,5439,6229 CTCTCACAATCGATGA-1,1,32,70,5320,6298 CCAAGCGTAACTCGTA-1,1,33,71,5439,6367 ACAACAGCATGAGCTA-1,1,32,72,5320,6436 GTCCCAACGTAAAGTA-1,1,33,73,5439,6504 TCGGAGTACATGAGTA-1,1,32,74,5320,6573 GGGAGTTAATGAGGCG-1,1,33,75,5439,6642 CCGGGCGGTCTCGTCA-1,1,32,76,5320,6711 CCGTAAGTTGGTCCCA-1,1,33,77,5439,6780 GGAGGGCTTGGTTGGC-1,1,32,78,5320,6849 TCGGACGCCCAGCCCA-1,1,33,79,5439,6917 TCTGTGCCATCATAGT-1,1,32,80,5320,6986 GTACTGGAGTTAGACC-1,1,33,81,5439,7055 GGAATGCGCTAGCGTG-1,1,32,82,5320,7124 GTGTGAATAACTTAGG-1,1,33,83,5439,7193 GGTCGGCCAGGAGCTT-1,1,32,84,5320,7262 TAGCCGGCGGTCAGCG-1,1,33,85,5439,7330 CGGGTGTACCCATTTA-1,1,32,86,5320,7399 AGTGATTCAAGCAGGA-1,1,33,87,5439,7468 GTTGGATTGAGAACAC-1,1,32,88,5320,7537 CACACGCGCTGTCTTA-1,1,33,89,5439,7606 TAGACGCCCGTACCGG-1,1,32,90,5320,7675 GGTTTCAATCGGTCAG-1,1,33,91,5439,7743 AATCTGCGTTGGGACG-1,1,32,92,5320,7812 TTACGGATGGTTCGAG-1,1,33,93,5439,7881 CGGCAGGGTCGGGTTG-1,1,32,94,5320,7950 GCTTTCAGAGGAGGTG-1,1,33,95,5439,8019 TCTTCCCATGGGCACA-1,1,32,96,5320,8088 TACCGCGGACTTGCAG-1,1,33,97,5439,8156 AGAATTATGGATTCGA-1,1,32,98,5320,8225 ATTGATGAGTCCTAAC-1,1,33,99,5439,8294 TAGGTCGCCGGAACTG-1,1,32,100,5320,8363 TAACCTACCGTCCGAG-1,1,33,101,5439,8432 CTTAGTAGGCCTACAG-1,1,32,102,5320,8500 CTAGATGTGAGTGTAA-1,1,33,103,5439,8569 ACTCCCGAATTCGTTT-1,1,32,104,5320,8638 GTTCATCGTTTGGCTG-1,1,33,105,5439,8707 ACTTTACCCTCATGAA-1,1,32,106,5320,8776 GCGAGAGTTGCGTCCA-1,1,33,107,5439,8845 GTTCGGGCGTACCATT-1,1,32,108,5320,8913 CGACTTTGTATAGCCT-1,1,33,109,5439,8982 GCCATCGATGCTGCAT-1,1,32,110,5320,9051 GCATTTCCAAGGCTCC-1,1,33,111,5439,9120 ATGTAAGGCTGCTCTT-1,1,32,112,5320,9189 ACGTTCGCAATCAATT-1,1,33,113,5439,9258 GTGACGAGGGTGACCC-1,1,32,114,5320,9326 ATTATAGCTACTTTAC-1,1,33,115,5439,9395 CGTGTGTTAAACCCTG-1,0,32,116,5320,9464 TTGGTATGGCTTGTGT-1,0,33,117,5439,9533 CATTCCCATTCCGTCG-1,0,32,118,5320,9602 TGCCGAAAGCGTATTC-1,0,33,119,5439,9671 CAACACATCTCCTGCC-1,0,32,120,5320,9739 CTGCCTCATATGCAAC-1,0,33,121,5439,9808 TCCCGCCTATGTGCGT-1,0,32,122,5320,9877 GGTTACCCGACACTTT-1,0,33,123,5439,9946 CCAGCGGGATCACCAG-1,0,32,124,5320,10015 ATGTTTCGGCCCGGAG-1,0,33,125,5439,10084 GCGTCTAACCTCCTAA-1,0,32,126,5320,10152 ATCAGGTAGCTGACAG-1,0,33,127,5439,10221 GGTATGAAAGAACTGA-1,0,34,0,5559,1480 GTGGCCTAATATCATT-1,0,35,1,5679,1549 CCTGTGAAACCGTAAC-1,0,34,2,5559,1618 GGCAGAGAGATCGGGA-1,0,35,3,5679,1686 TAGCGTCGAATATTGA-1,0,34,4,5559,1755 CGCCGACTATTCGCTA-1,0,35,5,5679,1824 TCTGGCGCAAGCCGGG-1,0,34,6,5559,1893 AGTGGTTGCGTATAGG-1,0,35,7,5679,1962 ATCGGTTACCTAGTAA-1,0,34,8,5559,2031 CCTGCCCGTTGTCTAG-1,0,35,9,5679,2099 GCACACGCCCATGGTC-1,0,34,10,5559,2168 AGTACGGCCCGTATCG-1,0,35,11,5679,2237 TATCTAGCCTAAAGGA-1,0,34,12,5559,2306 CACTCGGTTAGGAGGA-1,0,35,13,5679,2375 ATGTTCGTCGACCCAC-1,0,34,14,5559,2444 TTCCTCTGCCCGAATA-1,0,35,15,5679,2512 TTACTATCGGCTTCTC-1,0,34,16,5559,2581 GCCGCATTAGTCCGGC-1,0,35,17,5679,2650 TAAGGGCTGGGAGAGG-1,0,34,18,5559,2719 TAAGCAGGCGACACGC-1,0,35,19,5679,2788 AGCACTACCGGCCTGT-1,0,34,20,5559,2856 GAAAGCCCTTTGGACC-1,1,35,21,5679,2925 GACCGACTGAAGCGTC-1,1,34,22,5559,2994 CGGTGAAGACTAAAGT-1,1,35,23,5679,3063 CCCTGCGCTACGCATA-1,1,34,24,5559,3132 TACTGGACAGCTCGGC-1,1,35,25,5679,3201 TTAGTAGGGCGGCGGG-1,1,34,26,5559,3269 GAGGCTATCAAAGTCG-1,1,35,27,5679,3338 TTACCATTGATTACCC-1,1,34,28,5559,3407 ATACCACGGGCAACTT-1,1,35,29,5679,3476 TGTCCTAAGTCACCGC-1,1,34,30,5559,3545 AGGTAGGTACAAAGCT-1,1,35,31,5679,3614 GGCATACAGGTAGCGG-1,1,34,32,5559,3682 TGTAGTGATCTATAAT-1,1,35,33,5679,3751 TCCCGGGTGTGCTGCT-1,1,34,34,5559,3820 TACGATGTTGATCATC-1,1,35,35,5679,3889 CCTCTCTCCCATCTAG-1,1,34,36,5559,3958 GCAGGACTATAGAATA-1,1,35,37,5679,4027 CTAGTGAAGGACAGGA-1,1,34,38,5559,4095 TACGAGAACTTCACGT-1,1,35,39,5679,4164 CGTTGTTTCAATTCCC-1,1,34,40,5559,4233 GCAAATATTACGCTTT-1,1,35,41,5679,4302 CCAATAGTGCCGTCGA-1,1,34,42,5559,4371 ATTGCTGCTCCTCCAT-1,1,35,43,5679,4440 GAGATCTGCTTGGCAT-1,1,34,44,5559,4508 GCCGAAATTCCTACGT-1,1,35,45,5679,4577 GGCACTCCACTGGGCA-1,1,34,46,5559,4646 GGGTCACCGTGACGGT-1,1,35,47,5679,4715 CACTTAATCAGACGGA-1,1,34,48,5559,4784 CGTTTCGCTCATTACA-1,1,35,49,5679,4853 ATAAAGGCTCGGTCGT-1,1,34,50,5559,4921 CACTAAAGTTGCCTAT-1,1,35,51,5679,4990 GTGCTCAAGTACTGTC-1,1,34,52,5559,5059 CCATGCCTGTTTAGTA-1,1,35,53,5679,5128 TCTAGTTATCAGAAGA-1,1,34,54,5559,5197 TTGTAATCCGTACTCG-1,1,35,55,5679,5266 TCCCAGCTTTAGTCTG-1,1,34,56,5559,5334 CTACGCACGGAGTACC-1,1,35,57,5679,5403 AAATTAACGGGTAGCT-1,1,34,58,5559,5472 CGGCCACGCACAAAGT-1,1,35,59,5679,5541 GAAGCGTGAGGAATTT-1,1,34,60,5559,5610 ATATCTTAGGGCCTTC-1,1,35,61,5679,5678 ACGCGGGCCAAGGACA-1,1,34,62,5559,5747 GCGAGTTCTGCAAAGA-1,1,35,63,5679,5816 TATTCGTGCCAGAATA-1,1,34,64,5559,5885 AGGGCTGCAGTTACAG-1,1,35,65,5679,5954 CTAGCATAGTATAATG-1,1,34,66,5559,6023 TAGGTTCGAGTTCGTC-1,1,35,67,5679,6091 GAATTATAGTGAAAGG-1,1,34,68,5559,6160 CTATCGGGTCTCAACA-1,1,35,69,5679,6229 GCGCTAATTGAATAGA-1,1,34,70,5559,6298 ATGCGACAGTCCCATT-1,1,35,71,5679,6367 GGTAGTGCTCGCACCA-1,1,34,72,5559,6436 AAGCTCGTGCCAAGTC-1,1,35,73,5679,6504 TATTCAATTCTAATCC-1,1,34,74,5559,6573 TTCAAAGTCTCTAGCC-1,1,35,75,5679,6642 TTGAATATGGACTTTC-1,1,34,76,5559,6711 AAGAGCTCTTTATCGG-1,1,35,77,5679,6780 TTACTCCGGCCGGGAA-1,1,34,78,5559,6849 AAACGAGACGGTTGAT-1,1,35,79,5679,6917 GCTAAGTAGTTTCTCT-1,1,34,80,5559,6986 ATAACGCCGGAGGGTC-1,1,35,81,5679,7055 GGATCCGGAATATACT-1,1,34,82,5559,7124 TGAAAGGACCTGACTC-1,1,35,83,5679,7193 TCCGCGGCAGCATCTG-1,1,34,84,5559,7262 TGCATATGTCTGTCAC-1,1,35,85,5679,7330 TGTAGGAGAAATTTCC-1,1,34,86,5559,7399 AGTGAGACTTCCAGTA-1,1,35,87,5679,7468 CCCAAACATGCTGCTC-1,1,34,88,5559,7537 GCTTATGAAGCAGGAA-1,1,35,89,5679,7606 TTCTAACCGAAGCTTA-1,1,34,90,5559,7675 GGATGTCCTTACCGCA-1,1,35,91,5679,7743 AGGGTGCTCTCGAGGG-1,1,34,92,5559,7812 AACTCTCAATAGAGCG-1,1,35,93,5679,7881 TCTGAATTCCGTACAA-1,1,34,94,5559,7950 GCGTGGTACTGGGTTA-1,1,35,95,5679,8019 CGTCGGATAGTGTTGA-1,1,34,96,5559,8088 ATATGTCTCCCTAGCC-1,1,35,97,5679,8156 TCTTTAAGACTATGAA-1,1,34,98,5559,8225 TCATTTAAGTCTCCGA-1,1,35,99,5679,8294 GATATTGAGATTGGCG-1,1,34,100,5559,8363 TGACATCGAGCGGACC-1,1,35,101,5679,8432 GCGTAAATGGCCATAA-1,1,34,102,5559,8500 ATTGTACAACTCGGCT-1,1,35,103,5679,8569 TACGCTATAGAAACCT-1,1,34,104,5559,8638 CACCCAAATCTTATGT-1,1,35,105,5679,8707 AGATGATGGAGTCTGG-1,1,34,106,5559,8776 CCACGGTGCCCGGTAG-1,1,35,107,5679,8845 TCAAGAAATACTAGCT-1,1,34,108,5559,8913 AGGTATAATTGATAGT-1,1,35,109,5679,8982 CAAGGTCCTATAGGCT-1,1,34,110,5559,9051 CCGGCACGACCGTTTC-1,1,35,111,5679,9120 ACCTCCGTTATTCACC-1,1,34,112,5559,9189 GCAGCCTATATCACAT-1,1,35,113,5679,9258 GGTATAGTGACACATA-1,1,34,114,5559,9326 AAATTCCAGGTCCAAA-1,1,35,115,5679,9395 TCTTTAGCAGGCGAAC-1,0,34,116,5559,9464 TATTGACATTTCTGCC-1,0,35,117,5679,9533 TCTGATCGGGTGCTAG-1,0,34,118,5559,9602 GGCCCGGAGCATGTCT-1,0,35,119,5679,9671 GGGCGCAGCGTTACTC-1,0,34,120,5559,9739 TTGGCGATCCGAATAT-1,0,35,121,5679,9808 CCACGTAAATTAGACT-1,0,34,122,5559,9877 TCTGATTGGAAATGGA-1,0,35,123,5679,9946 ATGGCGGAATAGTCGC-1,0,34,124,5559,10015 ATCGCTTTACGTCTCA-1,0,35,125,5679,10084 TACGTGCAAGGTTCCT-1,0,34,126,5559,10152 CAGGACAGCTGCCCTT-1,0,35,127,5679,10221 CAAACCAGGTCTGCAT-1,0,36,0,5799,1480 ACAAGCTATATGGAAG-1,0,37,1,5919,1549 TCGCCCACTGCGAGAG-1,0,36,2,5799,1618 AGCCGCAAATTCAAAT-1,0,37,3,5919,1686 TTAACGTTAAAGCCTG-1,0,36,4,5799,1755 CAGCGCCAACACGATA-1,0,37,5,5919,1824 ATCCAATGGTACCGAA-1,0,36,6,5799,1893 GTGCTGCAGATAAGGA-1,0,37,7,5919,1962 GGCCTTTGCAACTGGC-1,0,36,8,5799,2031 GTCGTACCTACGATTG-1,1,37,9,5919,2099 TAGAAATTCACGTATA-1,0,36,10,5799,2168 AGAATAAATCTTCAGG-1,0,37,11,5919,2237 CATTGCGAAATGGGCG-1,0,36,12,5799,2306 GTCTACTCAATTACAA-1,0,37,13,5919,2375 TGTAATGACCACAATA-1,0,36,14,5799,2444 AAAGTCGACCCTCAGT-1,0,37,15,5919,2512 TACTCGGCACGCCGGG-1,0,36,16,5799,2581 AGGTGTATCGCCATGA-1,0,37,17,5919,2650 TGTGCTTTACGTAAGA-1,0,36,18,5799,2719 AAACCTCATGAAGTTG-1,0,37,19,5919,2788 TATAGGGTACTCATGA-1,0,36,20,5799,2857 CCAGCTGATGGTACTT-1,1,37,21,5919,2925 AATATTGGAGTATTGA-1,1,36,22,5799,2994 GGCCCTCACCCACTTA-1,1,37,23,5919,3063 AACCAAGACTTCTCTG-1,1,36,24,5799,3132 TCGTATTACCCATTGC-1,1,37,25,5919,3201 ATTCGACGCCGGGCCT-1,1,36,26,5799,3269 GGCGCAGGACATCTTC-1,1,37,27,5919,3338 GTACTCCCTTATCGCT-1,1,36,28,5799,3407 TGGTCTGTTGGGCGTA-1,1,37,29,5919,3476 AATAACAACGCTCGGC-1,1,36,30,5799,3545 CATACCCGTACCCAGT-1,1,37,31,5919,3614 ACAATCCATTTAAACC-1,1,36,32,5799,3682 GTTACAATTGGTGACG-1,1,37,33,5919,3751 TTGCCCTGATCACGGG-1,1,36,34,5799,3820 CTAACCGCGCGCCCGT-1,1,37,35,5919,3889 CTAAAGAATGCCTACT-1,1,36,36,5799,3958 ACCCATCTTGAGGGTA-1,1,37,37,5919,4027 GATCTTTGCAGGGTAT-1,1,36,38,5799,4095 GGGTACTTCATGAACT-1,1,37,39,5919,4164 GCCGCTTGTGAGAAAC-1,1,36,40,5799,4233 CCTGTAAGACATGATA-1,1,37,41,5919,4302 CGACAGTTCGCGTTAT-1,1,36,42,5799,4371 ACGATGCATATGTTAT-1,1,37,43,5919,4440 TGTTCCGCTTCCATGA-1,1,36,44,5799,4508 GGATGACGCGAGTTTA-1,1,37,45,5919,4577 GAAGTTTCCACTCAAT-1,1,36,46,5799,4646 GCGAGGCCCGAGCAGA-1,1,37,47,5919,4715 CATACTATGTAATTGT-1,1,36,48,5799,4784 CCAATGTCACAGCAAG-1,1,37,49,5919,4853 GTTGGATTTGCGTTGG-1,1,36,50,5799,4921 GGGAGGATGCCCGAAA-1,1,37,51,5919,4990 GATCGCGGGCTCTCCA-1,1,36,52,5799,5059 GTTCGCCATAAGTGCC-1,1,37,53,5919,5128 AGATTATAGGACGTTT-1,1,36,54,5799,5197 TCGAGACCAACACCGT-1,1,37,55,5919,5266 TATGGGACCGAGCAGG-1,1,36,56,5799,5334 GATGCGTCCTGCATTC-1,1,37,57,5919,5403 TATGGTCTGAGTAACA-1,1,36,58,5799,5472 GCATAGAGCACTCAGG-1,1,37,59,5918,5541 CTTCATTGTCAGTGGA-1,1,36,60,5799,5610 GCAGATTAGGGATATC-1,1,37,61,5918,5679 CCTGTCGCCCGTAAAT-1,1,36,62,5799,5747 CAATTTCGTATAAGGG-1,1,37,63,5918,5816 GTACACTTACCTGAAG-1,1,36,64,5799,5885 CCAGCCTGGACCAATA-1,1,37,65,5918,5954 ATGGAGCAGGCCGTGA-1,1,36,66,5799,6023 GTCATTAGAGCGAACG-1,1,37,67,5918,6091 AAGACTGCAAGCTACT-1,1,36,68,5799,6160 CTAGTCACGTCTTAAG-1,1,37,69,5918,6229 ACTCTTGTATAGTAAC-1,1,36,70,5799,6298 ATTAGGCGATGCTTTC-1,1,37,71,5918,6367 TTCGGGACTAATCGCG-1,1,36,72,5799,6436 TGGACTGTTCGCTCAA-1,1,37,73,5918,6504 AACGTGCGAAAGTCTC-1,1,36,74,5799,6573 CCACCCAAGGAAAGTG-1,1,37,75,5918,6642 CCGCACAAAGACCAAC-1,1,36,76,5799,6711 GCGATTGTTAACGTTA-1,1,37,77,5918,6780 ACTCGTCAGTAATCCC-1,1,36,78,5799,6849 GGTGATAAGGAGCAGT-1,1,37,79,5918,6917 AAGAGGCATGGATCGC-1,1,36,80,5799,6986 CACGTTCGTGCTCTAG-1,1,37,81,5918,7055 CTATTTGGTTACGGAT-1,1,36,82,5799,7124 GTACAGAGGCAAGGGT-1,1,37,83,5918,7193 GGGCCGGCCGAAGTAC-1,1,36,84,5799,7262 CCTGAACGATATATTC-1,1,37,85,5918,7330 CCGGGCTGCTCCATAC-1,1,36,86,5799,7399 TACTTGTTAGTAGTCC-1,1,37,87,5918,7468 CCTAGGCGTAGCGATC-1,1,36,88,5799,7537 CTGGCGCACAGGTCTG-1,1,37,89,5918,7606 ACTTATACTTACCCGG-1,1,36,90,5799,7675 GAAGTCTCCCTAGCGA-1,1,37,91,5918,7743 ACCGATGGTAGCATCG-1,1,36,92,5799,7812 CGAGTTTATCGGACTG-1,1,37,93,5918,7881 CATAACGGACAGTCGT-1,1,36,94,5799,7950 TGACGATGCACTAGAA-1,1,37,95,5918,8019 TAGGGAGCTTGGGATG-1,1,36,96,5799,8088 AGGGTCGATGCGAACT-1,1,37,97,5918,8156 TATATCCCTGGGAGGA-1,1,36,98,5799,8225 CATCTTACACCACCTC-1,1,37,99,5918,8294 GTGCGACAGGGAGTGT-1,1,36,100,5799,8363 CCGATCTCAACCTTAT-1,1,37,101,5918,8432 ACGATCATCTTGTAAA-1,1,36,102,5799,8500 GAAAGAACAGCGTTAT-1,1,37,103,5918,8569 CTAGGTCTGAAGGAAT-1,1,36,104,5799,8638 ATATCAACCTACAGAG-1,1,37,105,5918,8707 AAATAGCTTAGACTTT-1,1,36,106,5799,8776 GCGACATGTAAACATC-1,1,37,107,5918,8845 ATAAGTAGGGCGACTC-1,1,36,108,5799,8913 GCGAGCGCATGCTCCC-1,1,37,109,5918,8982 AGGGACCGGCTGCGTT-1,1,36,110,5799,9051 CCTATGAAGTGGTGCC-1,1,37,111,5918,9120 GCTTACGTAGTTAGTA-1,1,36,112,5799,9189 CATACTTAGGCAATAC-1,1,37,113,5918,9258 CCTGTCCCTCACGTTA-1,1,36,114,5799,9326 CAATGTGCCAACCCTT-1,1,37,115,5918,9395 GTTAAGTTAGAGTGGG-1,0,36,116,5799,9464 CTGGGATACGCTACCC-1,0,37,117,5918,9533 AACCTGTCACGGAATT-1,0,36,118,5799,9602 ACTGCGGACACACCGT-1,0,37,119,5918,9671 CCGTGAGGCATTCATG-1,0,36,120,5799,9739 GCCCAGATGCTGGAGA-1,0,37,121,5918,9808 TCTGGCCGTTCAAGTT-1,0,36,122,5799,9877 ATACGAAGGCTTTCCA-1,0,37,123,5918,9946 GATCCGAATATAAGTG-1,0,36,124,5799,10015 GTGGAGCATGTCGGCC-1,0,37,125,5918,10084 ACTCTTCAGCTCCCGC-1,0,36,126,5799,10152 CCCGATAGCCTCGCCT-1,0,37,127,5918,10221 ACAGGTGTGTTGTTGC-1,0,38,0,6038,1480 TGAACTGCTATGACTT-1,1,39,1,6158,1549 TGACATATATGACGAT-1,1,38,2,6038,1618 AAGTCTTCTGTGGCCT-1,1,39,3,6158,1686 ACCAGACCATAACAAC-1,1,38,4,6038,1755 TGAGACGTACCTCTCA-1,1,39,5,6158,1824 GACCGTTACATGCGAC-1,1,38,6,6038,1893 GGTTCGGATTATACTA-1,1,39,7,6158,1962 CCTCCTGAGCCCACAT-1,1,38,8,6038,2031 CCGCGATTTGGTAGGT-1,1,39,9,6158,2099 AATCTCTACTGTGGTT-1,1,38,10,6038,2168 ACTTTGACTGCATCCT-1,1,39,11,6158,2237 CCCTGACTAACAAATT-1,0,38,12,6038,2306 ACGCTGTGAGGCGTAG-1,1,39,13,6158,2375 GCATACGAGGTCTTTA-1,0,38,14,6038,2444 TCGGGATTCAAACATA-1,0,39,15,6158,2512 GGGCCCTACGAAAGGG-1,0,38,16,6038,2581 CGCCAAGAAGCCGAGT-1,0,39,17,6158,2650 GGTACATCTGGGACGA-1,0,38,18,6038,2719 GGATGCTGGCGTTCCT-1,0,39,19,6158,2788 CCGATTCGAGGGACCC-1,1,38,20,6038,2857 CCACTGGTGGCTGGTT-1,1,39,21,6158,2925 GACAGGCACACACTAT-1,1,38,22,6038,2994 TCAACGCGACCGGCAG-1,1,39,23,6158,3063 CTACGACTAGCTATAA-1,1,38,24,6038,3132 CGGTTGACCTGGCATA-1,1,39,25,6158,3201 ATCCTGAATCGCTGCG-1,1,38,26,6038,3269 GTTTCATATCGTCGCT-1,1,39,27,6158,3338 ATAAATATTAGCAGCT-1,1,38,28,6038,3407 AAGAGGATGTACGCGA-1,1,39,29,6158,3476 TCCTGCGTTGATACTC-1,1,38,30,6038,3545 CGTGCATTGTCGACGC-1,1,39,31,6158,3614 CCGGGTTCGAGGTTAC-1,1,38,32,6038,3682 CCCAATTTCACAACTT-1,1,39,33,6158,3751 TGATTTATTAGCTGTG-1,1,38,34,6038,3820 TGGAAGAAGGGAACGT-1,1,39,35,6158,3889 GACGCTTGCTTCTAAA-1,1,38,36,6038,3958 GGGAACGGGAGGTTAG-1,1,39,37,6158,4027 GCGGCTCTGACGTACC-1,1,38,38,6038,4095 ACGTTAGATTTGCCCG-1,1,39,39,6158,4164 GAGAGGGCGCGAGGTT-1,1,38,40,6038,4233 GCGTCTCTGCATTGGG-1,1,39,41,6158,4302 GCAGCACACAGCCCAG-1,1,38,42,6038,4371 CAGGCCGTTTGGGTGT-1,1,39,43,6158,4440 AACTCAAGTTAATTGC-1,1,38,44,6038,4508 CTTCGTAGATAGGTGA-1,1,39,45,6158,4577 TGCAGAGTACCGAGCA-1,1,38,46,6038,4646 GAAGTGATTTATCGTG-1,1,39,47,6158,4715 CGCTACGGGACATTTA-1,1,38,48,6038,4784 CCACACTGAGATATTA-1,1,39,49,6158,4853 CGATCCGACCCAGTGC-1,1,38,50,6038,4921 CTGTACTTCTTAGCAT-1,1,39,51,6158,4990 ACTTATTAGGATCGGT-1,1,38,52,6038,5059 TAGTCCGCAGAGAATG-1,1,39,53,6158,5128 TTCACGAAAGGATCAC-1,1,38,54,6038,5197 TACATTTCTAACGTGC-1,1,39,55,6158,5266 ACCATATCCGCAATAA-1,1,38,56,6038,5334 CACTCAAGAGCTATGG-1,1,39,57,6158,5403 TGTACGAACAAATCCG-1,1,38,58,6038,5472 ATCATCCAATATTTGT-1,1,39,59,6158,5541 CGCTATTCTTAGGCTC-1,1,38,60,6038,5610 TGGCAGCAGTAATAGT-1,1,39,61,6158,5679 TCACGTGCCCGATTCA-1,1,38,62,6038,5747 CATACGGCGTCTGGGC-1,1,39,63,6158,5816 CACATGATTCAGCAAC-1,1,38,64,6038,5885 GCTAGTAGAGCTTGTA-1,1,39,65,6158,5954 TGCTGTTGAAGAACTC-1,1,38,66,6038,6023 CGGAGCATGGCGATCC-1,1,39,67,6158,6091 TAGCGTTGGGTCTTAC-1,1,38,68,6038,6160 GTAGCGGCTATACACT-1,1,39,69,6158,6229 TAACATACAATGTGGG-1,1,38,70,6038,6298 TCTTCGAATAGACGTT-1,1,39,71,6158,6367 GATCGTGACTGATATC-1,1,38,72,6038,6436 GATCCGGGAATTAACA-1,1,39,73,6158,6504 TTATATACGCTGTCAC-1,1,38,74,6038,6573 GTCGCGTAACCCGTTG-1,1,39,75,6158,6642 AGCTCTAGACGTTCCA-1,1,38,76,6038,6711 GTCAAGCGGACTCGGG-1,1,39,77,6158,6780 CGAGGGACTGCGGTCG-1,1,38,78,6038,6849 AATCGCCTCAGCGCCA-1,1,39,79,6158,6917 CTTGTTGCTGAGTCAA-1,1,38,80,6038,6986 GATATGAGACACTAAC-1,1,39,81,6158,7055 TTATGATCTTAACGAA-1,1,38,82,6038,7124 CGCCGCCCATGCCTGT-1,1,39,83,6158,7193 CTGGGATAAATAATGG-1,1,38,84,6038,7262 GTGCCCGTTCGGATTC-1,1,39,85,6158,7330 TTCAATACTCTGAATC-1,1,38,86,6038,7399 CGCACATGTCCACTAC-1,1,39,87,6158,7468 AGAAGAGCGCCGTTCC-1,1,38,88,6038,7537 GATAACTCGCACTGTG-1,1,39,89,6158,7606 AGTCGACGGTCTCAAG-1,1,38,90,6038,7675 GTGACCGCACACTACG-1,1,39,91,6158,7743 GTATGTGGGTCTAGTT-1,1,38,92,6038,7812 CTTGAGTTAGGGTAAT-1,1,39,93,6158,7881 TTAGCTGATTTGCCGT-1,1,38,94,6038,7950 GCTGTTGCTACCGAAC-1,1,39,95,6158,8019 TATTACCATCCTGCTT-1,1,38,96,6038,8088 TTGAATTCACGTGAGG-1,1,39,97,6158,8156 CCATCTCACCAGTGAA-1,1,38,98,6038,8225 CGCACGTGCGCTATCA-1,1,39,99,6158,8294 ACCCGGATGACGCATC-1,1,38,100,6038,8363 CGCTAGAGACCGCTGC-1,1,39,101,6158,8432 ATAGTTCCACCCACTC-1,1,38,102,6038,8501 GCAGACCCAGCACGTA-1,1,39,103,6158,8569 TAGACTACCTAGCGTT-1,1,38,104,6038,8638 GGTTCTACTCGTCTGA-1,1,39,105,6158,8707 GACTCACCCACGTGAG-1,1,38,106,6038,8776 AGCTCTTCGTAACCTT-1,1,39,107,6158,8845 ACTATCCAGGGCATGG-1,1,38,108,6038,8913 AAGGATCGATCGCTTG-1,1,39,109,6158,8982 ATATCGGTAGGGAGAT-1,1,38,110,6038,9051 TTCCAGACGAGATTTA-1,1,39,111,6158,9120 GACCGACGTGAAAGCA-1,1,38,112,6038,9189 CCTGGAAACGTTCTGC-1,1,39,113,6158,9258 CCGGTAATGGCTAGTC-1,1,38,114,6038,9326 GCCGTGGAAGAAATGT-1,1,39,115,6158,9395 GTCTTGAGGAGCAGTG-1,0,38,116,6038,9464 TCCCAAAGCCCTAAAT-1,0,39,117,6158,9533 TTGAGCGCCACGTGAT-1,0,38,118,6038,9602 TTGAGTCCCGCTGCTG-1,0,39,119,6158,9671 ATGGAACCTTTGCACA-1,0,38,120,6038,9739 GCTAGCACCTGGGCCA-1,0,39,121,6158,9808 CGCCGTCTACCCATCG-1,0,38,122,6038,9877 GATAGGTGTCCCGGGC-1,0,39,123,6158,9946 AGGTATGCGGACATTA-1,0,38,124,6038,10015 TTGGTTCGCTCAAAGG-1,0,39,125,6158,10084 TCTGGAGCGTAAGAGT-1,0,38,126,6038,10152 TGCCTAAATTTAATAG-1,0,39,127,6158,10221 TAATTTCCGTCCAGTA-1,1,40,0,6278,1480 TCCTTCAATCCCTACG-1,1,41,1,6398,1549 TACCTATCCCTAGAGG-1,1,40,2,6278,1618 GCATGGGTACTGACGC-1,1,41,3,6398,1686 GTCGGGAACATGGTAG-1,1,40,4,6278,1755 GCAAATGAGGACACTT-1,1,41,5,6398,1824 GAATGGGCTTATCGAC-1,1,40,6,6278,1893 TGGTCGTGCAAGGCAA-1,1,41,7,6398,1962 CACCACGCCACACAGA-1,1,40,8,6278,2031 GAACCTCGACCTACAC-1,1,41,9,6398,2099 CAATACGCTCTGAGGC-1,1,40,10,6278,2168 TGGTAAGCAGGATTGA-1,1,41,11,6398,2237 AGTGGCTCCGTCGGCC-1,1,40,12,6278,2306 GATCGGATAGAACCAT-1,1,41,13,6398,2375 GCTACAGTACGGACCG-1,1,40,14,6278,2444 TCTATTACTAGAGGAT-1,1,41,15,6398,2512 TTCAGGCGTCAAAGCC-1,1,40,16,6278,2581 AGACCGGGAAACCCTG-1,1,41,17,6398,2650 AGAGATCTCTAAAGCG-1,1,40,18,6278,2719 CCCTGCCCAATCCGCT-1,1,41,19,6398,2788 GTGGCGGTCCCAGCGT-1,1,40,20,6278,2857 GCATTGTAATTCATAT-1,1,41,21,6398,2925 CCGTTCCGAATCTCGG-1,1,40,22,6278,2994 AGCTTGATCTTAACTT-1,1,41,23,6398,3063 CCTGTACTCACGCCCA-1,1,40,24,6278,3132 AAGTGACGACCGAATT-1,1,41,25,6398,3201 CTCACTTGGCTGGTAA-1,1,40,26,6278,3270 CGCCTGGCCTACGTAA-1,1,41,27,6398,3338 CCCGTAAGTCTAGGCC-1,1,40,28,6278,3407 TTGGACATGTGGCTTA-1,1,41,29,6398,3476 ATTACGCGCTGGCAGG-1,1,40,30,6278,3545 ACGCGCTACACAGGGT-1,1,41,31,6398,3614 TACGTTTACCGGCAAT-1,1,40,32,6278,3682 CGAAACGCAATTCATG-1,1,41,33,6398,3751 TAGTCTAACAACGAGA-1,1,40,34,6278,3820 TTGCATGCTGATCACG-1,1,41,35,6398,3889 TCTGGGTAGCGCTCAT-1,1,40,36,6278,3958 ACATCGGTCAGCCGCG-1,1,41,37,6398,4027 AGATACCGGTGTTCAC-1,1,40,38,6278,4095 GATTACTGAATTTGGG-1,1,41,39,6398,4164 TCCAACTTTAAATTCT-1,1,40,40,6278,4233 TCCTAGCAAAGAAGCT-1,1,41,41,6398,4302 GTCTATCTGAGTTTCT-1,1,40,42,6278,4371 GATGTTCAATCCACGA-1,1,41,43,6398,4440 AGTTAAACACTTGCGA-1,1,40,44,6278,4508 AGCTCTTTACTCAGTT-1,1,41,45,6398,4577 ATCCAGGATTCGTGAA-1,1,40,46,6278,4646 AGTCAACACCACCATC-1,1,41,47,6398,4715 CGATACCTCGCGGACA-1,1,40,48,6278,4784 TACAACGCACAACTCA-1,1,41,49,6398,4853 AATTAAAGGTCGGCGT-1,1,40,50,6278,4921 TACGCAGTTCTTTCCT-1,1,41,51,6398,4990 GACCGTGCTGACGGTG-1,1,40,52,6278,5059 GGCAAATTACTTTACT-1,1,41,53,6398,5128 GGTACAAACATGCTAT-1,1,40,54,6278,5197 CGGGCCTTCTTTGTAA-1,1,41,55,6398,5266 CGTGAAGTTAATTCAC-1,1,40,56,6278,5334 ATAGTGAAGCGTTCTC-1,1,41,57,6398,5403 TACGCCATATTCTAAT-1,1,40,58,6278,5472 GCCGGGTTAGGGTCGC-1,1,41,59,6398,5541 TACATAGGCATACACC-1,1,40,60,6278,5610 GCCGATTGGCCAAGCT-1,1,41,61,6398,5679 CTGCCATGCATCACAT-1,1,40,62,6278,5747 TTATGAATGAAAGGGA-1,1,41,63,6398,5816 GCTGAGGCGTGAGTAT-1,1,40,64,6278,5885 GCGCCGTTCCACGATA-1,1,41,65,6398,5954 CGCATGGTGCGATGCT-1,1,40,66,6278,6023 AGGTTTCACACACCTT-1,1,41,67,6398,6091 CAAGGATCGCATGTTC-1,1,40,68,6278,6160 ACGTTAATGTCGAAGA-1,1,41,69,6398,6229 TCCAGAGCACCGGTTC-1,1,40,70,6278,6298 GATTCGACGGTTCACG-1,1,41,71,6398,6367 GTTTCTGCAGTCTCCC-1,1,40,72,6278,6436 GCTGCACGGTTTCTTA-1,1,41,73,6398,6504 CGTGCAGACTGGGACA-1,1,40,74,6278,6573 GTGTTACTATGCGTCC-1,1,41,75,6398,6642 TCCTCGGGCTGGGCTT-1,1,40,76,6278,6711 GTGAGGACACTTAAGG-1,1,41,77,6398,6780 ATACGCCGGCGAAACC-1,1,40,78,6278,6849 TCTGCCAGAAACTGCA-1,1,41,79,6397,6917 TTCTGCGGGTTAGCGG-1,1,40,80,6278,6986 CTCGGTACCACTGCTC-1,1,41,81,6397,7055 GTAAGTAACAGTCTGG-1,1,40,82,6278,7124 GTGCGTGTATATGAGC-1,1,41,83,6397,7193 ATTTGTCTTGGGAGCT-1,1,40,84,6278,7262 CCTCGGACCGGGATAG-1,1,41,85,6397,7330 TAGGTGCTCGCCTAGC-1,1,40,86,6278,7399 CTTTAGGAACACTGTT-1,1,41,87,6397,7468 TCGGGCCGTCGTGGTA-1,1,40,88,6278,7537 AGTGCTTGCACGAATA-1,1,41,89,6397,7606 TGCAGTTTCCTCCCAT-1,1,40,90,6278,7675 TGAGAGATTTACCACG-1,1,41,91,6397,7743 GAAACAGATGACCACC-1,1,40,92,6278,7812 AGCAACATATCTTATT-1,1,41,93,6397,7881 CAAGTGTGGTTGCAAA-1,1,40,94,6278,7950 GCCTCATCTGGAAATA-1,1,41,95,6397,8019 AACCCTACTGTCAATA-1,1,40,96,6278,8088 ACGTATTACTCCGATC-1,1,41,97,6397,8156 TCTGGGAACCTTTGAA-1,1,40,98,6278,8225 GCTCGCTCATGTCCAA-1,1,41,99,6397,8294 GCGCAAGAGCGCGCTG-1,1,40,100,6278,8363 TTGACGCTCCATGAGC-1,1,41,101,6397,8432 TATAGATGGTCGCAGT-1,1,40,102,6278,8501 TTACATGCCACAACTA-1,1,41,103,6397,8569 ACATGGCGCCAAAGTA-1,1,40,104,6278,8638 TATGGTTAGTGGGAGA-1,1,41,105,6397,8707 CATGACTTCGCTGAAT-1,1,40,106,6278,8776 ACCACCAATGTAACAA-1,1,41,107,6397,8845 TCTTAGAGCTCCAATT-1,1,40,108,6278,8913 CCACGAATTTAACCTC-1,1,41,109,6397,8982 TTCTTGCTAGCATCTC-1,1,40,110,6278,9051 ACACCTTACTACTTGC-1,1,41,111,6397,9120 AGTCGGTTGCGTGAGA-1,1,40,112,6278,9189 ACCTACAGTATGTGGT-1,1,41,113,6397,9258 GAGGATAAACAGTGCT-1,1,40,114,6278,9326 TTCCGGTATCTGTGTC-1,0,41,115,6397,9395 GGAGGCCGAAGTCGTC-1,0,40,116,6278,9464 TTCGCTAGGAAGTTGT-1,0,41,117,6397,9533 TAAAGACAACCCTTTA-1,0,40,118,6278,9602 GTTGCGCTAACATTAC-1,0,41,119,6397,9671 GCTGAACTCTCCAGGG-1,0,40,120,6278,9739 AGCCCTGTCGCACCGT-1,0,41,121,6397,9808 AGCGCTAGAGCGATGT-1,0,40,122,6278,9877 TGCGCCGTTAATAACG-1,0,41,123,6397,9946 TGACAACGCATGTCGC-1,0,40,124,6278,10015 CGTCTTGAGTGTGACG-1,0,41,125,6397,10084 GATAGGATTAATTACA-1,0,40,126,6278,10152 GATACCGTGTCGGAGT-1,0,41,127,6397,10221 TGTGTCGAAGTCGAGG-1,1,42,0,6517,1480 GGATCAGAGCCATCAG-1,1,43,1,6637,1549 GTCCCAATCATCCCGC-1,1,42,2,6517,1618 TGCCACACTAGAGGAA-1,1,43,3,6637,1686 TGAATTTCACTTGCCT-1,1,42,4,6517,1755 CTCAGATTGTGATAAG-1,1,43,5,6637,1824 CGGACGTTACTTGAAG-1,1,42,6,6517,1893 CCGCCTTGCGATGTCG-1,1,43,7,6637,1962 CCAGTCAAATCTCTTA-1,1,42,8,6517,2031 AAACAGCTTTCAGAAG-1,1,43,9,6637,2099 TAGCTGATGTGAAGCG-1,1,42,10,6517,2168 CTTATGCGCTCAGGGC-1,1,43,11,6637,2237 TGGCTCTTGTCGCGTA-1,1,42,12,6517,2306 TTGTGAGGCATGACGC-1,1,43,13,6637,2375 CATAAGCTCTCCGTCT-1,1,42,14,6517,2444 CCTTCTCAGCGTTCCT-1,1,43,15,6637,2512 TGCAGCTACGTACTTC-1,1,42,16,6517,2581 CTCTACACTGGCGATT-1,1,43,17,6637,2650 TGCAGATCGTCCTAGG-1,1,42,18,6517,2719 TGCCAAAGTCAGACTT-1,1,43,19,6637,2788 ACAATAGTCGTACGTT-1,1,42,20,6517,2857 CATGCCAACTCGCAAA-1,1,43,21,6637,2925 TGCAGAACTATATCGT-1,1,42,22,6517,2994 TCGTGTCACGCTGACA-1,1,43,23,6637,3063 TGATCAGGGAACTGCT-1,1,42,24,6517,3132 CTTGCAACCGCCTCCT-1,1,43,25,6637,3201 AGCCCATACATGTAAG-1,1,42,26,6517,3270 ATCCAATGGAGGGTCC-1,1,43,27,6637,3338 AAACCGGGTAGGTACC-1,1,42,28,6517,3407 GCAACCACGGCCGCGT-1,1,43,29,6637,3476 CGCTTATTCCCGGTCG-1,1,42,30,6517,3545 TTACTCTGGTACGTAC-1,1,43,31,6637,3614 GTGGTTTCCGCCTTTC-1,1,42,32,6517,3682 ATAGGCGGCTATAGAA-1,1,43,33,6637,3751 GTGCCATCACACGGTG-1,1,42,34,6517,3820 CCCAACATACGTCGCG-1,1,43,35,6637,3889 CGGTGCAGATAGAACG-1,1,42,36,6517,3958 GGGCGGGTTCCCTACG-1,1,43,37,6637,4027 TGAGCCATACAGTCTC-1,1,42,38,6517,4095 CTCCGCCCACATGAGG-1,1,43,39,6637,4164 GTTGAACCGGTTCCAT-1,1,42,40,6517,4233 TTGACTACCATATGGT-1,1,43,41,6637,4302 ACCATCGTATATGGTA-1,1,42,42,6517,4371 TGCGTAAGAACCTGAT-1,1,43,43,6637,4440 AGAAGGTTGCCGAATT-1,1,42,44,6517,4508 AGGACGACCCATTAGA-1,1,43,45,6637,4577 GGTGCTGGTACACATT-1,1,42,46,6517,4646 GCGCTATGCCGAGGCA-1,1,43,47,6637,4715 ACCCGGTTACACTTCC-1,1,42,48,6517,4784 TAACTCATCCGCGCGG-1,1,43,49,6637,4853 CACAATGAGCTGCTAT-1,1,42,50,6517,4921 GTTACTTTGGGCCTAG-1,1,43,51,6637,4990 GGGCCCGTCTTAAACA-1,1,42,52,6517,5059 GAAATTGTCTCTATAA-1,1,43,53,6637,5128 GGCGCATGAATTGATG-1,1,42,54,6517,5197 CATATAGGTACAGTCA-1,1,43,55,6637,5266 TCAACGAGGAGACAAA-1,1,42,56,6517,5334 TTGCACAATTCAGAAA-1,1,43,57,6637,5403 CATCGGACGGGTTAAT-1,1,42,58,6517,5472 ATTAAACATGCGGACC-1,1,43,59,6637,5541 TATCTACCACAGCGGG-1,1,42,60,6517,5610 CGAGACCCTAGAGTGT-1,1,43,61,6637,5679 ACATCGATCGTTTACC-1,1,42,62,6517,5747 ATCGACCCAATACAGA-1,1,43,63,6637,5816 GAATCTGAACATTCTC-1,1,42,64,6517,5885 AGTTCCTATTTATGTT-1,1,43,65,6637,5954 CAGTCTGTATACTGGG-1,1,42,66,6517,6023 GGAGACGACACCTTTG-1,1,43,67,6637,6092 CCTAAATTAACGGTTC-1,1,42,68,6517,6160 GCTACGACTTATTGGG-1,1,43,69,6637,6229 CTGTGCAGGGTAGGTC-1,1,42,70,6517,6298 ACGCCGCTAGACGACC-1,1,43,71,6637,6367 ACTTGACTCCCTCTTT-1,1,42,72,6517,6436 CGCCTCCCTCCTCTAT-1,1,43,73,6637,6504 CTAGATTTACGACGGC-1,1,42,74,6517,6573 GATGCTGTATTTCATC-1,1,43,75,6637,6642 TGCGTTTGTTGACACT-1,1,42,76,6517,6711 CGTGCCCTCCCGAAGA-1,1,43,77,6637,6780 ACTCTCTGACTTAGGT-1,1,42,78,6517,6849 CTGGGTAGGCAGTTAA-1,1,43,79,6637,6917 GTTTGGCCCAAGTTAT-1,1,42,80,6517,6986 GAATGTGGTCCGGATT-1,1,43,81,6637,7055 CCCAGTTAAGGCGCCG-1,1,42,82,6517,7124 CGGTACTAGAATCAAA-1,1,43,83,6637,7193 GCTTAATGTAACTAAC-1,1,42,84,6517,7262 AGGACAGTCGAATCCC-1,1,43,85,6637,7330 GACAGCCAGACCTGAC-1,1,42,86,6517,7399 GGCGAAATCTAACTTG-1,1,43,87,6637,7468 CTGGTAACACATAGAA-1,1,42,88,6517,7537 TAGCCATTTCAAAGTC-1,1,43,89,6637,7606 GGGATTTACCGCACCT-1,1,42,90,6517,7675 ATGCCATTTGCGACCA-1,1,43,91,6637,7743 GAATAGACGCGACCCA-1,1,42,92,6517,7812 TGTATGGCGCAGACAG-1,1,43,93,6637,7881 GGATGAAGATCGCTGA-1,1,42,94,6517,7950 CGACAATTTGATCTAA-1,1,43,95,6637,8019 AAAGTTGACTCCCGTA-1,1,42,96,6517,8088 CGCGGCTCAACTTGAA-1,1,43,97,6637,8156 CACGCGGAACTGTTGC-1,1,42,98,6517,8225 TCTTAGAGTGAACTCT-1,1,43,99,6637,8294 AGTCCATTGGCTGATG-1,1,42,100,6517,8363 TTAAGATAGGATTGAC-1,1,43,101,6637,8432 ACATCCTGGTAACTGT-1,1,42,102,6517,8501 CACCTTGGCGCCTTTG-1,1,43,103,6637,8569 GCTAGACCGTCTACTG-1,1,42,104,6517,8638 CGGCCCAGGTATATCC-1,1,43,105,6637,8707 GTCCATTACTGCTACG-1,1,42,106,6517,8776 GGGTTTAGGATAGGAT-1,1,43,107,6637,8845 TAATTAGGACATCCGT-1,1,42,108,6517,8913 GCTCCCAGTCGGTCCA-1,1,43,109,6637,8982 ATTCGTGCTATCTCTT-1,1,42,110,6517,9051 GTTAACTATGTTGTCA-1,1,43,111,6637,9120 GCTCCGCTCGCTTCAG-1,1,42,112,6517,9189 GCAACGGCTAGTTATG-1,1,43,113,6637,9258 AATCGCGCAGAGGACT-1,1,42,114,6517,9326 AGGTTACACCATGCCG-1,1,43,115,6637,9395 CGAGATTTCGCTCGGG-1,0,42,116,6517,9464 CGATAATACTCAGGTT-1,0,43,117,6637,9533 AAGGCAGGCTGTCTCC-1,0,42,118,6517,9602 GTAAGTCCACACTCTA-1,0,43,119,6637,9671 ATGAGGGCAGCGGCTA-1,0,42,120,6517,9739 GCCGCACTCCGTTTCA-1,0,43,121,6637,9808 GAGCACGGCGCCTCTT-1,0,42,122,6517,9877 ACAATTTGGCCATATT-1,0,43,123,6637,9946 CTGGTTCGCGAGCTAC-1,0,42,124,6517,10015 GACGGTCCTAGGGTGT-1,0,43,125,6637,10084 ACTCGCGATCTGACGC-1,0,42,126,6517,10152 GTGTACGAACCGTTCC-1,0,43,127,6637,10221 CTTTGACGTCGCTTCT-1,1,44,0,6757,1480 CGTTATCATACTTCCA-1,1,45,1,6877,1549 GCTATGCCAGCTTATG-1,1,44,2,6757,1618 CAGTCGGCCTAGATAT-1,1,45,3,6877,1686 CCCGTGAGGGCGGTGA-1,1,44,4,6757,1755 TCTCGTGTTACGAGGA-1,1,45,5,6877,1824 ACGTCTCGTTCCGGGA-1,1,44,6,6757,1893 CGAGAGCGCGTAGATA-1,1,45,7,6877,1962 GACAGATTTCTGGCTC-1,1,44,8,6757,2031 GGGCCTAAATGGGCTA-1,1,45,9,6877,2099 ACTTGTAGTCCCTTCA-1,1,44,10,6757,2168 CCCGAAGTTTCGCGAA-1,1,45,11,6877,2237 ACCATCCGCCAACTAG-1,1,44,12,6757,2306 TGCGAATATGGGATTT-1,1,45,13,6877,2375 TACATCCCTATCCCTG-1,1,44,14,6757,2444 GTGGGAAGACTGAATC-1,1,45,15,6877,2512 TCAACATCGACCGAGA-1,1,44,16,6757,2581 CTATGTGAGTCACGGC-1,1,45,17,6877,2650 CCGAACACTGGGCCTC-1,1,44,18,6757,2719 AAACTTGCAAACGTAT-1,1,45,19,6877,2788 AGGGCGAGCAGCTGAT-1,1,44,20,6757,2857 AACACGAGACGCGGCC-1,1,45,21,6877,2925 TGACGAATATTTCCCT-1,1,44,22,6757,2994 TCGGAGAGTATCGGGA-1,1,45,23,6877,3063 CAAATCTCTCACAAGG-1,1,44,24,6757,3132 AGGCCCTAGAACGCCA-1,1,45,25,6877,3201 TAGAGATCATGCAACT-1,1,44,26,6757,3270 TTGTTTCCATACAACT-1,1,45,27,6877,3338 GAGAGGTGCATTCTGG-1,1,44,28,6757,3407 GTGGACCAACCCGATT-1,1,45,29,6877,3476 CTGGGCCTGCTATATC-1,1,44,30,6757,3545 CATAGTCCACAAGAAC-1,1,45,31,6877,3614 TTGACATGAACGTGGA-1,1,44,32,6757,3682 GGTTACCACCCTCGGG-1,1,45,33,6877,3751 TACCGGTCGTTTCCAT-1,1,44,34,6757,3820 CGAGTACTAAAGAGGA-1,1,45,35,6877,3889 GCAAGAATTCCTTGGC-1,1,44,36,6757,3958 TCGCCGAAGTTGCGTC-1,1,45,37,6877,4027 TTGAGAGTACTGCTAA-1,1,44,38,6757,4095 GCCACAATTTAAGGAC-1,1,45,39,6877,4164 ATATTCAGTTAAACCT-1,1,44,40,6757,4233 TGAGTGCCTCTTAAAT-1,1,45,41,6877,4302 ATCAGACGGCACGCCG-1,1,44,42,6757,4371 GTGCGAAATCGAACAC-1,1,45,43,6877,4440 GTGCCGCTTCAAAGGT-1,1,44,44,6757,4508 GATACGATGGGAGTCA-1,1,45,45,6877,4577 GACACTGAGTTCAGTG-1,1,44,46,6757,4646 ATCCTGCGTGGAATGG-1,1,45,47,6877,4715 ATCCTACCTAAGCTCT-1,1,44,48,6757,4784 AGTGATATGAGTAGTT-1,1,45,49,6877,4853 ATGATGCAATGGTACA-1,1,44,50,6757,4921 GAAACCGAATTACCTT-1,1,45,51,6877,4990 AGTGACCTACTTTACG-1,1,44,52,6757,5059 CAAATGTCCTTCCGTG-1,1,45,53,6877,5128 TTACTGGGATATTTCA-1,1,44,54,6757,5197 CTTGCCCAGGCTCTAC-1,1,45,55,6877,5266 AAATCGTGTACCACAA-1,1,44,56,6757,5334 GTGATCATAGATCTGC-1,1,45,57,6877,5403 TGGCAGATTACGATCA-1,1,44,58,6757,5472 TCACCCTCTTAAGATT-1,1,45,59,6877,5541 CAGGATATATCGTTGT-1,1,44,60,6757,5610 CCTGACCACCGATGGT-1,1,45,61,6877,5679 CTAAAGGGAAATAGGA-1,1,44,62,6757,5747 CCGCTATCAGCACCAG-1,1,45,63,6877,5816 CTTTAGTGCTATTATT-1,1,44,64,6757,5885 CGGGAATTTATGTAAA-1,1,45,65,6877,5954 TACGACTGCCTCTTAG-1,1,44,66,6757,6023 AAACTGCTGGCTCCAA-1,1,45,67,6877,6092 GTACGTTTGCCCGTCA-1,1,44,68,6757,6160 GGCAAGGCGAAATAGC-1,1,45,69,6877,6229 GATCTTGGAGGGCATA-1,1,44,70,6757,6298 AGCGTGGTATTCTACT-1,1,45,71,6877,6367 CTAAGGGAATGATTGG-1,1,44,72,6757,6436 CATGGTAAGTAGCGTT-1,1,45,73,6877,6504 CGTTGAGCGACCGTCG-1,1,44,74,6757,6573 TGCCCGTACCGTTAAA-1,1,45,75,6877,6642 ACAAGGGCAGGCTCTG-1,1,44,76,6757,6711 GAGATCTTCCATGACA-1,1,45,77,6877,6780 AATGACGTAGGATGTC-1,1,44,78,6757,6849 GTGGTGGCCAAGTGAA-1,1,45,79,6877,6917 TCCCGTGTGCAATTTG-1,1,44,80,6757,6986 ACATCGTATGCAATGG-1,1,45,81,6877,7055 GCGAAACTTAACTGGA-1,1,44,82,6757,7124 AATTGAACGCTCTGGT-1,1,45,83,6877,7193 ACAAATGGTAGTGTTT-1,1,44,84,6757,7262 ATGGTCGCGTGGTTTC-1,1,45,85,6877,7330 TGTTATTGTATGTGGC-1,1,44,86,6757,7399 TTCCGGTTACCCACTT-1,1,45,87,6877,7468 GAGTGTGCGGTACCCA-1,1,44,88,6757,7537 CAAGATATTATAACGT-1,1,45,89,6877,7606 ACACACCAGGACCAGT-1,1,44,90,6757,7675 ATGGGCCTCGGCCTCT-1,1,45,91,6877,7743 AAGGTGATAAACCAGC-1,1,44,92,6757,7812 TCTTACTTATGCCTCT-1,1,45,93,6877,7881 AAAGTGTGATTTATCT-1,1,44,94,6757,7950 TGCTCCACAGTTCTTA-1,1,45,95,6877,8019 CTGGCTGATTCATCCT-1,1,44,96,6757,8088 TAAGGCTGAATCCCTC-1,1,45,97,6877,8156 TCTAGTGATATCGTGG-1,1,44,98,6757,8225 TCGAAGAACCGAGCAC-1,1,45,99,6876,8294 GACAAACATATGCAGG-1,1,44,100,6757,8363 AAGTCAATTGTCGTCA-1,1,45,101,6876,8432 AGTGAACAAACTTCTC-1,1,44,102,6757,8501 CATGATGGAAGTTAGC-1,1,45,103,6876,8569 AAGTGCCTTGACTGTA-1,1,44,104,6757,8638 ATCGCCAGTCAACATT-1,1,45,105,6876,8707 ACCGCGGTGGAAGTCG-1,1,44,106,6757,8776 TCTTCTATAACCCGCC-1,1,45,107,6876,8845 CACATTTCTTGTCAGA-1,1,44,108,6757,8914 TAGCGTCCCTCGATTG-1,1,45,109,6876,8982 GTTCGGATCGGGAACA-1,1,44,110,6757,9051 CAAACTCGCGACGCCG-1,1,45,111,6876,9120 GTCTTGTAGCTATTCA-1,1,44,112,6757,9189 TCTCGACGTATCGCCG-1,1,45,113,6876,9258 TTGCCAAGCAGAACCC-1,1,44,114,6757,9326 AAACCCGAACGAAATC-1,0,45,115,6876,9395 TTGAGCAGCCCACGGT-1,0,44,116,6757,9464 CGCCTTTAGCATGCTC-1,0,45,117,6876,9533 TGTGGCTCCCACCAAC-1,0,44,118,6757,9602 CCGCCGTTGAGGATAA-1,0,45,119,6876,9671 CAATACGAGAGTCTGA-1,0,44,120,6757,9739 CATCTAGTGAAGGGAA-1,0,45,121,6876,9808 GGTGGAGGTTGATACG-1,0,44,122,6757,9877 CCGCACACGAACGTGT-1,0,45,123,6876,9946 AGAACCCAGCGTGACA-1,0,44,124,6757,10015 GCGCTCGATCACCTGT-1,0,45,125,6876,10084 ATCATGGACTACCGAC-1,0,44,126,6757,10152 TACGCCGCCTCAGAAG-1,0,45,127,6876,10221 CGACCTACTAGACAAT-1,1,46,0,6997,1480 GAGTCTTGTAAAGGAC-1,1,47,1,7116,1549 AATATCCTAGCAAACT-1,1,46,2,6997,1618 CCCTAGGCAACAAGAG-1,1,47,3,7116,1686 ACAAAGAAGGTAGGCC-1,1,46,4,6997,1755 CCCTGGCTGTTCCTTC-1,1,47,5,7116,1824 TCGCCGCACCGCGTGA-1,1,46,6,6996,1893 TATAGCGCACGTTATC-1,1,47,7,7116,1962 TTATCTGACATTAGGA-1,1,46,8,6996,2031 AGTGGTGTTACCCGTG-1,1,47,9,7116,2099 GCCAAGAATACTTCTG-1,1,46,10,6996,2168 CCGGCGTGAGACTCTG-1,1,47,11,7116,2237 TTCCCGGCGCCAATAG-1,1,46,12,6996,2306 AAACAGGGTCTATATT-1,1,47,13,7116,2375 ACAGTAATACAACTTG-1,1,46,14,6996,2444 CGAACGGCCGGACAAC-1,1,47,15,7116,2512 GCAACACACTAGAACT-1,1,46,16,6996,2581 ACTCCCATTCCTAAAG-1,1,47,17,7116,2650 ACCTGCGTGTCATGTT-1,1,46,18,6996,2719 TACTTTCCGCACGCCA-1,1,47,19,7116,2788 AGGTCAGGTGAGAGTG-1,1,46,20,6996,2857 TCCTCCTAAGACATTC-1,1,47,21,7116,2925 ATGTGAAAGCCTAATG-1,1,46,22,6996,2994 AGTCGGCTCAACTTTA-1,1,47,23,7116,3063 CGATCTGTTGGAGGAC-1,1,46,24,6996,3132 ACGGGAGTGTCGGCCC-1,1,47,25,7116,3201 TTAACTTCAGGTAGGA-1,1,46,26,6996,3270 CCACGGAGCCATAAGA-1,1,47,27,7116,3338 CTTCTATGTTGAAGTA-1,1,46,28,6996,3407 CACCGTTGCGCGATAT-1,1,47,29,7116,3476 TCTAGCAATCTCCGCC-1,1,46,30,6996,3545 AGTTTGGCCAGACCTA-1,1,47,31,7116,3614 TTGTAAGGACCTAAGT-1,1,46,32,6996,3683 AAATTTGCGGGTGTGG-1,1,47,33,7116,3751 AAGTTCGGCCAACAGG-1,1,46,34,6996,3820 CCGCTTACCTCACTCT-1,1,47,35,7116,3889 ATCACGTGCTAATTAA-1,1,46,36,6996,3958 GGTGAAGTACAGGGAT-1,1,47,37,7116,4027 GCTGTATTACTGGCCC-1,1,46,38,6996,4095 AACGGCCATCTCCGGT-1,1,47,39,7116,4164 TAAGTAACATCTTGAC-1,1,46,40,6996,4233 TTCTTGAGCCGCGCTA-1,1,47,41,7116,4302 AGTGCGTAGCTCGTAA-1,1,46,42,6996,4371 GGGATGGTCGTAACCG-1,1,47,43,7116,4440 GTCTGGGCGGTCGAGA-1,1,46,44,6996,4508 CGGAACGTAAACATAG-1,1,47,45,7116,4577 TGCGACACCCTAGTGC-1,1,46,46,6996,4646 CAAACGAGTATCGCAG-1,1,47,47,7116,4715 TCAGTAGGGACTATAA-1,1,46,48,6996,4784 GCGGTTCCCTATCATG-1,1,47,49,7116,4853 GTGACTTCAGTAGTGC-1,1,46,50,6996,4921 CGTCACGTCCATTGGT-1,1,47,51,7116,4990 ATAAGTTACCGCGACG-1,1,46,52,6996,5059 CTGAATCCGAGACCTC-1,1,47,53,7116,5128 TACGACGCTTGCTGCG-1,1,46,54,6996,5197 GAATTCACCCGGGTGT-1,1,47,55,7116,5266 GGGTGACACCTTAACT-1,1,46,56,6996,5334 TGAGTAAATTAGCGTA-1,1,47,57,7116,5403 GAGTCCGCTTACCGGA-1,1,46,58,6996,5472 GGCGCGTTCGAGTTTA-1,1,47,59,7116,5541 ATTCATATACTGTCCA-1,1,46,60,6996,5610 ATAAACGGACCCGTAA-1,1,47,61,7116,5679 GTCGTACCATCTCGGG-1,1,46,62,6996,5747 ATAATAGCTGTTGAAT-1,1,47,63,7116,5816 TTCCGCGTGAGGCGAT-1,1,46,64,6996,5885 TACCGGCTCACTGCCC-1,1,47,65,7116,5954 GTATCTTTCATAACCA-1,1,46,66,6996,6023 GTTACCTACAACTTGC-1,1,47,67,7116,6092 TGACTATAATCCTTTC-1,1,46,68,6996,6160 AAATACCTATAAGCAT-1,1,47,69,7116,6229 TTATTAGAGCGTGTTC-1,1,46,70,6996,6298 ATGTGGACATCTTGAT-1,1,47,71,7116,6367 GTACGCTTCATTGCAC-1,1,46,72,6996,6436 CACATATTAGCAGGAT-1,1,47,73,7116,6504 CAAGAGGGCGGAGTAC-1,1,46,74,6996,6573 TCGCAAAGATGCATTT-1,1,47,75,7116,6642 GTCGTTATTCGCTTAT-1,1,46,76,6996,6711 TCGTGTACTATGGATG-1,1,47,77,7116,6780 GCGGAGAGGGAGAACG-1,1,46,78,6996,6849 TCACAGGGAATCGCAA-1,1,47,79,7116,6917 GACTGCACCAGCCCAG-1,1,46,80,6996,6986 TCCGCTGTCATCCCGG-1,1,47,81,7116,7055 AGATACTCAAGATCGA-1,1,46,82,6996,7124 ACTGAATGGCGAAAGT-1,1,47,83,7116,7193 TCCTACATCCACGGCC-1,1,46,84,6996,7262 TTCAGCCCTGGTCCAC-1,1,47,85,7116,7330 TTAGAGTTTAGAAGGA-1,1,46,86,6996,7399 GGTTAGCTATATGTCT-1,1,47,87,7116,7468 CTGGTTTCGAGCAAGA-1,1,46,88,6996,7537 TGGGCCCATACTAATT-1,1,47,89,7116,7606 ACTTATTTATGTGCCA-1,1,46,90,6996,7675 TTAGTTATTCGTGGCA-1,1,47,91,7116,7743 AACCGCTAAGGGATGC-1,1,46,92,6996,7812 ATACGTCCACTCCTGT-1,1,47,93,7116,7881 CGACACGCTCCGACAG-1,1,46,94,6996,7950 TCTGAACTCGTACCCG-1,1,47,95,7116,8019 AGGATATAGGGATTTA-1,1,46,96,6996,8088 GTGATCACTAACGCCT-1,1,47,97,7116,8156 ACCGGGCCTTTGTTGA-1,1,46,98,6996,8225 TTGACAGGAGCTCCCG-1,1,47,99,7116,8294 CTCTTCTATTGACTGG-1,1,46,100,6996,8363 CGTGGCCGAATATCTA-1,1,47,101,7116,8432 GGTTTAGCCTTTCTTG-1,1,46,102,6996,8501 TCAAGGTTACTACACC-1,1,47,103,7116,8569 TTGACTATTGTCCGGC-1,1,46,104,6996,8638 CGGGAATATAGTATAC-1,1,47,105,7116,8707 GCAACAGCAGTATGCG-1,1,46,106,6996,8776 ATCAAACACTGTTCCA-1,1,47,107,7116,8845 TGGGCAATAGTTGGGT-1,1,46,108,6996,8914 TGAATGTCAGCCGGCC-1,1,47,109,7116,8982 CGGCTCTAAAGCTGCA-1,1,46,110,6996,9051 GGACACAAGTTTACAC-1,1,47,111,7116,9120 CCGAGAAGTCGCATAA-1,1,46,112,6996,9189 AACTACCCGTTTGTCA-1,1,47,113,7116,9258 GCACAAACGAGGCGTG-1,1,46,114,6996,9326 CACACAGCTTGCGCTC-1,0,47,115,7116,9395 GTGCTTACATCAGCGC-1,0,46,116,6996,9464 GCAAACGTCGCCAGGT-1,0,47,117,7116,9533 GAATAGCATTTAGGGT-1,0,46,118,6996,9602 TACTGTTTCTCTGGTA-1,0,47,119,7116,9671 TCCTATCATAGGTAAC-1,0,46,120,6996,9739 TTCGGTGGAGACGCCC-1,0,47,121,7116,9808 TGTTGCCGTCGTCCCA-1,0,46,122,6996,9877 CCAACTTGATAGATCC-1,0,47,123,7116,9946 CAAAGGTCATCTGAAA-1,0,46,124,6996,10015 CTAGCTTAATGGTCCC-1,0,47,125,7116,10084 AGGCCACATTGGTTAC-1,0,46,126,6996,10152 TTAGGATGGGAGGGTA-1,0,47,127,7116,10221 TATGACCTTGCGCTGG-1,1,48,0,7236,1480 ATATACATGTATGGTA-1,1,49,1,7356,1549 TGTGTGACCATGAATC-1,1,48,2,7236,1618 CCCACTCCACGGTATC-1,1,49,3,7356,1686 GGGCAGACGTCACTGC-1,1,48,4,7236,1755 TCAAAGAGCTATCTGT-1,1,49,5,7356,1824 AGATGCATCCTGTGTC-1,1,48,6,7236,1893 GTGAAGTCACGACTCG-1,1,49,7,7356,1962 TGATTCAGGTCCCGCG-1,1,48,8,7236,2031 CGCCACAGGTCGCGAT-1,1,49,9,7356,2099 TTGAATCGTTGTATAA-1,1,48,10,7236,2168 TGGCCAATTTGGTACT-1,1,49,11,7356,2237 CGACCCTTAACGCCGG-1,1,48,12,7236,2306 TCGGCGTACTGCACAA-1,1,49,13,7356,2375 GAGTAAGGCCACGGGA-1,1,48,14,7236,2444 ATCAGCTCGTCCACTA-1,1,49,15,7356,2512 AGGATCACGCGATCTG-1,1,48,16,7236,2581 AAATGGCCCGTGCCCT-1,1,49,17,7356,2650 CAGTACCAGTTTACGT-1,1,48,18,7236,2719 GGTCGTAAGCTCGCAC-1,1,49,19,7356,2788 CGTTCATGGTGCGCGT-1,1,48,20,7236,2857 GACTACAAAGCGGTGG-1,1,49,21,7356,2925 CAGCTGGCGTAACCGT-1,1,48,22,7236,2994 ACTCGTAACCCGTCCT-1,1,49,23,7356,3063 CATATGTCAGGCTACG-1,1,48,24,7236,3132 GCCCGACTTCTTCCCG-1,1,49,25,7356,3201 CTGGCATCCGAATGAG-1,1,48,26,7236,3270 AAGTGCGTTAGAATCT-1,1,49,27,7356,3338 AGAAGTGATTCGTGAT-1,1,48,28,7236,3407 TACCTTAAGATTTCCC-1,1,49,29,7356,3476 AATGACAGCAATGTCT-1,1,48,30,7236,3545 TCAACGCAGGAAATAA-1,1,49,31,7356,3614 TATTCCTCCGCCCACT-1,1,48,32,7236,3683 ATCAAACGAAGGTTTG-1,1,49,33,7356,3751 TTGATTAGCTGTTTCT-1,1,48,34,7236,3820 CTGCTGAGGCCACGAA-1,1,49,35,7356,3889 CCGTGTTAAATTCCAT-1,1,48,36,7236,3958 CACGTCGGCAACCTCT-1,1,49,37,7356,4027 GTATTCTGAGAAACGA-1,1,48,38,7236,4095 CGGTGCGCGTTGGTCC-1,1,49,39,7356,4164 GTGATTCGCCGCTCAA-1,1,48,40,7236,4233 GCCCGCGCGTAAACGG-1,1,49,41,7356,4302 AACGTACTGTGGGTAC-1,1,48,42,7236,4371 GAGTATGCCCGCCTTG-1,1,49,43,7356,4440 TGATTCTGTCGCCGGT-1,1,48,44,7236,4508 GGGCGGCAAATGAATT-1,1,49,45,7356,4577 TTCCAATCTGGCTATC-1,1,48,46,7236,4646 GGAACCGTGTAAATTG-1,1,49,47,7356,4715 TTGGTCACACTCGTAA-1,1,48,48,7236,4784 CGAACCCGCATGCGTC-1,1,49,49,7356,4853 GGGCGTCACCACGTAA-1,1,48,50,7236,4921 TACCAGAAGTAGGTTC-1,1,49,51,7356,4990 TTGGATATCGTCTACG-1,1,48,52,7236,5059 TAGATATGGACTGGAA-1,1,49,53,7356,5128 GCGACGATAGTTGTAC-1,1,48,54,7236,5197 CTGGATTTACACTTGA-1,1,49,55,7356,5266 GTTATATTATCTCCCT-1,1,48,56,7236,5334 TATTCCACTCAGCTCG-1,1,49,57,7356,5403 CTGTTACCCAATCTAG-1,1,48,58,7236,5472 ACGCGAAGTCAGACGA-1,1,49,59,7356,5541 GATAGGTAACGTTGAC-1,1,48,60,7236,5610 TGTTCGTATTGCGGTG-1,1,49,61,7356,5679 GGTCAGTGGGTCCCAC-1,1,48,62,7236,5747 AATTCTAGAGTTAGGC-1,1,49,63,7356,5816 GTTTACGTTCCATCTG-1,1,48,64,7236,5885 AGACCCACCGCTGATC-1,1,49,65,7356,5954 TCTAGCATGCCCAGAA-1,1,48,66,7236,6023 CCCGCAGCGCGAACTA-1,1,49,67,7356,6092 CTCTATTTGGCTGCAG-1,1,48,68,7236,6160 TTCTGCCGCGCCTAGA-1,1,49,69,7356,6229 ACTCCCTAGAATAGTA-1,1,48,70,7236,6298 CCGAACCTTCCCGGCC-1,1,49,71,7356,6367 TCAGACGCTATAGAAG-1,1,48,72,7236,6436 CAGGCGCCATGCTAGG-1,1,49,73,7356,6505 CACTCGAGCTGAACAA-1,1,48,74,7236,6573 ACAAGGAAATCCGCCC-1,1,49,75,7356,6642 ACCACGTGCAGCTATA-1,1,48,76,7236,6711 ACGGCGACGATGGGAA-1,1,49,77,7356,6780 TTACTAAAGGACTTTA-1,1,48,78,7236,6849 GGCTGAAATAGCAAAG-1,1,49,79,7356,6917 TTAGACGAGTCACCTC-1,1,48,80,7236,6986 GTAGTCGCGGGAATCA-1,1,49,81,7356,7055 GCAAACCCTACATTAT-1,1,48,82,7236,7124 GTTAAAGTAGGACTGG-1,1,49,83,7356,7193 ACCCTCCCTTGCTATT-1,1,48,84,7236,7262 CATGTCTCATTTATGG-1,1,49,85,7356,7330 AATAGAATCTGTTTCA-1,1,48,86,7236,7399 TCTCATGAGATAGGGT-1,1,49,87,7356,7468 ATGACTATGCGACATT-1,1,48,88,7236,7537 CCTAACCCAAACAAGT-1,1,49,89,7356,7606 AGTCAAGATGACACTT-1,1,48,90,7236,7675 CGGGAGCTTCAGTGTA-1,1,49,91,7356,7743 CCACAGTACCCATCCT-1,1,48,92,7236,7812 GAGCGCGCACGAGTAG-1,1,49,93,7356,7881 ACCAGTGCGGGAGACG-1,1,48,94,7236,7950 TCCTTACGACGGTCCG-1,1,49,95,7356,8019 TAGTCGATCACGGGTT-1,1,48,96,7236,8088 AGACGAAGTGCCGGTC-1,1,49,97,7356,8156 CGCTGGTGACTACCCT-1,1,48,98,7236,8225 AGGCATTGTCGTAGGG-1,1,49,99,7356,8294 TGGTAGAATATATGGG-1,1,48,100,7236,8363 TTCTTATCCGCTGGGT-1,1,49,101,7356,8432 AGTTTGGCACGGGTTG-1,1,48,102,7236,8501 GCATCGGCCGTGTAGG-1,1,49,103,7356,8569 ATGCGAGTCCCACCAC-1,1,48,104,7236,8638 TCGGCGAACCCAAACC-1,1,49,105,7356,8707 AGAGTAAACTTCACTA-1,1,48,106,7236,8776 AAGCCGAAGCGGTTTA-1,1,49,107,7356,8845 CCCGAGTTTCTCCGTA-1,1,48,108,7236,8914 AATATCGAATCAATGC-1,1,49,109,7356,8982 GCGCCTCCCACTCCGA-1,1,48,110,7236,9051 CGTTAAACTAGTTAGG-1,1,49,111,7356,9120 TGAGTTAAAGACATTC-1,1,48,112,7236,9189 AACAGGTAGTATGGAT-1,1,49,113,7356,9258 GAACGCGGGTCACACG-1,1,48,114,7236,9326 TGTTTGAGATCGTCAG-1,1,49,115,7356,9395 ATCTCGTGAGCGAAAC-1,0,48,116,7236,9464 CTGAGAAAGTTCGGCG-1,0,49,117,7356,9533 ATTACCACACTGCCTG-1,0,48,118,7236,9602 CTGCTGTCTAACGAGC-1,0,49,119,7355,9671 CGTGGAAGCCTCGTAC-1,0,48,120,7236,9739 GGACTCACAAATTAGG-1,0,49,121,7355,9808 CTTTGCTGTCATGGAT-1,0,48,122,7236,9877 GGTGTTGGGCGTCTTA-1,0,49,123,7355,9946 TACCATGTATTGATTT-1,0,48,124,7236,10015 GGTCTCCAAGTAGTGC-1,0,49,125,7355,10084 ATCCTTCTGAAAGAAC-1,0,48,126,7236,10152 CCGGAAGTTATCAGTC-1,0,49,127,7355,10221 TTAGAGGGATATACAG-1,1,50,0,7476,1480 TTGTACACCTCGAACA-1,1,51,1,7595,1549 GTGGGTACTGAGCGTA-1,1,50,2,7476,1618 CTTAAGCAGCGAGCCG-1,1,51,3,7595,1686 GCATTGACTTGCGGAA-1,1,50,4,7476,1755 CCATAACCTGTGCAGT-1,1,51,5,7595,1824 GGGCTACTATTTCGTG-1,1,50,6,7476,1893 GGCGAGCGAAACGGCA-1,1,51,7,7595,1962 GGAGACCATCTACATA-1,1,50,8,7476,2031 AGACCAAACCACACCT-1,1,51,9,7595,2099 CGACGCATCCGTACCT-1,1,50,10,7476,2168 CCTAGGTAAAGGTAGC-1,1,51,11,7595,2237 AGCGGCGGTTAGCGGT-1,1,50,12,7476,2306 CTGGACGCAGTCCGGC-1,1,51,13,7595,2375 AGCCTAATACCCACGT-1,1,50,14,7476,2444 AATCTGGCTTTCTAGT-1,1,51,15,7595,2512 CACCCTTGGTGAGACC-1,1,50,16,7476,2581 GGATCTTGACTCAACC-1,1,51,17,7595,2650 ACGAGGATACCACTCT-1,1,50,18,7476,2719 GAGTTGATGGCAATTT-1,1,51,19,7595,2788 GTGGCAAACAGCGGCA-1,1,50,20,7476,2857 GATGTAACGAACCACC-1,1,51,21,7595,2925 AGCCGTGGCTAAATGT-1,1,50,22,7476,2994 CTCCCTCCTTTCGATC-1,1,51,23,7595,3063 TTGGAAGAATACAGTC-1,1,50,24,7476,3132 AGTTAAGTCAACCGCT-1,1,51,25,7595,3201 CTCATGGTAATTTGCG-1,1,50,26,7475,3270 AAAGTAGCATTGCTCA-1,1,51,27,7595,3338 TTGTGGTAGGAGGGAT-1,1,50,28,7475,3407 AGTCGTGGGCATTACG-1,1,51,29,7595,3476 ACCTAAGTACCTTTCA-1,1,50,30,7475,3545 GTAGAGGGAGACAAGT-1,1,51,31,7595,3614 GATCCTCGACACTGGC-1,1,50,32,7475,3683 CCTACATTCACAGACG-1,1,51,33,7595,3751 TTGACCGTGTTAATGA-1,1,50,34,7475,3820 TCTGTTACCCAGCATA-1,1,51,35,7595,3889 CTAACTGGTCCGGTTC-1,1,50,36,7475,3958 AGCGACAGGAACGGTC-1,1,51,37,7595,4027 TAATAGAACAGAGTTA-1,1,50,38,7475,4095 ACAGGTGGAGGTGAGG-1,1,51,39,7595,4164 TGCGAGAATATTACCC-1,1,50,40,7475,4233 TTGCGTCGGCCAACCG-1,1,51,41,7595,4302 AGGCTTCCCGAAGAAG-1,1,50,42,7475,4371 GCGGACCGCGTTGTGG-1,1,51,43,7595,4440 GTAATCTGATTCTTCG-1,1,50,44,7475,4508 CCGCGGAATGCGTCAC-1,1,51,45,7595,4577 TTCCACACAGATTTGA-1,1,50,46,7475,4646 CTTCTATTAATGCTAG-1,1,51,47,7595,4715 CATTTGAGTGGTACGT-1,1,50,48,7475,4784 TCACAGCAAACTCGAA-1,1,51,49,7595,4853 CAGACGAACCTGATAC-1,1,50,50,7475,4921 TAGCTAGAAGGCATGA-1,1,51,51,7595,4990 ATCCAGAGCAACAACC-1,1,50,52,7475,5059 TCCGGTTCGTCCGGTC-1,1,51,53,7595,5128 CGCGCATGTTTGATTG-1,1,50,54,7475,5197 TGGCGATCAAGTTATG-1,1,51,55,7595,5266 CCCTTTGACAGGTCTT-1,1,50,56,7475,5334 CAGAGACGGTCACCCA-1,1,51,57,7595,5403 TAGCTCGCCTGATAAC-1,1,50,58,7475,5472 TTGTGTTTCCCGAAAG-1,1,51,59,7595,5541 TATACACAGACGCCTT-1,1,50,60,7475,5610 ACATTAGTTTATATCC-1,1,51,61,7595,5679 CCATCGCAGTTAAACT-1,1,50,62,7475,5747 AATTAGCGCTGCAGCG-1,1,51,63,7595,5816 TCCGCTTATCCCATTA-1,1,50,64,7475,5885 GTTTGGGCTTGTGAGC-1,1,51,65,7595,5954 CTTGTCAACATTCGAG-1,1,50,66,7475,6023 GGACCAACAGGATAAC-1,1,51,67,7595,6092 AAGCTAGATCGAGTAA-1,1,50,68,7475,6160 TACCGTGCCTCGGACC-1,1,51,69,7595,6229 GTAGCCAAACATGGGA-1,1,50,70,7475,6298 TGCCAGTACGTGGAGA-1,1,51,71,7595,6367 ATAAGGTGGAGAACAT-1,1,50,72,7475,6436 CTTTAATATTGGTCGA-1,1,51,73,7595,6505 TGGTTCAACGGGTAAT-1,1,50,74,7475,6573 GCTGCTACTGCGTAGC-1,1,51,75,7595,6642 CTGCACAACTACATAT-1,1,50,76,7475,6711 ATATTCCACATAGTGA-1,1,51,77,7595,6780 TGGCAAACTAAATTAC-1,1,50,78,7475,6849 ACCGCAATAACTGCCT-1,1,51,79,7595,6917 TCGCACCAGGAGGCAG-1,1,50,80,7475,6986 ACTTCAGGCTGATCCC-1,1,51,81,7595,7055 ACAAATCGCACCGAAT-1,1,50,82,7475,7124 TCTGATGTATTCTGTC-1,1,51,83,7595,7193 CTTTACCGAATAGTAG-1,1,50,84,7475,7262 GCAGATCCATAAGACT-1,1,51,85,7595,7330 TTCCTCGGACTAACCA-1,1,50,86,7475,7399 TTATCCGGGATCTATA-1,1,51,87,7595,7468 CTGGAAGACACGGTGG-1,1,50,88,7475,7537 GTTCGTCTAAAGAACT-1,1,51,89,7595,7606 GTCTATTGGTTCCGGT-1,1,50,90,7475,7675 CTAGGCGCCCTATCAG-1,1,51,91,7595,7743 AACGGACGTACGTATA-1,1,50,92,7475,7812 AACACACGCTCGCCGC-1,1,51,93,7595,7881 GCTACTATAGTAGAGT-1,1,50,94,7475,7950 AGCATATCAATATGCT-1,1,51,95,7595,8019 CGAACAGTATGGGCGT-1,1,50,96,7475,8088 ACAATTGTGTCTCTTT-1,1,51,97,7595,8156 GATCGCTACCCGATTT-1,1,50,98,7475,8225 ATTGCGATCAGTAACT-1,1,51,99,7595,8294 CAGCAGTCCAGACTAT-1,1,50,100,7475,8363 AGAGGCTTCGGAAACC-1,1,51,101,7595,8432 AAACAAGTATCTCCCA-1,1,50,102,7475,8501 GGCAGCAAACCTATGC-1,1,51,103,7595,8569 ACTAGTTGCGATCGTC-1,1,50,104,7475,8638 TTGGACCATCTGGCAA-1,1,51,105,7595,8707 CCCTCCTCGCTCGTAT-1,1,50,106,7475,8776 GAGCGCAAATACTCCG-1,1,51,107,7595,8845 ATTACATGTCAGTCTT-1,1,50,108,7475,8914 TTGGGACGTAAGAGTT-1,1,51,109,7595,8982 CTTCGGCCAATTGTTT-1,1,50,110,7475,9051 AGACCGCTCCGCGGTT-1,1,51,111,7595,9120 GACCGCGTCTGACGTG-1,1,50,112,7475,9189 CCAAATAACAAGATTC-1,1,51,113,7595,9258 TCTTTAGAGTCTAACA-1,1,50,114,7475,9327 CTCCCAATGAGTCGCG-1,0,51,115,7595,9395 TAGTCTTTCCGAATTG-1,0,50,116,7475,9464 GAGTAAACCGGAAAGT-1,0,51,117,7595,9533 GATCTCGACGCTGTGG-1,0,50,118,7475,9602 CTGACATAGAAATAGA-1,0,51,119,7595,9671 TATACCGAGTGCCACA-1,0,50,120,7475,9739 TCCGAACGTTGCCGCT-1,0,51,121,7595,9808 GCAGAAGGTAATCTCC-1,0,50,122,7475,9877 GGTACTAAGTGCTTTG-1,0,51,123,7595,9946 CAGAATATTCGTTATC-1,0,50,124,7475,10015 TAATCAACCAAATGGG-1,0,51,125,7595,10084 TCTGCTTAGAACAAGC-1,0,50,126,7475,10152 AACTGAGTTATACTGA-1,0,51,127,7595,10221 CCTCAACGATCGCTGT-1,1,52,0,7715,1480 CGGTACGGCAAACCCA-1,1,53,1,7835,1549 CAGATGTTTGTCCCAA-1,1,52,2,7715,1618 GTTTGTTAGCCAAGTA-1,1,53,3,7835,1686 ACGTGACAAAGTAAGT-1,1,52,4,7715,1755 TTGTCACCGCGGTATC-1,1,53,5,7835,1824 GATCTAACCGTATTCA-1,1,52,6,7715,1893 ATGGAAATTTAAGGAG-1,1,53,7,7835,1962 ATTGATCACCACATTT-1,1,52,8,7715,2031 ACTGCTCGGAAGGATG-1,1,53,9,7835,2099 TCTAAAGAACAGTCTC-1,1,52,10,7715,2168 CTGGGTTGAGTTAAAG-1,1,53,11,7835,2237 CCCAGTAAACTTGGGA-1,1,52,12,7715,2306 AGATTCACAACCGATA-1,1,53,13,7835,2375 AGAAGGTACACTTCAC-1,1,52,14,7715,2444 GCAGGAACTTAGATCT-1,1,53,15,7835,2512 AATCTAGGTTTACTTG-1,1,52,16,7715,2581 CCCGGTGTATCGGAAT-1,1,53,17,7835,2650 TTATCCTCAAGGAATA-1,1,52,18,7715,2719 AGCATCATTTCGAAAG-1,1,53,19,7835,2788 CGCGAGTCTGCCGGGT-1,1,52,20,7715,2857 TGCGTCATGACTGAGC-1,1,53,21,7835,2925 GTATGAAATTTCACTC-1,1,52,22,7715,2994 TTGGTTGCGGTGCGCG-1,1,53,23,7835,3063 ACAGAACTGAGAACAA-1,1,52,24,7715,3132 CTACTATCATAGGTTT-1,1,53,25,7835,3201 CCTCTATCGATTAGCA-1,1,52,26,7715,3270 CCGTATCTCGTCGTAG-1,1,53,27,7835,3338 TCACGATGTCCGTGGA-1,1,52,28,7715,3407 TCAACAAAGATAATTC-1,1,53,29,7835,3476 ATGACGCGTTCTATCC-1,1,52,30,7715,3545 ATTTGCGCGAGTAGCT-1,1,53,31,7835,3614 TTCTTGGACGATCTGC-1,1,52,32,7715,3683 AGACGACGATGCCGCT-1,1,53,33,7835,3751 GGTCTCTGAATGGACT-1,1,52,34,7715,3820 GCTCAATCCGTTTATT-1,1,53,35,7835,3889 CCAGAAAGCAACTCAT-1,1,52,36,7715,3958 CACCGTTAGGGATCAC-1,1,53,37,7835,4027 AATAACACTAGAACAA-1,1,52,38,7715,4096 CACCCGGTTTGTGACT-1,1,53,39,7835,4164 CCACCAACTTTACTGT-1,1,52,40,7715,4233 AACTCTCAGTGTGCTC-1,1,53,41,7835,4302 AAACCGTTCGTCCAGG-1,1,52,42,7715,4371 CAGCGATTCCCTTCAA-1,1,53,43,7835,4440 GCTAGCTTGAATAGCT-1,1,52,44,7715,4508 TTGCGGCATCAGAAAG-1,1,53,45,7835,4577 AATAGAACAGAGTGGC-1,1,52,46,7715,4646 GCCATCGAGCTGCGTG-1,1,53,47,7835,4715 ACACTGATCAAGGTGT-1,1,52,48,7715,4784 ACCAACGCTTATTTAT-1,1,53,49,7835,4853 GACATCGATTTATAAC-1,1,52,50,7715,4921 CAGACACCGATCGCTG-1,1,53,51,7835,4990 CCAAGAAAGTGGGCGA-1,1,52,52,7715,5059 GGTAGACCGTTGGGCG-1,1,53,53,7835,5128 TCGTTAGGAGTCCCTA-1,1,52,54,7715,5197 ACGGCCAACATGGACT-1,1,53,55,7835,5266 GTGAGTGGTACAACGC-1,1,52,56,7715,5334 GAGACTTCGCGACCGA-1,1,53,57,7835,5403 GAAGTCAGTTGCACTA-1,1,52,58,7715,5472 GTTTGGTAGGGTCAAC-1,1,53,59,7835,5541 ACGGCACTTGCTTGGG-1,1,52,60,7715,5610 CCTCTGTACTATTCTA-1,1,53,61,7835,5679 CTATTCATGTGTCCCA-1,1,52,62,7715,5747 GCCCGATCTGTGGTCG-1,1,53,63,7835,5816 TTAGAAGAACATGACT-1,1,52,64,7715,5885 AGGATAAAGTCGGGAT-1,1,53,65,7835,5954 CGGCAAACATCGTGCG-1,1,52,66,7715,6023 CTAGTTACAACCCGGT-1,1,53,67,7835,6092 TTCGACAGAGCCCGTG-1,1,52,68,7715,6160 AAGCATACTCTCCTGA-1,1,53,69,7835,6229 GACGACGATCCGCGTT-1,1,52,70,7715,6298 GGTAGAAGACCGCCTG-1,1,53,71,7835,6367 GAGATGGGAGTCGACA-1,1,52,72,7715,6436 AACGATAATGCCGTAG-1,1,53,73,7835,6505 TGGTCCCACGCTACGG-1,1,52,74,7715,6573 CTGCTTGGCGATAGCT-1,1,53,75,7835,6642 ATCGGAGACAGACGGC-1,1,52,76,7715,6711 TAGCGTCCGGTGTGGT-1,1,53,77,7835,6780 GTTGAGTCCCGCCGGT-1,1,52,78,7715,6849 AAATAGGGTGCTATTG-1,1,53,79,7835,6917 AAGTGTTTGGAGACGG-1,1,52,80,7715,6986 AGCACTACCTCACCAG-1,1,53,81,7835,7055 TGCCTTGGCCAGGCAA-1,1,52,82,7715,7124 TCGTCTTAGGCGTTAA-1,1,53,83,7835,7193 TTCTGACCGGGCTCAA-1,1,52,84,7715,7262 CAGAACTTAGCCCTCT-1,1,53,85,7835,7330 AGCTCCTTCGCACATC-1,1,52,86,7715,7399 ACAGGCTTGCCCGACT-1,1,53,87,7835,7468 GCTATACGTCTCGGAC-1,1,52,88,7715,7537 GAGCCAGCTACCTGTG-1,1,53,89,7835,7606 TGCTAAGTGTCTATTT-1,1,52,90,7715,7675 GTCCTACGAATAGTCT-1,1,53,91,7835,7743 CAGTGTCGGCTGGCCC-1,1,52,92,7715,7812 CTATCGACGAAATACA-1,1,53,93,7835,7881 CATCATTACCCTGAGG-1,1,52,94,7715,7950 TAAGTTGCGACGTAGG-1,1,53,95,7835,8019 AGTGCACGCTTAAGAA-1,1,52,96,7715,8088 TGTGCCGGTGCCGGAA-1,1,53,97,7835,8156 AGGAGGCCTTCGCGCG-1,1,52,98,7715,8225 TCCGCGGCCCAATGAA-1,1,53,99,7835,8294 TCCGTTAAGCTAATAT-1,1,52,100,7715,8363 AAATCTAGCCCTGCTA-1,1,53,101,7835,8432 CGCAGGCGATCCAAAC-1,1,52,102,7715,8501 CCATATGGAAACTATA-1,1,53,103,7835,8569 CACCGTATCCCATCCG-1,1,52,104,7715,8638 GGTCAAGACTACTTCG-1,1,53,105,7835,8707 CCCGTTTCGCAGATGT-1,1,52,106,7715,8776 GTTATAATACGGTGAA-1,1,53,107,7835,8845 ACTTGTGGATGGAACG-1,1,52,108,7715,8914 GTTCGCTGAGACGTCT-1,1,53,109,7835,8982 GACACTGGAACCCGAT-1,1,52,110,7715,9051 CCCAGGTCTGAAGGCT-1,1,53,111,7835,9120 TCTCGAGGAGGTTCGC-1,1,52,112,7715,9189 ACTATCTGCCCGCGTA-1,1,53,113,7835,9258 CCTAAATTGTATCCTA-1,1,52,114,7715,9327 AGAAATTATGACTCGC-1,0,53,115,7835,9395 TCCAGCGCTATAAGCG-1,0,52,116,7715,9464 TCGTGTATTGGTCACG-1,0,53,117,7835,9533 CCACATACTGCACCCA-1,0,52,118,7715,9602 GTTGCGGACGGTCAGG-1,0,53,119,7835,9671 GTATTTAATGGCATAA-1,0,52,120,7715,9739 GTCGATAGGTGACTTT-1,0,53,121,7835,9808 AATAATCTTCGTATCG-1,0,52,122,7715,9877 ATTGTTCAACGATCCG-1,0,53,123,7835,9946 GTGCAGCGTAGAGTAG-1,0,52,124,7715,10015 TGTGGTAGGGTGCCTT-1,0,53,125,7835,10084 TGTGGACTATCTACGT-1,0,52,126,7715,10152 GGCGGGCTCTAAGAGT-1,0,53,127,7835,10221 TGTGCCAGAGGCAAAG-1,1,54,0,7955,1480 TGGCTTATGTATAATG-1,1,55,1,8074,1549 GCAAGCTGGAAACCGC-1,1,54,2,7955,1618 GATATCAAGCAGGAGC-1,1,55,3,8074,1686 CACCAATCATCCGTCT-1,1,54,4,7955,1755 CCACATGGCTCTTTAT-1,1,55,5,8074,1824 GTCCTACTCTACGGGC-1,1,54,6,7955,1893 CTCGAGACATACGATA-1,1,55,7,8074,1962 TATCAGTGGCGTAGTC-1,1,54,8,7955,2031 TGACAGGACAAGTCCA-1,1,55,9,8074,2099 TATTAACACCAAAGCA-1,1,54,10,7955,2168 TAGGCGATGAGGTCTC-1,1,55,11,8074,2237 CCGCCGGAACTTCTCG-1,1,54,12,7955,2306 GCCATTAGCCTCAAAC-1,1,55,13,8074,2375 GTTAGGCTACCCGTTT-1,1,54,14,7955,2444 GGGTATTCTAGCAAAC-1,1,55,15,8074,2512 GCCCTAGCCGTCGCGA-1,1,54,16,7955,2581 CAGATCCTGGTTTGAA-1,1,55,17,8074,2650 CTTCAGTGGTCGCCTA-1,1,54,18,7955,2719 GGGCAACCGCACGTGC-1,1,55,19,8074,2788 GACCCAATTATGATAC-1,1,54,20,7955,2857 GAAGCTCGGACCCGTC-1,1,55,21,8074,2925 CGTCGGGTCTAAGCGC-1,1,54,22,7955,2994 GAGGCCCGACTCCGCA-1,1,55,23,8074,3063 TTGCCATAGCCCGCTC-1,1,54,24,7955,3132 TAACATACACGCGATC-1,1,55,25,8074,3201 CCGACGGGCATGAGGT-1,1,54,26,7955,3270 AATGTGCCCGAGGTGT-1,1,55,27,8074,3338 AGCTGTAACCTCAATC-1,1,54,28,7955,3407 CGAGTGAAGGTACCAG-1,1,55,29,8074,3476 AGTCTCACAAGACTAC-1,1,54,30,7955,3545 AAATTGATAGTCCTTT-1,1,55,31,8074,3614 TAAGTCGCCGAGTATC-1,1,54,32,7955,3683 GCGGAGAAACTTCGCA-1,1,55,33,8074,3751 GGCAAAGGCGCCAATA-1,1,54,34,7955,3820 ATTTCCGGGTTCTGCG-1,1,55,35,8074,3889 TAAACCCAGGAGGGCA-1,1,54,36,7955,3958 TTCGGGCGCTAGTCTT-1,1,55,37,8074,4027 GTGGAGTCGGCGGTTG-1,1,54,38,7955,4096 GCACGCCTACTTAGAT-1,1,55,39,8074,4164 CAATATTCTTGACCTA-1,1,54,40,7955,4233 CGTTTGTGTAGAGGGT-1,1,55,41,8074,4302 CATAGCGTTGCCCACC-1,1,54,42,7955,4371 TGATACATTTAGCCGT-1,1,55,43,8074,4440 TTCCGGCCTTGAGGCT-1,1,54,44,7955,4508 CCTATACCGTCCTGTC-1,1,55,45,8074,4577 TCGTTGCTATCCGGTC-1,1,54,46,7954,4646 TGGCGACTGCTCCAAA-1,1,55,47,8074,4715 CAGAGGCGATGCATGA-1,1,54,48,7954,4784 TCACAGGAGAATAAGA-1,1,55,49,8074,4853 GGGTTAACATTTGAGT-1,1,54,50,7954,4921 GCGGGCGAGCCTTACC-1,1,55,51,8074,4990 TGCCAATGGGTACTCT-1,1,54,52,7954,5059 AGGGACTCTACGCGAC-1,1,55,53,8074,5128 GACGCCGTAAAGGCTA-1,1,54,54,7954,5197 AAAGGCTCTCGCGCCG-1,1,55,55,8074,5266 CTGGCTGGTTGTCAGT-1,1,54,56,7954,5334 ACATCCCGGCCATACG-1,1,55,57,8074,5403 CTCTTGTCCCGCTTGG-1,1,54,58,7954,5472 TACGCCTCCATTCCGA-1,1,55,59,8074,5541 CGGAGCAATTTAATCG-1,1,54,60,7954,5610 AACTAGGCTTGGGTGT-1,1,55,61,8074,5679 GCGTCGCCAGGGTGAT-1,1,54,62,7954,5747 GTTGGTCATGCTATCC-1,1,55,63,8074,5816 GCTGGCGGCGCATGCT-1,1,54,64,7954,5885 TGAGCGGAAAGTGTTC-1,1,55,65,8074,5954 CTTTCTGTGCGGGCTT-1,1,54,66,7954,6023 ATCTAATATCCTACGG-1,1,55,67,8074,6092 AACCTTTAAATACGGT-1,1,54,68,7954,6160 TTCACTCGAGCACCTA-1,1,55,69,8074,6229 CTGCACTCCAGTACAG-1,1,54,70,7954,6298 CCATTTCTACCTATTA-1,1,55,71,8074,6367 CAAGCGGCACATAATT-1,1,54,72,7954,6436 GTTAACATCACTTAAA-1,1,55,73,8074,6505 ATATAAATGTAGCTGC-1,1,54,74,7954,6573 GCCTCTATACATAGCA-1,1,55,75,8074,6642 GTGTCGTATAGCGTTC-1,1,54,76,7954,6711 ATACGTACTTAGCCAC-1,1,55,77,8074,6780 GCTATCATACTCATGG-1,1,54,78,7954,6849 TATCCAATTGGTTATC-1,1,55,79,8074,6918 TCTCCCTGGGCAGCGT-1,1,54,80,7954,6986 CCTATAATGAGTGCCC-1,1,55,81,8074,7055 CAATGCGAGAAGTATC-1,1,54,82,7954,7124 TACCAATAAAGTACCA-1,1,55,83,8074,7193 GCTAGGCACCACGGAG-1,1,54,84,7954,7262 GGTGGACTGCTCTGGC-1,1,55,85,8074,7330 TATTCCGAGCTGTTAT-1,1,54,86,7954,7399 TTGAGAAGTTTAGCAT-1,1,55,87,8074,7468 GTCCGGACCTGAAATT-1,1,54,88,7954,7537 CTGTGGTCGGGAGATA-1,1,55,89,8074,7606 CATGTAAGAGACATTT-1,1,54,90,7954,7675 CACGTTTCGTACACAC-1,1,55,91,8074,7743 CATCCTCTCAAAGATC-1,1,54,92,7954,7812 GATTAACCGAAAGCCC-1,1,55,93,8074,7881 AACGCTGTTGCTGAAA-1,1,54,94,7954,7950 TTCAGCTGGCGTGCCC-1,1,55,95,8074,8019 TAGAGGTTCTACTTGT-1,1,54,96,7954,8088 GTATCAAACGTTAGCT-1,1,55,97,8074,8156 AATCATGTAAAGACTC-1,1,54,98,7954,8225 AGTCACTAGCTCTCGA-1,1,55,99,8074,8294 GCGAAACGATCGGGAG-1,1,54,100,7954,8363 CATGGATTGTCTTCCG-1,1,55,101,8074,8432 ATTGGATTACAGCGTA-1,1,54,102,7954,8501 CACACACGCTAACGAG-1,1,55,103,8074,8569 CTATGGGAAGCGGAAT-1,1,54,104,7954,8638 TGCCTAATTGAAGATT-1,1,55,105,8074,8707 TGGCAATGGGACGGCG-1,1,54,106,7954,8776 ACCTCCGCCCTCGCTG-1,1,55,107,8074,8845 CGGCAATAAGATCGCC-1,1,54,108,7954,8914 CCTTGACCACTTTATT-1,1,55,109,8074,8982 TCATTTAGAAGTGTGA-1,1,54,110,7954,9051 CAGAATAACACACGGA-1,1,55,111,8074,9120 TCTGAGCAATTGACTG-1,1,54,112,7954,9189 CAACGTGGTGGAGTCT-1,1,55,113,8074,9258 CACAGTTCGCTTCCCA-1,1,54,114,7954,9327 TCTCTCGCCGCACATA-1,0,55,115,8074,9395 TGGGCAGGCCACCGCA-1,0,54,116,7954,9464 CTCCTGTTCAAGGCAG-1,0,55,117,8074,9533 TATTTGATTTGCACAG-1,0,54,118,7954,9602 GCCACTCCTTACGGTA-1,0,55,119,8074,9671 ACCGATATTTAATCAT-1,0,54,120,7954,9739 TTATTATCTGGAAGGC-1,0,55,121,8074,9808 TACATGCCGGAATTGT-1,0,54,122,7954,9877 GGCACTCAGCCGACCC-1,0,55,123,8074,9946 AAACCGGAAATGTTAA-1,0,54,124,7954,10015 AGACAGGCATCTCAGC-1,0,55,125,8074,10084 GTGGTGATGGTTTGTG-1,0,54,126,7954,10152 CCGATATGACGTAAGG-1,0,55,127,8074,10221 CATACACAAAGTCAGC-1,1,56,0,8194,1480 TGCCGTTCTTAATCGG-1,1,57,1,8314,1549 TCGAGTCTACGATTCG-1,1,56,2,8194,1618 ACTTCCAGTGGAAGCT-1,1,57,3,8314,1687 CAATTGGGCCGCACTC-1,1,56,4,8194,1755 AAATCGCGGAAGGAGT-1,1,57,5,8314,1824 ATATCAATTCCAGCCT-1,1,56,6,8194,1893 CTTTGTCGAATGCTCC-1,1,57,7,8314,1962 TGAGGCATGTACTGTG-1,1,56,8,8194,2031 TTCGCCGCTCGCGCTA-1,1,57,9,8314,2099 GACTCCTTCCAATTGA-1,1,56,10,8194,2168 ACCGAAGAGTCTGGTT-1,1,57,11,8314,2237 TGGCATGAAGTTTGGG-1,1,56,12,8194,2306 ACGAGGTTTACAACGT-1,1,57,13,8314,2375 AACCCATCCCATGATC-1,1,56,14,8194,2444 TCGACAACTGAACCCG-1,1,57,15,8314,2512 TATCTTGCAATACAAC-1,1,56,16,8194,2581 TATTATGTTTGCCTGC-1,1,57,17,8314,2650 GTCAAAGAAGTGGTGT-1,1,56,18,8194,2719 GGGACAGAGTTACTCC-1,1,57,19,8314,2788 AGCAACCGAAAGTAAT-1,1,56,20,8194,2857 CTCTCTAACTGCCTAG-1,1,57,21,8314,2925 ATACGGAACGTCGTTT-1,1,56,22,8194,2994 TCGGTCCCGACAATAG-1,1,57,23,8314,3063 CGCGCAAATGTCCAGA-1,1,56,24,8194,3132 TCTAATACTGCCTCAG-1,1,57,25,8314,3201 CTCGGTTGTCGGCCCT-1,1,56,26,8194,3270 GGTAACCGGGAGGATA-1,1,57,27,8314,3338 CAGGCGCACGGTGGTC-1,1,56,28,8194,3407 TCATCGATGGTCCCAA-1,1,57,29,8314,3476 CAAAGATTATTGGGCC-1,1,56,30,8194,3545 ACAATGAATACGGAGA-1,1,57,31,8314,3614 GCTCCTGACATACTGG-1,1,56,32,8194,3683 GATGACAAGTAGGGCA-1,1,57,33,8314,3751 TACGCCGAGGGTACCC-1,1,56,34,8194,3820 AAGCGTCCCTCATCGA-1,1,57,35,8314,3889 CACTCCTATGTAAGAT-1,1,56,36,8194,3958 TCGAGCCAGGCAGGCC-1,0,57,37,8314,4027 TCGTCAAGTACGCGCA-1,1,56,38,8194,4096 CCCGTAGCTGGGAAGA-1,1,57,39,8314,4164 ACCCTATGCCATATCG-1,1,56,40,8194,4233 GTGGTATAGTCTGCCG-1,1,57,41,8314,4302 CCGGTTTGTAATTGTG-1,1,56,42,8194,4371 GTCGCCGTTGTGTGTT-1,1,57,43,8314,4440 TACTGAACAGATTTAG-1,1,56,44,8194,4508 TATTAACCTGACCGCG-1,1,57,45,8314,4577 CTGTAGCCATCTCACT-1,1,56,46,8194,4646 TACTATGGTTCCTCAG-1,1,57,47,8314,4715 GAGTCAGACCAGAATC-1,1,56,48,8194,4784 TAAGGCATAACATCAA-1,1,57,49,8314,4853 CTTCCGCTCCGTGAAG-1,1,56,50,8194,4921 GGGCTATGATCGATGG-1,1,57,51,8314,4990 GGTCGGTCGTCCACAG-1,1,56,52,8194,5059 GGGACCCGTATATCTT-1,1,57,53,8314,5128 GAAAGCAGTGCACTTT-1,1,56,54,8194,5197 AGCGCATAATGAATCG-1,1,57,55,8314,5266 GCTGCTAAGTAGTCGA-1,1,56,56,8194,5334 AATAGTCCGTCCCGAC-1,1,57,57,8314,5403 AGCAGCCAGATGAATA-1,1,56,58,8194,5472 CCTCGCGCTGTGCGAT-1,1,57,59,8314,5541 TTGTGTATGCCACCAA-1,1,56,60,8194,5610 TGCTCGGCGAAACCCA-1,1,57,61,8314,5679 CGATTAAATATCTCCT-1,1,56,62,8194,5747 TGCCGTGGATCGTCCT-1,1,57,63,8314,5816 GTGGACGCATTTGTCC-1,1,56,64,8194,5885 ACCCGGAAACTCCCAG-1,1,57,65,8314,5954 CCGCATGTGGTACGAT-1,1,56,66,8194,6023 GCAAACCTTGGCCATA-1,1,57,67,8314,6092 ATTCACTGATGTTGGA-1,1,56,68,8194,6160 ACTCCCTAATGCTAAA-1,1,57,69,8314,6229 TCCTAAATTGGGAAGC-1,1,56,70,8194,6298 GAACAGATTACTAAAT-1,1,57,71,8314,6367 ATACAGGCCCTCCAAT-1,1,56,72,8194,6436 CGATTCGCCTGGCTGC-1,1,57,73,8314,6505 TCCGCCTGTCTACAAG-1,1,56,74,8194,6573 CACATCTCACCGACGA-1,1,57,75,8314,6642 CGTCGTCCTTCGCGAA-1,1,56,76,8194,6711 CGTTGAATACCGCGCT-1,1,57,77,8314,6780 ACCAATATGCAAGTTA-1,1,56,78,8194,6849 ACGGATGGTGCGGATA-1,1,57,79,8314,6918 CACCCTAACAAGATCT-1,1,56,80,8194,6986 AAGCTCTTTCATGGTG-1,1,57,81,8314,7055 CATGGGTATGCCTTAT-1,1,56,82,8194,7124 GCGCGTCATTGGTACA-1,1,57,83,8314,7193 TCTGAAGCACGTGGTC-1,1,56,84,8194,7262 AAGTTCACTCCAAGCT-1,1,57,85,8314,7330 TTGGACCTATAACAGT-1,1,56,86,8194,7399 ATCAGCCTCATGCTGC-1,1,57,87,8314,7468 AGTACTCTTATGCCCA-1,1,56,88,8194,7537 GCGCTTAAATAATTGG-1,1,57,89,8314,7606 TTGTGAACCTAATCCG-1,1,56,90,8194,7675 AGTCGTCGACCACCAA-1,1,57,91,8314,7743 TCCTTTAAATCCGCTT-1,1,56,92,8194,7812 ACTGAAACGCCGTTAG-1,1,57,93,8314,7881 GCACACACTGGTAGCC-1,1,56,94,8194,7950 TAAGGGCCTGTCCGAT-1,1,57,95,8314,8019 GCTAGAGTAGAGATGT-1,1,56,96,8194,8088 CACAGGGCCATATAGT-1,1,57,97,8314,8156 CCATGCCCTAGATTTC-1,1,56,98,8194,8225 TCGCGTAGCAGTGTCC-1,1,57,99,8314,8294 GACGAGGCTAATAAAC-1,1,56,100,8194,8363 CTACACTCGCAGATGG-1,1,57,101,8314,8432 ACGCATACGTTTACTA-1,1,56,102,8194,8501 GGAGCAACATTTCAAG-1,1,57,103,8314,8569 CGAGAGGGTAGCCGCG-1,1,56,104,8194,8638 TCGTGTTCGACCACAA-1,1,57,105,8314,8707 TCTACCCAATAGAGAG-1,1,56,106,8194,8776 ATAAACGTTGCACCAC-1,1,57,107,8314,8845 TCAACTGCAGAGTCAG-1,1,56,108,8194,8914 AGCTCCATATATGTTC-1,1,57,109,8314,8982 GTAACATCTAAGATAA-1,1,56,110,8194,9051 CCGACAATAGGCCGCC-1,1,57,111,8314,9120 ATGCTTAGGAGTTGAT-1,1,56,112,8194,9189 AACCCGAGCAGAATCG-1,1,57,113,8314,9258 CGGGTTTGTTAGGGCT-1,1,56,114,8194,9327 AGGCACGTGACTGTCC-1,0,57,115,8314,9395 GACAAGAGATGAGATT-1,0,56,116,8194,9464 AGCCCTTGGACATCCC-1,0,57,117,8314,9533 GCAGTTCGATCCGAGC-1,0,56,118,8194,9602 TCGAGGGCAACAGACG-1,0,57,119,8314,9671 ACTTTGTCGACGCACT-1,0,56,120,8194,9740 GAGTATCAAAGTTACA-1,0,57,121,8314,9808 CCAGGCTGGCGTCTGA-1,0,56,122,8194,9877 GGACTCTTCCGGTTGA-1,0,57,123,8314,9946 TCCCAGCACACGACAT-1,0,56,124,8194,10015 GCTCCATGAGTGCAGA-1,0,57,125,8314,10084 GCAGTGCGGGCGGATG-1,0,56,126,8194,10152 GCGTTCTGACTAAGCG-1,0,57,127,8314,10221 ATTTGGAGATTGCGGT-1,1,58,0,8434,1480 AAGGGTTTGATTTCAG-1,1,59,1,8553,1549 CCGGCCGCGAGCATAT-1,1,58,2,8434,1618 GAGTTCTGTGGGTGCT-1,1,59,3,8553,1687 AAACGAAGATGGAGTA-1,1,58,4,8434,1755 AATTACGAGACCCATC-1,1,59,5,8553,1824 CCTTTGAATTATGGCT-1,1,58,6,8434,1893 CATGGTATTAGTTTGT-1,1,59,7,8553,1962 AACGAAAGTCGTCCCA-1,1,58,8,8434,2031 ACATAAGTCGTGGTGA-1,1,59,9,8553,2099 GCACAACCTCGGGCGT-1,1,58,10,8434,2168 ATGCACGCGCTGTTCA-1,1,59,11,8553,2237 CGATGTTGTTATCTAC-1,1,58,12,8434,2306 GTCTCCTGCCAGTATG-1,1,59,13,8553,2375 GATGCCTTCTGCGGCA-1,1,58,14,8434,2444 ACCGGTCAGGTACACC-1,1,59,15,8553,2512 GTGGAGCGTTTACCGA-1,1,58,16,8434,2581 AGGCGGTTTGTCCCGC-1,1,59,17,8553,2650 TCCCTGGCGTATTAAC-1,1,58,18,8434,2719 AAACACCAATAACTGC-1,1,59,19,8553,2788 TGGACGCAATCCAGCC-1,1,58,20,8434,2857 GGAACCTTGACTCTGC-1,1,59,21,8553,2925 GTATCTCAGTCTTGAC-1,1,58,22,8434,2994 GCTGAATCTTCCAATC-1,1,59,23,8553,3063 AGATGCAAGACGTGCA-1,1,58,24,8434,3132 TTAAGGCCCGTACTTT-1,1,59,25,8553,3201 AGTATGCTGGAGACCA-1,1,58,26,8434,3270 GCGGCAAAGTATTGCC-1,1,59,27,8553,3338 GCGCAAATATATTCAA-1,1,58,28,8434,3407 GAAGAAACGATATTGT-1,1,59,29,8553,3476 GGACCTCTAGGCCGCC-1,1,58,30,8434,3545 AACAGCTGTGTGGCAA-1,0,59,31,8553,3614 TCGAATATCCCGCAGG-1,1,58,32,8434,3683 GCGACCCAACCATCTG-1,0,59,33,8553,3751 AGAGAAGGAGTACAAT-1,1,58,34,8434,3820 GGCTCCTCCACCTGTT-1,0,59,35,8553,3889 TCAGTGTATACGTCAT-1,1,58,36,8434,3958 ATTATTATGTCCGTCA-1,1,59,37,8553,4027 TTAGGTCATAACCGAC-1,0,58,38,8434,4096 AAGATGGCACCGGACC-1,1,59,39,8553,4164 CTACAAGAAATAACCC-1,0,58,40,8434,4233 ACTATTTCCGGGCCCA-1,1,59,41,8553,4302 TTGTTTCACATCCAGG-1,1,58,42,8434,4371 CGCTGTGTGGATGTTG-1,1,59,43,8553,4440 TCAACATAGCGCCCTA-1,1,58,44,8434,4509 GGCCGTTTGGGTTTCA-1,1,59,45,8553,4577 TACTCTTTCGTCTTCA-1,1,58,46,8434,4646 TTCGCGCGCCATACGA-1,1,59,47,8553,4715 CGGAAAGAATCAAACG-1,1,58,48,8434,4784 AGGCAGGGAGCGTACT-1,1,59,49,8553,4853 CCTTTAAGGGAGCACT-1,1,58,50,8434,4921 CGCCCAGCACGCCTAG-1,1,59,51,8553,4990 AGTATTTGGCACGACC-1,1,58,52,8434,5059 TATCCGCACCGTCGGG-1,1,59,53,8553,5128 ACCCGTGTCATCAGTA-1,1,58,54,8434,5197 CAACTGCTCATCCGAT-1,1,59,55,8553,5266 CCGGAGCGTACTTTCT-1,1,58,56,8434,5334 TACCGTAGGTTAACTA-1,1,59,57,8553,5403 TGAGGAGTGCCAGCTT-1,1,58,58,8434,5472 CCAGTCTTGTCATAGA-1,1,59,59,8553,5541 GGGCAGAGCAATCGTT-1,1,58,60,8434,5610 TACCAAATAGCCCAGA-1,1,59,61,8553,5679 TACCTACTCCCAGTAT-1,1,58,62,8434,5747 TGTGAGACTAGCCCAA-1,1,59,63,8553,5816 ATACCTAACCAAGAAA-1,1,58,64,8434,5885 GTCGGGAAGCAGAAAC-1,1,59,65,8553,5954 AATTAACGGATTTCCA-1,1,58,66,8433,6023 GAACCCTCTGTGTTCT-1,1,59,67,8553,6092 ATATAAAGCGCTCGTG-1,1,58,68,8433,6160 CCTGGTCGAATGTGGG-1,1,59,69,8553,6229 CTAGGTTCGGACGTGA-1,1,58,70,8433,6298 TCGGGAGACAGCGTAC-1,1,59,71,8553,6367 CATAAGAAGCTTGGCT-1,1,58,72,8433,6436 AAGCACCCTGCGTATC-1,1,59,73,8553,6505 AGTTTGCACCTGCCTC-1,1,58,74,8433,6573 GACTGCAAATCGAGCT-1,1,59,75,8553,6642 GTGTATATCAGCGGGC-1,1,58,76,8433,6711 CTTCAACTCCACTTGG-1,1,59,77,8553,6780 ACTTACGCATCCACGC-1,1,58,78,8433,6849 CATGAGATGCACTCTC-1,1,59,79,8553,6918 GAGCACCTGTGTCCAG-1,1,58,80,8433,6986 CGCGACCGCGACAGAT-1,1,59,81,8553,7055 GTCCCGCGACGTTATG-1,1,58,82,8433,7124 GCAGTGTGGCTATAGG-1,1,59,83,8553,7193 ATACTGCCTTACACCG-1,1,58,84,8433,7262 TACAGAAACGGTGGGC-1,1,59,85,8553,7330 GGCGCGGAGATCTTTC-1,1,58,86,8433,7399 CGTTAATGTCCCGACG-1,1,59,87,8553,7468 GCTAACTGAAGTCTGA-1,1,58,88,8433,7537 AGTGATAACCTGCGCG-1,1,59,89,8553,7606 TATGATCTTCTCTTTA-1,1,58,90,8433,7675 TGTACCTACACGAGGG-1,1,59,91,8553,7743 ATATCGTTCCTCGAAC-1,1,58,92,8433,7812 CGGCGCCATCAATCCC-1,1,59,93,8553,7881 CCTGTTTGAAGACACG-1,1,58,94,8433,7950 GCCACTCAGAGCGCGA-1,1,59,95,8553,8019 TCGGCTTGTATCGACG-1,1,58,96,8433,8088 TAGATGGTTCCTTACT-1,1,59,97,8553,8156 ATCGTTAGCTAGCGGA-1,1,58,98,8433,8225 ACAGCGACATTCTCAT-1,1,59,99,8553,8294 ATTCAACCATTTAAGG-1,1,58,100,8433,8363 CACTCTTCTGCTAGCC-1,1,59,101,8553,8432 CTAACTGATAATCGCC-1,1,58,102,8433,8501 TGATGTCAATTAAGTG-1,1,59,103,8553,8569 CGCCGTTCAGCATAGT-1,1,58,104,8433,8638 ATACTACCCGTACCAC-1,1,59,105,8553,8707 CCACTGTTTGGATTAA-1,1,58,106,8433,8776 CACTACGGGAGCTGCC-1,1,59,107,8553,8845 GACCAAACGTTGACTG-1,1,58,108,8433,8914 AAGAGGCCCTTTGGAA-1,1,59,109,8553,8982 ACACGTAGGCCACAAG-1,1,58,110,8433,9051 TACTCTTACTTTACTG-1,1,59,111,8553,9120 AGAGCCGCCGAGATTT-1,1,58,112,8433,9189 GGCCTGCTTCTCCCGA-1,1,59,113,8553,9258 TCAAGCGCGGACGGTA-1,1,58,114,8433,9327 ACACTGGGACAGTCGT-1,0,59,115,8553,9395 TGTGTAGTAGCACGTG-1,0,58,116,8433,9464 CTAGCCACAGGCGAGC-1,0,59,117,8553,9533 CTATCGCGTAGAGAAC-1,0,58,118,8433,9602 GTTCCCGTAAACATAT-1,0,59,119,8553,9671 TCTTTCCTTCGAGATA-1,0,58,120,8433,9740 ATATTGGAGAGGCCTT-1,0,59,121,8553,9808 AGGCGATAACTGGCGT-1,0,58,122,8433,9877 ACCCGGAGCACCACAA-1,0,59,123,8553,9946 TGAGCTCAACTGTATA-1,0,58,124,8433,10015 ACGACCCATGAGTTGC-1,0,59,125,8553,10084 CGGTCAGTCCATATTT-1,0,58,126,8433,10152 TCCGGCTGTCGGGTCG-1,0,59,127,8553,10221 ATTCCCGAAGGTACAG-1,1,60,0,8673,1480 CTAACAGCACAATAAC-1,1,61,1,8793,1549 TTGTGCGGAAGCGGAT-1,1,60,2,8673,1618 GGGCACTATTGACCAT-1,1,61,3,8793,1687 CCATAGAGGCTGCCAG-1,1,60,4,8673,1755 CCGAAGCATTGACCAA-1,1,61,5,8793,1824 TACTGAGGGAAGAAAG-1,1,60,6,8673,1893 TATGTAGAAACCCGGC-1,1,61,7,8793,1962 TGGTTAACTTACATTT-1,1,60,8,8673,2031 AGAACCCTCAATTGGG-1,1,61,9,8793,2099 CCTATATCGTGTCACG-1,1,60,10,8673,2168 ACGGCTGGATGTAGAA-1,1,61,11,8793,2237 CTCGCATTGCATAGCC-1,1,60,12,8673,2306 ACTTTGGTCGTGCTCC-1,1,61,13,8793,2375 GCTGGTTTAGGCCATA-1,1,60,14,8673,2444 TGTCGTTATCACATAT-1,1,61,15,8793,2512 ACACATGATCAAATCT-1,1,60,16,8673,2581 TATCCATCTCGGTTAG-1,1,61,17,8793,2650 CTCGTCGAGGGCTCAT-1,1,60,18,8673,2719 ATCAATGCCGTGGCTG-1,1,61,19,8793,2788 GAAACATAGGAAACAG-1,1,60,20,8673,2857 TAATAGGTCACCAGAA-1,1,61,21,8793,2925 CACCAGTCAGCATGCA-1,1,60,22,8673,2994 GAGCGCTGTTAGGTAA-1,1,61,23,8793,3063 CCCTATGTAGAGCAGA-1,1,60,24,8673,3132 GATCGCTATATCTCAG-1,1,61,25,8793,3201 AAGGGACTATGCATTC-1,1,60,26,8673,3270 CTCGGGTTCTCTGGCC-1,0,61,27,8793,3338 TATATATCGAGAAATG-1,1,60,28,8673,3407 ACCCGAGCGAAATTAC-1,0,61,29,8793,3476 TTGTTTCATTAGTCTA-1,0,60,30,8673,3545 ATGGGACCTGCTGAAC-1,0,61,31,8793,3614 TGCGACGGCCGAACGT-1,0,60,32,8673,3683 AGCTAACAAGCAATGT-1,0,61,33,8793,3751 CGTGTCTCGTTACGAC-1,0,60,34,8673,3820 CTAAATCCGGTGTACA-1,0,61,35,8793,3889 GAATAGTGCTCGATTA-1,0,60,36,8673,3958 AACAATACATTGTCGA-1,0,61,37,8793,4027 CACATCGTGCACGCGC-1,0,60,38,8673,4096 ACCGTGACCACGTGGG-1,0,61,39,8793,4164 CCCAATGAGATTTGCA-1,0,60,40,8673,4233 TCAGCAGTAGGCCCTG-1,0,61,41,8793,4302 CTACTCAAGGTATAGT-1,1,60,42,8673,4371 TAGTAGCTTATACCAG-1,1,61,43,8793,4440 ACGTTCGTTCAGGAAA-1,1,60,44,8673,4509 TTAGAATAAGGGTCGG-1,1,61,45,8793,4577 TTCTAGAAAGTCTTAT-1,1,60,46,8673,4646 CCTTCAGTTAAAGTGA-1,1,61,47,8793,4715 TAGCTAGTGATGATGG-1,1,60,48,8673,4784 AGCCCGGTAGCCTGTA-1,1,61,49,8793,4853 TACCTCAGTTGTCTGT-1,1,60,50,8673,4921 GACGGGTTGGCCCGTA-1,1,61,51,8793,4990 GAAACCTATACAAATG-1,1,60,52,8673,5059 TCCACCTCTAGCCTTT-1,1,61,53,8793,5128 AAGACCCAACTGAACA-1,1,60,54,8673,5197 CATACACGGTTCCCAC-1,1,61,55,8793,5266 ACTACGCGTTAGAATT-1,1,60,56,8673,5334 CTTGGCCAAGCTGGGA-1,1,61,57,8793,5403 TTACCCTAGGGATTGG-1,1,60,58,8673,5472 TTCGCACTGTACGACA-1,1,61,59,8793,5541 TAGGTGTTCCACAGAT-1,1,60,60,8673,5610 GAAGCCTGCACATTCC-1,1,61,61,8793,5679 GGCTTTCAATAAGGGT-1,1,60,62,8673,5747 TCCAGGGTATATACGA-1,1,61,63,8793,5816 CTCGCCGAATGTAGGG-1,1,60,64,8673,5885 AGGAAGCTGTCCGCCG-1,1,61,65,8793,5954 GTCTCAAGGCCCGGCT-1,1,60,66,8673,6023 ACCGACACATCTCCCA-1,1,61,67,8793,6092 TATACGCGTCATCACT-1,1,60,68,8673,6160 ATCTGGGCTGTTCTTG-1,1,61,69,8793,6229 TCAAATTTGAGACTCA-1,1,60,70,8673,6298 GTTAAGGGTGCGATGT-1,1,61,71,8793,6367 AGCAAAGGCCGCTAGT-1,1,60,72,8673,6436 TTATAGGTAATTGTCT-1,1,61,73,8793,6505 TTGTGCAGCCACGTCA-1,1,60,74,8673,6573 ACGGACTCTCAAAGCG-1,1,61,75,8793,6642 ATGCTCTGGCGCGGTA-1,1,60,76,8673,6711 ATAATCTTGGAGAACC-1,1,61,77,8793,6780 CTCATTGCTCTAACAA-1,1,60,78,8673,6849 TAGGTGACGATAACCT-1,1,61,79,8793,6918 CGGATCCTCAAGGACT-1,1,60,80,8673,6986 GGGCGTGGTTTCCCAG-1,1,61,81,8793,7055 TGGCTATGTGACATAC-1,1,60,82,8673,7124 CTTAGTGTAGTAGCAT-1,1,61,83,8793,7193 GGATTGCTGTGACTCC-1,1,60,84,8673,7262 ACTTCCATGCGGGACA-1,1,61,85,8793,7331 ACTCAAGTGCAAGGCT-1,1,60,86,8673,7399 ACAAGGATGCTTTAGG-1,1,61,87,8793,7468 TTGAACGACGTGCTGA-1,1,60,88,8673,7537 ATTCATCGTTGAGGCA-1,1,61,89,8793,7606 TGCAACCCATCTGCGG-1,1,60,90,8673,7675 AGTGCTAAACACAGCA-1,1,61,91,8793,7743 AACTCCAGAGCGTGTT-1,1,60,92,8673,7812 TCTCCACAAGTTGAAT-1,1,61,93,8793,7881 CTTTGCATCGCTCTTG-1,1,60,94,8673,7950 TCACAAACCGAGGTAC-1,1,61,95,8793,8019 CCGTAGGAAATCCCTG-1,1,60,96,8673,8088 AAACATTTCCCGGATT-1,1,61,97,8793,8156 GCCTCCGACAATTCAC-1,1,60,98,8673,8225 TCTGCATACCTTGCTT-1,1,61,99,8793,8294 ACCCATTTGTCCCTCT-1,1,60,100,8673,8363 CTGCAGAGAATCAGAG-1,1,61,101,8793,8432 GGAAACTAAATGGGCC-1,1,60,102,8673,8501 CAACCTACCGAGCAGT-1,1,61,103,8793,8569 CCGTAGGGTTGTTTAC-1,1,60,104,8673,8638 GGTTTGTGACCTGAGG-1,1,61,105,8793,8707 TAACCTAGGGAGTCCA-1,1,60,106,8673,8776 TTCCATCGACAGCGTG-1,1,61,107,8793,8845 ATCTCCCACGGAATAT-1,1,60,108,8673,8914 GTTTCAAACGAGTTGT-1,1,61,109,8793,8982 GGAACTTTGGCGATTA-1,1,60,110,8673,9051 CTGCAAGCACGTTCCG-1,1,61,111,8793,9120 CACAGTCCCGCTTCGC-1,1,60,112,8673,9189 TACGCTCGGTATTGGA-1,1,61,113,8793,9258 CTGGTAAAGTGTGGGC-1,0,60,114,8673,9327 CAACCAGTGGCCTACC-1,0,61,115,8793,9395 TCTTCGCGGTGAGAGG-1,0,60,116,8673,9464 TTCGGGTTGCCACGGG-1,0,61,117,8793,9533 ACCGATAGGCATAACC-1,0,60,118,8673,9602 CTTATAGATGGCTGTT-1,0,61,119,8793,9671 AGACGCCCACTTCGCC-1,0,60,120,8673,9740 AGGTCGCCTCCCAACA-1,0,61,121,8793,9808 CCTCACGTCAGCTAAT-1,0,60,122,8673,9877 CCACCTGTATGGAATA-1,0,61,123,8793,9946 GGACTCGAAGCTTTCA-1,0,60,124,8673,10015 AAGCCGGAGAGCAGGA-1,0,61,125,8793,10084 GCCTATCAGGTAAGAT-1,0,60,126,8673,10152 TCAGAGTGTGAGCATG-1,0,61,127,8793,10221 AAACATGGTGAGAGGA-1,1,62,0,8913,1480 ATCATTGTACCGCATT-1,1,63,1,9032,1549 TCAGCTTGAGCTTTCG-1,1,62,2,8913,1618 CCGCGCAAGATACCCA-1,1,63,3,9032,1687 CTATACTTAAAGCGAG-1,1,62,4,8913,1755 ACCGTCCACTGGGCCC-1,1,63,5,9032,1824 AAGACCAAATAACTCA-1,1,62,6,8913,1893 TGTTTCTGAAGCGTGC-1,1,63,7,9032,1962 TTCTCTTACAGGTGAT-1,1,62,8,8913,2031 AATTCATTGTCATGCA-1,1,63,9,9032,2100 GCCCGAGAGTCTAAAT-1,1,62,10,8913,2168 ATATAGAGTATTGGTC-1,1,63,11,9032,2237 TTGAAGGATGGGCGCC-1,1,62,12,8913,2306 TAGTACCACAACTTTC-1,1,63,13,9032,2375 ATCCCATCCACAGCGC-1,1,62,14,8913,2444 CTTAGGTATAGACCAG-1,1,63,15,9032,2512 TGACTCCGAATCATAC-1,1,62,16,8913,2581 ACTACATCCCGACAAG-1,1,63,17,9032,2650 TTGCCGCAGACCTACA-1,1,62,18,8913,2719 TAAGAGGGACAGGGAC-1,1,63,19,9032,2788 CGAATGAAGTCATTGC-1,1,62,20,8913,2857 AAGGGAACGACTGGCT-1,1,63,21,9032,2925 CGAATCTGCTCGACGC-1,1,62,22,8913,2994 ATCGTGGAAAGTCTGG-1,0,63,23,9032,3063 CCTATGGCTCCTAGTG-1,1,62,24,8913,3132 CGTCGCTTGGTTATAC-1,0,63,25,9032,3201 TGCTTAGAGAGAATGC-1,0,62,26,8913,3270 GATTGCTCCAGTTGCA-1,0,63,27,9032,3338 CGTGCTTCTACCTAAA-1,0,62,28,8913,3407 ACTCCAATATCATCAT-1,0,63,29,9032,3476 GCCGACCCACGACTGC-1,0,62,30,8913,3545 GAGGGTAGTAACAAAG-1,0,63,31,9032,3614 GGCCGAGACTCTGGTG-1,0,62,32,8913,3683 TATATAGGGCTTTACG-1,0,63,33,9032,3751 TGCCGGATGTACGAGC-1,0,62,34,8913,3820 AGGTAGATCGAGATAT-1,0,63,35,9032,3889 GATCAACATAAAGGGA-1,0,62,36,8913,3958 TAACAGCGTTTGTGCT-1,0,63,37,9032,4027 CTATAGGCGTTGATGT-1,0,62,38,8913,4096 GGTTTAATTACCATCG-1,0,63,39,9032,4164 CTCTTCTGGAAGTTAG-1,0,62,40,8913,4233 ATCTGACATGGAAGGA-1,0,63,41,9032,4302 TACGTACTAGTGCTGA-1,0,62,42,8913,4371 ATGACTATCAGCTGTG-1,0,63,43,9032,4440 CTTTGGGATTGTTGCA-1,0,62,44,8913,4509 AGACTGTTACCGGGTC-1,0,63,45,9032,4577 TCCTAACCGTCGGGCA-1,1,62,46,8913,4646 ACGCAAACTAATAGAT-1,1,63,47,9032,4715 AAGTGAGTCGGGTTTA-1,1,62,48,8913,4784 TAAAGCGGTATTTCCA-1,1,63,49,9032,4853 CTCCTCCAGCTCACAC-1,1,62,50,8913,4921 CGGTCCGTCGCAAGCC-1,1,63,51,9032,4990 CCTATATTTGTCCTGG-1,1,62,52,8913,5059 TCCAATAAAGGCTACC-1,1,63,53,9032,5128 AAAGGCTACGGACCAT-1,1,62,54,8913,5197 CGTGACCAGTCCTCTG-1,1,63,55,9032,5266 GATCTGCTATCTAAGG-1,1,62,56,8913,5334 CGAATGACGCATAATG-1,1,63,57,9032,5403 GCTCAATGTAATACCG-1,1,62,58,8913,5472 CTATGCCCGAATGCAA-1,1,63,59,9032,5541 CACAGGGCCGTTGTCA-1,1,62,60,8913,5610 TCAATACGCCGTCATG-1,1,63,61,9032,5679 AGCGGACACTTCGTAG-1,1,62,62,8913,5747 ATACGTTATGCACGGA-1,1,63,63,9032,5816 GAGTAGATACTAGTTG-1,1,62,64,8913,5885 CCAGCTCGAACGCATT-1,1,63,65,9032,5954 TGCTTCCCAAGCAGTA-1,1,62,66,8913,6023 GTAGACACGCCTGACT-1,1,63,67,9032,6092 CTCACATTTACTAAAT-1,1,62,68,8913,6160 GAATGCGAATCGGTTC-1,1,63,69,9032,6229 TAAGGCCCGTCACCCT-1,1,62,70,8913,6298 GAGTATGCGCGTGCAT-1,1,63,71,9032,6367 ATCCACATCGACAGAA-1,1,62,72,8913,6436 TAGACGAAACGCCAAT-1,1,63,73,9032,6505 CAGCAGTCTGTGCTGC-1,1,62,74,8913,6573 CTCACTGTGATACTTA-1,1,63,75,9032,6642 TTAATTGCTTTGGGTG-1,1,62,76,8913,6711 GTAGTCTACGATATTG-1,1,63,77,9032,6780 TTGCCGCTTTCTAGTA-1,1,62,78,8913,6849 GAACCTTTAACGATCC-1,1,63,79,9032,6918 TGGACCAATCTAAGAT-1,1,62,80,8913,6986 CTAGTAGAAAGGGATT-1,1,63,81,9032,7055 AACCTCGCTTTAGCCC-1,1,62,82,8913,7124 GAGTGTCAACCAGAAA-1,1,63,83,9032,7193 GTGATCCTTGTCATGA-1,1,62,84,8913,7262 CTCAACTAACCCGGAT-1,1,63,85,9032,7331 AGTGGCGTCTGAAGGT-1,1,62,86,8912,7399 GGGAAGGGCTTTCTCA-1,1,63,87,9032,7468 AGGCCTGAGAATCTCG-1,1,62,88,8912,7537 AGCCACAGGTTACCCG-1,1,63,89,9032,7606 TGCAATCTAACACGGT-1,1,62,90,8912,7675 GTTTGGGTTTCGCCCG-1,1,63,91,9032,7743 CCTATGTCCACTCCAC-1,1,62,92,8912,7812 CTGCCTTTCTAGTAAA-1,1,63,93,9032,7881 TTAGTAAACCTGCTCT-1,1,62,94,8912,7950 TTGTGGTGGTACTAAG-1,1,63,95,9032,8019 CCTCCTGTTGTGTCGT-1,1,62,96,8912,8088 ACAAAGCATGACCTAG-1,1,63,97,9032,8156 ATAGCAACTAGGGAAG-1,1,62,98,8912,8225 CCGCTCTTCCGAACTA-1,1,63,99,9032,8294 TAGAATAGCCGATGAA-1,1,62,100,8912,8363 GGTCTCCGTCCAGGTT-1,1,63,101,9032,8432 TAATTACGTCAGTAGA-1,1,62,102,8912,8501 TACGTAAAGCGGAGTG-1,1,63,103,9032,8569 GCTACAATCGAGGATA-1,1,62,104,8912,8638 TCAGCCAATCCGTAAA-1,1,63,105,9032,8707 ATCATAGCCCTATGTA-1,1,62,106,8912,8776 GAGGCCTGTTGATACA-1,1,63,107,9032,8845 ATATACGCTCGTGACG-1,1,62,108,8912,8914 CCCTTTAATGGAGTTC-1,1,63,109,9032,8982 TTACACGATCTGCGAC-1,1,62,110,8912,9051 TCGCATAAAGGGCGCA-1,1,63,111,9032,9120 TGTAGCCATCCCATTC-1,1,62,112,8912,9189 GGGTCTATCGCTTTCC-1,1,63,113,9032,9258 GGAGGGTCAAGTAAGA-1,0,62,114,8912,9327 TACGGCATGGACGCTA-1,0,63,115,9032,9395 CACGTCAATCAATGGA-1,0,62,116,8912,9464 CGCTTGGACGGATAGA-1,0,63,117,9032,9533 CGCGGTACGGTATACA-1,0,62,118,8912,9602 CCTACTCAACACGATT-1,0,63,119,9032,9671 CGTTTGGTGTTGTGGG-1,0,62,120,8912,9740 GTTGTTGCAAGATGGC-1,0,63,121,9032,9808 CATTCGTCGTAGCGGT-1,0,62,122,8912,9877 CAGCCTCGATAGCGGT-1,0,63,123,9032,9946 TCATAAGTCCAAGAAG-1,0,62,124,8912,10015 AAAGTGCCATCAATTA-1,0,63,125,9032,10084 GTTGCAGTCGACAACA-1,0,62,126,8912,10153 TAAATGGGCTACTGAG-1,0,63,127,9032,10221 GGACAAGCCATGATCG-1,0,64,0,9152,1480 TCCAATGCGTCGCCGC-1,0,65,1,9272,1549 AAAGAATGACCTTAGA-1,0,64,2,9152,1618 CCTATTATTCCGGCCG-1,0,65,3,9272,1687 CAGTAAGGGACGTCTC-1,1,64,4,9152,1755 GGGATGGACCCGCGTC-1,0,65,5,9272,1824 GACGCATACCCGTCGG-1,1,64,6,9152,1893 GGGCAGGATTTCTGTG-1,0,65,7,9272,1962 TATCTGAGCCGATATT-1,1,64,8,9152,2031 AATGTATGGCACTGTA-1,0,65,9,9272,2100 GCCTTTGTCAGTGGAC-1,1,64,10,9152,2168 AACCATAGGGTTGAAC-1,0,65,11,9272,2237 AAACTTAATTGCACGC-1,1,64,12,9152,2306 TAGGCGGCTGCAAAGA-1,0,65,13,9272,2375 TCCATCAATACTAATC-1,1,64,14,9152,2444 ACCTCGAACTTATGCT-1,0,65,15,9272,2512 ACAAACCATGCGTCCT-1,1,64,16,9152,2581 ACACCGGTCTGACCGC-1,0,65,17,9272,2650 ATGGCAGCATTACGAT-1,1,64,18,9152,2719 CTGGTGAATGGGCCTA-1,0,65,19,9272,2788 CACAGAGACGAGGACG-1,0,64,20,9152,2857 GCACAAACCCTAGATG-1,0,65,21,9272,2925 ACTATGTCCAGCTGCC-1,0,64,22,9152,2994 AAGCCGCCGTGAAATC-1,0,65,23,9272,3063 ATGGGTGTATACCTCC-1,0,64,24,9152,3132 TAAGCGCGAATCAAAT-1,0,65,25,9272,3201 AGCCCGGCATTAGAGG-1,0,64,26,9152,3270 GTGATCAAGCGTGCAC-1,0,65,27,9272,3338 CTGCCTTTAATACCTT-1,0,64,28,9152,3407 TACCTCCACACCAATG-1,0,65,29,9272,3476 GAGCATCAACAACTTG-1,0,64,30,9152,3545 CATACGAACTAGCTGG-1,0,65,31,9272,3614 GGGAACGGTTTCAGAT-1,0,64,32,9152,3683 AGGGTGCCGTTCTTTA-1,0,65,33,9272,3751 ACGACTGGTCATACTC-1,0,64,34,9152,3820 GGATCTTACTGCCCTT-1,0,65,35,9272,3889 TACTCCTCTAGTTGAC-1,0,64,36,9152,3958 GTAGCTCCGGGAGGCT-1,0,65,37,9272,4027 GGACTCGTGAGTGGTC-1,0,64,38,9152,4096 GTAGTTCGAAGGCGAA-1,0,65,39,9272,4164 CTCAAACCACTGCCCG-1,0,64,40,9152,4233 GAGGGAGTCAGATCGC-1,0,65,41,9272,4302 GCGTCCCTAAGACATA-1,0,64,42,9152,4371 TCTCTTACCGCGAACC-1,0,65,43,9272,4440 GGCTACTATACACTCC-1,0,64,44,9152,4509 CGTTGCCCGCGTGGGA-1,0,65,45,9272,4577 TATAGAGTCGCTTGAA-1,0,64,46,9152,4646 ATGTTGTAGTCTGTTT-1,0,65,47,9272,4715 AGTATACACAGCGACA-1,0,64,48,9152,4784 TGTGGTTGCTAAAGCT-1,0,65,49,9272,4853 TGATTCCCGGTTACCT-1,1,64,50,9152,4922 CACTGACGATTGTGGA-1,1,65,51,9272,4990 AACATTGTGACTCGAG-1,1,64,52,9152,5059 GTCCAATATTTAGCCT-1,1,65,53,9272,5128 GCTCTTTCCGCTAGTG-1,1,64,54,9152,5197 GGGTCAGGAGCTAGAT-1,1,65,55,9272,5266 AGGTGGTGACCTTCGC-1,1,64,56,9152,5334 CCCGGGTCGTTCAGGG-1,1,65,57,9272,5403 AGCCAAGCTTTGTGTC-1,1,64,58,9152,5472 TGTGGCGGGCTTCTGG-1,1,65,59,9272,5541 CGAGGGTATCCAGGTG-1,1,64,60,9152,5610 CGTTCAGACCCGCGAA-1,1,65,61,9272,5679 TCATATGAGCTTTGTT-1,1,64,62,9152,5747 AGTTGACGGTCCTTGC-1,1,65,63,9272,5816 ATAATTAGCTAAGTAG-1,1,64,64,9152,5885 GGTCTTGAGCGCTCTT-1,1,65,65,9272,5954 CGTTGTCGGCAATTGA-1,1,64,66,9152,6023 TCTTGCTCCCGATACT-1,1,65,67,9272,6092 AGCAGAAGGAGAAAGA-1,1,64,68,9152,6160 GAAGCCACTGATTATG-1,1,65,69,9272,6229 TGCTCTTGAGAGTTTG-1,1,64,70,9152,6298 GACATCCGTCGAACTG-1,1,65,71,9272,6367 AGATATAATACGACTA-1,1,64,72,9152,6436 TCGCTACTGGCTTTGA-1,1,65,73,9272,6505 GTGACAGCTTCCCACT-1,1,64,74,9152,6573 GTGACGCAGGTTTCAT-1,1,65,75,9272,6642 GGGAAGACGGTCTGTC-1,1,64,76,9152,6711 CGTCGCATGTGAGCCA-1,1,65,77,9272,6780 AGAAGGTTGTAGGTCG-1,1,64,78,9152,6849 GGCCGGCGTCTGCTAT-1,1,65,79,9272,6918 TTGACCAGGAACAACT-1,1,64,80,9152,6986 AGTCGTATAAAGCAGA-1,1,65,81,9272,7055 GGCGTAGGGAAAGCTG-1,1,64,82,9152,7124 AAACCTAAGCAGCCGG-1,1,65,83,9272,7193 ATTGCCTTTATGTTTG-1,1,64,84,9152,7262 CAGGCAGTCTTACCAG-1,1,65,85,9272,7331 AGCTAAGTACGCAGGC-1,1,64,86,9152,7399 AAATCCGATACACGCC-1,1,65,87,9272,7468 CGAGAGCTTTCACTAC-1,1,64,88,9152,7537 CGCCCAGCGTTTCACG-1,1,65,89,9272,7606 TTAAGTATTGTTATCC-1,1,64,90,9152,7675 AAACGGGCGTACGGGT-1,1,65,91,9272,7744 GTATCCTTTGGTAACC-1,1,64,92,9152,7812 CATAGTCAAATACATA-1,1,65,93,9272,7881 TCTATGCTATAACGAC-1,1,64,94,9152,7950 ACGTTCTGTACAAGTC-1,1,65,95,9272,8019 CGCGAAGTGGCATACT-1,1,64,96,9152,8088 ACCAACCGCACTCCAC-1,1,65,97,9272,8156 GTCATGCGCGAGGGCT-1,1,64,98,9152,8225 TAGGCTAAAGTGGCAC-1,1,65,99,9272,8294 TGGCTACACTCTACCT-1,1,64,100,9152,8363 TGTCCACGGCTCAACT-1,1,65,101,9272,8432 AATTGCAGCAATCGAC-1,1,64,102,9152,8501 GTCAACCAGGCCTATA-1,1,65,103,9272,8569 ATCTTATCGCACACCC-1,1,64,104,9152,8638 GTCTATTGCATGCTCG-1,1,65,105,9272,8707 GCACGTGGTTTACTTA-1,1,64,106,9152,8776 ATTCGCGCCTTGAGAG-1,1,65,107,9272,8845 AGCGATGCGCCTAATA-1,1,64,108,9152,8914 TCTATAGGTGGGTAAT-1,1,65,109,9272,8982 AGATACCAATAGAACC-1,1,64,110,9152,9051 CGTGTATGGGAGCTGA-1,1,65,111,9272,9120 ATGTACATGCGGTGAG-1,1,64,112,9152,9189 TTGGCTCAATATGTGT-1,1,65,113,9272,9258 GTTCGGAGCACTCAAC-1,0,64,114,9152,9327 TCCCTCTTCTCAAGGG-1,0,65,115,9272,9395 TTACGTATCTATGACA-1,0,64,116,9152,9464 CCCATATAGGTCGATT-1,0,65,117,9272,9533 GTCCACGTCGCATTCG-1,0,64,118,9152,9602 AATTGTGGTTGCCAAA-1,0,65,119,9272,9671 AGGAACGAACGACTTC-1,0,64,120,9152,9740 TAATTCCAATGCTTCA-1,0,65,121,9272,9808 AGGGCCCTAATGTTCT-1,0,64,122,9152,9877 AGGTGTTGCCGACCAC-1,0,65,123,9272,9946 CTGAGAGTAGAAATAC-1,0,64,124,9152,10015 TAGAAGAAGGGTTACA-1,0,65,125,9272,10084 GGTGACTGATAGAGAG-1,0,64,126,9152,10153 TACCCTCGGTAACCCT-1,0,65,127,9272,10221 TGTAAGACTGATAAGA-1,0,66,0,9392,1480 GTCACTCATGAGCGAT-1,0,67,1,9512,1549 CGGTTTACTGAACATT-1,0,66,2,9392,1618 GAGATCGATCTTACTC-1,0,67,3,9512,1687 TCTTTCATCCGTCCTT-1,0,66,4,9392,1755 TCGGATCTGGATGACC-1,0,67,5,9512,1824 GTCCTAGGATACCTTA-1,0,66,6,9392,1893 TGTACCCGACCCTAAT-1,0,67,7,9512,1962 AGGTTCTCCTTTCCGG-1,0,66,8,9392,2031 AATTGCGTGGATTACA-1,0,67,9,9512,2100 CGATAGCGATACAGTG-1,0,66,10,9392,2168 CGCCCTAATTGTTCAA-1,0,67,11,9511,2237 ATTATGAGACCCAATT-1,0,66,12,9392,2306 CCTCCTAGCTAGAGTC-1,0,67,13,9511,2375 CGAAGGGTTTCAGATT-1,0,66,14,9392,2444 CACAAGCTAAGAAAGG-1,0,67,15,9511,2512 CACCGGTAGAGACATT-1,0,66,16,9392,2581 ACTCATGGCAGCCTTC-1,0,67,17,9511,2650 CATCCAATATAGTTTG-1,0,66,18,9392,2719 CAGATATGAAGATGAC-1,0,67,19,9511,2788 GCAAAGGGCGTTAGCC-1,0,66,20,9392,2857 CTGTTGTTCAGTCGTA-1,0,67,21,9511,2925 AAAGGCCCTATAATAC-1,0,66,22,9392,2994 AACATTGAAGTTGATC-1,0,67,23,9511,3063 GCTAGCGATAGGTCTT-1,0,66,24,9392,3132 ATTGCCTATTAGACCG-1,0,67,25,9511,3201 GGGCGTTTACATTCAT-1,0,66,26,9392,3270 CCTCTACAAGGATTGG-1,0,67,27,9511,3338 AGTGACTGTGACACAA-1,0,66,28,9392,3407 AGCCCTCCCTGGTGGC-1,0,67,29,9511,3476 CGGTTGAGTATCCTTC-1,0,66,30,9392,3545 CATTATCCCATTAACG-1,0,67,31,9511,3614 AATGTGCTAATCTGAG-1,0,66,32,9392,3683 CTTAGTTGAGGAATCG-1,0,67,33,9511,3751 CTTCTGGGCGTACCTA-1,0,66,34,9392,3820 AGTCAAATGATGTGAT-1,0,67,35,9511,3889 TGAACAAGCAGGGACT-1,0,66,36,9392,3958 AATACCGGAGGGCTGT-1,0,67,37,9511,4027 GTTTGGTGATCGGTGC-1,0,66,38,9392,4096 GACTGCTGGTGAGAAA-1,0,67,39,9511,4164 CGATCCTCGCAACATA-1,0,66,40,9392,4233 CCAACCTTATGTAACT-1,0,67,41,9511,4302 CGTGGTACCCAAAGGC-1,0,66,42,9392,4371 AACCCGACAACCCGTG-1,0,67,43,9511,4440 TATGTAAAGTGCTTAA-1,0,66,44,9392,4509 GCAAGTGTAAAGCATG-1,0,67,45,9511,4577 GTAACTGCCCAAGGAG-1,0,66,46,9392,4646 GGTGCATAAATGATTA-1,0,67,47,9511,4715 TAGTCCCGGAGACCAC-1,0,66,48,9392,4784 CGGCCAGAGCGACCAT-1,0,67,49,9511,4853 TGAATGAGTGTTTCCC-1,0,66,50,9392,4922 TTCACTTCCTAGAACG-1,0,67,51,9511,4990 CGCTTAGTATTGATAC-1,0,66,52,9392,5059 AACGCGACCTTGGGCG-1,0,67,53,9511,5128 GTGCACCAGCTTCAAC-1,1,66,54,9392,5197 TTCTATTAAACGCAGC-1,1,67,55,9511,5266 TGGCAAGCACAAGTCG-1,1,66,56,9392,5334 ATCTGCTGTTATCGCC-1,1,67,57,9511,5403 AATTCCAAGCATGTAC-1,1,66,58,9392,5472 AAACGGTTGCGAACTG-1,1,67,59,9511,5541 GAAGGAGTCGAGTGCG-1,1,66,60,9392,5610 GGCAAGCCCATAGTGG-1,1,67,61,9511,5679 TGACCAAATCTTAAAC-1,1,66,62,9392,5747 TTCGGTACTGTAGAGG-1,1,67,63,9511,5816 ATGTACGATGACGTCG-1,1,66,64,9392,5885 ATCTAGCTTGTGAGGG-1,1,67,65,9511,5954 AGCGGGTCTGACACTC-1,1,66,66,9392,6023 GAGGTACGCGTGTCCC-1,1,67,67,9511,6092 GCACTGCCTACCTTTA-1,1,66,68,9392,6160 GGAGCGAGGCCTACTT-1,1,67,69,9511,6229 AAACTCGGTTCGCAAT-1,1,66,70,9392,6298 GGCGCTTCATTCCCTG-1,1,67,71,9511,6367 TGCTCGGTGGGTCACC-1,1,66,72,9392,6436 AAGCGCAGGGCTTTGA-1,1,67,73,9511,6505 GACCTTCCACGTCTAC-1,1,66,74,9392,6573 GTTAGCCCATGACATC-1,1,67,75,9511,6642 AATTCGATTCGAGGAT-1,1,66,76,9392,6711 AGTCTTTAAAGTGTCC-1,1,67,77,9511,6780 GACTAGGCCGTTAGGT-1,1,66,78,9392,6849 TCCAAGCCTAGACACA-1,1,67,79,9511,6918 GATTGGGAAAGGTTGT-1,1,66,80,9392,6986 GATGAGGAACCTTCGG-1,1,67,81,9511,7055 TGAATACCGACGCGTA-1,1,66,82,9392,7124 AATCGTGAGCCGAGCA-1,1,67,83,9511,7193 GCGAAGAATCTGACGG-1,1,66,84,9392,7262 GAACAACTGGGATGAA-1,1,67,85,9511,7331 TCGCCGACATATTCGC-1,1,66,86,9392,7399 CGTAGAGAGTAATTAT-1,1,67,87,9511,7468 CGATAGTCGTACTGCA-1,1,66,88,9392,7537 CGCATGCCGAATGCGT-1,1,67,89,9511,7606 CTCTAGCCCTCGGAAA-1,1,66,90,9392,7675 TCCAACTCAGCTATCT-1,1,67,91,9511,7744 GTCTAGTGAGCCGCTT-1,1,66,92,9392,7812 TACCGAATAATTGTAA-1,1,67,93,9511,7881 ATATAACACGGGCGCA-1,1,66,94,9392,7950 GCATGCTAATAACGAT-1,1,67,95,9511,8019 TCCGGGCTTGACGGGA-1,1,66,96,9392,8088 ATTATTCAGAGTCACT-1,1,67,97,9511,8156 TAGCAGTATGACTAAA-1,1,66,98,9392,8225 TATGAAGAATTAAGGT-1,1,67,99,9511,8294 CAAGGCCAGTGGTGCA-1,1,66,100,9392,8363 TGCGTACGGCTAATTG-1,1,67,101,9511,8432 CAGATAATGGGCGGGT-1,1,66,102,9392,8501 GAGAACGGTTCTGACT-1,1,67,103,9511,8569 CGCTTCGGTCTAAGAC-1,1,66,104,9392,8638 AGCATTACGAGGCAAG-1,1,67,105,9511,8707 AAGTTGTGATGTTATA-1,1,66,106,9391,8776 TTGCTCATAGTACGTG-1,1,67,107,9511,8845 TACTTAAACATGTACA-1,1,66,108,9391,8914 AGTGAGTCGAATTAAC-1,1,67,109,9511,8982 TAGGCCTATATAGTCT-1,1,66,110,9391,9051 ACTCGCCGTTCGATAA-1,1,67,111,9511,9120 GGTACGTTGCGGCCGG-1,1,66,112,9391,9189 TATTGCCGGGCTTGTA-1,1,67,113,9511,9258 GGTAAACTCTGCGCTG-1,0,66,114,9391,9327 TCCCTTGTCTGAAACT-1,0,67,115,9511,9395 CATGATCGCTTTGAGA-1,0,66,116,9391,9464 GGACGGGCGACCAACC-1,0,67,117,9511,9533 GAGAGGCCTATGTGTA-1,0,66,118,9391,9602 TCGTAACTCCCAAGAC-1,0,67,119,9511,9671 CGTATCTAGAACTAAG-1,0,66,120,9391,9740 GCACCTTCCCGAAGGT-1,0,67,121,9511,9808 TACCTCTTTACCATCC-1,0,66,122,9391,9877 TGACTCTAACTGGTAA-1,0,67,123,9511,9946 GAGAAACTGGATCCCA-1,0,66,124,9391,10015 ATCCGGACCAGCCTGA-1,0,67,125,9511,10084 TTATTTAGGTTCCTTA-1,0,66,126,9391,10153 CGAATTCCCGGTTCAA-1,0,67,127,9511,10221 TAGTTTGATCGGTCGC-1,0,68,0,9631,1480 AGTCGAAACGATTCAG-1,0,69,1,9751,1549 ACGTCGGGCAACTCGG-1,0,68,2,9631,1618 ACTTGCTCTATCTACC-1,0,69,3,9751,1687 ATTACGGGCTACGGTT-1,0,68,4,9631,1755 GCAAACGTAAGCGACC-1,0,69,5,9751,1824 TTCGGACTGGGCATGG-1,0,68,6,9631,1893 GGGCCATTCGTGCTGG-1,0,69,7,9751,1962 GAGTTGTCACCAGTCT-1,0,68,8,9631,2031 AGTAATTTGCAAGCGT-1,0,69,9,9751,2100 GTGGCCGGTTTCTCGG-1,0,68,10,9631,2168 ATCTTAGGGCATTAAT-1,0,69,11,9751,2237 CTACATATCGCGGGAC-1,0,68,12,9631,2306 ATGGTATTTACTGATT-1,0,69,13,9751,2375 CCGTCAACCTCTGGCG-1,0,68,14,9631,2444 GCTTCGACGTTCAATC-1,0,69,15,9751,2513 GACCGATTAAATATGT-1,0,68,16,9631,2581 GTCGAATTTGGGCGCT-1,0,69,17,9751,2650 TCACGGCCCAAGAGAG-1,0,68,18,9631,2719 CTACGATCCTATCCTA-1,0,69,19,9751,2788 TGCAGTGGTAGGGAAC-1,0,68,20,9631,2857 TTGCCTAATCCAAAGT-1,0,69,21,9751,2925 AGCGAGACGTGAAGGC-1,0,68,22,9631,2994 TTCTACCTCAATCGGT-1,0,69,23,9751,3063 TACGCTGCTGTGTTAA-1,0,68,24,9631,3132 TAGTCCTGCACTAAGC-1,0,69,25,9751,3201 AGCACACGTTTAGACT-1,0,68,26,9631,3270 GTTCGACAATTGTATA-1,0,69,27,9751,3338 CCATGTTCATCTATAT-1,0,68,28,9631,3407 CCCTCGATAATACACA-1,0,69,29,9751,3476 ACTGCCCGCCATTCTC-1,0,68,30,9631,3545 CTATATCCAGCCTGGC-1,0,69,31,9751,3614 CGCACGTCTGTTTATG-1,0,68,32,9631,3683 AATCAGGTTTCATTTA-1,0,69,33,9751,3751 AGAGAAACACCAGAAA-1,0,68,34,9631,3820 ACCCGATTGGTTCCGA-1,0,69,35,9751,3889 TACCAGGAATCCCGTC-1,0,68,36,9631,3958 AAGTGCTTCTCTATTG-1,0,69,37,9751,4027 TGCATGTGACCCATAG-1,0,68,38,9631,4096 TAGATTCAAAGTGCGG-1,0,69,39,9751,4164 AGGGTCAGAGCACTCG-1,0,68,40,9631,4233 GTGAGATAACCTTATA-1,0,69,41,9751,4302 GTGTCAGTGTACGTGG-1,0,68,42,9631,4371 CTGTAGTGAGGATCGA-1,0,69,43,9751,4440 GATAGTGCGAGTAAGT-1,0,68,44,9631,4509 AGGGTTCAGACGGTCC-1,0,69,45,9751,4577 GGACTCGACAGCGCAT-1,0,68,46,9631,4646 CACTCTCAAGCATCGA-1,0,69,47,9751,4715 GAGCGGAATGCGGTGT-1,0,68,48,9631,4784 CAGTTCGAGGACCCGA-1,0,69,49,9751,4853 CGTAACTTCGACACTT-1,0,68,50,9631,4922 TGATCACCACACTGAC-1,0,69,51,9751,4990 CATACTTCTTTCTCCG-1,0,68,52,9631,5059 CAAGTAAGTGATAGAC-1,0,69,53,9751,5128 AGCCCGCAACAAGCAG-1,0,68,54,9631,5197 GCTCCATGCAAAGCAA-1,0,69,55,9751,5266 TCGTACCGACGTCAAG-1,1,68,56,9631,5334 ATTATCGGAATGTACG-1,0,69,57,9751,5403 ACCTACTATAAATCTA-1,1,68,58,9631,5472 TATCCTATCAACTGGT-1,0,69,59,9751,5541 GCGCGGTCTAGTAACT-1,1,68,60,9631,5610 CCTTCGTATAGAATCC-1,1,69,61,9751,5679 TGGGCGATACAATAAG-1,1,68,62,9631,5747 TGACATGTAACGTGAC-1,1,69,63,9751,5816 TTGGGAAGACGAGCCG-1,1,68,64,9631,5885 GGTGTAAATCGATTGT-1,1,69,65,9751,5954 GAACTGTGGAGAGACA-1,1,68,66,9631,6023 TCCACATCGTATATTG-1,1,69,67,9751,6092 CCTATGGTCAAAGCTG-1,1,68,68,9631,6160 TCCTTGTCCTTTAATT-1,1,69,69,9751,6229 AAGTTTATGGGCCCAA-1,1,68,70,9631,6298 GTCCGGGTTCACATTA-1,1,69,71,9751,6367 ATGTAGCGCGCGTAGG-1,1,68,72,9631,6436 TACGGAAGCCAAACCA-1,1,69,73,9751,6505 GCCCTGAGGATGGGCT-1,1,68,74,9631,6573 CGGGCGATGGATCACG-1,1,69,75,9751,6642 TGCGGACTTGACTCCG-1,1,68,76,9631,6711 TAATACTAGAACAGAC-1,1,69,77,9751,6780 TCAAATTGTTGTGCCG-1,1,68,78,9631,6849 GGGCAGTCAACGCCAA-1,1,69,79,9751,6918 TCGCTGCCAATGCTGT-1,1,68,80,9631,6986 TACGTGGGCCCAGGGC-1,1,69,81,9751,7055 GCCTACGTTCTGTGCA-1,1,68,82,9631,7124 TTGCGTGTGTAGGCAT-1,1,69,83,9751,7193 TCCTAAAGATTCAGAC-1,1,68,84,9631,7262 TGGGTGCACAAGCCAT-1,1,69,85,9751,7331 GGGAGCGACCGTAGTG-1,1,68,86,9631,7399 CATAGAGGAGATACTA-1,1,69,87,9751,7468 CTTCGATTGCGCAAGC-1,1,68,88,9631,7537 GTGCCTGAGACCAAAC-1,1,69,89,9751,7606 TCATCCTCAGCTGCTT-1,1,68,90,9631,7675 TGCAACTACTGGTTGA-1,1,69,91,9751,7744 ATGTTGATTAGAGACT-1,1,68,92,9631,7812 GTTTCTAGAGGCGCGG-1,1,69,93,9751,7881 TACAAGGGCTTCTTTA-1,1,68,94,9631,7950 ACAGGCACGGATCCTT-1,1,69,95,9751,8019 CCCAAGTCATTACACT-1,1,68,96,9631,8088 ACTCTGACCTAATAGA-1,1,69,97,9751,8156 GGATGGCTTGAAGTAT-1,1,68,98,9631,8225 ACCCTCCCGTCAGGGC-1,1,69,99,9751,8294 AGCTTCTTCTCGAGCA-1,1,68,100,9631,8363 TTGCGCTTGATCAATA-1,1,69,101,9751,8432 TGGGTGTAATAGATTT-1,1,68,102,9631,8501 CATGGTTTATTAATCA-1,1,69,103,9751,8569 TTGCCTTCTCGCCGGG-1,1,68,104,9631,8638 TTAAAGTAAGTCGCCA-1,1,69,105,9751,8707 AGTTGGCAAGGCTAGA-1,1,68,106,9631,8776 CCGCACTTGCAATGAC-1,1,69,107,9751,8845 AATGTTGTCGTGAGAC-1,1,68,108,9631,8914 CCAAGGTTGCCCTTTC-1,1,69,109,9751,8982 TGTGACTAGAGTTTGC-1,1,68,110,9631,9051 TTGTGATCTGTTCAGT-1,1,69,111,9751,9120 GGAGTTGATTCTGTGT-1,1,68,112,9631,9189 GTAGTGAGCAACCTCA-1,1,69,113,9751,9258 AAGACATACGTGGTTT-1,1,68,114,9631,9327 CATCCCGAGATTCATA-1,0,69,115,9751,9395 GGCCGCAGGAACCGCA-1,0,68,116,9631,9464 CCAGAAACTGATGCGA-1,0,69,117,9751,9533 ACCCGTAGTCTAGTTG-1,0,68,118,9631,9602 AGGGTCTGGACGCAGT-1,0,69,119,9751,9671 TTGAAACCCTCATTCC-1,0,68,120,9631,9740 TCAATCCCGCGCCAAA-1,0,69,121,9751,9808 AGGACATCGGCACACT-1,0,68,122,9631,9877 GACAAGACGCCCGTGC-1,0,69,123,9751,9946 GAGTAAATTAAGAACC-1,0,68,124,9631,10015 TAAGTCGGTGAGCTAG-1,0,69,125,9751,10084 CTTACTGACTCCTCTG-1,0,68,126,9631,10153 TTAACTGATCGTTTGG-1,0,69,127,9751,10221 GGGCGATCCATAGGCC-1,0,70,0,9871,1480 CGTATTGTTTGGCGCC-1,0,71,1,9991,1549 CGCGTGGGCCTGTGTT-1,0,70,2,9871,1618 AAATCTGCCCGCGTCC-1,0,71,3,9991,1687 GCTGAAGGGTTCTTGG-1,0,70,4,9871,1755 TAATTGCGCTGATTAC-1,0,71,5,9991,1824 TCGCGCGTTTACATGA-1,0,70,6,9871,1893 TAACTGAAATACGCCT-1,0,71,7,9991,1962 CCTGTCGTGTATGAAG-1,0,70,8,9871,2031 CGGGAACGCCCTGCAT-1,0,71,9,9991,2100 AGTTGCGGTCCTCAAC-1,0,70,10,9871,2168 GGGTCCTTGGAAGAAG-1,0,71,11,9991,2237 CGGGAAGTACCGTGGC-1,0,70,12,9871,2306 ACGGTCACCGAGAACA-1,0,71,13,9991,2375 TAGACTCAGTTGGCCT-1,0,70,14,9871,2444 CCTTCCGCAACGCTGC-1,0,71,15,9991,2513 CAGTGTTAATCTCTCA-1,0,70,16,9871,2581 CAGGCCAGTACCACCT-1,0,71,17,9991,2650 GATCGCTGTGGTGCGT-1,0,70,18,9871,2719 GTATCTCGGGCGCTTT-1,0,71,19,9991,2788 CCGGGCTAAGAATTTC-1,0,70,20,9871,2857 CTTCACGCCCTGGTAC-1,0,71,21,9991,2925 CGGATGAATGCTGTGA-1,0,70,22,9871,2994 CTCTGCAGGCATTCTT-1,0,71,23,9991,3063 TCAAAGTCACGGCGTC-1,0,70,24,9871,3132 TGGGTTTCGGGCGTAC-1,0,71,25,9991,3201 TGCTATGGCAAAGGGA-1,0,70,26,9871,3270 TTCACGGTCGTCACGT-1,0,71,27,9991,3338 CGTAAAGCAAGAAATC-1,0,70,28,9871,3407 CTGATCCCTTTATGCA-1,0,71,29,9991,3476 GAGTATACCCTAATCA-1,0,70,30,9871,3545 CCACGGCAGGTGTAGG-1,0,71,31,9990,3614 ACGTACTTTGGCACGG-1,0,70,32,9871,3683 CCTGAGAATAAATGCA-1,0,71,33,9990,3751 TTGATGCCGCTCGTCG-1,0,70,34,9871,3820 GCCAGGAAAGAACACT-1,0,71,35,9990,3889 TCCGACCGCTAATCAA-1,0,70,36,9871,3958 TATATCAAAGTGATCT-1,0,71,37,9990,4027 CCTCGGTTTCCTTGCC-1,0,70,38,9871,4096 TAAATTTAGTAACACC-1,0,71,39,9990,4164 CTCGTTACGGCTACCA-1,0,70,40,9871,4233 GCCGTCGGTTTCGGGC-1,0,71,41,9990,4302 GTTCCGTCCGCCTGCA-1,0,70,42,9871,4371 CTAGGGATAGGGACAA-1,0,71,43,9990,4440 GTCCAGGCACGTGTGC-1,0,70,44,9871,4509 GAGGAATATCTCTTTG-1,0,71,45,9990,4577 CGTTCAAGGAAACGGA-1,0,70,46,9871,4646 GTGGGAACAAACCGGG-1,0,71,47,9990,4715 GGGCACGTAGTACTGT-1,0,70,48,9871,4784 ACTACAAAGAGAGGTG-1,0,71,49,9990,4853 GGTGTAGGTAAGTAAA-1,0,70,50,9871,4922 CCTGTTCAACCTCGGG-1,0,71,51,9990,4990 TGAGGTGTGTGGCGGA-1,0,70,52,9871,5059 ATTGTCTGTTTCATGT-1,0,71,53,9990,5128 GCCGGTCGTATCTCTC-1,0,70,54,9871,5197 ATATGGGATAGCAACT-1,0,71,55,9990,5266 GATAGAACCCGCTAGG-1,0,70,56,9871,5335 ATCCCATTTCCGTGGG-1,0,71,57,9990,5403 GATGCTACCTTCGATG-1,0,70,58,9871,5472 TGCAAAGTTCGTCTGT-1,0,71,59,9990,5541 GTTCAGTCGCCAAATG-1,0,70,60,9871,5610 GTCTCCGCCTCAATAC-1,0,71,61,9990,5679 AGTAGAAGGCGCCTCA-1,0,70,62,9871,5747 GTTGTAGATTTATGAG-1,0,71,63,9990,5816 CTATTTGCTTGGAGGA-1,1,70,64,9871,5885 AGCCATATAGTATGTG-1,0,71,65,9990,5954 TGTTCCGGCCTGAGCT-1,1,70,66,9871,6023 TGCCGTGGGACCCAAT-1,1,71,67,9990,6092 TTGCAAGAAGACTCCT-1,1,70,68,9871,6160 CCGCTCCAGGGCGATC-1,1,71,69,9990,6229 CAAACCCTCCGGCGGG-1,1,70,70,9871,6298 CGGACCTTTACGTCCC-1,1,71,71,9990,6367 ACGTAGGAGAGTCGCT-1,1,70,72,9871,6436 CTGCGACCTCGCCGAA-1,1,71,73,9990,6505 GGCCCAGCTGGTTTGC-1,1,70,74,9871,6573 GGATTAATCATGGACC-1,1,71,75,9990,6642 GAGATGGCTTTAATCA-1,1,70,76,9871,6711 AGTACAGAAGCTTATA-1,1,71,77,9990,6780 GCGGCTTTAGCAAGTT-1,1,70,78,9871,6849 ACCGAGTCTCCTTATT-1,1,71,79,9990,6918 GACCACACTTCCCTTT-1,1,70,80,9871,6986 TGTAGCCAATTCCGTT-1,1,71,81,9990,7055 CTCGTCTGTGCCTTCG-1,1,70,82,9871,7124 GGACTCTTTGACTAAG-1,1,71,83,9990,7193 TCATCGACGACCGTCG-1,1,70,84,9871,7262 TACTACGTGCAATGCG-1,1,71,85,9990,7331 CCCTACTTGAACAATG-1,1,70,86,9871,7399 GCAGCTGTCAACGCAT-1,1,71,87,9990,7468 ATCTACCATCTGCTCC-1,1,70,88,9871,7537 TCTCAAATCAATCGGG-1,1,71,89,9990,7606 ACTCCGGCCGACCACT-1,1,70,90,9871,7675 TACACCTCTTCGAATC-1,1,71,91,9990,7744 GTGGCTGTTTCTGTTC-1,1,70,92,9871,7812 ACGACTCTAGGGCCGA-1,1,71,93,9990,7881 TCGTTTACGCGACCCT-1,1,70,94,9871,7950 AGGATATCCGACTGCA-1,1,71,95,9990,8019 GACACTTCCAATTACC-1,1,70,96,9871,8088 ACGGTACAGTTCAATG-1,1,71,97,9990,8157 CTTGATGACCATCCAG-1,1,70,98,9871,8225 CTGGTAAAGACTTACA-1,1,71,99,9990,8294 CTTGCCCACCCACGCA-1,1,70,100,9871,8363 CATTACGCAGGAAGGG-1,1,71,101,9990,8432 GGACAACCATGAAGCC-1,1,70,102,9871,8501 GTTATCAAGCTATCGA-1,1,71,103,9990,8569 AGGTGCACGTCCACAT-1,1,70,104,9871,8638 AAAGAATGTGGACTAA-1,1,71,105,9990,8707 ACCAAGTCATCGGCAG-1,1,70,106,9871,8776 AGTAACTATAGCAGCC-1,1,71,107,9990,8845 GGGAAAGAATGCCAAC-1,1,70,108,9871,8914 AATCGGTATAGCCCTC-1,1,71,109,9990,8982 GGCACTGCGGTGGTTT-1,1,70,110,9871,9051 CGTCCTCATCGCGTGC-1,1,71,111,9990,9120 CTTAACTTACAGTATA-1,1,70,112,9871,9189 GTGAGTCGACTAATAG-1,1,71,113,9990,9258 TGTACTTCCGGGCATG-1,1,70,114,9871,9327 CACAAACCGCAGAACT-1,0,71,115,9990,9395 GCTTTACACAACTGGG-1,0,70,116,9871,9464 CACCGATGATGGGTAC-1,0,71,117,9990,9533 TCAATATACAGGAGGC-1,0,70,118,9871,9602 AACGACCTCCTAGCCG-1,0,71,119,9990,9671 GTTACCAAGGCGTACG-1,0,70,120,9871,9740 TAGCTCACTGTGTTTG-1,0,71,121,9990,9808 TCGGCAGGGTTAAGGG-1,0,70,122,9871,9877 TGTTAACAAAGTGACT-1,0,71,123,9990,9946 CAGAGCGATGGATGCT-1,0,70,124,9871,10015 CATAGTGGGCACGCCT-1,0,71,125,9990,10084 AAACGCTGGGCACGAC-1,0,70,126,9870,10153 TGTTCTCATACTATAG-1,0,71,127,9990,10221 TCCGCTGGGTCGATCG-1,0,72,0,10110,1480 TTAGCATCCCTCACGT-1,0,73,1,10230,1549 AGCCTTGTCACTGATA-1,0,72,2,10110,1618 GTTTCTTGTTAGAGCT-1,0,73,3,10230,1687 TCGGAGTCCTGGTTGC-1,0,72,4,10110,1755 ACGGGTTGTGACCTGT-1,0,73,5,10230,1824 TGACAGAAATCTTGCT-1,0,72,6,10110,1893 TAGCCATGATTGCCTA-1,0,73,7,10230,1962 CGAAGCCACAGCATGG-1,0,72,8,10110,2031 ACCCGTAGCAGAGAAT-1,0,73,9,10230,2100 AGCTTGATCAGGGTAG-1,0,72,10,10110,2168 CTATAAGTAGGGTTTG-1,0,73,11,10230,2237 TATAGTTAGGTGTACT-1,0,72,12,10110,2306 TACGCTGATAGTTGTA-1,0,73,13,10230,2375 TTCTCAATTGCTACAA-1,0,72,14,10110,2444 GTTGCCCTAACGGGTG-1,0,73,15,10230,2513 GACATTTCGCCCAGCC-1,0,72,16,10110,2581 GTAACTACGTAGACCT-1,0,73,17,10230,2650 CCAGTGTACAGACCGA-1,0,72,18,10110,2719 GCCCGATGCCCAGTTC-1,0,73,19,10230,2788 CGAACCTCTTTCCTAG-1,0,72,20,10110,2857 CATGCACATGAGAGGC-1,0,73,21,10230,2925 CCAAATCAAAGGGCAA-1,0,72,22,10110,2994 GTAGTTTAAGCACACG-1,0,73,23,10230,3063 TAAGTGAATAGTCTAC-1,0,72,24,10110,3132 GGTCCACGTCTATTTG-1,0,73,25,10230,3201 CCCTCAGATCGAGAAC-1,0,72,26,10110,3270 ACATTCGCGCGGAATA-1,0,73,27,10230,3338 CTATGAACACCTTGCC-1,0,72,28,10110,3407 CGAATGGTAGGTCGTC-1,0,73,29,10230,3476 TCGACATAGCGTAGCG-1,0,72,30,10110,3545 GACGTTGCTCGGCGGC-1,0,73,31,10230,3614 CTCGAGGCAAGTTTCA-1,0,72,32,10110,3683 GCTGGGAGCGCGTCAA-1,0,73,33,10230,3751 GACGATATCACTGGGT-1,0,72,34,10110,3820 CAGCTCTGGGCTCACT-1,0,73,35,10230,3889 TAGTCTGCGGCACATT-1,0,72,36,10110,3958 TGGTCGATATACCTCT-1,0,73,37,10230,4027 TTCAGTTCAAGAGGAG-1,0,72,38,10110,4096 GTCTGTAGGTTGAACA-1,0,73,39,10230,4164 GAGAGTCTCGGGAGAG-1,0,72,40,10110,4233 TTGTTTGTATTACACG-1,0,73,41,10230,4302 GCACAGCACGGGCCGA-1,0,72,42,10110,4371 AAACAGTGTTCCTGGG-1,0,73,43,10230,4440 TGGAGAATAATCGTCC-1,0,72,44,10110,4509 CGCCGCGTTCTGAACG-1,0,73,45,10230,4577 CATGCGTTGAGAGGAG-1,0,72,46,10110,4646 TACGCTCCTAGAACTG-1,0,73,47,10230,4715 CCTTGTGAACGTGGTT-1,0,72,48,10110,4784 TTAAAGGCGATGCTCG-1,0,73,49,10230,4853 TAAAGTGCACGTCTCG-1,0,72,50,10110,4922 TGTCCGCAAACAATTC-1,0,73,51,10230,4990 AGGCCTATCATACCAA-1,0,72,52,10110,5059 ACTGGGATGCCAGTGC-1,0,73,53,10230,5128 CGATCCACCATTGTTG-1,0,72,54,10110,5197 GGGCATGCATGTCGAG-1,0,73,55,10230,5266 TCCAGGCAGGACGATC-1,0,72,56,10110,5335 CAATGACCCTTAATTT-1,0,73,57,10230,5403 ATCAAGATCCCAGGAC-1,0,72,58,10110,5472 CTCAGAGCTAATGTCG-1,0,73,59,10230,5541 CTGCGATTTCGAGATT-1,0,72,60,10110,5610 ATGGTATTGGGAACCG-1,0,73,61,10230,5679 TAGGTTCTGCTGAGAA-1,0,72,62,10110,5747 GCCTGTCCCGGTGCAT-1,0,73,63,10230,5816 GGCCTGCTCTGATGTT-1,0,72,64,10110,5885 TAGAGGGAGTTTATCT-1,0,73,65,10230,5954 CTCTACATCCTGCGTG-1,0,72,66,10110,6023 ACACATTTCCGTAGAC-1,0,73,67,10230,6092 TGGGTGTTAAGTAGAA-1,0,72,68,10110,6160 GAGCTCAACATGAGCG-1,0,73,69,10230,6229 GCACACAGCTATTACC-1,0,72,70,10110,6298 GCGACGGTAGTCTCCT-1,0,73,71,10230,6367 GTATCAAGGTACTTCC-1,0,72,72,10110,6436 GGAAAGGGAATTGAGC-1,0,73,73,10230,6505 TACACAGCCGTGGTGC-1,1,72,74,10110,6573 CGGTTGGGCAGGGTCC-1,0,73,75,10230,6642 GCACGCCGATTCCCGC-1,1,72,76,10110,6711 CGCTTTCCGCCAAGGT-1,0,73,77,10230,6780 TGCCCGATAGTTAGAA-1,1,72,78,10110,6849 TCAGAACGGCGGTAAT-1,0,73,79,10230,6918 CCACTCAGATCCGCAA-1,1,72,80,10110,6986 GAAGGGTCATTAAGAC-1,0,73,81,10230,7055 GCGGTCTTGCTTTCAC-1,1,72,82,10110,7124 GGAAGGACACCGTATA-1,0,73,83,10230,7193 CGCGGGAATTCCTTTC-1,1,72,84,10110,7262 TCTATCCGATTGCACA-1,0,73,85,10230,7331 TACTCGTTTGAATCAA-1,1,72,86,10110,7399 GTCTGCCGACTCGACG-1,0,73,87,10230,7468 TACGGGTAATAACATA-1,1,72,88,10110,7537 CCAGTTCGGTAACTCA-1,1,73,89,10230,7606 CGTGCACACCACTGTA-1,1,72,90,10110,7675 CTTCAGTTGGACAACG-1,1,73,91,10230,7744 TGATCTATCACACTCT-1,1,72,92,10110,7812 TAGCAGATACTTAGGG-1,1,73,93,10230,7881 CACCGGGCATCACAAG-1,1,72,94,10110,7950 AGTGGCCCGCAAATGG-1,1,73,95,10230,8019 CTCGCTAGGTAAGCGA-1,1,72,96,10110,8088 GATAGATAGTACAGTC-1,1,73,97,10230,8157 CGAGACTACTGCTGCT-1,1,72,98,10110,8225 ACATTTGAAACCTAAC-1,1,73,99,10230,8294 GACACAGCCGGGACTG-1,1,72,100,10110,8363 ACGGAACACGAGTGCC-1,1,73,101,10230,8432 ACGCCAGTGCGTTTGC-1,1,72,102,10110,8501 GCACCTAGGCGAGTCC-1,1,73,103,10230,8569 TCACTATCCCTTCGGT-1,1,72,104,10110,8638 TGAGTGTAACAACGGG-1,1,73,105,10230,8707 ATTGGTTGTGCATTAC-1,1,72,106,10110,8776 CTGGCGATTTACATGT-1,1,73,107,10230,8845 TCCACCAAGACATAGG-1,1,72,108,10110,8914 AACGTCGCTGCACTTC-1,1,73,109,10230,8982 GTCTCCCGAGTCCCGT-1,1,72,110,10110,9051 AGCCCGCACTACAATG-1,1,73,111,10230,9120 GGCACGCTGCTACAGT-1,1,72,112,10110,9189 GCTTGAGTGACCTCTG-1,1,73,113,10230,9258 ATAGCCATAACAGTCA-1,1,72,114,10110,9327 TAGGAGGCTCGAGAAC-1,1,73,115,10230,9395 GTCGGGTGAAGTACCG-1,0,72,116,10110,9464 CACCCGCGTTTGACAC-1,0,73,117,10230,9533 TCTCAGGCTACTCGCT-1,0,72,118,10110,9602 TAGATTCTCTAGCAAA-1,0,73,119,10230,9671 CCCATTATTGTATCCT-1,0,72,120,10110,9740 GTTAATAGCGTCATTA-1,0,73,121,10230,9808 TACTCATTGACGCATC-1,0,72,122,10110,9877 TAGTGACAAGCTCTAC-1,0,73,123,10230,9946 ATCGCCGTGGTTCATG-1,0,72,124,10110,10015 CTGCTCTCAACACACC-1,0,73,125,10230,10084 GCATGACACAAAGGAA-1,0,72,126,10110,10153 CAACGATCGATCCAAT-1,0,73,127,10230,10221 ATACAGCGTCCACTGA-1,0,74,0,10350,1480 TCACGATTAATACGTT-1,0,75,1,10470,1549 CGTGAACTGACCCGAT-1,0,74,2,10350,1618 TCGATGTTACGGCCGT-1,0,75,3,10470,1687 GACCGGTGATACTCTC-1,0,74,4,10350,1755 TCTGTTTAGATTGTTC-1,0,75,5,10470,1824 GCTACTCGGACGCAGA-1,0,74,6,10350,1893 AAGAAAGTTTGATGGG-1,0,75,7,10470,1962 CGCCAGTAGTACCTTG-1,0,74,8,10350,2031 CTCCCTTGTATCAAGG-1,0,75,9,10470,2100 ACTTTATACACCACTT-1,0,74,10,10350,2168 AGATCTGGAGAGGATA-1,0,75,11,10470,2237 TCATCCATCTGATCAC-1,0,74,12,10350,2306 AGAACACGGCGATGGT-1,0,75,13,10470,2375 CCGCTCCGGATAAGCT-1,0,74,14,10350,2444 TGGTCGGGTACAGGGC-1,0,75,15,10470,2513 ACGGACGCAGCGACAA-1,0,74,16,10350,2581 ACATGCTTACGGCAGC-1,0,75,17,10470,2650 CAGGGAGATAGGCCAG-1,0,74,18,10350,2719 TCGCCACCCGGATTAC-1,0,75,19,10470,2788 TCTTGGTCAATGATAC-1,0,74,20,10350,2857 CATAGGGACACTTGTG-1,0,75,21,10470,2926 CACGAGCAAACCAGAC-1,0,74,22,10350,2994 GGGATATTGATCGCCA-1,0,75,23,10470,3063 TAATGTCGGTTCATGG-1,0,74,24,10350,3132 CGATTTGTCATTAATG-1,0,75,25,10470,3201 TTAAGATACCCAGAGA-1,0,74,26,10350,3270 CGACCGTTGGTATTCG-1,0,75,27,10470,3338 ACTACCATCCGAGGGC-1,0,74,28,10350,3407 TCTACGCACGATCTCC-1,0,75,29,10470,3476 AAGCCACTTGCAGGTA-1,0,74,30,10350,3545 ACGTTGTCGTTGAAAG-1,0,75,31,10470,3614 ACCGCTAGTCATTGGT-1,0,74,32,10350,3683 CATGAGTCCATCACGG-1,0,75,33,10470,3751 ATGTCTTGTTTGACTC-1,0,74,34,10350,3820 TCCCAAACATCCTCTA-1,0,75,35,10470,3889 CAACGCGATGAGCCAA-1,0,74,36,10350,3958 GACACCCAAAGACGCG-1,0,75,37,10470,4027 ACGTTCACTATGCCGC-1,0,74,38,10350,4096 ATGGACTGCTTAGTTG-1,0,75,39,10470,4164 CCATGGCAAACGCTCA-1,0,74,40,10350,4233 TTGTCTCGGCAAGATG-1,0,75,41,10470,4302 TTCGAACGAAACATGC-1,0,74,42,10350,4371 GGAAAGTCTTGATTGT-1,0,75,43,10470,4440 ATCATAGATCGACGAG-1,0,74,44,10350,4509 GATTAGAAACAAGCGT-1,0,75,45,10470,4577 GCTGCGAAGAATTATT-1,0,74,46,10350,4646 TTCCAGTGGGTTTCGT-1,0,75,47,10470,4715 GCTCATTGATCATATC-1,0,74,48,10350,4784 ATACGAGGTTTGTAAG-1,0,75,49,10470,4853 GTCTATACACGCATGG-1,0,74,50,10350,4922 GATTTGCGCTAACACC-1,0,75,51,10469,4990 TGGTGCCCTGCCTTAC-1,0,74,52,10350,5059 TCGAATCGCAGGGTAG-1,0,75,53,10469,5128 GGTAGGCCAATATCAC-1,0,74,54,10350,5197 CGTAAATAACAAAGGG-1,0,75,55,10469,5266 GACTCTAGAGTTCCAA-1,0,74,56,10350,5335 ACTTGTTACCGGATCA-1,0,75,57,10469,5403 GGCATTGAACATCTCA-1,0,74,58,10350,5472 AACCCGCTGTATTCCA-1,0,75,59,10469,5541 TAACAGGTTCCCTTAG-1,0,74,60,10350,5610 GTTCTTGTAACTCAAT-1,0,75,61,10469,5679 GATTCTGTTAATGAGT-1,0,74,62,10350,5747 GGACACCTCGGTGTTG-1,0,75,63,10469,5816 CGATCGAGAAGCACCA-1,0,74,64,10350,5885 CTGCTCTGACGGCAAA-1,0,75,65,10469,5954 CCCAGGAAGAATTCGA-1,0,74,66,10350,6023 TGTCGTGGGTATAGGC-1,0,75,67,10469,6092 ATATGTCTAGAGCGTG-1,0,74,68,10350,6160 GCGGGCAGACGGGTGA-1,0,75,69,10469,6229 CGAAGATCAGTTTCAT-1,0,74,70,10350,6298 ACGCCACTCGAAACAG-1,0,75,71,10469,6367 CTTAGATGTTTCATCC-1,0,74,72,10350,6436 GCGAATGGACTAGCGA-1,0,75,73,10469,6505 TAAATTGTGGGTAAAG-1,0,74,74,10350,6573 ATTTATACTGGTAAAG-1,0,75,75,10469,6642 GCGTCGTAACATGGTC-1,0,74,76,10350,6711 CGGTATGGGCACTCTG-1,0,75,77,10469,6780 CTATCACAACGCTGGA-1,0,74,78,10350,6849 ACCACACGGTTGATGG-1,0,75,79,10469,6918 TCAGCGCACGCCGTTT-1,0,74,80,10350,6986 AATGTTAAGACCCTGA-1,0,75,81,10469,7055 CTTACATAGATTTCTT-1,0,74,82,10350,7124 AACATAGCGTGTATCG-1,0,75,83,10469,7193 AGCAGTCGAAGCATGC-1,0,74,84,10350,7262 GTACTACGGCCTCGTT-1,0,75,85,10469,7331 TTGGCCAAATTGTATC-1,0,74,86,10350,7399 TCAGAGGACGCGTTAG-1,0,75,87,10469,7468 AGTAATCTAAGGGTGG-1,0,74,88,10350,7537 AATTATACCCAGCAAG-1,0,75,89,10469,7606 CCCTACCCACACCCAG-1,0,74,90,10350,7675 CTCTGTCCATGCACCA-1,0,75,91,10469,7744 TCGCCTCCTTCGGCTC-1,0,74,92,10350,7812 CCTGATTCGCGAAGAA-1,0,75,93,10469,7881 GACTTCAACGCATCAA-1,0,74,94,10350,7950 GCTTCCCGTAAGCTCC-1,0,75,95,10469,8019 AGAACTGTACTTTGTA-1,0,74,96,10350,8088 CCTTAAGTACGCAATT-1,0,75,97,10469,8157 GGCCAATTGTATAGAC-1,1,74,98,10350,8225 AGAATACAGGCTATCC-1,0,75,99,10469,8294 AATACCTGATGTGAAC-1,1,74,100,10350,8363 TAGAGTGTTCCGGGTA-1,0,75,101,10469,8432 GCTTCCATGTAACCGC-1,1,74,102,10350,8501 GGTTCGCATTTGCCGT-1,0,75,103,10469,8569 TCAATCCGGGAAGTTT-1,1,74,104,10350,8638 CCGGAAGTGCAATATG-1,0,75,105,10469,8707 CTCATAAATGTGTATA-1,1,74,106,10350,8776 GACGGGCATCGAATTT-1,0,75,107,10469,8845 GCTAAGCCCAGTATGC-1,1,74,108,10350,8914 GCTATAAGGGCCAGGA-1,0,75,109,10469,8982 GCGGATTACTTGTTCT-1,1,74,110,10350,9051 TACAACAGCGCATACA-1,1,75,111,10469,9120 TCTAACCTAGCCTGCG-1,1,74,112,10350,9189 TCTACCCGCATCATTT-1,1,75,113,10469,9258 GTCTTACCACGCCAAG-1,1,74,114,10350,9327 AATAACGTCGCGCCCA-1,0,75,115,10469,9395 CGTTTCGGTTATATGC-1,0,74,116,10350,9464 TACGCTGCACGGTCGT-1,0,75,117,10469,9533 CGTTAAATACGACCAG-1,0,74,118,10350,9602 TCGACTGACGATGGCT-1,0,75,119,10469,9671 ACGCTACTGAATGGGC-1,0,74,120,10350,9740 AAGGGTTAGCCATGCG-1,0,75,121,10469,9808 ACGTTTCGGTGCACTT-1,0,74,122,10350,9877 TTAACCCGAGGCGTGT-1,0,75,123,10469,9946 GCCCGTCAAGCCCAAT-1,0,74,124,10350,10015 ATTCGTCCCGAGGTTA-1,0,75,125,10469,10084 TCAAATTATGTTCGAC-1,0,74,126,10350,10153 AACGTTCTACCATTGT-1,0,75,127,10469,10221 CTGTCCTGCGCACTAC-1,0,76,0,10589,1480 GCCCAGCGACACAAAG-1,0,77,1,10709,1549 TATAGCTATTATCTCT-1,0,76,2,10589,1618 AAGCTATGGATTGACC-1,0,77,3,10709,1687 CCGAAACACGACCTCT-1,0,76,4,10589,1755 ATCAGAAGCTGGTTGC-1,0,77,5,10709,1824 TGAACCTGAATGTGAG-1,0,76,6,10589,1893 TCAGAGCATGTCAACG-1,0,77,7,10709,1962 ATACCCTCCCGGCCAA-1,0,76,8,10589,2031 GCCACCTTATTCGCGA-1,0,77,9,10709,2100 CAACGAGCTTATTATG-1,0,76,10,10589,2168 GATCCAACCTTTAAAC-1,0,77,11,10709,2237 TTGTGGAGACAGCCGG-1,0,76,12,10589,2306 AGATAATCACACCTAT-1,0,77,13,10709,2375 GGTTAGGGATGCTAAT-1,0,76,14,10589,2444 TCATGAAGCGCTGCAT-1,0,77,15,10709,2513 CCAGGCGAGATGGTCT-1,0,76,16,10589,2581 CGACTTGCCGGGAAAT-1,0,77,17,10709,2650 GTGCCAAACGTTTCGA-1,0,76,18,10589,2719 TGCTCAAAGGATGCAC-1,0,77,19,10709,2788 GCCTCAGGTACCGGTC-1,0,76,20,10589,2857 ACAAGTAATTGTAAGG-1,0,77,21,10709,2926 TTAGAGTATTGTCGAG-1,0,76,22,10589,2994 GTCATCCCAAACTCAC-1,0,77,23,10709,3063 CTCCTAGTAATCGTGA-1,0,76,24,10589,3132 CCCTCATCACAGAGTA-1,0,77,25,10709,3201 GGAAACAGAGCTTGGG-1,0,76,26,10589,3270 ACATCGCAATATTCGG-1,0,77,27,10709,3338 TTAGCCATAGGGCTCG-1,0,76,28,10589,3407 CGGATTCTGCCTTATG-1,0,77,29,10709,3476 TTGTTGGCAATGACTG-1,0,76,30,10589,3545 GGATCTACCGTTCGTC-1,0,77,31,10709,3614 GGTGGGATTAGGTCCC-1,0,76,32,10589,3683 AATAGGCACGACCCTT-1,0,77,33,10709,3751 GAGGTCCGTTCGCTGT-1,0,76,34,10589,3820 TGACAACTTAAAGGTG-1,0,77,35,10709,3889 AGCTAAGCTCCGTCCG-1,0,76,36,10589,3958 CTAGCCCGGGAGACGA-1,0,77,37,10709,4027 CCCAGATTCCCGTGAC-1,0,76,38,10589,4096 GCCCGTTCACACAATT-1,0,77,39,10709,4164 ACAAACTCCATCAGAG-1,0,76,40,10589,4233 GGTTCCGTACGACTAA-1,0,77,41,10709,4302 TTGCGGAAAGCTGCCC-1,0,76,42,10589,4371 GGAACTCGTGAATACG-1,0,77,43,10709,4440 GGTTACCGCTCCCTAC-1,0,76,44,10589,4509 AGCGACTTTGAAGACA-1,0,77,45,10709,4577 CCGTTTCCTTTCCGTG-1,0,76,46,10589,4646 TGGATGGCATCTTGGA-1,0,77,47,10709,4715 CAAGTCGTTGAAATCT-1,0,76,48,10589,4784 TGCAAACGTACTAGTT-1,0,77,49,10709,4853 GGCTGTCCTACTGCGG-1,0,76,50,10589,4922 TACTGCATGATTAAAT-1,0,77,51,10709,4990 CGGACCTCTGTAGTTA-1,0,76,52,10589,5059 CCCTAGCTCTAAGGTC-1,0,77,53,10709,5128 GTAACAGGTTAACGGC-1,0,76,54,10589,5197 CCCGCAAATAATCATC-1,0,77,55,10709,5266 AATCCCGCTCAGAGCC-1,0,76,56,10589,5335 AACGTCATCCGGCTTG-1,0,77,57,10709,5403 CTCGTGGCACTGAAAG-1,0,76,58,10589,5472 CTTTATCCGACGCATG-1,0,77,59,10709,5541 AAATGACTGATCAAAC-1,0,76,60,10589,5610 TTCGTGCATGTTATAG-1,0,77,61,10709,5679 ATCAAAGAGCCGTGGT-1,0,76,62,10589,5748 ATGTCATAATAAACGA-1,0,77,63,10709,5816 CTTAATCGACTTAGTA-1,0,76,64,10589,5885 CTAAAGGATGAGATAC-1,0,77,65,10709,5954 GTGCTATCCAGCTGGA-1,0,76,66,10589,6023 GACAGAGGTCTTCAGT-1,0,77,67,10709,6092 TCGATTTACGAAACGA-1,0,76,68,10589,6160 AGGCTTAAGTTGCACA-1,0,77,69,10709,6229 TAGGATCTTAACCGCA-1,0,76,70,10589,6298 GACTTTCGAGCGGTTC-1,0,77,71,10709,6367 CCCTGGGAGGGATCCT-1,0,76,72,10589,6436 TAGTAGTTGCCGGACA-1,0,77,73,10709,6505 GCCCTAAGTGCAGGAT-1,0,76,74,10589,6573 ACTTGGGCTTTCGCCA-1,0,77,75,10709,6642 CATGATACGGTGAAAC-1,0,76,76,10589,6711 TCCTGCAGCCGCCAAT-1,0,77,77,10709,6780 GTCCGTTAGAGGGCCT-1,0,76,78,10589,6849 GCTTTATTAAGTTACC-1,0,77,79,10709,6918 AATCGAGGTCTCAAGG-1,0,76,80,10589,6986 GTGCTGTTAGAACATA-1,0,77,81,10709,7055 GGCTTCTCGTGGGTGG-1,0,76,82,10589,7124 CCTACAGTTGAGGGAG-1,0,77,83,10709,7193 TATCCCTCGATCTGCA-1,0,76,84,10589,7262 CCGGTATCTGGCGACT-1,0,77,85,10709,7331 CTCTAACACCGGCAGC-1,0,76,86,10589,7399 CTTCATCACCAGGGCT-1,0,77,87,10709,7468 GGCTGGCAATCCCACG-1,0,76,88,10589,7537 CAAACCATAAGCGTAT-1,0,77,89,10709,7606 CATGTGGGCTCATCAC-1,0,76,90,10589,7675 CCCGTGACAGTGCCTT-1,0,77,91,10709,7744 GATTATCTTGCATTAT-1,0,76,92,10589,7812 GAGTCCACCAGGTTTA-1,0,77,93,10709,7881 TGTACTATCGCTCGTT-1,0,76,94,10589,7950 TTAGCGAATAGATAGG-1,0,77,95,10709,8019 ACATACAATCAAGCGG-1,0,76,96,10589,8088 ATTCGTGTACCCATTC-1,0,77,97,10709,8157 GCTAGCAACGCACCTA-1,0,76,98,10589,8225 ACCTCAGCGAGGCGCA-1,0,77,99,10709,8294 TCCGGGCCACTAACGG-1,0,76,100,10589,8363 TCCCAATATCGACGAC-1,0,77,101,10709,8432 GGATTGAAGTAGCCTC-1,0,76,102,10589,8501 GGCGCACAGTTTACCT-1,0,77,103,10709,8570 CCCGGCACGTGTCAGG-1,0,76,104,10589,8638 AGTAAGGGACAGAATC-1,0,77,105,10709,8707 TTGCGCACAACCACGT-1,0,76,106,10589,8776 CCTGCTACAACCATAC-1,0,77,107,10709,8845 CTGGGCTACTGGAGAG-1,0,76,108,10589,8914 AGCTACGAATGGTGGT-1,0,77,109,10709,8982 ATTCGTTTATCGTATT-1,0,76,110,10589,9051 GGCATTCCCTCCCTCG-1,0,77,111,10709,9120 AGTTATTCAGACTGTG-1,0,76,112,10589,9189 CCACTTTCCTTCTAGG-1,0,77,113,10709,9258 CGCAGTTCTATCTTTC-1,0,76,114,10589,9327 AGGAGCGTTTATTATC-1,0,77,115,10709,9395 GACAGGTAATCCGTGT-1,0,76,116,10589,9464 TTCCCAAAGTACTGAT-1,0,77,117,10709,9533 CTGCAGGGTGACGCTC-1,0,76,118,10589,9602 TCATGGAGGCCTTTGT-1,0,77,119,10709,9671 ATGGCCCGAAAGGTTA-1,0,76,120,10589,9740 CGTAATATGGCCCTTG-1,0,77,121,10709,9808 AGAGTCTTAATGAAAG-1,0,76,122,10589,9877 GAACGTTTGTATCCAC-1,0,77,123,10709,9946 ATTGAATTCCCTGTAG-1,0,76,124,10589,10015 TACCTCACCAATTGTA-1,0,77,125,10709,10084 AGTCGAATTAGCGTAA-1,0,76,126,10589,10153 TTGAAGTGCATCTACA-1,0,77,127,10709,10221 Seurat/tests/testdata/visium/filtered_feature_bc_matrix.h50000644000176200001440000070561314670622051023622 0ustar liggesusers‰HDF  ÿÿÿÿÿÿÿÿ‹‹ÿÿÿÿÿÿÿÿ`ˆ¨ˆ¨TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàHEAPXÈmatrixHHhTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ80HEAPXHˆbarcodesdataindicesindptrshapefeaturesSNOD Hh‡ ÿÿÿÿÿÿÿÿ deflate€ %z‚]PSNOD(°8°6Ø6ø8 ð(0$0p-TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPæwj6ë † GCOLATAACGCCGGAGGGTC-1ATAACGGAGTCCAACG-1ATAACGTTACCTCCAC-1ATAAGGTGGAGAACAT-1ATAAGTAGGATTCAGA-1ATAAGTAGGGCGACTC-1ATAAGTTACCGCGACG-1ATAATAGCTGTTGAAT-1 ATAATCTTGGAGAACC-1 ATAATTAGCTAAGTAG-1 ATACAGGCCCTCCAAT-1 ATACCACGGGCAACTT-1 ATACCGTCATCCATAA-1ATACCTAACCAAGAAA-1ATACGCCGGCGAAACC-1ATACGGAACGTCGTTT-1ATACGGGTTTCGATTG-1ATACGTACTTAGCCAC-1ATACGTCCACTCCTGT-1ATACGTTATGCACGGA-1ATACTACCCGTACCAC-1ATACTAGCATGACCCT-1ATACTGCCTTACACCG-1ATAGACAACGGGACCT-1ATAGACGAAGAGAAAG-1ATAGAGTACTGGGACA-1ATAGAGTTATCAACTT-1ATAGCAACTAGGGAAG-1ATAGCCATAACAGTCA-1ATAGGCGGCTATAGAA-1ATAGGCTAGCTTCGCA-1 ATAGGGATATCCTTGA-1!ATAGGTTGGGCAGATG-1"ATAGTGAAGCGTTCTC-1#ATAGTTCCACCCACTC-1$ATATAAAGCGCTCGTG-1%ATATAAATGTAGCTGC-1&ATATAACACGGGCGCA-1'ATATACATGTATGGTA-1(ATATACGCTCGTGACG-1)ATATAGAGTATTGGTC-1*ATATCAACCTACAGAG-1+ATATCAATTCCAGCCT-1,ATATCGGTAGGGAGAT-1-ATATCGTTCCTCGAAC-1.ATATCTCCCTCGTTAA-1/ATATCTTAGGGCCTTC-10ATATGTCTCCCTAGCC-11ATATTCAGTTAAACCT-12ATATTCCACATAGTGA-13ATATTTAACCCTCAAG-14ATCAAACACTGTTCCA-15ATCAAACGAAGGTTTG-16ATCAATCTGGGCTGCA-17ATCAATGCCGTGGCTG-18ATCACATTAGAATATC-19ATCACGTGCTAATTAA-1:ATCACTTCATCCTCGC-1;ATCAGACGGCACGCCG-1<ATCAGCCTCATGCTGC-1=ATCAGCTCGTCCACTA-1>ATCAGTAGGCAGGGAT-1?ATCATAGCCCTATGTA-1@ATCATCCAATATTTGT-1AATCATTGTACCGCATT-1BATCCAACGCAGTCATA-1CATCCAATGGAGGGTCC-1DATCCACATCGACAGAA-1EATCCAGAGCAACAACC-1FATCCAGGATTCGTGAA-1GATCCCATCCACAGCGC-1HATCCTACCTAAGCTCT-1IATCCTGAATCGCTGCG-1JATCCTGCGTGGAATGG-1KATCGACCCAATACAGA-1LATCGACTCTTTCCGTT-1MATCGCACGCCGGGAGA-1NATCGCCAGTCAACATT-1OATCGCTGCGTGCAGCA-1PATCGGAGACAGACGGC-1QATCGGCAAGCAGTCCA-1RATCGTTAGCTAGCGGA-1SATCTAATATCCTACGG-1TATCTACCATCTGCTCC-1UATCTAGCTTGTGAGGG-1VATCTCCCACGGAATAT-1WATCTCCCTGCAATCTA-1XATCTGCACCTCTGCGA-1YATCTGCTGTTATCGCC-1ZATCTGGGCTGTTCTTG-1[ATCTGGTTAAGACTGT-1\ATCTTATCGCACACCC-1]ATCTTGACCTGCAACG-1^ATCTTGACTTGTCCAA-1_ATGAAGCCAAGGAGCC-1`ATGACGCGTTCTATCC-1aATGACTATGCGACATT-1bATGAGGAGTGTTAATC-1cATGATGCAATGGTACA-1dATGCACGCGCTGTTCA-1eATGCACTACCGCATTG-1fATGCATGATCCAGGAT-1gATGCCAATCGCTCTGC-1hATGCCATTTGCGACCA-1iATGCCGGTCTTGCATA-1jATGCCGGTTGATGGGA-1kATGCGACAATTGGTCC-1lATGCGACAGTCCCATT-1mATGCGAGTCCCACCAC-1nATGCTCTGGCGCGGTA-1oATGCTTAGGAGTTGAT-1pATGGAAATTTAAGGAG-1qATGGAGCAGGCCGTGA-1rATGGATCCGGCGTCCG-1sATGGATTGACCAAACG-1tATGGCAGCATTACGAT-1uATGGGCCTCGGCCTCT-1vATGGTCGCGTGGTTTC-1wATGTAAGGCTGCTCTT-1xATGTACATGCGGTGAG-1yATGTACGATGACGTCG-1zATGTAGCGCGCGTAGG-1{ATGTGAAAGCCTAATG-1|ATGTGCATCCGACGCA-1}ATGTGGACATCTTGAT-1~ATGTTGATTAGAGACT-1ATTAAACATGCGGACC-1€ATTAATACTACGCGGG-1ATTAATGAACCAGTCG-1‚ATTACATGTCAGTCTT-1ƒATTACGCGCTGGCAGG-1„ATTACTTACTGGGCAT-1…ATTAGATTCCTCAGCA-1†ATTAGGCGATGCTTTC-1‡ATTATACTTTGCTCGT-1ˆATTATAGCTACTTTAC-1‰ATTATGCCATAGGGAG-1ŠATTATTATGTCCGTCA-1‹ATTATTCAGAGTCACT-1ŒATTCAACCATTTAAGG-1ATTCACTGATGTTGGA-1ŽATTCAGGACCTATTTC-1ATTCATATACTGTCCA-1ATTCATCGTTGAGGCA-1‘ATTCCCGAAGGTACAG-1’ATTCCTAAGACGTGGA-1“ATTCGACGCCGGGCCT-1”ATTCGCGCCTTGAGAG-1•ATTCGTGCTATCTCTT-1–ATTGAAGATCTTAGTG-1—ATTGACCGGCGATGAC-1˜ATTGATCACCACATTT-1™ATTGATGAGTCCTAAC-1šATTGCCTTTATGTTTG-1›ATTGCGATCAGTAACT-1œATTGCTGCTCCTCCAT-1ATTGGATTACAGCGTA-1žATTGGTTGTGCATTAC-1ŸATTGTACAACTCGGCT-1 ATTGTCGCAATACCTT-1¡ATTGTGACTTCGCTGC-1¢ATTTACAGTTTACTGG-1£ATTTACTAAGTCCATT-1¤ATTTCCGGGTTCTGCG-1¥ATTTGCGCGAGTAGCT-1¦ATTTGGAGATTGCGGT-1§ATTTGTCTTGGGAGCT-1¨ATTTGTTCCAGGGCTC-1©CAAACCCTCCGGCGGG-1ªCAAACGAGTATCGCAG-1«CAAACGGTCGCACTTT-1¬CAAACTCGCGACGCCG-1­CAAAGATTATTGGGCC-1®CAAATCTCTCACAAGG-1¯CAAATGTCCTTCCGTG-1°CAACCTACCGAGCAGT-1±CAACGACCCGTTTACA-1²CAACGTGGTGGAGTCT-1³CAACTATATCGAATGC-1´CAACTGCTCATCCGAT-1µCAAGAGGGCGGAGTAC-1¶CAAGATATTATAACGT-1·CAAGCAACGTCGGAGT-1¸CAAGCACCAAATGCCT-1¹CAAGCGGCACATAATT-1ºCAAGGATCGCATGTTC-1»CAAGGCCAGTGGTGCA-1¼CAAGGTCCTATAGGCT-1½CAAGTGTGGTTGCAAA-1¾CAATAAACCTTGGCCC-1¿CAATACGCTCTGAGGC-1ÀCAATATTCTTGACCTA-1ÁCAATCCCTATACCAGC-1ÂCAATGCGAGAAGTATC-1ÃCAATGGATCTCTACCA-1ÄCAATGTGCCAACCCTT-1ÅCAATTAAGGGTGATGA-1ÆCAATTGGGCCGCACTC-1ÇCAATTTCGTATAAGGG-1ÈCACAAGAAAGATATTA-1ÉCACAATGAGCTGCTAT-1ÊCACACACGCTAACGAG-1ËCACACGCGCTGTCTTA-1ÌCACAGCACCCACGGCA-1ÍCACAGCTAGGGAGTGA-1ÎCACAGGGCCATATAGT-1ÏCACAGGGCCGTTGTCA-1ÐCACAGTCCCGCTTCGC-1ÑCACAGTTCGCTTCCCA-1ÒCACATATTAGCAGGAT-1ÓCACATCTCACCGACGA-1ÔCACATGATTCAGCAAC-1ÕCACATTCTTTCGATGG-1ÖCACATTTCTTGTCAGA-1×CACCAATCATCCGTCT-1ØCACCACGCCACACAGA-1ÙCACCAGTCAGCATGCA-1ÚCACCATGATCGCAAAG-1ÛCACCCAAATCTTATGT-1ÜCACCCACGAGGCAATT-1ÝCACCCGGTTTGTGACT-1ÞCACCCTAACAAGATCT-1ßCACCCTTGGTGAGACC-1àCACCGCCAGAAGGTTT-1áCACCGCGTCCACTCTA-1âCACCGGGCATCACAAG-1ãCACCGTATCCCATCCG-1äCACCGTTAGGGATCAC-1åCACCGTTGCGCGATAT-1æCACCTAATCAGTTTAC-1çCACCTCGATGGTGGAC-1èCACCTTGCGAAACTCG-1éCACCTTGGCGCCTTTG-1êCACGAAAGTTAGTCCC-1ëCACGCACAGCGCAGCT-1ìCACGCAGCGAGGCTTT-1íCACGCGGAACTGTTGC-1îCACGGCGCGCCAAAGG-1ïCACGTCGGCAACCTCT-1ðCACGTTCGTGCTCTAG-1ñCACGTTTCGTACACAC-1òCACTAAAGTTGCCTAT-1óCACTACGGGAGCTGCC-1ôCACTCAAGAGCTATGG-1õCACTCCTATGTAAGAT-1öCACTCCTCTCGGTCGG-1÷CACTCGAGCTGAACAA-1øCACTCTTCTGCTAGCC-1ùCACTGACGATTGTGGA-1úCACTTAATCAGACGGA-1ûCAGAACTTAGCCCTCT-1üCAGAATAACACACGGA-1ýCAGACACCGATCGCTG-1þCAGACCTGTAAGTGTT-1ÿCAGACGAACCTGATAC-1CAGAGACGGTCACCCA-1CAGAGCATGAGCTTGC-1CAGAGGCGATGCATGA-1CAGATAATGGGCGGGT-1CAGATACTAACATAGT-1CAGATCATTTAAAGTC-1CAGATCCTGGTTTGAA-1CAGATGTTTGTCCCAA-1CAGCAGCCCGTTCCTT-1 CAGCAGTCCAGACTAT-1 CAGCAGTCTGTGCTGC-1 CAGCCTCCTGCAGAGG-1 CAGCCTCTCCTCAAGA-1 CAGCGATTCCCTTCAA-1CAGCTCACTGAGACAT-1CAGCTCGACAAGTTAA-1CAGCTGGCGTAACCGT-1CAGCTTAGTAGGTAGC-1CAGGATATATCGTTGT-1CAGGCAGTCTTACCAG-1CAGGCCGTTTGGGTGT-1CAGGCGCACGGTGGTC-1CAGGCGCCATGCTAGG-1CAGTAACTATTTATTG-1CAGTAAGGGACGTCTC-1CAGTACATTCTCTAAA-1CAGTACCAGTTTACGT-1CAGTAGCCCACGCGGT-1CAGTCGAGGATGCAAT-1CAGTCGGCCTAGATAT-1CAGTCTGTATACTGGG-1CAGTGAATAAATGACT-1 CAGTGTCGGCTGGCCC-1!CAGTTCAAATTGACAC-1"CATAACGGACAGTCGT-1#CATAAGAAGCTTGGCT-1$CATAAGCTCTCCGTCT-1%CATACACAAAGTCAGC-1&CATACACGGTTCCCAC-1'CATACCCGTACCCAGT-1(CATACGGCGTCTGGGC-1)CATACTATGTAATTGT-1*CATACTTAGGCAATAC-1+CATAGAGGAGATACTA-1,CATAGCGTTGCCCACC-1-CATAGTACATTGAGAG-1.CATAGTCAAATACATA-1/CATAGTCCACAAGAAC-10CATATACTACTGATAA-11CATATAGGTACAGTCA-12CATATGTCAGGCTACG-13CATCATTACCCTGAGG-14CATCCTCTCAAAGATC-15CATCGGACGGGTTAAT-16CATCTATCCCGTGTCT-17CATCTTACACCACCTC-18CATGACTTCGCTGAAT-19CATGAGATGCACTCTC-1:CATGATGCACAATTCT-1;CATGATGGAAGTTAGC-1<CATGCCAACTCGCAAA-1=CATGCGACCAGTTTAA-1>CATGGATTGTCTTCCG-1?CATGGGTATGCCTTAT-1@CATGGGTCGGGTGTGG-1ACATGGTAAGTAGCGTT-1BCATGGTATTAGTTTGT-1CCATGGTCTAGATACCG-1DCATGGTTTATTAATCA-1ECATGTAAGAGACATTT-1FCATGTAGGAGCGCCAA-1GCATGTCTCATTTATGG-1HCATTACGCAGGAAGGG-1ICATTACGTCGGCCCGT-1JCATTATGCTTGTTGTG-1KCATTGCGGGTCAATTC-1LCATTTAGCGGACCATG-1MCATTTGAGTGGTACGT-1NCCAAACAGAACCCTCG-1OCCAAATAACAAGATTC-1PCCAACGATGCACTGAT-1QCCAAGAAAGTGGGCGA-1RCCAAGACTTCTGCGAA-1SCCAAGCGTAACTCGTA-1TCCAAGGTTGCCCTTTC-1UCCAATAGTGCCGTCGA-1VCCAATCGGTAGATCGA-1WCCAATGTCACAGCAAG-1XCCAATTACGGGTCGAG-1YCCACAATGTACGTCTT-1ZCCACACTGAGATATTA-1[CCACAGTACCCATCCT-1\CCACATGGCTCTTTAT-1]CCACCAACTTTACTGT-1^CCACCCAAGGAAAGTG-1_CCACGAATTTAACCTC-1`CCACGAGAAGAGAATC-1aCCACGGAGCCATAAGA-1bCCACGGTGCCCGGTAG-1cCCACTCAGATCCGCAA-1dCCACTGGTGGCTGGTT-1eCCACTGTTTGGATTAA-1fCCAGAAAGCAACTCAT-1gCCAGATAGTTGAGTGA-1hCCAGCCTGGACCAATA-1iCCAGCTCGAACGCATT-1jCCAGCTGATGGTACTT-1kCCAGGGACGTGGCCTC-1lCCAGTAGTCTGATCCA-1mCCAGTCAAATCTCTTA-1nCCAGTCTAGACGGCGC-1oCCAGTCTTGTCATAGA-1pCCAGTTCGGTAACTCA-1qCCATAACCTGTGCAGT-1rCCATACCTTTACTTGT-1sCCATAGAGGCTGCCAG-1tCCATAGGTTGGCGTGG-1uCCATATGGAAACTATA-1vCCATCGCAGTTAAACT-1wCCATCTCACCAGTGAA-1xCCATGCCCTAGATTTC-1yCCATGCCTGTTTAGTA-1zCCATTAGCGATAATCC-1{CCATTCCCTGCCCACA-1|CCATTTCTACCTATTA-1}CCCAAACATGCTGCTC-1~CCCAACATACGTCGCG-1CCCAAGTCATTACACT-1€CCCAATTTCACAACTT-1CCCACTCCACGGTATC-1‚CCCAGAGGAGGGCGTA-1ƒCCCAGGTCTGAAGGCT-1„CCCAGTAAACTTGGGA-1…CCCAGTTAAGGCGCCG-1†CCCGAAGTTTCGCGAA-1‡CCCGACCATAGTCCGC-1ˆCCCGAGTTTCTCCGTA-1‰CCCGCAGCGCGAACTA-1ŠCCCGGGTCGTTCAGGG-1‹CCCGGTGTATCGGAAT-1ŒCCCGTAAGTCTAGGCC-1CCCGTAGCTGGGAAGA-1ŽCCCGTCAGCGTCTGAC-1CCCGTGAGGGCGGTGA-1CCCGTTTCGCAGATGT-1‘CCCTACTTGAACAATG-1’CCCTAGGCAACAAGAG-1“CCCTATGTAGAGCAGA-1”CCCTCCTCGCTCGTAT-1•CCCTGAAATGAGTTGA-1–CCCTGCCCAATCCGCT-1—CCCTGCGCTACGCATA-1˜CCCTGGCTGTTCCTTC-1™CCCTTTAATGGAGTTC-1šCCCTTTGACAGGTCTT-1›CCGAACACTGGGCCTC-1œCCGAACCTTCCCGGCC-1CCGAAGCATTGACCAA-1žCCGACAATAGGCCGCC-1ŸCCGACGGGCATGAGGT-1 CCGACGTAAACACAAC-1¡CCGAGAAGTCGCATAA-1¢CCGAGCTGTGCTTGTC-1£CCGATCTCAACCTTAT-1¤CCGATTCGAGGGACCC-1¥CCGCACAAAGACCAAC-1¦CCGCACTTGCAATGAC-1§CCGCATGTGGTACGAT-1¨CCGCCGGAACTTCTCG-1©CCGCCTGCGAATTGGT-1ªCCGCCTTGCGATGTCG-1«CCGCGATTTGGTAGGT-1¬CCGCGCAAGATACCCA-1­CCGCGGAATGCGTCAC-1®CCGCGGGTACGAAGAA-1¯CCGCTATCAGCACCAG-1°CCGCTCCAGGGCGATC-1±CCGCTCTTCCGAACTA-1²CCGCTTACCTCACTCT-1³CCGCTTGCTGACATGG-1´CCGGAGCGTACTTTCT-1µCCGGCACGACCGTTTC-1¶CCGGCCGCGAGCATAT-1·CCGGCGTGAGACTCTG-1¸CCGGGCGGTCTCGTCA-1¹CCGGGCTGCTCCATAC-1ºCCGGGTTCGAGGTTAC-1»CCGGTAATGGCTAGTC-1¼CCGGTTTGTAATTGTG-1½CCGTAAGTTGGTCCCA-1¾CCGTAGGAAATCCCTG-1¿CCGTAGGGTTGTTTAC-1ÀCCGTATCTCGTCGTAG-1ÁCCGTATTAGCGCAGTT-1ÂCCGTGGAACGATCCAA-1ÃCCGTGTTAAATTCCAT-1ÄCCGTTACGTTAGAACA-1ÅCCGTTCCGAATCTCGG-1ÆCCTAAAGGCTGACGCT-1ÇCCTAAATTAACGGTTC-1ÈCCTAAATTGTATCCTA-1ÉCCTAACCCAAACAAGT-1ÊCCTAACTAAGGCTCTA-1ËCCTACATTCACAGACG-1ÌCCTACTGCTTACACTT-1ÍCCTAGGCGTAGCGATC-1ÎCCTAGGTAAAGGTAGC-1ÏCCTATAATGAGTGCCC-1ÐCCTATACCGTCCTGTC-1ÑCCTATATCGTGTCACG-1ÒCCTATATTTGTCCTGG-1ÓCCTATCTATATCGGAA-1ÔCCTATGAAGTGGTGCC-1ÕCCTATGGCTCCTAGTG-1ÖCCTATGGGTTACCGTC-1×CCTATGGTCAAAGCTG-1ØCCTATGTCCACTCCAC-1ÙCCTCAACGATCGCTGT-1ÚCCTCACCTGAGGGAGC-1ÛCCTCACCTTAGCATCG-1ÜCCTCCGACAATTCAAG-1ÝCCTCCTGAGCCCACAT-1ÞCCTCCTGTTGTGTCGT-1ßCCTCGCCAGCAAATTA-1àCCTCGCGCGATATAGG-1áCCTCGCGCTGTGCGAT-1âCCTCGGACCGGGATAG-1ãCCTCTAATCTGCCAAG-1äCCTCTATCGATTAGCA-1åCCTCTCTCCCATCTAG-1æCCTCTGGCCTAGACGG-1çCCTCTGTACTATTCTA-1èCCTGAACGATATATTC-1éCCTGAATATTTACATA-1êCCTGACCACCGATGGT-1ëCCTGCTATTTGAGAAG-1ìCCTGGAAACGTTCTGC-1íCCTGGCTAGACCCGCC-1îCCTGGTCGAATGTGGG-1ïCCTGTAAGACATGATA-1ðCCTGTACTCACGCCCA-1ñCCTGTCACCCGGGCTC-1òCCTGTCCCTCACGTTA-1óCCTGTCGCCCGTAAAT-1ôCCTGTTTGAAGACACG-1õCCTTCAGTTAAAGTGA-1öCCTTCGTATAGAATCC-1÷CCTTCTCAGCGTTCCT-1øCCTTCTTGATCCAGTG-1ùCCTTGACCACTTTATT-1úCCTTTAAGGGAGCACT-1ûCCTTTCAATGAAGAAA-1üCCTTTGAATTATGGCT-1ýCGAAACGCAATTCATG-1þCGAACAGTATGGGCGT-1ÿCGAACCCGCATGCGTC-1CGAACGGCCGGACAAC-1ACGATCATACATAGAG-1ACGATCATCTTGTAAA-1ACGATGCATATGTTAT-1ACGCAAACTAATAGAT-1ACGCAATCACTACAGC-1ACGCATACGTTTACTA-1ACGCATTCGTGAGTAC-1ACGCCAGATGATTTCT-1 ACGCCAGTGCGTTTGC-1 ACGCCGCTAGACGACC-1 ACGCGAAGTCAGACGA-1 ACGCGCTACACAGGGT-1 ACGCGGGCCAAGGACA-1ACGCTAGTGATACACT-1ACGCTGTGAGGCGTAG-1ACGGAACACGAGTGCC-1ACGGACTCTCAAAGCG-1ACGGAGCGCAAATTAC-1ACGGATGGTGCGGATA-1ACGGCACTTGCTTGGG-1ACGGCCAACATGGACT-1ACGGCGACGATGGGAA-1ACGGCTGGATGTAGAA-1ACGGGAGTGTCGGCCC-1ACGGTACAGTTCAATG-1ACGTAGATTGCTGATG-1ACGTAGGAGAGTCGCT-1ACGTATTACTCCGATC-1ACGTCTCGTTCCGGGA-1ACGTGACAAAGTAAGT-1ACGTGCGCCTCGTGCA-1 ACGTTAATGTCGAAGA-1!ACGTTAGATTTGCCCG-1"ACGTTCGCAATCAATT-1#ACGTTCGTTCAGGAAA-1$ACGTTCTGTACAAGTC-1%ACTACATCCCGACAAG-1&ACTACCAGCTCTCTGG-1'ACTACGCGTTAGAATT-1(ACTAGTTGCGATCGTC-1)ACTATATGCTGTGTTC-1*ACTATCCAGGGCATGG-1+ACTATCTGCCCGCGTA-1,ACTATTTCCGGGCCCA-1-ACTCAAGTGCAAGGCT-1.ACTCAATAAAGGCACG-1/ACTCCCATTCCTAAAG-10ACTCCCGAATTCGTTT-11ACTCCCTAATGCTAAA-12ACTCCCTAGAATAGTA-13ACTCCGGCCGACCACT-14ACTCGCCGTTCGATAA-15ACTCGTAACCCGTCCT-16ACTCGTCAGTAATCCC-17ACTCTCTGACTTAGGT-18ACTCTGACCTAATAGA-19ACTCTTGTATAGTAAC-1:ACTGAAACGCCGTTAG-1;ACTGAATGGCGAAAGT-1<ACTGCCGTCGTAACTC-1=ACTGCTCGGAAGGATG-1>ACTGTACGATACACAT-1?ACTGTAGCACTTTGGA-1@ACTGTCCAGGATTATA-1AACTGTCTTCTTTAGAA-1BACTTACGCATCCACGC-1CACTTATACTTACCCGG-1DACTTATTAGGATCGGT-1EACTTATTTATGTGCCA-1FACTTCAGGCTGATCCC-1GACTTCCAGTGGAAGCT-1HACTTCCATGCGGGACA-1IACTTCGCCATACGCAC-1JACTTGACTCCCTCTTT-1KACTTGGGACCCGGTGG-1LACTTGTAGTCCCTTCA-1MACTTGTGGATGGAACG-1NACTTTACCCTCATGAA-1OACTTTCCTATAGCTTC-1PACTTTGACTGCATCCT-1QACTTTGGTCGTGCTCC-1RAGAACCCTCAATTGGG-1SAGAACGTGGTACATTC-1TAGAAGAGCGCCGTTCC-1UAGAAGGTACACTTCAC-1VAGAAGGTTGCCGAATT-1WAGAAGGTTGTAGGTCG-1XAGAAGTGATTCGTGAT-1YAGAATGCGGGTTCGGA-1ZAGAATTATGGATTCGA-1[AGACCAAACCACACCT-1\AGACCCACCGCTGATC-1]AGACCCGCCCTCCTCG-1^AGACCGCTCCGCGGTT-1_AGACCGGGAAACCCTG-1`AGACGAAGTGCCGGTC-1aAGACGACGATGCCGCT-1bAGACTAGCCTTCCAGA-1cAGAGAACCGTCTAGGA-1dAGAGAAGGAGTACAAT-1eAGAGATCTCTAAAGCG-1fAGAGCCGCCGAGATTT-1gAGAGGCTTCGGAAACC-1hAGAGTAAACTTCACTA-1iAGATAACTTCAGGGCC-1jAGATACCAATAGAACC-1kAGATACCGGTGTTCAC-1lAGATACTCAAGATCGA-1mAGATATAATACGACTA-1nAGATCGTGCATAAGAT-1oAGATCTCAGGTGTGAT-1pAGATGACTCGCCCACG-1qAGATGAGGGTTGCGAT-1rAGATGATGGAGTCTGG-1sAGATGCAAGACGTGCA-1tAGATGCATCCTGTGTC-1uAGATTATAGGACGTTT-1vAGATTCACAACCGATA-1wAGCAAAGGCCGCTAGT-1xAGCAACATATCTTATT-1yAGCAACCGAAAGTAAT-1zAGCACCAGTACTCACG-1{AGCACTACCTCACCAG-1|AGCACTTAAGGACGCC-1}AGCAGAAGGAGAAAGA-1~AGCAGCCAGATGAATA-1AGCATATCAATATGCT-1€AGCATCATTTCGAAAG-1AGCATCGTCGATAATT-1‚AGCATTACGAGGCAAG-1ƒAGCCAAGCTTTGTGTC-1„AGCCACAGGTTACCCG-1…AGCCACTCCCGTGCTT-1†AGCCCATACATGTAAG-1‡AGCCCGCACTACAATG-1ˆAGCCCGGTAGCCTGTA-1‰AGCCCTTCTAATCCGA-1ŠAGCCGTGGCTAAATGT-1‹AGCCTAATACCCACGT-1ŒAGCGACAGGAACGGTC-1AGCGACCAACGATATT-1ŽAGCGATGCGCCTAATA-1AGCGCATAATGAATCG-1AGCGCGGGTGCCAATG-1‘AGCGGACACTTCGTAG-1’AGCGGCGGTTAGCGGT-1“AGCGGGTCTGACACTC-1”AGCGTGGTATTCTACT-1•AGCTAAGTACGCAGGC-1–AGCTAGAAGCAGAAGT-1—AGCTATTTAATCCAAC-1˜AGCTCCATATATGTTC-1™AGCTCCTTCGCACATC-1šAGCTCTAGACGTTCCA-1›AGCTCTTCCCAGTGCA-1œAGCTCTTCGTAACCTT-1AGCTCTTTACTCAGTT-1žAGCTGAAGTAAACCAA-1ŸAGCTGTAACCTCAATC-1 AGCTTCTTCTCGAGCA-1¡AGCTTGATCTTAACTT-1¢AGGAAGCTGTCCGCCG-1£AGGACAGTCGAATCCC-1¤AGGACGACCCATTAGA-1¥AGGACGCTCGATGTTG-1¦AGGAGGCCTTCGCGCG-1§AGGATAAAGTCGGGAT-1¨AGGATATAGGGATTTA-1©AGGATATCCGACTGCA-1ªAGGATCACGCGATCTG-1«AGGCAGATGCGTAAAC-1¬AGGCAGGGAGCGTACT-1­AGGCATTGTCGTAGGG-1®AGGCCACCCGTTATGA-1¯AGGCCCTAGAACGCCA-1°AGGCCTGAGAATCTCG-1±AGGCGGTTTGTCCCGC-1²AGGCGTCTATGGACGG-1³AGGCTTCCCGAAGAAG-1´AGGGAAACGAGGTACT-1µAGGGACCGGCTGCGTT-1¶AGGGACTCTACGCGAC-1·AGGGAGACATACTTCG-1¸AGGGCGAGCAGCTGAT-1¹AGGGCTGCAGTTACAG-1ºAGGGTCAGTAACCCTA-1»AGGGTCGATGCGAACT-1¼AGGGTGCTCTCGAGGG-1½AGGGTTCCCTTTGGTT-1¾AGGGTTTAGTTCGGGA-1¿AGGTAGGTACAAAGCT-1ÀAGGTATAATTGATAGT-1ÁAGGTCAGGTGAGAGTG-1ÂAGGTCGCGGAGTTACT-1ÃAGGTGCACGTCCACAT-1ÄAGGTGGTGACCTTCGC-1ÅAGGTTACACCATGCCG-1ÆAGGTTGAGGCACGCTT-1ÇAGGTTTCACACACCTT-1ÈAGTAACTATAGCAGCC-1ÉAGTACAGAAGCTTATA-1ÊAGTACATCATTTATCA-1ËAGTACGGGCACCTGGC-1ÌAGTACTCTTATGCCCA-1ÍAGTAGGAAGGAAGTTG-1ÎAGTATGCTGGAGACCA-1ÏAGTATTTGGCACGACC-1ÐAGTCAACACCACCATC-1ÑAGTCAAGATGACACTT-1ÒAGTCACTAGCTCTCGA-1ÓAGTCCATTGGCTGATG-1ÔAGTCCCGCCTTTAATT-1ÕAGTCGACGGTCTCAAG-1ÖAGTCGGCCCAAACGAC-1×AGTCGGCTCAACTTTA-1ØAGTCGGTTGCGTGAGA-1ÙAGTCGTATAAAGCAGA-1ÚAGTCGTCGACCACCAA-1ÛAGTCGTGGGCATTACG-1ÜAGTCTAAAGTATACTC-1ÝAGTCTCACAAGACTAC-1ÞAGTCTTCTCCTCAAAT-1ßAGTCTTTAAAGTGTCC-1àAGTGAACAAACTTCTC-1áAGTGACCTACTTTACG-1âAGTGAGACTTCCAGTA-1ãAGTGAGCCTCGCCGCC-1äAGTGAGTCGAATTAAC-1åAGTGATAACCTGCGCG-1æAGTGATATGAGTAGTT-1çAGTGATTCAAGCAGGA-1èAGTGCACGCTTAAGAA-1éAGTGCGTAGCTCGTAA-1êAGTGCTAAACACAGCA-1ëAGTGCTTGCACGAATA-1ìAGTGGCCCGCAAATGG-1íAGTGGCGGCAATTTGA-1îAGTGGCGTCTGAAGGT-1ïAGTGGCTCCGTCGGCC-1ðAGTGGTGTTACCCGTG-1ñAGTGTATTGCGCATTG-1òAGTTAAACACTTGCGA-1óAGTTAAGCGGTCCCGG-1ôAGTTAAGTCAACCGCT-1õAGTTACTCTATCGTGG-1öAGTTCCTACAGAATTA-1÷AGTTCCTATTTATGTT-1øAGTTGACGGTCCTTGC-1ùAGTTGGCAAGGCTAGA-1úAGTTTGCACCTGCCTC-1ûAGTTTGGCACGGGTTG-1üAGTTTGGCCAGACCTA-1ýATAAACGGACCCGTAA-1þATAAACGTTGCACCAC-1ÿATAAAGGCTCGGTCGT-1ATAAATATTAGCAGCT-1AATAGAATCTGTTTCA-1AATAGCTACCGCGTGC-1AATAGTCCGTCCCGAC-1AATATCCTAGCAAACT-1AATATCGAATCAATGC-1AATATCGAGGGTTCTC-1AATATTGGAGTATTGA-1AATCATGTAAAGACTC-1 AATCGCCTCAGCGCCA-1 AATCGCGCAGAGGACT-1 AATCGGTATAGCCCTC-1 AATCGTGAGCCGAGCA-1 AATCTAGGTTTACTTG-1AATCTATGCCGGAGCC-1AATCTCTACTGTGGTT-1AATCTGCGTTGGGACG-1AATCTGGCTTTCTAGT-1AATGACAGCAATGTCT-1AATGACGTAGGATGTC-1AATGACTGTCAGCCGG-1AATGATGATACGCTAT-1AATGATGCGACTCCTG-1AATGCAACCGGGTACC-1AATGCACCAAGCAATG-1AATGTGCCCGAGGTGT-1AATGTTGTCGTGAGAC-1AATTAAAGGTCGGCGT-1AATTAACGGATTTCCA-1AATTACGAGACCCATC-1AATTAGCGCTGCAGCG-1AATTCATAAGGGATCT-1 AATTCATTGTCATGCA-1!AATTCCAAGCATGTAC-1"AATTCGATTCGAGGAT-1#AATTCTAGAGTTAGGC-1$AATTGAACGCTCTGGT-1%AATTGCAGCAATCGAC-1&AATTTGGGACATAGTA-1'ACAAACCATGCGTCCT-1(ACAAAGAAGGTAGGCC-1)ACAAAGCATGACCTAG-1*ACAAATCGCACCGAAT-1+ACAAATGGTAGTGTTT-1,ACAACAGCATGAGCTA-1-ACAAGCAGTGCCTAGC-1.ACAAGGAAATCCGCCC-1/ACAAGGACAAGAGGTT-10ACAAGGATGCTTTAGG-11ACAAGGGCAGGCTCTG-12ACAATAGTCGTACGTT-13ACAATCCATTTAAACC-14ACAATGAATACGGAGA-15ACAATTGTGTCTCTTT-16ACAATTTGAGCAGTGG-17ACACAAAGACGGGTGG-18ACACACCAGGACCAGT-19ACACATGATCAAATCT-1:ACACCCAGCATGCAGC-1;ACACCTTAAGTAGGGC-1<ACACCTTACTACTTGC-1=ACACGAGACTCCTTCT-1>ACACGGGAACTTAGGG-1?ACACGTAGGCCACAAG-1@ACACTGATCAAGGTGT-1AACAGAACTGAGAACAA-1BACAGCGACATTCTCAT-1CACAGGCACGGATCCTT-1DACAGGCTTGCCCGACT-1EACAGGTGGAGGTGAGG-1FACAGTAATACAACTTG-1GACATAAGTCGTGGTGA-1HACATAATAAGGCGGTG-1IACATCCCGGCCATACG-1JACATCCTGGTAACTGT-1KACATCGATCGTTTACC-1LACATCGGTCAGCCGCG-1MACATCGTATGCAATGG-1NACATGGCGCCAAAGTA-1OACATTAGTTTATATCC-1PACATTTGAAACCTAAC-1QACCAAACACCCAGCGA-1RACCAACACCACACACT-1SACCAACCGCACTCCAC-1TACCAACGCTTATTTAT-1UACCAAGTCATCGGCAG-1VACCAATATGCAAGTTA-1WACCACAAGTTTCTATC-1XACCACCAATGTAACAA-1YACCACGTGCAGCTATA-1ZACCAGACCATAACAAC-1[ACCAGTGCGGGAGACG-1\ACCATATCCGCAATAA-1]ACCATCCGCCAACTAG-1^ACCATCGTATATGGTA-1_ACCCAACGCCCGTGGC-1`ACCCATCTTGAGGGTA-1aACCCATTTGTCCCTCT-1bACCCGGAAACTCCCAG-1cACCCGGATGACGCATC-1dACCCGGTTACACTTCC-1eACCCGTGTCATCAGTA-1fACCCTATGCCATATCG-1gACCCTCCCGTCAGGGC-1hACCCTCCCTTGCTATT-1iACCCTGGTAACGCCCT-1jACCGAAGAGTCTGGTT-1kACCGACACATCTCCCA-1lACCGACTGAGTCCCAC-1mACCGAGTCTCCTTATT-1nACCGATGGTAGCATCG-1oACCGCAATAACTGCCT-1pACCGCGGTGGAAGTCG-1qACCGGGCCTTTGTTGA-1rACCGGTCAGGTACACC-1sACCGTCCACTGGGCCC-1tACCTAAGTACCTTTCA-1uACCTAATCGACTTCCT-1vACCTACAGTATGTGGT-1wACCTACTATAAATCTA-1xACCTCCGCCCTCGCTG-1yACCTCCGTTATTCACC-1zACCTGCGTGTCATGTT-1{ACGAAATGGGCGGCAC-1|ACGACTCTAGGGCCGA-1}ACGAGGATACCACTCT-1~ACGAGGTTTACAACGT-1ACGAGTACGGATGCCC-1€ACGATACATAGAACTA-1AACGCATGATCTGGGT-1‚AACGCGGTCTCCAGCC-1ƒAACGCTGTTGCTGAAA-1„AACGGACGTACGTATA-1…AACGGCCATCTCCGGT-1†AACGTACTGTGGGTAC-1‡AACGTCAGACTAGTGG-1ˆAACGTCGCTGCACTTC-1‰AACGTGCGAAAGTCTC-1ŠAACTACCCGTTTGTCA-1‹AACTAGGCTTGGGTGT-1ŒAACTCAAGTTAATTGC-1AACTCCAGAGCGTGTT-1ŽAACTCCTAATCCCATG-1AACTCTCAATAGAGCG-1AACTCTCAGTGTGCTC-1‘AACTGGGTCCCGACGT-1’AACTTGCCCGTATGCA-1“AAGACATACGTGGTTT-1”AAGACCAAATAACTCA-1•AAGACCCAACTGAACA-1–AAGACTGCAAGCTACT-1—AAGAGCTCTTTATCGG-1˜AAGAGGATGTACGCGA-1™AAGAGGCATGGATCGC-1šAAGAGGCCCTTTGGAA-1›AAGATGGCACCGGACC-1œAAGATTGGCGGAACGT-1AAGCACCCTGCGTATC-1žAAGCATACTCTCCTGA-1ŸAAGCCGAAGCGGTTTA-1 AAGCGCAGGGCTTTGA-1¡AAGCGTCCCTCATCGA-1¢AAGCTAGATCGAGTAA-1£AAGCTCGTGCCAAGTC-1¤AAGCTCTTTCATGGTG-1¥AAGGAGCGGTTGGTGC-1¦AAGGATCGATCGCTTG-1§AAGGATGAGGGACCTC-1¨AAGGCGCGTAAAGCTT-1©AAGGCTGTGCTCATCG-1ªAAGGGAACGACTGGCT-1«AAGGGACAGATTCTGT-1¬AAGGGACTATGCATTC-1­AAGGGTTTGATTTCAG-1®AAGGTATCCTAATATA-1¯AAGGTGATAAACCAGC-1°AAGTAGTGACGCGAGG-1±AAGTCAATTGTCGTCA-1²AAGTCTTCTGTGGCCT-1³AAGTGACGACCGAATT-1´AAGTGAGTCGGGTTTA-1µAAGTGCCTTGACTGTA-1¶AAGTGCGTTAGAATCT-1·AAGTGTTTGGAGACGG-1¸AAGTTCACTCCAAGCT-1¹AAGTTCAGTCTGCGTA-1ºAAGTTCGGCCAACAGG-1»AAGTTGTGATGTTATA-1¼AAGTTTATGGGCCCAA-1½AATAACAACGCTCGGC-1¾AATAACACTAGAACAA-1¿AATACCTGATGTGAAC-1ÀAATAGAACAGAGTGGC-1ÁAAATCGCGGAAGGAGT-1ÂAAATCGTGTACCACAA-1ÃAAATCTAGCCCTGCTA-1ÄAAATGATTCGATCAGC-1ÅAAATGGCCCGTGCCCT-1ÆAAATGGTCAATGTGCC-1ÇAAATTAACGGGTAGCT-1ÈAAATTACACGACTCTG-1ÉAAATTACCTATCGATG-1ÊAAATTCCAGGTCCAAA-1ËAAATTGATAGTCCTTT-1ÌAAATTTGCGGGTGTGG-1ÍAACAACTGGTAGTTGC-1ÎAACACACGCTCGCCGC-1ÏAACACGAGACGCGGCC-1ÐAACAGGATGGGCCGCG-1ÑAACAGGTAGTATGGAT-1ÒAACATATCAACTGGTG-1ÓAACATCGATACGTCTA-1ÔAACATTGTGACTCGAG-1ÕAACCAAGACTTCTCTG-1ÖAACCCATCCCATGATC-1×AACCCGAGCAGAATCG-1ØAACCCTACTGTCAATA-1ÙAACCGAGCTTGGTCAT-1ÚAACCGCTAAGGGATGC-1ÛAACCTCGCTTTAGCCC-1ÜAACCTTTAAATACGGT-1ÝAACCTTTACGACGTCT-1ÞAACGAAAGTCGTCCCA-1ßAACGATAATGCCGTAG-1àAACGATATGTCAACTG-1áAAACTGCTGGCTCCAA-1âAAACTTAATTGCACGC-1ãAAACTTGCAAACGTAT-1äAAAGAATGTGGACTAA-1åAAAGGCTACGGACCAT-1æAAAGGCTCTCGCGCCG-1çAAAGGGATGTAGCAAG-1èAAAGTAGCATTGCTCA-1éAAAGTGTGATTTATCT-1êAAAGTTGACTCCCGTA-1ëAAATAACCATACGGGA-1ìAAATAAGGTAGTGCCC-1íAAATACCTATAAGCAT-1îAAATAGCTTAGACTTT-1ïAAATAGGGTGCTATTG-1ðAAATCCGATACACGCC-1ñAAACCGTTCGTCCAGG-1òAAACCTAAGCAGCCGG-1óAAACGAAGATGGAGTA-1ôAAACGAGACGGTTGAT-1õAAACGGGCGTACGGGT-1öAAACGGTTGCGAACTG-1÷AAACTCGGTTCGCAAT-1øAAACTCGTGATATAAG-1ùAAACAGGGTCTATATT-1úAAACATGGTGAGAGGA-1ûAAACATTTCCCGGATT-1üAAACCGGGTAGGTACC-1ýAAACAGAGCGACTCCT-1þAAACAGCTTTCAGAAG-1ÿAAACACCAATAACTGC-1AAACAAGTATCTCCCA-1GCATTGTAATTCATAT-1GCATTTCCAAGGCTCC-1GCCAACCATTTCCGGA-1GCCAAGAATACTTCTG-1GCCAATAGGGCATCTC-1GCCACAATTTAAGGAC-1GCCACTCAGAGCGCGA-1GCCAGGAGTAACCGAT-1 GCCATATTGCACACAG-1 GCCATCGAGCTGCGTG-1 GCCATCGATGCTGCAT-1 GCCATTAGCCTCAAAC-1 GCCCGACTTCTTCCCG-1GCCCGAGAGTCTAAAT-1GCCCGATCTGTGGTCG-1GCCCGCGCGTAAACGG-1GCCCGTAATACCTTCT-1GCCCTAGCCGTCGCGA-1GCCCTGAGGATGGGCT-1GCCGAAATTCCTACGT-1GCCGATTGGCCAAGCT-1GCCGCTTGTGAGAAAC-1GCCGGGTTAGGGTCGC-1GCCGTGGAAGAAATGT-1GCCTACGTTCTGTGCA-1GCCTATAGTGTCAGGG-1GCCTCATCTGGAAATA-1GCCTCCGACAATTCAC-1GCCTCTATACATAGCA-1GCCTTTGTCAGTGGAC-1GCGAAACGATCGGGAG-1 GCGAAACTTAACTGGA-1!GCGAAGAATCTGACGG-1"GCGAAGCCATACCCGT-1#GCGACATGTAAACATC-1$GCGACGATAGTTGTAC-1%GCGAGAGGCCATGTAA-1&GCGAGAGTTGCGTCCA-1'GCGAGCGCATGCTCCC-1(GCGAGGCCCGAGCAGA-1)GCGAGTTCTGCAAAGA-1*GCGATTGTTAACGTTA-1+GCGCAAATATATTCAA-1,GCGCAAGAGCGCGCTG-1-GCGCATCCAGTCAGCA-1.GCGCCGTTCCACGATA-1/GCGCCTCCCACTCCGA-10GCGCGGTCTAGTAACT-11GCGCGTCATTGGTACA-12GCGCTAATTGAATAGA-13GCGCTATGCCGAGGCA-14GCGCTGATCCAGACTC-15GCGCTGCTTTGCATTT-16GCGCTTAAATAATTGG-17GCGGACCGCGTTGTGG-18GCGGAGAAACTTCGCA-19GCGGAGAGGGAGAACG-1:GCGGATTACTTGTTCT-1;GCGGCAAAGTATTGCC-1<GCGGCTCTGACGTACC-1=GCGGCTTTAGCAAGTT-1>GCGGGCGAGCCTTACC-1?GCGGTCTTGCTTTCAC-1@GCGGTGAACTGCGCTC-1AGCGGTTCCCTATCATG-1BGCGTAAATGGCCATAA-1CGCGTCGAAATGTCGGT-1DGCGTCGCCAGGGTGAT-1EGCGTCTCTGCATTGGG-1FGCGTGGTACTGGGTTA-1GGCGTTCGGAGACCGGG-1HGCTAACTGAAGTCTGA-1IGCTAAGCCCAGTATGC-1JGCTAAGTAGTTTCTCT-1KGCTAATACCGAATGCC-1LGCTACAATCGAGGATA-1MGCTACAGTACGGACCG-1NGCTACGACTTATTGGG-1OGCTACTATAGTAGAGT-1PGCTAGACCGTCTACTG-1QGCTAGAGTAGAGATGT-1RGCTAGCAGGGAGTGGG-1SGCTAGCTTGAATAGCT-1TGCTAGGCACCACGGAG-1UGCTAGTAGAGCTTGTA-1VGCTATACGTCTCGGAC-1WGCTATCATACTCATGG-1XGCTATGCCAGCTTATG-1YGCTCAATCCGTTTATT-1ZGCTCAATGTAATACCG-1[GCTCATTACTGCATGT-1\GCTCCCAGTCGGTCCA-1]GCTCCGCTCGCTTCAG-1^GCTCCTGACATACTGG-1_GCTCGCTCATGTCCAA-1`GCTCGGAATTTAAAGC-1aGCTCTAAACCCTGACG-1bGCTCTATGTTACGTGC-1cGCTCTCGGGTACCGAA-1dGCTCTTTCCGCTAGTG-1eGCTGAATCTTCCAATC-1fGCTGAGGCGTGAGTAT-1gGCTGCACGGTTTCTTA-1hGCTGCTAAGTAGTCGA-1iGCTGCTACTGCGTAGC-1jGCTGCTCTCCGGACAC-1kGCTGGACCCAAAGTGG-1lGCTGGCATATTCACCT-1mGCTGGCGGCGCATGCT-1nGCTGGTGACTCGTAGT-1oGCTGGTTTAGGCCATA-1pGCTGTATTACTGGCCC-1qGCTGTTGCTACCGAAC-1rGCTTAATGTAACTAAC-1sGCTTACGTAGTTAGTA-1tGCTTATGAAGCAGGAA-1uGCTTCCATGTAACCGC-1vGCTTCCGTCCCTAGAC-1wGCTTGAGTGACCTCTG-1xGCTTGGATCGATTAGG-1yGCTTTCAGAGGAGGTG-1zGGAAACCTTGTTGAAT-1{GGAAACTAAATGGGCC-1|GGAAAGTGCCCATGCC-1}GGAACCGTGTAAATTG-1~GGAACCTTGACTCTGC-1GGAACTTTGGCGATTA-1€GGAATGCGCTAGCGTG-1GGACAACCATGAAGCC-1‚GGACACAAGTTTACAC-1ƒGGACCAACAGGATAAC-1„GGACCTACGGTAACGT-1…GGACCTCTAGGCCGCC-1†GGACGTCCATAGTTGG-1‡GGACTCTTTGACTAAG-1ˆGGAGAAGTCATTGGCA-1‰GGAGACCATCTACATA-1ŠGGAGACGACACCTTTG-1‹GGAGCAACATTTCAAG-1ŒGGAGCACCAAGAACTA-1GGAGCGAGGCCTACTT-1ŽGGAGGGCTTGGTTGGC-1GGAGTTGATTCTGTGT-1GGATCAGAGCCATCAG-1‘GGATCATCCCGTACGC-1’GGATCCGGAATATACT-1“GGATCTTGACTCAACC-1”GGATGAAGATCGCTGA-1•GGATGACGCGAGTTTA-1–GGATGGCTTGAAGTAT-1—GGATGTCCTTACCGCA-1˜GGATTAATCATGGACC-1™GGATTCCGCTATACCC-1šGGATTGCTGTGACTCC-1›GGATTTCACTTCTATA-1œGGCAAAGGCGCCAATA-1GGCAAATTACTTTACT-1žGGCAAGCCCATAGTGG-1ŸGGCAAGGCGAAATAGC-1 GGCAATAGTCAATGAG-1¡GGCACGCTGCTACAGT-1¢GGCACTCCACTGGGCA-1£GGCACTGCGGTGGTTT-1¤GGCAGCAAACCTATGC-1¥GGCAGCGGTAATCCTA-1¦GGCATACAGGTAGCGG-1§GGCATATCGGTTCTGC-1¨GGCCAATTGTATAGAC-1©GGCCCAGCTGGTTTGC-1ªGGCCCTCACCCACTTA-1«GGCCGGCGTCTGCTAT-1¬GGCCGTTTGGGTTTCA-1­GGCCTGCTTCTCCCGA-1®GGCGAAATCTAACTTG-1¯GGCGAGCGAAACGGCA-1°GGCGCAGGACATCTTC-1±GGCGCATGAATTGATG-1²GGCGCGGAGATCTTTC-1³GGCGCGTTCGAGTTTA-1´GGCGCTTCATTCCCTG-1µGGCGGAGTAATATTAG-1¶GGCGGTAGGATCATTG-1·GGCGTAGGGAAAGCTG-1¸GGCGTCCTATCCGCTG-1¹GGCTAAAGGGCGGGTC-1ºGGCTAATGATTGAAAT-1»GGCTATTAAGTTGTAT-1¼GGCTCGCGTTGAGGTA-1½GGCTCTGCTCCAACGC-1¾GGCTGAAATAGCAAAG-1¿GGCTTTCAATAAGGGT-1ÀGGGAAAGAATGCCAAC-1ÁGGGAACGGGAGGTTAG-1ÂGGGAAGACGGTCTGTC-1ÃGGGAAGGGCTTTCTCA-1ÄGGGAATGAGCCCTCAC-1ÅGGGACAGAGTTACTCC-1ÆGGGACCCGTATATCTT-1ÇGGGACTGCATAGATAG-1ÈGGGAGAACTCACAGTA-1ÉGGGAGCGACCGTAGTG-1ÊGGGAGGATGCCCGAAA-1ËGGGAGTTAATGAGGCG-1ÌGGGATGGTCGTAACCG-1ÍGGGATTTACCGCACCT-1ÎGGGCAACCGCACGTGC-1ÏGGGCACTATTGACCAT-1ÐGGGCAGACGTCACTGC-1ÑGGGCAGAGCAATCGTT-1ÒGGGCAGTCAACGCCAA-1ÓGGGCCCGTCTTAAACA-1ÔGGGCCGGCCGAAGTAC-1ÕGGGCCTAAATGGGCTA-1ÖGGGCGATATGTGTGAA-1×GGGCGGCAAATGAATT-1ØGGGCGGGTTCCCTACG-1ÙGGGCGTACATTTATAT-1ÚGGGCGTCACCACGTAA-1ÛGGGCGTCCACTGGCTC-1ÜGGGCGTGGTTTCCCAG-1ÝGGGCTACTATTTCGTG-1ÞGGGCTATGATCGATGG-1ßGGGCTCATCGAACCCA-1àGGGCTGCCTAGGGCGA-1áGGGCTGGTTAGTCGCG-1âGGGTACTTCATGAACT-1ãGGGTATGTATGCACTT-1äGGGTATTCTAGCAAAC-1åGGGTCACCGTGACGGT-1æGGGTCAGGAGCTAGAT-1çGGGTCGTGGCAAGTGT-1èGGGTCTATCGCTTTCC-1éGGGTGACACCTTAACT-1êGGGTGCATATGAAAGC-1ëGGGTTAACATTTGAGT-1ìGGGTTTAGGATAGGAT-1íGGTAACCGGGAGGATA-1îGGTACAAACATGCTAT-1ïGGTACCATTAAGACGG-1ðGGTACGTTGCGGCCGG-1ñGGTAGAAGACCGCCTG-1òGGTAGACCGTTGGGCG-1óGGTAGTGCTCGCACCA-1ôGGTATAGTGACACATA-1õGGTATTGCCGAGTTTA-1öGGTCAAGACTACTTCG-1÷GGTCAGTGGGTCCCAC-1øGGTCGGATAAACGGCG-1ùGGTCGGCCAGGAGCTT-1úGGTCGGTCGTCCACAG-1ûGGTCGTAAGCTCGCAC-1üGGTCTCCGTCCAGGTT-1ýGGTCTCTGAATGGACT-1þGGTCTGAGAATCTGGA-1ÿGGTCTTGAGCGCTCTT-1GGTGAAGTACAGGGAT-1GGTGATAAGGAGCAGT-1GGTGCAGAGCCTATCG-1GGTGCTGGTACACATT-1GGTGGACTGCTCTGGC-1GGTGTAAATCGATTGT-1GGTTACCACCCTCGGG-1GGTTAGCTATATGTCT-1GGTTAGGCTTGGAGAA-1 GGTTCGGATTATACTA-1 GGTTCTACTCGTCTGA-1 GGTTTAATTGAGCAGG-1 GGTTTACAATCTCAAT-1 GGTTTAGCCTTTCTTG-1GGTTTCAATCGGTCAG-1GGTTTGACAAGAAGCT-1GGTTTGTGACCTGAGG-1GTAACATCTAAGATAA-1GTAAGCGGGCAGTCAG-1GTAAGTAACAGTCTGG-1GTAAGTAGGGTATACC-1GTAATAAAGGGCTCCC-1GTAATCTGATTCTTCG-1GTACACTTACCTGAAG-1GTACAGAGGCAAGGGT-1GTACGAGATTGCGACA-1GTACGCTTCATTGCAC-1GTACGTCACGTATTAA-1GTACGTTTGCCCGTCA-1GTACTAAGATTTGGAG-1GTACTCCCTTATCGCT-1GTACTCCTGGGTATGC-1 GTACTGGAGTTAGACC-1!GTAGACACGCCTGACT-1"GTAGAGGGAGACAAGT-1#GTAGCCAAACATGGGA-1$GTAGCGGCTATACACT-1%GTAGCTTCCTCTTGTT-1&GTAGGTGATCCGTGTA-1'GTAGTCGCGGGAATCA-1(GTAGTCTACGATATTG-1)GTAGTGAGCAACCTCA-1*GTATAGGACTCAGTAG-1+GTATCAAACGTTAGCT-1,GTATCCTTTGGTAACC-1-GTATCTCAGTCTTGAC-1.GTATCTTTCATAACCA-1/GTATGAAATTTCACTC-10GTATGTGGGTCTAGTT-11GTATTCTGAGAAACGA-12GTCAAAGAAGTGGTGT-13GTCAACCAGGCCTATA-14GTCAAGCGGACTCGGG-15GTCAGAATAGTCTATG-16GTCATGCACCTCCGTT-17GTCATGCGCGAGGGCT-18GTCATGGACATGACTA-19GTCATTAGAGCGAACG-1:GTCCAATATTTAGCCT-1;GTCCATTACTGCTACG-1<GTCCCAACGTAAAGTA-1=GTCCCAATCATCCCGC-1>GTCCCGCGACGTTATG-1?GTCCGGACCTGAAATT-1@GTCCGGCTGAATTGCG-1AGTCCGGGTTCACATTA-1BGTCCTACGAATAGTCT-1CGTCCTACTCTACGGGC-1DGTCGCCGTTGTGTGTT-1EGTCGCGTAACCCGTTG-1FGTCGGAAGGATACCAG-1GGTCGGATATCTCAGAC-1HGTCGGATGTAGCGCGC-1IGTCGGGAACATGGTAG-1JGTCGGGAAGCAGAAAC-1KGTCGTACCATCTCGGG-1LGTCGTACCTACGATTG-1MGTCGTATTGGCGTACA-1NGTCGTGTCTGGTCATC-1OGTCGTTATTCGCTTAT-1PGTCTAGTGAGCCGCTT-1QGTCTATCTGAGTTTCT-1RGTCTATTGCATGCTCG-1SGTCTATTGGTTCCGGT-1TGTCTCAAGGCCCGGCT-1UGTCTCCCGAGTCCCGT-1VGTCTCCTGCCAGTATG-1WGTCTCGACTAAGTTTG-1XGTCTCGATCTGCTTTC-1YGTCTGGGCGGTCGAGA-1ZGTCTTACCACGCCAAG-1[GTCTTGTAGCTATTCA-1\GTGAAACGGCGCCACC-1]GTGAACTCCCATTCGA-1^GTGAAGATTTCAAGTG-1_GTGAAGCCGTATAGTC-1`GTGAAGTCACGACTCG-1aGTGACAGCTTCCCACT-1bGTGACCGCACACTACG-1cGTGACGAGGGTGACCC-1dGTGACGCAGGTTTCAT-1eGTGACTTCAGTAGTGC-1fGTGAGCGTGCTGCACT-1gGTGAGGACACTTAAGG-1hGTGAGGAGCGGTTGAG-1iGTGAGTCGACTAATAG-1jGTGAGTGGTACAACGC-1kGTGATCACTAACGCCT-1lGTGATCATAGATCTGC-1mGTGATCCTTGTCATGA-1nGTGATGCACAACATCT-1oGTGATTCGCCGCTCAA-1pGTGCACCAGCTTCAAC-1qGTGCACGAAAGTGACT-1rGTGCCATCACACGGTG-1sGTGCCCGTTCGGATTC-1tGTGCCGCTTCAAAGGT-1uGTGCCTGAGACCAAAC-1vGTGCGAAATCGAACAC-1wGTGCGACAGGGAGTGT-1xGTGCGGGTCTCCAAAT-1yGTGCGTGTATATGAGC-1zGTGCTCAAGTACTGTC-1{GTGGAACCTACATGCG-1|GTGGACCAACCCGATT-1}GTGGACGCATTTGTCC-1~GTGGAGCGTTTACCGA-1GTGGAGTCGGCGGTTG-1€GTGGCAAACAGCGGCA-1GTGGCGGTCCCAGCGT-1‚GTGGCTGTTTCTGTTC-1ƒGTGGGAAGACTGAATC-1„GTGGGCTTAGACACAC-1…GTGGGTACTGAGCGTA-1†GTGGTATAGTCTGCCG-1‡GTGGTGGCCAAGTGAA-1ˆGTGGTTACTTCTTTCG-1‰GTGGTTTCCGCCTTTC-1ŠGTGTACCTTGGCTACG-1‹GTGTATATCAGCGGGC-1ŒGTGTCGTATAGCGTTC-1GTGTGAATAACTTAGG-1ŽGTGTTACTATGCGTCC-1GTTAAAGTAGGACTGG-1GTTAACATCACTTAAA-1‘GTTAACTATGTTGTCA-1’GTTAAGGGTGCGATGT-1“GTTACAATTGGTGACG-1”GTTACCTACAACTTGC-1•GTTACTTTGGGCCTAG-1–GTTAGCCCATGACATC-1—GTTAGCCGTAAATCAA-1˜GTTAGGCTACCCGTTT-1™GTTATAATACGGTGAA-1šGTTATATCAGGAGCCA-1›GTTATATTATCTCCCT-1œGTTATCAAGCTATCGA-1GTTCACAGGAGTCTAG-1žGTTCATCGTTTGGCTG-1ŸGTTCGCCATAAGTGCC-1 GTTCGCTGAGACGTCT-1¡GTTCGGATCGGGAACA-1¢GTTCGGGCGTACCATT-1£GTTCGTCTAAAGAACT-1¤GTTGAACCGGTTCCAT-1¥GTTGAGTCCCGCCGGT-1¦GTTGCACGGAGTTTCG-1§GTTGGACCGCATCAGG-1¨GTTGGATTCAGTGGCT-1©GTTGGATTGAGAACAC-1ªGTTGGATTTGCGTTGG-1«GTTGGTCATGCTATCC-1¬GTTTACGTTCCATCTG-1­GTTTCAAACGAGTTGT-1®GTTTCATATCGTCGCT-1¯GTTTCCTGGAGGGTGA-1°GTTTCTAGAGGCGCGG-1±GTTTCTGCAGTCTCCC-1²GTTTGACCAAATCCTA-1³GTTTGGCCCAAGTTAT-1´GTTTGGGCTTGTGAGC-1µGTTTGGGTTTCGCCCG-1¶GTTTGGTAGGGTCAAC-1·GTTTGTTAGCCAAGTA-1¸TAAACCCAGGAGGGCA-1¹TAAAGCGGTATTTCCA-1ºTAAAGCGTTAGGAGAA-1»TAAAGCTGCAATAGGG-1¼TAAATGCCGTCTCATG-1½TAACATACAATGTGGG-1¾TAACATACACGCGATC-1¿TAACCTACCGTCCGAG-1ÀTAACCTAGGGAGTCCA-1ÁTAACTATTACGCCAAA-1ÂTAACTCATCCGCGCGG-1ÃTAAGAGGGACAGGGAC-1ÄTAAGCCCTTACGACCA-1ÅTAAGGCAACATAAGAT-1ÆTAAGGCATAACATCAA-1ÇTAAGGCCCGTCACCCT-1ÈTAAGGCTGAATCCCTC-1ÉTAAGGGCCTGTCCGAT-1ÊTAAGTAACATCTTGAC-1ËTAAGTCGCCGAGTATC-1ÌTAAGTTGCGACGTAGG-1ÍTAATAAACAAGGAGAT-1ÎTAATACACAGTAGTAT-1ÏTAATACTAGAACAGAC-1ÐTAATAGAACAGAGTTA-1ÑTAATAGGTCACCAGAA-1ÒTAATAGTGACGACCAG-1ÓTAATCGATCCGTACGT-1ÔTAATTACGTCAGTAGA-1ÕTAATTAGGACATCCGT-1ÖTAATTGGAATCGGGAA-1×TAATTTCCGTCCAGTA-1ØTACAACAGCGCATACA-1ÙTACAACGCACAACTCA-1ÚTACAAGGGCTTCTTTA-1ÛTACAAGTCTCGTGCAT-1ÜTACACAGCCGTGGTGC-1ÝTACACCTCTTCGAATC-1ÞTACAGAAACGGTGGGC-1ßTACATAGGCATACACC-1àTACATCCCTATCCCTG-1áTACATTTCTAACGTGC-1âTACCAAATAGCCCAGA-1ãTACCAATAAAGTACCA-1äTACCAGAAGTAGGTTC-1åTACCGAATAATTGTAA-1æTACCGCGGACTTGCAG-1çTACCGGCTCACTGCCC-1èTACCGGTCGTTTCCAT-1éTACCGTAGGTTAACTA-1êTACCGTGCCTCGGACC-1ëTACCTACTCCCAGTAT-1ìTACCTATCCCTAGAGG-1íTACCTCAGTTGTCTGT-1îTACCTTAAGATTTCCC-1ïTACGAACACGACTTCA-1ðTACGACGCTTGCTGCG-1ñTACGACTGCCTCTTAG-1òTACGAGAACTTCACGT-1óTACGATGTTGATCATC-1ôTACGCAGTTCTTTCCT-1õTACGCCATATTCTAAT-1öTACGCCGAGGGTACCC-1÷TACGCCTCCATTCCGA-1øTACGCTATAGAAACCT-1ùTACGCTCGGTATTGGA-1úTACGGAAGCCAAACCA-1ûTACGGGATGCTAGCAG-1üTACGGGTAATAACATA-1ýTACGTAAAGCGGAGTG-1þTACGTGGGCCCAGGGC-1ÿTACGTTTACCGGCAAT-1TACTACGTGCAATGCG-1CTGGGATAAATAATGG-1CTGGGCCTGCTATATC-1CTGGGTAGGCAGTTAA-1CTGGGTTGAGTTAAAG-1CTGGTAAAGACTTACA-1CTGGTAACACATAGAA-1CTGGTAACGAGCTCTT-1CTGGTTTCGAGCAAGA-1 CTGTACTTCTTAGCAT-1 CTGTAGCCATCTCACT-1 CTGTCAAATGGCTCGG-1 CTGTGCAGGGTAGGTC-1 CTGTGGTCGGGAGATA-1CTGTTACCCAATCTAG-1CTGTTCACTGCCTGTG-1CTTAACTTACAGTATA-1CTTAAGCAGCGAGCCG-1CTTACACGGTATTCCA-1CTTAGCCTTCCACATG-1CTTAGGTATAGACCAG-1CTTAGTAGGCCTACAG-1CTTAGTGTAGTAGCAT-1CTTATGCGCTCAGGGC-1CTTCAACTCCACTTGG-1CTTCAGTGGTCGCCTA-1CTTCAGTTGGACAACG-1CTTCATTGTCAGTGGA-1CTTCCGCTCCGTGAAG-1CTTCGATTGCGCAAGC-1CTTCGGCCAATTGTTT-1CTTCGTAGATAGGTGA-1 CTTCTATGTTGAAGTA-1!CTTCTATTAATGCTAG-1"CTTGAGTTAGGGTAAT-1#CTTGATGACCATCCAG-1$CTTGCAACCGCCTCCT-1%CTTGCCCACCCACGCA-1&CTTGCCCAGGCTCTAC-1'CTTGGCCAAGCTGGGA-1(CTTGTACTTGTTGACT-1)CTTGTCAACATTCGAG-1*CTTGTGCTCACCGATT-1+CTTGTTGCTGAGTCAA-1,CTTTAACTTTCAAAGG-1-CTTTAATATTGGTCGA-1.CTTTACCGAATAGTAG-1/CTTTAGGAACACTGTT-10CTTTAGTGCTATTATT-11CTTTCTGTGCGGGCTT-12CTTTGACGTCGCTTCT-13CTTTGCATCGCTCTTG-14CTTTGGCTTTAGTAAA-15CTTTGTCGAATGCTCC-16GAAACAGATGACCACC-17GAAACATAGGAAACAG-18GAAACCATGGTGCGCT-19GAAACCGAATTACCTT-1:GAAACCTATACAAATG-1;GAAAGAACAGCGTTAT-1<GAAAGCAGTGCACTTT-1=GAAAGCCCTTTGGACC-1>GAAATATCACCATCAG-1?GAAATATGCTTGAATG-1@GAAATCGCGCGCAACT-1AGAAATGGCGGTGTTAG-1BGAAATTAGCACGGATA-1CGAAATTGTCTCTATAA-1DGAACAACTGGGATGAA-1EGAACACACATCAACCA-1FGAACAGATTACTAAAT-1GGAACCCTCTGTGTTCT-1HGAACCTCGACCTACAC-1IGAACCTTTAACGATCC-1JGAACGACCGAATGATA-1KGAACGCGGGTCACACG-1LGAACGTCTCATGGTCG-1MGAACTGTGGAGAGACA-1NGAAGAAACGATATTGT-1OGAAGCCACTGATTATG-1PGAAGCCTGCACATTCC-1QGAAGCGTGAGGAATTT-1RGAAGCTCGGACCCGTC-1SGAAGCTTGCTGACCGC-1TGAAGGAGTCGAGTGCG-1UGAAGTCAGTTGCACTA-1VGAAGTCTCCCTAGCGA-1WGAAGTGATTTATCGTG-1XGAAGTTTCCACTCAAT-1YGAATAGACGCGACCCA-1ZGAATAGCCCTGCGGTC-1[GAATCGACATGGTCAC-1\GAATCTGAACATTCTC-1]GAATGCGAATCGGTTC-1^GAATGGGCTTATCGAC-1_GAATGTATGGCAGGTC-1`GAATGTGGTCCGGATT-1aGAATGTTGGGTAATCT-1bGAATTATAGTGAAAGG-1cGAATTCACCCGGGTGT-1dGAATTTCTCGCTGCAG-1eGACAAACATATGCAGG-1fGACAACGACCATTGAA-1GCOLGACAACGCAGCTTACG-1GACACAAGGGAAGAAA-1GACACAGCCGGGACTG-1GACACTGAGTTCAGTG-1GACACTGGAACCCGAT-1GACACTTCCAATTACC-1GACAGATTTCTGGCTC-1GACAGCCAGACCTGAC-1 GACAGGCACACACTAT-1 GACATCCGTCGAACTG-1 GACATCGATTTATAAC-1 GACCAAACGTTGACTG-1 GACCACACTTCCCTTT-1GACCAGAGCCCTGTAG-1GACCCAATTATGATAC-1GACCGACGTGAAAGCA-1GACCGACTGAAGCGTC-1GACCGCGTCTGACGTG-1GACCGTGCTGACGGTG-1GACCGTTACATGCGAC-1GACCTTCCACGTCTAC-1GACGACGATCCGCGTT-1GACGAGGCTAATAAAC-1GACGCATACCCGTCGG-1GACGCCGTAAAGGCTA-1GACGCTTGCTTCTAAA-1GACGGGTTGGCCCGTA-1GACGGTCAATAGAAGC-1GACGTGTAGGGATTAT-1GACTAAGATCATGCAC-1GACTAAGTAGGCTCAC-1 GACTACAAAGCGGTGG-1!GACTAGGCCGTTAGGT-1"GACTCACCCACGTGAG-1#GACTCCCAGAATAAGG-1$GACTCCTTCCAATTGA-1%GACTCGCGGGAATGAC-1&GACTGCAAATCGAGCT-1'GACTGCACCAGCCCAG-1(GAGAACGGTTCTGACT-1)GAGACCCTGCAACGCC-1*GAGACTGATGGGTAGA-1+GAGACTTCGCGACCGA-1,GAGAGGGCGCGAGGTT-1-GAGAGGTGCATTCTGG-1.GAGATCTGCTTGGCAT-1/GAGATCTGTCACTCCG-10GAGATCTTCCATGACA-11GAGATGGCTTTAATCA-12GAGATGGGAGTCGACA-13GAGCACCTGTGTCCAG-14GAGCCAGCTACCTGTG-15GAGCCGAGCGTTTATT-16GAGCGCAAATACTCCG-17GAGCGCGCACGAGTAG-18GAGCGCTGTTAGGTAA-19GAGCTAAGGGCATATC-1:GAGCTGTCGTCTCGGA-1;GAGGAATGGAGAGGTT-1<GAGGATAAACAGTGCT-1=GAGGCCCGACTCCGCA-1>GAGGCCTGTTGATACA-1?GAGGCTATCAAAGTCG-1@GAGGGCGCAGCTCTGC-1AGAGGTACGCGTGTCCC-1BGAGTAAGGCCACGGGA-1CGAGTAGATACTAGTTG-1DGAGTATGCCCGCCTTG-1EGAGTATGCGCGTGCAT-1FGAGTCAGACCAGAATC-1GGAGTCCGCTTACCGGA-1HGAGTCTTGTAAAGGAC-1IGAGTGTCAACCAGAAA-1JGAGTGTGCGGTACCCA-1KGAGTTCTGTGGGTGCT-1LGAGTTGATGGCAATTT-1MGATAACTCGCACTGTG-1NGATACGATGGGAGTCA-1OGATAGATAGTACAGTC-1PGATAGGTAACGTTGAC-1QGATATCAAGCAGGAGC-1RGATATGAGACACTAAC-1SGATATGCGGTAGCCAA-1TGATATTGAGATTGGCG-1UGATATTTCCTACATGG-1VGATCATTCCAAACATT-1WGATCCCTTTATACTGC-1XGATCCGGGAATTAACA-1YGATCCTAAATCGGGAC-1ZGATCCTCGACACTGGC-1[GATCGACACTATCTGA-1\GATCGCGGGCTCTCCA-1]GATCGCTACCCGATTT-1^GATCGCTATATCTCAG-1_GATCGGATAGAACCAT-1`GATCGGTGGCCATAAC-1aGATCGTGACTGATATC-1bGATCTAACCGTATTCA-1cGATCTGCTATCTAAGG-1dGATCTTGGAGGGCATA-1eGATCTTTGCAGGGTAT-1fGATGACAAGTAGGGCA-1gGATGACGATGATCGCG-1hGATGAGGAACCTTCGG-1iGATGCCTTCTGCGGCA-1jGATGCGTCCTGCATTC-1kGATGCTGTATTTCATC-1lGATGTAACGAACCACC-1mGATGTTCAATCCACGA-1nGATTAACCGAAAGCCC-1oGATTACTGAATTTGGG-1pGATTCCCTTGTCGCAG-1qGATTCCGCGTTTCCGT-1rGATTCGACGGTTCACG-1sGATTGGGAAAGGTTGT-1tGCAAACCCTACATTAT-1uGCAAACCTTGGCCATA-1vGCAAATATTACGCTTT-1wGCAAATGAGGACACTT-1xGCAACACACTAGAACT-1yGCAACAGCAGTATGCG-1zGCAACCACCAGACCGG-1{GCAACCACGGCCGCGT-1|GCAACGGCTAGTTATG-1}GCAAGAATTCCTTGGC-1~GCAAGATGTGTTCGCG-1GCAAGCTGGAAACCGC-1€GCAAGTGCACAGAGAA-1GCACAAACGAGGCGTG-1‚GCACAACCTCGGGCGT-1ƒGCACACACTGGTAGCC-1„GCACCTAGGCGAGTCC-1…GCACGCCGATTCCCGC-1†GCACGCCTACTTAGAT-1‡GCACGTGGTTTACTTA-1ˆGCACTGCCTACCTTTA-1‰GCAGACCCAGCACGTA-1ŠGCAGATCCATAAGACT-1‹GCAGATTAGGGATATC-1ŒGCAGCACACAGCCCAG-1GCAGCCTATATCACAT-1ŽGCAGCTATGGACAGGT-1GCAGCTGTCAACGCAT-1GCAGGAACTTAGATCT-1‘GCAGGACTATAGAATA-1’GCAGGTAGAGTATGGT-1“GCAGTGTGGCTATAGG-1”GCATAGAGCACTCAGG-1•GCATCGGCCGTGTAGG-1–GCATGAGGGACGCGGC-1—GCATGCTAATAACGAT-1˜GCATGGGTACTGACGC-1™GCATTCAAGGCAACGC-1šGCATTGACTTGCGGAA-1›CGTGCATTGTCGACGC-1œCGTGCCCTCCCGAAGA-1CGTGGCCGAATATCTA-1žCGTGTATGGGAGCTGA-1ŸCGTGTCCCATTCGCGA-1 CGTTAAACTAGTTAGG-1¡CGTTAATGTCCCGACG-1¢CGTTAGCTCACAACTG-1£CGTTATCATACTTCCA-1¤CGTTCAGACCCGCGAA-1¥CGTTCATGGTGCGCGT-1¦CGTTCTTCGCACACCT-1§CGTTGAATACCGCGCT-1¨CGTTGAGCGACCGTCG-1©CGTTGAGTAATTGCGT-1ªCGTTGTAAGATTGATT-1«CGTTGTCGGCAATTGA-1¬CGTTGTTTCAATTCCC-1­CGTTTCACTTCGGGCG-1®CGTTTCGCTCATTACA-1¯CGTTTGTGTAGAGGGT-1°CTAAAGAATGCCTACT-1±CTAAAGGGAAATAGGA-1²CTAAATCCTATTCCGG-1³CTAACAGCACAATAAC-1´CTAACCGCGCGCCCGT-1µCTAACGAAACTTGCTG-1¶CTAACTGATAATCGCC-1·CTAACTGGTCCGGTTC-1¸CTAAGGGAATGATTGG-1¹CTAATTCGCACGCGCT-1ºCTAATTCTCAGATATT-1»CTACACTCGCAGATGG-1¼CTACCCTAAGGTCATA-1½CTACGACTAGCTATAA-1¾CTACGCACGGAGTACC-1¿CTACTATCATAGGTTT-1ÀCTACTATCTTTCAGAG-1ÁCTACTCAAGGTATAGT-1ÂCTACTCTAGGCCCGGC-1ÃCTACTGCCACCTGACC-1ÄCTAGATGTGAGTGTAA-1ÅCTAGATTTACGACGGC-1ÆCTAGCATAGTATAATG-1ÇCTAGCCGATGTTATGA-1ÈCTAGGCGCCCTATCAG-1ÉCTAGGTCTGAAGGAAT-1ÊCTAGGTTCGGACGTGA-1ËCTAGTAGAAAGGGATT-1ÌCTAGTCACGTCTTAAG-1ÍCTAGTGAAGGACAGGA-1ÎCTAGTTACAACCCGGT-1ÏCTAGTTGGGCCCGGTA-1ÐCTATAAGAGCCAATCG-1ÑCTATACTTAAAGCGAG-1ÒCTATCGACGAAATACA-1ÓCTATCGGGTCTCAACA-1ÔCTATGCCCGAATGCAA-1ÕCTATGGGAAGCGGAAT-1ÖCTATGTCACTAGCCCA-1×CTATGTGAGTCACGGC-1ØCTATTCATGTGTCCCA-1ÙCTATTGTGTTTGGTCA-1ÚCTATTTGCTTGGAGGA-1ÛCTATTTGGTTACGGAT-1ÜCTCAACTAACCCGGAT-1ÝCTCAAGACATTAGCGC-1ÞCTCACATTTACTAAAT-1ßCTCACTGTGATACTTA-1àCTCACTTGGCTGGTAA-1áCTCAGATTGTGATAAG-1âCTCAGTCACGACAAAT-1ãCTCATAAATGTGTATA-1äCTCATGGTAATTTGCG-1åCTCATTGCTCTAACAA-1æCTCATTTGATGGGCGG-1çCTCCCTCCTTTCGATC-1èCTCCGCCCACATGAGG-1éCTCCGGCCTAATATGC-1êCTCCTCCAGCTCACAC-1ëCTCCTTTACGCAAGTC-1ìCTCGAGACATACGATA-1íCTCGAGGTCGAACAGT-1îCTCGATATTTGCGAGC-1ïCTCGCACCTATATAGT-1ðCTCGCATTGCATAGCC-1ñCTCGCCGAATGTAGGG-1òCTCGCTAGGTAAGCGA-1óCTCGGTACCACTGCTC-1ôCTCGGTTGTCGGCCCT-1õCTCGTCGAGGGCTCAT-1öCTCGTCTGTGCCTTCG-1÷CTCGTTTCTAATGTTT-1øCTCTAATGCATTGATC-1ùCTCTACACTGGCGATT-1úCTCTAGCCCTCGGAAA-1ûCTCTATTTGGCTGCAG-1üCTCTCACAATCGATGA-1ýCTCTCTAACTGCCTAG-1þCTCTGGACGCCTGGTG-1ÿCTCTTCTATTGACTGG-1CTCTTGTCCCGCTTGG-1CTGAAAGAGATCCGAC-1CTGAATCCGAGACCTC-1CTGAATTTATTGCCAG-1CTGACTGCGCAGCTCG-1CTGCAAGCACGTTCCG-1CTGCACAACTACATAT-1CTGCACTCCAGTACAG-1CTGCAGAGAATCAGAG-1 CTGCCAAGGTTGGAAG-1 CTGCCATGCATCACAT-1 CTGCCTTTCTAGTAAA-1 CTGCGACCTCGCCGAA-1 CTGCGTTACGATATAA-1CTGCTGAGGCCACGAA-1CTGCTTGGCGATAGCT-1CTGCTTTATGTCCGCG-1CTGGAAATGGATGCTT-1CTGGAAGACACGGTGG-1CTGGACGCAGTCCGGC-1CTGGATTTACACTTGA-1CTGGCATCCGAATGAG-1CTGGCGACATAAGTCC-1CTGGCGATTTACATGT-1CTGGCGCACAGGTCTG-1CTGGCTGATTCATCCT-1CTGGCTGGTTGTCAGT-1CGCGTTCATGAAATAC-1CGCTACGGGACATTTA-1CGCTAGAGACCGCTGC-1CGCTATTCTTAGGCTC-1CGCTCTCCGTAGATTA-1 CGCTGGTGACTACCCT-1!CGCTGTGACGCCGCAC-1"CGCTGTGTGGATGTTG-1#CGCTTATTCCCGGTCG-1$CGCTTCGGTCTAAGAC-1%CGCTTTCTTGCATTCG-1&CGGAAAGAATCAAACG-1'CGGAACGTAAACATAG-1(CGGACCTTTACGTCCC-1)CGGACGTTACTTGAAG-1*CGGAGCAATTTAATCG-1+CGGAGCATGGCGATCC-1,CGGAGTTTGAGAGACA-1-CGGATCCTCAAGGACT-1.CGGCAAACATCGTGCG-1/CGGCAATAAGATCGCC-10CGGCAGGGTCGGGTTG-11CGGCCACGCACAAAGT-12CGGCCCAACCTGTAGT-13CGGCCCAGGTATATCC-14CGGCGCCATCAATCCC-15CGGCTCTAAAGCTGCA-16CGGGAATATAGTATAC-17CGGGAATTTATGTAAA-18CGGGAGCTTCAGTGTA-19CGGGATCAATGTAAGA-1:CGGGCAGCTAAACCGC-1;CGGGCCTTCTTTGTAA-1<CGGGCGATGGATCACG-1=CGGGTGTACCCATTTA-1>CGGGTTTGTTAGGGCT-1?CGGTACGGCAAACCCA-1@CGGTACTAGAATCAAA-1ACGGTAGAGGTGCAGGT-1BCGGTATAGGTATTAGC-1CCGGTCAAGTGGGAACC-1DCGGTCCGTCGCAAGCC-1ECGGTCTATCAACCCGT-1FCGGTGAAGACTAAAGT-1GCGGTGCAGATAGAACG-1HCGGTGCGCGTTGGTCC-1ICGGTGGGCTCCAGCCT-1JCGGTTATCCAACAGTG-1KCGGTTCAAGTAGGTGT-1LCGGTTGACCTGGCATA-1MCGTACCTGATAGGCCT-1NCGTAGAGAGTAATTAT-1OCGTATTAAGAGATCTA-1PCGTCACGTCCATTGGT-1QCGTCCTCATCGCGTGC-1RCGTCGCATGTGAGCCA-1SCGTCGGATAGTGTTGA-1TCGTCGGGTCTAAGCGC-1UCGTCGTCCTTCGCGAA-1VCGTGAAGTTAATTCAC-1WCGTGACATTGGGTCGT-1XCGTGACCAGTCCTCTG-1YCGTGCACACCACTGTA-1ZCGTGCAGACTGGGACA-1[CGATGTTGTTATCTAC-1\CGATTAAATATCTCCT-1]CGATTCGCCTGGCTGC-1^CGCAAACACGAGTTAC-1_CGCAATTAGGGTAATA-1`CGCACATGTCCACTAC-1aCGCACGTGCGCTATCA-1bCGCAGATCTTCACCCG-1cCGCAGGCGATCCAAAC-1dCGCATGCCGAATGCGT-1eCGCATGGTGCGATGCT-1fCGCATTAGCTAATAGG-1gCGCCACAGGTCGCGAT-1hCGCCATCCGATTATGA-1iCGCCCAGCACGCCTAG-1jCGCCCAGCGTTTCACG-1kCGCCCGCTTCCGTACA-1lCGCCGCCCATGCCTGT-1mCGCCGTTCAGCATAGT-1nCGCCTCCCTCCTCTAT-1oCGCCTGGCCTACGTAA-1pCGCGAAGTGGCATACT-1qCGCGACCGCGACAGAT-1rCGCGAGAGGGACTTGT-1sCGCGAGTCTGCCGGGT-1tCGCGCAAATGTCCAGA-1uCGCGCATGTTTGATTG-1vCGCGCCCGACTTAATA-1wCGCGGCTCAACTTGAA-1xCGCGGGAATTAGGCAG-1yCGCGGGAATTCCTTTC-1zCGCGGTCACAAACCAA-1{CGAGAGCGCGTAGATA-1|CGAGAGCTTTCACTAC-1}CGAGAGGGTAGCCGCG-1~CGAGCTGGGCTTTAGG-1CGAGGCTAAATATGGC-1€CGAGGGACTGCGGTCG-1CGAGGGTATCCAGGTG-1‚CGAGTACTAAAGAGGA-1ƒCGAGTGAAGGTACCAG-1„CGAGTTCTGTCCCACC-1…CGAGTTTATCGGACTG-1†CGATACCTCGCGGACA-1‡CGATAGTCGTACTGCA-1ˆCGATCCGACCCAGTGC-1‰CGATCTGTTGGAGGAC-1ŠCGATGGACCCTACGCC-1‹CGACCCTTAACGCCGG-1ŒCGACCTACTAGACAAT-1CGACGCATCCGTACCT-1ŽCGACTCAGGATGTTAT-1CGACTTTGTATAGCCT-1CGAGACCCTAGAGTGT-1‘CGAGACTACTGCTGCT-1’CGAGAGATGTGAACCT-1“CGAATGACGCATAATG-1”CGACAATTTGATCTAA-1•CGACACGCTCCGACAG-1–CGACAGTTCGCGTTAT-1—CGAATCTGCTCGACGC-1˜CGAATGAAGTCATTGC-1™CGAAGTTGCTCTGTGT-1šCGAAGCTATAAATTCA-1›TGAGAGATTTACCACG-1œTGAGATTAGGCCCTAA-1TGAGCCATACAGTCTC-1žTGAGCGGAAAGTGTTC-1ŸTGAGCTTTAATGACGC-1 TGAGGAGTGCCAGCTT-1¡TGAGGCATGTACTGTG-1¢TGAGTAAATTAGCGTA-1£TGAGTGCCTCTTAAAT-1¤TGAGTGGTCCGTGACG-1¥TGAGTGTAACAACGGG-1¦TGAGTTAAAGACATTC-1§TGATACATTTAGCCGT-1¨TGATCAGGGAACTGCT-1©TGATCCCAGCATTAGT-1ªTGATCGGTTTGACCCT-1«TGATCTACGCTGATCT-1¬TGATCTATCACACTCT-1­TGATCTCCGGCGCCAG-1®TGATGGCTGTTTCTGA-1¯TGATGTCAATTAAGTG-1°TGATTATGGCACGCAG-1±TGATTCAGGTCCCGCG-1²TGATTCCCGGTTACCT-1³TGATTCGTCTATCACT-1´TGATTCTGTCGCCGGT-1µTGATTTATTAGCTGTG-1¶TGCAACCCATCTGCGG-1·TGCAACTACTGGTTGA-1¸TGCAAGAATGACGTAA-1¹TGCAATCTAACACGGT-1ºTGCAATTTGGGCACGG-1»TGCACAGTGAAGTTAT-1¼TGCAGAACTATATCGT-1½TGCAGAGTACCGAGCA-1¾TGCAGATCGTCCTAGG-1¿TGCAGCTACGTACTTC-1ÀTGCAGGATCGGCAAAG-1ÁTGCAGTTTCCTCCCAT-1ÂTGCATATGTCTGTCAC-1ÃTGCATGGATCGGATCT-1ÄTGCATGTGGTAATCTA-1ÅTGCCAAAGTCAGACTT-1ÆTGCCAATGGGTACTCT-1ÇTGCCACACTAGAGGAA-1ÈTGCCACCTGGCGAAAC-1ÉTGCCAGTACGTGGAGA-1ÊTGCCATTACTAAAGAA-1ËTGCCCGATAGTTAGAA-1ÌTGCCCGTACCGTTAAA-1ÍTGCCGTGGATCGTCCT-1ÎTGCCGTGGGACCCAAT-1ÏTGCCGTTCTTAATCGG-1ÐTGCCTAATTGAAGATT-1ÑTGCCTGATCAAACGAT-1ÒTGCCTTGGCCAGGCAA-1ÓTGCGAATATGGGATTT-1ÔTGCGACACCCTAGTGC-1ÕTGCGAGAATATTACCC-1ÖTGCGAGATGGCGGCCA-1×TGCGAGCCCTTCCGCG-1ØTGCGCAAAGCATTTGG-1ÙTGCGCGATTAACGGAG-1ÚTGCGGACTTGACTCCG-1ÛTGCGGAGTAAAGGTGC-1ÜTGCGTAAGAACCTGAT-1ÝTGCGTACGGCTAATTG-1ÞTGCGTCATGACTGAGC-1ßTGCGTTTGTTGACACT-1àTGCTAAGTGTCTATTT-1áTGCTCCACAGTTCTTA-1âTGCTCGGCGAAACCCA-1ãTGCTCGGTGGGTCACC-1äTGCTCTTGAGAGTTTG-1åTGCTGTTGAAGAACTC-1æTGCTTCCCAAGCAGTA-1çTGGAACCACTGACACA-1èTGGAAGAAGGGAACGT-1éTGGAAGGATAAAGATG-1êTGGAATATCCTTGACC-1ëTGGACCAATCTAAGAT-1ìTGGACGCAATCCAGCC-1íTGGACTGTTCGCTCAA-1îTGGAGTGATGCGATGA-1ïTGGCAAACTAAATTAC-1ðTGGCAACTCGCGCGCC-1ñTGGCAAGCACAAGTCG-1òTGGCAATGGGACGGCG-1óTGGCAGATTACGATCA-1ôTGGCAGCAGTAATAGT-1õTGGCATGAAGTTTGGG-1öTGGCCAAACTGAAGTA-1÷TGGCCAATTTGGTACT-1øTGGCCGTATATTGACC-1ùTGGCGACTGCTCCAAA-1úTGGCGATCAAGTTATG-1ûTGGCTACACTCTACCT-1üTGGCTATGTGACATAC-1ýTGGCTCTTGTCGCGTA-1þTGGCTTATGTATAATG-1ÿTGGCTTGTACAAGCTT-1TGGGATGCACTCATTC-1TGGGCAATAGTTGGGT-1TGGGCCACAAGAGCGC-1TGGGCCCATACTAATT-1TGGGCGATACAATAAG-1TGGGTGCACAAGCCAT-1TGGGTGGGATGTCATT-1TGGGTGTAATAGATTT-1TGGTAAGCAGGATTGA-1 TGGTAGAATATATGGG-1 TGGTCCCACGCTACGG-1 TGGTCGTGCAAGGCAA-1 TGGTCTGTTGGGCGTA-1 TGGTTAACTTACATTT-1TGGTTAAGGGCGCTGG-1TGGTTCAACGGGTAAT-1TGGTTCGTAGCAAAGG-1TGGTTTAAACGTGGGT-1TGTACCTACACGAGGG-1TGTACGAACAAATCCG-1TGTACTTCCGGGCATG-1TGTAGCCAATTCCGTT-1TGTAGCCATCCCATTC-1TGTAGGAGAAATTTCC-1TGTAGTGATCTATAAT-1TGTATAACAGATCCTG-1TGTATCAGACTGAAGC-1TGTATGGCGCAGACAG-1TGTCATTTGTTGGGAA-1TGTCCACGGCTCAACT-1TGTCCTAAGTCACCGC-1TGTCGTTATCACATAT-1 TGTGACTACGCCAGTC-1!TGTGACTAGAGTTTGC-1"TGTGAGACTAGCCCAA-1#TGTGCCAGAGGCAAAG-1$TGTGCCGGTGCCGGAA-1%TGTGGCAAAGCGTATG-1&TGTGGCGGGCTTCTGG-1'TGTGTCGAAGTCGAGG-1(TGTGTGACCATGAATC-1)TGTTATTGTATGTGGC-1*TGTTCCGCTTCCATGA-1+TGTTCCGGCCTGAGCT-1,TGTTCGTATTGCGGTG-1-TGTTCTTCCATTGACT-1.TGTTGTCAAGAAGTCT-1/TGTTTCTGAAGCGTGC-10TGTTTGAGATCGTCAG-11TTAAACTCGAATTCAT-12TTAAAGTAAGTCGCCA-13TTAACCAACCCTCCCT-14TTAACGAACAAGCAGT-15TTAACTTCAGGTAGGA-16TTAAGATAGGATTGAC-17TTAAGCGCCTGACCCA-18TTAAGGCCCGTACTTT-19TTAAGTATTGTTATCC-1:TTAATCAGTACGTCAG-1;TTAATGTAGACCAGGT-1<TTAATTGCTTTGGGTG-1=TTAATTTCAGACGCGG-1>TTACAACTACGCATCC-1?TTACACGATCTGCGAC-1@TTACAGACCTAAATGA-1ATTACATGCCACAACTA-1BTTACCATTGATTACCC-1CTTACCCATTGCCGGGT-1DTTACCCTAGGGATTGG-1ETTACGGATGGTTCGAG-1FTTACTAAAGGACTTTA-1GTTACTCCGGCCGGGAA-1HTTACTCTGGTACGTAC-1ITTACTGGGATATTTCA-1JTTACTGTCTAGAGCTC-1KTTAGAAGAACATGACT-1LTTAGAATAAGGGTCGG-1MTTAGACACGATCGTTG-1NTTAGACGAGTCACCTC-1OTTAGAGGGATATACAG-1PTTAGAGTTTAGAAGGA-1QTTAGCTAATACGATCT-1RTTAGCTGATTTGCCGT-1STTAGTAAACCTGCTCT-1TTTAGTAGGGCGGCGGG-1UTTAGTTATTCGTGGCA-1VTTAGTTCAAGTGTTCG-1WTTATAGGTAATTGTCT-1XTTATATACGCTGTCAC-1YTTATATTTGGCAATCC-1ZTTATCCGGGATCTATA-1[TTATCCTCAAGGAATA-1\TTATCTGACATTAGGA-1]TTATCTGTATCATAAC-1^TTATGAATGAAAGGGA-1_TTATGACAAACTGGAT-1`TTATGATCTTAACGAA-1aTTATTAGAGCGTGTTC-1bTTCAAAGTCTCTAGCC-1cTTCAATACTCTGAATC-1dTTCACGAAAGGATCAC-1eTTCACTCGAGCACCTA-1fTTCAGCCCTGGTCCAC-1gTTCAGCTGGCGTGCCC-1hTTCAGGCGTCAAAGCC-1iTTCATGGCGCAACAGG-1jTTCCAATCAGAGCTAG-1kTTCCAATCTGGCTATC-1lTTCCACACAGATTTGA-1mTTCCAGACGAGATTTA-1nTTCCATCATGCGGTGA-1oTTCCATCGACAGCGTG-1pTTCCCGGCGCCAATAG-1qTTCCGCAGAGAAATAT-1rTTCCGCGTGAGGCGAT-1sTTCCGGCCTTGAGGCT-1tTTCCGGCTCGACTTCT-1uTTCCGGTTACCCACTT-1vTTCCTCGAGGGTGTCT-1wTTCCTCGGACTAACCA-1xTTCGACAGAGCCCGTG-1yTTCGACGGGAAGGGCG-1zTTCGCACTCGCGTGCT-1{TTCGCACTGTACGACA-1|TTCGCCGCTCGCGCTA-1}TTCGCGCGCCATACGA-1~TTCGCTATCTGACGTG-1TTCGGCAACCCGCTGA-1€TTCGGGACTAATCGCG-1TTCGGGCGCTAGTCTT-1‚TTCGGTACTGTAGAGG-1ƒTTCGTACTCCAGAACG-1„TTCGTTCAACGAAGTT-1…TTCTAACCGAAGCTTA-1†TTCTAGAAAGTCTTAT-1‡TTCTAGGCCAATTGTG-1ˆTTCTATTAAACGCAGC-1‰TTCTCTTACAGGTGAT-1ŠTTCTGACCGGGCTCAA-1‹TTCTGCCGCGCCTAGA-1ŒTTCTGCGGGTTAGCGG-1TTCTGCTAGACTCCAA-1ŽTTCTTATCCGCTGGGT-1TTCTTGAGCCGCGCTA-1TTCTTGCTAGCATCTC-1‘TTCTTGGACGATCTGC-1’TTCTTGGAGTAATGAG-1“TTCTTTGGTCGCGACG-1”TTGAAAGGTGTAAAGG-1•TTGAACGACGTGCTGA-1–TTGAAGAATTCCCAGG-1—TTGAAGGATGGGCGCC-1˜TTGAATATGGACTTTC-1™TTGAATCGTTGTATAA-1šTTGAATTCACGTGAGG-1›TTGACAGGAGCTCCCG-1œTTGACATGAACGTGGA-1TTGACCAGGAACAACT-1žTTGACCATGTTCTCCG-1ŸTTGACCGTGTTAATGA-1 TTGACGCTCCATGAGC-1¡TTGACTACCATATGGT-1¢TTGACTATTGTCCGGC-1£TTGAGAAGTTTAGCAT-1¤TTGAGAGTACTGCTAA-1¥TTGATAGTCAATACAT-1¦TTGATCTAACTTTGTC-1§TTGATGTGTAGTCCCG-1¨TTGATTAGCTGTTTCT-1©TTGATTATGCAGATGA-1ªTTGCAAGAAGACTCCT-1«TTGCACAATTCAGAAA-1¬TTGCACGGAGCAGCAC-1­TTGCATGCTGATCACG-1®TTGCCAAGCAGAACCC-1¯TTGCCATAGCCCGCTC-1°TTGCCCTGATCACGGG-1±TTGCCGCAGACCTACA-1²TTGCCGCTTTCTAGTA-1³TTGCCTTCTCGCCGGG-1´TTGCGCTTGATCAATA-1µTTGCGGCATCAGAAAG-1¶TTGCGTCGGCCAACCG-1·TTGCGTGAACGCTTAG-1¸TTGCGTGTGTAGGCAT-1¹TTGCTCATAGTACGTG-1ºTTGCTCCCATACCGGA-1»TTGCTGAAGGAACCAC-1¼TTGCTGATCATGTTCG-1½TTGGAAGAATACAGTC-1¾TTGGACATGTGGCTTA-1¿TTGGACCATCTGGCAA-1ÀTTGGACCTATAACAGT-1ÁTTGGATATCGTCTACG-1ÂTTGGCCTAGAATTTCG-1ÃTTGGCTCAATATGTGT-1ÄTTGGGAAGACGAGCCG-1ÅTTGGGACACTGCCCGC-1ÆTTGGGACGTAAGAGTT-1ÇTTGGGCGGCGGTTGCC-1ÈTTGGTCACACTCGTAA-1ÉTTGGTTGCGGTGCGCG-1ÊTTGTAAGGACCTAAGT-1ËTTGTAAGGCCAGTTGG-1ÌTTGTAATCCGTACTCG-1ÍTTGTACACCTCGAACA-1ÎTTGTCACCGCGGTATC-1ÏTTGTCGTTCAGTTACC-1ÐTTGTGAACCTAATCCG-1ÑTTGTGAGGCATGACGC-1ÒTTGTGATCTGTTCAGT-1ÓTTGTGCAGCCACGTCA-1ÔTTGTGCGGAAGCGGAT-1ÕTTGTGGCCCTGACAGT-1ÖTTGTGGTAGGAGGGAT-1×TTGTGGTGGTACTAAG-1ØTTGTGTATGCCACCAA-1ÙTTGTGTTTCCCGAAAG-1ÚTTGTTCAGTGTGCTAC-1ÛTTGTTGTGTGTCAAGA-1ÜTTGTTTCACATCCAGG-1ÝTTGTTTCCATACAACT-1ÞTCCATCAATACTAATC-1ßTCCCAAACAGACAACG-1àTCCCAAAGACGAAGGA-1áTCCCACTCTCTTCCGG-1âTCCCAGCTTTAGTCTG-1ãTCCCAGGCTTAGCTAA-1äTCCCGCGTACTCCTGG-1åTCCCGGGTGTGCTGCT-1æTCCCGTCAGTCCCGCA-1çTCCCGTCGCGTCATAG-1èTCCCGTGTGCAATTTG-1éTCCCTAGATCAATAGG-1êTCCCTGGCGTATTAAC-1ëTCCCTGGCTCGCTGGA-1ìTCCCTTAGATTACTCG-1íTCCGAAGTAGTCACCA-1îTCCGAATGGTCCTGAG-1ïTCCGATAATTGCCATA-1ðTCCGATGACTGAGCTC-1ñTCCGATGGTGCGACAT-1òTCCGATTACATTGCCG-1óTCCGCCTGTCTACAAG-1ôTCCGCGGCAGCATCTG-1õTCCGCGGCCCAATGAA-1öTCCGCTGTCATCCCGG-1÷TCCGCTTATCCCATTA-1øTCCGGAGGAAGGGCTG-1ùTCCGGCCTAGCGTACA-1úTCCGGGCTTGACGGGA-1ûTCCGGTTCGTCCGGTC-1üTCCGTTAAGCTAATAT-1ýTCCGTTTAGCCTTGAA-1þTCCTAAAGATTCAGAC-1ÿTCCTAAATTGGGAAGC-1TCCTAACCGTCGGGCA-1TCCTACATCCACGGCC-1TCCTAGCAAAGAAGCT-1TCCTCCTAAGACATTC-1TCCTCGGGCTGGGCTT-1TCCTCTACGAGATGGC-1TCCTGCCAACTGGAGA-1TCCTGCGTTGATACTC-1TCCTGGCGCTGCCTGG-1 TCCTTACGACGGTCCG-1 TCCTTCAATCCCTACG-1 TCCTTGTCCTTTAATT-1 TCCTTTAAATCCGCTT-1 TCCTTTCTTACGCTTA-1TCGAAATTTAGGACCA-1TCGAAGAACCGAGCAC-1TCGAATATCCCGCAGG-1TCGACAACTGAACCCG-1TCGAGACCAACACCGT-1TCGAGTCTACGATTCG-1TCGCAAAGATGCATTT-1TCGCACCAGGAGGCAG-1TCGCATAAAGGGCGCA-1TCGCCGAAGTTGCGTC-1TCGCCGACATATTCGC-1TCGCCGCACCGCGTGA-1TCGCCGGTCGATCCGT-1TCGCGTAGCAGTGTCC-1TCGCGTCCAGAAGGTC-1TCGCTAAACCGCTATC-1TCGCTACTGGCTTTGA-1TCGCTCGATATATTCC-1 TCGCTCGGCACCAGCG-1!TCGCTGCCAATGCTGT-1"TCGCTGGGCGGATTGT-1#TCGCTTTAAACGTTTG-1$TCGGAATGCGCTCTGA-1%TCGGACGCCCAGCCCA-1&TCGGAGAGTATCGGGA-1'TCGGAGTACATGAGTA-1(TCGGCGAACCCAAACC-1)TCGGCGTACTGCACAA-1*TCGGCTTGTATCGACG-1+TCGGGAACGTGCCTAG-1,TCGGGAGACAGCGTAC-1-TCGGGCCGTCGTGGTA-1.TCGGTCCCGACAATAG-1/TCGGTGACCGCTCCGG-10TCGTAAGACGACATTG-11TCGTAAGCTCCGAGGA-12TCGTACCGACGTCAAG-13TCGTATTACCCATTGC-14TCGTCAAGTACGCGCA-15TCGTCTTAGGCGTTAA-16TCGTGTACTATGGATG-17TCGTGTCACGCTGACA-18TCGTGTTCGACCACAA-19TCGTTAGGAGTCCCTA-1:TCGTTGCTATCCGGTC-1;TCGTTTACGCGACCCT-1<TCTAAAGAACAGTCTC-1=TCTAACCTAGCCTGCG-1>TCTAATACTGCCTCAG-1?TCTACCCAATAGAGAG-1@TCTACCCGCATCATTT-1ATCTACCGTCCACAAGC-1BTCTAGCAATCTCCGCC-1CTCTAGCATCTTCGATG-1DTCTAGCATGCCCAGAA-1ETCTAGGTGGCGACGCT-1FTCTAGTGATATCGTGG-1GTCTAGTTATCAGAAGA-1HTCTATAGGTGGGTAAT-1ITCTATCGGTCGCAACA-1JTCTATGCTATAACGAC-1KTCTATTACTAGAGGAT-1LTCTCAAATCAATCGGG-1MTCTCATGAGATAGGGT-1NTCTCCAACGTAGGTTA-1OTCTCCACAAGTTGAAT-1PTCTCCCTGGGCAGCGT-1QTCTCGAACGAGGTCAC-1RTCTCGACGTATCGCCG-1STCTCGAGGAGGTTCGC-1TTCTCGTGTTACGAGGA-1UTCTCTAATAGCTGGTA-1VTCTGAACTCGTACCCG-1WTCTGAAGCACGTGGTC-1XTCTGAATTCCGTACAA-1YTCTGAGCAATTGACTG-1ZTCTGATGTATTCTGTC-1[TCTGCATACCTTGCTT-1\TCTGCCAGAAACTGCA-1]TCTGGGAACCTTTGAA-1^TCTGGGTAGCGCTCAT-1_TCTGTGCCATCATAGT-1`TCTGTTACCCAGCATA-1aTCTTACCGGAACTCGT-1bTCTTACTTATGCCTCT-1cTCTTAGAGCTCCAATT-1dTCTTAGAGTGAACTCT-1eTCTTCCCATGGGCACA-1fTCTTCGAATAGACGTT-1gTCTTCGATACCAATAA-1hTCTTCTATAACCCGCC-1iTCTTGATGCGTAGCGA-1jTCTTGCTCCCGATACT-1kTCTTGGTAACACCAAA-1lTCTTTAAGACTATGAA-1mTCTTTAGAGTCTAACA-1nTGAAAGGACCTGACTC-1oTGAACTGCTATGACTT-1pTGAATACCGACGCGTA-1qTGAATATGCTATAAAC-1rTGAATGTCAGCCGGCC-1sTGAATTTCACTTGCCT-1tTGACACTTCTCTTTGC-1uTGACAGGACAAGTCCA-1vTGACATATATGACGAT-1wTGACATCGAGCGGACC-1xTGACATGTAACGTGAC-1yTGACCAAATCTTAAAC-1zTGACCCACGTTAGACA-1{TGACGAATATTTCCCT-1|TGACGATGCACTAGAA-1}TGACTATAATCCTTTC-1~TGACTCCGAATCATAC-1TGAGACGTACCTCTCA-1€TATGGGTACGTATCGT-1TATGGTCTGAGTAACA-1‚TATGGTTAGTGGGAGA-1ƒTATGTAGAAACCCGGC-1„TATGTCAAGACCGACT-1…TATGTCTCATTGTGCC-1†TATTAACACCAAAGCA-1‡TATTAACCTGACCGCG-1ˆTATTACCATCCTGCTT-1‰TATTATGTTTGCCTGC-1ŠTATTCAATTCTAATCC-1‹TATTCCACTCAGCTCG-1ŒTATTCCGAGCTGTTAT-1TATTCCTCCGCCCACT-1ŽTATTCGTGCCAGAATA-1TATTGCCGGGCTTGTA-1TATTTAGTCTAGATCG-1‘TATTTATACCGAGTAG-1’TATTTGTTACCCTTTA-1“TCAAACAACCGCGTCG-1”TCAAACTTAGATTGTT-1•TCAAAGAGCTATCTGT-1–TCAAATTGTTGTGCCG-1—TCAAATTTGAGACTCA-1˜TCAACAAAGATAATTC-1™TCAACATAGCGCCCTA-1šTCAACATCGACCGAGA-1›TCAACCATGTTCGGGC-1œTCAACGAGGAGACAAA-1TCAACGCAGGAAATAA-1žTCAACGCGACCGGCAG-1ŸTCAACTGCAGAGTCAG-1 TCAAGAAATACTAGCT-1¡TCAAGCGCGGACGGTA-1¢TCAAGGTTACTACACC-1£TCAATACGCCGTCATG-1¤TCAATCCGGGAAGTTT-1¥TCACAAACCGAGGTAC-1¦TCACAGCAAACTCGAA-1§TCACAGGAGAATAAGA-1¨TCACAGGGAATCGCAA-1©TCACAGGTTATTGGGC-1ªTCACCCTCTTAAGATT-1«TCACCGCTCGGCACTC-1¬TCACGATGTCCGTGGA-1­TCACGCATTGTAGATC-1®TCACGGTCATCGCACA-1¯TCACGTGCCCGATTCA-1°TCACTACGACCAATGC-1±TCACTATCCCTTCGGT-1²TCACTCGTGCAACGGC-1³TCAGAACCTCCACAGG-1´TCAGACGCTATAGAAG-1µTCAGCAAATGCATCTC-1¶TCAGCCAATCCGTAAA-1·TCAGCTTGAGCTTTCG-1¸TCAGGGTGTAACGTAA-1¹TCAGGTTCTTTGAGAA-1ºTCAGTACTGACCCGCG-1»TCAGTAGGGACTATAA-1¼TCAGTGTATACGTCAT-1½TCATATGAGCTTTGTT-1¾TCATCCTCAGCTGCTT-1¿TCATCGACGACCGTCG-1ÀTCATCGATGGTCCCAA-1ÁTCATGCAGGTTCTCAT-1ÂTCATTTAAGTCTCCGA-1ÃTCATTTAGAAGTGTGA-1ÄTCCAACTCAGCTATCT-1ÅTCCAACTTTAAATTCT-1ÆTCCAAGCCTAGACACA-1ÇTCCAATAAAGGCTACC-1ÈTCCACAATGGTTTACG-1ÉTCCACATCGTATATTG-1ÊTCCACCAAGACATAGG-1ËTCCACCTCTAGCCTTT-1ÌTCCACTTTATCTAGGT-1ÍTCCAGAGCACCGGTTC-1ÎTCCAGATGTACGCCAA-1ÏTCCAGGCGAGTACGGT-1ÐTCCAGGGTATATACGA-1ÑTAGGGTGTTTCAAGAG-1ÒTAGGTCGCCGGAACTG-1ÓTAGGTGACGATAACCT-1ÔTAGGTGAGCCCTACTC-1ÕTAGGTGCTCGCCTAGC-1ÖTAGGTGTTCCACAGAT-1×TAGGTTCGAGTTCGTC-1ØTAGTACCACAACTTTC-1ÙTAGTAGCTTATACCAG-1ÚTAGTCCGCAGAGAATG-1ÛTAGTCGATCACGGGTT-1ÜTAGTCTAACAACGAGA-1ÝTAGTCTGTGACGTTGC-1ÞTAGTGCCCTCCAGAGT-1ßTATACACAGACGCCTT-1àTATACGCGTCATCACT-1áTATAGATGGTCGCAGT-1âTATAGCGCACGTTATC-1ãTATATATCGAGAAATG-1äTATATCCCTGGGAGGA-1åTATATTACAAATGTCG-1æTATCACCCAACCGACC-1çTATCACTTCGAGTAAC-1èTATCAGTGGCGTAGTC-1éTATCCAATTGGTTATC-1êTATCCATCTCGGTTAG-1ëTATCCGCACCGTCGGG-1ìTATCGATCTATGCATA-1íTATCGATGATTAAACG-1îTATCTACCACAGCGGG-1ïTATCTGAGCCGATATT-1ðTATCTTGCAATACAAC-1ñTATGAAGAATTAAGGT-1òTATGACCTTGCGCTGG-1óTATGATCCGGCACGCC-1ôTATGATCTTCTCTTTA-1õTATGCTCCCTACTTAC-1öTATGGATGTGCTACGC-1÷TATGGCCCGGCCTCGC-1øTATGGGACCGAGCAGG-1ùTAGATATGGACTGGAA-1úTAGATGGTTCCTTACT-1ûTAGCAGATACTTAGGG-1üTAGCAGTATGACTAAA-1ýTAGCCATTTCAAAGTC-1þTAGCCGGCGGTCAGCG-1ÿTAGCGTCCCTCGATTG-1TAGCGTCCGGTGTGGT-1TAGCGTTGGGTCTTAC-1TAGCTAAGTCCGGGAG-1TAGCTAGAAGGCATGA-1TAGCTAGTGATGATGG-1TAGCTCGCCTGATAAC-1TAGCTGATGTGAAGCG-1TAGGAGGCTCGAGAAC-1TAGGCATGTTACGCCA-1 TAGGCCTATATAGTCT-1 TAGGCGATGAGGTCTC-1 TAGGCTAAAGTGGCAC-1 TAGGGAGCTTGGGATG-1 TACTTTACTGAGCCGG-1TACTTTCCGCACGCCA-1TAGAAAGGTGGCGCTA-1TAGAATAGCCGATGAA-1TAGACGAAACGCCAAT-1TAGACGCCCGTACCGG-1TAGACTACCTAGCGTT-1TAGAGATCATGCAACT-1TAGAGGTTCTACTTGT-1TAGAGTCTAAGCGAAC-1TACTGAGGGAAGAAAG-1TACTGCAATCAATTAC-1TACTGGACAGCTCGGC-1TACTTAAACATGTACA-1TACTTGTTAGTAGTCC-1TACTCTTACTTTACTG-1TACTCTTTCGTCTTCA-1TACTGAACAGATTTAG-1TACTCTCCGAACAAAT-1 TACTCGTTTGAATCAA-1!TACTATGGTTCCTCAG-1"Gene Expression#Gene Expression$Gene Expression%Gene Expression&Gene Expression'Gene Expression(Gene Expression)Gene Expression*Gene Expression+Gene Expression,Gene Expression-Gene Expression.Gene Expression/Gene Expression0Gene Expression1Gene Expression2Gene Expression3Gene Expression4Gene Expression5Gene Expression6Gene Expression7Gene Expression8Gene Expression9Gene Expression:Gene Expression;Gene Expression<Gene Expression=Gene Expression>Gene Expression?Gene Expression@Gene ExpressionAGene ExpressionBGene ExpressionCGene ExpressionDGene ExpressionEGene ExpressionFGene ExpressionGGene ExpressionHGene ExpressionIGene ExpressionJGene ExpressionKGene ExpressionLGene ExpressionMGene ExpressionNGene ExpressionOGene ExpressionPGene ExpressionQGene ExpressionRGene ExpressionSGene ExpressionTGene ExpressionUGene ExpressionVGene ExpressionWGene ExpressionXGene ExpressionYGene ExpressionZGene Expression[Gene Expression\Gene Expression]Gene Expression^Gene Expression_Gene Expression`Gene ExpressionaGene ExpressionbGene ExpressioncGene ExpressiondGene ExpressioneGene ExpressionfGene ExpressiongGene ExpressionhGene ExpressioniGene ExpressionjGene ExpressionkGene ExpressionlGene ExpressionmGene ExpressionnGene ExpressionoGene ExpressionpGene ExpressionqGene ExpressionrGene ExpressionsGene ExpressiontGene ExpressionuGene ExpressionvGene ExpressionwGene ExpressionxGene ExpressionyGene ExpressionzGene Expression{Gene Expression|Gene Expression}Gene Expression~Gene ExpressionGene Expression€Gene ExpressionGene Expression‚Gene ExpressionƒGene Expression„Gene Expression…Gene Expression†mm10‡mm10ˆmm10‰mm10Šmm10‹mm10Œmm10mm10Žmm10mm10mm10‘mm10’mm10“mm10”mm10•mm10–mm10—mm10˜mm10™mm10šmm10›mm10œmm10mm10žmm10Ÿmm10 mm10¡mm10¢mm10£mm10¤mm10¥mm10¦mm10§mm10¨mm10©mm10ªmm10«mm10¬mm10­mm10®mm10¯mm10°mm10±mm10²mm10³mm10´mm10µmm10¶mm10·mm10¸mm10¹mm10ºmm10»mm10¼mm10½mm10¾mm10¿mm10Àmm10Ámm10Âmm10Ãmm10Ämm10Åmm10Æmm10Çmm10Èmm10Émm10Êmm10Ëmm10Ìmm10Ímm10Îmm10Ïmm10Ðmm10Ñmm10Òmm10Ómm10Ômm10Õmm10Ömm10×mm10Ømm10Ùmm10Úmm10Ûmm10Ümm10Ýmm10Þmm10ßmm10àmm10ámm10âmm10ãmm10ämm10åmm10æmm10çmm10èmm10émm10êENSMUSG00000025935ëENSMUSG00000025937ìENSMUSG00000067813íENSMUSG00000025932îENSMUSG00000054493ïENSMUSG00000025930ðENSMUSG00000032769ñENSMUSG00000092083òENSMUSG00000025925óENSMUSG00000032719ôENSMUSG00000067795õENSMUSG00000043716öENSMUSG00000025921÷ENSMUSG00000100868øENSMUSG00000025920ùENSMUSG00000089982úENSMUSG00000025939ûENSMUSG00000079658üENSMUSG00000097744ýENSMUSG00000025940þENSMUSG00000025779ÿENSMUSG00000101640ENSMUSG00000042686ENSMUSG00000100110ENSMUSG00000025777ENSMUSG00000099899ENSMUSG00000067780ENSMUSG00000100053ENSMUSG00000085125ENSMUSG00000025776ENSMUSG00000099895 ENSMUSG00000025774 ENSMUSG00000073735 ENSMUSG00000067773 ENSMUSG00000089787 ENSMUSG00000042596ENSMUSG00000025927ENSMUSG00000100538ENSMUSG00000043760ENSMUSG00000089914ENSMUSG00000099906ENSMUSG00000025929ENSMUSG00000041872ENSMUSG00000041859ENSMUSG00000102121ENSMUSG00000097934ENSMUSG00000025931ENSMUSG00000041809ENSMUSG00000041779ENSMUSG00000099971ENSMUSG00000067879ENSMUSG00000099827ENSMUSG00000025912ENSMUSG00000045210 ENSMUSG00000097893!ENSMUSG00000025915"ENSMUSG00000046101#ENSMUSG00000098234$ENSMUSG00000099032%ENSMUSG00000025916&ENSMUSG00000087199'ENSMUSG00000025917(ENSMUSG00000056763)ENSMUSG00000067851*ENSMUSG00000042501+ENSMUSG00000048960,ENSMUSG00000057715-ENSMUSG00000097171.ENSMUSG00000101314/ENSMUSG000000169180ENSMUSG000000259381ENSMUSG000000994982ENSMUSG000000424143ENSMUSG000000058864ENSMUSG000001014765ENSMUSG000000259056ENSMUSG000000337747ENSMUSG000000259078ENSMUSG000000900319ENSMUSG00000087247:ENSMUSG00000033740;ENSMUSG00000051285<ENSMUSG00000097797=ENSMUSG00000103067>ENSMUSG00000025909?ENSMUSG00000061024@ENSMUSG00000025911AENSMUSG00000025903BENSMUSG00000104217CENSMUSG00000033813DENSMUSG00000002459EENSMUSG00000085623FENSMUSG00000033793GENSMUSG00000025902HENSMUSG00000104328IENSMUSG00000033845JENSMUSG00000102343KENSMUSG00000025900LENSMUSG00000089699MENSMUSG00000051951NTram1OLactb2PXkr9QEya1RGm9947SMscTTrpa1UKcnb2VTerf1WSbsponX 4930444P10RikYRpl7ZRdh10[Gm28095\Stau2]Gm7568^Ube2w_Eloc` D030040B21RikaTmem70bLy96cGm28376dJph1eGm28783fGdap1gGm28784hPi15iGm28154jGm16070kCrispld1lGm28153mCrisp4nDefb18oDefb41pGm15825qTfap2drTfap2bsGm28340tPkhd1u 4930486I03RikvGm28653wIl17axIl17fyMcm3zGm28065{ 6720483E21Rik|Paqr8}Efhc1~Tram2Gm28287€ 3110035E14RikGm29520‚Mybl1ƒVcpip1„ 1700034P13Rik…Sgk3†Mcmdc2‡Snhg6ˆTcf24‰Ppp1r42ŠGm15818‹Cops5ŒCspp1Arfgef1ŽCpa6Prex2 A830018L16Rik‘Gm17644’Gm29663“Sulf1”Slco5a1•Gm29283–Prdm14—Ncoa2˜Gm29570™Oprk1šNpbwr1›Rb1cc1œ 4732440D04RikAlkal1žSt18ŸPcmtd1 Gm26901¡Gm30414¢Sntg1£Rrs1¤Adhfe1¥Lypla1¦Gm37988§Tcea1¨Rgs20©Gm16041ªAtp6v1h«Sox17¬Gm37323­Mrpl15®Gm37381¯Rp1°Gm1992±Xkr4¨+³Äÿÿÿÿÿÿÿÿ  deflateÀ%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð#dýin,s BxÜ(I}Ò0%‚î8÷†ã@å‹HÈÙPÝ•ØX¶š`ŽŸh’¤Æp¡©xg®ã€x³ßˆ[¸ó:½ä˜-ÂÓ Çô¨äË °ØÐÒ¸åÕ À·ÚȳÄÿÿÿÿÿÿÿÿ  deflate%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÂÝŽã¡é•¿îŽ Tô¯(âùÂ0‘ÿ”8SŽ@ç lHu»Pá€Xœl`!ƒhˆ&œp ,7x§1ƒ€Þ6zˆa<„ÛA¼˜_G± M½¨ÌR‚°‰X­¸ ^šÀ¸cȈ ÿÿÿÿÿÿÿÿ  deflate@%%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0 Rg?‚sÿÿÿÿÿÿÿÿ  deflate€.%z‚]XTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%ÁwØ6ø8TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€:(HEAPX09feature_typegenomeidname(dÿÿÿÿÿÿÿÿ deflateÈ;%z‚]PSNODp9øC 8M(xVTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcdÿÿÿÿÿÿÿÿ deflateE%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýbdÿÿÿÿÿÿÿÿ deflateHN%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿadÿÿÿÿÿÿÿÿ deflateˆW%z‚]PTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa¸_x^í“ÇRQ‡â¿À†/†d%H"I@É9#9ç$ð† »™^³ìÞuï„;U“‰¢è¹ +zã%DQNŸcÏMøÿسþ{Hø=ò˜÷¿Dþ ó®á7ÈßÂïßž=ø~ìù ?@ý0öLÂP?Æþø)î9üsÌ»À=c˜÷óÆÑ?þIì›B~ófà³Ø?ŸG~¾ˆüîYF~%¤ï_Eÿ|ý¨o·Búýÿпüê…èÿÒï)‚#_ÒÿO)æ—ÁËá˜WÒßë#öW¡¿:¤ß÷ õϘ_ƒz-æ×a=ú¿ ߀ý¨7¡ÞŒý-¨·¢¿ õvxGìy ïDý+îw£¿õ^xòýxß÷þžÈ"?ÿÒßã'úaþ0úGà¿á0oô­(""""""""""""""""""""""""""""ïÊ+üŸþx^íеVCQÑÈÃ-×Á݂ۿò]¸»-¨`jÊ™æ¬Ýž8„pœJ„â_>„÷áxÞ…÷àu8oÀ›ð¼ OÃ3ð,<Ïà ð"¼/Ã+ð*¼·Áípœ†;á œ…»àn¸ÎÁ½pÜÀƒð< À£ð<OÀ“ð|’üëSø >‡/àKø ¾†oà[ø¾‡àGø ~†_àWø ~‡?àO8àï\ÂI8‚‹àb¸.…Ëàr¸®„«àj¸NÁ1\ ×ÁõpÜ7ÁÍp ÜýŒ™™™™™™™™™™™™™™™™™™™™™™™™™™™™ýc_?˜umx^íÇÅR‚a@ÑÏ™ÿ|i[±» »,»»ã-vÎ]»¼gw¢Bª° äýD!Dþâ_øþŽàø#þ„?ã/ø+~‚Ÿâgø9~_âWø5~ƒßâwø=>/à‹ø¾Œ¯à«ø¾Žoà›xÏà[ø6¾ƒïâ{xßÇð~ˆáÇx^Œ—à¥x /ÃËñ ¼¯Â«ñ¼¯Ããx=Þ€7âMx3Þ‚·âmx;Þwâ]x7Þƒ÷â}x?>€âCø0>‚â <‰áãx ŸÀ'ñ)|ŸÁgñ¹|$I’$I’$I’$I’$I’$I’$I’ô¯~Þ]–—x^íÇENPÑOÒ}Ó+àZ(îPÜÝiq)^Üîà ¬È¬YÎl&/BøŠå„Ÿ>#!Dÿø~ƒßágø~…oá;ø~€á'ø>†Oà,| ŸÁçð| _Á×ð <ÏÂsð<¼/ÂKð2œ‚Óð ¼ ¯Áëð¼ oÁÛð¼ gà=x>€á\8· àB¸.†KàR¸ .‡+à8\ WÁ ¸®ká:¸n€á&¸n[á6¸î€;á$ÜwÃ=p/Ü÷Ãð <Ã#ð(<Ãð$<OG~gffffffffffffffffffffffffffffÿØ7ÅsÓx^™é®¤5 ›aß7Þÿ1™]šÒ‘ûŽÄ£$Ž·ØÎòu¿{<ïÞãó÷øä ÆŸfüÙs ñÕÿò9V2Ðäß>[mÀSýò_>H§¿>ý¤}9uT7²»Ö/žôÚ”¿þÿñœWFÝ@ÿ®µ€®¥¶ËóÏãƒo´oùâxã ðMZçvÝõ_}ÊVüøø°¶Í™-|Æ¥²ÀøÔÛµ[`Wë銥<µ%à§.œ“O}ø¡´_¥ŸõQZ}øûñ_˜ÿ>|Ý ú·9­ŸE÷NmvmÕµm×)¾{Òœ_ÝåUòšçÒ‹_ž­uBLWÏêßyÆ/!¼V®ñ1êxÕâ[í´ViOÿªcÑxÔ§ú»ýÚ[9ñÓãÃ:ߊù+¨³gÅΙÿ÷òµ®vŸ©ç‡ð4Fî³òÙ·¥îɾ^qùùI'·î¹ž#ÅÆª¶×wæØöá+O«<­¹Á×(ä×oÆ[7 øäáÔëÙ1y+móAëåÝTך¥·Fwž³¿¼øÐ˜Tï¯Ï±ww׿õÒÌõ,»l€ß2W™ÆK^û¾@k€¸šÃµ ¸{h©ïìµgï\À»–V•ç\dŒœgù®×ÒßwðÛ£çS}Øx¸´)_}þгoívl¿ºõÍzvÍÀøU¦ké½H.vÞX]¹¤¿{»óÀ:q/]kX™Åíâ—ÆY}ñ¼|æ»2­›¾]kîÚûèœãëP·±í°ýªŽæ™1ûI™ò_¶.ì7õÖ•(ýz«×yvn¡nÇ­‡Ú¤oÉßœWVï;ùÖ‡•¯n`nåÛ³`û}7밺ѥŸ½›·ÖÔåc¿¹^ù²¹iJÖí[oœž+;WûW½sÎ(W^ѹßý\ãµGV/h>¥—§ýŸß9¥›;Ûæ[›µ¥m­ëïúd~*Ï»¹Íoe}çÂÓ8î÷7iëKõsöà3rÞÂ-Ms¶¹ß±ñó¬Øyß êýëÙ‡ÿªËûÀØõÛÈu6¿o¡¾ÿŠÚ©ß{oï¼Ø8_v‹W9uÒÕë¾_;…1aîªW¨Ïøåú_y­ƒkìºâ±ý·jOè—ôžçµ#/4c¼ob[¾éSßÞ÷ô×Ðû¾kýÒV^ºöœ¿ò¬L74“¾§û}wA]Í­ü½ó6÷bc¼ó‚ßýëë§Wò¯ö}ÏÐ7€zºß­}§t}—ÎiËÿ1¤í9µ:Û·Ëïÿ1×Û¾`n¿—ê«ç`e®ïZu­þòl½‚ž{­SõÙï»g÷ûúr­Cô÷RÚ+w«kmˆž•]»:7û^[ÄâUŽAããÿ'K/¿ï­ÿƒ=‡l[ÿÀ="ºÓï«Î×Nulìíû»ûž¾¬Ç«§ë¸|¹âxõ—oõmt kÛߨ ÷7Úë}¡Î‹V½€½ºgêêÝ=Pÿ"x^•™çªmEÏ5çŒ("‚ïÿR¸ Š^ýÑÌLç4aíýáíííà >~wô/G†¼²ŒŸ†|22ð8‡·¸õ{àÑQ;OPÝÅ]|ÎÕ_¿Õ£]y¿záÁ•Nù'û;_Dž¹²æ¬ú•‘öøX[ú*½þ7x}Q¦:¡™FmÊ)ÛÑyk»¾0þžÏ_cåª×¼7GÕÏømæŒí³örŸ½h Ð+wѱ£Ns¤Lk¦­âèmý`ýdKÌw¼× «g×Úš?ykzãÚØ¾ úA¿êìXÝ­·ü€òµ¥lõv•G>Æúì™"/~_¹ÿúíßÞ‡/·6•·qþý¢Õí0²þ)üÄñMøk¯¹¬/â»ËgìÚW/ãoÿúLœÆ¸<À·}çzñÍgçÀ{6úbeWÆœšçöô´&W {.´Ø©¬y¶&êwä¼´ní“õ£q®ùJkíô×;ºr¹£º6vcaþ{ÖÍIõ_°zËßÚ6_Ëç|yóº4ã]]Ögy{Æ*×Ô— ·@]œoŽÕ[ÿª“˜ßÛgBëÁ|ébÔÎÓ™»çHßÛ# ­i{¼`ÜûfÐí‹•w¯wŽNÏôÝÿÖÕºë“:=ãYsþ*Ûz•_º÷ÃúÕ=zÝ+W^ È÷]QÛõe{HþÍw³6}s(¿¾˜ m©×{É<¶6æ@½?¿èðö]°þ¯‹Þø„Æg<ô móTùú*4žòÇNß4õç¿ègDw¿›Úo•o.êoYëµ¾~;èï•·÷`cº ´å³O¯~š#ãX2Å÷µoj¢]c¿jпճº€ö•>z]ùl-JÓÆ¯¯¹ûå)áÒe|=.í6¥ù^ß·Kó¡ëË_¡ÓgŒèPWýißv¾=|ÿõ»omyžêÙzÐ'GÚS/V¯ßóO|À“Î9Fk#½¹çŽp½ß{¶vòzg‹ë¹»¶/~Ÿ[çÎ/Ö¨¾•§>Á³ý¾ lu•¶rÜ#Œõá’]ýKo^r×¾€Ï7Ù¥oïêï9Âx½”ñ›Pœo%û°ûã²%®úÛÅ-¨ksйú=Àÿ6²Ìñ•}®Ïû^Z½öèÚ©Þ ÍËÊt½x ïÌ=Ã.ùK—=Á|ûRÞž»Õ¥,ù€Ç¾WßêWeÍeçSÏòסù”Öó `½sßw¢rèõýlÌÀ{gM{y÷XuKÇîõ»@׋ºßÚ×[—K~ýh/æÆ^=Ê.M~uà럯¹çh{|ý‚®ŽÒ}³–·~T~s²{BìeFó©_k»ºÖ¾ó•i9ï»~.;Oë=G/ž+¿¼øÌ¸½W¬Iul¼Ý¿Öñøkÿt_®Ï@ï¡+†ú舵¿'UN¿û ÄÅà.ïåÏÞ;ß>i®ôQÚ¥¡z¼£Ì™ùôþh.ë¿ñ]}²ào+æîÿúº|Íǯõæäš÷l|‚§{BâÈ‹±×vóá772ž# ½":Ê/®cÇ‘‡ï(ýÛ·µÓ.{Ó>å¬ROï+õ@ƒ§93ÎÆˆLßdðïï(3kû®¹S7ôþoáo&æÂ\^½'ŸvÖW/—ÙîUA\k¨ßý¾Ú8[“Ú‘¾þÁïwŒqʧ=æÖ«úñQ?«Sà?Dý÷²gßú¦OÅwÍÞ«üêÛÚ6õѹoœýucÙõê¿è‹{: àûÉkûx^™ÙÎTEFEÀ Â%ïÿ†þ+9+¬|©Óz±SU{žjèӯǫøù¿»Æo®QÜ·×XüÇ N¹•‘õëxüi\צ4ÖèÔÏŸ®yAÈë›~(§ÌñMü×üû‹þË üYækOYÆ7׸9‘Ž­Æ ø5¸ŽÒ×Þû‹`³úªczchüBuihΤ5NiÌÉ£|Îk³2•ëx’±.âZÓæ¡ðOä+³ºö‚q’—Ò æP?7ø¢¬ø­‘4eÕÙ˜Ô¥¬ý³y’î¨ÞÖk}G_èAp[SÖµQßíùÔ6u`T_m¸~›u÷ÄúU€íáÒú¦k`ss'SÁú6‡­[kÆ‚ú(žóкk£9nohký9Ùßzý~ÍÁ±ÍåINÛÂæ†úh_››‚þ»®Ý9rÎ\½ùT÷<<ò­NýðÌ’Oª§úNº„S^òYÙSÁ»ÏJs¿<³³~±î9*Ø£Úk\ö”çOý¨ÝÍ͇kDÆ»õÿBã<Áæ¨÷¸øÖzãe_èÿ)ww¶«›9¹Äö挹>y¬Ïø`Né{ão}8áêgæñnNz9ŸÔQŸ »æì"6b÷þ2Nc·w˜Ó¯æÛ¼io÷‘y—}yâÌ4tÖÏò‚¥o-ýYÀxä×ÜÕ¯ÊY+cò,Ø>v}zûVß\y¤Õæ¾ïtx ‹ÌÉîê[½€÷߉ ¿ÈýžÏü¤fÌÉ;yßóumÕæ½ãµ¹ö„Ö÷T?uí>º³¿o¥×Ïrcë\9FÇ(÷åšËÓ½Óx8õ¡ÿÝ µ+n÷Š<=7”i.Ì»=Ñ\ÊÇÞROc—ß¹6eå)®¹òœ)ïæ]š1š»Æò[æÄ³tààímmÕ÷Ê5Õµ´Â_¡ã³ºkØ}ÈÜ3fm2î¾hožgžã•¯ ùÔq·GN½´ï uœô×Oµ^oõúvܾ³¾ÛKðÙ¯{–ùÛq1·ßú{ ^{výŒ =ž)€¾tʧ^y‹ì!ýkÞ|S1·¥Ÿ|,”¾ß¥Ê£Ýí- ç˜wG}—Ÿñshú©~çÚí™|çOs\Àî߯¶û}DÝõgm­~W[Ûê0Âî““Œï´ú¥MbÁV¿4W›§úÊÜœ£Çߣж…­Ãh·ýÚÞ`^]ëWcôýflå[»ê–iæqeå­¿¥“rdÏjcù\ïw6i›¿žw»ÿW®4u˜“ÂÖ°z|'ï`ý~&×·¡²®7Ï@s+<}ÍØ;Y½ŒÞÙ®9ój«oam9Wwõ·g¶W:/lnúné~wÊGm÷û ßé¬k}P—9ë· úV›èoÞ÷7ÏIØZ•èݲ½gŒàíuãéÝPÛ­ðçãë9Ç;mßÎ'{û~Zí›Êûþž¾}åõî?Ù¯ÒšëÍщ¿zº–§4{Ø>«ÌÆü,­ÃžqåßwGéÞoÞóÖxmÔîêØ»S»+ÛüUŸsßýðl¿”¿5¨'ýÄgl}'žì/Þ|ªÃÎ×øíÇS_®niŒÜ«ÏôÝÛî»ê[~àký:oí-ßêöÛ)?õ±wZãU·öZsÆOרmk\{½/8ËVWõuoœ|¼‹µ'^ùÆ¡“-À;£8¡ùkmèŸî c®\õë«}S]õä8ßÿK+Ou-¾ëýº¹YYý:ù×Z û»îä[õìq}ë{è÷¿›˜x^…™Ùª$G ïxßÇ;ƒßüÿ¿è ¨€à ¾~©Rj—R•ÕýáíííÃ'øì|þà|\>dÊóJÇmÙoŸ•çâ».”®½¥ãÛw¡wŸ½Kÿú^ý°o®~ž=äØ×—êù>¸<Ådå¥mL§qÕÿê°n_>øUÇê®Ï<#'ñ7†KÐ|üùúÝZ_å™õ§×çW½‰~õcó/?úÕÇs}¿pxðoŽ}`chþéGù´-/{ð·xã­ìÆÞø¶ÚU_cV~eÊ¿tàÇ‘ïŠö°g¨óeyÚßÌôÀÏÚ~ U¦°4sZšçVúÖO™«.PN]ÿß~ÖoV þ5ÆË&çQysÝ>)Ýgòè~k _2íSi}^_Ú«×~ëÓ>ÿø¬õ¸j¥®êy•'zgí*Óy¶z€Î>kÅ~{Âú3#º']¹ÚÙ8ꟸ|K8‡Ðw¿q\¶XÍÑÆ²º^åp¾ö":™“Ê;3Éú.½g.ñ¯>+¿ùlÉ èKgÇÂÏž¾:[͇º¤öCó¦}öŒÍ¹uÕ}}šñʰJ—¯à»¼ñ^vvïŠIèŒ4®õsõ5fžywW§¼ÞÑ}ÞØê¿8y5Ê8ÓÔg•oqÖú ®Ú,oç úû®.Ÿú.ßës}¼ì—κ³X0öÖNÙÕ×øë_cÙ¼þ ^”ñ>Ïl¯þžΚ=Bï•o}C¯ºÛ§®î¯<´?ûv:‡ö¼ï¹fÎZ¯ËŽôú±þƒ÷ÞP7d=S«gã8KêÜsVŸŠW÷õΨç^Ý{÷jäqû`ñúé]·þ7îÆ®Ÿµß}ukoû_ü=P§²[{Wße8µÝýÊÛçúÚßÀzäé{hoþê›ï¶ÖU{È<4VeÔïÞÆß½=/@k£ÌÒÚ/ò¿>´ö?ÏÍ«÷'Ï®ôͳúkG8;úÒ»‘r—l}Òž::Ûä1ÏÎ]åÜ3Ÿ«ß¨Cß–WhýXí`kî=µ}·½¥L×΋W¼Ë_»îµ>+»Ïû{[yô›µ=¹¹]Yæ¶ò{VÖ7stÍ—þv¹5¨¼ëÞ‹ôã=9€~µ°Óš¾Â='Õ}õ©¸¿}9ó×y/yÏÞ«¼GÁ¿ßªË¿´æÜýž)í‚ëÇê\]¯žëTyõk ØïªKŸßOì5ÿ彿©6ÀûûOsäsqtYïhÂÚ¾ü•ÆR¦s¨<é´Þê…†¬ý¶_=[ø¡}ólÑ .û}qŒ®ê(°·±ÿ“¾<ú ˆKÕ[»m•ÕŽòË×XÈ£±#ÿ)ÝK—&¾1úvmVÆùêÕoñÓ³-½¾6Οӧ­ï]gQŸ6~ì®Ïö¬Mêk×¹úä«=Ú"Ÿ¨¼0Ö09ßʯŽWôöÿþäwýÓwá¿tv-h•%7Ь3yŒcó~{òÊS=µ±9ZÚ¥{y{†÷xs%½rÆ·v]góÀþ« åZ‡ éìïÆ_K'gÍy× ^åõËZ`Ζ9ÏÕ]+@œòK¿ö»±|¾Ú—Þs³<•m\מÖ¯Ðïå§u®˜Õ%mëhý¿ú¶úÀ1ÆÖÍB9r¢_»¡¿§Ë<¬Ÿ€ý©œy¨Ý•YyÇ=ó*[ðQ¼º—TW×ïð!Ï÷je×·âZÓ½×ìüúÏ=#¬£æ¬÷5}­Nïø¯çh¿5œßõíxë²sШ!¿OÎAkó•®ó¬0Þ÷tšÓ]ËŸòpfÊ‹~¬)æ ³ûÆ í¾Wïå«¶ë7w§úYÞKÞ>û\ÛÐÛªË8ÍËê·ÿçsÜ}TÞå¿æ…w`àݬòt]¡ë‹<=?k‡ø¥í}e±5qé|ch¯=¶ò´ÆgÎôÁý z'Ò—µ úAoãi½éû®>iÇš\p.wÞz^ß6?;Þ‘DyÍÉ%»þ—Ï3Ø8«wm”Î9tñìd× 2;W({Ùæ‘¾ß¬ò/˜³F´¡LkJ^ÚæÄùÊQK´W¬¢ùï™Ì£skkk«o5Ú¾ƒ÷ÍBÛ³‹úéï úÕ¾0¦¥ù¶‘ý­muì¹â}Eì;yQ;×ïÁµ<¯@w}s›óæim{ÖÔÆÕßÖºÛ< mËSyæ¹OéK/“W=׺ëåÊØzvÜúSÿƦŽå/^Å­Žú]¥££¿åyx¥³{E½ÆZ;¶½Kï^½l˜ÿú¡Œ-õmmv?6—ô¹ƒÉÙî:‡²ÕåwZÏ÷]›ú½>ï|kž–z&¿»®ÍC}«^ãûö/¨Gc{Ô¿¥igeÊsô=W ïD»?–ïÍ|h³wsZ_È™sÕ¹þ–¾´õôìmÍécsCß1mkà£{´uQí¬Ï«[úÆá÷§yZ™ ê¿êñz‡¶¿ºõ¿öÍÕò‚þÒ3§9µ妺]£Ýw ï+ïšÖ¼{U=½‹ó±õÑ<ù~Roý†Þvi»Žý&éy{{ûê>{§ÏßéÓ×|ã'/ÚÜkν7úN{Æ1^ÇýðpÆü‹wúR{ØÉhÞo4÷Ù0˜kz!ö!ö¾~à,NæaìËOpðƒ=lÿ=kÇ}¬9/8ìÕËüý§»†±8Œà³œçècßó¿^ç£ù9ˆ[y;"âuatœý?¾ý·.ªöuäü•®:Y½W†ùöocŒgözýÛkà[c[߯šûŽŒüaÏ–áPSõçòÁëî5G=Çwl²í»£Ä þÖ.ȽÅsßð/{Ÿ¾Ù˪¬÷æ7:¯š›mÈ@O:Áx:/¶×›»¾|f½ìÿùâ¯>÷Ëß¿ý›3ç¸ã¨õf\Û0½î=µ­rW×ÄÝqn½8æëÝëÚdŸ×KàmL/œ¾æ…z÷Fëû¶_³{ 6zl[c±ÝŒßf´mÕwÑÓùögŸó@ÎÙsýì/–íž}ÄwÄ<àRG­cb쬆È+Øð7G¶Í>Õæ‹ÊÚïŒîƒ]œ’ýì]_-Y±ÑùËk>ŒæßõÖX?‘χ×|›Ç½Á´~ƒÜµïšqŒÈßèõòU ¨ëQùÀô7Ñϯ5Øð®OlÄÆ¹Ç}¤ûâ#?õ ­£ÙDÏó>²WÔ€÷wët_ÙÜßs®;ëAŽóÚ²8n\¯µLk¯ß ž;Ö¶´w—;òtJOûÄuofy‰ÉFçlçŽ[1á3ž××ÀâÎqæßÖ³Ú_såZ©­Ü…gÃp>ZoÖíþäßsãoŽ·×;ÀÜ{ܱ¾¹ÐpŸj˜óÊÀ6ø–ÇwóW¾Ø®kbTÙ‹ϋʃ­à_o+|Ž‘e/^¯¯ß à‘|ï<Æö7þæŽåFþ0öU ðQ÷`¶þ·¹Ïöþ´z¿Û›[ãÕnË”¸÷Ý¿È|þ–49†Ý¯žòU¦wÁáûÆ{ðÿ¤µs½ÑýßrÈ}d©g®CðFŽïÕ/éu›;¿È^:ÁöûH¿³,'(^©øà‘Çš÷ß²Íúì£yÖ³˜÷oMàòûÝÆ2]ú?ú;Ðè©gâkïùm·OððŽÍw¿—Œ—-è^Íú½*Ÿçã©¿>»â´ýÙÕ~Î]±¬Ï‹ÑõܶÕoh²Ó;¬ÖÒè)ÆÅìý­^óºg96ôÞòCÎÉlåÞõÜïzcÚÖ¾]åiþÖ·ª÷ÒáµyýžX—e¹ëÔºïpó=<îyð=²-Äžsü~ß ô{½oáÉ’ ç—}ä°Œ<~5ô„¿ ‘1/~øžÙÿ‹ŒÝ³äF–ù¿ÿWØÇ[[+³ ÿÚ÷à·Žæ²äß`Æ»j’\^11ï%;ZÝ¡ƒœÏ.ßg¿{ØåßÔ¼±©)æ–·½ö‘:±};§Ïñ& Ëœ±ÞÈoJßÛº¿açd_c{4i½þf¥ß cmî~çÞh>ÿö5¦¶LŸ3G[9oܽ³8¶©÷˜¹qÚSg÷”Ê?ÝǵzðËv³÷ô–AþýR;/~ûöõo;ÁÝØ;fÞ즆‹}É·±Ãø®Üƒ>þ„Ï^¿+³sî£m€jç¥ùþ&¶¹ãv6 ‡¹É±19îO¶’#øxO‹Ç>X=¯Ï—MÓõ~[úx^™Ù’]5Ç`À6»yàÿÿgp3"£¢ÏÀC…tÔ­êE­åÎ|~{{ûðÂ÷ßðÝ«oû1rú+gNeŽŠ Ww9+—ƒo9jãÇÑŸ3]ûr¶•£cà×÷Ægßï_Þþå@ï§è\~™‹f¼úyåà÷Ñ-Ïê.žòY>|«ÌX×'A®7×»ú¼ª_;[3àç×}ò}q›ç²ÆL\Îqͱ£Ê]í®/Ú²Ïú£'öä¦ïÒ†õQ~ýÓoy­qðgúãòi×õI¦­+¶ê,GÛžúµù2Ÿ×b<íårÓw¯Ñ¿|·~k¯¶úý_ñ-vß>aã³%»:¯º…ñ_2¹”µ/Zã=¯ÙcÕµ6±·u§¬5m œòÓãU¶¬ëž=ìç«–j p¹÷Z»—kn*¿jÆ3¤¹rNÛúV{Õ)ê÷QÁ<ÖäšÓþÖî_ÍÑò3ö[Æ*ëwk@¸Ÿ÷\\Ž]ýxÊ7 ¾øþ™sÊU{ý6ß»Ÿ;¿-Übó¤Úì ~ônÜZYžäµ}Åc÷ìÅS ×ó÷Í»6ßkÑó]÷ÄU½õccÛ½xùÿ§\Ž]gÚrÚ'[Èü²|ËStïs¹×o¹—Ï}h­*/~;Þ:Û{pcs¬¼=«~|éÚ¨ã»VžW»¼»ony®;þŠ ðžPÖ·•Ÿøàh¬õ¿>ÐßsÔ¼mþ›Ïþ>íuåû?g9ðwGýYÀ»wŸãö÷¼,Wõ6îêÏæœ6wŽwžr9¼§:NëûÄ9êÕÏÚn¿h|Þ«ùìÚ+·o¬¯cž»Æ]Ç î]ý«½ µ¿2x.yù¼³7îæ´sÙ+k§ó¯õÔNçx†‰Ëÿ¢÷AëÏY{÷ŽîãêmŽ®¹›¯ú°ú…gŸvÔ¥Ý5–ÙÞKÝ~¯Í¯¯¹Ô"5ÐwL¹ æ‹æ”=Í5õa×¹ûÓ½¡?èv>aó©o»^ê­¯ŒS·;þÖ¦k]ƒêíã\ÝþÆì›–q×Þoe­9ô§v'\“êÁsÅÑ|SvýÔÙufl9®|—ßxô³²ÖÔż«;æ¼Þg«ÜWÍuí·¿sä¼t„¹Sg÷¸ð<ñ›sÂ|ßµ¿÷ {«ïžkOí\}[4W¿1‰ú®ÇÌ‘þ´Þ xñ»ï„êÕ—Ž{möj¹ÊSßÊYnï¦ý}²±m×l ¶ìuëòú[‡í•Ó…<ë£óùÞ=º@Ÿjo¹\³'?v®÷´ù7gí#òÍßPè.7pœ[®CÓnýwn[±5Qh£þ\z‹¿_mý½òhÝ€ë<[l^–¯1VϾ>¼÷&_Îõ yëfc³¿g`±k´:|[KåÜåþŽº|_.až;ֳйêìyÕx•­ýåwí;z—ö÷míëÏ“Ûßk¢óë‹<´] åû¿ÊÚè>ý-ö,±õwú{5±o)‡4&Û¾¯z¿òí8ð~¥ïù!ãúãÞÕúÙ÷—ò§VÎú°µ%¶µc[ý]7Ñ=ƒÜ¼ýªØ—x^…™Ù®7 ¯ã,ÎêìÈÿiR@R8à\?’Hêp“ØÝ3ÞÞÞ>üG_=ãÇgü+kyêHdþmt¤¯³×9£¸ÅcýÓ#wo±ÖÎ7á¹_lI d¿>#üïž±¸µ³Ø?F&^å?D¾qI`£v¯9ôéáuoI_Œýæ|ã€~yøÝ™»æQLy›ãõcôÌèGsÒü1§ž®[s1­7äyosM­üõÆAÕéHm«×ü6Žê´^­ùq/:ëï×úé—<÷Ô®Xê‘Ë›ó ^©ºœî¹ìjÇzµVæ ½Úßü±ÆŸÊ õ™Øå‘ÓÍOí5'ÍŸ>[×??k0”­ýb³9(ŸüYë.÷|ªßœ8JÝï^e~õ–ÜWù÷¯>4Vå‹Ë|sR;Õ‘Ïœ{ëº÷E,hýÿ-¼Ë>*ßÞ«/b÷9VÛâ¸n¿„Äcë¼xæó¨ÞÖQ{ëÓê:î93oîk¿w?==ìl-Õuoñ+_Ý’¹0NÈø®º©SÞçgs|¬«[_ÿ’½ùåOi1Åh>å­íâðt﹤¯ŒÍ7<î‡øŒí­Åpmýûî(_Ýæqik];öùëCÏ,8k‡þb¬×}.ç]ß•à5oêÊk^¬ÁÊ”C}Öo=‹£~ñôOû×l{ïœmÖVÇί3^ŒµóÏÛÿýؽOõÉš©§oíÆâ°<³Ä¼¶»ÏXú„Þu¶­ï'«×Ü6øÞwiŸ7èˆÛ÷UùÎÕßÖ‡kyVšŸÅ‘·ò+ÆbWŸyßsö.wn_¾|èºûVNz66[“õAþ¾­ÍîQF7>é:Œ{ûmÅn¸ö—´lû ´÷ú=þ…/õ;xõºî9/ŸÑ^lÙ‰ãl®öª>Šß:Ø+´Ý}ëŸ69sÆ}=7¯÷ëWä»`ûæµ×Xv¿ÔžyáTfL‹µWjoí*«u¬‡:Å»lnÝÌõÚs$_Ö¯>*ß½¯H=úÑöyÉÞÒü)[»ÎÑ>×\]÷¥ß”=SMùöäë>•ôÿÊË®Kô¥Ú®Ý÷{x¹÷³¾Ô¾1•¿yn~Àj-Jè^ߦ|£(ïùÎc¯†W_Ö×å+c¿G‰ã÷ØÖµ¾×gÚuß×ÄßÑû ·9üynÌŸ{ÄÑ/ù¾‡GûÞ=¨ß¢Õi ä·âï7©¾3÷¿|ïYÖNcZùRcú’~í©ûÊü+‡Æ³üæakqÙ½rí{FqÖÇ}î]ù„È>ï3ïv1{ßKÙûÊvùÞ¯â-¶¼ëYê}4¿ûŸƒ²bT¿xÍíú$õÛñU~œ_ÏŸÆ(Ïÿ «ã]ÜgÃê¸æ7´Å½l•Wÿ{÷yåü¢/éšÃýÿfsç»Åoû:µY}dýönÕ.£½Ü=‹Õ3Òýêþ=kílßPî9CÎoÖæ¤çÏ9ÄïgâáK¿áÕ©¼~úmUAj¿ªï¥ú¶|Λòêç…õž¾*ûsäÛ£šë³~1¿î¡Ôý¡6SúGjÜx^™×®dU ïsð@úÿ¿„%¥’{@‰ìècñ€7b\¬ÑgÜæÁ¬]X^ÿ4<—ŽñÌfìÃ~cý 5Ë~)^ûl¿,7j |ßJvXöÃrÌÛ·ú=úFü¬Û&ú³ÍóÆ1nù±ß›bÙž/ž~íiÝ_ðëCé»g}±·ïpwÓ÷üúkÁª¯¶çóƒãµ[¯5YœµŽ›ósùñë!kùbÑ7ÆÅë|¼ç+C-Øï×Êûõkxÿø´ÕïœY§u¬Æ6G- Ë|•حŘ??ò&jÕ¼W±Fõkvc}plwý†ý¶‹ñ%KŸ:¶ÿ¯d¼îü`ÃÆ×¹P>ûtQkË´äþµàVÆr­?ö§ë“3þ•þbÛÞÖ<ðÇuãz~¼»¼fþ^µX_Æ·ó—8L'z³Þë®Õú‰}ÈÚFˆs;9;Á»Î•Úî9û‹=ëÿööîŸè+÷21qNÊk¾õ§Û6ONãúõõó>q0fsîØ3·Öv›×º<Ïš÷“ç¬Û8WÞL?I†XÀo¼ËÓæº×÷fC¿í¨|ãüËӲ篼¶7lkq‡êA·ùba>ð7ï:y…ù~1cÎ:ââµÎ}õ´ö£60æîmÞÈCu47ËÚ½íÖ"_{-Ç|uÁ³Zq=Óx•-ÿ°F¾ˆr¶a¼—x‚qíåW´Z¸ò~ÉvŸš¦—ýS<ÇYÞeæ/câmž­oÿ0g]Ô¶…w&ctSÇ[ëY^[¼f½èF§qvWÀÇ÷¢e±·gëkç/}ߥøãó¼ò&æM`¸öšgÆÎöë­»Ê2F·ïx®¸×GZ÷+óŠê²®%ßyÆ®¿Ø¾–ûÈ<ÆöøÂóß”ì÷êºöÑEØÕù½ 迯ý[‚óBÞ*ç3f¶ë¾ì¹î{äö¦CÏd±¾öáwŒXçwÏÓõ÷ž$‡|w^öƒqunìx4^¶¡sãûãiK¿±Ýš¿Ã{FÀ»½·ñä‰ÕeGmZì¨I¯#?}|^ëgÛp{ó^þÂo,ô!W]³©¿¡¸>zÏ­Ý:óİwRutŽBæjK{ƒâëûÞ“— #dýÛÒ«Ú5–e™#GŽ?cÛä¸{ä{Û11ÙŸµýÞ°m¯j¯x³ë’m.Z³ÛÏ6×B}m.ªËuz‡•«üÛšÏW¾9?×~„Š×š¸xÜá¿ýü·|nü-c]¯tzíÕþ¯üçæÿÑß1ĵµ2âíèZŽyÁµØö§øFøê“sÇ¿ñ¡Ï7•±.ýÄǹÝÜÞðÁÿZ¾oF>Ã̳5ÛÇYaŸÞG=ï!dY¿ì¯Í|/³ç­ÿ•-v÷yð×߳Ϳù÷­E½ø6ßeÌÃ>2¦õ7É0¬Ç6ùÍX=çœaúY—ßÀh]@¶½:Íë·QkÊ8ký½h¾Õ(u‚=—þb÷=‚Ü+ŒÊ/¼ý®·ÇEõ}Î~È{ÃoËK–˜AÎ?qñfDyãú^ìÿH¶Ï6p/Ì×32–­ý½‡ý›ß–1¾ó›^íù;‚X:#æª {]—-¿?-:ÊŽ÷'çkðObl]—aõ‹x^…™Û®7EÏ!ÁSþÿ+9Kê%-m¹‡‡’ír]·Ë—žy~zzz~¡¿®öÕ ½½ú¯´ÈÑ—þy¡?¯¾s´o®öƒŽcí–>\í»ƒ^uhñ¡û•m>Ú« c‰8µuòYÙ—÷yx•5ÞÕ…ÀOÙm¡¿¯Öø”ßX~7f­ìKeè[°¡Ýõï1w·ÖƬ\ÛS ´ÆÊØu<Ù=ùtþ}ÆõGÍ‹!9¬®6[SêÃoŸößð!ìóÚÀ§~¹xò•Uïã% ‘¿üæQ‡5 ýwÉšGã…°)¿g@e–w·f⼺Ë+Öå›gùž'ŸædÜ;·9çþ¬LõV—¼Äpc‘ŒSÝÅ ~œ·>V¾±Ôõ…,ë †{N;}ç83*Ó³§òµVמcy{ìyVk·úÄܽ²öOºúÚùSµ׿´¾âèÞª¼çbI;b¨Íb*ïSôôAתºàÒõçQÞsrq¢~h=ר¿Æ§¼cí§gwyê [ìÖ÷#BvkdI{wX׿õÕÜ žom™óLòÚ:í›ðN¦¼Êq–â^³/ö7ž!Ú“z>Kç÷Ì?µË“Êï[¬rú•çÙqº{ª÷¼¶Å˜þîIez&ô?bhϨ%Ïfäz_4ž¶»¿Këð_ ¬x^…™G®1¿sÎiçûÓn@ iÑ çåÀ!©Ñ³§§§çÿñLãûÛøò†ÍÁd äÌ7íõmþB°Ü­sË1ŽÿYr¯"¿çáÍ?ÙæŒo7Þä¿Jþ£ù=Újíw’Ûó߃þèô¡5üx£¯ÆDß8ÚæËìâ×½Y½ˆÍ1Ì.²õcù‚Mó³ù•­MžÉ ü¸ÎϺ“¿êÅÖxåÞ½¶]_üU§vêý6tëÔVe'ë—ÞU–øL_-Èçô¾R[xØXÌøiý©o}ñþ8lÚ篧³mçjšé¬½áèäϹò.[ßqmܺh>Ãêà½ÄõÄΗÛÈ;wZcùŸdŠÊ|:È ôΰšs‚Gƒ×ƒsià ¬÷®Oë79Çç÷Ãör¥Þ¶KŒØf4¯1yÛàü+lc{ïj÷è.¯±bŒÞ3mà\ãyky#ûòâ¨ÍÚ°_Ç=»ÖåÙ´ùc]CÇ9}—g𩦠W5ñ» Ï{ºãtL›{?;Õ‚5j]Ûl<5Ã^u·&œOmпÆã=¤vwî6žÖí*Wàþ1Ö/sÞËÖ|x§ü6÷ºÝÝ8·>m¿O˜î›;ö˳—»>ø²MÃúh;¬¥é±Qóì{õ5¾ó„U_ïñ]›Äo㩆ømGß^Oün9žÆV­ï•´ÅZ¿£ï™O6±{:'ì§þG«k£wšúò3ñv!7:}ðšwŒèÛ¶×[e~ƒçä‰nõÇGß~,sÒÛ3µ"7ÖKeO6Ñ»'ï¾×Nk>ðžGìU‡ØGcºÇƒæç­ehWö-?ø¼n?‡­ ÖS×´mW¯k ÙÑÙK9ÅG,ô]øî‘ÏPzqŠÏ1a»÷}ÞüÙ'óÆ }ïò½{¿“ýN6®^ŸÐ¯°Ü‘aoÅ®åšKa?¾³Tnx´Çã5ûØ=ŽÚŸëÀsÏ›úô=ÿ^ÍFo},Ë|wæömûŽ{óî¶É{9[ü~sœ­#ùœ¾…ŒFý'W]ìRûÍùv‚¬ímäN7yÛc̓õ¿ÑûšýØîh=ó|Çh=Çó™æ>¶F}—ÎÈodlÂ+Æó˜ê±çõˆ~»'cð¾PtÏ,ÿTbâ÷€åN1tóIä{’Çüß^Wqî'ö6÷÷è~7 hÎ{p}O±Ãë·Ç1˜WÛí!²ì 6¼Ï ‡œé=_®ú>½Þ£·çÚ–ç{ m\¡¹¸^ðögç¿q nÞSëÇß©¯z°ç5S™b2þVà¼6çΊœßkû¨/×°}¾Òi_«Ã^bÚÏȹ–¿osïµ?¸^]k'ì«û7tÍbotöõ¿¶‡Ö–³Œo­Ôâž~kç˜Çšz6×§¶[WW°/¾™Yît6T¯ó®ÕS,öŸÊØ®cfîZ ô»½AÀëýÌw é8wçว—ŒÿèÎÚ~z/1z¶o<Å,Ë]œ¼îéú\´¬,ëÒý¨ÛF÷Ö5@›Ô÷v²;ïèó±/â„ßÑ2¦û7)úŽÝÝoà]õÆv `osÎÃyÖžãrgýñÿo÷>ÍÓñÀçÎܸOýÜœj0ð¶w‘¢±ñÜY×£³ÿnÎïâÖ×v}î@Ÿ|.þÀ³x^™ÉŽA ö}½pàÿÿž˜¡PV‹ƒåLïv:]UÝ·ÛíÉxúˆŸi=x¥ýðø–‡6é×ÿÏÛ¿|z•oœðO>Ù¯®íëö±œ®øƒÖ”u{¯{Ë¿9È9÷õ˜÷ôKs?Á‡ÛßóYn®…ukcþ†§cúIþ^¬Ý³Ð¿…oÝÁ—È7Æ{Àý4`‹^åÞ«ýô‰Ék÷9ûÆî2LŽº¢Ëú”çúlëadÛÈö^aÀVe¡q>ðzîîùçNëè<êk~FƒNí\{רµ…6ÝÑ{Ñëy8žò®`²žÉø¾gão@MkêïZræØ¤vîEôv÷XSë²ï|c ìXKÏ€5ñy^Û–Áq'Ørž Öœ¿Á¹4çµ"n÷ã•ÞU ~vý±ï:~•|mM–y][­Wó­?|èxfýx”w=<;ñáç¨g˜ëfh¬Ø‚î˜{¦;tkcr«6<§,KÎä[{äÐy~’i.Ÿµ¾êb¿³¾uûž=11'š–54Ÿ©{²ÈÓ ð:—K{šžòÌ"–ÞžîCd[—ÑÜo¼Ãl}’ž¼û©2}†~”¼é¶ãºz|ùÓ£æWïèÀ£îµëü –·ÞÎeô«~¥'j¼{g¿î¯“û^cÛ»Eó¶o¯ÍŸžã=ÝåÁîñÒ»£»G‘m=© {¾‰ŽÅú­ ó »⟠ëõKs¡n=æòUÝü ¿µëo9bõ¾ö|F¾»è:ÆáÖ¢6 ØÙú×ãž;ÔØ&CoÍÏîpcq­ìƒwYÏ1Ûµh=k¾MðWÐád*?ðŒ?=‡»¦WÊsŸ×ï€Ü3 4Ÿ5­ÍÆã¸Ð;atZÿöËéù^>¾Õ*c¾õê»ö¼nÏülÜœqž¡÷¡þ <÷™ý[×7tÖ®­kåD®|÷ ôí÷ûÙøôkðdÁ}_j йÊØ»Ð|ͳÛö±qòì²ÏÏäBã²íÚ3¯ßË€ßmÛ>·gþ_Ýåáåͳ²5¶-úÐù8VÀïA~Çpœ›ÄÕf{txõYìß\7÷ÏÉG×õ³»H,ÄÛš×¾ûÇw Ü;á8\³Ñ— u(õbb1oÁÈ:¯+ú0ç<ýS?×úè “2Η³Ù÷*wαþ/œf8`«™ã…¿8ô ´úaö“Ÿ}Öoý—²‚ÓL¸ê/øµq¢_åˆÍöÂâhÿž|ï>{Ž˜o]Óƒ}ÑÈ S—ÞA€Yb±aøm—µ}¢ƒæÀ½ØïØç;ŸŽ³{lyÏÝë¹ü~ëï@p¿1Ñçw0æ ³¥µ˜.gÁóÒq^õ7µAÆõ«¬å­‰ãBÛ¥Æìyw¢Nätò‚>/¦Ç|b ½° øœ×xžwÍѶN±ôb¶ßaÎÓçŸßÅØŸj\àÿ‹Ðéì¢&Ãû“íŸãêsÎ2§¸vÇÑÙ¼¶~¯‡ïõ¢¡ù!¿¸ª×F–œøv¦W-çØŒmºu-Çœô¹Ô€ ~AÞ¿C[·ñ¿sFbx^˜Ù dE[÷]Qýÿït:˜àÝúTÝÊýd­÷Ããñøú#}ñ‘><ÛÏžôy¾éçõ=eW÷"t¾:Æ´ GÇVžöçô¿þ¥Û1ûW¼ß½ÑÃOó§%Öµ±üõ#ï·g™bYºìcoãø!òåµ~´Å_¬6>0pLùµ³´ñ´&ÕGè(·ó°rÄ$.â‡|cTç׌Ëŵºô‰å›g¿xCbýªfÐOOm5NøŒõ[œ¿ž¶êç¯ç7|âÓN}«_LôiŸ¹GÛÜl‹qÏÚÒOeVÎõDÌÚ«ýÊ^T™æR~ÇÁÂ<›We¬cb¹ñïü]ŸµOê&ÞÕ'å©Yë%.âh\Ê3ŒóÕ¾¸¸(Ãx× íÎ]m*g¼­Síþ“¾q¿ÅÙ5ýãã“eŠam-bm.Æo¬Ê³®31ïÆ­ûÔª¾ì‹ù9¶ó¥ñwé|®¼Ü·ÃÚ4IÅC2÷êRÚ§êýÍϘŠkíCì1Ê•'þ•­ýr}‰§öŠE1mÎÎõõ 9gÞÅP[¯¨5þ¿:¥­qIiç@í¬¼ûJñ¿p*ÕþÚÏÝ×^Q}v¬kò"×Ö®ÝÝÛ÷>³k©sŘ+¯]Ç®¹×³²óyãÿ>ãsB>}}þn=ó•Å7>š»9é§9‹ë®Rlw¾k³ü™=jmv !/áßýX^ÏÌÎI¨±ýòø„»wžæ\Æ¿qU¦1xÈ×¶ñ(ûwäÄG¿©wSú­÷ÆÔ{‡±tÍ7¦%äÄÙsºõ©ÝË·ÔõpùóŒØµŽ/ýÿùøTÃú¥fúÝsVûöÕsŽÖ_ãò.©žûÐګήùÎ3ÇJ¼+‘Ùµ[Ž3Ë«MÖFß’ïjrÅ Kåà7ybP,èWv×ÿb_•{5Þ»‘spóƒ®û¾{ØÖ¡ßÞùvMm=× Þÿßôû.s/iÌ |ü˜‡äÿ‡ægÛ³KÚì>{Qó+í k¯¹Öo[ÏD1òMr寽ݟ‘©ïŽ/i[¬ÿOÛâê8¸éÓu¶>à+Ó÷c«CK½º*« ¾Ý³:W+³ñöì_˜+öwÏ€ÀE=±pÎû>ÔouÌ÷U½õ-6ƨþæåzWÇ7üy6ÀkŒÕ1Ÿ‹×o¨wtó_9m­kuöÐW¿»Æ”]Õµ^«']o?õ*'N΃îm­[©5D¯÷«îkõyÝ;®=ð÷§ßºo>ö;¾þ–üÇÿÊ·ºÖǹÀ÷…‘{xöŸMq¡ï;¢ºü7©¿}ÇÈÃ'k‰Ö·_åô£rÞeüÞ\¡î³Êëo©±·ÖÐ…7ã¾e¼¯Ö¿}ÇÅnׯïd–™ƒ1°ÿ7î•ï¿§ækÛÿ º›åx^•™Ù®7E$)³Äÿ',ÑKYÙr_.%Ûåv vwŸóâñx¼üB/.úå ý5Ô}ç?^ceὺƵ!ý~ØAæ§K~å$d ý2¢ã\9æëÆýê«ó”ߥ_ÿéöîlþ|à™è”3ã”Üo Þ\£ëƺöê—‘Z5g‹}s¶9^þ»Ç>ëudÀjÌòŒA>˜jÛyí²n=Ü¿‹÷ìŸdêk©ù|.} |sU2ÿw±ŸpÀû-óöLë‰ s Yõì?æúq­Ü_¯} ŸQl‹k×òð_§üÀ·¶Ê¯Le•¯ÏÓy_LįíÞAÍ:æ³¹#v䊯öÿ¼öá½½äðçݨlë½µ2_ÆØ½£ÇØZ.žÚYœ%ï'ö¹;™‹éd¿òâ¯mδñ>§[çáWV_ÌÁE}Ô}Í3Ä~í³gýÛ÷õQ,­ÍReÁÜ>©Œ½b.7^ˆXÄ\ã§ÇW<ÔHß§ÞaKçêÔ¿¼ÓÈÝÉÜ–öy¶9Ó~mg¶²Ê-Ns ìöYk»rkgå!ÏÒö€2òkÇܯmFä[Úl}‡Ä]nOöükgÎ=Åžç¢1¹oÞÝ_›%yÖP?õuÒ[•9ű{æ„9÷Kq¶^ŒöÉö©8[ol¹·uQ¦5Ý=I½­³²+ß»ÂýƺþzCÍ?zb4Ž>×è‰Æ¼X\û,E>ïsRrm/ú¼¸£ž—Åà\[‹ÜÍMëÀ³Õ¹˜š£}®Ý¥½N²ð·ð׸ ž?ße”9Å/»ÖõÞƒÕãý‚Ø«/žµís§v7Žê0÷ý®üÕiÿjwGuµõ;ÁþÚ¼ÈSîïkÞûÉ3^ûÿ\û¬É=··Nù*5®;õ6Þ•‘O>}§OÜÍgcglÝÄS_ð½g´¡}È{®Ö×ΡڬßÚ›öå­-ˆZ›‹Æ»½$)‹ýúði,ž=õÈñžyÎ"<ðyê£r«§oÆö«r¬µ[›òj_]yæÓ}žùæÇ½S¾šõéweÖïÆØwêžïÅWÒg}<µâï\î1Öâ6®¾ÓCÞu'Õ¡^æžö%ß Nç¯v¤~_ºWíˆÝ}ŸEµ}×÷=~wf«O<‹i}ØKÞ3ö)û›Ëæ~{È}iñœä˜‹ßx˜×¶Xöãèžçû9¾ï¨çzñ™ŸÅ´s×­‰úÚõ;µqo=­ü~ÇÕ~ã¥Ö­gëýT^v¯ïiÚØ;”qŸ7+²¿6̇½Ê|±W·¾êO²Ž•]=Ö§wbçw¾÷9×úÀw_,ÎkÇoøû}¸õ*–Ê0Ö¯=ØßZŠò·ÓÅ©îú‘¼c7ïb[+³}`ÎÖÆRÏ{ëâ>1ìwŽ2•-Æê;·×›ûÎWþDÈ6§Œýÿ²/[·õq¢•1‡»ß)ÎùMŒôH¿u·†s}Kí¥ºÅ&®Ú;ÝÝ_^÷îbgîsnßôUí¿õSâý€±ßnÝ_ýb»#mù{„ÝíŸÚ>ñNk¿WFÂGcØgjm4gê7oæÚüÖf1!ãûäúU¯ý±5d¸O½ÎûŸr}^-É?Ý×Ý×ÿ’rÞûM°vj‹±}²Ö‡z<7÷]Gžòû;Vsù[ˆy*öÆË¼g©vjÏß0ŠkcÒWõJòƒµ½yÒ±k×óÄÜüz×ú»ö|5çÚ¬/çê´Ç2½/êGbý1{ƺ=­ìò–¬$–﹋”µÆ›è3­Kx^™WŽ$7{å½7÷¿©ô€ l(5«Éôަº?¼^¯ÿÂg?kýåÛø…èËÐ>­v¾ Ÿùg^ã«ÀOh¥›X¬ÿm|£9öúÈܾ}¥ymol.zý×_ç ßXÿpÌŽ™¹}j.ç¸_ßæƒù~å_X«ym ðÍö 5~¯¿Ö¼:m“þØè¸Í_pOQ[ÛqÙ¶sõýÛˆìâ¬]×ÿÒSþር±4•s¿ñÇ×ÇÚTc}ùPòg}Î#ëúï51מ°ÏÐ6.·£Ñ§ø`?Ü{êñx†'w͹Á¸íSûç2\±{~ÉÜçÄk—¿Í!±B+/¹!>žöÁÎkÖÓOî±ëZØgl[×àª?sÇb}¿8€ýEý—;zƺÚkWÑ ¾÷Kã¬|a|Í«c¶îú,vì<ÓÖ·ý楧èÊ_8Î=t7ÿäIJž¯Ö•)8'µe]ÔwgQõuýh®‹˜ÜC¾Ÿ ³¦ÿ u26ëª[ÿùúX³ö} ß7_¯”n;›óîØš½m¿ìsq¾wìÓuçØ¶qíçÚ@fãüÃÎo<£õþ[üîû}2p. ¾­²Ô3ƒ3Œµu#Ï›Û>oÌ_›½Ÿ¶^ì肎ÞÖîwñðÖ¶¾ËÇ»ñÚ÷ðð\çÖõ®ÝöImÔöFïÃÒŒ7;Èç?ÉÚoÀúÀyõ¼¼ïÁõþ}êÙá®óhí*ëóbë3Á½e=|#¿œØGØulÂãýpg~Ùþ3^çÈÕûÈÀ_½eûà–_bòcÙ>9/òfÚT÷æÔÈïÅê±-Ç>yÒ»µsá•¿¸÷dlÃïoÛ÷zÂ2Þw¥M‡ß:®¸§üo½û^ò7ؼgsóõtNÐ3Þ{ð]ñ"_=õzëé{ýÒï<#ç=„ è¿½É ;úbö[¬úÿ®dzÇßÓ¿ìÿøfÛüWløîïŒË¾½ÐëÅ{éµ~Þ€Ô>÷¥u8÷WL>gló© ¶UÝè3Þ÷¤í1šw¹.Ÿy/ð÷øÆæÞóöµ\¾Çß9y_írožöñ¥—|Lßbk­ð‰¾vOù»vãd陯b­µœÿŽ§ç øê´çàSPûÀrðž½Áµ¯,sÉÙ·ò±~ÊÙpؼün>9ŸÞ±Ž­¾”ß4ûi]Õ³>hŽÌ‹¼×öŸ¤Ÿàõh¿˜ªï»gìûìøá+ï”ñúíÔ?Ö×Û”ù•ïÆè\]1º—žh†Ñ÷ïWU¶s¿Œo[»̇=p˵{éÒ·ó€šÙ‡Ë—ÆÒ½UŸ ÞC¼;[Ûv>ͳ‘7 ñBwìÖ7|Ïñ'ÝÙ–·-Û©>¿ù¡Ywc¾ÆÁÕÓ@Ï`¿5È+4âéÛºªà LÏÁk\ïLôø7ÿæmÞÉrŸ÷Þä4n€<÷;øýV„Oƒ~¢ß7oÿNÆ6ùÞÀ¦ÏAëß»~#¹íÿwãwÿã¿z‰µ{i¶Ù§ÞÿÖaÙŽµm›À_âóÛÛgHcmküpN}ŸÔfý3LGkÓý`9|Ø|£ë´ï&ðãã­]ßZpµµšüÓ¶îx^…™ÙT7‡„„ Jþÿ;C‰[¢tä;<´l÷æÓíö2w^<C/¿ÒO_é—kLŸöç‹Vÿ÷K§6%eúi áSô~lWx'ZV_̵[kÛ1k$oëbkàÔ–¨ëäžê/¯TL­+î„â0Æ]cö+9D¾gÝ®CÇ_Ý;ŒÜƒÕu7?=óäõž)g×vç¯ÿîI‰ñ—Ç÷;ÕÔû¶ûHŸðöÌì\ô©s1¿gˆzí;ÖÏîm÷âb…¬WýÕoõNüS«ÃÙ«ž1Ô¾ºw~{öʳFó’º'Ÿže¶ÅpÂyÏÃo.½Wlcù­bZŸ¬ïê¤wB ›¿äšu.©o§â-‰Óz•<ß×'Äš›‹Ú‰·ùíÞ¾Õ)õ\Uw鮯;wûÞ§êUç„ai÷ÙÍ —¹«Lû¿®¾û¶~9Nõ¶¾7†Î×u(õ~¬9“w××ý®ýéý_cä|wã^¼Ö~[¿â‘ÌŸ¹ê|µÓ·w›¿°ë=·káüúeÝ”mþåu16WðÜÞõãž\ßÜ͹¸V·cs+¯ýæ©ö‹}öß<É«¬˜Ô)Áw 6ö¶øëì<«'œoÞ7¶‹ËùÊkœäÖ­soçD.¶S èûŸŒ‘÷½ÿ„{ヰs1´U.­Sî9§ô&ÕO}Ñ/vç¶å­Ÿ{]ïªý„çΧw%ý­AñxƬÆ®åž%ʵùÅÑzª¬¸–Šw¿ÖÆþžÿð»ЮosX[¨˜ksŠÛîSL~/h ÎÛXi7ïlƧó¬ó˜+ì{'/æž!~Gú^3»¿õ_ðvŽ“¾x‘Q?Ú™‡=/k³ýåu,fɳ™~ßûë«<ô{º;^;.®Õ—ò­÷;›¾SÍõ~ Ù5xF›·’gƒãÖpeýö·gªï{ÆÌµ>ïrµãê™7I¾¾÷·À)âl}«§OdÝóòÝ/÷ÉŽ=ƒðÕoâ']sEŸü9Þ8:ö»tÏvmlíožõåo|uÛÿ‘mû;gu=×Äzò±gÃê©+–b¢6Nû·µ[ZÞæï”÷;_K›+ß/]ou¬3±ö7²z›Ïú÷Û8rë«Ø{H½Ð3Ï}¯âu(v}¢¿kSÿúx&‡œCŸæÇ¾±¸6ðúVÊ‘çuQÙæCÛS]5?Õ)ß–ëÚ=¾:ún¾º~ËÖx6æÚ÷ÿªÅð,•¯oÞ8ê#kMÀoßù0Oÿf¼sËó7 ýÿ"/ý÷n½Û¯Å ¹½³ øê¸ê¯Øù‡sR×î™î¿Æ¥\{ÿZû’¸Ø»Êhûmcm.;í×Îÿ‘ƒãƶ*x^…™Én1 íìû‚$· ÿÿ™qSH¡ ‰„$Šj6)J??><<¼x’ÇK^=ÉËK¦­ùé6fn²>ëþ\ºõÁaÝÚ7šÇÇ«~ó›³íüÑ·_sFÞ]­çlûõáŸ_°j?ÿÕÏvØ^çõ“ÒC±áB>øøý(ý[­_êÓã÷W‹Ùcƒ}ÛO—Ýúøö¾ƒsòê#æT[û"_`ÃË:dùA¿õ`xÍIðÿùj]Ÿ•»ýC\§ŽíľՃC.|6lGßþ¾Ißù‰kÕg®¬!wæØXÀö9\]6wØS³•óÑ:†x³3·;?Æ‚#Üê›Þäl÷cî78N¦ßZ¸Â ù~éæ»<'Üq“ù*?ü8''×LØúlk^õ»Ö{ŽŽÜ4ÿ^7áŒ{'Ü?`nŽ=býrz:¿Ë'k¨5ûôž—ßéÞZÎñÍþ®ïweqlŒ8~ÄgÏl¹–óÄ5jlæ›ûqþrÙ`o;ô`›¹ímËœš¿Ýä‰wüÐ7GÏ1vL‹yxpªc¹Ã[ÎKûóêSðî9íZó«0G>ÈçĹÆ-zîlœ§ñäßxwžù4îúê˜ÝôØ»_ᎆ¹[†Gì¶Áû‹óö»:¦Ï9c}×:.l¹7 oÚì9çå…mψ} »SØ?rQðÀ>Ýe^g}ïv„Ú®Mm=vìèO<ö]AŸzwLàôý÷Ù]¿gÙ8|›”Ø]gáœ8_>ù~0ëzFX×–9ºåûqöþþ°0׺sŒ×èÚ;¼;1c;'훇¹ ¼ƒÄÐyðÝæ¾q¼Æ6|û­ï3`>›õÔK}ÚÖ÷®ãÜxítþÎ0ξ5¬¿Þ1抮6›ëÝ /öÕ8`¡+7ÄoCó`ÄÝõÖqÇ›ÃÝË ‹ñY/ÖI×}¶ù2¯tÅaÝÎ÷[×B¿=àO}—7ŸÙw÷½o¸5þŠï\¯Eç8éûÞ/?ô«kÇ:ñ}pú;͘æ8ñ»Óûßr‡Ï1†GùøÌ¶¾ÑÕ¿ÅwÑÉ<ót¾ÑÙ¦Ò¸,þÎç»Çç¥ö'¬r27ð‡Ùu¶«¾àVŒIóæBçßylS<æ{OVϘ¸ÛÇÆqtß&«YcznÂúSŽáηŸ9Wîâœø½«~ûf⫹÷™å÷ˆâ±Þsþ–sŒÌ _þ­Àù™½ù°~{16~ï(û<å’9óºû^Óù4WpŠ9Nõ}‡ïïH0À^ëÓv¿¬ÛÙºYk¿w{c|bvÜ«ñÍóÑ߸þ'=·Ž©5É<}Ï›un§?ågâ\ßíÇt>ËõIn‡¶äÿ݆_êÖB¬'ë¯Øã³÷öåo,Ûä”#Æw9rß\N{Âïe=+õu¶Mûv\´õÏx-6ü3?>;Æ+¦ãߨu€0þ-Ý©îŸw®çÊ­¹µ6Œ±ïBb…Ssuçâ3€Î뉽-\Z¿´ÏUÆÆó|…œ€õ?Lp“ÇPÿŽƒØV—Ó37ÿ®7b%ïÎÎQyööƒÝô~kýž—ßÉ7Ï›ÖsyöÛζ§3~÷†0®þdC¿~ïjž=Yœ+ï±xû6v½CŒ…­¹•焜S'>;qm÷¸-6Ô+¼lç=Ý>û.rhù;uýËÆi9q^û-û®x^™ÉÎEÇ`6³ >XH\xÿW„:äàSÕ/©®Ê}«¬žžw¯×ëÝ_d½¸÷Ùõ/|ùìYKc ü^àó”;Ù*þÛ×g½â‘Uø)üØe­LýE^ù á“´µOqß=xän~ýЀo\ùûÜusézóÄ^zc«>àç¬Cžê¿ù°ùh ¨ÉÒ­I}8­íM=õiq€}Uãr}Ó Üê'ßÊ Ôvã¶Ÿd6¯ÖËüQ—Õ]Kû!ôövmUÖþ+øþÁW~y ­÷æµ²ê:é=Ùà UöCŸoõcy{óÏó÷ç ´÷qóß>¨®b÷Ö7âW®|'>ó%ó½úœOúäY«Ú± õñœøþ|èÚ\¿OûÚXOê¤Ý¥­¡ýU>÷ÍŸki=#樺kóÖ®é{óàsuÖõ•Þ>:åžû‰|·Ÿ—çä›°çcùNkžõ•8åÙÜŸl.­{€+qŸ²;÷9[ê°fž§òYgóT>½>Û@Ö»bóᓚ@:«síÕ çMÜÆ}Ê›9Ä+W{=Kédÿ;§*ÛwÑú¡ÍÍ)ଷ÷Í)žÎðúÖýÒN`Ý<ï+§ß¯¡·.úK,Öz{´¼›ëƵ¸Í—8×ú^ÜoY#Û¾¾ÙBž9âÙ!¿êäÙ3e^¼OÚßÕg?ÈïÜSÏß1ô½sßWhMôckОÇÞi6H·xaïÏå5î›|yô­ç hÜ«»ùw½¿ZãöAõé·ýÒóV õMÝêòœwš¿ÔŸçé7¬scmSsx«­{íÔŸÿ  ÇYQ°wúBgcõ»çyªÁÒo:ûëy⋼ëÇÿÅ5O'?šsl²÷Î×ú Ãã|©^ãP‡k÷=×êäî_ôt&¹VÿæO_›{¡ïT'«ge‹¿Ñý¶Ð_ã5Îúº¼ö%àÜ/OcÜÙÓo%…å+T§ïºu©¬ëưzúìÁÆ¿öNï3ë‹sît~Öfý]Þέۜ¹Áé<[Ë•Ú þî3ÞêôÞ>ÝÑ«³wýè¾ï='zÏÚ©o´ÑyÉSO2òRG×›³õ¹°´õ¡ºj¿ß_›¿òpfnýY°–'š°~öü"W»µµ9cßÞj»sçV÷Îß+¥›Ïš½ªмۼ;ÄÛ³ì™臧ßòåÑ_e»^¨_òð› ݽߪ‡à*¿>7v€³~cä¹ß‘û½ÌgÏ׿ù´. ¯gEÞòkK¾ú*›r]·^õe¿ò^^>{´¾¬O¥±¦^ÛÛ[¯¾ÃÞþ[)@·?W_mõ¼7ŽœèÕ±~-?´ÎÄåq­Ž½÷úèt.j¿ßæÙÛs[wöÍ x¿A«ïÆ_ž·òç<öŽªìö×I_ï÷}ÿ­Ÿkã„|Gí·†Õ¹ÏêÓÿêÜž(¯tg%´öweðÉ[o÷ÖâÛÆ½ç è½p¢KkÝO}’O½ÕYŸû¾}²uó¥ïŠðôn¯ì;cõIžöYg—§Ð¸öü–§gl¿ùÕ8k޾õO^õù¾¯pòáýö«­®ÑU}]3G¬Ûúê{‘4ý÷ÚMüx^…˜ÙG /K ²HòÂÿ%iJ”J=7Vo^Žínwϼ|</¾Ó«ïôúêܽTûëµþSÖá)¿ûÖùÛ57=µg¶êúåja|ð¬ÿóÕN÷Úw’_ûV}l0þtÍÁ¾úpÂÖyëþpÃWÝèk\æwuVÖz“÷â'vÈþ)>âktM9l-ÞÆÃ˜üζsa¬'üØ2Fh9±=Û¥o¼µ3,w~ZÞñ¿uwý¿óV½ýu˜ƒð¯¸ Ž¡¹ç ÔöI–¹ù?§§LÝã?Ôsñ9Vµò^Öîjú7ðsœ;xmƒ=lÔAä9›Æ÷ùšC¿×‰]ñBèî>,-ŸkwF‹=:˜ó<;ä= qnŒÞê«NÎÛç|>mÓõ‡:Ïÿ‘ÃÆ['=¯'²õçDÝ«ë;—Õ…Œ‡­õÕО¦=a Ì)÷­ÙÈ:?ôÙg¬›Ÿv¸×¶®øŒ›°áþÚ/W]œòz®kk9só³5ª¶MÃë³þLŽþîvÇØsÔŽÚ²_ãeÎ:&òÈœõ2ç|8ï¶M\àé:Äþ°~¹é Žz}âùí!ì®~2îÖpËvŒÜÞ‘¬o\ží‘“NÓ¿W똺E¿ÛÖììMÉLð×îè¿Kn4±éœzOÕ¦ý³ïË:V{ËÓÝ{‰Øw¾:ñ»9‚xlÞuýðó]¿4Y×%ôCû}ê›–|éuê›ün(ÇÞ·ïÞêô93>ÌW–^û«=ö§{ 1Øx5šñø¼§Oôû%7\~+Y7x×/FóЯåÿ¾Ö;ï±å×ïw`íA«q¬îÜgcâ3ýø^~ð-NðsîÍ_9èTO=öÜ]l]Yó],k=;§úÀZï©“ýÎÓNu’\âCÉy7Q—Á[Ì›7~ûéÖqæð~˜Š›oQã²=úw9;é.¯õœtØ'|Ž÷|fÝyáËbr:#–³ ¶<ï8øí¹¶ºÓæ¿~û¼›{äÓwEu‚yvÇßœÖîèÙ7±óƒoÎ!qfÞß­¬[ØïÞÈÒ/¨wˆmÎŒßv膗üVONïqë-†â‚ðsôU}tÝ{> ü4OiwÌÖœ“ê"è\Ûss‡aï¾µØÀÿñê³môÛw:ŠkgÝöG}³šìŸylËkΟçˆIõXG÷ý݃ìåÅÀzÀ±ø:^§}XÚÞ%Îððÿ£¹áØö}f,¦†åü`µ¾î?æíW××òyÔRîƒvZ¯½çà_зø ·qšÌõkÔzßÉמ›­»ÞµfY–}„Æk¾ÖÍ»}9ò}‚ÝŸÏ¿õŽ_‘ç¿/:îÞN#ÖÈ™ß0Ų–œl­˜Œßò&b³µæßoÛ‘kMóÎþ7ÕÖ³ü—¾÷w³õKãJK.ˆ‡×=Þ7õèÙ{9ƾË×ü56öÃ|í÷œ˜xîeâcYÆ|'2&ÖÆRY¾Ñï½OqÓbkmeüo…uÛÅ2öÙ>´|òjyëÀ7Ïù½7ÄZÎR}uýé{Õ6Ö6ß&¯ÕgxøögÞñ›mêŠûÕ9îadùŸ¹5ßCõÃÿ¶°ßX²æqy ï|©,ä8°ÖýgŸks¼>#Å:Ú÷Hw}æ‰ ;Íÿ©ýëñÂÅq|/îx2mó$ïÆâ·­ñZ<¯å£v<¿ó±~sÁxv½çœÉ­“_Ë#‡úÈ#[~å>]íâĦyºßÚdZ+oËx;®7Û¨s¯ ð¾Zï½s@Ÿïéì<Ãö̾¼Öø½Öz+ƹ9ŸýñÃ'{?;_5Gn«ÿ·ÖáZÎ]ï[üZϮsâvß:lþzÍWfpw_{}kÎñ›_ Ù6g‘±ka`}säÏú“·/îdË…¹ÅY_¯Áûf=û³}w?yžœrÇø®¶çžþrÓZªî°;¿|Ó‘sùÁþg²zÕ\kCyºVNß—­õ–síŸ8ÃÓz^ãîÿÎcêʶ°ƒžÏ!²´È5n£Í½~ÜâÏgŶ›ŸoÛµ¾[®½'‹¾sUÛ¬›o=ä˜ï÷n2|ë7öù·Ïeû¹;C#gÿìÇìpg¶Îç‹\œê¶þàXÌnkcy™îÝï l;§5Æ'ß|s‘ó®%¶ÞŸÃéÛèñx{œ¿Öªm cÀïævŸa»6ëïdÓçŽ{×ë¶g]ó¬Nχm¹oÞìsmî¼â—õƘo-Á‡ö”+ûlÿôα̉ï¶5¹å}pâlÍõw v{N‡®9ì’{rÂx­çÖîMF-<©°oââ˜þ¸y å+2Öm ØŽk„Ø+㜟ޞÈn?<î½vâT»µ‰Ç@îÈ{9¯=wÆÜæd}î}î¿Ç©£áî,ðNÂoUë˜ÏÝ÷Û²pqธÃþIÏ1có¡®ïÍÓÚÅ—÷bu…íÞ!EsR8–Áï—ÊXÖ܃ki­¿e~o"ï·îjœº«ïýVÚ¼sjŸŽŸý4¿ò¢å7’÷bkÖ/xwt4/Î æ»u¾yƒóQ=ó\Üýí¶†MÞbØ£½S¾ÞÅ;§¬÷;ß¼Xß2æfytþÕøTÛÖµ æË£0çÚ·.¹pžœsd«CŸúØ»guì:¤åïð´l8§¶kÙæÚïªS°k¾ö‡mm×ß­»œÔWùÞ°®w£ò§3Ášï\ß';àÙzÿþf»sæÔüÖîÿát¯Zξ«[l=-̸NZ3–ã]Ð< ×¾QyÆì«õ­CQçãD®åLÂËy*—½U7‡ßÖ{¹”§åª·7*œ/ïp¾•¬ñÿ/ËÖö°;šØvvÆ›¸/s›õÎmO›Óî¿•œ[Ö‰¥µ² ÇÞ5¶GÛj¿EØ;ÇoÙŽë>È-­¡œ2&÷Í•}úŽ4Ïrò|ïÒµüÖ©Nõ點œÇjyü¼æ½ãÈÁæ©%ßÁÈúüâ×¹ûré͵h? ù¶×>sä~ãgo¾æ¥ºý{ÎøÚV¹Õù eÝ­¹3Í¿]c×cÏÿŸ³ÖïÞÒYUÝÞÞÞ>ÿH>Ògé“ô©h럵þFû“g^o#kóѵþ°-Wü¯_{£/"Wû¶9ŒÅXÞh<Ûüþµž-ä.]¯Ÿì£7_iŸ¸gÃ>Ú—+¯_fßùÇê#sááÓxËçSîIÎl£ök‹õ·šÏöd± ¶õlÛ6–ö8ÕÅNkgjݶ^ý§‹Þp[#ø=ŸW^œã'_.½Qãµ/¥éΖóh\Ÿ¿Ñw¯}óŒÍœÚàû|bþû‹·¹mƒ ï·¿ÏÁäéµÚÄŽý-5FÓö¨c}·LõL¾ç æþе}¸ñªûwk4²¶·õp½æ<âûõ“½Ñd×C•»i|z›àÕ‡¸è6hg¾û¨9fß1«2gܵ°NkõD>Û–­/O>¢3>÷ùÚ|¹fM.¬óãkNÞd›ev–í6ì´ÞÄVÏ‘ñ½ö}\BÖ:¾FûáxçÃxÃåùpå¸&{Õx|ΫÏðèêIð+clÈ5þUkxWLÃk¯-F|ÜÚgÍ÷¾ÇÉÌzírZÿÙǶig\?åŒbâó%ç¬?äîçÖ¸ØbÍïø›3ȶ|®ë ù»l#»s…Íë 7.úÛXömkÎöƒÊz}ÉM†\{>r|Õu Ý_Yû=”Ø«<ßÄËšØã³âzmô»‹{ö7òܯ}dë'Ôý+/µÉºýc;Æ™/å³®}ƒyíoûZ_|>­Ïz=´ñêa°»_üæÊrÐdžrÈYx¯ï+ÄóÊ2•ÏçïªÇÑjãØ¿¹ï¨ý4òóÔïJÕÓ#gøk9ãnÏ÷bs÷žÍÊ[Ïwˆ÷9‹Ãà¾äÜãøÉ3»uÜ;ú­]eMèÛòÁ»°{'m¤[÷{ÊúÛw½.Ÿ« ñÝ3¾Ï"xððÉsÛù»ÝräóÒõ»gößlm$_m³²`ò½ìoš;ÎÚaÜ=¯?½ý“«öûÊñ…Çh»Üì[î=,÷ÛÕ÷ÿ‡zï]öyŽ!c^×älû>_`“³÷r8=žËOrWÏÚ—úõ´ï{¢üâÛþx®{ÕŸÎâA׿ ×>¼°¸“··z€‰LãòzröÝ¿[Õßòg§ß²ðlÏ¿Yø¼€ë¾ñ{Ðöz׃Ýo,ë=Qù¬Á*ÿ’å}ó=Ù÷hzÎ×FÇR>ÔwõÑ/¯±5DÞù³}¯Ÿöçg²Ë7Ï6îßb\çÐs丳àÓß×s½ënã{wzë¥ÍÉieG=[&|zï\£;ºjÐÞEÎöÈ-s0Ý'ð/?·Ç9èóDZ[wxÔ®XÌ]ÓÆV½' ×u¾ø½æª_}dí:ñì®ìy¿÷7¸Õyâü<^ßÍŒáy¿E¯x‘CÆ5)nŸ OßE&bq.}>ŒÇï@[ãÓd¿õ®<0߈g°w~0ŽçwC߯Þý‹wœý³OÌÿ‹ŒëUzê¿­Û§ö×Ô÷ö&üÖ§8Pïõbë‰öîjt{G=¿ÍYß½:j?á#ñ6gý›Y±ÐiŒìó>0öb± |7&þ¢oŒê“üB¦w­÷7ΗæÁöm>òîŸÍý Õým~ÙÜhýúbÜÖb#ï(ð[› ÓÿX÷/äàQx^˜éŽV7¿@ !@%Rž€÷¨¤[Jåà;Ì–ív/§û.OÇãÕÐÓŒ¥wÙ{=:¿\£$z;üî-igåžÓ)Þ7£[ßûÕù-|¨q4Öò–ÏXòĸ9QV¿>~ôYbg¿öOôå’Ãþ™CÚ‚ô­œqlÌK [oøÌÿºÖï/™â$¾Ú[ÚZAöXãWqˆYŸõ±kó÷ùÒm,õ½¾:W¯¹Y™]rä59r¿ø«[úó’Õù`n^jÇõö;ý-ž•ý™ÿíKy¯9\[æ™ye˜Û/íCi׋£q‹ë¯á3n?@ÿ·ÁþúYŸ;ÒO̱³g òœ)_,Í£#öÄàR|ø1ê¸oìÞ‡kÔŸgrõë‡ùæë%ôÇã?[Û’¼Ú/þÊÚ»ò›³’ûÍ™vÉÙ§¬·ÆâÑO1˜Ïŵx×fÏëò‹cõ zÀ:·?wרÔ.ÄÁx¼v¤“ìê­Tüæjõ×Neœ« Õ&qý¹æomïÜ;÷%²‹Í3S|Ž•]½õ£^÷¹÷VoÇúä ôܯõîpœä˜›Ÿå¯]Kž÷|Ï)óõU;ê)»ûõ×8ÛóÛ¿ò|G‘ÇýPÙöšrÔ¾u+­ýÕõ]²üê1¿Ãê¸~|gš#ûÔZ(ÓÜßÔýv§û¶¾¸7Í£gT?w˜œk·8[Ó•Y[¼»¯^uʳæÔfÏ‹y8õõ©·ÈùžÏꨧ½ö•µß¸8ò<§.öY_mTþNwýœøµ×ú˜Ó“Sþx¯€§îÆé|ñ÷; vOcóT;Ź÷Nß;ÛØðYßÜSNßúç[¹}@tÿ”£Òé^j<}—Ù:6—Žèè“sÁè7ueŠiï‰j«ù<ÉîÞ>WNÔïÚê‹ymîüħv¶ß̃öÙ__Ú³O\/.t¹/Ìñø=ZyÏlëhïõ<ƒóž'FûK;•ïØ~eguÀż5B¯kïUcÒ·=¦\}—ú½Ø*¿¶ŠËøWnýçqöÌVïÃÚVO™æÝû\ÿõã70üâs®Öôô=ËèíûGmo/@>wÔ“o,ÕÙçý¢ýâñŒ¡oüÍŸøÑoõµ©\ï–}?ß®·e}1ïó¥çSÝÓ¹>ÅU=ŸðÛÓ‹÷%„Nÿ‘6ç͉ã~9wÍ¿ÆÖ½57÷®ûì«/ûQ;ícÿÊ;ÕºøôÑ{¿ûõßoÂú3õòýTߕџçfÿƒ çÝÒ»­þ6†Ö’ºŒÆê9ê^{·wXÌ£5Zßå9oïX¹íaI¼í‘âhß´j³ÔçÍ]>«/¯µ–èuüõŒÖ¿6Ê3½g»Ï?æ§;µóõÅZÝÞõÕ½>ï›ó“>ã>ïk¯~ μ¼ò­±ÊgÞïÅbpý}ä+a³øÔÃ_ï”ÓsB{§»§g¤öÕcÏñ[žwyæ¯Nw+Ô÷ºò[ãe}ggãØ~ÍŸ˜åm8W{vŒNd°Ë<œb¶ø]+Ï·á×úòµNšû“OË_]æ¼þ:'ôÇÕ‚eœÍÅúh¿çXÛò¸O›ÇÆ¥¶Õ®úW^ÇæÚ}Uòþƒ–3UÿZÆÆ˜1ÿÏ5fû¥¾n\¿®¯M›ùïdJ›CeŒC±kgçÕÕøÈS]gÝY<¨wïúë¥5åÝ`}{oÿÚ ¾S}A`!vc°òæ»ò`Š[Ùµ±±ØÜWOëc1Œ‹²‹Uù“Õi•¯²¬•û'ûµÙ½EN8¯V¶míw¯0æÎ1§Œµ±Xµâ]bŽ<7Ê¿±Û¼Ù*g]@ž?‹ÇØ,vuWÆ~ï™ÊjãÚÎÝT¾Ö‡~€©\ψò¸o”mL }vMyçö-NùjoÉ7ë¾-¶Ö:6‡â2Ö߯zqîð—ÚȨeÛªW]mWçI¶6¸Fm7f§x+[{¥Ó]¸ãµ¯k•¡Om5ÚѬÜþy6ïûÑxÓùÅ1&ŽÍý¾Ù·kcF-WO±mù&éšo}ó\»îúòÛ:oŸü\ªlul[2Þ¶»¾ùƒô·t§cqÛ×zé™àùÏå'âíþY¿×fú§3öû¯íÎòìbý”£­'ÈœÒï7uóN«öª~Ówïî·ÀêgÞ7Q󨏒KïHßV½ùqþÔWWc#¶vÕçÆB9úØÑs©X§|¶¿ûÌ7CùN²k?ýú]žú°ø®õ7yXëûÔómõ§zÿ­Œãæ}ýì|õwÏã»Üï~]žó7“½iÝ_y”Ùš/ô5ò´èÜ;Š>s`~ºÆÎ{ï—Ö»xã·ù低û»Õ);÷l\÷–ø+'õw¤¾§o|[útеòýÞ,ÖÚ²cy™?á¯ÌÉ?÷ÕiÍ:ª®öÚ-îê¶öŒä^¦ßs®øPßÿ­ùµycAl—×I¾¿äYLó}Ú¡Íòô;|ëX^íªýwwÄÖ—ß›ç¾k{þKõ˹¾ãÚï[g2ÿ^}xúÆ.Äý‚߬yÞë‡òÐú£þÆâÜO½®Y¿Ú'^qÍÛÖDßƨ1álT–ú©]%ãU{íÓšãQ±j<´Wžêu®ºÊ YKòïzqºÖº½£ÆMÿ¶¦ m®íÄTÅÛ½lÜëóÉwyWwyµ­6.ÄûŽ5ë³¼¥ó§˜ö7„µãôݳ<ΟÖ$mÙ5÷ªu&_m·í™d]WoϺÕóŒNç¶viKÏ#Úî eמ®ùæØøŸx7VŽ»ßå%ÿÞç3ínî ã¸çGq%~{kïAõT_[yzþëÚ#yÎko±8KµqýaM»öl^;;^¿Ål»þ.ÆæªÄ¾Òo×·_,ûë_ùýŸgõ‰küœVw>ZêÝßä×ׯyß2ÍÿIwÇæY;Ö~û‹ávÿøêjx^…™É®\EÆ`0£ŒØ±@âÿÿ‘wD‡ å5‹TUå<Õp»?¼½½}x‡ïðÍ;|ûZ3~z‡ï^ãèƒá‡ózôÉüð‡ÿ^st,ûËK~sð[ƒ3üôöŸŸÓ[Ÿí vÌc€ÿÉŽõÌÿóÁ_Ý?~…Çú¾ÚÆæ³3ÚæðÕÇ® Ë­}#G|jÞܬVà]CóÖwó´‡L»t­ÞøæÜàÿÖ{ù±Û„ßòæŽ<Ãg¬—¸è¿†Æ|6¨¡{x95Ïæ‡±û€Ú4@ë…Þæ§ù0­ëÁì¯Nл'/Ëš‡\Ò«Wî*3`OckÌÈõäÇuV|yÑí‹eF7ÎÀÞ4ÏÕgØjzsqép\î#ç ¿|.c‹~²ÌÎéò>¼À½e;Ï‹×ô}m¿IÆõªŒ×›/ÿøàËužVÞ=ŠÃ-Î7xÆúµž¾¹,ßöZý›MèƒÙÌ¡µß®ãìÛo×í)vƒc¬ÏàÌÍ|ßùµ1øãE#×õe´ÅU¿é Ÿg—®äcõªßó™w4ìA· ÷÷æõ;Öo0Þy„Æèí¥«Ö_;}-nÇZjÃwTûdy?(Ï€|üæ×¹ OqÔŽ»²à©gãdý$Ïœw¢mn~ùÿYóÚLW}`œnŸíöÛùc¿Ønó ÌÛ(Ý€>ïûn^¿ûÙK¦_rÌ9º—ˆ©2ÜûÀðžÓÈ‘CÖW¿×®mC·Ž³³Ñ¹FÎë~3 “3½ç <ãŸ.ô9ÖúZùÁöùx]?ûæ]ò¾ÓJ¿pö«9fœkhYçðf_66ÏÈ´—ª×3¨rÕYè;¾¼[óÞ%þÁßâZøÝÕþdoÆÇ;ÞöÑï|ÙŸúvÑ—§á[¯¯ék>}÷ûÉ×Wx¹‹ÚÇöÉú.ÝØ.zp?xë]ºÀóæC^ú7ÖwëÚÚçµñÄ ­qôÖèä ~b¬îêY—o‹æëšón5Î{Åý`yŸ•õ—ÑöÑÙþ"†ž­Ìy_Áƒ®òY—ý7Ý2ø6øëµ®ÞËŸ÷8ýc]£ó¾‚ßìSëØ{Ø6ÉõÖãC—s¶¦‡ÁŸEðcßÀ{i<ÄXü݈­Æ¹‘ý@^/{ægÞþp^.=Íã“,±TéÕíXÏ¥}9C½× ]¶¨›}r [dêëd^tѯÖ{»xç£~v&—^mʇö‚÷é¼!›x:÷wr£]ùhœ¦¡§{¢qÌo~1¾|½“±—n½Îøáxë´ õ¯4ӛ꽹ý†Þ•þ´|î¡Ã±pgÐ#æÛÈû?ë¿{À4Ç·Ñߌè1ß›‹¯8üؼ=bžÚ¦Æ@û9îÓü½ÍyÝè³Ö¼Ø}Ê¥Áßë—¾Á•ƒ øÛ¨ü͉ó y×ð)_['ëòWÇÅã>3~~R?p>Cœt¯‡÷7^ã¾ògû®“ïãˆÚæWlÀÞìÑíëÊ5v¿.>ÿgè~¶,ôžþöoºõìwSjáßøËWÛã·nŸ-ÿ'[ß“Îǯóå¸ÿh‡|Z÷5§O8§ŸòWèïéåwÿ™6ŸÜöúÆ':õ¾ô_yõz°ß= Ñìü «BÇx^í˜ nÃ0 Ý6½ïãÿomð ƒH!‰ç’¢l'§mÛnÏts¦'­ïvÊÚô"ytOÒË{fÖÑk_¡û7ÑãÀkŸû 6ÖmJ®èeݾ&Šnlr× e%1Ñ·OëNyp6c:wèmŸ‰ÓrdÔ˜Ùzæ¥87fë?9fMŽÆm áÅù$&zø³_×äs×3Ö‰ý×}o» kã2‘oû° ½Ô~z?9Ùø¼C}Â{ìÚWzÞ¼ÎÁge¾×‘QÛöå¸ðÒ7ĉmp:WßÁÉkÛ$ÿìý|à]«îøSýðû]2äöáÿæ«}¤ƒÓ÷§sõÞDwÜÉ–yª3sÛº~ŽÛ±Ðíz„ç{Ÿ™{Í<õ×vé»®ã"Ÿ0:f(µŠdÉ.4½kЉz~ÊÓ3ï˜è´ÏÆ}ÄO¬æ½o—ü:§Ì±q_w¾]W(ýÞçÔ:ðÌó\(ù£3É'ŽÉÞ¹â7DMs6¶³¯>Çðû9 ñ¬Œ{gº?Øã?:ÈÍ7ž?Ùƒ}({bg]Çaý£µû ;p€Å¹P/ËÀÙ5:"tí[îz¶ñÙ‚Á¸§šSú-ú!¿?)ëÙ4Ž5O<ž5Æìú€!1áu¶_ð³&VûÄG×ÒyCî#l°Kìöá\:'רÏÉö¹ÔÜu²?pÑ‹Æç}ÖܵØú=k½èðŒí¾n}b€…ß(ÈX#Ï3˜ºùLì»×Ý?¡þŽl"vê=ÿ.¿sp<ÖÓ¹9F?áÁ÷ß};Ôw ,Ô¼¿'l?ùôY¶,~“OfôàCáQÇ~¦²¶­gÿ¾ åÛ}xÙ“G÷ò®q~!缌çY·ýâ}˯8ðòµ®ãL¸Ãë³Í»“39Â?í‹×q2;VˆïKwLxÝ#œ-9‹ëÂ7ºïûžÒ;Æãš„ø?ÇÏ)c°?»ß=­ÓþúþöÝ0nÈ÷¢Ïp5ÖXc5ÖXc5ÖXcãñО ºx^X[‹U¬‡Q¼/(:,jƒ$j”A1ˆ¢ëƒ¯‹£ÿÿGxŠó§¦¦Ï|.œ—Ýéêêêê>3{ÀËí¼ÚΛí¼ÕÎÒÎ'í|ÖÎçí|ßÎÚÎíüÔÎÏíüÚÎÖÎKño Ç¿×·Ûù²oѱ~Àï>&±ÞAÇ{sAÇý›¸ß ãVxÂz{Žo·ó.ö˜Äûƒï×èØäýç:¤Ä'÷ÌAÞžã+Œ<ÄOÜ{蚟xâÊøŠãþ½Äeý¯ap·pÔÀ¹Õ^å¾ê?ëßCt)ß“vžbè.¿dÞ ]åf]̱`ï]áVþ¨¸§>É[ºÓ9®Øãÿ‚žãÃמÇçLZˆ¯¼Àx¯Ñ9¾ŽÎS3+®ÙËÄL 6 Uy4ÏÂþG|úå†.Ïp>çÔ„?Ê›žÑþXpÔǽI¯øÌPó çµhîÕW×Ky<‡t[q¬cÃè+ùÓgHšp†ˆÁ¸ä¥º³oÎÁkܰ÷„c¨®½ÎVÖá5Üa®WzKXpì‰zá{l6³9~gT³–=¿Ö‹ªŽÔÆ5÷3Þ®S…¼Ó¯ôAÅ[¸³ù“§*M¤Çlÿ÷ßèøüaŽÄ¾Ö[Ÿ³Ê?ÌAÞÂO÷…só˜œM÷Á‚ÎA¼|* Æûl/¨k©´Ú°ßË©¹Þ´Ïwæ¹êùõ¾q»Î+GÕË<Ù?Ö,¾‰­º«ü†î¿™÷ª¤É ŽóI§'gûÿOt툯žðç‘;¨ê©çÕŽ]qÜ Â#>Ãß_«[ï.ª;ï=îVÕΞ©æ¬uÃðªjz€ùì [µÍÞgÚæN©jcn¯oÁ±Ÿòã,ïÚ¬¯òfz‡y„_Íc5WâH~¾ô sVyfþ̜ޫôŸïq'–ãƒ\C¿j‡‰ƒžU®ô\ΙÇz?ªÝà}àOåék~>{G¶Ï }D,òRmôHƨ7Ò0ûðÝ%ÖãäßД—µ°ŽJ£Jb¹öââ©1¹ ‹/°÷Dö«ú¾©vðYÿ˜#ñõ®º`ô‡±Ú1ÒëûÞ$?}ƒVܼnßÙû¿°Ï‘{$1‰çu kÃ~2–º)Ο—誶3½å¯¬Ç÷Jê”wô‚½F³ÁÞ W˜Òñzoð8>Ëš¼×ºç¼W öšÎî8çÀÚÒKúN”Þ‰ïõÙLÞ¾óÿÀ±—9 Ú/7Ø×q†»a+mÎúí>öæûHi·¤Fò@â ;ßkVçdÃ^ÿôW¥½s?ÓÝ{LüÊ¿ù!m„û56µ—.•Îr8~µCª™cÜl>ý9å­4«âµc®Å»ß‰C]f}ݰ¿7„·àè?âøûÙŠ£GÒs©gηÏó?¸Äå]^yõj.ä¡îø^Û fî›íã~åßø{ÇóÿQÉ?×záú¥vîMß ù> ̇èzøûóSÌ{í;Èñ}7?÷ÌŠ#× Ã7ì±ï½ÜuÄ_б]OqÒsÄÊ9Ðýâÿ³prf÷‹võ™Õ%ÞÕþ!&1¤±{â†/G]“ƒÏÑ#ÔóÍÜw8bêî$jÜK®»ëã½Ö7KΦs¤Väy¶W•‹9ìû%mÎxHÎbæ­òm8î‹jÿiÖÈûÿô[š§§Ü·ä÷5NÅÉïYƪçäD>³•¦Ä#Žz$mòeÜÙ“Ex^¥YÛŠ%EŒ‡EQ¼±Štµ¯  ʲÞiчyßk÷ÿ?Âú•ÕgÄz:U‘™‘Yuæ<ðd[ë¶~ÝÖoÛjÛzn[/mëÕm=ÜÖëÛzg[˶>ÙÖO—ýÜ÷âe/÷ðó·õ¹í!æ?è¸Ïoë;÷:öGØñ¿ÚÖ×Ûz¼­ï°cý‚Ž÷v¼Ø1‰Á³ŸÙYžYc?c¾±~æ9±nÕüz^Ÿâˆ­œˆÏ<ƒç™×Ûè8 v,rĹKÎè#Í å@­åÍ;Ïj6$'îǬ%¹¿¶ä½Šãs³òkÿç}å3 û*{àëିŒ#ž|®ª¾¬­açsÌçê¥ú¹GŸ ³]>'=¤Ul~îu%_®+q²nÍüÔ©¡×ྫôγâ^\ÈK3 8/ÄQ¥µfÅYœk1Tï‚c/Wµÿ…£7SËjî(WúF^áL¾6ãö\™'qè5yƒŸ±.ÆöXžwΞQýšõòžòô¦ÜO5‹?ñöu­ÄñwÆŠ±FñçydUý•xâËõMM}žyî ù"µô ™s’–™“j¼ÃˆŸsÁÑ{Ž=«Ù=žØ>S¤g…!Þø§>©z$õQ~‰Çœn°ã>CŸOŽSõ†ûî>=Ý0Ö\½ÙäC÷c»N?gÛµ7Š8hè<(_gU÷®÷sgß+wúa¯š«ªÃc2Ö»¹ò;í¬6ã~™i ¾9§áÈuòRõG•ëlÞyž©Ar?ëAñ^ñà>ô~^pœ§é»äAÞs¿åœÉ<üì-º~/«>ååµ Ë9kû_šÊŸ•òdò¢óËe/÷ð3Ÿ3©;ï{åš8³ùàšäý–¾ñ^âù<Ëøª«ÒèÌŸgoDÆÍw⊺iêš0þCt¾¼ç/½¶b޽Gîù:ËÏû‰<ä÷—êlÃx羂㯸Mýª÷YúoÁ~V缇¸÷沿âB³Ro¯Í{€yœý_ ûÓuôþª|$ì'˜{^s®òŠ×’úøŒ#næÝPãÌús¦ÇßgЏK¯òŒbóïZMîÞiùVsÏø õÅjÎê¦Nª£ê冎£™²`Ï+÷Ò‹ÜŸ±y®ò1ª“Žw‚û9ß~O¹î…™ÉI僆±&ŸõÔpÁ|îx=Ž‘œ0¶æzjL ×3ϺGÎæ§øU_?EÇÍû&甸È:ä¯ÌI;N•Sj”óålžú»²ª3qôù‘ï’*'ÖJÏøLU¯¦+?Ww†°fßш¥;XܩΙ¶Ì÷Oìóªaì½ç+û}Ò0j¬^ÐqTsöÞŠ9—Ù‡®ô­°Y»î÷câ«^ÏKYq䬡×Zå$iý!ŽõS'å&mVÔõóÏ5ñ·Oåç#Æ5³WÄ#sãŒÿuŽê΃Ùƒ®“|:ãÀ½åžôYɽÏ0Ö—÷wΩÿËÕ‚^<—˜ž¿ã KÜä;kÖk #ϯáèÝÄ’GÈ5ßä>»ˆë9ªüžKÞr¾To€k\fÎÉâx/³W¾ÅÜ+×b¦~•'Sß]þK,éêõøŒ'žzþì7×ãF½«·`UËYÞÄ%Öìâ¢úMgV{õbÁï>w§f]Uã#Œ¼Îðæ>Èü|&I÷1âjÞÝáØ‹Ò>gCz˜ú“x•®åYõEÎ׸җš>×ýü-ößÙ+ÿi.dÏþ ¼O4x^X[«E¬Q/AÅ(&º¯ BPNäCQÄ}ßNòÿ„S¬ÅÖÖvïùýœêêêêž9y àéŒ3.3~žñëŒ1ãõoÌxsÆ[3ÞžñÞŒf|4ã“ËŒ/f|9ã«_ÏøfÆw3Ïx†=ö/XñŸñÇŒ¿±æRæ ¾°‰ù-V¼ï±b>AI¼Žó‡X1Ìøo⓯rŸØ?¡Æ'žp¬~VõêœêØsK-ïc«ùöš_u?ŸñÃŒÑkÀ^;ñÉ—XÄP¿«ïkX9 ëlœSƒäÚõ}`ÅÍ³Ò û#îÄs]‹<ßÅÊõ}l¸Ù{çLlêzƒž÷KsIçNܪþôB…ã3Enwù} ö¼÷ªê“4>ù²þ.OrýûùÔ9¹3®ùT½uo^Ðû’õ¦öäãž$¶ï¢wàØ‹Ä\°q¥^9Îq`?ÄÒîY°õ@Ú'ÆYOs_°ÖÏÐ÷–u3GW»ruyrÆ…{†¥‘˜â˜ä|—Ç_aÅàÏSçÓËüŽçèÁõ|ò'öX~”~<ŸtOÉ+òÈ‚-oê¬ï=ëgÝeÚÕ.®üžú¹‡º³ª·:Ïz哪û}íþHÍš´`mÕ=õ猰žçïù²¿¾O…/ÍYå3Ýõ9¿ÂàNðçÚ“kM½¬çù­4érËçòÕ‚ú®é<“ý#fµß:ïûÖÀæÿŠoîMá©wŽ£¿Ÿa=ÄÑÕÞôzs¿wØé9q­0‰G¯ 1ù.Ð çgõJ=¶x¾Dï¿ëùz¯röC½›‰MKçuFªfíæ"7ú’ÿÆzn°í¨äïÜ¥‹üëºTo÷nÎQ§óYÿÔ·k|àsÕùLÚªÞ{èw™óâù£ª71kŽ8ù\ŠÏÀOXz3|ŠZ3ÕË{DØ•ˆG3Gê™Ü½Ïz jNˆ§3üÖgð. ޵úÌлg|RÓìÑ‚ýNÎ÷R5“îkêñ·N§­ôºàXÇ¿Xs¼Bÿ{˜vXæQMª§›SáÉoy_J÷–øÝbÓ y©ŸÂ{ˆ#&5Èßç+ÍÏ|¬|òLÞWùfá7Þsê“w&Ï ìóñ¼´ößÕ™—5iW¨ŸÌ?Ps–>Õ}ž~¯z–¦ó!k{Ž»÷à@Í3{™>îf§óšr1Oæ¨ð‰- „# ÍCêZáˆ'ß}âéooõþZïyÓ 6îÊWåº`_“ï%þÜëâϲ&מcŸ«8jÔí&êDÎ×ø³Ÿþó=´ ög\+ˆïõ9µOÍ•#ïkz| öwçmÍNWÿÀ†§·˜ö—¾ã7üSqwßT; 5«8°.iuV[b÷¬·+Ï“›ÏF7sîÝÜï~gWùXÃÀŠ«Æïø3îÛåÿ¿ó{~˼¹?Õ7oøÜ:_í›{X1r¦œs7O¾¿Îæ)19§Ý¾îüª§òªkM|άvL‡[yP8°Ýaô=k'Wõý‚Ú#•®yGúLI¯_}Í™wüüLbÊgê·ê<ó¨æ|A=gšyÖÎ;ó½žëŸ.W5ßé éí~«ô®ú—s­Ztç×=!\bÞâ|6º½AlâRõ0ylx©·<šòLçw¾IÏîXõË÷ÔG¿_5Vý`/äù Öó¾›ræÉgÁ^ûkv´O<ù3wš×YaJsúÞu#Nbø¬ˆ‡æ%9Pï™×¦÷djýös‘žÍ•Cúå žÕ«~ú¬³ê±º7ÇÀ¦A5 öóêZtï\í³£ù¦–üß½­<ÚE×äéf9§“.8jK-G\ŸúTi qJ>Ý,s¿ø.>›%¯Ûï†{ø›0uÓ ˆgůòÓõšçùÿÍu¯²vÕÝù~àè%í¡3¼n–Ü;ÿÈŸHdx^•XÛŠdEŒ‡EQ¼,*^P´¯°‚dUViQpß|¬õÿ? N'*NÖ™q¡`驊ŒŒŒÌªîžëű^ëÕ±^ë½±ÚXõéX?uë×±~ëf¬?ƺ«õæóoŒõæXoõŽx_ŒõÕXߌõx¬°Çø{ÆèØð_ÀCø î'ذ?ësl1asWŒ±Å!¾ør?ÿÎÏ©“8xü÷±ÇVLÆãÙŸqŒ—y¼]#b5ÌùH«»ø‹£jÙPçŸç”WzÀ9©nÔ•xßbÎ/1ÅExéaŠ›çUá$¿Äk˜9J3ò¼¯nYÇuoUš^pŽ+î/cÇwþàØçŽ#¦ãÉK 3o×äÌ›¿ãØÏÒú]̸îõ±a&×JÛ‡XÏú‚Z4ÌüÉû;Ôšs5'\kéâýUé’yÛçñ]óªg}}‰ ÿlÎuœ×µêC÷áJ×¥ÂÍþ!nö¶ðn0kA®Êûù7×ßç4õÏùæúK#ŸŒ¹Â$wžW½|¯ïÓŒyrݧ\ž^÷ºæ¯\ÏUºÈƒÙóÂËžO­+<泃:ñ3þßù¥ž {½äòJÿGuëØy‰Oö˜êγÜÏØ¯]÷JgùõöÚÈ£ÄËœVyT:‹‹÷dj=/UÿpÖø\L*žî5éwÁº2†òð¹å~I––}¬gØÞ¥~>õSÝÅËgTòJ/{î©åª/ÉÙçu5'cd„§Z]PÏ®[Ìœ³t¿4̽|]—äªÕünØç­0‰ãò•|š=¥š“[•ëÓëÙ*?{Ƀՙ9ÓµËþ¹O½ƒï‹³:w¬g0ï“oÆXájF%¦ôlظj~ŸùQõùG=„É7iÞ ³îŠ£Þ¿ ölG­‰{‚s\qRÝí«8Š‘QoaH Í÷¦÷N•«ÏïŸêá\ªZ¹¦ uŒ|ûul|…CŒ†¹WõŸÌµaÖfuG¦¦ÄP½”Kê%Nš/5b?v¬ûÜõQ÷ÌoGõšãH'½ïμêXù­áÈyÓߣ®‡ú¯cÓÖk*LÝYÃʳÞ7 ûYÕ“X«üVõÔýq6c;Ž>ÉZæ¬~Œú"GbèlÎ÷—ÇÎ9[õ™×H³Üµr:jÍU«|ç:v¥“ænÇ^ƒÔjõ>'>g ¼±ê«Žc¼v¼Š«cÝ¢Æ#׆ãÌë™sb‰_êÉ|Ùë^£U¾g¸«~%wiª¹’~¨â±o]Û¬“ûó‚ºO’/ïB÷{C]§ÕïÒÙk–1Î4¹Ë»É˜òÎËܯ½ŠïóMy)Žö?‹3ÒE¼ó¼sÏÜ틇Øuh˜u¦Vù—˜ª»ß sýÉ­ò‘f?Ïëog9gˆ¯y¬þàÍ8äëZг+=4/ùæc<÷ƒÞOPψŽ5®tÖÕ0÷_~¹`í·Ä®ü ÿ ïÿÌHçK›šŸ}ÏèØ1å÷†ûËçMå‘jn®f ±ˆsŒÌWþâwªê·fy€œ•ûטçPÆSbç{Z|+®âÉZ“Ÿÿ¶G>îéížÎÞ‘§½GS;ϼ˜“ûCø÷÷1ô¨z¸ÒWxâ)¼7±çK­ÉyÃà,l×6uÇÊNU#÷ña®¡ûÊëfïWøä÷ççðŒ+Lð¬<ç1¦‡å]ê ž¥Æ<ó)¦Ö<‡Þâ³ü]r๮·úésrÂÄo<µÇõå>ùV{µœx¶Î} Sã÷0ý©óåMec¥ÿ«Þ§‡ˆ™œäñ; îS=Ê õ•:sò,yä’&O0jù 纪–ô‡8){„§ÌɼQ]ϰÏÉ ×ùz¶é bÿ€c¯eV3Tér©†¶Ï÷†ér&Žö7¬sQ{Ùß*WF®æ¬È«•^¬%ý•Ùì5øÜå´pOØÏ¡°‰«~j~ä_õît¿Oºº?ÒÙ'ñHÞŸªïÔÊëÚ0ßmê}5 ä¨÷¼ëçÚ‘'±ˆq‹Cüøü†Ù'i"ÅÑýÃ߯¼S½£\'æŒêÒÌ“™Õ0jr½äG÷ûH¼Ô)uÏùõÞ§&Úã5é|Ï‚GØg±ûÐß É%uò;“°2ÓO˜ýÊLÏ™ÉLYõš­î ~ÎØû—Øšï ûÚÕqVFˆŸ×ù|†ÿçz\aÎ{5•ÖÔh5®•߃…MLîÏÔÒsp5|®ªž{OÜÇ®au¯¦s¢w¼—«ó+¸Æ™ÕÉgåCÿ¬¡s2³›¸º»$.3WXâÉýÎKµ®úuéž!½èŸQëœØÒÍýéØG9}if_¶7¨ÏÉ3ß5û@-ª÷;ñ„%M7ìgX϶ûgÓëU®±ÏJϹ¬'ýë=`å½Àu£f~GV¯òŽþk8×.ó“½öwªs®Þ‡ÕýÎóìE´h¨õH|÷ºf,kn¨½¨w]ÎÐÊ«¬jØ{Pó³abdTõ¦Ž+ý¼Ï^Ãy­Ä”w6ŒzV3,_ð§Ò­š1å–xõ£ªùH{ÎîÔw„†Úƒº· '=w‰kõyp>Â"'ÇJN•öU¬oÕKrú5f•£U›¸žÑ°ž³ ;{{Â9ß0ß•Þe™ôLžêMâ5ìó65ä~ßÇ=|–g¦¶Ž{‡=G¯™ß‘<ƾæÕ»(ï^®¥gLÕip”ŽÏš¸>Ì÷ÿ_ýL«lO¸†+ ÏË|©'Ô}|ŽÁ±ÂvTå ŸPŸÁ?#sA}ØPë ïÓVù(ìÔ„¸üžN˜žÙ+ö´aÝ/i¼šéô³<"^ªÏ©ŸäÇç¼Kóê}ãç­<™~¯|’zyEØÔ&=BÜÄZiò§ÒWX«ï$œ£2¤òÃ*K+¿eîˉ™úVü+ÎêqÝÇþöËôO¹utÎ3ì3Ü}çglØ÷”º_šù†ã*/+ëª;Àö9îXù7b^cjw”Ô¡¡þÜߟ§?^än ï­æÐ1]× —Þó»±23¼Ú“ýåùš¥›ûý'œ×Ô°×(5ϳ}_å}^Hï爇û”9ìE¹N/åþ†ÑõA—•'ÚÇ=¼7e þ·Í}f‰×³úþÜ3%Ïp/®ðWy’=S­Ù7Íô-öu7óaÍUÎ]šgòÒ¼%îê>F\ÿ|UÕëZz¶­jÈŒ{„ý#m³ŽŠ{êQñm8ÇÊÞ»Æ/éZÕ{…óšzG¿þ´µG`x^X]«%5¬‡EQ\?P4ˆŸ  ʲ¬®rP¼ˆ"û¢¾]ˆþÿá9ÅÔT:sÄ yºIuuuu'sžø~[?në§mý¼­¾­ç¶õü¶^ØÖKÛze[¯oëím½³­÷¶õѶ>ÙÖWÛz„CŒŽqþÅâ,Ï5ìg¿¸žû{ü_·uÃøÂyˆËq>ÞÖç<ˆuÁ1âõm=À9¯pÌI¼.ØñëLŸ÷qäHÜÏ0r&þרcTœ3Î[¨õ¤ÄÿÇÉ¿Â|÷iýçz¯<äøâMžß`Ç–c°nÄ OñÜwŠ'ÞÅ^[å±âÞ1bãe ŒÔÁu½`œûǼå1ž»®Ž%=Ý·®á3Ì9yx­vÌO±k³ê‰Žñ'lò%¶ø¦·¤ó–v·jž}+ÏV:8_ÆàË|5ÓæXª×*?±çàøò‘j(žÔýUqs f?jV¼˜•3=^á¬|íµQzo¦^ôïÕ§šŸÇy¢ºsžd¾Â^õsMLïkêéor%ǧ˜1‰÷ž÷tug3_žW^®çR³ÊËÌç[ϧ&<ç|9ëªxÙCšÍ©çõ55à¼ì˜u}ßqsFdí³V•¯Ò÷ GÎÒꂽN3??4ìüT+¯sÇüPü¼s}ÿ*–k ü«¾'Ö=æšÏk×0ø³Ï=ÿ³\OÇȹ&ž~W_0×ʱ+?kå#Þ YëäUaøyòp§ö«·¨rUŽU¯3Æö\ÿÁè)õ¬×ŸÿÏþöÞÎØÒØ=p¦-µy {N©óÙ¬w}Ä‹}ºÒ:ë->ÊO3¯á¨å*~DZ/4w+m仪7¤‡ãTZx]Ó3ÎÇ5á;Ý=Ó¶õ!ŽóË¿‡ô¾¸`oåƒü†8Ãë8b[ÃñœjÅØÜ›žc,ÇÖ¾Ô:fÈë9›¨?ëê5uÎUMåÿ|Ï1½OvꛣâÜ1û£açæÚ1.cº7åKõŠpŸ]÷‹'ñ[gt_8·ŽY?ÍÝ; {-¼®ÊE{©µf‚ö9¯ô•ë˜ï©†Ù«:ýº¿óÞK\úÀõgéÁ³'ïãJSá—ê˜Þ¹uG1çì¥{Œ<Óç‰×0ceoR»;ìµ$fÃî-σÿ÷Zgêá=«X©‰ú¶c¾›Ü9ˤ·{ÿ‚™cú8kŸXÔålhư¿:n•¿üÎ=ž“~ ñZ¸¶êÝŠ7uà|¬¼A­ÏÞWƒ§óÊÞ` õ9ïå¬'cqÆç=Xùˆ%÷¤ç ìÄè½’8>c}Tù3÷¿qœƒ·z#1”jN>Äh×3Êÿ¯ëÿÅÙcq¯sÍ~ÊY¸š3<›ý(~uMÝŸ©ûª2çn¥cöÓê=±:jßgœÌÁ{Àïñÿ§ò±…«w”ãvìs]u÷ù¢¾qÿ-²â',õ~ê,/匽àèÿŽ9_¿ŽZ“’Æ ÏóðÚð¯êé|{HòɺHKá(?åä5ñžKœŽõŒ!–¾KvLiN,é!ŸHóô¬4•7øv-é{¯™Îéþ¨_>¨µV7OÐÖL¿àzžÂDð»ò!zù/=ï=ðäwÎMÝ?Åa6vš¤oßU ®0…¥zt½åx5÷?­ÝwÅPçÜÜ»Kmxž‹÷e­óÜ×]x5Ö^¯î>”¦®Þš9è5¹ãÍԖꂘ‡]=RGàÀ5ë 3ä¥(6~S^Ô>9R›Î_ôÑý:»'³©á¹Ô‹ûNõéâÛµ±Ô~^ûS³ÎA÷T¾U–ê=3›'î¯aâe>–øy}Rïà0ßoêx߉˟uΓZs/+ߥv=$yÍzÇŒ8èb6·¼V:Cô1ÄUw…×îêŽXëìsŸµ]üŽG[òάÇkõøªã•fËuÈ=ÓÊ]³z­í{µO÷>¥„7óQêøJ{êÅFöCsWxô’÷šÎ27»³®7ú9{/g?;~G1è­×‹Y°ÔŽ+,ÍTÎ_qÌÙ¹Ô¹§ð”Þf^!V~×êb^Ý¹Š‡wfúöÞ ›^¹†µ—ÜÙÇ\IÓ}êýE9+uÞç®÷ó®{†ú×k!LjŽÏéçMõ5_ëÈ3½Ðéíª—ÂÌžÍtLÞôªã‰&\¼žðM~â¦ÿ½¯âÉýãXŽÓͤ™?Ð\¤ }Ïì0¨ÚÒ]à¾ZêˆuŸYÛy†Y’^%Çì¥k-ï…³§ëç3º>»³^[áø¼¢.þÞïµäô¤Žš×¿uî_Îjå^ežýTç^$ÿ×ýà3Ìc0W¨Ólž¥‡·Øô¼|WÀùßê9Ïü+fUÖÛë : ÞQCc¯ö¥'ñƒÏ7ÕÈsñ<O½Ìz?¼=ëê´â\fuH Î<Ÿµ¶ü»þ“¼º ãYí8/<îzM=q'dÎ]¿,M­h¸$å¥Zƒö³7çˆöÂõÃÚg%3³ä«sÌhqŸ(7éÐë×åÄ™sѽ¢º¥WÀ¾ëûp7Gü÷ÁôÜý^Íþ§ÇÁÆKí½ÕYÏ×¹äÜÑ9xÌršÕîêmJ>]/<×Dj¨ó^w]tç™ÛKí½Lo ã>žšåè}»OÏ|&i®ù Á›ÒÖ£:×l­ë\›°¸©U×ÇÔ…ÿ.°Ôqn|]óûb­£?ýw~oèÞ9›ÒWõä=8ÓýÏxÄòûï¦Î9IŠÑibö›y‡»»Àñÿ­»{É5ëü\9¿:¯tq©g»¼.:çú¥¿:«ýìÑçêƒf‘øk†ºîžÔyîû Ͼ\q_ëØ´–y u3Mxkm<¼fú\w=wzêÞk9 ò=!þOë<—éaâ?¬ÝÏ'„é^îx.užW³Y%~×q¦·ÜÛWµp?ÏbŸ¾íæ-XWžZëìWǃ'uuÍÍjrŸß"²wKñ}®]ñOìÄ£–žÿ1ÌM\x^Y]«\E¬‡`Pü"Štj"ˆ"¢$aQ\$ ñA|[<øÿ„Sœ-¦Nž³7^˜—{gª«««{f÷¾ðz_oöõV_ïõõa_÷õ°¯Ö×ç}}Ù××}}Û×w}ýÜ׳¾N}ýÒׯ}ýÖ×ï}½èkéëµ¾îc࿃ŸØÂ|Ü×}ý„OXÄy[œ÷ûú[Ž_aåù × ›¸—¾îaËÓcPâK‹Ï0b}Ñ×÷¨u ¶0už{–ëïGz7lù?ÁŠÍ3•3¾â)~ª±Ž4žÕ,õV. [¾î‡çXñ…}ÆÐC?žá^rX°þ¸Fò¥<ù)öž¤^¬u•›çUåôö~®0•SjæZÉ×Þ3^ƒÿËÏý'LÇ"΂q¾êãÔLz±n3N3>®Wöê9ù,½pä1qži(Î3/˜Ï›ìãÔCõqìÔ¢âëøÉ›¸Ä¬æƒk‘ú:–Ïç©™v [¾dÍ|ÿ~¹îqߤßf:U1oÍåÖ0ê:Ã;cà¥`häþà"gÝØcÎú,=÷Ûú%ÎQ®YÇôﺬ!ñ«Ú%Oáf]ˆw«'2ßj¦Ìú âF¼†õ¬fˆëüòº¯òAåó†}-Å…õ¬¸Ð#®UúlæaÇ&wásVÍê›úI7yn6GìÏ¿‹½?仼Y ]‰Ù°rQÚ«}wñ¥ë‘1«ÙZÕòèä1¨7çÖSÔÞ—wîa?kÙûU¼†mÏ*×ã.uå{r†­Þ}‚­w|+Îk b~‚Z;¿?2‡Êÿ³»”?ÔÊcxmª\¼ÏŽ|F®Ì—¹òýèõʘU^ùNÈþv¿3Or¹u§ý‹}ÌŒ—zJË Wž ïf¸¼?«y’ùõÐÌw®×«Æ¨Þ¥'ý0ÓG˜þ†¯ð„•÷¸û‚û¹—ùUw–ç“:ñ¬z‡çÅ•ûôwùNø³œ¤}«÷€r:cäå5÷zk4¬xê{Çñy¢ó<ã\T+?Ãýé×Éç§{·ª·ë¡9¦žÏ÷£÷Ï“Ë?õåyíg¾^×ÊGé¯Ó‚ùý£z17éZõ½ô幆½ž•×]ÎóY?ylŸo' m…K¼·±Ï¡a‹I,Ÿ§•O¤‰ûͿà ¯ì'žãŸÚŸú»GÔÚd‰WÝ > *¬ G÷—ð‹3wA­‰ð„¥·VÕKÌûÓãŒç¼ù3ë—†mgsüŒZSõ°z¯òœf¸ûŽÚ<žv©¹sv¼'NØßm®mUû†­Æš7³š)÷䑵"'ÎÝ ç‚13UƒÊ?ŸöœÔy²ÿuw7¬¸‰á糦äåwAr¼Õ÷Ëu~aO¸¹O¾d|ñoãšž°¯÷Ì/pÜóÒYßÊ“'lµús½Ò[òù Ÿ¹Íúwã^õ—zÊgÎ ûÙ·>‡+m܇ĦFUéÇ™>ÕwŽŒ¥³~&6qtV³Ž{ÒG³ØU\é—³é(G½qÃ{%}ïùͰg>˜}?¨ºûý\³·ˆå÷¹{ÊõxŒíÌ–·ª8gŒù(½©EÃþ^ÒÕ)kãyùœ¨¼åó³]Ï‘3Ϲ'Ò·>ÞÒtÁW«é}’1ŸØ®ñ„Áóέª•>ÏWßiJ_ÿ+ßOɯÒ8ãÉgÊy§'Ò›šo +?ñQÿþ‰1OÜÏÿR¿Jx^YM«E¬E0(&´?!BPTLTŇèº{0ñÿÿ»˜[tMÍé¹Oô&wººNªÓsožh}}Þ×}ýÔ×Ï}ýÖ×Ú×}½wùl¹|Æ¥¯û}½Ú×k}½Þ׃¾^ö¼Ù×[}½‹mÿlç|Ô×'}}†íÌg}}Ù×W}}qŽxü‚Á…gòá&&±œ'÷®—=þŸñ:XŸ!ob¿ƒ³öˆë Ìù GZœÕ®šgXÔ•0øÌ°ÈëÛ¾¾Ç†÷#ö˜Ò®ê•zëXÉ)ë’FäÓ°íý£§¬í»¾žcÏÇû‘\ˆé5¶¾>Ä›üžbèÇs¼ßª5±É·Òν—u»ïîaè ¼ÇØ{„xŸbã8ëíŠ}nÄOZfͬõ žÌ‡×ì=®ú${Ý©gj™þ‘Ä$OeÌëð3ݳԈg€ãùÒJõyfæažÓ°aŠWòæ¾Jõ°¡Ö%µ§Gœã‚ú,÷JæEž¡&ïãèÅ3\ÕÊg]£¬M¹>›?™£Ôí¦¯_±Ízˆïü…ãR†*î•çÉïmŒÜÏ´Q_Ü+™ýÙ™UÏ¥ Ïþ™ïoq«aú6׉ãû=Ÿé‡*› æŠsŸeîˆÉÌåeß8Wx‡T礦äÉgäó̤ÉóåÞËÌëÜìcêæži8ÎNÏð]r«ZxFr'ž{|Áãw ñäûOöŸ{ô¹×ReÓ35{b6WsEmäka9ïÔ˜XÞ?÷²xè|>?ë·{¹¡ž3ÞƒŠGÕoŸe³w ö[zUZ%nò–‡|$w÷é‚;û  6ó§ÞzÞ¼·Â­ø’gæ:9žé[ÍŠ†}í³{ÁëUòJjÏ稉žSÿ2WÔD9õy絓®Ç#ßoª¾¥Æ®¯sSæÅ+kçóüsJdzy'o&—ÔõÛ÷0Πÿ‰M<Ö¤žpß †é3?ËûAìY~½⸎³9TùA8™Íô“öÍø¨·ª©z×7’0ÓçUŸÜƒwég}òÕühØóa¬¨ß‡ª'~yo{FŒ3r&©/ ƒïzùÈ9¹÷˜/îS/U“4RªŒ‡çò·Õ•ú¨õqÁ±éœúäw/¯Å÷‘ƒß!ÿwÖe¿Ýç Gj–©7ªI¿æûôkÃà<›õ³>V:TøÎÿš§äÛ»ðUf“|}Wšˆ3ߥ’wÎZs6«þ¼ì‘ÞÊ12ûÜ—õrÏž›Ùœ}_—ÇÞdï+ÙÏUãŠI<îõ¹)Ÿs_öÕù¤¾y¶pä½ì§ð4¼ {½5Gì9ñÏq®yM3{é—z7Û§ž¯Øk¡su^ê"}³–ì 3é¾&nòwÍg×wÅ~¦{–gZT\Ôç¡ýYSÕëÄZ±ïSÎGŸð™¿`¯ëªòà^TÜÇ©szYwÐL£Ì…ãÉÏ·³Æ† Ù¨îcáTúpŸ|§3Ò{³™Ç½«ˆ;ñ¸GÞ”—ćžç†ÏÈoÉ]žËœyÈï8•w˜ ï™Ïå†Ñïj®ß`鼓¬­ÊçŠãÝãw£R­ž¼‡…G>ÿ ÎD5·\·¼7òޝô«ü®ó”iÕþ_zá¼õ;]ÅÿZŽÔ£®üÜ0ú¢=ÒÏŠKÎêåzËëÜ“}T ÕoηÂÒg┹L/¨O•¯´çšvìÑl†d¿•]÷zÞOò–ÎPÿÏüDßW÷gö¥Ê\UßrîWç²&âð™ô_âj¾ÌðøGŽgäö Ž`ðÉïÊ»þ:J›¿/û¼?Ê`öጻÎw¯ùYøUßäi÷O5Óϲ]a/¹Ípªú+í+ŸWkü|/˜×]ayn<ÏOQß7Îï%6މ9›“ÒÀß­Î2ñ†~F…í¸=%¾ÄP½Üó/ÏÝK&x^•Y[‹E¬‡ (^/âðáB‚ŠI”AqEò"¾-ŽþÿaóSSsºg ôK¶»Î9uªN÷ì>ð¤­ÚZÚz½­7Úz»­wÛz¿­ÚzØÖÔÖ¥­OÚú´­ÏÚú ÛùŸÛú¥­ßÚú+Þk¨1?hëC¬ØVLâ}ÙÖc¬x?aÃü+î+m½Š#®çH,á|kÆXK[pÄ{+æ;Xóö#løªÿ ¬±Èã}ƒ:ó‰5fUƒÇ™päCÿˆ=vÖáœ0â ‹¹ŠÛ{ žW^Ù/ïUÅqâ‰ß;lõf¿ˆ;aÌå ±¥ƒ[ÎÄö¾Ý`¯3å-Èå¨OÂ'væìXêËÓ¶ž¡î1ÔýöÜ&ìûDÔóGn¬ç仿±ÅÈ|'ìõD~¿Ã–óŒß±ØÏÓ{ÆúÅ'qtžù0úFÚs»þÈ‹kÂ÷Î×}ž›÷ç\ŸžŸêýÇy˜®'ï{…ëõ°þÿ\ÎÿK8¾Ïæ,lr{6Ç39qlטj~¥_Åà?Æ‘n'g‹pxÆ{4Êé‚ g4Ol:ÑLrMŽÎU}u?÷øqnf±½>Ý™—4ó9öó͵3â]º¬´ÃxyG»×çl>9G½£YÕó±4‹¹?÷z özqÏñ\úLçôÎðÜ3歹ögÔ¼ á9†´ª3Ιô9]÷²ö]=¨âT~yµF½×SUÇ-Ž÷š¸rž˜ï(†óŸ½“F+í¤nÜ~çkFë~f_^`¯[çì/l|Ñâ›1ä5÷ñüÎ#–sBœÌ÷‚/±’ç—9é^ä¾;ÔÞâ{å-çâ„ãÊxä ×Óœ ½÷[Þ|ô¼Ð‹åµÜ'¦ôTÅáŸùÙu”:{çŒâøêaj¿fCÆbr#Ìô¯°è[ž¡·z\'¿>›þOÝ©ÝašÄ”gñTWâ¨_Þ{Öës7±þD¦ôîºì°Ïî;y¾š×Äsýô0˜[ö#ßUnŽ·`«Só†<%ßÏ#¯¥/±¥×¾¿e7õÚ›äçìûØÓZ¾'¥aÏû>ï¿ÓÄ¡ûÉ÷%w<Ï;©ªQšwœ¼?ÅÖ0ã˜SöUù|Œ=/îŸÒ¥ðªųkÃë[°Ï+û%¬ V¼Š'Þ ŽùT³+}ç\Ý¢ž[Âô™˜ù »7lÔ½ü[õ¼?ÇQWâH~™°žzÝ;ãØ£åzF;?|÷î:æRñ­zÓù©¾Á*=TsïìÀ7Øú[õU÷HO» ö˜ÉƒðäÍ^_‰u‡#^¥“ô­z<£ž•^ïn’gõ¾Õ;«š=~忊 é²ÂKß«wo8^¥­ÄaýÄQ9C¼Ÿ®{5?&¬ñä#î®8õ}Ôfæ“Í}kä\q¿8×9OÎ2™¾w~glØÒ÷H—Õç­ÎhNQÜ;âÖuŸÜ¦Ïzyܢ֪ߕԻÑwK寬Eü¹/ظ×Çù»Ã±'ÉQå r“Ú;óF/ÿ¼#zßw®ñJÛU/2VõæÏ¹ý¢K|x^X]«\E¬‡ (~¡¢EGñ+p1„ DY/¢H^Ä·‹“üÿá³Å©S§g÷.ÌC²Ó5ÕÕÕ=³÷€›±¾뇱õóX§±~ë·±~«õ`¬WÆzm¬7Æz{¬÷Æz8Ö'c}:VëKlxÖŸ˜8¯bÃzÞc}ˆ‰ÙÆúj¬¯Çú·Â¼Ãüïuìù«â(ÌG˜¸OÆú 5þ˜¼Çý®UÇ<ó#lg5ûž8ü\Ê›qcãùö\ÉSµZÕI<;êZ¹ [úJÖíDZžažñ .Ÿ#½‰O\¯}zÈóWœkð>&G×1kFžÊ?}ձϛ˜ÄjØâÝ—KÚGM´OùVÜWž%yV= íþÂ^“Ä#ï¬S•÷-jnï`ÓtUs÷¿¸VõNm3ž! t–û7Ï»Ögóãµ”O”×}|¢~¡Ÿ«óªY”5uÿ0å lõËJ;åô|¬ÿp¿>XååõÒy<çÅù{þÿ]å¤Ú´ó^ÕÄsP]”Gꔵ{_‘ŸëœÞÉœs.5lõ«r=á¨kÇ–gúÜ}]ùJ<¼Þ®;=œþõ;Èõy€‰+LÖÐsáýâ5»EÍÁÏ÷³¥Å}¼Ö±Ÿ+òSÃqþùÞU¤®âô î?;^âzý/õðjftL\×Q|+ÍÐöï°iA,ñb|ãû+ïÉ¿ÔFµ?aÆË+©¹ó¦ÆîÆVºV8>ûsN6Ô¾ÒûϹæyœaGþÒ^3LM‹UéÙÊ×|˜9¬¼’ç8g÷ájîVæJÕÃ{»õê9LþO±ÎAzeÝ«wTêÅsT Í‘Žï â;6ýóÝ9Ž1Ü_i©{Fo¨F«s;Ž>Rí5 É¿Š%çê>uðY ÒŠSL;ïå>晘9cäá*Æ=¬ýÕ,—Ÿ¤}ÅŸû³öÉ©Ù~ïÔNš¹g…Õ°_i–\TϳšŸŒç~ÏKù S~P-ä#ö‡çÒ-Æõ éáÞÉØ»UÏò}#->ÇQÓUvìûÂë¿zÛix/gdUûüû9{νy /}¤È9PyI<;Ž3xy·ßàúÛÙëSÍUï éGŽùžMŽž»crîÓï0婿ŽK¾•šËy‡åû cÆŠ‹4ÒwÔ‚zòÿò¬œäN|÷U¥qåÕ<–p*/ISá4½Ä¹@¬g¸Ì-ët‰ŸîÐkxÙ;ÉQ½sÉëŽWqËþVÞþªðÒ¿ô#ûg•kÖ„9Û®½ «¼o±aó“þsM5ãWHWâ>ÇÞƒ©¥¿eª¿‹©NÞó'õÐïﬓxzîŽC Ͷ—Øî ×’Xʵêµê}âµeg¶ê*m²ŽŠÓɹºªã]ϪöîÏêw@zžy(bÝX }âÞãý'¾îƒÕ›Pçä\’ÖòDú‹òÍALjÐqôkê!=ÅQ>ÍûéÚ¼Oï[qÔÝ,®Ð<ªrYiÊ|^`ÎEï¿»<ùžþ\Ýûãø·¯òTù]Óp¬«z!{ؽ”úeª™BŒœ>¯VýïÜ.éz‡ºgWu&¶cVù®<˜p_+ÿŠç-&Þ¿Øsõ^ñùÚ°÷U5û;Ž}'×Oy*.Ïf>ú-ê:{h¿fˆ<š=#?æ•^ ûz_ª³ôû{|yÚ{==‘wcriØ´–ßèaj¾z'Uþð:xM¥—ò佦YágÛqÓÏÄÔßÈ6Þªur–O|>8¿ô¯4·¬¯ë*^oaÃk8rr=—ê*Ϥ†Äã¼Ïé½QÕ¦ªßA û<Õ[«Ë:ÿvÉHwx^•XK‹&EŒƒ(Š«¢âD QWAAwñI£8È‚xoƒíüÿamPQÑY=ã@žæ«¨ÈÈÈÌî~`ïñB—z¼ÜãÕoôx»Ç»=Þëñ~Ö㣟ôø´Çg=¾ìñUo{üØã§[Ÿ{üÒãWøÏã¸ãEw$~ÃÀ&±üüÆyñ$Æ[8pÃù­xÝôx†Á/sçü…-Ü 3&ñˆEžÄz#ÏÖãcqà|ËõK¼½Çs¸É³ÒPù?E¿ðRSÇuLñ.käØÄÜ1çþ:,éØ0ø¹w*wÌù>¹6ñåwøv•wê©zïk̘U­*ÜŠ«tdí+LyÉû抧jDÜÏ1|Ua;_¿ƒý¤z¥ot†ÞQ~ükÄ3~ÇÍgv̺¨oyÞuQÄZÕîq–ÒÉ…gïó|jJõ憹6;ήq>Àœ›xmX¿a®…c‡9噜 ÊÉûƒºêÞÕ¼Ú1Î{«äÙÿã©ì߆Q«œj<æé5SOy~Ž¡óҶꡬ5ùp.W;m¥™0Ó;ò±f¼f‡{²ÒJù¹^ôT5?äsõú•~ª¯×µá<‹ÄQ}ï8ÿ`Ößsæùìžq?ËWy·ÏWù*÷ÕÕ,q­ªy(ä5ß9©“ׂ¸Ò¿šQÒ]xÉyå»ôŠÏ†ä·ÊßySZ’“|{å3Õƒ¹U\\7÷ņÚ_üÓÎg~ óïCÖîÌ^w}\÷‡x]óÐïÈçâ\ùlGݓαâ'Ý’§cû¬&5&gm>ìrÝqÎU;C¼œòeWçÈ#µâù•¿s¾KO}䩪~Âq>ù ÊóÕYéúÎ÷}Vñ¹Ò8÷rê%\÷‚|¸©ñò™ÖuWo¨gÀŠp\oÖ¿šë·˜½žõS>ôŽfgʼn|„å8Õžýg/¬ru­ª^ä»UÕ‡Òþ)®Ÿ³¾•^“ô®óÔÜq~še鑆¡ú¼â˜Ü2ÿÜ%©«ïÓ 5®ðèEö¿0ɹaøY<ÓC9VWû1ÆŒ"g¯Ù}~¨|–;>sP/$öŸ˜çrz—xz–«<»£®•soªVäUá’›úëçgþÔ:9Sãê>¯eÕœ§;ê|ÜsÂwìpÎ#{®âïå ΠꙜ>kZ«öžxQ×ô¯z"{Ló°ê¯Ìó¾Z5Œ¹H-ɵz÷%¹å^”þêOÕíêÞ†ù¬zĽø j?®z±ê{ïÉ|®<É{9·«;¥éï˜ë¯;sƒgyF¿kûYÿßQëÄý"űšÎ#ßÛr‡xÎîI×9±É-{$ýM<¯›r»ò¢×k57Výò<Í"Ç“¾OTæ»òÔŽ3ŽÞ ˆ•³Ý=äs}Ãy×e¾ÌUÏ7ÒõÈóâUõ’fºs©Î³o1ôr¯T}ÒpÎÏ{D}¹š=;νá~Ì{ÿ»'uÏj–S[å•uã¯aÞ}™ï]yØ©wî‡Ôæ Ë}J<žõ} ¯0Ÿ¿ã·îêåÉs«=ª{¥ s¨öfbJsÏaÇà•³à!¾y‚ó·Çv½«o*ÄåÞ#¿‡jí=§y ïY _z/ë—^&7žõ<¥×мsæºÎ®ÅŠÿŽ“x«¹èúúŒtœJƒì÷†áe÷ÀÕ÷ qäÿ«šUžXåOüô¬ð…•}rß3Ü*?iÅýÎZ_Í/é¦ïúÙ+Ù{WºkÎæûXÕ3ÌUûsÃàµcî»UŽ9xöó.OnÂôgתfßã~O¬r¿ê‰ÔsÃŒMþªy•Cro¨ïpm¸¾CžRÝT+iì:CçxF¿å¬ò¾Ô\JÏ^}sô$oÞy‹ó¾•æÄr¾Î>Ïzå\o¨g1ÝÿÖ~P¾œ¿ùì_§~Ix^•XíŠU,0(JÄ5J4(:ø Á`‚¢rQ\į<ÁÂèû?„§˜[LMM÷Ü›Àù¡;]]]]Ýçì>ðÓ8§q~ç·qîóú8osœ·Ç™Æy2Îçã|9η÷ ÖØK,ãŒóÞ8b‰ýªˆÑ÷oŒó&¶9ßÁ6/ã™÷ö8ÌýV¼Ä"Gã|<Î'Xq¿ç›qžŽójÜ«&âI\ò#îXjþ„û3,¼¿À¢sÿ÷¨s‘ÿK,ù˜'µHîÔC˜Þ댿ÁÚ‡Ž#ù=ÇÂ-yIÛ?±rs}Ïù¨âáú{nÕ¡¼®yæ’ªÇõPâPiì>‘¦Óù»J;Ï÷K¯Yc²z©óÑŒ½/…ÛõÄ1Ÿ¡ïÍïXjª2WW‡viæÕlTµUùR·K¾®rVõåÒ=Äú|NXëÓüTØ®]5ëÝ®bžÇXr°Ž£¹<âi_±7¼KåÍñ%LÍx7¯—R‹Äõy˜°j¬þéQé0£ö&5MOª_É+ûÓy-=@]ÂSmŠc_GýÉÇ÷\ú'yÉ7•ÿ…›sv¾aÏ3}ÉÄϽ$î¹£‰?cíoêXiHW}QÅõÇÞÉ9JMÔ#éLu3¥<•ÞÇÖ öót­ö3êZrf?±ä glÞ{GwÞŒýnªtÍ»$g_uw5W»°ª[y>ÂÞ×^ƒp0ÒgεÛÙäx‡­*ün¸&—î#äµ£9ë®´NÎïÒ¾®f¹Û=ÚÝ®NÌ#¯Ñö»G{§«¹ê[îíâüˆ'ëN¾«ÈÏ÷arñzSÃôPê'ßh†R;Çã?iè÷úà3É~tý•׳ÒL<'ì½wäqb¿Äªcú»«Ÿ;TÜ;Þ·X÷‰óÏ~¹§¼ŸO¾}ª¾¯„MÜÄb,ãø-ÿÛïrbT¼Ä)ß|ö^ï¼à®ëê8^g…sÄÑùù½" Ù§WÑ0sÜ Þw™+ýFýÝzÂÞÛ3¶y½®JsÖÒáÉËÄáÏ»z¤Ù5¿‡²ÿu¹]ÇªŽ ûžH'׈½¯4º‡}z÷MØö@Ø•—œ+õ!ž°\oߌcÌŒåã¼ÆXwî„UCq8a¿oXOöç¨ïê…ïðJ§ô’ã+1ûöñG3z¹oŽú{Âv®õ÷¿Ìwi÷h_è^<¡×#±«;ƒ˜Üë~WVœ{:ë=V.búÎáÏflÿþH.ªëñ9†<ãyÔË|ä¿Òž3Ûi$O/ßnô›|Âoªý”ªÿÊÏÜÝï0·ØöHýñ¾S›îmL|a»Ÿfl=ì CuU=ý÷GÔWw“ߙй;ÇäÌIΊjy•yqÝN¨yæþðœ]>æÊ;ê.ûœ9Ôïƒþ.ãgc^;Ç¥&zÿÉc¾§•{ÆÒ‡ÿ°æâwüY…—uJWßá'ÔµiÓ×ÂÕû^󩹨4ëÞÒ.ûBoW¾N=:LÝ;Ùó ®tKžœ=b¨æõå7ÌÅo|.‰íó˜^Ê<Ú1Ò8ñÄY½£Ývo¨þ¬W:&Ÿm×P\¸Wµw*U½9a[çߨýžóÇÙÖ>V|ŧ»s^ÓÖŸýô·Fî~ÇeÝGû²ÒÓqÅ“ü´kºûÈ1“ë öóÞiAÎùæPŽ;¬»3µÈûL~ôþWs/ŸÏØóÎVZWœÓ»•ÎÄw¾z§w¿ë‹õÏØó“¦ÖÚ¯½’ÓÿmUDÁx^Y˪%EŒ…(Šâø@G-/>AAŸ/¢ˆ.Ü­ÿÿVP7è8ÑYÕg‘«©ŠŒŒŒÌê{æ1€÷z|ÒãÓßõ¸ôø±ÇO=~îñK'{<ÕãéÏôx¶Ç£/õxµÇk=ÞèÑz¼ƒùAz|Þãëßbà‘ãóüÚã÷FNÏ÷\ç1r>îñ&ö|ïbäü£Õá9ˆ¿õx£b ‹Ü܉%î‰',iò"®kç]Öžº:Ÿ¬Oµ½‚kM«:ůÂ%7iø/FÕJlÞ'Þá9‘Æêå—爫ZyŽ8üwròÅa³³Âd=º#þg½ïSãô›kãº÷³_¡Æ—ß6ŒÄ–÷žwýÏW³¼ŽœÒ®÷ŠxôfÃÀzûL}Œ%ŽÔú¥Ç|†^Æž#y»ÏVžåñôJ•£Òæ–~1—çpÜ;ùˬøÕ<+dž½¿®™f§á8ãêý¦wA­Sú&ûQõ€}'wöZúT;”{Üݓ䜺 Wü«ÞVZkßW˜ÒZ'ž<.]µw‡¼Òk®ßo8ΟêL¬ô—pÙ£Š[µoX¯fº¡Ön†KÌ{\{ʱ¥#ñ«=Æžg×5y«÷+U;3çDùXvKå5æÕ“s¯=M?gO”/{ :\ß}ä§úyþÔšúμ{¸ësÄ9¯>KéÑœ!ò×Þõ÷Êy‹ËL‡ô‘<¤Þ:Ÿ jN^«¾Yöúˆ¥ý3ëÙ†škÎPåç»ÚCv/º÷²ÿÕù•wÆL§œá™çU qôTuèÍ‘ÏÝâå{†þÈ=@¬ÙlæÈY.¹j'V<½¯UŽÄ¾CÝ×3]+|iü:¾x§O.8z„8Ò aŸs÷™Ïšûß=á5T¹ØGö@ùäsÖÏ;gßP©§ú%œ†k_­°f³—=òþ¸&³o—Ä'6ù¹~<—ï¦êðùŽôï­úOþ/`ß“­ÇÛ¨ýÅÙ˜ù¡â‹6î•/°ÆNÞÄmxÄáüªvÝç]ο×îÚùn!'Gõ]¸šâŸíå˜Õ}ö·µê'fµÝgÉ1ûâܪž8¯[æJ½å}žåþÛJÜ—¹ÛÕƒ³üÒ]=Õ{;x…±â¹â(ô^¨o3üªþê›×{éžö]êuø÷©|­=N¬ÙNÕ­™h˜óÑ\ønb½Þ‹JÆcUgŸ3v¶¥e~[¬z”x9«¸ª~~{&g}ó‘ó78æ!ïj÷T³Çš½ Çw@Ö,=åÅKÜS®kRU¾ ǽ¦Üôor—6–÷.ý–~u¬Š[å[÷BÎõy ÇÚ½Úí«Ý›:¤÷ª¬cå?é+¼G¸~—ÞL‹Š[j˜o{Ùß8úgõwŒò‘cÃÞ{¯‘ÿî3¥Bfo–ò¯úÀ=·ªwÖÿ†c>驜ÕÎñ\ »g\qã¹ô†÷’\®çüì›BXªC¼ýÏo¿Wþt½Ùgõ¸Ê«zÿþ+m}®®µÕ{-¼ÙÓé×äǹq/ç¾a`Ëc+ [ï ñ|¦y_z+¥Ñê·Ò[|ç^çÿ¥xÚ7·¾sÔ,çFoOC½gÅᯇó9Ëê~É“^KN¹SÝÒo†ëuÎðf{A|S»|Ó+lXcçŒkf3N¾+ÿK¼*7ìœü~åÿÔoõ»à†Á‹zI×ê{‰¹È[»æÌãjmýMŸÍuµÓ]+åºÇÈõg¿1Ï©\^õŸ½‘ª­ò¢Ïúâû„¼…¹ú k6+®½vœë>ãUí.ï¥ë*M«þïµtÌ~_¡¦šãUÍÞâ¨Fÿ»P³”½LéÑœ{ösö Ÿ=`ŽÙ P»Ù>Ö|ÇyºNä¦{©«Ï·úô?°”I‚x^™[«]E„ûAÅKŒâE¶A…¢ˆ(Q6ŠAÉ‹¯åÿÿN1~¬Zµ{Ö9æ%™®®®®îY'y\UOÆùzœ§ã|;Îwãü<Î/ã\ÇùmœßÇùcœ¿ÆÙÆyuœ÷ÆùhœOǹŒóù8_Œó¸&ÎuÄÆ6Îëã¼9ÎÃÚc‰ƒÃOÕs ¿âßçãšñܯ×jæxÃî)WòUÎ/kæýªöÚ•;óR»ð÷ÚS5ÇëV|rŸjbˆ—ã<ªŸ¸©?gü¶:â¿5ÎÛµçîg5±»š¿¯[Ì?kâ¾RG]áÿ~ÝÖ.Üojï¡0­[\ú(ìÄM-À…¯cº¶ŠW­Äª^Å¢ÝÊS[Íjôþ¬xtu‰µ½¨‰K?VXh•}u¯w~¦§—Ú±˜c×ÿYÝÖ‹—½¯Â}·öI®òŒ°5Óÿr7€)2£âè{Fž[a #ýLÝÝÌÑŸ“Uœ'¾q|°ÕŽ ïkë¾þ·ŽøÎ=wã«wér°Rßk9Û‰Ao:?i¥®à‰ßjO¸¦7úu©c½¾#®uÄóà½ÑÎç'uäzßþ?¯žoǯ®ÞÄ­¦¦Š§·—:jG¼¼»µ«Q8ÔåZ‘:O{o»º:o€Óù–XÅøý.5\,ÿø~Ë™I¬ôû\=9ÃzYM—£»ú{a¢GêÉŽ<ãu©½ÏÌGç;´íæ/çNxø®úµÕŽ›}H\yÒçd5è¸ÕÄ®îuüWó™y»š¼žŸ^þS·»zU=v½V}Øjâ<¨}âÅ«ÝUn¯=뾋 sßñéޕƼÑwåcW¯úKο«÷š¨_xšxÝGr»?¹#¬‡uœ9ý9±Ô ¿ƒÞk¾]u—9Ö·HW›Ï„c\jç›ïƒbŸ×íÜçLuoomçå­&–÷ò¬¾C®µ®K¼ÄGúvxâ$/äï_ªq«©qÖæ;MX®¹óÃ[÷y‹ÒÇž‡ïÌ.¸+ß›÷å †»4Õ}qìæ ]gj²úÆò]ßõ¼Û¿÷¢&§Ì§ztw«ùƒG;þ93äd޽GÌ£ÇùœœÍ™Ï ÒŽï åõ¤ØôGú¢ÓÚ{é~¸Ö‘“üöé=×FoTæÈ7JßâgýÝ꼆Kõ¸¹+½ï[õÜ7ž\q×ì0§šÑÔßù«þ¦e äXñï4¹‹÷YÑ\ÜwæI¾+\aJNƒ­æ”ŠU}ò:{œÚ/Þ“ô:eŸé»G»ËëH_úÎÉZžÔÄÖ³Zë²Õ¾o¤ù¥v|ß\ëv‡nuÜY^ßê­êÞ¼œ4£>¼ \a¹ÖÄPÃjŽòZÕå>÷Ú²]}ôìZ»/û•~OaPW7gÜ÷ýܽq¹oÈ›{Ÿx_ÀØjþÐiáóž¬æºzøž£~¼ïñÛÿ±ÒL=%w^þÛ߯ïL+Ͷ×Úí·¬Ùw;(¿¡ÈáÞv_³‹.u‹ o×"9 Ë÷®÷Ayñ²¿‘?kr_eÒéáU¹»Þç ¤n>CÝ÷ Îû#So…gß%þö—ºÍážÏÿsîtRN÷ïjç3Éø;V§³à;þZ·ót¦«0ºÞtu%5ÁCzÁã?ÇGUx^­XÛŠ%EŒQW×U\EÑF¼Â ¢x_¥YqEöÍ'ÿÿ#¬ 7è¨è¬:gÀz늌ŒŒÌ¬3OüÚÎóí¼ÐÎKí¼ÜΫí¼ÞÎÃvÞnç½v–v>lçãvµóE;_·óS;k;OÚù;ÞïØñ^Äyî»8ð>ÂŽI¼/qà9Ö†3žó#^rü &y~šë v|ià1È÷MqôŒ¸>‡1žò'ßäúvÌŸqæé:‹œ\¿O±ßÕi$Þú†±T?j£˜+Ž»ŠUå ̪†Â'ö˜ã¦.÷±c/8t!ëVaI“[œ¹óÆþ%Ç™/è çêþ½”{…'®â¨œßB%œì…Ô/k⾎cŒüD}ÈÁsòžÉø>+¤³÷µ°\o×Ç}7êÇiÂ;©óxãž­tUü¿Ðë›ÞÕ^ž¯´NÏS:I“ŠïŒæˆf_Ö®âÄþþó>zŠ3GßÄg-}†|‹:âÿ†~6*†4¥Õ’é9qãlöü?@ïrüGŸ+rÌú¤—”»ûÙ5õþÈ<9“È™wÄG¾KÏmϾ­òËWsŒ|fµuí}ÇK¿Y yIuþãç|sÝıâ—ýQõ³ïù;·Üe£ü‰ÿw;ÿbÿ«´æ®`œª>Aÿ–¸”‡zÖsq¿¦§Ò³ô«zJ±Fzÿƒzä,¬Þ³Ýàe#*¦6Gj±`Ç#Fö•ûJ5óü¨i5Ék´Ã6œk$hÞ-8p¼öêý ù}/»nŽ]íHÕE^VݳÞμ5«¼—œw°“ûµÞM}ÕÔÅçêŠÚ£ÄÍÚ;ïgytäÏÔ"wµeÞ®¡î(~#}øû¢òþkÏv­¾šâìx¹c¥/gwx¥GÕ[Þ÷ úùRiKœ ç÷†ó¬f°0«wÀŠ>ÿ‘®3lq­<æúÞ ÷Dö_ê<Ó¥z¦ßWþMîÒ%gbúâµöÂà=}Ïïf:Žf¡|~iî{žŽK/ wÁŽ)½4«VìXþÞ˜qMŽ^ïÇèó¾“xž¯zòRM/÷§æjzGqü-ÂýíºŒtÖ¾PÝ3÷jr'Fò¾ô^ºÆç9«äubúÂ}ÉÚKUrЯçïWµÈ:TûLXÄIÿÍð\Ÿìaó-£Z2FþvXqÖkc6o¤EÅ?{qæOÿ TÅñ\ïÒ,ÝpÖN1{®£{‹º©Wô1¼Ÿ=†÷Û(§k¼[i–µõ†úW9Tï½kc¥Ç2–÷ÃȬciN¨'sN,èç¨÷Wò­ê*ís‡HŸuä]qeŒ§8×Õ}ã{Dõ¬ÞéþžN¬*ïœÅ×ô—Þ¦©í+{|Áï.±6Ôyäÿ0ˆ]黡çøgånJ~z› Ïóv^ÂÌ™;{‡m8c‰ãˆŸpGºqN'ßUÙCéyÞß°ÿ‘Û¨O«}™~ÒïrjøÆœYë?qè›ñ*/ÍòYÑcûï‡Äà}êy­ÝOÄS½4ƒG5óùx×®÷;èsH fø¾C<Æ‚#÷8qt_~Õý çúè·´øem\[Ö'ÿW!ÜìŸY¹ÏFØêÕóóÙ=Ú›éåä,¥‡´È9ò-¹kor><Æ™{å‰Ì!ñÅÛõõņKó1²ß/Õ@ú¸ß¢Ÿãä-ÎâK,i‘óˆúÞ5w×öڞμƒ5¬rg é6Ârœê E¾ì9ç7Ó.sO¿z?°Ïª~ ö j¾Cs­ÚµÙÿ§ÞÞ7©»{š¹åœÅšÕ"c¨¶ŒQ½±þ±zEìx^•X]«]5œ‡bQ¬ŠŠXtSü b©biå TDÑ냯cÿÿ0Ãfس'+9UȃÞÉZ³f&9>ð[_­¯;}½Ò×ݾ^ïë;Þé냾î÷µõõi_Ÿ÷õU_ûú¦¯oûú¡¯g}]úú©¯ŸûzŽûUœ±?D½ÂšÕH¬ ;Îg8°X㬾?°c¾À¹Æ×°ãßÃ~ƬNb?FÝpÔš}¿‡óKÔ8¿âÜ»×—<~Œ‘â²Ö¯qÌëvNž >SçùYªû}|ëLñÁ3V¸ #¿Ä%¦ó‘õ~9&ù!/âã]ìx₵‹8Üÿ2}æl4kap¿æ2›qjÒgA¬ªÕC=Îp³6qÏÚž¢Æe­ £~ïì˜0j¼Â¼ÁŽ©Ó3š«keCÍ…49›±¹Ÿç¿;7éiiå…*·òÌäßû’ÆV3&þ,tFæâJ7îÕx™‹âbÃy¦î%b4ŒÚÈüw>‰3ó£ó·ÒëòÙ°?Þ)×0‰õ6æ^ð¼“_/˜ãe¿žkF/¸fÒcÂU_<_<Ýb­[jªºkgþãYbÔjÅwÅ“8’¦Vóüós\³:#ýÆsÒg/PãyÝŽëZÑ,x/÷GÔuÿŽ:£üÖ]áú!vz$g<˿˪ šé'}#nå_îuÏë[ÕÁó勼Ÿ7Ì羪‡šý×ýœó¯¼øósˆÇ}êÑ9ÐaÕ“Îa/+7캛éa6;žñæ÷¡ëB¸Ä‘®*ýóÛÌëäP}1Wsj8´ ¼ê™}ð~ºÆ™<äZ›q¶á\·ëlv6Œ³à¬7ÔÈ}Ü“z”>\«7߬—Ìb]óIÃÈr"<GV¹E-5œóuÃŽ¡¹e_UvÌæ£ž4ÿï°çèµþøÏÔ: þ†c^œûŠ3ùe¥}õ¨=·Ïwͼ…‡÷hb±&é‘^òÚª°¶ªÏä33"çsÁˆÛp®]˜žeÌÊ•_\k3Ÿ§g½’׆ƒ[ÏtõèuU÷¢÷¥¼–¸5¨ÖÀóuîËðœ~¬Þ,¬ÅsX^p$î†ÃWÙ[Îí/ì¸Äâ=K ÖÄÞô-ÿ^iS|zhöìc6;翪)5븳¬u¾kr´áà7÷ò{Ëoøwþwb(Òÿž]âßivžÊ¿Ó²·ÔUÕcÃÙß¾}ÍòEû’ge ß✽ÌôžØ™ƒìÓyO/Wû¹oU›4¾âJ]qæ5Rúÿ¶â‹ßè|Íó?HÊx^X[‹E¬‡ D¼Ä F‰˜!DQPEE2²ˆ/û"yraüÿÂ.æ+¦¦æœù6Ð’îê:UuNÏîcŸõåX¿5õçX/Çz5Ö2Öc=ë­±Þëñ>½œ{ŽõìWc}=ÖwXqþÀ믱þ문ÂÞ„O<Ç}~ÿÛ—ý_΃Î}#—ïÇú='òYp¼Cu>Æy­ÄÿµvžcMØj%ÆÏ8bP¯¬û¬ç?dž!NÄI çA¬ª¶ {ý¾Áƫ“ î§W‡# Ö¤=¯/ÿ&?[\Å“ºËÛ6qÓOr©ö=°½º‹Ùªê.º3k¹ÃÊýMlx©É„½ÖÌ‘ëýãX¿âÈUwdÏt˜žûÇžæñ”FäIœÌ’ÎQ'¯íìëc&ŸbŸKõI×ÌÒ‚ÍÇ—ïòƒ9QÍ™ïGjØÕ®ìÞâxo•µÄ÷^χ{ùÿü?áføìòþeÈ[þWz)Ûé]öß„:gš,è=𜠯šYÂQ¿IÇûG§÷u¥A••GØæcfƒº&&q²Fϱüö^Ì>öìƒÄȾԛqV×™Êÿ„½^¬í[ìs_q^°ê晩zI¸âK|bw˜äêž’'ñˆ¡¼y™….[Ù®Q—}ö•°„ãózF­wæ)}õ¼:WâW3;ñãGØ¿aÂð\äyiF^>Ÿœ ýÒœ­j”æÜŸ¾džÏ²ìÙà}™¹*×9_\cùvm¾{™÷ìͬ™ß˜¼‡˜Âp}ÅCþVuê¾*?]=9 &ìkP^:Ÿ\×dŠãoÏuÙõœœõ·óIïÈIÊX•yî½Ãžïwîy¯¿Õ®…ëš3PýSyå¸Wÿá˜õª—„'ßÓ§[ì¿;ï«,{ß3[Òá'g·ß{ƒZ›ô›½ä}4¡ö]÷*K3úž­îâ{«¹xvŸßUÝsv±©<¡^Âɬæ¼to«YRå„/Xÿ#{1qò<ï÷lQŸk3ôš.ÔÁû?¹s—dzž©üQÞ+m=ÝÌaþßDZ§žaï¡øû[ç8Ù?6Îä«ù_õçr9Ç3žuî}qÙ?Ûþª§¤ò­9œ\Tø¸†3Žó'õRïhF(ÊyÕ›òØý­´r­5gù½^ñ;ÓA$v5CªÜ÷_ì6Î|v?oŸœ»™¸ ×C3é 6LŸîY÷í–Zø›Zeáì J©A¾ÌÏgoT<ÜŸ‘ÊOÎ\ÇÊzôf¨&ùëÞvu˽;Óáû³™…k߀¬-1}6yf‡ò™çÒ_Ÿa䙙ߤŽó[Zë;fFŸQ¯õö?ÏIsiÆó Žïypozâûô{yZqÎó9£\ b<Æã™â™¬Ïç…zCµ)S®—sðLu³Í1YK÷†.ؾù*…ÏßY¥â©yYÍ6Ïó&¾rSiŸssÆÑ bÍeäæ²Áùœ¸ö]èuWœ²Öì¿«ëßü½œò£zøw÷JXä&^é¯sxýŒæÔ¾û9Õësý”bùï63ƒ÷ñtÁ>'Ê6qªsÚ6×¶ãÒeWµª7ò›•wpþå»@ŸýnV ÷¾Þ,8òžpœOÉQzߢ於X³óéð¬5 Ëq2wgù_°Ïšôò™¤ɉ8Ô(}u^ô#ëìæ\õ]”x™™ÊWÏò<ã|V “^úŒºö­#]Ïî`)—šù¾å¼ ~5O‰ç8¸ö-Džôê7Ô™v;}W¶»o©µÍ^ì²~­oÔxùLØøêgˆ.óäJLb¹çòB¼ªógœô}×Íg×2q3ŸÿuøHx^•XÛª$EŒYQ\=®â*Šö.ÞDï2(DV΋ì›Xëÿ„ô•Õ3ÔËLWdfddTõÜðR_/÷õJ_÷ûz­¯7úZúú°¯ûú´¯Ïúú¢¯Ÿú:õõk_w}5ì1´ÿa_ïôõ6,b|Õ×רp~ÁŠõG_÷°âƒû߯ŠñÖ<ÿKÛË}¿÷6¬ûgõ(—°åCÜ'Xóú+þscŒÛ¾~Çë¬ñ^Ä3ySΟ`Åý+îÏënX1˜³j^°ñOÎ~ÀXw;ïá÷üîÙù»kû¡Ú½¯Ê‹µ¶¾žc«5qo0Ç–n£Â§^…ý6lñê<¨/ cŽêû‚-'åây0õ1y»T—ô<ëï‘>‰Ï~ ?±Xÿ æ+±\ƒÂd¯«>(?×ßûØ×<Ó‰tËYs-,¨ýÃçW9SêŸý¾x^ÏV=sݨ–ìß‘&«WéKÄMžˆÍ¼¥‡æš'vUC¥;×ñ©9q3ÓÜ_˜ÇÉ~U¼¤âzÞ°â-Øëϱ¸_¹ÌêUÿ3vò–œy-ÙâUçŽ|”xþ<}[üúsŒí1åK©íä*ù_ÒjêjÁÈ¡bÐs*»Ã¼ßÊ÷Mlñë1ÆÙƨãj½6Ÿ×—×Xõ$5}m,“/¾\?ÄhØë•ûróQ3.?Î+1^ÅÜó2¾¼¥¡îKö=ùI¬[ìç!5¹ ÆIæL-ç=ò/7Gš:š¹K}•ß>Å6'Â~û3í6l÷¿ögC•ç̳Õ{ú“Ï×·X±+omØß‹2žß;ýzõlûùèw‰j®Æys‘'õ>qå”®…ãs‘Úó™PíòֺȜÈ÷Ì›'9V~ê§ßë=†÷Õ=³aìçy6Cª4ç½!¬Ýý@¾¢¹'ëšÍ¯4Âø|G©z(,ê1kfåQĬðÄ»z[áU³”Z¾ÔÛÔsöØã‘Ó£óµ¤G&Çî‘ï¦vN˜çOî3cÜ`CX0Æ þ7XgÞßñ² ›ßwÁºŸÜrîK^='×CrI½eÝÂLŒäNÚn˜÷S±Ý=~r¤Õ¨^[êÃëÐ>Ïkv>T:Йày#Lù¤z˜ZpÎ<·–¸rMã£Ïª^qÃç…ýd.Ú—=L­æfæžOžîÂ|Œ±ŸÂo'ŒýxŽ:wå]½{1fêçèP-œ™Œ“gpžíªC^WáWçLÖ1Ó˜û„ótmîägÁžæKœÔׯžV<ä3yþdÞ'•~f±ò¼É˜©)Þ³|.«y?ŠÏ¸ù.Ï>ïÞbU8Þ[Ý¥ìýÃó­ôãý­f-ýnÁ¾—z N|¯áö¹ ;¹Hì#ÌJGÙËÊ[Oã´¾þÅvV ?'+]æýèÿä]qN|å™zöŸ}<û˜ÚÎ|Oqj_Y°â¸Ï27ßß0æâÿÛ/ØÎ„ô¡*z6?™ËìÎzNöÚ—GÜ`ß“jÜÄcUƒû´÷Þµ¯ó–yñyÿƒ¿ËW¶{„úðèüŒòºF×âÿ¥p‰•>¢ºŽtw¤çÙ» qÅÕ¥ÿª…ï½Ñ;_ziÕóĽņ›9WÊ^ËOůråü=ëëoŒþO|ÍŸc&îÍö1'¿W«¶äJ{Èýì÷KäïÓ FNg^áÏÚ«9]0rá¾\Å þƬAç‰â¸ïÏ´@¼ì?óPlaüd<×ãL‹•vŽþÇsþÄz©gô{zòÌ×ï-×u£ßþAGix^•XÛª$EŒQ/«+^P´ÿÿVÐ'è¨è¬žõ@½ìLGFFDf×Î àÙ~žïçÅ~^éça?ïõóa?÷óU??õ³ôók?ôó‚}ÿµ~Þìçí~š=÷Y?_c{ö—ûgëçwlk?wý<‡­¾c>ÀÆãõ~Þ†ý.6^ c qóÂWoŽM\áµ~>†õ)6<öûM?ߢÆvþÄbïäèüç{Œ8ÄX±ý¹ö/aïýUìš÷}l¸7{ÿ[êÌZ?¢æ|‹óŸý\0jã>²Ÿ70ÖnØk~‚]'¯í=VÈcÕò•§ÄVOÂþǾTãÔ9Ê 5ë¸~¬õj Y#ó$ÿ]'æÉ{¨°Èû1v}œoÃÈQü„ã}gÏÌŽ|œyHÿ¾CÍ‹XÌ¡çÚg/ý‘/|žœÜëô!±ÆÙSŸ³¹SÏ>+ê•Ø {‰#Œ¿0êæX®=ù°ÇYÔk•çÌBú˜û@˜Â#ï#¿Ë略™mñ÷ÝüÿŦup-‰¥ WÏóΟã÷ÝK=“û€Ï/kð;ꋟ]î?ÏÙr_f»B9äìºWê“ûnņëÞH#q Ì„ô—ŸžY>çžr>¯g{Pz»†•æž9b¤ÿÕ»Â3$m´C+nÕwÿ¬÷™÷Ü·âã<þƨ?ñrO6ÔÞó 3³àØäªû@ÃŽ«^+×k–Ͼzfî+¬ÜÅ™7qÓ,Îò±¢Þ7Õ;ÕïO§[œóâÌ óŒï åÎç-kð^FlbªÇ¼ÇúœV™Õ<87åŒYÓ}Wª)ÏÉ™rUë1ê9aÝœ;eS¾_ËÑì=¬™¦Æ £>3]üÎëy?ÃÏ!ïÈ{ö^UÎìõn:«‘Ù¨æÁ¿+ ù=ïOõr7h^fÚ c¦MúÉ|h¿(Úƒ jìÿ“íiÕàž•þªã54?¦<$OÞ+ž™‘äI r9®Ï¦óºÅ†í¸ÂÌ=¤œU;B:ò^e®Ôól&ÜìQ|ô¼?ÙŸi3»sH#zÉÞÎæ_Z­8Ö¹VÃw8=>›Õ§ñººóWýTw~ß9ü“_Äæ»[8ÄÆä‘ï–¼/¨Oé˜u³7aé½7Ãòì.8â宿ôƒ˜¼H¿+kűOùš:çpž ŽWŒ÷˜œ‰†ãÜWwpúÈÜÌt§ÿ`××3ãü³Fr_×@ÿ”nÚw¾ç˜é­wÞ‚c†ù®y×gÓ5öL'_×ø»‡93һᨵgV¸·ç½ÂoÏñ¤QrM<Çšqs²_Ï<5¥®i¥§ru-¯Ú?ÄnØ|È;?§&¬ÉÕÌò{ëýwù=ÞåÔë Fý.·à˜ñ㌦™!bÏ2ã{Ð1…÷çù$ßîŠ];b$'Ï´ßS|®}¹`ôÆu³ZªQéKì'3åóZéK窱j–ª:ž¯ Sœ…“y;óKÙª¼ò]’¸®ÁŠZ[Õà| ÷ŒØ|·xŽée¥Á-Æ>ª 7ìóäºV¼søžÒï©ïì}%éê;.1Ô¯g—xÎ+{%®ö0qf<ø¬?C.ô6=õÍ:zïó;ÒMØü\=©ŸÌ†ô•Ìëósÿwþñ³ô-5’ožáÙî‘gÕÎÉ9›ÍÅ,»>Ã×~S­öÅ#{`Í ¶½QÕ<ÓÅñåå}5ã©MÃq×}‰ã{hÁÈ]w%eÌy ÛçpÎÊÝ‚óŒ³ó½Áˆëï€jr†*_u‡ö»ˆï£®÷L>Þ›êy/ {^ÈY;ÎsÈç2×<Ó{£â¹bŽ×0bGwåÛóÙCÅÁ÷ÄŠ:Óž¿ Ãû¨îÈÕÜ'7Ï^Ãùl Áèiþ6›5òÿ™ñ™â/LâñX݃ŗ;PzxVˆ%^ò$yx;Ô>U»®áè¹é7DßYkÅõ:®çHáx^XM‹dEŒÃ¢(®.*~àW±¨«  .²*« Šƒxñ"Þjýÿ? Þ/^¼Ìn±¡.=U‘™‘QÕ3|ºÖgk}¾Ök}¹Ö·ký°Öóµ~Zëf­_Öúu­ßÖú}­?Öšk½Xë=l8<ÿ ¶ó<ÇýÚ÷`­—Öze­×Öz¸Ök½µÖ;k½¿Ö‡k}¼ÖÀ†Çœ˜sÉ<<a¿Œ ÿUcûløGlqý{ ñ$¾ð˜'qT/ž{zF9Mì90¾øñÜÀ1nòòàYžó3ÜÏœnqä¨ïb¯¡÷ô+l=ùn­g8sõ¾zUÕ+5PkHqY§kñþÁ9c‰ ñˆÅü;ï¿×…Úìr}‚-ϯ±á{/=?j<ëÝéõ¿rîê)¾Ì«Âîùýÿá,ž7¨óâçÒ,¹ÖÆZq½ÿœ“Š‹ô,NŠ+.oc¯OÖ:ã)VåŒ3q®U5/î]^Õ!gmà8תïÏèyNÔ5~[^Öz{/G1¨×äx ·Ó«k¢òÁÌ?cTó0°×#µ@tý¹TÆ`=ÜG•{jøº·Øƒý™Ø9Ë~ÿ ì¾)-Ü`Ïó»G«Wâ¯Þ+Öƒû½®»jŽºº)~ò¸V/å–>ðçò>ö&ûâ3I<ÍJΚחòÎ\È—óì=¬4Rå0±ßI©çZˉÓÕL¹ l8ž‡ŸU|çäýË{@^ªp:-¸Æ‰Õ½Q&Îw@by­Õoާݼ—ZŸèõÕÅ!~7çÇ^v8âî9Wxâϼ\[:ÃwOž«ÞŽ·äEÌĪôYùÊ'8×èÚ;áOëO¤N8×Ǿ‹\S#}ÿä]îļ6“^wÕ¯ÂÏ løÄ“§¹.º^(ÏjFÈŸyÊÇò»æü0ްsV*/QnžKjžû:>|ËhF;>ûÂWÍÓû9OÄOÝ9ÞÄYÃ>SÊ1¹fm©[åÓÝwÌAÜtžg'¶÷v¥)iÓ½0u$ ž×œpŸ¾S˜Gz¶|±ª7kí¹øoKá¨Æ>7™ßÄyf¼Þ•6Ò «ü\ÓÂ’4sÜ/=æŒ*nõ>t©8ÝâøV¾Þ³Î‹ø©÷JGœ8ö-uMœ<ϳÇ:û|ä½í\5Ž©Ys~ész§§Ï‹£ÿƼÁyfœk…Ï·“sÏ>]škiWµâ÷óþ»Ô3c%y`—sê9sÏzìõy‚³çuw¢k‚Ÿ.¦îþÏgàÜ ÅªbLÔ¾Mõ{‚{ó`Ü#<âÈs<ÏAû²vêyöÛùÐoèÇ]ÝÔ«äTý_'çËãùýZÅa zÿŽsËŽ­¤®¤S¯9Ï œ»T³”ÚÈzòýtIYWÝ—øNôþä^'m;–ëZš«zC¼³Ž+̬…p]Sw⊳k)ïiš˜î«îŽë:çYžI>ԯϿk‚zú»¦^`ï«{£ô•o*qrÌäÐÍDu “9gÿž'1å®~Ï8Òbâû¬eO»¼½öŽÅß1”Kj-ùÒ£‰UéÌç€ZSNé%žWzqnq¬“û1¼.Ò|çwžOõÆæÀ1/ÝEù[â9Îqòήâ0FÎlzh5_ŽÍ=šaש<5gI˜]=*÷ÅKþCÆS,Ÿ§ã\ʪ:$NÅ=ýFy—ó÷=ν#¶ëMÞMA¼kZun®ÑŠqŸáì?Y¯ÄëüÌûziÆÅÙõý6Ïe☃4ªzòïôqî!oâqOõÛÀ}°ò.j7¹UõJ¿öóZW9“¿úÜÕÑï±ê­8qö^y·ógÎê…ç[õ–¹ð­›ïŒÞ",iO¹To˜ô¯gêdbŸ)öEç”÷3v5CŠ+šžífè5ŸKâ:áºÞ½ÎMæ8°c¯«¹×›œ•Û#g³Ò•׽ŸØq¯4¤>¹Gkÿ¿ŠÙIkx^¥YYËE¬‡ D<âŠÎƒ¨Ä‹E1ˆyß>\óÿ„SlŠ©©íÙD |3ÕÕÕÕ=³_nx®¯çûz©¯Wûz£¯·úz§¯Ö×û}}Ü×§}}ß×Ö×}ýÔ×Ï}ýÚ׎ñ&Žó­¯Ïûºã÷k/cr±?ÄÀ×ÞPÇà^îûæñ¾íñßÜóL_·1çò:.oãÈç]œc^åDÌgqàJ'â*?b}€÷ æÓâ9×J{Ç'65ý¢¯/ûú‡f®GÆ}ˆ#ö-ÌñûñYשahus~Œíq3æ ÎùɉÿŽœˆ¹ÊãÔ9d ×M¼‰/Ý*®;/ß—±®rQP“ïŸß0â𬼘µ%?¯í“´M.Ä\ÕËý-Œ˜ýè:®ü§}‹ÑËÞo/`ðy ×8Î+k,^~Nõ`ƒ?ã¿q¯j”š¤\cÕ(}PyJ¹(ÇIm…“þ¼ƒy5œ5aͯ¼ïz{ŽY{×Xâ<ÝpöÒŽë~ª<Ë÷pà†1*þUŒÔv…ý¹;nòÆê,yù=&nª{•ëÊGì1{³¡®W…ë}Á|…›9®<¹c>'/3&÷¯tfLî—~™}§z„ó,¡çy·¸–9˜¿ß-ªý•§\ç[žò¼rîñ\y…ÜfMRÃÌÍçîí¼æÙÃü˜S…­zz?Èo¹Ÿ¹ÿ…#žÓÏéI|è¹UÍw¬óæ{¨ñ6 ¬Ä^ÚŸ~õúòûÜkÄó«s;Ö³ÆgYÅŸ|øžªp¥ ±äiùM>æ½íµÒràþ+îÒÊù^ÕP÷qâè¾ðج97Œ³ô"Ïr?ãj.¹çäKù)=¤·À†#þßw_úF¹4Ìš©ßÔÊãó¬É¹ÉóÙä›^[½CTsõ¥c‰ƒk(<åîµ®|r õ¼‘¬GUã†Ù“Î/gµâîñÒCîÇ%–Þ@Îü+î•/æz<'ÅÓ5q,åÌ» sU§¾ê±ô¨úºÒÍç…óѼqí4/ȼܳj87bÊëÕ7Žæù•îÎI½Cîcä¶áÌ%uò»ëiüWyoùOG|sF¯ê1ž«j¹âçõUWl˜sO¥!õ×ë^C÷nÃܯé£ä”|æ|‰Ãš_åê3@;kŸÞQ<£šòŒræÏ®x®úR|”gúC:;ŸJÛJ+Çq/{ç¬jΤîò-﵊ߎ™“¿”›0òì*7rÑüÈ\Ò?Ù“Ù+ò³÷‹0ùîQNÉé!/ïAjÔ0§÷òþôûˆ|«oæÌ_˜Ì¿ºC„WaùÙqæ,üêwÚÂwΫï×YØž?Ïðç•nÉAuU\ÎIÿ½*GÖ†ø`Ô'=çºûÛzùÅ'59ñ¬úg²n/ãü^¯ª·\GaKÃqÞ½éû¥«ëɸzï7Œø|s¬<žs,1óåù\aU}’ïÀ|«m8cq–‘ñ4Voaaé;fÃ<Ãv ,÷â¿T»GÒx^•YëŠ^E¬bP4†D¼‘1x1ˆF¢Q!¾€0æýÂ)NŠ©¯NÏùvó'{¦¦ººº{f÷€÷Çúp¬Æjc}:Ögc}>Ö—c}=Ö·c}7ÖÓ±~kë·±~ëϱÞëͱÞëþXïŒõ;îc\bó+ì˜Äû;æ/ØqÅŽMÜ>Öë˜øÂm¸äù&.y>ÃäI¦OÄQ9ñ:uopsö±Š;ó¶ªìgÕ9ÄOOùl«0;Ö¼ÅÙuIÌÔ:{Öj^Tš‹óŠ+q+5My-eÜ/qî‡6Ö'8êÉysÖcÿÂŒ?5%~åÎv÷yóy!ÏèXç=a•·³º«rÕ°ï_í;ããçk¯ö¨?æÎÏ«cHïm«Ù/NŠ%±¨ñVµæ¾àþ‡˜ºVùSMS…ױςì“ĽÖײÖ75$ߪç<Áí¼ ýÈUu!×Î{cbt¬çjÖ˜û+ïDêÙ˜«^ LbU÷«ŽºO)× “Ÿ|—¼¤×ß8⹯³¯VžT®]ל7GÎÄô7HbIÏÄXq¬ü“¹—®AÇÑ7 —ž¾V»7˜XUÍxÍ™}­7wã¾MÌ^/ꕟœwuÆ~öÈŽ¯¾å7vM®a罂~ZÍki’9ÓþJOíá÷º»J›•&™ËœãÒƒwÍ»æ‘8zÃQ é@ß1†ê.L¬JËœÓÊϪ¿Ó³ši³÷­bm8zKyJŽ:ãlf[±¿ºWñŒŠ¿ë©Úõ^àïð†KLŸ{·yǺ¾ÂK?ò;þSœ®Îæ}ÉûˆûÎÏ“NÚO¼GÇ}‘ÜS›JwŸg®u5+Ò#é_¿¿ý }¼¿ÊCù|ú¹?äkqõn8æïÖÞ~€º¥Ç¥1q+Mý÷jg^öš©Þº™GÕ¨ê'ÏU.‡çtu~žÍþZå‹gþƒ9y®ÿþ„¸>·*îgÕfÞÉï¬WUž^Uã^kìËŒñ9α…ù;nú¹¿•ôÐs+Ï­pr(&æÏ}s¦¿ã{Mù› }B¾©QÇ%Gy aßG>ºå?W¹J]¥‘ûP8Þ{„'¼?Vw«ª—¹.ê ÂRy¯!¯3_vÌÝéù†éæ°ÂR¬þ§æoõ¦“?å¬ë*þ*?~ŸLßÿˆ/s”^Î;zæÉ=@þwy+ûy<‹½ø¶½Ðs{í?cõÞw<¯Í ÓË}¬ÿpÔÉs+îù÷å‚g$¶s~U+ŽïØÔÅýãµ,ŸËËÜ+ =ÞJ?ÕXú,,¬Õ,¿AóŒÏýKýæ×î ë÷ÿªîä'Ÿ3įúqÇì7Ä[½©•‡UÏ!×ä§ø+s”Xë“::?r[å;{AæÝ{uñwU<³Þ3nÍë³{œßVø^ãâÛpìÄòø‰Avìû¹WóŸß¬òO®íÕwÒ`•+Åÿ;†Ç/=Å/{DÆÙqì›ÄIÝxß –úñ*çÂ\y²Ê ñü ´áˆ—õ'Œ*¦UÝæß¼5×™O×û)ÎcKlÕHÖ…z熃4ÿäÓäá³Oûÿô*EÌx^Y˪%EŒÅ (>†Q| h >ÁQtðI£8ˆ›q!îÖüÿOXAß £¢³úz¡63U‘‘‘‘YuÎÙü:Öocý>ÖŸcõ±^륱^ë±Þëý±>«õñX_ŒõõXßõ3Ö8/Žõ2v¬×±ã½5ÖÛ8pvÌOÆút¬Ï±ã5Ö“±~ÀcÃã_ÌqÄYqòŒöÏ;˜óP îåžGØ1œyùÞín?±o˜y(çW±ÎûØÊ›93Æ·c}#Nê«^Ÿ†³ŽÄR^<Û1×WܪzCú$qp žý{|ÅþëÌÙSiý&ŽÜ²o”›{VØOqøH¤®4_ùç›çý÷ßîöVõV¯2¶´äÙªÏ`­Cú†üǹ?ÃQ[ïŸk ;óaU³R:T¾ó¼Tky.½¦äù¨7½~®£ö†r¸êsam8óèø÷]Ñ›øqÖ¯p+®Þ£ÎµÒ,½œøµÇˆ[Í“ªç;vŸ§âx¥«÷3ù>ÆÜ æX`'Mr~ð¯òºÏÇH+ÝÕœ¼ªg›rl˜ûqUWæ°ÒÞñªù$ªO½¿’sÇ1‡Ý—š^¯õ}¾Þgª{õþvÃÙónÇŽC Õƒ{TÛŒ#¹fO9­ü¤â~QŸúíÿ—ô:ß2äá=ã1=ÇÔÊgzÃÌŸõH=Ü—Î_XUïº]sùa¥ÏTý í²ÇÉã¾¾î8c‘KÃŽ‘~¬øxºãæ>¯z'{^˜émרï‹ÊsŒ¥ðö8UÝV3ŠX¬ùªö®{ðι»W=(_¸©kÎ(ñÌ9.m+ŸK¿ä¥>I¿ç3Ìw×Ê/É­ÊU9ÞwÞµ{ óg¿üÌ+^fj¦™ë9çŒbÎÙ›Éó†õìó¼«ÙQé)?¥ïŸâìýÊWò@ÖÎñ™Ïênb>3~5ˉKÞ†¸ªÈWwÏës 1ª¹Çóg]•_ÖH=¢óõl¨j" ŸÅÞsÊ+ý“3§ª³æLö°p*^ ³GVžö7CΨ÷p®ýÕ[ŸXÒyf~ù=IæÊ~‡¬¼% é‹«úä›´¡žW}ÙQkäÞó>Tý=Ö­zSÿŠòf yk¥8Wx gŸÊšf¼Žº²† ³‰M¾üÎD÷䆚·{&uH ªºç/ß®ü×pàéþѬLN<Ÿ^UžÕÝEv¹¸^ÙÛy)öŠ71r&KÄPŸÇÊWÌCZj¾äáµIOUŸ©“—ÞH©“ú7}•x>_³·è­œýηòíʳþ^J-³WSƒä*Lïý 3žpbæäÚ=ÁY7õåjn¬¾‡P?J·ÕÛXün8÷dúQuj˜ç ü˜˜ëyêù§Ÿuï{ ¹·ªs“—7Ì}ùó}ËÏŽ%×ÙŽ¹î•ßýî¯æBΔ*Ÿô8s¹Âq-f=T[žÑþ8êɘò+crö±•¯×‡^ªú¤c~£Ñ‹>¯\›û|¬3òƒ´¨ætú“=Ù0×&g…ôÌœ…µê'¯5uð;ÍkÃý®ÿç+3ÿ>1ßî³ÊçÎuS½\ÃÜGÄ÷ºêß+~ÒåjNWoVÅtß*Ï|oJß«y‡x_^}Çâ½¹z?éÎì8pé'÷ßቛ˜Ž§Þ«îªÖÉ[sM¿=m8ß Ä¶ê“ïqÍÚˆ'ÿ<÷GØ9:ëRq †sXݹä¡§žNœŽú· é•o)饯ðt>ùh?÷Þpíû|ó4œëUé›ý–ø~¯úïWÉ•1¼O7œg™pÿVÂH²x^íWËŠÃ(Êú@ÅŠ6âDQPViñ²= ­ÿÿfPTLtuÏ®ç*ÈÓNFEFFfõEÄŒÛw3îg<È2g<Íx‘ñ:ã]ƧŒÏcÆ—Œ¯ß2v?2¦Œ‹Gw¢bëI¼gÏ£`y'sîùŒ Qò¯I.~‡;ðüýÒür×»†9GïC /£Üù& Þû5ÿ¹(<®FÁ¢jAÎÐàûü{ðaÍ—ç¼ëQ¹)'êù6Ú¦¨x¬‘˜ÀÛªš²WÀÿñ1Ú÷°VjM|úà^,y˜Ž\;Õ„ØÎ›˜è¼ÕÂV®ÀU]\jAoQb:žúXÊO}ïüÈMy!yÈá}øôð{Ô³Èá]ô%°͹®¥ûK9Ó®¡öGkEŽz÷£ÆãXbx”“ú¥µ;ˆ»¶;”ŸckÝ3[½¥WtGP+ç¨ûáU¬ûܽ£±«´z‡Î'xs&ÝGÞoö‰<™O O½¥{âVT¢æs¶¼¬š‡þÔ|Þ>ª.Sl÷Žº¨Ô|ÞÇRo÷D«—Cì룘|¯Æ¨˜?£j žì™úŠú¶üäs¬Ôà3ÈÞþ‰~úé§Ÿ~úé§Ÿ~úé§Ÿ~¶Î?"ÔÄ5x^-Ùux×Õð/-u ñZצ‘.5ºCr°*Œ5BéÁ®Ähé )Á!0ÆE¤¥J+péæ:á~|ÿøü·óœó}Ïû¾çý= ‚ ÈI^> ]ÄÖ²ƒ®’&M¼IYšA1Ìfû¹ÀSr¦ ‚7(FušÒýo#™Ç"¾c;§yD®tAŸâÔ¤íˆf< ,c3‰ìåwÉ’>^§ •hF;¢™Äb¶qŒ¤Ë¯òe¨K8]ÁD¾`%»9Á9®ñ€lƒàŠR™0:Íx¾d5[8À‘J¶LAð¨H#:ò1ý‰á æ°–üÈ“ñ1æ_” 5hN7†Ï×$‘Â2e‚×(HyšÑ1Lã+²Š-ìãOÉE¼ÈO9êÓžÄ2›U$sš›¤ÏoB}:3„ Ìa ;ÙÃynóÜÙ‚ !Ôå#zòoæ°žÿp„;¤Ë9x—²Ô¢‘ e,sÙÀ.Žs—4ÿ‚RŒJ´¢ #ù’ù¬çGR¸K†ö¡2-éÁP¦±„mâ2ɤÐÞ¥ gc˜Ã:~âWî’%W¼LQªÑ’Hbˆg%«Hä'Nq'dÎo‘—âÔ¤1]Ì&±„Ds•Çü4/Ú›‚T¡!ù”©Lg›8Ä5ž“3O¦<µiM/b˜Íjör+<á/É*ЈVô!–ñ,`)_³™Ÿ¸ÂS²ÿÓ7RšÆtc8ñ,à;~äîòœo oSš4'’¡Ä³Š#…³Ü!c~9E)êÒÁLa [9Âî’¡@¼H~ÊS“vô#†Ö±—³Ü$cA½—‚T¤1]NËÙÈn~à8×xNžBÎF]ÚIâH` ?r’›<#Oa¹AeêÓ–HFÏ26³‹“\å99Šˆ!©N+º2˜q|Åjvs’‹ÜàYß7_BcÂèD41Œg ›ÙÇ9J΢AÊÔ¦9]éI,ÓYF"ÉâÉU,ŠJsº0œV“Ä R¸EPÜý‘ЖNŒdsù†]á"÷ÉTÂlHaªÐ–hb™Éb¶‘D HWR~QˆJÔ¢3€ñÌg+G8Í]Ò– ‚w(KujÒ€OÂçÌa Iå*7Iå¥ÒòªÒ„Žôfø’Mä$¿ó'¹Êˆ!4¤éËh¾d9›9Èï¤++ï(DijÒŠn a:sYÁöq‰T2–Só£ MéÆgÄ1Ÿíœàµ¼5¼MA*Ò˜ôd8ñ¬&™SÜ%/S˜PZA±|Åb9ÄE‚9ŸÒÔ£#ƒÉt–ó=‡ù'd±%©KQ bÊR›D2”É,%‘C\åÒ×ÕyŸPÚÑQÌd-{Há6÷ÉTO\y—bÔ -ô#ŽV‘Èa®‘®¾u¼G)êÑœOÆ4¾!™ã¤pì |ÕhIÝÁ4–±ƒÃ\âiêK”¦2Mø˜Œå+V“ÌQÎsGähä ¡!]ÂD¾bkIæWî‘­±3R‘&t¢/ã˜Å&r™<%GµGêFú3™¥lã÷ÈÚÔ»GiÒœp1•Ùlbû¹À=²}(—©F{¢H³XÏ6ŽqžÇ¤mfÞ¤µøöôe‹ÙÎ1n“©¹÷м”£& #’^Œb*óYÊ’9ÉMÒ´0ŸQ˜PZÑ…^ôe4ñ¬d;Gù§älioªÐ˜öô`“ù’lã(ÿåOr´’“¼I *S—ôcñ¬`ǸNÐZ­S€2„ÒˆÎôf,sYÇnRø/iÂà5ŠP–tg8ñ,c;ǹJš6òŸ×)F%šÒ‰>Ä0ƒ•$r ülmÕ6ŨI½Â4f³‘8Çž‘;\,)C}ÚÓ‹âYA2G¹Æs^ŒðVR‹D1Žy¬e§¹Ácr¶3Bu>¤+C™ÂbÙÇY‘»½xBmÂèÉh¦³‚uüÀIns‡LìG~ÊÒ€pú3%l`+G9Ï2ttǼCYêÉ@&2“eì`7g¸Oú¬¡E©I¢Å<¶r‚[düØýR’:´¦ØÎJ’Há>é?q.JR“p¢™ÀÖ³—3Ü"m'uEQjÓŽ.ô$–é¬á'Îs‘ ³=(LyêÑÞLd‰ì`?sƒ‡d‹ôŽQ‚J´¡?1|A_³“\ã.é»ÈW P…†tfSXÎŽsT²tõ÷T¦)øŒQÄ‘Àrvr€Kös…´ÑÎÉ˼A~ÊS›6D1‚6’ÄI~ãA{óåhJgF25ìdçxHúrž|„Иpz2”ÉÌe[8ÄnòœìíGUhM3™,b+ǸÊ3² ²Ž’„F{úÇ<¶qˆóÜ'í§bó·"Ô Q b,sÙÀ^Îr‹à3ç$Å©M8]‰e+ÙÅI.’JžÁî‘J´¤Ÿ3›•ìà87I?D¥•©EÑÄ2‹MüÄ%n’q¨ØS”j|DoÆ0Ålá(×È4L_§Òƒa$°‚dÎrƒ`¸óSˆˆb$3YO'¸IúfÊPžÆD0€±Ìa#G¸Aº‘æŠRƒ0z2–9¬'™#üN*¹bôsŠQ‡Žôg4 ¬"‰œåÙFéå„ЄÎô!Ž…,e;Ç9Ï}²ŽöÛ€âT¥9]èOóYÅ~åébÅ‹w(O#ZÉP&3ƒÕlãçyHú‹E¨DcÚÍXf±ŠíìåIÞ—Ô"‚®Œd&sYÍ·ìç É!”V|DƲˆDŽqƒ§d‹×Ó)E(-éÂ`Æ0‹õ$s‚ëüIºér‘w¡QŒfë8Â%þTD0x^íÕûwÏuÀñ÷œb«TB÷ë!GI™ 5§Ô1gèµQÇåÔ\Ž24§'vBÑ1´²¡\›fÌ=ÙÜbŽ\ʽ¹¤ •R-JêñCÿDç|žç<~üœïù¾ß¯Ïëóׇ!ÔBcÚ‘ÊÆ‘Í"J8À ª¸Äµ9!4à1ºò2CÎT øœÍ§Š¿‰É ázî£5]èÃf°œ Nð3WÍ¡My‚gI#L²˜Å<Ö±‰#ü@™!ÜJcéJ_†3‘¼N YÏ.r¸¹!Ô§ OÒ‰^ cù¬ Œ}œåOêÌó;cg¨Qd—Ñ'™Ä¦’Ïj*ØÍqª‰[ê^iEºó™d1—%”ó5UüÅMËì'éÆ@2É¥˜-ìå;.Sì>¸‡x’éA:o3“U|A%¿Rk¹¹¡%y‘Œa2sYË.*ùØ!ÜÉ£´§'CGKYÅvös’jbW†p-èHéŒa Yɾâ{®Z垈§=½È(²™O1[8Ä9γ:„Ûx˜ŽôeSYÀr¶QI5±kìhâiO/óïËÊØÉ).Ps­=AsÚОçÂ[Le‹)a3ßð#1Ÿy–ûiEgz3‘LaÅlà+ÎPc¹ç¥/ñ&ÓX@!å|I%¿Pãsï9 I ™>d0‰\Š)ãç¨UbvIà)º0€‘¼Ë,f³–=Tq…:ëí!ÚÒ•> &“l>¡”}œæêlp4'‰çèÏÆ‘E¬£‚cœ¢ŠPê»É4â1ž%ÑL&elfßs…ú MI¢+ýË|J){8Èi.S»Ìs´¤3i åm²)`;¨äWâÊ) $Ó“t2ÏG,a9ÇOÔÜäMSÚ’B:ãɧRvs–ˆÛì¿Ñ˜DRÊ;Ìd>+ˆŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠúö/÷`x^íÁA 0±{£s^°Ž%m_µð±¿töx^]ÙÓ†Ð4v[m›mÛ¶m7¶mÛ¶mÛvîdîK»ÎËÞëöœX>Àÿ/p€þå_þëø'þ‚¿âoø;~ƒßâwø=þ€?âOø3¾ƒïâ{ø>~€âGø1~‚Ÿâgø9~_âWø5Þƒ÷â}x?>€âCø0>‚âcø8>OâSø4>ƒÏâsø<¾€/âKø2¾‚¯âkø:¾oâ[ø6î‹ûáþxˆáÁxЇááx‰GáÑx þÅãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðnüˆáÀ8Šƒáà8‰CáÐ8 ‹Ãá?qxGÄ‘pdGÅÑptÇıplÇÅñp|üN€âD81N‚“âd89NSâT85NƒÓât8=΀3âL83΂³âl8;Îsâ\87΃óâ|8?.€ âB¸0þÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Áü¯â@80‚ƒâ`88CâP84ƒÃâpøOGÀq$GÁQq4ÇÀ1q,ÇÁqq<ÿ…à„8NŒ“à¤8NŽSà”8NÓà´8N3àŒ8ÎŒ³à¬8ÎŽsàœ8Îóà¼8Î à‚¸.ŒÿÆEpQ\ Ç%pI\ —ÆepY\—ÇpE\ WÆUpU\ WÇ5pM\ ׯup]\×Ç pCÜ7ÆMpSÜ 7Ç-pKÜ ·Æmp[Ü·ÇpGÜ wÆ]pWÜ wÇ=pOÜ ÷Æ}p_Ü÷Çð@<ÆCðP< Ç#ðH< Æcð?x,‡Çã x"ž„'ã)x*ž†§ãx&ž…gã9x.ž‡çãx!^„ã%x)^†—ãx%^…Wã5x-^‡×ã x#Þ„7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãø$>…Oã3ø,>‡Ïã ø"¾„/ã+ø*¾†¯ãø&¾…oã;ø.¾‡ïãø!~„ã'ø)~†Ÿãø%~…_ã7ø-~‡ßãø#þ„?ã/ø+þ†¿ãø'þ…¸ÿü×q ÁAq0‡À!q(‡Áaq8ü'þÿöïþoGÄ‘pdGÅÑptÇıplÇÅñp|üN€âD81N‚“âd89NSâT85NƒÓât8=΀3âL83΂³âl8;Îsâ\87΃óâ|8?.€ âB¸0þÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀñ <ÁCñ0<À#ñ(<Áÿà±x'à‰xžŒ§à©xžŽgà™xžçà¹xžà…x^Œ—à¥x^ŽWà•x^×àµx^7àxÞŒ·à­xÞŽwàxÞ÷à½xÞàƒø>Œà£ø>ŽOà“ø>Ïà³ø>/à‹ø¾Œ¯à«ø¾Žoà›ø¾ïà»ø¾à‡ø~ŒŸà§ø~Ž_à—ø~ßà·ø~?àøþŒ¿à¯øþŽàŸøþ=øÿí?p@ÆApP Ç!pH ‡ÆapXÿ‰Ãã8"Ž„#ã(8*ކ£ã8&Ž…cã88.އãã¿pœ'‰qœ'ÃÉq œ§Â©qœ§Ãéqœg™qœgÃÙqœç¹qœçÃùq\Â…ñ߸.Š‹áâ¸.‰KáÒ¸ .‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®‹ëáú¸nˆáƸ nŠ›áæ¸n‰[áÖ¸ n‹Ûáö¸îˆ;áθ áî¸î‰{áÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx þÅãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?Äðcü?ÅÏðsü¿Ä¯ðkü¿Åïð{üÄŸðgüÅßðwüÿÄ¿ðïÿÿ8xPPx^]ÚC´†ÐÛ¶mÛ¶mÛ¶m›mÒÆjcÛ6Ú¤6NÛô¿þsr’;‹™¹ÛÙÌb&j@@Àú(AcîÿJÔ¯<ϳñ4<ÏÀ3ñ8<OÀñ$<OÁSq?ÜÀñ <ÁCñ0<À#ñ(<Ácq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q<'À q"œ'ÁIq2œ§À)q*œ§Áiq:œgÀq&œgÁYq6œçÀ9q.œçÁyq>œÀq!\ÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuñ¼€o=/À ñ"¼/ÁKñwø{¼ /Ç?àñ ¼¯Â«ñ¼¯Ãëñ¼oÂ?áŸñf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ð/øW|ßÁ¿áßñ]|ßÇðCü?ÆOðSü ?Ç/ðKü ÿÿįñü¿ÃïñüÂá¿ñ?ø3ò­ƒà 8ŽCà8Ãà°8#àˆ8ŽŒË×ŽŠ£áè8މcáØ8ŽûÅÿ1 HÈoÃÁq‡Â¡q‡ÃáqG‘qGÃÑq DZqÇÃñqœ'‰qœ'ÃÉq œ§Â©qœ§Ãéqœg™qœgÃÙqœç¹qœçÃùq\Â…q\ÃÅq \—Â¥q\—Ãåq\W•q\WÃÕq \×µq\×ÃõqÜ7ÂqÜ7ÃÍq Üò‹ÿ¿oó׊ƒáà8‰CáÐ8 ‹Ãáð8Žˆ#áÈ8p,_;°ÿÚÑptÇıplÇÅñp|œ'ĉpbœ'ÅÉprœ§Ä©pjœ§ÅépzœgÄ™pfœgÅÙpvœçĹpnœçÅùp~\Ä…pa\ÅÅpq\—Ä¥pi\—Ååpy\WÄ•pe\WÅÕpu\×ĵpm\×Åõp}Ü7ÄpcÜ7ÅÍpsÜ·Ä­pkÜ·Åíp{ÜwÄpgÜwÅÝpwÜ÷ĽpoÜ÷Åýp<ăð`<ÅÃðp<Ä£ðh<Åãðx<OÄ“ðd<OÅÓðt<Ïijðl<Ïýâÿ$ø·Šƒáà8‰CáÐ8 ‹Ãáð8Žˆ#áÈ8 ŽŠ£áè8މcáØ8Ž‹ãáø8NˆáÄ8 NŠ“áä8N‰SáÔ8 N‹Óáô8Έ3áÌ8 Ί³áì8ΉsáÜ8΋óáü¸.ˆ á¸.Š‹áâ¸.‰KáÒ¸ .‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®‹ëáú¸nˆáƸ nŠ›áæ¸n‰[áÖ¸ n‹Ûáö¸îˆ;áθ áî¸î‰{áÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx ‹Çáñxžˆ'áÉx žŠ§áéxž‰gáÙxž‹çáùx^ˆáÅx ^Š¿Ãßãex9þÿˆWà•x^×àµx^7àxþ ÿŒ7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãø$>…Oã3ø,>‡Ïã ø"¾„/ã+ø*¾†¯ãø&¾…Á¿âÛøþ ÿŽïâ{ø>~€âGø1~‚Ÿâgø9~_âWøü'~ßà·ø~?àøþ ÿÿÁŸqàAåkÁAq0‡À!q(‡Áaq8GÀq$GÁQq4ÇÀ1q,ÇÁqq<'À q"œ'ÁIq2œ§À)q*œ§Áiq:œgÀq&œgÁYq6œçÀ9q.œçÁyq>œÀq!\ÁEq1\—À%q)\—Áeq9\WÀq%\WÁUq5\×À5q-\×Áuq=\7À q#Ü7ÁMq3Ü·À-q+Ü·Ámq;ÜwÀq'ÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀñ <ÁCñ0<À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñwø{¼ /Ç?àñ ¼¯Â«ñ¼¯Ãëñ¼oÂ?áŸñf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ð/øW|ßÁ¿áßñ]|ßÇðCü?ÆOðSü ?Ç/ðKü ÿÿįñü¿ÃïñüÂá¿ñ?ø3| üú¹‹x^í×E°—eÀáÿ½tÃ¥;”APRQJ:•TQBIéF°Pº»»»»»»»ÛÑ•<{wßosæY93ïæ…B³„…þ)}äP(â?N‡ÓâT85Nƒ“âd89NSâ88.އãã8'ĉpbœ?‰ôºŸâgø9~_âW8Äþ0Ž#áÈ8 ŽŠ£áè8މcáØx÷íÅûð~|ćða|ÅÇðq|ŸÄ§ði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?ÄðcÜwÁ]q7Ü÷À=q/Ü÷Á}q?ÜÀ?ãxþÿŠÿã?ð`ü'þ ÁCñ0<À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñ2¼¯À+ñ*¼¯Ákñ:¼oÀñ&¼oÁ[ñ6¼ïÀ;ñ.¼Ÿ ݧði|ŸÅçðy|_Ä—ðe|_Å×ðu|ßÄ·ðm|ßÅ÷ð}ü?Äðcü?ÅÏðsü¿Ä¯pˆ÷†Ãq$GÁQq4ÇÀ1q,ÇÁqq<'À8!N„ã$8)N†“ã8%N…Sã48-N‡Óã ø ü&Έ3áÌ8 ~ gÅÙpvœçĹpnœçÅùðÛ8?.€ âwp!\¿‹‹à¢ø=ü>.†‹ã¸$.…Kãpü!þ—Åãrøü).+àŠ¸®Œ?ÃUpU\ WÇ5pM\ ׯup]\×ÇŸã/pÜ7Âq܉¿Â_ãføü-nŽ[à–¸þ·Æßãpü#n‹Ûáö¸îˆ;áŸð°°×=À#ñ(<Ácñ8<OÀñ$<OÁSñ4<ÏÀ3ñ,<ÏÁsñ<</À ñ"¼/ÁKñ2¼¯À+ñ*¼¯Ákñ:¼oÀñ&¼oÁ[ñ6¼ïÀ;ñ.¼ïÁ{ñ>¼Àñ!|ÁGñ1|ŸÀ'ñ)|ŸÁgñ9|_Àñ%|_ÁWñ5|ßÀ7ñ-|ßÁwñ=|?Àñ#ü?ÁOñ3ü¿À/ñ+â†Ãq$GÁQq4ÇÀ1q,ÇÁqq<'À8!N„ã$8)N†“ã8%N…Sã48-N‡Óã ø ü&Έ3áÌ8 ~ gÅÙpvœçĹpnœçÅùðÛ8?.€ âwp!\¿‹‹à¢ø=ü>.†‹ã¸$.…Kãpü!þ—Åãrøü).+àŠ¸®Œ?ÃUpU\ WÇ5pM\ ׯup]\×ÇŸã/pÜ7Âq܉¿Â_ãføü-nŽ[à–¸þ·Æßãpü#n‹Ûáö¸îˆ;áŸpgÜwÅÝpwÜ÷ĽpoÜ÷Åýp<ÿŒâAøü+þ ÿŽÿÀƒñŸø/<ÅÃðp<Ä£ðh<Åãðx<OÄ“ðd<OÅÓðt<Ïijðl<ÏÅóð|¼/Ä‹ðb¼/ÅËðr¼¯Ä«ðj¼¯Åëðz¼oÄ›ðf¼oÅÛðv¼ïÄ»ðn¼ïÅûð~|ćða|ÅÇðq|"üßô?÷7ùoùSeurat/tests/testdata/matrix.mtx0000644000176200001440000012076214670622051016541 0ustar liggesusers%%MatrixMarket matrix coordinate integer general 240 80 4814 2 1 1 6 1 1 9 1 3 12 1 1 23 1 1 31 1 4 33 1 3 35 1 1 36 1 5 38 1 1 40 1 1 44 1 3 45 1 3 47 1 1 48 1 3 50 1 1 51 1 1 52 1 1 53 1 1 54 1 2 56 1 1 57 1 2 58 1 1 59 1 2 60 1 1 65 1 1 78 1 4 80 1 1 84 1 1 93 1 1 95 1 1 100 1 1 104 1 1 109 1 1 120 1 1 126 1 1 133 1 1 141 1 1 149 1 2 152 1 2 159 1 1 163 1 2 166 1 3 167 1 1 177 1 1 194 1 1 198 1 1 208 1 1 222 1 1 233 1 1 236 1 1 238 1 1 4 2 1 9 2 7 22 2 1 23 2 1 25 2 2 27 2 1 31 2 4 32 2 3 33 2 7 34 2 1 36 2 2 38 2 1 39 2 1 40 2 1 41 2 5 42 2 2 43 2 2 44 2 2 45 2 3 48 2 1 49 2 2 52 2 2 56 2 3 57 2 2 58 2 1 67 2 1 69 2 3 72 2 2 74 2 2 77 2 1 78 2 4 80 2 2 92 2 1 93 2 1 95 2 1 100 2 1 111 2 1 115 2 1 116 2 1 117 2 1 126 2 1 128 2 1 141 2 1 147 2 1 156 2 1 159 2 1 177 2 1 191 2 1 193 2 1 197 2 1 198 2 2 219 2 1 223 2 1 228 2 1 231 2 1 232 2 1 239 2 1 9 3 11 12 3 1 24 3 1 31 3 4 32 3 2 33 3 11 35 3 2 36 3 1 37 3 1 39 3 1 42 3 1 44 3 1 47 3 1 48 3 2 49 3 1 51 3 2 54 3 1 55 3 1 56 3 2 57 3 2 58 3 1 65 3 9 67 3 1 69 3 2 72 3 2 78 3 4 80 3 2 89 3 1 92 3 1 93 3 1 98 3 1 104 3 1 107 3 1 124 3 1 126 3 1 140 3 1 141 3 1 144 3 1 149 3 1 152 3 1 153 3 2 155 3 2 157 3 1 160 3 1 163 3 1 164 3 1 166 3 3 172 3 4 175 3 1 179 3 1 181 3 1 222 3 1 232 3 1 9 4 13 12 4 1 23 4 6 31 4 5 32 4 2 33 4 13 34 4 1 35 4 2 36 4 2 39 4 1 40 4 1 42 4 1 43 4 2 44 4 6 45 4 4 46 4 2 48 4 5 49 4 4 54 4 1 55 4 2 56 4 3 57 4 3 58 4 1 59 4 2 60 4 1 65 4 8 67 4 1 70 4 2 72 4 4 76 4 1 78 4 5 81 4 1 88 4 1 90 4 1 96 4 2 98 4 1 104 4 2 112 4 1 130 4 1 141 4 1 142 4 3 149 4 2 151 4 3 154 4 1 155 4 1 157 4 1 163 4 2 166 4 3 169 4 1 172 4 2 173 4 1 176 4 1 180 4 1 182 4 1 210 4 1 214 4 1 222 4 1 236 4 3 4 5 1 9 5 3 31 5 4 32 5 3 33 5 3 36 5 2 39 5 36 41 5 2 43 5 1 44 5 5 45 5 2 48 5 2 49 5 3 51 5 2 52 5 1 54 5 54 56 5 2 57 5 2 64 5 1 65 5 1 67 5 3 68 5 1 69 5 1 72 5 1 75 5 1 78 5 4 89 5 1 90 5 2 99 5 1 100 5 1 101 5 1 104 5 1 128 5 1 131 5 1 137 5 1 140 5 1 141 5 2 144 5 1 146 5 1 149 5 3 151 5 2 153 5 3 154 5 1 159 5 1 161 5 1 163 5 1 166 5 1 172 5 1 176 5 1 180 5 1 182 5 1 183 5 1 198 5 2 211 5 1 217 5 1 222 5 2 223 5 1 232 5 2 233 5 1 4 6 1 9 6 4 14 6 1 23 6 2 24 6 1 31 6 4 32 6 1 33 6 4 34 6 1 35 6 1 37 6 2 42 6 2 43 6 2 44 6 3 45 6 1 46 6 1 47 6 1 48 6 4 49 6 1 50 6 1 54 6 2 55 6 1 57 6 1 60 6 1 66 6 1 69 6 1 72 6 1 78 6 4 80 6 1 81 6 1 93 6 1 100 6 2 101 6 1 126 6 1 128 6 1 135 6 1 144 6 1 146 6 1 149 6 2 151 6 1 153 6 2 155 6 1 156 6 1 159 6 2 166 6 3 172 6 2 182 6 1 194 6 1 200 6 1 223 6 1 231 6 1 232 6 1 236 6 1 9 7 6 23 7 4 31 7 3 32 7 1 33 7 6 34 7 1 36 7 1 37 7 3 38 7 1 41 7 1 42 7 1 44 7 4 45 7 1 48 7 3 49 7 3 50 7 1 54 7 1 55 7 2 59 7 2 60 7 1 65 7 3 69 7 2 70 7 1 78 7 3 96 7 1 101 7 1 113 7 1 125 7 1 127 7 1 132 7 1 149 7 2 152 7 2 156 7 1 166 7 3 179 7 1 210 7 1 213 7 1 236 7 1 238 7 1 4 8 1 9 8 4 23 8 1 24 8 1 31 8 2 32 8 3 33 8 4 35 8 1 36 8 12 37 8 2 38 8 1 40 8 1 41 8 1 43 8 2 45 8 2 46 8 1 47 8 1 48 8 2 49 8 4 50 8 1 53 8 1 54 8 1 55 8 2 58 8 1 59 8 1 65 8 3 71 8 1 74 8 1 78 8 2 81 8 1 85 8 1 92 8 1 100 8 1 120 8 1 128 8 1 141 8 1 149 8 1 152 8 1 154 8 1 156 8 1 159 8 1 161 8 1 163 8 1 166 8 1 172 8 1 182 8 1 183 8 1 222 8 1 233 8 1 9 9 2 31 9 2 32 9 2 33 9 2 35 9 2 37 9 3 38 9 1 42 9 1 43 9 3 44 9 1 45 9 1 47 9 1 48 9 3 49 9 2 51 9 1 54 9 1 56 9 1 57 9 3 58 9 2 59 9 1 78 9 2 80 9 2 81 9 2 83 9 1 89 9 1 93 9 1 95 9 1 96 9 1 100 9 1 112 9 1 126 9 1 142 9 1 148 9 1 156 9 1 159 9 1 163 9 1 172 9 1 179 9 1 191 9 1 236 9 1 2 10 1 9 10 21 12 10 1 23 10 4 25 10 1 31 10 2 32 10 1 33 10 21 34 10 1 35 10 1 36 10 9 38 10 1 40 10 1 41 10 1 43 10 1 44 10 6 45 10 1 47 10 1 53 10 1 54 10 3 55 10 1 59 10 1 65 10 3 69 10 2 72 10 6 74 10 2 78 10 2 80 10 1 98 10 4 100 10 1 101 10 1 115 10 1 141 10 2 146 10 1 149 10 3 150 10 1 154 10 1 156 10 2 159 10 1 166 10 3 172 10 3 182 10 1 210 10 1 231 10 1 1 11 2 2 11 2 4 11 14 5 11 3 6 11 1 7 11 3 9 11 2 13 11 1 15 11 3 20 11 1 21 11 1 22 11 1 23 11 2 24 11 2 26 11 2 28 11 1 29 11 1 30 11 1 33 11 2 43 11 1 54 11 1 86 11 1 90 11 1 93 11 1 95 11 1 100 11 1 121 11 3 126 11 1 128 11 14 129 11 4 132 11 1 133 11 1 134 11 2 143 11 1 159 11 1 233 11 1 1 12 2 2 12 4 3 12 5 4 12 28 6 12 6 7 12 1 8 12 4 9 12 9 10 12 2 11 12 1 12 12 3 14 12 1 16 12 3 17 12 1 18 12 1 25 12 1 26 12 2 27 12 4 33 12 9 43 12 1 44 12 1 45 12 1 48 12 2 54 12 2 55 12 1 57 12 1 68 12 1 72 12 1 75 12 2 81 12 2 84 12 1 89 12 1 90 12 1 93 12 4 98 12 1 101 12 1 107 12 1 112 12 1 121 12 8 124 12 1 126 12 4 128 12 28 129 12 10 130 12 4 132 12 4 133 12 6 134 12 10 138 12 2 141 12 1 143 12 1 146 12 1 155 12 1 156 12 1 161 12 1 163 12 1 165 12 1 166 12 1 169 12 2 172 12 2 180 12 1 181 12 1 182 12 1 210 12 29 217 12 1 222 12 1 236 12 2 1 13 4 2 13 3 3 13 2 4 13 18 5 13 2 6 13 2 8 13 1 9 13 2 11 13 1 12 13 2 13 13 1 15 13 1 21 13 1 23 13 4 25 13 1 26 13 1 28 13 15 33 13 2 37 13 1 45 13 1 48 13 1 66 13 1 81 13 1 82 13 1 98 13 1 100 13 1 108 13 1 121 13 2 128 13 18 129 13 4 130 13 4 132 13 3 133 13 2 134 13 6 142 13 1 146 13 1 149 13 1 154 13 2 155 13 1 159 13 1 166 13 2 182 13 1 215 13 1 230 13 1 231 13 1 1 14 4 2 14 3 3 14 2 4 14 7 5 14 4 6 14 2 8 14 1 9 14 4 10 14 1 14 14 1 16 14 1 17 14 2 21 14 1 23 14 1 29 14 1 33 14 4 48 14 1 54 14 1 64 14 2 93 14 1 121 14 2 126 14 1 128 14 7 129 14 4 130 14 1 133 14 2 134 14 1 143 14 1 178 14 1 180 14 1 211 14 2 1 15 2 2 15 2 3 15 5 4 15 15 6 15 2 7 15 2 8 15 2 9 15 4 10 15 1 12 15 1 15 15 1 18 15 1 22 15 2 24 15 2 25 15 2 27 15 1 33 15 4 36 15 1 47 15 1 48 15 5 56 15 1 61 15 1 72 15 1 81 15 1 84 15 1 98 15 1 121 15 5 128 15 15 129 15 8 132 15 4 133 15 2 134 15 5 138 15 1 142 15 2 144 15 1 152 15 1 153 15 2 154 15 1 155 15 1 156 15 2 166 15 1 182 15 1 194 15 1 196 15 1 198 15 1 222 15 1 231 15 1 236 15 1 1 16 3 2 16 3 3 16 8 4 16 28 6 16 8 8 16 2 10 16 1 12 16 2 14 16 3 15 16 1 17 16 1 19 16 1 20 16 1 25 16 3 27 16 1 30 16 1 32 16 2 37 16 1 47 16 1 56 16 1 61 16 1 71 16 1 72 16 1 79 16 1 101 16 1 121 16 9 124 16 4 128 16 28 129 16 23 130 16 8 132 16 8 133 16 8 134 16 16 140 16 3 141 16 2 146 16 1 149 16 2 156 16 5 158 16 1 164 16 1 172 16 1 176 16 1 194 16 1 198 16 2 228 16 1 233 16 2 1 17 3 2 17 1 3 17 1 4 17 7 5 17 3 6 17 2 7 17 2 8 17 1 9 17 3 11 17 1 12 17 2 13 17 1 19 17 2 20 17 1 23 17 4 26 17 1 30 17 1 33 17 3 44 17 2 45 17 1 58 17 1 67 17 2 100 17 1 101 17 1 107 17 1 124 17 1 128 17 7 129 17 7 130 17 1 132 17 1 133 17 2 134 17 5 138 17 1 149 17 4 159 17 1 182 17 1 233 17 1 1 18 4 2 18 2 3 18 5 4 18 26 5 18 3 6 18 2 7 18 1 8 18 2 9 18 6 11 18 1 13 18 2 16 18 1 18 18 1 19 18 1 20 18 1 22 18 2 23 18 2 25 18 1 27 18 1 28 18 23 29 18 1 33 18 6 45 18 3 48 18 1 49 18 1 61 18 1 64 18 1 66 18 1 72 18 1 81 18 1 93 18 1 100 18 2 121 18 5 124 18 1 126 18 1 128 18 26 130 18 5 132 18 2 133 18 2 134 18 11 138 18 1 140 18 1 143 18 2 154 18 1 159 18 2 172 18 1 175 18 1 183 18 1 190 18 1 211 18 1 229 18 1 1 19 2 2 19 2 3 19 5 4 19 10 5 19 3 6 19 1 7 19 1 9 19 5 10 19 1 12 19 1 13 19 2 14 19 1 17 19 1 21 19 1 22 19 1 23 19 6 24 19 1 26 19 1 33 19 5 36 19 1 44 19 1 45 19 1 47 19 1 49 19 1 56 19 1 62 19 1 63 19 1 90 19 1 93 19 1 98 19 1 102 19 1 121 19 1 126 19 1 128 19 10 129 19 4 132 19 2 133 19 1 134 19 5 135 19 1 143 19 1 151 19 1 154 19 1 166 19 2 180 19 1 221 19 1 228 19 1 231 19 1 233 19 1 1 20 3 2 20 5 3 20 12 4 20 16 5 20 2 6 20 2 7 20 2 8 20 1 9 20 7 11 20 1 16 20 2 18 20 3 19 20 1 23 20 2 24 20 1 25 20 1 26 20 1 30 20 1 33 20 7 37 20 1 41 20 1 45 20 1 49 20 1 56 20 1 75 20 1 80 20 2 81 20 1 98 20 1 100 20 2 121 20 5 124 20 1 128 20 16 129 20 6 130 20 1 132 20 4 133 20 2 134 20 8 135 20 1 143 20 1 144 20 1 149 20 1 152 20 1 159 20 2 166 20 3 196 20 1 4 21 7 7 21 1 9 21 1 23 21 3 33 21 1 36 21 1 44 21 1 49 21 1 50 21 1 64 21 2 68 21 1 81 21 1 90 21 2 91 21 18 92 21 30 93 21 50 94 21 1 95 21 10 96 21 14 97 21 3 98 21 3 99 21 4 100 21 15 101 21 1 104 21 2 105 21 1 107 21 1 108 21 1 109 21 2 110 21 1 111 21 3 112 21 5 113 21 12 115 21 2 119 21 1 120 21 5 125 21 12 126 21 50 128 21 7 130 21 1 134 21 2 135 21 13 136 21 4 140 21 2 146 21 1 147 21 4 151 21 3 152 21 5 153 21 6 154 21 1 156 21 4 157 21 3 158 21 6 159 21 15 160 21 1 161 21 1 163 21 2 164 21 6 166 21 6 170 21 1 172 21 6 173 21 1 177 21 2 178 21 1 182 21 4 186 21 1 198 21 1 211 21 2 212 21 1 217 21 1 218 21 1 222 21 1 4 22 22 6 22 3 8 22 1 32 22 2 44 22 2 54 22 2 64 22 1 70 22 1 74 22 1 76 22 1 82 22 1 91 22 5 92 22 12 93 22 29 94 22 2 95 22 6 96 22 13 97 22 2 98 22 13 99 22 7 100 22 9 101 22 2 103 22 1 104 22 14 105 22 1 106 22 1 107 22 3 108 22 1 109 22 27 110 22 1 111 22 4 112 22 1 113 22 6 116 22 4 118 22 1 120 22 3 121 22 13 124 22 4 125 22 6 126 22 29 128 22 22 129 22 18 130 22 5 131 22 1 132 22 8 133 22 3 134 22 12 135 22 28 138 22 2 140 22 3 144 22 1 146 22 3 147 22 1 148 22 7 151 22 6 152 22 7 153 22 5 155 22 1 156 22 15 158 22 4 159 22 9 160 22 5 161 22 1 163 22 10 164 22 3 165 22 1 166 22 4 167 22 2 170 22 1 171 22 1 172 22 15 173 22 1 174 22 2 176 22 1 177 22 1 180 22 1 182 22 5 198 22 1 211 22 1 231 22 2 3 23 1 7 23 1 12 23 1 13 23 1 74 23 1 75 23 1 91 23 25 92 23 51 93 23 25 94 23 2 95 23 5 96 23 3 98 23 5 99 23 1 100 23 1 101 23 6 102 23 1 104 23 10 105 23 1 107 23 1 111 23 2 113 23 2 114 23 1 118 23 1 121 23 2 124 23 1 125 23 2 126 23 25 129 23 1 132 23 1 134 23 1 135 23 15 137 23 1 140 23 1 141 23 1 147 23 1 148 23 1 151 23 1 152 23 6 153 23 1 155 23 1 156 23 8 159 23 1 163 23 4 164 23 4 172 23 2 174 23 4 177 23 1 180 23 1 182 23 3 198 23 2 4 24 10 8 24 1 9 24 1 24 24 1 33 24 1 44 24 2 74 24 1 91 24 5 92 24 22 93 24 49 94 24 4 95 24 9 96 24 10 99 24 6 100 24 5 103 24 4 104 24 8 107 24 2 108 24 1 109 24 1 110 24 2 111 24 1 113 24 1 114 24 1 115 24 1 116 24 4 121 24 1 124 24 1 125 24 1 126 24 49 128 24 10 129 24 2 132 24 1 134 24 5 135 24 11 140 24 6 142 24 1 146 24 3 148 24 1 151 24 4 152 24 5 153 24 5 154 24 1 156 24 5 158 24 2 159 24 5 163 24 2 164 24 6 172 24 4 177 24 1 182 24 5 195 24 3 198 24 3 237 24 1 1 25 1 4 25 6 9 25 1 13 25 1 31 25 1 32 25 1 33 25 1 42 25 1 44 25 1 45 25 3 48 25 1 54 25 1 56 25 1 58 25 1 61 25 1 66 25 1 72 25 3 74 25 1 78 25 1 81 25 1 91 25 25 92 25 85 93 25 98 94 25 1 95 25 7 96 25 16 97 25 1 98 25 11 99 25 5 100 25 7 101 25 36 102 25 2 103 25 1 104 25 11 105 25 1 106 25 1 108 25 1 109 25 1 110 25 1 111 25 1 112 25 1 113 25 6 114 25 2 115 25 14 116 25 4 117 25 1 119 25 1 120 25 3 125 25 6 126 25 98 128 25 6 131 25 2 134 25 1 135 25 13 140 25 5 141 25 2 142 25 2 143 25 2 146 25 1 147 25 1 148 25 1 151 25 8 152 25 4 153 25 3 154 25 2 156 25 4 157 25 3 159 25 7 163 25 2 164 25 1 165 25 1 166 25 1 168 25 1 169 25 2 172 25 7 177 25 1 181 25 1 182 25 12 183 25 1 198 25 5 210 25 1 212 25 1 239 25 1 36 26 1 91 26 6 92 26 3 93 26 11 95 26 1 96 26 4 99 26 1 100 26 3 101 26 1 102 26 1 103 26 1 104 26 4 105 26 1 107 26 1 108 26 1 109 26 1 112 26 1 114 26 2 115 26 1 116 26 1 117 26 1 119 26 1 121 26 1 126 26 11 129 26 3 135 26 7 136 26 1 140 26 1 146 26 1 151 26 3 152 26 3 153 26 2 156 26 2 159 26 3 160 26 2 163 26 2 164 26 2 166 26 1 172 26 3 177 26 1 182 26 1 191 26 1 198 26 1 237 26 1 4 27 4 6 27 1 23 27 1 38 27 1 44 27 1 48 27 1 58 27 1 64 27 1 72 27 1 82 27 1 91 27 24 92 27 54 93 27 59 94 27 1 95 27 1 96 27 13 97 27 1 98 27 2 99 27 6 100 27 4 101 27 5 102 27 4 103 27 7 104 27 6 105 27 1 106 27 1 110 27 1 114 27 1 115 27 2 116 27 3 117 27 3 119 27 1 120 27 1 126 27 59 128 27 4 133 27 1 134 27 3 135 27 37 140 27 3 142 27 1 146 27 1 147 27 5 148 27 2 151 27 5 152 27 1 153 27 1 156 27 8 157 27 1 158 27 1 159 27 4 160 27 4 163 27 1 164 27 4 171 27 1 172 27 6 174 27 3 177 27 1 180 27 1 182 27 15 183 27 1 198 27 2 206 27 1 211 27 1 215 27 1 225 27 1 228 27 1 236 27 1 3 28 1 4 28 3 24 28 1 48 28 1 56 28 1 58 28 1 91 28 40 92 28 55 93 28 28 94 28 1 95 28 2 96 28 12 98 28 3 99 28 4 100 28 4 102 28 1 103 28 1 104 28 7 105 28 1 106 28 2 107 28 1 111 28 2 114 28 3 117 28 2 118 28 2 120 28 5 126 28 28 128 28 3 129 28 1 131 28 1 135 28 5 140 28 1 141 28 1 142 28 1 147 28 1 152 28 2 153 28 1 154 28 1 156 28 2 157 28 1 159 28 4 160 28 1 163 28 6 164 28 4 166 28 1 168 28 2 170 28 1 178 28 1 182 28 2 193 28 1 228 28 1 231 28 1 233 28 1 4 29 7 6 29 1 8 29 2 39 29 1 43 29 1 59 29 1 61 29 1 72 29 1 79 29 1 80 29 1 91 29 16 92 29 35 93 29 34 94 29 3 95 29 8 96 29 19 97 29 1 98 29 5 99 29 5 100 29 11 101 29 3 102 29 1 103 29 1 104 29 22 107 29 1 108 29 2 109 29 1 110 29 2 111 29 15 112 29 2 113 29 5 115 29 1 116 29 2 117 29 1 121 29 7 124 29 1 125 29 5 126 29 34 128 29 7 129 29 7 131 29 1 132 29 4 133 29 1 134 29 5 135 29 20 136 29 2 137 29 1 140 29 4 141 29 2 142 29 1 143 29 1 146 29 2 148 29 2 149 29 3 151 29 7 152 29 10 153 29 6 154 29 2 155 29 2 156 29 11 157 29 1 158 29 3 159 29 11 160 29 2 162 29 1 163 29 5 164 29 9 166 29 3 167 29 1 170 29 1 171 29 3 172 29 4 174 29 1 175 29 2 182 29 3 191 29 1 193 29 1 198 29 3 225 29 1 227 29 1 228 29 1 2 30 1 4 30 13 9 30 1 13 30 1 25 30 1 33 30 1 36 30 1 37 30 1 45 30 1 48 30 1 51 30 1 54 30 3 64 30 1 70 30 1 81 30 1 84 30 1 88 30 1 91 30 11 92 30 17 93 30 16 95 30 7 96 30 12 98 30 10 99 30 1 100 30 7 101 30 5 103 30 2 104 30 37 106 30 1 107 30 3 108 30 1 109 30 1 110 30 1 111 30 2 112 30 1 113 30 2 114 30 1 115 30 2 118 30 5 120 30 4 121 30 6 124 30 2 125 30 2 126 30 16 128 30 13 129 30 7 130 30 1 132 30 1 134 30 3 135 30 18 136 30 3 140 30 2 141 30 1 146 30 3 147 30 2 148 30 1 149 30 3 151 30 13 152 30 12 153 30 4 156 30 18 157 30 1 158 30 3 159 30 7 160 30 7 161 30 1 163 30 6 164 30 8 166 30 6 168 30 2 172 30 20 174 30 3 175 30 1 176 30 1 177 30 2 180 30 1 182 30 1 186 30 2 187 30 1 198 30 2 203 30 1 206 30 1 210 30 1 211 30 1 232 30 1 237 30 2 2 31 1 9 31 1 22 31 1 32 31 1 33 31 1 36 31 2 39 31 1 47 31 1 48 31 2 54 31 1 57 31 3 61 31 1 62 31 1 64 31 35 68 31 4 80 31 1 84 31 1 91 31 1 96 31 3 101 31 1 104 31 3 129 31 2 135 31 1 140 31 1 141 31 3 146 31 1 149 31 1 152 31 1 154 31 2 155 31 1 156 31 3 161 31 6 163 31 6 164 31 8 166 31 8 176 31 2 183 31 2 193 31 1 201 31 1 211 31 35 212 31 27 213 31 2 214 31 35 215 31 5 216 31 7 217 31 4 218 31 5 219 31 14 221 31 1 222 31 1 225 31 4 226 31 2 227 31 1 228 31 1 229 31 1 230 31 3 231 31 2 232 31 3 233 31 3 235 31 4 236 31 7 237 31 1 239 31 3 4 32 1 24 32 1 31 32 7 35 32 2 48 32 2 49 32 1 62 32 3 64 32 14 65 32 2 68 32 4 69 32 1 70 32 2 72 32 2 78 32 7 80 32 1 84 32 1 87 32 1 98 32 1 104 32 4 121 32 1 128 32 1 129 32 4 132 32 1 134 32 2 140 32 2 145 32 1 149 32 4 153 32 1 157 32 1 161 32 2 166 32 2 172 32 1 174 32 1 177 32 2 182 32 1 183 32 1 211 32 14 212 32 2 213 32 5 215 32 3 217 32 4 218 32 3 219 32 1 220 32 3 221 32 3 222 32 1 223 32 4 224 32 1 226 32 1 228 32 1 231 32 2 232 32 1 234 32 1 235 32 1 236 32 3 239 32 5 2 33 2 26 33 1 32 33 1 54 33 1 57 33 1 62 33 2 64 33 12 68 33 2 70 33 5 74 33 1 77 33 1 82 33 1 84 33 1 87 33 1 93 33 1 96 33 4 100 33 1 104 33 9 126 33 1 141 33 1 142 33 1 149 33 5 153 33 2 154 33 1 155 33 1 159 33 1 161 33 2 164 33 3 166 33 3 172 33 1 177 33 1 179 33 1 211 33 12 212 33 1 213 33 3 214 33 15 215 33 9 216 33 1 217 33 2 218 33 1 219 33 4 220 33 5 221 33 2 222 33 2 223 33 2 224 33 1 226 33 1 227 33 1 228 33 1 230 33 4 231 33 1 232 33 1 233 33 2 234 33 3 236 33 2 237 33 58 238 33 1 239 33 1 9 34 1 24 34 1 32 34 1 33 34 1 44 34 2 48 34 2 49 34 1 54 34 15 55 34 1 56 34 1 57 34 1 59 34 1 62 34 3 64 34 30 65 34 5 68 34 7 69 34 2 70 34 14 71 34 1 74 34 1 80 34 1 87 34 1 90 34 2 92 34 1 96 34 3 98 34 1 99 34 2 104 34 6 107 34 1 121 34 2 134 34 1 140 34 1 142 34 1 146 34 4 149 34 1 154 34 1 161 34 1 164 34 1 166 34 5 173 34 1 176 34 1 211 34 30 212 34 10 213 34 4 214 34 3 215 34 2 216 34 1 217 34 7 219 34 9 220 34 7 221 34 3 222 34 2 223 34 1 224 34 1 225 34 3 226 34 1 227 34 1 228 34 1 231 34 1 232 34 3 233 34 1 234 34 2 235 34 1 238 34 2 239 34 3 4 35 1 12 35 1 26 35 1 39 35 1 44 35 2 57 35 1 62 35 2 64 35 20 65 35 4 68 35 2 69 35 1 72 35 1 80 35 1 83 35 2 90 35 2 92 35 1 93 35 2 96 35 6 104 35 1 120 35 1 124 35 1 126 35 2 128 35 1 140 35 2 141 35 3 142 35 1 146 35 1 148 35 1 149 35 1 153 35 1 164 35 2 166 35 2 173 35 1 211 35 20 212 35 8 213 35 10 214 35 29 215 35 6 217 35 2 218 35 3 219 35 7 220 35 1 221 35 2 222 35 4 223 35 1 228 35 1 229 35 2 230 35 1 231 35 1 233 35 1 236 35 1 238 35 1 240 35 10 12 36 1 14 36 1 23 36 1 42 36 1 51 36 1 57 36 3 62 36 4 64 36 27 67 36 2 68 36 4 69 36 1 70 36 29 74 36 2 75 36 1 81 36 1 90 36 1 91 36 1 96 36 7 98 36 1 104 36 3 116 36 1 151 36 1 154 36 1 161 36 1 164 36 5 166 36 1 176 36 1 186 36 1 211 36 27 212 36 5 213 36 8 214 36 11 215 36 3 216 36 1 217 36 4 218 36 1 219 36 10 221 36 4 222 36 1 223 36 2 225 36 1 227 36 1 229 36 1 230 36 2 231 36 1 232 36 2 233 36 3 236 36 3 237 36 1 238 36 3 4 37 1 31 37 1 44 37 1 51 37 1 56 37 1 57 37 4 59 37 2 61 37 1 62 37 8 64 37 28 68 37 3 69 37 1 70 37 1 72 37 1 78 37 1 81 37 1 88 37 2 90 37 1 92 37 1 96 37 3 100 37 1 101 37 1 103 37 1 104 37 14 120 37 1 121 37 1 128 37 1 135 37 1 140 37 1 142 37 1 146 37 4 149 37 1 153 37 1 156 37 1 158 37 1 159 37 1 161 37 2 163 37 1 164 37 6 165 37 1 166 37 5 172 37 1 176 37 3 179 37 1 182 37 2 183 37 1 210 37 2 211 37 28 212 37 10 213 37 12 214 37 22 215 37 6 216 37 5 217 37 3 218 37 1 219 37 10 220 37 3 221 37 8 223 37 3 224 37 1 225 37 7 226 37 1 227 37 2 228 37 1 229 37 1 230 37 3 231 37 3 232 37 2 233 37 1 235 37 4 236 37 3 238 37 2 239 37 1 4 38 1 25 38 1 32 38 2 38 38 1 48 38 1 55 38 1 57 38 2 61 38 1 62 38 6 64 38 10 68 38 3 69 38 2 70 38 7 74 38 1 80 38 1 81 38 1 83 38 3 90 38 1 93 38 1 95 38 1 96 38 4 101 38 1 104 38 2 109 38 1 120 38 1 126 38 1 128 38 1 135 38 1 140 38 2 141 38 1 142 38 1 146 38 1 153 38 1 154 38 1 161 38 1 163 38 1 164 38 6 166 38 1 176 38 1 183 38 1 193 38 1 211 38 10 212 38 7 213 38 10 214 38 15 215 38 8 216 38 4 217 38 3 218 38 2 219 38 2 220 38 1 221 38 6 222 38 2 223 38 2 225 38 4 227 38 2 229 38 1 233 38 2 235 38 2 236 38 5 237 38 2 238 38 1 239 38 2 240 38 1 14 39 1 23 39 4 31 39 1 48 39 3 49 39 1 57 39 1 61 39 1 62 39 1 64 39 25 67 39 1 68 39 2 69 39 1 70 39 5 72 39 1 74 39 1 78 39 1 81 39 2 90 39 1 96 39 5 101 39 1 104 39 1 120 39 2 134 39 1 142 39 1 155 39 1 156 39 1 161 39 2 164 39 1 165 39 1 166 39 3 176 39 1 182 39 1 183 39 1 211 39 25 212 39 4 213 39 3 214 39 18 215 39 2 216 39 1 217 39 2 218 39 1 219 39 4 221 39 1 222 39 1 223 39 2 224 39 1 226 39 1 227 39 1 228 39 1 230 39 1 231 39 3 232 39 1 233 39 1 234 39 1 235 39 1 237 39 1 238 39 2 26 40 1 35 40 2 47 40 1 48 40 1 54 40 1 55 40 1 57 40 1 62 40 11 64 40 27 65 40 7 67 40 1 68 40 5 70 40 25 72 40 2 74 40 1 75 40 1 80 40 1 81 40 1 83 40 2 84 40 2 89 40 1 96 40 15 99 40 1 100 40 4 104 40 4 137 40 1 140 40 1 141 40 3 142 40 1 146 40 1 154 40 2 155 40 1 156 40 1 159 40 4 161 40 6 164 40 6 166 40 2 176 40 2 179 40 3 196 40 1 198 40 2 210 40 1 211 40 27 212 40 11 213 40 13 214 40 18 215 40 5 216 40 1 217 40 5 218 40 1 219 40 7 220 40 2 221 40 11 222 40 3 223 40 6 224 40 51 225 40 3 226 40 1 228 40 25 229 40 3 231 40 1 232 40 1 233 40 2 234 40 2 235 40 2 236 40 1 238 40 1 239 40 2 240 40 1 23 41 7 32 41 1 44 41 2 45 41 2 48 41 1 49 41 1 50 41 1 54 41 2 57 41 2 62 41 1 63 41 1 64 41 31 65 41 8 68 41 2 69 41 1 71 41 1 72 41 1 73 41 1 74 41 1 75 41 1 76 41 1 81 41 1 84 41 1 85 41 1 87 41 1 90 41 2 96 41 2 98 41 5 100 41 1 101 41 1 104 41 1 122 41 1 140 41 2 141 41 1 145 41 1 153 41 3 155 41 1 157 41 1 159 41 1 161 41 2 163 41 1 164 41 3 166 41 7 172 41 1 198 41 1 210 41 1 211 41 31 212 41 3 213 41 1 214 41 10 215 41 4 217 41 2 218 41 3 219 41 6 220 41 6 221 41 1 222 41 1 223 41 2 225 41 1 226 41 1 227 41 1 228 41 1 232 41 2 239 41 3 9 42 1 23 42 1 31 42 2 33 42 1 36 42 1 44 42 1 45 42 2 54 42 1 57 42 1 59 42 1 61 42 1 62 42 4 64 42 22 65 42 5 66 42 1 67 42 1 68 42 3 69 42 1 70 42 14 72 42 2 75 42 2 78 42 2 79 42 1 80 42 1 81 42 2 82 42 1 83 42 1 84 42 1 85 42 1 88 42 1 90 42 1 93 42 1 98 42 1 100 42 1 101 42 1 104 42 3 111 42 1 126 42 1 129 42 4 130 42 1 138 42 1 141 42 1 144 42 1 153 42 1 154 42 1 155 42 1 156 42 1 159 42 1 166 42 4 172 42 2 179 42 1 193 42 1 206 42 1 211 42 22 213 42 8 215 42 1 217 42 3 219 42 13 221 42 4 223 42 1 231 42 1 232 42 1 233 42 2 234 42 1 235 42 1 236 42 2 237 42 1 238 42 1 9 43 1 23 43 3 31 43 3 33 43 1 36 43 3 44 43 4 49 43 2 54 43 3 55 43 1 56 43 1 57 43 4 61 43 1 62 43 1 63 43 2 64 43 7 65 43 5 67 43 1 68 43 1 69 43 2 70 43 27 71 43 1 72 43 1 74 43 2 77 43 3 78 43 3 80 43 3 81 43 1 85 43 1 86 43 1 89 43 1 90 43 2 93 43 1 96 43 1 98 43 1 107 43 1 113 43 1 125 43 1 126 43 1 137 43 1 146 43 1 154 43 1 156 43 3 157 43 1 166 43 2 211 43 7 213 43 2 217 43 1 221 43 1 227 43 1 231 43 2 236 43 1 9 44 1 22 44 1 33 44 1 36 44 1 45 44 1 48 44 1 54 44 1 61 44 1 62 44 2 63 44 1 64 44 2 67 44 2 68 44 1 70 44 3 72 44 1 74 44 1 75 44 1 81 44 1 82 44 1 84 44 1 86 44 1 88 44 1 89 44 1 96 44 1 149 44 2 166 44 2 180 44 1 182 44 1 193 44 1 211 44 2 213 44 1 214 44 3 217 44 1 221 44 2 236 44 1 238 44 1 9 45 7 12 45 1 23 45 6 24 45 1 25 45 1 31 45 3 33 45 7 36 45 1 42 45 1 44 45 4 46 45 1 48 45 2 49 45 1 57 45 2 62 45 1 63 45 2 64 45 4 65 45 7 67 45 47 69 45 1 70 45 13 72 45 1 73 45 1 75 45 1 76 45 1 77 45 1 78 45 3 80 45 1 81 45 1 84 45 1 86 45 1 87 45 2 88 45 1 89 45 2 90 45 2 100 45 1 101 45 2 121 45 1 129 45 1 152 45 2 153 45 1 155 45 1 159 45 1 163 45 1 166 45 5 167 45 1 172 45 5 182 45 1 211 45 4 221 45 1 223 45 1 224 45 1 4 46 1 9 46 1 23 46 1 26 46 3 31 46 15 33 46 1 36 46 1 43 46 1 44 46 4 49 46 2 54 46 1 58 46 2 62 46 2 64 46 14 65 46 1 68 46 2 69 46 2 70 46 17 71 46 1 72 46 2 75 46 1 77 46 3 78 46 15 82 46 1 84 46 1 86 46 2 87 46 1 90 46 1 121 46 3 128 46 1 129 46 2 132 46 1 134 46 3 149 46 1 154 46 1 155 46 1 163 46 1 166 46 1 172 46 1 177 46 1 211 46 14 215 46 2 217 46 2 221 46 2 231 46 1 236 46 2 4 47 1 31 47 1 32 47 1 35 47 2 43 47 1 48 47 2 54 47 1 61 47 1 62 47 2 64 47 16 65 47 6 66 47 1 67 47 1 68 47 8 69 47 1 70 47 7 72 47 4 74 47 1 76 47 1 77 47 3 78 47 1 81 47 1 83 47 1 84 47 1 95 47 1 98 47 1 101 47 1 104 47 1 128 47 1 141 47 2 146 47 1 154 47 2 157 47 1 161 47 1 166 47 1 176 47 1 177 47 1 182 47 1 211 47 16 212 47 6 214 47 4 215 47 9 217 47 8 219 47 6 220 47 10 221 47 2 222 47 1 223 47 3 232 47 1 236 47 2 237 47 1 238 47 1 239 47 3 4 48 1 9 48 1 14 48 1 23 48 1 31 48 3 33 48 1 36 48 2 37 48 1 42 48 1 45 48 1 48 48 3 49 48 1 54 48 1 62 48 1 63 48 2 64 48 4 65 48 7 66 48 1 67 48 1 68 48 4 69 48 1 70 48 3 71 48 1 72 48 1 74 48 1 75 48 1 78 48 3 79 48 1 80 48 7 81 48 2 82 48 1 83 48 4 87 48 1 88 48 1 90 48 1 93 48 1 107 48 1 116 48 1 126 48 1 128 48 1 135 48 1 141 48 1 144 48 1 146 48 1 149 48 1 153 48 1 154 48 2 163 48 1 166 48 4 176 48 1 182 48 2 211 48 4 213 48 3 214 48 1 217 48 4 221 48 1 222 48 1 223 48 2 229 48 1 233 48 1 238 48 2 239 48 1 9 49 5 31 49 6 33 49 5 39 49 2 49 49 5 61 49 39 62 49 5 64 49 29 65 49 6 66 49 1 67 49 1 68 49 5 69 49 1 70 49 16 71 49 1 72 49 2 73 49 1 74 49 17 75 49 1 78 49 6 79 49 1 82 49 1 83 49 1 84 49 1 88 49 1 90 49 2 98 49 1 103 49 1 104 49 1 120 49 1 121 49 1 140 49 1 141 49 1 149 49 3 153 49 2 154 49 1 155 49 1 156 49 2 166 49 1 172 49 2 179 49 1 198 49 1 210 49 1 211 49 29 212 49 2 213 49 3 214 49 3 215 49 3 217 49 5 219 49 5 220 49 9 221 49 5 227 49 1 232 49 1 234 49 1 236 49 1 239 49 3 9 50 3 23 50 1 31 50 4 32 50 1 33 50 3 36 50 2 37 50 1 44 50 2 48 50 1 49 50 2 54 50 1 55 50 3 57 50 1 59 50 1 60 50 1 62 50 1 63 50 3 64 50 8 65 50 1 66 50 1 67 50 1 68 50 2 69 50 1 70 50 12 72 50 4 73 50 1 78 50 4 79 50 2 80 50 1 81 50 2 83 50 1 85 50 13 89 50 1 95 50 2 141 50 1 146 50 2 153 50 1 154 50 1 156 50 1 166 50 2 167 50 1 211 50 8 213 50 2 217 50 2 219 50 3 221 50 1 223 50 1 235 50 1 236 50 1 238 50 1 2 51 1 4 51 10 9 51 1 15 51 1 24 51 1 33 51 1 38 51 1 42 51 1 45 51 1 50 51 1 56 51 1 59 51 1 64 51 5 70 51 3 72 51 2 75 51 1 91 51 2 92 51 20 93 51 41 95 51 13 96 51 11 98 51 2 99 51 6 100 51 8 101 51 2 102 51 1 103 51 4 104 51 5 109 51 1 111 51 4 113 51 3 115 51 3 116 51 2 118 51 1 119 51 1 121 51 12 124 51 1 125 51 3 126 51 41 128 51 10 129 51 8 132 51 4 134 51 8 135 51 16 140 51 4 141 51 3 142 51 1 146 51 9 147 51 2 148 51 2 149 51 3 151 51 15 152 51 7 153 51 8 154 51 2 156 51 21 157 51 2 158 51 2 159 51 8 160 51 5 162 51 1 163 51 17 164 51 12 166 51 5 168 51 3 170 51 2 171 51 1 172 51 9 173 51 2 174 51 6 176 51 1 177 51 2 178 51 1 182 51 5 183 51 2 193 51 1 194 51 1 198 51 1 211 51 5 225 51 1 228 51 2 4 52 10 6 52 1 9 52 2 23 52 1 32 52 2 33 52 2 40 52 1 45 52 1 48 52 2 51 52 1 54 52 1 58 52 1 59 52 1 64 52 3 67 52 2 70 52 1 72 52 1 81 52 1 87 52 1 90 52 1 91 52 2 92 52 6 93 52 4 95 52 7 96 52 21 98 52 2 99 52 5 100 52 8 101 52 4 104 52 12 109 52 1 110 52 1 111 52 5 115 52 2 116 52 2 120 52 2 121 52 4 126 52 4 128 52 10 129 52 3 130 52 2 132 52 5 133 52 1 134 52 4 135 52 32 140 52 1 141 52 3 142 52 1 146 52 3 148 52 1 149 52 1 151 52 17 152 52 12 153 52 8 154 52 2 155 52 1 156 52 25 157 52 3 158 52 1 159 52 8 160 52 3 161 52 5 162 52 1 163 52 13 164 52 12 165 52 2 166 52 10 167 52 2 168 52 3 169 52 5 170 52 4 171 52 2 172 52 20 173 52 3 174 52 4 175 52 5 176 52 6 177 52 2 179 52 26 182 52 3 193 52 1 196 52 1 198 52 2 210 52 1 211 52 3 212 52 1 230 52 1 237 52 1 238 52 1 2 53 1 4 53 4 6 53 1 38 53 1 44 53 1 59 53 1 74 53 1 92 53 1 93 53 3 95 53 5 96 53 2 98 53 2 99 53 1 100 53 7 103 53 1 104 53 4 109 53 1 110 53 1 111 53 2 114 53 1 121 53 2 126 53 3 128 53 4 129 53 5 133 53 1 135 53 7 140 53 2 146 53 1 147 53 1 148 53 3 151 53 8 152 53 7 153 53 6 154 53 1 156 53 6 157 53 16 158 53 1 159 53 7 160 53 4 161 53 1 162 53 3 163 53 1 164 53 2 165 53 1 166 53 1 167 53 2 169 53 1 170 53 2 172 53 9 174 53 1 178 53 1 180 53 1 191 53 1 228 53 1 2 54 1 4 54 1 8 54 1 23 54 1 45 54 1 91 54 4 93 54 3 95 54 1 96 54 5 99 54 1 100 54 3 101 54 1 104 54 2 115 54 1 120 54 1 121 54 1 126 54 3 128 54 1 129 54 2 131 54 1 135 54 9 141 54 1 142 54 1 147 54 1 151 54 11 152 54 6 153 54 2 156 54 10 158 54 1 159 54 3 160 54 1 161 54 2 163 54 2 164 54 4 166 54 4 167 54 1 168 54 1 170 54 1 171 54 1 172 54 3 176 54 1 177 54 2 180 54 1 215 54 1 225 54 1 2 55 2 4 55 6 6 55 2 8 55 1 9 55 1 12 55 1 15 55 1 22 55 1 33 55 1 37 55 1 45 55 1 48 55 2 72 55 2 74 55 1 91 55 3 92 55 10 93 55 14 95 55 4 96 55 21 98 55 2 99 55 6 100 55 10 101 55 2 103 55 1 104 55 16 105 55 2 106 55 1 107 55 2 109 55 3 110 55 1 112 55 1 115 55 3 116 55 4 117 55 2 118 55 1 120 55 1 121 55 5 126 55 14 128 55 6 129 55 3 132 55 3 133 55 2 134 55 7 135 55 11 140 55 1 141 55 2 146 55 4 147 55 2 151 55 18 152 55 32 153 55 9 154 55 50 155 55 3 156 55 26 157 55 1 158 55 3 159 55 10 160 55 11 161 55 14 163 55 9 164 55 35 165 55 3 166 55 17 167 55 1 168 55 2 169 55 2 170 55 1 172 55 6 173 55 6 174 55 4 175 55 4 176 55 1 177 55 2 178 55 1 179 55 2 180 55 2 182 55 1 193 55 1 226 55 1 233 55 1 236 55 2 237 55 2 2 56 2 4 56 28 7 56 1 9 56 1 22 56 1 32 56 1 33 56 1 43 56 2 44 56 2 47 56 2 54 56 1 56 56 1 87 56 1 90 56 2 92 56 4 93 56 17 94 56 1 95 56 3 96 56 13 98 56 1 99 56 4 100 56 15 101 56 3 104 56 10 107 56 2 109 56 6 110 56 2 111 56 5 115 56 1 116 56 2 118 56 1 120 56 3 121 56 5 124 56 4 126 56 17 128 56 28 129 56 7 130 56 1 132 56 3 134 56 7 135 56 17 140 56 5 141 56 2 144 56 1 146 56 2 147 56 3 148 56 1 149 56 1 151 56 13 152 56 33 153 56 9 154 56 1 155 56 3 156 56 26 157 56 11 158 56 4 159 56 15 160 56 9 161 56 4 162 56 1 163 56 12 164 56 16 165 56 4 166 56 8 168 56 1 169 56 4 170 56 3 171 56 3 172 56 9 174 56 3 176 56 2 177 56 1 178 56 6 179 56 2 180 56 25 182 56 1 198 56 2 206 56 1 228 56 3 4 57 10 9 57 1 12 57 1 22 57 1 32 57 1 33 57 1 39 57 1 43 57 3 48 57 1 51 57 1 59 57 1 61 57 1 64 57 5 65 57 1 66 57 1 67 57 2 69 57 1 72 57 3 74 57 1 81 57 1 90 57 1 91 57 1 92 57 8 93 57 7 95 57 1 96 57 16 98 57 1 99 57 3 100 57 18 101 57 6 103 57 3 104 57 6 105 57 1 107 57 5 108 57 1 109 57 1 110 57 1 111 57 2 115 57 1 117 57 1 120 57 1 121 57 7 126 57 7 128 57 10 129 57 6 130 57 1 131 57 1 132 57 6 134 57 13 135 57 33 137 57 2 138 57 1 146 57 3 148 57 1 151 57 36 152 57 12 153 57 10 154 57 1 155 57 1 156 57 16 157 57 3 158 57 5 159 57 18 160 57 2 161 57 18 162 57 1 163 57 14 164 57 24 165 57 1 166 57 33 167 57 3 168 57 6 169 57 3 171 57 1 172 57 91 175 57 5 176 57 7 178 57 4 179 57 1 191 57 1 194 57 1 198 57 2 211 57 5 214 57 1 228 57 2 237 57 1 4 58 13 6 58 1 8 58 1 9 58 1 13 58 1 22 58 1 24 58 1 33 58 1 44 58 1 50 58 1 54 58 3 65 58 1 72 58 1 81 58 1 90 58 1 91 58 1 92 58 6 93 58 6 95 58 1 96 58 9 98 58 1 99 58 2 100 58 19 101 58 4 104 58 2 107 58 1 109 58 2 110 58 1 111 58 3 112 58 1 116 58 2 117 58 2 120 58 3 121 58 14 126 58 6 128 58 13 129 58 5 130 58 2 131 58 1 132 58 3 133 58 1 134 58 6 135 58 10 137 58 1 138 58 2 141 58 1 142 58 2 143 58 2 146 58 2 147 58 1 151 58 17 152 58 19 153 58 8 154 58 1 155 58 27 156 58 15 157 58 5 158 58 5 159 58 19 160 58 5 161 58 9 163 58 8 164 58 9 165 58 2 166 58 8 167 58 1 168 58 1 169 58 1 170 58 1 171 58 2 172 58 11 173 58 3 174 58 4 175 58 2 176 58 2 177 58 6 178 58 1 180 58 1 182 58 1 198 58 2 228 58 1 2 59 3 4 59 5 6 59 1 7 59 1 9 59 2 23 59 1 33 59 2 39 59 1 48 59 2 54 59 1 67 59 1 72 59 3 74 59 2 84 59 2 91 59 2 93 59 9 95 59 2 96 59 16 98 59 2 99 59 4 100 59 4 101 59 2 104 59 12 105 59 2 107 59 2 109 59 2 111 59 2 112 59 3 115 59 1 116 59 1 118 59 1 121 59 5 126 59 9 128 59 5 129 59 9 131 59 2 132 59 6 133 59 1 134 59 6 135 59 15 136 59 1 140 59 1 141 59 2 142 59 3 147 59 1 148 59 3 149 59 1 151 59 12 152 59 18 153 59 5 154 59 3 155 59 1 156 59 11 157 59 4 158 59 3 159 59 4 160 59 7 161 59 5 162 59 1 163 59 7 164 59 9 165 59 1 166 59 14 167 59 1 168 59 5 171 59 3 172 59 18 174 59 2 175 59 1 176 59 6 177 59 3 182 59 1 198 59 1 213 59 1 219 59 1 225 59 1 4 60 8 8 60 1 9 60 1 23 60 2 25 60 1 33 60 1 43 60 1 44 60 1 45 60 1 47 60 1 48 60 1 56 60 1 59 60 1 61 60 2 66 60 1 72 60 1 81 60 1 89 60 1 90 60 1 93 60 6 96 60 17 98 60 9 99 60 5 100 60 17 101 60 5 103 60 2 104 60 16 105 60 1 106 60 1 109 60 4 111 60 3 112 60 1 115 60 1 118 60 2 120 60 2 121 60 11 126 60 6 128 60 8 129 60 4 131 60 2 132 60 2 134 60 4 135 60 25 140 60 1 146 60 6 147 60 3 148 60 2 149 60 1 151 60 27 152 60 29 153 60 10 154 60 1 155 60 1 156 60 22 157 60 6 158 60 6 159 60 17 160 60 10 161 60 11 162 60 1 163 60 13 164 60 30 165 60 1 166 60 19 167 60 2 168 60 6 169 60 2 171 60 5 172 60 18 173 60 3 174 60 8 175 60 4 176 60 3 177 60 6 178 60 2 179 60 1 182 60 2 183 60 1 191 60 2 193 60 2 198 60 2 210 60 2 214 60 1 225 60 1 238 60 3 4 61 108 6 61 21 8 61 3 12 61 1 15 61 1 22 61 2 23 61 12 26 61 1 32 61 1 36 61 1 39 61 1 42 61 1 44 61 2 46 61 1 48 61 4 49 61 1 61 61 3 71 61 2 74 61 1 75 61 1 82 61 1 84 61 1 85 61 1 88 61 1 89 61 1 90 61 1 93 61 76 96 61 2 98 61 2 99 61 1 100 61 5 101 61 1 103 61 1 104 61 8 107 61 1 109 61 2 112 61 2 113 61 3 114 61 4 115 61 3 121 61 75 122 61 16 124 61 6 125 61 3 126 61 76 127 61 3 128 61 108 129 61 102 130 61 25 131 61 2 132 61 11 133 61 21 134 61 50 135 61 61 136 61 1 138 61 7 139 61 2 140 61 9 141 61 1 142 61 4 143 61 2 145 61 2 146 61 5 147 61 6 148 61 4 149 61 3 151 61 12 152 61 6 153 61 1 154 61 5 156 61 10 157 61 8 158 61 1 159 61 5 163 61 5 164 61 8 166 61 4 168 61 6 172 61 18 176 61 2 177 61 1 182 61 6 183 61 1 191 61 1 196 61 1 198 61 1 210 61 1 222 61 1 223 61 1 228 61 1 235 61 1 237 61 2 239 61 1 4 62 93 6 62 21 8 62 2 9 62 1 23 62 3 25 62 2 32 62 1 33 62 1 36 62 1 50 62 1 54 62 2 56 62 1 58 62 1 59 62 2 64 62 1 70 62 1 72 62 2 91 62 2 93 62 20 96 62 8 98 62 2 99 62 3 100 62 3 103 62 1 104 62 13 109 62 2 112 62 1 113 62 10 114 62 1 115 62 1 116 62 5 120 62 4 121 62 52 122 62 1 123 62 5 124 62 6 125 62 10 126 62 20 127 62 3 128 62 93 129 62 78 130 62 39 131 62 2 132 62 26 133 62 21 134 62 53 135 62 31 136 62 8 137 62 1 138 62 9 139 62 5 140 62 4 142 62 3 146 62 1 147 62 1 149 62 1 150 62 4 151 62 7 152 62 7 153 62 2 156 62 5 157 62 1 158 62 1 159 62 3 160 62 12 163 62 4 164 62 8 166 62 7 171 62 1 172 62 2 178 62 1 182 62 7 191 62 1 211 62 1 236 62 1 239 62 1 4 63 41 6 63 3 8 63 1 23 63 1 25 63 1 26 63 1 36 63 1 43 63 1 54 63 1 56 63 1 62 63 1 72 63 3 80 63 1 81 63 1 84 63 1 92 63 1 93 63 24 95 63 3 96 63 6 99 63 2 100 63 1 104 63 21 107 63 1 108 63 1 109 63 2 112 63 1 113 63 1 116 63 1 117 63 1 118 63 2 121 63 11 122 63 2 123 63 2 124 63 5 125 63 1 126 63 24 127 63 1 128 63 41 129 63 23 130 63 5 132 63 5 133 63 3 134 63 10 135 63 25 137 63 1 138 63 1 140 63 5 141 63 1 143 63 3 146 63 5 148 63 2 150 63 1 151 63 7 152 63 1 153 63 1 156 63 5 157 63 1 159 63 1 160 63 2 163 63 5 164 63 3 166 63 4 168 63 3 169 63 1 172 63 9 173 63 1 176 63 1 178 63 1 182 63 2 184 63 1 214 63 1 219 63 1 221 63 1 228 63 1 2 64 4 3 64 8 4 64 42 5 64 4 6 64 5 8 64 4 9 64 5 12 64 3 16 64 1 21 64 1 23 64 3 25 64 1 26 64 1 30 64 2 33 64 5 43 64 1 44 64 5 45 64 2 48 64 4 54 64 1 59 64 2 61 64 2 66 64 1 74 64 1 75 64 1 81 64 1 91 64 2 92 64 10 93 64 79 94 64 2 95 64 1 96 64 9 97 64 1 98 64 1 99 64 5 100 64 5 101 64 4 103 64 2 104 64 9 109 64 2 113 64 2 114 64 7 115 64 2 117 64 1 120 64 2 121 64 19 122 64 4 123 64 4 124 64 4 125 64 2 126 64 79 127 64 3 128 64 42 129 64 25 130 64 2 131 64 1 132 64 2 133 64 5 134 64 9 135 64 14 136 64 3 137 64 33 140 64 7 141 64 2 142 64 1 143 64 2 144 64 1 146 64 1 147 64 2 149 64 2 151 64 4 152 64 3 153 64 6 156 64 16 158 64 3 159 64 5 160 64 1 163 64 3 164 64 3 166 64 3 168 64 1 170 64 1 172 64 11 173 64 1 177 64 1 179 64 1 182 64 6 193 64 2 198 64 1 222 64 1 225 64 1 228 64 1 2 65 1 4 65 138 6 65 11 8 65 5 12 65 1 15 65 1 26 65 1 35 65 2 36 65 1 39 65 1 43 65 1 44 65 2 45 65 3 48 65 2 54 65 3 55 65 1 56 65 4 62 65 1 64 65 1 65 65 1 68 65 1 70 65 1 71 65 1 72 65 1 74 65 1 75 65 2 84 65 1 87 65 1 90 65 1 91 65 1 93 65 53 94 65 2 95 65 2 96 65 11 98 65 1 99 65 14 101 65 2 104 65 20 108 65 2 111 65 1 112 65 3 113 65 3 114 65 7 115 65 2 116 65 6 118 65 1 120 65 6 121 65 54 122 65 8 123 65 2 124 65 6 125 65 3 126 65 53 128 65 138 129 65 69 130 65 16 131 65 1 132 65 31 133 65 11 134 65 68 135 65 58 136 65 1 138 65 6 139 65 3 140 65 2 141 65 1 143 65 3 144 65 1 146 65 22 147 65 5 148 65 1 149 65 64 150 65 1 151 65 8 152 65 11 153 65 6 154 65 2 156 65 2 160 65 3 163 65 11 164 65 13 166 65 2 168 65 1 171 65 1 172 65 12 174 65 1 176 65 2 177 65 2 179 65 1 182 65 24 183 65 1 191 65 1 194 65 2 198 65 3 211 65 1 217 65 1 221 65 1 225 65 3 228 65 1 231 65 1 233 65 1 236 65 2 237 65 4 4 66 77 6 66 11 8 66 2 22 66 1 23 66 1 32 66 1 35 66 1 43 66 1 44 66 2 45 66 1 48 66 4 51 66 1 59 66 1 64 66 3 66 66 1 67 66 1 68 66 1 70 66 1 72 66 3 75 66 2 82 66 1 90 66 4 91 66 9 92 66 41 93 66 53 94 66 1 95 66 4 96 66 14 97 66 1 98 66 6 99 66 11 100 66 3 101 66 5 103 66 2 104 66 10 105 66 2 108 66 1 111 66 2 112 66 1 113 66 4 115 66 3 116 66 2 117 66 1 120 66 2 121 66 23 122 66 5 123 66 3 124 66 5 125 66 4 126 66 53 127 66 1 128 66 77 129 66 24 130 66 6 131 66 1 132 66 21 133 66 11 134 66 36 135 66 112 136 66 2 138 66 1 139 66 3 140 66 5 142 66 1 143 66 1 146 66 10 147 66 4 148 66 39 149 66 2 151 66 10 152 66 7 153 66 4 154 66 5 156 66 3 158 66 1 159 66 3 160 66 4 163 66 9 164 66 8 165 66 1 166 66 2 167 66 2 168 66 3 171 66 1 172 66 11 173 66 1 174 66 1 177 66 1 179 66 1 182 66 16 183 66 2 186 66 2 198 66 1 211 66 3 217 66 1 225 66 2 228 66 2 231 66 1 233 66 1 236 66 1 237 66 2 4 67 76 6 67 10 8 67 1 15 67 1 23 67 2 39 67 1 48 67 1 54 67 1 56 67 2 61 67 1 72 67 2 81 67 2 82 67 1 89 67 1 91 67 1 92 67 11 93 67 87 94 67 1 95 67 6 96 67 10 98 67 1 99 67 3 100 67 6 101 67 10 103 67 2 104 67 23 105 67 1 107 67 1 109 67 3 112 67 1 113 67 4 114 67 2 115 67 3 116 67 7 120 67 5 121 67 45 122 67 8 123 67 6 124 67 6 125 67 4 126 67 87 127 67 3 128 67 76 129 67 43 130 67 11 131 67 6 132 67 21 133 67 10 134 67 49 135 67 37 136 67 3 138 67 4 140 67 12 141 67 1 142 67 38 143 67 2 144 67 21 146 67 9 147 67 8 148 67 1 149 67 3 151 67 4 152 67 9 153 67 4 154 67 4 155 67 2 156 67 16 157 67 1 159 67 6 160 67 4 161 67 1 163 67 9 164 67 7 167 67 1 168 67 3 172 67 7 178 67 1 179 67 1 182 67 28 183 67 1 193 67 1 194 67 1 198 67 3 222 67 2 228 67 4 235 67 1 236 67 1 237 67 1 238 67 1 1 68 1 4 68 15 6 68 1 8 68 1 32 68 1 36 68 1 43 68 1 44 68 1 54 68 5 64 68 1 74 68 1 90 68 1 91 68 23 92 68 32 93 68 76 94 68 1 95 68 1 96 68 10 98 68 3 99 68 4 100 68 2 101 68 6 103 68 1 104 68 5 108 68 1 109 68 1 110 68 1 112 68 1 113 68 1 114 68 1 115 68 1 116 68 2 117 68 1 120 68 1 121 68 10 122 68 4 123 68 4 124 68 5 125 68 1 126 68 76 128 68 15 129 68 8 130 68 3 131 68 3 132 68 2 133 68 1 134 68 3 135 68 18 136 68 6 138 68 1 140 68 7 141 68 1 145 68 1 146 68 1 147 68 2 148 68 3 149 68 1 150 68 1 151 68 2 152 68 4 153 68 2 155 68 2 156 68 3 157 68 1 159 68 2 163 68 4 164 68 5 166 68 1 172 68 5 173 68 1 177 68 1 178 68 1 182 68 3 198 68 1 202 68 1 211 68 1 228 68 1 239 68 1 3 69 1 4 69 19 6 69 2 8 69 1 9 69 1 26 69 1 27 69 1 33 69 1 44 69 2 54 69 13 59 69 1 62 69 1 72 69 4 91 69 4 92 69 17 93 69 42 96 69 6 97 69 1 98 69 2 99 69 8 101 69 4 104 69 28 112 69 1 113 69 3 114 69 2 115 69 4 116 69 2 121 69 23 122 69 7 123 69 2 124 69 3 125 69 3 126 69 42 127 69 1 128 69 19 129 69 10 130 69 4 131 69 5 132 69 3 133 69 2 134 69 9 135 69 29 136 69 1 137 69 1 140 69 10 141 69 3 143 69 1 144 69 1 145 69 32 146 69 3 147 69 4 148 69 5 149 69 1 151 69 6 152 69 1 153 69 2 154 69 1 155 69 1 156 69 4 157 69 1 161 69 1 163 69 5 164 69 8 166 69 6 167 69 1 168 69 1 169 69 1 171 69 1 172 69 4 173 69 1 179 69 1 180 69 1 182 69 6 183 69 1 198 69 1 221 69 1 225 69 1 233 69 1 237 69 3 4 70 104 6 70 11 8 70 5 9 70 4 12 70 1 23 70 2 31 70 1 32 70 1 33 70 4 39 70 2 48 70 1 49 70 1 54 70 2 57 70 1 63 70 1 64 70 1 68 70 1 72 70 2 77 70 1 78 70 1 80 70 2 90 70 2 93 70 114 96 70 7 97 70 1 98 70 4 99 70 4 100 70 3 101 70 2 104 70 13 109 70 2 112 70 1 113 70 6 115 70 3 121 70 37 123 70 1 124 70 5 125 70 6 126 70 114 127 70 2 128 70 104 129 70 50 130 70 9 131 70 1 132 70 10 133 70 11 134 70 26 135 70 125 137 70 3 138 70 5 139 70 1 140 70 18 141 70 43 142 70 1 143 70 8 146 70 3 147 70 5 148 70 1 149 70 1 151 70 6 152 70 4 153 70 7 154 70 3 155 70 2 156 70 5 157 70 2 158 70 1 159 70 3 160 70 1 163 70 2 164 70 3 165 70 2 166 70 4 168 70 4 169 70 1 171 70 4 172 70 25 173 70 1 174 70 1 177 70 1 178 70 2 182 70 3 183 70 1 185 70 1 193 70 1 198 70 2 211 70 1 214 70 1 215 70 1 217 70 1 231 70 1 237 70 1 4 71 1 44 71 1 70 71 8 92 71 3 93 71 3 100 71 1 126 71 3 128 71 1 129 71 1 135 71 5 143 71 1 156 71 3 159 71 1 172 71 1 181 71 43 182 71 18 183 71 4 184 71 14 185 71 11 186 71 1 187 71 8 188 71 6 189 71 14 190 71 5 191 71 8 192 71 1 193 71 2 194 71 3 195 71 6 196 71 3 197 71 4 198 71 2 199 71 3 200 71 4 201 71 4 202 71 3 203 71 5 204 71 4 206 71 5 207 71 2 208 71 1 70 72 5 91 72 1 93 72 1 126 72 1 135 72 1 147 72 1 156 72 4 172 72 2 181 72 41 182 72 8 183 72 4 184 72 11 185 72 3 186 72 5 187 72 3 188 72 5 189 72 5 190 72 3 191 72 2 192 72 3 193 72 5 195 72 4 196 72 3 197 72 3 200 72 1 201 72 1 202 72 1 203 72 1 206 72 4 210 72 41 9 73 1 33 73 1 67 73 1 70 73 4 84 73 1 93 73 1 126 73 1 136 73 1 142 73 1 153 73 1 156 73 2 181 73 36 182 73 12 183 73 2 184 73 14 185 73 13 186 73 3 187 73 2 188 73 9 189 73 8 190 73 5 192 73 3 193 73 4 194 73 1 195 73 4 196 73 2 197 73 5 198 73 1 199 73 2 200 73 2 202 73 4 203 73 4 204 73 3 205 73 3 206 73 1 207 73 4 208 73 1 209 73 6 236 73 1 70 74 10 88 74 1 153 74 1 156 74 6 164 74 1 172 74 3 181 74 55 182 74 18 183 74 2 184 74 18 185 74 8 186 74 3 187 74 2 188 74 10 189 74 11 190 74 5 191 74 12 192 74 2 193 74 4 194 74 2 195 74 3 196 74 3 197 74 2 198 74 2 199 74 7 201 74 4 202 74 1 203 74 2 204 74 4 205 74 1 206 74 4 209 74 1 235 74 2 4 75 2 70 75 11 93 75 1 103 75 1 104 75 1 126 75 1 128 75 2 135 75 5 140 75 1 152 75 1 153 75 1 156 75 3 166 75 1 174 75 1 181 75 58 182 75 18 183 75 2 184 75 23 185 75 8 186 75 2 187 75 3 188 75 7 189 75 15 190 75 2 191 75 8 192 75 3 193 75 1 194 75 1 195 75 4 196 75 2 197 75 14 198 75 1 199 75 4 200 75 2 201 75 2 202 75 3 203 75 4 204 75 8 205 75 1 210 75 2 219 75 1 4 76 1 25 76 1 27 76 1 36 76 1 44 76 1 70 76 30 91 76 1 101 76 2 108 76 1 116 76 1 128 76 1 135 76 1 142 76 2 156 76 17 166 76 1 172 76 2 181 76 54 182 76 28 183 76 15 184 76 62 185 76 29 186 76 7 187 76 9 188 76 23 189 76 6 190 76 42 191 76 7 192 76 11 193 76 6 194 76 14 195 76 3 196 76 9 197 76 32 198 76 10 200 76 3 201 76 6 202 76 8 203 76 1 204 76 1 205 76 2 207 76 20 208 76 25 209 76 26 210 76 1 224 76 1 228 76 1 236 76 1 238 76 1 4 77 1 70 77 8 128 77 1 135 77 3 156 77 3 172 77 3 181 77 66 182 77 11 183 77 2 184 77 9 185 77 3 186 77 3 187 77 3 188 77 12 189 77 4 190 77 2 191 77 3 192 77 6 194 77 2 195 77 4 197 77 2 198 77 37 199 77 1 200 77 1 201 77 2 203 77 4 204 77 2 205 77 1 206 77 1 207 77 2 209 77 1 45 78 1 70 78 5 156 78 6 164 78 1 174 78 1 176 78 1 181 78 34 182 78 13 183 78 1 184 78 14 185 78 6 186 78 1 187 78 3 188 78 6 189 78 3 190 78 1 191 78 2 192 78 5 193 78 4 195 78 20 199 78 3 200 78 2 201 78 2 202 78 13 203 78 1 205 78 2 207 78 2 208 78 3 210 78 1 4 79 2 49 79 1 70 79 9 128 79 2 156 79 4 172 79 4 174 79 1 181 79 30 182 79 16 183 79 3 184 79 6 185 79 5 186 79 1 187 79 4 188 79 11 189 79 5 190 79 2 191 79 6 192 79 3 194 79 4 195 79 5 196 79 1 197 79 8 198 79 2 199 79 5 200 79 4 202 79 2 205 79 3 207 79 1 208 79 1 210 79 1 4 80 7 6 80 1 13 80 1 26 80 1 43 80 1 44 80 1 45 80 1 60 80 1 65 80 1 70 80 2 91 80 2 92 80 7 93 80 22 96 80 14 98 80 6 99 80 2 100 80 3 101 80 3 103 80 1 104 80 10 111 80 3 112 80 1 113 80 3 114 80 1 115 80 2 116 80 1 117 80 1 120 80 4 121 80 5 123 80 1 124 80 1 125 80 3 126 80 22 128 80 7 129 80 5 132 80 1 133 80 1 134 80 4 135 80 16 136 80 5 140 80 4 141 80 3 142 80 2 146 80 4 148 80 1 151 80 7 152 80 5 153 80 1 154 80 1 155 80 1 156 80 3 158 80 2 159 80 3 160 80 1 163 80 1 164 80 4 166 80 1 168 80 1 171 80 1 172 80 7 174 80 1 178 80 1 179 80 1 181 80 6 182 80 9 183 80 2 185 80 2 186 80 2 187 80 2 188 80 1 189 80 2 190 80 1 193 80 1 194 80 1 198 80 3 199 80 2 204 80 1 208 80 1 209 80 1 210 80 1 231 80 1 Seurat/MD50000644000176200001440000004570414744634036012052 0ustar liggesusersb6a93b79a3c345800d079480f6267f5a *DESCRIPTION c2ef7c6f9278eb1816e1c98c41ea726b *LICENSE e1a7395865ed09513a10653717e4d06d *NAMESPACE 181b3c852eac7a87c95454be301cb699 *NEWS.md 2dc8d94314ead6f77537d1fe0fc272bc *R/RcppExports.R 746ccef46cf255d0269779a55e8da66c *R/clustering.R d72ddf5ce3e2ab38cc731f3538f4fa0c *R/convenience.R 0b3f35535683b39246cb65edb6ba397c *R/data.R 43d2ee508d1e1f8257d16668fe34edd2 *R/differential_expression.R 08996d84d58494d0f88baf545db757c3 *R/dimensional_reduction.R cd2472c00640de2fb064b6cb5b472831 *R/generics.R 253497c1e6a62a9139e9918dc287b817 *R/integration.R 5477680c97a51240eeef24580845e3ad *R/integration5.R aaf4e34ed4f643d3008cecfc664e5308 *R/mixscape.R 1bbb46cb76d01609468f155cb84f0285 *R/objects.R 017388463da646f312183a53d650cc6b *R/preprocessing.R e0b9e49de2d782aac4bc82d70c58f67c *R/preprocessing5.R 64823909fe4edb0b99ac631a15740dd5 *R/reexports.R 1e0677c7f50b69a8ad847506a648c92a *R/roxygen.R 80e8e17a7c5b36c8d819ffe9229ad7bc *R/sketching.R 2f3eab7c0723d8777ead1b6e5858b6f8 *R/tree.R 062edc187b872ceb8b300f171c983ef6 *R/utilities.R c392d9310ebb23cc7e68727ea8a9cb6e *R/visualization.R daed1f8c33ba13a786ce4407e06c3e88 *R/zzz.R 1b0dbef32b8c22ef3092692efee72b50 *README.md 4d36b244849a3a98e6862532093bbdcc *build/Seurat.pdf 6aa3e0e7dfd444dc4c02ef9c773e3c81 *build/stage23.rdb e84661f995a9f29d1a09ebcdc27d3a82 *data/cc.genes.rda 55d7e35793436d5e91646d774d9f86c4 *data/cc.genes.updated.2019.rda fb89a5cc1f14ad979196d34e85b6f11f *inst/CITATION d07fe4eee5c09cc44e96c17e683cb10e *inst/extdata/pbmc_raw.txt 6e5c9a9138e4310b9b33bcad55c577dd *man/AddAzimuthResults.Rd f18c489b5a66400bcf43793a921cfc91 *man/AddAzimuthScores.Rd 1b367192a3ab961fb78b3ed2f6d21a84 *man/AddModuleScore.Rd 48b523dc136d6dd1676c4147cee2d0fd *man/AggregateExpression.Rd c7c2526a6664941b2d78b8b75944cb0c *man/AnchorSet-class.Rd 07c839ccf3fffc7a95d5035d3e294d11 *man/AnnotateAnchors.Rd 52233895af88c8e1697dd981c73667fe *man/Assay-class.Rd 66351cc0e0184ccc08cd3ec15b070079 *man/AugmentPlot.Rd d40f4485b82201107f8fcc38465cdc63 *man/AutoPointSize.Rd e5aad845e1519f9ac5bff2171f7d1d37 *man/AverageExpression.Rd 6d0a647c45a8644742532a34e84cd28d *man/BGTextColor.Rd 7c84e2390af0071f75b8d66ebefe06d0 *man/BarcodeInflectionsPlot.Rd d3f89f8ad58e4eca215e33bd084e9f54 *man/BridgeCellsRepresentation.Rd a9d8f8eb55ba2cd2f47363b1e299da0d *man/BridgeReferenceSet-class.Rd 4a1f3a9759254be52773278fdeed71a6 *man/BuildClusterTree.Rd 9770e15ee5e77ac00e84926751d5f770 *man/BuildNicheAssay.Rd 4701772b9d7fa2d8d6e1d4353029e9b9 *man/CCAIntegration.Rd 61123dad772d46f5e62e9ccd1e43d6de *man/CalcDispersion.Rd 33f13558c1c1be298a623aca4b19504b *man/CalcPerturbSig.Rd b760f432b53c9d0d33a39d1ea0e0320a *man/CalculateBarcodeInflections.Rd 3550bef6cb5f40f4540f5dc70e80598d *man/CaseMatch.Rd b9abf47109862ea85c36ec6c511ac787 *man/CellCycleScoring.Rd 3aec17d0cae2627d1450ff2ea9732957 *man/CellScatter.Rd 9da9ef92375a1ad85e84fc0037a48784 *man/CellSelector.Rd ac4f0d73efb473049e346eec12d1efe6 *man/Cells.Rd b69d54dd6c77c9efcf83830aef8a0423 *man/CellsByImage.Rd 5600133820f9f0343d5edcff87c533c9 *man/CollapseEmbeddingOutliers.Rd 27a6b0d8531b5c59861ebca821ded6e9 *man/CollapseSpeciesExpressionMatrix.Rd e2e844b6beff7eb5f91f39fc8f1bf622 *man/ColorDimSplit.Rd 9eeec370a2aad6836e8b9027d654812a *man/CombinePlots.Rd ee4cc3d1a3147e846b96b77a1bc0b73b *man/CountSketch.Rd 37d43700f94e05d8266fede6df05a1c3 *man/CreateCategoryMatrix.Rd c534f9d624c27c9e4af6ea54e026dfab *man/CreateSCTAssayObject.Rd 86f23babe36a2c534f3401c93bf5a97c *man/CustomDistance.Rd 8ab923c6ef1bb0a548e140f45bf97ed5 *man/CustomPalette.Rd b7eb4c95f803c027815cb08e8180a654 *man/DEenrichRPlot.Rd 37d6cf4959bb8244720283cb8ce0041c *man/DISP.Rd ef9edd0671f22ca5ae5f67ed063cdc05 *man/DietSeurat.Rd d9cb5fcbd90eea8518965240e031c80a *man/DimHeatmap.Rd 119c9e693e97699155a0e8129fda61a9 *man/DimPlot.Rd 6e505cdb81626e425958657f99813304 *man/DimReduc-class.Rd 66090a5a18ad242bb22df22a9e6e5c11 *man/DiscretePalette.Rd 5d03d4926234e9a2850913e65c9467df *man/DoHeatmap.Rd 684b1193880b1242c0e95ae7a71a517f *man/DotPlot.Rd 93448d7ad049632784186f00f0e825b8 *man/ElbowPlot.Rd 152070beaee889ad0c57d824c6b890b7 *man/ExpMean.Rd 8e2d2db070c229523b03d9841df4b089 *man/ExpSD.Rd 497e0fc0845d50baae3cff33fc98f9c7 *man/ExpVar.Rd 5e07a914df88487050ccbcddae08a583 *man/FastRPCAIntegration.Rd 8b154c79dcd203853c3984baf37684c4 *man/FastRowScale.Rd be9cda0395ed39263a964cbf5e307c05 *man/FeaturePlot.Rd e51e95312c85f753680da91578312ca0 *man/FeatureScatter.Rd c7c5aa0818d3cb62f3347d622aec21ea *man/FetchResidualSCTModel.Rd ec07eda5ecaaa6925977bfc04d94d840 *man/FetchResiduals.Rd 51fd971521a57b3f55e92e59777ac5fc *man/FetchResiduals_reference.Rd 8baf10ef47e718c9fc4aef521df50b64 *man/FilterSlideSeq.Rd 95b918a5458d3f214dc0e6895da61493 *man/FindAllMarkers.Rd acdecd02ba45c7fb086f66ee98909043 *man/FindBridgeAnchor.Rd 3057ce351332b8e0561af8e4baf8149e *man/FindBridgeIntegrationAnchors.Rd 479320971531d4745622df8a61536b72 *man/FindBridgeTransferAnchors.Rd f6e111eb6367ab06ccf5873142c39933 *man/FindClusters.Rd c40fde8064238cd34ea6fa773ed7ccf4 *man/FindConservedMarkers.Rd 419942228ca9f888ba141f0c4594e2f0 *man/FindIntegrationAnchors.Rd d1252b2ad3252d295391d1da545d6da4 *man/FindMarkers.Rd 21881fce274bec77239e6df4ffe53f1b *man/FindMultiModalNeighbors.Rd 11eff7618184ecbea4372bb25b0bc932 *man/FindNeighbors.Rd b0e1aaa645cc85a66a852eee73e39d8f *man/FindSpatiallyVariableFeatures.Rd 62c13da804f1993d910c8a9f6f914c9c *man/FindSubCluster.Rd 1a806724c802144aa72a309a483fc12e *man/FindTransferAnchors.Rd 3e7b26503a7d83ca0b2f4f06a165d7fe *man/FindVariableFeatures.Rd 497bfbcf879355d83a84b6db7708f325 *man/FoldChange.Rd 1e4769fd88901ef7efdede58f3fff32d *man/GaussianSketch.Rd b666afaab9ed8ac708a81e141ec4683b *man/GetAssay.Rd c58b07efc50b282829f73857bda22145 *man/GetImage.Rd 55c7a101f7dffe9d50f12da10aff9b2e *man/GetIntegrationData.Rd 66e88036c1539122d770234caff96198 *man/GetResidual.Rd 447c1f96ee5effaff565da6e9089c5b1 *man/GetTissueCoordinates.Rd 35761ade67ea12a72c813f24130029fd *man/GetTransferPredictions.Rd c4adc0a85fc90e4e43d074460a06648c *man/Graph-class.Rd a8befbd8423c290c19261556acd8ff08 *man/GroupCorrelation.Rd 885bb61fa2d0a622b047dd56fa254a91 *man/GroupCorrelationPlot.Rd 4fe184e4b4c0eb3f87bef21123e29fe2 *man/HTODemux.Rd 72111f313e6e7fd80db16c58aeef7794 *man/HTOHeatmap.Rd a06211e14b256631fd037636964abd09 *man/HVFInfo.SCTAssay.Rd 5f34856aba424339e34e4cfb5efbad81 *man/HarmonyIntegration.Rd ed1b839f07cf7f7ae24be300628ac47c *man/HoverLocator.Rd f7f6b58d2fc988ab8530ee9742f84b6f *man/IFeaturePlot.Rd 245660405f21e9f08cf87a0fc268f9f1 *man/ISpatialDimPlot.Rd 06b2116bebfabe1863bdfedeac25889a *man/ISpatialFeaturePlot.Rd 40d9e6bedb735b6ad3b4cd14d565bcfc *man/ImageDimPlot.Rd bf56b569fdf5a968ea05db10cd3e6bf1 *man/ImageFeaturePlot.Rd cd0058a57302e32d5f02fb3587fcbbad *man/IntegrateData.Rd 7d1e03b3e2308dce80cdfc732467839d *man/IntegrateEmbeddings.Rd 1c073484f3d7a96092704885f8b7c337 *man/IntegrateLayers.Rd 4ee5eb07563971a104e4cbab9e3d5919 *man/IntegrationAnchorSet-class.Rd d69da6ee725f4978305025b6de6df811 *man/IntegrationData-class.Rd afb332ec2e1c9534fe930e55f52a62d6 *man/JackStraw.Rd 19f4c49e6346b73f981cc2878d0cf8a0 *man/JackStrawData-class.Rd 2e3257c67d4b09ef94eb2052b532c42f *man/JackStrawPlot.Rd f014b591290fcd228bcc5a4795a0b5bf *man/JointPCAIntegration.Rd 3fe0920d29478f95724b9f0206055b25 *man/L2CCA.Rd 86eeddaaa3e6f0e51059523a23f627a3 *man/L2Dim.Rd 40c09a3566db9e1528716be9317cf882 *man/LabelClusters.Rd c7876bf181dd49fbfe1d6490c4fc5b0f *man/LabelPoints.Rd a54519961d9226db96988e1c001a6ccb *man/LeverageScore.Rd b2cfce1bc6ee8e280747545dc7edd4bc *man/LinkedPlots.Rd 36bc7df2a41a08b4e327980d79746eab *man/Load10X_Spatial.Rd 9250526a506c24545de8856006893c67 *man/LoadAnnoyIndex.Rd 5e8bff4d2743728091f64aa30461c1d2 *man/LoadCurioSeeker.Rd af949a6114516b3ab62bb2f4b53a0e34 *man/LoadSTARmap.Rd 95af3201e2ef04e32b9d0ffd3f0feb85 *man/LocalStruct.Rd 2199b13323996da83ac09c496d2663c7 *man/LogNormalize.Rd 39eac70a16e242177b7840ae51d2071d *man/LogVMR.Rd 1c1bdbcee8586463d19692649d8e379e *man/MULTIseqDemux.Rd ce90d9d73f17ae6f81dc95d1268d0643 *man/MVP.Rd dd438d9a34737502d9a84c3abe14c423 *man/MapQuery.Rd 1ed6848f442b000f162577967509cba9 *man/MappingScore.Rd 1b9c655f92a327b11582498272a88d1a *man/MetaFeature.Rd 3c9c2bbec11d6e88c372d87d08d2dbd9 *man/MinMax.Rd 90a4c3d5498f3ccf368e0825c755134f *man/MixingMetric.Rd a271149b3bca4645b9e27912275a826c *man/MixscapeHeatmap.Rd 0e789aa9e303429c95051c662d67ca50 *man/MixscapeLDA.Rd 8f87e82e16bc30af62cd4fd1df7d39e0 *man/ModalityWeights-class.Rd 9f02beb76ddcc55da09b8d379e3927c7 *man/NNPlot.Rd a122663331400363d32c08e6fa8966ac *man/NNtoGraph.Rd efabeb1b41ce7efcf7be4662c3bd0b99 *man/Neighbor-class.Rd 85eeac1a67419c8575bdc55bfe52b498 *man/NormalizeData.Rd c3d6d895a2930a0c7d2ce6346a07a84f *man/PCASigGenes.Rd fe0087f1c4031926afee79c4a6e6a0d9 *man/PercentAbove.Rd 41b1017edf7a418ba6e5a3e806a60f37 *man/PercentageFeatureSet.Rd a9cd2601cb56b434cfdf53c0334124eb *man/PlotClusterTree.Rd 9133ec5810b07a6e4336db5eda6463ba *man/PlotPerturbScore.Rd 60eef96f3631b33a83817398d092b40f *man/PolyDimPlot.Rd c0cb6074ed23a579c3d0839f95a1c85f *man/PolyFeaturePlot.Rd 680ad8e1c1fd03b8c1c95b09d1d3e2b8 *man/PredictAssay.Rd f86423d63d17d3434b52f8ac81b74821 *man/PrepLDA.Rd 0f2a0fc950ec36689ce5fbac9d92c374 *man/PrepSCTFindMarkers.Rd 0882d2985bf5f8b61052b3d11c7845d5 *man/PrepSCTIntegration.Rd bb637251aefe1cfd5ba5b454d785d26f *man/PrepareBridgeReference.Rd 054cbc9c1f39942e5f05539f586b442a *man/ProjectCellEmbeddings.Rd 5025d48c65f3df298ce8e572c0576586 *man/ProjectData.Rd 1d0938398a47900183cd49d7203f73c1 *man/ProjectDim.Rd ddd5a2e0375e35c76e4753b7315de25f *man/ProjectDimReduc.Rd 43a43097e05f8a858631eff31b46b308 *man/ProjectIntegration.Rd e030ec03f24899c203327c87662904d2 *man/ProjectUMAP.Rd 329f001b2ea374092bcf71d84ea87a77 *man/PseudobulkExpression.Rd dd05bd259974221a406480428424035d *man/RPCAIntegration.Rd 7b681d97d1154e8e8cee001ce1cbeccd *man/Radius.Rd 39cd8326812aa77d6afefdb44020eb99 *man/Read10X.Rd 09b09eaa6f6cc0f3484943409e771458 *man/Read10X_Coordinates.Rd b9f317389a75ca0c5e2e97b4b1df508d *man/Read10X_Image.Rd 394219a27312ba45db01aeac42affad5 *man/Read10X_ScaleFactors.Rd 265cea6403e2bbdc809197a2622cfd07 *man/Read10X_h5.Rd 1f1872a17343dde7503b61fb6dfcca29 *man/Read10X_probe_metadata.Rd d7d38c1e098da16b727b6c88a2596b87 *man/ReadAkoya.Rd 5762e9f4a7845230cd51bc15ed3b566a *man/ReadMtx.Rd f5f3478bc3a28ec956ced2065a2f7e53 *man/ReadNanostring.Rd 66132a3df08e866a8cf5b3ca6dfde0b1 *man/ReadParseBio.Rd f1ad11d0fca856124de5a51b74030208 *man/ReadSTARsolo.Rd d1890cac6fdd515b30b1d531860a91cc *man/ReadSlideSeq.Rd 9c7c44f5c66a0cc5558b3ee531806eb5 *man/ReadVitessce.Rd 71b7c76533769db2e6adf481e9f84ee5 *man/ReadVizgen.Rd 78aabcd2d008c147ab98482b2841a20d *man/ReadXenium.Rd 1c547a95ca73f0797b3e5f5d1eedc121 *man/RegroupIdents.Rd 6b79dfaedf538506e893999f5883b60f *man/RelativeCounts.Rd a646d1b292f533da84baa95481c60e07 *man/RenameCells.Rd 8da502d67406e0764ece573bac13d4c1 *man/RidgePlot.Rd a16944fe961d7a83223e2b6d0f545ace *man/RunCCA.Rd f44a0003476d96e76ddc024e9b45d92e *man/RunGraphLaplacian.Rd 5e682dcc723d70793d1779200fb4f9d3 *man/RunICA.Rd dd27a4ffc07fc03a6cfb15314a83bfb9 *man/RunLDA.Rd c168a55d85e9d4823a5f92df2020d98b *man/RunLeiden.Rd 2cc88e408cf01a584c6ce9cbcc624eb5 *man/RunMarkVario.Rd d13af12c16f6994b7cfbe5162cac3520 *man/RunMixscape.Rd d4f90f5829c8313f3993d969b0dd4fd3 *man/RunMoransI.Rd 73c91ebf79ada8153c5f7358245d5aa3 *man/RunPCA.Rd dd2cefb6fd4e3f6ea986c78c93ef6394 *man/RunSLSI.Rd 0f18a7e8a15d996d74b0b33c55bd0980 *man/RunSPCA.Rd 37ce5f6f467602c4a96801a1c87bb64e *man/RunTSNE.Rd 9401151135f5efe97ad356c9086ae5d1 *man/RunUMAP.Rd ef9507637bb6cfbf79532658a15b5ded *man/SCTAssay-class.Rd 2d3d4cb04473bbca3bc30cf424121383 *man/SCTResults.Rd b886d6b212c0b31b320468a0cfa02551 *man/SCTransform.Rd 14aa955633f43d73c61265e4a6716a44 *man/STARmap-class.Rd d5a943cf68955f0f7d1ac2cd9c7ed9fe *man/SampleUMI.Rd f693b40dd329878965a9fde4d8f715da *man/SaveAnnoyIndex.Rd 836946b268469e87061ac24443e98514 *man/ScaleData.Rd 06c554c8defb9d651c14d58a16ca122a *man/ScaleFactors.Rd 6a5a8f3d33c62a3302c03ddd7ae9aa1a *man/ScoreJackStraw.Rd 6a5621426e2d0a21126d7db9a6b71730 *man/SelectIntegrationFeatures.Rd 52c3b86087f1060248e80a594a5f5617 *man/SelectIntegrationFeatures5.Rd e0a6c38a913e13e4970c7c164ccb7e22 *man/SelectSCTIntegrationFeatures.Rd b9d1869d6d91a923a32b44a53ded7928 *man/SetIntegrationData.Rd 36ac188e2049ee2afd46f86d72a519db *man/SetQuantile.Rd 303755316142cecedbbb571101e68308 *man/Seurat-class.Rd 08506dd69ef32ae9d189f81743edebbd *man/Seurat-package.Rd 25019aff00c3dba933466df65a45aaa7 *man/SeuratCommand-class.Rd c75bfcb240a635f5d043b11ff2ba4945 *man/SeuratTheme.Rd e35dd5cfbea354439a7473e47fdeb249 *man/SingleCorPlot.Rd 29bdd5bb6c41a9b01f373fdd41f6d772 *man/SingleDimPlot.Rd b33fc409e901a04d68aac75a7fd03a85 *man/SingleExIPlot.Rd 66ac79ddf7b86556f61db2a84af6ab52 *man/SingleImageMap.Rd dad89dff350e297d95f9128dd2739645 *man/SingleImagePlot.Rd f7634526d44a43bb62510bbbdd583797 *man/SingleRasterMap.Rd c4ae97aada37aa70084fc93f13fc9fcf *man/SingleSpatialPlot.Rd b5e401adf45e86d85828ae64682cb546 *man/SketchData.Rd ec6714bdc3bc045d7d84fa911ef3935a *man/SlideSeq-class.Rd 2cf1ea98315c627fdb61cebb8f833dc2 *man/SpatialImage-class.Rd 5fbf8635666d97a80db89a7f239c5aeb *man/SpatialPlot.Rd 693a850d4184b4e4ff54f1be3def8789 *man/SplitObject.Rd d78c8fa1d9543389a777500aae7f4633 *man/SubsetByBarcodeInflections.Rd 01f9df5bf0a798d91c7ced43f6d56052 *man/TopCells.Rd 98af7163f68d50deaf0a5247ce59e3d8 *man/TopFeatures.Rd c3a76377a0901f107b57f74555ec5800 *man/TopNeighbors.Rd 8ad4830f4b6516cc43e67c068450f52f *man/TransferAnchorSet-class.Rd 89a7a5eccc8311a00f36db28689faf94 *man/TransferData.Rd bab02c58b20b35d82cb881d6b11ae83b *man/TransferSketchLabels.Rd aef77da39c1d23b5a4ec7ab2cc242e3e *man/UnSketchEmbeddings.Rd e217e168b9ad9c8fa569d039f2c7560b *man/UpdateSCTAssays.Rd 93c5b0322467bbbf7d21fde062ffb97f *man/UpdateSymbolList.Rd 43aecf42dc587407071dd24fc6ffe21c *man/VST.Rd 89b553d2c34a6f93573ec8586df7ecf2 *man/VariableFeaturePlot.Rd 78cac046284771a0c0bc42e2e7b28a71 *man/VisiumV1-class.Rd 1d14ba9357df9b2248127324263c8a3c *man/VisiumV2-class.Rd 84589eec66838181a13f4c26d850c6da *man/VizDimLoadings.Rd f02e172d019660c53cb4637d7bd83cd9 *man/VlnPlot.Rd 4c05321384fe1f6619592fa1eaf1f228 *man/as.CellDataSet.Rd 03a3609f7132baaa37f738f6eacdb26b *man/as.Seurat.Rd 683d625a693896729e469f149c286fd7 *man/as.SingleCellExperiment.Rd f853c089d07c84e3f320d41951bd37b6 *man/as.sparse.Rd 18fba05b0ea57229dde949d7521f1a65 *man/cc.genes.Rd 35279bd7531c2f26183b3647e55dfd76 *man/cc.genes.updated.2019.Rd d843eff800711487e12a102038e5e7d4 *man/contrast-theory.Rd d33c2ae968af1bc5e97491bbc4afd9b4 *man/fortify-Spatial.Rd 5ac13a66d32c56c822f9a83c0c85a2b8 *man/merge.SCTAssay.Rd 89081dae347cc3c901be6d84a787a54a *man/reexports.Rd 24034598a79b8f1461b1647f2ce82b3b *man/roxygen/templates/note-reqdpkg.R 47d96c85155d705c5782b78087dafe8e *man/roxygen/templates/param-dotsi.R ef420f43ac9d0dfa1267c2c79c8cd5fe *man/roxygen/templates/param-dotsm.R 84d7260dd254c3dbeff57c77049aa163 *man/roxygen/templates/section-future.R 19902d3a32e10d5c456ad83cca0e6e57 *man/roxygen/templates/section-progressr.R c734e303b87cac72c78065f539f8c63c *man/roxygen/templates/seealso-methods.R 660b46a409867f33a33a2c74cd70aba3 *man/subset.AnchorSet.Rd 627f40da0df56c5cd99e97c842805fe8 *man/writing-integration.Rd daf246d2559a7df53698b1714f020b7a *src/Makevars d3bfefbd9ecbdd96dce901d0d0193668 *src/ModularityOptimizer.cpp 92e4aaaaf2d6921d718999c5bd9e9913 *src/ModularityOptimizer.h 24a6ab7279d09348f254732fd5ce2b8f *src/RModularityOptimizer.cpp d3a792f8147b4cc85d4174d9f1945f64 *src/RcppExports.cpp eeb4b89f57a28c13b7d353eac4f0f67a *src/data_manipulation.cpp 531a0da4cef6f8521d98bac8b9160e1e *src/data_manipulation.h cee56bd61191250ef5ae907838891d4a *src/fast_NN_dist.cpp c8f85a446cb1a8373fb3e2d0fdbb944c *src/integration.cpp 91debeffa7ebcac8c26af5d56d94ee0a *src/integration.h c86d8ffb7b0af9bd0ffe54222f0553f5 *src/snn.cpp 694a8ab034ccab2c5f7c35bf47b3469e *src/snn.h 1114ed8c2f704fd1d41de74d80f35ecc *src/stats.cpp f33c09d14c160d9f29a89251fd91a036 *src/valid_pointer.c 1d5009992bb3e703bb3f2482f9b8ddd2 *tests/testdata/barcodes.tsv d2554fb8e4d5af543605d0a729e36109 *tests/testdata/cr3.0/barcodes.tsv.gz 70e1ed4c347e2563a90fd2144f375a26 *tests/testdata/cr3.0/features.tsv.gz 75dc5f8ba97f4c3bc30ceb7926c5759b *tests/testdata/cr3.0/matrix.mtx.gz 91aa47aeda59ef6d82105100a09d1497 *tests/testdata/genes.tsv 6693f4ae1a15e0985ed513ee83fad927 *tests/testdata/matrix.mtx 646ac9cb85813dbe838d804f78f717a4 *tests/testdata/nbt_small.Rdata 0231c122b953c71d602ca29437c61d53 *tests/testdata/visium/filtered_feature_bc_matrix.h5 f246397b028c44c054bfbda1b5999233 *tests/testdata/visium/spatial/scalefactors_json.json 0dfb2701504a0aa4a0a41a2c2ae31988 *tests/testdata/visium/spatial/tissue_hires_image.png a18f94708c8b15bc938cddfc184fd899 *tests/testdata/visium/spatial/tissue_lowres_image.png e940f8084d865f7121e2b29418a773b0 *tests/testdata/visium/spatial/tissue_positions_list.csv 0231c122b953c71d602ca29437c61d53 *tests/testdata/visium_hd/binned_outputs/square_008um/filtered_feature_bc_matrix.h5 076f48401d1c803170ca04d84f3fbb64 *tests/testdata/visium_hd/binned_outputs/square_008um/spatial/scalefactors_json.json cf4892986d44b0ceaa17b6f92dc1d913 *tests/testdata/visium_hd/binned_outputs/square_008um/spatial/tissue_hires_image.png 716ffb696277fb030a35d40be7cf62c6 *tests/testdata/visium_hd/binned_outputs/square_008um/spatial/tissue_lowres_image.png 0f9f9471030d4a462d0e4a792885a401 *tests/testdata/visium_hd/binned_outputs/square_008um/spatial/tissue_positions.parquet 0231c122b953c71d602ca29437c61d53 *tests/testdata/visium_hd/binned_outputs/square_016um/filtered_feature_bc_matrix.h5 909c8933e3d507824a44dd890e0f04ba *tests/testdata/visium_hd/binned_outputs/square_016um/spatial/scalefactors_json.json cf4892986d44b0ceaa17b6f92dc1d913 *tests/testdata/visium_hd/binned_outputs/square_016um/spatial/tissue_hires_image.png 716ffb696277fb030a35d40be7cf62c6 *tests/testdata/visium_hd/binned_outputs/square_016um/spatial/tissue_lowres_image.png e16227edb3b0969510ffddeeed44ee13 *tests/testdata/visium_hd/binned_outputs/square_016um/spatial/tissue_positions.parquet 3dcbffe8e9b7dd575e70f9f5cc8b77df *tests/testthat.R 0a75db145a45197a2262cb1b83938124 *tests/testthat/test_data_manipulation.R ef95a904087d67497481a584847d7d0a *tests/testthat/test_differential_expression.R 4a57b960de9fcefb6be3936800292e3c *tests/testthat/test_dimensional_reduction.R ed116e01a950303f966f4da837eecacf *tests/testthat/test_find_clusters.R 7e5d7eb8a146b55f92f046c3cf503636 *tests/testthat/test_integratedata.R 4a3e421480b45332627cb12c5187e006 *tests/testthat/test_integration.R fcf04aab9317ad572cb3fd95f13438f3 *tests/testthat/test_integration5.R 2a4e042ec2b3054fc329f0ee3e8a01d5 *tests/testthat/test_load_10X.R e096ae1c8e0ea82b43c0e5ff4c5ba116 *tests/testthat/test_modularity_optimizer.R 33597bae1ade792062ad2eb6817e7247 *tests/testthat/test_objects.R e30112fefc5b9d52804cbfc7e062f554 *tests/testthat/test_preprocessing.R 1e9febbc165630e2064509c7f2a61133 *tests/testthat/test_read_mtx.R 17e286852b364181a6efb244a864e93e *tests/testthat/test_sketching.R 57f934ba52343f5c9404cc888ace329a *tests/testthat/test_spatial.R a8e682e9926fec147ac70519ad3cd80b *tests/testthat/test_transferdata.R c9b3f10afd1c72c04363722488c7603e *tests/testthat/test_tree.R 251fe1e772f51b5e36830da9bbd73d7d *tests/testthat/test_utilities.R 5124c1daa2609472441694d6ad91a26d *tests/testthat/test_visualization.R Seurat/R/0000755000176200001440000000000014744474101011724 5ustar liggesusersSeurat/R/objects.R0000644000176200001440000030657414744463014013520 0ustar liggesusers#' @include reexports.R #' @include generics.R #' @importFrom Rcpp evalCpp #' @importFrom Matrix colSums rowSums colMeans rowMeans #' @importFrom methods setClass setOldClass setClassUnion slot #' slot<- setMethod new signature slotNames is setAs setValidity .hasSlot #' @importClassesFrom Matrix dgCMatrix #' @useDynLib Seurat #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Class definitions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% setOldClass(Classes = 'package_version') #' The AnchorSet Class #' #' The AnchorSet class is an intermediate data storage class that stores the anchors and other #' related information needed for performing downstream analyses - namely data integration #' (\code{\link{IntegrateData}}) and data transfer (\code{\link{TransferData}}). #' #' @slot object.list List of objects used to create anchors #' @slot reference.cells List of cell names in the reference dataset - needed when performing data #' transfer. #' @slot reference.objects Position of reference object/s in object.list #' @slot query.cells List of cell names in the query dataset - needed when performing data transfer #' @slot anchors The anchor matrix. This contains the cell indices of both anchor pair cells, the #' anchor score, and the index of the original dataset in the object.list for cell1 and cell2 of #' the anchor. #' @slot offsets The offsets used to enable cell look up in downstream functions #' @slot weight.reduction The weight dimensional reduction used to calculate weight matrix #' @slot anchor.features The features used when performing anchor finding. #' @slot neighbors List containing Neighbor objects for reuse later (e.g. mapping) #' @slot command Store log of parameters that were used #' #' @name AnchorSet-class #' @rdname AnchorSet-class #' @concept objects #' @exportClass AnchorSet #' AnchorSet <- setClass( Class = "AnchorSet", contains = 'VIRTUAL', slots = list( object.list = "list", reference.cells = "vector", reference.objects = "vector", query.cells = "vector", anchors = "ANY", offsets = "ANY", weight.reduction = "DimReduc", anchor.features = "ANY", neighbors = "list", command = "ANY" ) ) #' The TransferAnchorSet Class #' #' Inherits from the Anchorset class. Implemented mainly for method dispatch #' purposes. See \code{\link{AnchorSet}} for slot details. #' #' @name TransferAnchorSet-class #' @rdname TransferAnchorSet-class #' @concept objects #' @exportClass TransferAnchorSet #' TransferAnchorSet <- setClass( Class = "TransferAnchorSet", contains = "AnchorSet" ) #' The IntegrationAnchorSet Class #' #' Inherits from the Anchorset class. Implemented mainly for method dispatch #' purposes. See \code{\link{AnchorSet}} for slot details. #' #' @name IntegrationAnchorSet-class #' @rdname IntegrationAnchorSet-class #' @concept objects #' @exportClass IntegrationAnchorSet #' IntegrationAnchorSet <- setClass( Class = "IntegrationAnchorSet", contains = "AnchorSet" ) #' The ModalityWeights Class #' #' The ModalityWeights class is an intermediate data storage class that stores the modality weight and other #' related information needed for performing downstream analyses - namely data integration #' (\code{FindModalityWeights}) and data transfer (\code{\link{FindMultiModalNeighbors}}). #' #' @slot modality.weight.list A list of modality weights value from all modalities #' @slot modality.assay Names of assays for the list of dimensional reductions #' @slot params A list of parameters used in the FindModalityWeights #' @slot score.matrix a list of score matrices representing cross and within-modality prediction #' score, and kernel value #' @slot command Store log of parameters that were used #' #' @name ModalityWeights-class #' @rdname ModalityWeights-class #' @concept objects #' @exportClass ModalityWeights #' ModalityWeights <- setClass( Class = "ModalityWeights", slots = list( modality.weight.list = "list", modality.assay = "vector", params = "list", score.matrix = "list", command = "ANY" ) ) #' The BridgeReferenceSet Class #' The BridgeReferenceSet is an output from PrepareBridgeReference #' @slot bridge The multi-omic object #' @slot reference The Reference object only containing bridge representation assay #' @slot params A list of parameters used in the PrepareBridgeReference #' @slot command Store log of parameters that were used #' #' @name BridgeReferenceSet-class #' @rdname BridgeReferenceSet-class #' @concept objects #' @exportClass BridgeReferenceSet #' BridgeReferenceSet <- setClass( Class = "BridgeReferenceSet", slots = list( bridge = "ANY", reference = "ANY", params = "list", command = "ANY" ) ) #' The IntegrationData Class #' #' The IntegrationData object is an intermediate storage container used internally throughout the #' integration procedure to hold bits of data that are useful downstream. #' #' @slot neighbors List of neighborhood information for cells (outputs of \code{RANN::nn2}) #' @slot weights Anchor weight matrix #' @slot integration.matrix Integration matrix #' @slot anchors Anchor matrix #' @slot offsets The offsets used to enable cell look up in downstream functions #' @slot objects.ncell Number of cells in each object in the object.list #' @slot sample.tree Sample tree used for ordering multi-dataset integration #' #' @name IntegrationData-class #' @rdname IntegrationData-class #' @concept objects #' @exportClass IntegrationData #' IntegrationData <- setClass( Class = "IntegrationData", slots = list( neighbors = "ANY", weights = "ANY", integration.matrix = "ANY", anchors = "ANY", offsets = "ANY", objects.ncell = "ANY", sample.tree = "ANY" ) ) #' The SCTModel Class #' #' The SCTModel object is a model and parameters storage from SCTransform. #' It can be used to calculate Pearson residuals for new genes. #' #' @slot feature.attributes A data.frame with feature attributes in SCTransform #' @slot cell.attributes A data.frame with cell attributes in SCTransform #' @slot clips A list of two numeric of length two specifying the min and max #' values the Pearson residual will be clipped to. One for vst and one for #' SCTransform #' @slot umi.assay Name of the assay of the seurat object containing UMI matrix #' and the default is RNA #' @slot model A formula used in SCTransform #' @slot arguments other information used in SCTransform #' @slot median_umi Median UMI (or scale factor) used to calculate corrected counts #' #' @seealso \code{\link[SeuratObject]{Assay}} #' #' @name SCTAssay-class #' @rdname SCTAssay-class #' @concept objects #' #' @examples #' \dontrun{ #' # SCTAssay objects are generated from SCTransform #' pbmc_small <- SCTransform(pbmc_small) #' } #' SCTModel <- setClass( Class = 'SCTModel', slots = c( feature.attributes = 'data.frame', cell.attributes = 'data.frame', clips = 'list', umi.assay = 'character', model = 'character', arguments = 'list', median_umi = 'numeric' ) ) #' The SCTAssay Class #' #' The SCTAssay object contains all the information found in an \code{\link[SeuratObject]{Assay}} #' object, with extra information from the results of \code{\link{SCTransform}} #' #' @slot SCTModel.list A list containing SCT models #' #' @seealso \code{\link[SeuratObject]{Assay}} #' #' @name SCTAssay-class #' @rdname SCTAssay-class #' @concept objects #' #' @examples #' \dontrun{ #' # SCTAssay objects are generated from SCTransform #' pbmc_small <- SCTransform(pbmc_small) #' pbmc_small[["SCT"]] #' } #' SCTAssay <- setClass( Class = 'SCTAssay', contains = 'Assay', slots = c( SCTModel.list = 'list' ) ) #' @note \code{scalefactors} objects can be created with \code{scalefactors()} #' #' @param spot Spot full resolution scale factor #' @param fiducial Fiducial full resolution scale factor #' @param hires High resolutoin scale factor #' @param lowres Low resolution scale factor #' #' @rdname ScaleFactors #' @concept objects #' @concept spatial #' @export #' scalefactors <- function(spot, fiducial, hires, lowres) { object <- list( spot = spot, fiducial = fiducial, hires = hires, lowres = lowres ) object <- sapply(X = object, FUN = as.numeric, simplify = FALSE, USE.NAMES = TRUE) return(structure(.Data = object, class = 'scalefactors')) } setOldClass(Classes = c('scalefactors')) #' The SlideSeq class #' #' The SlideSeq class represents spatial information from the Slide-seq platform #' #' @inheritSection SeuratObject::SpatialImage Slots #' @slot coordinates ... #' @concept spatial #' SlideSeq <- setClass( Class = 'SlideSeq', contains = 'SpatialImage', slots = list( 'coordinates' = 'data.frame' ) ) #' The STARmap class #' #' #' @inheritSection SeuratObject::SpatialImage Slots #' @concept objects #' @concept spatial #' STARmap <- setClass( Class = 'STARmap', contains = 'SpatialImage', slots = list( 'coordinates' = 'data.frame', 'qhulls' = 'data.frame' ) ) #' The VisiumV1 class #' #' The VisiumV1 class represents spatial information from the 10X Genomics Visium #' platform #' #' @slot image A three-dimensional array with PNG image data, see #' \code{\link[png]{readPNG}} for more details #' @slot scale.factors An object of class \code{\link{scalefactors}}; see #' \code{\link{scalefactors}} for more information #' @slot coordinates A data frame with tissue coordinate information #' @slot spot.radius Single numeric value giving the radius of the spots #' #' @name VisiumV1-class #' @rdname VisiumV1-class #' @concept objects #' @concept spatial #' @exportClass VisiumV1 #' VisiumV1 <- setClass( Class = 'VisiumV1', contains = 'SpatialImage', slots = list( 'image' = 'array', 'scale.factors' = 'scalefactors', 'coordinates' = 'data.frame', 'spot.radius' = 'numeric' ) ) #' The VisiumV2 class #' #' The VisiumV2 class represents spatial information from the 10X Genomics #' Visium HD platform - it can also accomodate data from the standard #' Visium platform #' #' @slot image A three-dimensional array with PNG image data, see #' \code{\link[png]{readPNG}} for more details #' @slot scale.factors An object of class \code{\link{scalefactors}}; see #' \code{\link{scalefactors}} for more information #' #' @importClassesFrom SeuratObject FOV #' @name VisiumV2-class #' #' @concept objects #' @concept spatial #' @exportClass VisiumV2 VisiumV2 <- setClass( Class = "VisiumV2", contains = "FOV", slots = list( image = "array", scale.factors = "scalefactors" ) ) setClass(Class = 'SliceImage', contains = 'VisiumV1') #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Get a vector of cell names associated with an image (or set of images) #' #' @param object Seurat object #' @param images Vector of image names #' @param unlist Return as a single vector of cell names as opposed to a list, #' named by image name. #' #' @return A vector of cell names #' #' @examples #' \dontrun{ #' CellsByImage(object = object, images = "slice1") #' } #' #' @keywords internal #' CellsByImage <- function(object, images = NULL, unlist = FALSE) { images <- images %||% Images(object = object) cells <- sapply( X = images, FUN = function(x) { Cells(x = object[[x]]) }, simplify = FALSE, USE.NAMES = TRUE ) if (unlist) { cells <- unname(obj = unlist(x = cells)) } return(cells) } #' Create a SCT Assay object #' #' Create a SCT object from a feature (e.g. gene) expression matrix and a list of SCTModels. #' The expected format of the input matrix is features x cells. #' #' Non-unique cell or feature names are not allowed. Please make unique before #' calling this function. #' @param scale.data a residual matrix #' @param SCTModel.list list of SCTModels #' @param umi.assay The UMI assay name. Default is RNA #' @inheritParams SeuratObject::CreateAssayObject #' #' @importFrom methods as #' @importFrom Matrix colSums rowSums #' #' @export #' @concept objects #' CreateSCTAssayObject <- function( counts, data, scale.data = NULL, umi.assay = "RNA", min.cells = 0, min.features = 0, SCTModel.list = NULL ) { assay <- CreateAssayObject( counts = counts, data = data, min.cells = min.cells, min.features = min.features ) if (!is.null(scale.data)) { assay <- SetAssayData(object = assay, slot = "scale.data", new.data = scale.data) } slot(object = assay, name = "assay.orig") <- umi.assay #checking SCTModel.list format if (is.null(x = SCTModel.list)) { SCTModel.type <- "none" warning("An empty SCTModel will be generated due to no SCTModel input") } else { if (inherits(x = SCTModel.list, what = "SCTModel")) { SCTModel.list <- list(model1 = SCTModel.list) SCTModel.type <- "SCTModel.list" } else if (inherits(x = SCTModel.list, what = "list")) { if (inherits(x = SCTModel.list[[1]], what = "SCTModel")){ SCTModel.type <- "SCTModel.list" } else if (IsVSTout(vst.out = SCTModel.list)){ SCTModel.type <- "vst.out" } else if (IsVSTout(SCTModel.list[[1]])) { SCTModel.type <- "vst.set" } else { stop("SCTModel input is not a correct format") } } } model.list <- switch( EXPR = SCTModel.type, "none" = { list() }, "SCTModel.list" = { SCTModel.list <- lapply(X = SCTModel.list, FUN = function(model) { select.cell <- intersect(x = Cells(x = model), Cells(x = assay)) if (length(x = select.cell) == 0) { stop("Cells in SCTModel.list don't match Cells in assay") } else { model@cell.attributes <- model@cell.attributes[select.cell, , drop = FALSE] } return(model) }) SCTModel.list }, "vst.out" = { SCTModel.list$umi.assay <- umi.assay SCTModel.list <- PrepVSTResults( vst.res = SCTModel.list, cell.names = Cells(x = assay) ) list(model1 = SCTModel.list) }, "vst.set" = { new.model <- lapply( X = SCTModel.list, FUN = function(vst.res) { vst.res$umi.assay <- umi.assay return(PrepVSTResults(vst.res = vst.res, cell.names = colnames(x = assay))) } ) names(x = new.model) <- paste0("model", 1:length(x = new.model)) new.model } ) assay <- new( Class = "SCTAssay", assay, SCTModel.list = model.list ) return(assay) } #' Slim down a Seurat object #' #' Keep only certain aspects of the Seurat object. Can be useful in functions #' that utilize merge as it reduces the amount of data in the merge #' #' @param object A \code{\link[SeuratObject]{Seurat}} object #' @param layers A vector or named list of layers to keep #' @param features Only keep a subset of features, defaults to all features #' @param assays Only keep a subset of assays specified here #' @param dimreducs Only keep a subset of DimReducs specified here (if #' \code{NULL}, remove all DimReducs) #' @param graphs Only keep a subset of Graphs specified here (if \code{NULL}, #' remove all Graphs) #' @param misc Preserve the \code{misc} slot; default is \code{TRUE} #' @param counts Preserve the count matrices for the assays specified #' @param data Preserve the data matrices for the assays specified #' @param scale.data Preserve the scale data matrices for the assays specified #' @param ... Ignored #' #' @return \code{object} with only the sub-object specified retained #' #' @importFrom SeuratObject .FilterObjects .PropagateList Assays #' Layers UpdateSlots #' #' @export #' #' @concept objects #' DietSeurat <- function( object, layers = NULL, features = NULL, assays = NULL, dimreducs = NULL, graphs = NULL, misc = TRUE, counts = deprecated(), data = deprecated(), scale.data = deprecated(), ... ) { CheckDots(...) dep.args <- c(counts = counts, data = data, scale.data = scale.data) for (lyr in names(x = dep.args)) { if (is_present(arg = dep.args[[lyr]])) { if (is.null(x = layers)) { layers <- unique(x = unlist(x = lapply( X = Assays(object = object), FUN = function(x) { return(Layers(object = object[[x]])) } ))) } deprecate_soft( when = '5.0.0', what = paste0('DietSeurat(', lyr, ' = )'), with = 'DietSeurat(layers = )' ) layers <- if (isTRUE(x = dep.args[[lyr]])) { c(layers, lyr) } else { Filter(f = function(x) x != lyr, x = layers) } } } object <- UpdateSlots(object = object) assays <- assays %||% Assays(object = object) assays <- intersect(x = assays, y = Assays(object = object)) if (!length(x = assays)) { abort(message = "No assays provided were found in the Seurat object") } if (!DefaultAssay(object = object) %in% assays) { abort( message = "The default assay is slated to be removed, please change the default assay" ) } layers <- layers %||% assays layers <- .PropagateList(x = layers, names = assays) for (assay in names(x = layers)) { layers[[assay]] <- tryCatch( expr = Layers(object = object[[assay]], search = layers[[assay]]), error = function(...) { return(character(length = 0L)) } ) } layers <- Filter(f = length, x = layers) if (!length(x = layers)) { abort(message = "None of the requested layers found") } for (assay in Assays(object = object)) { if (!(assay %in% assays)) { object[[assay]] <- NULL next } layers.rm <- setdiff( x = Layers(object = object[[assay]]), y = layers[[assay]] ) if (length(x = layers.rm)) { if (inherits(x = object[[assay]], what = 'Assay') && all(c('counts', 'data') %in% layers.rm)) { abort(message = "Cannot remove both 'counts' and 'data' from v3 Assays") } for (lyr in layers.rm) { suppressWarnings(object <- tryCatch(expr = { object[[assay]][lyr] <- NULL object }, error = function(e) { if (lyr == "data"){ object[[assay]][lyr] <- sparseMatrix(i = 1, j = 1, x = 1, dims = dim(object[[assay]][lyr]), dimnames = dimnames(object[[assay]][lyr])) } else{ slot(object = object[[assay]], name = lyr) <- new(Class = "dgCMatrix") } message("Converting layer ", lyr, " in assay ", assay, " to empty dgCMatrix") object })) } } if (!is.null(x = features)) { features.assay <- intersect( x = features, y = rownames(x = object[[assay]]) ) if (!length(x = features.assay)) { warn(message = paste0( 'No features found in assay ', sQuote(x = assay), ', removing...' )) object[[assay]] <- NULL next } suppressWarnings(object[[assay]] <- subset(x = object[[assay]], features = features.assay)) } } # remove misc when desired if (!isTRUE(x = misc)) { slot(object = object, name = "misc") <- list() } # remove unspecified DimReducs and Graphs all.objects <- .FilterObjects( object = object, classes.keep = c('DimReduc', 'Graph') ) objects.to.remove <- all.objects[!all.objects %in% c(dimreducs, graphs)] for (ob in objects.to.remove) { object[[ob]] <- NULL } cells.keep <- list() for (assay in Assays(object = object)) { cells.keep[[assay]] <- colnames(x = object[[assay]] ) } cells.keep <- intersect(colnames(x = object), unlist(cells.keep)) if (length(cells.keep) <- ncol(x = object)) { object <- subset(object, cells = cells.keep) } return(object) } #' Filter stray beads from Slide-seq puck #' #' This function is useful for removing stray beads that fall outside the main #' Slide-seq puck area. Essentially, it's a circular filter where you set a #' center and radius defining a circle of beads to keep. If the center is not #' set, it will be estimated from the bead coordinates (removing the 1st and #' 99th quantile to avoid skewing the center by the stray beads). By default, #' this function will display a \code{\link{SpatialDimPlot}} showing which cells #' were removed for easy adjustment of the center and/or radius. #' #' @param object Seurat object with slide-seq data #' @param image Name of the image where the coordinates are stored #' @param center Vector specifying the x and y coordinates for the center of the #' inclusion circle #' @param radius Radius of the circle of inclusion #' @param do.plot Display a \code{\link{SpatialDimPlot}} with the cells being #' removed labeled. #' #' @return Returns a Seurat object with only the subset of cells that pass the #' circular filter #' #' @concept objects #' @concept spatial #' @examples #' \dontrun{ #' # This example uses the ssHippo dataset which you can download #' # using the SeuratData package. #' library(SeuratData) #' data('ssHippo') #' # perform filtering of beads #' ssHippo.filtered <- FilterSlideSeq(ssHippo, radius = 2300) #' # This radius looks to small so increase and repeat until satisfied #' } #' @export #' FilterSlideSeq <- function( object, image = "image", center = NULL, radius = NULL, do.plot = TRUE ) { if (!inherits(x = object[[image]], what = "SlideSeq")) { warning( "This fxn is intended for filtering SlideSeq data and is untested ", "outside of that context." ) } dat <- GetTissueCoordinates(object[[image]]) if (is.null(x = center)) { # heuristic for determining center of puck center <- c() x.vals <- dat[, 1] center[1] <- mean( x = x.vals[x.vals < quantile(x = x.vals, probs = 0.99) & x.vals > quantile(x = x.vals, probs = 0.01)] ) y.vals <- dat[, 2] center[2] <- mean( x = y.vals[y.vals < quantile(x = y.vals, probs = 0.99) & y.vals > quantile(x = y.vals, probs = 0.01)] ) } if (is.null(x = radius)) { stop("Please provide a radius.") } dists <- apply(X = dat, MARGIN = 1, FUN = function(x) { as.numeric(dist(rbind(x[c(1, 2)], center))) }) cells.to.remove <- names(x = which(x = (dists > radius))) if (do.plot) { Idents(object) <- "keep" object <- SetIdent(object = object, cells = cells.to.remove, value = "remove") print(SpatialDimPlot(object = object)) } return(subset(x = object, cells = cells.to.remove, invert = TRUE)) } #' Get integration data #' #' @param object Seurat object #' @param integration.name Name of integration object #' @param slot Which slot in integration object to get #' #' @return Returns data from the requested slot within the integrated object #' #' @export #' @concept objects #' GetIntegrationData <- function(object, integration.name, slot) { tools <- slot(object = object, name = 'tools') if (!(integration.name %in% names(tools))) { stop('Requested integration key does not exist') } int.data <- tools[[integration.name]] return(slot(object = int.data, name = slot)) } #' Set integration data #' #' @param object Seurat object #' @param integration.name Name of integration object #' @param slot Which slot in integration object to set #' @param new.data New data to insert #' #' @return Returns a \code{\link{Seurat}} object #' #' @export #' @concept objects #' SetIntegrationData <- function(object, integration.name, slot, new.data) { tools <- slot(object = object, name = 'tools') if (!(integration.name %in% names(tools))) { new.integrated <- new(Class = 'IntegrationData') slot(object = new.integrated, name = slot) <- new.data tools[[integration.name]] <- new.integrated slot(object = object, name = 'tools') <- tools return(object) } int.data <- tools[[integration.name]] slot(object = int.data, name = slot) <- new.data tools[[integration.name]] <- int.data slot(object = object, name = 'tools') <- tools return(object) } #' Splits object into a list of subsetted objects. #' #' Splits object based on a single attribute into a list of subsetted objects, #' one for each level of the attribute. For example, useful for taking an object #' that contains cells from many patients, and subdividing it into #' patient-specific objects. #' #' @param object Seurat object #' @param split.by Attribute for splitting. Default is "ident". Currently #' only supported for class-level (i.e. non-quantitative) attributes. #' #' @return A named list of Seurat objects, each containing a subset of cells #' from the original object. #' #' @export #' @concept objects #' #' @examples #' data("pbmc_small") #' # Assign the test object a three level attribute #' groups <- sample(c("group1", "group2", "group3"), size = 80, replace = TRUE) #' names(groups) <- colnames(pbmc_small) #' pbmc_small <- AddMetaData(object = pbmc_small, metadata = groups, col.name = "group") #' obj.list <- SplitObject(pbmc_small, split.by = "group") #' SplitObject <- function(object, split.by = "ident") { if (split.by == 'ident') { groupings <- Idents(object = object) } else { groupings <- FetchData(object = object, vars = split.by)[, 1] } groupings <- unique(x = as.character(x = groupings)) obj.list <- list() for (i in groupings) { if (split.by == "ident") { obj.list[[i]] <- subset(x = object, idents = i) } else { cells <- which(x = object[[split.by, drop = TRUE]] == i) cells <- colnames(x = object)[cells] obj.list[[i]] <- subset(x = object, cells = cells) } } return(obj.list) } #' Find features with highest scores for a given dimensional reduction technique #' #' Return a list of features with the strongest contribution to a set of components #' #' @param object DimReduc object #' @param dim Dimension to use #' @param nfeatures Number of features to return #' @param projected Use the projected feature loadings #' @param balanced Return an equal number of features with both + and - scores. #' @param ... Extra parameters passed to \code{\link{Loadings}} #' #' @return Returns a vector of features #' #' @export #' @concept objects #' #' @examples #' data("pbmc_small") #' pbmc_small #' TopFeatures(object = pbmc_small[["pca"]], dim = 1) #' # After projection: #' TopFeatures(object = pbmc_small[["pca"]], dim = 1, projected = TRUE) #' TopFeatures <- function( object, dim = 1, nfeatures = 20, projected = FALSE, balanced = FALSE, ... ) { loadings <- Loadings(object = object, projected = projected, ...)[, dim, drop = FALSE] return(Top( data = loadings, num = nfeatures, balanced = balanced )) } #' Find cells with highest scores for a given dimensional reduction technique #' #' Return a list of genes with the strongest contribution to a set of components #' #' @param object DimReduc object #' @param dim Dimension to use #' @param ncells Number of cells to return #' @param balanced Return an equal number of cells with both + and - scores. #' @param ... Extra parameters passed to \code{\link{Embeddings}} #' #' @return Returns a vector of cells #' #' @export #' @concept objects #' #' @examples #' data("pbmc_small") #' pbmc_small #' head(TopCells(object = pbmc_small[["pca"]])) #' # Can specify which dimension and how many cells to return #' TopCells(object = pbmc_small[["pca"]], dim = 2, ncells = 5) #' TopCells <- function(object, dim = 1, ncells = 20, balanced = FALSE, ...) { embeddings <- Embeddings(object = object, ...)[, dim, drop = FALSE] return(Top( data = embeddings, num = ncells, balanced = balanced )) } #' Get nearest neighbors for given cell #' #' Return a vector of cell names of the nearest n cells. #' #' @param object \code{\link[SeuratObject]{Neighbor}} object #' @param cell Cell of interest #' @param n Number of neighbors to return #' #' @return Returns a vector of cell names #' #' @export #' @concept objects #' TopNeighbors <- function(object, cell, n = 5) { indices <- Indices(object = object)[cell, 1:n] return(Cells(x = object)[indices]) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param assay Assay to convert #' @param reduction Name of DimReduc to set to main reducedDim in cds #' #' @rdname as.CellDataSet #' @concept objects #' @export #' @method as.CellDataSet Seurat #' as.CellDataSet.Seurat <- function(x, assay = NULL, reduction = NULL, ...) { CheckDots(...) if (!PackageCheck('monocle', error = FALSE)) { stop("Please install monocle from Bioconductor before converting to a CellDataSet object") } else if (packageVersion(pkg = 'monocle') >= package_version(x = '2.99.0')) { stop("Seurat can only convert to/from Monocle v2.X objects") } assay <- assay %||% DefaultAssay(object = x) # make variables, then run `newCellDataSet` # create cellData counts counts <- GetAssayData(object = x, assay = assay, slot = "counts") # metadata cell.metadata <- x[[]] feature.metadata <- x[[assay]][[]] if (!"gene_short_name" %in% colnames(x = feature.metadata)) { feature.metadata$gene_short_name <- rownames(x = feature.metadata) } pd <- new(Class = "AnnotatedDataFrame", data = cell.metadata) fd <- new(Class = "AnnotatedDataFrame", data = feature.metadata) # Now, determine the expressionFamily if ("monocle" %in% names(x = Misc(object = x))) { expressionFamily <- Misc(object = x, slot = "monocle")[["expressionFamily"]] } else { if (all(counts == floor(x = counts))) { expressionFamily <- VGAM::negbinomial.size() } else if (any(counts < 0)) { expressionFamily <- VGAM::uninormal() } else { expressionFamily <- VGAM::tobit() } } cds <- monocle::newCellDataSet( cellData = counts, phenoData = pd, featureData = fd, expressionFamily = expressionFamily ) if ("monocle" %in% names(x = Misc(object = x))) { monocle::cellPairwiseDistances(cds = cds) <- Misc(object = x, slot = "monocle")[["cellPairwiseDistances"]] monocle::minSpanningTree(cds = cds) <- Misc(object = x, slot = "monocle")[["minSpanningTree"]] Biobase::experimentData(cds = cds) <- Misc(object = x, slot = "monocle")[["experimentData"]] Biobase::protocolData(cds = cds) <- Misc(object = x, slot = "monocle")[["protocolData"]] Biobase::classVersion(cds = cds) <- Misc(object = x, slot = "monocle")[["classVersion"]] # no setter methods found for following slots slot(object = cds, name = "lowerDetectionLimit") <- Misc(object = x, slot = "monocle")[["lowerDetectionLimit"]] slot(object = cds, name = "dispFitInfo") <- Misc(object = x, slot = "monocle")[["dispFitInfo"]] slot(object = cds, name = "auxOrderingData") <- Misc(object = x, slot = "monocle")[["auxOrderingData"]] slot(object = cds, name = "auxClusteringData") <- Misc(object = x, slot = "monocle")[["auxClusteringData"]] } # adding dimensionality reduction data to the CDS dr.slots <- c("reducedDimS", "reducedDimK", "reducedDimW", "reducedDimA") reduction <- reduction %||% DefaultDimReduc(object = x, assay = assay) if (!is.null(x = reduction)) { if (grepl(pattern = 'tsne', x = tolower(x = reduction))) { slot(object = cds, name = "dim_reduce_type") <- "tSNE" monocle::reducedDimA(cds = cds) <- t(x = Embeddings(object = x[[reduction]])) } else { slot(object = cds, name = "dim_reduce_type") <- reduction monocle::reducedDimA(cds = cds) <- Loadings(object = x[[reduction]]) slot(object = cds, name = "reducedDimS") <- Embeddings(object = x[[reduction]]) } for (ii in dr.slots) { if (ii %in% names(x = slot(object = x[[reduction]], name = "misc"))) { slot(object = cds, name = ii) <- slot(object = x[[reduction]], name = "misc")[[ii]] } } } return(cds) } #' Convert objects to \code{Seurat} objects #' #' @inheritParams SeuratObject::as.Seurat #' @param slot Slot to store expression data as #' @param verbose Show progress updates #' #' @return A \code{Seurat} object generated from \code{x} #' #' @importFrom utils packageVersion #' #' @rdname as.Seurat #' @concept objects #' @export #' @method as.Seurat CellDataSet #' #' @seealso \code{\link[SeuratObject:as.Seurat]{SeuratObject::as.Seurat}} #' as.Seurat.CellDataSet <- function( x, slot = 'counts', assay = 'RNA', verbose = TRUE, ... ) { CheckDots(...) if (!PackageCheck('monocle', error = FALSE)) { stop("Please install monocle from Bioconductor before converting to a CellDataSet object") } else if (packageVersion(pkg = 'monocle') >= package_version(x = '2.99.0')) { stop("Seurat can only convert to/from Monocle v2.X objects") } slot <- match.arg(arg = slot, choices = c('counts', 'data')) if (verbose) { message("Pulling expression data") } expr <- Biobase::exprs(object = x) if (IsMatrixEmpty(x = expr)) { stop("No data provided in this CellDataSet object", call. = FALSE) } meta.data <- as.data.frame(x = Biobase::pData(object = x)) # if cell names are NULL, fill with cell_X if (is.null(x = colnames(x = expr))) { warning( "The column names of the 'counts' and 'data' matrices are NULL. Setting cell names to cell_columnidx (e.g 'cell_1').", call. = FALSE, immediate. = TRUE ) rownames(x = meta.data) <- colnames(x = expr) <- paste0("cell_", 1:ncol(x = expr)) } # Creating the object if (verbose) { message("Building Seurat object") } if (slot == 'data') { assays <- list(CreateAssayObject(data = expr)) names(x = assays) <- assay Key(object = assays[[assay]]) <- suppressWarnings(expr = UpdateKey(key = assay)) object <- new( Class = 'Seurat', assays = assays, meta.data = meta.data, version = packageVersion(pkg = 'Seurat'), project.name = 'SeuratProject' ) DefaultAssay(object = object) <- assay } else { object <- CreateSeuratObject( counts = expr, meta.data = meta.data, assay = assay ) } # feature metadata if (verbose) { message("Adding feature-level metadata") } feature.metadata <- Biobase::fData(object = x) object[[assay]][[names(x = feature.metadata)]] <- feature.metadata # mean/dispersion values disp.table <- tryCatch( expr = suppressWarnings(expr = monocle::dispersionTable(cds = x)), error = function(...) { return(NULL) } ) if (!is.null(x = disp.table)) { if (verbose) { message("Adding dispersion information") } rownames(x = disp.table) <- disp.table[, 1] disp.table[, 1] <- NULL colnames(x = disp.table) <- paste0('monocle_', colnames(x = disp.table)) object[[assay]][[names(x = disp.table)]] <- disp.table } else if (verbose) { message("No dispersion information in CellDataSet object") } # variable features if ("use_for_ordering" %in% colnames(x = feature.metadata)) { if (verbose) { message("Setting variable features") } VariableFeatures(object = object, assay = assay) <- rownames(x = feature.metadata)[which(x = feature.metadata[, "use_for_ordering"])] } else if (verbose) { message("No variable features present") } # add dim reduction dr.name <- slot(object = x, name = "dim_reduce_type") if (length(x = dr.name) > 0) { if (verbose) { message("Adding ", dr.name, " dimensional reduction") } reduced.A <- t(x = slot(object = x, name = 'reducedDimA')) reduced.S <- t(x = slot(object = x, name = 'reducedDimS')) if (IsMatrixEmpty(x = reduced.S)) { embeddings <- reduced.A loadings <- new(Class = 'matrix') } else { embeddings <- reduced.S loadings <- t(x = reduced.A) } rownames(x = embeddings) <- colnames(x = object) misc.dr <- list( reducedDimS = slot(object = x, name = "reducedDimS"), reducedDimK = slot(object = x, name = "reducedDimK"), reducedDimW = slot(object = x, name = "reducedDimW"), reducedDimA = slot(object = x, name = "reducedDimA") ) dr <- suppressWarnings(expr = CreateDimReducObject( embeddings = embeddings, loadings = loadings, assay = assay, key = UpdateKey(key = tolower(x = dr.name)), misc = misc.dr )) object[[dr.name]] <- dr } else if (verbose) { message("No dimensional reduction information found") } monocle.specific.info <- list( expressionFamily = slot(object = x, name = "expressionFamily"), lowerDetectionLimit = slot(object = x, name = "lowerDetectionLimit"), dispFitInfo = slot(object = x, name = "dispFitInfo"), cellPairwiseDistances = slot(object = x, name = "cellPairwiseDistances"), minSpanningTree = slot(object = x, name = "minSpanningTree"), auxOrderingData = slot(object = x, name = "auxOrderingData"), auxClusteringData = slot(object = x, name = "auxClusteringData"), experimentData = slot(object = x, name = "experimentData"), protocolData = slot(object = x, name = "protocolData"), classVersion = slot(object = x, name = ".__classVersion__") ) Misc(object = object, slot = "monocle") <- monocle.specific.info return(object) } #' @param counts name of the SingleCellExperiment assay to store as \code{counts}; #' set to \code{NULL} if only normalized data are present #' @param data name of the SingleCellExperiment assay to slot as \code{data}. #' Set to NULL if only counts are present #' @param assay Name of assays to convert; set to \code{NULL} for all assays to be converted #' @param project Project name for new Seurat object #' #' @rdname as.Seurat #' @concept objects #' @export #' @method as.Seurat SingleCellExperiment #' as.Seurat.SingleCellExperiment <- function( x, counts = 'counts', data = 'logcounts', assay = NULL, project = 'SingleCellExperiment', ... ) { CheckDots(...) if (!PackageCheck('SingleCellExperiment', error = FALSE)) { stop( "Please install SingleCellExperiment from Bioconductor before converting to a SingleCellExperiment object.", "\nhttps://bioconductor.org/packages/SingleCellExperiment/", call. = FALSE ) } meta.data <- as.data.frame(x = SummarizedExperiment::colData(x = x)) if (packageVersion(pkg = "SingleCellExperiment") >= "1.14.0") { orig.exp <- SingleCellExperiment::mainExpName(x = x) %||% "originalexp" } else { orig.exp <- "originalexp" } if (!is.null(SingleCellExperiment::altExpNames(x = x))) { assayn <- assay %||% SingleCellExperiment::altExpNames(x = x) if (!all(assay %in% SingleCellExperiment::altExpNames(x = x))) { stop("One or more of the assays you are trying to convert is not in the SingleCellExperiment object") } assayn <- c(orig.exp, assayn) } else { assayn <- orig.exp } for (assay in assayn) { if (assay != orig.exp) { x <- SingleCellExperiment::swapAltExp(x = x, name = assay, saved = NULL) } # Pull matrices mats <- list(counts = counts, data = data) mats <- Filter(f = Negate(f = is.null), x = mats) if (length(x = mats) == 0) { stop("Cannot pass 'NULL' to both 'counts' and 'data'") } for (m in 1:length(x = mats)) { mats[[m]] <- tryCatch( expr = SummarizedExperiment::assay(x = x, i = mats[[m]]), error = function(e) { stop("No data in provided assay - ", mats[[m]], call. = FALSE) } ) # if cell names are NULL, fill with cell_X if (is.null(x = colnames(x = mats[[m]]))) { warning( "The column names of the ", names(x = mats)[m], " matrix is NULL. Setting cell names to cell_columnidx (e.g 'cell_1').", call. = FALSE, immediate. = TRUE ) cell.names <- paste0("cell_", 1:ncol(x = mats[[m]])) colnames(x = mats[[m]]) <- cell.names rownames(x = meta.data) <- cell.names } } assays <- if (is.null(x = mats$counts)) { list(CreateAssayObject(data = mats$data)) } else if (is.null(x = mats$data)) { list(CreateAssayObject(counts = mats$counts)) } else { a <- CreateAssayObject(counts = mats$counts) a <- SetAssayData(object = a, slot = 'data', new.data = mats$data) list(a) } names(x = assays) <- assay Key(object = assays[[assay]]) <- paste0(tolower(x = assay), '_') # Create the Seurat object if (!exists(x = "object")) { object <- CreateSeuratObject( counts = assays[[assay]], Class = 'Seurat', assay = assay, meta.data = meta.data, version = packageVersion(pkg = 'Seurat'), project.name = project ) } else { object[[assay]] <- assays[[assay]] } DefaultAssay(object = object) <- assay # add feature level meta data md <- SingleCellExperiment::rowData(x = x) if (ncol(x = md) > 0) { # replace underscores rownames(x = md) <- gsub(pattern = "_", replacement = "-", x = rownames(x = md)) md <- as.data.frame(x = md) # ensure order same as data md <- md[rownames(x = object[[assay]]), , drop = FALSE] object[[assay]] <- AddMetaData( object = object[[assay]], metadata = md ) } Idents(object = object) <- project # Get DimReduc information, add underscores if needed and pull from different alt EXP if (length(x = SingleCellExperiment::reducedDimNames(x = x)) > 0) { for (dr in SingleCellExperiment::reducedDimNames(x = x)) { embeddings <- as.matrix(x = SingleCellExperiment::reducedDim(x = x, type = dr)) if (is.null(x = rownames(x = embeddings))) { rownames(x = embeddings) <- cell.names } else { rownames(x = embeddings) <- make.unique(names = rownames(x = embeddings)) } if (isTRUE(x = !grepl('_$', gsub(pattern = "[[:digit:]]", replacement = "_", x = colnames(x = SingleCellExperiment::reducedDim(x = x, type = dr))[1] )))) { key <- gsub( pattern = "[[:digit:]]", replacement = "_", x = colnames(x = SingleCellExperiment::reducedDim(x = x, type = dr))[1] ) } else { key <- gsub( pattern = "[[:digit:]]", replacement = "", x = colnames(x = SingleCellExperiment::reducedDim(x = x, type = dr))[1] ) } if (length(x = key) == 0) { key <- paste0(dr, "_") } colnames(x = embeddings) <- paste0(key, 1:ncol(x = embeddings)) object[[dr]] <- CreateDimReducObject( embeddings = embeddings, key = key, assay = DefaultAssay(object = object) ) } } } return(object) } #' @param assay Assays to convert #' #' @rdname as.SingleCellExperiment #' @concept objects #' @export #' @method as.SingleCellExperiment Seurat #' @importFrom SeuratObject .FilterObjects #' as.SingleCellExperiment.Seurat <- function(x, assay = NULL, ...) { CheckDots(...) if (!PackageCheck('SingleCellExperiment', error = FALSE)) { stop("Please install SingleCellExperiment from Bioconductor before converting to a SingleCellExperiment object") } assay <- assay %||% Assays(object = x) if (!all(assay %in% Assays(object = x))) { stop("One or more of the assays you are trying to convert is not in the Seurat object") } if (DefaultAssay(object = x) %in% assay) { assay <- union(DefaultAssay(object = x), assay) } experiments <- list() for (assayn in assay) { assays <- list( counts = GetAssayData(object = x, assay = assayn, slot = "counts"), logcounts = GetAssayData(object = x, assay = assayn, slot = "data") ) scaledata_a <- GetAssayData(object = x, assay = assayn, slot = "scale.data") if (isTRUE(x = all.equal( target = dim(x = assays[["counts"]]), current = dim(x = scaledata_a)) )) { assays[["scaledata"]] <- scaledata_a } assays <- assays[sapply(X = assays, FUN = nrow) != 0] sume <- SummarizedExperiment::SummarizedExperiment(assays = assays) experiments[[assayn]] <- sume } # create one single cell experiment sce <- as(object = experiments[[1]], Class = "SingleCellExperiment") orig.exp.name <- names(x = experiments[1]) if (packageVersion(pkg = "SingleCellExperiment") >= "1.14.0") { SingleCellExperiment::mainExpName(sce) <- names(x = experiments[1]) } if (length(x = experiments) > 1) { sce <- SingleCellExperiment::SingleCellExperiment(sce, altExps = experiments) sce <- SingleCellExperiment::swapAltExp( x = sce, name = orig.exp.name, saved = NULL ) } metadata <- x[[]] metadata$ident <- Idents(object = x) SummarizedExperiment::colData(x = sce) <- S4Vectors::DataFrame(metadata) for (assayn in assay) { if (assayn != orig.exp.name) { sce <- SingleCellExperiment::swapAltExp( x = sce, name = assayn, saved = orig.exp.name ) SummarizedExperiment::rowData(x = sce) <- S4Vectors::DataFrame(x[[assayn]][[]]) sce <- SingleCellExperiment::swapAltExp( x = sce, name = orig.exp.name, saved = assayn ) } } for (dr in .FilterObjects(object = x, classes.keep = "DimReduc")) { assay.used <- DefaultAssay(object = x[[dr]]) swap.exp <- assay.used %in% SingleCellExperiment::altExpNames(x = sce) & assay.used != orig.exp.name if (swap.exp) { sce <- SingleCellExperiment::swapAltExp( x = sce, name = assay.used, saved = orig.exp.name ) } SingleCellExperiment::reducedDim(x = sce, type = toupper(x = dr)) <- Embeddings(object = x[[dr]]) if (swap.exp) { sce <- SingleCellExperiment::swapAltExp( x = sce, name = orig.exp.name, saved = assay.used ) } } return(sce) } #' Cast to Sparse #' #' @inheritParams SeuratObject::as.sparse #' #' @importFrom methods is #' @importFrom Matrix sparseMatrix #' #' @rdname as.sparse #' @concept objects #' @export #' @method as.sparse H5Group #' #' #' @seealso \code{\link[SeuratObject:as.sparse]{SeuratObject::as.sparse}} #' as.sparse.H5Group <- function(x, ...) { CheckDots(...) for (i in c('data', 'indices', 'indptr')) { if (!x$exists(name = i) || !is(object = x[[i]], class2 = 'H5D')) { stop("Invalid H5Group specification for a sparse matrix, missing dataset ", i) } } if ('h5sparse_shape' %in% hdf5r::h5attr_names(x = x)) { return(sparseMatrix( i = x[['indices']][] + 1, p = x[['indptr']][], x = x[['data']][], dims = rev(x = hdf5r::h5attr(x = x, which = 'h5sparse_shape')) )) } return(sparseMatrix( i = x[['indices']][] + 1, p = x[['indptr']][], x = x[['data']][] )) } #' @method as.sparse IterableMatrix #' @export #' as.sparse.IterableMatrix <- function(x, ...) { return(as(object = x, Class = 'dgCMatrix')) } #' Get Cell Names #' #' @inheritParams SeuratObject::Cells #' #' @rdname Cells #' @concept objects #' @method Cells SCTModel #' @export #' Cells.SCTModel <- function(x, ...) { return(rownames(x = slot(object = x, name = "cell.attributes"))) } #' @method Cells SCTAssay #' @export #' Cells.SCTAssay <- function(x, layer = NA, ...) { layer <- layer %||% levels(x = x)[1L] if (rlang::is_na(x = layer)) { return(colnames(x = x)) } return(Cells(x = components(object = x, model = layer))) } #' @rdname Cells #' @concept objects #' @concept spatial #' @method Cells SlideSeq #' @export #' #' @seealso \code{\link[SeuratObject:Cells]{SeuratObject::Cells}} #' Cells.SlideSeq <- function(x, ...) { return(rownames(x = GetTissueCoordinates(object = x))) } #' @rdname Cells #' @concept objects #' @concept spatial #' @method Cells STARmap #' @export #' Cells.STARmap <- function(x, ...) { return(rownames(x = GetTissueCoordinates(object = x))) } #' @rdname Cells #' @concept objects #' @method Cells VisiumV1 #' @export #' Cells.VisiumV1 <- function(x, ...) { return(rownames(x = GetTissueCoordinates(object = x, scale = NULL))) } #' @importFrom SeuratObject DefaultLayer Layers #' #' @method Features SCTAssay #' @export #' Features.SCTAssay <- function(x, layer = NA, ...) { layer <- layer %||% DefaultLayer(object = x) if (rlang::is_na(x = layer)) { return(rownames(x = x)) } layer <- rlang::arg_match( arg = layer, values = c(Layers(object = x), levels(x = x))) if (layer %in% levels(x = x)) { return(Features(x = components(object = x, model = layer))) } return(NextMethod()) } #' @method Features SCTModel #' @export #' Features.SCTModel <- function(x, ...) { return(rownames(x = SCTResults(object = x, slot = 'feature.attributes'))) } #' @param assay Assay to get #' #' @rdname GetAssay #' @concept objects #' @export #' @method GetAssay Seurat #' #' @examples #' data("pbmc_small") #' GetAssay(object = pbmc_small, assay = "RNA") #' GetAssay.Seurat <- function(object, assay = NULL, ...) { CheckDots(...) assay <- assay %||% DefaultAssay(object = object) object.assays <- FilterObjects( object = object, classes.keep = c('Assay', 'Assay5')) if (!assay %in% object.assays) { stop(paste0( assay, " is not an assay present in the given object. Available assays are: ", paste(object.assays, collapse = ", ") )) } return(slot(object = object, name = 'assays')[[assay]]) } #' Get Image Data #' #' @inheritParams SeuratObject::GetImage #' #' @rdname GetImage #' @method GetImage SlideSeq #' @concept objects #' @concept spatial #' @export #' #' @seealso \code{\link[SeuratObject:GetImage]{SeuratObject::GetImage}} #' GetImage.SlideSeq <- function( object, mode = c('grob', 'raster', 'plotly', 'raw'), ... ) { mode <- match.arg(arg = mode) return(NullImage(mode = mode)) } #' @rdname GetImage #' @method GetImage STARmap #' @concept objects #' @concept spatial #' @export #' GetImage.STARmap <- function( object, mode = c('grob', 'raster', 'plotly', 'raw'), ... ) { mode <- match.arg(arg = mode) return(NullImage(mode = mode)) } #' @importFrom plotly raster2uri #' @importFrom grDevices as.raster #' @importFrom grid rasterGrob unit #' #' @rdname GetImage #' @concept objects #' @concept spatial #' @method GetImage VisiumV1 #' @export #' GetImage.VisiumV1 <- function( object, mode = c('grob', 'raster', 'plotly', 'raw'), ... ) { mode <- match.arg(arg = mode) image <- slot(object = object, name = 'image') image <- switch( EXPR = mode, 'grob' = rasterGrob( image = image, width = unit(x = 1, units = 'npc'), height = unit(x = 1, units = 'npc') ), 'raster' = as.raster(x = image), 'plotly' = list( source = raster2uri(GetImage(object, mode = 'raster')), xref = 'x', yref = 'y', sizex = ncol(x = object), sizey = nrow(x = object), sizing = 'stretch', opacity = 1, layer = 'below' ), 'raw' = image, stop("Unknown image mode: ", mode, call. = FALSE) ) return(image) } #' #' @rdname GetImage #' @concept objects #' @concept spatial #' @method GetImage VisiumV2 #' @export #' GetImage.VisiumV2 <- GetImage.VisiumV1 #' Get Tissue Coordinates #' #' @inheritParams SeuratObject::GetTissueCoordinates #' #' @rdname GetTissueCoordinates #' @method GetTissueCoordinates SlideSeq #' @concept objects #' @concept spatial #' @export #' #' @seealso \code{\link[SeuratObject:GetTissueCoordinates]{SeuratObject::GetTissueCoordinates}} #' GetTissueCoordinates.SlideSeq <- function(object, ...) { coords <- slot(object = object, name = 'coordinates') colnames(x = coords) <- c('x', 'y') # coords$y <- -rev(x = coords$y) + 1 # coords$y <- FlipCoords(x = coords$y) coords$cells <- rownames(x = coords) return(coords) } #' @param qhulls return qhulls instead of centroids #' #' @rdname GetTissueCoordinates #' @method GetTissueCoordinates STARmap #' @concept objects #' @concept spatial #' @export #' GetTissueCoordinates.STARmap <- function(object, qhulls = FALSE, ...) { if (qhulls) { return(slot(object = object, name = 'qhulls')) } return(slot(object = object, name = 'coordinates')) } #' @param scale A factor to scale the coordinates by; choose from: 'tissue', #' 'fiducial', 'hires', 'lowres', or \code{NULL} for no scaling #' @param cols Columns of tissue coordinates data.frame to pull #' #' @rdname GetTissueCoordinates #' @method GetTissueCoordinates VisiumV1 #' @concept objects #' @concept spatial #' @export #' GetTissueCoordinates.VisiumV1 <- function( object, scale = 'lowres', cols = c('imagerow', 'imagecol'), ... ) { cols <- cols %||% colnames(x = slot(object = object, name = 'coordinates')) if (!is.null(x = scale)) { coordinates <- slot( object = object, name = 'coordinates')[, c('imagerow', 'imagecol')] scale <- match.arg( arg = scale, choices = c('spot', 'fiducial', 'hires', 'lowres')) scale.use <- ScaleFactors(object = object)[[scale]] coordinates <- coordinates * scale.use } else { coordinates <- slot(object = object, name = 'coordinates')[, cols] } return(coordinates) } #' @rdname GetTissueCoordinates #' @method GetTissueCoordinates VisiumV2 #' @export #' GetTissueCoordinates.VisiumV2 <- function( object, scale = NULL, ... ) { # make call to GetTissueCoordiantes.FOV coordinates <- NextMethod(object, ...) # do some cleanup of the resulting data.frame to make it play nice # with `SpatialPlot` - namely set rownames and re-order the columns so # that the actual position values appear first rownames(coordinates) <- coordinates[["cell"]] coordinates <- coordinates[, c("x", "y", "cell")] if (!is.null(scale)) { # scale the coordinates by the specified factor scale <- match.arg(scale, choices = c("lowres", "hires")) scale.factor <- ScaleFactors(object)[[scale]] coordinates[, c("x", "y")] <- coordinates[, c("x", "y")] * scale.factor } return (coordinates) } #' Get Variable Feature Information #' #' Get variable feature information from \code{\link{SCTAssay}} objects #' #' @inheritParams SeuratObject::HVFInfo #' @param method method to determine variable features #' #' @export #' @concept objects #' @method HVFInfo SCTAssay #' #' @seealso \code{\link[SeuratObject]{HVFInfo}} #' #' @examples #' \dontrun{ #' # Get the HVF info directly from an SCTAssay object #' pbmc_small <- SCTransform(pbmc_small) #' HVFInfo(pbmc_small[["SCT"]], method = 'sct')[1:5, ] #' } #' HVFInfo.SCTAssay <- function(object, method, status = FALSE, ...) { CheckDots(...) disp.methods <- c('mean.var.plot', 'dispersion', 'disp') if (tolower(x = method) %in% disp.methods) { method <- 'mvp' } method <- switch( EXPR = tolower(x = method), 'sctransform' = 'sct', method ) vars <- c('gmean', 'variance', 'residual_variance') hvf.info <- SCTResults(object = object, slot = "feature.attributes")[,vars] if (status) { hvf.info$variable <- FALSE hvf.info[VariableFeatures(object = object), "variable"] <- TRUE } return(hvf.info) } #' Get Spot Radius #' #' @inheritParams SeuratObject::Radius #' #' @rdname Radius #' @concept objects #' @concept spatial #' @method Radius SlideSeq #' @export #' #' @seealso \code{\link[SeuratObject:Radius]{SeuratObject::Radius}} #' Radius.SlideSeq <- function(object, ...) { return(0.005) } #' @rdname Radius #' @concept objects #' @concept spatial #' @method Radius STARmap #' @export #' Radius.STARmap <- function(object, ...) { return(NULL) } #' #' @param scale A factor to scale the radius by; one of: "hires", #' "lowres", or \code{NULL} for the unscaled value. #' #' @rdname Radius #' @concept objects #' @concept spatial #' @method Radius VisiumV1 #' @export #' Radius.VisiumV1 <- function(object, scale = "lowres", ...) { scale.factors <- ScaleFactors(object = object) spot.size <- scale.factors[["spot"]] scale.factor <- scale.factors[[ match.arg(scale, choices = c("hires", "lowres")) ]] image.size <- max(dim(GetImage(object, resolution=scale)$raster)) return ((spot.size * scale.factor) / image.size) } #' @rdname Radius #' @concept objects #' @concept spatial #' @method Radius VisiumV1 #' @export #' Radius.VisiumV2 <- Radius.VisiumV1 #' @rdname RenameCells #' @export #' @concept objects #' @method RenameCells SCTAssay #' RenameCells.SCTAssay <- function(object, new.names = NULL, ...) { CheckDots(...) old.names <- Cells(x = object) names(x = new.names) <- old.names cell.attributes <- SCTResults(object = object, slot = "cell.attributes") if (length(x = cell.attributes) > 0) { if (is.data.frame(x = cell.attributes)) { old.names <- rownames(x = cell.attributes) rownames(x = cell.attributes) <- unname(obj = new.names[old.names]) } else { cell.attributes <- lapply( X = cell.attributes, FUN = function(x) { old.names <- rownames(x = x) rownames(x = x) <- unname(obj = new.names[old.names]) return(x) } ) } SCTResults(object = object, slot = "cell.attributes") <- cell.attributes } new.names <- unname(obj = new.names) object <- NextMethod() return(object) } #' Rename Cells in an Object #' #' @inheritParams SeuratObject::RenameCells #' #' @rdname RenameCells #' @concept objects #' @method RenameCells SlideSeq #' @export #' #' @seealso \code{\link[SeuratObject:RenameCells]{SeuratObject::RenameCells}} #' RenameCells.SlideSeq <- function(object, new.names = NULL, ...) { return(RenameCells.VisiumV1(object = object, new.names = new.names)) } #' @rdname RenameCells #' @concept objects #' @method RenameCells STARmap #' @export #' RenameCells.STARmap <- function(object, new.names = NULL, ...) { names(x = new.names) <- Cells(x = object) object <- RenameCells.VisiumV1(object = object, new.names = new.names) qhulls <- GetTissueCoordinates(object = object, qhull = TRUE) qhulls$cell <- new.names[qhulls$cell] slot(object = object, name = "qhulls") <- qhulls return(object) } #' @rdname RenameCells #' @concept objects #' @method RenameCells VisiumV1 #' @export #' RenameCells.VisiumV1 <- function(object, new.names = NULL, ...) { if (is.null(x = new.names)) { return(object) } else if (length(x = new.names) != length(x = Cells(x = object))) { stop("Wrong number of cell/spot names", call. = FALSE) } names(x = new.names) <- Cells(x = object) coordinates <- GetTissueCoordinates(object = object, scale = NULL, cols = NULL) rownames(x = coordinates) <- new.names[rownames(x = coordinates)] slot(object = object, name = 'coordinates') <- coordinates return(object) } #' @rdname SCTResults #' @export #' @method SCTResults SCTModel #' SCTResults.SCTModel <- function(object, slot, ...) { CheckDots(...) slots.use <- c('feature.attributes', 'cell.attributes', 'clips','umi.assay', 'model', 'arguments', 'median_umi') if (!slot %in% slots.use) { stop( "'slot' must be one of ", paste(slots.use, collapse = ', '), call. = FALSE ) } return(slot(object = object, name = slot)) } #' @rdname SCTResults #' @concept objects #' @export #' @method SCTResults<- SCTModel #' "SCTResults<-.SCTModel" <- function(object, slot, ..., value) { slots.use <- c('feature.attributes', 'cell.attributes', 'clips','umi.assay', 'model', 'arguments', 'median_umi') if (!slot %in% slots.use) { stop( "'slot' must be one of ", paste(slots.use, collapse = ', '), call. = FALSE ) } slot(object = object, name = slot) <- value return(object) } #' @param slot Which slot to pull the SCT results from #' @param model Name of SCModel to pull result from. Available names can be #' retrieved with \code{levels}. #' #' @return Returns the value present in the requested slot for the requested #' group. If group is not specified, returns a list of slot results for each #' group unless there is only one group present (in which case it just returns #' the slot directly). #' #' @rdname SCTResults #' @concept objects #' @export #' @method SCTResults SCTAssay #' SCTResults.SCTAssay <- function(object, slot, model = NULL, ...) { CheckDots(...) slots.use <- c('feature.attributes', 'cell.attributes', 'clips', 'umi.assay', 'model', 'arguments', 'median_umi') if (!slot %in% slots.use) { stop( "'slot' must be one of ", paste(slots.use, collapse = ', '), call. = FALSE ) } model <- model %||% levels(x = object) model.list <- slot(object = object, name = "SCTModel.list")[model] results.list <- lapply(X = model.list, FUN = function(x) SCTResults(object = x, slot = slot)) if (length(x = results.list) == 1) { results.list <- results.list[[1]] } return(results.list) } #' @rdname SCTResults #' @concept objects #' @export #' @method SCTResults<- SCTAssay #' "SCTResults<-.SCTAssay" <- function(object, slot, model = NULL, ..., value) { slots.use <- c('feature.attributes', 'cell.attributes', 'clips','umi.assay', 'model', 'arguments', 'median_umi') if (!slot %in% slots.use) { stop( "'slot' must be one of ", paste(slots.use, collapse = ', '), call. = FALSE ) } model <- model %||% levels(x = object) model.list <- slot(object = object, name = "SCTModel.list")[model] if (!is.list(x = value) | is.data.frame(x = value)) { value <- list(value) } model.names <- names(x = model.list) model.list <- lapply( X = 1:length(x = model.list), FUN = function(x) { SCTResults(object = model.list[[x]], slot = slot) <- value[[x]] return(model.list[[x]]) } ) names(x = model.list) <- model.names slot(object = object, name = "SCTModel.list")[model.names] <- model.list return(object) } #' @param assay Assay in the Seurat object to pull from #' #' @rdname SCTResults #' @export #' @concept objects #' @method SCTResults Seurat #' SCTResults.Seurat <- function(object, assay = "SCT", slot, model = NULL, ...) { CheckDots(...) return(SCTResults(object = object[[assay]], slot = slot, model = model, ...)) } #' @importFrom utils head #' @method VariableFeatures SCTModel #' @export #' VariableFeatures.SCTModel <- function(object, method = NULL, nfeatures = 3000, ...) { if (!is_scalar_integerish(x = nfeatures) || (!is_na(x = nfeatures < 1L) && nfeatures < 1L)) { abort(message = "'nfeatures' must be a single positive integer") } feature.attr <- SCTResults(object = object, slot = 'feature.attributes') feature.variance <- feature.attr[, 'residual_variance'] names(x = feature.variance) <- row.names(x = feature.attr) feature.variance <- sort(x = feature.variance, decreasing = TRUE) if (is_na(x = nfeatures)) { return(names(x = feature.variance)) } return(head(x = names(x = feature.variance), n = nfeatures)) } #' @importFrom utils head #' @method VariableFeatures SCTAssay #' @export #' VariableFeatures.SCTAssay <- function( object, method = NULL, layer = NULL, nfeatures = NULL, simplify = TRUE, use.var.features = TRUE, ... ) { # Is the information already in var.features? var.features.existing <- slot(object = object, name = "var.features") nfeatures <- nfeatures %||% length(x = var.features.existing) %||% 3000 if (is.null(x = layer)) { layer <- levels(x = object) } if (simplify == TRUE & use.var.features == TRUE & length(var.features.existing) >= nfeatures){ return(head(x = var.features.existing, n = nfeatures)) } layer <- match.arg(arg = layer, choices = levels(x = object), several.ok = TRUE) # run variable features on each model vf.list <- sapply( X = layer, FUN = function(lyr) { return(VariableFeatures( object = components(object = object, model = lyr), nfeatures = nfeatures, ... )) }, simplify = FALSE, USE.NAMES = TRUE ) if (isFALSE(x = simplify)){ return(vf.list) } var.features <- sort( x = table(unlist(x = vf.list, use.names = FALSE)), decreasing = TRUE ) if (length(x = var.features) == 0) { return(NULL) } tie.val <- var.features[min(nfeatures, length(x = var.features))] features <- names(x = var.features[which(x = var.features > tie.val)]) if (length(x = features) > 0) { feature.ranks <- sapply(X = features, FUN = function(x) { ranks <- sapply(X = vf.list, FUN = function(vf) { if (x %in% vf) { return(which(x = x == vf)) } return(NULL) }) median(x = unlist(x = ranks)) }) features <- names(x = sort(x = feature.ranks)) } features.tie <- var.features[which(x = var.features == tie.val)] tie.ranks <- sapply(X = names(x = features.tie), FUN = function(x) { ranks <- sapply(X = vf.list, FUN = function(vf) { if (x %in% vf) { return(which(x = x == vf)) } return(NULL) }) median(x = unlist(x = ranks)) }) features <- c( features, names(x = head(x = sort(x = tie.ranks), nfeatures - length(x = features))) ) return(features) } #' @rdname ScaleFactors #' @method ScaleFactors VisiumV1 #' @export #' @concept spatial #' ScaleFactors.VisiumV1 <- function(object, ...) { return(slot(object = object, name = 'scale.factors')) } #' @rdname ScaleFactors #' @method ScaleFactors VisiumV2 #' @export #' @concept spatial #' ScaleFactors.VisiumV2 <- ScaleFactors.VisiumV1 #' @method FetchData VisiumV1 #' @export #' @concept spatial #' FetchData.VisiumV1 <- function( object, vars, cells = NULL, ... ) { if (is.numeric(x = cells)) { cells <- Cells(x = object)[cells] } else if (is.null(x = cells)) { cells <- Cells(x = object) } vars.unkeyed <- gsub(pattern = paste0('^', Key(object)), replacement = '', x = vars) coords <- GetTissueCoordinates(object = object)[cells, vars.unkeyed, drop = FALSE] colnames(x = coords) <- vars return(coords) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @method [ SlideSeq #' @concept objects #' @export #' "[.SlideSeq" <- function(x, i, ...) { return(subset(x = x, cells = i, ...)) } #' @method [ VisiumV1 #' @export #' "[.VisiumV1" <- function(x, i, ...) { return(subset(x = x, cells = i)) } #' @method components SCTAssay #' @export #' components.SCTAssay <- function(object, model, ...) { model <- rlang::arg_match(arg = model, values = levels(x = object)) return(slot(object = object, name = 'SCTModel.list')[[model]]) } #' @method dim SlideSeq #' @concept objects #' @export #' dim.SlideSeq <- function(x) { # return(dim(x = GetImage(object = x, mode = 'raw'))) return(c(599, 600)) } #' @method dim STARmap #' @concept objects #' @export #' dim.STARmap <- function(x) { coords <- GetTissueCoordinates(object = x) return(c( max(coords[, 1]) - min(coords[, 1]), max(coords[, 2]) - min(coords[, 2]) )) } #' @method dim VisiumV1 #' @concept objects #' @export #' dim.VisiumV1 <- function(x) { return(dim(x = GetImage(object = x)$raster)) } #' @method dim VisiumV2 #' @concept objects #' @export #' dim.VisiumV2 <- dim.VisiumV1 #' @rdname SCTAssay-class #' @name SCTAssay-class #' #' @section Get and set SCT model names: #' SCT results are named by initial run of \code{\link{SCTransform}} in order #' to keep SCT parameters straight between runs. When working with merged #' \code{SCTAssay} objects, these model names are important. \code{levels} #' allows querying the models present. \code{levels<-} allows the changing of #' the names of the models present, useful when merging \code{SCTAssay} objects. #' Note: unlike normal \code{\link[base]{levels<-}}, \code{levels<-.SCTAssay} #' allows complete changing of model names, not reordering. #' #' @param x An \code{SCTAssay} object #' #' @return \code{levels}: SCT model names #' #' @export #' @concept objects #' @method levels SCTAssay #' #' @examples #' \dontrun{ #' # Query and change SCT model names #' levels(pbmc_small[['SCT']]) #' levels(pbmc_small[['SCT']]) <- '3' #' levels(pbmc_small[['SCT']]) #' } #' levels.SCTAssay <- function(x) { return(names(x = slot(object = x, name = "SCTModel.list"))) } #' @rdname SCTAssay-class #' @name SCTAssay-class #' #' @param value New levels, must be in the same order as the levels present #' #' @return \code{levels<-}: \code{x} with updated SCT model names #' #' @export #' @concept objects #' @method levels<- SCTAssay #' "levels<-.SCTAssay" <- function(x, value) { value <- sapply(X = value, FUN = function(v) { if (suppressWarnings(expr = !is.na(x = as.numeric(x = v)))) { warning("SCTModel groups cannot be number, group is added in front of ", v) v <- paste0("group", v) } return (v) }) # Get current levels levels <- levels(x = x) if (length(x = value) != length(x = levels)) { stop("Must provide a vector of length ", length(x = levels), " as new levels.", call. = FALSE) } names(x = slot(object = x, name = "SCTModel.list")) <- value return(x) } #' Merge SCTAssay objects #' #' @inheritParams SeuratObject::merge #' @param x A \code{\link[SeuratObject]{Seurat}} object #' @param na.rm If na.rm = TRUE, this will only preserve residuals that are #' present in all SCTAssays being merged. Otherwise, missing residuals will be #' populated with NAs. #' @export #' @method merge SCTAssay #' @concept objects #' merge.SCTAssay <- function( x = NULL, y = NULL, add.cell.ids = NULL, merge.data = TRUE, na.rm = TRUE, ... ) { assays <- c(x, y) if (any(sapply( X = assays, FUN = function(assay.i) inherits(x = assay.i, what = "Assay5") ))) { return(merge(x = as(x, "Assay5"), y, ...)) } parent.call <- grep(pattern = "merge.Seurat", x = sys.calls()) if (length(x = parent.call) > 0) { # Try and fill in missing residuals if called in the context of merge.Seurat all.features <- unique( x = unlist( x = lapply( X = assays, FUN = function(assay) { if (inherits(x = assay, what = "SCTAssay")) { return(rownames(x = GetAssayData(object = assay, slot = "scale.data"))) } }) ) ) if (!is.null(all.features)) { assays <- lapply(X = 1:length(x = assays), FUN = function(assay) { if (inherits(x = assays[[assay]], what = "SCTAssay")) { parent.environ <- sys.frame(which = parent.call[1]) seurat.object <- parent.environ$objects[[assay]] seurat.object <- suppressWarnings(expr = GetResidual(object = seurat.object, features = all.features, assay = parent.environ$assay, verbose = FALSE)) return(seurat.object[[parent.environ$assay]]) } return(assays[[assay]]) }) } } sct.check <- sapply(X = assays, FUN = function(x) inherits(x = x, what = "SCTAssay")) if (any(!sct.check)) { warning("Attempting to merge an SCTAssay with another Assay type \n", "Converting all to standard Assay objects.", call. = FALSE) assays <- lapply(1:length(x = assays), FUN = function(x) { if (sct.check[x]) { assays[[x]] <- as(object = assays[[x]], Class = "Assay") } return(assays[[x]]) }) combined.assay <- merge( x = assays[[1]], y = assays[2:length(x = assays)], add.cell.ids = add.cell.ids, merge.data = merge.data ) return(combined.assay) } combined.assay <- NextMethod() all.levels <- unlist(x = lapply(X = assays, FUN = levels)) while (anyDuplicated(x = all.levels)) { levels.duplicate <- which(x = duplicated(x = all.levels)) all.levels <- sapply(X = 1:length(x = all.levels), FUN = function(l) { if (l %in% levels.duplicate) { return(tryCatch( expr = as.numeric(x = all.levels[l]) + 1, warning = function(...) { make.unique(names = all.levels)[l] }, error = function(...){ make.unique(names = all.levels)[l] } )) } else { return(all.levels[l]) } }) } scale.data <- lapply(X = assays, FUN = function(x) { dat <- GetAssayData(object = x, slot = "scale.data") if (ncol(x = dat) == 0) { dat <- matrix(ncol = ncol(x = x)) } return(dat) }) all.features <- lapply(X = scale.data, FUN = rownames) if (na.rm) { # merge intersection of possible residuals scaled.features <- names(x = which(x = table(x = unlist(x = all.features)) == length(x = assays))) if (length(x = scaled.features) == 0) { scale.data <- list(new(Class = "matrix")) } else { scale.data <- lapply(X = scale.data, FUN = function(x) x[scaled.features, ]) } } else { scaled.features <- unique(x = unlist(x = all.features)) scale.data <- lapply(X = 1:length(x = scale.data), FUN = function(x) { na.features <- setdiff(x = scaled.features, y = rownames(x = scale.data[[x]])) na.mat <- matrix( data = NA, nrow = length(x = na.features), ncol = ncol(x = assays[[x]]), dimnames = list(na.features, colnames(x = assays[[x]])) ) return(rbind(scale.data[[x]], na.mat)[scaled.features, ]) }) } scale.data <- do.call(what = cbind, args = scale.data) combined.assay <- SetAssayData(object = combined.assay, slot = "scale.data", new.data = scale.data) model.list <- unlist(x = lapply( X = assays, FUN = slot, name = "SCTModel.list" )) names(x = model.list) <- all.levels model.list <- model.list %||% list() combined.assay <- new( Class = "SCTAssay", combined.assay, SCTModel.list = model.list ) features <- VariableFeatures(object = combined.assay) VariableFeatures(object = combined.assay) <- features return(combined.assay) } #' Subset an AnchorSet object #' #' @inheritParams base::subset #' @param score.threshold Only anchor pairs with scores greater than this value #' are retained. #' @param disallowed.dataset.pairs Remove any anchors formed between the #' provided pairs. E.g. \code{list(c(1, 5), c(1, 2))} filters out any anchors between #' datasets 1 and 5 and datasets 1 and 2. #' @param dataset.matrix Provide a binary matrix specifying whether a dataset #' pair is allowable (1) or not (0). Should be a dataset x dataset matrix. #' @param group.by Grouping variable to determine allowable ident pairs #' @param disallowed.ident.pairs Remove any anchors formed between provided #' ident pairs. E.g. \code{list(c("CD4", "CD8"), c("B-cell", "T-cell"))} #' @param ident.matrix Provide a binary matrix specifying whether an ident pair #' is allowable (1) or not (0). Should be an ident x ident symmetric matrix #' #' @return Returns an \code{\link{AnchorSet}} object with specified anchors #' filtered out #' #' @export #' @method subset AnchorSet #' @concept objects #' subset.AnchorSet <- function( x, score.threshold = NULL, disallowed.dataset.pairs = NULL, dataset.matrix = NULL, group.by = NULL, disallowed.ident.pairs = NULL, ident.matrix = NULL, ... ) { if (!is.null(x = disallowed.dataset.pairs) && !is.null(x = dataset.matrix)) { stop("Please use either disallowed.dataset.pairs OR dataset.matrix, not both.") } # Filter based on scores if (!is.null(x = score.threshold)) { if (score.threshold > 1 | score.threshold < 0) { stop( "Anchors are scored on a scale between 0 and 1. Please provide a value", " in that range to score.threshold." ) } anchors <- slot(object = x, name = "anchors") anchors <- anchors[anchors[, 'score'] > score.threshold, , drop = FALSE] slot(object = x, name = "anchors") <- anchors } object.names <- names(x = slot(object = x, name = "object.list")) num.obs <- length(x = object.names) # Filter based on dataset pairings if (!is.null(x = disallowed.dataset.pairs)) { dataset.matrix <- matrix(data = 1, nrow = num.obs, ncol = num.obs) for(i in 1:length(x = disallowed.dataset.pairs)) { pair <- disallowed.dataset.pairs[[i]] if (length(x = pair) != 2) { stop("Please ensure all list items in disallowed.dataset.pairs are of length 2.") } if (any(pair %in% object.names)) { pair[which(pair %in% object.names)] <- sapply( X = pair[which(pair %in% object.names)], FUN = function(x) { which(object.names == x) }) } pair <- as.numeric(x = pair) dataset.matrix[pair[1], pair[2]] <- 0 } } if (!is.null(x = dataset.matrix)) { if (any(dim(x = dataset.matrix) != c(num.obs, num.obs))){ stop("Please provide a dataset.matrix that is ", num.obs, " x ", num.obs, ".") } anchors <- slot(object = x, name = "anchors") pairs <- which(dataset.matrix == 0, arr.ind = TRUE) for (i in 1:nrow(x = pairs)) { anchors <- anchors[-which(x = anchors$dataset1 == pairs[i, 1] & anchors$dataset2 == pairs[i, 2]), ] anchors <- anchors[-which(x = anchors$dataset1 == pairs[i, 2] & anchors$dataset2 == pairs[i, 1]), ] } slot(object = x, name = "anchors") <- anchors } # Filter based on ident pairings if (!is.null(x = group.by)) { anchors <- AnnotateAnchors(anchors = x, vars = group.by) if (!is.null(x = disallowed.ident.pairs) && !is.null(x = ident.matrix)) { stop("Please use either disallowed.ident.pairs OR ident.matrix, not both.") } unique.ids <- unique(x = c( as.character(x = anchors[, paste0("cell1.", group.by)]), as.character(x = anchors[, paste0("cell2.", group.by)])) ) unique.ids <- unique.ids[!is.na(x = unique.ids)] num.ids <- length(x = unique.ids) if (!is.null(x = disallowed.ident.pairs)) { ident.matrix <- matrix(data = 1, nrow = num.ids, ncol = num.ids) rownames(x = ident.matrix) <- unique.ids colnames(x = ident.matrix) <- unique.ids for(i in 1:length(x = disallowed.ident.pairs)) { pair <- disallowed.ident.pairs[[i]] if (length(x = pair) != 2) { stop("Please ensure all list items in disallowed.dataset.pairs are of length 2.") } ident.matrix[pair[1], pair[2]] <- 0 } } if (!is.null(x = ident.matrix)) { if (any(dim(x = ident.matrix) != c(num.ids, num.ids))){ stop("Please provide a dataset.matrix that is ", num.ids, " x ", num.ids, ".") } to.remove <- c() pairs <- which(ident.matrix == 0, arr.ind = TRUE) for (i in 1:nrow(x = pairs)) { id1 <- rownames(x = ident.matrix)[pairs[i, 1]] id2 <- colnames(x = ident.matrix)[pairs[i, 2]] to.remove <- c(to.remove, which(x = anchors[, paste0("cell1.", group.by)] == id1 & anchors[, paste0("cell2.", group.by)] == id2)) to.remove <- c(to.remove, which(x = anchors[, paste0("cell1.", group.by)] == id2 & anchors[, paste0("cell2.", group.by)] == id1)) } anchors <- slot(object = x, name = "anchors") anchors <- anchors[-to.remove, ] slot(object = x, name = "anchors") <- anchors } } return(x) } #' @export #' @method subset SCTAssay #' @concept objects #' subset.SCTAssay <- function(x, cells = NULL, features = NULL, ...) { x <- NextMethod() models <- levels(x = x) for (m in models) { attr <- SCTResults(object = x, slot = "cell.attributes", model = m) attr <- attr[intersect(x = rownames(x = attr), y = Cells(x = x)), , drop = FALSE] SCTResults(object = x, slot = "cell.attributes", model = m) <- attr if (nrow(x = attr) == 0) { slot(object = x, name = 'SCTModel.list')[[m]] <- NULL } } return(x) } #' @method subset SlideSeq #' @concept objects #' @export #' subset.SlideSeq <- function(x, cells, ...) { x <- subset.VisiumV1(x = x, cells = cells, ...) return(x) } #' @method subset STARmap #' @concept objects #' @export #' subset.STARmap <- function(x, cells, ...) { x <- subset.VisiumV1(x = x, cells = cells, ...) qhulls <- GetTissueCoordinates(object = x, qhulls = TRUE) qhulls <- qhulls[qhulls$cell %in% cells, ] slot(object = x, name = 'qhulls') <- qhulls return(x) } #' @method subset VisiumV1 #' @concept objects #' @export #' subset.VisiumV1 <- function(x, cells, ...) { coordinates <- GetTissueCoordinates(object = x, scale = NULL, cols = NULL) cells <- cells[cells %in% rownames(x = coordinates)] coordinates <- coordinates[cells, ] slot(object = x, name = 'coordinates') <- coordinates return(x) } #' Update pre-V4 Assays generated with SCTransform in the Seurat to the new #' SCTAssay class # #' @param object A Seurat object #' @export #' @concept objects #' @return A Seurat object with updated SCTAssays #' UpdateSCTAssays <- function(object) { assays <- Assays(object = object) for (assay in assays) { if (IsSCT(assay = object[[assay]]) && !inherits(x = object[[assay]], what = "SCTAssay")) { object[[assay]] <- as(object = object[[assay]], Class = "SCTAssay") } } return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # S4 methods #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @rdname SCTAssay-class #' @name SCTAssay-class #' #' @section Creating an \code{SCTAssay} from an \code{Assay}: #' Conversion from an \code{Assay} object to an \code{SCTAssay} object by #' is done by adding the additional slots to the object. If \code{from} has #' results generated by \code{\link{SCTransform}} from Seurat v3.0.0 to v3.1.1, #' the conversion will automagically fill the new slots with the data #' setAs( from = 'Assay', to = 'SCTAssay', def = function(from) { object.list <- sapply( X = slotNames(x = from), FUN = slot, object = from, simplify = FALSE, USE.NAMES = TRUE ) object.list <- c( list('Class' = 'SCTAssay'), object.list ) if (IsSCT(assay = from)) { vst.slots <- c('vst.set', 'vst.out') vst.use <- vst.slots[vst.slots %in% names(x = Misc(object = from))][1] vst.res <- Misc(object = from, slot = vst.use) umi.assay <- Misc(object = from, slot = "umi.assay") if (vst.use == 'vst.out') { vst.res <- list(vst.res) umi.assay <- list(umi.assay) } if (length(x = vst.res) == 0) { vst.res <- list() } else if (length(x = vst.res) > 0) { vst.res <- lapply( X = 1:length(x = vst.res), FUN = function(i) { vst.res[[i]]$umi.assay <- umi.assay[[i]] return(PrepVSTResults( vst.res = vst.res[[i]], cell.names = colnames(x = from) )) } ) names(x = vst.res) <- paste0("model", 1:length(x = vst.res)) } object.list$misc[[vst.use]] <- NULL object.list$SCTModel.list <- vst.res } return(do.call(what = 'new', args = object.list)) } ) setMethod( f = 'show', signature = 'TransferAnchorSet', definition = function(object) { cat('An AnchorSet object containing', nrow(x = slot(object = object, name = "anchors")), "anchors between the reference and query Seurat objects. \n", "This can be used as input to TransferData.\n") } ) setMethod( f = 'show', signature = 'IntegrationAnchorSet', definition = function(object) { cat('An AnchorSet object containing', nrow(x = slot(object = object, name = "anchors")), "anchors between", length(x = slot(object = object, name = "object.list")), "Seurat objects \n", "This can be used as input to IntegrateData.\n") } ) setMethod( f = 'show', signature = 'ModalityWeights', definition = function(object) { cat( 'A ModalityWeights object containing modality weights between', paste(slot(object = object, name = "modality.assay"), collapse = " and "), "assays \n", "This can be used as input to FindMultiModelNeighbors.\n") } ) setMethod( f = 'show', signature = 'BridgeReferenceSet', definition = function(object) { cat( 'A BridgeReferenceSet object has a bridge object with ', ncol(slot(object = object, name = 'bridge')), 'cells and a reference object with ', ncol(slot(object = object, name = 'reference')), 'cells. \n','The bridge query reduction is ', slot(object = object, name = 'params')$bridge.query.reduction %||% slot(object = object, name = 'params')$supervised.reduction, "\n This can be used as input to FindBridgeTransferAnchors and FindBridgeIntegrationAnchors") } ) setMethod( f = 'show', signature = 'SCTModel', definition = function(object) { cat( "An sctransform model.\n", " Model formula: ", slot(object = object, name = "model"), "\n Parameters stored for", nrow(x = SCTResults(object = object, slot = "feature.attributes")), "features,", nrow(x = SCTResults(object = object, slot = "cell.attributes")), "cells.\n") } ) #' @importFrom utils head # setMethod( f = 'show', signature = 'SCTAssay', definition = function(object) { cat('SCTAssay data with', nrow(x = object), 'features for', ncol(x = object), 'cells, and', length(x = levels(x = object)) , 'SCTModel(s) \n') if (length(x = VariableFeatures(object = object)) > 0) { top.ten <- head(x = VariableFeatures(object = object), n = 10L) top <- 'Top' variable <- 'variable' } else { top.ten <- head(x = rownames(x = object), n = 10L) top <- 'First' variable <- '' } features <- paste0( variable, ' feature', if (length(x = top.ten) != 1) {'s'}, ":\n" ) features <- gsub(pattern = '^\\s+', replacement = '', x = features) cat( top, length(x = top.ten), features, paste(strwrap(x = paste(top.ten, collapse = ', ')), collapse = '\n'), '\n' ) } ) #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal AddMetaData defintion # # @param object An object # @param metadata A vector, list, or data.frame with metadata to add # @param col.name A name for meta data if not a named list or data.frame # # @return object with metadata added # .AddMetaData <- function(object, metadata, col.name = NULL) { object <- UpdateSlots(object = object) if (is.null(x = col.name) && is.atomic(x = metadata)) { stop("'col.name' must be provided for atomic metadata types (eg. vectors)") } if (inherits(x = metadata, what = c('matrix', 'Matrix'))) { metadata <- as.data.frame(x = metadata) } col.name <- col.name %||% names(x = metadata) %||% colnames(x = metadata) if (is.null(x = col.name)) { stop("No metadata name provided and could not infer it from metadata object") } object[[col.name]] <- metadata # if (class(x = metadata) == "data.frame") { # for (ii in 1:ncol(x = metadata)) { # object[[colnames(x = metadata)[ii]]] <- metadata[, ii, drop = FALSE] # } # } else { # object[[col.name]] <- metadata # } return(object) } # Find the names of collections in an object # # @return A vector with the names of slots that are a list # Collections <- function(object) { collections <- vapply( X = slotNames(x = object), FUN = function(x) { return(any(grepl(pattern = 'list', x = class(x = slot(object = object, name = x))))) }, FUN.VALUE = logical(length = 1L) ) collections <- Filter(f = isTRUE, x = collections) return(names(x = collections)) } # Get the default image of an object # # Attempts to find all images associated with the default assay of the object. # If none present, finds all images present in the object. Returns the name of # the first image # # @param object A Seurat object # # @return The name of the default image # DefaultImage <- function(object) { object <- UpdateSlots(object = object) images <- Images(object = object, assay = DefaultAssay(object = object)) if (length(x = images) < 1) { images <- Images(object = object) } return(images[[1]]) } # Get the names of objects within a Seurat object that are of a certain class # # @param object A Seurat object # @param classes.keep A vector of names of classes to get # # @return A vector with the names of objects within the Seurat object that are of class \code{classes.keep} # #' @importFrom stats na.omit # FilterObjects <- function(object, classes.keep = c('Assay', 'DimReduc')) { object <- UpdateSlots(object = object) slots <- na.omit(object = Filter( f = function(x) { sobj <- slot(object = object, name = x) return(is.list(x = sobj) && !is.data.frame(x = sobj) && !is.package_version(x = sobj)) }, x = slotNames(x = object) )) slots <- grep(pattern = 'tools', x = slots, value = TRUE, invert = TRUE) slots <- grep(pattern = 'misc', x = slots, value = TRUE, invert = TRUE) slots.objects <- unlist( x = lapply( X = slots, FUN = function(x) { return(names(x = slot(object = object, name = x))) } ), use.names = FALSE ) object.classes <- sapply( X = slots.objects, FUN = function(i) { return(inherits(x = object[[i]], what = classes.keep)) } ) object.classes <- which(x = object.classes, useNames = TRUE) return(names(x = object.classes)) } # Find the collection of an object within a Seurat object # # @param object A Seurat object # @param name Name of object to find # # @return The collection (slot) of the object # FindObject <- function(object, name) { collections <- c( 'assays', 'graphs', 'neighbors', 'reductions', 'commands', 'images' ) object.names <- lapply( X = collections, FUN = function(x) { return(names(x = slot(object = object, name = x))) } ) names(x = object.names) <- collections object.names <- Filter(f = Negate(f = is.null), x = object.names) for (i in names(x = object.names)) { if (name %in% names(x = slot(object = object, name = i))) { return(i) } } return(NULL) } # Prepare VST results for use with SCTAssay objects # # @param vst.res Results from sctransform::vst # @param cell.names Vector of valid cell names still in object # # @return An SCTModel object. # # PrepVSTResults <- function(vst.res, cell.names) { # Prepare cell attribute information cell.attrs <- vst.res$cell_attr cell.names <- intersect(x = cell.names, y = rownames(x = cell.attrs)) cell.cols <- c( 'umi', 'gene', 'log_umi', 'log_gene', 'umi_per_gene', 'log_umi_per_gene' ) cell.cols <- intersect(x = cell.cols, y = colnames(x = cell.attrs)) cell.attrs <- cell.attrs[cell.names, cell.cols, drop = FALSE] colnames(x = cell.attrs) <- gsub( pattern = 'gene', replacement = 'feature', x = colnames(x = cell.attrs) ) if (!is.null(x = vst.res$cells_step1)) { cell.attrs[, "cells_step1"] <- FALSE cells_step1 <- intersect(x = vst.res$cells_step1, y = rownames(x = cell.attrs)) cell.attrs[cells_step1, "cells_step1"] <- TRUE } # Prepare feature attribute information feature.attrs <- vst.res$gene_attr feature.cols <- c( 'detection_rate', 'gmean', 'variance', 'residual_mean', 'residual_variance' ) feature.cols <- intersect(x = feature.cols, y = colnames(x = feature.attrs)) feature.attrs <- feature.attrs[, feature.cols, drop = FALSE] feature.attrs <- cbind(feature.attrs, vst.res$model_pars_fit[rownames(feature.attrs), , drop = FALSE]) if (!is.null(x = vst.res$genes_log_gmean_step1)) { feature.attrs[,"genes_log_gmean_step1"] <- FALSE genes_step1 <- intersect( x = names(vst.res$genes_log_gmean_step1), y = rownames(feature.attrs) ) feature.attrs[genes_step1,"genes_log_gmean_step1"] <- TRUE # add parameters from step1 feature.attrs[, paste0("step1_", colnames(vst.res$model_pars))] <- NA feature.attrs[genes_step1, paste0("step1_", colnames(vst.res$model_pars))] <- vst.res$model_pars[genes_step1,] } # Prepare clipping information clips <- list( 'vst' = vst.res$arguments$res_clip_range, 'sct' = vst.res$arguments$sct.clip.range ) median_umi <- NA # check if a custom scale_factor was provided to vst() if ("scale_factor" %in% names(vst.res$arguments)){ median_umi <- vst.res$arguments$scale_factor } if (is.na(median_umi)) { if ("umi" %in% colnames(x = cell.attrs)) { median_umi <- median(cell.attrs$umi) } else if ("log_umi" %in% colnames(x = cell.attrs)) { median_umi <- median(10 ^ cell.attrs$log_umi) } } vst.res.SCTModel <- SCTModel( feature.attributes = feature.attrs, cell.attributes = cell.attrs, clips = clips, umi.assay = vst.res$umi.assay %||% "RNA", model = vst.res$model_str, arguments = vst.res$arguments, median_umi = median_umi ) return(vst.res.SCTModel) } # Return a null image # # @param mode Image representation to return # see \code{\link{GetImage}} for more details # #' @importFrom grid nullGrob #' @importFrom grDevices as.raster # NullImage <- function(mode) { image <- switch( EXPR = mode, 'grob' = nullGrob(), 'raster' = as.raster(x = new(Class = 'matrix')), 'plotly' = list('visible' = FALSE), 'raw' = NULL, stop("Unknown image mode: ", mode, call. = FALSE) ) return(image) } # Check to see if projected loadings have been set # # @param object a DimReduc object # # @return TRUE if proejcted loadings have been set, else FALSE # Projected <- function(object) { projected.dims <- dim(x = slot(object = object, name = 'feature.loadings.projected')) if (all(projected.dims == 1)) { return(!all(is.na(x = slot(object = object, name = 'feature.loadings.projected')))) } return(!all(projected.dims == 0)) } # Subset cells in vst data # @param sct.info A vst.out list # @param cells vector of cells to retain # @param features vector of features to retain SubsetVST <- function(sct.info, cells, features) { cells.keep <- intersect(x = cells, y = rownames(x = sct.info$cell_attr)) sct.info$cell_attr <- sct.info$cell_attr[cells.keep, ] # find which subset of features are in the SCT assay feat.keep <- intersect(x = features, y = rownames(x = sct.info$gene_attr)) sct.info$gene_attr <- sct.info$gene_attr[feat.keep, ] return(sct.info) } # Get the top # # @param data Data to pull the top from # @param num Pull top \code{num} # @param balanced Pull even amounts of from positive and negative values # # @return The top \code{num} # @seealso \{code{\link{TopCells}}} \{code{\link{TopFeatures}}} # #' @importFrom utils head tail # Top <- function(data, num, balanced) { nr <- nrow(x = data) if (num > nr) { warning("Requested number is larger than the number of available items (", nr, "). Setting to ", nr , ".", call. = FALSE) num <- nr } if (num == 1) { balanced <- FALSE } top <- if (balanced) { num <- round(x = num / 2) data <- data[order(data, decreasing = TRUE), , drop = FALSE] positive <- head(x = rownames(x = data), n = num) negative <- rev(x = tail(x = rownames(x = data), n = num)) # remove duplicates if (positive[num] == negative[num]) { negative <- negative[-num] } list(positive = positive, negative = negative) } else { data <- data[rev(x = order(abs(x = data))), , drop = FALSE] top <- head(x = rownames(x = data), n = num) top[order(data[top, ])] } return(top) } # Update Seurat assay # # @param old.assay Seurat2 assay # @param assay Name to store for assay in new object # UpdateAssay <- function(old.assay, assay){ cells <- colnames(x = old.assay@data) counts <- old.assay@raw.data data <- old.assay@data if (!inherits(x = counts, what = 'dgCMatrix')) { counts <- as.sparse(x = as.matrix(x = counts)) } if (!inherits(x = data, what = 'dgCMatrix')) { data <- as.sparse(x = as.matrix(x = data)) } new.assay <- new( Class = 'Assay', counts = counts[, cells], data = data, scale.data = old.assay@scale.data %||% new(Class = 'matrix'), meta.features = data.frame(row.names = rownames(x = counts)), var.features = old.assay@var.genes, key = paste0(assay, "_") ) return(new.assay) } # Update dimension reduction # # @param old.dr Seurat2 dimension reduction slot # @param assay.used Name of assay used to compute dimension reduction # UpdateDimReduction <- function(old.dr, assay) { new.dr <- list() for (i in names(x = old.dr)) { cell.embeddings <- old.dr[[i]]@cell.embeddings %||% new(Class = 'matrix') feature.loadings <- old.dr[[i]]@gene.loadings %||% new(Class = 'matrix') stdev <- old.dr[[i]]@sdev %||% numeric() misc <- old.dr[[i]]@misc %||% list() new.jackstraw <- UpdateJackstraw(old.jackstraw = old.dr[[i]]@jackstraw) old.key <- old.dr[[i]]@key if (length(x = old.key) == 0) { old.key <- gsub(pattern = "(.+?)(([0-9]+).*)", replacement = "\\1", x = colnames(cell.embeddings)[[1]]) if (length(x = old.key) == 0) { old.key <- i } } new.key <- suppressWarnings(expr = UpdateKey(key = old.key)) colnames(x = cell.embeddings) <- gsub( pattern = old.key, replacement = new.key, x = colnames(x = cell.embeddings) ) colnames(x = feature.loadings) <- gsub( pattern = old.key, replacement = new.key, x = colnames(x = feature.loadings) ) new.dr[[i]] <- new( Class = 'DimReduc', cell.embeddings = as(object = cell.embeddings, Class = 'matrix'), feature.loadings = as(object = feature.loadings, Class = 'matrix'), assay.used = assay, stdev = as(object = stdev, Class = 'numeric'), key = as(object = new.key, Class = 'character'), jackstraw = new.jackstraw, misc = as(object = misc, Class = 'list') ) } return(new.dr) } # Update jackstraw # # @param old.jackstraw # UpdateJackstraw <- function(old.jackstraw) { if (is.null(x = old.jackstraw)) { new.jackstraw <- new( Class = 'JackStrawData', empirical.p.values = new(Class = 'matrix'), fake.reduction.scores = new(Class = 'matrix'), empirical.p.values.full = new(Class = 'matrix'), overall.p.values = new(Class = 'matrix') ) } else { if (.hasSlot(object = old.jackstraw, name = 'overall.p.values')) { overall.p <- old.jackstraw@overall.p.values %||% new(Class = 'matrix') } else { overall.p <- new(Class = 'matrix') } new.jackstraw <- new( Class = 'JackStrawData', empirical.p.values = old.jackstraw@emperical.p.value %||% new(Class = 'matrix'), fake.reduction.scores = old.jackstraw@fake.pc.scores %||% new(Class = 'matrix'), empirical.p.values.full = old.jackstraw@emperical.p.value.full %||% new(Class = 'matrix'), overall.p.values = overall.p ) } return(new.jackstraw) } # Update a Key # # @param key A character to become a Seurat Key # # @return An updated Key that's valid for Seurat # UpdateKey <- function(key) { if (grepl(pattern = '^[[:alnum:]]+_$', x = key)) { return(key) } else { new.key <- regmatches( x = key, m = gregexpr(pattern = '[[:alnum:]]+', text = key) ) new.key <- paste0(paste(unlist(x = new.key), collapse = ''), '_') if (new.key == '_') { new.key <- paste0(RandomName(length = 3), '_') } warning( "Keys should be one or more alphanumeric characters followed by an underscore, setting key from ", key, " to ", new.key, call. = FALSE, immediate. = TRUE ) return(new.key) } } # Update slots in an object # # @param object An object to update # # @return \code{object} with the latest slot definitions # #' @importFrom rlang exec !!! UpdateSlots <- function(object) { object.list <- sapply( X = slotNames(x = object), FUN = function(x) { return(tryCatch( expr = slot(object = object, name = x), error = function(...) { return(NULL) } )) }, simplify = FALSE, USE.NAMES = TRUE ) object.list <- Filter(f = Negate(f = is.null), x = object.list) object.list <- c('Class' = class(x = object)[1], object.list) object <- exec( .fn = new, !!! object.list ) for (x in setdiff(x = slotNames(x = object), y = names(x = object.list))) { xobj <- slot(object = object, name = x) if (is.vector(x = xobj) && !is.list(x = xobj) && length(x = xobj) == 0) { slot(object = object, name = x) <- vector(mode = class(x = xobj), length = 1L) } } return(object) } # Pulls the proper data matrix for merging assay data. If the slot is empty, will return an empty # matrix with the proper dimensions from one of the remaining data slots. # # @param assay Assay to pull data from # @param slot Slot to pull from # # @return Returns the data matrix if present (i.e.) not 0x0. Otherwise, returns an # appropriately sized empty sparse matrix # #' @importFrom Matrix Matrix # ValidateDataForMerge <- function(assay, slot) { mat <- GetAssayData(object = assay, slot = slot) if (any(dim(x = mat) == c(0, 0))) { slots.to.check <- setdiff(x = c("counts", "data", "scale.data"), y = slot) for (ss in slots.to.check) { data.dims <- dim(x = GetAssayData(object = assay, slot = ss)) data.slot <- ss if (!any(data.dims == c(0, 0))) { break } } if (any(data.dims == c(0, 0))) { stop("The counts, data, and scale.data slots are all empty for the provided assay.") } mat <- Matrix( data = 0, nrow = data.dims[1], ncol = data.dims[2], dimnames = dimnames(x = GetAssayData(object = assay, slot = data.slot)) ) mat <- as.sparse(x = mat) } return(mat) } Seurat/R/convenience.R0000644000176200001440000003241214743751115014347 0ustar liggesusers#' @include generics.R #' @include visualization.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param fov Name to store FOV as #' @param assay Name to store expression matrix as #' @param ... Ignored #' #' @return \code{LoadAkoya}: A \code{\link[SeuratObject]{Seurat}} object #' #' @importFrom SeuratObject Cells CreateFOV CreateSeuratObject #' #' @export #' #' @rdname ReadAkoya #' LoadAkoya <- function( filename, type = c('inform', 'processor', 'qupath'), fov, assay = 'Akoya', ... ) { # read in matrix and centroids data <- ReadAkoya(filename = filename, type = type) # convert centroids into coords object coords <- suppressWarnings(expr = CreateFOV( coords = data$centroids, type = 'centroids', key = 'fov', assay = assay )) colnames(x = data$metadata) <- suppressWarnings( expr = make.names(names = colnames(x = data$metadata)) ) # build Seurat object from matrix obj <- CreateSeuratObject( counts = data$matrix, assay = assay, meta.data = data$metadata ) # make sure coords only contain cells in seurat object coords <- subset(x = coords, cells = Cells(x = obj)) suppressWarnings(expr = obj[[fov]] <- coords) # add image to seurat object # Add additional assays for (i in setdiff(x = names(x = data), y = c('matrix', 'centroids', 'metadata'))) { suppressWarnings(expr = obj[[i]] <- CreateAssayObject(counts = data[[i]])) } return(obj) } #' @inheritParams ReadAkoya #' @param data.dir Path to a directory containing Vitessce cells #' and clusters JSONs #' #' @return \code{LoadHuBMAPCODEX}: A \code{\link[SeuratObject]{Seurat}} object #' #' @importFrom SeuratObject Cells CreateFOV CreateSeuratObject #' #' @export #' #' @rdname ReadVitessce #' LoadHuBMAPCODEX <- function(data.dir, fov, assay = 'CODEX') { data <- ReadVitessce( counts = file.path(data.dir, "reg1_stitched_expressions.clusters.json"), coords = file.path(data.dir, "reg1_stitched_expressions.cells.json"), type = "segmentations" ) # Create spatial and Seurat objects coords <- CreateFOV( coords = data$segmentations, molecules = data$molecules, assay = assay ) obj <- CreateSeuratObject(counts = data$counts, assay = assay) # make sure spatial coords only contain cells in seurat object coords <- subset(x = coords, cells = Cells(x = obj)) obj[[fov]] <- coords return(obj) } #' @inheritParams ReadAkoya #' @param data.dir Path to folder containing Nanostring SMI outputs #' #' @return \code{LoadNanostring}: A \code{\link[SeuratObject]{Seurat}} object #' #' @importFrom SeuratObject Cells CreateCentroids CreateFOV #' CreateSegmentation CreateSeuratObject #' #' @export #' #' @rdname ReadNanostring #' LoadNanostring <- function(data.dir, fov, assay = 'Nanostring') { data <- ReadNanostring( data.dir = data.dir, type = c("centroids", "segmentations") ) segs <- CreateSegmentation(data$segmentations) cents <- CreateCentroids(data$centroids) segmentations.data <- list( "centroids" = cents, "segmentation" = segs ) coords <- CreateFOV( coords = segmentations.data, type = c("segmentation", "centroids"), molecules = data$pixels, assay = assay ) obj <- CreateSeuratObject(counts = data$matrix, assay = assay) # subset both object and coords based on the cells shared by both cells <- intersect( Cells(x = coords, boundary = "segmentation"), Cells(x = coords, boundary = "centroids") ) cells <- intersect(Cells(obj), cells) coords <- subset(x = coords, cells = cells) obj[[fov]] <- coords return(obj) } #' @return \code{LoadVizgen}: A \code{\link[SeuratObject]{Seurat}} object #' #' @importFrom SeuratObject Cells CreateCentroids CreateFOV #' CreateSegmentation CreateSeuratObject #' #' @export #' #' @rdname ReadVizgen #' LoadVizgen <- function(data.dir, fov, assay = 'Vizgen', z = 3L) { data <- ReadVizgen( data.dir = data.dir, filter = "^Blank-", type = c("centroids", "segmentations"), z = z ) segs <- CreateSegmentation(data$segmentations) cents <- CreateCentroids(data$centroids) segmentations.data <- list( "centroids" = cents, "segmentation" = segs ) coords <- CreateFOV( coords = segmentations.data, type = c("segmentation", "centroids"), molecules = data$microns, assay = assay ) obj <- CreateSeuratObject(counts = data$transcripts, assay = assay) # only consider the cells we have counts and a segmentation for # Cells which don't have a segmentation are probably found in other z slices. coords <- subset( x = coords, cells = intersect( x = Cells(x = coords[["segmentation"]]), y = Cells(x = obj) ) ) # add coords to seurat object obj[[fov]] <- coords return(obj) } #' @return \code{LoadXenium}: A \code{\link[SeuratObject]{Seurat}} object #' #' @param data.dir Path to folder containing Xenium outputs #' @param fov FOV name #' @param assay Assay name #' @param mols.qv.threshold Remove transcript molecules with #' a QV less than this threshold. QV >= 20 is the standard threshold #' used to construct the cell x gene count matrix. #' @param cell.centroids Whether or not to load cell centroids #' @param molecule.coordinates Whether or not to load molecule pixel coordinates #' @param segmentations One of "cell", "nucleus" or NULL (to load either cell #' segmentations, nucleus segmentations or neither) #' @param flip.xy Whether or not to flip the x/y coordinates of the Xenium outputs #' to match what is displayed in Xenium Explorer, or fit on your screen better. #' #' @importFrom SeuratObject Cells CreateCentroids CreateFOV #' CreateSegmentation CreateSeuratObject CreateMolecules #' #' @export #' #' @rdname ReadXenium #' LoadXenium <- function( data.dir, fov = 'fov', assay = 'Xenium', mols.qv.threshold = 20, cell.centroids = TRUE, molecule.coordinates = TRUE, segmentations = NULL, flip.xy = FALSE ) { if(!is.null(segmentations) && !(segmentations %in% c('nucleus', 'cell'))) { stop('segmentations must be NULL or one of "nucleus", "cell"') } if(!cell.centroids && is.null(segmentations)) { stop( "Must load either centroids or cell/nucleus segmentations" ) } data <- ReadXenium( data.dir = data.dir, type = c("centroids", "segmentations", "nucleus_segmentations")[ c(cell.centroids, isTRUE(segmentations == 'cell'), isTRUE(segmentations == 'nucleus')) ], outs = c("segmentation_method", "matrix", "microns")[ c(cell.centroids || isTRUE(segmentations != 'nucleus'), TRUE, molecule.coordinates && (cell.centroids || !is.null(segmentations))) ], mols.qv.threshold = mols.qv.threshold, flip.xy = flip.xy ) segmentations <- intersect(c("segmentations", "nucleus_segmentations"), names(data)) segmentations.data <- Filter(Negate(is.null), list( centroids = if(is.null(data$centroids)) { NULL } else { CreateCentroids(data$centroids) }, segmentations = if(length(segmentations) > 0) { CreateSegmentation( data[[segmentations]] ) } else { NULL } )) coords <- if(length(segmentations.data) > 0) { CreateFOV( segmentations.data, assay = assay, molecules = if(is.null(data$microns)) { NULL } else { CreateMolecules(data$microns) } ) } else { NULL } slot.map <- c( `Blank Codeword` = 'BlankCodeword', `Unassigned Codeword` = 'BlankCodeword', `Negative Control Codeword` = 'ControlCodeword', `Negative Control Probe` = 'ControlProbe', `Genomic Control` = 'GenomicControl' ) xenium.obj <- CreateSeuratObject(counts = data$matrix[["Gene Expression"]], assay = assay) if(!is.null(data$metadata)) { Misc(xenium.obj, 'run_metadata') <- data$metadata } if(!is.null(data$segmentation_method)) { xenium.obj <- AddMetaData(xenium.obj, data$segmentation_method) } for(name in intersect(names(slot.map), names(data$matrix))) { xenium.obj[[slot.map[name]]] <- CreateAssayObject(counts = data$matrix[[name]]) } xenium.obj[[fov]] <- coords return(xenium.obj) } #' @param ... Extra parameters passed to \code{DimHeatmap} #' #' @rdname DimHeatmap #' @concept convenience #' @export #' PCHeatmap <- function(object, ...) { args <- list('object' = object) args <- c(args, list(...)) args$reduction <- "pca" return(do.call(what = 'DimHeatmap', args = args)) } #' @param ... Extra parameters passed to \code{DimPlot} #' #' @rdname DimPlot #' @concept convenience #' @export #' PCAPlot <- function(object, ...) { return(SpecificDimPlot(object = object, ...)) } #' @rdname SpatialPlot #' @concept convenience #' @concept spatial #' @export #' SpatialDimPlot <- function( object, group.by = NULL, images = NULL, cols = NULL, crop = TRUE, cells.highlight = NULL, cols.highlight = c('#DE2D26', 'grey50'), facet.highlight = FALSE, label = FALSE, label.size = 7, label.color = 'white', repel = FALSE, ncol = NULL, combine = TRUE, pt.size.factor = 1.6, alpha = c(1, 1), image.alpha = 1, image.scale = "lowres", shape = 21, stroke = NA, label.box = TRUE, interactive = FALSE, information = NULL ) { return(SpatialPlot( object = object, group.by = group.by, images = images, cols = cols, crop = crop, cells.highlight = cells.highlight, cols.highlight = cols.highlight, facet.highlight = facet.highlight, label = label, label.size = label.size, label.color = label.color, repel = repel, ncol = ncol, combine = combine, pt.size.factor = pt.size.factor, alpha = alpha, image.alpha = image.alpha, image.scale = image.scale, shape = shape, stroke = stroke, label.box = label.box, interactive = interactive, information = information )) } #' @rdname SpatialPlot #' @concept convenience #' @concept spatial #' @export #' SpatialFeaturePlot <- function( object, features, images = NULL, crop = TRUE, slot = 'data', keep.scale = "feature", min.cutoff = NA, max.cutoff = NA, ncol = NULL, combine = TRUE, pt.size.factor = 1.6, alpha = c(1, 1), image.alpha = 1, image.scale = "lowres", shape = 21, stroke = NA, interactive = FALSE, information = NULL ) { return(SpatialPlot( object = object, features = features, images = images, crop = crop, slot = slot, keep.scale = keep.scale, min.cutoff = min.cutoff, max.cutoff = max.cutoff, ncol = ncol, combine = combine, pt.size.factor = pt.size.factor, alpha = alpha, image.alpha = image.alpha, image.scale = image.scale, shape = shape, stroke = stroke, interactive = interactive, information = information )) } #' @rdname DimPlot #' @concept convenience #' @export #' TSNEPlot <- function(object, ...) { return(SpecificDimPlot(object = object, ...)) } #' @rdname DimPlot #' @concept convenience #' @export #' UMAPPlot <- function(object, ...) { return(SpecificDimPlot(object = object, ...)) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # @rdname DimPlot # SpecificDimPlot <- function(object, ...) { funs <- sys.calls() name <- as.character(x = funs[[length(x = funs) - 1]])[1] name <- tolower(x = gsub(pattern = 'Plot', replacement = '', x = name)) args <- list('object' = object) args <- c(args, list(...)) reduc <- grep( pattern = name, x = names(x = object), value = TRUE, ignore.case = TRUE ) reduc <- grep(pattern = DefaultAssay(object = object), x = reduc, value = TRUE) args$reduction <- ifelse(test = length(x = reduc) == 1, yes = reduc, no = name) tryCatch( expr = return(do.call(what = 'DimPlot', args = args)), error = function(e) { stop(e) } ) } #' Read output from Parse Biosciences #' #' @param data.dir Directory containing the data files #' @param ... Extra parameters passed to \code{\link{ReadMtx}} #' @concept convenience #' @export #' ReadParseBio <- function(data.dir, ...) { file.dir <- list.files(path = data.dir, pattern = ".mtx") mtx <- file.path(data.dir, file.dir) cells <- file.path(data.dir, "cell_metadata.csv") features <- file.path(data.dir, "all_genes.csv") return(ReadMtx( mtx = mtx, cells = cells, features = features, cell.column = 1, feature.column = 2, cell.sep = ",", feature.sep = ",", skip.cell = 1, skip.feature = 1, mtx.transpose = TRUE )) } #' Read output from STARsolo #' #' @param data.dir Directory containing the data files #' @param ... Extra parameters passed to \code{\link{ReadMtx}} #' #' @rdname ReadSTARsolo #' @concept convenience #' @export #' ReadSTARsolo <- function(data.dir, ... ) { mtx <- file.path(data.dir, "matrix.mtx") cells <- file.path(data.dir, "barcodes.tsv") features <- file.path(data.dir, "features.tsv") return(ReadMtx(mtx = mtx, cells = cells, features = features, ...)) } Seurat/R/RcppExports.R0000644000176200001440000001174414744245313014350 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 RunModularityClusteringCpp <- function(SNN, modularityFunction, resolution, algorithm, nRandomStarts, nIterations, randomSeed, printOutput, edgefilename) { .Call('_Seurat_RunModularityClusteringCpp', PACKAGE = 'Seurat', SNN, modularityFunction, resolution, algorithm, nRandomStarts, nIterations, randomSeed, printOutput, edgefilename) } RunUMISampling <- function(data, sample_val, upsample = FALSE, display_progress = TRUE) { .Call('_Seurat_RunUMISampling', PACKAGE = 'Seurat', data, sample_val, upsample, display_progress) } RunUMISamplingPerCell <- function(data, sample_val, upsample = FALSE, display_progress = TRUE) { .Call('_Seurat_RunUMISamplingPerCell', PACKAGE = 'Seurat', data, sample_val, upsample, display_progress) } RowMergeMatrices <- function(mat1, mat2, mat1_rownames, mat2_rownames, all_rownames) { .Call('_Seurat_RowMergeMatrices', PACKAGE = 'Seurat', mat1, mat2, mat1_rownames, mat2_rownames, all_rownames) } LogNorm <- function(data, scale_factor, display_progress = TRUE) { .Call('_Seurat_LogNorm', PACKAGE = 'Seurat', data, scale_factor, display_progress) } Standardize <- function(mat, display_progress = TRUE) { .Call('_Seurat_Standardize', PACKAGE = 'Seurat', mat, display_progress) } FastSparseRowScale <- function(mat, scale = TRUE, center = TRUE, scale_max = 10, display_progress = TRUE) { .Call('_Seurat_FastSparseRowScale', PACKAGE = 'Seurat', mat, scale, center, scale_max, display_progress) } FastSparseRowScaleWithKnownStats <- function(mat, mu, sigma, scale = TRUE, center = TRUE, scale_max = 10, display_progress = TRUE) { .Call('_Seurat_FastSparseRowScaleWithKnownStats', PACKAGE = 'Seurat', mat, mu, sigma, scale, center, scale_max, display_progress) } FastCov <- function(mat, center = TRUE) { .Call('_Seurat_FastCov', PACKAGE = 'Seurat', mat, center) } FastCovMats <- function(mat1, mat2, center = TRUE) { .Call('_Seurat_FastCovMats', PACKAGE = 'Seurat', mat1, mat2, center) } FastRBind <- function(mat1, mat2) { .Call('_Seurat_FastRBind', PACKAGE = 'Seurat', mat1, mat2) } FastExpMean <- function(mat, display_progress) { .Call('_Seurat_FastExpMean', PACKAGE = 'Seurat', mat, display_progress) } SparseRowVar2 <- function(mat, mu, display_progress) { .Call('_Seurat_SparseRowVar2', PACKAGE = 'Seurat', mat, mu, display_progress) } SparseRowVarStd <- function(mat, mu, sd, vmax, display_progress) { .Call('_Seurat_SparseRowVarStd', PACKAGE = 'Seurat', mat, mu, sd, vmax, display_progress) } FastLogVMR <- function(mat, display_progress) { .Call('_Seurat_FastLogVMR', PACKAGE = 'Seurat', mat, display_progress) } RowVar <- function(x) { .Call('_Seurat_RowVar', PACKAGE = 'Seurat', x) } SparseRowVar <- function(mat, display_progress) { .Call('_Seurat_SparseRowVar', PACKAGE = 'Seurat', mat, display_progress) } ReplaceColsC <- function(mat, col_idx, replacement) { .Call('_Seurat_ReplaceColsC', PACKAGE = 'Seurat', mat, col_idx, replacement) } GraphToNeighborHelper <- function(mat) { .Call('_Seurat_GraphToNeighborHelper', PACKAGE = 'Seurat', mat) } fast_dist <- function(x, y, n) { .Call('_Seurat_fast_dist', PACKAGE = 'Seurat', x, y, n) } FindWeightsC <- function(cells2, distances, anchor_cells2, integration_matrix_rownames, cell_index, anchor_score, min_dist, sd, display_progress) { .Call('_Seurat_FindWeightsC', PACKAGE = 'Seurat', cells2, distances, anchor_cells2, integration_matrix_rownames, cell_index, anchor_score, min_dist, sd, display_progress) } IntegrateDataC <- function(integration_matrix, weights, expression_cells2) { .Call('_Seurat_IntegrateDataC', PACKAGE = 'Seurat', integration_matrix, weights, expression_cells2) } ScoreHelper <- function(snn, query_pca, query_dists, corrected_nns, k_snn, subtract_first_nn, display_progress) { .Call('_Seurat_ScoreHelper', PACKAGE = 'Seurat', snn, query_pca, query_dists, corrected_nns, k_snn, subtract_first_nn, display_progress) } ComputeSNN <- function(nn_ranked, prune) { .Call('_Seurat_ComputeSNN', PACKAGE = 'Seurat', nn_ranked, prune) } WriteEdgeFile <- function(snn, filename, display_progress) { invisible(.Call('_Seurat_WriteEdgeFile', PACKAGE = 'Seurat', snn, filename, display_progress)) } DirectSNNToFile <- function(nn_ranked, prune, display_progress, filename) { .Call('_Seurat_DirectSNNToFile', PACKAGE = 'Seurat', nn_ranked, prune, display_progress, filename) } SNN_SmallestNonzero_Dist <- function(snn, mat, n, nearest_dist) { .Call('_Seurat_SNN_SmallestNonzero_Dist', PACKAGE = 'Seurat', snn, mat, n, nearest_dist) } row_sum_dgcmatrix <- function(x, i, rows, cols) { .Call('_Seurat_row_sum_dgcmatrix', PACKAGE = 'Seurat', x, i, rows, cols) } row_mean_dgcmatrix <- function(x, i, rows, cols) { .Call('_Seurat_row_mean_dgcmatrix', PACKAGE = 'Seurat', x, i, rows, cols) } row_var_dgcmatrix <- function(x, i, rows, cols) { .Call('_Seurat_row_var_dgcmatrix', PACKAGE = 'Seurat', x, i, rows, cols) } Seurat/R/generics.R0000644000176200001440000006471214744463014013661 0ustar liggesusers#' @include reexports.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Add info to anchor matrix #' #' @param anchors An \code{\link{AnchorSet}} object #' @param vars Variables to pull for each object via FetchData #' @param slot Slot to pull feature data for #' @param assay Specify the Assay per object if annotating with expression data #' @param ... Arguments passed to other methods # #' @return Returns the anchor dataframe with additional columns for annotation #' metadata #' #' @export #' AnnotateAnchors <- function(anchors, vars, slot, ...) { UseMethod(generic = 'AnnotateAnchors', object = anchors) } #' Convert objects to CellDataSet objects #' #' @param x An object to convert to class \code{CellDataSet} #' @param ... Arguments passed to other methods #' #' @rdname as.CellDataSet #' @export as.CellDataSet #' as.CellDataSet <- function(x, ...) { UseMethod(generic = 'as.CellDataSet', object = x) } #' Convert objects to SingleCellExperiment objects #' #' @param x An object to convert to class \code{SingleCellExperiment} #' @param ... Arguments passed to other methods #' #' @rdname as.SingleCellExperiment #' @export as.SingleCellExperiment #' as.SingleCellExperiment <- function(x, ...) { UseMethod(generic = 'as.SingleCellExperiment', object = x) } #' Cluster Determination #' #' Identify clusters of cells by a shared nearest neighbor (SNN) modularity #' optimization based clustering algorithm. First calculate k-nearest neighbors #' and construct the SNN graph. Then optimize the modularity function to #' determine clusters. For a full description of the algorithms, see Waltman and #' van Eck (2013) \emph{The European Physical Journal B}. Thanks to Nigel #' Delaney (evolvedmicrobe@github) for the rewrite of the Java modularity #' optimizer code in Rcpp! #' #' To run Leiden algorithm, you must first install the leidenalg python #' package (e.g. via pip install leidenalg), see Traag et al (2018). #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @return Returns a Seurat object where the idents have been updated with new cluster info; #' latest clustering results will be stored in object metadata under 'seurat_clusters'. #' Note that 'seurat_clusters' will be overwritten everytime FindClusters is run #' #' @export #' #' @rdname FindClusters #' @export FindClusters #' FindClusters <- function(object, ...) { UseMethod(generic = 'FindClusters', object = object) } #' Gene expression markers of identity classes #' #' Finds markers (differentially expressed genes) for identity classes #' #' @param object An object #' @param ... Arguments passed to other methods and to specific DE methods #' @return data.frame with a ranked list of putative markers as rows, and associated #' statistics as columns (p-values, ROC score, etc., depending on the test used (\code{test.use})). The following columns are always present: #' \itemize{ #' \item \code{avg_logFC}: log fold-chage of the average expression between the two groups. Positive values indicate that the gene is more highly expressed in the first group #' \item \code{pct.1}: The percentage of cells where the gene is detected in the first group #' \item \code{pct.2}: The percentage of cells where the gene is detected in the second group #' \item \code{p_val_adj}: Adjusted p-value, based on bonferroni correction using all genes in the dataset #' } #' #' @details p-value adjustment is performed using bonferroni correction based on #' the total number of genes in the dataset. Other correction methods are not #' recommended, as Seurat pre-filters genes using the arguments above, reducing #' the number of tests performed. Lastly, as Aaron Lun has pointed out, p-values #' should be interpreted cautiously, as the genes used for clustering are the #' same genes tested for differential expression. #' #' @references McDavid A, Finak G, Chattopadyay PK, et al. Data exploration, #' quality control and testing in single-cell qPCR-based gene expression experiments. #' Bioinformatics. 2013;29(4):461-467. doi:10.1093/bioinformatics/bts714 #' @references Trapnell C, et al. The dynamics and regulators of cell fate #' decisions are revealed by pseudotemporal ordering of single cells. Nature #' Biotechnology volume 32, pages 381-386 (2014) #' @references Andrew McDavid, Greg Finak and Masanao Yajima (2017). MAST: Model-based #' Analysis of Single Cell Transcriptomics. R package version 1.2.1. #' https://github.com/RGLab/MAST/ #' @references Love MI, Huber W and Anders S (2014). "Moderated estimation of #' fold change and dispersion for RNA-seq data with DESeq2." Genome Biology. #' https://bioconductor.org/packages/release/bioc/html/DESeq2.html #' #' @export #' #' @examples #' \dontrun{ #' data("pbmc_small") #' # Find markers for cluster 2 #' markers <- FindMarkers(object = pbmc_small, ident.1 = 2) #' head(x = markers) #' #' # Take all cells in cluster 2, and find markers that separate cells in the 'g1' group (metadata #' # variable 'group') #' markers <- FindMarkers(pbmc_small, ident.1 = "g1", group.by = 'groups', subset.ident = "2") #' head(x = markers) #' #' # Pass 'clustertree' or an object of class phylo to ident.1 and #' # a node to ident.2 as a replacement for FindMarkersNode #' if (requireNamespace("ape", quietly = TRUE)) { #' pbmc_small <- BuildClusterTree(object = pbmc_small) #' markers <- FindMarkers(object = pbmc_small, ident.1 = 'clustertree', ident.2 = 5) #' head(x = markers) #' } #' } #' #' @rdname FindMarkers #' @export FindMarkers #' #' @aliases FindMarkersNode #' @seealso \code{FoldChange} #' FindMarkers <- function(object, ...) { UseMethod(generic = 'FindMarkers', object = object) } #' (Shared) Nearest-neighbor graph construction #' #' Computes the \code{k.param} nearest neighbors for a given dataset. Can also #' optionally (via \code{compute.SNN}), construct a shared nearest neighbor #' graph by calculating the neighborhood overlap (Jaccard index) between every #' cell and its \code{k.param} nearest neighbors. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @return This function can either return a \code{\link[SeuratObject]{Neighbor}} object #' with the KNN information or a list of \code{\link[SeuratObject]{Graph}} objects with #' the KNN and SNN depending on the settings of \code{return.neighbor} and #' \code{compute.SNN}. When running on a \code{\link[SeuratObject]{Seurat}} object, this #' returns the \code{\link[SeuratObject]{Seurat}} object with the Graphs or Neighbor objects #' stored in their respective slots. Names of the Graph or Neighbor object can #' be found with \code{\link[SeuratObject]{Graphs}} or \code{\link[SeuratObject]{Neighbors}}. #' #' @examples #' data("pbmc_small") #' pbmc_small #' # Compute an SNN on the gene expression level #' pbmc_small <- FindNeighbors(pbmc_small, features = VariableFeatures(object = pbmc_small)) #' #' # More commonly, we build the SNN on a dimensionally reduced form of the data #' # such as the first 10 principle components. #' #' pbmc_small <- FindNeighbors(pbmc_small, reduction = "pca", dims = 1:10) #' #' @rdname FindNeighbors #' @export FindNeighbors #' FindNeighbors <- function(object, ...) { UseMethod(generic = 'FindNeighbors', object = object) } #' Find variable features #' #' Identifies features that are outliers on a 'mean variability plot'. #' #' For the mean.var.plot method: #' Exact parameter settings may vary empirically from dataset to dataset, and #' based on visual inspection of the plot. Setting the y.cutoff parameter to 2 #' identifies features that are more than two standard deviations away from the #' average dispersion within a bin. The default X-axis function is the mean #' expression level, and for Y-axis it is the log(Variance/mean). All mean/variance #' calculations are not performed in log-space, but the results are reported in #' log-space - see relevant functions for exact details. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @rdname FindVariableFeatures #' @export FindVariableFeatures #' #' @aliases FindVariableGenes #' FindVariableFeatures <- function(object, ...) { UseMethod(generic = 'FindVariableFeatures', object = object) } #' Find spatially variable features #' #' Identify features whose variability in expression can be explained to some #' degree by spatial location. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @rdname FindSpatiallyVariableFeatures #' @export FindSpatiallyVariableFeatures #' FindSpatiallyVariableFeatures <- function(object, ...) { UseMethod(generic = 'FindSpatiallyVariableFeatures', object = object) } #' Fold Change #' #' Calculate log fold change and percentage of cells expressing each feature #' for different identity classes. #' #' If the slot is \code{scale.data} or a reduction is specified, average difference #' is returned instead of log fold change and the column is named "avg_diff". #' Otherwise, log2 fold change is returned with column named "avg_log2_FC". #' #' @examples #' \dontrun{ #' data("pbmc_small") #' FoldChange(pbmc_small, ident.1 = 1) #' } #' #' @param object A Seurat object #' @param ... Arguments passed to other methods #' @rdname FoldChange #' @export FoldChange #' @return Returns a data.frame #' @seealso \code{FindMarkers} FoldChange <- function(object, ...) { UseMethod(generic = 'FoldChange', object = object) } #' Get an Assay object from a given Seurat object. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @return Returns an Assay object #' #' @rdname GetAssay #' @export GetAssay #' GetAssay <- function(object, ...) { UseMethod(generic = 'GetAssay', object = object) } #' Integrate low dimensional embeddings #' #' Perform dataset integration using a pre-computed Anchorset of specified low #' dimensional representations. #' #' The main steps of this procedure are identical to \code{\link{IntegrateData}} #' with one key distinction. When computing the weights matrix, the distance #' calculations are performed in the full space of integrated embeddings when #' integrating more than two datasets, as opposed to a reduced PCA space which #' is the default behavior in \code{\link{IntegrateData}}. #' #' @param anchorset An AnchorSet object #' @param new.reduction.name Name for new integrated dimensional reduction. #' @param reductions Name of reductions to be integrated. For a #' TransferAnchorSet, this should be the name of a reduction present in the #' anchorset object (for example, "pcaproject"). For an IntegrationAnchorSet, #' this should be a \code{\link[SeuratObject]{DimReduc}} object containing all cells present #' in the anchorset object. #' @param dims.to.integrate Number of dimensions to return integrated values for #' @param weight.reduction Dimension reduction to use when calculating anchor #' weights. This can be one of: #' \itemize{ #' \item{A string, specifying the name of a dimension reduction present in #' all objects to be integrated} #' \item{A vector of strings, specifying the name of a dimension reduction to #' use for each object to be integrated} #' \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, specifying the object to #' use for each object in the integration} #' \item{NULL, in which case the full corrected space is used for computing #' anchor weights.} #' } #' @param ... Reserved for internal use #' #' @return When called on a TransferAnchorSet (from FindTransferAnchors), this #' will return the query object with the integrated embeddings stored in a new #' reduction. When called on an IntegrationAnchorSet (from IntegrateData), this #' will return a merged object with the integrated reduction stored. #' #' @rdname IntegrateEmbeddings #' @export IntegrateEmbeddings #' IntegrateEmbeddings <- function(anchorset, ...) { UseMethod(generic = "IntegrateEmbeddings", object = anchorset) } #' Leverage Score Calculation #' #' This function computes the leverage scores for a given object #' It uses the concept of sketching and random projections. The function provides an approximation #' to the leverage scores using a scalable method suitable for large matrices. #' #' @param object A matrix-like object #' @param ... Arguments passed to other methods #' #' @references Clarkson, K. L. & Woodruff, D. P. #' Low-rank approximation and regression in input sparsity time. #' JACM 63, 1–45 (2017). \url{https://dl.acm.org/doi/10.1145/3019134}; #' #' @export #' LeverageScore <- function(object, ...) { UseMethod(generic = 'LeverageScore', object = object) } #' Normalize Raw Data #' #' @param data Matrix with the raw count data #' @param scale.factor Scale the data; default is \code{1e4} #' @param margin Margin to normalize over #' @param verbose Print progress #' #' @return A matrix with the normalized and log-transformed data #' #' @template param-dotsm #' #' @export #' @concept preprocessing #' #' @examples #' mat <- matrix(data = rbinom(n = 25, size = 5, prob = 0.2), nrow = 5) #' mat #' mat_norm <- LogNormalize(data = mat) #' mat_norm #' LogNormalize <- function( data, scale.factor = 1e4, margin = 2L, verbose = TRUE, ... ) { UseMethod(generic = 'LogNormalize', object = data) } #' Metric for evaluating mapping success #' #' This metric was designed to help identify query cells that aren't well #' represented in the reference dataset. The intuition for the score is that we #' are going to project the query cells into a reference-defined space and then #' project them back onto the query. By comparing the neighborhoods before and #' after projection, we identify cells who's local neighborhoods are the most #' affected by this transformation. This could be because there is a population #' of query cells that aren't present in the reference or the state of the cells #' in the query is significantly different from the equivalent cell type in the #' reference. #' #' @param anchors Set of anchors #' @param ... Arguments passed to other methods #' #' @rdname MappingScore #' @export MappingScore #' MappingScore <- function(anchors, ...) { UseMethod(generic = "MappingScore", object = anchors) } #' Normalize Data #' #' Normalize the count data present in a given assay. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @return Returns object after normalization #' #' @rdname NormalizeData #' @export NormalizeData #' NormalizeData <- function(object, ...) { UseMethod(generic = 'NormalizeData', object = object) } #' Project query data to the reference dimensional reduction #' #' #' @param query An object for query cells #' @param reference An object for reference cells #' @param query.assay Assay name for query object #' @param reference.assay Assay name for reference object #' @param reduction Name of dimensional reduction from reference object #' @param dims Dimensions used for reference dimensional reduction #' @param scale Determine if scale query data based on reference data variance #' @param verbose Print progress #' @param feature.mean Mean of features in reference #' @param feature.sd Standard variance of features in reference #' #' @return A matrix with projected cell embeddings #' #' @rdname ProjectCellEmbeddings #' @export ProjectCellEmbeddings #' #' @keywords internal #' ProjectCellEmbeddings <- function( query, ... ) { UseMethod(generic = 'ProjectCellEmbeddings', object = query) } #' Project query into UMAP coordinates of a reference #' #' This function will take a query dataset and project it into the coordinates #' of a provided reference UMAP. This is essentially a wrapper around two steps: #' \itemize{ #' \item{FindNeighbors - Find the nearest reference cell neighbors and their #' distances for each query cell.} #' \item{RunUMAP - Perform umap projection by providing the neighbor set #' calculated above and the umap model previously computed in the reference.} #' } #' #' @param query Query dataset #' #' @rdname ProjectUMAP #' @export ProjectUMAP #' ProjectUMAP <- function(query, ...) { UseMethod(generic = "ProjectUMAP", object = query) } #' Pseudobulk Expression #' #' Normalize the count data present in a given assay. #' #' @param object An assay #' @param ... Arguments passed to other methods #' #' @return Returns object after normalization #' #' @rdname PseudobulkExpression #' @export PseudobulkExpression #' @concept utilities #' PseudobulkExpression <- function(object, ...) { UseMethod(generic = "PseudobulkExpression", object = object) } #' Perform Canonical Correlation Analysis #' #' Runs a canonical correlation analysis using a diagonal implementation of CCA. #' For details about stored CCA calculation parameters, see #' \code{PrintCCAParams}. #' @param object1 First Seurat object #' @param object2 Second Seurat object. # @param ... Arguments passed to other methods #' #' @return Returns a combined Seurat object with the CCA results stored. #' #' @seealso \code{\link[SeuratObject]{merge.Seurat}} #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small #' # As CCA requires two datasets, we will split our test object into two just for this example #' pbmc1 <- subset(pbmc_small, cells = colnames(pbmc_small)[1:40]) #' pbmc2 <- subset(pbmc_small, cells = colnames(x = pbmc_small)[41:80]) #' pbmc1[["group"]] <- "group1" #' pbmc2[["group"]] <- "group2" #' pbmc_cca <- RunCCA(object1 = pbmc1, object2 = pbmc2) #' # Print results #' print(x = pbmc_cca[["cca"]]) #' } #' #' @rdname RunCCA #' @export RunCCA #' RunCCA <- function(object1, object2, ...) { UseMethod(generic = 'RunCCA', object = object1) } #' Run Graph Laplacian Eigendecomposition #' #' Run a graph laplacian dimensionality reduction. It is used as a low #' dimensional representation for a cell-cell graph. The input graph #' should be symmetric #' #' @param object A Seurat object #' @param ... Arguments passed to #' \code{\link[RSpectra:eigs_sym]{RSpectra::eigs_sym}} #' #' @return Returns Seurat object with the Graph laplacian eigenvector #' calculation stored in the reductions slot #' #' @rdname RunGraphLaplacian #' @export RunGraphLaplacian #' RunGraphLaplacian <- function(object, ...) { UseMethod(generic = 'RunGraphLaplacian', object = object) } #' Run Independent Component Analysis on gene expression #' #' Run fastica algorithm from the ica package for ICA dimensionality reduction. #' For details about stored ICA calculation parameters, see #' \code{PrintICAParams}. #' #' @param object Seurat object #' #' @rdname RunICA #' @export RunICA #' RunICA <- function(object, ...) { UseMethod(generic = "RunICA", object = object) } #' Run Linear Discriminant Analysis #' #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @rdname RunLDA #' @export RunLDA #' #' @aliases RunLDA #' RunLDA <- function(object, ...) { UseMethod(generic = 'RunLDA', object = object) } #' Run Principal Component Analysis #' #' Run a PCA dimensionality reduction. For details about stored PCA calculation #' parameters, see \code{PrintPCAParams}. #' #' @param object An object #' @param ... Arguments passed to other methods and IRLBA #' #' @return Returns Seurat object with the PCA calculation stored in the reductions slot #' #' @export #' #' @rdname RunPCA #' @export RunPCA #' RunPCA <- function(object, ...) { UseMethod(generic = 'RunPCA', object = object) } #' Run Supervised Latent Semantic Indexing #' #' Run a supervised LSI (SLSI) dimensionality reduction supervised by a #' cell-cell kernel. SLSI is used to capture a linear transformation of peaks #' that maximizes its dependency to the given cell-cell kernel. #' #' @param object An object #' @param ... Arguments passed to IRLBA irlba #' #' @return Returns Seurat object with the SLSI calculation stored in the #' reductions slot #' #' @export #' #' @rdname RunSLSI #' @export RunSLSI #' RunSLSI <- function(object, ...) { UseMethod(generic = 'RunSLSI', object = object) } #' Run Supervised Principal Component Analysis #' #' Run a supervised PCA (SPCA) dimensionality reduction supervised by a cell-cell kernel. #' SPCA is used to capture a linear transformation which maximizes its dependency to #' the given cell-cell kernel. We use SNN graph as the kernel to supervise the linear #' matrix factorization. #' #' @param object An object #' @param ... Arguments passed to other methods and IRLBA #' #' @return Returns Seurat object with the SPCA calculation stored in the reductions slot #' @references Barshan E, Ghodsi A, Azimifar Z, Jahromi MZ. #' Supervised principal component analysis: Visualization, classification and #' regression on subspaces and submanifolds. #' Pattern Recognition. 2011 Jul 1;44(7):1357-71. \url{doi:10.1016/j.patcog.2010.12.015}; #' @export #' #' @rdname RunSPCA #' @export RunSPCA #' RunSPCA <- function(object, ...) { UseMethod(generic = 'RunSPCA', object = object) } #' Run t-distributed Stochastic Neighbor Embedding #' #' Run t-SNE dimensionality reduction on selected features. Has the option of #' running in a reduced dimensional space (i.e. spectral tSNE, recommended), #' or running based on a set of genes. For details about stored TSNE calculation #' parameters, see \code{PrintTSNEParams}. #' #' @param object Seurat object #' @param ... Arguments passed to other methods and to t-SNE call (most commonly used is perplexity) #' #' @rdname RunTSNE #' @export RunTSNE #' RunTSNE <- function(object, ...) { UseMethod(generic = 'RunTSNE', object = object) } #' Run UMAP #' #' Runs the Uniform Manifold Approximation and Projection (UMAP) dimensional #' reduction technique. To run using \code{umap.method="umap-learn"}, you must #' first install the umap-learn python package (e.g. via #' \code{pip install umap-learn}). Details on this package can be #' found here: \url{https://github.com/lmcinnes/umap}. For a more in depth #' discussion of the mathematics underlying UMAP, see the ArXiv paper here: #' \url{https://arxiv.org/abs/1802.03426}. #' #' @param object An object #' @param ... Arguments passed to other methods and UMAP #' #' @return Returns a Seurat object containing a UMAP representation #' #' @references McInnes, L, Healy, J, UMAP: Uniform Manifold Approximation and #' Projection for Dimension Reduction, ArXiv e-prints 1802.03426, 2018 #' #' @export #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small #' # Run UMAP map on first 5 PCs #' pbmc_small <- RunUMAP(object = pbmc_small, dims = 1:5) #' # Plot results #' DimPlot(object = pbmc_small, reduction = 'umap') #' } #' #' @rdname RunUMAP #' @export RunUMAP #' RunUMAP <- function(object, ...) { UseMethod(generic = 'RunUMAP', object = object) } #' Scale and center the data. #' #' Scales and centers features in the dataset. If variables are provided in vars.to.regress, #' they are individually regressed against each feature, and the resulting residuals are #' then scaled and centered. #' #' ScaleData now incorporates the functionality of the function formerly known #' as RegressOut (which regressed out given the effects of provided variables #' and then scaled the residuals). To make use of the regression functionality, #' simply pass the variables you want to remove to the vars.to.regress parameter. #' #' Setting center to TRUE will center the expression for each feature by subtracting #' the average expression for that feature. Setting scale to TRUE will scale the #' expression level for each feature by dividing the centered feature expression #' levels by their standard deviations if center is TRUE and by their root mean #' square otherwise. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @rdname ScaleData #' @export ScaleData #' ScaleData <- function(object, ...) { UseMethod(generic = 'ScaleData', object = object) } #' Get image scale factors #' #' @param object An object to get scale factors from #' @param ... Arguments passed to other methods #' #' @return An object of class \code{scalefactors} #' #' @rdname ScaleFactors #' @export ScaleFactors #' ScaleFactors <- function(object, ...) { UseMethod(generic = 'ScaleFactors', object = object) } #' Compute Jackstraw scores significance. #' #' Significant PCs should show a p-value distribution that is #' strongly skewed to the left compared to the null distribution. #' The p-value for each PC is based on a proportion test comparing the number #' of features with a p-value below a particular threshold (score.thresh), compared with the #' proportion of features expected under a uniform distribution of p-values. #' #' @param object An object #' @param ... Arguments passed to other methods #' #' @return Returns a Seurat object #' #' @author Omri Wurtzel #' @seealso \code{\link{JackStrawPlot}} #' #' @rdname ScoreJackStraw #' @export ScoreJackStraw #' ScoreJackStraw <- function(object, ...) { UseMethod(generic = 'ScoreJackStraw', object = object) } #' Perform sctransform-based normalization #' @param object An object #' @param ... Arguments passed to other methods (not used) #' #' @rdname SCTransform #' @export SCTransform #' SCTransform <- function(object, ...) { UseMethod(generic = 'SCTransform', object = object) } #' Get SCT results from an Assay #' #' Pull the \code{\link{SCTResults}} information from an \code{\link{SCTAssay}} #' object. #' #' @param object An object #' @param ... Arguments passed to other methods (not used) #' #' @rdname SCTResults #' @export SCTResults #' SCTResults <- function(object, ...) { UseMethod(generic = 'SCTResults', object = object) } #' @param value new data to set #' #' @rdname SCTResults #' @export SCTResults<- #' "SCTResults<-" <- function(object, ..., value) { UseMethod(generic = 'SCTResults<-', object = object) } #' Variance Stabilizing Transformation #' #' Apply variance stabilizing transformation for selection of variable features #' #' @inheritParams stats::loess #' @param data A matrix-like object #' @param margin Unused #' @param nselect Number of of features to select #' @param clip Upper bound for values post-standardization; defaults to the #' square root of the number of cells #' @param verbose ... #' #' @template param-dotsm #' #' @return A data frame with the following columns: #' \itemize{ #' \item \dQuote{\code{mean}}: ... #' \item \dQuote{\code{variance}}: ... #' \item \dQuote{\code{variance.expected}}: ... #' \item \dQuote{\code{variance.standardized}}: ... #' \item \dQuote{\code{variable}}: \code{TRUE} if the feature selected as #' variable, otherwise \code{FALSE} #' \item \dQuote{\code{rank}}: If the feature is selected as variable, then how #' it compares to other variable features with lower ranks as more variable; #' otherwise, \code{NA} #' } #' #' @rdname VST #' @export VST #' #' @keywords internal #' VST <- function( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, ... ) { UseMethod(generic = 'VST', object = data) } Seurat/R/integration.R0000644000176200001440000106163214744463014014404 0ustar liggesusers#' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Find integration anchors #' #' Find a set of anchors between a list of \code{\link{Seurat}} objects. #' These anchors can later be used to integrate the objects using the #' \code{\link{IntegrateData}} function. #' #' The main steps of this procedure are outlined below. For a more detailed #' description of the methodology, please see Stuart, Butler, et al Cell 2019: #' \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} #' #' First, determine anchor.features if not explicitly specified using #' \code{\link{SelectIntegrationFeatures}}. Then for all pairwise combinations #' of reference and query datasets: #' #' \itemize{ #' \item{Perform dimensional reduction on the dataset pair as specified via #' the \code{reduction} parameter. If \code{l2.norm} is set to \code{TRUE}, #' perform L2 normalization of the embedding vectors.} #' \item{Identify anchors - pairs of cells from each dataset #' that are contained within each other's neighborhoods (also known as mutual #' nearest neighbors).} #' \item{Filter low confidence anchors to ensure anchors in the low dimension #' space are in broad agreement with the high dimensional measurements. This #' is done by looking at the neighbors of each query cell in the reference #' dataset using \code{max.features} to define this space. If the reference #' cell isn't found within the first \code{k.filter} neighbors, remove the #' anchor.} #' \item{Assign each remaining anchor a score. For each anchor cell, determine #' the nearest \code{k.score} anchors within its own dataset and within its #' pair's dataset. Based on these neighborhoods, construct an overall neighbor #' graph and then compute the shared neighbor overlap between anchor and query #' cells (analogous to an SNN graph). We use the 0.01 and 0.90 quantiles on #' these scores to dampen outlier effects and rescale to range between 0-1.} #' } #' #' @param object.list A list of \code{\link{Seurat}} objects between which to #' find anchors for downstream integration. #' @param assay A vector of assay names specifying which assay to use when #' constructing anchors. If NULL, the current default assay for each object is #' used. #' @param reference A vector specifying the object/s to be used as a reference #' during integration. If NULL (default), all pairwise anchors are found (no #' reference/s). If not NULL, the corresponding objects in \code{object.list} #' will be used as references. When using a set of specified references, anchors #' are first found between each query and each reference. The references are #' then integrated through pairwise integration. Each query is then mapped to #' the integrated reference. #' @param anchor.features Can be either: #' \itemize{ #' \item{A numeric value. This will call \code{\link{SelectIntegrationFeatures}} #' to select the provided number of features to be used in anchor finding} #' \item{A vector of features to be used as input to the anchor finding process} #' } #' @param scale Whether or not to scale the features provided. Only set to FALSE #' if you have previously scaled the features you want to use for each object in #' the object.list #' @param normalization.method Name of normalization method used: LogNormalize #' or SCT #' @param sct.clip.range Numeric of length two specifying the min and max values #' the Pearson residual will be clipped to #' @param reduction Dimensional reduction to perform when finding anchors. Can #' be one of: #' \itemize{ #' \item{cca: Canonical correlation analysis} #' \item{rpca: Reciprocal PCA} #' \item{jpca: Joint PCA} #' \item{rlsi: Reciprocal LSI} #' } #' @param l2.norm Perform L2 normalization on the CCA cell embeddings after #' dimensional reduction #' @param dims Which dimensions to use from the CCA to specify the neighbor #' search space #' @param k.anchor How many neighbors (k) to use when picking anchors #' @param k.filter How many neighbors (k) to use when filtering anchors #' @param k.score How many neighbors (k) to use when scoring anchors #' @param max.features The maximum number of features to use when specifying the #' neighborhood search space in the anchor filtering #' @param nn.method Method for nearest neighbor finding. Options include: rann, #' annoy #' @param n.trees More trees gives higher precision when using annoy approximate #' nearest neighbor search #' @param eps Error bound on the neighbor finding algorithm (from RANN/Annoy) #' @param verbose Print progress bars and output #' #' @return Returns an \code{\link{AnchorSet}} object that can be used as input to #' \code{\link{IntegrateData}}. #' #' @references Stuart T, Butler A, et al. Comprehensive Integration of #' Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031} #' #' @importFrom pbapply pblapply #' @importFrom future.apply future_lapply #' @importFrom future nbrOfWorkers #' #' @export #' @concept integration #' #' @examples #' \dontrun{ #' # to install the SeuratData package see https://github.com/satijalab/seurat-data #' library(SeuratData) #' data("panc8") #' #' # panc8 is a merged Seurat object containing 8 separate pancreas datasets #' # split the object by dataset #' pancreas.list <- SplitObject(panc8, split.by = "tech") #' #' # perform standard preprocessing on each object #' for (i in 1:length(pancreas.list)) { #' pancreas.list[[i]] <- NormalizeData(pancreas.list[[i]], verbose = FALSE) #' pancreas.list[[i]] <- FindVariableFeatures( #' pancreas.list[[i]], selection.method = "vst", #' nfeatures = 2000, verbose = FALSE #' ) #' } #' #' # find anchors #' anchors <- FindIntegrationAnchors(object.list = pancreas.list) #' #' # integrate data #' integrated <- IntegrateData(anchorset = anchors) #' } #' FindIntegrationAnchors <- function( object.list = NULL, assay = NULL, reference = NULL, anchor.features = 2000, scale = TRUE, normalization.method = c("LogNormalize", "SCT"), sct.clip.range = NULL, reduction = c("cca", "rpca", "jpca", "rlsi"), l2.norm = TRUE, dims = 1:30, k.anchor = 5, k.filter = 200, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, eps = 0, verbose = TRUE ) { normalization.method <- match.arg(arg = normalization.method) reduction <- match.arg(arg = reduction) if (reduction == "rpca") { reduction <- "pca" } if (reduction == "rlsi") { reduction <- "lsi" if (normalization.method == "SCT") { warning("Requested normalization method 'SCT' is not applicable for LSI") normalization.method <- "LogNormalize" } scale <- FALSE k.filter <- NA } my.lapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pblapply, no = future_lapply ) object.ncells <- sapply(X = object.list, FUN = function(x) dim(x = x)[2]) if (any(object.ncells <= max(dims))) { bad.obs <- which(x = object.ncells <= max(dims)) stop("Max dimension too large: objects ", paste(bad.obs, collapse = ", "), " contain fewer than ", max(dims), " cells. \n Please specify a", " maximum dimensions that is less than the number of cells in any ", "object (", min(object.ncells), ").") } if (!is.null(x = assay)) { if (length(x = assay) != length(x = object.list)) { stop("If specifying the assay, please specify one assay per object in the object.list") } object.list <- sapply( X = 1:length(x = object.list), FUN = function(x) { DefaultAssay(object = object.list[[x]]) <- assay[x] return(object.list[[x]]) } ) } else { assay <- sapply(X = object.list, FUN = DefaultAssay) } # check tool object.list <- lapply( X = object.list, FUN = function (obj) { slot(object = obj, name = "tools")$Integration <- NULL return(obj) }) object.list <- CheckDuplicateCellNames(object.list = object.list) slot <- "data" if (reduction == "lsi") { all.rownames <- lapply(X = object.list, FUN = rownames) anchor.features <- Reduce(f = intersect, x = all.rownames) } if (normalization.method == "SCT") { slot <- "scale.data" scale <- FALSE if (is.numeric(x = anchor.features)) { stop("Please specify the anchor.features to be used. The expected ", "workflow for integratinge assays produced by SCTransform is ", "SelectIntegrationFeatures -> PrepSCTIntegration -> ", "FindIntegrationAnchors.") } sct.check <- sapply( X = 1:length(x = object.list), FUN = function(x) { sct.cmd <- grep( pattern = 'PrepSCTIntegration', x = Command(object = object.list[[x]]), value = TRUE ) # check assay has gone through PrepSCTIntegration if (!any(grepl(pattern = "PrepSCTIntegration", x = Command(object = object.list[[x]]))) || Command(object = object.list[[x]], command = sct.cmd, value = "assay") != assay[x]) { stop("Object ", x, " assay - ", assay[x], " has not been processed ", "by PrepSCTIntegration. Please run PrepSCTIntegration prior to ", "FindIntegrationAnchors if using assays generated by SCTransform.", call. = FALSE) } # check that the correct features are being used if (all(Command(object = object.list[[x]], command = sct.cmd, value = "anchor.features") != anchor.features)) { stop("Object ", x, " assay - ", assay[x], " was processed using a ", "different feature set than in PrepSCTIntegration. Please rerun ", "PrepSCTIntegration with the same anchor.features for all objects in ", "the object.list.", call. = FALSE) } } ) } if (is.numeric(x = anchor.features) && normalization.method != "SCT") { if (verbose) { message("Computing ", anchor.features, " integration features") } anchor.features <- SelectIntegrationFeatures( object.list = object.list, nfeatures = anchor.features, assay = assay ) } if (scale) { if (verbose) { message("Scaling features for provided objects") } object.list <- my.lapply( X = object.list, FUN = function(object) { ScaleData(object = object, features = anchor.features, verbose = FALSE) } ) } nn.reduction <- reduction # if using pca or lsi, only need to compute the internal neighborhood structure once # for each dataset internal.neighbors <- list() if (nn.reduction %in% c("pca", "lsi","jpca")) { if (nn.reduction == 'jpca') { nn.reduction <- 'joint.pca' reduction <- 'joint.pca' } k.filter <- NA if (verbose) { message("Computing within dataset neighborhoods") } k.neighbor <- max(k.anchor, k.score) internal.neighbors <- my.lapply( X = 1:length(x = object.list), FUN = function(x) { NNHelper( data = Embeddings(object = object.list[[x]][[nn.reduction]])[, dims], k = k.neighbor + 1, method = nn.method, n.trees = n.trees, eps = eps ) } ) } # determine pairwise combinations combinations <- expand.grid(1:length(x = object.list), 1:length(x = object.list)) combinations <- combinations[combinations$Var1 < combinations$Var2, , drop = FALSE] # determine the proper offsets for indexing anchors objects.ncell <- sapply(X = object.list, FUN = ncol) offsets <- as.vector(x = cumsum(x = c(0, objects.ncell)))[1:length(x = object.list)] if (is.null(x = reference)) { # case for all pairwise, leave the combinations matrix the same if (verbose) { message("Finding all pairwise anchors") } } else { reference <- unique(x = sort(x = reference)) if (max(reference) > length(x = object.list)) { stop('Error: requested reference object ', max(reference), " but only ", length(x = object.list), " objects provided") } # modify the combinations matrix to retain only R-R and R-Q comparisons if (verbose) { message("Finding anchors between all query and reference datasets") ok.rows <- (combinations$Var1 %in% reference) | (combinations$Var2 %in% reference) combinations <- combinations[ok.rows, ] } } # determine all anchors anchoring.fxn <- function(row) { i <- combinations[row, 1] j <- combinations[row, 2] object.1 <- DietSeurat( object = object.list[[i]], assays = assay[i], features = anchor.features, counts = FALSE, scale.data = TRUE, dimreducs = reduction ) object.2 <- DietSeurat( object = object.list[[j]], assays = assay[j], features = anchor.features, counts = FALSE, scale.data = TRUE, dimreducs = reduction ) # suppress key duplication warning suppressWarnings(object.1[["ToIntegrate"]] <- object.1[[assay[i]]]) DefaultAssay(object = object.1) <- "ToIntegrate" if (reduction %in% Reductions(object = object.1)) { slot(object = object.1[[reduction]], name = "assay.used") <- "ToIntegrate" } object.1 <- DietSeurat(object = object.1, assays = "ToIntegrate", scale.data = TRUE, dimreducs = reduction) suppressWarnings(object.2[["ToIntegrate"]] <- object.2[[assay[j]]]) DefaultAssay(object = object.2) <- "ToIntegrate" if (reduction %in% Reductions(object = object.2)) { slot(object = object.2[[reduction]], name = "assay.used") <- "ToIntegrate" } object.2 <- DietSeurat(object = object.2, assays = "ToIntegrate", scale.data = TRUE, dimreducs = reduction) object.pair <- switch( EXPR = reduction, 'cca' = { object.pair <- RunCCA( object1 = object.1, object2 = object.2, assay1 = "ToIntegrate", assay2 = "ToIntegrate", features = anchor.features, num.cc = max(dims), renormalize = FALSE, rescale = FALSE, verbose = verbose ) if (l2.norm){ object.pair <- L2Dim(object = object.pair, reduction = reduction) reduction <- paste0(reduction, ".l2") nn.reduction <- reduction } reduction.2 <- character() object.pair }, 'pca' = { object.pair <- ReciprocalProject( object.1 = object.1, object.2 = object.2, reduction = 'pca', projected.name = 'projectedpca', features = anchor.features, do.scale = FALSE, do.center = FALSE, slot = 'scale.data', l2.norm = l2.norm, verbose = verbose ) reduction <- "projectedpca.ref" reduction.2 <- "projectedpca.query" if (l2.norm) { reduction <- paste0(reduction, ".l2") reduction.2 <- paste0(reduction.2, ".l2") } object.pair }, 'lsi' = { object.pair <- ReciprocalProject( object.1 = object.1, object.2 = object.2, reduction = 'lsi', projected.name = 'projectedlsi', features = anchor.features, do.center = TRUE, do.scale = FALSE, slot = 'data', l2.norm = l2.norm, verbose = verbose ) reduction <- "projectedlsi.ref" reduction.2 <- "projectedlsi.query" if (l2.norm) { reduction <- paste0(reduction, ".l2") reduction.2 <- paste0(reduction.2, ".l2") } object.pair }, 'joint.pca' = { object.pair <- merge(x = object.1, y = object.2) reduction.2 <- "joint.pca" object.pair[['joint.pca']] <- CreateDimReducObject( embeddings = rbind(Embeddings(object.1[['joint.pca']]), Embeddings(object.2[['joint.pca']])), loadings = Loadings(object.1[['joint.pca']]), key = 'Joint_', assay = 'ToIntegrate') if (l2.norm) { object.pair <- L2Dim(object = object.pair, reduction = 'joint.pca', new.dr = 'joint.pca.l2', new.key = 'Jl2_' ) reduction <- paste0(reduction, ".l2") reduction.2 <- paste0(reduction.2, ".l2") } object.pair }, stop("Invalid reduction parameter. Please choose either cca, rpca, or rlsi") ) internal.neighbors <- internal.neighbors[c(i, j)] anchors <- FindAnchors( object.pair = object.pair, assay = c("ToIntegrate", "ToIntegrate"), slot = slot, cells1 = colnames(x = object.1), cells2 = colnames(x = object.2), internal.neighbors = internal.neighbors, reduction = reduction, reduction.2 = reduction.2, nn.reduction = nn.reduction, dims = dims, k.anchor = k.anchor, k.filter = k.filter, k.score = k.score, max.features = max.features, nn.method = nn.method, n.trees = n.trees, eps = eps, verbose = verbose ) anchors[, 1] <- anchors[, 1] + offsets[i] anchors[, 2] <- anchors[, 2] + offsets[j] return(anchors) } if (nbrOfWorkers() == 1) { all.anchors <- pblapply( X = 1:nrow(x = combinations), FUN = anchoring.fxn ) } else { all.anchors <- future_lapply( X = 1:nrow(x = combinations), FUN = anchoring.fxn, future.seed = TRUE ) } all.anchors <- do.call(what = 'rbind', args = all.anchors) all.anchors <- rbind(all.anchors, all.anchors[, c(2, 1, 3)]) all.anchors <- AddDatasetID(anchor.df = all.anchors, offsets = offsets, obj.lengths = objects.ncell) command <- LogSeuratCommand(object = object.list[[1]], return.command = TRUE) anchor.set <- new(Class = "IntegrationAnchorSet", object.list = object.list, reference.objects = reference %||% seq_along(object.list), anchors = all.anchors, offsets = offsets, anchor.features = anchor.features, command = command ) return(anchor.set) } # Merge dataset and perform reciprocal SVD projection, adding new dimreducs # for each projection and the merged original SVDs. # # @param object.1 First Seurat object to merge # @param object.2 Second Seurat object to merge # @param reduction Name of DimReduc to use. Must be an SVD-based DimReduc (eg, PCA or LSI) # so that the loadings can be used to project new embeddings. Must be present # in both input objects, with a substantial overlap in the features use to construct # the SVDs. # @param dims dimensions used for rpca # @param projected.name Name to store projected SVDs under (eg, "projectedpca") # @param features Features to use. Will subset the SVD loadings to use these features # before performing projection. Typically uses the anchor.features for integration. # @param do.center Center projected values (subtract mean) # @param do.scale Scale projected values (divide by SD) # @param slot Name of slot to pull data from. Should be scale.data for PCA and data for LSI # @param verbose Display messages # @return Returns a merged Seurat object with two projected SVDs (object.1 -> object.2, object.2 -> object.1) # and a merged SVD (needed for within-dataset neighbors) ReciprocalProject <- function( object.1, object.2, reduction, dims, projected.name, features, do.scale, do.center, slot, l2.norm, verbose = TRUE ) { common.features <- intersect( x = rownames(x = Loadings(object = object.1[[reduction]])), y = rownames(x = Loadings(object = object.2[[reduction]])) ) common.features <- intersect( x = common.features, y = features ) object.pair <- merge(x = object.1, y = object.2, merge.data = TRUE) data.1 <- GetAssayData( object = object.1, slot = slot ) data.2 <- GetAssayData( object = object.2, slot = slot ) proj.1 <- ProjectSVD( reduction = object.2[[reduction]], data = data.1, mode = reduction, features = common.features, do.scale = do.scale, do.center = do.center, use.original.stats = FALSE, verbose = verbose ) proj.2 <- ProjectSVD( reduction = object.1[[reduction]], data = data.2, mode = reduction, features = common.features, do.scale = do.scale, do.center = do.center, use.original.stats = FALSE, verbose = verbose ) # object.1 is ref, and object.2 is query reduction.dr.name.1 <- paste0(projected.name, ".ref") reduction.dr.name.2 <- paste0(projected.name, ".query") object.pair[[reduction.dr.name.1]] <- CreateDimReducObject( embeddings = rbind(Embeddings(object = object.1[[reduction]]), proj.2)[,dims], loadings = Loadings(object = object.1[[reduction]])[,dims], assay = DefaultAssay(object = object.1), key = paste0(projected.name, "ref_") ) object.pair[[reduction.dr.name.2]] <- CreateDimReducObject( embeddings = rbind(proj.1, Embeddings(object = object.2[[reduction]]))[,dims], loadings = Loadings(object = object.2[[reduction]])[,dims], assay = DefaultAssay(object = object.2), key = paste0(projected.name, "query_") ) object.pair[[reduction]] <- CreateDimReducObject( embeddings = rbind( Embeddings(object = object.1[[reduction]]), Embeddings(object = object.2[[reduction]]))[,dims], loadings = Loadings(object = object.1[[reduction]])[,dims], assay = DefaultAssay(object = object.1), key = paste0(projected.name, "_") ) if (l2.norm) { slot(object = object.pair[[reduction.dr.name.1]], name = "cell.embeddings") <- Sweep( x = Embeddings(object = object.pair[[reduction.dr.name.1]]), MARGIN = 2, STATS = apply(X = Embeddings(object = object.pair[[reduction.dr.name.1]]), MARGIN = 2, FUN = sd), FUN = "/" ) slot(object = object.pair[[reduction.dr.name.2]], name = "cell.embeddings") <- Sweep( x = Embeddings(object = object.pair[[reduction.dr.name.2]]), MARGIN = 2, STATS = apply(X = Embeddings(object = object.pair[[reduction.dr.name.2]]), MARGIN = 2, FUN = sd), FUN = "/" ) object.pair <- L2Dim(object = object.pair, reduction = reduction.dr.name.1) object.pair <- L2Dim(object = object.pair, reduction = reduction.dr.name.2) } return(object.pair) } #' Find transfer anchors #' #' Find a set of anchors between a reference and query object. These #' anchors can later be used to transfer data from the reference to #' query object using the \code{\link{TransferData}} object. #' #' The main steps of this procedure are outlined below. For a more detailed #' description of the methodology, please see Stuart, Butler, et al Cell 2019. #' \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} #' #' \itemize{ #' #' \item{Perform dimensional reduction. Exactly what is done here depends on #' the values set for the \code{reduction} and \code{project.query} #' parameters. If \code{reduction = "pcaproject"}, a PCA is performed on #' either the reference (if \code{project.query = FALSE}) or the query (if #' \code{project.query = TRUE}), using the \code{features} specified. The data #' from the other dataset is then projected onto this learned PCA structure. #' If \code{reduction = "cca"}, then CCA is performed on the reference and #' query for this dimensional reduction step. If #' \code{reduction = "lsiproject"}, the stored LSI dimension reduction in the #' reference object is used to project the query dataset onto the reference. #' If \code{l2.norm} is set to \code{TRUE}, perform L2 normalization of the #' embedding vectors.} #' \item{Identify anchors between the reference and query - pairs of cells #' from each dataset that are contained within each other's neighborhoods #' (also known as mutual nearest neighbors).} #' \item{Filter low confidence anchors to ensure anchors in the low dimension #' space are in broad agreement with the high dimensional measurements. This #' is done by looking at the neighbors of each query cell in the reference #' dataset using \code{max.features} to define this space. If the reference #' cell isn't found within the first \code{k.filter} neighbors, remove the #' anchor.} #' \item{Assign each remaining anchor a score. For each anchor cell, determine #' the nearest \code{k.score} anchors within its own dataset and within its #' pair's dataset. Based on these neighborhoods, construct an overall neighbor #' graph and then compute the shared neighbor overlap between anchor and query #' cells (analogous to an SNN graph). We use the 0.01 and 0.90 quantiles on #' these scores to dampen outlier effects and rescale to range between 0-1.} #' } #' #' @param reference \code{\link[SeuratObject]{Seurat}} object to use as the reference #' @param query \code{\link[SeuratObject]{Seurat}} object to use as the query #' @param reference.assay Name of the Assay to use from reference #' @param reference.neighbors Name of the Neighbor to use from the reference. #' Optionally enables reuse of precomputed neighbors. #' @param query.assay Name of the Assay to use from query #' @param reduction Dimensional reduction to perform when finding anchors. #' Options are: #' \itemize{ #' \item{pcaproject: Project the PCA from the reference onto the query. We #' recommend using PCA when reference and query datasets are from scRNA-seq} #' \item{lsiproject: Project the LSI from the reference onto the query. We #' recommend using LSI when reference and query datasets are from scATAC-seq. #' This requires that LSI has been computed for the reference dataset, and the #' same features (eg, peaks or genome bins) are present in both the reference #' and query. See \code{\link[Signac]{RunTFIDF}} and #' \code{\link[Signac]{RunSVD}}} #' \item{rpca: Project the PCA from the reference onto the query, and the PCA #' from the query onto the reference (reciprocal PCA projection).} #' \item{cca: Run a CCA on the reference and query } #' } #' @param reference.reduction Name of dimensional reduction to use from the #' reference if running the pcaproject workflow. Optionally enables reuse of #' precomputed reference dimensional reduction. If NULL (default), use a PCA #' computed on the reference object. #' @param project.query Project the PCA from the query dataset onto the #' reference. Use only in rare cases where the query dataset has a much larger #' cell number, but the reference dataset has a unique assay for transfer. In #' this case, the default features will be set to the variable features of the #' query object that are alos present in the reference. #' @param features Features to use for dimensional reduction. If not specified, #' set as variable features of the reference object which are also present in #' the query. #' @param scale Scale query data. #' @param normalization.method Name of normalization method used: LogNormalize #' or SCT. #' @param recompute.residuals If using SCT as a normalization method, compute #' query Pearson residuals using the reference SCT model parameters. #' @param npcs Number of PCs to compute on reference if reference.reduction is #' not provided. #' @param l2.norm Perform L2 normalization on the cell embeddings after #' dimensional reduction #' @param dims Which dimensions to use from the reduction to specify the #' neighbor search space #' @param k.anchor How many neighbors (k) to use when finding anchors #' @param k.filter How many neighbors (k) to use when filtering anchors. Set to #' NA to turn off filtering. #' @param k.score How many neighbors (k) to use when scoring anchors #' @param max.features The maximum number of features to use when specifying the #' neighborhood search space in the anchor filtering #' @param nn.method Method for nearest neighbor finding. Options include: rann, #' annoy #' @param n.trees More trees gives higher precision when using annoy approximate #' nearest neighbor search #' @param eps Error bound on the neighbor finding algorithm (from #' \code{\link[RANN]{RANN}} or \code{\link[RcppAnnoy]{RcppAnnoy}}) #' @param approx.pca Use truncated singular value decomposition to approximate #' PCA #' @param mapping.score.k Compute and store nearest k query neighbors in the #' AnchorSet object that is returned. You can optionally set this if you plan #' on computing the mapping score and want to enable reuse of some downstream #' neighbor calculations to make the mapping score function more efficient. #' @param verbose Print progress bars and output #' #' @return Returns an \code{AnchorSet} object that can be used as input to #' \code{\link{TransferData}}, \code{\link{IntegrateEmbeddings}} and #' \code{\link{MapQuery}}. The dimension reduction used for finding anchors is #' stored in the \code{AnchorSet} object and can be used for computing anchor #' weights in downstream functions. Note that only the requested dimensions are #' stored in the dimension reduction object in the \code{AnchorSet}. This means #' that if \code{dims=2:20} is used, for example, the dimension of the stored #' reduction is \code{1:19}. #' #' @references Stuart T, Butler A, et al. Comprehensive Integration of #' Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031}; #' #' @export #' @importFrom methods slot slot<- #' @importFrom SeuratObject JoinLayers RenameAssays #' @concept integration #' @examples #' \dontrun{ #' # to install the SeuratData package see https://github.com/satijalab/seurat-data #' library(SeuratData) #' data("pbmc3k") #' #' # for demonstration, split the object into reference and query #' pbmc.reference <- pbmc3k[, 1:1350] #' pbmc.query <- pbmc3k[, 1351:2700] #' #' # perform standard preprocessing on each object #' pbmc.reference <- NormalizeData(pbmc.reference) #' pbmc.reference <- FindVariableFeatures(pbmc.reference) #' pbmc.reference <- ScaleData(pbmc.reference) #' #' pbmc.query <- NormalizeData(pbmc.query) #' pbmc.query <- FindVariableFeatures(pbmc.query) #' pbmc.query <- ScaleData(pbmc.query) #' #' # find anchors #' anchors <- FindTransferAnchors(reference = pbmc.reference, query = pbmc.query) #' #' # transfer labels #' predictions <- TransferData( #' anchorset = anchors, #' refdata = pbmc.reference$seurat_annotations #' ) #' pbmc.query <- AddMetaData(object = pbmc.query, metadata = predictions) #' } #' FindTransferAnchors <- function( reference, query, normalization.method = "LogNormalize", recompute.residuals = TRUE, reference.assay = NULL, reference.neighbors = NULL, query.assay = NULL, reduction = "pcaproject", reference.reduction = NULL, project.query = FALSE, features = NULL, scale = TRUE, npcs = 30, l2.norm = TRUE, dims = 1:30, k.anchor = 5, k.filter = NA, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, eps = 0, approx.pca = TRUE, mapping.score.k = NULL, verbose = TRUE ) { op <- options(Seurat.object.assay.calcn = FALSE) on.exit(expr = options(op), add = TRUE) # input validation ValidateParams_FindTransferAnchors( reference = reference, query = query, normalization.method = normalization.method, recompute.residuals = recompute.residuals, reference.assay = reference.assay, reference.neighbors = reference.neighbors, query.assay = query.assay, reduction = reduction, reference.reduction = reference.reduction, project.query = project.query, features = features, scale = scale, npcs = npcs, l2.norm = l2.norm, dims = dims, k.anchor = k.anchor, k.filter = k.filter, k.score = k.score, max.features = max.features, nn.method = nn.method, n.trees = n.trees, eps = eps, approx.pca = approx.pca, mapping.score.k = mapping.score.k, verbose = verbose ) projected <- ifelse(test = reduction == "pcaproject", yes = TRUE, no = FALSE) reduction.2 <- character() feature.mean <- NULL reference.reduction.init <- reference.reduction if (inherits(x = reference[[reference.assay]], what = 'Assay5')) { if (length(Layers(reference, search = "data")) > 1) { reference[[reference.assay]] <- JoinLayers( reference[[reference.assay]], layers = "data", new = "data") } } if (normalization.method == "SCT") { if (is.null(x = reference.reduction)) { reference <- suppressWarnings(expr = GetResidual( object = reference, assay = reference.assay, features = features, verbose = FALSE )) features <- intersect( x = features, y = rownames(reference[[reference.assay]]$scale.data) ) VariableFeatures(reference) <- features } if (IsSCT(assay = query[[query.assay]])) { query <- suppressWarnings(expr = GetResidual( object = query, assay = query.assay, features = features, verbose = FALSE )) } } # Rename query assay w same name as reference assay if (query.assay != reference.assay) { suppressWarnings(expr = query <- RenameAssays( object = query, assay.name = query.assay, new.assay.name = reference.assay, verbose = FALSE )) DefaultAssay(query) <- reference.assay } # only keep necessary info from objects suppressWarnings( query <- DietSeurat( object = query, assays = reference.assay, dimreducs = reference.reduction, features = features, scale.data = TRUE ) ) # check assay in the reference.reduction if (!is.null(reference.reduction) && slot(object = reference[[reference.reduction]], name = "assay.used") != reference.assay) { warnings("reference assay is diffrent from the assay.used in", reference.reduction) slot(object = reference[[reference.reduction]], name = "assay.used") <- reference.assay } suppressWarnings( reference <- DietSeurat( object = reference, assays = reference.assay, dimreducs = reference.reduction, features = features, scale.data = TRUE ) ) # append query and reference to cell names - mainly to avoid name conflicts query <- RenameCells( object = query, new.names = paste0(Cells(x = query), "_", "query") ) reference <- RenameCells( object = reference, new.names = paste0(Cells(x = reference), "_", "reference") ) # Perform PCA projection if (reduction == 'pcaproject') { if (project.query) { if (is.null(x = reference.reduction)) { reference.reduction <- "pca" if (verbose) { message( "Performing PCA on the provided query using ", length(x = features), " features as input.") } if (normalization.method == "LogNormalize") { query <- ScaleData( object = query, features = features, do.scale = scale, verbose = FALSE ) } query <- RunPCA( object = query, npcs = npcs, reduction.name = reference.reduction, verbose = FALSE, features = features, approx = approx.pca ) } projected.pca <- ProjectCellEmbeddings( reference = query, reduction = reference.reduction, query = reference, scale = scale, dims = dims, feature.mean = feature.mean, verbose = verbose, normalization.method = normalization.method ) orig.embeddings <- Embeddings(object = query[[reference.reduction]])[, dims] orig.loadings <- Loadings(object = query[[reference.reduction]]) } else { if (is.null(x = reference.reduction)) { reference.reduction <- "pca" if (verbose) { message("Performing PCA on the provided reference using ", length(x = features), " features as input.") } if (normalization.method == "LogNormalize") { reference <- ScaleData(object = reference, features = features, do.scale = scale, verbose = FALSE) } reference <- RunPCA( object = reference, npcs = npcs, verbose = FALSE, features = features, approx = approx.pca ) } if (paste0("nCount_", query.assay) %in% colnames(query[[]])) { query_nCount_UMI <- query[[]][, paste0("nCount_", query.assay)] names(x = query_nCount_UMI) <- colnames(x = query) } else { query_nCount_UMI <- NULL } projected.pca <- ProjectCellEmbeddings( reference = reference, reduction = reference.reduction, normalization.method = normalization.method, query = query, scale = scale, dims = dims, nCount_UMI = query_nCount_UMI, feature.mean = feature.mean, verbose = verbose ) orig.embeddings <- Embeddings(object = reference[[reference.reduction]])[, dims] orig.loadings <- Loadings(object = reference[[reference.reduction]]) } combined.pca <- CreateDimReducObject( embeddings = as.matrix(x = rbind(orig.embeddings, projected.pca)), key = "ProjectPC_", assay = reference.assay ) # combined.ob <- suppressWarnings(expr = merge( # x = DietSeurat(object = reference, counts = FALSE), # y = DietSeurat(object = query, counts = FALSE), # )) ref.diet <- DietSeurat(object = reference, counts = FALSE) query.diet <- DietSeurat(object = query, counts = FALSE) counts.list <- list(reference = LayerData(ref.diet[[reference.assay]], layer = "data")) query.data.list <- list() for (i in Layers(object = query.diet[[reference.assay]], search = "data")) { data.layer.name <- gsub(pattern = "data.", replacement = "", x = i) counts.list[[data.layer.name]] <- LayerData(object = query[[reference.assay]], layer = i) } combined.ob <- CreateSeuratObject(counts = counts.list, assay = reference.assay) for (i in Layers(object = combined.ob[[reference.assay]], search = "counts")){ data.layer.name <- gsub(pattern = "counts.", replacement = "data.", x = i) # replace counts. to data. layer.data <- LayerData(object = combined.ob, layer = i) LayerData(object = combined.ob, layer = data.layer.name) <- layer.data # set layer data } colnames(x = orig.loadings) <- paste0("ProjectPC_", 1:ncol(x = orig.loadings)) combined.ob[["pcaproject"]] <- combined.pca Loadings(object = combined.ob[["pcaproject"]], projected = FALSE) <- orig.loadings[, dims] Loadings(object = combined.ob[["pcaproject"]]) <- orig.loadings[, dims] } # Use reciprocal PCA projection in anchor finding if (reduction == "rpca") { # Run PCA on reference and query if (is.null(x = reference.reduction)) { reference.reduction <- "pca" if (verbose) { message("Performing PCA on the provided reference using ", length(x = features), " features as input.") } if (normalization.method == "LogNormalize") { reference <- ScaleData( object = reference, features = features, do.scale = scale, verbose = verbose ) } reference <- RunPCA( object = reference, npcs = npcs, verbose = FALSE, features = features, approx = approx.pca ) } if (verbose) { message("Performing PCA on the provided query using ", length(x = features), " features as input.") } if (normalization.method == "LogNormalize") { query <- ScaleData( object = query, features = features, do.scale = scale, verbose = verbose ) } query <- RunPCA( object = query, npcs = ncol(x = reference[[reference.reduction]]), reduction.name = reference.reduction, verbose = FALSE, features = features, approx = approx.pca ) combined.ob <- ReciprocalProject( object.1 = reference, object.2 = query, reduction = reference.reduction, dims = dims, projected.name = reduction, features = features, do.scale = FALSE, do.center = FALSE, slot = 'scale.data', l2.norm = l2.norm, verbose = verbose ) # pcaproject is used as the weight.matrix in MapQuery projected.pca <- ProjectCellEmbeddings( reference = reference, reduction = reference.reduction, query = query, scale = scale, normalization.method = normalization.method, dims = dims, feature.mean = feature.mean, verbose = verbose ) orig.embeddings <- Embeddings(object = reference[[reference.reduction]])[, dims] orig.loadings <- Loadings(object = reference[[reference.reduction]]) combined.pca <- CreateDimReducObject( embeddings = as.matrix(x = rbind(orig.embeddings, projected.pca)), key = "ProjectPC_", assay = reference.assay ) combined.ob[["pcaproject"]] <- combined.pca colnames(x = orig.loadings) <- paste0("ProjectPC_", 1:ncol(x = orig.loadings)) Loadings(object = combined.ob[["pcaproject"]]) <- orig.loadings[, dims] if (l2.norm) { # L2 norm is done on each projected PCA in ReciprocalProject, so turn it off here # avoids later error as we now have two reductions (rpca.ref and rpca.query) l2.norm <- FALSE reduction <- "rpca.ref.l2" reduction.2 <- "rpca.query.l2" } else { reduction <- "rpca.ref" reduction.2 <- "rpca.query" } if (project.query) { reduction <- gsub(".ref", ".query", reduction) reduction.2 <- gsub(".query", ".ref", reduction.2) } } # Run CCA as dimension reduction to be used in anchor finding if (reduction == 'cca') { if (normalization.method == "LogNormalize") { reference <- ScaleData(object = reference, features = features, do.scale = scale, verbose = FALSE) query <- ScaleData(object = query, features = features, do.scale = scale, verbose = FALSE) } combined.ob <- RunCCA( object1 = reference, object2 = query, features = features, num.cc = max(dims), renormalize = FALSE, rescale = FALSE, verbose = verbose ) slot(object = combined.ob[["cca"]], name = "cell.embeddings") <- Embeddings(combined.ob[["cca"]])[, dims] slot(object = combined.ob[["cca"]], name = "feature.loadings") <- Loadings(combined.ob[["cca"]])[, dims] slot(object = combined.ob[["cca"]], name = "feature.loadings.projected") <- Loadings(object = combined.ob[["cca"]], projected = TRUE)[, dims] } if (reduction == "lsiproject") { if (project.query) { projected.lsi <- ProjectSVD( reduction = query[[reference.reduction]], data = GetAssayData(object = reference, assay = reference.assay, slot = "data"), mode = "lsi", do.center = FALSE, do.scale = FALSE, use.original.stats = FALSE, verbose = verbose ) orig.embeddings <- Embeddings(object = query[[reference.reduction]]) orig.loadings <- Loadings(object = query[[reference.reduction]]) } else { projected.lsi <- ProjectSVD( reduction = reference[[reference.reduction]], data = GetAssayData(object = query, assay = reference.assay, slot = "data"), mode = "lsi", do.center = FALSE, do.scale = FALSE, use.original.stats = FALSE, verbose = verbose ) orig.embeddings <- Embeddings(object = reference[[reference.reduction]]) orig.loadings <- Loadings(object = reference[[reference.reduction]]) } combined.lsi <- CreateDimReducObject( embeddings = as.matrix(x = rbind(orig.embeddings, projected.lsi))[,dims], key = "ProjectLSI_", assay = reference.assay ) combined.ob <- merge( x = DietSeurat(object = reference), y = DietSeurat(object = query) ) combined.ob[["lsiproject"]] <- combined.lsi colnames(x = orig.loadings) <- paste0("ProjectLSI_", 1:ncol(x = orig.loadings)) Loadings(object = combined.ob[["lsiproject"]]) <- orig.loadings[,dims] } if (l2.norm) { combined.ob <- L2Dim(object = combined.ob, reduction = reduction) reduction <- paste0(reduction, ".l2") } precomputed.neighbors <- list(ref.neighbors = NULL, query.neighbors = NULL) nn.idx1 <- NULL nn.idx2 <- NULL # if computing the mapping score later, compute large enough query # neighborhood here to reuse if (!is.null(x = mapping.score.k)) { if (verbose) { message("Finding query neighbors") } k.nn <- max(k.score, k.anchor) query.neighbors <- NNHelper( data = Embeddings(object = combined.ob[[reduction]])[colnames(x = query), ], k = max(mapping.score.k, k.nn + 1), method = nn.method, n.trees = n.trees, cache.index = TRUE ) query.neighbors.sub <- query.neighbors slot(object = query.neighbors.sub, name = "nn.idx") <- slot( object = query.neighbors.sub, name = "nn.idx")[, 1:(k.nn + 1)] slot(object = query.neighbors.sub, name = "nn.dist") <- slot( object = query.neighbors.sub, name = "nn.dist")[, 1:(k.nn + 1)] precomputed.neighbors[["query.neighbors"]] <- query.neighbors.sub nn.idx2 <- Index(object = query.neighbors.sub) } if (!is.null(x = reference.neighbors)) { precomputed.neighbors[["ref.neighbors"]] <- reference[[reference.neighbors]] } else { precomputed.neighbors[["ref.neighbors"]] <- NNHelper( data = Embeddings(combined.ob[[reduction]])[ colnames(x = reference), 1:length(x = dims) ], k = max(k.score, k.anchor) + 1, method = nn.method, cache.index = TRUE ) } nn.idx1 <- Index(object = precomputed.neighbors[["ref.neighbors"]]) anchors <- FindAnchors( object.pair = combined.ob, assay = c(reference.assay, reference.assay), slot = "data", cells1 = colnames(x = reference), cells2 = colnames(x = query), reduction = reduction, reduction.2 = reduction.2, internal.neighbors = precomputed.neighbors, dims = 1:length(x = dims), k.anchor = k.anchor, k.filter = k.filter, k.score = k.score, max.features = max.features, nn.method = nn.method, n.trees = n.trees, nn.idx1 = nn.idx1, nn.idx2 = nn.idx2, eps = eps, projected = projected, verbose = verbose ) reductions <- slot(object = combined.ob, name = "reductions") for (i in unique(x = c(reference.assay))) { dummy.assay <- paste0(i, "DUMMY") suppressWarnings( expr = combined.ob[[dummy.assay]] <- CreateDummyAssay(assay = combined.ob[[i]]) ) DefaultAssay(combined.ob) <- dummy.assay combined.ob[[i]] <- NULL suppressWarnings( expr = combined.ob[[i]] <- combined.ob[[dummy.assay]] ) DefaultAssay(combined.ob) <- i combined.ob[[dummy.assay]] <- NULL } slot(object = combined.ob, name = "reductions") <- reductions command <- LogSeuratCommand(object = combined.ob, return.command = TRUE) slot(command, name = 'params')$reference.reduction <- reference.reduction.init anchor.set <- new( Class = "TransferAnchorSet", object.list = list(combined.ob), reference.cells = colnames(x = reference), query.cells = colnames(x = query), anchors = anchors, anchor.features = features, command = command ) if (!is.null(x = precomputed.neighbors[["query.neighbors"]])) { slot(object = anchor.set, name = "neighbors") <- list( query.neighbors = query.neighbors) } return(anchor.set) } #' Get the predicted identity #' #' Utility function to easily pull out the name of the class with the maximum #' prediction. This is useful if you've set \code{prediction.assay = TRUE} in #' \code{\link{TransferData}} and want to have a vector with the predicted class. #' #' @param object Seurat object #' @param assay Name of the assay holding the predictions #' @param slot Slot of the assay in which the prediction scores are stored #' @param score.filter Return "Unassigned" for any cell with a score less than #' this value #' #' @return Returns a vector of predicted class names #' #' @examples #' \dontrun{ #' prediction.assay <- TransferData(anchorset = anchors, refdata = reference$class) #' query[["predictions"]] <- prediction.assay #' query$predicted.id <- GetTransferPredictions(query) #' } #' @export #' @concept integration #' GetTransferPredictions <- function(object, assay = "predictions", slot = "data", score.filter = 0.75) { dat <- GetAssayData(object[[assay]], slot = slot) predictions <- apply( X = dat, MARGIN = 2, FUN = function(x){ if (x['max'] < score.filter) { "Unassigned" } else { x <- x[-which(x = names(x = x) == "max")] names(x = which.max(x = x)) } } ) return(predictions) } #' Integrate data #' #' Perform dataset integration using a pre-computed \code{\link{AnchorSet}}. #' #' The main steps of this procedure are outlined below. For a more detailed #' description of the methodology, please see Stuart, Butler, et al Cell 2019. #' \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} #' #' For pairwise integration: #' #' \itemize{ #' \item{Construct a weights matrix that defines the association between each #' query cell and each anchor. These weights are computed as 1 - the distance #' between the query cell and the anchor divided by the distance of the query #' cell to the \code{k.weight}th anchor multiplied by the anchor score #' computed in \code{\link{FindIntegrationAnchors}}. We then apply a Gaussian #' kernel width a bandwidth defined by \code{sd.weight} and normalize across #' all \code{k.weight} anchors.} #' \item{Compute the anchor integration matrix as the difference between the #' two expression matrices for every pair of anchor cells} #' \item{Compute the transformation matrix as the product of the integration #' matrix and the weights matrix.} #' \item{Subtract the transformation matrix from the original expression #' matrix.} #' } #' #' For multiple dataset integration, we perform iterative pairwise integration. #' To determine the order of integration (if not specified via #' \code{sample.tree}), we #' \itemize{ #' \item{Define a distance between datasets as the total number of cells in #' the smaller dataset divided by the total number of anchors between the two #' datasets.} #' \item{Compute all pairwise distances between datasets} #' \item{Cluster this distance matrix to determine a guide tree} #' } #' #' #' @param anchorset An \code{\link{AnchorSet}} object generated by #' \code{\link{FindIntegrationAnchors}} #' @param new.assay.name Name for the new assay containing the integrated data #' @param normalization.method Name of normalization method used: LogNormalize #' or SCT #' @param features Vector of features to use when computing the PCA to determine #' the weights. Only set if you want a different set from those used in the #' anchor finding process #' @param features.to.integrate Vector of features to integrate. By default, #' will use the features used in anchor finding. #' @param dims Number of dimensions to use in the anchor weighting procedure #' @param k.weight Number of neighbors to consider when weighting anchors #' @param weight.reduction Dimension reduction to use when calculating anchor #' weights. This can be one of: #' \itemize{ #' \item{A string, specifying the name of a dimension reduction present in #' all objects to be integrated} #' \item{A vector of strings, specifying the name of a dimension reduction to #' use for each object to be integrated} #' \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, #' specifying the object to use for each object in the integration} #' \item{NULL, in which case a new PCA will be calculated and used to #' calculate anchor weights} #' } #' Note that, if specified, the requested dimension reduction will only be used #' for calculating anchor weights in the first merge between reference and #' query, as the merged object will subsequently contain more cells than was in #' query, and weights will need to be calculated for all cells in the object. #' @param sd.weight Controls the bandwidth of the Gaussian kernel for weighting #' @param sample.tree Specify the order of integration. Order of integration #' should be encoded in a matrix, where each row represents one of the pairwise #' integration steps. Negative numbers specify a dataset, positive numbers #' specify the integration results from a given row (the format of the merge #' matrix included in the \code{\link{hclust}} function output). For example: #' `matrix(c(-2, 1, -3, -1), ncol = 2)` gives: #' #' ``` #' [,1] [,2] #' [1,] -2 -3 #' [2,] 1 -1 #' ``` #' #' Which would cause dataset 2 and 3 to be integrated first, then the resulting #' object integrated with dataset 1. #' #' If NULL, the sample tree will be computed automatically. #' @param preserve.order Do not reorder objects based on size for each pairwise #' integration. #' @param eps Error bound on the neighbor finding algorithm (from #' \code{\link[RANN]{RANN}}) #' @param verbose Print progress bars and output #' #' @return Returns a \code{\link[SeuratObject]{Seurat}} object with a new integrated #' \code{\link[SeuratObject]{Assay}}. If \code{normalization.method = "LogNormalize"}, the #' integrated data is returned to the \code{data} slot and can be treated as #' log-normalized, corrected data. If \code{normalization.method = "SCT"}, the #' integrated data is returned to the \code{scale.data} slot and can be treated #' as centered, corrected Pearson residuals. #' #' @references Stuart T, Butler A, et al. Comprehensive Integration of #' Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031} #' #' @export #' @concept integration #' @md #' @examples #' \dontrun{ #' # to install the SeuratData package see https://github.com/satijalab/seurat-data #' library(SeuratData) #' data("panc8") #' #' # panc8 is a merged Seurat object containing 8 separate pancreas datasets #' # split the object by dataset #' pancreas.list <- SplitObject(panc8, split.by = "tech") #' #' # perform standard preprocessing on each object #' for (i in 1:length(pancreas.list)) { #' pancreas.list[[i]] <- NormalizeData(pancreas.list[[i]], verbose = FALSE) #' pancreas.list[[i]] <- FindVariableFeatures( #' pancreas.list[[i]], selection.method = "vst", #' nfeatures = 2000, verbose = FALSE #' ) #' } #' #' # find anchors #' anchors <- FindIntegrationAnchors(object.list = pancreas.list) #' #' # integrate data #' integrated <- IntegrateData(anchorset = anchors) #' } #' IntegrateData <- function( anchorset, new.assay.name = "integrated", normalization.method = c("LogNormalize", "SCT"), features = NULL, features.to.integrate = NULL, dims = 1:30, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, eps = 0, verbose = TRUE ) { normalization.method <- match.arg(arg = normalization.method) reference.datasets <- slot(object = anchorset, name = 'reference.objects') object.list <- slot(object = anchorset, name = 'object.list') anchors <- slot(object = anchorset, name = 'anchors') ref <- object.list[reference.datasets] features <- features %||% slot(object = anchorset, name = "anchor.features") unintegrated <- suppressWarnings(expr = merge( x = object.list[[1]], y = object.list[2:length(x = object.list)] )) if (!is.null(x = features.to.integrate)) { features.to.integrate <- intersect( x = features.to.integrate, y = Reduce( f = intersect, x = lapply( X = object.list, FUN = rownames ) ) ) } if (normalization.method == "SCT") { model.list <- list() for (i in 1:length(x = object.list)) { assay <- DefaultAssay(object = object.list[[i]]) if (length(x = setdiff(x = features.to.integrate, y = features)) != 0) { object.list[[i]] <- GetResidual( object = object.list[[i]], features = setdiff(x = features.to.integrate, y = features), verbose = verbose ) } print(i) model.list[[i]] <- slot(object = object.list[[i]][[assay]], name = "SCTModel.list") object.list[[i]][[assay]] <- suppressWarnings(expr = CreateSCTAssayObject( data = GetAssayData( object = object.list[[i]], assay = assay, slot = "scale.data") ) ) } model.list <- unlist(x = model.list) slot(object = anchorset, name = "object.list") <- object.list } # perform pairwise integration of reference objects reference.integrated <- PairwiseIntegrateReference( anchorset = anchorset, new.assay.name = new.assay.name, normalization.method = normalization.method, features = features, features.to.integrate = features.to.integrate, dims = dims, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, sample.tree = sample.tree, preserve.order = preserve.order, eps = eps, verbose = verbose ) # set SCT model if (normalization.method == "SCT") { if (is.null(x = Tool(object = reference.integrated, slot = "Integration"))) { reference.sample <- slot(object = anchorset, name = "reference.objects") } else { reference.sample <- SampleIntegrationOrder( tree = slot( object = reference.integrated, name = "tools" )$Integration@sample.tree )[1] } reference.cells <- Cells(x = object.list[[reference.sample]]) reference.model <- NULL if (length(x = model.list) > 0) { reference.model <- sapply(X = model.list, FUN = function(model) { reference.check <- FALSE model.cells <- Cells(x = model) if (length(x = model.cells) > 0 & length(x = setdiff(x = model.cells, y = reference.cells)) == 0) { reference.check <- TRUE } return(reference.check) } ) reference.model <- model.list[[which(reference.model)]] } } if (length(x = reference.datasets) == length(x = object.list)) { if (normalization.method == "SCT") { reference.integrated[[new.assay.name]] <- CreateSCTAssayObject( data = GetAssayData(object = reference.integrated, assay = new.assay.name, slot = "data"), scale.data = ScaleData( object = GetAssayData(object = reference.integrated, assay = new.assay.name, slot = "scale.data"), do.scale = FALSE, do.center = TRUE, verbose = FALSE), SCTModel.list = reference.model ) levels(x = reference.integrated[[new.assay.name]]) <- "refmodel" reference.integrated[[assay]] <- unintegrated[[assay]] } DefaultAssay(object = reference.integrated) <- new.assay.name VariableFeatures(object = reference.integrated) <- features reference.integrated[["FindIntegrationAnchors"]] <- slot(object = anchorset, name = "command") reference.integrated <- suppressWarnings(LogSeuratCommand(object = reference.integrated)) return(reference.integrated) } else { active.assay <- DefaultAssay(object = ref[[1]]) reference.integrated[[active.assay]] <- NULL reference.integrated[[active.assay]] <- CreateAssayObject( data = GetAssayData( object = reference.integrated[[new.assay.name]], slot = 'data' ), check.matrix = FALSE ) DefaultAssay(object = reference.integrated) <- active.assay reference.integrated[[new.assay.name]] <- NULL VariableFeatures(object = reference.integrated) <- features # Extract the query objects (if any) and map to reference integrated.data <- MapQueryData( anchorset = anchorset, reference = reference.integrated, new.assay.name = new.assay.name, normalization.method = normalization.method, features = features, features.to.integrate = features.to.integrate, dims = dims, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, preserve.order = preserve.order, eps = eps, verbose = verbose ) # Construct final assay object integrated.assay <- CreateAssayObject( data = integrated.data, check.matrix = FALSE ) if (normalization.method == "SCT") { integrated.assay <- CreateSCTAssayObject( data = integrated.data, scale.data = ScaleData( object = integrated.data, do.scale = FALSE, do.center = TRUE, verbose = FALSE), SCTModel.list = reference.model ) levels(x = integrated.assay) <- "refmodel" } unintegrated[[new.assay.name]] <- integrated.assay unintegrated <- SetIntegrationData( object = unintegrated, integration.name = "Integration", slot = "anchors", new.data = anchors ) if (!is.null(x = Tool(object = reference.integrated, slot = "Integration"))) { sample.tree <- GetIntegrationData( object = reference.integrated, integration.name = "Integration", slot = "sample.tree" ) } unintegrated <- SetIntegrationData( object = unintegrated, integration.name = "Integration", slot = "sample.tree", new.data = sample.tree ) DefaultAssay(object = unintegrated) <- new.assay.name VariableFeatures(object = unintegrated) <- features unintegrated[["FindIntegrationAnchors"]] <- slot(object = anchorset, name = "command") unintegrated <- suppressWarnings(LogSeuratCommand(object = unintegrated)) return(unintegrated) } } #' @inheritParams IntegrateData #' #' @rdname IntegrateEmbeddings #' @concept integration #' @export #' @method IntegrateEmbeddings IntegrationAnchorSet #' IntegrateEmbeddings.IntegrationAnchorSet <- function( anchorset, new.reduction.name = "integrated_dr", reductions = NULL, dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) { CheckDots(...) reference.datasets <- slot(object = anchorset, name = 'reference.objects') object.list <- slot(object = anchorset, name = 'object.list') anchors <- slot(object = anchorset, name = 'anchors') reductions <- reductions %||% slot( object = anchorset, name = 'weight.reduction' ) ValidateParams_IntegrateEmbeddings_IntegrationAnchors( anchorset = anchorset, object.list = object.list, reductions = reductions, dims.to.integrate = dims.to.integrate, k.weight = k.weight, weight.reduction = weight.reduction, sample.tree = sample.tree ) unintegrated <- merge( x = object.list[[1]], y = object.list[2:length(x = object.list)] ) # make DimReducs into Assays temporarily intdr.assay <- DefaultAssay(object = reductions) int.assay <- DefaultAssay(object = object.list[[1]]) dims.names <- paste0("drtointegrate-", dims.to.integrate) # cell.names.map <- Cells(x = unintegrated) cell.names.map <- colnames(x = unintegrated) names(x = cell.names.map) <- make.unique(names = unname(obj = do.call( what = c, args = lapply(X = object.list, FUN = colnames))) ) for (i in 1:length(x = object.list)) { embeddings <- t(x = Embeddings(object = reductions)[cell.names.map[Cells(x = object.list[[i]])], dims.to.integrate]) rownames(x = embeddings) <- dims.names fake.assay <- suppressWarnings( expr = CreateAssayObject( data = embeddings, check.matrix = FALSE ) ) object.list[[i]][['drtointegrate']] <- fake.assay DefaultAssay(object = object.list[[i]]) <- "drtointegrate" } slot(object = anchorset, name = "object.list") <- object.list new.reduction.name.safe <- gsub(pattern = "_", replacement = "", x = new.reduction.name) new.reduction.name.safe <- gsub(pattern = "[.]", replacement = "", x = new.reduction.name.safe) reference.integrated <- PairwiseIntegrateReference( anchorset = anchorset, new.assay.name = new.reduction.name.safe, normalization.method = "LogNormalize", features = dims.names, features.to.integrate = dims.names, dims = NULL, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, sample.tree = sample.tree, preserve.order = preserve.order, verbose = verbose ) if (length(x = reference.datasets) == length(x = object.list)) { reference.dr <- CreateDimReducObject( embeddings = as.matrix(x = t(GetAssayData( object = reference.integrated[[new.reduction.name.safe]] ))), assay = intdr.assay, loadings = Loadings(object = reductions)[,dims.to.integrate], key = paste0(new.reduction.name.safe, "_") ) DefaultAssay(object = reference.integrated) <- int.assay reference.integrated[["drtointegrate"]] <- NULL reference.integrated[[new.reduction.name.safe]] <- NULL reference.integrated[[new.reduction.name]] <- reference.dr return(reference.integrated) } active.assay <- DefaultAssay(object = object.list[reference.datasets][[1]]) reference.integrated[[active.assay]] <- NULL reference.integrated[[active.assay]] <- CreateAssayObject( data = GetAssayData( object = reference.integrated[[new.reduction.name.safe]], slot = 'data' ) ) DefaultAssay(object = reference.integrated) <- active.assay reference.integrated[[new.reduction.name.safe]] <- NULL VariableFeatures(object = reference.integrated) <- dims.names # Extract the query objects (if any) and map to reference integrated.data <- MapQueryData( anchorset = anchorset, reference = reference.integrated, new.assay.name = new.reduction.name.safe, normalization.method = "LogNormalize", features = dims.names, features.to.integrate = dims.names, dims = NULL, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, preserve.order = preserve.order, verbose = verbose ) suppressWarnings(expr = unintegrated[[new.reduction.name]] <- CreateDimReducObject( embeddings = as.matrix(x = t(x = integrated.data)), assay = intdr.assay, loadings = Loadings(object = reductions), key = paste0(new.reduction.name.safe, "_") )) unintegrated <- SetIntegrationData( object = unintegrated, integration.name = "Integration", slot = "anchors", new.data = anchors ) if (!is.null(x = Tool(object = reference.integrated, slot = "Integration"))) { sample.tree <- GetIntegrationData( object = reference.integrated, integration.name = "Integration", slot = "sample.tree" ) } unintegrated <- SetIntegrationData( object = unintegrated, integration.name = "Integration", slot = "sample.tree", new.data = sample.tree ) unintegrated[["FindIntegrationAnchors"]] <- slot(object = anchorset, name = "command") suppressWarnings(unintegrated <- LogSeuratCommand(object = unintegrated)) return(unintegrated) } #' @param reference Reference object used in anchorset construction #' @param query Query object used in anchorset construction #' @param query.assay Name of the Assay to use from query #' @param reuse.weights.matrix Can be used in conjunction with the store.weights #' parameter in TransferData to reuse a precomputed weights matrix. #' #' @rdname IntegrateEmbeddings #' @concept integration #' @export #' @method IntegrateEmbeddings TransferAnchorSet #' IntegrateEmbeddings.TransferAnchorSet <- function( anchorset, reference, query, query.assay = NULL, new.reduction.name = "integrated_dr", reductions = 'pcaproject', dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, reuse.weights.matrix = TRUE, sd.weight = 1, preserve.order = FALSE, verbose = TRUE, ... ) { CheckDots(...) combined.object <- slot(object = anchorset, name = 'object.list')[[1]] anchors <- slot(object = anchorset, name = 'anchors') weights.matrix <- NULL query.assay <- query.assay %||% DefaultAssay(query) ValidateParams_IntegrateEmbeddings_TransferAnchors( anchorset = anchorset, combined.object = combined.object, reference = reference, query = query, query.assay = query.assay, reductions = reductions, dims.to.integrate = dims.to.integrate, k.weight = k.weight, weight.reduction = weight.reduction, reuse.weights.matrix = reuse.weights.matrix ) object.list <- list(reference, query) # make DimReducs into Assays temporarily intdr.assay <- DefaultAssay(object = object.list[[1]][[reductions[[1]]]]) int.assay <- DefaultAssay(object = object.list[[1]]) dims.names <- paste0("drtointegrate-", dims.to.integrate) for (i in 1:length(x = object.list)) { embeddings <- t(x = Embeddings( object = object.list[[i]], reduction = reductions[[i]] )[ , dims.to.integrate]) rownames(x = embeddings) <- dims.names fake.assay <- suppressWarnings( expr = CreateAssayObject( data = embeddings, check.matrix = FALSE ) ) object.list[[i]][['drtointegrate']] <- fake.assay DefaultAssay(object = object.list[[i]]) <- "drtointegrate" object.list[[i]] <- DietSeurat(object = object.list[[i]], assays = "drtointegrate") } slot(object = anchorset, name = "object.list") <- object.list new.reduction.name.safe <- gsub(pattern = "_", replacement = "", x = new.reduction.name) new.reduction.name.safe <- gsub(pattern = "[.]", replacement = "", x = new.reduction.name) slot(object = anchorset, name = "reference.objects") <- 1 anchors <- as.data.frame(x = anchors) anchors$dataset1 <- 1 anchors$dataset2 <- 2 slot(object = anchorset, name = "anchors") <- anchors integrated.embeddings <- MapQueryData( anchorset = anchorset, reference = object.list[[1]], new.assay.name = new.reduction.name.safe, normalization.method = "LogNormalize", features = dims.names, features.to.integrate = dims.names, dims = NULL, k.weight = k.weight, weight.reduction = weight.reduction, weights.matrix = weights.matrix, no.offset = TRUE, sd.weight = sd.weight, preserve.order = preserve.order, verbose = verbose ) integrated.embeddings <- as.matrix(x = integrated.embeddings) query[[new.reduction.name]] <- CreateDimReducObject( embeddings = t(x = integrated.embeddings[, Cells(x = query[[query.assay]])]), assay = DefaultAssay(object = query[[reductions[1]]]), key = paste0(new.reduction.name.safe, "_") ) query <- RenameCells( object = query, new.names = gsub(pattern = "_query$", replacement = "", x = Cells(x = query)) ) query[[reductions[[1]]]] <- NULL return(query) } #' Integrate embeddings from the integrated sketched.assay #' #' The main steps of this procedure are outlined below. For a more detailed #' description of the methodology, please see Hao, et al Biorxiv 2022: #' \doi{10.1101/2022.02.24.481684} #' #' First learn a atom dictionary representation to reconstruct each cell. #' Then, using this dictionary representation, #' reconstruct the embeddings of each cell from the integrated atoms. #' #' @param object A Seurat object with all cells for one dataset #' @param sketched.assay Assay name for sketched-cell expression (default is 'sketch') #' @param assay Assay name for original expression (default is 'RNA') #' @param features Features used for atomic sketch integration #' @param reduction Dimensional reduction name for batch-corrected embeddings #' in the sketched object (default is 'integrated_dr') #' @param method Methods to construct sketch-cell representation #' for all cells (default is 'sketch'). Can be one of: #' \itemize{ #' \item \dQuote{\code{sketch}}: Use random sketched data slot #' \item \dQuote{\code{data}}: Use data slot #' } #' @param ratio Sketch ratio of data slot when \code{dictionary.method} is set #' to \dQuote{\code{sketch}}; defaults to 0.8 #' @param reduction.name Name to save new reduction as; defaults to #' \code{paste0(reduction, '.orig')} #' @param reduction.key Key for new dimensional reduction; defaults to creating #' one from \code{reduction.name} #' @param layers Names of layers for correction. #' @param sketched.layers Names of sketched layers, defaults to all #' layers of \dQuote{\code{object[[assay]]}} #' @param seed A positive integer. The seed for the random number generator, defaults to 123. #' @param verbose Print progress and message #' #' @return Returns a Seurat object with an integrated dimensional reduction #' #' @importFrom MASS ginv #' @importFrom Matrix t #' #' @export #' @concept integration #' ProjectIntegration <- function( object, sketched.assay = 'sketch', # DefaultAssay(object) assay = 'RNA', reduction = 'integrated_dr', # harmony; rerun UMAP on this features = NULL, # VF from object[[atom.assay]] layers = 'data', reduction.name = NULL, reduction.key = NULL, method = c('sketch', 'data'), ratio = 0.8, sketched.layers = NULL, seed = 123, verbose = TRUE ) { layers <- Layers(object = object[[assay]], search = layers) # Check input and output dimensional reductions sketched.layers <- sketched.layers %||% layers reduction <- match.arg(arg = reduction, choices = Reductions(object = object)) reduction.name <- reduction.name %||% paste0(reduction, '.full') reduction.key <- reduction.key %||% Key(object = reduction.name, quiet = TRUE) if (reduction.name %in% Reductions(object = object)) { warning( "'", reduction.name, "' already exists, overwriting", call. = FALSE, immediate. = TRUE ) } # Check the method being used method <- method[1L] method <- match.arg(arg = method) # Check our layers sketched.assay <- match.arg(arg = sketched.assay, choices = Assays(object = object)) assay <- match.arg(arg = assay, choices = Assays(object = object)) layer.full <- layers layers <- layers %||% intersect( x = DefaultLayer(object[[sketched.assay]]), y = Layers(object[[assay]]) ) if (is.null(x = layer.full)) { sketched.assay.missing <- setdiff(x = layers, DefaultLayer(object = object[[sketched.assay]])) if (length(x = sketched.assay.missing) == length(x = layers)) { stop("None of the requested layers are present in the sketched.assay") } else if (length(x = sketched.assay.missing)) { warning( length(x = sketched.assay.missing), " layers missing from the sketched.assay", call. = FALSE, immediate. = TRUE ) layers <- intersect(x = layers, y = DefaultLayer(object = object[[sketched.assay]])) } } # check layers layers.missing <- setdiff(layers, Layers(object = object[[assay]])) if (length(x = layers.missing)) { stop('layer ', layers.missing[1L], ' are not present in ', assay, " assay") } # check features features <- features %||% VariableFeatures(object = object[[sketched.assay]]) # TODO: see if we can handle missing features with `union` features.atom <- Reduce( f = intersect, x = lapply( X = sketched.layers, FUN = function(lyr) { return(Features(x = object[[sketched.assay]], layer = lyr)) } ) ) features <- intersect(x = features, y = features.atom) if (length(x = features) == 0) { stop('Features are not found. Please check VariableFeatures(object[[sketched.assay]]) ', 'or set features in ProjectIntegration') } ncells <- c( 0, sapply( X = layers, FUN = function(lyr) { return(length(x = Cells(x = object[[assay]], layer = lyr))) } ) ) if (length(sketched.layers) == 1) { sketched.layers <- rep(sketched.layers, length(layers)) } sketch.matrix <- switch( EXPR = method, data = { R = as.sparse( x = diag( x = length( x = features) ) ) R }, sketch = { R <- FeatureSketch(features = features, ratio = ratio, seed = seed ) R } ) emb.list <- list() cells.list <- list() for (i in seq_along(along.with = layers)) { if (length(unique(sketched.layers)) == length(layers)) { cells.sketch <- Cells(x = object[[sketched.assay]], layer = sketched.layers[i]) } else if (length(unique(sketched.layers)) == 1) { cells.sketch <- intersect(Cells(x = object[[sketched.assay]][[sketched.layers[[1]]]]), Cells(object[[assay]][[layers[i] ]] )) } if (isTRUE(x = verbose)) { message( length(x = cells.sketch), ' atomic cells identified in the sketched.assay' ) message("Correcting embeddings") } emb <- UnSketchEmbeddings( atom.data = LayerData( object = object[[sketched.assay]], layer = layers[i], features = features ), atom.cells = cells.sketch, orig.data = LayerData( object = object[[assay]], layer = layers[i], features = features ), embeddings = Embeddings(object = object[[reduction]]), sketch.matrix = sketch.matrix) emb.list[[i]] <- emb cells.list[[i]] <- colnames(x = emb) } emb.all <- t(x = matrix( data = unlist(emb.list), nrow = ncol(x = object[[reduction]]), ncol = length(unlist(cells.list)))) rownames(emb.all) <- unlist(cells.list) emb.all <- emb.all[colnames(object[[assay]]), ] object[[reduction.name]] <- CreateDimReducObject( embeddings = emb.all, loadings = Loadings(object = object[[reduction]]), key = reduction.key, assay = assay ) CheckGC() return(object) } #' Calculate the local structure preservation metric #' #' Calculates a metric that describes how well the local structure of each group #' prior to integration is preserved after integration. This procedure works as #' follows: For each group, compute a PCA, compute the top num.neighbors in pca #' space, compute the top num.neighbors in corrected pca space, compute the #' size of the intersection of those two sets of neighbors. #' Return the average over all groups. #' #' @param object Seurat object #' @param grouping.var Grouping variable #' @param idents Optionally specify a set of idents to compute metric for #' @param neighbors Number of neighbors to compute in pca/corrected pca space #' @param reduction Dimensional reduction to use for corrected space #' @param reduced.dims Number of reduced dimensions to use #' @param orig.dims Number of PCs to use in original space #' @param verbose Display progress bar #' #' @return Returns the average preservation metric #' #' @importFrom RANN nn2 #' @importFrom utils txtProgressBar setTxtProgressBar #' #' @export #' @concept integration #' LocalStruct <- function( object, grouping.var, idents = NULL, neighbors = 100, reduction = "pca", reduced.dims = 1:10, orig.dims = 1:10, verbose = TRUE ) { if (is.null(x = idents)) { cells.use <- colnames(x = object) } else { cells.use <- WhichCells(object = object, idents = idents) } Idents(object = object) <- grouping.var local.struct <- list() ob.list <- SplitObject(object = object, split.by = grouping.var) if (verbose) { pb <- txtProgressBar( min = 1, max = length(x = ob.list), style = 3, file = stderr() ) } embeddings <- Embeddings(object = object[[reduction]])[, reduced.dims] for (i in 1:length(x = ob.list)) { ob <- ob.list[[i]] ob <- FindVariableFeatures( object = ob, verbose = FALSE, selection.method = "dispersion", nfeatures = 2000 ) ob <- ScaleData( object = ob, features = VariableFeatures(object = ob), verbose = FALSE ) ob <- RunPCA( object = ob, features = VariableFeatures(object = ob), verbose = FALSE, npcs = max(orig.dims) ) ob.cells <- intersect(x = cells.use, y = colnames(x = ob)) if (length(x = ob.cells) == 0) next nn.corrected <- nn2( data = embeddings[colnames(x = ob), ], query = embeddings[ob.cells, ], k = neighbors )$nn.idx nn.orig <- nn2( data = Embeddings(object = ob[["pca"]])[, orig.dims], query = Embeddings(object = ob[["pca"]])[ob.cells, orig.dims], k = neighbors )$nn.idx local.struct[[i]] <- sapply(X = 1:nrow(x = nn.orig), FUN = function(x) { length(x = intersect(x = nn.orig[x, ], y = nn.corrected[x, ])) / neighbors }) if (verbose) { setTxtProgressBar(pb = pb, value = i) } } names(x = local.struct) <- names(x = ob.list) return(local.struct) } #' Map query cells to a reference #' #' This is a convenience wrapper function around the following three functions #' that are often run together when mapping query data to a reference: #' \code{\link{TransferData}}, \code{\link{IntegrateEmbeddings}}, #' \code{\link{ProjectUMAP}}. Note that by default, the \code{weight.reduction} #' parameter for all functions will be set to the dimension reduction method #' used in the \code{\link{FindTransferAnchors}} function call used to construct #' the anchor object, and the \code{dims} parameter will be the same dimensions #' used to find anchors. #' #' @inheritParams IntegrateEmbeddings #' @inheritParams TransferData #' @inheritParams ProjectUMAP #' @param store.weights Determine if the weight and anchor matrices are stored. #' @param transferdata.args A named list of additional arguments to #' \code{\link{TransferData}} #' @param integrateembeddings.args A named list of additional arguments to #' \code{\link{IntegrateEmbeddings}} #' @param projectumap.args A named list of additional arguments to #' \code{\link{ProjectUMAP}} #' #' @return Returns a modified query Seurat object containing:#' #' \itemize{ #' \item{New Assays corresponding to the features transferred and/or their #' corresponding prediction scores from \code{\link{TransferData}}} #' \item{An integrated reduction from \code{\link{IntegrateEmbeddings}}} #' \item{A projected UMAP reduction of the query cells projected into the #' reference UMAP using \code{\link{ProjectUMAP}}} #' } #' #' @importFrom rlang exec #' #' @export #' @concept integration #' MapQuery <- function( anchorset, query, reference, refdata = NULL, new.reduction.name = NULL, reference.reduction = NULL, reference.dims = NULL, query.dims = NULL, store.weights = FALSE, reduction.model = NULL, transferdata.args = list(), integrateembeddings.args = list(), projectumap.args = list(), verbose = TRUE ) { transfer.reduction <- slot(object = anchorset, name = "command")$reduction if (DefaultAssay(anchorset@object.list[[1]]) %in% Assays(reference)) { DefaultAssay(reference) <- DefaultAssay(anchorset@object.list[[1]]) } else { stop('The assay used to create the anchorset does not match any', 'of the assays in the reference object.') } # determine anchor type if (grepl(pattern = "pca", x = transfer.reduction)) { anchor.reduction <- "pcaproject" # check if the anchorset can be used for mapping if (is.null(x = slot(object = anchorset, name = "command")$reference.reduction)) { stop('The reference.reduction parameter was not set when running ', 'FindTransferAnchors, so the resulting AnchorSet object cannot be used ', 'in the MapQuery function.') } } else if (grepl(pattern = "cca", x = transfer.reduction)) { anchor.reduction <- "cca" ref.cca.embedding <- Embeddings( slot(object = anchorset, name = "object.list")[[1]][["cca"]] )[slot(object = anchorset, name = "reference.cells"), ] rownames(x = ref.cca.embedding) <- gsub( pattern = "_reference", replacement = "", x = rownames(x = ref.cca.embedding) ) query.cca.embedding <- Embeddings( slot(object = anchorset, name = "object.list")[[1]][["cca"]] )[slot(object = anchorset, name = "query.cells"), ] rownames(x = query.cca.embedding) <- gsub( pattern = "_query", replacement = "", x = rownames(x = query.cca.embedding) ) reference[["cca"]] <- CreateDimReducObject( embeddings = ref.cca.embedding, key = "CCA_", assay = DefaultAssay(reference) ) query[["cca"]] <- CreateDimReducObject( embeddings = query.cca.embedding, key = "CCA_", assay = DefaultAssay(query) ) reference.reduction <- new.reduction.name <- "cca" reference.dims <- query.dims <- 1:ncol(x = ref.cca.embedding) } else if (grepl(pattern = "lsi", x = transfer.reduction)) { anchor.reduction <- "lsiproject" } else if (grepl(pattern = "direct", x = transfer.reduction)) { anchor.reduction <- paste0( slot(object = anchorset, name = "command")$bridge.assay.name, ".reduc" ) ref.reduction.emb <- Embeddings( object = slot( object = anchorset, name = "object.list" )[[1]][[anchor.reduction]])[ slot(object = anchorset, name = "reference.cells"),] rownames(ref.reduction.emb) <- gsub( pattern = "_reference", replacement = "", x = rownames(ref.reduction.emb) ) reference[[anchor.reduction]] <- CreateDimReducObject( embeddings = ref.reduction.emb, key = "L_", assay = DefaultAssay(reference) ) } else { stop("unkown type of anchors") } reference.reduction <- reference.reduction %||% slot(object = anchorset, name = "command")$reference.reduction %||% anchor.reduction new.reduction.name <- new.reduction.name %||% paste0("ref.", reference.reduction) # checking TransferData parameters td.badargs <- names(x = transferdata.args)[!names(x = transferdata.args) %in% names(x = formals(fun = TransferData))] if (length(x = td.badargs) > 0) { warning("The following arguments in transferdata.args are not valid: ", paste(td.badargs, collapse = ", "), immediate. = TRUE, call. = FALSE) } transferdata.args <- transferdata.args[names(x = transferdata.args) %in% names(x = formals(fun = TransferData))] transferdata.args$weight.reduction <- transferdata.args$weight.reduction %||% anchor.reduction # checking IntegrateEmbeddings parameters ie.badargs <- names(x = integrateembeddings.args)[!names(x = integrateembeddings.args) %in% names(x = formals(fun = IntegrateEmbeddings.TransferAnchorSet))] if (length(x = ie.badargs) > 0) { warning("The following arguments in integrateembeddings.args are not valid: ", paste(ie.badargs, collapse = ", "), immediate. = TRUE, call. = FALSE) } integrateembeddings.args <- integrateembeddings.args[names(x = integrateembeddings.args) %in% names(x = formals(fun = IntegrateEmbeddings.TransferAnchorSet))] integrateembeddings.args$reductions <- integrateembeddings.args$reductions %||% anchor.reduction integrateembeddings.args$weight.reduction <- integrateembeddings.args$weight.reduction %||% anchor.reduction slot(object = query, name = "tools")$TransferData <- NULL reuse.weights.matrix <- FALSE td.allarguments <- c(list(anchorset = anchorset, reference = reference, query = query, refdata = refdata, store.weights = TRUE, only.weights = is.null(x = refdata), verbose = verbose), transferdata.args) query <- exec("TransferData",!!!td.allarguments) if (inherits(x = transferdata.args$weight.reduction , "character") && transferdata.args$weight.reduction == integrateembeddings.args$weight.reduction) { reuse.weights.matrix <- TRUE } if (anchor.reduction != "cca") { ie.allarguments <- c(list( anchorset = anchorset, reference = reference, query = query, new.reduction.name = new.reduction.name, reuse.weights.matrix = reuse.weights.matrix, verbose = verbose ), integrateembeddings.args ) query <- exec("IntegrateEmbeddings",!!!ie.allarguments) Misc( object = query[[new.reduction.name]], slot = 'ref.dims' ) <- slot(object = anchorset, name = "command")$dims } slot(object = query, name = "tools")$MapQuery <- NULL if (store.weights) { slot(object = query, name = "tools")$MapQuery <- slot( object = query, name = "tools" )$TransferData slot(object = query, name = "tools")$MapQuery$anchor <- slot( object = anchorset, name = "anchors" ) } slot(object = query, name = "tools")$TransferData <- NULL if (!is.null(x = reduction.model)) { reference.dims <- reference.dims %||% slot(object = anchorset, name = "command")$dims query.dims <- query.dims %||% 1:ncol(x = query[[new.reduction.name]]) if (length(x = query.dims) != length(x = reference.dims)) { message("Query and reference dimensions are not equal, proceeding with reference dimensions.") query.dims <- reference.dims } ref_nn.num <- Misc(object = reference[[reduction.model]], slot = "model")$n_neighbors pu.allarguments <- c(list( query = query, query.reduction = new.reduction.name, query.dims = query.dims, reference = reference, reference.dims = reference.dims, reference.reduction = reference.reduction, reduction.model = reduction.model, k.param = ref_nn.num ), projectumap.args ) query <- exec("ProjectUMAP",!!!pu.allarguments) } return(query) } #' @param anchors AnchorSet object or just anchor matrix from the #' Anchorset object returned from FindTransferAnchors #' @param combined.object Combined object (ref + query) from the #' Anchorset object returned #' @param query.neighbors Neighbors object computed on query cells #' @param ref.embeddings Reference embeddings matrix #' @param query.embeddings Query embeddings matrix #' @param kanchors Number of anchors to use in projection steps when computing #' weights #' @param ndim Number of dimensions to use when working with low dimensional #' projections of the data #' @param ksmooth Number of cells to average over when computing transition #' probabilities #' @param ksnn Number of cells to average over when determining the kernel #' bandwidth from the SNN graph #' @param snn.prune Amount of pruning to apply to edges in SNN graph #' @param subtract.first.nn Option to the scoring function when computing #' distances to subtract the distance to the first nearest neighbor #' @param nn.method Nearest neighbor method to use (annoy or RANN) #' @param n.trees More trees gives higher precision when using annoy approximate #' nearest neighbor search #' @param query.weights Query weights matrix for reuse #' @param verbose Display messages/progress #' @param ... Reserved for internal use #' #' @return Returns a vector of cell scores #' #' @importClassesFrom SeuratObject Neighbor #' #' @rdname MappingScore #' @concept integration #' @export #' MappingScore.default <- function( anchors, combined.object, query.neighbors, ref.embeddings, query.embeddings, kanchors = 50, ndim = 50, ksmooth = 100, ksnn = 20, snn.prune = 0, subtract.first.nn = TRUE, nn.method = "annoy", n.trees = 50, query.weights = NULL, verbose = TRUE, ... ) { CheckDots(...) # Input checks start.time <- Sys.time() if (is.null(x = query.neighbors) || ncol(x = query.neighbors) < ksmooth) { message("Recomputing query neighborhoods.\nSetting mapping.score.k in ", "FindTransferAnchors to the ksmooth \nvalue here (", ksmooth, "), can bypass this calculation in future runs.") query.neighbors <- FindNeighbors( object = query.embeddings, k.param = ksmooth, nn.method = nn.method, n.trees = n.trees, cache.index = TRUE, return.neighbor = TRUE, verbose = FALSE ) } ref.cells <- rownames(x = ref.embeddings) query.cells <- rownames(query.embeddings) # Project reference values onto query if (verbose) { message("Projecting reference PCA onto query") } ## Need to set up an IntegrationData object to use FindWeights here int.mat <- matrix(data = NA, nrow = nrow(x = anchors), ncol = 0) rownames(x = int.mat) <- query.cells[anchors[, "cell2"]] slot(object = combined.object, name = 'tools')[["IT1"]] <- new( Class = "IntegrationData", anchors = anchors, neighbors = list(cells1 = ref.cells, cells2 = query.cells), integration.matrix = int.mat ) ## Finding weights of anchors in query pca space ref.pca.orig <- ref.embeddings[, 1:ndim] query.pca.orig <- query.embeddings[, 1:ndim] dr.weights <- suppressWarnings(expr = CreateDimReducObject( embeddings = rbind(query.pca.orig, ref.pca.orig) )) if (!is.null(x = query.weights)) { weights.matrix <- query.weights } else { combined.object <- FindWeights( object = combined.object, integration.name = "IT1", reduction = dr.weights, dims = 1:ncol(x = dr.weights), k = kanchors, sd.weight = 1, eps = 0, nn.method = nn.method, n.trees = n.trees, verbose = verbose ) weights.matrix <- GetIntegrationData( object = combined.object, integration.name = "IT1", slot = "weights" ) } ## Perform projection of ref pca values using weights matrix ref.pca <- ref.embeddings[ref.cells[anchors[, 1]], 1:ndim] rownames(x = ref.pca) <- paste0(rownames(x = ref.pca), "_reference") query.cells.projected <- Matrix::crossprod( x = as.sparse(x = ref.pca), y = weights.matrix ) colnames(x = query.cells.projected) <- query.cells rownames(x = query.cells.projected) <- colnames(x = ref.pca) # Re-project the query cells back onto query if (verbose) { message("Projecting back the query cells into original PCA space") } ## Compute new weights dr.weights <- suppressWarnings(CreateDimReducObject( embeddings = rbind( t(x = as.matrix(x = query.cells.projected)), ref.pca.orig[ref.cells, ] ), )) combined.object <- FindWeights( object = combined.object, integration.name = "IT1", reduction = dr.weights, dims = 1:ndim, k = kanchors, sd.weight = 1, eps = 0, nn.method = nn.method, n.trees = n.trees, reverse = TRUE, verbose = verbose ) weights.matrix <- GetIntegrationData( object = combined.object, integration.name = "IT1", slot = "weights" ) ## Project back onto query orig.pca <- query.embeddings[query.cells[anchors[, 2]], ] query.cells.back.corrected <- Matrix::t( x = Matrix::crossprod( x = as.sparse(x = orig.pca), y = weights.matrix)[1:ndim, ] ) query.cells.back.corrected <- as.matrix(x = query.cells.back.corrected) rownames(x = query.cells.back.corrected) <- query.cells query.cells.pca <- query.embeddings[query.cells, 1:ndim] if (verbose) { message("Computing scores:") message(" Finding neighbors of original query cells") } ## Compute original neighborhood of query cells if (is.null(x = query.neighbors)) { query.neighbors <- NNHelper( data = query.cells.pca, query = query.cells.pca, k = max(ksmooth, ksnn), method = nn.method, n.trees = n.trees, cache.index = TRUE ) } if (verbose) { message(" Finding neighbors of transformed query cells") } ## Compute new neighborhood of query cells after projections if (nn.method == "annoy") { if (is.null(x = Index(object = query.neighbors))) { corrected.neighbors <- NNHelper( data = query.cells.pca, query = query.cells.back.corrected, k = max(ksmooth, ksnn), method = nn.method, n.treees = n.trees, cache.index = TRUE ) } else { corrected.neighbors <- AnnoySearch( index = Index(object = query.neighbors), query = query.cells.back.corrected, k = max(ksmooth, ksnn) ) corrected.neighbors <- new( Class = 'Neighbor', nn.idx = corrected.neighbors$nn.idx, nn.dist = corrected.neighbors$nn.dists ) } } if (verbose) { message(" Computing query SNN") } snn <- ComputeSNN( nn_ranked = Indices(query.neighbors)[, 1:ksnn], prune = snn.prune ) query.cells.pca <- t(x = query.cells.pca) if (verbose) { message(" Determining bandwidth and computing transition probabilities") } scores <- ScoreHelper( snn = snn, query_pca = query.cells.pca, query_dists = Distances(object = query.neighbors), corrected_nns = Indices(object = corrected.neighbors), k_snn = ksnn, subtract_first_nn = subtract.first.nn, display_progress = verbose ) scores[scores > 1] <- 1 names(x = scores) <- query.cells end.time <- Sys.time() if (verbose) { message("Total elapsed time: ", end.time - start.time) } return(scores) } #' @rdname MappingScore #' @export #' @concept integration #' @method MappingScore AnchorSet #' MappingScore.AnchorSet <- function( anchors, kanchors = 50, ndim = 50, ksmooth = 100, ksnn = 20, snn.prune = 0, subtract.first.nn = TRUE, nn.method = "annoy", n.trees = 50, query.weights = NULL, verbose = TRUE, ... ) { CheckDots(...) combined.object <- slot(object = anchors, name = "object.list")[[1]] combined.object <- RenameCells( object = combined.object, new.names = unname(obj = make.unique(sapply( X = Cells(x = combined.object), FUN = RemoveLastField ))) ) query.cells <- make.unique(sapply( X = slot(object = anchors, name = "query.cells"), FUN = RemoveLastField )) ref.cells <- make.unique(sapply( X = slot(object = anchors, name = "reference.cells"), FUN = RemoveLastField )) query.embeddings <- Embeddings(object = subset( x = combined.object[["pcaproject.l2"]], cells = query.cells )) ref.embeddings <- Embeddings(object = subset( x = combined.object[["pcaproject.l2"]], cells = ref.cells )) query.neighbors <- slot(object = anchors, name = "neighbors")[["query.neighbors"]] # reduce size of anchorset combined object combined.object <- DietSeurat(object = combined.object) combined.object <- subset( x = combined.object, features = c(rownames(x = combined.object)[1]) ) for (i in colnames(x = combined.object[[]])) { combined.object[[i]] <- NULL } return(MappingScore( anchors = slot(object = anchors, name = "anchors"), combined.object = combined.object, query.neighbors = query.neighbors, ref.embeddings = ref.embeddings, query.embeddings = query.embeddings, kanchors = kanchors, ndim = ndim, ksmooth = ksmooth, ksnn = ksnn, snn.prune = snn.prune, subtract.first.nn = subtract.first.nn, nn.method = nn.method, n.trees = n.trees, query.weights = query.weights, verbose = verbose )) } #' Calculates a mixing metric #' #' Here we compute a measure of how well mixed a composite dataset is. To #' compute, we first examine the local neighborhood for each cell (looking at #' max.k neighbors) and determine for each group (could be the dataset after #' integration) the k nearest neighbor and what rank that neighbor was in the #' overall neighborhood. We then take the median across all groups as the mixing #' metric per cell. #' #' @param object Seurat object #' @param grouping.var Grouping variable for dataset #' @param reduction Which dimensionally reduced space to use #' @param dims Dimensions to use #' @param k Neighbor number to examine per group #' @param max.k Maximum size of local neighborhood to compute #' @param eps Error bound on the neighbor finding algorithm (from RANN) #' @param verbose Displays progress bar #' #' @return Returns a vector of values of the mixing metric for each cell #' #' @importFrom RANN nn2 #' @importFrom pbapply pbsapply #' @importFrom future.apply future_sapply #' @importFrom future nbrOfWorkers #' @export #' @concept integration #' MixingMetric <- function( object, grouping.var, reduction = "pca", dims = 1:2, k = 5, max.k = 300, eps = 0, verbose = TRUE ) { my.sapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pbsapply, no = future_sapply ) embeddings <- Embeddings(object = object[[reduction]])[, dims] nn <- nn2( data = embeddings, k = max.k, eps = eps ) group.info <- object[[grouping.var, drop = TRUE]] groups <- unique(x = group.info) mixing <- my.sapply( X = 1:ncol(x = object), FUN = function(x) { sapply(X = groups, FUN = function(y) { which(x = group.info[nn$nn.idx[x, ]] == y)[k] }) } ) mixing[is.na(x = mixing)] <- max.k mixing <- apply( X = mixing, MARGIN = 2, FUN = median ) return(mixing) } #' Prepare an object list normalized with sctransform for integration. #' #' This function takes in a list of objects that have been normalized with the #' \code{\link{SCTransform}} method and performs the following steps: #' \itemize{ #' \item{If anchor.features is a numeric value, calls \code{\link{SelectIntegrationFeatures}} #' to determine the features to use in the downstream integration procedure.} #' \item{Ensures that the sctransform residuals for the features specified #' to anchor.features are present in each object in the list. This is #' necessary because the default behavior of \code{\link{SCTransform}} is to #' only store the residuals for the features determined to be variable. #' Residuals are recomputed for missing features using the stored model #' parameters via the \code{\link{GetResidual}} function.} #' \item{Subsets the \code{scale.data} slot to only contain the residuals for #' anchor.features for efficiency in downstream processing. } #' } #' #' @param object.list A list of \code{\link[SeuratObject]{Seurat}} objects to prepare for integration #' @param assay The name of the \code{\link[SeuratObject]{Assay}} to use for integration. This can be a #' single name if all the assays to be integrated have the same name, or a character vector #' containing the name of each \code{\link[SeuratObject]{Assay}} in each object to be integrated. The #' specified assays must have been normalized using \code{\link{SCTransform}}. #' If NULL (default), the current default assay for each object is used. #' @param anchor.features Can be either: #' \itemize{ #' \item{A numeric value. This will call \code{\link{SelectIntegrationFeatures}} #' to select the provided number of features to be used in anchor finding} #' \item{A vector of features to be used as input to the anchor finding #' process} #' } #' @param sct.clip.range Numeric of length two specifying the min and max values #' the Pearson residual will be clipped to #' @param verbose Display output/messages #' #' @return A list of \code{\link[SeuratObject]{Seurat}} objects with the appropriate \code{scale.data} slots #' containing only the required \code{anchor.features}. #' #' @importFrom pbapply pblapply #' @importFrom methods slot slot<- #' @importFrom future nbrOfWorkers #' @importFrom future.apply future_lapply #' #' @export #' @concept integration #' @examples #' \dontrun{ #' # to install the SeuratData package see https://github.com/satijalab/seurat-data #' library(SeuratData) #' data("panc8") #' #' # panc8 is a merged Seurat object containing 8 separate pancreas datasets #' # split the object by dataset and take the first 2 to integrate #' pancreas.list <- SplitObject(panc8, split.by = "tech")[1:2] #' #' # perform SCTransform normalization #' pancreas.list <- lapply(X = pancreas.list, FUN = SCTransform) #' #' # select integration features and prep step #' features <- SelectIntegrationFeatures(pancreas.list) #' pancreas.list <- PrepSCTIntegration( #' pancreas.list, #' anchor.features = features #' ) #' #' # downstream integration steps #' anchors <- FindIntegrationAnchors( #' pancreas.list, #' normalization.method = "SCT", #' anchor.features = features #' ) #' pancreas.integrated <- IntegrateData(anchors, normalization.method = "SCT") #' } #' PrepSCTIntegration <- function( object.list, assay = NULL, anchor.features = 2000, sct.clip.range = NULL, verbose = TRUE ) { my.lapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pblapply, no = future_lapply ) assay <- assay %||% sapply(X = object.list, FUN = DefaultAssay) assay <- rep_len(x = assay, length.out = length(x = object.list)) objects.names <- names(x = object.list) object.list <- lapply( X = 1:length(x = object.list), FUN = function(i) { DefaultAssay(object = object.list[[i]]) <- assay[i] object.list[[i]][[assay[i]]] <- as(object = object.list[[i]][[assay[i]]], Class = "SCTAssay") return(object.list[[i]]) } ) sct.check <- vapply( X = 1:length(x = object.list), FUN = function(i) { sct.check <- IsSCT(assay = object.list[[i]][[assay[i]]]) if (!sct.check) { if ("FindIntegrationAnchors" %in% Command(object = object.list[[i]]) && Command(object = object.list[[i]], command = "FindIntegrationAnchors", value = "normalization.method") == "SCT") { sct.check <- TRUE } } return(sct.check) }, FUN.VALUE = logical(length = 1L), USE.NAMES = FALSE ) if (!all(sct.check)) { stop( "The following assays have not been processed with SCTransform:\n", paste( ' object:', which(x = !sct.check, useNames = FALSE), '- assay:', assay[!sct.check], collapse = '\n' ), call. = FALSE ) } if (is.numeric(x = anchor.features)) { anchor.features <- SelectIntegrationFeatures( object.list = object.list, nfeatures = anchor.features, verbose = verbose ) } object.list <- my.lapply( X = 1:length(x = object.list), FUN = function(i) { obj <- GetResidual( object = object.list[[i]], assay = assay[i], features = anchor.features, replace.value = ifelse(test = is.null(x = sct.clip.range), yes = FALSE, no = TRUE), clip.range = sct.clip.range, verbose = FALSE ) scale.data <- GetAssayData( object = obj, assay = assay[i], slot = 'scale.data' ) obj <- SetAssayData( object = obj, slot = 'scale.data', new.data = scale.data[anchor.features, ], assay = assay[i] ) return(obj) } ) assays.used <- assay for (i in 1:length(x = object.list)) { assay <- as.character(x = assays.used[i]) object.list[[i]] <- LogSeuratCommand(object = object.list[[i]]) } names(x = object.list) <- objects.names return(object.list) } #' Select integration features #' #' Choose the features to use when integrating multiple datasets. This function #' ranks features by the number of datasets they are deemed variable in, #' breaking ties by the median variable feature rank across datasets. It returns #' the top scoring features by this ranking. #' #' If for any assay in the list, \code{\link{FindVariableFeatures}} hasn't been #' run, this method will try to run it using the \code{fvf.nfeatures} parameter #' and any additional ones specified through the \dots. #' #' @param object.list List of seurat objects #' @param nfeatures Number of features to return #' @param assay Name or vector of assay names (one for each object) from which #' to pull the variable features. #' @param verbose Print messages #' @param fvf.nfeatures nfeatures for \code{\link{FindVariableFeatures}}. Used #' if \code{VariableFeatures} have not been set for any object in #' \code{object.list}. #' @param ... Additional parameters to \code{\link{FindVariableFeatures}} #' #' @return A vector of selected features #' #' @importFrom utils head #' #' @export #' @concept integration #' #' @examples #' \dontrun{ #' # to install the SeuratData package see https://github.com/satijalab/seurat-data #' library(SeuratData) #' data("panc8") #' #' # panc8 is a merged Seurat object containing 8 separate pancreas datasets #' # split the object by dataset and take the first 2 #' pancreas.list <- SplitObject(panc8, split.by = "tech")[1:2] #' #' # perform SCTransform normalization #' pancreas.list <- lapply(X = pancreas.list, FUN = SCTransform) #' #' # select integration features #' features <- SelectIntegrationFeatures(pancreas.list) #' } #' SelectIntegrationFeatures <- function( object.list, nfeatures = 2000, assay = NULL, verbose = TRUE, fvf.nfeatures = 2000, ... ) { if (!is.null(x = assay)) { if (length(x = assay) != length(x = object.list)) { stop("If specifying the assay, please specify one assay per object in the object.list") } for (ii in length(x = object.list)) { DefaultAssay(object = object.list[[ii]]) <- assay[ii] } } else { assay <- sapply(X = object.list, FUN = DefaultAssay) } for (ii in 1:length(x = object.list)) { if (length(x = VariableFeatures(object = object.list[[ii]])) == 0) { if (verbose) { message(paste0("No variable features found for object", ii, " in the object.list. Running FindVariableFeatures ...")) } object.list[[ii]] <- FindVariableFeatures(object = object.list[[ii]], nfeatures = fvf.nfeatures, verbose = verbose, ...) } } var.features <- unname(obj = unlist(x = lapply( X = 1:length(x = object.list), FUN = function(x) VariableFeatures(object = object.list[[x]], assay = assay[x])) )) var.features <- sort(x = table(var.features), decreasing = TRUE) for (i in 1:length(x = object.list)) { var.features <- var.features[names(x = var.features) %in% rownames(x = object.list[[i]][[assay[i]]])] } tie.val <- var.features[min(nfeatures, length(x = var.features))] features <- names(x = var.features[which(x = var.features > tie.val)]) vf.list <- lapply(X = object.list, FUN = VariableFeatures) if (length(x = features) > 0) { feature.ranks <- sapply(X = features, FUN = function(x) { ranks <- sapply(X = vf.list, FUN = function(vf) { if (x %in% vf) { return(which(x = x == vf)) } return(NULL) }) median(x = unlist(x = ranks)) }) features <- names(x = sort(x = feature.ranks)) } features.tie <- var.features[which(x = var.features == tie.val)] tie.ranks <- sapply(X = names(x = features.tie), FUN = function(x) { ranks <- sapply(X = vf.list, FUN = function(vf) { if (x %in% vf) { return(which(x = x == vf)) } return(NULL) }) median(x = unlist(x = ranks)) }) features <- c( features, names(x = head(x = sort(x = tie.ranks), nfeatures - length(x = features))) ) return(features) } .FeatureRank <- function(features, flist, ranks = FALSE) { franks <- vapply( X = features, FUN = function(x) { return(median(x = unlist(x = lapply( X = flist, FUN = function(fl) { if (x %in% fl) { return(which(x = x == fl)) } return(NULL) } )))) }, FUN.VALUE = numeric(length = 1L) ) franks <- sort(x = franks) if (!isTRUE(x = ranks)) { franks <- names(x = franks) } return(franks) } #' Select integration features #' #' @param object Seurat object #' @param nfeatures Number of features to return for integration #' @param assay Name of assay to use for integration feature selection #' @param method Which method to pull. For \code{HVFInfo} and #' \code{VariableFeatures}, choose one from one of the #' following: #' \itemize{ #' \item \dQuote{vst} #' \item \dQuote{sctransform} or \dQuote{sct} #' \item \dQuote{mean.var.plot}, \dQuote{dispersion}, \dQuote{mvp}, or #' \dQuote{disp} #' } #' @param layers Name of layers to use for integration feature selection #' @param verbose Print messages #' @param ... Arguments passed on to \code{method} #' #' @export #' @concept integration #' SelectIntegrationFeatures5 <- function( object, nfeatures = 2000, assay = NULL, method = NULL, layers = NULL, verbose = TRUE, ... ) { assay <- assay %||% DefaultAssay(object = object) layers <- Layers(object = object[[assay]], search = layers) var.features <- VariableFeatures( object = object, assay = assay, nfeatures = nfeatures, method = method, layer = layers, simplify = TRUE ) return(var.features) } #' Select SCT integration features #' #' @param object Seurat object #' @param nfeatures Number of features to return for integration #' @param assay Name of assay to use for integration feature selection #' @param verbose Print messages #' @param ... Arguments passed on to \code{method} #' #' @export #' @concept integration #' SelectSCTIntegrationFeatures <- function( object, nfeatures = 3000, assay = NULL, verbose = TRUE, ... ) { assay <- assay %||% DefaultAssay(object = object) if (!inherits(x = object[[assay]], what = 'SCTAssay')) { abort(message = "'assay' must be an SCTAssay") } models <- levels(x = object[[assay]]) vf.list <- VariableFeatures( object = object[[assay]], layer = models, nfeatures = nfeatures, simplify = FALSE ) var.features <- sort( x = table(unlist(x = vf.list, use.names = FALSE)), decreasing = TRUE ) for (i in 1:length(x = models)) { vst_out <- SCTModel_to_vst(SCTModel = slot(object = object[[assay]], name = "SCTModel.list")[[models[[i]]]]) var.features <- var.features[names(x = var.features) %in% rownames(x = vst_out$gene_attr)] } tie.val <- var.features[min(nfeatures, length(x = var.features))] features <- names(x = var.features[which(x = var.features > tie.val)]) if (length(x = features) > 0) { feature.ranks <- sapply(X = features, FUN = function(x) { ranks <- sapply(X = vf.list, FUN = function(vf) { if (x %in% vf) { return(which(x = x == vf)) } return(NULL) }) median(x = unlist(x = ranks)) }) features <- names(x = sort(x = feature.ranks)) } features.tie <- var.features[which(x = var.features == tie.val)] tie.ranks <- sapply(X = names(x = features.tie), FUN = function(x) { ranks <- sapply(X = vf.list, FUN = function(vf) { if (x %in% vf) { return(which(x = x == vf)) } return(NULL) }) median(x = unlist(x = ranks)) }) features <- c( features, names(x = head(x = sort(x = tie.ranks), nfeatures - length(x = features))) ) return(features) } #' Transfer data #' #' Transfer categorical or continuous data across single-cell datasets. For #' transferring categorical information, pass a vector from the reference #' dataset (e.g. \code{refdata = reference$celltype}). For transferring #' continuous information, pass a matrix from the reference dataset (e.g. #' \code{refdata = GetAssayData(reference[['RNA']])}). #' #' The main steps of this procedure are outlined below. For a more detailed #' description of the methodology, please see Stuart, Butler, et al Cell 2019. #' \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} #' #' For both transferring discrete labels and also feature imputation, we first #' compute the weights matrix. #' #' \itemize{ #' \item{Construct a weights matrix that defines the association between each #' query cell and each anchor. These weights are computed as 1 - the distance #' between the query cell and the anchor divided by the distance of the query #' cell to the \code{k.weight}th anchor multiplied by the anchor score #' computed in \code{\link{FindIntegrationAnchors}}. We then apply a Gaussian #' kernel width a bandwidth defined by \code{sd.weight} and normalize across #' all \code{k.weight} anchors.} #' } #' #' The main difference between label transfer (classification) and feature #' imputation is what gets multiplied by the weights matrix. For label transfer, #' we perform the following steps: #' #' \itemize{ #' \item{Create a binary classification matrix, the rows corresponding to each #' possible class and the columns corresponding to the anchors. If the #' reference cell in the anchor pair is a member of a certain class, that #' matrix entry is filled with a 1, otherwise 0.} #' \item{Multiply this classification matrix by the transpose of weights #' matrix to compute a prediction score for each class for each cell in the #' query dataset.} #' } #' #' For feature imputation, we perform the following step: #' \itemize{ #' \item{Multiply the expression matrix for the reference anchor cells by the #' weights matrix. This returns a predicted expression matrix for the #' specified features for each cell in the query dataset.} #' } #' #' #' @param anchorset An \code{\link{AnchorSet}} object generated by #' \code{\link{FindTransferAnchors}} #' @param refdata Data to transfer. This can be specified in one of two ways: #' \itemize{ #' \item{The reference data itself as either a vector where the names #' correspond to the reference cells, or a matrix, where the column names #' correspond to the reference cells.} #' \item{The name of the metadata field or assay from the reference object #' provided. This requires the reference parameter to be specified. If pulling #' assay data in this manner, it will pull the data from the data slot. To #' transfer data from other slots, please pull the data explicitly with #' \code{\link{GetAssayData}} and provide that matrix here.} #' } #' @param reference Reference object from which to pull data to transfer #' @param query Query object into which the data will be transferred. #' @param query.assay Name of the Assay to use from query #' @param weight.reduction Dimensional reduction to use for the weighting #' anchors. Options are: #' \itemize{ #' \item{pcaproject: Use the projected PCA used for anchor building} #' \item{lsiproject: Use the projected LSI used for anchor building} #' \item{pca: Use an internal PCA on the query only} #' \item{cca: Use the CCA used for anchor building} #' \item{custom DimReduc: User provided \code{\[SeuratObject]{DimReduc}} object #' computed on the query cells} #' } #' @param l2.norm Perform L2 normalization on the cell embeddings after #' dimensional reduction #' @param dims Set of dimensions to use in the anchor weighting procedure. If #' NULL, the same dimensions that were used to find anchors will be used for #' weighting. #' @param k.weight Number of neighbors to consider when weighting anchors #' @param sd.weight Controls the bandwidth of the Gaussian kernel for weighting #' @param eps Error bound on the neighbor finding algorithm (from #' \code{\link[RANN]{RANN}}) #' @param n.trees More trees gives higher precision when using annoy approximate #' nearest neighbor search #' @param verbose Print progress bars and output #' @param slot Slot to store the imputed data. Must be either "data" (default) #' or "counts" #' @param prediction.assay Return an \code{Assay} object with the prediction #' scores for each class stored in the \code{data} slot. #' @param only.weights Only return weights matrix #' @param store.weights Optionally store the weights matrix used for predictions #' in the returned query object. #' #' @return #' If \code{query} is not provided, for the categorical data in \code{refdata}, #' returns a data.frame with label predictions. If \code{refdata} is a matrix, #' returns an Assay object where the imputed data has been stored in the #' provided slot. #' #' If \code{query} is provided, a modified query object is returned. For #' the categorical data in refdata, prediction scores are stored as Assays #' (prediction.score.NAME) and two additional metadata fields: predicted.NAME #' and predicted.NAME.score which contain the class prediction and the score for #' that predicted class. For continuous data, an Assay called NAME is returned. #' NAME here corresponds to the name of the element in the refdata list. #' #' #' @references Stuart T, Butler A, et al. Comprehensive Integration of #' Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031} #' #' @importFrom Matrix t #' #' @export #' #' @concept integration #' #' @examples #' \dontrun{ #' # to install the SeuratData package see https://github.com/satijalab/seurat-data #' library(SeuratData) #' data("pbmc3k") #' #' # for demonstration, split the object into reference and query #' pbmc.reference <- pbmc3k[, 1:1350] #' pbmc.query <- pbmc3k[, 1351:2700] #' #' # perform standard preprocessing on each object #' pbmc.reference <- NormalizeData(pbmc.reference) #' pbmc.reference <- FindVariableFeatures(pbmc.reference) #' pbmc.reference <- ScaleData(pbmc.reference) #' #' pbmc.query <- NormalizeData(pbmc.query) #' pbmc.query <- FindVariableFeatures(pbmc.query) #' pbmc.query <- ScaleData(pbmc.query) #' #' # find anchors #' anchors <- FindTransferAnchors(reference = pbmc.reference, query = pbmc.query) #' #' # transfer labels #' predictions <- TransferData(anchorset = anchors, refdata = pbmc.reference$seurat_annotations) #' pbmc.query <- AddMetaData(object = pbmc.query, metadata = predictions) #' } #' TransferData <- function( anchorset, refdata, reference = NULL, query = NULL, query.assay = NULL, weight.reduction = 'pcaproject', l2.norm = FALSE, dims = NULL, k.weight = 50, sd.weight = 1, eps = 0, n.trees = 50, verbose = TRUE, slot = "data", prediction.assay = FALSE, only.weights = FALSE, store.weights = TRUE ) { combined.ob <- slot(object = anchorset, name = "object.list")[[1]] anchors <- slot(object = anchorset, name = "anchors") reference.cells <- slot(object = anchorset, name = "reference.cells") query.cells <- slot(object = anchorset, name = "query.cells") if (!is.null(query)) { query.assay <- query.assay %||% DefaultAssay(query) } label.transfer <- list() ValidateParams_TransferData( anchorset = anchorset, combined.ob = combined.ob, anchors = anchors, reference.cells = reference.cells, query.cells = query.cells, refdata = refdata, reference = reference, query = query, query.assay = query.assay, weight.reduction = weight.reduction, l2.norm = l2.norm, dims = dims, k.weight = k.weight, sd.weight = sd.weight, eps = eps, n.trees = n.trees, verbose = verbose, only.weights = only.weights, slot = slot, prediction.assay = prediction.assay, label.transfer = label.transfer ) if (!inherits(x = weight.reduction, what = "DimReduc") && weight.reduction == 'pca') { if (verbose) { message("Running PCA on query dataset") } features <- slot(object = anchorset, name = "anchor.features") query.ob <- query DefaultAssay(query.ob) <- query.assay query.ob <- ScaleData(object = query.ob, features = features, verbose = FALSE) query.ob <- RunPCA(object = query.ob, npcs = max(dims), features = features, verbose = FALSE) query.pca <- Embeddings(query.ob[['pca']]) rownames(x = query.pca) <- paste0(rownames(x = query.pca), "_query") #fill with 0s ref.pca <- matrix( data = 0, nrow = length(x = reference.cells), ncol = ncol(x = query.pca), dimnames = list(reference.cells, colnames(x = query.pca)) ) rm(query.ob) combined.pca.embeddings <- rbind(ref.pca, query.pca)[colnames(x = combined.ob), ] combined.pca <- CreateDimReducObject( embeddings = combined.pca.embeddings, key = "PC_", assay = DefaultAssay(object = combined.ob) ) combined.ob[["pca"]] <- combined.pca if (l2.norm) { combined.ob <- L2Dim(object = combined.ob, reduction = 'pca') } } if (!inherits(x = weight.reduction, what = "DimReduc") && weight.reduction == "lsi") { if (!("lsi" %in% Reductions(object = query))) { stop("Requested lsi for weight.reduction, but lsi not stored in query object.") } else { weight.reduction <- query[["lsi"]] } } if (inherits(x = weight.reduction, what = "DimReduc")) { weight.reduction <- RenameCells( object = weight.reduction, new.names = paste0(Cells(x = weight.reduction), "_query") ) } else { if (l2.norm) { weight.reduction.l2 <- paste0(weight.reduction, ".l2") if (weight.reduction.l2 %in% Reductions(object = combined.ob)) { combined.ob <- L2Dim(object = combined.ob, reduction = weight.reduction) } weight.reduction <- weight.reduction.l2 } weight.reduction <- combined.ob[[weight.reduction]] } dims <- dims %||% seq_len(length.out = ncol(x = weight.reduction)) if (max(dims) > ncol(x = weight.reduction)) { stop("dims is larger than the number of available dimensions in ", "weight.reduction (", ncol(x = weight.reduction), ").", call. = FALSE) } combined.ob <- SetIntegrationData( object = combined.ob, integration.name = "integrated", slot = 'anchors', new.data = anchors ) combined.ob <- SetIntegrationData( object = combined.ob, integration.name = "integrated", slot = 'neighbors', new.data = list('cells1' = reference.cells, 'cells2' = query.cells) ) combined.ob <- FindIntegrationMatrix( object = combined.ob, verbose = verbose ) combined.ob <- FindWeights( object = combined.ob, reduction = weight.reduction, dims = dims, k = k.weight, sd.weight = sd.weight, eps = eps, n.trees = n.trees, verbose = verbose ) weights <- GetIntegrationData( object = combined.ob, integration.name = "integrated", slot = 'weights' ) if (only.weights) { if (is.null(x = query)) { return(weights) } else { slot(object = query, name = "tools")[["TransferData"]] <- list(weights.matrix = weights) return(query) } } anchors <- as.data.frame(x = anchors) query.cells <- unname(obj = sapply( X = query.cells, FUN = function(x) gsub(pattern = "_query", replacement = "", x = x) )) transfer.results <- list() for (rd in 1:length(x = refdata)) { if (isFALSE(x = refdata[[rd]])) { transfer.results[[rd]] <- NULL next } rd.name <- names(x = refdata)[rd] # case for projection if (label.transfer[[rd]]) { anchors$id1 <- refdata[[rd]][anchors[, "cell1"]] reference.ids <- factor(x = anchors$id1, levels = unique(x = refdata[[rd]])) possible.ids <- levels(x = reference.ids) prediction.mat <- matrix( nrow = nrow(x = anchors), ncol = length(x = possible.ids), data = 0 ) for (i in 1:length(x = possible.ids)) { prediction.mat[which(reference.ids == possible.ids[i]), i] = 1 } if (verbose) { message("Predicting cell labels") } prediction.scores <- t(x = weights) %*% prediction.mat colnames(x = prediction.scores) <- possible.ids rownames(x = prediction.scores) <- query.cells if ("bridge.sets" %in% names(anchorset@weight.reduction@misc)) { bridge.weight <- anchorset@weight.reduction@misc$bridge.sets bridge.prediction.matrix <- as.sparse( x = dummy_cols( refdata[[rd]][ bridge.weight$bridge.ref_anchor ] )[, -1] ) colnames(bridge.prediction.matrix) <- gsub( pattern = ".data_", replacement = "", x = colnames(bridge.prediction.matrix) ) extra.id <- setdiff(possible.ids, colnames(bridge.prediction.matrix)) if (length(extra.id) > 0) { extra.prediction <- as.sparse(x = matrix( data = 0, nrow = nrow(bridge.prediction.matrix), ncol = length(extra.id) )) colnames(extra.prediction) <- extra.id bridge.prediction.matrix <- cbind( bridge.prediction.matrix, extra.prediction ) } bridge.prediction.matrix <- bridge.prediction.matrix[,possible.ids, drop = FALSE] bridge.prediction.scores <- t(bridge.weight$query.weights) %*% (t(bridge.weight$bridge.weights) %*% bridge.prediction.matrix)[bridge.weight$query.ref_anchor,] prediction.scores <- (prediction.scores + bridge.prediction.scores)/2 prediction.scores <- as.matrix(x = prediction.scores) } prediction.ids <- possible.ids[apply(X = prediction.scores, MARGIN = 1, FUN = which.max)] prediction.ids <- as.character(prediction.ids) prediction.max <- apply(X = prediction.scores, MARGIN = 1, FUN = max) if (is.null(x = query)) { prediction.scores <- cbind(prediction.scores, max = prediction.max) } predictions <- data.frame( predicted.id = prediction.ids, prediction.score = as.matrix(prediction.scores), row.names = query.cells, stringsAsFactors = FALSE ) if (prediction.assay || !is.null(x = query)) { predictions <- CreateAssayObject( data = t(x = as.matrix(x = prediction.scores)), check.matrix = FALSE ) Key(object = predictions) <- Key(paste0("predictionscore", rd.name), quiet = TRUE) } if (is.null(x = query)) { transfer.results[[rd]] <- predictions } else { query <- AddMetaData(object = query, metadata = prediction.max, col.name = paste0("predicted.", rd.name, ".score")) query <- AddMetaData(object = query, metadata = prediction.ids, col.name = paste0("predicted.", rd.name)) query[[paste0("prediction.score.", rd.name)]] <- predictions } } else { # case for transferring features reference.cell.indices <- reference.cells[anchors$cell1] refdata.anchors <- refdata[[rd]][, reference.cell.indices] nfeatures <- nrow(x = refdata[[rd]]) if (verbose) { message(paste0("Transfering ", nfeatures, " features onto reference data")) } new.data <- refdata.anchors %*% weights rownames(x = new.data) <- rownames(x = refdata[[rd]]) colnames(x = new.data) <- query.cells if (inherits(x = new.data, what = "Matrix")) { new.data <- as.sparse(x = new.data) } if (slot == "counts") { new.assay <- CreateAssayObject(counts = new.data, check.matrix = FALSE) } else if (slot == "data") { new.assay <- CreateAssayObject(data = new.data, check.matrix = FALSE) } Key(object = new.assay) <- Key(rd.name, quiet = TRUE) if (is.null(x = query)) { transfer.results[[rd]] <- new.assay } else { if (rd.name %in% Assays(object = query)) { message( rd.name, " already present in query. ", "Storing as ", paste0("predicted_", rd.name) ) rd.name <- paste0("predicted_", rd.name) } query[[rd.name]] <- new.assay } } } if (is.null(x = query)) { names(x = transfer.results) <- names(x = refdata) if (length(x = transfer.results) == 1) { transfer.results <- transfer.results[[1]] } return(transfer.results) } else { if (store.weights) { slot(object = query, name = "tools")[["TransferData"]] <- list(weights.matrix = weights) } return(query) } } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param object.list List of Seurat objects #' @rdname AnnotateAnchors #' @export #' @method AnnotateAnchors default #' @concept integration #' AnnotateAnchors.default <- function( anchors, vars = NULL, slot = NULL, object.list, assay = NULL, ... ) { # reorder columns anchors <- anchors[, c("cell1", "dataset1", "cell2", "dataset2", "score")] colnames(x = anchors)[5] <- "anchor.score" cell.names <- lapply(X = object.list, FUN = Cells) cell1.names <- character(length = nrow(x = anchors)) for (dataset in unique(x = anchors$dataset1)) { dataset.cells <- which(x = anchors$dataset1 == dataset) cell1.names[dataset.cells] <- cell.names[[dataset]][anchors[dataset.cells, "cell1"]] } anchors$cell1 <- cell1.names cell2.names <- character(length(x = nrow(x = anchors))) for (dataset in unique(x = anchors$dataset2)) { dataset.cells <- which(x = anchors$dataset2 == dataset) cell2.names[dataset.cells] <- cell.names[[dataset]][anchors[dataset.cells, "cell2"]] } anchors$cell2 <- cell2.names slot <- slot %||% "data" assay <- assay %||% sapply(X = object.list, FUN = DefaultAssay) if (length(x = assay) == 1) { assay <- rep(x = assay, times = length(x = object.list)) } if (length(x = assay) != length(x = object.list)) { stop("Number of assays provided should either be one or the length of object.list") } for (ob in 1:length(x = object.list)) { DefaultAssay(object = object.list[[ob]]) <- assay[ob] } if (length(x = slot) == 1) { slot <- rep(x = slot, times = length(x = vars)) } if (length(x = vars) > 0) { for(v in 1:length(x = vars)) { var <- vars[v] var.list <- lapply(X = object.list, FUN = function(x) { tryCatch( expr = FetchData(object = x, vars = var, slot = slot[v]), error = function(e) { data.fetched <- as.data.frame( x = rep(x = NA, times = ncol(x = x)), row.names = Cells(x = x), stringsAsFactors = FALSE ) colnames(x = data.fetched) <- var return(data.fetched) } ) }) if (all(unlist(x = lapply(X = var.list, FUN = isFALSE)))) { warning( var, " not found in all objects", call. = FALSE, immediate. = TRUE ) next } if (any(unlist(x = lapply(X = var.list, FUN = isFALSE)))) { warning( var, " not in all objects. Filling missing objects with NA", call. = FALSE, immediate. = TRUE ) } if (is.null(x = names(x = object.list))) { names(x = var.list) <- 1:length(x = object.list) } else { names(x = var.list) <- names(x = object.list) } for(i in c(1, 2)) { cell <- paste0("cell", i) if (is.factor(x = anchors[, cell])) { anchors[, cell] <- as.character(x = anchors[, cell]) } for (j in unique(x = anchors[, paste0("dataset", i)])) { var.df <- var.list[[j]] dataset.cells <- which(x = anchors[, paste0("dataset", i)] == j) anchors[dataset.cells, paste0(cell, ".", var)] <- var.df[anchors[, cell][dataset.cells], ] } } # column specifying whether the annotation matches across pair of datasets anchors[, paste0(var, ".match")] <- anchors[, paste0("cell1.", var)] == anchors[, paste0("cell2.", var)] } } return(anchors) } #' @rdname AnnotateAnchors #' @export #' @method AnnotateAnchors IntegrationAnchorSet #' AnnotateAnchors.IntegrationAnchorSet <- function( anchors, vars = NULL, slot = NULL, object.list = NULL, assay = NULL, ... ) { anchor.df <- slot(object = anchors, name = 'anchors') object.list <- object.list %||% slot(object = anchors, name = 'object.list') anchor.df <- as.data.frame(x = anchor.df) anchor.df <- AnnotateAnchors( anchors = anchor.df, vars = vars, slot = slot, object.list = object.list, assay = assay ) return(anchor.df) } #' @param reference Reference object used in \code{\link{FindTransferAnchors}} #' @param query Query object used in \code{\link{FindTransferAnchors}} #' @rdname AnnotateAnchors #' @export #' @method AnnotateAnchors TransferAnchorSet #' AnnotateAnchors.TransferAnchorSet <- function( anchors, vars = NULL, slot = NULL, reference = NULL, query = NULL, assay = NULL, ... ) { anchor.df <- slot(object = anchors, name = 'anchors') if (class(x = reference) != class(x = query)) { stop("If setting reference/query, please set both parameters.") } if (is.null(x = reference)) { object.list <- slot(object = anchors, name = 'object.list')[[1]] reference.cells <- slot(object = anchors, name = "reference.cells") reference <- subset(x = object.list, cells = reference.cells, recompute = FALSE) reference <- RenameCells( object = reference, new.names = gsub(pattern = "_reference$", replacement = "", x = reference.cells) ) query.cells <- slot(object = anchors, name = "query.cells") query <- subset(x = object.list, cells = query.cells, recompute = FALSE) query <- RenameCells( object = query, new.names = gsub(pattern = "_query$", replacement = "", x = query.cells) ) } object.list <- list(reference = reference, query = query) anchor.df <- as.data.frame(x = anchor.df) anchor.df$dataset1 <- "reference" anchor.df$dataset2 <- "query" anchor.df <- AnnotateAnchors( anchors = anchor.df, vars = vars, slot = slot, object.list = object.list, assay = assay ) return(anchor.df) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Add dataset number and remove cell offset # # Record which dataset number in the original list of Seurat objects # each anchor cell came from, and correct the cell index so it corresponds to # the position of the anchor cell in its own dataset # # @param anchor.df Dataframe of anchors # @param offsets size of each dataset in anchor dataframe # @param obj.length Vector of object lengths # # @return Anchor dataframe with additional columns corresponding to the dataset # of each cell AddDatasetID <- function( anchor.df, offsets, obj.lengths ) { ndataset <- length(x = offsets) total.cells <- sum(obj.lengths) offsets <- c(offsets, total.cells) row.offset <- rep.int(x = offsets[1:ndataset], times = obj.lengths) dataset <- rep.int(x = 1:ndataset, times = obj.lengths) anchor.df <- data.frame( 'cell1' = anchor.df[, 1] - row.offset[anchor.df[, 1]], 'cell2' = anchor.df[, 2] - row.offset[anchor.df[, 2]], 'score' = anchor.df[, 3], 'dataset1' = dataset[anchor.df[, 1]], 'dataset2' = dataset[anchor.df[, 2]] ) return(anchor.df) } # Adjust sample tree to only include given reference objects # # @param x A sample tree # @param reference.objects a sorted list of reference object IDs # AdjustSampleTree <- function(x, reference.objects) { for (i in 1:nrow(x = x)) { obj.id <- -(x[i, ]) if (obj.id[[1]] > 0) { x[i, 1] <- -(reference.objects[[obj.id[[1]]]]) } if (obj.id[[2]] > 0) { x[i, 2] <- -(reference.objects[[obj.id[[2]]]]) } } return(x) } # Build tree of datasets based on cell similarity # # @param similarity.matrix Dataset similarity matrix # # @return Returns a heirarchical clustering of datasets # #' @importFrom stats hclust # BuildSampleTree <- function(similarity.matrix) { dist.mat <- as.dist(m = 1 / similarity.matrix) clusters <- hclust(d = dist.mat) return(clusters$merge) } # Construct nearest neighbor matrix from nn.idx # # @param nn.idx Nearest neighbor index matrix (nn.idx from RANN) # @param offset1 Offsets for the first neighbor # @param offset2 Offsets for the second neighbor # # @return returns a sparse matrix representing the NN matrix # ConstructNNMat <- function(nn.idx, offset1, offset2, dims) { k <- ncol(x = nn.idx) j <- as.numeric(x = t(x = nn.idx)) + offset2 i <- ((1:length(x = j)) - 1) %/% k + 1 + offset1 nn.mat <- sparseMatrix(i = i, j = j, x = 1, dims = dims) return(nn.mat) } # Count anchors between all datasets # # Counts anchors between each dataset and scales based on total number of cells # in the datasets # # @param anchor.df Matrix of anchors # @param offsets Dataset sizes in anchor matrix. Used to identify boundaries of # each dataset in matrix, so that total pairwise anchors between all datasets # can be counted # # @return Returns a similarity matrix # CountAnchors <- function( anchor.df, offsets, obj.lengths ) { similarity.matrix <- matrix(data = 0, ncol = length(x = offsets), nrow = length(x = offsets)) similarity.matrix[upper.tri(x = similarity.matrix, diag = TRUE)] <- NA total.cells <- sum(obj.lengths) offsets <- c(offsets, total.cells) for (i in 1:nrow(x = similarity.matrix)){ for (j in 1:ncol(x = similarity.matrix)){ if (!is.na(x = similarity.matrix[i, j])){ relevant.rows <- anchor.df[(anchor.df$dataset1 %in% c(i, j)) & (anchor.df$dataset2 %in% c(i, j)), ] score <- nrow(x = relevant.rows) ncell <- min(obj.lengths[[i]], obj.lengths[[j]]) similarity.matrix[i, j] <- score / ncell } } } return(similarity.matrix) } FilterAnchors <- function( object, assay = NULL, slot = "data", integration.name = 'integrated', features = NULL, k.filter = 200, nn.method = "annoy", n.trees = 50, eps = 0, verbose = TRUE ) { if (verbose) { message("Filtering anchors") } assay <- assay %||% DefaultAssay(object = object) features <- features %||% VariableFeatures(object = object) if (length(x = features) == 0) { stop("No features provided and no VariableFeatures computed.") } features <- unique(x = features) neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = 'neighbors') nn.cells1 <- neighbors$cells1 nn.cells2 <- neighbors$cells2 if (min(length(x = nn.cells1), length(x = nn.cells2)) < k.filter) { warning("Number of anchor cells is less than k.filter. Retaining all anchors.") k.filter <- min(length(x = nn.cells1), length(x = nn.cells2)) anchors <- GetIntegrationData(object = object, integration.name = integration.name, slot = "anchors") } else { cn.data1 <- L2Norm( mat = as.matrix(x = t(x = GetAssayData( object = object[[assay[1]]], slot = slot)[features, nn.cells1])), MARGIN = 1) cn.data2 <- L2Norm( mat = as.matrix(x = t(x = GetAssayData( object = object[[assay[2]]], slot = slot)[features, nn.cells2])), MARGIN = 1) nn <- NNHelper( data = cn.data2[nn.cells2, ], query = cn.data1[nn.cells1, ], k = k.filter, method = nn.method, n.trees = n.trees, eps = eps ) anchors <- GetIntegrationData(object = object, integration.name = integration.name, slot = "anchors") position <- sapply(X = 1:nrow(x = anchors), FUN = function(x) { which(x = anchors[x, "cell2"] == Indices(object = nn)[anchors[x, "cell1"], ])[1] }) anchors <- anchors[!is.na(x = position), ] if (verbose) { message("\tRetained ", nrow(x = anchors), " anchors") } } object <- SetIntegrationData( object = object, integration.name = integration.name, slot = "anchors", new.data = anchors ) return(object) } FindAnchors_v3 <- function( object.pair, assay, slot, cells1, cells2, internal.neighbors, reduction, reduction.2 = character(), nn.reduction = reduction, dims = 1:10, k.anchor = 5, k.filter = 200, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, nn.idx1 = NULL, nn.idx2 = NULL, eps = 0, projected = FALSE, verbose = TRUE ) { # compute local neighborhoods, use max of k.anchor and k.score if also scoring to avoid # recomputing neighborhoods k.neighbor <- k.anchor if (!is.na(x = k.score)) { k.neighbor <- max(k.anchor, k.score) } object.pair <- FindNN( object = object.pair, cells1 = cells1, cells2 = cells2, internal.neighbors = internal.neighbors, dims = dims, reduction = reduction, reduction.2 = reduction.2, nn.reduction = nn.reduction, k = k.neighbor, nn.method = nn.method, n.trees = n.trees, nn.idx1 = nn.idx1, nn.idx2 = nn.idx2, eps = eps, verbose = verbose ) object.pair <- FindAnchorPairs( object = object.pair, integration.name = "integrated", k.anchor = k.anchor, verbose = verbose ) if (!is.na(x = k.filter)) { top.features <- TopDimFeatures( object = object.pair, reduction = reduction, dims = dims, features.per.dim = 100, max.features = max.features, projected = projected ) if(length(top.features) == 2){ top.features <- intersect(top.features[[1]], top.features[[2]]) } else{ top.features <- as.vector(top.features) } top.features <- top.features[top.features %in% rownames(x = object.pair)] object.pair <- FilterAnchors( object = object.pair, assay = assay, slot = slot, integration.name = 'integrated', features = top.features, k.filter = k.filter, nn.method = nn.method, n.trees = n.trees, eps = eps, verbose = verbose ) } if (!is.na(x = k.score)) { object.pair = ScoreAnchors( object = object.pair, assay = DefaultAssay(object = object.pair), integration.name = "integrated", verbose = verbose, k.score = k.score ) } anchors <- GetIntegrationData( object = object.pair, integration.name = 'integrated', slot = 'anchors' ) return(anchors) } FindAnchors_v5 <- function( object.pair, assay, slot, cells1, cells2, internal.neighbors, reduction, reduction.2 = character(), nn.reduction = reduction, dims = 1:10, k.anchor = 5, k.filter = 200, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, nn.idx1 = NULL, nn.idx2 = NULL, eps = 0, projected = FALSE, verbose = TRUE ) { ref.assay <- assay[1] query.assay <- assay[2] reference.layers <- Layers(object.pair[[ref.assay]], search = 'data')[1] query.layers <- setdiff(Layers(object.pair[[query.assay]], search = 'data'), reference.layers) anchor.list <- list() for (i in seq_along(query.layers)) { cells2.i <- Cells( x = object.pair[[query.assay]], layer = query.layers[i] ) object.pair.i <- subset( x = object.pair, cells = c(cells1, cells2.i) ) object.pair.i <- JoinLayers(object.pair.i) anchor.list[[i]] <- FindAnchors_v3( object.pair = object.pair.i, assay = assay, slot = slot, cells1 = cells1, cells2 = cells2.i, internal.neighbors = internal.neighbors, reduction = reduction, reduction.2 = reduction.2, nn.reduction = nn.reduction, dims = dims, k.anchor = k.anchor, k.filter = k.filter, k.score = k.score, max.features = max.features, nn.method = nn.method, n.trees = n.trees, nn.idx1 = nn.idx1, nn.idx2 = nn.idx2, eps = eps, projected = projected, verbose = verbose ) anchor.list[[i]][,2] <- match(x = cells2.i, table = cells2)[anchor.list[[i]][,2]] anchor.list[[i]] <- t(anchor.list[[i]]) } anchors <- t(x = matrix( data = unlist(x = anchor.list), nrow = 3, ncol = sum( sapply(X = anchor.list, FUN = function(x) ncol(x)) ) ) ) colnames(anchors) <- c('cell1', 'cell2', 'score') return(anchors) } FindAnchors <- function( object.pair, assay, slot, cells1, cells2, internal.neighbors, reduction, reduction.2 = character(), nn.reduction = reduction, dims = 1:10, k.anchor = 5, k.filter = 200, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, nn.idx1 = NULL, nn.idx2 = NULL, eps = 0, projected = FALSE, verbose = TRUE ) { if (inherits(x = object.pair[[assay[1]]], what = 'Assay')) { FindAnchors.function <- FindAnchors_v3 } else if (inherits(x = object.pair[[assay[1]]], what = 'Assay5')) { FindAnchors.function <- FindAnchors_v5 } anchors <- FindAnchors.function( object.pair = object.pair, assay = assay, slot = slot, cells1 = cells1, cells2 = cells2, internal.neighbors = internal.neighbors, reduction = reduction, reduction.2 = reduction.2, nn.reduction = nn.reduction, dims = dims, k.anchor = k.anchor, k.filter = k.filter, k.score = k.score, max.features = max.features, nn.method = nn.method, n.trees = n.trees, nn.idx1 = nn.idx1, nn.idx2 = nn.idx2, eps = eps, projected = projected, verbose = verbose ) return(anchors) } # Find Anchor pairs # FindAnchorPairs <- function( object, integration.name = 'integrated', k.anchor = 5, verbose = TRUE ) { neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = 'neighbors') max.nn <- c(ncol(x = neighbors$nnab), ncol(x = neighbors$nnba)) if (any(k.anchor > max.nn)) { message(paste0('warning: requested k.anchor = ', k.anchor, ', only ', min(max.nn), ' in dataset')) k.anchor <- min(max.nn) } if (verbose) { message("Finding anchors") } # convert cell name to neighbor index nn.cells1 <- neighbors$cells1 nn.cells2 <- neighbors$cells2 cell1.index <- suppressWarnings(which(colnames(x = object) == nn.cells1, arr.ind = TRUE)) ncell <- 1:nrow(x = neighbors$nnab) ncell <- ncell[ncell %in% cell1.index] anchors <- list() # pre allocate vector anchors$cell1 <- rep(x = 0, length(x = ncell) * 5) anchors$cell2 <- anchors$cell1 anchors$score <- anchors$cell1 + 1 idx <- 0 indices.ab <- Indices(object = neighbors$nnab) indices.ba <- Indices(object = neighbors$nnba) for (cell in ncell) { neighbors.ab <- indices.ab[cell, 1:k.anchor] mutual.neighbors <- which( x = indices.ba[neighbors.ab, 1:k.anchor, drop = FALSE] == cell, arr.ind = TRUE )[, 1] for (i in neighbors.ab[mutual.neighbors]){ idx <- idx + 1 anchors$cell1[idx] <- cell anchors$cell2[idx] <- i anchors$score[idx] <- 1 } } anchors$cell1 <- anchors$cell1[1:idx] anchors$cell2 <- anchors$cell2[1:idx] anchors$score <- anchors$score[1:idx] anchors <- t(x = do.call(what = rbind, args = anchors)) anchors <- as.matrix(x = anchors) object <- SetIntegrationData( object = object, integration.name = integration.name, slot = 'anchors', new.data = anchors ) if (verbose) { message(paste0("\tFound ", nrow(x = anchors), " anchors")) } return(object) } FindIntegrationMatrix <- function( object, assay = NULL, integration.name = 'integrated', features.integrate = NULL, verbose = TRUE ) { assay <- assay %||% DefaultAssay(object = object) neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = 'neighbors') nn.cells1 <- neighbors$cells1 nn.cells2 <- neighbors$cells2 if (inherits(x = object[[assay[1]]], what = 'Assay5')) { object <- JoinLayers(object) } anchors <- GetIntegrationData( object = object, integration.name = integration.name, slot = 'anchors' ) if (verbose) { message("Finding integration vectors") } features.integrate <- features.integrate %||% rownames( x = GetAssayData(object = object, assay = assay, slot = "data") ) data.use1 <- t(x = GetAssayData( object = object, assay = assay, slot = "data")[features.integrate, nn.cells1] ) data.use2 <- t(x = GetAssayData( object = object, assay = assay, slot = "data")[features.integrate, nn.cells2] ) anchors1 <- nn.cells1[anchors[, "cell1"]] anchors2 <- nn.cells2[anchors[, "cell2"]] data.use1 <- data.use1[anchors1, ] data.use2 <- data.use2[anchors2, ] integration.matrix <- data.use2 - data.use1 object <- SetIntegrationData( object = object, integration.name = integration.name, slot = 'integration.matrix', new.data = integration.matrix ) return(object) } # Find nearest neighbors # FindNN <- function( object, cells1 = NULL, cells2 = NULL, internal.neighbors, grouping.var = NULL, dims = 1:10, reduction = "cca.l2", reduction.2 = character(), nn.dims = dims, nn.reduction = reduction, k = 300, nn.method = "annoy", n.trees = 50, nn.idx1 = NULL, nn.idx2 = NULL, eps = 0, integration.name = 'integrated', verbose = TRUE ) { if (xor(x = is.null(x = cells1), y = is.null(x = cells2))) { stop("cells1 and cells2 must both be specified") } if (!is.null(x = cells1) && !is.null(x = cells2) && !is.null(x = grouping.var)) { stop("Specify EITHER grouping.var or cells1/2.") } if (is.null(x = cells1) && is.null(x = cells2) && is.null(x = grouping.var)) { stop("Please set either cells1/2 or grouping.var") } if (!is.null(x = grouping.var)) { if (nrow(x = unique(x = object[[grouping.var]])) != 2) { stop("Number of groups in grouping.var not equal to 2.") } groups <- names(x = sort(x = table(object[[grouping.var]]), decreasing = TRUE)) cells1 <- colnames(x = object)[object[[grouping.var]] == groups[[1]]] cells2 <- colnames(x = object)[object[[grouping.var]] == groups[[2]]] } if (verbose) { message("Finding neighborhoods") } dim.data.self <- Embeddings(object = object[[nn.reduction]])[, nn.dims] if (!is.null(x = internal.neighbors[[1]])) { nnaa <- internal.neighbors[[1]] } else { dims.cells1.self <- dim.data.self[cells1, ] nnaa <- NNHelper( data = dims.cells1.self, k = k + 1, method = nn.method, n.trees = n.trees, eps = eps, cache.index = TRUE, index = nn.idx1 ) nn.idx1 <- Index(object = nnaa) } if (!is.null(x = internal.neighbors[[2]])) { nnbb <- internal.neighbors[[2]] } else { dims.cells2.self <- dim.data.self[cells2, ] nnbb <- NNHelper( data = dims.cells2.self, k = k + 1, method = nn.method, n.trees = n.trees, eps = eps, cache.index = TRUE ) nn.idx2 <- Index(object = nnbb) } if (length(x = reduction.2) > 0) { nnab <- NNHelper( data = Embeddings(object = object[[reduction.2]])[cells2, nn.dims], query = Embeddings(object = object[[reduction.2]])[cells1, nn.dims], k = k, method = nn.method, n.trees = n.trees, eps = eps, index = if (reduction.2 == nn.reduction) nn.idx2 else NULL ) nnba <- NNHelper( data = Embeddings(object = object[[reduction]])[cells1, nn.dims], query = Embeddings(object = object[[reduction]])[cells2, nn.dims], k = k, method = nn.method, n.trees = n.trees, eps = eps, index = if (reduction == nn.reduction) nn.idx1 else NULL ) } else { dim.data.opposite <- Embeddings(object = object[[reduction]])[ ,dims] dims.cells1.opposite <- dim.data.opposite[cells1, ] dims.cells2.opposite <- dim.data.opposite[cells2, ] nnab <- NNHelper( data = dims.cells2.opposite, query = dims.cells1.opposite, k = k, method = nn.method, n.trees = n.trees, eps = eps, index = if (reduction == nn.reduction) nn.idx2 else NULL ) nnba <- NNHelper( data = dims.cells1.opposite, query = dims.cells2.opposite, k = k, method = nn.method, n.trees = n.trees, eps = eps, index = if (reduction == nn.reduction) nn.idx1 else NULL ) } object <- SetIntegrationData( object = object, integration.name = integration.name, slot = 'neighbors', new.data = list('nnaa' = nnaa, 'nnab' = nnab, 'nnba' = nnba, 'nnbb' = nnbb, 'cells1' = cells1, 'cells2' = cells2) ) return(object) } # @param reduction a DimReduc object containing cells in the query object # @param reverse Compute weights matrix for reference anchors that are nearest # to query cells. Used in mapping metric to perform projection of query cells # back from reference space. FindWeights <- function( object, reduction = NULL, assay = NULL, integration.name = 'integrated', dims = 1:10, features = NULL, k = 300, sd.weight = 1, nn.method = "annoy", n.trees = 50, eps = 0, reverse = FALSE, verbose = TRUE ) { if (verbose) { message("Finding integration vector weights") } if (is.null(x = reduction) & is.null(x = features)) { stop("Need to specify either dimension reduction object or a set of features") } assay <- assay %||% DefaultAssay(object = object) neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = 'neighbors') nn.cells1 <- neighbors$cells1 nn.cells2 <- neighbors$cells2 anchors <- GetIntegrationData( object = object, integration.name = integration.name, slot = 'anchors' ) if (reverse) { anchors.cells2 <- nn.cells2[anchors[, "cell2"]] anchors.cells1 <- nn.cells1[anchors[, "cell1"]] to.keep <- !duplicated(x = anchors.cells1) anchors.cells1 <- anchors.cells1[to.keep] anchors.cells2 <- anchors.cells2[to.keep] if (length(anchors.cells1) < k || length(anchors.cells2) < k) { stop("Number of anchor cells is less than k.weight. Consider lowering k.weight to less than ", min(length(anchors.cells1), length(anchors.cells2)), " or increase k.anchor.") } if (is.null(x = features)) { data.use <- Embeddings(object = reduction)[nn.cells1, dims] data.use.query <- Embeddings(object = reduction)[nn.cells2, dims] } else { data.use <- t(x = GetAssayData( object = object, slot = 'data', assay = assay)[features, nn.cells1] ) data.use.query <- t(x = GetAssayData( object = object, slot = 'data', assay = assay)[features, nn.cells2] ) } knn_2_2 <- NNHelper( data = data.use[anchors.cells1, ], query = data.use.query, k = k, method = nn.method, n.trees = n.trees, eps = eps ) } else { anchors.cells2 <- unique(x = nn.cells2[anchors[, "cell2"]]) if (length(anchors.cells2) < k) { stop("Number of anchor cells is less than k.weight. Consider lowering k.weight to less than ", length(anchors.cells2), " or increase k.anchor.") } if (is.null(x = features)) { data.use <- Embeddings(reduction)[nn.cells2, dims] } else { data.use <- t(x = GetAssayData(object = object, slot = 'data', assay = assay)[features, nn.cells2]) } knn_2_2 <- NNHelper( data = data.use[anchors.cells2, ], query = data.use, k = k, method = nn.method, n.trees = n.trees, eps = eps ) } distances <- Distances(object = knn_2_2) distances <- 1 - (distances / distances[, ncol(x = distances)]) cell.index <- Indices(object = knn_2_2) integration.matrix <- GetIntegrationData( object = object, integration.name = integration.name, slot = "integration.matrix" ) weights <- FindWeightsC( cells2 = 0:(length(x = nn.cells2) - 1), distances = as.matrix(x = distances), anchor_cells2 = anchors.cells2, integration_matrix_rownames = rownames(x = integration.matrix), cell_index = cell.index, anchor_score = anchors[, "score"], min_dist = 0, sd = sd.weight, display_progress = verbose ) object <- SetIntegrationData( object = object, integration.name = integration.name, slot = 'weights', new.data = weights ) return(object) } # Find weight matrix between query and reference cells from a neighbor object # # FindWeightsNN <- function( nn.obj, query.cells, reference.cells, verbose = TRUE ) { distances <- Distances(object = nn.obj) distances <- 1 - (distances / distances[, ncol(x = distances)]) cell.index <- Indices(object = nn.obj) weights <- FindWeightsC( cells2 = 0:(length(query.cells) - 1), distances = as.matrix(x = distances), anchor_cells2 = reference.cells, integration_matrix_rownames = reference.cells, cell_index = cell.index, anchor_score = rep(1, length(reference.cells)), min_dist = 0, sd = 1, display_progress = verbose ) colnames(weights) <- query.cells return(weights) } # Work out the anchor cell offsets for given set of cells in anchor list # # @param anchors A dataframe of anchors, from AnchorSet object # @param dataset Dataset number (1 or 2) # @param cell Cell number (1 or 2) # @param cellnames.list List of cell names in all objects # @param cellnames list of cell names for only the object in question # # @return Returns a list of offsets # GetCellOffsets <- function(anchors, dataset, cell, cellnames.list, cellnames) { cell.id <- sapply(X = 1:nrow(x = anchors), FUN = function(x) { cellnames.list[[anchors[, dataset+3][x]]][anchors[, cell][x]] }) cell.offset <- sapply( X = 1:length(x = cell.id), FUN = function(x) { return(which(x = cellnames == cell.id[x])) } ) return(cell.offset) } # Map queries to reference # # Map query objects onto assembled reference dataset # # @param anchorset Anchorset found by FindIntegrationAnchors # @param reference Pre-integrated reference dataset to map query datasets to # @param new.assay.name Name for the new assay containing the integrated data # @param normalization.method Name of normalization method used: LogNormalize # or SCT # @param features Vector of features to use when computing the PCA to determine the weights. Only set # if you want a different set from those used in the anchor finding process # @param features.to.integrate Vector of features to integrate. By default, will use the features # used in anchor finding. # @param dims Number of PCs to use in the weighting procedure # @param k.weight Number of neighbors to consider when weighting # @param weight.reduction Dimension reduction to use when calculating anchor weights. # This can be either: # \itemize{ # \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} # \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} # \item{NULL, in which case a new PCA will be calculated and used to calculate anchor weights} # } # Note that, if specified, the requested dimension reduction will only be used for calculating anchor weights in the # first merge between reference and query, as the merged object will subsequently contain more cells than was in # query, and weights will need to be calculated for all cells in the object. # @param sd.weight Controls the bandwidth of the Gaussian kernel for weighting # @param preserve.order Do not reorder objects based on size for each pairwise integration. # @param eps Error bound on the neighbor finding algorithm (from \code{\link[RANN]{RANN}}) # @param verbose Print progress bars and output # # @return Returns an integrated matrix # MapQueryData <- function( anchorset, reference, new.assay.name = "integrated", normalization.method = c("LogNormalize", "SCT"), features = NULL, features.to.integrate = NULL, dims = 1:30, k.weight = 100, weight.reduction = NULL, weights.matrix = NULL, no.offset = FALSE, sd.weight = 1, preserve.order = FALSE, eps = 0, verbose = TRUE ) { normalization.method <- match.arg(arg = normalization.method) reference.datasets <- slot(object = anchorset, name = 'reference.objects') object.list <- slot(object = anchorset, name = 'object.list') anchors <- slot(object = anchorset, name = 'anchors') features <- features %||% slot(object = anchorset, name = "anchor.features") features.to.integrate <- features.to.integrate %||% features cellnames.list <- list() for (ii in 1:length(x = object.list)) { cellnames.list[[ii]] <- colnames(x = object.list[[ii]]) } if (length(x = reference.datasets) == length(x = object.list)) { query.datasets <- NULL } else { query.datasets <- setdiff(x = seq_along(along.with = object.list), y = reference.datasets) } my.lapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pblapply, no = future_lapply ) query.corrected <- my.lapply( X = query.datasets, FUN = function(dataset1) { if (verbose) { message("\nIntegrating dataset ", dataset1, " with reference dataset") } filtered.anchors <- anchors[anchors$dataset1 %in% reference.datasets & anchors$dataset2 == dataset1, ] integrated <- RunIntegration( filtered.anchors = filtered.anchors, reference = reference, query = object.list[[dataset1]], new.assay.name = new.assay.name, normalization.method = normalization.method, cellnames.list = cellnames.list, features.to.integrate = features.to.integrate, weight.reduction = weight.reduction, weights.matrix = weights.matrix, no.offset = no.offset, features = features, dims = dims, k.weight = k.weight, sd.weight = sd.weight, eps = eps, verbose = verbose ) return(integrated) } ) reference.integrated <- GetAssayData( object = reference, slot = 'data' )[features.to.integrate, ] query.corrected[[length(x = query.corrected) + 1]] <- reference.integrated all.integrated <- do.call(cbind, query.corrected) return(all.integrated) } # Convert nearest neighbor information to a sparse matrix # # @param idx Nearest neighbor index # @param distance Nearest neighbor distance # @param k Number of nearest neighbors # NNtoMatrix <- function(idx, distance, k) { nn <- list() x <- 1 for (i in 1:nrow(x = idx)) { for (j in 2:k) { nn.idx <- idx[i, j] nn.dist <- distance[i, j] nn[[x]] <- c('i' = i, 'j' = nn.idx, 'x' = 1/nn.dist) x <- x + 1 } } nn <- do.call(what = rbind, args = nn) nn.matrix <- new( Class = 'dgTMatrix', i = as.integer(x = nn[, 1] - 1), j = as.integer(x = nn[, 2] - 1), x = as.numeric(x = nn[, 3]), Dim = as.integer(x = c(nrow(idx), nrow(x = idx))) ) nn.matrix <- as.sparse(x = nn.matrix) return(nn.matrix) } # Pairwise dataset integration # # Used for reference construction # # @param anchorset Results from FindIntegrationAnchors # @param new.assay.name Name for the new assay containing the integrated data # @param normalization.method Name of normalization method used: LogNormalize # or SCT # @param features Vector of features to use when computing the PCA to determine # the weights. Only set if you want a different set from those used in the # anchor finding process # @param features.to.integrate Vector of features to integrate. By default, # will use the features used in anchor finding. # @param dims Number of PCs to use in the weighting procedure # @param k.weight Number of neighbors to consider when weighting # @param weight.reduction Dimension reduction to use when calculating anchor # weights. This can be either: # \itemize{ # \item{A string, specifying the name of a dimension reduction present in # all objects to be integrated} # \item{A vector of strings, specifying the name of a dimension reduction to # use for each object to be integrated} # \item{NULL, in which case a new PCA will be calculated and used to # calculate anchor weights} # } # Note that, if specified, the requested dimension reduction will only be used # for calculating anchor weights in the first merge between reference and # query, as the merged object will subsequently contain more cells than was in # query, and weights will need to be calculated for all cells in the object. # @param sd.weight Controls the bandwidth of the Gaussian kernel for weighting # @param sample.tree Specify the order of integration. If NULL, will compute # automatically. # @param preserve.order Do not reorder objects based on size for each pairwise # integration. # @param eps Error bound on the neighbor finding algorithm (from # \code{\link[RANN]{RANN}}) # @param verbose Print progress bars and output # # @return Returns a Seurat object with a new integrated Assay # PairwiseIntegrateReference <- function( anchorset, new.assay.name = "integrated", normalization.method = c("LogNormalize", "SCT"), features = NULL, features.to.integrate = NULL, dims = 1:30, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, eps = 0, verbose = TRUE ) { object.list <- slot(object = anchorset, name = "object.list") reference.objects <- slot(object = anchorset, name = "reference.objects") features <- features %||% slot(object = anchorset, name = "anchor.features") features.to.integrate <- features.to.integrate %||% features if (length(x = reference.objects) == 1) { ref.obj <- object.list[[reference.objects]] ref.obj[[new.assay.name]] <- CreateAssayObject( data = GetAssayData(ref.obj, slot = 'data')[features.to.integrate, ], check.matrix = FALSE ) DefaultAssay(object = ref.obj) <- new.assay.name return(ref.obj) } anchors <- slot(object = anchorset, name = "anchors") offsets <- slot(object = anchorset, name = "offsets") objects.ncell <- sapply(X = object.list, FUN = ncol) if (!is.null(x = weight.reduction)) { if (length(x = weight.reduction) == 1 | inherits(x = weight.reduction, what = "DimReduc")) { if (length(x = object.list) == 2) { weight.reduction <- list(NULL, weight.reduction) } else if (inherits(x = weight.reduction, what = "character")) { weight.reduction <- as.list(x = rep(x = weight.reduction, times = length(x = object.list))) } else { stop("Invalid input for weight.reduction. Please specify either the names of the dimension", "reduction for each object in the list or provide DimReduc objects.") } } if (length(x = weight.reduction) != length(x = object.list)) { stop("Please specify a dimension reduction for each object, or one dimension reduction to be used for all objects") } if (inherits(x = weight.reduction, what = "character")) { weight.reduction <- as.list(x = weight.reduction) } available.reductions <- lapply(X = object.list, FUN = FilterObjects, classes.keep = 'DimReduc') for (ii in 1:length(x = weight.reduction)) { if (ii == 1 & is.null(x = weight.reduction[[ii]])) next if (!inherits(x = weight.reduction[[ii]], what = "DimReduc")) { if (!weight.reduction[[ii]] %in% available.reductions[[ii]]) { stop("Requested dimension reduction (", weight.reduction[[ii]], ") is not present in object ", ii) } weight.reduction[[ii]] <- object.list[[ii]][[weight.reduction[[ii]]]] } } } if (is.null(x = sample.tree)) { similarity.matrix <- CountAnchors( anchor.df = anchors, offsets = offsets, obj.lengths = objects.ncell ) similarity.matrix <- similarity.matrix[reference.objects, reference.objects] sample.tree <- BuildSampleTree(similarity.matrix = similarity.matrix) sample.tree <- AdjustSampleTree(x = sample.tree, reference.objects = reference.objects) } cellnames.list <- list() for (ii in 1:length(x = object.list)) { cellnames.list[[ii]] <- colnames(x = object.list[[ii]]) } unintegrated <- suppressWarnings(expr = merge( x = object.list[[reference.objects[[1]]]], y = object.list[reference.objects[2:length(x = reference.objects)]] )) names(x = object.list) <- as.character(-(1:length(x = object.list))) if (!is.null(x = weight.reduction)) { names(x = weight.reduction) <- names(x = object.list) } if (verbose & (length(x = reference.objects) != length(x = object.list))) { message("Building integrated reference") } for (ii in 1:nrow(x = sample.tree)) { merge.pair <- as.character(x = sample.tree[ii, ]) length1 <- ncol(x = object.list[[merge.pair[1]]]) length2 <- ncol(x = object.list[[merge.pair[2]]]) if (!(preserve.order) & (length2 > length1)) { merge.pair <- rev(x = merge.pair) sample.tree[ii, ] <- as.numeric(merge.pair) } if (!is.null(x = weight.reduction)) { # extract the correct dimreduc objects, in the correct order weight.pair <- weight.reduction[merge.pair] } else { weight.pair <- NULL } object.1 <- DietSeurat( object = object.list[[merge.pair[1]]], assays = DefaultAssay(object = object.list[[merge.pair[1]]]), counts = FALSE ) object.2 <- DietSeurat( object = object.list[[merge.pair[2]]], assays = DefaultAssay(object = object.list[[merge.pair[2]]]), counts = FALSE ) # suppress key duplication warning suppressWarnings(object.1[["ToIntegrate"]] <- object.1[[DefaultAssay(object = object.1)]]) DefaultAssay(object = object.1) <- "ToIntegrate" object.1 <- DietSeurat(object = object.1, assays = "ToIntegrate") suppressWarnings(object.2[["ToIntegrate"]] <- object.2[[DefaultAssay(object = object.2)]]) DefaultAssay(object = object.2) <- "ToIntegrate" object.2 <- DietSeurat(object = object.2, assays = "ToIntegrate") datasets <- ParseMergePair(sample.tree, ii) if (verbose) { message( "Merging dataset ", paste(datasets$object2, collapse = " "), " into ", paste(datasets$object1, collapse = " ") ) } merged.obj <- merge(x = object.1, y = object.2, merge.data = TRUE) if (verbose) { message("Extracting anchors for merged samples") } filtered.anchors <- anchors[anchors$dataset1 %in% datasets$object1 & anchors$dataset2 %in% datasets$object2, ] integrated.matrix <- RunIntegration( filtered.anchors = filtered.anchors, normalization.method = normalization.method, reference = object.1, query = object.2, cellnames.list = cellnames.list, new.assay.name = new.assay.name, features.to.integrate = features.to.integrate, features = features, dims = dims, weight.reduction = weight.reduction, k.weight = k.weight, sd.weight = sd.weight, eps = eps, verbose = verbose ) integrated.matrix <- cbind(integrated.matrix, GetAssayData(object = object.1, slot = 'data')[features.to.integrate, ]) merged.obj[[new.assay.name]] <- CreateAssayObject(data = integrated.matrix, check.matrix = FALSE) DefaultAssay(object = merged.obj) <- new.assay.name object.list[[as.character(x = ii)]] <- merged.obj object.list[[merge.pair[[1]]]] <- NULL object.list[[merge.pair[[2]]]] <- NULL invisible(x = CheckGC()) } integrated.data <- GetAssayData( object = object.list[[as.character(x = ii)]], assay = new.assay.name, slot = 'data' ) integrated.data <- integrated.data[, colnames(x = unintegrated)] new.assay <- new( Class = 'Assay', counts = new(Class = "dgCMatrix"), data = integrated.data, scale.data = matrix(), var.features = vector(), meta.features = data.frame(row.names = rownames(x = integrated.data)), misc = NULL, key = paste0(new.assay.name, "_") ) unintegrated[[new.assay.name]] <- new.assay # "unintegrated" now contains the integrated assay DefaultAssay(object = unintegrated) <- new.assay.name VariableFeatures(object = unintegrated) <- features if (normalization.method == "SCT"){ unintegrated[[new.assay.name]] <- SetAssayData( object = unintegrated[[new.assay.name]], slot = "scale.data", new.data = as.matrix(x = GetAssayData(object = unintegrated[[new.assay.name]], slot = "data")) ) } unintegrated <- SetIntegrationData( object = unintegrated, integration.name = "Integration", slot = "anchors", new.data = anchors ) unintegrated <- SetIntegrationData( object = unintegrated, integration.name = "Integration", slot = "sample.tree", new.data = sample.tree ) unintegrated[["FindIntegrationAnchors"]] <- slot(object = anchorset, name = "command") suppressWarnings(expr = unintegrated <- LogSeuratCommand(object = unintegrated)) return(unintegrated) } # Parse merge information from dataset clustering # # @param clustering clustering dataframe from hclust ($merge). # Gives the order of merging datasets to get to the root of the tree. # @param i current row in clustering dataframe # ParseMergePair <- function(clustering, i){ # return 2-element list of datasets in first and second object datasets <- list('object1' = clustering[i, 1], 'object2' = clustering[i, 2]) if (datasets$object1 > 0) { datasets$object1 <- ParseRow(clustering, datasets$object1) } if (datasets$object2 > 0) { datasets$object2 <- ParseRow(clustering, datasets$object2) } datasets$object1 <- abs(x = datasets$object1) datasets$object2 <- abs(x = datasets$object2) return(datasets) } # Parse row of clustering order # # Used recursively to work out the dataset composition of a merged object # # @param clustering clustering dataframe from hclust ($merge). # Gives the order of merging datasets to get to the root of the tree. # @param i current row in clustering dataframe # ParseRow <- function(clustering, i){ # returns vector of datasets datasets <- as.list(x = clustering[i, ]) if (datasets[[1]] > 0) { datasets[[1]] <- ParseRow(clustering = clustering, i = datasets[[1]]) } if (datasets[[2]] > 0) { datasets[[2]] <- ParseRow(clustering = clustering, i = datasets[[2]]) } return(unlist(datasets)) } #' @rdname ProjectCellEmbeddings #' @method ProjectCellEmbeddings Seurat #' @export #' #' ProjectCellEmbeddings.Seurat <- function( query, reference, query.assay = NULL, reference.assay = NULL, reduction = "pca", dims = 1:50, normalization.method = c("LogNormalize", "SCT"), scale = TRUE, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) { if (verbose) { message("Projecting cell embeddings") } normalization.method <- match.arg(arg = normalization.method) query.assay <- query.assay %||% DefaultAssay(object = query) reference.assay <- reference.assay %||% DefaultAssay(object = reference) if (normalization.method == 'SCT') { if (!IsSCT(assay = reference[[reference.assay]])) { stop('reference in ', reference.assay, ' assay does not have a SCT model' ) } reference.model.num <- length(slot(object = reference[[reference.assay]], name = "SCTModel.list")) if (reference.model.num > 1) { stop("Given reference assay (", reference.assay, ") has ", reference.model.num , " reference sct models. Please provide a reference assay with a ", " single reference sct model.", call. = FALSE) } else if (reference.model.num == 0) { stop("Given reference assay (", reference.assay, ") doesn't contain a reference SCT model.") } } proj.pca <- ProjectCellEmbeddings( query = query[[query.assay]], reference = reference, reference.assay = reference.assay, reduction = reduction, dims = dims, scale = scale, normalization.method = normalization.method, verbose = verbose, nCount_UMI = nCount_UMI, feature.mean = feature.mean, feature.sd = feature.sd ) return(proj.pca) } #' @rdname ProjectCellEmbeddings #' @method ProjectCellEmbeddings Assay #' @export #' ProjectCellEmbeddings.Assay <- function( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) { features <- Reduce( f = intersect, x = list( rownames(x = Loadings(object = reference[[reduction]])), rownames(x = reference[[reference.assay]]), rownames(x = query) ) ) if (normalization.method == 'SCT') { slot <- 'counts' } else { slot <- 'data' } proj.pca <- ProjectCellEmbeddings( query = GetAssayData( object = query, slot = slot), reference = reference, reference.assay = reference.assay, reduction = reduction, dims = dims, scale = scale, normalization.method = normalization.method, verbose = verbose, features = features, nCount_UMI = nCount_UMI, feature.mean = feature.mean, feature.sd = feature.sd ) return(proj.pca) } #' @rdname ProjectCellEmbeddings #' @method ProjectCellEmbeddings SCTAssay #' @export #' ProjectCellEmbeddings.SCTAssay <- function( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) { if (normalization.method != 'SCT') { warning('Query data is SCT normalized, but normalization.method is set to LogNormalize') } features <- Reduce( f = intersect, x = list( rownames(x = Loadings(object = reference[[reduction]])), rownames(x = reference[[reference.assay]]), rownames(x = query$scale.data) ) ) query.data <- GetAssayData( object = query, slot = "scale.data")[features,] ref.feature.loadings <- Loadings(object = reference[[reduction]])[features, dims] proj.pca <- t(crossprod(x = ref.feature.loadings, y = query.data)) return(proj.pca) } #' @rdname ProjectCellEmbeddings #' @method ProjectCellEmbeddings StdAssay #' @export #' ProjectCellEmbeddings.StdAssay <- function( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) { reference.assay <- reference.assay %||% DefaultAssay(object = reference) features <- Reduce( f = intersect, x = list( rownames(x = Loadings(object = reference[[reduction]])), rownames(x = reference[[reference.assay]]) ) ) if (normalization.method == 'SCT') { layers.set <- Layers(object = query, search = 'counts') } else { layers.set <- Layers(object = query, search = 'data') } proj.pca.list <- list() cell.list <- list() for (i in seq_along(layers.set)) { proj.pca.list[[i]] <- t(ProjectCellEmbeddings( query = LayerData(object = query, layer = layers.set[i]), reference = reference, reference.assay = reference.assay, reduction = reduction, dims = dims, scale = scale, normalization.method = normalization.method, verbose = verbose, features = features, nCount_UMI = nCount_UMI[Cells(x = query, layer = layers.set[i])], feature.mean = feature.mean, feature.sd = feature.sd )) cell.list[[i]] <- colnames(proj.pca.list[[i]]) } proj.pca <- matrix( data = unlist(proj.pca.list), nrow = nrow(proj.pca.list[[1]]), ncol = ncol(query) ) rownames(proj.pca) <- rownames(proj.pca.list[[1]]) colnames(proj.pca) <- unlist(cell.list) proj.pca <- t(proj.pca) proj.pca <- proj.pca[colnames(query),] return(proj.pca) } #' @rdname ProjectCellEmbeddings #' @method ProjectCellEmbeddings default #' @export #' ProjectCellEmbeddings.default <- function( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, features = NULL, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ){ features <- features %||% rownames(x = Loadings(object = reference[[reduction]])) if (normalization.method == 'SCT') { reference.SCT.model <- slot(object = reference[[reference.assay]], name = "SCTModel.list")[[1]] query <- FetchResiduals_reference( object = query, reference.SCT.model = reference.SCT.model, features = features, nCount_UMI = nCount_UMI) } else { query <- query[features,] if(inherits(x = reference[[reference.assay]], what = "Assay5")){ reference.data.list <- c() for (i in Layers(object = reference[[reference.assay]], search = "data")) { reference.data.list[[i]] <- LayerData( object = reference[[reference.assay]], layer = i )[features, ] } reference.data <- do.call(cbind, reference.data.list) } else { reference.data <- GetAssayData( object = reference, assay = reference.assay, slot = "data")[features, ] } if (is.null(x = feature.mean)) { if (inherits(x = reference.data, what = 'dgCMatrix')) { feature.mean <- RowMeanSparse(mat = reference.data) } else if (inherits(x = reference.data, what = "IterableMatrix")) { bp.stats <- BPCells::matrix_stats(matrix = reference.data, row_stats = "variance") feature.mean <- bp.stats$row_stats["mean",] } else { feature.mean <- rowMeans2(x = reference.data) } if (scale) { if (inherits(x = reference.data, what = "IterableMatrix")) { feature.sd <- sqrt(bp.stats$row_stats["variance",]) } else { feature.sd <- sqrt(x = RowVarSparse(mat = as.sparse(reference.data))) } feature.sd[is.na(x = feature.sd)] <- 1 feature.sd[feature.sd==0] <- 1 } else { feature.sd <- rep(x = 1, nrow(x = reference.data)) } feature.mean[is.na(x = feature.mean)] <- 1 } store.names <- dimnames(x = query) if (is.numeric(x = feature.mean)) { query <- FastSparseRowScaleWithKnownStats( mat = as.sparse(x = query), mu = feature.mean, sigma = feature.sd, display_progress = FALSE ) } dimnames(x = query) <- store.names } ref.feature.loadings <- Loadings(object = reference[[reduction]])[features, dims] proj.pca <- t(crossprod(x = ref.feature.loadings, y = query)) return(proj.pca) } #' @rdname ProjectCellEmbeddings #' @method ProjectCellEmbeddings IterableMatrix #' @export #' #' ProjectCellEmbeddings.IterableMatrix <- function( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, features = features, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, block.size = 10000, ... ) { features <- features %||% rownames(x = Loadings(object = reference[[reduction]])) features <- intersect(x = features, y = rownames(query)) if (normalization.method == 'SCT') { reference.SCT.model <- slot(object = reference[[reference.assay]], name = "SCTModel.list")[[1]] cells.grid <- split( x = 1:ncol(query), f = ceiling(seq_along(along.with = 1:ncol(query)) / block.size)) proj.list <- list() for (i in seq_along(along.with = cells.grid)) { query.i <- FetchResiduals_reference( object = as.sparse(query[,cells.grid[[i]]]), reference.SCT.model = reference.SCT.model, features = features, nCount_UMI = nCount_UMI[colnames(query)[cells.grid[[i]]]]) proj.list[[i]] <- t(Loadings(object = reference[[reduction]])[features, dims]) %*% query.i } proj.pca <- t(matrix( data = unlist(x = proj.list), nrow = length(x = dims), ncol = ncol(x = query), dimnames = list( colnames(x = Embeddings(object = reference[[reduction]]))[dims], colnames(x = query)) )) } else { query <- query[features,] reference.data.list <- c() for (i in Layers(object = reference[[reference.assay]], search = "data")) { reference.data.list[[i]] <- LayerData(object = reference[[reference.assay]], layer = i)[features, ] } reference.data <- do.call(cbind, reference.data.list) if (is.null(x = feature.mean)) { if (inherits(x = reference.data, what = 'dgCMatrix')) { feature.mean <- RowMeanSparse(mat = reference.data) } else if (inherits(x = reference.data, what = "IterableMatrix")) { bp.stats <- BPCells::matrix_stats( matrix = reference.data, row_stats = "variance") feature.mean <- bp.stats$row_stats["mean",] } else { feature.mean <- rowMeans(mat = reference.data) } if (scale) { if (inherits(x = reference.data, what = "IterableMatrix")) { feature.sd <- sqrt(x = bp.stats$row_stats["variance",]) } else { feature.sd <- sqrt( x = RowVarSparse( mat = as.sparse(x = reference.data) ) ) } feature.sd[is.na(x = feature.sd)] <- 1 feature.sd[feature.sd==0] <- 1 } else { feature.sd <- rep(x = 1, nrow(x = reference.data)) } feature.mean[is.na(x = feature.mean)] <- 1 } query.scale <- BPCells::min_by_row(mat = query, vals = 10 * feature.sd + feature.mean) query.scale <- (query.scale - feature.mean) / feature.sd proj.pca <- t(query.scale) %*% Loadings(object = reference[[reduction]])[features,dims] rownames(x = proj.pca) <- colnames(x = query) colnames(x = proj.pca) <- colnames(x = Embeddings(object = reference[[reduction]]))[dims] } return(proj.pca) } # Project new data onto SVD (LSI or PCA) # # A = U∑V SVD # U' = VA'/∑ LSI projection # # Note that because in LSI we don't multiply by ∑ to get the embeddings (it's just U), # we need to divide by ∑ in the projection to get the equivalent. Therefore need # the singular values, which (in Signac RunLSI) we store in the DimReduc misc slot. # # @param reduction A \code{DimReduc} object containing the SVD dimension # reduction. Assumes original irlba output is stored in the misc slot of the dimreduc. # @param data A data matrix to project onto the SVD. Must contain the same # features used to construct the original SVD. # @param mode "pca" or "lsi". Determines if we divide projected values by singular values. # @param features Features to use. If NULL, use all common features between # the dimreduc and the data matrix. # @param do.center Center the projected cell embeddings (subtract mean across cells) # @param do.scale Scale the projected cell embeddings (divide by standard deviation across cells) # @param use.original.stats When standardizing the vectors, use the mean and standard deviation # of the original vectors from the SVD, rather than the mean and standard deviation of the # projected vectors. # @param dims A vector containing the dimensions to use in the projection. If NULL (default), # project to all dimensions in the input SVD. # @param verbose Display messages # # @return Returns a matrix #' @importFrom Matrix crossprod # @export ProjectSVD <- function( reduction, data, mode = "pca", features = NULL, do.center = FALSE, do.scale = FALSE, use.original.stats = FALSE, dims = NULL, verbose = TRUE ) { vt <- Loadings(object = reduction) dims <- dims %||% seq_len(length.out = ncol(x = vt)) features <- features %||% rownames(x = vt) features <- intersect(x = features, y = rownames(x = data)) vt <- vt[features, dims] data <- data[features, ] if (verbose) { message("Projecting new data onto SVD") } projected.u <- as.matrix(t(vt) %*% data) if (mode == "lsi") { components <- slot(object = reduction, name = 'misc') sigma <- components$d projected.u <- projected.u / sigma[dims] } if (do.center) { if (use.original.stats) { components <- slot(object = reduction, name = 'misc') if ("u" %in% names(x = components)) { # preferentially use original irlba output stored in misc # signac scales and centers embeddings by default embed.mean <- apply(X = components$u, MARGIN = 2, FUN = mean) } else { # raw irlba output not stored, fall back to the reference embeddings ref.emb <- Embeddings(object = reduction) embed.mean <- apply(X = ref.emb, MARGIN = 2, FUN = mean) } } else { # projected.u is transposed so use MARGIN = 1 embed.mean <- apply(X = projected.u, MARGIN = 1, FUN = mean) } projected.u <- projected.u - embed.mean } if (do.scale) { if (use.original.stats) { components <- slot(object = reduction, name = 'misc') if ("u" %in% names(x = components)) { embed.sd <- apply(X = components$u, MARGIN = 2, FUN = sd) } else { ref.emb <- Embeddings(object = reduction) embed.sd <- apply(X = ref.emb, MARGIN = 2, FUN = sd) } } else { embed.sd <- apply(X = projected.u, MARGIN = 1, FUN = sd) } projected.u <- projected.u / embed.sd } return(t(x = projected.u)) } # Calculate position along a defined reference range for a given vector of # numerics. Will range from 0 to 1. # # @param x Vector of numeric type # @param lower Lower end of reference range # @param upper Upper end of reference range # #' @importFrom stats quantile # # @return Returns a vector that describes the position of each element in # x along the defined reference range # ReferenceRange <- function(x, lower = 0.025, upper = 0.975) { return((x - quantile(x = x, probs = lower)) / (quantile(x = x, probs = upper) - quantile(x = x, probs = lower))) } # Run integration between a reference and query object # # Should only be called from within another function # # @param filtered.anchors A dataframe containing only anchors between reference and query # @param reference A reference object # @param query A query object # @param cellnames.list List of all cell names in all objects to be integrated # @param new.assay.name Name for the new assay containing the integrated data # @param features Vector of features to use when computing the PCA to determine the weights. Only set # if you want a different set from those used in the anchor finding process # @param features.to.integrate Vector of features to integrate. By default, will use the features # used in anchor finding. # @param dims Number of PCs to use in the weighting procedure # @param k.weight Number of neighbors to consider when weighting # @param weight.reduction Dimension reduction to use when calculating anchor weights. # This can be either: # \itemize{ # \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} # \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} # \item{NULL, in which case a new PCA will be calculated and used to calculate anchor weights} # } # Note that, if specified, the requested dimension reduction will only be used for calculating anchor weights in the # first merge between reference and query, as the merged object will subsequently contain more cells than was in # query, and weights will need to be calculated for all cells in the object. # @param sd.weight Controls the bandwidth of the Gaussian kernel for weighting # @param sample.tree Specify the order of integration. If NULL, will compute automatically. # @param eps Error bound on the neighbor finding algorithm (from \code{\link[RANN]{RANN}}) # @param verbose Print progress bars and output # RunIntegration <- function( filtered.anchors, normalization.method, reference, query, cellnames.list, new.assay.name, features.to.integrate, weight.reduction, weights.matrix = NULL, no.offset = FALSE, features, dims, k.weight, sd.weight, eps, verbose ) { cells1 <- colnames(x = reference) cells2 <- colnames(x = query) if (nrow(x = filtered.anchors) < k.weight) { warning("Number of anchors is less than k.weight. Lowering k.weight for sample pair.") k.weight <- nrow(x = filtered.anchors) } merged.obj <- merge(x = reference, y = query, merge.data = TRUE) if (no.offset) { cell1.offset <- filtered.anchors[, 1] cell2.offset <- filtered.anchors[, 2] } else { cell1.offset <- GetCellOffsets( anchors = filtered.anchors, dataset = 1, cell = 1, cellnames.list = cellnames.list, cellnames = cells1 ) cell2.offset <- GetCellOffsets( anchors = filtered.anchors, dataset = 2, cell = 2, cellnames.list = cellnames.list, cellnames = cells2 ) } filtered.anchors[, 1] <- cell1.offset filtered.anchors[, 2] <- cell2.offset integration.name <- "integrated" merged.obj <- SetIntegrationData( object = merged.obj, integration.name = integration.name, slot = 'anchors', new.data = filtered.anchors ) merged.obj <- SetIntegrationData( object = merged.obj, integration.name = integration.name, slot = 'neighbors', new.data = list('cells1' = cells1, 'cells2' = cells2) ) merged.obj <- FindIntegrationMatrix( object = merged.obj, integration.name = integration.name, features.integrate = features.to.integrate, verbose = verbose ) assay <- DefaultAssay(object = merged.obj) if (is.null(x = weights.matrix)) { if (is.null(x = weight.reduction) && !is.null(x = dims)) { if (normalization.method == "SCT"){ # recenter residuals centered.resids <- ScaleData( object = GetAssayData(object = merged.obj, assay = assay, slot = "data"), do.scale = FALSE, do.center = TRUE, verbose = FALSE ) merged.obj[["pca"]] <- RunPCA( object = centered.resids[features, ], assay = assay, npcs = max(dims), verbose = FALSE, features = features ) } else { merged.obj <- ScaleData( object = merged.obj, features = features, verbose = FALSE ) merged.obj <- RunPCA( object = merged.obj, npcs = max(dims), verbose = FALSE, features = features ) } dr.weights <- merged.obj[['pca']] } else if(is.null(x = weight.reduction) && is.null(x = dims)) { dr.weights <- CreateDimReducObject( embeddings = as.matrix(x = t(x = GetAssayData(object = merged.obj))), key = "int_", assay = "ToIntegrate" ) dims <- 1:ncol(x = dr.weights) } else { # need to match order of objects dr <- weight.reduction[[2]] if (!all(cells2 %in% rownames(x = dr))) { stop("Query cells not present in supplied DimReduc object. Set weight.reduction to a DimReduc object containing the query cells.") } if (inherits(x = dr, what = "DimReduc")) { dr.weights <- dr } else { dr.weights <- query[[dr]] } dims <- 1:ncol(x = dr.weights) } merged.obj <- FindWeights( object = merged.obj, integration.name = integration.name, reduction = dr.weights, dims = dims, k = k.weight, sd.weight = sd.weight, eps = eps, verbose = verbose ) } else { merged.obj <- SetIntegrationData( object = merged.obj, integration.name = "integrated", slot = "weights", new.data = weights.matrix ) } merged.obj <- TransformDataMatrix( object = merged.obj, new.assay.name = new.assay.name, features.to.integrate = features.to.integrate, integration.name = integration.name, verbose = verbose ) integrated.matrix <- GetAssayData( object = merged.obj, assay = new.assay.name, slot = 'data' ) return(integrated.matrix[, cells2]) } # order samples based on sample tree # the first sample is reference sample SampleIntegrationOrder <- function(tree) { order <- tree[nrow(x = tree), ] while (sum(order > 0) != 0) { replace.idx <- which(x = order > 0)[1] replace <- tree[order[replace.idx], ] if (replace.idx == 1) { left <- vector() right <- order[(replace.idx + 1):length(x = order)] replace <- tree[order[replace.idx], ] order <- c(left, replace, right) } else if (replace.idx == length(x = order)) { left <- order[1:(replace.idx - 1)] right <- vector() } else { left <- order[1:(replace.idx - 1)] right <- order[(replace.idx + 1):length(x = order)] } order <- c(left, replace, right) } order <- order * (-1) return(order) } ScoreAnchors <- function( object, assay = NULL, integration.name = 'integrated', verbose = TRUE, k.score = 30 ) { assay <- assay %||% DefaultAssay(object = object) anchor.df <- as.data.frame(x = GetIntegrationData(object = object, integration.name = integration.name, slot = 'anchors')) neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = "neighbors") offset <- length(x = neighbors$cells1) indices.aa <- Indices(object = neighbors$nnaa) indices.bb <- Indices(object = neighbors$nnbb) indices.ab <- Indices(object = neighbors$nnab) indices.ba <- Indices(object = neighbors$nnba) nbrsetA <- function(x) c(indices.aa[x, 1:k.score], indices.ab[x, 1:k.score] + offset) nbrsetB <- function(x) c(indices.ba[x, 1:k.score], indices.bb[x, 1:k.score] + offset) # score = number of shared neighbors anchor.new <- data.frame( 'cell1' = anchor.df[, 1], 'cell2' = anchor.df[, 2], 'score' = mapply( FUN = function(x, y) { length(x = intersect(x = nbrsetA(x = x), nbrsetB(x = y)))}, anchor.df[, 1], anchor.df[, 2] ) ) # normalize the score max.score <- quantile(anchor.new$score, 0.9) min.score <- quantile(anchor.new$score, 0.01) anchor.new$score <- anchor.new$score - min.score anchor.new$score <- anchor.new$score / (max.score - min.score) anchor.new$score[anchor.new$score > 1] <- 1 anchor.new$score[anchor.new$score < 0] <- 0 anchor.new <- as.matrix(x = anchor.new) object <- SetIntegrationData( object = object, integration.name = integration.name, slot = 'anchors', new.data = anchor.new ) return(object) } # Get top n features across given set of dimensions # # @param object Seurat object # @param reduction Which dimension reduction to use # @param dims Which dimensions to use # @param features.per.dim How many features to consider per dimension # @param max.features Number of features to return at most # @param projected Use projected loadings # TopDimFeatures <- function( object, reduction, dims = 1:10, features.per.dim = 100, max.features = 200, projected = FALSE ) { dim.reduction <- object[[reduction]] max.features <- max(length(x = dims) * 2, max.features) num.features <- sapply(X = 1:features.per.dim, FUN = function(y) { length(x = unique(x = as.vector(x = sapply(X = dims, FUN = function(x) { unlist(x = TopFeatures(object = dim.reduction, dim = x, nfeatures = y, balanced = TRUE, projected = projected)) })))) }) max.per.pc <- which.max(x = num.features[num.features < max.features]) features <- unique(x = as.vector(x = sapply(X = dims, FUN = function(x) { unlist(x = TopFeatures(object = dim.reduction, dim = x, nfeatures = max.per.pc, balanced = TRUE, projected = projected)) }))) features <- unique(x = features) return(features) } TransformDataMatrix <- function( object, assay = NULL, new.assay.name = 'integrated', integration.name = 'integrated', features.to.integrate = NULL, reduction = "cca", verbose = TRUE ) { if(verbose) { message("Integrating data") } assay <- assay %||% DefaultAssay(object = object) weights <- GetIntegrationData( object = object, integration.name = integration.name, slot = 'weights' ) integration.matrix <- GetIntegrationData( object = object, integration.name = integration.name, slot = 'integration.matrix' ) neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = 'neighbors') nn.cells1 <- neighbors$cells1 nn.cells2 <- neighbors$cells2 data.use1 <- t(x = GetAssayData( object = object, assay = assay, slot = "data")[features.to.integrate, nn.cells1] ) data.use2 <- t(x = GetAssayData( object = object, assay = assay, slot = "data")[features.to.integrate, nn.cells2] ) integrated <- IntegrateDataC(integration_matrix = as.sparse(x = integration.matrix), weights = as.sparse(x = weights), expression_cells2 = as.sparse(x = data.use2)) dimnames(integrated) <- dimnames(data.use2) new.expression <- t(rbind(data.use1, integrated)) new.expression <- new.expression[, colnames(object)] new.assay <- new( Class = 'Assay', # key = paste0(new.assay.name,"_"), counts = new(Class = "dgCMatrix"), data = new.expression, scale.data = matrix(), var.features = vector(), meta.features = data.frame(row.names = rownames(x = new.expression)), misc = NULL, # key = paste0(new.assay.name, "_") key = Key(object = new.assay.name, quiet = TRUE) ) object[[new.assay.name]] <- new.assay return(object) } # Helper function to validate parameters for FindTransferAnchors # ValidateParams_FindTransferAnchors <- function( reference, query, normalization.method, recompute.residuals, reference.assay, reference.neighbors, query.assay, reduction, reference.reduction, project.query, features, scale, npcs, l2.norm, dims, k.anchor, k.filter, k.score, max.features, nn.method, n.trees, eps, approx.pca, mapping.score.k, verbose ) { reference.assay <- reference.assay %||% DefaultAssay(object = reference) ModifyParam(param = "reference.assay", value = reference.assay) query.assay <- query.assay %||% DefaultAssay(object = query) ModifyParam(param = "query.assay", value = query.assay) DefaultAssay(object = reference) <- reference.assay ModifyParam(param = "reference", value = reference) DefaultAssay(object = query) <- query.assay ModifyParam(param = "query", value = query) if (!is.logical(x = scale)) { stop("Scale should be TRUE or FALSE") } if (length(x = reference) > 1 | length(x = query) > 1) { stop("We currently only support transfer between a single query and reference", call. = FALSE) } if (!reduction %in% c("pcaproject", "cca", "lsiproject", "rpca")) { stop("Please select either pcaproject, rpca, cca, or lsiproject for the reduction parameter.", call. = FALSE) } if (reduction == "cca" && !is.null(x = reference.reduction)) { stop("Specifying a reference reduction is only compatible with reduction = 'pcaproject'", call. = FALSE) } if (!normalization.method %in% c("LogNormalize", "SCT")) { stop("Please select either LogNormalize or SCT, for the normalization.method parameter.", call. = FALSE) } if (normalization.method == "SCT") { ModifyParam(param = "k.filter", value = NA) } if (reduction == "lsiproject") { ModifyParam(param = "k.filter", value = NA) } # commented out to enable filter anchors for v5 assay # if (inherits(x = reference[[reference.assay]], what = 'Assay5') || # inherits(x = query[[query.assay]], what = 'Assay5')) { # # current filter anchors not support for v5 assay # ModifyParam(param = "k.filter", value = NA) # } if (!is.na(x = k.filter) && k.filter > ncol(x = query)) { warning("k.filter is larger than the number of cells present in the query.\n", "Continuing without anchor filtering.", immediate. = TRUE, call. = FALSE) ModifyParam(param = "k.filter", value = NA) } if ((k.anchor + 1) > min(ncol(x = query), ncol(x = reference))) { stop("Please set k.anchor to be smaller than the number of cells in query (", ncol(x = query), ") and reference (", ncol(x = reference), ") objects.", call. = FALSE) } if ((k.score + 1) > min(ncol(x = query), ncol(x = reference))) { stop("Please set k.score to be smaller than the number of cells in query (", ncol(x = query), ") and reference (", ncol(x = reference), ") objects.", call. = FALSE) } if (reduction == "cca" && isTRUE(x = project.query)) { stop("The project.query workflow is not compatible with reduction = 'cca'", call. = FALSE) } if (normalization.method == "SCT" && isTRUE(x = project.query) && !IsSCT(query[[query.assay]])) { stop("In the project.query workflow, normalization is SCT, but query is not SCT normalized", call. = FALSE) } if (IsSCT(assay = query[[query.assay]]) && IsSCT(assay = reference[[reference.assay]]) && normalization.method != "SCT") { warning("Both reference and query assays have been processed with SCTransform.", "Setting normalization.method = 'SCT' and continuing.") normalization.method <- "SCT" ModifyParam(param = "normalization.method", value = "SCT") } if (IsSCT(assay = query[[query.assay]]) && normalization.method == "LogNormalize") { stop("An SCT assay (", query.assay, ") was provided for query.assay but ", "normalization.method was set as LogNormalize", call. = FALSE) } if (IsSCT(assay = query[[query.assay]]) && !inherits(x = query[[query.assay]], what = "SCTAssay")) { query[[query.assay]] <- as(object = query[[query.assay]], Class = "SCTAssay") ModifyParam(param = "query", value = query) } if (IsSCT(assay = reference[[reference.assay]]) && !inherits(x = reference[[reference.assay]], what = "SCTAssay")) { reference[[reference.assay]] <- as(object = reference[[reference.assay]], Class = "SCTAssay") ModifyParam(param = "reference", value = reference) } if (normalization.method != "SCT") { recompute.residuals <- FALSE ModifyParam(param = "recompute.residuals", value = recompute.residuals) } if (recompute.residuals) { # recompute.residuals only happens in ProjectCellEmbeddings, so k.filter set to NA. ModifyParam(param = "k.filter", value = NA) reference.model.num <- length(x = slot(object = reference[[reference.assay]], name = "SCTModel.list")) if (reference.model.num > 1) { stop("Given reference assay (", reference.assay, ") has ", reference.model.num , " reference sct models. Please provide a reference assay with a ", " single reference sct model.", call. = FALSE) } else if (reference.model.num == 0) { if (IsSCT(query[[query.assay]])) { stop("Given reference assay (", reference.assay, ") doesn't contain a reference SCT model.\n", "Query assay is a SCTAssay. ", "You can set recompute.residuals to FALSE ", "to use Query residuals to continue the analysis", call. = FALSE) } stop("Given reference assay (", reference.assay, ") doesn't contain a reference SCT model. ", call. = FALSE) } else if (reference.model.num == 1) { new.sct.assay <- reference.assay if (verbose) { message("Normalizing query using reference SCT model") } } query.umi.assay <- query.assay if (IsSCT(assay = query[[query.assay]])) { query.sct.models <- slot(object = query[[query.assay]], name = "SCTModel.list") query.umi.assay <- unique(x = unname(obj = unlist(x = lapply(X = query.sct.models, FUN = slot, name = "umi.assay")))) if (length(x = query.umi.assay) > 1) { stop("Query assay provided is an SCTAssay with multiple different original umi assays", call = FALSE) } if (!query.umi.assay %in% Assays(object = query)) { stop("Query assay provided is an SCTAssay based on an orignal UMI assay", " that is no longer present in the query Seurat object. Unable to", " recompute residuals based on the reference SCT model.\n", "If you want to use Query SCTAssay residuals to continue the analysis, ", "you can set recompute.residuals to FALSE", call. = FALSE) } } if (reduction %in% c('cca', 'rpca')) { query <- SCTransform( object = query, reference.SCT.model = slot(object = reference[[reference.assay]], name = "SCTModel.list")[[1]], residual.features = features, assay = query.umi.assay, new.assay.name = new.sct.assay, verbose = FALSE ) } else { new.sct.assay <- query.umi.assay } DefaultAssay(query) <- new.sct.assay ModifyParam(param = "query.assay", value = new.sct.assay) ModifyParam(param = "query", value = query) ModifyParam(param = "reference", value = reference) } if (IsSCT(assay = reference[[reference.assay]]) && normalization.method == "LogNormalize") { stop("An SCT assay (", reference.assay, ") was provided for reference.assay but ", "normalization.method was set as LogNormalize.", call. = FALSE) } if (!IsSCT(assay = reference[[reference.assay]]) && normalization.method == "SCT") { stop("Given reference.assay (", reference.assay, ") has not been processed with ", "SCTransform. Please either run SCTransform or set normalization.method = 'LogNormalize'.", call. = FALSE) } # Make data slot if DNE if (inherits(x = query[[query.assay]], what = "Assay5")){ if (is.null( tryCatch(expr = Layers(object = query[[query.assay]], search = 'data'), error = function (e) return(NULL)) ) ) { LayerData( object = query[[query.assay]], layer = "data") <- sparseMatrix( i = 1, j = 1, x = 1, dims = c(nrow(x = query[[query.assay]]), ncol(x = query[[query.assay]]) ) ) ModifyParam(param = "query", value = query) } } # features must be in both reference and query query.assay.check <- query.assay reference.assay.check <- reference.assay ref.features <- rownames(x = reference[[reference.assay.check]]) query.features <- rownames(x = query[[query.assay.check]]) if (normalization.method == "SCT") { if (IsSCT(query[[query.assay.check]])) { query.features <- rownames(x = query[[query.assay.check]]$scale.data) } query.model.features <- rownames(x = Misc(object = query[[query.assay]])$vst.out$gene_attr) query.features <- unique(c(query.features, query.model.features)) ref.model.features <- rownames(x = Misc(object = reference[[reference.assay]])$vst.out$gene_attr) ref.features <- unique(c(ref.features, ref.model.features)) } if (!is.null(x = features)) { if (project.query) { features.new <- intersect(x = features, y = ref.features) } else { features.new <- intersect(x = features, y = query.features) } if (length(x = features.new) != length(x = features)) { warning(length(x = features) - length(x = features.new), " features of ", "the features specified were not present in both the reference ", "query assays. \nContinuing with remaining ", length(x = features.new), " features.", immediate. = TRUE, call. = FALSE) features <- features.new } } else { if (project.query) { features <- intersect( x = VariableFeatures(object = query[[query.assay]]), y = ref.features ) } else { features <- intersect( x = VariableFeatures(object = reference[[reference.assay]]), y = query.features ) } } if (length(x = features) == 0) { stop("No features to use in finding transfer anchors. To troubleshoot, try ", "explicitly providing features to the features parameter and ensure that ", "they are present in both reference and query assays.", call. = FALSE) } ModifyParam(param = "features", value = features) if (!is.null(x = reference.reduction)) { if (project.query) { if (!reference.reduction %in% Reductions(object = query)){ stop("reference.reduction (", reference.reduction, ") is not present in ", "the provided query object (Note: project.query was set to TRUE).", call. = FALSE) } if (ncol(x = reference[[reference.reduction]]) < max(dims)) { stop("reference.reduction (", reference.reduction, ") does not contain ", "all the dimensions required by the dims parameter (Note: ", "project.query was set to TRUE).", call. = FALSE) } } else { if (!reference.reduction %in% Reductions(object = reference)){ stop("reference.reduction (", reference.reduction, ") is not present in ", "the provided reference object.", call. = FALSE) } if (ncol(x = reference[[reference.reduction]]) < max(dims)) { stop("reference.reduction (", reference.reduction, ") does not contain ", "all the dimensions required by the dims parameter.", call. = FALSE) } } } else { if (reduction == "lsiproject") { stop("Must supply a reference reduction if reduction='lsiproject'") } mdim <- max(dims) if (npcs < mdim) { warning("npcs is smaller than the largest value requested by the dims ", "parameter.\nSetting npcs to ", mdim, " and continuing.", immediate. = TRUE, call. = FALSE) ModifyParam(param = "npcs", value = mdim) if (mdim >= length(x = features)) { stop("npcs (", npcs, ") must be smaller than the number of features (", length(x = features), "). Please either lower the npcs and/or dims ", "parameter settings or increase the size of the feature set.", call. = FALSE) } } } if (!is.null(x = reference.neighbors)) { if (!reference.neighbors %in% Neighbors(object = reference)) { stop("Specified reference.neighbors (", reference.neighbors, ") is not ", "available in the provided reference object.", call. = FALSE) } k.nn <- max(k.score, k.anchor) if (ncol(x = Indices(reference[[reference.neighbors]])) < (k.nn + 1)){ stop("k.score or k.anchor is larger than the number of neighbors ", "contained in reference.nn. Recompute reference.nn using ", "FindNeighbors with k > k.score and k > k.anchor", call. = FALSE) } } } # Helper function to validate parameters for TransferData # ValidateParams_TransferData <- function( anchorset, combined.ob, anchors, reference.cells, query.cells, reference, query, query.assay, refdata, weight.reduction, l2.norm, dims, k.weight, sd.weight, eps, n.trees, verbose, slot, only.weights, prediction.assay, label.transfer ) { ## check refdata if (is.null(refdata)) { if (!only.weights) { stop("refdata is NULL and only.weights is FALSE") } } else { if (!inherits(x = refdata, what = "list")) { refdata <- list(id = refdata) } for (i in 1:length(x = refdata)) { if (inherits(x = refdata[[i]], what = c("character", "factor"))) { # check is it's in the reference object if (length(x = refdata[[i]]) == 1) { if (is.null(x = reference)) { warning("If providing a single string to refdata element number ", i, ", please provide the reference object. Skipping element ", i, ".", call. = FALSE, immediate. = TRUE) refdata[[i]] <- FALSE next } if (refdata[[i]] %in% Assays(object = reference)) { refdata[[i]] <- GetAssayData(object = reference, assay = refdata[[i]]) colnames(x = refdata[[i]]) <- paste0(colnames(x = refdata[[i]]), "_reference") label.transfer[[i]] <- FALSE next } else if (refdata[[i]] %in% colnames(x = reference[[]])) { refdata[[i]] <- reference[[refdata[[i]]]][, 1] } else { warning("Element number ", i, " provided to refdata does not exist in ", "the provided reference object.", call. = FALSE, immediate. = TRUE) refdata[[i]] <- FALSE next } } else if (length(x = refdata[[i]]) != length(x = reference.cells)) { warning("Please provide a vector that is the same length as the number ", "of reference cells used in anchor finding.\n", "Length of vector provided: ", length(x = refdata[[i]]), "\n", "Length of vector required: ", length(x = reference.cells), "\nSkipping element ", i, ".", call. = FALSE, immediate. = TRUE) refdata[[i]] <- FALSE } label.transfer[[i]] <- TRUE } else if (inherits(x = refdata[[i]], what = c("dgCMatrix", "matrix"))) { if (ncol(x = refdata[[i]]) != length(x = reference.cells)) { warning("Please provide a matrix that has the same number of columns as ", "the number of reference cells used in anchor finding.\n", "Number of columns in provided matrix : ", ncol(x = refdata[[i]]), "\n", "Number of columns required : ", length(x = reference.cells), "\nSkipping element ", i, ".", call. = FALSE, immediate. = TRUE) refdata[[i]] <- FALSE } else { colnames(x = refdata[[i]]) <- paste0(colnames(x = refdata[[i]]), "_reference") if (any(!colnames(x = refdata[[i]]) == reference.cells)) { if (any(!colnames(x = refdata[[i]]) %in% reference.cells) || any(!reference.cells %in% colnames(x = refdata[[i]]))) { warning("Some (or all) of the column names of the provided refdata ", "don't match the reference cells used in anchor finding ", "\nSkipping element", i, ".", call. = FALSE, immediate. = TRUE) refdata[[i]] <- FALSE } else { refdata[[i]] <- refdata[[i]][, reference.cells] } } } if (!slot %in% c("counts", "data")) { stop("Please specify slot as either 'counts' or 'data'.") } label.transfer[[i]] <- FALSE } else { warning("Please provide either a vector (character or factor) for label ", "transfer or a matrix for feature transfer. \nType provided: ", class(x = refdata[[i]])) refdata[[i]] <- FALSE } if (names(x = refdata)[i] == "") { possible.names <- make.unique(names = c(names(x = refdata), paste0("e", i))) names(x = refdata)[i] <- possible.names[length(x = possible.names)] if (verbose) { message("refdata element ", i, " is not named. Setting name as ", names(x = refdata)[i]) } } } ModifyParam(param = "label.transfer", value = label.transfer) if (all(unlist(x = lapply(X = refdata, FUN = isFALSE)))) { stop("None of the provided refdata elements are valid.", call. = FALSE) } ModifyParam(param = "refdata", value = refdata) } object.reduction <- Reductions(object = slot(object = anchorset, name = "object.list")[[1]]) valid.weight.reduction <- c("pcaproject", "pca", "cca", "rpca.ref","lsiproject", "lsi", object.reduction) if (!inherits(x = weight.reduction, "DimReduc")) { if (!weight.reduction %in% valid.weight.reduction) { stop("Please provide one of ", paste(valid.weight.reduction, collapse = ", "), " or a custom DimReduc to ", "the weight.reduction parameter.", call. = FALSE) } if (weight.reduction %in% c("pcaproject", "cca", "rpca.ref", "lsiproject") && !weight.reduction %in% Reductions(object = combined.ob)) { stop("Specified weight.reduction (", weight.reduction, ") is not present ", "in the provided anchorset.", call. = FALSE) } if (weight.reduction %in% c("pca", "lsi") && is.null(x = query)) { stop("To use an internal PCA on the query only for weight.reduction, ", "please provide the query object.", call. = FALSE) } } if (inherits(x = weight.reduction, "DimReduc")) { if (is.null(x = dims)) { stop("Please specify dims", call. = FALSE) } if (max(dims) > ncol(x = weight.reduction)) { stop("The max of dims specified (", max(dims), ") is greater than the ", "number of dimensions in the given DimReduc (", ncol(x = weight.reduction), ").", call. = FALSE) } } else { if (is.null(x = dims) && !is.null(x = slot(object = anchorset, name = "command")$dims)) { ModifyParam(param = "dims", value = 1:length(x = slot(object = anchorset, name = "command")$dims)) } } if (!is.null(x = query)) { if (!isTRUE(x = all.equal( target = gsub(pattern = "_query", replacement = "", x = query.cells), current = colnames(x = query[[query.assay]]), check.attributes = FALSE) )) { stop("Query object provided contains a different set of cells from the ", "query used to construct the AnchorSet provided.", call. = FALSE) } } if(k.weight > nrow(x = anchors)) { stop("Please set k.weight to be smaller than the number of anchors (", nrow(x = anchors), ").", call. = FALSE) } } # Internal function to validate the parameters for IntegrateEmbeddings run on # an IntegrationAnchorSet object # ValidateParams_IntegrateEmbeddings_IntegrationAnchors <- function( anchorset, object.list, reductions, dims.to.integrate, k.weight, weight.reduction, sample.tree ) { nobs <- length(x = object.list) if (is.null(x = reductions)) { stop("Must supply reductions to integrate") } if (!inherits(x = reductions, what = "DimReduc")) { stop("Please provide a single pre-computed DimReduc object to the ", "reductions parameter", call. = FALSE) } else { all.cells <- make.unique(names = unname(obj = do.call( what = c, args = lapply(X = object.list, FUN = Cells))) ) if (nrow(x = reductions) != length(x = all.cells)) { stop("The number of cells in the reduction provided (", nrow(x = reductions), ") doesn't match the number of cells in the objects used to build the ", "AnchorSet (", length(x = all.cells), ").", call. = FALSE) } if (!all(Cells(x = reductions) %in% all.cells)) { stop("The cell names in the reduction provided don't match the cell names ", "present in the objects used to build the AnchorSet", call. = FALSE) } dims.to.integrate <- dims.to.integrate %||% 1:ncol(x = reductions) if (max(dims.to.integrate) > ncol(x = reductions)) { warning("Max dims.to.integrate is larger than the number of dimensions in ", "the provided reduction. Setting dims.to.integrate to 1:", ncol(x = reductions), " and continuing.", immediate. = TRUE, call. = FALSE) dims.to.integrate <- 1:ncol(x = reductions) } ModifyParam(param = 'dims.to.integrate', value = dims.to.integrate) } if (!is.null(x = weight.reduction)) { if (inherits(x = weight.reduction, what = "character")) { if (length(x = weight.reduction) == 1) { weight.reduction <- as.list(x = rep(x = weight.reduction, times = nobs)) } ModifyParam(param = 'weight.reduction', value = weight.reduction) for (i in 1:nobs) { if (!weight.reduction[[i]] %in% Reductions(object = object.list[[i]])) { stop("weight.reduction (", weight.reduction[[i]], ") is not present ", "in object number ", i, ".", call. = FALSE) } } } if (inherits(x = weight.reduction[[1]], what = "DimReduc")) { if (length(x = weight.reduction) != nobs) { stop("Please provide one weight.reduction for each object. ", length(x = weight.reduction), " provided, ", nobs, " required.", call. = FALSE) } for (i in 1:nobs) { if (!isTRUE(all.equal( target = Cells(x = weight.reduction[[i]]), current = Cells(x = object.list[[i]]), check.attributes = FALSE )) ) { stop("Cell names in the provided weight.reduction ", i, " don't ", "match with the cell names in object ", i, ".", call. = FALSE) } } } } min.object.size <- min(sapply(X = object.list, FUN = ncol)) if (k.weight > min.object.size) { stop("k.weight (", k.weight, ") is set larger than the number of cells in ", "the smallest object (", min.object.size, "). Please choose a smaller ", "k.weight.", call. = FALSE) } if (!is.null(x = sample.tree)) { if (ncol(x = sample.tree) != 2) { stop("Invalid sample tree. Please provide a two column matrix specifying the order of integration.") } if (min(sample.tree) < (-1 * nobs)) { stop("Invalid sample tree. Dataset index greater than the number of ", "objects was provided.") } } } # Internal function to validate the parameters for IntegrateEmbeddings run on # a TransferAnchorSet object # ValidateParams_IntegrateEmbeddings_TransferAnchors <- function( anchorset, combined.object , reference, query, query.assay, reductions, dims.to.integrate, k.weight, weight.reduction, reuse.weights.matrix ) { if (missing(x = reference)) { stop("Please provide the reference object.", call. = FALSE) } if (missing(x = query)) { stop("Please provide the query object.", call. = FALSE) } reference.cells <- slot(object = anchorset, name = "reference.cells") reference.cells <- gsub(pattern = "_reference", replacement = "", x = reference.cells) if (!isTRUE(x = all.equal(target = reference.cells, current = Cells(x = reference), check.attributes = FALSE))) { stop("The set of cells used as a reference in the AnchorSet does not match ", "the set of cells provided in the reference object.") } query.cells <- slot(object = anchorset, name = "query.cells") query.cells <- gsub(pattern = "_query", replacement = "", x = query.cells) if (!isTRUE(x = all.equal(target = query.cells, current = colnames(x = query[[query.assay]]), check.attributes = FALSE))) { stop("The set of cells used as a query in the AnchorSet does not match ", "the set of cells provided in the query object.") } if (length(x = reductions) != 1) { stop("Please provide a single reduction name to reductions that is present ", "in the anchorset.", call. = FALSE) } if (!reductions %in% Reductions(object = combined.object)) { stop("Please specify a reduction that is present in the anchorset: ", paste(Reductions(object = combined.object), collapse = ", "), call. = FALSE) } reference <- RenameCells(object = reference, new.names = paste0(Cells(x = reference), "_reference")) reference.embeddings <- Embeddings(object = combined.object[[reductions]])[Cells(x = reference), ] reference[[reductions]] <- CreateDimReducObject(embeddings = reference.embeddings, assay = DefaultAssay(object = reference)) ModifyParam(param = "reference", value = reference) query <- RenameCells(object = query, new.names = paste0(Cells(x = query), "_query")) query.embeddings <- Embeddings(object = combined.object[[reductions]])[Cells(x = query[[query.assay]]), ] query[[reductions]] <- CreateDimReducObject(embeddings = query.embeddings, assay = DefaultAssay(object = query)) ModifyParam(param = "query", value = query) ModifyParam(param = "reductions", value = c(reductions, reductions)) min.ndim <- min(ncol(x = query[[reductions[2]]]), ncol(x = reference[[reductions[1]]])) if (is.null(x = dims.to.integrate)) { dims.to.integrate <- 1:min.ndim } else { if (max(dims.to.integrate) > min.ndim) { dims.to.integrate <- dims.to.integrate[dims.to.integrate <= min.ndim] warning("Max dims.to.integrate is larger than the max dims for at least ", "one of the reductions specified. Setting dims.to.integrate to ", paste(dims.to.integrate, collapse = ","), " and continuing.", immediate. = TRUE, call. = FALSE) } } ModifyParam(param = "dims.to.integrate", value = dims.to.integrate) if (isTRUE(x = reuse.weights.matrix)) { weights.matrix <- Tool(object = query, slot = "TransferData")$weights.matrix if (is.null(x = weights.matrix)) { message("Requested to reuse weights matrix, but no weights found. Computing new weights.") reuse.weights.matrix <- FALSE } else if (nrow(x = weights.matrix) != nrow(x = slot(object = anchorset, name = "anchors"))) { stop("The number of anchors in the weights matrix stored in the query (", nrow(x = weights.matrix), ") doesn't match the number of anchors ", "in the anchorset (", nrow(x = slot(object = anchorset, name = "anchors")), ").", call. = FALSE) } else { ModifyParam(param = 'weights.matrix', value = weights.matrix) } } # check T/F again due to possible modification in above if (isFALSE(x = reuse.weights.matrix)) { if (k.weight > ncol(x = query)) { stop("k.weight (", k.weight, ") is set larger than the number of cells in ", "the query object (", ncol(x = query), "). Please choose a smaller ", "k.weight.", call. = FALSE) } if (inherits(x = weight.reduction, what = "list")) { if (length(x = weight.reduction) > 2) { stop("Supplied too many dimension reduction objects for weight.reduction. ", "Should supply a single DimReduc object.") } if (length(x = weight.reduction) == 2) { # take the second element as the dimreduc to use for query weight.reduction <- weight.reduction[[2]] } } if (inherits(x = weight.reduction, what = "character")) { if (length(x = weight.reduction) > 2) { stop("Supplied too many dimension reduction names for weight.reduction. ", "Should supply the name of a single DimReduc present in the query.") } if (length(x = weight.reduction) == 2) { # take the second element as the dimreduc to use for query weight.reduction <- weight.reduction[[2]] } if (!weight.reduction %in% Reductions(object = query)) { stop("The weight.reduction ", weight.reduction, " is not present in the ", "query object.", call. = FALSE) } ModifyParam(param = 'weight.reduction', value = list(NULL, query[[weight.reduction]])) } if (inherits(x = weight.reduction, what = "DimReduc")) { weight.reduction <- RenameCells(object = weight.reduction, new.names = paste0(Cells(x = weight.reduction), "_query")) if (!isTRUE(all.equal( target = Cells(x = weight.reduction), current = Cells(x = query), check.attributes = FALSE ))) { stop("Cell names in the provided weight.reduction don't ", "match with the cell names in the query object.", call. = FALSE) } ModifyParam(param = 'weight.reduction', value = list(NULL, weight.reduction)) } } } #' Convert Neighbor class to an asymmetrical Graph class #' #' #' @param nn.object A neighbor class object #' @param col.cells Cells names of the neighbors, cell names in nn.object is used by default #' @param weighted Determine if use distance in the Graph #' #' @return Returns a Graph object #' #' @importFrom Matrix sparseMatrix #' #' @export #' @concept integration #' NNtoGraph <- function( nn.object, col.cells = NULL, weighted = FALSE ) { select_nn <- Indices(object = nn.object) col.cells <- col.cells %||% Cells(x = nn.object) ncol.nn <- length(x = col.cells) k.nn <- ncol(x = select_nn) j <- as.numeric(x = t(x = select_nn)) i <- ((1:length(x = j)) - 1) %/% k.nn + 1 if (weighted) { select_nn_dist <- Distances(object = nn.object) dist.element <- as.numeric(x = t(x = select_nn_dist)) nn.matrix <- sparseMatrix( i = i, j = j, x = dist.element, dims = c(nrow(x = select_nn), ncol.nn) ) } else { nn.matrix <- sparseMatrix( i = i, j = j, x = 1, dims = c(nrow(x = select_nn), ncol.nn) ) } rownames(x = nn.matrix) <- Cells(x = nn.object) colnames(x = nn.matrix) <- col.cells nn.matrix <- as.Graph(x = nn.matrix) return(nn.matrix) } # Find Anchor directly from assay # # # @return Returns a TranserAnchor or Integration set FindAssayAnchor <- function( object.list, reference = NULL, anchor.type = c("Transfer", "Integration"), assay = "Bridge", slot = "data", reduction = NULL, k.anchor = 20, k.score = 50, verbose = TRUE ) { anchor.type <- match.arg(arg = anchor.type) reduction.name <- reduction %||% paste0(assay, ".reduc") if ( is.null(x = reduction) || !reduction %in% Reductions(object.list[[1]])) { object.list <- lapply(object.list, function(x) { if (is.null(reduction)) { x[[reduction.name]] <- CreateDimReducObject( embeddings = t(GetAssayData( object = x, slot = slot, assay = assay )), key = "L_", assay = assay ) } DefaultAssay(x) <- assay x <- DietSeurat(x, assays = assay, dimreducs = reduction.name) return(x) } ) } object.both <- merge(object.list[[1]], object.list[[2]], merge.dr = reduction.name) objects.ncell <- sapply(X = object.list, FUN = function(x) dim(x = x)[2]) offsets <- as.vector(x = cumsum(x = c(0, objects.ncell)))[1:length(x = object.list)] if (verbose) { message("Finding ", anchor.type," anchors from assay ", assay) } anchors <- FindAnchors(object.pair = object.both, assay = c(DefaultAssay(object.both), DefaultAssay(object.both)), slot = 'data', cells1 = colnames(object.list[[1]]), cells2 = colnames(object.list[[2]]), internal.neighbors = NULL, reduction = reduction.name, k.anchor = k.anchor, k.score = k.score, dims = 1:ncol(object.both[[reduction.name]]), k.filter = NA, verbose = verbose ) inte.anchors <- anchors inte.anchors[, 1] <- inte.anchors[, 1] + offsets[1] inte.anchors[, 2] <- inte.anchors[, 2] + offsets[2] # determine all anchors inte.anchors <- rbind(inte.anchors, inte.anchors[, c(2, 1, 3)]) inte.anchors <- AddDatasetID( anchor.df = inte.anchors, offsets = offsets, obj.lengths = objects.ncell ) command <- LogSeuratCommand(object = object.list[[1]], return.command = TRUE) anchor.features <- rownames(object.both) if (anchor.type == "Integration") { anchor.set <- new(Class = "IntegrationAnchorSet", object.list = object.list, reference.objects = reference %||% seq_along(object.list), anchors = inte.anchors, weight.reduction = object.both[[reduction.name]], offsets = offsets, anchor.features = anchor.features, command = command ) } else if (anchor.type == "Transfer") { reference.index <- reference reference <- object.list[[reference.index]] query <- object.list[[setdiff(c(1,2), reference.index)]] query <- RenameCells( object = query, new.names = paste0(Cells(x = query), "_", "query") ) reference <- RenameCells( object = reference, new.names = paste0(Cells(x = reference), "_", "reference") ) combined.ob <- suppressWarnings(expr = merge( x = reference, y = query, merge.dr = reduction.name )) anchor.set <- new( Class = "TransferAnchorSet", object.list = list(combined.ob), reference.cells = colnames(x = reference), query.cells = colnames(x = query), anchors = anchors, anchor.features = anchor.features, command = command ) } return(anchor.set) } #' Construct a dictionary representation for each unimodal dataset #' #' #' @param object.list A list of Seurat objects #' @param bridge.object A multi-omic bridge Seurat which is used as the basis to #' represent unimodal datasets #' @param object.reduction A list of dimensional reductions from object.list used #' to be reconstructed by bridge.object #' @param bridge.reduction A list of dimensional reductions from bridge.object used #' to reconstruct object.reduction #' @param laplacian.reduction Name of bridge graph laplacian dimensional reduction #' @param laplacian.dims Dimensions used for bridge graph laplacian dimensional reduction #' @param bridge.assay.name Assay name used for bridge object reconstruction value (default is 'Bridge') #' @param return.all.assays Whether to return all assays in the object.list. #' Only bridge assay is returned by default. #' @param l2.norm Whether to l2 normalize the dictionary representation #' @param verbose Print messages and progress #' #' @importFrom MASS ginv #' @return Returns a object list in which each object has a bridge cell derived assay #' #' @export #' @concept integration #' BridgeCellsRepresentation <- function(object.list, bridge.object, object.reduction, bridge.reduction, laplacian.reduction = 'lap', laplacian.dims = 1:50, bridge.assay.name = "Bridge", return.all.assays = FALSE, l2.norm = TRUE, verbose = TRUE ) { my.lapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pblapply, no = future_lapply ) if (verbose) { message("Constructing Bridge-cells representation") } single.object = FALSE if (length(x = object.list) == 1 & inherits(x = object.list, what = 'Seurat') ) { object.list <- list(object.list) single.object = TRUE } dims.list <- list() for (i in 1:length(object.reduction)) { ref.dims <- list( object= Misc(object.list[[i]][[object.reduction[[i]]]], slot = 'ref.dims'), bridge = Misc( bridge.object[[bridge.reduction[[i]]]], slot = 'ref.dims') ) all.dims <- list( object = 1:ncol(object.list[[i]][[object.reduction[[i]]]]), bridge = 1:ncol( bridge.object[[bridge.reduction[[i]] ]]) ) projected.dims.index <- which(sapply(ref.dims, function(x) !is.null(x))) if (length(projected.dims.index) == 0) { warning('No reference dims found in the dimensional reduction,', ' all dims in the dimensional reduction will be used.') if (all.dims[[1]] == all.dims[[2]]) { dims.list[[i]] <- all.dims } else { stop( 'The number of dimensions in the object.list ', object.reduction[[i]], ' (', length(all.dims[[1]]), ') ', ' and the number of dimensions in the bridge object ', bridge.reduction[[i]], ' (', length(all.dims[[2]]), ') ', ' is different.') } } else { reference.dims.index <- setdiff(c(1:2), projected.dims.index) dims.list[[i]] <- list() dims.list[[i]][[reference.dims.index]] <- ref.dims[[projected.dims.index ]] dims.list[[i]][[projected.dims.index]] <- all.dims[[projected.dims.index]] names(dims.list[[i]]) <- c('object', 'bridge') } } object.list <- my.lapply( X = 1:length(x = object.list), FUN = function(x) { SA.inv <- ginv( X = Embeddings( object = bridge.object, reduction = bridge.reduction[[x]] )[ ,dims.list[[x]]$bridge] ) if (!is.null(laplacian.reduction)) { lap.vector <- Embeddings(bridge.object[[laplacian.reduction]])[,laplacian.dims] X <- Embeddings( object = object.list[[x]], reduction = object.reduction[[x]] )[, dims.list[[x]]$object] %*% (SA.inv %*% lap.vector) } else { X <- Embeddings( object = object.list[[x]], reduction = object.reduction[[x]] )[, dims.list[[x]]$object] %*% SA.inv colnames(X) <- Cells(bridge.object) } if (l2.norm) { X <- L2Norm(mat = X, MARGIN = 1) } colnames(x = X) <- paste0('bridge_', colnames(x = X)) suppressWarnings( object.list[[x]][[bridge.assay.name]] <- CreateAssayObject(data = t(X)) ) object.list[[x]][[bridge.assay.name]]@misc$SA.inv <- SA.inv DefaultAssay(object.list[[x]]) <- bridge.assay.name VariableFeatures(object = object.list[[x]]) <- rownames(object.list[[x]]) return (object.list[[x]]) } ) if (!return.all.assays) { object.list <- my.lapply( X = object.list, FUN = function(x) { x <- DietSeurat(object = x, assays = bridge.assay.name, scale.data = TRUE) return(x) } ) } if (single.object) { object.list <- object.list[[1]] } return(object.list) } #' Find bridge anchors between two unimodal datasets #' #' First, bridge object is used to reconstruct two single-modality profiles and #' then project those cells into bridage graph laplacian space. #' Next, find a set of anchors between two single-modality objects. These #' anchors can later be used to integrate embeddings or transfer data from the reference to #' query object using the \code{\link{MapQuery}} object. #' #' \itemize{ #' \item{ Bridge cells reconstruction #' } #' \item{ Find anchors between objects. It can be either IntegrationAnchors or TransferAnchor. #' } #' } #' #' @inheritParams BridgeCellsRepresentation #' @param anchor.type The type of anchors. Can #' be one of: #' \itemize{ #' \item{Integration: Generate IntegrationAnchors for integration} #' \item{Transfer: Generate TransferAnchors for transfering data} #' } #' @param reference A vector specifying the object/s to be used as a reference #' during integration or transfer data. #' @param reduction Dimensional reduction to perform when finding anchors. Can #' be one of: #' \itemize{ #' \item{cca: Canonical correlation analysis} #' \item{direct: Use assay data as a dimensional reduction} #' } #' @param reference.bridge.stored If refernece has stored the bridge dictionary representation #' @param k.anchor How many neighbors (k) to use when picking anchors #' @param k.score How many neighbors (k) to use when scoring anchors #' @param verbose Print messages and progress #' @param ... Additional parameters passed to \code{FindIntegrationAnchors} or #' \code{FindTransferAnchors} #' #' #' @return Returns an \code{\link{AnchorSet}} object that can be used as input to #' \code{\link{IntegrateEmbeddings}}.or \code{\link{MapQuery}} #' #' @keywords internal #' FindBridgeAnchor <- function(object.list, bridge.object, object.reduction, bridge.reduction, anchor.type = c("Transfer", "Integration"), reference = NULL, laplacian.reduction = "lap", laplacian.dims = 1:50, reduction = c("direct", "cca"), bridge.assay.name = "Bridge", reference.bridge.stored = FALSE, k.anchor = 20, k.score = 50, verbose = TRUE, ... ) { anchor.type <- match.arg(arg = anchor.type) reduction <- match.arg(arg = reduction) if (!is.null(laplacian.reduction)) { bridge.method <- "bridge graph" } else { bridge.method <- "bridge cells" } if (verbose) { message("Finding ", anchor.type," anchors") switch( EXPR = bridge.method, "bridge graph" = { message('Transform cells to bridge graph laplacian space') }, "bridge cells" = { message('Transform cells to bridge cells space') } ) } reference <- reference %||% c(1) query <- setdiff(c(1,2), reference) if (anchor.type == "Transfer") { stored.bridge.weights <- FALSE # check weight matrix if (is.null(bridge.object@tools$MapQuery)) { warning("No weights stored between reference and bridge obejcts.", "Please set store.weights to TRUE in MapQuery") } else if (is.null(object.list[[query]]@tools$MapQuery)) { warning("No weights stored between query and bridge obejcts.", "Please set store.weights to TRUE in MapQuery") } else { stored.bridge.weights <- TRUE } } if (reference.bridge.stored) { object.list[[query]] <- BridgeCellsRepresentation( object.list = object.list[[query]] , bridge.object = bridge.object, object.reduction = object.reduction[[query]] , bridge.reduction = bridge.reduction[[query]] , bridge.assay.name = bridge.assay.name, laplacian.reduction = laplacian.reduction, laplacian.dims = laplacian.dims, verbose = verbose ) } else { object.list <- BridgeCellsRepresentation( object.list = object.list , bridge.object = bridge.object, object.reduction = object.reduction, bridge.reduction = bridge.reduction, bridge.assay.name = bridge.assay.name, laplacian.reduction = laplacian.reduction, laplacian.dims = laplacian.dims, verbose = verbose ) } if (reduction == "direct") { anchor <- FindAssayAnchor( object.list = object.list , reference = reference, slot = "data", anchor.type = anchor.type, assay = bridge.assay.name, k.anchor = k.anchor, k.score = k.score, verbose = verbose ) } else if (reduction == "cca") { # set data slot to scale.data slot object.list <- lapply( X = object.list, FUN = function(x) { x <- SetAssayData( object = x, slot = "scale.data", new.data = as.matrix( x = GetAssayData(object = x, slot = "data") )) return(x) } ) anchor <- switch(EXPR = anchor.type, "Integration" = { anchor <- FindIntegrationAnchors( object.list = object.list, k.filter = NA, reference = reference, reduction = "cca", scale = FALSE, k.anchor = k.anchor, k.score = k.score, verbose = verbose, ...) object.merge <- merge(x = object.list[[1]], y = object.list[2:length(object.list)] ) slot( object = anchor, name = "weight.reduction" ) <- CreateDimReducObject( embeddings = t(GetAssayData( object = object.merge, slot = 'data' )), key = "L_", assay = bridge.assay.name ) anchor }, "Transfer" = { anchor <- FindTransferAnchors( reference = object.list[[reference]], query = object.list[[query]], reduction = "cca", scale = FALSE, k.filter = NA, k.anchor = k.anchor, k.score = k.score, verbose = verbose, ... ) } ) } if (anchor.type == "Transfer") { if (stored.bridge.weights) { slot( object = anchor,name = "weight.reduction" )@misc$bridge.sets <- list( bridge.weights = slot(object = bridge.object, name = "tools" )$MapQuery_PrepareBridgeReference$weights.matrix, bridge.ref_anchor = slot(object = bridge.object, name = "tools" )$MapQuery_PrepareBridgeReference$anchor[,1], query.weights = slot(object = object.list[[query]], name = "tools" )$MapQuery$weights.matrix, query.ref_anchor = slot(object = object.list[[query]], name = "tools" )$MapQuery$anchor[,1] ) } } slot(object = anchor, name = "command") <- LogSeuratCommand( object = object.list[[1]], return.command = TRUE ) return(anchor) } # Helper function to transfer labels based on neighbors object # @param nn.object the query neighbors object # @param reference.object the reference seurat object # @param group.by A vector of variables to group cells by # @param weight.matrix A reference x query cell weight matrix # @return Returns a list for predicted labels, prediction score and matrix #' @importFrom Matrix sparseMatrix #' @importFrom fastDummies dummy_cols #' @importFrom Matrix rowMeans t #' TransferLablesNN <- function( nn.object = NULL, weight.matrix = NULL, reference.labels ){ reference.labels.matrix <- CreateCategoryMatrix(labels = as.character(reference.labels)) if (!is.null(x = weight.matrix) & !is.null(x = nn.object)) { warning('both nn.object and weight matrix are set. Only weight matrix is used for label transfer') } if (is.null(x = weight.matrix)) { select_nn <- Indices(nn.object) k.nn <- ncol(select_nn) j <- as.numeric(x = t(x = select_nn )) i <- ((1:length(x = j)) - 1) %/% k.nn + 1 nn.matrix <- sparseMatrix( i = i, j = j, x = 1, dims = c(nrow(select_nn), nrow(reference.labels.matrix)) ) rownames(nn.matrix) <- Cells(nn.object) } else if (nrow(weight.matrix) == nrow(reference.labels.matrix)) { nn.matrix <- t(weight.matrix) k.nn <- 1 } else if (ncol(weight.matrix) == nrow(reference.labels.matrix)) { nn.matrix <- weight.matrix k.nn <- 1 } else { stop('wrong weights matrix input') } query.label.mat <- nn.matrix %*% reference.labels.matrix query.label.mat <- query.label.mat/k.nn prediction.max <- apply(X = query.label.mat, MARGIN = 1, FUN = which.max) query.label <- colnames(x = query.label.mat)[prediction.max] query.label.score <- apply(X = query.label.mat, MARGIN = 1, FUN = max) names(query.label) <- names(query.label.score) <- rownames(query.label.mat) if (is.factor(reference.labels)) { levels(query.label) <- levels(reference.labels) } output.list <- list(labels = query.label, scores = query.label.score, prediction.mat = query.label.mat ) return(output.list) } # transfer continuous value based on neighbors # TransferExpressionNN<- function( nn.object, reference.object, var.name = NULL ) { nn.matrix <- NNtoGraph(nn.object = nn.object, col.cells = Cells(reference.object) ) reference.exp.matrix <- FetchData(object = reference.object, vars = var.name) # remove NA reference.exp.matrix <- reference.exp.matrix[complete.cases(reference.exp.matrix), ,drop= F] nn.matrix <- nn.matrix[, rownames(reference.exp.matrix)] # remove NO neighbor query nn.sum <- RowSumSparse(mat = nn.matrix) nn.matrix <- nn.matrix[nn.sum > 2, ] nn.sum <- nn.sum[nn.sum>2] # transfer data reference.exp.matrix <- as.matrix(reference.exp.matrix) query.exp.mat <- nn.matrix %*% reference.exp.matrix query.exp.mat <- sweep(x = query.exp.mat, MARGIN = 1, STATS = nn.sum, FUN = "/") # set output for all query cells query.exp.all <- data.frame(row.names = Cells(nn.object)) query.exp.all[rownames(query.exp.mat),1] <- query.exp.mat[,1] colnames(query.exp.all) <- var.name return(query.exp.all) } #' @param reduction.name dimensional reduction name, lap by default #' @param graph The name of graph #' @rdname RunGraphLaplacian #' @concept dimensional_reduction #' @export #' @method RunGraphLaplacian Seurat #' RunGraphLaplacian.Seurat <- function( object, graph, reduction.name = "lap", reduction.key ="LAP_", n = 50, verbose = TRUE, ... ) { lap_dir <- RunGraphLaplacian(object = object[[graph]], n = n, reduction.key = reduction.key , verbose = verbose, ... ) object[[reduction.name]] <- lap_dir return(object) } #' @param n Total Number of Eigenvectors to compute and store (50 by default) #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. LAP by default #' @param verbose Print message and process #' @param ... Arguments passed to eigs_sym #' #' #' @concept dimensional_reduction #' @rdname RunGraphLaplacian #' @export #' #' @importFrom Matrix diag t rowSums #' @importFrom RSpectra eigs_sym RunGraphLaplacian.default <- function(object, n = 50, reduction.key ="LAP_", verbose = TRUE, ... ) { if (!all( slot(object = t(x = object), name = "x") == slot(object = object, name = "x") )) { stop("Input graph is not symmetric") } if (verbose) { message("Generating normalized laplacian graph") } D_half <- sqrt(x = rowSums(x = object)) L <- -1 * (t(object / D_half) / D_half) diag(L) <- 1 + diag(L) if (verbose) { message("Performing eigendecomposition of the normalized laplacian graph") } L_eigen <- eigs_sym(L, k = n + 1, which = "SM", ...) #delete the first eigen vector new_order <- n:1 lap_output <- list(eigen_vector = Re(L_eigen$vectors[, new_order]), eigen_value = L_eigen$values[new_order] ) rownames(lap_output$eigen_vector) <- colnames(object) colnames(lap_output$eigen_vector) <- paste0(reduction.key, 1:n ) lap_dir <- CreateDimReducObject(embeddings = lap_output$eigen_vector, key = reduction.key, assay = DefaultAssay(object), stdev = lap_output$eigen_value ) return(lap_dir) } # Check if the var.name already existed in the meta.data # CheckMetaVarName <- function(object, var.name) { if (var.name %in% colnames(x = object[[]])) { var.name.exist <- var.name var.name <- rev( x = make.unique( names = c(colnames(object[[]]), var.name.exist) ) )[1] warning(var.name.exist, " is already existed in the meta.data. ", var.name, " will store leverage score value") } return(var.name) } # Run hnsw to find neighbors # # @param data Data to build the index with # @param query A set of data to be queried against data # @param metric Distance metric; can be one of "euclidean", "cosine", "manhattan", # "hamming" # @param k Number of neighbors # @param ef_construction A larger value means a better quality index, but increases build time. # @param ef Higher values lead to improved recall at the expense of longer search time. # @param n_threads Maximum number of threads to use. # @param index optional index object, will be recomputed if not provided #' @importFrom RcppHNSW hnsw_build hnsw_search # HnswNN <- function(data, query = data, metric = "euclidean", k, ef_construction = 200, ef = 10, index = NULL, n_threads = 0 ) { idx <- index %||% hnsw_build( X = data, distance = metric, ef = ef_construction, n_threads = n_threads ) nn <- hnsw_search( X = query, ann = idx, k = k, ef = ef, n_threads = n_threads ) names(nn) <- c("nn.idx", "nn.dists") nn$idx <- idx nn$alg.info <- list(metric = metric, ndim = ncol(x = data)) return(nn) } # Calculate reference index from the integrated object # IntegrationReferenceIndex <- function(object) { if (is.null(object@tools$Integration@sample.tree)) { reference.index <- object@commands$FindIntegrationAnchors$reference if (length(x = reference.index) > 1) { stop('the number of the reference is bigger than 1') } } else { reference.index <- SampleIntegrationOrder(tree = object@tools$Integration@sample.tree)[1] } return(reference.index) } # Calculate mean and sd # SparseMeanSd <- function(object, assay = NULL, slot = 'data', features = NULL, eps = 1e-8 ){ assay <- assay%||% DefaultAssay(object) features <- features %||% rownames(object[[assay]]) assay <- assay %||% DefaultAssay(object = object) mat <- GetAssayData(object = object[[assay]], slot = slot)[features,] if (class(mat)[1] !='dgCMatrix'){ stop('Matrix is not sparse') } mat.mean <- RowMeanSparse(mat) mat.sd <- sqrt(RowVarSparse(mat)) names(mat.mean) <- names(mat.sd) <- rownames(mat) mat.sd <- MinMax(data = mat.sd, min = eps, max = max(mat.sd)) output <- list(mean = mat.mean, sd = mat.sd) return(output) } # Run PCA on sparse matrix # #' @importFrom Matrix t #' @importFrom rlang exec #' @importFrom irlba irlba # # RunPCA_Sparse <- function( object, features = NULL, reduction.key = "PCsp_", reduction.name = "pca.sparse", npcs = 50, do.scale = TRUE, verbose = TRUE ) { features <- features %||% VariableFeatures(object) data <- GetAssayData(object = object, slot = "data")[features,] n <- npcs args <- list(A = t(data), nv = n) args$center <- RowMeanSparse(data) feature.var <- RowVarSparse(data) args$totalvar <- sum(feature.var) if (do.scale) { args$scale <- sqrt(feature.var) args$scale <- MinMax(args$scale, min = 1e-8, max = max(args$scale)) } else { args$scale <- FALSE } if (verbose) { message("Running PCA") } pca.irlba <- exec(.fn = irlba, !!!args) sdev <- pca.irlba$d/sqrt(max(1, ncol(data) - 1)) feture.loadings <- pca.irlba$v rownames(feture.loadings) <- rownames(data) embeddings <- sweep(x = pca.irlba$u, MARGIN = 2, STATS = pca.irlba$d, FUN = "*") rownames(embeddings) <- colnames(data) colnames(feture.loadings) <- colnames(embeddings) <- paste0(reduction.key, 1:npcs) object[[reduction.name]] <- CreateDimReducObject( embeddings = embeddings, loadings = feture.loadings, stdev = sdev, key = reduction.key, assay = DefaultAssay(object), misc = list(d = pca.irlba$d) ) return(object) } # Smoothing labels based on the clusters # @param labels the original labels # @param clusters the clusters that are used to smooth labels # SmoothLabels <- function(labels, clusters) { cluster.set <- unique(clusters) smooth.labels <- labels for (c in cluster.set) { cell.c <- which(clusters == c) smooth.labels[cell.c] <- names(sort(table(labels[cell.c]), decreasing = T)[1]) } return(smooth.labels) } #' Project query data to reference dimensional reduction #' #' @param query Query object #' @param reference Reference object #' @param mode Projection mode name for projection #' \itemize{ #' \item{pcaproject: PCA projection} #' \item{lsiproject: LSI projection} #' } #' @param reference.reduction Name of dimensional reduction in the reference object #' @param combine Determine if query and reference objects are combined #' @param query.assay Assay used for query object #' @param reference.assay Assay used for reference object #' @param features Features used for projection #' @param do.scale Determine if scale expression matrix in the pcaproject mode #' @param reduction.name dimensional reduction name, reference.reduction is used by default #' @param reduction.key dimensional reduction key, the key in reference.reduction #' is used by default #' @param verbose Print progress and message #' #' @return Returns a query-only or query-reference combined seurat object #' #' @export #' @concept integration #' ProjectDimReduc <- function(query, reference, mode = c('pcaproject', 'lsiproject'), reference.reduction, combine = FALSE, query.assay = NULL, reference.assay = NULL, features = NULL, do.scale = TRUE, reduction.name = NULL, reduction.key= NULL, verbose = TRUE ) { query.assay <- query.assay %||% DefaultAssay(object = query) reference.assay <- reference.assay %||% DefaultAssay(object = reference) DefaultAssay(object = query) <- query.assay DefaultAssay(object = reference) <- reference.assay reduction.name <- reduction.name %||% reference.reduction reduction.key <- reduction.key %||% Key(object = reference[[reference.reduction]]) if (reduction.name %in% Reductions(object = query)) { warning(reduction.name, ' already exists in the query object. It will be overwritten.' ) } features <- features %||% rownames(x = Loadings(object = reference[[reference.reduction]])) features <- intersect(x = features, y = rownames(x = query)) if (mode == 'lsiproject') { if (verbose) { message('LSI projection to ', reference.reduction) } projected.embeddings <- ProjectSVD( reduction = reference[[reference.reduction]], data = GetAssayData(object = query, assay = query.assay, slot = "data"), mode = "lsi", do.center = FALSE, do.scale = FALSE, features = features, use.original.stats = FALSE, verbose = verbose ) } else if (mode == 'pcaproject') { if (inherits(query[[query.assay]], what = 'SCTAssay')) { if (verbose) { message('PCA projection to ', reference.reduction, ' in SCT assay') } query <- suppressWarnings( expr = GetResidual(object = query, assay = query.assay, features = features, verbose = FALSE) ) query.mat <- GetAssayData(object = query, slot = 'scale.data')[features,] projected.embeddings <- t( crossprod(x = Loadings( object = reference[[reference.reduction]])[features, ], y = query.mat ) ) } else { if (verbose) { message('PCA projection to ', reference.reduction) } projected.embeddings <- ProjectCellEmbeddings( reference = reference, reduction = reference.reduction, query = query, scale = do.scale, dims = 1:ncol(reference[[reference.reduction]]), feature.mean = NULL, verbose = verbose ) } } query[[reduction.name]] <- CreateDimReducObject( embeddings = projected.embeddings, loadings = Loadings(reference[[reference.reduction]])[features,], assay = query.assay, key = reduction.key, misc = Misc(reference[[reference.reduction]]) ) if (combine) { query <- DietSeurat(object = query, dimreducs = reduction.name, features = features, assays = query.assay ) reference <- DietSeurat(object = reference, dimreducs = reference.reduction, features = features, assays = reference.assay) suppressWarnings( combine.obj <- merge(query, reference, merge.dr = c(reduction.name, reference.reduction) ) ) Idents(combine.obj) <- c(rep(x = 'query', times = ncol(query)), rep(x = 'reference', times = ncol(reference)) ) return(combine.obj) } else { return(query) } } #' Prepare the bridge and reference datasets #' #' Preprocess the multi-omic bridge and unimodal reference datasets into #' an extended reference. #' This function performs the following three steps: #' 1. Performs within-modality harmonization between bridge and reference #' 2. Performs dimensional reduction on the SNN graph of bridge datasets via #' Laplacian Eigendecomposition #' 3. Constructs a bridge dictionary representation for unimodal reference cells #' #' @param reference A reference Seurat object #' @param bridge A multi-omic bridge Seurat object #' @param reference.reduction Name of dimensional reduction of the reference object (default is 'pca') #' @param reference.dims Number of dimensions used for the reference.reduction (default is 50) #' @param normalization.method Name of normalization method used: LogNormalize #' or SCT #' @param reference.assay Assay name for reference (default is \code{\link{DefaultAssay}}) #' @param bridge.ref.assay Assay name for bridge used for reference mapping. RNA by default #' @param bridge.query.assay Assay name for bridge used for query mapping. ATAC by default #' @param supervised.reduction Type of supervised dimensional reduction to be performed #' for integrating the bridge and query. #' Options are: #' \itemize{ #' \item{slsi: Perform supervised LSI as the dimensional reduction for #' the bridge-query integration} #' \item{spca: Perform supervised PCA as the dimensional reduction for #' the bridge-query integration} #' \item{NULL: no supervised dimensional reduction will be calculated. #' bridge.query.reduction is used for the bridge-query integration} #' } #' @param bridge.query.reduction Name of dimensions used for the bridge-query harmonization. #' 'bridge.query.reduction' and 'supervised.reduction' cannot be NULL together. #' @param bridge.query.features Features used for bridge query dimensional reduction #' (default is NULL which uses VariableFeatures from the bridge object) #' @param laplacian.reduction.name Name of dimensional reduction name of graph laplacian eigenspace (default is 'lap') #' @param laplacian.reduction.key Dimensional reduction key (default is 'lap_') #' @param laplacian.reduction.dims Number of dimensions used for graph laplacian eigenspace (default is 50) #' @param verbose Print progress and message (default is TRUE) #' #' @return Returns a \code{BridgeReferenceSet} that can be used as input to #' \code{\link{FindBridgeTransferAnchors}}. #' The parameters used are stored in the \code{BridgeReferenceSet} as well #' #' @export #' @concept integration #' PrepareBridgeReference <- function ( reference, bridge, reference.reduction = 'pca', reference.dims = 1:50, normalization.method = c('SCT', 'LogNormalize'), reference.assay = NULL, bridge.ref.assay = 'RNA', bridge.query.assay = 'ATAC', supervised.reduction = c('slsi', 'spca', NULL), bridge.query.reduction = NULL, bridge.query.features = NULL, laplacian.reduction.name = 'lap', laplacian.reduction.key = 'lap_', laplacian.reduction.dims = 1:50, verbose = TRUE ) { ## checking if (!is.null(supervised.reduction)) { supervised.reduction <- match.arg(arg = supervised.reduction) } if (!is.null(x = bridge.query.reduction) & !is.null(x = supervised.reduction)) { stop('bridge.query.reduction and supervised.reduction can only set one.', 'If you want to set bridge.query.reduction, supervised.reduction should set to NULL') } if (is.null(x = bridge.query.reduction) & is.null(x = supervised.reduction)) { stop('Both bridge.query.reduction and supervised.reduction are NULL. One of them needs to be set') } bridge.query.features <- bridge.query.features %||% VariableFeatures(object = bridge[[bridge.query.assay]]) if (length(x = bridge.query.features) == 0) { stop('bridge object ', bridge.query.assay, ' assay has no variable genes and bridge.query.features has no input') } # modality harmonization reference.assay <- reference.assay %||% DefaultAssay(reference) DefaultAssay(reference) <- reference.assay DefaultAssay(bridge) <- bridge.ref.assay ref.anchor <- FindTransferAnchors( reference = reference, reference.reduction = reference.reduction, normalization.method = normalization.method, dims = reference.dims, query = bridge, recompute.residuals = TRUE, features = rownames(reference[[reference.reduction]]@feature.loadings), k.filter = NA, verbose = verbose ) bridge <- MapQuery(anchorset = ref.anchor, reference = reference, query = bridge, store.weights = TRUE, verbose = verbose ) bridge.ref.reduction <- paste0('ref.', reference.reduction) bridge <- FindNeighbors(object = bridge, reduction = bridge.ref.reduction, dims = 1:ncol(x = bridge[[bridge.ref.reduction]]), return.neighbor = FALSE, graph.name = c('bridge.ref.nn', 'bridge.ref.snn'), prune.SNN = 0) bridge <- RunGraphLaplacian(object = bridge, graph = "bridge.ref.snn", reduction.name = laplacian.reduction.name, reduction.key = laplacian.reduction.key, verbose = verbose) DefaultAssay(object = bridge) <- bridge.query.assay if (!is.null(supervised.reduction)) { bridge <- switch(EXPR = supervised.reduction, 'slsi' = { bridge.reduc <- RunSLSI(object = bridge, features = VariableFeatures(bridge), graph = 'bridge.ref.nn', assay = bridge.query.assay ) bridge.reduc }, 'spca' = { bridge.reduc <- RunSPCA(object = bridge, features = VariableFeatures(bridge), graph = 'bridge.ref.snn', assay = bridge.query.assay ) bridge.reduc } ) } # bridge representation reference.bridge <- BridgeCellsRepresentation( object.list = reference, bridge.object = bridge, object.reduction = c(reference.reduction), bridge.reduction = c(bridge.ref.reduction), laplacian.reduction = laplacian.reduction.name, laplacian.dims = laplacian.reduction.dims ) reference[['Bridge']] <- reference.bridge[['Bridge']] reference <- merge(x = reference, y = bridge, merge.dr = NA) reference@tools$MapQuery_PrepareBridgeReference <- bridge@tools$MapQuery command <- LogSeuratCommand(object = reference, return.command = TRUE) slot(object = command, name = "params")$bridge.query.features <- NULL command.name <- slot(object = command, name = "name") reference[[command.name]] <- command return(reference) } #' Find bridge anchors between query and extended bridge-reference #' #' Find a set of anchors between unimodal query and the other unimodal reference #' using a pre-computed \code{\link{BridgeReferenceSet}}. #' This function performs three steps: #' 1. Harmonize the bridge and query cells in the bridge query reduction space #' 2. Construct the bridge dictionary representations for query cells #' 3. Find a set of anchors between query and reference in the bridge graph laplacian eigenspace #' These anchors can later be used to integrate embeddings or transfer data from the reference to #' query object using the \code{\link{MapQuery}} object. #' @param extended.reference BridgeReferenceSet object generated from #' \code{\link{PrepareBridgeReference}} #' @param query A query Seurat object #' @param query.assay Assay name for query-bridge integration #' @param scale Determine if scale the query data for projection #' @param dims Number of dimensions for query-bridge integration #' @param reduction Dimensional reduction to perform when finding anchors. #' Options are: #' \itemize{ #' \item{pcaproject: Project the PCA from the bridge onto the query. We #' recommend using PCA when bridge and query datasets are from scRNA-seq} #' \item{lsiproject: Project the LSI from the bridge onto the query. We #' recommend using LSI when bridge and query datasets are from scATAC-seq or scCUT&TAG data. #' This requires that LSI or supervised LSI has been computed for the bridge dataset, and the #' same features (eg, peaks or genome bins) are present in both the bridge #' and query. #' } #' } #' @param bridge.reduction Dimensional reduction to perform when finding anchors. Can #' be one of: #' \itemize{ #' \item{cca: Canonical correlation analysis} #' \item{direct: Use assay data as a dimensional reduction} #' } #' @param verbose Print messages and progress #' #' @return Returns an \code{AnchorSet} object that can be used as input to #' \code{\link{TransferData}}, \code{\link{IntegrateEmbeddings}} and #' \code{\link{MapQuery}}. #' #' @export #' @concept integration #' FindBridgeTransferAnchors <- function( extended.reference, query, query.assay = NULL, dims = 1:30, scale = FALSE, reduction = c('lsiproject', 'pcaproject'), bridge.reduction = c('direct', 'cca'), verbose = TRUE ) { bridge.reduction <- match.arg(arg = bridge.reduction) reduction <- match.arg(arg = reduction) query.assay <- query.assay %||% DefaultAssay(query) DefaultAssay(query) <- query.assay command.name <- grep(pattern = 'PrepareBridgeReference', x = names(slot(object = extended.reference, name = 'commands')), value = TRUE) params <- Command(object = extended.reference, command = command.name) bridge.query.assay <- params$bridge.query.assay bridge.query.reduction <- params$bridge.query.reduction %||% params$supervised.reduction reference.reduction <- params$reference.reduction bridge.ref.reduction <- paste0('ref.', reference.reduction) DefaultAssay(extended.reference) <- bridge.query.assay extended.reference.bridge <- DietSeurat( object = extended.reference, assays = bridge.query.assay, dimreducs = c(bridge.ref.reduction, bridge.query.reduction, params$laplacian.reduction.name) ) query.anchor <- FindTransferAnchors( reference = extended.reference.bridge, reference.reduction = bridge.query.reduction, dims = dims, query = query, reduction = reduction, scale = scale, features = rownames(Loadings(extended.reference[[bridge.query.reduction]])), k.filter = NA, verbose = verbose ) query <- MapQuery(anchorset = query.anchor, reference = extended.reference.bridge, query = query, store.weights = TRUE ) DefaultAssay(extended.reference) <- 'Bridge' bridge_anchor <- FindBridgeAnchor( object.list = list(DietSeurat(object = extended.reference, assays = 'Bridge'), query), bridge.object = extended.reference.bridge, object.reduction = c(reference.reduction, paste0('ref.', bridge.query.reduction)), bridge.reduction = c(bridge.ref.reduction, bridge.query.reduction), anchor.type = "Transfer", reduction = bridge.reduction, reference.bridge.stored = TRUE, verbose = verbose ) return(bridge_anchor) } #' Find integration bridge anchors between query and extended bridge-reference #' #' Find a set of anchors between unimodal query and the other unimodal reference #' using a pre-computed \code{\link{BridgeReferenceSet}}. #' These integration anchors can later be used to integrate query and reference #' using the \code{\link{IntegrateEmbeddings}} object. #' #' @inheritParams FindBridgeTransferAnchors #' @param integration.reduction Dimensional reduction to perform when finding anchors #' between query and reference. #' Options are: #' \itemize{ #' \item{direct: find anchors directly on the bridge representation space} #' \item{cca: perform cca on the on the bridge representation space and then find anchors #' } #' } #' #' @return Returns an \code{AnchorSet} object that can be used as input to #' \code{\link{IntegrateEmbeddings}}. #' #' @export #' @concept integration #' FindBridgeIntegrationAnchors <- function( extended.reference, query, query.assay = NULL, dims = 1:30, scale = FALSE, reduction = c('lsiproject', 'pcaproject'), integration.reduction = c('direct', 'cca'), verbose = TRUE ) { reduction <- match.arg(arg = reduction) integration.reduction <- match.arg(arg = integration.reduction) query.assay <- query.assay %||% DefaultAssay(query) DefaultAssay(query) <- query.assay command.name <- grep(pattern = 'PrepareBridgeReference', x = names(slot(object = extended.reference, name = 'commands')), value = TRUE) params <- Command(object = extended.reference, command = command.name) bridge.query.assay <- params$bridge.query.assay bridge.query.reduction <- params$bridge.query.reduction %||% params$supervised.reduction reference.reduction <- params$reference.reduction bridge.ref.reduction <- paste0( 'ref.', params$bridge.ref.reduction) DefaultAssay(extended.reference) <- bridge.query.assay extended.reference.bridge <- DietSeurat( object = extended.reference, assays = bridge.query.assay, dimreducs = c(bridge.query.reduction, bridge.ref.reduction, params$laplacian.reduction.name) ) query.anchor <- FindTransferAnchors( reference = extended.reference.bridge, reference.reduction = bridge.query.reduction, dims = dims, query = query, reduction = reduction, scale = scale, features = rownames(Loadings(extended.reference.bridge[[bridge.query.reduction]])), k.filter = NA, verbose = verbose ) query <- MapQuery(anchorset = query.anchor, reference = extended.reference.bridge, query = query, store.weights = TRUE ) DefaultAssay(extended.reference) <- 'Bridge' bridge_anchor <- FindBridgeAnchor( object.list = list(DietSeurat(object = extended.reference, assays = 'Bridge'), query), bridge.object = extended.reference.bridge, reduction = integration.reduction, object.reduction = c(reference.reduction, paste0('ref.', bridge.query.reduction)), bridge.reduction = c(bridge.ref.reduction, bridge.query.reduction), anchor.type = "Integration", reference.bridge.stored = TRUE, verbose = verbose ) return(bridge_anchor) } #' Perform integration on the joint PCA cell embeddings. #' #' This is a convenience wrapper function around the following three functions #' that are often run together when perform integration. #' \code{\link{FindIntegrationAnchors}}, \code{\link{RunPCA}}, #' \code{\link{IntegrateEmbeddings}}. #' #' @inheritParams FindIntegrationAnchors #' @param new.reduction.name Name of integrated dimensional reduction #' @param npcs Total Number of PCs to compute and store (50 by default) #' @param findintegrationanchors.args A named list of additional arguments to #' \code{\link{FindIntegrationAnchors}} #' @param verbose Print messages and progress #' #' @importFrom rlang exec #' @return Returns a Seurat object with integrated dimensional reduction #' @export #' @concept integration #' FastRPCAIntegration <- function( object.list, reference = NULL, anchor.features = 2000, k.anchor = 20, dims = 1:30, scale = TRUE, normalization.method = c("LogNormalize", "SCT"), new.reduction.name = 'integrated_dr', npcs = 50, findintegrationanchors.args = list(), verbose = TRUE ) { npcs <- max(npcs, dims) my.lapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pblapply, no = future_lapply ) reduction <- 'rpca' if (is.numeric(x = anchor.features)) { anchor.features <- SelectIntegrationFeatures( object.list = object.list, nfeatures = anchor.features, verbose = FALSE ) } if (normalization.method == 'SCT') { scale <- FALSE object.list <- PrepSCTIntegration(object.list = object.list, anchor.features = anchor.features ) } if (verbose) { message('Performing PCA for each object') } object.list <- my.lapply(X = object.list, FUN = function(x) { if (normalization.method != 'SCT') { x <- ScaleData(x, features = anchor.features, do.scale = scale, verbose = FALSE) } x <- RunPCA(x, features = anchor.features, verbose = FALSE, npcs = npcs) return(x) } ) fia.allarguments <- c(list( object.list = object.list, reference = reference, anchor.features = anchor.features, reduction = reduction, normalization.method = normalization.method, scale = scale, k.anchor = k.anchor, dims = dims, verbose = verbose ), findintegrationanchors.args ) anchor <- exec("FindIntegrationAnchors",!!!fia.allarguments) object_merged <- merge(x = object.list[[1]], y = object.list[2:length(object.list)] ) anchor.feature <- slot(object = anchor, name = 'anchor.features') if (normalization.method != 'SCT') { object_merged <- ScaleData(object = object_merged, features = anchor.feature, do.scale = scale, verbose = FALSE ) } object_merged <- RunPCA(object_merged, features = anchor.feature, verbose = FALSE, npcs = npcs ) temp <- object_merged[["pca"]] object_merged <- IntegrateEmbeddings( anchorset = anchor, reductions = object_merged[['pca']], new.reduction.name = new.reduction.name, verbose = verbose) object_merged[['pca']] <- temp VariableFeatures(object = object_merged) <- anchor.feature return(object_merged) } #' Transfer embeddings from sketched cells to the full data #' #' @param atom.data Atom data #' @param atom.cells Atom cells #' @param orig.data Original data #' @param embeddings Embeddings of atom cells #' @param sketch.matrix Sketch matrix #' #' @importFrom MASS ginv #' @importFrom Matrix t #' #' @export #' @concept integration #' UnSketchEmbeddings <- function( atom.data, atom.cells = NULL, orig.data, embeddings, sketch.matrix = NULL ) { if(!all(rownames(atom.data) == rownames(orig.data))) { stop('features in atom.data and orig.data are not identical') } else { features = rownames(atom.data) } atom.cells <- atom.cells %||% colnames(x = atom.data) if (inherits(x = orig.data, what = 'DelayedMatrix') ) { stop("PseudobulkExpression does not support DelayedMatrix objects") } else if(inherits(x = orig.data, what = 'IterableMatrix')) { matrix.prod.function <- crossprod_BPCells } else { matrix.prod.function <- crossprod } sketch.matrix <- sketch.matrix %||% as.sparse(diag(length(features))) atom.data <- atom.data[, atom.cells] embeddings <- embeddings[atom.cells,] exp.mat <- as.matrix(x = t(x = atom.data) %*% sketch.matrix) sketch.transform <- ginv(X = exp.mat) %*% embeddings emb <- matrix.prod.function( x = as.matrix(sketch.matrix %*% sketch.transform), y = orig.data ) emb <- as.matrix(x = emb) return(emb) } FeatureSketch <- function(features, ratio = 0.8, seed = 123) { sketch.R <- t(x = CountSketch( nsketch = round(x = ratio * length(x = features)), ncells = length(x = features), seed = seed) ) return(sketch.R) } Seurat/R/roxygen.R0000644000176200001440000000276014730427000013536 0ustar liggesusers#' @include zzz.R #' NULL #' @importFrom utils lsf.str #' @importFrom rlang is_scalar_character #' .rd_methods <- function(method = 'integration') { methods <- sapply( X = grep(pattern = '^package:', x = search(), value = TRUE), FUN = function(x) { fxns <- as.character(x = lsf.str(pos = x)) attrs <- vector(mode = 'logical', length = length(x = fxns)) for (i in seq_along(along.with = fxns)) { mthd <- attr(x = get(x = fxns[i], pos = x), which = 'Seurat.method') attrs[i] <- is_scalar_character(x = mthd) && isTRUE(x = mthd == method) } return(fxns[attrs]) }, simplify = FALSE, USE.NAMES = TRUE ) methods <- Filter(f = length, x = methods) names(x = methods) <- gsub( pattern = '^package:', replacement = '', x = names(x = methods) ) if (!length(x = methods)) { return('') } ret <- vector( mode = 'character', length = sum(vapply( X = methods, FUN = length, FUN.VALUE = integer(length = 1L) )) ) j <- 1L for (pkg in names(x = methods)) { for (fxn in methods[[pkg]]) { ret[j] <- ifelse( test = pkg == 'Seurat', yes = paste0('\\item \\code{\\link{', fxn, '}}'), no = paste0( '\\item \\code{\\link[', pkg, ':', fxn, ']{', pkg, '::', fxn, '}}' ) ) j <- j + 1L } } return(paste('\\itemize{', paste0(' ', ret, collapse = '\n'), '}', sep = '\n')) } Seurat/R/mixscape.R0000644000176200001440000014112114744237333013664 0ustar liggesusers#' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Calculate a perturbation Signature #' #' Function to calculate perturbation signature for pooled CRISPR screen datasets. #' For each target cell (expressing one target gRNA), we identified 20 cells #' from the control pool (non-targeting cells) with the most similar mRNA #' expression profiles. The perturbation signature is calculated by subtracting the #' averaged mRNA expression profile of the non-targeting neighbors from the mRNA #' expression profile of the target cell. #' #' @param object An object of class Seurat. #' @param assay Name of Assay PRTB signature is being calculated on. #' @param features Features to compute PRTB signature for. Defaults to the #' variable features set in the assay specified. #' @param slot Data slot to use for PRTB signature calculation. #' @param gd.class Metadata column containing target gene classification. #' @param nt.cell.class Non-targeting gRNA cell classification identity. #' @param split.by Provide metadata column if multiple biological replicates #' exist to calculate PRTB signature for every replicate separately. #' @param num.neighbors Number of nearest neighbors to consider. #' @param ndims Number of dimensions to use from dimensionality reduction method. #' @param reduction Reduction method used to calculate nearest neighbors. #' @param new.assay.name Name for the new assay. #' @param verbose Display progress + messages #' @return Returns a Seurat object with a new assay added containing the #' perturbation signature for all cells in the data slot. #' #' @importFrom RANN nn2 #' @export #' @concept mixscape #' CalcPerturbSig <- function( object, assay = NULL, features = NULL, slot = "data", gd.class = "guide_ID", nt.cell.class = "NT", split.by = NULL, num.neighbors = NULL, reduction = "pca", ndims = 15, new.assay.name = "PRTB", verbose = TRUE ) { assay <- assay %||% DefaultAssay(object = object ) if (is.null(x = reduction)) { stop('Please provide dimensionality reduction name.') } if (is.null(x = num.neighbors)) { stop("Please specify number of nearest neighbors to consider") } if (is.null(x = ndims)) { stop("Please provide number of ", reduction, " dimensions to consider") } features <- features %||% VariableFeatures(object = object[[assay]]) if (length(x = features) == 0) { features <- rownames(x = GetAssayData(object = object[[assay]], slot = slot)) } if (! is.null(x = split.by)) { Idents(object = object) <- split.by } else { Idents(object = object) <- "rep1" } replicate <- unique(x = Idents(object = object)) all_diff <- list() all_nt_cells <- Cells(x = object)[which(x = object[[]][gd.class] == nt.cell.class)] all_neighbors <- list() for (r in replicate) { if (verbose) { message("Processing ", r) } all_cells <- WhichCells(object = object, idents = r) nt_cells <- intersect(x = all_nt_cells, all_cells) # get pca cell embeddings all_mtx <- Embeddings(object = object, reduction = reduction)[all_cells, ] nt_mtx <- Embeddings(object = object, reduction = reduction)[nt_cells, ] # run nn2 to find the 20 nearest NT neighbors for all cells. Use the same # number of PCs as the ones you used for umap neighbors <- NNHelper( data = nt_mtx[, 1:ndims], query = all_mtx[, 1:ndims], k = num.neighbors, method = "rann" ) diff <- PerturbDiff( object = object, assay = assay, slot = slot, all_cells = all_cells, nt_cells = nt_cells, features = features, neighbors = neighbors, verbose = verbose ) all_diff[[r]] <- diff all_neighbors[[make.names(names = paste0(new.assay.name, "_", r))]] <- neighbors } slot(object = object, name = "tools")[[paste("CalcPerturbSig", assay, reduction, sep = ".")]] <- all_neighbors all_diff <- do.call(what = cbind, args = all_diff) prtb.assay <- suppressWarnings( expr = CreateAssayObject( data = all_diff[, colnames(x = object)], min.cells = -Inf, min.features = -Inf, check.matrix = FALSE ) ) object[[new.assay.name]] <- prtb.assay object <- LogSeuratCommand(object = object) return(object) } #' DE and EnrichR pathway visualization barplot #' #' @inheritParams FindMarkers #' @param object Name of object class Seurat. #' @param ident.1 Cell class identity 1. #' @param ident.2 Cell class identity 2. #' @param balanced Option to display pathway enrichments for both negative and #' positive DE genes.If false, only positive DE gene will be displayed. #' @param max.genes Maximum number of genes to use as input to enrichR. #' @param logfc.threshold Limit testing to genes which show, on average, at least #' X-fold difference (log-scale) between the two groups of cells. Default is 0.25. #' Increasing logfc.threshold speeds up the function, but can miss weaker signals. #' @param p.val.cutoff Cutoff to select DE genes. #' @param cols A list of colors to use for barplots. #' @param enrich.database Database to use from enrichR. #' @param num.pathway Number of pathways to display in barplot. #' @param return.gene.list Return list of DE genes #' #' @return Returns one (only enriched) or two (both enriched and depleted) #' barplots with the top enriched/depleted GO terms from EnrichR. #' #' @importFrom ggplot2 ggplot geom_bar geom_density coord_flip scale_fill_manual #' ylab ggtitle theme_classic theme element_text #' @importFrom patchwork wrap_plots #' #' @export #' @concept mixscape DEenrichRPlot <- function( object, ident.1 = NULL, ident.2 = NULL, balanced = TRUE, logfc.threshold = 0.25, assay = NULL, max.genes, test.use = 'wilcox', p.val.cutoff = 0.05, cols = NULL, enrich.database = NULL, num.pathway = 10, return.gene.list = FALSE, ... ) { enrichr.installed <- PackageCheck("enrichR", error = FALSE) if (!enrichr.installed[1]) { stop( "Please install the enrichR package to use DEenrichRPlot", "\nThis can be accomplished with the following command: ", "\n----------------------------------------", "\ninstall.packages('enrichR')", "\n----------------------------------------", call. = FALSE ) } if (is.null(x = enrich.database)) { stop("Please specify the name of enrichR database to use") } if (!is.numeric(x = max.genes)) { stop("please set max.genes") } assay <- assay %||% DefaultAssay(object = object) DefaultAssay(object = object) <- assay all.markers <- FindMarkers( object = object, ident.1 = ident.1, ident.2 = ident.2, only.pos = FALSE, logfc.threshold = logfc.threshold, test.use = test.use, assay = assay ) pos.markers <- all.markers[all.markers[, 2] > logfc.threshold & all.markers[, 1] < p.val.cutoff, , drop = FALSE] if(nrow(pos.markers) == 0){ message("No positive markers pass the logfc.thershold") pos.er <- c() } else{ pos.markers.list <- rownames(x = pos.markers)[1:min(max.genes, nrow(x = pos.markers))] pos.er <- enrichR::enrichr(genes = pos.markers.list, databases = enrich.database) pos.er <- do.call(what = cbind, args = pos.er) pos.er$log10pval <- -log10(x = pos.er[, paste(enrich.database, sep = ".", "P.value")]) pos.er$term <- pos.er[, paste(enrich.database, sep = ".", "Term")] pos.er <- pos.er[1:num.pathway, ] pos.er$term <- factor(x = pos.er$term, levels = pos.er$term[order(pos.er$log10pval)]) gene.list <- list(pos = pos.er) } if (isTRUE(x = balanced)) { neg.markers <- all.markers[all.markers[, 2] < -logfc.threshold & all.markers[, 1] < p.val.cutoff, , drop = FALSE] neg.markers.list <- rownames(x = neg.markers)[1:min(max.genes, nrow(x = neg.markers))] Sys.sleep(1) neg.er <- enrichR::enrichr(genes = neg.markers.list, databases = enrich.database) neg.er <- do.call(what = cbind, args = neg.er) neg.er$log10pval <- -log10(x = neg.er[, paste(enrich.database, sep = ".", "P.value")]) neg.er$term <- neg.er[, paste(enrich.database, sep = ".", "Term")] neg.er <- neg.er[1:num.pathway, ] neg.er$term <- factor(x = neg.er$term, levels = neg.er$term[order(neg.er$log10pval)]) if(isTRUE(length(neg.er$term) == 0) & isTRUE(length(pos.er == 0))){ stop("No positive or negative marker genes identified") } else{ if(isTRUE(length(neg.er$term) == 0)){ gene.list <- list(pos = pos.er) } else{ gene.list <- list(pos = pos.er, neg = neg.er) } } } if (return.gene.list) { return(gene.list) } if(nrow(pos.markers) == 0){ message("No positive markers to plot") if (isTRUE(x = balanced)) { p2 <- ggplot(data = neg.er, aes_string(x = "term", y = "log10pval")) + geom_bar(stat = "identity", fill = "indianred2") + coord_flip() + xlab("Pathway") + scale_fill_manual(values = cols, drop = FALSE) + ylab("-log10(pval)") + ggtitle(paste(enrich.database, ident.1, sep = "_", "negative markers")) + theme_classic() + geom_text(aes_string(label = "term", y = 0), size = 5, color = "black", position = position_dodge(1), hjust = 0)+ theme(axis.title.y= element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank()) p <- p2 } else{ stop("Nothing to plot") } } else { p <- ggplot(data = pos.er, aes_string(x = "term", y = "log10pval")) + geom_bar(stat = "identity", fill = "dodgerblue") + coord_flip() + xlab("Pathway") + scale_fill_manual(values = cols, drop = FALSE) + ylab("-log10(pval)") + ggtitle(paste(enrich.database, ident.1, sep = "_", "positive markers")) + theme_classic() + geom_text(aes_string(label = "term", y = 0), size = 5, color = "black", position = position_dodge(1), hjust = 0)+ theme(axis.title.y= element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank()) if (isTRUE(x = balanced)) { p2 <- ggplot(data = neg.er, aes_string(x = "term", y = "log10pval")) + geom_bar(stat = "identity", fill = "indianred2") + coord_flip() + xlab("Pathway") + scale_fill_manual(values = cols, drop = FALSE) + ylab("-log10(pval)") + ggtitle(paste(enrich.database, ident.1, sep = "_", "negative markers")) + theme_classic() + geom_text(aes_string(label = "term", y = 0), size = 5, color = "black", position = position_dodge(1), hjust = 0)+ theme(axis.title.y= element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank()) p <- p+p2 } } return(p) } #' Linear discriminant analysis on pooled CRISPR screen data. #' #' This function performs unsupervised PCA on each mixscape class separately and projects each subspace onto all #' cells in the data. Finally, it uses the first 10 principle components from each projection as input to lda in MASS package together with mixscape class labels. #' #' @inheritParams PrepLDA #' @inheritParams RunLDA #' #' @return Returns a Seurat object with LDA added in the reduction slot. #' #' @export #' @concept mixscape #' MixscapeLDA <- function( object, assay = NULL, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "LDA_", seed = 42, pc.assay = "PRTB", labels = "gene", nt.label = "NT", npcs = 10, verbose = TRUE, logfc.threshold = 0.25 ) { projected_pcs <- PrepLDA( object = object, de.assay = assay, pc.assay = pc.assay, labels = labels, nt.label = nt.label, npcs = npcs , verbose = verbose ) lda.lables <- object[[labels]][,] object_lda <- RunLDA( object = projected_pcs, labels = lda.lables, assay = assay, verbose = verbose ) object[["lda"]] <- object_lda return(object) } #' Function to prepare data for Linear Discriminant Analysis. #' #' This function performs unsupervised PCA on each mixscape class separately and projects each subspace onto all #' cells in the data. #' #' @param object An object of class Seurat. #' @param de.assay Assay to use for selection of DE genes. #' @param pc.assay Assay to use for running Principle components analysis. #' @param labels Meta data column with target gene class labels. #' @param nt.label Name of non-targeting cell class. #' @param npcs Number of principle components to use. #' @param verbose Print progress bar. #' @param logfc.threshold Limit testing to genes which show, on average, at least #' X-fold difference (log-scale) between the two groups of cells. Default is 0.25. #' Increasing logfc.threshold speeds up the function, but can miss weaker signals. #' @return Returns a list of the first 10 PCs from each projection. #' #' @export #' @concept mixscape #' PrepLDA <- function( object, de.assay = "RNA", pc.assay = "PRTB", labels = "gene", nt.label = "NT", npcs = 10, verbose = TRUE, logfc.threshold = 0.25 ) { projected_pcs <- list() gene_list <- setdiff(x = unique(x = object[[labels]][, 1]), y = nt.label) Idents(object = object) <- labels DefaultAssay(object = object) <- pc.assay all_genes <- list() nt.cells <- WhichCells(object = object, idents = nt.label) for (g in gene_list) { if (verbose) { message(g) } gd.cells <- WhichCells(object = object, idents = g) gene_set <- TopDEGenesMixscape( object = object, ident.1 = gd.cells, ident.2 = nt.cells, de.assay = de.assay, logfc.threshold = logfc.threshold, labels = labels, verbose = verbose ) if (length(x = gene_set) < (npcs + 1)) { all_genes[[g]] <- character() next } all_genes[[g]] <- gene_set } all_markers <- unique(x = unlist(x = all_genes)) missing_genes <- all_markers[!all_markers %in% rownames(x = object[[pc.assay]])] object <- GetMissingPerturb(object = object, assay = pc.assay, features = missing_genes, verbose = verbose) for (g in gene_list) { if (verbose) { message(g) } gene_subset <- subset(x = object, idents = c(g, nt.label)) gene_set <- all_genes[[g]] if (length(x = gene_set) == 0) { next } gene_subset <- ScaleData( object = gene_subset, features = gene_set, verbose = FALSE ) gene_subset <- RunPCA( object = gene_subset, features = gene_set, npcs = npcs, verbose = FALSE ) project_pca <- ProjectCellEmbeddings( reference = gene_subset, query = object, dims = 1:npcs, verbose = FALSE ) colnames(x = project_pca) <- paste(g, colnames(x = project_pca), sep = "_") projected_pcs[[g]] <- project_pca } return(projected_pcs) } #' @param object Input values for LDA (numeric), with observations as rows #' @param labels Observation labels for LDA #' @param assay Name of Assay LDA is being run on #' @param ndims.print PCs to print genes for #' @param nfeatures.print Number of genes to print for each PC #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. LDA by default #' @param seed Set a random seed. By default, sets the seed to 42. Setting #' NULL will not set a seed. #' #' @importFrom MASS lda #' @importFrom stats predict #' #' @rdname RunLDA #' @concept mixscape #' @export #' @method RunLDA default #' RunLDA.default <- function( object, labels, assay = NULL, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "LDA_", seed = 42, ... ) { if (!is.null(x = seed)) { set.seed(seed = seed) } object <- data.frame(object) var_names <- colnames(x = object) object$lda_cluster_label <- labels lda_results <- lda(formula = lda_cluster_label ~ ., data = object) lda_predictions <- predict(object = lda_results, newdata = object) lda_cv <-lda( formula = lda_cluster_label ~ ., data = object, CV = TRUE )$posterior feature.loadings <- lda_results$scaling cell.embeddings <- lda_predictions$x lda.assignments <- lda_predictions$class lda.posterior <- lda_predictions$posterior colnames(x = lda.posterior) <- paste0("LDAP_", colnames(x = lda.posterior)) rownames(x = feature.loadings) <- var_names colnames(x = feature.loadings) <- paste0(reduction.key, 1:ncol(x = cell.embeddings)) rownames(x = cell.embeddings) <- rownames(x = object) colnames(x = cell.embeddings) <- colnames(x = feature.loadings) reduction.data <- CreateDimReducObject( embeddings = cell.embeddings, loadings = feature.loadings, assay = assay, key = reduction.key, misc = list( assignments = lda.assignments, posterior = lda.posterior, model = lda_results, cv = lda_cv ) ) if (verbose) { print(x = reduction.data, dims = ndims.print, nfeatures = nfeatures.print) } return(reduction.data) } #' Function to perform Linear Discriminant Analysis. #' #' @param ndims.print Number of LDA dimensions to print. #' @param nfeatures.print Number of features to print for each LDA component. #' @param reduction.key Reduction key name. #' #' @rdname RunLDA #' @concept mixscape #' @export #' @method RunLDA Assay #' RunLDA.Assay <- function( object, assay = NULL, labels, features = NULL, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "LDA_", seed = 42, ... ) { data.use <- PrepDR( object = object, features = features, verbose = verbose ) reduction.data <- RunLDA( object = t(x = data.use), assay = assay, labels = labels, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed = seed, ... ) return(reduction.data) } #' @param object An object of class Seurat. #' @param assay Assay to use for performing Linear Discriminant Analysis (LDA). #' @param labels Meta data column with target gene class labels. #' @param features Features to compute LDA on #' @param reduction.name dimensional reduction name, lda by default #' @param reduction.key Reduction key name. #' @param seed Value for random seed #' @param verbose Print the top genes associated with high/low loadings for #' the PCs #' @param ndims.print Number of LDA dimensions to print. #' @param nfeatures.print Number of features to print for each LDA component. #' #' @rdname RunLDA #' @concept mixscape #' @export #' @method RunLDA Seurat #' RunLDA.Seurat <- function( object, assay = NULL, labels, features = NULL, reduction.name = "lda", reduction.key = "LDA_", seed = 42, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, ... ) { assay <- assay %||% DefaultAssay(object = object) reduction.data <- RunLDA( object = object[[assay]], assay = assay, labels = labels, features = features, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed = seed, ... ) object[[reduction.name]] <- reduction.data object$lda.assignments <- slot(object = object[[reduction.name]], name = "misc")[["assignments"]] object <- AddMetaData( object = object, metadata = as.data.frame( x = slot(object = object[[reduction.name]], name = "misc")[["posterior"]] ) ) object <- LogSeuratCommand(object = object) object <- ProjectDim( object = object, reduction = reduction.name, assay = assay, verbose = verbose, dims.print = ndims.print, nfeatures.print = nfeatures.print ) Loadings(object = object[[reduction.name]]) <- Loadings( object = object[[reduction.name]], projected = TRUE ) return(object) } #' Run Mixscape #' #' Function to identify perturbed and non-perturbed gRNA expressing cells that #' accounts for multiple treatments/conditions/chemical perturbations. #' #' @importFrom ggplot2 geom_density position_dodge #' @param object An object of class Seurat. #' @param assay Assay to use for mixscape classification. #' @param slot Assay data slot to use. #' @param labels metadata column with target gene labels. #' @param nt.class.name Classification name of non-targeting gRNA cells. #' @param new.class.name Name of mixscape classification to be stored in #' metadata. #' @param min.de.genes Required number of genes that are differentially #' expressed for method to separate perturbed and non-perturbed cells. #' @param min.cells Minimum number of cells in target gene class. If fewer than #' this many cells are assigned to a target gene class during classification, #' all are assigned NP. #' @param de.assay Assay to use when performing differential expression analysis. #' Usually RNA. #' @param logfc.threshold Limit testing to genes which show, on average, #' at least X-fold difference (log-scale) between the two groups of cells. #' Default is 0.25 Increasing logfc.threshold speeds up the function, but can miss #' weaker signals. #' @param iter.num Number of normalmixEM iterations to run if convergence does #' not occur. #' @param verbose Display messages #' @param split.by metadata column with experimental condition/cell type #' classification information. This is meant to be used to account for cases a #' perturbation is condition/cell type -specific. #' @param fine.mode When this is equal to TRUE, DE genes for each target gene #' class will be calculated for each gRNA separately and pooled into one DE list #' for calculating the perturbation score of every cell and their subsequent #' classification. #' @param fine.mode.labels metadata column with gRNA ID labels. #' @param prtb.type specify type of CRISPR perturbation expected for labeling mixscape classifications. Default is KO. #' @return Returns Seurat object with with the following information in the #' meta data and tools slots: #' \describe{ #' \item{mixscape_class}{Classification result with cells being either #' classified as perturbed (KO, by default) or non-perturbed (NP) based on their target #' gene class.} #' \item{mixscape_class.global}{Global classification result (perturbed, NP or NT)} #' \item{p_ko}{Posterior probabilities used to determine if a cell is KO (default). Name of this item will change to match prtb.type parameter setting. #' (>0.5) or NP} #' \item{perturbation score}{Perturbation scores for every cell calculated in #' the first iteration of the function.} #' } #' #' @export #' @concept mixscape #' RunMixscape <- function( object, assay = "PRTB", slot = "scale.data", labels = "gene", nt.class.name = "NT", new.class.name = "mixscape_class", min.de.genes = 5, min.cells = 5, de.assay = "RNA", logfc.threshold = 0.25, iter.num = 10, verbose = FALSE, split.by = NULL, fine.mode = FALSE, fine.mode.labels = "guide_ID", prtb.type = "KO" ) { mixtools.installed <- PackageCheck("mixtools", error = FALSE) if (!mixtools.installed[1]) { stop("Please install the mixtools package to use RunMixscape", "\nThis can be accomplished with the following command: ", "\n----------------------------------------", "\ninstall.packages('mixtools')", "\n----------------------------------------", call. = FALSE) } assay <- assay %||% DefaultAssay(object = object) if (is.null(x = labels)) { stop("Please specify target gene class metadata name") } prtb_markers <- list() object[[new.class.name]] <- object[[labels]] object[[new.class.name]][, 1] <- as.character(x = object[[new.class.name]][, 1]) object[[paste0(new.class.name, "_p_", tolower(x = prtb.type))]] <- 0 #create list to store perturbation scores. gv.list <- list() if (is.null(x = split.by)) { split.by <- splits <- "con1" } else { splits <- as.character(x = unique(x = object[[split.by]][, 1])) } # determine gene sets across all splits/groups cells.s.list <- list() for (s in splits) { Idents(object = object) <- split.by cells.s <- WhichCells(object = object, idents = s) cells.s.list[[s]] <- cells.s genes <- setdiff(x = unique(x = object[[labels]][cells.s, 1]), y = nt.class.name) Idents(object = object) <- labels for (gene in genes) { if (isTRUE(x = verbose)) { message("Processing ", gene) } orig.guide.cells <- intersect(x = WhichCells(object = object, idents = gene), y = cells.s) nt.cells <- intersect(x = WhichCells(object = object, idents = nt.class.name), y = cells.s) if (isTRUE(x = fine.mode)) { guides <- setdiff(x = unique(x = object[[fine.mode.labels]][orig.guide.cells, 1]), y = nt.class.name) all.de.genes <- c() for (gd in guides) { gd.cells <- rownames(x = object[[]][orig.guide.cells, ])[which(x = object[[]][orig.guide.cells, fine.mode.labels] == gd)] de.genes <- TopDEGenesMixscape( object = object, ident.1 = gd.cells, ident.2 = nt.cells, de.assay = de.assay, logfc.threshold = logfc.threshold, labels = fine.mode.labels, verbose = verbose ) all.de.genes <- c(all.de.genes, de.genes) } all.de.genes <- unique(all.de.genes) } else { all.de.genes <- TopDEGenesMixscape( object = object, ident.1 = orig.guide.cells, ident.2 = nt.cells, de.assay = de.assay, logfc.threshold = logfc.threshold, labels = labels, verbose = verbose ) } prtb_markers[[s]][[gene]] <- all.de.genes if (length(x = all.de.genes) < min.de.genes) { prtb_markers[[s]][[gene]] <- character() } } } all_markers <- unique(x = unlist(x = prtb_markers)) missing_genes <- all_markers[!all_markers %in% rownames(x = object[[assay]])] object <- GetMissingPerturb(object = object, assay = assay, features = missing_genes, verbose = verbose) for (s in splits) { cells.s <- cells.s.list[[s]] genes <- setdiff(x = unique(x = object[[labels]][cells.s, 1]), y = nt.class.name) if (verbose) { message("Classifying cells for: ") } for (gene in genes) { Idents(object = object) <- labels post.prob <- 0 orig.guide.cells <- intersect(x = WhichCells(object = object, idents = gene), y = cells.s) nt.cells <- intersect(x = WhichCells(object = object, idents = nt.class.name), y = cells.s) all.cells <- c(orig.guide.cells, nt.cells) if (length(x = prtb_markers[[s]][[gene]]) == 0) { if (verbose) { message(" Fewer than ", min.de.genes, " DE genes for ", gene, ". Assigning cells as NP.") } object[[new.class.name]][orig.guide.cells, 1] <- paste0(gene, " NP") } else { if (verbose) { message(" ", gene) } de.genes <- prtb_markers[[s]][[gene]] dat <- GetAssayData(object = object[[assay]], slot = "data")[de.genes, all.cells, drop = FALSE] if (slot == "scale.data") { dat <- ScaleData(object = dat, features = de.genes, verbose = FALSE) } converged <- FALSE n.iter <- 0 old.classes <- object[[new.class.name]][all.cells, ] while (!converged && n.iter < iter.num) { Idents(object = object) <- new.class.name guide.cells <- intersect(x = WhichCells(object = object, idents = gene), y = cells.s) vec <- rowMeans2(x = dat[, guide.cells, drop = FALSE]) - rowMeans2(x = dat[, nt.cells, drop = FALSE]) pvec <- apply(X = dat, MARGIN = 2, FUN = ProjectVec, v2 = vec) if (n.iter == 0){ #store pvec gv <- as.data.frame(x = pvec) gv[, labels] <- nt.class.name gv[intersect(x = rownames(x = gv), y = guide.cells), labels] <- gene gv.list[[gene]][[s]] <- gv } guide.norm <- DefineNormalMixscape(pvec[guide.cells]) nt.norm <- DefineNormalMixscape(pvec[nt.cells]) mm <- mixtools::normalmixEM( x = pvec, mu = c(nt.norm$mu, guide.norm$mu), sigma = c(nt.norm$sd, guide.norm$sd), k = 2, mean.constr = c(nt.norm$mu, NA), sd.constr = c(nt.norm$sd, NA), verb = FALSE, maxit = 5000, maxrestarts = 100 ) lik.ratio <- dnorm(x = pvec[orig.guide.cells], mean = mm$mu[1], sd = mm$sigma[1]) / dnorm(x = pvec[orig.guide.cells], mean = mm$mu[2], sd = mm$sigma[2]) post.prob <- 1/(1 + lik.ratio) object[[new.class.name]][names(x = which(post.prob > 0.5)), 1] <- gene object[[new.class.name]][names(x = which(post.prob < 0.5)), 1] <- paste(gene, " NP", sep = "") if (length(x = which(x = object[[new.class.name]] == gene & Cells(x = object) %in% cells.s)) < min.de.genes) { if (verbose) { message("Fewer than ", min.cells, " cells assigned as ", gene, "Assigning all to NP.") } object[[new.class.name]][guide.cells, 1] <- "NP" converged <- TRUE } if (all(object[[new.class.name]][all.cells, ] == old.classes)) { converged <- TRUE } old.classes <- object[[new.class.name]][all.cells, ] n.iter <- n.iter + 1 } object[[new.class.name]][which(x = object[[new.class.name]] == gene & Cells(x = object) %in% cells.s), 1] <- paste(gene, prtb.type, sep = " ") } object[[paste0(new.class.name, ".global")]] <- as.character(x = sapply(X = as.character(x = object[[new.class.name]][, 1]), FUN = function(x) {strsplit(x = x, split = " (?=[^ ]+$)", perl = TRUE)[[1]][2]})) object[[paste0(new.class.name, ".global")]][which(x = is.na(x = object[[paste0(new.class.name, ".global")]])), 1] <- nt.class.name object[[paste0(new.class.name,"_p_", tolower(prtb.type))]][names(x = post.prob), 1] <- post.prob } } Tool(object = object) <- gv.list Idents(object = object) <- new.class.name return(object) } #' Differential expression heatmap for mixscape #' #' Draws a heatmap of single cell feature expression with cells ordered by their #' mixscape ko probabilities. #' #' @inheritParams FindMarkers #' @inheritParams DoHeatmap #' @param max.cells.group Number of cells per identity to plot. #' @param max.genes Total number of DE genes to plot. #' @param balanced Plot an equal number of genes with both groups of cells. #' @param logfc.threshold Limit testing to genes which show, on average, at least #' X-fold difference (log-scale) between the two groups of cells. Default is 0.25. #' Increasing logfc.threshold speeds up the function, but can miss weaker signals. #' @param order.by.prob Order cells on heatmap based on their mixscape knockout #' probability from highest to lowest score. #' @param group.by (Deprecated) Option to split densities based on mixscape #' classification. Please use mixscape.class instead #' @param mixscape.class metadata column with mixscape classifications. #' @param prtb.type specify type of CRISPR perturbation expected for labeling #' mixscape classifications. Default is KO. #' @param fc.name Name of the fold change, average difference, or custom #' function column in the output data.frame. Default is avg_log2FC #' @param pval.cutoff P-value cut-off for selection of significantly DE genes. #' @return A ggplot object. #' #' @importFrom stats median #' @importFrom scales hue_pal #' @importFrom ggplot2 annotation_raster coord_cartesian ggplot_build aes_string #' @export #' @concept mixscape #' MixscapeHeatmap <- function( object, ident.1 = NULL, ident.2 = NULL, balanced = TRUE, logfc.threshold = 0.25, assay = "RNA", max.genes = 100, test.use ='wilcox', max.cells.group = NULL, order.by.prob = TRUE, group.by = NULL, mixscape.class = "mixscape_class", prtb.type = "KO", fc.name = "avg_log2FC", pval.cutoff = 5e-2, ... ) { if (!is.null(x = group.by)) { message("The group.by parameter is being deprecated. Please use ", "mixscape.class instead. Setting mixscape.class = ", group.by, " and continuing.") mixscape.class <- group.by } DefaultAssay(object = object) <- assay if (is.numeric(x = max.genes)) { all.markers <- FindMarkers( object = object, ident.1 = ident.1, ident.2 = ident.2, only.pos = FALSE, logfc.threshold = logfc.threshold, test.use = test.use ) if (balanced) { pos.markers <- all.markers[which(x = all.markers[,fc.name] > (logfc.threshold)), ] neg.markers <- all.markers[which(x = all.markers[,fc.name] < (-logfc.threshold)), ] if (length(x = rownames(x = subset(x = pos.markers, p_val < pval.cutoff))) < max.genes ) { marker.list <- c(rownames(x = subset(x = pos.markers, p_val < pval.cutoff))) if (length(x = rownames(x = subset(x = neg.markers, p_val < pval.cutoff))) < max.genes){ marker.list <- c(marker.list, rownames(x = subset(x = neg.markers, p_val < pval.cutoff))) } else { marker.list <- c(marker.list, rownames(x = subset(x = neg.markers, p_val < pval.cutoff))[1:max.genes]) } } else { marker.list <- c(rownames(x = subset(x = pos.markers, p_val < pval.cutoff))[1:max.genes]) if (length(x = rownames(x = subset(x = neg.markers, p_val < pval.cutoff))) < max.genes) { marker.list <- c(marker.list, rownames(x = subset(x = neg.markers, p_val < pval.cutoff))) } else { marker.list <- c(marker.list, rownames(x = subset(x = neg.markers, p_val < pval.cutoff))[1:max.genes]) } } } else { pos.markers <- all.markers[which(x = all.markers[, fc.name] > (logfc.threshold)),] if (length(x = rownames(x = subset(x = pos.markers, p_val < pval.cutoff))) < max.genes ){ marker.list <- c(rownames(x = subset(x = pos.markers, p_val < pval.cutoff))) } else { marker.list <- c(rownames(x = subset(x = pos.markers, p_val < pval.cutoff))[1:max.genes]) } } if (is.null(x = max.cells.group)) { if (is.null(x = group.by)) { sub2 <- subset(x = object, idents = c(ident.1, ident.2)) } else{ sub2 <- subset(x = object, idents = c(ident.1, ident.2)) Idents(object = sub2) <- group.by } } else { if (is.null(x = group.by)) { sub2 <- subset(x = object, idents = c(ident.1, ident.2), downsample = max.cells.group) } else { sub <- subset(x = object, idents = c(ident.1, ident.2)) Idents(object = sub) <- group.by sub2 <- subset(x = sub, downsample = max.cells.group) } } sub2 <- ScaleData(object = sub2, features = marker.list, assay = assay) if (isTRUE(x = order.by.prob)) { p_ko <- sub2[[paste0(mixscape.class, "_p_", tolower(x = prtb.type) )]][, 1, drop = FALSE] ordered.cells <- rownames(x = p_ko)[order(p_ko[,1], decreasing = TRUE)] p <- DoHeatmap(object = sub2, features = marker.list, label = TRUE, cells = ordered.cells, assay = assay, ...) } else{ p <- DoHeatmap(object = sub2, features = marker.list, label = TRUE, cells = sample(x = Cells(x = sub2)), assay = assay, ...) } return(p) } } #' Function to plot perturbation score distributions. #' #' Density plots to visualize perturbation scores calculated from RunMixscape #' function. #' #' @param object An object of class Seurat. #' @param target.gene.ident Target gene name to visualize perturbation scores for. #' @param target.gene.class meta data column specifying all target gene names in the experiment. #' @param before.mixscape Option to split densities based on mixscape classification (default) or original target gene classification. #' Default is set to NULL and plots cells by original class ID. #' @param col Specify color of target gene class or knockout cell class. For #' control non-targeting and non-perturbed cells, colors are set to different #' shades of grey. #' @param mixscape.class meta data column specifying mixscape classifications. #' @param prtb.type specify type of CRISPR perturbation expected for labeling mixscape classifications. Default is KO. #' @param split.by For datasets with more than one cell type. Set equal TRUE to visualize perturbation scores for each cell type separately. #' @return A ggplot object. #' #' @importFrom stats median #' @importFrom scales hue_pal #' @importFrom ggplot2 annotation_raster coord_cartesian ggplot_build aes_string #' geom_density theme_classic #' @export #' @concept mixscape #' PlotPerturbScore <- function( object, target.gene.class = "gene", target.gene.ident = NULL, mixscape.class = "mixscape_class", col = "orange2", split.by = NULL, before.mixscape = FALSE, prtb.type = "KO" ){ if(is.null(target.gene.ident) == TRUE){ message("Please provide name of target gene class to plot") } prtb_score_list <- Tool(object = object, slot = "RunMixscape")[[target.gene.ident]] for (nm in names(prtb_score_list)){ prtb_score_list[[nm]]['name'] <- nm } prtb_score <- do.call(rbind, prtb_score_list) prtb_score[, 2] <- as.factor(x = prtb_score[, 2]) gd <- setdiff(x = unique(x = prtb_score[, target.gene.class]), y = target.gene.ident) colnames(x = prtb_score)[2] <- "gene" prtb_score$cell.bc <- sapply(rownames(prtb_score), FUN = function(x) substring(x, regexpr("[.]", x) + 1)) if (isTRUE(x = before.mixscape)) { cols <- setNames( object = c("grey49", col), nm = c(gd, target.gene.ident) ) p <- ggplot(data = prtb_score, mapping = aes_string(x = "pvec", color = "gene")) + geom_density() + theme_classic() top_r <- ggplot_build(p)$layout$panel_params[[1]]$y.range[2] prtb_score$y.jitter <- prtb_score$pvec prtb_score$y.jitter[prtb_score[, "gene"] == gd] <- runif( n = prtb_score$y.jitter[prtb_score[, "gene"] == gd], min = 0.001, max = top_r / 10 ) prtb_score$y.jitter[prtb_score[,"gene"] == target.gene.ident] <- runif( n = prtb_score$y.jitter[prtb_score[, "gene"] == target.gene.ident], min = -top_r / 10, max = 0 ) if(is.null(split.by)==FALSE) { prtb_score$split <- as.character(object[[split.by]][prtb_score$cell.bc,1]) p2 <- p + scale_color_manual(values = cols, drop = FALSE) + geom_density(size = 1.5) + geom_point(data = prtb_score, aes_string(x = "pvec", y = "y.jitter"), size = 0.1) + theme(axis.text = element_text(size = 18), axis.title = element_text(size = 20)) + ylab("Cell density") + xlab("perturbation score") + theme(legend.key.size = unit(1, "cm"), legend.text = element_text(colour = "black", size = 14), legend.title = element_blank(), plot.title = element_text(size = 16, face = "bold"))+ facet_wrap(vars(split)) } else{ p2 <- p + scale_color_manual(values = cols, drop = FALSE) + geom_density(size = 1.5) + geom_point(data = prtb_score, aes_string(x = "pvec", y = "y.jitter"), size = 0.1) + theme(axis.text = element_text(size = 18), axis.title = element_text(size = 20)) + ylab("Cell density") + xlab("perturbation score") + theme(legend.key.size = unit(1, "cm"), legend.text = element_text(colour = "black", size = 14), legend.title = element_blank(), plot.title = element_text(size = 16, face = "bold")) } } else { cols <- setNames( object = c("grey49", "grey79", col), nm = c(gd, paste0(target.gene.ident, " NP"), paste(target.gene.ident, prtb.type, sep = " ")) ) #add mixscape identities prtb_score$mix <- object[[mixscape.class]][prtb_score$cell.bc,] p <- ggplot(data = prtb_score, aes_string(x = "pvec", color = "mix")) + geom_density() + theme_classic() top_r <- ggplot_build(p)$layout$panel_params[[1]]$y.range[2] prtb_score$y.jitter <- prtb_score$pvec gd2 <- setdiff( x = unique(x = prtb_score[, "mix"]), y = c(paste0(target.gene.ident, " NP"), paste(target.gene.ident, prtb.type, sep = " ")) ) prtb_score$y.jitter[prtb_score[, "mix"] == gd2] <- runif( n = prtb_score$y.jitter[prtb_score[, "mix"] == gd2], min = 0.001, max = top_r / 10 ) prtb_score$y.jitter[prtb_score$mix == paste(target.gene.ident, prtb.type, sep = " ")] <- runif( n = prtb_score$y.jitter[prtb_score[, "mix"] == paste(target.gene.ident, prtb.type, sep = " ")], min = -top_r / 10, max = 0 ) prtb_score$y.jitter[prtb_score$mix == paste0(target.gene.ident, " NP")] <- runif( n = prtb_score$y.jitter[prtb_score[, "mix"] == paste0(target.gene.ident, " NP")], min = -top_r / 10, max = 0 ) prtb_score[, "mix"] <- as.factor(x = prtb_score[,"mix"]) if(is.null(split.by) == FALSE){ prtb_score$split <- as.character(object[[split.by]][prtb_score$cell.bc,1]) p2 <- ggplot(data = prtb_score, aes_string(x = "pvec", color = "mix")) + scale_color_manual(values = cols, drop = FALSE) + geom_density(size = 1.5) + geom_point(aes_string(x = "pvec", y = "y.jitter"), size = 0.1) + theme_classic() + theme(axis.text = element_text(size = 18), axis.title = element_text(size = 20)) + ylab("Cell density") + xlab("perturbation score") + theme(legend.key.size = unit(1, "cm"), legend.text = element_text(colour ="black", size = 14), legend.title = element_blank(), plot.title = element_text(size = 16, face = "bold"))+ facet_wrap(vars(split)) } else{ p2 <- p + scale_color_manual(values = cols, drop = FALSE) + geom_density(size = 1.5) + geom_point(data = prtb_score, aes_string(x = "pvec", y = "y.jitter"), size = 0.1) + theme(axis.text = element_text(size = 18), axis.title = element_text(size = 20)) + ylab("Cell density") + xlab("perturbation score") + theme(legend.key.size = unit(1, "cm"), legend.text = element_text(colour ="black", size = 14), legend.title = element_blank(), plot.title = element_text(size = 16, face = "bold")) } } return(p2) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Function to define Normal distribution - # returns list with mu (mean) and sd (standard deviation) DefineNormalMixscape <- function(x) { mu <- mean(x) sd <- sd(x) return(list(mu = mu, sd = sd)) } # Get missing perturbation signature for missing features # # @param object Seurat object # @param assay Perturbation signature assay name # @param features vector of features to compute for # @param verbose display progress # @return Returns Seurat object with assay updated with new features # GetMissingPerturb <- function(object, assay, features, verbose = TRUE) { if (length(x = features) == 0) { return(object) } if (verbose) { message("Computing perturbation signature for missing features.") } command <- grep(pattern = "CalcPerturbSig", x = Command(object = object), value = TRUE) command.match <- sapply(X = command, FUN = function(x) { Command(object = object, command = x, value = "new.assay.name") == assay }) if (length(x = which(x = command.match)) > 1) { stop("Ambiguous command log.") } if(length(x = which(x = command.match)) == 0) { stop("Cannot find previously run CalcPertubSig command. Please make sure you've run CalcPerturbSig to create the provided assay.") } command <- names(x = command.match) if ("split.by" %in% names(x = slot(object = Command(object = object, command = command), name ="params"))) { split.by <- Command(object = object, command = command, value = "split.by") } else { split.by <- NULL } gd.class <- Command(object = object, command = command, value = "gd.class") nt.cell.class <- Command(object = object, command = command, value = "nt.cell.class") slot <- Command(object = object, command = command, value = "slot") assay.orig <- Command(object = object, command = command, value = "assay") old.idents <- Idents(object = object) if (! is.null(x = split.by)) { Idents(object = object) <- split.by } else { Idents(object = object) <- "rep1" } replicate <- unique(x = Idents(object = object)) all_diff <- list() all_nt_cells <- Cells(x = object)[which(x = object[[]][gd.class] == nt.cell.class)] features <- setdiff(x = features, y = rownames(x = object[[assay]])) for (r in replicate) { # isolate nt cells all_cells <- WhichCells(object = object, idents = r) nt_cells <- intersect(x = all_nt_cells, all_cells) # pull previously computed neighbors neighbors <- Tool(object = object, slot = command)[[make.names(names = paste0(assay, "_", r))]] diff <- PerturbDiff( object = object, assay = assay.orig, slot = slot, all_cells = all_cells, nt_cells = nt_cells, features = features, neighbors = neighbors, verbose = verbose ) all_diff[[r]] <- diff } all_diff <- do.call(what = cbind, args = all_diff) all_diff <- all_diff[, colnames(x = object[[assay]]), drop = FALSE] new.assay <- CreateAssayObject( data = rbind( GetAssayData(object = object[[assay]], slot = "data"), all_diff ), min.cells = 0, min.features = 0, check.matrix = FALSE ) new.assay <- SetAssayData( object = new.assay, slot = "scale.data", new.data = GetAssayData(object = object[[assay]], slot = "scale.data") ) object[[assay]] <- new.assay Idents(object = object) <- old.idents return(object) } # Helper function to compute the perturbation differences - enables reuse in # GetMissingPerturb # # @param object Seurat object # @param assay assay to use # @param slot slot to use # @param all_cells vector of cell names to compute difference for # @param nt_cells vector of nt cell names # @param features vector of features to compute for # @param neighbors Neighbor object containing indices of nearest NT cells # @param verbose display progress bar # @return returns matrix of perturbation differences # #' @importFrom matrixStats rowMeans2 #' @importFrom Matrix sparseMatrix colSums #' PerturbDiff <- function(object, assay, slot, all_cells, nt_cells, features, neighbors, verbose) { nt_data <- as.matrix(x = expm1(x = GetAssayData(object = object, assay = assay, slot = slot)[features, nt_cells, drop = FALSE])) mysapply <- ifelse(test = verbose, yes = pbsapply, no = sapply) # new_expr <- mysapply(X = all_cells, FUN = function(i) { # index <- Indices(object = neighbors)[i, ] # nt_cells20 <- nt_cells[index] # avg_nt <- rowMeans2(x = nt_data[, nt_cells20, drop = FALSE]) # avg_nt <- as.matrix(x = avg_nt) # colnames(x = avg_nt) <- i # return(avg_nt) # }) idx <- Indices(object = neighbors)[all_cells,] model.matrix <- sparseMatrix(i = as.vector(idx), j = rep(1:nrow(x = idx), times = ncol(x = idx)), x = 1, dims = c(length(x = nt_cells), nrow(x = idx))) model.matrix <- model.matrix/rep(colSums(model.matrix), each = nrow(x = model.matrix)) new_expr <- nt_data %*% model.matrix new_expr <- matrix(data = new_expr, nrow = length(x = features)) new_expr <- log1p(x = new_expr) rownames(x = new_expr) <- rownames(x = nt_data) colnames(x = new_expr) <- all_cells diff <- new_expr - as.matrix(GetAssayData(object = object, slot = slot, assay = assay)[features, colnames(x = new_expr), drop = FALSE]) return(diff) } # Helper function to project cells onto the perturbation vector # @param v1 vector 1 # @param v2 vector 2 # ProjectVec <- function(v1, v2) { return(as.vector(x = (v1 %*% v2) / (v2 %*% v2))) } # Function to find top DE genes that pass some p value cutoff between cells # with targeting and non-targeting gRNAs. # # @param object An object of class Seurat. # @param ident.1 Target gene class or cells to find DE genes for. # @param ident.2 Non-targetting class or cells # @param labels metadata column with target gene classification. # @param de.assay Name of Assay DE is performed on. # @param test.use Denotes which test to use. See all available tests on # FindMarkers documentation. # @param pval.cutoff P-value cut-off for selection of significantly DE genes. # @param logfc.threshold Limit testing to genes which show, on average, at # least X-fold difference (log-scale) between the two groups of cells. Default # is 0.25 Increasing logfc.threshold speeds up the function, but can miss # weaker signals. # @param verbose Display messages # @return # TopDEGenesMixscape <- function( object, ident.1, ident.2 = NULL, labels = 'gene', de.assay = "RNA", test.use = "wilcox", pval.cutoff = 5e-2, logfc.threshold = 0.25, verbose = TRUE ) { if (verbose) { message("Finding new perturbation gene set") } de.genes <- data.frame() tryCatch( expr = { de.genes <- FindMarkers( object = object, ident.1 = ident.1, ident.2 = ident.2, group.by = labels, assay = de.assay, test.use = test.use, logfc.threshold = logfc.threshold, verbose = verbose, min.pct = 0.1 ) de.genes <- de.genes[de.genes$p_val_adj < pval.cutoff, ] }, error = function(e) {} ) return(rownames(x = de.genes)) } Seurat/R/utilities.R0000644000176200001440000026101614744464517014102 0ustar liggesusers#' @include generics.R #' @importFrom SeuratObject PackageCheck #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Add Azimuth Results #' #' Add mapping and prediction scores, UMAP embeddings, and imputed assay (if #' available) #' from Azimuth to an existing or new \code{\link[SeuratObject]{Seurat}} object #' #' @param object A \code{\link[SeuratObject]{Seurat}} object #' @param filename Path to Azimuth mapping scores file #' #' @return \code{object} with Azimuth results added #' #' @export #' @concept utilities #' #' @examples #' \dontrun{ #' object <- AddAzimuthResults(object, filename = "azimuth_results.Rds") #' } #' AddAzimuthResults <- function(object = NULL, filename) { if (is.null(x = filename)) { stop("No Azimuth results provided.") } azimuth_results <- readRDS(file = filename) if (!is.list(x = azimuth_results) || any(!(c('umap', 'pred.df') %in% names(x = azimuth_results)))) { stop("Expected following format for azimuth_results: `list(umap = , pred.df = [, impADT = ])`") } if (is.null(x = object)) { message("No existing Seurat object provided. Creating new one.") object <- CreateSeuratObject( counts = matrix( nrow = 1, ncol = nrow(x = azimuth_results$umap), dimnames = list( row.names = 'Dummy.feature', col.names = rownames(x = azimuth_results$umap)) ), assay = 'Dummy' ) } else { overlap.cells <- intersect( x = Cells(x = object), y = rownames(x = azimuth_results$umap) ) if (!(all(overlap.cells %in% Cells(x = object)))) { stop("Cells in object do not match cells in download") } else if (length(x = overlap.cells) < length(x = Cells(x = object))) { warning(paste0("Subsetting out ", length(x = Cells(x = object)) - length(x = overlap.cells), " cells that are absent in downloaded results (perhaps filtered by Azimuth)")) object <- subset(x = object, cells = overlap.cells) } } azimuth_results$pred.df$cell <- NULL object <- AddMetaData(object = object, metadata = azimuth_results$pred.df) object[['umap.proj']] <- azimuth_results$umap if ('impADT' %in% names(x = azimuth_results)) { object[['impADT']] <- azimuth_results$impADT if ('Dummy' %in% Assays(object = object)) { DefaultAssay(object = object) <- 'impADT' object[['Dummy']] <- NULL } } return(object) } #' Add Azimuth Scores #' #' Add mapping and prediction scores from Azimuth to a #' \code{\link[SeuratObject]{Seurat}} object #' #' @param object A \code{\link[SeuratObject]{Seurat}} object #' @param filename Path to Azimuth mapping scores file #' #' @return \code{object} with the mapping scores added #' #' @keywords internal #' #' @examples #' \dontrun{ #' object <- AddAzimuthScores(object, filename = "azimuth_pred.tsv") #' } #' AddAzimuthScores <- function(object, filename) { if (!file.exists(filename)) { stop("Cannot find Azimuth scores file ", filename, call. = FALSE) } object <- AddMetaData( object = object, metadata = read.delim(file = filename, row.names = 1) ) return(object) } #' Calculate module scores for feature expression programs in single cells #' #' Calculate the average expression levels of each program (cluster) on single #' cell level, subtracted by the aggregated expression of control feature sets. #' All analyzed features are binned based on averaged expression, and the #' control features are randomly selected from each bin. #' #' @param object Seurat object #' @param features A list of vectors of features for expression programs; each #' entry should be a vector of feature names #' @param pool List of features to check expression levels against, defaults to #' \code{rownames(x = object)} #' @param nbin Number of bins of aggregate expression levels for all #' analyzed features #' @param ctrl Number of control features selected from the same bin per #' analyzed feature #' @param k Use feature clusters returned from DoKMeans #' @param assay Name of assay to use #' @param name Name for the expression programs; will append a number to the #' end for each entry in \code{features} (eg. if \code{features} has three #' programs, the results will be stored as \code{name1}, \code{name2}, #' \code{name3}, respectively) #' @param seed Set a random seed. If NULL, seed is not set. #' @param search Search for symbol synonyms for features in \code{features} that #' don't match features in \code{object}? Searches the HGNC's gene names #' database; see \code{\link{UpdateSymbolList}} for more details #' @param slot Slot to calculate score values off of. Defaults to data slot (i.e log-normalized counts) #' @param ... Extra parameters passed to \code{\link{UpdateSymbolList}} #' #' @return Returns a Seurat object with module scores added to object meta data; #' each module is stored as \code{name#} for each module program present in #' \code{features} #' #' @importFrom ggplot2 cut_number #' @importFrom Matrix rowMeans colMeans #' #' @references Tirosh et al, Science (2016) #' #' @export #' @concept utilities #' #' @examples #' \dontrun{ #' data("pbmc_small") #' cd_features <- list(c( #' 'CD79B', #' 'CD79A', #' 'CD19', #' 'CD180', #' 'CD200', #' 'CD3D', #' 'CD2', #' 'CD3E', #' 'CD7', #' 'CD8A', #' 'CD14', #' 'CD1C', #' 'CD68', #' 'CD9', #' 'CD247' #' )) #' pbmc_small <- AddModuleScore( #' object = pbmc_small, #' features = cd_features, #' ctrl = 5, #' name = 'CD_Features' #' ) #' head(x = pbmc_small[]) #' } #' AddModuleScore <- function( object, features, pool = NULL, nbin = 24, ctrl = 100, k = FALSE, assay = NULL, name = 'Cluster', seed = 1, search = FALSE, slot = 'data', ... ) { if (!is.null(x = seed)) { set.seed(seed = seed) } assay.old <- DefaultAssay(object = object) assay <- assay %||% assay.old DefaultAssay(object = object) <- assay assay.data <- GetAssayData(object = object, assay = assay, slot = slot) features.old <- features if (k) { .NotYetUsed(arg = 'k') features <- list() for (i in as.numeric(x = names(x = table(object@kmeans.obj[[1]]$cluster)))) { features[[i]] <- names(x = which(x = object@kmeans.obj[[1]]$cluster == i)) } cluster.length <- length(x = features) } else { if (is.null(x = features)) { stop("Missing input feature list") } features <- lapply( X = features, FUN = function(x) { missing.features <- setdiff(x = x, y = rownames(x = object)) if (length(x = missing.features) > 0) { warning( "The following features are not present in the object: ", paste(missing.features, collapse = ", "), ifelse( test = search, yes = ", attempting to find updated synonyms", no = ", not searching for symbol synonyms" ), call. = FALSE, immediate. = TRUE ) if (search) { tryCatch( expr = { updated.features <- UpdateSymbolList(symbols = missing.features, ...) names(x = updated.features) <- missing.features for (miss in names(x = updated.features)) { index <- which(x == miss) x[index] <- updated.features[miss] } }, error = function(...) { warning( "Could not reach HGNC's gene names database", call. = FALSE, immediate. = TRUE ) } ) missing.features <- setdiff(x = x, y = rownames(x = object)) if (length(x = missing.features) > 0) { warning( "The following features are still not present in the object: ", paste(missing.features, collapse = ", "), call. = FALSE, immediate. = TRUE ) } } } return(intersect(x = x, y = rownames(x = object))) } ) cluster.length <- length(x = features) } if (!all(LengthCheck(values = features))) { warning(paste( 'Could not find enough features in the object from the following feature lists:', paste(names(x = which(x = !LengthCheck(values = features)))), 'Attempting to match case...' )) features <- lapply( X = features.old, FUN = CaseMatch, match = rownames(x = object) ) } if (!all(LengthCheck(values = features))) { stop(paste( 'The following feature lists do not have enough features present in the object:', paste(names(x = which(x = !LengthCheck(values = features)))), 'exiting...' )) } pool <- pool %||% rownames(x = object) data.avg <- Matrix::rowMeans(x = assay.data[pool, ]) data.avg <- data.avg[order(data.avg)] data.cut <- cut_number(x = data.avg + rnorm(n = length(data.avg))/1e30, n = nbin, labels = FALSE, right = FALSE) #data.cut <- as.numeric(x = Hmisc::cut2(x = data.avg, m = round(x = length(x = data.avg) / (nbin + 1)))) names(x = data.cut) <- names(x = data.avg) ctrl.use <- vector(mode = "list", length = cluster.length) for (i in 1:cluster.length) { features.use <- features[[i]] for (j in 1:length(x = features.use)) { ctrl.use[[i]] <- c( ctrl.use[[i]], names(x = sample( x = data.cut[which(x = data.cut == data.cut[features.use[j]])], size = ctrl, replace = FALSE )) ) } } ctrl.use <- lapply(X = ctrl.use, FUN = unique) ctrl.scores <- matrix( data = numeric(length = 1L), nrow = length(x = ctrl.use), ncol = ncol(x = object) ) for (i in 1:length(ctrl.use)) { features.use <- ctrl.use[[i]] ctrl.scores[i, ] <- Matrix::colMeans(x = assay.data[features.use, ]) } features.scores <- matrix( data = numeric(length = 1L), nrow = cluster.length, ncol = ncol(x = object) ) for (i in 1:cluster.length) { features.use <- features[[i]] data.use <- assay.data[features.use, , drop = FALSE] features.scores[i, ] <- Matrix::colMeans(x = data.use) } features.scores.use <- features.scores - ctrl.scores rownames(x = features.scores.use) <- paste0(name, 1:cluster.length) features.scores.use <- as.data.frame(x = t(x = features.scores.use)) rownames(x = features.scores.use) <- colnames(x = object) object[[colnames(x = features.scores.use)]] <- features.scores.use CheckGC() DefaultAssay(object = object) <- assay.old return(object) } #' Aggregated feature expression by identity class #' #' Returns summed counts ("pseudobulk") for each identity class. #' #' If \code{return.seurat = TRUE}, aggregated values are placed in the 'counts' #' layer of the returned object. The data is then normalized by running \code{\link{NormalizeData}} #' on the aggregated counts. \code{\link{ScaleData}} is then run on the default assay #' before returning the object. #' #' @param object Seurat object #' @param assays Which assays to use. Default is all assays #' @param features Features to analyze. Default is all features in the assay #' @param return.seurat Whether to return the data as a Seurat object. Default is FALSE #' @param group.by Category (or vector of categories) for grouping (e.g, ident, replicate, celltype); 'ident' by default #' To use multiple categories, specify a vector, such as c('ident', 'replicate', 'celltype') #' @param add.ident (Deprecated). Place an additional label on each cell prior to pseudobulking #' @param normalization.method Method for normalization, see \code{\link{NormalizeData}} #' @param scale.factor Scale factor for normalization, see \code{\link{NormalizeData}} #' @param margin Margin to perform CLR normalization, see \code{\link{NormalizeData}} #' @param verbose Print messages and show progress bar #' @param ... Arguments to be passed to methods such as \code{\link{CreateSeuratObject}} #' #' @return Returns a matrix with genes as rows, identity classes as columns. #' If return.seurat is TRUE, returns an object of class \code{\link{Seurat}}. #' @export #' @concept utilities #' #' @examples #' \dontrun{ #' data("pbmc_small") #' head(AggregateExpression(object = pbmc_small)$RNA) #' head(AggregateExpression(object = pbmc_small, group.by = c('ident', 'groups'))$RNA) #' } #' AggregateExpression <- function( object, assays = NULL, features = NULL, return.seurat = FALSE, group.by = 'ident', add.ident = NULL, normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, verbose = TRUE, ... ) { return( PseudobulkExpression( object = object, assays = assays, features = features, return.seurat = return.seurat, group.by = group.by, add.ident = add.ident, layer = 'counts', method = 'aggregate', normalization.method = normalization.method, scale.factor = scale.factor, margin = margin, verbose = verbose, ... ) ) } #' Averaged feature expression by identity class #' #' Returns averaged expression values for each identity class. #' #' If layer is set to 'data', this function assumes that the data has been log #' normalized and therefore feature values are exponentiated prior to averaging #' so that averaging is done in non-log space. Otherwise, if layer is set to #' either 'counts' or 'scale.data', no exponentiation is performed prior to averaging. #' If \code{return.seurat = TRUE} and layer is not 'scale.data', averaged values #' are placed in the 'counts' layer of the returned object and 'log1p' #' is run on the averaged counts and placed in the 'data' layer \code{\link{ScaleData}} #' is then run on the default assay before returning the object. #' If \code{return.seurat = TRUE} and layer is 'scale.data', the 'counts' layer contains #' average counts and 'scale.data' is set to the averaged values of 'scale.data'. #' #' @param object Seurat object #' @param assays Which assays to use. Default is all assays #' @param features Features to analyze. Default is all features in the assay #' @param return.seurat Whether to return the data as a Seurat object. Default is FALSE #' @param group.by Category (or vector of categories) for grouping (e.g, ident, replicate, celltype); 'ident' by default #' To use multiple categories, specify a vector, such as c('ident', 'replicate', 'celltype') #' @param add.ident (Deprecated). Place an additional label on each cell prior to pseudobulking #' @param layer Layer(s) to use; if multiple layers are given, assumed to follow #' the order of 'assays' (if specified) or object's assays #' @param slot (Deprecated). Slots(s) to use #' @param verbose Print messages and show progress bar #' @param ... Arguments to be passed to methods such as \code{\link{CreateSeuratObject}} #' #' @return Returns a matrix with genes as rows, identity classes as columns. #' If return.seurat is TRUE, returns an object of class \code{\link{Seurat}}. #' @export #' @concept utilities #' @importFrom SeuratObject .FilterObjects #' #' @examples #' data("pbmc_small") #' head(AverageExpression(object = pbmc_small)$RNA) #' head(AverageExpression(object = pbmc_small, group.by = c('ident', 'groups'))$RNA) #' AverageExpression <- function( object, assays = NULL, features = NULL, return.seurat = FALSE, group.by = 'ident', add.ident = NULL, layer = 'data', slot = deprecated(), verbose = TRUE, ... ) { return( PseudobulkExpression( object = object, assays = assays, features = features, return.seurat = return.seurat, group.by = group.by, add.ident = add.ident, layer = layer, slot = slot, method = 'average', verbose = verbose, ... ) ) } #' Match the case of character vectors #' #' @param search A vector of search terms #' @param match A vector of characters whose case should be matched #' #' @return Values from search present in match with the case of match #' #' @export #' @concept utilities #' #' @examples #' data("pbmc_small") #' cd_genes <- c('Cd79b', 'Cd19', 'Cd200') #' CaseMatch(search = cd_genes, match = rownames(x = pbmc_small)) #' CaseMatch <- function(search, match) { search.match <- sapply( X = search, FUN = function(s) { return(grep( pattern = paste0('^', s, '$'), x = match, ignore.case = TRUE, perl = TRUE, value = TRUE )) } ) return(unlist(x = search.match)) } #' Score cell cycle phases #' #' @param object A Seurat object #' @param s.features A vector of features associated with S phase #' @param g2m.features A vector of features associated with G2M phase #' @param ctrl Number of control features selected from the same bin per #' analyzed feature supplied to \code{\link{AddModuleScore}}. #' Defaults to value equivalent to minimum number of features #' present in 's.features' and 'g2m.features'. #' @param set.ident If true, sets identity to phase assignments #' Stashes old identities in 'old.ident' #' @param ... Arguments to be passed to \code{\link{AddModuleScore}} #' #' @return A Seurat object with the following columns added to object meta data: S.Score, G2M.Score, and Phase #' #' @seealso \code{AddModuleScore} #' #' @export #' @concept utilities #' #' @examples #' \dontrun{ #' data("pbmc_small") #' # pbmc_small doesn't have any cell-cycle genes #' # To run CellCycleScoring, please use a dataset with cell-cycle genes #' # An example is available at http://satijalab.org/seurat/cell_cycle_vignette.html #' pbmc_small <- CellCycleScoring( #' object = pbmc_small, #' g2m.features = cc.genes$g2m.genes, #' s.features = cc.genes$s.genes #' ) #' head(x = pbmc_small@meta.data) #' } #' CellCycleScoring <- function( object, s.features, g2m.features, ctrl = NULL, set.ident = FALSE, ... ) { name <- 'Cell.Cycle' features <- list('S.Score' = s.features, 'G2M.Score' = g2m.features) if (is.null(x = ctrl)) { ctrl <- min(vapply(X = features, FUN = length, FUN.VALUE = numeric(length = 1))) } object.cc <- AddModuleScore( object = object, features = features, name = name, ctrl = ctrl, ... ) cc.columns <- grep(pattern = name, x = colnames(x = object.cc[[]]), value = TRUE) cc.scores <- object.cc[[cc.columns]] rm(object.cc) CheckGC() assignments <- apply( X = cc.scores, MARGIN = 1, FUN = function(scores, first = 'S', second = 'G2M', null = 'G1') { if (all(scores < 0)) { return(null) } else { if (length(which(x = scores == max(scores))) > 1) { return('Undecided') } else { return(c(first, second)[which(x = scores == max(scores))]) } } } ) cc.scores <- merge(x = cc.scores, y = data.frame(assignments), by = 0) colnames(x = cc.scores) <- c('rownames', 'S.Score', 'G2M.Score', 'Phase') rownames(x = cc.scores) <- cc.scores$rownames cc.scores <- cc.scores[, c('S.Score', 'G2M.Score', 'Phase')] object[[colnames(x = cc.scores)]] <- cc.scores if (set.ident) { object[['old.ident']] <- Idents(object = object) Idents(object = object) <- 'Phase' } return(object) } #' Slim down a multi-species expression matrix, when only one species is primarily of interenst. #' #' Valuable for CITE-seq analyses, where we typically spike in rare populations of 'negative control' cells from a different species. #' #' @param object A UMI count matrix. Should contain rownames that start with #' the ensuing arguments prefix.1 or prefix.2 #' @param prefix The prefix denoting rownames for the species of interest. #' Default is "HUMAN_". These rownames will have this prefix removed in the returned matrix. #' @param controls The prefix denoting rownames for the species of 'negative #' control' cells. Default is "MOUSE_". #' @param ncontrols How many of the most highly expressed (average) negative #' control features (by default, 100 mouse genes), should be kept? All other #' rownames starting with prefix.2 are discarded. #' #' @return A UMI count matrix. Rownames that started with \code{prefix} have this #' prefix discarded. For rownames starting with \code{controls}, only the #' \code{ncontrols} most highly expressed features are kept, and the #' prefix is kept. All other rows are retained. #' #' @importFrom utils head #' @importFrom Matrix rowSums #' #' @export #' @concept utilities #' #' @examples #' \dontrun{ #' cbmc.rna.collapsed <- CollapseSpeciesExpressionMatrix(cbmc.rna) #' } #' CollapseSpeciesExpressionMatrix <- function( object, prefix = "HUMAN_", controls = "MOUSE_", ncontrols = 100 ) { features <- grep(pattern = prefix, x = rownames(x = object), value = TRUE) controls <- grep(pattern = controls, x = rownames(x = object), value = TRUE) others <- setdiff(x = rownames(x = object), y = c(features, controls)) controls <- rowSums(x = object[controls, ]) controls <- names(x = head( x = sort(x = controls, decreasing = TRUE), n = ncontrols )) object <- object[c(features, controls, others), ] rownames(x = object) <- gsub( pattern = prefix, replacement = '', x = rownames(x = object) ) return(object) } # Create an Annoy index # # @note Function exists because it's not exported from \pkg{uwot} # # @param name Distance metric name # @param ndim Number of dimensions # # @return An nn index object # #' @importFrom methods new #' @importFrom RcppAnnoy AnnoyAngular AnnoyManhattan AnnoyEuclidean AnnoyHamming # CreateAnn <- function(name, ndim) { return(switch( EXPR = name, cosine = new(Class = AnnoyAngular, ndim), manhattan = new(Class = AnnoyManhattan, ndim), euclidean = new(Class = AnnoyEuclidean, ndim), hamming = new(Class = AnnoyHamming, ndim), stop("BUG: unknown Annoy metric '", name, "'") )) } #' Run a custom distance function on an input data matrix #' #' @author Jean Fan #' #' @param my.mat A matrix to calculate distance on #' @param my.function A function to calculate distance #' @param ... Extra parameters to my.function #' #' @return A distance matrix #' #' @importFrom stats as.dist #' #' @export #' @concept utilities #' #' @examples #' data("pbmc_small") #' # Define custom distance matrix #' manhattan.distance <- function(x, y) return(sum(abs(x-y))) #' #' input.data <- GetAssayData(pbmc_small, assay.type = "RNA", slot = "scale.data") #' cell.manhattan.dist <- CustomDistance(input.data, manhattan.distance) #' CustomDistance <- function(my.mat, my.function, ...) { CheckDots(..., fxns = my.function) n <- ncol(x = my.mat) mat <- matrix(data = 0, ncol = n, nrow = n) colnames(x = mat) <- rownames(x = mat) <- colnames(x = my.mat) for (i in 1:nrow(x = mat)) { for (j in 1:ncol(x = mat)) { mat[i,j] <- my.function(my.mat[, i], my.mat[, j], ...) } } return(as.dist(m = mat)) } #' Calculate the mean of logged values #' #' Calculate mean of logged values in non-log space (return answer in log-space) #' #' @param x A vector of values #' @param ... Other arguments (not used) #' #' @return Returns the mean in log-space #' #' @export #' @concept utilities #' #' @examples #' ExpMean(x = c(1, 2, 3)) #' ExpMean <- function(x, ...) { if (inherits(x = x, what = 'AnyMatrix')) { return(apply(X = x, FUN = function(i) {log(x = mean(x = exp(x = i) - 1) + 1)}, MARGIN = 1)) } else { return(log(x = mean(x = exp(x = x) - 1) + 1)) } } #' Calculate the standard deviation of logged values #' #' Calculate SD of logged values in non-log space (return answer in log-space) #' #' @param x A vector of values #' #' @return Returns the standard deviation in log-space #' #' @importFrom stats sd #' #' @export #' @concept utilities #' #' @examples #' ExpSD(x = c(1, 2, 3)) #' ExpSD <- function(x) { return(log1p(x = sd(x = expm1(x = x)))) } #' Calculate the variance of logged values #' #' Calculate variance of logged values in non-log space (return answer in #' log-space) #' #' @param x A vector of values #' #' @return Returns the variance in log-space #' #' @importFrom stats var #' #' @export #' @concept utilities #' #' @examples #' ExpVar(x = c(1, 2, 3)) #' ExpVar <- function(x) { return(log1p(x = var(x = expm1(x = x)))) } #' Scale and/or center matrix rowwise #' #' Performs row scaling and/or centering. Equivalent to using t(scale(t(mat))) #' in R except in the case of NA values. #' #' @param mat A matrix #' @param center a logical value indicating whether to center the rows #' @param scale a logical value indicating whether to scale the rows #' @param scale_max clip all values greater than scale_max to scale_max. Don't #' clip if Inf. #' @return Returns the center/scaled matrix #' #' @importFrom matrixStats rowMeans2 rowSds rowSums2 #' #' @export #' @concept utilities #' FastRowScale <- function( mat, center = TRUE, scale = TRUE, scale_max = 10 ) { # inspired by https://www.r-bloggers.com/a-faster-scale-function/ if (center) { rm <- rowMeans2(x = mat, na.rm = TRUE) } if (scale) { if (center) { rsd <- rowSds(mat, center = rm) } else { rsd <- sqrt(x = rowSums2(x = mat^2)/(ncol(x = mat) - 1)) } } if (center) { mat <- mat - rm } if (scale) { mat <- mat / rsd } if (scale_max != Inf) { mat[mat > scale_max] <- scale_max } return(mat) } #' Get updated synonyms for gene symbols #' #' Find current gene symbols based on old or alias symbols using the gene #' names database from the HUGO Gene Nomenclature Committee (HGNC) #' #' @details For each symbol passed, we query the HGNC gene names database for #' current symbols that have the provided symbol as either an alias #' (\code{alias_symbol}) or old (\code{prev_symbol}) symbol. All other queries #' are \strong{not} supported. #' #' @note This function requires internet access #' #' @param symbols A vector of gene symbols #' @param timeout Time to wait before canceling query in seconds #' @param several.ok Allow several current gene symbols for each #' provided symbol #' @param search.types Type of query to perform: #' \describe{ #' \item{\dQuote{\code{alias_symbol}}}{Find alternate symbols for the genes #' described by \code{symbols}} #' \item{\dQuote{\code{prev_symbol}}}{Find new new symbols for the genes #' described by \code{symbols}} #' } #' This parameter accepts multiple options and short-hand options #' (eg. \dQuote{\code{prev}} for \dQuote{\code{prev_symbol}}) #' @param verbose Show a progress bar depicting search progress #' @param ... Extra parameters passed to \code{\link[httr]{GET}} #' #' @return \code{GeneSymbolThesarus}:, if \code{several.ok}, a named list #' where each entry is the current symbol found for each symbol provided and #' the names are the provided symbols. Otherwise, a named vector with the #' same information. #' #' @source \url{https://www.genenames.org/} \url{https://www.genenames.org/help/rest/} #' #' @importFrom utils txtProgressBar setTxtProgressBar #' @importFrom httr GET accept_json timeout status_code content #' #' @rdname UpdateSymbolList #' @name UpdateSymbolList #' #' @export #' @concept utilities #' #' @seealso \code{\link[httr]{GET}} #' #' @examples #' \dontrun{ #' GeneSybmolThesarus(symbols = c("FAM64A")) #' } #' GeneSymbolThesarus <- function( symbols, timeout = 10, several.ok = FALSE, search.types = c('alias_symbol', 'prev_symbol'), verbose = TRUE, ... ) { db.url <- 'http://rest.genenames.org/fetch' # search.types <- c('alias_symbol', 'prev_symbol') search.types <- match.arg(arg = search.types, several.ok = TRUE) synonyms <- vector(mode = 'list', length = length(x = symbols)) not.found <- vector(mode = 'logical', length = length(x = symbols)) multiple.found <- vector(mode = 'logical', length = length(x = symbols)) names(x = multiple.found) <- names(x = not.found) <- names(x = synonyms) <- symbols if (verbose) { pb <- txtProgressBar(max = length(x = symbols), style = 3, file = stderr()) } for (symbol in symbols) { sym.syn <- character() for (type in search.types) { response <- GET( url = paste(db.url, type, symbol, sep = '/'), config = c(accept_json(), timeout(seconds = timeout)), ... ) if (!identical(x = status_code(x = response), y = 200L)) { next } response <- content(x = response) if (response$response$numFound != 1) { if (response$response$numFound > 1) { warning( "Multiple hits found for ", symbol, " as ", type, ", skipping", call. = FALSE, immediate. = TRUE ) } next } sym.syn <- c(sym.syn, response$response$docs[[1]]$symbol) } not.found[symbol] <- length(x = sym.syn) < 1 multiple.found[symbol] <- length(x = sym.syn) > 1 if (length(x = sym.syn) == 1 || (length(x = sym.syn) > 1 && several.ok)) { synonyms[[symbol]] <- sym.syn } if (verbose) { setTxtProgressBar(pb = pb, value = pb$getVal() + 1) } } if (verbose) { close(con = pb) } if (sum(not.found) > 0) { warning( "The following symbols had no synonyms: ", paste(names(x = which(x = not.found)), collapse = ', '), call. = FALSE, immediate. = TRUE ) } if (sum(multiple.found) > 0) { msg <- paste( "The following symbols had multiple synonyms:", paste(names(x = which(x = multiple.found)), sep = ', ') ) if (several.ok) { message(msg) message("Including anyways") } else { warning(msg, call. = FALSE, immediate. = TRUE) } } synonyms <- Filter(f = Negate(f = is.null), x = synonyms) if (!several.ok) { synonyms <- unlist(x = synonyms) } return(synonyms) } #' Compute the correlation of features broken down by groups with another #' covariate #' #' @param object Seurat object #' @param assay Assay to pull the data from #' @param slot Slot in the assay to pull feature expression data from (counts, #' data, or scale.data) #' @param var Variable with which to correlate the features #' @param group.assay Compute the gene groups based off the data in this assay. #' @param min.cells Only compute for genes in at least this many cells #' @param ngroups Number of groups to split into #' @param do.plot Display the group correlation boxplot (via #' \code{GroupCorrelationPlot}) #' #' @return A Seurat object with the correlation stored in metafeatures #' #' @export #' @concept utilities #' GroupCorrelation <- function( object, assay = NULL, slot = "scale.data", var = NULL, group.assay = NULL, min.cells = 5, ngroups = 6, do.plot = TRUE ) { assay <- assay %||% DefaultAssay(object = object) group.assay <- group.assay %||% assay var <- var %||% paste0("nCount_", group.assay) gene.grp <- GetFeatureGroups( object = object, assay = group.assay, min.cells = min.cells, ngroups = ngroups ) data <- as.matrix(x = GetAssayData(object = object[[assay]], slot = slot)) data <- data[rowMeans(x = data) != 0, ] grp.cors <- apply( X = data, MARGIN = 1, FUN = function(x) { cor(x = x, y = object[[var]]) } ) grp.cors <- grp.cors[names(x = gene.grp)] grp.cors <- as.data.frame(x = grp.cors[which(x = !is.na(x = grp.cors))]) grp.cors$gene_grp <- gene.grp[rownames(x = grp.cors)] colnames(x = grp.cors) <- c(paste0(var, "_cor"), "feature.grp") object[[assay]][] <- grp.cors if (isTRUE(x = do.plot)) { print(GroupCorrelationPlot( object = object, assay = assay, feature.group = "feature.grp", cor = paste0(var, "_cor") )) } return(object) } #' Load the Annoy index file #' #' @param object Neighbor object #' @param file Path to file with annoy index #' #' @return Returns the Neighbor object with the index stored #' @export #' @concept utilities #' LoadAnnoyIndex <- function(object, file){ metric <- slot(object = object, name = "alg.info")$metric ndim <- slot(object = object, name = "alg.info")$ndim if (is.null(x = metric)) { stop("Provided Neighbor object wasn't generated with annoy") } annoy.idx <- CreateAnn(name = metric, ndim = ndim) annoy.idx$load(path.expand(path = file)) Index(object = object) <- annoy.idx return(object) } #' Calculate the variance to mean ratio of logged values #' #' Calculate the variance to mean ratio (VMR) in non-logspace (return answer in #' log-space) #' #' @param x A vector of values #' @param ... Other arguments (not used) #' #' @return Returns the VMR in log-space #' #' @importFrom stats var #' #' @export #' @concept utilities #' #' @examples #' LogVMR(x = c(1, 2, 3)) #' LogVMR <- function(x, ...) { if (inherits(x = x, what = 'AnyMatrix')) { return(apply(X = x, FUN = function(i) {log(x = var(x = exp(x = i) - 1) / mean(x = exp(x = i) - 1))}, MARGIN = 1)) } else { return(log(x = var(x = exp(x = x) - 1) / mean(x = exp(x = x) - 1))) } } #' Aggregate expression of multiple features into a single feature #' #' Calculates relative contribution of each feature to each cell #' for given set of features. #' #' @param object A Seurat object #' @param features List of features to aggregate #' @param meta.name Name of column in metadata to store metafeature #' @param cells List of cells to use (default all cells) #' @param assay Which assay to use #' @param slot Which slot to take data from (default data) #' #' @return Returns a \code{Seurat} object with metafeature stored in objct metadata #' #' @importFrom Matrix rowSums colMeans #' #' @export #' @concept utilities #' #' @examples #' data("pbmc_small") #' pbmc_small <- MetaFeature( #' object = pbmc_small, #' features = c("LTB", "EAF2"), #' meta.name = 'var.aggregate' #' ) #' head(pbmc_small[[]]) #' MetaFeature <- function( object, features, meta.name = 'metafeature', cells = NULL, assay = NULL, slot = 'data' ) { cells <- cells %||% colnames(x = object) assay <- assay %||% DefaultAssay(object = object) newmat <- GetAssayData(object = object, assay = assay, slot = slot) newmat <- newmat[features, cells] if (slot == 'scale.data') { newdata <- Matrix::colMeans(newmat) } else { rowtotals <- Matrix::rowSums(newmat) newmat <- newmat / rowtotals newdata <- Matrix::colMeans(newmat) } object[[meta.name]] <- newdata return(object) } #' Apply a ceiling and floor to all values in a matrix #' #' @param data Matrix or data frame #' @param min all values below this min value will be replaced with min #' @param max all values above this max value will be replaced with max #' @return Returns matrix after performing these floor and ceil operations #' @export #' @concept utilities #' #' @examples #' mat <- matrix(data = rbinom(n = 25, size = 20, prob = 0.2 ), nrow = 5) #' mat #' MinMax(data = mat, min = 4, max = 5) #' MinMax <- function(data, min, max) { data2 <- data data2[data2 > max] <- max data2[data2 < min] <- min return(data2) } #' Calculate the percentage of a vector above some threshold #' #' @param x Vector of values #' @param threshold Threshold to use when calculating percentage #' #' @return Returns the percentage of \code{x} values above the given threshold #' #' @export #' @concept utilities #' #' @examples #' set.seed(42) #' PercentAbove(sample(1:100, 10), 75) #' PercentAbove <- function(x, threshold) { return (sum(x > threshold, na.rm = T) / length(x)) } #' Calculate the percentage of all counts that belong to a given set of features #' #' This function enables you to easily calculate the percentage of all the counts belonging to a #' subset of the possible features for each cell. This is useful when trying to compute the percentage #' of transcripts that map to mitochondrial genes for example. The calculation here is simply the #' column sum of the matrix present in the counts slot for features belonging to the set divided by #' the column sum for all features times 100. #' #' @param object A Seurat object #' @param pattern A regex pattern to match features against #' @param features A defined feature set. If features provided, will ignore the pattern matching #' @param col.name Name in meta.data column to assign. If this is not null, returns a Seurat object #' with the proportion of the feature set stored in metadata. #' @param assay Assay to use #' #' @return Returns a vector with the proportion of the feature set or if md.name is set, returns a #' Seurat object with the proportion of the feature set stored in metadata. #' @importFrom Matrix colSums #' @export #' @concept utilities #' #' @examples #' data("pbmc_small") #' # Calculate the proportion of transcripts mapping to mitochondrial genes #' # NOTE: The pattern provided works for human gene names. You may need to adjust depending on your #' # system of interest #' pbmc_small[["percent.mt"]] <- PercentageFeatureSet(object = pbmc_small, pattern = "^MT-") #' PercentageFeatureSet <- function( object, pattern = NULL, features = NULL, col.name = NULL, assay = NULL ) { assay <- assay %||% DefaultAssay(object = object) if (!is.null(x = features) && !is.null(x = pattern)) { warn(message = "Both pattern and features provided. Pattern is being ignored.") } percent.featureset <- list() layers <- Layers(object = object, search = "counts") for (i in seq_along(along.with = layers)) { layer <- layers[i] features.layer <- features %||% grep( pattern = pattern, x = rownames(x = object[[assay]][layer]), value = TRUE) layer.data <- LayerData(object = object, assay = assay, layer = layer) layer.sums <- colSums(x = layer.data[features.layer, , drop = FALSE]) layer.perc <- layer.sums / object[[]][colnames(layer.data), paste0("nCount_", assay)] * 100 percent.featureset[[i]] <- layer.perc } percent.featureset <- unlist(percent.featureset) if (!is.null(x = col.name)) { object <- AddMetaData(object = object, metadata = percent.featureset, col.name = col.name) return(object) } return(percent.featureset) } #' Pseudobulk feature expression by identity class #' #' Returns a representative expression value for each identity class #' #' @param object Seurat object #' @param method Whether to 'average' (default) or 'aggregate' expression levels #' @param assay The name of the passed assay - used primarily for warning/error messages #' @param category.matrix A matrix defining groupings for pseudobulk expression #' calculations; each column represents an identity class, and each row a sample #' @param features Features to analyze. Default is all features in the assay #' @param layer Layer(s) to user; if multiple are given, assumed to follow #' the order of 'assays' (if specified) or object's assays #' @param slot (Deprecated) See \code{layer} #' @param verbose Print messages and show progress bar #' @param ... Arguments to be passed to methods such as \code{\link{CreateSeuratObject}} # #' @return Returns a matrix with genes as rows, identity classes as columns. #' If return.seurat is TRUE, returns an object of class \code{\link{Seurat}}. #' @method PseudobulkExpression Assay #' @rdname PseudobulkExpression #' @importFrom SeuratObject .IsFutureSeurat #' @export #' @concept utilities #' PseudobulkExpression.Assay <- function( object, assay, category.matrix, features = NULL, layer = 'data', slot = deprecated(), verbose = TRUE, ... ) { if (is_present(arg = slot)) { deprecate_soft( when = '5.0.0', what = 'GetAssayData(slot = )', with = 'GetAssayData(layer = )' ) layer <- slot } data.use <- GetAssayData( object = object, layer = layer ) features.to.avg <- features %||% rownames(x = data.use) if (IsMatrixEmpty(x = data.use)) { warning( "The ", layer, " layer for the ", assay, " assay is empty. Skipping assay.", immediate. = TRUE, call. = FALSE) return(NULL) } bad.features <- setdiff(x = features.to.avg, y = rownames(x = data.use)) if (length(x = bad.features) > 0) { warning( "The following ", length(x = bad.features), " features were not found in the ", assay, " assay: ", paste(bad.features, collapse = ", "), call. = FALSE, immediate. = TRUE) } features.assay <- intersect(x = features.to.avg, y = rownames(x = data.use)) if (length(x = features.assay) > 0) { data.use <- data.use[features.assay, ] } else { warning("None of the features specified were found in the ", assay, " assay.", call. = FALSE, immediate. = TRUE) return(NULL) } if (layer == 'data') { data.use <- expm1(x = data.use) if (any(data.use == Inf)) { warning("Exponentiation yielded infinite values. `data` may not be log-normed.") } } data.return <- data.use %*% category.matrix return(data.return) } #' @method PseudobulkExpression StdAssay #' @rdname PseudobulkExpression #' @export #' @concept utilities #' PseudobulkExpression.StdAssay <- function( object, assay, category.matrix, features = NULL, layer = 'data', slot = deprecated(), verbose = TRUE, ... ) { if (is_present(arg = slot)) { deprecate_soft( when = '5.0.0', what = 'GetAssayData(slot = )', with = 'GetAssayData(layer = )' ) layer <- slot } layers.set <- Layers(object = object, search = layer) features.to.avg <- features %||% rownames(x = object) bad.features <- setdiff(x = features.to.avg, y = rownames(x = object)) if (length(x = bad.features) > 0) { warning( "The following ", length(x = bad.features), " features were not found in the ", assay, " assay: ", paste(bad.features, collapse = ", "), call. = FALSE, immediate. = TRUE) } features.assay <- Reduce( f = intersect, x = c(list(features.to.avg), lapply(X = layers.set, FUN = function(l) rownames(object[l])) ) ) if (length(x = features.assay) == 0) { warning("None of the features specified were found in the ", assay, " assay.", call. = FALSE, immediate. = TRUE) return(NULL) } data.return <- as.sparse( x = matrix( data = 0, nrow = length(x = features.assay), ncol = ncol(x = category.matrix) ) ) for (i in seq_along(layers.set)) { data.i <- LayerData(object = object, layer = layers.set[i], features = features.assay ) if (layers.set[i] == "data") { data.use.i <- expm1(x = data.i) if (any(data.use.i == Inf)) { warning("Exponentiation yielded infinite values. `data` may not be log-normed.") } } else { data.use.i <- data.i } category.matrix.i <- category.matrix[colnames(x = data.i),] if (inherits(x = data.i, what = 'DelayedArray')) { stop("PseudobulkExpression does not support DelayedArray objects") } else { data.return.i <- as.sparse(x = data.use.i %*% category.matrix.i) } data.return <- data.return + data.return.i } return(data.return) } #' @param assays Which assays to use. Default is all assays #' @param return.seurat Whether to return the data as a Seurat object. Default is FALSE #' @param group.by Categories for grouping (e.g, "ident", "replicate", #' "celltype"); "ident" by default #' @param add.ident (Deprecated) See group.by #' @param method The method used for calculating pseudobulk expression; one of: #' "average" or "aggregate" #' @param normalization.method Method for normalization, see \code{\link{NormalizeData}} #' @param scale.factor Scale factor for normalization, see \code{\link{NormalizeData}} #' @param margin Margin to perform CLR normalization, see \code{\link{NormalizeData}} #' #' @method PseudobulkExpression Seurat #' @rdname PseudobulkExpression #' @export #' @concept utilities #' PseudobulkExpression.Seurat <- function( object, assays = NULL, features = NULL, return.seurat = FALSE, group.by = 'ident', add.ident = NULL, layer = 'data', slot = deprecated(), method = 'average', normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, verbose = TRUE, ... ) { CheckDots(..., fxns = 'CreateSeuratObject') if (!is.null(x = add.ident)) { .Deprecated(msg = "'add.ident' is a deprecated argument. Please see documentation to see how to pass a vector to the 'group.by' argument to specify multiple grouping variables") group.by <- c('ident', add.ident) } if (!(method %in% c('average', 'aggregate'))) { stop("'method' must be either 'average' or 'aggregate'") } if (is_present(arg = slot)) { deprecate_soft( when = '5.0.0', what = 'AverageExpression(slot = )', with = 'AverageExpression(layer = )' ) layer <- slot } if (method == "average") { inform( message = "As of Seurat v5, we recommend using AggregateExpression to perform pseudo-bulk analysis.", .frequency = "once", .frequency_id = "AverageExpression" ) } object.assays <- .FilterObjects(object = object, classes.keep = c('Assay', 'Assay5')) assays <- assays %||% object.assays # `features` is expected to be a 2D array - one vector per assay # in the case the `features` a vector, duplicate it for each assay if (!inherits(features, what = "list")) { features <- rep(list(features), times = length(assays)) } if (!all(assays %in% object.assays)) { assays <- assays[assays %in% object.assays] if (length(x = assays) == 0) { stop("None of the requested assays are present in the object") } else { warning("Requested assays that do not exist in object. Proceeding with existing assays only.") } } if (length(x = layer) == 1) { layer <- rep_len(x = layer, length.out = length(x = assays)) } else if (length(x = layer) != length(x = assays)) { stop("Number of layers provided does not match number of assays") } data <- FetchData(object = object, vars = rev(x = group.by)) #only keep meta-data columns that are in object group.by <- intersect(group.by, colnames(data)) data <- data[which(rowSums(x = is.na(x = data)) == 0), , drop = F] if (nrow(x = data) < ncol(x = object)) { inform("Removing cells with NA for 1 or more grouping variables") object <- subset(x = object, cells = rownames(x = data)) } for (i in 1:ncol(x = data)) { data[, i] <- as.factor(x = data[, i]) } num.levels <- sapply( X = 1:ncol(x = data), FUN = function(i) { length(x = levels(x = data[, i])) } ) if (any(num.levels == 1)) { message( paste0( "The following grouping variables have 1 value and will be ignored: ", paste0(colnames(x = data)[which(num.levels <= 1)], collapse = ", ") ) ) group.by <- colnames(x = data)[which(num.levels > 1)] data <- data[, which(num.levels > 1), drop = F] } category.matrix <- CreateCategoryMatrix(labels = data, method = method) #check if column names are numeric col.names <- colnames(category.matrix) if (any(!(grepl("^[a-zA-Z]|^\\.[^0-9]", col.names)))) { col.names <- ifelse( !(grepl("^[a-zA-Z]|^\\.[^0-9]", col.names)), paste0("g", col.names), col.names ) colnames(category.matrix) <- col.names inform( message = paste0("First group.by variable `", group.by[1], "` starts with a number, appending `g` to ensure valid variable names"), .frequency = "regularly", .frequency_id = "PseudobulkExpression" ) } data.return <- list() for (i in 1:length(x = assays)) { data.return[[assays[i]]] <- PseudobulkExpression( object = object[[assays[i]]], assay = assays[i], category.matrix = category.matrix, features = features[[i]], layer = layer[i], verbose = verbose, ... ) } if (return.seurat) { op <- options(Seurat.object.assay.version = "v5", Seurat.object.assay.calcn = FALSE) on.exit(expr = options(op), add = TRUE) if (layer[1] == 'scale.data') { na.matrix <- as.matrix(x = data.return[[1]]) na.matrix[1:length(x = na.matrix)] <- NA #sum up counts to make seurat object summed.counts <- PseudobulkExpression( object = object[[assays[1]]], assay = assays[1], category.matrix = category.matrix, features = features[[1]], layer = "counts" ) toRet <- CreateSeuratObject( counts = summed.counts, project = if (method == "average") "Average" else "Aggregate", assay = names(x = data.return)[1], ... ) LayerData( object = toRet, layer = "scale.data", assay = names(x = data.return)[i] ) <- data.return[[1]] } else { toRet <- CreateSeuratObject( counts = data.return[[1]], project = if (method == "average") "Average" else "Aggregate", assay = names(x = data.return)[1], ... ) if (method == "aggregate") { LayerData( object = toRet, layer = "data", assay = names(x = data.return)[1] ) <- NormalizeData( as.matrix(x = data.return[[1]]), normalization.method = normalization.method, verbose = verbose ) } else { LayerData(object = toRet, layer = "data", assay = names(x = data.return)[1] ) <- log1p(x = as.matrix(x = data.return[[1]])) } } #for multimodal data if (length(x = data.return) > 1) { for (i in 2:length(x = data.return)) { if (layer[i] == 'scale.data') { summed.counts <- PseudobulkExpression( object = object[[assays[i]]], assay = assays[i], category.matrix = category.matrix, features = features[[i]], layer = "counts" ) toRet[[names(x = data.return)[i]]] <- CreateAssayObject(counts = summed.counts) LayerData( object = toRet, layer = "scale.data", assay = names(x = data.return)[i] ) <- data.return[[i]] } else { toRet[[names(x = data.return)[i]]] <- CreateAssayObject( counts = data.return[[i]], check.matrix = FALSE ) if (method == "aggregate") { LayerData( object = toRet, layer = "data", assay = names(x = data.return)[i] ) <- NormalizeData( as.matrix(x = data.return[[i]]), normalization.method = normalization.method, scale.factor = scale.factor, margin = margin, verbose = verbose ) } else { LayerData( object = toRet, layer = "data", assay = names(x = data.return)[i] ) <- log1p(x = as.matrix(x = data.return[[i]])) } } } } if (DefaultAssay(object = object) %in% names(x = data.return)) { DefaultAssay(object = toRet) <- DefaultAssay(object = object) if (layer[which(DefaultAssay(object = object) %in% names(x = data.return))[1]] != 'scale.data') { toRet <- ScaleData(object = toRet, verbose = verbose) } } #add meta-data based on group.by variables cells <- Cells(toRet) for (i in 1:length(group.by)) { if (group.by[i] != "ident") { v <- sapply( strsplit(cells, "_"), function(x) {return(x[i])} ) names(v) <- cells toRet <- AddMetaData(toRet, metadata = v, col.name = group.by[i] ) } } #set idents to pseudobulk variables Idents(toRet) <- cells #make orig.ident variable #orig.ident = ident if group.by includes `ident` #if not, orig.ident is equal to pseudobulk cell names if(any(group.by == "ident")) { i = which(group.by == "ident") v <- sapply( strsplit(cells, "_"), function(x) {return(x[i])} ) names(v) <- cells toRet <- AddMetaData(toRet, metadata = v, col.name = "orig.ident" ) } else { toRet$orig.ident <- cells } return(toRet) } else { return(data.return) } } #' Regroup idents based on meta.data info #' #' For cells in each ident, set a new identity based on the most common value #' of a specified metadata column. #' #' @param object Seurat object #' @param metadata Name of metadata column #' @return A Seurat object with the active idents regrouped #' #' @export #' @concept utilities #' #' @examples #' data("pbmc_small") #' pbmc_small <- RegroupIdents(pbmc_small, metadata = "groups") #' RegroupIdents <- function(object, metadata) { for (ii in levels(x = object)) { ident.cells <- WhichCells(object = object, idents = ii) if (length(x = ident.cells) == 0) { next } new.ident <- names(x = which.max(x = table(object[[metadata]][ident.cells, ]))) if (is.null(x = new.ident)) { stop("Cluster ", ii, " contains only cells with NA values in the '", metadata, "' metadata column.") } Idents(object = object, cells = ident.cells) <- new.ident } return(object) } #' Save the Annoy index #' #' @param object A Neighbor object with the annoy index stored #' @param file Path to file to write index to #' #' @export #' @concept utilities #' SaveAnnoyIndex <- function( object, file ) { index <- Index(object = object) if (is.null(x = index)) { stop("Index for provided Neighbor object is NULL") } index$save(path.expand(path = file)) } #' Find the Quantile of Data #' #' Converts a quantile in character form to a number regarding some data. #' String form for a quantile is represented as a number prefixed with #' \dQuote{q}; for example, 10th quantile is \dQuote{q10} while 2nd quantile is #' \dQuote{q2}. Will only take a quantile of non-zero data values #' #' @param cutoff The cutoff to turn into a quantile #' @param data The data to turn find the quantile of #' #' @return The numerical representation of the quantile #' #' @importFrom stats quantile #' #' @export #' @concept utilities #' #' @examples #' set.seed(42) #' SetQuantile('q10', sample(1:100, 10)) #' SetQuantile <- function(cutoff, data) { if (grepl(pattern = '^q[0-9]{1,2}$', x = as.character(x = cutoff), perl = TRUE)) { this.quantile <- as.numeric(x = sub( pattern = 'q', replacement = '', x = as.character(x = cutoff) )) / 100 data <- unlist(x = data) data <- data[data > 0] cutoff <- quantile(x = data, probs = this.quantile) } return(as.numeric(x = cutoff)) } #' @rdname UpdateSymbolList #' #' @return \code{UpdateSymbolList}: \code{symbols} with updated symbols from #' HGNC's gene names database #' #' @export #' @concept utilities #' #' @examples #' \dontrun{ #' UpdateSymbolList(symbols = cc.genes$s.genes) #' } #' UpdateSymbolList <- function( symbols, timeout = 10, several.ok = FALSE, verbose = TRUE, ... ) { new.symbols <- suppressWarnings(expr = GeneSymbolThesarus( symbols = symbols, timeout = timeout, several.ok = several.ok, search.types = 'prev_symbol', verbose = verbose, ... )) if (length(x = new.symbols) < 1) { warning("No updated symbols found", call. = FALSE, immediate. = TRUE) } else { if (verbose) { message("Found updated symbols for ", length(x = new.symbols), " symbols") x <- sapply(X = new.symbols, FUN = paste, collapse = ', ') message(paste(names(x = x), x, sep = ' -> ', collapse = '\n')) } for (sym in names(x = new.symbols)) { index <- which(x = symbols == sym) symbols <- append( x = symbols[-index], values = new.symbols[[sym]], after = index - 1 ) } } return(symbols) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @inheritParams base::as.data.frame #' #' @return \code{as.data.frame.Matrix}: A data frame representation of the S4 Matrix #' #' @importFrom Matrix as.matrix #' #' @rdname as.sparse #' @concept utilities #' @export #' @method as.data.frame Matrix #' as.data.frame.Matrix <- function( x, row.names = NULL, optional = FALSE, ..., stringsAsFactors = getOption(x = "stringsAsFactors", default = FALSE) ) { return(as.data.frame( x = as.matrix(x = x), row.names = row.names, optional = optional, stringsAsFactors = stringsAsFactors, ... )) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Create Abbreviations #' #' @param x A character vector #' @param digits Include digits in the abbreviation #' #' @return Abbreviated versions of \code{x} #' #' @keywords internal #' #' @examples #' .Abbrv(c('HelloWorld, 'LetsGo3', 'tomato')) #' .Abbrv(c('HelloWorld, 'LetsGo3', 'tomato'), digits = FALSE) #' .Abbrv('Wow3', digits = FALSE) #' #' @noRd #' .Abbrv <- function(x, digits = TRUE) { pattern <- ifelse(test = isTRUE(x = digits), yes = '[A-Z0-9]+', no = '[A-Z]+') y <- vapply( X = regmatches(x = x, m = gregexec(pattern = pattern, text = x)), FUN = paste, FUN.VALUE = character(length = 1L), collapse = '' ) na <- nchar(x = y) <= 1L y[na] <- x[na] return(tolower(x = y)) } .AsList <- function(x) { x <- as.list(x = x) return(sapply( X = unique(x = names(x = x)), FUN = function(i) { return(unlist( x = x[which(x = names(x = x) == i)], recursive = FALSE, use.names = FALSE )) }, simplify = FALSE, USE.NAMES = TRUE )) } #' @importFrom ggplot2 cut_number #' .Cut <- function(min, max, n) { breaks <- levels(x = cut_number(x = c(min, max), n = n)) breaks <- gsub(pattern = '.*,', replacement = '', x = breaks) breaks <- gsub(pattern = ']$', replacement = '', x = breaks) as.numeric(x = breaks) } .FindE <- function(x) { x <- as.character(x = x) if (grepl(pattern = 'e', x = x)) { return(as.integer(x = gsub(pattern = '.*e', replacement = '', x = x))) } else if (grepl(pattern = '^0\\.', x = x)) { x <- unlist(x = strsplit( x = gsub(pattern = '.*\\.', replacement = '', x = x), split = '' )) idx <- which(x = x != '0') return(-idx) } stop("Invalid format") } #' @importFrom SeuratObject Boundaries #' .BoundariesByImage <- function(object, fov, boundaries) { if (!is.list(x = boundaries)) { if (is.null(x = names(x = boundaries))) { boundaries <- rep_len(x = list(boundaries), length.out = length(x = fov)) names(x = boundaries) <- fov } else { boundaries <- .AsList(x = boundaries) } } if (any(!nchar(x = names(x = boundaries)))) { missing <- setdiff(x = fov, y = names(x = boundaries)) idx <- which(x = !nchar(x = names(x = boundaries))) boundaries <- c( boundaries[intersect(x = names(x = boundaries), y = fov)], rep_len(x = boundaries[idx], length.out = length(x = missing)) ) names(x = boundaries)[!nchar(x = names(x = boundaries))] <- missing } if (any(!fov %in% names(x = boundaries))) { for (i in setdiff(x = fov, y = names(x = boundaries))) { boundaries[[i]] <- Boundaries(object = object[[i]])[1L] } } fov <- union(x = fov, y = names(x = boundaries)) if (length(x = boundaries) != length(x = fov)) { fov <- intersect(x = fov, y = names(x = boundaries)) } boundaries <- boundaries[fov] for (i in fov) { boundaries[[i]] <- Filter( f = function(x) { return(x %in% Boundaries(object = object[[i]]) || is_na(x = x)) }, x = boundaries[[i]] ) } boundaries <- Filter(f = length, x = boundaries) return(boundaries) } # Generate chunk points # # @param dsize How big is the data being chunked # @param csize How big should each chunk be # # @return A matrix where each column is a chunk, row 1 is start points, row 2 is end points # ChunkPoints <- function(dsize, csize) { return(vapply( X = 1L:ceiling(x = dsize / csize), FUN = function(i) { return(c( start = (csize * (i - 1L)) + 1L, end = min(csize * i, dsize) )) }, FUN.VALUE = numeric(length = 2L) )) } # L2 normalize the columns (or rows) of a given matrix # @param mat Matrix to cosine normalize # @param MARGIN Perform normalization over rows (1) or columns (2) # # # @return returns l2-normalized matrix # # L2Norm <- function(mat, MARGIN = 1){ normalized <- Sweep( x = mat, MARGIN = MARGIN, STATS = apply( X = mat, MARGIN = MARGIN, FUN = function(x){ sqrt(x = sum(x ^ 2)) } ), FUN = "/" ) normalized[!is.finite(x = normalized)] <- 0 return(normalized) } # Check the use of ... # # @param ... Arguments passed to a function that fall under ... # @param fxns A list/vector of functions or function names # # @return ... # # @importFrom utils argsAnywhere getAnywhere #' @importFrom utils isS3stdGeneric methods argsAnywhere isS3method # # @examples # CheckDots <- function(..., fxns = NULL) { args.names <- names(x = list(...)) if (length(x = list(...)) == 0) { return(invisible(x = NULL)) } if (is.null(x = args.names)) { stop("No named arguments passed") } if (length(x = fxns) == 1) { fxns <- list(fxns) } for (f in fxns) { if (!(is.character(x = f) || is.function(x = f))) { stop("CheckDots only works on characters or functions, not ", class(x = f)) } } fxn.args <- suppressWarnings(expr = sapply( X = fxns, FUN = function(x) { x <- tryCatch( expr = if (isS3stdGeneric(f = x)) { as.character(x = methods(generic.function = x)) } else { x }, error = function(...) { return(x) } ) x <- if (is.character(x = x)) { sapply(X = x, FUN = argsAnywhere, simplify = FALSE, USE.NAMES = TRUE) } else if (length(x = x) <= 1) { list(x) } return(sapply( X = x, FUN = function(f) { return(names(x = formals(fun = f))) }, simplify = FALSE, USE.NAMES = TRUE )) }, simplify = FALSE, USE.NAMES = TRUE )) fxn.args <- unlist(x = fxn.args, recursive = FALSE) fxn.null <- vapply(X = fxn.args, FUN = is.null, FUN.VALUE = logical(length = 1L)) if (all(fxn.null) && !is.null(x = fxns)) { stop("None of the functions passed could be found") } else if (any(fxn.null)) { warning( "The following functions passed could not be found: ", paste(names(x = which(x = fxn.null)), collapse = ', '), call. = FALSE, immediate. = TRUE ) fxn.args <- Filter(f = Negate(f = is.null), x = fxn.args) } dfxns <- vector(mode = 'logical', length = length(x = fxn.args)) names(x = dfxns) <- names(x = fxn.args) for (i in 1:length(x = fxn.args)) { dfxns[i] <- any(grepl(pattern = '...', x = fxn.args[[i]], fixed = TRUE)) } if (any(dfxns)) { dfxns <- names(x = which(x = dfxns)) if (any(nchar(x = dfxns) > 0)) { fx <- vapply( X = Filter(f = nchar, x = dfxns), FUN = function(x) { if (isS3method(method = x)) { x <- unlist(x = strsplit(x = x, split = '\\.')) x <- x[length(x = x) - 1L] } return(x) }, FUN.VALUE = character(length = 1L) ) message( "The following functions and any applicable methods accept the dots: ", paste(unique(x = fx), collapse = ', ') ) if (any(nchar(x = dfxns) < 1)) { message( "In addition, there is/are ", length(x = Filter(f = Negate(f = nchar), x = dfxns)), " other function(s) that accept(s) the dots" ) } } else { message("There is/are ", length(x = dfxns), 'function(s) that accept(s) the dots') } } else { unused <- Filter( f = function(x) { return(!x %in% unlist(x = fxn.args)) }, x = args.names ) if (length(x = unused) > 0) { msg <- paste0( "The following arguments are not used: ", paste(unused, collapse = ', ') ) switch( EXPR = getOption(x = "Seurat.checkdots"), "warn" = warning(msg, call. = FALSE, immediate. = TRUE), "stop" = stop(msg), "silent" = NULL, stop("Invalid Seurat.checkdots option. Please choose one of warn, stop, silent") ) unused.hints <- sapply(X = unused, FUN = OldParamHints) names(x = unused.hints) <- unused unused.hints <- na.omit(object = unused.hints) if (length(x = unused.hints) > 0) { message( "Suggested parameter: ", paste(unused.hints, "instead of", names(x = unused.hints), collapse = '; '), "\n" ) } } } } # Call gc() to perform garbage collection # CheckGC <- function() { if (getOption(x = "Seurat.memsafe")) { gc(verbose = FALSE) } } # Check a list of objects for duplicate cell names # # @param object.list List of Seurat objects # @param verbose Print message about renaming # @param stop Error out if any duplicate names exist # # @return Returns list of objects with duplicate cells renamed to be unique # # @keywords internal # # @noRd # CheckDuplicateCellNames <- function(object.list, verbose = TRUE, stop = FALSE) { cell.names <- unlist(x = lapply(X = object.list, FUN = colnames)) if (any(duplicated(x = cell.names))) { if (stop) { stop("Duplicate cell names present across objects provided.") } if (verbose) { warning("Some cell names are duplicated across objects provided. Renaming to enforce unique cell names.") } object.list <- lapply( X = 1:length(x = object.list), FUN = function(x) { return(RenameCells( object = object.list[[x]], new.names = paste0(Cells(x = object.list[[x]]), "_", x) )) } ) } return(object.list) } # Create an empty dummy assay to replace existing assay #' @importFrom Matrix sparseMatrix CreateDummyAssay <- function(assay) { cm <- sparseMatrix( i = {}, j = {}, dims = c(nrow(x = assay), ncol(x = assay)) ) cm <- as.sparse(x = cm) rownames(x = cm) <- rownames(x = assay) colnames(x = cm) <- colnames(x = assay) return(CreateAssayObject( counts = cm, check.matrix = FALSE )) } # Extract delimiter information from a string. # # Parses a string (usually a cell name) and extracts fields based on a delimiter # # @param string String to parse. # @param field Integer(s) indicating which field(s) to extract. Can be a vector multiple numbers. # @param delim Delimiter to use, set to underscore by default. # # @return A new string, that parses out the requested fields, and (if multiple), rejoins them with the same delimiter # # @export # # @examples # ExtractField(string = 'Hello World', field = 1, delim = '_') # ExtractField <- function(string, field = 1, delim = "_") { fields <- as.numeric(x = unlist(x = strsplit(x = as.character(x = field), split = ","))) if (length(x = fields) == 1) { return(strsplit(x = string, split = delim)[[1]][field]) } return(paste(strsplit(x = string, split = delim)[[1]][fields], collapse = delim)) } # Resize GenomicRanges upstream and or downstream # from https://support.bioconductor.org/p/78652/ # Extend <- function(x, upstream = 0, downstream = 0) { if (any(GenomicRanges::strand(x = x) == "*")) { warning("'*' ranges were treated as '+'") } on_plus <- GenomicRanges::strand(x = x) == "+" | GenomicRanges::strand(x = x) == "*" new_start <- GenomicRanges::start(x = x) - ifelse(test = on_plus, yes = upstream, no = downstream) new_end <- GenomicRanges::end(x = x) + ifelse(test = on_plus, yes = downstream, no = upstream) IRanges::ranges(x = x) <- IRanges::IRanges(start = new_start, end = new_end) x <- GenomicRanges::trim(x = x) return(x) } # Interleave vectors together # # @param ... Vectors to be interleaved # # @return A vector with the values from each vector in ... interleaved # Interleave <- function(...) { return(as.vector(x = t(x = as.data.frame(x = list(...))))) } # Check if a matrix is empty # # Takes a matrix and asks if it's empty (either 0x0 or 1x1 with a value of NA) # # @param x A matrix # # @return Whether or not \code{x} is empty # IsMatrixEmpty <- function(x) { matrix.dims <- dim(x = x) matrix.na <- all(matrix.dims == 1) && all(is.na(x = x)) return(all(matrix.dims == 0) || matrix.na) } # Check if externalptr is null # From https://stackoverflow.com/questions/26666614/how-do-i-check-if-an-externalptr-is-null-from-within-r # is.null.externalptr <- function(pointer) { stopifnot(is(pointer, "externalptr")) .Call("isnull", pointer) } # Check whether an assay has been processed by sctransform # # @param assay assay to check # # @return Boolean # IsSCT <- function(assay) { if (is.list(x = assay)) { sct.check <- lapply(X = assay, FUN = function(x) { return(!is.null(x = Misc(object = x, slot = 'vst.out')) | !is.null(x = Misc(object = x, slot = 'vst.set')) | inherits(x = x, what = "SCTAssay")) }) return(unlist(x = sct.check)) } return(!is.null(x = Misc(object = assay, slot = 'vst.out')) | !is.null(x = Misc(object = assay, slot = 'vst.set')) | inherits(x = assay, what = "SCTAssay")) } # Check whether a vst.out is from sctransform # # @param vst.out a sct model from sctransform # # @return Boolean # IsVSTout <- function(vst.out) { vst.element <- c("model_str", "model_pars_fit", "cell_attr" ) vst.check <- setdiff(x = vst.element, y = names(x = vst.out)) if (length(x = setdiff(x = vst.element, y = names(x = vst.out))) == 0) { vst.check <- TRUE } else { vst.check <- FALSE } return(vst.check) } # Calculate euclidean distance the x and y, # and subtract the nearest neighbors of x distance to keep local connectivity # It is used in FindModalityWeights to calculate the with and cross modality distance impute_dist <- function(x, y, nearest.dist) { dist <- sqrt(x = rowSums(x = (x - y)**2)) - nearest.dist dist <- ReLu(x = dist) return(dist) } # Check the length of components of a list # # @param values A list whose components should be checked # @param cutoff A minimum value to check for # # @return a vector of logicals # LengthCheck <- function(values, cutoff = 0) { return(vapply( X = values, FUN = function(x) { return(length(x = x) > cutoff) }, FUN.VALUE = logical(1) )) } # Function to map values in a vector `v` as defined in `from`` to the values # defined in `to`. # # @param v vector of values to map # @param from vector of original values # @param to vector of values to map original values to (should be of equal # length as from) # @return returns vector of mapped values # MapVals <- function(v, from, to) { if (length(x = from) != length(x = to)) { stop("from and to vectors are not the equal length.") } vals.to.match <- match(x = v, table = from) vals.to.match.idx <- !is.na(x = vals.to.match) v[vals.to.match.idx] <- to[vals.to.match[vals.to.match.idx]] return(v) } # Independently shuffle values within each row of a matrix # # Creates a matrix where correlation structure has been removed, but overall values are the same # # @param x Matrix to shuffle # # @return Returns a scrambled matrix, where each row is shuffled independently # #' @importFrom stats runif # # @export # # @examples # mat <- matrix(data = rbinom(n = 25, size = 20, prob = 0.2 ), nrow = 5) # mat # MatrixRowShuffle(x = mat) # MatrixRowShuffle <- function(x) { x2 <- x x2 <- t(x = x) ind <- order(c(col(x = x2)), runif(n = length(x = x2))) x2 <- matrix( data = x2[ind], nrow = nrow(x = x), ncol = ncol(x = x), byrow = TRUE ) return(x2) } # Reverse the vector x and return the value at the Nth index. If N is larger # than the length of the vector, return the last value in the reversed vector. # # @param x vector of interest # @param N index in reversed vector # # @return returns element at given index # MaxN <- function(x, N = 2){ len <- length(x) if (N > len) { warning('N greater than length(x). Setting N=length(x)') N <- length(x) } sort(x, partial = len - N + 1)[len - N + 1] } # Given a range from cut, compute the mean # # @x range from cut as a string (e.g. (10, 20] ) # @return returns a numeric with the mean of the range # MeanRange <- function(x) { left <- gsub(pattern = "\\]", replacement = "", x = sub(pattern = "\\([[:digit:]\\.e+]*,", x = x, replacement = "")) right <- gsub(pattern = "\\(", replacement = "", x = sub(pattern = ",[[:digit:]\\.e+]*]", x = x, replacement = "")) return(mean(c(as.numeric(x = left), as.numeric(x = right)))) } # Melt a data frame # # @param x A data frame # # @return A molten data frame # Melt <- function(x) { if (!is.data.frame(x = x)) { x <- as.data.frame(x = x) } return(data.frame( rows = rep.int(x = rownames(x = x), times = ncol(x = x)), cols = unlist(x = lapply(X = colnames(x = x), FUN = rep.int, times = nrow(x = x))), vals = unlist(x = x, use.names = FALSE) )) } # Modify parameters in calling environment # # Used exclusively for helper parameter validation functions # # @param param name of parameter to change # @param value new value for parameter # ModifyParam <- function(param, value) { # modify in original function environment env1 <- sys.frame(which = length(x = sys.frames()) - 2) env1[[param]] <- value # also modify in validation function environment env2 <- sys.frame(which = length(x = sys.frames()) - 1) env2[[param]] <- value } # Give hints for old parameters and their newer counterparts # # This is a non-exhaustive list. If your function isn't working properly based # on the parameters you give it, please read the documentation for your function # # @param param A vector of parameters to get hints for # # @return Parameter hints for the specified parameters # OldParamHints <- function(param) { param.conversion <- c( 'raw.data' = 'counts', 'min.genes' = 'min.features', 'features.plot' = 'features', 'pc.genes' = 'features', 'do.print' = 'verbose', 'genes.print' = 'nfeatures.print', 'pcs.print' = 'ndims.print', 'pcs.use' = 'dims', 'reduction.use' = 'reduction', 'cells.use' = 'cells', 'do.balanced' = 'balanced', 'display.progress' = 'verbose', 'print.output' = 'verbose', 'dims.use' = 'dims', 'reduction.type' = 'reduction', 'y.log' = 'log', 'cols.use' = 'cols', 'assay.use' = 'assay' ) return(param.conversion[param]) } # Check if a web resource is available # # @param url A URL # @param strict Perform a strict web availability test # @param seconds Timeout in seconds # # @return \code{TRUE} if \url{is available} otherwise \code{FALSE} # #' @importFrom httr GET status_code timeout # # @keywords internal # Online <- function(url, strict = FALSE, seconds = 5L) { if (isTRUE(x = strict)) { code <- 200L comp <- identical } else { code <- 404L comp <- Negate(f = identical) } request <- tryCatch( expr = GET(url = url, timeout(seconds = seconds)), error = function(err) { code <- if (grepl(pattern = '^Timeout was reached', x = err$message)) { 408L } else { 404L } return(code) } ) return(comp(x = status_code(x = request), y = code)) } # Parenting parameters from one environment to the next # # This function allows one to modify a parameter in a parent environment # The primary use of this is to ensure logging functions store correct parameters # if they've been modified by a child function or method # # @param parent.find Regex pattern of name of parent function call to modify. # For example, this can be the class name for a method that was dispatched previously # @param ... Parameter names and values to parent; both name and value must be supplied # in the standard \code{name = value} format; any number of name/value pairs can be specified # # @return No return, modifies parent environment directly # # @examples # Parenting(parent.find = 'Seurat', features = features[features > 7]) # Parenting <- function(parent.find = 'Seurat', ...) { calls <- as.character(x = sys.calls()) calls <- lapply( X = strsplit(x = calls, split = '(', fixed = TRUE), FUN = '[', 1 ) parent.index <- grep(pattern = parent.find, x = calls) if (length(x = parent.index) != 1) { warning( "Cannot find a parent environment called ", parent.find, immediate. = TRUE, call. = FALSE ) } else { to.parent <- list(...) if (length(x = to.parent) == 0) { warning("Nothing to parent", immediate. = TRUE, call. = FALSE) } else if (is.null(x = names(x = to.parent))) { stop("All input must be in a key = value pair") } else if (length(x = Filter(f = nchar, x = names(x = to.parent))) != length(x = to.parent)) { stop("All inputs must be named") } else { parent.environ <- sys.frame(which = parent.index) for (i in 1:length(x = to.parent)) { parent.environ[[names(x = to.parent)[i]]] <- to.parent[[i]] } } } } # Generate a random name # # Make a name from randomly sampled lowercase letters, # pasted together with no spaces or other characters # # @param length How long should the name be # @param ... Extra parameters passed to sample # # @return A character with nchar == length of randomly sampled letters # # @seealso \code{\link{sample}} # RandomName <- function(length = 5L, ...) { CheckDots(..., fxns = 'sample') return(paste(sample(x = letters, size = length, ...), collapse = '')) } # Rectified linear units function. Calculate positive part of its argument # The input can be a vector and a matrix ReLu <- function(x) { x[x < 0] <- 0 return(x) } # Remove the last field from a string # # Parses a string (usually a cell name) and removes the last field based on a delimter # # @param string String to parse # @param delim Delimiter to use, set to underscore by default. # # @return A new string sans the last field # RemoveLastField <- function(string, delim = "_") { ss <- strsplit(x = string, split = delim)[[1]] if (length(x = ss) == 1) { return(string) } else { return(paste(ss[1:(length(x = ss)-1)], collapse = delim)) } } # Calculate row mean of a sparse matrix # @param mat sparse matrix # @return A vector of row mean # RowMeanSparse <- function(mat) { mat <- RowSparseCheck(mat = mat) output <- row_mean_dgcmatrix( x = slot(object = mat, name = "x"), i = slot(object = mat, name = "i"), rows = nrow(x = mat), cols = ncol(x = mat) ) names(x = output) <- rownames(x = mat) return(output) } # Calculate row sum of a sparse matrix # # @param mat sparse matrix # @return A vector of row sum # RowSumSparse <- function(mat) { mat <- RowSparseCheck(mat = mat) output <- row_sum_dgcmatrix( x = slot(object = mat, name = "x"), i = slot(object = mat, name = "i"), rows = nrow(x = mat), cols = ncol(x = mat) ) names(x = output) <- rownames(x = mat) return(output) } # Calculate row variance of a sparse matrix # # @param mat sparse matrix # @return A vector of row variance # RowVarSparse <- function(mat) { mat <- RowSparseCheck(mat = mat) output <- row_var_dgcmatrix( x = slot(object = mat, name = "x"), i = slot(object = mat, name = "i"), rows = nrow(x = mat), cols = ncol(x = mat) ) names(x = output) <- rownames(x = mat) return(output) } # Check if the input matrix is dgCMatrix # # @param mat sparse matrix # @return A dgCMatrix # RowSparseCheck <- function(mat) { if (!inherits(x = mat, what = "sparseMatrix")) { stop("Input should be sparse matrix") } else if (!is(object = mat, class2 = "dgCMatrix")) { warning("Input matrix is converted to dgCMatrix.") mat <- as.sparse(x = mat) } return(mat) } # Sweep out array summaries # # Reimplmentation of \code{\link[base]{sweep}} to maintain compatability with # both R 3.X and 4.X # # @inheritParams base::sweep # @param x an array. # # @seealso \code{\link[base]{sweep}} # Sweep <- function(x, MARGIN, STATS, FUN = '-', check.margin = TRUE, ...) { if (any(grepl(pattern = 'X', x = names(x = formals(fun = sweep))))) { return(sweep( X = x, MARGIN = MARGIN, STATS = STATS, FUN = FUN, check.margin = check.margin, ... )) } else { return(sweep( x = x, MARGIN = MARGIN, STATS = STATS, FUN = FUN, check.margin = check.margin, ... )) } } # Get program paths in a system-agnostic way # # @param progs A vector of program names # @param error Throw an error if any programs are not found # @param add.exe Add '.exe' extension to program names that don't have it # # @return A named vector of program paths; missing programs are returned as # \code{NA} if \code{error = FALSE} # #' @importFrom tools file_ext # SysExec <- function( progs, error = ifelse(test = length(x = progs) == 1, yes = TRUE, no = FALSE), add.exe = .Platform$OS.type == 'windows' ) { cmd <- ifelse( test = .Platform$OS.type == 'windows', yes = 'where.exe', no = 'which' ) if (add.exe) { missing.exe <- file_ext(x = progs) != 'exe' progs[missing.exe] <- paste0(progs[missing.exe], '.exe') } paths <- sapply( X = progs, FUN = function(x) { return(tryCatch( expr = system2(command = cmd, args = x, stdout = TRUE)[1], warning = function(...) { return(NA_character_) } )) } ) if (error && any(is.na(x = paths))) { stop( "Could not find the following programs: ", paste(names(x = paths[is.na(x = paths)]), collapse = ', '), call. = FALSE ) } return(paths) } # Try to convert x to numeric, if NA's introduced return x as is # ToNumeric <- function(x){ # check for x:y range if (is.numeric(x = x)) { return(x) } if (length(x = unlist(x = strsplit(x = x, split = ":"))) == 2) { num <- unlist(x = strsplit(x = x, split = ":")) return(num[1]:num[2]) } num <- suppressWarnings(expr = as.numeric(x = x)) if (!is.na(x = num)) { return(num) } return(x) } # Merge a list of sparse matrixes #' @importFrom Matrix summary sparseMatrix MergeSparseMatrices <- function(...) { colname.new <- character() rowname.new <- character() x <- vector() i <- numeric() j <- numeric() for (mat in list(...)) { colname.old <- colnames(x = mat) rowname.old <- rownames(x = mat) # does not check if there are overlapping cells colname.new <- union(x = colname.new, y = colname.old) rowname.new <- union(x = rowname.new, y = rowname.old) colindex.new <- match(x = colname.old, table = colname.new) rowindex.new <- match(x = rowname.old, table = rowname.new) ind <- summary(object = mat) # Expand the list of indices and x i <- c(i, rowindex.new[ind[,1]]) j <- c(j, colindex.new[ind[,2]]) x <- c(x, ind[,3]) } merged.mat <- sparseMatrix(i=i, j=j, x=x, dims=c(length(rowname.new), length(colname.new)), dimnames=list(rowname.new, colname.new)) return (merged.mat) } # cross product from delayed array # crossprod_DelayedAssay <- function(x, y, block.size = 1e8) { # perform t(x) %*% y in blocks for y if (!inherits(x = y, 'DelayedMatrix')) { stop('y should a DelayedMatrix') } if (nrow(x) != nrow(y)) { stop('row of x and y should be the same') } sparse <- DelayedArray::is_sparse(x = y) suppressMessages(expr = DelayedArray::setAutoBlockSize(size = block.size)) cells.grid <- DelayedArray::colAutoGrid(x = y) product.list <- list() for (i in seq_len(length.out = length(x = cells.grid))) { vp <- cells.grid[[i]] block <- DelayedArray::read_block(x = y, viewport = vp, as.sparse = sparse) if (sparse) { block <- as(object = block, Class = 'dgCMatrix') } else { block <- as(object = block, Class = 'Matrix') } product.list[[i]] <- as.matrix(t(x) %*% block) } product.mat <- matrix(data = unlist(product.list), nrow = ncol(x) , ncol = ncol(y)) colnames(product.mat) <- colnames(y) rownames(product.mat) <- colnames(x) return(product.mat) } # cross product from BPCells # crossprod_BPCells <- function(x, y) { # perform t(x) %*% y, y is from BPCells product.mat <- t(x) %*% y colnames(product.mat) <- colnames(y) rownames(product.mat) <- colnames(x) return(product.mat) } # nonzero element version of sweep # SweepNonzero <- function( x, MARGIN, STATS, FUN = "/" ) { if (!inherits(x = x, what = 'dgCMatrix')) { stop('input should be dgCMatrix. eg: x <- as(x, "CsparseMatrix")') } if (dim(x = x)[MARGIN] != length(STATS)){ warning("Length of STATS is not equal to dim(x)[MARGIN]") } fun <- match.fun(FUN) if (MARGIN == 1) { idx <- x@i + 1 x@x <- fun(x@x, STATS[idx]) } else if (MARGIN == 2) { x <- as(x, "RsparseMatrix") idx <- x@j + 1 x@x <- fun(x@x, STATS[idx]) x <- as(x, "CsparseMatrix") } return(x) } #' Create one hot matrix for a given label #' #' @param labels A vector of labels #' @param method Method to aggregate cells with the same label. Either 'aggregate' or 'average' #' @param cells.name A vector of cell names #' #' @importFrom Matrix colSums sparse.model.matrix #' @importFrom stats as.formula #' @export #' @concept utilities #' CreateCategoryMatrix <- function( labels, method = c('aggregate', 'average'), cells.name = NULL ) { method <- match.arg(arg = method) if (is.null(dim(labels))) { if (length(x = unique(x = labels)) == 1) { data <- matrix(nrow = length(x = labels), ncol = 0) } else { data <- cbind(labels = labels) } } else { data <- labels } cells.name <- cells.name %||% rownames(data) if (!is.null(cells.name) & length(cells.name) != nrow(data)) { stop('length of cells name should be equal to the length of input labels') } if (ncol(x = data) == 0) { message("All grouping variables have 1 value only. Computing across all cells.") category.matrix <- matrix( data = 1, nrow = nrow(x = data), dimnames = list(cells.name, 'all') ) if (method == 'average') { category.matrix <- category.matrix / sum(category.matrix) } return(category.matrix) } group.by <- colnames(x = data) category.matrix <- sparse.model.matrix(object = as.formula( object = paste0( '~0+', paste0( "data[,", 1:length(x = group.by), "]", collapse = ":" ) ) )) colsums <- colSums(x = category.matrix) category.matrix <- category.matrix[, colsums > 0] colsums <- colsums[colsums > 0] if (method =='average') { category.matrix <- SweepNonzero( x = category.matrix, MARGIN = 2, STATS = colsums, FUN = "/") } if (any(grepl(pattern = "_", x = colnames(x = category.matrix) ))) { inform( message = "Names of identity class contain underscores ('_'), replacing with dashes ('-')", .frequency = "regularly", .frequency_id = "CreateCategoryMatrix" ) colnames(x = category.matrix) <- gsub(pattern = '_', replacement = '-', x = colnames(x = category.matrix) ) } colnames(x = category.matrix) <- unname(sapply( X = colnames(x = category.matrix), FUN = function(name) { name <- gsub(pattern = "data\\[, [1-9]*\\]", replacement = "", x = name) return(paste0(rev(x = unlist(x = strsplit(x = name, split = ":"))), collapse = "_")) })) rownames(category.matrix) <- cells.name return(category.matrix) } #' Construct an assay for spatial niche analysis #' #' This function will construct a new assay where each feature is a #' cell label The values represents the sum of a particular cell label #' neighboring a given cell. #' #' @param object A Seurat object #' @param fov FOV object to gather cell positions from #' @param group.by Cell classifications to count in spatial neighborhood #' @param assay Name for spatial neighborhoods assay #' @param cluster.name Name of output clusters #' @param neighbors.k Number of neighbors to consider for each cell #' @param niches.k Number of clusters to return based on the niche assay #' #' @importFrom stats kmeans #' @return Seurat object containing a new assay #' @concept clustering #' @export #' BuildNicheAssay <- function( object, fov, group.by, assay = "niche", cluster.name = "niches", neighbors.k = 20, niches.k = 4 ) { # initialize an empty cells x groups binary matrix cells <- Cells(object[[fov]]) group.labels <- unlist(object[[group.by]][cells, ]) groups <- sort(unique(group.labels)) cell.type.mtx <- matrix( data = 0, nrow = length(cells), ncol = length(groups) ) rownames(cell.type.mtx) <- cells colnames(cell.type.mtx) <- groups # populate the binary matrix cells.idx <- seq_along(cells) group.idx <- match(group.labels, groups) cell.type.mtx[cbind(cells.idx, group.idx)] <- 1 # find neighbors based on tissue position coords <- GetTissueCoordinates(object[[fov]], which = "centroids") rownames(coords) <- coords[["cell"]] coords <- as.matrix(coords[ , c("x", "y")]) neighbors <- FindNeighbors(coords, k.param = neighbors.k, compute.SNN = FALSE) # create niche assay sum.mtx <- as.matrix(neighbors[["nn"]] %*% cell.type.mtx) niche.assay <- CreateAssayObject(counts = t(sum.mtx)) object[[assay]] <- niche.assay DefaultAssay(object) <- assay # cluster niche assay object <- ScaleData(object) results <- kmeans( x = t(object[[assay]]@scale.data), centers = niches.k, nstart = 30 ) object[[cluster.name]] <- results[["cluster"]] return(object) } Seurat/R/zzz.R0000644000176200001440000000606014730427000012675 0ustar liggesusers#' @importFrom progressr progressor #' @importFrom methods slot slot<- #' @importFrom lifecycle deprecated deprecate_soft deprecate_stop #' deprecate_warn is_present #' @importFrom rlang !!! #' abort #' arg_match #' arg_match0 #' as_name #' caller_env #' check_installed #' enquo #' inform #' is_integerish #' is_na #' is_quosure #' is_scalar_integerish #' quo_get_env #' quo_get_expr #' warn #' NULL #' @section Package options: #' #' Seurat uses the following [options()] to configure behaviour: #' #' \describe{ #' \item{\code{Seurat.memsafe}}{global option to call gc() after many operations. #' This can be helpful in cleaning up the memory status of the R session and #' prevent use of swap space. However, it does add to the computational overhead #' and setting to FALSE can speed things up if you're working in an environment #' where RAM availability is not a concern.} #' \item{\code{Seurat.warn.umap.uwot}}{Show warning about the default backend #' for \code{\link{RunUMAP}} changing from Python UMAP via reticulate to UWOT} #' \item{\code{Seurat.checkdots}}{For functions that have ... as a parameter, #' this controls the behavior when an item isn't used. Can be one of warn, #' stop, or silent.} #' \item{\code{Seurat.limma.wilcox.msg}}{{Show message about more efficient #' Wilcoxon Rank Sum test available via the limma package}} #' \item{\code{Seurat.Rfast2.msg}}{{Show message about more efficient #' Moran's I function available via the Rfast2 package}} #' \item{\code{Seurat.warn.vlnplot.split}}{Show message about changes to #' default behavior of split/multi violin plots} #' } #' #' @docType package #' @rdname Seurat-package #' @name Seurat-package #' "_PACKAGE" #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Options #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% seurat_default_options <- list( Seurat.memsafe = FALSE, Seurat.warn.umap.uwot = TRUE, Seurat.checkdots = "warn", Seurat.presto.wilcox.msg = TRUE, #CHANGE Seurat.Rfast2.msg = TRUE, Seurat.warn.vlnplot.split = TRUE, Seurat.object.assay.version = "v5" ) #' @importFrom methods setClassUnion #' @importClassesFrom Matrix dgCMatrix #' NULL setClassUnion(name = 'V3Matrix', members = c('matrix', 'dgCMatrix')) AttachDeps <- function(deps) { for (d in deps) { if (!paste0('package:', d) %in% search()) { packageStartupMessage("Attaching ", d) attachNamespace(ns = d) } } } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Hooks #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @importFrom SeuratObject AttachDeps #' .onAttach <- function(libname, pkgname) { AttachDeps(deps = c('SeuratObject')) return(invisible(x = NULL)) } .onLoad <- function(libname, pkgname) { toset <- setdiff( x = names(x = seurat_default_options), y = names(x = options()) ) # toset <- names(x = seurat_default_options) if (length(x = toset)) { options(seurat_default_options[toset]) } return(invisible(x = NULL)) } Seurat/R/visualization.R0000644000176200001440000107043714744464517014776 0ustar liggesusers#' @importFrom utils globalVariables #' @importFrom ggplot2 fortify GeomViolin ggproto #' @importFrom SeuratObject DefaultDimReduc #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @importFrom methods setGeneric #' setGeneric( name = '.PrepImageData', def = function(data, cells, ...) { standardGeneric(f = '.PrepImageData') } ) #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Heatmaps #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Dimensional reduction heatmap #' #' Draws a heatmap focusing on a principal component. Both cells and genes are sorted by their #' principal component scores. Allows for nice visualization of sources of heterogeneity in the dataset. #' #' @inheritParams DoHeatmap #' @param dims Dimensions to plot #' @param nfeatures Number of genes to plot #' @param cells A list of cells to plot. If numeric, just plots the top cells. #' @param reduction Which dimensional reduction to use #' @param balanced Plot an equal number of genes with both + and - scores. #' @param projected Use the full projected dimensional reduction #' @param ncol Number of columns to plot #' @param fast If true, use \code{image} to generate plots; faster than using ggplot2, but not customizable #' @param assays A vector of assays to pull data from #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' ggplot object. If \code{FALSE}, return a list of ggplot objects #' #' @return No return value by default. If using fast = FALSE, will return a #' \code{\link[patchwork]{patchwork}ed} ggplot object if combine = TRUE, otherwise #' returns a list of ggplot objects #' #' @importFrom patchwork wrap_plots #' @export #' @concept visualization #' #' @seealso \code{\link[graphics]{image}} \code{\link[ggplot2]{geom_raster}} #' #' @examples #' data("pbmc_small") #' DimHeatmap(object = pbmc_small) #' DimHeatmap <- function( object, dims = 1, nfeatures = 30, cells = NULL, reduction = 'pca', disp.min = -2.5, disp.max = NULL, balanced = TRUE, projected = FALSE, ncol = NULL, fast = TRUE, raster = TRUE, slot = 'scale.data', assays = NULL, combine = TRUE ) { ncol <- ncol %||% ifelse(test = length(x = dims) > 2, yes = 3, no = length(x = dims)) plots <- vector(mode = 'list', length = length(x = dims)) assays <- assays %||% DefaultAssay(object = object) disp.max <- disp.max %||% ifelse( test = slot == 'scale.data', yes = 2.5, no = 6 ) if (!DefaultAssay(object = object[[reduction]]) %in% assays) { warning("The original assay that the reduction was computed on is different than the assay specified") } cells <- cells %||% ncol(x = object) if (is.numeric(x = cells)) { cells <- lapply( X = dims, FUN = function(x) { cells <- TopCells( object = object[[reduction]], dim = x, ncells = cells, balanced = balanced ) if (balanced) { cells$negative <- rev(x = cells$negative) } cells <- unlist(x = unname(obj = cells)) return(cells) } ) } if (!is.list(x = cells)) { cells <- lapply(X = 1:length(x = dims), FUN = function(x) {return(cells)}) } features <- lapply( X = dims, FUN = TopFeatures, object = object[[reduction]], nfeatures = nfeatures, balanced = balanced, projected = projected ) features.all <- unique(x = unlist(x = features)) if (length(x = assays) > 1) { features.keyed <- lapply( X = assays, FUN = function(assay) { features <- features.all[features.all %in% rownames(x = object[[assay]])] if (length(x = features) > 0) { return(paste0(Key(object = object[[assay]]), features)) } } ) features.keyed <- Filter(f = Negate(f = is.null), x = features.keyed) features.keyed <- unlist(x = features.keyed) } else { features.keyed <- features.all DefaultAssay(object = object) <- assays } data.all <- FetchData( object = object, vars = features.keyed, cells = unique(x = unlist(x = cells)), slot = slot ) data.all <- MinMax(data = data.all, min = disp.min, max = disp.max) data.limits <- c(min(data.all), max(data.all)) # if (check.plot && any(c(length(x = features.keyed), length(x = cells[[1]])) > 700)) { # choice <- menu(c("Continue with plotting", "Quit"), title = "Plot(s) requested will likely take a while to plot.") # if (choice != 1) { # return(invisible(x = NULL)) # } # } if (fast) { nrow <- floor(x = length(x = dims) / 3.01) + 1 orig.par <- par()$mfrow par(mfrow = c(nrow, ncol)) } for (i in 1:length(x = dims)) { dim.features <- c(features[[i]][[2]], rev(x = features[[i]][[1]])) dim.features <- rev(x = unlist(x = lapply( X = dim.features, FUN = function(feat) { return(grep(pattern = paste0(feat, '$'), x = features.keyed, value = TRUE)) } ))) dim.cells <- cells[[i]] data.plot <- data.all[dim.cells, dim.features] if (fast) { SingleImageMap( data = data.plot, title = paste0(Key(object = object[[reduction]]), dims[i]), order = dim.cells ) } else { plots[[i]] <- SingleRasterMap( data = data.plot, raster = raster, limits = data.limits, cell.order = dim.cells, feature.order = dim.features ) } } if (fast) { par(mfrow = orig.par) return(invisible(x = NULL)) } if (combine) { plots <- wrap_plots(plots, ncol = ncol, guides = "collect") } return(plots) } #' Feature expression heatmap #' #' Draws a heatmap of single cell feature expression. #' #' @param object Seurat object #' @param features A vector of features to plot, defaults to \code{VariableFeatures(object = object)} #' @param cells A vector of cells to plot #' @param disp.min Minimum display value (all values below are clipped) #' @param disp.max Maximum display value (all values above are clipped); defaults to 2.5 #' if \code{slot} is 'scale.data', 6 otherwise #' @param group.by A vector of variables to group cells by; pass 'ident' to group by cell identity classes #' @param group.bar Add a color bar showing group status for cells #' @param group.colors Colors to use for the color bar #' @param slot Data slot to use, choose from 'raw.data', 'data', or 'scale.data' #' @param assay Assay to pull from # @param check.plot Check that plotting will finish in a reasonable amount of time #' @param label Label the cell identies above the color bar #' @param size Size of text above color bar #' @param hjust Horizontal justification of text above color bar #' @param vjust Vertical justification of text above color bar #' @param angle Angle of text above color bar #' @param raster If true, plot with geom_raster, else use geom_tile. geom_raster may look blurry on #' some viewing applications such as Preview due to how the raster is interpolated. Set this to FALSE #' if you are encountering that issue (note that plots may take longer to produce/render). #' @param draw.lines Include white lines to separate the groups #' @param lines.width Integer number to adjust the width of the separating white lines. #' Corresponds to the number of "cells" between each group. #' @param group.bar.height Scale the height of the color bar #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' ggplot object. If \code{FALSE}, return a list of ggplot objects #' #' @return A \code{\link[patchwork]{patchwork}ed} ggplot object if #' \code{combine = TRUE}; otherwise, a list of ggplot objects #' #' @importFrom stats median #' @importFrom scales hue_pal #' @importFrom ggplot2 annotation_raster coord_cartesian scale_color_manual #' ggplot_build aes_string geom_text #' @importFrom patchwork wrap_plots #' @export #' @concept visualization #' #' @examples #' data("pbmc_small") #' DoHeatmap(object = pbmc_small) #' DoHeatmap <- function( object, features = NULL, cells = NULL, group.by = 'ident', group.bar = TRUE, group.colors = NULL, disp.min = -2.5, disp.max = NULL, slot = 'scale.data', assay = NULL, label = TRUE, size = 5.5, hjust = 0, vjust = 0, angle = 45, raster = TRUE, draw.lines = TRUE, lines.width = NULL, group.bar.height = 0.02, combine = TRUE ) { assay <- assay %||% DefaultAssay(object = object) DefaultAssay(object = object) <- assay cells <- cells %||% colnames(x = object[[assay]]) if (is.numeric(x = cells)) { cells <- colnames(x = object)[cells] } features <- features %||% VariableFeatures(object = object) features <- rev(x = unique(x = features)) disp.max <- disp.max %||% ifelse( test = slot == 'scale.data', yes = 2.5, no = 6 ) # make sure features are present possible.features <- rownames(x = GetAssayData(object = object, slot = slot)) if (any(!features %in% possible.features)) { bad.features <- features[!features %in% possible.features] features <- features[features %in% possible.features] if(length(x = features) == 0) { stop("No requested features found in the ", slot, " slot for the ", assay, " assay.") } warning("The following features were omitted as they were not found in the ", slot, " slot for the ", assay, " assay: ", paste(bad.features, collapse = ", ")) } data <- as.data.frame(x = as.matrix(x = t(x = GetAssayData( object = object, slot = slot)[features, cells, drop = FALSE]))) object <- suppressMessages(expr = StashIdent(object = object, save.name = 'ident')) group.by <- group.by %||% 'ident' groups.use <- object[[group.by]][cells, , drop = FALSE] # group.use <- switch( # EXPR = group.by, # 'ident' = Idents(object = object), # object[[group.by, drop = TRUE]] # ) # group.use <- factor(x = group.use[cells]) plots <- vector(mode = 'list', length = ncol(x = groups.use)) for (i in 1:ncol(x = groups.use)) { data.group <- data group.use <- groups.use[, i, drop = TRUE] if (!is.factor(x = group.use)) { group.use <- factor(x = group.use) } names(x = group.use) <- cells if (draw.lines) { # create fake cells to serve as the white lines, fill with NAs lines.width <- lines.width %||% ceiling(x = nrow(x = data.group) * 0.0025) placeholder.cells <- sapply( X = 1:(length(x = levels(x = group.use)) * lines.width), FUN = function(x) { return(RandomName(length = 20)) } ) placeholder.groups <- rep(x = levels(x = group.use), times = lines.width) group.levels <- levels(x = group.use) names(x = placeholder.groups) <- placeholder.cells group.use <- as.vector(x = group.use) names(x = group.use) <- cells group.use <- factor(x = c(group.use, placeholder.groups), levels = group.levels) na.data.group <- matrix( data = NA, nrow = length(x = placeholder.cells), ncol = ncol(x = data.group), dimnames = list(placeholder.cells, colnames(x = data.group)) ) data.group <- rbind(data.group, na.data.group) } lgroup <- length(levels(group.use)) plot <- SingleRasterMap( data = data.group, raster = raster, disp.min = disp.min, disp.max = disp.max, feature.order = features, cell.order = names(x = sort(x = group.use)), group.by = group.use ) if (group.bar) { # TODO: Change group.bar to annotation.bar default.colors <- c(hue_pal()(length(x = levels(x = group.use)))) if (!is.null(x = names(x = group.colors))) { cols <- unname(obj = group.colors[levels(x = group.use)]) } else { cols <- group.colors[1:length(x = levels(x = group.use))] %||% default.colors } if (any(is.na(x = cols))) { cols[is.na(x = cols)] <- default.colors[is.na(x = cols)] cols <- Col2Hex(cols) col.dups <- sort(x = unique(x = which(x = duplicated(x = substr( x = cols, start = 1, stop = 7 ))))) through <- length(x = default.colors) while (length(x = col.dups) > 0) { pal.max <- length(x = col.dups) + through cols.extra <- hue_pal()(pal.max)[(through + 1):pal.max] cols[col.dups] <- cols.extra col.dups <- sort(x = unique(x = which(x = duplicated(x = substr( x = cols, start = 1, stop = 7 ))))) } } group.use2 <- sort(x = group.use) if (draw.lines) { na.group <- RandomName(length = 20) levels(x = group.use2) <- c(levels(x = group.use2), na.group) group.use2[placeholder.cells] <- na.group cols <- c(cols, "#FFFFFF") } pbuild <- ggplot_build(plot = plot) names(x = cols) <- levels(x = group.use2) # scale the height of the bar y.range <- diff(x = pbuild$layout$panel_params[[1]]$y.range) y.pos <- max(pbuild$layout$panel_params[[1]]$y.range) + y.range * 0.015 y.max <- y.pos + group.bar.height * y.range x.min <- min(pbuild$layout$panel_params[[1]]$x.range) + 0.1 x.max <- max(pbuild$layout$panel_params[[1]]$x.range) - 0.1 plot <- plot + annotation_raster( raster = t(x = cols[group.use2]), xmin = x.min, xmax = x.max, ymin = y.pos, ymax = y.max ) + coord_cartesian(ylim = c(0, y.max), clip = 'off') + scale_color_manual( values = cols[-length(x = cols)], name = "Identity", na.translate = FALSE ) if (label) { x.max <- max(pbuild$layout$panel_params[[1]]$x.range) # Attempt to pull xdivs from x.major in ggplot2 < 3.3.0; if NULL, pull from the >= 3.3.0 slot x.divs <- pbuild$layout$panel_params[[1]]$x.major %||% attr(x = pbuild$layout$panel_params[[1]]$x$get_breaks(), which = "pos") x <- data.frame(group = sort(x = group.use), x = x.divs) label.x.pos <- tapply(X = x$x, INDEX = x$group, FUN = function(y) { if (isTRUE(x = draw.lines)) { mean(x = y[-length(x = y)]) } else { mean(x = y) } }) label.x.pos <- data.frame(group = names(x = label.x.pos), label.x.pos) plot <- plot + geom_text( stat = "identity", data = label.x.pos, aes_string(label = 'group', x = 'label.x.pos'), y = y.max + y.max * 0.03 * 0.5 + vjust, angle = angle, hjust = hjust, size = size ) plot <- suppressMessages(plot + coord_cartesian( ylim = c(0, y.max + y.max * 0.002 * max(nchar(x = levels(x = group.use))) * size), clip = 'off') ) } } plot <- plot + theme(line = element_blank()) plots[[i]] <- plot } if (combine) { plots <- wrap_plots(plots) } return(plots) } #' Hashtag oligo heatmap #' #' Draws a heatmap of hashtag oligo signals across singlets/doublets/negative cells. Allows for the visualization of HTO demultiplexing results. #' #' @param object Seurat object. Assumes that the hash tag oligo (HTO) data has been added and normalized, and demultiplexing has been run with HTODemux(). #' @param classification The naming for metadata column with classification result from HTODemux(). #' @param global.classification The slot for metadata column specifying a cell as singlet/doublet/negative. #' @param assay Hashtag assay name. #' @param ncells Number of cells to plot. Default is to choose 5000 cells by random subsampling, to avoid having to draw exceptionally large heatmaps. #' @param singlet.names Namings for the singlets. Default is to use the same names as HTOs. #' @param raster If true, plot with geom_raster, else use geom_tile. geom_raster may look blurry on #' some viewing applications such as Preview due to how the raster is interpolated. Set this to FALSE #' if you are encountering that issue (note that plots may take longer to produce/render). #' @return Returns a ggplot2 plot object. #' #' @importFrom ggplot2 guides #' @export #' @concept visualization #' #' @seealso \code{\link{HTODemux}} #' #' @examples #' \dontrun{ #' object <- HTODemux(object) #' HTOHeatmap(object) #' } #' HTOHeatmap <- function( object, assay = 'HTO', classification = paste0(assay, '_classification'), global.classification = paste0(assay, '_classification.global'), ncells = 5000, singlet.names = NULL, raster = TRUE ) { DefaultAssay(object = object) <- assay Idents(object = object) <- object[[classification, drop = TRUE]] if (ncells > ncol(x = object)) { warning("ncells (", ncells, ") is larger than the number of cells present in the provided object (", ncol(x = object), "). Plotting heatmap for all cells.") } else { object <- subset( x = object, cells = sample(x = colnames(x = object), size = ncells) ) } classification <- object[[classification]] singlets <- which(x = object[[global.classification]] == 'Singlet') singlet.ids <- sort(x = unique(x = as.character(x = classification[singlets, ]))) doublets <- which(object[[global.classification]] == 'Doublet') doublet.ids <- sort(x = unique(x = as.character(x = classification[doublets, ]))) heatmap.levels <- c(singlet.ids, doublet.ids, 'Negative') object <- ScaleData(object = object, assay = assay, verbose = FALSE) data <- FetchData(object = object, vars = singlet.ids) Idents(object = object) <- factor(x = classification[, 1], levels = heatmap.levels) plot <- SingleRasterMap( data = data, raster = raster, feature.order = rev(x = singlet.ids), cell.order = names(x = sort(x = Idents(object = object))), group.by = Idents(object = object) ) + guides(color = FALSE) return(plot) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Expression by identity plots #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Single cell ridge plot #' #' Draws a ridge plot of single cell data (gene expression, metrics, PC #' scores, etc.) #' #' @param object Seurat object #' @param features Features to plot (gene expression, metrics, PC scores, #' anything that can be retreived by FetchData) #' @param cols Colors to use for plotting #' @param idents Which classes to include in the plot (default is all) #' @param sort Sort identity classes (on the x-axis) by the average #' expression of the attribute being potted, can also pass 'increasing' or 'decreasing' to change sort direction #' @param assay Name of assay to use, defaults to the active assay #' @param group.by Group (color) cells in different ways (for example, orig.ident) #' @param y.max Maximum y axis value #' @param same.y.lims Set all the y-axis limits to the same values #' @param log plot the feature axis on log scale #' @param ncol Number of columns if multiple plots are displayed #' @param slot Slot to pull expression data from (e.g. "counts" or "data") #' @param layer Layer to pull expression data from (e.g. "counts" or "data") #' @param stack Horizontally stack plots for each feature #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' ggplot object. If \code{FALSE}, return a list of ggplot #' @param fill.by Color violins/ridges based on either 'feature' or 'ident' #' #' @return A \code{\link[patchwork]{patchwork}ed} ggplot object if #' \code{combine = TRUE}; otherwise, a list of ggplot objects #' #' @export #' @concept visualization #' #' @examples #' data("pbmc_small") #' RidgePlot(object = pbmc_small, features = 'PC_1') #' RidgePlot <- function( object, features, cols = NULL, idents = NULL, sort = FALSE, assay = NULL, group.by = NULL, y.max = NULL, same.y.lims = FALSE, log = FALSE, ncol = NULL, slot = deprecated(), layer = 'data', stack = FALSE, combine = TRUE, fill.by = 'feature' ) { if (is_present(arg = slot)) { deprecate_soft( when = '5.0.0', what = 'RidgePlot(slot = )', with = 'RidgePlot(layer = )' ) layer <- slot %||% layer } return(ExIPlot( object = object, type = 'ridge', features = features, idents = idents, ncol = ncol, sort = sort, assay = assay, y.max = y.max, same.y.lims = same.y.lims, cols = cols, group.by = group.by, log = log, layer = layer, stack = stack, combine = combine, fill.by = fill.by )) } #' Single cell violin plot #' #' Draws a violin plot of single cell data (gene expression, metrics, PC #' scores, etc.) #' #' @inheritParams RidgePlot #' @param pt.size Point size for points #' @param alpha Alpha value for points #' @param split.by A factor in object metadata to split the plot by, pass 'ident' #' to split by cell identity #' @param split.plot plot each group of the split violin plots by multiple or #' single violin shapes. #' @param adjust Adjust parameter for geom_violin #' @param flip flip plot orientation (identities on x-axis) #' @param add.noise determine if adding a small noise for plotting #' @param raster Convert points to raster format. Requires 'ggrastr' to be installed. # default is \code{NULL} which automatically rasterizes if ggrastr is installed and # number of points exceed 100,000. #' #' @return A \code{\link[patchwork]{patchwork}ed} ggplot object if #' \code{combine = TRUE}; otherwise, a list of ggplot objects #' #' @export #' @concept visualization #' #' @seealso \code{\link{FetchData}} #' #' @examples #' data("pbmc_small") #' VlnPlot(object = pbmc_small, features = 'PC_1') #' VlnPlot(object = pbmc_small, features = 'LYZ', split.by = 'groups') #' VlnPlot <- function( object, features, cols = NULL, pt.size = NULL, alpha = 1, idents = NULL, sort = FALSE, assay = NULL, group.by = NULL, split.by = NULL, adjust = 1, y.max = NULL, same.y.lims = FALSE, log = FALSE, ncol = NULL, slot = deprecated(), layer = NULL, split.plot = FALSE, stack = FALSE, combine = TRUE, fill.by = 'feature', flip = FALSE, add.noise = TRUE, raster = NULL ) { if (is_present(arg = slot)) { deprecate_soft( when = '5.0.0', what = 'VlnPlot(slot = )', with = 'VlnPlot(layer = )' ) layer <- slot %||% layer } layer.set <- suppressWarnings( Layers( object = object, search = layer %||% 'data' ) ) if (is.null(layer) && length(layer.set) == 1 && layer.set == 'scale.data'){ warning('Default search for "data" layer yielded no results; utilizing "scale.data" layer instead.') } assay.name <- DefaultAssay(object) if (is.null(layer.set) & is.null(layer) ) { warning('Default search for "data" layer in "', assay.name, '" assay yielded no results; utilizing "counts" layer instead.', call. = FALSE, immediate. = TRUE) layer.set <- Layers( object = object, search = 'counts' ) } if (is.null(layer.set)) { stop('layer "', layer,'" is not found in assay: "', assay.name, '"') } else { layer <- layer.set } if ( !is.null(x = split.by) & getOption(x = 'Seurat.warn.vlnplot.split', default = TRUE) ) { message( "The default behaviour of split.by has changed.\n", "Separate violin plots are now plotted side-by-side.\n", "To restore the old behaviour of a single split violin,\n", "set split.plot = TRUE. \nThis message will be shown once per session." ) options(Seurat.warn.vlnplot.split = FALSE) } return(ExIPlot( object = object, type = ifelse(test = split.plot, yes = 'splitViolin', no = 'violin'), features = features, idents = idents, ncol = ncol, sort = sort, assay = assay, y.max = y.max, same.y.lims = same.y.lims, adjust = adjust, pt.size = pt.size, alpha = alpha, cols = cols, group.by = group.by, split.by = split.by, log = log, layer = layer, stack = stack, combine = combine, fill.by = fill.by, flip = flip, add.noise = add.noise, raster = raster )) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Dimensional reduction plots #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Color dimensional reduction plot by tree split #' #' Returns a DimPlot colored based on whether the cells fall in clusters #' to the left or to the right of a node split in the cluster tree. #' #' @param object Seurat object #' @param node Node in cluster tree on which to base the split #' @param left.color Color for the left side of the split #' @param right.color Color for the right side of the split #' @param other.color Color for all other cells #' @inheritDotParams DimPlot -object #' #' @return Returns a DimPlot #' #' @export #' @concept visualization #' #' @seealso \code{\link{DimPlot}} #' #' @examples #' \dontrun{ #' if (requireNamespace("ape", quietly = TRUE)) { #' data("pbmc_small") #' pbmc_small <- BuildClusterTree(object = pbmc_small, verbose = FALSE) #' PlotClusterTree(pbmc_small) #' ColorDimSplit(pbmc_small, node = 5) #' } #' } #' ColorDimSplit <- function( object, node, left.color = 'red', right.color = 'blue', other.color = 'grey50', ... ) { CheckDots(..., fxns = 'DimPlot') tree <- Tool(object = object, slot = "BuildClusterTree") split <- tree$edge[which(x = tree$edge[, 1] == node), ][, 2] all.children <- sort(x = tree$edge[, 2][!tree$edge[, 2] %in% tree$edge[, 1]]) left.group <- DFT(tree = tree, node = split[1], only.children = TRUE) right.group <- DFT(tree = tree, node = split[2], only.children = TRUE) if (any(is.na(x = left.group))) { left.group <- split[1] } if (any(is.na(x = right.group))) { right.group <- split[2] } left.group <- MapVals(v = left.group, from = all.children, to = tree$tip.label) right.group <- MapVals(v = right.group, from = all.children, to = tree$tip.label) remaining.group <- setdiff(x = tree$tip.label, y = c(left.group, right.group)) left.cells <- WhichCells(object = object, ident = left.group) right.cells <- WhichCells(object = object, ident = right.group) remaining.cells <- WhichCells(object = object, ident = remaining.group) object <- SetIdent( object = object, cells = left.cells, value = "Left Split" ) object <- SetIdent( object = object, cells = right.cells, value = "Right Split" ) object <- SetIdent( object = object, cells = remaining.cells, value = "Not in Split" ) levels(x = object) <- c("Left Split", "Right Split", "Not in Split") colors.use = c(left.color, right.color, other.color) return(DimPlot(object = object, cols = colors.use, ...)) } #' Dimensional reduction plot #' #' Graphs the output of a dimensional reduction technique on a 2D scatter plot where each point is a #' cell and it's positioned based on the cell embeddings determined by the reduction technique. By #' default, cells are colored by their identity class (can be changed with the group.by parameter). #' #' @param object Seurat object #' @param dims Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions #' @param cells Vector of cells to plot (default is all cells) #' @param cols Vector of colors, each color corresponds to an identity class. This may also be a single character #' or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. #' By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. #' See \code{\link{DiscretePalette}} for details. #' @param pt.size Adjust point size for plotting #' @param reduction Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca #' @param group.by Name of one or more metadata columns to group (color) cells by #' (for example, orig.ident); pass 'ident' to group by identity class #' @param split.by A factor in object metadata to split the plot by, pass 'ident' #' to split by cell identity #' @param shape.by If NULL, all points are circles (default). You can specify any #' cell attribute (that can be pulled with FetchData) allowing for both #' different colors and different shapes on cells. Only applicable if \code{raster = FALSE}. #' @param order Specify the order of plotting for the idents. This can be #' useful for crowded plots if points of interest are being buried. Provide #' either a full list of valid idents or a subset to be plotted last (on top) #' @param shuffle Whether to randomly shuffle the order of points. This can be #' useful for crowded plots if points of interest are being buried. (default is FALSE) #' @param seed Sets the seed if randomly shuffling the order of points. #' @param label Whether to label the clusters #' @param label.size Sets size of labels #' @param label.color Sets the color of the label text #' @param label.box Whether to put a box around the label text (geom_text vs #' geom_label) #' @param alpha Alpha value for plotting (default is 1) #' @param repel Repel labels #' @param stroke.size Adjust stroke (outline) size of points #' @param cells.highlight A list of character or numeric vectors of cells to #' highlight. If only one group of cells desired, can simply #' pass a vector instead of a list. If set, colors selected cells to the color(s) #' in \code{cols.highlight} and other cells black (white if dark.theme = TRUE); #' will also resize to the size(s) passed to \code{sizes.highlight} #' @param cols.highlight A vector of colors to highlight the cells as; will #' repeat to the length groups in cells.highlight #' @param sizes.highlight Size of highlighted cells; will repeat to the length #' groups in cells.highlight. If \code{sizes.highlight = TRUE} size of all #' points will be this value. #' @param na.value Color value for NA points when using custom scale #' @param ncol Number of columns for display when combining plots #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' ggplot object. If \code{FALSE}, return a list of ggplot objects #' @param raster Convert points to raster format, default is \code{NULL} which #' automatically rasterizes if plotting more than 100,000 cells #' @param raster.dpi Pixel resolution for rasterized plots, passed to geom_scattermore(). #' Default is c(512, 512). #' #' @return A \code{\link[patchwork]{patchwork}ed} ggplot object if #' \code{combine = TRUE}; otherwise, a list of ggplot objects #' #' @importFrom rlang !! #' @importFrom ggplot2 facet_wrap vars sym labs #' @importFrom patchwork wrap_plots #' #' @export #' @concept visualization #' #' @note For the old \code{do.hover} and \code{do.identify} functionality, please see #' \code{HoverLocator} and \code{CellSelector}, respectively. #' #' @aliases TSNEPlot PCAPlot ICAPlot #' @seealso \code{\link{FeaturePlot}} \code{\link{HoverLocator}} #' \code{\link{CellSelector}} \code{\link{FetchData}} #' #' @examples #' data("pbmc_small") #' DimPlot(object = pbmc_small) #' DimPlot(object = pbmc_small, split.by = 'letter.idents') #' DimPlot <- function( object, dims = c(1, 2), cells = NULL, cols = NULL, pt.size = NULL, reduction = NULL, group.by = NULL, split.by = NULL, shape.by = NULL, order = NULL, shuffle = FALSE, seed = 1, label = FALSE, label.size = 4, label.color = 'black', label.box = FALSE, repel = FALSE, alpha = 1, stroke.size = NULL, cells.highlight = NULL, cols.highlight = '#DE2D26', sizes.highlight = 1, na.value = 'grey50', ncol = NULL, combine = TRUE, raster = NULL, raster.dpi = c(512, 512) ) { if (!is_integerish(x = dims, n = 2L, finite = TRUE) || !all(dims > 0L)) { abort(message = "'dims' must be a two-length integer vector") } reduction <- reduction %||% DefaultDimReduc(object = object) # cells <- cells %||% colnames(x = object) ##### Cells for all cells in the assay. #### Cells function should not only get default layer cells <- cells %||% Cells( x = object, assay = DefaultAssay(object = object[[reduction]]) ) # data <- Embeddings(object = object[[reduction]])[cells, dims] # data <- as.data.frame(x = data) dims <- paste0(Key(object = object[[reduction]]), dims) orig.groups <- group.by group.by <- group.by %||% 'ident' data <- FetchData( object = object, vars = c(dims, group.by), cells = cells, clean = 'project' ) # cells <- rownames(x = object) # object[['ident']] <- Idents(object = object) # orig.groups <- group.by # group.by <- group.by %||% 'ident' # data <- cbind(data, object[[group.by]][cells, , drop = FALSE]) group.by <- colnames(x = data)[3:ncol(x = data)] for (group in group.by) { if (!is.factor(x = data[, group])) { data[, group] <- factor(x = data[, group]) } } if (!is.null(x = shape.by)) { data[, shape.by] <- object[[shape.by, drop = TRUE]] } if (!is.null(x = split.by)) { split <- FetchData(object = object, vars = split.by, clean=TRUE)[split.by] data <- data[rownames(split),] data[, split.by] <- split } if (isTRUE(x = shuffle)) { set.seed(seed = seed) data <- data[sample(x = 1:nrow(x = data)), ] } plots <- lapply( X = group.by, FUN = function(x) { plot <- SingleDimPlot( data = data[, c(dims, x, split.by, shape.by)], dims = dims, col.by = x, cols = cols, pt.size = pt.size, shape.by = shape.by, order = order, alpha = alpha, stroke.size = stroke.size, label = FALSE, cells.highlight = cells.highlight, cols.highlight = cols.highlight, sizes.highlight = sizes.highlight, na.value = na.value, raster = raster, raster.dpi = raster.dpi ) if (label) { plot <- LabelClusters( plot = plot, id = x, repel = repel, size = label.size, split.by = split.by, box = label.box, color = label.color ) } if (!is.null(x = split.by)) { plot <- plot + FacetTheme() + facet_wrap( facets = vars(!!sym(x = split.by)), ncol = if (length(x = group.by) > 1 || is.null(x = ncol)) { length(x = unique(x = data[, split.by])) } else { ncol } ) } plot <- if (is.null(x = orig.groups)) { plot + labs(title = NULL) } else { plot + CenterTitle() } } ) if (!is.null(x = split.by)) { ncol <- 1 } if (combine) { plots <- wrap_plots(plots, ncol = orig.groups %iff% ncol) } return(plots) } #' Visualize 'features' on a dimensional reduction plot #' #' Colors single cells on a dimensional reduction plot according to a 'feature' #' (i.e. gene expression, PC scores, number of genes detected, etc.) #' #' @inheritParams DimPlot #' @param order Boolean determining whether to plot cells in order of expression. Can be useful if #' cells expressing given feature are getting buried. #' @param features Vector of features to plot. Features can come from: #' \itemize{ #' \item An \code{Assay} feature (e.g. a gene name - "MS4A1") #' \item A column name from meta.data (e.g. mitochondrial percentage - #' "percent.mito") #' \item A column name from a \code{DimReduc} object corresponding to the #' cell embedding values (e.g. the PC 1 scores - "PC_1") #' } #' @param cols The two colors to form the gradient over. Provide as string vector with #' the first color corresponding to low values, the second to high. Also accepts a Brewer #' color scale or vector of colors. Note: this will bin the data into number of colors provided. #' When blend is \code{TRUE}, takes anywhere from 1-3 colors: #' \describe{ #' \item{1 color:}{Treated as color for double-negatives, will use default colors 2 and 3 for per-feature expression} #' \item{2 colors:}{Treated as colors for per-feature expression, will use default color 1 for double-negatives} #' \item{3+ colors:}{First color used for double-negatives, colors 2 and 3 used for per-feature expression, all others ignored} #' } #' @param min.cutoff,max.cutoff Vector of minimum and maximum cutoff values for each feature, #' may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10') #' @param split.by A factor in object metadata to split the plot by, pass 'ident' #' to split by cell identity #' @param keep.scale How to handle the color scale across multiple plots. Options are: #' \itemize{ #' \item \dQuote{feature} (default; by row/feature scaling): The plots for #' each individual feature are scaled to the maximum expression of the #' feature across the conditions provided to \code{split.by} #' \item \dQuote{all} (universal scaling): The plots for all features and #' conditions are scaled to the maximum expression value for the feature #' with the highest overall expression #' \item \code{NULL} (no scaling): Each individual plot is scaled to the #' maximum expression value of the feature in the condition provided to #' \code{split.by}. Be aware setting \code{NULL} will result in color #' scales that are not comparable between plots #' } #' @param slot Which slot to pull expression data from? #' @param blend Scale and blend expression values to visualize coexpression of two features #' @param blend.threshold The color cutoff from weak signal to strong signal; ranges from 0 to 1. #' @param ncol Number of columns to combine multiple feature plots to, ignored if \code{split.by} is not \code{NULL} #' @param coord.fixed Plot cartesian coordinates with fixed aspect ratio #' @param by.col If splitting by a factor, plot the splits per column with the features as rows; ignored if \code{blend = TRUE} #' @param sort.cell Redundant with \code{order}. This argument is being #' deprecated. Please use \code{order} instead. #' @param interactive Launch an interactive \code{\link[Seurat:IFeaturePlot]{FeaturePlot}} #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' ggplot object. If \code{FALSE}, return a list of ggplot objects #' #' @return A \code{\link[patchwork]{patchwork}ed} ggplot object if #' \code{combine = TRUE}; otherwise, a list of ggplot objects #' #' @importFrom grDevices rgb #' @importFrom patchwork wrap_plots #' @importFrom cowplot theme_cowplot #' @importFrom RColorBrewer brewer.pal.info #' @importFrom ggplot2 labs scale_x_continuous scale_y_continuous theme element_rect #' dup_axis guides element_blank element_text margin scale_color_brewer scale_color_gradientn #' scale_color_manual coord_fixed ggtitle #' #' @export #' @concept visualization #' #' @note For the old \code{do.hover} and \code{do.identify} functionality, please see #' \code{HoverLocator} and \code{CellSelector}, respectively. #' #' @aliases FeatureHeatmap #' @seealso \code{\link{DimPlot}} \code{\link{HoverLocator}} #' \code{\link{CellSelector}} #' #' @examples #' data("pbmc_small") #' FeaturePlot(object = pbmc_small, features = 'PC_1') #' FeaturePlot <- function( object, features, dims = c(1, 2), cells = NULL, cols = if (blend) { c('lightgrey', '#ff0000', '#00ff00') } else { c('lightgrey', 'blue') }, pt.size = NULL, alpha = 1, order = FALSE, min.cutoff = NA, max.cutoff = NA, reduction = NULL, split.by = NULL, keep.scale = "feature", shape.by = NULL, slot = 'data', blend = FALSE, blend.threshold = 0.5, label = FALSE, label.size = 4, label.color = "black", repel = FALSE, ncol = NULL, coord.fixed = FALSE, by.col = TRUE, sort.cell = deprecated(), interactive = FALSE, combine = TRUE, raster = NULL, raster.dpi = c(512, 512) ) { # TODO: deprecate fully on 3.2.0 if (is_present(arg = sort.cell)) { deprecate_stop( when = '4.9.0', what = 'FeaturePlot(sort.cell = )', with = 'FeaturePlot(order = )' ) } if (isTRUE(x = interactive)) { return(IFeaturePlot( object = object, feature = features[1], dims = dims, reduction = reduction, slot = slot )) } # Check keep.scale param for valid entries if (!is.null(x = keep.scale)) { keep.scale <- arg_match0(arg = keep.scale, values = c('feature', 'all')) } # Set a theme to remove right-hand Y axis lines # Also sets right-hand Y axis text label formatting no.right <- theme( axis.line.y.right = element_blank(), axis.ticks.y.right = element_blank(), axis.text.y.right = element_blank(), axis.title.y.right = element_text( face = "bold", size = 14, margin = margin(r = 7) ) ) # Get the DimReduc to use reduction <- reduction %||% DefaultDimReduc(object = object) if (!is_integerish(x = dims, n = 2L, finite = TRUE) && !all(dims > 0L)) { abort(message = "'dims' must be a two-length integer vector") } # Figure out blending stuff if (isTRUE(x = blend) && length(x = features) != 2) { abort(message = "Blending feature plots only works with two features") } # Set color scheme for blended FeaturePlots if (isTRUE(x = blend)) { default.colors <- eval(expr = formals(fun = FeaturePlot)$cols) cols <- switch( EXPR = as.character(x = length(x = cols)), '0' = { warn(message = "No colors provided, using default colors") default.colors }, '1' = { warn(message = paste( "Only one color provided, assuming", sQuote(x = cols), "is double-negative and augmenting with default colors" )) c(cols, default.colors[2:3]) }, '2' = { warn(message = paste( "Only two colors provided, assuming specified are for features and agumenting with", sQuote(default.colors[1]), "for double-negatives", )) c(default.colors[1], cols) }, '3' = cols, { warn(message = "More than three colors provided, using only first three") cols[1:3] } ) } if (isTRUE(x = blend) && length(x = cols) != 3) { abort("Blending feature plots only works with three colors; first one for negative cells") } # Name the reductions dims <- paste0(Key(object = object[[reduction]]), dims) cells <- cells %||% Cells(x = object[[reduction]]) # Get plotting data data <- FetchData( object = object, vars = c(dims, 'ident', features), cells = cells, slot = slot ) # Check presence of features/dimensions if (ncol(x = data) < 4) { abort(message = paste( "None of the requested features were found:", paste(features, collapse = ', '), "in slot ", slot )) } else if (!all(dims %in% colnames(x = data))) { abort(message = "The dimensions requested were not found") } features <- setdiff(x = names(x = data), y = c(dims, 'ident')) # Determine cutoffs min.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = min(data[, feature]), no = cutoff )) }, cutoff = min.cutoff, feature = features ) max.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = max(data[, feature]), no = cutoff )) }, cutoff = max.cutoff, feature = features ) check.lengths <- unique(x = vapply( X = list(features, min.cutoff, max.cutoff), FUN = length, FUN.VALUE = numeric(length = 1) )) if (length(x = check.lengths) != 1) { abort( message = "There must be the same number of minimum and maximum cuttoffs as there are features" ) } names(x = min.cutoff) <- names(x = max.cutoff) <- features brewer.gran <- ifelse( test = length(x = cols) == 1, yes = brewer.pal.info[cols, ]$maxcolors, no = length(x = cols) ) # Apply cutoffs for (i in seq_along(along.with = features)) { f <- features[i] data.feature <- data[[f]] min.use <- SetQuantile(cutoff = min.cutoff[f], data = data.feature) max.use <- SetQuantile(cutoff = max.cutoff[f], data = data.feature) data.feature[data.feature < min.use] <- min.use data.feature[data.feature > max.use] <- max.use if (brewer.gran != 2) { data.feature <- if (all(data.feature == 0)) { rep_len(x = 0, length.out = length(x = data.feature)) } else { as.numeric(x = as.factor(x = cut( x = as.numeric(x = data.feature), breaks = 2 ))) } } data[[f]] <- data.feature } # Figure out splits (FeatureHeatmap) data$split <- if (is.null(x = split.by)) { RandomName() } else { switch( EXPR = split.by, ident = Idents(object = object)[cells, drop = TRUE], object[[split.by, drop = TRUE]][cells, drop = TRUE] ) } if (!is.factor(x = data$split)) { data$split <- factor(x = data$split) } # Set shaping variable if (!is.null(x = shape.by)) { data[, shape.by] <- object[[shape.by, drop = TRUE]] } # Make list of plots plots <- vector( mode = "list", length = ifelse( test = blend, yes = 4, no = length(x = features) * length(x = levels(x = data$split)) ) ) # Apply common limits xlims <- c(floor(x = min(data[, dims[1]])), ceiling(x = max(data[, dims[1]]))) ylims <- c(floor(min(data[, dims[2]])), ceiling(x = max(data[, dims[2]]))) # Set blended colors if (blend) { ncol <- 4 color.matrix <- BlendMatrix( two.colors = cols[2:3], col.threshold = blend.threshold, negative.color = cols[1] ) cols <- cols[2:3] colors <- list( color.matrix[, 1], color.matrix[1, ], as.vector(x = color.matrix) ) } # Make the plots for (i in 1:length(x = levels(x = data$split))) { # Figure out which split we're working with ident <- levels(x = data$split)[i] data.plot <- data[as.character(x = data$split) == ident, , drop = FALSE] # Blend expression values if (isTRUE(x = blend)) { features <- features[1:2] no.expression <- features[colMeans(x = data.plot[, features]) == 0] if (length(x = no.expression) != 0) { abort(message = paste( "The following features have no value:", paste(no.expression, collapse = ', ') )) } data.plot <- cbind(data.plot[, c(dims, 'ident')], BlendExpression(data = data.plot[, features[1:2]])) features <- colnames(x = data.plot)[4:ncol(x = data.plot)] } # Make per-feature plots for (j in 1:length(x = features)) { feature <- features[j] # Get blended colors if (isTRUE(x = blend)) { cols.use <- as.numeric(x = as.character(x = data.plot[, feature])) + 1 cols.use <- colors[[j]][sort(x = unique(x = cols.use))] } else { cols.use <- NULL } data.single <- data.plot[, c(dims, 'ident', feature, shape.by)] # Make the plot plot <- SingleDimPlot( data = data.single, dims = dims, col.by = feature, order = order, pt.size = pt.size, alpha = alpha, cols = cols.use, shape.by = shape.by, label = FALSE, raster = raster, raster.dpi = raster.dpi ) + scale_x_continuous(limits = xlims) + scale_y_continuous(limits = ylims) + theme_cowplot() + CenterTitle() # theme(plot.title = element_text(hjust = 0.5)) # Add labels if (isTRUE(x = label)) { plot <- LabelClusters( plot = plot, id = 'ident', repel = repel, size = label.size, color = label.color ) } # Make FeatureHeatmaps look nice(ish) if (length(x = levels(x = data$split)) > 1) { plot <- plot + theme(panel.border = element_rect(fill = NA, colour = 'black')) # Add title plot <- plot + if (i == 1) { labs(title = feature) } else { labs(title = NULL) } # Add second axis if (j == length(x = features) && !blend) { suppressMessages( expr = plot <- plot + scale_y_continuous( sec.axis = dup_axis(name = ident), limits = ylims ) + no.right ) } # Remove left Y axis if (j != 1) { plot <- plot + theme( axis.line.y = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(), axis.title.y.left = element_blank() ) } # Remove bottom X axis if (i != length(x = levels(x = data$split))) { plot <- plot + theme( axis.line.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank(), axis.title.x = element_blank() ) } } else { plot <- plot + labs(title = feature) } # Add colors scale for normal FeaturePlots if (!blend) { plot <- plot + guides(color = NULL) cols.grad <- cols if (length(x = cols) == 1) { plot <- plot + scale_color_brewer(palette = cols) } else if (length(x = cols) > 1) { unique.feature.exp <- unique(data.plot[, feature]) if (length(unique.feature.exp) == 1) { warn(message = paste0( "All cells have the same value (", unique.feature.exp, ") of ", dQuote(x = feature) )) if (unique.feature.exp == 0) { cols.grad <- cols[1] } else{ cols.grad <- cols } } plot <- suppressMessages( expr = plot + scale_color_gradientn( colors = cols.grad, guide = "colorbar" ) ) } } if (!(is.null(x = keep.scale)) && keep.scale == "feature" && !blend) { max.feature.value <- max(data[, feature]) min.feature.value <- min(data[, feature]) plot <- suppressMessages(plot & scale_color_gradientn(colors = cols, limits = c(min.feature.value, max.feature.value))) } # Add coord_fixed if (coord.fixed) { plot <- plot + coord_fixed() } # I'm not sure why, but sometimes the damn thing fails without this # Thanks ggplot2 plot <- plot # Place the plot plots[[(length(x = features) * (i - 1)) + j]] <- plot } } # Add blended color key if (isTRUE(x = blend)) { blend.legend <- BlendMap(color.matrix = color.matrix) for (ii in 1:length(x = levels(x = data$split))) { suppressMessages(expr = plots <- append( x = plots, values = list( blend.legend + scale_y_continuous( sec.axis = dup_axis(name = ifelse( test = length(x = levels(x = data$split)) > 1, yes = levels(x = data$split)[ii], no = '' )), expand = c(0, 0) ) + labs( x = features[1], y = features[2], title = if (ii == 1) { paste('Color threshold:', blend.threshold) } else { NULL } ) + no.right ), after = 4 * ii - 1 )) } } # Remove NULL plots plots <- Filter(f = Negate(f = is.null), x = plots) # Combine the plots if (is.null(x = ncol)) { ncol <- 2 if (length(x = features) == 1) { ncol <- 1 } if (length(x = features) > 6) { ncol <- 3 } if (length(x = features) > 9) { ncol <- 4 } } ncol <- ifelse( test = is.null(x = split.by) || isTRUE(x = blend), yes = ncol, no = length(x = features) ) legend <- if (isTRUE(x = blend)) { 'none' } else { split.by %iff% 'none' } # Transpose the FeatureHeatmap matrix (not applicable for blended FeaturePlots) if (isTRUE(x = combine)) { if (by.col && !is.null(x = split.by) && !blend) { plots <- lapply( X = plots, FUN = function(x) { return(suppressMessages( expr = x + theme_cowplot() + ggtitle("") + scale_y_continuous(sec.axis = dup_axis(name = ""), limits = ylims) + no.right )) } ) nsplits <- length(x = levels(x = data$split)) idx <- 1 for (i in (length(x = features) * (nsplits - 1) + 1):(length(x = features) * nsplits)) { plots[[i]] <- suppressMessages( expr = plots[[i]] + scale_y_continuous( sec.axis = dup_axis(name = features[[idx]]), limits = ylims ) + no.right ) idx <- idx + 1 } idx <- 1 for (i in which(x = 1:length(x = plots) %% length(x = features) == 1)) { plots[[i]] <- plots[[i]] + ggtitle(levels(x = data$split)[[idx]]) + theme(plot.title = element_text(hjust = 0.5)) idx <- idx + 1 } idx <- 1 if (length(x = features) == 1) { for (i in 1:length(x = plots)) { plots[[i]] <- plots[[i]] + ggtitle(levels(x = data$split)[[idx]]) + theme(plot.title = element_text(hjust = 0.5)) idx <- idx + 1 } ncol <- 1 nrow <- nsplits } else { nrow <- split.by %iff% length(x = levels(x = data$split)) } plots <- plots[c(do.call( what = rbind, args = split( x = 1:length(x = plots), f = ceiling(x = seq_along(along.with = 1:length(x = plots)) / length(x = features)) ) ))] # Set ncol to number of splits (nrow) and nrow to number of features (ncol) plots <- wrap_plots(plots, ncol = nrow, nrow = ncol) if (!is.null(x = legend) && legend == 'none') { plots <- plots & NoLegend() } } else { plots <- wrap_plots(plots, ncol = ncol, nrow = split.by %iff% length(x = levels(x = data$split))) } if (!is.null(x = legend) && legend == 'none') { plots <- plots & NoLegend() } if (!(is.null(x = keep.scale)) && keep.scale == "all" && !blend) { max.feature.value <- max(data[, features]) min.feature.value <- min(data[, features]) plots <- suppressMessages(plots & scale_color_gradientn(colors = cols, limits = c(min.feature.value, max.feature.value))) } } return(plots) } #' Visualize features in dimensional reduction space interactively #' #' @inheritParams FeaturePlot #' @param feature Feature to plot #' #' @return Returns the final plot as a ggplot object #' #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 theme element_text guides scale_color_gradientn #' @importFrom miniUI miniPage miniButtonBlock miniTitleBarButton miniContentPanel #' @importFrom shiny fillRow sidebarPanel selectInput plotOutput reactiveValues #' observeEvent stopApp observe updateSelectInput renderPlot runGadget #' #' @export #' @concept visualization #' IFeaturePlot <- function(object, feature, dims = c(1, 2), reduction = NULL, slot = 'data') { # Set initial data values feature.label <- 'Feature to visualize' assay.keys <- Key(object = object)[Assays(object = object)] keyed <- sapply(X = assay.keys, FUN = grepl, x = feature) assay <- if (any(keyed)) { names(x = which(x = keyed))[1] } else { DefaultAssay(object = object) } features <- sort(x = rownames(x = GetAssayData( object = object, slot = slot, assay = assay ))) assays.use <- vapply( X = Assays(object = object), FUN = function(x) { return(!IsMatrixEmpty(x = GetAssayData( object = object, slot = slot, assay = x ))) }, FUN.VALUE = logical(length = 1L) ) assays.use <- sort(x = Assays(object = object)[assays.use]) reduction <- reduction %||% DefaultDimReduc(object = object) dims.reduc <- gsub( pattern = Key(object = object[[reduction]]), replacement = '', x = colnames(x = object[[reduction]]) ) # Set up the gadget UI ui <- miniPage( miniButtonBlock(miniTitleBarButton( inputId = 'done', label = 'Done', primary = TRUE )), miniContentPanel( fillRow( sidebarPanel( selectInput( inputId = 'assay', label = 'Assay', choices = assays.use, selected = assay, selectize = FALSE, width = '100%' ), selectInput( inputId = 'feature', label = feature.label, choices = features, selected = feature, selectize = FALSE, width = '100%' ), selectInput( inputId = 'reduction', label = 'Dimensional reduction', choices = Reductions(object = object), selected = reduction, selectize = FALSE, width = '100%' ), selectInput( inputId = 'xdim', label = 'X dimension', choices = dims.reduc, selected = as.character(x = dims[1]), selectize = FALSE, width = '100%' ), selectInput( inputId = 'ydim', label = 'Y dimension', choices = dims.reduc, selected = as.character(x = dims[2]), selectize = FALSE, width = '100%' ), selectInput( inputId = 'palette', label = 'Color scheme', choices = names(x = FeaturePalettes), selected = 'Seurat', selectize = FALSE, width = '100%' ), width = '100%' ), plotOutput(outputId = 'plot', height = '100%'), flex = c(1, 4) ) ) ) # Prepare plotting data dims <- paste0(Key(object = object[[reduction]]), dims) plot.data <- FetchData(object = object, vars = c(dims, feature), slot = slot) # Shiny server server <- function(input, output, session) { plot.env <- reactiveValues( data = plot.data, dims = paste0(Key(object = object[[reduction]]), dims), feature = feature, palette = 'Seurat' ) # Observe events observeEvent( eventExpr = input$done, handlerExpr = stopApp(returnValue = plot.env$plot) ) observe(x = { assay <- input$assay feature.use <- input$feature features.assay <- sort(x = rownames(x = GetAssayData( object = object, slot = slot, assay = assay ))) feature.use <- ifelse( test = feature.use %in% features.assay, yes = feature.use, no = features.assay[1] ) reduc <- input$reduction dims.reduc <- gsub( pattern = Key(object = object[[reduc]]), replacement = '', x = colnames(x = object[[reduc]]) ) dims <- c(input$xdim, input$ydim) for (i in seq_along(along.with = dims)) { if (!dims[i] %in% dims.reduc) { dims[i] <- dims.reduc[i] } } updateSelectInput( session = session, inputId = 'xdim', label = 'X dimension', choices = dims.reduc, selected = as.character(x = dims[1]) ) updateSelectInput( session = session, inputId = 'ydim', label = 'Y dimension', choices = dims.reduc, selected = as.character(x = dims[2]) ) updateSelectInput( session = session, inputId = 'feature', label = feature.label, choices = features.assay, selected = feature.use ) }) observe(x = { feature.use <- input$feature feature.keyed <- paste0(Key(object = object[[input$assay]]), feature.use) reduc <- input$reduction dims <- c(input$xdim, input$ydim) dims <- paste0(Key(object = object[[reduc]]), dims) plot.data <- tryCatch( expr = FetchData( object = object, vars = c(dims, feature.keyed), slot = slot ), warning = function(...) { return(plot.env$data) }, error = function(...) { return(plot.env$data) } ) dims <- colnames(x = plot.data)[1:2] colnames(x = plot.data) <- c(dims, feature.use) plot.env$data <- plot.data plot.env$feature <- feature.use plot.env$dims <- dims }) observe(x = { plot.env$palette <- input$palette }) # Create the plot output$plot <- renderPlot(expr = { plot.env$plot <- SingleDimPlot( data = plot.env$data, dims = plot.env$dims, col.by = plot.env$feature, label = FALSE ) + theme_cowplot() + theme(plot.title = element_text(hjust = 0.5)) + guides(color = NULL) + scale_color_gradientn( colors = FeaturePalettes[[plot.env$palette]], guide = 'colorbar' ) plot.env$plot }) } runGadget(app = ui, server = server) } #' Highlight Neighbors in DimPlot #' #' It will color the query cells and the neighbors of the query cells in the #' DimPlot #' #' @inheritParams DimPlot #' @param nn.idx the neighbor index of all cells #' @param query.cells cells used to find their neighbors #' @param show.all.cells Show all cells or only query and neighbor cells #' #' @inherit DimPlot return #' #' @export #' @concept visualization #' NNPlot <- function( object, reduction, nn.idx, query.cells, dims = 1:2, label = FALSE, label.size = 4, repel = FALSE, sizes.highlight = 2, pt.size = 1, cols.highlight = c("#377eb8", "#e41a1c"), na.value = "#bdbdbd", order = c("self", "neighbors", "other"), show.all.cells = TRUE, ... ) { if (inherits(x = nn.idx, what = 'Neighbor')) { rownames(x = slot(object = nn.idx, name = 'nn.idx')) <- Cells(x = nn.idx) nn.idx <- Indices(object = nn.idx) } if (length(x = query.cells) > 1) { neighbor.cells <- apply( X = nn.idx[query.cells, -1], MARGIN = 2, FUN = function(x) { return(Cells(x = object)[x]) } ) } else { neighbor.cells <- Cells(x = object)[nn.idx[query.cells , -1]] } neighbor.cells <- as.vector(x = neighbor.cells) neighbor.cells <- neighbor.cells[!is.na(x = neighbor.cells)] object[["nn.col"]] <- "other" object[["nn.col"]][neighbor.cells, ] <- "neighbors" object[["nn.col"]][query.cells, ] <- "self" object$nn.col <- factor( x = object$nn.col, levels = c("self", "neighbors", "other") ) if (!show.all.cells) { object <- subset( x = object, cells = Cells(x = object)[which(x = object[["nn.col"]] != "other")] ) nn.cols <- c(rev(x = cols.highlight)) nn.pt.size <- sizes.highlight } else { highlight.info <- SetHighlight( cells.highlight = c(query.cells, neighbor.cells), cells.all = Cells(x = object), sizes.highlight = sizes.highlight, pt.size = pt.size, cols.highlight = "red" ) nn.cols <- c(na.value, rev(x = cols.highlight)) nn.pt.size <- highlight.info$size } NN.plot <- DimPlot( object = object, reduction = reduction, dims = dims, group.by = "nn.col", cols = nn.cols, label = label, order = order, pt.size = nn.pt.size , label.size = label.size, repel = repel ) return(NN.plot) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Scatter plots #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Cell-cell scatter plot #' #' Creates a plot of scatter plot of features across two single cells. Pearson #' correlation between the two cells is displayed above the plot. #' #' @inheritParams FeatureScatter #' @inheritParams DimPlot #' @param cell1 Cell 1 name #' @param cell2 Cell 2 name #' @param features Features to plot (default, all features) #' @param highlight Features to highlight #' @return A ggplot object #' #' @export #' @concept visualization #' #' @aliases CellPlot #' #' @examples #' data("pbmc_small") #' CellScatter(object = pbmc_small, cell1 = 'ATAGGAGAAACAGA', cell2 = 'CATCAGGATGCACA') #' CellScatter <- function( object, cell1, cell2, features = NULL, highlight = NULL, cols = NULL, pt.size = 1, smooth = FALSE, raster = NULL, raster.dpi = c(512, 512) ) { features <- features %||% rownames(x = object) data <- FetchData( object = object, vars = features, cells = c(cell1, cell2) ) data <- as.data.frame(x = t(x = data)) plot <- SingleCorPlot( data = data, cols = cols, pt.size = pt.size, rows.highlight = highlight, smooth = smooth, raster = raster, raster.dpi = raster.dpi ) return(plot) } #' Scatter plot of single cell data #' #' Creates a scatter plot of two features (typically feature expression), across a #' set of single cells. Cells are colored by their identity class. Pearson #' correlation between the two features is displayed above the plot. #' #' @param object Seurat object #' @param feature1 First feature to plot. Typically feature expression but can also #' be metrics, PC scores, etc. - anything that can be retreived with FetchData #' @param feature2 Second feature to plot. #' @param cells Cells to include on the scatter plot. #' @param shuffle Whether to randomly shuffle the order of points. This can be #' useful for crowded plots if points of interest are being buried. (default is FALSE) #' @param seed Sets the seed if randomly shuffling the order of points. #' @param group.by Name of one or more metadata columns to group (color) cells by #' (for example, orig.ident); pass 'ident' to group by identity class #' @param cols Colors to use for identity class plotting. #' @param pt.size Size of the points on the plot #' @param shape.by Ignored for now #' @param split.by A factor in object metadata to split the feature plot by, pass 'ident' #' to split by cell identity #' @param span Spline span in loess function call, if \code{NULL}, no spline added #' @param smooth Smooth the graph (similar to smoothScatter) #' @param slot Slot to pull data from, should be one of 'counts', 'data', or 'scale.data' #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' @param plot.cor Display correlation in plot title #' @param ncol Number of columns if plotting multiple plots #' @param raster Convert points to raster format, default is \code{NULL} #' which will automatically use raster if the number of points plotted is greater than #' 100,000 #' @param raster.dpi Pixel resolution for rasterized plots, passed to geom_scattermore(). #' Default is c(512, 512). #' @param jitter Jitter for easier visualization of crowded points (default is FALSE) #' @param log Plot features on the log scale (default is FALSE) #' #' @return A ggplot object #' #' @importFrom ggplot2 geom_smooth aes_string facet_wrap vars sym labs #' @importFrom patchwork wrap_plots #' #' @export #' @concept visualization #' #' @aliases GenePlot #' #' @examples #' data("pbmc_small") #' FeatureScatter(object = pbmc_small, feature1 = 'CD9', feature2 = 'CD3E') #' FeatureScatter <- function( object, feature1, feature2, cells = NULL, shuffle = FALSE, seed = 1, group.by = NULL, split.by = NULL, cols = NULL, pt.size = 1, shape.by = NULL, span = NULL, smooth = FALSE, combine = TRUE, slot = 'data', plot.cor = TRUE, ncol = NULL, raster = NULL, raster.dpi = c(512, 512), jitter = FALSE, log = FALSE ) { cells <- cells %||% colnames(x = object) if (isTRUE(x = shuffle)) { set.seed(seed = seed) cells <- sample(x = cells) } group.by <- group.by %||% 'ident' data <- FetchData( object = object, vars = c(feature1, feature2, group.by), cells = cells, slot = slot ) if (!grepl(pattern = feature1, x = names(x = data)[1])) { abort(message = paste("Feature 1", sQuote(x = feature1), "not found")) } if (!grepl(pattern = feature2, x = names(x = data)[2])) { abort(message = paste("Feature 2", sQuote(x = feature2), "not found")) } feature1 <- names(x = data)[1] feature2 <- names(x = data)[2] group.by <- intersect(x = group.by, y = names(x = data)[3:ncol(x = data)]) for (group in group.by) { if (!is.factor(x = data[, group])) { data[, group] <- factor(x = data[, group]) } } if (!is.null(x = split.by)) { split <- FetchData(object = object, vars = split.by, clean=TRUE)[split.by] data <- data[rownames(split),] data[, split.by] <- split } plots <- lapply( X = group.by, FUN = function(x) { plot <- SingleCorPlot( data = data[,c(feature1, feature2, split.by)], col.by = data[, x], cols = cols, pt.size = pt.size, smooth = smooth, legend.title = 'Identity', span = span, plot.cor = plot.cor, raster = raster, raster.dpi = raster.dpi, jitter = jitter ) if (!is.null(x = split.by)) { plot <- plot + FacetTheme() + facet_wrap( facets = vars(!!sym(x = split.by)), ncol = if (length(x = group.by) > 1 || is.null(x = ncol)) { length(x = unique(x = data[, split.by])) } else { ncol } ) } if (log) { plot <- plot + scale_x_log10() + scale_y_log10() } plot } ) if (isTRUE(x = length(x = plots) == 1)) { return(plots[[1]]) } if (isTRUE(x = combine)) { plots <- wrap_plots(plots, ncol = length(x = group.by)) } return(plots) } #' View variable features #' #' @inheritParams FeatureScatter #' @inheritParams SeuratObject::HVFInfo #' @param cols Colors to specify non-variable/variable status #' @param assay Assay to pull variable features from #' @param log Plot the x-axis in log scale #' @param raster Convert points to raster format, default is \code{NULL} #' which will automatically use raster if the number of points plotted is greater than #' 100,000 #' #' @return A ggplot object #' #' @importFrom ggplot2 labs scale_color_manual scale_x_log10 #' @export #' @concept visualization #' #' @aliases VariableGenePlot MeanVarPlot #' #' @seealso \code{\link{FindVariableFeatures}} #' #' @examples #' data("pbmc_small") #' VariableFeaturePlot(object = pbmc_small) #' VariableFeaturePlot <- function( object, cols = c('black', 'red'), pt.size = 1, log = NULL, selection.method = NULL, assay = NULL, raster = NULL, raster.dpi = c(512, 512) ) { if (length(x = cols) != 2) { stop("'cols' must be of length 2") } hvf.info <- HVFInfo( object = object, assay = assay, method = selection.method, status = TRUE ) status.col <- colnames(hvf.info)[grepl("variable", colnames(hvf.info))][[1]] var.status <- c('no', 'yes')[unlist(hvf.info[[status.col]]) + 1] if (colnames(x = hvf.info)[3] == 'dispersion.scaled') { hvf.info <- hvf.info[, c(1, 2)] } else if (colnames(x = hvf.info)[3] == 'variance.expected') { hvf.info <- hvf.info[, c(1, 4)] } else { hvf.info <- hvf.info[, c(1, 3)] } axis.labels <- switch( EXPR = colnames(x = hvf.info)[2], 'variance.standardized' = c('Average Expression', 'Standardized Variance'), 'dispersion' = c('Average Expression', 'Dispersion'), 'residual_variance' = c('Geometric Mean of Expression', 'Residual Variance') ) log <- log %||% (any(c('variance.standardized', 'residual_variance') %in% colnames(x = hvf.info))) # var.features <- VariableFeatures(object = object, assay = assay) # var.status <- ifelse( # test = rownames(x = hvf.info) %in% var.features, # yes = 'yes', # no = 'no' # ) plot <- SingleCorPlot( data = hvf.info, col.by = var.status, pt.size = pt.size, raster = raster, raster.dpi = raster.dpi ) if (length(x = unique(x = var.status)) == 1) { switch( EXPR = var.status[1], 'yes' = { cols <- cols[2] labels.legend <- 'Variable' }, 'no' = { cols <- cols[1] labels.legend <- 'Non-variable' } ) } else { labels.legend <- c('Non-variable', 'Variable') } plot <- plot + labs(title = NULL, x = axis.labels[1], y = axis.labels[2]) + scale_color_manual( labels = paste(labels.legend, 'count:', table(var.status)), values = cols ) if (log) { plot <- plot + scale_x_log10() } return(plot) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Polygon Plots #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Polygon DimPlot #' #' Plot cells as polygons, rather than single points. Color cells by identity, or a categorical variable #' in metadata #' #' @inheritParams PolyFeaturePlot #' @param group.by A grouping variable present in the metadata. Default is to use the groupings present #' in the current cell identities (\code{Idents(object = object)}) #' #' @return Returns a ggplot object #' #' @export #' @concept visualization #' PolyDimPlot <- function( object, group.by = NULL, cells = NULL, poly.data = 'spatial', flip.coords = FALSE ) { polygons <- Misc(object = object, slot = poly.data) if (is.null(x = polygons)) { stop("Could not find polygon data in misc slot") } group.by <- group.by %||% 'ident' group.data <- FetchData( object = object, vars = group.by, cells = cells ) group.data$cell <- rownames(x = group.data) data <- merge(x = polygons, y = group.data, by = 'cell') if (flip.coords) { coord.x <- data$x data$x <- data$y data$y <- coord.x } plot <- SinglePolyPlot(data = data, group.by = group.by) return(plot) } #' Polygon FeaturePlot #' #' Plot cells as polygons, rather than single points. Color cells by any value #' accessible by \code{\link{FetchData}}. #' #' @inheritParams FeaturePlot #' @param poly.data Name of the polygon dataframe in the misc slot #' @param ncol Number of columns to split the plot into #' @param common.scale ... #' @param flip.coords Flip x and y coordinates #' #' @return Returns a ggplot object #' #' @importFrom ggplot2 scale_fill_viridis_c facet_wrap #' #' @export #' @concept visualization #' @concept spatial #' PolyFeaturePlot <- function( object, features, cells = NULL, poly.data = 'spatial', ncol = ceiling(x = length(x = features) / 2), min.cutoff = 0, max.cutoff = NA, common.scale = TRUE, flip.coords = FALSE ) { polygons <- Misc(object = object, slot = poly.data) if (is.null(x = polygons)) { stop("Could not find polygon data in misc slot") } assay.data <- FetchData( object = object, vars = features, cells = cells ) features <- colnames(x = assay.data) cells <- rownames(x = assay.data) min.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = min(assay.data[, feature]), no = cutoff )) }, cutoff = min.cutoff, feature = features ) max.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = max(assay.data[, feature]), no = cutoff )) }, cutoff = max.cutoff, feature = features ) check.lengths <- unique(x = vapply( X = list(features, min.cutoff, max.cutoff), FUN = length, FUN.VALUE = numeric(length = 1) )) if (length(x = check.lengths) != 1) { stop("There must be the same number of minimum and maximum cuttoffs as there are features") } assay.data <- mapply( FUN = function(feature, min, max) { return(ScaleColumn(vec = assay.data[, feature], cutoffs = c(min, max))) }, feature = features, min = min.cutoff, max = max.cutoff ) if (common.scale) { assay.data <- apply( X = assay.data, MARGIN = 2, FUN = function(x) { return(x - min(x)) } ) assay.data <- t( x = t(x = assay.data) / apply(X = assay.data, MARGIN = 2, FUN = max) ) } assay.data <- as.data.frame(x = assay.data) assay.data <- data.frame( cell = as.vector(x = replicate(n = length(x = features), expr = cells)), feature = as.vector(x = t(x = replicate(n = length(x = cells), expr = features))), expression = unlist(x = assay.data, use.names = FALSE) ) data <- merge(x = polygons, y = assay.data, by = 'cell') data$feature <- factor(x = data$feature, levels = features) if (flip.coords) { coord.x <- data$x data$x <- data$y data$y <- coord.x } plot <- SinglePolyPlot(data = data, group.by = 'expression', font_size = 8) + scale_fill_viridis_c() + facet_wrap(facets = 'feature', ncol = ncol) return(plot) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Spatial Plots #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Spatial Cluster Plots #' #' Visualize clusters or other categorical groupings in a spatial context #' #' @inheritParams DimPlot #' @inheritParams SingleImagePlot #' @param object A \code{\link[SeuratObject]{Seurat}} object #' @param fov Name of FOV to plot #' @param boundaries A vector of segmentation boundaries per image to plot; #' can be a character vector, a named character vector, or a named list. #' Names should be the names of FOVs and values should be the names of #' segmentation boundaries #' @param molecules A vector of molecules to plot #' @param nmols Max number of each molecule specified in `molecules` to plot #' @param dark.background Set plot background to black #' @param crop Crop the plots to area with cells only #' @param overlap Overlay boundaries from a single image to create a single #' plot; if \code{TRUE}, then boundaries are stacked in the order they're #' given (first is lowest) #' @param axes Keep axes and panel background #' @param combine Combine plots into a single #' \code{patchwork} ggplot object.If \code{FALSE}, #' return a list of ggplot objects #' @param coord.fixed Plot cartesian coordinates with fixed aspect ratio #' @param flip_xy Flag to flip X and Y axes. Default is FALSE. #' #' @return If \code{combine = TRUE}, a \code{patchwork} #' ggplot object; otherwise, a list of ggplot objects #' #' @importFrom rlang !! is_na sym #' @importFrom patchwork wrap_plots #' @importFrom ggplot2 element_blank facet_wrap vars #' @importFrom SeuratObject DefaultFOV Cells #' DefaultBoundary FetchData Images Overlay #' #' @export #' @concept visualization #' @concept spatial #' ImageDimPlot <- function( object, fov = NULL, boundaries = NULL, group.by = NULL, split.by = NULL, cols = NULL, shuffle.cols = FALSE, size = 0.5, molecules = NULL, mols.size = 0.1, mols.cols = NULL, mols.alpha = 1.0, nmols = 1000, alpha = 1.0, border.color = 'white', border.size = NULL, na.value = 'grey50', dark.background = TRUE, crop = FALSE, cells = NULL, overlap = FALSE, axes = FALSE, combine = TRUE, coord.fixed = TRUE, flip_xy = TRUE ) { cells <- cells %||% Cells(x = object) # Determine FOV to use fov <- fov %||% DefaultFOV(object = object) fov <- Filter( f = function(x) { return( x %in% Images(object = object) && inherits(x = object[[x]], what = 'FOV') ) }, x = fov ) if (!length(x = fov)) { stop("No compatible spatial coordinates present") } # Identify boundaries to use boundaries <- boundaries %||% sapply( X = fov, FUN = function(x) { return(DefaultBoundary(object = object[[x]])) }, simplify = FALSE, USE.NAMES = TRUE ) boundaries <- .BoundariesByImage( object = object, fov = fov, boundaries = boundaries ) fov <- names(x = boundaries) overlap <- rep_len(x = overlap, length.out = length(x = fov)) crop <- rep_len(x = crop, length.out = length(x = fov)) names(x = crop) <- fov # Prepare plotting data group.by <- boundaries %!NA% group.by %||% 'ident' vars <- c(group.by, split.by) md <- if (!is_na(x = vars)) { FetchData( object = object, vars = vars[!is.na(x = vars)], cells = cells ) } else { NULL } pnames <- unlist(x = lapply( X = seq_along(along.with = fov), FUN = function(i) { return(if (isTRUE(x = overlap[i])) { fov[i] } else { paste(fov[i], boundaries[[i]], sep = '_') }) } )) pdata <- vector(mode = 'list', length = length(x = pnames)) names(x = pdata) <- pnames for (i in names(x = pdata)) { ul <- unlist(x = strsplit(x = i, split = '_')) img <- paste(ul[1:length(ul)-1], collapse = '_') # Apply overlap lyr <- ul[length(ul)] if (is.na(x = lyr)) { lyr <- boundaries[[img]] } # TODO: Apply crop pdata[[i]] <- lapply( X = lyr, FUN = function(l) { if (l == 'NA') { return(NA) } df <- fortify(model = object[[img]][[l]]) df <- df[df$cell %in% cells, , drop = FALSE] if (!is.null(x = md)) { df <- merge(x = df, y = md, by.x = 'cell', by.y = 0, all.x = TRUE) } df$cell <- paste(l, df$cell, sep = '_') df$boundary <- l return(df) } ) pdata[[i]] <- if (!is_na(x = pdata[[i]])) { do.call(what = 'rbind', args = pdata[[i]]) } else { unlist(x = pdata[[i]]) } } # Fetch molecule information if (!is.null(x = molecules)) { molecules <- .MolsByFOV( object = object, fov = fov, molecules = molecules ) mdata <- vector(mode = 'list', length = length(x = fov)) names(x = mdata) <- fov for (img in names(x = mdata)) { idata <- object[[img]] if (!img %in% names(x = molecules)) { mdata[[img]] <- NULL next } if (isTRUE(x = crop[img])) { idata <- Overlay(x = idata, y = idata) } imols <- gsub( pattern = paste0('^', Key(object = idata)), replacement = '', x = molecules[[img]] ) mdata[[img]] <- FetchData( object = idata, vars = imols, nmols = nmols ) } } else { mdata <- NULL } # Build the plots plots <- vector( mode = 'list', length = length(x = pdata) * ifelse( test = length(x = group.by), yes = length(x = group.by), no = 1L ) ) idx <- 1L for (group in group.by) { for (i in seq_along(along.with = pdata)) { img <- unlist(x = strsplit(x = names(x = pdata)[i], split = '_'))[1L] p <- SingleImagePlot( data = pdata[[i]], col.by = pdata[[i]] %!NA% group, molecules = mdata[[img]], cols = cols, shuffle.cols = shuffle.cols, size = size, alpha = alpha, mols.size = mols.size, mols.cols = mols.cols, mols.alpha = mols.alpha, border.color = border.color, border.size = border.size, na.value = na.value, dark.background = dark.background ) if (!is.null(x = split.by)) { p <- p + facet_wrap( facets = vars(!!sym(x = split.by)) ) } if (!isTRUE(x = axes)) { p <- p + NoAxes(panel.background = element_blank()) } if (!anyDuplicated(x = pdata[[i]]$cell)) { p <- p + guides(fill = guide_legend(override.aes = list(size=4L, alpha=1))) } if (isTRUE(coord.fixed)) { p <- p + coord_fixed() } if(!isTRUE(flip_xy) && isTRUE(coord.fixed)){ xy_ratio = (max(pdata[[i]]$x) - min(pdata[[i]]$x)) / (max(pdata[[i]]$y) - min(pdata[[i]]$y)) p = p + coord_flip() + theme(aspect.ratio = 1/xy_ratio) } plots[[idx]] <- p idx <- idx + 1L } } if (isTRUE(x = combine)) { plots <- wrap_plots(plots) } return(plots) } #' Spatial Feature Plots #' #' Visualize expression in a spatial context #' #' @inheritParams FeaturePlot #' @inheritParams ImageDimPlot #' @param scale Set color scaling across multiple plots; choose from: #' \itemize{ #' \item \dQuote{\code{feature}}: Plots per-feature are scaled across splits #' \item \dQuote{\code{all}}: Plots per-feature are scaled across all features #' \item \dQuote{\code{none}}: Plots are not scaled; \strong{note}: setting #' \code{scale} to \dQuote{\code{none}} will result in color scales that are #' \emph{not} comparable between plots #' } #' Ignored if \code{blend = TRUE} #' #' @inherit ImageDimPlot return #' #' @importFrom patchwork wrap_plots #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 dup_axis element_blank element_text facet_wrap guides #' labs margin vars scale_y_continuous theme #' @importFrom SeuratObject DefaultFOV Cells DefaultBoundary #' FetchData Images Overlay #' #' @export #' @concept visualization #' @concept spatial #' ImageFeaturePlot <- function( object, features, fov = NULL, boundaries = NULL, cols = if (isTRUE(x = blend)) { c("lightgrey", "#ff0000", "#00ff00") } else { c("lightgrey", "firebrick1") }, size = 0.5, min.cutoff = NA, max.cutoff = NA, split.by = NULL, molecules = NULL, mols.size = 0.1, mols.cols = NULL, nmols = 1000, alpha = 1.0, border.color = 'white', border.size = NULL, dark.background = TRUE, blend = FALSE, blend.threshold = 0.5, crop = FALSE, cells = NULL, scale = c('feature', 'all', 'none'), overlap = FALSE, axes = FALSE, combine = TRUE, coord.fixed = TRUE ) { cells <- cells %||% Cells(x = object) scale <- scale[[1L]] scale <- match.arg(arg = scale) # Set a theme to remove right-hand Y axis lines # Also sets right-hand Y axis text label formatting no.right <- theme( axis.line.y.right = element_blank(), axis.ticks.y.right = element_blank(), axis.text.y.right = element_blank(), axis.title.y.right = element_text( face = "bold", size = 14, margin = margin(r = 7) ) ) # Determine fov to use fov <- fov %||% DefaultFOV(object = object) fov <- Filter( f = function(x) { return( x %in% Images(object = object) && inherits(x = object[[x]], what = 'FOV') ) }, x = fov ) if (!length(x = fov)) { stop("No compatible spatial coordinates present") } # Identify boundaries to use boundaries <- boundaries %||% sapply( X = fov, FUN = function(x) { return(DefaultBoundary(object = object[[x]])) }, simplify = FALSE, USE.NAMES = TRUE ) boundaries <- .BoundariesByImage( object = object, fov = fov, boundaries = boundaries ) fov <- names(x = boundaries) # Check overlaps/crops if (isTRUE(x = blend) || !is.null(x = split.by)) { type <- ifelse(test = isTRUE(x = 'blend'), yes = 'Blended', no = 'Split') if (length(x = fov) != 1L) { fov <- fov[1L] warning( type, ' image feature plots can only be done on a single image, using "', fov, '"', call. = FALSE, immediate. = TRUE ) } if (any(!overlap) && length(x = boundaries[[fov]]) > 1L) { warning( type, " image feature plots require overlapped segmentations", call. = FALSE, immediate. = TRUE ) } overlap <- TRUE } overlap <- rep_len(x = overlap, length.out = length(x = fov)) crop <- rep_len(x = crop, length.out = length(x = fov)) names(x = crop) <- names(x = overlap) <- fov # Checks for blending if (isTRUE(x = blend)) { if (length(x = features) != 2L) { stop("Blended feature plots only works with two features") } default.colors <- eval(expr = formals(fun = ImageFeaturePlot)$cols) cols <- switch( EXPR = as.character(x = length(x = cols)), '0' = { warning("No colors provided, using default colors", immediate. = TRUE) default.colors }, '1' = { warning( "Only one color provided, assuming specified is double-negative and augmenting with default colors", immediate. = TRUE ) c(cols, default.colors[2:3]) }, '2' = { warning( "Only two colors provided, assuming specified are for features and augmenting with '", default.colors[1], "' for double-negatives", immediate. = TRUE ) c(default.colors[1], cols) }, '3' = cols, { warning( "More than three colors provided, using only first three", immediate. = TRUE ) cols[1:3] } ) } # Get feature, splitting data md <- FetchData( object = object, vars = c(features, split.by[1L]), cells = cells ) split.by <- intersect(x = split.by, y = colnames(x = md)) if (!length(x = split.by)) { split.by <- NULL } imax <- ifelse( test = is.null(x = split.by), yes = ncol(x = md), no = ncol(x = md) - length(x = split.by) ) features <- colnames(x = md)[1:imax] # Determine cutoffs min.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = min(md[[feature]]), no = cutoff )) }, cutoff = min.cutoff, feature = features ) max.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = max(md[[feature]]), no = cutoff )) }, cutoff = max.cutoff, feature = features ) check.lengths <- unique(x = vapply( X = list(features, min.cutoff, max.cutoff), FUN = length, FUN.VALUE = numeric(length = 1) )) if (length(x = check.lengths) != 1) { stop("There must be the same number of minimum and maximum cuttoffs as there are features") } brewer.gran <- ifelse( test = length(x = cols) == 1, yes = brewer.pal.info[cols, ]$maxcolors, no = length(x = cols) ) # Apply cutoffs for (i in seq_along(along.with = features)) { f <- features[[i]] data.feature <- md[[f]] min.use <- SetQuantile(cutoff = min.cutoff[i], data = data.feature) max.use <- SetQuantile(cutoff = max.cutoff[i], data = data.feature) data.feature[data.feature < min.use] <- min.use data.feature[data.feature > max.use] <- max.use if (brewer.gran != 2) { data.feature <- if (all(data.feature == 0)) { rep_len(x = 0, length.out = length(x = data.feature)) } else { as.numeric(x = as.factor(x = cut( x = as.numeric(x = data.feature), breaks = brewer.gran ))) } } md[[f]] <- data.feature } # Figure out splits if (is.null(x = split.by)) { split.by <- RandomName() md[[split.by]] <- factor(x = split.by) } if (!is.factor(x = md[[split.by]])) { md[[split.by]] <- factor(x = md[[split.by]]) } # Apply blends if (isTRUE(x = blend)) { md <- lapply( X = levels(x = md[[split.by]]), FUN = function(x) { df <- md[as.character(x = md[[split.by]]) == x, , drop = FALSE] no.expression <- features[colMeans(x = df[, features]) == 0] if (length(x = no.expression)) { stop( "The following features have no value: ", paste(no.expression, collapse = ', ') ) } return(cbind( df[, split.by, drop = FALSE], BlendExpression(data = df[, features]) )) } ) md <- do.call(what = 'rbind', args = md) features <- setdiff(x = colnames(x = md), y = split.by) } # Prepare plotting data pnames <- unlist(x = lapply( X = seq_along(along.with = fov), FUN = function(i) { return(if (isTRUE(x = overlap[i])) { fov[i] } else { paste(fov[i], boundaries[[i]], sep = '_') }) } )) pdata <- vector(mode = 'list', length = length(x = pnames)) names(x = pdata) <- pnames for (i in names(x = pdata)) { ul <- unlist(x = strsplit(x = i, split = '_')) # img <- paste(ul[1:length(ul)-1], collapse = '_') # Apply overlap # lyr <- ul[length(ul)] if(length(ul) > 1) { img <- paste(ul[1:length(ul)-1], collapse = '_') lyr <- ul[length(ul)] } else if (length(ul) == 1) { img <- ul[1] lyr <- "centroids" } else { stop("the length of ul is 0. please check.") } if (is.na(x = lyr)) { lyr <- boundaries[[img]] } pdata[[i]] <- lapply( X = lyr, FUN = function(l) { df <- fortify(model = object[[img]][[l]]) df <- df[df$cell %in% cells, , drop = FALSE] if (!is.null(x = md)) { df <- merge(x = df, y = md, by.x = 'cell', by.y = 0, all.x = TRUE) } df$cell <- paste(l, df$cell, sep = '_') df$boundary <- l return(df) } ) pdata[[i]] <- if (!is_na(x = pdata[[i]])) { do.call(what = 'rbind', args = pdata[[i]]) } else { unlist(x = pdata[[i]]) } } # Fetch molecule information if (!is.null(x = molecules)) { molecules <- .MolsByFOV( object = object, fov = fov, molecules = molecules ) mdata <- vector(mode = 'list', length = length(x = fov)) names(x = mdata) <- fov for (img in names(x = mdata)) { idata <- object[[img]] if (!img %in% names(x = molecules)) { mdata[[img]] <- NULL next } if (isTRUE(x = crop[img])) { idata <- Overlay(x = idata, y = idata) } imols <- gsub( pattern = paste0('^', Key(object = idata)), replacement = '', x = molecules[[img]] ) mdata[[img]] <- FetchData( object = idata, vars = imols, nmols = nmols ) } } else { mdata <- NULL } # Set blended colors if (isTRUE(x = blend)) { ncol <- 4 color.matrix <- BlendMatrix( two.colors = cols[2:3], col.threshold = blend.threshold, negative.color = cols[1] ) cols <- cols[2:3] colors <- list( color.matrix[, 1], color.matrix[1, ], as.vector(x = color.matrix) ) blend.legend <- BlendMap(color.matrix = color.matrix) } limits <- switch( EXPR = scale, 'all' = range(unlist(x = md[, features])), NULL ) # Build the plots plots <- vector( mode = 'list', length = length(x = levels(x = md[[split.by]])) ) names(x = plots) <- levels(x = md[[split.by]]) for (i in seq_along(along.with = levels(x = md[[split.by]]))) { ident <- levels(x = md[[split.by]])[i] plots[[ident]] <- vector(mode = 'list', length = length(x = pdata)) names(x = plots[[ident]]) <- names(x = pdata) if (isTRUE(x = blend)) { blend.key <- suppressMessages( expr = blend.legend + scale_y_continuous( sec.axis = dup_axis(name = ifelse( test = length(x = levels(x = md[[split.by]])) > 1, yes = ident, no = '' )), expand = c(0, 0) ) + labs( x = features[1L], y = features[2L], title = if (i == 1L) { paste('Color threshold:', blend.threshold) } else { NULL } ) + no.right ) } for (j in seq_along(along.with = pdata)) { key <- names(x = pdata)[j] img <- unlist(x = strsplit(x = key, split = '_'))[1L] plots[[ident]][[key]] <- vector( mode = 'list', length = length(x = features) + ifelse( test = isTRUE(x = blend), yes = 1L, no = 0L ) ) data.plot <- pdata[[j]][as.character(x = pdata[[j]][[split.by]]) == ident, , drop = FALSE] for (y in seq_along(along.with = features)) { feature <- features[y] # Get blended colors cols.use <- if (isTRUE(x = blend)) { cc <- as.numeric(x = as.character(x = data.plot[, feature])) + 1 colors[[y]][sort(unique(x = cc))] } else { NULL } colnames(data.plot) <- gsub("-", "_", colnames(data.plot)) p <- SingleImagePlot( data = data.plot, col.by = gsub("-", "_", feature), size = size, col.factor = blend, cols = cols.use, molecules = mdata[[img]], mols.size = mols.size, mols.cols = mols.cols, alpha = alpha, border.color = border.color, border.size = border.size, dark.background = dark.background ) + CenterTitle() + labs(fill=feature) # Remove fill guides for blended plots if (isTRUE(x = blend)) { p <- p + guides(fill = 'none') } if (isTRUE(coord.fixed)) { p <- p + coord_fixed() } # Remove axes if (!isTRUE(x = axes)) { p <- p + NoAxes(panel.background = element_blank()) } else if (isTRUE(x = blend) || length(x = levels(x = md[[split.by]])) > 1L) { if (y != 1L) { p <- p + theme( axis.line.y = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(), axis.title.y.left = element_blank() ) } if (i != length(x = levels(x = md[[split.by]]))) { p <- p + theme( axis.line.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank(), axis.title.x = element_blank() ) } } # Add colors for unblended plots if (!isTRUE(x = blend)) { if (length(x = cols) == 1L) { p <- p + scale_fill_brewer(palette = cols) } else { cols.grad <- cols fexp <- data.plot[data.plot[[split.by]] == ident, feature, drop = TRUE] fexp <- unique(x = fexp) if (length(x = fexp) == 1L) { warning( "All cells have the same value (", fexp, ") of ", feature, call. = FALSE, immediate. = TRUE ) if (fexp == 0) { cols.grad <- cols.grad[1L] } } # Check if we're scaling the colorbar across splits if (scale == 'feature') { limits <- range(pdata[[j]][[feature]]) } p <- p + ggplot2::scale_fill_gradientn( colors = cols.grad, guide = 'colorbar', limits = limits ) } } # Add some labels p <- p + if (i == 1L) { ggplot2::labs(title = feature) } else { ggplot2::labs(title = NULL) } plots[[ident]][[key]][[y]] <- p } if (isTRUE(x = blend)) { plots[[ident]][[key]][[length(x = plots[[ident]][[key]])]] <- blend.key } else if (length(x = levels(x = md[[split.by]])) > 1L) { plots[[ident]][[key]][[y]] <- suppressMessages( expr = plots[[ident]][[key]][[y]] + scale_y_continuous(sec.axis = dup_axis(name = ident)) + no.right ) } } plots[[ident]] <- unlist( x = plots[[ident]], recursive = FALSE, use.names = FALSE ) } plots <- unlist(x = plots, recursive = FALSE, use.names = FALSE) if (isTRUE(x = combine)) { if (isTRUE(x = blend) || length(x = levels(x = md[[split.by]])) > 1L) { plots <- wrap_plots( plots, ncol = ifelse( test = isTRUE(x = blend), yes = 4L, no = length(x = features) ), nrow = length(x = levels(x = md[[split.by]])), guides = 'collect' ) } else { plots <- wrap_plots(plots) } } return(plots) } #' Visualize spatial and clustering (dimensional reduction) data in a linked, #' interactive framework #' #' @inheritParams SpatialPlot #' @inheritParams FeaturePlot #' @inheritParams DimPlot #' @param feature Feature to visualize #' @param image Name of the image to use in the plot #' #' @return Returns final plots. If \code{combine}, plots are stiched together #' using \code{\link{CombinePlots}}; otherwise, returns a list of ggplot objects #' #' @rdname LinkedPlots #' @name LinkedPlots #' #' @importFrom scales hue_pal #' @importFrom patchwork wrap_plots #' @importFrom ggplot2 scale_alpha_ordinal guides #' @importFrom miniUI miniPage gadgetTitleBar miniTitleBarButton miniContentPanel #' @importFrom shiny fillRow plotOutput brushOpts clickOpts hoverOpts #' verbatimTextOutput reactiveValues observeEvent stopApp nearPoints #' brushedPoints renderPlot renderPrint runGadget #' #' @aliases LinkedPlot LinkedDimPlot #' #' @export #' @concept visualization #' @concept spatial #' #' @examples #' \dontrun{ #' LinkedDimPlot(seurat.object) #' LinkedFeaturePlot(seurat.object, feature = 'Hpca') #' } #' LinkedDimPlot <- function( object, dims = 1:2, reduction = NULL, image = NULL, image.scale = "lowres", group.by = NULL, alpha = c(0.1, 1), combine = TRUE ) { # Setup gadget UI ui <- miniPage( gadgetTitleBar( title = 'LinkedDimPlot', left = miniTitleBarButton(inputId = 'reset', label = 'Reset') ), miniContentPanel( fillRow( plotOutput( outputId = 'spatialplot', height = '100%', # brush = brushOpts(id = 'brush', delay = 10, clip = TRUE, resetOnNew = FALSE), click = clickOpts(id = 'spclick', clip = TRUE), hover = hoverOpts(id = 'sphover', delay = 10, nullOutside = TRUE) ), plotOutput( outputId = 'dimplot', height = '100%', brush = brushOpts(id = 'brush', delay = 10, clip = TRUE, resetOnNew = FALSE), click = clickOpts(id = 'dimclick', clip = TRUE), hover = hoverOpts(id = 'dimhover', delay = 10, nullOutside = TRUE) ), height = '97%' ), verbatimTextOutput(outputId = 'info') ) ) # Prepare plotting data image <- image %||% DefaultImage(object = object) cells.use <- Cells(x = object[[image]]) reduction <- reduction %||% DefaultDimReduc(object = object) dims <- dims[1:2] dims <- paste0(Key(object = object[[reduction]]), dims) group.by <- group.by %||% 'ident' group.data <- FetchData( object = object, vars = group.by, cells = cells.use ) coords <- GetTissueCoordinates(object = object[[image]], scale = image.scale) embeddings <- Embeddings(object = object[[reduction]])[cells.use, dims] plot.data <- cbind(coords, group.data, embeddings) plot.data$selected_ <- FALSE Idents(object = object) <- group.by # Setup the server server <- function(input, output, session) { click <- reactiveValues(pt = NULL, invert = FALSE) plot.env <- reactiveValues(data = plot.data, alpha.by = NULL) # Handle events observeEvent( eventExpr = input$done, handlerExpr = { plots <- list(plot.env$spatialplot, plot.env$dimplot) if (combine) { plots <- wrap_plots(plots, ncol = 2) } stopApp(returnValue = plots) } ) observeEvent( eventExpr = input$reset, handlerExpr = { click$pt <- NULL click$invert <- FALSE session$resetBrush(brushId = 'brush') } ) observeEvent(eventExpr = input$brush, handlerExpr = click$pt <- NULL) observeEvent( eventExpr = input$spclick, handlerExpr = { click$pt <- input$spclick click$invert <- TRUE } ) observeEvent( eventExpr = input$dimclick, handlerExpr = { click$pt <- input$dimclick click$invert <- FALSE } ) observeEvent( eventExpr = c(input$brush, input$spclick, input$dimclick), handlerExpr = { plot.env$data <- if (is.null(x = input$brush)) { clicked <- nearPoints( df = plot.data, coordinfo = if (click$invert) { InvertCoordinate(x = click$pt) } else { click$pt }, threshold = 10, maxpoints = 1 ) if (nrow(x = clicked) == 1) { cell.clicked <- rownames(x = clicked) group.clicked <- plot.data[cell.clicked, group.by, drop = TRUE] idx.group <- which(x = plot.data[[group.by]] == group.clicked) plot.data[idx.group, 'selected_'] <- TRUE plot.data } else { plot.data } } else if (input$brush$outputId == 'dimplot') { brushedPoints(df = plot.data, brush = input$brush, allRows = TRUE) } else if (input$brush$outputId == 'spatialplot') { brushedPoints(df = plot.data, brush = InvertCoordinate(x = input$brush), allRows = TRUE) } plot.env$alpha.by <- if (any(plot.env$data$selected_)) { 'selected_' } else { NULL } } ) # Set plots output$spatialplot <- renderPlot( expr = { plot.env$spatialplot <- SingleSpatialPlot( data = plot.env$data, image = object[[image]], col.by = group.by, pt.size.factor = 1.6, crop = TRUE, alpha.by = plot.env$alpha.by ) + scale_alpha_ordinal(range = alpha) + NoLegend() plot.env$spatialplot } ) output$dimplot <- renderPlot( expr = { plot.env$dimplot <- SingleDimPlot( data = plot.env$data, dims = dims, col.by = group.by, alpha.by = plot.env$alpha.by ) + scale_alpha_ordinal(range = alpha) + guides(alpha = "none") plot.env$dimplot } ) # Add hover text output$info <- renderPrint( expr = { cell.hover <- rownames(x = nearPoints( df = plot.data, coordinfo = if (is.null(x = input[['sphover']])) { input$dimhover } else { InvertCoordinate(x = input$sphover) }, threshold = 10, maxpoints = 1 )) # if (length(x = cell.hover) == 1) { # palette <- hue_pal()(n = length(x = levels(x = object))) # group <- plot.data[cell.hover, group.by, drop = TRUE] # background <- palette[which(x = levels(x = object) == group)] # text <- unname(obj = BGTextColor(background = background)) # style <- paste0( # paste( # paste('background-color:', background), # paste('color:', text), # sep = '; ' # ), # ';' # ) # info <- paste(cell.hover, paste('Group:', group), sep = '
') # } else { # style <- 'background-color: white; color: black' # info <- NULL # } # HTML(text = paste0("
", info, "
")) # p(HTML(info), style = style) # paste0('
', info, '
') # TODO: Get newlines, extra information, and background color working if (length(x = cell.hover) == 1) { paste(cell.hover, paste('Group:', plot.data[cell.hover, group.by, drop = TRUE]), collapse = '
') } else { NULL } } ) } # Run the thang runGadget(app = ui, server = server) } #' @rdname LinkedPlots #' #' @aliases LinkedFeaturePlot #' #' @importFrom ggplot2 scale_fill_gradientn theme scale_alpha guides #' scale_color_gradientn guide_colorbar #' #' @export #' @concept visualization #' @concept spatial LinkedFeaturePlot <- function( object, feature, dims = 1:2, reduction = NULL, image = NULL, image.scale = "lowres", slot = 'data', alpha = c(0.1, 1), combine = TRUE ) { # Setup gadget UI ui <- miniPage( gadgetTitleBar( title = 'LinkedFeaturePlot', left = NULL ), miniContentPanel( fillRow( plotOutput( outputId = 'spatialplot', height = '100%', hover = hoverOpts(id = 'sphover', delay = 10, nullOutside = TRUE) ), plotOutput( outputId = 'dimplot', height = '100%', hover = hoverOpts(id = 'dimhover', delay = 10, nullOutside = TRUE) ), height = '97%' ), verbatimTextOutput(outputId = 'info') ) ) # Prepare plotting data cols <- SpatialColors(n = 100) image <- image %||% DefaultImage(object = object) cells.use <- Cells(x = object[[image]]) reduction <- reduction %||% DefaultDimReduc(object = object) dims <- dims[1:2] dims <- paste0(Key(object = object[[reduction]]), dims) group.data <- FetchData( object = object, vars = feature, cells = cells.use ) coords <- GetTissueCoordinates(object = object[[image]], scale = image.scale) embeddings <- Embeddings(object = object[[reduction]])[cells.use, dims] plot.data <- cbind(coords, group.data, embeddings) # Setup the server server <- function(input, output, session) { plot.env <- reactiveValues() # Handle events observeEvent( eventExpr = input$done, handlerExpr = { plots <- list(plot.env$spatialplot, plot.env$dimplot) if (combine) { plots <- wrap_plots(plots, ncol = 2) } stopApp(returnValue = plots) } ) # Set plots output$spatialplot <- renderPlot( expr = { plot.env$spatialplot <- SingleSpatialPlot( data = plot.data, image = object[[image]], col.by = feature, pt.size.factor = 1.6, crop = TRUE, alpha.by = feature ) + scale_fill_gradientn(name = feature, colours = cols) + theme(legend.position = 'top') + scale_alpha(range = alpha) + guides(alpha = "none") plot.env$spatialplot } ) output$dimplot <- renderPlot( expr = { plot.env$dimplot <- SingleDimPlot( data = plot.data, dims = dims, col.by = feature ) + scale_color_gradientn(name = feature, colours = cols, guide = 'colorbar') + guides(color = guide_colorbar()) plot.env$dimplot } ) # Add hover text output$info <- renderPrint( expr = { cell.hover <- rownames(x = nearPoints( df = plot.data, coordinfo = if (is.null(x = input[['sphover']])) { input$dimhover } else { InvertCoordinate(x = input$sphover) }, threshold = 10, maxpoints = 1 )) # TODO: Get newlines, extra information, and background color working if (length(x = cell.hover) == 1) { paste(cell.hover, paste('Expression:', plot.data[cell.hover, feature, drop = TRUE]), collapse = '
') } else { NULL } } ) } runGadget(app = ui, server = server) } #' Visualize clusters spatially and interactively #' #' @inheritParams SpatialPlot #' @inheritParams DimPlot #' @inheritParams LinkedPlots #' #' @return Returns final plot as a ggplot object #' #' @importFrom ggplot2 scale_alpha_ordinal #' @importFrom miniUI miniPage miniButtonBlock miniTitleBarButton miniContentPanel #' @importFrom shiny fillRow plotOutput verbatimTextOutput reactiveValues #' observeEvent stopApp nearPoints renderPlot runGadget #' #' @export #' @concept visualization #' @concept spatial #' ISpatialDimPlot <- function( object, image = NULL, image.scale = "lowres", group.by = NULL, alpha = c(0.3, 1) ) { # Setup gadget UI ui <- miniPage( miniButtonBlock(miniTitleBarButton( inputId = 'done', label = 'Done', primary = TRUE )), miniContentPanel( fillRow( plotOutput( outputId = 'plot', height = '100%', click = clickOpts(id = 'click', clip = TRUE), hover = hoverOpts(id = 'hover', delay = 10, nullOutside = TRUE) ), height = '97%' ), verbatimTextOutput(outputId = 'info') ) ) # Get plotting data # Prepare plotting data image <- image %||% DefaultImage(object = object) cells.use <- Cells(x = object[[image]]) group.by <- group.by %||% 'ident' group.data <- FetchData( object = object, vars = group.by, cells = cells.use ) coords <- GetTissueCoordinates(object = object[[image]], scale = image.scale) scale.factor <- ScaleFactors(object[[image]])[[image.scale]] plot.data <- cbind(coords, group.data) plot.data$selected_ <- FALSE Idents(object = object) <- group.by # Set up the server server <- function(input, output, session) { click <- reactiveValues(pt = NULL) plot.env <- reactiveValues(data = plot.data, alpha.by = NULL) # Handle events observeEvent( eventExpr = input$done, handlerExpr = stopApp(returnValue = plot.env$plot) ) observeEvent( eventExpr = input$click, handlerExpr = { clicked <- nearPoints( df = plot.data, coordinfo = InvertCoordinate(x = input$click), threshold = 10, maxpoints = 1 ) plot.env$data <- if (nrow(x = clicked) == 1) { cell.clicked <- rownames(x = clicked) cell.clicked <- rownames(x = clicked) group.clicked <- plot.data[cell.clicked, group.by, drop = TRUE] idx.group <- which(x = plot.data[[group.by]] == group.clicked) plot.data[idx.group, 'selected_'] <- TRUE plot.data } else { plot.data } plot.env$alpha.by <- if (any(plot.env$data$selected_)) { 'selected_' } else { NULL } } ) # Set plot output$plot <- renderPlot( expr = { plot.env$plot <- SingleSpatialPlot( data = plot.env$data, image = object[[image]], col.by = group.by, crop = TRUE, alpha.by = plot.env$alpha.by, pt.size.factor = 1.6 ) + scale_alpha_ordinal(range = alpha) + NoLegend() plot.env$plot } ) # Add hover text output$info <- renderPrint( expr = { hovered <- nearPoints( df = plot.data, coordinfo = InvertCoordinate(x = input$hover), threshold = 10, maxpoints = 1 ) if (nrow(hovered) == 1) { cell.hover <- rownames(hovered) # SingleSpatialPlot relies on the spatial coordinates appearing # in the first two columns of the returned data.frame - it's kinda # fragile but we're obligated to use the same behaviour here coords.hover <- hovered[1, colnames(coords)[1:2]] / scale.factor group.hover <- hovered[1, group.by] sprintf( "Cell: %s, Group: %s, Coordinates: (%.2f, %.2f)", cell.hover, group.hover, coords.hover[[1]], coords.hover[[2]] ) } else { NULL } } ) } runGadget(app = ui, server = server) } #' Visualize features spatially and interactively #' #' @inheritParams SpatialPlot #' @inheritParams FeaturePlot #' @inheritParams LinkedPlots #' #' @return Returns final plot as a ggplot object #' #' @importFrom ggplot2 scale_fill_gradientn theme scale_alpha guides #' @importFrom miniUI miniPage miniButtonBlock miniTitleBarButton miniContentPanel #' @importFrom shiny fillRow sidebarPanel sliderInput selectInput reactiveValues #' observeEvent stopApp observe updateSelectInput plotOutput renderPlot runGadget #' #' @export #' @concept visualization #' @concept spatial ISpatialFeaturePlot <- function( object, feature, image = NULL, image.scale = "lowres", slot = 'data', alpha = c(0.1, 1) ) { # Set inital data values assay.keys <- Key(object = object)[Assays(object = object)] keyed <- sapply(X = assay.keys, FUN = grepl, x = feature) assay <- if (any(keyed)) { names(x = which(x = keyed))[1] } else { DefaultAssay(object = object) } features <- sort(x = rownames(x = GetAssayData( object = object, slot = slot, assay = assay ))) feature.label <- 'Feature to visualize' assays.use <- vapply( X = Assays(object = object), FUN = function(x) { return(!IsMatrixEmpty(x = GetAssayData( object = object, slot = slot, assay = x ))) }, FUN.VALUE = logical(length = 1L) ) assays.use <- sort(x = Assays(object = object)[assays.use]) # Setup gadget UI ui <- miniPage( miniButtonBlock(miniTitleBarButton( inputId = 'done', label = 'Done', primary = TRUE )), miniContentPanel( fillRow( sidebarPanel( sliderInput( inputId = 'alpha', label = 'Alpha intensity', min = 0, max = max(alpha), value = min(alpha), step = 0.01, width = '100%' ), sliderInput( inputId = 'pt.size', label = 'Point size', min = 0, max = 5, value = 1.6, step = 0.1, width = '100%' ), selectInput( inputId = 'assay', label = 'Assay', choices = assays.use, selected = assay, selectize = FALSE, width = '100%' ), selectInput( inputId = 'feature', label = feature.label, choices = features, selected = feature, selectize = FALSE, width = '100%' ), selectInput( inputId = 'palette', label = 'Color scheme', choices = names(x = FeaturePalettes), selected = 'Spatial', selectize = FALSE, width = '100%' ), width = '100%' ), plotOutput(outputId = 'plot', height = '100%'), flex = c(1, 4) ) ) ) # Prepare plotting data image <- image %||% DefaultImage(object = object) cells.use <- Cells(x = object[[image]]) coords <- GetTissueCoordinates(object = object[[image]], scale = image.scale) feature.data <- FetchData( object = object, vars = feature, cells = cells.use, slot = slot ) plot.data <- cbind(coords, feature.data) server <- function(input, output, session) { plot.env <- reactiveValues( data = plot.data, feature = feature, palette = 'Spatial' ) # Observe events observeEvent( eventExpr = input$done, handlerExpr = stopApp(returnValue = plot.env$plot) ) observe(x = { assay <- input$assay feature.use <- input$feature features.assay <- sort(x = rownames(x = GetAssayData( object = object, slot = slot, assay = assay ))) feature.use <- ifelse( test = feature.use %in% features.assay, yes = feature.use, no = features.assay[1] ) updateSelectInput( session = session, inputId = 'assay', label = 'Assay', choices = assays.use, selected = assay ) updateSelectInput( session = session, inputId = 'feature', label = feature.label, choices = features.assay, selected = feature.use ) }) observe(x = { feature.use <- input$feature try( expr = { feature.data <- FetchData( object = object, vars = paste0(Key(object = object[[input$assay]]), feature.use), cells = cells.use, slot = slot ) colnames(x = feature.data) <- feature.use plot.env$data <- cbind(coords, feature.data) plot.env$feature <- feature.use }, silent = TRUE ) }) observe(x = { plot.env$palette <- input$palette }) # Create plot output$plot <- renderPlot(expr = { plot.env$plot <- SingleSpatialPlot( data = plot.env$data, image = object[[image]], col.by = plot.env$feature, pt.size.factor = input$pt.size, crop = TRUE, alpha.by = plot.env$feature ) + # scale_fill_gradientn(name = plot.env$feature, colours = cols) + scale_fill_gradientn(name = plot.env$feature, colours = FeaturePalettes[[plot.env$palette]]) + theme(legend.position = 'top') + scale_alpha(range = c(input$alpha, 1)) + guides(alpha = "none") plot.env$plot }) } runGadget(app = ui, server = server) } #' Visualize spatial clustering and expression data. #' #' SpatialPlot plots a feature or discrete grouping (e.g. cluster assignments) as #' spots over the image that was collected. We also provide SpatialFeaturePlot #' and SpatialDimPlot as wrapper functions around SpatialPlot for a consistent #' naming framework. #' #' @inheritParams HoverLocator #' @param object A Seurat object #' @param group.by Name of meta.data column to group the data by #' @param features Name of the feature to visualize. Provide either group.by OR #' features, not both. #' @param images Name of the images to use in the plot(s) #' @param cols Vector of colors, each color corresponds to an identity class. #' This may also be a single character or numeric value corresponding to a #' palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By #' default, ggplot2 assigns colors #' @param image.alpha Adjust the opacity of the background images. Set to 0 to #' remove. #' @param image.scale Choose the scale factor ("lowres"/"hires") to apply in #' order to matchthe plot with the specified `image` - defaults to "lowres" #' @param crop Crop the plot in to focus on points plotted. Set to \code{FALSE} to show #' entire background image. #' @param slot If plotting a feature, which data slot to pull from (counts, #' data, or scale.data) #' @param keep.scale How to handle the color scale across multiple plots. Options are: #' \itemize{ #' \item \dQuote{feature} (default; by row/feature scaling): The plots for #' each individual feature are scaled to the maximum expression of the #' feature across the conditions provided to \code{split.by} #' \item \dQuote{all} (universal scaling): The plots for all features and #' conditions are scaled to the maximum expression value for the feature #' with the highest overall expression #' \item \code{NULL} (no scaling): Each individual plot is scaled to the #' maximum expression value of the feature in the condition provided to #' \code{split.by}; be aware setting \code{NULL} will result in color #' scales that are not comparable between plots #' } #' @param min.cutoff,max.cutoff Vector of minimum and maximum cutoff #' values for each feature, may specify quantile in the form of 'q##' where '##' #' is the quantile (eg, 'q1', 'q10') #' @param cells.highlight A list of character or numeric vectors of cells to #' highlight. If only one group of cells desired, can simply pass a vector #' instead of a list. If set, colors selected cells to the color(s) in #' cols.highlight #' @param cols.highlight A vector of colors to highlight the cells as; ordered #' the same as the groups in cells.highlight; last color corresponds to #' unselected cells. #' @param facet.highlight When highlighting certain groups of cells, split each #' group into its own plot #' @param label Whether to label the clusters #' @param label.size Sets the size of the labels #' @param label.color Sets the color of the label text #' @param label.box Whether to put a box around the label text (geom_text vs #' geom_label) #' @param repel Repels the labels to prevent overlap #' @param ncol Number of columns if plotting multiple plots #' @param combine Combine plots into a single gg object; note that if TRUE; #' themeing will not work when plotting multiple features/groupings #' @param pt.size.factor Scale the size of the spots. #' @param alpha Controls opacity of spots. Provide as a vector specifying the #' min and max for SpatialFeaturePlot. For SpatialDimPlot, provide a single #' alpha value for each plot. #' @param shape Control the shape of the spots - same as the ggplot2 parameter. #' The default is 21, which plots circles - use 22 to plot squares. #' @param stroke Control the width of the border around the spots #' @param interactive Launch an interactive SpatialDimPlot or SpatialFeaturePlot #' session, see \code{\link{ISpatialDimPlot}} or #' \code{\link{ISpatialFeaturePlot}} for more details #' @param do.identify,do.hover DEPRECATED in favor of \code{interactive} #' @param identify.ident DEPRECATED #' #' @return If \code{do.identify}, either a vector of cells selected or the object #' with selected cells set to the value of \code{identify.ident} (if set). Else, #' if \code{do.hover}, a plotly object with interactive graphics. Else, a ggplot #' object #' #' @importFrom ggplot2 scale_fill_gradientn ggtitle theme element_text scale_alpha #' @importFrom patchwork wrap_plots #' @export #' @concept visualization #' @concept spatial #' #' @examples #' \dontrun{ #' # For functionality analagous to FeaturePlot #' SpatialPlot(seurat.object, features = "MS4A1") #' SpatialFeaturePlot(seurat.object, features = "MS4A1") #' #' # For functionality analagous to DimPlot #' SpatialPlot(seurat.object, group.by = "clusters") #' SpatialDimPlot(seurat.object, group.by = "clusters") #' } #' SpatialPlot <- function( object, group.by = NULL, features = NULL, images = NULL, cols = NULL, image.alpha = 1, image.scale = "lowres", crop = TRUE, slot = 'data', keep.scale = "feature", min.cutoff = NA, max.cutoff = NA, cells.highlight = NULL, cols.highlight = c('#DE2D26', 'grey50'), facet.highlight = FALSE, label = FALSE, label.size = 5, label.color = 'white', label.box = TRUE, repel = FALSE, ncol = NULL, combine = TRUE, pt.size.factor = 1.6, alpha = c(1, 1), shape = 21, stroke = NA, interactive = FALSE, do.identify = FALSE, identify.ident = NULL, do.hover = FALSE, information = NULL ) { if (isTRUE(x = do.hover) || isTRUE(x = do.identify)) { warning( "'do.hover' and 'do.identify' are deprecated as we are removing plotly-based interactive graphics, use 'interactive' instead for Shiny-based interactivity", call. = FALSE, immediate. = TRUE ) interactive <- TRUE } if (!is.null(x = group.by) & !is.null(x = features)) { stop("Please specific either group.by or features, not both.") } images <- images %||% Images(object = object, assay = DefaultAssay(object = object)) if (length(x = images) == 0) { images <- Images(object = object) } if (length(x = images) < 1) { stop("Could not find any spatial image information") } # Check keep.scale param for valid entries if (!(is.null(x = keep.scale)) && !(keep.scale %in% c("feature", "all"))) { stop("`keep.scale` must be set to either `feature`, `all`, or NULL") } cells <- unique(CellsByImage(object, images = images, unlist = TRUE)) if (is.null(x = features)) { if (interactive) { return(ISpatialDimPlot( object = object, image = images[1], image.scale = image.scale, group.by = group.by, alpha = alpha )) } group.by <- group.by %||% 'ident' object[['ident']] <- Idents(object = object) data <- object[[group.by]] data <- data[cells,,drop=F] for (group in group.by) { if (!is.factor(x = data[, group])) { data[, group] <- factor(x = data[, group]) } } } else { if (interactive) { return(ISpatialFeaturePlot( object = object, feature = features[1], image = images[1], image.scale = image.scale, slot = slot, alpha = alpha )) } data <- FetchData( object = object, vars = features, cells = cells, layer = slot, clean = FALSE ) features <- colnames(x = data) # Determine cutoffs min.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = min(data[, feature]), no = cutoff )) }, cutoff = min.cutoff, feature = features ) max.cutoff <- mapply( FUN = function(cutoff, feature) { return(ifelse( test = is.na(x = cutoff), yes = max(data[, feature]), no = cutoff )) }, cutoff = max.cutoff, feature = features ) check.lengths <- unique(x = vapply( X = list(features, min.cutoff, max.cutoff), FUN = length, FUN.VALUE = numeric(length = 1) )) if (length(x = check.lengths) != 1) { stop("There must be the same number of minimum and maximum cuttoffs as there are features") } # Apply cutoffs data <- sapply( X = 1:ncol(x = data), FUN = function(index) { data.feature <- as.vector(x = data[, index]) min.use <- SetQuantile(cutoff = min.cutoff[index], data.feature) max.use <- SetQuantile(cutoff = max.cutoff[index], data.feature) data.feature[data.feature < min.use] <- min.use data.feature[data.feature > max.use] <- max.use return(data.feature) } ) colnames(x = data) <- features rownames(x = data) <- cells } features <- colnames(x = data) colnames(x = data) <- features rownames(x = data) <- cells facet.highlight <- facet.highlight && (!is.null(x = cells.highlight) && is.list(x = cells.highlight)) if (do.hover) { if (length(x = images) > 1) { images <- images[1] warning( "'do.hover' requires only one image, using image ", images, call. = FALSE, immediate. = TRUE ) } if (length(x = features) > 1) { features <- features[1] type <- ifelse(test = is.null(x = group.by), yes = 'feature', no = 'grouping') warning( "'do.hover' requires only one ", type, ", using ", features, call. = FALSE, immediate. = TRUE ) } if (facet.highlight) { warning( "'do.hover' requires no faceting highlighted cells", call. = FALSE, immediate. = TRUE ) facet.highlight <- FALSE } } if (facet.highlight) { if (length(x = images) > 1) { images <- images[1] warning( "Faceting the highlight only works with a single image, using image ", images, call. = FALSE, immediate. = TRUE ) } ncols <- length(x = cells.highlight) } else { ncols <- length(x = images) } plots <- vector( mode = "list", length = length(x = features) * ncols ) # Get max across all features if (!(is.null(x = keep.scale)) && keep.scale == "all") { max.feature.value <- max(apply(data, 2, function(x) max(x, na.rm = TRUE))) } for (i in 1:ncols) { plot.idx <- i image.idx <- ifelse(test = facet.highlight, yes = 1, no = i) image.use <- object[[images[[image.idx]]]] coordinates <- GetTissueCoordinates( object = image.use, scale = image.scale ) highlight.use <- if (facet.highlight) { cells.highlight[i] } else { cells.highlight } for (j in 1:length(x = features)) { cols.unset <- is.factor(x = data[, features[j]]) && is.null(x = cols) if (cols.unset) { cols <- hue_pal()(n = length(x = levels(x = data[, features[j]]))) names(x = cols) <- levels(x = data[, features[j]]) } # Get feature max for individual feature if (!(is.null(x = keep.scale)) && keep.scale == "feature" && !inherits(x = data[, features[j]], what = "factor") ) { max.feature.value <- max(data[, features[j]]) } plot <- SingleSpatialPlot( data = cbind( coordinates, data[rownames(x = coordinates), features[j], drop = FALSE] ), image = image.use, image.scale = image.scale, image.alpha = image.alpha, col.by = features[j], cols = cols, alpha.by = if (is.null(x = group.by)) { features[j] } else { NULL }, pt.alpha = if (!is.null(x = group.by)) { alpha[j] } else { NULL }, geom = if (inherits(x = image.use, what = "STARmap")) { 'poly' } else { 'spatial' }, cells.highlight = highlight.use, cols.highlight = cols.highlight, pt.size.factor = pt.size.factor, shape = shape, stroke = stroke, crop = crop ) if (is.null(x = group.by)) { plot <- plot + scale_fill_gradientn( name = features[j], colours = SpatialColors(n = 100) ) + theme(legend.position = 'top') + scale_alpha(range = alpha) + guides(alpha = "none") } else if (label) { plot <- LabelClusters( plot = plot, id = ifelse( test = is.null(x = cells.highlight), yes = features[j], no = 'highlight' ), geom = if (inherits(x = image.use, what = "STARmap")) { 'GeomPolygon' } else { 'GeomSpatial' }, repel = repel, size = label.size, color = label.color, box = label.box, position = "nearest" ) } if (j == 1 && length(x = images) > 1 && !facet.highlight) { plot <- plot + ggtitle(label = images[[image.idx]]) + theme(plot.title = element_text(hjust = 0.5)) } if (facet.highlight) { plot <- plot + ggtitle(label = names(x = cells.highlight)[i]) + theme(plot.title = element_text(hjust = 0.5)) + NoLegend() } # Plot multiple images depending on keep.scale if (!(is.null(x = keep.scale)) && !inherits(x = data[, features[j]], "factor")) { plot <- suppressMessages(plot & scale_fill_gradientn(colors = SpatialColors(n = 100), limits = c(NA, max.feature.value))) } plots[[plot.idx]] <- plot plot.idx <- plot.idx + ncols if (cols.unset) { cols <- NULL } } } if (combine) { if (!is.null(x = ncol)) { return(wrap_plots(plots = plots, ncol = ncol)) } if (length(x = images) > 1) { return(wrap_plots(plots = plots, ncol = length(x = images))) } return(wrap_plots(plots = plots)) } return(plots) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Other plotting functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Plot the Barcode Distribution and Calculated Inflection Points #' #' This function plots the calculated inflection points derived from the barcode-rank #' distribution. #' #' See [CalculateBarcodeInflections()] to calculate inflection points and #' [SubsetByBarcodeInflections()] to subsequently subset the Seurat object. #' #' @param object Seurat object #' #' @return Returns a `ggplot2` object showing the by-group inflection points and provided #' (or default) rank threshold values in grey. #' #' @importFrom methods slot #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 ggplot geom_line geom_vline aes_string #' #' @export #' @concept visualization #' #' @author Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} #' @seealso \code{\link{CalculateBarcodeInflections}} \code{\link{SubsetByBarcodeInflections}} #' #' @examples #' data("pbmc_small") #' pbmc_small <- CalculateBarcodeInflections(pbmc_small, group.column = 'groups') #' BarcodeInflectionsPlot(pbmc_small) #' BarcodeInflectionsPlot <- function(object) { cbi.data <- Tool(object = object, slot = 'CalculateBarcodeInflections') if (is.null(x = cbi.data)) { stop("Barcode inflections not calculated, please run CalculateBarcodeInflections") } ## Extract necessary data frames inflection_points <- cbi.data$inflection_points barcode_distribution <- cbi.data$barcode_distribution threshold_values <- cbi.data$threshold_values # Set a cap to max rank to avoid plot being overextended if (threshold_values$rank[[2]] > max(barcode_distribution$rank, na.rm = TRUE)) { threshold_values$rank[[2]] <- max(barcode_distribution$rank, na.rm = TRUE) } ## Infer the grouping/barcode variables group_var <- colnames(x = barcode_distribution)[1] barcode_var <- colnames(x = barcode_distribution)[2] barcode_distribution[, barcode_var] <- log10(x = barcode_distribution[, barcode_var] + 1) ## Make the plot plot <- ggplot( data = barcode_distribution, mapping = aes_string( x = 'rank', y = barcode_var, group = group_var, colour = group_var ) ) + geom_line() + geom_vline( data = threshold_values, aes_string(xintercept = 'rank'), linetype = "dashed", colour = 'grey60', size = 0.5 ) + geom_vline( data = inflection_points, mapping = aes_string( xintercept = 'rank', group = group_var, colour = group_var ), linetype = "dashed" ) + theme_cowplot() return(plot) } #' Dot plot visualization #' #' Intuitive way of visualizing how feature expression changes across different #' identity classes (clusters). The size of the dot encodes the percentage of #' cells within a class, while the color encodes the AverageExpression level #' across all cells within a class (blue is high). #' #' @param object Seurat object #' @param assay Name of assay to use, defaults to the active assay #' @param features Input vector of features, or named list of feature vectors #' if feature-grouped panels are desired (replicates the functionality of the #' old SplitDotPlotGG) #' @param cols Colors to plot: the name of a palette from #' \code{RColorBrewer::brewer.pal.info}, a pair of colors defining a gradient, #' or 3+ colors defining multiple gradients (if split.by is set) #' @param col.min Minimum scaled average expression threshold (everything #' smaller will be set to this) #' @param col.max Maximum scaled average expression threshold (everything larger #' will be set to this) #' @param dot.min The fraction of cells at which to draw the smallest dot #' (default is 0). All cell groups with less than this expressing the given #' gene will have no dot drawn. #' @param dot.scale Scale the size of the points, similar to cex #' @param idents Identity classes to include in plot (default is all) #' @param group.by Factor to group the cells by #' @param split.by A factor in object metadata to split the plot by, pass 'ident' #' to split by cell identity #' see \code{\link{FetchData}} for more details #' @param cluster.idents Whether to order identities by hierarchical clusters #' based on given features, default is FALSE #' @param scale Determine whether the data is scaled, TRUE for default #' @param scale.by Scale the size of the points by 'size' or by 'radius' #' @param scale.min Set lower limit for scaling, use NA for default #' @param scale.max Set upper limit for scaling, use NA for default #' #' @return A ggplot object #' #' @importFrom grDevices colorRampPalette #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 ggplot aes_string geom_point scale_size scale_radius #' theme element_blank labs scale_color_identity scale_color_distiller #' scale_color_gradient guides guide_legend guide_colorbar #' facet_grid unit #' @importFrom scattermore geom_scattermore #' @importFrom stats dist hclust #' @importFrom RColorBrewer brewer.pal.info #' #' @export #' @concept visualization #' #' @aliases SplitDotPlotGG #' @seealso \code{RColorBrewer::brewer.pal.info} #' #' @examples #' data("pbmc_small") #' cd_genes <- c("CD247", "CD3E", "CD9") #' DotPlot(object = pbmc_small, features = cd_genes) #' pbmc_small[['groups']] <- sample(x = c('g1', 'g2'), size = ncol(x = pbmc_small), replace = TRUE) #' DotPlot(object = pbmc_small, features = cd_genes, split.by = 'groups') #' DotPlot <- function( object, features, assay = NULL, cols = c("lightgrey", "blue"), col.min = -2.5, col.max = 2.5, dot.min = 0, dot.scale = 6, idents = NULL, group.by = NULL, split.by = NULL, cluster.idents = FALSE, scale = TRUE, scale.by = 'radius', scale.min = NA, scale.max = NA ) { assay <- assay %||% DefaultAssay(object = object) DefaultAssay(object = object) <- assay split.colors <- !is.null(x = split.by) && !any(cols %in% rownames(x = brewer.pal.info)) scale.func <- switch( EXPR = scale.by, 'size' = scale_size, 'radius' = scale_radius, stop("'scale.by' must be either 'size' or 'radius'") ) feature.groups <- NULL if (is.list(features) | any(!is.na(names(features)))) { feature.groups <- unlist(x = sapply( X = 1:length(features), FUN = function(x) { return(rep(x = names(x = features)[x], each = length(features[[x]]))) } )) if (any(is.na(x = feature.groups))) { warning( "Some feature groups are unnamed.", call. = FALSE, immediate. = TRUE ) } features <- unlist(x = features) names(x = feature.groups) <- features } cells <- unlist(x = CellsByIdentities(object = object, cells = colnames(object[[assay]]), idents = idents)) data.features <- FetchData(object = object, vars = features, cells = cells) data.features$id <- if (is.null(x = group.by)) { Idents(object = object)[cells, drop = TRUE] } else { object[[group.by, drop = TRUE]][cells, drop = TRUE] } if (!is.factor(x = data.features$id)) { data.features$id <- factor(x = data.features$id) } id.levels <- levels(x = data.features$id) data.features$id <- as.vector(x = data.features$id) if (!is.null(x = split.by)) { splits <- FetchData(object = object, vars = split.by)[cells, split.by] if (split.colors) { if (length(x = unique(x = splits)) > length(x = cols)) { stop(paste0("Need to specify at least ", length(x = unique(x = splits)), " colors using the cols parameter")) } cols <- cols[1:length(x = unique(x = splits))] names(x = cols) <- unique(x = splits) } data.features$id <- paste(data.features$id, splits, sep = '_') unique.splits <- unique(x = splits) id.levels <- paste0(rep(x = id.levels, each = length(x = unique.splits)), "_", rep(x = unique(x = splits), times = length(x = id.levels))) } data.plot <- lapply( X = unique(x = data.features$id), FUN = function(ident) { data.use <- data.features[data.features$id == ident, 1:(ncol(x = data.features) - 1), drop = FALSE] avg.exp <- apply( X = data.use, MARGIN = 2, FUN = function(x) { return(mean(x = expm1(x = x))) } ) pct.exp <- apply(X = data.use, MARGIN = 2, FUN = PercentAbove, threshold = 0) return(list(avg.exp = avg.exp, pct.exp = pct.exp)) } ) names(x = data.plot) <- unique(x = data.features$id) if (cluster.idents) { mat <- do.call( what = rbind, args = lapply(X = data.plot, FUN = unlist) ) mat <- scale(x = mat) id.levels <- id.levels[hclust(d = dist(x = mat))$order] } data.plot <- lapply( X = names(x = data.plot), FUN = function(x) { data.use <- as.data.frame(x = data.plot[[x]]) data.use$features.plot <- rownames(x = data.use) data.use$id <- x return(data.use) } ) data.plot <- do.call(what = 'rbind', args = data.plot) if (!is.null(x = id.levels)) { data.plot$id <- factor(x = data.plot$id, levels = id.levels) } ngroup <- length(x = levels(x = data.plot$id)) if (ngroup == 1) { scale <- FALSE warning( "Only one identity present, the expression values will be not scaled", call. = FALSE, immediate. = TRUE ) } else if (ngroup < 5 & scale) { warning( "Scaling data with a low number of groups may produce misleading results", call. = FALSE, immediate. = TRUE ) } avg.exp.scaled <- sapply( X = unique(x = data.plot$features.plot), FUN = function(x) { data.use <- data.plot[data.plot$features.plot == x, 'avg.exp'] if (scale) { data.use <- scale(x = log1p(data.use)) data.use <- MinMax(data = data.use, min = col.min, max = col.max) } else { data.use <- log1p(x = data.use) } return(data.use) } ) avg.exp.scaled <- as.vector(x = t(x = avg.exp.scaled)) if (split.colors) { avg.exp.scaled <- as.numeric(x = cut(x = avg.exp.scaled, breaks = 20)) } data.plot$avg.exp.scaled <- avg.exp.scaled data.plot$features.plot <- factor( x = data.plot$features.plot, levels = features ) data.plot$pct.exp[data.plot$pct.exp < dot.min] <- NA data.plot$pct.exp <- data.plot$pct.exp * 100 if (split.colors) { splits.use <- unlist(x = lapply( X = data.plot$id, FUN = function(x) sub( paste0(".*_(", paste(sort(unique(x = splits), decreasing = TRUE), collapse = '|' ),")$"), "\\1", x ) ) ) data.plot$colors <- mapply( FUN = function(color, value) { return(colorRampPalette(colors = c('grey', color))(20)[value]) }, color = cols[splits.use], value = avg.exp.scaled ) } color.by <- ifelse(test = split.colors, yes = 'colors', no = 'avg.exp.scaled') if (!is.na(x = scale.min)) { data.plot[data.plot$pct.exp < scale.min, 'pct.exp'] <- scale.min } if (!is.na(x = scale.max)) { data.plot[data.plot$pct.exp > scale.max, 'pct.exp'] <- scale.max } if (!is.null(x = feature.groups)) { data.plot$feature.groups <- factor( x = feature.groups[data.plot$features.plot], levels = unique(x = feature.groups) ) } plot <- ggplot(data = data.plot, mapping = aes_string(x = 'features.plot', y = 'id')) + geom_point(mapping = aes_string(size = 'pct.exp', color = color.by)) + scale.func(range = c(0, dot.scale), limits = c(scale.min, scale.max)) + theme(axis.title.x = element_blank(), axis.title.y = element_blank()) + guides(size = guide_legend(title = 'Percent Expressed')) + labs( x = 'Features', y = ifelse(test = is.null(x = split.by), yes = 'Identity', no = 'Split Identity') ) + theme_cowplot() if (!is.null(x = feature.groups)) { plot <- plot + facet_grid( facets = ~feature.groups, scales = "free_x", space = "free_x", switch = "y" ) + theme( panel.spacing = unit(x = 1, units = "lines"), strip.background = element_blank() ) } if (split.colors) { plot <- plot + scale_color_identity() } else if (length(x = cols) == 1) { plot <- plot + scale_color_distiller(palette = cols) } else { plot <- plot + scale_color_gradient(low = cols[1], high = cols[2]) } if (!split.colors) { plot <- plot + guides(color = guide_colorbar(title = 'Average Expression')) } return(plot) } #' Quickly Pick Relevant Dimensions #' #' Plots the standard deviations (or approximate singular values if running PCAFast) #' of the principle components for easy identification of an elbow in the graph. #' This elbow often corresponds well with the significant dims and is much faster to run than #' Jackstraw #' #' @param object Seurat object #' @param ndims Number of dimensions to plot standard deviation for #' @param reduction Reduction technique to plot standard deviation for #' #' @return A ggplot object #' #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 ggplot aes_string geom_point labs element_line #' @export #' @concept visualization #' #' @examples #' data("pbmc_small") #' ElbowPlot(object = pbmc_small) #' ElbowPlot <- function(object, ndims = 20, reduction = 'pca') { data.use <- Stdev(object = object, reduction = reduction) if (length(x = data.use) == 0) { stop(paste("No standard deviation info stored for", reduction)) } if (ndims > length(x = data.use)) { warning("The object only has information for ", length(x = data.use), " reductions") ndims <- length(x = data.use) } stdev <- 'Standard Deviation' plot <- ggplot(data = data.frame(dims = 1:ndims, stdev = data.use[1:ndims])) + geom_point(mapping = aes_string(x = 'dims', y = 'stdev')) + labs( x = gsub( pattern = '_$', replacement = '', x = Key(object = object[[reduction]]) ), y = stdev ) + theme_cowplot() return(plot) } #' Boxplot of correlation of a variable (e.g. number of UMIs) with expression #' data #' #' @param object Seurat object #' @param assay Assay where the feature grouping info and correlations are #' stored #' @param feature.group Name of the column in meta.features where the feature #' grouping info is stored #' @param cor Name of the column in meta.features where correlation info is #' stored #' #' @return Returns a ggplot boxplot of correlations split by group #' #' @importFrom ggplot2 geom_boxplot scale_fill_manual geom_hline #' @importFrom cowplot theme_cowplot #' @importFrom scales brewer_pal #' @importFrom stats complete.cases #' #' @export #' @concept visualization #' GroupCorrelationPlot <- function( object, assay = NULL, feature.group = "feature.grp", cor = "nCount_RNA_cor" ) { assay <- assay %||% DefaultAssay(object = object) data <- object[[assay]][c(feature.group, cor)] data <- data[complete.cases(data), ] colnames(x = data) <- c('grp', 'cor') data$grp <- as.character(data$grp) plot <- ggplot(data = data, aes_string(x = "grp", y = "cor", fill = "grp")) + geom_boxplot() + theme_cowplot() + scale_fill_manual(values = rev(x = brewer_pal(palette = 'YlOrRd')(n = 7))) + ylab(paste( "Correlation with", gsub(x = cor, pattern = "_cor", replacement = "") )) + geom_hline(yintercept = 0) + NoLegend() + theme( axis.line.x = element_blank(), axis.title.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank() ) return(plot) } #' JackStraw Plot #' #' Plots the results of the JackStraw analysis for PCA significance. For each #' PC, plots a QQ-plot comparing the distribution of p-values for all genes #' across each PC, compared with a uniform distribution. Also determines a #' p-value for the overall significance of each PC (see Details). #' #' Significant PCs should show a p-value distribution (black curve) that is #' strongly skewed to the left compared to the null distribution (dashed line) #' The p-value for each PC is based on a proportion test comparing the number #' of genes with a p-value below a particular threshold (score.thresh), compared with the #' proportion of genes expected under a uniform distribution of p-values. #' #' @param object Seurat object #' @param dims Dims to plot #' @param cols Vector of colors, each color corresponds to an individual PC. This may also be a single character #' or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. #' By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. #' See \code{\link{DiscretePalette}} for details. #' @param reduction reduction to pull jackstraw info from #' @param xmax X-axis maximum on each QQ plot. #' @param ymax Y-axis maximum on each QQ plot. #' #' @return A ggplot object #' #' @author Omri Wurtzel #' @seealso \code{\link{ScoreJackStraw}} #' #' @importFrom stats qunif #' @importFrom scales hue_pal #' @importFrom ggplot2 ggplot aes_string stat_qq labs xlim ylim #' coord_flip geom_abline guides guide_legend #' @importFrom cowplot theme_cowplot #' #' @export #' @concept visualization #' #' @examples #' data("pbmc_small") #' JackStrawPlot(object = pbmc_small) #' JackStrawPlot <- function( object, dims = 1:5, cols = NULL, reduction = 'pca', xmax = 0.1, ymax = 0.3 ) { pAll <- JS(object = object[[reduction]], slot = 'empirical') if (max(dims) > ncol(x = pAll)) { stop("Max dimension is ", ncol(x = pAll)) } pAll <- pAll[, dims, drop = FALSE] pAll <- as.data.frame(x = pAll) data.plot <- Melt(x = pAll) colnames(x = data.plot) <- c("Contig", "PC", "Value") score.df <- JS(object = object[[reduction]], slot = 'overall') if (nrow(x = score.df) < max(dims)) { stop("Jackstraw procedure not scored for all the provided dims. Please run ScoreJackStraw.") } score.df <- score.df[dims, , drop = FALSE] if (nrow(x = score.df) == 0) { stop(paste0("JackStraw hasn't been scored. Please run ScoreJackStraw before plotting.")) } data.plot$PC.Score <- rep( x = paste0("PC ", score.df[ ,"PC"], ": ", sprintf("%1.3g", score.df[ ,"Score"])), each = length(x = unique(x = data.plot$Contig)) ) data.plot$PC.Score <- factor( x = data.plot$PC.Score, levels = paste0("PC ", score.df[, "PC"], ": ", sprintf("%1.3g", score.df[, "Score"])) ) if (is.null(x = cols)) { cols <- hue_pal()(length(x = dims)) } if (length(x = cols) < length(x = dims)) { stop("Not enough colors for the number of dims selected") } gp <- ggplot(data = data.plot, mapping = aes_string(sample = 'Value', color = 'PC.Score')) + stat_qq(distribution = qunif) + labs(x = "Theoretical [runif(1000)]", y = "Empirical") + scale_color_manual(values = cols) + xlim(0, ymax) + ylim(0, xmax) + coord_flip() + geom_abline(intercept = 0, slope = 1, linetype = "dashed", na.rm = TRUE) + guides(color = guide_legend(title = "PC: p-value")) + theme_cowplot() return(gp) } #' Plot clusters as a tree #' #' Plots previously computed tree (from BuildClusterTree) #' #' @param object Seurat object #' @param direction A character string specifying the direction of the tree (default is downwards) #' Possible options: "rightwards", "leftwards", "upwards", and "downwards". #' @param \dots Additional arguments to #' \code{\link[ape:plot.phylo]{ape::plot.phylo}} #' #' @return Plots dendogram (must be precomputed using BuildClusterTree), returns no value #' #' @export #' @concept visualization #' #' @examples #' \dontrun{ #' if (requireNamespace("ape", quietly = TRUE)) { #' data("pbmc_small") #' pbmc_small <- BuildClusterTree(object = pbmc_small) #' PlotClusterTree(object = pbmc_small) #' } #' } PlotClusterTree <- function(object, direction = "downwards", ...) { if (!PackageCheck('ape', error = FALSE)) { stop(cluster.ape, call. = FALSE) } if (is.null(x = Tool(object = object, slot = "BuildClusterTree"))) { stop("Phylogenetic tree does not exist, build using BuildClusterTree") } data.tree <- Tool(object = object, slot = "BuildClusterTree") ape::plot.phylo(x = data.tree, direction = direction, ...) ape::nodelabels() } #' Visualize Dimensional Reduction genes #' #' Visualize top genes associated with reduction components #' #' @param object Seurat object #' @param reduction Reduction technique to visualize results for #' @param dims Number of dimensions to display #' @param nfeatures Number of genes to display #' @param col Color of points to use #' @param projected Use reduction values for full dataset (i.e. projected #' dimensional reduction values) #' @param balanced Return an equal number of genes with + and - scores. If #' FALSE (default), returns the top genes ranked by the scores absolute values #' @param ncol Number of columns to display #' @param combine Combine plots into a single \code{patchwork} #' ggplot object. If \code{FALSE}, return a list of ggplot objects #' #' @return A \code{patchwork} ggplot object if #' \code{combine = TRUE}; otherwise, a list of ggplot objects #' #' @importFrom patchwork wrap_plots #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 ggplot aes_string geom_point labs #' @export #' @concept visualization #' #' @examples #' data("pbmc_small") #' VizDimLoadings(object = pbmc_small) #' VizDimLoadings <- function( object, dims = 1:5, nfeatures = 30, col = 'blue', reduction = 'pca', projected = FALSE, balanced = FALSE, ncol = NULL, combine = TRUE ) { if (is.null(x = ncol)) { ncol <- 2 if (length(x = dims) == 1) { ncol <- 1 } if (length(x = dims) > 6) { ncol <- 3 } if (length(x = dims) > 9) { ncol <- 4 } } loadings <- Loadings(object = object[[reduction]], projected = projected) features <- lapply( X = dims, FUN = TopFeatures, object = object[[reduction]], nfeatures = nfeatures, projected = projected, balanced = balanced ) features <- lapply( X = features, FUN = unlist, use.names = FALSE ) loadings <- loadings[unlist(x = features), dims, drop = FALSE] names(x = features) <- colnames(x = loadings) <- as.character(x = dims) plots <- lapply( X = as.character(x = dims), FUN = function(i) { data.plot <- as.data.frame(x = loadings[features[[i]], i, drop = FALSE]) colnames(x = data.plot) <- paste0(Key(object = object[[reduction]]), i) data.plot$feature <- factor(x = rownames(x = data.plot), levels = rownames(x = data.plot)) plot <- ggplot( data = data.plot, mapping = aes_string(x = colnames(x = data.plot)[1], y = 'feature') ) + geom_point(col = col) + labs(y = NULL) + theme_cowplot() return(plot) } ) if (combine) { plots <- wrap_plots(plots, ncol = ncol) } return(plots) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Exported utility functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Augments ggplot2-based plot with a PNG image. #' #' Creates "vector-friendly" plots. Does this by saving a copy of the plot as a PNG file, #' then adding the PNG image with \code{\link[ggplot2]{annotation_raster}} to a blank plot #' of the same dimensions as \code{plot}. Please note: original legends and axes will be lost #' during augmentation. #' #' @param plot A ggplot object #' @param width,height Width and height of PNG version of plot #' @param dpi Plot resolution #' #' @return A ggplot object #' #' @importFrom png readPNG #' @importFrom ggplot2 ggplot_build ggsave ggplot aes_string geom_blank annotation_raster ggtitle #' #' @export #' @concept visualization #' #' @examples #' \dontrun{ #' data("pbmc_small") #' plot <- DimPlot(object = pbmc_small) #' AugmentPlot(plot = plot) #' } #' AugmentPlot <- function(plot, width = 10, height = 10, dpi = 100) { pbuild.params <- ggplot_build(plot = plot)$layout$panel_params[[1]] range.values <- c( pbuild.params$x.range, pbuild.params$y.range ) xyparams <- GetXYAesthetics( plot = plot, geom = class(x = plot$layers[[1]]$geom)[1] ) title <- plot$labels$title tmpfile <- tempfile(fileext = '.png') ggsave( filename = tmpfile, plot = plot + NoLegend() + NoAxes() + theme(plot.title = element_blank()), width = width, height = height, dpi = dpi ) img <- readPNG(source = tmpfile) file.remove(tmpfile) blank <- ggplot( data = plot$data, mapping = aes_string(x = xyparams$x, y = xyparams$y) ) + geom_blank() blank <- blank + plot$theme + ggtitle(label = title) blank <- blank + annotation_raster( raster = img, xmin = range.values[1], xmax = range.values[2], ymin = range.values[3], ymax = range.values[4] ) return(blank) } #' Automagically calculate a point size for ggplot2-based scatter plots #' #' It happens to look good #' #' @param data A data frame being passed to ggplot2 #' @param raster If TRUE, point size is set to 1 #' #' @return The "optimal" point size for visualizing these data #' #' @export #' @concept visualization #' #' @examples #' df <- data.frame(x = rnorm(n = 10000), y = runif(n = 10000)) #' AutoPointSize(data = df) #' AutoPointSize <- function(data, raster = NULL) { return(ifelse( test = isTRUE(x = raster), yes = 1, no = min(1583 / nrow(x = data), 1) )) } #' Determine text color based on background color #' #' @param background A vector of background colors; supports R color names and #' hexadecimal codes #' @param threshold Intensity threshold for light/dark cutoff; intensities #' greater than \code{theshold} yield \code{dark}, others yield \code{light} #' @param w3c Use \href{https://www.w3.org/TR/WCAG20/}{W3C} formula for calculating #' background text color; ignores \code{threshold} #' @param dark Color for dark text #' @param light Color for light text #' #' @return A named vector of either \code{dark} or \code{light}, depending on #' \code{background}; names of vector are \code{background} #' #' @export #' @concept visualization #' #' @source \url{https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color} #' #' @examples #' BGTextColor(background = c('black', 'white', '#E76BF3')) #' BGTextColor <- function( background, threshold = 186, w3c = FALSE, dark = 'black', light = 'white' ) { if (w3c) { luminance <- Luminance(color = background) threshold <- 179 return(ifelse( test = luminance > sqrt(x = 1.05 * 0.05) - 0.05, yes = dark, no = light )) } return(ifelse( test = Intensity(color = background) > threshold, yes = dark, no = light )) } #' @export #' @concept visualization #' #' @rdname CustomPalette #' @aliases BlackAndWhite #' #' @examples #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' plot(df, col = BlackAndWhite()) #' BlackAndWhite <- function(mid = NULL, k = 50) { return(CustomPalette(low = "white", high = "black", mid = mid, k = k)) } #' @export #' @concept visualization #' #' @rdname CustomPalette #' @aliases BlueAndRed #' #' @examples #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' plot(df, col = BlueAndRed()) #' BlueAndRed <- function(k = 50) { return(CustomPalette(low = "#313695" , high = "#A50026", mid = "#FFFFBF", k = k)) } #' Cell Selector #' #' Select points on a scatterplot and get information about them #' #' @param plot A ggplot2 plot #' @param object An optional Seurat object; if passes, will return an object #' with the identities of selected cells set to \code{ident} #' @param ident An optional new identity class to assign the selected cells #' @param ... Ignored #' #' @return If \code{object} is \code{NULL}, the names of the points selected; #' otherwise, a Seurat object with the selected cells identity classes set to #' \code{ident} #' #' @importFrom miniUI miniPage gadgetTitleBar miniTitleBarButton #' miniContentPanel #' @importFrom shiny fillRow plotOutput brushOpts reactiveValues observeEvent #' stopApp brushedPoints renderPlot runGadget #' #' @export #' @concept visualization #' #' @seealso \code{\link{DimPlot}} \code{\link{FeaturePlot}} #' #' @examples #' \dontrun{ #' data("pbmc_small") #' plot <- DimPlot(object = pbmc_small) #' # Follow instructions in the terminal to select points #' cells.located <- CellSelector(plot = plot) #' cells.located #' # Automatically set the identity class of selected cells and return a new Seurat object #' pbmc_small <- CellSelector(plot = plot, object = pbmc_small, ident = 'SelectedCells') #' } #' CellSelector <- function(plot, object = NULL, ident = 'SelectedCells', ...) { # Set up the gadget UI ui <- miniPage( gadgetTitleBar( title = "Cell Selector", left = miniTitleBarButton(inputId = "reset", label = "Reset") ), miniContentPanel( fillRow( plotOutput( outputId = "plot", height = '100%', brush = brushOpts( id = 'brush', delay = 100, delayType = 'debounce', clip = TRUE, resetOnNew = FALSE ) ) ), ) ) # Get some plot information if (inherits(x = plot, what = 'patchwork')) { if (length(x = plot$patches$plots)) { warning( "Multiple plots passed, using last plot", call. = FALSE, immediate. = TRUE ) } class(x = plot) <- grep( pattern = 'patchwork', x = class(x = plot), value = TRUE, invert = TRUE ) } xy.aes <- GetXYAesthetics(plot = plot) dark.theme <- !is.null(x = plot$theme$plot.background$fill) && plot$theme$plot.background$fill == 'black' plot.data <- GGpointToBase(plot = plot, do.plot = FALSE) plot.data$selected_ <- FALSE rownames(x = plot.data) <- rownames(x = plot$data) colnames(x = plot.data) <- gsub( pattern = '-', replacement = '.', x = colnames(x = plot.data) ) # Server function server <- function(input, output, session) { plot.env <- reactiveValues(data = plot.data) # Event handlers observeEvent( eventExpr = input$done, handlerExpr = { PlotBuild(data = plot.env$data, dark.theme = dark.theme) selected <- rownames(x = plot.data)[plot.env$data$selected_] if (inherits(x = object, what = 'Seurat')) { if (!all(selected %in% Cells(x = object))) { stop("Cannot find the selected cells in the Seurat object, please be sure you pass the same object used to generate the plot") } Idents(object = object, cells = selected) <- ident selected <- object } stopApp(returnValue = selected) } ) observeEvent( eventExpr = input$reset, handlerExpr = { plot.env$data <- plot.data session$resetBrush(brushId = 'brush') } ) observeEvent( eventExpr = input$brush, handlerExpr = { plot.env$data <- brushedPoints( df = plot.data, brush = input$brush, xvar = xy.aes$x, yvar = xy.aes$y, allRows = TRUE ) plot.env$data$color <- ifelse( test = plot.env$data$selected_, yes = '#DE2D26', no = '#C3C3C3' ) } ) # Render the plot output$plot <- renderPlot(expr = PlotBuild( data = plot.env$data, dark.theme = dark.theme )) } return(runGadget(app = ui, server = server)) } #' Move outliers towards center on dimension reduction plot #' #' @param object Seurat object #' @param reduction Name of DimReduc to adjust #' @param dims Dimensions to visualize #' @param group.by Group (color) cells in different ways (for example, orig.ident) #' @param outlier.sd Controls the outlier distance #' @param reduction.key Key for DimReduc that is returned #' #' @return Returns a DimReduc object with the modified embeddings #' #' @export #' @concept visualization #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small <- FindClusters(pbmc_small, resolution = 1.1) #' pbmc_small <- RunUMAP(pbmc_small, dims = 1:5) #' DimPlot(pbmc_small, reduction = "umap") #' pbmc_small[["umap_new"]] <- CollapseEmbeddingOutliers(pbmc_small, #' reduction = "umap", reduction.key = 'umap_', outlier.sd = 0.5) #' DimPlot(pbmc_small, reduction = "umap_new") #' } #' CollapseEmbeddingOutliers <- function( object, reduction = 'umap', dims = 1:2, group.by = 'ident', outlier.sd = 2, reduction.key = 'UMAP_' ) { embeddings <- Embeddings(object = object[[reduction]])[, dims] idents <- FetchData(object = object, vars = group.by) data.medians <- sapply(X = dims, FUN = function(x) { tapply(X = embeddings[, x], INDEX = idents, FUN = median) }) data.sd <- apply(X = data.medians, MARGIN = 2, FUN = sd) data.medians.scale <- as.matrix(x = scale(x = data.medians, center = TRUE, scale = TRUE)) data.medians.scale[abs(x = data.medians.scale) < outlier.sd] <- 0 data.medians.scale <- sign(x = data.medians.scale) * (abs(x = data.medians.scale) - outlier.sd) data.correct <- Sweep( x = data.medians.scale, MARGIN = 2, STATS = data.sd, FUN = "*" ) data.correct <- data.correct[abs(x = apply(X = data.correct, MARGIN = 1, FUN = min)) > 0, ] new.embeddings <- embeddings for (i in rownames(x = data.correct)) { cells.correct <- rownames(x = idents)[idents[, "ident"] == i] new.embeddings[cells.correct, ] <- Sweep( x = new.embeddings[cells.correct,], MARGIN = 2, STATS = data.correct[i, ], FUN = "-" ) } reduc <- CreateDimReducObject( embeddings = new.embeddings, loadings = Loadings(object = object[[reduction]]), assay = slot(object = object[[reduction]], name = "assay.used"), key = reduction.key ) return(reduc) } #' Combine ggplot2-based plots into a single plot #' #' @param plots A list of gg objects #' @param ncol Number of columns #' @param legend Combine legends into a single legend #' choose from 'right' or 'bottom'; pass 'none' to remove legends, or \code{NULL} #' to leave legends as they are #' @param ... Extra parameters passed to plot_grid #' #' @return A combined plot #' #' @importFrom cowplot plot_grid get_legend #' @export #' @concept visualization #' #' @examples #' data("pbmc_small") #' pbmc_small[['group']] <- sample( #' x = c('g1', 'g2'), #' size = ncol(x = pbmc_small), #' replace = TRUE #' ) #' plot1 <- FeaturePlot( #' object = pbmc_small, #' features = 'MS4A1', #' split.by = 'group' #' ) #' plot2 <- FeaturePlot( #' object = pbmc_small, #' features = 'FCN1', #' split.by = 'group' #' ) #' CombinePlots( #' plots = list(plot1, plot2), #' legend = 'none', #' nrow = length(x = unique(x = pbmc_small[['group', drop = TRUE]])) #' ) #' CombinePlots <- function(plots, ncol = NULL, legend = NULL, ...) { .Deprecated(msg = "CombinePlots is being deprecated. Plots should now be combined using the patchwork system.") plots.combined <- if (length(x = plots) > 1) { if (!is.null(x = legend)) { if (legend != 'none') { plot.legend <- get_legend(plot = plots[[1]] + theme(legend.position = legend)) } plots <- lapply( X = plots, FUN = function(x) { return(x + NoLegend()) } ) } plots.combined <- plot_grid( plotlist = plots, ncol = ncol, align = 'hv', ... ) if (!is.null(x = legend)) { plots.combined <- switch( EXPR = legend, 'bottom' = plot_grid( plots.combined, plot.legend, ncol = 1, rel_heights = c(1, 0.2) ), 'right' = plot_grid( plots.combined, plot.legend, rel_widths = c(3, 0.3) ), plots.combined ) } plots.combined } else { plots[[1]] } return(plots.combined) } #' Create a custom color palette #' #' Creates a custom color palette based on low, middle, and high color values #' #' @param low low color #' @param high high color #' @param mid middle color. Optional. #' @param k number of steps (colors levels) to include between low and high values #' #' @return A color palette for plotting #' #' @importFrom grDevices col2rgb rgb #' @export #' @concept visualization #' #' @rdname CustomPalette #' @examples #' myPalette <- CustomPalette() #' myPalette #' CustomPalette <- function( low = "white", high = "red", mid = NULL, k = 50 ) { low <- col2rgb(col = low) / 255 high <- col2rgb(col = high) / 255 if (is.null(x = mid)) { r <- seq(from = low[1], to = high[1], len = k) g <- seq(from = low[2], to = high[2], len = k) b <- seq(from = low[3], to = high[3], len = k) } else { k2 <- round(x = k / 2) mid <- col2rgb(col = mid) / 255 r <- c( seq(from = low[1], to = mid[1], len = k2), seq(from = mid[1], to = high[1], len = k2) ) g <- c( seq(from = low[2], to = mid[2], len = k2), seq(from = mid[2], to = high[2],len = k2) ) b <- c( seq(from = low[3], to = mid[3], len = k2), seq(from = mid[3], to = high[3], len = k2) ) } return(rgb(red = r, green = g, blue = b)) } #' Discrete colour palettes from pals #' #' These are included here because pals depends on a number of compiled #' packages, and this can lead to increases in run time for Travis, #' and generally should be avoided when possible. #' #' These palettes are a much better default for data with many classes #' than the default ggplot2 palette. #' #' Many thanks to Kevin Wright for writing the pals package. #' #' @param n Number of colours to be generated. #' @param palette Options are #' "alphabet", "alphabet2", "glasbey", "polychrome", "stepped", and "parade". #' Can be omitted and the function will use the one based on the requested n. #' @param shuffle Shuffle the colors in the selected palette. #' #' @return A vector of colors #' #' @details #' Taken from the pals package (Licence: GPL-3). #' \url{https://cran.r-project.org/package=pals} #' Credit: Kevin Wright #' #' @export #' @concept visualization #' DiscretePalette <- function(n, palette = NULL, shuffle = FALSE) { palettes <- list( alphabet = c( "#F0A0FF", "#0075DC", "#993F00", "#4C005C", "#191919", "#005C31", "#2BCE48", "#FFCC99", "#808080", "#94FFB5", "#8F7C00", "#9DCC00", "#C20088", "#003380", "#FFA405", "#FFA8BB", "#426600", "#FF0010", "#5EF1F2", "#00998F", "#E0FF66", "#740AFF", "#990000", "#FFFF80", "#FFE100", "#FF5005" ), alphabet2 = c( "#AA0DFE", "#3283FE", "#85660D", "#782AB6", "#565656", "#1C8356", "#16FF32", "#F7E1A0", "#E2E2E2", "#1CBE4F", "#C4451C", "#DEA0FD", "#FE00FA", "#325A9B", "#FEAF16", "#F8A19F", "#90AD1C", "#F6222E", "#1CFFCE", "#2ED9FF", "#B10DA1", "#C075A6", "#FC1CBF", "#B00068", "#FBE426", "#FA0087" ), glasbey = c( "#0000FF", "#FF0000", "#00FF00", "#000033", "#FF00B6", "#005300", "#FFD300", "#009FFF", "#9A4D42", "#00FFBE", "#783FC1", "#1F9698", "#FFACFD", "#B1CC71", "#F1085C", "#FE8F42", "#DD00FF", "#201A01", "#720055", "#766C95", "#02AD24", "#C8FF00", "#886C00", "#FFB79F", "#858567", "#A10300", "#14F9FF", "#00479E", "#DC5E93", "#93D4FF", "#004CFF", "#F2F318" ), polychrome = c( "#5A5156", "#E4E1E3", "#F6222E", "#FE00FA", "#16FF32", "#3283FE", "#FEAF16", "#B00068", "#1CFFCE", "#90AD1C", "#2ED9FF", "#DEA0FD", "#AA0DFE", "#F8A19F", "#325A9B", "#C4451C", "#1C8356", "#85660D", "#B10DA1", "#FBE426", "#1CBE4F", "#FA0087", "#FC1CBF", "#F7E1A0", "#C075A6", "#782AB6", "#AAF400", "#BDCDFF", "#822E1C", "#B5EFB5", "#7ED7D1", "#1C7F93", "#D85FF7", "#683B79", "#66B0FF", "#3B00FB" ), stepped = c( "#990F26", "#B33E52", "#CC7A88", "#E6B8BF", "#99600F", "#B3823E", "#CCAA7A", "#E6D2B8", "#54990F", "#78B33E", "#A3CC7A", "#CFE6B8", "#0F8299", "#3E9FB3", "#7ABECC", "#B8DEE6", "#3D0F99", "#653EB3", "#967ACC", "#C7B8E6", "#333333", "#666666", "#999999", "#CCCCCC" ), parade = c( '#ff6969', '#9b37ff', '#cd3737', '#69cdff', '#ffff69', '#69cdcd', '#9b379b', '#3737cd', '#ffff9b', '#cdff69', '#ff9b37', '#37ffff', '#9b69ff', '#37cd69', '#ff3769', '#ff3737', '#37ff9b', '#cdcd37', '#3769cd', '#37cdff', '#9b3737', '#ff699b', '#9b9bff', '#cd9b37', '#69ff37', '#cd3769', '#cd69cd', '#cd6937', '#3737ff', '#cdcd69', '#ff9b69', '#cd37cd', '#9bff37', '#cd379b', '#cd6969', '#69ff9b', '#ff379b', '#9bff9b', '#6937ff', '#69cd37', '#cdff37', '#9bff69', '#9b37cd', '#ff37ff', '#ff37cd', '#ffff37', '#37cd9b', '#379bff', '#ffcd37', '#379b37', '#ff9bff', '#379b9b', '#69ffcd', '#379bcd', '#ff69ff', '#ff9b9b', '#37ff69', '#ff6937', '#6969ff', '#699bff', '#ffcd69', '#69ffff', '#37ff37', '#6937cd', '#37cd37', '#3769ff', '#cd69ff', '#6969cd', '#9bcd37', '#69ff69', '#37cdcd', '#cd37ff', '#37379b', '#37ffcd', '#69cd69', '#ff69cd', '#9bffff', '#9b9b37' ) ) if (is.null(x = n)) { return(names(x = palettes)) } if (is.null(x = palette)) { if (n <= 26) { palette <- "alphabet" } else if (n <= 32) { palette <- "glasbey" } else { palette <- "polychrome" } } palette.vec <- palettes[[palette]] if (n > length(x = palette.vec)) { warning("Not enough colours in specified palette") } if (isTRUE(shuffle)) { palette.vec <- sample(palette.vec) } palette <- palette.vec[seq_len(length.out = n)] return(palette) } #' @rdname CellSelector #' @export #' @concept visualization #' FeatureLocator <- function(plot, ...) { .Defunct( new = 'CellSelector', package = 'Seurat', msg = "'FeatureLocator' has been replaced by 'CellSelector'" ) } #' Hover Locator #' #' Get quick information from a scatterplot by hovering over points #' #' @param plot A ggplot2 plot #' @param information An optional dataframe or matrix of extra information to be displayed on hover #' @param dark.theme Plot using a dark theme? #' @param axes Display or hide x- and y-axes #' @param ... Extra parameters to be passed to \code{\link[plotly]{layout}} #' #' @importFrom ggplot2 ggplot_build #' @importFrom plotly plot_ly layout add_annotations #' @export #' @concept visualization #' #' @seealso \code{\link[plotly]{layout}} \code{\link[ggplot2]{ggplot_build}} #' \code{\link{DimPlot}} \code{\link{FeaturePlot}} #' #' @examples #' \dontrun{ #' data("pbmc_small") #' plot <- DimPlot(object = pbmc_small) #' HoverLocator(plot = plot, information = FetchData(object = pbmc_small, vars = 'percent.mito')) #' } #' HoverLocator <- function( plot, information = NULL, axes = TRUE, dark.theme = FALSE, ... ) { # Use GGpointToBase because we already have ggplot objects # with colors (which are annoying in plotly) plot.build <- suppressWarnings(expr = GGpointToPlotlyBuild( plot = plot, information = information, ... )) data <- ggplot_build(plot = plot)$plot$data # Set up axis labels here # Also, a bunch of stuff to get axis lines done properly if (axes) { xaxis <- list( title = names(x = data)[1], showgrid = FALSE, zeroline = FALSE, showline = TRUE ) yaxis <- list( title = names(x = data)[2], showgrid = FALSE, zeroline = FALSE, showline = TRUE ) } else { xaxis <- yaxis <- list(visible = FALSE) } # Check for dark theme if (dark.theme) { title <- list(color = 'white') xaxis <- c(xaxis, color = 'white') yaxis <- c(yaxis, color = 'white') plotbg <- 'black' } else { title = list(color = 'black') plotbg = 'white' } # The `~' means pull from the data passed (this is why we reset the names) # Use I() to get plotly to accept the colors from the data as is # Set hoverinfo to 'text' to override the default hover information # rather than append to it p <- layout( p = plot_ly( data = plot.build, x = ~x, y = ~y, type = 'scatter', mode = 'markers', color = ~I(color), hoverinfo = 'text', text = ~feature ), xaxis = xaxis, yaxis = yaxis, title = plot$labels$title, titlefont = title, paper_bgcolor = plotbg, plot_bgcolor = plotbg, ... ) # Add labels label.layer <- which(x = sapply( X = plot$layers, FUN = function(x) { return(inherits(x = x$geom, what = c('GeomText', 'GeomTextRepel'))) } )) if (length(x = label.layer) == 1) { p <- add_annotations( p = p, x = plot$layers[[label.layer]]$data[, 1], y = plot$layers[[label.layer]]$data[, 2], xref = "x", yref = "y", text = plot$layers[[label.layer]]$data[, 3], xanchor = 'right', showarrow = FALSE, font = list(size = plot$layers[[label.layer]]$aes_params$size * 4) ) } return(p) } #' Get the intensity and/or luminance of a color #' #' @param color A vector of colors #' #' @return A vector of intensities/luminances for each color #' #' @name contrast-theory #' @rdname contrast-theory #' #' @importFrom grDevices col2rgb #' #' @export #' @concept visualization #' #' @source \url{https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color} #' #' @examples #' Intensity(color = c('black', 'white', '#E76BF3')) #' Intensity <- function(color) { intensities <- apply( X = col2rgb(col = color), MARGIN = 2, FUN = function(col) { col <- rbind(as.vector(x = col), c(0.299, 0.587, 0.114)) return(sum(apply(X = col, MARGIN = 2, FUN = prod))) } ) names(x = intensities) <- color return(intensities) } #' Label clusters on a ggplot2-based scatter plot #' #' @param plot A ggplot2-based scatter plot #' @param id Name of variable used for coloring scatter plot #' @param clusters Vector of cluster ids to label #' @param labels Custom labels for the clusters #' @param split.by Split labels by some grouping label, useful when using #' \code{\link[ggplot2]{facet_wrap}} or \code{\link[ggplot2]{facet_grid}} #' @param repel Use \code{geom_text_repel} to create nicely-repelled labels #' @param geom Name of geom to get X/Y aesthetic names for #' @param box Use geom_label/geom_label_repel (includes a box around the text #' labels) #' @param position How to place the label if repel = FALSE. If "median", place #' the label at the median position. If "nearest" place the label at the #' position of the nearest data point to the median. #' @param ... Extra parameters to \code{\link[ggrepel]{geom_text_repel}}, such as \code{size} #' #' @return A ggplot2-based scatter plot with cluster labels #' #' @importFrom stats median na.omit #' @importFrom ggrepel geom_text_repel geom_label_repel #' @importFrom ggplot2 aes_string geom_text geom_label layer_scales #' @importFrom RANN nn2 #' #' @export #' @concept visualization #' #' @seealso \code{\link[ggrepel]{geom_text_repel}} \code{\link[ggplot2]{geom_text}} #' #' @examples #' data("pbmc_small") #' plot <- DimPlot(object = pbmc_small) #' LabelClusters(plot = plot, id = 'ident') #' LabelClusters <- function( plot, id, clusters = NULL, labels = NULL, split.by = NULL, repel = TRUE, box = FALSE, geom = 'GeomPoint', position = "median", ... ) { xynames <- unlist(x = GetXYAesthetics(plot = plot, geom = geom), use.names = TRUE) if (!id %in% colnames(x = plot$data)) { stop("Cannot find variable ", id, " in plotting data") } if (!is.null(x = split.by) && !split.by %in% colnames(x = plot$data)) { warning("Cannot find splitting variable ", id, " in plotting data") split.by <- NULL } data <- plot$data[, c(xynames, id, split.by)] possible.clusters <- as.character(x = na.omit(object = unique(x = data[, id]))) groups <- clusters %||% as.character(x = na.omit(object = unique(x = data[, id]))) if (any(!groups %in% possible.clusters)) { stop("The following clusters were not found: ", paste(groups[!groups %in% possible.clusters], collapse = ",")) } pb <- ggplot_build(plot = plot) if (geom == 'GeomSpatial') { xrange.save <- layer_scales(plot = plot)$x$range$range yrange.save <- layer_scales(plot = plot)$y$range$range data[, xynames["y"]] = max(data[, xynames["y"]]) - data[, xynames["y"]] + min(data[, xynames["y"]]) if (!pb$plot$plot_env$crop) { y.transform <- c(0, nrow(x = pb$plot$plot_env$image)) - pb$layout$panel_params[[1]]$y.range data[, xynames["y"]] <- data[, xynames["y"]] + sum(y.transform) } } data <- cbind(data, color = pb$data[[1]][[1]]) labels.loc <- lapply( X = groups, FUN = function(group) { data.use <- data[data[, id] == group, , drop = FALSE] data.medians <- if (!is.null(x = split.by)) { do.call( what = 'rbind', args = lapply( X = unique(x = data.use[, split.by]), FUN = function(split) { medians <- apply( X = data.use[data.use[, split.by] == split, xynames, drop = FALSE], MARGIN = 2, FUN = median, na.rm = TRUE ) medians <- as.data.frame(x = t(x = medians)) medians[, split.by] <- split return(medians) } ) ) } else { as.data.frame(x = t(x = apply( X = data.use[, xynames, drop = FALSE], MARGIN = 2, FUN = median, na.rm = TRUE ))) } data.medians[, id] <- group data.medians$color <- data.use$color[1] return(data.medians) } ) if (position == "nearest") { labels.loc <- lapply(X = labels.loc, FUN = function(x) { group.data <- data[as.character(x = data[, id]) == as.character(x[3]), ] nearest.point <- nn2(data = group.data[, 1:2], query = as.matrix(x = x[c(1,2)]), k = 1)$nn.idx x[1:2] <- group.data[nearest.point, 1:2] return(x) }) } labels.loc <- do.call(what = 'rbind', args = labels.loc) labels.loc[, id] <- factor(x = labels.loc[, id], levels = levels(data[, id])) labels <- labels %||% groups if (length(x = unique(x = labels.loc[, id])) != length(x = labels)) { stop("Length of labels (", length(x = labels), ") must be equal to the number of clusters being labeled (", length(x = labels.loc), ").") } names(x = labels) <- groups for (group in groups) { labels.loc[labels.loc[, id] == group, id] <- labels[group] } if (box) { geom.use <- ifelse(test = repel, yes = geom_label_repel, no = geom_label) plot <- plot + geom.use( data = labels.loc, mapping = aes_string(x = xynames['x'], y = xynames['y'], label = id, fill = id), show.legend = FALSE, ... ) + scale_fill_manual(values = labels.loc$color[order(labels.loc[, id])]) } else { geom.use <- ifelse(test = repel, yes = geom_text_repel, no = geom_text) plot <- plot + geom.use( data = labels.loc, mapping = aes_string(x = xynames['x'], y = xynames['y'], label = id), show.legend = FALSE, ... ) } # restore old axis ranges if (geom == 'GeomSpatial') { plot <- suppressMessages(expr = plot + coord_fixed(xlim = xrange.save, ylim = yrange.save)) } return(plot) } #' Add text labels to a ggplot2 plot #' #' @param plot A ggplot2 plot with a GeomPoint layer #' @param points A vector of points to label; if \code{NULL}, will use all points in the plot #' @param labels A vector of labels for the points; if \code{NULL}, will use #' rownames of the data provided to the plot at the points selected #' @param repel Use \code{geom_text_repel} to create a nicely-repelled labels; this #' is slow when a lot of points are being plotted. If using \code{repel}, set \code{xnudge} #' and \code{ynudge} to 0 #' @param xnudge,ynudge Amount to nudge X and Y coordinates of labels by #' @param ... Extra parameters passed to \code{geom_text} #' #' @return A ggplot object #' #' @importFrom ggrepel geom_text_repel #' @importFrom ggplot2 geom_text aes_string #' @export #' @concept visualization #' #' @aliases Labeler #' @seealso \code{\link[ggplot2]{geom_text}} #' #' @examples #' data("pbmc_small") #' ff <- TopFeatures(object = pbmc_small[['pca']]) #' cc <- TopCells(object = pbmc_small[['pca']]) #' plot <- FeatureScatter(object = pbmc_small, feature1 = ff[1], feature2 = ff[2]) #' LabelPoints(plot = plot, points = cc) #' LabelPoints <- function( plot, points, labels = NULL, repel = FALSE, xnudge = 0.3, ynudge = 0.05, ... ) { xynames <- GetXYAesthetics(plot = plot) points <- points %||% rownames(x = plot$data) if (is.numeric(x = points)) { points <- rownames(x = plot$data) } points <- intersect(x = points, y = rownames(x = plot$data)) if (length(x = points) == 0) { stop("Cannot find points provided") } labels <- labels %||% points labels <- as.character(x = labels) label.data <- plot$data[points, ] label.data$labels <- labels geom.use <- ifelse(test = repel, yes = geom_text_repel, no = geom_text) if (repel) { if (!all(c(xnudge, ynudge) == 0)) { message("When using repel, set xnudge and ynudge to 0 for optimal results") } } plot <- plot + geom.use( mapping = aes_string(x = xynames$x, y = xynames$y, label = 'labels'), data = label.data, nudge_x = xnudge, nudge_y = ynudge, ... ) return(plot) } #' @name contrast-theory #' @rdname contrast-theory #' #' @importFrom grDevices col2rgb #' #' @export #' @concept visualization #' #' @examples #' Luminance(color = c('black', 'white', '#E76BF3')) #' Luminance <- function(color) { luminance <- apply( X = col2rgb(col = color), MARGIN = 2, function(col) { col <- as.vector(x = col) / 255 col <- sapply( X = col, FUN = function(x) { return(ifelse( test = x <= 0.03928, yes = x / 12.92, no = ((x + 0.055) / 1.055) ^ 2.4 )) } ) col <- rbind(col, c(0.2126, 0.7152, 0.0722)) return(sum(apply(X = col, MARGIN = 2, FUN = prod))) } ) names(x = luminance) <- color return(luminance) } #' @export #' @concept visualization #' #' @rdname CustomPalette #' @aliases PurpleAndYellow #' #' @examples #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' plot(df, col = PurpleAndYellow()) #' PurpleAndYellow <- function(k = 50) { return(CustomPalette(low = "magenta", high = "yellow", mid = "black", k = k)) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Seurat themes #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Seurat Themes #' #' Various themes to be applied to ggplot2-based plots #' \describe{ #' \item{\code{SeuratTheme}}{The curated Seurat theme, consists of ...} #' \item{\code{DarkTheme}}{A dark theme, axes and text turn to white, the background becomes black} #' \item{\code{NoAxes}}{Removes axis lines, text, and ticks} #' \item{\code{NoLegend}}{Removes the legend} #' \item{\code{FontSize}}{Sets axis and title font sizes} #' \item{\code{NoGrid}}{Removes grid lines} #' \item{\code{SeuratAxes}}{Set Seurat-style axes} #' \item{\code{SpatialTheme}}{A theme designed for spatial visualizations (eg \code{\link{PolyFeaturePlot}}, \code{\link{PolyDimPlot}})} #' \item{\code{RestoreLegend}}{Restore a legend after removal} #' \item{\code{RotatedAxis}}{Rotate X axis text 45 degrees} #' \item{\code{BoldTitle}}{Enlarges and emphasizes the title} #' } #' #' @param ... Extra parameters to be passed to \code{theme} #' #' @return A ggplot2 theme object #' #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @seealso \code{\link[ggplot2]{theme}} #' @aliases SeuratTheme #' SeuratTheme <- function() { return(DarkTheme() + NoLegend() + NoGrid() + SeuratAxes()) } #' @importFrom ggplot2 theme element_text #' #' @rdname SeuratTheme #' @export #' @concept visualization #' #' @aliases CenterTitle #' CenterTitle <- function(...) { return(theme(plot.title = element_text(hjust = 0.5), validate = TRUE, ...)) } #' @importFrom ggplot2 theme element_rect element_text element_line margin #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases DarkTheme #' #' @examples #' # Generate a plot with a dark theme #' library(ggplot2) #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) #' p + DarkTheme(legend.position = 'none') #' DarkTheme <- function(...) { # Some constants for easier changing in the future black.background <- element_rect(fill = 'black') black.background.no.border <- element_rect(fill = 'black', size = 0) font.margin <- 4 white.text <- element_text( colour = 'white', margin = margin( t = font.margin, r = font.margin, b = font.margin, l = font.margin ) ) white.line <- element_line(colour = 'white', size = 1) no.line <- element_line(size = 0) # Create the dark theme dark.theme <- theme( # Set background colors plot.background = black.background, panel.background = black.background, legend.background = black.background, legend.box.background = black.background.no.border, legend.key = black.background.no.border, strip.background = element_rect(fill = 'grey50', colour = NA), # Set text colors plot.title = white.text, plot.subtitle = white.text, axis.title = white.text, axis.text = white.text, legend.title = white.text, legend.text = white.text, strip.text = white.text, # Set line colors axis.line.x = white.line, axis.line.y = white.line, panel.grid = no.line, panel.grid.minor = no.line, # Validate the theme validate = TRUE, # Extra parameters ... ) return(dark.theme) } #' @param x.text,y.text X and Y axis text sizes #' @param x.title,y.title X and Y axis title sizes #' @param main Plot title size #' #' @importFrom ggplot2 theme element_text #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases FontSize #' FontSize <- function( x.text = NULL, y.text = NULL, x.title = NULL, y.title = NULL, main = NULL, ... ) { font.size <- theme( # Set font sizes axis.text.x = element_text(size = x.text), axis.text.y = element_text(size = y.text), axis.title.x = element_text(size = x.title), axis.title.y = element_text(size = y.title), plot.title = element_text(size = main), # Validate the theme validate = TRUE, # Extra parameters ... ) } #' @param keep.text Keep axis text #' @param keep.ticks Keep axis ticks #' #' @importFrom ggplot2 theme element_blank #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases NoAxes #' #' @examples #' # Generate a plot with no axes #' library(ggplot2) #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) #' p + NoAxes() #' NoAxes <- function(..., keep.text = FALSE, keep.ticks = FALSE) { blank <- element_blank() no.axes.theme <- theme( # Remove the axis elements axis.line.x = blank, axis.line.y = blank, # Validate the theme validate = TRUE, ... ) if (!keep.text) { no.axes.theme <- no.axes.theme + theme( axis.text.x = blank, axis.text.y = blank, axis.title.x = blank, axis.title.y = blank, validate = TRUE, ... ) } if (!keep.ticks){ no.axes.theme <- no.axes.theme + theme( axis.ticks.x = blank, axis.ticks.y = blank, validate = TRUE, ... ) } return(no.axes.theme) } #' @importFrom ggplot2 theme #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases NoLegend #' #' @examples #' # Generate a plot with no legend #' library(ggplot2) #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) #' p + NoLegend() #' NoLegend <- function(...) { no.legend.theme <- theme( # Remove the legend legend.position = 'none', # Validate the theme validate = TRUE, ... ) return(no.legend.theme) } #' @importFrom ggplot2 theme element_blank #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases NoGrid #' #' @examples #' # Generate a plot with no grid lines #' library(ggplot2) #' df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) #' p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) #' p + NoGrid() #' NoGrid <- function(...) { no.grid.theme <- theme( # Set grid lines to blank panel.grid.major = element_blank(), panel.grid.minor = element_blank(), # Validate the theme validate = TRUE, ... ) return(no.grid.theme) } #' @importFrom ggplot2 theme element_text #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases SeuratAxes #' SeuratAxes <- function(...) { axes.theme <- theme( # Set axis things axis.title = element_text(face = 'bold', color = '#990000', size = 16), axis.text = element_text(vjust = 0.5, size = 12), # Validate the theme validate = TRUE, ... ) return(axes.theme) } #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases SpatialTheme #' SpatialTheme <- function(...) { return(DarkTheme() + NoAxes() + NoGrid() + NoLegend(...)) } #' @param position A position to restore the legend to #' #' @importFrom ggplot2 theme #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases RestoreLegend #' RestoreLegend <- function(..., position = 'right') { restored.theme <- theme( # Restore legend position legend.position = 'right', # Validate the theme validate = TRUE, ... ) return(restored.theme) } #' @importFrom ggplot2 theme element_text #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases RotatedAxis #' RotatedAxis <- function(...) { rotated.theme <- theme( # Rotate X axis text axis.text.x = element_text(angle = 45, hjust = 1), # Validate the theme validate = TRUE, ... ) return(rotated.theme) } #' @importFrom ggplot2 theme element_text #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases BoldTitle #' BoldTitle <- function(...) { bold.theme <- theme( # Make the title bold plot.title = element_text(size = 20, face = 'bold'), # Validate the theme validate = TRUE, ... ) return(bold.theme) } #' @importFrom ggplot2 theme element_rect #' @export #' @concept visualization #' #' @rdname SeuratTheme #' @aliases WhiteBackground #' WhiteBackground <- function(...) { white.rect = element_rect(fill = 'white') white.theme <- theme( # Make the plot, panel, and legend key backgrounds white plot.background = white.rect, panel.background = white.rect, legend.key = white.rect, # Validate the theme validate = TRUE, ... ) return(white.theme) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Fortify Methods #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Prepare Coordinates for Spatial Plots #' #' @inheritParams SeuratObject::GetTissueCoordinates #' @param model A \code{\link[SeuratObject:Segmentation-class]{Segmentation}}, #' \code{\link[SeuratObject:Centroids-class]{Centroids}}, #' or \code{\link[SeuratObject:Molecules-class]{Molecules}} object #' @param data Extra data to be used for annotating the cell segmentations; the #' easiest way to pass data is a one-column #' \code{\link[base:data.frame]{data frame}} with the values to color by and #' the cell names are rownames #' @param ... Arguments passed to other methods #' #' @name fortify-Spatial #' @rdname fortify-Spatial #' #' @importFrom SeuratObject GetTissueCoordinates #' #' @keywords internal #' #' @method fortify Centroids #' @export #' #' @aliases fortify #' fortify.Centroids <- function(model, data, ...) { df <- GetTissueCoordinates(object = model, full = FALSE) if (missing(x = data)) { data <- NULL } data <- .PrepImageData(data = data, cells = lengths(x = model), ...) df <- cbind(df, data) return(df) } #' @rdname fortify-Spatial #' @method fortify Molecules #' #' @importFrom SeuratObject FetchData #' #' @export #' fortify.Molecules <- function( model, data, nmols = NULL, seed = NA_integer_, ... ) { return(FetchData(object = model, vars = data, nmols = nmols, seed = seed, ...)) } #' @rdname fortify-Spatial #' @method fortify Segmentation #' @export #' fortify.Segmentation <- function(model, data, ...) { df <- GetTissueCoordinates(object = model, full = TRUE) if (missing(x = data)) { data <- NULL } data <- .PrepImageData(data = data, cells = lengths(x = model), ...) df <- cbind(df, data) return(df) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @importFrom SeuratObject Features Key Keys Molecules #' .MolsByFOV <- function(object, fov, molecules) { keys <- Key(object = object)[fov] keyed.mols <- sapply( X = names(x = keys), FUN = function(img) { if (is.null(x = Molecules(object = object[[img]]))) { return(NULL) } key <- keys[img] mols <- grep(pattern = paste0('^', key), x = molecules, value = TRUE) names(x = mols) <- mols mols <- gsub(pattern = paste0('^', key), replacement = '', x = mols) keyed <- sapply( X = SeuratObject::Keys(object = object[[img]]), FUN = function(x) { return(grep(pattern = paste0('^', x), x = mols, value = TRUE)) } ) keyed <- unlist(x = keyed) names(x = keyed) <- gsub( pattern = '^.*\\.', replacement = '', x = names(x = keyed) ) missing <- mols[!mols %in% keyed] missing <- missing[missing %in% Features(x = object[[img]])] if (length(x = missing)) { # TODO: replace with default molecules default <- Molecules(object = object[[img]])[1L] mn <- names(x = missing) missing <- paste0( SeuratObject::Key(object = object[[img]][[default]]), missing ) names(x = missing) <- mn } return(c(missing, keyed)) }, simplify = FALSE, USE.NAMES = TRUE ) found <- names(x = unlist(x = keyed.mols)) found <- gsub(pattern = '^.*\\.', replacement = '', x = found) missing <- setdiff(x = molecules, y = found) names(x = missing) <- missing for (img in fov) { imissing <- missing for (i in seq_along(along.with = imissing)) { for (lkey in Keys(object = object[[img]])) { imissing[[i]] <- gsub( pattern = paste0('^', lkey), replacement = '', x = imissing[[i]] ) } } imissing <- names(x = imissing[imissing %in% Features(x = object[[img]])]) keyed.mols[[img]] <- c(keyed.mols[[img]], imissing) } keyed.mols <- Filter(f = length, x = keyed.mols) keyed.mols <- sapply(X = keyed.mols, FUN = unname, simplify = FALSE) return(keyed.mols) } # Calculate bandwidth for use in ggplot2-based smooth scatter plots # # Inspired by MASS::bandwidth.nrd and graphics:::.smoothScatterCalcDensity # # @param data A two-column data frame with X and Y coordinates for a plot # # @return The calculated bandwidth # #' @importFrom stats quantile var # Bandwidth <- function(data) { r <- diff(x = apply( X = data, MARGIN = 2, FUN = quantile, probs = c(0.05, 0.95), na.rm = TRUE, names = FALSE )) h <- abs(x = r[2L] - r[1L]) / 1.34 h <- ifelse(test = h == 0, yes = 1, no = h) bandwidth <- 4 * 1.06 * min(sqrt(x = apply(X = data, MARGIN = 2, FUN = var)), h) * nrow(x = data) ^ (-0.2) return(bandwidth) } # Blend expression values together # # @param data A two-column data frame with expression values for two features # # @return A three-column data frame with transformed and blended expression values # BlendExpression <- function(data) { if (ncol(x = data) != 2) { stop("'BlendExpression' only blends two features") } features <- colnames(x = data) data <- as.data.frame(x = apply( X = data, MARGIN = 2, FUN = function(x) { return(round(x = 9 * (x - min(x)) / (max(x) - min(x)))) } )) data[, 3] <- data[, 1] + data[, 2] * 10 colnames(x = data) <- c(features, paste(features, collapse = '_')) for (i in 1:ncol(x = data)) { data[, i] <- factor(x = data[, i]) } return(data) } # Create a heatmap of blended colors # # @param color.matrix A color matrix of blended colors # # @return A ggplot object # #' @importFrom grid unit #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 ggplot aes_string scale_fill_manual geom_raster #' theme scale_y_continuous scale_x_continuous scale_fill_manual # # @seealso \code{\link{BlendMatrix}} # BlendMap <- function(color.matrix) { color.heat <- matrix( data = 1:prod(dim(x = color.matrix)) - 1, nrow = nrow(x = color.matrix), ncol = ncol(x = color.matrix), dimnames = list( 1:nrow(x = color.matrix), 1:ncol(x = color.matrix) ) ) xbreaks <- seq.int(from = 0, to = nrow(x = color.matrix), by = 2) ybreaks <- seq.int(from = 0, to = ncol(x = color.matrix), by = 2) color.heat <- Melt(x = color.heat) color.heat$rows <- as.numeric(x = as.character(x = color.heat$rows)) color.heat$cols <- as.numeric(x = as.character(x = color.heat$cols)) color.heat$vals <- factor(x = color.heat$vals) plot <- ggplot( data = color.heat, mapping = aes_string(x = 'rows', y = 'cols', fill = 'vals') ) + geom_raster(show.legend = FALSE) + theme(plot.margin = unit(x = rep.int(x = 0, times = 4), units = 'cm')) + scale_x_continuous(breaks = xbreaks, expand = c(0, 0), labels = xbreaks) + scale_y_continuous(breaks = ybreaks, expand = c(0, 0), labels = ybreaks) + scale_fill_manual(values = as.vector(x = color.matrix)) + theme_cowplot() return(plot) } # Create a color matrix of blended colors # # @param n Dimensions of blended matrix (n x n) # @param col.threshold The color cutoff from weak signal to strong signal; ranges from 0 to 1. # @param two.colors Two colors used for the blend expression. # # @return An n x n matrix of blended colors # #' @importFrom grDevices col2rgb # BlendMatrix <- function( n = 10, col.threshold = 0.5, two.colors = c("#ff0000", "#00ff00"), negative.color = "black" ) { if (0 > col.threshold || col.threshold > 1) { stop("col.threshold must be between 0 and 1") } C0 <- as.vector(col2rgb(negative.color, alpha = TRUE)) C1 <- as.vector(col2rgb(two.colors[1], alpha = TRUE)) C2 <- as.vector(col2rgb(two.colors[2], alpha = TRUE)) blend_alpha <- (C1[4] + C2[4])/2 C0 <- C0[-4] C1 <- C1[-4] C2 <- C2[-4] merge.weight <- min(255 / (C1 + C2 + C0 + 0.01)) sigmoid <- function(x) { return(1 / (1 + exp(-x))) } blend_color <- function( i, j, col.threshold, n, C0, C1, C2, alpha, merge.weight ) { c.min <- sigmoid(5 * (1 / n - col.threshold)) c.max <- sigmoid(5 * (1 - col.threshold)) c1_weight <- sigmoid(5 * (i / n - col.threshold)) c2_weight <- sigmoid(5 * (j / n - col.threshold)) c0_weight <- sigmoid(5 * ((i + j) / (2 * n) - col.threshold)) c1_weight <- (c1_weight - c.min) / (c.max - c.min) c2_weight <- (c2_weight - c.min) / (c.max - c.min) c0_weight <- (c0_weight - c.min) / (c.max - c.min) C1_length <- sqrt(sum((C1 - C0) ** 2)) C2_length <- sqrt(sum((C2 - C0) ** 2)) C1_unit <- (C1 - C0) / C1_length C2_unit <- (C2 - C0) / C2_length C1_weight <- C1_unit * c1_weight C2_weight <- C2_unit * c2_weight C_blend <- C1_weight * (i - 1) * C1_length / (n - 1) + C2_weight * (j - 1) * C2_length / (n - 1) + (i - 1) * (j - 1) * c0_weight * C0 / (n - 1) ** 2 + C0 C_blend[C_blend > 255] <- 255 C_blend[C_blend < 0] <- 0 return(rgb( red = C_blend[1], green = C_blend[2], blue = C_blend[3], alpha = alpha, maxColorValue = 255 )) } blend_matrix <- matrix(nrow = n, ncol = n) for (i in 1:n) { for (j in 1:n) { blend_matrix[i, j] <- blend_color( i = i, j = j, col.threshold = col.threshold, n = n, C0 = C0, C1 = C1, C2 = C2, alpha = blend_alpha, merge.weight = merge.weight ) } } return(blend_matrix) } # Convert R colors to hexadecimal # # @param ... R colors # # @return The hexadecimal representations of input colors # #' @importFrom grDevices rgb col2rgb # Col2Hex <- function(...) { colors <- as.character(x = c(...)) alpha <- rep.int(x = 255, times = length(x = colors)) if (sum(sapply(X = colors, FUN = grepl, pattern = '^#')) != 0) { hex <- colors[which(x = grepl(pattern = '^#', x = colors))] hex.length <- sapply(X = hex, FUN = nchar) if (9 %in% hex.length) { hex.alpha <- hex[which(x = hex.length == 9)] hex.vals <- sapply(X = hex.alpha, FUN = substr, start = 8, stop = 9) dec.vals <- sapply(X = hex.vals, FUN = strtoi, base = 16) alpha[match(x = hex[which(x = hex.length == 9)], table = colors)] <- dec.vals } } colors <- t(x = col2rgb(col = colors)) colors <- mapply( FUN = function(i, alpha) { return(rgb(colors[i, , drop = FALSE], alpha = alpha, maxColorValue = 255)) }, i = 1:nrow(x = colors), alpha = alpha ) return(colors) } # Plot feature expression by identity # # Basically combines the codebase for VlnPlot and RidgePlot # # @param object Seurat object # @param type Plot type, choose from 'ridge', 'violin', or 'splitViolin' # @param features Features to plot (gene expression, metrics, PC scores, # anything that can be retreived by FetchData) # @param idents Which classes to include in the plot (default is all) # @param ncol Number of columns if multiple plots are displayed # @param sort Sort identity classes (on the x-axis) by the average expression of the attribute being potted, # or, if stack is True, sort both identity classes and features by hierarchical clustering # @param y.max Maximum y axis value # @param same.y.lims Set all the y-axis limits to the same values # @param adjust Adjust parameter for geom_violin # @param pt.size Point size for points # @param alpha Alpha value for points # @param cols Colors to use for plotting # @param group.by Group (color) cells in different ways (for example, orig.ident) # @param split.by A variable to split the plot by # @param log plot Y axis on log scale # @param slot Slot to pull expression data from (e.g. "counts" or "data") # @param stack Horizontally stack plots for multiple feature # @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} # ggplot object. If \code{FALSE}, return a list of ggplot objects # @param fill.by Color violins/ridges based on either 'feature' or 'ident' # @param flip flip plot orientation (identities on x-axis) # @param add.noise determine if adding a small noise for plotting # @param raster Convert points to raster format, default is \code{NULL} which # automatically rasterizes if plotting more than 100,000 cells # # @return A \code{\link[patchwork]{patchwork}ed} ggplot object if # \code{combine = TRUE}; otherwise, a list of ggplot objects # #' @importFrom scales hue_pal #' @importFrom ggplot2 xlab ylab #' @importFrom patchwork wrap_plots # ExIPlot <- function( object, features, type = 'violin', idents = NULL, ncol = NULL, sort = FALSE, assay = NULL, y.max = NULL, same.y.lims = FALSE, adjust = 1, cols = NULL, pt.size = 0, alpha = 1, group.by = NULL, split.by = NULL, log = FALSE, slot = deprecated(), layer = 'data', stack = FALSE, combine = TRUE, fill.by = NULL, flip = FALSE, add.noise = TRUE, raster = NULL ) { if (is_present(arg = slot)) { layer <- layer %||% slot } assay <- assay %||% DefaultAssay(object = object) DefaultAssay(object = object) <- assay cells <- Cells(x = object, assay = NULL) if (isTRUE(x = stack)) { if (!is.null(x = ncol)) { warning( "'ncol' is ignored with 'stack' is TRUE", call. = FALSE, immediate. = TRUE ) } if (!is.null(x = y.max)) { warning( "'y.max' is ignored when 'stack' is TRUE", call. = FALSE, immediate. = TRUE ) } } else { ncol <- ncol %||% ifelse( test = length(x = features) > 9, yes = 4, no = min(length(x = features), 3) ) } if (!is.null(x = idents)) { cells <- intersect( x = names(x = Idents(object = object)[Idents(object = object) %in% idents]), y = cells ) } data <- FetchData(object = object, vars = features, slot = layer, cells = cells) pt.size <- pt.size %||% AutoPointSize(data = object) features <- colnames(x = data) data <- data[cells, , drop = FALSE] idents <- if (is.null(x = group.by)) { Idents(object = object)[cells] } else { object[[group.by, drop = TRUE]][cells] } if (!is.factor(x = idents)) { idents <- factor(x = idents) } if (is.null(x = split.by)) { split <- NULL } else { split <- FetchData(object,split.by)[cells,split.by] if (!is.factor(x = split)) { split <- factor(x = split) } if (is.null(x = cols)) { cols <- hue_pal()(length(x = levels(x = idents))) cols <- Interleave(cols, InvertHex(hexadecimal = cols)) } else if (length(x = cols) == 1 && cols == 'interaction') { split <- interaction(idents, split) cols <- hue_pal()(length(x = levels(x = idents))) } else { cols <- Col2Hex(cols) } if (length(x = cols) < length(x = levels(x = split))) { cols <- Interleave(cols, InvertHex(hexadecimal = cols)) } cols <- rep_len(x = cols, length.out = length(x = levels(x = split))) names(x = cols) <- levels(x = split) if ((length(x = cols) > 2) & (type == "splitViolin")) { warning("Split violin is only supported for <3 groups, using multi-violin.") type <- "violin" } } if (same.y.lims && is.null(x = y.max)) { y.max <- max(data) } if (isTRUE(x = stack)) { return(MultiExIPlot( type = type, data = data, idents = idents, split = split, sort = sort, same.y.lims = same.y.lims, adjust = adjust, cols = cols, pt.size = pt.size, log = log, fill.by = fill.by, add.noise = add.noise, flip = flip )) } plots <- lapply( X = features, FUN = function(x) { return(SingleExIPlot( type = type, data = data[, x, drop = FALSE], idents = idents, split = split, sort = sort, y.max = y.max, adjust = adjust, cols = cols, pt.size = pt.size, alpha = alpha, log = log, add.noise = add.noise, raster = raster )) } ) label.fxn <- switch( EXPR = type, 'violin' = if (stack) { xlab } else { ylab }, "splitViolin" = if (stack) { xlab } else { ylab }, 'ridge' = xlab, stop("Unknown ExIPlot type ", type, call. = FALSE) ) for (i in 1:length(x = plots)) { key <- paste0(unlist(x = strsplit(x = features[i], split = '_'))[1], '_') obj <- names(x = which(x = Key(object = object) == key)) if (length(x = obj) == 1) { if (inherits(x = object[[obj]], what = 'DimReduc')) { plots[[i]] <- plots[[i]] + label.fxn(label = 'Embeddings Value') } else if (inherits(x = object[[obj]], what = 'Assay') || inherits(x = object[[obj]], what = 'Assay5')) { next } else { warning("Unknown object type ", class(x = object), immediate. = TRUE, call. = FALSE) plots[[i]] <- plots[[i]] + label.fxn(label = NULL) } } else if (!features[i] %in% rownames(x = object)) { plots[[i]] <- plots[[i]] + label.fxn(label = NULL) } } if (combine) { plots <- wrap_plots(plots, ncol = ncol) if (length(x = features) > 1) { plots <- plots & NoLegend() } } return(plots) } # Make a theme for facet plots # # @inheritParams SeuratTheme # @export # # @rdname SeuratTheme # @aliases FacetTheme # FacetTheme <- function(...) { return(theme( strip.background = element_blank(), strip.text = element_text(face = 'bold'), # Validate the theme validate = TRUE, ... )) } #' @importFrom RColorBrewer brewer.pal #' @importFrom grDevices colorRampPalette #' #' SpatialColors <- colorRampPalette(colors = rev(x = brewer.pal(n = 11, name = "Spectral"))) # Feature plot palettes # FeaturePalettes <- list( 'Spatial' = SpatialColors(n = 100), 'Seurat' = c('lightgrey', 'blue') ) # Splits features into groups based on log expression levels # # @param object Seurat object # @param assay Assay for expression data # @param min.cells Only compute for features in at least this many cells # @param ngroups Number of groups to split into # # @return A Seurat object with the feature group stored as a factor in # metafeatures # #' @importFrom Matrix rowMeans rowSums # GetFeatureGroups <- function(object, assay, min.cells = 5, ngroups = 6) { cm <- GetAssayData(object = object[[assay]], slot = "counts") # subset to keep only genes detected in at least min.cells cells cm <- cm[rowSums(cm > 0) >= min.cells, ] # use the geometric mean of the features to group them # (using the arithmetic mean would usually not change things much) # could use sctransform:::row_gmean here but not exported feature.gmean <- exp(x = rowMeans(log1p(x = cm))) - 1 feature.grp.breaks <- seq( from = min(log10(x = feature.gmean)) - 10*.Machine$double.eps, to = max(log10(x = feature.gmean)), length.out = ngroups + 1 ) feature.grp <- cut( x = log10(x = feature.gmean), breaks = feature.grp.breaks, ordered_result = TRUE ) feature.grp <- factor( x = feature.grp, levels = rev(x = levels(x = feature.grp)), ordered = TRUE ) names(x = feature.grp) <- names(x = feature.gmean) return(feature.grp) } # Get X and Y aesthetics from a plot for a certain geom # # @param plot A ggplot2 object # @param geom Geom class to filter to # @param plot.first Use plot-wide X/Y aesthetics before geom-specific aesthetics # # @return A named list with values 'x' for the name of the x aesthetic and 'y' for the y aesthetic # #' @importFrom rlang as_label # GetXYAesthetics <- function(plot, geom = 'GeomPoint', plot.first = TRUE) { geoms <- sapply( X = plot$layers, FUN = function(layer) { return(class(x = layer$geom)[1]) } ) # handle case where raster is set to True if (geom == "GeomPoint" && "GeomScattermore" %in% geoms){ geom <- "GeomScattermore" } geoms <- which(x = geoms == geom) if (length(x = geoms) == 0) { stop("Cannot find a geom of class ", geom) } geoms <- min(geoms) if (plot.first) { # x <- as.character(x = plot$mapping$x %||% plot$layers[[geoms]]$mapping$x)[2] x <- as_label(x = plot$mapping$x %||% plot$layers[[geoms]]$mapping$x) # y <- as.character(x = plot$mapping$y %||% plot$layers[[geoms]]$mapping$y)[2] y <- as_label(x = plot$mapping$y %||% plot$layers[[geoms]]$mapping$y) } else { x <- as_label(x = plot$layers[[geoms]]$mapping$x %||% plot$mapping$x) y <- as_label(x = plot$layers[[geoms]]$mapping$y %||% plot$mapping$y) } return(list('x' = x, 'y' = y)) } # For plotting the tissue image #' @importFrom ggplot2 ggproto Geom aes ggproto_parent alpha draw_key_point #' @importFrom grid unit gpar editGrob pointsGrob viewport gTree addGrob grobName #' GeomSpatial <- ggproto( "GeomSpatial", Geom, required_aes = c("x", "y"), extra_params = c("na.rm", "image", "image.alpha", "image.scale", "crop"), default_aes = aes( shape = 21, colour = "black", point.size.factor = 1.0, fill = NA, alpha = NA, stroke = NA ), setup_data = function(self, data, params) { data <- ggproto_parent(Geom, self)$setup_data(data, params) # We need to flip the image as the Y coordinates are reversed data$y = max(data$y) - data$y + min(data$y) data }, draw_key = draw_key_point, draw_panel = function(data, panel_scales, coord, image, image.alpha, image.scale, crop) { img.dim <- dim(image) # This should be in native units, where # Locations and sizes are relative to the x- and yscales for the current viewport. if (!crop) { y.transform <- c(0, img.dim[[1]]) - panel_scales$y.range data$y <- data$y + sum(y.transform) panel_scales$x$continuous_range <- c(0, img.dim[[2]]) panel_scales$y$continuous_range <- c(0, img.dim[[1]]) panel_scales$y.range <- c(0, img.dim[[1]]) panel_scales$x.range <- c(0, img.dim[[2]]) } z <- coord$transform( data.frame(x = c(0, img.dim[[2]]), y = c(0, img.dim[[1]])), panel_scales ) # Flip Y axis for image z$y <- -rev(z$y) + 1 wdth <- z$x[2] - z$x[1] hgth <- z$y[2] - z$y[1] vp <- viewport( x = unit(x = z$x[1], units = "npc"), y = unit(x = z$y[1], units = "npc"), width = unit(x = wdth, units = "npc"), height = unit(x = hgth, units = "npc"), just = c("left", "bottom") ) spot.size <- Radius(object = image, scale = image.scale) coords <- coord$transform(data, panel_scales) img <- editGrob(grob = GetImage(image), vp = vp) pts <- pointsGrob( x = coords$x, y = coords$y, pch = data$shape, size = unit(spot.size, "npc") * data$point.size.factor, gp = gpar( col = alpha(colour = coords$colour, alpha = coords$alpha), fill = alpha(colour = coords$fill, alpha = coords$alpha), lwd = coords$stroke) ) vp <- viewport() gt <- gTree(vp = vp) if (image.alpha > 0) { if (image.alpha != 1) { img$raster = as.raster( x = matrix( data = alpha(colour = img$raster, alpha = image.alpha), nrow = nrow(x = img$raster), ncol = ncol(x = img$raster), byrow = TRUE) ) } gt <- addGrob(gTree = gt, child = img) } gt <- addGrob(gTree = gt, child = pts) # Replacement for ggname gt$name <- grobName(grob = gt, prefix = 'geom_spatial') return(gt) } ) # influenced by: https://stackoverflow.com/questions/49475201/adding-tables-to-ggplot2-with-facet-wrap-in-r # https://ggplot2.tidyverse.org/articles/extending-ggplot2.html #' @importFrom ggplot2 layer #' #' geom_spatial <- function( mapping = NULL, data = NULL, image = image, image.alpha = image.alpha, image.scale = image.scale, crop = crop, stat = "identity", position = "identity", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ... ) { layer( geom = GeomSpatial, mapping = mapping, data = data, stat = stat, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( na.rm = na.rm, image = image, image.alpha = image.alpha, image.scale = image.scale, crop = crop, ... ) ) } #' @importFrom grid viewport editGrob grobName #' @importFrom ggplot2 ggproto Geom ggproto_parent # GeomSpatialInteractive <- ggproto( "GeomSpatialInteractive", Geom, setup_data = function(self, data, params) { data <- ggproto_parent(parent = Geom, self = self)$setup_data(data, params) data }, draw_group = function(data, panel_scales, coord) { vp <- viewport(x = data$x, y = data$y) g <- editGrob(grob = data$grob[[1]], vp = vp) # Replacement for ggname g$name <- grobName(grob = g, prefix = 'geom_spatial_interactive') return(g) # return(ggname(prefix = "geom_spatial", grob = g)) }, required_aes = c("grob","x","y") ) #' @importFrom ggplot2 layer # geom_spatial_interactive <- function( mapping = NULL, data = NULL, stat = "identity", position = "identity", na.rm = FALSE, show.legend = NA, inherit.aes = FALSE, ... ) { layer( geom = GeomSpatialInteractive, mapping = mapping, data = data, stat = stat, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list(na.rm = na.rm, ...) ) } # A split violin plot geom # #' @importFrom scales zero_range #' @importFrom ggplot2 GeomPolygon #' @importFrom grid grobTree grobName # # @author jan-glx on StackOverflow # @references \url{https://stackoverflow.com/questions/35717353/split-violin-plot-with-ggplot2} # @seealso \code{\link[ggplot2]{geom_violin}} # GeomSplitViolin <- ggproto( "GeomSplitViolin", GeomViolin, # setup_data = function(data, params) { # data$width <- data$width %||% params$width %||% (resolution(data$x, FALSE) * 0.9) # data <- plyr::ddply(data, "group", transform, xmin = x - width/2, xmax = x + width/2) # e <- globalenv() # name <- paste(sample(x = letters, size = 5), collapse = '') # message("Saving initial data to ", name) # e[[name]] <- data # return(data) # }, draw_group = function(self, data, ..., draw_quantiles = NULL) { data$xminv <- data$x - data$violinwidth * (data$x - data$xmin) data$xmaxv <- data$x + data$violinwidth * (data$xmax - data$x) grp <- data[1, 'group'] if (grp %% 2 == 1) { data$x <- data$xminv data.order <- data$y } else { data$x <- data$xmaxv data.order <- -data$y } newdata <- data[order(data.order), , drop = FALSE] newdata <- rbind( newdata[1, ], newdata, newdata[nrow(x = newdata), ], newdata[1, ] ) newdata[c(1, nrow(x = newdata) - 1, nrow(x = newdata)), 'x'] <- round(x = newdata[1, 'x']) grob <- if (length(x = draw_quantiles) > 0 & !zero_range(x = range(data$y))) { stopifnot(all(draw_quantiles >= 0), all(draw_quantiles <= 1)) quantiles <- QuantileSegments(data = data, draw.quantiles = draw_quantiles) aesthetics <- data[rep.int(x = 1, times = nrow(x = quantiles)), setdiff(x = names(x = data), y = c("x", "y")), drop = FALSE] aesthetics$alpha <- rep.int(x = 1, nrow(x = quantiles)) both <- cbind(quantiles, aesthetics) quantile.grob <- GeomPath$draw_panel(both, ...) grobTree(GeomPolygon$draw_panel(newdata, ...), name = quantile.grob) } else { GeomPolygon$draw_panel(newdata, ...) } grob$name <- grobName(grob = grob, prefix = 'geom_split_violin') return(grob) } ) # Create a split violin plot geom # # @inheritParams ggplot2::geom_violin # #' @importFrom ggplot2 layer # # @author jan-glx on StackOverflow # @references \url{https://stackoverflow.com/questions/35717353/split-violin-plot-with-ggplot2} # @seealso \code{\link[ggplot2]{geom_violin}} # geom_split_violin <- function( mapping = NULL, data = NULL, stat = 'ydensity', position = 'identity', ..., draw_quantiles = NULL, trim = TRUE, scale = 'area', na.rm = FALSE, show.legend = NA, inherit.aes = TRUE ) { return(layer( data = data, mapping = mapping, stat = stat, geom = GeomSplitViolin, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( trim = trim, scale = scale, draw_quantiles = draw_quantiles, na.rm = na.rm, ... ) )) } # Convert a ggplot2 scatterplot to base R graphics # # @param plot A ggplot2 scatterplot # @param do.plot Create the plot with base R graphics # @param cols A named vector of column names to pull. Vector names must be 'x', # 'y', 'colour', 'shape', and/or 'size'; vector values must be the names of # columns in plot data that correspond to these values. May pass only values that # differ from the default (eg. \code{cols = c('size' = 'point.size.factor')}) # @param ... Extra parameters passed to PlotBuild # # @return A dataframe with the data that created the ggplot2 scatterplot # #' @importFrom ggplot2 ggplot_build # GGpointToBase <- function( plot, do.plot = TRUE, cols = c( 'x' = 'x', 'y' = 'y', 'colour' = 'colour', 'shape' = 'shape', 'size' = 'size' ), ... ) { plot.build <- ggplot_build(plot = plot) default.cols <- c( 'x' = 'x', 'y' = 'y', 'colour' = 'colour', 'shape' = 'shape', 'size' = 'size' ) cols <- cols %||% default.cols if (is.null(x = names(x = cols))) { if (length(x = cols) > length(x = default.cols)) { warning( "Too many columns provided, selecting only first ", length(x = default.cols), call. = FALSE, immediate. = TRUE ) cols <- cols[1:length(x = default.cols)] } names(x = cols) <- names(x = default.cols)[1:length(x = cols)] } cols <- c( cols[intersect(x = names(x = default.cols), y = names(x = cols))], default.cols[setdiff(x = names(x = default.cols), y = names(x = cols))] ) cols <- cols[names(x = default.cols)] build.use <- which(x = vapply( X = plot.build$data, FUN = function(dat) { return(all(cols %in% colnames(x = dat))) }, FUN.VALUE = logical(length = 1L) )) if (length(x = build.use) == 0) { stop("GGpointToBase only works on geom_point ggplot objects") } build.data <- plot.build$data[[min(build.use)]] plot.data <- build.data[, cols] names(x = plot.data) <- c( plot.build$plot$labels$x, plot.build$plot$labels$y, 'color', 'pch', 'cex' ) if (do.plot) { PlotBuild(data = plot.data, ...) } return(plot.data) } # Convert a ggplot2 scatterplot to plotly graphics # # @inheritParams GGpointToBase # @param information Extra information for hovering # @param ... Ignored # # @return A dataframe with the data that greated the ggplot2 scatterplot #' @importFrom ggplot2 ggplot_build # GGpointToPlotlyBuild <- function( plot, information = NULL, cols = eval(expr = formals(fun = GGpointToBase)$cols), ... ) { CheckDots(...) plot.build <- GGpointToBase(plot = plot, do.plot = FALSE, cols = cols) data <- ggplot_build(plot = plot)$plot$data rownames(x = plot.build) <- rownames(data) # Reset the names to 'x' and 'y' names(x = plot.build) <- c( 'x', 'y', names(x = plot.build)[3:length(x = plot.build)] ) # Add the hover information we're looking for if (is.null(x = information)) { plot.build$feature <- rownames(x = data) } else { info <- apply( X = information, MARGIN = 1, FUN = function(x, names) { return(paste0(names, ': ', x, collapse = '
')) }, names = colnames(x = information) ) data.info <- data.frame( feature = paste(rownames(x = information), info, sep = '
'), row.names = rownames(x = information) ) plot.build <- merge(x = plot.build, y = data.info, by = 0) rownames(x = plot.build) <- plot.build$Row.names plot.build <- plot.build[, which(x = colnames(x = plot.build) != 'Row.names'), drop = FALSE] } return(plot.build) } #' @importFrom stats quantile #' InvertCoordinate <- function(x, MARGIN = 2) { if (!is.null(x = x)) { switch( EXPR = MARGIN, '1' = { rmin <- 'left' rmax <- 'right' cmin <- 'xmin' cmax <- 'xmax' }, '2' = { rmin <- 'bottom' rmax <- 'top' cmin <- 'ymin' cmax <- 'ymax' }, stop("'MARGIN' must be either 1 or 2", call. = FALSE) ) # Fix the range so that rmin becomes rmax and vice versa # Needed for both points and brushes range <- x$range x$range[[rmin]] <- range[[rmax]] x$range[[rmax]] <- range[[rmin]] # Fix the cmin and cmax values, if provided # These are used for brush boundaries coords <- c(x[[cmin]], x[[cmax]]) if (all(!is.null(x = coords))) { names(x = coords) <- c(cmin, cmax) x[[cmin]] <- quantile( x = x$range[[rmin]]:x$range[[rmax]], probs = 1 - (coords[cmax] / x$range[[rmax]]), names = FALSE ) x[[cmax]] <- quantile( x = x$range[[rmin]]:x$range[[rmax]], probs = 1 - (coords[cmin] / x$range[[rmax]]), names = FALSE ) } } return(x) } # Invert a Hexadecimal color # # @param hexadecimal A character vector of hexadecimal colors # # @return Hexadecimal representations of the inverted color # # @author Matt Lagrandeur # @references \url{http://www.mattlag.com/scripting/hexcolorinverter.php} # InvertHex <- function(hexadecimal) { return(vapply( X = toupper(x = hexadecimal), FUN = function(hex) { hex <- unlist(x = strsplit( x = gsub(pattern = '#', replacement = '', x = hex), split = '' )) key <- toupper(x = as.hexmode(x = 15:0)) if (!all(hex %in% key)) { stop('All hexadecimal colors must be valid hexidecimal numbers from 0-9 and A-F') } if (length(x = hex) == 8) { alpha <- hex[7:8] hex <- hex[1:6] } else if (length(x = hex) == 6) { alpha <- NULL } else { stop("All hexidecimal colors must be either 6 or 8 characters in length, excluding the '#'") } value <- rev(x = key) inv.hex <- vapply( X = hex, FUN = function(x) { return(value[grep(pattern = x, x = key)]) }, FUN.VALUE = character(length = 1L) ) inv.hex <- paste(inv.hex, collapse = '') return(paste0('#', inv.hex, paste(alpha, collapse = ''))) }, FUN.VALUE = character(length = 1L), USE.NAMES = FALSE )) } # Make label information for ggplot2-based scatter plots # # @param data A three-column data frame (accessed with \code{plot$data}) # The first column should be the X axis, the second the Y, and the third should be grouping information # # @return A dataframe with three columns: centers along the X axis, centers along the Y axis, and group information # #' @importFrom stats median na.omit # MakeLabels <- function(data) { groups <- as.character(x = na.omit(object = unique(x = data[, 3]))) labels <- lapply( X = groups, FUN = function(group) { data.use <- data[data[, 3] == group, 1:2] return(apply(X = data.use, MARGIN = 2, FUN = median, na.rm = TRUE)) } ) names(x = labels) <- groups labels <- as.data.frame(x = t(x = as.data.frame(x = labels))) labels[, colnames(x = data)[3]] <- groups return(labels) } # Plot expression of multiple features by identity on a plot # # @param data Data to plot # @param idents Idents to use # @param type Make either a 'ridge' or 'violin' plot # @param sort Sort identity classes and features based on hierarchical clustering # @param same.y.lims Indicates whether to use the same ylim for each feature # @param adjust Adjust parameter for geom_violin # @param cols Colors to use for plotting # @param log plot Y axis on log scale # @param fill.by Color violins/ridges based on either 'feature' or 'ident' # @param seed.use Random seed to use. If NULL, don't set a seed # @param flip flip plot orientation (identities on x-axis) # # @return A ggplot-based Expression-by-Identity plot # #' @importFrom cowplot theme_cowplot #' @importFrom utils globalVariables #' @importFrom stats rnorm dist hclust #' @importFrom ggridges geom_density_ridges theme_ridges #' @importFrom ggplot2 ggplot aes_string facet_grid theme labs geom_rect #' geom_violin geom_jitter ylim position_jitterdodge scale_fill_manual #' scale_y_log10 scale_x_log10 scale_y_discrete scale_x_continuous #' scale_y_continuous waiver #' MultiExIPlot <- function( data, idents, split = NULL, type = 'violin', sort = FALSE, same.y.lims = same.y.lims, adjust = 1, pt.size = 0, cols = NULL, seed.use = 42, log = FALSE, fill.by = NULL, add.noise = TRUE, flip = NULL ) { if (!(fill.by %in% c("feature", "ident"))) { stop("`fill.by` must be either `feature` or `ident`") } if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (!is.data.frame(x = data) || ncol(x = data) < 2) { stop("MultiExIPlot requires a data frame with >1 column") } data <- Melt(x = data) data <- data.frame( feature = data$cols, expression = data$vals, ident = rep_len(x = idents, length.out = nrow(x = data)) ) if ((is.character(x = sort) && nchar(x = sort) > 0) || sort) { data$feature <- as.vector(x = data$feature) data$ident <- as.vector(x = data$ident) # build matrix of average expression (#-features by #-idents), lexical ordering avgs.matrix <- sapply( X = split(x = data, f = data$ident), FUN = function(df) { return(tapply( X = df$expression, INDEX = df$feature, FUN = mean )) } ) idents.order <- hclust(d = dist(x = t(x = L2Norm(mat = avgs.matrix, MARGIN = 2))))$order avgs.matrix <- avgs.matrix[,idents.order] avgs.matrix <- L2Norm(mat = avgs.matrix, MARGIN = 1) # order feature clusters by position of their "rank-1 idents" position <- apply(X = avgs.matrix, MARGIN = 1, FUN = which.max) mat <- hclust(d = dist(x = avgs.matrix))$merge orderings <- list() for (i in 1:nrow(mat)) { x <- if (mat[i,1] < 0) -mat[i,1] else orderings[[mat[i,1]]] y <- if (mat[i,2] < 0) -mat[i,2] else orderings[[mat[i,2]]] x.pos <- min(x = position[x]) y.pos <- min(x = position[y]) orderings[[i]] <- if (x.pos < y.pos) { c(x, y) } else { c(y, x) } } features.order <- orderings[[length(x = orderings)]] data$feature <- factor( x = data$feature, levels = unique(x = sort(x = data$feature))[features.order] ) data$ident <- factor( x = data$ident, levels = unique(x = sort(x = data$ident))[rev(x = idents.order)] ) } else { data$feature <- factor(x = data$feature, levels = unique(x = data$feature)) } if (log) { noise <- rnorm(n = nrow(x = data)) / 200 data$expression <- data$expression + 1 } else { noise <- rnorm(n = nrow(x = data)) / 100000 } if (!add.noise) { noise <- noise*0 } for (f in unique(x = data$feature)) { if (all(data$expression[(data$feature == f)] == data$expression[(data$feature == f)][1])) { warning( "All cells have the same value of ", f, call. = FALSE, immediate. = TRUE ) } else { data$expression[(data$feature == f)] <- data$expression[(data$feature == f)] + noise[(data$feature == f)] } } if (type == 'violin' && !is.null(x = split)) { data$split <- rep_len(x = split, length.out = nrow(data)) vln.geom <- geom_violin fill.by <- 'split' } else if (type == 'splitViolin' && !is.null(x = split)) { data$split <- rep_len(x = split, length.out = nrow(data)) vln.geom <- geom_split_violin fill.by <- 'split' type <- 'violin' } else { vln.geom <- geom_violin } switch( EXPR = type, 'violin' = { geom <- list(vln.geom(scale = 'width', adjust = adjust, trim = TRUE)) }, 'ridge' = { geom <- list( geom_density_ridges(scale = 4), theme_ridges(), scale_y_discrete(expand = c(0.01, 0)) ) }, stop("Unknown plot type: ", type) ) if (flip) { x <- 'ident' x.label <- 'Identity' y <- 'expression' y.label <- 'Expression Level' } else { y <- 'ident' y.label <- 'Identity' x <- 'expression' x.label <- 'Expression Level' } plot <- ggplot( data = data, mapping = aes_string(x = x, y = y, fill = fill.by)[c(2, 3, 1)] ) + labs(x = x.label, y = y.label, fill = NULL) + theme_cowplot() plot <- do.call(what = '+', args = list(plot, geom)) if (flip) { plot <- plot + scale_y_continuous( expand = c(0, 0), labels = function(x) c(rep(x = '', times = length(x)-2), x[length(x) - 1], '')) + facet_grid(feature ~ ., scales = (if (same.y.lims) 'fixed' else 'free')) + FacetTheme( panel.spacing = unit(0, 'lines'), panel.background = element_rect(fill = NA, color = "black"), axis.text.y = element_text(size = 7), axis.text.x = element_text(angle = 45, hjust = 1), strip.text.y.right = element_text(angle = 0)) } else { plot <- plot + scale_x_continuous( expand = c(0, 0), labels = function(x) c(rep(x = '', times = length(x)-2), x[length(x) - 1], '')) + facet_grid(. ~ feature, scales = (if (same.y.lims) 'fixed' else 'free')) + FacetTheme( panel.spacing = unit(0, 'lines'), panel.background = element_rect(fill = NA, color = "black"), axis.text.x = element_text(size = 7), strip.text.x = element_text(angle = -90)) } if (log) { plot <- plot + scale_x_log10() } if (!is.null(x = cols)) { if (!is.null(x = split)) { idents <- unique(x = as.vector(x = data$ident)) splits <- unique(x = as.vector(x = data$split)) labels <- if (length(x = splits) == 2) { splits } else { unlist(x = lapply( X = idents, FUN = function(pattern, x) { x.mod <- gsub( pattern = paste0(pattern, '.'), replacement = paste0(pattern, ': '), x = x, fixed = TRUE ) x.keep <- grep(pattern = ': ', x = x.mod, fixed = TRUE) x.return <- x.mod[x.keep] names(x = x.return) <- x[x.keep] return(x.return) }, x = unique(x = as.vector(x = data$split)) )) } if (is.null(x = names(x = labels))) { names(x = labels) <- labels } } else { labels <- levels(x = droplevels(data$ident)) } plot <- plot + scale_fill_manual(values = cols, labels = labels) } return(plot) } # Create a scatterplot with data from a ggplot2 scatterplot # # @param plot.data The original ggplot2 scatterplot data # This is taken from ggplot2::ggplot_build # @param dark.theme Plot using a dark theme # @param smooth Use a smooth scatterplot instead of a standard scatterplot # @param ... Extra parameters passed to graphics::plot or graphics::smoothScatter # #' @importFrom graphics axis plot smoothScatter # PlotBuild <- function(data, dark.theme = FALSE, smooth = FALSE, ...) { # Do we use a smooth scatterplot? # Take advantage of functions as first class objects # to dynamically choose normal vs smooth scatterplot myplot <- ifelse(test = smooth, yes = smoothScatter, no = plot) CheckDots(..., fxns = myplot) if (dark.theme) { par(bg = 'black') axes = FALSE col.lab = 'white' } else { axes = 'TRUE' col.lab = 'black' } myplot( data[, c(1, 2)], col = data$color, pch = data$pch, cex = vapply( X = data$cex, FUN = function(x) { return(max(x / 2, 0.5)) }, FUN.VALUE = numeric(1) ), axes = axes, col.lab = col.lab, col.main = col.lab, ... ) if (dark.theme) { axis( side = 1, at = NULL, labels = TRUE, col.axis = col.lab, col = col.lab ) axis( side = 2, at = NULL, labels = TRUE, col.axis = col.lab, col = col.lab ) } } # Locate points on a plot and return them # # @param plot A ggplot2 plot # @param recolor Do we recolor the plot to highlight selected points? # @param dark.theme Plot using a dark theme # @param ... Exptra parameters to PlotBuild # # @return A dataframe of x and y coordinates for points selected # #' @importFrom graphics locator # @importFrom SDMTools pnt.in.poly # PointLocator <- function(plot, recolor = TRUE, dark.theme = FALSE, ...) { .Defunct(new = "CellSelector") # # Convert the ggplot object to a data.frame # PackageCheck('SDMTools') # plot.data <- GGpointToBase(plot = plot, dark.theme = dark.theme, ...) # npoints <- nrow(x = plot.data) # cat("Click around the cluster of points you wish to select\n") # cat("ie. select the vertecies of a shape around the cluster you\n") # cat("are interested in. Press when finished (right click for R-terminal users)\n\n") # polygon <- locator(n = npoints, type = 'l') # polygon <- data.frame(polygon) # # pnt.in.poly returns a data.frame of points # points.all <- SDMTools::pnt.in.poly( # pnts = plot.data[, c(1, 2)], # poly.pnts = polygon # ) # # Find the located points # points.located <- points.all[which(x = points.all$pip == 1), ] # # If we're recoloring, do the recolor # if (recolor) { # no <- ifelse(test = dark.theme, yes = 'white', no = '#C3C3C3') # points.all$color <- ifelse(test = points.all$pip == 1, yes = '#DE2D26', no = no) # plot.data$color <- points.all$color # PlotBuild(data = plot.data, dark.theme = dark.theme, ...) # } # return(points.located[, c(1, 2)]) } # Create quantile segments for quantiles on violin plots in ggplot2 # # @param data Data being plotted # @param draw.quantiles Quantiles to draw # #' @importFrom stats approxfun # # @author Hadley Wickham (I presume) # @seealso \code{\link[ggplot2]{geom_violin}} # QuantileSegments <- function(data, draw.quantiles) { densities <- cumsum(x = data$density) / sum(data$density) ecdf <- approxfun(x = densities, y = data$y) ys <- ecdf(v = draw.quantiles) violin.xminvs <- approxfun(x = data$y, y = data$xminv)(v = ys) violin.xmaxvs <- approxfun(x = data$y, y = data$xmaxv)(v = ys) return(data.frame( x = as.vector(x = t(x = data.frame(violin.xminvs, violin.xmaxvs))), y = rep(x = ys, each = 2), group = rep(x = ys, each = 2) )) } # Scale vector to min and max cutoff values # # @param vec a vector # @param cutoffs A two-length vector of cutoffs to be passed to \code{\link{SetQuantile}} # # @return Returns a vector # ScaleColumn <- function(vec, cutoffs) { if (!length(x = cutoffs) == 2) { stop("Two cutoffs (a low and high) are needed") } cutoffs <- sapply( X = cutoffs, FUN = SetQuantile, data = vec ) vec[vec < min(cutoffs)] <- min(cutoffs) vec[vec > max(cutoffs)] <- max(cutoffs) return(vec) } # Set highlight information # # @param cells.highlight Cells to highlight # @param cells.all A character vector of all cell names # @param sizes.highlight Sizes of cells to highlight # @param cols.highlight Colors to highlight cells as # @param col.base Base color to use for unselected cells # @param pt.size Size of unselected cells # @param raster Convert points to raster format, default is \code{NULL} which # automatically rasterizes if plotting more than 100,000 cells # # @return A list will cell highlight information # \describe{ # \item{plot.order}{An order to plot cells in} # \item{highlight}{A vector giving group information for each cell} # \item{size}{A vector giving size information for each cell} # \item{color}{Colors for highlighting in the order of plot.order} # } # SetHighlight <- function( cells.highlight, cells.all, sizes.highlight, cols.highlight, col.base = 'black', pt.size = 1, raster = NULL ) { if (is.character(x = cells.highlight)) { cells.highlight <- list(cells.highlight) } else if (is.data.frame(x = cells.highlight) || !is.list(x = cells.highlight)) { cells.highlight <- as.list(x = cells.highlight) } cells.highlight <- lapply( X = cells.highlight, FUN = function(cells) { cells.return <- if (is.character(x = cells)) { cells[cells %in% cells.all] } else { cells <- as.numeric(x = cells) cells <- cells[cells <= length(x = cells.all)] cells.all[cells] } return(cells.return) } ) cells.highlight <- Filter(f = length, x = cells.highlight) names.highlight <- if (is.null(x = names(x = cells.highlight))) { paste0('Group_', 1L:length(x = cells.highlight)) } else { names(x = cells.highlight) } sizes.highlight <- rep_len( x = sizes.highlight, length.out = length(x = cells.highlight) ) cols.highlight <- c( col.base, rep_len(x = cols.highlight, length.out = length(x = cells.highlight)) ) size <- rep_len(x = pt.size, length.out = length(x = cells.all)) highlight <- rep_len(x = NA_character_, length.out = length(x = cells.all)) if (length(x = cells.highlight) > 0) { for (i in 1:length(x = cells.highlight)) { cells.check <- cells.highlight[[i]] index.check <- match(x = cells.check, cells.all) highlight[index.check] <- names.highlight[i] size[index.check] <- sizes.highlight[i] } } # Check for raster if (isTRUE(x = raster)) { size <- sizes.highlight[1] } plot.order <- sort(x = unique(x = highlight), na.last = TRUE) plot.order[is.na(x = plot.order)] <- 'Unselected' highlight[is.na(x = highlight)] <- 'Unselected' highlight <- factor(x = highlight, levels = plot.order) return(list( plot.order = plot.order, highlight = highlight, size = size, color = cols.highlight )) } #' @importFrom shiny brushedPoints # ShinyBrush <- function(plot.data, brush, outputs, inverts = character(length = 0L)) {#}, selected = NULL) { selected <- NULL if (!is.null(x = brush)) { if (brush$outputId %in% outputs) { selected <- rownames(x = brushedPoints(df = plot.data, brush = brush)) } else if (brush$outputId %in% inverts) { selected <- rownames(x = brushedPoints( df = plot.data, brush = InvertCoordinate(x = brush) )) } } return(selected) } globalVariables(names = '..density..', package = 'Seurat') #' A single correlation plot #' #' @param data A data frame with two columns to be plotted #' @param col.by A vector or factor of values to color the plot by #' @param cols An optional vector of colors to use #' @param pt.size Point size for the plot #' @param smooth Make a smoothed scatter plot #' @param rows.highlight A vector of rows to highlight (like cells.highlight in #' \code{\link{SingleDimPlot}}) #' @param legend.title Optional legend title #' @param raster Convert points to raster format, default is \code{NULL} #' which will automatically use raster if the number of points plotted is #' greater than 100,000 #' @param raster.dpi the pixel resolution for rastered plots, passed to geom_scattermore(). #' Default is c(512, 512) #' @param plot.cor ... #' @param jitter Jitter for easier visualization of crowded points #' #' @return A ggplot2 object #' #' @importFrom stats cor #' @importFrom cowplot theme_cowplot #' @importFrom RColorBrewer brewer.pal.info #' @importFrom ggplot2 ggplot aes_string geom_point labs scale_color_brewer #' scale_color_manual guides stat_density2d aes scale_fill_continuous #' @importFrom scattermore geom_scattermore #' #' @keywords internal #' #' @export #' SingleCorPlot <- function( data, col.by = NULL, cols = NULL, pt.size = NULL, smooth = FALSE, rows.highlight = NULL, legend.title = NULL, na.value = 'grey50', span = NULL, raster = NULL, raster.dpi = NULL, plot.cor = TRUE, jitter = TRUE ) { pt.size <- pt.size %||% AutoPointSize(data = data, raster = raster) if ((nrow(x = data) > 1e5) & is.null(x = raster)){ message("Rasterizing points since number of points exceeds 100,000.", "\nTo disable this behavior set `raster=FALSE`") } raster <- raster %||% (nrow(x = data) > 1e5) if (!is.null(x = raster.dpi)) { if (!is.numeric(x = raster.dpi) || length(x = raster.dpi) != 2) stop("'raster.dpi' must be a two-length numeric vector") } orig.names <- colnames(x = data) names.plot <- colnames(x = data) <- gsub( pattern = '-', replacement = '.', x = colnames(x = data), fixed = TRUE ) names.plot <- colnames(x = data) <- gsub( pattern = ':', replacement = '.', x = colnames(x = data), fixed = TRUE ) names.plot <- colnames(x = data) <- gsub( pattern = ' ', replacement = '.', x = colnames(x = data), fixed = TRUE ) if (ncol(x = data) < 2) { msg <- "Too few variables passed" if (ncol(x = data) == 1) { msg <- paste0(msg, ', only have ', colnames(x = data)[1]) } stop(msg, call. = FALSE) } plot.cor <- if (isTRUE(x = plot.cor)) { round(x = cor(x = data[, 1], y = data[, 2]), digits = 2) } else( "" ) if (!is.null(x = rows.highlight)) { highlight.info <- SetHighlight( cells.highlight = rows.highlight, cells.all = rownames(x = data), sizes.highlight = pt.size, cols.highlight = 'red', col.base = 'black', pt.size = pt.size, raster = raster ) cols <- highlight.info$color col.by <- factor( x = highlight.info$highlight, levels = rev(x = highlight.info$plot.order) ) plot.order <- order(col.by) data <- data[plot.order, ] col.by <- col.by[plot.order] } if (!is.null(x = col.by)) { data$colors <- col.by } plot <- ggplot( data = data, mapping = aes_string(x = names.plot[1], y = names.plot[2]) ) + labs( x = orig.names[1], y = orig.names[2], title = plot.cor, color = legend.title ) if (smooth) { # density <- kde2d(x = data[, names.plot[1]], y = data[, names.plot[2]], h = Bandwidth(data = data[, names.plot]), n = 200) # density <- data.frame( # expand.grid( # x = density$x, # y = density$y # ), # density = as.vector(x = density$z) # ) plot <- plot + stat_density2d( mapping = aes(fill = ..density.. ^ 0.25), geom = 'tile', contour = FALSE, n = 200, h = Bandwidth(data = data[, names.plot]) ) + # geom_tile( # mapping = aes_string( # x = 'x', # y = 'y', # fill = 'density' # ), # data = density # ) + scale_fill_continuous(low = 'white', high = 'dodgerblue4') + guides(fill = FALSE) } position <- NULL if (jitter) { position <- 'jitter' } else { position <- 'identity' } if (!is.null(x = col.by)) { if (raster) { plot <- plot + geom_scattermore( mapping = aes_string(color = 'colors'), position = position, pointsize = pt.size, pixels = raster.dpi ) } else { plot <- plot + geom_point( mapping = aes_string(color = 'colors'), position = position, size = pt.size ) } } else { if (raster) { plot <- plot + geom_scattermore(position = position, pointsize = pt.size, pixels = raster.dpi) } else { plot <- plot + geom_point(position = position, size = pt.size) } } if (!is.null(x = cols)) { cols.scale <- if (length(x = cols) == 1 && cols %in% rownames(x = brewer.pal.info)) { scale_color_brewer(palette = cols) } else { scale_color_manual(values = cols, na.value = na.value) } plot <- plot + cols.scale if (!is.null(x = rows.highlight)) { plot <- plot + guides(color = FALSE) } } plot <- plot + theme_cowplot() + theme(plot.title = element_text(hjust = 0.5)) if (!is.null(x = span)) { plot <- plot + geom_smooth( mapping = aes_string(x = names.plot[1], y = names.plot[2]), method = 'loess', span = span ) } return(plot) } #' Plot a single dimension #' #' @param data Data to plot #' @param dims A two-length numeric vector with dimensions to use #' @param col.by ... #' @param cols Vector of colors, each color corresponds to an identity class. #' This may also be a single character or numeric value corresponding to a #' palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}.By #' default, ggplot2 assigns colors #' @param pt.size Adjust point size for plotting #' @param shape.by If NULL, all points are circles (default). You can specify #' any cell attribute (that can be pulled with \code{\link{FetchData}}) #' allowing for both different colors and different shapes on cells. #' @param alpha Alpha value for plotting (default is 1) #' @param alpha.by Mapping variable for the point alpha value #' @param stroke.size Adjust stroke (outline) size of points #' @param order Specify the order of plotting for the idents. This can be #' useful for crowded plots if points of interest are being buried. Provide #' either a full list of valid idents or a subset to be plotted last (on top). #' @param label Whether to label the clusters #' @param repel Repel labels #' @param label.size Sets size of labels #' @param cells.highlight A list of character or numeric vectors of cells to #' highlight. If only one group of cells desired, can simply #' pass a vector instead of a list. If set, colors selected cells to the color(s) #' in \code{cols.highlight} and other cells black (white if dark.theme = TRUE); #' will also resize to the size(s) passed to \code{sizes.highlight} #' @param cols.highlight A vector of colors to highlight the cells as; will #' repeat to the length groups in cells.highlight #' @param sizes.highlight Size of highlighted cells; will repeat to the length #' groups in cells.highlight #' @param na.value Color value for NA points when using custom scale. #' @param raster Convert points to raster format, default is \code{NULL} #' which will automatically use raster if the number of points plotted is #' greater than 100,000 #' @param raster.dpi the pixel resolution for rastered plots, passed to geom_scattermore(). #' Default is c(512, 512) #' #' @return A ggplot2 object #' #' @importFrom cowplot theme_cowplot #' @importFrom RColorBrewer brewer.pal.info #' @importFrom ggplot2 ggplot aes_string geom_point labs guides scale_color_brewer #' scale_color_manual element_rect guide_legend discrete_scale #' #' @keywords internal #' #' @export #' SingleDimPlot <- function( data, dims, col.by = NULL, cols = NULL, pt.size = NULL, shape.by = NULL, alpha = 1, alpha.by = NULL, stroke.size = NULL, order = NULL, label = FALSE, repel = FALSE, label.size = 4, cells.highlight = NULL, cols.highlight = '#DE2D26', sizes.highlight = 1, na.value = 'grey50', raster = NULL, raster.dpi = NULL ) { if ((nrow(x = data) > 1e5) & is.null(x = raster)){ message("Rasterizing points since number of points exceeds 100,000.", "\nTo disable this behavior set `raster=FALSE`") } raster <- raster %||% (nrow(x = data) > 1e5) pt.size <- pt.size %||% AutoPointSize(data = data, raster = raster) if (is.null(x = stroke.size)) { stroke.size <- 0.600075815011372 } if (!is.null(x = cells.highlight) && pt.size != AutoPointSize(data = data, raster = raster) && sizes.highlight != pt.size && isTRUE(x = raster)) { warning("When `raster = TRUE` highlighted and non-highlighted cells must be the same size. Plot will use the value provided to 'sizes.highlight'.") } if (!is.null(x = raster.dpi)) { if (!is.numeric(x = raster.dpi) || length(x = raster.dpi) != 2) stop("'raster.dpi' must be a two-length numeric vector") } if (length(x = dims) != 2) { stop("'dims' must be a two-length vector") } if (!is.data.frame(x = data)) { data <- as.data.frame(x = data) } if (is.character(x = dims) && !all(dims %in% colnames(x = data))) { stop("Cannot find dimensions to plot in data") } else if (is.numeric(x = dims)) { dims <- colnames(x = data)[dims] } if (!is.null(x = cells.highlight)) { if (inherits(x = cells.highlight, what = "data.frame")) { stop("cells.highlight cannot be a dataframe. ", "Please supply a vector or list") } highlight.info <- SetHighlight( cells.highlight = cells.highlight, cells.all = rownames(x = data), sizes.highlight = sizes.highlight %||% pt.size, cols.highlight = cols.highlight, col.base = cols[1] %||% '#C3C3C3', pt.size = pt.size, raster = raster ) order <- highlight.info$plot.order data$highlight <- highlight.info$highlight col.by <- 'highlight' pt.size <- highlight.info$size cols <- highlight.info$color } if (!is.null(x = order) && !is.null(x = col.by)) { if (typeof(x = order) == "logical") { if (order) { data <- data[order(!is.na(x = data[, col.by]), data[, col.by]), ] } } else { order <- rev(x = c( order, setdiff(x = unique(x = data[, col.by]), y = order) )) data[, col.by] <- factor(x = data[, col.by], levels = order) new.order <- order(x = data[, col.by]) data <- data[new.order, ] if (length(x = pt.size) == length(x = new.order)) { pt.size <- pt.size[new.order] } } } if (!is.null(x = col.by) && !col.by %in% colnames(x = data)) { warning("Cannot find ", col.by, " in plotting data, not coloring plot") col.by <- NULL } else { # col.index <- grep(pattern = col.by, x = colnames(x = data), fixed = TRUE) col.index <- match(x = col.by, table = colnames(x = data)) if (grepl(pattern = '^\\d', x = col.by)) { # Do something for numbers col.by <- paste0('x', col.by) } else if (grepl(pattern = '-', x = col.by)) { # Do something for dashes col.by <- gsub(pattern = '-', replacement = '.', x = col.by) } colnames(x = data)[col.index] <- col.by } if (!is.null(x = shape.by) && !shape.by %in% colnames(x = data)) { warning("Cannot find ", shape.by, " in plotting data, not shaping plot") } if (!is.null(x = alpha.by) && !alpha.by %in% colnames(x = data)) { warning( "Cannot find alpha variable ", alpha.by, " in data, setting to NULL", call. = FALSE, immediate. = TRUE ) alpha.by <- NULL } plot <- ggplot(data = data) plot <- if (isTRUE(x = raster)) { plot + geom_scattermore( mapping = aes_string( x = dims[1], y = dims[2], color = paste0("`", col.by, "`"), shape = shape.by, alpha = alpha.by ), pointsize = pt.size, alpha = alpha, pixels = raster.dpi ) } else { plot + geom_point( mapping = aes_string( x = dims[1], y = dims[2], color = paste0("`", col.by, "`"), shape = shape.by, alpha = alpha.by ), size = pt.size, alpha = alpha, stroke = stroke.size ) } plot <- plot + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + labs(color = NULL, title = col.by) + CenterTitle() if (label && !is.null(x = col.by)) { plot <- LabelClusters( plot = plot, id = col.by, repel = repel, size = label.size ) } if (!is.null(x = cols)) { if (length(x = cols) == 1 && (is.numeric(x = cols) || cols %in% rownames(x = brewer.pal.info))) { scale <- scale_color_brewer(palette = cols, na.value = na.value) } else if (length(x = cols) == 1 && (cols %in% c('alphabet', 'alphabet2', 'glasbey', 'polychrome', 'stepped'))) { colors <- DiscretePalette(length(unique(data[[col.by]])), palette = cols) scale <- scale_color_manual(values = colors, na.value = na.value) } else { scale <- scale_color_manual(values = cols, na.value = na.value) } plot <- plot + scale } plot <- plot + theme_cowplot() return(plot) } #' Plot a single expression by identity on a plot #' #' @param data Data to plot #' @param idents Idents to use #' @param split Use a split violin plot #' @param type Make either a \dQuote{ridge} or \dQuote{violin} plot #' @param sort Sort identity classes (on the x-axis) by the average #' expression of the attribute being potted #' @param y.max Maximum Y value to plot #' @param adjust Adjust parameter for geom_violin #' @param pt.size Size of points for violin plots #' @param alpha Alpha vlaue for violin plots #' @param cols Colors to use for plotting #' @param seed.use Random seed to use. If NULL, don't set a seed #' @param log plot Y axis on log10 scale #' @param add.noise determine if adding small noise for plotting #' @param raster Convert points to raster format. Requires 'ggrastr' to be installed. #' default is \code{NULL} which automatically rasterizes if ggrastr is installed and #' number of points exceed 100,000. #' #' @return A ggplot-based Expression-by-Identity plot #' #' @importFrom stats rnorm #' @importFrom utils globalVariables #' @importFrom ggridges geom_density_ridges theme_ridges #' @importFrom ggplot2 ggplot aes_string theme labs geom_violin geom_jitter #' ylim position_jitterdodge scale_fill_manual scale_y_log10 scale_x_log10 #' scale_y_discrete scale_x_continuous waiver #' @importFrom cowplot theme_cowplot #' #' @keywords internal #' @export #' SingleExIPlot <- function( data, idents, split = NULL, type = 'violin', sort = FALSE, y.max = NULL, adjust = 1, pt.size = 0, alpha = 1, cols = NULL, seed.use = 42, log = FALSE, add.noise = TRUE, raster = NULL ) { if (!is.null(x = raster) && isTRUE(x = raster)){ if (!PackageCheck('ggrastr', error = FALSE)) { stop("Please install ggrastr from CRAN to enable rasterization.") } } if (PackageCheck('ggrastr', error = FALSE)) { # Set rasterization to true if ggrastr is installed and # number of points exceeds 100,000 if ((nrow(x = data) > 1e5) & is.null(x = raster)){ message("Rasterizing points since number of points exceeds 100,000.", "\nTo disable this behavior set `raster=FALSE`") # change raster to TRUE raster <- TRUE } } if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (!is.data.frame(x = data) || ncol(x = data) != 1) { stop("'SingleExIPlot requires a data frame with 1 column") } feature <- colnames(x = data) data$ident <- idents if ((is.character(x = sort) && nchar(x = sort) > 0) || sort) { data$ident <- factor( x = data$ident, levels = names(x = rev(x = sort( x = tapply( X = data[, feature], INDEX = data$ident, FUN = mean ), decreasing = grepl(pattern = paste0('^', tolower(x = sort)), x = 'decreasing') ))) ) } if (log) { noise <- rnorm(n = length(x = data[, feature])) / 200 data[, feature] <- data[, feature] + 1 } else { noise <- rnorm(n = length(x = data[, feature])) / 100000 } if (!add.noise) { noise <- noise * 0 } if (all(data[, feature] == data[, feature][1])) { warning(paste0("All cells have the same value of ", feature, ".")) } else{ data[, feature] <- data[, feature] + noise } axis.label <- 'Expression Level' y.max <- y.max %||% max(data[, feature][is.finite(x = data[, feature])]) if (type == 'violin' && !is.null(x = split)) { data$split <- split vln.geom <- geom_violin fill <- 'split' } else if (type == 'splitViolin' && !is.null(x = split )) { data$split <- split vln.geom <- geom_split_violin fill <- 'split' type <- 'violin' } else { vln.geom <- geom_violin fill <- 'ident' } switch( EXPR = type, 'violin' = { x <- 'ident' y <- paste0("`", feature, "`") xlab <- 'Identity' ylab <- axis.label geom <- list( vln.geom(scale = 'width', adjust = adjust, trim = TRUE), theme(axis.text.x = element_text(angle = 45, hjust = 1)) ) if (is.null(x = split)) { if (isTRUE(x = raster)) { jitter <- ggrastr::rasterize(geom_jitter(height = 0, size = pt.size, alpha = alpha, show.legend = FALSE)) } else { jitter <- geom_jitter(height = 0, size = pt.size, alpha = alpha, show.legend = FALSE) } } else { if (isTRUE(x = raster)) { jitter <- ggrastr::rasterize(geom_jitter( position = position_jitterdodge(jitter.width = 0.4, dodge.width = 0.9), size = pt.size, alpha = alpha, show.legend = FALSE )) } else { jitter <- geom_jitter( position = position_jitterdodge(jitter.width = 0.4, dodge.width = 0.9), size = pt.size, alpha = alpha, show.legend = FALSE ) } } log.scale <- scale_y_log10() axis.scale <- ylim }, 'ridge' = { x <- paste0("`", feature, "`") y <- 'ident' xlab <- axis.label ylab <- 'Identity' geom <- list( geom_density_ridges(scale = 4), theme_ridges(), scale_y_discrete(expand = c(0.01, 0)), scale_x_continuous(expand = c(0, 0)) ) jitter <- geom_jitter(width = 0, size = pt.size, alpha = alpha, show.legend = FALSE) log.scale <- scale_x_log10() axis.scale <- function(...) { invisible(x = NULL) } }, stop("Unknown plot type: ", type) ) plot <- ggplot( data = data, mapping = aes_string(x = x, y = y, fill = fill)[c(2, 3, 1)] ) + labs(x = xlab, y = ylab, title = feature, fill = NULL) + theme_cowplot() + theme(plot.title = element_text(hjust = 0.5)) plot <- do.call(what = '+', args = list(plot, geom)) plot <- plot + if (log) { log.scale } else { axis.scale(min(data[, feature]), y.max) } if (pt.size > 0) { plot <- plot + jitter } if (!is.null(x = cols)) { if (!is.null(x = split)) { idents <- unique(x = as.vector(x = data$ident)) splits <- unique(x = as.vector(x = data$split)) labels <- if (length(x = splits) == 2) { splits } else { unlist(x = lapply( X = idents, FUN = function(pattern, x) { x.mod <- gsub( pattern = paste0(pattern, '.'), replacement = paste0(pattern, ': '), x = x, fixed = TRUE ) x.keep <- grep(pattern = ': ', x = x.mod, fixed = TRUE) x.return <- x.mod[x.keep] names(x = x.return) <- x[x.keep] return(x.return) }, x = unique(x = as.vector(x = data$split)) )) } if (is.null(x = names(x = labels))) { names(x = labels) <- labels } } else { labels <- levels(x = droplevels(data$ident)) } plot <- plot + scale_fill_manual(values = cols, labels = labels) } return(plot) } #' A single heatmap from base R using \code{\link[graphics]{image}} #' #' @param data matrix of data to plot #' @param order optional vector of cell names to specify order in plot #' @param title Title for plot #' #' @return No return, generates a base-R heatmap using \code{\link[graphics]{image}} #' #' @importFrom graphics axis image par plot.new title #' #' @keywords internal #' #' @export #' SingleImageMap <- function(data, order = NULL, title = NULL) { if (!is.null(x = order)) { data <- data[order, ] } par(mar = c(1, 1, 3, 3)) plot.new() image( x = as.matrix(x = data), axes = FALSE, add = TRUE, col = PurpleAndYellow() ) axis( side = 4, at = seq(from = 0, to = 1, length = ncol(x = data)), labels = colnames(x = data), las = 1, tick = FALSE, mgp = c(0, -0.5, 0), cex.axis = 0.75 ) title(main = title) } #' Single Spatial Plot #' #' @param data A data frame with at least the following columns: #' \itemize{ #' \item \dQuote{\code{x}}: Spatial-resolved \emph{x} coordinates, will be #' plotted on the \emph{y}-axis #' \item \dQuote{\code{y}}: Spatially-resolved \emph{y} coordinates, will be #' plotted on the \emph{x}-axis #' \item \dQuote{\code{cell}}: Cell name #' \item \dQuote{\code{boundary}}: Segmentation boundary label; when plotting #' multiple segmentation layers, the order of boundary transparency is set by #' factor levels for this column #' } #' Can pass \code{NA} to \code{data} suppress segmentation visualization #' @param col.by Name of column in \code{data} to color cell segmentations by; #' pass \code{NA} to suppress coloring #' @param col.factor Are the colors a factor or discrete? #' @param cols Colors for cell segmentations; can be one of the #' following: #' \itemize{ #' \item \code{NULL} for default ggplot2 colors #' \item A numeric value or name of a #' \link[RColorBrewer:RColorBrewer]{color brewer palette} #' \item Name of a palette for \code{\link{DiscretePalette}} #' \item A vector of colors equal to the length of unique levels of #' \code{data$col.by} #' } #' @param shuffle.cols Randomly shuffle colors when a palette or #' vector of colors is provided to \code{cols} #' @param size Point size for cells when plotting centroids #' @param molecules A data frame with spatially-resolved molecule coordinates; #' should have the following columns: #' \itemize{ #' \item \dQuote{\code{x}}: Spatial-resolved \emph{x} coordinates, will be #' plotted on the \emph{y}-axis #' \item \dQuote{\code{y}}: Spatially-resolved \emph{y} coordinates, will be #' plotted on the \emph{x}-axis #' \item \dQuote{\code{molecule}}: Molecule name #' } #' @param mols.size Point size for molecules #' @param mols.cols A vector of color for molecules. The "Set1" palette from #' RColorBrewer is used by default. #' @param mols.alpha Alpha value for molecules, should be between 0 and 1 #' @param alpha Alpha value, should be between 0 and 1; when plotting multiple #' boundaries, \code{alpha} is equivalent to max alpha #' @param border.color Color of cell segmentation border; pass \code{NA} #' to suppress borders for segmentation-based plots #' @param border.size Thickness of cell segmentation borders; pass \code{NA} #' to suppress borders for centroid-based plots #' @param na.value Color value for \code{NA} segmentations when #' using custom scale #' @param ... Ignored #' #' @return A ggplot object #' #' @importFrom rlang is_na #' @importFrom SeuratObject %NA% %!NA% #' @importFrom RColorBrewer brewer.pal.info #' @importFrom ggplot2 aes_string geom_point geom_polygon ggplot guides #' guide_legend scale_alpha_manual scale_color_manual scale_fill_brewer #' scale_fill_manual #' #' @keywords internal #' #' @export #' SingleImagePlot <- function( data, col.by = NA, col.factor = TRUE, cols = NULL, shuffle.cols = FALSE, size = 0.1, molecules = NULL, mols.size = 0.1, mols.cols = NULL, mols.alpha = 1.0, alpha = molecules %iff% 0.3 %||% 0.6, border.color = 'white', border.size = NULL, na.value = 'grey50', dark.background = TRUE, ... ) { # Check input data if (!is_na(x = data)) { if (!all(c('x', 'y', 'cell', 'boundary') %in% colnames(x = data))) { stop("Invalid data coordinates") } if (!is_na(x = col.by)) { if (!col.by %in% colnames(x = data)) { warning( "Cannot find 'col.by' ('", col.by, "') in data coordinates", immediate. = TRUE ) col.by <- NA } else if (isTRUE(x = col.factor) && !is.factor(x = data[[col.by]])) { data[[col.by]] <- factor( x = data[[col.by]], levels = unique(x = data[[col.by]]) ) } else if (isFALSE(x = col.factor) && is.factor(x = data[[col.by]])) { data[[col.by]] <- as.vector(x = data[[col.by]]) } } if (is_na(x = col.by) && !is.null(x = cols)) { col.by <- RandomName(length = 7L) data[[col.by]] <- TRUE } if (!is.factor(x = data$boundary)) { data$boundary <- factor( x = data$boundary, levels = unique(x = data$boundary) ) } # Determine alphas if (is.na(x = alpha)) { alpha <- 1L } alpha.min <- ifelse( test = alpha < 1L, yes = 1 * (10 ^ .FindE(x = alpha)), no = 0.1 ) if (alpha.min == alpha) { alpha.min <- 1 * (10 ^ (.FindE(x = alpha) - 1)) } alphas <- .Cut( min = alpha.min, max = alpha, n = length(x = levels(x = data$boundary)) ) } # Assemble plot plot <- ggplot( data = data %NA% NULL, mapping = aes_string( x = 'y', y = 'x', alpha = 'boundary', fill = col.by %NA% NULL ) ) if (!is_na(x = data)) { plot <- plot + scale_alpha_manual(values = alphas) + if (anyDuplicated(x = data$cell)) { if (is.null(border.size)) { border.size <- 0.3 } geom_polygon( mapping = aes_string(group = 'cell'), color = border.color, size = border.size ) } else { # Default to no borders when plotting centroids if (is.null(border.size)) { border.size <- 0.0 } geom_point( shape = 21, color = border.color, stroke = border.size, size = size ) } if (!is.null(x = cols)) { plot <- plot + if (is.numeric(x = cols) || cols[1L] %in% rownames(x = brewer.pal.info)) { palette <- brewer.pal(n = length(x = levels(x = data[[col.by]])), cols) if (length(palette) < length(x = levels(x = data[[col.by]]))) { num.blank <- length(x = levels(x = data[[col.by]])) - length(palette) palette <- c(palette, rep(na.value, num.blank)) } if (isTRUE(shuffle.cols)) { palette <- sample(palette) } scale_fill_manual(values = palette, na.value = na.value) } else if (cols[1] %in% DiscretePalette(n = NULL)) { scale_fill_manual( values = DiscretePalette( n = length(x = levels(x = data[[col.by]])), palette = cols, shuffle = shuffle.cols ), na.value = na.value ) } else { if (isTRUE(shuffle.cols)) { cols <- sample(cols) } scale_fill_manual(values = cols, na.value = na.value) } } if (length(x = levels(x = data$boundary)) == 1L) { plot <- plot + guides(alpha = 'none') } # Adjust guides if (isTRUE(x = col.factor) && length(x = levels(x = data[[col.by]])) <= 1L) { plot <- plot + guides(fill = 'none') } } # Add molecule sets if (is.data.frame(x = molecules)) { if (all(c('x', 'y', 'molecule') %in% colnames(x = molecules))) { if (!is.factor(x = molecules$molecule)) { molecules$molecule <- factor( x = molecules$molecule, levels = unique(x = molecules$molecule) ) } plot <- plot + geom_point( mapping = aes_string(fill = NULL, alpha = NULL, color = "molecule"), data = molecules, size = mols.size, alpha = mols.alpha, show.legend = c(color = TRUE, fill = FALSE, alpha = FALSE) ) + guides(color = guide_legend(override.aes = list(size = 3L))) + scale_color_manual( name = 'Molecules', values = mols.cols %||% brewer.pal( n = length(x = levels(x = molecules$molecule)), name = "Set1" ), guide = guide_legend() ) } else { warning("Invalid molecule coordinates", immediate. = TRUE) } } if (isTRUE(dark.background)) { plot <- plot + DarkTheme() } return(plot) } # A single polygon plot # # @param data Data to plot # @param group.by Grouping variable # @param ... Extra parameters passed to \code{\link[cowplot]{theme_cowplot}} # # @return A ggplot-based plot # #' @importFrom cowplot theme_cowplot #' @importFrom ggplot2 ggplot aes_string geom_polygon # # @seealso \code{\link[cowplot]{theme_cowplot}} # SinglePolyPlot <- function(data, group.by, ...) { plot <- ggplot(data = data, mapping = aes_string(x = 'x', y = 'y')) + geom_polygon(mapping = aes_string(fill = group.by, group = 'cell')) + coord_fixed() + theme_cowplot(...) return(plot) } #' A single heatmap from ggplot2 using geom_raster #' #' @param data A matrix or data frame with data to plot #' @param raster switch between geom_raster and geom_tile #' @param cell.order ... #' @param feature.order ... #' @param colors A vector of colors to use #' @param disp.min Minimum display value (all values below are clipped) #' @param disp.max Maximum display value (all values above are clipped) #' @param limits A two-length numeric vector with the limits for colors on the plot #' @param group.by A vector to group cells by, should be one grouping identity per cell #' #' @return A ggplot2 object # #' @importFrom ggplot2 ggplot aes_string geom_raster scale_fill_gradient #' scale_fill_gradientn theme element_blank labs geom_point guides #' guide_legend geom_tile #' #' @keywords internal #' #' @export # SingleRasterMap <- function( data, raster = TRUE, cell.order = NULL, feature.order = NULL, colors = PurpleAndYellow(), disp.min = -2.5, disp.max = 2.5, limits = NULL, group.by = NULL ) { data <- MinMax(data = data, min = disp.min, max = disp.max) data <- Melt(x = t(x = data)) colnames(x = data) <- c('Feature', 'Cell', 'Expression') if (!is.null(x = feature.order)) { data$Feature <- factor(x = data$Feature, levels = unique(x = feature.order)) } if (!is.null(x = cell.order)) { data$Cell <- factor(x = data$Cell, levels = unique(x = cell.order)) } if (!is.null(x = group.by)) { data$Identity <- group.by[data$Cell] } limits <- limits %||% c(min(data$Expression), max(data$Expression)) if (length(x = limits) != 2 || !is.numeric(x = limits)) { stop("limits' must be a two-length numeric vector") } my_geom <- ifelse(test = raster, yes = geom_raster, no = geom_tile) plot <- ggplot(data = data) + my_geom(mapping = aes_string(x = 'Cell', y = 'Feature', fill = 'Expression')) + theme(axis.text.x = element_blank(), axis.ticks.x = element_blank()) + scale_fill_gradientn(limits = limits, colors = colors, na.value = "white") + labs(x = NULL, y = NULL, fill = group.by %iff% 'Expression') + WhiteBackground() + NoAxes(keep.text = TRUE) if (!is.null(x = group.by)) { plot <- plot + geom_point( mapping = aes_string(x = 'Cell', y = 'Feature', color = 'Identity'), alpha = 0 ) + guides(color = guide_legend(override.aes = list(alpha = 1))) } return(plot) } #' Base plotting function for all Spatial plots #' #' @param data Data.frame with info to be plotted #' @param image \code{SpatialImage} object to be plotted #' @param cols Vector of colors, each color corresponds to an identity class. #' This may also be a single character #' or numeric value corresponding to a palette as specified by #' \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns #' colors #' @param image.alpha Adjust the opacity of the background images. Set to 0 to #' remove. #' @param image.scale Choose the scale factor ("lowres"/"hires") to apply in #' order to matchthe plot with the specified `image` - defaults to "lowres" #' @param pt.alpha Adjust the opacity of the points if plotting a #' \code{SpatialDimPlot} #' @param crop Crop the plot in to focus on points plotted. Set to \code{FALSE} #' to show entire background image. #' @param pt.size.factor Sets the size of the points relative to spot.radius #' @param stroke Control the width of the border around the spots #' @param shape Control the shape of the spots - same as the ggplot2 parameter. #' The default is 21, which plots cirlces - use 22 to plot squares. #' @param col.by Mapping variable for the point color #' @param alpha.by Mapping variable for the point alpha value #' @param cells.highlight A list of character or numeric vectors of cells to #' highlight. If only one group of cells desired, can simply pass a vector #' instead of a list. If set, colors selected cells to the color(s) in #' cols.highlight #' @param cols.highlight A vector of colors to highlight the cells as; ordered #' the same as the groups in cells.highlight; last color corresponds to #' unselected cells. #' @param geom Switch between normal spatial geom and geom to enable hover #' functionality #' @param na.value Color for spots with NA values #' #' @return A ggplot2 object #' #' @importFrom tibble tibble #' @importFrom ggplot2 ggplot aes_string coord_fixed geom_point xlim ylim #' coord_cartesian labs theme_void theme scale_fill_brewer #' #' @keywords internal #' #' @export #' SingleSpatialPlot <- function( data, image, cols = NULL, image.alpha = 1, image.scale = "lowres", pt.alpha = NULL, crop = TRUE, pt.size.factor = NULL, shape = 21, stroke = NA, col.by = NULL, alpha.by = NULL, cells.highlight = NULL, cols.highlight = c('#DE2D26', 'grey50'), geom = c('spatial', 'interactive', 'poly'), na.value = 'grey50' ) { geom <- match.arg(arg = geom) if (!is.null(x = col.by) && !col.by %in% colnames(x = data)) { warning("Cannot find '", col.by, "' in data, not coloring", call. = FALSE, immediate. = TRUE) col.by <- NULL } col.by <- col.by %iff% paste0("`", col.by, "`") alpha.by <- alpha.by %iff% paste0("`", alpha.by, "`") if (!is.null(x = cells.highlight)) { highlight.info <- SetHighlight( cells.highlight = cells.highlight, cells.all = rownames(x = data), sizes.highlight = pt.size.factor, cols.highlight = cols.highlight[1], col.base = cols.highlight[2] ) order <- highlight.info$plot.order data$highlight <- highlight.info$highlight col.by <- 'highlight' levels(x = data$ident) <- c(order, setdiff(x = levels(x = data$ident), y = order)) data <- data[order(data$ident), ] } plot <- ggplot(data = data, aes_string( x = colnames(x = data)[2], y = colnames(x = data)[1], fill = col.by, alpha = alpha.by )) plot <- switch( EXPR = geom, 'spatial' = { if (is.null(x = pt.alpha)) { plot <- plot + geom_spatial( point.size.factor = pt.size.factor, data = data, image = image, image.alpha = image.alpha, image.scale = image.scale, crop = crop, shape = shape, stroke = stroke, ) } else { plot <- plot + geom_spatial( point.size.factor = pt.size.factor, data = data, image = image, image.alpha = image.alpha, image.scale = image.scale, crop = crop, shape = shape, stroke = stroke, alpha = pt.alpha ) } plot + coord_fixed() + theme(aspect.ratio = 1) }, 'interactive' = { plot + geom_spatial_interactive( data = tibble( grob = list( GetImage( object = image, mode = 'grob' ) ) ), mapping = aes_string(grob = 'grob'), x = 0.5, y = 0.5 ) + geom_point(mapping = aes_string(color = col.by)) + xlim(0, ncol(x = image)) + ylim(nrow(x = image), 0) + coord_cartesian(expand = FALSE) }, 'poly' = { data$cell <- rownames(x = data) data[, c('x', 'y')] <- NULL data <- merge( x = data, y = GetTissueCoordinates( object = image, qhulls = TRUE, scale = image.scale ), by = "cell" ) plot + geom_polygon( data = data, mapping = aes_string(fill = col.by, group = 'cell') ) + coord_fixed() + theme_cowplot() }, stop("Unknown geom, choose from 'spatial' or 'interactive'", call. = FALSE) ) if (!is.null(x = cells.highlight)) { plot <- plot + scale_fill_manual(values = cols.highlight) } if (!is.null(x = cols) && is.null(x = cells.highlight)) { if (length(x = cols) == 1 && (is.numeric(x = cols) || cols %in% rownames(x = brewer.pal.info))) { scale <- scale_fill_brewer(palette = cols, na.value = na.value) } else if (length(x = cols) == 1 && (cols %in% c('alphabet', 'alphabet2', 'glasbey', 'polychrome', 'stepped'))) { colors <- DiscretePalette(length(unique(data[[col.by]])), palette = cols) scale <- scale_fill_manual(values = colors, na.value = na.value) } else { cols <- cols[names(x = cols) %in% data[[gsub(pattern = '`', replacement = "", x = col.by)]]] scale <- scale_fill_manual(values = cols, na.value = na.value) } plot <- plot + scale } plot <- plot + NoAxes() + theme(panel.background = element_blank()) return(plot) } # Reimplementation of ggplot2 coord$transform # # @param data A data frame with x-coordinates in the first column and y-coordinates # in the second # @param xlim,ylim X- and Y-limits for the transformation, must be two-length # numeric vectors # # @return \code{data} with transformed coordinates # #' @importFrom ggplot2 transform_position #' @importFrom scales rescale squish_infinite # Transform <- function(data, xlim = c(-Inf, Inf), ylim = c(-Inf, Inf)) { # Quick input argument checking if (!all(sapply(X = list(xlim, ylim), FUN = length) == 2)) { stop("'xlim' and 'ylim' must be two-length numeric vectors", call. = FALSE) } # Save original names df.names <- colnames(x = data) colnames(x = data)[1:2] <- c('x', 'y') # Rescale the X and Y values data <- transform_position( df = data, trans_x = function(df) { return(rescale(x = df, from = xlim)) }, trans_y = function(df) { return(rescale(x = df, from = ylim)) } ) # Something that ggplot2 does data <- transform_position( df = data, trans_x = squish_infinite, trans_y = squish_infinite ) # Restore original names colnames(x = data) <- df.names return(data) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # S4 Methods #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% setMethod( f = '.PrepImageData', signature = c(data = 'data.frame', cells = 'rle'), definition = function(data, cells, ...) { data <- sapply( X = colnames(x = data), FUN = function(x) { j <- data[[x]] names(x = j) <- rownames(x = data) return(.PrepImageData(data = j, cells = cells, name = x)) }, simplify = FALSE, USE.NAMES = TRUE ) return(do.call(what = 'cbind', args = data)) } ) #' @importFrom methods getMethod setMethod( f = '.PrepImageData', signature = c(data = 'factor', cells = 'rle'), definition = function(data, cells, name, ...) { f <- getMethod( f = '.PrepImageData', signature = c(data = 'vector', cells = 'rle') ) return(f(data = data, cells = cells, name = name, ...)) } ) setMethod( f = '.PrepImageData', signature = c(data = 'list', cells = 'rle'), definition = function(data, cells, ...) { .NotYetImplemented() } ) setMethod( f = '.PrepImageData', signature = c(data = 'NULL', cells = 'rle'), definition = function(data, cells, ...) { return(SeuratObject::EmptyDF(n = sum(cells$lengths))) } ) setMethod( f = '.PrepImageData', signature = c(data = 'vector', cells = 'rle'), definition = function(data, cells, name, ...) { name <- as.character(x = name) if (name %in% c('x', 'y', 'cell')) { stop("'name' cannot be 'x', 'y', or 'cell'", call. = FALSE) } cnames <- cells$values if (is.null(x = names(x = data))) { mlen <- min(sapply(X = list(data, cnames), FUN = length)) names(x = data)[1:mlen] <- cnames[1:mlen] } if (anyDuplicated(x = names(x = data))) { dup <- duplicated(x = names(x = data)) warning( sum(dup), ifelse(test = sum(dup) == 1, yes = ' cell', no = ' cells'), ' duplicated, using only the first occurance', call. = FALSE, immediate. = TRUE ) } if (length(x = data) < length(x = cnames)) { mcells <- setdiff(x = cnames, y = names(x = data)) warning( "Missing data for some cells, filling with NA", call. = FALSE, immediate. = TRUE ) data[mcells] <- NA } else if (length(x = data) > length(x = cnames)) { warning( "More cells provided than present", call. = FALSE, immediate. = TRUE ) } data <- data.frame(rep.int(x = data[cnames], times = cells$lengths)) colnames(x = data) <- name return(data) } ) Seurat/R/dimensional_reduction.R0000644000176200001440000025436114744456127016450 0ustar liggesusers#' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Determine statistical significance of PCA scores. #' #' Randomly permutes a subset of data, and calculates projected PCA scores for #' these 'random' genes. Then compares the PCA scores for the 'random' genes #' with the observed PCA scores to determine statistical significance. End result #' is a p-value for each gene's association with each principal component. #' #' @param object Seurat object #' @param reduction DimReduc to use. ONLY PCA CURRENTLY SUPPORTED. #' @param assay Assay used to calculate reduction. #' @param dims Number of PCs to compute significance for #' @param num.replicate Number of replicate samplings to perform #' @param prop.freq Proportion of the data to randomly permute for each #' replicate #' @param verbose Print progress bar showing the number of replicates #' that have been processed. #' @param maxit maximum number of iterations to be performed by the irlba function of RunPCA #' #' @return Returns a Seurat object where JS(object = object[['pca']], slot = 'empirical') #' represents p-values for each gene in the PCA analysis. If ProjectPCA is #' subsequently run, JS(object = object[['pca']], slot = 'full') then #' represents p-values for all genes. #' #' @importFrom methods new #' @importFrom pbapply pblapply pbsapply #' @importFrom future.apply future_lapply future_sapply #' @importFrom future nbrOfWorkers #' #' @references Inspired by Chung et al, Bioinformatics (2014) #' @concept dimensional_reduction #' #' @export #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small = suppressWarnings(JackStraw(pbmc_small)) #' head(JS(object = pbmc_small[['pca']], slot = 'empirical')) #' } #' JackStraw <- function( object, reduction = "pca", assay = NULL, dims = 20, num.replicate = 100, prop.freq = 0.01, verbose = TRUE, maxit = 1000 ) { if (reduction != "pca") { stop("Only pca for reduction is currently supported") } if (verbose && nbrOfWorkers() == 1) { my.lapply <- pblapply my.sapply <- pbsapply } else { my.lapply <- future_lapply my.sapply <- future_sapply } assay <- assay %||% DefaultAssay(object = object) if (IsSCT(assay = object[[assay]])) { stop("JackStraw cannot be run on SCTransform-normalized data. Please supply a non-SCT assay.") } if (dims > length(x = object[[reduction]])) { dims <- length(x = object[[reduction]]) warning("Number of dimensions specified is greater than those available. Setting dims to ", dims, " and continuing", immediate. = TRUE) } if (dims > nrow(x = object)) { dims <- nrow(x = object) warning("Number of dimensions specified is greater than the number of cells. Setting dims to ", dims, " and continuing", immediate. = TRUE) } loadings <- Loadings(object = object[[reduction]], projected = FALSE) reduc.features <- rownames(x = loadings) if (length(x = reduc.features) < 3) { stop("Too few features") } if (length(x = reduc.features) * prop.freq < 3) { warning( "Number of variable genes given ", prop.freq, " as the prop.freq is low. Consider including more variable genes and/or increasing prop.freq. ", "Continuing with 3 genes in every random sampling." ) } data.use <- GetAssayData(object = object, assay = assay, slot = "scale.data")[reduc.features, ] rev.pca <- object[[paste0('RunPCA.', assay)]]$rev.pca weight.by.var <- object[[paste0('RunPCA.', assay)]]$weight.by.var fake.vals.raw <- my.lapply( X = 1:num.replicate, FUN = JackRandom, scaled.data = data.use, prop.use = prop.freq, r1.use = 1, r2.use = dims, rev.pca = rev.pca, weight.by.var = weight.by.var, maxit = maxit ) fake.vals <- sapply( X = 1:dims, FUN = function(x) { return(as.numeric(x = unlist(x = lapply( X = 1:num.replicate, FUN = function(y) { return(fake.vals.raw[[y]][, x]) } )))) } ) fake.vals <- as.matrix(x = fake.vals) jackStraw.empP <- as.matrix( my.sapply( X = 1:dims, FUN = function(x) { return(unlist(x = lapply( X = abs(loadings[, x]), FUN = EmpiricalP, nullval = abs(fake.vals[,x]) ))) } ) ) colnames(x = jackStraw.empP) <- paste0("PC", 1:ncol(x = jackStraw.empP)) jackstraw.obj <- new( Class = "JackStrawData", empirical.p.values = jackStraw.empP, fake.reduction.scores = fake.vals, empirical.p.values.full = matrix() ) JS(object = object[[reduction]]) <- jackstraw.obj object <- LogSeuratCommand(object = object) return(object) } #' L2-normalization #' #' Perform l2 normalization on given dimensional reduction #' #' @param object Seurat object #' @param reduction Dimensional reduction to normalize #' @param new.dr name of new dimensional reduction to store #' (default is olddr.l2) #' @param new.key name of key for new dimensional reduction #' #' @return Returns a \code{\link{Seurat}} object #' @concept dimensional_reduction #' #' @export #' L2Dim <- function(object, reduction, new.dr = NULL, new.key = NULL) { l2.norm <- L2Norm(mat = Embeddings(object[[reduction]])) if(is.null(new.dr)){ new.dr <- paste0(reduction, ".l2") } if(is.null(new.key)){ new.key <- paste0("L2", Key(object[[reduction]])) } colnames(x = l2.norm) <- paste0(new.key, 1:ncol(x = l2.norm)) l2.dr <- CreateDimReducObject( embeddings = l2.norm, loadings = Loadings(object = object[[reduction]], projected = FALSE), projected = Loadings(object = object[[reduction]], projected = TRUE), assay = DefaultAssay(object = object), stdev = slot(object = object[[reduction]], name = 'stdev'), key = new.key, jackstraw = slot(object = object[[reduction]], name = 'jackstraw'), misc = slot(object = object[[reduction]], name = 'misc') ) object[[new.dr]] <- l2.dr return(object) } #' L2-Normalize CCA #' #' Perform l2 normalization on CCs #' #' @param object Seurat object #' @param \dots Additional parameters to L2Dim. #' @concept dimensional_reduction #' #' @export #' L2CCA <- function(object, ...){ CheckDots(..., fxns = 'L2Dim') return(L2Dim(object = object, reduction = "cca", ...)) } #' Significant genes from a PCA #' #' Returns a set of genes, based on the JackStraw analysis, that have #' statistically significant associations with a set of PCs. #' #' @param object Seurat object #' @param pcs.use PCS to use. #' @param pval.cut P-value cutoff #' @param use.full Use the full list of genes (from the projected PCA). Assumes #' that \code{ProjectDim} has been run. Currently, must be set to FALSE. #' @param max.per.pc Maximum number of genes to return per PC. Used to avoid genes from one PC dominating the entire analysis. #' #' @return A vector of genes whose p-values are statistically significant for #' at least one of the given PCs. #' #' @export #' @concept dimensional_reduction #' #' @seealso \code{\link{ProjectDim}} \code{\link{JackStraw}} #' #' @examples #' data("pbmc_small") #' PCASigGenes(pbmc_small, pcs.use = 1:2) #' PCASigGenes <- function( object, pcs.use, pval.cut = 0.1, use.full = FALSE, max.per.pc = NULL ) { # pvals.use <- GetDimReduction(object,reduction.type = "pca",slot = "jackstraw")@empirical.p.values empirical.use <- ifelse(test = use.full, yes = 'full', no = 'empirical') pvals.use <- JS(object = object[['pca']], slot = empirical.use) if (length(x = pcs.use) == 1) { pvals.min <- pvals.use[, pcs.use] } if (length(x = pcs.use) > 1) { pvals.min <- apply(X = pvals.use[, pcs.use], MARGIN = 1, FUN = min) } names(x = pvals.min) <- rownames(x = pvals.use) features <- names(x = pvals.min)[pvals.min < pval.cut] if (!is.null(x = max.per.pc)) { top.features <- TopFeatures( object = object[['pca']], dim = pcs.use, nfeatures = max.per.pc, projected = use.full, balanced = FALSE ) features <- intersect(x = top.features, y = features) } return(features) } #' Project Dimensional reduction onto full dataset #' #' Takes a pre-computed dimensional reduction (typically calculated on a subset #' of genes) and projects this onto the entire dataset (all genes). Note that #' the cell loadings will remain unchanged, but now there are gene loadings for #' all genes. #' #' @param object Seurat object #' @param reduction Reduction to use #' @param assay Assay to use #' @param dims.print Number of dims to print features for #' @param nfeatures.print Number of features with highest/lowest loadings to print for #' each dimension #' @param overwrite Replace the existing data in feature.loadings #' @param do.center Center the dataset prior to projection (should be set to TRUE) #' @param verbose Print top genes associated with the projected dimensions #' #' @return Returns Seurat object with the projected values #' #' @export #' @concept dimensional_reduction #' #' @examples #' data("pbmc_small") #' pbmc_small #' pbmc_small <- ProjectDim(object = pbmc_small, reduction = "pca") #' # Visualize top projected genes in heatmap #' DimHeatmap(object = pbmc_small, reduction = "pca", dims = 1, balanced = TRUE) #' ProjectDim <- function( object, reduction = "pca", assay = NULL, dims.print = 1:5, nfeatures.print = 20, overwrite = FALSE, do.center = FALSE, verbose = TRUE ) { redeuc <- object[[reduction]] assay <- assay %||% DefaultAssay(object = redeuc) data.use <- GetAssayData( object = object[[assay]], slot = "scale.data" ) if (do.center) { data.use <- scale(x = as.matrix(x = data.use), center = TRUE, scale = FALSE) } cell.embeddings <- Embeddings(object = redeuc) new.feature.loadings.full <- data.use %*% cell.embeddings rownames(x = new.feature.loadings.full) <- rownames(x = data.use) colnames(x = new.feature.loadings.full) <- colnames(x = cell.embeddings) Loadings(object = redeuc, projected = TRUE) <- new.feature.loadings.full if (overwrite) { Loadings(object = redeuc, projected = FALSE) <- new.feature.loadings.full } object[[reduction]] <- redeuc if (verbose) { print( x = redeuc, dims = dims.print, nfeatures = nfeatures.print, projected = TRUE ) } object <- LogSeuratCommand(object = object) return(object) } #' @param query.dims Dimensions (columns) to use from query #' @param reference.dims Dimensions (columns) to use from reference #' @param ... Additional parameters to \code{\link{RunUMAP}} #' #' @inheritParams FindNeighbors #' @inheritParams RunUMAP #' #' @rdname ProjectUMAP #' @concept dimensional_reduction #' @export #' ProjectUMAP.default <- function( query, query.dims = NULL, reference, reference.dims = NULL, k.param = 30, nn.method = "annoy", n.trees = 50, annoy.metric = "cosine", l2.norm = FALSE, cache.index = TRUE, index = NULL, neighbor.name = "query_ref.nn", reduction.model, ... ) { query.dims <- query.dims %||% 1:ncol(x = query) reference.dims <- reference.dims %||% query.dims if (length(x = reference.dims) != length(x = query.dims)) { stop("Length of Reference and Query number of dimensions are not equal") } if (any(reference.dims > ncol(x = reference))) { stop("Reference dims is larger than the number of dimensions present.", call. = FALSE) } if (any(query.dims > ncol(x = query))) { stop("Query dims is larger than the number of dimensions present.", call. = FALSE) } if (length(x = Misc(object = reduction.model, slot = 'model')) == 0) { stop( "The provided reduction.model does not have a model stored. Please try ", "running umot-learn on the object first", call. = FALSE ) } query.neighbor <- FindNeighbors( object = reference[, reference.dims], query = query[, query.dims], k.param = k.param, nn.method = nn.method, n.trees = n.trees, annoy.metric = annoy.metric, cache.index = cache.index, index = index, return.neighbor = TRUE, l2.norm = l2.norm ) proj.umap <- RunUMAP(object = query.neighbor, reduction.model = reduction.model, ...) return(list(proj.umap = proj.umap, query.neighbor = query.neighbor)) } #' @rdname ProjectUMAP #' @concept dimensional_reduction #' @export #' @method ProjectUMAP DimReduc #' ProjectUMAP.DimReduc <- function( query, query.dims = NULL, reference, reference.dims = NULL, k.param = 30, nn.method = "annoy", n.trees = 50, annoy.metric = "cosine", l2.norm = FALSE, cache.index = TRUE, index = NULL, neighbor.name = "query_ref.nn", reduction.model, ... ) { proj.umap <- ProjectUMAP( query = Embeddings(object = query), query.dims = query.dims, reference = Embeddings(object = reference), reference.dims = reference.dims, k.param = k.param, nn.method = nn.method, n.trees = 50, annoy.metric = annoy.metric, l2.norm = l2.norm, cache.index = cache.index, index = index, neighbor.name = neighbor.name, reduction.model = reduction.model, ... ) return(proj.umap) } #' @param reference Reference dataset #' @param query.reduction Name of reduction to use from the query for neighbor #' finding #' @param reference.reduction Name of reduction to use from the reference for #' neighbor finding #' @param neighbor.name Name to store neighbor information in the query #' @param reduction.name Name of projected UMAP to store in the query #' @param reduction.key Value for the projected UMAP key #' @rdname ProjectUMAP #' @concept dimensional_reduction #' @export #' @method ProjectUMAP Seurat #' ProjectUMAP.Seurat <- function( query, query.reduction, query.dims = NULL, reference, reference.reduction, reference.dims = NULL, k.param = 30, nn.method = "annoy", n.trees = 50, annoy.metric = "cosine", l2.norm = FALSE, cache.index = TRUE, index = NULL, neighbor.name = "query_ref.nn", reduction.model, reduction.name = "ref.umap", reduction.key = "refUMAP_", ... ) { if (!query.reduction %in% Reductions(object = query)) { stop("The query.reduction (", query.reduction, ") is not present in the ", "provided query", call. = FALSE) } if (!reference.reduction %in% Reductions(object = reference)) { stop("The reference.reduction (", reference.reduction, ") is not present in the ", "provided reference.", call. = FALSE) } if (!reduction.model %in% Reductions(object = reference)) { stop("The reduction.model (", reduction.model, ") is not present in the ", "provided reference.", call. = FALSE) } proj.umap <- ProjectUMAP( query = query[[query.reduction]], query.dims = query.dims, reference = reference[[reference.reduction]], reference.dims = reference.dims, k.param = k.param, nn.method = nn.method, n.trees = n.trees, annoy.metric = annoy.metric, l2.norm = l2.norm, cache.index = cache.index, index = index, neighbor.name = neighbor.name, reduction.model = reference[[reduction.model]], reduction.key = reduction.key, assay = DefaultAssay(query), ... ) query[[reduction.name]] <- proj.umap$proj.umap query[[neighbor.name]] <- proj.umap$query.neighbor return(query) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param standardize Standardize matrices - scales columns to have unit variance #' and mean 0 #' @param num.cc Number of canonical vectors to calculate #' @param seed.use Random seed to set. If NULL, does not set a seed #' @param verbose Show progress messages #' #' @importFrom irlba irlba #' #' @rdname RunCCA #' @concept dimensional_reduction #' @export #' RunCCA.default <- function( object1, object2, standardize = TRUE, num.cc = 20, seed.use = 42, verbose = FALSE, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } cells1 <- colnames(x = object1) cells2 <- colnames(x = object2) if (standardize) { object1 <- Standardize(mat = object1, display_progress = FALSE) object2 <- Standardize(mat = object2, display_progress = FALSE) } mat3 <- crossprod(x = object1, y = object2) cca.svd <- irlba(A = mat3, nv = num.cc) cca.data <- rbind(cca.svd$u, cca.svd$v) colnames(x = cca.data) <- paste0("CC", 1:num.cc) rownames(cca.data) <- c(cells1, cells2) cca.data <- apply( X = cca.data, MARGIN = 2, FUN = function(x) { if (sign(x[1]) == -1) { x <- x * -1 } return(x) } ) return(list(ccv = cca.data, d = cca.svd$d)) } #' @param assay1,assay2 Assays to pull from in the first and second objects, respectively #' @param features Set of genes to use in CCA. Default is the union of both #' the variable features sets present in both objects. #' @param renormalize Renormalize raw data after merging the objects. If FALSE, #' merge the data matrices also. #' @param rescale Rescale the datasets prior to CCA. If FALSE, uses existing data in the scale data slots. #' @param compute.gene.loadings Also compute the gene loadings. NOTE - this will #' scale every gene in the dataset which may impose a high memory cost. #' @param add.cell.id1,add.cell.id2 Add ... #' @param ... Extra parameters (passed onto MergeSeurat in case with two objects #' passed, passed onto ScaleData in case with single object and rescale.groups #' set to TRUE) #' #' @rdname RunCCA #' @concept dimensional_reduction #' @export #' @method RunCCA Seurat #' RunCCA.Seurat <- function( object1, object2, assay1 = NULL, assay2 = NULL, num.cc = 20, features = NULL, renormalize = FALSE, rescale = FALSE, compute.gene.loadings = TRUE, add.cell.id1 = NULL, add.cell.id2 = NULL, verbose = TRUE, ... ) { op <- options(Seurat.object.assay.version = "v3", Seurat.object.assay.calcn = FALSE) on.exit(expr = options(op), add = TRUE) assay1 <- assay1 %||% DefaultAssay(object = object1) assay2 <- assay2 %||% DefaultAssay(object = object2) if (assay1 != assay2) { warning("Running CCA on different assays") } if (is.null(x = features)) { if (length(x = VariableFeatures(object = object1, assay = assay1)) == 0) { stop(paste0("VariableFeatures not computed for the ", assay1, " assay in object1")) } if (length(x = VariableFeatures(object = object2, assay = assay2)) == 0) { stop(paste0("VariableFeatures not computed for the ", assay2, " assay in object2")) } features <- union(x = VariableFeatures(object = object1), y = VariableFeatures(object = object2)) if (length(x = features) == 0) { stop("Zero features in the union of the VariableFeature sets ") } } nfeatures <- length(x = features) if (!(rescale)) { data.use1 <- GetAssayData(object = object1, assay = assay1, slot = "scale.data") data.use2 <- GetAssayData(object = object2, assay = assay2, slot = "scale.data") features <- CheckFeatures(data.use = data.use1, features = features, object.name = "object1", verbose = FALSE) features <- CheckFeatures(data.use = data.use2, features = features, object.name = "object2", verbose = FALSE) data1 <- data.use1[features, ] data2 <- data.use2[features, ] } if (rescale) { data.use1 <- GetAssayData(object = object1, assay = assay1, slot = "data") data.use2 <- GetAssayData(object = object2, assay = assay2, slot = "data") features <- CheckFeatures(data.use = data.use1, features = features, object.name = "object1", verbose = FALSE) features <- CheckFeatures(data.use = data.use2, features = features, object.name = "object2", verbose = FALSE) data1 <- data.use1[features,] data2 <- data.use2[features,] if (verbose) message("Rescaling groups") data1 <- FastRowScale(as.matrix(data1)) dimnames(data1) <- list(features, colnames(x = object1)) data2 <- FastRowScale(as.matrix(data2)) dimnames(data2) <- list(features, colnames(x = object2)) } if (length(x = features) / nfeatures < 0.1 & verbose) { warning("More than 10% of provided features filtered out. Please check that the given features are present in the scale.data slot for both the assays provided here and that they have non-zero variance.") } if (length(x = features) < 50) { warning("Fewer than 50 features used as input for CCA.") } if (verbose) { message("Running CCA") } cca.results <- RunCCA( object1 = data1, object2 = data2, standardize = TRUE, num.cc = num.cc, verbose = verbose, ) if (verbose) { message("Merging objects") } combined.object <- merge( x = object1, y = object2, merge.data = TRUE, ... ) rownames(x = cca.results$ccv) <- Cells(x = combined.object) colnames(x = data1) <- Cells(x = combined.object)[1:ncol(x = data1)] colnames(x = data2) <- Cells(x = combined.object)[(ncol(x = data1) + 1):length(x = Cells(x = combined.object))] combined.object[['cca']] <- CreateDimReducObject( embeddings = cca.results$ccv[colnames(combined.object), ], assay = assay1, key = "CC_" ) combined.object[['cca']]@assay.used <- DefaultAssay(combined.object) if (ncol(combined.object) != (ncol(object1) + ncol(object2))) { warning("Some cells removed after object merge due to minimum feature count cutoff") } combined.scale <- cbind(data1,data2) combined.object <- SetAssayData(object = combined.object, new.data = combined.scale, slot = "scale.data") ## combined.object@assays$ToIntegrate@scale.data <- combined.scale if (renormalize) { combined.object <- NormalizeData( object = combined.object, assay = assay1, normalization.method = object1[[paste0("NormalizeData.", assay1)]]$normalization.method, scale.factor = object1[[paste0("NormalizeData.", assay1)]]$scale.factor ) } if (compute.gene.loadings) { combined.object <- ProjectDim( object = combined.object, reduction = "cca", verbose = FALSE, overwrite = TRUE) } return(combined.object) } #' @param assay Name of Assay ICA is being run on #' @param nics Number of ICs to compute #' @param rev.ica By default, computes the dimensional reduction on the cell x #' feature matrix. Setting to true will compute it on the transpose (feature x cell #' matrix). #' @param ica.function ICA function from ica package to run (options: icafast, #' icaimax, icajade) #' @param verbose Print the top genes associated with high/low loadings for #' the ICs #' @param ndims.print ICs to print genes for #' @param nfeatures.print Number of genes to print for each IC #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. #' @param seed.use Set a random seed. Setting NULL will not set a seed. #' @param \dots Additional arguments to be passed to fastica #' #' @importFrom ica icafast icaimax icajade #' #' @rdname RunICA #' @concept dimensional_reduction #' @export #' @method RunICA default #' RunICA.default <- function( object, assay = NULL, nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "ica_", seed.use = 42, ... ) { CheckDots(..., fxns = ica.function) if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } nics <- min(nics, ncol(x = object)) ica.fxn <- eval(expr = parse(text = ica.function)) if (rev.ica) { ica.results <- ica.fxn(object, nc = nics,...) cell.embeddings <- ica.results$M } else { ica.results <- ica.fxn(t(x = object), nc = nics,...) cell.embeddings <- ica.results$S } feature.loadings <- (as.matrix(x = object ) %*% as.matrix(x = cell.embeddings)) colnames(x = feature.loadings) <- paste0(reduction.key, 1:ncol(x = feature.loadings)) colnames(x = cell.embeddings) <- paste0(reduction.key, 1:ncol(x = cell.embeddings)) reduction.data <- CreateDimReducObject( embeddings = cell.embeddings, loadings = feature.loadings, assay = assay, key = reduction.key ) if (verbose) { print(x = reduction.data, dims = ndims.print, nfeatures = nfeatures.print) } return(reduction.data) } #' @param features Features to compute ICA on #' #' @rdname RunICA #' @concept dimensional_reduction #' @export #' @method RunICA Assay #' RunICA.Assay <- function( object, assay = NULL, features = NULL, nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "ica_", seed.use = 42, ... ) { data.use <- PrepDR( object = object, features = features, verbose = verbose ) reduction.data <- RunICA( object = data.use, assay = assay, nics = nics, rev.ica = rev.ica, ica.function = ica.function, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... ) return(reduction.data) } #' @param reduction.name dimensional reduction name #' #' @rdname RunICA #' @concept dimensional_reduction #' @method RunICA Seurat #' @export #' RunICA.Seurat <- function( object, assay = NULL, features = NULL, nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "IC_", seed.use = 42, ... ) { assay <- assay %||% DefaultAssay(object = object) reduction.data <- RunICA( object = object[[assay]], assay = assay, features = features, nics = nics, rev.ica = rev.ica, ica.function = ica.function, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... ) object[[reduction.name]] <- reduction.data object <- LogSeuratCommand(object = object) return(object) } #' @param assay Name of Assay PCA is being run on #' @param npcs Total Number of PCs to compute and store (50 by default) #' @param rev.pca By default computes the PCA on the cell x gene matrix. Setting #' to true will compute it on gene x cell matrix. #' @param weight.by.var Weight the cell embeddings by the variance of each PC #' (weights the gene loadings if rev.pca is TRUE) #' @param verbose Print the top genes associated with high/low loadings for #' the PCs #' @param ndims.print PCs to print genes for #' @param nfeatures.print Number of genes to print for each PC #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. PC by default #' @param seed.use Set a random seed. By default, sets the seed to 42. Setting #' NULL will not set a seed. #' @param approx Use truncated singular value decomposition to approximate PCA #' #' @importFrom irlba irlba #' @importFrom stats prcomp #' @importFrom utils capture.output #' #' @rdname RunPCA #' @concept dimensional_reduction #' @export #' RunPCA.default <- function( object, assay = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "PC_", seed.use = 42, approx = TRUE, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (inherits(x = object, what = 'matrix')) { RowVar.function <- RowVar svd.function <- irlba } else if (inherits(x = object, what = 'dgCMatrix')) { RowVar.function <- RowVarSparse svd.function <- irlba } else if (inherits(x = object, what = 'IterableMatrix')) { RowVar.function <- function(x) { return(BPCells::matrix_stats( matrix = x, row_stats = 'variance' )$row_stats['variance',]) } svd.function <- function(A, nv, ...) BPCells::svds(A=A, k = nv) } if (rev.pca) { npcs <- min(npcs, ncol(x = object) - 1) pca.results <- svd.function(A = object, nv = npcs, ...) total.variance <- sum(RowVar.function(x = t(x = object))) sdev <- pca.results$d/sqrt(max(1, nrow(x = object) - 1)) if (weight.by.var) { feature.loadings <- pca.results$u %*% diag(pca.results$d) } else{ feature.loadings <- pca.results$u } cell.embeddings <- pca.results$v } else { total.variance <- sum(RowVar.function(x = object)) if (approx) { npcs <- min(npcs, nrow(x = object) - 1) pca.results <- svd.function(A = t(x = object), nv = npcs, ...) feature.loadings <- pca.results$v sdev <- pca.results$d/sqrt(max(1, ncol(object) - 1)) if (weight.by.var) { cell.embeddings <- pca.results$u %*% diag(pca.results$d) } else { cell.embeddings <- pca.results$u } } else { npcs <- min(npcs, nrow(x = object)) pca.results <- prcomp(x = t(object), rank. = npcs, ...) feature.loadings <- pca.results$rotation sdev <- pca.results$sdev if (weight.by.var) { cell.embeddings <- pca.results$x } else { cell.embeddings <- pca.results$x / (pca.results$sdev[1:npcs] * sqrt(x = ncol(x = object) - 1)) } } } rownames(x = feature.loadings) <- rownames(x = object) colnames(x = feature.loadings) <- paste0(reduction.key, 1:npcs) rownames(x = cell.embeddings) <- colnames(x = object) colnames(x = cell.embeddings) <- colnames(x = feature.loadings) reduction.data <- CreateDimReducObject( embeddings = cell.embeddings, loadings = feature.loadings, assay = assay, stdev = sdev, key = reduction.key, misc = list(total.variance = total.variance) ) if (verbose) { msg <- capture.output(print( x = reduction.data, dims = ndims.print, nfeatures = nfeatures.print )) message(paste(msg, collapse = '\n')) } return(reduction.data) } #' @param features Features to compute PCA on. If features=NULL, PCA will be run #' using the variable features for the Assay. Note that the features must be present #' in the scaled data. Any requested features that are not scaled or have 0 variance #' will be dropped, and the PCA will be run using the remaining features. #' #' @rdname RunPCA #' @concept dimensional_reduction #' @export #' @method RunPCA Assay #' RunPCA.Assay <- function( object, assay = NULL, features = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "PC_", seed.use = 42, ... ) { data.use <- PrepDR( object = object, features = features, verbose = verbose ) reduction.data <- RunPCA( object = data.use, assay = assay, npcs = npcs, rev.pca = rev.pca, weight.by.var = weight.by.var, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... ) return(reduction.data) } #' @method RunPCA StdAssay #' @export #' RunPCA.StdAssay <- function( object, assay = NULL, features = NULL, layer = 'scale.data', npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "PC_", seed.use = 42, ... ) { data.use <- PrepDR5( object = object, features = features, layer = layer, verbose = verbose ) return(RunPCA( object = data.use, assay = assay, npcs = npcs, rev.pca = rev.pca, weight.by.var = weight.by.var, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... )) } #' @param reduction.name dimensional reduction name, pca by default #' #' @rdname RunPCA #' @concept dimensional_reduction #' @export #' @method RunPCA Seurat #' RunPCA.Seurat <- function( object, assay = NULL, features = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "pca", reduction.key = "PC_", seed.use = 42, ... ) { assay <- assay %||% DefaultAssay(object = object) reduction.data <- RunPCA( object = object[[assay]], assay = assay, features = features, npcs = npcs, rev.pca = rev.pca, weight.by.var = weight.by.var, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... ) object[[reduction.name]] <- reduction.data object <- LogSeuratCommand(object = object) return(object) } #' @method RunPCA Seurat5 #' @export #' RunPCA.Seurat5 <- function( object, assay = NULL, features = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "pca", reduction.key = "PC_", seed.use = 42, ... ) { assay <- assay %||% DefaultAssay(object = object) reduction.data <- RunPCA( object = object[[assay]], assay = assay, features = features, npcs = npcs, rev.pca = rev.pca, weight.by.var = weight.by.var, verbose = verbose, ndims.print = ndims.print, nfeatures.print = nfeatures.print, reduction.key = reduction.key, seed.use = seed.use, ... ) object[[reduction.name]] <- reduction.data # object <- LogSeuratCommand(object = object) return(object) } #' @param assay Name of assay that that t-SNE is being run on #' @param seed.use Random seed for the t-SNE. If NULL, does not set the seed #' @param tsne.method Select the method to use to compute the tSNE. Available #' methods are: #' \itemize{ #' \item \dQuote{\code{Rtsne}}: Use the Rtsne package Barnes-Hut #' implementation of tSNE (default) #' \item \dQuote{\code{FIt-SNE}}: Use the FFT-accelerated Interpolation-based #' t-SNE. Based on Kluger Lab code found here: #' \url{https://github.com/KlugerLab/FIt-SNE} #' } #' @param dim.embed The dimensional space of the resulting tSNE embedding #' (default is 2). For example, set to 3 for a 3d tSNE #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. \dQuote{\code{tSNE_}} by default #' #' @importFrom Rtsne Rtsne #' #' @rdname RunTSNE #' @concept dimensional_reduction #' @export #' @method RunTSNE matrix #' RunTSNE.matrix <- function( object, assay = NULL, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, reduction.key = "tSNE_", ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } tsne.data <- switch( EXPR = tsne.method, 'Rtsne' = Rtsne( X = object, dims = dim.embed, pca = FALSE, ... # PCA/is_distance )$Y, 'FIt-SNE' = fftRtsne(X = object, dims = dim.embed, rand_seed = seed.use, ...), stop("Invalid tSNE method: please choose from 'Rtsne' or 'FIt-SNE'") ) colnames(x = tsne.data) <- paste0(reduction.key, 1:ncol(x = tsne.data)) rownames(x = tsne.data) <- rownames(x = object) tsne.reduction <- CreateDimReducObject( embeddings = tsne.data, key = reduction.key, assay = assay, global = TRUE ) return(tsne.reduction) } #' @param cells Which cells to analyze (default, all cells) #' @param dims Which dimensions to use as input features #' #' @rdname RunTSNE #' @concept dimensional_reduction #' @export #' @method RunTSNE DimReduc #' RunTSNE.DimReduc <- function( object, cells = NULL, dims = 1:5, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, reduction.key = "tSNE_", ... ) { args <- as.list(x = sys.frame(which = sys.nframe())) args <- c(args, list(...)) args$object <- args$object[[cells, args$dims]] args$dims <- NULL args$cells <- NULL args$assay <- DefaultAssay(object = object) return(do.call(what = 'RunTSNE', args = args)) } #' @rdname RunTSNE #' @concept dimensional_reduction #' @export #' @method RunTSNE dist #' RunTSNE.dist <- function( object, assay = NULL, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, reduction.key = "tSNE_", ... ) { args <- as.list(x = sys.frame(which = sys.nframe())) args <- c(args, list(...)) args$object <- as.matrix(x = args$object) args$is_distance <- TRUE return(do.call(what = 'RunTSNE', args = args)) } #' @param reduction Which dimensional reduction (e.g. PCA, ICA) to use for #' the tSNE. Default is PCA #' @param features If set, run the tSNE on this subset of features #' (instead of running on a set of reduced dimensions). Not set (NULL) by default; #' \code{dims} must be NULL to run on features #' @param distance.matrix If set, runs tSNE on the given distance matrix #' instead of data matrix (experimental) #' @param reduction.name dimensional reduction name, specifies the position in the object$dr list. tsne by default #' #' @rdname RunTSNE #' @concept dimensional_reduction #' @export #' @method RunTSNE Seurat #' RunTSNE.Seurat <- function( object, reduction = "pca", cells = NULL, dims = 1:5, features = NULL, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, distance.matrix = NULL, reduction.name = "tsne", reduction.key = "tSNE_", ... ) { cells <- cells %||% Cells(x = object) tsne.reduction <- if (!is.null(x = distance.matrix)) { RunTSNE( object = distance.matrix, assay = DefaultAssay(object = object), seed.use = seed.use, tsne.method = tsne.method, dim.embed = dim.embed, reduction.key = reduction.key, is_distance = TRUE, ... ) } else if (!is.null(x = dims)) { RunTSNE( object = object[[reduction]], cells = cells, dims = dims, seed.use = seed.use, tsne.method = tsne.method, dim.embed = dim.embed, reduction.key = reduction.key, ... ) } else if (!is.null(x = features)) { RunTSNE( object = t(x = as.matrix(x = GetAssayData(object = object)[features, cells])), assay = DefaultAssay(object = object), seed.use = seed.use, tsne.method = tsne.method, dim.embed = dim.embed, reduction.key = reduction.key, ... ) } else { stop("Unknown way of running tSNE") } object[[reduction.name]] <- tsne.reduction object <- LogSeuratCommand(object = object) return(object) } #' @importFrom reticulate py_module_available py_set_seed import #' @importFrom uwot umap umap_transform #' @importFrom future nbrOfWorkers #' #' @rdname RunUMAP #' @concept dimensional_reduction #' @method RunUMAP default #' @export #' RunUMAP.default <- function( object, reduction.key = 'UMAP_', assay = NULL, reduction.model = NULL, return.model = FALSE, umap.method = 'uwot', n.neighbors = 30L, n.components = 2L, metric = 'cosine', n.epochs = NULL, learning.rate = 1.0, min.dist = 0.3, spread = 1.0, set.op.mix.ratio = 1.0, local.connectivity = 1L, repulsion.strength = 1, negative.sample.rate = 5, a = NULL, b = NULL, uwot.sgd = FALSE, seed.use = 42, metric.kwds = NULL, angular.rp.forest = FALSE, densmap = FALSE, dens.lambda = 2, dens.frac = 0.3, dens.var.shift = 0.1, verbose = TRUE, ... ) { CheckDots(...) if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (umap.method != 'umap-learn' && getOption('Seurat.warn.umap.uwot', TRUE)) { warning( "The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric", "\nTo use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'", "\nThis message will be shown once per session", call. = FALSE, immediate. = TRUE ) options(Seurat.warn.umap.uwot = FALSE) } if (umap.method == 'uwot-learn') { warning("'uwot-learn' is deprecated. Set umap.method = 'uwot' and return.model = TRUE") umap.method <- "uwot" return.model <- TRUE } if (densmap && umap.method != 'umap-learn'){ warning("densmap is only supported by umap-learn method. Method is changed to 'umap-learn'") umap.method <- 'umap-learn' } if (return.model) { if (verbose) { message("UMAP will return its model") } umap.method = "uwot" } if (inherits(x = object, what = "Neighbor")) { object <- list( idx = Indices(object), dist = Distances(object) ) } if (!is.null(x = reduction.model)) { if (verbose) { message("Running UMAP projection") } umap.method <- "uwot-predict" } umap.output <- switch( EXPR = umap.method, 'umap-learn' = { if (!py_module_available(module = 'umap')) { stop("Cannot find UMAP, please install through pip (e.g. pip install umap-learn).") } if (!py_module_available(module = 'sklearn')) { stop("Cannot find sklearn, please install through pip (e.g. pip install scikit-learn).") } if (!is.null(x = seed.use)) { py_set_seed(seed = seed.use) } if (typeof(x = n.epochs) == "double") { n.epochs <- as.integer(x = n.epochs) } umap_import <- import(module = "umap", delay_load = TRUE) sklearn <- import("sklearn", delay_load = TRUE) if (densmap && numeric_version(x = umap_import$`__version__`) < numeric_version(x = "0.5.0")) { stop("densmap is only supported by versions >= 0.5.0 of umap-learn. Upgrade umap-learn (e.g. pip install --upgrade umap-learn).") } random.state <- sklearn$utils$check_random_state(seed = as.integer(x = seed.use)) umap.args <- list( n_neighbors = as.integer(x = n.neighbors), n_components = as.integer(x = n.components), metric = metric, n_epochs = n.epochs, learning_rate = learning.rate, min_dist = min.dist, spread = spread, set_op_mix_ratio = set.op.mix.ratio, local_connectivity = local.connectivity, repulsion_strength = repulsion.strength, negative_sample_rate = negative.sample.rate, random_state = random.state, a = a, b = b, metric_kwds = metric.kwds, angular_rp_forest = angular.rp.forest, verbose = verbose ) if (numeric_version(x = umap_import$`__version__`) >= numeric_version(x = "0.5.0")) { umap.args <- c(umap.args, list( densmap = densmap, dens_lambda = dens.lambda, dens_frac = dens.frac, dens_var_shift = dens.var.shift, output_dens = FALSE )) } umap <- do.call(what = umap_import$UMAP, args = umap.args) umap$fit_transform(as.matrix(x = object)) }, 'uwot' = { if (is.list(x = object)) { umap( X = NULL, nn_method = object, n_threads = nbrOfWorkers(), n_components = as.integer(x = n.components), metric = metric, n_epochs = n.epochs, learning_rate = learning.rate, min_dist = min.dist, spread = spread, set_op_mix_ratio = set.op.mix.ratio, local_connectivity = local.connectivity, repulsion_strength = repulsion.strength, negative_sample_rate = negative.sample.rate, a = a, b = b, fast_sgd = uwot.sgd, verbose = verbose, ret_model = return.model ) } else { umap( X = object, n_threads = nbrOfWorkers(), n_neighbors = as.integer(x = n.neighbors), n_components = as.integer(x = n.components), metric = metric, n_epochs = n.epochs, learning_rate = learning.rate, min_dist = min.dist, spread = spread, set_op_mix_ratio = set.op.mix.ratio, local_connectivity = local.connectivity, repulsion_strength = repulsion.strength, negative_sample_rate = negative.sample.rate, a = a, b = b, fast_sgd = uwot.sgd, verbose = verbose, ret_model = return.model ) } }, 'uwot-predict' = { if (metric == 'correlation') { warning( "UWOT does not implement the correlation metric, using cosine instead", call. = FALSE, immediate. = TRUE ) metric <- 'cosine' } if (is.null(x = reduction.model) || !inherits(x = reduction.model, what = 'DimReduc')) { stop( "If running projection UMAP, please pass a DimReduc object with the model stored to reduction.model.", call. = FALSE ) } model <- Misc( object = reduction.model, slot = "model" ) # add num_precomputed_nns to = numeric_version(x = "0.5.0")) { umap.args <- c(umap.args, list( densmap = densmap, densmap_kwds = densmap.kwds, output_dens = FALSE )) } embeddings <- do.call(what = umap$umap_$simplicial_set_embedding, args = umap.args) if (length(x = embeddings) == 2) { embeddings <- embeddings[[1]] } rownames(x = embeddings) <- colnames(x = data) colnames(x = embeddings) <- paste0("UMAP_", 1:n.components) # center the embeddings on zero embeddings <- scale(x = embeddings, scale = FALSE) umap <- CreateDimReducObject( embeddings = embeddings, key = reduction.key, assay = assay, global = TRUE ) return(umap) } #' @rdname RunUMAP #' @concept dimensional_reduction #' @method RunUMAP Neighbor #' @export #' RunUMAP.Neighbor <- function( object, reduction.model, ... ) { neighborlist <- list("idx" = Indices(object), "dist" = Distances(object)) RunUMAP( object = neighborlist, reduction.model = reduction.model, ... ) } #' @param reduction.model \code{DimReduc} object that contains the umap model #' @param dims Which dimensions to use as input features, used only if #' \code{features} is NULL #' @param reduction Which dimensional reduction (PCA or ICA) to use for the #' UMAP input. Default is PCA #' @param features If set, run UMAP on this subset of features (instead of running on a #' set of reduced dimensions). Not set (NULL) by default; \code{dims} must be NULL to run #' on features #' @param graph Name of graph on which to run UMAP #' @param assay Assay to pull data for when using \code{features}, or assay used to construct Graph #' if running UMAP on a Graph #' @param nn.name Name of knn output on which to run UMAP #' @param slot The slot used to pull data for when using \code{features}. data slot is by default. #' @param umap.method UMAP implementation to run. Can be #' \describe{ #' \item{\code{uwot}:}{Runs umap via the uwot R package} #' \item{\code{uwot-learn}:}{Runs umap via the uwot R package and return the learned umap model} #' \item{\code{umap-learn}:}{Run the Seurat wrapper of the python umap-learn package} #' } #' @param n.neighbors This determines the number of neighboring points used in #' local approximations of manifold structure. Larger values will result in more #' global structure being preserved at the loss of detailed local structure. In #' general this parameter should often be in the range 5 to 50. #' @param n.components The dimension of the space to embed into. #' @param metric metric: This determines the choice of metric used to measure #' distance in the input space. A wide variety of metrics are already coded, and #' a user defined function can be passed as long as it has been JITd by numba. #' @param n.epochs he number of training epochs to be used in optimizing the low dimensional #' embedding. Larger values result in more accurate embeddings. If NULL is specified, a value will #' be selected based on the size of the input dataset (200 for large datasets, 500 for small). #' @param learning.rate The initial learning rate for the embedding optimization. #' @param min.dist This controls how tightly the embedding is allowed compress points together. #' Larger values ensure embedded points are more evenly distributed, while smaller values allow the #' algorithm to optimize more accurately with regard to local structure. Sensible values are in #' the range 0.001 to 0.5. #' @param spread The effective scale of embedded points. In combination with min.dist this #' determines how clustered/clumped the embedded points are. #' @param set.op.mix.ratio Interpolate between (fuzzy) union and intersection as the set operation #' used to combine local fuzzy simplicial sets to obtain a global fuzzy simplicial sets. Both fuzzy #' set operations use the product t-norm. The value of this parameter should be between 0.0 and #' 1.0; a value of 1.0 will use a pure fuzzy union, while 0.0 will use a pure fuzzy intersection. #' @param local.connectivity The local connectivity required - i.e. the number of nearest neighbors #' that should be assumed to be connected at a local level. The higher this value the more connected #' the manifold becomes locally. In practice this should be not more than the local intrinsic #' dimension of the manifold. #' @param repulsion.strength Weighting applied to negative samples in low dimensional embedding #' optimization. Values higher than one will result in greater weight being given to negative #' samples. #' @param negative.sample.rate The number of negative samples to select per positive sample in the #' optimization process. Increasing this value will result in greater repulsive force being applied, #' greater optimization cost, but slightly more accuracy. #' @param a More specific parameters controlling the embedding. If NULL, these values are set #' automatically as determined by min. dist and spread. Parameter of differentiable approximation of #' right adjoint functor. #' @param b More specific parameters controlling the embedding. If NULL, these values are set #' automatically as determined by min. dist and spread. Parameter of differentiable approximation of #' right adjoint functor. #' @param uwot.sgd Set \code{uwot::umap(fast_sgd = TRUE)}; see \code{\link[uwot]{umap}} for more details #' @param metric.kwds A dictionary of arguments to pass on to the metric, such as the p value for #' Minkowski distance. If NULL then no arguments are passed on. #' @param angular.rp.forest Whether to use an angular random projection forest to initialize the #' approximate nearest neighbor search. This can be faster, but is mostly on useful for metric that #' use an angular style distance such as cosine, correlation etc. In the case of those metrics #' angular forests will be chosen automatically. #' @param densmap Whether to use the density-augmented objective of densMAP. #' Turning on this option generates an embedding where the local densities #' are encouraged to be correlated with those in the original space. #' Parameters below with the prefix ‘dens’ further control the behavior #' of this extension. Default is FALSE. Only compatible with 'umap-learn' method #' and version of umap-learn >= 0.5.0 #' @param densmap.kwds A dictionary of arguments to pass on to the densMAP optimization. #' @param dens.lambda Specific parameter which controls the regularization weight #' of the density correlation term in densMAP. Higher values prioritize density #' preservation over the UMAP objective, and vice versa for values closer to zero. #' Setting this parameter to zero is equivalent to running the original UMAP algorithm. #' Default value is 2. #' @param dens.frac Specific parameter which controls the fraction of epochs #' (between 0 and 1) where the density-augmented objective is used in densMAP. #' The first (1 - dens_frac) fraction of epochs optimize the original UMAP #' objective before introducing the density correlation term. Default is 0.3. #' @param dens.var.shift Specific parameter which specifies a small constant #' added to the variance of local radii in the embedding when calculating #' the density correlation objective to prevent numerical instability from #' dividing by a small number. Default is 0.1. #' @param reduction.name Name to store dimensional reduction under in the Seurat object #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. UMAP by default #' @param return.model whether UMAP will return the uwot model #' @param seed.use Set a random seed. By default, sets the seed to 42. Setting #' NULL will not set a seed #' @param verbose Controls verbosity #' #' @rdname RunUMAP #' @concept dimensional_reduction #' @export #' @method RunUMAP Seurat #' RunUMAP.Seurat <- function( object, dims = NULL, reduction = 'pca', features = NULL, graph = NULL, assay = DefaultAssay(object = object), nn.name = NULL, slot = 'data', umap.method = 'uwot', reduction.model = NULL, return.model = FALSE, n.neighbors = 30L, n.components = 2L, metric = 'cosine', n.epochs = NULL, learning.rate = 1, min.dist = 0.3, spread = 1, set.op.mix.ratio = 1, local.connectivity = 1L, repulsion.strength = 1, negative.sample.rate = 5L, a = NULL, b = NULL, uwot.sgd = FALSE, seed.use = 42L, metric.kwds = NULL, angular.rp.forest = FALSE, densmap = FALSE, dens.lambda = 2, dens.frac = 0.3, dens.var.shift = 0.1, verbose = TRUE, reduction.name = 'umap', reduction.key = NULL, ... ) { CheckDots(...) if (sum(c(is.null(x = dims), is.null(x = features), is.null(x = graph))) < 2) { stop("Please specify only one of the following arguments: dims, features, or graph") } if (sum(!is.null(x = dims), !is.null(x = nn.name), !is.null(x = graph), !is.null(x = features)) != 1) { stop("Only one parameter among 'dims', 'nn.name', 'graph', or 'features' ", "should be used at a time to run UMAP") } if (!is.null(x = features)) { data.use <- as.matrix(x = t(x = GetAssayData(object = object, slot = slot, assay = assay)[features, , drop = FALSE])) if (ncol(x = data.use) < n.components) { stop( "Please provide as many or more features than n.components: ", length(x = features), " features provided, ", n.components, " UMAP components requested", call. = FALSE ) } } else if (!is.null(x = dims)) { data.use <- Embeddings(object[[reduction]])[, dims] assay <- DefaultAssay(object = object[[reduction]]) if (length(x = dims) < n.components) { stop( "Please provide as many or more dims than n.components: ", length(x = dims), " dims provided, ", n.components, " UMAP components requested", call. = FALSE ) } } else if (!is.null(x = nn.name)) { if (!inherits(x = object[[nn.name]], what = "Neighbor")) { stop( "Please specify a Neighbor object name, ", "instead of the name of a ", class(object[[nn.name]]), " object", call. = FALSE ) } data.use <- object[[nn.name]] } else if (!is.null(x = graph)) { if (!inherits(x = object[[graph]], what = "Graph")) { stop( "Please specify a Graph object name, ", "instead of the name of a ", class(object[[graph]]), " object", call. = FALSE ) } data.use <- object[[graph]] } else { stop("Please specify one of dims, features, or graph") } object[[reduction.name]] <- RunUMAP( object = data.use, reduction.model = reduction.model, return.model = return.model, assay = assay, umap.method = umap.method, n.neighbors = n.neighbors, n.components = n.components, metric = metric, n.epochs = n.epochs, learning.rate = learning.rate, min.dist = min.dist, spread = spread, set.op.mix.ratio = set.op.mix.ratio, local.connectivity = local.connectivity, repulsion.strength = repulsion.strength, negative.sample.rate = negative.sample.rate, a = a, b = b, uwot.sgd = uwot.sgd, seed.use = seed.use, metric.kwds = metric.kwds, angular.rp.forest = angular.rp.forest, densmap = densmap, dens.lambda = dens.lambda, dens.frac = dens.frac, dens.var.shift = dens.var.shift, reduction.key = reduction.key %||% Key(object = reduction.name, quiet = TRUE), verbose = verbose ) object <- LogSeuratCommand(object = object) return(object) } #' @param dims Which dimensions to examine #' @param score.thresh Threshold to use for the proportion test of PC #' significance (see Details) #' #' @importFrom stats prop.test #' #' @rdname ScoreJackStraw #' @concept dimensional_reduction #' @export #' @method ScoreJackStraw JackStrawData #' ScoreJackStraw.JackStrawData <- function( object, dims = 1:5, score.thresh = 1e-5, ... ) { CheckDots(...) pAll <- JS(object = object, slot = "empirical.p.values") pAll <- pAll[, dims, drop = FALSE] pAll <- as.data.frame(pAll) pAll$Contig <- rownames(x = pAll) score.df <- NULL for (i in dims) { pc.score <- suppressWarnings(prop.test( x = c( length(x = which(x = pAll[, i] <= score.thresh)), floor(x = nrow(x = pAll) * score.thresh) ), n = c(nrow(pAll), nrow(pAll)) )$p.val) if (length(x = which(x = pAll[, i] <= score.thresh)) == 0) { pc.score <- 1 } if (is.null(x = score.df)) { score.df <- data.frame(PC = paste0("PC", i), Score = pc.score) } else { score.df <- rbind(score.df, data.frame(PC = paste0("PC", i), Score = pc.score)) } } score.df$PC <- dims score.df <- as.matrix(score.df) JS(object = object, slot = 'overall') <- score.df return(object) } #' @rdname ScoreJackStraw #' @concept dimensional_reduction #' @export #' @method ScoreJackStraw DimReduc #' ScoreJackStraw.DimReduc <- function(object, dims = 1:5, score.thresh = 1e-5, ...) { JS(object = object) <- ScoreJackStraw( object = JS(object = object), dims = dims, score.thresh = score.thresh, ... ) return(object) } #' @param reduction Reduction associated with JackStraw to score #' @param do.plot Show plot. To return ggplot object, use \code{JackStrawPlot} after #' running ScoreJackStraw. #' #' @seealso \code{\link{JackStrawPlot}} #' #' @rdname ScoreJackStraw #' @concept dimensional_reduction #' @export #' @method ScoreJackStraw Seurat #' ScoreJackStraw.Seurat <- function( object, reduction = "pca", dims = 1:5, score.thresh = 1e-5, do.plot = FALSE, ... ) { object[[reduction]] <- ScoreJackStraw( object = object[[reduction]], dims = dims, score.thresh = score.thresh, ... ) if (do.plot) { CheckDots(..., fxns = 'JackStrawPlot') suppressWarnings(expr = print(JackStrawPlot( object = object, reduction = reduction, dims = dims, ... ))) } object <- LogSeuratCommand(object = object) return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Check that features are present and have non-zero variance # # @param data.use Feature matrix (features are rows) # @param features Features to check # @param object.name Name of object for message printing # @param verbose Print warnings # # @return Returns a vector of features that is the subset of features # that have non-zero variance # CheckFeatures <- function( data.use, features, object.name, verbose = TRUE ) { if (any(!features %in% rownames(x = data.use))) { missing.features <- features[!features %in% rownames(x = data.use)] features <- setdiff(x = features, y = missing.features) if (verbose){ warning( paste0( "The following ", length(x = missing.features), " features are not scaled in ", object.name, ": ", paste0(missing.features, collapse = ", ") )) } } if (inherits(x = data.use, what = 'dgCMatrix')) { features.var <- SparseRowVar(mat = data.use[features, ], display_progress = F) } else if (inherits(x = data.use, what = "IterableMatrix")) { bp.stats <- BPCells::matrix_stats(matrix = data.use, row_stats = "variance") features.var <- bp.stats$row_stats["variance",][features] } else { features.var <- RowVar(x = data.use[features, ]) } no.var.features <- features[features.var == 0] if (length(x = no.var.features) > 0 && verbose) { warning( paste0( "The following features have zero variance in ", object.name, ": ", paste0(no.var.features, collapse = ", ") )) } features <- setdiff(x = features, y = no.var.features) features <- features[!is.na(x = features)] return(features) } #internal EmpiricalP <- function(x, nullval) { return(sum(nullval > x) / length(x = nullval)) } # FIt-SNE helper function for calling fast_tsne from R # # Based on Kluger Lab FIt-SNE v1.2.1 code on https://github.com/KlugerLab/FIt-SNE/blob/master/fast_tsne.R # commit 601608ed42e4be2765970910927da20f0b0bf9b9 on June 25, 2020 # #' @importFrom utils file_test # fftRtsne <- function(X, dims = 2, perplexity = 30, theta = 0.5, max_iter = 750, fft_not_bh = TRUE, ann_not_vptree = TRUE, stop_early_exag_iter = 250, exaggeration_factor = 12.0, no_momentum_during_exag = FALSE, start_late_exag_iter = -1, late_exag_coeff = 1.0, mom_switch_iter = 250, momentum = 0.5, final_momentum = 0.8, learning_rate = 'auto', n_trees = 50, search_k = -1, rand_seed = -1, nterms = 3, intervals_per_integer = 1, min_num_intervals = 50, K = -1, sigma = -30, initialization = 'pca', max_step_norm = 5, data_path = NULL, result_path = NULL, load_affinities = NULL, fast_tsne_path = NULL, nthreads = getOption('mc.cores', default = 1), perplexity_list = NULL, get_costs = FALSE, df = 1.0, ... ) { CheckDots(...) if (is.null(x = data_path)) { data_path <- tempfile(pattern = 'fftRtsne_data_', fileext = '.dat') } if (is.null(x = result_path)) { result_path <- tempfile(pattern = 'fftRtsne_result_', fileext = '.dat') } if (is.null(x = fast_tsne_path)) { # suppressWarnings(expr = fast_tsne_path <- system2(command = 'which', args = 'fast_tsne', stdout = TRUE)) fast_tsne_path <- SysExec(progs = ifelse( test = .Platform$OS.type == 'windows', yes = 'FItSNE.exe', no = 'fast_tsne' )) if (length(x = fast_tsne_path) == 0) { stop("no fast_tsne_path specified and fast_tsne binary is not in the search path") } } fast_tsne_path <- normalizePath(path = fast_tsne_path) if (!file_test(op = '-x', x = fast_tsne_path)) { stop("fast_tsne_path '", fast_tsne_path, "' does not exist or is not executable") } # check fast_tsne version ft.out <- suppressWarnings(expr = system2(command = fast_tsne_path, stdout = TRUE)) version_number <- regmatches(ft.out[1], regexpr('= t-SNE v[0-9.]+', ft.out[1])) if (is.null(version_number)){ message("First line of fast_tsne output is") message(ft.out[1]) stop("Our FIt-SNE wrapper requires FIt-SNE v1.0+, please install the appropriate version from github.com/KlugerLab/FIt-SNE and have fast_tsne_path point to it if it's not in your path") } else { version_number <- gsub('= t-SNE v', '', version_number) } is.wholenumber <- function(x, tol = .Machine$double.eps ^ 0.5) { return(abs(x = x - round(x = x)) < tol) } if (version_number == '1.0.0' && df != 1.0) { stop("This version of FIt-SNE does not support df!=1. Please install the appropriate version from github.com/KlugerLab/FIt-SNE") } if (!is.numeric(x = theta) || (theta < 0.0) || (theta > 1.0) ) { stop("Incorrect theta.") } if (nrow(x = X) - 1 < 3 * perplexity) { stop("Perplexity is too large.") } if (!is.matrix(x = X)) { stop("Input X is not a matrix") } if (!(max_iter > 0)) { stop("Incorrect number of iterations.") } if (!is.wholenumber(x = stop_early_exag_iter) || stop_early_exag_iter < 0) { stop("stop_early_exag_iter should be a positive integer") } if (!is.numeric(x = exaggeration_factor)) { stop("exaggeration_factor should be numeric") } if (!is.numeric(df)) { stop("df should be numeric") } if (!is.wholenumber(x = dims) || dims <= 0) { stop("Incorrect dimensionality.") } if (search_k == -1) { if (perplexity > 0) { search_k <- n_trees * perplexity * 3 } else if (perplexity == 0) { search_k <- n_trees * max(perplexity_list) * 3 } else { search_k <- n_trees * K } } if (is.character(learning_rate) && learning_rate =='auto') { learning_rate = max(200, nrow(X)/exaggeration_factor) } if (is.character(start_late_exag_iter) && start_late_exag_iter =='auto') { if (late_exag_coeff > 0) { start_late_exag_iter = stop_early_exag_iter } else { start_late_exag_iter = -1 } } if (is.character(initialization) && initialization == 'pca') { if (rand_seed != -1) { set.seed(rand_seed) } if (requireNamespace("rsvd", quietly = TRUE)) { message('Using rsvd() to compute the top PCs for initialization.') X_c <- scale(x = X, center = TRUE, scale = FALSE) rsvd_out <- rsvd::rsvd(A = X_c, k = dims) X_top_pcs <- rsvd_out$u %*% diag(x = rsvd_out$d, nrow = dims) } else if (requireNamespace("irlba", quietly = TRUE)) { message('Using irlba() to compute the top PCs for initialization.') X_colmeans <- colMeans(x = X) irlba_out <- irlba::irlba(A = X, nv = dims, center = X_colmeans) X_top_pcs <- irlba_out$u %*% diag(x = irlba_out$d, nrow = dims) } else { stop( "By default, FIt-SNE initializes the embedding with the top PCs. We use either rsvd or irlba for fast computation. To use this functionality, please install the rsvd package with install.packages('rsvd') or the irlba package with install.packages('ilrba'). Otherwise, set initialization to NULL for random initialization, or any N by dims matrix for custom initialization." ) } initialization <- 0.0001*(X_top_pcs/sd(X_top_pcs[,1])) } else if (is.character(x = initialization) && initialization == 'random') { message('Random initialization') initialization = NULL } nbody_algo <- ifelse(test = fft_not_bh, yes = 2, no = 1) if (is.null(load_affinities)) { load_affinities <- 0 } else { if (load_affinities == 'load') { load_affinities <- 1 } else if (load_affinities == 'save') { load_affinities <- 2 } else { load_affinities <- 0 } } knn_algo <- ifelse(test = ann_not_vptree, yes = 1, no = 2) tX <- as.numeric(t(X)) f <- file(description = data_path, open = "wb") n = nrow(x = X) D = ncol(x = X) writeBin(object = as.integer(x = n), con = f, size = 4) writeBin(object = as.integer(x = D), con = f, size = 4) writeBin(object = as.numeric(x = theta), con = f, size = 8) writeBin(object = as.numeric(x = perplexity), con = f, size = 8) if (perplexity == 0) { writeBin(object = as.integer(x = length(x = perplexity_list)), con = f, size = 4) writeBin(object = perplexity_list, con = f) } writeBin(object = as.integer(x = dims), con = f, size = 4) #theta writeBin(object = as.integer(x = max_iter), con = f, size = 4) writeBin(object = as.integer(x = stop_early_exag_iter), con = f, size = 4) writeBin(object = as.integer(x = mom_switch_iter), con = f, size = 4) writeBin(object = as.numeric(x = momentum), con = f, size = 8) writeBin(object = as.numeric(x = final_momentum), con = f, size = 8) writeBin(object = as.numeric(x = learning_rate), con = f, size = 8) if (!(version_number %in% c('1.1.0', '1.0.0'))) { writeBin(object = as.numeric(x = max_step_norm), f, size = 8) } writeBin(object = as.integer(x = K), con = f, size = 4) #K writeBin(object = as.numeric(x = sigma), con = f, size = 8) #sigma writeBin(object = as.integer(x = nbody_algo), con = f, size = 4) #not barnes hut writeBin(object = as.integer(x = knn_algo), con = f, size = 4) writeBin(object = as.numeric(x = exaggeration_factor), con = f, size = 8) #compexag writeBin(object = as.integer(x = no_momentum_during_exag), con = f, size = 4) writeBin(object = as.integer(x = n_trees), con = f, size = 4) writeBin(object = as.integer(x = search_k), con = f, size = 4) writeBin(object = as.integer(x = start_late_exag_iter), con = f, size = 4) writeBin(object = as.numeric(x = late_exag_coeff), con = f, size = 8) writeBin(object = as.integer(x = nterms), con = f, size = 4) writeBin(object = as.numeric(x = intervals_per_integer), con = f, size = 8) writeBin(object = as.integer(x = min_num_intervals), con = f, size = 4) writeBin(object = tX, con = f) writeBin(object = as.integer(x = rand_seed), con = f, size = 4) if (version_number != "1.0.0") { writeBin(object = as.numeric(x = df), con = f, size = 8) } writeBin(object = as.integer(x = load_affinities), con = f, size = 4) if (!is.null(x = initialization)) { writeBin(object = c(t(x = initialization)), con = f) } close(con = f) if (version_number == "1.0.0") { flag <- system2( command = fast_tsne_path, args = c(data_path, result_path, nthreads) ) } else { flag <- system2( command = fast_tsne_path, args = c(version_number, data_path, result_path, nthreads) ) } if (flag != 0) { stop('tsne call failed') } f <- file(description = result_path, open = "rb") n <- readBin(con = f, what = integer(), n = 1, size = 4) d <- readBin(con = f, what = integer(), n = 1, size = 4) Y <- readBin(con = f, what = numeric(), n = n * d) Y <- t(x = matrix(Y, nrow = d)) if (get_costs) { tmp <- readBin(con = f, what = integer(), n = 1, size = 4) costs <- readBin(con = f, what = numeric(), n = max_iter, size = 8) Yout <- list(Y = Y, costs = costs) } else { Yout <- Y } close(con = f) file.remove(data_path) file.remove(result_path) return(Yout) } #internal # JackRandom <- function( scaled.data, prop.use = 0.01, r1.use = 1, r2.use = 5, seed.use = 1, rev.pca = FALSE, weight.by.var = weight.by.var, maxit = 1000 ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } rand.genes <- sample( x = rownames(x = scaled.data), size = nrow(x = scaled.data) * prop.use ) # make sure that rand.genes is at least 3 if (length(x = rand.genes) < 3) { rand.genes <- sample(x = rownames(x = scaled.data), size = 3) } data.mod <- scaled.data data.mod[rand.genes, ] <- MatrixRowShuffle(x = as.matrix(scaled.data[rand.genes, ])) temp.object <- RunPCA( object = data.mod, assay = "temp", npcs = r2.use, features = rownames(x = data.mod), rev.pca = rev.pca, weight.by.var = weight.by.var, verbose = FALSE, maxit = maxit ) return(Loadings(temp.object)[rand.genes, r1.use:r2.use]) } # Calculates the l2-norm of a vector # # Modified from PMA package # @references Witten, Tibshirani, and Hastie, Biostatistics 2009 # @references \url{https://github.com/cran/PMA/blob/master/R/PMD.R} # # @param vec numeric vector # # @return returns the l2-norm. # L2Norm <- function(vec) { a <- sqrt(x = sum(vec ^ 2)) if (a == 0) { a <- .05 } return(a) } # Prep data for dimensional reduction # # Common checks and preparatory steps before running certain dimensional # reduction techniques # # @param object Assay object # @param features Features to use as input for the dimensional reduction technique. # Default is variable features # @ param verbose Print messages and warnings # # PrepDR <- function( object, features = NULL, slot = 'scale.data', verbose = TRUE ) { if (length(x = VariableFeatures(object = object)) == 0 && is.null(x = features)) { stop("Variable features haven't been set. Run FindVariableFeatures() or provide a vector of feature names.") } data.use <- GetAssayData(object = object, slot = slot) if (nrow(x = data.use ) == 0 && slot == "scale.data") { stop("Data has not been scaled. Please run ScaleData and retry") } features <- features %||% VariableFeatures(object = object) features.keep <- unique(x = features[features %in% rownames(x = data.use)]) if (length(x = features.keep) < length(x = features)) { features.exclude <- setdiff(x = features, y = features.keep) if (verbose) { warning(paste0("The following ", length(x = features.exclude), " features requested have not been scaled (running reduction without them): ", paste0(features.exclude, collapse = ", "))) } } features <- features.keep if (inherits(x = data.use, what = 'dgCMatrix')) { features.var <- RowVarSparse(mat = data.use[features, ]) } else { features.var <- RowVar(x = data.use[features, ]) } features.keep <- features[features.var > 0] if (length(x = features.keep) < length(x = features)) { features.exclude <- setdiff(x = features, y = features.keep) if (verbose) { warning(paste0("The following ", length(x = features.exclude), " features requested have zero variance (running reduction without them): ", paste0(features.exclude, collapse = ", "))) } } features <- features.keep features <- features[!is.na(x = features)] data.use <- data.use[features, ] return(data.use) } PrepDR5 <- function(object, features = NULL, layer = 'scale.data', verbose = TRUE) { layer <- layer[1L] olayer <- layer layer <- Layers(object = object, search = layer) if (is.null(layer)) { abort(paste0("No layer matching pattern '", olayer, "' not found. Please run ScaleData and retry")) } data.use <- LayerData(object = object, layer = layer) features <- features %||% VariableFeatures(object = object) if (!length(x = features)) { stop("No variable features, run FindVariableFeatures() or provide a vector of features", call. = FALSE) } if (is(data.use, "IterableMatrix")) { features.var <- BPCells::matrix_stats(matrix=data.use, row_stats="variance")$row_stats["variance",] } else { features.var <- apply(X = data.use, MARGIN = 1L, FUN = var) } features.keep <- features[features.var > 0] if (!length(x = features.keep)) { stop("None of the requested features have any variance", call. = FALSE) } else if (length(x = features.keep) < length(x = features)) { exclude <- setdiff(x = features, y = features.keep) if (isTRUE(x = verbose)) { warning( "The following ", length(x = exclude), " features requested have zero variance; running reduction without them: ", paste(exclude, collapse = ', '), call. = FALSE, immediate. = TRUE ) } } features <- features.keep features <- features[!is.na(x = features)] features.use <- features[features %in% rownames(data.use)] if(!isTRUE(all.equal(features, features.use))) { missing_features <- setdiff(features, features.use) if(length(missing_features) > 0) { warning_message <- paste("The following features were not available: ", paste(missing_features, collapse = ", "), ".", sep = "") warning(warning_message, immediate. = TRUE) } } data.use <- data.use[features.use, ] return(data.use) } #' @param assay Name of Assay SPCA is being run on #' @param npcs Total Number of SPCs to compute and store (50 by default) #' @param verbose Print the top genes associated with high/low loadings for #' the SPCs #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names. SPC by default #' @param graph Graph used supervised by SPCA #' @param seed.use Set a random seed. By default, sets the seed to 42. Setting #' NULL will not set a seed. #' #' @importFrom irlba irlba #' #' @concept dimensional_reduction #' @rdname RunSPCA #' @export RunSPCA.default <- function( object, assay = NULL, npcs = 50, reduction.key = "SPC_", graph = NULL, verbose = FALSE, seed.use = 42, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } npcs <- min(npcs, nrow(x = object) - 1) if (verbose) { message("Computing sPCA transformation") } HSIC <- object %*% graph %*% t(x = object) pca.results <- irlba(A = HSIC, nv = npcs) feature.loadings <- pca.results$u rownames(x = feature.loadings) <- rownames(x = object) cell.embeddings <- t(object) %*% feature.loadings colnames(x = cell.embeddings) <- colnames(x = feature.loadings) <- paste0(reduction.key, 1:ncol(x = cell.embeddings)) sdev <- pca.results$d / sqrt(max(1, nrow(x = HSIC) - 1)) reduction.data <- CreateDimReducObject( embeddings = cell.embeddings, loadings = feature.loadings, assay = assay, stdev = sdev, key = reduction.key ) return(reduction.data) } #' @param features Features to compute SPCA on. If features=NULL, SPCA will be run #' using the variable features for the Assay. #' #' @rdname RunSPCA #' @concept dimensional_reduction #' @export #' @method RunSPCA Assay #' RunSPCA.Assay <- function( object, assay = NULL, features = NULL, npcs = 50, reduction.key = "SPC_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) { data.use <- PrepDR( object = object, features = features, verbose = verbose ) reduction.data <- RunSPCA( object = data.use, assay = assay, npcs = npcs, reduction.key = reduction.key, graph = graph, verbose = verbose, seed.use = seed.use, ... ) return(reduction.data) } #' @param features Features to compute SPCA on. If features=NULL, SPCA will be run #' using the variable features for the Assay. #' @param layer Layer to run SPCA on #' #' @rdname RunSPCA #' @concept dimensional_reduction #' @export #' @method RunSPCA Assay5 #' RunSPCA.Assay5 <- function( object, assay = NULL, features = NULL, npcs = 50, reduction.key = "SPC_", graph = NULL, verbose = TRUE, seed.use = 42, layer = 'scale.data', ... ) { data.use <- PrepDR5( object = object, features = features, layer = layer, verbose = verbose ) reduction.data <- RunSPCA( object = data.use, assay = assay, npcs = npcs, reduction.key = reduction.key, graph = graph, verbose = verbose, seed.use = seed.use, ... ) return(reduction.data) } #' @param reduction.name dimensional reduction name, spca by default #' @rdname RunSPCA #' @concept dimensional_reduction #' @export #' @method RunSPCA Seurat #' RunSPCA.Seurat <- function( object, assay = NULL, features = NULL, npcs = 50, reduction.name = "spca", reduction.key = "SPC_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) { assay <- assay %||% DefaultAssay(object = object) if (is.null(x = graph)) { stop("Graph is not provided") } else if (is.character(x = graph)) { graph <- object[[graph]] } reduction.data <- RunSPCA( object = object[[assay]], assay = assay, features = features, npcs = npcs, reduction.name = reduction.name, reduction.key = reduction.key, graph = graph, verbose = verbose, seed.use = seed.use, ... ) object[[reduction.name]] <- reduction.data object <- LogSeuratCommand(object = object) return(object) } #' @param assay Name of Assay SLSI is being run on #' @param n Total Number of SLSI components to compute and store #' @param verbose Display messages #' @param reduction.key dimensional reduction key, specifies the string before #' the number for the dimension names #' @param graph Graph used supervised by SLSI #' @param seed.use Set a random seed. Setting NULL will not set a seed. #' #' @importFrom irlba irlba #' @importMethodsFrom Matrix t #' #' @concept dimensional_reduction #' @rdname RunSLSI #' @export RunSLSI.default <- function( object, assay = NULL, n = 50, reduction.key = "SLSI_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } n <- min(n, nrow(x = object) - 1) if (verbose) { message("Smoothing peaks matrix") } if (inherits(x = object, what = 'IterableMatrix')) { t_object <- t(BPCells::transpose_storage_order(matrix = object)) object.smooth <- t(x = graph) %*% (t_object %*% object) %*% graph } else { object.smooth <- t(x = graph) %*% (t(x = object) %*% object) %*% graph } if (verbose) { message("Performing eigendecomposition") } svd.V <- irlba(A = object.smooth, nv = n, nu = n, ...) sigma <- sqrt(x = svd.V$d) feature.loadings <- object %*% (graph %*% svd.V$u) %*% diag(x = 1/sigma) feature.loadings <- as.matrix(x = feature.loadings) cell.embeddings <- t(x = object) %*% feature.loadings %*% diag(x = 1/sigma) cell.embeddings <- as.matrix(x = cell.embeddings) # construct svd list stored in misc for LSI projection svd.lsi <- svd.V svd.lsi$d <- sigma svd.lsi$u <- feature.loadings svd.lsi$v <- cell.embeddings colnames(x = cell.embeddings) <- paste0(reduction.key, 1:ncol(cell.embeddings)) reduction.data <- CreateDimReducObject( embeddings = cell.embeddings, loadings = feature.loadings, key = reduction.key, assay = assay, misc = svd.lsi ) return(reduction.data) } #' @param features Features to compute SLSI on. If NULL, SLSI will be run #' using the variable features for the Assay. #' #' @rdname RunSLSI #' @concept dimensional_reduction #' @export #' @method RunSLSI Assay #' RunSLSI.Assay <- function( object, assay = NULL, features = NULL, n = 50, reduction.key = "SLSI_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) { data.use <- PrepDR( object = object, features = features, slot = "data", verbose = verbose ) reduction.data <- RunSLSI( object = data.use, assay = assay, n = n, reduction.key = reduction.key, graph = graph, verbose = verbose, seed.use = seed.use, ... ) return(reduction.data) } #' @param features Features to compute SLSI on. If features=NULL, SLSI will be run #' using the variable features for the Assay5. #' @param layer Layer to run SLSI on #' #' @rdname RunSLSI #' @concept dimensional_reduction #' @export #' @method RunSLSI StdAssay #' RunSLSI.StdAssay <- function( object, assay = NULL, features = NULL, n = 50, reduction.key = "SLSI_", graph = NULL, layer = "data", verbose = TRUE, seed.use = 42, ...) { data.use <- PrepDR5( object = object, features = features, layer = layer, verbose = verbose ) reduction.data <- RunSLSI( object = data.use, assay = assay, reduction.key = reduction.key, graph = graph, verbose = verbose, seed.use = seed.use, ... ) return(reduction.data) } #' @param reduction.name dimensional reduction name #' @rdname RunSLSI #' @concept dimensional_reduction #' @export #' @method RunSLSI Seurat #' RunSLSI.Seurat <- function( object, assay = NULL, features = NULL, n = 50, reduction.name = "slsi", reduction.key = "SLSI_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) { assay <- assay %||% DefaultAssay(object = object) assay.data <- GetAssay(object = object, assay = assay) if (is.null(x = graph)) { stop("Graph is not provided") } else if (is.character(x = graph)) { graph <- object[[graph]] } reduction.data <- RunSLSI( object = assay.data, assay = assay, features = features, n = n, reduction.name = reduction.name, reduction.key = reduction.key, graph = graph, verbose = verbose, seed.use = seed.use, ... ) object[[reduction.name]] <- reduction.data object <- LogSeuratCommand(object = object) return(object) } Seurat/R/tree.R0000644000176200001440000003023714731050553013010 0ustar liggesusers#' @include generics.R #' NULL cluster.ape <- paste( "Cluster tree functionality requires 'ape'", "please install with 'install.packages('ape')'" ) #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Phylogenetic Analysis of Identity Classes #' #' Constructs a phylogenetic tree relating the 'aggregate' cell from each #' identity class. Tree is estimated based on a distance matrix constructed in #' either gene expression space or PCA space. #' #' Note that the tree is calculated for an 'aggregate' cell, so gene expression #' or PC scores are summed across all cells in an identity class before the #' tree is constructed. #' #' @param object Seurat object #' @param assay Assay to use for the analysis. #' @param features Genes to use for the analysis. Default is the set of #' variable genes (\code{VariableFeatures(object = object)}) #' @param dims If set, tree is calculated in dimension reduction space; #' overrides \code{features} #' @param reduction Name of dimension reduction to use. Only used if \code{dims} #' is not NULL. #' @param slot slot/layer to use. #' @param graph If graph is passed, build tree based on graph connectivity between #' clusters; overrides \code{dims} and \code{features} #' @param reorder Re-order identity classes (factor ordering), according to #' position on the tree. This groups similar classes together which can be #' helpful, for example, when drawing violin plots. #' @param reorder.numeric Re-order identity classes according to position on #' the tree, assigning a numeric value ('1' is the leftmost node) #' @param verbose Show progress updates #' #' @return A Seurat object where the cluster tree can be accessed with \code{\link{Tool}} #' #' @importFrom pbapply pblapply #' @importFrom stats dist hclust na.omit #' @importFrom utils txtProgressBar setTxtProgressBar #' #' @export #' @concept tree #' #' @examples #' \dontrun{ #' if (requireNamespace("ape", quietly = TRUE)) { #' data("pbmc_small") #' pbmc_small #' pbmc_small <- BuildClusterTree(object = pbmc_small) #' Tool(object = pbmc_small, slot = 'BuildClusterTree') #' } #' } #' BuildClusterTree <- function( object, assay = NULL, features = NULL, dims = NULL, reduction = "pca", graph = NULL, slot = 'data', reorder = FALSE, reorder.numeric = FALSE, verbose = TRUE ) { if (!requireNamespace('ape', quietly = TRUE)) { stop(cluster.ape, call. = FALSE) } assay <- assay %||% DefaultAssay(object = object) if (!is.null(x = graph)) { idents <- levels(x = object) nclusters <- length(x = idents) data.dist <- matrix( data = numeric(length = 1L), nrow = nclusters, ncol = nclusters, dimnames = list(idents, idents) ) graph <- object[[graph]] cxi <- CellsByIdentities(object = object) cpairs <- na.omit(object = unique(x = t(x = apply( X = expand.grid(1:nclusters, 1:nclusters)[, c(2, 1)], MARGIN = 1, FUN = function(x) { if (length(x = x) == length(x = unique(x = x))) { return(sort(x = x)) } return(c(NA, NA)) } )))) if (verbose) { pb <- txtProgressBar(style = 3, file = stderr()) } for (i in 1:nrow(x = cpairs)) { i1 <- cpairs[i, ][1] i2 <- cpairs[i, ][2] graph.sub <- graph[cxi[[idents[i1]]], cxi[[idents[i2]]]] d <- mean(x = graph.sub) if (is.na(x = d)) { d <- 0 } data.dist[i1, i2] <- d if (verbose) { setTxtProgressBar(pb = pb, value = i / nrow(x = cpairs)) } } if (verbose) { close(con = pb) } diag(x = data.dist) <- 1 data.dist <- dist(x = data.dist) } else if (!is.null(x = dims)) { my.lapply <- ifelse(test = verbose, yes = pblapply, no = lapply) embeddings <- Embeddings(object = object, reduction = reduction)[, dims] data.dims <- my.lapply( X = levels(x = object), FUN = function(x) { cells <- WhichCells(object = object, idents = x) if (length(x = cells) == 1) { cells <- c(cells, cells) } temp <- colMeans(x = embeddings[cells, ]) } ) data.dims <- do.call(what = 'cbind', args = data.dims) colnames(x = data.dims) <- levels(x = object) data.dist <- dist(x = t(x = data.dims)) } else { features <- features %||% VariableFeatures(object = object) features <- intersect(x = features, y = rownames(x = object)) # if `slot` is set to "counts" sum the expression of the # ident groups, otherwise average them if(slot == "counts") { # AggregateExpression only operates on a "counts" matrix so `layer` # cannot be specified data.pseudobulk <- AggregateExpression( object, assays = assay, features = features, verbose = verbose )[[1]] } else { data.pseudobulk <- suppressMessages( AverageExpression( object, assays = assay, features = features, # explicitly pass in the value of `slot` in as `layer` layer = slot, verbose = verbose ) )[[1]] } data.dist <- dist(x = t(x = data.pseudobulk[features, ])) } data.tree <- ape::as.phylo(x = hclust(d = data.dist)) Tool(object = object) <- data.tree if (reorder) { if (verbose) { message("Reordering identity classes and rebuilding tree") } old.ident.order <- levels(x = object) data.tree <- Tool(object = object, slot = 'BuildClusterTree') all.desc <- GetDescendants(tree = data.tree, node = (data.tree$Nnode + 2)) all.desc <- old.ident.order[all.desc[all.desc <= (data.tree$Nnode + 1)]] Idents(object = object) <- factor(x = Idents(object = object), levels = all.desc, ordered = TRUE) if (reorder.numeric) { new.levels <- sort(x = unique(x = as.integer(x = Idents(object = object)))) Idents(object = object) <- factor(x = as.integer(x = Idents(object = object)), levels = new.levels) object[['tree.ident']] <- as.integer(x = Idents(object = object)) } object <- BuildClusterTree( object = object, assay = assay, features = features, dims = dims, reduction = reduction, graph = graph, slot = slot, reorder = FALSE, verbose = verbose ) } return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Depth first traversal path of a given tree # # @param tree Tree object (from ape package) # @param node Internal node in the tree # @param path Path through the tree (for recursion) # @param include.children Include children in the output path # @param only.children Only include children in the output path # @return Returns a vector representing the depth first traversal path # DFT <- function( tree, node, path = NULL, include.children = FALSE, only.children = FALSE ) { if (only.children) { include.children = TRUE } children <- which(x = tree$edge[, 1] == node) child1 <- tree$edge[children[1], 2] child2 <- tree$edge[children[2], 2] if (child1 %in% tree$edge[, 1]) { if (!only.children) { path <- c(path, child1) } path <- DFT( tree = tree, node = child1, path = path, include.children = include.children, only.children = only.children ) } else { if (include.children) { path <- c(path, child1) } } if (child2 %in% tree$edge[, 1]) { if (!only.children) { path <- c(path, child2) } path <- DFT( tree = tree, node = child2, path = path, include.children = include.children, only.children = only.children ) } else { if (include.children) { path <- c(path, child2) } } return(path) } # Function to return all internal (non-terminal) nodes in a given tree # # @param tree Tree object (from ape package) # # @return Returns a vector of all internal nodes for the given tree # GetAllInternalNodes <- function(tree) { return(c(tree$edge[1, 1], DFT(tree = tree, node = tree$edge[1, 1]))) } # Function to get all the descendants on a tree of a given node # # @param tree Tree object (from ape package) # @param node Internal node in the tree # # @return Returns all descendants of the given node # GetDescendants <- function(tree, node, curr = NULL) { if (is.null(x = curr)) { curr <- vector() } daughters <- tree$edge[which(x = tree$edge[, 1] == node), 2] curr <- c(curr, daughters) w <- which(x = daughters >= length(x = tree$tip)) if (length(x = w) > 0) { for (i in 1:length(x = w)) { curr <- GetDescendants(tree = tree, node = daughters[w[i]], curr = curr) } } return(curr) } # Function to get all the descendants on a tree left of a given node # # @param tree Tree object (from ape package) # @param node Internal node in the tree # # @return Returns all descendants left of the given node # GetLeftDescendants <- function(tree, node) { daughters <- tree$edge[which(tree$edge[, 1] == node), 2] if (daughters[1] <= (tree$Nnode + 1)) { return(daughters[1]) } daughter.use <- GetDescendants(tree, daughters[1]) daughter.use <- daughter.use[daughter.use <= (tree$Nnode + 1)] return(daughter.use) } # Function to get all the descendants on a tree right of a given node # # @param tree Tree object (from ape package) # @param node Internal node in the tree # # @return Returns all descendants right of the given node # GetRightDescendants <- function(tree, node) { daughters <- tree$edge[which(x = tree$edge[, 1] == node), 2] if (daughters[2] <= (tree$Nnode + 1)) { return(daughters[2]) } daughter.use <- GetDescendants(tree = tree, node = daughters[2]) daughter.use <- daughter.use[daughter.use <= (tree$Nnode + 1)] return(daughter.use) } # Merge childen of a node # # Merge the childen of a node into a single identity class # # @param object Seurat object # @param node.use Merge children of this node # @param rebuild.tree Rebuild cluster tree after the merge? # @param ... Extra parameters to BuildClusterTree, used only if rebuild.tree = TRUE # # @seealso \code{BuildClusterTree} # # # @examples # data("pbmc_small") # PlotClusterTree(object = pbmc_small) # pbmc_small <- MergeNode(object = pbmc_small, node.use = 7, rebuild.tree = TRUE) # PlotClusterTree(object = pbmc_small) # MergeNode <- function(object, node.use, rebuild.tree = FALSE, ...) { CheckDots(..., fxns = 'BuldClusterTree') object.tree <- object@cluster.tree[[1]] node.children <- DFT( tree = object.tree, node = node.use, include.children = TRUE ) node.children <- intersect(x = node.children, y = levels(x = object@ident)) children.cells <- WhichCells(object = object, ident = node.children) if (length(x = children.cells > 0)) { object <- SetIdent( object = object, cells.use = children.cells, ident.use = min(node.children) ) } if (rebuild.tree) { object <- BuildClusterTree(object = object, ...) } return(object) } # Function to check whether a given node in a tree has a child (leaf node) # # @param tree Tree object (from ape package) # @param node Internal node in the tree # # @return Returns a Boolean of whether the given node is connected to a terminal leaf node NodeHasChild <- function(tree, node) { children <- tree$edge[which(x = tree$edge[, 1] == node), ][, 2] return(any(children %in% tree$edge[, 2] && !children %in% tree$edge[, 1])) } # Function to check whether a given node in a tree has only children(leaf nodes) # # @param tree Tree object (from ape package) # @param node Internal node in the tree # # @return Returns a Boolean of whether the given node is connected to only terminal leaf nodes NodeHasOnlyChildren <- function(tree, node) { children <- tree$edge[which(x = tree$edge[, 1] == node), ][, 2] return(!any(children %in% tree$edge[, 1])) } Seurat/R/preprocessing5.R0000644000176200001440000020223514741546341015026 0ustar liggesusers#' @include generics.R #' @include preprocessing.R #' @importFrom stats loess #' @importFrom methods slot #' @importFrom SeuratObject .MARGIN .SparseSlots #' @importFrom utils txtProgressBar setTxtProgressBar #' NULL hvf.methods <- list() #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @method FindVariableFeatures default #' @export #' FindVariableFeatures.default <- function( object, method = VST, nfeatures = 2000L, verbose = TRUE, selection.method = selection.method, ... ) { if (is_quosure(x = method)) { method <- eval( expr = quo_get_expr(quo = method), envir = quo_get_env(quo = method) ) } if (is.character(x = method)) { method <- get(x = method) } if (!is.function(x = method)) { stop( "'method' must be a function for calculating highly variable features", call. = FALSE ) } var.gene.ouput <- method( data = object, nselect = nfeatures, verbose = verbose, ... ) rownames(x = var.gene.ouput) <- rownames(x = object) return(var.gene.ouput) } #' @importFrom SeuratObject DefaultLayer Features Key Layers #' #' @method FindVariableFeatures StdAssay #' @export #' FindVariableFeatures.StdAssay <- function( object, method = NULL, nfeatures = 2000L, layer = NULL, span = 0.3, clip = NULL, key = NULL, verbose = TRUE, selection.method = 'vst', ... ) { if (selection.method == 'vst') { layer <- layer%||%'counts' method <- VST key <- 'vst' } else if (selection.method %in% c('mean.var.plot', 'mvp')) { layer <- layer%||%'data' method <- MVP key <- 'mvp' } else if (selection.method %in% c('dispersion', 'disp')) { layer <- layer%||%'data' method <- DISP key <- 'disp' } else if (is.null(x = method) || is.null(x = layer)){ stop('Custome functions and layers are both required') } else { key <- NULL } layer <- Layers(object = object, search = layer) if (is.null(x = key)) { false <- function(...) { return(FALSE) } key <- if (tryCatch(expr = is_quosure(x = method), error = false)) { method } else if (is.function(x = method)) { substitute(expr = method) } else if (is.call(x = enquo(arg = method))) { enquo(arg = method) } else if (is.character(x = method)) { method } else { parse(text = method) } key <- .Abbrv(x = as_name(x = key)) } warn.var <- warn.rank <- TRUE for (i in seq_along(along.with = layer)) { if (isTRUE(x = verbose)) { message("Finding variable features for layer ", layer[i]) } data <- LayerData(object = object, layer = layer[i], fast = TRUE) hvf.function <- if (inherits(x = data, what = 'V3Matrix')) { FindVariableFeatures.default } else { FindVariableFeatures } hvf.info <- hvf.function( object = data, method = method, nfeatures = nfeatures, span = span, clip = clip, verbose = verbose, ... ) if (warn.var) { if (!'variable' %in% colnames(x = hvf.info) || !is.logical(x = hvf.info$variable)) { warning( "No variable feature indication in HVF info for method ", key, ", `VariableFeatures` will not work", call. = FALSE, immediate. = TRUE ) warn.var <- FALSE } } else if (warn.rank && !'rank' %in% colnames(x = hvf.info)) { warning( "No variable feature rank in HVF info for method ", key, ", `VariableFeatures` will return variable features in assay order", call. = FALSE, immediate. = TRUE ) warn.rank <- FALSE } colnames(x = hvf.info) <- paste( 'vf', key, layer[i], colnames(x = hvf.info), sep = '_' ) rownames(x = hvf.info) <- Features(x = object, layer = layer[i]) object[["var.features"]] <- NULL object[["var.features.rank"]] <- NULL object[[names(x = hvf.info)]] <- NULL object[[names(x = hvf.info)]] <- hvf.info } VariableFeatures(object) <- VariableFeatures(object, nfeatures=nfeatures,method = key) return(object) } #' @param layer Layer in the Assay5 to pull data from #' @param features If provided, only compute on given features. Otherwise, #' compute for all features. #' @param nfeatures Number of features to mark as the top spatially variable. #' #' @method FindSpatiallyVariableFeatures StdAssay #' @rdname FindSpatiallyVariableFeatures #' @concept preprocessing #' @concept spatial #' @export #' FindSpatiallyVariableFeatures.StdAssay <- function( object, layer = "scale.data", spatial.location, selection.method = c('markvariogram', 'moransi'), features = NULL, r.metric = 5, x.cuts = NULL, y.cuts = NULL, nfeatures = nfeatures, verbose = TRUE, ... ) { features <- features %||% rownames(x = object) if (selection.method == "markvariogram" && "markvariogram" %in% names(x = Misc(object = object))) { features.computed <- names(x = Misc(object = object, slot = "markvariogram")) features <- features[! features %in% features.computed] } data <- GetAssayData(object = object, layer = layer) data <- as.matrix(x = data[features, ]) data <- data[RowVar(x = data) > 0, ] if (nrow(x = data) != 0) { svf.info <- FindSpatiallyVariableFeatures( object = data, spatial.location = spatial.location, selection.method = selection.method, r.metric = r.metric, x.cuts = x.cuts, y.cuts = y.cuts, verbose = verbose, ... ) } else { svf.info <- c() } if (selection.method == "markvariogram") { if ("markvariogram" %in% names(x = Misc(object = object))) { svf.info <- c(svf.info, Misc(object = object, slot = "markvariogram")) } suppressWarnings(expr = Misc(object = object, slot = "markvariogram") <- svf.info) svf.info <- ComputeRMetric(mv = svf.info, r.metric) svf.info <- svf.info[order(svf.info[, 1]), , drop = FALSE] } if (selection.method == "moransi") { colnames(x = svf.info) <- paste0("MoransI_", colnames(x = svf.info)) svf.info <- svf.info[order(svf.info[, 2], -abs(svf.info[, 1])), , drop = FALSE] } var.name <- paste0(selection.method, ".spatially.variable") var.name.rank <- paste0(var.name, ".rank") svf.info[[var.name]] <- FALSE svf.info[[var.name]][1:(min(nrow(x = svf.info), nfeatures))] <- TRUE svf.info[[var.name.rank]] <- 1:nrow(x = svf.info) object[names(x = svf.info)] <- svf.info return(object) } #' @rdname LogNormalize #' @method LogNormalize default #' #' @param margin Margin to normalize over #' @importFrom SeuratObject .CheckFmargin #' #' @export #' LogNormalize.default <- function( data, scale.factor = 1e4, margin = 2L, verbose = TRUE, ... ) { margin <- .CheckFmargin(fmargin = margin) ncells <- dim(x = data)[margin] if (isTRUE(x = verbose)) { pb <- txtProgressBar(file = stderr(), style = 3) } for (i in seq_len(length.out = ncells)) { x <- if (margin == 1L) { data[i, ] } else { data[, i] } xnorm <- log1p(x = x / sum(x) * scale.factor) if (margin == 1L) { data[i, ] <- xnorm } else { data[, i] <- xnorm } if (isTRUE(x = verbose)) { setTxtProgressBar(pb = pb, value = i / ncells) } } if (isTRUE(x = verbose)) { close(con = pb) } return(data) } #' @method LogNormalize IterableMatrix #' @export #' LogNormalize.IterableMatrix <- function( data, scale.factor = 1e4, margin = 2L, verbose = TRUE, ... ) { data <- BPCells::t(BPCells::t(data) / colSums(data)) # Log normalization data <- log1p(data * scale.factor) return(data) } #' @importFrom SeuratObject IsSparse #' #' @method NormalizeData default #' @export #' NormalizeData.default <- function( object, normalization.method = c('LogNormalize', 'CLR', 'RC'), scale.factor = 1e4, cmargin = 2L, margin = 1L, verbose = TRUE, ... ) { normalization.method <- normalization.method[1L] normalization.method <- match.arg(arg = normalization.method) # TODO: enable parallelization via future normalized <- switch( EXPR = normalization.method, 'LogNormalize' = { if (IsSparse(x = object) && .MARGIN(object = object) == cmargin) { .SparseNormalize( data = object, scale.factor = scale.factor, verbose = verbose ) } else { LogNormalize( data = object, scale.factor = scale.factor, margin = cmargin, verbose = verbose, ... ) } }, 'CLR' = { if (inherits(x = object, what = 'dgTMatrix')) { warning('Convert input dgTMatrix into dgCMatrix') object <- as(object = object, Class = 'dgCMatrix') } if (!inherits(x = object, what = 'dgCMatrix') && !inherits(x = object, what = 'matrix')) { stop('CLR normalization is only supported for dense and dgCMatrix') } CustomNormalize( data = object, custom_function = function(x) { return(log1p(x = x/(exp(x = sum(log1p(x = x[x > 0]), na.rm = TRUE)/length(x = x))))) }, margin = margin, verbose = verbose ) }, 'RC' = { if (!inherits(x = object, what = 'dgCMatrix') && !inherits(x = object, what = 'matrix')) { stop('RC normalization is only supported for dense and dgCMatrix') } RelativeCounts(data = object, scale.factor = scale.factor, verbose = verbose) } ) return(normalized) } #' @importFrom SeuratObject Cells DefaultLayer DefaultLayer<- Features #' LayerData LayerData<- #' #' @method NormalizeData StdAssay #' @export #' NormalizeData.StdAssay <- function( object, normalization.method = 'LogNormalize', scale.factor = 1e4, margin = 1L, layer = 'counts', save = 'data', verbose = TRUE, ... ) { olayer <- layer <- unique(x = layer) layer <- Layers(object = object, search = layer) if (length(x = save) != length(x = layer)) { save <- make.unique(names = gsub( pattern = olayer, replacement = save, x = layer )) } for (i in seq_along(along.with = layer)) { l <- layer[i] if (isTRUE(x = verbose)) { message("Normalizing layer: ", l) } LayerData( object = object, layer = save[i], features = Features(x = object, layer = l), cells = Cells(x = object, layer = l) ) <- NormalizeData( object = LayerData(object = object, layer = l, fast = NA), normalization.method = normalization.method, scale.factor = scale.factor, margin = margin, verbose = verbose, ... ) } gc(verbose = FALSE) return(object) } #' @importFrom SeuratObject StitchMatrix #' #' @method ScaleData StdAssay #' @export #' ScaleData.StdAssay <- function( object, features = NULL, layer = 'data', vars.to.regress = NULL, latent.data = NULL, by.layer = FALSE, split.by = NULL, model.use = 'linear', use.umi = FALSE, do.scale= TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, save = 'scale.data', verbose = TRUE, ... ) { use.umi <- ifelse(test = model.use != 'linear', yes = TRUE, no = use.umi) olayer <- layer <- unique(x = layer) layer <- Layers(object = object, search = layer) if (is.null(layer)) { abort(paste0("No layer matching pattern '", olayer, "' found. Please run NormalizeData and retry")) } if (isTRUE(x = use.umi)) { layer <- "counts" inform( message = "'use.umi' is TRUE, please make sure 'layer' specifies raw counts" ) } features <- features %||% VariableFeatures(object = object) if (!length(x = features)) { features <- Features(x = object, layer = layer) } if (isTRUE(x = by.layer)) { if (length(x = save) != length(x = layer)) { save <- make.unique(names = gsub( pattern = olayer, replacement = save, x = layer )) } for (i in seq_along(along.with = layer)) { lyr <- layer[i] if (isTRUE(x = verbose)) { inform(message = paste("Scaling data for layer", sQuote(x = lyr))) } LayerData(object = object, layer = save[i], ...) <- ScaleData( object = LayerData( object = object, layer = lyr, features = features, fast = NA ), features = features, vars.to.regress = vars.to.regress, latent.data = latent.data, split.by = split.by, model.use = model.use, use.umi = use.umi, do.scale = do.scale, do.center = do.center, scale.max = scale.max, block.size = block.size, min.cells.to.block = min.cells.to.block, verbose = verbose, ... ) } } else { ldata <- if (length(x = layer) > 1L) { StitchMatrix( x = LayerData(object = object, layer = layer[1L], features = features), y = lapply( X = layer[2:length(x = layer)], FUN = LayerData, object = object, features = features ), rowmap = slot(object = object, name = 'features')[features, layer], colmap = slot(object = object, name = 'cells')[, layer] ) } else { LayerData(object = object, layer = layer, features = features) } ldata <- ScaleData( object = ldata, features = features, vars.to.regress = vars.to.regress, latent.data = latent.data, split.by = split.by, model.use = model.use, use.umi = use.umi, do.scale = do.scale, do.center = do.center, scale.max = scale.max, block.size = block.size, min.cells.to.block = min.cells.to.block, verbose = verbose, ... ) LayerData(object = object, layer = save, features = rownames(ldata)) <- ldata } return(object) } #' @rdname VST #' @method VST default #' @export #' VST.default <- function( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, ... ) { .NotYetImplemented() } #' @rdname VST #' @method VST IterableMatrix #' @importFrom SeuratObject EmptyDF #' @export #' VST.IterableMatrix <- function( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, verbose = TRUE, ... ) { nfeatures <- nrow(x = data) hvf.info <- EmptyDF(n = nfeatures) hvf.stats <- BPCells::matrix_stats( matrix = data, row_stats = 'variance')$row_stats # Calculate feature means hvf.info$mean <- hvf.stats['mean', ] # Calculate feature variance hvf.info$variance <- hvf.stats['variance', ] hvf.info$variance.expected <- 0L not.const <- hvf.info$variance > 0 fit <- loess( formula = log10(x = variance) ~ log10(x = mean), data = hvf.info[not.const, , drop = TRUE], span = span ) hvf.info$variance.expected[not.const] <- 10 ^ fit$fitted feature.mean <- hvf.info$mean feature.sd <- sqrt(x = hvf.info$variance.expected) standard.max <- clip %||% sqrt(x = ncol(x = data)) feature.mean[feature.mean == 0] <- 0.1 data <- BPCells::min_by_row(mat = data, vals = standard.max*feature.sd + feature.mean) data.standard <- (data - feature.mean) / feature.sd hvf.info$variance.standardized <- BPCells::matrix_stats( matrix = data.standard, row_stats = 'variance' )$row_stats['variance', ] # Set variable features hvf.info$variable <- FALSE hvf.info$rank <- NA vf <- head( x = order(hvf.info$variance.standardized, decreasing = TRUE), n = nselect ) hvf.info$variable[vf] <- TRUE hvf.info$rank[vf] <- seq_along(along.with = vf) rownames(x = hvf.info) <- rownames(x = data) return(hvf.info) } #' @importFrom Matrix rowMeans #' @importFrom SeuratObject EmptyDF #' #' @rdname VST #' @method VST dgCMatrix #' @export #' VST.dgCMatrix <- function( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, verbose = TRUE, ... ) { nfeatures <- nrow(x = data) hvf.info <- EmptyDF(n = nfeatures) # Calculate feature means hvf.info$mean <- Matrix::rowMeans(x = data) # Calculate feature variance hvf.info$variance <- SparseRowVar2( mat = data, mu = hvf.info$mean, display_progress = verbose ) hvf.info$variance.expected <- 0L not.const <- hvf.info$variance > 0 fit <- loess( formula = log10(x = variance) ~ log10(x = mean), data = hvf.info[not.const, , drop = TRUE], span = span ) hvf.info$variance.expected[not.const] <- 10 ^ fit$fitted hvf.info$variance.standardized <- SparseRowVarStd( mat = data, mu = hvf.info$mean, sd = sqrt(x = hvf.info$variance.expected), vmax = clip %||% sqrt(x = ncol(x = data)), display_progress = verbose ) # Set variable features hvf.info$variable <- FALSE hvf.info$rank <- NA vf <- head( x = order(hvf.info$variance.standardized, decreasing = TRUE), n = nselect ) hvf.info$variable[vf] <- TRUE hvf.info$rank[vf] <- seq_along(along.with = vf) return(hvf.info) } #' @rdname VST #' @method VST matrix #' @export #' VST.matrix <- function( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, ... ) { return(VST( data = as.sparse(x = data), margin = margin, nselect = nselect, span = span, clip = clip, ... )) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Calculate dispersion of features #' #' @param object Data matrix #' @param mean.function Function to calculate mean #' @param dispersion.function Function to calculate dispersion #' @param num.bin Number of bins to use #' @param binning.method Method to use for binning. Options are 'equal_width' or 'equal_frequency' #' @param verbose Display progress #' @keywords internal #' CalcDispersion <- function( object, mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", verbose = TRUE, ... ) { if (!inherits(x = object, what = c('dgCMatrix', 'matrix'))) { stop('mean.var.plot and dispersion methods only \ support dense and sparse matrix input') } if (inherits(x = object, what = 'matrix')) { object <- as.sparse(x = object) } feature.mean <- mean.function(object, verbose) feature.dispersion <- dispersion.function(object, verbose) names(x = feature.mean) <- names( x = feature.dispersion) <- rownames(x = object) feature.dispersion[is.na(x = feature.dispersion)] <- 0 feature.mean[is.na(x = feature.mean)] <- 0 data.x.breaks <- switch( EXPR = binning.method, 'equal_width' = num.bin, 'equal_frequency' = c( quantile( x = feature.mean[feature.mean > 0], probs = seq.int(from = 0, to = 1, length.out = num.bin) ) ), stop("Unknown binning method: ", binning.method) ) data.x.bin <- cut(x = feature.mean, breaks = data.x.breaks, include.lowest = TRUE) names(x = data.x.bin) <- names(x = feature.mean) mean.y <- tapply(X = feature.dispersion, INDEX = data.x.bin, FUN = mean) sd.y <- tapply(X = feature.dispersion, INDEX = data.x.bin, FUN = sd) feature.dispersion.scaled <- (feature.dispersion - mean.y[as.numeric(x = data.x.bin)]) / sd.y[as.numeric(x = data.x.bin)] names(x = feature.dispersion.scaled) <- names(x = feature.mean) hvf.info <- data.frame( feature.mean, feature.dispersion, feature.dispersion.scaled) rownames(x = hvf.info) <- rownames(x = object) colnames(x = hvf.info) <- paste0( 'mvp.', c('mean', 'dispersion', 'dispersion.scaled')) return(hvf.info) } #' @importFrom SeuratObject .CalcN #' CalcN <- function(object, ...) { return(.CalcN(object, ...)) } #' @method .CalcN IterableMatrix #' @export #' .CalcN.IterableMatrix <- function(object, ...) { col_stat <- BPCells::matrix_stats(matrix = object, col_stats = 'mean')$col_stats return(list( nCount = round(col_stat['mean', ] * nrow(object)), nFeature = col_stat['nonzero', ] )) } #' Find variable features based on dispersion #' #' @param data Data matrix #' @param nselect Number of top features to select based on dispersion values #' @param verbose Display progress #' @keywords internal #' DISP <- function( data, nselect = 2000L, verbose = TRUE, ... ) { hvf.info <- CalcDispersion(object = data, verbose = verbose, ...) hvf.info$variable <- FALSE hvf.info$rank <- NA vf <- head( x = order(hvf.info$mvp.dispersion, decreasing = TRUE), n = nselect ) hvf.info$variable[vf] <- TRUE hvf.info$rank[vf] <- seq_along(along.with = vf) return(hvf.info) } #' @importFrom SeuratObject .CheckFmargin #' .FeatureVar <- function( data, mu, fmargin = 1L, standardize = FALSE, sd = NULL, clip = NULL, verbose = TRUE ) { fmargin <- .CheckFmargin(fmargin = fmargin) ncells <- dim(x = data)[-fmargin] nfeatures <- dim(x = data)[fmargin] fvars <- vector(mode = 'numeric', length = nfeatures) if (length(x = mu) != nfeatures) { stop("Wrong number of feature means provided") } if (isTRUE(x = standardize)) { clip <- clip %||% sqrt(x = ncells) if (length(x = sd) != nfeatures) { stop("Wrong number of standard deviations") } } if (isTRUE(x = verbose)) { msg <- 'Calculating feature variances' if (isTRUE(x = standardize)) { msg <- paste(msg, 'of standardized and clipped values') } message(msg) pb <- txtProgressBar(style = 3, file = stderr()) } for (i in seq_len(length.out = nfeatures)) { if (isTRUE(x = standardize) && sd[i] == 0) { if (isTRUE(x = verbose)) { setTxtProgressBar(pb = pb, value = i / nfeatures) } next } x <- if (fmargin == 1L) { data[i, , drop = TRUE] } else { data[, i, drop = TRUE] } x <- x - mu[i] if (isTRUE(x = standardize)) { x <- x / sd[i] x[x > clip] <- clip } fvars[i] <- sum(x ^ 2) / (ncells - 1L) if (isTRUE(x = verbose)) { setTxtProgressBar(pb = pb, value = i / nfeatures) } } if (isTRUE(x = verbose)) { close(con = pb) } return(fvars) } .Mean <- function(data, margin = 1L) { nout <- dim(x = data)[margin] nobs <- dim(x = data)[-margin] means <- vector(mode = 'numeric', length = nout) for (i in seq_len(length.out = nout)) { x <- if (margin == 1L) { data[i, , drop = TRUE] } else { data[, i, drop = TRUE] } means[i] <- sum(x) / nobs } return(means) } .SparseNormalize <- function(data, scale.factor = 1e4, verbose = TRUE) { entryname <- .SparseSlots(x = data, type = 'entries') p <- slot(object = data, name = .SparseSlots(x = data, type = 'pointers')) if (p[1L] == 0) { p <- p + 1L } np <- length(x = p) - 1L if (isTRUE(x = verbose)) { pb <- txtProgressBar(style = 3L, file = stderr()) } for (i in seq_len(length.out = np)) { idx <- seq.int(from = p[i], to = p[i + 1] - 1L) xidx <- slot(object = data, name = entryname)[idx] slot(object = data, name = entryname)[idx] <- log1p( x = xidx / sum(xidx) * scale.factor ) if (isTRUE(x = verbose)) { setTxtProgressBar(pb = pb, value = i / np) } } if (isTRUE(x = verbose)) { close(con = pb) } return(data) } #' @param data A sparse matrix #' @param mu A vector of feature means #' @param fmargin Feature margin #' @param standardize Standardize matrix rows prior to calculating variances #' @param sd If standardizing, a vector of standard deviations to #' standardize with #' @param clip Set upper bound for standardized variances; defaults to the #' square root of the number of cells #' @param verbose Show progress updates #' #' @keywords internal #' @importFrom SeuratObject .CheckFmargin #' #' @noRd #' .SparseFeatureVar <- function( data, mu, fmargin = 1L, standardize = FALSE, sd = NULL, clip = NULL, verbose = TRUE ) { fmargin <- .CheckFmargin(fmargin = fmargin) if (fmargin != .MARGIN(object = data)) { data <- t(x = data) fmargin <- .MARGIN(object = data) } entryname <- .SparseSlots(x = data, type = 'entries') p <- slot(object = data, name = .SparseSlots(x = data, type = 'pointers')) if (p[1L] == 0) { p <- p + 1L } np <- length(x = p) - 1L ncells <- dim(x = data)[-fmargin] fvars <- vector(mode = 'numeric', length = np) if (length(x = mu) != np) { stop("Wrong number of feature means provided") } if (isTRUE(x = standardize)) { clip <- clip %||% sqrt(x = ncells) if (length(x = sd) != np) { stop("Wrong number of standard deviations provided") } } if (isTRUE(x = verbose)) { msg <- 'Calculating feature variances' if (isTRUE(x = standardize)) { msg <- paste(msg, 'of standardized and clipped values') } message(msg) pb <- txtProgressBar(style = 3, file = stderr()) } for (i in seq_len(length.out = np)) { if (isTRUE(x = standardize) && sd[i] == 0) { if (isTRUE(x = verbose)) { setTxtProgressBar(pb = pb, value = i / np) } next } idx <- seq.int(from = p[i], to = p[i + 1L] - 1L) xidx <- slot(object = data, name = entryname)[idx] - mu[i] nzero <- ncells - length(x = xidx) csum <- nzero * ifelse( test = isTRUE(x = standardize), yes = ((0 - mu[i]) / sd[i]) ^ 2, no = mu[i] ^ 2 ) if (isTRUE(x = standardize)) { xidx <- xidx / sd[i] xidx[xidx > clip] <- clip } fsum <- sum(xidx ^ 2) + csum fvars[i] <- fsum / (ncells - 1L) if (isTRUE(x = verbose)) { setTxtProgressBar(pb = pb, value = i / np) } } if (isTRUE(x = verbose)) { close(con = pb) } return(fvars) } #' @importFrom SeuratObject .CheckFmargin .SparseMean <- function(data, margin = 1L) { margin <- .CheckFmargin(fmargin = margin) if (margin != .MARGIN(object = data)) { data <- t(x = data) margin <- .MARGIN(object = data) } entryname <- .SparseSlots(x = data, type = 'entries') p <- slot(object = data, name = .SparseSlots(x = data, type = 'pointers')) if (p[1L] == 0) { p <- p + 1L } np <- length(x = p) - 1L nobs <- dim(x = data)[-margin] means <- vector(mode = 'numeric', length = np) for (i in seq_len(length.out = np)) { idx <- seq.int(from = p[i], to = p[i + 1L] - 1L) means[i] <- sum(slot(object = data, name = entryname)[idx]) / nobs } return(means) } #' @inheritParams stats::loess #' @param data A matrix #' @param fmargin Feature margin #' @param nselect Number of features to select #' @param clip After standardization values larger than \code{clip} will be set #' to \code{clip}; default is \code{NULL} which sets this value to the square #' root of the number of cells #' #' @importFrom Matrix rowMeans #' @importFrom SeuratObject .CheckFmargin #' #' @keywords internal #' #' @noRd #' .VST <- function( data, fmargin = 1L, nselect = 2000L, span = 0.3, clip = NULL, verbose = TRUE, ... ) { fmargin <- .CheckFmargin(fmargin = fmargin) nfeatures <- dim(x = data)[fmargin] # TODO: Support transposed matrices # nfeatures <- nrow(x = data) if (IsSparse(x = data)) { mean.func <- .SparseMean var.func <- .SparseFeatureVar } else { mean.func <- .Mean var.func <- .FeatureVar } hvf.info <- SeuratObject::EmptyDF(n = nfeatures) # hvf.info$mean <- mean.func(data = data, margin = fmargin) hvf.info$mean <- rowMeans(x = data) hvf.info$variance <- var.func( data = data, mu = hvf.info$mean, fmargin = fmargin, verbose = verbose ) hvf.info$variance.expected <- 0L not.const <- hvf.info$variance > 0 fit <- loess( formula = log10(x = variance) ~ log10(x = mean), data = hvf.info[not.const, , drop = TRUE], span = span ) hvf.info$variance.expected[not.const] <- 10 ^ fit$fitted hvf.info$variance.standardized <- var.func( data = data, mu = hvf.info$mean, standardize = TRUE, sd = sqrt(x = hvf.info$variance.expected), clip = clip, verbose = verbose ) hvf.info$variable <- FALSE hvf.info$rank <- NA vs <- hvf.info$variance.standardized vs[vs == 0] <- NA vf <- head( x = order(hvf.info$variance.standardized, decreasing = TRUE), n = nselect ) hvf.info$variable[vf] <- TRUE hvf.info$rank[vf] <- seq_along(along.with = vf) # colnames(x = hvf.info) <- paste0('vst.', colnames(x = hvf.info)) return(hvf.info) } # hvf.methods$vst <- VST #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # S4 Methods #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ################################################################################ ################################# SCTransform ################################## ################################################################################ #' @importFrom SeuratObject Cells as.sparse #' #' @method SCTransform IterableMatrix #' @rdname SCTransform #' @concept preprocessing #' @export SCTransform.IterableMatrix <- function( object, cell.attr, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object) / 30), sqrt(x = ncol(x = object) / 30)), vst.flavor = 'v2', conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (!is.null(reference.SCT.model)){ do.correct.umi <- FALSE do.center <- FALSE } sampled_cells <- sample.int(n = ncol(x = object), size = min(ncells, ncol(x = object))) umi <- as.sparse(x = object[, sampled_cells]) cell.attr <- cell.attr[colnames(x = umi),,drop=FALSE] vst.out <- SCTransform(object = umi, cell.attr = cell.attr, reference.SCT.model = reference.SCT.model, do.correct.umi = do.correct.umi, ncells = ncells, residual.features = residual.features, variable.features.n = variable.features.n, variable.features.rv.th = variable.features.rv.th, vars.to.regress = vars.to.regress, latent.data = latent.data, do.scale = do.scale, do.center = do.center, clip.range = clip.range, vst.flavor = vst.flavor, conserve.memory = conserve.memory, return.only.var.genes = return.only.var.genes, seed.use = seed.use, verbose = verbose, ...) if (!do.correct.umi) { vst.out$umi_corrected <- umi } return(vst.out) } #' @importFrom SeuratObject CreateAssayObject SetAssayData GetAssayData CreateSCTAssay <- function(vst.out, do.correct.umi, residual.type, clip.range){ residual.type <- vst.out[['residual_type']] %||% 'pearson' sct.method <- vst.out[['sct.method']] assay.out <- CreateAssayObject(counts = vst.out$umi_corrected) # set the variable genes VariableFeatures(object = assay.out) <- vst.out$variable_features # put log1p transformed counts in data assay.out <- SetAssayData( object = assay.out, slot = 'data', new.data = log1p(x = GetAssayData(object = assay.out, slot = 'counts')) ) scale.data <- vst.out$y assay.out <- SetAssayData( object = assay.out, slot = 'scale.data', new.data = scale.data ) vst.out$y <- NULL # save clip.range into vst model vst.out$arguments$sct.clip.range <- clip.range vst.out$arguments$sct.method <- sct.method Misc(object = assay.out, slot = 'vst.out') <- vst.out assay.out <- as(object = assay.out, Class = "SCTAssay") return (assay.out) } #' @importFrom SeuratObject Cells DefaultLayer DefaultLayer<- Features #' LayerData LayerData<- as.sparse #' #' @method SCTransform StdAssay #' @export #' SCTransform.StdAssay <- function( object, layer = 'counts', cell.attr = NULL, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object) / 30), sqrt(x = ncol(x = object) / 30)), vst.flavor = 'v2', conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ...) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (!is.null(reference.SCT.model)){ do.correct.umi <- FALSE do.center <- FALSE } olayer <- layer <- unique(x = layer) layers <- Layers(object = object, search = layer) dataset.names <- gsub(pattern = paste0(layer, "."), replacement = "", x = layers) # loop over layers performing SCTransform() on individual layers sct.assay.list <- list() # Keep a tab of variable features per chunk variable.feature.list <- list() for (dataset.index in seq_along(along.with = layers)) { l <- layers[dataset.index] if (isTRUE(x = verbose)) { message("Running SCTransform on layer: ", l) } all_cells <- Cells(x = object, layer = l) all_features <- Features(x = object, layer = l) layer.data <- LayerData( object = object, layer = l, features = all_features, cells = all_cells ) local.reference.SCT.model <- NULL set.seed(seed = seed.use) do.correct.umi.chunk <- FALSE sct.function <- if (inherits(x = layer.data, what = 'V3Matrix')) { SCTransform.default } else { SCTransform } if (is.null(x = cell.attr) && is.null(x = reference.SCT.model)){ calcn <- CalcN(object = layer.data) cell.attr.layer <- data.frame(umi = calcn$nCount, log_umi = log10(x = calcn$nCount)) rownames(cell.attr.layer) <- colnames(x = layer.data) } else { cell.attr.layer <- cell.attr[colnames(x = layer.data),, drop=FALSE] } if (!"umi" %in% cell.attr.layer && is.null(x = reference.SCT.model)){ calcn <- CalcN(object = layer.data) cell.attr.tmp <- data.frame(umi = calcn$nCount) rownames(cell.attr.tmp) <- colnames(x = layer.data) cell.attr.layer$umi <- NA cell.attr.layer$log_umi <- NA cell.attr.layer[rownames(cell.attr.tmp), "umi"] <- cell.attr.tmp$umi cell.attr.layer[rownames(cell.attr.tmp), "log_umi"] <- log10(x = cell.attr.tmp$umi) } # Step 1: Learn model vst.out <- sct.function(object = layer.data, do.correct.umi = TRUE, cell.attr = cell.attr.layer, reference.SCT.model = reference.SCT.model, ncells = ncells, residual.features = residual.features, variable.features.n = variable.features.n, variable.features.rv.th = variable.features.rv.th, vars.to.regress = vars.to.regress, latent.data = latent.data, do.scale = do.scale, do.center = do.center, clip.range = clip.range, vst.flavor = vst.flavor, conserve.memory = conserve.memory, return.only.var.genes = return.only.var.genes, seed.use = seed.use, verbose = verbose, ...) min_var <- vst.out$arguments$min_variance residual.type <- vst.out[['residual_type']] %||% 'pearson' assay.out <- CreateSCTAssay(vst.out = vst.out, do.correct.umi = do.correct.umi, residual.type = residual.type, clip.range = clip.range) # If there is no reference model, use the model learned on subset of cells to calculate residuals # by setting the learned model as the reference model (local.reference.SCT.model) if (is.null(x = reference.SCT.model)) { local.reference.SCT.model <- assay.out@SCTModel.list[[1]] } else { local.reference.SCT.model <- reference.SCT.model } variable.features <- VariableFeatures(assay.out) # once we have the model, just calculate residuals for all cells # local.reference.SCT.model set to reference.model if it is non null vst_out.reference <- SCTModel_to_vst(SCTModel = local.reference.SCT.model) vst_out.reference$gene_attr <- local.reference.SCT.model@feature.attributes min_var <- vst_out.reference$arguments$min_variance if (min_var == "umi_median"){ counts.x <- as.sparse(x = layer.data[, sample.int(n = ncol(x = layer.data), size = min(ncells, ncol(x = layer.data)) )]) min_var <- (median(counts.x@x)/5)^2 } # Step 2: Use learned model to calculate residuals in chunks cells.vector <- 1:ncol(x = layer.data) cells.grid <- split(x = cells.vector, f = ceiling(x = seq_along(along.with = cells.vector)/ncells)) # Single block residuals <- list() corrected_counts <- list() cell_attrs <- list() if (length(x = cells.grid) == 1){ merged.assay <- assay.out corrected_counts[[1]] <- GetAssayData(object = assay.out, slot = "data") residuals[[1]] <- GetAssayData(object = assay.out, slot = "scale.data") cell_attrs[[1]] <- vst_out.reference$cell_attr sct.assay.list[[dataset.names[dataset.index]]] <- assay.out } else { # iterate over chunks to get residuals for (i in seq_len(length.out = length(x = cells.grid))) { vp <- cells.grid[[i]] if (verbose){ message("Getting residuals for block ", i, "(of ", length(cells.grid), ") for ", dataset.names[[dataset.index]], " dataset") } counts.vp <- as.sparse(x = layer.data[, vp, drop=FALSE]) cell.attr.object <- cell.attr.layer[colnames(x = counts.vp),, drop=FALSE] vst_out <- vst_out.reference vst_out$cell_attr <- cell.attr.object vst_out$gene_attr <- vst_out$gene_attr[variable.features,,drop=FALSE] if (return.only.var.genes){ new_residual <- get_residuals( vst_out = vst_out, umi = counts.vp[variable.features,,drop=FALSE], residual_type = "pearson", min_variance = min_var, res_clip_range = clip.range, verbosity = FALSE ) } else { new_residual <- get_residuals( vst_out = vst_out, umi = counts.vp[all_features,,drop=FALSE], residual_type = "pearson", min_variance = min_var, res_clip_range = clip.range, verbosity = FALSE ) } vst_out$y <- new_residual corrected_counts[[i]] <- correct_counts( x = vst_out, umi = counts.vp[all_features,,drop=FALSE], verbosity = FALSE# as.numeric(x = verbose) * 2 ) residuals[[i]] <- new_residual cell_attrs[[i]] <- cell.attr.object } new.residuals <- Reduce(cbind, residuals) corrected_counts <- Reduce(cbind, corrected_counts) cell_attrs <- Reduce(rbind, cell_attrs) vst_out.reference$cell_attr <- cell_attrs[colnames(new.residuals),,drop=FALSE] SCTModel.list <- PrepVSTResults(vst.res = vst_out.reference, cell.names = all_cells) SCTModel.list <- list(model1 = SCTModel.list) # scale data here as do.center and do.scale are set to FALSE inside new.residuals <- ScaleData( new.residuals, features = NULL, vars.to.regress = vars.to.regress, latent.data = latent.data, model.use = 'linear', use.umi = FALSE, do.scale = do.scale, do.center = do.center, scale.max = Inf, block.size = 750, min.cells.to.block = 3000, verbose = verbose ) assay.out <- CreateSCTAssayObject(counts = corrected_counts, scale.data = new.residuals, SCTModel.list = SCTModel.list) assay.out$data <- log1p(x = corrected_counts) VariableFeatures(assay.out) <- variable.features # one assay per dataset if (verbose){ message("Finished calculating residuals for ", dataset.names[dataset.index]) } sct.assay.list[[dataset.names[dataset.index]]] <- assay.out variable.feature.list[[dataset.names[dataset.index]]] <- VariableFeatures(assay.out) } } # Return array by merging everythin if (length(x = sct.assay.list) == 1){ merged.assay <- sct.assay.list[[1]] } else { vf.list <- lapply(X = sct.assay.list, FUN = function(object.i) VariableFeatures(object = object.i)) variable.features.union <- Reduce(f = union, x = vf.list) var.features.sorted <- sort( x = table(unlist(x = vf.list, use.names = FALSE)), decreasing = TRUE ) # select top ranking features var.features <- variable.features.union # calculate residuals for union of features for (layer.name in names(x = sct.assay.list)){ vst_out <- SCTModel_to_vst(SCTModel = slot(object = sct.assay.list[[layer.name]], name = "SCTModel.list")[[1]]) all_cells <- Cells(x = object, layer = paste0(layer, ".", layer.name)) all_features <- Features(x = object, layer = paste0(layer, ".", layer.name)) variable.features.target <- intersect(x = rownames(x = vst_out$model_pars_fit), y = var.features) variable.features.target <- setdiff(x = variable.features.target, y = VariableFeatures(sct.assay.list[[layer.name]])) if (length(x = variable.features.target )<1){ next } layer.counts.tmp <- LayerData( object = object, layer = paste0(layer, ".", layer.name), cells = all_cells ) layer.counts.tmp <- as.sparse(x = layer.counts.tmp) vst_out$cell_attr <- vst_out$cell_attr[, c("log_umi"), drop=FALSE] vst_out$model_pars_fit <- vst_out$model_pars_fit[variable.features.target,,drop=FALSE] new_residual <- GetResidualsChunked( vst_out = vst_out, layer.counts = layer.counts.tmp, residual_type = "pearson", min_variance = min_var, res_clip_range = clip.range, verbose = FALSE ) old_residual <- GetAssayData(object = sct.assay.list[[layer.name]], slot = 'scale.data') merged_residual <- rbind(old_residual, new_residual) merged_residual <- ScaleData( merged_residual, features = NULL, vars.to.regress = vars.to.regress, latent.data = latent.data, model.use = 'linear', use.umi = FALSE, do.scale = do.scale, do.center = do.center, scale.max = Inf, block.size = 750, min.cells.to.block = 3000, verbose = verbose ) sct.assay.list[[layer.name]] <- SetAssayData(object = sct.assay.list[[layer.name]], slot = 'scale.data', new.data = merged_residual) VariableFeatures(sct.assay.list[[layer.name]]) <- rownames(x = merged_residual) } merged.assay <- merge(x = sct.assay.list[[1]], y = sct.assay.list[2:length(sct.assay.list)]) VariableFeatures(object = merged.assay) <- VariableFeatures(object = merged.assay, use.var.features = FALSE, nfeatures = variable.features.n) } # set the names of SCTmodels to be layer names models <- slot(object = merged.assay, name="SCTModel.list") names(models) <- names(x = sct.assay.list) slot(object = merged.assay, name="SCTModel.list") <- models gc(verbose = FALSE) return(merged.assay) } #' Calculate pearson residuals of features not in the scale.data #' #' This function calls sctransform::get_residuals. #' #' @param object A seurat object #' @param features Name of features to add into the scale.data #' @param assay Name of the assay of the seurat object generated by SCTransform #' @param layer Name (prefix) of the layer to pull counts from #' @param umi.assay Name of the assay of the seurat object containing UMI matrix #' and the default is RNA #' @param clip.range Numeric of length two specifying the min and max values the #' Pearson residual will be clipped to #' @param reference.SCT.model reference.SCT.model If a reference SCT model should be used #' for calculating the residuals. When set to not NULL, ignores the `SCTModel` #' paramater. #' @param replace.value Recalculate residuals for all features, even if they are #' already present. Useful if you want to change the clip.range. #' @param na.rm For features where there is no feature model stored, return NA #' for residual value in scale.data when na.rm = FALSE. When na.rm is TRUE, only #' return residuals for features with a model stored for all cells. #' @param verbose Whether to print messages and progress bars #' #' @return Returns a Seurat object containing Pearson residuals of added #' features in its scale.data #' #' @importFrom sctransform get_residuals #' @importFrom matrixStats rowAnyNAs #' #' @export #' @concept preprocessing #' #' @seealso \code{\link[sctransform]{get_residuals}} FetchResiduals <- function( object, features, assay = NULL, umi.assay = "RNA", layer = "counts", clip.range = NULL, reference.SCT.model = NULL, replace.value = FALSE, na.rm = TRUE, verbose = TRUE) { assay <- assay %||% DefaultAssay(object = object) if (IsSCT(assay = object[[assay]])) { object[[assay]] <- as(object[[assay]], "SCTAssay") } if (!inherits(x = object[[assay]], what = "SCTAssay")) { stop(assay, " assay was not generated by SCTransform") } sct.models <- levels(x = object[[assay]]) if (length(sct.models)==1){ sct.models <- list(sct.models) } if (length(x = sct.models) == 0) { warning("SCT model not present in assay", call. = FALSE, immediate. = TRUE) return(object) } possible.features <- Reduce(f = union, x = lapply(X = sct.models, FUN = function(x) { rownames(x = SCTResults(object = object[[assay]], slot = "feature.attributes", model = x)) })) bad.features <- setdiff(x = features, y = possible.features) if (length(x = bad.features) > 0) { warning("The following requested features are not present in any models: ", paste(bad.features, collapse = ", "), call. = FALSE ) features <- intersect(x = features, y = possible.features) } features.orig <- features if (na.rm) { # only compute residuals when feature model info is present in all features <- names(x = which(x = table(unlist(x = lapply( X = sct.models, FUN = function(x) { rownames(x = SCTResults(object = object[[assay]], slot = "feature.attributes", model = x)) } ))) == length(x = sct.models))) if (length(x = features) == 0) { return(object) } } features <- intersect(x = features.orig, y = features) if (length(features) < 1){ warning("The following requested features are not present in all the models: ", paste(features.orig, collapse = ", "), call. = FALSE ) return(NULL) } #if (length(x = sct.models) > 1 & verbose) { # message("This SCTAssay contains multiple SCT models. Computing residuals for cells using") #} # Get all (count) layers layers <- Layers(object = object[[umi.assay]], search = layer) # iterate over layer running sct model for each of the object names new.residuals <- list() total_cells <- 0 all_cells <- c() if (!is.null(x = reference.SCT.model)) { if (inherits(x = reference.SCT.model, what = "SCTModel")) { reference.SCT.model <- SCTModel_to_vst(SCTModel = reference.SCT.model) } if (is.list(x = reference.SCT.model) & inherits(x = reference.SCT.model[[1]], what = "SCTModel")) { stop("reference.SCT.model must be one SCTModel rather than a list of SCTModel") } if (reference.SCT.model$model_str != "y ~ log_umi") { stop("reference.SCT.model must be derived using default SCT regression formula, `y ~ log_umi`") } } for (i in seq_along(along.with = layers)) { l <- layers[i] sct_model <- sct.models[[i]] # these cells belong to this layer layer_cells <- Cells(x = object[[umi.assay]], layer = l) all_cells <- c(all_cells, layer_cells) total_cells <- total_cells + length(layer_cells) # calculate residual using this model and these cells new.residuals[[i]] <- FetchResidualSCTModel( object = object, umi.assay = umi.assay, assay = assay, layer = l, layer.cells = layer_cells, SCTModel = sct_model, reference.SCT.model = reference.SCT.model, new_features = features, replace.value = replace.value, clip.range = clip.range, verbose = verbose ) } existing.data <- GetAssayData(object = object, slot = "scale.data", assay = assay) all.features <- union(x = rownames(x = existing.data), y = features) new.scale <- matrix( data = NA, nrow = length(x = all.features), ncol = total_cells, dimnames = list(all.features, all_cells) ) common_cells <- intersect(colnames(new.scale), colnames(existing.data)) if (nrow(x = existing.data) > 0) { new.scale[rownames(x = existing.data), common_cells] <- existing.data[, common_cells] } if (length(x = new.residuals) == 1 & is.list(x = new.residuals)) { new.residuals <- new.residuals[[1]] } else { new.residuals <- Reduce(cbind, new.residuals) #new.residuals <- matrix(data = unlist(new.residuals), nrow = nrow(new.scale) , ncol = ncol(new.scale)) #colnames(new.residuals) <- colnames(new.scale) #rownames(new.residuals) <- rownames(new.scale) } new.scale[rownames(x = new.residuals), colnames(x = new.residuals)] <- new.residuals if (na.rm) { new.scale <- new.scale[!rowAnyNAs(x = new.scale), ] } return(new.scale[features, ]) } #' Calculate pearson residuals of features not in the scale.data #' This function is the secondary function under FetchResiduals #' #' @param object A seurat object #' @param assay Name of the assay of the seurat object generated by #' SCTransform. Default is "SCT" #' @param umi.assay Name of the assay of the seurat object to fetch #' UMIs from. Default is "RNA" #' @param layer Name of the layer under `umi.assay` to fetch UMIs from. #' Default is "counts" #' @param chunk_size Number of cells to load in memory for calculating #' residuals #' @param layer.cells Vector of cells to calculate the residual for. #' Default is NULL which uses all cells in the layer #' @param SCTModel Which SCTmodel to use from the object for calculating #' the residual. Will be ignored if reference.SCT.model is set #' @param reference.SCT.model If a reference SCT model should be used #' for calculating the residuals. When set to not NULL, ignores the `SCTModel` #' paramater. #' @param new_features A vector of features to calculate the residuals for #' @param clip.range Numeric of length two specifying the min and max values #' the Pearson residual will be clipped to. Useful if you want to change the #' clip.range. #' @param replace.value Whether to replace the value of residuals if it #' already exists #' @param verbose Whether to print messages and progress bars #' #' @return Returns a matrix containing centered pearson residuals of #' added features #' #' @importFrom sctransform get_residuals #' @importFrom Matrix colSums #' #' @keywords internal FetchResidualSCTModel <- function( object, assay = "SCT", umi.assay = "RNA", layer = "counts", chunk_size = 2000, layer.cells = NULL, SCTModel = NULL, reference.SCT.model = NULL, new_features = NULL, clip.range = NULL, replace.value = FALSE, verbose = FALSE ) { model.cells <- character() model.features <- Features(x = object, assay = assay) if (is.null(x = reference.SCT.model)){ clip.range <- clip.range %||% SCTResults(object = object[[assay]], slot = "clips", model = SCTModel)$sct model.features <- rownames(x = SCTResults(object = object[[assay]], slot = "feature.attributes", model = SCTModel)) model.cells <- Cells(x = slot(object = object[[assay]], name = "SCTModel.list")[[SCTModel]]) sct.method <- SCTResults(object = object[[assay]], slot = "arguments", model = SCTModel)$sct.method %||% "default" } layer.cells <- layer.cells %||% Cells(x = object[[umi.assay]], layer = layer) if (!is.null(reference.SCT.model)) { # use reference SCT model sct.method <- "reference" } existing.scale.data <- NULL if (is.null(x=reference.SCT.model)){ existing.scale.data <- suppressWarnings(GetAssayData(object = object, assay = assay, slot = "scale.data")) } scale.data.cells <- colnames(x = existing.scale.data) scale.data.cells.common <- intersect(scale.data.cells, layer.cells) scale.data.cells <- intersect(x = scale.data.cells, y = scale.data.cells.common) if (length(x = setdiff(x = layer.cells, y = scale.data.cells)) == 0) { # existing.scale.data <- suppressWarnings(GetAssayData(object = object, assay = assay, slot = "scale.data")) #full.scale.data <- matrix(data = NA, nrow = nrow(x = existing.scale.data), # ncol = length(x = layer.cells), dimnames = list(rownames(x = existing.scale.data), layer.cells)) #full.scale.data[rownames(x = existing.scale.data), colnames(x = existing.scale.data)] <- existing.scale.data #existing_features <- names(x = which(x = !apply( # X = full.scale.data, # MARGIN = 1, # FUN = anyNA #))) existing_features <- rownames(x = existing.scale.data) } else { existing_features <- character() } if (replace.value) { features_to_compute <- new_features } else { features_to_compute <- setdiff(x = new_features, y = existing_features) } if (length(features_to_compute)<1){ return (existing.scale.data[intersect(x = rownames(x = scale.data.cells), y = new_features),,drop=FALSE]) } if (is.null(x = reference.SCT.model) & length(x = setdiff(x = model.cells, y = scale.data.cells)) == 0) { existing_features <- names(x = which(x = ! apply( X = GetAssayData(object = object, assay = assay, slot = "scale.data")[, model.cells], MARGIN = 1, FUN = anyNA) )) } else { existing_features <- character() } if (sct.method == "reference.model") { if (verbose) { message("sct.model ", SCTModel, " is from reference, so no residuals will be recalculated") } features_to_compute <- character() } if (!umi.assay %in% Assays(object = object)) { warning("The umi assay (", umi.assay, ") is not present in the object. ", "Cannot compute additional residuals.", call. = FALSE, immediate. = TRUE ) return(NULL) } # these features do not have feature attriutes diff_features <- setdiff(x = features_to_compute, y = model.features) intersect_features <- intersect(x = features_to_compute, y = model.features) if (sct.method == "reference") { vst_out <- SCTModel_to_vst(SCTModel = reference.SCT.model) # override clip.range clip.range <- vst_out$arguments$sct.clip.range umi.field <- paste0("nCount_", assay) # get rid of the cell attributes vst_out$cell_attr <- NULL all.features <- intersect( x = rownames(x = vst_out$gene_attr), y = features_to_compute ) vst_out$gene_attr <- vst_out$gene_attr[all.features, , drop = FALSE] vst_out$model_pars_fit <- vst_out$model_pars_fit[all.features, , drop = FALSE] } else { vst_out <- SCTModel_to_vst(SCTModel = slot(object = object[[assay]], name = "SCTModel.list")[[SCTModel]]) clip.range <- vst_out$arguments$sct.clip.range } clip.max <- max(clip.range) clip.min <- min(clip.range) layer.cells <- layer.cells %||% Cells(x = object[[umi.assay]], layer = layer) if (length(x = diff_features) == 0) { counts <- LayerData( object = object[[umi.assay]], layer = layer, cells = layer.cells ) cells.vector <- 1:length(x = layer.cells) cells.grid <- split(x = cells.vector, f = ceiling(x = seq_along(along.with = cells.vector)/chunk_size)) new_residuals <- list() for (i in seq_len(length.out = length(x = cells.grid))) { vp <- cells.grid[[i]] block <- counts[,vp, drop=FALSE] umi.all <- as.sparse(x = block) # calculate min_variance for get_residuals # required when vst_out$arguments$min_variance == "umi_median" # only calculated once if (i==1){ nz_median <- median(umi.all@x) min_var_custom <- (nz_median / 5)^2 } umi <- umi.all[features_to_compute, , drop = FALSE] ## Add cell_attr for missing cells cell_attr <- data.frame( umi = colSums(umi.all), log_umi = log10(x = colSums(umi.all)) ) rownames(cell_attr) <- colnames(umi.all) if (sct.method %in% c("reference.model", "reference")) { vst_out$cell_attr <- cell_attr[colnames(umi.all), ,drop=FALSE] } else { cell_attr_existing <- vst_out$cell_attr cells_missing <- setdiff(rownames(cell_attr), rownames(cell_attr_existing)) if (length(cells_missing)>0){ cell_attr_missing <- cell_attr[cells_missing, ,drop=FALSE] missing_cols <- setdiff(x = colnames(x = cell_attr_existing), y = colnames(x = cell_attr_missing)) if (length(x = missing_cols) > 0) { cell_attr_missing[, missing_cols] <- NA } vst_out$cell_attr <- rbind(cell_attr_existing, cell_attr_missing) vst_out$cell_attr <- vst_out$cell_attr[colnames(umi), , drop=FALSE] } } if (verbose) { if (sct.method == "reference.model") { message("using reference sct model") } else { message("sct.model: ", SCTModel, " on ", ncol(x = umi), " cells: ", colnames(x = umi.all)[1], " .. ", colnames(x = umi.all)[ncol(umi.all)]) } } if (vst_out$arguments$min_variance == "umi_median"){ min_var <- min_var_custom } else { min_var <- vst_out$arguments$min_variance } if (nrow(umi)>0){ vst_out.tmp <- vst_out vst_out.tmp$cell_attr <- vst_out.tmp$cell_attr[colnames(x = umi),] new_residual <- get_residuals( vst_out = vst_out.tmp, umi = umi, residual_type = "pearson", min_variance = min_var, res_clip_range = c(clip.min, clip.max), verbosity = as.numeric(x = verbose) * 2 ) } else { return(matrix( data = NA, nrow = length(x = features_to_compute), ncol = length(x = colnames(umi.all)), dimnames = list(features_to_compute, colnames(umi.all)) )) } new_residual <- as.matrix(x = new_residual) new_residuals[[i]] <- new_residual } new_residual <- do.call(what = cbind, args = new_residuals) # centered data if no reference model is provided if (is.null(x = reference.SCT.model)){ new_residual <- new_residual - rowMeans(x = new_residual) } else { # subtract residual mean from reference model if (verbose){ message("Using residual mean from reference for centering") } vst_out <- SCTModel_to_vst(SCTModel = reference.SCT.model) ref.residuals.mean <- vst_out$gene_attr[rownames(x = new_residual),"residual_mean"] new_residual <- sweep( x = new_residual, MARGIN = 1, STATS = ref.residuals.mean, FUN = "-" ) } # return (new_residuals) } else { # Some features do not exist warning( "In the SCTModel ", SCTModel, ", the following ", length(x = diff_features), " features do not exist in the counts slot: ", paste(diff_features, collapse = ", ") ) if (length(x = intersect_features) == 0) { # No features exist return(matrix( data = NA, nrow = length(x = features_to_compute), ncol = length(x = model.cells), dimnames = list(features_to_compute, model.cells) )) } } old.features <- setdiff(x = new_features, y = features_to_compute) if (length(x = old.features) > 0) { old_residuals <- GetAssayData(object = object[[assay]], slot = "scale.data")[old.features, model.cells, drop = FALSE] new_residual <- rbind(new_residual, old_residuals)[new_features, ] } return(new_residual) } #' @importFrom sctransform get_residuals GetResidualsChunked <- function(vst_out, layer.counts, residual_type, min_variance, res_clip_range, verbose, chunk_size=5000) { if (inherits(x = layer.counts, what = 'V3Matrix')) { residuals <- get_residuals( vst_out = vst_out, umi = layer.counts, residual_type = residual_type, min_variance = min_variance, res_clip_range = res_clip_range, verbosity = as.numeric(x = verbose) * 2 ) } else if (inherits(x = layer.counts, what = "IterableMatrix")) { cells.vector <- 1:ncol(x = layer.counts) residuals.list <- list() cells.grid <- split(x = cells.vector, f = ceiling(x = seq_along(along.with = cells.vector)/chunk_size)) for (i in seq_len(length.out = length(x = cells.grid))) { vp <- cells.grid[[i]] counts.vp <- as.sparse(x = layer.counts[, vp]) vst.out <- vst_out vst.out$cell_attr <- vst.out$cell_attr[colnames(x = counts.vp),,drop=FALSE] residuals.list[[i]] <- get_residuals( vst_out = vst.out, umi = counts.vp, residual_type = residual_type, min_variance = min_variance, res_clip_range = res_clip_range, verbosity = as.numeric(x = verbose) * 2 ) } residuals <- Reduce(f = cbind, x = residuals.list) } else { stop("Data type not supported") } return (residuals) } #' temporal function to get residuals from reference #' @param object A seurat object #' @param reference.SCT.model a reference SCT model that should be used #' for calculating the residuals #' @param features Names of features to compute #' @param nCount_UMI UMI counts. If not specified, defaults to #' column sums of object #' @param verbose Whether to print messages and progress bars #' @importFrom sctransform get_residuals #' @importFrom Matrix colSums #' #' @keywords internal FetchResiduals_reference <- function(object, reference.SCT.model = NULL, features = NULL, nCount_UMI = NULL, verbose = FALSE) { ## Add cell_attr for missing cells nCount_UMI <- nCount_UMI %||% colSums(object) cell_attr <- data.frame( umi = nCount_UMI, log_umi = log10(x = nCount_UMI) ) features_to_compute <- features features_to_compute <- intersect(features_to_compute, rownames(object)) vst_out <- SCTModel_to_vst(SCTModel = reference.SCT.model) # override clip.range clip.range <- vst_out$arguments$sct.clip.range # get rid of the cell attributes vst_out$cell_attr <- NULL all.features <- intersect( x = rownames(x = vst_out$gene_attr), y = features_to_compute ) vst_out$gene_attr <- vst_out$gene_attr[all.features, , drop = FALSE] vst_out$model_pars_fit <- vst_out$model_pars_fit[all.features, , drop = FALSE] clip.max <- max(clip.range) clip.min <- min(clip.range) umi <- object[features_to_compute, , drop = FALSE] rownames(cell_attr) <- colnames(object) vst_out$cell_attr <- cell_attr if (verbose) { message("using reference sct model") } if (vst_out$arguments$min_variance == "umi_median"){ nz_median <- 1 min_var_custom <- (nz_median / 5)^2 min_var <- min_var_custom } else { min_var <- vst_out$arguments$min_variance } new_residual <- get_residuals( vst_out = vst_out, umi = umi, residual_type = "pearson", min_variance = min_var, verbosity = as.numeric(x = verbose) * 2 ) ref.residuals.mean <- vst_out$gene_attr[rownames(x = new_residual),"residual_mean"] new_residual <- sweep( x = new_residual, MARGIN = 1, STATS = ref.residuals.mean, FUN = "-" ) new_residual <- MinMax(data = new_residual, min = clip.min, max = clip.max) return(new_residual) } #' Find variable features based on mean.var.plot #' #' @param data Data matrix #' @param nselect Number of features to select based on dispersion values #' @param verbose Whether to print messages and progress bars #' @param mean.cutoff Numeric of length two specifying the min and max values #' @param dispersion.cutoff Numeric of length two specifying the min and max values #' #' @keywords internal #' MVP <- function( data, verbose = TRUE, nselect = 2000L, mean.cutoff = c(0.1, 8), dispersion.cutoff = c(1, Inf), ... ) { hvf.info <- DISP(data = data, nselect = nselect, verbose = verbose) hvf.info$variable <- FALSE hvf.info$rank <- NA hvf.info <- hvf.info[order(hvf.info$mvp.dispersion, decreasing = TRUE), , drop = FALSE] means.use <- (hvf.info[, 1] > mean.cutoff[1]) & (hvf.info[, 1] < mean.cutoff[2]) dispersions.use <- (hvf.info[, 3] > dispersion.cutoff[1]) & (hvf.info[, 3] < dispersion.cutoff[2]) hvf.info[which(x = means.use & dispersions.use), 'variable'] <- TRUE rank.rows <- rownames(x = hvf.info)[which(x = means.use & dispersions.use)] selected.indices <- which(rownames(x = hvf.info) %in% rank.rows) hvf.info$rank[selected.indices] <- seq_along(selected.indices) hvf.info <- hvf.info[order(as.numeric(row.names(hvf.info))), ] # hvf.info[hvf.info$variable,'rank'] <- rank(x = hvf.info[hvf.info$variable,'rank']) # hvf.info[!hvf.info$variable,'rank'] <- NA return(hvf.info) } Seurat/R/integration5.R0000644000176200001440000006421314744463014014466 0ustar liggesusers#' @include zzz.R #' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Harmony Integration #' #' @param object An \code{\link[SeuratObject]{Assay5}} object # @param assay Name of \code{object} in the containing \code{Seurat} object #' @param orig A \link[SeuratObject:DimReduc]{dimensional reduction} to correct #' @param features Ignored #' @param scale.layer Ignored #' @param new.reduction Name of new integrated dimensional reduction #' @param layers Ignored #' @param key Key for Harmony dimensional reduction #' @param npcs If doing PCA on input matrix, number of PCs to compute #' @param theta Diversity clustering penalty parameter #' @param lambda Ridge regression penalty parameter #' @param sigma Width of soft kmeans clusters #' @param nclust Number of clusters in model #' @param tau Protection against overclustering small datasets with large ones #' @param block.size What proportion of cells to update during clustering #' @param max.iter.harmony Maximum number of rounds to run Harmony #' @param max.iter.cluster Maximum number of rounds to run clustering at each round of Harmony #' @param epsilon.cluster Convergence tolerance for clustering round of Harmony #' @param epsilon.harmony Convergence tolerance for Harmony #' @param verbose Whether to print progress messages. TRUE to print, FALSE to suppress #' @param ... Ignored #' #' @return ... #' #' @note This function requires the #' \href{https://cran.r-project.org/package=harmony}{\pkg{harmony}} package #' to be installed #' # @templateVar pkg harmony # @template note-reqdpkg #' #' @examples #' \dontrun{ #' # Preprocessing #' obj <- SeuratData::LoadData("pbmcsca") #' obj[["RNA"]] <- split(obj[["RNA"]], f = obj$Method) #' obj <- NormalizeData(obj) #' obj <- FindVariableFeatures(obj) #' obj <- ScaleData(obj) #' obj <- RunPCA(obj) #' #' # After preprocessing, we integrate layers with added parameters specific to Harmony: #' obj <- IntegrateLayers(object = obj, method = HarmonyIntegration, orig.reduction = "pca", #' new.reduction = 'harmony', verbose = FALSE) #' #' # Modifying Parameters #' # We can also add arguments specific to Harmony such as theta, to give more diverse clusters #' obj <- IntegrateLayers(object = obj, method = HarmonyIntegration, orig.reduction = "pca", #' new.reduction = 'harmony', verbose = FALSE, theta = 3) #' # Integrating SCTransformed data #' obj <- SCTransform(object = obj) #' obj <- IntegrateLayers(object = obj, method = HarmonyIntegration, #' orig.reduction = "pca", new.reduction = 'harmony', #' assay = "SCT", verbose = FALSE) #' } #' #' #' @export #' #' @concept integration #' #' @seealso \code{\link[harmony:HarmonyMatrix]{harmony::HarmonyMatrix}()} #' HarmonyIntegration <- function( object, orig, features = NULL, scale.layer = 'scale.data', new.reduction = 'harmony', layers = NULL, npcs = 50L, key = 'harmony_', theta = NULL, lambda = NULL, sigma = 0.1, nclust = NULL, tau = 0, block.size = 0.05, max.iter.harmony = 10L, max.iter.cluster = 20L, epsilon.cluster = 1e-05, epsilon.harmony = 1e-04, verbose = TRUE, ... ) { check_installed( pkg = "harmony", reason = "for running integration with Harmony" ) if (!inherits(x = object, what = c('StdAssay', 'SCTAssay'))) { abort(message = "'object' must be a v5 or SCT assay") } else if (!inherits(x = orig, what = 'DimReduc')) { abort(message = "'orig' must be a dimensional reduction") } # # Run joint PCA # features <- features %||% Features(x = object, layer = scale.layer) # pca <- RunPCA( # object = object, # assay = assay, # features = features, # layer = scale.layer, # npcs = npcs, # verbose = verbose # ) #create grouping variables groups <- CreateIntegrationGroups(object, layers = layers, scale.layer = scale.layer) # Run Harmony harmony.embed <- harmony::HarmonyMatrix( data_mat = Embeddings(object = orig), meta_data = groups, vars_use = 'group', do_pca = FALSE, npcs = 0L, theta = theta, lambda = lambda, sigma = sigma, nclust = nclust, tau = tau, block.size = block.size, max.iter.harmony = max.iter.harmony, max.iter.cluster = max.iter.cluster, epsilon.cluster = epsilon.cluster, epsilon.harmony = epsilon.harmony, return_object = FALSE, verbose = verbose ) rownames(x = harmony.embed) <- Cells(x = orig) # TODO add feature loadings from PCA dr <- suppressWarnings(expr = CreateDimReducObject( embeddings = harmony.embed, key = key, # assay = assay assay = DefaultAssay(object = orig) )) output.list <- list(dr) names(output.list) <- c(new.reduction) return(output.list) } attr(x = HarmonyIntegration, which = 'Seurat.method') <- 'integration' #' Seurat-CCA Integration #' #' @inheritParams RPCAIntegration #' @export #' @concept integration #' #' @examples #' \dontrun{ #' # Preprocessing #' obj <- SeuratData::LoadData("pbmcsca") #' obj[["RNA"]] <- split(obj[["RNA"]], f = obj$Method) #' obj <- NormalizeData(obj) #' obj <- FindVariableFeatures(obj) #' obj <- ScaleData(obj) #' obj <- RunPCA(obj) #' #' # After preprocessing, we integrate layers. #' obj <- IntegrateLayers(object = obj, method = CCAIntegration, #' orig.reduction = "pca", new.reduction = "integrated.cca", #' verbose = FALSE) #' #' # Modifying parameters #' # We can also specify parameters such as `k.anchor` to increase the strength of integration #' obj <- IntegrateLayers(object = obj, method = CCAIntegration, #' orig.reduction = "pca", new.reduction = "integrated.cca", #' k.anchor = 20, verbose = FALSE) #' #' # Integrating SCTransformed data #' obj <- SCTransform(object = obj) #' obj <- IntegrateLayers(object = obj, method = CCAIntegration, #' orig.reduction = "pca", new.reduction = "integrated.cca", #' assay = "SCT", verbose = FALSE) #' } #' CCAIntegration <- function( object = NULL, assay = NULL, layers = NULL, orig = NULL, new.reduction = 'integrated.dr', reference = NULL, features = NULL, normalization.method = c("LogNormalize", "SCT"), dims = 1:30, k.filter = NA, scale.layer = 'scale.data', dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) { op <- options(Seurat.object.assay.version = "v3", Seurat.object.assay.calcn = FALSE) on.exit(expr = options(op), add = TRUE) normalization.method <- match.arg(arg = normalization.method) features <- features %||% SelectIntegrationFeatures5(object = object) assay <- assay %||% 'RNA' layers <- layers %||% Layers(object, search = 'data') if (normalization.method == 'SCT') { #create grouping variables groups <- CreateIntegrationGroups(object, layers = layers, scale.layer = scale.layer) object.sct <- CreateSeuratObject(counts = object, assay = 'SCT') object.sct$split <- groups[,1] object.list <- SplitObject(object = object.sct,split.by = 'split') object.list <- PrepSCTIntegration(object.list, anchor.features = features) } else { object.list <- list() for (i in seq_along(along.with = layers)) { if (inherits(x = object[layers[i]], what = "IterableMatrix")) { warning("Converting BPCells matrix to dgCMatrix for integration ", "as on-disk CCA Integration is not currently supported", call. = FALSE, immediate. = TRUE) counts <- as(object = object[layers[i]][features, ], Class = "dgCMatrix") } else { counts <- object[layers[i]][features, ] } object.list[[i]] <- CreateSeuratObject(counts = counts) if (inherits(x = object[scale.layer], what = "IterableMatrix")) { scale.data.layer <- as.matrix(object[scale.layer][features, Cells(object.list[[i]])]) object.list[[i]][["RNA"]]$scale.data <- scale.data.layer } else { object.list[[i]][["RNA"]]$scale.data <- object[scale.layer][features, Cells(object.list[[i]])] } object.list[[i]][['RNA']]$counts <- NULL } } anchor <- FindIntegrationAnchors(object.list = object.list, anchor.features = features, scale = FALSE, reduction = 'cca', normalization.method = normalization.method, dims = dims, k.filter = k.filter, reference = reference, verbose = verbose, ... ) suppressWarnings({ anchor@object.list <- lapply(anchor@object.list, function(x) { x <- DietSeurat(x, features = features[1:2]) return(x) }) }, classes = "dimWarning") object_merged <- IntegrateEmbeddings(anchorset = anchor, reductions = orig, new.reduction.name = new.reduction, dims.to.integrate = dims.to.integrate, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, sample.tree = sample.tree, preserve.order = preserve.order, verbose = verbose ) output.list <- list(object_merged[[new.reduction]]) names(output.list) <- c(new.reduction) return(output.list) } attr(x = CCAIntegration, which = 'Seurat.method') <- 'integration' #' Seurat-RPCA Integration #' #' @param object A \code{Seurat} object #' @param assay Name of \code{Assay} in the \code{Seurat} object #' @param layers Names of layers in \code{assay} #' @param orig A \link[SeuratObject]{DimReduc} to correct #' @param new.reduction Name of new integrated dimensional reduction #' @param reference A reference \code{Seurat} object #' @param features A vector of features to use for integration #' @param normalization.method Name of normalization method used: LogNormalize #' or SCT #' @param dims Dimensions of dimensional reduction to use for integration #' @param k.filter Number of anchors to filter #' @param scale.layer Name of scaled layer in \code{Assay} #' @param verbose Print progress #' @param ... Additional arguments passed to \code{FindIntegrationAnchors} #' #' @examples #' \dontrun{ #' # Preprocessing #' obj <- SeuratData::LoadData("pbmcsca") #' obj[["RNA"]] <- split(obj[["RNA"]], f = obj$Method) #' obj <- NormalizeData(obj) #' obj <- FindVariableFeatures(obj) #' obj <- ScaleData(obj) #' obj <- RunPCA(obj) #' #' # After preprocessing, we run integration #' obj <- IntegrateLayers(object = obj, method = RPCAIntegration, #' orig.reduction = "pca", new.reduction = 'integrated.rpca', #' verbose = FALSE) #' #' # Reference-based Integration #' # Here, we use the first layer as a reference for integraion #' # Thus, we only identify anchors between the reference and the rest of the datasets, #' # saving computational resources #' obj <- IntegrateLayers(object = obj, method = RPCAIntegration, #' orig.reduction = "pca", new.reduction = 'integrated.rpca', #' reference = 1, verbose = FALSE) #' #' # Modifying parameters #' # We can also specify parameters such as `k.anchor` to increase the strength of #' # integration #' obj <- IntegrateLayers(object = obj, method = RPCAIntegration, #' orig.reduction = "pca", new.reduction = 'integrated.rpca', #' k.anchor = 20, verbose = FALSE) #' #' # Integrating SCTransformed data #' obj <- SCTransform(object = obj) #' obj <- IntegrateLayers(object = obj, method = RPCAIntegration, #' orig.reduction = "pca", new.reduction = 'integrated.rpca', #' assay = "SCT", verbose = FALSE) #' } #' #' @inheritParams FindIntegrationAnchors #' @inheritParams IntegrateEmbeddings #' @param ... Arguments passed on to \code{FindIntegrationAnchors} #' @export #' #' @concept utilities #' RPCAIntegration <- function( object = NULL, assay = NULL, layers = NULL, orig = NULL, new.reduction = 'integrated.dr', reference = NULL, features = NULL, normalization.method = c("LogNormalize", "SCT"), dims = 1:30, k.filter = NA, scale.layer = 'scale.data', dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) { op <- options(Seurat.object.assay.version = "v3", Seurat.object.assay.calcn = FALSE) on.exit(expr = options(op), add = TRUE) normalization.method <- match.arg(arg = normalization.method) features <- features %||% SelectIntegrationFeatures5(object = object) assay <- assay %||% 'RNA' layers <- layers %||% Layers(object = object, search = 'data') #check that there enough cells present ncells <- sapply(X = layers, FUN = function(x) {ncell <- dim(object[x])[2] return(ncell) }) if (min(ncells) < max(dims)) { abort(message = "At least one layer has fewer cells than dimensions specified, please lower 'dims' accordingly.") } if (normalization.method == 'SCT') { #create grouping variables groups <- CreateIntegrationGroups(object, layers = layers, scale.layer = scale.layer) object.sct <- CreateSeuratObject(counts = object, assay = 'SCT') object.sct$split <- groups[,1] object.list <- SplitObject(object = object.sct, split.by = 'split') object.list <- PrepSCTIntegration(object.list = object.list, anchor.features = features) object.list <- lapply(X = object.list, FUN = function(x) { x <- RunPCA(object = x, features = features, verbose = FALSE, npcs = max(dims)) return(x) } ) } else { object.list <- list() for (i in seq_along(along.with = layers)) { object.list[[i]] <- suppressMessages(suppressWarnings( CreateSeuratObject(counts = NULL, data = object[layers[i]][features,]) )) VariableFeatures(object = object.list[[i]]) <- features object.list[[i]] <- suppressWarnings(ScaleData(object = object.list[[i]], verbose = FALSE)) object.list[[i]] <- RunPCA(object = object.list[[i]], verbose = FALSE, npcs=max(dims)) suppressWarnings(object.list[[i]][['RNA']]$counts <- NULL) } } anchor <- FindIntegrationAnchors(object.list = object.list, anchor.features = features, scale = FALSE, reduction = 'rpca', normalization.method = normalization.method, dims = dims, k.filter = k.filter, reference = reference, verbose = verbose, ... ) slot(object = anchor, name = "object.list") <- lapply( X = slot( object = anchor, name = "object.list"), FUN = function(x) { suppressWarnings(expr = x <- DietSeurat(x, features = features[1:2])) return(x) }) object_merged <- IntegrateEmbeddings(anchorset = anchor, reductions = orig, new.reduction.name = new.reduction, dims.to.integrate = dims.to.integrate, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, sample.tree = sample.tree, preserve.order = preserve.order, verbose = verbose ) output.list <- list(object_merged[[new.reduction]]) names(output.list) <- c(new.reduction) return(output.list) } attr(x = RPCAIntegration, which = 'Seurat.method') <- 'integration' #' Seurat-Joint PCA Integration #' #' @inheritParams RPCAIntegration #' @inheritParams FindIntegrationAnchors #' @inheritParams IntegrateEmbeddings #' @param ... Arguments passed on to \code{FindIntegrationAnchors} #' @export #' @concept integration #' JointPCAIntegration <- function( object = NULL, assay = NULL, layers = NULL, orig = NULL, new.reduction = 'integrated.dr', reference = NULL, features = NULL, normalization.method = c("LogNormalize", "SCT"), dims = 1:30, k.anchor = 20, scale.layer = 'scale.data', dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) { op <- options(Seurat.object.assay.version = "v3", Seurat.object.assay.calcn = FALSE) on.exit(expr = options(op), add = TRUE) normalization.method <- match.arg(arg = normalization.method) features <- features %||% SelectIntegrationFeatures5(object = object) features.diet <- features[1:2] assay <- assay %||% DefaultAssay(object) layers <- layers %||% Layers(object, search = 'data') if (normalization.method == 'SCT') { #create grouping variables groups <- CreateIntegrationGroups(object, layers = layers, scale.layer = scale.layer) object.sct <- CreateSeuratObject(counts = object, assay = 'SCT') object.sct <- DietSeurat(object = object.sct, features = features.diet) object.sct[['joint.pca']] <- CreateDimReducObject( embeddings = Embeddings(object = orig), assay = 'SCT', loadings = Loadings(orig), key = 'J_' ) object.sct$split <- groups[,1] object.list <- SplitObject(object = object.sct,split.by = 'split') object.list <- PrepSCTIntegration(object.list, anchor.features = features.diet) object.list <- lapply(object.list, function(x) { x[['SCT']]@SCTModel.list <- list() return(x) }) } else { object.list <- list() for (i in seq_along(along.with = layers)) { object.list[[i]] <- CreateSeuratObject(counts = object[layers[i]][features.diet, ] ) object.list[[i]][['RNA']]$counts <- NULL object.list[[i]][['joint.pca']] <- CreateDimReducObject( embeddings = Embeddings(object = orig)[Cells(object.list[[i]]),], assay = 'RNA', loadings = Loadings(orig), key = 'J_' ) } } anchor <- FindIntegrationAnchors(object.list = object.list, anchor.features = features.diet, scale = FALSE, reduction = 'jpca', normalization.method = normalization.method, dims = dims, k.anchor = k.anchor, k.filter = NA, reference = reference, verbose = verbose, ... ) object_merged <- IntegrateEmbeddings(anchorset = anchor, reductions = orig, new.reduction.name = new.reduction, dims.to.integrate = dims.to.integrate, k.weight = k.weight, weight.reduction = weight.reduction, sd.weight = sd.weight, sample.tree = sample.tree, preserve.order = preserve.order, verbose = verbose ) output.list <- list(object_merged[[new.reduction]]) names(output.list) <- c(new.reduction) return(output.list) } attr(x = JointPCAIntegration, which = 'Seurat.method') <- 'integration' #' Integrate Layers #' #' @param object A \code{\link[SeuratObject]{Seurat}} object #' @param method Integration method function #' @param orig.reduction Name of dimensional reduction for correction #' @param assay Name of assay for integration #' @param features A vector of features to use for integration #' @param layers Names of normalized layers in \code{assay} #' @param scale.layer Name(s) of scaled layer(s) in \code{assay} #' @param ... Arguments passed on to \code{method} #' #' @return \code{object} with integration data added to it #' #' @section Integration Method Functions: #' The following integration method functions are available: #' \Sexpr[stage=render,results=rd]{Seurat:::.rd_methods("integration")} #' #' @export #' #' @concept integration #' #' @seealso \link[Seurat:writing-integration]{Writing integration method functions} #' IntegrateLayers <- function( object, method, orig.reduction = 'pca', assay = NULL, features = NULL, layers = NULL, scale.layer = 'scale.data', ... ) { # Get the integration method if (is_quosure(x = method)) { method <- eval( expr = quo_get_expr(quo = method), envir = quo_get_env(quo = method) ) } if (is.character(x = method)) { method <- get(x = method) } if (!is.function(x = method)) { abort(message = "'method' must be a function for integrating layers") } # Check our assay assay <- assay %||% DefaultAssay(object = object) if (inherits(x = object[[assay]], what = 'SCTAssay')) { layers <- 'data' scale.layer <- 'scale.data' features <- features %||% SelectSCTIntegrationFeatures( object = object, assay = assay ) } else if (inherits(x = object[[assay]], what = 'StdAssay')) { layers <- Layers(object = object, assay = assay, search = layers %||% 'data') scale.layer <- Layers(object = object, search = scale.layer) features <- features %||% VariableFeatures( object = object, assay = assay, nfeatures = 2000L ) } else { abort(message = "'assay' must be a v5 or SCT assay") } if (!is.null(scale.layer)) { features <- intersect( x = features, y = Features(x = object, assay = assay, layer = scale.layer) ) } if (!length(x = features)) { abort(message = "None of the features provided are found in this assay") } if (!is.null(orig.reduction)) { # Check our dimensional reduction orig.reduction <- orig.reduction %||% DefaultDimReduc(object = object, assay = assay) if (!orig.reduction %in% Reductions(object = object)) { abort(message = paste(sQuote(x = orig.reduction), 'is not a dimensional reduction')) } obj.orig <- object[[orig.reduction]] if (is.null(x = DefaultAssay(object = obj.orig))) { DefaultAssay(object = obj.orig) <- assay } } # Run the integration method value <- method( object = object[[assay]], assay = assay, orig = obj.orig, layers = layers, scale.layer = scale.layer, features = features, ... ) for (i in names(x = value)) { object[[i]] <- value[[i]] } return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Creates data.frame with cell group assignments for integration # uses SCT models if SCTAssay and layers otherwise CreateIntegrationGroups <- function(object, layers, scale.layer) { groups <- if (inherits(x = object, what = 'SCTAssay')) { df <- SeuratObject::EmptyDF(n = ncol(x = object)) row.names(x = df) <- colnames(x = object) for (model in levels(x = object)) { cc <- Cells(x = object, layer = model) df[cc, "group"] <- model } df } else if (length(x = layers) > 1L) { cmap <- slot(object = object, name = 'cells')[, layers] as.data.frame(x = labels( object = cmap, values = Cells(x = object, layer = scale.layer) )) } names(x = groups) <- 'group' return(groups) } #' Writing Integration Method Functions #' #' Integration method functions can be written by anyone to implement any #' integration method in Seurat. These methods should expect to take a #' \link[SeuratObject:Assay5]{v5 assay} as input and return a named list of #' objects that can be added back to a \code{Seurat} object (eg. a #' \link[SeuratObject:DimReduc]{dimensional reduction} or cell-level meta data) #' #' @section Provided Parameters: #' Every integration method function should expect the following arguments: #' \itemize{ #' \item \dQuote{\code{object}}: an \code{\link[SeuratObject]{Assay5}} object # \item \dQuote{\code{assay}}: name of \code{object} in the original # \code{\link[SeuratObject]{Seurat}} object #' \item \dQuote{\code{orig}}: \link[SeuratObject:DimReduc]{dimensional #' reduction} to correct #' \item \dQuote{\code{layers}}: names of normalized layers in \code{object} #' \item \dQuote{\code{scale.layer}}: name(s) of scaled layer(s) in #' \code{object} #' \item \dQuote{\code{features}}: a vector of features for integration #' \item \dQuote{\code{groups}}: a one-column data frame with the groups for #' each cell in \code{object}; the column name will be \dQuote{group} #' } #' #' @section Method Discovery: #' The documentation for \code{\link{IntegrateLayers}()} will automatically #' link to integration method functions provided by packages in the #' \code{\link[base]{search}()} space. To make an integration method function #' discoverable by the documentation, simply add an attribute named #' \dQuote{\code{Seurat.method}} to the function with a value of #' \dQuote{\code{integration}} #' \preformatted{ #' attr(MyIntegrationFunction, which = "Seurat.method") <- "integration" #' } #' #' @keywords internal #' #' @concept integration #' #' @name writing-integration #' @rdname writing-integration #' #' @seealso \code{\link{IntegrateLayers}()} #' NULL Seurat/R/differential_expression.R0000644000176200001440000023746214744456127017010 0ustar liggesusers#' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% globalVariables( names = c('myAUC', 'p_val', 'avg_logFC'), package = 'Seurat', add = TRUE ) #' Gene expression markers for all identity classes #' #' Finds markers (differentially expressed genes) for each of the identity classes in a dataset #' #' @inheritParams FindMarkers #' @param node A node to find markers for and all its children; requires #' \code{\link{BuildClusterTree}} to have been run previously; replaces \code{FindAllMarkersNode} #' @param return.thresh Only return markers that have a p-value < return.thresh, or a power > return.thresh (if the test is ROC) #' #' @return Matrix containing a ranked list of putative markers, and associated #' statistics (p-values, ROC score, etc.) #' #' @importFrom stats setNames #' #' @export #' #' @aliases FindAllMarkersNode #' @concept differential_expression #' #' @examples #' data("pbmc_small") #' # Find markers for all clusters #' all.markers <- FindAllMarkers(object = pbmc_small) #' head(x = all.markers) #' \dontrun{ #' # Pass a value to node as a replacement for FindAllMarkersNode #' pbmc_small <- BuildClusterTree(object = pbmc_small) #' all.markers <- FindAllMarkers(object = pbmc_small, node = 4) #' head(x = all.markers) #' } #' FindAllMarkers <- function( object, assay = NULL, features = NULL, group.by = NULL, logfc.threshold = 0.1, test.use = 'wilcox', slot = 'data', min.pct = 0.01, min.diff.pct = -Inf, node = NULL, verbose = TRUE, only.pos = FALSE, max.cells.per.ident = Inf, random.seed = 1, latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, mean.fxn = NULL, fc.name = NULL, base = 2, return.thresh = 1e-2, densify = FALSE, ... ) { MapVals <- function(vec, from, to) { vec2 <- setNames(object = to, nm = from)[as.character(x = vec)] vec2[is.na(x = vec2)] <- vec[is.na(x = vec2)] return(unname(obj = vec2)) } if ((test.use == "roc") && (return.thresh == 1e-2)) { return.thresh <- 0.7 } if (is.null(x = node)) { if (!is.null(x = group.by) && !identical(x = group.by, y = "ident")) { if (length(x = group.by) == 1 && ! group.by %in% colnames(x = object@meta.data)) { stop("'", group.by, "' not found in object metadata") } Idents(object = object) <- group.by } idents.all <- sort(x = unique(x = Idents(object = object))) } else { if (!PackageCheck('ape', error = FALSE)) { stop(cluster.ape, call. = FALSE) } if (!is.null(group.by)) { warning( paste0( "The `group.by` parameter for `FindAllMarkers` ", "is ignored when `node` is set." ) ) } tree <- Tool(object = object, slot = 'BuildClusterTree') if (is.null(x = tree)) { stop("Please run 'BuildClusterTree' before finding markers on nodes") } descendants <- DFT(tree = tree, node = node, include.children = TRUE) all.children <- sort(x = tree$edge[, 2][!tree$edge[, 2] %in% tree$edge[, 1]]) descendants <- MapVals( vec = descendants, from = all.children, to = tree$tip.label ) drop.children <- setdiff(x = tree$tip.label, y = descendants) keep.children <- setdiff(x = tree$tip.label, y = drop.children) orig.nodes <- c( node, as.numeric(x = setdiff(x = descendants, y = keep.children)) ) tree <- ape::drop.tip(phy = tree, tip = drop.children) new.nodes <- unique(x = tree$edge[, 1, drop = TRUE]) idents.all <- (tree$Nnode + 2):max(tree$edge) } genes.de <- list() messages <- list() for (i in 1:length(x = idents.all)) { if (verbose) { message("Calculating cluster ", idents.all[i]) } genes.de[[i]] <- tryCatch( expr = { FindMarkers( object = object, assay = assay, ident.1 = if (is.null(x = node)) { idents.all[i] } else { tree }, ident.2 = if (is.null(x = node)) { NULL } else { idents.all[i] }, features = features, logfc.threshold = logfc.threshold, test.use = test.use, slot = slot, min.pct = min.pct, min.diff.pct = min.diff.pct, verbose = verbose, only.pos = only.pos, max.cells.per.ident = max.cells.per.ident, random.seed = random.seed, latent.vars = latent.vars, min.cells.feature = min.cells.feature, min.cells.group = min.cells.group, mean.fxn = mean.fxn, fc.name = fc.name, base = base, densify = densify, ... ) }, error = function(cond) { return(cond$message) } ) if (is.character(x = genes.de[[i]])) { messages[[i]] <- genes.de[[i]] genes.de[[i]] <- NULL } } gde.all <- data.frame() for (i in 1:length(x = idents.all)) { if (is.null(x = unlist(x = genes.de[i]))) { next } gde <- genes.de[[i]] if (nrow(x = gde) > 0) { if (test.use == "roc") { gde <- subset( x = gde, subset = (myAUC > return.thresh | myAUC < (1 - return.thresh)) ) } else if (is.null(x = node) || test.use %in% c('bimod', 't')) { gde <- gde[order(gde$p_val, -abs(gde$pct.1-gde$pct.2)), ] gde <- subset(x = gde, subset = p_val < return.thresh) } if (nrow(x = gde) > 0) { gde$cluster <- idents.all[i] gde$gene <- rownames(x = gde) } if (nrow(x = gde) > 0) { gde.all <- rbind(gde.all, gde) } } } if ((only.pos) && nrow(x = gde.all) > 0) { return(subset(x = gde.all, subset = gde.all[, 2] > 0)) } rownames(x = gde.all) <- make.unique(names = as.character(x = gde.all$gene)) if (nrow(x = gde.all) == 0) { warning("No DE genes identified", call. = FALSE, immediate. = TRUE) } if (length(x = messages) > 0) { warning("The following tests were not performed: ", call. = FALSE, immediate. = TRUE) for (i in 1:length(x = messages)) { if (!is.null(x = messages[[i]])) { warning("When testing ", idents.all[i], " versus all:\n\t", messages[[i]], call. = FALSE, immediate. = TRUE) } } } if (!is.null(x = node)) { gde.all$cluster <- MapVals( vec = gde.all$cluster, from = new.nodes, to = orig.nodes ) } return(gde.all) } #' Finds markers that are conserved between the groups #' #' @inheritParams FindMarkers #' @param ident.1 Identity class to define markers for #' @param ident.2 A second identity class for comparison. If NULL (default) - #' use all other cells for comparison. #' @param grouping.var grouping variable #' @param assay of assay to fetch data for (default is RNA) #' @param meta.method method for combining p-values. Should be a function from #' the metap package (NOTE: pass the function, not a string) #' @param \dots parameters to pass to FindMarkers #' #' @return data.frame containing a ranked list of putative conserved markers, and #' associated statistics (p-values within each group and a combined p-value #' (such as Fishers combined p-value or others from the metap package), #' percentage of cells expressing the marker, average differences). Name of group is appended to each #' associated output column (e.g. CTRL_p_val). If only one group is tested in the grouping.var, max #' and combined p-values are not returned. #' #' @export #' @concept differential_expression #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small #' # Create a simulated grouping variable #' pbmc_small[['groups']] <- sample(x = c('g1', 'g2'), size = ncol(x = pbmc_small), replace = TRUE) #' FindConservedMarkers(pbmc_small, ident.1 = 0, ident.2 = 1, grouping.var = "groups") #' } #' FindConservedMarkers <- function( object, ident.1, ident.2 = NULL, grouping.var, assay = 'RNA', slot = 'data', min.cells.group = 3, meta.method = metap::minimump, verbose = TRUE, ... ) { metap.installed <- PackageCheck("metap", error = FALSE) if (!metap.installed[1]) { stop( "Please install the metap package to use FindConservedMarkers.", "\nThis can be accomplished with the following commands: ", "\n----------------------------------------", "\ninstall.packages('BiocManager')", "\nBiocManager::install('multtest')", "\ninstall.packages('metap')", "\n----------------------------------------", call. = FALSE ) } if (!is.function(x = meta.method)) { stop("meta.method should be a function from the metap package. Please see https://cran.r-project.org/web/packages/metap/metap.pdf for a detailed description of the available functions.") } object.var <- FetchData(object = object, vars = grouping.var) object <- SetIdent( object = object, cells = colnames(x = object), value = paste(Idents(object = object), object.var[, 1], sep = "_") ) levels.split <- names(x = sort(x = table(object.var[, 1]))) num.groups <- length(levels.split) cells <- list() for (i in 1:num.groups) { cells[[i]] <- rownames( x = object.var[object.var[, 1] == levels.split[i], , drop = FALSE] ) } marker.test <- list() # do marker tests ident.2.save <- ident.2 for (i in 1:num.groups) { level.use <- levels.split[i] ident.use.1 <- paste(ident.1, level.use, sep = "_") ident.use.1.exists <- ident.use.1 %in% Idents(object = object) if (!all(ident.use.1.exists)) { bad.ids <- ident.1[!ident.use.1.exists] warning( "Identity: ", paste(bad.ids, collapse = ", "), " not present in group ", level.use, ". Skipping ", level.use, call. = FALSE, immediate. = TRUE ) next } ident.2 <- ident.2.save cells.1 <- WhichCells(object = object, idents = ident.use.1) if (length(cells.1) < min.cells.group) { warning( level.use, " has fewer than ", min.cells.group, " cells in Identity: ", paste(ident.1, collapse = ", "), ". Skipping ", level.use, call. = FALSE, immediate. = TRUE ) next } if (is.null(x = ident.2)) { cells.2 <- setdiff(x = cells[[i]], y = cells.1) ident.use.2 <- names(x = which(x = table(Idents(object = object)[cells.2]) > 0)) ident.2 <- gsub(pattern = paste0("_", level.use), replacement = "", x = ident.use.2) if (length(x = ident.use.2) == 0) { stop(paste("Only one identity class present:", ident.1)) } } else { ident.use.2 <- paste(ident.2, level.use, sep = "_") } if (verbose) { message( "Testing group ", level.use, ": (", paste(ident.1, collapse = ", "), ") vs (", paste(ident.2, collapse = ", "), ")" ) } ident.use.2.exists <- ident.use.2 %in% Idents(object = object) if (!all(ident.use.2.exists)) { bad.ids <- ident.2[!ident.use.2.exists] warning( "Identity: ", paste(bad.ids, collapse = ", "), " not present in group ", level.use, ". Skipping ", level.use, call. = FALSE, immediate. = TRUE ) next } marker.test[[i]] <- FindMarkers( object = object, assay = assay, slot = slot, ident.1 = ident.use.1, ident.2 = ident.use.2, verbose = verbose, ... ) names(x = marker.test)[i] <- levels.split[i] } marker.test <- Filter(f = Negate(f = is.null), x = marker.test) genes.conserved <- Reduce( f = intersect, x = lapply( X = marker.test, FUN = function(x) { return(rownames(x = x)) } ) ) markers.conserved <- list() for (i in 1:length(x = marker.test)) { markers.conserved[[i]] <- marker.test[[i]][genes.conserved, ] colnames(x = markers.conserved[[i]]) <- paste( names(x = marker.test)[i], colnames(x = markers.conserved[[i]]), sep = "_" ) } markers.combined <- Reduce(cbind, markers.conserved) pval.codes <- colnames(x = markers.combined)[grepl(pattern = "*_p_val$", x = colnames(x = markers.combined))] if (length(x = pval.codes) > 1) { markers.combined$max_pval <- apply( X = markers.combined[, pval.codes, drop = FALSE], MARGIN = 1, FUN = max ) combined.pval <- data.frame(cp = apply( X = markers.combined[, pval.codes, drop = FALSE], MARGIN = 1, FUN = function(x) { return(meta.method(x)$p) } )) meta.method.name <- as.character(x = formals()$meta.method) if (length(x = meta.method.name) == 3) { meta.method.name <- meta.method.name[3] } colnames(x = combined.pval) <- paste0(meta.method.name, "_p_val") markers.combined <- cbind(markers.combined, combined.pval) markers.combined <- markers.combined[order(markers.combined[, paste0(meta.method.name, "_p_val")]), ] } else { warning("Only a single group was tested", call. = FALSE, immediate. = TRUE) } return(markers.combined) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param slot Slot to pull data from; note that if \code{test.use} is #' "negbinom", "poisson", or "DESeq2", \code{slot} will be set to "counts" #' @param cells.1 Vector of cell names belonging to group 1 #' @param cells.2 Vector of cell names belonging to group 2 #' @param features Genes to test. Default is to use all genes #' @param slot Slot to pull data from; note that if \code{test.use} is #' "negbinom", "poisson", or "DESeq2", \code{slot} will be set to "counts" #' @param logfc.threshold Limit testing to genes which show, on average, at least #' X-fold difference (log-scale) between the two groups of cells. Default is 0.1 #' Increasing logfc.threshold speeds up the function, but can miss weaker signals. #' If the \code{slot} parameter is "scale.data" no filtering is performed. #' @param test.use Denotes which test to use. Available options are: #' \itemize{ #' \item{"wilcox"} : Identifies differentially expressed genes between two #' groups of cells using a Wilcoxon Rank Sum test (default); will use a fast #' implementation by Presto if installed #' \item{"wilcox_limma"} : Identifies differentially expressed genes between two #' groups of cells using the limma implementation of the Wilcoxon Rank Sum test; #' set this option to reproduce results from Seurat v4 #' \item{"bimod"} : Likelihood-ratio test for single cell gene expression, #' (McDavid et al., Bioinformatics, 2013) #' \item{"roc"} : Identifies 'markers' of gene expression using ROC analysis. #' For each gene, evaluates (using AUC) a classifier built on that gene alone, #' to classify between two groups of cells. An AUC value of 1 means that #' expression values for this gene alone can perfectly classify the two #' groupings (i.e. Each of the cells in cells.1 exhibit a higher level than #' each of the cells in cells.2). An AUC value of 0 also means there is perfect #' classification, but in the other direction. A value of 0.5 implies that #' the gene has no predictive power to classify the two groups. Returns a #' 'predictive power' (abs(AUC-0.5) * 2) ranked matrix of putative differentially #' expressed genes. #' \item{"t"} : Identify differentially expressed genes between two groups of #' cells using the Student's t-test. #' \item{"negbinom"} : Identifies differentially expressed genes between two #' groups of cells using a negative binomial generalized linear model. #' Use only for UMI-based datasets #' \item{"poisson"} : Identifies differentially expressed genes between two #' groups of cells using a poisson generalized linear model. #' Use only for UMI-based datasets #' \item{"LR"} : Uses a logistic regression framework to determine differentially #' expressed genes. Constructs a logistic regression model predicting group #' membership based on each feature individually and compares this to a null #' model with a likelihood ratio test. #' \item{"MAST"} : Identifies differentially expressed genes between two groups #' of cells using a hurdle model tailored to scRNA-seq data. Utilizes the MAST #' package to run the DE testing. #' \item{"DESeq2"} : Identifies differentially expressed genes between two groups #' of cells based on a model using DESeq2 which uses a negative binomial #' distribution (Love et al, Genome Biology, 2014).This test does not support #' pre-filtering of genes based on average difference (or percent detection rate) #' between cell groups. However, genes may be pre-filtered based on their #' minimum detection rate (min.pct) across both cell groups. To use this method, #' please install DESeq2, using the instructions at #' https://bioconductor.org/packages/release/bioc/html/DESeq2.html #' } #' @param min.pct only test genes that are detected in a minimum fraction of #' min.pct cells in either of the two populations. Meant to speed up the function #' by not testing genes that are very infrequently expressed. Default is 0.01 #' @param min.diff.pct only test genes that show a minimum difference in the #' fraction of detection between the two groups. Set to -Inf by default #' @param verbose Print a progress bar once expression testing begins #' @param only.pos Only return positive markers (FALSE by default) #' @param max.cells.per.ident Down sample each identity class to a max number. #' Default is no downsampling. Not activated by default (set to Inf) #' @param random.seed Random seed for downsampling #' @param latent.vars Variables to test, used only when \code{test.use} is one of #' 'LR', 'negbinom', 'poisson', or 'MAST' #' @param min.cells.feature Minimum number of cells expressing the feature in at least one #' of the two groups, currently only used for poisson and negative binomial tests #' @param min.cells.group Minimum number of cells in one of the groups #' @param fc.results data.frame from FoldChange #' @param densify Convert the sparse matrix to a dense form before running the #' DE test. This can provide speedups but might require higher memory; default is FALSE #' #' #' @importFrom Matrix rowMeans #' @importFrom stats p.adjust #' #' @rdname FindMarkers #' @concept differential_expression #' @export #' @method FindMarkers default #' FindMarkers.default <- function( object, slot = "data", cells.1 = NULL, cells.2 = NULL, features = NULL, logfc.threshold = 0.1, test.use = "wilcox", min.pct = 0.01, min.diff.pct = -Inf, verbose = TRUE, only.pos = FALSE, max.cells.per.ident = Inf, random.seed = 1, latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, fc.results = NULL, densify = FALSE, ... ) { ValidateCellGroups( object = object, cells.1 = cells.1, cells.2 = cells.2, min.cells.group = min.cells.group ) features <- features %||% rownames(x = object) # reset parameters so no feature filtering is performed if (test.use %in% DEmethods_noprefilter()) { features <- rownames(x = object) min.diff.pct <- -Inf logfc.threshold <- 0 } # feature selection (based on percentages) alpha.min <- pmax(fc.results$pct.1, fc.results$pct.2) names(x = alpha.min) <- rownames(x = fc.results) features <- names(x = which(x = alpha.min >= min.pct)) if (length(x = features) == 0) { warning("No features pass min.pct threshold; returning empty data.frame") return(fc.results[features, ]) } alpha.diff <- alpha.min - pmin(fc.results$pct.1, fc.results$pct.2) features <- names( x = which(x = alpha.min >= min.pct & alpha.diff >= min.diff.pct) ) if (length(x = features) == 0) { warning("No features pass min.diff.pct threshold; returning empty data.frame") return(fc.results[features, ]) } # feature selection (based on logFC) if (slot != "scale.data") { total.diff <- fc.results[, 1] #first column is logFC names(total.diff) <- rownames(fc.results) features.diff <- if (only.pos) { names(x = which(x = total.diff >= logfc.threshold)) } else { names(x = which(x = abs(x = total.diff) >= logfc.threshold)) } features <- intersect(x = features, y = features.diff) if (length(x = features) == 0) { warning("No features pass logfc.threshold threshold; returning empty data.frame") return(fc.results[features, ]) } } # subsample cell groups if they are too large if (max.cells.per.ident < Inf) { set.seed(seed = random.seed) if (length(x = cells.1) > max.cells.per.ident) { cells.1 <- sample(x = cells.1, size = max.cells.per.ident) } if (length(x = cells.2) > max.cells.per.ident) { cells.2 <- sample(x = cells.2, size = max.cells.per.ident) } if (!is.null(x = latent.vars)) { latent.vars <- latent.vars[c(cells.1, cells.2), , drop = FALSE] } } if (inherits(x = object, what = "IterableMatrix")){ if(test.use != "wilcox"){ stop("Differential expression with BPCells currently only supports the 'wilcox' method.", " Please rerun with test.use = 'wilcox'") } data.use <- object[features, c(cells.1, cells.2), drop = FALSE] groups <- c(rep("foreground", length(cells.1)), rep("background", length(cells.2))) de.results <- suppressMessages( BPCells::marker_features(data.use, group = groups, method = "wilcoxon") ) de.results <- subset(de.results, de.results$foreground == "foreground") de.results <- data.frame(feature = de.results$feature, p_val = de.results$p_val_raw) rownames(de.results) <- de.results$feature de.results$feature <- NULL } else { de.results <- PerformDE( object = object, cells.1 = cells.1, cells.2 = cells.2, features = features, test.use = test.use, verbose = verbose, min.cells.feature = min.cells.feature, latent.vars = latent.vars, densify = densify, ... ) } de.results <- cbind(de.results, fc.results[rownames(x = de.results), , drop = FALSE]) if (only.pos) { de.results <- de.results[de.results[, 2] > 0, , drop = FALSE] } if (test.use %in% DEmethods_nocorrect()) { de.results <- de.results[order(-de.results$power, -de.results[, 1]), ] } else { de.results <- de.results[order(de.results$p_val, -abs(de.results$pct.1-de.results$pct.2)), ] de.results$p_val_adj = p.adjust( p = de.results$p_val, method = "bonferroni", n = nrow(x = object) ) } return(de.results) } #' @param fc.slot Slot used to calculate fold-change - will also affect the #' default for \code{mean.fxn}, see below for more details. #' @param pseudocount.use Pseudocount to add to averaged expression values when #' calculating logFC. 1 by default. #' @param norm.method Normalization method for fold change calculation when #' \code{slot} is \dQuote{\code{data}} #' @param mean.fxn Function to use for fold change or average difference calculation. #' The default depends on the the value of \code{fc.slot}: #' \itemize{ #' \item{"counts"} : difference in the log of the mean counts, with pseudocount. #' \item{"data"} : difference in the log of the average exponentiated data, with pseudocount. #' This adjusts for differences in sequencing depth between cells, and assumes that "data" #' has been log-normalized. #' \item{"scale.data"} : difference in the means of scale.data. #' } #' @param fc.name Name of the fold change, average difference, or custom function column #' in the output data.frame. If NULL, the fold change column will be named #' according to the logarithm base (eg, "avg_log2FC"), or if using the scale.data #' slot "avg_diff". #' @param base The base with respect to which logarithms are computed. #' #' @rdname FindMarkers #' @concept differential_expression #' @export #' @method FindMarkers Assay #' FindMarkers.Assay <- function( object, slot = "data", cells.1 = NULL, cells.2 = NULL, features = NULL, test.use = "wilcox", fc.slot = "data", pseudocount.use = 1, norm.method = NULL, mean.fxn = NULL, fc.name = NULL, base = 2, ... ) { data.slot <- ifelse( test = test.use %in% DEmethods_counts(), yes = "counts", no = slot ) if (length(x = Layers(object = object, search = slot)) > 1) { stop(slot, " layers are not joined. Please run JoinLayers") } data.use <- GetAssayData(object = object, slot = data.slot) fc.results <- FoldChange( object = object, slot = fc.slot, cells.1 = cells.1, cells.2 = cells.2, features = features, pseudocount.use = pseudocount.use, mean.fxn = mean.fxn, fc.name = fc.name, base = base, norm.method = norm.method ) de.results <- FindMarkers( object = data.use, cells.1 = cells.1, cells.2 = cells.2, features = features, test.use = test.use, fc.results = fc.results, ... ) return(de.results) } #' @method FindMarkers StdAssay #' @export #' FindMarkers.StdAssay <- FindMarkers.Assay #' @param recorrect_umi Recalculate corrected UMI counts using minimum of the #' median UMIs when performing DE using multiple SCT objects; default is TRUE #' #' @rdname FindMarkers #' @concept differential_expression #' @export #' @method FindMarkers SCTAssay #' FindMarkers.SCTAssay <- function( object, cells.1 = NULL, cells.2 = NULL, features = NULL, test.use = "wilcox", pseudocount.use = 1, slot = "data", fc.slot = "data", mean.fxn = NULL, fc.name = NULL, base = 2, recorrect_umi = TRUE, ... ) { data.slot <- ifelse( test = test.use %in% DEmethods_counts(), yes = "counts", no = slot ) if (test.use %in% DEmethods_counts()){ # set slot to counts if (slot !="counts") { message(paste0("Setting slot to counts for ", test.use, " (counts based test: ")) slot <- "counts" } } if (recorrect_umi && length(x = levels(x = object)) > 1) { cell_attributes <- SCTResults(object = object, slot = "cell.attributes") observed_median_umis <- lapply( X = cell_attributes, FUN = function(x) median(x[, "umi"]) ) model.list <- slot(object = object, "SCTModel.list") median_umi.status <- lapply(X = model.list, FUN = function(x) { return(tryCatch( expr = slot(object = x, name = 'median_umi'), error = function(...) {return(NULL)}) )}) if (any(is.null(unlist(median_umi.status)))){ stop("SCT assay does not contain median UMI information.", "Run `PrepSCTFindMarkers()` before running `FindMarkers()` or invoke `FindMarkers(recorrect_umi=FALSE)`.") } model_median_umis <- SCTResults(object = object, slot = "median_umi") min_median_umi <- min(unlist(x = observed_median_umis)) if (any(unlist(model_median_umis) != min_median_umi)){ stop("Object contains multiple models with unequal library sizes. Run `PrepSCTFindMarkers()` before running `FindMarkers()`.") } } data.use <- GetAssayData(object = object, slot = data.slot) # Default assumes the input is log1p(corrected counts) default.mean.fxn <- function(x) { return(log(x = (rowSums(x = expm1(x = x)) + pseudocount.use)/NCOL(x), base = base)) } mean.fxn <- mean.fxn %||% switch( EXPR = fc.slot, "counts" = function(x) { return(log(x = (rowSums(x = x) + pseudocount.use)/NCOL(x), base = base)) }, "scale.data" = rowMeans, default.mean.fxn ) fc.results <- FoldChange( object = object, slot = fc.slot, cells.1 = cells.1, cells.2 = cells.2, features = features, pseudocount.use = pseudocount.use, mean.fxn = mean.fxn, fc.name = fc.name, base = base ) de.results <- FindMarkers( object = data.use, cells.1 = cells.1, cells.2 = cells.2, features = features, test.use = test.use, fc.results = fc.results, ... ) return(de.results) } #' @importFrom Matrix rowMeans #' @rdname FindMarkers #' @concept differential_expression #' @export #' @method FindMarkers DimReduc #' FindMarkers.DimReduc <- function( object, cells.1 = NULL, cells.2 = NULL, features = NULL, logfc.threshold = 0.1, test.use = "wilcox", min.pct = 0.01, min.diff.pct = -Inf, verbose = TRUE, only.pos = FALSE, max.cells.per.ident = Inf, random.seed = 1, latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, densify = FALSE, mean.fxn = rowMeans, fc.name = NULL, ... ) { if (test.use %in% DEmethods_counts()) { stop("The following tests cannot be used for differential expression on a reduction as they assume a count model: ", paste(DEmethods_counts(), collapse=", ")) } data <- t(x = Embeddings(object = object)) ValidateCellGroups( object = data, cells.1 = cells.1, cells.2 = cells.2, min.cells.group = min.cells.group ) features <- features %||% rownames(x = data) # reset parameters so no feature filtering is performed if (test.use %in% DEmethods_noprefilter()) { features <- rownames(x = data) min.diff.pct <- -Inf logfc.threshold <- 0 } fc.results <- FoldChange( object = object, cells.1 = cells.1, cells.2 = cells.2, features = features, mean.fxn = mean.fxn, fc.name = fc.name ) # subsample cell groups if they are too large if (max.cells.per.ident < Inf) { set.seed(seed = random.seed) if (length(x = cells.1) > max.cells.per.ident) { cells.1 <- sample(x = cells.1, size = max.cells.per.ident) } if (length(x = cells.2) > max.cells.per.ident) { cells.2 <- sample(x = cells.2, size = max.cells.per.ident) } if (!is.null(x = latent.vars)) { latent.vars <- latent.vars[c(cells.1, cells.2), , drop = FALSE] } } de.results <- PerformDE( object = data, cells.1 = cells.1, cells.2 = cells.2, features = features, test.use = test.use, verbose = verbose, min.cells.feature = min.cells.feature, latent.vars = latent.vars, densify = densify, ... ) de.results <- cbind(de.results, fc.results) if (only.pos) { de.results <- de.results[de.results$avg_diff > 0, , drop = FALSE] } if (test.use %in% DEmethods_nocorrect()) { de.results <- de.results[order(-de.results$power, -de.results$avg_diff), ] } else { de.results <- de.results[order(de.results$p_val, -de.results$avg_diff), ] de.results$p_val_adj = p.adjust( p = de.results$p_val, method = "bonferroni", n = ncol(x = object) ) } return(de.results) } #' @param ident.1 Identity class to define markers for; pass an object of class #' \code{phylo} or 'clustertree' to find markers for a node in a cluster tree; #' passing 'clustertree' requires \code{\link{BuildClusterTree}} to have been run #' @param ident.2 A second identity class for comparison; if \code{NULL}, #' use all other cells for comparison; if an object of class \code{phylo} or #' 'clustertree' is passed to \code{ident.1}, must pass a node to find markers for #' @param group.by Regroup cells into a different identity class prior to #' performing differential expression (see example); \code{"ident"} to use Idents #' @param subset.ident Subset a particular identity class prior to regrouping. #' Only relevant if group.by is set (see example) #' @param assay Assay to use in differential expression testing #' @param reduction Reduction to use in differential expression testing - will #' test for DE on cell embeddings #' #' @rdname FindMarkers #' @concept differential_expression #' @export #' @method FindMarkers Seurat #' FindMarkers.Seurat <- function( object, ident.1 = NULL, ident.2 = NULL, latent.vars = NULL, group.by = NULL, subset.ident = NULL, assay = NULL, reduction = NULL, ... ) { if (!is.null(x = group.by) && !identical(x = group.by, y = "ident")) { if (!is.null(x = subset.ident)) { object <- subset(x = object, idents = subset.ident) } if (length(x = group.by) == 1 && ! group.by %in% colnames(x = object@meta.data)) { stop("'", group.by, "' not found in object metadata") } Idents(object = object) <- group.by } if (!is.null(x = assay) && !is.null(x = reduction)) { stop("Please only specify either assay or reduction.") } if (length(x = ident.1) == 0) { stop("At least 1 ident must be specified in `ident.1`") } # select which data to use if (is.null(x = reduction)) { assay <- assay %||% DefaultAssay(object = object) data.use <- object[[assay]] cellnames.use <- colnames(x = data.use) } else { data.use <- object[[reduction]] cellnames.use <- rownames(x = data.use) } cells <- IdentsToCells( object = object, ident.1 = ident.1, ident.2 = ident.2, cellnames.use = cellnames.use ) cells <- sapply( X = cells, FUN = intersect, y = cellnames.use, simplify = FALSE, USE.NAMES = TRUE ) if (!all(vapply(X = cells, FUN = length, FUN.VALUE = integer(length = 1L)))) { abort( message = "Cells in one or both identity groups are not present in the data requested" ) } # fetch latent.vars if (!is.null(x = latent.vars)) { latent.vars <- FetchData( object = object, vars = latent.vars, cells = c(cells$cells.1, cells$cells.2) ) } # check normalization method norm.command <- paste0("NormalizeData.", assay) norm.method <- if (norm.command %in% Command(object = object) && is.null(x = reduction)) { Command( object = object, command = norm.command, value = "normalization.method" ) } else if (length(x = intersect(x = c("FindIntegrationAnchors", "FindTransferAnchors"), y = Command(object = object)))) { command <- intersect(x = c("FindIntegrationAnchors", "FindTransferAnchors"), y = Command(object = object))[1] Command( object = object, command = command, value = "normalization.method" ) } else { NULL } de.results <- FindMarkers( object = data.use, latent.vars = latent.vars, cells.1 = cells$cells.1, cells.2 = cells$cells.2, norm.method = norm.method, ... ) return(de.results) } #' @param cells.1 Vector of cell names belonging to group 1 #' @param cells.2 Vector of cell names belonging to group 2 #' @param features Features to calculate fold change for. #' If NULL, use all features #' @importFrom Matrix rowSums #' @rdname FoldChange #' @concept differential_expression #' @export #' @method FoldChange default FoldChange.default <- function( object, cells.1, cells.2, mean.fxn, fc.name, features = NULL, ... ) { features <- features %||% rownames(x = object) # Calculate percent expressed thresh.min <- 0 pct.1 <- round( x = rowSums(x = object[features, cells.1, drop = FALSE] > thresh.min) / length(x = cells.1), digits = 3 ) pct.2 <- round( x = rowSums(x = object[features, cells.2, drop = FALSE] > thresh.min) / length(x = cells.2), digits = 3 ) # Calculate fold change data.1 <- mean.fxn(object[features, cells.1, drop = FALSE]) data.2 <- mean.fxn(object[features, cells.2, drop = FALSE]) fc <- (data.1 - data.2) fc.results <- as.data.frame(x = cbind(fc, pct.1, pct.2)) colnames(fc.results) <- c(fc.name, "pct.1", "pct.2") return(fc.results) } #' @param norm.method Normalization method for mean function selection #' when \code{slot} is \dQuote{\code{data}} #' #' @importFrom Matrix rowMeans #' @importFrom Matrix rowSums #' @rdname FoldChange #' @concept differential_expression #' @export #' @method FoldChange Assay FoldChange.Assay <- function( object, cells.1, cells.2, features = NULL, slot = "data", pseudocount.use = 1, fc.name = NULL, mean.fxn = NULL, base = 2, norm.method = NULL, ... ) { data <- GetAssayData(object = object, slot = slot) # By default run as if LogNormalize is done log1pdata.mean.fxn <- function(x) { # return(log(x = rowMeans(x = expm1(x = x)) + pseudocount.use, base = base)) return(log(x = (rowSums(x = expm1(x = x)) + pseudocount.use)/NCOL(x), base = base)) } scaledata.mean.fxn <- rowMeans counts.mean.fxn <- function(x) { # return(log(x = rowMeans(x = x) + pseudocount.use, base = base)) return(log(x = (rowSums(x = x) + pseudocount.use)/NCOL(x), base = base)) } if (!is.null(x = norm.method)) { # For anything apart from log normalization set to rowMeans if (norm.method!="LogNormalize") { new.mean.fxn <- counts.mean.fxn } else { new.mean.fxn <- counts.mean.fxn if (slot == "data") { new.mean.fxn <- log1pdata.mean.fxn } else if (slot == "scale.data") { new.mean.fxn <- scaledata.mean.fxn } } } else { # If no normalization method is passed use slots to decide mean function new.mean.fxn <- switch( EXPR = slot, 'data' = log1pdata.mean.fxn, 'scale.data' = scaledata.mean.fxn, 'counts' = counts.mean.fxn, log1pdata.mean.fxn ) } mean.fxn <- mean.fxn %||% new.mean.fxn # Omit the decimal value of e from the column name if base == exp(1) base.text <- ifelse( test = base == exp(1), yes = "", no = base ) fc.name <- fc.name %||% ifelse( test = slot == "scale.data", yes = "avg_diff", no = paste0("avg_log", base.text, "FC") ) FoldChange( object = data, cells.1 = cells.1, cells.2 = cells.2, features = features, mean.fxn = mean.fxn, fc.name = fc.name ) } #' @method FoldChange StdAssay #' @export #' FoldChange.StdAssay <- FoldChange.Assay #' @importFrom Matrix rowMeans #' @importFrom Matrix rowSums #' @rdname FoldChange #' @concept differential_expression #' @export #' @method FoldChange SCTAssay FoldChange.SCTAssay <- function( object, cells.1, cells.2, features = NULL, slot = "data", pseudocount.use = 1, fc.name = NULL, mean.fxn = NULL, base = 2, ... ) { pseudocount.use <- pseudocount.use %||% 1 data <- GetAssayData(object = object, slot = slot) default.mean.fxn <- function(x) { # return(log(x = rowMeans(x = expm1(x = x)) + pseudocount.use, base = base)) return(log(x = (rowSums(x = expm1(x = x)) + pseudocount.use)/NCOL(x), base = base)) } mean.fxn <- mean.fxn %||% switch( EXPR = slot, 'data' = default.mean.fxn, 'scale.data' = rowMeans, 'counts' = function(x) { # return(log(x = rowMeans(x = x) + pseudocount.use, base = base)) return(log(x = (rowSums(x = x) + pseudocount.use)/NCOL(x), base = base)) }, default.mean.fxn ) # Omit the decimal value of e from the column name if base == exp(1) base.text <- ifelse( test = base == exp(1), yes = "", no = base ) fc.name <- fc.name %||% ifelse( test = slot == "scale.data", yes = "avg_diff", no = paste0("avg_log", base.text, "FC") ) FoldChange( object = data, cells.1 = cells.1, cells.2 = cells.2, features = features, mean.fxn = mean.fxn, fc.name = fc.name ) } #' @importFrom Matrix rowMeans #' @rdname FoldChange #' @concept differential_expression #' @export #' @method FoldChange DimReduc FoldChange.DimReduc <- function( object, cells.1, cells.2, features = NULL, slot = NULL, pseudocount.use = 1, fc.name = NULL, mean.fxn = NULL, ... ) { mean.fxn <- mean.fxn %||% rowMeans fc.name <- fc.name %||% "avg_diff" data <- t(x = Embeddings(object = object)) features <- features %||% rownames(x = data) # Calculate avg difference data.1 <- mean.fxn(data[features, cells.1, drop = FALSE]) data.2 <- mean.fxn(data[features, cells.2, drop = FALSE]) fc <- (data.1 - data.2) fc.results <- data.frame(fc) colnames(fc.results) <- fc.name return(fc.results) } #' @param ident.1 Identity class to calculate fold change for; pass an object of class #' \code{phylo} or 'clustertree' to calculate fold change for a node in a cluster tree; #' passing 'clustertree' requires \code{\link{BuildClusterTree}} to have been run #' @param ident.2 A second identity class for comparison; if \code{NULL}, #' use all other cells for comparison; if an object of class \code{phylo} or #' 'clustertree' is passed to \code{ident.1}, must pass a node to calculate fold change for #' @param reduction Reduction to use - will calculate average difference on cell embeddings #' @param group.by Regroup cells into a different identity class prior to #' calculating fold change (see example in \code{\link{FindMarkers}}) #' @param subset.ident Subset a particular identity class prior to regrouping. #' Only relevant if group.by is set (see example in \code{\link{FindMarkers}}) #' @param assay Assay to use in fold change calculation #' @param slot Slot to pull data from #' @param pseudocount.use Pseudocount to add to averaged expression values when #' calculating logFC. #' @param mean.fxn Function to use for fold change or average difference calculation #' @param base The base with respect to which logarithms are computed. #' @param fc.name Name of the fold change, average difference, or custom function column #' in the output data.frame #' #' @rdname FoldChange #' @concept differential_expression #' @export #' @method FoldChange Seurat FoldChange.Seurat <- function( object, ident.1 = NULL, ident.2 = NULL, group.by = NULL, subset.ident = NULL, assay = NULL, slot = 'data', reduction = NULL, features = NULL, pseudocount.use = 1, mean.fxn = NULL, base = 2, fc.name = NULL, ... ) { if (!is.null(x = group.by)) { if (!is.null(x = subset.ident)) { object <- subset(x = object, idents = subset.ident) } Idents(object = object) <- group.by } if (!is.null(x = assay) && !is.null(x = reduction)) { stop("Please only specify either assay or reduction.") } # select which data to use if (is.null(x = reduction)) { assay <- assay %||% DefaultAssay(object = object) data.use <- object[[assay]] cellnames.use <- colnames(x = data.use) } else { data.use <- object[[reduction]] cellnames.use <- rownames(data.use) } cells <- IdentsToCells( object = object, ident.1 = ident.1, ident.2 = ident.2, cellnames.use = cellnames.use ) # check normalization method norm.command <- paste0("NormalizeData.", assay) norm.method <- if (norm.command %in% Command(object = object) && is.null(x = reduction)) { Command( object = object, command = norm.command, value = "normalization.method" ) } else if (length(x = intersect(x = c("FindIntegrationAnchors", "FindTransferAnchors"), y = Command(object = object)))) { command <- intersect(x = c("FindIntegrationAnchors", "FindTransferAnchors"), y = Command(object = object))[1] Command( object = object, command = command, value = "normalization.method" ) } else { NULL } fc.results <- FoldChange( object = data.use, cells.1 = cells$cells.1, cells.2 = cells$cells.2, features = features, slot = slot, pseudocount.use = pseudocount.use, mean.fxn = mean.fxn, base = base, fc.name = fc.name, norm.method = norm.method ) return(fc.results) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # internal function to calculate AUC values #' @importFrom pbapply pblapply # AUCMarkerTest <- function(data1, data2, mygenes, print.bar = TRUE) { myAUC <- unlist(x = lapply( X = mygenes, FUN = function(x) { return(DifferentialAUC( x = as.numeric(x = data1[x, ]), y = as.numeric(x = data2[x, ]) )) } )) myAUC[is.na(x = myAUC)] <- 0 iterate.fxn <- ifelse(test = print.bar, yes = pblapply, no = lapply) avg_diff <- unlist(x = iterate.fxn( X = mygenes, FUN = function(x) { return( ExpMean( x = as.numeric(x = data1[x, ]) ) - ExpMean( x = as.numeric(x = data2[x, ]) ) ) } )) toRet <- data.frame(cbind(myAUC, avg_diff), row.names = mygenes) toRet <- toRet[rev(x = order(toRet$myAUC)), ] return(toRet) } #internal function to run mcdavid et al. DE test # #' @importFrom stats sd dnorm # bimodLikData <- function(x, xmin = 0) { x1 <- x[x <= xmin] x2 <- x[x > xmin] xal <- MinMax( data = length(x = x2) / length(x = x), min = 1e-5, max = (1 - 1e-5) ) likA <- length(x = x1) * log(x = 1 - xal) if (length(x = x2) < 2) { mysd <- 1 } else { mysd <- sd(x = x2) } likB <- length(x = x2) * log(x = xal) + sum(dnorm(x = x2, mean = mean(x = x2), sd = mysd, log = TRUE)) return(likA + likB) } # returns tests that do not support feature pre-filtering DEmethods_noprefilter <- function() { c("DESeq2") } # returns tests that support latent variables (latent.vars) DEmethods_latent <- function() { c('negbinom', 'poisson', 'MAST', "LR") } # returns tests that require CheckDots DEmethods_checkdots <- function() { c('wilcox', 'wilcox_limma', 'MAST', 'DESeq2') } # returns tests that do not use Bonferroni correction on the DE results DEmethods_nocorrect <- function() { c('roc') } # returns tests that require count data DEmethods_counts <- function() { c("negbinom", "poisson", "DESeq2") } # Differential expression using DESeq2 # # Identifies differentially expressed genes between two groups of cells using # DESeq2 # # @references Love MI, Huber W and Anders S (2014). "Moderated estimation of # fold change and dispersion for RNA-seq data with DESeq2." Genome Biology. # https://bioconductor.org/packages/release/bioc/html/DESeq2.html # @param data.use Data matrix to test # @param cells.1 Group 1 cells # @param cells.2 Group 2 cells # @param verbose Print a progress bar # @param ... Extra parameters to pass to DESeq2::results # @return Returns a p-value ranked matrix of putative differentially expressed # genes. # # @details # This test does not support pre-filtering of genes based on average difference # (or percent detection rate) between cell groups. However, genes may be # pre-filtered based on their minimum detection rate (min.pct) across both cell # groups. To use this method, please install DESeq2, using the instructions at # https://bioconductor.org/packages/release/bioc/html/DESeq2.html # # @export # # @examples # \dontrun{ # data("pbmc_small") # pbmc_small # DESeq2DETest(pbmc_small, cells.1 = WhichCells(object = pbmc_small, idents = 1), # cells.2 = WhichCells(object = pbmc_small, idents = 2)) # } # DESeq2DETest <- function( data.use, cells.1, cells.2, verbose = TRUE, ... ) { if (!PackageCheck('DESeq2', error = FALSE)) { stop("Please install DESeq2 - learn more at https://bioconductor.org/packages/release/bioc/html/DESeq2.html") } CheckDots(..., fxns = 'DESeq2::results') group.info <- data.frame(row.names = c(cells.1, cells.2)) group.info[cells.1, "group"] <- "Group1" group.info[cells.2, "group"] <- "Group2" group.info[, "group"] <- factor(x = group.info[, "group"]) group.info$wellKey <- rownames(x = group.info) dds1 <- DESeq2::DESeqDataSetFromMatrix( countData = data.use, colData = group.info, design = ~ group ) dds1 <- DESeq2::estimateSizeFactors(object = dds1) dds1 <- DESeq2::estimateDispersions(object = dds1, fitType = "local") dds1 <- DESeq2::nbinomWaldTest(object = dds1) res <- DESeq2::results( object = dds1, contrast = c("group", "Group1", "Group2"), alpha = 0.05, ... ) to.return <- data.frame(p_val = res$pvalue, row.names = rownames(res)) return(to.return) } # internal function to calculate AUC values #' @importFrom ROCR prediction performance #' DifferentialAUC <- function(x, y) { prediction.use <- prediction( predictions = c(x, y), labels = c(rep(x = 1, length(x = x)), rep(x = 0, length(x = y))), label.ordering = 0:1 ) perf.use <- performance(prediction.obj = prediction.use, measure = "auc") auc.use <- round(x = perf.use@y.values[[1]], digits = 3) return(auc.use) } #internal function to run mcdavid et al. DE test # #' @importFrom stats pchisq # DifferentialLRT <- function(x, y, xmin = 0) { lrtX <- bimodLikData(x = x) lrtY <- bimodLikData(x = y) lrtZ <- bimodLikData(x = c(x, y)) lrt_diff <- 2 * (lrtX + lrtY - lrtZ) return(pchisq(q = lrt_diff, df = 3, lower.tail = F)) } # Likelihood ratio test for zero-inflated data # # Identifies differentially expressed genes between two groups of cells using # the LRT model proposed in McDavid et al, Bioinformatics, 2013 # # @inheritParams FindMarkers # @param object Seurat object # @param cells.1 Group 1 cells # @param cells.2 Group 2 cells # @param assay.type Type of assay to fetch data for (default is RNA) # @return Returns a p-value ranked matrix of putative differentially expressed # genes. # #' @importFrom pbapply pbsapply #' @importFrom future.apply future_sapply #' @importFrom future nbrOfWorkers # # @export # @examples # data("pbmc_small") # pbmc_small # DiffExpTest(pbmc_small, cells.1 = WhichCells(object = pbmc_small, idents = 1), # cells.2 = WhichCells(object = pbmc_small, idents = 2)) # DiffExpTest <- function( data.use, cells.1, cells.2, verbose = TRUE ) { my.sapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pbsapply, no = future_sapply ) p_val <- unlist( x = my.sapply( X = 1:nrow(x = data.use), FUN = function(x) { return(DifferentialLRT( x = as.numeric(x = data.use[x, cells.1]), y = as.numeric(x = data.use[x, cells.2]) )) } ) ) to.return <- data.frame(p_val, row.names = rownames(x = data.use)) return(to.return) } # Differential expression testing using Student's t-test # # Identify differentially expressed genes between two groups of cells using # the Student's t-test # # @return Returns a p-value ranked matrix of putative differentially expressed # genes. # #' @importFrom stats t.test #' @importFrom pbapply pbsapply #' @importFrom future.apply future_sapply #' @importFrom future nbrOfWorkers # # @export # # @examples # data("pbmc_small") # pbmc_small # DiffTTest(pbmc_small, cells.1 = WhichCells(object = pbmc_small, idents = 1), # cells.2 = WhichCells(object = pbmc_small, idents = 2)) DiffTTest <- function( data.use, cells.1, cells.2, verbose = TRUE ) { my.sapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pbsapply, no = future_sapply ) p_val <- unlist( x = my.sapply( X = 1:nrow(data.use), FUN = function(x) { t.test(x = data.use[x, cells.1], y = data.use[x, cells.2])$p.value } ) ) to.return <- data.frame(p_val,row.names = rownames(x = data.use)) return(to.return) } # Tests for UMI-count based data # # Identifies differentially expressed genes between two groups of cells using # either a negative binomial or poisson generalized linear model # # @param data.use Data to test # @param cells.1 Group 1 cells # @param cells.2 Group 2 cells # @param min.cells Minimum number of cells threshold # @param latent.vars Latent variables to test # @param test.use parameterizes the glm # @param verbose Print progress bar # # @return Returns a p-value ranked matrix of putative differentially expressed # genes. # #' @importFrom MASS glm.nb #' @importFrom pbapply pbsapply #' @importFrom stats var as.formula #' @importFrom future.apply future_sapply #' @importFrom future nbrOfWorkers #' # @export # # @examples # data("pbmc_small") # pbmc_small # # Note, not recommended for particularly small datasets - expect warnings # NegBinomDETest(pbmc_small, cells.1 = WhichCells(object = pbmc_small, idents = 1), # cells.2 = WhichCells(object = pbmc_small, idents = 2)) # GLMDETest <- function( data.use, cells.1, cells.2, min.cells = 3, latent.vars = NULL, test.use = NULL, verbose = TRUE ) { group.info <- data.frame( group = rep( x = c('Group1', 'Group2'), times = c(length(x = cells.1), length(x = cells.2)) ) ) rownames(group.info) <- c(cells.1, cells.2) group.info[, "group"] <- factor(x = group.info[, "group"]) latent.vars <- if (is.null(x = latent.vars)) { group.info } else { cbind(x = group.info, latent.vars) } latent.var.names <- colnames(x = latent.vars) my.sapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pbsapply, no = future_sapply ) p_val <- unlist( x = my.sapply( X = 1:nrow(data.use), FUN = function(x) { latent.vars[, "GENE"] <- as.numeric(x = data.use[x, ]) # check that gene is expressed in specified number of cells in one group if (sum(latent.vars$GENE[latent.vars$group == "Group1"] > 0) < min.cells && sum(latent.vars$GENE[latent.vars$group == "Group2"] > 0) < min.cells) { warning(paste0( "Skipping gene --- ", x, ". Fewer than ", min.cells, " cells in both clusters." )) return(2) } # check that variance between groups is not 0 if (var(x = latent.vars$GENE) == 0) { warning(paste0( "Skipping gene -- ", x, ". No variance in expression between the two clusters." )) return(2) } fmla <- as.formula(object = paste( "GENE ~", paste(latent.var.names, collapse = "+") )) p.estimate <- 2 if (test.use == "negbinom") { try( expr = p.estimate <- summary( object = glm.nb(formula = fmla, data = latent.vars) )$coef[2, 4], silent = TRUE ) return(p.estimate) } else if (test.use == "poisson") { return(summary(object = glm( formula = fmla, data = latent.vars, family = "poisson" ))$coef[2,4]) } } ) ) features.keep <- rownames(data.use) if (length(x = which(x = p_val == 2)) > 0) { features.keep <- features.keep[-which(x = p_val == 2)] p_val <- p_val[!p_val == 2] } to.return <- data.frame(p_val, row.names = features.keep) return(to.return) } # Helper function for FindMarkers.Seurat and FoldChange.Seurat # Convert idents to cells # #' @importFrom methods is # IdentsToCells <- function( object, ident.1, ident.2, cellnames.use ) { # if (is.null(x = ident.1)) { stop("Please provide ident.1") } else if ((length(x = ident.1) == 1 && ident.1[1] == 'clustertree') || is(object = ident.1, class2 = 'phylo')) { if (is.null(x = ident.2)) { stop("Please pass a node to 'ident.2' to run FindMarkers on a tree") } tree <- if (is(object = ident.1, class2 = 'phylo')) { ident.1 } else { Tool(object = object, slot = 'BuildClusterTree') } if (is.null(x = tree)) { stop("Please run 'BuildClusterTree' or pass an object of class 'phylo' as 'ident.1'") } ident.1 <- tree$tip.label[GetLeftDescendants(tree = tree, node = ident.2)] ident.2 <- tree$tip.label[GetRightDescendants(tree = tree, node = ident.2)] } if (length(x = as.vector(x = ident.1)) > 1 && any(as.character(x = ident.1) %in% cellnames.use)) { bad.cells <- cellnames.use[which(x = !as.character(x = ident.1) %in% cellnames.use)] if (length(x = bad.cells) > 0) { stop(paste0("The following cell names provided to ident.1 are not present in the object: ", paste(bad.cells, collapse = ", "))) } } else { ident.1 <- WhichCells(object = object, idents = ident.1) } # if NULL for ident.2, use all other cells if (length(x = as.vector(x = ident.2)) > 1 && any(as.character(x = ident.2) %in% cellnames.use)) { bad.cells <- cellnames.use[which(!as.character(x = ident.2) %in% cellnames.use)] if (length(x = bad.cells) > 0) { stop(paste0("The following cell names provided to ident.2 are not present in the object: ", paste(bad.cells, collapse = ", "))) } } else { if (is.null(x = ident.2)) { ident.2 <- setdiff(x = cellnames.use, y = ident.1) } else { ident.2 <- WhichCells(object = object, idents = ident.2) } } return(list(cells.1 = ident.1, cells.2 = ident.2)) } # Perform differential expression testing using a logistic regression framework # # Constructs a logistic regression model predicting group membership based on a # given feature and compares this to a null model with a likelihood ratio test. # # @param data.use expression matrix # @param cells.1 Vector of cells in group 1 # @param cells2. Vector of cells in group 2 # @param latent.vars Latent variables to include in model # @param verbose Print messages # #' @importFrom lmtest lrtest #' @importFrom pbapply pbsapply #' @importFrom stats as.formula glm #' @importFrom future.apply future_sapply #' @importFrom future nbrOfWorkers # LRDETest <- function( data.use, cells.1, cells.2, latent.vars = NULL, verbose = TRUE ) { group.info <- data.frame(row.names = c(cells.1, cells.2)) group.info[cells.1, "group"] <- "Group1" group.info[cells.2, "group"] <- "Group2" group.info[, "group"] <- factor(x = group.info[, "group"]) data.use <- data.use[, rownames(group.info), drop = FALSE] latent.vars <- latent.vars[rownames(group.info), , drop = FALSE] my.sapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pbsapply, no = future_sapply ) p_val <- my.sapply( X = 1:nrow(x = data.use), FUN = function(x) { if (is.null(x = latent.vars)) { model.data <- cbind(GENE = data.use[x, ], group.info) fmla <- as.formula(object = "group ~ GENE") fmla2 <- as.formula(object = "group ~ 1") } else { model.data <- cbind(GENE = data.use[x, ], group.info, latent.vars) fmla <- as.formula(object = paste( "group ~ GENE +", paste(colnames(x = latent.vars), collapse = "+") )) fmla2 <- as.formula(object = paste( "group ~", paste(colnames(x = latent.vars), collapse = "+") )) } model1 <- glm(formula = fmla, data = model.data, family = "binomial") model2 <- glm(formula = fmla2, data = model.data, family = "binomial") lrtest <- lrtest(model1, model2) return(lrtest$Pr[2]) } ) to.return <- data.frame(p_val, row.names = rownames(data.use)) return(to.return) } # ROC-based marker discovery # # Identifies 'markers' of gene expression using ROC analysis. For each gene, # evaluates (using AUC) a classifier built on that gene alone, to classify # between two groups of cells. # # An AUC value of 1 means that expression values for this gene alone can # perfectly classify the two groupings (i.e. Each of the cells in cells.1 # exhibit a higher level than each of the cells in cells.2). An AUC value of 0 # also means there is perfect classification, but in the other direction. A # value of 0.5 implies that the gene has no predictive power to classify the # two groups. # # @return Returns a 'predictive power' (abs(AUC-0.5) * 2) ranked matrix of # putative differentially expressed genes. # # @export # # @examples # data("pbmc_small") # pbmc_small # MarkerTest(pbmc_small, cells.1 = WhichCells(object = pbmc_small, idents = 1), # cells.2 = WhichCells(object = pbmc_small, idents = 2)) # MarkerTest <- function( data.use, cells.1, cells.2, verbose = TRUE ) { to.return <- AUCMarkerTest( data1 = data.use[, cells.1, drop = FALSE], data2 = data.use[, cells.2, drop = FALSE], mygenes = rownames(x = data.use), print.bar = verbose ) to.return$power <- abs(x = to.return$myAUC - 0.5) * 2 return(to.return) } # Differential expression using MAST # # Identifies differentially expressed genes between two groups of cells using # a hurdle model tailored to scRNA-seq data. Utilizes the MAST package to run # the DE testing. # # @references Andrew McDavid, Greg Finak and Masanao Yajima (2017). MAST: Model-based # Analysis of Single Cell Transcriptomics. R package version 1.2.1. # https://github.com/RGLab/MAST/ # # @param data.use Data to test # @param cells.1 Group 1 cells # @param cells.2 Group 2 cells # @param latent.vars Confounding variables to adjust for in DE test # @param verbose print output # @param \dots Additional parameters to zero-inflated regression (zlm) function # in MAST # @details # To use this method, please install MAST, using instructions at https://github.com/RGLab/MAST/ # # @return Returns a p-value ranked matrix of putative differentially expressed # genes. # #' @importFrom stats relevel MASTDETest <- function( data.use, cells.1, cells.2, latent.vars = NULL, verbose = TRUE, ... ) { # Check for MAST if (!PackageCheck('MAST', error = FALSE)) { stop("Please install MAST - learn more at https://github.com/RGLab/MAST") } group.info <- data.frame(row.names = c(cells.1, cells.2)) latent.vars <- latent.vars %||% group.info group.info[cells.1, "group"] <- "Group1" group.info[cells.2, "group"] <- "Group2" group.info[, "group"] <- factor(x = group.info[, "group"]) latent.vars.names <- c("condition", colnames(x = latent.vars)) latent.vars <- cbind(latent.vars, group.info) latent.vars$wellKey <- rownames(x = latent.vars) fdat <- data.frame(rownames(x = data.use)) colnames(x = fdat)[1] <- "primerid" rownames(x = fdat) <- fdat[, 1] sca <- MAST::FromMatrix( exprsArray = as.matrix(x = data.use), check_sanity = FALSE, cData = latent.vars, fData = fdat ) cond <- factor(x = SummarizedExperiment::colData(sca)$group) cond <- relevel(x = cond, ref = "Group1") SummarizedExperiment::colData(sca)$condition <- cond fmla <- as.formula( object = paste0(" ~ ", paste(latent.vars.names, collapse = "+")) ) zlmCond <- MAST::zlm(formula = fmla, sca = sca, ...) summaryCond <- MAST::summary(object = zlmCond, doLRT = 'conditionGroup2') summaryDt <- summaryCond$datatable # fcHurdle <- merge( # summaryDt[contrast=='conditionGroup2' & component=='H', .(primerid, `Pr(>Chisq)`)], #hurdle P values # summaryDt[contrast=='conditionGroup2' & component=='logFC', .(primerid, coef, ci.hi, ci.lo)], by='primerid' # ) #logFC coefficients # fcHurdle[,fdr:=p.adjust(`Pr(>Chisq)`, 'fdr')] p_val <- summaryDt[summaryDt[, "component"] == "H", 4] genes.return <- summaryDt[summaryDt[, "component"] == "H", 1] # p_val <- subset(summaryDt, component == "H")[, 4] # genes.return <- subset(summaryDt, component == "H")[, 1] to.return <- data.frame(p_val, row.names = genes.return) return(to.return) } # compare two negative binomial regression models # model one uses only common factors (com.fac) # model two additionally uses group factor (grp.fac) # #' @importFrom stats glm anova coef # NBModelComparison <- function(y, theta, latent.data, com.fac, grp.fac) { tab <- as.matrix(x = table(y > 0, latent.data[, grp.fac])) freqs <- tab['TRUE', ] / apply(X = tab, MARGIN = 2, FUN = sum) fit2 <- 0 fit4 <- 0 try( expr = fit2 <- glm( formula = y ~ ., data = latent.data[, com.fac, drop = FALSE], family = MASS::negative.binomial(theta = theta) ), silent=TRUE ) try( fit4 <- glm( formula = y ~ ., data = latent.data[, c(com.fac, grp.fac)], family = MASS::negative.binomial(theta = theta) ), silent = TRUE ) if (is.numeric(x = fit2) || is.numeric(x = fit4)) { message('One of the glm.nb calls failed') return(c(rep(x = NA, 5), freqs)) } pval <- anova(fit2, fit4, test = 'Chisq')$'Pr(>Chi)'[2] foi <- 2 + length(x = com.fac) log2.fc <- log2(x = 1 / exp(x = coef(object = fit4)[foi])) ret <- c( fit2$deviance, fit4$deviance, pval, coef(object = fit4)[foi], log2.fc, freqs ) names(x = ret) <- c( 'dev1', 'dev2', 'pval', 'coef', 'log2.fc', 'freq1', 'freq2' ) return(ret) } PerformDE <- function( object, cells.1, cells.2, features, test.use, verbose, min.cells.feature, latent.vars, densify, ... ) { if (!(test.use %in% DEmethods_latent()) && !is.null(x = latent.vars)) { warning( "'latent.vars' is only used for the following tests: ", paste(DEmethods_latent(), collapse=", "), call. = FALSE, immediate. = TRUE ) } if (!test.use %in% DEmethods_checkdots()) { CheckDots(...) } data.use <- object[features, c(cells.1, cells.2), drop = FALSE] if (densify){ data.use <- as.matrix(x = data.use) } de.results <- switch( EXPR = test.use, 'wilcox' = WilcoxDETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, verbose = verbose, ... ), 'wilcox_limma' = WilcoxDETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, verbose = verbose, limma = TRUE, ... ), 'bimod' = DiffExpTest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, verbose = verbose ), 'roc' = MarkerTest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, verbose = verbose ), 't' = DiffTTest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, verbose = verbose ), 'negbinom' = GLMDETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, min.cells = min.cells.feature, latent.vars = latent.vars, test.use = test.use, verbose = verbose ), 'poisson' = GLMDETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, min.cells = min.cells.feature, latent.vars = latent.vars, test.use = test.use, verbose = verbose ), 'MAST' = MASTDETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, latent.vars = latent.vars, verbose = verbose, ... ), "DESeq2" = DESeq2DETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, verbose = verbose, ... ), "LR" = LRDETest( data.use = data.use, cells.1 = cells.1, cells.2 = cells.2, latent.vars = latent.vars, verbose = verbose ), stop("Unknown test: ", test.use) ) return(de.results) } #' Prepare object to run differential expression on SCT assay with multiple models #' #' Given a merged object with multiple SCT models, this function uses minimum #' of the median UMI (calculated using the raw UMI counts) of individual objects #' to reverse the individual SCT regression model using minimum of median UMI #' as the sequencing depth covariate. #' The counts slot of the SCT assay is replaced with recorrected counts and #' the data slot is replaced with log1p of recorrected counts. #' @param object Seurat object with SCT assays #' @param assay Assay name where for SCT objects are stored; Default is 'SCT' #' @param verbose Print messages and progress #' @importFrom Matrix Matrix #' @importFrom SeuratObject SparseEmptyMatrix #' @importFrom pbapply pblapply #' @importFrom future.apply future_lapply #' @importFrom future nbrOfWorkers #' @importFrom sctransform correct_counts #' @importFrom SeuratObject JoinLayers #' #' @return Returns a Seurat object with recorrected counts and data in the SCT assay. #' @export #' #' @concept differential_expression #' @template section-progressr #' @template section-future #' @examples #' data("pbmc_small") #' pbmc_small1 <- SCTransform(object = pbmc_small, variable.features.n = 20, vst.flavor="v1") #' pbmc_small2 <- SCTransform(object = pbmc_small, variable.features.n = 20, vst.flavor="v1") #' pbmc_merged <- merge(x = pbmc_small1, y = pbmc_small2) #' pbmc_merged <- PrepSCTFindMarkers(object = pbmc_merged) #' markers <- FindMarkers( #' object = pbmc_merged, #' ident.1 = "0", #' ident.2 = "1", #' assay = "SCT" #' ) #' pbmc_subset <- subset(pbmc_merged, idents = c("0", "1")) #' markers_subset <- FindMarkers( #' object = pbmc_subset, #' ident.1 = "0", #' ident.2 = "1", #' assay = "SCT", #' recorrect_umi = FALSE #' ) #' PrepSCTFindMarkers <- function(object, assay = "SCT", verbose = TRUE) { if (verbose && nbrOfWorkers() == 1) { my.lapply <- pblapply } else { my.lapply <- future_lapply } if (length(x = levels(x = object[[assay]])) == 1) { if (verbose) { message("Only one SCT model is stored - skipping recalculating corrected counts") } return(object) } observed_median_umis <- lapply( X = SCTResults(object = object[[assay]], slot = "cell.attributes"), FUN = function(x) median(x[, "umi"]) ) model.list <- slot(object = object[[assay]], name = "SCTModel.list") median_umi.status <- lapply(X = model.list, FUN = function(x) { return(tryCatch( expr = slot(object = x, name = 'median_umi'), error = function(...) {return(NULL)}) )}) if (any(is.null(x = unlist(x = median_umi.status)))){ # For old SCT objects median_umi is set to median umi as calculated from obserbed UMIs slot(object = object[[assay]], name = "SCTModel.list") <- lapply(X = model.list, FUN = UpdateSlots) SCTResults(object = object[[assay]], slot = "median_umi") <- observed_median_umis } model_median_umis <- SCTResults(object = object[[assay]], slot = "median_umi") min_median_umi <- min(unlist(x = observed_median_umis), na.rm = TRUE) if (all(unlist(x = model_median_umis) > min_median_umi)){ if (verbose){ message("Minimum UMI unchanged. Skipping re-correction.") } return(object) } if (verbose) { message(paste0("Found ", length(x = levels(x = object[[assay]])), " SCT models.", " Recorrecting SCT counts using minimum median counts: ", min_median_umi)) } umi.assay <- unique( x = unlist( x = SCTResults(object = object[[assay]], slot = "umi.assay") ) ) if (length(x = umi.assay) > 1) { stop("Multiple UMI assays are used for SCTransform: ", paste(umi.assay, collapse = ", ") ) } umi.layers <- Layers(object = object, assay = umi.assay, search = 'counts') if (length(x = umi.layers) > 1) { object[[umi.assay]] <- JoinLayers( object = object[[umi.assay]], layers = "counts", new = "counts") } raw_umi <- GetAssayData(object = object, assay = umi.assay, slot = "counts") corrected_counts <- Matrix( nrow = nrow(x = raw_umi), ncol = ncol(x = raw_umi), data = 0, dimnames = dimnames(x = raw_umi), sparse = TRUE ) cell_attr <- SCTResults(object = object[[assay]], slot = "cell.attributes") model_pars_fit <- lapply( X = SCTResults(object = object[[assay]], slot = "feature.attributes"), FUN = function(x) x[, c("theta", "(Intercept)", "log_umi")] ) arguments <- SCTResults(object = object[[assay]], slot = "arguments") model_str <- SCTResults(object = object[[assay]], slot = "model") set_median_umi <- rep(min_median_umi, length(levels(x = object[[assay]]))) names(set_median_umi) <- levels(x = object[[assay]]) set_median_umi <- as.list(set_median_umi) all_genes <- rownames(x = object[[assay]]) # correct counts my.correct_counts <- function(model_name){ model_genes <- rownames(x = model_pars_fit[[model_name]]) x <- list( model_str = model_str[[model_name]], arguments = arguments[[model_name]], model_pars_fit = as.matrix(x = model_pars_fit[[model_name]]), cell_attr = cell_attr[[model_name]] ) cells <- rownames(x = cell_attr[[model_name]]) umi <- raw_umi[all_genes, cells] umi_corrected <- correct_counts( x = x, umi = umi, verbosity = 0, scale_factor = min_median_umi ) missing_features <- setdiff(x = all_genes, y = rownames(x = umi_corrected)) corrected_counts.list <- NULL gc(verbose = FALSE) empty <- SparseEmptyMatrix(nrow = length(x = missing_features), ncol = ncol(x = umi_corrected)) rownames(x = empty) <- missing_features colnames(x = umi_corrected) <- colnames(x = umi_corrected) umi_corrected <- rbind(umi_corrected, empty)[all_genes,] return(umi_corrected) } corrected_counts.list <- my.lapply(X = levels(x = object[[assay]]), FUN = my.correct_counts) names(x = corrected_counts.list) <- levels(x = object[[assay]]) corrected_counts <- do.call(what = MergeSparseMatrices, args = corrected_counts.list) corrected_counts <- as.sparse(x = corrected_counts) corrected_data <- log1p(x = corrected_counts) suppressWarnings({object <- SetAssayData(object = object, assay = assay, slot = "counts", new.data = corrected_counts)}) suppressWarnings({object <- SetAssayData(object = object, assay = assay, slot = "data", new.data = corrected_data)}) SCTResults(object = object[[assay]], slot = "median_umi") <- set_median_umi return(object) } PrepSCTFindMarkers.V5 <- function(object, assay = "SCT", umi.assay = "RNA", layer = "counts", verbose = TRUE) { layers <- Layers(object = object[[umi.assay]], search = layer) dataset.names <- gsub(pattern = paste0(layer, "."), replacement = "", x = layers) for (i in seq_along(along.with = layers)) { l <- layers[i] counts <- LayerData( object = object[[umi.assay]], layer = l ) } cells.grid <- DelayedArray::colAutoGrid(x = counts, ncol = min(length(Cells(object)), ncol(counts))) } # given a UMI count matrix, estimate NB theta parameter for each gene # and use fit of relationship with mean to assign regularized theta to each gene # #' @importFrom stats glm loess poisson #' @importFrom utils txtProgressBar setTxtProgressBar # RegularizedTheta <- function(cm, latent.data, min.theta = 0.01, bin.size = 128) { genes.regress <- rownames(x = cm) bin.ind <- ceiling(x = 1:length(x = genes.regress) / bin.size) max.bin <- max(bin.ind) message('Running Poisson regression (to get initial mean), and theta estimation per gene') pb <- txtProgressBar(min = 0, max = max.bin, style = 3, file = stderr()) theta.estimate <- c() for (i in 1:max.bin) { genes.bin.regress <- genes.regress[bin.ind == i] bin.theta.estimate <- unlist( x = parallel::mclapply( X = genes.bin.regress, FUN = function(j) { return(as.numeric(x = MASS::theta.ml( y = cm[j, ], mu = glm( formula = cm[j, ] ~ ., data = latent.data, family = poisson )$fitted ))) } ), use.names = FALSE ) theta.estimate <- c(theta.estimate, bin.theta.estimate) setTxtProgressBar(pb = pb, value = i) } close(con = pb) UMI.mean <- apply(X = cm, MARGIN = 1, FUN = mean) var.estimate <- UMI.mean + (UMI.mean ^ 2) / theta.estimate for (span in c(1/3, 1/2, 3/4, 1)) { fit <- loess( formula = log10(x = var.estimate) ~ log10(x = UMI.mean), span = span ) if (! any(is.na(x = fit$fitted))) { message(sprintf( 'Used loess with span %1.2f to fit mean-variance relationship\n', span )) break } } if (any(is.na(x = fit$fitted))) { stop('Problem when fitting NB gene variance in RegularizedTheta - NA values were fitted.') } theta.fit <- (UMI.mean ^ 2) / ((10 ^ fit$fitted) - UMI.mean) names(x = theta.fit) <- genes.regress to.fix <- theta.fit <= min.theta | is.infinite(x = theta.fit) if (any(to.fix)) { message( 'Fitted theta below ', min.theta, ' for ', sum(to.fix), ' genes, setting them to ', min.theta ) theta.fit[to.fix] <- min.theta } return(theta.fit) } # FindMarkers helper function for cell grouping error checking ValidateCellGroups <- function( object, cells.1, cells.2, min.cells.group ) { if (length(x = cells.1) == 0) { stop("Cell group 1 is empty - no cells with identity class ", cells.1) } else if (length(x = cells.2) == 0) { stop("Cell group 2 is empty - no cells with identity class ", cells.2) return(NULL) } else if (length(x = cells.1) < min.cells.group) { stop("Cell group 1 has fewer than ", min.cells.group, " cells") } else if (length(x = cells.2) < min.cells.group) { stop("Cell group 2 has fewer than ", min.cells.group, " cells") } else if (any(!cells.1 %in% colnames(x = object))) { bad.cells <- colnames(x = object)[which(x = !as.character(x = cells.1) %in% colnames(x = object))] stop( "The following cell names provided to cells.1 are not present: ", paste(bad.cells, collapse = ", ") ) } else if (any(!cells.2 %in% colnames(x = object))) { bad.cells <- colnames(x = object)[which(x = !as.character(x = cells.2) %in% colnames(x = object))] stop( "The following cell names provided to cells.2 are not present: ", paste(bad.cells, collapse = ", ") ) } } # Differential expression using Wilcoxon Rank Sum # # Identifies differentially expressed genes between two groups of cells using # a Wilcoxon Rank Sum test. Makes use of presto::wilcoxauc for a more efficient # implementation of the wilcoxon test. If presto is not installed, or if limma # is requested, makes use of limma::rankSumTestWithCorrelation for a # more efficient implementation of the wilcoxon test. Thanks to Yunshun Chen and # Gordon Smyth for suggesting the limma implementation. If limma is also not installed, # uses wilcox.test. # # @param data.use Data matrix to test # @param cells.1 Group 1 cells # @param cells.2 Group 2 cells # @param verbose Print a progress bar # @param limma If limma should be used for testing; default is FALSE # @param ... Extra parameters passed to wilcox.test # # @return Returns a p-value ranked matrix of putative differentially expressed # features # #' @importFrom pbapply pbsapply #' @importFrom stats wilcox.test #' @importFrom future.apply future_sapply #' @importFrom future nbrOfWorkers # # @export # # @examples # data("pbmc_small") # pbmc_small # WilcoxDETest(pbmc_small, cells.1 = WhichCells(object = pbmc_small, idents = 1), # cells.2 = WhichCells(object = pbmc_small, idents = 2)) # WilcoxDETest <- function( data.use, cells.1, cells.2, verbose = TRUE, limma = FALSE, ... ) { data.use <- data.use[, c(cells.1, cells.2), drop = FALSE] j <- seq_len(length.out = length(x = cells.1)) my.sapply <- ifelse( test = verbose && nbrOfWorkers() == 1, yes = pbsapply, no = future_sapply ) overflow.check <- ifelse( test = is.na(x = suppressWarnings(length(x = data.use[1, ]) * length(x = data.use[1, ]))), yes = FALSE, no = TRUE ) presto.check <- PackageCheck("presto", error = FALSE) limma.check <- PackageCheck("limma", error = FALSE) group.info <- data.frame(row.names = c(cells.1, cells.2)) group.info[cells.1, "group"] <- "Group1" group.info[cells.2, "group"] <- "Group2" group.info[, "group"] <- factor(x = group.info[, "group"]) if (presto.check[1] && (!limma)) { data.use <- data.use[, rownames(group.info), drop = FALSE] res <- presto::wilcoxauc(X = data.use, y = group.info[, "group"]) res <- res[1:(nrow(x = res)/2),] p_val <- res$pval } else { if (getOption('Seurat.presto.wilcox.msg', TRUE) && (!limma)) { message( "For a (much!) faster implementation of the Wilcoxon Rank Sum Test,", "\n(default method for FindMarkers) please install the presto package", "\n--------------------------------------------", "\ninstall.packages('devtools')", "\ndevtools::install_github('immunogenomics/presto')", "\n--------------------------------------------", "\nAfter installation of presto, Seurat will automatically use the more ", "\nefficient implementation (no further action necessary).", "\nThis message will be shown once per session" ) options(Seurat.presto.wilcox.msg = FALSE) } if (limma.check[1] && overflow.check) { p_val <- my.sapply( X = 1:nrow(x = data.use), FUN = function(x) { return(min(2 * min(limma::rankSumTestWithCorrelation(index = j, statistics = data.use[x, ])), 1)) } ) } else { if (limma && overflow.check) { stop( "To use the limma implementation of the Wilcoxon Rank Sum Test, please install the limma package: -------------------------------------------- install.packages('BiocManager') BiocManager::install('limma') --------------------------------------------" ) } else { data.use <- data.use[, rownames(x = group.info), drop = FALSE] p_val <- my.sapply( X = 1:nrow(x = data.use), FUN = function(x) { return(wilcox.test(data.use[x, ] ~ group.info[, "group"], ...)$p.value) } ) } } } return(data.frame(p_val, row.names = rownames(x = data.use))) } Seurat/R/data.R0000644000176200001440000000274314670622051012763 0ustar liggesusers#' Cell cycle genes #' #' A list of genes used in cell-cycle regression #' #' @format A list of two vectors #' \describe{ #' \item{s.genes}{Genes associated with S-phase} #' \item{g2m.genes}{Genes associated with G2M-phase} #' } #' @concept data #' @source \url{https://www.science.org/doi/abs/10.1126/science.aad0501} #' "cc.genes" #' Cell cycle genes: 2019 update #' #' A list of genes used in cell-cycle regression, updated with 2019 symbols #' #' @section Updated symbols: #' The following symbols were updated from \code{\link{cc.genes}} #' \describe{ #' \item{s.genes}{ #' \itemize{ #' \item \emph{MCM2}: \emph{MCM7} #' \item \emph{MLF1IP}: \emph{CENPU} #' \item \emph{RPA2}: \emph{POLR1B} #' \item \emph{BRIP1}: \emph{MRPL36} #' } #' } #' \item{g2m.genes}{ #' \itemize{ #' \item \emph{FAM64A}: \emph{PIMREG} #' \item \emph{HN1}: \emph{JPT1} #' } #' } #' } #' #' @format A list of two vectors #' \describe{ #' \item{s.genes}{Genes associated with S-phase} #' \item{g2m.genes}{Genes associated with G2M-phase} #' } #' @concept data #' @source \url{https://www.science.org/doi/abs/10.1126/science.aad0501} #' #' @seealso \code{\link{cc.genes}} #' #' @examples #' \dontrun{ #' cc.genes.updated.2019 <- cc.genes #' cc.genes.updated.2019$s.genes <- UpdateSymbolList(symbols = cc.genes.updated.2019$s.genes) #' cc.genes.updated.2019$g2m.genes <- UpdateSymbolList(symbols = cc.genes.updated.2019$g2m.genes) #' } #' "cc.genes.updated.2019" Seurat/R/reexports.R0000644000176200001440000002037014731571442014106 0ustar liggesusers #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Classes #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' The Assay Class #' #' The \code{Assay} object is the basic unit of Seurat; for more details, please #' see the documentation in \code{\link[SeuratObject:Assay]{SeuratObject}} #' #' @importClassesFrom SeuratObject Assay #' #' @exportClass Assay #' #' @docType class #' @name Assay-class #' @rdname Assay-class #' #' @seealso \code{\link[SeuratObject:Assay]{SeuratObject::Assay-class}} #' NULL #' The DimReduc Class #' #' The \code{DimReduc} object stores a dimensionality reduction taken out in #' Seurat; for more details, please see the documentation in #' \code{\link[SeuratObject:DimReduc]{SeuratObject}} #' #' @importClassesFrom SeuratObject DimReduc #' #' @exportClass DimReduc #' #' @docType class #' @name DimReduc-class #' @rdname DimReduc-class #' #' @seealso \code{\link[SeuratObject:DimReduc]{SeuratObject::DimReduc-class}} #' NULL #' The Graph Class #' #' For more details, please see the documentation in #' \code{\link[SeuratObject:Graph]{SeuratObject}} #' #' @importClassesFrom SeuratObject Graph #' #' @exportClass Graph #' #' @docType class #' @name Graph-class #' @rdname Graph-class #' #' @seealso \code{\link[SeuratObject:Graph]{SeuratObject::Graph-class}} #' NULL #' The JackStrawData Class #' #' For more details, please see the documentation in #' \code{\link[SeuratObject:JackStrawData]{SeuratObject}} #' #' @importClassesFrom SeuratObject JackStrawData #' #' @exportClass JackStrawData #' #' @docType class #' @name JackStrawData-class #' @rdname JackStrawData-class #' #' @seealso \code{\link[SeuratObject:JackStrawData]{SeuratObject::JackStrawData-class}} #' NULL #' The Neighbor Class #' #' For more details, please see the documentation in #' \code{\link[SeuratObject:Neighbor]{SeuratObject}} #' #' @importClassesFrom SeuratObject Neighbor #' #' @exportClass Neighbor #' #' @docType class #' @name Neighbor-class #' @rdname Neighbor-class #' #' @seealso \code{\link[SeuratObject:Neighbor]{SeuratObject::Neighbor-class}} #' NULL #' The Seurat Class #' #' The Seurat object is a representation of single-cell expression data for R; #' for more details, please see the documentation in #' \code{\link[SeuratObject:Seurat]{SeuratObject}} #' #' @importClassesFrom SeuratObject Seurat #' #' @exportClass Seurat #' #' @docType class #' @name Seurat-class #' @rdname Seurat-class #' #' @seealso \code{\link[SeuratObject:Seurat]{SeuratObject::Seurat-class}} #' NULL #' The SeuratCommand Class #' #' For more details, please see the documentation in #' \code{\link[SeuratObject:SeuratCommand]{SeuratObject}} #' #' @importClassesFrom SeuratObject SeuratCommand #' #' @exportClass SeuratCommand #' #' @docType class #' @name SeuratCommand-class #' @rdname SeuratCommand-class #' #' @seealso \code{\link[SeuratObject:SeuratCommand]{SeuratObject::SeuratCommand-class}} #' NULL #' The SpatialImage Class #' #' For more details, please see the documentation in #' \code{\link[SeuratObject:SpatialImage]{SeuratObject}} #' #' @importClassesFrom SeuratObject SpatialImage #' #' @exportClass SpatialImage #' #' @docType class #' @name SpatialImage-class #' @rdname SpatialImage-class #' #' @seealso \code{\link[SeuratObject:SpatialImage]{SeuratObject::SpatialImage-class}} #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions and Generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @importFrom generics components #' @rdname reexports #' @export #' generics::components #' @importFrom SeuratObject %||% #' @rdname reexports #' @export #' SeuratObject::`%||%` #' @importFrom SeuratObject %iff% #' @rdname reexports #' @export #' SeuratObject::`%iff%` #' @importFrom SeuratObject AddMetaData #' @export #' SeuratObject::AddMetaData #' @importFrom SeuratObject as.Graph #' @export #' SeuratObject::as.Graph #' @importFrom SeuratObject as.Neighbor #' @export #' SeuratObject::as.Neighbor #' @importFrom SeuratObject as.Seurat #' @export #' SeuratObject::as.Seurat #' @importFrom SeuratObject as.sparse #' @export #' SeuratObject::as.sparse #' @importFrom SeuratObject Assays #' @export #' SeuratObject::Assays #' @importFrom SeuratObject Cells #' @export #' SeuratObject::Cells #' @importFrom SeuratObject CellsByIdentities #' @export #' SeuratObject::CellsByIdentities #' @importFrom SeuratObject Command #' @export #' SeuratObject::Command #' @importFrom SeuratObject CreateAssayObject #' @export #' SeuratObject::CreateAssayObject #' @importFrom SeuratObject CreateDimReducObject #' @export #' SeuratObject::CreateDimReducObject #' @importFrom SeuratObject CreateSeuratObject #' @export #' SeuratObject::CreateSeuratObject #' @importFrom SeuratObject DefaultAssay #' @export #' SeuratObject::DefaultAssay #' @importFrom SeuratObject DefaultAssay<- #' @export #' SeuratObject::`DefaultAssay<-` #' @importFrom SeuratObject Distances #' @export #' SeuratObject::Distances #' @importFrom SeuratObject Embeddings #' @export #' SeuratObject::Embeddings #' @importFrom SeuratObject FetchData #' @export #' SeuratObject::FetchData #' @importFrom SeuratObject GetAssayData #' @export #' SeuratObject::GetAssayData #' @importFrom SeuratObject GetImage #' @export #' SeuratObject::GetImage #' @importFrom SeuratObject GetTissueCoordinates #' @export #' SeuratObject::GetTissueCoordinates #' @importFrom SeuratObject HVFInfo #' @export #' SeuratObject::HVFInfo #' @importFrom SeuratObject Idents #' @export #' SeuratObject::Idents #' @importFrom SeuratObject Idents<- #' @export #' SeuratObject::`Idents<-` #' @importFrom SeuratObject Images #' @export #' SeuratObject::Images #' @importFrom SeuratObject Index #' @export #' SeuratObject::Index #' @importFrom SeuratObject Index<- #' @export #' SeuratObject::`Index<-` #' @importFrom SeuratObject Indices #' @export #' SeuratObject::Indices #' @importFrom SeuratObject IsGlobal #' @export #' SeuratObject::IsGlobal #' @importFrom SeuratObject JS #' @export #' SeuratObject::JS #' @importFrom SeuratObject JS<- #' @export #' SeuratObject::`JS<-` #' @importFrom SeuratObject Key #' @export #' SeuratObject::Key #' @importFrom SeuratObject Key<- #' @export #' SeuratObject::`Key<-` #' @importFrom SeuratObject Loadings #' @export #' SeuratObject::Loadings #' @importFrom SeuratObject Loadings<- #' @export #' SeuratObject::`Loadings<-` #' @importFrom SeuratObject LogSeuratCommand #' @export #' SeuratObject::LogSeuratCommand #' @importFrom SeuratObject Misc #' @export #' SeuratObject::Misc #' @importFrom SeuratObject Misc<- #' @export #' SeuratObject::`Misc<-` #' @importFrom SeuratObject Neighbors #' @export #' SeuratObject::Neighbors #' @importFrom SeuratObject Project #' @export #' SeuratObject::Project #' @importFrom SeuratObject Project<- #' @export #' SeuratObject::`Project<-` #' @importFrom SeuratObject Radius #' @export #' SeuratObject::Radius #' @importFrom SeuratObject Reductions #' @export #' SeuratObject::Reductions #' @importFrom SeuratObject RenameCells #' @export #' SeuratObject::RenameCells #' @importFrom SeuratObject RenameIdents #' @export #' SeuratObject::RenameIdents #' @importFrom SeuratObject ReorderIdent #' @export #' SeuratObject::ReorderIdent #' @importFrom SeuratObject RowMergeSparseMatrices #' @export #' SeuratObject::RowMergeSparseMatrices #' @importFrom SeuratObject SetAssayData #' @export #' SeuratObject::SetAssayData #' @importFrom SeuratObject SetIdent #' @export #' SeuratObject::SetIdent #' @importFrom SeuratObject SpatiallyVariableFeatures #' @export #' SeuratObject::SpatiallyVariableFeatures #' @importFrom SeuratObject StashIdent #' @export #' SeuratObject::StashIdent #' @importFrom SeuratObject Stdev #' @export #' SeuratObject::Stdev #' @importFrom SeuratObject SVFInfo #' @export #' SeuratObject::SVFInfo #' @importFrom SeuratObject Tool #' @export #' SeuratObject::Tool #' @importFrom SeuratObject Tool<- #' @export #' SeuratObject::`Tool<-` #' @importFrom SeuratObject UpdateSeuratObject #' @export #' SeuratObject::UpdateSeuratObject #' @importFrom SeuratObject VariableFeatures #' @export #' SeuratObject::VariableFeatures #' @importFrom SeuratObject VariableFeatures<- #' @export #' SeuratObject::`VariableFeatures<-` #' @importFrom SeuratObject WhichCells #' @export #' SeuratObject::WhichCells Seurat/R/preprocessing.R0000644000176200001440000057266214744462764014770 0ustar liggesusers#' @include generics.R #' @importFrom progressr progressor #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% globalVariables( names = c('fov', 'cell_ID', 'qv'), package = 'Seurat', add = TRUE ) #' Calculate the Barcode Distribution Inflection #' #' This function calculates an adaptive inflection point ("knee") of the barcode distribution #' for each sample group. This is useful for determining a threshold for removing #' low-quality samples. #' #' The function operates by calculating the slope of the barcode number vs. rank #' distribution, and then finding the point at which the distribution changes most #' steeply (the "knee"). Of note, this calculation often must be restricted as to the #' range at which it performs, so `threshold` parameters are provided to restrict the #' range of the calculation based on the rank of the barcodes. [BarcodeInflectionsPlot()] #' is provided as a convenience function to visualize and test different thresholds and #' thus provide more sensical end results. #' #' See [BarcodeInflectionsPlot()] to visualize the calculated inflection points and #' [SubsetByBarcodeInflections()] to subsequently subset the Seurat object. #' #' @param object Seurat object #' @param barcode.column Column to use as proxy for barcodes ("nCount_RNA" by default) #' @param group.column Column to group by ("orig.ident" by default) #' @param threshold.high Ignore barcodes of rank above this threshold in inflection calculation #' @param threshold.low Ignore barcodes of rank below this threshold in inflection calculation #' #' @return Returns Seurat object with a new list in the `tools` slot, `CalculateBarcodeInflections` with values: #' #' * `barcode_distribution` - contains the full barcode distribution across the entire dataset #' * `inflection_points` - the calculated inflection points within the thresholds #' * `threshold_values` - the provided (or default) threshold values to search within for inflections #' * `cells_pass` - the cells that pass the inflection point calculation #' #' @importFrom methods slot #' @importFrom stats ave aggregate #' #' @export #' @concept preprocessing #' #' @author Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} #' @seealso \code{\link{BarcodeInflectionsPlot}} \code{\link{SubsetByBarcodeInflections}} #' #' @examples #' data("pbmc_small") #' CalculateBarcodeInflections(pbmc_small, group.column = 'groups') #' CalculateBarcodeInflections <- function( object, barcode.column = "nCount_RNA", group.column = "orig.ident", threshold.low = NULL, threshold.high = NULL ) { ## Check that barcode.column exists in meta.data if (!(barcode.column %in% colnames(x = object[[]]))) { stop("`barcode.column` specified not present in Seurat object provided") } # Calculation of barcode distribution ## Append rank by grouping x umi column # barcode_dist <- as.data.frame(object@meta.data)[, c(group.column, barcode.column)] barcode_dist <- object[[c(group.column, barcode.column)]] barcode_dist <- barcode_dist[do.call(what = order, args = barcode_dist), ] # order by columns left to right barcode_dist$rank <- ave( x = barcode_dist[, barcode.column], barcode_dist[, group.column], FUN = function(x) { return(rev(x = order(x))) } ) barcode_dist <- barcode_dist[order(barcode_dist[, group.column], barcode_dist[, 'rank']), ] ## calculate rawdiff and append per group top <- aggregate( x = barcode_dist[, barcode.column], by = list(barcode_dist[, group.column]), FUN = function(x) { return(c(0, diff(x = log10(x = x + 1)))) })$x bot <- aggregate( x = barcode_dist[, 'rank'], by = list(barcode_dist[, group.column]), FUN = function(x) { return(c(0, diff(x = x))) } )$x barcode_dist$rawdiff <- unlist(x = mapply( FUN = function(x, y) { return(ifelse(test = is.na(x = x / y), yes = 0, no = x / y)) }, x = top, y = bot )) # Calculation of inflection points ## Set thresholds for rank of barcodes to ignore threshold.low <- threshold.low %||% 1 threshold.high <- threshold.high %||% max(barcode_dist$rank) ## Subset the barcode distribution by thresholds barcode_dist_sub <- barcode_dist[barcode_dist$rank > threshold.low & barcode_dist$rank < threshold.high, ] ## Calculate inflection points ## note: if thresholds are s.t. it produces the same length across both groups, ## aggregate will create a data.frame with x.* columns, where * is the length ## using the same combine approach will yield non-symmetrical results! whichmin_list <- aggregate( x = barcode_dist_sub[, 'rawdiff'], by = list(barcode_dist_sub[, group.column]), FUN = function(x) { return(x == min(x)) } )$x ## workaround for aggregate behavior noted above if (is.list(x = whichmin_list)) { # uneven lengths is_inflection <- unlist(x = whichmin_list) } else if (is.matrix(x = whichmin_list)) { # even lengths is_inflection <- as.vector(x = t(x = whichmin_list)) } tmp <- cbind(barcode_dist_sub, is_inflection) # inflections <- tmp[tmp$is_inflection == TRUE, c(group.column, barcode.column, "rank")] inflections <- tmp[which(x = tmp$is_inflection), c(group.column, barcode.column, 'rank')] # Use inflection point for what cells to keep ## use the inflection points to cut the subsetted dist to what to keep ## keep only the barcodes above the inflection points keep <- unlist(x = lapply( X = whichmin_list, FUN = function(x) { keep <- !x if (sum(keep) == length(x = keep)) { return(keep) # prevents bug in case of keeping all cells } # toss <- which(keep == FALSE):length(x = keep) # the end cells below knee toss <- which(x = !keep):length(x = keep) keep[toss] <- FALSE return(keep) } )) barcode_dist_sub_keep <- barcode_dist_sub[keep, ] cells_keep <- rownames(x = barcode_dist_sub_keep) # Bind thresholds to keep track of where they are placed thresholds <- data.frame( threshold = c('threshold.low', 'threshold.high'), rank = c(threshold.low, threshold.high) ) # Combine relevant info together ## Combine Barcode dist, inflection point, and cells to keep into list info <- list( barcode_distribution = barcode_dist, inflection_points = inflections, threshold_values = thresholds, cells_pass = cells_keep ) # save results into object Tool(object = object) <- info return(object) } #' Demultiplex samples based on data from cell 'hashing' #' #' Assign sample-of-origin for each cell, annotate doublets. #' #' @param object Seurat object. Assumes that the hash tag oligo (HTO) data has been added and normalized. #' @param assay Name of the Hashtag assay (HTO by default) #' @param positive.quantile The quantile of inferred 'negative' distribution for each hashtag - over which the cell is considered 'positive'. Default is 0.99 #' @param init Initial number of clusters for hashtags. Default is the # of hashtag oligo names + 1 (to account for negatives) #' @param kfunc Clustering function for initial hashtag grouping. Default is "clara" for fast k-medoids clustering on large applications, also support "kmeans" for kmeans clustering #' @param nsamples Number of samples to be drawn from the dataset used for clustering, for kfunc = "clara" #' @param nstarts nstarts value for k-means clustering (for kfunc = "kmeans"). 100 by default #' @param seed Sets the random seed. If NULL, seed is not set #' @param verbose Prints the output #' #' @return The Seurat object with the following demultiplexed information stored in the meta data: #' \describe{ #' \item{hash.maxID}{Name of hashtag with the highest signal} #' \item{hash.secondID}{Name of hashtag with the second highest signal} #' \item{hash.margin}{The difference between signals for hash.maxID and hash.secondID} #' \item{classification}{Classification result, with doublets/multiplets named by the top two highest hashtags} #' \item{classification.global}{Global classification result (singlet, doublet or negative)} #' \item{hash.ID}{Classification result where doublet IDs are collapsed} #' } #' #' @importFrom cluster clara #' @importFrom Matrix colSums #' @importFrom fitdistrplus fitdist #' @importFrom stats pnbinom kmeans #' #' @export #' @concept preprocessing #' #' @seealso \code{\link{HTOHeatmap}} #' #' @examples #' \dontrun{ #' object <- HTODemux(object) #' } #' HTODemux <- function( object, assay = "HTO", positive.quantile = 0.99, init = NULL, nstarts = 100, kfunc = "clara", nsamples = 100, seed = 42, verbose = TRUE ) { if (!is.null(x = seed)) { set.seed(seed = seed) } #initial clustering assay <- assay %||% DefaultAssay(object = object) data <- GetAssayData(object = object, assay = assay) counts <- GetAssayData( object = object, assay = assay, slot = 'counts' )[, colnames(x = object)] counts <- as.matrix(x = counts) ncenters <- init %||% (nrow(x = data) + 1) switch( EXPR = kfunc, 'kmeans' = { init.clusters <- kmeans( x = t(x = GetAssayData(object = object, assay = assay)), centers = ncenters, nstart = nstarts ) #identify positive and negative signals for all HTO Idents(object = object, cells = names(x = init.clusters$cluster)) <- init.clusters$cluster }, 'clara' = { #use fast k-medoid clustering init.clusters <- clara( x = t(x = GetAssayData(object = object, assay = assay)), k = ncenters, samples = nsamples ) #identify positive and negative signals for all HTO Idents(object = object, cells = names(x = init.clusters$clustering), drop = TRUE) <- init.clusters$clustering }, stop("Unknown k-means function ", kfunc, ", please choose from 'kmeans' or 'clara'") ) #average hto signals per cluster #work around so we don't average all the RNA levels which takes time average.expression <- suppressWarnings( AverageExpression( object = object, assays = assay, verbose = FALSE )[[assay]] ) #checking for any cluster with all zero counts for any barcode if (sum(average.expression == 0) > 0) { stop("Cells with zero counts exist as a cluster.") } #create a matrix to store classification result discrete <- GetAssayData(object = object, assay = assay) discrete[discrete > 0] <- 0 # for each HTO, we will use the minimum cluster for fitting for (iter in rownames(x = data)) { values <- counts[iter, colnames(object)] #commented out if we take all but the top cluster as background #values_negative=values[setdiff(object@cell.names,WhichCells(object,which.max(average.expression[iter,])))] values.use <- values[WhichCells( object = object, idents = levels(x = Idents(object = object))[[which.min(x = average.expression[iter, ])]] )] fit <- suppressWarnings(expr = fitdist(data = values.use, distr = "nbinom")) cutoff <- as.numeric(x = quantile(x = fit, probs = positive.quantile)$quantiles[1]) discrete[iter, names(x = which(x = values > cutoff))] <- 1 if (verbose) { message(paste0("Cutoff for ", iter, " : ", cutoff, " reads")) } } # now assign cells to HTO based on discretized values npositive <- colSums(x = discrete) classification.global <- npositive classification.global[npositive == 0] <- "Negative" classification.global[npositive == 1] <- "Singlet" classification.global[npositive > 1] <- "Doublet" donor.id = rownames(x = data) hash.max <- apply(X = data, MARGIN = 2, FUN = max) hash.maxID <- apply(X = data, MARGIN = 2, FUN = which.max) hash.second <- apply(X = data, MARGIN = 2, FUN = MaxN, N = 2) hash.maxID <- as.character(x = donor.id[sapply( X = 1:ncol(x = data), FUN = function(x) { return(which(x = data[, x] == hash.max[x])[1]) } )]) hash.secondID <- as.character(x = donor.id[sapply( X = 1:ncol(x = data), FUN = function(x) { return(which(x = data[, x] == hash.second[x])[1]) } )]) hash.margin <- hash.max - hash.second doublet_id <- sapply( X = 1:length(x = hash.maxID), FUN = function(x) { return(paste(sort(x = c(hash.maxID[x], hash.secondID[x])), collapse = "_")) } ) # doublet_names <- names(x = table(doublet_id))[-1] # Not used classification <- classification.global classification[classification.global == "Negative"] <- "Negative" classification[classification.global == "Singlet"] <- hash.maxID[which(x = classification.global == "Singlet")] classification[classification.global == "Doublet"] <- doublet_id[which(x = classification.global == "Doublet")] classification.metadata <- data.frame( hash.maxID, hash.secondID, hash.margin, classification, classification.global ) colnames(x = classification.metadata) <- paste( assay, c('maxID', 'secondID', 'margin', 'classification', 'classification.global'), sep = '_' ) object <- AddMetaData(object = object, metadata = classification.metadata) Idents(object) <- paste0(assay, '_classification') # Idents(object, cells = rownames(object@meta.data[object@meta.data$classification.global == "Doublet", ])) <- "Doublet" doublets <- rownames(x = object[[]])[which(object[[paste0(assay, "_classification.global")]] == "Doublet")] Idents(object = object, cells = doublets) <- 'Doublet' # object@meta.data$hash.ID <- Idents(object) object$hash.ID <- Idents(object = object) return(object) } #' Calculate pearson residuals of features not in the scale.data #' #' This function calls sctransform::get_residuals. #' #' @param object A seurat object #' @param features Name of features to add into the scale.data #' @param assay Name of the assay of the seurat object generated by SCTransform #' @param umi.assay Name of the assay of the seurat object containing UMI matrix #' and the default is RNA #' @param clip.range Numeric of length two specifying the min and max values the #' Pearson residual will be clipped to #' @param replace.value Recalculate residuals for all features, even if they are #' already present. Useful if you want to change the clip.range. #' @param na.rm For features where there is no feature model stored, return NA #' for residual value in scale.data when na.rm = FALSE. When na.rm is TRUE, only #' return residuals for features with a model stored for all cells. #' @param verbose Whether to print messages and progress bars #' #' @return Returns a Seurat object containing Pearson residuals of added #' features in its scale.data #' #' @importFrom sctransform get_residuals #' @importFrom matrixStats rowAnyNAs #' #' @export #' @concept preprocessing #' #' @seealso \code{\link[sctransform]{get_residuals}} #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small <- SCTransform(object = pbmc_small, variable.features.n = 20) #' pbmc_small <- GetResidual(object = pbmc_small, features = c('MS4A1', 'TCL1A')) #' } #' GetResidual <- function( object, features, assay = NULL, umi.assay = "RNA", clip.range = NULL, replace.value = FALSE, na.rm = TRUE, verbose = TRUE ) { assay <- assay %||% DefaultAssay(object = object) if (IsSCT(assay = object[[assay]])) { object[[assay]] <- as(object[[assay]], 'SCTAssay') } if (!inherits(x = object[[assay]], what = "SCTAssay")) { stop(assay, " assay was not generated by SCTransform") } sct.models <- levels(x = object[[assay]]) if (length(x = sct.models) == 0) { warning("SCT model not present in assay", call. = FALSE, immediate. = TRUE) return(object) } possible.features <- unique(x = unlist(x = lapply(X = sct.models, FUN = function(x) { rownames(x = SCTResults(object = object[[assay]], slot = "feature.attributes", model = x)) } ))) bad.features <- setdiff(x = features, y = possible.features) if (length(x = bad.features) > 0) { warning("The following requested features are not present in any models: ", paste(bad.features, collapse = ", "), call. = FALSE) features <- intersect(x = features, y = possible.features) } features.orig <- features if (na.rm) { # only compute residuals when feature model info is present in all features <- names(x = which(x = table(unlist(x = lapply( X = sct.models, FUN = function(x) { rownames(x = SCTResults(object = object[[assay]], slot = "feature.attributes", model = x)) } ))) == length(x = sct.models))) if (length(x = features) == 0) { return(object) } } features <- intersect(x = features.orig, y = features) if (length(x = sct.models) > 1 && verbose) { message( "This SCTAssay contains multiple SCT models. Computing residuals for cells using different models" ) } if (!umi.assay %in% Assays(object = object) || length(x = Layers(object = object[[umi.assay]], search = 'counts')) == 0) { return(object) } if (inherits(x = object[[umi.assay]], what = 'Assay')) { new.residuals <- lapply( X = sct.models, FUN = function(x) { GetResidualSCTModel( object = object, assay = assay, SCTModel = x, new_features = features, replace.value = replace.value, clip.range = clip.range, verbose = verbose ) } ) } else if (inherits(x = object[[umi.assay]], what = 'Assay5')) { new.residuals <- lapply( X = sct.models, FUN = function(x) { FetchResidualSCTModel(object = object, assay = assay, umi.assay = umi.assay, SCTModel = x, new_features = features, replace.value = replace.value, clip.range = clip.range, verbose = verbose) } ) } existing.data <- GetAssayData(object = object, slot = 'scale.data', assay = assay) all.features <- union(x = rownames(x = existing.data), y = features) new.scale <- matrix( data = NA, nrow = length(x = all.features), ncol = ncol(x = object), dimnames = list(all.features, Cells(x = object)) ) if (nrow(x = existing.data) > 0){ new.scale[1:nrow(x = existing.data), ] <- existing.data } if (length(x = new.residuals) == 1 & is.list(x = new.residuals)) { new.residuals <- new.residuals[[1]] } else { new.residuals <- Reduce(cbind, new.residuals) } new.scale[rownames(x = new.residuals), colnames(x = new.residuals)] <- new.residuals if (na.rm) { new.scale <- new.scale[!rowAnyNAs(x = new.scale), ] } object <- SetAssayData( object = object, assay = assay, slot = "scale.data", new.data = new.scale ) if (any(!features.orig %in% rownames(x = new.scale))) { bad.features <- features.orig[which(!features.orig %in% rownames(x = new.scale))] warning("Residuals not computed for the following requested features: ", paste(bad.features, collapse = ", "), call. = FALSE) } return(object) } #' Load a 10x Genomics Visium Spatial Experiment into a \code{Seurat} object #' #' @inheritParams Read10X #' @inheritParams SeuratObject::CreateSeuratObject #' @param data.dir Directory containing the H5 file specified by \code{filename} #' and the image data in a subdirectory called \code{spatial} #' @param filename Name of H5 file containing the feature barcode matrix #' @param slice Name for the stored image of the tissue slice #' @param bin.size Specifies the bin sizes to read in - defaults to c(16, 8) #' @param filter.matrix Only keep spots that have been determined to be over #' tissue #' @param to.upper Converts all feature names to upper case. Can be useful when #' analyses require comparisons between human and mouse gene names for example. #' @param image \code{VisiumV1}/\code{VisiumV2} instance(s) - if a vector is #' passed in it should be co-indexed with \code{`bin.size`} #' @param ... Arguments passed to \code{\link{Read10X_h5}} #' #' @return A \code{Seurat} object #' #' @importFrom png readPNG #' @importFrom jsonlite fromJSON #' #' @export #' @concept preprocessing #' #' @examples #' \dontrun{ #' data_dir <- 'path/to/data/directory' #' list.files(data_dir) # Should show filtered_feature_bc_matrix.h5 #' Load10X_Spatial(data.dir = data_dir) #' } #' Load10X_Spatial <- function ( data.dir, filename = "filtered_feature_bc_matrix.h5", assay = "Spatial", slice = "slice1", bin.size = NULL, filter.matrix = TRUE, to.upper = FALSE, image = NULL, ... ) { # if more than one directory is passed in if (length(x = data.dir) > 1) { # party on with the first value data.dir <- data.dir[1] # but also raise a warning warning( paste0( "`data.dir` expects a single value but recieved multiple - ", "continuing using the first: '", data.dir, "'." ), immediate. = TRUE, ) } # if the specified directory does not exist if (!file.exists(data.dir)) { # raise an error stop(paste0("No such file or directory: ", "'", data.dir, "'")) } # if `bin.size` is not set but `data.dir` points to a folder with binned data if (is.null(bin.size) & file.exists(paste0(data.dir, "/binned_outputs"))) { # point `bin.size` to the "standard" set - i.e. everything in the default # output except the 8 um binning because it's a memory hog bin.size <- c(16, 8) } # if `bin.size` is specified if(!is.null(bin.size)) { # convert `bin.size` to a character vector and pad values to three digits bin.size.pretty <- paste0(sprintf("%03d", bin.size), "um") # point `data.dirs` to the specified binnings data.dirs <- paste0( data.dir, "/binned_outputs/", "square_", bin.size.pretty ) # suffix assay/slice names with each bin size assay.names <- paste0(assay, ".", bin.size.pretty) slice.names <- paste0(slice, ".", bin.size.pretty) } else { # otherwise just hold onto the top-level directory data.dirs <- data.dir # and keep the assay/slice names unchanged assay.names <- assay slice.names <- slice } # read in counts matrices from specified h5 files counts.paths <- lapply(data.dirs, file.path, filename) counts.list <- lapply(counts.paths, Read10X_h5, ...) # maybe convert Cell identifiers to uppercase if (to.upper) { rownames(counts) <- lapply(rownames(counts), toupper) } if (is.null(image)) { # read in the corresponding images and coordinate mappings image.list <- mapply( Read10X_Image, file.path(data.dirs, "spatial"), assay = assay.names, slice = slice.names, MoreArgs = list(filter.matrix = filter.matrix) ) } else { # make sure any passed images are in a vector image.list <- c(image) } # check that for each counts matrix there is a corresponding image if (length(image.list) != length(counts.list)) { stop( paste0( "The number of images does not match the number of counts matrices. ", "Ensure each spatial dataset has a corresponding image." ) ) } # for each counts matrix, build a Seurat object object.list <- mapply(CreateSeuratObject, counts.list, assay = assay.names) # associate each counts matrix with its corresponding image object.list <- mapply( function( .object, .image, .assay, .slice ) { # align the image's identifiers with the object's .image <- .image[Cells(.object)] # add the image to the corresponding Seurat instance .object[[.slice]] <- .image return (.object) }, object.list, image.list, assay.names, slice.names ) # merge the Seurat instances - each assay should have unique Cell identifiers object <- merge( object.list[[1]], y = object.list[-1] ) return(object) } #' Read10x Probe Metadata #' #' This function reads the probe metadata from a 10x Genomics probe barcode matrix file in HDF5 format. #' #' @param data.dir The directory where the file is located. #' @param filename The name of the file containing the raw probe barcode matrix in HDF5 format. The default filename is 'raw_probe_bc_matrix.h5'. #' #' @return Returns a data.frame containing the probe metadata. #' #' @export #' @concept preprocessing #' Read10X_probe_metadata <- function( data.dir, filename = 'raw_probe_bc_matrix.h5' ) { if (!requireNamespace('hdf5r', quietly = TRUE)) { stop("Please install hdf5r to read HDF5 files") } file.path = paste0(data.dir,"/", filename) if (!file.exists(file.path)) { stop("File not found") } infile <- hdf5r::H5File$new(filename = file.path, mode = 'r') if("matrix/features/probe_region" %in% hdf5r::list.objects(infile)) { probe.name <- infile[['matrix/features/name']][] probe.region<- infile[['matrix/features/probe_region']][] meta.data <- data.frame(probe.name, probe.region) return(meta.data) } } #' Load STARmap data #' #' @param data.dir location of data directory that contains the counts matrix, #' gene name, qhull, and centroid files. #' @param counts.file name of file containing the counts matrix (csv) #' @param gene.file name of file containing the gene names (csv) #' @param qhull.file name of file containing the hull coordinates (tsv) #' @param centroid.file name of file containing the centroid positions (tsv) #' @param assay Name of assay to associate spatial data to #' @param image Name of "image" object storing spatial coordinates #' #' @return A \code{\link{Seurat}} object #' #' @importFrom methods new #' @importFrom utils read.csv read.table #' #' @seealso \code{\link{STARmap}} #' #' @export #' @concept preprocessing #' LoadSTARmap <- function( data.dir, counts.file = "cell_barcode_count.csv", gene.file = "genes.csv", qhull.file = "qhulls.tsv", centroid.file = "centroids.tsv", assay = "Spatial", image = "image" ) { if (!dir.exists(paths = data.dir)) { stop("Cannot find directory ", data.dir, call. = FALSE) } counts <- read.csv( file = file.path(data.dir, counts.file), as.is = TRUE, header = FALSE ) gene.names <- read.csv( file = file.path(data.dir, gene.file), as.is = TRUE, header = FALSE ) qhulls <- read.table( file = file.path(data.dir, qhull.file), sep = '\t', col.names = c('cell', 'y', 'x'), as.is = TRUE ) centroids <- read.table( file = file.path(data.dir, centroid.file), sep = '\t', as.is = TRUE, col.names = c('y', 'x') ) colnames(x = counts) <- gene.names[, 1] rownames(x = counts) <- paste0('starmap', seq(1:nrow(x = counts))) counts <- as.matrix(x = counts) rownames(x = centroids) <- rownames(x = counts) qhulls$cell <- paste0('starmap', qhulls$cell) centroids <- as.matrix(x = centroids) starmap <- CreateSeuratObject(counts = t(x = counts), assay = assay) starmap[[image]] <- new( Class = 'STARmap', assay = assay, coordinates = as.data.frame(x = centroids), qhulls = qhulls ) return(starmap) } #' Load Curio Seeker data #' #' @param data.dir location of data directory that contains the counts matrix, #' gene names, barcodes/beads, and barcodes/bead location files. #' @param assay Name of assay to associate spatial data to #' #' @return A \code{\link{Seurat}} object #' #' @importFrom Matrix readMM #' #' @export #' @concept preprocessing #' LoadCurioSeeker <- function(data.dir, assay = "Spatial") { # check and find input files if (length(x = data.dir) > 1) { warning("'LoadCurioSeeker' accepts only one 'data.dir'", immediate. = TRUE) data.dir <- data.dir[1] } mtx.file <- list.files( data.dir, pattern = "*MoleculesPerMatchedBead.mtx", full.names = TRUE) if (length(x = mtx.file) > 1) { warning("Multiple files matched the pattern '*MoleculesPerMatchedBead.mtx'", immediate. = TRUE) } else if (length(x = mtx.file) == 0) { stop("No file matched the pattern '*MoleculesPerMatchedBead.mtx'", call. = FALSE) } mtx.file <- mtx.file[1] barcodes.file <- list.files( data.dir, pattern = "*barcodes.tsv", full.names = TRUE) if (length(x = barcodes.file) > 1) { warning("Multiple files matched the pattern '*barcodes.tsv'", immediate. = TRUE) } else if (length(x = barcodes.file) == 0) { stop("No file matched the pattern '*barcodes.tsv'", call. = FALSE) } barcodes.file <- barcodes.file[1] genes.file <- list.files( data.dir, pattern = "*genes.tsv", full.names = TRUE) if (length(x = genes.file) > 1) { warning("Multiple files matched the pattern '*genes.tsv'", immediate. = TRUE) } else if (length(x = genes.file) == 0) { stop("No file matched the pattern '*genes.tsv'", call. = FALSE) } genes.file <- genes.file[1] coordinates.file <- list.files( data.dir, pattern = "*MatchedBeadLocation.csv", full.names = TRUE) if (length(x = coordinates.file) > 1) { warning("Multiple files matched the pattern '*MatchedBeadLocation.csv'", immediate. = TRUE) } else if (length(x = coordinates.file) == 0) { stop("No file matched the pattern '*MatchedBeadLocation.csv'", call. = FALSE) } coordinates.file <- coordinates.file[1] # load counts matrix and create seurat object mtx <- readMM(mtx.file) mtx <- as.sparse(mtx) barcodes <- read.csv(barcodes.file, header = FALSE) genes <- read.csv(genes.file, header = FALSE) colnames(mtx) <- barcodes$V1 rownames(mtx) <- genes$V1 object <- CreateSeuratObject(counts = mtx, assay = assay) # load positions of each bead and store in a SlideSeq object in images slot coords <- read.csv(coordinates.file) colnames(coords) <- c("cell", "x", "y") coords$y <- -coords$y rownames(coords) <- coords$cell coords$cell <- NULL image <- new(Class = 'SlideSeq', assay = assay, coordinates = coords) object[["Slice"]] <- image return(object) } #' Demultiplex samples based on classification method from MULTI-seq (McGinnis et al., bioRxiv 2018) #' #' Identify singlets, doublets and negative cells from multiplexing experiments. Annotate singlets by tags. #' #' @param object Seurat object. Assumes that the specified assay data has been added #' @param assay Name of the multiplexing assay (HTO by default) #' @param quantile The quantile to use for classification #' @param autoThresh Whether to perform automated threshold finding to define the best quantile. Default is FALSE #' @param maxiter Maximum number of iterations if autoThresh = TRUE. Default is 5 #' @param qrange A range of possible quantile values to try if autoThresh = TRUE #' @param verbose Prints the output #' #' @return A Seurat object with demultiplexing results stored at \code{object$MULTI_ID} #' #' @export #' @concept preprocessing #' #' @references \doi{10.1038/s41592-019-0433-8} #' #' @examples #' \dontrun{ #' object <- MULTIseqDemux(object) #' } #' MULTIseqDemux <- function( object, assay = "HTO", quantile = 0.7, autoThresh = FALSE, maxiter = 5, qrange = seq(from = 0.1, to = 0.9, by = 0.05), verbose = TRUE ) { assay <- assay %||% DefaultAssay(object = object) multi_data_norm <- t(x = GetAssayData( object = object, slot = "data", assay = assay )) if (autoThresh) { iter <- 1 negatives <- c() neg.vector <- c() while (iter <= maxiter) { # Iterate over q values to find ideal barcode thresholding results by maximizing singlet classifications bar.table_sweep.list <- list() n <- 0 for (q in qrange) { n <- n + 1 # Generate list of singlet/doublet/negative classifications across q sweep bar.table_sweep.list[[n]] <- ClassifyCells(data = multi_data_norm, q = q) names(x = bar.table_sweep.list)[n] <- paste0("q=" , q) } # Determine which q values results in the highest pSinglet res_round <- FindThresh(call.list = bar.table_sweep.list)$res res.use <- res_round[res_round$Subset == "pSinglet", ] q.use <- res.use[which.max(res.use$Proportion),"q"] if (verbose) { message("Iteration ", iter) message("Using quantile ", q.use) } round.calls <- ClassifyCells(data = multi_data_norm, q = q.use) #remove negative cells neg.cells <- names(x = round.calls)[which(x = round.calls == "Negative")] neg.vector <- c(neg.vector, rep(x = "Negative", length(x = neg.cells))) negatives <- c(negatives, neg.cells) if (length(x = neg.cells) == 0) { break } multi_data_norm <- multi_data_norm[-which(x = rownames(x = multi_data_norm) %in% neg.cells), ] iter <- iter + 1 } names(x = neg.vector) <- negatives demux_result <- c(round.calls,neg.vector) demux_result <- demux_result[rownames(x = object[[]])] } else{ demux_result <- ClassifyCells(data = multi_data_norm, q = quantile) } demux_result <- demux_result[rownames(x = object[[]])] object[['MULTI_ID']] <- factor(x = demux_result) Idents(object = object) <- "MULTI_ID" bcs <- colnames(x = multi_data_norm) bc.max <- bcs[apply(X = multi_data_norm, MARGIN = 1, FUN = which.max)] bc.second <- bcs[unlist(x = apply( X = multi_data_norm, MARGIN = 1, FUN = function(x) { return(which(x == MaxN(x))) } ))] doublet.names <- unlist(x = lapply( X = 1:length(x = bc.max), FUN = function(x) { return(paste(sort(x = c(bc.max[x], bc.second[x])), collapse = "_")) } )) doublet.id <- which(x = demux_result == "Doublet") MULTI_classification <- as.character(object$MULTI_ID) MULTI_classification[doublet.id] <- doublet.names[doublet.id] object$MULTI_classification <- factor(x = MULTI_classification) return(object) } #' Load in data from 10X #' #' Enables easy loading of sparse data matrices provided by 10X genomics. #' #' @param data.dir Directory containing the matrix.mtx, genes.tsv (or features.tsv), and barcodes.tsv #' files provided by 10X. A vector or named vector can be given in order to load #' several data directories. If a named vector is given, the cell barcode names #' will be prefixed with the name. #' @param gene.column Specify which column of genes.tsv or features.tsv to use for gene names; default is 2 #' @param cell.column Specify which column of barcodes.tsv to use for cell names; default is 1 #' @param unique.features Make feature names unique (default TRUE) #' @param strip.suffix Remove trailing "-1" if present in all cell barcodes. #' #' @return If features.csv indicates the data has multiple data types, a list #' containing a sparse matrix of the data from each type will be returned. #' Otherwise a sparse matrix containing the expression data will be returned. #' #' @importFrom Matrix readMM #' @importFrom utils read.delim #' #' @export #' @concept preprocessing #' #' @examples #' \dontrun{ #' # For output from CellRanger < 3.0 #' data_dir <- 'path/to/data/directory' #' list.files(data_dir) # Should show barcodes.tsv, genes.tsv, and matrix.mtx #' expression_matrix <- Read10X(data.dir = data_dir) #' seurat_object = CreateSeuratObject(counts = expression_matrix) #' #' # For output from CellRanger >= 3.0 with multiple data types #' data_dir <- 'path/to/data/directory' #' list.files(data_dir) # Should show barcodes.tsv.gz, features.tsv.gz, and matrix.mtx.gz #' data <- Read10X(data.dir = data_dir) #' seurat_object = CreateSeuratObject(counts = data$`Gene Expression`) #' seurat_object[['Protein']] = CreateAssayObject(counts = data$`Antibody Capture`) #' } #' Read10X <- function( data.dir, gene.column = 2, cell.column = 1, unique.features = TRUE, strip.suffix = FALSE ) { full.data <- list() has_dt <- requireNamespace("data.table", quietly = TRUE) && requireNamespace("R.utils", quietly = TRUE) for (i in seq_along(along.with = data.dir)) { run <- data.dir[i] if (!dir.exists(paths = run)) { stop("Directory provided does not exist") } barcode.loc <- file.path(run, 'barcodes.tsv') gene.loc <- file.path(run, 'genes.tsv') features.loc <- file.path(run, 'features.tsv.gz') matrix.loc <- file.path(run, 'matrix.mtx') # Flag to indicate if this data is from CellRanger >= 3.0 pre_ver_3 <- file.exists(gene.loc) if (!pre_ver_3) { addgz <- function(s) { return(paste0(s, ".gz")) } barcode.loc <- addgz(s = barcode.loc) matrix.loc <- addgz(s = matrix.loc) } if (!file.exists(barcode.loc)) { stop("Barcode file missing. Expecting ", basename(path = barcode.loc)) } if (!pre_ver_3 && !file.exists(features.loc) ) { stop("Gene name or features file missing. Expecting ", basename(path = features.loc)) } if (!file.exists(matrix.loc)) { stop("Expression matrix file missing. Expecting ", basename(path = matrix.loc)) } data <- readMM(file = matrix.loc) if (has_dt) { cell.barcodes <- as.data.frame(data.table::fread(barcode.loc, header = FALSE)) } else { cell.barcodes <- read.table(file = barcode.loc, header = FALSE, sep = '\t', row.names = NULL) } if (ncol(x = cell.barcodes) > 1) { cell.names <- cell.barcodes[, cell.column] } else { cell.names <- readLines(con = barcode.loc) } if (all(grepl(pattern = "\\-1$", x = cell.names)) & strip.suffix) { cell.names <- as.vector(x = as.character(x = sapply( X = cell.names, FUN = ExtractField, field = 1, delim = "-" ))) } if (is.null(x = names(x = data.dir))) { if (length(x = data.dir) < 2) { colnames(x = data) <- cell.names } else { colnames(x = data) <- paste0(i, "_", cell.names) } } else { colnames(x = data) <- paste0(names(x = data.dir)[i], "_", cell.names) } if (has_dt) { feature.names <- as.data.frame(data.table::fread(ifelse(test = pre_ver_3, yes = gene.loc, no = features.loc), header = FALSE)) } else { feature.names <- read.delim( file = ifelse(test = pre_ver_3, yes = gene.loc, no = features.loc), header = FALSE, stringsAsFactors = FALSE ) } if (any(is.na(x = feature.names[, gene.column]))) { warning( 'Some features names are NA. Replacing NA names with ID from the opposite column requested', call. = FALSE, immediate. = TRUE ) na.features <- which(x = is.na(x = feature.names[, gene.column])) replacement.column <- ifelse(test = gene.column == 2, yes = 1, no = 2) feature.names[na.features, gene.column] <- feature.names[na.features, replacement.column] } if (unique.features) { fcols = ncol(x = feature.names) if (fcols < gene.column) { stop(paste0("gene.column was set to ", gene.column, " but feature.tsv.gz (or genes.tsv) only has ", fcols, " columns.", " Try setting the gene.column argument to a value <= to ", fcols, ".")) } rownames(x = data) <- make.unique(names = feature.names[, gene.column]) } # In cell ranger 3.0, a third column specifying the type of data was added # and we will return each type of data as a separate matrix if (ncol(x = feature.names) > 2) { data_types <- factor(x = feature.names$V3) lvls <- levels(x = data_types) if (length(x = lvls) > 1 && length(x = full.data) == 0) { message("10X data contains more than one type and is being returned as a list containing matrices of each type.") } expr_name <- "Gene Expression" if (expr_name %in% lvls) { # Return Gene Expression first lvls <- c(expr_name, lvls[-which(x = lvls == expr_name)]) } data <- lapply( X = lvls, FUN = function(l) { return(data[data_types == l, , drop = FALSE]) } ) names(x = data) <- lvls } else{ data <- list(data) } full.data[[length(x = full.data) + 1]] <- data } # Combine all the data from different directories into one big matrix, note this # assumes that all data directories essentially have the same features files list_of_data <- list() for (j in 1:length(x = full.data[[1]])) { list_of_data[[j]] <- do.call(cbind, lapply(X = full.data, FUN = `[[`, j)) # Fix for Issue #913 list_of_data[[j]] <- as.sparse(x = list_of_data[[j]]) } names(x = list_of_data) <- names(x = full.data[[1]]) # If multiple features, will return a list, otherwise # a matrix. if (length(x = list_of_data) == 1) { return(list_of_data[[1]]) } else { return(list_of_data) } } #' Read 10X hdf5 file #' #' Read count matrix from 10X CellRanger hdf5 file. #' This can be used to read both scATAC-seq and scRNA-seq matrices. #' #' @param filename Path to h5 file #' @param use.names Label row names with feature names rather than ID numbers. #' @param unique.features Make feature names unique (default TRUE) #' #' @return Returns a sparse matrix with rows and columns labeled. If multiple #' genomes are present, returns a list of sparse matrices (one per genome). #' #' @export #' @concept preprocessing #' Read10X_h5 <- function(filename, use.names = TRUE, unique.features = TRUE) { if (!requireNamespace('hdf5r', quietly = TRUE)) { stop("Please install hdf5r to read HDF5 files") } if (!file.exists(filename)) { stop("File not found") } infile <- hdf5r::H5File$new(filename = filename, mode = 'r') genomes <- names(x = infile) output <- list() if (hdf5r::existsGroup(infile, 'matrix')) { # cellranger version 3 if (use.names) { feature_slot <- 'features/name' } else { feature_slot <- 'features/id' } } else { if (use.names) { feature_slot <- 'gene_names' } else { feature_slot <- 'genes' } } for (genome in genomes) { counts <- infile[[paste0(genome, '/data')]] indices <- infile[[paste0(genome, '/indices')]] indptr <- infile[[paste0(genome, '/indptr')]] shp <- infile[[paste0(genome, '/shape')]] features <- infile[[paste0(genome, '/', feature_slot)]][] barcodes <- infile[[paste0(genome, '/barcodes')]] sparse.mat <- sparseMatrix( i = indices[] + 1, p = indptr[], x = as.numeric(x = counts[]), dims = shp[], repr = "T" ) if (unique.features) { features <- make.unique(names = features) } rownames(x = sparse.mat) <- features colnames(x = sparse.mat) <- barcodes[] sparse.mat <- as.sparse(x = sparse.mat) # Split v3 multimodal if (infile$exists(name = paste0(genome, '/features'))) { types <- infile[[paste0(genome, '/features/feature_type')]][] types.unique <- unique(x = types) if (length(x = types.unique) > 1) { message( "Genome ", genome, " has multiple modalities, returning a list of matrices for this genome" ) sparse.mat <- sapply( X = types.unique, FUN = function(x) { return(sparse.mat[which(x = types == x), ]) }, simplify = FALSE, USE.NAMES = TRUE ) } } output[[genome]] <- sparse.mat } infile$close_all() if (length(x = output) == 1) { return(output[[genome]]) } else{ return(output) } } #' Load a 10X Genomics Visium Image #' #' @param image.dir Path to directory with 10X Genomics visium image data; #' should include files \code{tissue_lowres_image.png}, #' \code{scalefactors_json.json} and \code{tissue_positions_list.csv} #' @param image.name PNG file to read in #' @param assay Name of associated assay #' @param slice Name for the image, used to populate the instance's key #' @param filter.matrix Filter spot/feature matrix to only include spots that #' have been determined to be over tissue #' @param image.type Image type to return, one of: "VisiumV1" or "VisiumV2" #' #' @return A \code{\link{VisiumV2}} object #' #' @seealso \code{\link{VisiumV2}} \code{\link{Load10X_Spatial}} #' #' @export #' @concept preprocessing #' Read10X_Image <- function( image.dir, image.name = "tissue_lowres_image.png", assay = "Spatial", slice = "slice1", filter.matrix = TRUE, image.type = "VisiumV2" ) { # Validate the `image.type` parameter. image.type <- match.arg(image.type, choices = c("VisiumV1", "VisiumV2")) # Read in the H&E stain image. image <- png::readPNG( source = file.path( image.dir, image.name ) ) # Read in the scale factors. scale.factors <- Read10X_ScaleFactors( filename = file.path(image.dir, "scalefactors_json.json") ) # Read in the tissue coordinates as a data.frame. coordinates <- Read10X_Coordinates( filename = Sys.glob(file.path(image.dir, "*tissue_positions*")), filter.matrix ) # Use the `slice` value to populate a Seurat-style identifier for the image. key <- Key(slice, quiet = TRUE) # Return the specified `image.type`. if (image.type == "VisiumV1") { visium.v1 <- new( Class = image.type, assay = assay, key = key, coordinates = coordinates, scale.factors = scale.factors, image = image ) # As of v5.1.0 `Radius.VisiumV1` no longer returns the value of the # `spot.radius` slot and instead calculates the value on the fly, but we # can populate the static slot in case it's depended on. visium.v1@spot.radius <- Radius(visium.v1) return(visium.v1) } # If `image.type` is not "VisiumV1" then it must be "VisiumV2". stopifnot(image.type == "VisiumV2") # Create an `sp` compatible `FOV` instance. fov <- CreateFOV( coordinates[, c("imagerow", "imagecol")], type = "centroids", radius = scale.factors[["spot"]], assay = assay, key = key ) # Build the final `VisiumV2` instance, essentially just adding `image` and # `scale.factors` to the `fov`. visium.v2 <- new( Class = "VisiumV2", boundaries = fov@boundaries, molecules = fov@molecules, assay = fov@assay, key = fov@key, image = image, scale.factors = scale.factors ) return(visium.v2) } #' Load 10X Genomics Visium Tissue Positions #' #' @param filename Path to a \code{tissue_positions_list.csv} file #' @param filter.matrix Filter spot/feature matrix to only include spots that #' have been determined to be over tissue #' #' @return A data.frame #' #' @export #' @concept preprocessing #' Read10X_Coordinates <- function(filename, filter.matrix) { # output columns names col.names <- c("barcodes", "tissue", "row", "col", "imagerow", "imagecol") # if the coordinate mappings are in a parquet file if (tools::file_ext(filename) == "parquet") { # `arrow` must be installed to read parquet files if (!requireNamespace("arrow", quietly = TRUE)) { stop("Please install arrow to read parquet files") } # read in coordinates and conver the resulting tibble into a data.frame coordinates <- as.data.frame(arrow::read_parquet(filename)) # normalize column names for consistency with other datatypes input.col.names <- c( "barcode", "in_tissue", "array_row", "array_col", "pxl_row_in_fullres", "pxl_col_in_fullres" ) col.map <- stats::setNames(col.names, input.col.names) colnames(coordinates) <- ifelse( colnames(coordinates) %in% names(col.map), col.map[colnames(coordinates)], colnames(coordinates) ) # set rownames to "barcodes" then drop the column rownames(coordinates) <- coordinates[["barcodes"]] coordinates[["barcodes"]] <- NULL } else { # the coordinate mappings must be in a CSV - read it in coordinates <- read.csv( file = filename, col.names = col.names, header = ifelse( # assume files calles "tissue_positions.csv" have headers, otherwise # assume they do not (i.e. "tissue_positions_list.csv") test = basename(filename) == "tissue_positions.csv", yes = TRUE, no = FALSE ), as.is = TRUE, row.names = 1 ) } # the `tissue` column should contain a boolean indicating whether or not a # spot sits on top of the the tissue sample - maybe filter spots that do not if (filter.matrix) { coordinates <- coordinates[which(coordinates$tissue == 1), , drop = FALSE] } return (coordinates) } #' Load 10X Genomics Visium Scale Factors #' #' @param filename Path to a \code{scalefactors_json.json} file #' #' @return A scalefactors object #' #' @export #' @concept preprocessing #' Read10X_ScaleFactors <- function(filename) { raw.data <- jsonlite::fromJSON(file.path(filename)) scale.factors <- scalefactors( spot = raw.data$spot_diameter_fullres, fiducial = raw.data$fiducial_diameter_fullres, hires = raw.data$tissue_hires_scalef, lowres = raw.data$tissue_lowres_scalef ) return (scale.factors) } #' Read and Load Akoya CODEX data #' #' @param filename Path to matrix generated by upstream processing. #' @param type Specify which type matrix is being provided. #' \itemize{ #' \item \dQuote{\code{processor}}: matrix generated by CODEX Processor #' \item \dQuote{\code{inform}}: matrix generated by inForm #' \item \dQuote{\code{qupath}}: matrix generated by QuPath #' } #' @param filter A pattern to filter features by; pass \code{NA} to #' skip feature filtering #' @param inform.quant When \code{type} is \dQuote{\code{inform}}, the #' quantification level to read in #' #' @return \code{ReadAkoya}: A list with some combination of the following values #' \itemize{ #' \item \dQuote{\code{matrix}}: a #' \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells #' are columns and features are rows #' \item \dQuote{\code{centroids}}: a data frame with cell centroid #' coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{metadata}}: a data frame with cell-level meta data; #' includes all columns in \code{filename} that aren't in #' \dQuote{\code{matrix}} or \dQuote{\code{centroids}} #' } #' When \code{type} is \dQuote{\code{inform}}, additional expression matrices #' are returned and named using their segmentation type (eg. #' \dQuote{nucleus}, \dQuote{membrane}). The \dQuote{Entire Cell} segmentation #' type is returned in the \dQuote{\code{matrix}} entry of the list #' #' @export #' #' @order 1 #' #' @concept preprocessing #' #' @template section-progressr #' #' @templateVar pkg data.table #' @template note-reqdpkg #' ReadAkoya <- function( filename, type = c('inform', 'processor', 'qupath'), filter = 'DAPI|Blank|Empty', inform.quant = c('mean', 'total', 'min', 'max', 'std') ) { if (!requireNamespace("data.table", quietly = TRUE)) { stop("Please install 'data.table' for this function") } # Check arguments if (!file.exists(filename)) { stop(paste("Can't file file:", filename)) } type <- tolower(x = type[1L]) type <- match.arg(arg = type) # outs <- list(matrix = NULL, centroids = NULL) ratio <- getOption(x = 'Seurat.input.sparse_ratio', default = 0.4) p <- progressor() # Preload matrix p(message = "Preloading Akoya matrix", class = 'sticky', amount = 0) sep <- switch(EXPR = type, 'inform' = '\t', ',') mtx <- data.table::fread( file = filename, sep = sep, data.table = FALSE, verbose = FALSE ) # Assemble outputs p( message = paste0("Parsing matrix in '", type, "' format"), class = 'sticky', amount = 0 ) outs <- switch( EXPR = type, 'processor' = { # Create centroids data frame p( message = 'Creating centroids coordinates', class = 'sticky', amount = 0 ) centroids <- data.frame( x = mtx[['x:x']], y = mtx[['y:y']], cell = as.character(x = mtx[['cell_id:cell_id']]), stringsAsFactors = FALSE ) rownames(x = mtx) <- as.character(x = mtx[['cell_id:cell_id']]) # Create metadata data frame p(message = 'Creating meta data', class = 'sticky', amount = 0) md <- mtx[, !grepl(pattern = '^cyc', x = colnames(x = mtx)), drop = FALSE] colnames(x = md) <- vapply( X = strsplit(x = colnames(x = md), split = ':'), FUN = '[[', FUN.VALUE = character(length = 1L), 2L ) # Create expression matrix p(message = 'Creating expression matrix', class = 'sticky', amount = 0) mtx <- mtx[, grepl(pattern = '^cyc', x = colnames(x = mtx)), drop = FALSE] colnames(x = mtx) <- vapply( X = strsplit(x = colnames(x = mtx), split = ':'), FUN = '[[', FUN.VALUE = character(length = 1L), 2L ) if (!is.na(x = filter)) { p( message = paste0("Filtering features with pattern '", filter, "'"), class = 'sticky', amount = 0 ) mtx <- mtx[, !grepl(pattern = filter, x = colnames(x = mtx)), drop = FALSE] } mtx <- t(x = mtx) if ((sum(mtx == 0) / length(x = mtx)) > ratio) { p( message = 'Converting expression to sparse matrix', class = 'sticky', amount = 0 ) mtx <- as.sparse(x = mtx) } list(matrix = mtx, centroids = centroids, metadata = md) }, 'inform' = { inform.quant <- tolower(x = inform.quant[1L]) inform.quant <- match.arg(arg = inform.quant) expr.key <- c( mean = 'Mean', total = 'Total', min = 'Min', max = 'Max', std = 'Std Dev' )[inform.quant] expr.pattern <- '\\(Normalized Counts, Total Weighting\\)' rownames(x = mtx) <- mtx[['Cell ID']] mtx <- mtx[, setdiff(x = colnames(x = mtx), y = 'Cell ID'), drop = FALSE] # Create centroids p( message = 'Creating centroids coordinates', class = 'sticky', amount = 0 ) centroids <- data.frame( x = mtx[['Cell X Position']], y = mtx[['Cell Y Position']], cell = rownames(x = mtx), stringsAsFactors = FALSE ) # Create metadata p(message = 'Creating meta data', class = 'sticky', amount = 0) cols <- setdiff( x = grep( pattern = expr.pattern, x = colnames(x = mtx), value = TRUE, invert = TRUE ), y = paste('Cell', c('X', 'Y'), 'Position') ) md <- mtx[, cols, drop = FALSE] # Create expression matrices exprs <- data.frame( cols = grep( pattern = paste(expr.key, expr.pattern), x = colnames(x = mtx), value = TRUE ) ) exprs$feature <- vapply( X = trimws(x = gsub( pattern = paste(expr.key, expr.pattern), replacement = '', x = exprs$cols )), FUN = function(x) { x <- unlist(x = strsplit(x = x, split = ' ')) x <- x[length(x = x)] return(gsub(pattern = '\\(|\\)', replacement = '', x = x)) }, FUN.VALUE = character(length = 1L) ) exprs$class <- tolower(x = vapply( X = strsplit(x = exprs$cols, split = ' '), FUN = '[[', FUN.VALUE = character(length = 1L), 1L )) classes <- unique(x = exprs$class) outs <- vector( mode = 'list', length = length(x = classes) + 2L ) names(x = outs) <- c( 'matrix', 'centroids', 'metadata', setdiff(x = classes, y = 'entire') ) outs$centroids <- centroids outs$metadata <- md # browser() for (i in classes) { p( message = paste( 'Creating', switch(EXPR = i, 'entire' = 'entire cell', i), 'expression matrix' ), class = 'sticky', amount = 0 ) df <- exprs[exprs$class == i, , drop = FALSE] expr <- mtx[, df$cols] colnames(x = expr) <- df$feature if (!is.na(x = filter)) { p( message = paste0("Filtering features with pattern '", filter, "'"), class = 'sticky', amount = 0 ) expr <- expr[, !grepl(pattern = filter, x = colnames(x = expr)), drop = FALSE] } expr <- t(x = expr) if ((sum(expr == 0, na.rm = TRUE) / length(x = expr)) > ratio) { p( message = paste( 'Converting', switch(EXPR = i, 'entire' = 'entire cell', i), 'expression to sparse matrix' ), class = 'sticky', amount = 0 ) expr <- as.sparse(x = expr) } outs[[switch(EXPR = i, 'entire' = 'matrix', i)]] <- expr } outs }, 'qupath' = { rownames(x = mtx) <- as.character(x = seq_len(length.out = nrow(x = mtx))) # Create centroids p( message = 'Creating centroids coordinates', class = 'sticky', amount = 0 ) xpos <- sort( x = grep(pattern = 'Centroid X', x = colnames(x = mtx), value = TRUE), decreasing = TRUE )[1L] ypos <- sort( x = grep(pattern = 'Centroid Y', x = colnames(x = mtx), value = TRUE), decreasing = TRUE )[1L] centroids <- data.frame( x = mtx[[xpos]], y = mtx[[ypos]], cell = rownames(x = mtx), stringsAsFactors = FALSE ) # Create metadata p(message = 'Creating meta data', class = 'sticky', amount = 0) cols <- setdiff( x = grep( pattern = 'Cell: Mean', x = colnames(x = mtx), ignore.case = TRUE, value = TRUE, invert = TRUE ), y = c(xpos, ypos) ) md <- mtx[, cols, drop = FALSE] # Create expression matrix p(message = 'Creating expression matrix', class = 'sticky', amount = 0) idx <- which(x = grepl( pattern = 'Cell: Mean', x = colnames(x = mtx), ignore.case = TRUE )) mtx <- mtx[, idx, drop = FALSE] colnames(x = mtx) <- vapply( X = strsplit(x = colnames(x = mtx), split = ':'), FUN = '[[', FUN.VALUE = character(length = 1L), 1L ) if (!is.na(x = filter)) { p( message = paste0("Filtering features with pattern '", filter, "'"), class = 'sticky', amount = 0 ) mtx <- mtx[, !grepl(pattern = filter, x = colnames(x = mtx)), drop = FALSE] } mtx <- t(x = mtx) if ((sum(mtx == 0) / length(x = mtx)) > ratio) { p( message = 'Converting expression to sparse matrix', class = 'sticky', amount = 0 ) mtx <- as.sparse(x = mtx) } list(matrix = mtx, centroids = centroids, metadata = md) }, stop("Unknown matrix type: ", type) ) return(outs) } #' Load in data from remote or local mtx files #' #' Enables easy loading of sparse data matrices #' #' @param mtx Name or remote URL of the mtx file #' @param cells Name or remote URL of the cells/barcodes file #' @param features Name or remote URL of the features/genes file #' @param cell.column Specify which column of cells file to use for cell names; default is 1 #' @param feature.column Specify which column of features files to use for feature/gene names; default is 2 #' @param cell.sep Specify the delimiter in the cell name file #' @param feature.sep Specify the delimiter in the feature name file #' @param skip.cell Number of lines to skip in the cells file before beginning to read cell names #' @param skip.feature Number of lines to skip in the features file before beginning to gene names #' @param mtx.transpose Transpose the matrix after reading in #' @param unique.features Make feature names unique (default TRUE) #' @param strip.suffix Remove trailing "-1" if present in all cell barcodes. #' #' @return A sparse matrix containing the expression data. #' #' @importFrom Matrix readMM #' @importFrom utils read.delim #' @importFrom httr build_url parse_url #' @importFrom tools file_ext #' #' #' @export #' @concept preprocessing #' #' @examples #' \dontrun{ #' # For local files: #' #' expression_matrix <- ReadMtx( #' mtx = "count_matrix.mtx.gz", features = "features.tsv.gz", #' cells = "barcodes.tsv.gz" #' ) #' seurat_object <- CreateSeuratObject(counts = expression_matrix) #' #' # For remote files: #' #' expression_matrix <- ReadMtx(mtx = "http://localhost/matrix.mtx", #' cells = "http://localhost/barcodes.tsv", #' features = "http://localhost/genes.tsv") #' seurat_object <- CreateSeuratObject(counts = data) #' } #' ReadMtx <- function( mtx, cells, features, cell.column = 1, feature.column = 2, cell.sep = "\t", feature.sep = "\t", skip.cell = 0, skip.feature = 0, mtx.transpose = FALSE, unique.features = TRUE, strip.suffix = FALSE ) { all.files <- list( "expression matrix" = mtx, "barcode list" = cells, "feature list" = features ) for (i in seq_along(along.with = all.files)) { uri <- tryCatch( expr = { con <- url(description = all.files[[i]]) close(con = con) all.files[[i]] }, error = function(...) { return(normalizePath(path = all.files[[i]], winslash = '/')) } ) err <- paste("Cannot find", names(x = all.files)[i], "at", uri) uri <- build_url(url = parse_url(url = uri)) if (grepl(pattern = '^[A-Z]?:///', x = uri)) { uri <- gsub(pattern = '^://', replacement = '', x = uri) if (!file.exists(uri)) { stop(err, call. = FALSE) } } else { if (!Online(url = uri, seconds = 2L)) { stop(err, call. = FALSE) } if (file_ext(uri) == 'gz') { con <- url(description = uri) uri <- gzcon(con = con, text = TRUE) } } all.files[[i]] <- uri } cell.barcodes <- read.table( file = all.files[['barcode list']], header = FALSE, sep = cell.sep, row.names = NULL, skip = skip.cell ) feature.names <- read.table( file = all.files[['feature list']], header = FALSE, sep = feature.sep, row.names = NULL, skip = skip.feature ) # read barcodes bcols <- ncol(x = cell.barcodes) if (bcols < cell.column) { stop( "cell.column was set to ", cell.column, " but ", cells, " only has ", bcols, " columns.", " Try setting the cell.column argument to a value <= to ", bcols, "." ) } cell.names <- cell.barcodes[, cell.column] if (all(grepl(pattern = "\\-1$", x = cell.names)) & strip.suffix) { cell.names <- as.vector(x = as.character(x = sapply( X = cell.names, FUN = ExtractField, field = 1, delim = "-" ))) } # read features fcols <- ncol(x = feature.names) if (fcols < feature.column) { stop( "feature.column was set to ", feature.column, " but ", features, " only has ", fcols, " column(s).", " Try setting the feature.column argument to a value <= to ", fcols, "." ) } if (any(is.na(x = feature.names[, feature.column]))) { na.features <- which(x = is.na(x = feature.names[, feature.column])) replacement.column <- ifelse(test = feature.column == 2, yes = 1, no = 2) if (replacement.column > fcols) { stop( "Some features names are NA in column ", feature.column, ". Try specifiying a different column.", call. = FALSE ) } else { warning( "Some features names are NA in column ", feature.column, ". Replacing NA names with ID from column ", replacement.column, ".", call. = FALSE ) } feature.names[na.features, feature.column] <- feature.names[na.features, replacement.column] } feature.names <- feature.names[, feature.column] if (unique.features) { feature.names <- make.unique(names = feature.names) } data <- readMM(file = all.files[['expression matrix']]) if (mtx.transpose) { data <- t(x = data) } if (length(x = cell.names) != ncol(x = data)) { stop( "Matrix has ", ncol(data), " columns but found ", length(cell.names), " barcodes. ", ifelse( test = length(x = cell.names) > ncol(x = data), yes = "Try increasing `skip.cell`. ", no = "" ), call. = FALSE ) } if (length(x = feature.names) != nrow(x = data)) { stop( "Matrix has ", nrow(data), " rows but found ", length(feature.names), " features. ", ifelse( test = length(x = feature.names) > nrow(x = data), yes = "Try increasing `skip.feature`. ", no = "" ), call. = FALSE ) } colnames(x = data) <- cell.names rownames(x = data) <- feature.names data <- as.sparse(x = data) return(data) } #' Read and Load Nanostring SMI data #' #' @param data.dir Directory containing all Nanostring SMI files with #' default filenames #' @param mtx.file Path to Nanostring cell x gene matrix CSV #' @param metadata.file Contains metadata including cell center, area, #' and stain intensities #' @param molecules.file Path to molecules file #' @param segmentations.file Path to segmentations CSV #' @param type Type of cell spatial coordinate matrices to read; choose one #' or more of: #' \itemize{ #' \item \dQuote{centroids}: cell centroids in pixel coordinate space #' \item \dQuote{segmentations}: cell segmentations in pixel coordinate space #' } #' @param mol.type Type of molecule spatial coordinate matrices to read; #' choose one or more of: #' \itemize{ #' \item \dQuote{pixels}: molecule coordinates in pixel space #' } #' @param metadata Type of available metadata to read; #' choose zero or more of: #' \itemize{ #' \item \dQuote{Area}: number of pixels in cell segmentation #' \item \dQuote{fov}: cell's fov #' \item \dQuote{Mean.MembraneStain}: mean membrane stain intensity #' \item \dQuote{Mean.DAPI}: mean DAPI stain intensity #' \item \dQuote{Mean.G}: mean green channel stain intensity #' \item \dQuote{Mean.Y}: mean yellow channel stain intensity #' \item \dQuote{Mean.R}: mean red channel stain intensity #' \item \dQuote{Max.MembraneStain}: max membrane stain intensity #' \item \dQuote{Max.DAPI}: max DAPI stain intensity #' \item \dQuote{Max.G}: max green channel stain intensity #' \item \dQuote{Max.Y}: max yellow stain intensity #' \item \dQuote{Max.R}: max red stain intensity #' } #' @param mols.filter Filter molecules that match provided string #' @param genes.filter Filter genes from cell x gene matrix that match #' provided string #' @param fov.filter Only load in select FOVs. Nanostring SMI data contains #' 30 total FOVs. #' @param subset.counts.matrix If the counts matrix should be built from #' molecule coordinates for a specific segmentation; One of: #' \itemize{ #' \item \dQuote{Nuclear}: nuclear segmentations #' \item \dQuote{Cytoplasm}: cell cytoplasm segmentations #' \item \dQuote{Membrane}: cell membrane segmentations #' } #' @param cell.mols.only If TRUE, only load molecules within a cell #' #' @return \code{ReadNanostring}: A list with some combination of the #' following values: #' \itemize{ #' \item \dQuote{\code{matrix}}: a #' \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells #' are columns and features are rows #' \item \dQuote{\code{centroids}}: a data frame with cell centroid #' coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{pixels}}: a data frame with molecule pixel coordinates #' in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} #' } #' #' @importFrom future.apply future_lapply #' #' @export #' #' @order 1 #' #' @concept preprocessing #' #' @template section-progressr #' @template section-future #' #' @templateVar pkg data.table #' @template note-reqdpkg #' ReadNanostring <- function( data.dir, mtx.file = NULL, metadata.file = NULL, molecules.file = NULL, segmentations.file = NULL, type = 'centroids', mol.type = 'pixels', metadata = NULL, mols.filter = NA_character_, genes.filter = NA_character_, fov.filter = NULL, subset.counts.matrix = NULL, cell.mols.only = TRUE ) { if (!requireNamespace("data.table", quietly = TRUE)) { stop("Please install 'data.table' for this function") } # Argument checking type <- match.arg( arg = type, choices = c('centroids', 'segmentations'), several.ok = TRUE ) mol.type <- match.arg( arg = mol.type, choices = c('pixels'), several.ok = TRUE ) if (!is.null(metadata)) { metadata <- match.arg( arg = metadata, choices = c( "Area", "fov", "Mean.MembraneStain", "Mean.DAPI", "Mean.G", "Mean.Y", "Mean.R", "Max.MembraneStain", "Max.DAPI", "Max.G", "Max.Y", "Max.R" ), several.ok = TRUE ) } use.dir <- all(vapply( X = c(mtx.file, metadata.file, molecules.file), FUN = function(x) { return(is.null(x = x) || is.na(x = x)) }, FUN.VALUE = logical(length = 1L) )) if (use.dir && !dir.exists(paths = data.dir)) { stop("Cannot find Nanostring directory ", data.dir) } # Identify input files files <- c( matrix = mtx.file %||% '[_a-zA-Z0-9]*_exprMat_file.csv', metadata.file = metadata.file %||% '[_a-zA-Z0-9]*_metadata_file.csv', molecules.file = molecules.file %||% '[_a-zA-Z0-9]*_tx_file.csv', segmentations.file = segmentations.file %||% '[_a-zA-Z0-9]*-polygons.csv' ) files <- vapply( X = files, FUN = function(x) { x <- as.character(x = x) if (isTRUE(x = dirname(path = x) == '.')) { fnames <- list.files( path = data.dir, pattern = x, recursive = FALSE, full.names = TRUE ) return(sort(x = fnames, decreasing = TRUE)[1L]) } else { return(x) } }, FUN.VALUE = character(length = 1L), USE.NAMES = TRUE ) files[!file.exists(files)] <- NA_character_ if (all(is.na(x = files))) { stop("Cannot find Nanostring input files in ", data.dir) } # Checking for loading spatial coordinates if (!is.na(x = files[['metadata.file']])) { pprecoord <- progressor() pprecoord( message = "Preloading cell spatial coordinates", class = 'sticky', amount = 0 ) md <- data.table::fread( file = files[['metadata.file']], sep = ',', data.table = FALSE, verbose = FALSE ) # filter metadata file by FOVs if (!is.null(x = fov.filter)) { md <- md[md$fov %in% fov.filter,] } pprecoord(type = 'finish') } if (!is.na(x = files[['segmentations.file']])) { ppresegs <- progressor() ppresegs( message = "Preloading cell segmentation vertices", class = 'sticky', amount = 0 ) segs <- data.table::fread( file = files[['segmentations.file']], sep = ',', data.table = FALSE, verbose = FALSE ) # filter metadata file by FOVs if (!is.null(x = fov.filter)) { segs <- segs[segs$fov %in% fov.filter,] } ppresegs(type = 'finish') } # Check for loading of molecule coordinates if (!is.na(x = files[['molecules.file']])) { ppremol <- progressor() ppremol( message = "Preloading molecule coordinates", class = 'sticky', amount = 0 ) mx <- data.table::fread( file = files[['molecules.file']], sep = ',', verbose = FALSE ) # filter molecules file by FOVs if (!is.null(x = fov.filter)) { mx <- mx[mx$fov %in% fov.filter,] } # Molecules outside of a cell have a cell_ID of 0 if (cell.mols.only) { mx <- mx[mx$cell_ID != 0,] } if (!is.na(x = mols.filter)) { ppremol( message = paste("Filtering molecules with pattern", mols.filter), class = 'sticky', amount = 0 ) mx <- mx[!grepl(pattern = mols.filter, x = mx$target), , drop = FALSE] } ppremol(type = 'finish') mols <- rep_len(x = files[['molecules.file']], length.out = length(x = mol.type)) names(x = mols) <- mol.type files <- c(files, mols) files <- files[setdiff(x = names(x = files), y = 'molecules.file')] } files <- files[!is.na(x = files)] outs <- list("matrix"=NULL, "pixels"=NULL, "centroids"=NULL) if (!is.null(metadata)) { outs <- append(outs, list("metadata" = NULL)) } if ("segmentations" %in% type) { outs <- append(outs, list("segmentations" = NULL)) } for (otype in names(x = outs)) { outs[[otype]] <- switch( EXPR = otype, 'matrix' = { ptx <- progressor() ptx(message = 'Reading counts matrix', class = 'sticky', amount = 0) if (!is.null(subset.counts.matrix)) { tx <- build.cellcomp.matrix(mols.df=mx, class=subset.counts.matrix) } else { tx <- data.table::fread( file = files[[otype]], sep = ',', data.table = FALSE, verbose = FALSE ) # Combination of Cell ID (for non-zero cell_IDs) and FOV are assumed to be unique. Used to create barcodes / rownames. bcs <- paste0(as.character(tx$cell_ID), "_", tx$fov) rownames(x = tx) <- bcs # remove all rows which represent counts of mols not assigned to a cell for each FOV tx <- tx[!tx$cell_ID == 0,] # filter fovs from counts matrix if (!is.null(x = fov.filter)) { tx <- tx[tx$fov %in% fov.filter,] } tx <- subset(tx, select = -c(fov, cell_ID)) } tx <- as.data.frame(t(x = as.matrix(x = tx))) if (!is.na(x = genes.filter)) { ptx( message = paste("Filtering genes with pattern", genes.filter), class = 'sticky', amount = 0 ) tx <- tx[!grepl(pattern = genes.filter, x = rownames(x = tx)), , drop = FALSE] } # only keep cells with counts greater than 0 tx <- tx[, which(colSums(tx) != 0)] ratio <- getOption(x = 'Seurat.input.sparse_ratio', default = 0.4) if ((sum(tx == 0) / length(x = tx)) > ratio) { ptx( message = 'Converting counts to sparse matrix', class = 'sticky', amount = 0 ) tx <- as.sparse(x = tx) } ptx(type = 'finish') tx }, 'centroids' = { pcents <- progressor() pcents( message = 'Creating centroid coordinates', class = 'sticky', amount = 0 ) pcents(type = 'finish') data.frame( x = md$CenterX_global_px, y = md$CenterY_global_px, cell = paste0(as.character(md$cell_ID), "_", md$fov), stringsAsFactors = FALSE ) }, 'segmentations' = { pcents <- progressor() pcents( message = 'Creating segmentation coordinates', class = 'sticky', amount = 0 ) pcents(type = 'finish') data.frame( x = segs$x_global_px, y = segs$y_global_px, cell = paste0(as.character(segs$cellID), "_", segs$fov), # cell_ID column in this file doesn't have an underscore stringsAsFactors = FALSE ) }, 'metadata' = { pmeta <- progressor() pmeta( message = 'Loading metadata', class = 'sticky', amount = 0 ) pmeta(type = 'finish') df <- md[,metadata] df$cell <- paste0(as.character(md$cell_ID), "_", md$fov) df }, 'pixels' = { ppixels <- progressor() ppixels( message = 'Creating pixel-level molecule coordinates', class = 'sticky', amount = 0 ) df <- data.frame( x = mx$x_global_px, y = mx$y_global_px, gene = mx$target, stringsAsFactors = FALSE ) ppixels(type = 'finish') df }, # 'microns' = { # pmicrons <- progressor() # pmicrons( # message = "Creating micron-level molecule coordinates", # class = 'sticky', # amount = 0 # ) # df <- data.frame( # x = mx$global_x, # y = mx$global_y, # gene = mx$gene, # stringsAsFactors = FALSE # ) # pmicrons(type = 'finish') # df # }, stop("Unknown Nanostring input type: ", outs[[otype]]) ) } return(outs) } #' Read and Load 10x Genomics Xenium in-situ data #' #' @param data.dir Directory containing all Xenium output files with #' default filenames #' @param outs Types of molecular outputs to read; choose one or more of: #' \itemize{ #' \item \dQuote{matrix}: the counts matrix #' \item \dQuote{microns}: molecule coordinates #' \item \dQuote{segmentation_method}: cell segmentation method (for runs which #' use multi-modal segmentation) #' } #' @param type Type of cell spatial coordinate matrices to read; choose one #' or more of: #' \itemize{ #' \item \dQuote{centroids}: cell centroids in pixel coordinate space #' \item \dQuote{segmentations}: cell segmentations in pixel coordinate space #' \item \dQuote{nucleus_segmentations}: nucleus segmentations in pixel coordinate space #' } #' @param mols.qv.threshold Remove transcript molecules with #' a QV less than this threshold. QV >= 20 is the standard threshold #' used to construct the cell x gene count matrix. #' #' @return \code{ReadXenium}: A list with some combination of the #' following values: #' \itemize{ #' \item \dQuote{\code{matrix}}: a #' \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells #' are columns and features are rows #' \item \dQuote{\code{centroids}}: a data frame with cell centroid #' coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{pixels}}: a data frame with molecule pixel coordinates #' in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} #' } #' #' #' @export #' @concept preprocessing #' ReadXenium <- function( data.dir, outs = c("segmentation_method", "matrix", "microns"), type = "centroids", mols.qv.threshold = 20, flip.xy = F ) { # Argument checking type <- match.arg( arg = type, choices = c("centroids", "segmentations", "nucleus_segmentations"), several.ok = TRUE ) outs <- match.arg( arg = outs, choices = c("segmentation_method", "matrix", "microns"), several.ok = TRUE ) outs <- c(outs, type) has_dt <- requireNamespace("data.table", quietly = TRUE) && requireNamespace("R.utils", quietly = TRUE) has_arrow <- requireNamespace("arrow", quietly = TRUE) has_hdf5r <- requireNamespace("hdf5r", quietly = TRUE) binary_to_string <- function(arrow_binary) { if(typeof(arrow_binary) == 'list') { unlist( lapply( arrow_binary, function(x) rawToChar(as.raw(strtoi(x, 16L))) ) ) } else { arrow_binary } } data <- sapply(outs, function(otype) { switch( EXPR = otype, 'matrix' = { pmtx <- progressor() pmtx(message = 'Reading counts matrix', class = 'sticky', amount = 0) for(option in Filter(function(x) x$req, list( list(filename = "cell_feature_matrix.h5", fn = Read10X_h5, req = has_hdf5r), list(filename = "cell_feature_matrix", fn = Read10X, req = TRUE) ))) { matrix <- try(suppressWarnings(option$fn(file.path(data.dir, option$filename)))) if(!inherits(matrix, "try-error")) { break } } if(!exists('matrix') || inherits(matrix, "try-error")) { stop("Xenium outputs were incomplete: missing cell_feature_matrix") } pmtx(type = "finish") matrix }, 'segmentation_method' = { psegs <- progressor() psegs( message = 'Loading cell metadata', class = 'sticky', amount = 0 ) col.use <- c( cell_id = 'cell', segmentation_method = 'segmentation_method' ) for(option in Filter(function(x) x$req, list( list( filename = "cells.parquet", fn = function(x) as.data.frame(arrow::read_parquet(x, col_select = names(col.use))), req = has_arrow ), list( filename = "cells.csv.gz", fn = function(x) data.table::fread(x, data.table = FALSE, stringsAsFactors = FALSE, select = names(col.use)), req = has_dt ), list(filename = "cells.csv.gz", fn = function(x) read.csv(x, stringsAsFactors = FALSE), req = TRUE) ))) { cell_seg <- try(suppressWarnings(option$fn(file.path(data.dir, option$filename))), silent = TRUE) if(!inherits(cell_seg, "try-error")) { break } } if(!exists('cell_seg') || inherits(cell_seg, "try-error") || length(intersect(names(col.use), colnames(cell_seg))) != 2) { warning('cells did not contain a segmentation_method column. Skipping...', call. = FALSE, immediate. = TRUE) NULL } else { cell_seg <- cell_seg[, names(col.use)] colnames(cell_seg) <- col.use cell_seg$cell <- binary_to_string(cell_seg$cell) psegs(type = 'finish') data.frame(segmentation_method = cell_seg$segmentation_method, row.names = cell_seg$cell) } }, 'centroids' = { pcents <- progressor() pcents( message = 'Loading cell centroids', class = 'sticky', amount = 0 ) col.use <- c( x_centroid = letters[24 + flip.xy], y_centroid = letters[25 - flip.xy], cell_id = 'cell' ) for(option in Filter(function(x) x$req, list( list( filename = "cells.parquet", fn = function(x) as.data.frame(arrow::read_parquet(x, col_select = names(col.use))), req = has_arrow ), list( filename = "cells.csv.gz", fn = function(x) data.table::fread(x, data.table = FALSE, stringsAsFactors = FALSE, select = names(col.use)), req = has_dt ), list(filename = "cells.csv.gz", fn = function(x) read.csv(x, stringsAsFactors = FALSE), req = TRUE) ))) { cell_info <- try(suppressWarnings(option$fn(file.path(data.dir, option$filename)))) if(!inherits(cell_info, "try-error")) { break } } if(!exists('cell_info') || inherits(cell_info, "try-error")) { stop("Xenium outputs were incomplete: missing cells") } cell_info$cell_id <- binary_to_string(cell_info$cell_id) cell_info <- cell_info[, names(col.use)] colnames(cell_info) <- col.use pcents(type = 'finish') cell_info }, 'segmentations' = { psegs <- progressor() psegs( message = 'Loading cell segmentations', class = 'sticky', amount = 0 ) for(option in Filter(function(x) x$req, list( list( filename = "cell_boundaries.parquet", fn = function(x) as.data.frame(arrow::read_parquet(x)), req = has_arrow ), list( filename = "cell_boundaries.csv.gz", fn = function(x) data.table::fread(x, data.table = FALSE, stringsAsFactors = FALSE), req = has_dt ), list(filename = "cell_boundaries.csv.gz", fn = function(x) read.csv(x, stringsAsFactors = FALSE), req = TRUE) ))) { cell_boundaries_df <- try(suppressWarnings(option$fn(file.path(data.dir, option$filename)))) if(!inherits(cell_boundaries_df, "try-error")) { break } } if(!exists('cell_boundaries_df') || inherits(cell_boundaries_df, "try-error")) { stop("Xenium outputs were incomplete: missing cell_boundaries") } colnames(cell_boundaries_df) <- c( 'cell', letters[24 + flip.xy], letters[25 - flip.xy] ) cell_boundaries_df$cell <- binary_to_string(cell_boundaries_df$cell) psegs(type = "finish") cell_boundaries_df }, 'nucleus_segmentations' = { psegs <- progressor() psegs( message = 'Loading nucleus segmentations', class = 'sticky', amount = 0 ) for(option in Filter(function(x) x$req, list( list( filename = "nucleus_boundaries.parquet", fn = function(x) as.data.frame(arrow::read_parquet(x)), req = has_arrow ), list( filename = "nucleus_boundaries.csv.gz", fn = function(x) data.table::fread(x, data.table = FALSE, stringsAsFactors = FALSE), req = has_dt ), list(filename = "nucleus_boundaries.csv.gz", fn = function(x) read.csv(x, stringsAsFactors = FALSE), req = TRUE) ))) { nucleus_boundaries_df <- try(suppressWarnings(option$fn(file.path(data.dir, option$filename)))) if(!inherits(nucleus_boundaries_df, "try-error")) { break } } if(!exists('nucleus_boundaries_df') || inherits(nucleus_boundaries_df, "try-error")) { stop("Xenium outputs were incomplete: missing nucleus_boundaries") } colnames(nucleus_boundaries_df) <- c( 'cell', letters[24 + flip.xy], letters[25 - flip.xy] ) nucleus_boundaries_df$cell <- binary_to_string(nucleus_boundaries_df$cell) psegs(type = "finish") nucleus_boundaries_df }, 'microns' = { pmicrons <- progressor() pmicrons( message = "Loading molecule coordinates", class = 'sticky', amount = 0 ) col.use = c( x_location = letters[24+flip.xy], y_location = letters[25-flip.xy], feature_name = 'gene' ) for(option in Filter(function(x) x$req, list( list( filename = "transcripts.parquet", fn = function(x) as.data.frame(arrow::read_parquet(x, col_select = names(col.use))), req = has_arrow ), list( filename = "transcripts.csv.gz", fn = function(x) data.table::fread(x, data.table = FALSE, select = names(col.use), stringsAsFactors = FALSE), req = has_dt ), list(filename = "transcripts.csv.gz", fn = function(x) read.csv(x, stringsAsFactors = FALSE), req = TRUE) ))) { transcripts <- try(suppressWarnings(option$fn(file.path(data.dir, option$filename)))) if(!inherits(transcripts, "try-error")) { break } } if(!exists('transcripts') || inherits(transcripts, "try-error")) { hint <- "" if(file.exists(file.path(data.dir, "transcripts.parquet"))) { hint <- ". Xenium outputs no longer include `transcripts.csv.gz`. Instead, please install `arrow` to read transcripts.parquet" } stop(paste0("Xenium outputs were incomplete: missing transcripts", hint)) } transcripts <- transcripts[, names(col.use)] colnames(transcripts) <- col.use transcripts$gene <- binary_to_string(transcripts$gene) pmicrons(type = 'finish') transcripts }, stop("Unknown Xenium input type: ", otype) ) }, simplify = FALSE, USE.NAMES = TRUE) metadata <- file.path(data.dir, "experiment.xenium") if(file.exists(metadata) && requireNamespace("jsonlite", quietly = TRUE)) { meta <- jsonlite::read_json(metadata) data$metadata <- meta[ intersect( names(meta), c( 'run_start_time', 'preservation_method', 'panel_name', 'panel_organism', 'panel_tissue_type', 'instrument_sw_version', 'segmentation_stain' ) ) ] } return(data) } #' Load Slide-seq spatial data #' #' @param coord.file Path to csv file containing bead coordinate positions #' @param assay Name of assay to associate image to #' #' @return A \code{\link{SlideSeq}} object #' #' @importFrom utils read.csv #' #' @seealso \code{\link{SlideSeq}} #' #' @export #' @concept preprocessing #' ReadSlideSeq <- function(coord.file, assay = 'Spatial') { if (!file.exists(paths = coord.file)) { stop("Cannot find coord file ", coord.file, call. = FALSE) } slide.seq <- new( Class = 'SlideSeq', assay = assay, coordinates = read.csv( file = coord.file, header = TRUE, as.is = TRUE, row.names = 1 ) ) return(slide.seq) } #' Read Data From Vitessce #' #' Read in data from Vitessce-formatted JSON files #' #' @param counts Path or URL to a Vitessce-formatted JSON file with #' expression data; should end in \dQuote{\code{.genes.json}} or #' \dQuote{\code{.clusters.json}}; pass \code{NULL} to skip #' @param coords Path or URL to a Vitessce-formatted JSON file with cell/spot #' spatial coordinates; should end in \dQuote{\code{.cells.json}}; #' pass \code{NULL} to skip #' @param molecules Path or URL to a Vitessce-formatted JSON file with molecule #' spatial coordinates; should end in \dQuote{\code{.molecules.json}}; #' pass \code{NULL} to skip #' @param type Type of cell/spot spatial coordinates to return, #' choose one or more from: #' \itemize{ #' \item \dQuote{segmentations} cell/spot segmentations #' \item \dQuote{centroids} cell/spot centroids #' } #' @param filter A character to filter molecules by, pass \code{NA} to skip #' molecule filtering #' #' @return \code{ReadVitessce}: A list with some combination of the #' following values: #' \itemize{ #' \item \dQuote{\code{counts}}: if \code{counts} is not \code{NULL}, an #' expression matrix with cells as columns and features as rows #' \item \dQuote{\code{centroids}}: if \code{coords} is not \code{NULL} and #' \code{type} is contains\dQuote{centroids}, a data frame with cell centroids #' in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{segmentations}}: if \code{coords} is not \code{NULL} and #' \code{type} contains \dQuote{centroids}, a data frame with cell #' segmentations in three columns: \dQuote{x}, \dQuote{y} and \dQuote{cell} #' \item \dQuote{\code{molecules}}: if \code{molecules} is not \code{NULL}, a #' data frame with molecule spatial coordinates in three columns: \dQuote{x}, #' \dQuote{y}, and \dQuote{gene} #' } #' #' @importFrom jsonlite read_json #' @importFrom tools file_ext file_path_sans_ext #' #' @export #' #' @order 1 #' #' @concept preprocessing #' #' @template section-progressr #' #' @templateVar pkg jsonlite #' @template note-reqdpkg #' #' @examples #' \dontrun{ #' coords <- ReadVitessce( #' counts = #' "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/wang/wang.genes.json", #' coords = #' "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/wang/wang.cells.json", #' molecules = #' "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/wang/wang.molecules.json" #' ) #' names(coords) #' coords$counts[1:10, 1:10] #' head(coords$centroids) #' head(coords$segmentations) #' head(coords$molecules) #' } #' ReadVitessce <- function( counts = NULL, coords = NULL, molecules = NULL, type = c('segmentations', 'centroids'), filter = NA_character_ ) { if (!requireNamespace('jsonlite', quietly = TRUE)) { stop("Please install 'jsonlite' for this function") } type <- match.arg(arg = type, several.ok = TRUE) nouts <- c( counts %iff% 'counts', coords %iff% type, molecules %iff% 'molecules' ) outs <- vector(mode = 'list', length = length(x = nouts)) names(x = outs) <- nouts if (!is.null(x = coords)) { ppreload <- progressor() ppreload(message = "Preloading coordinates", class = 'sticky', amount = 0) cells <- read_json(path = coords) ppreload(type = 'finish') } for (i in nouts) { outs[[i]] <- switch( EXPR = i, 'counts' = { counts.type <- file_ext(x = basename(path = file_path_sans_ext( x = counts ))) cts <- switch( EXPR = counts.type, 'clusters' = .ReadVitessceClusters(counts = counts), 'genes' = .ReadVitessceGenes(counts = counts), stop("Unknown Vitessce counts filetype: '", counts.type, "'") ) pcts <- progressor() if (!is.na(x = filter)) { pcts( message = paste("Filtering genes with pattern", filter), class = 'sticky', amount = 0 ) cts <- cts[!grepl(pattern = filter, x = rownames(x = cts)), , drop = FALSE] } ratio <- getOption(x = 'Seurat.input.sparse_ratio', default = 0.4) if ((sum(cts == 0) / length(x = cts)) > ratio) { pcts( message = 'Converting counts to sparse matrix', class = 'sticky', amount = 0 ) cts <- as.sparse(x = cts) } pcts(type = 'finish') cts }, 'centroids' = { pcents <- progressor(steps = length(x = cells)) pcents(message = "Reading centroids", class = 'sticky', amount = 0) centroids <- lapply( X = names(x = cells), FUN = function(x) { cents <- cells[[x]]$xy names(x = cents) <- c('x', 'y') cents <- as.data.frame(x = cents) cents$cell <- x pcents() return(cents) } ) pcents(type = 'finish') do.call(what = 'rbind', args = centroids) }, 'segmentations' = { psegs <- progressor(steps = length(x = cells)) psegs(message = "Reading segmentations", class = 'sticky', amount = 0) segmentations <- lapply( X = names(x = cells), FUN = function(x) { poly <- cells[[x]]$poly poly <- lapply(X = poly, FUN = unlist) poly <- as.data.frame(x = do.call(what = 'rbind', args = poly)) colnames(x = poly) <- c('x', 'y') poly$cell <- x psegs() return(poly) } ) psegs(type = 'finish') do.call(what = 'rbind', args = segmentations) }, 'molecules' = { pmols1 <- progressor() pmols1(message = "Reading molecules", class = 'sticky', amount = 0) pmols1(type = 'finish') mols <- read_json(path = molecules) pmols2 <- progressor(steps = length(x = mols)) mols <- lapply( X = names(x = mols), FUN = function(m) { x <- mols[[m]] x <- lapply(X = x, FUN = unlist) x <- as.data.frame(x = do.call(what = 'rbind', args = x)) colnames(x = x) <- c('x', 'y') x$gene <- m pmols2() return(x) } ) mols <- do.call(what = 'rbind', args = mols) pmols2(type = 'finish') if (!is.na(x = filter)) { pmols3 <- progressor() pmols3( message = paste("Filtering molecules with pattern", filter), class = 'sticky', amount = 0 ) pmols3(type = 'finish') mols <- mols[!grepl(pattern = filter, x = mols$gene), , drop = FALSE] } mols }, stop("Unknown data type: ", i) ) } return(outs) } #' Read and Load MERFISH Input from Vizgen #' #' Read and load in MERFISH data from Vizgen-formatted files #' #' @inheritParams ReadVitessce #' @param data.dir Path to the directory with Vizgen MERFISH files; requires at #' least one of the following files present: #' \itemize{ #' \item \dQuote{\code{cell_by_gene.csv}}: used for reading count matrix #' \item \dQuote{\code{cell_metadata.csv}}: used for reading cell spatial #' coordinate matrices #' \item \dQuote{\code{detected_transcripts.csv}}: used for reading molecule #' spatial coordinate matrices #' } #' @param transcripts Optional file path for counts matrix; pass \code{NA} to #' suppress reading counts matrix #' @param spatial Optional file path for spatial metadata; pass \code{NA} to #' suppress reading spatial coordinates. If \code{spatial} is provided and #' \code{type} is \dQuote{segmentations}, uses \code{dirname(spatial)} instead of #' \code{data.dir} to find HDF5 files #' @param molecules Optional file path for molecule coordinates file; pass #' \code{NA} to suppress reading spatial molecule information #' @param type Type of cell spatial coordinate matrices to read; choose one #' or more of: #' \itemize{ #' \item \dQuote{segmentations}: cell segmentation vertices; requires #' \href{https://cran.r-project.org/package=hdf5r}{\pkg{hdf5r}} to be #' installed and requires a directory \dQuote{\code{cell_boundaries}} within #' \code{data.dir}. Within \dQuote{\code{cell_boundaries}}, there must be #' one or more HDF5 file named \dQuote{\code{feature_data_##.hdf5}} #' \item \dQuote{centroids}: cell centroids in micron coordinate space #' \item \dQuote{boxes}: cell box outlines in micron coordinate space #' } #' @param mol.type Type of molecule spatial coordinate matrices to read; #' choose one or more of: #' \itemize{ #' \item \dQuote{pixels}: molecule coordinates in pixel space #' \item \dQuote{microns}: molecule coordinates in micron space #' } #' @param metadata Type of available metadata to read; #' choose zero or more of: #' \itemize{ #' \item \dQuote{volume}: estimated cell volume #' \item \dQuote{fov}: cell's fov #' } #' @param z Z-index to load; must be between 0 and 6, inclusive #' #' @return \code{ReadVizgen}: A list with some combination of the #' following values: #' \itemize{ #' \item \dQuote{\code{transcripts}}: a #' \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells #' are columns and features are rows #' \item \dQuote{\code{segmentations}}: a data frame with cell polygon outlines in #' three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{centroids}}: a data frame with cell centroid #' coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{boxes}}: a data frame with cell box outlines in three #' columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} #' \item \dQuote{\code{microns}}: a data frame with molecule micron #' coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} #' \item \dQuote{\code{pixels}}: a data frame with molecule pixel coordinates #' in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} #' \item \dQuote{\code{metadata}}: a data frame with the cell-level metadata #' requested by \code{metadata} #' } #' #' @importFrom future.apply future_lapply #' #' @export #' #' @order 1 #' #' @concept preprocessing #' #' @template section-progressr #' @template section-future #' #' @templateVar pkg data.table #' @template note-reqdpkg #' ReadVizgen <- function( data.dir, transcripts = NULL, spatial = NULL, molecules = NULL, type = 'segmentations', mol.type = 'microns', metadata = NULL, filter = NA_character_, z = 3L ) { # TODO: handle multiple segmentations per z-plane if (!requireNamespace("data.table", quietly = TRUE)) { stop("Please install 'data.table' for this function") } # hdf5r is only used for loading polygon boundaries # Not needed for all Vizgen input hdf5 <- requireNamespace("hdf5r", quietly = TRUE) # Argument checking type <- match.arg( arg = type, choices = c('segmentations', 'centroids', 'boxes'), several.ok = TRUE ) mol.type <- match.arg( arg = mol.type, choices = c('pixels', 'microns'), several.ok = TRUE ) if (!is.null(x = metadata)) { metadata <- match.arg( arg = metadata, choices = c("volume", "fov"), several.ok = TRUE ) } if (!z %in% seq.int(from = 0L, to = 6L)) { stop("The z-index must be in the range [0, 6]") } use.dir <- all(vapply( X = c(transcripts, spatial, molecules), FUN = function(x) { return(is.null(x = x) || is.na(x = x)) }, FUN.VALUE = logical(length = 1L) )) if (use.dir && !dir.exists(paths = data.dir)) { stop("Cannot find Vizgen directory ", data.dir) } # Identify input files files <- c( transcripts = transcripts %||% 'cell_by_gene[_a-zA-Z0-9]*.csv', spatial = spatial %||% 'cell_metadata[_a-zA-Z0-9]*.csv', molecules = molecules %||% 'detected_transcripts[_a-zA-Z0-9]*.csv' ) files[is.na(x = files)] <- NA_character_ h5dir <- file.path( ifelse( test = dirname(path = files['spatial']) == '.', yes = data.dir, no = dirname(path = files['spatial']) ), 'cell_boundaries' ) zidx <- paste0('zIndex_', z) files <- vapply( X = files, FUN = function(x) { x <- as.character(x = x) if (isTRUE(x = dirname(path = x) == '.')) { fnames <- list.files( path = data.dir, pattern = x, recursive = FALSE, full.names = TRUE ) return(sort(x = fnames, decreasing = TRUE)[1L]) } else { return(x) } }, FUN.VALUE = character(length = 1L), USE.NAMES = TRUE ) files[!file.exists(files)] <- NA_character_ if (all(is.na(x = files))) { stop("Cannot find Vizgen input files in ", data.dir) } # Checking for loading spatial coordinates if (!is.na(x = files[['spatial']])) { pprecoord <- progressor() pprecoord( message = "Preloading cell spatial coordinates", class = 'sticky', amount = 0 ) sp <- data.table::fread( file = files[['spatial']], sep = ',', data.table = FALSE, verbose = FALSE # showProgress = progressr:::progressr_in_globalenv(action = 'query') # showProgress = verbose ) pprecoord(type = 'finish') rownames(x = sp) <- as.character(x = sp[, 1]) sp <- sp[, -1, drop = FALSE] # Check to see if we should load segmentations if ('segmentations' %in% type) { poly <- if (isFALSE(x = hdf5)) { warning( "Cannot find hdf5r; unable to load segmentation vertices", immediate. = TRUE ) FALSE } else if (!dir.exists(paths = h5dir)) { warning("Cannot find cell boundary H5 files", immediate. = TRUE) FALSE } else { TRUE } if (isFALSE(x = poly)) { type <- setdiff(x = type, y = 'segmentations') } } spatials <- rep_len(x = files[['spatial']], length.out = length(x = type)) names(x = spatials) <- type files <- c(files, spatials) files <- files[setdiff(x = names(x = files), y = 'spatial')] } else if (!is.null(x = metadata)) { warning( "metadata can only be loaded when spatial coordinates are loaded", immediate. = TRUE ) metadata <- NULL } # Check for loading of molecule coordinates if (!is.na(x = files[['molecules']])) { ppremol <- progressor() ppremol( message = "Preloading molecule coordinates", class = 'sticky', amount = 0 ) mx <- data.table::fread( file = files[['molecules']], sep = ',', verbose = FALSE # showProgress = verbose ) mx <- mx[mx$global_z == z, , drop = FALSE] if (!is.na(x = filter)) { ppremol( message = paste("Filtering molecules with pattern", filter), class = 'sticky', amount = 0 ) mx <- mx[!grepl(pattern = filter, x = mx$gene), , drop = FALSE] } ppremol(type = 'finish') mols <- rep_len(x = files[['molecules']], length.out = length(x = mol.type)) names(x = mols) <- mol.type files <- c(files, mols) files <- files[setdiff(x = names(x = files), y = 'molecules')] } files <- files[!is.na(x = files)] # Read input data outs <- vector(mode = 'list', length = length(x = files)) names(x = outs) <- names(x = files) if (!is.null(metadata)) { outs <- c(outs, list(metadata = NULL)) } for (otype in names(x = outs)) { outs[[otype]] <- switch( EXPR = otype, 'transcripts' = { ptx <- progressor() ptx(message = 'Reading counts matrix', class = 'sticky', amount = 0) tx <- data.table::fread( file = files[[otype]], sep = ',', data.table = FALSE, verbose = FALSE ) rownames(x = tx) <- as.character(x = tx[, 1]) tx <- t(x = as.matrix(x = tx[, -1, drop = FALSE])) if (!is.na(x = filter)) { ptx( message = paste("Filtering genes with pattern", filter), class = 'sticky', amount = 0 ) tx <- tx[!grepl(pattern = filter, x = rownames(x = tx)), , drop = FALSE] } ratio <- getOption(x = 'Seurat.input.sparse_ratio', default = 0.4) if ((sum(tx == 0) / length(x = tx)) > ratio) { ptx( message = 'Converting counts to sparse matrix', class = 'sticky', amount = 0 ) tx <- as.sparse(x = tx) } ptx(type = 'finish') tx }, 'centroids' = { pcents <- progressor() pcents( message = 'Creating centroid coordinates', class = 'sticky', amount = 0 ) pcents(type = 'finish') data.frame( x = sp$center_x, y = sp$center_y, cell = rownames(x = sp), stringsAsFactors = FALSE ) }, 'segmentations' = { ppoly <- progressor(steps = length(x = unique(x = sp$fov))) ppoly( message = "Creating polygon coordinates", class = 'sticky', amount = 0 ) pg <- future_lapply( X = unique(x = sp$fov), FUN = function(f, ...) { fname <- file.path(h5dir, paste0('feature_data_', f, '.hdf5')) if (!file.exists(fname)) { warning( "Cannot find HDF5 file for field of view ", f, immediate. = TRUE ) return(NULL) } hfile <- hdf5r::H5File$new(filename = fname, mode = 'r') on.exit(expr = hfile$close_all()) cells <- rownames(x = subset(x = sp, subset = fov == f)) df <- lapply( X = cells, FUN = function(x) { return(tryCatch( expr = { cc <- hfile[['featuredata']][[x]][[zidx]][['p_0']][['coordinates']]$read() cc <- as.data.frame(x = t(x = cc)) colnames(x = cc) <- c('x', 'y') cc$cell <- x cc }, error = function(...) { return(NULL) } )) } ) ppoly() return(do.call(what = 'rbind', args = df)) } ) ppoly(type = 'finish') pg <- do.call(what = 'rbind', args = pg) npg <- length(x = unique(x = pg$cell)) if (npg < nrow(x = sp)) { warning( nrow(x = sp) - npg, " cells missing polygon information", immediate. = TRUE ) } pg }, 'boxes' = { pbox <- progressor(steps = nrow(x = sp)) pbox(message = "Creating box coordinates", class = 'sticky', amount = 0) bx <- future_lapply( X = rownames(x = sp), FUN = function(cell) { row <- sp[cell, ] df <- expand.grid( x = c(row$min_x, row$max_x), y = c(row$min_y, row$max_y), cell = cell, KEEP.OUT.ATTRS = FALSE, stringsAsFactors = FALSE ) df <- df[c(1, 3, 4, 2), , drop = FALSE] pbox() return(df) } ) pbox(type = 'finish') do.call(what = 'rbind', args = bx) }, 'metadata' = { pmeta <- progressor() pmeta( message = 'Loading metadata', class = 'sticky', amount = 0 ) pmeta(type = 'finish') sp[, metadata, drop = FALSE] }, 'pixels' = { ppixels <- progressor() ppixels( message = 'Creating pixel-level molecule coordinates', class = 'sticky', amount = 0 ) df <- data.frame( x = mx$x, y = mx$y, gene = mx$gene, stringsAsFactors = FALSE ) # if (!is.na(x = filter)) { # ppixels( # message = paste("Filtering molecules with pattern", filter), # class = 'sticky', # amount = 0 # ) # df <- df[!grepl(pattern = filter, x = df$gene), , drop = FALSE] # } ppixels(type = 'finish') df }, 'microns' = { pmicrons <- progressor() pmicrons( message = "Creating micron-level molecule coordinates", class = 'sticky', amount = 0 ) df <- data.frame( x = mx$global_x, y = mx$global_y, gene = mx$gene, stringsAsFactors = FALSE ) # if (!is.na(x = filter)) { # pmicrons( # message = paste("Filtering molecules with pattern", filter), # class = 'sticky', # amount = 0 # ) # df <- df[!grepl(pattern = filter, x = df$gene), , drop = FALSE] # } pmicrons(type = 'finish') df }, stop("Unknown MERFISH input type: ", type) ) } return(outs) } #' Normalize raw data to fractions #' #' Normalize count data to relative counts per cell by dividing by the total #' per cell. Optionally use a scale factor, e.g. for counts per million (CPM) #' use \code{scale.factor = 1e6}. #' #' @param data Matrix with the raw count data #' @param scale.factor Scale the result. Default is 1 #' @param verbose Print progress #' @return Returns a matrix with the relative counts #' #' @importFrom methods as #' @importFrom Matrix colSums #' #' @export #' @concept preprocessing #' #' @examples #' mat <- matrix(data = rbinom(n = 25, size = 5, prob = 0.2), nrow = 5) #' mat #' mat_norm <- RelativeCounts(data = mat) #' mat_norm #' RelativeCounts <- function(data, scale.factor = 1, verbose = TRUE) { if (is.data.frame(x = data)) { data <- as.matrix(x = data) } if (!inherits(x = data, what = 'dgCMatrix')) { data <- as.sparse(x = data) } if (verbose) { cat("Performing relative-counts-normalization\n", file = stderr()) } norm.data <- data norm.data@x <- norm.data@x / rep.int(Matrix::colSums(norm.data), diff(norm.data@p)) * scale.factor return(norm.data) } #' Run the mark variogram computation on a given position matrix and expression #' matrix. #' #' Wraps the functionality of markvario from the spatstat package. #' #' @param spatial.location A 2 column matrix giving the spatial locations of #' each of the data points also in data #' @param data Matrix containing the data used as "marks" (e.g. gene expression) #' @param ... Arguments passed to markvario #' #' @importFrom spatstat.explore markvario #' @importFrom spatstat.geom ppp #' #' @export #' @concept preprocessing #' RunMarkVario <- function( spatial.location, data, ... ) { pp <- ppp( x = spatial.location[, 1], y = spatial.location[, 2], xrange = range(spatial.location[, 1]), yrange = range(spatial.location[, 2]) ) if (nbrOfWorkers() > 1) { chunks <- nbrOfWorkers() features <- rownames(x = data) features <- split( x = features, f = ceiling(x = seq_along(along.with = features) / (length(x = features) / chunks)) ) mv <- future_lapply(X = features, FUN = function(x) { pp[["marks"]] <- as.data.frame(x = t(x = data[x, ])) markvario(X = pp, normalise = TRUE, ...) }) mv <- unlist(x = mv, recursive = FALSE) names(x = mv) <- rownames(x = data) } else { pp[["marks"]] <- as.data.frame(x = t(x = data)) mv <- markvario(X = pp, normalise = TRUE, ...) } return(mv) } #' Compute Moran's I value. #' #' Wraps the functionality of the Moran.I function from the ape package. #' Weights are computed as 1/distance. #' #' @param data Expression matrix #' @param pos Position matrix #' @param verbose Display messages/progress #' #' @importFrom stats dist #' #' @export #' @concept preprocessing #' RunMoransI <- function(data, pos, verbose = TRUE) { mysapply <- sapply if (verbose) { message("Computing Moran's I") mysapply <- pbsapply } Rfast2.installed <- PackageCheck("Rfast2", error = FALSE) if (Rfast2.installed) { MyMoran <- Rfast2::moranI } else if (!PackageCheck('ape', error = FALSE)) { stop( "'RunMoransI' requires either Rfast2 or ape to be installed", call. = FALSE ) } else { MyMoran <- ape::Moran.I if (getOption('Seurat.Rfast2.msg', TRUE)) { message( "For a more efficient implementation of the Morans I calculation,", "\n(selection.method = 'moransi') please install the Rfast2 package", "\n--------------------------------------------", "\ninstall.packages('Rfast2')", "\n--------------------------------------------", "\nAfter installation of Rfast2, Seurat will automatically use the more ", "\nefficient implementation (no further action necessary).", "\nThis message will be shown once per session" ) options(Seurat.Rfast2.msg = FALSE) } } pos.dist <- dist(x = pos) pos.dist.mat <- as.matrix(x = pos.dist) # weights as 1/dist^2 weights <- 1/pos.dist.mat^2 diag(x = weights) <- 0 results <- mysapply(X = 1:nrow(x = data), FUN = function(x) { tryCatch( expr = MyMoran(data[x, ], weights), error = function(x) c(1,1,1,1) ) }) pcol <- ifelse(test = Rfast2.installed, yes = 2, no = 4) results <- data.frame( observed = unlist(x = results[1, ]), p.value = unlist(x = results[pcol, ]) ) rownames(x = results) <- rownames(x = data) return(results) } #' Sample UMI #' #' Downsample each cell to a specified number of UMIs. Includes #' an option to upsample cells below specified UMI as well. #' #' @param data Matrix with the raw count data #' @param max.umi Number of UMIs to sample to #' @param upsample Upsamples all cells with fewer than max.umi #' @param verbose Display the progress bar #' #' @importFrom methods as #' #' @return Matrix with downsampled data #' #' @export #' @concept preprocessing #' #' @examples #' data("pbmc_small") #' counts = as.matrix(x = GetAssayData(object = pbmc_small, assay = "RNA", slot = "counts")) #' downsampled = SampleUMI(data = counts) #' head(x = downsampled) #' SampleUMI <- function( data, max.umi = 1000, upsample = FALSE, verbose = FALSE ) { data <- as.sparse(x = data) if (length(x = max.umi) == 1) { new_data <- RunUMISampling( data = data, sample_val = max.umi, upsample = upsample, display_progress = verbose ) } else if (length(x = max.umi) != ncol(x = data)) { stop("max.umi vector not equal to number of cells") } else { new_data <- RunUMISamplingPerCell( data = data, sample_val = max.umi, upsample = upsample, display_progress = verbose ) } dimnames(x = new_data) <- dimnames(x = data) return(new_data) } #' Use regularized negative binomial regression to normalize UMI count data #' #' This function calls sctransform::vst. The sctransform package is available at #' https://github.com/satijalab/sctransform. #' Use this function as an alternative to the NormalizeData, #' FindVariableFeatures, ScaleData workflow. Results are saved in a new assay #' (named SCT by default) with counts being (corrected) counts, data being log1p(counts), #' scale.data being pearson residuals; sctransform::vst intermediate results are saved #' in misc slot of new assay. #' #' @param object UMI counts matrix #' @param cell.attr A metadata with cell attributes #' @param reference.SCT.model If not NULL, compute residuals for the object #' using the provided SCT model; supports only log_umi as the latent variable. #' If residual.features are not specified, compute for the top variable.features.n #' specified in the model which are also present in the object. If #' residual.features are specified, the variable features of the resulting SCT #' assay are set to the top variable.features.n in the model. #' @param do.correct.umi Place corrected UMI matrix in assay counts slot; default is TRUE #' @param ncells Number of subsampling cells used to build NB regression; default is 5000 #' @param residual.features Genes to calculate residual features for; default is NULL (all genes). #' If specified, will be set to VariableFeatures of the returned object. #' @param variable.features.n Use this many features as variable features after #' ranking by residual variance; default is 3000. Only applied if residual.features is not set. #' @param variable.features.rv.th Instead of setting a fixed number of variable features, #' use this residual variance cutoff; this is only used when \code{variable.features.n} #' is set to NULL; default is 1.3. Only applied if residual.features is not set. #' @param vars.to.regress Variables to regress out in a second non-regularized linear #' @param latent.data Extra data to regress out, should be cells x latent data #' regression. For example, percent.mito. Default is NULL #' @param do.scale Whether to scale residuals to have unit variance; default is FALSE #' @param do.center Whether to center residuals to have mean zero; default is TRUE #' @param clip.range Range to clip the residuals to; default is \code{c(-sqrt(n/30), sqrt(n/30))}, #' where n is the number of cells #' @param vst.flavor When set to 'v2' sets method = glmGamPoi_offset, n_cells=2000, #' and exclude_poisson = TRUE which causes the model to learn theta and intercept #' only besides excluding poisson genes from learning and regularization #' @param conserve.memory If set to TRUE the residual matrix for all genes is never #' created in full; useful for large data sets, but will take longer to run; #' this will also set return.only.var.genes to TRUE; default is FALSE #' @param return.only.var.genes If set to TRUE the scale.data matrices in output assay are #' subset to contain only the variable genes; default is TRUE #' @param seed.use Set a random seed. By default, sets the seed to 1448145. Setting #' NULL will not set a seed. #' @param verbose Whether to print messages and progress bars #' @param ... Additional parameters passed to \code{sctransform::vst} #' #' @return Returns a Seurat object with a new assay (named SCT by default) with #' counts being (corrected) counts, data being log1p(counts), scale.data being #' pearson residuals; sctransform::vst intermediate results are saved in misc #' slot of the new assay. #' #' @importFrom stats setNames #' @importFrom Matrix colSums #' @importFrom SeuratObject as.sparse #' @importFrom sctransform vst get_residual_var get_residuals correct_counts #' #' @seealso \code{\link[sctransform]{correct_counts}} \code{\link[sctransform]{get_residuals}} #' #' @rdname SCTransform #' @concept preprocessing #' @export #' SCTransform.default <- function( object, cell.attr, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = umi) / 30), sqrt(x = ncol(x = umi) / 30)), vst.flavor = 'v2', conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } vst.args <- list(...) object <- as.sparse(x = object) umi <- object # check for batch_var in meta data if ('batch_var' %in% names(x = vst.args)) { if (!(vst.args[['batch_var']] %in% colnames(x = cell.attr))) { stop('batch_var not found in seurat object meta data') } } # parameter checking when reference.SCT.model is set if (!is.null(x = reference.SCT.model) ) { if (inherits(x = reference.SCT.model, what = "SCTModel")) { reference.SCT.model <- SCTModel_to_vst(SCTModel = reference.SCT.model) } if (is.list(x = reference.SCT.model) & inherits(x = reference.SCT.model[[1]], what = "SCTModel")) { stop("reference.SCT.model must be one SCTModel rather than a list of SCTModel") } if ('latent_var' %in% names(x = vst.args)) { stop('custom latent variables are not supported when reference.SCT.model is given') } if (reference.SCT.model$model_str != 'y ~ log_umi') { stop('reference.SCT.model must be derived using default SCT regression formula, `y ~ log_umi`') } } # check for latent_var in meta data if ('latent_var' %in% names(x = vst.args)) { known.attr <- c('umi', 'gene', 'log_umi', 'log_gene', 'umi_per_gene', 'log_umi_per_gene') if (!all(vst.args[['latent_var']] %in% c(colnames(x = cell.attr), known.attr))) { stop('latent_var values are not from the set of cell attributes sctransform calculates by default and cannot be found in seurat object meta data') } } # check for vars.to.regress in meta data if (any(!vars.to.regress %in% colnames(x = cell.attr))) { stop('problem with second non-regularized linear regression; not all variables found in seurat object meta data; check vars.to.regress parameter') } if (any(c('cell_attr', 'verbosity', 'return_cell_attr', 'return_gene_attr', 'return_corrected_umi') %in% names(x = vst.args))) { warning( 'the following arguments will be ignored because they are set within this function:', paste( c( 'cell_attr', 'verbosity', 'return_cell_attr', 'return_gene_attr', 'return_corrected_umi' ), collapse = ', ' ), call. = FALSE, immediate. = TRUE ) } if (!is.null(x = vst.flavor) && !vst.flavor %in% c("v1", "v2")){ stop("vst.flavor can be 'v1' or 'v2'. Default is 'v2'") } if (!is.null(x = vst.flavor) && vst.flavor == "v1"){ vst.flavor <- NULL } vst.args[['vst.flavor']] <- vst.flavor vst.args[['umi']] <- umi vst.args[['cell_attr']] <- cell.attr vst.args[['verbosity']] <- as.numeric(x = verbose) * 1 vst.args[['return_cell_attr']] <- TRUE vst.args[['return_gene_attr']] <- TRUE vst.args[['return_corrected_umi']] <- do.correct.umi vst.args[['n_cells']] <- min(ncells, ncol(x = umi)) residual.type <- vst.args[['residual_type']] %||% 'pearson' res.clip.range <- vst.args[['res_clip_range']] %||% c(-sqrt(x = ncol(x = umi)), sqrt(x = ncol(x = umi))) # set sct normalization method if (!is.null( reference.SCT.model)) { sct.method <- "reference.model" } else if (!is.null(x = residual.features)) { sct.method <- "residual.features" } else if (conserve.memory) { sct.method <- "conserve.memory" } else { sct.method <- "default" } # set vst model vst.out <- switch( EXPR = sct.method, 'reference.model' = { if (verbose) { message("Using reference SCTModel to calculate pearson residuals") } do.center <- FALSE do.correct.umi <- FALSE vst.out <- reference.SCT.model clip.range <- vst.out$arguments$sct.clip.range cell_attr <- data.frame(log_umi = log10(x = colSums(umi))) rownames(cell_attr) <- colnames(x = umi) vst.out$cell_attr <- cell_attr all.features <- intersect( x = rownames(x = vst.out$gene_attr), y = rownames(x = umi) ) vst.out$gene_attr <- vst.out$gene_attr[all.features ,] vst.out$model_pars_fit <- vst.out$model_pars_fit[all.features,] vst.out }, 'residual.features' = { if (verbose) { message("Computing residuals for the ", length(x = residual.features), " specified features") } return.only.var.genes <- TRUE do.correct.umi <- FALSE vst.args[['return_corrected_umi']] <- FALSE vst.args[['residual_type']] <- 'none' vst.out <- do.call(what = 'vst', args = vst.args) vst.out$gene_attr$residual_variance <- NA_real_ vst.out }, 'conserve.memory' = { return.only.var.genes <- TRUE vst.args[['residual_type']] <- 'none' vst.out <- do.call(what = 'vst', args = vst.args) feature.variance <- get_residual_var( vst_out = vst.out, umi = umi, residual_type = residual.type, res_clip_range = res.clip.range ) vst.out$gene_attr$residual_variance <- NA_real_ vst.out$gene_attr[names(x = feature.variance), 'residual_variance'] <- feature.variance vst.out }, 'default' = { vst.out <- do.call(what = 'vst', args = vst.args) vst.out }) feature.variance <- vst.out$gene_attr[,"residual_variance"] names(x = feature.variance) <- rownames(x = vst.out$gene_attr) if (verbose) { message('Determine variable features') } feature.variance <- sort(x = feature.variance, decreasing = TRUE) if (!is.null(x = variable.features.n)) { top.features <- names(x = feature.variance)[1:min(variable.features.n, length(x = feature.variance))] } else { top.features <- names(x = feature.variance)[feature.variance >= variable.features.rv.th] } # get residuals vst.out <- switch( EXPR = sct.method, 'reference.model' = { if (is.null(x = residual.features)) { residual.features <- top.features } residual.features <- Reduce( f = intersect, x = list(residual.features, rownames(x = umi), rownames(x = vst.out$model_pars_fit)) ) residual.feature.mat <- get_residuals( vst_out = vst.out, umi = umi[residual.features, , drop = FALSE], verbosity = as.numeric(x = verbose)*2 ) vst.out$gene_attr <- vst.out$gene_attr[residual.features ,] ref.residuals.mean <- vst.out$gene_attr[,"residual_mean"] vst.out$y <- sweep( x = residual.feature.mat, MARGIN = 1, STATS = ref.residuals.mean, FUN = "-" ) vst.out }, 'residual.features' = { residual.features <- intersect( x = residual.features, y = rownames(x = vst.out$gene_attr) ) residual.feature.mat <- get_residuals( vst_out = vst.out, umi = umi[residual.features, , drop = FALSE], verbosity = as.numeric(x = verbose)*2 ) vst.out$y <- residual.feature.mat vst.out$gene_attr$residual_mean <- NA_real_ vst.out$gene_attr$residual_variance <- NA_real_ vst.out$gene_attr[residual.features, "residual_mean"] <- rowMeans2(x = vst.out$y) vst.out$gene_attr[residual.features, "residual_variance"] <- RowVar(x = vst.out$y) vst.out }, 'conserve.memory' = { vst.out$y <- get_residuals( vst_out = vst.out, umi = umi[top.features, ], residual_type = residual.type, res_clip_range = res.clip.range, verbosity = as.numeric(x = verbose)*2 ) vst.out$gene_attr$residual_mean <- NA_real_ vst.out$gene_attr[top.features, "residual_mean"] = rowMeans2(x = vst.out$y) if (do.correct.umi & residual.type == 'pearson') { vst.out$umi_corrected <- correct_counts( x = vst.out, umi = umi, verbosity = as.numeric(x = verbose) * 1 ) } vst.out }, 'default' = { if (return.only.var.genes) { vst.out$y <- vst.out$y[top.features, ] } vst.out }) scale.data <- vst.out$y # clip the residuals scale.data[scale.data < clip.range[1]] <- clip.range[1] scale.data[scale.data > clip.range[2]] <- clip.range[2] # 2nd regression scale.data <- ScaleData( scale.data, features = NULL, vars.to.regress = vars.to.regress, latent.data = latent.data, model.use = 'linear', use.umi = FALSE, do.scale = do.scale, do.center = do.center, scale.max = Inf, block.size = 750, min.cells.to.block = 3000, verbose = verbose ) vst.out$y <- scale.data vst.out$variable_features <- residual.features %||% top.features if (!do.correct.umi) { vst.out$umi_corrected <- umi } min_var <- vst.out$arguments$min_variance return(vst.out) } #' @rdname SCTransform #' @concept preprocessing #' @export #' @method SCTransform Assay #' SCTransform.Assay <- function( object, cell.attr, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object) / 30), sqrt(x = ncol(x = object) / 30)), vst.flavor = 'v2', conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (!is.null(reference.SCT.model)){ do.correct.umi <- FALSE do.center <- FALSE } umi <- GetAssayData(object = object, slot = 'counts') vst.out <- SCTransform(object = umi, cell.attr = cell.attr, reference.SCT.model = reference.SCT.model, do.correct.umi = do.correct.umi, ncells = ncells, residual.features = residual.features, variable.features.n = variable.features.n, variable.features.rv.th = variable.features.rv.th, vars.to.regress = vars.to.regress, latent.data = latent.data, do.scale = do.scale, do.center = do.center, clip.range = clip.range, vst.flavor = vst.flavor, conserve.memory = conserve.memory, return.only.var.genes = return.only.var.genes, seed.use = seed.use, verbose = verbose, ...) residual.type <- vst.out[['residual_type']] %||% 'pearson' sct.method <- vst.out[["sct.method"]] # create output assay and put (corrected) umi counts in count slot if (do.correct.umi & residual.type == 'pearson') { if (verbose) { message('Place corrected count matrix in counts slot') } assay.out <- CreateAssayObject(counts = vst.out$umi_corrected) vst.out$umi_corrected <- NULL } else { # TODO: restore once check.matrix is in SeuratObject # assay.out <- CreateAssayObject(counts = umi, check.matrix = FALSE) assay.out <- CreateAssayObject(counts = umi) } # set the variable genes VariableFeatures(object = assay.out) <- vst.out$variable_features # put log1p transformed counts in data assay.out <- SetAssayData( object = assay.out, slot = 'data', new.data = log1p(x = GetAssayData(object = assay.out, slot = 'counts')) ) scale.data <- vst.out$y assay.out <- SetAssayData( object = assay.out, slot = 'scale.data', new.data = scale.data ) vst.out$y <- NULL # save clip.range into vst model vst.out$arguments$sct.clip.range <- clip.range vst.out$arguments$sct.method <- sct.method Misc(object = assay.out, slot = 'vst.out') <- vst.out assay.out <- as(object = assay.out, Class = "SCTAssay") return(assay.out) } #' @param assay Name of assay to pull the count data from; default is 'RNA' #' @param new.assay.name Name for the new assay containing the normalized data; default is 'SCT' #' #' @rdname SCTransform #' @concept preprocessing #' @export #' @method SCTransform Seurat #' SCTransform.Seurat <- function( object, assay = "RNA", new.assay.name = 'SCT', reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object[[assay]]) / 30), sqrt(x = ncol(x = object[[assay]]) / 30)), vst.flavor = "v2", conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) { if (!is.null(x = seed.use)) { set.seed(seed = seed.use) } if (any(vars.to.regress %in% colnames(x = object[[]]))) { vars.to.regress.subset <- vars.to.regress[vars.to.regress %in% colnames(x = object[[]])] latent.data <- object[[vars.to.regress.subset]] } else { latent.data <- NULL } assay <- assay %||% DefaultAssay(object = object) if (assay == "SCT") { # if re-running SCTransform, use the RNA assay assay <- "RNA" warning("Running SCTransform on the RNA assay while default assay is SCT.") } if (verbose){ message("Running SCTransform on assay: ", assay) } cell.attr <- slot(object = object, name = 'meta.data')[colnames(object[[assay]]),] assay.data <- SCTransform(object = object[[assay]], cell.attr = cell.attr, reference.SCT.model = reference.SCT.model, do.correct.umi = do.correct.umi, ncells = ncells, residual.features = residual.features, variable.features.n = variable.features.n, variable.features.rv.th = variable.features.rv.th, vars.to.regress = vars.to.regress, latent.data = latent.data, do.scale = do.scale, do.center = do.center, clip.range = clip.range, vst.flavor = vst.flavor, conserve.memory = conserve.memory, return.only.var.genes = return.only.var.genes, seed.use = seed.use, verbose = verbose, ...) assay.data <- SCTAssay(assay.data, assay.orig = assay) slot(object = slot(object = assay.data, name = "SCTModel.list")[[1]], name = "umi.assay") <- assay object[[new.assay.name]] <- assay.data if (verbose) { message(paste("Set default assay to", new.assay.name)) } DefaultAssay(object = object) <- new.assay.name object <- LogSeuratCommand(object = object) return(object) } #' Subset a Seurat Object based on the Barcode Distribution Inflection Points #' #' This convenience function subsets a Seurat object based on calculated inflection points. #' #' See [CalculateBarcodeInflections()] to calculate inflection points and #' [BarcodeInflectionsPlot()] to visualize and test inflection point calculations. #' #' @param object Seurat object #' #' @return Returns a subsetted Seurat object. #' #' @export #' @concept preprocessing #' #' @author Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} #' @seealso \code{\link{CalculateBarcodeInflections}} \code{\link{BarcodeInflectionsPlot}} #' #' @examples #' data("pbmc_small") #' pbmc_small <- CalculateBarcodeInflections( #' object = pbmc_small, #' group.column = 'groups', #' threshold.low = 20, #' threshold.high = 30 #' ) #' SubsetByBarcodeInflections(object = pbmc_small) #' SubsetByBarcodeInflections <- function(object) { cbi.data <- Tool(object = object, slot = 'CalculateBarcodeInflections') if (is.null(x = cbi.data)) { stop("Barcode inflections not calculated, please run CalculateBarcodeInflections") } return(object[, cbi.data$cells_pass]) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param selection.method How to choose top variable features. Choose one of : #' \itemize{ #' \item \dQuote{\code{vst}}: First, fits a line to the relationship of #' log(variance) and log(mean) using local polynomial regression (loess). #' Then standardizes the feature values using the observed mean and #' expected variance (given by the fitted line). Feature variance is then #' calculated on the standardized values #' after clipping to a maximum (see clip.max parameter). #' \item \dQuote{\code{mean.var.plot}} (mvp): First, uses a function to #' calculate average expression (mean.function) and dispersion #' (dispersion.function) for each feature. Next, divides features into #' \code{num.bin} (default 20) bins based on their average expression, #' and calculates z-scores for dispersion within each bin. The purpose of #' this is to identify variable features while controlling for the #' strong relationship between variability and average expression #' \item \dQuote{\code{dispersion}} (disp): selects the genes with the #' highest dispersion values #' } #' @param loess.span (vst method) Loess span parameter used when fitting the #' variance-mean relationship #' @param clip.max (vst method) After standardization values larger than #' clip.max will be set to clip.max; default is 'auto' which sets this value to #' the square root of the number of cells #' @param mean.function Function to compute x-axis value (average expression). #' Default is to take the mean of the detected (i.e. non-zero) values #' @param dispersion.function Function to compute y-axis value (dispersion). #' Default is to take the standard deviation of all values #' @param num.bin Total number of bins to use in the scaled analysis (default #' is 20) #' @param binning.method Specifies how the bins should be computed. Available #' methods are: #' \itemize{ #' \item \dQuote{\code{equal_width}}: each bin is of equal width along the #' x-axis (default) #' \item \dQuote{\code{equal_frequency}}: each bin contains an equal number #' of features (can increase statistical power to detect overdispersed #' features at high expression values, at the cost of reduced resolution #' along the x-axis) #' } #' @param verbose show progress bar for calculations #' #' @rdname FindVariableFeatures #' @concept preprocessing #' @export #' FindVariableFeatures.V3Matrix <- function( object, selection.method = "vst", loess.span = 0.3, clip.max = 'auto', mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", verbose = TRUE, ... ) { CheckDots(...) if (!inherits(x = object, 'Matrix')) { object <- as(object = as.matrix(x = object), Class = 'Matrix') } if (!inherits(x = object, what = 'dgCMatrix')) { object <- as.sparse(x = object) } if (selection.method == "vst") { if (clip.max == 'auto') { clip.max <- sqrt(x = ncol(x = object)) } hvf.info <- data.frame(mean = rowMeans(x = object)) hvf.info$variance <- SparseRowVar2( mat = object, mu = hvf.info$mean, display_progress = verbose ) hvf.info$variance.expected <- 0 hvf.info$variance.standardized <- 0 not.const <- hvf.info$variance > 0 fit <- loess( formula = log10(x = variance) ~ log10(x = mean), data = hvf.info[not.const, ], span = loess.span ) hvf.info$variance.expected[not.const] <- 10 ^ fit$fitted # use c function to get variance after feature standardization hvf.info$variance.standardized <- SparseRowVarStd( mat = object, mu = hvf.info$mean, sd = sqrt(hvf.info$variance.expected), vmax = clip.max, display_progress = verbose ) colnames(x = hvf.info) <- paste0('vst.', colnames(x = hvf.info)) } else { if (!inherits(x = mean.function, what = 'function')) { stop("'mean.function' must be a function") } if (!inherits(x = dispersion.function, what = 'function')) { stop("'dispersion.function' must be a function") } feature.mean <- mean.function(object, verbose) feature.dispersion <- dispersion.function(object, verbose) names(x = feature.mean) <- names(x = feature.dispersion) <- rownames(x = object) feature.dispersion[is.na(x = feature.dispersion)] <- 0 feature.mean[is.na(x = feature.mean)] <- 0 data.x.breaks <- switch( EXPR = binning.method, 'equal_width' = num.bin, 'equal_frequency' = c( -1, quantile( x = feature.mean[feature.mean > 0], probs = seq.int(from = 0, to = 1, length.out = num.bin) ) ), stop("Unknown binning method: ", binning.method) ) data.x.bin <- cut(x = feature.mean, breaks = data.x.breaks) names(x = data.x.bin) <- names(x = feature.mean) mean.y <- tapply(X = feature.dispersion, INDEX = data.x.bin, FUN = mean) sd.y <- tapply(X = feature.dispersion, INDEX = data.x.bin, FUN = sd) feature.dispersion.scaled <- (feature.dispersion - mean.y[as.numeric(x = data.x.bin)]) / sd.y[as.numeric(x = data.x.bin)] names(x = feature.dispersion.scaled) <- names(x = feature.mean) hvf.info <- data.frame(feature.mean, feature.dispersion, feature.dispersion.scaled) rownames(x = hvf.info) <- rownames(x = object) colnames(x = hvf.info) <- paste0('mvp.', c('mean', 'dispersion', 'dispersion.scaled')) } return(hvf.info) } #' @param nfeatures Number of features to select as top variable features; #' only used when \code{selection.method} is set to \code{'dispersion'} or #' \code{'vst'} #' @param mean.cutoff A two-length numeric vector with low- and high-cutoffs for #' feature means #' @param dispersion.cutoff A two-length numeric vector with low- and high-cutoffs for #' feature dispersions #' #' @rdname FindVariableFeatures #' @concept preprocessing #' #' @importFrom utils head #' @export #' @method FindVariableFeatures Assay #' FindVariableFeatures.Assay <- function( object, selection.method = "vst", loess.span = 0.3, clip.max = 'auto', mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", nfeatures = 2000, mean.cutoff = c(0.1, 8), dispersion.cutoff = c(1, Inf), verbose = TRUE, ... ) { if (length(x = mean.cutoff) != 2 || length(x = dispersion.cutoff) != 2) { stop("Both 'mean.cutoff' and 'dispersion.cutoff' must be two numbers") } if (selection.method == "vst") { data <- GetAssayData(object = object, slot = "counts") # if (ncol(x = data) < 1 || nrow(x = data) < 1) { if (IsMatrixEmpty(x = data)) { warning("selection.method set to 'vst' but count slot is empty; will use data slot instead") data <- GetAssayData(object = object, slot = "data") } } else { data <- GetAssayData(object = object, slot = "data") } hvf.info <- FindVariableFeatures( object = data, selection.method = selection.method, loess.span = loess.span, clip.max = clip.max, mean.function = mean.function, dispersion.function = dispersion.function, num.bin = num.bin, binning.method = binning.method, verbose = verbose, ... ) object[[names(x = hvf.info)]] <- hvf.info hvf.info <- hvf.info[which(x = hvf.info[, 1, drop = TRUE] != 0), ] if (selection.method == "vst") { hvf.info <- hvf.info[order(hvf.info$vst.variance.standardized, decreasing = TRUE), , drop = FALSE] } else { hvf.info <- hvf.info[order(hvf.info$mvp.dispersion, decreasing = TRUE), , drop = FALSE] } selection.method <- switch( EXPR = selection.method, 'mvp' = 'mean.var.plot', 'disp' = 'dispersion', selection.method ) top.features <- switch( EXPR = selection.method, 'mean.var.plot' = { means.use <- (hvf.info[, 1] > mean.cutoff[1]) & (hvf.info[, 1] < mean.cutoff[2]) dispersions.use <- (hvf.info[, 3] > dispersion.cutoff[1]) & (hvf.info[, 3] < dispersion.cutoff[2]) rownames(x = hvf.info)[which(x = means.use & dispersions.use)] }, 'dispersion' = head(x = rownames(x = hvf.info), n = nfeatures), 'vst' = head(x = rownames(x = hvf.info), n = nfeatures), stop("Unkown selection method: ", selection.method) ) VariableFeatures(object = object) <- top.features vf.name <- ifelse( test = selection.method == 'vst', yes = 'vst', no = 'mvp' ) vf.name <- paste0(vf.name, '.variable') object[[vf.name]] <- rownames(x = object[[]]) %in% top.features return(object) } #' @rdname FindVariableFeatures #' @export #' @method FindVariableFeatures SCTAssay #' FindVariableFeatures.SCTAssay <- function( object, nfeatures = 2000, ... ) { if (length(x = slot(object = object, name = "SCTModel.list")) > 1) { stop("SCT assay is comprised of multiple SCT models. To change the variable features, please set manually with VariableFeatures<-", call. = FALSE) } feature.attr <- SCTResults(object = object, slot = "feature.attributes") nfeatures <- min(nfeatures, nrow(x = feature.attr)) top.features <- rownames(x = feature.attr)[order(feature.attr$residual_variance, decreasing = TRUE)[1:nfeatures]] VariableFeatures(object = object) <- top.features return(object) } #' @param assay Assay to use #' #' @rdname FindVariableFeatures #' @concept preprocessing #' @export #' @method FindVariableFeatures Seurat #' FindVariableFeatures.Seurat <- function( object, assay = NULL, selection.method = "vst", loess.span = 0.3, clip.max = 'auto', mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", nfeatures = 2000, mean.cutoff = c(0.1, 8), dispersion.cutoff = c(1, Inf), verbose = TRUE, ... ) { assay <- assay[1L] %||% DefaultAssay(object = object) assay <- match.arg(arg = assay, Assays(object = object)) assay.data <- FindVariableFeatures( object = object[[assay]], selection.method = selection.method, loess.span = loess.span, clip.max = clip.max, mean.function = mean.function, dispersion.function = dispersion.function, num.bin = num.bin, binning.method = binning.method, nfeatures = nfeatures, mean.cutoff = mean.cutoff, dispersion.cutoff = dispersion.cutoff, verbose = verbose, ... ) object[[assay]] <- assay.data if (inherits(x = object[[assay]], what = "SCTAssay")) { object <- GetResidual( object = object, assay = assay, features = VariableFeatures(object = assay.data), verbose = FALSE ) } object <- LogSeuratCommand(object = object) return(object) } #' @param object A Seurat object, assay, or expression matrix #' @param spatial.location Coordinates for each cell/spot/bead #' @param selection.method Method for selecting spatially variable features. #' \itemize{ #' \item \code{markvariogram}: See \code{\link{RunMarkVario}} for details #' \item \code{moransi}: See \code{\link{RunMoransI}} for details. #' } #' #' @param r.metric r value at which to report the "trans" value of the mark #' variogram #' @param x.cuts Number of divisions to make in the x direction, helps define #' the grid over which binning is performed #' @param y.cuts Number of divisions to make in the y direction, helps define #' the grid over which binning is performed #' @param verbose Print messages and progress #' #' @method FindSpatiallyVariableFeatures default #' @rdname FindSpatiallyVariableFeatures #' @concept preprocessing #' @concept spatial #' @export #' #' FindSpatiallyVariableFeatures.default <- function( object, spatial.location, selection.method = c('markvariogram', 'moransi'), r.metric = 5, x.cuts = NULL, y.cuts = NULL, verbose = TRUE, ... ) { # error check dimensions if (ncol(x = object) != nrow(x = spatial.location)) { stop("Please provide the same number of observations as spatial locations.") } if (!is.null(x = x.cuts) & !is.null(x = y.cuts)) { binned.data <- BinData( data = object, pos = spatial.location, x.cuts = x.cuts, y.cuts = y.cuts, verbose = verbose ) object <- binned.data$data spatial.location <- binned.data$pos } svf.info <- switch( EXPR = selection.method, 'markvariogram' = RunMarkVario( spatial.location = spatial.location, data = object ), 'moransi' = RunMoransI( data = object, pos = spatial.location, verbose = verbose ), stop("Invalid selection method. Please choose one of: markvariogram, moransi.") ) return(svf.info) } #' @param slot Slot in the Assay to pull data from #' @param features If provided, only compute on given features. Otherwise, #' compute for all features. #' @param nfeatures Number of features to mark as the top spatially variable. #' #' @method FindSpatiallyVariableFeatures Assay #' @rdname FindSpatiallyVariableFeatures #' @concept preprocessing #' @concept spatial #' @export #' FindSpatiallyVariableFeatures.Assay <- function( object, slot = "scale.data", spatial.location, selection.method = c('markvariogram', 'moransi'), features = NULL, r.metric = 5, x.cuts = NULL, y.cuts = NULL, nfeatures = nfeatures, verbose = TRUE, ... ) { features <- features %||% rownames(x = object) if (selection.method == "markvariogram" && "markvariogram" %in% names(x = Misc(object = object))) { features.computed <- names(x = Misc(object = object, slot = "markvariogram")) features <- features[! features %in% features.computed] } data <- GetAssayData(object = object, slot = slot) data <- as.matrix(x = data[features, ]) data <- data[RowVar(x = data) > 0, ] if (nrow(x = data) != 0) { svf.info <- FindSpatiallyVariableFeatures( object = data, spatial.location = spatial.location, selection.method = selection.method, r.metric = r.metric, x.cuts = x.cuts, y.cuts = y.cuts, verbose = verbose, ... ) } else { svf.info <- c() } if (selection.method == "markvariogram") { if ("markvariogram" %in% names(x = Misc(object = object))) { svf.info <- c(svf.info, Misc(object = object, slot = "markvariogram")) } suppressWarnings(expr = Misc(object = object, slot = "markvariogram") <- svf.info) svf.info <- ComputeRMetric(mv = svf.info, r.metric) svf.info <- svf.info[order(svf.info[, 1]), , drop = FALSE] } if (selection.method == "moransi") { colnames(x = svf.info) <- paste0("MoransI_", colnames(x = svf.info)) svf.info <- svf.info[order(svf.info[, 2], -abs(svf.info[, 1])), , drop = FALSE] } var.name <- paste0(selection.method, ".spatially.variable") var.name.rank <- paste0(var.name, ".rank") svf.info[[var.name]] <- FALSE svf.info[[var.name]][1:(min(nrow(x = svf.info), nfeatures))] <- TRUE svf.info[[var.name.rank]] <- 1:nrow(x = svf.info) object[[names(x = svf.info)]] <- svf.info return(object) } #' @param assay Assay to pull the features (marks) from #' @param image Name of image to pull the coordinates from #' #' @method FindSpatiallyVariableFeatures Seurat #' @rdname FindSpatiallyVariableFeatures #' @concept preprocessing #' @concept spatial #' @export #' FindSpatiallyVariableFeatures.Seurat <- function( object, assay = NULL, slot = "scale.data", features = NULL, image = NULL, selection.method = c('markvariogram', 'moransi'), r.metric = 5, x.cuts = NULL, y.cuts = NULL, nfeatures = 2000, verbose = TRUE, ... ) { assay <- assay %||% DefaultAssay(object = object) features <- features %||% rownames(x = object[[assay]]) image <- image %||% DefaultImage(object = object) tc <- GetTissueCoordinates(object = object[[image]]) # check if markvariogram has been run on necessary features # only run for new ones object[[assay]] <- FindSpatiallyVariableFeatures( object = object[[assay]], slot = slot, features = features, spatial.location = tc, selection.method = selection.method, r.metric = r.metric, x.cuts = x.cuts, y.cuts = y.cuts, nfeatures = nfeatures, verbose = verbose, ... ) object <- LogSeuratCommand(object = object) } #' @rdname LogNormalize #' @method LogNormalize data.frame #' @export #' LogNormalize.data.frame <- function( data, scale.factor = 1e4, margin = 2L, verbose = TRUE, ... ) { return(LogNormalize( data = as.matrix(x = data), scale.factor = scale.factor, verbose = verbose, ... )) } #' @rdname LogNormalize #' @method LogNormalize V3Matrix #' @export #' LogNormalize.V3Matrix <- function( data, scale.factor = 1e4, margin = 2L, verbose = TRUE, ... ) { # if (is.data.frame(x = data)) { # data <- as.matrix(x = data) # } if (!inherits(x = data, what = 'dgCMatrix')) { data <- as(object = data, Class = "dgCMatrix") } # call Rcpp function to normalize if (verbose) { cat("Performing log-normalization\n", file = stderr()) } norm.data <- LogNorm(data, scale_factor = scale.factor, display_progress = verbose) colnames(x = norm.data) <- colnames(x = data) rownames(x = norm.data) <- rownames(x = data) return(norm.data) } #' @importFrom future.apply future_lapply #' @importFrom future nbrOfWorkers #' #' @param normalization.method Method for normalization. #' \itemize{ #' \item \dQuote{\code{LogNormalize}}: Feature counts for each cell are #' divided by the total counts for that cell and multiplied by the #' \code{scale.factor}. This is then natural-log transformed using \code{log1p} #' \item \dQuote{\code{CLR}}: Applies a centered log ratio transformation #' \item \dQuote{\code{RC}}: Relative counts. Feature counts for each cell #' are divided by the total counts for that cell and multiplied by the #' \code{scale.factor}. No log-transformation is applied. For counts per #' million (CPM) set \code{scale.factor = 1e6} #' } #' @param scale.factor Sets the scale factor for cell-level normalization #' @param margin If performing CLR normalization, normalize across features (1) or cells (2) # @param across If performing CLR normalization, normalize across either "features" or "cells". #' @param block.size How many cells should be run in each chunk, will try to split evenly across threads #' @param verbose display progress bar for normalization procedure #' #' @rdname NormalizeData #' @concept preprocessing #' @export #' NormalizeData.V3Matrix <- function( object, normalization.method = "LogNormalize", scale.factor = 1e4, margin = 1, block.size = NULL, verbose = TRUE, ... ) { CheckDots(...) if (is.null(x = normalization.method)) { return(object) } normalized.data <- if (nbrOfWorkers() > 1) { norm.function <- switch( EXPR = normalization.method, 'LogNormalize' = LogNormalize, 'CLR' = CustomNormalize, 'RC' = RelativeCounts, stop("Unknown normalization method: ", normalization.method) ) if (normalization.method != 'CLR') { margin <- 2 } tryCatch( expr = Parenting(parent.find = 'Seurat', margin = margin), error = function(e) { invisible(x = NULL) } ) dsize <- switch( EXPR = margin, '1' = nrow(x = object), '2' = ncol(x = object), stop("'margin' must be 1 or 2") ) chunk.points <- ChunkPoints( dsize = dsize, csize = block.size %||% ceiling(x = dsize / nbrOfWorkers()) ) normalized.data <- future_lapply( X = 1:ncol(x = chunk.points), FUN = function(i) { block <- chunk.points[, i] data <- if (margin == 1) { object[block[1]:block[2], , drop = FALSE] } else { object[, block[1]:block[2], drop = FALSE] } clr_function <- function(x) { return(log1p(x = x / (exp(x = sum(log1p(x = x[x > 0]), na.rm = TRUE) / length(x = x))))) } args <- list( data = data, scale.factor = scale.factor, verbose = FALSE, custom_function = clr_function, margin = margin ) args <- args[names(x = formals(fun = norm.function))] return(do.call( what = norm.function, args = args )) } ) do.call( what = switch( EXPR = margin, '1' = 'rbind', '2' = 'cbind', stop("'margin' must be 1 or 2") ), args = normalized.data ) } else { switch( EXPR = normalization.method, 'LogNormalize' = LogNormalize( data = object, scale.factor = scale.factor, verbose = verbose ), 'CLR' = CustomNormalize( data = object, custom_function = function(x) { return(log1p(x = x / (exp(x = sum(log1p(x = x[x > 0]), na.rm = TRUE) / length(x = x))))) }, margin = margin, verbose = verbose # across = across ), 'RC' = RelativeCounts( data = object, scale.factor = scale.factor, verbose = verbose ), stop("Unkown normalization method: ", normalization.method) ) } return(normalized.data) } #' @rdname NormalizeData #' @concept preprocessing #' @export #' @method NormalizeData Assay #' NormalizeData.Assay <- function( object, normalization.method = "LogNormalize", scale.factor = 1e4, margin = 1, verbose = TRUE, ... ) { object <- SetAssayData( object = object, slot = 'data', new.data = NormalizeData( object = GetAssayData(object = object, slot = 'counts'), normalization.method = normalization.method, scale.factor = scale.factor, verbose = verbose, margin = margin, ... ) ) return(object) } #' @param assay Name of assay to use #' #' @rdname NormalizeData #' @concept preprocessing #' @export #' @method NormalizeData Seurat #' #' @examples #' \dontrun{ #' data("pbmc_small") #' pbmc_small #' pmbc_small <- NormalizeData(object = pbmc_small) #' } #' NormalizeData.Seurat <- function( object, assay = NULL, normalization.method = "LogNormalize", scale.factor = 1e4, margin = 1, verbose = TRUE, ... ) { assay <- assay %||% DefaultAssay(object = object) assay.data <- NormalizeData( object = object[[assay]], normalization.method = normalization.method, scale.factor = scale.factor, verbose = verbose, margin = margin, ... ) object[[assay]] <- assay.data object <- LogSeuratCommand(object = object) return(object) } #' @importFrom future nbrOfWorkers #' #' @param features Vector of features names to scale/center. Default is variable features. #' @param vars.to.regress Variables to regress out (previously latent.vars in #' RegressOut). For example, nUMI, or percent.mito. #' @param latent.data Extra data to regress out, should be cells x latent data #' @param split.by Name of variable in object metadata or a vector or factor defining #' grouping of cells. See argument \code{f} in \code{\link[base]{split}} for more details #' @param model.use Use a linear model or generalized linear model #' (poisson, negative binomial) for the regression. Options are 'linear' #' (default), 'poisson', and 'negbinom' #' @param use.umi Regress on UMI count data. Default is FALSE for linear #' modeling, but automatically set to TRUE if model.use is 'negbinom' or 'poisson' #' @param do.scale Whether to scale the data. #' @param do.center Whether to center the data. #' @param scale.max Max value to return for scaled data. The default is 10. #' Setting this can help reduce the effects of features that are only expressed in #' a very small number of cells. If regressing out latent variables and using a #' non-linear model, the default is 50. #' @param block.size Default size for number of features to scale at in a single #' computation. Increasing block.size may speed up calculations but at an #' additional memory cost. #' @param min.cells.to.block If object contains fewer than this number of cells, #' don't block for scaling calculations. #' @param verbose Displays a progress bar for scaling procedure #' #' @importFrom future.apply future_lapply #' #' @rdname ScaleData #' @concept preprocessing #' @export #' ScaleData.default <- function( object, features = NULL, vars.to.regress = NULL, latent.data = NULL, split.by = NULL, model.use = 'linear', use.umi = FALSE, do.scale = TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, verbose = TRUE, ... ) { CheckDots(...) features <- features %||% rownames(x = object) features <- as.vector(x = intersect(x = features, y = rownames(x = object))) object <- object[features, , drop = FALSE] object.names <- dimnames(x = object) min.cells.to.block <- min(min.cells.to.block, ncol(x = object)) suppressWarnings(expr = Parenting( parent.find = "ScaleData.Assay", features = features, min.cells.to.block = min.cells.to.block )) split.by <- split.by %||% TRUE split.cells <- split(x = colnames(x = object), f = split.by) CheckGC() if (!is.null(x = vars.to.regress)) { if (is.null(x = latent.data)) { latent.data <- data.frame(row.names = colnames(x = object)) } else { latent.data <- latent.data[colnames(x = object), , drop = FALSE] rownames(x = latent.data) <- colnames(x = object) } if (any(vars.to.regress %in% rownames(x = object))) { latent.data <- cbind( latent.data, t(x = object[vars.to.regress[vars.to.regress %in% rownames(x = object)], , drop=FALSE]) ) } # Currently, RegressOutMatrix will do nothing if latent.data = NULL notfound <- setdiff(x = vars.to.regress, y = colnames(x = latent.data)) if (length(x = notfound) == length(x = vars.to.regress)) { stop( "None of the requested variables to regress are present in the object.", call. = FALSE ) } else if (length(x = notfound) > 0) { warning( "Requested variables to regress not in object: ", paste(notfound, collapse = ", "), call. = FALSE, immediate. = TRUE ) vars.to.regress <- colnames(x = latent.data) } if (verbose) { message("Regressing out ", paste(vars.to.regress, collapse = ', ')) } chunk.points <- ChunkPoints(dsize = nrow(x = object), csize = block.size) if (nbrOfWorkers() > 1) { # TODO: lapply chunks <- expand.grid( names(x = split.cells), 1:ncol(x = chunk.points), stringsAsFactors = FALSE ) object <- future_lapply( X = 1:nrow(x = chunks), FUN = function(i) { row <- chunks[i, ] group <- row[[1]] index <- as.numeric(x = row[[2]]) return(RegressOutMatrix( data.expr = object[chunk.points[1, index]:chunk.points[2, index], split.cells[[group]], drop = FALSE], latent.data = latent.data[split.cells[[group]], , drop = FALSE], features.regress = features, model.use = model.use, use.umi = use.umi, verbose = FALSE )) } ) if (length(x = split.cells) > 1) { merge.indices <- lapply( X = 1:length(x = split.cells), FUN = seq.int, to = length(x = object), by = length(x = split.cells) ) object <- lapply( X = merge.indices, FUN = function(x) { return(do.call(what = 'rbind', args = object[x])) } ) object <- do.call(what = 'cbind', args = object) } else { object <- do.call(what = 'rbind', args = object) } } else { object <- lapply( X = names(x = split.cells), FUN = function(x) { if (verbose && length(x = split.cells) > 1) { message("Regressing out variables from split ", x) } return(RegressOutMatrix( data.expr = object[, split.cells[[x]], drop = FALSE], latent.data = latent.data[split.cells[[x]], , drop = FALSE], features.regress = features, model.use = model.use, use.umi = use.umi, verbose = verbose )) } ) object <- do.call(what = 'cbind', args = object) } dimnames(x = object) <- object.names CheckGC() } if (verbose && (do.scale || do.center)) { msg <- paste( na.omit(object = c( ifelse(test = do.center, yes = 'centering', no = NA_character_), ifelse(test = do.scale, yes = 'scaling', no = NA_character_) )), collapse = ' and ' ) msg <- paste0( toupper(x = substr(x = msg, start = 1, stop = 1)), substr(x = msg, start = 2, stop = nchar(x = msg)), ' data matrix' ) message(msg) } if (inherits(x = object, what = c('dgCMatrix', 'dgTMatrix'))) { scale.function <- FastSparseRowScale } else { object <- as.matrix(x = object) scale.function <- FastRowScale } if (nbrOfWorkers() > 1) { blocks <- ChunkPoints(dsize = length(x = features), csize = block.size) chunks <- expand.grid( names(x = split.cells), 1:ncol(x = blocks), stringsAsFactors = FALSE ) scaled.data <- future_lapply( X = 1:nrow(x = chunks), FUN = function(index) { row <- chunks[index, ] group <- row[[1]] block <- as.vector(x = blocks[, as.numeric(x = row[[2]])]) arg.list <- list( mat = object[features[block[1]:block[2]], split.cells[[group]], drop = FALSE], scale = do.scale, center = do.center, scale_max = scale.max, display_progress = FALSE ) arg.list <- arg.list[intersect(x = names(x = arg.list), y = names(x = formals(fun = scale.function)))] data.scale <- do.call(what = scale.function, args = arg.list) dimnames(x = data.scale) <- dimnames(x = object[features[block[1]:block[2]], split.cells[[group]]]) suppressWarnings(expr = data.scale[is.na(x = data.scale)] <- 0) CheckGC() return(data.scale) } ) if (length(x = split.cells) > 1) { merge.indices <- lapply( X = 1:length(x = split.cells), FUN = seq.int, to = length(x = scaled.data), by = length(x = split.cells) ) scaled.data <- lapply( X = merge.indices, FUN = function(x) { return(suppressWarnings(expr = do.call(what = 'rbind', args = scaled.data[x]))) } ) scaled.data <- suppressWarnings(expr = do.call(what = 'cbind', args = scaled.data)) } else { suppressWarnings(expr = scaled.data <- do.call(what = 'rbind', args = scaled.data)) } } else { scaled.data <- matrix( data = NA_real_, nrow = nrow(x = object), ncol = ncol(x = object), dimnames = object.names ) max.block <- ceiling(x = length(x = features) / block.size) for (x in names(x = split.cells)) { if (verbose) { if (length(x = split.cells) > 1 && (do.scale || do.center)) { message(gsub(pattern = 'matrix', replacement = 'from split ', x = msg), x) } pb <- txtProgressBar(min = 0, max = max.block, style = 3, file = stderr()) } for (i in 1:max.block) { my.inds <- ((block.size * (i - 1)):(block.size * i - 1)) + 1 my.inds <- my.inds[my.inds <= length(x = features)] arg.list <- list( mat = object[features[my.inds], split.cells[[x]], drop = FALSE], scale = do.scale, center = do.center, scale_max = scale.max, display_progress = FALSE ) arg.list <- arg.list[intersect(x = names(x = arg.list), y = names(x = formals(fun = scale.function)))] data.scale <- do.call(what = scale.function, args = arg.list) dimnames(x = data.scale) <- dimnames(x = object[features[my.inds], split.cells[[x]]]) scaled.data[features[my.inds], split.cells[[x]]] <- data.scale rm(data.scale) CheckGC() if (verbose) { setTxtProgressBar(pb = pb, value = i) } } if (verbose) { close(con = pb) } } } dimnames(x = scaled.data) <- object.names scaled.data[is.na(x = scaled.data)] <- 0 CheckGC() return(scaled.data) } #' @rdname ScaleData #' @concept preprocessing #' @export #' @method ScaleData IterableMatrix #' ScaleData.IterableMatrix <- function( object, features = NULL, do.scale = TRUE, do.center = TRUE, scale.max = 10, ... ) { features <- features %||% rownames(x = object) features <- as.vector(x = intersect(x = features, y = rownames(x = object))) object <- object[features, , drop = FALSE] if (do.center) { features.mean <- BPCells::matrix_stats( matrix = object, row_stats = 'mean')$row_stats['mean',] } else { features.mean <- 0 } if (do.scale) { features.sd <- sqrt(BPCells::matrix_stats( matrix = object, row_stats = 'variance')$row_stats['variance',]) features.sd[features.sd == 0] <- 0.01 } else { features.sd <- 1 } if (scale.max != Inf) { object <- BPCells::min_by_row(mat = object, vals = scale.max * features.sd + features.mean) } scaled.data <- (object - features.mean) / features.sd return(scaled.data) } #' @rdname ScaleData #' @concept preprocessing #' @export #' @method ScaleData Assay #' ScaleData.Assay <- function( object, features = NULL, vars.to.regress = NULL, latent.data = NULL, split.by = NULL, model.use = 'linear', use.umi = FALSE, do.scale = TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, verbose = TRUE, ... ) { use.umi <- ifelse(test = model.use != 'linear', yes = TRUE, no = use.umi) slot.use <- ifelse(test = use.umi, yes = 'counts', no = 'data') features <- features %||% VariableFeatures(object) if (length(x = features) == 0) { features <- rownames(x = GetAssayData(object = object, slot = slot.use)) } object <- SetAssayData( object = object, slot = 'scale.data', new.data = ScaleData( object = GetAssayData(object = object, slot = slot.use), features = features, vars.to.regress = vars.to.regress, latent.data = latent.data, split.by = split.by, model.use = model.use, use.umi = use.umi, do.scale = do.scale, do.center = do.center, scale.max = scale.max, block.size = block.size, min.cells.to.block = min.cells.to.block, verbose = verbose, ... ) ) suppressWarnings(expr = Parenting( parent.find = "ScaleData.Seurat", features = features, min.cells.to.block = min.cells.to.block, use.umi = use.umi )) return(object) } #' @param assay Name of Assay to scale #' #' @rdname ScaleData #' @concept preprocessing #' @export #' @method ScaleData Seurat #' ScaleData.Seurat <- function( object, features = NULL, assay = NULL, vars.to.regress = NULL, split.by = NULL, model.use = 'linear', use.umi = FALSE, do.scale = TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, verbose = TRUE, ... ) { assay <- assay[1L] %||% DefaultAssay(object = object) assay <- match.arg(arg = assay, choices = Assays(object = object)) if (any(vars.to.regress %in% colnames(x = object[[]]))) { latent.data <- object[[vars.to.regress[vars.to.regress %in% colnames(x = object[[]])]]] } else { latent.data <- NULL } if (is.character(x = split.by) && length(x = split.by) == 1) { split.by <- object[[split.by]] } assay.data <- ScaleData( # object = assay.data, object = object[[assay]], features = features, vars.to.regress = vars.to.regress, latent.data = latent.data, split.by = split.by, model.use = model.use, use.umi = use.umi, do.scale = do.scale, do.center = do.center, scale.max = scale.max, block.size = block.size, min.cells.to.block = min.cells.to.block, verbose = verbose, ... ) object[[assay]] <- assay.data object <- LogSeuratCommand(object = object) return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Read Vitessce Expression Data #' #' @inheritParams ReadVitessce #' #' @return An expression matrix with cells as columns and features as rows #' #' @name vitessce-helpers #' @rdname vitessce-helpers #' #' @importFrom jsonlite read_json #' #' @keywords internal #' #' @noRd #' .ReadVitessceGenes <- function(counts) { p1 <- progressor() p1( message = "Reading counts in Vitessce genes format", class = 'sticky', amount = 0 ) p1(type = 'finish') cts <- read_json(path = counts) p2 <- progressor(steps = length(x = cts)) cts <- lapply( X = names(x = cts), FUN = function(x) { expr <- cts[[x]]$cells expr <- as.matrix(x = expr) colnames(x = expr) <- x p2() return(expr) } ) p2(type = 'finish') cts <- Reduce( f = function(x, y) { a <- merge(x = x, y = y, by = 0, all = TRUE) rownames(x = a) <- a$Row.names a$Row.names <- NULL return(as.matrix(x = a)) }, x = cts ) cts[is.na(x = cts)] <- 0 return(t(x = cts)) } #' @name vitessce-helpers #' @rdname vitessce-helpers #' #' @importFrom jsonlite read_json #' #' @keywords internal #' #' @noRd #' .ReadVitessceClusters <- function(counts) { p1 <- progressor() p1( message = "Reading counts in Vitessce clusters format", class = 'sticky', amount = 0 ) p1(type = 'finish') cts <- read_json(path = counts) # p2 <- progressor(steps = length(x = cts)) cells <- unlist(x = cts$cols) features <- unlist(x = cts$rows) cts <- lapply(X = cts[['matrix']], FUN = unlist) cts <- t(x = as.data.frame(x = cts)) dimnames(x = cts) <- list(features, cells) return(cts) } #' @name nanostring-helpers #' @rdname nanostring-helpers #' #' @return data frame containing counts for cells based on a single class of segmentation (eg Nuclear) #' #' @keywords internal #' #' @noRd #' build.cellcomp.matrix <- function(mols.df, class=NULL) { if (!is.null(class)) { if (!(class %in% c("Nuclear", "Membrane", "Cytoplasm"))) { stop(paste("Cannot subset matrix based on segmentation:", class)) } mols.df <- mols.df[mols.df$CellComp == class,] # subset based on cell class } mols.df$bc <- paste0(as.character(mols.df$cell_ID), "_", as.character(mols.df$fov)) ncol <- length(unique(mols.df$target)) nrow <- length(unique(mols.df$bc)) # will mols.df already have a cell barcode column at this point mtx <- matrix(data=rep(0, nrow*ncol), nrow=nrow, ncol=ncol) colnames(mtx) <- unique(mols.df$target) rownames(mtx) <- unique(mols.df$bc) for (row in 1:nrow(mols.df)) { mol <- mols.df[row, "target"] bc <- mols.df[row, "bc"] mtx[bc, mol] <- mtx[bc, mol] + 1 } return(as.data.frame(mtx)) } # Bin spatial regions into grid and average expression values # # @param dat Expression data # @param pos Position information/coordinates for each sample # @param x.cuts Number of cuts to make in the x direction (defines grid along # with y.cuts) # @param y.cuts Number of cuts to make in the y direction # # @return returns a list with positions as centers of the bins and average # expression within the bins # #' @importFrom Matrix rowMeans # BinData <- function(data, pos, x.cuts = 10, y.cuts = x.cuts, verbose = TRUE) { if (verbose) { message("Binning spatial data") } pos$x.cuts <- cut(x = pos[, 1], breaks = x.cuts) pos$y.cuts <- cut(x = pos[, 2], breaks = y.cuts) pos$bin <- paste0(pos$x.cuts, "_", pos$y.cuts) all.bins <- unique(x = pos$bin) new.pos <- matrix(data = numeric(), nrow = length(x = all.bins), ncol = 2) new.dat <- matrix(data = numeric(), nrow = nrow(x = data), ncol = length(x = all.bins)) for(i in 1:length(x = all.bins)) { samples <- rownames(x = pos)[which(x = pos$bin == all.bins[i])] dat <- data[, samples] if (is.null(x = dim(x = dat))) { new.dat[, i] <- dat } else { new.dat[, i] <- rowMeans(data[, samples]) } new.pos[i, 1] <- mean(pos[samples, "x"]) new.pos[i, 2] <- mean(pos[samples, "y"]) } rownames(x = new.dat) <- rownames(x = data) colnames(x = new.dat) <- all.bins rownames(x = new.pos) <- all.bins colnames(x = new.pos) <- colnames(x = pos)[1:2] return(list(data = new.dat, pos = new.pos)) } # Sample classification from MULTI-seq # # Identify singlets, doublets and negative cells from multiplexing experiments. # # @param data Data frame with the raw count data (cell x tags) # @param q Scale the data. Default is 1e4 # # @return Returns a named vector with demultiplexed identities # #' @importFrom KernSmooth bkde #' @importFrom stats approxfun quantile # # @author Chris McGinnis, Gartner Lab, UCSF # # @examples # demux_result <- ClassifyCells(data = counts_data, q = 0.7) # ClassifyCells <- function(data, q) { ## Generate Thresholds: Gaussian KDE with bad barcode detection, outlier trimming ## local maxima estimation with bad barcode detection, threshold definition and adjustment # n_BC <- ncol(x = data) n_cells <- nrow(x = data) bc_calls <- vector(mode = "list", length = n_cells) n_bc_calls <- numeric(length = n_cells) for (i in 1:ncol(x = data)) { model <- tryCatch( expr = approxfun(x = bkde(x = data[, i], kernel = "normal")), error = function(e) { message("No threshold found for ", colnames(x = data)[i], "...") } ) if (is.null(x = model)) { next } x <- seq.int( from = quantile(x = data[, i], probs = 0.001), to = quantile(x = data[, i], probs = 0.999), length.out = 100 ) extrema <- LocalMaxima(x = model(x)) if (length(x = extrema) <= 1) { message("No threshold found for ", colnames(x = data)[i], "...") next } low.extremum <- min(extrema) high.extremum <- max(extrema) thresh <- (x[high.extremum] + x[low.extremum])/2 ## Account for GKDE noise by adjusting low threshold to most prominent peak low.extremae <- extrema[which(x = x[extrema] <= thresh)] new.low.extremum <- low.extremae[which.max(x = model(x)[low.extremae])] thresh <- quantile(x = c(x[high.extremum], x[new.low.extremum]), probs = q) ## Find which cells are above the ith threshold cell_i <- which(x = data[, i] >= thresh) n <- length(x = cell_i) if (n == 0) { ## Skips to next BC if no cells belong to the ith group next } bc <- colnames(x = data)[i] if (n == 1) { bc_calls[[cell_i]] <- c(bc_calls[[cell_i]], bc) n_bc_calls[cell_i] <- n_bc_calls[cell_i] + 1 } else { # have to iterate, lame for (cell in cell_i) { bc_calls[[cell]] <- c(bc_calls[[cell]], bc) n_bc_calls[cell] <- n_bc_calls[cell] + 1 } } } calls <- character(length = n_cells) for (i in 1:n_cells) { if (n_bc_calls[i] == 0) { calls[i] <- "Negative"; next } if (n_bc_calls[i] > 1) { calls[i] <- "Doublet"; next } if (n_bc_calls[i] == 1) { calls[i] <- bc_calls[[i]] } } names(x = calls) <- rownames(x = data) return(calls) } # Computes the metric at a given r (radius) value and stores in meta.features # # @param mv Results of running markvario # @param r.metric r value at which to report the "trans" value of the mark # variogram # # @return Returns a data.frame with r.metric values # # ComputeRMetric <- function(mv, r.metric = 5) { r.metric.results <- unlist(x = lapply( X = mv, FUN = function(x) { x$trans[which.min(x = abs(x = x$r - r.metric))] } )) r.metric.results <- as.data.frame(x = r.metric.results) colnames(r.metric.results) <- paste0("r.metric.", r.metric) return(r.metric.results) } # Normalize a given data matrix # # Normalize a given matrix with a custom function. Essentially just a wrapper # around apply. Used primarily in the context of CLR normalization. # # @param data Matrix with the raw count data # @param custom_function A custom normalization function # @param margin Which way to we normalize. Set 1 for rows (features) or 2 for columns (genes) # @parm across Which way to we normalize? Choose form 'cells' or 'features' # @param verbose Show progress bar # # @return Returns a matrix with the custom normalization # #' @importFrom Matrix t #' @importFrom methods as #' @importFrom pbapply pbapply # CustomNormalize <- function(data, custom_function, margin, verbose = TRUE) { if (is.data.frame(x = data)) { data <- as.matrix(x = data) } if (!inherits(x = data, what = 'dgCMatrix')) { data <- as.sparse(x = data) } myapply <- ifelse(test = verbose, yes = pbapply, no = apply) # margin <- switch( # EXPR = across, # 'cells' = 2, # 'features' = 1, # stop("'across' must be either 'cells' or 'features'") # ) if (verbose) { message("Normalizing across ", c('features', 'cells')[margin]) } norm.data <- myapply( X = data, MARGIN = margin, FUN = custom_function) if (margin == 1) { norm.data = Matrix::t(x = norm.data) } colnames(x = norm.data) <- colnames(x = data) rownames(x = norm.data) <- rownames(x = data) return(norm.data) } # Inter-maxima quantile sweep to find ideal barcode thresholds # # Finding ideal thresholds for positive-negative signal classification per multiplex barcode # # @param call.list A list of sample classification result from different quantiles using ClassifyCells # # @return A list with two values: \code{res} and \code{extrema}: # \describe{ # \item{res}{A data.frame named res_id documenting the quantile used, subset, number of cells and proportion} # \item{extrema}{...} # } # # @author Chris McGinnis, Gartner Lab, UCSF # # @examples # FindThresh(call.list = bar.table_sweep.list) # FindThresh <- function(call.list) { # require(reshape2) res <- as.data.frame(x = matrix( data = 0L, nrow = length(x = call.list), ncol = 4 )) colnames(x = res) <- c("q","pDoublet","pNegative","pSinglet") q.range <- unlist(x = strsplit(x = names(x = call.list), split = "q=")) res$q <- as.numeric(x = q.range[grep(pattern = "0", x = q.range)]) nCell <- length(x = call.list[[1]]) for (i in 1:nrow(x = res)) { temp <- table(call.list[[i]]) if ("Doublet" %in% names(x = temp) == TRUE) { res$pDoublet[i] <- temp[which(x = names(x = temp) == "Doublet")] } if ( "Negative" %in% names(temp) == TRUE ) { res$pNegative[i] <- temp[which(x = names(x = temp) == "Negative")] } res$pSinglet[i] <- sum(temp[which(x = !names(x = temp) %in% c("Doublet", "Negative"))]) } res.q <- res$q q.ind <- grep(pattern = 'q', x = colnames(x = res)) res <- Melt(x = res[, -q.ind]) res[, 1] <- rep.int(x = res.q, times = length(x = unique(res[, 2]))) colnames(x = res) <- c('q', 'variable', 'value') res[, 4] <- res$value/nCell colnames(x = res)[2:4] <- c("Subset", "nCells", "Proportion") extrema <- res$q[LocalMaxima(x = res$Proportion[which(x = res$Subset == "pSinglet")])] return(list(res = res, extrema = extrema)) } # Calculate pearson residuals of features not in the scale.data # This function is the secondary function under GetResidual # # @param object A seurat object # @param features Name of features to add into the scale.data # @param assay Name of the assay of the seurat object generated by SCTransform # @param vst_out The SCT parameter list # @param clip.range Numeric of length two specifying the min and max values the Pearson residual # will be clipped to # Useful if you want to change the clip.range. # @param verbose Whether to print messages and progress bars # # @return Returns a matrix containing not-centered pearson residuals of added features # #' @importFrom sctransform get_residuals # GetResidualSCTModel <- function( object, assay, SCTModel, new_features, clip.range, replace.value, verbose ) { clip.range <- clip.range %||% SCTResults(object = object[[assay]], slot = "clips", model = SCTModel)$sct model.features <- rownames(x = SCTResults(object = object[[assay]], slot = "feature.attributes", model = SCTModel)) umi.assay <- SCTResults(object = object[[assay]], slot = "umi.assay", model = SCTModel) model.cells <- Cells(x = slot(object = object[[assay]], name = "SCTModel.list")[[SCTModel]]) sct.method <- SCTResults(object = object[[assay]], slot = "arguments", model = SCTModel)$sct.method %||% "default" scale.data.cells <- colnames(x = GetAssayData(object = object, assay = assay, slot = "scale.data")) if (length(x = setdiff(x = model.cells, y = scale.data.cells)) == 0) { existing_features <- names(x = which(x = ! apply( X = GetAssayData(object = object, assay = assay, slot = "scale.data")[, model.cells], MARGIN = 1, FUN = anyNA) )) } else { existing_features <- character() } if (replace.value) { features_to_compute <- new_features } else { features_to_compute <- setdiff(x = new_features, y = existing_features) } if (sct.method == "reference.model") { if (verbose) { message("sct.model ", SCTModel, " is from reference, so no residuals will be recalculated") } features_to_compute <- character() } if (!umi.assay %in% Assays(object = object)) { warning("The umi assay (", umi.assay, ") is not present in the object. ", "Cannot compute additional residuals.", call. = FALSE, immediate. = TRUE) return(NULL) } diff_features <- setdiff(x = features_to_compute, y = model.features) intersect_features <- intersect(x = features_to_compute, y = model.features) if (length(x = diff_features) == 0) { umi <- GetAssayData(object = object, assay = umi.assay, slot = "counts" )[features_to_compute, model.cells, drop = FALSE] } else { warning( "In the SCTModel ", SCTModel, ", the following ", length(x = diff_features), " features do not exist in the counts slot: ", paste(diff_features, collapse = ", ") ) if (length(x = intersect_features) == 0) { return(matrix( data = NA, nrow = length(x = features_to_compute), ncol = length(x = model.cells), dimnames = list(features_to_compute, model.cells) )) } umi <- GetAssayData(object = object, assay = umi.assay, slot = "counts")[intersect_features, model.cells, drop = FALSE] } clip.max <- max(clip.range) clip.min <- min(clip.range) if (nrow(x = umi) > 0) { vst_out <- SCTModel_to_vst(SCTModel = slot(object = object[[assay]], name = "SCTModel.list")[[SCTModel]]) if (verbose) { message("sct.model: ", SCTModel) } new_residual <- get_residuals( vst_out = vst_out, umi = umi, residual_type = "pearson", res_clip_range = c(clip.min, clip.max), verbosity = as.numeric(x = verbose) * 2 ) new_residual <- as.matrix(x = new_residual) # centered data new_residual <- new_residual - rowMeans(x = new_residual) } else { new_residual <- matrix(data = NA, nrow = 0, ncol = length(x = model.cells), dimnames = list(c(), model.cells)) } old.features <- setdiff(x = new_features, y = features_to_compute) if (length(x = old.features) > 0) { old_residuals <- GetAssayData(object = object[[assay]], slot = "scale.data")[old.features, model.cells, drop = FALSE] new_residual <- rbind(new_residual, old_residuals)[new_features, ] } return(new_residual) } # Convert SCTModel class to vst_out used in the sctransform # @param SCTModel # @return Return a list containing sct model # SCTModel_to_vst <- function(SCTModel) { feature.params <- c("theta", "(Intercept)", "log_umi") feature.attrs <- c("residual_mean", "residual_variance" ) vst_out <- list() vst_out$model_str <- slot(object = SCTModel, name = "model") vst_out$model_pars_fit <- as.matrix(x = slot(object = SCTModel, name = "feature.attributes")[, feature.params]) vst_out$gene_attr <- slot(object = SCTModel, name = "feature.attributes")[, feature.attrs] vst_out$cell_attr <- slot(object = SCTModel, name = "cell.attributes") vst_out$arguments <- slot(object = SCTModel, name = "arguments") return(vst_out) } # Local maxima estimator # # Finding local maxima given a numeric vector # # @param x A continuous vector # # @return Returns a (named) vector showing positions of local maximas # # @author Tommy # @references \url{https://stackoverflow.com/questions/6836409/finding-local-maxima-and-minima} # # @examples # x <- c(1, 2, 9, 9, 2, 1, 1, 5, 5, 1) # LocalMaxima(x = x) # LocalMaxima <- function(x) { # Use -Inf instead if x is numeric (non-integer) y <- diff(x = c(-.Machine$integer.max, x)) > 0L y <- cumsum(x = rle(x = y)$lengths) y <- y[seq.int(from = 1L, to = length(x = y), by = 2L)] if (x[[1]] == x[[2]]) { y <- y[-1] } return(y) } # #' @importFrom stats residuals # NBResiduals <- function(fmla, regression.mat, gene, return.mode = FALSE) { fit <- 0 try( fit <- glm.nb( formula = fmla, data = regression.mat ), silent = TRUE) if (is.numeric(x = fit)) { message(sprintf('glm.nb failed for gene %s; falling back to scale(log(y+1))', gene)) resid <- scale(x = log(x = regression.mat[, 'GENE'] + 1))[, 1] mode <- 'scale' } else { resid <- residuals(fit, type = 'pearson') mode = 'nbreg' } do.return <- list(resid = resid, mode = mode) if (return.mode) { return(do.return) } else { return(do.return$resid) } } # Regress out techincal effects and cell cycle from a matrix # # Remove unwanted effects from a matrix # # @parm data.expr An expression matrix to regress the effects of latent.data out # of should be the complete expression matrix in genes x cells # @param latent.data A matrix or data.frame of latent variables, should be cells # x latent variables, the colnames should be the variables to regress # @param features.regress An integer vector representing the indices of the # genes to run regression on # @param model.use Model to use, one of 'linear', 'poisson', or 'negbinom'; pass # NULL to simply return data.expr # @param use.umi Regress on UMI count data # @param verbose Display a progress bar # #' @importFrom stats as.formula lm #' @importFrom utils txtProgressBar setTxtProgressBar # RegressOutMatrix <- function( data.expr, latent.data = NULL, features.regress = NULL, model.use = NULL, use.umi = FALSE, verbose = TRUE ) { # Do we bypass regression and simply return data.expr? bypass <- vapply( X = list(latent.data, model.use), FUN = is.null, FUN.VALUE = logical(length = 1L) ) if (any(bypass)) { return(data.expr) } # Check model.use possible.models <- c("linear", "poisson", "negbinom") if (!model.use %in% possible.models) { stop(paste( model.use, "is not a valid model. Please use one the following:", paste0(possible.models, collapse = ", ") )) } # Check features.regress if (is.null(x = features.regress)) { features.regress <- 1:nrow(x = data.expr) } if (is.character(x = features.regress)) { features.regress <- intersect(x = features.regress, y = rownames(x = data.expr)) if (length(x = features.regress) == 0) { stop("Cannot use features that are beyond the scope of data.expr") } } else if (max(features.regress) > nrow(x = data.expr)) { stop("Cannot use features that are beyond the scope of data.expr") } # Check dataset dimensions if (nrow(x = latent.data) != ncol(x = data.expr)) { stop("Uneven number of cells between latent data and expression data") } use.umi <- ifelse(test = model.use != 'linear', yes = TRUE, no = use.umi) # Create formula for regression vars.to.regress <- colnames(x = latent.data) fmla <- paste('GENE ~', paste(vars.to.regress, collapse = '+')) fmla <- as.formula(object = fmla) if (model.use == "linear") { # In this code, we'll repeatedly regress different Y against the same X # (latent.data) in order to calculate residuals. Rather that repeatedly # call lm to do this, we'll avoid recalculating the QR decomposition for the # latent.data matrix each time by reusing it after calculating it once regression.mat <- cbind(latent.data, data.expr[1,]) colnames(regression.mat) <- c(colnames(x = latent.data), "GENE") qr <- lm(fmla, data = regression.mat, qr = TRUE)$qr rm(regression.mat) } # Make results matrix data.resid <- matrix( nrow = nrow(x = data.expr), ncol = ncol(x = data.expr) ) if (verbose) { pb <- txtProgressBar(char = '=', style = 3, file = stderr()) } for (i in 1:length(x = features.regress)) { x <- features.regress[i] regression.mat <- cbind(latent.data, data.expr[x, ]) colnames(x = regression.mat) <- c(vars.to.regress, 'GENE') regression.mat <- switch( EXPR = model.use, 'linear' = qr.resid(qr = qr, y = data.expr[x,]), 'poisson' = residuals(object = glm( formula = fmla, family = 'poisson', data = regression.mat), type = 'pearson' ), 'negbinom' = NBResiduals( fmla = fmla, regression.mat = regression.mat, gene = x ) ) data.resid[i, ] <- regression.mat if (verbose) { setTxtProgressBar(pb = pb, value = i / length(x = features.regress)) } } if (verbose) { close(con = pb) } if (use.umi) { data.resid <- log1p(x = Sweep( x = data.resid, MARGIN = 1, STATS = apply(X = data.resid, MARGIN = 1, FUN = min), FUN = '-' )) } dimnames(x = data.resid) <- dimnames(x = data.expr) return(data.resid) } Seurat/R/sketching.R0000644000176200001440000005706614743751115014046 0ustar liggesusers#' @include zzz.R #' @include generics.R #' @importFrom rlang enquo is_quosure quo_get_env quo_get_expr #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Sketch Data #' #' This function uses sketching methods to downsample high-dimensional single-cell RNA expression data, #' which can help with scalability for large datasets. #' #' @param object A Seurat object. #' @param assay Assay name. Default is NULL, in which case the default assay of the object is used. #' @param ncells A positive integer or a named vector/list specifying the #' number of cells to sample per layer. If a single integer is provided, the #' same number of cells will be sampled from each layer. Default is 5000. #' @param sketched.assay Sketched assay name. A sketch assay is created or overwrite with the sketch data. Default is 'sketch'. #' @param method Sketching method to use. Can be 'LeverageScore' or 'Uniform'. #' Default is 'LeverageScore'. #' @param var.name A metadata column name to store the leverage scores. Default is 'leverage.score'. #' @param over.write whether to overwrite existing column in the metadata. Default is FALSE. #' @param seed A positive integer for the seed of the random number generator. Default is 123. #' @param cast The type to cast the resulting assay to. Default is 'dgCMatrix'. #' @param verbose Print progress and diagnostic messages #' @param features A character vector of feature names to include in the #' sketched assay. #' @param ... Arguments passed to other methods #' #' @return A Seurat object with the sketched data added as a new assay. #' #' @importFrom SeuratObject CastAssay Key Key<- Layers #' #' @export #' @concept sketching #' SketchData <- function( object, assay = NULL, ncells = 5000L, sketched.assay = 'sketch', method = c('LeverageScore', 'Uniform'), var.name = "leverage.score", over.write = FALSE, seed = 123L, cast = 'dgCMatrix', verbose = TRUE, features = NULL, ... ) { assay <- assay[1L] %||% DefaultAssay(object = object) assay <- match.arg(arg = assay, choices = Assays(object = object)) method <- match.arg(arg = method) if (sketched.assay == assay) { abort(message = "Cannot overwrite existing assays") } if (sketched.assay %in% Assays(object = object)) { if (sketched.assay == DefaultAssay(object = object)) { DefaultAssay(object = object) <- assay } object[[sketched.assay]] <- NULL } if (!over.write) { var.name <- CheckMetaVarName(object = object, var.name = var.name) } if (method == 'LeverageScore') { if (verbose) { message("Calcuating Leverage Score") } object <- LeverageScore( object = object, assay = assay, var.name = var.name, over.write = over.write, seed = seed, verbose = FALSE, features = features, ... ) } else if (method == 'Uniform') { if (verbose) { message("Uniformly sampling") } object[[var.name]] <- 1 } leverage.score <- object[[var.name]] layer.names <- Layers(object = object[[assay]], search = 'data') if (length(ncells) == 1) { ncells <- rep(ncells, length(layer.names)) } if (is.null(names(ncells))) { names(ncells) <- layer.names } # align index of `ncells` with `layer.names` ncells <- ncells[layer.names] cells <- mapply( function( layer.name, ncells.layer ) { if (!is.null(seed)) { set.seed(seed) } cells.layer <- Cells(object[[assay]], layer = layer.name) if (length(cells.layer) < ncells.layer) { cells.to.keep <- cells.layer } else { cells.to.keep <- sample( x = cells.layer, size = ncells.layer, prob = leverage.score[cells.layer,] ) } return (cells.to.keep) }, layer.names, ncells ) sketched <- suppressWarnings(expr = subset( x = object[[assay]], cells = unlist(cells), layers = Layers(object = object[[assay]], search = c('counts', 'data')) )) for (layer.name in layer.names) { try( expr = VariableFeatures(object = sketched, method = "sketch", layer = layer.name) <- VariableFeatures(object = object[[assay]], layer = layer.name), silent = TRUE ) } if (!is.null(x = cast) && inherits(x = sketched, what = 'Assay5')) { sketched <- CastAssay(object = sketched, to = cast, ...) } Key(object = sketched) <- Key(object = sketched.assay, quiet = TRUE) object[[sketched.assay]] <- sketched DefaultAssay(object = object) <- sketched.assay return(object) } #' Project full data to the sketch assay #' #' #' This function allows projection of high-dimensional single-cell RNA expression data from a full dataset #' onto the lower-dimensional embedding of the sketch of the dataset. #' #' @param object A Seurat object. #' @param assay Assay name for the full data. Default is 'RNA'. #' @param sketched.assay Sketched assay name to project onto. Default is 'sketch'. #' @param sketched.reduction Dimensional reduction results of the sketched assay to project onto. #' @param full.reduction Dimensional reduction name for the projected full dataset. #' @param dims Dimensions to include in the projection. #' @param normalization.method Normalization method to use. Can be 'LogNormalize' or 'SCT'. #' Default is 'LogNormalize'. #' @param refdata An optional list for label transfer from sketch to full data. Default is NULL. #' Similar to refdata in `MapQuery` #' @param k.weight Number of neighbors to consider when weighting labels for transfer. Default is 50. #' @param umap.model An optional pre-computed UMAP model. Default is NULL. #' @param recompute.neighbors Whether to recompute the neighbors for label transfer. Default is FALSE. #' @param recompute.weights Whether to recompute the weights for label transfer. Default is FALSE. #' @param verbose Print progress and diagnostic messages. #' #' @return A Seurat object with the full data projected onto the sketched dimensional reduction results. #' The projected data are stored in the specified full reduction. #' #' @export #' @concept sketching #' ProjectData <- function( object, assay = 'RNA', sketched.assay = 'sketch', sketched.reduction, full.reduction, dims, normalization.method = c("LogNormalize", "SCT"), refdata = NULL, k.weight = 50, umap.model = NULL, recompute.neighbors = FALSE, recompute.weights = FALSE, verbose = TRUE ) { if (!full.reduction %in% Reductions(object)) { if (verbose) { message(full.reduction, ' is not in the object.' ,' Data from all cells will be projected to ', sketched.reduction) } proj.emb <- ProjectCellEmbeddings( query = object, reference = object, query.assay = assay, dims = dims, normalization.method = normalization.method, reference.assay = sketched.assay, reduction = sketched.reduction, verbose = verbose) object[[full.reduction]] <- CreateDimReducObject( embeddings = proj.emb, assay = assay, key = Key(object = full.reduction, quiet = TRUE) ) } object <- TransferSketchLabels( object = object, sketched.assay = sketched.assay, reduction = full.reduction, dims = dims, k = k.weight, refdata = refdata, reduction.model = umap.model, recompute.neighbors = recompute.neighbors, recompute.weights = recompute.weights, verbose = verbose) return(object) } #' Transfer data from sketch data to full data #' #' This function transfers cell type labels from a sketched dataset to a full dataset #' based on the similarities in the lower dimensional space. #' #' @param object A Seurat object. #' @param sketched.assay Sketched assay name. Default is 'sketch'. #' @param reduction Dimensional reduction name to use for label transfer. #' @param dims An integer vector indicating which dimensions to use for label transfer. #' @param refdata A list of character strings indicating the metadata columns containing labels to transfer. Default is NULL. #' Similar to refdata in `MapQuery` #' @param k Number of neighbors to use for label transfer. Default is 50. #' @param reduction.model Dimensional reduction model to use for label transfer. Default is NULL. #' @param neighbors An object storing the neighbors found during the sketching process. Default is NULL. #' @param recompute.neighbors Whether to recompute the neighbors for label transfer. Default is FALSE. #' @param recompute.weights Whether to recompute the weights for label transfer. Default is FALSE. #' @param verbose Print progress and diagnostic messages #' #' @return A Seurat object with transferred labels stored in the metadata. If a UMAP model is provided, #' the full data are also projected onto the UMAP space, with the results stored in a new reduction, full.`reduction.model` #' #' @export #' @concept sketching #' TransferSketchLabels <- function( object, sketched.assay = 'sketch', reduction, dims, refdata = NULL, k = 50, reduction.model = NULL, neighbors = NULL, recompute.neighbors = FALSE, recompute.weights = FALSE, verbose = TRUE ){ full_sketch.nn <- neighbors %||% Tool( object = object, slot = 'TransferSketchLabels' )$full_sketch.nn full_sketch.weight <- Tool( object = object, slot = 'TransferSketchLabels' )$full_sketch.weight compute.neighbors <- is.null(x = full_sketch.nn) || !all(Cells(full_sketch.nn) == Cells(object[[reduction]])) || max(Indices(full_sketch.nn)) > ncol(object[[sketched.assay]]) || !identical(x = full_sketch.nn@alg.info$dims, y = dims) || !identical(x = full_sketch.nn@alg.info$reduction, y = reduction) || recompute.neighbors compute.weights <- is.null(x = full_sketch.weight) || !all(colnames(full_sketch.weight) == Cells(object[[reduction]])) || !all(rownames(full_sketch.weight) == colnames(object[[sketched.assay]])) || recompute.weights || recompute.neighbors if (compute.neighbors) { if (verbose) { message("Finding sketch neighbors") } full_sketch.nn <- NNHelper( query = Embeddings(object[[reduction]])[, dims], data = Embeddings(object[[reduction]])[colnames(object[[sketched.assay]]), dims], k = k, method = "annoy" ) slot(object = full_sketch.nn, name = 'alg.info')$dims <- dims slot(object = full_sketch.nn, name = 'alg.info')$reduction <- reduction } if (compute.weights) { if (verbose) { message("Finding sketch weight matrix") } full_sketch.weight <- FindWeightsNN( nn.obj = full_sketch.nn, query.cells = Cells(object[[reduction]]), reference.cells = colnames(object[[sketched.assay]]), verbose = verbose) rownames(full_sketch.weight) <- colnames(object[[sketched.assay]]) colnames(full_sketch.weight) <- Cells(object[[reduction]]) } slot( object = object, name = 'tools' )$TransferSketchLabels$full_sketch.nn <- full_sketch.nn slot( object = object, name = 'tools' )$TransferSketchLabels$full_sketch.weight <- full_sketch.weight if (!is.null(refdata)) { if (length(refdata) == 1 & is.character(refdata)) { refdata <- list(refdata) names(refdata) <- unlist(refdata) } if (verbose) { message("Transfering refdata from sketch") } for (rd in 1:length(x = refdata)) { if (isFALSE(x = refdata[[rd]])) { transfer.results[[rd]] <- NULL next } rd.name <- names(x = refdata)[rd] label.rd <- refdata[[rd]] ## FetchData not work if (!label.rd %in% colnames( object[[]])) { stop(label.rd, ' is not in the meta.data') } reference.labels <- object[[]][colnames(object[[sketched.assay]]), label.rd] predicted.labels.list <- TransferLablesNN( reference.labels = reference.labels, weight.matrix = full_sketch.weight) object[[paste0(rd.name)]] <- predicted.labels.list$labels object[[paste0(rd.name, '.score')]] <- predicted.labels.list$scores } } if (!is.null(reduction.model)) { umap.model <- Misc(object = object[[reduction.model]], slot = 'model') if (is.null(umap.model)) { warning(reduction.model, ' does not have a stored umap model') return(object) } if (verbose) { message("Projection to sketch umap") } if (ncol(full_sketch.nn) > umap.model$n_neighbors) { full_sketch.nn@nn.idx <- full_sketch.nn@nn.idx[, 1:umap.model$n_neighbors] full_sketch.nn@nn.dist <- full_sketch.nn@nn.dist[, 1:umap.model$n_neighbors] } proj.umap <- RunUMAP( object = full_sketch.nn, reduction.model = object[[reduction.model]], verbose = verbose, assay = slot(object = object[[reduction]], name = 'assay.used') ) full.umap.reduction <- rev( x = make.unique( names = c( Reductions(object = object), paste0('full.',reduction.model) ) ) )[1] Key(object = proj.umap) <- Key(object = full.umap.reduction) object[[full.umap.reduction ]] <- proj.umap } return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @param nsketch A positive integer. The number of sketches to be used in the approximation. #' Default is 5000. #' @param ndims A positive integer or NULL. The number of dimensions to use. If NULL, the number #' of dimensions will default to the number of columns in the object. #' @param method The sketching method to use, defaults to CountSketch. #' @param eps A numeric. The error tolerance for the approximation in Johnson–Lindenstrauss embeddings, #' defaults to 0.5. #' @param seed A positive integer. The seed for the random number generator, defaults to 123. #' @param verbose Print progress and diagnostic messages #' @importFrom Matrix qrR t #' @importFrom irlba irlba #' #' @rdname LeverageScore #' @method LeverageScore default #' #' @export #' @concept sketching #' LeverageScore.default <- function( object, nsketch = 5000L, ndims = NULL, method = CountSketch, eps = 0.5, seed = 123L, verbose = TRUE, ... ) { # Check the dimensions of the object, nsketch, and ndims ncells <- ncol(x = object) if (ncells < nsketch * 1.5) { nv <- ifelse(nrow(x = object) < 50, nrow(x = object) - 1, 50) Z <- irlba(A = object, nv = 50, nu = 0, verbose = FALSE)$v return(rowSums(x = Z ^ 2)) } if (nrow(x = object) > 5000L) { abort(message = "too slow") } else if (nrow(x = object) > (ncells / 1.1)) { abort(message = "too square") } ndims <- ndims %||% ncells if (nsketch < (1.1 * nrow(x = object))) { nsketch <- 1.1 * nrow(x = object) warning( "'nsketch' is too close to the number of features, setting to ", round(x = nsketch, digits = 2L), call. = FALSE, immediate. = TRUE ) } nsketch <- min(nsketch, ndims) # Check the method if (is_quosure(x = method)) { method <- eval( expr = quo_get_expr(quo = method), envir = quo_get_env(quo = method) ) } if (is.character(x = method)) { method <- match.fun(FUN = method) } stopifnot(is.function(x = method)) # Run the sketching if (isTRUE(x = verbose)) { message("sampling ", nsketch, " cells for random sketching") } S <- method(nsketch = nsketch, ncells = ncells, seed = seed, ...) object <- t(x = object) if (isTRUE(x = verbose)) { message("Performing QR decomposition") } if (inherits(x = object, what = 'IterableMatrix')) { temp <- tempdir() object.gene_index <- BPCells::transpose_storage_order(matrix = object, tmpdir = temp) sa <- as(object = S %*% object.gene_index, Class = 'dgCMatrix') rm(object.gene_index) unlink(list.files(path = temp, full.names = TRUE)) } else { sa <- S %*% object } if (!inherits(x = sa, what = 'dgCMatrix')) { sa <- as(object = sa, Class = 'dgCMatrix') } qr.sa <- base::qr(x = sa) R <- if (inherits(x = qr.sa, what = 'sparseQR')) { qrR(qr = qr.sa) } else { base::qr.R(qr = qr.sa) } R.inv <- as.sparse(x = backsolve(r = R, x = diag(x = ncol(x = R)))) if (isTRUE(x = verbose)) { message("Performing random projection") } JL <- as.sparse(x = JLEmbed( nrow = ncol(x = R.inv), ncol = ndims, eps = eps, seed = seed )) Z <- object %*% (R.inv %*% JL) if (inherits(x = Z, what = 'IterableMatrix')) { Z.score <- BPCells::matrix_stats(matrix = Z ^ 2, row_stats = 'mean' )$row_stats['mean',]*ncol(x = Z) } else { Z.score <- rowSums(x = Z ^ 2) } return(Z.score) } #' @param nsketch A positive integer. The number of sketches to be used in the approximation. #' Default is 5000. #' @param ndims A positive integer or NULL. The number of dimensions to use. If NULL, the number #' of dimensions will default to the number of columns in the object. #' @param method The sketching method to use, defaults to CountSketch. #' @param vf.method VariableFeatures method #' @param layer layer to use #' @param eps A numeric. The error tolerance for the approximation in Johnson–Lindenstrauss embeddings, #' defaults to 0.5. #' @param seed A positive integer. The seed for the random number generator, defaults to 123. #' @param verbose Print progress and diagnostic messages #' @param features A vector of feature names to use for calculating leverage score. #' #' @importFrom SeuratObject EmptyDF #' #' @rdname LeverageScore #' @method LeverageScore StdAssay #' #' @export #' @concept sketching #' LeverageScore.StdAssay <- function( object, nsketch = 5000L, ndims = NULL, method = CountSketch, vf.method = NULL, layer = 'data', eps = 0.5, seed = 123L, verbose = TRUE, features = NULL, ... ) { layer <- unique(x = layer) %||% DefaultLayer(object = object) layer <- Layers(object = object, search = layer) if (!is_quosure(x = method)) { method <- enquo(arg = method) } scores <- EmptyDF(n = ncol(x = object)) row.names(x = scores) <- colnames(x = object) scores[, 1] <- NA_real_ for (i in seq_along(along.with = layer)) { l <- layer[i] if (isTRUE(x = verbose)) { message("Running LeverageScore for layer ", l) } features.use <- features %||% tryCatch({ VariableFeatures( object = object, method = vf.method, layer = l ) }, error = function(e) { stop("Unable to get variable features from layer `", l, "`. Try providing `features` argument instead.") }) scores[Cells(x = object, layer = l), 1] <- LeverageScore( object = LayerData( object = object, layer = l, features = features.use, fast = TRUE ), nsketch = nsketch, ndims = ndims %||% ncol(x = object), method = method, eps = eps, seed = seed, verbose = verbose, ... ) } return(scores) } #' @rdname LeverageScore #' @method LeverageScore Assay #' @export #' LeverageScore.Assay <- LeverageScore.StdAssay #' @param assay assay to use #' @param nsketch A positive integer. The number of sketches to be used in the approximation. #' Default is 5000. #' @param ndims A positive integer or NULL. The number of dimensions to use. If NULL, the number #' of dimensions will default to the number of columns in the object. #' @param method The sketching method to use, defaults to CountSketch. #' @param var.name name of slot to store leverage scores #' @param over.write whether to overwrite slot that currently stores leverage scores. Defaults #' to FALSE, in which case the 'var.name' is modified if it already exists in the object #' #' @rdname LeverageScore #' @method LeverageScore Seurat #' #' @export #' @concept sketching #' LeverageScore.Seurat <- function( object, assay = NULL, nsketch = 5000L, ndims = NULL, var.name = 'leverage.score', over.write = FALSE, method = CountSketch, vf.method = NULL, layer = 'data', eps = 0.5, seed = 123L, verbose = TRUE, features = NULL, ... ) { if (!over.write) { var.name <- CheckMetaVarName(object = object, var.name = var.name) } assay <- assay[1L] %||% DefaultAssay(object = object) assay <- match.arg(arg = assay, choices = Assays(object = object)) method <- enquo(arg = method) scores <- LeverageScore( object = object[[assay]], nsketch = nsketch, ndims = ndims, method = method, vf.method = vf.method, layer = 'data', eps = eps, seed = seed, verbose = verbose, features = features, ... ) names(x = scores) <- var.name object[[]] <- scores return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for R-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Generate CountSketch random matrix #' #' @inheritParams base::set.seed #' @param nsketch Number of sketching random cells #' @param ncells Number of cells in the original data #' @param ... Ignored #' #' @return ... #' #' @importFrom Matrix sparseMatrix #' #' @export #' @concept sketching #' #' @keywords internal #' #' @references Clarkson, KL. & Woodruff, DP. #' Low-rank approximation and regression in input sparsity time. #' Journal of the ACM (JACM). 2017 Jan 30;63(6):1-45. #' \url{https://dl.acm.org/doi/abs/10.1145/3019134}; CountSketch <- function(nsketch, ncells, seed = NA_integer_, ...) { if (!is.na(x = seed)) { set.seed(seed = seed) } iv <- xv <- vector(mode = "numeric", length = ncells) jv <- seq_len(length.out = ncells) for (i in jv) { iv[i] <- sample(x = seq_len(length.out = nsketch), size = 1L) xv[i] <- sample(x = c(-1L, 1L), size = 1L) } return(sparseMatrix( i = iv, j = jv, x = xv, dims = c(nsketch, ncells) )) } #' Gaussian sketching #' #' @inheritParams CountSketch #' #' @return ... #' #' @export #' @concept sketching #' #' @keywords internal #' GaussianSketch <- function(nsketch, ncells, seed = NA_integer_, ...) { if (!is.na(x = seed)) { set.seed(seed = seed) } return(matrix( data = rnorm(n = nsketch * ncells, mean = 0L, sd = 1 / (ncells ^ 2)), nrow = nsketch, ncol = ncells )) } #' Generate JL random projection embeddings #' #' @keywords internal #' #' @references Aghila G and Siddharth R (2020). #' RandPro: Random Projection with Classification. R package version 0.2.2. #' \url{https://CRAN.R-project.org/package=RandPro} #' #' @noRd # JLEmbed <- function(nrow, ncol, eps = 0.1, seed = NA_integer_, method = "li") { if (!is.na(x = seed)) { set.seed(seed = seed) } method <- method[1L] method <- match.arg(arg = method) if (!is.null(x = eps)) { if (eps > 1 || eps <= 0) { stop("'eps' must be 0 < eps <= 1") } ncol <- floor(x = 4 * log(x = ncol) / ((eps ^ 2) / 2 - (eps ^ 3 / 3))) } m <- switch( EXPR = method, "li" = { s <- ceiling(x = sqrt(x = ncol)) prob <- c( 1 / (2 * s), 1 - (1 / s), 1 / (2 * s) ) matrix( data = sample( x = seq.int(from = -1L, to = 1L), size = nrow * ncol, replace = TRUE, prob = prob ), nrow = nrow ) } ) return(m) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # S4 Methods #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Seurat/R/clustering.R0000644000176200001440000016105714744463014014241 0ustar liggesusers#' @include generics.R #' NULL #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' Construct weighted nearest neighbor graph #' #' This function will construct a weighted nearest neighbor (WNN) graph. For #' each cell, we identify the nearest neighbors based on a weighted combination #' of two modalities. Takes as input two dimensional reductions, one computed #' for each modality.Other parameters are listed for debugging, but can be left #' as default values. #' #' @param object A Seurat object #' @param reduction.list A list of two dimensional reductions, one for each of #' the modalities to be integrated #' @param dims.list A list containing the dimensions for each reduction to use #' @param k.nn the number of multimodal neighbors to compute. 20 by default #' @param l2.norm Perform L2 normalization on the cell embeddings after #' dimensional reduction. TRUE by default. #' @param knn.graph.name Multimodal knn graph name #' @param snn.graph.name Multimodal snn graph name #' @param weighted.nn.name Multimodal neighbor object name #' @param modality.weight.name Variable name to store modality weight in object #' meta data #' @param knn.range The number of approximate neighbors to compute #' @param prune.SNN Cutoff not to discard edge in SNN graph #' @param sd.scale The scaling factor for kernel width. 1 by default #' @param cross.contant.list Constant used to avoid divide-by-zero errors. 1e-4 #' by default #' @param smooth Smoothing modality score across each individual modality #' neighbors. FALSE by default #' @param return.intermediate Store intermediate results in misc #' @param modality.weight A \code{\link{ModalityWeights}} object generated by #' \code{FindModalityWeights} #' @param verbose Print progress bars and output #' #' @return Seurat object containing a nearest-neighbor object, KNN graph, and #' SNN graph - each based on a weighted combination of modalities. #' @concept clustering #' @export #' FindMultiModalNeighbors <- function( object, reduction.list, dims.list, k.nn = 20, l2.norm = TRUE, knn.graph.name = "wknn", snn.graph.name = "wsnn", weighted.nn.name = "weighted.nn", modality.weight.name = NULL, knn.range = 200, prune.SNN = 1/15, sd.scale = 1, cross.contant.list = NULL, smooth = FALSE, return.intermediate = FALSE, modality.weight = NULL, verbose = TRUE ) { cross.contant.list <- cross.contant.list %||% as.list(x = rep(x = 1e-4, times = length(x = reduction.list))) if (is.null(x = modality.weight)) { if (verbose) { message("Calculating cell-specific modality weights") } modality.weight <- FindModalityWeights( object = object, reduction.list = reduction.list, dims.list = dims.list, k.nn = k.nn, sd.scale = sd.scale, l2.norm = l2.norm, cross.contant.list = cross.contant.list, smooth = smooth, verbose = verbose ) } modality.weight.name <- modality.weight.name %||% paste0(modality.weight@modality.assay, ".weight") modality.assay <- slot(object = modality.weight, name = "modality.assay") if (length(modality.weight.name) != length(reduction.list)) { warning("The number of provided modality.weight.name is not equal to the number of modalities. ", paste(paste0(modality.assay, ".weight"), collapse = " "), " are used to store the modality weights" ) modality.weight.name <- paste0(modality.assay, ".weight") } first.assay <- modality.assay[1] weighted.nn <- MultiModalNN( object = object, k.nn = k.nn, modality.weight = modality.weight, knn.range = knn.range, verbose = verbose ) select_nn <- Indices(object = weighted.nn) select_nn_dist <- Distances(object = weighted.nn) # compute KNN graph if (verbose) { message("Constructing multimodal KNN graph") } j <- as.numeric(x = t(x = select_nn )) i <- ((1:length(x = j)) - 1) %/% k.nn + 1 nn.matrix <- sparseMatrix( i = i, j = j, x = 1, dims = c(ncol(x = object), ncol(x = object)) ) diag(x = nn.matrix) <- 1 rownames(x = nn.matrix) <- colnames(x = nn.matrix) <- colnames(x = object) nn.matrix <- nn.matrix + t(x = nn.matrix) - t(x = nn.matrix) * nn.matrix nn.matrix <- as.Graph(x = nn.matrix) slot(object = nn.matrix, name = "assay.used") <- first.assay object[[knn.graph.name]] <- nn.matrix # compute SNN graph if (verbose) { message("Constructing multimodal SNN graph") } snn.matrix <- ComputeSNN(nn_ranked = select_nn, prune = prune.SNN) rownames(x = snn.matrix) <- colnames(x = snn.matrix) <- Cells(x = object) snn.matrix <- as.Graph(x = snn.matrix ) slot(object = snn.matrix, name = "assay.used") <- first.assay object[[snn.graph.name]] <- snn.matrix # add neighbors and modality weights object[[weighted.nn.name]] <- weighted.nn for (m in 1:length(x = modality.weight.name)) { object[[modality.weight.name[[m]]]] <- slot( object = modality.weight, name = "modality.weight.list" )[[m]] } # add command log modality.weight.command <- slot(object = modality.weight, name = "command") slot(object = modality.weight.command, name = "assay.used") <- first.assay modality.weight.command.name <- slot(object = modality.weight.command, name = "name") object[[modality.weight.command.name]] <- modality.weight.command command <- LogSeuratCommand(object = object, return.command = TRUE) slot(object = command, name = "params")$modality.weight <- NULL slot(object = command, name = "assay.used") <- first.assay command.name <- slot(object = command, name = "name") object[[command.name]] <- command if (return.intermediate) { Misc(object = object, slot = "modality.weight") <- modality.weight } return (object) } #' Find subclusters under one cluster #' #' @inheritParams FindClusters #' @param cluster the cluster to be sub-clustered #' @param subcluster.name the name of sub cluster added in the meta.data #' #' @return return a object with sub cluster labels in the sub-cluster.name variable #' @concept clustering #' @export #' FindSubCluster <- function( object, cluster, graph.name, subcluster.name = "sub.cluster", resolution = 0.5, algorithm = 1 ) { sub.cell <- WhichCells(object = object, idents = cluster) sub.graph <- as.Graph(x = object[[graph.name]][sub.cell, sub.cell]) sub.clusters <- FindClusters( object = sub.graph, resolution = resolution, algorithm = algorithm ) sub.clusters[, 1] <- paste(cluster, sub.clusters[, 1], sep = "_") object[[subcluster.name]] <- as.character(x = Idents(object = object)) object[[subcluster.name]][sub.cell, ] <- sub.clusters[, 1] return(object) } #' Predict value from nearest neighbors #' #' This function will predict expression or cell embeddings from its k nearest #' neighbors index. For each cell, it will average its k neighbors value to get #' its new imputed value. It can average expression value in assays and cell #' embeddings from dimensional reductions. #' #' @param object The object used to calculate knn #' @param nn.idx k near neighbor indices. A cells x k matrix. #' @param assay Assay used for prediction #' @param reduction Cell embedding of the reduction used for prediction #' @param dims Number of dimensions of cell embedding #' @param return.assay Return an assay or a predicted matrix #' @param slot slot used for prediction #' @param features features used for prediction #' @param mean.function the function used to calculate row mean #' @param seed Sets the random seed to check if the nearest neighbor is query #' cell #' @param verbose Print progress #' #' @return return an assay containing predicted expression value in the data #' slot #' @concept integration #' @export #' PredictAssay <- function( object, nn.idx, assay, reduction = NULL, dims = NULL, return.assay = TRUE, slot = "scale.data", features = NULL, mean.function = rowMeans, seed = 4273, verbose = TRUE ){ if (!inherits(x = mean.function, what = 'function')) { stop("'mean.function' must be a function") } if (is.null(x = reduction)) { reference.data <- GetAssayData( object = object, assay = assay, slot = slot ) features <- features %||% VariableFeatures(object = object[[assay]]) if (length(x = features) == 0) { features <- rownames(x = reference.data) if (verbose) { message("VariableFeatures are empty in the ", assay, " assay, features in the ", slot, " slot will be used" ) } } reference.data <- reference.data[features, , drop = FALSE] } else { if (is.null(x = dims)) { stop("dims is empty") } reference.data <- t(x = Embeddings(object = object, reduction = reduction)[, dims]) } set.seed(seed = seed) nn.check <- sample(x = 1:nrow(x = nn.idx), size = min(50, nrow(x = nn.idx))) if (all(nn.idx[nn.check, 1] == nn.check)) { if(verbose){ message("The nearest neighbor is the query cell itself, and it will not be used for prediction") } nn.idx <- nn.idx[,-1] } predicted <- apply( X = nn.idx, MARGIN = 1, FUN = function(x) mean.function(reference.data[, x] ) ) colnames(x = predicted) <- Cells(x = object) if (return.assay) { predicted.assay <- CreateAssayObject(data = predicted, check.matrix = FALSE) return (predicted.assay) } else { return (predicted) } } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Methods for Seurat-defined generics #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #' @importFrom pbapply pblapply #' @importFrom future.apply future_lapply #' @importFrom future nbrOfWorkers #' #' @param modularity.fxn Modularity function (1 = standard; 2 = alternative). #' @param initial.membership Passed to the `initial_membership` parameter #' of `leidenbase::leiden_find_partition`. #' @param node.sizes Passed to the `node_sizes` parameter of #' `leidenbase::leiden_find_partition`. #' @param resolution Value of the resolution parameter, use a value above #' (below) 1.0 if you want to obtain a larger (smaller) number of communities. #' @param algorithm Algorithm for modularity optimization (1 = original Louvain #' algorithm; 2 = Louvain algorithm with multilevel refinement; 3 = SLM #' algorithm; 4 = Leiden algorithm). #' @param method DEPRECATED. #' @param n.start Number of random starts. #' @param n.iter Maximal number of iterations per random start. #' @param random.seed Seed of the random number generator. #' @param group.singletons Group singletons into nearest cluster. If FALSE, assign all singletons to #' a "singleton" group #' @param temp.file.location Directory where intermediate files will be written. #' Specify the ABSOLUTE path. #' @param edge.file.name Edge file to use as input for modularity optimizer jar. #' @param verbose Print output #' #' @rdname FindClusters #' @concept clustering #' @export #' FindClusters.default <- function( object, modularity.fxn = 1, initial.membership = NULL, node.sizes = NULL, resolution = 0.8, method = deprecated(), algorithm = 1, n.start = 10, n.iter = 10, random.seed = 0, group.singletons = TRUE, temp.file.location = NULL, edge.file.name = NULL, verbose = TRUE, ... ) { CheckDots(...) # The `method` parameter is for `RunLeiden` but was deprecated, see # function for more details. if (is_present(method)) { deprecate_soft( when = "5.2.0", what = "FindClusters(method)" ) } if (is.null(x = object)) { stop("Please provide an SNN graph") } if (tolower(x = algorithm) == "louvain") { algorithm <- 1 } if (tolower(x = algorithm) == "leiden") { algorithm <- 4 } if (nbrOfWorkers() > 1) { clustering.results <- future_lapply( X = resolution, FUN = function(r) { if (algorithm %in% c(1:3)) { ids <- RunModularityClustering( SNN = object, modularity = modularity.fxn, resolution = r, algorithm = algorithm, n.start = n.start, n.iter = n.iter, random.seed = random.seed, print.output = verbose, temp.file.location = temp.file.location, edge.file.name = edge.file.name ) } else if (algorithm == 4) { ids <- RunLeiden( object = object, partition.type = "RBConfigurationVertexPartition", initial.membership = initial.membership, node.sizes = node.sizes, resolution.parameter = r, random.seed = random.seed, n.iter = n.iter ) } else { stop("algorithm not recognised, please specify as an integer or string") } names(x = ids) <- colnames(x = object) ids <- GroupSingletons(ids = ids, SNN = object, verbose = verbose) results <- list(factor(x = ids)) names(x = results) <- paste0('res.', r) return(results) } ) clustering.results <- as.data.frame(x = clustering.results) } else { clustering.results <- data.frame(row.names = colnames(x = object)) for (r in resolution) { if (algorithm %in% c(1:3)) { ids <- RunModularityClustering( SNN = object, modularity = modularity.fxn, resolution = r, algorithm = algorithm, n.start = n.start, n.iter = n.iter, random.seed = random.seed, print.output = verbose, temp.file.location = temp.file.location, edge.file.name = edge.file.name) } else if (algorithm == 4) { ids <- RunLeiden( object = object, method = method, partition.type = "RBConfigurationVertexPartition", initial.membership = initial.membership, node.sizes = node.sizes, resolution.parameter = r, random.seed = random.seed, n.iter = n.iter ) } else { stop("algorithm not recognised, please specify as an integer or string") } names(x = ids) <- colnames(x = object) ids <- GroupSingletons(ids = ids, SNN = object, group.singletons = group.singletons, verbose = verbose) clustering.results[, paste0("res.", r)] <- factor(x = ids) } } return(clustering.results) } #' @importFrom methods is #' #' @param graph.name Name of graph to use for the clustering algorithm #' @param cluster.name Name of output clusters #' #' @rdname FindClusters #' @export #' @concept clustering #' @method FindClusters Seurat #' FindClusters.Seurat <- function( object, graph.name = NULL, cluster.name = NULL, modularity.fxn = 1, initial.membership = NULL, node.sizes = NULL, resolution = 0.8, # ToDo: Update `LogSeuratCommand` to accommodate deprecated parameters. method = NULL, algorithm = 1, n.start = 10, n.iter = 10, random.seed = 0, group.singletons = TRUE, temp.file.location = NULL, edge.file.name = NULL, verbose = TRUE, ... ) { CheckDots(...) # Since we're throwing a soft deprecation warning, it needs to be duplicated # for each implementation of the `FindClusters` generic, see # `FindCluster.default` for more details. if (!is.null(method)) { deprecate_soft( when = "5.2.0", what = "FindClusters(method)" ) } graph.name <- graph.name %||% paste0(DefaultAssay(object = object), "_snn") if (!graph.name %in% names(x = object)) { stop("Provided graph.name not present in Seurat object") } if (!is(object = object[[graph.name]], class2 = "Graph")) { stop("Provided graph.name does not correspond to a graph object.") } clustering.results <- FindClusters( object = object[[graph.name]], modularity.fxn = modularity.fxn, initial.membership = initial.membership, node.sizes = node.sizes, resolution = resolution, algorithm = algorithm, n.start = n.start, n.iter = n.iter, random.seed = random.seed, group.singletons = group.singletons, temp.file.location = temp.file.location, edge.file.name = edge.file.name, verbose = verbose, ... ) cluster.name <- cluster.name %||% paste( graph.name, names(x = clustering.results), sep = '_' ) names(x = clustering.results) <- cluster.name # object <- AddMetaData(object = object, metadata = clustering.results) # Idents(object = object) <- colnames(x = clustering.results)[ncol(x = clustering.results)] idents.use <- names(x = clustering.results)[ncol(x = clustering.results)] object[[]] <- clustering.results Idents(object = object, replace = TRUE) <- object[[idents.use, drop = TRUE]] levels <- levels(x = object) levels <- tryCatch( expr = as.numeric(x = levels), warning = function(...) { return(levels) }, error = function(...) { return(levels) } ) Idents(object = object) <- factor(x = Idents(object = object), levels = sort(x = levels)) object[['seurat_clusters']] <- Idents(object = object) cmd <- LogSeuratCommand(object = object, return.command = TRUE) slot(object = cmd, name = 'assay.used') <- DefaultAssay(object = object[[graph.name]]) object[[slot(object = cmd, name = 'name')]] <- cmd return(object) } #' @param query Matrix of data to query against object. If missing, defaults to #' object. #' @param distance.matrix Boolean value of whether the provided matrix is a #' distance matrix; note, for objects of class \code{dist}, this parameter will #' be set automatically #' @param k.param Defines k for the k-nearest neighbor algorithm #' @param return.neighbor Return result as \code{\link[SeuratObject]{Neighbor}} object. Not #' used with distance matrix input. #' @param compute.SNN also compute the shared nearest neighbor graph #' @param prune.SNN Sets the cutoff for acceptable Jaccard index when #' computing the neighborhood overlap for the SNN construction. Any edges with #' values less than or equal to this will be set to 0 and removed from the SNN #' graph. Essentially sets the stringency of pruning (0 --- no pruning, 1 --- #' prune everything). #' @param nn.method Method for nearest neighbor finding. Options include: rann, #' annoy #' @param annoy.metric Distance metric for annoy. Options include: euclidean, #' cosine, manhattan, and hamming #' @param n.trees More trees gives higher precision when using annoy approximate #' nearest neighbor search #' @param nn.eps Error bound when performing nearest neighbor search using RANN; #' default of 0.0 implies exact nearest neighbor search #' @param verbose Whether or not to print output to the console #' @param l2.norm Take L2Norm of the data #' @param cache.index Include cached index in returned Neighbor object #' (only relevant if return.neighbor = TRUE) #' @param index Precomputed index. Useful if querying new data against existing #' index to avoid recomputing. #' #' @importFrom RANN nn2 #' @importFrom methods as #' #' @rdname FindNeighbors #' @export #' @concept clustering #' @method FindNeighbors default #' FindNeighbors.default <- function( object, query = NULL, distance.matrix = FALSE, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, l2.norm = FALSE, cache.index = FALSE, index = NULL, ... ) { CheckDots(...) if (is.null(x = dim(x = object))) { warning( "Object should have two dimensions, attempting to coerce to matrix", call. = FALSE ) object <- as.matrix(x = object) } if (is.null(rownames(x = object))) { stop("Please provide rownames (cell names) with the input object") } n.cells <- nrow(x = object) if (n.cells < k.param) { warning( "k.param set larger than number of cells. Setting k.param to number of cells - 1.", call. = FALSE ) k.param <- n.cells - 1 } if (l2.norm) { object <- L2Norm(mat = object) query <- query %iff% L2Norm(mat = query) } query <- query %||% object # find the k-nearest neighbors for each single cell if (!distance.matrix) { if (verbose) { if (return.neighbor) { message("Computing nearest neighbors") } else { message("Computing nearest neighbor graph") } } nn.ranked <- NNHelper( data = object, query = query, k = k.param, method = nn.method, n.trees = n.trees, searchtype = "standard", eps = nn.eps, metric = annoy.metric, cache.index = cache.index, index = index ) if (return.neighbor) { if (compute.SNN) { warning("The SNN graph is not computed if return.neighbor is TRUE.", call. = FALSE) } return(nn.ranked) } nn.ranked <- Indices(object = nn.ranked) } else { if (verbose) { message("Building SNN based on a provided distance matrix") } knn.mat <- matrix(data = 0, ncol = k.param, nrow = n.cells) knd.mat <- knn.mat for (i in 1:n.cells) { knn.mat[i, ] <- order(object[i, ])[1:k.param] knd.mat[i, ] <- object[i, knn.mat[i, ]] } nn.ranked <- knn.mat[, 1:k.param] } # convert nn.ranked into a Graph j <- as.numeric(x = t(x = nn.ranked)) i <- ((1:length(x = j)) - 1) %/% k.param + 1 nn.matrix <- as(object = sparseMatrix(i = i, j = j, x = 1, dims = c(nrow(x = object), nrow(x = object))), Class = "Graph") rownames(x = nn.matrix) <- rownames(x = object) colnames(x = nn.matrix) <- rownames(x = object) neighbor.graphs <- list(nn = nn.matrix) if (compute.SNN) { if (verbose) { message("Computing SNN") } snn.matrix <- ComputeSNN( nn_ranked = nn.ranked, prune = prune.SNN ) rownames(x = snn.matrix) <- rownames(x = object) colnames(x = snn.matrix) <- rownames(x = object) snn.matrix <- as.Graph(x = snn.matrix) neighbor.graphs[["snn"]] <- snn.matrix } return(neighbor.graphs) } #' @rdname FindNeighbors #' @export #' @concept clustering #' @method FindNeighbors Assay #' FindNeighbors.Assay <- function( object, features = NULL, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, l2.norm = FALSE, cache.index = FALSE, ... ) { CheckDots(...) features <- features %||% VariableFeatures(object = object) data.use <- t(x = GetAssayData(object = object, slot = "data")[features, ]) neighbor.graphs <- FindNeighbors( object = data.use, k.param = k.param, compute.SNN = compute.SNN, prune.SNN = prune.SNN, nn.method = nn.method, n.trees = n.trees, annoy.metric = annoy.metric, nn.eps = nn.eps, verbose = verbose, l2.norm = l2.norm, return.neighbor = return.neighbor, cache.index = cache.index, ... ) return(neighbor.graphs) } #' @rdname FindNeighbors #' @export #' @concept clustering #' @method FindNeighbors dist #' FindNeighbors.dist <- function( object, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, l2.norm = FALSE, cache.index = FALSE, ... ) { CheckDots(...) return(FindNeighbors( object = as.matrix(x = object), distance.matrix = TRUE, k.param = k.param, compute.SNN = compute.SNN, prune.SNN = prune.SNN, nn.eps = nn.eps, nn.method = nn.method, n.trees = n.trees, annoy.metric = annoy.metric, verbose = verbose, l2.norm = l2.norm, return.neighbor = return.neighbor, cache.index = cache.index, ... )) } #' @param assay Assay to use in construction of (S)NN; used only when \code{dims} #' is \code{NULL} #' @param features Features to use as input for building the (S)NN; used only when #' \code{dims} is \code{NULL} #' @param reduction Reduction to use as input for building the (S)NN #' @param dims Dimensions of reduction to use as input #' @param do.plot Plot SNN graph on tSNE coordinates #' @param graph.name Optional naming parameter for stored (S)NN graph #' (or Neighbor object, if return.neighbor = TRUE). Default is assay.name_(s)nn. #' To store both the neighbor graph and the shared nearest neighbor (SNN) graph, #' you must supply a vector containing two names to the \code{graph.name} #' parameter. The first element in the vector will be used to store the nearest #' neighbor (NN) graph, and the second element used to store the SNN graph. If #' only one name is supplied, only the NN graph is stored. #' #' @importFrom igraph graph.adjacency plot.igraph E #' #' @rdname FindNeighbors #' @export #' @concept clustering #' @method FindNeighbors Seurat #' FindNeighbors.Seurat <- function( object, reduction = "pca", dims = 1:10, assay = NULL, features = NULL, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, do.plot = FALSE, graph.name = NULL, l2.norm = FALSE, cache.index = FALSE, ... ) { CheckDots(...) if (!is.null(x = dims)) { assay <- DefaultAssay(object = object[[reduction]]) data.use <- Embeddings(object = object[[reduction]]) if (max(dims) > ncol(x = data.use)) { stop("More dimensions specified in dims than have been computed") } data.use <- data.use[, dims] neighbor.graphs <- FindNeighbors( object = data.use, k.param = k.param, compute.SNN = compute.SNN, prune.SNN = prune.SNN, nn.method = nn.method, n.trees = n.trees, annoy.metric = annoy.metric, nn.eps = nn.eps, verbose = verbose, l2.norm = l2.norm, return.neighbor = return.neighbor, cache.index = cache.index, ... ) } else { assay <- assay %||% DefaultAssay(object = object) neighbor.graphs <- FindNeighbors( object = object[[assay]], features = features, k.param = k.param, compute.SNN = compute.SNN, prune.SNN = prune.SNN, nn.method = nn.method, n.trees = n.trees, annoy.metric = annoy.metric, nn.eps = nn.eps, verbose = verbose, l2.norm = l2.norm, return.neighbor = return.neighbor, cache.index = cache.index, ... ) } if (length(x = neighbor.graphs) == 1) { neighbor.graphs <- list(nn = neighbor.graphs) } graph.name <- graph.name %||% if (return.neighbor) { paste0(assay, ".", names(x = neighbor.graphs)) } else { paste0(assay, "_", names(x = neighbor.graphs)) } if (length(x = graph.name) == 1) { message("Only one graph name supplied, storing nearest-neighbor graph only") } for (ii in 1:length(x = graph.name)) { if (inherits(x = neighbor.graphs[[ii]], what = "Graph")) { DefaultAssay(object = neighbor.graphs[[ii]]) <- assay } object[[graph.name[[ii]]]] <- neighbor.graphs[[ii]] } if (do.plot) { if (!"tsne" %in% names(x = object@reductions)) { warning("Please compute a tSNE for SNN visualization. See RunTSNE().") } else { if (nrow(x = Embeddings(object = object[["tsne"]])) != ncol(x = object)) { warning("Please compute a tSNE for SNN visualization. See RunTSNE().") } else { net <- graph.adjacency( adjmatrix = as.matrix(x = neighbor.graphs[[2]]), mode = "undirected", weighted = TRUE, diag = FALSE ) plot.igraph( x = net, layout = as.matrix(x = Embeddings(object = object[["tsne"]])), edge.width = E(graph = net)$weight, vertex.label = NA, vertex.size = 0 ) } } } object <- LogSeuratCommand(object = object) return(object) } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Run annoy # # @param data Data to build the index with # @param query A set of data to be queried against data # @param metric Distance metric; can be one of "euclidean", "cosine", "manhattan", # "hamming" # @param n.trees More trees gives higher precision when querying # @param k Number of neighbors # @param search.k During the query it will inspect up to search_k nodes which # gives you a run-time trade off between better accuracy and speed. # @param include.distance Include the corresponding distances # @param index optional index object, will be recomputed if not provided # AnnoyNN <- function(data, query = data, metric = "euclidean", n.trees = 50, k, search.k = -1, include.distance = TRUE, index = NULL ) { idx <- index %||% AnnoyBuildIndex( data = data, metric = metric, n.trees = n.trees) nn <- AnnoySearch( index = idx, query = query, k = k, search.k = search.k, include.distance = include.distance) nn$idx <- idx nn$alg.info <- list(metric = metric, ndim = ncol(x = data)) return(nn) } # Build the annoy index # # @param data Data to build the index with # @param metric Distance metric; can be one of "euclidean", "cosine", "manhattan", # "hamming" # @param n.trees More trees gives higher precision when querying # #' @importFrom RcppAnnoy AnnoyEuclidean AnnoyAngular AnnoyManhattan AnnoyHamming # AnnoyBuildIndex <- function(data, metric = "euclidean", n.trees = 50) { f <- ncol(x = data) a <- switch( EXPR = metric, "euclidean" = new(Class = RcppAnnoy::AnnoyEuclidean, f), "cosine" = new(Class = RcppAnnoy::AnnoyAngular, f), "manhattan" = new(Class = RcppAnnoy::AnnoyManhattan, f), "hamming" = new(Class = RcppAnnoy::AnnoyHamming, f), stop ("Invalid metric") ) for (ii in seq(nrow(x = data))) { a$addItem(ii - 1, data[ii, ]) } a$build(n.trees) return(a) } # Search an Annoy approximate nearest neighbor index # # @param Annoy index, built with AnnoyBuildIndex # @param query A set of data to be queried against the index # @param k Number of neighbors # @param search.k During the query it will inspect up to search_k nodes which # gives you a run-time trade off between better accuracy and speed. # @param include.distance Include the corresponding distances in the result # # @return A list with 'nn.idx' (for each element in 'query', the index of the # nearest k elements in the index) and 'nn.dists' (the distances of the nearest # k elements) # #' @importFrom future plan #' @importFrom future.apply future_lapply # AnnoySearch <- function(index, query, k, search.k = -1, include.distance = TRUE) { n <- nrow(x = query) idx <- matrix(nrow = n, ncol = k) dist <- matrix(nrow = n, ncol = k) convert <- methods::is(index, "Rcpp_AnnoyAngular") if (!inherits(x = plan(), what = "multicore")) { oplan <- plan(strategy = "sequential") on.exit(plan(oplan), add = TRUE) } res <- future_lapply(X = 1:n, FUN = function(x) { res <- index$getNNsByVectorList(query[x, ], k, search.k, include.distance) # Convert from Angular to Cosine distance if (convert) { res$dist <- 0.5 * (res$dist * res$dist) } list(res$item + 1, res$distance) }) for (i in 1:n) { idx[i, ] <- res[[i]][[1]] if (include.distance) { dist[i, ] <- res[[i]][[2]] } } return(list(nn.idx = idx, nn.dists = dist)) } # Calculate mean distance of the farthest neighbors from SNN graph # # This function will compute the average distance of the farthest k.nn # neighbors with the lowest nonzero SNN edge weight. First, for each cell it # finds the k.nn neighbors with the smallest edge weight. If there are multiple # cells with the same edge weight at the k.nn-th index, consider all of those # cells in the next step. Next, it computes the euclidean distance to all k.nn # cells in the space defined by the embeddings matrix and returns the average # distance to the farthest k.nn cells. # # @param snn.graph An SNN graph # @param embeddings The cell embeddings used to calculate neighbor distances # @param k.nn The number of neighbors to calculate # @param l2.norm Perform L2 normalization on the cell embeddings # @param nearest.dist The vector of distance to the nearest neighbors to # subtract off from distance calculations # # ComputeSNNwidth <- function( snn.graph, embeddings, k.nn, l2.norm = TRUE, nearest.dist = NULL ) { if (l2.norm) { embeddings <- L2Norm(mat = embeddings) } nearest.dist <- nearest.dist %||% rep(x = 0, times = ncol(x = snn.graph)) if (length(x = nearest.dist) != ncol(x = snn.graph)) { stop("Please provide a vector for nearest.dist that has as many elements as", " there are columns in the snn.graph (", ncol(x = snn.graph), ").") } snn.width <- SNN_SmallestNonzero_Dist( snn = snn.graph, mat = embeddings, n = k.nn, nearest_dist = nearest.dist ) return (snn.width) } # Create an Annoy index # # @note Function exists because it's not exported from \pkg{uwot} # # @param name Distance metric name # @param ndim Number of dimensions # # @return An nn index object # #' @importFrom methods new #' @importFrom RcppAnnoy AnnoyAngular AnnoyManhattan AnnoyEuclidean AnnoyHamming # CreateAnn <- function(name, ndim) { return(switch( EXPR = name, cosine = new(Class = AnnoyAngular, ndim), manhattan = new(Class = AnnoyManhattan, ndim), euclidean = new(Class = AnnoyEuclidean, ndim), hamming = new(Class = AnnoyHamming, ndim), stop("BUG: unknown Annoy metric '", name, "'") )) } # Calculate modality weights # # This function calculates cell-specific modality weights which are used to # in WNN analysis. #' @inheritParams FindMultiModalNeighbors # @param object A Seurat object # @param snn.far.nn Use SNN farthest neighbors to calculate the kernel width # @param s.nn How many SNN neighbors to use in kernel width # @param sigma.idx Neighbor index used to calculate kernel width if snn.far.nn = FALSE # @importFrom pbapply pblapply # @return Returns a \code{ModalityWeights} object that can be used as input to # \code{\link{FindMultiModalNeighbors}} # #' @importFrom pbapply pblapply # FindModalityWeights <- function( object, reduction.list, dims.list, k.nn = 20, snn.far.nn = TRUE, s.nn = k.nn, prune.SNN = 0, l2.norm = TRUE, sd.scale = 1, query = NULL, cross.contant.list = NULL, sigma.idx = k.nn, smooth = FALSE, verbose = TRUE ) { my.lapply <- ifelse( test = verbose, yes = pblapply, no = lapply ) cross.contant.list <- cross.contant.list %||% as.list(x = rep(x = 1e-4, times = length(x = reduction.list))) reduction.set <- unlist(x = reduction.list) names(x = reduction.list) <- names(x = dims.list) <- names(x = cross.contant.list) <- reduction.set embeddings.list <- lapply( X = reduction.list, FUN = function(r) Embeddings(object = object, reduction = r)[, dims.list[[r]]] ) if (l2.norm) { embeddings.list.norm <- lapply( X = embeddings.list, FUN = function(embeddings) L2Norm(mat = embeddings) ) } else { embeddings.list.norm <- embeddings.list } if (is.null(x = query)) { query.embeddings.list.norm <- embeddings.list.norm query <- object } else { if (snn.far.nn) { stop("query does not support using snn to find distant neighbors") } query.embeddings.list <- lapply( X = reduction.list, FUN = function(r) { Embeddings(object = query, reduction = r)[, dims.list[[r]]] } ) if (l2.norm) { query.embeddings.list <- lapply( X = query.embeddings.list, FUN = function(embeddings) L2Norm(mat = embeddings) ) } query.embeddings.list.norm <- query.embeddings.list } if (verbose) { message("Finding ", k.nn, " nearest neighbors for each modality.") } nn.list <- my.lapply( X = reduction.list, FUN = function(r) { nn.r <- NNHelper( data = embeddings.list.norm[[r]], query = query.embeddings.list.norm[[r]], k = max(k.nn, sigma.idx, s.nn), method = "annoy", metric = "euclidean" ) return(nn.r) } ) sigma.nn.list <- nn.list if (sigma.idx > k.nn || s.nn > k.nn) { nn.list <- lapply( X = nn.list, FUN = function(nn){ slot(object = nn, name = "nn.idx") <- Indices(object = nn)[, 1:k.nn] slot(object = nn, name = "nn.dists") <- Distances(object = nn)[, 1:k.nn] return(nn) } ) } nearest_dist <- lapply(X = reduction.list, FUN = function(r) Distances(object = nn.list[[r]])[, 2]) within_impute <- list() cross_impute <- list() # Calculating within and cross modality distance for (r in reduction.set) { reduction.norm <- paste0(r, ".norm") object[[ reduction.norm ]] <- CreateDimReducObject( embeddings = embeddings.list.norm[[r]], key = paste0("norm", Key(object = object[[r]])), assay = DefaultAssay(object = object[[r]]) ) within_impute[[r]] <- PredictAssay( object = object, nn.idx = Indices(object = nn.list[[r]]), reduction = reduction.norm, dims = 1:ncol(x = embeddings.list.norm[[r]]), verbose = FALSE, return.assay = FALSE ) cross.modality <- setdiff(x = reduction.set, y = r) cross_impute[[r]] <- lapply(X = cross.modality, FUN = function(r2) { PredictAssay( object = object, nn.idx = Indices(object = nn.list[[r2]]), reduction = reduction.norm, dims = 1:ncol(x = embeddings.list.norm[[r]]), verbose = FALSE, return.assay = FALSE ) } ) names(x = cross_impute[[r]]) <- cross.modality } within_impute_dist <- lapply( X = reduction.list, FUN = function(r) { r_dist <- impute_dist( x = query.embeddings.list.norm[[r]], y = t(x = within_impute[[r]]), nearest.dist = nearest_dist[[r]] ) return(r_dist) } ) cross_impute_dist <- lapply( X = reduction.list, FUN = function(r) { r_dist <- sapply(setdiff(x = reduction.set, y = r), FUN = function(r2) { r2_dist <- impute_dist( x = query.embeddings.list.norm[[r]], y = t(x = cross_impute[[r]][[r2]]), nearest.dist = nearest_dist[[r]] ) return( r2_dist) }) return(r_dist) } ) # calculate kernel width if (snn.far.nn) { if (verbose) { message("Calculating kernel bandwidths") } snn.graph.list <- lapply( X = sigma.nn.list, FUN = function(nn) { snn.matrix <- ComputeSNN( nn_ranked = Indices(object = nn)[, 1:s.nn], prune = prune.SNN ) colnames(x = snn.matrix) <- rownames(x = snn.matrix) <- Cells(x = object) return (snn.matrix) } ) farthest_nn_dist <- my.lapply( X = 1:length(x = snn.graph.list), FUN = function(s) { distant_nn <- ComputeSNNwidth( snn.graph = snn.graph.list[[s]], k.nn = k.nn, l2.norm = FALSE, embeddings = embeddings.list.norm[[s]], nearest.dist = nearest_dist[[s]] ) return (distant_nn) } ) names(x = farthest_nn_dist) <- unlist(x = reduction.list) modality_sd.list <- lapply( X = farthest_nn_dist, FUN = function(sd) sd * sd.scale ) } else { if (verbose) { message("Calculating sigma by ", sigma.idx, "th neighbor") } modality_sd.list <- lapply( X = reduction.list , FUN = function(r) { rdist <- Distances(object = sigma.nn.list[[r]])[, sigma.idx] - nearest_dist[[r]] rdist <- rdist * sd.scale return (rdist) } ) } # Calculating within and cross modality kernel, and modality weights within_impute_kernel <- lapply( X = reduction.list, FUN = function(r) { exp(-1 * (within_impute_dist[[r]] / modality_sd.list[[r]]) ) } ) cross_impute_kernel <- lapply( X = reduction.list, FUN = function(r) { exp(-1 * (cross_impute_dist[[r]] / modality_sd.list[[r]]) ) } ) params <- list( "reduction.list" = reduction.list, "dims.list" = dims.list, "l2.norm" = l2.norm, "k.nn" = k.nn, "sigma.idx" = sigma.idx, "snn.far.nn" = snn.far.nn , "sigma.list" = modality_sd.list, "nearest.dist" = nearest_dist ) modality_score <- lapply( X = reduction.list, FUN = function(r) { score.r <- sapply( X = setdiff(x = reduction.set, y = r), FUN = function(r2) { score <- within_impute_kernel[[r]] / (cross_impute_kernel[[r]][, r2] + cross.contant.list[[r]]) score <- MinMax(data = score, min = 0, max = 200) return(score) } ) return(score.r) } ) if (smooth) { modality_score <- lapply( X = reduction.list, FUN = function(r) { apply( X = Indices(object = nn.list[[r]]), MARGIN = 1, FUN = function(nn) mean(x = modality_score[[r]][nn[-1]]) ) } ) } all_modality_score <- rowSums(x = exp(x = Reduce(f = cbind, x = modality_score))) modality.weight <- lapply( X = modality_score, FUN = function(score_m) { rowSums(x = exp(x = score_m))/all_modality_score } ) score.mat <- list( within_impute_dist = within_impute_dist, cross_impute_dist = cross_impute_dist, within_impute_kernel = within_impute_kernel, cross_impute_kernel = cross_impute_kernel, modality_score = modality_score ) # unlist the input parameters command <- LogSeuratCommand(object = object, return.command = TRUE) command@params <- lapply(X = command@params, FUN = function(l) unlist(x = l)) modality.assay <- sapply( X = reduction.list , FUN = function (r) slot(object[[r]], name = "assay.used") ) modality.weights.obj <- new( Class = "ModalityWeights", modality.weight.list = modality.weight, modality.assay = modality.assay, params = params, score.matrix = score.mat, command = command ) return(modality.weights.obj) } # Group single cells that make up their own cluster in with the cluster they are # most connected to. # # @param ids Named vector of cluster ids # @param SNN SNN graph used in clustering # @param group.singletons Group singletons into nearest cluster. If FALSE, assign all singletons to # a "singleton" group # # @return Returns Seurat object with all singletons merged with most connected cluster # GroupSingletons <- function(ids, SNN, group.singletons = TRUE, verbose = TRUE) { # identify singletons singletons <- c() singletons <- names(x = which(x = table(ids) == 1)) singletons <- intersect(x = unique(x = ids), singletons) if (!group.singletons) { ids[which(ids %in% singletons)] <- "singleton" return(ids) } # calculate connectivity of singletons to other clusters, add singleton # to cluster it is most connected to cluster_names <- as.character(x = unique(x = ids)) cluster_names <- setdiff(x = cluster_names, y = singletons) connectivity <- vector(mode = "numeric", length = length(x = cluster_names)) names(x = connectivity) <- cluster_names new.ids <- ids for (i in singletons) { i.cells <- names(which(ids == i)) for (j in cluster_names) { j.cells <- names(which(ids == j)) subSNN <- SNN[i.cells, j.cells] set.seed(1) # to match previous behavior, random seed being set in WhichCells if (is.object(x = subSNN)) { connectivity[j] <- sum(subSNN) / (nrow(x = subSNN) * ncol(x = subSNN)) } else { connectivity[j] <- mean(x = subSNN) } } m <- max(connectivity, na.rm = T) mi <- which(x = connectivity == m, arr.ind = TRUE) closest_cluster <- sample(x = names(x = connectivity[mi]), 1) ids[i.cells] <- closest_cluster } if (length(x = singletons) > 0 && verbose) { message(paste( length(x = singletons), "singletons identified.", length(x = unique(x = ids)), "final clusters." )) } return(ids) } # Find multimodal neighbors # # @param object The object used to calculate knn # @param query The query object when query and reference are different # @param modality.weight A \code{\link{ModalityWeights}} object generated by # \code{\link{FindModalityWeights}} # @param modality.weight.list A list of modality weight value # @param k.nn Number of nearest multimodal neighbors to compute # @param reduction.list A list of reduction name # @param dims.list A list of dimensions used for the reduction # @param knn.range The number of approximate neighbors to compute # @param kernel.power The power for the exponential kernel # @param nearest.dist The list of distance to the nearest neighbors # @param sigma.list The list of kernel width # @param l2.norm Perform L2 normalization on the cell embeddings after # dimensional reduction # @param verbose Print output to the console # @importFrom pbapply pblapply # @return return a list containing nn index and nn multimodal distance # #' @importFrom methods new #' @importClassesFrom SeuratObject Neighbor # MultiModalNN <- function( object, query = NULL, modality.weight = NULL, modality.weight.list = NULL, k.nn = NULL, reduction.list = NULL, dims.list = NULL, knn.range = 200, kernel.power = 1, nearest.dist = NULL, sigma.list = NULL, l2.norm = NULL, verbose = TRUE ){ my.lapply <- ifelse( test = verbose, yes = pblapply, no = lapply ) k.nn <- k.nn %||% slot(object = modality.weight, name = "params")$k.nn reduction.list <- reduction.list %||% slot(object = modality.weight, name = "params")$reduction.list dims.list = dims.list %||% slot(object = modality.weight, name = "params")$dims.list nearest.dist = nearest.dist %||% slot(object = modality.weight, name = "params")$nearest.dist sigma.list =sigma.list %||% slot(object = modality.weight, name = "params")$sigma.list l2.norm = l2.norm %||% slot(object = modality.weight, name = "params")$l2.norm modality.weight.value <- modality.weight.list %||% slot(object = modality.weight, name = "modality.weight.list") names(x = modality.weight.value) <- unlist(x = reduction.list) if (inherits(x = object, what = "Seurat")) { reduction_embedding <- lapply( X = 1:length(x = reduction.list), FUN = function(x) { Embeddings(object = object, reduction = reduction.list[[x]])[, dims.list[[x]]] } ) } else { reduction_embedding <- object } if (is.null(x = query)) { query.reduction_embedding <- reduction_embedding query <- object } else { if (inherits(x = object, what = "Seurat")) { query.reduction_embedding <- lapply( X = 1:length(x = reduction.list), FUN = function(x) { Embeddings(object = query, reduction = reduction.list[[x]] )[, dims.list[[x]]] } ) } else { query.reduction_embedding <- query } } if (l2.norm) { query.reduction_embedding <- lapply( X = query.reduction_embedding, FUN = function(x) L2Norm(mat = x) ) reduction_embedding <- lapply( X = reduction_embedding, FUN = function(x) L2Norm(mat = x) ) } query.cell.num <- nrow(x = query.reduction_embedding[[1]]) reduction.num <- length(x = query.reduction_embedding) if (verbose) { message("Finding multimodal neighbors") } reduction_nn <- my.lapply( X = 1:reduction.num, FUN = function(x) { nn_x <- NNHelper( data = reduction_embedding[[x]], query = query.reduction_embedding[[x]], k = knn.range, method = 'annoy', metric = "euclidean" ) return (nn_x) } ) # union of rna and adt nn, remove itself from neighobors reduction_nn <- lapply( X = reduction_nn, FUN = function(x) Indices(object = x)[, -1] ) nn_idx <- lapply( X = 1:query.cell.num , FUN = function(x) { Reduce( f = union, x = lapply( X = reduction_nn, FUN = function(y) y[x, ] ) ) } ) # calculate euclidean distance of all neighbors nn_dist <- my.lapply( X = 1:reduction.num, FUN = function(r) { nndist <- NNdist( nn.idx = nn_idx, embeddings = reduction_embedding[[r]], query.embeddings = query.reduction_embedding[[r]], nearest.dist = nearest.dist[[r]] ) return(nndist) } ) # modality weighted distance if (length(x = sigma.list[[1]]) == 1) { sigma.list <- lapply(X = sigma.list, FUN = function(x) rep(x = x, ncol(x = object))) } nn_weighted_dist <- lapply( X = 1:reduction.num, FUN = function(r) { lapply( X = 1:query.cell.num, FUN = function(x) { exp(-1*(nn_dist[[r]][[x]] / sigma.list[[r]][x] ) ** kernel.power) * modality.weight.value[[r]][x] } ) } ) nn_weighted_dist <- sapply( X = 1:query.cell.num, FUN = function(x) { Reduce( f = "+", x = lapply( X = 1:reduction.num, FUN = function(r) nn_weighted_dist[[r]][[x]] ) ) } ) # select k nearest joint neighbors select_order <- lapply( X = nn_weighted_dist, FUN = function(dist) { order(dist, decreasing = TRUE) }) select_nn <- t(x = sapply( X = 1:query.cell.num, FUN = function(x) nn_idx[[x]][select_order[[x]]][1:k.nn] ) ) select_dist <- t(x = sapply( X = 1:query.cell.num, FUN = function(x) nn_weighted_dist[[x]][select_order[[x]]][1:k.nn]) ) select_dist <- sqrt(x = MinMax(data = (1 - select_dist) / 2, min = 0, max = 1)) weighted.nn <- new( Class = 'Neighbor', nn.idx = select_nn, nn.dist = select_dist, alg.info = list(), cell.names = Cells(x = query) ) return(weighted.nn) } # Calculate NN distance for the given nn.idx # @param nn.idx The nearest neighbors position index # @param embeddings cell embeddings # @param metric distance metric # @param query.embeddings query cell embeddings # @param nearest.dist The list of distance to the nearest neighbors # NNdist <- function( nn.idx, embeddings, metric = "euclidean", query.embeddings = NULL, nearest.dist = NULL ) { if (!is.list(x = nn.idx)) { nn.idx <- lapply(X = 1:nrow(x = nn.idx), FUN = function(x) nn.idx[x, ]) } query.embeddings <- query.embeddings %||% embeddings nn.dist <- fast_dist( x = query.embeddings, y = embeddings, n = nn.idx ) if (!is.null(x = nearest.dist)) { nn.dist <- lapply( X = 1:nrow(x = query.embeddings), FUN = function(x) { r_dist = nn.dist[[x]] - nearest.dist[x] r_dist[r_dist < 0] <- 0 return(r_dist) } ) } return(nn.dist) } # Internal helper function to dispatch to various neighbor finding methods # # @param data Input data # @param query Data to query against data # @param k Number of nearest neighbors to compute # @param method Nearest neighbor method to use: "rann", "annoy" # @param cache.index Store algorithm index with results for reuse # @param ... additional parameters to specific neighbor finding method # #' @importFrom methods new #' @importClassesFrom SeuratObject Neighbor # NNHelper <- function(data, query = data, k, method, cache.index = FALSE, ...) { args <- as.list(x = sys.frame(which = sys.nframe())) args <- c(args, list(...)) results <- ( switch( EXPR = method, "rann" = { args <- args[intersect(x = names(x = args), y = names(x = formals(fun = nn2)))] do.call(what = 'nn2', args = args) }, "annoy" = { args <- args[intersect(x = names(x = args), y = names(x = formals(fun = AnnoyNN)))] do.call(what = 'AnnoyNN', args = args) }, "hnsw" = { args <- args[intersect(x = names(x = args), y = names(x = formals(fun = HnswNN)))] do.call(what = 'HnswNN', args = args) }, stop("Invalid method. Please choose one of 'rann', 'annoy'") ) ) n.ob <- new( Class = 'Neighbor', nn.idx = results$nn.idx, nn.dist = results$nn.dists, alg.info = results$alg.info %||% list(), cell.names = rownames(x = query) ) if (isTRUE(x = cache.index) && !is.null(x = results$idx)) { slot(object = n.ob, name = "alg.idx") <- results$idx } return(n.ob) } #' Run Leiden clustering algorithm #' #' Returns a vector of partition indices. #' #' @param object An adjacency matrix or adjacency list. #' @param method DEPRECATED. #' @param partition.type Type of partition to use for Leiden algorithm. #' Defaults to "RBConfigurationVertexPartition", see #' https://cran.rstudio.com/web/packages/leidenbase/leidenbase.pdf for more options. #' @param initial.membership Passed to the `initial_membership` parameter #' of `leidenbase::leiden_find_partition`. #' @param node.sizes Passed to the `node_sizes` parameter of #' `leidenbase::leiden_find_partition`. #' @param resolution.parameter A parameter controlling the coarseness of the clusters #' for Leiden algorithm. Higher values lead to more clusters. (defaults to 1.0 for #' partition types that accept a resolution parameter) #' @param random.seed Seed of the random number generator, must be greater than 0. #' @param n.iter Maximal number of iterations per random start #' #' @importFrom igraph graph_from_adjacency_matrix graph_from_adj_list #' #' @export #' #' @rdname RunLeiden #' @concept clustering #' RunLeiden <- function( object, method = deprecated(), partition.type = c( 'RBConfigurationVertexPartition', 'ModularityVertexPartition', 'RBERVertexPartition', 'CPMVertexPartition', 'MutableVertexPartition', 'SignificanceVertexPartition', 'SurpriseVertexPartition' ), initial.membership = NULL, node.sizes = NULL, resolution.parameter = 1, random.seed = 1, n.iter = 10 ) { # `leidenbase::leiden_find_partition` requires it's `seed` parameter to be # greater than 0 (or NULL) but the default value for `FindClusters` is 0. # If `random.seed` is 0 or less, throw a warning and reset the value to 1. if (!is.null(random.seed) && random.seed <= 0) { warning( paste0( "`random.seed` must be greater than 0 for leiden clustering, ", "resetting `random.seed` to 1." ) ) random.seed <- 1 } # The `method` parameter was deprecated after switching from the `leiden` # package to `leidenbase` to run the algorithm. Unlike `leiden`, `leidenbase` # _requires_ an `igraph` input, so the parameter no longer makes sense. The # good news is that `leidenbase` is much faster than `leiden` so it shouldn't # really matter. if (is_present(method)) { deprecate_soft( when = "5.2.0", what = "RunLeiden(method)" ) } # Convert `object` into an `igraph`. # If `object` is already an `igraph` no conversion is necessary. if (inherits(object, what = "igraph")) { input <- object # Otherwise, if `object` is a list, assume it is an adjacency list... } else if (inherits(object, what = "list")) { # And convert it to an `igraph` with the appropriate method. input <- graph_from_adj_list(object) # Or, if `object` is a matrix... } else if (inherits(object, what = c("dgCMatrix", "matrix", "Matrix"))) { # Make sure the matrix is sparse. if (inherits(object, what = "Graph")) { object <- as.sparse(object) } # And then convert it to an graph. input <- graph_from_adjacency_matrix(object, weighted = TRUE) # Throw an error if `object` is of an unknown type. } else { stop( "Method for Leiden not found for class", class(object), call. = FALSE ) } # Run clustering with `leidenbase`. partition <- leidenbase::leiden_find_partition( input, partition_type = partition.type, initial_membership = initial.membership, edge_weights = NULL, node_sizes = node.sizes, resolution_parameter = resolution.parameter, seed = random.seed, num_iter = n.iter )$membership return(partition) } # Runs the modularity optimizer (C++ port of java program ModularityOptimizer.jar) # # @param SNN SNN matrix to use as input for the clustering algorithms # @param modularity Modularity function to use in clustering (1 = standard; 2 = alternative) # @param resolution Value of the resolution parameter, use a value above (below) 1.0 if you want to obtain a larger (smaller) number of communities # @param algorithm Algorithm for modularity optimization (1 = original Louvain algorithm; 2 = Louvain algorithm with multilevel refinement; 3 = SLM algorithm; 4 = Leiden algorithm). Leiden requires the leidenalg python module. # @param n.start Number of random starts # @param n.iter Maximal number of iterations per random start # @param random.seed Seed of the random number generator # @param print.output Whether or not to print output to the console # @param temp.file.location Deprecated and no longer used # @param edge.file.name Path to edge file to use # # @return Seurat object with identities set to the results of the clustering procedure # #' @importFrom utils read.table write.table # RunModularityClustering <- function( SNN = matrix(), modularity = 1, resolution = 0.8, algorithm = 1, n.start = 10, n.iter = 10, random.seed = 0, print.output = TRUE, temp.file.location = NULL, edge.file.name = NULL ) { edge_file <- edge.file.name %||% '' clusters <- RunModularityClusteringCpp( SNN, modularity, resolution, algorithm, n.start, n.iter, random.seed, print.output, edge_file ) return(clusters) } Seurat/data/0000755000176200001440000000000014670622051012431 5ustar liggesusersSeurat/data/cc.genes.rda0000644000176200001440000000101014670622051014576 0ustar liggesusersBZh91AY&SYJ®M*€ÿ€ÿðH À?ÿÞà*ƒ@ÝÝ»[ib&!OÐIê1ª¨Ð=!¦@jžjž&…=FÔÐh žšLMÂ4Ã@#!ê 4ÀH¤Ñ4žÒƒ&i=ÓCdÍ J©HWšI#µ'&ºú Åk…S¼Åëmšì‰j'n³ÁKdV‚ŽZИ¸ §il1M¤T"Fy‰».éD¢ÆÌÑû¤¶Õê ÝUäF.“åó¬7 LÆ4PÁ!hb@.UÁEöÿ¦‡]c`[ –î[ÕÊQÁ¨3„5¾\VdQp DóèY§ìøg9=ôXé§Y›*O>¦ó—¾éñ-ò ¾zâÆ€¡ÂEß®˜åÂÀ!‘Pµcvoô.Hš'àgI׸JÛºÂl°‹|¯â¶JÇ ¯i Ù3ð dhž˜à8I¡¨åXcHf†KÛ$ÀÉðáJò/ Y°™ŽöaU‚í=˜¦9Ö¥ŽÚÁÝMâ Ð|n´’R²µíê2,Ôb¬¯_·"iKFŽ)¢—­Bð“.$){ºå•ˆ-L‘¬5‰P"¨ŒÏo—?×4¬rx&›X±m±sÃ)%¹¤I1Ç,vÇ ñms¹Y8ç/ís÷g³ó£­bÉlv— ¶9`Á€ñ×ѯšv‚E‰¶ˆ(_:CqžUíNÐ)“y!C?Ô»,¼°º6Æ ‘wÉ™)å¢ü A¸;{í{«Gj’IiÒÒDåñS4\ô²°AV¸ÕE„ÑqÇK„(82³,zðln)Ê„*Ò–ì3DcK&Ð*j#õ·–8bì~ãL&²lyf"Lêkú éÛ^DŠò‡šàÅÊ𢠊£RÉšo„½Á†9 ‚RAOL ˾¬hR‰¯ê”!®i–͹›²kD24©^î‹öÃïŸ/>þ}è‹ ìFß®b? 5‰.Àþ.äŠp¡!ûaSeurat/src/0000755000176200001440000000000014744474101012312 5ustar liggesusersSeurat/src/data_manipulation.h0000644000176200001440000000544314670622051016157 0ustar liggesusers#ifndef DATA_MANIPULATION #define DATA_MANIPULATION #include #include #include #include #include #include using namespace Rcpp; //---------------------------------------------------- Eigen::SparseMatrix RunUMISampling(Eigen::SparseMatrix data, int sample_val, bool upsample, bool display_progress); Eigen::SparseMatrix RunUMISamplingPerCell(Eigen::SparseMatrix data, NumericVector sample_val, bool upsample, bool display_progress); Eigen::SparseMatrix RowMergeMatrices(Eigen::SparseMatrix mat1, Eigen::SparseMatrix mat2, std::vector< std::string > mat1_rownames, std::vector< std::string > mat2_rownames, std::vector< std::string > all_rownames); Eigen::SparseMatrix LogNorm(Eigen::SparseMatrix data, int scale_factor, bool display_progress ); NumericMatrix Standardize(const Eigen::Map mat, bool display_progress); Eigen::MatrixXd FastSparseRowScale(Eigen::SparseMatrix mat, bool scale, bool center, double scale_max, bool display_progress); Eigen::MatrixXd FastCov(Eigen::MatrixXd mat, bool center); Eigen::MatrixXd FastCovMats(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2, bool center); Eigen::MatrixXd FastRBind(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2); Eigen::VectorXd FastExpMean(Eigen::MatrixXd mat, bool display_progress); Eigen::VectorXd FastRowMean(Eigen::MatrixXd mat, bool display_progress); Eigen::VectorXd FastLogVMR(Eigen::SparseMatrix mat, bool display_progress); Eigen::VectorXd FastExpVar(Eigen::SparseMatrix mat, bool display_progress); Eigen::VectorXd SparseRowVar(Eigen::SparseMatrix mat, bool display_progress); NumericVector SparseRowVar2(Eigen::SparseMatrix mat, NumericVector mu, bool display_progress); NumericVector SparseRowVarStd(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sd, double vmax, bool display_progress); NumericVector RowVar(Eigen::Map x); template std::vector sort_indexes(const std::vector &v); List GraphToNeighborHelper(Eigen::SparseMatrix mat); //---------------------------------------------------- #endif//DATA_MANIPULATION Seurat/src/RcppExports.cpp0000644000176200001440000006036314744245313015320 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include #include using namespace Rcpp; #ifdef RCPP_USE_GLOBAL_ROSTREAM Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); #endif // RunModularityClusteringCpp IntegerVector RunModularityClusteringCpp(Eigen::SparseMatrix SNN, int modularityFunction, double resolution, int algorithm, int nRandomStarts, int nIterations, int randomSeed, bool printOutput, std::string edgefilename); RcppExport SEXP _Seurat_RunModularityClusteringCpp(SEXP SNNSEXP, SEXP modularityFunctionSEXP, SEXP resolutionSEXP, SEXP algorithmSEXP, SEXP nRandomStartsSEXP, SEXP nIterationsSEXP, SEXP randomSeedSEXP, SEXP printOutputSEXP, SEXP edgefilenameSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type SNN(SNNSEXP); Rcpp::traits::input_parameter< int >::type modularityFunction(modularityFunctionSEXP); Rcpp::traits::input_parameter< double >::type resolution(resolutionSEXP); Rcpp::traits::input_parameter< int >::type algorithm(algorithmSEXP); Rcpp::traits::input_parameter< int >::type nRandomStarts(nRandomStartsSEXP); Rcpp::traits::input_parameter< int >::type nIterations(nIterationsSEXP); Rcpp::traits::input_parameter< int >::type randomSeed(randomSeedSEXP); Rcpp::traits::input_parameter< bool >::type printOutput(printOutputSEXP); Rcpp::traits::input_parameter< std::string >::type edgefilename(edgefilenameSEXP); rcpp_result_gen = Rcpp::wrap(RunModularityClusteringCpp(SNN, modularityFunction, resolution, algorithm, nRandomStarts, nIterations, randomSeed, printOutput, edgefilename)); return rcpp_result_gen; END_RCPP } // RunUMISampling Eigen::SparseMatrix RunUMISampling(Eigen::SparseMatrix data, int sample_val, bool upsample, bool display_progress); RcppExport SEXP _Seurat_RunUMISampling(SEXP dataSEXP, SEXP sample_valSEXP, SEXP upsampleSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type data(dataSEXP); Rcpp::traits::input_parameter< int >::type sample_val(sample_valSEXP); Rcpp::traits::input_parameter< bool >::type upsample(upsampleSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(RunUMISampling(data, sample_val, upsample, display_progress)); return rcpp_result_gen; END_RCPP } // RunUMISamplingPerCell Eigen::SparseMatrix RunUMISamplingPerCell(Eigen::SparseMatrix data, NumericVector sample_val, bool upsample, bool display_progress); RcppExport SEXP _Seurat_RunUMISamplingPerCell(SEXP dataSEXP, SEXP sample_valSEXP, SEXP upsampleSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type data(dataSEXP); Rcpp::traits::input_parameter< NumericVector >::type sample_val(sample_valSEXP); Rcpp::traits::input_parameter< bool >::type upsample(upsampleSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(RunUMISamplingPerCell(data, sample_val, upsample, display_progress)); return rcpp_result_gen; END_RCPP } // RowMergeMatrices Eigen::SparseMatrix RowMergeMatrices(Eigen::SparseMatrix mat1, Eigen::SparseMatrix mat2, std::vector< std::string > mat1_rownames, std::vector< std::string > mat2_rownames, std::vector< std::string > all_rownames); RcppExport SEXP _Seurat_RowMergeMatrices(SEXP mat1SEXP, SEXP mat2SEXP, SEXP mat1_rownamesSEXP, SEXP mat2_rownamesSEXP, SEXP all_rownamesSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat1(mat1SEXP); Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat2(mat2SEXP); Rcpp::traits::input_parameter< std::vector< std::string > >::type mat1_rownames(mat1_rownamesSEXP); Rcpp::traits::input_parameter< std::vector< std::string > >::type mat2_rownames(mat2_rownamesSEXP); Rcpp::traits::input_parameter< std::vector< std::string > >::type all_rownames(all_rownamesSEXP); rcpp_result_gen = Rcpp::wrap(RowMergeMatrices(mat1, mat2, mat1_rownames, mat2_rownames, all_rownames)); return rcpp_result_gen; END_RCPP } // LogNorm Eigen::SparseMatrix LogNorm(Eigen::SparseMatrix data, int scale_factor, bool display_progress); RcppExport SEXP _Seurat_LogNorm(SEXP dataSEXP, SEXP scale_factorSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type data(dataSEXP); Rcpp::traits::input_parameter< int >::type scale_factor(scale_factorSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(LogNorm(data, scale_factor, display_progress)); return rcpp_result_gen; END_RCPP } // Standardize NumericMatrix Standardize(Eigen::Map mat, bool display_progress); RcppExport SEXP _Seurat_Standardize(SEXP matSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::Map >::type mat(matSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(Standardize(mat, display_progress)); return rcpp_result_gen; END_RCPP } // FastSparseRowScale Eigen::MatrixXd FastSparseRowScale(Eigen::SparseMatrix mat, bool scale, bool center, double scale_max, bool display_progress); RcppExport SEXP _Seurat_FastSparseRowScale(SEXP matSEXP, SEXP scaleSEXP, SEXP centerSEXP, SEXP scale_maxSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< bool >::type scale(scaleSEXP); Rcpp::traits::input_parameter< bool >::type center(centerSEXP); Rcpp::traits::input_parameter< double >::type scale_max(scale_maxSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(FastSparseRowScale(mat, scale, center, scale_max, display_progress)); return rcpp_result_gen; END_RCPP } // FastSparseRowScaleWithKnownStats Eigen::MatrixXd FastSparseRowScaleWithKnownStats(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sigma, bool scale, bool center, double scale_max, bool display_progress); RcppExport SEXP _Seurat_FastSparseRowScaleWithKnownStats(SEXP matSEXP, SEXP muSEXP, SEXP sigmaSEXP, SEXP scaleSEXP, SEXP centerSEXP, SEXP scale_maxSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< NumericVector >::type mu(muSEXP); Rcpp::traits::input_parameter< NumericVector >::type sigma(sigmaSEXP); Rcpp::traits::input_parameter< bool >::type scale(scaleSEXP); Rcpp::traits::input_parameter< bool >::type center(centerSEXP); Rcpp::traits::input_parameter< double >::type scale_max(scale_maxSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(FastSparseRowScaleWithKnownStats(mat, mu, sigma, scale, center, scale_max, display_progress)); return rcpp_result_gen; END_RCPP } // FastCov Eigen::MatrixXd FastCov(Eigen::MatrixXd mat, bool center); RcppExport SEXP _Seurat_FastCov(SEXP matSEXP, SEXP centerSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat(matSEXP); Rcpp::traits::input_parameter< bool >::type center(centerSEXP); rcpp_result_gen = Rcpp::wrap(FastCov(mat, center)); return rcpp_result_gen; END_RCPP } // FastCovMats Eigen::MatrixXd FastCovMats(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2, bool center); RcppExport SEXP _Seurat_FastCovMats(SEXP mat1SEXP, SEXP mat2SEXP, SEXP centerSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat1(mat1SEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat2(mat2SEXP); Rcpp::traits::input_parameter< bool >::type center(centerSEXP); rcpp_result_gen = Rcpp::wrap(FastCovMats(mat1, mat2, center)); return rcpp_result_gen; END_RCPP } // FastRBind Eigen::MatrixXd FastRBind(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2); RcppExport SEXP _Seurat_FastRBind(SEXP mat1SEXP, SEXP mat2SEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat1(mat1SEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat2(mat2SEXP); rcpp_result_gen = Rcpp::wrap(FastRBind(mat1, mat2)); return rcpp_result_gen; END_RCPP } // FastExpMean Eigen::VectorXd FastExpMean(Eigen::SparseMatrix mat, bool display_progress); RcppExport SEXP _Seurat_FastExpMean(SEXP matSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(FastExpMean(mat, display_progress)); return rcpp_result_gen; END_RCPP } // SparseRowVar2 NumericVector SparseRowVar2(Eigen::SparseMatrix mat, NumericVector mu, bool display_progress); RcppExport SEXP _Seurat_SparseRowVar2(SEXP matSEXP, SEXP muSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< NumericVector >::type mu(muSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(SparseRowVar2(mat, mu, display_progress)); return rcpp_result_gen; END_RCPP } // SparseRowVarStd NumericVector SparseRowVarStd(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sd, double vmax, bool display_progress); RcppExport SEXP _Seurat_SparseRowVarStd(SEXP matSEXP, SEXP muSEXP, SEXP sdSEXP, SEXP vmaxSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< NumericVector >::type mu(muSEXP); Rcpp::traits::input_parameter< NumericVector >::type sd(sdSEXP); Rcpp::traits::input_parameter< double >::type vmax(vmaxSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(SparseRowVarStd(mat, mu, sd, vmax, display_progress)); return rcpp_result_gen; END_RCPP } // FastLogVMR Eigen::VectorXd FastLogVMR(Eigen::SparseMatrix mat, bool display_progress); RcppExport SEXP _Seurat_FastLogVMR(SEXP matSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(FastLogVMR(mat, display_progress)); return rcpp_result_gen; END_RCPP } // RowVar NumericVector RowVar(Eigen::Map x); RcppExport SEXP _Seurat_RowVar(SEXP xSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::Map >::type x(xSEXP); rcpp_result_gen = Rcpp::wrap(RowVar(x)); return rcpp_result_gen; END_RCPP } // SparseRowVar Eigen::VectorXd SparseRowVar(Eigen::SparseMatrix mat, bool display_progress); RcppExport SEXP _Seurat_SparseRowVar(SEXP matSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(SparseRowVar(mat, display_progress)); return rcpp_result_gen; END_RCPP } // ReplaceColsC Eigen::SparseMatrix ReplaceColsC(Eigen::SparseMatrix mat, NumericVector col_idx, Eigen::SparseMatrix replacement); RcppExport SEXP _Seurat_ReplaceColsC(SEXP matSEXP, SEXP col_idxSEXP, SEXP replacementSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); Rcpp::traits::input_parameter< NumericVector >::type col_idx(col_idxSEXP); Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type replacement(replacementSEXP); rcpp_result_gen = Rcpp::wrap(ReplaceColsC(mat, col_idx, replacement)); return rcpp_result_gen; END_RCPP } // GraphToNeighborHelper List GraphToNeighborHelper(Eigen::SparseMatrix mat); RcppExport SEXP _Seurat_GraphToNeighborHelper(SEXP matSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); rcpp_result_gen = Rcpp::wrap(GraphToNeighborHelper(mat)); return rcpp_result_gen; END_RCPP } // fast_dist List fast_dist(NumericMatrix x, NumericMatrix y, List n); RcppExport SEXP _Seurat_fast_dist(SEXP xSEXP, SEXP ySEXP, SEXP nSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericMatrix >::type x(xSEXP); Rcpp::traits::input_parameter< NumericMatrix >::type y(ySEXP); Rcpp::traits::input_parameter< List >::type n(nSEXP); rcpp_result_gen = Rcpp::wrap(fast_dist(x, y, n)); return rcpp_result_gen; END_RCPP } // FindWeightsC Eigen::SparseMatrix FindWeightsC(NumericVector cells2, Eigen::MatrixXd distances, std::vector anchor_cells2, std::vector integration_matrix_rownames, Eigen::MatrixXd cell_index, Eigen::VectorXd anchor_score, double min_dist, double sd, bool display_progress); RcppExport SEXP _Seurat_FindWeightsC(SEXP cells2SEXP, SEXP distancesSEXP, SEXP anchor_cells2SEXP, SEXP integration_matrix_rownamesSEXP, SEXP cell_indexSEXP, SEXP anchor_scoreSEXP, SEXP min_distSEXP, SEXP sdSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< NumericVector >::type cells2(cells2SEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type distances(distancesSEXP); Rcpp::traits::input_parameter< std::vector >::type anchor_cells2(anchor_cells2SEXP); Rcpp::traits::input_parameter< std::vector >::type integration_matrix_rownames(integration_matrix_rownamesSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type cell_index(cell_indexSEXP); Rcpp::traits::input_parameter< Eigen::VectorXd >::type anchor_score(anchor_scoreSEXP); Rcpp::traits::input_parameter< double >::type min_dist(min_distSEXP); Rcpp::traits::input_parameter< double >::type sd(sdSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(FindWeightsC(cells2, distances, anchor_cells2, integration_matrix_rownames, cell_index, anchor_score, min_dist, sd, display_progress)); return rcpp_result_gen; END_RCPP } // IntegrateDataC Eigen::SparseMatrix IntegrateDataC(Eigen::SparseMatrix integration_matrix, Eigen::SparseMatrix weights, Eigen::SparseMatrix expression_cells2); RcppExport SEXP _Seurat_IntegrateDataC(SEXP integration_matrixSEXP, SEXP weightsSEXP, SEXP expression_cells2SEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type integration_matrix(integration_matrixSEXP); Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type weights(weightsSEXP); Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type expression_cells2(expression_cells2SEXP); rcpp_result_gen = Rcpp::wrap(IntegrateDataC(integration_matrix, weights, expression_cells2)); return rcpp_result_gen; END_RCPP } // ScoreHelper std::vector ScoreHelper(Eigen::SparseMatrix snn, Eigen::MatrixXd query_pca, Eigen::MatrixXd query_dists, Eigen::MatrixXd corrected_nns, int k_snn, bool subtract_first_nn, bool display_progress); RcppExport SEXP _Seurat_ScoreHelper(SEXP snnSEXP, SEXP query_pcaSEXP, SEXP query_distsSEXP, SEXP corrected_nnsSEXP, SEXP k_snnSEXP, SEXP subtract_first_nnSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type snn(snnSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type query_pca(query_pcaSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type query_dists(query_distsSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type corrected_nns(corrected_nnsSEXP); Rcpp::traits::input_parameter< int >::type k_snn(k_snnSEXP); Rcpp::traits::input_parameter< bool >::type subtract_first_nn(subtract_first_nnSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); rcpp_result_gen = Rcpp::wrap(ScoreHelper(snn, query_pca, query_dists, corrected_nns, k_snn, subtract_first_nn, display_progress)); return rcpp_result_gen; END_RCPP } // ComputeSNN Eigen::SparseMatrix ComputeSNN(Eigen::MatrixXd nn_ranked, double prune); RcppExport SEXP _Seurat_ComputeSNN(SEXP nn_rankedSEXP, SEXP pruneSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::MatrixXd >::type nn_ranked(nn_rankedSEXP); Rcpp::traits::input_parameter< double >::type prune(pruneSEXP); rcpp_result_gen = Rcpp::wrap(ComputeSNN(nn_ranked, prune)); return rcpp_result_gen; END_RCPP } // WriteEdgeFile void WriteEdgeFile(Eigen::SparseMatrix snn, String filename, bool display_progress); RcppExport SEXP _Seurat_WriteEdgeFile(SEXP snnSEXP, SEXP filenameSEXP, SEXP display_progressSEXP) { BEGIN_RCPP Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type snn(snnSEXP); Rcpp::traits::input_parameter< String >::type filename(filenameSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); WriteEdgeFile(snn, filename, display_progress); return R_NilValue; END_RCPP } // DirectSNNToFile Eigen::SparseMatrix DirectSNNToFile(Eigen::MatrixXd nn_ranked, double prune, bool display_progress, String filename); RcppExport SEXP _Seurat_DirectSNNToFile(SEXP nn_rankedSEXP, SEXP pruneSEXP, SEXP display_progressSEXP, SEXP filenameSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::traits::input_parameter< Eigen::MatrixXd >::type nn_ranked(nn_rankedSEXP); Rcpp::traits::input_parameter< double >::type prune(pruneSEXP); Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); Rcpp::traits::input_parameter< String >::type filename(filenameSEXP); rcpp_result_gen = Rcpp::wrap(DirectSNNToFile(nn_ranked, prune, display_progress, filename)); return rcpp_result_gen; END_RCPP } // SNN_SmallestNonzero_Dist std::vector SNN_SmallestNonzero_Dist(Eigen::SparseMatrix snn, Eigen::MatrixXd mat, int n, std::vector nearest_dist); RcppExport SEXP _Seurat_SNN_SmallestNonzero_Dist(SEXP snnSEXP, SEXP matSEXP, SEXP nSEXP, SEXP nearest_distSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type snn(snnSEXP); Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat(matSEXP); Rcpp::traits::input_parameter< int >::type n(nSEXP); Rcpp::traits::input_parameter< std::vector >::type nearest_dist(nearest_distSEXP); rcpp_result_gen = Rcpp::wrap(SNN_SmallestNonzero_Dist(snn, mat, n, nearest_dist)); return rcpp_result_gen; END_RCPP } // row_sum_dgcmatrix NumericVector row_sum_dgcmatrix(NumericVector& x, IntegerVector& i, int rows, int cols); RcppExport SEXP _Seurat_row_sum_dgcmatrix(SEXP xSEXP, SEXP iSEXP, SEXP rowsSEXP, SEXP colsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector& >::type x(xSEXP); Rcpp::traits::input_parameter< IntegerVector& >::type i(iSEXP); Rcpp::traits::input_parameter< int >::type rows(rowsSEXP); Rcpp::traits::input_parameter< int >::type cols(colsSEXP); rcpp_result_gen = Rcpp::wrap(row_sum_dgcmatrix(x, i, rows, cols)); return rcpp_result_gen; END_RCPP } // row_mean_dgcmatrix NumericVector row_mean_dgcmatrix(NumericVector& x, IntegerVector& i, int rows, int cols); RcppExport SEXP _Seurat_row_mean_dgcmatrix(SEXP xSEXP, SEXP iSEXP, SEXP rowsSEXP, SEXP colsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector& >::type x(xSEXP); Rcpp::traits::input_parameter< IntegerVector& >::type i(iSEXP); Rcpp::traits::input_parameter< int >::type rows(rowsSEXP); Rcpp::traits::input_parameter< int >::type cols(colsSEXP); rcpp_result_gen = Rcpp::wrap(row_mean_dgcmatrix(x, i, rows, cols)); return rcpp_result_gen; END_RCPP } // row_var_dgcmatrix NumericVector row_var_dgcmatrix(NumericVector& x, IntegerVector& i, int rows, int cols); RcppExport SEXP _Seurat_row_var_dgcmatrix(SEXP xSEXP, SEXP iSEXP, SEXP rowsSEXP, SEXP colsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< NumericVector& >::type x(xSEXP); Rcpp::traits::input_parameter< IntegerVector& >::type i(iSEXP); Rcpp::traits::input_parameter< int >::type rows(rowsSEXP); Rcpp::traits::input_parameter< int >::type cols(colsSEXP); rcpp_result_gen = Rcpp::wrap(row_var_dgcmatrix(x, i, rows, cols)); return rcpp_result_gen; END_RCPP } RcppExport SEXP isnull(SEXP); static const R_CallMethodDef CallEntries[] = { {"_Seurat_RunModularityClusteringCpp", (DL_FUNC) &_Seurat_RunModularityClusteringCpp, 9}, {"_Seurat_RunUMISampling", (DL_FUNC) &_Seurat_RunUMISampling, 4}, {"_Seurat_RunUMISamplingPerCell", (DL_FUNC) &_Seurat_RunUMISamplingPerCell, 4}, {"_Seurat_RowMergeMatrices", (DL_FUNC) &_Seurat_RowMergeMatrices, 5}, {"_Seurat_LogNorm", (DL_FUNC) &_Seurat_LogNorm, 3}, {"_Seurat_Standardize", (DL_FUNC) &_Seurat_Standardize, 2}, {"_Seurat_FastSparseRowScale", (DL_FUNC) &_Seurat_FastSparseRowScale, 5}, {"_Seurat_FastSparseRowScaleWithKnownStats", (DL_FUNC) &_Seurat_FastSparseRowScaleWithKnownStats, 7}, {"_Seurat_FastCov", (DL_FUNC) &_Seurat_FastCov, 2}, {"_Seurat_FastCovMats", (DL_FUNC) &_Seurat_FastCovMats, 3}, {"_Seurat_FastRBind", (DL_FUNC) &_Seurat_FastRBind, 2}, {"_Seurat_FastExpMean", (DL_FUNC) &_Seurat_FastExpMean, 2}, {"_Seurat_SparseRowVar2", (DL_FUNC) &_Seurat_SparseRowVar2, 3}, {"_Seurat_SparseRowVarStd", (DL_FUNC) &_Seurat_SparseRowVarStd, 5}, {"_Seurat_FastLogVMR", (DL_FUNC) &_Seurat_FastLogVMR, 2}, {"_Seurat_RowVar", (DL_FUNC) &_Seurat_RowVar, 1}, {"_Seurat_SparseRowVar", (DL_FUNC) &_Seurat_SparseRowVar, 2}, {"_Seurat_ReplaceColsC", (DL_FUNC) &_Seurat_ReplaceColsC, 3}, {"_Seurat_GraphToNeighborHelper", (DL_FUNC) &_Seurat_GraphToNeighborHelper, 1}, {"_Seurat_fast_dist", (DL_FUNC) &_Seurat_fast_dist, 3}, {"_Seurat_FindWeightsC", (DL_FUNC) &_Seurat_FindWeightsC, 9}, {"_Seurat_IntegrateDataC", (DL_FUNC) &_Seurat_IntegrateDataC, 3}, {"_Seurat_ScoreHelper", (DL_FUNC) &_Seurat_ScoreHelper, 7}, {"_Seurat_ComputeSNN", (DL_FUNC) &_Seurat_ComputeSNN, 2}, {"_Seurat_WriteEdgeFile", (DL_FUNC) &_Seurat_WriteEdgeFile, 3}, {"_Seurat_DirectSNNToFile", (DL_FUNC) &_Seurat_DirectSNNToFile, 4}, {"_Seurat_SNN_SmallestNonzero_Dist", (DL_FUNC) &_Seurat_SNN_SmallestNonzero_Dist, 4}, {"_Seurat_row_sum_dgcmatrix", (DL_FUNC) &_Seurat_row_sum_dgcmatrix, 4}, {"_Seurat_row_mean_dgcmatrix", (DL_FUNC) &_Seurat_row_mean_dgcmatrix, 4}, {"_Seurat_row_var_dgcmatrix", (DL_FUNC) &_Seurat_row_var_dgcmatrix, 4}, {"isnull", (DL_FUNC) &isnull, 1}, {NULL, NULL, 0} }; RcppExport void R_init_Seurat(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } Seurat/src/integration.h0000644000176200001440000000175414670622051015012 0ustar liggesusers#ifndef CORRECT_EXPRESSION #define CORRECT_EXPRESSION #include #include using namespace Rcpp; //---------------------------------------------------- Eigen::SparseMatrix FindWeightsC( NumericVector cells2, Eigen::MatrixXd distances, std::vector anchor_cells2, std::vector integration_matrix_rownames, Eigen::MatrixXd cell_index, Eigen::VectorXd anchor_score, double min_dist, double sd, bool display_progress ); Eigen::SparseMatrix IntegrateDataC( Eigen::SparseMatrix integration_matrix, Eigen::SparseMatrix weights, Eigen::SparseMatrix expression_cells2 ); std::vector ScoreHelper( Eigen::SparseMatrix snn, Eigen::MatrixXd query_pca, Eigen::MatrixXd query_dists, Eigen::MatrixXd corrected_nns, int k_snn, bool subtract_first_nn, bool display_progress ); //---------------------------------------------------- #endif//CORRECT_EXPRESSION Seurat/src/integration.cpp0000644000176200001440000001507314730427000015336 0ustar liggesusers#include #include #include #include "data_manipulation.h" using namespace Rcpp; // [[Rcpp::depends(RcppEigen)]] // [[Rcpp::depends(RcppProgress)]] typedef Eigen::Triplet T; // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix FindWeightsC( NumericVector cells2, Eigen::MatrixXd distances, std::vector anchor_cells2, std::vector integration_matrix_rownames, Eigen::MatrixXd cell_index, Eigen::VectorXd anchor_score, double min_dist, double sd, bool display_progress ) { std::vector tripletList; tripletList.reserve(anchor_cells2.size() * 10); std::unordered_map> cell_map; Progress p(anchor_cells2.size() + cells2.size() , display_progress); // build map from anchor_cells2 to integration_matrix rows for(int i=0; i matches; std::vector::iterator iter = integration_matrix_rownames.begin(); while ((iter = std::find(iter, integration_matrix_rownames.end(), anchor_cells2[i])) != integration_matrix_rownames.end()) { int idx = std::distance(integration_matrix_rownames.begin(), iter); matches.push_back(idx); iter++; } cell_map[i] = matches; p.increment(); } // Construct dist_weights matrix for(auto const &cell : cells2){ Eigen::VectorXd dist = distances.row(cell); Eigen::VectorXd indices = cell_index.row(cell); int k=0; //number of anchors used so far; a cell in the neighbor list may contribute to multiple anchors for(int i=0; i mnn_idx = cell_map[indices[i]-1]; for(int j=0; j return_mat; if(min_dist == 0){ Eigen::SparseMatrix dist_weights(integration_matrix_rownames.size(), cells2.size()); dist_weights.setFromTriplets(tripletList.begin(), tripletList.end(), [] (const double&, const double &b) { return b; }); Eigen::VectorXd colSums = dist_weights.transpose() * Eigen::VectorXd::Ones(dist_weights.rows()); for (int k=0; k < dist_weights.outerSize(); ++k){ for (Eigen::SparseMatrix::InnerIterator it(dist_weights, k); it; ++it){ it.valueRef() = it.value()/colSums[k]; } } return_mat = dist_weights; } else { Eigen::MatrixXd dist_weights = Eigen::MatrixXd::Constant(integration_matrix_rownames.size(), cells2.size(), min_dist); for(int i = 0; i < dist_weights.cols(); ++i){ for(int j = 0; j < dist_weights.rows(); ++j){ dist_weights(j, i) = 1 - exp(-1 * dist_weights(j, i) * anchor_score[j]/ pow(2/sd, 2) ); } } for(auto const &weight : tripletList){ dist_weights(weight.row(), weight.col()) = weight.value(); } Eigen::VectorXd colSums = dist_weights.colwise().sum(); for(int i = 0; i < dist_weights.cols(); ++i){ for(int j = 0; j < dist_weights.rows(); ++j){ dist_weights(j, i) = dist_weights(j, i) / colSums[i]; } } return_mat = dist_weights.sparseView(); } return(return_mat); } // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix IntegrateDataC( Eigen::SparseMatrix integration_matrix, Eigen::SparseMatrix weights, Eigen::SparseMatrix expression_cells2 ) { Eigen::SparseMatrix corrected = expression_cells2 - weights.transpose() * integration_matrix; return(corrected); } template std::vector sort_indexes(const std::vector &v) { // initialize original index locations std::vector idx(v.size()); std::iota(idx.begin(), idx.end(), 0); std::stable_sort(idx.begin(), idx.end(), [&v](size_t i1, size_t i2) {return v[i1] < v[i2];}); return idx; } // [[Rcpp::export]] std::vector ScoreHelper( Eigen::SparseMatrix snn, Eigen::MatrixXd query_pca, Eigen::MatrixXd query_dists, Eigen::MatrixXd corrected_nns, int k_snn, bool subtract_first_nn, bool display_progress ) { std::vector scores; // Loop over all query cells Progress p(snn.outerSize(), display_progress); for (int i=0; i < snn.outerSize(); ++i){ p.increment(); // create vectors to store the nonzero snn elements and their indices std::vector nonzero; std::vector nonzero_idx; for (Eigen::SparseMatrix::InnerIterator it(snn, i); it; ++it) { nonzero.push_back(it.value()); nonzero_idx.push_back(it.row()); } // find the k_snn cells with the smallest non-zero edge weights to use in // computing the transition probability bandwidth std::vector nonzero_order = sort_indexes(nonzero); std::vector bw_dists; int k_snn_i = k_snn; if (k_snn_i > nonzero_order.size()) k_snn_i = nonzero_order.size(); for (int j = 0; j < nonzero_order.size(); ++j) { // compute euclidean distances to cells with small edge weights size_t cell = nonzero_idx[nonzero_order[j]]; if(bw_dists.size() < k_snn_i || nonzero[nonzero_order[j]] == nonzero[nonzero_order[k_snn_i-1]]) { double res = (query_pca.col(cell) - query_pca.col(i)).norm(); bw_dists.push_back(res); } else { break; } } // compute bandwidth as the mean distance of the farthest k_snn cells double bw; if (bw_dists.size() > k_snn_i) { std::sort(bw_dists.rbegin(), bw_dists.rend()); bw = std::accumulate(bw_dists.begin(), bw_dists.begin() + k_snn_i, 0.0) / k_snn_i; } else { bw = std::accumulate(bw_dists.begin(), bw_dists.end(), 0.0) / bw_dists.size(); } // compute transition probabilites double first_neighbor_dist; // subtract off distance to first neighbor? if (subtract_first_nn) { first_neighbor_dist = query_dists(i, 1); } else { first_neighbor_dist = 0; } bw = bw - first_neighbor_dist; double q_tps = 0; for(int j = 0; j < query_dists.cols(); ++j) { q_tps += std::exp(-1 * (query_dists(i, j) - first_neighbor_dist) / bw); } q_tps = q_tps/(query_dists.cols()); double c_tps = 0; for(int j = 0; j < corrected_nns.cols(); ++j) { c_tps += exp(-1 * ((query_pca.col(i) - query_pca.col(corrected_nns(i, j)-1)).norm() - first_neighbor_dist) / bw); } c_tps = c_tps/(corrected_nns.cols()); scores.push_back(c_tps/q_tps); } return(scores); } Seurat/src/ModularityOptimizer.h0000644000176200001440000001323514670622051016520 0ustar liggesusers#pragma once #include #include #include #include #include #include #include #include typedef std::vector IVector; typedef std::vector DVector; namespace ModularityOptimizer { class JavaRandom { private: uint64_t seed; int next(int bits); public: JavaRandom(uint64_t seed); int nextInt(int n); void setSeed(uint64_t seed); }; namespace Arrays2 { IVector generateRandomPermutation(int nElements); IVector generateRandomPermutation(int nElements, JavaRandom& random); } class Clustering { private: int nNodes; public: // Note: These two variables were "protected" in java, which means it is accessible to the whole package/public. // Although we could have used friend classes, this allows for better mirroring of the original code. int nClusters; IVector cluster; Clustering(int nNodes); Clustering(IVector cluster); int getNNodes() const {return nNodes;}; int getNClusters() const {return nClusters;}; IVector getClusters() const {return cluster;}; int getCluster(int node) const {return cluster[node];}; IVector getNNodesPerCluster() const; std::vector getNodesPerCluster() const; void setCluster(int node, int cluster); void initSingletonClusters(); void orderClustersByNNodes(); void mergeClusters(const Clustering& clustering); }; class Network { friend class VOSClusteringTechnique; protected: int nNodes; int nEdges; DVector nodeWeight; IVector firstNeighborIndex; IVector neighbor; DVector edgeWeight; double totalEdgeWeightSelfLinks; public: Network(); Network(int nNodes, DVector* nodeWeight, std::vector& edge, DVector* edgeWeight); Network(int nNodes, std::vector& edge) : Network(nNodes, nullptr, edge, nullptr) { }; Network(int nNodes, DVector* nodeWeight, std::vector edge) : Network(nNodes, nodeWeight, edge, nullptr) {}; Network(int nNodes, std::vector& edge, DVector* edgeWeight) : Network(nNodes, nullptr, edge, edgeWeight) {}; Network(int nNodes, DVector* nodeWeight, IVector& firstNeighborIndex, IVector& neighbor, DVector* edgeWeight); Network(int nNodes, IVector& firstNeighborIndex, IVector& neighbor) : Network(nNodes, nullptr, firstNeighborIndex, neighbor, nullptr) {}; Network(int nNodes, DVector* nodeWeight, IVector& firstNeighborIndex, IVector& neighbor) : Network(nNodes, nodeWeight, firstNeighborIndex, neighbor, nullptr){}; Network(int nNodes, IVector& firstNeighborIndex, IVector& neighbor, DVector* edgeWeight) : Network(nNodes, nullptr, firstNeighborIndex, neighbor, edgeWeight) {}; int getNNodes() {return nNodes;}; double getTotalNodeWeight(); DVector getNodeWeights(); double getNodeWeight(int node) { return nodeWeight.at(node);}; int getNEdges() {return nEdges / 2;}; int getNEdges(int node) {return firstNeighborIndex.at(node + 1) - firstNeighborIndex.at(node);}; IVector getNEdgesPerNode(); std::vector getEdges(); IVector getEdges(int node); std::vector getEdgesPerNode(); double getTotalEdgeWeight(); double getTotalEdgeWeight(int node); DVector getTotalEdgeWeightPerNode(); DVector getEdgeWeights() {return edgeWeight;}; DVector getEdgeWeights(int node); std::vector getEdgeWeightsPerNode(); double getTotalEdgeWeightSelfLinks() { return totalEdgeWeightSelfLinks; }; // Added these to avoid making these values public int getFirstNeighborIndexValue(int i) const { return firstNeighborIndex.at(i); }; int getNeighborValue(int index) const { return neighbor.at(index); } std::vector createSubnetworks(Clustering clustering) const; Network createReducedNetwork(const Clustering& clustering) const; Clustering identifyComponents(); private: double generateRandomNumber(int node1, int node2, const IVector& nodePermutation); Network createSubnetwork(const Clustering& clustering, int cluster, IVector& node, IVector& subnetworkNode, IVector& subnetworkNeighbor, DVector& subnetworkEdgeWeight) const; }; class VOSClusteringTechnique { private: std::shared_ptr network; std::shared_ptr clustering; double resolution; public: VOSClusteringTechnique(std::shared_ptr network, double resolution); VOSClusteringTechnique(std::shared_ptr network, std::shared_ptr clustering, double resolution); std::shared_ptr getNetwork() { return network;} std::shared_ptr getClustering() { return clustering; } double getResolution() {return resolution; } void setNetwork(std::shared_ptr network) {this->network = network;} void setClustering(std::shared_ptr clustering) {this->clustering = clustering;} void setResolution(double resolution) {this->resolution = resolution;} double calcQualityFunction(); bool runLocalMovingAlgorithm(JavaRandom& random); bool runLouvainAlgorithm(JavaRandom& random); bool runIteratedLouvainAlgorithm(int maxNIterations, JavaRandom& random); bool runLouvainAlgorithmWithMultilevelRefinement(JavaRandom& random); bool runIteratedLouvainAlgorithmWithMultilevelRefinement(int maxNIterations, JavaRandom& random); bool runSmartLocalMovingAlgorithm(JavaRandom& random); bool runIteratedSmartLocalMovingAlgorithm(int nIterations, JavaRandom& random); int removeCluster(int cluster); void removeSmallClusters(int minNNodesPerCluster); }; std::shared_ptr matrixToNetwork(IVector& node1, IVector& node2, DVector& edgeWeight1, int modularityFunction, int nNodes); std::shared_ptr readInputFile(std::string fname, int modularityFunction); std::vector split(const std::string& s, char delimiter); }; Seurat/src/ModularityOptimizer.cpp0000644000176200001440000010141514670622051017051 0ustar liggesusers// This code is a translation of the Java package, ModularityOptimizer.jar, // available from http://www.ludowaltman.nl/slm/ that performs clustering and was // used by an earlier version of Seurat. // // In translating the code, the interface was maintained, such that the although // the programming languages changed, the results are identical. As a // consequence, rather than rewriting the program to be more idiomatic Rcpp/C++, // both the output and the code was kept as close to the original Java as // possible. For example, in order to maintain compatibility, the Java random // number generator was implemented in C++, and std::stable_sort was used in // place of std::sort to match the output results of the Java code exactly. // // In order to test and verify that the C++ and Java code return the same // results, the C++ code added also includes a mirror of the original command // line interface. This version of the program can be compiled with a command // such as: // // clang++ -O3 -std=c++11 -DSTANDALONE -Wall -g ModularityOptimizer.cpp // // And can then be called in an identical fashion to the original Java version to // verify compatibility or identify any issues in the input/output. #include "ModularityOptimizer.h" #include #include #include #include #include using namespace ModularityOptimizer; using namespace std::chrono; JavaRandom::JavaRandom(uint64_t seed) { setSeed(seed); } void JavaRandom::setSeed(uint64_t seed) { this->seed = (seed ^ uint64_t(0x5DEECE66D)) & ((uint64_t(1) << 48) - 1); } int JavaRandom::next(int bits) { // Only 31 bits ever used. seed = (seed * uint64_t(0x5DEECE66D) + uint64_t(0xB)) & ((uint64_t(1) << 48) - 1); return static_cast(seed >> (48 - bits)); } int JavaRandom::nextInt(int n) { if (n <= 0) throw std::out_of_range("n must be positive"); if ((n & -n) == n) // i.e., n is a power of 2 return static_cast((static_cast(n) * static_cast(next(31))) >> 31); int bits, val; do { bits = next(31); val = bits % n; } while (bits - val + (n - 1) < 0); return val; } IVector Arrays2::generateRandomPermutation(int nElements, JavaRandom& random) { IVector permutation(nElements, 0); for (int i = 0; i < nElements; i++) permutation[i] = i; for (int i = 0; i < nElements; i++) { int j = random.nextInt(nElements); int k = permutation[i]; permutation[i] = permutation[j]; permutation[j] = k; } return permutation; } Clustering::Clustering(int nNodes): nNodes(nNodes), nClusters(1), cluster(nNodes) {}; Clustering::Clustering(IVector cluster) : nNodes(cluster.size()), cluster(cluster.cbegin(), cluster.cend()) { nClusters = *std::max_element(cluster.cbegin(), cluster.cend()) + 1; } IVector Clustering::getNNodesPerCluster() const { IVector nNodesPerCluster(nClusters, 0); for(const int& clust: cluster) { nNodesPerCluster.at(clust)++; } return nNodesPerCluster; } std::vector Clustering::getNodesPerCluster() const { std::vector nodePerCluster(nClusters); IVector nNodesPerCluster = getNNodesPerCluster(); for(int i =0; i < nClusters; i++) { const int cnt = nNodesPerCluster.at(i); nodePerCluster.at(i).reserve(cnt); } for(int i=0; i< nNodes; i++) { nodePerCluster.at(cluster.at(i)).push_back(i); } return nodePerCluster; } void Clustering::setCluster(int node, int cluster) { this->cluster.at(node) = cluster; nClusters = std::max(nClusters, cluster+1); } void Clustering::initSingletonClusters() { for(int i=0; i < nNodes; i++) { cluster.at(i) = i; } nClusters = nNodes; } void Clustering::orderClustersByNNodes() { typedef std::pair ipair; // holds numNodes, cluster std::vector clusterNNodes; clusterNNodes.reserve(nClusters); IVector nNodesPerCluster = getNNodesPerCluster(); for(int i=0; i&a, const std::pair& b) { return b.first < a.first; }); //std::greater()); // now make a map from old to new names IVector newCluster(nClusters, 0); int i=0; do { newCluster[clusterNNodes[i].second] = i; i++; } while (i < nClusters && clusterNNodes[i].first > 0); nClusters = i; for(int i=0; icbegin(), edgeWeight->cend(), this->edgeWeight.begin()); if (nodeWeight != nullptr) { std::copy(nodeWeight->cbegin(), nodeWeight->cend(), this->nodeWeight.begin()); } else { this->nodeWeight = getTotalEdgeWeightPerNode(); } } Network::Network(int nNodes, DVector* nodeWeight, std::vector& edge, DVector* edgeWeight) : nNodes(nNodes), nEdges(0), nodeWeight(), firstNeighborIndex(nNodes + 1, 0), neighbor(), edgeWeight(), totalEdgeWeightSelfLinks(0) { if(edge.size() != 2 || edge[0].size() != edge[1].size()) { throw std::length_error("Edge was supposed to be an array with 2 columns of equal size."); } IVector neighbor(edge.at(0).size(), 0); DVector edgeWeight2(edge.at(0).size(), 0.0); int i = 1; for (size_t j = 0; j < edge[0].size(); j++) if (edge[0][j] != edge[1][j]) { if (edge[0][j] >= i) for (; i <= edge[0][j]; i++) firstNeighborIndex.at(i) = nEdges; neighbor[nEdges] = edge[1][j]; edgeWeight2[nEdges] = (edgeWeight != nullptr) ? (*edgeWeight)[j] : 1.0; nEdges++; } else totalEdgeWeightSelfLinks += (edgeWeight != nullptr) ? (*edgeWeight)[j] : 1; for (; i <= nNodes; i++) firstNeighborIndex.at(i) = nEdges; this->neighbor.resize(nEdges); std::copy(neighbor.begin(), neighbor.begin() + nEdges, this->neighbor.begin()); this->edgeWeight.resize(nEdges); std::copy(edgeWeight2.begin(), edgeWeight2.begin() + nEdges, this->edgeWeight.begin()); if(nodeWeight == nullptr) { this->nodeWeight = getTotalEdgeWeightPerNode(); } else { this->nodeWeight = *nodeWeight; } } double Network::getTotalNodeWeight() { return std::accumulate(nodeWeight.cbegin(), nodeWeight.cend(), 0.0); } DVector Network::getNodeWeights() { return nodeWeight; } IVector Network::getNEdgesPerNode() { IVector nEdgesPerNode(nNodes, 0); for(int i=0; i< nNodes; i++) { nEdgesPerNode.at(i) = firstNeighborIndex.at(i + 1) - firstNeighborIndex.at(i); } return nEdgesPerNode; } std::vector Network::getEdges() { std::vector edge(2); edge[0].resize(nEdges); for(int i=0; i < nNodes; i++) { std::fill(edge[0].begin() + firstNeighborIndex.at(i), edge[0].begin() + firstNeighborIndex.at(i + 1), i); } edge.at(1) = neighbor; return edge; } IVector Network::getEdges(int node) { return IVector(neighbor.begin() + firstNeighborIndex.at(node), neighbor.begin() + firstNeighborIndex.at(node + 1)); } std::vector Network::getEdgesPerNode() { std::vector edgePerNode(nNodes); for (int i = 0; i < nNodes; i++) { edgePerNode[i] = IVector(neighbor.begin() + firstNeighborIndex.at(i), neighbor.begin() + firstNeighborIndex.at(i + 1)); } return edgePerNode; } double Network::getTotalEdgeWeight() { return std::accumulate(edgeWeight.cbegin(), edgeWeight.cend(), 0.0) / 2.0; } double Network::getTotalEdgeWeight(int node) { return std::accumulate(edgeWeight.cbegin() + firstNeighborIndex.at(node), edgeWeight.cbegin() + firstNeighborIndex.at(node + 1), 0.0); } DVector Network::getTotalEdgeWeightPerNode() { DVector totalEdgeWeightPerNode(nNodes, 0.0); for (int i = 0; i < nNodes; i++) { totalEdgeWeightPerNode[i] = getTotalEdgeWeight(i); } return totalEdgeWeightPerNode; } DVector Network::getEdgeWeights(int node) { return DVector(edgeWeight.cbegin() + firstNeighborIndex.at(node), edgeWeight.cbegin() + firstNeighborIndex.at(node+1)); } std::vector Network::getEdgeWeightsPerNode() { std::vector edgeWeightPerNode(nNodes); for (int i = 0; i < nNodes; i++) edgeWeightPerNode[i] = getEdgeWeights(i); return edgeWeightPerNode; } // Skipping unused Network creators // Network createNetworkWithoutNodeWeights() // Network createNetworkWithoutEdgeWeights() // Network createNetworkWithoutNodeAndEdgeWeights() // Network createNormalizedNetwork1() // Network createNormalizedNetwork2() // Network createPrunedNetwork(int nEdges) // Network createPrunedNetwork(int nEdges, Random random) // Network createSubnetwork(int[] node) // Network createSubnetwork(boolean[] nodeInSubnetwork) // Network createSubnetwork(Clustering clustering, int cluster) std::vector Network::createSubnetworks(Clustering clustering) const { std::vector subnetwork(clustering.nClusters); auto nodePerCluster = clustering.getNodesPerCluster(); IVector subnetworkNode(nNodes); IVector subnetworkNeighbor(nEdges); DVector subnetworkEdgeWeight(nEdges); for (int i = 0; i < clustering.nClusters; i++) subnetwork[i] = createSubnetwork(clustering, i, nodePerCluster[i], subnetworkNode, subnetworkNeighbor, subnetworkEdgeWeight); return subnetwork; } // Network createSubnetworkLargestComponent() // Network createReducedNetwork(Clustering clustering) Network Network::createReducedNetwork(const Clustering& clustering) const { Network reducedNetwork; reducedNetwork.nNodes = clustering.nClusters; reducedNetwork.nEdges = 0; reducedNetwork.nodeWeight = DVector(clustering.nClusters); reducedNetwork.firstNeighborIndex = IVector(clustering.nClusters + 1); reducedNetwork.totalEdgeWeightSelfLinks = totalEdgeWeightSelfLinks; IVector reducedNetworkNeighbor1(nEdges); DVector reducedNetworkEdgeWeight1(nEdges); IVector reducedNetworkNeighbor2(clustering.nClusters - 1); DVector reducedNetworkEdgeWeight2(clustering.nClusters); std::vector nodePerCluster = clustering.getNodesPerCluster(); for (int i = 0; i < clustering.nClusters; i++) { int j = 0; for (size_t k = 0; k < nodePerCluster[i].size(); k++) { int l = nodePerCluster[i][k]; reducedNetwork.nodeWeight[i] += nodeWeight[l]; for (int m = firstNeighborIndex[l]; m < firstNeighborIndex[l + 1]; m++) { int n = clustering.cluster[neighbor[m]]; if (n != i) { if (reducedNetworkEdgeWeight2[n] == 0) { reducedNetworkNeighbor2[j] = n; j++; } reducedNetworkEdgeWeight2[n] += edgeWeight[m]; } else reducedNetwork.totalEdgeWeightSelfLinks += edgeWeight[m]; } } for (int k = 0; k < j; k++) { reducedNetworkNeighbor1[reducedNetwork.nEdges + k] = reducedNetworkNeighbor2[k]; reducedNetworkEdgeWeight1[reducedNetwork.nEdges + k] = reducedNetworkEdgeWeight2[reducedNetworkNeighbor2[k]]; reducedNetworkEdgeWeight2[reducedNetworkNeighbor2[k]] = 0; } reducedNetwork.nEdges += j; reducedNetwork.firstNeighborIndex[i + 1] = reducedNetwork.nEdges; } reducedNetwork.neighbor = IVector(reducedNetworkNeighbor1.cbegin(), reducedNetworkNeighbor1.cbegin() + reducedNetwork.nEdges); reducedNetwork.edgeWeight = DVector(reducedNetworkEdgeWeight1.cbegin(), reducedNetworkEdgeWeight1.cbegin() + reducedNetwork.nEdges); return reducedNetwork; } Clustering Network::identifyComponents() { std::vector nodeVisited(nNodes, false); IVector node(nNodes); Clustering clustering(nNodes); clustering.nClusters = 0; for (int i = 0; i < nNodes; i++) if (!nodeVisited[i]) { clustering.cluster[i] = clustering.nClusters; nodeVisited[i] = true; node[0] = i; int j = 1; int k = 0; do { for (int l = firstNeighborIndex[node[k]]; l < firstNeighborIndex[node[k] + 1]; l++) if (!nodeVisited[neighbor[l]]) { clustering.cluster[neighbor[l]] = clustering.nClusters; nodeVisited[neighbor[l]] = true; node[j] = neighbor[l]; j++; } k++; } while (k < j); clustering.nClusters++; } clustering.orderClustersByNNodes(); return clustering; } // private: // double generateRandomNumber(int node1, int node2, const IVector& nodePermutation); Network Network::createSubnetwork(const Clustering& clustering, int cluster, IVector& node, IVector& subnetworkNode, IVector& subnetworkNeighbor, DVector& subnetworkEdgeWeight) const { Network subnetwork; subnetwork.nNodes = node.size(); if (subnetwork.nNodes == 1) { subnetwork.nEdges = 0; subnetwork.nodeWeight = DVector(1, nodeWeight[node[0]]); subnetwork.firstNeighborIndex = IVector(2); subnetwork.neighbor = IVector(0); subnetwork.edgeWeight = DVector(0); } else { for (size_t i = 0; i < node.size(); i++) subnetworkNode[node[i]] = i; subnetwork.nEdges = 0; subnetwork.nodeWeight = DVector(subnetwork.nNodes, 0); subnetwork.firstNeighborIndex = IVector(subnetwork.nNodes + 1); for (int i = 0; i < subnetwork.nNodes; i++) { int j = node[i]; subnetwork.nodeWeight[i] = nodeWeight[j]; for (int k = firstNeighborIndex[j]; k < firstNeighborIndex[j + 1]; k++) if (clustering.cluster[neighbor[k]] == cluster) { subnetworkNeighbor[subnetwork.nEdges] = subnetworkNode[neighbor[k]]; subnetworkEdgeWeight[subnetwork.nEdges] = edgeWeight[k]; subnetwork.nEdges++; } subnetwork.firstNeighborIndex[i + 1] = subnetwork.nEdges; } subnetwork.neighbor = IVector(subnetworkNeighbor.cbegin(), subnetworkNeighbor.cbegin() + subnetwork.nEdges); subnetwork.edgeWeight = DVector(subnetworkEdgeWeight.cbegin(), subnetworkEdgeWeight.cbegin() + subnetwork.nEdges); } subnetwork.totalEdgeWeightSelfLinks = 0; return subnetwork; } VOSClusteringTechnique::VOSClusteringTechnique(std::shared_ptr network, double resolution) : network(network), resolution(resolution) { clustering = std::make_shared(network->getNNodes()); clustering->initSingletonClusters(); }; VOSClusteringTechnique::VOSClusteringTechnique(std::shared_ptr network, std::shared_ptr clustering, double resolution) : network(network), clustering(clustering), resolution(resolution){}; double VOSClusteringTechnique::calcQualityFunction() { double qualityFunction = 0.0; for (int i = 0; i < network->getNNodes(); i++) { int j = clustering->cluster[i]; for (int k = network->getFirstNeighborIndexValue(i); k < network->getFirstNeighborIndexValue(i + 1); k++) if (clustering->cluster[network->getNeighborValue(k)] == j) qualityFunction += network->edgeWeight[k]; } qualityFunction += network->totalEdgeWeightSelfLinks; DVector clusterWeight(clustering->nClusters); for (int i = 0; i < network->nNodes; i++) clusterWeight[clustering->cluster[i]] += network->nodeWeight[i]; for (int i = 0; i < clustering->nClusters; i++) qualityFunction -= clusterWeight[i] * clusterWeight[i] * resolution; qualityFunction /= 2 * network->getTotalEdgeWeight() + network->totalEdgeWeightSelfLinks; return qualityFunction; } bool VOSClusteringTechnique::runLocalMovingAlgorithm(JavaRandom& random){ bool update = false; double maxQualityFunction, qualityFunction; DVector clusterWeight(network->getNNodes(), 0); IVector nNodesPerCluster(network->getNNodes(), 0); int bestCluster, j, k, l, nNeighboringClusters, nStableNodes; if (network->getNNodes() == 1) return false; for (int i = 0; i < network->getNNodes(); i++) { clusterWeight[clustering->cluster[i]] += network->nodeWeight[i]; nNodesPerCluster[clustering->cluster[i]]++; } int nUnusedClusters = 0; IVector unusedCluster(network->getNNodes(), 0); for (int i = 0; i < network->getNNodes(); i++) { if (nNodesPerCluster[i] == 0) { unusedCluster[nUnusedClusters] = i; nUnusedClusters++; } } IVector nodePermutation = Arrays2::generateRandomPermutation(network->nNodes, random); DVector edgeWeightPerCluster(network->getNNodes(), 0.0); IVector neighboringCluster(network->getNNodes() - 1, 0); nStableNodes = 0; int i = 0; do { j = nodePermutation[i]; nNeighboringClusters = 0; for (k = network->firstNeighborIndex.at(j); k < network->firstNeighborIndex.at(j + 1); k++) { l = clustering->cluster[network->neighbor[k]]; if (edgeWeightPerCluster[l] == 0) { neighboringCluster[nNeighboringClusters] = l; nNeighboringClusters++; } edgeWeightPerCluster[l] += network->edgeWeight[k]; } clusterWeight[clustering->cluster[j]] -= network->nodeWeight[j]; nNodesPerCluster[clustering->cluster[j]]--; if (nNodesPerCluster[clustering->cluster[j]] == 0) { unusedCluster[nUnusedClusters] = clustering->cluster[j]; nUnusedClusters++; } bestCluster = -1; maxQualityFunction = 0; for (k = 0; k < nNeighboringClusters; k++) { l = neighboringCluster[k]; qualityFunction = edgeWeightPerCluster[l] - network->nodeWeight[j] * clusterWeight[l] * resolution; if ((qualityFunction > maxQualityFunction) || ((qualityFunction == maxQualityFunction) && (l < bestCluster))) { bestCluster = l; maxQualityFunction = qualityFunction; } edgeWeightPerCluster[l] = 0; } if (maxQualityFunction == 0) { bestCluster = unusedCluster[nUnusedClusters - 1]; nUnusedClusters--; } clusterWeight[bestCluster] += network->nodeWeight[j]; nNodesPerCluster[bestCluster]++; if (bestCluster == clustering->cluster[j]) nStableNodes++; else { clustering->cluster[j] = bestCluster; nStableNodes = 1; update = true; } i = (i < network->nNodes - 1) ? (i + 1) : 0; } while (nStableNodes < network->nNodes); IVector newCluster(network->getNNodes()); clustering->nClusters = 0; for (i = 0; i < network->nNodes; i++) if (nNodesPerCluster[i] > 0) { newCluster[i] = clustering->nClusters; clustering->nClusters++; } for (i = 0; i < network->nNodes; i++) clustering->cluster[i] = newCluster[clustering->cluster[i]]; return update; } bool VOSClusteringTechnique::runLouvainAlgorithm(JavaRandom& random) { if (network->nNodes == 1) return false; bool update = runLocalMovingAlgorithm(random); if (clustering->nClusters < network->nNodes) { VOSClusteringTechnique vosClusteringTechnique(std::make_shared(network->createReducedNetwork(*clustering)), resolution); bool update2 = vosClusteringTechnique.runLouvainAlgorithm(random); if (update2) { update = true; clustering->mergeClusters(*vosClusteringTechnique.clustering); } } return update; } bool VOSClusteringTechnique::runIteratedLouvainAlgorithm(int maxNIterations, JavaRandom& random) { bool update; int i = 0; do { update = runLouvainAlgorithm(random); i++; } while ((i < maxNIterations) && update); return ((i > 1) || update); } bool VOSClusteringTechnique::runLouvainAlgorithmWithMultilevelRefinement(JavaRandom& random) { if (network->nNodes == 1) return false; bool update = runLocalMovingAlgorithm(random); if (clustering->nClusters < network->nNodes) { VOSClusteringTechnique vosClusteringTechnique(std::make_shared(network->createReducedNetwork(*clustering)), resolution); bool update2 = vosClusteringTechnique.runLouvainAlgorithmWithMultilevelRefinement(random); if (update2) { update = true; clustering->mergeClusters(*vosClusteringTechnique.clustering); runLocalMovingAlgorithm(random); } } return update;} bool VOSClusteringTechnique::runIteratedLouvainAlgorithmWithMultilevelRefinement(int maxNIterations, JavaRandom& random) { bool update; int i = 0; do { update = runLouvainAlgorithmWithMultilevelRefinement(random); i++; } while ((i < maxNIterations) && update); return ((i > 1) || update); } bool VOSClusteringTechnique::runSmartLocalMovingAlgorithm(JavaRandom& random) { if (network->nNodes == 1) return false; bool update = runLocalMovingAlgorithm(random); if (clustering->nClusters < network->nNodes) { std::vector subnetwork = network->createSubnetworks(*clustering); auto nodePerCluster = clustering->getNodesPerCluster(); clustering->nClusters = 0; IVector nNodesPerClusterReducedNetwork(subnetwork.size()); for (size_t i = 0; i < subnetwork.size(); i++) { VOSClusteringTechnique vosClusteringTechnique(std::make_shared(subnetwork[i]), resolution); vosClusteringTechnique.runLocalMovingAlgorithm(random); for (int j = 0; j < subnetwork[i].nNodes; j++) clustering->cluster[nodePerCluster[i][j]] = clustering->nClusters + vosClusteringTechnique.clustering->cluster[j]; clustering->nClusters += vosClusteringTechnique.clustering->nClusters; nNodesPerClusterReducedNetwork[i] = vosClusteringTechnique.clustering->nClusters; } VOSClusteringTechnique vosClusteringTechnique2(std::make_shared(network->createReducedNetwork(*clustering)), resolution); int i = 0; for (size_t j = 0; j < nNodesPerClusterReducedNetwork.size(); j++) { for (int k = 0; k < nNodesPerClusterReducedNetwork[j]; k++) { vosClusteringTechnique2.clustering->cluster[i] = static_cast(j); i++; } } vosClusteringTechnique2.clustering->nClusters = nNodesPerClusterReducedNetwork.size(); update |= vosClusteringTechnique2.runSmartLocalMovingAlgorithm(random); clustering->mergeClusters(*vosClusteringTechnique2.clustering); } return update; } bool VOSClusteringTechnique::runIteratedSmartLocalMovingAlgorithm(int nIterations, JavaRandom& random) { bool update = false; for (int i = 0; i < nIterations; i++) update |= runSmartLocalMovingAlgorithm(random); return update; } int VOSClusteringTechnique::removeCluster(int cluster) { DVector clusterWeight(clustering->nClusters); DVector totalEdgeWeightPerCluster(clustering->nClusters); for (int i = 0; i < network->nNodes; i++) { clusterWeight[clustering->cluster[i]] += network->nodeWeight[i]; if (clustering->cluster[i] == cluster) for (int j = network->firstNeighborIndex[i]; j < network->firstNeighborIndex[i + 1]; j++) totalEdgeWeightPerCluster[clustering->cluster[network->neighbor[j]]] += network->edgeWeight[j]; } int i = -1; double maxQualityFunction = 0; for (int j = 0; j < clustering->nClusters; j++) if ((j != cluster) && (clusterWeight[j] > 0)) { double qualityFunction = totalEdgeWeightPerCluster[j] / clusterWeight[j]; if (qualityFunction > maxQualityFunction) { i = j; maxQualityFunction = qualityFunction; } } if (i >= 0) { for (int j = 0; j < network->nNodes; j++) if (clustering->cluster[j] == cluster) clustering->cluster[j] = i; if (cluster == clustering->nClusters - 1) clustering->nClusters = *std::max_element(clustering->cluster.cbegin(), clustering->cluster.cend()) + 1; } return i; } void VOSClusteringTechnique::removeSmallClusters(int minNNodesPerCluster) { VOSClusteringTechnique vosClusteringTechnique(std::make_shared(network->createReducedNetwork(*clustering)), resolution); auto nNodesPerCluster = clustering->getNNodesPerCluster(); int i; do { i = -1; int j = minNNodesPerCluster; for (int k = 0; k < vosClusteringTechnique.clustering->nClusters; k++) if ((nNodesPerCluster[k] > 0) && (nNodesPerCluster[k] < j)) { i = k; j = nNodesPerCluster[k]; } if (i >= 0) { j = vosClusteringTechnique.removeCluster(i); if (j >= 0) nNodesPerCluster[j] += nNodesPerCluster[i]; nNodesPerCluster[i] = 0; } } while (i >= 0); clustering->mergeClusters(*vosClusteringTechnique.clustering); } std::shared_ptr ModularityOptimizer::matrixToNetwork(IVector& node1, IVector& node2, DVector& edgeWeight1, int modularityFunction, int nNodes) { int n1_max = *std::max_element(node1.cbegin(), node1.cend()); int n2_max = *std::max_element(node2.cbegin(), node2.cend()); IVector nNeighbors(nNodes); for (size_t i = 0; i < node1.size(); i++) if (node1[i] < node2[i]) { nNeighbors[node1[i]]++; nNeighbors[node2[i]]++; } IVector firstNeighborIndex(nNodes + 1); int nEdges = 0; for (int i = 0; i < nNodes; i++) { firstNeighborIndex[i] = nEdges; nEdges += nNeighbors[i]; } firstNeighborIndex[nNodes] = nEdges; IVector neighbor(nEdges); DVector edgeWeight2(nEdges); std::fill(nNeighbors.begin(), nNeighbors.end(), 0); for (size_t i = 0; i < node1.size(); i++) if (node1[i] < node2[i]) { int j = firstNeighborIndex[node1[i]] + nNeighbors[node1[i]]; neighbor[j] = node2[i]; edgeWeight2[j] = edgeWeight1[i]; nNeighbors[node1[i]]++; j = firstNeighborIndex[node2[i]] + nNeighbors[node2[i]]; neighbor[j] = node1[i]; edgeWeight2[j] = edgeWeight1[i]; nNeighbors[node2[i]]++; } if (modularityFunction == 1) return std::make_shared(nNodes, firstNeighborIndex, neighbor, &edgeWeight2); else { DVector nodeWeight(nNodes, 1.0); return std::make_shared(nNodes, &nodeWeight, firstNeighborIndex, neighbor, &edgeWeight2); } } std::shared_ptr ModularityOptimizer::readInputFile(std::string fname, int modularityFunction) { std::ifstream f; f.open(fname, std::ios::in); if(!f) { throw std::runtime_error("File could not be opened."); } std::string line; int nLines = 0; while(std::getline(f, line)) { nLines++; } f.clear(); f.seekg(0, std::ios::beg); IVector node1(nLines); IVector node2(nLines); DVector edgeWeight1(nLines, 1.0); for (int j = 0; j < nLines; j++) { std::getline(f, line); auto splittedLine = split(line, '\t'); node1[j] =std::stoi(splittedLine[0]); node2[j] = std::stoi(splittedLine[1]); if(splittedLine.size() > 2) { edgeWeight1[j] = std::stod(splittedLine[2]); } } int n1_max = *std::max_element(node1.cbegin(), node1.cend()); int n2_max = *std::max_element(node2.cbegin(), node2.cend()); int nNodes = std::max(n1_max, n2_max) + 1; return matrixToNetwork(node1, node2, edgeWeight1, modularityFunction, nNodes); } std::vector ModularityOptimizer::split(const std::string& s, char delimiter) { std::vector tokens; std::string token; std::istringstream tokenStream(s); while (std::getline(tokenStream, token, delimiter)) { tokens.push_back(token); } return tokens; } #ifdef STANDALONE void writeOutputFile(std::string fname, Clustering& clustering) { int nNodes = clustering.getNNodes(); clustering.orderClustersByNNodes(); std::ofstream f(fname, std::ios::out); for(int i=0; i < nNodes; i++) f << clustering.getCluster(i) << std::endl; f.close(); } template void input(std::string msg, T& value) { std::cout << msg << std::endl << std::endl; std::cin >> value; } int main(int argc, char* argv[]) { std::string msg = "Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck"; std::vector args; std::string inputFileName, outputFileName; bool printOutput, update; double modularity, maxModularity, resolution, resolution2; int algorithm, i, j, modularityFunction, nIterations, nRandomStarts; unsigned long long int randomSeed; for(int i=0; i 0); if (printOutput) { std::cout << msg << std::endl << std::endl; } } else { std::cout << msg << std::endl << std::endl; input("Input file name: ", inputFileName); input("Output file name: ", outputFileName); input("Modularity function (1 = standard; 2 = alternative): ", modularityFunction); input("Resolution parameter (e.g., 1.0): ", resolution); input("Algorithm (1 = Louvain; 2 = Louvain with multilevel refinement; 3 = smart local moving): ", algorithm); input("Number of random starts (e.g., 10): ", nRandomStarts); input("Number of iterations (e.g., 10): ",nIterations); input("Random seed (e.g., 0): ", randomSeed); int tmp; input("Print output (0 = no; 1 = yes): ",tmp); printOutput = tmp > 0; std::cout << std::endl; } if (printOutput) { std::cout << "Reading input file..." << std::endl << std::endl; } std::shared_ptr network = readInputFile(inputFileName, modularityFunction); if (printOutput) { std::printf("Number of nodes: %d\n", network->getNNodes()); std::printf("Number of edges: %d\n", network->getNEdges()); std::cout << std::endl; std::cout << "Running " << ((algorithm == 1) ? "Louvain algorithm" : ((algorithm == 2) ? "Louvain algorithm with multilevel refinement" : "smart local moving algorithm")) << "..."; std::cout << std::endl; } resolution2 = ((modularityFunction == 1) ? (resolution / (2 * network->getTotalEdgeWeight() + network->getTotalEdgeWeightSelfLinks())) : resolution); auto beginTime = duration_cast(system_clock::now().time_since_epoch()); std::shared_ptr clustering; maxModularity = -std::numeric_limits::infinity(); JavaRandom random(randomSeed); for (i = 0; i < nRandomStarts; i++) { if (printOutput && (nRandomStarts > 1)) std::printf("Random start: %d\n", i + 1); VOSClusteringTechnique vosClusteringTechnique(network, resolution2); j = 0; update = true; do { if (printOutput && (nIterations > 1)) std::printf("Iteration: %d\n", j + 1); if (algorithm == 1) update = vosClusteringTechnique.runLouvainAlgorithm(random); else if (algorithm == 2) update = vosClusteringTechnique.runLouvainAlgorithmWithMultilevelRefinement(random); else if (algorithm == 3) vosClusteringTechnique.runSmartLocalMovingAlgorithm(random); j++; modularity = vosClusteringTechnique.calcQualityFunction(); if (printOutput && (nIterations > 1)) std::printf("Modularity: %.4f\n", modularity); } while ((j < nIterations) && update); if (modularity > maxModularity) { clustering = vosClusteringTechnique.getClustering(); maxModularity = modularity; } if (printOutput && (nRandomStarts > 1)) { if (nIterations == 1) std::printf("Modularity: %.4f\n", modularity); std::cout << std::endl; } } auto endTime = duration_cast(system_clock::now().time_since_epoch()); if (printOutput) { if (nRandomStarts == 1) { if (nIterations > 1) std::cout << std::endl; std::printf("Modularity: %.4f\n", maxModularity); } else std::printf("Maximum modularity in %d random starts: %.4f\n", nRandomStarts, maxModularity); std::printf("Number of communities: %d\n", clustering->getNClusters()); std::printf("Elapsed time: %d seconds\n", static_cast((endTime - beginTime).count() / 1000.0)); std::cout << std::endl << "Writing output file..." << std::endl; } writeOutputFile(outputFileName, *clustering); } catch (std::exception a) { std::cout << a.what() << std::endl; } return 0; }; #endif Seurat/src/valid_pointer.c0000644000176200001440000000024714670622051015315 0ustar liggesusers#include // helper to determine if external c++ pointer is valid SEXP isnull(SEXP pointer) { return Rf_ScalarLogical(!R_ExternalPtrAddr(pointer)); } Seurat/src/Makevars0000644000176200001440000000002014730427000013765 0ustar liggesusersCXX_STD = CXX17 Seurat/src/snn.cpp0000644000176200001440000001032614670622051013613 0ustar liggesusers#include #include "data_manipulation.h" #include #include #include #include #include #include using namespace Rcpp; // [[Rcpp::depends(RcppEigen)]] // [[Rcpp::depends(RcppProgress)]] typedef Eigen::Triplet T; // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix ComputeSNN(Eigen::MatrixXd nn_ranked, double prune) { std::vector tripletList; int k = nn_ranked.cols(); tripletList.reserve(nn_ranked.rows() * nn_ranked.cols()); for(int j=0; j SNN(nn_ranked.rows(), nn_ranked.rows()); SNN.setFromTriplets(tripletList.begin(), tripletList.end()); SNN = SNN * (SNN.transpose()); for (int i=0; i < SNN.outerSize(); ++i){ for (Eigen::SparseMatrix::InnerIterator it(SNN, i); it; ++it){ it.valueRef() = it.value()/(k + (k - it.value())); if(it.value() < prune){ it.valueRef() = 0; } } } SNN.prune(0.0); // actually remove pruned values return SNN; } // [[Rcpp::export(rng = false)]] void WriteEdgeFile(Eigen::SparseMatrix snn, String filename, bool display_progress){ if (display_progress == true) { Rcpp::Rcerr << "Writing SNN as edge file" << std::endl; } // Write out lower triangle std::ofstream output; output.open(filename); Progress p(snn.outerSize(), display_progress); for (int k=0; k < snn.outerSize(); ++k){ p.increment(); for (Eigen::SparseMatrix::InnerIterator it(snn, k); it; ++it){ if(it.col() >= it.row()){ continue; } output << std::setprecision(15) << it.col() << "\t" << it.row() << "\t" << it.value() << "\n"; } } output.close(); } // Wrapper function so that we don't have to go back into R before writing to file // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix DirectSNNToFile(Eigen::MatrixXd nn_ranked, double prune, bool display_progress, String filename) { Eigen::SparseMatrix SNN = ComputeSNN(nn_ranked, prune); WriteEdgeFile(SNN, filename, display_progress); return SNN; } template std::vector sort_indexes(const std::vector &v) { // initialize original index locations std::vector idx(v.size()); std::iota(idx.begin(), idx.end(), 0); std::stable_sort(idx.begin(), idx.end(), [&v](size_t i1, size_t i2) {return v[i1] < v[i2];}); return idx; } // [[Rcpp::export]] std::vector SNN_SmallestNonzero_Dist( Eigen::SparseMatrix snn, Eigen::MatrixXd mat, int n, std::vector nearest_dist ) { std::vector results; for (int i=0; i < snn.outerSize(); ++i){ // create vectors to store the nonzero snn elements and their indices std::vector nonzero; std::vector nonzero_idx; for (Eigen::SparseMatrix::InnerIterator it(snn, i); it; ++it) { nonzero.push_back(it.value()); nonzero_idx.push_back(it.row()); } std::vector nonzero_order = sort_indexes(nonzero); int n_i = n; if (n_i > nonzero_order.size()) n_i = nonzero_order.size(); std::vector dists; for (int j = 0; j < nonzero_order.size(); ++j) { // compute euclidean distances to cells with small edge weights // if multiple entries have same value as nth element, calc dist to all size_t cell = nonzero_idx[nonzero_order[j]]; if(dists.size() < n_i || nonzero[nonzero_order[j]] == nonzero[nonzero_order[n_i-1]]) { double res = (mat.row(cell) - mat.row(i)).norm(); if (nearest_dist[i] > 0) { res = res - nearest_dist[i]; if (res < 0) res = 0; } dists.push_back(res); } else { break; } } double avg_dist; if (dists.size() > n_i) { std::sort(dists.rbegin(), dists.rend()); avg_dist = std::accumulate(dists.begin(), dists.begin() + n_i, 0.0) / n_i; } else { avg_dist = std::accumulate(dists.begin(), dists.end(), 0.0) / dists.size(); } results.push_back(avg_dist); } return results; } Seurat/src/data_manipulation.cpp0000644000176200001440000003600314670622051016506 0ustar liggesusers#include #include #include #include #include #include #include using namespace Rcpp; // [[Rcpp::depends(RcppEigen)]] // [[Rcpp::depends(RcppProgress)]] // [[Rcpp::export]] Eigen::SparseMatrix RunUMISampling(Eigen::SparseMatrix data, int sample_val, bool upsample = false, bool display_progress=true){ Progress p(data.outerSize(), display_progress); Eigen::VectorXd colSums = data.transpose() * Eigen::VectorXd::Ones(data.rows()); for (int k=0; k < data.outerSize(); ++k){ p.increment(); for (Eigen::SparseMatrix::InnerIterator it(data, k); it; ++it){ double entry = it.value(); if( (upsample) || (colSums[k] > sample_val)){ entry = entry * double(sample_val) / colSums[k]; if (fmod(entry, 1) != 0){ double rn = R::runif(0,1); if(fmod(entry, 1) <= rn){ it.valueRef() = floor(entry); } else{ it.valueRef() = ceil(entry); } } else{ it.valueRef() = entry; } } } } return(data); } // [[Rcpp::export]] Eigen::SparseMatrix RunUMISamplingPerCell(Eigen::SparseMatrix data, NumericVector sample_val, bool upsample = false, bool display_progress=true){ Progress p(data.outerSize(), display_progress); Eigen::VectorXd colSums = data.transpose() * Eigen::VectorXd::Ones(data.rows()); for (int k=0; k < data.outerSize(); ++k){ p.increment(); for (Eigen::SparseMatrix::InnerIterator it(data, k); it; ++it){ double entry = it.value(); if( (upsample) || (colSums[k] > sample_val[k])){ entry = entry * double(sample_val[k]) / colSums[k]; if (fmod(entry, 1) != 0){ double rn = R::runif(0,1); if(fmod(entry, 1) <= rn){ it.valueRef() = floor(entry); } else{ it.valueRef() = ceil(entry); } } else{ it.valueRef() = entry; } } } } return(data); } typedef Eigen::Triplet T; // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix RowMergeMatrices(Eigen::SparseMatrix mat1, Eigen::SparseMatrix mat2, std::vector< std::string > mat1_rownames, std::vector< std::string > mat2_rownames, std::vector< std::string > all_rownames){ // Set up hash maps for rowname based lookup std::unordered_map mat1_map; for(unsigned int i = 0; i < mat1_rownames.size(); i++){ mat1_map[mat1_rownames[i]] = i; } std::unordered_map mat2_map; for(unsigned int i = 0; i < mat2_rownames.size(); i++){ mat2_map[mat2_rownames[i]] = i; } // set up tripletList for new matrix creation std::vector tripletList; int num_rows = all_rownames.size(); int num_col1 = mat1.cols(); int num_col2 = mat2.cols(); tripletList.reserve(mat1.nonZeros() + mat2.nonZeros()); for(int i = 0; i < num_rows; i++){ std::string key = all_rownames[i]; if (mat1_map.count(key)){ for(Eigen::SparseMatrix::InnerIterator it1(mat1, mat1_map[key]); it1; ++it1){ tripletList.emplace_back(i, it1.col(), it1.value()); } } if (mat2_map.count(key)){ for(Eigen::SparseMatrix::InnerIterator it2(mat2, mat2_map[key]); it2; ++it2){ tripletList.emplace_back(i, num_col1 + it2.col(), it2.value()); } } } Eigen::SparseMatrix combined_mat(num_rows, num_col1 + num_col2); combined_mat.setFromTriplets(tripletList.begin(), tripletList.end()); return combined_mat; } // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix LogNorm(Eigen::SparseMatrix data, int scale_factor, bool display_progress = true){ Progress p(data.outerSize(), display_progress); Eigen::VectorXd colSums = data.transpose() * Eigen::VectorXd::Ones(data.rows()); for (int k=0; k < data.outerSize(); ++k){ p.increment(); for (Eigen::SparseMatrix::InnerIterator it(data, k); it; ++it){ it.valueRef() = log1p(double(it.value()) / colSums[k] * scale_factor); } } return data; } /* Performs column scaling and/or centering. Equivalent to using scale(mat, TRUE, apply(x,2,sd)) in R. Note: Doesn't handle NA/NaNs in the same way the R implementation does, */ // [[Rcpp::export(rng = false)]] NumericMatrix Standardize(Eigen::Map mat, bool display_progress = true){ Progress p(mat.cols(), display_progress); NumericMatrix std_mat(mat.rows(), mat.cols()); for(int i=0; i < mat.cols(); ++i){ p.increment(); Eigen::ArrayXd r = mat.col(i).array(); double colMean = r.mean(); double colSdev = sqrt((r - colMean).square().sum() / (mat.rows() - 1)); NumericMatrix::Column new_col = std_mat(_, i); for(int j=0; j < new_col.size(); j++) { new_col[j] = (r[j] - colMean) / colSdev; } } return std_mat; } // [[Rcpp::export(rng = false)]] Eigen::MatrixXd FastSparseRowScale(Eigen::SparseMatrix mat, bool scale = true, bool center = true, double scale_max = 10, bool display_progress = true){ mat = mat.transpose(); Progress p(mat.outerSize(), display_progress); Eigen::MatrixXd scaled_mat(mat.rows(), mat.cols()); for (int k=0; k::InnerIterator it(mat,k); it; ++it) { colMean += it.value(); } colMean = colMean / mat.rows(); if (scale == true){ int nnZero = 0; if(center == true){ for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it) { nnZero += 1; colSdev += pow((it.value() - colMean), 2); } colSdev += pow(colMean, 2) * (mat.rows() - nnZero); } else{ for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it) { colSdev += pow(it.value(), 2); } } colSdev = sqrt(colSdev / (mat.rows() - 1)); } else{ colSdev = 1; } if(center == false){ colMean = 0; } Eigen::VectorXd col = Eigen::VectorXd(mat.col(k)); scaled_mat.col(k) = (col.array() - colMean) / colSdev; for(int s=0; s scale_max){ scaled_mat(s,k) = scale_max; } } } return scaled_mat.transpose(); } // [[Rcpp::export(rng = false)]] Eigen::MatrixXd FastSparseRowScaleWithKnownStats(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sigma, bool scale = true, bool center = true, double scale_max = 10, bool display_progress = true){ mat = mat.transpose(); Progress p(mat.outerSize(), display_progress); Eigen::MatrixXd scaled_mat(mat.rows(), mat.cols()); for (int k=0; k scale_max){ scaled_mat(s,k) = scale_max; } } } return scaled_mat.transpose(); } /* Note: May not handle NA/NaNs in the same way the R implementation does, */ // [[Rcpp::export(rng = false)]] Eigen::MatrixXd FastCov(Eigen::MatrixXd mat, bool center = true){ if (center) { mat = mat.rowwise() - mat.colwise().mean(); } Eigen::MatrixXd cov = (mat.adjoint() * mat) / double(mat.rows() - 1); return(cov); } // [[Rcpp::export(rng = false)]] Eigen::MatrixXd FastCovMats(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2, bool center = true){ if(center){ mat1 = mat1.rowwise() - mat1.colwise().mean(); mat2 = mat2.rowwise() - mat2.colwise().mean(); } Eigen::MatrixXd cov = (mat1.adjoint() * mat2) / double(mat1.rows() - 1); return(cov); } /* Note: Faster than the R implementation but is not in-place */ // [[Rcpp::export(rng = false)]] Eigen::MatrixXd FastRBind(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2){ Eigen::MatrixXd mat3(mat1.rows() + mat2.rows(), mat1.cols()); mat3 << mat1, mat2; return(mat3); } /* Calculates the row means of the logged values in non-log space */ // [[Rcpp::export(rng = false)]] Eigen::VectorXd FastExpMean(Eigen::SparseMatrix mat, bool display_progress){ int ncols = mat.cols(); Eigen::VectorXd rowmeans(mat.rows()); mat = mat.transpose(); if(display_progress == true){ Rcpp::Rcerr << "Calculating gene means" << std::endl; } Progress p(mat.outerSize(), display_progress); for (int k=0; k::InnerIterator it(mat,k); it; ++it){ rm += expm1(it.value()); } rm = rm / ncols; rowmeans[k] = log1p(rm); } return(rowmeans); } /* use this if you know the row means */ // [[Rcpp::export(rng = false)]] NumericVector SparseRowVar2(Eigen::SparseMatrix mat, NumericVector mu, bool display_progress){ mat = mat.transpose(); if(display_progress == true){ Rcpp::Rcerr << "Calculating gene variances" << std::endl; } Progress p(mat.outerSize(), display_progress); NumericVector allVars = no_init(mat.cols()); for (int k=0; k::InnerIterator it(mat,k); it; ++it) { nZero -= 1; colSum += pow(it.value() - mu[k], 2); } colSum += pow(mu[k], 2) * nZero; allVars[k] = colSum / (mat.rows() - 1); } return(allVars); } /* standardize matrix rows using given mean and standard deviation, clip values larger than vmax to vmax, then return variance for each row */ // [[Rcpp::export(rng = false)]] NumericVector SparseRowVarStd(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sd, double vmax, bool display_progress){ if(display_progress == true){ Rcpp::Rcerr << "Calculating feature variances of standardized and clipped values" << std::endl; } mat = mat.transpose(); NumericVector allVars(mat.cols()); Progress p(mat.outerSize(), display_progress); for (int k=0; k::InnerIterator it(mat,k); it; ++it) { nZero -= 1; colSum += pow(std::min(vmax, (it.value() - mu[k]) / sd[k]), 2); } colSum += pow((0 - mu[k]) / sd[k], 2) * nZero; allVars[k] = colSum / (mat.rows() - 1); } return(allVars); } /* Calculate the variance to mean ratio (VMR) in non-logspace (return answer in log-space) */ // [[Rcpp::export(rng = false)]] Eigen::VectorXd FastLogVMR(Eigen::SparseMatrix mat, bool display_progress){ int ncols = mat.cols(); Eigen::VectorXd rowdisp(mat.rows()); mat = mat.transpose(); if(display_progress == true){ Rcpp::Rcerr << "Calculating gene variance to mean ratios" << std::endl; } Progress p(mat.outerSize(), display_progress); for (int k=0; k::InnerIterator it(mat,k); it; ++it){ rm += expm1(it.value()); } rm = rm / ncols; for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it){ v += pow(expm1(it.value()) - rm, 2); nnZero += 1; } v = (v + (ncols - nnZero) * pow(rm, 2)) / (ncols - 1); rowdisp[k] = log(v/rm); } return(rowdisp); } /* Calculates the variance of rows of a matrix */ // [[Rcpp::export(rng = false)]] NumericVector RowVar(Eigen::Map x){ NumericVector out(x.rows()); for(int i=0; i < x.rows(); ++i){ Eigen::ArrayXd r = x.row(i).array(); double rowMean = r.mean(); out[i] = (r - rowMean).square().sum() / (x.cols() - 1); } return out; } /* Calculate the variance in non-logspace (return answer in non-logspace) */ // [[Rcpp::export(rng = false)]] Eigen::VectorXd SparseRowVar(Eigen::SparseMatrix mat, bool display_progress){ int ncols = mat.cols(); Eigen::VectorXd rowdisp(mat.rows()); mat = mat.transpose(); if(display_progress == true){ Rcpp::Rcerr << "Calculating gene variances" << std::endl; } Progress p(mat.outerSize(), display_progress); for (int k=0; k::InnerIterator it(mat,k); it; ++it){ rm += (it.value()); } rm = rm / ncols; for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it){ v += pow((it.value()) - rm, 2); nnZero += 1; } v = (v + (ncols - nnZero) * pow(rm, 2)) / (ncols - 1); rowdisp[k] = v; } return(rowdisp); } //cols_idx should be 0-indexed // [[Rcpp::export(rng = false)]] Eigen::SparseMatrix ReplaceColsC(Eigen::SparseMatrix mat, NumericVector col_idx, Eigen::SparseMatrix replacement){ int rep_idx = 0; for(auto const &ci : col_idx){ mat.col(ci) = replacement.col(rep_idx); rep_idx += 1; } return(mat); } template std::vector sort_indexes(const std::vector &v) { // initialize original index locations std::vector idx(v.size()); std::iota(idx.begin(), idx.end(), 0); std::stable_sort(idx.begin(), idx.end(), [&v](size_t i1, size_t i2) {return v[i1] < v[i2];}); return idx; } // [[Rcpp::export(rng = false)]] List GraphToNeighborHelper(Eigen::SparseMatrix mat) { mat = mat.transpose(); //determine the number of neighbors int n = 0; for(Eigen::SparseMatrix::InnerIterator it(mat, 0); it; ++it) { n += 1; } Eigen::MatrixXd nn_idx(mat.rows(), n); Eigen::MatrixXd nn_dist(mat.rows(), n); for (int k=0; k row_idx; std::vector row_dist; row_idx.reserve(n); row_dist.reserve(n); for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it) { if (n_k > (n-1)) { Rcpp::stop("Not all cells have an equal number of neighbors."); } row_idx.push_back(it.row() + 1); row_dist.push_back(it.value()); n_k += 1; } if (n_k != n) { Rcpp::Rcout << n << ":::" << n_k << std::endl; Rcpp::stop("Not all cells have an equal number of neighbors."); } //order the idx based on dist std::vector idx_order = sort_indexes(row_dist); for(int i = 0; i < n; ++i) { nn_idx(k, i) = row_idx[idx_order[i]]; nn_dist(k, i) = row_dist[idx_order[i]]; } } List neighbors = List::create(nn_idx, nn_dist); return(neighbors); } Seurat/src/snn.h0000644000176200001440000000117214670622051013257 0ustar liggesusers#ifndef SNN #define SNN #include #include "data_manipulation.h" #include #include #include #include #include #include using namespace Rcpp; //---------------------------------------------------- Eigen::SparseMatrix ComputeSNN(Eigen::MatrixXd nn_ranked); void WriteEdgeFile(Eigen::SparseMatrix snn, String filename, bool display_progress); Eigen::SparseMatrix DirectSNNToFile(Eigen::MatrixXd nn_ranked, double prune, bool display_progress, String filename); //---------------------------------------------------- #endif//SNN Seurat/src/stats.cpp0000644000176200001440000000227714670622051014161 0ustar liggesusers#include using namespace Rcpp; // the following code in-parts taken from sparseMatrixStats (http://www.bioconductor.org/packages/release/bioc/html/sparseMatrixStats.html). // [[Rcpp::export]] NumericVector row_sum_dgcmatrix(NumericVector &x, IntegerVector &i, int rows, int cols) { NumericVector rowsum(rows, 0.0); int x_length = x.length(); for (int k=0; k #include #include #include #include #include #include #include #include #include #include "ModularityOptimizer.h" using namespace ModularityOptimizer; using namespace std::chrono; using namespace Rcpp; // [[Rcpp::depends(RcppEigen)]] // [[Rcpp::depends(RcppProgress)]] // [[Rcpp::export]] IntegerVector RunModularityClusteringCpp(Eigen::SparseMatrix SNN, int modularityFunction, double resolution, int algorithm, int nRandomStarts, int nIterations, int randomSeed, bool printOutput, std::string edgefilename) { // validate arguments if(modularityFunction != 1 && modularityFunction != 2) stop("Modularity parameter must be equal to 1 or 2."); if(algorithm != 1 && algorithm !=2 && algorithm !=3 && algorithm !=4) stop("Algorithm for modularity optimization must be 1, 2, 3, or 4"); if(nRandomStarts < 1) stop("Have to have at least one start"); if(nIterations < 1) stop("Need at least one interation"); if (modularityFunction == 2 && resolution > 1.0) stop("error: resolution<1 for alternative modularity"); try { bool update; double modularity, maxModularity, resolution2; int i, j; std::string msg = "Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck"; if (printOutput) Rcout << msg << std::endl << std::endl; // Load netwrok std::shared_ptr network; if(edgefilename != "") { if (printOutput) Rcout << "Reading input file..." << std::endl << std::endl; try{ network = readInputFile(edgefilename, modularityFunction); } catch(...) { stop("Could not parse edge file."); } } else { // Load lower triangle int network_size = (SNN.nonZeros() / 2) + 3; IVector node1; IVector node2; DVector edgeweights; node1.reserve(network_size); node2.reserve(network_size); edgeweights.reserve(network_size); for (int k=0; k < SNN.outerSize(); ++k){ for (Eigen::SparseMatrix::InnerIterator it(SNN, k); it; ++it){ if(it.col() >= it.row()){ continue; } node1.emplace_back(it.col()); node2.emplace_back(it.row()); edgeweights.emplace_back(it.value()); } } if(node1.size() == 0) { stop("Matrix contained no network data. Check format."); } int nNodes = std::max(SNN.cols(), SNN.rows()); network = matrixToNetwork(node1, node2, edgeweights, modularityFunction, nNodes); Rcpp::checkUserInterrupt(); } if (printOutput) { Rprintf("Number of nodes: %d\n", network->getNNodes()); Rprintf("Number of edges: %d\n", network->getNEdges()); Rcout << std::endl; Rcout << "Running " << ((algorithm == 1) ? "Louvain algorithm" : ((algorithm == 2) ? "Louvain algorithm with multilevel refinement" : "smart local moving algorithm")) << "..."; Rcout << std::endl; } resolution2 = ((modularityFunction == 1) ? (resolution / (2 * network->getTotalEdgeWeight() + network->getTotalEdgeWeightSelfLinks())) : resolution); auto beginTime = duration_cast(system_clock::now().time_since_epoch()); std::shared_ptr clustering; maxModularity = -std::numeric_limits::infinity(); JavaRandom random(randomSeed); Progress p(nRandomStarts, printOutput); for (i = 0; i < nRandomStarts; i++) { //if (printOutput && (nRandomStarts > 1)) //Rprintf("Random start: %d\n", i + 1); VOSClusteringTechnique vosClusteringTechnique(network, resolution2); j = 0; update = true; do { /*if (printOutput && (nIterations > 1)) Rprintf("Iteration: %d\n", j + 1); */ if (algorithm == 1) update = vosClusteringTechnique.runLouvainAlgorithm(random); else if (algorithm == 2) update = vosClusteringTechnique.runLouvainAlgorithmWithMultilevelRefinement(random); else if (algorithm == 3) vosClusteringTechnique.runSmartLocalMovingAlgorithm(random); j++; modularity = vosClusteringTechnique.calcQualityFunction(); //if (printOutput && (nIterations > 1)) // Rprintf("Modularity: %.4f\n", modularity); Rcpp::checkUserInterrupt(); } while ((j < nIterations) && update); if (modularity > maxModularity) { clustering = vosClusteringTechnique.getClustering(); maxModularity = modularity; } /*if (printOutput && (nRandomStarts > 1)) { if (nIterations == 1) Rprintf("Modularity: %.4f\n", modularity); Rcout << std::endl; }*/ p.increment(); } auto endTime = duration_cast(system_clock::now().time_since_epoch()); if(clustering == nullptr) { stop("Clustering step failed."); } if (printOutput) { if (nRandomStarts == 1) { if (nIterations > 1) Rcout << std::endl; Rprintf("Modularity: %.4f\n", maxModularity); } else Rprintf("Maximum modularity in %d random starts: %.4f\n", nRandomStarts, maxModularity); Rprintf("Number of communities: %d\n", clustering->getNClusters()); Rprintf("Elapsed time: %d seconds\n", static_cast((endTime - beginTime).count() / 1000.0)); } // Return results clustering->orderClustersByNNodes(); IntegerVector iv(clustering->cluster.cbegin(), clustering->cluster.cend()); return iv; } catch(std::exception &ex) { forward_exception_to_r(ex); } catch(...) { ::Rf_error("c++ exception (unknown reason)"); } return IntegerVector(1); } Seurat/src/fast_NN_dist.cpp0000644000176200001440000000400414670622051015364 0ustar liggesusers#include using namespace Rcpp; // code in-parts taken from https://gallery.rcpp.org/articles/parallel-distance-matrix/ // Assumption: the end position of vector2 is implied by the end position of vector1 // generic function for euclidean distance template inline double euclidean_distance(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2) { // value to return double rval = 0; // set iterators to beginning of ranges InputIterator1 it1 = begin1; InputIterator2 it2 = begin2; // for each input item while (it1 != end1) { // take the value and increment the iterator double d1 = *it1++; double d2 = *it2++; // update the distance rval += pow(d1-d2, 2); } return sqrt(rval); } // [[Rcpp::export]] List fast_dist(NumericMatrix x, NumericMatrix y, List n) { // extracting the number of element in the knn graph size_t ngraph_size = n.size(); if (x.nrow() != ngraph_size) { return List(); } List distances_list = clone(n); // looping over the neigbors for (size_t i=0; i= 0.5.0 ([#9559](https://github.com/satijalab/seurat/pull/9559)) - Updated `LoadXenium` and `ReadXenium` to accommodate the output from `XOA` v3.0; updated `LoadXenium` to provide more fine-grained control over the datatypes parsed in, including nucleus segmentation masks, segmentation methods, and other experimental metadata; updated `ReadXenium` to load cell_feature_matrix.h5 when present in favor of the MEX format files; updated `ReadXenium` to load .parquet files using `arrow` instead of .csv.gz files to support XOA 3.0 ([#8604](https://github.com/satijalab/seurat/pull/8605)) - Fixed `LoadXenium` to accommodate datasets without "Blank Codeword" or "Unassigned Codeword" matrices([#9135](https://github.com/satijalab/seurat/pull/9135)) - Fixed `ReadXenium` to properly parse multiple molecular outputs at once ([#8265](https://github.com/satijalab/seurat/issues/8265)) - Added `features` parameter to `LeverageScore` and `SketchData` - Updated `SketchData`'s `ncells` parameter to accept integer vector # Seurat 5.1.0 (2024-05-08) ## Changes - Updated interactive `SpatialDimPlot`s to display spatial coordinates - Updated `BuildClusterTree` to `PseudobulkExpression(..., method = "aggregate")` instead of `AverageExpression` - Fixed `SpatialPlot` to properly handle images with shared cells - Added `cluster.name` parameter to `BuildNicheAssay` - Added `VisiumV2` class, inherits `SeuratObject::FOV`, returned by `Load10X_Spatial` - Updated `Load10X_Spatial` to support loading Visium HD datasets - added `bin.size` parameter - Updated `Read10X_Coordinates` to handle new `tissue_coordinates.parquet` files - Added `shape` parameter to `SpatialPlot` and wrappers: `SpatialFeaturePlot` and `SpatialDimPlot` - Added `image.scale` parameter to `SpatialPlot` and related functions: `SpatialFeaturePlot`/`ISpatialFeaturePlot` and `SpatialDimPlot`/`ISpatialDimPlot` - Restored `image.name` parameter to `Read10X_Image` - Added `scale` parameter to `Radius.VisiumV1` - Fixed calculation of `spot.radius` attribute for `VisiumV1` instance returned by `Read10X_Image` — replace `scale.factors$fiducial` with `scale.factors$spot` - Added `Read10X_Coordinates` and `Read10X_ScaleFactors` - Fixed `SpatialPlot` to properly handle mutli-assay `Seurat` instances # Seurat 5.0.3 (2024-03-18) ## Changes - Fixed `PercentAbove` to discount null values ([#8412](https://github.com/satijalab/seurat/issues/8412)) - Added `log` parameter to `FeatureScatter` - Fixed handling of `clip.range` for `SCTransform` when `ncells` is less than the size of the passed dataset # Seurat 5.0.2 (2024-02-28) ## Changes - Fixed `AverageExpression` to handle `features` vector when `layer="scale.data"` and `return.seurat=TRUE` - Added `fc.slot` parameter to `FindMarkers` - Fixed `SCTransform` to handle `vars.to.regress` ([#8148](https://github.com/satijalab/seurat/issues/8148)) and ([#8349](https://github.com/satijalab/seurat/issues/8349)) - Fixed `SCTransform` to handle fetching residuals ([#8185](https://github.com/satijalab/seurat/issues/8185)) # Seurat 5.0.1 (2023-11-16) ## Changes - Fixed `SCTransform.StdAssay` to pass extra arguments to `sctransform::vst()`. Fixes [#875](https://github.com/satijalab/seurat/issues/7998) - Fixed PercentageFeatureSet Layer calling [(#8009)](https://github.com/satijalab/seurat/issues/8009) - Fixed cell highlighting [(#7914)](https://github.com/satijalab/seurat/pull/7914) - Updated marker sorting to be by p-value with ties broken by absolute difference in percent expression - Fixed issue with replicated barcodes in MappingScore [(#7922)](https://github.com/satijalab/seurat/issues/7922) - Improved `PseudobulkExpression` by adding 'g' to cell names that started with numeric values - Improved `PseudobulkExpression` by adding each variable specified in `group.by` as columns in the object metadata when `return.seurat=TRUE` - Fixed `DimPlot` and `FeatureScatter` which were breaking when using the `split.by` argument with a variable that contained NAs # Seurat 5.0.0 (2023-10-25) ## Added - Add `BridgeCellsRepresentation` to construct a dictionary representation for each unimodal dataset. - Add `BuildNicheAssay` to construct a new assay where each feature is a cell label. The values represent the sum of a particular cell label neighboring a given cell. - Add `CalcDispersion` to calculate the dispersion of features. - Add `CCAIntegration` to perform Seurat-CCA Integration. - Add `CountSketch` to generate a CountSketch random matrix. - Add `CreateCategoryMatrix` to create a one-hot matrix for a given label. - Add `DISP` to find variable features based on dispersion. - Add `FastRPCAIntegration` as a convenience wrapper function around the following three functions that are often run together when performing integration. - Add `FetchResiduals_reference` as a temporary function to get residuals from the reference. - Add `FetchResiduals` to call sctransform::get_residuals. - Add `FetchResidualSCTModel` to calculate Pearson residuals of features not in the scale.data. - Add `FindBridgeAnchor` to find bridge anchors between two unimodal datasets. - Add `FindBridgeIntegrationAnchors` to find a set of anchors for integration between unimodal query and the other unimodal reference using a pre-computed BridgeReferenceSet. - Add `FindBridgeTransferAnchors` to find a set of anchors for label transfer between unimodal query and the other unimodal reference using a pre-computed BridgeReferenceSet. - Add `GaussianSketch` to perform Gaussian sketching. - Add `HarmonyIntegration` to perform Harmony integration. - Add `IntegrateLayers` to integrate layers in an assay object. - Add `JointPCAIntegration` to perform Seurat-Joint PCA Integration. - Add `LeverageScore` to compute the leverage scores for a given object. - Add `LoadCurioSeeker` to load Curio Seeker data. - Add `MVP` to find variable features based on mean.var.plot. - Add `NNtoGraph` to convert the Neighbor class to an asymmetrical Graph class. - Add `PrepareBridgeReference` to preprocess the multi-omic bridge and unimodal reference datasets into an extended reference. - Add `ProjectCellEmbeddings` to project query data onto the reference dimensional reduction. - Add `ProjectData` to project high-dimensional single-cell RNA expression data from a full dataset onto the lower-dimensional embedding of the sketch of the dataset. - Add `ProjectDimReduc` to project query data to reference dimensional reduction. - Add `ProjectIntegration` to integrate embeddings from the integrated sketched.assay. - Add `PseudobulkExpression` to normalize the count data present in a given assay. - Add `Read10X_probe_metadata` to read the probe metadata from a 10x Genomics probe barcode matrix file in HDF5 format. - Add `RPCAIntegration` to perform Seurat-RPCA Integration. - Add `RunGraphLaplacian` to run a graph Laplacian dimensionality reduction. - Add `SelectIntegrationFeatures5` to select integration features for v5 assays. - Add `SelectSCTIntegrationFeatures` to select SCT integration features. - Add `SketchData` to use sketching methods to downsample high-dimensional single-cell RNA expression data for help with scalability for large datasets. - Add `TransferSketchLabels` to transfer cell type labels from a sketched dataset to a full dataset based on the similarities in the lower-dimensional space. - Add `UnSketchEmbeddings` to transfer embeddings from sketched cells to the full data. - Add `VST` to apply a variance stabilizing transformation for selection of variable features. ## Changes - Change `FindTransferAnchors` so that anchor filtering is not performed by default - Change `merge` so that layers will be added to a single Seurat object instead of combining raw count matrices - Deprecate `slot` parameter in favor of `layers` in accessor and set methods # Seurat 4.4.0 (2023-09-27) ## Added - Add parallelization support with speed improvements for `PrepSCTFindMarkers` - Fix bug in `LoadNanostring`([#7566](https://github.com/satijalab/seurat/pull/7566)) ## Changes - Fix bug in `as.Seurat.SingleCellExperiment()` ([#6692](https://github.com/satijalab/seurat/issues/6692)) - Support for Visium probe information introduced in Spaceranger 2.1 ([#7141](https://github.com/satijalab/seurat/pull/7141)) - Add `LoadCurioSeeker` to load sequencing-based spatial datasets generated using the Curio Seeker - Fix fold change calculation for assays ([#7095](https://github.com/satijalab/seurat/issues/7095)) - Fix `pt.size` bug when rasterization is set to true ([#7379](https://github.com/satijalab/seurat/issues/7379)) - Fix `FoldChange` and `FindMarkers` to support all normalization approaches ([#7115](https://github.com/satijalab/seurat/pull/7115),[#7110](https://github.com/satijalab/seurat/issues/7110),[#7095](https://github.com/satijalab/seurat/issues/7095),[#6976](https://github.com/satijalab/seurat/issues/6976),[#6654](https://github.com/satijalab/seurat/issues/6654),[#6701](https://github.com/satijalab/seurat/issues/6701),[#6773](https://github.com/satijalab/seurat/issues/6773), [#7107](https://github.com/satijalab/seurat/issues/7107)) - Fix for handling newer ParseBio formats in `ReadParseBio` ([#7565](https://github.com/satijalab/seurat/pull/7565)) - Fix for handling rasterization by default ([#7842](https://github.com/satijalab/seurat/pull/7842)) - Fix bug in `ReadMtx()` to add back missing parameters - Fix `SCTransform()` for V5 assays to retain gene attributes ([#7557](https://github.com/satijalab/seurat/issues/7557)) - Fix `LeverageScore()` for objects with few features ([#7650](https://github.com/satijalab/seurat/issues/7650) # Seurat 4.3.0 (2022-11-18) ## Added - Add support for imaging-based spatial datasets ## Changes - Fix bug in `FindMarkers()` when run post Integration/Transfer ([#6856](https://github.com/satijalab/seurat/issues/6586)) # Seurat 4.2.1 (2022-11-08) ## Changes - Replaced import from `spatstat.core` with `spatstat.explore` - Fix bug in `FindMarkers()` when using `SCT` assay ([#6856](https://github.com/satijalab/seurat/issues/6586)) # Seurat 4.2.0 (2022-09-21) ## Changes - Fix legend color in `DoHeatmap()` ([#5783](https://github.com/satijalab/seurat/issues/5783)) - Fix bug in `ScaleData()` when regressing out one gene ([#5970](https://github.com/satijalab/seurat/pull/5970)) - Fix name pulling in `PlotPerturbScore()` ([#6081](https://github.com/satijalab/seurat/pull/6081)) - Support spaceranger 2.0 ([#6208](https://github.com/satijalab/seurat/pull/6208)) - Fix bug in `SpatialDimPlot()` when using `group.by` ([#6179](https://github.com/satijalab/seurat/issues/6179)) - Add `add.noise` parameter in `VlnPlot()` ([#5756](https://github.com/satijalab/seurat/issues/5756)) - Fix uwot model backwards compatibility ([#6345](https://github.com/satijalab/seurat/issues/6345)) - Allow `pseudocount.use` in differential expression functions to be set at the `Assay` level # Seurat 4.1.1 (2022-05-01) ## Changes - Fix `giveCsparse` related warnings in `Read10X_h5` - Fix ident labeling for `SpatialPlot` ([#5774](https://github.com/satijalab/seurat/issues/5774)) - Fix `ReadMtx` on Windows ([#5687](https://github.com/satijalab/seurat/issues/5687)) - Fix `VlnPlot` to switch on rasterization only when required ([#5846](https://github.com/satijalab/seurat/pull/5846)) - Fix `ncol` behavior in `SpatialPlot` ([#5774](https://github.com/satijalab/seurat/issues/5774)) - Set `jitter` to FALSE in `FeatureScatter` ([#5876](https://github.com/satijalab/seurat/pull/5876)) - Update `Cells` methods to new signature (`x, ...`) - Replace use of `default.stringsAsFactors()` with `getOption("stringsAsFactors")` # Seurat 4.1.0 (2022-01-14) ## Added - Add `raster.dpi` parameter to `DimPlot/FeaturePlot` to optionally rasterize individual points ([#5392](https://github.com/satijalab/seurat/pull/5392)) - Add support for sctransform v2, differential expression with SCT assay ## Changes - Update `ReadParseBio` to support split-pipe 0.9.6p ([#5446](https://github.com/satijalab/seurat/pull/5446)) - Fixes for MAST differential expression ([#5441](https://github.com/satijalab/seurat/issues/5441)) - Fix scaling options when using `split.by` in `FeaturePlot()` ([#5243](https://github.com/satijalab/seurat/issues/5243)) # Seurat 4.0.6 (2021-12-16) ## Added - Implement supervised LSI ## Changes - Add `raster` parameter to `VlnPlot` to optionally rasterize individual points ([#5076](https://github.com/satijalab/seurat/pull/5076)) - Add `min.cells.group` parameter to `FindConservedMarkers` ([#5079](https://github.com/satijalab/seurat/pull/5079)) - Set `do.center` to FALSE for `lsiproject` in `FindTransferAnchors` - Fix error message in `ReadMtx()` ([#5158](https://github.com/satijalab/seurat/issues/5158)) - Add `label.color` parameter to `FeaturePlot` ([#5314](https://github.com/satijalab/seurat/pull/5314)) - Fix issues in `ProjectUMAP` ([#5257](https://github.com/satijalab/seurat/issues/5257), [#5104](https://github.com/satijalab/seurat/issues/5104), [#5373](https://github.com/satijalab/seurat/issues/5373)) # Seurat 4.0.5 (2021-10-04) ## Changes - Update documentation for `to.upper` parameter in `Load10X_Spatial()` ([#4576](https://github.com/satijalab/seurat/issues/4576)) - Update concept tags for `RunSPCA()` ([#4978](https://github.com/satijalab/seurat/discussions/4987)) - Conditionally run tests/packages that use suggested packages ([#5160](https://github.com/satijalab/seurat/pull/5160)) - Set random state in `RunUMAP()` when using the `umap-learn` method ([#5194](https://github.com/satijalab/seurat/issues/5194)) # Seurat 4.0.4 (2021-08-19) ## Added - Add `reduction` parameter to `BuildClusterTree()` ([#4598](https://github.com/satijalab/seurat/issues/4598)) - Add DensMAP option to `RunUMAP()` ([#4630](https://github.com/satijalab/seurat/pull/4630)) - Add `image` parameter to `Load10X_Spatial()` and `image.name` parameter to `Read10X_Image()` ([#4641](https://github.com/satijalab/seurat/pull/4641)) - Add `ReadSTARsolo()` function to read output from STARsolo - Add `densify` parameter to `FindMarkers()` - Add `ReadParsebio()` function to read output from Parse Biosciences - Add the `image.alpha` parameter to `SpatialDimPlot()` and `SpatialFeaturePlot()` - Add support for the correlation metric in `RunUMAP` ([#4972](https://github.com/satijalab/seurat/issues/4972)) ## Changes - Warn and continue rather than erroring if not all features are available in `FindSpatiallyVariableFeatures()` ([#4611](https://github.com/satijalab/seurat/issues/4611)) - Bug fix for SCT-based integration in selecting proper reference model ([#4355](https://github.com/satijalab/seurat/issues/4355)) - Bug fix for reading from absolute paths in ReadMtx ([#4723](https://github.com/satijalab/seurat/issues/4723)) - Bug fix in SingleCellExperiment conversion ([#4633](https://github.com/satijalab/seurat/issues/4633)) - Bug fix in `FindVariableFeatures()` when using `selection.method = "mvp"` and `binning.method = "equal_frequency"` ([#4712](https://github.com/satijalab/seurat/issues/4712)) - Bug fix in `DoHeatmap()` to remove random characters from plot legend([#4660](https://github.com/satijalab/seurat/issues/4660)) - Fix cell renaming in `RunCCA()` - Fix issue in SingleCellExperiment conversion where the mainExp would not be set properly - Fix for default dispersion info displayed in `VariableFeaturePlot()` # Seurat 4.0.3 (2021-06-10) ## Added - Add `jitter` parameter to `FeatureScatter()` ## Changes - Fix issues with `as.SingleCellExperiment.Seurat()` for the latest verion of SingleCellExperiment ([#4532](https://github.com/satijalab/seurat/pull/4532)) - Ensure proper reference.reduction is used in `MapQuery()` - Fix to `UpdateSymbolList()`, no longer searches aliases and exposes the `search.types` parameter in `GeneSymbolThesarus()` ([#4545](https://github.com/satijalab/seurat/issues/4545)) - Transfer `scale.data` slot as well when converting with `as.SingleCellExperiment.Seurat()` - Enable `alpha` parameter for `SpatialDimPlot()` - Fix `as.SingleCellExperiment.Seurat()` conversion for atypical `reducedDim` components # Seurat 4.0.2 (2020-05-20) ## Added - New `AddAzimuthScores()` and `AddAzimuthResults()` functions - Add `shuffle` parameter to `FeatureScatter()` ([#4280](https://github.com/satijalab/seurat/pull/4280)) - Add `lsiproject` and `rpca` options for `FindTransferAnchors()` - Add `rlsi` option for `FindIntegrationAnchors()` ## Changes - - Preserve feature metadata when converting from `SingleCellExperiment` to `SeuratObject` class ([#4205](https://github.com/satijalab/seurat/issues/4205)) - Preserve multiple assays when converting from `SingleCellExperiment` to `SeuratObject` class ([#3764](https://github.com/satijalab/seurat/issues/3764)) - Fix passing of `score.thresh` parameter in `ScoreJackStraw()` ([#4268](https://github.com/satijalab/seurat/pull/4268)) - Fix FC calculation in `FindMarkers()` non-log transformed data. - Add umap-learn version >= 0.5.0 compatibility for `RunUMAP()` - Fix `DotPlot` to use `log1p` when `scale=False` ([#4298](https://github.com/satijalab/seurat/issues/4298)) - Fix split and shuffled `DimPlot` - Disallow NULL or another length 0 vector for `ident.1` in `FindMarkers()` - Fix range shift when labeling clusters on a GeomSpatial plot - Fix SpatialPlot distortion for non-square images. - Fix future-related warnings in `FindIntegrationAnchors()` - Fix `fc.name` parameter in `FindMarkers()` ([#4474](https://github.com/satijalab/seurat/issues/4474)) - Deprecate `group.by` parameter in `PlotPerturbScore()` in favor of `mixscape.class`. # Seurat 4.0.1 (2020-03-17) ## Added - Add direction option to `PlotClusterTree()` - Add `cols` parameter to `JackStrawPlot()` - Add `ReadMtx()` to read local and remote mtx files with associated cell and feature name files ## Changes - Equality added to differential expression thresholds in `FindMarkers` (e.g, >= logfc.threshold rather than >) - `Read10X()` now prepends dataset number for first dataset when reading multiple datasets - Bug fix for `subset.AnchorSet()` - Bug fix for fold change values in `FindMarkers()` when setting a different pseudocount ([#4111](https://github.com/satijalab/seurat/pull/4111)) - Bug fix for `RunLDA()` related to proper passing of assay parameter. - When using `order=TRUE` in `SingleDimPlot()`, print NA points under all others. - Remove default parameter value for `data.dir` in `Read10X()` - Import spatstat fxns from subpackages (spatstat.core, spatstat.geom) - `RunUMAP` now checks for graph/neighbor consistency # Seurat 4.0.0 (2020-01-27) ## Added - Expose `FoldChange()` component in `FindMarkers()`. - Add the `merge.DimReduc` method - Add `IntegrateEmbeddings()` to correct embeddings of `DimReduc`s - Add `ProjectUMAP()` to project query cells into a reference UMAP space - Add `MapQuery()` as a wrapper around `IntegrateData()`, `IntegrateEmbeddings()`, and `ProjectUMAP()` - Add `MappingScore` to compute a per-cell mapping score used in Azimuth - Add `AggregateExpression()` for summation based pseudobulk calculations - Add mixscape functionality via `CalcPerturbSig()`, `PrepLDA()`, `RunLDA()`, `DEenrichRPlot()`, `MixscapeHeatmap()`, `MixscapeLDA()`, `PlotPerturbScore()`, `RunMixscape()` - Add `FindSubCluster()` to further cluster existing clusters - Add supervised PCA functionality via `RunSPCA()` - Add functionality to enable weighted nearest neighbor analyses via `FindMultiModalNeighbors()` - Add neighbor visualization plot via `NNPlot()`. - Add `PredictAssay()` to impute expression or embeddings from nearest neighbors - Add `Graphs()` function to access the names of the stored Graph objects or pull a specific one - Add checks for NA, NaN, logical, non-integer, and infinite values during CreateAssayObject and NormalizeData.default - Add `AnnotateAnchors()` to aid in AnchorSet interpretation as well as `subset.AnchorSet()` - Add flexibility of choice for cell column in `Read10X()` - Add rasterization option to `FeatureScatter()` and `VariableFeaturePlot()` - Add step1 feature parameters in the SCTModel via `PrepVSTResults()` ## Changes - Default neighbor finding algorithm changed from "rann" to "annoy" - Default `ncells` parameter in `SCTransform()` changed to 5000 - Default fold change in `FindMarkers()` changed from ln to log2 - Implementation improvements to `AverageExpression()` - `AnchorSet` class re-implemented as a virtual class from which `IntegrationAnchorSet` and `TransferAnchorSet` now inherit. - Point size in `VlnPlot()` now set automatically if not specified - Return the sample.tree properly when integrating with a single reference dataset - Replace `as.character.quosure` usage with `as_label` due to deprecation - Minor changes to the exact calculation of the anchor weight matrix - Default rasterization limit in `DimPlot()` and `FeaturePlot()` changed from 50,000 to 100,000 - `SCTransform()` now returns a formalized `Assay` subclass `SCTAssay()` - When using `normalization.method='SCT'` in `FindTransferAnchors()`, normalize query using reference SCT model when possible. - Change default Neighbor name in `FindNeighbors` to `Assay.nn` ## Removed - `CreateGeneActivityMatrix` replaced by `Signac::GeneActivity()` - `RunLSI` replaced by by `Signac::RunTFIDF()` and `Signac::RunSVD()` - `ReadAlevin` and `ReadAlevinCsv` moved to SeuratWrappers - `ExportToCellbrowser` and `StopCellbrowser` moved to SeuratWrappers # Seurat 3.2.3 - 2020-12-14 ## Added - Titles added to `DimPlot` when specifying `group.by` parameter - `keep.scale` parameter added to `FeaturePlot` to control scaling across multiple features and/or splits. ## Changes - `Same` deprecated in favor of `base::identity` - Fix in `DietSeurat` to work with specialized `Assay` objects - Fix p-value return when using the `ape` implementation of Moran's I - Fix bug in FindMarkers when using MAST with a latent variable - Updates to `Key<-.DimReduc` that allow handling of empty reduction column names - Allow setting `ctrl` in `CellCycleScoring` - Modify subset.Seurat to allow specialized Assay subsetting methods - Fix image selection in interactive spatial plots - Update Rcpp functions with `export(rng=FALSE)` to avoid potential future warnings - Fix RenameCells bug for integrated SCT assays - Fix highlight order with proper factor levels when using `SetHighlight` in plots - Small change in CellRanger version detection logic of h5 file to improve robustness to outside tools. - `do.cpp` deprecated and will default to true # Seurat 3.2.2 (2020-09-25) ## Changes - Set the seed in `WhichCells` regardless of whether or not `idents` is passed - Retain Graph and Neighbor objects when subsetting only on features - Fix data.frame input to `CreateAssayObject()` when data.frame has no rownames. - Default annoy search to sequential if not using multicore future plans. - Require sctransform >= 0.3.0 # Seurat 3.2.1 (2020-09-04) ## Added - Added support for nearest neighbor input and `return.model` parameter in `RunUMAP()` - Enable named color vectors in `DoHeatmap()` - Add `label.color` and `label.box` parameters to `DimPlot` - Added `shuffle` and `seed` parameters to `DimPlot()` to help with overplotting - Added new stacked violin plot functionality ## Changes - Allow setting `slot` parameter in `RunUMAP` - Added support for FIt-SNE v1.2+ - Fix for `Spatial*Plot` when running with interactive=TRUE - Set max for number of items returned by `Top` and remove duplicate items when balanced=TRUE - Fix logging bug when functions were run via `do.call()` - Fix handling of weight.by.var parameter when approx=FALSE in `RunPCA()` - Fix issue where feature names with dashes crashed `CellSelector` - Fix issue where errors in subsetting were being swallowed - Fix issue where labeling uncropped spatial plots was broken ## Deprecated - `CreateActivityMatrix` deprecated in favor of `Signac::GeneActivity` - `ReadAlevin` and `ReadAlevinCsv` deprecated in favor of `SeuratWrappers::ReadAlevin` - `ExportToCellbrowser` and `StopCellbrowser` deprecated in favor of `SeuratWrappers::ExportToCellbrowser` and `SeuratWrappers::StopCellbrowser` - `ReadH5AD` and `WriteH5AD` deprecated in favor of h5Seurat/H5AD functionality found in SeuratDisk - `as.loom` and `as.Seurat.loom` deprecated in favor of functionality found in SeuratDisk # Seurat 3.2.0 (2020-07-15) ## Added - Added ability to create a Seurat object from an existing Assay object, or any object inheriting from the Assay class - Added ability to cluster idents and group features in `DotPlot` - Added ability to use RColorBrewer plaettes for split `DotPlots` - Added visualization and analysis functionality for spatially resolved datasets (Visium, Slide-seq). ## Changes - Removed `add.iter` parameter from `RunTSNE` function - Fixed integer overflow error in the WilcoxDETest function - Minor visual fixes in `DoHeatmap` group bar + labels - Efficiency improvements in anchor scoring (`ScoreAnchors`) - Fix bug in `FindClusters()` when the last node has no edges - Default to weighted = TRUE when constructing igraph objects in `RunLeiden`. Remove corresponding weights parameter from `FindClusters()`. - Fix handling of keys in `FeatureScatter()` - Change `CellSelector` to use Shiny gadgets instead of SDMTools - Mark `PointLocator` as defunct - Remove `SDMTools` - Fixed data slot return in `AverageExpression` when subsetting features and returning a Seurat object # Seurat 3.1.5 (2020-04-14) ## Added - New `scale` parameter in `DotPlot` - New `keep.sparse parameter in `CreateGeneActivityMatrix` for a more memory efficient option - Added ability to store model learned by UMAP and project new data - New `strip.suffix` option in `Read10X`. **This changes the default behavior of `Read10X`**. A trailing `-1` present in all cell names will not be removed by default. - Added `group.by` parameter to `FeatureScatter` ## Changes - Replace wilcox.test with limma implementation for a faster FindMarkers default method - Better point separation for `VlnPlot`s when using the `split.by` option - Efficiency improvements for anchor pairing - Deprecate redundant `sort.cell` parameter in `FeaturePlot` - Fixes to ensure correct class of Matrix passed to c++ functions - Fixes for underscores in ident labels for `DotPlot` - Ensure preservation of matrix dimnames in `SampleUMI` - Fix non-standard evaluation problems in `subset` and `WhichCells` - Default split violin option is now a multi group option - Preserve alpha in `FeaturePlot` when using `blend` - Update `assay.used` slot for `DimReduc`s when Assay is renamed # Seurat 3.1.4 (2020-02-20) ## Changes - Fixes to `DoHeatmap` to remain compatible with ggplot2 v3.3 - Adoption of `patchwork` framework to replace `CombinePlots` # Seurat 3.1.3 (2020-02-07) ## Added - New system agnostic `Which` function to address problems with FItSNE on Windows ## Changes - Export `CellsByIdentities` and `RowMergeSparseMatrices` functions - nCount and nFeature metadata variables retained after subset and updated properly with `UpdateSeuratObject` - Fix uwot support for running directly on feature matrices - Fixes for keys with underscores - Fix issue with leiden option for `FindClusters` - Fix for data transfer when using sctransform - SDMTools moved to Suggests as package is orphaned # Seurat 3.1.2 (2019-12-11) ## Added - New silent slot updater - New random seed options to `RunCCA`, `RunTSNE`, `WhichCells`, `HTODemux`, `AddModuleScore`, `VlnPlot`, and `RidgePlot` - Enhancements for dealing with `Assay`-derived objects ## Changed - Only run `CalcN` (generates nFeatures and nCounts) when `counts` changes - Fix issue regarding colons in feature names - Change object class testing to use `inherits` or `is.*` for R 4.0 compatability # Seurat 3.1.1 (2019-09-20) ## Added - New `RegroupIdents` function to reassign idents based on metadata column majority - `UpdateSymbolList` function to pull new gene names from HGNC - Added support for H5AD layers as additional assays in a `Seurat` object ## Changed - Fix rownames issue when running UMAP on dist object - Add support for new H5AD `obsm` and `varm` stucture - Fix issue when trying to read non-existent feature-level metadata from an H5AD file - Fix in integration workflow when using SCTransform - Improved error checking for `AddModuleScore` - cbind fix in reference-based integration (`MapQuery`) - Fix for convenience plots error hanging - Ensure Seurat objects aren't stored in the command logs # Seurat 3.1.0 (2019-08-20) ## Added - New `PrepSCTIntegration` function to facilitate integration after `SCTransform` - Reference-based integration with the `reference` parameter in `FindIntegrationAnchors` - Reciprocal PCA as a `reduction` option in `FindIntegrationAnchors` - New `CollapseEmbeddingOutliers` function - Enable `FindTransferAnchors` after `SCTransform` - Added back `ColorDimSplit` functionality - Include a code of conduct - Added uwot support as new default UMAP method - Added `CheckDots` to catch unused parameters and suggest updated names - `Reductions` and `Assays` assays functions to list stored DimReducs and Assays ## Changed - Fix regex in `LogSeuratCommand` - Check for NAs in feature names in `Read10X` - Prevent dimnames for counts/data/scale.data matrices from being arrays - Updates `ReadH5AD` to distinguish FVF methods - Fixes to UpdateSeuratObject for v2 objects - Sink all output from stdout to stderr - Fix to scale.data cell ordering after subsetting - Enable `Assay` specification in `BuildClusterTree` - Fix `FeaturePlot` when using both `blend` and `split.by` - Fix to `WhichCells` when passing `cells` and `invert` - Fix to `HoverLocator` labels and title - Ensure features names don't contain pipes (`|`) - Deprecation of `RunLSI` and `RunALRA` - Fix legend bug when sorting in `ExIPlot` # Seurat 3.0.2 (2019-06-07) ## Added - Flag to skip singleton grouping in `FindClusters` - New custom colors for blended `FeaturePlot`s - New `GetResidual` function - New Seurat/Monocle converters ## Changed - Fix issue where certain assays weren't being shown in the `Seurat` object - Fix issue where we weren't updating `DimReduc` object column names - Fix line spacers in `DoHeatmap` - Fix uninformative labels in `FeaturePlot` - Fix unset identities when converting from SCE to Seurat - Fix single colors being interpreted as palettes in `SingleDimPlot` - Ensure factor levels are always numerically increasing after `FindClusters` - Better cell highlighting colors for `DimPlot` - Fix to `levels<-.Seurat` - Add ability to use counts/scaled data in `BuildClusterTree` - Minor fix to split `ScaleData` # Seurat 3.0.1 (2019-05-16) ## Added - Add global option (Seurat.memsafe) to skip gc() calls - Restore draw.lines to DoHeatmap, maintain size of color bar with different number of features (#1429) - Enable split.by parameter for ScaleData - Add slot parameter to FeaturePlot (#1483) - Add assay parameter to DotPlot (#1404) ## Changed - Fix to color options for VlnPlot with split.by option (#1425) - Improvements to conversion functions (loom, SCE) - Fix for cluster tree reordering (#1434) - Fix PercentageFeatureSet for single feature case - Fix to fold change calculation and filtering for other slots in FindMarkers (#1454) - Keep title vectorized in AugmentPlot (#1515) - Export LogSeuratCommand function - Fix for FindConservedMarkers when one ident is missing from a group (#1517) # Seurat 3.0.0 (2019-04-16) ## Added - New method for identifying anchors across single-cell datasets - Parallelization support via future - Additional method for demultiplexing with MULTIseqDemux - Support normalization via sctransform - New option for clustering with the Leiden algorithm - Support for reading 10X v3 files - New function to export Seurat objects for the UCSC cell browser - Support for data import from Alevin outputs - Imputation of dropped out values via ALRA ## Changed - Significant code restructuring - Most occurances of "gene(s)" in function names/arguments renamed to "feature(s)" - Changes to the Seurat object class to facilitate multimodal data - New BlendPlot implementation # Seurat 2.3.4 (2018-07-13) ## Added - GetIdent function added to pull identity info ## Changed - DiffusionMap dependency replaced with destiny to avoid archival - Java dependency removed and functionality rewritten in Rcpp - Speed and efficiency improvements for Rcpp code - More robust duplicate handling in CellCycleScoring # Seurat 2.3.3 (2018-07-02) ## Added - New HTOHeatmap function - Support for custom PNG arguments for vector-friendly plotting - Fix for 'NA'-labeled cells disappearing with custom color scale ## Changed - Replaced FNN with RANN - Removed unused compiler flags - Moved several lightly-used packages from 'imports' to 'suggests' # Seurat 2.3.2 (2018-06-11) ## Added - RenameCells added for easy renaming of all cells - Read10X_h5 added to read in 10X formatted h5 files - SetAssayData ensures cell order is the same between assay objects and the Seurat object - Compatability updates for ggplot2 v2.3.0 # Seurat 2.3.1 (2018-05-03) ## Added - Support for [UMAP](https://github.com/lmcinnes/umap) dimensional reduction technique - New conversion functions for SingleCellExperiment and anndata ## Changed - FetchData preserves cell order - Require Matrix 1.2-14 or higher - AddModuleScore no longer densifies sparse-matrices - Various visualization fixes and improvements - Default value for latent.vars in FindMarkers/FindAllMarkers changed to NULL. # Seurat 2.3.0 (2018-03-22) ## Added - Support for HTO demultiplexing - Utility functions: TransferIdent, CombineIdent, SplitObject, vector.friendly - C++ implementation for parts of BuildSNN - Preliminary parallelization support (regression and JackStraw) - Support for FItSNE ## Changed - MetaDE replaced with metap for combining p-values (MetaDE was removed from CRAN) - NMF heatmaps replaced (NMF to be archived by CRAN) # Seurat 2.2.1 (2018-02-14) ## Changed - MetaDE replaced with metap for combining p-values (MetaDE was removed from CRAN) - NMF heatmaps replaced (NMF to be archived by CRAN) # Seurat 2.2.0 (2018-01-10) ## Added - Multiple alignment functionality with RunMultiCCA and AlignSubspace extended to multiple datasets - CalcAlignmentScore added to evaluate alignment quality - MetageneBicorPlot added to guide CC selection - Change cluster order in DoHeatmap with group.order parameter - Ability to change plotting order and add a title to DimPlot - do.clean and subset.raw options for SubsetData ## Changed - JoyPlot has been replaced with RidgePlot - FindClusters is now more robust in making temp files - MetaDE support for combining p-values in DE testing # Seurat 2.1.0 (2017-10-12) ## Added - Support for using MAST and DESeq2 packages for differential expression testing in FindMarkers - Support for multi-modal single-cell data via @assay slot ## Changed - Default DE test changed to Wilcoxon rank sum test # Seurat 2.0.1 (2017-08-18) ## Added - Now available on CRAN - Updated documentation complete with examples - Example datasets: `pbmc_small` and `cc.genes` - C++ implementation for parts of FindVariableGenes - Minor bug fixes # Seurat 2.0.0 (2017-07-26) ## Added - New method for aligning scRNA-seq datasets - Significant code restructuring - New methods for scoring gene expression and cell-cycle phases - New visualization features (do.hover, do.identify) Seurat/inst/0000755000176200001440000000000014730427000012467 5ustar liggesusersSeurat/inst/CITATION0000644000176200001440000000751214730427000013631 0ustar liggesuserscitHeader("To cite Seurat in publications, please use:") bibentry(bibtype = "article", author = c( as.person("Yuhan Hao"), as.person("Tim Stuart"), as.person("Madeline H Kowalski"), as.person("Saket Choudhary"), as.person("Paul Hoffman"), as.person("Austin Hartman"), as.person("Avi Srivastava"), as.person("Gesmira Molla"), as.person("Shaista Madad"), as.person("Carlos Fernandez-Granda"), as.person("Rahul Satija") ), title = "Dictionary learning for integrative, multimodal and scalable single-cell analysis", journal = "Nature Biotechnology", year = "2023", doi = "10.1038/s41587-023-01767-y", url = "https://doi.org/10.1038/s41587-023-01767-y", textVersion = "Hao et al. Dictionary learning for integrative, multimodal and scalable single-cell analysis. Nature Biotechnology (2023) [Seurat V5]" ) bibentry(bibtype = "article", author = c( as.person("Yuhan Hao"), as.person("Stephanie Hao"), as.person("Erica Andersen-Nissen"), as.person("William M. Mauck III"), as.person("Shiwei Zheng"), as.person("Andrew Butler"), as.person("Maddie J. Lee"), as.person("Aaron J. Wilk"), as.person("Charlotte Darby"), as.person("Michael Zagar"), as.person("Paul Hoffman"), as.person("Marlon Stoeckius"), as.person("Efthymia Papalexi"), as.person("Eleni P. Mimitou"), as.person("Jaison Jain"), as.person("Avi Srivastava"), as.person("Tim Stuart"), as.person("Lamar B. Fleming"), as.person("Bertrand Yeung"), as.person("Angela J. Rogers"), as.person("Juliana M. McElrath"), as.person("Catherine A. Blish"), as.person("Raphael Gottardo"), as.person("Peter Smibert"), as.person("Rahul Satija") ), title = "Integrated analysis of multimodal single-cell data", journal = "Cell", year = "2021", doi = "10.1016/j.cell.2021.04.048", url = "https://doi.org/10.1016/j.cell.2021.04.048", textVersion = "Hao and Hao et al. Integrated analysis of multimodal single-cell data. Cell (2021) [Seurat V4]" ) bibentry(bibtype = "article", author = c( as.person("Tim Stuart"), as.person("Andrew Butler"), as.person("Paul Hoffman"), as.person("Christoph Hafemeister"), as.person("Efthymia Papalexi"), as.person("William M Mauck III"), as.person("Yuhan Hao"), as.person("Marlon Stoeckius"), as.person("Peter Smibert"), as.person("Rahul Satija") ), title = "Comprehensive Integration of Single-Cell Data", journal = "Cell", year = "2019", volume = "177", pages = "1888-1902", doi = "10.1016/j.cell.2019.05.031", url = "https://doi.org/10.1016/j.cell.2019.05.031", textVersion = "Stuart and Butler et al. Comprehensive Integration of Single-Cell Data. Cell (2019) [Seurat V3]" ) bibentry(bibtype = "article", author = c( as.person("Andrew Butler"), as.person("Paul Hoffman"), as.person("Peter Smibert"), as.person("Efthymia Papalexi"), as.person("Rahul Satija") ), title = "Integrating single-cell transcriptomic data across different conditions, technologies, and species", journal = "Nature Biotechnology", year = "2018", volume = "36", pages = "411-420", doi = "10.1038/nbt.4096", url = "https://doi.org/10.1038/nbt.4096", textVersion = "Butler et al. Integrating single-cell transcriptomic data across different conditions, technologies, and species. Nat Biotechnol (2018) [Seurat V2]" ) bibentry(bibtype = "article", author = c( as.person("Rahul Satija"), as.person("Jeffrey A Farrell"), as.person("David Gennert"), as.person("Alexander F Schier"), as.person("Aviv Regev") ), title = "Spatial reconstruction of single-cell gene expression data", journal = "Nature Biotechnology", year = "2015", volume = "33", pages = "495-502", doi = "10.1038/nbt.3192", url = "https://doi.org/10.1038/nbt.3192", textVersion = "Satija and Farrell et al. Spatial reconstruction of single-cell gene expression data. Nat Biotechnol (2015) [Seurat V1]" ) Seurat/inst/extdata/0000755000176200001440000000000014670622051014127 5ustar liggesusersSeurat/inst/extdata/pbmc_raw.txt0000644000176200001440000011572014670622051016470 0ustar liggesusersATGCCAGAACGACT CATGGCCTGTGCAT GAACCTGATGAACC TGACTGGATTCTCA AGTCAGACTGCACA TCTGATACACGTGT TGGTATCTAAACAG GCAGCTCTGTTTCT GATATAACACGCAT AATGTTGACAGTCA AGGTCATGAGTGTC AGAGATGATCTCGC GGGTAACTCTAGTG CATGAGACACGGGA TACGCCACTCCGAA CTAAACCTGTGCAT GTAAGCACTCATTC TTGGTACTGAATCC CATCATACGGAGCA TACATCACGCTAAC TTACCATGAATCGC ATAGGAGAAACAGA GCGCACGACTTTAC ACTCGCACGAAAGT ATTACCTGCCTTAT CCCAACTGCAATCG AAATTCGAATCACG CCATCCGATTCGCC TCCACTCTGAGCTT CATCAGGATGCACA CTAAACCTCTGACA GATAGAGAAGGGTG CTAACGGAACCGAT AGATATACCCGTAA TACTCTGAATCGAC GCGCATCTTGCTCC GTTGACGATATCGG ACAGGTACTGGTGT GGCATATGCTTATC CATTACACCAACTG TAGGGACTGAACTC GCTCCATGAGAAGT TACAATGATGCTAG CTTCATGACCGAAT CTGCCAACAGGAGC TTGCATTGAGCTAC AAGCAAGAGCTTAG CGGCACGAACTCAG GGTGGAGATTACTC GGCCGATGTACTCT CGTAGCCTGTATGC TGAGCTGAATGCTG CCTATAACGAGACG ATAAGTTGGTACGT AAGCGACTTTGACG ACCAGTGAATACCG ATTGCACTTGCTTT CTAGGTGATGGTTG GCACTAGACCTTTA CATGCGCTAGTCAC TTGAGGACTACGCA ATACCACTCTAAGC CATATAGACTAAGC TTTAGCTGTACTCT GACATTCTCCACCT ACGTGATGCCATGA ATTGTAGATTCCCG GATAGAGATCACGA AATGCGTGGACGGA GCGTAAACACGGTT ATTCAGCTCATTGG GGCATATGGGGAGT ATCATCTGACACCA GTCATACTTCGCCT TTACGTACGTTCAG GAGTTGTGGTAGCT GACGCTCTCTCTCG AGTCTTACTTCGGA GGAACACTTCAGAC CTTGATTGATCTTC MS4A1 0 0 0 0 0 0 0 0 0 0 2 2 4 4 2 3 3 4 2 3 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 CD79B 1 0 0 0 0 0 0 0 0 1 2 4 3 3 2 3 1 2 2 5 0 0 0 0 0 0 0 0 0 1 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 2 2 0 0 3 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD79A 0 0 0 0 0 0 0 0 0 0 0 5 2 2 5 8 1 5 5 12 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 HLA-DRA 0 1 0 0 1 1 0 1 0 0 14 28 18 7 15 28 7 26 10 16 7 22 0 10 6 0 4 3 7 13 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 10 10 4 1 6 28 10 13 5 8 108 93 41 42 138 77 76 15 19 104 1 0 0 0 2 1 1 0 2 7 TCL1A 0 0 0 0 0 0 0 0 0 0 3 0 2 4 0 0 3 3 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 HLA-DQB1 1 0 0 0 0 0 0 0 0 0 1 6 2 2 2 8 2 2 1 2 0 3 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 2 0 0 1 1 0 21 21 3 5 11 11 10 1 2 11 0 0 0 0 0 0 0 0 0 1 HVCN1 0 0 0 0 0 0 0 0 0 0 3 1 0 0 2 0 2 1 1 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 HLA-DMB 0 0 0 0 0 0 0 0 0 0 0 4 1 1 2 2 1 2 0 1 0 1 0 1 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 3 2 1 4 5 2 1 1 1 5 0 0 0 0 0 0 0 0 0 0 LTB 3 7 11 13 3 4 6 4 2 21 2 9 2 4 4 0 3 6 5 7 1 0 0 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 7 1 0 1 5 3 1 2 0 0 1 1 1 1 2 1 0 1 0 5 0 0 0 0 1 4 0 0 1 0 0 0 0 0 0 0 LINC00926 0 0 0 0 0 0 0 0 0 0 0 2 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 FCER2 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SP100 1 0 1 1 0 0 0 0 0 1 0 3 2 0 1 2 2 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 3 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 NCF1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 2 2 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 PPP3CC 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 EAF2 0 0 0 0 0 0 0 0 0 0 3 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 PPAPDC1B 0 0 0 0 0 0 0 0 0 0 0 3 0 1 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD19 0 0 0 0 0 0 0 0 0 0 0 1 0 2 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 KIAA0125 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CYB561A3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD180 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 RP11-693J15.5 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 FAM96A 0 1 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CXCR4 1 1 0 6 0 2 4 1 0 4 2 0 4 1 0 0 4 2 6 2 3 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 4 0 7 1 3 0 6 1 0 1 0 1 0 1 0 1 0 0 0 0 1 2 12 3 1 3 0 1 2 0 0 2 0 0 0 0 0 0 0 0 0 0 STX10 0 0 1 0 0 1 0 1 0 0 2 0 0 0 2 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SNHG7 0 2 0 0 0 0 0 0 0 1 0 1 1 0 2 3 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 NT5C 0 0 0 0 0 0 0 0 0 0 2 2 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 BANK1 0 1 0 0 0 0 0 0 0 0 0 4 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 IGLL5 0 0 0 0 0 0 0 0 0 0 1 0 15 0 0 0 0 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD200 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 FCRLA 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD3D 4 4 4 5 4 4 3 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 7 0 0 0 0 1 0 1 0 0 2 3 0 3 15 1 3 6 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 NOSIP 0 3 2 2 3 1 1 3 2 1 0 0 0 0 0 2 0 0 0 0 0 2 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 2 0 0 1 0 0 0 0 0 1 0 0 1 0 2 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 SAFB2 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD2 1 0 2 2 0 1 0 1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IL7R 5 2 1 2 2 0 1 12 0 9 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 1 3 1 1 1 0 2 0 2 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 PIK3IP1 0 0 1 0 0 2 3 2 3 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 MPHOSPH6 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 KHDRBS1 0 1 1 1 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 2 0 0 0 0 0 0 0 0 0 0 MAL 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CCR7 0 5 0 0 2 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 THYN1 0 2 1 1 0 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 TAF7 0 2 0 2 1 2 0 2 3 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 2 3 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 LDHB 3 2 1 6 5 3 4 0 1 6 0 1 0 0 0 0 2 0 1 0 1 2 0 2 1 0 1 0 0 0 0 0 0 2 2 0 1 0 0 0 2 1 4 0 4 4 0 0 0 2 0 0 1 0 0 2 0 1 0 1 2 0 0 5 2 2 0 1 2 0 1 0 0 0 0 1 0 0 0 1 TMEM123 3 3 0 4 2 1 1 2 1 1 0 1 1 0 0 0 1 3 1 1 0 0 0 0 3 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 2 0 1 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 2 3 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 CCDC104 0 0 0 2 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 EPC1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 EIF4A2 3 1 2 5 2 4 3 2 3 0 0 2 1 1 5 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 2 2 0 2 0 0 0 1 3 1 1 0 0 1 2 0 2 3 0 1 0 2 0 0 2 0 1 0 2 1 4 0 0 4 2 4 1 0 0 1 0 0 0 0 0 0 0 0 0 0 CD3E 0 2 1 4 3 1 3 4 2 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 2 0 1 2 0 1 5 2 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 TMUB1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 BLOC1S4 1 0 2 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ACSM3 1 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 TMEM204 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SRSF7 2 0 1 1 54 2 1 1 1 3 1 2 0 1 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 3 1 0 1 15 0 0 0 0 0 1 2 1 3 1 0 1 1 1 0 1 0 1 0 0 0 1 0 3 1 0 0 2 1 1 3 0 1 5 13 2 0 0 0 0 0 0 0 0 0 0 ACAP1 0 0 1 2 0 1 2 2 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 TNFAIP8 1 3 2 3 2 0 0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 4 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 CD7 2 2 2 3 2 1 0 0 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 1 1 3 4 2 1 1 2 1 4 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 TAGAP 1 1 1 1 0 0 0 1 2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DNAJB1 2 0 0 2 0 0 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 1 0 2 0 2 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ASNSD1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 S1PR4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 0 39 0 0 0 0 0 0 0 1 0 0 2 3 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 CTSW 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 3 2 3 2 4 8 6 1 11 1 4 1 2 1 2 2 1 5 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 GZMK 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 1 2 0 0 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 NKG7 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 2 1 0 0 0 0 1 0 0 1 35 14 12 30 20 27 28 10 25 27 31 22 7 2 4 14 16 4 29 8 5 3 0 0 0 0 5 0 0 0 0 1 0 0 1 3 0 1 0 1 0 0 0 0 0 0 0 0 0 0 IL32 1 0 9 8 1 0 3 3 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 5 4 0 0 0 0 7 8 5 5 0 7 1 6 7 6 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 DNAJC2 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 LYAR 0 1 1 1 3 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 1 0 1 1 2 47 0 1 1 1 1 0 2 0 0 0 0 2 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 CST7 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 4 4 2 7 2 4 3 3 2 5 2 3 1 1 0 2 8 4 5 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 LCK 0 3 2 0 1 1 2 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 1 1 1 2 1 0 1 1 2 0 1 2 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CCL5 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 2 5 14 0 29 1 7 5 25 0 14 27 3 13 17 7 3 16 12 3 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 8 5 4 10 11 30 8 5 9 2 HNRNPH1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SSR2 0 2 2 4 1 1 0 0 0 6 0 1 0 0 1 1 0 1 0 0 0 0 0 0 3 0 1 0 1 0 0 2 0 0 1 0 1 0 1 2 1 2 1 1 1 2 4 1 2 4 2 1 0 0 2 0 3 1 3 1 0 2 3 0 1 3 2 0 4 2 0 0 0 0 0 0 0 0 0 0 DLGAP1-AS1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 GIMAP1 0 2 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 0 2 0 1 1 1 1 0 2 1 0 0 1 1 17 0 0 0 1 0 1 0 1 0 2 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 MMADHC 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 2 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ZNF76 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CD8A 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 3 0 1 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 PTPN22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 GYPC 1 2 2 0 0 1 0 0 2 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 1 0 1 3 0 1 0 0 7 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 HNRNPF 0 0 0 1 0 1 0 1 2 0 0 2 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 2 1 1 2 1 1 1 0 1 2 0 2 0 1 0 0 0 0 1 1 0 1 0 0 1 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 RPL7L1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 KLRG1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 3 0 2 0 1 0 0 0 0 1 4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CRBN 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 2 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 2 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 SATB1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 13 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SIT1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PMPCB 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 2 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 NRBP1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 TCF7 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 HNRNPA3 0 0 0 1 2 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 0 2 1 2 0 2 1 0 1 2 0 0 1 0 0 0 2 1 1 0 1 1 0 0 0 1 4 0 1 0 2 0 0 0 0 0 0 0 0 0 0 S100A8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 5 25 5 25 6 24 40 16 11 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 4 3 0 1 1 2 0 0 2 0 2 1 9 1 23 4 0 0 1 0 0 0 1 0 0 0 2 S100A9 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 30 12 51 22 85 3 54 55 35 17 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 20 6 1 0 10 4 8 6 0 0 0 0 1 10 0 41 11 32 17 0 3 0 0 0 0 0 0 0 0 7 LYZ 1 1 1 0 0 1 0 0 1 0 1 4 0 1 0 0 0 1 1 0 50 29 25 49 98 11 59 28 34 16 0 0 1 0 2 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 41 4 3 3 14 17 7 6 9 6 76 20 24 79 53 53 87 76 42 114 3 1 1 0 1 0 0 0 0 22 CD14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 4 1 0 1 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 FCN1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 10 6 5 9 7 1 1 2 8 7 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 2 13 7 5 1 4 3 1 1 2 0 0 0 3 1 2 4 6 1 0 0 0 0 0 0 0 0 0 0 0 0 TYROBP 0 0 0 2 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 14 13 3 10 16 4 13 12 19 12 3 0 4 3 6 7 3 4 5 15 2 0 1 1 0 0 0 0 0 0 11 21 2 5 21 13 16 9 16 17 2 8 6 9 11 14 10 10 6 7 0 0 0 0 0 0 0 0 0 14 ASGR1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 NFKBIA 0 0 1 1 0 0 0 0 0 4 0 1 1 0 1 0 0 0 1 1 3 13 5 0 11 0 2 3 5 10 0 1 0 1 0 1 0 0 0 0 5 1 1 0 0 0 1 0 1 0 2 2 2 0 2 1 1 1 2 9 2 2 0 1 1 6 1 3 2 4 0 0 0 0 0 0 0 0 0 6 TYMP 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 7 1 6 5 1 6 4 5 1 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 6 5 1 1 6 4 3 2 4 5 1 3 2 5 14 11 3 4 8 4 0 0 0 0 0 0 0 0 0 2 CTSS 1 1 0 0 1 2 0 1 1 1 1 0 1 0 0 0 1 2 0 2 15 9 1 5 7 3 4 4 11 7 0 0 1 0 0 0 1 0 0 4 1 1 0 0 1 0 0 0 0 0 8 8 7 3 10 15 18 19 4 17 5 3 1 5 0 3 6 2 0 3 1 0 0 0 0 0 0 0 0 3 TSPO 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 2 6 0 36 1 5 0 3 5 1 0 0 0 0 0 1 1 1 0 1 1 0 0 2 0 1 0 0 0 2 4 0 1 2 3 6 4 2 5 1 0 0 4 2 5 10 6 4 2 0 0 0 0 0 2 0 0 0 3 RBP7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 2 1 4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CTSB 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 4 1 1 7 1 1 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 4 0 1 0 1 0 3 0 0 2 1 1 0 2 0 2 2 1 0 0 0 0 0 0 1 0 0 0 0 1 LGALS1 1 0 1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 14 10 8 11 4 6 7 22 37 3 4 9 6 1 3 14 2 1 4 1 3 0 0 0 0 1 0 1 0 5 12 4 2 16 10 6 2 12 16 8 13 21 9 20 10 23 5 28 13 0 0 0 0 1 0 0 0 0 10 FPR1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 2 1 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 VSTM1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 BLVRA 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 3 1 2 0 1 0 1 1 3 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 2 2 5 1 2 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 MPEG1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 2 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 BID 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 27 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 3 6 1 2 2 4 2 2 2 2 0 0 3 1 0 2 0 0 0 0 0 0 0 0 0 0 SMCO4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 2 1 0 1 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 2 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 CFD 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 2 1 1 0 0 2 15 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 4 5 2 0 0 5 2 3 2 3 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 3 LINC00936 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 5 1 0 0 1 1 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 3 1 2 1 1 0 3 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 LGALS2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 12 6 2 1 6 0 0 0 5 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 3 10 1 2 3 4 4 1 3 6 0 0 0 0 0 0 0 0 0 3 MS4A6A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 2 2 1 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 4 1 0 7 7 0 2 1 2 0 0 0 0 0 0 0 0 0 0 1 FCGRT 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 0 0 1 14 1 2 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 2 0 1 3 1 1 0 1 1 3 1 0 2 2 3 3 1 4 3 0 0 0 0 0 0 0 0 0 2 LGALS3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 4 4 1 3 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 2 0 0 4 2 0 2 1 0 0 5 1 0 6 2 7 2 2 0 0 0 0 0 0 1 0 0 0 1 NUP214 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 SCO2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 2 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 2 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IL17RA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IFI6 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 5 3 0 0 3 0 1 5 0 4 0 0 0 0 1 0 1 1 2 0 0 0 0 0 0 0 0 0 1 0 0 2 0 1 1 3 1 3 0 2 0 4 0 2 6 2 5 1 0 0 0 0 0 0 0 0 0 0 0 4 HLA-DPA1 0 0 0 0 0 0 0 0 0 0 3 8 2 2 5 9 0 5 1 5 0 13 2 1 0 1 0 0 7 6 0 1 0 2 0 0 1 0 0 0 0 0 0 0 1 3 0 0 1 0 12 4 2 1 5 5 7 14 5 11 75 52 11 19 54 23 45 10 23 37 0 0 0 0 0 0 0 0 0 5 FCER1A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 1 2 4 8 5 8 4 7 0 0 0 0 0 0 0 0 0 0 0 CLEC10A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 2 4 2 3 6 4 2 1 0 0 0 0 0 0 0 0 0 1 HLA-DMA 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 4 1 1 0 1 0 4 1 1 0 0 0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 4 0 0 0 0 6 6 5 4 6 5 6 5 3 5 0 0 0 0 0 0 0 0 0 1 RGS1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 1 3 0 1 3 0 1 2 0 0 0 0 0 0 0 0 0 0 HLA-DPB1 0 0 0 0 0 0 0 0 0 0 4 10 4 4 8 23 7 0 4 6 0 18 1 2 0 3 0 1 7 7 2 4 0 0 0 0 0 0 0 0 0 4 0 0 1 2 0 0 0 0 8 3 5 2 3 7 6 5 9 4 102 78 23 25 69 24 43 8 10 50 1 0 0 0 0 0 0 0 0 5 HLA-DQA1 0 0 0 1 0 0 0 0 0 0 0 4 4 1 0 8 1 5 0 1 1 5 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 1 1 2 0 0 25 39 5 2 16 6 11 3 4 9 0 0 0 0 0 0 0 0 0 0 RNF130 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 2 2 2 2 0 1 1 1 6 3 5 1 0 0 0 0 0 0 0 0 0 0 HLA-DRB5 0 0 0 0 0 0 1 0 0 0 1 4 3 0 4 8 1 2 2 4 0 8 1 1 0 0 0 0 4 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 4 5 0 0 3 3 6 3 6 2 11 26 5 2 31 21 21 2 3 10 0 0 0 0 0 0 0 0 0 1 HLA-DRB1 0 0 0 0 0 0 0 0 0 0 2 10 6 1 5 16 5 11 5 8 2 12 1 5 1 0 3 0 5 3 0 2 0 1 0 0 0 0 1 0 0 0 0 0 0 3 0 0 0 0 8 4 0 0 7 7 13 6 6 4 50 53 10 9 68 36 49 3 9 26 0 0 0 0 0 0 0 0 0 4 CST3 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 13 28 15 11 13 7 37 5 20 18 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 16 32 7 9 11 17 33 10 15 25 61 31 25 14 58 112 37 18 29 125 5 1 0 0 5 1 3 0 0 16 IL1B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 1 0 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 8 0 3 1 2 3 6 1 0 0 0 1 0 0 0 0 0 0 5 POP7 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 1 1 33 0 0 0 0 1 3 0 0 0 0 0 0 0 0 0 0 HLA-DQA2 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 0 1 1 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 7 9 1 0 6 1 4 1 0 5 0 0 0 0 0 0 0 0 0 0 CD1C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 0 0 3 3 0 0 0 1 0 0 0 0 0 0 0 0 0 0 GSTP1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 3 0 1 0 0 2 3 1 6 5 1 3 1 4 2 1 2 0 1 2 0 1 2 0 1 2 0 0 0 0 0 0 0 1 0 4 1 2 0 1 5 0 0 1 1 9 4 5 7 2 5 12 7 10 18 0 0 0 0 1 0 0 0 0 4 EIF3G 1 1 1 1 2 0 0 1 0 2 0 1 0 0 0 2 0 0 0 0 0 0 1 0 2 0 0 1 2 1 3 0 1 0 3 0 0 1 0 3 1 1 0 0 0 0 2 1 1 1 3 3 0 1 2 2 0 1 2 0 1 0 1 2 1 0 1 1 3 43 0 0 0 0 0 0 0 0 0 3 VPS28 0 0 0 3 0 0 0 0 1 0 0 0 1 0 2 0 0 0 0 0 0 0 0 1 2 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 2 3 0 4 3 0 1 0 1 38 0 0 1 0 0 1 0 0 2 0 0 0 2 LY86 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 2 1 1 0 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 2 0 3 2 3 1 2 0 1 8 1 0 0 0 0 0 0 0 0 0 ZFP36L1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 21 0 1 0 0 0 0 0 0 0 0 0 0 0 ZNF330 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 1 32 0 0 0 0 0 0 0 0 0 0 0 ANXA2 0 0 0 0 1 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 1 3 0 3 1 1 1 0 2 3 1 0 0 4 1 0 4 1 0 1 0 0 1 0 0 0 1 1 0 2 9 3 1 0 4 2 3 2 0 6 5 1 5 1 22 10 9 1 3 3 0 0 0 0 0 0 0 0 0 4 GRN 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 1 0 1 0 5 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 1 2 3 0 1 1 3 6 1 0 2 5 4 8 2 4 5 0 1 0 0 0 0 0 0 0 0 CFP 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 7 1 1 1 0 2 0 2 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 3 0 0 1 1 0 3 2 4 0 2 0 1 39 1 3 5 1 0 0 0 0 0 0 0 0 0 1 HSP90AA1 2 0 1 2 3 2 2 1 0 3 0 0 1 0 0 2 4 0 0 1 0 0 0 0 0 0 0 0 3 3 1 4 5 1 1 0 1 0 0 0 0 0 0 2 0 1 0 1 3 0 3 1 0 0 0 1 0 0 1 1 3 1 0 2 64 2 3 1 1 1 0 0 0 0 0 0 0 0 0 0 FUOM 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 LST1 0 0 0 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 3 6 1 4 8 3 5 0 7 13 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 17 8 11 18 13 36 17 12 27 12 7 7 4 8 10 4 2 6 6 0 0 0 0 0 0 0 0 0 7 AIF1 2 0 1 0 0 0 2 1 0 0 0 0 0 0 1 0 0 0 0 1 5 7 6 5 4 3 1 2 10 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 7 12 7 6 32 33 12 19 18 29 6 7 1 3 11 7 9 4 1 4 0 0 0 0 1 0 0 0 0 5 PSAP 0 0 2 0 3 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 6 5 1 5 3 2 1 1 6 4 0 1 2 0 1 0 1 1 0 0 3 1 0 0 1 0 0 1 2 1 8 8 6 2 9 9 10 8 5 10 1 2 1 6 6 4 4 2 2 7 0 0 1 1 1 0 0 0 0 1 YWHAB 0 0 0 1 1 0 0 1 0 1 0 0 2 0 1 0 0 1 1 0 1 0 0 1 2 0 0 1 2 0 2 0 1 1 0 1 0 1 0 2 0 1 1 0 0 1 2 2 1 1 2 2 1 0 50 1 1 1 3 1 5 0 0 0 2 5 4 0 1 3 0 0 0 0 0 0 0 0 0 1 MYO1G 0 0 2 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 2 0 1 0 1 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 3 3 1 27 1 1 0 0 0 0 0 0 2 2 1 2 0 0 0 0 0 0 0 0 0 1 SAT1 0 1 0 0 0 1 1 1 1 2 0 1 0 0 2 5 0 0 0 0 4 15 8 5 4 2 8 2 11 18 3 0 0 0 0 0 1 0 1 1 0 1 3 0 0 0 0 0 2 1 21 25 6 10 26 26 16 15 11 22 10 5 5 16 2 3 16 3 4 5 3 4 2 6 3 17 3 6 4 3 RGS2 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 3 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 2 3 16 0 1 11 3 5 4 6 8 1 1 0 0 0 1 1 1 2 0 0 0 0 0 0 0 0 0 0 SERPINA1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 6 4 0 2 0 0 1 0 3 3 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 3 4 5 5 3 6 1 1 0 3 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 2 IFITM3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 0 0 0 2 4 1 2 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 4 1 11 9 2 5 7 10 0 12 2 1 3 4 4 0 0 1 0 0 0 0 0 0 0 0 0 1 FCGR3A 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 6 2 2 1 0 1 2 1 2 6 2 0 0 0 0 0 1 0 0 0 0 5 1 2 14 4 18 9 5 11 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 LILRA3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 S100A11 2 0 1 2 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 2 10 4 2 2 2 1 6 5 6 6 0 0 0 0 0 1 1 0 0 1 0 0 0 1 1 0 1 0 0 17 13 1 2 9 12 14 8 7 13 5 4 5 3 11 9 9 4 5 2 0 0 0 0 0 0 0 0 0 1 FCER1G 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 6 3 4 6 1 2 4 4 9 8 8 0 3 1 2 5 6 6 1 6 3 0 0 0 0 0 0 0 0 0 12 12 2 4 35 16 24 9 9 30 8 8 3 3 13 8 7 5 8 3 0 0 0 1 0 0 0 1 0 4 TNFRSF1B 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 3 4 1 2 1 1 0 0 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 0 0 IFITM2 3 0 3 3 1 3 3 1 0 3 0 1 2 0 1 0 0 0 2 3 6 4 0 0 1 1 0 1 3 6 8 2 3 5 2 1 5 1 3 2 7 4 2 2 5 1 1 4 1 2 5 10 1 4 17 8 33 8 14 19 4 7 4 3 2 2 0 1 6 4 0 0 0 0 1 1 0 0 0 1 WARS 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 2 2 1 1 0 3 1 1 2 0 0 0 0 0 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 IFI30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 0 1 2 1 6 1 5 6 6 0 3 1 1 3 3 0 1 4 0 0 0 0 0 0 0 0 0 1 MS4A7 0 0 0 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 0 2 4 3 1 0 2 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 C5AR1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 2 1 1 3 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 HCK 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 1 0 3 1 2 3 5 0 1 0 0 1 1 0 0 1 4 0 0 0 0 0 0 0 0 0 1 COTL1 0 0 4 2 1 2 0 1 1 3 0 2 0 0 0 1 0 1 0 0 6 15 2 4 7 3 6 0 4 20 0 1 1 0 0 0 1 0 0 0 1 2 0 0 5 1 0 0 2 0 9 20 9 3 6 9 91 11 18 18 18 2 9 11 12 11 7 5 4 25 1 2 0 3 0 2 3 0 4 7 LGALS9 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 0 0 6 0 0 3 0 3 0 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 CD68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 0 0 0 3 0 1 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 4 1 0 4 3 0 4 2 8 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 1 RP11-290F20.3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 4 0 5 2 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 RHOC 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 2 0 0 1 0 1 3 1 1 2 0 0 0 0 0 0 1 1 0 0 1 6 0 1 1 2 7 2 6 3 2 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 CARD16 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1 1 1 0 0 2 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 2 2 0 2 2 1 0 6 3 6 1 0 0 1 2 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 LRRC25 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 6 4 1 0 2 0 1 1 0 0 0 1 1 0 2 0 0 0 0 0 0 0 0 0 1 COPS6 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 3 0 1 0 0 0 0 0 0 1 0 0 26 0 0 2 2 1 0 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 ADAR 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 2 25 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 PPBP 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43 41 36 55 58 54 66 34 30 6 GPX1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 4 5 3 5 12 1 15 2 3 1 0 1 0 0 0 0 2 0 1 0 0 0 0 1 1 0 1 2 0 0 5 3 0 0 1 1 0 1 1 2 6 7 2 6 24 16 28 3 6 3 18 8 12 18 18 28 11 13 16 9 TPM4 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 2 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 1 1 0 0 0 1 2 1 0 1 1 4 4 2 2 2 15 2 1 3 2 PF4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 14 11 14 18 23 62 9 14 6 0 SDPR 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 11 3 13 8 8 29 3 6 5 2 NRGN 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 1 5 3 3 2 7 3 1 1 2 SPARC 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 3 2 2 3 9 3 3 4 2 GNG11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 9 10 7 23 12 6 11 1 CLU 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 5 8 11 15 6 4 3 5 2 HIST1H2AC 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 3 5 5 2 42 2 1 2 1 NCOA4 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 2 1 1 0 0 1 0 0 0 0 0 8 2 0 12 8 7 3 2 6 0 GP9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 3 2 3 11 6 5 3 0 FERMT3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 2 0 0 0 2 0 0 1 0 0 1 2 5 4 4 1 6 0 4 0 1 ODC1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 2 0 1 0 0 0 3 0 1 2 1 14 2 0 4 1 CD9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 4 4 3 4 3 4 20 5 0 RUFY1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 3 3 2 3 2 9 0 0 1 0 TUBB1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 5 2 14 32 2 0 8 0 TALDO1 1 2 0 0 2 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 1 1 2 3 5 1 2 0 3 2 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 1 0 1 2 0 0 0 2 2 2 1 2 1 0 0 1 3 1 3 1 1 2 2 0 1 2 1 10 37 0 2 3 TREML1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 2 7 4 0 1 3 5 2 NGFRAP1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 2 0 2 3 1 2 4 0 PGRMC1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 0 4 2 6 2 2 0 0 CA2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 3 1 4 1 3 8 0 13 2 0 ITGA2B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 4 2 4 1 4 1 0 0 MYL9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 3 4 8 1 2 0 0 1 TMEM40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 2 1 2 3 0 PARVB 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 4 1 4 0 0 1 0 0 0 PTCRA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 4 0 0 20 2 2 1 0 ACRBP 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 25 0 3 1 1 TSC22D1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 1 0 26 1 0 0 1 VDAC3 0 0 0 1 0 0 1 0 0 1 0 29 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 2 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 41 0 0 2 1 0 1 1 1 GZMB 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 27 2 1 10 8 5 10 7 4 11 3 0 0 0 0 0 6 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 GZMA 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 3 4 10 8 12 10 3 13 1 8 2 1 0 0 0 3 3 2 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 GNLY 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 0 15 3 29 11 22 15 18 18 10 0 0 3 0 0 4 1 3 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 FGFBP2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 5 3 9 2 6 3 6 8 2 5 4 1 0 0 0 2 9 0 3 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 AKR1C3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 1 1 0 1 5 4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CCL4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 5 3 1 0 3 1 1 2 1 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PRF1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 1 4 9 7 10 10 2 4 7 6 13 0 0 0 0 6 0 5 3 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 GZMH 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 5 7 1 0 3 1 0 2 6 0 0 0 0 0 10 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 XBP1 1 0 1 1 2 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 2 2 4 1 0 2 1 3 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 GZMM 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 2 1 1 2 3 2 2 6 2 1 0 0 1 0 3 2 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PTGDR 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 51 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 IGFBP7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 4 0 0 3 0 1 7 4 0 3 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 3 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 TTC38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 KLRD1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 2 2 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ARHGDIA 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 0 1 0 1 25 1 0 0 0 0 0 0 0 0 0 2 0 1 0 0 3 2 1 0 0 1 0 1 1 1 2 4 1 0 0 0 0 0 0 0 1 0 0 0 0 IL2RB 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 1 1 1 0 3 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CLIC3 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 4 0 1 2 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PPP1R18 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 2 0 0 0 0 0 1 0 0 2 2 1 1 1 1 3 0 3 1 0 1 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 CD247 0 1 1 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 1 1 3 0 2 2 0 1 1 2 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ALOX5AP 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 2 1 0 1 0 0 0 0 0 0 0 0 1 0 0 3 0 2 1 1 3 1 2 1 2 0 2 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 XCL2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 2 0 0 0 0 1 2 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 C12orf75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 0 1 0 0 4 2 1 2 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 RARRES3 1 0 0 3 0 1 1 0 1 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 7 3 2 0 1 3 3 5 0 1 0 2 1 1 0 2 2 0 1 1 0 0 0 0 2 0 0 0 0 0 0 1 0 0 2 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 PCMT1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 2 1 0 58 0 0 1 0 2 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 2 0 1 0 0 0 2 0 0 0 4 2 1 0 3 1 0 0 0 0 0 0 0 0 0 0 LAMP1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 3 2 1 2 1 0 1 0 1 0 0 1 2 0 1 0 1 0 0 0 0 0 0 0 3 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 SPON2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 3 5 1 3 0 0 1 2 0 2 3 0 0 0 0 0 3 1 3 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 S100B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Seurat/README.md0000644000176200001440000000260414744462764013020 0ustar liggesusers[![AppVeyor build status](https://ci.appveyor.com/api/projects/status/github/satijalab/seurat?branch=master&svg=true)](https://ci.appveyor.com/project/satijalab/seurat) [![CRAN Version](https://www.r-pkg.org/badges/version/Seurat)](https://cran.r-project.org/package=Seurat) [![CRAN Downloads](https://cranlogs.r-pkg.org/badges/Seurat)](https://cran.r-project.org/package=Seurat) # Seurat v5 Seurat is an R toolkit for single cell genomics, developed and maintained by the Satija Lab at NYGC. We are excited to release Seurat v5! This updates introduces new functionality for spatial, multimodal, and scalable single-cell analysis. Seurat v5 is backwards-compatible with previous versions, so that users will continue to be able to re-run existing workflows. Instructions, documentation, and tutorials can be found at: * https://satijalab.org/seurat Seurat is also hosted on GitHub, you can view and clone the repository at * https://github.com/satijalab/seurat Seurat has been successfully installed on Mac OS X, Linux, and Windows, using the devtools package to install directly from GitHub Improvements and new features will be added on a regular basis, please post on the [github page](https://github.com/satijalab/seurat) with any questions or if you would like to contribute For a version history/changelog, please see the [NEWS file](https://github.com/satijalab/seurat/blob/master/NEWS.md). Seurat/build/0000755000176200001440000000000014744474101012622 5ustar liggesusersSeurat/build/Seurat.pdf0000644000176200001440000237602514744474101014577 0ustar liggesusers%PDF-1.5 %ÐÔÅØ 2 0 obj << /Type /ObjStm /N 100 /First 828 /Length 1775 /Filter /FlateDecode >> stream xÚµXMoÛ8½ûWð¸=¬+ê[@Q ±ƒ´‡´ —^‰‘ÕÊ’AQmÚ_¿o”– ½¢?²ÝCF#Í{œ7Í™Ç"&,fÜOYÆxâ3î1?NXàa$dAæá, ðVÊ¢Ðg>gQæÍ|ŸÅIÌüˆ%ø‡³Ô ™Ÿ±4Œð-Ë0,Kà"„[¸ Æyˆ+üûqÌBîÍàÃxŽp<*âx( †xìƒl€kŒ+ü%àÁ_’âþRP‰á/ó£Y ŽœÄ®iÈås8‰3\Á#Á ? ˜€;(ú!œ& fÃ9Kh: •rŠE4Ká/ÿþR¼ŸÂ_†É¦ð—4MÍÃt3 ød˜²OÏ ® “¥ˆ¾ãÇM̸ç#(…± # ;¢Qàõ ¦ÐC‰ ¦à“ BÉIÔÇWÐ#H1;§AFá‚&A–†3UB]B i:¦‘Œ…>Ô ƒDXHçP(ŒH}HÆã;)nR¼‘ÂÄOf “ŒFà9%Ð$ HaA¬È'>P+ ’yB~h‹•cJQä*ãÊqHŘÇOÂCw$‡jQÓ<§1襄žR†þŒãƒØ£ÈCºØ£¼I)M8½“á&Ä>ˆÉpÈ“lúÅ>aAÀ8 ,L;Æ´â¸ÉÂÙ›7ìõš½¾îî:özÉþZ=´óµd®æ«2ï7ó]^|Í+1ç¯ØÛ·³¿>IŒ¿ä³çyk2‚Ì@F’ÉÉ(2“Ù鱂ÌWýXß¾šÄ¿(Ë‹ŸõvP›•è‡FõSàdJmÆÇŸdj2[Íjä²!³Òt{ýßF¿Ò;¹ÜtåЈuÑIq‘2~4(B‡¬Ð¯ÈCQ¨*)ª\‰«Ç}_w­¾ÒFj¨Ê–c»"ó¨…‘vDz¾‘\ëàÕ›N®Åï)š¼w+Ôê oìY›ä1ÙRè`冔‹EÛ)ç‰ÍüVC«‰ æéÀÏûùB4Í2W9…bÞLaNf¡ñm–6›|/.Nä_ ô<‡WëŸçX·U#ˆ"òWÈz+Ú“YÖZ‘Ê^>S÷rZèÉ™B ´?7ß~—Ë^ÌßEײv'0ííú&õ˜Ð¯¼#‘¹Ö¯tZ#³û>ÿqÒÚ2‹vdðãEëh¨H™Û¦SNœA+±M2·¬;á‹Au·]ݪuýSFRÚ×­¾«mL“%?UÐoBbë:¡~~³3çÙõ§ªæe.‹®ïÛ‡F \zWÈ/í”*ìýdÄ}¯£ñ`¯BGè!Mò4¥.¯ïÄ£ZtM'ôÆt¾Ó°v¡½éÀiÐY\´å§M­„©™h LÁCòIWíÚv¦¬Ëj,JýJPV õsåÈŒK»’”vRL•¢Þn3¦²eoñäS‚â¾Bж'lÀ‡'`x>ØÙ/ìýPüÝúr¨›rÑ ½òN ·ÜƒfÛhÊ ý8heS¾³É‹,>ÔÅF<ÕØsH|Ðc¦IÎJ<¿È›âVH5Èûu]MÁ/´‹FCÝÚSUö~o—ÃÊ<4h—þ]†N¥1ØjþŸzåšG/nrUl³6+íÆ&ü¤Ý´ï¢˜W¢“)´™Û‹¨5«ûˆ×aW"þå'¯ì¥ú¿ƒ./å„"¥~Ï'ã‘ád2GTï[%*é,… m.l=•}ÜgÖ4ªÄ‹ÅÓé £{¯Ð.t¿S?_=ë&Ý,а.îpÒÍ©özÖ…®C7+ q#¯‹\¡,ž kfhâü¬À´ä»ó€„k½ÚÙÑ;4ù®WÛ{Q–õã šZHw­élè\§wo7a[]ò„}êÞ;1|´›ÉF¿"Žë~s_ïDQ‹ÞôŽ(;²~ü/3XÛg”Â&ÕŸßiN8“ðÎùurYo×»¦V'ÌÆ,£¥}¦2³1ÑU.Ìí}Ý jx¤€Ñ·¶Kß~ëz¨âv­’yÿ»;RÑÉΊÛÙ¥LÚ{ˆiv”½ë›°¸öz)Pîø«$yŒÎ{•|11Víá¿( Fv¨xc#ôñþ *ÃùìöêžóLúQ«úe¯’8Ø¡Oì¶ËºW9]'¯½nÐ$ÉÔÞn´Ÿ5µÓÈË+ÑJ4ˆ+×ál©W©Ù›åDk¸:ý¼µ¬…úõƒŽ °¶»o÷/9.„í;è½Íw‡¶ú7‹=µ·¦¤9F̸?5&Û•(‡âØ gÏùÊޭɹçä^!…·y#Ôôét/É {¥(»råö6ªŽS—Ý1Áº—kÕ©ƒZugþ²sÕÜwß]¯´‹{íçû¾w7"ožÍVyc‡¢uú[/Oð6®°å«Ù?˜{Ló endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 878 /Length 1546 /Filter /FlateDecode >> stream xÚ½YMsÚ:Ýó+´|]¼Ô¶>lÏt:CÉé$m&0]u#@OMmÓ$ÿþKS¹âa°)é²,Ë÷œ{t%AàÌc§縅,,ð=æûxô}æGôŒ‹£—/ÑKá1¾é3!ÐLD~/8“*À³bÊÃ÷AÈTôóÛ0¸û,RÀ‹Dˆ»dqá±8B.>*‘ê‚3ŸÃ| *ÊG%d¾àh‘ )°”1hHÁ|Å©E2?TÔ¡AÂr¤`ôüؽ@‘»D^Q%$ñ’K> Bàq…ÏÉYáÁr/a…d”bA ø.Ž€<‰<ô‰ð:â°ÑE4è˘ÃrL¡‰ãÅ Flý€Z\_Áj3N\ða÷¢GL9ž“\‚Ó«q ɸâdÇ6’ZÐhpR-RÔË1¼à¤›G¯H8O„=å„hqH'Âv@„ŒŠ dj“U($„€à Iv  ð”#úB’ˆˆPÂïÑ—"„^ ŠåPPDxÏ¡ ˆ"´@AKjå˜"¥G~“ôªÄL ((h@AI_pø&yŒ>PP èÀ5)EÂLjܴ&Cè…Ø0”… ‚2¼@?åªÇ¡ ò‰3(€CA@Ä•v  ¢/8L@ªHTÈw\J ê3¥ÈKðV Ñ{÷޽±·Wù8goÏÙ?÷ÙÙÅÓê‹.Îü7ìýûÞ?_y¨p…_¡ÏOT¬¨øB…¦¢x³ÓÒ¥.«ûüq4Õ©ÙeïÒ(©¨¨¸§"§â‘ŠSÛ/¥ÂìA»ô¯³ÊÌ ]%yÖ ôŽŠ}*®©ÈlCÅ|ã¬5°y‘XÂY/£«uaîÒ¼jäc\›k‹c,³ÔâT{qíª2Å‘P[ñ®\ÿ›t6ÕtqoÊd¶Öi¹¹² ycÕØsfyÕš— ÈI _Gi23#ó½9±v~óź›ºÈu6µïMÈÙ¬Ÿ¦·ºøfŠr?rfm÷-Þ¦¸­gß\re3ò‡"™ÍÍo#½ŸMy{,Hí÷Ü¢1ô­s™«oÞÞ›q¡³òÁ'ueìÒÎìH{pc}4÷Aº.«#``Å_»9¨•îƒ<+MñÃÌ:Ž»«Téþ°³?•ÇÇ¿=â:†ïèˆÜ®Ó*¹Íg:ýd’ùb’wÄ\»‰+±/rۯΑŸ,­ÄÆo’Ië¸tfyÌÑ #F§é3v‰ž¤æe!kÍadw$[E»ÙöykÓâö›Ôû‹–kå>ŸÖ“—ÄÐɉµ%r M4#™E_=O+î_Ð+Ogƒ…ÎæÍ{ÔÜbÕÙták¾ggzeª~Yêç]ö¯ÜQß¾´öŸ­^/5XïÛþl™ßäÙ¥µ\¯“g¶".uò?וnK¦{Ò?wßêFF¿v¤-¨´Ù†6⌓²\›Až³$ÓÆvEƯV}m»Ôëv=Éfî,ÑnËÓ¨ù+Üf–LIÔ²­3-²È;1k¦M¢7ÌÝ«B¯g÷3].Φ©.›IÖ¬Vvöþk!S÷P؈–¯Wƒ¼(LÚx¼¬Ár+åÊ•²p½O;ž'·Y4,Oɤý)t¨‹ež=8„ݬ¾t‘žOzþæ?Lq“ãXœ\rw¼Á¸±/¶Äùž5x8þ|n–ë§F¤Íùl™±þozj´:Ĺԫv‡;–Â:篾\^gùÙh0n\«†vA¾tz°Q©3ÏÀ’ê°¦]ø±äú¤¿˜l–Ïód¹m×jynÞ²#Zÿv!žÎç—‰išé¶óδ_‹-æÅrbfX$çå#_ØHMÜudkyœïÉç–×~n8 vâtSïV'Äÿ—G¦:´˜½ÊIyä.ã]×Åí­ß븰=ÖŽbúrØ<4é[)Ë/ømÒ@ 'Ë õôÛ¨*ôã.6-ÀÔþú1²xµhl·­±N5",»&-:1jí<ɪÃÿT|´vwƼÖ?7Á`ÐßÅd“Ø‹úúMï?¥Y«Î endstream endobj 404 0 obj << /Type /ObjStm /N 100 /First 877 /Length 1673 /Filter /FlateDecode >> stream xÚ­XËrÛ: Ýû+´¼]ÜTI=f:q&ÍLœqm§Í¢Ùb5²äè‘Iúõ÷@M¡ÊcÊJs¡ŠÂp@”´…e[Òö-áâ'°¼À’Žc96ýº–Hü*ËuñØñ,7 õ»ñëÒ›xî KJw$]i)zÏõ-¥hâ$ž bñ? |OáWY¥ð¬ ¤ç¡b”¶†XÇ;Ž-äHJ‰Iˆ7¤o9Ž ˜“0´¤‚Ž®˜‚’¦…‰„šÊÃ$ÀfZŽ$Å=Bò Y¹ÁHz¬|¼åA²G†ÀpÇ·¡…É>T’>™o݇䀰|Hè-ü9¡ƒ•’Ã+ÀsmáŒ$ uV>&PJÂep$‡&&C×rEH+ð,¹G†p­"ŸÀ6—œ§lÛr=xJ!×ó‚‘‚«]–Ò>×—ªq¶@gÆÜ@Ò’C +â,ºiÂvéX³á k…PÞ„ãC2ˆ¡ æ„h–$ÿòŸyBÁë : E›AŸðΈS Pøð„ƒ"pÝ‘ƒ‚8V`P„`GAiƒ’%mzKQhIZkxKAÙè¥ð47Ê£ ðÅHAIÈ Jf…®'  ‚W<ƒ’"N‘ÓV`h€Äb(± *ÞR¤·íAg0¨X,·yù9$ûI 0¨D@+Ь¥‰GAa!éG„– AÊ…£w﬷ ëíy¾Ì­·§Ö?óïÙÉ¥{šlOœ7Öû÷£¾ ßßÿͶíK\NiHhؾ9,#Zét’Öe¥‹Ò(+¢aEƒ¦!¥aÂ³š†’†Š·ÍZæ,O²êeˆ3r¶(cDŽ~ÐE´Ñ‹u^h#R#ÿ¡«xƒ¾áµ kFo¶hf’Ýéx–æ=¶µÚß1D̦ŒÓk[ÅŽ}s2¯Ó“Å.ª’(5âålRƒâÐ`ÓpCÃ7Gøl䎷V¬ióojVcœeùÓEëÇ¡ŒÙ?}¢á‚×böÌ£yRI¾ÐúNC¡'°˜³ùš‡–™ÂŒ¿XŽçÛh7»X²æÍ±ä-;3ÎÎ’z;æ†UÏØÄº/äë(]TE½®ú!Öm4°9»²æ-• gs•Û(M~ê~ æä]uÏÛ¶ ÞXõ³ï æ›/Óùœ/4LBKšF»]’mŒYdÚRÈC{Ä7/L @û\ëâiÒgv{›¹žKÝêb£O“å¸,£ƒ²·]9mò;a&Ýø-yˆz§ºŠÎtTÕ=ÎÓI¤3^k3Q}ÔoI6-!­M’A7ô.’u¿¼ÇTïÔf™µ­\G;ý >2ä’=À²{w øé€ßŽæ—ßø—§ã×`_r·16àä1N~õôU'›[Çy•·'ë4*K#nÎ9mïàW\1¾² SpÛOþeSUö”Öéõåò¢Ô÷§z[›êš­^rå*Y™{v‡fꞘ»"¯¬òâ˜[®L殺Éå¥6_]QËbD¼:Ô˜$Uùyínû…U,ç¼Ûu5!uký»|œFUd”?¤f0=íI‰cÎ&ãE²9×™>HÈŒã˜ódKÍy·ëfºX묯òmjóóº+¹b Ú@xèÉ–ÏhhŽŸsóBW‰º×+IÞÝVËC‹Ïw’e¡ÍîØk•ÜH–]M´‚_VƪH=oíÙ¾za'0ËÓ'\ðL³½ ¥œ ÿ¸î ?±„ó/Á@ô@üBÇɺ2v&³®Ð¸­¨ÝÈÖmúC‘Ä=×ßu¡³µ€Û^ÚµÝwœg߻ў uÿÐÔP•©v´“> stream xÚÍXMÓ:Ý÷Wx ‹7ÄñW"!¤ÒT4¥)ˆÓšNiš”&…~ý;Ž„ƒGãÔ3 ½·¨k»î9çÞsã8‘ ' ‘IF„ÂWNhƉ¤)I™À7#Œçø–„ev¬ç”È4!\aœR"R;æDÈt$SÌq†qFd–â;'J`ÌR¢rŒ#™´cIòÄŽÉÆÖ‚s‘ÒÇ2¯à 6 pþc ä6I r¹RXy—ðñÜfòe¬à H \ÁA‘( ÃAAþÍ  xÐÕ±`ð]!ÂV‚U‚ÛôBˆ=ƒƒB@oqa(tì¢ØèéSò¤ O^Õ‹š<9'æ_ª³¹Ñ+š|<›˳ý¡þlºÞδz¥[}F“gÏF>!wø¨OI’Ìmcl£m³² µMb›¶ùDY·to›ƒmjÛ|vÿüµ`çfZP÷sOê.–º4/õ²­Í*.l³tKK÷Ï—nné¤Õ.¼&,r¼­o¢ó8¶ÍÖaßœHÀe{‹|éT_‡ñÞèªnÚæZǾqÃÊ©nU—›ûufžéCcžoêXÞ™e·ä¹£¬ÃlE¹Y™Â|‹e+\-lÜœq?t½ol‹ñ¼©Ëú^l Ws`íd ÄöaÓš¦YšX¶.¬ÖýÚ¸¦+v3ÄösmªûsýìêÁ-©B ëC}ÜOW¦jO\Ùk«9ºígê;V¹Hƒ×l©ÛÍw3©'IK«ê"ûî~øj"˜+½3S–ÍY1YŒ›Fß óWŽç³öêJg噫­‰_`½ÛÔM@Ýfµ6³²nƒ’úk£7vÖ—l~{6O«n#õu¸œfNýØY[ù¥Û×Á-_ê¡:;V“É8HÛÛ7é‘^ôþêBïK½Üè*ô•/¹«Ú+Û\øs¥ Úô[oPË4*ªiDTç1HâóH›o fîØuÃñ^êÃöƒ> ÜGzøKÿ²u”öo]u˜msÝ,õÞÄ’up×þÞÚÛkÂ<õAWÍ4–¦öë©r„Ó Ã,ªNfuR\1B gp1¬¬ˆ“VÄê[o^Dà-hwÂyÄ{9žEà½wît;×ìn¼Bïö¥yyg ³ßûçÓž`ÂþnÆUUßL«•¹&èïacAåŸJû½·¿.'Ëîx~xš¸Ï£Nýÿîy¾XÖóZ/·E{Ð?†ùz°ŽïµÏ·u‹[ÿjý`þu˜¯tsu¶,uŽ÷ÄýÝ6ÿ8%ý]¥Š|²°{Зú°‹ ½kóùâ'eä™›æX¶1ÑÍýëÑ…3tÊ*Li–ío§—F·Çƒ ¿rúzyÀùÕžñ—ýj¹¯vñ¿o1\þ+ܪ‡ÿÀßÍÜâÌŸ&>r?4í»£®ÚMi"¤¼s¡j_Ô¦Ïxˆçˆ £v#ãç³áÞ{PÇ9©w;]­þŒº4Û¹Fûw´‡©[\™¹¿ž…;ó›þi.À³5íòj°Ö¶¾ËKYC¿ÞŽÄ¤øÄ[‘erËI—Ó^›( û;.œþv?õîŸM¨+ô !%îi¸Ø—›öíç¯Ø(‡yJÿÕÍ[÷Žõë­½2À³Ïwz•â[¯£vþ£ËP&ÿ/4° endstream endobj 886 0 obj << /Length 1274 /Filter /FlateDecode >> stream xÚ­WMsã6 ½çWèVyjÓ%êc§Ý™d“M“Én;¶ÛKÛi‰¶™È’—¤Òæß)'rd'»Ó“`’ð@ÆÞÊÃÞå >ð=[œL?FG0ŠcB½ÅÒ#$FièÑ$E M¼Eáýîÿ2"™ÏòQˆýûqÅG“FþßsÞH¦¿ý¹¸CÄ ”QJŒ¡¢$¢Þ„D(N©5tͪIü†ÉG0@bŸ„c'`2š>5–vðÀ$ö2”Å$6'AL! Šgó·Qû\*QW{ÊaòL9"(8Ø*QDPpô.w~P”ÕZ]òc— á í.YŒÒЯGð¸.øFþ²–Fý¹¨V%·ò^–VºäU½¹: ÍÝÒƒvÎU.ÅV¿ #à ¨¶ŸZŠix•OŒ?à‹Å[Ì iOL3äÒ/ìÓiÔ1á´ ”ÄIwÀæñ€’"¥Çìħ;;LlÔS8[ï+vkŒüFAžö·EÁmÅòq/nÂnp¹•Ü1¢êFæÜ¥RÆ5‡3õŠW܆j’d(€@õHNÁ˜»b)ëÍ1 ´d•M'“ŒvmÙj$ß8¸jGzamîr¨WOg¸&qÀw·`±lÛ|ãêERôw´0 ML#Yî[qÎÝîòìŽYy6¶ßæ2)wŠ×n^[Å¥¶?ÎÝ"w¿™;ü¦˜à€Â70+©ÿƒ}aȰŽ= ͉³Ë@ZÔæ­¼ 0 p˜NÛxܚ⦬‡AFz/4Þ­áO°Ï½Ïkuoì¸ _¸7vœØ•SÇGçû’Ü©.{˜£·ï‘YyÝ#ëNOï!}xaÆ#Œ27Ï5”zwûÂ!X5¥BÇ[H×L ±Z7"ç•:ÚÞ¢Q²ë¡Ÿ®–Ñï»´ £®ÒÝ\}¸ø NÎMÞ_o´ÖèX‰c7pü:»éé Ç,EýæK’]É_k½Uï¦SÕ>ˆ’Ý¢Z®¦jWçù„Š’¸33>ÂåÞý½FÐ]¿zÝÜ¢¼Þ> stream xÚ}TË’Ó0¼ç+|´«ÖZù{}€ª$û`¡TŠpÅÈ’‘”Êæï‘/K6c.~õôxfÔÓØk<ì=LæëÉõ}’{*²8óÖ[/Â%iæåQ„²¤ðÖï›?Öï'x yqŠ œ{aœ[Zr a"ÝîÊڠв‹ét€¯ˆüÔRpf(~ J”­ ÂøÆ—NÍ)ÛP؈ŠèWi²!„mi}¬9üÞ:²¡Ú€ðÇYYÂ1Š=a’$þw<Åo߸çÔÐ4ÄöC²ÚžUb4XkËûòR;bjWêÎ]AœûRý‚#+Òuüc\~¼,Û( "¼òN4ðw%EµV`?«Ùr ÒV®‹…äRÍ=¸ªàÀºë )c”Ûz]¹Aù£Ô™Òe?žx/9ÛÑÍhÃŽýnY~AE «÷œXrŠ“‘qõ}Z¬`°ìz±ÓÚ(2N7ZÀZÖ5áTAÆPÕJE¡iÚQÆ—“Èž¹¶¡·Rµ—\ŒRQïX¿œ°µÕ´¶»€è“Õ¥¢ÿj¨láˆÑu2¬ªFöÞ ¾Âáyí C†ýsž‰*BQ¿EgŽy}Ÿâ<6ük 1ÂYtJ\î›ÆÚ~E<3çÔ.N,Ò3È —S.YQdçÕ¥zýÀ^æL^Úæ Ög¯¨ ŠÕV"ð@柔sø6ÄdÈØ!ÜÞ•ôw C”“Óâº73¥ˆó> stream xÚ•—KoÛF€ïþ¼UªÉrß<¤@’ÚF‹¸5—¤(Xj-oM‘¹2lýúΊT*RK9¼Ø’wf¿yîŒI´ŽHt{õ~yõ憩(…TR-ï#A$$T’€di´\E_g,þkùû锢9Ó h!£9U¨ÈZ¡u±¹Í6Ÿbªg•ýÙk ô¯I…è$ÖuÖ¸:xöÕ›ªôÊ/áóÕ½kþ¶Èʵiúg²=+ìf“µîÞ}^6ÆeÛð‰}vU<÷þMX¢*[¼0A{¶µi\Ô­›§Uð`;gG€‹{ ( ßçê,÷ñ|,²CXcªf&ÂÏüK¬ÙÌ䮪Ãlîã9clöòË[ÿ™Ï @ðIøN[® óÁÅõóöSÛ8Áø–ÞVÚa¾j»7«¥ƒ†ÑpP÷…¿x½Ûww½ò}sÃÉIÁÏ)‡”(TT i§øÑ–hÿ2Nå¬h÷ÛEWOÚtäÛíyœ M] ‡^ìÚ®MyòýS]­±8š‹¦v´ÖTÞ2ßïl±ºËʘÑÙ.+.+SÐôh««wæ"¬•î…åºÌ±¾´Âà\ >œQ.oæú²c­|ϱÙþå×Ìe9“ýõÒ=•Ûó &ãÊ™K,EA}„)`@/Ò:ùžOª¢ÈÎ0èùÿzœ€LÔó“BAIuZrÇ^©j×À¢ÕèÝ)pÁzwFs- eý~y•VóK ýdÈ ˜šÈ”`óça çÀu: pÔO¥Ó‡ëUL^쇠rv‡ebèŽBèDžlƒýi÷™³UN)ô€åsGÅDVÞŽÒ'ÿÔ֔¹  z˜,4ƒL®°Qƒš—Ãø1Ô©ñ[Ùo„1SwÓÀfÅßXŒþÍ‹'î1@˜À¤jÂ&Óq ybk³Úå£YLŒ©3*ýŠO,NÛújpqå ,3œ$@¿Ó~ÔÇý~ΡïÞa³Q — D¸()ðäÌ!‰žênlMžu‹DøÁ)¶·¿$™Èªþ‰çBÎþ5¸ãä#o#¾íZiœá¢=•†u¿­»]ÓwÀÈë%5ÎU:ª8nøÓ*ñNžBoèQÓéÔYSùZ9Œæ±ˆa™p )Z&Íãát‡uùat`K©ä|°¦'òŽÑp£IPtø^ùtò öÿ2XgÍHúÕ¤ïÊ÷uäøûzyõ9¥e7 endstream endobj 955 0 obj << /Length 1277 /Filter /FlateDecode >> stream xÚí›]o›H†ïó+¸„ (Ã0\&$M»R·‘m©ݽ˜â)aƒ5 «¤¿~ÏΗ´í‰íhÛ 6X2z|xç=Ò Ë“³ÕÉ›·4q² ãwV_†¹“pš9«µóÙ½?W¿½yË£_¤Id,†Ó _ÉÛÆ‹RWËqÓ™#NÂé2phìØœ82Çú»ƒý(ÒûSÐÐÕq¥ç>‘éLOn’&Agp4 Ò(^Ê^ íoEanào1W”pž$ÜÀóYšMœe>½üæg¸ÞÃ_"„÷0He>Ž»‹Ëç³ObÂÝôÉwÇ-¼ù AŸ¾ëõé·jcöz}½]_Ã姉E¬QX3 JÂïc%¸~h=ßìôµ\­‚æ ùÂìÿeLP¡[–J–BË‹›­’]WâøŒF¯ùéß(Emµ½nÕRj¿¨E*ÓÔº@}|=$åÄ%1ŽrÓjˆÚ{Ú†òUáÄëAÌPÊ+º —u}.´€0öü,Œ_3¾£æ˜À£={Ê9š×°}XVMYKƒÖ±Á-HðÌÊxæ v6ƃ'à£}ů9tñd$Ùn+T'ƒwìRµ= M¢Ô=Ý—*.]è:aV­Û=ÈBbOîuTÞ.èËÍ”…_Õ-¨@BØLú¨¤w u{e8·Õˆ{Y}ƒt-zîÍY¿ðE!®î@qÿ1¤¥å£.ă$ãÑ…ÐIï™PÅTzï›?BÊd¡h›Î8‹«Ú샜0Æ,P|ðF(U>»\y)uåÎÛºU¦ª“ÌËàóH£JgõT>mÖŸ®+ ŠLYl9j(.ÃS\ȯRɦ+hab}CbàÈqÚÚWõ:¯ûNK5¨¬’¦l§óãþ£ÇUrøþ^ÅGy—Ðíâö%ÏFŒÊ’sQW£µÕ½ú²¬Jà4²•îËAîk¡åÎë&îÚX[S=»·¼ƒßå³4^)®[™‹N~zÔÏÏbnyÏgÏ%Ž¢—E”²‘©HRË{Gi¼Ñè9؃~,³¯A;@+Ñ`' Iæùi˜Z@/ (´y~ú~š*Õ”7PÎ}7$dŠSiHÑòÛb%©šÒTʬímâá¢\ñþË|µ›Ø‘5èB¸gwÃ*¾ –ï²’:ã/R[»²NѬe öw(M6Û‰}*íסËÛºÛN^ ”_Æþz úü±×u%ÍxÿŽ¡þ%£#6Fµ+v —ÓDQg6t*îC ¨êîà˜µöŸuÌ4&Hn­:¯6Ëm]i³^‘tnS"ãŒm;>ÕU#MûÝTsùœ¤=“tŒÒÑbúÏöõµlÕ-'ºù04ªM‘+ io¯ßIjÍ+ÿýÊs> stream xÚ½š]S9†ïý+t™\ŒZG_[ÔT2즊J’ÚÝ ¶é€'ƦÜf*̯ß÷4Bn'ÐI ÍR¨_=’NÓ&*'”ˆ* ²"j%´%ÔVèP“°&¢Âz¾áZ4Z3¨p¸Î…Q4^xno’ðí¬j5£Å³”P“H†ÏƒHú6 ­ -´6ÜÊm %‡ïG‘<˜¸3h›œˆ”=€é,n9ÚC,º€ƒÈm <Úx(óx¢‡rLPöPNÖ"n¥¹MÂTcP8H¸¬0š1áÀó-‡ƒ€§l@§!ãxd€ ˜Ç ƒË£•°ŠÀ5&Pa¤Ñk¡£ÖaLócƒâ6˜Üèù ›4”cÂã§œ ¥p%ñÄ3JJ 2XŽ˜0¸¤,–ž@@愈 ˜0-äˆoiá&*)óÜ&g ‘@àÈ*('¬!9aÁœÇ$$§x)™É%Ì_Â``8 œc;q"xÌM‚Q…ˆG“ "$¬ybSÑà`‹PfCc#IVÃP0µ‰ÍÂ*µ+„µHlؼ2X{žèX$qî&°Úa¢GÉ&ž>4$ŦÚ^)bJL4%Bxc´R0>ÓÊ`â›­²¸“ØnÁZÁ(æ G­½“íí‰êXTÿ\ž,EõZ¼x÷i!›ëIS¯åþbz±\ãH¿¿þ:zñ‡ á¥TÃÅ5“rZs±æBr±ÏÅ‚‹)\,¹Xqq¼yâå½Ç-Å«›WãÕtyV¿Y|š×Óõl¹hîã9îåyÅÅM9Ši:+O¼)ÜŸ¸˜—Ó¢7+µíšûGp²¼:¨çó{yOŠÂ¥“y)V=¬ÇëëUý#‡Ex\è¯Ëðëþ~~¯gç“åêG:ú½èµ“s^–|²½îõ¶/šOõjctïÎÆÍ…œÎÇÍÃݯÊÀeÕ?ÕOY!¿”vó¢ÜüõëñzüÈ×Û 4îïíøs½ž^'õüQSÓþóö l&é¨L¶ó¹x¿¸åúírRŸÍç÷²½/Dý½ÿÆÅåvïg¥˜•ó>¢«³ñº>>8ÙošñÍÃ8WEw³uA<(Sº¿1‡Òøæûýß\N–ó£Y³Þàf{*–e!ŽÊT4=~ôÃx5OæuvoçË{A>l;ÆÙöêoœà8”·å‰e׬™]_~Ðß{Ñ?lrV:¼,wõ.ïnîße‘½½QursU‹êíø¼UËź^¬„Lž[Žªwu³¼^Më¦ KÛKÿ®ÏfãWË/â£Â01$s:‚Ä Ï"FÍî/KH}lƒgî–cçÛ:æ:ÝÖQåZçÚäÚæšÚút´…ÜêªWËÕY½jYÔiõ¯êMu€Äÿ§L?]‹6&éÈ’³q§ h$2òNúˆV~ÖP¬Žf‹ÏÕþÞ^«_í·ñOu\½÷†ÿ^\¬×WÍ?ªêl9“ËÕy¥•DЫÅd-­Næ%èvTNÇñZ†À=IB¸zËëI¨}õ§œ"4’H{œDWx‡vg5*J›L’m†hw’្5µ¬VïÎJœ½fV¯Œ Èž‚°•Q†©¥6ÒZ$…@Õ&JtÈÂ69Aj)+›`džµ¯gŽçãIKÜÔ׫ñú«Hê6e½Å#§¤Cж3Þùl}q=‘Óåå†ôÑ”Èq¥CÆe½•& N¶QÐ«àŸ”²š5ÍuÝÔ9yÛØÃ"=òøÝb¼u"ùIå-“øƒŒ¾;Q81ùÄò‡{wÇ þÞ”O'·ýB¼z»ZN‘maK¬Þ¾>ÕIýeýõ®öõFœÒ7q ?µwæ Å›ÜÍlm3ꇓ}=þpµÛpø#Ø gkÝv›sߌÍÙc&þxÇ,üíî¶¹Ž¹¾ø»ÝmÛk“k›kʵËuÖÓYOg=õLÖ3YÏd=“õLÖ3YÏd=“õLÖ3YÏf=›õlÖ³YÏf=›õlÖ³YÏf=›õ(ëQÖ£¬GY²e=Êz”õ(ëQÖsYÏéž3û9Ñ:ºû]§nOî\§SpæüÝÔ+ɬ¶R!€öˆHŒåh_|Ý_Áœdlƒû'bÐpÓ` (ÙÎ ƒ Ø{´ÂzÉk_ È!hîƒÐ@À9¤Ð°VZ×a€àÎuÂhi“ë  P+˜|P‰SŽ÷ôy™J—‚¤Ðá€jl":éôsC Õ¡¬tŽz ÂH7î@xÍ[iÄÎÊ!5ãßï(!@ëcH0 ]ÄöUöúðÜ :H»Ù7œáLÆ>Ì`ðÙù7¶á€:¸gf Dè¤:‹ë!õA˜ ¢–D‚㊶b€}ƒ?f ã W ¦b€}ƒ;¸Î»ÁßÐrö@ °obçãŽ+¹>ˆ\6!vðªÇ•ÒsCÎÌ;VIeû pÙx=¥¥ úy!,b‡`6ΊڼÂà¬,b‡à76§>ˆ‚\‹Ø!ªD4Ø¡ú ð˜±C¤DPpŠÏÌ€ØÇ( ."ïéaÀió×qN‘ y,zÃNÂ"vH¾Ã`Iö…úv€ØÒj’JuŒ‘6¦ˆ!|„2RÑ&¸´ZI2}vüQõ.šâÚ¤(±µ? A8*¢Ô0›¿=;Õ1€£2.Úw IG±b'a!ní@xþm°b€¨Êi?´§¤7}DU±ƒ‰¥÷}ø*ƒØÁš„ñü‹Ý3C v°¾ç¨b©;Úd€†»Œ}xLØh¡á¼bßêpV±ÅœWô=_íÜÎJ#xp¦ç•TÄÎJ#zàd(p^‰ú ŠŸø?W±pW endstream endobj 1050 0 obj << /Length 1118 /Filter /FlateDecode >> stream xÚí›KoÛF…÷þ\Š *óâ<–Žü‹¸5,!› ‹±8–‰R¢JRmüï;CÒeÙÉ¥*9Ó$Rø|æÌ™{¯Q° Ppyòq~òá‚“@'<˜ß¡1e<9UÁ< ¾Œ&ù:$rT™æFxT†_ç¿}¸ ¢óY†øXpjï\*vo9Aí£‚ˆr9V˜ö#´yÓyvFö¦¹»ó?7YnïÎÃ(Fè­.L©7~Â<¯KÙŸh,ƒÂ½l~½µŒ¿D óQ¬ž½·ý   ÂdŒEKþÛæÚèuI‡Šô(¸9âž…n ŽdïçýçPÒ‘.ÂH!îMåà1üEM½¬nwŸ-tfì£bá—€‚Ó#N~L?Ã}39½jwìe¡«4w./ØÄ 0 Øèj[˜&špF½EÄ›öämÍ¢ªŒslJ¾9Â}BÀ!W g·¦L“­ÎJ—ÕÀwA¸š%tšYϲ413ó—ûª>fôã,lãK×Éi–]ëâO'jSX5³˜ù ¤ sòÇ"M–æY¶8]7V’;ìò«Óû­`ýÀÍóz]Þ›b‡—ïÌàÚ‹¡'Ù¶¬ê¥­bìëCý(s0å|]šâïÚF“ÆPEc¨”S_õé •P¤?²K!å{Þ¥À4%|£ßÙå•$¾€Ó4…êöz›Uéu^—çýnÒ–Î\Í^Œò¢éD ‘CUP¨–¢C(GmÛ£1Q¾µ­ôlcÝVgÙc[úMõ]f¬€;%·©Åò ‡V6€Ùö® ]î8%¼F‡­WÏŒqNÝW®]¾œºëÞ.zÖYôÔƒ]ºÌÊ#®æY2yÐ륱GWÄ| ³?oayƒŒøÒT§e©7<†‘Œ}wþ¿‰œ¡_­ôÒŒ¿oů_×ú_`Ý= ŸéJ» ¬|uöuŸ@¶O½7A{cèÛio`KPÀ°´çiYnÍ$oÏqIºÖ•)»Ž«‰TEÚͼ7…IÒ…ó—Êü²ß!ŠAqì²Ð›‡h‘éÒµbêCØa°1 v¾ÝLò¢0Y;UC%ö™ëgáà0¸ÍÀäÂ7rº,AsKS]¬š™íÇýA0$‡£Õãm7þi=ÊØôÇŠOÍæ¿Ð•+…sÂýPXOÛu§ó?ÎÌÊ!ß~³_ƒJ_px[ÚS£«•ÞØíù1é¾>:­M?_\­ïóñlRçáN…‡€;ÂïGó=肺îW{s»Dbï͇ìêjÙYºjh+¡^~8_ÜÜÊ:ÄÍÿàÕê¶/rJ¥Ÿ‚úk:ˆt³i ”ŒûƒuϰAXoÖç«ïƒ&IÒõÒ•…ó¶ü‚”Eo¼ŸÚˆñ4Ðóxཤ¸U_Ü;“~3S=ÕèW¯µQØ¬ß ¢'†”a/Ò}‘RPÅøªŒ: ­ x8‚â>l÷Δ _}Ý^†ûüz>?ùB8ó endstream endobj 1140 0 obj << /Length 1166 /Filter /FlateDecode >> stream xÚí›]sÚF…ïý+t‰.D´»Ú]¨]gŒ‡"Úf&ÓélÄFQ]Dj÷×wA†:qx›ISíe{ÀbŽÏž÷ƒ8(‚8¸ºx9»xqIxöS†Y0{ 8î“„¡>#i0›oz,ümöêÅ%Ã$÷Sš˜?³}Ȱ®B,zj/kûŒ‹xw›÷ˆ¡}Ó ÂÜü’´á•ÌíS?d–!潿ˆ"Þë›KŸë’¤é™ïp†û¢Í׸/ml¿^]o¢±"øÁƒÛ«ù!ÜGüò#ÙÈ(Qo!×ë0bBtçmÂå.9 îdQ²M™5ú?Qä©÷s€€`×eë?“áàzgH…–MiÜ)J8ïŽq8x…½ÁÃá ŒÒ8õüÐùס£=õQ¹4¯˜¢Î±<§qsâåÛ02¢ÃÅfÝ(mNBʰ׽£Ò…ì‰uí½ÛðpWýTò)ˆ¼úhQ+- •åµVaD8ó¬ÝX'1ˆuY}ØÂž›hÅMõŽ~RL0ì­åůÏV&Ê…Ñ6M¼šªTÙX¶ƒªª­¢ï¯«¹º3nMpW=ÃA»¦þ£PÂÃ.ëL©Ö8tqÔÙ˜í `0ßl ÒL—ren“v½’q@Ì ˆ_«ªÜ˜2&e´ã¢;dX©RoÃs.Y£7yc[v‰¯ÓO#.€Á¢¸­õR.Ê¿•mT‹oí¿ðþ8‚°ê¤.~OuðÔ'ä§d *PÆrµ*«b_žè×v0æŸ6JßÄÄO¸ž4áZ*]¨~6l³Þz-·5‹ÉÒù r1hô2V¼´x•l6Ö=PÜŠ¶gw—¦ ð1.«±4Õ6%‰·çP8¨”—wæl4:×envB|ë.uS7ó:·Å¸íwühÜd[™ B}7ôq²Ü™ìÍÈž›ò° n~Á`)¯­Êç¦Fl¶yã×íñXïÛÙV”ï×kºÐq ‹@t¾±8g×kõçH--ÒÍU3éjè€ÛÅ1»˜q»×j;›­õ^±(ÆÈOª °AÊí­ šsN ?{}!0êM}¥åê½qáX|¿Œ¿izf úðS·Ô.—šÊ›‰ŽÇçç<²²¸R•ZÛ1⥎> ªN&í6ßí¹vG£ýá£]ïýlà»Óö°uÈðe¡:N™2Ç'¦Ø78¾à  %<›@v»ŽÛF©Vv ¿ÅœB1ï”ltûv7l¡”z>ê)Ø£ëÅý¨\îC5ö‹nRæ± én‰ï›ÿ~ZøUÈ NÇD«y™7c+‘øehWÔ°}QÃz%µz©Ëy¡¦êÒªÊ;ó3ì5~—I dWŸÌ“ŽŸª] ež g—e5K½[5¥ ïÄþ‘ƒ‚™ÍÏ>DÈëNjp(‡A­íg¨z¨¼iÛ@ ö͉§Àíy¢Þ2Œøû ö¿½CÄÎ2ß2Ÿªù&#œ2ß :ʹ2¾6ˆ+Û|;ði‘_G?ÎøËiøáõ‡ÙÅ?ÉCÍ endstream endobj 997 0 obj << /Type /ObjStm /N 100 /First 1012 /Length 2014 /Filter /FlateDecode >> stream xÚÍšQ‹¹Çß÷Sè1yѨª¤’æà@ÆöC’ÅŽoGŽÝc½†Ë·Ï¿4®v‰ô±–õL«ôë*I%é¿=÷B/)>)°*>5Hïøl!gû^Bn-PÂãEíD©ã›„ªœÉJ¸H•”ðkIž“@*V3å@µŽçðC·Û”4p’j¥˜j²R ,V-Á†Ã·ww÷7‡·Ÿÿñ8îÿüãÝ¿nßÝ?üp|¸M˜ÒûÃ:|Kãææðæøñ1Ü–DÑæ ’N.$15´—9ö¦xîÛðâE8¼ ‡?Ü¿»‡—áw?øç1–òûðÍ77ø{Fæ¨y!1"'º‚RÔ¶ “– DÛB¼ ·½dX~ýÛßÑ·£Ø`ä †ÎÝçŸ~zÿkÏ¢÷ŸŠ"Ò_=üêþîq¼Bß²émT{…ñ×Kõ›Œ›>nPëðúáþãÛ#Þ-^¿|<†÷_»ë5^áæð=Œï?Ù 2½1¯|ºÿüðñøé4sŒïþrüáÇßÝÿ†#£©v†g^x@m› NÏ|B»–]Œf$—/òÂÓOâ…ì…âõBõBóBÿR ·Ln™Ü2¹erËä–É-“[&·Ln™Ý2»evËì–Ù-³[f·Ìn™Ý2»eqËâ–Å-‹[·,nYܲ¸eqËâ–³[În9»åì–³[În9Ÿ,¿Þ¡„a„¡ô4’´c8kžŒ¤þüÃy3">1Ô1x~AÓ†Ò¢-œA5"M_˜!k´\õQ0!•-€‰½o e¤Í xSl¼™. ‘zÔ² 1@'òü¥×˜Û"•Ø*O êˆV¢Ð¢t‰ØL Úˆ*‘òyª*b‘ D]0D±Ò޽n kA,¢%c‚LˆR#õD^!m¯ù‘ ‚4X°-X²åMúBˆ­Ì ¬F qÄá Á¶:A¬X—Ú®ä "5äÔ D[0:r«ÑVº-9’ê bÁŒ™k‡7-Gª3ˆKš¬‚켘MÙ}E( Åœ7¥ÇYï+"!=rÕ3C®Q'[ž`pfÆÜ˜6 Rbî—a°îOÅNµ2ü»a`‰³Ä…ÓˆÄÑNsž *3y~éXé÷3„ô†tÚg â!Ø`dÞP4Åtxq l1¸”3EÍH¨SŠº€{Œ‘/œBuJÑPdŠ6ëý>¥è (¸c©´¡†œÚ&´`  ÕXꆂ ’ꔂP`Ÿ‘ÓyC,ø¬íÒŒo¶åb§n4¥àmŠr•\å#WùÈU>r•\å#WùÈU>r•\å#WùÈU>r•\å#WùÈU>r•\å#WùÈU>r•\å#WùÈU>r•\å#WùÈU>r•\å#WùÈU>r•äYµ8{µ8 >ÿÀÜ+ÆÁM vªqш½rúÇнzÉ‚4¾[[C±W‘ÃTüü»%9’KšÝšRÕн¢åsÖnU+¯{e9Ê æ‹ÝºÜнÂåG¬»•9ìPì•æ0 œÿïÕæ(/˜µv‹sTVh!{Ô¹5;å9ÔY±SŸ£²`•µW £R®@¡+z Ý ˆý ]©× Ðiº…Néº%»:åkPèT®A¡Ó| Ý Šý ê5(tZ¯A¡Óv ökPè–PìVèjº…®Ò5(t•¯A¡«r Ýù¿Wÿ½,é  endstream endobj 1234 0 obj << /Length 1109 /Filter /FlateDecode >> stream xÚí›KoÛ8…÷ùZJ ©|SZºnR¸ˆ OäŠAÁZ¬«‰,yôè¤ó뇔Œ7Å”Erc)†d&ŸoÏ᥀·ö€÷öâõòâÕC^% 1oùŃD˜0C1œxËÌûèO«2@±ßÊá„Ðo‚ß—ï^]a¾w/,â «Oîïâú’ °Ê 1‹£/D\Ý‚‡‹u„”ùÈU{@>Y!¢ÔÔÛìH’üüæÏa¼}€@½‚(öjýãpz£°~ ä>Œñ£‹wÔBA¾£ÝÈ.«>wÅýåö–M“«o6d1¶€³!K¦XR–7"Ë»&J‹<“©üSý!€¼¬ê;'bn„XŠ ‚Jo²è¿þ,ÀãÀ?M•(+¥¯ê,/E+õ{¢Ä‚/`„Þ&Oó„?ýJƒlœ¦j0¦jg±–Š3¤¶Ê¹Ènëês¯òÓF¶"­P¶rk뎡—®D!¯å²ÄJYÜÞ?Wꤌ´òÃ܃;‚.2¥;¹×¤Ò/ßÄ}U•1b–Ëë¹°ïMióö!Ì-·_Ç'¦uþ^”UÓÖy¹Vj‘Øn…Í]ZBM /´†ˆº‘¯så}ÉI¦6»ŠÙ8Ñý—˜YÌ]œ‰Ù8Ç¥Kí8&7MU¨ŠæZ^Ñç`|—«pܬtè8_)¿Ô%‰Ä6†yo]WÝv–íVúU8Ibj9ë ƒK!Úü›,§U÷/i#ë;°éRläTE¥S5Ò4:u‹!2†1cNúÒ5Ë"y¶–‹¢jUµjyµþâ‹éd¶ë¾®k¥ºa‡l+ûÁÌìEWN§5Ï1ê¬ÅQõlæš»òm-¶_¯Å¶«\¨jŽvöøgžòœéò¥$vùãÔ¡!õë7Z”'zõº•æãw° ˆMÉË\ç“=±Hg#êñĉ!ñ¹¨ïõbÒvТÖ+¤  ®²M9SS'2Ïš•Ø­Vå±sú=R¿™iMWµ(›™2Ó0vÆï0ÖÜõB;wB}”^›:ìô:i !.¡Ÿ Ì‘©Oû:''é´ØÛ~Aò^¦ï/ïãyS{rÛïΉK•’62'©Øl y;WN· uj ÍPëÿMo“ô'eYéóï³2“VWúÒFrÝï|3ìÅÈ9¿_D|·ë´­êF%ŽpFœš¯jùN¬´¦Ü§mÝ‹Ë_j4ÈžÛç«Ûf]›¾›‹u7wè䆫BèÎ.%NFŒQÅ÷i½Xò¥ª7AÈ9vAr$éØôlºBï¡ v}kb69ÊB®ÚGõ~²”¢íjýÄ[‚¸åÁà“ ¤úéAn¹K&f!{€©”àÉÒ$/æíÍ,˜|\‰Cæ 0v ªÿ]X&Ìíoèæ…nOæ–%öÆ;øããåòâ`î÷( endstream endobj 1311 0 obj << /Length 1895 /Filter /FlateDecode >> stream xÚíZ]sÓ¼¾ï¯ðÎ qeɟܵ@yax?N“—àBu”ÄÔ¶‚íÀÛóëÏ®V.q›)gæÌt*i½’VVVŠ˜³r˜óâìr~v~%b'õÒˆGÎ|éøŒy"ˆœØ÷½H¤Î|á¼u“Éûù«ó«ˆï(‚’pš1*3µ­e;ÝÈlÂ÷v†®\)¬wÆlg{=MK¼0æÎ”Ç ½v²B6Íd±Àõ&Ó±qI¦?TïG“ÿU»p2øÏ¼Ä©±HÙëgÎÛiàG.â=eJáßf6 Ã]¸Ÿê²”Õ¢C=Žýÿ[„†÷7Ëx$–óµ*`È£#Àða]6ó-2Œj ѬŸÉV>”Çþ:¬1ô ½Èj¦>vÆé‰˜G"íéÈ"½‘m.‹—%lŸÚIŸ\ø‡ {ÀþUèMø„ ?c3 ù@´‹¼ýóÚÜ*›ø. öãÓÞ¸çãá0Ôç“D¸×¥ÜtÜ–­š=c¸qœë»¡¾ÃÛ#]¸1æh4ÌwåNlQ¼Î¼Úñ)|ûfø6ä7HƲÎåM¡v"gº²KýôxâäÐ; ¾É›|["¾oü)^ÇÙÐ,ðõ·ÔñL‘Š(væ'¤ Ò÷>ýïgyùZKA$?Ö+Žá|ƒG;×½)*bÞøAŽÎ§h9>|$9¿ Xï]Lì%AêL9Ì…oçâeµPÿØÚ»ià…ïžãðXôúz>?ûxæ›þý&‡ž²òìí{æ,àã+hP¤‰óÙ¨–Nò…3;û×W¶³Ý‡DA°ûÈg^øŽ|óhÿ•Ðíׯƒ¢°W{iÒ{^4 !¨mŸÀÌF Îmqìjis> w©kÊÌ€ …ùØ}ª ˜(îT|¡*]æYcº> O=ŸÇc@¡Á³¯¨ã÷íàŸ©&«ó Þ_Ãú/±Xމ'’„ª_À àlµ;oó%±7È>neB ûIAO ÐÖº€Uÿ…©++YÜ5ys_\²úgSh˜4Ïô’Ò¦ƒšÊTQôúkP£>nU•©@ˆ,ͪØç“G4ûð4qe^šÑÔŒ%ªÂ¸dÛF™K;–ØÏ©›/T…ckóåIŒé¨’ÓUojü%¿5z[gÊ6#AáZŽ^©JÝÄâe­KR„¡N™nÆ„?æZ> stream xÚÕZëoÓ:ÿÎ_Ño¤5ñ#£êŠ—Ç`mCè^àƒ×ºMhWylŒ¿þ?úȶ– [!¤ÅvŽëãßù‡üÁ|à^=xvþàñË 8â! ç³ö}DY8ˆ0F!åƒóéà³w&›RÔ£¥˜ Iì-†Aà‰¹~=?~ü’F[³™¢(¤ðÛf×"|·Øêùø%c[sF4ŽÍ¤‰`n/‰®DY &KÔ\©ºõs7–Æ>GAÌWKŸ%Jëz5±0€´á§ÒbnÄÅ–óTSÛ~HÝ`ÞTÎD“¹Ñ‹Õ†á,¦vp¦J§üCñ ÔêØæé­Í„øx¥ÕiS|<9úp×>(GŒ‡« fýDs­9Ì´(E4Œ#0+6+U>Ô¯¼×u¢ ÝfžYÊŒ^¦Â6JY§“&µ´ýZÙçÇOC€ãýù ÍÚ†"°"Ö+‡ˆÅ¸e§I"'‹©ª«»¶3Ækr¼ÆÔ,G”soÖ“:bO•©QÛV"4—ZA­5=„Ðp2ì ',ìc)J‘ËZ–ÀTX[5­ìŒ `óëRenÄX\OÒLóºURkÝÁ($@Ê  óU" ‹—pk•k™»NU<¬íû¦’SБ1æ=nŽ[ÈvT!í$5³+Š>²ÝªVËGN¢tCi˃Tv7i™)Kó\ «4›¨ï(¯æw:‡ H—Ca/—U¥C€é»3çLðR•îüâÓp’:µíØ'½ºîŽ´½íè©(¶uÖä¶Q˪¶¶àÄ"Ö¶…#…Ei&.2yƒéÖ¾Ð0{¶ÍŽö+d?‰ª&÷ás†ì6|$ò7ðéÎ6|æ¥O·n§ÇNT)Ї•í¼±ë=Jó{šé€L¸AFdtC#c)¡B} V»·-¸" W¸\äv ¿ÌŠe¦jT-³ôî8N€v8èÀ-Ü Ó úFY+eetpÓÏuL×Ûîn†µê§Ñïq®_6šŸ™vðÔâ…ýb”¾Í¬àÓ9 /E9ErÚt»Aq´. ?Ä»n0¦ˆ0Úcƒo*—úAYWÙ½*ÅEµH»˜À w¬#ê8[ÉÃøÌÞáŇlDîã3eªÏ‰Å鵘É\ÂHgÖ°Û8Àx’lÄïŒ`8<0`ŒÃy»OîúG{L“¬m¯…êr¡lã9׉P÷âÃõíFpàÔB ÆQxŽšªNר”u@u:]o•?‰•ÜÑéísN›aŸû`Žò«úúµÒḧn_öŒ5›A°"O›¼øYìåP!ÆìÐ4hî“£DZ)G£c}Šéô1}¹ÎNß@l‡ð°èÀ)<  úg=ày§ŠùÔ¥¶ãTØ»¿ÛÅ Ýäµì›û¿g+úì•þ!Eq÷:S e¯«ßê¥ÝXHdÝe@Ìçk·ç ueDw8f´jÃÔÎDÇEÒ'nŸ-®3áÎËïºbÑ 1ÆUv?4íP´' X4èspz%«<-“œ(] v8I„èFÅñ<×r„—[ðüŠ—ü=«s:Êí(sii)2ùý'‚ýMí'—Nô0ò+qÞ+%Yx`5wGlô8UîÒÞÊ»387YjY*8”¤û^ôìKð ì±×·P%éÂ]&rZ÷):Þ\a••|z!Ë…ÌäõOχ­2n¿ÍŸ¢=˜4Ä{—©Û]™Ú¯U½údz¡"þojzQÁD=ér‡xAÁ(;`¼ ¾F¼%ÎS÷ñ¬n€ÝYÀ7E}]Áݨ~è»'`2 {yŒ9F»ouçöÓ¥û.<ùqmÕú {£{ÚÝêøë¾r–¤æÃ£tÞòo"»‹MŒÈæÓí¸ú¡åþ µˆ#Ü«Òp_Hlí¤¯žìàõ-”î¿”BpŠÎšb*o(·zþ}þà?C‰:ç endstream endobj 1177 0 obj << /Type /ObjStm /N 100 /First 1012 /Length 2441 /Filter /FlateDecode >> stream xÚÍ[]o\·}ׯàcò`^Î ? !€Ãm€lhcøÁ‘ÕÔ­¡5$Hÿ}ÏPš]:I™ØU²vv—3<——œ¯sE$ä‚#v$Qqœ« ÑÅÀ*$—$«].:8’«¡®®Ææˆ¡Õ¨è'øS;"ªš¨ÉQá¤ÌÔ¤Ö+Ƶ›o«cbµ_›cÎ:A Ž¥é 'V æœU£bis`7éÉIÈ]#;¡Ö5Š‘®QĬs´æ$h0~IÑKæ@Nª^3ãz¥µ.‰‹X›#HXÎ}\rQ`Rv1I·R ‹JÕÅróms±a]‰)¸rR‰\ÒÉ!1–STƒÄ¥˜ æ èR]‹]¤kd—jîÅrר.÷%fj.sQ .Ç L.'Q f—sQ —kÐ98ºÜb×H®„Ò5²+ RqXŒ®Q]‰EçàæJ&ÕÀ¥–UÐJ-ý–³+ F±Jø÷sࢫ¬8î«©£ªÁÕÜQU|[ú·•]mXDHØ8!êJb¿` é:c¿à¦ê]À~i1vâZ*¸çŒýÒ uæZªýÒZQ ì Dª¢»+pÔY°c(HU%ÝU!Q×<ì™®†Q¡Ô®†Ktª¾‹Bêj¸ìPØ‘ÐÏ‹îvÑ[†íTÔ}–tÓ‹Þ**7bßÿ¤bê[­Èý^ö¥/j;jºñ9é¶‘Wëô~dÖ£ÙgݤBj¨tC¤†Jîó÷V˰֢Ϥ º…q®u:‰áèøøh{þŸwçn;¹¸Ø]mÏÞÿxÝßÿõÍÅ¿¶¯w—¯Ï/_ø…ðrûËöíöÍ êo޶§çg×îElÙS¬B{;[|è§¼y¬Ƹãc·=sÛŸwÏwn{ì¾x÷ê§sO%é¾úê?wˆ"5/p {¹ø§(ʱxõQ{)yÜÂж…$x@ÅÇ0CQÃ̾¦…Ç&Ÿ¡ ((ø\Ô<œñ (»8ç ¶Ÿºíoÿ.Æ#ŠÀcFŸàF.Þ¿}ûÒ?Ù]\w«OpÎ*üM×z‚m ·Õß`àvz¹;{vŒn;}üÄmÏϾv/?¼ìS@9Ú¾½ó‹ë+õQõõê®vï/Ïίnœoÿì»ó×o^}½ûÙõÉÔ}2®ðôÕ%´u`¾Øó ÷­xz„¾’ Ù„ý˜jB»Z0L`ijÜÌr3ËÍ,7³Ün-kD¾È6ALˆ&$² Å„j‚Y&³Lf™Ì2™e2Ëd–É,“Y&³Lf™Í2›e6Ël–Ù,³Yf³Ìf™Í2›e¹±üònÅþLäF8qv&äîO&²HŸè¢T#3‘€HÇù"g_x bAÔȯHòö(|K𢍠PˆøÖ‘½Ô)б+3ùÊ Çs‚¢-ˆ]94ŸÓ€‚ªñ¾Q¤V|¬Š|-+UÍ:ïE^KŒ=ŠÜ³ÎЏE„« ŠÔ³ÎŠ®3IöYQ³Nš¡Xà;ò°8Ä2ì dS |g"öZ3îQ°f÷Ž"Jð€"TDØ)Š<Öâ5Ý5ú¹Ä ¤| P”äKPÔˆbkŠb¿ˆY|¦ÅÌ{#¿]€ ‘q@€:yÔ‘[/!ÍsÉ(“s¾o /¨’c›XЦˆ}“‹—éžXà'b`_ò‚ŸO@Ђ* é;€VZg÷ƒ$7‚ª#ò€¢f„Ö)ЇTPvpJ%"´NQ,8 ‚²£‡ C‘¡uŠbAZPá ( €6E±àœ 7¯½î= ©­u†bAr#T|* N­S Ü… ìˆáP$ ^K¡àþ‚QvðPªK „Ö)Ško•ìQpm¯S N*gí• (JA|¢XpF8i³d@‘l™ œ£6K‰a§(Vì éÍ’Šbï÷fÉ£hS <8rm–PPFŒ¢XA5m– (BDŒ¢XAUm– äXc¼ÎR_YàÁ?š¢ãÈ€¢ã(€¢ƒƒyÇô(:ŽùPt¿@¡>{ò‘ÝÀÊ}À×}*E'7´ÒÜOŸDѱ™TŒ ªÆ3UûªÏTg2>ÏcãóØø<6>ÏcãóØø<6>ÏcãóØø<6>ÏcãóØø<1>OŒÏãóÄø<1>OŒÏãóä–Ïû?`ËLŸˆ:0` ùS½o©úR îqÆ=q¬k°J§Lm¶ië#îpdÀDcÐ ­`ÀÀåVV§<-·– €SnqdÀàTeº+øm …NÅK™%qiÓQ‹22`(ˆyÖµKy†”a(1RË8-1Ò ¾%‹6B(4µ¤éZ¬`:y’û„Ô2M“ûÔV0`M;.V||ß(ÅÖ©ež¦ÕyWMÉËÈI²x„ÕŠ\u/CB›ˆ|‘|Ï("Ò i#Ö|©ÓµXÁwmMñÀ€_yºi¦Ï0Œ ˜–åÓµXA»h‘'ÃZÀ‹µ)å±ò‰TF.Ž|›ÞäÒ‰Ì4pqÁ‡0]Š$1Ò‰´в„K¾¤a)Bô4«Eʺ,=¤ák¤Ófé^ùß½™ßš68r´ŸVD¯¹ôæm,¹ßþRRo)GV²çöJú…l'ÇÇ}†íäìúÍîb{¶}ÿô[ýÿÅ?¯¯ß]ýiÛ^ïÞøÝåO²V}Æ»øñZZâ/?¢vtõa }M8/’‘rßBŽŸ ‘òö/vþö­ç€Èð>,òâÔû¿ §ŠQN‰¾WìÔîkëX…>« .it4°ûí]€Ú+lÜ=]ù«öŠäöAàßíýj0…ÐG jæˆâhÉh”úNp4õÇZþàh”ÔØËùcZߞĀoØÞD¼I6¬w ?³s–ï;g©~rçLìÙo±§ÜEöŸX_*Z_*Z_*Z_*Z_*Z_*Z_*Z_*šåh–£YNf9™åd–“YNf9¥;ío‰>%©ìå ®"íÔû[I~;¦<ýÇ…úþâûïNN?Ç¡ÇÛàBEh@8AÖ×úcpÜ å<һ˳7¯û¡ø÷ÿéQ‹±>ªUäö8ÿS”° endstream endobj 1371 0 obj << /Length 874 /Filter /FlateDecode >> stream xÚ­U]o›0}ϯ@í Hñ±1Pm™ÖNªº©KÓ½´ÕD‚“Òñ‘aX»ýú]°I I£D«ò€?Ϲ÷žl, l||œ †Ô3p‡“¹A0F”qÃ#q“ȸ3 ¶&—à îtNR‡!Ì9à4gF–ã›Q4ú§õ¨*ÇBVI)뫬^0ÜÁ°[Ûñ`‘*¨!,›úÔ%2ï]_ÃôIû@«®ßJ1¯@ ÔLâì§<Û¤@»w \îsÄ W÷ŽR¼~yðÅFS=7H¬ƒTHŽÇ²\ʳáP†eü&áåÅb(EU„å+’z´l…f“9þÛÓZÄåc5E³<]3|kvIêñ‹¥eC™äE©5­RZ‡hã"„!nKY‰~MžO¿¤y¬êߥ>bP˜³tp÷€6/ |ã¹9š JÇcõë‰q3ø¶3Ü5Y6!qF âçyÚ?Ê;¯ú†»=>Y{Ï%à=ˆŸë›¥žxæ¸ÞéàíÖŠ䂇ŽÐª4áƒqQkˆ}rVÄË2γc|ŒI¯§ÔR¸™†Ëeœ-Ô$Ìôê²Q> stream xÚ¥WKsÛ6¾ëWpr"g,†à$§“ƒ›Ä¦Nf:¶Oi=jJt²Žú뻋)B¦[©½X`±Üýðawyk/ò~šýx?{{Ãc¯ Ksï~å±( “”{9c!OJï~é}õ¯ƒ¸ð—ËÏM0ÇAWË»ªQ2øvÿéíM’¶§ ó"ãf#c¨3‹ìç>ÞÏþ˜1F¾Äó4,¢Ì«v³¯ß"o ‹Ÿœ÷¢®ºZ´2˜'Qìïš c”_W(7 Ÿ2`¾¦éÌÐ@Yì‹¶³fR~"Qëm³'Ã4c¬¯ÍPì4­lƒ9ó­–Þî×µqü›DeÆÉO㇬ƒ9¼jmœ†>ÉB€õä áh‚0kÏÂlÆ•¬ë“¯\\€V·˜;G‘Q(­U+—Á<Ís[46Aá@¬×J®Å 4ŽeôßLÀöV55M¬$RÉZѲÕa0/òÌ¿®­‚Ø‹úðWoתk»¦ä”»‹í~àDý…Ð4Ì ˜:9«xôÁH ø°]¡“ÆùÜ:GoŒ]eõlmvõ¦µ¬%¡g¶¨f7ÅöÑÁ& FRbrh:GŽÅyÈ˱ š"çK²º)儬n6A*'qCâ:Ú,~‡p®¦pïá˜\|jµ,Šüwôúòp{;©¹‡èÍ8Ô«ZåZ„[|5…í££us}{÷qÒ ÐZÎôQ줣ùæ=]½7“êZâù]}EM¨js¦·ºnZ×…¥hÅ›IÂÐÐÉ›ÔÚ1Éâ ®]«u·“û ‰ýVÿ#ç^ãZ:fÐIÅrRiΡ`Å}Áº“-]Œf±r€óɹµ0gE.M|¤%§‚ìÔCÅZl÷ºÅTÍR)W¢«Û£Y¢ó8œ˜ƒkÐ;Y×TólÀL÷®F¯á@ú®§2®¿)Cô' •£üu6H_ºFfUÙï­†: ÝC -‰N ;8Á6jÛpŸ©ù8ê鈗3Á$ßÿ$X¼ž'Æeµ0õîG_B *¡fd+3è˜tŒ#S;pðdï óU_χÀéÓ­N÷¢™þw0ÏGâAˉÛhû6{hJÂÊ~8" Fš_>K±¿ü°¨°Z„戇h/éDsqáÝé °*G•óRW²Ì29ëi˜q¸ò8©rî?ok8üšÖÄ“åƒiêp‚^†y/È &DçkýNtd‚8£Ž&ç”ÀQ¤„pg!cÃ_æø&žþ&a6 ‚K®¡KÎÒÒß®&ì&ð·“ó3í²²WÜMζ%1h^bžíÛ}T{&ßšÄÉr0Ÿ$N@ß&œ¾`ACUê‰-ô„óðñ$ ›ð> stream xÚÍX[oÛ6~ϯš‡È@Äð&JÜCšK‡bëCâí¥-F¢c²Hò–ì×÷ð"Ùr”Ôi‘ô9¿sÕ±qpààÝÁÛéÁÉ%K‰¤ "˜Î‚1b\ !H0LóàcHèäóôýÉ¥ ’Œ%( àX™Ó MÃ<ÿ³šDf±*ôuVÕÚ(`]÷<¹ä|)bDZ¨ˆ&pÈ`£UÍú[\dJ;×FÞ˜O"NX8«j·h—æøÖ«Šî°¬Jsü¸l¶ägZµ«ZûãEél0&R $ímï5¬ä€#gÖ"/ØÎUë`óª<òË¥j=oPpŒ’8ˆ 2Ž·.ˆb’ŒSŠ)J(é.ªnÿÑY;‡J”¦i'öÛ$’21®›Ì'¡cÒÝÔε[üþîÃÙ‘=LÃ; Â¥ö–jÙ)äªU·ªÑ?O"%İKøCiP›8ºåÕÓ4H)¥¡åݤ¾~\ÞVÅ‹¦})R†ðÚ6žŒMÚU®[µ(š-Œ! "0˜Ár1õ,š¢j_‘‰F:¢”†måž™*²U†¸mc+Ã.ÿÄq¨Š•q ÙWŸ0c~9C 8 ÏõL­Š¶ÙÄdÖÕ®¿ïŽñy袺‹Êª^ªbñ¿Îmrá¡s³jek m@‘¼èoáÀ+¡ÝrñÐÖÊ…á^Õ1­®³ç°o h?ëvNBбènøJªp¼i%)âPÐ{#Þ ¿'RØ`<Óµ†”)FÔ÷È+ Zš¦±QæA¡®Vµ-xMè?±mYÚƒÿíÜI/¡žÖmÓ¹!a˜çÆCÜÇßYÀ¸t0ºUnc²Š‹$Ôªo‹ ¾ÞDÃE3–M ÷û˜¨f¤ßpŠˆì›i‡cí&E”&OJrMÉÄßRJ<%›uu)â³úžviêÆ;rœ"™ˆñ޼zž &Å0ôWz¦k]fºù†ØOuÕ̽i­³AŽc·¾Î=± ÓìM™RLDWuÛ ÉV^^<¨å}ñ µÑ—+8CÞQ…×+•ÜaBÚ`~0=Ã,êUùSŸ2Àe2È}s»Ình#Å›Žð¶l–ßl¼¢ô—È= ¨C’™~ˆìÌ*bõÑ]‹q¨Õ>×ÎÎùv‹RÄIŸ_…9°^·mÎJ_AèôGÚÝCDŽ€™ÞÍØ÷ñ¡¥R¾žOŠ÷ËAï!v¾_£ctâñw²q~µw.öË;É^y'=ݳjç?‚Ïî활í—Dº_|ä^e3ÌgßÔš#£TÄÃûÌÄòÜÔ²l†CË©ù£ÿ£›\ÜMCÿ5ÛjýêkÐã±;‡c’×ÙŸF•²¶. ñ¨˜Â;±§ôï%¼sn.CôŒK;¾ ÉábX«ÏEb®UnüüðŒ+?~ÞÔ¤ð=…¤Ãqö¢´›Sí“ï´ÝóbzðjiS endstream endobj 1406 0 obj << /Length 1517 /Filter /FlateDecode >> stream xÚXKsÛ6¾ëWp|19c!ßœNnlwšqÒÔ‘§‡4J„h¶©òáÔùõÝÅ‚!36ÕñA±»Ø÷~°md†mü²øyµxs8FÌâÀ ŒÕÖà¶Í\/0BÎYàÆÆ*5¾˜—YV‹,iÅõ¿ûZ4M^•Ö×Õû77n8bõlÎÂÈÁ’‰»H³°ÕU׫Å? KÛàÃ-A²( Ínñå«m¤pøÞ€£82¾IÒá"¡‡R ãóâ÷AÞñ¯4ÅóƦp›7‚Àf‘ï¾hÊ Üák2G¼·éÒò¹ ðGÈ5H²|ÇL­¥ëGæV~LÚNQÈn’[º ¾…æú‰ÎòT”mުݦHšFª3í-/b¡ïŸâ-òŠ=àÀqXà;dוh6u¾o½qðŠiK17 ‰ýN€ÅeF¸®Ùt»@¸ž¹©ºÒr"³UgÚ¾}¶oD—Vë®øû öœN¶UM,"Ù Ç}FÿHy‹?OJ,ú‰Q jÆ-Q3ÇÍT¸ï›$“&=7QOžÞÄè‡yƒÆ hÉå9g1DG’Wë¿Ä¦½Ç¶~ª'Oàß¶Í·ôóñþöv’v+0—ÄLêZ†{ë¤ÕXn.o?_ë<ñduÕí¦ãˆüL¦åÙ´úiÊäñ<ʪÞ%Eþ=ÁÜb;Ñ>T©~×m•}TDbúÊf“‚m“M‹I2â…\¶íI–]Rgy©O>Šz]5B£\ÝÝO;‹1™tÆr"â2•_ÊHUj—uÖí ©]«â¥Ì|%#)ÅŽš—V¦a½Ëé{×g•XVÕ, Ì Ú•K%aÉ=ÙxÆù;ûÞ?òqE#»å„æ“j mE¿]#˜µô<šÑ6é ‹›-U{®(“¢‹ˆÌgZ¼ |pTP³Õ¿±"×Êp¬qR&ÅÓwÒÚSZ÷*ƒö -­·šLN)ìA(ºÞ¨“¢—ý qbµnlqnï;\Õº–®™&mÒAéMÛd×sç¸CŸKç g†/èÍ ç}k=­M sjvŽ ŠWÆ;ê“â­˜¾nd~*”žãà†Rý¦iŽS-)(FE²&…Õ¾Rt#DÃeè- ƒÜìë\f,e×-§ü‰97Ës¢ø…üºWPFìs’ñ¹¤y©Ø\]º b#zÐ,2êÌè—wÏ›ë1'ú( `à {ÍÔ€„ .qÂHïíL˜?‘K™¤††G•y³‘…Þ‰B&96?ÉB'b> stream xÚµXÝoÛ6÷_!´&1#‰Ô×€=dk:tŠ-ñöÒ-Ѷ6Yr)IþûÝñ(Y²U'yòÀãéx¼»ß}Ðñœã9¿Ì~ZήßóØIY‘³\;¾ç1."'ö}ñÔYæÎ'×ó/Ë_¯ßGÁ@’‹€¥)¨1"7U6w[ë{Õ.²R6 ž™yö¦ë÷Â^ØÓ‹ 'ÍÓÈ•åAN5Œ Mœ…ÛÔ¾SíAWÍ|$+iÙÉVHs÷¡h·ÄݨJurvÕ5ÿÐ\Á6ån‘« mÑâòDBÆ©ñIîfsß­ËîjØ|!@øÃÚª4ö°F´l‰UسË;Ôúçíú ¾- Öi’ºóƒsîÊ WáÖ«ù" ÝTÖÒ‡zM††?–8£Eä »ÍçÌ÷DÚ=7Æiå eI’tòŒÒ`Œ¤y€BzLD IÞ>ÊݾTÍ$’çÈ‚‘ hŒD,lÓˆt½} Î{žû±n‰Ð‡ê‡>tpyhÓ4—­üì…Þ›ýj—ýÝìdY¾½?%»U2GÙ›ÍF«lÕíã^«¦)ê ÙõŠb×ýHËQ)êüîîãÍÿ¡ûŠ]ölõ4’Êð´­Ät° ,ôz”¾·( c*˜HzØ1½Û)=~ôœÞ \M¨0Ô‹5/›IXrì-Ï:„@œ-ÆcqÀ¡Ç@yùÉ8™n+Ñ0§º“³ÛåìëÌ7eä÷ Q¤>‹#'ÛÍ>}ñœ¾‰ó`$wŽ€2Ž:W:÷³?¾™î¦éž”¥Ç"á;"æ,‰EßQ/tÓ(‡fšø]8–[Ý!LÜ›y¹býÜëšö2â,Œ“׸Iîx3Ú! RÛ×Þ©&Óž…"xU{>I<4Ä¢ø’Zlb§ÙSWz§ò*‘¸Ø(ˆjÚZË:ÓÓne{”P=×JJ4"F#šŽ‘QƒŒõõ¨ëë%ÜR\0k]k˜N è”Êé#wá1÷¨ÒUe‹jCÌœFUÕ´ZÉñd%Ë'3šp·°*åN•Oöq˜n¦€l´ì 8@]—yÙH¡Œµ™÷¡"Íê^xa®@ÇŠÃxX¿ÝÀËi°Y‹ÕjY5k¥i÷:ãRyAßG–VÓsÆ…)‹ãhhÜäà xÄƃᆲÛËSï´öO¦+‹¦}¹¿¡ôèa0x1Ø·Ä¡Q6¶mMœ 2K‚ß•ÕÙ»mhíÂÞ»ðcE}jCPU•)–©²l.™Ãq/›Ä1WT@¦oCdQÑJåÇ i‹¹Ò(«iaÛ‚Búa«¬†³ŠêŽÓÄcÃTUC—~ìbX숡°„§a!L/&IN6˜ß‹º)lƒà:pݰ0_7$QÀ‹ôüÙ8•Pc¬#d¿”~zÕ©d àbƒ*¬ Œ*iÓ ¤Vs‘*³ºöt‡+ÐW ×x„«Õ`õw-äÅ™m!”fx^ôà 9<½i8¨'ÚÓOøq¤pN!;«©Ë¢²œ¶Ó@¥€”EÔws¤2e%MJÀº2I]ãÏ›©›÷²ÐGø&¸¹Æä<¸›r>Îù‘ ?t› f \}…ÛÔ6i_X[}œ*¹z$YcÕð[­‹MŠv}­¢,â?–Å„ k¸4@|"­ äT05ƨb¸UÕ »0vν¾¤ëõŒu>`¡~ö87gm3FC0¦'=YUrUÚ36€*kÂø_{zOkaëüìMßÖ‡*Ãöq¹[kGEÿ ŠÍ¶eZå‡ìì¹vÚ¶‹ŽïùÞÛ´Õà+ÉN¦¼Ø© IëÔñ‚Ñ|â6·Ä¶‘J;¥ÄPoÒéµ?ò/¶6²r¢´ÙFàA«ç‡Ö9¤ýQcÚÑ|jKH?àF“¶{ÑpQåðùr:Z#F>TŠÕ3 Jľ8) ZµM¸!Þl+ÓSÉÊ©÷ĺû¤ønó<ÔÛàEàÙ¹“û=ÜÒÿÄú–—ÖØQ>fõn‡åþ⢻Ç'{W8›ñüÜK ó¬lºî ÛaÎj5€sê?›þo•ߣ endstream endobj 1432 0 obj << /Length 744 /Filter /FlateDecode >> stream xÚÍV]o›0}çWXêÃ@®?0“ö©ë´ªš´%ÝK×71)œný÷3¤4¥Ú¤Nyð%Üs|îÕ5@à“óaáŸòD0â‹`„ ¡„CN"°XKw–e¹–ZͲ¥÷&/Jïjqv|JÂ^(E†‚˜Äuf•ƒšR΃‰îªðCf¢—çò •yyÌ«H€_µëP$¤UÖ̯]¾ý³¦BiŸ FS 8‹ CÁ#*-.…¹ 6ˆ`$pËgæ1ì®VžO˜p“,έ¥=ì6¦¬sZ{#u‘ü®Ó3§!¤ˆ¾„¹eˆFÄâ8‚œ[˜'ª\É­Nòl@nGr ÀÇ!Z–Fàš%¡nb¸e±ç[†„¸º9e×öyÇv¡_åä!±ù/J¹V£Àª¹t(äĽÿò­ç3„Ü{Ù™ešëÆ„W\!0Uü€ÀÛ„GGÖãDÅr›jû0'öÜ(}“¯ÞµaF™ˆñ'ÔntÒ¸2ëÚì§iÞUpm­÷öørq~>êY±™æ™_ÿTK Ó¤ÔoǠ˲”ÓR™{«ÿöGh=s¡Ã;´v\uNe,SÂ6ÃG! »á{ÓôV¿#h:?gZ­ Yµ½b®ôHÚÈ Š±dõ3L8CŠSDæ¯.ò´€¿Uÿ?ª/ ™•±*I.(ä"8,9¢0 ôå’ÿ›¹æ/•¼P†³Ê–jšûÝV¯ÒÏmƒY±ÞnTæ‘ÀÕåÁ­ðÌ6£ë|°ȩ́F´ëƒY»Í P¬Ak~{\ŒC]d¯×ž*FĬ+–_›»ä®™S³P÷ㆭˆ)†”…Æ`’^ MföÝfA‰¼N•)WÚUÞnîÛmšZ+n—·’f™‡î}ª±² «¶‘÷‰´oN«ÄJÛÍ"µ> stream xÚÕWMoÛ8½ûWè¡°bø-ò°‡l³Y  4v÷ÒíA•èD [J%¹Mþ}‡¢¤H¶’ØÝî HQäÌ›7O34A7ˆ ?¿­g—T…ŸVoÏ.íäTaÅ8Øi÷$5^Ú]•4øÝl.’&YÚÆ[ÎY?ž] 1²1£[C‹a‘{sãÉá=˜±ÂF³Þ÷yu³ÛÚ"d:hê0âœwI 3Ø™[ASúWesk+?ÝÚæVá\Vï¹›bìüE4ÆJw¬”Ÿÿ¶iƒ7yÝõÊíö0Ö~ô¬yˆåç0’2pvOÇ'Ç#YÞµÛ4_?x$À‹Ÿœƒ%GæƒGÕm&«˜þ@¾ö/’¢(›¤É‹¿þ-onýÌÞßU¶®ó²ðÏää+»¶•-R{|”×ÃOºC®FÈwµÍºŠÎ*ü°F•3î§×è(18Öƒö/ó"[UIQƒ¯ó"½-«zVùV8VÒ‡ÕEõeg«òö¾Ýþ3£1ÇD &ãDQm C1Š8Á’SoäÏШ Ùìì`Zs4|û*ûœ5»ª¨'¢tÚJ&Ï£‚ÖU²µS©ÁÆ,Ë›ÔZÉÆ/¥åf·í-®{ ½Z{MB5H]þ¾Z|YЖ5:TE i ¥ÛÅÇOeðî-pÊFßÚ[$ nÆÂ)cƒ–‹÷¡“qåjЬEÂ,ªêSåʱœg ÚgñMY|µ•“…Ôm¥ % R ¥-°ÖVCÁ<ˆˆƒÑ ôuh– ¡ü:|Ød¦áÉ0‘]õ¿°uZåwmj~@@¼“Ê×Å'¡ÿXúÚ:ic†·¶o_òSµ¨“›y¥¿ÐûöOÓý‘äþ€Bˆë‡ðH01ŽMçüÕ+¿cÉýØö´ÌÏ[©»IºqýÐ7q3QÀ2Tóº‹vŒQŒeÕ5«CCÌ`­õsv"* †•$a¤z)`ßÍÚé¯~x÷áêª{YÙl—úw~È®—’×_8 šúÙ$¾¼û.,ż—d:§àáåc2§€ VúðDáp¨æpfÒ\ÿ7®o8{טCnuËíé·^|G#y7´©þÖw‘o¯.³Ž¸^m÷Ò½MòN.­g›ÁÙ¡Éûö–=S¥©‰¡°š·iÑØ`ªè±þyï:T¿1›-Tc_œc!WƒõçúUÀ úI}Žrøceþë>7C—ÀÔÌÒ5q t1¢éêêUøHÙ>f ð;8J{ endstream endobj 1365 0 obj << /Type /ObjStm /N 100 /First 973 /Length 2325 /Filter /FlateDecode >> stream xÚÍZßo7~×_ÁÇÞƒ¸œ!‡3<Ò¹ л âè]ÅQ÷)d ½¿þ¾¡lÇ®íV–ÖAƒ$ËÝ%gçÇ7ßpE9[HrnªaPRȹø€‚$ò‡º½•ƒåêÜO© I Rö‘ßÈ]LIªŒpZ5û5LoÅg“8%õ&q`Ÿ£XRóQ \µËI`ó%s¥ùj•1Åb!Sògš3»œT¼ƒöY4`NŸ¥âšv¹Šk¦®.Þª$¢Ð0q!×;ã] 5_zÎ6QÌgÕJÎn,(]rŸÿ•Â]r¥›I1«P×·aTý ÃÕ|%̯]5ÃüÆe‚õ‹iÂ|ZÃ.ŠQ…’Ok #ñi­¡~ ·þ¬)Ý9 ~ó»x ©ìFj£îˆV‚(õõ £ ó—$Al{WCMÝ\ÍB%ó™[ 5sv¹j1"„„¿bI™´šCµÖÅ0IóH­ Y€é“Fn¹B)(¹å  =ö BJ¹O 5÷»p™i\«A¥¹Â¤A+´ŠÌ­Y“4w¾{C›ÛÞ –Üž G·W€‘[³°`$]¾CDú†‘GtÉä‘®~Ï8¡ÁRVûÓV¸Ö§Wêâ˜VCAÊ<ºÝfâö€=Íš¿T¶¶]Ó¶ÖŸH¡u“$@#ñ—A6¶~ !ãS5˜½‰ù£xÆö÷+~Æd M™'GG“áõ¯Ÿçax²X,7“á»åêý|õ&!ÃÓÛáïËá)N°êÛÉðj~² o2—˜‚XSTÄg– <ŽÈŒš äŽÏßm0çðýéâ¿Ã“££¾Âðädsº\ Çï^ø¿o>n6Ÿ×†åêäô}\®> ¦ø—§¹&›¦Ró_¾ýv‚¿ûè))zæ¾H_‰Œ¨E0FCKš 'žj͇hÉ9‚¬ÑM§XZT¥qÔDç©Ó!jÖèФ‰ÀÉ\âp—sä6ŽÏ™šL%§t€šY"€TÑÁðXF&YÇГ§©RJ©í=‘+ŽØY):ž`Nxßr´RÇq{ÍU¦ÆRöד[ŽŽë(¨± —2[`€.æZƱ'_§É˜ó»‘—p‹0§›592¥h–DZ¦²T>Äš-Vv+rD‚;i‚ÖÒ¨ŠãXSQH§ÖDÑÓ¢(Ð¥ØPe3’¤¤IcIÍV`NE;ÀéèDñcCB½wŒUœåÔ ”À©Ê´–¦‡"D# PTÏ'=ÁŽÃð·åëe@‚~óê§E<Þš,Œ¦øœ—ÎL­³zFÏ à¿CIí`¿«A4=n® _ÂMm´L;J ¸}­ò(Ò z¶«4P> ï(í½“‚žî&íØ*³«4R´üîì}½o`ô5Tþ ”û^höa€m|°-= °¯Âèqw]ø*îT¢ïE?Š4¡Ò﬉x¨¼£´÷ay{Xy¾îÓ°·ƒ[ºÃÁ¶EÖvQvM§ì>þ•#n*¸nʾ *Îj÷år/üýðùýl3?þõÓ»åÙ÷§ëÙj˨¼¨m-¡ÑF8Kf˜©!ˆÚ^m£ç!LÐîb‚ÑSó®Ò ý™v”.¨†™ê u?Ëô¯·ö ã’ê­0öÏ ;…±oŽý6ŒÛ%{lv9¸lÿ,r1 Ëê¾O‡V»7Å¥ ùD¥õL,v±#vw`ýs¹ú4;;ýßüÙl31Î zó âË qͽ€²að!DÙWWÇœ2¾¿ (BH œ»µïeuZToGþi©ùv` Ó•îUçéjî(ÐÉÙ¿ÞýŒ¹FÔ ”°ø‡*xÌÃG#më }m`”ˆ€’ÝNµÄþØ;€|¿}ŽOfg·4qTò¯—;Ãã á/œÀ¢“|ip„¥¥%”ÝQº¤Œ¹eGi¸ùA6¾Qø6ßð±ûµ/Þ‚0ÕËÁ¨Äƒ=™¤ ßGÃ.\9ú&ªobYýjý1EÿµØ7èFíÓ|— ÅÞä~ºñ–ÿMFNëοèJ›ŒnTýØhóz5[¬š¯îÌlzñ¹!ü‡=éÝÒþù“dGi@glÒGÚ·ë-ï*]ÐeÊ®o™f‡6™70á_§Ë,ùv—é?”ظ æ#þž­ï­1zÿ©“ÀÂí~Æñdqòq¹‚-nz~@|CøKQr²##ÝÃ+ÿ¤ÁX*íª·Evµ )€Êø±ÊãH]M)·ó¢ðþyQ.[—B£v,É?“¡g4ãþ9Yáæš-–z|~ºxY¶Ù²±B™ûNAM-6ÿÂl(ŠÂí¬Xu_¥zD•ü€¾.ü…ù•è¿€ÜQºRÛWúÿûI0 endstream endobj 1459 0 obj << /Length 1196 /Filter /FlateDecode >> stream xÚÅWKoÛF¾ëWÉ¡®÷ÅWŠ\Ç.Pnjɽ¤9ÐÒZV@qU’vìþúÎ>Hq™•, vEÎî|óÍ“8X8øeòó|rv•Ð GyB“`~ŒãI‚–óeð9,4[W«R\ˆ²¼|ÞN#š…¢^OI¸Õ”¦a;ý2ÿõ슥ƒ«8&(Í(Ò—TÉL°U}vÅñ@8ê¤#šÂCfÎÜ6ÅJ8Çö­pš‘É˸¹èíÛicΘY7¢}K³¿—µÙ,Ê¢iŒ!I>¼Œp§¤3ä#âèã(ÏzÅÒ‡¢-f¢õÜs”æñ¡Ë"’rpB ‚ò8Þ9A<ÖEû'Žñó;¹)ekv?™åÍB>VmóƾƒŠWàæú¼{û$ê;ÙçýüæöÒ¾F.¢܈2”“ÿN'ô ê ä|¼æ9R»C¼R ’f–×Äë¶5×è|[†O ×{ø÷È/!(\éR®øÞ}×·?º¢ÖŒm-¿ŠÅ(|Ôù5¯õãÈc|ã”UIF3”2›­çõêQÕFö9˜µ¯dëó¨R8e%M 8hççój1ÆBy&'¡¡@=h¥Y T>©*%êñË]ˆº€( ']êøp@å8A Ä![&61t> ~¦³w¨ÿ$”PXkµæ©xÞÖ¢iÖÒkâHíŠf\T€·êˆ&¦ŽÆx]l, yßél ÅæKsé­Ebg¢‡hž¢”ôÕPE·§“@塼ÒF)Ë‘b«PêǨîL³òB˃ìQ—ó}]Í<ÞÉRéüflµ_åjça62McïŠÓÝjøÈ¬±™ ÚZË×Ö’¨- žŽBÙ>K¹.ôåém¹<eeBÇ&ô` fãG6½G´”‰Tˆ {Zšµie-: OPR# ³Ã‡e޲,íÄT¼nã'þxg ᄼî¶}ñYß›Â̆’LÜÒ,«òÅx¦’õ¦(׋¥[#8¤…[MT-±¾?Ù…úÖSÈ3ã@Xaãw`K‹ ½§ŽJ³š‘ÇxìáÞ+àNè6ùnX@Óˆgy8­«JûGï:'PNQÆØ>'¨PÙ%P_ÿœwýhÚ?Õ²k†àúÖ@©ú:Þ×ÏJØ¢dû›–Ó4;㞟spØ÷ÿ˜æ ãGÿ¤>f~ÔëÏ}]ÈL¾ï¾£« ™(Î:±~›Ö˜•¨œírâ¾–:˜ îóíÙ;ê$d˜k÷L(F3ž—Ü3ïÀeA­þšíͫӱ÷·;å‚÷ïûñÔQp9Ÿü5!úRÒ³©‰„ÆY°ØL>ÁÁ^œ‡Xžß´è&à·)Wßde0›ü¾w@Ó†.JpJÂAY–#Œcÿ‡á`:ø?‰{¨î#µÆ6Ä/dõd†³jX>Á‰*xóLgd<(àkêÚk§Ö‡s_M½‹)„‚é8^ÆHÂtŸÀ˜a{>™ #PÜ©±èƒhõzÛª™í_dÅ…oj¤fãvèq5MGÕÔÍkÿlýh¢éÄ endstream endobj 1472 0 obj << /Length 1340 /Filter /FlateDecode >> stream xÚÕWYÛ6~÷¯P“‡HEÄ%ERGŠ Ø¦»i‹mŠ®½OÛŠ$…´ß {D{õS§É÷oíä¿”Ó/M›Wè½q¨QæLß5à‰Kl¤ª+̨R6•¬²c«òõ0Nq„ð‘LêÝÃ)"{öŠNw²hþØ= Ex?:®;C—s ¥(ÂéÙУ5˜2 )å\CÓ#CÍÓÅ8TŸ2œ8%ùA´Z»|f¿–Ýnk³Ý·Û×Ôû¶_~XË™ûi-Ìc®íýqp°§!ƒ endstream endobj 1489 0 obj << /Length 1116 /Filter /FlateDecode >> stream xÚ½WKsÛ6¾ëWpr"gLO>ÜéÁMêÌd¦©[+é!Ét ¦ÙR¢JPvüï»àB)3~̤½ °»ØÇ· ” ÞÎ~šÏN/ä$Ox̯F)2 RÆH"ò`^ŸÂskuijð>^ÖÚÚèËüÝé…Hj’2’fŒö ,w23ê9½t ï¤cžÂ¢@Qž„ºÞš‘êÀ„º™1ˉÈ8*kK ÝirÝê•!¿è®­¾N¸™ç$áéÎ˳(–R†çQ,„‹(f¡ŽXØá¤_ìíá´5›ÖX³v‰ètW5k\o®Ý(ÃîÆ ^I‡^Œãg,íýˆyFR{o®ŒÓÏDx^Ûf2~)É‚Ö}âô÷'3se¶­î~]üe–ÝÙäÉntkÇIþy>ûgÆz£l•¦„2,W³O_hPÀæ;8SäYp׋® I¥«z\Í~›px³±—Œ’D²@©œH•`6€Ø ö‰ér’glWÅyŸw•¡º›¦áë½éÐdJ@ã%¡at¢S“D¦ÄoŒ]¶Õ¦GÇ4ŒGx<.–‹ñ2L§„&ù.^ ó!¶¡—2¾ÏJ³ˆb•„PuD4ÏEXY{¤òœ‡ m«%®m×U‡‹Ïnó$”&áuÓâêªi½ra:]ÕöÄ °pSmýŽ5æè ¢1 —ÛÕ¨  ð;w=Ar¥Ðùj—¼çàxêöíRÏ{µÿ¿¿òI Š\‘L%ÿmŠ4#<ßQý¶„u—uÓ½ Ï#ž„[Ç›%ÀͰؓe¹K<^D 8C=ºqâî˜þë®ênPEãpùþ-îT+]òífIBø÷ie`m"˜ú.­üº5º3ï†W·õPÿ¦¯Ûʬ‹úþn¹üXân¢$|ƒm‚Z/¢› 2êÍ,"ž†÷¸iñ–ñÛj]⾿´–Íf xt?á‰^Þô¤O9¨|¦BÖæd¯‡JÇMª‹f;ÛLy°ÒW §wÎSTøùmÍI÷øÒëuƒœñg«mgÚ#lŽ*‘¡@½j× \Ôzý7®ø<ÀbŸ¢aV¯À_ÿQTh g[oÉNptÌ™ Š«qŽ6¾Ž±S˜y >C.=ƒº@´¦€omUVk]ãFmJLJ^~òu™»ªö’ „’Wk¬/y±m=\@­ïõ“©·ŠH{_GDùÁºâN䋞m¶ùLuéÔ)J!‚›þˆ£~ëÆTåM7½Wlª£ †Ùä#,uÞ–ýõ$xØÙGƒ{"¨ÍCîU?M€:ù:ûZ QúŽÝßÝî°伡^“”zþƼM¼$Ééþå{2à„Ðl/àsüHRÁáÙNþ,וl@ÇEÝ‹ÄinݦiíÑkZL%ñéà]õŸøË}¾áYßÔÛÑã$—xÐ+OýWyôfxAŃÜÜK¿ endstream endobj 1507 0 obj << /Length 931 /Filter /FlateDecode >> stream xÚµVYoœH~Ÿ_œîˆv¼Ê8Ê*ŠrŒó’DQ4˜ ×ÒàØùõ©>00š{WÎSu7]GW}_ÈÊ-d½Zýµ]_Òµ{qHBk›Y!ú¡µÆØ ilmSë³Móuû÷ùeHf7)E^€uåÂÁÛ7‰lÞ±œonÛŽ Q4µT]!ãðüÒG3®1â’5œQmjs˪¶äb¡xL‚Aߊ@9ôUø‘åâÈ󃵶õì™ãÙo›^/º¡~! ƒ²‹‘æ‰)ëÙ ³vW%ßDÅÊò öøÐݶ­ýájù²¨ÞÁ¡4Ðìþá‰ùü§“Éc/†¼âu?Ú˜Œô‡{]‚½žºxâ¦N¥îü¥£Êj³]ý»Â ‰,|_â ˆU‰“jõù+²RøÆ=GÖuµ²|@ÁÚ§°.­«÷G« p…˜ážúØ |â!ŸŽÏì›wMQ÷‹Ÿ|€‚¹6ñâOà"¡=8.¶{ÛMÅò"ql³žŠíòÄšÚpFà,JÖs}Ĥ v+oKÇz+¤{µÊšN_ÌÁp.ÓLÜ2-¸©QÐîúžw÷åƒáq"ÑÐý§Dë„¢Äô#ߋю_r‘tEÛïÓlJë’Ü’1°Ã×ê¯!”Rûšµ­ãJêÖBŸô”¾]‚$k»ù®·¹ÙªË©n KBKøH±vq% <žÉÇc]`G]2ö¹:²2sƼ½zóf„ÿC1^tùôs(±ûÓ]çeH{°^äÈ„j•j¥¤VY'!Ή×ùÞ©tó¢Îõ¾eBðt^"@®†í~›ÇéÇ.E´&i÷u¦ým?È&µynBÒˆ(j„Á“æ—\O‚÷úúõÁÂľSÇ@ü“‡@êÿ€o¯Mg :ð™Þj´« #ÛD6­š‚\Üb`eñÓär~ÍŸ•íàz’ifZ}š-ÇŽŒÁË:V)BÜ.ÐÕMWÉãzq m!I C»¥ÒPÙ ¥ãóë9&Òìô0Â1õâ˜þÞa„Ñ46¿7§TH ¯¦B>N DvÆõ¤Ô7‰• >ÔVûQwwZ) þ¢7»È_2Ùĉ‚Cß#™'(˜bÓ§(8<|œ!Lv„éд->å[sÌ Åo±G>Ω{­Ù)Ó¤ÈZôRÜé;I Ñ;)$îEÔ & endstream endobj 1522 0 obj << /Length 1813 /Filter /FlateDecode >> stream xÚ¥XKoÛF¾çW½ˆ"†ïŠÒØ.ZMàÈí¡éaM®$¶)ð‘ØùõÙ™¥¸ãH ƒÜáìììÌ7/9³ÍÌ™ýúâ—Õ‹W7‘7Kí4ò¢Ùj=sÇöƒh»®ùél•Ïþ¶Þ,\×µ>-¼Ä’ØÈëÇ}#Û¶¨«Å?«ß_ÝøñHBà¸vœø _íõ\äyáð‰¯ngļÔÜK/¢O{î[8ÄØöµ'ˆ ÆÚ'³¥›ØAÊ‚Þ|:Ò÷£:(XíSá–isýð¯Ìº—ê³c~m+žÚÅ2të5=þ¸¿½ä]KÑõpÜ7¸#ân$0Wv+ûFtÆ–›7·®'OØ4u¿·ž öŸŠ\VÝOÓêç¹­>ŸwƒR<ÉÆž‹NLËnËÚ›K0v&:™£±áßÜžy¨[il]ÝÝ_OZɶmE^N¸ O šÈB,x‘í¦c¡Ùô;Y-|ÏêÚgÁõ PNŽPm„@ÙiâéøÀ¾õ}öÂM#kB€qä’%,ÝÈvÂÀáÙçþµ-2 Ù-Û^l!ŽqÝÕôì[i/–AZWr-úráZJÙÀ*˜S”åXDbhñŒòþQTœ­þÍ"ñ­!–Æ‹J”O_H뀵Ö*ƒö-½Z¯ !EŶ’ùô¥.¾“»øEÂáy'Xº–DÛ÷øÖ˜Zú vëM˯ ëÔ8þàÏ•Î1½\ŒÁ!õœ}Û· 6uÉÊ÷\ V§Æ«{ד¬£µkÕk¢g´£­ mõm­7)Šjs'íÍK\ó!š̎×Ü—ȤL–år*u ûÅuÂs† ®oÍ¡s 8õ@XwpÊ`]X¬¯5½÷˜Øðe‡G1UìKI"2A1F§«¢~®cµ¨A V)ÖOÄ,HÐÁXÈé¤VÛspO–+rt†öÝà%‘çÊ0h•‚v1L0×iõ¢ˆ8š³ñ*^K†‹Ðõë})²š f¨ø™çE…\”äŸR<¼®™OŠ!÷¹Êí ª¤Å¾)šàUEìÚC çõC_þ7 ÄÛ¥‘BEôl3ÜrR-ÚDƒ?Œ *¨)ÄvßjÜ @£Ô*ÖĴíF†PJ-ðÔ´D Ü„¨ ©ÔÕ1çkz®ë²¬‘í3Ó·¼»nrºÜ±¥T # YÔmçDÅ{ÌÑ2вâ£ãäyÎbÍI6›·?\€TŸòƒ¨„„úÄ´cÿøÁ¸’^¬–nƒÎÖì}SP4Ó™;èk¡ÃÕ5¡ÊÙºÛÁo°Ú7„ H6Ciy˃h.Æ6·cç)¬û.ÔÙ(ä˜KU²£Åœ+s³*î RÖ '9oÒ×nÖþìdÖ :ôzwÚÆ¥¡¸Ã\ò¶¶@Rõ|7Õљݤ—Â\”†fKy%;Q”ÓÍä‘MŽ›Èß0 ’Pi¬ãžHªL'‘ÕÊŽÊ@˜c Rv ¶Ü_h­û*ÔHLÈü©ÛªÖȺ@âFH[Á\œAeÅ*Õb¨êf'Tý¢ƒÒ`SÕú 5ZáèŽ q •+ ¡ë•N°šK>R ¨+FG±FßtŽ~º½c©ÀÿDÙLl@)êàKËú¶^šWÆ‚UÈáH¦TSãFUWK²Ú½ÈT¯éGÖ;¼èç¢UíÔ•Ì€«Ë‘#ªŽC Ê‘_žmÚmu(2û<«û …t*_: eBüÒf¢”öà~8¹Ò¢©c #ÆÊˆ<—ŸT1P'ˆc‹[Œü¥2¾¢‘½ƒ8RJ"éĆ`ƒ$¹4mÁvâÁu4ÕbྦˆÅoâG×q!½èí*¡§vE õE*œ<ñeŽùll"5+zQh'ÉÑ´8BY€¼¨€ç¡ÕÑh_ì¡ÑLj†@ª :¸.Ñ®KÅ÷‡z}´‹¬DBc4¤£+>nŽXt-w?7qÕô¬Ç´¿Õ9^‘¿ÞäD= ¹*õ° ¬žI^âeñ;‹‹9 qÜc({žŽ=ׇ„:ÌÈè½+LMÏÔ• ¶½$Ñ[ŠvЫ"Å”=T3a°ÀШ#Õø&Žʼni;N‰œÒü€}E™d<=\áWâÃíÈ¿;>ÒÔŽ¼Ôˆä>FÙ0´'9c¬´W2èçE™'¤g5íE¥[2#-ó´z¯'vVxNó9Ìdˆ1­ßx< 8]Žº€a>2RžQ÷ # ØçüBôç"” ï)èwÊ¥ˆÉÄá ;Ñ5Å#¾ûÖç>R7²’šŸ uk8z©d‹Ž{hdÊJ쌾²c]ö»ªEø36J¤ 1$¼wu‡Rï§\lô=Èo#”‡:7 6P'íÑKZ1ˆ}× Ž~ {&ò½2ùùö¤®W/þòKÀË endstream endobj 1532 0 obj << /Length 1088 /Filter /FlateDecode >> stream xÚ­WÛnã6}÷W‹•€ˆ!EQ`[4i’bûPl·/Ù +K´­V–JÊ®ûõ^äX^9±‹ @¨ g9·Ã A DÐ/“Ëéäü†E(ÁIè‡h:G”Ì‚E”â%hš£{Ç÷݇é¯ç7¡¿£É(Ã4䀣u.S™Õ®çÇN.>TŸã"s©ÓuÕ|,ëV!Lˆ=÷ü& ;P^åù™A¼þš®Ö¥h–‡V@ P Æa Ýˆ‘G#ÌëAž¶é'ÂÉ»õl•ýÕ¬Ò²|S… ö%8áVw)Ò\é^< ™.Äõ×µM~(a=û[d­ëqBœÌò ©¿»ýíâí‘ÏŒ`!ëng›V¦¬m‚’øœcø}‚¾7*ƒ08ˆY¯Pä¢jÇp|Ððh˜³õ ½lÆnâ2z,ŽJÃ~J&×ÓÉã„‚ At[í!¡Ø§ e«ÉýA9lBò0KbôE«®P  »Dw“ߢn)¸ÓNKA „E<0 vºE5ʼ„¤èhˆ]'1…‚‚•ûFyŒÇN»ê#RÈ.§N¦~ÕêW.ŒÆUÑ´²˜uê4#I«ÜØüœ–YW¦­ÐúfÓö°ÆêM"çc]Tms8œ'˜$§ÄÑÄ‹ŒP÷ì'Ôxz%šLk}“1>ا1Õÿ1ô?7æÓeÑ€$væ]ÕûC"g ´&‚ Ëúhäf£°l¶c¥yBáÂÒÛçBOJÐÛÍe½2ú:vf–$#ÐödZýcMmj¼-iPÈqh®®ŽÅ¶Ô¤©|„Žbëã pÊñd9¬ð¥â|樾—^»Ð…\t+Q¹ÌwÚ—Yü• YjvÇ ßQͱ¥º;ÑÉT5c` ,:=Àþ“@î}%Ú´(›“ê,ìOV™f‘soß¶­ÆÞFWSÍe:mmŒ·hÄ{ÈLF¦#S€ fÚY}×ÍÑ^n.ŸËÍõ¨#àNªa‘ñž*ÇïÄì˜Ót p;aê¾Üô;ê4«­+ߦ€ë¼\È6ˆº xSvâÿtú­h;YAHüÎ,ŸÁñÅBõºÿÙHž«BÍ(FÖ,kå×—¢ZvF}Ì”|ãéwÉH†)ñ“NÐç«”¨µÔØOðÆZ‰n'ils1O»²Œ ;ɱD¡Ã ò.sä'—›@5f»¨Œ|!ÅÆç¨h_tí²–ê:Íö‘<±êoU8óI›ñ lוø÷±+ÚôlûVïñ¼¿mÚ÷²žN{›ŸæRäˮ͖¸–‹G}[(ˆAûšŒáô²©ÐüàÉê?o_%¡a7èqï1pt¯2èÌï1ëŒÆáéƒñ³Š<ß{f}!2 úÀ›Õe·ªúIöÛa‘Æ€7Oµë 8öIh#¿ö2ÿ Í Lÿœvoè endstream endobj 1549 0 obj << /Length 1184 /Filter /FlateDecode >> stream xÚµWKsÛ6¾ëWpœC¡™ƒÏfz°];ÓL/•ôàä@“°Ä E*$e;ÿ¾»H‘mˇž‹Åî·ß.–ÌY9Ìù8»XÎ×pb"p–÷gŒJ/pBÎi cg™9·äâãrI¢žÚ˪¨êù÷å§Åµ Ç<ÆiIPª‰23f¯¹ZÎ~Î8L™Ãû‚PP/æNº™Ý~gN›ŸØŠ#çQ‹nŒ=ÔZ87³z}‡£vÃó†npF;ïQìܺÐüÑYAãˆw¾ü©ZUoòRÍ]éG¤8 I:÷9ÑÊôÆ~&Â!3U9ÜJ¬j}dWff4Ò›3’'¨ ¼· dÐ`A X@™Œ:¿š´Î·mVÑØ£2Š0W0*üè);X`–ZH¤GîŽÌ¬j(`¼KÒ¹ˆ@aa±´šsÒójd¹‹×JN~âµ_šd¥&í=¶̈ûdøÆ|†*µ´„;9}߈Ýé°¡­ïµ³ÛÖœv]«f]à‰Ïùà < ÆÒVÙ£LGr×çß\MJfIýc$zvW€%g“ÂE¾Z·céÇuÞª3-ìNxóѶrçõj·Qå\ Ò6/¢þÚñ!Œ™7âX@â‰.ñÎ's•¶šTð]Ý›Q3)0 Ö4÷šøf·ÝÎ]©j0–ù<3+e²QYMŒAÖê)ÉTš+7I1…80Ögª9pg‚kýqyGù!cNâ¯S¦Ue“·8û—ûÁ{øy. ß×tІE¸™îÚê“òÚÍI^"tFcŽþã¹U­ÈéNyRZ† ]hY_ÛõÞ•\+9‚íW®:á±V²°Sª>VÈa ´´BïmU êÆTPŽedJÀ(½Õ&]†è#ñ9ePSG¡Ât=9H_[–h¨ër gìô3Üpë !È¿òr|±Y†Ðm0b»"ô…´±„4)R\åâ“red+)Š›*¬"Å1Ú~LòUYÕ†ªGá4 Ä>žSÜ„’àÅ4‚ƒ#tº8Ïe÷*Xçpb艱Óv¿5“Žãøf Lª„¤¬¼œ5:³úÔª&Iè äQr+Š÷9 éçI¬¦Àª2Ë‘–hp5U6BF½(îNƒÃN¨Æ{s€Á4J¶Jký˜$XH’ZM\ìŠ8†?û¨ŸòÞT»:}¦ç˜LöWÞÂuÛn›ß‹¦3ªUßÕ#M«ÍâçN5Ø5 {" £ÅºztñI'meF|—2eæ÷UÙš™Îv3ÍK3êÀL»-ÝBtj¶&hVÂÚ3Ð{˜˜/‚uõ”l¶…jNoÑ"P ® ʼ˜è×±EDmØë¤]ûm|<Ô& ¤CÓk™ô[ÏŽ½üD}it&ôøMᯪ‘ûÔ8V¡g'kБûÿ OÖðî* .®å„ˆ¸ÜWÖWa»ÙµœG$€ßžÿÉ endstream endobj 1455 0 obj << /Type /ObjStm /N 100 /First 955 /Length 1867 /Filter /FlateDecode >> stream xÚ½YÛn7}×Wð±y—œá508 œhÑÀvÑ‹‘‡´NÜ(ÚT’ëäï{†’];–mÊ‘jÀ—{8ÎÌ)ë\TFYç’rA¾³Ê„oNNÒ°Ê&VlQ–gR½4ÐIV†â¥2R T0IeôÆ Òñ‘Œ V%‘è©”eP`•K露bÀ ¬´RC3KQ$cˆxA¹àDM*"  ‡ä,]!‹º‚ÎI 1‹6¢~â €”dµdJ˜ b‚ >)2Tð-ÑÁE£š •ð–Bi±"gD‡äù²Þäa$#ª§ (aÕº±±„) YˆËv5¢9lÎøTN,]V•żNDd‡V*x¯ >c޲¼ŒU8*xôA?‘Ÿ`D+êf1çRI¼—Xo0"âmÆZ8Y']¼ØÎ`@†£à"Îâ'oÊâ(o­rÆñ-B+ ÞB+Îòäl*#¼r0òòIzÖeËäèã s"rzåmDä™" ñ}”²D’È…_½a‘K-q”'Qd¬LcÅÙž¢‚Ì"Ù %^ðæÙ—¾¤¼KeDV>pdÄY^ >I,xÆ ¾ƒ-|.“²™¼<{ö:8mà‚J´e-ü­C3E]­¨§ id'h5ÞÔ¢ëྑ}ÐOjoO5ˆ”WÃ$ãø¸zÀ ¹«ä=P{C<³½_ò ñÍ›Y?:êêD5o^¨æ¸û²PW3ýÜáEû¾4/ E7]Ì%ãf?h»y>u¥/.û~îÆgíóþ‹:1è mÌôµ3ŒÐÒ¸?öv¢Jâ}¾™¶ÍÑù»EyþélúqÐ<ïgãnV„›·ÍÍëæÅ‰-¢Ï+A¦Ö 9Ò,'f±~pB#¸Û/Æ4qr}hÒÒJ4£¬Í Mx $ùv‹—ÏúF›œÖ¢*Úq®DNr£_‡–K¹™ßÚžóhÆñÆñw0Ž.‰Fy7aÆê`åW.ÛYÒ8AÝͳv2:Ÿ€jÏÛÙ¨w¯§§ÈC-¹ÍÂÖ£ÜáJ9F–—ÃóCÊa¢y·xþõ~ÝJ ñ&¡Ï…þZ4V"÷6»@{g5¹X‰ÆÑµp-˜³¶”+ьӸT‹æˆ*±v‘$×?Ñ×¢QD¤jWJbO–ÿŸ{ˆGçwû®Á»Çß5Èo<˼âî»YXGV£¬²ÿ‘¤ähqü@QÈb{)%AZ/±#ÛãŠÿ…þÍþÞ^™¡Ù/ÌlŽš__Ëÿ‹Ïó§Msqq¡/X÷³÷ÍñaóÛ‹ýWdš'wä–‡õ[%:ùeFn‘£aTŒÈ%ØBÉm®Ý|ÑŽ>öÿt³ÓI¡Gý§æïón^’LPŠ©ùÐ_ ýpÜÎÆÝð>ŽúI?žM‡ÎÝíwæs7ŸMßûéðzÞÏúóéx‰òMÒrÉo€¯K$¹=ÝVÎ׫åvÁpƒ endstream endobj 1560 0 obj << /Length 829 /Filter /FlateDecode >> stream xÚíVKOÜ0¾ï¯°zJ¤ÆØŽó’Êh©„ª–¶K«Šrï‘Ç6ɲÐ_ßñ#/a»´W.ÛóüÆ3ã´@½ŸN'{Ç~„œ„,DÓ9¢„`Ÿ‡(¢‡~‚¦:ww/¦'{Ç!Húœa‚%rX¤3—ÅÎõA•}¿Ê;!5&Äøy7üšPXDï]„ÃahVNÎ/Ê€y‚€•Äh­DKÄ!Šˆû°.Ð×Éç{{›Táà|ˆƒrŠÂ€ƒþäx€€-°´NbÚƒ;jÜ€:B~RPôü rRIbg¶j»º4k)Pu£%–J¾ñ5žÈbôIÐ`ÉÈ¥…$ıè ßŠvÖäË.¯+ êdûâcä1‚)‹z̰¶Å÷X ¬ëF—:³Ï™Á Ü¥Áª6—i+2½ÿеË"gýZïÊ<Ë a6ied¯òÅ•ñÕæÎ„ÈD£ÊÐÂîÉÀ}‚ã€êÀÏÚt!F?΀]2}â‘jùI!»^@ˆ³¯Édz^ëåµÅˆSøñ˜Ú›\ °øEdÒÞŽJGªÄNuv¥^Q¯-ÍWká+ŠNá݈¬gþÎéªYÅQ@$Û€üíªšÅª•ë3§k·^ÙSWeŠU²ÛÙªí(„nf}7ëÊTv=ιóIõJZà S–gÏØòh„cãzwß•œ‘«R~/]¾Â4O=×µÞvbišNfVÅgö…¸‘z¢hU~•xWk^^ÍŠUÖ÷ž¶ÜIéµRƒ”gJw¤é Ó‚‡N{NdMA}£?Ó yg›Se¤4®} Ëó››è¹ó/óó`cŒYó‘;óûӢZlí¦m¾»MKè½v÷郱÷ñÑSß€ËæÚÿOÓ,íR> stream xÚµWKÛ6¾ûW¹D*†¤ž.ÐÃn²[ (Ò&ë ‡4Ú¦mzlI9ûëËáP’å•wí=iDÍ g>~3CQoëQï×Ùíböæ>åÞœÌSžz‹Ç(%Qœzc$æÞbí}õoU±ÞÊ·²,õ'ù¨¤–uÀs¿mÑÔÁ·Åû7÷Qvä$¦Œdyd¶°æ<u›Þ-fϘ©ÇúýÒ,&é<õVÕìë7ê­ÍÇ÷žù4ϽVµòbRƒ×Ò{˜}ìý>mRq|œ£$™—&Éh~6©!¡Þ™'yâdž3/„gÂÐÓÛ¦Ö­Ú¯Ú Œ"æ |¬‹xê€ï*H˜o6²€ù:Q¨A0[±ÑD` ¨¿iZJ0«¾íë¢j`e-J·“h…–­{܈“4ɯA¤ÌHáp©KýÔ+U<>m€oD –är’ϧ‹¹‘ ¡~UO©g×N±S¬žù;ü‚P…Fßacu’_ÁñŒD<Ãà>k±•“Y=ÍrL·“,Ï2íOšPØÀÚFƈR%hÔ,ÿ’«–”…n²:tü}iT›Ôp”\ï-ÇJéÈÍ%ç©¥X¢ô‚0¡Ôÿ¯ŒÂ«,×E¥GFìç„>—™ÐZH-*9Þ ÑœÞNÉv¯j"ÊÍÇ;Þßüöp7&'u£ª‘öâÓç»IȾKµl´|¢luÉ£4ÇÌ.!ÜÚî+Ãïˆû­~–x/îˆ;'ÍlTYjzïºô ˆ5²R³Á²z{%ºµ¥É7ñÁ½>q=Š(t¾C–’8g”½.°<ó+¨û}ÙaS+\C(÷aùÇ®èû€y-4>÷Z®Qn¥Ý9ë%4ѵå…(7¦A…Q÷qîê"œbÓ™žs!`œÐ,›®à 0ÃÁÄäïŽÔHöHÌ&Ã3 Ó©Äýß7ª©œÉpâdpä4’ÅÇ<—6g‰þ•\uÝèMÕ8Àx@~¹Cd>±{¥þ=Î`ÊâéFö°ŠYî°ŠYf±‚•V°pŒ¼#V`Ò|HÃj Z h¡ éÖí<Tž!À˨LuîKqUûÁvà¡!DCÕ™ÃÛ*ñè¦m¿—cýˆcv~_•ÅQã8™"wŽw]ÚݵÇw†!—èÌNäìt»ò÷¯Ëê #gä^qÌ@ “cëø·„éäîµ]r}Y¸[ËÅõ0 f¶µˆÕ9V¸eñOÀ|WÛˆ‹¥ÿñ¯ÌäMüÚØ»KÔűÿ¡Š~öš*©áz®1RQ;\U³5¡Mߞ̿ѿCßW endstream endobj 1580 0 obj << /Length 1094 /Filter /FlateDecode >> stream xÚµVKsÛ6¾ëWpr 5ÒIðqèÁvíN3žŒkɽ¤9À$D¡Ã‡ @qôï»xÐ&mZ£d’‹°vW»ßî~òjy,.Ö‹³ë8óаH£Ô[o<ŒP'©—a¦qá­+ï³¥Ë/ëg×i4ÒŒãÌh"«s±çMuÙì¥bb½Ìc_0¦­Èý×Ùu‚FæÁ`DlÆÖËßË"õi³Ÿš>»˜Æš{ÎÃ4K­ñS{ÑÉ%¸Ž}ª—Äï–!þ¿¬Tv¿áRÙ#ÞÙÇ-/—Qîoí'£Ï_3ö[*í µß‚W5³rÉšÆJü«vÃ*Xa_R½w0É]­ÿ-0ä…<ü{Ga”^Ù.>A^‡=8*rïѨ¶^•É’äÆ[-þz×6IÆxa¦ öRLB< ~aâ¿c&XW²SAÙP)_Ô.%GQXäЇ•`ëh½¢ —ûÚ«Y»Ò,Kì¯4 À„4ýKóOÆêó•±îŒhg×~¯0<!6¦Ý^WäþÆøé[ý•ù·ÖëNÿR+ úÍj‘,1É¿§Z¶*hfâH’‡êeÿÉRðâ}÷#“`ÁŒÒ™êÚýxgt¡L” „±w&vXvƒ°–7B£«¥[ÁvT°'w³•±ñXZ™ò‚Î%Jà ;(VM¯ä,#fIŽ€á&tÚÏøâ$Ì³È zd[=«ûFñ o!Ìž¡ƒÔÒÁ rK&äf<8 #—°jp,¤sÈûe$Oõ{„Ý蚃c èˆZQÞñ®¶D5f((`’9%Ó^ŽžÆÔôVV.¼qZPiÚÊ“Á=Ÿ’0„¾±A? îGß{90ç@ÓÊ¢‘Œú Ú³Ò}ZƒðÜäßY˜²o[ÚUGS€¼ rX©^88›¾>ž†ÚR—裹 „ËÁ¤÷&¯Ä ‰~í-gqgÉÌíýúæžeÇíöÐôš(kÖ1e(ö|¿£ÍAjÒÐl ‚õÏŠuŠ«ƒÕ3DÄä,R 7"ù9Çn>üS8ö²ï¤ûRéü1ï”ú»­™#èŒ'8àPiL$XsgfSïoÝö{ZׂÕT±÷vý%@²Ìª¥ÑÓþÉ´¿åÌ<íôZSi¸ ’˜øOO1sÂå,KÅ[øg=pø‚ÊA4ô@ì[– Æ–Z‚/0ü›•ËŒÁ’;KÆ!EaeˆÛý¦iHòÁ¿ÜÑÁkï”o/Ïçb5šá)÷ƽ¤5;zoœx¼œA&´Â¼['áõš•?L"wn4ÅBBþovùtsóa.É £ð’…©8I»â퉚‚UP"ƒúHýÝ®¤ïfõkA¡»vÙI¸¥§^+ªÞp+X/*Ý#õëó›ÕÕ1í°Û·ð¨.O´úÊÄC/ÙD{}wetƒ™ÊAUñl·+ýÅ–L4 endstream endobj 1592 0 obj << /Length 1472 /Filter /FlateDecode >> stream xÚWYÛ6~ß_a$++­(êlš‡»AŠ -R'/mQÐm«%W”v³(úß;Ã!eËQví€EކÃ9¾9äÏÖ3öîâõââú6f™—ÅA<[¬fÌ÷=Ƴ„1/æÙlQÌ~s^÷eU¼©zÕÉv1O¹ÓJ9ÿcñÓõ-OΆ>󒔃d}*HçÂ7w]߆þ³k¹Ý "§3¯Úu¿•õœN§FÇŸ .<Ô;AÌ xL‚šå_2ïŽi›Ä^–VÙ_eߊnîrÎáìÜbgBÀèJ×HpYæù~@r„Râáôk_ûu_Ö¼0Aâ(S®ëAŠ˜ò ÖÄXEÞšGô¤Þ”oDÞ%»4õWÍ2"p…ì¶ ,õPÐÙÚªµ-ä“ÍvjÖ¹“í²QòŒùoÓP£8ë´hÖ6APO¥L?!7ÐsmM͵YHêðÐó™Qç­ìDYM´Gj ƒlbZaÓ¡·°’oh@õ‡âŽ+í[,ˇóìÍé;:a€p)ÖëV®ãÒœ•ÎàQ ‘p䢕üºƒBjún@•9yC{@“æjÑÊ)ˆ¨~»µXämcý(°T´pgÞØlæ9QဪOKÓ¥ÀV9B·ÀbŸS] Ã,¼©ð¡ÿC÷ežÅèÿ¼Wt÷þã"¤‹ˆ>.lé9R”¤ÎzlCn=b ¶NÍ¥†œû²³ü¼tÖ¢¦´üôMòqè…Yf³`Ñ4Õ£mAhþ‘‹n ¾B)}ü{m”½)HŒÃÁc>txõü9xJöGœ¬pÑöõª|@•ù$…YN¿ÇÓÊ¿û²•84ê©iÏÄN>»"x+;qó’‹OŸo°²èê¢)ÿèkP³d|dºÐ"wËmþ§ÚŠªzf‹Ò±Z{–'Þê+té9ú¾†h|³ê¼?þ½ë1~O6^Ñ“áÐyg‡q á«|?v]Cמ³ÿØ?6aBdƒ6g'Klt!¼ØÏƦþkíÇ©š%cøÜÔºáEß´û¼Y\üQRÄ endstream endobj 1601 0 obj << /Length 1317 /Filter /FlateDecode >> stream xÚµWIwÛ6¾ëWðåD½2ÜIzpܺ¯9¤©­æ’äQÄ–"U€´êßYÀMf\;M/À ¾Ù‡žµ·<ëçÅÛõâÍM˜Z+w•‰µÞY¾ç¹a”X©ï»I¸²Ö[ë“dË/ëwon’`t3Œb7 bCw®E™X™-UÓªÍ]±Gž…g^úi½økáÃÒ³üþ‘$ÝÌ[Yùqñé‹gmáðG«Ì:ÓÕ£Ž4 a]Zw‹ßzy—ÿ¤I5ñ=7‰|+‰37ÍbFù¶-Êíû"?È+­ÅÃ"èOøw•ù½~u¥ÕæÍÒ ãÌþ§¶ÐKÇ·Q‘»Zñ¹>-cßM!JÞ¨ðQÃS!(t¡ Á¼q¢ÄM²ô%Æa#x3îLüÌõÒ€UùQê\§¦¨«‰CLC"³`³ŒÙ×€íDYbïÚ*')@¥ö¹XúvY2‘æÂ›‚ÿ*y64X¤ö“çƒT’—RäEó‚M’evÏa¹äÇ»›¥ƒ¡gèõÁ»_Æ1º•dgP΋­b Jž”Ô²Â÷†‘Ý“ÂÐÖí‘õŽÿ_8 Õ9hÚ¢KXÅ'Œ¯2ž”ðàI%‹ý_a˜µ*ªýHhhï‹{JŠI”ärÊM¼é +È™À¸âw-örÖ‡}:MŽÎ§él^|öb,†¡±ZÂWëÍ2o^ÏtWßÏîïUÝžÜÍÃì¡ Dtbϳà¿W”+¯foçe«©ÜJå “¾à2˜É›Zi÷Ï SàÍ>¢.îFtÓ[Ä\kùOzËùJíÛ#ø8 0ÜžòÚ×¼•]pQ¼&9›&P»‚®v]qXÝÉV‰ÆD5„bœØ3r&/;FãÇPDW½›Ÿÿö ö¯˜ëG/Çü2m4˜HµI ¨†,àÕ‰ÓFXl4ïíT}|6òÕ4ŸþºÇ—¨Åg/Œr1‚ÑàyÝV¨¤Ñ©0™¬O] âQ8Ô¼ ßí‹ý fZغ¼§”!ÛÕê<ªRPÍajsý„Æ7H0J£÷PÀ_Šz’Áß¾«ÇuÛœÚÆ”^–©_ f\žZCïÅ.Z;XÆÉƒ »ÆÒJ¥‹mÇÕ{bh{}+yap÷EëûèÑ›t‚^IhÇ&¶7BË­aª.º'€!uäL´\–ÉUĺŒKåÇå*¡Æý-Ê×ê\gê÷¢¨¦]8âéd€›™àžÎ‚0v“ üG×´JFãõühý/s+0¶¥h¤™[y¥é”Å™9•\@z…3]xB/qcÏÿ>Ó©Ÿ¦n–%ÿm:M»~“…v?—†Ç±øv–À¹ÍvN&òÑ b`ÐÆ’ÉÕ@ÅÄiT±kœþ(@Öõí/wn€\Išå`+È“F»0‘FÃë„õI?3²4Bí%ƬÛ›8›É¿qrÕÀ~ù'ùpàŠìýíû+M^óÑ™&L>‚ÄY@ T€ǧX}4oQ—¥MNm¦æ^§ê’/¬B{ˆ³ª+gnÀb˜?Àœdý4 R´s.š¯èÝF¦c­ÞÒű(qê¦mÐ’·;£ ñä¤jÔ®”d{ßçÏ:yìw–Ûù}2}|D1E…Жé  X'ðͰi”ÈY1<$ð¸ rrF“ «¢ï¿½‰äd-ðæX ¤{-˜Äò<‘Œ&Ì97Ì^NãjZµExaKšÀC“qöq7þzy”ºPIþ!ô endstream endobj 1611 0 obj << /Length 1028 /Filter /FlateDecode >> stream xÚ­Wß›8~ß¿õ Ô†CHx¸‡ÝÛnÕª·Z¥ì½´Õɇu82f·ýïoü‚s¤"Ñ=ÍÌø›™ofLà”Nà|¸ºÍ®®ïä¤~š ÄÉvN~'Î* ý$J¬p¾ºâ*ôÐÚ%\t|û…–Þ÷ìÓõ}´iÆAè¯ÖØU:(•2W9éú>F‹^zV°i§—ÄR;õsñõ …~¯F€°ß‚e ­*8\K—‰–dÛ$ïÔçÀ|ZêO¸mñ/o± ÷ýxxúüyRtG0œEÚyÒmÅ„%ù¦À¿™”- ?¯‰-_v´ ÿ|¼›Öi„Ÿ“ªšR|ÈŽTLÚ}E…¿énÓÕ~Chù¼e|¦Ïœ].(kl<ûü„ßMAkÛt¸œ$¯¾Ê”ßàšØÖ7Ùí´¿/„oYk‹g›§÷Jv1æ‰98jÒÛ<–Ì‹b? c-wÃË®&!W´¿¥ò) ¯ÇÄ<ª!«àV‰Ÿ®Q_o7Ù(Š@¼I\¥¬7vúiØ _¿ŽcáèÎÂX_„©P:®ˆÙTBÆnÀ€‡Vî/½|ÜxëÈÍnõª¥e£ÊH/© þÈÎC›ÒøµÝUXÂØnÎwd¨×Ù¾ÜK¤C•#™^¦Ÿ9«÷ r¡=Š•GÈöHJî÷½E†îÙá®–¥ÈÏFðŃ bNñ¶2vÇ€ÿÓNˆÉ45Pv¢(Vù’mÛ„»ÝëPæô[Ť8?nªsÍŽÙt5s²êx Óк֤‚2ƒ }ÒéYÙ^õÐÙÈÿ"úœU]ÝôÀ´1ŒŒaÁË>%iȨÞT¤ósq§S}|~Ù±f¡! 5Snn *08Ïp¨€æ*¨ÐÌœ\À“~œÌýÈ™<ïÎ’¢¥[)@(R ¿ÐÞ«%N¨"ºWU;[Ê*VR ‹^s8À;U² I~ÒVèOð]fŒ÷eªº~K˼äE‚!ÜTÚp°Ñ"{ —T†Óž·ó‰ÐÕ2¦¦r»7C?šÁÊøAVMõCµ*Ö·~>ôÃÜŸ {s¸*ȳÏLÁ2 ZGa7™@/tuCƒwÑ„wç÷}ùB¦Äbjú3´â¬>ÅU_J…ŸŒÑì²oPŒ÷¡ †É6õÎa]Äüþž6æPè=ã¡·ç¬*˜P¿íãÕÊ_vêF—ƆºÕ™&ð·—Â@®ºéŸ“#@Ç?# Cç¹j¤„榷76à°Ù{¥âÙR0EöL‡eQèjõhZGSØ'¹fô«_¢¡Ý‡v?S7”É?¡afÀôhO\6 kÚû“‘zŸ]ý ëk¬j endstream endobj 1618 0 obj << /Length 1653 /Filter /FlateDecode >> stream xÚµ]“Ó6ð=¿ÂsONÇîL¸:tÚBèËÁ\[I\+Xö¥×_ß]­ä³0}‰äÕîj¿wÏÚZžõëìr9{ú2\X™›%Ab-7–ïyn%ÖÂ÷Ý$̬ea]Û¡7ÿ¸üíéË$`™ç&~|Ϋò®b-¿dM.æN°° þªþà…1ÏÛRÔyÌ<}ó‹åìó̇­gùý¥ÉbáfAfåûÙõGÏ*àð7 ޲Ô:*Ô½\‹(„}e½›ýÙó;]•fQ4ÔÌy#ßJ`é”Ô(ð¦štG¼7K}ËÁ5öOxÍ0Nív§6 XÏcßÎñGàO¡1ž—²mÊu‡×äÕÜ·aëÛh6ØsE¨ÎQši£…±›ùé·ŒãM¸=ñ27Õ¶yÎeÞ”‡þöSŸFN æHÝÐ/w¥­ÒØÞtu®uL#;7fÒ§LÃYÁà®ÛyÚœNÊAôÎâ*µEY#VKX¼Ø»øTs~;Ÿ`bCøä¬AIbh|PTrÀLY“øÑbÙœåxÛŽ¾$Û*Nûm#ºƒ;w¢ha´¨Y;É7]EûžYÁ[Þì˺¬·`´´»†Ë¨Šü†ïŤ¾í *ÒÏ«Ê÷wSⓜҥÄùÚAO±.Â}/Ù–OºøÜåã”2._|5›ÐKJN¤µ¬ ‘‰õ߀õdJ51rsQu{‚Øóì_h¹¨¯DW·7oß<»˜¤%÷LQŠ¦ÜºeÁëvš²÷†[‰ãˆôÍûׯ¿B²+·»3Eâ u×t*fá£gͶÛózv+¿è«¯øˆŒ}RÜF‰¼H ¶¦®¿ã]Ã0ÕÂhA£Äž`0ºÒÑ?rA6éÉGߥý‡÷·‚VH-=’‡FeÅ?w£ô û´O!ñ4ª**tT Qᣑ1Ñîh_ð ëªÖxç›4ÅÝé©8‘JkÊô{úVj\œcýˆ ãx´¯¶µhøƒ¦WUÖ†ÕŸŒ¼X’y¥jÜQ+¯+i8.Š!´]`u[€þ¨;Chº €ØY¿ú6…Uúþ3R™Šºéu§ZãÀA¹Ã€i eml1j1mUkZO²ˆ”V5Å7 ¾ee%¿¯¹sÔ#ôö`}÷@m¨½#È„$"÷2b3C@Klb[V‚z»f‹† D#ã¤Fv{d¿&Ò†n%öä ÖVGаÙO–oV£=´>GƒzŽ`Q]Pߥ‚ŸÍ p¨ $œwe?, iŠñ¤G„Æê­ @Ù ©™É–óCug¤ˆ=Í&´ïÇÔÂá÷ÍHÝOkÑò'€  «(ŽFñ¡bÓr½UFìðþ(ŽMRÒ¤Hž·¼ o¦Ùµ™´ßdÔGãµ´,‚Ÿ¥kg7P©÷RË*Å”gV}j®Í÷íkØÇ(”Ä`‚òm1tN½àjcA,§ˆitÑÐ&0RÃÃ1û³±Õ°fÒ°%!O®s>ÓÓ(¬äÇ,W pezöõƒï¦?*UÜC¿$ªVÀªt]]Âô £%*L©ÒÔ%¯s-Â`&GÉ&M[J2ÿÕ%Šr+W¡Šãl r†¼á}2 ˶ÑaœPœzö-º®œëW`íû‚*y-Kð}qs=p‡¾F£­JZ›iE÷7gS¿…u¨pß¿0 @B5ÚÓo“ø¤.ôý®[KÞ^Þ9S–¾Ä@Xó”CyóDžŸ;mýJO? ÚûBÛò1îËïÝ'þšg‰ÍªŽO§xËÛ®©U‘‹ï¥ð¢Ñ0©ª®ìƒ¼æGú®J©QUôŒ‡àhÕ’ùD%WŽO '„D]]ÝüS×Dg¤ØMæÃª#C>—?O…ßOäìÕð¹y3,þ+BpôSX¨&]Xhø`…§cE qç;{ºÒÛ9o„”£¨…‡+1/ý]°–a`LhrÇÐ0Wè¾9 èá8´¨[ps’çBÎrǺS}ÂnX<ðÛHFðÉä䛑k°Q$JŠ ÕrØ Š%–bfák÷ÉY“ö(~êK:lÙêXÐ*9¸È49ø6Šá~c˜—§…Mø“s•óª’7&UDÄ1ÕS§²B0émrñOðÎgijÑå|n> stream xÚ½V]oœ8}Ÿ_aõeA Ž1R¶jÒ6U+­Ômf÷%*<ÃH0L 4íþú^00Àt’Jû20—{Ïý6ADлÅÕrq~-\à@¸-׈‚ȧ  eŒn­×a¡þ ËÈv¥•ØwËç×ÌqB±/@6êŒÖ: Òr~ÍÉ@Ùé´×!36—U™äú3ñH?c€ÐèT*‚`Pñ)_Ù0Tº´Ƙu‰Ûg¦þûZmËðÌpç|ê°ëvÜ/t¾v6¯ÖZÅIUF Îõæe‹0rˆRÙ@8Œb)¥ºQ N—pzZä³îø%X"]ÿ5¯ŸšhñGœ¼ u”Çêýnª¨Üæ»âcš—ü9\tÛÄâ¦Zª¼úqŒóhÎjCïÞ~³}ªŠ›æ \’&xç À%Ï`ÅaÖ‰±_eÑ—" ÓôEW`ïP‚¯¯Ä4ªÒ°TÇükˆ™íx„XW{åi•íŒäO“A ¹\`Ï] üÑ—ÉA…c~(ðµ˜XÁÉ8}¥¿].¾.h“.Ú· —»„¡([ÜÞÃGˆfD÷j†8t©Ïk¼Ý,þ~0MŸë ¢*8EÜ'˜ðIŸ'“ZÞÈÒŤFßaž´Ê¤.yÏ·"Û£`q¾6ÏȦVêæ[T*m¤ßT-ˆÊ\„ƒQáѧ„¸LfF‡~ò©kè¿QE¤·ûº‚ž3sS±é.Æ­Èx¢Æ{xµPw®ƒè›íú–ê]ÿUÏýS„uzÃ=LºOs3ntRÒ¶KÖJé)|.õ¦ÊÔÎf®U>>~ÁÇP˜ÔÜ(ì¾€’ëgôe>iÂgbÞEº&Eéìhº ù8-É‹¾\ 7@L­¶jŠ$¯Òؼ·[Íüɺ‚Sñ\Žn<æé_;V˜VêIîvưÂjã–ôZçÙ\˜¹µ×ª€jA»~·» e£w¿-ÇÝÂŽº…lN(Äÿ}µçFñ—ÚÕ‘©{çÂ1Ϩ6ŸÙ ÂÅ> ÒSwÃëØVs+ÆÅœž¾ªÎf ê7ÿ Dh0Ba"3öÛ<Äx¸„<; |ºs!•°ú˜p§Œ£ÙØÝLvÛœæHAç÷;¸<6בï£/‡Šª9> stream xÚíUM›0½ó+|©ï­_‰´RmÒÓj,x  )&öß×`Ø„4Zu«¶R/x°Ç3ï13r€ÀÜ{·ô¢•@A%ˆËG€‚” 1†‚*°ÌÀOIp¿¼f‚yRÌ¡ˆ‰Óù¤)ÌõF¸Û!‰ý,itì„U{ÝC}ÒK­‰~Î'$œp®½»{2{x 쑊Á¾s]f!IF­]‚…÷ù9ÞéÚ‘bì˜FP0 g£x x„Ír䣋ªßë29öí“òØOŸÒR·¦ô‘γc2¤^Âα@gJ#€XHéƒ6i]l›¢ÚŒˆËƒ HhÿÞZø”úeagUíÊzBÝÖÎèÌYÅÆ­©.Ëp`oßk×Ú˜à ì°ÍI±…Ì]ί&ÉõY°Sðã2àå´‚×’Î%üª^'Í«~¦&°­¾o•;øéë´©êÓÆáC6>… aßœmÅ$ª TC#ÎÕIŒ©ºK‹vâÜæ¾hVÎZ„ÛUbôϰ„.tˆ%T¤'œ“õuH\@"ñË1ÍɧªS0’uAGÅ[T»:½Ð2PvTÛ×Þür¹qzv«¦Ùš›(Úï÷Ф…Þ¤VueU%&²ra'_DÃY’dˆ#|]Ũseæ·ª% Æ Od×)îDnIÒn‚ ä4¼s°ên½ÛT—ÕŽÚR‘×Q;"äü¯»7ý•£Þ¸ÕÙðáìžyZ·2ñÐùV¥ù#J9é’ÿ²ùÊæ¤vÔºVþ endstream endobj 1557 0 obj << /Type /ObjStm /N 100 /First 952 /Length 1499 /Filter /FlateDecode >> stream xÚÍYßo7 ~÷_¡ÇöE'’ú9’Ù l@‘dÀ¶ nr킾ÂvÑö¿ßGyIøÒÉn ô!0ïôI¤Èu¡Ø8C!ˆñA½)¤¿x¤B4”‚O†¹è›b$) S¼¾ˆd|ñ&&¼›à™MÈQÄDat4«Lb¯B4)ÖÉÉdRÍ1›U5^WUgS‚ªNxí"MJÂT : ʉ7:ÄAw c\TmRÛ½êMx”¬Š ^TsÒé- ‹^§f,s€é³’ѱ”ÔÝ{fµ"cv®6gŒR[u›%$ƒEÙ¹Š‚›\u ô²+º5lÉÖ‡o™W£˜!QM+b°5Ndõ3¤©èzØGÑ+GUŠ3¬VRt2F vÊEÒ¯öÃÅqVJꞇ ܦR€„ @ŠFØU\‚` "®¢2$¯>-ºÆúäþ:J ©èL‚†èE%hˆØ$hH¢>v˜›ª +gø¶Àµ¢B$À"GYYç]ôª O¤ `©'%`dŒ²ú(2CòªAñ\t[ b[g$pr5êAèTçã Âàs¨}©¾¨¨´Šð'¢ ‹€²ÁÁ7B R¥"BÅ{”w0Z™%BRæEdLóTÞUæEP-„ºÄ)¨ê¶€sºˆÇr„†{ÕJH,[‚: ~‡Û“JÉ tê^l A)“ƒƒI÷ÊœÃ}é{bº?þü 9â¬F Ée±ÂìãÍÍÅäÅ‹oƒ½ËØiÛ´65¢…m„ÛÚДÉBq}<Ì–æàÀtǨ*šiuÚ1‘«81c«‡¨ÉOwCC|;ZÊ@,ß½™—§ýÒœ›îÍ«cÓõŸ—æNóÙ—=¦ïûI÷Vô³åB«“Óù“î¤_ ç—ýbU¨ê»ßú«ëéÑðÙœ+Hó#¾€¢é³t«Éëž@ðïÿz=ûgÒ ó«~^wÝ/Ýëîå9Õµç;t+> stream xÚ­V[s›8~÷¯`Ò}À3EÖ !2ÛÇë´éØY×—§¶ÂŽ1^ÀãÍþú=p Åmw2déœOß¹ê`#4°ñ~p³Œn5\ä *Œõ£A0FŒ Ã! æëÀølN&ã»ÝJ3WaêåQ²~]Ý2§¡É1AŽd€«u+d¸ºitËqCت¥-êÀ&+u6û¡Å¨x¹ `%™™=ÇCØyÐûÉ6ka¾`·ˆiXD"Û.A×O ´3“í6)¬8F»°Øâ6þðZðXì©´R;ìõiMªJ“¸"HiÁ£\.µ©¼EG ìÖnñ}ª:gHÛI•ªE1¢/²Ëú¬‰¸}ºù %ø›»!]¬H-<ŸÌiGŒAüáëR â Ⲉóm4ùYBAvr„™ý34g·änÑET"&ÝKLÁ³Ò©&ÓûÅæ"U›ƒåÎ/P].†ŽcŽ»¼ %@ð«nåµÀâÏÙ’Ü\dË9¢¶¬ØòŸ`{³¼[î`„÷¦:_.fL\lŽ‹°Î©Ò¸– Ž^.ü!#o‡Ss<|Üeª‹8æ½Shq7_Nß_ŒŠt‘Äö/äЇû®˜P‚(w{WåÇźBiz[ôXÝ:WÉ!õUg0rtÏ+Z_µìj}­Nü”çûìz4:(ó#µóJÒp$ÑÈ{ÈFC P1ªÏ> stream xÚµXKÛ6¾ï¯0r’˜‘Dê ‡í&´Xl]ç”ôÀµh[,’wûë;ádQÖ:ö6…Éápß|Ù¬&îäÓÕ¯ó«w·<š$, ýp2_N<×e\„“ÈóXÈ“É<|q¸˜þ9ÿýÝmè÷$¹ðXäE GËÜÜ\ÿVLýØiÔª’MV¸çÊ5'½»¢·yÆ=΢@Lf~“œt|cË,oT5®ëüBûë·¨ ´ÌÀ¦$H¶^È\±\>ÄßÐB*ùftcšmjÖ”,+ÈReŸöùîntÛ7¶WÙjÝXÒ­Qae•Jw ŠÓG„Æ¥tôŒq÷åf n6•:Óþm¥jU}W¬¬ÒAÈn¯ï?Žnú®ª§²¶O˜?|fŒééY¢3j¹öÕ <Âpû0ðb@@À¢Ä íºZí6ª˜rßij @ÃçP¨È‹cRT>ý¥Í‚Ò£%±ßÂ÷ÚXgétÁ°VàQí,$eéáœùnÜŠ•O¥ÐçžÓœ,ÏwÁx‚ÿ¾‰¡¬kù|¾Õ÷rÉáœ;årÄá²Ð :[Ý•~Ì|¿«ã¬ …ÍZhÙ(¯ „dq:&¾±Ø í è"¯/‹JÝ…E?s9õ#çù U鹬q0æLxa«é8`Y 9Ì[Ye« Á¢ðcñ¤Âôú|ÑÆ}È6Èöá´Ö”è€peU3s¶eo¡ö=vzÞô‘1YüUJ‹@µª¨á™ÓÄKGþØàJ-U¥Š…º$ÊæÌÞÎÁQÏBŸÿpöBŸÅ·]Y*Ùì€/ö仆ï¢)+ y›ƒNaÜÙÕŠÄ–$Ï­p=0œZ”ÕFæÙ?z7Û¨f]¦g8D÷"‚úZiJ«žÎÀØ´ó%}? 8wåêw@ða“q±„‘ ÊãÍübpaKp~6>´¨pÌ ´kˉávb¢KÓ³¿ë›Î/äݱ𤃬*ÛY,ОuY õÕåbäœØoÖþÙh5食 tÏ,þÑ%Øgô:_Ø`?nÏEºFˆS ClT *¹8.WòZóÈ|×;BèìdˆA'ûsÐR 2Ì.GŽÍÁ¥8™¥í®ýZ÷ö¸9Ôlo²bÕÃ_Lø;›£’:ï ù©+n`7ê—°pcíNëÆ r§š‹].É œ8xaD5Tµ³ ¨fÓYFÎ|Õ´¾ÅXWm‚nb^tñ~ÞïbX:”¯¾çž †~ë_8^âÔMî¼…ï;õ–,Yd³åót™ƒ·_0qx…ïkE½€4­«´iÀÀSÒ#=D‡}²„¡þ\¡ ‰Ì,È< “}) hÅpPV'¢8£˜ ¾bñÊ( a_Ûpƒé8À{^h¥‡Í\Aï?î¯0ö@‚ö—]è†Ô «2LêÐ2:4yÐ.ê9â‘ åӣጒÄæK:f1÷O!½k¾»¶sZ½Ÿ‰rúÇaÆc—̈ :äd‡S°Šq“z0 Káe¹Ës³®?g誃a½• Eú"q Û@³K#WoÚlwštG€Þ§àÕӣàS·KÀÇó°I/¾;oJJEUæm7Õ±$Ö“,Ò}–6kûR5‰Î'¹«ëLšü~£v§Pù €íËń㲭÷‡ÒÙÎ=öŒ“Ã×13é×%­Ùmn{wÀE(îüñ#ù‚&ëu¹ËS<,À'žùf *‚Á)xˆÄ‰úý+8ôð¯Íw¨GU‰&ìq¹¶·R¤ ô¬_–$„™ôEƒ­Ìª}V‘‘¢<ú[¯Q[l á9÷jrÄxàb:z¿Ý‹Õ´rt9㤤þZ«k4â –uv©j¬æ¬Umþ:úWîãüê_ŸØ—š endstream endobj 1677 0 obj << /Length 1262 /Filter /FlateDecode >> stream xÚÝWKoÛ8¾çWéd bõ~Ûƒ7‹i$Þí! °ŒDÛêÊ¢AJI³¿~g4”b¥JànoE€g†3ß|3¤ÉjâL>ü±8x;¼IÊÒÈ‹&‹åÄuæÑ$v]ùéd‘On¬““ÙY5õ«+ÅëBVÓÛÅÇ·s?ÞÑ —ʼnv[?D™Çœ4±}'b‰ãNl/Ÿ¤Šgfí I-%tSÖ©c-•ÜÐgNê¸GQѾ’¸z ½/NèÔkA‹¥T^“”\Ò·~s#Ôª›òZßÐ[ðÔ†¸Ó0ì¼ËÊ&ùÔöƒ}mG´A¡ÁK& #¤éÕÀ3vP‰Ræ<²{ºó Eßg~tò˦Êx¸9ÂŽ$b>ÐÉxÐåP°xÂdà¾íE,Æàx†“7GîíÔº:0õn;ÏYêÄCÇoÜ# AÐöº‰?Hwd$=”ôÐ¤Û ŽÅp³$J‡þ|^Æ´ ©„„¹lÊœ–ÙÔµx”v-_\+ç5×¢¦m¾ñʈû´®%-ï`H:ES2dʵ°r„QûâøÒ5æ|žVô½e=êReÙã\_Q%œFÖW‘Õôa·FÛZ€oE½¦¼÷q´ b½é…q@¦Ï–´{ñçù¹áMëªk$í´E—µ¢;¡,iÖG‹Ln :7xSK`s‘ñ²|Äb`ÏjkÈ£8bi‚¼N™›zäÜ0ê^0©r¡^+M£m(ü^š &vÕe„ µá´X†-–ºò RºÏhEºø×„ºl+&‚wÌBÁ-/ÔC¡Å÷ÉFñãñß u'µØ?ðKÕ3ØbJ®”è‚Ò?ìclÿógjÕl¹`@ÝrýœPB#ýÐIXôÝh^TùYÕc8«²µTÚè9ƒFäøp+ºmÝ„ÔO©ñêÑV6ÚÚ°M=IÐ( ܘl½y„Ú½@VáD5Õq_S”«i7FîR‰­’™ÐëwDNÞ}%Éßm¯Ea¾‡ª=>>—<ÇÞ‡Û»M¦3~Ø5ðK77‡W³ÃÛÛ¡I½- ¼–œ]‘#Ú[ÒðŽøí“¨×2唡ñ ¼ÅK(ŠÎQØ[3ûW¿+Å\ðºbÉFò`Ð\þ×áWMuy2Ñò ívä1yœ-kì8Ýî¦Ô ø h, KͲäBi¶—7ÁÅy«dÜj›ü0AæÈM›¦Áfû ìË„ HåøÙѪX1%òÆ<]v,n`æ€J<¼$Õ‡™³¬U °ë[»ŠóÙùõi´m|û“Ì‹åc{åµsÅ!^AE?Rj>\-Ÿ¯hÂK-i¦·"{¸vÑf“­‚é)±¿ÛâQ׋þîÛÕ“H¯±^àÆÛþ4bÊáYòª¥„ÁS°¨÷ðÊU‚kÝÌè7ÜÅÕª6¾ã£+ªÁo@Þ\.¼ì^/¢_}}v5=Çÿ)nöAvì¼>Y(^iü9# $øèÚ¯Û?龌ùÞíWË"<øãP ;ü¹,š4žVxÇ9»y§÷Ý£àtqð?Òÿ endstream endobj 1686 0 obj << /Length 1233 /Filter /FlateDecode >> stream xÚÅWÝoÛ6÷_!´–€ˆÖõl^—-Òb›Ý½tE@KŒ­B®D%ËþúÝ‘”b9JjïeÉãÝï>yvŒ­áïf¿¬g‹·~d$$ ½ÐX߮㟆Fäº$ôc_L?´¾®?,Þ†Þ§ïÇÄO"#yÞð¢xó|•ÖM^mñÆÌÑz®Ö³ï3HÇpaê$FZξ|uŒ ?p”ÄÆ½d- ("ê]«Ù㯴ƒÒC;\‡„Ô5ÂPþ Á¼`$À#Iìöæ­R+pͺÁÿܲý 6aÇ3yaÙ°Uè-®Èý޵¼•¦­§!ñzŽõÊJg"Z¡ǧ ꯼M›|/òºøhè8â±a»1¡4é-­´Á÷Íü¥)m†±Q’ü(%}nÙ–OBx i¼#HÇqûË ”+¯øÀë’$ÐJëÍ7žŠ yìŒZrË™èÞNo½ò†P1¤¢Áh;Žù³ú|ú|}=­‰ ’g¼#ö·ËëÕÕ$?!DnÛ±î‹ÞÖè–Ͷ+yeùž)Ú½þœ·ãCÕÆ(e¢JÃëKc©òbÅ»† E×°84'äŒ4ÛZí‚Nx¥³!ÜY^l‚N(SXS³¾Uûƒ@¹bm[[6p¦9> stream xÚÕVMo›@½ó+VJ¥b)¬÷›ÝH•ê¦I¤JMÕ˜æ’F1kǰšŸßÅ.8Ž­\UvXöÍÌ›7 4C]xŸ"ox®2Ø(¦P4E”Ì…B!¥Xqƒ¢Ýø§6MK<>¾æƒ€i?±éà6ú2<ça*Å¡æà¸ñ°>ã‘6Ôð\¤á°õဇkªPÀBØä3cžÚ¸Z¶’ÿƒ[&<³ [¾«O4Öqí<”`#ÛDËèÒ­ 4¨“ ûøŸDÒ]~ïmœÀ3òØs»¼Ë&¿Ê,NÓ™­bœÄUÜõÀ(64tŽŽælÑ8ºÌ+w_¬kˆwy$At#„” KÉÐ$ónn Jà!8ÇÜhô§9š!Z…¢.|ŠÆÞ÷MÉ·×FmP¡£6T‚"ÉC¬´~¢v+tGD%{p†¦kÅ/,âR×€õÓú6ô/ãÌÕü†Ðܼˆ¡cBvô­ÐöZ&Ÿm9)æËjž/z4þÑé50Õfš².ΛŠ8kCe+|Pc¹ÄJ ‡ýQÆ3»3èÓ$ú’l%±nœ1w+tÚ}ž8{šmƒ§qÙ¦¥LO e¸è}›y7žè*Ø}Ë7X˽ž* „ƒ/e§›šwçØåŠ1î½$^ú\ÓybÇöáµ¹¾Õht•ÅË]LaÃÆ~¦ FÿU¯çå|•]ÓWRõгUfÎüªÜ;ŒÇ­9Ü\¡‚°5³ÑÂͪüÒUþo;©ž~‰;9·è€¬X«P|AÀ–$üÉ&ö²V3 ¾P?©·„_åmZÕ½-œÙt‚û£Ø9Tp™u+:¶Àšû£´ÌŸ©(\X£b†ÖæÕÁúŽíªˆ«owuµNNÉ÷Ê_²¿Æ -ô endstream endobj 1710 0 obj << /Length 1196 /Filter /FlateDecode >> stream xÚ­WKÛ6¾ûW¹T"†‰’=¸îîÁ¢H±N.IpeÚV!­\Qî&ùõ>dIŽ6+o{°I“ã™ùæMìí<ìÝ,~[/Þ\³ÄËPÆ)÷Ö[`ŒXĽ„ÄYæ­7ÞGŸ¥ÁçõÛ7ל(g(N"àchV²,ïrѶ²ÑÄ ìD\­/l±GNÜy’!œp/¯?co—o=¸ÊRïÑV^ $ƒ}éÝ-þ<ñ;_ „(B ñˆxœS„cösõT<ú/EYJ ‚0&~æ,ݯ dqê+s,¸iìÙ¡¬[Ãv’âèØžð§1bÄêù»TySÚ¢~¡ëQŽœz!IKS³‘¢•*)Ï|K‚-sPoí àµpCÀ Ûæ)Â-p;6'~yS+·ošøMýÚ¨âaWJû7ͼ¤PF”ùï4­L†6¯›F–€4÷°¤¾l5?ÃTJ ‡`Æ,Ž-¼vccñú ×òì¶pë¦P‡RhšoF=VX­/þ1²KË;2f@6MFî µ±ÁU„:mÞ+±““^úÑkã¸>÷ZÒŸpŒ rMÍÆèëû¿dÞ¾ž2Œ†Ož¼¡“7½scŒý_íòÇûÛÛIê}±Û—ðiŸ!çNl]Îd|h‘*¾Ëñ4UÕu»^/oï®&‰¡t…˜¥‚¥E›C1¢Ïµ3bÖ3?aÄ0'ÜÓ]>6Ëfw¬ ¾õ[õÓðy&ll<œÁQyH8Ô@ÚÕÀ;ylDk£½†,ˆ¹?Á`$2tB!2 ¶ùbut[¡Ä.¢’ó…òA¿D(}‰Ðó™-÷:H™J,SW\…²ÕUïtXmäVKHfSrD§l'°‹¥‹LÔ§èÿ nÇLWÈöroéôŸï¬º¬›3ùGe»“5KݸھÄÑ­-ìÆ|y)”ê­ÜB+Bûº«CóÓÉT-“LÛó¢û _ºñ´N5ÝìT¬1.±¬+‚óµ¬jÛïtå‰ß5â°ï#R›[´î¢ÅÑ9CõLú>E.6±«ÉÄÅCߥ“=dʶØ)ŠOU_ï!h*a3Œø6ßœãR(WªÇ–£”ÄxÝ/,ÕHGÊ%§iùq_äZ¿½úXØTƾ8¶5È/rHîo¶iP˜g1ÍÆò¨œ?zÝ#¿M·Î¿Œ-Ž•þvóR3 ?uz°t£À39Ñ?Ýt´3“bçç½pÁ 3ékŒñ ]kZèl÷¾+¾J3SÊO]í@Èâ.áõ…á ™¶±‹Ò>ÿYoÏ© ¸ßɺú¢lŒVu#udëXEº‡S¯ÃÉQH×â±}Í_[È5ÿɹ0‹¬=†MþCq(ëGyÑŸ¸ Á¹h×÷Œ³~ýÜŒqõUT‡RªùÓi ÌxtÒ&·Œ{’lD+´1^î«ü‹ª ž_!mH †Ì&'Y7¡ ‡ªž‰«ì4áHìã4ià 'Oï¸_NiÛ“D(JYG°\/on–7Ëårß á-™ðx6¿–ôi-£¥ŒÎfºZ®WZÍõÍ ÔüïJþPoö,ÿí endstream endobj 1722 0 obj << /Length 1143 /Filter /FlateDecode >> stream xÚWÛŽÛ6}÷W›‡Ê@̈"uëåaÛì E’uú² ­M;*tqEnþ¾3äH–l9» XQÔð3sÎ í³-óÙï³_—³W·QÀRžFAÄ–&|ŸK±XÉ”-×ìÁûMŽ.ôª­›ù§åÛW·2¬Q¾àq"ÑZËmf>íq³œý;0ô™èá£Xr)[•³‡O>[ÃÇ· >¥ ;XÓ’)8A¬µ`÷³÷=ÞéÓú ÔÐáóH …!“hÚ‡~= -xšˆÎX6_„ƒÿ2L÷MÖÒ UzûÌ(HׯYí2c„Hh^â\êò¢pë ©œeVa¹‰CÞ~v#`«³E2,ºƒ&ÓRÓæm®;ýlH8D÷¶B²8òMJjkJû(YA…4î‚àø7Œæ’¥ãèž>#¸r\éUú@’^k+j-ø†åá ùQØÈÒñ¸É·G¡šöþ[ Úx¾Co¶UÝÀ~BJ•ÊéÏyyY±×ßSCßl¦‡Í²o€G²Ÿ`IÅ…öé5SH> ‹Ñœ'…ÅU@áWòª¬´ÔwoHÉÑç+ÇTøQ(ÆYti9©D+šCn4â«{ZuıÕMDºÁ §Ü·C±`rÃ8Kæ‚<¤%²=ò.ñ®“Ø !ßip¦ ³úÖnÄ‹{N¤w]˜úB‘…?ž°f˺á‡'Kîë¼|wZ3§ØƒõŒšÆ»‰BûÕ&qó_Vî mžß4‹Tè°H/^P;¬©6ûêǾüIC2\gm†}íj÷X®þ6eVWÃn8´u DûyមèÅGÈKˆtÊÛº(êuíÊ´Í~…¥Ít3îi%`º)s[øì[힆nGvgЇk´§;Z¶ò:xèÌÔEcìsU<{ÙÕë}[—Y›¯ *_ºƒ·'ZÞç-}§ºm/<›¡¯¤@ÚžÍ7õI;é¶Cà «ƒ+ÔðÀ e»ÏÞw„éòí;uM³Z‡þxd¶ôS¸Hwᇾh-WIo0ºáMÀ… Ž?.Áõ¼O÷Bb%LP²P E2–ÙMµÆP ÕÖ­> stream xÚ­WIoÛF¾ëWÊ¡$`Nfá´‡ÔK€ISGéÅ1 ŠËL¹¨Òjúëûf¡DÊ”*½hHÎ[¿÷½7#l­,l½›ý¼˜½¾a¡£8 µx´ƈy‚[‹Ìº³=ìÜ/Þ¿¾ è@’ÆE ‹µÌe]ÉZðëÒ¡‘½t\øåY–W«_»¶Èy#¤6ž¯³?g±E¶NƒÐCqD­´œÝÝc+ƒÍ÷lÅ‘µQ¢¥åA\¡Ç๰>Ï~ÛÚÛ_Ufž7ÌŒ`xÄ üáx?èå‘X!qdˆB”ÄråêSméCýÌ—ù‘]÷&à-´Ûz“4ŽOìLèíT¾ðªå¯´`–—¼¹~l¥Ã•b—¶ÛÏë¢nUlÓø1†°w|& Õã³—”+C¢Š(Ñ!}ÉŠOæò2·1‹ör;È ¯ØW]£t( ‹¯•êå7ž¶j·ùøÛ?éeÞ•Éz>©xˆ‘,yCÇ‚\5u·FËïcÃy\œ¶lŠ„D6R¡ÇãFð=_>¼ýô0WJî9Z2-ö¶YuPy‡Q»G+w¨bÞü½ñ7 Ô2ƒí35$„¹æö„‘K×XpI€h¼_Ø“=LJnü>êõ*/o¥Ó7ŽKìZ?'Ù·Nœ”"ÏÉñ\õ­·ë[µ>ç¢KŠüo~®û-%OáÔÐ^eƒ¥uQ7Š@êSʋŒÜ!¶™ Yþ3Æ3P´¨ž6 íïbgï±6Ó†ÿ•”ë‚_ø›|…d§(=aÏÉtÐK'çzYkM]ˆAÁŸzNh“ýTmR¥ü?³RµíÉ¡ý"{\ú5€y’€ø­ ;òÐ’O=OŸúþÉE?µÛ®©x6Õ÷±¾ {ÿw'ì¤èøY§é÷[åË8N¶ÑúHuµ¯»Zmo${Ú'ýÒö€—µºÔ(:y»&Ê‹ëŽ8a˜]kz‰ÓO lÞ6¿ò µ­W¯ôœý'ŸzhºêÍvDc´}³'m"I>_/ËôA”IQÌ{.ïËîD´Í]½ÞäUvYÀ¤1'ÜNîÂ8ç¢.ºAä\W·]%OŽI/‡žÈ>ÔúÜ D{ø´ý÷xïî”äCÅ7óûûqôGïÃ8¤(gÌØØÍñ‹À8úᙫ/êñ0; ß÷CNyÈ‹X/ rš°C)òHp²ä[F»‚¹ÉÿR6UŒaé(\5ö[åºÊ¤ÝaǼêƒ?*ÿHdSœ endstream endobj 1744 0 obj << /Length 1420 /Filter /FlateDecode >> stream xÚ•W[oÛ6~÷¯Ú‡Ê@ÄŠ"u6 Y—®-[œ¾´Å X´­M–\Qn’¿sx(YRÔ6yo‡‡çö}¤|gëøÎ‹ßV‹—¯£ÀIY‘³Ú8Ü÷™‘sÎ"‘:«Üù辪Ë2;huuXzAâªu¡–ÜÕK»w‡Fi]ÔÕeÖ6ÅÝòóêÝË×"¨”>gq"à@£Lr”YøÖ„‹ÕâË‚C×wxzK–ÈÔYï?ûN‹ïXJçÖˆî Æµ–ÎÕâ¯^ß´5.J9t‘û,’܉˜¥\L]Dïôœ[½JY8Ò°4ᎇm¾«²Ø/½0ân^ßVÔ˰ñÝý±l O–!w~ð@’Pp¬™6G[qcÀÙÒ‹xàÞî”UVWå=   jÁ<â’†!Yñà&naÚØ=4Å>k TƒÓõÆ.W­"#*Ý2ãø|ŽŸ¥~ò”Q.ü™r ShkõïJ¯›âÐb†q?ÅT_<§§mÿ°L„›•Çì¦TàR¹›ºÁNì¾z»ºð´úB£¬ÊÊ{­4ÄV$ ƶQ´r»Ä2§~‹ýûC±ÎJ*˜Ò‡â¿DQQÛdÝ~ÄIìÖ‡c™¡šfM„¡}Q©-Ì%3i[ƒã°Ö6uù¶á®UYjênLw½§QFM^|ò…ûi#Mê\5#`Ž‚ïa䂘ùݹ×:ÛªÙ?LÁR“üMŸüÐ7~£1ö½¾ùW­Û³¹°€’ @Ñ }ßý…šgo®/Ïßÿól,õaÄêñŽË?¯¯.¦;ì Õì(R#ì͘ ®ðÇ„ö¼Ù÷¸­þnˆZŠÏ„Fxˆ# £ £Ûs‚Àõå[*¾50w}„2‰M™À _cé^íêc™ÓBW†Y_à5Žo«lo¸DÚ]ÖZL´YcÞíÎbgg¨*o–ŸŽEµµ…l„šJ—˜o¨jyÇ8‰CÛÏ“0ŒçÙ8x@w«*¥Ñ +£;vƒµ$ è:?´¿"ú"÷Ü`ækBCÝQÁÌäÔ`Og–‡,tD§º;[¯³&WùìÝœJÊóðù°L#|Ù¨'=‹ÂÓE …½$Öëé€a ÈX¸Á!EGôÐ3~bÖq`Ü$ë‡U‹EÒÛ‰u'6 Á„ßÿLÉœZØóP–£Ð½ûŸ|_sK‘Ï|ÉÇe4½ºä0_0ú†#Ü™€ß ÿ!M]IYòNÐ<)¥}¤‹˜.‚‡êeÄ Ý¦ê;êeÂÂPv’„H´»C$ž1@$.¢:ðÀËŽÂ#ÆáßjT¼]ýŸQÍfÀñæ¯"§R%F£4ôÌ%ûݘ )-zð¶è.=ZMôpiÀ ã0˜¾£.î²ý¡Túñ¯Ô”E²GD ˆ°¿µÏŸÓûî}ÝR§9V?õІ¿›Ð ®oökÖT[ÛwmNò?{Ô>â¹Û©èÞ‹xD àÉØ–‹*Gñ¡IÝ–îÁoÙÿŠ } endstream endobj 1653 0 obj << /Type /ObjStm /N 100 /First 969 /Length 1697 /Filter /FlateDecode >> stream xÚÍY]o[7 }÷¯Ðcû¢+QÔ‹ @Ú"[+’ØäÁµïÚl™]øíþýe'qb{»vm EhÝ#’¢È#Jõ‰Å8ã]0œŒOÑ!ýëEü* ½!ª#Ù„ Xv†sÐ6É;¢É{R %T5b$gIm‚4»$*á}T |ý,¹:6)Ö @è„«¹çS†:Nu*Æ¢T¦å ndõ9©¯êžøú $Ö±dÈ-æC‹ÅeHê\”¢Úˆ†ØÃ©T E¯2”Xý+ÁPo¤ .*,C‚v,ÊGºþR UOŠ˜à½Ú)9XÀtÕP"æ4Ô K $u#Î\g$8UÆ"Ü8rÐ…2ü×H†B[%ÃBv°%3³ƒ-шgG†+*aÓ6öCŠj*ˆJRgˆáß‹fö:„%2ÇÜó G(ÂôFd$À"¦C‚^ÍHЦ‚”4mêŒ )ë ¸Ã…tA±pÅ]ÆNd؈ä5ÖlbÐ0e¤R ¢ÙYµaé‘‹jƒ¢œJ RQû”ML¤z‘ı&F&è…ò^M›˜SƒTjtô >âÕ¡I§BQÒ¥cH%ͦŒrIê%$ÕJ$`AH¡FKO¡Fn£Ð2,@oòu¶j± £åºsØ ä¢.aA~V½°UꪡY&½““^óÆ\¢* õ|nš_ûõä,2Ù¬ÖÖh~ssÕ{ùòh*ÅFdMGtÈÐMѾDûȳñhfNNLs†ÈTKt†ÌD|ñESàå—¨Á¼ÅaCŠ,,Aaó~2\´3siš÷oÎLó¡ý63w¶>üó¥Å‡þ§¶×¼†Ýv4›* ßkÎÛéx>´Ó5Õ±wíðºÿjüÍ\: $ÔDº‚¡þ³ Ëɧ£ÑÚ.<ªþT] ç9R§ôš‹ùÇYýýÓõè¯^ój<¶“jÎ]5?6o›×—¾þPXÐ"$à[ë•^8ZB%ƒ&-* °ÓÐ Óü0þ06ØŽgçŒì``?µ£vú\#µÉ‘M–‘¹ÆßYö>[Ôa$¶Bl@š£6-q¼º[K]JszrR 4§ƒÙõxÔ\4¿œ¿ÕÏ>Ïf_¦/šæëׯv:¸nGƒÖŽ'Ÿšáøºéœ6ÞYï)5·ßúý¡‹Î?ßâøÎ\®ƒ‹³GœIFê3ç"Xsý6S5×Ejªƒ¾l½¯Æ*ø¶0@Î6"º¡Að·tEû`©³' uÀºÝнͨ•c á³Õ£º#šÅæ²[ÐÉ¢Y!GD:.ÂXgo¢É~h’ìO4)-ù%åCò ¹h=ÚÎ(´}hÛ¬k¹$ÚZo®ÿ>o‡óÁV~ÙÝ‘”­ ä¼-àÐà°ÇøKžlâ´“'5q²Û¡NWÁ÷•çÀµßy‚=L¹û,Û?¯òz^åøyUšN Ç•×>¨Xë¸ÿÐæ€åËv¶ý<¸™Ogë{˜vÙôár´hÉ÷ Š­›XoMÅ}ß.–´¾‹…÷ßÅBKv(á°Û)Öá‚Ð~HRRwV{k\_PœÛ·ót8|7ÎoÚ‹ÁxÒŽ$p‘±Ì¼Þ’’M¸Ý`{-.s{øR³¦ÄRl|wœ#Å’+ÇASA›'ѱ°EÂwDsL–r×U—m!êˆÆ=WèŠvÉ– Ǻ+àÚ¾°î]²²x¥#ñêeðqÉ.‚«ƒv¹žK== } ”²èvÃöB½hç“þìçBÉ‹¯Û››õ†Wv!aI›Ò¶ðÇAûh#Ó@³$+º¢ƒX޹#šÀ¿¤#ZoÞkÕ·ó¡wäzÊÞ­Õ“>%íTO+‘Ї®Îiú|OÍBŒÇA³nIgOB¶”ºêŽ7-ÉÑ ²Í¹tD“÷V6Ýâ6¢AïVßóž4‘g¢õÄ#·7‘ë[gí½ô©óðŒNBÈ3}·`‹»b‡VÌÿ×}èýÍxv¸žËG° ¸çÖ½ÊÿëÈYÛŸÍ'ícgjòß¡VWÁ÷ÕàT8: E˾+šÐwFGõÄuF;}“Žhmˆ#¥®hÂÅ¿#–´i}êçIˆëeÂþçIàrt¼ÚêûâƒÆEHWÜ q£M÷ÑÚšèÿQuCÐlzŸÜˆÖWNüÄOæõTbÚ?•8ìJ«àÕäp,ÇA;Z{æÚ ެWÌ®nsÀm„sG4eÂ]åü/Ì z endstream endobj 1757 0 obj << /Length 1569 /Filter /FlateDecode >> stream xÚ­XKÛ6¾ûW¹¬ ¬Q¢^(zHš¤hEšu›C’ƒlÑ^¥²äŠr6Î¯ï ‡ÔŠ^­»FŠLŠÏ™of¾nàm½Àûuör9{þ&J½œåI˜xËǃ€E"ñRÎYåÞ²ô>ú"œ^¾}þ& G+#‘±4 á½æ—¶n»WÕîf_W=.Ÿæ’×ËÙ?3ÝÀãÃùI±$öÖ»ÙÇÏWÂÜ[fòÌ»Ó+wž RA¿önf ǶZ!Æ:ð€%‚{Iœ° HÿK>Ð+vv‡,ϸ£×|Å™_V;Ù¨ªmŠšºyÌ}9C¿<¬{˜ á}ÝöÔ[©íç|XŒ?zP ’L#$"–ù%Á„9€D‚Tz%Õº«öZà1÷€¸.‘y ž³Øì~/ûC×(Ð!á~Mè®ïê”ìé{ É’Ö¬ e»!hïne+;Z =]˺6çnŠº¦^e¶¬ëƒêegæûödo-7½¹£{¸´ÍWǤFWmoça¦%Ž„ßn°´BÐ4°&KIŸd*ÝÕò@K7ÃN#˜í¤d,Žb˜3ž&týŸªØÊIôZÃun׎[ â@ëŠË#WßvõE®ûë)(š¶”î„Aek €8üŸ©y¦}vý¨“;VõANoiѦ¶l;yŒƒéMŒi½Å„¢?kC/ºíây‹¨³–8oö„QœJ ”(oä¡+Œ3µ+P6ñ'pn\˜<ù³{«=ýÖß]‡¶^üÀyM4@(7Ô½»­Ö'·fMK-5-0øì5F>öde,'Ã¥ÛéA@¢Vø0l€BUVeáCà^(oþÐÅÿ?6z(õ£<޲’šx]Ä8:‘æíK41ü4Ql°"DŠnÝJ‚Ü/LÍà¤t2ü±Ìë¶ží¾ÍAÅBn/¢LÖOòÈo;ØBY Îi ÈãÉè*"@ø0OÐ⳨…Ã5¨‡ªBlâDê¯tðJZUÐX+îð§]Ô²Ù¢?ḠÀê nõú¯8 ƒ&ÄjO§­«Í±j¶D¤ !59DúmaLÞx ¬€4ðÕúyÃsÀ ùY°81¼;å-.^9˲Ìâõ×<‹¬ôã0¶Åˆ“LÝ’b",å¦8Ô6k+Ç}Ív›*߈âÊßÖ˜Û?H|hu(*0¶b_ÅÚ)Ûí:iìÕ6%*‘›Êf‹†Z Š †0õfo Âæ‹„Çþò¶RÚyWàf½+€”>=Ò>—j~Ê©,‚YþRKê“ÈEW¬)ÀPkÚŰ.ˆ_çå ¨ÌVW-tB=Þ·ö¶‰œ¿/jÙ÷xB+ŠPŒ|ùS K0±"žL9TYl­¶êäð%\ɪfÓžå)ÁîA·Üy$!Œ bH‡±¿Ý¢ƒ†VUmcžb©»ú’‡À‰qø´QAkL½ªü]ÚajLøã¯a SfkσÖà¨èkÓµ;§”Ö ”íi#ÿ=cÊU6U#ÞHyÙ¦,…Ù@…ð‘½|g,{åŒÁëÅì’Q)û¢ª;OA¼}ÄFê}ÏTõýì•Äþà/‡ò‹&d$˜½Ž¶Òž>$íïò$[¢Á{ñ H9¶yPžPÀ>Y ?Œê´Äy«V½o¿?YÒ# 3M¥èp"÷ÛÐD£)5ÉN#­D§NS?:Õ“G‚è¤W²èH0©txi±¿Š2›»U#O-ÜëâÒ\³íÚÞ­Žga,‹îëäbg^”/˜âäøaBjƾ –¸`Yô…y¤¶õa×8oTNBPó’ŽkyF^ _ä„.|+k;“Õגߊݾ¶PµP@²!àé?«$Ü}bÓ ðØ+7sZ±°·)³æ8± bèÄr©%tÙz‘%^Àmª0É“›W ŒŸMz`dnÒ¿µsKn|¨`È ¼ŠòÔBSWƒâW´‹ Êi þ706Úõ§jË×ËÙ¿¸ÞÝ endstream endobj 1768 0 obj << /Length 2216 /Filter /FlateDecode >> stream xÚY[oÛ:~ï¯ð£ 4¬(ꊢÝödÑEÑS4é.ç,ŒEÇ:•-C¢’výÎp†’%_šE!š—á\¾¹1áâ~.þþâo·/^]§Ñ¢E¥‹ÛõB†¡PqºÈ¤©*·åâà]S7íûj{³¯+»üÏí?^]«ìàPJ‘å Hºí±Â=/B¾Ä_]ÇñÁ¡+¦"åâ*Ê`RÑÙn£÷FÜý˜P˜_‹\Eþ¶ëå•Ê£àÓ×_ÒP×5 öK 4Õn Ûñjkh°ZÊ jWµá…?Ã$,ÍZ÷µ…¡Ë«¤Á¿—y4=Ñ;tH:̪Zÿ`²pI8ÆA¤TDa´¸-IBŒ®Œc+‘¶¶­îzkè'Þk7ÚÒ/º" ƒ;ºf÷}]›’Æ•ÝÐèz™+Ø!8 '‘Í{m5²ÏWÕuƒÓÕîžfÖMKƒ;RÐB–Ã)³eõg¨”i“ ÈGH8èh¬w%ïhsæ7£%I>Ñì˜ è¡åÆaü¾«0½=€k¥ïjC¿«5m‚™(Í2©7}«;kZ¯qZšHñ$U*¸~ûñæ·¸U ¬”{jb†¹)Z¹Ê|,âœ4mI·ŸjTˆ<èßL!£ÂÀnкJ2%7׬ij_7Ö’Ñ`–ŒÓ|$ ª’MãTÇÁí¦êh‰¤¼…ù޾3ë¾É9­²¢$Ÿá´%Ä”o*q¬t4¬Ö<åDqŽ•“c©”Y‡M4 xè,ÍËÁ€1ÍrÁï¾­L‰à?ÓÅ ­:éHœB)T“‰ëŠîRÌE<,“à_•4=ê‹–I¡ èºO×ßuÆÒ’mhnt@øáìa˜X­ýmè»ÍΟÛ;Ç»#™CX%e…yýz °¿$@J<Žþµ1¤–8L¯qƒ+ìÊf‹Î„³ÝEíÁ13Ãû6<`¨áÔNÍŒ ÖH“‚ñ„ûžp£W9@gá<Ä"8î Ø"8e 'œ`8á&„~â4îkxq 'œqpÂÜÁÉýà$‹Ãp>ÁNJÌ’·@pXJ)Œ¿d<b] ±(Æ€uc,ßÊ~#ˆ%ý ÷RÖtØÜ Zœ51c‘ïÄž„£‡¿:6é%±˜Ç‰\µ¾3õÓcÛ€I'[㽄SÏd^ÕKŒG˜³,Jß⨻Ì#]wÌ£èªÿ]ô$Y[À›D âðT_æ…)¦bÅåÇ‹¼"ËΣAQ†åµž­©Ó|·—ù¤ÛNèì®ù~±ÀeKuodDñFÀzKš>Äš‹ßßy¡mz¬p7E˜<”Á‘CܽõÞ4ÛÿŽS, X”BæjnÜö‘⯸¯®÷ýt˜¿uÛö!½@Rª{6ÎÚç“ü­&1ˆ<|‰"¹¡ü)Ç g µfÿ¿üböÌŒÚz¾»u¶m¾™ŸûÛãoå_}Çò;"Ë1­ºüÙÛºÚ.ZOºæ BÄÔsËÍ Š¿Çn¢ˆËê(Ÿ*ÇÕæQ18Øk„`ì;H!+$¢`… ¤PxéqÌÒ‡0_{ãS@žÒïС~8Õþ®Â<;B§ã7¤òÛ/_O5ü2,„L&ˆBQH/G88jpqò±‡ÜÃÄ7ØÔK™ˆâxßg ƒx®ÑwZ<¸JãÉobï|y¾Nùôöd§@ê{ÜÆlß µÌ ’x³å²ÒGëTfh*8éO›¥Á:Ÿú-òÄˬÁJývÇìB•U·¯5½Ã¹ /æ¢Ví¨ýig”M 0 4žÞ­¿îuÑ=ÛßÔw¶ -hú ÂÝÂ?‘/Z¼††_Ž˜”€˜D‰i¯íjóشߦAù€úÔy±– ¥†jñþ™#6š;, ‚¿ ûº~:?í’™*ª½smÓ.ø%? ‰PéÌ_Zcûvwð4Ô^]‘gÕabdµ{®oOˆg­ @N‹ÑœÎf”|ëêøÈO¹uðå‹ÜðºÕXí¨²ÿØø(q"ù晈GçÆ‡îS:Kø-PdPqJTuŽ«mÅEe¥¢˜W•àÐþ½XÅèÊOg¾GK4.[Œ‚þ!bÛ´¾ÖØh¶ ×a$¾_³Œ(÷ÕÓ»ûÏÕwSÓû1”@"lå_é= ¼t%ýÞ£<$Y&‰âd(‡p™ò\DÍ&„= ‡Q`¬ è¯ÔŸ¦BXæ,÷~´¬ž›Vx0‘ÑKÒŒ–î/Ùlýp¢©D*ñï$¹ÈdD´ÿ¹,Òà()œQ’ÄN®*Ë|WˆNÖM¼ì}µF>Ê8ÉJ>åâÆ¸?¥(hŒ»æ$'O a3þ€—ÏucϤïo·/þ"æ¼× endstream endobj 1776 0 obj << /Length 1144 /Filter /FlateDecode >> stream xÚ­WYoÛF~ׯ œ‘€¹æ.ïŠ#(\£­å¾¸F@‰+š¯,©ÔnÿÞÙƒ—[vó`ï’;óíß G––h–öqò~9¹Xؾ¢Ð#ž¶Ühزíxš1òìP[ÆÚî8Æýò—‹…G’¶k¡Ð GÈ\–¹A}•ô·¬lj®1±Ô= Ǩš­®I|xiK„ùc”Wk[ÑÑPöa6`a¹–'±Þ½3Lײô벑¶-~àÀ lby¹L7òü/˵ý¼M½ŽrZWÑšòwgQEÏÎ¥ œÒ&{’?ËeùÇíä0ÿ“o¾Šk¸i¾ºJE1ŽšH@V«|ý©Î£,;jC³”l/"A2åú~›fñe¶­Ê–Œ ËÕßtÝŒ¬êÕ•é_([•5 -fW7ócðîÜÓƒSº,³’}Hó›*K›±Š²£(ã±n‡eÙ·ö‚QˆƒqnçEÌ隸›Ì—“Ï š–†;N»¶‡¬­óÉݽ¥ÅpØÈí!™k°ÞwlØgÚÍä÷£ìuÔ ˜í¸‹Cd·«‰cõà¹#e‚ÂJ‰«P&ž$¨se¸D ….ÖcyT \±M‹¦ä;_ä‹:-’ŒörÏDÅò!þkÂ"Ý·´ Ç÷‘úÒ´^³´jÒ²8XÓ»­‡×p5Lö: øaÛ}( <¶Ã]3°Àz-…Ò‚+‰hÀS$—š ¤ ©‚"5ÙÕÆ­‰[A2é{@gÒÒy&s¥u#wåF¦ IÔó |quÞÅö>C;L…kbYíWC„îd[®·’S† ÿ)Úc뀴͋כ 2t²#b? &ǨåsÏaþñÅï*Z*$\…Ó‚?®¹øC)œ]žËo'=/\JMYš<à©|Q2)9•á(›¦Ì§?Â>ôô*ªë®ÅCóuUK›eA§2^m‘1š—÷‹A|]ÕªŒ ç·ˆ0SÑŠ¸È]E¦H-¥F¡#6"ŽÛ µWf4:r£ª{µ6ôI’-bôÙİF|~‰…â:=«ódž©vSE føtÖª×@0eÇêƒÆ‹èSÂÒøP醎dÙ°|ÿ4 -Q¶¥o饳–áóâ×µÁï9œ½mº»SCh8€vmøÜ„m ¦Ëz 9ADZ„•Ûê !0x'ÃÜß§²ZĆ»$'ŸÎ;ò8êàëVxׯñÀ»— œVàü­½ä„2Ïþ¹ŠŒ6Ç®NÿO¼éó>™z{¼:1Ze0ÙïðûhÐ[v—P7xÌ‚š-øŽ fÚÆõwm$pÝêìGÛ¡»'‡û×g†ÿ¨Œ0ù†;NÖüZ=}7“ß^¹fà"ì0ªû¡°Ûº`Dþ8Ѫú endstream endobj 1787 0 obj << /Length 971 /Filter /FlateDecode >> stream xÚíVKÛ6¾ûWè!2QâCY´‡$] Š¢Iœ^¶‹B–i[­Ž$ÇÙß!)Ù–,{"-P '¾f†ß|3œaà¬Ày=y9Ÿø3N‰$'Ü™¯ˆ2îD#N¥3_:÷nRS"ܦŠëÆk6ª¬§ó7þŒF'ª,À( %j™IÐ^åÏss¦…=*¨‘öH›Ôêl³²!S/ ÷;ÏŽ37»Jý'¿a m3‘ãáɰ…X.þPIcU¾·Ãv‘'¿×yœeÏVÐ×XYÃu§câò#“ˆâ°ó癕èyÁ;:<{õ3±‚Á?Jo¶b±zG³>âz›¥ Z<~5ÄëªÜmGÌ‚æ×Ìx"DXàŸ°‚<Æô«2_¤… a}-†:úu/„YZ›¨ëü¼ «Î}ÕhT3µVÅò C:½åÍ e¡.Å”ù8ÑðŠSH$!w’|rÿ8K8„D@T goDs‡AýŠ˜Æ“9ï'oeh8š ~œT@ÀÁvB°@%9TÀaõ;©l<ìé$Åñ× ª ¡zn”žDnZ4ª¨ÓæÑîÇÅÒ/+;ÏvyZÄE2 ±«ìV¹²Z±]š£2…‹ì0)Àõ/!Ç’Œ´Æ)âàŒqåU'UºmRh§‰èõ¬S–”Ÿ2AiËen:Å.t–ȵ„èóhE¤À¼#¥U2„h;$<}=/‚öúu¼V£¸Ïýè'ÄÀ»øéÇh®?-|„"ÙòõSüLð)¬/ªõ.WÅ”*â5ÌO`=°s)HÐg¤8T²–ÓO:ÐNmŽ”kõ˜’3='~JîÆÙNýd9"‰à%`÷Ljÿ$&©ªýCšÔö|ÕåŠmeó…ùò¾ÜUÉ…„A‘yI,Ûé»'C±išmý­ï×MœüY~RÕ*+÷()sêz­UíSɈˆ„¿)÷æûã6¥—*I—ÊÎWP‹ìÌøb§iaÇý&mZ¹îh‘Á…™-tÇ´X·­Òtá/–'v‡¿·«dÝ}Žóm¦êÛß×i‹Òö€(yé}õZHÒ}!JH¤g·v(ÃÊ×ht#HÌ׿V &bÿ~ó/å›»ˆ¿œÑ;:¡ 7C´wè§Ö#Fq©2þâÿlˆÏÞ7üJþ !tº endstream endobj 1799 0 obj << /Length 877 /Filter /FlateDecode >> stream xÚµUKSÛ0¾çWhr‰<ƒ…dɯC)…Î0@§%œ(“(Ž;±Mm‡Ç¿ïê‘ÄNLK¦pH¼Ò®>­>}Ú¥(E}|ž ŽÏxˆb^€&sÄ(%\(dŒ¸½£hÎs®8BO:4GÒ {‰®ß7x»_}0!Úc”‚¡À÷‰¯¦¶IŸÀ/-«—ˤ©²çNžpf¿â‘8bÛ3;>ÃRý„ãr?Äe¡/ÊÆ¹ÕÞ¹ã2\Vfš=ʘËä^#.uý$ N„B’!ƒöÜr@cB…%㋬§UöÐdeÑá`ËEW)rYLÂ@´¹„spnIÃÀÅ–˜œkÀHÌp¼k`¨HpA<†…Ì]µ­“ˆÙmoê$•½ùîçßÄ:þº~RŸ*l½ŒC<É[º M¹¬´›Z—o\¹lå ”O)þd>S5LÒ´’)l1<2ÓÃäQVp€!¸Y/ÖT.—5)’\vð®n..t¸ÛNÍ®Q`oán\¥«hçnê¿røw¢ÍÅÎËé¨% àáxë‡367ý¨j”£Ëù®v1;Y¸Ôe!R›û7§r©âõnpa" qSšïæ®Ô0R÷à0 éÑSÖ,løÂÔúŠÔTKÀ ÇiˆOa¬Œ´™¥pþöÍ[t 5)Œ梥÷ºi,[¿^§¸ï‘ÈÿàbιOhìt Õ} óì5˹­Ðª«iC#³|Ç÷°Ý£Ÿvˆß©V{QDæÿ_­æÝZíÅ‘:£úè3*£lµl=1¯Ê¼:‡Å«Ê.WuM’d. Œ¤²ºúhŸ|~¨d]«$õxÝ4V1kÆX½•¬nÌ@©Í&u©gˆgP H_}œ,l«ÍÌ«›6r¶i4°¥mIs#äfŸ+ëk7§¬6qöµ™}ުߤññmI¼®êÞ¶´îåªhúÛÒ,i’^G=M–’(÷^é_åIÌSh…\‡G}•,Ï ¢©ëÄÓþÞ ±[îÿ®â K-žC;äÞmÀ;þÍ3³N endstream endobj 1809 0 obj << /Length 1097 /Filter /FlateDecode >> stream xÚ¥VKÛ6¾ûWè(WJ”Г›Í °Á&ñ¶‡$F¢×jõØHd½î¯ïCÙ–¡Vzâk8üæ›çÉ œßW¿mV7wiää$O£ÔÙl0HLS‡…!IãÜÙ”Î'÷•d×ÜVƒäm!¼/›·7w1;»Eƒ°,Fž2-³ ì+7w48öGi?b°ãuÿ¤ÑzqäÊarýruôqæøaN²õj/\€e)ÉAÚb}lÛ®ox]ý+JÏãØ-¹ä8TáE™»Ó+êòw{®7÷¸Yx¡ /zÓ°Íy×ã¸y¸¿Ä1î[ ~ÈÍyûj콘ÿ+N«-ŽÏ}§áýS•¢üÅJu8¶´2|ЯSnsF’<ß›áV;‘’$ 'f ¯YfŒå¼CU*^ãªá²¯^–²¨šŠ€Aüpýë›ÀïßàD+м,U¼Äó)¥î­ØrU[æªáûõR˜MÕ’BÔõ‚h}Óµ**Íw+¸TÀ¬Xî–BŠBê8ÐgU‹#—8Ö•v%w¶ž5¼ÕÑ|À•AVfuÿ¬êwõu_‘;“ÿ€Ç‡ ‘'É)2´”F£ß`š¼Ñ{{-€~ÆwãÁ#õ¢Âëª>Œ¥*^/ÆàåF‹!Œiš¹EkGåÁl¸¶îç`v_=?IÝ¿´@!ÑqûJî¬Çq¨;Ìoð½°©\(Ù}âøg<|ôÒr'›§M€˜é~'z»Ë-ø“[õ ÝŠy3ºUŒ£bÔu œ…Æ}|µ¹ïJQ“ÃõÖi,”¶@EèwQehÒ1rНG°ÇRÔs+$¯êùVqà¢E¼ëZ_µÕ7¥ `H1ÎLéftŒ3ÜÔ™?à9,œz§>† wIt|%îƒõ £løßFW§ç© 1©CmÛÊ¡xÂíºjŸpmÜ:Í[Õ²êZb8x½Y}[… 8á±Ó8 ! ¢Y}ú8%‚癳7¢CA%£ºw×ÎÇÕûï¶]óW˜v‡0 )(§a±ïýμ’&“ëx5ã⃥À ˜œd&a(Œ2œ—¨ÒKÒ„íÇóqäv¬Úg%QÐvtØ<ë'ó|ÁÑ| _ÈK0ó‡ŠÓø¡c¸E_=¼KB6´ìfÆ"EOÌèÉ6«3VtŽ×Z¼7²2ùçœX¹L< ã<éþ$~ø;»î—6’ÏA40 °'t¥Ͱ;„ ¯Áøÿ’–s„t}e[OØ4sÙYwñºP:«M¿Ò;S§]Ū/Ë莮^ q#ç ¢ÒUkëÂN»ÚëÙóñ7ÚCÍ•¢·+i¿« ö´,v'¦_Ó-þðòе?“|ë¹<»>iÖJîº^ù0ÆðÂŽõVpë«;m=Ÿ/!PÑþü-p… endstream endobj 1820 0 obj << /Length 1192 /Filter /FlateDecode >> stream xÚµVKoã6¾ûWÙ‹ DŒ¨·€önœÅAÚM ÀeÚV«WE*þúÎT,y•Ä9ô`hÌ™á<øÍGºÖÖr­O³_–³³K?¶R’F^d-7u]â‘SJ"?µ–kë«$óïË_Ï.#o`é!ñiû(›‹¯Ú<›{‰½»ù½¨%ºÌ\èì2p¾Nïìx1,úz‹Å#+›‚‹‘çK_Ø1°pŽ•wb94&!£öZ3ɾ¹¡{Ò¬ÊìOQ²¢8ÿ÷‡º$ MyæNèºößä×rÖ Y—Z^çB²*3š’É6œÚ¦dÕŽI0%cŸýÝtU&óºÂ´OõÚ“ÊI‰-—]«”¢+ñÃVB™:ʨÿõ‘=JR(ZEΫ¦“KGüÄå¹ìéÂ4cß ž¡–ȧƤú³þœÜ\ŸŸG9RŠŒ\E{±£/ 2îÇ8³ª¿¦O˜Û¾†Ó¾Ñ‡íì£ÍËÙ?3 A]‹>#6Œ ••³¯ß]k JÈ‹øib=(ÓÒ Ôqàƒ\X·³//bKÀk0P]P+ )I` †Ÿ„{޼=’&t?*sÇ›Ukb{Qµs‡Ú¸•^hæ!µ™Ü=°'mzŸ‹Žù¿ ¤—VʦmúØÓMñSÃ|½£)ºxw‚Bh‚çÌ]p‘µy£ò™š×C^ÁùL`>ƒA|ßôÀ°={hMõãÿ‡¹Û ¥'­8ì,­ö}8d ìEÄw 4ïÛòãæµ §Vƒ*:s §ijÃzõÏäéóœ TùšW’ÐÑ|]ß]]½bìg¼bŽÌzd½¼¹[Œ­#m]ÔÛMFä®åbWc'8óp2„"ã²)Ù#ÙòŠ‹I­äB’NpÐC^dõãɤGCîYA²NÖ›ÍA²n8YaVâ¸\õ©*&Z±ƒ¤^tªº’4ýÀ¨;i®¹^µ„Ïäh|.ϯn“n„µìL ¬'Ç·ðÞn»’Wsß³åë7íø×°> ½ÑÌǰž×³Þ5+¹žÖzc¾+(8²Õ6j!+SZ¼å]Ë$9|D rÌþˆ›Æã‰::­pUýwAÆ‘¹Dö1ÄCß‘N2žÙÿ#ïýÝyf…£óùM3<@(°e­¿p7EÏÈ^©:±÷ŠÀÞ? ñ~+çÔÆBbDžÒoêV €°ªaõ·â[`÷{ôäzEÝ(4ÚRäc=Ü'£8‡|6xÛ°BðSƒ½ª0mœØï£þ‚Â-´„dŽFgk–‡Ý€ÒøúÈcñIÓôûöé8ø¢Í;ä*/sœ ˜%¤Ò¼Úš?µþª.hña—Ã!d˜èN¯@DutØ—ˆÚúuá)ƶîG ¦Ñ2¦àLñg£n ”×ù7×÷yËñí;qxKB­ŽzAê—o@÷í¤¶‚·B (¥Üq#<#¬Ö Û¶î¡e¤üâÃS¹%¾çYWH­È!Üf'4&Ÿ«¬…R°céþp+âq Î×f8»FU¢ˆœþo¶êzvcæµRæz°S*û[÷ÙÈ·Ã"¦¸yÿ§cv endstream endobj 1828 0 obj << /Length 2491 /Filter /FlateDecode >> stream xÚ½]sÛ¸ñ=¿Âs/¦:ÍoR¹''v®w“ÜÝØÎÜCÓé@$aB‘:€tìþúîÀ‡N¶î‹ì.€Å~/œìN‚“Ÿ^½¹}uþ.‹NVþ*‹²“ÛíI~œd'yúY¼:¹ÝœüÍ»¼’µVå"*¼ýõïUÓ.þ~ûËù»8-L‚ÐÏ‹¶¥%É i^ö ÷=—$£E˸ˆiÕ2ÊóZaŒx˜,tVžù«"rG]9²ö°XÆqâµ ~c¯3’ªæïF} âXjY#u«DÅ ä"ôîËÐ;jiŒj,y+M«êÝ#>¦ì[F–aê§qÆìĽ¿“µ4Ï¿Áq¯ÈTwà³Ã'Z/–ð+5#š-ùæ³ákô÷ÆÝûصSš‘ýç_,e.Q >žòì{]ʺiŸ_ööh«&ØmÌ)Ì_,“$ñ.azw‹4õ„ªÄº²7kŽ-¨Çî'´|ýøñˆ•ÂϲbªšOQ|‹{9æø¢ª²AŽï˯áàUêý¼qö”àõ9¶®­ ¬ªª™zòžlKn˜Öj‡V½-nø$l@˜÷!PcWé¦;’U‹KðÏUj5ƒV‘$¹Wʪ‚c Ï:ƒæKCÁŸ?¢ñR¹wvž$™w-êÏŒ¾AóÃëGŸ‚4ØÈ­èª†á‹e€*œcϼ‹=a+L;Ç¡:+y°rmïdë‘ãþ"r¶ ¶Î†M+ª ÷ M/YoËbIò_ªú•:(ñ( s6cÉ}^ì*µÄ»i;Çþ©ë—Ô¤½¬ k¹[«º9P‘œs‘ÎÉ™·qÕ䣿K(.—ói¹œårNÒÌIšù8½Á¾ãô6cœ½l“lÒYPßõ} Üid¹ˆ +ÒÎ)-*õO╪¥Ð¼˜ªÅÜÛÈÊŸcæ£kÌ›Ú?† Ã~^®…õpѤ5/[ßr˜n”1M­mQk[¬æZ[@ÎûbÆ}mõ}- ç1“@G«¾Ùׯi¯::G€fJ0d|†L”…§,»Ò•µLÃ̪ö³êV P=sŒýßUöþ½-â–4ŽiÃÁt¨f§ ù Ðr7Ê ÿ­ÉñGf×”(‹Vꃢ,ˆvÜ«{öîC§N]7dýc1¹*¼· ´îº+[òåˆø’j`2 §LÂ|ð$^»Ïò@i\Œ–쇇9y33{eVa8¤³à;TV8ÛJVòDÕ-Ug/ QÏ&Á²9…î_âúf×½·‰þ9¯ð:jû`6X }SíÞ>iñªJqÞ­¸ÉÌ]“idW¤´.¶6Cÿí¿¬~¸¸¹}™ˆ?ìg"FìíàÒšk³ÐëèéöÉø‘‹QºøPÁŸ=)Go°?ÇùX=8o½†4šxF@Ã_S^ÿz±4òOžb ðÙƒ>¶ £±ôóÊ’5zdKüLíæNN_EuçMösy5y ~ályu#ÿŒþ‡JûZïûõþu¦ÈÆ™"2EÜÇè4æ–;eÿJ9`:W)ÊoËãñƒ5QI3ÙfZ3БP3ÌÆ+.$âëKˆŠ ú~ ˹0OýV@G99v9øQdÞO’[%6úƒdôÕ@D}X‰gé¢ L¨÷»åh{Ù) ßðÍå¬·Ô vì+0ìîh“ª&HLqU]¹°ƒÌhö¤×ÿ¸Ðy3 ­ô [3H wÔdæˆìÆÝŽÞ$‡’¡ÇXìZËYñ–ÖäØÅ1•,_œjÑJnj¢"xª.)û.‡+†Î ðm†Çnúô²ö·-ðåʾcãÄ4OžÊ`$MH»,¤tWjå•’ÃC€×<ƒü<üG„€ñ5aŠ×äŠ ¨}nËÖ^0¢Ô1ö@Ö0¤ž':lÓizKïfŒà¿›¢Ìe=dkÖæÌv£•ŽÎ>åójö3KÕ—ÉÈ #÷M‹f¥Ç•ÿ„‘‚Þš"ŠåPÖ´Góúü|­˜—²©7@Üh¿Ñ»óG±ÖœkI<äç¼Émýœùô{зþ3[¥~>úÏìè߉Ê/»¶ÙnŸÿ¿Ù[ G·˜f㯢çÌ .ØÂë{ÿª,›ê;þ¥¼à³*åþ¸sm?lÓhóÕŸyZµÐǪi±é¾W·¯þ }æD endstream endobj 1834 0 obj << /Length 1260 /Filter /FlateDecode >> stream xÚµWKoã6¾ûWè(1C½¥Cm“,Ð.vÑÄéewŒDÛÊêáJÔé¯ï ‡’%ÛIìŠáˆrüæã˜[k‹[f¿-g×w^d%, ÝÐZ®,‡sæù¡9 ½ÄZfÖ;àóoË?®ïBw¤é…>‹ÎÑ:7¹T²k„BÝ7úñúÎ÷G›`Cï^¸> ‚ÎU“§– %žD+'ø…,‰]ká¸, ãB¿oáyž­j»v¾pl3¹jê’$mkîÆöæžšz:X ™ãDd©êJ¶j³/g8i2ô©+ÑÞÓ|ÿeCnÔ+ñ´¹Ù;Tøï¥5q û&–,o·­ÒD^Ñø$š-êsÐUgä±Ð77ÜHÕ5[ËJ²"oÕÙ©wiÿ½ÞO¾èý ùCp7·4âñíùÉ6¨`ŒŸä_›uWÊ S¤Ú>µ­€cgäXZmú‹(¥ÚÔúj2³OTÚí–®.…ƒò¯ÜóSZïÛ¡ ÆçãàŸ‚sCæ™Øþž'¡-ŠN¾R4ÓÚŒ!11”Ë$éà­ïC®+IÂWðº*^ðk€ydod+ÍÖ é*ÌÓ—kZÀÍPH éì Ef4£ƒB&·fU éíMø‘E­Œw»¼?2n„z‹AC  àš$F`Ì]kJf”ߟÍ} ©m– ´4¹¯ìÛÃʾ]Îþ™9`ˆ[Î@pÜBìVZξ|ãV‹à ó’ØÚiÕÒòÁ¯È÷@.¬‡Ù_G×ÃÇ,:Á±ãp¨-Ç xÂ"Ï{“!VƒÉV(«ØéñüPäV˜ªwI‡ÈƳæc EÓõÓ³ÄïT½µŸD@ëEMÑño„ÆŒsà 7²M›|«òºú,ÿ)%V†¡±‹Ö™l”@’Ão1 ÂJë®pŒT8aòK‹ä °Ÿ{p¦À‹ ßåöm†ŠI½kåª+HΪ«RŒÈ˜S›þìNåEþ¯$­R6ky ËÂ0Inø°‘Y§ƒ2˜Õnkª)ëŽ8kü*@Á‹6%úaË`ôe0³#†ylÅú4»¼óDÞоH:\Tö¦!#Su5Ɇñ¤/²ÈÎí_høôøñãÕ©Ì­¤n“gjÁ‹—3u³¼Ô×p¦úºÛÍ™ºeÞ¦ÍåýãíÉT¤pÝjz*P]#S¡4MsäÑÓîkD\¾¯ME!ÙÏî6O0> stream xÚ­VKsÛ6¾ëWpr"gJ øœNN·Íx2i-÷’äQŒE¨Çýõ]<(“ ÝÐS_ ø°»ßb_8Ø8øeõz½º¸Ê“ BUžäÁzŒMó  å´ ÖÛàcøF~å¬;°côyýî⊣)&¨()ȳ،Ì { Ãzq•¦£K1-©½'lRw÷ t=¹}¦ªÈQU&ƒ¦Šk®¾DIò(¦”†ÝwNteJÒ“}ƒŽ3Ñ P>€t#»Ì-ß±¾éÜ¡gäç"I9\]ÿqûvÂ(& ʪ*ˆI†J\:\-û¶Óÿ—-|¤V”Ù÷FX§D͵û·“Ê¡<œ†Lkfà¡Ql¤Öâ¦)ßžÙ4}7oÔ„Ê–uìEˆXAOs!_œƒ®YÃÑ‹1±â|}ŸT“ðŧpF"„–3úmßJ唀l<–]¥Nv²iîàFU²¦çKRž”`X‰hé=.7ñº›IE ©ˆOùt/ŒŒ+dÛ<œ…²î7±ÜDq–…V˜ó½qY1r™…*Þ1Ñz¾]¯þ^Pr*yYZ LÒ >¬>~ÆÁßpT•Á½…‚ªbakIܬ~ÿ†2×Õ){‚Qž’ K`¯"suuä¸<›\MÀõdp\â­²e 0ËÊPE™ øÙöuf»}TeIø¨až7)PY%Ïáíøá™¾‘–JhâMåºVâhmšÉßGÈeSáÞ¤BQ†Ì-wÞcöÏNÚô¨{-Ú½Û²üx•ñƒˆHØÖâh}‡µ<¸Ä’-wµAÁÁkiÃÍ@xÓ šÛ­ûØó–{Š»-UÇýùƦ®á übpZ•eŽ „¬0ùž'`‘8™’“SL׊ژEqxÙ4òä 8tÅn·PPÜÖ¡{Öˆ˜Ø’Àzç¥É^¹Òcöýæ︒†”èž´\´“ÚÍ8”ènøÐ.Ôüš+æmÇ¥ãV³ý|ÙxfyÌ¡O8Ö@e'Š Wl~˜ã·°?Ã8üÉ-dÖî@K¯øKñìÙùØßß^_ÏÊ…r;díþêX³WO˜«è ¦ðŒÿ@³¯ËlÙ°†µµ æÚ 4³è£’Æ©gð«Ëë›·³NikÙ,³cÇt·ÌH®–aÍP7uòcÓŸ÷µiÆ ßÒxýåS,6‡¤w„+Áô9ô„?Ây[+ :ùpç{Ùu©ö=t‰ˆ&áÙŒ¹4»Šó&½l€¸á½b~µ9g,)MR.Özj‰~hê¤[æÅŸ«ú1ÑëßLùܸQÍu¶ÈÂ:ô 3·> stream xÚÍYMo7½ëWð˜Ä%gøYœn´€a§@[#Y^ÇB­+¯ëôß÷ å$r$'”,=ØËå¾™!‡o†CÊFo”Q6:R.àéñÏ;i¢l¥ÁÊQ’†S>’Ê)ªh£t$)Ë^%SY%ï6£²µÁª¼ÐëUÎ$=´‹o0CEsðP2Ì1 Dú"^ýB¯# DHD†òùDY`Pœ¢ =¢/äý¹èY‘±¢#´¼XMV‘5"0W˜•£•ƒXpŠÈ‰ ˆCÁ¡Ï’ÔÅböI°ÖA2QÑ©XÍF|(:àIÊÅ*&ÂÆˆ“2£U¬f‡V.^±å‚ h¥b}Ä—3&C1;MFZ².*öÎJ—E+ÁKÉÀV`–>Ø pZ° °âÛd` ÉŠ&£)°˜‚ºlŠ@RÎàkÆœµLÖ  ,Xô¤Ðc³XiGY´Y0‡Å…É:´ÊRAÞ¡SZ­$s€rçeHÉH«ŒÉfð1æÆ-Ö–`+‘¨Ã?—BZ(—­h#ØÊA´hjÊ Ò_´%´ré‹Ê“q Òx6„IP@ˉ øÊ»âDpË{¡1Vɇ" šû¸øˆ0•OÅÁ ½©8«¶Êl@?Ÿ£…&Lñ0äƒ% §‘ˆ‚9d6É¡e:’Àe6ΫàÊl Á‰ƒ†\.I xpp0h^«3„1#šOTóÇŸ)D™fH‘!ÍÐ?»Nß ^¼(è£nÖ«ƒÕ!‚³ ±#L#å{GNµ/%Fí—OŸ¨¼@as<ïÆ§m¯ÎTsüúH5oÛO½úbëí¿×->ŒÞ·ƒæì¶³þFRB1:hNÚ›îv>noi¢ôýÖ^LF/»OêLÒ<¦8ï`h4‡4€pIÎf´-2–Œ§d¬û†+oRDÍéíy_ÞÌ> š—Ýü¢sæ]óKó¦yufË‹ŒpŒ¹,:#i°I:ÃÌYËâ±Íy¸ÃâÑSÕüܽíVäÙÉåL¿ž|<žvýsñÔnbIK¼- ‘¥K’ŠÚÇüè8Îçí];××£©žÌ.»ÝÉI‡ ÖiI-l¢æ’]ýé;޹ÏÛ¾=MÛ¾o—TÈìÃW2ç\¸ÉiÐyÀåðgæ‡ÈX¡¼4!ª|-Ú«CJ•häOMHûDìƒ }¾{ŽX$‘•ˆ ¡2b#­Dlp÷üNÕ“–”M)û"È#åL2Úóãt¼õã«»nþaw‘a-"ÁKÁ£½l0Þi’zƒx“„Q¨âñ° þÌ+›­69×¢kÔOÛ6vA»ViÝf´[žlôøqü%ö³×ب+Ñžƒ&ïí’ì=T‹v^®FËÓÖ¢QÞjÔsµho°U¤-2ÜW>}7ÝÉA‚ï¿mM¼´¦BI~û|—¾W¬Ë&¨•ý6› ÚÂCѰ¶¨u¤ AÒÉ}~*é©9<8(šÃq?éfÍióûÉù{vÕ÷×7?5ÍM?èþiç—ÓîN»Íß·í€oÎ8ôÅÔ\uwþ^´ãÉE;¼„o†ãnÚ͇“ÙðîjÒ·C´Ï§PÌu;»˜ÌÞ»Ùð=ïçÝíìbþM.K›ìíiÝŽŠ¢Ãx¿´CA•qÙ :Jîµhòš«}ÂÞj9³V¢­D–hõ©§·á©ç¥ÞG-ƒmp%¶sÜ~SÉiB/ƒ—ËO·¶DÜš°ñ¯]îuhœÀµÃÑ´í¢Ó†|%š=Š ŸöƒâÅÚYŽo†Óÿ­ÈNf•˜r/²-1åþ¦š˜À?¬vÖ¢=6)ã|%Ú±<÷æˆÓðºZw=š¢–ë²:4Ť助m3kªuˆÝÎóɳª0Úš•dVYiÓö¬´yV.ƒÌÊuh£ ÜÖíM´Ú—ëJðµ`òRâí«JÞž «÷r‰ZE†Äf… Ty°ÝüôÉxqO›,»ÕÉ2m6Ù¥C€Ü,ï𮃌זH~ÝÐ$¿^0Ò¯‘ß3H›øøÃi{;­\1È]v}XòšË性,FÚ“ln/h³Î¡M¨4r¬DËM'?±vx¥; LG«\ufûÀtv:,ƒ¿Ò!hjÑÞEM–÷ƒ6 CŠÕh«m5Ú±”©µ#±(Ý/éþ›CÊf endstream endobj 1856 0 obj << /Length 1840 /Filter /FlateDecode >> stream xÚXÝsÛ6 Ï_¡ÛKä[¬ˆúÖíúÐ.I×ÝÖëšt{èz=Z¢c¶úª>êvý‚”%Çiížï,A€~éZ÷–k=?{vwvyãÇVꤑYwk‹¹®ã‘3æD~jÝåÖ[;ôïî~¿¼‰¼ §N¥ Gñ\ÉòUQ÷Èxæjñæ{y“™K?ŒÔÔ¥Ñ'™(Šn6}Oµ8rÒÄ3ë=],}ß· ÙõÔª×ø P΂٠JõúšFÐÍY,ƒ °_¬‰T-¼ØJÑÊì‚(# Ù;jöaD5DQš:{ªÎ-Ôº.Y¸3°ùõ²®Ž7òŸÌ^bohá\–¢ê@/ˆ°93vèÄÉÚå²kœRž ÜŸ²’%j7”F½®)8R¾’>Ÿadób4þ¯º¼(öÆô6¯K˜(Šço‰Æ[½õY!áL›†xrÄŽ7ЛÈ¿œ` ÿ210Ž÷ Œ“™0¾3:0ŽBŸ“…Ê¾Ïø§'‘‘ ,C¿•3#‘4µs±æC¡øÔ)ÃDÏ ©!מ³=pÁzæ¤aD¶t:6÷ ö|Ç Bc°ÔgqÞe¼NÎ{~®C#ÒAÑÐnåwü AÄóâùþ¯xÁ«LäÇï¿Âr„оâÓÀµÿTú`à_»N;Åß¾•Ð °EïQÌ’>Š^w6«äÔXÒ´.«[ñÞ´õ‘õ§˜ú¦3´ñíõ`"Ä-–àKZæ÷àTm«¬.ŽWôå·¶$ euyOVjÍ»þx¥ÑÙ};ð×À î­úNÓdÉïÅ¡ H7¹ÐŽþÔò^PO%Ï L”²¸J… ú*¶†NV÷zê=²{ZµÕй¢±–‰çÄ^ 6ÔérQ]Êÿøª8Ì[Òè´ ýq}lЏ•'غuùždk.Q ãâØ`Š©— 5³!ã&n0G<¥Q´ÞÛ @ÅæGð—Ù«bh[D[׳UšZW—‚(Ÿ¥Øª]F2ošBfƒ £án³'ô8(¤^µ§R'Wð ”Ça3æ $nÄ!5GküHÁ&¬T˜d‚ðºoÉa â0°oEOÌý†Ø#r,˜v³`ŒÙOÿ¸½ÖâÖDÿŠÒêˆ*K U@¼f!ò0%•÷35#ƒèÝ4û‚Ç8Ã{ /»R§Ü%oŸð÷ì#ÖIzZQW÷&êÇoéÈ€Äe+ª\´˜»œ“3t÷)¾á³WHn̤R€Î¨ó9€ö)²ë¶Ö%ËyËѺ­vîÒ]`ŸOs_Ý>L‹'‡$ï:þõôú–*…¬'‚jQœ:¬}´ÕiÃWæLÌ=U߬.W²Ç+ükM™'A…Ž©#£¦NDÄÇÛàç$V‹ëPóõ5+‘;®×ð>ÛlëöãLE ¼»§k˜8~˜¹ȤM ¹ ª8Ì®«!‹íà ‡J*°7Ø­£"ö@öœÔ ×-ÒŠ~h+B{/¢+ çx»Όª"m5ÝÉê8Îñ‡yý¥oµJ oy)l´§5àz¦ }¸MxN¡M.†¿ Þ—¼Ñ¼îTS%N$ÐUC­êß‹T—Õ‡o“ó+LF!®¾¬¾Ä`O]³åª=ÖâÔ]i˜óRfjk¼ú®>z5 ó7ò«jDµžÐgÙļ•êÒIéÊüxÿöâÔñXøƒþ;Qíû7j0ñoò?߇£vÙÜÿäXÂM£Žû Ñï^#ùÍõÅþ=@1µÂØ`¸N&ßöhâWˆ¶çÔûÂŒsè,q+pQ¨=ž]}ÐAŽC“=·‹ÁÞêÛÅ®¤Ù‹ÄÃÚû&°xÙ¢{Dñï& ‹‚QåØ ˜¹ÑÂcVÿ©Y•Ùû®„«çOæj¬ ÖM÷£gÔ+åËÐU.ŸŒñv}}wöéŒ)ãÙø0侓fåÙÛw®•ìåøibmgiàWqàC»°nÏþzÔ:õø4?Ð8 ˜å¹±ÃXôøÃÒå àçtžàÅ&ˆ3¹A¦i!ƒ þvÏ%˜ ÐaèƒÆ²4t\Ÿb-YåxRcÑÄ‹¯D—µ²ypc;äž·¼Ù˜÷€~I¨‡¾Á»U°Á—ë— 4oÁÓáéŠT/Uò“yÓ0Cœ>Þ‘¡êUŒD¡ µXÐ×Å÷êYȺ,ÀN¬ªhürúd ¬ÀZFÑðf®˜úsͦEtµj8²W¼šõƯÚ%p”†`UbÙ‡·Xèæ9 ½›c¦+eeÄŒ©b*jvÙÞ·m¶‡V¢(µŸ„ÀML²ÁË“éO5@å=4à ]·¸8vÌâØ†ÅeKM™ Ú8Ù£š!+ôGý!#=S×Q71¶j^¥!‡Z^¯¤ïx´Î!«îÛzhœÕäqêƒûØPe?vœƒ. ö?·|é endstream endobj 1871 0 obj << /Length 1000 /Filter /FlateDecode >> stream xÚVMs£8½çWPÙ T Ÿ>ì!³I¦j*3•š8»‡=È („3ãýõÛ-cb“­T,!½×jõkºñ¬Üò¬Og—g7³d±ÈZ®-êyÄ"+¦”DþÂZfÖßöU¹¹“uçü³ü|qãÇðÀ£$N|0¦¡˜3¯7qx`w@»,†EßpÏňöÖæ‚CWË¥ ñ“däåw/ôМFÂYp‘EH½ú!ÒîƒÞöÆ[Y¹QŽzžý»R4D?˜t’— )Çį··ÓÐz.²éˆ*ÿ'À‘·"Û¦]YWólçm½mÈj7­YvóÑoÄltÝf¢wGUl×k9ÈÍåíýõ´Bd#è´t’¯„œiRc_‹ƒÜõøzç+ÉÓÇó#œUýë”C{Õ›ÙÎsÙ|F@T×ÖbNê&?)ʼðßÍ ÞàœÿvuÍ®X4"ôë-& RÅÉ—ÛñmÎóVìBoúŒ ¼›{ͪ¬Æ¦—ߦh¹êNæúK²¦|]BÊúŠ3¬IÚ€;Qêö›`ùdA©Y¿ûãr¨’C5Ôö!¯(†±¼ÿzýNÊ×˻S”—ÍË9 [ôåü²Í·Q9>³;u´?œè ÆiÔÅâˆ,64±{±m9d—ïûÀ¿#{ÂÀèH··àÒ€„arÐQfŸ ÝKT ª8´ˆ€-ì®6ca„à¡oo–Ø[®¾gƒg,¶…yà= ?ñ§v¥¨ò®0ë•fnD[¦fáÉAnÚaÂgÕ€µVJ‡ÚkÇ¥ö®¬r³÷ˬ)UfB´s³g×ß#Ó=géO'ñ·µ˜E ;Ï17ná]T™ã;8“=ù/' 0æ…RèJOáÓ™Å/j}Y¥r›!6Ž1b $î¿+˜ÖìcÒ! ©2«ë¶Þ˜YWˆ= ßl¸VøQK— t…P'Åü¸²€/ ÏÕN¥­èÄ]¯ë‘ÀºutåõP2Ññ>(&;Äõòì?Z–1ð endstream endobj 1879 0 obj << /Length 2291 /Filter /FlateDecode >> stream xÚ¥ÙŽÛÈñÝ_¡7SÀˆæMFœØ80¼†=Fì.‚ÙqM‘Ùœ#_Ÿºxi8^qƒAWW7««ë®–³º]9«¾úûÍ«7×~¼Jì$ò¢ÕÍ~å:ŽíÑ*v];ò“ÕM¶úÕ ƒõï7ÿzsy£~ØQ”Úó>?~)*ƒ_9B¾ß\ÁèËFô鯋é3“±›üzBàŒ¹8²“­×øním­ì¶1ëïÖi ô¬*/×0ηˆ"Aûªfà\š¼¼=;hÊ¡œ´qCÛIb>¯ÖY›š¼*/gñ߇5U—ËnËGÜÖU{²w—‹î³:‚æ‚0²ª½Œ%!B 5‰ˆcUË–£6*SFñ,­ŠöX6؉bºÏM?¨ã©Ð"·ªÎoí<9¡þî[‘˜j–âkX^»[çkrÅ£0‡Ûºãݬv¤Ò\j½Í ln‘ÞÁq1J ùÀyÉcµ[o@<èÔ0bPÎèZñ–ÏÔA3€îÇÜtë[(ÄmÒÉ –^÷7ý,Å òqN5¨Ìg¸XjuÒ‹¤†®ê…žõùû§OWú–*@ïÃìA¤€­†÷*´c\Mac^§…nxŽö—é½j ²)ŒnlýeVµümªJ†°”sK±ÚGB¡ÓŒ©ó]kôDv³'šƒ2K]!ÀŽióäԅξÏÍ¡käJŽ8ïÁØ»pIE…è{ »€ñ8w„!h3"$„0_׃§#è®P+³9­÷Ÿ²h%þƒþ˜õFµ'Ò¤”†lhýRâsê&–ª]!y#ßsî›ØŠ›x¶ô¹¯VÑ’^þÆÃõ»Oß>ð—c‰";p£îCû§éû¡ñÔ"«:ÓõåæøíÌ*"öD˜ƒd´ñ ËJÒûHӵȷÖÍ!oxYl1­jž@Û·ÅÉ´f‹Èô¬2‘‘†­=ÇðïFO=)7à&Æ‚ö1û!†| á…nEó¶Îu¼GIh}a6î06Óª{F©à‰ŠQÀ|ÁP‘3uØ ×wk¸äöŒml,-Nbb¼Ü´»F›i"èý¬¯TtÆúRç ‹V]–®NäfKóqsh÷ûB/©d4 Æ8§âXƒ+VGòœ(šxÙ¼0Ö²ï €˜{ÏÔ ú¡Ð¹9 aåàš %“Âýƒd`Ò™ÂÏäç±õÒ”TŒ&5”3#“"-É¢Ô‘bR¤·ZO´D&EóΤ‚ Çl9MnàõÚu] CÃ2­uÙH³·\èúº»ëÃ!Jc«Î¦’i’¢f¯I¹c0Ðèt9Õ].5ÇBí ¿ÀG®4X-ÅäÒX/Á…[ººÁ»×-/ ˆÇ…-Ê ‚¡a¡Â/Dœâ¥¼PRüKöÀˆN—ýÚyêóBFwÕÃK”‹îWñxj Šf<üA „.3ùŠîÀ cYÀ;„^z««ãÔ]Ã#¡‡Û¿(¾Öú´Ä ¿êÓDÖÃéËmC§ƒZPåÓv:ÒWŸ·ÏvÌ4ûY|s_ÖL]ýбû'"ë!yR–lM‘—š Ñy/œ>\(mßv·ÁÐk4ö!¿=ðo.àãz¥¼¾Ç <§+,¢‚F.£U Í•#¸DeIÂuq{Ôuž2â»´fDº®PÔÃØqJ‘2VìÔ²ÐgT3¤çrjצ&.Ë/‘¶‚õ³L7yM¯#å nnrh•–&6+FܑҤÇt^B1­²ñ1.ïõHNX¹AÕùQVú”f®fË€®q`«.àê\`&ÂA…C#Õ¹´hA41ò5ׄ±}=ßù `ßÐÛ0v2t^Å]¡È ~ÐÅ6ž—Øñv;½2yÈ –¯çs3Uÿ°(½¡8Ô• úæ+ÒûÎÕÈí-¯ÞçTáÂU4CPö³àºÉ\‰Q¨W-í«fDu¦$ñœãÌÇԧ½øËü‘—ðœzž(,$â‹"nâ%²D¶½‚§š·¦c ®Rç*Áœºè(ª#….o©ãäé§™3Ý\jüiˆa–. SžÝ½­þLØD©od Ø{“Ð`œpÓ½£(‘Äí$ØZÅ‹·Å·Ћ`Áy9¢kŸE®}œmÕ;öÃÎÎ1nÙo¾~ŸëØ]'±Ãm4¦0­~¿6=Í%´Ê‚xÒÛjš'Y÷çe³›Ä¶ïøÓÌY*ûŽöÅÎð®â{>Ý~÷lwX÷ý[pÛô%A Y¸:JŠMÕ“¾òÏK€¼pÁÛp{DžD gÍHÿú‹ìö—ÊòæT¨ÑÛjw L-/û q¯¸´èB@d‘2º“Qòþ‚œ‡ÛîE£âÅHy/]ø³·«Ïaðë6]Ï·#§?ï¤Lz¸¯êÓhû«Åmå¯áÖöÃÞsnoåå¸=ÿbßîFó®— ·#ðÜ‹˜؉w»®ø„Z›¶.%ïm}ۋ©¯KÉÊ…Ó¸ ëùDòŸËëhyÔ[ LÒ§l3©­fÜÈ ¤¯ñ‡—Clõ¨ ý’ZC… +y3ض‘íÇAïß?}š“.ÔªÁ¶Ût?þ= ²} n«Lž**â æRœ˜=7"ŠÜîô–ØlÛšï{í{NŸˆÅ8‚EŒ’02z?ÕÝÛ^Ç>íÊ‹AcëTâ‚ÑfQÙLˆhŒ?<Íj´«D;—rùl| ^Í Ã1" ï Ë3Quùöiîm#äûñ@»í«´ËëŠyç‘Ø}R.@œ ¥nS.­Rˆ9½>A£?).ë”wõœ £$9Âä£(ŠkQÀÃÍŠ E#ñ‰¢PQe ^”…¡¹k…lÀ‰ØQùƒrRÚM4—êMu.0Ã}-TâõY!ëÙ¤8®_¦Šà]ߊÏ*Q§Bç„9·:™_Fø.úU Óµç¼ã¯"Ü-[9óÒFÔËj‚3ƒôBCˆlä3Pþ»úïšM™þ!K^ï`õSû@ëƒÞgàV¡TäõÆ€Sèû lÔçYÀ·òŸ˜Ù@¹ ÍÓ@¥óˆ%ûÎD ÈXfßÙþLB}î$…è:Ñšº•3ò‘ILŽ7ø¹¸X/þZ`ý¾xìy4Á“–‹Û/¾“Á%DIìî„ÕkBXK™o qÔ„x#!8Ç<‡“ãE]©a¤²GcKm*ùtsy9Ì#»~»-¦×«³Ëë‹qxi ”Í?J®v endstream endobj 1906 0 obj << /Length 1143 /Filter /FlateDecode >> stream xÚVKsÛ6¾ëWp|"gBˆ€ÌäÆq:­›æ!·‡$˜„$ÆÉ ÷×wñ GdWîEûÞýv8;'pÞ¬~Ù¬ÖWqêä(O¢ÄÙl0PŒ' C”Ĺ³)O.I¼/›ßÖWIt“‘Ôh–ËöWFåvŠsXýë+œˆøVÆR ÅFò%ßõÖxqäJ1‘žÿƒ6|êjæøa†â,3Šš™éI\i‚ò,¼}Û¼(so=~÷ü8ŽÝvkþ‹¶n{.Ôvekˆ–Õ|ìXÃ8•¬DóhOýó­M?$(Ëm´­™”ì|WÿìdÕ6àME.åÌ.hÝí©uJ^<ƒÆ3j4’w5–ú0;Mhë‡B¥bÏÛïÀ\è‚—¡Û6VÂø ^ùÐ9!Æ;Ú”’<u”Ó’]€òü$Äî+ÚÀU–Ÿ¤øÚCá—æf”–{f(Û¾)T¼†|¬êÚÐ{Áfœmc)·T€¾ß´¨–gßz˜ŠKÈáTšB7O¯¥Ø÷Ûmý„Z~Ü«T÷Ÿƒ8eß°n:p†+¯„¹«æþ V³Â$¾l'!Í)Îrl¼ÀÛÔz{É$­êe„͇À€¬ÔˆnöLå?"á`Uõ#úÈÔ|kTõ¦¡ E?u•7„’mi_K#¶m*•ÔŽ•´¢h Pô`¾ŠÒCuc c:t¯zLÝê)ÒDýn×Õ­Œ&Í‘LpˆÆ;‚òÐÞý1ÖŒÜÙ’ Óàwv?Tço/ƒÎªvº´Òˆè°Ôå‘W²jv³:‚m;]:ªsuç‘Ä¥»™7Cò•z§ø`Jú8”XÕ)3:ÉèT$­3ušëÏ ®+È`Áš‚=÷|’÷Í»k?†›Ð¶>JÁvàpè {üð"è‹,Çþ^ÊN<_¯ NÄ}иo¿BŸ¢–ïÖàÌ8ñBæÂ˜jÏP£’5øŠ³²’†95–«2à“2,`‡ZÁDd´ýå夺gOB…Ý7/M5ïU¶Õ )¤);žln‚{½Y}[…:©á¸dqL!±SVŸ¾N —P~ç™sÔ¬CªRùv>®Þÿt7êM>]a€‚† ‘øñ-‰`Ó#2~å¥*>rÙsõ¯Ú˜@7~ï̧fb ÚQ…ÑÄrØA‚p>%l^°ðP‰Ó‘3N¼ÒóÿTô’SÕ>G‹Njª¸·)›<Àº¶x.˜^SpÚ2•#;ÒU~Lng´2~Ú‹7B¡õ±÷Ï™ï ±È ôx¹~mM—ã­Âè³¥Ñhƒ ÌûÂü½½¹¾^|¨àÏdÝñ¶ïÐíÄû¢*Y#/ |"±ùpóúv º³<*+Ñ¡ƒš!'Ü~„Èbb 7ý~žn«g©(`é µê~ò˜‚>œ§¼¦·¬>/+¢ú‡M8É<<˸ÿÚ‹©ÇÁbîÿ‹o|j„œðáeÜ ý<8'š’Ó#ª«fÖž#ÿ` ô/çn,V endstream endobj 1918 0 obj << /Length 1686 /Filter /FlateDecode >> stream xÚ½XKoÛ8¾çW¹DbVê…¢‡ì6Ùv‘],Ú´—vQÐm«•%ƒ’ꤿ~g8”,)JµÅÂÑäp8ß¼8{¶™Ù³?N~»9yv¸³˜ÅÌnÖ3Ƕ™ÇƒYè8,ðâÙM2û`½,^IQíÄ~þïÍŸÏ®¼°³Û #ØiR?DšÛðìŠóñ =¹³…œG[²4—%;¤Iµ/|Û¶^Ðçïw××çÈ 8-@œØ÷iÃFõž-…b[™n¶Uo—ÍlwtתØ-á¤ñÍ›w—švkyz>Ú¾C€¹ÝÅàD ¿Ï¸Ý…ÚÔ;™Ï=תÊúáw  däDÌ‹ £bùY®ªþzʃúŒ®ßÊZ @ïyìD5 oÃaápùƼk0n­dùô“/æ ×u­¯s7²àÄBÑÿb_ïÈPÏV}÷YQÃs+‘kQgÕ‘€ÔÜSNà³È šß •Še&¯ k0Žmô¥ñ¿À7*l,ׂƒq—EZá<0!³lh<© Z¹¦y⦇ˆ¿ˆøÉÖzÎ}7Í^Ø7üׯÐó¾oí•4¥-_} ô8\ÎÝк{‚ØÚ‹ÒLŸ¥ 89œQ=È…¶9ҨݘVø¹Î ºç‚ß÷Ý6LÑ‘$d"AF\ÙÓ³—”Û)i¾!"T¯Uà†ÆÚëÆVsÇq©'š\‹0Á'úžÃ¡H CO.XÝš™ʉb&i¹g»4ºˆ¥yºCÖ;:Yd‚œ@« œ3°DV1ªºMoÍ€„ ‡ž‘UŒù”4ºÏRÐþ~O4ɽ ð_"€âv@qÛ†€aÔëG€a™ ü„Pã£h6ó$0[e€1í„0õ⸓P‘N»lt™Oƒt=’a›4æ-M²v=ær¿œ[œ•+‘I–ˆJœÓT`."ð6uHKù¨ú±Ìpݰ¯ÿò~º|D÷/álŒ¸¯â@©V¨ÇmAŠ-›ÈP…qÈ3%0e(ö†[g]dMÌtAO ÈnbJNòN˜´JMÁa L”!K™=]†kÑDÜ0ÈFŠcfo‚tàÃa“Œ~6µ>’~“*$¤&š[º’·éTK¢¤á1Ú~:In?×å'~U¨ô[A:F©È!ýh{|%ªÖ:òóV~o<[˜[¨ÀÂ×iÞÏ#Ï’ªJWN6¹û ÞÃBë×8‰È7Ù/¹Ðäÿ«›(QVrBÍòäâ>È¥jÌl<2Å¥ž<¤ørÂÑF»OÄÛPÉ “®ÕÍ@U)@v,6_D6ïî#šx°RËL2ýàmÇZfµR˜¦l¨ÿsš+‹¤™¯©4õL‹ý>KÉ!JZ.kÊÏfÝÌþ£$î£?‰¾:aUç@˜Ø¶÷?Nn嘌-/ÐWÇ*”¢L*º>‹LT2ü¡Ïá%Uqµ%ò@‡Û®æŽãX×o/ »5Íß!·¢¦I}Cã¬ÌWEݤWQ‰™–e·òÉ‹ªÍ–¸ZÙ¤ÖÝñF ,ô0à¾tÂ&+òTƒ7ˆ"{%õJ>S2O¤ÂºM®þ”80ýTŸàµù*«#Üa›6ðˆMïÆ.å^Àcvx[èÒxrAÝí(L–Ìf4[9j¶Öå¹AݸÆm#vl‰D'K=&¡añ€¥h‚¸Ä%J+ \ó´ˆ[åÀn]È¢üà;e¾Rr1æ=¥qä<¼Ì)ÜÊMizD úiîT?ûN{õuEá…^…€sb%E©YžèB.óbïÆÍ÷ƒûcß1×9Ö_Ñœ´åúÏñ_ôèiºFže¤oÝjòü°`?jRPA ‚&Ë´s[ÁE3…çÐðÍý®Täí4çíEµÚ õ¥ßðøïƒ‘jÞ˜ç·ÕüfC—JÓi çùNh½ë½/·[¼W:5޼8‹í°¡:§C”¬j•SÇÍàeø}ŸM‚(«~ÝÓŠÚôº|-j9Ö ‹9™Q7é¦J‰Í;l¬A7}ؘ»˜`›…ñÇqø=ã º{TxÆfxÈ÷:%:=é6CÕÏ%È;j!|8rÂ~õòVìö™|¼…Ú Ý8¼µX™Æd |£á•zº_îVŸÊ¼¹O›ž€Î£6øÜ°»Ýí)všÄG÷º Í÷òæä?éÕÑ2 endstream endobj 1925 0 obj << /Length 1411 /Filter /FlateDecode >> stream xÚ½ËrÛ6ð®¯àøDMM†o‘žéÁiíL2ާåS’DB:©`dû뻋%R¦R¹‡^ˆ°»Ø÷.=keyÖ‡ÉûùäÝm8³27K‚Äš/-ßóÜ0J¬™ï»I˜YóÂújÇéôûüÓ»Û$èa†³ÄMÓøhœßkõGY+Dœx†ýÍ|ò÷Äгü=çéf¾•o&_¿{V—Ÿ,¸ÊRk§Q7VÏ¢àÒz˜ü¹çw¼jñ£¨/¾ï¹Iä[Iœ¹i4;-(è7Kýž2S'ŒS{[4³Ù²RLß~aJÔ•f7®a4ñ³·hHšx#ŽHÏ‚ÈÈÅeÞˆíþùcƒ;3µ?uÃ4%òÕ4HmÕ %~ ÄAµÐ·w3ü<ÓA½¤Õèü"¦¾]­èl]#âŽ6KÎTÛh6žÍŸ¶ —eÓ—9"®Yµâ’XÞÔRr!¾yaÈN"‚(ÌV¨ž4yɤ 0(é€å²8&…¾y±——­T¼‘ûîÔ‰€b¾‘‚,²¥xÑP¨UÂÕ]èX¼áU^”ÚÊÙà í­>çMnÄb+CÜqË9X¦, ÝN¨µ¨fÄAË~ zx½[‹Ò0VkŒ#³Éë²nÆ´J†!I†ÀõÔ÷Á?Ú‰ ˆu3°}d—(\Ïl^ÅÁø—æ0çZx;ᑚ™[ž@4ô¢lÍ뜮ÅjMf×åa¿_»qfŠÈ£DóEíë(æôQ›tF‘´Õ3Z®^üÅsu9fT²rx™Ð%èË êbϳ¥åþñîn”xM0s袓¨Uß/.éøÍvV:ÅÆÝ Ý{œœÀO#³§ò)\ˆïWŒ½“˜2g›=ÜdÔ@˜¡Jžg¡US·[wq¦=å¶êll“ôîˆ<·×w7ãO¼RrþåñfTOz,ÍEà ÑÊ‹ÓÌ_YüþúgÈG®¼¿Ö¸ÎH@cüœ“d×ͪÝ@µ [ÉŸ&Û¿$eÐQË4hãÙ¡ý?ð¶aŠÊB½}{„ÁàIÇppüØ ât˜žç¿ü±Ú¶XÊ£ØÔÃ\A9Õ{]¦a=ä¼$Ý]Wlà K(—BªQ²cÞ’ÄËÑáGPr‹1ŸoYÅKCË:®PÙECB$ºÈ6ò gŠLêEøL[åØ÷¡wÍi:Y÷xuiTzÀ„2µòÇ.€ÎsFÖ/‡g{âìi"`i 0À&ôlÚWMk+ù%A_²¶T’úNw¿os,ïO*Èû¦4³Ê[cK—ì³µù Û2z!´`¸â8x¢¤™18œUZk„´/`ÅÞÀôÀtVŠÓ~ÙÔ“Ã̛¥nκg¿èwß7|Ç›««…^]`åŠjYùpÆ‹"7‡r*7N0_&ÃĶe —hÒn‚ ‚jmq[p˜Í¢Jè‘ö†n…åÏLBè¾8Ô™„Wá/{F'¸¤ö|-¶X„ñD3tÆ'ýJoøK Ó&öãáa‘\ý§ ï:ðÙñYTbƒ´xÙ÷¨šû4Fæ2BLÆ€¤Ö°]ëLÅkÔšgœÂV„&7 ýRò†ö;¡ç6 XÐ`:ÚZ¸&›Â”Y㯓çm6J‡ƒÇù6bO=%áÁF æDÂÀF€0° õm”„ã6‚ó’5+mŸ$ììÄÿ›}²á°u¶}ôJdP˜.ë´Ó kÒ˜Ñvº¯Â ?ôOE[­¬Eú_²ÀÔ%0zJ. ­þÝA iª.¤”?páu?Pü^€!Ǧ.® ¤4ÛI‚ñÏ ŒV.ͱ‚_¿æ¬s²öž¾á†Ÿ)ó†bÅ+Þ1ïž\÷R‹NªšÖ‚þí_͵Æ.•;:Á¯û?UNª endstream endobj 1934 0 obj << /Length 1576 /Filter /FlateDecode >> stream xÚ½XYoÛF~ׯ üb °ÞGÐ<(±\4(ŒÄVÚÇVäJÚ†W¸¤íô×wvgI‘•ŠiPðÜ™o®‘©í4Sûuöz={qåÛZdD¾íkë­f™¦á¸¾X–á;‘¶N´;}•næ ;Ô‹9ü{|—õü~ýöÅ•ô(]Ó2‚о’ƋꙩnjÇW®Û#Z8¡#©v›Ò&Emð˜¤tÀâÙ}oD¡Ý^w+/ÇÑ뽚pö·š[1º‡O%âa¹@Tó‹– c)©›iâ¹¥Ó§g’ A(Q–gX­ÎXBóšŸà78/…aµ¾ªËSÂ9å}‰åqÚ$´](DÂ*’æ£é™ Ý’&­ÕEOÒ¾Y'CqQ²]U4¥±ùz:–«y·ÅuQ —œZ#Í W\Ä4MAËåß þ© çeÊêIb.á¾ Ô·­¤0—Ú„±‡÷|ý/׸‘Ñš$¤&¸’€`”wª-éZ0Q†€™ºþFz ÆÄOç¬5÷ùQŽ@ @àÄcäy(¸ÔšvÔk8m#þŒP«„2pzó2ÓðÍ 3­ãý¥ú5º¡ay·­™³¢RM@[,åßµ¡yFàZW¿æ5­Œ©Áóçž‚þA ×2¥*]3Ò‹*i·zjb"šÄž²Ž<ºg´"U,¾g"àIЇ”@- á4QÌsÜÚ±Á‡ªå–’ŘÅꦢm–‰MBƲ,}ùûíjjxNL”—ðd,W–zl5×Ëœ®®<½—;ä-‰B°¾˜?¬ðpgÿØäȼ'EîËö¸¹é̹ >WÔÕÈ÷Š$¬áç?d´=Už‘âk+|²µO ï“úÚ)]\Áò²LÕ¯Á‰—?Õ>yúM‰Ê?ÁE o.ž„L.p_qôëå3Ð=$Àìˆ\`{†ç†(Íóȇnè‘’dÄ }h8axx%ÄÛµk_Xgð:Œˆ 8ô¯¿¥<Ë”§TE2¸yS¤Eõº¢´zùr#G£$©ÁòmqŠ«'’•)壗 3ßí„ '²Uq¹A”gå&‹?ñ ªŠ³¶¬iÏ„´§<'N>íh.2®gšú/ cIþæÒvƒ³ Ü‚•³ê-¢£,/‹Z ‚E±Á÷YмÂá “â YæÞÁ©V¬cw¸ÜÝ¡zý¨§JÖ(j]ý\ ¯3×p•°¬zøÛ7 |îïÑû„eäK› E<áÆ+UM‰­‘ë‚Ȱ"ët±­bœÌâbL Ãõ'èÎ>"„2 aä‹çO„RUé· <˜¿G[Ñ2%ñ|}óaÕùжlà #åJáÏwWu¦+tÕ™Ç à ¼ÿÝC»îbµž}™Y²è´º–Ò±CÃ]-Îfw÷¦–ÀGˆT“p°}«ë[‹®]íå7ßPÚðbtqñ¾añçT¼û^¨¿ƒ¹˜úÍ܃v%¥$¯ñÛ%ËhÎY‘óãíbúë š9Ò’Ûø—ØÂ2ŽÇ+k¸Ò£¦^¡Qym•^“0RKxr-=¸Â9)ËJV'O,#uKUHƒÝ3¬æ>¹Šœmq¬š<‡ƒ¸x÷f‰­"¯¥ëÈÍb{«_I+àeí/+EùçÚÐ ™ªîrÚ•w®ía­ NP¿⠻€º€¦ãÆV⼸V"jMåoøÍ#€* ä8J•‰C»Š”{c¾¬P_ïW7~.Á½b[Ó|´—+*ˆ÷C¢ŠÓGÙT´]Þ#íò ¤ål—+[F,S ØrXÁgâX‹ÿŠÙ–ˆÞfØ¢ƒ}Ú›ˆúeá-‘DŸy]DtBÅñ“=½Ü8î©] R¨Êƒ9‚í%JÛTŸ*š4±Œþç³2&]]ño–Õ®Ÿ;¶^¿n:@1RiBéÜTd¼ÐœÒz vN¾õº‘þ±ëØHI¯jSúF1üÍÉéçYž«Üqh@¦ö ž áæ`téÑ}=g_úSänGHõÿÉ0G« endstream endobj 1944 0 obj << /Length 736 /Filter /FlateDecode >> stream xÚµVKo›@¾ó+V=T6û`8ô6I¥JUq{I£j ××`'?¿Ãîâ€Çqš,`˜™ýfæ›4C½÷ÞN¼“ £§’I4¹A”Ì#‰bJ±ä)šäèÊ—$¸ž|8¹làÉŠ gÇøœß-.Ï:7¸ä'ø‡}@Èb0rö=H¥¯Š•…Þ§ƒKPHœfƒOƒsîÏf‹¢ní}= B!ýß:k-æ1†.ÏEÜ£Vå¢Ð̓§ï¢‰"ÇKmÐ@)DÚ\¹jÕ"ȫŴÌ~6¥*ŠWðL»ÜR‚Sá:z^LëÛÏ€º ¨§n(ñߨË}Š>ƒw>ñþxD7c’á„R”•ÞÕ5A9¼„³0Otk\KÁ$ãˆÃ}.½/{«3\€íÄ2¢HD Ê6sþ¨Uµ5i)Fq § í™ñNÙªP­† ‰Äo™›Ø/u ¨©Œ¹¾±×¢ƒ‘š—¹µ­;‚4tsQ~Llµäæ ÂL2ƒýL7Ùr¾hçuuAéné@ÎR›j;švÕòÈ/ê×Pln×°ÛÐX·yeíU]…ÖÕ>7 •¹œ–º]-]fU5·K|½´®sg/êYhÂzBí]ÄbÿÖ¨™~ú^ìßRǘèÝkKoŒñAnCO—³U©«€3¿}|MÀ¸Û¢ìhp±Æn´ÌéÊÚô1kk×J;4>œÒ–Þ Ï]ÎJ¥ŽOPøÓa|‚UYº©º. ¶±hº~V½ì­ïëhYîþ“ì~5tsµë xîɽC¹§ÐíE”Xì2n$«Yg¢Ž„Ì]y׸Çe–ñÃïÿÊ,£`ãñþÏésD¶iU•«å@Ls½ž+#hÝîÒ#u—‘'> stream xÚÕY]oÇ}篘Ç䡳3÷Þù2ÔŽ7RÄ\ ‰¡šÞتi®±¤šôß÷ÜYQ¢C²Z²dŠ>H¸»{fæìûqfé³8ãŒÏ!ï²ÎP5¼áÂj Lj°‰1šR‚ÉÞëdrˆjdS\…S$O|b¦IÀ9.x® 3GÜó¬«FŒñIgˆX‰H§ˆ€P¬T`±× `ž&ãCpX€DPÁS}À:")߬ÿ†ªëâ_Iu–lÈÕ™S0„ÿ Æë2)ƒ”`)Ýœ“@XÔ(’®‘½¡ëôd¨¸û…ØI}*†ïç †‡ùr4,1À 0"éÃâ`U¶ÎMŽÊ…`é;g8›³W·Àq\ ž<8¶¨%Ê]§\ :R}› Œ¬DJ2Ÿ©•a¥ˆÀKªk‹ FXÔ3à/’ê=ŒB ‰u[‹Ã€º|ADH]¿€—Ôõ R×Çë'ØŠâ!.ë{žë¼+ÕÉžâžè†Lˆ'XÅ„XtYr&$VyXYgí)ëÖ°«˜¥`K)&ºXD} É£R‡Ã#¹:o†%iˆ‡HÓÑY]WA gc†%ÃS@ÇKy‡ØIÇ–¾vŨi käúfˆ¾Xê{ch©¯Ù“#lrI%Þ$ïë‚¥)Q„M¢\ƒÅ¹Þ &‰Æ]‘K£²à < ƒfŽîGŠNobŠ'“æe·X™‹ Ó¼¨ G¹ÂÈjˆ  ©û g4 ‡ D,hÀ}óͤyÕw³ëveÞ˜æÕåKÓ¼n[™› éZ¯ÿõ¹ÅƒéûvÒ¼ÀºíbµÔÌ:~Ò\µËµË!›ë½¿¶ïn§ßv¿™7ZyÔͩРšö­aåàóÅ¢Ãlo†¢¤|jQº7hm TǨŽ4×woWõú‡ÛÅÇIóm׿kûº®»i¾k¾o^¼ñõB©Îð’ì“Õ@ i‰t›PÝ$DëcîyuíµiþÒ½îLsi¾ºúea?OW³¿výǯÕi§¡R¢ ( œØ:$½[Ε-rú¤‚mÿì£-Z]E,!☒¥({™Ü~B\œö$ J¯i#Ëê 'h¼o»OöênnûérÕö›„.1«¶¾úÿégÔËšr$6 ÙwóùÍ^°w®¢ÅE«­ršƒ³¯1í‚M¨–ãÐÞ|0ú¨ÍôˆNHh÷;o?VÈ/ŠâåòÌ2ùí ¥rt…Œé¾¢1ž°’ÀÙª,˜l„™‰ö†b$÷æÜÛ¾ýµíQ‹æövñKwº" Œ\S™GÎ&Õ¶ öVŠßKçòv9ëÛUûj:oW«v«$w@ دà BÔFȆqh¨K+{cò?tíÍ0ÜÐ㣰lGaJÇGa çhƳVUèºÜµuX6#Ûç ÄÑþÏ;üŸÇú¿”mÿÇû*×:)¯uRæµ!k#¬xÊ]ó”-4>´%ÐðIl‰*ž mÏÿdK+¹T&û ílK¢½L^¶ÓÕ]ß¾šw«rIHùøHGMKˆí§È|×ý³íèfÓU×ŸŽ q†¶ôlX •'Ù¼hçóëvŽ9NɆGsIl$[EGlBærºšžÐ1¡X´R mvªpÑWpSͶ¿Ù]·wýtõãÛ`Š“G/úµ2dQ_á<ŠË³g—·Ÿ®Úww3{õnºü`góér¹Us> ùm‚Ÿn~;Ñ‚ÈG5‡ªöpº‰F\‹/#ÑÂÈIÏgA3xûº}'š òǺ›&qôÔ¢o)“½`z2=™ŽÁ”i~¼:Ò.nû[„~œ:¶Çê§³Ú6õËÙþ¶¹+¿A;|¬zP²$6[µl`œ]¹y(µb4Ï/.ê ÍóÙê¶[4×Íß®¾×¿¯>¬VŸ—ÏšfÖO¶ÿÓç¾Óä·]ÿ¾ù<}„?þ ¾üzOazšéºâ˜«glÕ´·‡3ÀÙˆjèéWËÑõé ð“õi':(:…‘h©è±sk IÏ‚f¨ä°«öíFã‚fw„ìÝŸ»§ÈVŸ·³ÕÇã³Õß«]ýâ|†£ !‰‘¸G47vò‡ªÜAoûŒ±ðƒÞöªX?$é÷úñù¶ ~È7Ë»zöN4y±ngÜîBûä,99¢çìùžst¤RØŽTâÃ"uómIpû&øÁí)Y—ÎgõwŠ‘h&Ë©ŒDdŽd‰Ö¼£ðß~ÎÛ¬T§ –í``:¾l±?éW<ø¸þDEŒ½Õ5O}<ìxUw†ù€PÝ?l:ô® i$gAë‰Æ¢q²ö9ŽD3éY“Ï‚¦ŒÊ–Çò&=Ècyû„$;]<‹ò–I!t|…”CÂNø!¸-X#ÑHtˆïþ,`4HŽe$Z"ä€Û@ÿéÿÁ endstream endobj 1959 0 obj << /Length 553 /Filter /FlateDecode >> stream xÚí”Ms›0†ïü ÅLÁúBÀ¡‡´±;“[7—4 (” .`Ç?¿’\`ì6驇¡Õj÷]éYT ‚>y¶Þj#JÃT2‰¶Ïˆr!QLi(yж9zÄëÓþÁO8V­ÿ´½[mx<Ù! ã„›xÎWRëã‘!Ãj#ÈÄ9½#‡=7mqØéÚç ÷Ýlûr4áÄTmb¡dzZäž e˜&lÔyãœs|ôY‚uÖ7­ Ü<öHbUt%Ï«H… ð($qüv\,`¡e)ü‹îmÝAîþ»1]¯ê\µ9˜s},U_65LËa¬š"èö*Ó—„Ú”›Å;d–Ò½8×ÊXXÔ*tï}¾*Üa=…á‚"!I(¤ü…5 =)YF³mÌ\4™ù¨ªìP©Þ^O” ÷Åø¨ÚRÕ™Q<,9ŒÌX5ÖX¾]19˜g²®œ…HB.“·œÔL.´² ÒxR(áVwY[îFÁéô K" Å–± •…Χ^¶3(î€ìÞº©ã  ØýZ†Z×à¯êîÅuj{þ‘­?5À×Núõô_? €ÇáÿÚÜÿŸ¹Ëψ˜Rô/¼mãí¾õq[f2 þ©è¿K endstream endobj 1976 0 obj << /Length 1196 /Filter /FlateDecode >> stream xÚ½V_o›H÷§@~9,Õ– 'ÝC.MN­¢(ç8÷Ò«*kBÏ@º@õÓßÌÎâ‚M¬ä”žxØ]vþÏofÖ±2˱þ˜ü¾šœ\ˆ…±(pkµ¶¸ã0áÖ‚sˆÈZ¥Ö';pgŸWO.·G)x )¢¹˜…ÂŽëfy}vú¡œ¹¡ÝÈLÅM^•È}v¬.?Zp…ÖV“–-<ûu3ùs'oÕ.y^ß%î°ÀãVàGÌ]kÑÒj{“Ä90œô¼.‹BÞ9y“Ì|n#Ï\ø¡—éI¥p¿°õ,©è®ˆ•?Ñ^á]µÝæ5)°€‡¯‰ùꌤ/à‚“Õïe¨üá ?|B ´æZ*³ºíòp-8sÄî ý¯ÔÓ2¹¯T}¬3q'b~uÞ½\3ô@g×Ò–m 5rL@%„aùz=^¿ž:çäyq'ï€õcJ¡™žß1ö;Oxez?óÑ3ìú݇°A.1„Nu÷U& ÛäuónZr-U@ï¹su{y9$ÌÀÔùgk˜%­ÂÑÒcrÇÕñ#¶=êQÚ4/†Rù¯bœò¹WÜi eoñïT ”P•8 áô²Ê® ¥œšçàôæl5ŷ߸`¹eJ¦­.qVÆÅРiÞ+ý’ªéhDˇdè°?îî"?rN­Y¬²!;f½yÖæG©îªú0ršv>¡îå{€T˜ÿI À endstream endobj 1992 0 obj << /Length 1876 /Filter /FlateDecode >> stream xÚXÉrÛF½ë+pX%Ž0Øá›¢X‰S*űû`û0†$l PŒòõée°‘´L¦XÅÙ{z}ÝÇZXŽõÛÅ/³‹ë»Ðµ‘„nhÍæ–táù¡I)B/±f™õѾ›Äž­U³­ôÛUÙL>Ïþ¸¾ó¢Á1ß‘"Š= JB÷\8æšë;ßlž¶»§n“Ÿ¹©Ûµ.&žk7õèø~ äü!˱5•‰p!"T~ùªÓF¬òºÙãbÄrŠ$v[Žo&S/ m:D½rnÃOÄV…4¸ûî€_ ß[Rz[©¯ö<{a»¿ü2™¡ýUO¤‚èp}dÜÛº™Àÿÿ4¨†Û-ó'–¼±)yú“ãùEÆ}U´;¤]Õ ;5¯ÍËŠ;YI´ ¶àíj\[Ó(nìƒV¥H‚€¹Ì ÜÞèÈ–—…Ø7ðPS£Û© EûVz®+]¤ú<£Hß~"ùÓ†8‡q½aå¤Àr>΋Ï7KÍN£¸ƒÄ»ž°pWÉ­Ñ0¶µÎ¸§úŠ›žqfÛª»q ”)©Î1J YÖÔ4p|ûÍŽžýð÷ý=÷>9“é¹Ú®èÊ+œmµZñòùFnòj—×xyàw–-«šw©Jsg^nÉü†pQòžyPB$ñ.1bÖX˜8L<»()|bõŠçXµ0—–U¥É‘]k"1*PåìÁ¤‰q¬&®pÝ wýQ¨î9C‹Hv{w9i˜é-ƒ- …âe|¯ªÙ‰ÝÀÉžwÚ¨Á*qØ–V~ì’»Š›¢:ÐJÛˆ­Óƒ W{š «@Fc=´Àc‹º¯|c>ß•û¡qèãŠVm\û®kßêê™T{–vD¼Cö¬´‘“Ø3´âh¡6ç‰C Ù >ް7Œ~Šò‰ªÜ.†\{£:7…¥°˜†@üµêËkÙ§í5¡Ûif­6&È[Ãz¸G8cÏô¼C½Þûˆ>±|H{’Iƒ!ÁˆbΙ¯>·¦ÒÎÌñ[U0g½¿Â@çÀqõjŸo@,aÁó“+—î§Þ6]p;Ò¤Ô òM]®}IçK뢆ð©yŒLcKLcg^•k³´4S··7ãÍ]‘ÒÞÞ]™ZU†#8[oÔAéös=Ô€'úEhDGÐ?$%Š,×1õLñ E¢ˆèfvi:ƒ0†S„ ‘ý”g:C¼óûÏbõÌ‹”Ú‡$ï&RJûæþñ5oÈç<ÿŒú(·Çj»¥bÔ1 á`4´ÈÓaQÉå ²‹W;aÇ|Æg¨:]s*ÂAˆ–NÍgZ.h} (Nv†FÉm[ 1-Rtú¢Gƒ:'Ïù#fœû¨úaõb£©¢¬Öj•ÿ˵ÀL\f''S—i<¨µ£öˆª$M>õ°ý Ø÷åâO€pHsˆ›#ì>ÞÎÎLïD¥³mJ‚Èâ™5¡X9¡dÐö»Mµß0ƒ”Ö!„Zñ©Ž‹³#´Ø¤g Õ _ʦ½öᥴúöv/£¦å2nó§±Q Y̘Á:pÚô $ ¸¾’N“/26éužc¾ê*N9µPÕ¢>×oŒãÍ ïæ¹=É­²,o†QæU£Õ¤$®cO,°¢XI§þ;fP^ݰ0GKð(AäÍý¤«/e}$¿­òk(ÄêZ-ÚZ©3" í¢2EÀþkOâ³*ÝjEc•÷,. =Êû~…¸÷ÀóNDF›Ê„/?º°Ž0wPsÿè#ÁûY0½ž]|¿d#Ù=¹Ž/¢0°ÒõÅÇÏŽ•Á"@§ð’ØÚÑÖµåŒF>Öµ+ëñ⯾fÑÜØèÒ¡—Å‘pcÄwã÷·®€áYpØX¶Ö{Ÿ×[eð.ˆíKÈ0I1Ðêú’ç @ƒˆ” ñF`‚wã_«šÞ´ÌÕ‘Œ0 £stĺp޼GJß±±ÿ¯ºN«|sw'ºÏm¹âò0Ilüè_iî§zµ2Ó$ ´Š›±>`¢÷’ø@š–Uû*’˜Ç¹ŽÎ¥)Q.yˆp— ü }×^èÂ0¢ÿ™KÅ 0¸óª…Wvî:ížøLÉ m³å§_>x§ åL7ýs¥š+^ÐM*·mÁðÿ"Ò{ endstream endobj 2000 0 obj << /Length 969 /Filter /FlateDecode >> stream xÚV[›8~Ÿ_è ‘ŠÇÆàÀJ}H»ÍJ«i5êdú²]­0 [n§êtÕÿ¾ÇØ$q†™AÍClðwnŸÏìììüqõvsu½¦K'A ˜³É‚1¢!s–„ Fg“9y,\ü½ùózÍ‚3$eE”€ž³^ÄÔ\:q[6R \acæzâ3Iõƒ%¼¤ZÁ}ÏwÂ{juá¹Ë±ã“11žœ¼ø‚#¬Th 0‚’(Ò°fû¯HåëáÛG¹ÖÐOfEÕ/ücï^Re…¼Ö<[Ži¹T”¥-øñþæfÒDÚ\ ‹\¯ÊÒ¶u¦¬èWÿ Hˆ ÅÖ¢ÐnYìör׉×xè¾Ês ¿Ó3Æê;èTÊ›IÙÚ~j´({1e8 (!ÏÛÝ–qnäÜeÃÑOMœÀeZæ[‰ú⇘Ç/Û=· d×t™è,Üzus÷~[5J²ÉsÛ‡Õ4šŸƒ6aw";¤²hêyáõmYH´}˜‡þ*D‹ú”—6y®IrwÚÄž·b¶‰^¼¥<ã’»“±é;“ó‹äJqß”¶tI™’oE9Sÿ€}œWá3`(ÍÆNÈkž~¦±íËÎbjP=·=@⢼ø.fù€.µo>ÝOcû¦“H5+ ž‰¶)—Bµü¸Éᢖ¢ãËßÄL×Ò¦ÚµxÁ·±Px//*öI–4emñ¸[G$0] v§–41%ÆÃ˦†N£p‘«nw¨D½ 'ûg§Ø ÓK¥‹ñiè%ƒöŒs÷N:ÕG)YŠy ,“¾ÑàXí‰7ßîçaÞ§RUÃ`;×ëQÓð$µ†^ -ü0 Ç…ñÀkâ°)¯Í¦©„QÖ5Õo—¡Ð3ŸbÄX¬Á†À/ÁÏ…1ìÆ(Vµ¹\ëJ¢=Búž?h”¥n?–#Ê„­ÝV)&ÐÎÌ5;Q›ãšñùzq?Ü…+rœOëG!‚|Fg¦!\ð(^z)ß”‡ªÖÚµS|«ó*!9R]\œ"Jp³PÝk Áß¾©³®à¥lá öD—B1ÀFªºA…?U¤î%)Ý/3¡£ÒDÄ¿H Õ‡–f·¢Þ˜ºº‰ì 0zØñ»÷÷¢ú¤Æ÷D†„àÝòhòXœ@>Ô§±ßAúk€Å¢Þé÷ŠÞaÝ—R%-Y9EÂô¢Q‰Jñ·ÕtfZ•Ê­o‹(‚¢ƒRÐëL´Ós°¡·ïôJ4ªçÆÒóôöÝ?i:®ï7WÿA_ endstream endobj 2006 0 obj << /Length 2445 /Filter /FlateDecode >> stream xÚYY“ÛÆ~ׯØ*?,XYBÌà’+•’boŽRÙ®xW*Ê–’°@€@i7¿>}  »Zæ…èé¹zúüf\í®‚«¿¼zw÷êõm^e~‡ñÕÝöJ¯M|•(åÇ:»º+®þíÝ®RíÙ¼?µö§ªéWÿ¹ûûë[L¦™@ùIªaQšG8æU Û¸ïë[c&“Ö:Õ4k&ÀÔ<·(ÝlöÙVIìgièvú®<غ+›º[­M˜y}Ãß#Èyd¤½Ã*L½S×CKÞý vó,7r™„#>ãO³®l½ë÷̯iæÁ¶å†ŸV8wÓ7-·»#¬–§Ü>–õŽ™k\ƒ³(bAóºX­µÖÞãºežŸs®9èZE~*^ec«êíü“ ÇòâÞÍ–¿¼ ‘¨0ü¢Â2Þ‡ »ÍOUÏ]¥ Í«j2†©Ëåo.ÿnv õÌ@Ì€uš¶“Nám›ö 7o׿EiÉŒ=s¤?ám}°—ÒÞO-3ËBfå²p×·dT¤y kÛŸKt·ÙÔÞ1Ëþ!ЦE§Ó±bqÙ¶Vü¦© ÚùdøV Ÿ•ŸVQj?Ùî)Ÿ {:»iÈ£&S÷ångŠ`þÛªf¾ÙØcß-º$Z3ñÞµö3+„ÛNX »M¾‘,·wª âo';Ô*HýCÓÛ7H‚|{ö ´Æ.”x÷eÍŸˆ"ïI Øƒ.38Õ‚Ì’ø{ϱ‡B1 _ç:ˆ¼#ô)o°n¢éÈûuok|Ñ^ðزã´6óa•F~¨Ìàÿøåû…ä§€ #7膗î󤦎›9 þøyo[ËœmÛ˜RkMG]‡Aä+Hº³óÞœ‡Z0 ˜™Zafå‰ož‹6ú*£ “E iÞ¢JÒ”â¿Î!RŠ1æÍ ”·®í.ïKvôQ„ÎÈ)&]+£‡t’ޱ‹¡\ƒôá<€†„©ù³e[*¯å4%©·]o-0¡8a?)Û‡#DæØçô¶V)9ø@Ò)oN”×=¯½Ø“EåÃIÄDÁpZ¤I{H¹¡ìTU™; šL2Ñ$v‘&qY§IV[êfÁ[XJôÖˆÂF“‘¾J.fÝ¥ Òx±†"pÊ$s*º-9£Gä#‰<é[ZéIt§d)ø°ŸÀ|=_0¥IOªŠ9 «‰ûˆ æ~ssVóHT´3h²ÜÕM‹^W<[³È•+€¡lÛû]ù_ûòøÏ_üFøÅ¹=¤\É‘,­856—ó‹Ë¥:¯Žûüñh8m9«§D¡Öºe‚E¯êÿÂM[Øöå¿k¸öV6Ç*  ò`æ@sö¶=”5‹ª ï-Tdá+8 (¢€¤b_…É-/ŽåÖïèðÀMµÈÞŸs™êpéBÍÞžÄ Ësghå\™]×)z'¡S‹9¦nž3a¼˜æþÔ–X$_d퇙\@gþæÔ7ÛíÒÍ óÓ±‚Þ,ÙØÒØ 8䓵ž²h¨`J‚–Ô—X×ÄŒJð‹=j % êÉæ=¸1à6Í­|q{ëV¶ùgí…ÍŠ…| .[14—,9½/ e¼ßOŒ úQrЗðË Áµ@á‘ð{ýû7ß\3)€‚¸ÂdÀ>[‚wI&»`ÚfÖS×7KòBGp}YPJžkmqÚô_Ößgó×}éôª1ç¹[R^•„ÿ™?®LMŠKºàY )íýmËœšˆQëÊm©îi#BÇ16oywBláX=΃ñ¥6ô{\}WÛލ‘É»nò‹Zw„û÷—‰µN@ä\@y") ¾ $–(ö~ƒÈ`ÆÁö¹`íDÔ—¤¼§°‘'CªK09‘þÁµnÃó®ã®kÖìÁ×O®xÿd@`“Äæ–qƾÔã>Z{ôáÂR]P\ÿ:\¶†›°ñö *;˜Xò툫xΣ›¶é$ s&©úòèzQt2ÆûñØó#ÍÅrQøÙ뉸¿âtîB—"”¤c0_޹X+Ëüöž¬Íï]q’׳ñeÕ2n1è/x¢»Ê×ï·j^…»}~´/Á.CvD¸F!i ñh„—n|udZ^JK¥“cï–톔ƒíIiÃø ÞÄû"—æÄs7xãB⠌㾵ÔAGЄvëû¶¼?õ‹uwd“„ࡼ8¢^nOÅÒòp ÿ«Òsè~ˆŒ€6uAâ*ÌïÏ9ôð, 'øÁü1­¶ôážH÷@Ž«ÕÅ’äÃT÷>NàìÇ¢K-lÄ+Hà„g"ïǺz t„ˆÛŒŽUn—*búÊ OAmÞõVàÔyýÛ·ï^z\c(¥ñ,jŸþ?Iƒ'šø MË?V/óÆé%Õ1ü+2üOrZ¨Ôv؆žvÿôu«æ‚òcô‹%ý™ah³Ý{6’g¯(d8ûGÛôç ÿTvP0è)¤)Ø ¦³Cz~Ý2Ù¹±á)> stream xÚXmoÛ6þž_aôËd fù¢W ûеÉ^ EãnÚ¡ -:æ&‹†('Í~ýް01÷&f<ƒE†*¹PÕ`û‘‹YJŠœwçþµVíZ5Ó™"j ^ÁÆtÆó áúZ¹›8ZVSíìtÆ¢VÁmãîìÑiC'Ãq3VF}$Vÿ§NwôVµ½ñûüY¡[èoþ¾Ô—¥©Lóg4"B ÞtëàÙ<Õ×ölGµ='±ÔvpæÞ‡ó1ª!¸ÓOþc·™ÂAá8À„sî1qW°´ÛÔ8¾qØ• lÊ¢…®>ó6vU«·UXYayà-Ioånâ$Òwµi-K4«WXwƒyžš$³v[é–,ñÍAT³îÕsW¿A‡Ä×X¤ÇÖ3’ñ=on¸)“ŒÆC|—Æ4%Y鯪<f/H=Ù´ÊjYwLôȃI]Kx€«º]#=?S»“ü²´&Ë`¬‘­6g3dñHÎâÈo@‡rç¥dëTE·­®ïܪê€Gx/ñÅ•\¶¦DÇè­Ý=õ%æ ¹ëiN8ïãѵm•„³¾ÅdFÂi>]×­j€múþŒît#wõÒ¡°eUv 4Á »ïŒÂ?’Ogo?<ñ¯J€wÝ„ð颀”ÒâXZ6^SOŽä­AõöB,’¬SZ‘ä]4H\´âꌨ$¥ýy[Ù.צùwXŸ"ÔÂ#_“œˆ½xßÝ¡8o .I£@È€` KÆŒ°>%1ÝO]onn¯¾ËúK<¡Q€íõ¨-OZƒ VÛv8Ÿô~º5çgâý<¿7XÝœ“LŸ±{×Zý¼æœàq„šoB>-.ú¼rÑâ×V¦ÙÈÖÀ(á•„ŽŒO´A—å)Y|ÜÿŽÑ u=¯Öº¯°+w­#õRV®-<â*ø4 ÈÓ‚$œ‘a( N‡ñËaŽ=Åå`ãfŒ&̱íºk– 1—”ÒÐ9Aj_šRnõÍz½Ì´²Ð¡ é:á ¼]ˆ«Ä¾·ÒZ\ç¡Et§Ì拉…]õ3M(üg®(Þ©ÙXoëR*D?Ú,Ý΄ñK îÐ æ›âQĈ‡ˆ ÏZüsZ¤‘¬vꙘá¨/gD,ßœ¡#”d{±Œ0?‘‘®†_]7 ˌőB1'„Ñk2ˆÌ­ªÔrÜ\R,K÷­Ç‹^LÕ4ŠG?»‡Ù¢òaŽVªKé!n•#,¼ý¦²f”§Uá)ïôfd@³3ùäi| î)»â'êõ7£¾ú*7~ûLÀ#oÉÁд •B¨q £l¥SÊWÛÅfùÅn a½rBÙ«,…\O†7·Å,P`J`¸ËÞÈ%.ì?Lð-üRqèP‘–Ç=óö¯Ä$ÎEßtÞ~acf2Rq²•.Ä'p]Í/þ+£·n endstream endobj 2024 0 obj << /Length 1162 /Filter /FlateDecode >> stream xÚ•WK“Û6 ¾ûWhr’gVŠÞCéf·3™NÚõNI´DÙÌÈ¢*JÝn~}‚²-¯Ò•/ àÀžµ³<ë·Õ¯›Õûû$°r7O‚ÄÚT–ïyn%VêûnæÖ¦´¾Ø÷ë,´9뇎?¬ïy·þ¶ùôþ>LÏNFžï¦Y÷ê3IŠ˜•g$ÝmV¯|z–’¤‘›E©UV_¾yV ›Ÿ,ØÊ3ëYCVz¤ÞZ[«?Ž÷]~µ%Qtn‰ï¹Iä[Iœº‰K^Yq¼ˆˆ'Ç7ÏüÑœÇbû6rÂ8³ÛZö8JmYÑŠÍ®æ4Öh^¯øÔ+YÏ´Ày*¢Ø½ä*ÈdoÆy‰¹¹Ÿ‘æ¹*:ÑöB6{OvOÜÇ?sÓ<¥ã·PÆØýø lUŒDÀš!–5°Ò¯ƒÔ~^™-i¡"ÖÁ¾z±×ãîK+ V×/aø¿-àè hÿóÐfE'•¹„Ñ!Å/d'€¡`œŒåqL†¼®•»v¢Ð³oq¼v‚.3ÀU4)d½ömÙñ硽ÕjÒ^¿ç¢£¡(yƒ;½Ð¦@Q35 øŒëœÁeúzÜ]Çk¦¡¶ðä‰2Λ£<3ÀågHZ8Ò9c¥@~ÂÐ.…jkFꣀ’–ÊC¿ÀÏ?Z­kaaioºôº'¡å`\©ëÅ&¬žÛñÙ€z`Ówy`Ó'‰Á¡íÂáÔ6¹ý΋þfÎlC‰?ÝL&›ÁÍOÃÞ©çÙ¿Ðç÷§‡‡Y¨ÚU…/ü |ÿááñnÍ‘ô3¨? ÛurhÝíËBÚZôo£áÎ Mk{W‰|¾jÏZ~…¾¬YˆÝͲ t‚:C¾ÃTünž x¤oÜlÐ æ‹EÖuL鄹ë–­˜à |±Q¬§0¢Ô8cñwÑ_Jû9—µÜ½Fj 3óQæ’ôð¡Û He!ä/õ¿iâô@þ¢RO*Vš@¡Ž…šë)«IÈvqbÏ\0é˜?qÃlšP– ¾¹AâÙ•ìtE (Š’ö(Á:Qqeª ÔPQ Z×Bk!ž8ÕBÚÜFLÁ°ZI³§Ó»9xà}' 5ëõÏ·D‘‚`çê†&¼/Pµ(¶S.t™{é÷PUÇBAäF$—Ž2qÒL.¨´˜šó,ð]ãè##‚»ûc?t½W‚k¡QäÔa !ò¢à]£ÅJ˜vã$6´ESÔCit‘ ébªpxÖ`Áä: Ó|Z¬+ùמƒ|”™$¤&|;Ö”ò [´$…;ÑsÃW/L¹ÁíÍ@våxV·bðm©ÕÔ*agG¡½Ùën£à)€`2(^ 5+ÙÍ–µN÷/ÏåaÈ" Ee–¦Â ÏÕH>öD@0W&S°1,Œ.Çxßà¥~‘î\K^±¡6Ç„Û÷}瘯ó¶ W„ôhÏ)^Æ„CŒœh8óÂNþ3žÅÜèÁ3ž^yp.Ãß™ÿC‹Q endstream endobj 2034 0 obj << /Length 1539 /Filter /FlateDecode >> stream xÚXÛŽÛ6}÷Wy± ¬Ý/)ú&»Eƒ h³Û¾¤A@Ë´ÍT·ŠR6É×w†CÊÒF›X$ñ2<<3s8´k-×úuõËÝêéMX™“Å~lÝ,Ïu Œ­Äóœ8Ȭ»½õÖŽÓÍ»»WOob4F9iæ5æf“6ïòŸÚ§7\Š}Ï ‰óV®^Í<ŸÞ„áÈÐ6ðSeië'нc[÷³û<±ðl;Y꿳’o¶aÛõA?+ÕÙuK eÝê!%ïØžuŒ¾òºèËJÒGWÓS! ×ÜÈ…1u /™ÌyQè ;ÜóçóÈ,¨×XÌ¢ˆðñO¬l ~µÙAÄÑ{^áäíþD “ßB{ Ýφ‰Ý­©ÁáSƒÃafyl Šnh í¼@›S"§.ÐLn½Ô RW6…èyà9pàºöåbÜõlQQ[½Ûlž<ï¨aä¦8‡Vµ¦n:qm޳®W~ƒÖ¦¨µÒòy“†60z©&»Ö ëÁüŒCôbÈÛnÌxö6—R1#/§ïF˜œú¹‡oÏæôõ]7SM¨ŽÎbÈMçHñ…_ŽúGSH4ö'@ à£ZPkhu5EX—ç‰5|Qpþv¬ û÷˜¬jÄvÿÉÁªA¤Uz»j&y±"šŠZñÄMÞú*ï„á)gE¡5CH‡'ð¼`ÅÉ ‚½~M£¦º¯~d] ›'HcM±ÁtÕ®cû=põ-Vü(rü$|@KY×Ýi1%î=µqÒ4*Ž-ktj*"”¢Dˆk £Éy6r›³®ã$Ó»46ÉZîpÿ òµÄìÛ ®ÅHÖ>”Ÿ!Ó@!# ³üœÔjqz}óLÏ÷Ьְ.?Ý×í¿€x®Lý›Ê2ØÕÀý:˾å%³c!jzRÅÐ&ÕVYÔÖ¥%yªûboĽaDÁD”Q‡u^÷DŽ\ëÉk4¹F}ú¯%?wTïr!ƒ-89Å—mú¥€NS˜Ýò‚™\¯ªã˜´íÌè ¾^gÂڦ§P#fÛ©ÞÕ‹‚x˜žô¥f÷E' ÇêRÔ-“^KRD¹úãFÁV„ysÇ‚«ãÌ5+¨wPé’uW4kϬGÒV„œÃŠR/úŽúã{CbÝŸU­´è½ @wmÖw5¬/PÕA¢ç¹ŽëgÓ:¢—šÓ3v •ƒÖ)£iŠ‹Ç=I&è˜âñ™©œiÎ.!BBad–ëNæT þÊuÝt­³oÄåîýC|âHVäÛ-—†:U"sÂb‡² Ež:Tà¡O£D•lÔîS@ÿ‘×å{I:Žõ:ª?깤ëÛ/ùv®–ÃØè¦üä83òü+bÞÈÌRb>ˆnQÌ¿¢ñã:#´±gRw}®Gâ Dtyº­1Fî÷Æå:.ô¡¢3·GIñ`ã7Ïóìç¯o¯—ƒz¿E}\ƒ ê2}Råb­ÒIš~>ØgvÎ쀻càYHÀß ’„°ü½Éb›=äÖ9-ˆRÈf׉Í}ó¹NªãYØÇw–ha¼ü5Ýïæï¼³wàŒÅ¡A%ZëZ> stream xÚ¥WÝoÛ6Ï_!ôI&E_–¬‡>dC=tHƒÁ±×‡µXi‰²UÈ’AJIüßïŽG;’C·öæñx$ûo­-ßúýæ×ÅÍí, ­ÌË’0±¥ø¾ʼn•—D™µ(¬¿í™3lÞåN8µ7s.«¢gµt¾.þ¸Eé`wì^:àlµ/ÉPæÆ×·ÝÎb ì¤Ý0fD{–’­ùhÛ¹Ž‹‡šO-7ȼD« 꾪úÅŸøx¦‡ Á¸l2!ÉvõçÝ/jÙ/•œu½àҸȤd{Çø¾ýž†‡åý½Q´ßVÞ[ñwó‡»wFùší¹ËæmßtòD\Ûš×Õά¿]¤Žà%¼É¹÷øÛÂÛ¶¯/ݸ«l{bu?¾kvwÿøÁ¸§ažØŽdó¥Yô‰‹U+ùa%ëžž5 Ž…P3Àñ”äîĺßòƉB»“?Ä–S“,båÔ£H/›†‡¸sÜ(ŠlÉ{Á:¢Û–؆sF7»ú 7H½0ŽÆx¼\¶åúÞ’Æã0‹í®%.+ "ªƒœØ°¼Ñ»eÎjî¬cW+MÀÿk%buj·?³þÆÍû»ã6w;ïHfÍB\›»œÁ€yI–-`öZC_£üZc³„Œ‘Œbh¬iýh,.šŒ~ÞÂk¦vǪ¦v³&öòÓG"¶¬Õ‹¾¯)^o0gÁKÖ×Ú»•¤2ØÕn¢äöð€I|'ø?Š_TäP0€j­Ý˜D‡(ßõuM¦St¥h¯xððMÞ½ÜHD¢Ê7†ÛQwkÞ¬» ѪõŒÏÖCîmÉ«r_á*)´‰-¬"Ôû){!âÉL`¦–'{þT¾aB< åDèªIžz®>[‘Ú`»VL‡8ù"NmùfRkǃ¨ç»:nÇÅÿbÀÏ9¸Hy˜ø¯æã4О>Cœ)αërã,´ù“‚kC‹UI#€y¯÷ N,V Î Í…D!9e?Ï䈥äe¯]éB²WQ×kÜ;*¨T’gjƒ©ÝÕŸrì1%\ï`ê”.v¬jÊÑya<Tuœ=o8:Éî@&*i#«iG{h2ŒœË@VÀ„ ”D‚ -@ƧÝtu‹`¶Db)èzÂØâ9ÐûP÷‰­’ŒƒöBÍŸUH ¥ÛG$ßÓ0s‚ °±ßôˆñÙ$ŒÆâ¸˜ã£bé¦mSïÍ-Yˆï9¨* ­xÛ9a^ÄŒ­z'’&Õ2)žœÁŽˆ×˜®ÅÈ¡E¾%à„À1ESÄGª%PBÜ-—øí¥í£~…J· ¼ãµSVP=Lw“ΪûNI…¿œL¿¹©ó>Ñ~ü7WÏ"G~~4tyüÐÞ©ŽgJJ¾ 4,w¦>ô‘ÐjÙø©«†«Nšºá³_ÚþGŽù‚õ®–홯øySKà”ÈùO¾o×¼ûG ¿ÄÏ~Ò|XÜü XäÐ endstream endobj 2053 0 obj << /Length 1507 /Filter /FlateDecode >> stream xÚWK“Ó8¾çW¸à€S…eù¹µ{Xjv)ŠÚ \€ƒb+ƒcg,›!ÿ~»Õ²c'^ÈP9DÝnµº¿~IžugyÖëÅËÕâÅ+[©›F~d­6ó<—‘3æF<µV¹õÑŽ½åçÕ›¯"$ÉCæúÀñHæUQ¶²¹-‹\ÞÊ{”_xæ”ëÕâ~Á`éYl8 Š#7H˜•í?{VßXð)M¬-º³°!8¬Këvñï ïô_{c/˜çF³¢0uƒ0ù©…àZ8Ùî»i¦®-&¶j›eÈlq@2¶×HHÍÉIl´@½#Jç(ñí{bí»ì«>}— vy˜>òß›‰bÄR7Œ¹q%UÖû¶¨«‰óG¦™XK\žøVÛ=Œ}{ÓU™Ö¢)â2»SrÓ•F¢nhÑÈ]½ôû[QÝÈ9¹^:@HBèv+Z£C”%i®»Vн€YìDa, Œ—Ì ¦‘†€ôÒm6¸èni’;¢‘Â]:QÄìk¥d…6µœyX&Ü~¾tŸÛEû t^d ü í¬h²® QŸ<Pj ÈÃV6’>P[Ý_É–¸‚è -¬Ð0³¾T9}kD^tŠ˜¹Dý•Fn¼L(åœKõÜNÒ)¦@·5ü§à€l¹G·™oÿmÄÛ-Á¦‰Ì ¡óèÂè¨ê–”€7އàЧ‡Bêx0RµÅN´2§}›F—„>OžØiŽ®5]7yQÁ>5çâ'/ôNs*ès‚ÛLµ´Ð€â§4E÷uß äÒHk\@Fçã7²ÂlS„Õƒ9‚ЙÐ!½’ydÇ$Éíh¬ö3€?ŒBûåaÎÁ\nDW"ÄÐ@¡Æ?äãš ƒràç…Ú—ÃY!:Cµ ?7±š;«_Þ¼>ë’aä&QÒ·¹Û½À¸*vÿ”íiœ´†˜CçÚ£Úêp¬Ðºm‘!gK¤Î÷²Tæ£ ©!–š›»BãøÜs™ŸN’B¡«‚œéT»3!ž®ÞÇ‹óiBó3ã…îNðªÍ¥á6i v??t£„ө“³mó¼NA>i£Ó)„ù¬}Å ü¤œ×_d™0“%PX`zžýý=Ѭ'S鈤íþHüÝû·og5÷ èÙ¼v÷˜)cáÕÍûk ÞŒG˜ý—€ýgs×aX9´{õCÐ6AøÃTŽ`Ò—˜[Ù5¢Ï¤5Ö©­hÆC¡[ ¬”ê÷Dæ¢'gL¬rÌ! á6ÂÇ!¼Ø²wb'g3<MP_:2ShZ§•ʧ—SmÝ@í=Ö“V»ð+ ©«/‚c÷Ô³bs Þõ6Gýhjä°8Ðߌ+ÀÝô:Íö“² jc¢ÊÊN™»Ðifgì£1Ås1"7¦ØŽa FA#&1Ÿý(ÓúZ½Ø¶«É`Át¹|°Ë’à—æŠW_³ïXo£fNs„3•{¹ž$ñh’³æŽQÊ|¶ÍûpÓ÷ýpÚ~>,S¸ð•ü•kòl»¦êKŒl=k+áÐV‚‘›uUNVÝZ_Q°O‚Þß–aµJÍ$ÝU‘îªôßëïb·/¥º|Þ% , <à “šWÇÓ§fŠôƒ¢éªß†šó æÌ#ÓÈÑ3W’¬ ^†­ýÃ…Rû}Mö`xÙÒò€·p\dpû#Éú¡*k‘ÿÀ(1L«ÉiÃ+lõšÞ‹ì+4]wNMY¬Ñp¸·õÃïT8§oý;aéûnÀ¢¾ž™ÐÑà ͇‹˜ä\g übEƒ©Nä»1<ç@ÚËÚ¾Õ ¨aªâÿZ?Bfœ6¦º´ËÅwèÿüŽd䟛:¿¤ÀUÑû?„Ï2k¼¿¬ë¯}f™\R;ýôÔKÃ‚Æ ïEerA%­Hî¥0I×Uð²0» á©M!‡óa¶°xZ×UŽžë¢wà¬Æ®W‹ÿZx/ endstream endobj 1956 0 obj << /Type /ObjStm /N 100 /First 969 /Length 1772 /Filter /FlateDecode >> stream xÚ½YMo7½ëWðØ^(r†ÃÀà8u ;‡¶Fнu„(R Kmúïû†k9’-Å+yÝ“¨ÝÇ™Çáp83ë‹8ãŒ/âMý%S¼þ²ñœ0(ÆgÖÁˆ¡¤Ð@†©b³ úÊ#”¾Dg$^Eo¢Ï: cЛä!Lƒ§Ù)…(&‡¨ƒhr©³“)\ggSr€`%Wi(…–aÂdJ*;M ªÊ,À “«3Nº ‘­Ê¤£ª3é: AEÖUkÖÅeœ ³¬½’N€QðZù¨’ÚÈëظ¾MÀQý9’¢«È& ÕbÑPqª§W*•)Eןv ñT&E {VŠÏ|¥R6¢*Ãn1ƒL,œƒ£ŽØ°pÅeŒ°x<ƒ¼˜EGÉpÒU9l gÒ·o ×·Øcñì6èÀ6†U1RïñŠƒBÝ_Ï&$µƒóÉ„Âj9¸B(íŒbÄ‘j#øŠ‹*Î$¾•GòÑC B±š*á¨s±Ãt'tj%Jш8Ý[L*¬@¤èÂá0ƒ€•$êF8†àT"T0Ô¨…Šl¢«‚5Çv¹áÁAIÁÙ¢×Q0‘X™`o"U›ay‘I'@O„1ôY1Q’ƒŠ€É«`HŠI*‚³SÁ‚s /•Œ­‹%¨dœÈ䪶àpt¢ÎÀú;= • mpt4¾2^ç8sf†¿ÿñ'^;ËÐÈ[ìñt9™|¼xñc0K±ÒíÉf,´V³}´ÏÙ&œŽè@VøžMNgÓ…9:2ÃSØ;—Ûi§ˆ]xÚ?Ø N·»p"oap!œÍú‡ïæ³Ëófa.ÌðÝ«S3|ß|[˜;]ïÿýÚàÅèº O ·™.n4–?ž57³åü²©ÏRûì·æjÛXbG4G²ç:¢X¦ÜMLB×½A4²÷i÷á ·Ýpègöa\J|Wã^><<žNgvÑ^ðʧÞï·ƒ–ü="uÊ`x¾ü¸¨ÿߎ§Ÿ׳ùU3¯ê܇áëá›áÉ…¯”á%ÖFˆzË–h}Æ-ˆs¢‰ »h‘!v\ zn†¿ÎÞÏ öã§³¿¦öt<½zƒE_ÏG‹ñlz<½ü4›ßü¬vë…Vplqu®hëäqZgË黓ãiàH»5óS|”ÇÊ4Í/_>6WWãéõ†mªS'Ù#:­ƒïâMJÖ;ÿܪr¾ÚG8Ъµ/Ñɪ¼kc±fèaå~ËÊýÁÙní´(ŸÚhiÞ­~5 Õ€{½g Y+„Að Å’öSjüðƒ Ú†ów“YŸ—O¶°öÙµIlÒFcf›‚ßÉåëhqùéŸÙüsL5õT#´_ 6Ý1ø'¸c¯í€Û4À3[®ßgƒÕŸlcÞ]7 {¶œX”Ýã«åhróÀ'íá“ëàÇ ™íhñb}ÊÑ„#Ø]¶×Iý¢{’lñ$y‚'…U- ®×Ì?i.©L~6á ¶ýjêñxwcn<šôž`âªÔoÞm?½³„Û–á2ÑÇøTO‘þ$M¹ endstream endobj 2064 0 obj << /Length 1217 /Filter /FlateDecode >> stream xÚ•WKoÛF¾ëW>Q€¹áò-=¸h8p 4‘I+r)±%—*IYò¿ïÌÎêAicË'îcžßÌÎ }géøÎ§Éoóɇû$pfl–‰3/îû,Œ'åœ%áÌ™Î7÷¾RÅ]]ÿ!º§AæÊ®Ÿþ˜þp¦'œ‘ÏYš… Wó¤i&¾Ñôq>ùoÂaé;ü $IS–¥©“7“o?|§€ËÏ\Í2g«I';Ò¥ÖÎ×É_yç_íIzÂ}–DÜIŸeqtá‰ñâ €ˆGì›e|ïÎ'©äÔ cð~·î¦1weßW­Â³ÔmŒïªõ€ÖŸpbWž9ÏX˜¥GÑÓ0ÔnOƒÔ%×áà»ûEõÝCÙI…¹2T¢®_è‘ÔdAÛ%@ÚÇmd`C2‘#çŠvmI×ÃJÒâH’ü¼Ðu>  R½¯Q úb½(mGyè_ƒž§^,¥˜K Æ ·*³åBƒR5C”œÍ ¼š²]ü#óáV_ûã+pI€‹±ï»¿ÒçϧÇG+i)Űé€k¨—]»Y³Å[²¢®Ûe™³aâWm]Œ˜|Æ­ÙlÓËñͶªóvwcåèëvScÜì´M¥Ø:Î,ñùO‰‹ª,/8¼UZ9T[Èë y–Ý¢=órþåé£Ul«ê¶nÇ1º¿{üj'oÄŽå²®{¶–ÓdÄù3ë;¡Š¶a½”ãPÙѩłٳè®Ì„“Ì297b ­0ytæ½Æ±×"…båN]™ý9S¢‘×/ÄYÀ;ŒœS&í¯Ë4Q_•/oÅ×€ÂÓÇž¥(èÊøZ½ ˆî®[n(‰aàý«uëzEUè¬'ŽZAš@K ö-ñΔØvn&®…y¤Î3Ütc;)o׫ò“¢?´d.2º7“.{1H軩Ç]݈¨}9VªJ-ßmý¡â^펦Wî×erêEQ ¹›z0¾œÑ'#+ê“ún£…ÿj£¿Hódƒ-¾aZV„nK;AŸ3èñ0Æž È+œŽm[KÞMËuWá€Ë½HT‰ã&Œ ÆÇ¦ckyYfÖ8„Û/”Ãý "šu-ñ…ýbžØxr YÌöîßèº{cyÃŒñì@w¨ð¹Àl;:ÿz¸‚ cø(Cæg±½ñ¾4ר‡Çª©0Ÿà}6-}—&a¹]U`fŽf®è4"ÄÛ[Ø&Ü¥a7@É3ýÀ¨dn…QSKÑ›åß^©g\£–K[ÝÄø€¯^Ÿ •Îe€N™­V)u?à4"Éñ®¥¬¦“áôˆ_ê> stream xڽ˒۸ñòÅTjÄ!Á§ìÓøµÙ”½IÙãÚCœJa(h„2EÊ i{òõÛ/Ô˜ãì&™\$ »4úÝ`tvsýôèùÕ£‹×Iq¶ 7¹ÊÏ®vgq…IšŸqæÉæìj{ö÷ P«\ýåâu®f”Iš„q–Ã>DóÚ6Û˺~«Ý§•*ã:\ó(’“üÿÅë4m²NTF»¬UÀ„÷êMׇCgNv¸Ãh‘‡›RùÓ_š¦…U«u’$Á×½­‡=NSÚ}Ëÿ°u¸Z§i\®â8¾¬²,жÖ×µaŠöØÛ¶‘ý´3Oï°’&3VÊ0Ï˳uœ†å&g~>ª8ú÷4òÌ?þjëªEŽ¿=^­°üÞdÁÏ[Ó ¸·£$Åë!r‹³Ä8Ä€Ó«8¨ë[Dfùvt¦ëÌ–ioLã—]Ãè¥Ç ¿’Š`Âô¸ZYåÚáHú×` ›LîÕîPnEP™º†c;ž mnx¨ùïW‹h¼T|kæÁ;Ý|bôûáÀÖ Ž>FY´5;=Ô= ãg«u*-œ#gÞENØiX9ç0cíáX›ƒÈM£Y‰×¸e‹øˆÈÛ‚ÝÉÓõº®Ap?Ðôšõ¶Ž“0Uÿ¥ªÿYÛÃAƒÂÓ¬D…ç‹ O³Í‰Â§IÛ¸l¦m$m#fQÛ âšH¹×=[’MFÚ¨‡ýÞ0š.Â0’>hþ Æ9* “ÍfË~]­ãÀ¢ñNv²À![ ªˆ¬Æ{ô3†uÆûöÞvsßJѲ3G×’H¶Ce<¬c“E;×ä38Ýóò/éÃZõ=W`Iž¡dÑ&xc?¡D :‘Ý3‰®Ê©sÙ`Ý®u BõPËYm EÃ`Z Êݰ÷Âj mÎ]¤ä…o«õ’^j´’/vËb2""]‡ç yn[Û#`°ê¨¢8A~X9Šn+ô&ˆçèM‘Zò¦XOÐ<)K˜¥žð l€eIáH|‹L ç>Èñ;\û×<Ñ®o;Û…KB{½*Á È^iItBRYrªÍ9 hQÞ×€ø~xA’$¼fxUk`‘®'‡\¶îIN ~¯û™,°©ë–˜¡ ²LU*[ïny¶œ=s’=à#ŽI¬ L„ŽAÒnÁeÃ`¹Ó‚r‚a/Mƒx‰áƒÑ˜UQÈíTQžh 1ã†ãÉIx‰•ŬnD’XiÙàÈ—v;Sõ”`éŲ)´¡Mx1$L@›OQ»6Ä"$‡£_v1Ybeæ“'ñ"Ø}‘J{äÂ`´d?<<˜–ŸëöV¢0ÒYð?•T8Û ÖðÄ6[ ½Ô ˆn“`ÕŽÚù§­©ËåÎ6%…)ùÍ@ýÌ& ”1Ûïå-‹WÕ–ónÍÝeá»KéŒ1¤â³Rïck;5Þœ>ß^¾¿z˜ˆ‘Üì"FÜÀ¥×fq0ààþø¡Jåã‡*c?ªùoOÊq[lÌq>WÎ{MÏ ­#žÐòW½ûårÝ™Ï<Å@²}è-FŸNèï|"y”%kôÈ–ø‰úÌsúêÿZ²ÌËWBú†Ëì 3Ž=iÃõ?.ôÞ C‘>aé鎎Ì‘£ÑøÛÑcãP2ô*‹}O¹(ÞJLŽ]ÓYÅòũӽá¦F•Ñ}uIɃ®˜:/Àÿ¹^U¸ésçÈR<Þ¶Ä'+yÀƉ4OîË`$MH»,¤l’W&òÊÈá!À;žA~¶”Üðók¯É#P‡Ü V½\0ºrm×ɬaH=÷tØf§]è=˜1‚žü±c”¬£ƒé%amÏ¥­ötò†Ï«ÙÏ„jè|Tþš-J+ þ„‘‚™År(kúc÷ôââÚ2/UÛl¸uaën.îÄÚîÂâq"¿àMhëÌg8‚î„Ú“¯e›,Ìcuú©©«Ûþ÷({ÔàÅ1GÈG®Ъ!½ð_ßá[BŽ.kd?#”ãŽ? žðg›På±?kþïSiæ™§#åÂSÛ‡ZÛ¤ÁãU|R{5µV‘ 7q|';ÎY>œ/0˜«°LFYxÉÝáM%¡JGæø AZO¯Ów)WíÀ!¢{üCÆyFÙF”Xøè ÎTý=úNbãCïôù‡€¬+igx@ÎŒÁ•SÖ†Ÿñ‚ÿN¼P΋óãŒÓß&ðn_•œPú¹ðéŒ*aËOmIZòNéF<ów ¤ƒeÒSň†oöA˜–µüßIàÆ¨¾eë'Gì†Æßfã·@7íâgD©|XÇ^°T€ûoC,XI¾¹õßwÎ|äâ»§(ùîü’¿tÊ’ŽwŒÂ(^ühþêêÑoÝ76d endstream endobj 2077 0 obj << /Length 2159 /Filter /FlateDecode >> stream xÚXÙŽÛÈ}÷WýÒ`–¹/3AOÛLàeÐîÉK ØdIbB‘ ‹tÛùúܭؤZq$ƒ¼µßºË©Så­¶+oõ—¿Ü¿xu›«\åI¬î7+ßóT%«Ô÷Uæ«ûjõwç¶n«×Mó¾èÿµ2G÷fýû¿¾º ÓÙÈÈóUš…0/ICìó“•ìÿÕm͹aÒ(7H¡2ä±ûºUU½Ù¨C9,f9Z2MTžvÅ®m¾­Ý LœA›¥ÔÙêµï´k×wP0\9ìŠ;š]‡zäú‚+aõzÕãž+ªú³†º×m©¹¦níLR±é‹r¨»–KÝFêAs5lÔtÁ¨y³ºÐl9°(j†!φ‘óÔÖqË¶ïÆƒQk7ŠbçŒåþÒêþÚnXzX©óåJoб9¶ãÒ bH×ÏT$êµ]¥Ï·ýkØLœÂ ø§°$Q1üƒù¢¶by? "ªØt= wIœ¢i¸¦¤O‰#vuS~F»N¯ÿ=Ö½6¢#|*[õ¨*‹wÏv S^b5þe„énšÑ º¿ïõw÷êÊÐ…ÿ¬Õw*÷-®­õݹ;ûQ„C¯¿ÔÝhšo?K‹>4E©%›ÊúI¬¼Ü*;K@°Û‡c×€‚Q ¼T<IÚ~ÑýCg.ðâo=6¨.qUpún †6²¹¢g¡£l@I=ôSŠ”jºV‚’±n· ÓlëÖ\˜ÞêЙó·ó‘ =Œ½ès íL=Ôs§-â+>{±w»ö}ßyýîÓ[û€=–yÝüó¶’¨8LàŠ¯ªÔMcÔA÷ª®t{ι~áðo¹pSIì˜bh4˺àtáNN>­ P[6à¡‚|e¸†Âþèô$B ¹Ü⨑ðPœ×þÄaî¼`áedšV¦©D=÷ô‘¶d‘ó¡³W¢ObPbÐÕ„dbñH,Š\F™c$ L3ç|¿Ì2¦ êöÊhXþì0»£A¼:$‰`´KØM_÷ £Ô—¢¿ ôÿ¶ÎÀœ}]<4rðEû˜þR–|‰.Ô; "9E±×ãN·§)U–Gv%Lo52Ê3‚Hy™íW;¿æéñÄŠëww×/¹êºÕÛ‡ºíöPaãú9°‚4ZFÏõâ°«éZJh$¨týþõ§ûës2Ò'ÆÁ ¹Ñ`…>;}žàý‚4d™ÓJa–7Ü@äþ´‹ °„’XfZ‚U† D:àOäþ.&7ÊÔOdÊé´Ô4A€Šy^ ,1½‹–cß t4’€Ý¨/‹8\%¯p èØÜZÚfÓ‰^®‹FrbèÌó ¦ÿ‘ÏHïKtá1ÒòÒ9es+qŠukÏAÙ÷‰,}³líbÚë¢U›¯íùÙ~‹Ù>¶Â@£ØãL}ô ä&šŠ%>%Šv+]¸‡'ØÕ¶qâÀ6ÄÊ5…MT4å0«¢§yêÜïô©øª¦ƒÎOÎcÝVÆZò˜ÿZK¡€´pÔ“7Ná`Å7›R™¦N R©,™˜ÕOÇî çîñ³Hù™¿ôÏçÀ÷¾ç’ìüWe7r™+Øn”Ênä…Ç— h ü†?g+M‡x¡<ž·`ˆ°ÄÓÕÆ´ ’Äy¬‡7Œ«Žl<)¡¾»]Ö“,ðÂÙlU l3Ê3Üfš@*8ßi”çD[iKØŸ6‹ 9‚– ,Ç~ŠÉœ`“O‚ÖRæ 8/jòò÷`ûDž÷?ìã&QñKÇt*ªŽNP°IµsçIGôö1p/jÂrꪰàE÷?AaÁPScƽ66C É"kr¾‰KS-|ib°®Ûvý¾@úTÿGWçBð#`´šéöS½eÔ?Áè,×1¶ÍQUM³©ï¢i«Ä_²'À¶Ø_pú€½Ý0ÌO­f 0t¢ôè¦,zŸØk¾YéG‡%NAEœ§›ZºfÜŸ|0@KÅÏú ÐÃaPö(ÞÕ¦å!„}ÏK_7ÜëÃïïÞ½\Œôœ ¦²Ü¶ÌÏ*³$?ÖxGéŽx}J942ùIYv}ÅW>äüÉŒe:0Óa·çâCa¤ù¼Þ‚VH½À¹b«nÿ€Á-¢ÜÍÒú—œidKäEþFØõ±nSh=Å‘”›N®Wx¢soû»íJ]JÔi#gÇÙ½UJöCªlé”.EA{½yÜÕÓ튓-%cŠ^ŽÈ²ÛClœÈóÿ· ¾*«a:ì.¾k§³»vj/Õ©\ªÓ ¸ÒgÏ&)?7ÀïàÎO{¨ø“ÌkŸ`zkñõR•Lî³Éø€xÂXiþó©8Yn}z¨y?/x‰Ùïpo~èÎ ÷sSo¾oê›®™(**“Ç¢æwE’ñ?ôõWéÐq]ÁE\XFÀÁ¶ç69: B&èǶå\ž/ñæ-·ÒíïÕãÓ²DªÂmäÐw”au¥¹ÂÔÒdÄ3öõvgŸ¢ (¯}Þ° œ^ZØ—Jõ,©íÿíý‹ÿlK endstream endobj 2086 0 obj << /Length 1193 /Filter /FlateDecode >> stream xÚµW[oÛ6~÷¯²ˆQ¢(©Ø’Õ)VdA—8O]1Ðã¨ÓÅ¥¤&ý÷;¼È9s‡LŠ<×ïð\â;[ÇwÞ-.Ö‹³Ë0vR”Ò€:ë{û> ubŒ Sg;ݘ,?­ßŸ]Ò`DÄ)òãä(šË¢Î/D‘oùoõ2HÜŽo늦>¯3ùýЈVJYøF÷Ù%ñGâ¼Alà0ÔRWO¬Ú•Üæ<´‚Dâ$ÀL‰r%q<#šY9ëØŸ~äŸì6UöW[±²> stream xÚµXKsÛ6¾ûWprèP3&Cà+3=8nœ¶ã¦‰-·‡$š„$¶%ƒTÒô×w ð!QŽÓ™ŒZ.ž÷géÎë³—ó³çWqèd~‡±3_8,|.b'aÌyæÌKç½{UÕåKU•K9Ÿ¥ÜUyÝ,¤º¨‹Y˜º«­jfç¿>¿âÉ@˜Ÿ¤ŽÑ"’לæ`ûÿüJˆÁ&§\ïò˜œö*Yî‹¶ÚÖ#ç%±Ÿ¥¡=î§j#ë¶äë™Ç9ÈÐí–þw3Lj±Uâ|^I½F¸.겪—ô"ïÍõgžÂý}æ1wBgÌ­‘nÌJ%_¨*ø@ÕÔãÔñXä§¡ }?„,xÌ:MYãHé"ß)°"ŠÜ¿dѾ˜y1OÜ·š# ”jAO¸íJñöòˆ0sj»!ªE½õ{x¸×1&<&ÚOz™ñ°—êË,.ø 'ý‰´DÕA;’&‹"µb»(” P¸ûF{Rd©<ò5RÝÉð:·[è,M–y›7²mè L„¶câ즸ysá5òá±0xäTq?ÍþGÖMÕE½(Áã:"Š”¼ˆÄõí/DP Fï¬+B‘ ‚0X’Ø p ‚`1»æêTÙn¼)ßPHBÁmHBHe£Mdõzp &$ø¾‰^¡$±­E‚pzé–q¥si#r¨Ò”æÔOqy7ÿ¡ßðšØxZš%î|U5ÄTòa_)ižÚUÞ"%Èê„îm‘ªY³[µÊ›)îi úBÄ!úr·oq3>-P´ˆ¹© àté ´ñË9*‘çmÖ‚[òY¹y»×& ÿC·åù”BƆüoÓc´uð¿”õå!}_Õ HaÔ¾tDtƒ#ÀØÞ£2 „kWô¨5ÔrŒ5ÔõJ"9wPS£žE~̨¨2ÆH÷ªnåRåØ}ýoéå Ál¢£‹0vt|¤NttäPJ‹0vt|1èèÄ0Qo‘û+ãa7“&BÓ¹HI˜Š².¤8ê¦ Çw %uaG×`n%ÆJdÐÊõ“Hv"RôÅ(úJ’'ïÇg³Ë ù={kQäÚv8¡ÁxG„Öû£V}ŠÑÙô¤-À'[4I‘$õT¨üÚ߯WÄ ²Ÿ¤ºß6òéxæ­ª†¼‘M“/¥M-«Œ£%Øhà˜Fjª©Ô!Iýc–Ån¾ÞËØl¤ÃìL}ž¦´ùFBóª-ä©Í™CÓ#€=¸¾º…êš‹©Ï¢ÎØí½z Úæ”Û‹Ü$¡©VzØSkGUŒWªZv‡öÈ@øù©£Ð>"oŽâÅ¢Äʨò‹i]òÕæ^–Ø:šGsXø±ˆìfꔯæggLŸÈ:x- µñ$sŠÍÙûSÂKH6Ÿg©óY/ÝÀÐÝ·vnÏÞ…'bø± ,5˜Ã!õK0|ß'’7ŽF’ §Ìtâ°—„®ïñ"Ò¹FÀvV[eÀ°^3ƒ) AgÐQ52‰BÝRà p÷¯èM_¬0s‚ü§¸"QÆèLOi±`…þ‡RÄ¿Óþæ üCý“_ƒ‰»L7kšK²)Tµ;iO¬"r&èáæôÐ hf ÃN)dL)Sð;®6[ý¶Ô÷`ÀF‚J’Lí80ú¥:±5éÇ™YAh‘TB(JzNzr¹ÅÜg¶^(=o챦UœòdšAD_kzð|È\íëÁ}o§¡M‘Æ<%%­mZ¹kÌèdFÒϹÚlëê_³}†FCýÎÃE[œ™Üí®JšWÈõº!.‚/d˜¢ß;Ú2€7øh¦. 5êÜKÀ­Úc‡<)°¬´Œ|¹Dã›……—6}°ï’ Hrã#“¼Øt .¦ãêä=’æ}˜¼ã£ŽÕ¸ò.Át8Ü¿ iï×Ü]ç»uŽ©Ò“8²Ølç>,ž¯À DŽì¸7k˜ŠÈ~òÀƒ™<ù¨3ªipKneöõsdò"„šM“ o&.úr5€kG.¢bèÍnœ­•ÝG ãɧÕj'~”ØŠû-ß½³øT ¨î„Íu}%ö§P ShÂÌÀóýç±ÎdsýÊ礩f;9ñî¥ã‘é¯N£˜˜Tú§'/hÚá§ßø9 6ó1ãGú{sw}=¹¡¬6Íh%{ÁƒñÊØ~çÈ×r´ôêâúöÕùt±w e°¾@ӟѧ ÌgçĶÓß—4 ï”ç§ ÎL2]6:©€ÝO‹³¨x(e~s÷ŠïDhôew*/üÁd[  endstream endobj 2110 0 obj << /Length 1800 /Filter /FlateDecode >> stream xÚ½XKsÛ6¾ûW°—5"|€¯œê8v'™Öul¥=$9Ð$$±áCI§é¯ï. (™qä̤£ \‹oß»r­µåZ¿ž¼\ž<¿b+eiäGÖrey®ËY±ç±(H­ea½·ãhñqùæùEäOvaÈ’0>jÏEÙgÕÐõBv¸ûÄÕw<¿àîä˜cÎ9~ Ä€NŸÊõP‹føv¿üðØñ)ÞÄr¼„q/&FâŸ^4…(˜+!E“‹0{ÒÆK8ø, }âðR–ÅZ\›ã7¢_8AØíí Cûï…ãÙbáÙ¹¢s{-!³^´m%ÛZ_ –Xo¦åõ üˆ%7J¼’b›IqaV ¿(` ˜ å"8Ü B~9Bd}á)¦SJœ1€4û" õÀ¤S!œQ‡@XÖuÙSàÀö…ŸØK“ÕBkµ•¤Î­RQÊOôb °Ë¶y2Т¬»ã^5^Šo¡Aµ+úV¢éDGøj‚ÑåY%ŽGýJ@XÖec.×x‰‹ZöA˜GWq²>ÛS?··²]â{”-E1Ì| »QjV˜BÞÒïV›°ÖDù¼ Áþà¼)ÊfM/²&GíoZÙ±…Ã9·ÿÀ¨ÞSì×Þ)Å‹C!ƒ Ô„EQ²/âßs“N­Œp:Ϧz}±p¢ †\€¤I "’.™ WgºÜO)ߨU¸Õ{x0¾†kД+=©m†Y:á6è %ý…kåT€ÎüŸ†‘±ZÞÖ`Hq¡ëÚC§4ÉÓ”` t«ñfx™#Ú«p‰^Õ Èòê L “7Ç»Cãé×—§N'î3ƒCJu¼yaòv¨ºr4Á.Áƒ%¸ë?´„ÏR#.~»yM ²ÄÞ;£ ŸÇ+L¶ÄÆ Z{Z!°õ;9BikgN9dŸÆ&>ø²düI;ÙÚ&ø~gµC "‰0Sœ"®%~b윓BR™"„ÊÏÞ-Þø•ÈxJšÆörSvD”ân(¥ÐOýFÕŸÐ%I42L”ß—ª¸@wm²n‘ÎÕ¨ ù¨Ëí Ê5>©ÌÆ#‘2ú/¬µ^ž!à4‡d½Ô¢ ”â#²~P" ýƒºh·õ³9@Z†ì“N2¦J@'Ñš‚w[6pñ()‹¨$W*cQ;PHð±~C:ö´æ(ü»r¯|†,ò0ª"ƹŽ*âÇž’Ç©»òþÇl~–M´’ØZüÖ”¿võCszžg/FmSæFÔ¼•RTÙNØ ´ð¥+»šÚ ˆ,Je€è]g|AuZ±ý Ôg¦ò‘‹¯Ûë(×™(ñ^ÈÛ¶{B×r%Ë©«×0¯…î­Fg†¼½†¨èhDÙŸ5RNø,ðô¨ñç"ì¬æÛêÃqÁwtèêìµ€ ÇîÎ÷}@ ¯œJÎSÆ£tìg›ÜGµs5™ ݻީZm,1z²ðý@'B¼*G‡ÆÅèÐø0¨¨ hHe©–HÇO!&(76X–2k:˜=^¡Sw™¥ßœ»£pï0dád”AÁ™ŒãÁn™Îv0h?A8ÂùƒÁK}æ¦ÜÌ'].Ë탴r\T¾.tI,WØÏı…ÀS¤Æ3üÍEUu´áVO™HΈÔm ÊDj¬»ž^4¢\ovCVk܃5þæò’Š4êV½/†*“e?^U«ËA»ܘû‚ £w¦;ÐØ©Å昪Ö-ðÛÔØ¦C‡~QJDÆ¡?„Ê’Ãm½ Ÿœ7¾}€»Ó UƒÇaPíå÷D§®è Q ,·67,©CEAá@,OZègõ;VCc*>×{ÐÉŒ dcB,éqh_`»¢%NµIñ©*"ÿ!T+Í|#æt<ê´ƒÖ.ð\»x­Ë©ýΪ¾V-„kê ,î!¶€ôp®ZŽOô€ž -P®@”íE^³8kÂ’Z3Ï>ä{Û-~ ü¢¶Å³¯6Ðä‹{E”78 ´P{ áåLEñxÈïÒ”B·Üdê4aMEÁBÕ°(ˆö•rY®rO1!TY#Ð\0Ä©föåm+õ#ŠºÌe«kÑ/kP$’‡[ݰÂúà ÕÓ&²”â3h\U™'MÌÛÔ~£þö!Ó«yïÁ³M»æ‚GŸÓî8°¯óíö§Ù̉î?TXº endstream endobj 2119 0 obj << /Length 668 /Filter /FlateDecode >> stream xÚÝVÏoÓ0¾÷¯ˆ´©DÜ8?œ´Ã€ ¬=¯~Mƒ»Jœ‰ñ×cÇ)ª‡·fÒàÀ)û}ï}ïÙïsB¯ôBïýìÍj¶X’È+PA"â­¶C'ÄË0F$.¼ó¾øËг·ußIh»ù·Õ‡Å2ÎŽ8IˆQ–Ç*â€Î2™…cŽÅ2 ÀÁD™ZŒ gÝÑ,ÚCO.9Ö›{ÎQœçJý¦¡¸ùùr¤aè#„ÔÖyT¬ ŠQ íìÌ ÞÁ–öµ4/×±y6 w‚½:ÐTgŠ4u§0ÅP—…;Èp„hëkÚVòmp“ñÜ<°M †PñJV´F 47*í®Ú[¤Oë«+g". ®ú Ý4| ¨{Y [TˆrwC—,(ƒ} *éÞèÖ;™´.…ª×L(ž£NÒVÚÈÐ]/ªÔ¶LA¶”3Ñ ÀÖïF—­è÷ª‘¼¬A nwsõy}édIhöh[Õ€j¡Zr¿«î° ÓNpÆ&ÝB{#:˜&L Ű8Ží‰i±ÄüÞŠ±å›šv£[âxbq‚Ò Üâ…XC "ÿ ¸†¾¥Ò(*P®Æþ‘8N ¤Vž6²ääÈ–-Ýï¦ìLjߘtO`L7…ô™y.SxPÊ$Hÿ† ÿÌÒç²bÛÀý«\_¾Qвt¼|/Ú²o€ÏãÈ—Ý£·ù‰[ÜÌÞ½Ïë›##Ê#¢Ãð_¨.Æq¬xªJâ;ȶ/Œì§ˆD…Õ€‰ ÇJ£\W:äÞk» °sì3½”øRŒ²äNŸ@ýsˆy x¬›.1wºÂdµÇŒ†¬Eß5ÛžoÌÔoÚ ±Q~nVÔqF[öÚ¼FÖŸ´VsÅÕ¾ÕAäÜôËÕì‡t™Í endstream endobj 2125 0 obj << /Length 1672 /Filter /FlateDecode >> stream xÚ¥X[sÓF~ϯÐôy&ZÝÃC ÓN »}&ÙXk{Aw%á¯﹬; ŒÕ>i/gÏžóëÊwVŽï¼>y9?yz¦NîåI8ó¥#|ß £ÄI…ð’0wæ…óÁM³É§ùoO/“`2Š N€Ñ\êºxÕÔ­2_'Aæªâ4_&AꪉpM‹ N|{íð}zE{§AËiy1|‰±®u§eéUªºU¦]ëͯ{ò§‰—g3—Ç‚9¼CdÛªb2 ‚Àíü†n·V¼pcïI¯'SáV(s…Âߨ@×Þð©4’:ex¥YZ6¥Ò…ªñ¶[ÙªgÏh”5qýè‡Q]\Ãùnkêïž"‡`ì4I½ °šÔM¡¼VWíøÇj_7¤e¡®‰õ /ƒœ(µD(ÔtEÝ&«.ÌkVï© ›#4Xz£Ú¦ìñüñÿ5ÉBW–=èæ9‰Œ_R8òý}ž´ÁOa_$nßÚ“’é¿NâÄòéD§ÈÜqe_gê~ìó–*is +‚ÏÏg"½ä…oHÐô¨ˆ=…XÊã˜Åß’ÁÈ:8Fd²0ðo;©kKþ”Ò¬Ð6H†´•,Ñ•áËqXõù%Ëg,¿%MEÞÞc Ûñ® ®›âx#_¼{ñê M5¿8ï²\5Fwëêø+ÏvG¦a"Üeƒ0$¾[5„JјºC˜¾1E³ét¥¿Kë*@Š Þ|aiŒ^érí_5=xKì²™`a'æóÇL‘+?±‡{ÖåžÀ0ÝÂ)É–}ÙéR±–LaEžª8 uÏaYÄnxpÍìêÍ=öD¹Ñc"¾`¹âÔÆ®7œCûIÌk;H ÇÛííÏ|×Ⱥh*vtâÛŽ÷¥ÚÓ˜àŽèüGWdr`]wÕ‚¥$DÞäB-Ï7zÜɲüãe^«Ôˆø›!õ’”Qð}‘~˜;VªFµs¤¼‘—.µ2M¿2V¯JÕ!,#ëùk<á¸Ì‹1†‚R³û7LT+ )¿ãɈ˾›x“iúî¯K>s9B¸gW³‹S¦„š©W5obRÝ»°ÛÝw<469ÿ²£þÅ‚F’‰WžÛö«SÕÆ[B¬{e³GÖBFÌ:ø¹6j¶‚¼E¾»]+ƒÅ,Ì ©[™JZ@ÚML&%ô|H#8²nn—!tª0Ó$rgÖ¹ziï⪠ÌÎ^Î~Ÿ>ÖÕŸó ²[wU¬ÃSccvt\À9¾—õ´QÐpp€ÙΆ­®7}ÇC®@TÙÎi¨)UŒ)®C°|–f|VúªÌmÓŽPèÑw]ÈГ-Qê±®ŒÜ¬GÂù© q9ì`v¨Z÷²Î‚£"æ^•-½åô¿å­ÉwÒµüŠü}òˆer/È­ ç ZµòGÏžÃ'Wâç^œñÉ9¶D´¦¯y°+¿ñ^Ù>åch%i“;ƒ ßñ :·iíD×Pc(—Á„¡‡ôòùp°æ• ù2ttöÎ\ ã/Ôž¬ÔÀ9ö•·Â<* KÖÒÒò í~˜ß]m+é×a qj«Ÿ²øFJëªâ®Í |‘íºûö@@ÉÃs ·íûxc¼W]o(×ÇôÀÏLõPøxÜ@.H>Cvå›ZqháÍ\~B–µ|Öòàé+¶´²…s·ç,ZÈŽj4²åÖFµÚòà®ñ\×˹4€GA‡õî#ìY”ÒSÚÈ–'[ôôJô©ØKô0i¡~ 8H‰ *~ÔÇxH[ò¬¯ ”‡OZBízˆ£'à5}ÛtŠ)ºµ<Ù¾ÿœdoàr„# žYš¡5¶4Y/²‹ß 1[ÚËAߺx…C|7ÙСŸ8’¿ýb@¢]ÌOþ> ªïˆÝ?‰ É„³¨N>|ò6A/Ì3gK¤•fi¸tf'<ðFÿÇÌA¦Â÷’.KSœÿÁOþá¢Ìýn*‰˜@S‰ý6-ûheÓ„L£Ô•f ×úñÇö6LsK$Ý–ÖØ…³ÁùS(tªß´?. *ò1À1@þ#®Dˆÿ¥²! · £7z¦ã¢À _ ³L;Ô-9ä%£†g´ýýdÅoÒ£’ÞõjðG[÷lOøx¡°þ›Ï‡ endstream endobj 2132 0 obj << /Length 1635 /Filter /FlateDecode >> stream xÚXY“Û6 ~ß_áq*ϬÝǶyHÓÝN:ɶ“8}I2®DÛjtUÇvÓ__€ u8ÊÆî‹IÁ¸|!Y«ýÊZýzñóöâéMà¬bN°ÚîV¶e1× V¡m³ÀWÛtõÞ¸ÉÊôEU¶¢¹ß8‘!Ò×¼ù¼qBC4íæãö·§7n8ÑáY6 #,Hé0Fž KÙ|zãYfSs›ND—dÞµ|/fbßZA7õ?Z™vÄÜ(úÊur\þ`ùê–b`Žû>ñWw‰¤»”[ó¿²T”³ùÏÙ˜¾eÏh¹}÷êÕ"ó¾©ú:+÷ìž7‹ ¼mù—™®õ›Ûçë9o@¼m^usÖ”w|½¨·ÈJ–ˆ@–âÍf‘ÆqñŒ†—4l¤ôœgmG X}¸Ö}Ç»ŒÞ*uã{‘Šñ„0 ²Z**¤$ãæoQ'ä-i— ŽhžÔ$ƒêÅлƒl°|¸çàIM˸•–冖±`…úcª‘4(ÕOureõ&k”éok m±Q-Ž-ržA%~¨êÝ)ªO Q½ËíXáV8%5xAôp0LÔTFõl²U‚¨n§@RåB¥–†\I­Ä tQ:›AcšÁLêŠÆ\:‹€¢Äw4g=×6n¨iÔ¨|à¯U‰¸Z¹_¦X$¸Ž¹”Œ3Äàªt÷€Qc0ï‹’ö˜=ÁöÊ—Û7¯>ÕŸT†ÉÉ…#àxêø´‘ü îÔ½ƒ$í»O3’°ÉH§}º§$í0ç§¶„ƒ$Mƒ]'ˆ Ü$GüB!@ÙµÖ ŠZÅß(ý²W#¥]߀{ôUKuë^Ô¹hOE@Yà %dn¬t=y¢Þ—õ‹lÓ—WCT-ˆjᙚ”ô7‘#saÌìØ>Ým{A‡Ü}O…§.—¼`^pFìœÿëÄ BwEŒXö¯˜…ª„îðuÇôOdQç<™‹ã´¦3®Ås(}ë›Õhã’ð¨?L¿°X³ÿæ_¤ìË9ªå[éìÛánýÕ¨¦×ëíż# endstream endobj 2144 0 obj << /Length 1375 /Filter /FlateDecode >> stream xÚ•WKoÛ8¾ûWéEj†/½ØCwÛ-ŠÛ8ØCÛ+ÑŽZYJ)©iö×ï IÙ’- X| ?Í|3œÑ`Ðàíâ¯õâòJ$AF²˜ÇÁz0J‰q0Fb‘ë"ø¦tùuýþò*æ#IA’H8V檬‹wõ’§a§·FueS¿ªsœß6¦Åó êßzy%eP,hÅÓÌ"­,rîð^¼X®"JÃ7uñ…FôcÓ¹¹ék˜3 øf½ø¹`€I¶×<Œd4 òÝâóW°ù>€­, î­è.`\"Œ«àzñÏ^±ã§¥tÑÃ(‰% b–&cÓÇfϘGN²”+|Fì³\‰( K[F,Üü· ¸‘„j¹bá~–€(£„SŸA€3”ÎÄA3Â¥×ðµnsSÞY}ÆÖ¬œÆR ¦D¤éÄ@!Ð!dØêÎÍ›[P£ˆ±ß–!ˆÁÿý’'¡ÖK`ÀK;™ªl;·0N-ø‘40Û`~z{âÉ„’„ïÃ÷Z÷à½#ŸM¬‚pš ò hÅáwƒ>º¥%Ë•”2\ßêVŸ1'W^õJuÚLLt“¾Õ…“èT.$*ÖQäÞ^Ž.š?ÙÝú—ZÍ"Ô¬kвÞzTz:E"&<ÞS4„¸~­:õSqJh’ Ç6}cÄ—C&Q¶âœifÅ#’&>NnZµÕ³vpS…‡€{ôbb:±ÜâAቷ"oÄ…¦›?Ýãã͇/í!:õ„j[õð4Q£7Úè:×OD¶Ú’V]ot;9Ä)¥³‡Ú\USüõ§›7³¢ucvª*ÿ³Ôîn›br2G¢.>4Û^R_¼t;ׯ/0 OãA‡ŽäUyGŒª·ú©Ü}îò܉y®ö/6w£É÷ñÄTm9£“ǯ8A{ŸÆLQî¦t³?Ä<Ý?ˆóÒD:šeåÙ”•½ôS?žÁmóÆL¹;£ÂNý>#ó~Ÿuö…ªëæábþéŒ>BæÁõÝTŒÎrñK›oM{§.㯥‡*þqúÀ o3‡¿ð¯Ì¶ßéz)xصfs™#=Ídº$†2¾O¯ ÇfñP`ôœz$‘2}V9JE|RŽ ¹¼Ÿ%ÇņºvŠÝß–®29A¨5vù Ò–hµ K[¨ÆÖ8··ÁˆÇAÑX캵ÐàÛÕÎy1‰Oåù²5T„sYynWÐia;7ʶÏr‹Ã_Öö¼³Z³ØuðD4ÜzpÓZí0ÈqØÞuÐläåæÁÕN6%íô´åž½-þVܲ £¼‚ æ7€šÏôC›à{ˆw¾rùr\ß¡‡è TK¤*ö :@Á ÇAåšÛƒŒÔ„ÓÎu°®ÕÞlÀ&ñã$ÊöГ<ÃUñqµ{ž»ä‘»¤s®€nHÏ“3½ØåÒÅ*“Þ/rÔfÁÄ·Y :Q/¦ÜcT£qZôfÿºÒ6ž6~WsŽtA éÌ{0Öƒn„µ¬ÐÕW+S¶ÕWUå¶ï–æ¾´17 ¥ŒvƒMÓ»¯\7îÀA ¡µi`Éœ²VÃL@`³Õ!ز!Ø` ªÔwšºpdd'M&¬”µOГ´šqÂytÈR“¬z QJ¶—½/-3Ù¸AÎ0Ñ 4¯pïU­ï“#J2y¦ãÂ{•¦Qø¯½“2¥COŒCåöc˜dÊFIó" î0±ó`ÉÔG}„> stream xÚÍËnÛ8ðž¯ðQ֌ޖ³§4Mº]´i‘ØC»V¢m¶²ä%¥¤Ù¯ß)KŽ“µS(˜q†ó~0þh9òGoN^ÍON¯Òp4c³4LGóÅ(ð}Åéh,f£y1úä]ɪx[ÃÌkÄRñFÖÕy•ãzU+=þ{þçéU4ía‰ý€M³î0ðY€gN|{ëhù)Ëü`4 §Ñ)Ù»AãI4‹¼f¥êv¹ÂEèm¸T÷R ú$‡±ñ$ Cï’]tæŸV¨{\’f%*ÚYóÍf xÝe5’ $N€ùY’YŸ£è1}Qì)±J€,O°“§WqÜ“Èdš²Yê˜%S+W^å @¶¼i•Ð;ð‰và!Pø¯ˆ²/ÀFæY2…ŠÕÙ.1QYÆÒ4\¨‹ësøÏÝofNŸçxŸïy´k¡dNwã$ñxÙ‚(&q˜zóJ¿Ü˲¤YÎaFÁËF ï£éÍ#±Q¢ qߊRäÍÛªÓúÕ¢ ÀÈ¢°3Fв!D\Fã“0 ÁÚ³'¿Q5rz7žžMNûVøkU ¢^ÐØiÖÇ›©«Õ„ÍØ—9ºÖ]‹ÖŸý(® Y-ŸSé„„æ9ó:Z§³˜DÒò/Ç5rÎÒ'¸kdcÇ .ˆœq{LV›¶B¡"B‚¬P¢.ŽÐ÷-³f‰¢Ç+r¡õ³î5KX„C›Ö`kâ§²øk%Ðs@èaàá‡`ãuCFy0"Rôv»»²“ž¦ÊXÌÔ»“`*è ±ï}¨Êú¨ÅÊ«qÞù»ÛK: ´ÿ€’©Û}AiÅÉ"­ù()¦Ò:;­[S$¯öÓŽø‚`šÁ˜Åa‘ ‡GŒ£ÂºÇ§@hqÔ4Ò]—LÄ6ê{ñýÎl“÷É*öpiΧp¨ÉVJÝc£(%U­Ö¼”ÿR’XƒŠëâà@Žk¾CÇ`¥-ƒÚk±õì3T~⽫—×| pPÃJÑôöb~chÝ‘³î†å¥Ü0Å«åf~í"vŒz]ÐXŠj‰ÖÅÂÏ=ÚoMzCnžËŃñLs -'kTblÌ¢°;ü;Mº| w`>ÃåJƒðöèüH-˜ª‘#åŽGy·„YSþ>Lˆ¡»©hs£Ãƒå÷Z®E¥ÄÑ·Åᨠ¬a3øÂÚ2B¥è»庈OÅ”‰±KíñåºêÌð§æ÷<çgu%sÇj^+%ÊžÑsƒ–ú§¦&E¢ìˆºKìƒ#íãÅùÁDd/ âëÖ² ƒG^ÿ"”Z>Çþ»Û·GçÇ2dÇ7}r[gÑÞ…4öÂ!æŠvÝHI& $31õ²ñjXˆ~U WØÌÃIÇ0-äAœßõcFú¼'ÿ Üú˜*Aº”UšÖèý8¶Ø¦àd¡êµý´²[F ýÃý»s¶ÚŸN>˜W OKÆžø©7<GËá£~äpYüQSª ü‡eÁÔTѺµ+fÿüÒ؈«#!~’œ¿Ù(÷£ä x[È­é×à ã?’3ÌÓ—ò¦!.‹_„5¤åÇØ²õ TÇtÆ–·¹‰5òõ]®mO5k™­é²A³–Ù4`ÄbÖ±˜Eë!sÞ]üH„“½<ÅïÚ<@Øv²çÔ$JãÆ½Þ0Þö¤[gxlQÇPuD]lÅü~·Ø]8B*`Bèf`NS#‹)5UýòÇV;6 EPb5/ÛBØdÅmõ›óÿÊîÃñ ²F‰c¬è=úÓ$‚¶axKiš+|0ÒôqÜ+бå{ÐTÁak-ð¡Õd#0Ýr`Îð}YKå½ÐÉoÍìÉÆL¹à(›#„r©”»ÒÐV…+LwÌó RwëÞr Á¢Y­·AfaÚOlÖ„òæüúúôÜ Î„ cÕ'Ô—Z ?ªAm·A’T½¤~­kŽ©CFip&y'¶Á§ó2ûƒB,&ÃŒ®|-.Ë¡*žz̺~Æ‚lÖ‹w±ñÎôa0Ó ªÕLM{çcp’vgcå‹î˜Cɤ,8w ¼”¶T¸²‘²¤Œo¬Iì]1j* h¯¯‚Â0ãBçJn¨c°$í©ÞÈp [t]4꬗xú V n‚q‚¡Òž¿mZ®{âÐ.”]˜W8j*d8yA'ì„~0³ý›šÇG|ƒ´Ó›7'£O“8CäYà³ÀÒÓ¯,p† ´ï'Ìvµ?y¿?‡sÇ—rÀ~§~O‡Øü¡ _I¥‘ËB"X(èºñ!- {9–õéà>#áhž°p"¾oJ™Ë¢p½Ícè—æñv)^üBN}–dé¾ÐÆ,‰ºZF²ô,A0ÊmÞ —MÌ“VIóÞ¿L»Jé^V¼—`ÜNçËô„/\–±.ìþwÓ‚7`y>Ûë¡—ó“ÿß]_¸ endstream endobj 2061 0 obj << /Type /ObjStm /N 100 /First 971 /Length 1887 /Filter /FlateDecode >> stream xÚÍZMo7½ûWð˜\¸‡…ÀIê6@¤¶ ´5rPìëÖ•Y’ß7”dË‘¯¤ÒC`jù–μ7rããŒ÷Ù1Þ‰˜âôo4ÄQÉP&md ’6ŠñÉkƒ “>‰lC.:#œðDŒd`Ø›ˆ¡ñ š˜‚6’I^gˆÙ¤¨3Äb2éxÑ›¬³¸D¦Ô®Ä:¨¾–œ!rC'Xæë³½¾™²¡ë«0C¨ö Zj«ËhÅ:B¹¾ 㨈®+ëÏR­ÇO/„92VåK}ƒrЕàë/—1f`5J=².¦àUñõtHuO8N{1E®ž*è-Q0E8Ë&]6û€AÉ9´B®å Ããç¨ ð'ZŒVRSJ2,¾¾P ÇA˜Í©`ä0E ¬½Ñ„j¹d‚çêV Üê‰È„@¢-–ºà ûЄ´UÔN`&Ä£.ž”8i/Z5Ž“ EÔxOFœSâ%.T\BK]CXxôÖX‹¯sÀ™Â!`NX]M`’ DІò‹|1"¾NÆh)ň1Y¬½X¨$ !^ ¤®‘•šIMÁHRt%Ø-%ª)ìLtN €ã¢Úˆg$шœk/™(\Ã'ä‚J x“2YÀúT=€ˆ€ºŠdQS°ø˜•\^Å¢ä"88¹i/dAÓÞb+E ifüL±BM¹úN9ûƒÃÃæµ9‡.=}bšßÿøö9Ë:wŠÞÝܼ?xñ¢O0“ð Z|²pV7p ²¹³!PŽ…4:‚C±å+£GÉ9<4Í1üšÁÌúÖ1ôY§? ‡ éÎzX˜æ8#?ïBBáÃ7ïÆ£‹ÓvbÎMóîõ±iÎÚÏs?óÙ—O-:WíAó V´ÃÉ­&DMÍ'ÍI{;º_´·Ó$YŸ½m/¯/GŸÍ¹ÃƒÚ¥âßc¢ÁoÈ®ùÁ¥T?$¬ å,{mü@Œl5ï¼ÕdÑÍÁFè´Zг™sG´ÎRëÈñˆ˜Ò[Ó!ùe:$·=;Ñac] uæv\lZ±X鏨<óÊÑp8ÂhçÓbAíùjÚ 8hNï>Lêï_®‡ÿ4/GãËv\w›7Í«sª?Ôž ¬$ é1â”±PrX­3b$‹= ¸£ê±SÓü4:8üÙÉÇ¡}yw}sùêæîvÒŽÏÆmû\ô(&q‰.‚çäÅv`QXìHÞ…öÃÝ—ÙÃöáÌSîÖBnÖà>L‘‘1¼P¶Ö¢"6`çNl’¸>ÀãëË«ö¤ýØÂö‹~Z ñn6鞥Õg B´Z¸r©ŽÖšôA¸&íÿ~h//¯‡W·ýÙÄ„ÇFJI@ùX¼MZŽ—ùµF½·Ÿޯܵ$‡,Èa|¿O±¨P:¢…`=¨¾tΆ’;¢9Á¯!vD{ÊV+ðÍÓöbͲvûÚZõ`ç’êKÚ^õ³EÔsÔ¬!}ªžS°5{à •C툂&–å‰|…áÀja»\w½­žç˜Š¥Ìß%qFRôµNÒ£nðÑ&==Á[×kþíàÓ¯wíøË’Ê¡Šî*_ßk Nq8ØuDC·8îÍÂ6zîˆÖŒ)íi³îGÄDnIÄšk¶ñ´j©÷³Æý“Ô«šg{S„—¡ìû½)b¯rßóÓ{ÓŽvEoõ‘µõ‚)€ë.öÙæ”ךu6 oaÌëÁdП1r½}š#9ªµ§¬ÙoÎcd肊YÖê"[Ñœ‘wx㣷cÌ#ð“eÄJtM«®DV¢½deý~ÐØ%اý Ò¶ôYt<Êdý$¯å D/õ6J^‹Ž  ¶ªGà§™´ ­eµOy‹ b}a×ÃÍyYv«çíÝêÃn]?HŽJG´/Ø\×± gÀœi?è€ïzáÒû¦ÏËwMÄóR€™6ð"øiݬB 2YYU®Dûœl^IžUh‚%™ÊÿN“aù¶X¿0l²…:M?{L«²àæ ê³<óY¯‡I?îèiB4E¼qØû×_gœ¶w(;z¼U©›5Õ/Úa0G5+ó¦ç¾ê·ó,(Rë0ëõÃ_LVïŸP–¹”6ðJåoØàÆÿøážÝ¯É”»£›•Ø­Å_êŠöAP1ú}}àÙZ¤²B¤²ƒHCžks®V™«UzU+‡ŒJ$™úDѽ¡^øEðÕ‡ø bÞàý¹X®GÃãv0¹·ëO «lq† =:ر~ĆMtBБ‘):›EE2[^]]stxXghŽ.Ô€æ´ùíäþ{ö×dòéö‡¦¹]ÛÑøªÁ8ä(6Û‹öæÆz‡œäÄ:¦ç[‹rÓ²òôÕ¯üÎÛ\òÌv¿›­0¶ ÑQHÏû»ÛAäú,l‚gC½r† l(´[”«Xe“Œ$¼zû…)èÿ†|0Š endstream endobj 2163 0 obj << /Length 1991 /Filter /FlateDecode >> stream xÚµ]“Û4ð½¿"SêÌ\t²åÏZè1e˜Âôxhû ÄJìžcɾr0üwvµ²c'î˜aòàÕjµÚï]…/v ¾øîÉ‹Û'—×"Yd,‹ƒxq»]øœ3Æ‹Ä÷Y,²Åm¾xë¥Áòýí÷—×q0¢¡H(8Ë8mþÖI7éTÊЦõ92@ EíÂ÷[ºŽÒK`’Ë=P¹Ù¹&\Óµ¶lǸVP¼ÌnæD`¶‘Õl?iÝ¢e½Sž8 q€¾ò™K=>·öSûüˆí/Ë,ödÕ©O¼_¦#/õS–ÂÜm¿QÐGj7ÉÚ±€K9øÆ¾q ×ÅéPwá¡r£ÚÇê^˜2?Þb èÅÞtÈÆZ47¢(YO,D‹ŽEuã]YCrŠÞÿLz?ó õUMÏAõ-ÔÇ4ˆCèJilÞ?à 4c½é[¥ùWr pc©Æi:¼Û ú¾€`´sa ¼ç§¬°ìñÄû ‡VŽR”÷´òþ%&vÖ‡Íh7•Z}C#?í¡Qz–ñ ¸Ÿ}é'É•Ÿ¦éj.sýŒ¤0K¬+Ð#,ÞZ¯åMyåsæs?¾üÀ°¤0dÍà~1.üÓî;±ö4^þ.÷‡êfžy؇‹XÅá`ö\G¬¾ø¢“sïuÓ »újÐêMäþvpt˜Ûø-¡Øzo‘X²¸QXÛF—]Ã`u'wnÓ(m{0W——;hoÝšAá¿4ࣲ’ëKcY¬r¡§bTåZKý€uøx™}¤Ìç´ÇŸ Ì§OÇdoËËX5Kä´3ôujì•ÞaBU$¸YPClû1×i¯4þEЪãZIÇÝuoóˆ¹Í¡*Û#o]?LXÍqêïdUiÜ©¯VNäþ£e‡f²¸]Ìzö_Óçi«6Ź“©û¿,›†ÔÎv¦Ý@}0ƒ™01ñ S\1QoF“-6i$AaË>éë_UªÞµE¯Ç 1JKX$ûÓòÅlH±ÒÛ·åû÷SS½vÿ‰(oüü€³Ü½ÒëÆ¨‰á®ŸÿpóòSQú¹«ñϼ_¤.åºR×î=„ ªÄŸã×ûTUÊþ½Åöª-š|êÛ{Ó>½˜“¯acú€sþ9iðœq0ÅjÆ=\Û²vbKÛ‰gs§ß:³bßÿèïЂþÞàp£ôøzš¬C=R;ʾ³Óq¶8¿¼}ò7«¯å endstream endobj 2170 0 obj << /Length 774 /Filter /FlateDecode >> stream xÚíUMSÛ0½ûWhàÐd Éòg§=Ð0íPfZ 8[NÜ:Vj)@þ}W–Vb ½÷$[zoµûöCÍAçΗ©s< =”à$ôB4-%3?D¥8d šæèf4)ëü{Úü{ñˆ7r|7ývÚn¨vlBvjCG&îñL™RÆ[ÕÏ úíâ?åEºªºÊ¿bf]p5ùÇ 2˜Áàm-$i;Ö‚m¼è[èR#+a·éA]|p4t[Æ«JbjÁ/¯/.Þ{û žª$z?t%fE†ÕsQå‰`:ÈQ\*¼’ÜŽõ±¬2ñt0¨Ì¢¬ñ2S[Öɰy ÎË¢Øa¸_ëbñÀ›{±åÏôçõÙ XÔÕ/…­Ïääâj¾HŸ°ÑÉÜN‹ùšOMZçb%綨tP  F~­ðCÚì™7-’q«Ë·EcïpfX-÷`@i@a@íé¨#Ëbýž´]ÐÐÃí¶;Ðfï4·ÝÏæ»`ú£UfR…‰õˆø8ˆž‘Ý0ë ¿ÿÊœH™®ìx€"Ñ[f\êûØ’ÿfŸi±ó.À‹ü”ef‡ endstream endobj 2182 0 obj << /Length 558 /Filter /FlateDecode >> stream xÚÕVËŽÚ0Ýó³(HÍÅÎ ²èbÚU+¦‹!³j«Ê$¤Mbd;3ð÷5˜Œx:Fj³‰#sÎá>ν r–r>õÞ'½ÑÔ;1Ä‘9Iî`„À"gŒ1D~ì$™óm0 †?’/£iä!ý0)™=dZÔÙ-ῇÞd@¹Øá{èð/£i]ß›ŽÇŽëÕ¥¯òDÉäÐ ¼ÓG?#’ôßîÄ”«BŠÃPÃׂ6KYSKhíа‘Q3^AEåŠeô×ûÙÌH¨(©!ßÔvhM*ú8Òà9 Ù3jÀþÚ÷uêüö…¸åx>ÄX__]iÁ¹¯Ïã„sÆõKZ!-›Ǹíé é4/€xò˜H®… [ƒ”Ã$ü«’‹Ãäw+ÓúHyHeˆö²g‹_4•Æ¢¥´,`»®i°gÙbJdé°CK*έÙ,Ê”múFW\îéK&æÂûîíÜ(§)ãê!6UÑÁ'w÷7¯r`>ÕÍšô_ Lh70Ñ«˜’-•äJV¬ì.iØè‘ †¬õuQÃ:•'ê? ΊÚó&éýÖØSK endstream endobj 2186 0 obj << /Length 2044 /Filter /FlateDecode >> stream xÚÅXYãÆ~ß_!ÈCÃ^vó”y{vŒ5ÖI°3Ž dƒ E¶¤ÎR¤Ìcvæß§Ž¦$*ôXë È‹ÕUÝÕU_d0ÛÌ‚Ù÷¯¾}xõú.Q³¥X&*™=¬g2D%³TJ‘„ËÙC1û»wg«âGÝ|Z¨Ì3M»øÇïïÂôD- ¤H³6%…,F™W;æõ]ûa’´Sf¬óÕW ?ï>äçÎtÛº`z]7Lä¥nÝùÉòÔl‰8•ÃùW,2:5Ëì poúFw©¥È²ì¥}|-p|ðÐ2ŽÇï| âÕH%‹Õ«™¼»¦å`¼d SuBò5ÿÄ?ÿôþýX89V¿#ìv.u‡Ò"w‘¦©û½X=_&Ýö«Öt‚LºLB¨Ÿ/»hcŠ>ïl]]¶³‚Øþ„ï!.Ò…3…3›ù*‘ŒXî¦Ùô;S-BåuíÆçÏ3`àF2a–û,FY“&€I5€í.†!èÁ-oByŒC§ x™ZŽpáî¦ÕpS:{éåKÏ,¤W +òºÚ™ÕmMÃ$¥æÂ½ÂééêLºÝÓºÉa#û1£œ×oßNlqé-C‡¸²þ·Þ£4”ɶeÊÛ÷eÉœBwš©uSïÞ,ü(H¼ªîŒSØêŽU,\c=Q d¼@¹£:Óv¢oÍT EÊmù€ye6+[Õ»ù50–¡7g·Õ¶mëjÎ÷U  LʳRâb1¿}{o~U,{f]¢ÀgG n;³L…BEñ ôÙ’o`ãÐ…ÓtLp|#ož×½CÎüÅøÉ$A¼07eÙ yy ÿ¶ÈBÀR7\º^ó7bªÒ;ÓŽ /ëjc«Í©Ù!—6¾üâäb³Õÿ×lõÅf¯îúÆ´—Ûý½©« ÚQìÝšµîK‡{&‡è';õpÅ mv‘ÑJ$AêšV½Yç¢Û‚ÝÛº,.°Õ—±bõ÷vgÑB¨£h9;_j~nÜ ü¼ÅäÎ*õ¶ÌÙŸ1'éaóA¶F‘GžôƸUíŽ)nù‹¿F“‰.°ø…¦1Un¦:N pW¿Íui¨EQ‡s`èÈ:ÒP ÄšdXä¸Vó ĵxDÍKÙ…¿Œ’cÜpÁ:Á€G齫ò«¾¦ú.ŸMMgñ#¥ÕÞ`?@¢5R![‹Œu_Q¿F EÞªÇS:^ËuÅÄζNÿ3úÚh7qºCì¦Òt›T*ïÝzÊ:êSaQ"þ˜ûSq¸Õˆ’G[°›L7Ì=âš9ßÚÚVXõÁÀ¼uLÈpøýß%–‹mŽ %*PS ô áI?wRü¹sÅ*TÛ`•=…”K/‚¾u„? î_¾ã Mú¹µ­˜rÚNÄð½>t&ò:ø’{PÙknc ‹r „oPñ§ïx`ÂuÍ|ú?Ä×s‡¬zK³*,RË}Ö 8˜úCS¸¹vU¹Æñ#r[¯Ÿùmºàʨ c¨ H“[@œîF³T¦ôélw-–'$èÃk5}‚)§lÞ=Z¥©» J³QÐpå°gËë”'¬b2GÉ Ì¤ ‰Ã4Ÿ5ÔfqqðÌo d‹ÁS)¹EºqÚò+Ø E8úíG0Êãf®#i«³øbž¶v…H~lí`Lüd* OõXd€Þ«˜:¨ä™š×±v@UÚð¬ÓpŸˆˆKª ¼ß¸•Chñå$´§;ü€!·fŠc:íÖ}‘ò$¥r^9&C®Ýì˜kÐÏ${÷—Õ ÛšÙá&YŒ9GGÛk$ "ø¬ˆ™Àh©ÔÀ ã’)Ä«/0Ýlµ“ª° ×Ì<ç‚-T¤X ï‹`²Ì¸Åáó$_Ý¿Ûîa+NVˆ•÷ÁÀ‡3 ¾Š†¹P%Þ$Ô` ÿQé„-W,¨Ö+ú'ìàƒk\Ùé¯YL9 ¶wÜ¢˜LrÝ5öiü7a.êq´8˜Üé9‰:ÕqN i*F˜VLþë|ûðêß8 K endstream endobj 2192 0 obj << /Length 2309 /Filter /FlateDecode >> stream xÚ½YKsÛF¾ûW¨rXeBÄ“`öäØVÖ)+»eɹlö0"†äT@€ždkýök‚ʻΠ3=¯ž~|ÝÓX\l/?¾øáîÅÕu²¼X…«<Î/î6Ñb&i~±Œ¢0OVwåÅ¿‚"Ÿýûî§«ë<>š™dyå° M¹6uy£ìo³¸´u8ÿÅBNñß«ë49Ú`gq˜Eð]-á}~£Åhñ Ôò‡~×~7›§I|?›çé2xWêhÍæ² 4¿.’D[OWUõÈKô—ÃlVÏ¢ÀaËé’G¶ºÖŽ›÷³9Þ§ÅÅŸgñ2а ¤FVÙ¦;8>µÙà€Ë9Hq•eÌíZWLH’$蜩·ÜlwipÛvžýK™ÖÎ[íÚðDc!²@æQ.Wñ×ȰÖÛ{S7{e¶$Q®¢#Q‚S’G–% ʀĩ.Iª@"Á X«Kº^šÐDi.IšK]!Ò„}R3%¹^¶i޲…ïÒKI"Ml*„;©Ö<Ð<@WDF©‡LYU™ÿ—@¨L­•åÅû†ø,uN1óÑiÖNS㕱µi,ëðãÍ»ù½¢»#½T-tZ÷mx #mŒsM JŒã•˜« %âà´OàÈ‘ê°+ªÃæ´#àˆ'¡êx+kBr¨º$ëU‡MïYªCÊñm˜2R¼²°MÊ*XYó,ÊE=°Ÿ¨æ°z ê™bì/WÙûèmÀ7z[#ÓŽ Š?èPÍÖ¸Ö¬™`õUcP()ÈcÕ^3þè©mxj©[m÷ #&êž¼{‰Y4v݈õb]®ŠàuS»Övë–|9&>aJ50™Ec&¡?x/‚Ý'y(ͺe£%ûáæ^ïÑ°Äø¬Û…a“΂¯Vkœ»ãÞF«¶³š;šÌƒ);¹(PT]N"t³?(«=úîŒo5ìÞŠ»ä7]Uqo°@î6íŽ[ŠWU†£bev,YÀ“,Bªu·[å°¿úo^ÝÞ}ÄHžû ÄH‚-\šÄÐ@£ÃÆÓø±Ç¸ˆ<~ UñgGʱe¥¹¬ì· e\5–xFBÃ_·þðó«¹ÓŸ¸‹@²}l ¢“ù°'˜CY²Fl‰¿Í²,P[}lB î®õîdäÍ[™ú†Ë|c•¿y{«?ÅÿG¥ƒú0…ú*½ÿI¤H†H‘ô%ö¯ìij!¹ÊP¶x[nÞ°ðAÙgØþ/˜æ(kÔ}%ˆ™Æ™TK0›öàö%×ÿ:®-Ä©À/Îú¼Ó5×ÀGLFY«ÔŸDOöŽæ„¥4 …Ÿgœß_óöTÔÂåû—/™téë²@@»™G«e¸Z¦có¹<.—áR"¤K|“^žë‘é"B{¤¯¢œëò"½E›¢‚ÉÈqx€_ôÅð¢/úÚøæ¤Ê1¼õŸåð›uÖÐú §Ê ÕGE+ÖCÒ5=xªòõNÕ[ýlf |8ü³t6'¯›ú葌è,ï@j¸Àµ1Æ´Ö|‘ ÓwñTYöµç1Q dÛÕ5çÇGPmiuTK<µr©*  *Ô!8 d7¨üˆ–Lð‰».é' N¾ïZnìÍv礫ԟ:ceÝÆè1óô¾±h‹²>}£YfòAr”mLýI|{÷â¿yzn] endstream endobj 2197 0 obj << /Length 2406 /Filter /FlateDecode >> stream xÚµÛŽÛ¶ò=_aìK´ÀJ‘DêÖ>¥iö EzAâ<5E X´­]\]Ú¤_ß¹Q–e»>ÀÁË9rî3´¿9lüÍž|·}òì>7™—Åa¼Ùî7ï{JÇ›$¼Xe›m±ùÕ¹/›âǼûïm˜:¦ëoÛþðì^%³mÚ¼$U@”6¤ â<ñå;>»×z¶ÉU©¢]n˜À¤â½û×Wí° pqZ{YÚÃÞ"¶†¡3ö¦`hhyÜåÕn¬òÁðç¾­ w‡loÝÀÉo§Aà¡(Çe̿ʪb(¯z!–¿÷•2;9l8 ÑÂìó±ì ‹gÁi˜hOM®MÞxûOÍŠUæ¥Q`ïÄh/H‚ :É¢ˆ×zÇ+¥œp0¨¥j‘­¿xo€vê¶´Â yYõÞ…\— Áºp Ÿ‰>N½‹v׎Íà€¡7áž!oÿ…¶Ó‘^rXê(/¬ÒPvÿdƒËV­æÓ©3}_¶ ÿyE  Ñô¢µ£i–Š/›OTíáɽ ÀíÒ ¬,ã3‹NÔúH¥žÎb¦Õ´]íÕf8¶Åãø'Ø”Wåßpcd/C$HpÅB«ŠÌ˜!°åÄ9æÍA´<±Ý²i##$”›Ô‘§cm/`}îâ–¡òÑ"•=óÞý’h§ql‘‹|ÈW(†E <(a•d#¬ˆ“/=èqò½¿M•36;¯Ž|2?4 ñ2€âEˆC‹¿ÃGëLfÖÉ‹EIñN¢ÊŽ£ šôÒx·n’%ÎöhÖ q &ì³'vî¦Á[Û àƒÊ@¡+Ää <ßî×ôAœM­Hfö2 i/3‹÷Í¥~Ô\?A JOƒ¥~Þ‡ÿn²ôo¦¸Ðß»:ƒ]í«³@›á…²á‘c/àÕ€F€ßå šCL>òw0ÇÛ‡#/V‚“÷ »|s7ˆ¼0ŒÿfÑ+€M¥Èf’DÀ&ØÉœS§lDKˆOÌ"€Ìâ8P“Õ‹ˆÉ“0‰»¶1Ì] ¹°`ºx“»5dùhßÿŠ|ÜXÇ`¿ )/~û>¬Áì\y‚ˆÚCœÞü1Â4…fB5'8på"’ÚÎl±ÿ©*T'ÂyS°Íç}?Ö¦·’‹Y‘#|Ì{ÆÒè¡&AºnCQ&Ë¿Mñ6„b‚ñfwC«×úÂêq¡l.|mÛ„=gj'¬,òâà"šB hòÚ\‘¬"³æã{5$5tލ§Ti ˆ5çVð(Ë!°ª¶²S覕¶ëfÍbPTQð}hÇá4ûdðÞ¾ƒËƒ C¡›8¯öŒõӻׯï;}gÏÕHà C¸2OôÍ· ˜ËE„аg5¶£Q8)8ën×vy~b.¢‘Ę’«ç¸aÍŸó^Þû‘o°\½Cß –êáìï1̽¸œàŽ]d ÛÊ=cg®Üm²­³!É7U×h~7·$¾ÃVÛÍÅ‘ØqòhCÛÚ[‰âà„÷JðÄÂÞÉ IŒˆs,m‘Ÿ“0ÅgòN’ä®­Á8V<ý_k¼Î€þàßða¬ËÇóóÆÌDŽP¡ Ÿï~|eçmÎâoÖuÙ”5r7Ö8s6€ÎˆaŠ“ŸPìWcüцR)1:ˆÜ5$L~ÿ’DZG/ dtނޮ†òT‰FÞ¾ØJ,Û‡"äw`¨ÿÖV0³rÆVÛ7ÈÚ»—WOYhB‚ÇËûUaÓÞ •}IqWA¦`z ö¬Ã_õ¬×¥ 2@Fœ¶RyÉ¹Žˆk™ØÏY)¼#í…ÙTŸŽŸ¡w[©¼/M&,td$útW½Ë}a˜†Ð^ø±é†Î˜§pÛ˜[,‰¹‚af.aæp‚ÛŠ{.i: Rö9¯âùpˆÐ‡£P0IB‚aóù§‚ÅWY1¿J€XT ^ºéP£ ¾ù TÝÊÔ7–Uñ‚ÙÂ!™Dªƒ;¤Û‹ŠgZˆ5öX‰/ņ(OGj©òÅMÃØ§œ†š Æ¥#…\\àø5G À&ü(y„#æÂ‘€èÒDi E×3ˆÖÌ”UVΆ^7S“UÍ"Óƒ½Ôô¢£¼,ÓKqdí%—q ¡tÅÃÜ-±¾mm+.®±y·ì‹ÁµAöеãÉûøùš¬F{P«ÚÚ‚%ÇÞ–¿rΟ} #Z5y¢&¡ÀSW’îb=‘ü"u­PB=¿€æ/I,ÆÈŸžÔ̧¼†ô†uÔ·«ºW^N:½!å߬é>…Ö8»Œ?a¹uã$t~–ÜîgË«ùÙüEZhQ+…@ƒ]"ØÕ ÂX>n.¸oÍØå‚–ã®)³Y5pþJ{kEŒJ—œÀ釱6S£DS"ãó[Ã?2‘ƒÌHˆFñcM”´@¯ˆmzK©a™;¯ó~€—*gõ=ÞœÀΟç¹y8¯Ç†çŽvQÞé$gÒ;ºÆ8à«4r“9Ò¸ÖÛ±<ûœE–FRž(íò9ööžDÔÎÀ <øÇ´n¦_!¤€šzÆ©­>¿%ð;@–®D8#ËDk=JªYŒñV}øåöÉ?Nîdu endstream endobj 2202 0 obj << /Length 2080 /Filter /FlateDecode >> stream xÚÍÛnܺñ=_±ðy¨°´¢¨ÕÅm'v/Çn`o[=EÀ•è]%ºY”ìçß;á´’#'†}XhHÎ ç>Ãu»…»¸xónófuÎÃEìÄ,6· æº÷ƒEȘðx±Iÿ²¢hùïÍŸWç7ÂäëÀa°Ñ(çY™^ŠæËÒ‹,Ù(Äãš[Vç¾;"´ ¥í…°Ç‰þïË8°DÞÉ åÃTÈha³Èñ׌ˆSÑ ç¶…\Ú~Ĭ‡¬Ý#äY‚6Q’d)­óLµ„PÝÒNݵ¢Íî5Kfi…B­ÆæÛT¸ý Ž—öšE–(Óþ\UKx$™hûËrVm–(#“¶èeƒãõštHª¼+J@ñâÈúÅ]»µ}¿\¯µMðî®­kï¯gˆ[*©id›8Le­%eš•;bW•ôm÷’h[‰úãV§PÌþNr³ïlíE®ã¹Qïg¤t€ˆ0'^á±G "°cøs@iέ ]Y·UžW¨ÇЇ†°¹ç:î:~ƨE# ? å2x4‡u#•,q§=yw|5È=„°ƒÛ ’IJ¹OiÆÚ#4¨$îwŸòjw~6£¼ï;÷zÌÌw-@&”Ní%ß‹Äjã3|x¬ý‚€ÖëžBNì̦üŠª ½ˆë-ù·ÕFÔ+Ë fÎ*:Ù5UW+ôEXõʆx×^0Lœ`"$† Dkûäy–@p“íÛ½h{Èlídi ÌUï¾}¶Ûçµ0ü4rIÈŸ_\î7Êp×òϹ6yÊfãºñ+œ['­ÃfëùNì†#Çú¾OѬc|Ñ$&Éi †v- $2ÏMœ>ìe#h¬T¶2i§Vá³Vñ_`N "c–è•fñþÿÍ¢dR•éKceb•W˧{‘éç—T‚€GÖ)š!ýÜ)ê ܵFåÒ Š·«­Pý9f;~1ÛCXÝʦ©ÊŒ6¡ô7`ެGê”®õŠ<'m¨Ì šëÙ\Ç&ª ªP ˜6l€±çz`¯Ð4ìk É2‘ê5û2yOµ.ÃîÃ=ëô¿ çñ…À‹c::ƒÓVµH‘‚J?|ü‹¡’-}EŽ%Ž1ë=(c޾ÖyÕ´"¯=ë®y¶ÔE2$N JÚT9±Ö-O°áõªoÙ)fE4~.mŒiÚ¸ûxvm_âšÂÙH3Ôr³Öþ•MV`®„V««4s­wY••·UȘç2þ{/Æ^ícw=ñ5=uœ¹©"­²æ:Ìùj;a¸Ú¶*dþ@4*›eÄadªK­÷ÁÇôE;sŸ;‡žÉx8IKQèGŸë\„íFîº\´Uc¨ãyV2°¾¥^g©L2° ¨Æ«Ò9µ~ÍŠ£È1aR¢Ùšh@¸V²³çÐÊ‚JDBNsRÕ¤`ôþ2ìÓ®)OpH%X—*=Ŭ­+ÑvZÀÿ@IÂû÷eþ‘е•n™…áÀ=4De uP5˜Í£€ÐàYíщCLm:-ÓF> .·.³Nž“G}‘uv¦c“?Ü5!¬I„¥¨h÷Ÿè\È ¨6Ÿ³B† 6ߺ<½ÙœÉ%Í´©Ìû ÆÝÓRä*›fÑŽžçY7ÆŽŸQzdâ«TI“ÕmU˜ðvCp5B-´]¿è¹3ô÷æiA¹Ìñf÷:uÚZ¬V;œþ·Û:IU¬ôÐ|ñ³Ø®P¥Õ\Àÿ\æ.TÕµ.ÿtLÀ;3n5´þ~˜)°×è×nÞÐÖØ›(p=Ò& Á„ ½  K!¨ˆ#6ìßêè1H`¢ÜÁÌÅpž©¾ËÚsÅé`'Hy®¯Nm%ïpÁu¹§mz-!ôþüóœ#Z]Ȳ*Œñ!Øuˆƒãz‹Ce¡Wôà.lwªf·:x1@/ªU#s ñs@_“"_™›ûõ\zÚ€n$¦tšÃ£k¾M:øÓtCù™ö{×ù„ýá«(êü™n7{s̸9„›MzüôäŸëZWUK@Ó•'ƒ]pb|èÉNGõ¶H>©šûѤHŒp O|ˆTÀëUÇ&.t ä8„˜…7ÇhB÷ûÀö’P jûæ:zKŸƒˆÇ´‘¥²Ä™zŒä}#½IÁ½)2þ:A/†"éY¤W¾ø2<óoæË~VÇ…®È¼oTÜf=4¨?}ß(Y‹fx÷Ìð7ÃÕê<ˆG®çŒ;a8<Ÿ7¼°(¾ãG¼Gر&ú ˆ- èYèù×¼Ön![¡“ÞÚ0ûq0:÷¢ÉÄ6ŸSÃÎÖ?ÒŸŠð-Ïs|¼ØƒßíÈ©£gâ”CÁ8Åï“8%‡v2%"¿¥ÏÑŽ¨w¶„üvN… tÆ^îPýòžeäDqüb>F@ÕmaHw´#%ÖÖ‘w¨ ØÓ?|âåצb}JÍF·Ã"þP“‚m#_c“<è š(é;.IØJ©Ø¡ÜTžöyE`[Í(¬Úv±ï0?œMAŸ²Jå'Ï`© v#ë\$²Ð›”âQ¬^!Ë™ZœEÐo¼ë²F^‰B*è­R7QË#SoáT¶øïÊÈ»›ë¿}èÿ‰£_õ5hÉpZ©2­üïº ú$ynžûaù®Aý—úÊLfùžãÆÞÿ,,Ÿæé7a4YÔu8L2¯HP{ì;CùÛìTòaóæ?ár8 endstream endobj 2210 0 obj << /Length 1246 /Filter /FlateDecode >> stream xÚ•WKsÛ6¾ëWp’ 9cÂ|?=¸­Õ™Œ­$µ<=¤9@$D±&A ãq}wèA™r¤‹@`Øý°/yVeyÖ³_—³ëyX9É“ ±–kË÷<F‰•ú>IÂÜZ–Ö7{^óò~húú¾sÜ ³KÚ,Xíøvµq‚Ô^©ÃöÂq}[:ß—Ÿ®çaz 6ò|’f!\ªf9òÌoÞÁÞ'ÊÃK@Ò`x±§p'~g²õs_w|ÀˆQ ø`‘0Ë´ørSKí×zà…Ò¢Á¨›Fc”¨öù‘p 4{Vn±¡â(ˆØz©,³1¾þZ,TX©ƒJzâÍÏí¹“E;NF ¼`cLaMsŸI„÷=/]€.cíQ]2®Œª×¯À›æv¿aúco^jÞñÐ6©™VT*wàS+Õ>±/»V)ª95w·6·#·í4¡Ý%yÝ×L¢Û™o/Ñmú¤®S~Q‰b€(zýÙ#·B¢ÓeÝ2.ÁÚèÁÊA½ªÜ‚,…WJ`ÌUè¬s”ÙcŽ»CkñøÕÉB›|L û3´e=Æ>€xÊü¦–²0ÔW…ad—"«¡ªj^]é£:‡LåúC—?¦7 [:â¡u¬éÐ8ˆ†ÚÿpâĦ̀ȪB9Ê! ˆIÚ®GI+6™9o3i\šŽ2éDUÂXWxäªÔŽ0éVÿ°¢¿š‚k÷p›dÇ–§©O„s]ÀÑKàùó.áhG¬Ë?o§•rNt®rxó‘̇ ~˜”’ïIÉSR¦—àǔܞ:-Þv*d_‰æ|«bñxwwÒIAyÅŽà›Æïú##‹ÅˆÛ¿öãi,J" ÚŒuû“¬…è¤$P~{Ê{õÐçÙ/Û®ë7#ÞùÍÝÃí‰8ëÁIÍ![VÖ´g?“L&>϶L¬:ÉÞD›âu'Rd;zü,oD5@ísÂÀîå»é|*ÓÜ<š%F-4M`”¶£Ö®FlÔT¦*Ô  =£›]£ÈõÁ(™ÊûËÌ[G ~©öë¨GàÁ¨GàÁ¨G„A¤{RÖ8nš¹3 ÂÃn|xÃÆ°56C5×n«øTÇÖýšAÀq)d»:xñ£´°Ù@לzZsœ»9:^i’v>vÀÉQ3°¤ Øíà4â^ÉÎ÷ì°†ŸíÔÎPçÐîgfÚ­z1`h´ªý‹Éítcþr9v¢ÐŒ,QCIÜ6h5hT7¾<î·mèlo¿¨P¬UïŠϾ `…ùÕ@þgF1$©ÕÇAß•é “šŒCÈ!Ze ãˆÔ4ºî=ü%jÌìË&¤ª NO7o¡"—‡Å¸Ÿž ÙýÔ“?q¨J£ ƒcµÛþÛü§Â endstream endobj 2218 0 obj << /Length 1498 /Filter /FlateDecode >> stream xÚWKsÛ6¾ûW°“ 5ÂßìL©w&u=må´‡$ˆ„%4¡€ ÷×w%RfR)£Åbßû!ôÖ^èýrñóÝÅåuœ{%)³(óîî=†$N2/§”dqéÝÕÞ{¿ ïÞ^^gш2NrR9ð±4×¢­o¹XoQá¯üKÕ™s¡»mø^^'ɈQG¥åD9,ÆÈ¯k[²Vl·!-Ûò Ÿ#‘óŒ”E4Èñ[ßh±•V€š5‹ Žcà –#gØNÅr|“¸L‘û£ÑPóš€t'ÊЈ”)ý†tí±ÙpYÂ4Íüø‚ú•6kÉ÷ ½•p•ÐO¥?Oðyüµ(bŸ)ÁV ÙÏŽ´tVÖR¹¥ƒŠBÍžPüG3´ÕH*Ú#u+·±åšá¨f0:Ië”™3õ'p‘bíúŒØ¹Û ºùúí"Ê­OrŸ+T@Þ#Ûí”4D_Ä–iþ?vxh°O%·»^óÓ5q¶ß©¾ådy{{º&W½–Â8v‚I=•¤]ÅT^¯ùÔæ*Kér®¼]M€}ó=†7çD»ÆÉ=«´t†¿²â“ !Õr—<¢Ö²’$õ).­öšò{9wvÎTJv©d«Y«I#:}nª_ɶƒÃûHOü¾ãõ4c˜Ù}0a&dytµx5Pà_®5W bÊêšø” ’·ºc—m¥Ô›Ó¶t ‡¬»¢(ç<è¢VO¸ÓU¶0˜!³†Å1g•}ƒ3èFïÞTÅ(r%$Ÿ”³ü<ÉŒAÂÜ¿^PJýW7Ë7F 4€V¦ÎŸ«QªME…D¦`ê÷fÐX‰Ï Åu¯Z"ZÍՖׂé³ëêòP3ÆÊ•]UF<#pwÔÕ•!]·Í§ÉNI’³MáÜè~åÀž2çpøç³ëiHòrߞݵÛ[»o^[0ÎÍ5Ã5o¹CÕ“´·He"@Q’4¦c ò-)†¤)` xš!\­dwFMû]‰vÔævÆ{J®AþƒKÍ sÒ3åF¬u É^C¿p …c‡– z$ÓrèÐe泦ç_Á\S˜W€v‰  KÞƒ%!‘âlÚˆÍTA“Ìš‰Öd¶É÷$Î!yìnË™âfPŒ¡²ÜRËí%¬d‘ÿ«é.fËv·h•6ì–“]\ ðcëEîofó›í‹«l1<x˜bŽz±•U´L‹áÄÐÝÇèEXGkÔ7wŸ/¨ uºGÊ1¸½H½j{ñþcèÕ°ÂA(¼GK¹õ4‡x ½Æ[^üñÌ7áOSr'K¨§%‰hq„´WÇz:9 [ìÿC˜†Ë S‹ÔDüÕ°bZfZø·vaØs‘©a´C° 30á»Y*ÛáäÚžAT ÓÊîAçS}e ûu»%I³ìá™çJLs’ç *úšw•»ýõgæÂÂ40A’‡¾Þð™’’eö¥â,û‰ì˜b[¤›ðŽ¡ô$ûâçRÏ¡Å$+醟µx°ÜâÔ`áŽkhzEšøW¬ÅS¬é$H«8kš'œ·?6£D@Cp¦™äPê€7J(æé(¤($p x¤œŽS†ŸâͦŒ÷Úãäù›'Iöï³Ä ,sfú^Õ7¬š¶˜ñÀj€êRm6Á$¶Õ"prO4•{ôŇªl®a;¬ÆpoYuÊwü‹ËÛo nÁ îêˆa‡|•Ãeoš£ê.°ïù$ŠàÝMÓ"« ´xYóï2×D¢ðÐa']ä]ÇÖóä^ñû,Êgª”1¥\¹†¡O±†t•<ŠII²xñI^;(k'Ë¿ð&ÜÈúǹðìBKTÚ<ºÝ 2Ããso=fnú ?·ïnn¦¤’ Ð}Å ¼ÿ”ø29tmPèìƒ?ÇÔQ8KêÀeëT:ñ‚qöŽOüpÄnöðá¡9>J/iúr6$ ®ÿgn“m endstream endobj 2230 0 obj << /Length 476 /Filter /FlateDecode >> stream xÚíVÏoÚ0½óWxía -þ™Ä‡:‰Lš‡’ž¶BbJ6p“Lë?“­é8lS'õ[Î{ïóg¿§£{„ÑÇÁ‡t0NBŠ$Ȇ(]"‚10¢ˆ™Di>“R3UÞ¯F4.F}V¦}M?°9&ÅÌjw> stream xÚ¥WÝoÛ6Ï_áåIbFŸ–Ôb)– +RHSìaÝ#Ñ–V‰R))ÿýîxdl¹j+c0`©;ê>wt»…»øýìÝýÙåM/R–®ýõâ~»ð\—áz{[éâ>_üí¤þòŸû÷—7kÿ€3c–$1œ£ynJ™oD¹+–~â<,WðߨåÎ\óµË›0<8`x°ðÃÅÊa3 sš‡EÖ_  ­@4Šè•ùõe#—«Èu_éqÞfü|’?/ënÄê½ñÜINÞuüeĺùt{;ɺ¼”è~½&î/¬åŠ×#fßýŽup®d}øÐ¨‘ÈÍÕíÇëI©¬©Û¡ìãf3’øåè¸IáV ò[QïÒ‹&Ù¥dµè‹&ûŸKÙ¼œOš/Y¯Ä‘¯¢ï„OÁóU™ÏCV•¹àòü{Z‰vü‰é/< õÐtbÄy÷iÚ¯yÃÚªégFa§x[0Ék1/-*ŸÉFÕsc̳B0¨/ñ~Õ5ä%,H’Ê>B‚èÄk–&¾E’+¨ï @Ì\;Âc1Ò+/bAä0óƒÆR€,°T»DX®1»46ÎW&©¾ÐÊC ©ç@öö”©¡óTVqQk´èDo2dè°®ÌxU½ü0 ^â²48ÊeÛæfgóoⳄR§|¡ÇsϺކ/WRpè¸FUy¹±ú¦”0Tü¸°½5:ʃÃidv.ðª3¨bÄGñ®€èç6ø?ÏÝŒO†ãý,4[ñBu]È Ž ³Z Á3 Šh{þPÎ÷<˸Êiaz;’ZÒœ¥½H<úFHf¯¦`ÇúÁ4%ü±I„.ô–° ¢*ÞÒ¾Ö }>z ½€¦¡hä†|Z§ öf8æ…E¾ÃFò©´]¨ ÙWHîh] B»c•ûBƒx”RøÖ®#¾¼¢-ÝmðIÈ/ ŽÁÞÇ`A8f%€Ï¥%—9ÊVFÝ  Ñ aÞmUS“¹¶´  ÁnJñë®3#C©1s¤ZŽ(: · ªäNḚ̀hü‡'æÅ0“¹®%ý5Q²q^ ##Ç;fÓ‰;¥¡ +Õ ¸Oîpìcó«Â?ùç*û¡È º-Ì©âu cS¼¡£ÛBúšÙäϳ¯³°”UC.ÞÐ+W† ƒµpy Ä<µìí e¾yÂȆ-tµ BÏÙaúSquô²ëtóºU"+;}oEfSáðbè(€Ü[ yxkÆ”çpÙ|Ðúoê4 …Hd¸}:Žîcóûú¾¥$‰cosA›,€Í½¥Ià ¬¸ÉA”aå( œ×Ûæ¿ (Ú€Ó„^à@& ÞObaÏ¥™‹€(x]£ÃOκaÎvµRÚØÈµá‡\{ ZÂ/~©) "÷ B"OÇt‰€jŠÄ„ت×6€¼»ÚlÞ™[Ì›ôžêÇ#©Ë\*§²n+ÌhaæIñ̳~~þYgïè³}ý×댆X Ñs$u¤Ã«[ P¬!ÛÜ„†ìøbó:ubóƒ+ÆäÅ÷úþì?Ýwá@ endstream endobj 2248 0 obj << /Length 2008 /Filter /FlateDecode >> stream xÚ­XYsã6~÷¯PM^¨* C>t7àÏngþ쇋oW¯¯"5KE©h¶ÚΤï D³XJét¶ÚÌ~õ®òrs]emžÅý§y¢½¬Î³›Â\Í“À3YÛÕ¦™ÿ¶úñõ•ŽÌ_Š8Ѱ±I5ιðíæ®}}ƒE hZµP1tj^[(Qêý ƒÑnq$ÒD¹ÍV$æŸs•xf¾ÐZ{ïÕ9}ØbxíÎn²61?•Êr_ÈH$AÂ{¬³õÎ0Žùr¾`ïÊuÑm`Û ‘J¸3þf^@@rWmÀ¼¥›°4ùí—ÜÌð¨¹ûŸaäýaæÒ[·Ü÷_?ôeqïØæó< ½¬ÄåvN¾u£ Ôd\€ãÓ0dYqgQ>Ü-ö†›Õ|!½8üñ-ì(_lÄšï—Ú¬ûªkÑ":Õ¼^Ì‘ÒÞÇÆl»û©†ãu¦¾ÏË[þ*Íäp¢²Û,/›–?Ѐ_P¥ˆ‰Ö®UGI˜éÀ¶ÈÐ Ÿç*öù†»œ´ÀD¼Ø4ÛÁÑ:Ï:Wˆz·j¡CͲ…ÊëÙÈK‹É-ùˆ›./6¬/.ÝÙ%ˆ¤ktîrùÏžÛ†ÇaHÝíLÉAàD3•D"R¡“p“ï§B…Ò"¤›”7ŒZú¢SÛ/?¾bŸiSÖfÓ­ÛüPžoËýò¤s2bR ©!a øq¶š-_Œg»óäÿ>ß›²ù›aÌÓS°d§zé‘^gËó®YÓd÷ç ù LÇSsÿˆ0¹µþÔhë¡?\“ÛÓgÁ©œx–ñtOb4P"…¬÷,FU>‰QD¨ìùL`ŠI:òëATÅ¡}AÄÙ¤×5ÀˆˆÛ:«vl‘±×Ë·Îz6t ³öA@yyÄ]”ÙÞœ/ä¿*tV†áX&¬åà c¯ÊjôFÞØ›ÖÔ<ƒM{¨Éƒ@ u8=í¯‰§ò"Néó⺽œŠÜ˜$Tªm’Ju8ú›À[ Òœà‘ïÍ6늖?4/ë1 Á˜&½ßQc”¸Áåe -±L‡ñ:Ò›YÙýÛ݉БM7Kå{â2u&ÂY¹a‚×À`³Ëȸ¼hÌ|O0#,—”Úiq¿: !Îì¦,»Ç¡™«2iWUxU2qCyüBF†o8áT˜@2& `_‹sîhî@c6̲µ]¨Ùĉ–1äŠþ°žâwÛP‰Èï-€3#TR¾†*4JEËSíVÎbP5XhB®-¯°ƒ¢—Jmôçâ qJã÷]^L±Õí4ÁÑ[‹ êrÌz÷ñÇØ}NAg:_ª8é}©RŸNc‰ ÝðmƒD%Li;O4Tqj%¥ù;Ý¢8N,(Jõ"ôUä½Ûò, ÒÂJ›Èmœ Žp§Õ%¾Gû>ÛNDÇܦ7Ž2ÂbÇFÀ4à¨a¯ŸæiäeEg¹ÁœàI& H*”V,¸g‡Þ¶+m âŠK˜®y G"îw7ø‰dVãfL~xµeŠ íñNáð†Að˜˜A Â8q+Ü @–;‹%imú¤ŸÐªHä%Äì}æ4 9hàôYäMk\+ýX¼}~Jĺ¿Iþ@î|B7ð\r,'I·ÐûÕë1:‘bÄAÊ!A¡‰k׳1"Ö3¥­ë ríp}cZ,öí¬â86Å1»©“n˜{¬ËFÚ@*K…¯ôi@'*TÄq¯¹½*‰k®6Ç/ñ3p,5øî?XÆIíÕ•ޱƒ”}.ÓHè´çÚtuöd£µˆ¤zÊ5x­Åcž éƒl9ûaóÀ™pòCéàÿ#ïOX"°ë@‹D†£;"'àˆ±‹ñ@Úó}S·z«»€o¤`)ôáZz'€6Èí:È §ˆ6ŸíÎi nlð®œJoÉ©”öÙö,2ö"NÄæåô›À@`[xf¶=¦7º&u¥­ÐÕÎr¡LNÂ@óŒÛ”Œqõ‹Žòå8ž6ÏÔD«ãqšÈ,*Ò"Óajyû%ÛWŨ&¬%!à}¦I ÓØ€˜ã_U7ûõïÍ>+ŠWîQ†\èƒ í£ÞqÊÔèWàHß÷¾ãøÁèKl) "q°„$nMi)ó¥6¹›R˜Ï¦xF ‚Þ× nñͱ·:êtœˆÅ'”üýëÍÃÍ'÷2iéŽpÀL;2Có M¤å2>1ÂÏTÐ átUÆ%ÞÙnz6™â‘2n6îVŽo©ÜErclé’nG,Ýå#¾jºõÎnÕŒVnsªQ‘”>·U—ë€×kVAÁUbxZ"yè%œŽ^Âöi/õʵ=ÞpóªZg¯.{‹4'ƒòÒïŸß®.þºtPeÿ:-#¸¯ÇÑl½¿øõ7¶A2M2»£©ûYá*°b(f×ÿ~ôDÑøéÉÛFP<È ‰N=@6 pírQ¼>@ª#7|4ƒj¹š‡pF¾ ¼ôø1 . v üB¨ó¬®ÆÖn8måC€ ÿŽeþlFl endstream endobj 2261 0 obj << /Length 628 /Filter /FlateDecode >> stream xÚÍVMÓ0½÷WDÙ‰D\;ßAâÚ ­8Д pp·kÈGe»eûï׎“n£¶-Pà”Ø}ó<óæSh¬ h¼›¼Í&ÓÔ‹Œ$¡ÙÒ@Ï!z‰‘Æ+ñíoÙ‡iºH7†ÀEžäi1)­‹Ù ŠËr÷ÙŽ= 3Š%±‘•ª%ÁbÃWLØ?M}x@éôœŽÉMO3_ž3º´©Á$à bÃA ˆ£@‡¿/Hm»±%èrg;„Ö²OE®õó®áDÿ°µƒP§MK*TÐNch­ä~-ã¸Ê¤]ç¸{YØ2w‹ìQ%¦5)ôR4š„7U(ÈŠÒGöÇ@‹kýT•²2G¶ º*ʦ=!ÇJ Û1ÔNÕíA€<¤#æ¯È¨`Oôýgv¶ëjÚiø°Y|'¹xi;¬ ÷P_ƒëu]]iÈ5YâM)ôbæégEÄ]S¼«ýhmPÒ:fØ'6ÂÙI ÊFK:"¥ŒW‚ëìt¦¯õ#W'›f?¶2¥fÅpev˜UÃpÍ©©”efŠ‘Ñ|À ¡¡†Þƒ|#øøq~{;J»;»%lÑ:ÿœ}šßŒ‚eWÛmgDåcívX¿/Ö©XbλÛ%94!òA¡þvyÑ9þЧ>Hâ=à çx7ÂãJŒž£qï?Hþ‚çÊF ä6yŽK ,°ù . /íÒÇ‹òCâéಞ®G3ÞïŽÊw¹9øc0#†ÅØÈ =ŽÌAäÎoŽAxt p;ª'õóü‰9ϲ´RßÈÓRùóSþçsãBÏÿt<ù{q“MOP®Q endstream endobj 2269 0 obj << /Length 1206 /Filter /FlateDecode >> stream xÚÅW[oÛ6~ϯ܇IÀÄ"u°‡lh†i7$î^Ö=ÐíhÕÅ d7þ÷=I[rÇÎP ~MËw>ž …•ƒß®~™_]ßF“¢4 "g¾tƈ²È‰ AMyîüíÞuþ°æ]ÁËr÷——P—Ë‚/Jqë%̼ÛHÑzÿÌ¿¾¥ñÀÃÅ W½™4T2WØ8¿¾el ìÓ˜¢$pü †=ªUBJÇñÓ~ÏTiêwŸpHú—t(J‰Þ~óÆóCŒÝªŸ•è›\¯—Ô‹¬ä­A¥Ãð CaL,â´È'Ci²xèò›¶å» S4EIxÒ’OÂ1|Ö˜lK´!bÆ}ÌC>"­Ø,þY÷£¥dh³ä;a"ÿY?fmÆKrÞñÙ¤J«! ²É`ÑÔÓB¢—ð Y6.2vVqùy Q4+É+p¥½Wäu[ÌÔNZ^Ú¬Züðñîn,mB—Ê¿,²‘t8iø e›î%³Fvwl=‰x¿;©³rÑ´b¤1¿ÿøvRx²¢q)@‚áQ‚%P Šb-v#W›JÔ Ü®Õâñó(S•’"jËR§ÚQ5J?Ž L›ý7žO)uÄFòN¯›Ä¹:eû¨HS Æì©z¥zÌÓHl!Óô~ÅḟN¶ƒÀ'ê8<´a ©$PnתkøÄqs¬k ÒîQHNÕ‚Ä»y{Dh:™®»3ðú$€T0ú¿jÏÌ‹šwÂ_6›à™ èQƒÏD ‘”×íZ+u׋~!x~ðáø¹^p!ð÷ÖŽ0ËõÊüµÍQÿÝzahç‘Q45w|ÖŒ @UD‰ÉŽÄTQ@ð©°û•ÍŽQ_›˜}Cq[éŸ<Ÿ1 Œø¡Ä‘Ê^Þã.€Icõï7õ{p¨ÆAsŠØˆ"œFVkÏ`.:^”í)>€‰Å$쳑Åä5”è¦>Ae(‰ÒÿJ&C:zgïN‘RD(}Ž t2Ü °gc û1sv‘Ã-7&AmüòX «Ñ¶)L9J#­E/f z6i´YŽ„YŸ¡{ÉÈæêEMÓL̳cþ°©TP¦“(p¨ÑÁ3/¶…jãª/a2lWü³Òú_Që§OVY꣦Áî£(×­y%>aÊj1RdîJ¹ ìo½ V&®£³ î¢¨kÓq˜[ØöoB‚TªD~1‘»ÿŸÈÝw$2üþD&ã{ÓÙLþ) =Ç퀆«ÆJÏFæòÚ œµ„m{1ž¶l.¸ =(éÞaQ•ìÍþ ¤÷MCXoÔ¥£ÕZN]Ûͬ“Íå½|²‡ùʺ(P©“ß¹ÈUîD©ÛÔý$†—YS­7 %‚vTëÍU±í²ÖÛ‡Ù쇔¸¨[Ó—¢ÊXŒ‡&Ó±aÃ~ªdŸó/P_ÎÀ·Å8蹇»ÿ°0·ol#ïšõ‹—tqrû)zæw˜mlmey4w†ñQõµulÄmûOW¤¢\TPˆœ¯ŽÆ60(6@6}+~Mñèoé³ßŠ÷YÃŽËž"|î$N¼}¾_}$uE endstream endobj 2157 0 obj << /Type /ObjStm /N 100 /First 983 /Length 1758 /Filter /FlateDecode >> stream xÚíYKo7¾ëWð˜\¸$‡ÃGapb$ Ð…í> {k«1´ÁJ’ßo(+–"ÉY­×E ô`k¸Î{†CÒYvÊ(gƒSÖDœ”ó^€¬(‘LÅ.àUÈYV±à„ b.Ë£JTp¬JÉŽd•SQàX“d.Ze-YåŸlnl.‘¡½ Ä€@Vø"–YÏÔ}‘'feÙËŠ€oœeE³h…2”À¨|3€XDI œ¹|Qã… ¤u&‹ZIþyBÊ 2H ž(ì dò9 „a°"Ÿ c¾"Z2e¢%Æ7g@*à€H‘á4äYSfÈâL$Ë”&çE c‰¸R‘7Ÿ˜e ;‰E#P‡œå“S<œá` e©³H…Y…䦴˜eå‡ÁÞ 9H¨ÐsFyçXxb.Ì*OäÁÂ9@I4ƒ;½weð<\ „Ù–`) `Ë °ˆeÑá“-k!@ËÃêÊgà¹ÙD± EĤx×QÄe­WLâç1KâøI1‘&äh„4àDBŃ^ŽÂÑ Q"x Œ‚LÀYJe- ïÄ@lEá Û†m,89¤Rh¾ËŽÅ¹ ÂÑgaçÂW!—YÈéJ´ /&€•¢É"â±,ôÀ-ŠŒ€„TD‘,dIŠytp0ª^7Ó¹:8PÕkÐÎƨc @%!–¨ ÈÝ€0ðËÁÀ•Á‹£ê§¶¹8©çêLU?½VÕiýi®ÎG˜V§Ÿ?Ö˜_Õ£êØÖÓùL’±°UÇõ¬¹m/êÙ¢>”oïêËÉøeóI|Õ˜Ý9[¬"üZ§ÓÔÎ¥Iä)¥iS€¯)KFÕÉíûyÿ0™~U/›ö²n ;s^}_½­^Ù2 / j–6$Ñku¦Ru‚á<;ï°ôDUošÓFUGêÙñŸS}8½¸nZ˜ç¹ØjQ(zíáæ¥(ò+õà[¢¼…ñ¯Úñ¼>ÏÇ;ÅÙÆ¥QÙ{Sx£¥ŽbÐ$E¦aaʬ‰ÄQw*ªÃƒƒÂ¡:¼˜OšiuRý|üVþž]ÏçgßUÕe3ÑM{UY£­±¡úK_Ô776g˜Ý>¿öH•©„âo¿ÿ¡rÖ„”@äC*¯¦·77ç;‘­1ÛGÖIÜÛePĺaS´À^G¾O¸µ[˾õ[˾.š- —öK¸5Íó>.È›f 6iƒ0z lNJîìUìˆßÐÕ; _JîˆâŽÛF&ÍÒfc }Ý!öêä6ƒ:™þAl· î”Îk†DÛ°E[ßQÛ”7µå=Rxù>H‚Žüè Y±ÍWA²R{[-o‰‘lú[-#;J~eãey?eWÛª;áj¢ÐÂë˜å¼á´t°( ÚãpV½ßÙ¹¼¼Ü\¾º¹Íëö´­ëÕæeá“°G$¯"/#Q¢{d Ý$;³ºrÒëºrÂìl¦5ä/»0Z¼@¶#6k9évÃÆqJ'œY:bSÂoê‘rkõe§û†(ØÎš-þKð_ÞÇÛº(„ OÌÉë;c_Žݰq¦Õr®{¢^¤¿{Ó¦{mè]lå†eÈb‹£“•›uX¬˜¬Nr\ÌIçävÛwÍåøf2ÿük=¹ºžÏ¾®µr#Ô=W‘¿œ¦|ÒrûÖ ›bÔr÷$Ø("ÌôßÃÆy4º®Zº`q>§Gv°ëÍûJ.õNÚR]ÇêèÈmTG—÷mÌz4¨ýµÝlÞåVr/mW‹Ñ Å"$-¬†K(Md6š#MÜ)ý(Eâ}ÓnT Úãl±†|_%Ðx?\ÔööœßRæ}èï9¿¸˜,×Îw€[´üvOˆbTV” ö'/ :¤¤¼‘++·—›yŸJ0ß)&t}QY²+¡ Ì:„¸S’7íøãõpb¸„6RžQØ;‹x7Z{d‰v·ANêÛv<à®w±Ôÿ¥ž³öHñZŽ ú£÷3òl„F-"ˆI'ãvËlÀ;n‹z„°ø"G`¹þ¦Ë@Ýl[ü>m‹ßÖ¶;³ëˆ-[4o=ûlö´¼h> ¶EnÇôoÅÞÿ”=x#²|wZ-ðœû7"w/OÝBmùÛÇì­ØD0ë'áAž7­bÿm3ðÝ–Â["§ƒEÇÃNË+"¯Iv€àPùvw>Ç·ÓwãöÃ/ãvÒ [#> stream xÚµWKÛ6¾ûW9I@Å"EIö°mº‚mvÝ\’h‹¶U象¤,6¿¾Ã‡,É–o‘bKâ<ø ¿áÌ,ööö~[ý¼^½¾£‰—¡ŒGÜ[ï<‚1¢Œ{ !ˆÓÌ[çÞ?ãÁ§õ»×w<šhR’¡”FàÇèÜu¾Rê+Q·;©nëm¥þ¡Q­6^a·å¯ëÕçWì‘ãn‰ˆÙŠrF€ÈséJNQ»x•ìÊE'^ÌÁä†]ÍÁ{ÝËDÙëͳ̆§AÃàÂMo­< 1š2Â= VÿK¹mýéOaëi£{äýã´uñ²"Yᓹ¿Æ† l•Š]xÖ M¿T%ž´HÔú·›çM³éDᮜ°R¨ýPÈ5€¶eßÔRb׫¾Ò¿Ÿš§è¶©@š@S(ºB‚u‹^LÔ¥DýVõË!åØ0Ä7>ªÆ Í{°è4ôg-h‰UñU8ú@U‡M¬ðÆé¨b_Ô¢´òû¦cß,¡¾Y:þ”pl\a3†õI ןOðj5ÍùöeW”ÒfEi5”üˆ)«¥.КÒ7°LbŸÎ¶y¸ÿýĽQc>[‚xci»—E.ë“:¡iGKM#c–´iãxd.³ÿÈ¡d׫i62ÛbÛ̺;ž‹E£Ãi§¥ƒŽ¥ÃØ?ÜBZεvj©Q…Ø”òòa†0LdÿëˆJR˜S6™¨Çiúl’¾vP픞S­»"&Þƒ%0Çiüc&RÂ"ÐLàDÊ0³e2Bvö¥Ù¹õÉÿfÁå0ßéòd £Ô?ñ¢$œ¬uzÈÁÛçs/Õ³ÛbPP¿þú [yaß­p{”Âd*Ãôˆeá:B¿ÈçCH§ŽœÁªi|¶ß«¦:iø~9õ@ì§Ã•Žãvc¹€?”zjï ¯Õí(Ã(‚Ôpi6$èÛó¾<#’S¸=|°ÑhZÐb&@bþ Ía¦Ù endstream endobj 2289 0 obj << /Length 946 /Filter /FlateDecode >> stream xÚ½WMÛ6½ûW{’€ˆK}Û äà´qÐbáYï)é–h[Y‰R)©ûëËi¯¨¥½J>P"gžÞghlí-l}˜½ÛÌnW±o-Ð"öck³³<ŒQÆVây(Ö&³>Û«œegØœ°fGù’¥Ž?·oœ?7¿ß®‚db%ó@| w^$`3Ãê“·«ŒÝ“µë'b2> ÙSÍíÒ(àÂ!ý¹ÂGÞ€ù3k`üG {/ñ]!tEÒœSaGYJßôX_ý«£üh\a/I‘ÿKÚ¼b¨¤í¡Ê7ÂØ~+‡›ûj¿VFôƈÁiZ•u×RÄi“g) bóéñýGE‘¦!GÍiýx¯;Åc'Fóýa [yÝq„I_:Ó˺⢤NIÍ«¯4mo^Qe¸ø=…Šz¢šËjyÿ`᎒¶aŸ»&%¶7¬NuÐí AMÍòRõî.À>!Ò'½fE=¡]^´T7]//À6iÅéa%ù†ŒÑõ±Ù™Ïa¬:š3…¡–Ózd§µn†¡ µÈ¡oHdè´ý(…CÎö2(èiZšþMù¶j^¦Qoëj“¨[ž¬¶z…’`Q¬Uí\ò}WRæ¾Ý6Wkè+µó|G â‡æ‡WùøéÃÌú쾟شã¤|­;xFÞâÔª­PÛ_©ãÙië¸AÚmc`wx źgÔ¤™ÝH’«¾æz JüdPÁ¦iŠ~®¦—Ì.ê‰{WšÏ¶IŒs_`ø"¹Æš”ŠCµ“£†*§zhÇ?;«Éî7 #[õ7!¹oqRu%^¹||øeƒ®*;³(3µÄïö›ã ~]#N(<Æ@EÎÁÀ‘¯#Å05PüF q`+BrYµÀø.D”ðæäª1WŦO€— } ˜Šº"éTȵšp±_¢X7“cáÐ|[˜OÿR¢(¡½x…£š×S>´w¼*¿çìjì£Ë×–ÿ•ê~²èÀØ+€‡5`‚„mrè›ý:ì@2·;8« •/;oáå噣8~l¬!¡HQå:ed[@¿’ÆC8…·>uè˜$™ô$Arj@ œ¿¼Ä½>ü·þõ§ñMÆwÈÉlÍElúÀŸ’î|r¬û­¦|×_¿`æŸe’ö„,;Uòü·¶6 í°½" XŸÊ’Ó;cë}¿™ýßl§ endstream endobj 2300 0 obj << /Length 2244 /Filter /FlateDecode >> stream xÚÍY[sÛº~ϯÐ#5c1$Þúææ·éäøt¥g:M`²XS¤ÂK÷×w»àE¦}¤t:ÓñƒÀÅØË·‹]Ø[ݯ¼ÕŸÞüqûæíˆW©›FA´ÚîV¾ç¹BF«Ø÷ÝH¤«m¾ú‡“&ënÿòö& &œÂOÝD°á¹)ª|»N„Ó¨ªÝéæºÊÖAâìë¦ÅÅo<>Òþ¾½‘b²Û&ð#×OÄ@´é—À÷f«O¤5#+Áq½3ulêõ& é¬ûÃz##ßù«!E†´Þ8Ý^ã¦Þ]e×Ô‡“¹Fƒ"ºÊ4Ñë 5êêWà|íuó´N¤ãÂa±çü†VÐ(6H¶;¦aH6:«]å°0NßÕ= I <îu…£ÀiÖ¶ñQ˜Wv1j†¹êT«»–9f5 -HÑfo¯7­þzbÙ¹?È´_¸Qÿ€7ʶa51þˆdÈþÙR²&>|zOòÇdN²?`£ wÌÖ¸«™=3Û‹=#Ð3±”Kž‰žyF‚ãÙ3Rz,ÐÈ3r üT´Êƒã¬¢èœ=c^ñ²g®QÂ-‚ézÄÎ;pl÷÷B8Û}ŽŽ úk_4Ú|¡Òª#º‘I{Åsw±£ ²àT=öΉ}W7vm7Þm–Äpè{V³+ü •@¦=`ЪvZu=‰ __¼ÐÓ÷¼ìHr©ž4’ø¾sž­j»Ã]Qµ°Î§I´â‚pG8B €œ_ ¶€ R¾îöôIÂü4¸… ¬ÐHÍ'­ôðç&«±OÃ&lä4}¦‘yÂÁǾÚÞ¼ÿéæµ¨‘Âõcß®@1.8ÍQ<9ìÓß~:/ÙF©ëƒ˜?ÞͶÑž8hßF¡PnÃÁaLQíãüóD‡Ë'!=ÝlðΆxÀÁÇ M‰Õmz÷‹ÑxH¡@›¤v˜`Žd† #x!SPbCíAhUëpÐqr×u…Àuÿ§™63N@¨Ì„õwF&aŒi~—Á/rjNc²Ê‰Àr&pèF>I x· ”7t÷Fó׈#7ÅËÞÀUmqK)#‰œzG¿y)¹…­Œ‘0î Ÿ1ù È}Ë ÙÉ0"Mgª)Р޺髊n_f^J) ,çÑR7_<Ö8~Äì (øõØqKÄU¹­Rw¥É}!¢‰ºÑHGsñØl&“+.[”in’xb”ný÷;¢ß~þðFˆÚ\ïT_vÆ«©Í`±Ƕ‰¦·|SÇ/šè$‰Öwú AG·ÖkH`º2°y¼F;»K0\‚Á¤Â££¡ˆµ%Zh‹¼p(òÂqÎfò¥F‹§ÕÞ„}:Ä\â9Ÿ[ž¨«’·)ªES™ë?ˆQ-B"«CQa©æ°@8=„tsã@ÑÏåë©Ê&J©š{ÝÐÒL—%Q½á¾3ˆÖÍþ¦Î]ßgÿŽw=bÏã⨊~úªÁ™Ô¶ {¢Oª0`ÐqoàRyö¾b2•40BË >=›ƒñT‚î’|“Ò<ñX”&&R«&‘IbP¶°5 °}[CP«¦À¥©É†0OiÈ.H¼*0nÊZ˧xôB¢Êº¥@9©V$W+Kúâ”8;xnL]lUÒ”b·¦1e p9ûÑ;IB@à$¶0yKrÌC¸ºª0-¥S¸>!kJ?GÎ(“‡^‰¯¼îtÌ8;¶ üBig|5¤oíq_ذ1·eckÀ²­çþ‰çÕäÄ?“2ñ\ÿø©-óU©Ï÷Î'Ã>9Ô 1/†FuÌ.€Åí…:VdÜÑbKÊI‡­ §UN…ªiR3ÜþÙ£ÚÞ~pwE‰Ðº\± IH1s£ã×3‡´DŸ(†ŸÆµðK €)FœB¢8F5$¨É{!½vÈ …æ»›ou{=ÿ†«`±Úªá1ÚrmV7úÿ(Ë«ÖA}w/¯¶T¡^ß‹—•@K5&qR %f¥šàRLÚÆmPFc™°{âÍ޺ɂ 7KMÿžÚóÚ€“ÛÚI² Sšô0{)îö‹Ït±¥«Ê=èn_çç›ùä7ð“ÔÎ RºífpšfEÔbHü~E-ikUÍÊ>×ü^åxuÅ/UUS€_¬ Û5úýR›zKBÁlš§ö{,¿¡6D´3(‚1¶ÉEKµÁð‹ö †£†G±m‡o@ªêø@k¿…„ñ Y “ÙsIÂÕÇ lòsÓPqZoöæ=Æ ¹”²èÂ’¤žœ]À¥Ê{ÈÝþ`gCÏ>;Ÿ÷¸áúÉø”y}{ûš>¾ä$–{¸@ÏyÅ/øápNv<^ƒ+_íý¥œþëɤÎ×¼#’ÔMâ9l >¾»ÇLï¥Ï6#wM_eŠI$`õšo %j`ÊžysóÂC®j .p…Ò<5*èÿAgá ­.lN?1ìÍ…å>œýüæÓòw¶~—ö5ßWÛÎD«œ&üx inHä ·›ä슬ÃeÆÿ šÛ]žth ±IuSW$ØpâÅu?” ‘ówlÄêžx2US=yŒÃ ~IIùÁY°!AÊÓÚÄ}K³CLm ²QoCµJœÚç’gÏì?oßüä§„‰ endstream endobj 2314 0 obj << /Length 2764 /Filter /FlateDecode >> stream xڵ˒۸ñî¯PùbªÊ¢ |À[>Ø^OÊ)ǵñL’ƒ†„F\S¤–¤üÈ×§Ý H‰3ëݪ½HÆ«ÑïnF«»U´úÛ£W7ž]¥r¥CÊtu³]‰( c•®2!Â4Ö«›rõ1¸ªšòfÇAgš~k»—M±–y°k»~ýß›¿?»Š³É*a–ÇpÛ¬5®yñ•«M¥a‰ÕFf°'¦U{s8TÍÝz£¤ú¢í,¦)ÁW¼Ñ4ø;ÐÔÐÒŒmÌmÍË;{ìl·|X»·´°lq÷צ:kö4ÛØên‡èÛõ~Û‰B7ð~$D\aêâX›¡j›~½‰ãØÝÿ{ó7[©`ØYæ×à€_ƒàöØx -߯ʎ÷ÚOQœ ,<2 †pƶgWJMx¼ÉÒPçÈÌÂQHæÛݶðüù¾™lx‹æ—®ò Eêë p°½:-=üè[Ó1䤂@{Ç”@ESµ"ef™¢û~¶ƒ©ê~Fà=„ŠÞ¦ÃXç´õY«"d-Ðì ~°‡ž@'køvcî %`eaËcÇÛ€òºjlI#’¾­ICÂõ&MTp…*AùúÖPºÇøJÛ]u á2I šD’À9vصîÒ²­Û»ïë\Oq*µ5=/ë-×ÃÑt¯x´ÛÎ ²À´ÂÔôÿÚÖ É8HÌ3 $ZuÀk?€)~Ü$Hz[=Q("‘>û5,`{H;E%a‹¹ý~ ~zè̳ûÃáôg*„Êî‘¾Š§ÒÇ2PNˆ=Ä')¢‡T!1j¶³ÊnÛv`ç±.W{Ûô Ç&@t ÎAØ*×Á›o¦êï4ù•gg¡N¹3ÚÆ´³C¥=ê4%¯rÖ ÿ$j¾¬“¤s´¼ ·ÃL5Øz·NÓâÄm$ƒšZ|¬B%´ßHý’ÿÕ¡HGGS½â5"ð}dB†©8³ æòhR)gRyvb¢úˆ7ðäÝ ¯g%Â)ç©Ç Ô̽Òiã#qˆ±Y$’eÅ/º7xÏÎüå bß㺯p"iF'G‡!SFl["£ìf€^ÒøÝõ[Æ÷Ðp*2Vü?ž3u0l!HR§Y¼¡§HNù&Ð1÷4¦ïÜný~f»ç–˜X° çÕžŽQw)²´f$“še ˜’fY˰ÁÈyÉÎ8ó|d§O¶˜ů:—­W9Šö×#Ðf“©¯â™Þæôjž„*9³q¤ÙÔÕÿÌɸ01tùúΧÙÀÑ=æ×·Ê’ótqÚ¹"P‡þ"÷Žg©­Ë4f©÷JNÞ––dUmQRC>T€ðÕ°ÓQGZ<.%ÁÊ|ªsÊ•F%-ðú¸ ýLEçj.Šò³<¾Š<+N"oLÌÙÑÔÔ­^$².;J%eÔqk ¡´ç¾BŒuư5ôFZìœ÷“ž¦.Š0N9AæUýLÝ·4úÜ´HéW>Ýð¢= ØõÑ¥zîx ±_Lº.nî1êýµâ¿ªêÁ®„ ½Çyˆ‘°d? +fªK\tJ°ìí]U³¸™ŽäÝQOo™x7\ÔLÁËŒ?‘ÁmךrIÌ]gíÞŽõcž:i#ä# vÈ^Íp@ì¡Êø#0™LÁÂo\LÁCè?õi7@·¸ò;ÍÖTÛµŸÉ~c˜ ÎPÎ ¾5,$¹ˆHLõ°>g‚‰‚ ªˆ˜‚z ¦~ð£?Æ9Ê™|mZŽ!}o¾…äK© ³|T×v€³K4UT”†êt¦ê”€wŒÎ¢Š“2Æà8Å ‹| Œôü!z|²!4OZ¼m®ììh×Ó3ž® 8Ì’1l|·d‹é¡>ÅŠK‘aÔö®Rÿ‚JÍ×{±ƒV¤aªçv~2¿Ö¶_ö}uÇžú¤Pä®±sÁ-®©Çg÷Mh×+²*Ž&í‡‹Ãæ»I^3T àì¾jìY¸˜8Á3éœÙÉçV‹Á_fêTXN|N¬&ÎàjpHïÜœìCIî!Ý·cÖ>˜·¡îfQðÊP¥$—ÚÎ{>Óø°åOÂKæÂ‹ÀŒ#Á¸Ø6”ÒÃ]:Â~£k¸WP~Ð4 Dò±>•p²€=w9ìüö’–RÂŽ¨¢ÝŽƒÑ„íwsÐ Pèã’Àk?T›!—“œ™ê K¼›S]¤GÝÞµG‡RÁÀí4„ Ÿzýþ=îÉ87‰ÖÁPs°ëÎÆ™OÈ2Da$ED…:¢ÉߎÜñ­j×=Éb’9àZ4c‹’uªË+³„ÿ籜ÙûV î:€XØu4Æl ù_FX˜zñ9¾ Ü™æŽ[¼gBÈX0m(±8ï”B~¬±Ýé:¥Üìú÷Z§®gô‡z¥Ü®ÿ`!š`§ZJ4³“W:Té˜î¿l ÐŒk;,9dð„j V®°’Ùw‡ÑN¤Œ9Äë T˜4 ºÇ‘ÃdU öHEÃ#l Faîú‰ ~¸è{ •»Èæ‹ þ ñ3ö ðщÖNªè¾/ÁV蘷7ƒUì›ý-ýC—bT s­Ïò&êÇýàssPñþ˜Ã?}‡î¾K±ØJÆ!ê§ä³²Væù¬HÏ}uŠTáÊåT"!~žgrކ=Ñǧ/wФŽB¡~H÷°[êÞ?c੸¦â8޵ÿ¡IýÕ\väÇ9ûa®ýæáÇd¹èÈÅ;§x§âÜ}JÊ&Ÿ’ÜÙüq3Y•Šà};ðýÎ<ÜGÛ`ÃYJ®îÑ’: .¹§†àGõ4¦ü\Æ'†Ò1\ž\¢LE-çý˜u(Q5'B–šÏ)MýÃPPíË“RT¡ëì¬=É™~š`)à>¬¥éXW&Áb£3OB­Gå7ö/äs-ÑŽ"‹§ŠØ52mù”Ü=©àì7³?ԖјÒdÖ‚¡+Òô4ï%€HÇ]RG¨½°¦ãΕÀ¶}&/z‘ e „£‹Ï…þÝ.Éb4‡­•˜wûà³û?õé>=‘¯¾yJÿôŠTçåÚ¥OZ^fj´( ^ƒ™uv‡Œü²>Ń·Õ7=éä–&¯Á*k»ys-œCïÄTâgªŸD–=yžo–,LèH>ü #óŸývÆÇ77þO~3 endstream endobj 2321 0 obj << /Length 988 /Filter /FlateDecode >> stream xÚ­VmoÛ6þî_!¤bMŠ¢^‚íC‡ÆC´@·_Ò` %:V«·Rt–ì×ï$R±dÓF3ì“Hêî¹{Žw¼Ã΃ƒ?f¿¯f‹%œ%¡:«C0F4ˆÒÄYeÎÝÝûÕŸ‹eèD)‰QN/³Ì«ì‹Ó9—9_béÆÁ\pµ“¢í”gØØ\,Å ïÁŽØ„3ý_4ë2¥ß/Ær>A cÌmSK½ÈDY?@ÏëêÊxß¹: [¯¿‰T B#ÅFHQ¥FˆW™^üØ ùls³óhýê™öžß'È5¡ ߟÑ&ÎPF®ýï1ú8D“84BB(JÃ[. ‡FŠFÖ©hÛ¼z0A¨ôWðt; Ë+™~“¼ÈÿæFñTøÔŸƒì«n¨8SmÿòmÊ‹Ÿptœd§.Èλ<ë™ê,ßÿ„xÌóÆ’@›|Èy^¥ÛZ¶6“ï#+É«‚ùV t–ná·}jïã~5®²#1»ÛÓúWưÞÁc$ «çPYžvoÃ÷ƒçCÀzåîí¬Ô…šøiN¯l&eöòªZéÿ¢οxUÕŠkç: ÏbÿµYð6Ë>ÅZãgï(ÆæJ?öx¸“dîâ¦Ê:Sã¶4¨ÌnV³3šØ!/-™BWó sÒrvw ~8¢IìüÝ‹–N]; (¬ çvöédËìû>tÍQ߇(…q(#~2êéÕvÐËC6ñQ“ñHàz”ÅóG¢wá2ÞÁ¹ŒÌ ¤•²ÇSòÊš¶Œ4>‹KíÛ;Ѧ2oº›²‡cQ7T€:6êï3Q¹~v7gÜú+™?Y h‚bvÉ#,A¦°€reì<ýžjÒ¬Z>ÔòCX†ÇgÕŠBôoÁ¼­º°ª5 #¨mx5Q€¤¶Š§EÞ ’?MÑùNÕþèþ¡òþ =3ù endstream endobj 2333 0 obj << /Length 593 /Filter /FlateDecode >> stream xÚåV]o›0}ϯ@íÈTc?ìa›Â´)ÝCKû²M“&eâ#ÃÐuÿ~„ §$©¦)“º'ƒuÏ1>÷žË…ÖÊ‚ÖûÉÛp2 ¨kqÀ©K­0±„jùйÆÖg;H‹øvʰ-ªT,3L±¥¨›Jªé×ðã,Àþ€s Äú„ ÚMàöÐY@È ÚÁ”F,Çõõî0¹Hš"ªÓ²˜:„öën „ªçëKp±¡Õ”ŽþVîy2NÕZVJÃöãåêöòj^49X¦&Ä…£¡:¬H‹Èe}WÆâLþhDöíg×wg£à{Y-K% Txu37ƒi h·Þ*d}ê1.uÛççç5îÖáG&eÕ=D™PÛR>,D€ç£>¯º#kpöðF)ñk„ÇÕQÐ?Dã Bñ¸y§¶ÞúZÛÖ™¾'lï9Ô`«O¹ü.£zTg%3ÙÁhšîU=žž¬”Jµf%hoŒ†GYº¹x0ÙES—ãô§/ozÚò.’¾=˜'A¸_HË•$ Údtѽ²M±“eMOò¡HöÒ¼(W^¿ ÷sÀjážèóO’M%ê±¾¥åaìHßÒò?l[ÞѶ%ÚÄ õût³Xü•G_h‡;ÕœþÎ{~‡ÓÆ€†1X;Ééÿúv6¨VM.‹)víZsàîºc± Ò“¡ëݲ3Is§Oµ»ÝÇ¡DׯXãô-©ýܯópòjÌ> endstream endobj 2338 0 obj << /Length 2249 /Filter /FlateDecode >> stream xÚÅËŽã¸ñ>_áÛÈÀX#QïÍiòè]Á^¶±—LÐ2m‘%G”º§ûë·ŠUÔËšŽû0ÈÅ"‹d±Þ:Øœ6Áæç~üðù!Ê6…_¤"Ý<7aøQœn²0ôÓ¨Ø<6ÿôÂ@lÿõø÷Ï©˜lÂÜO3Àc÷<èúðû6<Ùj¹¯ÔÃ6=%»¾UøN÷ýüÇl»nt;‘,"¤¾ïÏÎ.ˆÍR¿È…£àK{ê/ªÞŠÜëÌvE‘w•F¡§¶¡w@Pìu -5ÝYµ4¼¨î P8w0‹ëæ$ò}»0ñ³$£[ªTÙé¦ö-šÃôîBáIHçiàg¢„ˆ‹½aLSc”[¼Òài›$NÌ9² ýí.Žcï/Ë£MíGúþ´ä3š jMs 2÷…ˆ‰Ê¯" ÞâÌŽœ"¾" {™‰/öÃÄmy2í˜_ìpdDþäæWkºOÀ0÷5ˆbÔ¯“ø‰¼ Ô«‘Eœ  q ôKƒVUdÎúJ”~«æô5H‚Ažu ˆ€BB%ëÃlãEÉÚ®é ŸÂŠ¾!h3!š{£ëÐ, 8cuPÊ ç¹w%•T/usÑ,€¶¨Íu4Ç[ø €ñ.«Rá=žóNÓu²= XøUZ°|ãŒbg) æ4¢¥À EʆTõxçL=Iz0höFµO[‘9'Eæ¡ h™DõgP‡}ÊredÈ|B…RƳG‹Y%×ò¥¤x‹<Š2¯…;ù$‘÷€¡‡¼€vO”Êmè$ ¬ º){0 ¼ÖÃ8!¯ÊQ¿Ò¹h”#°eȃå±sᥬôõJf1¸x„¦‹û.ò›¾ ïý…à("£ÔxÔ‡-.šµ‚Œj‰ï7Xጛy¦)÷5+š óÄÃÈ©£î/þ¶ßª-‚ G£Ú€=u”}ÕÑ"`®`  ‰ÒXF:gk/ ù‡`¿²!Y·4\ªÊGµ|â]5cÍ&¼×)Ë;ÎŽ #fm ޹צœ¯)Ö&±÷¬»³æñ¨ƒôœü“ ƒ°«hõo¯“œ ›Já H 蛋ãüÀÕˆ>¾d‘¹òVFt@ÃóYÛÝ,  ­k›ŠrÞ‰¶÷‹\00°‡VÓEÄÕ=I¨£Ò‡6$Âʳ÷ºÒÝwƒ2+ft¹lÔc4u¯;ƒTþƒ¢Zûë­­Ç…Ÿ‡Ñ[·¥]Œ‚ÇÉ ÇÁãtR¹ÈÊ‚Î!½‚FÔƒ»b4ÍΫû,’í“f·Æ ^Ãâ—è¹,Ðô=Xï¤,»ÏnQ|M'«…Så.÷s±%Û¬ éÝ®fd ærF$kY½mF“ƒ žå¦‡«Ã»ÙæŒTÕî@aîs§Æ£˜ºóìA…¸™rnÎM_1_,%Ž8dqv•/Û0 Ù=t5¾µLr‚ëõZõÿ~OQˆ«?ë” ·…N½X±|WA'e/ÉhªÏñµÈb§=tEÕ M­3!qëÄLÖÌbV Ú&-ý±µ ÉèØÂWÕåËŠœ2“Xˆ)Å´C ‰)\CÜ–Ö¶pIò A¶`_ú$. pqïqòH þ‘ûy6/QŽ¥­ ýÓuÙ*‰N‹3N6¶Là…ëzʪ·¹»G›hÜànÁ¦Ô>ßÀúØ\âLò),iW»ØIK=Ï+ŸØ\º…­” UœcÎoÕ¡/]ÌlMÕwÂ[s‹ÙÜþgÐY+“ŸT»Ç^îîhc&úÁ¶9µÜrK áDr¼ånt| Àúõýéà¸ö~þ&‘¿ÞXZš‘¥ÁwòZR¹PzÀ¦±4ôµO͸il+5GÅf×Õ -Pá#[øßúâ2±®<œ/xË#œÐñæ¢VÃdô¬BÿLÓGŒÌÏ¢Üû¸Š<ü^“8Ãe›ÄxkN¥®¦]Á·|qó8>G2{ÿø¦5‰j¬4^©KhŽÇwü©‚–UÙðRÐì*UŸ0 œ£›j¡£°Š'e‡€sjŠqT‘ûìhFïÆ9µÈ;¤ rxdfÝG6a_‚z¦Gë{2I¯àèvw–¬AÞ”¬wKböwÍì±ÒUy œ+0’¦òˆƒÃ½×»£XpF¯0XŠaG‡äèº ,­>tM+bóîšL#_Þa&°‹f²õ‹ë¾{üðáÓU% endstream endobj 2342 0 obj << /Length 1184 /Filter /FlateDecode >> stream xÚÕVKoÜ6¾ï¯’Cµ@D“¢žzH“¸@(¼)Z$9Ð×V¡•¶"×qþ}g8ÔZÚÈ[»§ö"Î g†óø8nü´úq³º¸Ìâ degÁfΙL² ‚e² 6uð1¼\2ìÛúÍ­ênôúóæç‹K™O¬d™±‚Kðéô—¨´âþ˜‹Ë„O´£Q=ŠsJ2z«­jZ33|p0;NA$ &‹bß°Žâ, í­&b§UÇîÖiªíÛÞŽb{ÛY„õ÷ë(<|w¯*¿¹Wƒí}mmÓÝo©Ö`õ•pœ‚cÏéݾšj-BÕ¶^¶'"ìA¶CAÖÊ*£·˜$$A‘Ë4¥$,•ðØkÙW[ª®&ñ5=Ùw¸Šð®1Õ’¬éÌÞ%¥+Û(niu%A ¬[GYÊÃ+Jm¦CrPIVlÿ‰KI2ª †eqêýR1l&I­;¬“mÀE¢ JE¸ÕÊâð»X‰8eyœî£NðØzŠ©“’>À ‡Gý'Ô}Õ:Ëð·55;‰Ó§ç‘ð´PF=MÚfšËÕèàÉcSàü“_€£G Ýú/àôêÍæ1¨Ê’©8Õ´d —Ï‚júï šýO š>ªßLmx—ÿV¯ç endstream endobj 2355 0 obj << /Length 797 /Filter /FlateDecode >> stream xÚÅVKoœ0¾ï¯@É¡ có:ô>¶jåÐl{iz`ÁìnxvÕþûúŶ$ñF­rÁ#{<žoæ›gã·śÕâr‰'YÆÎªr`„c'Ä(sV¥óÍ…ö¾¯>].ãp¤Šâ@Œ…!¥´ôRäÒº|»ÍÛ ‘ú‹À_“™Ä¢Þ¡®<1ÎÐPvJ¦k8vgìLËÍ]\ŒÚp Ë· è0• ÕÛ{ÙE|躥ÜÂ.£Æ-¶%Uò|q¯ìí]„“ñ`ïæWùg ‚AÍë´Ò«4¤%É`­Ü"5m7»v£÷ªà5(øL·Ã—u;<™‡ò´ö[ýˆñÖ´˜±#ª!H¡Ò˜°êÒ ’,Ò¿n­ÑÈåþOù!]>–»»!Ò‘¶0;E^¼ÎÕ›§ffhÖoTkA Ö9« ¶ !ݺé¡5Fbôri€÷Œ6Æì}<å ­yÓλ!âÛ!Œœí9Ó¡”#TÝßPŸfÁaœÆ‚Ãè³`HÕ # $c –ÏÇ» õu sI„u¨†||:ÿjxZ»U£v hϵ :ÂÆ™N¤nn ¼_-þ®- endstream endobj 2363 0 obj << /Length 1572 /Filter /FlateDecode >> stream xÚµXYÛ6~ß_al"1—©«E’4.R¤I‘¸}éV¢mµ²äêH²ýõá²äh]/Ðbå¡™ápŽo†æ‹í‚/~¸z±¾ºY…þ"aI臋õfáq΄ ‘ç±P$‹u¾øÍY¹±pê2¹K«­r_ÿx³шK$!‹¹™šÞã]qsŒoVRޏ–"Š5ÛÒ—,Bb>´ªÏë¬î«Žõ­š:96 Yû‹¥ç³$ðˆýgÍî.ýØA.Œ¬|ßéjÓ<7îÒsì&~ªI·ÊP¨/‡FµmQW´þä“–½jiýy§Ì—,-³¾L»¢ÚÒFYoW(î%;¹ÁÔÃæó€®p—^tmcìõN¹K!±éÙç¢ÛáL: ýô‰•u´ƒVÐ4»"Cýv´uÓØö-­ÓF}Vï}§òÇ_£ª›=Û«nWç—ßæ-0¥eñ7XŽªhÚ¡9mlêÆ~I ͦ¯2Ë!V•ÊõœÑŽv”ŽÛ‰Þ¾ŒY‡·eÝÍD·/˜)aˆ c¡[îó‘žd^Xâ<íÒ‰`¦Ä$‚$ï¬uEì³8öŒy¥Ñ#W!Þå¦} :Ї{4ièdeÚ¶4Õ GN¶3á¬èË’ß»LæKó-؃{ÎaƒNÁ±¾s—Aèü¡cOolÆgθ#æÌó9ìîËz΋‚ÈRA0 ‰G`$°‘``°äiVöm§š®Qê)¨pгã qI7ÔtVÐ éKC“”†Ê¢Fä䆤¨Fž¶ž‹„‡ m£h« Ö¶B¤@ŹQ9˜W"­Qõd²q5ü±xÑ Çiúþ«ˆI<Ø6öyÑ€Ü$t BÏL,Ä¢å´P±³à0b F§£R&ûš¾:¿~àÎáâ׿<~Ÿ»KÜY]å8QØ·BÍŽQD&ª‘FûOï’Ƶu^„ïÀ»™KáD°À øö—7oÊá!ÑŸÑX°ô©iYÒNÝí”U@•åH)µ¾'˜ Ä4&šú!&Ž/)³`Ô™ØÌ CðPfy"bü˜3g2 (G™¥…ž„$n¡éZšb,S½ÔÅeæl€ÄD Q5­Ó.B²8LŽ¥´%‰œh®Ö†àNÈ£« •)&ZmS^—òXãÆ)o Ìc«Ý¶©û»»¿<žß+ÍãbzØØÀiA(]Ó*¥!/n¹ªQCGƒ”_#:Š2ˆÓCSh'"úyÓF6 ¶kÜÌ0L·<à­2R_Òý¡4‹¢º™"ÎB>Dت¨òŸÒæOÕ´çìHA å28_.}î3ŸÀMÛßµªc:ú.÷ÑÍ9+°EÔdfW  1«…u€€Ê@'`!ÀŒÑH$¨ű¡W0wIÊ{û©TÐmêbŠÂÍY›9ϘÐ3§c@›ô¤^¨³ýÊá?’ÿÛ}aÂdNÝÖL‘[Ï|d‹}{¼òĤ±ƒ¶Å‚Få}6Ãy ,˲ŒÂÒYÚÎëÊ ˜¼_ˆi ,’™Ù´G â˜`ÐpjjzžC8ÚÂÇ7M$ÝTàcͼ¶¾W]Z”í¯½i½Œ±Ú1é#½†’%ÂÄéôû&ºûÖ³b®„ð:\_±ºëJj« MihF†¦£èpûLB“I•C=‡×éŒYöˆÅ™šJiT×7VC½[AÕLsªcžÇYÂãiæbÙ–ôú¢ Å£¤xj’·¥ºÑ 1ßµÙ4a]öûŠæEKc•î•¡»¦+l?’Ö×i¤óÛ’ÏE«°qŽ4ðÏ« Œ[NÑgtçÉÓ3«u¼7/0£’«„‡~¤Wò5› 9Œ™q¸ýê&¡~?*àB›b¨è¸Sú}Æ6 èvÉñ4|ÆÂy^¶õ%¿pœÆü `þÛy¯¥çÓköè„…r8šÃÑæ7œ'O eäØM iÿfð'ÄfŸ¬X+®wûìc ¯ñòÚbö)íjøQ9Ž ÏèÛêéÅw4xcY`›(øªÊQØXϯJ†_­¯þˆ:½ endstream endobj 2371 0 obj << /Length 838 /Filter /FlateDecode >> stream xÚÍVKOÛ@¾çW¬Â¡¶T/û¶}è!*¤’À…¢jI–dÇÁvJù÷{·‰„$ ½d×»3³3ß|3‚ƈ ãÎ×Agÿˆ‡(Ʊb n%s¡PH)VAýÎ÷…½ÕµŽDˆf$”`%(R2ŠЅ“½¢ÐO-ß .ÙRd8Žh#.?à2òô´ZCϨ²›{ãKê Èm^}e©Ôöp<ùe¦vÛ7óZB—Vb©k6£$–„¿%‹ÙWEC¬”°¡˜b˜Ofå$›¶YÓæF„aEMd8·Èpáõ|ê~?Úg‘÷do³?Ê»7C'~›×UŠv„|zÔ¥ (]®êýj%¸ òŒI©ÐzvQ7†´b›4ë!ÖéþA$©’5,?ƒ3„xc8£Õ`'`ÇŽb{{V¢Ïíššò.Ùým–ÛÍ0ÑEáj*nqO`.¸÷ÉÛtQ4ÉépZ7ÄbA[ìTÄNàN,å ñjKújûÅ.gß¾­ƒñRfzùxžB9pæ•ÅÖ ½ëÝJ·è*@jÑžzÓu6¶•Ûè8퀂ó‘K-ÄùŠ]¤Piýö¬J:”GEô‘%z™9·Ê;“ÛmM?½Q±»‹Ì¾ª7t·mNR]z36å¦dÆÂ>ØLè¥+O'sóªâ”ÏM9ϧÅJ)žmÛæxqø[§³Ä»WƪŽèÜ ¡³º|t©«JèÎnÒáÏ"ÕIÒmV=L˜XÆÏUN«Z–ž-¨îùYoa~ó(àD`BÙ¿˜,ª(ï2Õwœœ')¾êÈõ× ú|ˆ,“aÇ`rÉÞvØÕpØíßHÞm½ïlid|Ňé"éöé"aºÀ¿–ÕñR÷6^ÒldZÅ0¬ënœg7]'ÒÍuQš|ñ9K²2yjÜ>Öųe>È€ôÎS=Û„!ð¶c(°`ôÂ𠼜“yzIwãáZIA—ù™ œ endstream endobj 2274 0 obj << /Type /ObjStm /N 100 /First 975 /Length 1810 /Filter /FlateDecode >> stream xÚÝY[o[7 ~÷¯Ðcû¢#‘Ôm ¤Í²X‹.ɆmAÜä4ËšÙãí¿ßG9'¶—cçä¥Ax$J¤È)%oœ!ŠÉHÄÿ”Œ "ÊÑx—œÊ:RŒ$6”È_0 1(áMô^ 21¤6ɱñÄ$sŠ&•Ê+&‹òb$g•”³)³©`¼'V ‚)¨ŒâŒç:[<¶‡Í ʪ-ÖûÀ¤³z“Ž1>¥:†ýŠ×ÓL¸z¾‰'!vP‚½*Pp:ޤŸ.!0 æHNùÀ’ +¾*U þDW8Ã$:0çºi0B J™ â(A© ªxÈðd81¶gâ,¢ÖÆ.ETÂlÉu–8† \\UžÄ,¤T•T,N/äë8“"C'ª-(xZbì"³ÓcLDWÀ†8·ò1vޱŽaçäUö BÃÎ9Ö]°¶TMpj†_ƒ÷4Ày5lª+ç ìVJU ¬.a8'Hµ#ô ’ë‚l! ¡Ú6(æHW`ƒS]±¤ˆd=TtqÀ~…ëö+YUë¢c7svô¬*‡l°Ê€ŽöÓYW:IQ•J•Š;Fì%ª€† W|"0œ¥TÖª+ŠIæ×ˆH!Ó`kkÐì˜#„sFTï›æ?ÿ‚Ϊ}áB±xt}qq|;þjŽ" ™ CÐp‚Õ`dš1nFcìv4KcªÏ#±•aÐ\šÖï_ÎG_ÍÛñä´ÔÍÝqós³×¼;òõCõ9ÁI}6²ú4ÛðJ,V4ÏùbáðmWc˜æ§ñáØÀ¯ö?ìád8ºúÜNv†Óák5Î6ÕW)Ýûª”êªDbLùÀU Ì·Ž0!ý…¸)Ú„,Ô;¤b Ü[$[Ñnܸ©l.¹XMö/ÁíƒXÍ +éAì<ˆª‡é…³HÇ’æBìäÔ1vf?ˆ:»êñþfÜ×è·ÈGõM e Fë‰d%¯N¿^·“o+5é€%qH¾ö¢ }@Húh0ÈK_“Ú]娥ÜxÀ|Wnp²9¥ŽÜ8VÈåq×°v«ÙwsÉä—äÚ²^®?:¹5|0ÏüdÉ·”›‘ÁÄË‹p“vnœ¾{nÄ­”®Ül¦Mú¼%öã¦oþ-ecP3/‚šýæ fZÔóÌwÁ/d%¾Ô3ÓævÊKìŸa§ÔcUù íÍ—˜½@Dhñèâº]ß!]ü™g~:ï-ã¸Øá‚—áoÑ÷ÎÍ(v™;rKŠ6ÅØßÓ‹ä½AxsPYÔóÌ÷%[.ñ¹Ï‚½'¾¸ä‚ˆ~=CÍw˜á¶Ÿ ·ýdt}>ËPŽ`1!“Ž(T) «t¸WV¿¾½>¿8}wq}5m'‡“¶í¯Ó ˆr÷Gðb³–VämÒg}/e¥F»ç£Ó÷ÃÉ—vÒcÛƒ;WûƒÇFô`œ³Í bÍ©k+Sá×¹óã’;_` ýݸ7þ,åŽÌTðßuUÍêu‡]ZÒlIJy~Jë4iY³‘´œ}!nÎV‚ïÊMˆl_:r‡¬þÛ‘í2IWn&D©#7gäD]¹õG%¿1÷Ö` endstream endobj 2389 0 obj << /Length 848 /Filter /FlateDecode >> stream xÚÍVKsÓ0¾çWxÒö Võô£ ‡2¥04¡ÚÜXqÌ$vj;“áß³z$µÝ¤¤¹Àä YZ­v¿ýöS°“9ع|N/êÄ(hàŒ§Á18!!(`±3N[÷J6Ÿ Fn#³*iò²¸HšÄ»9½daë4‹a¾õ9‚Ce4ÀöºÓKÎ[Ö> #mîÓÙÓe‹$“wXàòá—œ4o=_`ì.ÊTšÙ{3L”É0«Ê‡¡5VIÝÈjû¹œ—Íüwkw=„3Ä~#„Ô— Âó)C111œœ‹³WËfV¦f>-+{ý<©kB·!$‰l@xcL:™sG[ƒ›¼ÎW‹ºÃ‹Q$^ôä#®0„‚ÅBüC !2܉,‚ S€‚š Î«lµ…ǨÛÔ^ôÇ^ŽÊÅ(d¶:&£³:< ˜np;/<Ÿ1ç æÀÝq¸ ©= .l hà¾ñS©ºe ×FÜmJ3mˆ+=â6+=-ìöLšI®*öÎó9ŽÝzV®æ©YO&¹l̼,¬q9U£pï0Ūz0ª’@ê%¨¡º¢Q×éËzû¦¨fÑÒ¿ÍEq…˜q¥sQ¶¯F ØñŠ2Y~(©ÍýKÕa5…³hªbn6JÝžçÒzcn"k“q$5Ì=Ÿ×å2ÂEN¥>Íôú¯ÔÉä7Mг³MvüDû$[¹åüƒÜNƒÛ{줰 EA,Žœµ6]8 r¥­sg4ø¾·y´¦wƒ$œ8œ"hiú3=oU*´-YpБ›ƒ O7Ó<ƒ‰öföÒÏÝCP\„¯ÉØd†w¼V,¤ˆ†¡ îBÖ“*_ê@v¶GÂ~ Mn@«¼ûäú¥Û‡ïe±ûQ÷ë~¤Ø=¯Ó3QÏŸöQ‘,¤]®¡Çÿ{m6 s¤> Ç6>Dà+N ÷WuÆD1}*h4Óš(éV“&>è˜ÅqoŠ*ÐáHýœåEÈ™ OÖ!äÅ^¾v1Õ ýÌds¨VÞxðj$ó•<¦®%> stream xÚ¥WÝoÛ6÷_!ôIfVÔ· ô!ëšbEl¶³=tÅÀH”£B–¿½Œ¼‘¨&ÌS¸H }’ÝJª2ïE… ׼ñq³øwÁaëZüx}û,ñb+Û-¾|u­˜Ÿ-`¥‰õ EwVÄûÊZ/þ8Þ÷tÕ6ÁØî²(àVFÌΫêQáä¬ÇÒ„F}UÖW¢“Î̵÷NÈm鄞-ZÕÔDl5‘®VDj Z ‰<ÑõF©±]7±KsCw'‰£2-_I–‹Nh=çá ƃðø&wÆÕHº±Oÿ"UÖ–û®ëÆ0=Â5 —ÄZò”æôæ®D}ß.ú:Ó—ÀW`gZ¥Ñ/•u­¨UÑ´»wï¶²û§Ðcf5—ø†—°$2Ü(±•³Ê=WvSeGñ·ºx£öAг4 I¬¹ý&³î'Ív§¬B¢k¥š2#b ¥ÄÁY†®k¿§åúæêjöž~W²çâoV×of峪Ü3€`8éþVî+‘Iv/ª~zäòâjýqöL-X»›ÈnV7ó¢÷²½m”|&¬e—cH 47?ÅÓí¶ßÉÚñ=»S¯züO{騇Oò~Èqiï iAA¬dߊŽöÍ-Ù3÷L^^š‹–h?öIG»I—¤iÁÊvG­kRpD8;_êV'ãz‰±ó‚pTYñëáN"&¸í†m¤SIu39C»FGG.+úV]ÓÊ<àEP—$ÖÄ€¼£ÓôtL°ZaÀLÏ{Ü b¶Í:Шƒ<ÒÃ#®£¯¿ÁÃ1-·ïi¹t8ç6ö|F„¿æ„ÑX\7+ô)6}ýÙÔÕa~º Ñ£øD§jCŸv/L4,º‘œF0&uÛÒ>¹C Ù™ÉÊŒŠguáaL99J cÎëu>juaÖ BÔT8•û¨*£p‹Ò oÁxÊ-”£¹é' Hçñô§“ŸŸ1ŒSÏJ;FM^Ï4[9tYÝyê<ºí€Ð¸‚ιxhç0‰ åqêìÒü(;57“üh\K,®•j^˜áÇ«ÝZÃvõ£Ùò¯ãÕÉþýewÎ endstream endobj 2411 0 obj << /Length 1112 /Filter /FlateDecode >> stream xÚÅW[oÛ6~÷¯ÜË@ň"%QÙöàeI"ëÐØíK[ ´DÇtqtY¶¿Ã‹m)–§Rˆ(úœÃsùÎÇ#׺·\ëÝè×Åèâ&ð¬EX‹•…]X!Æ( ‘µH¬/ö;Ñ,ÒºnÅU9u-ßÌnç×'’ó#²ó9­Ó6ÿŒ_*ÖHÍ =ùmÚ¶eç§:æ™èåpœ•pÝÅã2¸Çim[•c“{½ÂjJ´åÑ—D×ß`‹ühP›²y¯ÝÓ‡ùðéööÓÏ1鬺osQL‰g7§‡Åg˜ÔÌHýÛ®w„$n7óÌ }”Kð9°”û©2ÚÔÇc=lœyž †pT½‘p°-¦p©ê˨)WÍZTz©à£†÷¤~©‡†{Îv²0CšÄ<¬§p-‚>xWkïÒ¢nOŒ‹+ýŒMPU™¾ÜA £ó“(ñåÙ+7º‘ˆÊ˜ÜÛ¶ÖBïÅO>zôîRºûïOð˜Ë—µjc`U•ùåÔ ±'j…‰D6¥öä«KhÒÆ)Ï&ƒ|1Y§ÀJR\æf’•Òþcg ü>lDæ©ÁÓD);ià³ (Æ£»W1‰4X”º8u …âYZÜŸ,fa0Ó­‚¢Ë³‹pUfm^Ô}È4I,멊èÔw§*å£ü@C«ŠçFj ÷„Ù[DT#¦Ës!•¡4³¬.0ü!fU÷Övy÷,ÌE[ñæÅ"——Cx’`þRÔ endstream endobj 2428 0 obj << /Length 1016 /Filter /FlateDecode >> stream xÚ•VMoÜ6½ï¯ œ•KE}í¡E9­³îÅõ‘¨]ZÉчÿû9”,®eg &—ËÎ{óø¸Ù‘€\nþÜn>|b)Éý< ²­ ŸE I)õ–“mInJ÷vûùç$\le4€- éM—bغs:Þô•èþêD)‹A¶M¯b79òb»ù¾¡0 OKÒÀO!yqØÜܤ„/?ø*ÏȃÞz ”Fê´š|Ýü=ç;5¤(ZBRuF”$qè‡4ªö'•ÜØJúyF‰§Æ8œÓ¸‹3gØ 5I»Î©#Ô?•'¸G–¢äð¨OYç!L}šäoáñ+-Œ³D÷GúQôE'ïJ äX[ñBê3F1üzµÜ0s]/ÌR§M™úè[\¼—µÙq7Ö5ÎÚqÀ‰&IM Œ:Ü¥ÎA`‚¶:ÚQÔ¼ïqú ‡½õmæøyPÕŒsØÜCßõ¢0w¶{©» à<`,c« gìE5Ö8—Žn¨Šýå^e¸ÖCƒµô-I塟e³ò‡CÑð3ÆœßÕ9Û«ë Ì`L#?ÌÓ)…œº~Fº™¦W—Ïõì³x œDü‘üH½Öy TÎQ¼)Þƒ‚Ê|ÀÕJ5î¹újIÇá^mÅÐvš_ _ÕÛ4cÏ x1€Í´îD‰+ºÇ¾¡w©`OÉA™QïuÏwbU·Ïulsu¤ãõkÿokƒÓÌFÒ~ûÀž[ZJ ‹Øì8T³Õpö$…þì|M}ÝvH {aoÑv¯d=ˆÎгŒ‘ü•‚ =…Ó?ºÝxËBgè_åö'œ"C¯‰/MÀ9ÃI|_ÅØñÕÑ~D‰³’À:Ò3<šû4ˆ–ôŸ|ì~æÐêHš*“ñ6µ¾oëR6»5ý ൗâ•jÙ¢ñ§s¤erJ±àz|Ø+OÕL]Pûö±…Gág­­ç¼3©{¸Ôp9ßÚK§'C¼ÃØ™jή€%w(Ïp¥{A¸Íl!Ô›¢áƒ‰´-M€pZ‹¾Ÿàów {iÖî]¯G±vIòá-/Ê?nþðÖ‡QNDc-hªÚA­›Íö½ÄWP}j@¾ý«÷Úü$¹øÁwµèO·Ë ’%Ñ\=üz`ÆKÞ½CÃù2™V76¿jçQ1)€ñä/=ƒ*â7ÇåC¥ü–7žíÔóºt6³znN•rGk¬‰N4…x¯ŸÉí´w.Šù>ŠîñæÆ2äÛ[»¤g¿”çýÜ_–vŽ—9—çÂ@9°l±{Ñ”*`Iò÷¬að³ñtmõ endstream endobj 2437 0 obj << /Length 1095 /Filter /FlateDecode >> stream xÚµVKoÛ8¾ûW=I@Å’õ*ÐC6mEÛm½´=Ð2íh+‹^IŽ›¿Ã‡dIQÛ…"Í™á7o†ØÙ:ع^ü±\¼ºŠ¨“¢4¢‘³Ü8c°È‰ AQ:˵óͽ®øþÖÏ ^×ÞåûWWAÜS Ò%8ƒZ˜¢„ØÞñn¹øgA`‰Ò™âQ0Ÿíß~`g ‡ï8Jç¨Ew1Sf çëâÏÎÞø«}`¬ïÁ(bĉÂOúЩƒÿá@—¢4!­3Ë[áùA˜€ºL¨mì^vv¦ÝcÂ49Ç=ãžHED"ÐdÐ[QgU¾orYÜ8¹3È IŸ$( ­ú•—®¬À‰ pw²fµ Ï‹ú¥Ùí Ák{R ½`nsÛÊJϧ‰›vÂ#néÑØm¸Æ£óüPâT[§]~¹'Š’±$lƒýU*Þ|Zý-²f”£A`|ÄZϧHŸÕVÁ½‹¢–“±™…i±>¨×¯«¢É*)A‰ÿß"1C³¶Èåa)«JüA‰<]é—r·?4*„Ql“ ‹LU=ØSŸÖ¦>õMÜмh B]Q›WZAþVz-vµº7ß­‘8ìk³?z>qóæV!H>Ä% mfy)PeˆhÝñ*ç€öQ²„"œÄ¿‡,¤ˆ…Ác`0Ž3¥#UÖË™¦›Ž/l„Š­Ž+ìV•üéù„•.Âîh©·R›{s²­lláÿ£Š«^"©ïTܽóÂÈ=EsL5_³,2ðoj¾°k‡'y5.Õï8Ä:ùJ%€Ôì{9YuÍÁåc÷ù|¼ùða(j¡×…l’/ꌭyÃ_L‡*{Æ´ÔÑFs°X…]^¢LE='eË6—=ÉhRr-Ñ~ìäòËÍ;-ë÷kCA'Ofݾ¨¶ÐîK/ nS?™ýg².§šû€/q]‰G‚©W¹"wj:ô¯ô­Æ&!i¿Lf_{â=25ÒÆCQŒˆ«ŠÇ2µR-LîÎÆ¦ër~Dt‚NÔ¤…¯mÖê~B­¶ µúÔJÒ6ó·øµ‡¾R뎣× >‡‘Þ˜…ѨÀ!-®ø™ÉC©.hÔKÑH{¯—±zTLTä‰am©Í Mr"àìÈü¥Þ6ª“­ 1n|ÇÛ|ÇA0Pb½rÌËö(·ª¦åÛ®å½èt%¡!N¾2ë”~Dü2“Cý«¨~—s;†í> stream xÚµVKSÛ0¾çWh8É3µ‘,?=-¦eZ½P†qŸÇ©<þ}WÇ2qh í%ëHÚ•öӷߊ t2:öYˆb'Üçˆâ0/@!¥NÀb4ž¡kL©kÝŒÏö×XÊ\æxn ä¢OI™KËðÓ©45OˤÎ` |GDo¹ì#ˆÝF±Ý™ŠõÝŠœ,ÞsíBô3qH(çËfŒáKÞÀöâÛÃÅIJ}ÿäÓZM>dõšªï¸šeÉêÀr ª‹’ÏÔw¦Çr^'sžÔMÉ+y¶ãѯ…cD×à4rh¢i>º¾!h“g¦â=È¥9òßÐcð½@—£o9ó†<ÏL—'ð(òãØ |Wå|RÍê¨Ëà뢨ŸÁø½ ®G´½»Ãâq%áNêX¶‡xÙäé_öc_}9­`%U£ò6à´pp‰}_‹?®ÔîU¥6÷#\ª ØIÅî=—½njµ7è wÕ÷XͲ¾½8?¸…¹=éc›G×ø¿„­†ä L›œ/-æâºzã?`«°z&=ކh€Ûj@§—Lée€ô¶´u›†PRžy;o{ËeÓP|¸ã¥&ùZ™õ¥¨?òÒ²eÚêò¼PŽÉr¶¡ã•.£ÖW+úÎ òeçÌΓœ›‚éꌄ´‹&×jši+Z‹³î-r} Ì®];0`†Œ$Á_Õwߘ¾ ük“6DL_£9<7ü5[ª™·P¨ŽÚØÝxá*õÙeö¼¼bO%d–ØÛ^Úù‚ÃA×ÌRÛ§i«ëL*p„ûjß±IN0¯K¦;Ãd]šíÛÛC°ÿ÷AÃØñ¨o>òà·íq÷Ò+C;«>.BˆÞžÊÂ(tÄátH—ÿ¦»SF;ÑúËîn¼}ÕžB:Kчqj-dù8ýÞ7 endstream endobj 2461 0 obj << /Length 993 /Filter /FlateDecode >> stream xÚµWßoÛ6~Ï_!ôIjF%Y~ØCÖ5[·®}膶h™‹$$ÕÆûë{ü![RäTÞVòŽ÷ݧãÇKà^àý|õãêêú6¼%Z¦Qê­¶^Ç©·C”⥷ʽOþ/DT¼žE™xgE Aƒµ?W¿^ßâEç¼LQ`8ßø†!ÖFW y}ëyk>°ˆ­Óƒ$í¹Ḹ ?óæa†p–u‘ê#â?‚$Ð'' y.“ÄZóõßt£^›í`°%X1º±¥D5‚ÊÙ< ÿ;|xxÿ~ÔZnHIQITô^Ùœ(òjÔ±¦_ y³1¬÷\w6Ç_jýL¨‰àêý¦o™ã†ô0 á¯qìjG™¡$Õ:ÿ–­KM²¢ê›(OlS6RMC HÓ?sÔj]òÍ#’ì:$£öyBLQS=¯ð ÍG'P1Q0Î ÝKVòzÔ'¤ó3øZ¯Qxàz}¦bÍeŸ‚ÕýÃÛQc„Yž\<¸”¡•’¾8èë%(‹.܈¢©h=ѯä‹úpNÝ›>¦žŒ-R´Ì¢VÅnjg ?(ó„v±Óûç±R„££þÝHIÉK‘0FQµö| <¦>À›…þa/Î<ŒR”„šJ (ŠOBuA^/¤å}šcŒýœãT‡”3³p’¡ng­¸6Šý â9Ã}üŠ…r:9…wEÍÒôHñs)þ~Áð˜|O÷TԒηv„ƒ,Á¬ó K>ÕvÜ»ñý‰ÑoÎô(Ž…œ³º°Ó»77–ý,êVïe§Q‚=½vÌÍ¢…ßTš5¸bð[‹c—Ú»7r6¨á Ž¢s§ŸÇÉ)ý¦ßRuË… kz¸üðáÿû²¸ûOÆ÷û<3dI¦L踱ÏËñ3ì-¥€ïd«D@«g7lJý™F`2Ì{–´¥¦‘¬-ˆ1hñ-.æÐ¶“Á}d¹Úu‹-ö%ߺ"}¬(©]å9VåÅt¹gº°¼tŽ(Z¡±—‰㜖——ôT“¡Ý ®¨ksu\RVKG×wÂä°eEJw;t-©r¬~a–ýªJ´UÂkz9ͶoúÇß~/¸­E.N鵱ѕX–Žt+AØo¬äã`çÍ)á“Á'‹3ýè·Óv¶ÐúÿNž˜© ¨£iê*xSç#¡óæ¿O¥íxÿS*aæ×î~*°aRñ˜ ÌM*zͤݶÙº7+.0cZÎ k`ªFJ6:Ä®sf?Ì9RÚñíêê+€ ê_ endstream endobj 2471 0 obj << /Length 1115 /Filter /FlateDecode >> stream xÚíVKoã6¾çWÞ•›%êeti·)’`a»»‡4Z¢eµz•’²ëþúEÊ‘¹uŠ¢½ô`ó¡™of8ß ij±fjß_|»¾¸\Øž Àµ\m½Õ°i"›¸š‡1rí@[GÚ£Ž11žÖ?^.\«'j[6"V@­Ð”gEnX¾¾¿m‡šÅœÖ ìî…©Lvã储Ì6mfä8®Äde•¤EŽÂ´©jÆ@GŽ{. |K›a –ê×ÒŸgñÇxÌò3Û&z]¤†-zØÙ\Ll]™JòX®yÑ䑜[)Û‹ôÈ£aH—„áË ¢]‹±ÿ7"z³»r•¹gÆ7EÅÎðR‘àÓŽÕ;& ã|£¯—pš†åéu·,bΪJ e0£1«1#v ¯—Bò§)*…ë)¬-K_cýênu$W5eÙBŸ§ !t~·q^pÉ’ f; Û†*²,)þÑ\¦ ;QÃúóÁ1XkàØ±!Ö·ñPÔoƒWq¯wI%Y²mò°-Ö–<œýÖ$p’ò¤T‚#@M¶š.… ×í›À.²ÝC[ØdßÀ1‚‘çt:% …¯†ãèÀ åD!Ç1ä—‹$¯jš¦ãÉÀ6ŒƒáI­˜Põmý*­ŠÑ#a™Èo£TÓå+çIÕó|.«mOkž|àƒÔϦcŸ“Ò›/4+SVðq¤›úæ’ƒw°$ª¾{gÌÓ4‘Þäs Ê3lBQ^É}à ª4„J}pD®Øü"%¿™ÉqÅhößÑšÎçwÄLD;)7YX…tÒ…}@òH“åÃÕäéiY•iR Œ¾ÈT~ÛÊá½@à«{hRžÐMÊŒÖ TÊ[1V!Mÿ–ñe“¸¾Ѳ0 °?ÈãÕVÜší´ì§Tâg&Ç$—wµZ¦tÏx¥D’z'g4Š Ì$å4cõA¨*Y˜l“P®D¡ŠQUÂüdT„à6*B,ý¶sá®5®Âca-ÅÞ˶¦R>kÓ=ø¨ìuHÐË”lÁ“AÃnTƒëéLJ æ´õPT7ô2gŸûz’qò!ôªÍƒÞeã®y}­Š»_ßvÄý‘ýrÍü%ÊbwI÷+b!îÆ9à ‘ Í@rÄp侈’í¾}ï´¥ÿ’Ûñþ`{¦þIôP7ÐCšË *ši»4Q[> stream xÚµWÛnÛ8}÷WíC$ bEÝUl±p»‹ÂØÍ6ÎS¶(h‰¶Õêâ’rÖýû^¤H¶8‹Bj8<œžŽ]´A.z?y·œ¼žGJqyZ®q]ìŠ Á‘Ÿ¢eŽî­?ÛK¬Û‹-f‹/ÛAFÛ†ÛŸ–^Ïýx€á§N\NP» ¥ÒÄ5‡Î–“oS‘þ¼(öp‡(«&÷Ÿ\”ÃâKi‚þUª À¤8°%ºüÝãÊ© :E\Eaˆ‰›tN=0ð¤w¢ß G›Á²„tÞ¨m¶ã‡‰µ°Cb5ò_f‡žÕw0pB¼ç8¨qÏÜNä¦8Š"mÑ5/vmÑÔ#?ýÝICà34qxÏZpÇ÷­oû"“÷üU~VQ¯^Q«Ö×¼©ôŒêA@ìZÆweÓê-+¹ý»^Ü8Ëz£¥0±TaϨ[MQKÍVh:œv¤Å>8‹ïݰ³®žº>æÁ‘ëC üㆮôä•í„®;ö^ ÞêáϻŨУµåÇ»™YË)ÿŠÛ-«ØHc>]Üv*c8“<é°É¿)ßì+VÛ¾g"ôVW5æúˆqT÷:ªOõm6r›§?Î ŒNt „Cby±óòÓ%í¼Àj³i)¿|lKלʸªE®Å΋ƒ‘­õÈ-§zyÌeXk=®û X^ˆ]I5‡%Csƒ§Œ³ÈÏ44Y·Qù¹Qܹ8×Ãt™äÙ9Ó’ƒcR³Îõ4‰å@µ¦9“u[\n¦áË€Æ{cÊoíEŸ÷TÛ+ñ´@þþlƒ i.·df iK%g X mˆº¯ÔCÆ:%!˜ (èsà'ˆoP7ýxšeAŠ=°Ã[ÒïÍþ$IF îÁcà‘t\Ön™´#ñ­i)šdù%ÖåüsÎã ûAº^í‹2¿tW­nŽKÓÇÌm÷œÝœ©'OÖÂÙV»’‰Ëë`QЇF~zëåKSÔ%cå„ïë7}²»ô˃–ÊâÅnUeŸEEËòEW¼{ÝaUh¿9z4±‘Íê ËÚÑ›ðy‚˜þø™Ò,}ûX”_ééÉ«mTæ¬Í¶×ÆÎŠ!Do…z :W¤†z¢à# WŽcv”¿2¯Ø0Ø’¾Ü1ž±ºÅU¡ë.ôq Ð¥h2P}°?qC2yPžI2¾ÚYK‡7Üí<ß§h^ã þµ(‰œtMÈò¯kVíÏèA¥~Ù݉ “ðCMƒŽ” &‡\¯+2À(y¬•Ö\5¯•–gòƒÁ C©EW[*¶P¿¯žU¡«~JKK|ùƒãç´´S!Šá¿Ó¬†›¢ëe»”QÕónµ8c=ÿi]7-mÍÓ7ûUÉZÏšÑùq7 endstream endobj 2385 0 obj << /Type /ObjStm /N 100 /First 971 /Length 1766 /Filter /FlateDecode >> stream xÚÍYÛn7}×Wð1y(—Ã!‡¤ápä4h`»@[7{“¸q$C ùûž¡/‘­U°²e4–F»‡œápg†öœqÆs&D¿½)^¿Ùg‚!üy–‚ ͆cň ‰ ¹Œx}RœI#d±>ñ&EŒ,b²‹ú€MޤB0¹$¢)¡ŽSrÕ™0)CipÎE5¬dC>Å´EC²¾õ„ +,º¢`wŒQ%.ŽT I% AEb]R)²Ž Ì’ ð³;òº4è¦TßÂDïJ˜À‹@­úEŸR)ªMt©††X¨î¢?Õì+† «bØÉ¤Þ Ø&ug`2ŒO¨Àœì³z…á#fµ ^eÝsL‚èžAŠÕÝoEÔÙ³ºÐÁ쌾E<`CT·‡£ª(nS‚ƒTJ„}g8æër°½Ák…ÀÖ¨þ ¥ª? T+Ƈˆ·ÐЉÅg¨*%¾ð%â ú½ ¢ËÁÚC&Õˆ 9ªþÅÕPQ‚:  ž1Ñ…:@ å¤ ë3x7z®’‰,uºlb¬ÓÁ1Qª Ä\LN-†cb ºFDyLEט0KÖ@†Ý!(Ð!ÙÕgÉ᪋®^Q…ê„BU½‚‰Õ+`žDѱ‹”ŠÃ|9¨ à))™F»»£æ¹9òœ”Ñû¦ùó¯¿áHgY‰-b3”ŽggïFOžü蘭û¢‰mÂÖÞ@¿˜Œçfw×4/8á á‹a/°=»sñ#èé¯Þà`ºÂ!R3Âóò˜Å—@Lß¼NŽº¹92ÍÛç/LsØ}›k͇ßÎ;¼h?v£æ¬èÆó™žWEÇšýn6YL»ÙÅVŸ½éNNÛ§“¯æH—' N*þµSŒÖSÃ_÷Æã f;º8XÕž[j+`Ô,ÞÏëïßNÇŸGÍÓÉô¤›ÖÉÝ»æUóºyvDõ‡ÚsŒ•%«ËŊƬ϶àhlΰ½êÌÓ¼œN 6ãÑþ‡±=èÓvþûû1ÉÎÎËnþú ÖýX½´¼kˆéë]ÃŒºiÉÁ„Õ-^_m±ødi0:úhNÑahœEÖñàÁ\ëq°D³ƒ×‚}JVp4CS[üZŽÜ Å ÂÜäÈnsd‰>wåHp´Ê‘RîΑ’€#äÀ œæ¨x, *ØáµùØÍíþâÌN»ÙéÉ¢=›Ýæ†V/ƒ¹q|Í¬ë „m =¢‘äl‚‡†¡QçØ†ZB…àüÁè»…*%Ü9Ài5Àµ àÁÓí×ôœÄ-Rr¶ÉiI-6¥8< žÎf‹îÙ OÇí¼[ zÚ$è©/0K´‚rl:f²’óà•+?I[D¢QÛ¡þóâ­ï«ÇzÑŠ·í”k–ÊÏVrÏ«Tôrw*zÞ&ш¡ðÒ¦ÂjßÈÉ9' a#Ö×c‡Óv<ûÐMŸ·óv…t>m@ºeð÷ÜúDèAбd{I׋FÖu2Ôn4üyo Ú‡vb(ûD,?]¢á´ÝïÝ¡ÚS{þ­†¹¶…hK° *6ôhyŽ÷’¥œå8ßJþSÒ¡ÜPÙŒ; H˜üÐü7mÏ?Ùý“vöÉŸµ³ÕäDz—Áß™mèëA¶FáP¢cfÌ=ìÉF’A 6¸¡fhu¢õî¢$¾oï´uއž 6Ì`Ëk›ä‡6)ÊzѨÿõã!Ð1’-ÙE;dÕ^†ô¡Yó E{í‰rˆ&äùØwM¶ 4޳t‡Dµ¾(ÛF&=Q¼GGtiw½’Ýb¢òä¬ÄhX ½Þõp=‚!%›cZ›öf³ö[Ü^ŠòHŒä½a¸’·EoéQ¡;^_žœ~鯳Óɸ=ûÇ7íNÇsü\IN²Ig&uf}èP¿y{½Â1õ¢Ü#å*åGØ·ãΡï;Π-R©^€èBPgKòî:†j5{»»UA³W··9hþØ­>Íç糦9F‹`§¿œO'Z¯ØÉôcsÞ†;~ýÔN¿LÆßo¹ž'­Çö\_*ƒC1­çÌ¥;;¯.„7í|zúu%RÓ&‘Ú÷ƒX¼ ½¥N/Œ§ÞÔ‡…Vï[×£átÉ÷ì"nÞÇâÀgá-þ#ä¸ÊÌRx…!)_2$•K!»+®¿Õv)0µ!ŒzzÇh±ñ½>"ÏÚo“Åö Ž0‡¹^˜xý—¬ á 0ÐŒÿ/ƒV\ endstream endobj 2500 0 obj << /Length 1507 /Filter /FlateDecode >> stream xÚ¥XKsã6 ¾çWxÒCäéJуzufÛféìl;­·—n´EËjdÉ¥$Û__€ mÑÑ:Îôd‘Aàô?+gþìýÅ‹‹ëwQ:˽< “Ùb= |ß‹X2KƒÀK¢|¶(f:AÌÿZü|ý. G¢Qœy,c H }Xür#¶ó0s†G”¾ðõ!×ï˜?Úæš}n˜ÂdD»?K^ kÛ·~AœÍÜ ó²8›1<~ñcõ)Ñd/c’i—‹UÿJ-ûö—’»±ï;¯éç4^NÊîZYõÕ½ðþxÓWµ°öù^žOn«šª·$?}þøÑ–LH²‘=ïzi C€&µÞ­‡fe¾ªyǧMo$ßîjqžj)Da ²pRî^tËVÚ(,~ûüVɺã8hÿ FËfÆÈF!ɽéÊa+šy:€Æ)’'ïQPtS%ãaS5V,V¢†3kT’VWm#«Bt†?W; ZætêŒ+OgÎP¡ 1ÚÎT…;Ÿ^ãêw6»nAºâÊìÔQaÔ³T†j˜—:«z½è$²ø±9ðP¢?Å#RíOjÀJïlµ›Ç©Nß©² É ±ýž~‚ÕûVgÁjÕD)šÐ†2Ä òò|Ú’×Üg¼¿bX†¼Šc‡×ƒ !Q>îÜ­àÒ WMIctí I·Ë2¼pæòNí½DwüÜOðž¡5ó@:>/õŸÎ?ÛûŸÆ¾ e .¤+HHRÌÐ(Ó0 O qÖ"N”];ì@“ºÒØfÊ\¢fu+TOx¿æX, eòE[’†ö0V&Â/¨,}òÝ®®VÍ—¯`* !¢²¥E9ìtŠwúžI3ˆ—‘s§Ã¯ z°·â¥Ù¿ï;ο_ž&<әɜ}ƒÊ/fnKºq®»v«¥MeÄûVŠžƒ¤ZÈIyÀüÕae¢òjê#^¯I0¼0Ú/ÅIµ\/hSziÕûÈéÇœ®™À)ÈëHéÕ%ýV_×Ô}îWíß´½Yzy2š~ðl?~”UNI+FÐZ ýnè§ZŜѹãvñyžP›jCÓw˜S ¦ý 'Ëž2üt~2æ~üíð;ñ°ÊO›}{£Î;až,uÍwòèv4¿oÿíªÆ+ endstream endobj 2507 0 obj << /Length 1447 /Filter /FlateDecode >> stream xÚ­WÝoÜ6 ¿¿Âh_|@ìXþö°=th²¬(º­¹<µE¡œuw^eëfÙùè_?R”;qš 6%Фøñ#© œ­8¿-~]-ŽOÓÐ)ü" SgµqXøQœ:c~Ϊt>¹g«?Îïj¾_~Y½;>²‘DT¤~D Ïð2–!Ó"°WŸÆÁˆÛؽ0bDBçB,½(Ü7R«‰øýþüÜiqKËFy<6>w<–ûQžÏÙý¤I(&>ËS;¹áõ^ ý„!Ó¯1!ei|gBæGEHº^¿^zI¸TG‹¶o~BÅ ì±À/cuù·X[žŸ=ú‚ýoEÝß|’€ÎaÅéù˦ל4%2oD'«Å? fÂÇîòœ$…Ÿ¹³®Ÿ¾N ‡ ìÏkÃZ;1@!‹1ÁÒ9_üõd$ ˜¦ùÓ˜9Iúi?“”4™ˆ†~‘³Ug\ï:¾$¹«dµU¸ÌÜX&̽×6ïcøI–¾ÄGò%˜)Œ$HüÄâë­Ðë¶Úw•jf±ò RÂómË—aî^kð¥(\NpiðÈìÕÆÒ!ÈNaÀ Œ ØéjÛpy§Š¹ëVi=œ5[):}\ªþÒ,±å]u…úñ¬…”Ú_zi@Je- XK2{£Z‰"·Û¡l»W•¾Ã1†j 6H8-JQ£Ö^v”× EôVh Á妹Œ¤Niñð±Å„à 7IÆóJÓ9ñ…зSF­Ò‚aú17)¿ Ö-tÄ ²èþr#_Í·#û:P¶”Pyi¨ª$Òμ{®î‚ϲ—öQD;q³æ}Å¥´µ(y»V pýòþ0P‡çÅ”¤¦Û¿ƒ†w¤"ŽãQ*€©Òã°Än¯ÅD:Âø‰ûv£‡FDìÐ2õKQgGêÁÞý‹°¨í6þœ€EDÛ½aµªþJº-—è žõÃÂ0u•Äâ‚päA<–#žÚdúvKÒbôx0÷Röm‹ùBÓ̦• P®*qMX2ß©½h:Ö=ÁÞž[꟭@9Ú”½ S“ ìÔB$îÄœw®À”­Ì´Íܪ1cD´{²_òN”fäÇð è†9_ _‘Øé’1æ¾y~bÕmˆ~kʦ'"oQE³Výpàáõ0cf/ ‹+lßêî€Ç;fÙâmÈÉ}]âo‰o¦ëÙúSÍV´Óß·”¯²_‹ãV4¥h‰á ¿Ñþ=à1Î endstream endobj 2519 0 obj << /Length 956 /Filter /FlateDecode >> stream xÚ­VMÛ6½ûWÉ¡qI‘"© 9l›u6AТ±³×(¸×q¡W’Ûäßw(R¶¤µÈE‘Ãá›á›á`oíaïÝä—ùäfJ…— „GÜ›?ycD÷!ˆÓÄ›§ÞÂ'DËù‡›)zª4âã µJ÷Ó÷ÅS‰f¿ÎIýÛºVA$ýofç»o¦ ÷L„00I­¥‡ á¾Êvz°õ`bXz!‘ˆJi7ÒÍ®*ê ¤”úÊ Ì_¯·YÙDvΈV*ƒ0æþßz戬›CŒæ„(F‚¸fZÃ~ãbV—G!bøb$½ÊüZñSë;;ü~þû[゙×ËÝW•o3]Ÿ€1Ž`Œ³=hY[/_B80ö3ñ1Bµ+^ð9$%±£Cù!s:?‡vìÐÿ‰cl×A"Çvƒæ½VM®¶Çu#‚"†îŠÔ(÷‘u[&wóÉ?ÒšìéË’Iy«|²Xb/…E0¾Jï¿V5÷0\0 ræÍ&œŒZ›#Ûw8#ÉX>£¿¡þ˜ö<ˆP"I—9ï´!d,øBøªÚ¨ÇLÛ™©™ÑAL|´6£[0gU¹j6eq& œ#Á¯ ‚u)ŒJ°E,â·º^U›íþô+sÔ: øoÇ=‡aæIGÝϦç¤]­ÊÜxI†q$̸0Ÿ¸™RFpw<ׇúX}ˆ¢a†‰ù¹Vk}yVžŽU—3jÇ\7_ÊÔÊ+¬2U;l<¡Xì‰ö“ƒß?õ™ØÑÈM€ëg-…$NÃHá8äÅ!×_õýp?u·^[ù¦·gwn!Ô¥ûÉ‚èªËmµÞåºhä7ç«â©¸‹A‘;ÃÁ!tûçï¶?*ãÍÃ`¹Ý4Snm¸»½øÌV?á•MíáMiÇT7ºÊ7…þNšÕWCt7uyXL¦§ptÏüæ‹[|»¬Ùkç”jTWT®/‡î˜,º·ã o¾­É±ÐT`bãÍöñ.seÅÞ­ ³Èú¤ýÑ…¤Þe Eò reCáôÚgÁ-Ú®âajóX)ÝTZÙ7W̓ÐJªpu²+aíß!‹ÇgnóÕ_u®²lØÈÀþJµyxLÍ:¨ìgî ¼X¼C/–ËWÏ«ö›}uí…NÀ+Ë£çåõ Â“´S¨­Sc+1–\lÄx´ ¯c‡qÙz’$BB׈É˱1; %ùh7÷ô endstream endobj 2533 0 obj << /Length 1027 /Filter /FlateDecode >> stream xÚµVKoœH¾Ï¯@94šæyXEÉ&^9²¢Ýx’’04˜³4$žýõ[ÕÕÌ0dãMr~TWÕ÷Õ£Û5JÃ5þX½Ú¬ž_„ž‘8Iè…Æ¦0˜ë:܈1'䉱ÉÏæå…sS¤ýЉ?ë¶·¾nÞ>¿àÑäOB'v9hU'KPhåjCo6«V †®Á6Â(pâØÈ¶«Ï_]#‡½·ì$±ñ]In ¼ˆ|ÔZ׫¿êîÿߟâ`®ú̃؉ƒpÄqŠápHN{N³ÌÇJi]ý+,›±Y+`&*¿¸™•e3³¡q^mE#«¶Ik:B’øÉ‡¬‡ Z–;¥)£]RÓô¢£Õ¾ú&ê½òsž>?t¢àIüOîL¼C;ž§ãýZȬ«vÊÑ)MGºNbÏbÆãbyÆçÀ—"]Ò¬BìÜŽ,fNi‚µN(z`£ÕRr—fâpЋM`G1ƒcÍÎ=D6ºãAf1Üù ÓRÌâ8ÇušC÷pMÓ狸íÍß"ë×–¸îˆRÏ $~£_†˜Þõ`2Ž5f<÷áêJ HLÖéÞ³<íÓg¨b ú—]9Í÷Ì^>ÈÂ#è í½²9Ƀ(„ªñƪ¹C—ö»ö\Í'&m­Áfd¶Oz4±Ë OšYï[úïÎËþqó*’‹m¿+¢ï{‰24 ñônn1u ÌøÜ5/ÂâÇIª¡Äwü´v-š²¿¥uUÌ®ÊhªÎf}ÛÑú‰u‘a ØöUSÒÞ(ÀOzBäoÚäÄÍÞή?•£c/&êÓ-€_‡ß¤cV þžÖ'ÕSIEŸp–ÏÍË‚V,9øâr_äk\NLœtr”iGÖUW‚AÎÐ3lÓÝZ'Ñ­hôH6bMíé¸HV³ôÉÜÉó¤\HX¥Þ <s|¨k‰»4]IÜÁ»É]»}1×;Ÿü›öVši=ˆÿs¼P…<0Hö1ºçë¢T£TËi/˶ 5@ÕB‚c ™½yÀ?üÅO ðÆñ}!—[¸\ êŸø¤¸¦›¿¯ÆÂï5´¸ùÕ#•ÉPzžúÿ”‹ßK8;ú±‹?š½ø3¤ÊMJó€™z–¥½([èhc>”];ì k<tRpUÝÀ¥3±Ï‡¬Õ„»þÁ{‘ÿ¬WAtžxÉ«>‚â\÷’pz®çÚLÑ~›¹ýgoÚ¡ÉÓ®r™¼"Ó¹Ù/“–;h¾‹¥³¶~Ì \ÞEQ çìÄÅË«ë7ó®¨$šˆºN0+¸mk‘ õRB@\:3ÊÙz6 üþ)c;Í endstream endobj 2547 0 obj << /Length 1538 /Filter /FlateDecode >> stream xÚµ]oÛ6ð=¿ÂÈKd V$Q²${h×fØÐµEêfë°Ò6ms•DC’Ód¿~÷AÉ–?Ryë $wÇû¾“½Árà ~ºx9¹¸¾ñ uÓq0Lßó\ޱï»c‘&óÁïŽxÃ?&¿\ߌƒT&®H"`DH?çr©^éü}fjľðì#×7a¸C6ç†A01Sç&«ÜüŽ"Ïs~àåíÇ7ož!3`4‰Ò(ÚA—Ùz%;øþQä"ßç ZzGQû²œšr®JØ”ô˯+]«Ë.ѸCTé¿U?- éÞËlÓž\–ê1ò.RÌeùÅÊÙ—ei6żC8¹ýøú(Ѭ4ëæÍ‹7N ªì›.²Úš{Uf²/cù ª¾2˜|ª ÕS7FwúAõ4Æ"Óë? w”RÄv>y‘ÏÙz»aî'á¡HïE¹Ü䪊À©«N‚ì¯{ ƒŒüÄMm¦˜é_j¶ŸaŽÇnšM^¾°¨ðç&ƒ)x{{ø’çÆiC÷AmJùä;B¸—4øf Æ; ÜÐwž®PO@BXÇnXµ澿NoeþB8fÁëÍ0ˆwà qîP^×ß*G–sG˜)&,µªÎ±ó(ô}çea]ý€Dx¥–è}¸¬e­MÁP°@¶¯pM@UòIc]å-êD ÓsØF¾ƒÆ–?…ÌbGñA2ê _\Ért4éf5¾"ÒÅŽYìgH"½HS(A9f¢4¬ZªtGY¢ŠcÙI^ZêÔÉtU»ÃÑ8ôÈ{#T+³ÉæG+,ВЩW´‰ˆaÅ0ò<€nP†w(þÝÀC%?ÜÜ!(±ˆÚ û"±Øy#jÞ·oDö bêžï°ãƇ'å>?ß=,Ükwúxn2„ &Å®ØÈMiQrU˹¬%Ÿ mò¢âE¬$o¡¶yÔã¨ÈKÛðvŠ–Üb.à¹#Q2_gê™MØR/]=·©€|ŸÛD•Z]„Î\ƒ­ÙÐWÝt¶Â!Zó<‚[†ºn¡¡3Ë繨֙®Ïò¤¾ˆg!9íq¯ ^·U±fÀÖx"µ`¥7-ˆâ6T¹hg5M„ƒFLÒÆVpuÕj~u’ã ùxªŸ0à¹V£Ù­·ÅîP™¶Júm•¤`«°˜H89¤;«Ûf[–ªâJiŠyÕ-Ò–WÖ*Þ ¢Å°ÀZ¶™¬´¥ÍåI3ɬB«†á¶ÄâAòRéb™HÔH¸6v%óÂPêãBeŠ«0e:r(ÜÛ×Ö2SuÝHP×2Q3ýÉ!à Mõ¢À"Ñ8lZª¯0»Âë®.æIO‡nÜ:ÚEã&ÎËGb®r“Õàà`œ:Ë%Æx€W¨K¥—X‹ãÀÿ†u]Y,tb> WA¼7Œéb–mæˆÇh±\l ÿ§mgÅ{ :D°&­º(MÎ;ÊD‹`/×’<ü…\·T(`Á¨¤úÛ5× ýÆ@¯t5+U­Þ[¿>aØQCÚX)ÀÚ¶–>‹Î/x«Íb‘)÷¼¾…kòŒJ-6r²2\¬Â.äýוÂz(RŠbÁ&§1újm X¤3A|qÈPÛu]ľG>Ü5æüNmìL¾«ýÁ·Áž¾'̃ßk½Íòå1š‹)·!þàCµ¾²]·mxT­9ï±ym{`iôüü>_½j¶ÉΜaQ®ÂvÈÞrüï#6}Áÿ¦=¥vO‘ÎKêüéÎôÌgž½¦a!ˆåÉ®E¡~DPÛ&ÜòSçòƒªýKƃ,[ëáÌu ±nñµ‘õK¨ÊC®hGú€¶~ÚT4„ ÑL¶\P)vÿ™ø‡’þvâßU8¸¶mï¨ßì Øê$w3¨oÔÑY{N ÐñgØøýu v*ê­Ö¯ò_j{LÜŒ{©£¸q¬ººZMú5Md¶*|n óù;¤Ý÷÷ÛnÕô`#‹  !ˆí\ï7?•üâñzrñ„É#ã endstream endobj 2552 0 obj << /Length 1467 /Filter /FlateDecode >> stream xÚW[oÛ6~÷¯²‡É@ÍuC±‡n­‡vE×-n±¡-Z¦.²ä‰râlèßáÍ–l%µãÒÔá¹|üÎá!ö–ö~ý8]NãÀËP±7+<‚1 iì%„ 8̼ÙÂûä¿^±%ŸŽÓÐç¬Ý4ü}9&~ÝŽ¿ÌÞ\Nä³=Ìb”â”ë$ Jh„­=7^N)íìš„Iª·M‚C³y^7 Þ ¼.릧åÀf£, œÉŸ´ø$¿.̘ó²43É—+^ƒÔoY+êʬÎaH}mí9L£Ì_3)Mt=?I Ñe©3õîÅ$@$‰œH[[Ûõºá ôР])ŒÏᑇe›$C8€àX²(²1ÉãI†þº¬[yRb‹Ò„ÄÉw–â_~:À³k‘+ÿn*űšâÈ­fÇ@+¹nÜ€4¥ä!¤ ag#MƤ‹´¶¬OˆÏ£RM¤ùÐ]­†WÀ:P'}psë~S‹ÅäéH£­bè–•~6•ÉÛqùz·þ[¸u@Ÿd"Æa©©w èÏ)ª¥™æÙÖ+3—9+ùi„(Ê,, ÖÜ 9Ëo–M½©'Ä3ŒÈ"˸+Þîa43P6ß)Ôkê0õ·’® xÞÔë3ÀVÒÆò57ø­M³h:‡Xٙ݉öÚ‚ ¬·bu¥vÝŸˆFÅÉî~Ô¥8oTþõ<Ù#èp¦þgá/ئ´À +ÊTÒ9Ûÿú–7%;ð_oÕ±ªMj¼û™)‹‰oX@|HêD0áÒˆ¦o¦>ëAq»äf.Ô5e¦:|s8¯–wvzh4› ªEöE1T‰2(3ûJ4ûýë¡ZÓ`WõŸ™²Bâdíוv——¶ A¸¬\îfÓ³u ˜ôÐxÙôÕYuUÛ­Ýï”,…Á¹ÚSà3i#(PÖJìNÚ•ÍöIL`[~‘áÜæÞgf¦@²Š—‘úÃEç„bP¯æ¢:«ø®”=½ ¨áª>L©oËlm>0³hi8Ð2Ð2¤‰S¼fm~}W77¢pÅÓÑ–K“ºÊH T‰bÿoHyôzˆ¤I€¢x×—L_¼½"i@Q†ã=Iµî†CGW™(˜½“QÒ§m)g\±qjþ)#íà w#9(~5ÐbË¿}ì®û÷»û#gMË¥`6'òÚÝó¢‚Ô—ýj­r ¤[—HLš»ü6 êVÎŽ (Åú¯íýéÞOK¶ì×ip+kãâ½Dý?÷)‚T×ù/‡êøtLñÕÙ#KÜuê˜v ýŽ»H²Ø?êK¤uŠ"l³j‰£$¤.N—xÚ¿LtTPh­)é’S‡×ÜSͼÓ:‡G=A—˜Wëq·N+˜ª¼Q ¤JÔ 7¹ù ««âḣ ¸œ¸ ¼GÃFb™÷’˼ký°xq? ¹a¥zôèSä[ý4Ó¯”ýíJäÚÁ¡«‹©þ|Û嘲ÔͯRu$C.~ãE|”kGªnr]¬3ý^î•êz®izÜÿT røc} tÆX%ªÞ}xû¶/»gã¾gyTÞ=¥ê²/ –UBª‚ f۞̼äÕBµ º ÑKÿiåÿ=hªrµÿ¢ËëvÙðû‹gfÃÅwEá·ÿ±Z¹p­ h1[OÛW#ÍKÉ{†­h]yÜn!>oD~C2e¡üj³¥¹ë„~”wÁ(Dw%*”oÚº(ú§ñbXšm‘>¢%$öÿÑ¢}m endstream endobj 2560 0 obj << /Length 1683 /Filter /FlateDecode >> stream xÚ¥XKsÛ6¾ûWh|¢¦Bà+œ6ê´“&žÄIM§‘Ć"4$'ýõÝÅ‚IÓŽÜ^„år±Øç‡¥üÙfæÏ~¾xq{ñl)âYÊÒ(ˆf·ë÷}&d4‹9g‘Hg·ùìÁüÏÛ_Ÿ-£ '*„dŒA‘úe§6z9O„§çÜSí|Á½Cô ’%¦E5¾;ýÙRÊž¾…ð#$r¶b` RÛìË¢e«¯óEèûÞ´¼~ÿêÕê= °4 C’Þ™Rg‡R7g‹7¬)þÑqŸñ‡¥3ø9Oyµ‹Bpý¡hD¢ªÜoÕPtRåÊÔ¹®ÑSÄ/ï¶E«/ÛtÏÍ ÏUý‰­TöiS›C•6ݾ}ÿrú”RD—ׯ޽œt×ʲv[ëfkÊ|üpRV›ý·Ôw¢º<7GM¦ÊaT²~è_®µj¡x! ^U–Gº2•¾©é™Ïº.Õ¹¦ª/£R}8h™Ù­ŠJŸ—Ì@ÒÙºø¢ï§ÏÊ/RÛbƒMèõ¹ôû}ÉhIhMéààºÞvºš‹Àk›AG×Q‡£"ž°»Þ6«¿u6Æ„ÅK“ ƒ˜wúP#°!`/xy † â4,xÄüX’—Ýæü“?X\ËZl;{úšÖ£&ûÔ\¥·/MËæ )¥G€¨ü:@t²™ªavÚ)«ÍîùØѳ)aQ”8WºœÜÌ Ku^\W.½ƒ¤DLâ(Ò4ê+I ô ‚#Ö;·ÉllÍ6ÎaE!Øèʽ®Tçß‚–ËßÞÉk~ÙUÛCÎ.B •‚™“ÌçÿÉ]°(‰½ ožò°«è‘ìA ãTäít«X®ZE/N¥~èí Ìk€Šàgkª¼.TI¡ÏƒÄÓuíD W ©XLuååXœ¡îoG‚¼úˆ$Tš‹BÔe¹. ¦n¢:8rÄ;M?»·:?d"%“ññÈc{Bð¡CÝù5”?Å¢XTâcxíºu&e¸«, ¨x2_Œ Jï0~+ gNª°¶>ÏÃnÓ*h¨‡åiÏ@É›iå$Õ€q]kvuzóã_Óe:˜4d†]¹6ŸÏÇ–×ÇéPe‰…ö=üÐaåÉh·ÂK\ÕÅSð+†s'Æ—`OòÀˆüFov]Å·…©ˆKé8f™]ÉÓS±£ÒfÀ§ï ¹íTUÑQ+Ûrš‰fxâVÕ“Í¥²Oi‚fÇdön$PJS[ô9‰tªŽ»Òž³vWè§NÑrÜzeÑ ÀGÒ·ÙkH†™L3SÃÄ’®“Ð*lˆg3¬%Úð͇GÚ®ÂÉ (ïÈ–·{áN´*zg„ÝòtFèΰJ¹Ñ)‡q—éAm”ѧ–ž–Ï.º[4:)\•pêþbØ·q/omêãtû6µÊ W—Ä1HSbkD_³ÈÝ.å7mmqé~áãó]ÑnO‡Mdø£/dÝàlqÏÍçDÞÇ<äÛŽ†µ4ä«}8¢Ws…ŒÄ¥1†ˌ-‚ÞÖm±Ù‚O!ì¿.ÇTY¦÷4•ÝûÈ@ ‰½µ¾›»–ÄçÎX aFàÕôÔqû±°üuocƒQ«_›V?§.n·ECw€¸¥`r%ÂáoìÑm+DäT„fò Ï>ôÁð#2Ö®2\Ôû+û˜ÝM¡÷ûVW$ì¾QP¶h¦.»$d—ÇztÃòøÈ ì„®Hu«>Ù05ô¨¬á_ï¶ÚNIÀ¡k)¾t³~È8|c&wtèÞØÈýa“á –Úøü±n“ãá©Ûp2­a³ –$¶pí ȵ ¨{È͸¨ôð‚ŠëTúA—h:4ÚIëµ:”ØÉ©ñEàœ, ‚Q…ÚìÀ='Ü@Lùä^íæjW‹5ýÅpÀ÷ݪ¿ì¡Ó‡dÅ¿?ìwOo– zl`Ä¢x2€RÈÐ?z‹ôÚ^@ìé>CÛÝìŒÜ“ÑÉ8u‘ÄW6’¨¶‹$…-a¾œ¨˜Þ0#èP Ø)e6^]ŒÍS$¾;;B0¬…qÚ…hY&ú§ªòmØ.Œ¡þƒµ%¸èuxb3åã…Ì ÷NêM¬^.ŒuX¯Šz_1ƒL CvÁT˜U»a²ØTÆþ§•Ÿ?º6µÿ¿œ}ÞØÛ¯èî2;¢Ú?pzùÝ?HÞʹ!±u±›¥ akSäÓßë/o/þ1R endstream endobj 2567 0 obj << /Length 1995 /Filter /FlateDecode >> stream xÚµY[oÛ8~ï¯0f"5+’ºN1b²è^‹6»/Ó†¶i[YòHr“ì¯ßsxHZR”ÔÎ` ¢(’çð;ß¹gÛY8ûË«Ÿn^½¹NÄ,gy"’ÙÍfÆÃÉ(™¥œ³Dæ³›õì—àÃ^mõõ<“VݱÑË9ênþëÍ_ß\Ë´7]æ ËB ‹›‰\Hô*´òÜóÍuõf-dš™i ±Œ¦î‹Š­Ž]½ÙLˆ‰r–ñÈIyM#K&,Ì7`¯î{kõ´,*8̳,9ÍüÙôª«›ù"JÒ Þд+ös‘Ç=u¨jm¿¨ûáü%”’Þ¾Îã8PåQ·ô¾q+kµÂY;ÛM@¿ž/â{€[ÍE< þ û¬“Ç1騿 ˜©WÅæ[QðûQU¸XW”šzŠŠžÝÎv€Ü=µpKø¼úýûﯨy·Ówe;eP´£%HJÚ“ò%ŒC½¥E.a=~õzJ_ø^ÁP>2ÆiÂrc„¥¹p;-‹Ž-ž³¢g-ÿnŽÜ 6ŠLˆm„ŸõÀM‚ÿ‚u©c¯;µV¢·®¦§‘i»pçØ8”µíZ"ÌHصÌòà Ú–>]kMV¸zrÅåc£&¤øJ—%Œ‘€»[&a—¢¶¯K½:–À¸‹`Ñ_ç†W$ª`ÿiEój6OË ´kY[üOŸ¯ÝGT«.ÒÌ,`”زòÉmŸ©Ò þ]ȳK=`ðnËÂs]¤ôýÀ±QETÿ¹!‚åÁwŸuÇ¿£q…ÑVw¦÷MSïiÔ'”ö—þ©ÑwÆVÍ”ÃÖNÇV¯©eygÚk½QDzcÃTí/‚èêžV6:‚ à‚؈^§PØ·#½‚ÄÔÈíÇø4<óFÿmDÍù‚§¬uÑ>UyØ© ¨`†[ÿ±Á~DMt”®¨¶ô†QÓp(@Ï–šüEqrY7kÝ0bÝÙŠ¿'’ !('À“¢¶Z½ÝÛ8¤º¢®¨wiŒa¤½…flãßãt̨ ò̉ú绉¤y—§±‚–3‚‡C£1¨ŽÚž é,i¸0®°àiÎÂT=b©¼+ -Ú—"|Yܺنط•ÙO&TO„±[Æqý}ÒQÄŸBZ@—$ùóHG, yi#‘F?ÑÄ?ó? AÇž ñ ê5X*I‡à®¬úM]¬/C:bRØD¸VÍ-[ªÕí¶©Pd}íA´—œ(øaxI·à N,KŠ=·—3¢ÔgigAÿ¼R¦jJ8•Ž"v ÓDÜ£ ÷Éß`h¿zÄwã$0ükÑUir v¯j ’÷ýÙàհ膚¦”¸Cjšb Î ì÷öͺÌÝÕåùöÎ'lpt)›¾bÆhóôSŠS·6ÛJ•}óA¤sa•¾¿¥—FU[W®¸£ Ÿ_žWM}¸ ÂâhIÛŽ€–&)Ùpï4Q¶)ä®èlÄa‡Õκ¼¤%ÎV·øA \~öšŒJ?£Û(›I_}(WКé/«ÿÓœïcÎ÷{ÜÂ%|æU`¾ÖbJg¶²+®Ô0ñÊò‡ r«ºÕ'"ý0Þ„ì©“A$Ά[ø"xøÜLËmàK(‰1îÓ¤õÛ©£8¥Oy–â?`∂¥çÛÁÖ_ ·ŒéU@.›Rá‘É`Cl~ÏñÎÌÅZ‡È³l£«±…ä’åy4$TUß°X§ª¦p¤R.Rµ†^U´¯Ñ‘ØW¦~÷}Wn‘mA8W§üGë¦åï²ö5£? tç¥q>:Pߟqåið7­mÑdæQ‹8\Uºì•õY0}Nø¶RàRË¢Òçëõ¾6%ƒ™´qj] šæŽQØ ?ø ¨ÓÒÀËf Ê¡æ§Gj¢%¡´Õ­vwu3<šÀ½ž [œ1{²m·¶@mz÷žxíÄ“àça³ÑéŒxýî8- ˆé‰ÓFB£!#V6hfÒ®Á妭mËÂqŒ*Ëè¤'ö¡ž±Ñ³}5îlSÜëõùýèe¯TÓé¶P>¸»pQA¨h‡¥9úŒŒî}•௨:wö€s¼E8ì+QÃ(.2ˆ–þ‡<¡+£éßMFIv3žÙÉ“†ä!KeÔË–±#øhõÀ“¾mqwS ªÉÒIžŽ·ÁŠG¬tÖ&VÚ’»†(ÕÜ­ö’ÿiÜóç›Wÿc÷¹Õ endstream endobj 2575 0 obj << /Length 1300 /Filter /FlateDecode >> stream xÚ­WÝoÛ6÷_!ä‰f–ú °‡´iŠAÚ5Î^š>(mk³¤L¢kxýŽ'FN}1„öªÊVus¯ôQ:|ŸÆRô"«Ñ‰ÓLÄ>„MD}"çC›.Õhˆ^†Ì­ž>dñHá<²€¥–n„$&A€Œ©u§UúËÁºÓΞJmiÚ¶éŽVi E0F~Åå¢è¯È/\ÙNséJ×Å?6%´TzUçŽ†ÌØuq[/ï:NŠP÷ý‡ùœòQÅ •êM£ZGÙÝÃíí›ÜT×t0ù4Ѽ(ÝKø¥d£œÑ­*–+ír36Td¥Ê7–ë)Æ´ùèã¼iù¼VT7êDO¡3ZÕüT´nrÕ827W·÷G…Ô³ñÐüTÍSݺvÌ¿=|´¼³ÃŠìÂcò>Ö0¦Äm¯tНšå¦TÕT ¢Û7{æµ^IŽZà­ŽŽBÀW±Óñƒ‡T y|Ä”ÃeõD-$ªlxKU)Û{pOÿv§Û'4¤ÝUÞÔ#š8RH4cÔ„0¤ç£8qrï,ªÜq£W ]zƒbôÏ~fÐ1"":-ªísΑ•Î@èc”¿¡NLfi3˜\ N^±ÿvofÆqÀ¬¸:Z‘dUOa*¼_*¿œÎ|? "ÁÕÆ¸ZÂÆ‚%F©£›-€æiþ$nÀÒ“SöÇ4–DeÚäËO¸õÉOÄ*ª®‘º1oÛ´ª%á¶³Ùr®Ò¿~¸res¥US•Ú3ŽàËÖ>mÆ[:%"$_ªõΈùÄôµÝ \w†±Þà‡•N±Z’â’LJÕG]ÙJ3egŽ%i{b'µhêwFôÙ·)ìî®P쌫¾àj¿Ê»ç‹y·˜ÊˆH¦ÚöÔ qüÖü;µ„ÅˤË0ÆB“ƒ¤›/“8sZ`¤ð*HH0ò~‡<¹Z¤›5¼6f2ŠÈ¶X¯‘n Å*±= Z\ÝK³+ª³BHÏî ;öO‡°Mi.~²½«·ÑA•ªZhò3i#„Í=•‹zÇ~¸å=R9Äèl‡÷Êÿãf…Fö8"fx8îd·EÞK!tÎE¶‹:q½±ahÏÆìï«3ñúºOô,‹ÈÁ;Íg1¢Ù€Ð!²tmÖi‡m@8L¦e}Ua‘ùªhñ> stream xÚµÛnÛFö=_¡G °Æœ^³Ø‡4iŠ,Šl‘zÑ'´8’ÙR¤v†²ã~ýžË EʲkX°æræðÜoñb»ˆ?½ùáêÍåÇL-JQf*[\m2Ž…N²E.¥Èt¹¸ª×ѧn©Šh0[[ æC5TËoWÿºü¨óÉC]f¢ˆ5 ¥'R¥ô&ö_ ¿—=yµR¥2Õ°ÈáPóã¯JƳ×'ߢUøÒ»åJ'It‡$šõÐ[ܧQ¿ás7ئۺ Üå‘Û/W×là˜A†[Ë®Úù¿N£Š·u³3kúŽ·ÖÔ‡õ0n‡‰zV ´2M™®ƒC\ZG"I'‘YʨZ/UÝòM³\¥iô;Í€‰.n˜JÞ4Sé×'r™K“³’Zä °¿%Ë$Ng²Lb’c€?Q,,"âå¢!™àKAÀ÷¡Ù}AY=G@¢EQŒH2 kpË•Œ@u‰RU‡”‘êäù;>Ciâ/i¡7ÌPTCj@½­ÊBZyíe'tº ¦c…°½œh­áÿ©šÏÿùùg”D™I™E÷·M°&Ü®+â*þéÌ=/~yÿοhÚ–F ã—íúÐ’uñûÎ/@r5ƒ ¨‰³v>>f™T‹–^G÷H¡i¶·$*Ç—øIEª<{="HÒ¤[ Èh^F͆Hõ9ªþk¬SûkV>Ü[ó߃qL>l'ÞÊ·£·âÖË )£¾kø,Hã¼Z](ïÇ…9æ73ž ⹘òL@d=E°8@^¬øtgìÖŸ{b|̘LÇ7ÖlŒ5Ýú,¡¤4•gÈÂ>,ç"m:<ÏùÃ@ßòÀ³„,\‘ón — Å…7ëž÷òD{ëq¯MÛ:^‚"»s„OHTlËq>#:Q™7Á¸x,K„ö:„ëÎÖጽ½ ñådÙ°™Y6ùßgy —LKA‚:C÷<$ˆSoŸÁUž‰²P3 wµ¸G>†ç\Þ¿ó>ÿÞËÙöH"…ÔI?7 ¤û¦B6ÙÌÂSýTœk*µþ AÚδ'ii.a4ê×rVíö­ƒ5æå¼ý: ç˜F½;kðÆÞÖÆúå†ï0Òæc¤t(±IGÿþ+øŽÝmhkãd{Í{Ln¸Ãz—aT2òýÁùÚucI…>‚ç\À[ö¬Õy[ßNÚ“llOu"\ß5œ’#dAbD=©x?ùå‹ÙY¶¢,²”‘ßR6ñ_hÛ3mѺß2ªÃЃ57ð[ª#^Ÿ)@Û;#8ý¼8‘}ð=[×{ÖmPHÈcÀͤÌr#/ f€r¼ö >_»æÏy©' âL/òjö!y¼œç­ 4±NúCçÁä'Ç&© ¥…‡ôïÐB»z´µªÝöLinÓxc¹çÑîåQVéT$yýòîóççØ¿-ÕCÄzRnZ+Õ: Núéȱ7½{Eéó‹=yÝ#›¶ßZ¬!˜He]hª‚t)ðûÀÏúË„UªR‘K¯ÓJôÖ=Yç‚(¨+ÓEÁO¯¸±†Æ¤â²XsÁKJ¢1:oãOö^YX{¯¡á²þy@yÛt\‡žÜrʆ$–¥É1‰ÑCÿù> ¨‰™€ 6nm›½/˜¤3±Ì×”Ø_ ·¾ÆëÛ~ !"ÁVC§E©’:gsÆ/~•<Ä@»±´É#Šp)Z,ÿ¾7­_©̉…-r²Q4U¿S]\¯R$½oÞÊXÈXf—¿ ì?¿”QœŠXÏM˜øÇs8OÈûe’Å2ÉçØb²ÝÜÚŽeÚásñäísà "’­‚â¢xÅpCN7Øå™\Qõ™«3m4ú Ö’F|ZŠ'ƱڢbòvÙ„f ²Ë†›I”…7¦„lÍšF»³}ÂäeVL¦T•çèS$ÝìLWK¬¿¤¶Œûw<•ü³âSföuㆠgt|ÂVîÙš>á‡0äSOåß%ز‡¶ë8ìÀûº¹k¨2ÆÍ ^=0¼˜O(ÄÅŽ)^OO¢r/aºíPËXU@½¥ÇbúIgýh,-Š1¾c¥‚HƒfB~±\3jÅ%úLÔ×@©ÔìÛ†4"åÈ%®Y¬2f¤¹ÁÞ­)t!ÌDŸ’ʶ§3YJ‘ëõMWêF§|×­ásÏæm—"-ÆrÛG¿¡ß{º¹8Dªýj'E ® ”ÌM‚¸ÉX!Kq¬c؇ı‰œŽ)°§D›CoEéw¡ðA8–êmË\dz ³AÊé0¹˜fN›Ø¢bØ6úòi[ÛÞù6µbxÜkd¤óyóóŒ©A¯$syüvp'ž §ðL«yIñÊàIÖ…¼sÌâùL2“ûk<Üa32PêÆîÿ;ŸrÀ™àªqîªýè‘®ümàÇ=³8<Â!|ˆ¬=˜ïXb»'Æ×ׯ–¼wl_Ç5ŸvÍÜÛšçýÕ$^Îjß¿)nD¤mêy ‘ŽGaT… câÒ^ÂÓç¾$©ÖœášyÁXI&[ð|†›kEùÔ åqêjˆ³•âWoþžš#å endstream endobj 2495 0 obj << /Type /ObjStm /N 100 /First 975 /Length 1823 /Filter /FlateDecode >> stream xÚ½Yïo¹ý®¿‚Û/ÉùAðÅp ½ŽQ´ òA±÷ãÉ%\î¿ïʺX–d¯åuÃàî>Ÿfg†»‰KpÁ%.ÑEV$— ¹ð€5` ÅQ*N"Dh›”†6©8•dƒê´–Qâ\f×è2.ˆ’+dØŠAiXr6q§b9A `¹Ø(aTÉFà¨Úˆ1*bÖ‹‹Dm†‚wj e…sXQ[Bp9eaœÍ^ .–XÁS‹ŠÝ„ŠaÙ*y„°!4€„F*â_µVL^ÄSNF/ÚU#€µs0 3ó¹ÍHÍÃkÀ½©qÄ€U2öSjnp?¤6A1R#€ŸBÑÖ8Ž¢A"î%‹‚ÀÅdQ‚ͤX‚£ñÃâ ‹šax€4w‚óÁpF>'ãNl·uð¤ÒbÁ0Y,Ú´âýpX=MŽc6NS4W€³ØcmîáŠQs Fm ‰Ž3”…_«5Vj‹·à^…e‚Ü 3Ú²rB#+÷@M²rTÚS¿¸ s¹Å[ inñÆÌ·¹ph1*˜&¥­¡°RÔˆB0RM’êoºÀ4ż—ƒS² |®Œ…ð3Ä©FA§Ø/Š%á~§¹‰+Û¨AÐ5×6»©˜$‚ÕRŒ2ŒäŒ@N.Çläsu™ZøJÛm2zóf4>ÿã¦sã£ét¶?,?/Úõ߯¦¿Æ?Ïæ—Ýü£mùðiünü~üöcl£ñYw±p£/"y!0ŒÉ“ÉNÉ—ÈÀ¹7oÜøƒÿmv>sãc÷—³_§þË—›ëÙŸ-¯ýçåÕõå_ÝO?ð÷rF)’WጌaÔ'_};¥‰Hôz^¡P<´ò“n²Xλ‡\Ža¡ðàÎÜøßÿù¯«ÕvPNì2˜.¯¯?íÇZ3ù˜åuÐ)z…úû¡!xŸj_ÛHŒ¾bSõC#ÓxK'=Ñ”§¾¶cU_Y_ÍP àúd6]4¡œ ; Ö¬¦ ä¿Õre/WÈ8‘⟥õ#T5ºÂüøt>»øÐA«n|z|âÆçÝ÷…û´)ÿÓÉ—n4~ ÝtqkÛÉ4f*¿-çÝ­k¶ÝûGwy5ùyöݵ¡Hä¹&Hýt2Çl6^ž@9ï/êûà?…W+öDKª¾–Ú¬éuoD6‚°ž ·ß Ïá^Ï[^·NãY^_¥²[,ÜÚãói˜\cödu+! §Òêc+Z ÕA÷æºwçÿ|‡t÷mró0ÕY£Ö[à'U±-ÉD¯]‚/õ•Ðp¥õ\ýÐh|ÚM)ù\È/{Ô¼™lÖv¬ÛÚŽù`m[·m|Z³}7Ð×P;ŠR¨HÛˆ¯=4Ïò˜Ø»oËïvEÚÂè½õë)û€¸1x$Š{‰|x{~t{;ùc8"wIX˜¬‡öÉšxTVXö{ä_'刺ζö~,ÏØû÷ÁOïýh4jv|ê‰pv¬=ÑŒÀ˜¯‚Fg›£öEݪd{ÁdM3÷ý‘Éõu ŽÄ>§:\M}Øò Òåmç$Šw9vØî¯éûàÍ8´‘ëë )øXú2ÁáTo4GŸ{£9oGÞ~hÂÎU}%t€Lq î‡NŠò=\ë~°ŒyGÛȇ·ö¦fUQ™Ö²´&x=âÉ"¾½,A ×*H1uMë–óɇwVo¯ÚP¾¼½o¡dG3ðÁÞ•Gx|žw¿ws3¹öWJÛË1©'{!‰m/×$’ ÚÅòØkÛ‹y·èN'×ÝbÑmÕZ~NŸÍ»:Px¨¨Îï+­KÚÖº„~Z—­_+ñ®¹¾_ y×;Žh*h#w6 9ù¤Ú*4%/}±ùæaˆs‚†./p}N€ë®3êfNû¸ \ð ý´#é«<ÏO÷“¾Ò)žpX¨öb ©õ˜¤ì³Ø§"I­7“ÅÅ×ßgóß¶r˜>'‡éŽAÁ¾d¼Pð?B‡9°JJ¯VسlÇ8Ó b¼>3ç°ÄA£N(¤0)Õ>XþÈŽS„<–÷Fýhzñu6‡{†üB`=¦ØÇ/O¡}†ñVâ™ì8ÿÿdBŒ³}A»cÂ8HAO19¹š^¾‡¾ å¹šMWÄn·¶E~Æ×‚ ðCû"¯Nê#QO´dœ/Cí‰&…í˜^˜”y‹>DŠ.º½}WŸÛ¾yÝ—çz7(ë}\âz°Æ”AóyRäsTkÙÑ5P¨Èçö2-;ÇÇ>¸u—Ë‹7¶’çˆm)**KªÒ¾1qQ¯!íeòõâzy;à¶ædzÍm3jãà™íû<<Äqÿ¾>;úå—5‹ÿ‹MÆD endstream endobj 2595 0 obj << /Length 1663 /Filter /FlateDecode >> stream xÚµWÝoÛ6Ï_a¤/2Ó¤¾•­YÛ ŠnhŒ¾¤} eÚV'K†D'͆ýï»ã‘Šä(IW`Òäñø»ß}Q|²™ðɯ'¿,Næ—A2ÉXûñd±žÎYÆ“DÙd±šÜx§_¿Í/c¿'Dœei ŠŒÐU5õSO«M#µz+µÄ#'ÜÞäÆùeôtÌ_0îg“™ŸÀb@ª>û‚NÄ™p÷^–º‘¹žÎ‚ ðôVá$ô`­j×u³“º¨+Ú„yS|£ùº©wGGê¦Ø•,iY}Û7ªm3ÄhËD £Ï¢Ì²t9MÐÒIæí¦~âJ]ìË©ðð‚”{+`¥Uš~=¾à’3XÍ„w‡‹V|?V<Õ öŒV(}Û’EsW´Š®=Rʦ³( ½ÅþÕƒ»¢RÆ>™£³(",hÆJ5–•5-©¦ÅÏ<â…¨jM'ZŽ…—ŸyªmÜ’â( û!—ù,ô»8jån_*¦¥Hxàú(dI9Y¸^œÑí–¸aÔ cÍ"æÇ!L8 ñ±öV¡9’ägž¤aU´ZV¹]\’Ó4úŸ0©ÊÊ‘÷[{ØŽD92; p’ ‰„II• ¥êZ± 0ž\•¥ÕVT­™×îdYÒÁ˜çWÅm±"?p h¿·yäBB×Ú¥†‰„ƒ qkîQ¬(²­›Öi4À5®Þá9bå!û`ÒíÕ´àøbÏ:•ü31óÅ”7õnÐpE“^VY«¼Ñ¢[ÐјÏ-m,»@?öwÿÿ ¿<´šèG.‹Ö!îbò¨îiÇnWÈr:·9@XÁ.C>¨Ø™-}1‹EL(>M³È;¨'jþ°ÅÀa‘²8´øQéCSpß÷=×5॓Ðô£á®_7€eAW6®Õ Ós¼>¼#®ßE±÷Uå”r¾5¤Ð[à •º£I¿øA–|7FáPÛBwéEÛÊûç0ú!Ëxg”ï'ÞÕz¬jÆ,Œ'Ya£+‹¿¨êï”ÞÖ6—_“cOß×›VHŽV‘b7OœÂ3ês!4º”'#]"£v a›ý)t.Ò4u{‘qŸlf‰©^XÄìŠØä†ZD]œ ŽE3žeøÊ`¨šÁýî-þW¯ xsî}ÀÃIs¨Î;C¡EöMnå0Öq,*h‹ØãÍ"fN¨u˜Oó{/ó?åÆn¶ÊN¶ZïÛóù|Mâ°dy½›·à¦¯²”ËykTÌ\fÃ(‹e#›{|-?\†×1áíñÓ=tðô´/f?;ú¦!k]K£5c§š f˃‰4¯—Ðôì<¯+-‹ B‹~§Îè½ÄRòp$©ÕÞÖŠF»­G,^U]G¸ ä‘®—¯‡ÉÚ…Ñ3A_XÍê!Çub«!8¬‹.k‚"’èq,Ì»j…:ú%ÝyÔÞ-NþÌÆá; endstream endobj 2603 0 obj << /Length 800 /Filter /FlateDecode >> stream xÚÕVÏo›0¾ç¯°ÒÃ@*®Ã™ÖN«ªi[è©­&NÊ µI³þ÷³1¡’´Õ4m»`c¿_ß{ï“ €À‡Ñ»htrÆ\¹ Ds€‚„2àc  A”‚+ëca»Uñ…ˆ+~šëŸ™í¨/OÓ¬XHû&:?9#~Ç  Q^j ØõµÐ5ŽO£ÑÝ«-¸õÉüRìƒ$]Ý ªËs ®ÂljÑP–OµÙ%˜Ž¾´öv×¥]`AF1` +‹t ¬5ë`iͨäx=. ¼¥µm[ ¡¿ÊŠíÏ·–åFo+Ír^Ȭ,â¥9àùLKÖJoÃÉ !tCï5É0 Ñ@5™K`@›j¾ç2ÙªRõÀ>‚îUÀÁ$oÔ?ëòs1/E®PùÌJã*–¼Ò?ž•uZE;¨×Ra5±9Y î$e¾ZW<5'“"Ñš·¥hm•s£#W¦Ù[Ù5"Ôè0•i­²1ÒÝl+X Š£òzÌ„-¸ò)¹ ¯ŽMBÓ·½Œ9®ëA—5z—2^ðÁ<=Í[¿á¶y ööÚ5òP\$ó±íxYBuŒ·TáBl ‰)1kΫÛ25{U ³I–±løÈÂ^ëRèùmë¾i w¦»½ÝÔpRG8UUyj6 ¡Þ°ê¸8„Øšjx“Q£Öº¤/ÞIR·´ÍmÁ7PðtèhaçÜäâ­YÆÙÖYú-ããáîhÔeOõÓåÅÅ KÕlV%lM¿LíÜðlq[õ¤I…è#²—¹é aÙ8_-9¬.þ&M5…Ä=‡¥H¹èéœM.¦§ƒ^•²ï!úz9,¬Ú¿>vºà /þ1"rÎÅ!V²À=Ì D¡Kèd…à*J^$|ðönÍÅÃþ¨’?¼¬)~‡~ÞAúWI¼åwžTãÿŒ†‚¯%oÜH˜Ç•È~>Ãözÿ|Üû„6ÃD,Öêm¶‰kUòàSºï õw~gHëÍ+>StmÉ7Ñ#!ñbZ„Z¥ša=ÏÒÝ5”Ë~Z¹Öà endstream endobj 2617 0 obj << /Length 1975 /Filter /FlateDecode >> stream xÚµXKÛF¾ûW9QÀ°Íf7)ÒÀ¼q$œ¬3‹=Ø>t¨–ÄD"6éÉä×o=š/ 1–Œ] 0ê7«¾ªúª»¢Õ~­¾ñÏû/ߪÍ*y§«ûÝJF‘P:]m¤©ÊW÷ÛÕ‡@ÆÙúÓý/ߦñd©’¹RÁA´è‡jgAk÷iíw'ìü¶á¿ÝnËjïð„‘ÿpÿûò­Ö“#CI:3Œ70¨ød!Äló…È›TäYÜ‹ñÞ:Û|^ÓwסR*Ø­CÔk4Ø×Aém*s䳘Kå¿Ê„ó˜TöA4vÛmYW¢2'{…ŒxBžÄ|Â;ÜÃÖ 7àйŒ¦×c[žlåàk½Øã篓>ZyH‡­îzdYÞ8ÞõST£é¶æ_o~îÌ5ëPGyðvé•džîרf*·³ÍëªÀ]‡ºùÕ¶w0¯áˆCé¿ãuwÜ¢ b›' ‹:|Y) |£ò€KR ÿ hp÷<èå,H ñxY]hñœ¥51ù|=Iƒßmá÷}Œ’È›ŽýËœÎG{7;e±¿9“Ü…97a’ÐßÀv x¥2ñRY_çßià„ÙfÄLG±Ç {̨=¢„§yG€?‘­ôn¾âQ1ú…ìÝâMyzø=çH¡ß23RÝã1T:(jVÆ”p»¹9z/ìñè¸yn,Ù& Ú!`hÂÛF=µæ2¨WFŒ‚1oˆ>'ÚZ”•÷á›Ã½›r¢xvÄIl;CˆC¼í¯ÚSNÐÁç5 hŽu#“Üʈ[îí Lðœ*¶öá\Ñ\¨&vå¶ßõp°^½܃¾à··£Œ¦¼Þl•U™új«ÉÁ»Ù0H›)Sè(#p °:8T˜cÑ k£~)å(Rrá)°E*ΦZ∠µæUߨ½º„FM4ËDšfs«ŒeôÔê þ¾"<ÚÔNQq8&+[”`³Ý#R&¶*l á$Ŧ ( ¡CV Ãiä02'†Ÿíˆ4v§œ ÝyÀÃ@é'2Àœ\.\p†áEX=ƒbȘ„R ™'_ £Æ %ÜZ"r00Îð:ÄWo&øî9` Ó4|.ƒïNFèNa„îFM,€Eî;¹ˆhŠCÃyÄ;ØÈÿ{,õ×a©£d†¥Ž«óX¢‚[Ò˜V"Ypp±ÀB“¦ÛYhxÓ¡dd:ù2ïáIÒ‰fKàˆ5Ld·0ÏD¦â/çÑ'é°œ_þ¯¦y÷ïŸ~B'Î"–c“Ù! ? N³œ!߃‹ ]G çë¦ÛR²ƒ®;›Âòy|‰/?É®K›NçŽhw=§$<& ?—_òDÀ%lN£n{söüÖßqšº¿ÍŒ<‰eªíC¹mó´ê-©ƒïMç\i¼ÿ ÿo*{¼ˆàyzñp\w/ð6wtQmcíõÊý:q}¤œÜ žDpà¬ÍÏ•|½ö^Ùg|ä*øùKë+®´°pd#˜°UQSk_ èœZ¥Èœøs2À¿a§ycy|ˆ@êÁÍDxÀNìÚç¥ 1. œL/BKâs‚:gS6¥óK¢òRH×Ú3^-ƒwvë˜ò@Å4 hÿü6æxæIzÆAÃ?[ÓBØáã@mà.M kWÞz4FsÙf^Æx¦a¨3Ìí®;^9nSŸxØðÏÞ‹Qñ<žà0‡O)&R耯ƒÍxyoÃÆÉ6û¾I†]–®8v[¢í¯Þc¯N"i.¢l(‚à<÷,(%Tªûõ»®*FO®»¨Ë¿÷t.ñ½§ø½‡îÌ/ÇW\Š™ !µq2ä2V±*ð_ß19H~uÂ3Z‰Mt‘FBåW…%ð¡#Ê?x ÆIa¦W– ¥ò^‚Þ†îÕUeŸ8IŠUŸ^‰þ½ôáN~‚À‰¢šñ§^r‘G›¹àä.L`a÷ µdî1®ŒñHÙ/\ÒàYšÏåùÏ¡ìy ÎcæW&ìR*ëœôl烌§cjç¾â>UJ ;VJrÙ‡L_ƒèŸ{¸îc¤tã(p#ʘ“×ã^ެpÙ×÷“«ÜXŸP‹Å¦‡’õ ÃÑ“Kð>Gõ‰š®(‹¬eà»”Müúwýì Éé»Ãtm Þ\ÂkêøˆÁp{©‹ºùl矫3ÙÁ­j¯ûPêÙ¼¤àeø™ã†â˜_ê3¶+ÿ¾,ûŽ)báâ&nNãŸmó[ínHá¿4åXY¡ô~Uï¹€êëbØè6ëßéÞjÌc_Q”ÜAÒ­ {Kµ·ß²ìÚþ~È8>)&xmÆÚ¼ÀË_–ýÏÎ6×Ëý/Z~Ìúi-K}¥°z"¬0ΙÇ[Ë¿‹WÒ×p è5ꟆþY©}ŠÇ¡%˜¾\Äi,åïÙNŒéü–Bη†¸RM¹¶Ç[%M“ü>$eœ`&Ä–gYaxn‚<üv@Š>ô@œ=› j‘"ƃլ®½HÐo€hçñ6$òà¡:çÊ‹‚CÏ`‰Å,üÝý‹ÿœK—Ç endstream endobj 2622 0 obj << /Length 1331 /Filter /FlateDecode >> stream xÚ¥WKsÛ6¾ëWpr¢f,à›‡ܦî¸ãɤµÒÒ’Øò¡TTõ×w%BfËÏÄcß~ûÀŠzkz?;_Înï“ÀËIž‰·\yŒRF‰—2F’0÷–¥÷ÑhçAæ÷b-y/9Nó õ…TóOËŸoïÃt¤"Ì’Ñ.ÐÂ,ÈñÐŒÚ;oï#::½Ž/‚C#ôVô¼ª•#xRà\Ç2oÁrBc v¹ó˜à7¼jÍ—êÅV™ÏneÆ~SÙ•­ìæ °¨åNZQ>|T¥0¶W¯­dgQÁÉ<‰ Ìç¯Ú¸h„-`)‰Òd â¡µ¾å=?#ű)ÉH@£Al_õ‹¾µ¸þBPâ`&e¥úª-úªk j*³˜$È #y-¿oÀ”EÄR¿èší$Ö8Û0\ßk¥Õzƒ¾í•Ylx/«¿o`æ§£x%o ;nŠ]Í€2:5¸µÕÜ ¹êd#J³Vµg¯vu­S²ÚòB̬ßÊžB±4k¢ÁµÏ榲ôk©¿Ú`{Îüö$¢4,IÜ̸»6ÛM'íuý†[‘uïQ¬3JKð½ºÁièsen©`õ¹cZbL“m…>†þûî̇ÚjPIÛF`BU ‚9 ƒFMî—hÝŠïêÞÌ- °¸áúkÕI+Ú^·|Gáõq‘4N1bŠÃYº³€¤:Ù3j¹ømžCÊÕ;ñšt7a€c kd¿;½†Têérž…¾ä­Z y×B;ù$z³ýéJv™ÝWm9- à ¿qn žß£Ï0Œ ˆõ¥Rô;iAiGáÇ—‡©HèÀeqâÿ)Š9FÛ" èñ•Yþ<ðas:ðá°ê!’í!]aäf«{3×hj†ÎmC$î DâñnnÍüÁfÐb*_(ü&ÃÎ{‚1uä5óZBé‰P€i=Ú¹>:Œ‘Á~DúNô‡ù)ó }à|ØTÔêžý¸œ}™1/ìøBÆ4'iž{E3ûø‰z%l‚Næ™·×G/ý©N£Ú{šýò,´éøv1J’ˆyQˆÅgiøÈöéeI;òÉ36NàyÌÀAø4€qê?êÙQפ™Q#K®1Ó˜C'ºŠ(ÊH’öW…¬¶šòW$¾DÆgºäô36´&nõA%ãÒóAñõtÙyŽÆuE“LºÃ]ÇX®['κϨ7S!؈~Ó•“[¬Öd¢1¥þwfx³-ø›I!®?8gß}x|¼™ªB+Á!Ç„úÆi«¸6Aó¢³ Ê‰ ZÂ…m6ð9FOˆíf&HÄ‚qÑ¿©9w'×»êZ`CsÉÏÿáß!ÚŒ×.½}i w÷òÇR=͹'±ƒ0ºtOBo˜ ç¯ö çrÎ5 P@cBèùG÷r³ÆIw,•Z‰~„l?³Ú™nô"«Øså/†õŽ7¶è>Ʋ·+P¢ÛvXpÊ{䯆¶¨è¤¯CkÒë€D¦bÚF­šÃòµÀŽÉ|E¸ê‹¿êÒYôHtzªºùì̸SâŒÌWgN]¹ŠRårÚ ^Wÿ ½uí¾ £Vø< È„ñQõsçBeöºdëÛUÀñ‘Ð¥k€ÖWbë9¶°'üg"Óvðã1/ÚAc¤±k‡-·/Œ[WÑÛ–Ô-Ü4üܲð‡a~2?+{Ð DÇÂ7Q‰†ú’ð,’ endstream endobj 2633 0 obj << /Length 1155 /Filter /FlateDecode >> stream xÚµWMw«6ÝûW°„… ‰¯ìÒ¦éÉ;mÎé‹O»xï-°‘mZ@.ÈMûï;Ò .v’öuc„FsG÷ÎŒ©·ó¨÷ýâ›Õâæ'^F²8Œ½ÕÖc”.b/aŒÄ<óV…÷Égœ_Vnâp´”³”$)CvÑc„©¯å®Íu©šû\çËM•wÙº îÄ›AG6–½‘e˜À$GS?YìçÕQN¶ŽLˆ±Ç©·d1ÃÍjý«ÜhôwsÒ´w÷¥Ôû`É9÷Któƽ;RÃÕ·µ,Ê\;“©sZµù.0õæ@ ÏæË—;£‡Þ’ñ¡mòÊèÂÌé}«Ž»½:ZrÌuèu_†fò²ð- i#‹#–1TÔ½ª\²^£²a¤¶ç¥Xïs}VŸÀÝí±r ±ò5ne^“7*ÐKw¡@½©éhd¹Û¯!Ó\kFR&z ÿPvzŒ£smk Õºú5©be*¯GuΉ^@@++t|ûL# ÷s8Žâˆ‘ã9ºÁ¥wOO··MÎtOB”™¬³ó¾NLú:𥄳ÐL¸žËÔWcÄ!FÑ óS G /&:%Û±Ù:Ÿë¶üóº3h}q·SÎí^'½¾s.¦b–iq ܬpT9Nÿæv†T1#ÞkÛ›@ÚÿiìùW ÆIàߎƒút¬kë©l§*5¦œÆLau~Ë|èÌÚqz>Áã§Ô8ZA*“ ®AsÞMøÛå¦!&y X[“¸öl79WZyJžîê†Bµ4W}m£q¬t¹4I»)—Þ“‘ æò'Þ¿@æšw endstream endobj 2647 0 obj << /Length 971 /Filter /FlateDecode >> stream xÚµVKoÛ8¾ûW9I@Ä"EK‡Úíf±EQt·—¶@™²µ,­D%Íþúv$GiÝ׉äp83ß¼8mA-ž­—"FÎD,Ъ@”̸@KJ±`Z­Ñûàï«VêRVÏËúuÕèðãêÅÅ%[Žž±Là”0jPF Ó‚x=®ÿ-(l ¢b㘦(¯ï?´†Ë®²ÝZÖq°bÉØ ]-þ9È;^-ÎÇ8(Á‚S$Ž H| ÇAø!™¼q–Ò= we?Ȫü_…KÒ ¯†^«®w§¾ XÉa»êÎЗܭC¹fË“ëòFÁ½Ñ<ïNq–eßãžÌQâÁ?W}Þ•­.›Ýø½&…ÀD1Á—ÕôÁYÕÜvª?›}´éš¡Å×w§©U»•ÖÜà‚˜Ÿ»#…£-@qúçûËGcà«þi·jµ Yèþ«±øF œcªm’lKÅï‹í©Ë¢+5tR»}s ÈD0#g¢9ò‚ ¦Œƒw²öW²ö9ÞnÕ[åÓ¹¡†7þ¤w=ôž²}Êß>l2'šëèd£ÿØ‚1P^µ%Þ†xøL4´ª°éÙ$ ¤¤)I›–gÛÒ¬69,‡…¯dÛÚº’¤¦[«nÊUK‡pÞڂߪ¹¼µî°º-õöÈWÐD ÎË„qå{ȧHÆ'ŸÜ9rתC¥}ÚÇb é»=¨ÂŸÈ•Zi‰×RKß&›j¨wÓ|±j&èÁƒkcÿÝé¶óqO8=_×™»¦Æ" šVæ¥vÊ¡p«L£{F<¦Áë®1‘¾)×ÊqHP¿ßÚåÆ0ØPÚ„‰QyYÜ•»#ZüfS›Ô²Ì× ÿ<—C…M`–¾¯_†) ”ÔC§L7&Â? T8NL€sGl;›(„‘'½Ûª=ÉõY³½ sÔWl2väFèö¾úñ\£Í¸‹ßøÃ{fâ àä¿Ùwê7 ðï|)˜ÚÙ™IäÐÜŸì¯}bn6û+îškrß\gše˜Ñä÷Nk4¥˜fÉôë¾¼ïOl…r3Ú`ç0Õ» m:¹Å?5¹Q‘Á¤¹ü5“e1¦DüŽÉ­pîüÑÉívpÆy˜ ’ endstream endobj 2657 0 obj << /Length 1292 /Filter /FlateDecode >> stream xÚ­WKoÛF¾ëW¾˜LšËåC:ôà&q‘ ÜZé% 5¹’Øò.iÅýõ)‹íÊFO»œ™Ç73KÏÚXžõÛì×ÕìòZÆÖÒ]F~d­Ö–ð8Ë«]£ÍÙ¤³ÇÜ©jÕoļ*¯·jÄœ Çž+.øSÀ§ Ig"Ãáqš0°~èÆC†®šMWèr.}»5Ïfê?2Ä!?‚ȉqä.þ€®«¹#¥´ouר–÷ÕxÙzF7;½"G„nŒ²zúõ×ó…´{!º¼­x½ÏL§òìýR<'ðIýÍÕº·`K„4Í…MHįÁ°ÎôüYyÄ_#¬^cmß“m~³[ TdŠõ&ø±ÝÒÖ*i«†ÉˆX¨êX—gÛ WB'qw ¥ê:`ù¤ªIu3æ*T =)¶·¨/Ÿ(2Šh—µÛ£P™šÐà$ûêÉ@§|ð=Æä;;,˜êµêr¨ŒF]:=ðâ  œò÷Ž0äU›•üòmÅÄ}/sÂehï¶5ì-bká]ßvv€´uyΚÖMU0 s•T]I¡5½NTB[LÇdKÃÄ»È6tœ— ›Üéø«Øº¦Ê!#~ÚU­’¬EâCOXóÚ'ºj;w_Ø7M…ȹÏRÍ n†--÷È@Ð ¨ÑI¶~ è#‘Є›¡J Ê7 èçäС‚¡=Œ±Ç M ö¤ÀfÎhà|›ÈqÁĺ!౨O1Ý€mù@âÁÛûyˆß~Æ&´c€ÍÐLܩɱ 8}4=úüý9` LLŒñKd˜1 ÿ¡Áÿ²/-¬ÅRå Ȫ?V¼l6ÃQÀÓ"|œïV³3{–Ø¿z¤\ºFTR̾|ó¬!®\.¬±VA‰|õäÖíì÷'ç=­Æ#PxTÖÒ÷]…ûW½˜Ž_Kp~(éC0Å€ë·ºÕ € 3.lÓBêM Õ   ˜„Ða³MIkî@ç!4’z!š"°Þ¼¹êè’Œ<Æ}&Fà†E/‰Ç›xfú á.„ü2I“Õmuû€@YUð§¯Ä¦@°v­6LFdÀ£ÁtwƒåÛò G$z˜Œ$×)Ò kaw¹Ú+ÂÚž4`̪¹p`}€!lÏU:SÏ8pàª;öF—˜gMfµ…'Q“ª¨©Æ/ê,AäÙ7è ^ŽÃåÈA—° ºúèÞîp¤á±WwF7ÜéÒ©¶@.0k÷·âœ¯xMJ,P¤D@š858ûÒ~‡AÇSP³”÷Y¯YñR;ЫúVBö³ïǪút‚ž›)Ó•1ü>I2E˜;z5º&+ Q=´ÌÈrJH>;ÜSžÐÿÛOξu¼òצÑi—°ã‡ÿuòÔ/†1êá´ß4+̈Ó÷&ùÊ®p]ç‰vüc bRÊ®v×þ1↎$.&c -ì_й endstream endobj 2668 0 obj << /Length 1397 /Filter /FlateDecode >> stream xÚ­Wmoã6 þž_aÜ}ˆ4®ün¸½6®Ú.I7 ¹bP%ñæ—Ô²Ûë¿%ÊŽ¦›3 [&)òù"ÚF#ÚOƒ¯óÁùgi¡z–§ÍךIˆa;žæ›¦áÙ¡6_i ý–F#+Ðÿš•Y¾þzMK:ŽF¦žPÎGOóÛóÛoY±Cψ {H}Ó¶…Ѐ¨mÏo§%=¶½Àmlù°f£Î +–9g£±KˆþæÓÇÉ™°VÆà`èº(œÒqÙ…8ˆ”‡ÒfGü;qMôÚ!m?Ì|p 8(wYlª”e#ÛÒKÞ‰àð÷ "aÈ ;ÐP¾ü“EåÄ|Ï«lƪ‚B@¶mƒ.DäéG tATƦkX>š)تŠÊ8Ïúï|§S¡…{—9þVœ£±ã¸úýÝÏ£ÀÑëŽþpu‰WÓéänßlüfë³Ç‡‡û©X˜O®S]‡¼¢oýݾq‘¢oèø»êFÑ$ªZ2|méŠa§¼¿cwU*ü‚3„ÿ¬PGºÆß‡+Žþ6^æé®ª}äñ&‹¿Û‰h©µu^œŠdV¥FÁvI‰èÿÇ÷öÐSšÂ{¶9ˆf§tÁéôT¯wE¾3Ö{îïñ¨ÈóBæ|ÇãrËйPW75 š­ò4yë:-£oÎBà.ÕRáö‡ëÙí„àâLl,HÁñ<›‚qŽoK*¼ƒêäÛ\½ÂYà ¤ò»# 4¡p\‡L}+IÞ¶²º^ù3\QVXÖ84>ÆÌ8ÉV'—?zot„xª"„nâ®ça¸ — Ò„ã»Lø®¤ñ¥À’P@pYÓŒPÚ*Á¸H–×ÖU©ôÃ펀2­2ÁœG:Pè í.ôë(ôtšTìh:Àå°óLYY"HŽŽŠ¯é.â¹Ý]äÂë– ÅogÐ(‰”p _tØ®&Ìåb1D´":|z:—è<ÉÅ·ŽÚ¥»¸€LK†² ËEH>ÈfÈ%ÃN{Ùnü2/h+‘š TúcqBN¶Š–7,S¹g*§ëjÀ¾+4£É¹ènÑ¿©b*i‚V²pÈûyµäì¹bX’’:D UÙ™x ÚÈ „@›÷aT_Þµx…£ßà(ù5ÉK¤¥0\WIŸb·¬a¤6’Hi;L!ÅЊÎlXKðA€Å>CÑ”­!C #ñÿ’ß2Ç_wçe«g_meÍJæ‚OLE,Oü Ÿ¿Æyœ‰b„ʘªhÖ1¾cÝä‡èWìŸ'ºY`Ìsšx|ÃM´õù3Λw¹š?! .š£&pÔõØ}G8úi·L£?x Ȫ>”Ý‹tfZ^íÄáòßh‘‰n+ÌÁh.ÇòWñ²×–?²¾et%UU’be·öÙ›Y,O˜}ZØÄ f3Üäm”à ]DZ1·· Y ƒ$oœ}oÔ Ûìoµ¡¢c¦Ä=(ìmª8d›iÀ{lA±›A7U&™„¿1µæ`2<L0J4³¹‹Yv`øÄÕ¢t°x"Ú >¡BÚ«M5XÅw„7‰6üòa6Ë _÷ª©á9¦f«´žú‡Y…½ú–×* ÏíØ° m™5sI³nP›¹¦Ž¦Ä²¯_5öއ ±@('D‹Q‘#×X3p ⫸f<*âÝ» QOêºw™š8Ó¼P£áŠ•4N¸¢jàÊ뱘©™S Ÿ ›c„[%ð’4Ý«qíüVl´úqúnj²ÌòÏíÞïÝ3»dhÙ¾Ôë0âLz á]&<ÿ€{øtˆXÛ©‹‹KªÃ_HŽ¿^ú{ endstream endobj 2682 0 obj << /Length 1453 /Filter /FlateDecode >> stream xÚ­XYoÛ8~÷¯úD‘*JÔáö!M¶ Å"Ù¸{ í-ѶZYòêhâ¿32•l!M‹ ¡8üHÎ=ÃÎÖ œ_oV‹×o£ÔYúË$LœÕÆáAàG"qRÎý$Z:«ÂùÈx$ÜÏ«w¯ß&በҠw2wÃŒ}½ë[é†)»¿©\Κw.sá/«Å? ŸÃïJRáÇÇAÆx²;ô—Ɉûܘ3yïzQœ±ÇæE‰ŸÁ‰/Dfl’ðØ)qr­º¼-}ÙÔþ¿Ë15kæx|éADÛ‘ëà!ëw ?8kU7T–ÚlNVÏÌKdYËêØ•fצiéãæê’Ö»r[—Ÿ‚Hä²Î•ïz"JÙ[7‹A9SxpÊv4»¹º –C¸ƒ(··Š ây ²e“(DSp–7ûƒlËz‹SË:Ћ²ëÛr=heiŠ– ï›'LVƒêˆB }«Š>¶ª¶‹À)¨©F«ŠÔ²£qHbED¾/{s u ×îQÊd¬VWÆ.«®ÁŘªWí¾$†,‰¬ÅˆµD0vH¬ùbÖ Ž¿!«ª%Ñ€85í ÃÇcÁ€zsEÔOAhñ•‹¿3Â\«^–U@îSÒ˜ø²‡ž¦’ÿ¡“[5ëÂç.= ì—žÄ4ò©¹C|4å°YQy1Ç|QîAº8ØÏ4ðŸâ)0!`ÞTSàoÞ¿Ÿ=œ`ÈÉóFðW‡\¾šÅ?ìåÃø|x<FçÍÈŒæxŽ5.Ûí°WµAøtOZåÖ %Ÿ¤ÖIJJȬ¡Í¬wjh%Æq™a %læ€É•ž9Á㉟|dÁgßz­íwö ‡ó‚ðãKµ7<ûÒ?0ûl£ì†‡#œÒ´$ÁS?0›Wíg ¹úàzŸM]tDE p”5e]”ßÊbÍo®|úXíJ³e¯3ùqλ$å!@Š&’†’l¥I£4![™Cn¢åÆŒ5.?µeNØqšÂ­SA(sÃ>m X7·d¥úÞrÐͱkQ¹Ng˜wÃ8Öv4–?sÚ­c??3núqY;­[u¯Zn÷ËzӞЭg·N N.Bõêzã¿8h¿'ægGî(—OrÆ  j$Ø£¨N7I™n’ ÝG´š_Ê©. Ïfò/O>”&«ÁÆro|AßoYUw˜ÝÞÒ*¸&xDõýåú<¾ˆË¿ÿ?.OkÚRsãºfº’ÿÒ*ßš$䦷®éy»]3T…év‘©]cM«’N:´³žز¬+iš”-µlº|›~\lÏ ç4föUo¸× ³§™K™Ô¦1«Ô¦§¯Q× 3íÞ8Z eíë0;‘ ¥æ°ÝÎPA£j8‡ÙÊ3jº‰@±œNzN˜éžF-(ŒkÙÁÉ3’àý"Ñï‘ìÐ6¦¤´Ä{Õõ„½ô²…ôÙœ‰]Ÿ“LJ’¨¡ß9¶/Ì•õ¤IÚ·÷e>T²7 ”Ä]£=* ¨á†: I—ãší½ÉÓP»Ù.\ÚGdäCÒ™Z¨»}@ÙGÔƒ­¥½=m¨ ]Ú#-QèÉ2ÛCOüû¹ ÜÑkëé·Ab;¥¥ñ“—Ä­yã_ÒåTpŸn,GÿøÕ”I) endstream endobj 2589 0 obj << /Type /ObjStm /N 100 /First 981 /Length 1915 /Filter /FlateDecode >> stream xÚÍYÛn#Ç}çWô£ýÒÓÕU}[d J6HAÚ ‰7zàR³+Ú2¹ G°ý÷9ÕWTHÚM‰4èR3sºº¦îÕãC&ãŒÙJ¬æJ$#9(‘MàŠRQÄĬ˜âLöú¨)AÁ|\Î#PѤ÷’!vua¼R.A±!1>:¬ ”ÖF¤@ ŠØ£ƒ€â& r †2{½‡9e¥° øÊ›•TW@ G êbÅø”ÂS!VJ%ƒ R÷ @ë=?Ù×—¨û$#WïÃ^² Ÿ Á¬xèR|Q 8©»GÜ 1` qEu ,!)• '§BA¿œD™àM9?<Åú¢Æ‰0ŒP(Ué{éS#ØW©J­9ÁM½»JÓˆÁ«VX©T#‘” T-1âp_’Óý…@©•#˜ƒ…J, J’¹¨ÄMp®Ú±€*u-œf;<¤¢VÁ;Ϻp ²îåöª|xIÀ{+Å&ˆw#†Ð2é-xbPkE  B]ÆO‰ ü´.Å®¹Ê…\e‡#ÁoUv8'\*WÇ.…ñ0jt¬ ðêð ]€U°x] lZŸ"8ªž"žâu[¬ˆ1“ºK„ûá–â!fH÷€BcÊ ¼&QoKµ"¼%9Q}⥒ªI|+.›ÄU”TL‚ T1 Ž3:9uï~ýÜ›ît6›£îÛùâ¦_¼wˆtwÝý¹{Û}‡ èzÔ]ö“Á¼çL¶†}"›Õjä,ÃK}f›ÅwuÿaÏî¯ÓÙÝéÉIÝ¡; Óù¬»êþqùV¿º†ÏË7]w3ŸÚùâS>„Ðë~°“þîÎ" ‹uÁ:¦¯¿ùf„ŸK”,×dc‹º´ó6k*©²§×É a;A´K¾Gæ¦rß..Õ‹/ºeg R”Õ”%âmÐÔU²å;5''¦»2ÝŸæïæ¦;3_]~œÙóéìæílè?-Æ*øélr;_,¿6Or™÷ÈÊ»]šî_ÿþÞ”bÑ—¼XMÒ³û»»ë`r®¢êT¿{†>ŸÏ†*Õ9B¢ éÔeçHãpÎŒ]/auº€J à×],æ“«ª0ÝÅÙ¹éÞõ¿ æú¹v/ÆŸúQ÷¶ígÃR[™©—óûŤ_>ÔŠzïoýÍtüíüSõ®y;uÒ‹ñ«5‰§`µÙ×Z¥òÔZõHŽâ>©;luždS3o.H¯Þ·¢òo;ò9Í´M±´¢µ÷ ÿY-æM牱ÑyRÜè¦âj˜Šá°ÃTD4&jLú-ÍêY%¶á7Ú©‡qáï~—ƒwKDI2×O.ÉëÇÓb}h’åÍ›¿Œ'?^ ‹ñÏ:WÙË›ñòÖNîÆËÏú «=×ÁOÍfª­©ZYØÇV´c¤çVI3…07¢=C¿NŽ‚¦­k–„‚ǰüÚÔ¿óï@±œ·œd÷òXNù1–ÓAF¼~ÙÈm!בú#¯˜pÜ?ýÏýÂ~ßÙéìãüpá,H.œØ0¡«¥òå`‘½¶L¿qš·œ,ú¡¿ßõÃÐoÄmn8“ø/Etò¸ endstream endobj 2694 0 obj << /Length 713 /Filter /FlateDecode >> stream xÚ•UMs›0½ó+4>ᙢHˆÏÎôà¦q§O’2=¤™Ž ¡ã 7ùõ8&)½` owß>½]ÈŸ±q´ôlÂг=ߌ$Ž|Œ¡GB§àÚ<­òõÜÌæâxñEݱŒÓ&¯Öó›øôhIüƒ$ô`€ˆ( ƒ1q[ºšGK ­nÙ¾xHTÐbÛÜWü;rQ-.xà%Ñ ,D A>èRœ—<Ÿ[„óÛ< æ–7ϬPt‡Ú@‚¡ëwÝFŒ‰8²(êJ[‰+‚àí_u{)sÞà%g§4yˆNwoJÒ3 TäÉoZn Vpy­Š`ˆ\žÓ³À¡`á©\)mh+ëls[&?ê’ŬWXÄ[ÁÐí½'{QTMTÝþdI3·\„Ìêç%ÍþœNbã—¥2xï''D$¥q}ƒ@*^Šz„ØIh a9ßi}S€Èø:Ú¡4íPjÁÚs0p|"¼˜Vv`Ö¡Mƒô‰ñz¶âyöd7k¶ƒœ¥ÛDŠz2Ë»vY S>ÓÖáìŽq¶NØ4ZwŒ6[Î&6±®¸˜äüY K&vp:ˆLäêXUÙY‡d‚¥âÇr‘h§y9¤€ß¤E>@ºNÄê m¤U²NhÁ <¥¡ŽêE»êf£t`SÁ½ÞÓäy€;–g÷C£‰ÁÔ‚tä¤GKÔ©¶†¾}ùU€ gùo„d°âé+É–‹Ut¢ zdü¶ª‡âË+=B([š!ýŽ‹ùÉô endstream endobj 2706 0 obj << /Length 1957 /Filter /FlateDecode >> stream xÚÍY[Û¶~ϯ𣠬Q¤nú¦ÝžAZ4[ôa“E¦m•¥…(ÅÝþúÎp(Y’µŽÕ P,°"©áh®ß ioµ[y«^|{÷âå­ˆV KB?\ÝmWÜó˜á*✅"YÝmV÷áúÓÝ/oC@*|qØìÑU^®ýØi~~óú-Ô®N›¼*qó Ï~óå­ô\ÜŽëG°(ˆÙëz×T¹¾ÓèÑöéØÉ¡üñÊå1qLŒªÏÿWY3`¤q²$ö;-^“¢cž‹’ŽàƒjA)¢ñ‚ù^Ü‘UŸ×n:ðñ5w¦ßqw9 A±%󟶧Z§O×Ký>=¨µ+„pªíŒÒc!z;Þ–~Ì|¿w'8Ó0löj†#ÐF‘ü«6“d—mâ{‹½ÐÅE‘>©Z/³ŠîÍbžEºö#ç £Y™µ¼œQ0Lò°ãtî,„L™ú­ªóÝÂ`RøcñªÆ4ü>po„û.?ü¢6m6þ8½k*T@:YU×WÄ™ýöHÞRYügÒôÚx3O`DÂäƒÔWz¹É!—5|!-há¹O^ØÆ@­¶ªVe¦–XÙ~s°sò©Àg¡/þ½pæ¡Ïb.ƶߪ´ik¥kòÅ„oÖT5™¼óAÏpÂiµ"²-Ñ‹‘‹®ög1.™ ©êCZä˜Ýì š}µ¹B :–þ³4äJK†õÚa7½.›WkWÊÀyWíÞã0>l²*V0³Fùðænq6@œ.ðÆw]TO0æB´É&ŽcÇDK3ÿ¥e¶nWëð¿ CáhÍ–„Ž6£óÝß~6¨:¸üèÞüãÏhsÜ+ë¾Ç<Ãýy¹#ZöÕŠ=ñu–Š™ðwpʰÙ̃ µ€{’%Ò?«ŸÃbs–ørœ'N¬©X^Z8¼:I¸¿=œЉxfzìˆZ”ç™NZK@­´h;œØžÅË×ñÀŽ úª‹ªØP‹Ìë¨ µ“J(™oº]§;â•CÒÓöÆFšXiè¶€D%Õ•Å´õ¸@åEÃì—^ltÂe“/¸@êà„fÖ)i '-,© U›–fk7 #çnŸkzŸ¥FXJ«5ºµyÙgÄ«©iİba8in>úÜ»d 3Ö*ž8º©A˜ø¾£I’ ]¶œáŽJ ã8h…ã½¢‰yo²¸™€gJÍÉÒ8â,L¡*JZÈí‹´(æÌ4®ç“Ùp’V¬è’M\.xøkf”r\ò¡úCÀ:™W£}e4°ïö‰RHcM”†Ò6 À%¥éÐŒ0šQ ÌkZ¼¤ƒfK3Lý 0´gà˜ó×Å–Ò F¶”ž´G¦gÚði£• 4ç½ùD)X|BÁñ©Pcxƒëä(5¬ëP2ã:yrš4k$A$¶¿Ã•l¿¹IÌbá_ õ¾qï|×´‰ÿ¨kÞÿúîqì‘ð<îú€‚T>5qÛ¶(ì{s¢BSý˜fHAækZÂþÑî2ak6[¹3Q>àAÁ9ð¥Ú’pêžv1›Å•óME~¨«¢ëì{ŒÄdJËÍ1ß4ûqIµ^”Îi«užZç>P³Sªb’½ãÒbͱ¨ùÔéá:´¦V Îfap“XÁºªø8ÜÒ»qÜU(ƒ2ÎO_£/iQï«¶Øá ‰àœ íaƒp¨†ðt#"Eˆ¨‰C Øû;¦oȱˆ×ŠÖûì3³ºBŽ8 Y»š™ìGSÍ`KDèIî(š<¦y}̵%™ÉÈiÄêF=bcHî¼W; #¸ÃÐ1ûǘ¦7g¥SzlÒÒ®ÁüŒ «§ã€Î—²ÆlÎ;ÖöZi*þTCWÆX×u[{%¸uu å”;+FIïëîDƒïð¬B “-¢2ÆŽm´áà ê]74Ž—.+ÚiÛ ±W0a^Üß4쟾ˆB0ömÛ¶ÌN‘\µ @ÅL pçvÔ6œ7 ùjî@#9󃾎‘Âh« ÿ¹þ ¿¡ âC‹¼I q…¥r9J`'BÊ7´à›“âùUJ2!úKÕ·úÕì]ïÙí`È‚oS"&[nîoø'HÏó`èê$g‰¿ç7H¡ëw1çî{)}dÉ;Â9]ÀÜ,“±<¿íó" _ xpjJY«m¦ûà;›dôÚ§5€vš šcÉÇi[¸˜w-.7)Öõî£'d­Mâz¦b–´n¢÷Rf¹ó±¾´qa߯‰Ù¾cNHžô0ÄzÖƒÎà­­Q]Ñ–+SEÖܱSSMìŠb¦}¤ò݉‘¶MÑœÃIªxÂd`‹Ë˜Aèú‹bT®¿ ªºk,«{Ýy¤+dx?uj‰u¯ qtGnéݘ¶—[ƒk¢S…AÂS‰˜iÚØâ£ýU®ô‚þsÝG ¹ôA=êjW«N)½ØŒ±—¢ö§"Ó‘YRýœ9é4svÁ§]Ù£Ñm^nÞ–½ _›;µù_¡¾¿{ñ'¬2Ñ‚ endstream endobj 2712 0 obj << /Length 691 /Filter /FlateDecode >> stream xÚÅVMs›0½ó+t„™¢è ‡ܸéLÆ“i§—4bd Æ©ÀÍ´¿> 6víÆ$$í¾·û@ÐôÉú0µÎ.$C!%“h:G”Ì…D>¥XòMctgOØùùȹŸ^ž]p¿³™‡„C¨jå~¹É"uôSë‡EaHmKŸáÏ–ÖÝ=A1,^"X ô\m]"¹}Q†MÑõ¥·y¯Ð ÑEO –‚"éy˜x›èÛƒÀÙëHmhL˜{µÒË(M~+Çå^`7ç‡ EŽ!d€“²KbÏçÈXå3<É*ëÁ¥Ñë Ka˜ÓŸØJÏ °àÂNj33Ìj~<*—Ú KµhîXç¦ç=¤n™†,¸0ynóh¡ñmãí7«·jÓ7â‘ÕÃw5+Þ9®Gˆ1†gô #½X/Uæpfù^@û˜ü‚éUÚ—°™5z¹Qk¦f«€-í½ŒnÁ¥>–3q€êáIGewã8)Å¥&ùS¤£¥*”ÎM#‹•y>aãd‰w+X0‰ˆîŸZR{¡hz ˆŽ³d+ÙÖƒ\4Ä?¹ä˜¾ÕôDv\$?«õ4N@ëy§ûZÅëYƒn§Wø©LK;Ürm‹¥žgêÇڌߛÛÕídÒY}T¿¶–ÿh|~*ãÓÿëü^ëK=ÞÝþjÚx?k¿dÇ‚ª{v0¢ Þ=u)æunõl$\jå¯Ú6°Å.Øy±Òu´R\±šGë´0G’¼N“ƱÆ)kdr4»Rso ÷è0ß.e[NÀ×=ÒC-Ù—uØãÓP¨ÝïÚW'”v”®Õ_ü\«b­³º`Q. ½@Íðz«fBb* ï©ç˜Á?i|Ôx¡z¡ Á†—÷ R˜|i endstream endobj 2729 0 obj << /Length 1199 /Filter /FlateDecode >> stream xÚ¥WKoÛ8¾ûW9Q@Ä¢^>ôí&ÝA±Û8E‹l(2í-¯H×Éþú>$K.ãÈX©áÌð›'ÇÄ[zÄû0ùm6¹¸f©7ÅÓ$L¼Ù£„`%^J)NØÔ›Í½{DYæÿ˜}º¸NÂ+‹)žf!(ÒL7ù£„âÕûj+$o„’™{ÕÕlòτ–x´»%ISL“Ô+V“ûÄ›Ãá'ަ™·Ó¬+/ iÄ`_y·“¿:}‡«6%Šú¦P‚“ˆzIB0 -ÊW‚uñ@:ëhgSÂ^ù‹ST´Zà+CõÚ¬¹Y–ËMUË0‰å‚+Á¹9…Ö%AÖ§†âöQ”aŧøÈø‚8š„“Ô†õw.ЦÜȰ÷=±÷È052/ fYzp0ƒ±¾?àKûVåíý¾˜›Q´>€Ö¸uiã˜%æÒ;‘/¹í¯è‡ÙТωð7‰‰Rªù0BfDZaTÈÎõ!”s'yôÎ,ŸïnnœÜ•‚1’WlªRâÇ—7¸­§¾Q‘é±Î¾Ü]9?ÖÏÆëË›[7ç’׫ëÙ üY—kyæØÔ¢Ô 6Zñy™¯ÝcMú±°6AœèÑ,±:.›åvÅ×> ‘G³å,éJó•šH“~ ¼4¹|<×#—ÒˆÀj hŒ)m“m<ŒÏùŠÛ"\˜õ§Ç(oÊü±²'ÛÚ¢¶° Ÿ¢ºª›r½4gžºp÷Ù#пúC¼u34Àj2å\€²6„Jw¢Tu¢Ñé þF|8T ì¯U P \É|âÖ§n¼é¹®ÔG»U~edˆ+Ê(zôáëÅŠZ%‡¢.›z»ÑÁ C‘ÒTeÈb[ÖÝ“fÛ %aPÁμféµÛ/¿ØÆ ‡ðÞX‹¼àòa×ä›c†ÅNH÷ò‚OG_0’â,6sé²9(¡vuç…鞣½'¸íKƒn2…Á#nyTï|üY>tÊuª—¾eo“»hx.mծ˂W/ÈÛXUm÷c~,×h鉫ŸlªýŸdi‘È<=øE•¯‡#àBºô`àêòÔ’êµ-×Ps. %W CF¢VÙúl G×s³×E¥7àC#Påó=k]Ѿ'µmØÿh¶æÔm ¶Ã—†ðí⻊¸sdYظ‚’^9±YtoìhÐhïÔ¡EB‡‡B±$Ó¿h/­ÌA¹0k?¤êûY®}ð"RÓ6„ £gÿâ¿rUxp•]¡µI@‘Qhö¦¬àf™ÑGHÉ…:ÑÙšçðÕ¨Lå°Ríά,@ñ]³vê{OŠþÎ¥Y;†Á†T/ö<耢áÂfÂ<—¹}X¢r­B"‡›u³Öâ“sÙSã²âêY6-¨¼”l§y htžRœÅǺޫh"œv`Îíà´-”_ž Œ\8ºlDpºÿ¡&ʹkDd$ÄŒ̉_ýi‚òjËOúý“>íiò®”OŽqæ u¿5ÛÞr•0&]V¢~e¶¥CkŽÅɭлïÚ<:gÃOÛÿŽ) endstream endobj 2743 0 obj << /Length 1232 /Filter /FlateDecode >> stream xÚWÛnã6}÷WûRX1¼‰"Ñö!í&‹.‚"m’¢Åv(6ã¨%W’×ÉßwxÑÍ‘6I "‡ÃáðÌΛ?]/NÎ R‚Šàú> #ÆE‚SÁõ:ø^¤wˈÊPç—Kø”Ya>M½ürýéäœ%ƒýL $1ëv'aÊ(-°?ðäœãvÔªG4!s›ÎÓí.×õhçÜ,ò@ÂfÁ­ÿ2ˆˆD„z××i“þcünw·]ÝÖÛ4ÏßÁœÛ°?"©Øëîò²YF1Æá‘û~ȶ— 4Ê»ôÊ/ÿè>½É9‹œÎÎ÷u£«ÚXéhm€à½fëvÅÂ*ÔðZœ!ò°~çTF7çˆKÞ*dk]4v(Eœˆ—Ìtákïµ8»^ü» Æér$V1’< VÛÅç/8XÃ" €˜’ÁÁªni”pc/®¿ÍFÑ&"ø1HDÀQpĉDœ&›ý ²?no<µ7gn¾$áã2"¡€1 €¥5È-F©tk©ûô À¤á˜ÄæTÃ_ÅÝ©7uºÑ¯'ï„ûâY¸ y,Ô}'"€SÅqÏÛ÷ý† vëäRnL×#*þzsq1©[éÎGªç§Wg“ºÅ~ —*CXǪþvOSª8ž4‹²âhâú-I_ ËiµÙou±d4l¾ý¶¾–Ž 3Y˜`íÙ7“I6ßYó0ʸºÜŽªŒÓËS3y2ÿtu\R†ÎFþôˆ”0:L„7ûüÕ·jÊÊ9QÞ{÷-mú2h…-s:Våß;Avß=³LFRu­É½‰j ¨+Ú=×ï½C–çn´¯µs,Í …ÝØ8—8ç’Î9˜9'ô˜Ë³0RH‰‰Ç‘Xó&bpL:anqL¨‡*ñO0î[ ç'HŽ 6*fpÝITc‰¨L^ƒj> stream xÚÅVËŽÛ6Ýû+„É¢2PqH‘Ô£híd¦hamíY¹FAÓ”­F²TIž$ŸK‘²ÍXN2A“. Rä¹ç>xyhìm=ìý<ùi1¹} ±—¢4 #o‘ycDYäÅ„ ˆ¦Þbã-}Âðtµøõö! Ï ”cDˆzÐL=MÃÄWت¹¬¥M&Øzº}`øÌ6Œƒ0†Ej(î߈².TëX^‘y G¬¸HŒ8Ž ×Ftâ/ÌñM½.åßm)Šâ¾‰æû€`”r›_–Mޱÿ}`ÆEU?(ÑÕjŠjý’ÙúÁ 'ÒåÒ–&=&f(a|(Í7âÄËK訥c¡è«Õ1½€¤1 #âf)åE–wª(>7ň šþ)&%ä½ë¢êÜ$í9Î¥è:Õ|4ÕoÍBf¬ˆƒÊ²%Y¹€ð}@¸ºÖc3±VÅïU¾ïú‚Ÿ"b€K^÷(gWÊwr¿˜ü;!@=r¼®<Á( SO–“å {Ø„à€ïu-=7:fº–…7Ÿüqõ^õšgp¦ GĈÇ#Š£Çë~õªGܱQš£LL9ñµ­Á~ Rûs©?«~±_Jü;QÈC!º¼Ú oN†zFÞ&?<¢y<Íɉó¥je“×G÷—òãꦖŸä‡óÅ.‡ õ³Ã^ö,ðÅ|Y•õ¡Sv¯Û)3)ÎÄÓ[]× ÓO„ÙÛæ½7«Õš$òM[ë…_ìxh ;9’Õ^ªÚîW™õõª§ë¤vù~{l` ÌMFb¿™Œ0¿YUšyÝTà›÷¾!ÇMƒ(‰ {eöOÉhðð”ot\zEØQÛ½7y)N]eÇÏ­“^±u øÐêLJûºQª±bJüB¬ eJßP âïÀSû <äÝ€²åדB4[»Q6¹T°Ñ,çqÓÍFp!í]ylu¸Ÿü¨]ï*çÒÄÌêBè\}BŠRbì^¼0ˆ—*‡Â Ïœš±TÝ®Ú|7V =(í_l8Ä1±o_Agí9ƒž¹èÈ¢7yéJßo³Ù(±‰ÛÁÞU‡}7ïýš¨ÚåÆˆâZ¥\bÒñ  >ëªUxñçãý(È<^ç´‰ääÜòïîËþu(DÛ_×séeˆÇäò}=Aع6Ï»Ím+ÞŽPÑ%üƒLá)b˜þ‡=«ƒø×è § X]õPˆ·ªq 7úéÍçugôE»Óþ§ùÄÚö2w{ùBÞà p%K endstream endobj 2766 0 obj << /Length 982 /Filter /FlateDecode >> stream xÚíVKsÛ6¾ûWpœC©™ƃÏCnkwšÑôP)§&š„$6$¡!@'ù÷Y<(‹6܈3É¥›ðbw±ûáû°ÆÁ>ÀÁïW¿l¯nîS¨HilwÁ±8 2BPÊŠ`[‡kþ¸¢yȇrÏ7•øêãöÝÍ=ËÎY‘¢3HkBHL´Óv'ÝÜÇñ™wIJܸG Œ$·AoÞ¬¢ãpÃì·ãê j»Þ‰Á.ª¶”Òç•“%™ øÉºÌNQ‘Ÿn¥,¿zòPðÂÙ¿¥‰H£8)`AP‘$'žú€¬#M›;Їx¥Þšm<ßêå'®ªƒmôgû¼ž{§Î»n:9óýóýzíM|ޤóýUŒ½Ú˜ó¼!;ä‰zõ„¶üʇ™ëu]ªòÚëÌóº1J¼JÎçÇÊüÇöBò™óö¯÷w^ç/Õ8ð ±Csä¹K¸g2ÅPL&?€É>¥òQ¹@yž‡ÊËÎäÒ¨ë"|/$}r9é{Ëõe7'ÅuëºCR·çç§ôyhÔ<öþv½¹û__?@_@[<£mzKÅ®‘Ûa?v¼_1*9<ϿϠ‘±ÊªFô¦È8üïʱUÏFZ¨õó…–jž¶Ep’ÔÀ™àÌL$9‡Óú‰Ánh"kÚœs¯_€K¸à •ñ^B×ÒÚ ¬`$5,ÿpž¯ÊÜB\¤¯Ü$l˜ÃŠg‡Áߟ›¶u;'° wµú{qâJ´c7e5WïÂ}#@‹7ñ‚€*µü2ÝÛ~ñmÚ»igF·šÊYxhúý µZäh¸…·vå’sÅëQdذyÒ$^Þ”ž+KøI)n…M¥©‚3ÛªÞâàYI©n¥…©ÜWnggíÔ^®^hažD©õgÍû¾³¢%¡y3z)ú˜&ë,} lRÚ<”£ý‡ëż<'M]âÒèx óò&Ëñ3óv‘ÀÓØû^‚¹1¢ÞË„9\õ–ë,M,ŽÚ¤¦=¹]ûe{ÞÃm(1h2ú„‚O׎dð¯òNÞ»íÕ7eÕŒ‚ endstream endobj 2772 0 obj << /Length 1257 /Filter /FlateDecode >> stream xÚÍVKsÛ6¾ëWp|h¨‰Hð•Nnlw&U;®#·‡8ˆ„$Ö©‚”õ×w ©¢-ײ{É…‹Ýß>æÌæüÔûqÒ]±“ziäGÎdæpƼ@DN̹©3ÉÏ.~ÿËäãè*òTƒæ!Ø1:㢺ïû‰«òë²nÔï1ëf7Ž®„800 G C?Y@v”žÖêì„1޼4ñwޝuQ¡ã¶? ‚À]õ‡ÜÕõ¼_œ*˜48ih]V9MòBΫºi‹Œþ—ªiä\5°<6£ï~G¿`÷£fg[ž^ÙºVûºŸ×ÎÇ&)6C-áÒ1¹Zi#üZ,¡òëŠl›nëZÍ!ÌÍ~¡¨H^T«uK¢f%u4C¶Gy,–Ð2†B÷ã9ºúð US ˆ`~ÇüP„ôsÇBæ3ÃÈm§ñb°É äÙéÍ“bâïEÑþZ]´íªy?å¥'³¥Wëù(¯‹gç"Œ§<ÿUbÀõ"&œlÙûü…99,^&ÎÆ¨.|Ä"€yé|êýö$Øá»¢{,@ ,öÿ}3{/ÀC#ììõ!3ùþò,šµ,‹¿M§¶~n Y’€nø8q³rmzX •¡tSs#À'‡xV”°¿¤Æ~òu†y„á#»¹l%ÍŠ£u†‹aâ–x(c³"ŒMªí@¨`÷A‘òŒ$Kµ©õýó¡óR¨®W„†BÀŽ<íDyá®M_¨&ÓÅÊTÌ*ü ~*°„(~ÚÚ)Æ¡… ù¸Ð!Ÿ´h‡på&0}äÎLŒÐ.Œ’l•ûg'²Í° ±€ÁÌv;‹}Û§­3 „…pƒ¦l$·G<ºi1éÞâkñ(g/<{sHUpQ,±ƒ,5OâºzŠ­{p 8Ð ©2æþ@ïUÜÓÜÑþõv<>ªÍ/Ê“U½_Ý ge½Ö{68v©Îu½^yÓíi.d¹ZÈŽj†|A/ØScòÝšÕËiQu‘Mnn/îðÙ& ­!?€ê; Ö½IŸ XôbÀì«ö› fô–`Zûô$;ÔÆ–yöÍ„òIaB¯ý¾Z¶# endstream endobj 2783 0 obj << /Length 1568 /Filter /FlateDecode >> stream xÚ¥XYoÛF~ׯ ’‡R€I“ÜåÕ ik'-‚ÀÝ´@4kj%±áU>úë;I‘²H( xg‡»³3ß\»rŒá¯?Þ,Î/ψí8ðãfm¸Žc ¡ëÚˆ›•ñÁ|Sª•ëüù×u¥ÚTeËO7¿ž_Šp²MÄ9„ÒW \´púsÎ/¥3Ym Ë-/¦àM/ëM—ëb)<³mfÛ÷G'§:G ȱW² òöo´{ ÌÔ ;޼AÛ—KKa^ë®V-ÓåíÒòó€œÙÉV/ÈrC;ˆB·JóæøÃNÁæ&-‹fiI/6Û’Ç*+Û3 }aæK/2»T“Â1A3/45OT¿ WÜã¿ÒÊt±i·Ì/hg®ë4aÆÝ÷&mYó¼©@Zœtý˜f>X¨>(hAÄ~ÀŠªbÅØ9“2¿M‹SR¿¤FG›,á;tnÃdÊ^.y¦xMz³á‘·Oûr¨Ü÷kÚ-µw·æñæŠýýâŰ@çš|гû4Ë¡TŒÉO ·þÂ(Ýï <èݲ1tï¬M«¬¯k¬ ¨Šk‚·9æ\ó|Td–Šé }>û5ÒñØO¢o^‡îÒ¦ƒFû¯>9‘›§=ã `söå;_zèhdöæ@Äû±@÷üÈ):‘(Ôž¤uàB’´®!ºˆ‡ #);¨¦—‰BˆÄžp(]©ûP=¤ÆB7àù6–Œplßë1x¿C¶¸ÆÎٿƾÓ`4^ E èR7žPb@…ðÝjX¹w‹ƒñ:>IÅý{»´£ ÖaI wy')Š š¶ºY€o4äKͳs±7þìȨÑF&ß=½±ËÈvœx’ù¨ßûñc; ƒa&mˆõ´¸OL¤3r%¤°¥Î=Xpj}ÊÒ¦·½Íf×Ü'€æÇÑaSo_<¨’üÛo—Y E ,ƒóÝœßgðóçp¶ã˜o)¤¨»âû100kx›¥Å½ê{ÆvCÏ›AC°Þu¹ë7Ovžñ±C%¡ÉŒÌDñا„ƒS¾£q·DÚ2’Â×ß|÷ÅÀCPxGKí²<@-€ó°c7š£wQ¬Ð°)ˆÃÎÅÅÍ⟅KAêŽÏ^Ï8¡‘䋟c;[Ä‘qOKsCBP…s+3®¿}ÕÁô¶žG=x pXìÚ®ûÕ§õ$D¶Ýƒ ã¼YÂý ÄŠRÒ¥ †Áu˜x¥‹2O“†gïÓ&ír¦¯+ÚG'ãâ8ðP„ÇU˼´ &@‚Ÿ–RØ‹üA›þñÌŽjm gɈ1†öÏ냾pƒÐvü“|Á˜;~Ïp…k±×¿¹u“ÔiõäzdaFŸMʈè‡z2AØ#âøãB5  D›î75¢ñá5> stream xÚÕY]O\7}ß_áÇæÅ×ãí E"‰hSµR©Ôñ°Yn ì¢eQÒß3&È.Év›ö!Ê\ßãñÜñ™¯%ja×èD]Ô""þOޏ˜ Ž°!»ÈÁ,ç†Å¾hàÊNÚ«\’:"’äì+ÉeN&¨Ë…LÈ®ÄlBq%3ŽVW©ÚBuUÍ!8 ÔÀRʶƒHÓkÓB´5¼ &±£”Ͱe“ ¤TM|C0ÍPJ•Ú^¼ŒG²ï&U{Ë.F¢‘À€Û±¦‰¡ö³˜:–kSˆ91åRÚ‘¸m6eÛÍÑ6Dû(­#¼ Ÿtæˆ%Úsfm_G&{ÌQàäf°PÓ§ŽSf{vl3üÏ9)L©ŽKˆ8_ÇELGHÕœÂæðæ2†âZL1îG·Ã2¤f€€ÔÞŒË5ïC•ˆØGŠ@ªv.Zˆ"ð$#J†?EXÑÜ”Ñ>/Ã’ÕŽHP\ÚM%x°hÛ©Û‘Ä¥‹q©ºD±­)¤l_‹»IÞ2AÍy©¸Äv«v牓¹VÁ6(Aj¶k4ŽÚlK‰í2’I¥íH.‡ Aó%i`-^šy £J5S`…†`ÆkuJ¸/"@4ZôdÐZ™MKH…G‚›W‰f^FlH6Åp&#GÎRã>¼¯ÚÈê(M‚âÜ_¢ÓÒÞ"øÕŽ%‹i´µ5ê^¸}Ä%!¢w]÷ÇŸ!z‚g܈fñF·éÅÉÉÁèéÓµ¢cö‡¢q ÞBpZH¼ö0täì ·2 M½²ÞFï̦ ·µåºÜ_©|¹m¬© Ýåè_ÿŸÞX¦¤+¢¥€ö…Ý«ùl²×/ܾë^½ØqÝëþãÂ]Ÿõúï³/ÆGý¨{ŽsûéâÜ’žØþQ·ÛŸÏ.æ“þü2¶µßúÃãñ³ÙG·°â¹\ãϱ@pª·§Ó´í_fe³ç‹c`Ôí]¼Y´ç_§ïGݳÙü°Ÿ7åá û¹{Ù=ß§ö`öLð%DÙ#c€£é·Tà[¥âKa€¶›óö\÷ÓìõÌÁù?ì¾ú½ÉlÞÿ2ž¼ß[ÌÇž˜onÞΕ›ívjm—ƒÄçS]u•7Á׬ WICÑÂYx :Uò–†¡‘¾<#ËnÍ ÞŽÑH;ž¨ÞEï[Œ¾Åõþ ×Jït‰ÞV¡NïËÐníÀ'×Iø’·Z¬T½å”wPQã> stream xÚ¥WÛnã6}ÏW»•5-êJíCºMZÁˆ Àn‘Ò«•%W”6I¿¾3J%pZ0‡äptæÊ¡;¹Ÿ¸“ŸÎ~XžÍ/ýx’°$ò¢Ér3á®Ëü šÄœ³ÈO&ËtòÙáA0ý}ùËü2ò¬¾°€û ¨eº*eÊÝßî{Yg2Çg®ùÎü2p'gÝÑ™âOn´¼WÖ±—F 1 ä² £H¾¸¡‹bÛðMÐ, CbMe-YšUZ×lF´¹ÉrUÈšÎB×u¾§á¬ÖªRéÝFɺ©ÔÝj}·“u•=²møÎd¾"µ–O¶ƒmœ_çÙúè«íg_eÓÙ?ö‰O7WW£Ü„ŸdëÈòúæbôH]²f¿W•Å}y~µ¸µ[¶CGž†1Ö.ÏF|~ãvvð »}ÎDèßyußìT1õ=§Ö¯ÆÏKq“ØÁpºV~ÄK„×ÅüY¥ÖuYs½(qÖe1õ„SˬȊ{Z«· áüÒÂ×rE´ÞÃ(µžr'à •ÒÆ å<í-Ì gA":}ˆ¶œÒÀc¡×3Ê"µð$à%øhë(œ¡îä rÓ–/²b Ië;’ݬZàéA\^Ë< FP»!‹“¤£GJúÕc±àH0.âç žæ“OmÆ"œrC#Z*Noùê‘«p­5 &³iš‚ÀVè©’t7û&‘ŽÊÝPû™h)F5áheÐà› @Õˆ °k»Œè£èMШüüh›²:¦!80¦qÑ”…€È´F3ƒð pqTOƾè²OÁZuqR»MÄY])Ù)gg4¤j#›¼Öd…Ú°¯ñ*âÑš‰®À½É9vù>YÑ_‹Ü$é_S/v”‚HÙ‘ ʺ×^ÖDmÛúÚè“Í¥ŠNMÀ²ËŠÎÅ¢†Í8û ¤:x»QoV½¿†NÖú#eùWüSU« €ÌÈ1EÄ0Ïa‚UFÙªc³G_£y v8Œ@jÅàbKBç£,ˆõ 1žÓjÓ˜or[ìpÁIÞØç³Üî†Òµ,Ö SL·™5ó#·ÍG² ’ ¼¹Ì¶¦qE³e\+ÌHÅI½-›Ül“u9£ËSæEññÝ™ªÇ.C²zKºÄá@—0a:]þ1JÈ<¯¿@‡…îH’Ÿ@gÄ-I/:• Π²‹¨iÉNK°®÷«Ԕ´!¦ V˜´¯$~LL*Läõ3PIÀ;ù׊Zùmøê{‚‹ú‹Øî o§I¹ÞŒ¿)ŽÃòè q>ÚÅÀGzÓ.TSA¡|—¾Ï<·à% ?;“¬ë±ž6‚xþÈÂAy©O :cÊÈzÿÞ4âeMDÕßö…È…`ôÀwØ·\ßÍÌ»/Èýa/÷Mo¨<îDÿ.„^o;¯Ë9JžÆçr/Î×ÄÎxÁÇ=qžéša›ˆYïvø© Fó…É]¤!ˆzõ17fŸ‘·eÿl¾x,FŽNæÂvÈE‘¢Œ¡_žµÝx±<ûjPä˜ endstream endobj 2804 0 obj << /Length 812 /Filter /FlateDecode >> stream xÚ½VMSÛ0½çWh8Ù3XH–,Ù‡Ò:e˜NKÒ^€ƒˆ•ÄmbSÛàßwõá$Bi™ÌÄR´Z¿·ûô‚fˆ ƒ·ãÁѱˆQ†3 4ž"Jf\ I),Cã§•ʇeY…qÜ}*s}^ŽOŽŽ™ÜÚÉ2S ¯ÝCyb‚Ä¿êÃxðk@aH]¿EH{$š,ç—å°x‚`)KÑ ]"@$7ih4øºÎ·û´T8ߦB œ"‘SÙ§²¡±Î•HzÛcœ¥´ãs&4¨Ì—ÊÈ%iÐεÈ`ÆI`rºiF4°Ùíô‚0¾ÐöMûkÀ9¦4}N W²§m8g™pßëfR×mQ•=¢½†ˆf˜óxS* À˜g 'ܹiáYÂpÃrYdÒÆ)N3/¦ošé½xîãë÷s¾M+/HBª«zÒ†QBH0-~¤OÁ4¬g«¥.Cmó(¶?`rvdÕ«² ª¸SÕg]ÌææX]…(¨jWÍ ¦‰öäê½=òÉ"*1‘Ü¥4¼Ÿà‹y¹jç¾ÑFºU¯£v|Stª³3å^{*œq‡l»ÊßÃLj±Ò£Æ3Ý®ê²é ’Ûú…4˜Qî)aâJhCo t4øFÑ[nÚªÖùÕ¥–Lü_³b2Æ”‹Âß­ê¢iýS×/r+›Ç9ÒH››Ñ.åªUЧ<û7þÄ@2N_æOlן:n0ëÐÐ3šÐ^ ÅW5§­Öw2p^ÔÞŸTÓ¨;7|ã£kÕjqðê¶ÕA{ºo,*{Ú&Êv/b© ª©{ÚZÄUÔpüªúÎ-´sÕº… ìÝ­*쉶kº[Z¹5¿°Tm]ÜBÍ8¡ÁL—>¬TKݼ€(ýeIâ]©zâÀåº92¦2P9Û“¯J/šâ\”¥'7ôÖ~Øàg²kôÓ¯`æ-lê=lݺmµþÙ7¡P­ßÒ8m‰ÞÙ]õ*=ô›àƒSTÏP7<»¯@‚e¶¶«‘^ÕêÑk“1“´‹_ßpÐw®È­ÿ›¿K˜£ endstream endobj 2820 0 obj << /Length 837 /Filter /FlateDecode >> stream xÚ½VßOÛ0~ï_añ”HÄØ±ã${`Ú˜„¦I£Ý^!“˜”&%I·ñßïl'%ik™„ˆ{¾;ßý² Z"‚¾Ì>.f'g,D1Ž…/ÐâQB0ã…”bÁb´HÑ¥C¹p¯ç'gÂï©2Îq@}pd”¾–2/܈9§+¹Ö3Òžóy1{œQXD·GˆbNc”¬f—×¥°yŽ`+ŽÐo£ºBP„œÁ:GóÙ÷­¿Ý¯áÁyŸ%XpŠDÀ0a¬q ˆ[ÇÝsê”úŸL]‘4Ãhº¾p´/#Le#×i²œà˜ñCÈZRd"9‚PÇmr>©:©²u“•Å€Ô3¹a‚#äù€ÅïÅ0æô“g£žvÁ¦>µ.~Ôr©&Ïc&iK›Ÿ+íÒh38UÓ¸pšUÇF 7“rS45¾Ëråz!Îû9JTžßÜÊ*)Suc´pRÿ:št²T…šp¡Åõ„•°V÷›<Ÿ03ò7/–¨¢©Ê,m·^±–u-Ÿ†Vóµl2™Oëg+­¾eo"Þ ºOœVËÍJ.ó¦~µþQ]‚wštPÇ¡€ÝŸ¼t=?riÚÀã~à”wú+lÛUV©¤)«'û³¹—]%`ÖÌŠºÛSÝÖÆîµ+ÙTÙŸcøÁcS&V\È•šŒöã½¶†üÛž’…é6®“nüêìÚ­+ÂxõµÃz)¯¥ ±ÇBˆqÉï1Øž«õ|~‹Î…‘C”¬XZ½è‡EëÛ°t~=ÒUÍ~TF÷NDl õJû© \:‡±‚w¢ÑUYOÛ4DY¥Y!›>12ê¼-=ÃIõ^µ6ꔵåVgºÛÛ ´ÔÞFˎнé|ÑÑ4§z¹·s)ƒXYmgsï†5ðÁäÐ*³ƒü?Pwsß oá2ÎLÈ(LÊm2z¨§Ëkâzˆ¹Ål®‹á§ GæuÐK…·×Kk8BÕuË‹ñ…Bpopsµ©`Ô¿)€è“¨Ó7¡œÝ' ¸&Í=aß`}zs¥#¬Qy]¾pîƒ~‡øÔ“u÷ οªêâD endstream endobj 2830 0 obj << /Length 1199 /Filter /FlateDecode >> stream xÚ­WmoÛ6þî_!ø“ TŒ¨WkCdh Z4uÚm1hmЋ+Q‰óïwÇ£lËSbÛóHÞñîž{“]ke¹ÖÍäÏÅäâ:ò¬„%‘Y‹¥Å]—ùAdÅœ³ÈO¬En}·oë4ÿ&*Ù•³Ÿ‹÷×~| á'›»>¼§yy#ÓÄ5*®“_¤kñÝëQ2Ÿ{VVN¾ÿt­.ß[p•Ì­GÍZZøla}ž|Ú½w¼j‚àÐî²(àVΙçùc.ì¤Áûp ê±dÎ{_îf!·þ¤ùÌñÃØN«™Ãm³¹Å›z=·¹»%âf‚š·.”He@´tm,Ñ´¬œVªŽ6yªRmà8lAÌ/~ l;áˆÏY™¿mÖÈ’u5ÀgÓ æ|n9 ºFüNh|ÒD€€Ï)Ø.p}#ªº”YK» @ïa€MÑéêõ"æùsÒ{ߦ+1jð¿æÈ‘ûôøá†.¾¨™}àâ, CâB³X.›7šÁ^.뇙º®ý––)LG9Ó¶MŸ†¼¤{œ½¬‹–ýz`j݈v]ù@ÔsG…2Q,•jj™·‰ÅÝýÕP&Ú)YW–Õu“Ë*U┤ÑÖŠU ºRÌŸ¡È‡ûÛÛq¸ ¹aÛ! ×—·Ÿ¯4³3‚>D†÷/y>Kø>÷^]tFèêN ­Îð©é¡W•B­ë"D+SÕÈí~+³\Ÿ¢£*ÔÓF C¾ ÎÿõQPOzªÊ.›U@Ì|Ïœ^ª¶UÖá¨ZKAöúüN6"SuóD}!ƒöäÍm•ÊJV+ê-i}¦ ú°¡@P7"ú‡ë…0]çQª5±çb™v(®hOlUZŠöÈÄ[ޱÑásc¾/ÿ³ÝºF/>μØþB6¡ÎóU¶‘³u^;ª}"_A#Ψó”ú,rƒçòò´ŽÕpW¯ev<àÔDcO5iEˆö}'jiKC*¥åÓZð¨5Žf¢äî̘ÈfΜ'(5R3¼¥Ñë¹f›­Ö‚ˆVÁPK›¼?ÞÕ#n»Vô5­£­jºL=ƒ™(ó°UUw”×£@wöê„<šgçÉ×5t:ј"2+}Êì+E; çEÝ~㞦ș1½Ï˜Íá ’¿0„ÎM1ï?¹Ð«¦ÝFnEï°‚GÏÙs²R‡ãñìH|Ôù€ÕK\õÌ( œ9~àÛSr—¢k§†¯!>ºt‚sL; ´qî…4ðÀ©‰œ¶€ÐXìMÆ`­Ï³I3ú±6Tä*5ió5°tRÝOž×uX3Ü^ŸÉA4×àZÕŠ„Whú¡Ü˜3,V$¶ODèÐÇ¡§Ç–GüýàÑ—zð´;-ã5!FÐÕ¼„Ûk„>¥ÜôO÷ ¼Èe»)L×+°Õ౬híµ¢ÈÕvSÔ †¯ÁÇÞài¢½Æ[œlŠ„j#¬_¬»†vÐ}…07ëlJ‰†½6Õõ§ÔÙZh×6¤¯O•%¥J‰µª 25ɳÙúòmàóïwS¦èÑÚ¬F^©(³í D°ŒÂßF?jà/Ø?¤)Ía endstream endobj 2840 0 obj << /Length 1594 /Filter /FlateDecode >> stream xÚÅXYoÛF~÷¯ òDÃå.¯}HÓ¸@­£’  È•Ä–"Õ%i;ýõc)‘2ãÆ‚€¹ÇìßÌÎÌÊw¶ŽïütñÃêâù•ŒÔK£ rVGø¾'UäÄBx‘LUá¼w…JW??¿Š‚©Œ|/RŸ‰Þ4‹e¸yV½íLŸwxâ·‚†ïó+%G,–A{AÁ †EÉœ>Ÿœ>Ó‘FƒØ~àï³Î”w0/K¥”Ûíôb)¥tó¦¯Aìv-Ï™òŒùT%æ¾ÊóÃ'+T榩ۑFû¦Òy_Õ"¬S”uÖéö« ž¨P«·{ H$n—ueSÚënÇJVË0½tU¾~ìb:°nSãFâŽòÂ?ô7ác¦¯[^¾Ý•9ÊÛ¡ž Ê* CV©o-{$é«®\î-Ó¬âsAŒ8‡IM` ½H N‘'BÁrºÏýNqä¥É¨Jû| =¬~Í¿ÊÍÂ'í4ô$WÆGW2…Y®áPË ]ÃÔFgÅwö ¡caÀ£©-”jÌQ•…IâEQb­bäoÓ”Å8vsk9ƇQðRYó÷PÞéj6º­?Y®¿ùÅ;šy3f‚ÛúéÛXóÔ[K†ôy¥ûöÓ—, áŽè@½8¸wyhY°u°=XKçÖ/kÄšmý±‰BH¾rAä)ekÅï‹4r³ª×_ÊÿãK+0b/LäPC²â]—ýžåMàQ©—5àcúÒŠ?/q Jááõ}aPb@=ÿV÷&ër‡”^à'}³¬#÷O© ³pLð…çûá4]ëÇ[DV•mÇ1y[v;uÍþX@(s®ÑieSO“Õ±úmšªj·¼t³CrOû`6Øð’0×b;ðˆ„"Æñ;ƒ’ÂôdINÅøŒQ¸$Ɉz¤„›=àmçýRÉ£Õ`6ÅñLµ·TŒ©’ÕïF·pAàz eŠ¬Ë Q«DPÞhy53–3ASõûzب ltÖõÀðD7j)! ÈdZ »æ¿‹¿xtZŒ §Û|> ÊKdpæˆ0–àˆ¥LB‰G“Ql¦ñ¯°h3.¬ ‡]9oèe(ØívFkË„q¶‚Ñ êô.a¡hþ™ç´J¨¢O9ƒŸ‹\U!ýÿŒ:¥àökc_vtÈ0äÁ r2ä8¢>‚“ZM\°¹> $Ï!G†9îZȃ ä*ˆ&K?CNs„÷‹AŽÄ[]ë#ä¯W_º¸âøÚIêEIìäû‹÷}§€M(C¸ß¹%Ò½£€k¬0}WÎÛ‹ßîUü¤™æ}á{<¨|^¦C¥™¨À'œœ žŽŽ}•UÐÄs&6ц± Y6„Dÿ¨/„½–x÷×,Õ'­67CÖ©¡†^ñlà™ŸG@Ãø3¯:)}^vl̺ÍMy MækõôexV«X`É„âSÍ¡q·ƒ K£‚d­©U@ï ³[žÜb.¤tÁ5*̳û’—`-=üêÌ>7h¶5MàáÁ”ØLÛ†¿%·Fzk²åÜóÄ:GeË_¬à6R²à¥lÓic©Nüð¨‡u#qW»Ói~$äº ½q nÌ_Xxˆ n¸%?•mº‚±r¯‰ä'‘¥1ZŠ3²ob`W0kÏ¡ïèf+N"ÊýõÕËKQ#qÚeØqÐxÀåÞ«u¹ÝQÇaSHËûœ<”Ë&LºÖÓ¶‘³ º NpÔ™l;<í"D‚}$fÃÆ‚ùßkÖ“iŸþ®E†s÷þk{vu/“âOd[J?æLìkÖÐ:w—s¦“ÖСz7™™%( èQÖÐ÷ÝïùóË»7ofi î5èˆà,µi=<¢~vȳg—s¡GôºðŠr&à…˜—ИrûòmÖ]#âÕõ»×\agp½÷»Èð…bò/Â7ü< endstream endobj 2848 0 obj << /Length 1070 /Filter /FlateDecode >> stream xÚÍWM“œ6½Ï¯ ÊCUÐ"$ñáTNÖë*—í8»c_l4 aHšصóë#!Á‹Ç3É&ÙÓ0Hê~ýú©»ñ¬Ìò¬—«Ÿ×«‹«À·b~`­·ô<€p`…‚ÅÖ:µ>Ú¯yö–‹’ùŸÌù¼~uq…ÂÑ ò´Øí†8V›Vžqrq…½Ñn·ßîú¡|‰ô¡ç"kKV9È·›zr|þ+Íá1àÈraPiC|ó;Kš€ Ü0qä÷hoX+hã¸!yÖqI`/˜¸t€ˆ¯íd‚·û¼ÊÀ-§{iNiÿ·!69ÝìlyʪuG]ÿºor^Ñ¢øª×{Çõ#›%ùÖ¼¡fuô`›oõ åÉ‘[¥·îÃõzÂË}Û0ý²dÈý¼åâìp*–g» gDô¶-¬ŽC˜œÐ=Ç»åÐV†;Ð<š‚Ï+ý«)IèEÂ…ª`éô}ÏMÎÏ—`i›¨œàe.¯HÝeM{>Ø%Ù­Œ Úì@¾‰pÃ?@ÍRæåCeƘÔév™íª‹ —O¼š%ª­ÏGÍEž=$äw¿,€š(GyÌMžðßäú–‰ ¿íQ}Ôû‚*Øæï…¢‘K3Ájƒy£ Ô¼,ÇX#ðÉ¡ðpâÀ¦EË+ò ˼_³¦U_#vL{ïàÝ:©4c=NV3¡ËßAΦ„(×/Ö«?VPzõ,8ô(… ð‘•”«Ÿ=+•‹¯,¹GÖ]·µ´°lc!V­©°nV¿}³©tpÚW  -Êßå68"" “£¾¤JθˆDöµC Mïԟо¤ = ‰@èásÔx #`/­KV'"ßß+?'¦v’LÔu—Ô;à>¤¹¾”±¶Þ×*ýÇ:ý‰œ–OñR àÙÈ=Ï®Z0°¥I£Š zó“þ‘¤xžÙTR‘©k;Zö_›µþ Ž××ï_˜e€ôU©ë#C¨Q=y¢·Ü ã…5;žêçm&)h]k²‚x¢ H8(è©ásÌKL… ¶‚–lÁŽAÑ1[. b€¤†]©¦˜GÉëÿ@ëô†ÊôeÁ’¤xœT¬æÜGLêŒÕK¶¥mÑ,Qü¬?÷ø¢ù^¥y°o‹´¯Ö'uc£®BÞåÍÎ4BÕ‘w¦pŠCáTóY«Çj3 Ýwöý‘aÂúéß@êÔ¤O£ÎýæQO“Ð6âPèòzAòPjƒ<|2<Á ÈŒAÁ³Á¼jÑŒ'ÞjÚ¸ôÍñï]ïD~HÜ0te’0Ñ3׳õÙP¤ÈO‡ÑË|ôe¶WuÐ@H§+—™ܵãÝœ›ÖÿÉdøÜø.–DBÔwc&Ä!µæ»…Væ¡à™ÛZÕ²î—ýj§UÚÛ¢‹èä¬õ2°%ž endstream endobj 2861 0 obj << /Length 1288 /Filter /FlateDecode >> stream xÚµVK“Ü4¾Ï¯ð-žªØ+Ù–UpH KE H†\BŠÒz4ƒmÍÊž}ðëéV˳öÄ»,.V»»ÕêÇ×-1¯ò˜÷Ýêõfuqg^i”z›Ç ã$õ2ÎÃ4.¼ÍÖûèsÁÖŸ6ß_\¦ÑD5,d<CVé­<ê®z_j£P{ÅÜ!— ›l Æ}A”3¦Ýoîd{hT?ÛùØ /‡Íib}ν€gažs²ÕÊaÆü¯Zaê»_™`[9Hâ}M‹¹ª;Ý¢¨›ñ#ñ’ˆ¾þSÍ$£à`ôÕLÀÂìp'ïC!†!œ……(Ü]fÿÖiÓÎCùAW?S6àÖb@°í‰ƒÈ"æøÍfu½â Â<~ªºÈ³0.r¯lW?1o B°bY·VµõF–Ä@7ÞûÕÏÖÈB Ê4ø’&Ü 9È'ˆçÃÛwgxIÅl[9aölÊc#(J,rØ["óo¤©eW®÷G‘¦µ]# ø²#†±?CíäzGk£×"ò«Êên‰w#›£årÂDXŽÿIÂ(1l¡ç4g®Xߪ¾4õ¼ì{â¼o±ò0ÏòÏÓÇ.M@ܬ…ð)U£HÓÚ*› ŒËMœø1¨E”•ÕN§Ó]Ðèª?ÈѪ5Ó]¿¸»Žr_™ùnØØ­#TÏg†Ùˆr—_zY©çφ…¼dS¼¡¯w®QÃ0|®¯LulU·Ž#xzRýwg€Ÿ•2Kïш÷WcÝ0å  Æ‚–ê™ú }äüÀÙ x&©s¾?‚\¥Ë8Y8Á¤ÓɽÚ>–Ñ"!?lVT?¬ áßàüE\?CyâãHYÜsÊü%ï¢ ÞfcºDÖxWDn1mcê–N”F¡ÈÒÿwBG‰xÈÆ÷úSsú­‚;·¤)º³¨…!­pžÂté*7šÉ6ýôG;½i„÷O Ý(ŽC^ð/3t#A¬éº®£6û˜Dp »è‘¶P:ÁVõuÕ©µ½aã×½jDÕ[×\õîž8×GeYª¦AS¼´ã;™Ò¨îÅ09 ”èϨƒQ½³§Ü‘Øöè½:=8<EaÔNA;×™ðñ…Ñ«!„=±€-;E#hóXÛdYM*3ȨÓ[Ð>„Übtåàlæ;]iQi‚jjbÁ[ :$õ‡ HœÓ×xÉP~ð—ò³•ó f0nhy•ûÁn£8é0K(¯6Ôî,NÅÃö¨Ý‘ä̱Ì:Ö’ìJ–xäô§gç“û@PióćüŠ,ò_ß¿Ôí®iHÄ4S7ç„ß©ºÚ£]x‰ÂW›½&Â~·=i‘Pí¨À xbl7`0†þ(aƒ¢¾$.Šh€¦ªFèDk’HÞîõ‹žTô!óKÙÌ\ͬ7Ù‚« 5#Hˆ±Ú@´ºˆ’P¬µå$˜¹Õ±-eà²Ã3F„9æÌµ)ŠK}lNû§û`–£3ãfIËÂ8àkËÍó8ìe]𱑓¤k Æ>FzҷİW™UWDLû~móMåý@Ï?”íÎd“ã?³;ñ²^, N°{¥”ä`sO·ì¶¶E1ŠBÌÑíÙ#T]kzˆ6!¿´s˪ºjr›^šp¯×®ó€<;¥!\ÙpƒüPé´ô endstream endobj 2875 0 obj << /Length 745 /Filter /FlateDecode >> stream xÚÕVKSÛ0¾çWxàP{Z Ë’_鶤3ÊÌ©íÁ%1Är*ÉPþ}%ËI£T0‡^"Yúöõí®63wçËäc>9™Æ¡“,c'Ÿ90±“@b”9yí|w¿«UCçWULj÷3ÿz2EÉ– ÊbHjÐ0‚ 4 F#'Sl¡ý5Üyˆ´Ð5/æÄÛ·JuxÛáÔña Pšþëë Z-:Æßy~.@þIe~ˆ@µÜñ±F|&³¢_ ýq…ôÚ±èê÷k1ÉMEv{&3p?,:ª®-JjЕ7¤&&Ö˜_=a€’f¾(÷éadH[’º–Ù!ZÍ ÛÑYü½DKë¦}7úËÛ® *‹ÍnŸSjC;NÂÀŠõ”à=ؾ¬¨˜5Œ °c ¿¼>³‡GN¾?*(íŽì@0Bø!œèdÜ«œ Sàâúüܪýް²ãä0çeµǾ¥Ÿh³òõ~Ö1½©–çú!ˆ³í^„D \?o4ÄhW ²t8Ê슋.ŒAŠÂÇTù0Ʋï±ÉéKôã‹Öô õÿçõ=¿þãWªÿÝ餿I4gß)›÷-¡ ]ÁPO ¦uM™£Ñ¤I,»#Üê/LݱC|Œ3·+eı«†Äx ;G{Óóñ¤ØHé›¶¬ù­ïf¬kõN,ˆ¾þk„ï5ˆocWôLÎ,ÏGšÂî´¡uî¥Øeå3ÂÖ<º]¦6»,˜}=ÒàÃ$Yh¤ò0æ. 'ìN™Ýø§èPî5T Âh±ÔW='‡yN2ëÀ>À3†’¹ñ‘ý$É’^ *´çê@=]rœë·Ú÷¡]†º58G:› q* ¦Š`#©†‰Ð6d†È˜ÂƒÂG ]‡¿ó_ä¹á_(ÁÏ—¿ÃCk%AÒ¼êņ#ª×ÁºŽ "KÏÒÞ—gùä’ǹá endstream endobj 2886 0 obj << /Length 1618 /Filter /FlateDecode >> stream xÚ­XKsÛ6¾ûWðHÍX0I€¯ÎôàN’N;‰›‡ÓK’EB‰d0Jþ}w± DÚŠc&Ïà»Ø¾](ð6^àýyñÇíÅÕ3žz9Ë“(ñn×^Œ‹ÄKÃ%<÷n+ïÆÑâÃíßWÏ’h´•'1‹¸AvÓ‹¢{ÕKõw^î€a¼z&ĈuÉEjy—Q DN”\3¹_ɪª›žÈ¹£eš°<‹†“_˵T²)åbÉ9÷å~eþj±„ÿƒ,»°/Œª¿Ü‘;ÕË ^†œÅ ñŸÐªyŠ-ÈåqHüä•_§ZÌòÔ‰þX4å¶U3|uÓUPtz»¦¤-¢Ô·-Á´4öÚù¶np~§`%Žýÿdiê¶¡Emd§iý°•ŽX¶û®7`)}ðtYo¶8=Û⦪÷?cm“µ0‚$ÙhÐ^Ó·5F268¤º¥UÉ \Z,C¿^„¾ÙÒŽ]‹[´Z «î€bG›Èk zm‰F€šK¸gy“ºÆ)3 ‰AQ[çýª0ÅüÑû¶5MŠ”r·Ó#Õ\‚ÈñÙÆV§®u‰#ºè+-¬,U€· ú­=¥ÙªXÕ; Jý–7ÍϘdvÍ’M Ý7÷OMŠ3*i¤Ú× ’l\aå#14rG «¢©uEA»›$kÕîÓ†¼xssCþÚ¨¢ÛÎö¸‰uªoäãu½oûÆ^áqz`ÀúæÔ!9ºn÷õ~ÎÈj#õVކð9†p– W§t¿2ª( [×Jö¨èO úŸÎ¡Y98Èœ—a¢ËV9Èüuß”§½Rd“¼†ÏªÖ¦ÀÊúer'6ÅÏÐwúž:‰O]ì…ÿ>àŒ%j# %Of)¥[5l¶—fÛV3nÑÃP±C™–R§2ó>ˆƒ¢iZäu™CÌÂ}}sËá|c˜QRÎ(•/Z…긨–¦¡¿AxúŒ·œ(¿íe‡y§dYkJ ØìÒzM)Ó±]°.‡²ß_jhÜCϤÃ7|ª£DòüëOýÍåšîµ5¶t#÷°!·˜ì$SÑ`JV}9Ü“;ªd@äÈЪØcLÇSQ€³ ‹|H%,|jXÀ”DNY.Ò©;\³{“J •8@ݘ_zôéÔÞ@™v$@€åf¶5MŽÝÙ#3T„ \5Xý¬nª!K¯¿ÿbÏ3ÆOÌ# uÊbpç9}·+÷4·”6 ìUiç³!¢tÐܬÏd@Ä™ˆÅ¹ Á6ÀvvŠ¥;ÏN4l¦Ùè¹N E,ƒÌš$„³ÔSbÜT£ß7¬Íš«þáãÊÿ†³Øÿ߷޵ ™VOìk­ö¹ýÕk¢ºû)GšËsl±tº’5#=Ë«„½qø¿ÓpóöùóËó½åát—Yc]ÿ¾£ #$8ËxÏoPÒÿ$B2Y endstream endobj 2789 0 obj << /Type /ObjStm /N 100 /First 972 /Length 1552 /Filter /FlateDecode >> stream xÚÍYIo[7¾ëWðØ^(r.€ KÝhÀö!­›ƒ+©ÑD dHÿ}¿¡ìD¶žJ‘€\l.gŸáð‰rå¢N’ýO®’ýÏ.rqBê" X(ޏ!#þ8®ÅÁiÌ6—Ra .µ•ä²Úsm˜êа ¢+¥:*] 1Ú(ºÁ$F%)±­A&IÅ@e„¥ä¢„`›RLîD”Úˆ§ V%‚’vÂàÈxMLYm™ì@ÄnNí€@ÙPv‹6ÈÕ&IŸÐX˜²DÉäÄ'¬) bàÄTŒ\‚ß’ùG 67'kÀH ‡À¥Å6EŒ—¶™) Š ‚©À¢Åˆ¨)›µpÊí˜e³oQS»%š¶ Ì*7ͲÓÀm0*>PJf#s"Ø'qJMí¤% (ÇvDXM¨§&;F#/Æa%{FB`×F£’ ¨ëì8°’=ƒYnš!¡´”vTjó> Z[¬Â!)´XEš¦Øv¡\f»HÈ$1ŽŽFãgîJHé7~ùç_ȬàöHU}Bͮ߿5zôèëhhæ yчf®>#ôúÐHOá0è(ì“ÜCÏgKwtäÆÇð|…—Ú±cDE©|3³J¥Û‰`¢7“deçË̪Q\ùñ‹ÅüÍétéÎÝøÅ³c7>›~ZºÏœÏþû8ÅÆäÝt4~ )¦³å•U¾v~4>™^ͯo¦W«jØÖþ˜^\NžÌ?¹ó€øe“^ÑdÓ*­€g³9¨¯ê¯ÉsmŒÆ§×¯—mþûåìßÑøÉ|q1]4âáÕø·ñóñÓóØ&&ÏhB¥ú¢®ø€êÇ|U«.Ù—ØãfÌS7þu~6wpÆO'ogþd:¹ˆá¥?¹~ïÿÑŸÍ:ëÞªkÞªµ9+“xE¾lº¶nÀCh%öe¥M5ø€´îDsöÕ÷ »Ww"îá Ëí®Ì!·k• Af·ZWYí¼dv7ï1È"o·-“·»æGy³ìÅû`ˆN¯“åýвþ¡;´î€?‡VB: šÙChí{Á”<¥Ú‰Ù.Ð>4£T>ÅÚ>4U„ˆô¤×é1¥ÍzÒuUܹÖîƒ; ¾sÞRØÌ[ô#;ç-ºV“§5­Hàš¼ Ï½Ma\ÕÖ8l‘Âß).%^½§ª€=ÄQòšëÃbœ=>ù0ù¸QJpÝõ—’uð—â‘Àå0èÈ(%Ú‰VENÆØ‰–Ÿ „­2º’¯U¼}^´ã¯c)ÉÛƒ†4ûˆJ,5{-ò W'‹«éßA‡Érqùi£ó6iă…¥N°u.¥äàíRJ½’€väÊ$cG†’äÎ{c/×"e3I$í^3%oáìuð7_…ƒh±¦¥,ï]¢Ã 5úã€Æ›+}_D3œJ'˜${zU¢­…³rŸŸnî\{yU§¸™ZwO€¶H€uð·`­ˆR­ù0h´v#ô¡ϺRK/ZPÓ»µä‚»°Ö^4’Ê܉¦D>g= ž—z tÄËèþ3úû>ZíåFɺ™P™;*ׄʲEB­ƒ¿PCh¢ˆªUõÁyg³–´iÖ"Û™u½›-ᦛ-ñv@·ÞgËbUÄ~DóTr{˜–ö³ {ÉåÁ¾òl1™]½.žM–“ýu¹‚¬ ?K£fõÓÍ×¥yG¼C¿=ýåÃëéÅÅåìÝÕ­Pÿ ¾´J endstream endobj 2901 0 obj << /Length 1414 /Filter /FlateDecode >> stream xÚÕXKoÜ6¾ûW,ÐCµ@Ĉ¢žzp;H‘©³î¥î^q×*´Ò†¢ìøßgÈ!µ’¬Øk(±(Š3üæñ ‡,¶‹`ñîä÷ÕÉëó$\ä$OÂd±Ú,h%‹”R’°|±*{ùþÏNÈûå?«?^Ÿ³t°žå ÉÚÌJ3½è$°¼>¢ÁjŸ%É¢…¦0ÇPFŠ¢^ R”»véÇAàý†O—>¼Ò A™ˆò8F™¯Î3Ö·ª‘‚܉r{£Æ"ç§¾œÍÊHQtkU65Ù5…¨ŽÛHI^·`OÁ'\nÇ›Ue«®‚8€ÿt,ž xY+±•\ ±»EQÖÛö9Z,ˆ½lþkÕíøþÒ·B^7­ ­..ÏÌZ?7 hM˜Q0 6ÍL Ó<Åu§rÛíD½d¡A¦Éô9I­ˆæ$p^âõú¦‘­P“\efš< ]bžÖKŸ1Ïõ2Ì<ÿâ0yÍ5Ø{Úcæ®UèÓ„$q>ÈÃãQ ‹ ³k‚»š‰®ŽÊñk+ì¢uS·JbZ6›íxÀ½Èq ÙôÒ§žXRÏúù¿b×”:ù[½Ú R}J éI–~EÞê¦l­c¹Å|ko»Ç·uy°hjjS ›A»ƒ¶üNÿiðƒsýç¾}3µ™ °g$I²qj]…4xÌ\3rÖ®nJDãAŒá5òŒÏ̇Rµ¢Úà,oqN”êFHsüt» S°Ê%¾ßÁ«Z¹=j¾-~^7R ¶â¢ëšºÐ+sóD-Ùiî­EUµ¯tX7ÏSîí¸’å7û­Ô«Ù¦êv5ŽÜ uˆj”76âÒ%í ïÁL=øÈc1ô1"> Ò—116à¨ÙàS¹O;¡¸ j♬¬[a—K|ò¶å:÷øº‘Ín¢gäýxDìùE'ñmYˆ¨“¤©¥ND)¨úÚ•3"p;ÐñÔÛs©­2Õ=,ñ&=Ok™Ïnú~3‹®«*8)!T:¦ëWô•ÖÎÃ̎׵¯ôKüÀÉ»²ªp´×@;íÝÊIбRçYæØÑœ#DÕ(]v VËŒ™D}Ã ß˜Ó óV3Ì5HR=©uh’° ÷ö•àú”ÖóÚ¸aQ¯‰yâÛ¾*×¥ªîç:Ž;¨6CáÉR'*/Ôæ0$I–º„}'Ô)¸ûþí•9a$È'ÅùLV¥&« ¹=Wò8Ö„'4£„屡Í)nS‹;rhá ¥ž><|‚kBÔðÉÐPCØhbé(ÅŠÙùi›5k´£¢na7^ÙbÒoÜy‘ˆÅÓ¦¸Wòrøî|:¨26¸â×µÎL̹C=Œ@Dמ²‡’8p 4ÕÚH`7­y[ëöåm ö÷ÇŸøÎý­Cx2´¦CühÎæµGO#ÜFþ7´sçÓýêøt³œZŽB)°ÑÐ׿q×Êáž©U‹Ûkš¶®íóðè#‚¦‰óCScMxpFô1òÃ8&qÃúÛðOç÷Î’³Þ’ç8âÁeþ§sÀg´àòãéç' TU÷;ÄÑUê³´§²m/4e³ÅV0s'µ]sÙNJUÓ©}§æ~ËÈ#ôìð÷Œ¿–9´ÚU'f­š@þ†q!T']éàS*Rè#·ÍÈz³ì‹è¤«?®âƒ‚)öæ—_gQ­N¾ÌŸÚ endstream endobj 2909 0 obj << /Length 1371 /Filter /FlateDecode >> stream xÚ¥WKoÛ8¾ûWè¡2P3¢¨'=dûXtÑv»sj{`,ÚV!K))×MýÎp(Er×ÙÂQ£á<¾y:ð6^àý5ûs9»x-R/gy&Þríñ `"J¼”s–ˆÜ[Þ'ŸÇÑüËòï‹×I8`"cq"@eÚ)½QìêÅrž ÿÒ93ÿïͧ®{^¼ŽÄ@ÐBK‚Ä[„)Éûò`tûÈR<ñNù{u˜ƒ˜è^±¡÷U£µ2·óКº(ë ÑÛŸÂo·ó÷½¬•l÷ÀîX´¬ÍZÁý‚²..í>nU©O©þ­V tl\šy“­E¹j˦&!|·­B8¯u³sÃežFÇéøÑ¢ üÏb–ÄYÀÒûR¶ò,Ìs¸Îs° OÓÿù¥ó ¬ïVm´l-R"ò²ýÀÉÇ9ÆgqÐçÕ›ÚÉ~µ»QÂkÎrGœEIô;‚õYq„\‰ÿ«Z͹ßR¾p]Íÿúœ/?«î?öîµY+ä ¾í•¾£ãJU•ê‰Q 4ns$@+5ê©Q!šå>\¿S†9—+{ƒiyv„…AÃÝ Mì»WËÙ··bxß8â4a÷V»Ù§/WÀ70†‰<ó–sçE`Xa|+ïjöïƒ@Ãæ4Î °„ÇqÆD’õ,ý»£à&ñèzÈò¬wëÒó˜û„.Ný+„ò@¹œ§‰OÂàÔôÍW5CÕRâM»décÜ&÷‚‰Þ9Ë"çÞKeVº¼µÙ4öãþA X˜‰ÞIë TáƒÖl©ÍM—ÜäÞ‘M æ®{] §,™(Èè„eOž€â ð¯=wªÝ6רfñ°ª¤qf%ù(”‹Ó>”OåC}Ñ0ÖÃô8%ìø¤¤sAGµq›wŸƒØöË}Äðƒ\xN÷×oß>›w¿`s,‹‚a³`eaÎL…Qà@ò/?^¿šä¯%Ó»óXc–¼˜p áç$Ò¥Þìwªž‹ÐoÍÉ„úE"ý8ÕСåYxßÑÏŸBKó>}Ô&Ð)=B@Çì§q_TÐNVÇ÷Žr \.AS*ëRâÑí½R¹‹;úqžùnàáH·‹h’ô¨JÓº²žP›BÁñ[jÍIØÂ„C¯ãé>ª‘Ç@‰¦(4Å­Ô¦¯FRæG4ÆFˤ«Øµ£¸O•JÕ›v‹}ááóœð[YÒ3¢Ýa‘ÜÊȸ,gÉýòh†¹.oi¿T5V?Úfwk÷ÃõÓ–&Ï‘Õæ÷9à+«=mœn Â-˜G­Ô]À!k:*Ià<œO‰„ Ó©–;u:rüQà­êì°u“- »½(ô©ÙáÉTMkèXÖ¦U² »‹ÁóëÞæ/œP7íìCI˜‚Ͷ¯Ôïä`Û²‡HZ}Û—š>î‘ZÕÞɪü)qxc´!˜aƒ’D†‚ûÝS«U³ƒfXàÞg?¬éiíÁƒ\é4’J$ÈÝt1š˜ü"Ý¿ `®ÊnQï@vñw®ÇG’†ÈÙA|ƒáàa7{§zÊ×±h8Î K"ÜçPZ{ÖÔÕÑàï–QšJ–¾¡,ö²r—Ú­lé$Á9ÝýïF{•6mb(kú€°L„öx“Â(æ‘C%j“ ßmV Ë4ôÿPêCi:@Ú•`„A#La`0¾’—ÉôâJýv_Ù?\öÊÖÕêûKÃC7ÝÏìžnŒ#x.ÃnqgüKäYƒ(ÐÑî{Ö•bzüÞý^%ñ endstream endobj 2916 0 obj << /Length 935 /Filter /FlateDecode >> stream xÚ¥V[oÔ8~Ÿ_aÍ ‰;qœDZ ´H¨ í2,Ýjåf<Ó@2)±Sà߯o™ØÓMÙ''ö¹~ç;ÇF`x»xµ^¼¸  (aI Ö[€‚)¡ ÇÒ´ë ¸ŠÞsÉ.VEq&‡ž¯®×ï^\¤¹§––(UFÎ2-´@ÎÏùzñmÕ'øà‚æ ,ò Tíâê:|ÔQY€ïF´DE‘m¶ì¯&Bü<0‚”`@3KådÊcÊá ®0ÈÝ–“9[e8Úíz½póÍ$_Åi–GüÇÝ¢îöz¯ˆº­]Û¡‘õ]ã$·FS»¶òV¦ÞËÎ~1+&êUŒ£ýî5õ<˜DƒIŸ¦ ÍŸ¢’"·é¿á¢êë;©ôA›À ˜€ '¢Äj¿fM54 0qšF=W?õý*)"nw*e7É#Ù×7ƒ´(ª]ƒbªWiÙ[ýGl…#©1Ò54Á#Ie•7ýÚv½UÞ9·ÎƒàÒweŒkfhù ë´R3â¨ôI°ŸÅã!>!1C|¥gýnhU]Ó$’â—Eùu1,ÊG£!`wNÕdH¦É`ô‘=Ét£2£ÑŒÀqì Å8‡´<ªäé\ÖB†ýr°a(=öSã‹›±urLä˜@'õÁÐͪꚡumWïmhÚ°®~ØÄBvc_{}2’–¾ÿFÇÃA¸ÀtŸnø–©ùîÐGÑIû$˜mðçÛÚvZ[ÏП!˜:â§"gZôwã°ýíƒ&ÙWoÔõV³¶ïÚGÐÔB5~IlÄ~óÿ½*©*ÁÀãvú‹+zíÝÕÄœG#B!&嘮kô™çO TŒbÓ °—•Nø{-oòzâü&ìc"‹¾TrR2èÍ’CõTA9ÿÁZõö§ßP…2HɈ.FŽ›® hywÓVÿŠVÑ}9ÈLx¤&¶{)N"vÀÿÛuîšÓóPÝ `ÿŠ˜,>Ÿs8Í;O§2á^®_©ËÍÞ3çg‰ zÖȃ[Ò LK”,…yy¨ð³U& ¢žL‡ð=ëa0tÍ0™ÚhÎ\Œ“ fièc°ßr¶Ñ9O`]]]_?˜DÞsü?¾>óa endstream endobj 2925 0 obj << /Length 1155 /Filter /FlateDecode >> stream xÚµVK“Û6 ¾ûWè(ÍÔŠ(R”4ÓÒ6i'3{h붇$®DÛšÕÃ¥äì¶¿¾AÚ–WIÜ´½ˆ >ø $ØIðÃêÛÍêÅkže\ÊT›mÀ’$æB9c±äe°©ƒ·!Ëdô~óæÅk™^låYç…CvÓ]óÔô»;=™¦ÂÝ«Ä]òj³úcÅ@Lv²/sç)ªnõö}Ô°ø&€¥²íÖ.àB.8ÈmðËê§“½ëÑ‚âKb)X 3 â®éïÔÓÌ3”ÍŽ¥qY0èåáÐþ­yV„ ‡<¬¢Œ…ºi§›ïkÞ%<pu0´uÜŽ6ZÃtKÚÕõHrÓÓNEj§ päÞrÀƒñŸÄ‹â’,<®LxÌ`´0¿×cešÃÔ ý,8ç ͤÖiç<›G‰s‹„ ˆÒE@W VÖ´bµN ÌØ`¡¶%áC”e¡è6Vþ~«+€kôާqV¤äݯ£ÚéEXÏaÎSè &eÏ»$Kj5©¯àQ“$ìšÞKvÝâÒK³;vºxNã']ûŒKèÈU:Ï^*—Íé©<)f6~>î5¾ >ÏD‚ÜÕé+»3?ÖÎ0 ‹…t¨ ·ûòÑw¾·i¡[piˆÒ<|tù±o܆ÎgÂé$©7éLbô¡U•®ý¦i6s3Bî>#/A¨È?@l=õÜèŸH†Ór¥°(s:+,J8ãŠK j±LJAø.óò·¨tw} ü¬§£éÇYyRño'í²í@/c¶ƒé9 n=êñÑ+ð‰K]oE!a·Ü«'ÕZ=ÞN“Âãd%à,}LTð_¯}á#VÏ 4÷ æ¾é‡—úÙ|š9Ò›¿ô|%q+3ÜÏV’8%YÆmêÍð8Û”y $kheváõÂôœÓf¦àÄ™ãf+âÌxË—/·¯TqÁØÿÛïSžÄY*?ó?òé®ÿj«c«&ߦ]ëï¬5תÏ6—±"m¤ùÓ«YoÏù¿ëÕ‚Žÿ¨Æò&‰ˆ>P®†îpœœ¢pÒÈB#¶…£?3liÜ{jv†°[Ò JÈAhASM¿³mÔíkÆ8ZC´ÂM„wÌ\‚TKKáî  aÆs:3Hg÷àê¼é‘Ld޼BB;Xª¬ðG õ^7»=tDlöŽsìùFÊp‹Àˆ€¡CZUˆyO«•Å‹óX;­;ÿ@ù³È8B‰ÄtÄþÿh0h/Ïf´UC§,ÙPk L‹ä¤#Ú-r£`Î¥]Bmg†ãDô©Žmª<÷C\³QAáô¨8ŽFŠvOzGüJÞ]œ”áé½VF“W®bêìö5 {5-1ªÇøhÞ­8Ù:‡ˆ¦mª‘ûPøGÁ·ÓÜÆØøßûLE6ŸG~þìƒ2‘áúdÜ_£|§¾¼´Óu£ÜU™atÞaï_kŸÈÿ¸^O¶ìÉÓ©%:z™õLßÛ6^,|à¡¿»©\â endstream endobj 2936 0 obj << /Length 1030 /Filter /FlateDecode >> stream xÚ­VKsœ8¾Ï¯ r‚ª,Þª=8;[[ñT­3Þ’h@1¯•Àï¯ßÖƒ Œq2³É ÑúZýõC­FFa ãÝêÍvuqºFb'¡Ûá d{~hDŽc‡^blsã“yC÷<õvc“üAp_ÃÏ—íŸ×^4Ñõ’ÐŽ‘'K-'ˆh…´±‹kMÐë¾v#zJéŽã‚ÌÔ^úÂqþ”xl¬ØöâøÀ™6Å éÍ>£‰3% ‚oI(\›~%Yÿ›ÜFó­‚µC‡Ø˜-ɇ¬§mc­„ÌßÕçU—áW‹øœÖ|u^»‹Àû*˜cB…©ñÞžã<„O#ÝÜê2ê°´åd†ÜÞÞ]Iìz!rUGUÁ<¯"n`ÇQ¤p—¬jÒXžköü»©ýAJUªŽjjVQh'±;à20Ü[kÏó@< Í…f&×ú„µØ òŸ×ÁéÖßi-eÿÁ 3ŠÓŠ(É®ej‘ãsr>­oÕw2§%Í,¸Ä¥¶L!/NÀUõ¤DÀÉ1‰å˜p6É…Ì7y‡3MºoÕwàäl¾²úO¦úväÆÞòýéf7„¥Q*»Ý˜£Fˆ†Úr#¹™„©ØŒ´È×´ÑQÒRëÊò9›³ºÞ'ó¾Á{Zk’Ò*§ÿj6íNQ­ZÉ<Õúo…< oG§ZVŠô+\+ȧÑ÷Í 4Úºúó“ ºÐÉî\16†^'bh4ÑmeäKí_³œ²ÏÈó›üpqU´Œöe=îhÇ”·ŽY«#o/7›±«åÛØ;ϨnÞUX~⇚qLÖÀæp¹XèýTõžãf›øŠÍ´áþm%!ø;,¿£G¼Ž›ì-é6^:¬âò ˆBçC«*jlj`ˆÏå:5¾Y‹ Û /ÄB¥¤òQ>ê‚O;SFªJ²¿Ú®þY9@Îa8ñÄÄ„³zõé 2rØ„çÌö’Øx”ÐÚð᥊|1‹TƇÕ_/>9rš¿:²Cß1<ø&¡?›€¦ÃÏ$ a0Ówœó-ÓPˆô‚rÚôT޾¹s9@xAdBØ@¢,HŠ,ja_nvRé娏IlÇaxNlT ÐÂè† ‹\í á£Ý³çÄÂzËd½?ŠZ YZð)Éènè«ú!‡[+ŸIÉJÒ@FÔ «c‡ún¸=®e9aò1y*/ZCR¦–õaÄ…Þ®D÷Ù.JkSœÒŠö”pû”èW޵ÓBüŸ“-Í¡mg6ëmîÞ¿ÿØýXO¥)®p#'‡£1rñèª-v™Ý—ò­æJÈvƒE%Ì9~šOÜ·›Ëå‰[¼¢iÈÑØ­ågÁ‡õÆ 0 endstream endobj 2947 0 obj << /Length 2235 /Filter /FlateDecode >> stream xÚµYëã¶ÿ~…q_V.N:Qo'è‡{m“öÒÛ=¤@¯8Ð2m³‘%W}ü÷mÉQ.»(‚–9Cg~ó .v‹pñ—oo_¼¾ŽóÅ*XeQ¶¸Ý.Tq’-r¥‚,^-n7‹y*-–ÿ¾ýëëë,‘Ʊ ’4†…ˆèûЕú¸ô£Â3ßÝôRyGd|Ê~¯¯“d´‚‡q¬~”ÃXÌëô¦ëƒ¡3K? CïÏܼ¼·UÙ<¼|…ËÁR>ˆ·JSæ8臠4UÕ»¶ŽÆ¿úøq–©i7¦ ÖÁ±mÖ–Û›OfYhu`yÚÖ‡ ÊJwÝô4nî Í]œ*cþcÛ¯ƒþñx¡ˆ¿ý8¯„mÔúpA¬ïv_ªf]¿›g:Þé*(‡¾Ùn'Œa¦³ Aа¿"ƒMæ>‡©b˜$áØÈªgAX0Ù›v7L½Œ#¯ï&è¸l/Ђë¨ —ˆ×ÿ1e¯ ˜ó,X‘è›zéÇq쑹3o†y NáöÈ®¯a7¦îõôM¿†%xDo{l;ѪðØín7æs'µá¯ƒnAzÓ Ù¶i¿ñUèO¬ºæ–”òx`;Þ†M2>Z”&A´JŒÇýcÕ0Ùä$à•Ež8ª¦åE¯Êjè|FATDÊVSô¦í[c®@Ü,¢óaK§ÛpŸO—{¬ª¼ŽÇ·¸v47uCÑdcøÓÖ“Y”ö’m`GTPž“‚l½ãñ+¡b‰fÝšÿ¶5‰ð‹-ËÝ›_#΃$SN-o[mÞñ&·°É× QÄA8I3€Ç½F]Ü‘¹ydÍAÔ`Û¡þ*PÕ %Jæ=Ã=–~’¥^gÊí”d®ªQ¼3~‘Hð‹4d3kGÝÚ®©Á)x·Þí úÔ*Ò¨pûbŸ‚nt‚è+ÞƒÒŠGš~oœ˜ÎB1@UL9jbò‰¤Qzý%JØ¡ :Áo9”L„iþ‡ʉCÁ¢SˆÒª®ã.¢Ùl¸ß7s{«$XÅ'T"ÔÅîqà«'’‚bPÐj•\¤.45ÈÄð;¢‡j–ˆ]57c…O铳ÇÉ4”á¤çYqw­+]— ‡'Ãù§ªùµ¸8º®X& ÉS|­•ܰåvgjÓ1í=£Ç£ïÇÞ ÀR¬ º);W#O;eä…¤FHÕÆû=„£}S=å°¾ŠÀl³´‹g†ä†EÇ@üh¸u‡‚îýOU¢gïyvDuܿ¸©¼¦æáQljõÎȬ–m*£;éþÓߢÈÔßX@lZ&›‹¹P)„pVj ÊPÙà'êöHݰëýÒAœ?—‰‰ÿpÀ>[1€Ÿ‰÷ÞlõPõ°7 œíP—½mêW›AðX:@lç0FGÕâ'²ÝÕúÉ(ù  ýøŒ¸äÚQçÂj±cEÚ³Q¹žq¾„öz@÷8‚~:Û¹Càs¥ÇbžúäÜ. °|ÏÅ¿ç܈N~\GˆÏ×øéÊòd‘ß›ºéÝæàŒ%J» yG¶ &IIZ)þÙIÛJ¯+1RsD¤¹ØÜšo.ÏË ËŠé >G*üšôÔsÂóe %~x ‘¿W鍨Å€ÇÃÉ1p°ÀTRUX Ç©g6”á€VL‚]±ÝÙÝ)àÌ9:4ÂÅ`î–‡ñ É)pïëCìjn~¶8‡Ê½„p’dÞ®á霨öÁư GŒ`Xó„`JK… íaxÙa‹‘rFB{8Væ zÓýÉÖ#Ÿü Tä°`·Î-;@|õ«”8±´ÏvÃ$³*âÿÏÔ_*{8h0x’hðlÖàIºš‰hmdY ÑÚbøš5øŒÆ& ޳QÎÄÇOÅ ‰µ±+±9õè,žl²†+tÏ“ä0Ôïu?ÂÁŒ˜ºjHŠÊX ºë™Ý>ò×|Á™IÁS )w½$(‚Ò¥ŠÌUN¯G8,ÇbZPÞEÃs Ýx©«fŸÆå¹0Ê‹‰Ñpæ´fÇóä'Ìb…™-Ž“¤¤²;R˜¶[¸¾RšÅI§™¹xÊ•µ:Öœ+kÅjƒvü‰¶–"lýá3Õy1w‡®­GCâó°·kÛ ¹ÙÛÞæg<¹2|©ø ´WsoPø¢€Mó; *¹4cV8XŠq‰E„÷72s2-~ŒL;^9ä ó†{lÓyµ¶¨‹<äKG®&–ᙳ3”Zî i˜ò]9,½¿P—5 ÷äìÛºcÀIŠ4£7œ\dÿ­’(Là”r ¥PŒKîîH| ñ¥J¨jŒÂ žƒóÆ‚,wü°Gdx^Óé2×ÊÒ ·#• 7ÝÃRì¬TGÞ釖 ßˆŠ¹8ʼ+p(' ¿©EùŒ,WL¨Ö뀪‘°Ôb²è<ÒbzÇ%6ó¿Fô­}˜¾ÐÊ€¥Åø™o¾N¢Lu®“bªŠæâ.èÚ·/þ|6’t endstream endobj 2952 0 obj << /Length 1959 /Filter /FlateDecode >> stream xÚ½XYsÛ6~ϯÐä¥ÔLEñ¦”7'Ž“´¹ÆvúÒt: I¨y(èØýõÝÅ¢¨Ð­í6}âbqp÷Û&›I0yõäùå“ùYM–þ2‹²Éåz'Ù$C?‹—“Ërò«÷Nܨ‚í¦³háñלé¿]þ4?‹óƒ½ñ2óA '›]aºÄEOû3÷Ÿ%ñÁ®Y´Œý0ÈÓæÏQ výËPîOOõÓé,‰ïÙt–%¹÷¦äÍdÕb}‹©WŠÏAséø¬ªni ¿½BOòiè)¤/ifîˆ\‘ê7F¹Çá 3Ó³Z»K¶ÝNÑ_Û5ªRÎÍeš’´¯*XDZ×)ÑlˆÔ[ŽDâ]èΉÿƒ]¦gš+íá1D‘™…©…éc0løf%š¶F(ÓÜ@¹  ƒGšy%%±ÕÜ  ,,ÀJ®M:4D4sƒfŽÐ-,špnÏjÇÛc›dˆ-|s‡&²,šH2š˜׿4aTDAÍ…’¬)Q‰†3I›ëÖÈYòÊæ“âd¶A•‘Z·’løéݛيÝ‘_2 ­îmÀì1¤øl…RmFŒ¢/–#FÄÉñ˜À™ÓáКÉñ@ÀÇBÓÑ.2Örhº8Ý›IéM‡œCmˆ302œ±6ÆZ±fi˜YóÀyÖ<°†ÌšgL°c²GÅÜÛsŒ6£-ŽPhE F ¨v#”1$ß i‚’þkÉjNùG^K·´´äšË0"voîQÝ÷91 ‡¡’ýÖ|¹ð^´Ò²+´‰åÈÈ Kª^È4 ã>’hœ>*C) M! Nkü‡Èš×èXÖù¤Ú ;a †¤ù|9+pí–Fk(Vä4M)®EÙYEÚr ‡»¢­wLr—}·ÂQ-…7£¡‰›®ªhÔ{ ¿ ½%ŠÑ®J\™DT‰-áa7Ð"‰)•¹µË­ögÿCêwrqù}2F|G²É±·¥ -wçh¹ü-B—?Ëè³5Æ‘eÅi|hk†W­42#£¥¯*ÎߟÌÿBCL>EÐ'-0û(» öˆpˆ%YtGžx5MSmø¡ ¹»ÆšwkgN_Ú`oPæ;›üôåÿý‡Fóa õ(»ÿC¥ˆûJïst{T(¾Ò£Lûæ*ElQ[¢¿n…Ë´Š«Á1ÞÁüz†Ñ|EDœc YQ¬:mr^œgÐ¥ÁÛOÙë3˪óÌ{e@sN_sš~.ZȨ·ÓEâÙuQ&pdè_R6‚³ÐQhyIšs5–ÌšVEKpìng‹ª4œØäa4uåÒ #)’`ÚÄÙ²f -úf¶!ëu”ÆÍqrï4N»bЧ›9D+1n¶w 9o”Éå(ıœ„/%ÓÁQpW_3è:´ƒÜÌÆòëvï…üÚl?¢Há^[ØQÝni`šwU0ƒ&”])íñJ-^© xHð’FPŸ…)n]MŒC5aˆj…°Ájgä(´UfX![¥ìÉÂPzî¸y€ÇDéIä]N±©60Ñ™¶)Ê\ÕªæÚ¬¾»Š3·N@?ÀܱgvU§\%3ahÎÜoE: Ðݦ¦é»5× ½SÏæó• Yж)aq+ýVnæG¹VÍ%72öËçtH¾>'9ý=ë(Õ&ƒT›úYˆ¹6óSH øìÆ79ɧ.åoÒnžùËn@϶¿ïýŒ½F¬é»¿&™šÛK"Yº«–¶žyXSvUûm§0Ðe/ÌÂOr—ceÉ¥¿ºõw²]ÝC[A>à6ðŸ|_‡“<¤. X[ûH`®KÒÍ÷A€£úð}XW å4kVôéNÓÊÉVPŠ-#9o-Ûš0ÙŠÍ–òäAÿV¿›S´GÏØл?pǧH¡]R'Aä}ØQÔ' Š<µC- –WB s?zLJÄÈ:FXEÅ  Ǥ?ƒÓG/²]4› K óÍ94ñÎYù` ìî¬{ÃÙ‡afƒ£­ºº6؉W£/Ý(Wgz Ì–# Ôü“zåëÛ¿¿ØÊÊP˜'¨(³/E·{Ñ¢ÌX˜zqþæâã9Ñ®"µeÅlÈì3&ƒB›‚,sE¢b6“TTº³øØpâ0žu‡à@IH¼S¾f]eCCØtôó‡‡C·.ün¨÷î=£&(¡„˜»9G…«’(jàX³á¦=J¾mBpUß¹nyÀ:¥MŠÀc»¦p}[â!!åâú[‡~™.-êãáUÃÅd~žØÍ'× Öu«:Øñ°‘?zäËË'é¨,Ë endstream endobj 2957 0 obj << /Length 1376 /Filter /FlateDecode >> stream xÚ­]oÛFìÝ¿Bè“ Dªd}zÀܦZ$A–8À¶.òÙÖ"<”´ÿ~ä‘J$[[m />žŽäñ›<{ÖÆò¬ß&ï–“·AbÍÝy<‹­åÚò=Ï ÂØJ|߃¹µ\YŸm?ö¦_—ŸÞ^ijj<>ç*ÿ¦3±›:³Ô–—çSXH4ñø®ËÉ?@Ïò_®‰“ÈkVN>õ¬~²àhžZϵ´B$ € ënòû ¿ýÕè†}]|ÏCߊ£tIr‚ˆCñ@¹h@;sç©ßiw™+9|[ÔS'ˆR{•ë¬ÎË\ ÕСDñ]çšv•Â5±wHT™ŸÂ0XÑùûÛw7·„œðÄKÅüE#\#߸ÙÂØÂS¬FÖñF<û `Ƥç¹D½vM ô­ój¥a´¤–ã§n²q—[c€0±×­Ê ØÅ6‡E½®ê’Z¥ÛîóS®åŠ>ß¼_ ‘&¶ÆÒ–ve?Ê1+„fžZîD-Y|§½P+¾¿®¦NÛˬѨ(々æQD‚÷n‰ç¶nôNd’v 5íD1õí‚àL…&0Gqc@Û2yЉÀ©&È”†ö&©7„Ôj©™nêø6Ѧö/kÍ8¾Gë®ÎU–ï ÆÉª’ÌP)IŽ*¶®«ü ¯"ìú!7ÁG¡iÍÕ®m4jÃZ¬DwFëÕâîŽY!ãÄ~œ;±‘ÝF‚-jÚ=ç ß»ï@øÔ9otRh—*Î dŒ·Y䦭÷ï‹ÓøV†.n“ƒ¢ðÅ‹L±3ØÁИÕšël`gTu‘çÙ¿Òr}yy6æµÊKí¢;›ÿK4Ž¿–¢ik9Fx£$µ\µÆ¯î£JõTüëÍ(‘–˜„=Üp6ªê.sµ}ss»|7Μ*1MúØ©ä8¶j\C0Ä¿^þö.röÇ ò$ë‡JËêòöþøÀÕf¹ÍL¾­Š¡MúsêYN5&?œS÷cët‹výüh‘o†EiW£ª Í@c:v÷ƒ¨O®´ûcÉ•öZ—yKÆv#5{7­–šÀç-Æ®™º·ônDížñ}ûüü„qQžL=«aTæSÁ×RhÿtÖfÒAx•Ãû#µT™°‡‚®LÌ…4#ÂìÎÑ€I…·>›[ñ=‹‡æYd#&þTôaSWíNŒ!„«yWÁã)†Ó¹\‹¶hè gD˜ÂàžˆQ>ª¬UÐbÇLs¦œò4!Wìp|‹š†»å Ö=`Ï8 ZŽœLp›(sÍ‘Lª êœ :ß@¥Û«½¿Bþ\5]6 endstream endobj 2965 0 obj << /Length 1384 /Filter /FlateDecode >> stream xÚµWKsÛ6¾ëWpr"gL >=¤Mœ&“¤S[iI”Klù° È–ÿ}wP&eZ©§í‰Àb±Øç·Kêm<ê½]ü¼\¼ˆ˜<È2/d9aÂÞ½z×·*ã8ö üpÿRîúB[R· B!ü?åZÛûJoíч×hÛ+wµ,ei9ªÖ’ôVÚE/ËÝZW£«ºÓĨúf¹¸Y0Ð’zìà×Lãiâ­›Å×ïÔ+áð½GyæÝÖÆãàú”£Ójïrñû#“é8xœ­g”$œy |)‡à™¸ÝÁxc5òa"&R"’glÚÒ*2ÌA!óÀ M}+Ô2ürn{Ü•Ü8¨•ùš|ÒS¦X­&¦¨5 Lê«ý)ƒð‚8ä”-©³ˆC/B‹ð âÀý½EÃcD¯1ޏëå5®l1†Ú€R×}§”`Ài8TmØ7 ËRÊj=t /äɸƒ»ddÙÙrbÿ/|Xö­t9ðû§üX–M·îšÅžJ‚œdâÐØ/±×¸Lè6§Áu¨CÅö. L‚<Ùñc‘“DÄÿï°ƒ«¡ØYçó‡å;%o^Ëf·ÆŒƒüÑ×µÜaN_AKcþu=t$eÉ«@@WU?%’„m L;¯¾Ñ˜¯ “m`x~ Ûîp)Hà ÀÚLWp°Z¾ í;7v¸Âôqý¶jÛÊ[#‰YÔäÌRVUw±¯ní&¢,3=îéð°”$,þo²(? ÿn {WJ;TWX]' *³–Z"/v»ní¡­P˜ÔZ¹·ßšŠ²”µ¬kÇe»dpá†Àì1ƈѦø»öÃÀƒmQŒa¿!¯Ú¶Ó8ØÍÄmÐÑ–ÉÊa‰.6j¶ƒ£ÝãæýYátxªyÿ³&>)ƒax1ìñTçn…¿>gsæØÎ JýŸìçůËß^ÌòÞìŠVWàÍ1;%é”ÙÁ`±ÓÝr  »°Ÿ¿úpùfVzSì+£Øˆ[ÌëSÛfªx`£?ÑŽÙ•îŽrw°º?: ëiöå[Ù¯:5}zyñùm3ž?Tæqd¡Rÿ.dèŠ endstream endobj 2978 0 obj << /Length 1081 /Filter /FlateDecode >> stream xÚ•VßoÛ6~÷_! {€I!)êW°=d‹½µhÓ-Q·‡¶d‹‰5HV"RmòßïÈ£\Iu2"š¼;Þ÷Ýïˆsçç·Å/ùâl&Nd1‹üÖ¡„!„Ò 3'/.™÷9s¶ŠÙH4äi‚#r%ª»­ÇRwíùð¿íüM]H©ÕÄÞv¶âd¤ï£Ÿ%°¢™‹î®oÄÎ ™«¦Êó/ãc¿µ!$4ACíú_±Q³ë'H“8ÈR6ø#ú®Pž†!èz~»Ú@àùœs÷BJpKâ±Ú¢ ‡•À-yoP‹MåQ÷ ¹(Q((4+O(WªÀƒma­!_B€âÎê”%¨Ïˆcõ­ë>MÎ-sú¦§ãñ^õ½½` ¼¿Ñ÷µªîkñXíîðx†ä‰Èïù{ÔX!ŠÛ”᜞Œá¡/vªªÅñ0ò!ZU{‘¡®ŽBmѨzi%oÛ&A+­M¡ªvw¼»ÜRÞ«6ßvBnwøï­¢;tj|c)qmötàZƒ'ÚtS(FFÐÜÒÖ%ÊkŸwh©‘ê}³›Âœ‹AU ’M4©p_æk¿Á3Š=‹"ôPÀ¦ý%Æéª$ºò(¥î\üöfyrˆ›â±R€ÿhÂÞfdƒ~@˜ýcÿÖˆnšÈÚ¾ ¨­°Êî§š³<Ïõ8…¥4K”ø?ùµ6þa à,„ntr¶> stream xÚÍY]o[Ç}ç¯ØÇäÁ{wfvöÃÈv•¨[AR€¶†h‘‘Õªd@R@òï{f)&”Eº—™ðÇòòÜÙ™sfg—\ »à¸qƒ#Ò‚OÕžd'SˆNJp1‘‹œì›âbfT§dø&q\Cp)Ó3°+”m*qUm¾1{ ©#Ö`pv$•ldö%Ù¸XlúZ){V%Q{–åÒ,dG•Åžr›0±-&%Ú»C/bÂûQª=6µì¨Ø«„™4g›ÿ$–ž’¢d1Rs¡H6S´O‚ZmùT„f‚FÍ“j&˜1j&!åf‚£EYÍp1Ú,2\· ‹µTF2´XÈI–†Ê0–,U`,7/`Gr²7Æ …A„A)jž¦³ ±…Mj´IÔÔR“ØE„ÛžeŒªù)p‚›OXTDžmÉ ‚#ÄÀ""F5b’¸ô ˆF³—G<ËÑ\Afbi‰˜¸¶Äã‹X-ñUÉi0VcX† ø¨,íÛ€Q¶™‘ÅÚÌyàb1G‘.5ÒX~U³…\ÐĶn¤QS2cˆ¶fjÓ‡$Ãâ¦eù-;­Ë‰£K$f _$j&Rv‰}¬ƒŒõ0ò“„m=©`”,x HŠF«š¡Š¨u€…º¤Áº&U{ÑJÚ¢E¤Ô¢œ¥¼üÏJ‹;–’ƒÑºÂbfPÞa$Mx¹ºCœœ º«_~»ît2™.ÝåçEûü—»É¿Ý›él4ž} }¸îþܽïÞ~¤öaÐ]Œoî#Qö&µ|F¼)GO`gòH`§îäÄu—®û~z5uÝ;÷ÍÅ>›þ ïÿðáôü[÷Ýwüy¹/à¼oBÓàKŒªžLäZ½¦¼Õ™³»Éèj6œÌÏN'7Ÿ§³ùºSïÜGpYaêÂuÿÇ?]­^@ÓÌÑ+êÔäáþþz+˜Bhh(ÃW¤«ZRôà(h¤ÌJQ?4“xÈç øl:Y´Hž!ÕV³Û[gÐAÕüøêµÒýø!8«ñ0(5®}„¸ps9Fþ\wþîÌuWãŸîú)%··ãA÷vÇ“Å|YSñ¾e~>}˜ÝŒçË =û0Ý ßLv, ºÍ•‘ýóá o˜hsæ•w¼ZMÛËU\†¤,êÊ*HÚ¤ê#¶ ©ÉK*[Iúýxq:Ÿy7\ (™ÌÞvæäÕʱDŸ*7 ñWô»’Ëq¼!S² 1C¸dÓÑ­Þ¼-ngÃÅøOÿù4î&·ó#8…ÿYMÈÕgôTÕBµk‰3¡Ù¶Ú»š<¯T©p†ªôDSdŸ°ýlñÝ>Qôv£’­²¿†ë3 [;µ¿†ÓJ±y5(˵z‡Ô°Õrô()¿l4¨€½?WÛx~gÕ0¼°’-à%Ú ½Íùøÿ#ôm+F#å-U¦`OBµK¿o_À}Û![AƒŸ}ÖÍŸx{Y¹? >ÏÅ[voÙ$^Ð%Ôã ™| Ò³•yí‰Ä-íÑ üV,¾¨)ë½À—mBµÓž¾¬ÄPz^b(îVbÖÃB;´OÀ«¦Œf=šª›ZÌhMÒÌ=Ñ­1àÔs’×Rú¢£úÀòÂíéØTb}N%–ý©Äq*­ƒ#ùÊr4Ùщz¢Ñ£áŒÐ×oÖ±7äžèHeK‰Ú„¶“Õ®~hŽÕ÷^äN`ªèÏÊKM[)½7‰eC=”žõÐN¯_’Xv©‡²©fY-Ô­QüÆ’µ ,¥xêf ËqÐ\L{½Ñ¬>‡¼G9|Ò o#ÒÞ܉ù9w¢îƵvÝî÷z®F ²‹[dÝN°X®ÈP-cÙ~’}ópw?z{ÿ0_ŒgW³ñøY»Ó_¯WG»7<àÊ!N_ÊÏÓ©aÿR ´CœÖÁ¿ÖÌŒ¶<îÓlm/Q2uíU_§]ø¤iÓN®¾$:Ú.7B_´1[c_¿hk„þh{bÚÐØ%Ù¿®%>d]“\=#jÍ=Zˆ ³`wPÔ;É_¿Ôþðp¿¸û0 ïÿ:¾»ýüiÃŶýŒÑŸŽ)oDsö)§£ qâðÆ¼žh”›Ê½Ñ!!ì}W)Z}Q> Ú.Œµj_´”F›?Z3‘ËsÑå´¿èòãµ½ýðõ8øÚµý&ÝG޾üa+ âhWБ|²v"²Š×¿*¹ ¹;=9iºÓ›ÅÝtÒ]v?\¼·¿ß|^,~š¿îºÑôÎOg·¬¤tóHZùU ú ›ž¼*ßìÂZ@U±[ôˆÊQœØ5Wg×`Aêÿ¸îúÛ'»€;àMà2Ž„ø±9¡Åv¤„®L{ùòúõªzù‹ÑpþÙßÜçÏ YÎ;²uðÖBö_A³ endstream endobj 2990 0 obj << /Length 1192 /Filter /FlateDecode >> stream xÚWKoÛ8¾ûWÎE"–©×.zÈ"Ín‹"h{h{%ÚV!K®$籿~gHI–¦µ‹ &5g†¿!©µ¶¨õ÷ì¯ÅìÕMàY1‰/°+‹QJ¸¬1ðØZdÖûööCQµÎ·Å»W7<ió8 å`Ké±€£ÒŒvæß,f?f ºÔbƒå „9‚[évöåµ2|gÁPYJuk X<h¶°îf{Ç­r_ˆ±ûŒ’@0+ðc±gî3!j2Í#qÄú8þÉ×›þ[Çå~dßJè/ŸÙUÝ (´óR]çÛÁ¶9Z’ÐcçD«£¢†M ¨¯ùÜ$kiÌÀóŒL±r” “¯Ô§hM)rÐ`$ö»¥ªåw™¶—j˜N‡j™íSÜ ãhY’<{4©„• ãx–o!I>¥ökݰ?¼©b ‹d)‹‰æÍÕû»7F£J—4ùr2A¼ÚîdÃh²!›ÃùÍòŒ3vís?˜Qðù’éwm~ÁÃP.£ù¥Î/¤` Kç0ÈŒ)+rŸûéâó‹e†s£UÉÚ°v#‹Õ°°: K8ƒ¤d×Gú´mª’éÎÄÈüâÓgsª !J쀊 rv®êõ~+K‡{vÛüô ýâìè“qD±þÖ#¯gØ;¹¯“Ž*à ?° &Kº—ùÄ ½£cwúÒÿnò™j«CçK– XHмEù“–,«Ï¶Òí¾‘Äq…àöÛ•–”U«;ÍNqŸLó¯” ™]¢8¶ñ£nz™ÔzuÙhÉ 8×Íý6Ù]¤ØÓcSÊË¡;¡^5MÎÎ&¥Ó7ó3²ïI<“Ú»žö“¡¶(\ŸëáˆOwsTV`³úBUiÇp3FÅ+¯_ˆè|_OŸìäu:ðTHÐ?lwP`‡…Ïí­£àÀœ*ÇB[ꤛ„øS¹…,×íFËK5s+kºÜ;87mq§ðû€T‡Ù°UÌ~Ê˵{tMp*þ“›\?7GºDqR%Òæx9ÚÐÎGW´€`ö FÓJèÖØûMuI:ƒÍÚqº”n>¢óÒÿø×•÷d7>ÉÝ$5£Tœ îó¹–ÿÚœû¬KŠJ…2• l{SÏO& Õqýú1ëî¢(­ûP°H ·_µ›Îhxì¯ëj¿kt¯’ƒ]2Y’˜Ê(и.”“òFIÈý>¯Ï.5˜Ü׺Áòlx1? Ʀ⎅¢ïЮruh[Ù£‹y·‹=ÞóNáÞñ}¯/ä§[ËâpÊ;dñé­ëdl]¡{ÙwÅGGn‡v{ þU_ÏZä–s¡tÙ;ÃO× ø„ñð[A0úÓh™‚È&é†ʂႲD¡4 {”‚HQ rͬ0K[™À ¬(ö¯ tw3xpþç2 endstream endobj 2999 0 obj << /Length 1181 /Filter /FlateDecode >> stream xÚµWKoã6¾ûWè(kFÔ[(ö6 Œmâô²Ý-Q6[YòŠRÜô×wÈ¡dÙQÝÂ>†C}óú†v­µåZ·³Ÿ—³‹?¶R’F^d- ‹º.ñƒÈŠ)%‘ŸZËÜújÓ(p¾-½¸‰¼ÑQ8F¼Äƒ‹ô¡EÝlY)þáW¬eêøÌ5_éÇ‹› éÏ}/Ñ̽6}¼¦b䉕?ºád‘ôðá_ê²nœ¹ïûö“†¶ÖÖË¢ß_\â¸sæ^b×¢r`h¥Ú ìý†W(Ö8Í:ÙÖ[œËŒ•§xŽ-1€æ4&QhœV79oηâ±ñLÏ0 #»ÝpœàM8-ÔÛ»²n[ Víj;TDΩMœy@{¹Å«ðž ±ÍqÑI^tåÉ•YS«‹ö9Ï•1w©‘†!ÂV@¤º>¶E¡Æè¥“•°.Ì!Üå —-î°†ãÄ`ÑVéuמö( í/ã C)`lƒ_d¸àKœ•o×›@ yZ¥È1ÆÞRïÓ†¡Xv+É[ÜjkW-“V*<ÇEÉd‹z¸¡[W½Þ–ôÃY$7õž°²$/KùtÚ`ØŒ!Ê1 RÆj«‹ôª·³®Êgœ}ïxóŒBVƒ*.ÖuÚÜ+MzßBÈùF\ÿÝ6̸˜5lË!o ô“²÷8ÄD³ÓÑשç“Ðú«®Äö DÉtÇ0=š I€\„Ïÿý‚‡^AMA™Â2‰PùÒ(Á$V£tpzÿÂIÔ%qJ{”;Öf›}ÝüuôU`ñ|6L¥A¯»^«44…PA†ÿÉ3³!Š Å`o:x(«·+Q™ŒþŒ^^Þ?^O|8ŠÔV¯ø“ù¦ªÇ½üÓQñ”2N³P­Àñ¼˜R×ËÙ÷Õ~£CO UO #+Ûξ~s­„PÙÄOk¯n­ŽÄóÒz˜ýö"pî¸ñ"Ô RŸÄ±iF‹E[ß6l·9ÉÙ(<Òô ôôÐŽª'Þ(ÃÂÄ^¨ÚY9!Ų’Í€$ 5—À¨ÈX‰˜|ÞBŽ7"S ¬Dém£W€A/QÿU ø(?â#ô…;ñ 4V—Y#v­JûHMă[4;Šã÷Å+Ôb|4â[í#ÅJƒ´@‚ñéM”8=©îGÉÖÓ•ýΛåÔª!A×W©W*‡¡B×…Šêi[/?ã°x¼»3öÊ|Ý8Fò›Ë»‡ë¾W¼jˆ!šfÝm¡wùžÝÊ7íyÇŽúùä|ùvwèC`q‡öÄíï·‹ƒ ÏrÓß´ 9f_H“¸å§C_{¡.L×~:åVÙ¿¹yO¬Ô½¦£æ¼`]ùqˇÜ8Ûð+Õ·…‹b€…¨ò³*ƒ¹Ùïm\30Þiö¥âüïÒ¤Ý=o»¦’G cTÏ}æ(Ìêábh’øhêúÿos qL<ï½ÿ;o÷‡Aù|О¶ Zmê?†Î©½! ­çNVwø”69§¬Ã¼øùAÔ—T`ùZ<)aÿW ؃©Vñì$M&‚Ãþ޹N endstream endobj 3012 0 obj << /Length 963 /Filter /FlateDecode >> stream xÚåVKoÛF¾ûWÉ¡P®÷Å% çᓃ#÷Òô°"׊4È•÷×wöA‰6²Û"@ƒœ¸Î{¾o–8ZG8z{öryv~)hT BP-o#‚1b\D!H°"ZVÑñ‡®ßʦþK½–Z.þ\¾;¿dÙĈå˜K«NDj”ΰr~ÉñD;Õš9£›A®ÕÌì[OpǧçQBrT`HöNq·ú¬Jýë"I1ŽB #&8K(C…·{þÜi|dî¹UzÓUî|ÛõîP6r\D1M‚p”fdìÀ/Ne–'GE¾Wø½—º¯¿\±åéIO I ÄMaHE*¾Q·­±°vŠ©Sûá[0ýÔzR×]‹¦øÍ=ž]uë} gAC)…ne©Ç¦y[€ÆA“­ì×u;Wž+úWMW~AÄž)¸¹º :¾WýªæÊËë›7Ae€†'žý0s1 ò!à‡‚ÎN†sÄÓâ'Ì?€ø1ðQíz©C€•‘ç VŸ×ôŸà{&-(ŸDÆŸ+Ç÷ž¹©àÊc£‹~½ÛªvÁh¬‡“Wß#Wž›ÏÑ;»¡3@¢ûMí`ŒT)â€ñ<Þ:!ñ‚ÍðÄ€¾Rš›Jmì;É„ÄjAâʈx¬;Ÿ–Þ¨Þ-J ØUÃÓRäÓS€{<ç„P˜¥oíûC.#Ëjs˜{?NŽMüæHˆÜwzˆP‚O¥bOc÷>aŠƒ»¤£Ê”94ø_È21ñG^,¸»\ä,Vf Í0v=ÀŸá<.»ÝaZ¸ðUÃ%K#ß8qi¦×4îEŽÆU}_WªrÒ•Qp`®N¨;-ÇË’œ‘k~“šƒÞÀþ³§+ټȶr‡­±Ú5º¾kjåecÎ^IrŒ0ßïÏÙŽy¬—ÈôöĦö¹Öذֺ"©ù©£Gë·•öy“4ÝÚ!J÷² Ö­òXÛ u»%Ì(ü#îäî`àØA)û>|uuèD,ÀdŽ> stream xÚ•VK“Û6 ¾ûWh’‹4³bH½Õiéf7mf»³^’L‡–h[]=\‘^gûë ”c9vj_DˆÁ ð‘ÔY:Ôy7ùe6yu¦NNò$HœÙÂa”’0Jœ”1’„¹3+O.KïËìý«Û$Ø3 cJ²,GÆèáúÍ´Z¾­ÚxBíøA˜’ MAHa2ÄÅ÷ç‡IäÖÝÒW=oå¢ë®ª®Õó±[IÔóõº®DI¬›¯¼Y×\j4©ÎÀY (Y(Sôõò%£n…TþO»B¤Pˆö8J®¸náëySü%qýbèæ­½´¾™Õ6óAkvüÙ Xæyk·êæ˜/­|Ã7Ïû{Ð0,tÓ–ÚÇ~\;ò¹™Mþ™0XI¶»vÃ0!a9E3ùô…:%(Á9LeÎÖ˜6N™F!ȵ3üq2çænU8ƒ$sB]á4ø¿k;‰Gk(M¶»–ªe[}¦aTx1\D­.( –¥qbê.t»ö^¸]ƒJŽløƒøiB /‰ã¤GÞ0A’‘8³õúVÈ¢¯Öß]|7RL1j^ F0Í£ ÿJËš¤(­ºÅopÞ#?Ná©£Éakݶ¼~–ÕàA­¸õ¿2”ˆ7¹ÝZA£JUÁ›¢~¶S»#Á‹Fcr #ˇ•étË ÛJ­,%ì½14Ù*äÚή%9‡>J¾çSÃé¼ï•§î$SnÞ£¸°K¯Ž…¼.$ºë«{â5)6ãö¦„uNÈb3†5¾}s7½9jÞð¯d-z².F î?ÞÝsÿHß½L†šå?/é5 endstream endobj 3028 0 obj << /Length 1176 /Filter /FlateDecode >> stream xÚµVYoÛF~ׯ òDåšËå ªZ@‰”¼8A±¦(‰-•KÙÊ¿ïÌÎ’eÙ–€´wîùfƳ6–g}˜ü¶œÜÜF¾•²4ò#k¹¶¸ç1DVÌ9‹Dj-WÖ=wüÄÎÛ,¯qÓMïÖŽÛ¹ó}ùñæVÄGŒD±Ä F³àQŒ&ž‘|sxG¯Ýþ¹ëÇp)ˆhÚnö¾Ý©ùé ì‚c+Ëå IBŒšû¿ò¬;Q`¤n±4ñ{mù¾•ã !€ÖqÃÈ>Ã`$Ò5\0‘v™b{•_.x>[Ô®Á5°š].60bdɲýÏÝŒ”å>'¹@Ý|ó„¸Z6*¼Þ—å岿€ƒ\߇oÍFÓë]Y¨ŽvÍWaoò:WtõÍ ½uÛT'Ô»¶"–¯èn>›ÂkÎè4U òJõt²£üçÇ1 âppPÛ ¿wEu&×Ýþ± ¨IÃH¶RQ, .9$²>¶ûô‚ОíÛÖ`ªüá$Âþ…^TxµW݈œ*ï(@” ¾u8çöô÷Åûëó¤’¶Ë[¶Ë.ÖòP~àwGvmðo4méCãp{M[4Üj½ãÐnónßÖt·;¢ !VŒ®!1VtEDŸ¦ä@ñ)VOXë\C@ÕQ šÚ8o>£uÕTE-»¢Þ_nÍŒ¢5gYËò‡*3 2*Yi@õCæû1‰úê¤EçªÕ‰cO«Ô„¦1Ù¹Ö´tÆÌǵ·¶ÛAƒÛ"7Ô2ÍGÙšOªUWd²„P@†Ñ­ãr»€‹M]ƒLÖXÃ;úºî¥JsQæR™-ùñH#òªVÒõ9÷Ïgçý‡æûn‘#7@Á´TÍ3Õ~,±Z<Òö󫵌ÜWxYw:îeö÷¢kåã‹=ëÔ€÷YíÊüåN5ÂgÌ¢`Ð:hrâµ’Äúöfw_eªJ–å¬`ƒƒ=ppßžgÓE±ù€é$ÿQ@9 =oèBúð+-ü­ß³›¼_Nþ™pí> ¬>¤wVMî¾{Ö >‚`P0±õÓÊ Êq€-¾´“OÏšª§ŒqŒ@ý(àD›ùƒz€é¢y8í˜Q8"öx¼/H3YfûRv˜Áô7ñ}ÜöÓMfrË4×óIõZ7~B7ý¬ 5Jñ@k÷ÚÄã:ržfÀÙÑzC)2¡ÀP3FÄÜk #Øœ`N·ÎØîÝ÷2P,—üè:>ñ‚é’©> stream xÚWYsÛ6~ׯà¸/ÔLÄð¯Nó¶N§™4=¬t¦ã¸˜‚$¦¼J±õï»H‰2Ú}ÀjýöÛÅÒµv–ký°øv½xù&ˆ­ÔI#?²Ö[Ës]'‘{ž©µÞX×¶%Ë›õÛ—o"ÿD5ðb'I#0DJ¿,ýÄVm¦*:¹So–I`+Ùõ­ºRZX¸æàËõ⟅¢kyã™Q,œ4±²rq}ãZØ{kÁ,Ý‘fi ¸U, ëjñëhî|$¿„8õËsHxVÆNœxæÊt]ºêü5Áãpbć zƒÇßÉ"ë Ù©å*H=»Û¡Y† ¿‰tïÕ[e±\ÁVÁ3R«ûªÓƒ)Ù±tKŠºÚ™ÚüŸ‡]þð&QóÝár+@) C¾$&öV¡%ô’,jòs> AàÄ~üœ80Þî "7pІîò½ÒY›7]^W˜pO¹˜€+‰{‚ÿ¾ÞçˆOèÛÛ¾ÊÈ Ì_y[(³u@öÕ=«Ñ’:/¬”É%`?V8x!ouÎcÖ` 1rÅÙ_2ˆÜÒmŠ^ˆ1#´œâRÜf‚ƒQ„Ñý-Fd:F¶_¨Ö:'yiËlÕfV·,(™á•÷<ËTQ8@²4€ƒÅaìµÚöËw{¢žÙøÂ(ׯL]6}§Ž—:u#b7f1^ Ð{ö–Å®•G_›â8J¥lPˆèLZÈQKìO]mÚuvªRÆ9Ž‚‚cî1Ô²©)ø¥!ø­øO™ÉTC¼ó0ìU Š~˜>8ê¼l,(S$PÈê¢/+£Ð—,`¼&Z¥ìÚüžå‚d01ö«6Ü!»EmTÉ;ÆhãÌ ùkø5ã/H›é+›üs¾QžÜâͬaTƒÑK”ÉK˜c 0ûAÿ„ƒxP^"f>¿“‚°Âlö#'ñM6ÐH“¹2ð°,LKùPÂÇ«øG7t ü[pVo?©¬{1‡[#»Nµà|èºö+Þx÷nVùˆÀS´V§’¥zš¶ÔZ¨’æêÔ%“€à®÷Ì_·»¾B>îKØ?†¹8Åðì­œï8‚§ÒžÊ×Ì+Õ·Ò0±&‡‘=cgròÊZy‘ã§þ4NÏ=¿U;uÏâj"¿ÉÈݱ„“: Jr'sH» ~ƽ3º<çÒ>T±úè¢Â¤Å©±ƒÊk¨uâùãv²­yÖ´5úC9ÿÜp}û.ÇÆÍ|WÕl(4 ÿ1à‚“ÕIMñyVäÆ4x2 ï)i? â‰c©:éld'y:,ß¼Z0Bþ€wðÚÜcè0†Q_ðkÖ\ÐÙ¾(*?º”•Q6§ ÏuZ¡á€¬cÎÜåÝ~RŠ ‰yÒ[ÓÂæÕG-¼á 9FšJñPÁuA3<7üEDçÙ¬äBótJ‚úé£aòÚ‰¹ò“ >JAé÷eÁ+Ò«ÿÓþ6Dˆ"Dl¦ïެ£f–rÜ!Èqi 9ç0®#꬈°+žŒ¨ã„P'Õ–ò-ÏË©æ´hnÚÀGGæà¶œcËc¥ÐF >Ä'´GÚ|‰2b†2Á”2ÿõn\ÞK臔~ús€±HŒ1„.Ï|Lâ¡ø<_4·eö—.¡£¸Þ/ÉŒîWüö|hᔼE1àÀ9ÂA §½&.@‡ÙPgK»µY„.3;6—¸ÄÍåüE´÷?¯/¿fq=æóñ!¡ä>é¯îêöo}Ö@íûRe<%¤’vXþƒ>^è1:˜]5òMn>õzèèT£ª ÷íÈ%cüP×ީ'ÉR}Ð*§°å8¢t7À1X×× w\NÙ]ÜÜp‡ýÍŠÇÇš1Ó0P»þŠU&_˜…Iœ¥‹?Z¯F~<à|Àþ ¨}V$ endstream endobj 3052 0 obj << /Length 1060 /Filter /FlateDecode >> stream xÚµVÝoÛ6÷_!¸/P±¤¾líš (°"MܽtÅ@K´£A–TRª› ûß{'êÃrŒ8Á:°Èãñ¾ïÇcÖÖbÖ¯‹7«Å««Ðµš„nh­6gŒz~hEœÓÐK¬Uf}"×EÕüR´º‘jeÇQRÚŸWï^]yÑÁU/ iÌ<Ü]âa‚L Öëº\-¾,8,™ÅG5aäR?Œ­t·øô™Y¾³à(‰­}Ǻ³|°$òQlaÝ.>ŒòŽ¿/¾è g4ô¹>õ=÷¡/½£ˆE0»ïÒ$æƒCxÓv¼ &©¹¯q¡ U˜O£ì€iþPúiÇ}Ÿr/|ŽãÆAv"Y!‹hÆÌ·R§*¯›¼*gÎMNβÆcËqu#oòò> stream xÚ¥WÝs›F×_Áø fæàøzèƒÛ4žZµä¾$™B't Põ¯ïîí! ‚j©}b¹ÛÝÛßîí¹Fn¸Æ/“Ÿç“ë{?2' ½Ð˜¯ 溎ÏC#bÌ ýĘ/&‹\ëÓü×ëûÐ;bõƒÀa¡ŠÓÔòb³*ö·r3-ª&®>çúž»G’v'j{,ú¤à¹IsÑ;õuüØæØ°Y¢’%püTÔí®^̲ªÝ@Ù¯DàPp- â­‰¬}£¶]½ÒV›Ö¹h\”ÂÉŠ´i,;p]ó'ú\áúU_0øQP.EÙö{~xÛÈïM–nGëöþT{ãÇfUѪê´Ì…7ÎÝl Ù:‹ý+¶éX,Ä étfô„îofw£glëvá´ûÿÕûÇ+ÅmärÅk}Ä`޽Øa.'¾›:ßmDiùžÙ6ÿ šWÀB µWQè$±×Áü¦´lß÷A¼ M%L +úêì!9»:ma)›ckí6ãŽïF§÷ºy6ó Šž†’hS2a™vÀc·QÆsH¾¥gŠL®ö²Ì‰!- Ú¥ãim ªL7Bû%u Úµ ñ]+¬%&ÁÿôšÊæ\¯)˜[1xqÊvmrE߯²Ù¥…ü[/£ù±I=#meÕÅ Û‡Å̆~¡Ît+t¢ˆ–õÙ@ûO9Ô‡‘7Gx”]Ÿgʳær°³œm÷LŸŽv¡ŠW5‘T$áÄ‚CšB0b­«'4;™Ïe¥4fˆ«Ïø\í´h&³yéX6˜y8褳Šð¿Ì¬@AÚ˪´O7oP$fZ.‘ˆÿ1Jˆ\WzÁ”æ ü&.9Üh E4è/jBâ“â‹ZŒæZ§K¡E!X#æµØ£ƒ—§ñÐòÏÎåK$OÁœhèï›l×Hæ°FÔZ»NK¢ªR/é á&fn¯CèàUÀ A¶´)¾@59BÆç;-UÑ÷¥^Çî™±êõ©zuËZ U!Ä2´ô}²‘­D7ñwZIrî°%àÖ°%#ŽIK¬ Ñ*Ý­ºŒIYÝ}e>Z6²¤üE/¥ ´.m †G"XdÞ <ˆÜñ¡6dCìM§ò©É„XTEâÒÆ<ÍŽ9ÔäB%qÌD´]›Ù¿¦ßÝ^^K/£ÍÙÅÔô£ò!༦Üzûôn6}"zÞ¸|¸t³Vå<ä„r$ŠT7¨Bu2Ô<Äpa F³9¸/lιN•¾Z¥¾ß?:cÓZÂ)bÇÛVÂŒ±ñ‡ÏÁ”v£oô“þÃFé»›O¾Lhs vxÇx.LðlÉ6“Ÿ\c ›à­ã'±ñM±n žGß1…1›ü~rT¥þ,É\'äpX ‰ötÍNO¾Â ' u³Ãë ¤rÕ¸âÇâ£^±ˆ;±ç_âYïŽ<õ÷œ(ÑCØ­h²ZRÛ¹$Oüåé>$É¡$¨Ø†–{䨺*Y`Bs]‹šöõõT¨-Ik)I·$¢Bn¾Õ3ÅñIIWüŠÆR‰H*3làúÐN2Õ Rj@ÔùrèYZŒ•ÅW+àB—È¿@~ì\zîfbÛÔÀ6=Hæ?míW endstream endobj 3074 0 obj << /Length 1008 /Filter /FlateDecode >> stream xÚµVËnÛ8Ýû+„®$ bHQ¢¤Eif™Äé¦íB–iE…‘š‰ÿ~.E*m¥q"š÷Ü÷‹Ø)ìü±ø¸Z\,Yà¤(esV[‡`ŒhÈœ˜Ähê¬6Î÷Î ·­öK/¡.Ïdßñ»ª•Þ·Õ_KOØiÊP‚)ILh¾‹eˆ'h„ûA —T3=ЬàÛk_NmOŸ¤(‰1L¾*keêWa%r@ƒ>ð." k×ßy.ßdl“Š®íwh½÷üc÷ƒþÜ>ÞÜØh¦Ñ9¯*ñÔÞih“ÉÌ‚¿»L–Yõn–g[•;”·m·±•,/o®Æ;ðœèDÙ¡WÁ R„cüeWô5o<¸Rü0ú¯E=†ó(íV‘Ä ¥I0ÖÈï»Lz>¥xÁ%æÎ°TúF‚ObD€bçêlÍ—DkƲ)ô¯½(r³®ÌÖ×7»Ž  ´€Ôe£¿òÉ j.3•Läù!Åîßf}5‚…·úÛ ~Ä]tžOÜÖ#n¯;.ù`ŸÐ1²Ì¡4ÌQ„A :ä}×Y(L^øÆÐJYr#sl“ÔRD‚tŒ×ŸÀ)…š¼´X}u¨6+î\ Âd4¢^Í/ ¢QjMÛëìì~†U.ÛÎÔÖÖDGwé±Ö„T ³Á åÜfLŸ"•šUÕ„ýMæ ôÐógûp›ÕܶÞ$9twP<±ÊEÛè%zÛ½pœ”E]Š\Ÿ„Þç™?3~Îv` LZ糉c³ÑÖîM8U[Àré6e“I.æFUjk¦ãê³—2HJ?¿(ŽËïh1ÜsXa͘YmOQŒU`ÆPtC׫Å? ’±C^6$CDÓÀÉëÅ—oØÙº®ç¿Z;!”}ªmX9‹¿_¨Ã¶;`ÄBâЈ¡˜±Ã>[Úëwâ1‹,þbFÆ4ܽÔI”¸K/Ž]îEÄU¢Ô÷ nÞÓ0DŒ%?ã©öÏ<,¨‰IÄyWîd ¶ýLÇwɱFcS‡ŠF9îtm ¾‹÷pǰ; […‘ê½AÔ•B˧¬ÑÒL[5ýÕÙÈ(õÌ0âcˆØ§¶j»#Õ‘»ö %÷úœ {-–Š©VMËs.D¹Ö:˜âSPøC‰ÓÎx¼?éϣݰä2ºzc°@úÒ—h®ÏX0@¬>û¥±IñÎ>ÈØ›²­– f‰¿ùýÕämeÁs^VP)Ê•g‹Pñ¦O§÷£õj}\êÿ¬¢ºlPÞËv»µ¸ñ죳ΞçÀ·—ó!jëºmÈ3U{üêþñú7¼:OªÌÿôÆ£ endstream endobj 2987 0 obj << /Type /ObjStm /N 100 /First 969 /Length 1453 /Filter /FlateDecode >> stream xÚÍXËn[7Ýë+¸l7¼œá  ‰á>Ð…E[# ÕQ›4®d( ’ü}ÏP![W e[€7g3Ã3/’\KpÁq-ä$Ù?»ÊöÅâ¤fGEì~bCªãlPüDnØêŸˆRrÊeµ’Ór‰* ™’Ú ºLdqY³Í.®„hoŠ«ëOÉQX ÌöS\ Lq‚a¤Â&â¯#%™Ù°#q$mœÀFÂW‚©xR¬¡+q²t¥Ì¦¡8ÊÔ´—“-¿ñ€Ç`"U2ÇÌ$$“‡G¦`òd‘²°Lm)3A‡±"d8N’á‹W(W¬*ö ü¦`‚ï’4Á ?Õ6‚Ëú«ÙÈf2›=)M  ÖrhRl$f,/fï×%²½ûyöúíôùâ“;7P"v¹ò+(š.1Û&7Sn¬…ïzíµ¶¥gÐ*#Dm‚¿•röAø0èÈ>¢Øô¡µ:։޽U…¾áÓÞÞéÓ¾¿»ƒë¶ƒkÞÏÁóù|içëniöÜRÛ“áìëöüÓÛù»Éð|±|=[6ááÕðýðÃðâœÚƒÙs•n¦ Y"¾ZñKâ9TÀž5úÎÜðÝâåÂþoNÿœû«éêâÍÇÅòÝ·F̦kjÙ#þ6Á›^ç~4Š€-Šø-u£è}±Öê®ìC£àúÜK UõhˇAÃlÛ<´DŸøå|3ÛoÔö(çØ¬ñílo;Ã;–ó¶ûìM§›àë’ ÿ¦HhÆ^ „r‡"º»KVÛ¢_3ñIîÉqá8݃ã¼Çcû­˜<—؉Æ~‘›;Ñ1Úž(Ä×XzѤ¾Þ¶û¤„§»6Øv¶2{ÚÑê!;-eí ‚„ ŽkžÖ'Oyg£#cúñÛ6;í=-ÉÁ#¯Ma³,”¯™òãôâÝÙj9ýx«ç·siqÞ§H¡5[Øv£É¶4½hA§ÅQ¸ŒI:Úv–)h¬’s¯Ý Sê•ÍÄ>i¯/-°C¬ÚB¢LÈHg–{tfÙ§3ËXgΊt«‡A£V •N´2{»éCKŸK¯%j”{9i¡VîÙbú íÞj+v´/vbH´Õb¤>dg<Ïv÷ÅÔªhD[¯)Ù™æ}z5{òäêr±òWo>_.¶Êºîá:³ðfʇAÛu‚5á”›¹M <ö.R‚‚ý^´ÝRdJhªÅÛ=úAÐ8@ÕÙ}I´«×­\Kq¿\Û\{’=¢xüõÍÉZ%ŒÞ½Ž£9ïj­£h$º&:šU]ù‘ÝÆe;2ß½ôf:À¦žsñ9Ú¦^Pgð\ð:§•÷d¶ºxs<]M·jnŽ{Dë&xg´þ UN» endstream endobj 3084 0 obj << /Length 1494 /Filter /FlateDecode >> stream xÚ­WKoÜ6¾ï¯œƒµ€Åˆ¢žzp“¸hn²é% Zâ®Õè±ÑÃöþûÎp¨]i­8vÚ‹H‘3ÃožºÖÆr­ß¿­Ï/Dd%, ½ÐZ­-îºLø¡qÎB‘X«ÌúdóÈ[~Y½~~z#Rø,òc¤‰.•åiwÞ¶réÅö9®9èù…ïŽX×ñ"X$á¼Ùô¥ª–³»vÂ~<‚8 ñ˜‰8&AõÕ?*íŽLÔŒB–ÄÞýƒêÙ-!ð. ´gLŽtŒ‡ƒ"Â(°V²ëÕ>þä¿–±°á¨º1§¯iÜKÒ]£oo‹ºcKÇ÷}ûB3Ê%·7·´©¬Ì¤.•ÖÔå/Çʈ¦˜…a8&‡Ø«°Tù£{Pç8a)óŠ¥}W¯×s–°˜ûì³™l ™‡A)ïF²¾g ¡H~?ý0ÒÆÀÐåÚV}I ²ÊÌŽ¼›îàÁŸ!méoŸ–-ý¯ÉJ¦Èum–éZ9ƒÒár»;J´ãn®–š:¢Ò|½Ã™oë%UÕ¼P´‚q…£vNàÜ’f¨Ž§ßž=;¥éíµj Ý©Y¤¤šˆ S¢Ñ)ºÀl´—ÇOÏ&xC îéO%#4e]±6•p⣣š1öô¾¨È·,­ë&{Bñº&J;Šlv0.p¾²ˆŠ~•ZvÔx·š‰O€¼€‰H ˜„TÎçºÌã–xè.#b~¯ ˜ª¡(š¶d3ä©é ƒCùjµø¶À›Îµø¾¿ ´Gab¥åâÓ×Ê`\ËD[·š´´|psäcUX~·ÖMü½Ë5ô¹%¢ îõçǽyL˜!cc~hë—·~T ï´í`Ã5[xÕã_¥ %ñ´†ºRùæúJ“5í& #æùÑSLBª»3ïásÆó~y©Ú´É·]^WOr¸yN¬®u¶&‰½î«TKq„ëÚ·9Þˆ¸¾%ÛÒºƒß¶Ý“aMÂu¼6 Ž.c¯{&dÊ;³ô•þ+%Ó|è–·´]’иz=¯2uÇæŠ›~5èéã ˆî {™ØÆ;—H?œéry³Ô÷µ¢°¨!âä+!úžÛQ¤E„· N›|Ó º1ƒq£:Úß‹ªÔ­^nûNeô³/óÐlEžkÿaâ[gFKýþ¼Aˆ¨A‹aíØ˜¶aâêípúš5ËrxÈ™>Ôò#.ÍúqxqÑ,ËáE‹gIÃÓ`›‹1Ô²¹j…±7®T[´÷CoáG¾‰Çé7‹6\¢ßãÑÛùlήUÅòìnöBcíf™öúâåëÚ¿Òðîã›7³ä`¯öq”.ÃLŸ<áX½ÿøj–C÷|cÊ}÷é†ôd–ãð ‘1B©dÅ%bÄÒÔ·oa³‡¥0ÎGÔ¾‰YÊÕ\Õ­º§-=hfœy¯/F(Àÿäæoª endstream endobj 3092 0 obj << /Length 1311 /Filter /FlateDecode >> stream xÚ¥WK“›8¾ûWP>AU ˆ—!U{˜Ì&[•ššÊfœ½dsP@¶µáHx2Ù_¿-µÀà03öæ‚R·¾þú¡&t¶Nèü±x½^¼|›ENY”9ëCÂ0ˆ“ÌYdqá¬+ç“û^²=•ìµäÕ–}`&™(™÷yýîåÛx5’Ž‹,ÈÃt9²Šõ¦Eh{ù6 G»ý~»­àcŒBWr{h˜ðâÈíÔDütuÉzîø$âÐS¤¶¨¡VèÜr’AGª“’cv&àŽcMÀo{{ùC÷Ñ(ü„öém]c…5ùƒk’1œšd7WêÞL_y~VD.1ç®Ü÷Þ©Þï¼ÛqáiàfëØ„ MØQÙ´‚ÿK-ÒéK¾ž²~¥'æH8LÆìÂk¤aM'°`ehtŒ_ŒäСé×~Ô´Ì}w{ ë$w·’îw8Õ½’`ÄfA_(—IáÞsŠ«7t_Ó’?Ãë¾Õ~.á:!ÖE­â¬Ç&»p¯¡=ë$ µúèäÜ´öb§ýÕ¡ã›)f eõ&Çfô$nQf`öøO0Sóu2ëýGE·ìÉŸ±3Êæ+Ýßa“ ó81{€übޤëÅ\‚Á(*Ò0tÃa¹/érVéQÒ4åc!ò* geD%¤F}аn×VÉR¹¼»^ÙxþM»½µRl «ä0ØjuÞ~¼¹y‚0|3#µüp{µ|JÌô's‚Wë«ëå,Ùê°gòžC×÷Ûh¾ªìWè€Á’G)˜ÀšWÿ({ì¡Ï­ûÄ>žÚ°)'° )ù)à¾üv wC endstream endobj 3101 0 obj << /Length 1337 /Filter /FlateDecode >> stream xÚÍXÝoÛ6Ï_aô%01úþ°7m† A¤Î^Öa mÚÖjI%µÈþúÝ‘”LÚrj¥6Éïx÷»ãÝÑîd=q'?]¼]\ÝÉ$#YìÇ“Ùjâ¹. Âx’x‰ƒl2[N~·¼$´ÿ˜ýruûÚÖÀMˆ—¦ HlzàlG9{Ëóåš=²ã¬\0ä»pÕqW·a¨ pü$#¾áˆ”³¥»-]ä´$œ-ÛE“W%ùÄžm'r]ëG9¼M¾ù…ƒ`tÍ¢è4û2/jƒß»ŽÜAîόϫš›gOïÅ^'Z Ýȓ؄®nš—‚U)ISµoÊ×mÁJ;ð­¦6@9@BA^F •‚ø d /&1ÉR¿óÌÔv‚ Ð8Åòk9mpZÕL¬¿Ø¢yÑaJ®ã%Ä•BsáðÑÚ¶ŸZí¶ÉªÈ’¦D •öêãÕ I 1lⵇ3tu<|ìI÷´P˜U+9B@±²QtÛaÛÉ–xª}͆ b/ Š¥A‚aä.ÙŠ ’×r¼ÜÙGÖ‚^v‘vžs²CëÅ8ÛI÷­ðÏ\Îø ëkim[³¥ü²ªø)ÉÑ‘ÅaoqäžoiD¼î"–/è6ÿ‡Š_°fS-¿ÝцT¸(ZࢌFó¯m' #ë®Z߇íYȤ"¹‚%WA}3û†¦uMŸÇÚ4&tå³Ô ¤¨Ò¬w×AxE£<þH:áxºœ>'¬(#±×GÒ;)gú5Ý+IâŽë«!àg1~ ËôL¶ •?ª}Ž Ž?”S9ß1 šw úƒå—|«>ìo,t»h·´tØ»‰‘1ÿ˜Yâ›®íÐrúE+ÚwpÆÎ‘'Ð42Z‰êx:•Ïi¾Þ½ $"•éˆÖrÝöXË4ä«FM`j‡” åEUv•Äöò4¸—CèªT}ìËu>±aA˲jº*¡ü‹ ÕTVkè½'£{(à£MËY=¶fÜ¢½¯@C⺩ÊN0éò4~VX"ÙÌnðMÏnðÝè¸ð{^ËÂú`¿làÑ múèUÍøoX(Ïé|ËLElóª0:ôШ,ÚCëUMøÐã»Ä°|U(‰zI–$ð>{ö™ªDyÄwr·‘Ó^;¹™ó5HÝQÑ®IºÁ|èm/¿NøÇȈ|÷â34°>‰*¤Ú­ÓOLü1åûÙqæCÓô÷ÑsÓs¥a4ž›°V™f²î¹Yïd éN†%Ó= k äJê˜g§öëG÷ƒÑÙ/ëÞ 'â¸ZËr##Z4µÑëᳺõ5{ñç‚К=¢ì§÷G¶tãûÙÅ¿ÉË4o endstream endobj 3107 0 obj << /Length 1337 /Filter /FlateDecode >> stream xÚ­WÝoÛ6÷_!ôIb†”¨¯‡=¸M3¬èŠ,u‡mh™¶µÉ”FJÍúßïÈ£+Q['( Xü¸ï~÷»ã‰»€¿Î^®f—×i¤H£4XmF)‰ydŒ‘4.‚Õ&øÞhÙ¾½šGy¸œ^½¹¼Ž³•¸HINcx¡fYb…fÔŸqyÍé‰ôb_D,ƨôç¼HCQ÷r¤zÿŠÑ,,'yÆQùVv½Vf¾ˆã$h!ç' <%¬`ƒ/uµÙÉ[¹•ZªR¾—Ý„SEL(åƒJ·¾¾ÊÒp=B‰“ÞÈ?Þ›Q©¶ïp³k¼Sð#y ­O8¼uèœZÊ”ˆçùוڠ¹+-”‹—ªÜ7Ú<@x OÄIãA¬¬…’"K9FŠ$Á½ÕÞ9‡­Ðâ ;© Î{x2ðŽ…Î/ í%M×ht6'ñÙíåê,£„%üi°G¤È*Â[sg©'ëÚyýz5ûwƆìH×ø³8(³Ÿi°Í7q\äÁ=ϸ…¥ÞÏþxD2zšcG%)gAJ¡Q~šËH“‘žõæÈ»ëy–…½*»ª±¸%¹e†{¶zžÚ­ý8¶Y¸@‘m£qð¶RÒ˹ùUeJ]*%T‡+Ëy”†JÔ_MeÈ·!KòœOB ‘¡Õ"IrB!ÎÏ+i-j›ÏÈæÕ¾²açY¸½‹§a ,ЀÄÁ ôÊôÃò— s–o^-QU!KEi´ÇÙ¡úÏ”Âë¡`Y ãßi¤Í…NÖ_q.ÔÆŸ¯!ZIþ-ËÎå83J¦“Slžôk—C-¬bʵ³]ù]ºËÊ×,O‚¦î¾¤ÝU`n·÷Ž ½“Ý=Ø8§c…®Ÿ‡câŸmü;hÆüUZ •GØ]%Ç¢4—…ϰЛó­ë–$=6´õd0D&äž ¹gˆ[O'ÃPôÎ6ÙRÔ>iqjvšZK÷Zè3âÐ O×ÖÛ¶°Y¡ú[èš\Ë-º4>ÊI껲kïö–»¥Í«=®À‰Ö»» ˜¦ ; XVä‹kW5ÜÇ~Wøcj)ŒþµØºëÀŽ7Õ'ÇØOÝ!ö*_еÔÒÝ Îâ 6©ì©Ø$CÈݦëÜÀ™iÿ\Øé¦o Ž-…ìÓ5 d¾Hs(r+úºÃÊ ÂUç$^ä7UjpÅ"vΕçê­ï·äføÂhï¿=‡nï¢÷Ìñ_\1ômÆ3]ÿÌO²ÁT;¨tf²U*8FÿäÞüYœP`Ѧº2.Àc Ñåw94¸xóÊëousÀ-Jq$™KÛr&îrdȤ­ÐÜÿ’‹éŒ endstream endobj 3125 0 obj << /Length 1963 /Filter /FlateDecode >> stream xÚÍX[Û¶~ß_!ìKe f©%µ Š^’¢ älœ¾4E¡•¸^µº¸¢äMúëÏ ‡”%Yë:}*XR¼ ?¿¹™;{‡;?Ü|»»ùüu;)K…/œÝƒãq΂P8±ç1¤Î®p~u½Xl~ÛýôùkáO–^Ä¢4AzÑ›NÞ~·{]6ÅÏY÷çÆO\Ù)ÜwÃÍq¯v7ÝxÐåŽ7ž$âˆùIèäõͯ¿q§€ÉŸ˜JçI/­ÀÄaýÊy{ó¿QÞ²Õ× Ãéu<ÎDè9"J˜—ˆU¤K”pÍh&Âgi⮹‰ÒØSÙ?"`@´ŤQDÈê¡êËC…p¢Ä­[”YÈçVt¿uí!ó‚àS´OZæ+¤õ¼L²‚ E¼€ÈwûÇRÑ’‡¡É5z½sPÒŒ×eS’äÚy %ý£4+dQfÍÚ½ûùGxXòžG<Ϫ|¨²/„cƒ*›=vC…c]†'=Ñè¸;oT0Þ+ãÑ¢ÀEÀêòXƒ¦×ªš”9£5GÈ£1V¹8|"jzóB†›1Øw'òƤÛXëVÛ{áÔTw8 Qã©L÷ßJ}SègŠZÂ%ÿd“ yÀçÆnûÚ œ|ÜDŒ³Õ²µWØia"™è¿SWUmO3´½]J·…X"ªR¿ËG*µàWª,×Ï _ÄCÏÛþõvŠÎ͹ ³)ÇYŸ-1•jí2“CGòc¯j÷Þ”¨,pÌxÄÈÁÏÌz‹6é ðαa¯ÊörÕ˜Ï{î†Æ}îÑЃæ=ØaĹuxØ}IÍ-ì¸5³GÙÝ·È×ÉüîîÝ+m—nb|Óí‡| Z­ºx£¸ a^Ä™c‹„߆·rè²~b™ÂÕGlƒ§Ë¬{RD¸e¨šÛš³¶ž`<1Á›y5Ào”© ç7YmœÁÓ£ìL÷¡íf0gWQ4’ÙŪGø-Ü£³.¨ø’„/2pÏÆÙ˜ŸÐÏ>ù––WßóMWõéÔÛ¸F²G>t­ömkœJC‚1µ_6)xžjÿ&äÝÉ~è«?BrÆ—häK8áËË6âèF¡u,Ú»S;ºûéF$Ë®±§7VO¡î;ô;>%͈ÍY ·³Ü*aÝØ7±Úî®ÑÞVg°y¦Ã…oM÷¾µT뼦¡¦{§s¾)®„³Dx—a-à„ ýÈnÁØŠ :ÙñiªÏúÁ€”~†pD?.)§‡ï³|ó6ô}w·IÀ•Ó"Ùd÷:§%SŽ‚2üP?Ë,TO{a¢S—á+ ߯o¢1ü‚줢¥Màà%Zs¦{wî#Ÿ%§¢ßý÷)ÀçÔ'€Qb·iÿ0w¾úèÀc||€GÐgeâʾjïm6ô’>Ïš§²$1ÝkJð}’4ˆ˜y…çÑxh›øþ˜KBϪŸ’'îký”È SQt•¸ª}VVfKF¢ãÐqökö“B픆«D]òØ~ò~˜ì†¡ yq¦ÌáÌŠ‹2Sv²(ÅË}#û^¢¶oGÛ²é»övEÏsgðD— s‚±9뀄²*ÿÎ //¸Ž«°ˆð¥WyámèäFâ™ üµ*àj7§àF.AZ@ñSæ{É̇À™£­Cÿ0Õ¦»šQžê®,Õ…;TñCîKiî“gfÂðÙ¬’½½ ²÷j›'œBçF isѲ ëzÑ6»ßµu­AQ€1ƒ²É«¡0}Ï}nÂÑY•b#•ºÀ^±x/°KA –O<¢œͱi›­U3h¸ü[×› ­°£Ú&ÇzÇš¹ÝùºBC:>«.Ó•©—ÎñE)‹c1ÃGÞ&š† oC “xä~At€(Â4Äò ¶Ãų²X#ˆ½)^á±€Nån$ð4INêÖwQ˜Ôqÿ„©…Àbáá{¢ÏìHa(iœ*fè ê~¬O³Ti½On³5.æ,Jý¹"ìMg-ãéuÈáùi”C×Ç3ôI'j}MFüÅÿDq²8Š'ÂÝ~`b›Ð 4äý±×?¶];ìuÍ»&;íÌïÃ?8†ÿ`ˆÞ¹³YúÈ‚¹8ÅC.ÎÒXÌuª¤¼>@.îñ`5”­·m!I?–ò銈ji³ÔúÕ‡ ¢®¯?(Â1ÓŽ!b‘(Ì)TÝ×ùïªÓ1éò´™Ââ´…ݯ¶ÔB¶Ü«îõ©xÅ©H'°â´õ ñ7 ðåìAf¨Åš0|nªž=TÙ±í^Þ½slÉ›ÿßÁ6Õ›ý¹ËsĆ­CTfÕûDϦÆÿøÌ¼ÿÉG^ú¹áü’ðÜ!µùÅxvÀBò*E_ínþîâ} endstream endobj 3148 0 obj << /Length 1429 /Filter /FlateDecode >> stream xÚÍWÝÛ6 Ï_aô)Ϊdùsغ­Wt膮—>µE¡ØºœWd¶sÅí¯)Ê>+çË®ÛË ’EŠ"ù#)Š{{{¯V?nWÏ/ãÀËX±·½öçL†±—Áb™yÛÂû°~ÛéÃÕOÛ×Í&H׃Þwj(ÛfóiûËóK™ÌvË,f)— ÛìI‚L+n{~†^ ÜqˆÜ¾Œ3–ÊØóƒ%mjwè|Øøçëh8ìêüs­»½..P ógYdõ+ Ý L8{žñggx—W,óª¾Ww.'¸á™aõÑŽÄò§Äÿ‘GbIŽÑ¿?îzmíúÞ§‘Ö`wL44£h#§1lTO|ìÔZu_t×/|Y6ůDG™fûÜ ì<$òÿ€Å"o§ó¶ƒ¿áó±.=—/Þ\½|ˆ_æâ·z¹]ý¹ –{bJ‰ˆG,—׫Ÿ¸WNf2K½¯†µöBÈš$Äø¯¼«ÕïSàŸŽ&ï fyzÄ¡ðÂ4aé˜ SÞ997K§8rD,KŘ|o»M$Öú€ÿŠæ? ãµjpL ¸¸ŒãzUöQš¶«UUþeÈQ¿–à Qû|0âTÓ_#‘aFÔ”Eêžxü ~ŽI5´„=îè0ŽÀ‹Ñ·8šÊ Y(Cƒš9øgÝç]yxàÉ{:åL¤ wÆø¸}{SBBÂÙëëc“)ækP_°2jK,í²¢ÁúfíµwñsËnn”å¹Q(êÖÈ£`Æm¥NàôýµÜÀþ[GYÚ?–zÝÞ§ï^Æ”a: D[7âꆚãÜæÀZëá¦5Ê‚jRJˆ;9 Êíi µ„I‘SU`A» °¥Ù¹ô¡ÿîôöN¸ÃÉÀ`R›ÀàçôÆÙ” ¯ sÐ2Goß´»Öj8vˆ#бvªh0àÊt™ÓÂípTÕQ_àw¼ÎUUõO÷¾HSÆÓé¾¼Ò„Ä,Ý/G}ÎØ$‚” 2†–4+ô »ºl4U;)b&²ÌY^Â@®gv"F¬{KÆ€ža&סÕôC§U=19ÝßQ@äºùìž>モ±”ÿÏ—MO6YdŠf'¡©[SÍB 0—ÅQUv‹)aÈhwD3·àWQœ¬u^~ä2Äô3â[£¥©N/ÕÀ0hr¤-Þ÷è²,[kE‚huV*ˆlŠ  XÀòÂ6~†XŸ(d<;6:×pwvwÄn«I® ºŽ¤B_«ceÕÙ‘±XŽ’õm‰¾A(aOŽnîFÛkK”B>#¨h…Œ$Å$ŒmSÝѬÚN[âÌÅOƒ¨Ã0 tøšr¤p±>¢Hq@·+Õ®¢ö|«¢cÝ»ÙÑ¡0¨› ö"õá8˜3à›t‚I]ö=•;\½×+ ñ&ic®•QÛ*«+ú>¨NÕh‹=ü¶TNÈÍÒýé¥)a" G^éa4ð°bÚ4^’çÓ>…®*ÈþCÞ_™fÔê`´ñĘH²$›ÊlUZ³B já ¬á½ }ÕbÞÅÂÖÕ` @XÉ[J_e2מm(ó0„u‚<Ý43 ¥%¦ž :Ó„> stream xÚµXmoÛ6þž_a¤_l ’%ê=Ø>tm3t(ºbs‡m?Ðm«•%M”’f¿~wXFp,D¹mw$·èò’TÑ¡ o•ïj†ŠÂ™E—™^á_I*FNμS<ðFÒ{i¸5µÀDžu¼  ¡ê:J-Œ];¦S X¸¨G@¼ͺ’ßÞË\ÖÅ¡—B1tmÝ!Óír¤“|K öƒDŸì3$SGúÇ“:ól4KK8¶½85ªd^€Ù/?œT›ËÛÛ šõÐ}:è:O!á1;:”Ôá¶À7$ó9fJT 1¤E i^79Üùó5Øq4´@ TØo9í5¯Ohcñà¯,ªÞ*zPÑå×?›ÐrUgñW—70ÇžXÌOì ðÌTlV8æ¥lÕ“Y-"B(P¼DÔ¼æéÈhšH¡…]ÛÖòv¹ÜßÝÚN«ýR•õ™|½”J…Õ³8u£È× oñAs0†ošS›3úæ\×ÀD|=ÞÆ€&72BS›tt’Fô¼-ö‰Cˆ$Wkzî  Oï!p÷A×_¬àZ;º'E+Ÿ€úEÞN@[]?ª´×¥öµå_Ääð&o¤ÞƦŒêÇõ)wzÇí"ïÿ`i@ÐÅ_•OˆµBñfä½Ýûø# ×­HwŠ‹î-ûd›„ˆF=ŠÉÌ蕬úGøð‡ówø\@_)TýiøfÑAܽkì9r”P¦ÿúe ‹¾ëÁ ¬nD­O· Ë<8°pîù×s2„uT,ñ7áþY1hG­J v–è ÜoN…0í‹cxÇÍrfPÿ гêZØßŸq•罚àz——Ù(îç´ç¿…od®½í®Ḛ̂¯ÿ_äN2?´€Ì¡@èfëh¨nNTâÙxÎò¦‰{Uf¨z|õGŽ.µW««$Aø endstream endobj 3164 0 obj << /Length 1271 /Filter /FlateDecode >> stream xÚWKs›H¾ëWP¾ªÂ„áÍaÚÄÞª”£rl¹rHR #Á„–õzývÏ d‹½h^ÝMý–¥m5KûcñûzñþÚ·µˆD¾íkëF-‹8®¯”߉´uª}ÓoëÊ0=_ÿ“%ÍǸ‰ëOï¯`ÀçD> -¤ DH´°Ô‡®Ö‹¿¶–FûoøO\/Ô’rñ퇥¥ðøIƒ§(Ôži©¹ Fà¢ØB»_|é寈ëP‹ø.Õ|/"®ãõ@†zv0‚7âµIÒÌmmxTN\’Æ0/Ð7­aR½»ˆ_¼JQ,ìB½©Ôš1ùÄŸX“dò2æ<~ŸŸ¶ŠÇñçXE¢·&ÜèÓˆxTÂøÈxRçû&¯v#ð#Œð|·-˜™°B\XúZxÔKIÀþÙ׌ó^¢²7jTW¥Ò¡LyÊí›VˆtÁÂY# ”¾‚“ôl ÀêÏøÆjT4hê¸:+‘âÑ0á—ÁkŠŠ¦ˆk·•ìP(ò€¤AâdJcZ¥$‘i6ò«‰^±=âw^yàñ–Mºóµ{ÇùqäÞAj|·7Õv¥(è*U¿ÿ°¾€W:)¸f±Y«‡››Iâ'òÌòmÖŒ¨=k’¶-ã=)«”oÈö;E’ªÜ· #;üÆcUóãõòæþꄎSjw.ß߬~¬8Q¯ï®­9fhÄsÂYo[(#†cë Ì¯Òàð—q}ÔFõšUÚ]OXÊT½gmwåä±o’äHÐèÓ¦’dR¸¾;Lžó?äXB^d¹ÙÅ¢HÉæª ʸþÃt]ÚÁ&n ¥»(í°^BÆ^ÎÐ~:φqÿ„ €W”C–JñœƒàYªÝQ—rÍ=MÕ`õµsaÂ(…§ªÏP…„¾š(u¤ŽôæÃÆàŽ›È›æúµ‘BÙ*—ùn—ÕóÝüꃇUì0atˆ_õóùù†åÿàCChí’¢MYw8¥:Z[¿€> stream xÚ½WKoã6¾ûW{’€•"J”,è!m’El§=ìî‘h[[YrEjÝüû9¤,9ÚÆi=ñ5Îã›Cgã„Î/‹ŸV‹‹›xéäAžF©³Z;$ ƒ˜¦Î’ sgU:]’…ÞçÕ¯7i4"S„FšèC×z~’º_x!¯*¸;ugš§ìxqC鈉ÓXsñ#$Iм:^´»}/ypàÕf+ńՉÈË4ȳÈñIä Al¹ÜòÎóã8ve‹#,‰ËA2Ã\íRèðøàE™«žS#<©O×­aR³'ÏWp¿67;Öˆ5ïϧ”ºW|ÍúZ"y%p¼ñ!îåíÃup¢ÃÔ ƒI@è•øÊ»§Vð3t\P5Zx|{¯ôíÚ H<¨.ÔÄÈÆš'eÅ6M+dUàzÇ…`.ô: Ç’æ%ð—1÷ï^žº¬îù7\>…XjfAœexùì'îï;&qÞ‚­“DC 7•ÜâL»KMÖ}]«uK&îíGä¥á…&iO®‹?µ»e¡†­%.«oDÕ6¬ÆŽ—}v“Ên ÕÀÎp6š´ô!^ò$AVR§òhckiµý;C&4÷vì§!þD[Žb(,ªOaL-O´…Ƹ’W‚·ëÕâ¯ùB‡ ±,³ Êœb·øø9tJ8 ‚8Ïœƒ¦Ü9´YÒæµó°øí…GÃqþ˜™0H)qH‘ gH ˜v'XN“ÉUàŒÁì%`”/\ q²t!±ø*³€‘ eã*u¦é5µ1ÚÎÀa:þaVo`øÂR9Bpù/v¢y@’7 Î$Ô$ŠƨÛEWíµÿ!bV^èA •|–.SC €ã¾Én%L­H„àù§0 ¥âô¼¯ V×ϸ Ó¢¯™a“º–œá ú'e:=o×H²á ÀŽÌ…„Î5QN'!!pKn+3Åjnc¶9nWY[Ïé…R€éT‹A•“ãȽk%·0igf«àöZݲ²j6FŠCe÷;¾cU3§Oß`â`͆—ï1öžz‰QÛ´êì0„®sð(¦)+ÃË:Žmµa6žµB³yXbœƒUÊžEÓ+%ø]ÇhU¦ÕÊ+âxj€öI½Ÿ³ÍaIº?âðn_°w³ô ªÍó„öîñövJj2  Y{(srBO~Hf97kÎd©zæNÎ^i¡êºJÁfD|£*ø,}Ùo¤ê5΢·E}L½º¼Ö´þØÐFeQ¯ùÿ²Ûôê þ¤_:×ÿ˱gÏï:láVpÕ…ƒûüv';…ÍÙOß‘6nôúMÓëÍ‚ðì—/\gMÓ þ—G˜>ûù»~§^7-©I*c;·S±öÓÆÐFűÅ=Kf(ϬsÛóè[â“Ňq$´ÎÕt©æO-¶Ðs!/j“`u”xm”Ia¥5‡cÍïÖ<Ææo¤‹é–Ÿ‹Xñ’¯;õ˜FÞæ}Í ~Òðñ¿+hÌ›q­êy˜íGMi›Dc¸`°Ä›‘8ä²³…þÙÔæá¯µ5%n¨ÑíÉglÜ ¬ ŽØ¶}múZûåÂÖ—Ë)ªW÷êéÇk›!¿ëçjhÙ÷Ç’nÿUB´Zð¢bCÛ?˜‰kg¶]ßåïuÏ1‘û˜Èéô6–ŸžÊŸŒä§îW/AiæKôÙÿÃL$h endstream endobj 3081 0 obj << /Type /ObjStm /N 100 /First 971 /Length 2065 /Filter /FlateDecode >> stream xÚÍYÛr7 }×Wð1y— ^2îÅIê63íLÇvgÚÚyPì­FÕzVR’þ}(Ë‘#)Y]œö!1´{H‚Àp‰AåLŒÊù›T&Å.*ë’üÎÊ&!E® IQhrÊᕵÑ+ŸHž°bŠ=Aqtò$ª`³boU,’ŠÖŠUä(©d›-–.󱲆dÂì Aeya] Ô³–eNÀÈȤY$–Ys€”˃xÌk $?{‹]q4ò “DK"a‰™"Y¶j\Ï0K¶²ÙœÊ¢TPT,a žžAÊ -{ް„µb&ÑÚ*òVÀ:äYà'±aY‚!‰R[¦0{‹gÉ—Yľ³±2U•-Üá]y p Q…ð"bÏð"¥`8'õ04)ObuKAa¨QÌ—p¸7bÌû$R†”eYxÚ³“é°¢ç$“8Lг„G[‚IFxÌ—Ê6À6VÔÃlYÆz¬íŒ¬‹ý±÷²+ž1øE‹eC^¤€ÿàNV,Åš‚, sq62”14³(Òr΢< ÕÄ4^Ët^oä-ȸÐñ,GB³\–5² 9òÌÔшY-–Œ&ˆÊ°W´…,Á©HVè€pˆn憠 ˜-†Qѳ,&D6KŸ%Ä,°‘³L*Æ(ô´ ccÙÂ+&QÔÀz1!LXVÈN´CL%¶Àö’!Yj']ïà W½PgP‡ˆ>VÕïü‰è1Ú‰"k±ÿh:¾ê}ûíçÑÞ-ìé†vÑkFð>šœ&X£šé?A5£‰:8PÕ ŸÁ’2ì.åÛ9Ž@ÏÜþ€i‘Qf?`{„À ‡ «_Ûæâ¤ž¨3UýúâHU§õ‡‰º[ëôŸ›/úWu¯zŽuëÑd,)ÎËø^u\›i{Qgi¯<û¥¾ôŸ5Ô™ÁƒšÅL¯°P¿ÅhA+.î=-ì=ç²u„ÌêW*­0TȬ%”»¡‘´e7´ËAsHƒf§%€»¡)±öi-î1à7ÖÓTLÙï“™–¹‘ÍöÜÈvn,‚¿ÌUhŸ½6uE» åä´‹QûØu—_àÆ•*¬±+è7£Cu85˜ílVòˆ>Ÿ,[½êdúzR~ÿ<½íUÏšö²nËäæUõSõ²z~fËÑç;‘øËØ´IÛ€¿–µ”QlH»œ€;,ö;QÕÍi£`ÿGÇoFúEý¦?NÇãþ?Å8 î‘ú¬3cïïëŒNÉnç÷Bûžc?Æùö®ŒK®”²¯“+­õË®L{uerUj!«“T\ÆDi"ÎPÎk]y4]>k—WõiÛßÔíáèâºiÇË~ ›ø5l‰V£mÒ C>šCÖ9wF[˜4¹ŽhLj%×unTZúÿ[Þ"^&;¹­É.½èSZ¡[!Î…4ò­@f.ع@Ÿ‰•UÁ"\Ù»à°9i’6å'Z;ot–Èᬓȸ ¶kÕáÁA™¾:¼˜ šQuRývüRþ=ºžLnÆO«ê¢Û'7móf×M{UÝô/Þ„ßàÙU[ÇíãÁ³[\S4¨˜K;YRµÃ!Z$"¯ë÷ƒÉµ>žõ\¥ÅxÞ1Õ zBi:g*ùD:I“þ•®û£ËaÝŽÏ] ›×ýáùùttýºùpn¼9?× ._ûc:¿Ü¹ü\lf®Çò䛯žÿöÃùãµæø2›ÐŽëÌI²`–†Î{íK+htL›óéŽ4úÍt2mëw°Q]hÕo'ƒ‹a=þy2MÚF_Oþ>Þz6G„C ô…Q¡?´åÞ²{ˆÙ–öH­3zHMÈÖeMh7ˆ½6–ÖRïfØí/duFBÇ ¤9kq° $¸µZ|73ÆÓ§ŸU§ƒÿœÓžIˆÈŒ„ADãäB 6oî¿™^ëé7{ñÄ>iðòÝ ~ÿ)ËùF~ƒa|wˆÇEü¾ÐVÓ®h–ƒ¢+ØÃürœuD£¶–ÛºnhÇà»íj@JiõeÌJ´E=&ÕÅnuöb¹ñIY°† óWöÉìV—ø´\—ø°}]âæÅ‡›~^|øyñáiŸ…ºç  ¸·„ÔQ]: ZåA9Ãqmò8y>+Лöï=å$éÔÊ­³\ë$_RF'a×+R1ö%\rÕö%¡Õ}I{¬0æiÝá`b´Ð6ØF*6\™¾®,æËç óà ÁadÊ͸vi½2?Ö°tp9í÷xô õ'ù*b’ŽžË‘á4Ïš]øŒÓ¦pÖROçã){|—( ’ðÊngwt¹¶N±#šÐøÚÐŒ˜Ö!„-Ú®Ž©o¼"×ñ¹Î»yBósaÞ•ñü ó>sò›–ïh!¡2Æò”=Ê6²YýZ².Ý+íšäl‰ô,:9§œOŃ Ð.ÐWSÃK»DY´ I¾å„°µ\L_9ñÄÒÕBi/}„R®16Šÿiò‡=X¾_Ǥ3ˆ€jö’sÉЦ)Ž7Iq¼*iá ¶)uD—ãò®——‹ß%ËÖ¹$,²’—å’Å­‡ >Yݬރí¬ö;¢å[ªw]õF=‹ùÁNŽ­í çí7¹Å«nñ=£<ÊÑŒ`Gõ0hçQ=¦ŽhB)ﺡq†â,Y°É¿6‰€m endstream endobj 3180 0 obj << /Length 973 /Filter /FlateDecode >> stream xÚ­V[s«6~÷¯Ð¤/x&( ö!m’s™L&'qúr’éÈ '´\°Û¦¿¾« 6øJzÎ ’Ð.ûíêÛOôŒú0úe2:»âŠqÌ=Ž&3D Á~ÀQH)æ~Œ&)úêÜÖÕØeÜùC&‹‹¬SçnìRGÂ$]&ã§Éç³+?ì|Å9Žˆ1´?¨2öì* k·5w½^úÆéòQÌsÙô<÷ðÅEàÌE„\â@­Ô·R±„‘“ù´H~o ‘ç'°Ö¨ÀߥÇÌ&»69²ë2BœŸ\3B‰luTœjªfçg3¬OÍ‹ZBíYUöÌNæ‰Ø†™à?›ß²f)òì_i–‹jnC 25ËgYBõô4³A^¤Xb¾+1@þÑì~‡¬EšMo“Ú©ÈE™´@íæäîá²Í|t9½Ž(€$ˆ®HÉ"‚yˆ’bôõ‰ ö ìÇú[[(Ú†"^ŽîG_öòE(Ó!>ƒ1îcNÂñí©ÞIËôå8ëù{8ŽhKùÛz̨ÞjP•ôYè¼.eý¦¦‘f¤™-*³©äLš±Lô`³B– TZäæ…±Qöö׌QÌHüž¢™âªÀ<{mÐ Ù$u6_…ßîÉž&螌 '·5’òýUu`j«3]?²Ae *Òô*/ÖdÔjÔ×Úã˜Ä–ëx–ÃuåP]z¨ÆÑ­ks¡¬1cÆT'wºj¼ÎÎ*³þ® QT©ìuIbt,¶ÛÛ^;É›¬}¥ºèp,¼ª×N»¤*¦YÙ|u~}¹ÓZç†EÓˆ·žÇÍÃõõCœl%f NËZ6ÃB¤n‘Ë-…ÙÈV—¢C“h}þ”óþKÖÓªÙÆ¤mݬiåð¡Ïëç%4ÄØ÷œÅá ó0¡M öU®×Ä!‘óZ‘û²îØjºî櫾ϵp) §Ñ†G¾ëËÁ·D×68pG¶àïÇÜ~JŸ xí…N*ÍÒÐHA›Uµ™Ì;‚—Uà\nBõ;Q#ÌyÔúèQr¨žµ8á—À‹­•é¨?ŽÝ œÛ_ÕÏÛy³¨BrM—úPð`2 eµÿs®ï? BÔ;ϘaN ¤0Þ¯qŽ×U×7£æ7«Ó«fGï}ÞYi¯«Ùî7‚¶b<˜£r!ëBë·ŠÍ6î×Àez¦>™Æ×v€ŒT Lúî,º—ÄàLÎÁ\…´°—L7ºêõ$H‘†ï¾‘ÞI˜ã8ò¡áWî?ñ’k3 endstream endobj 3190 0 obj << /Length 1274 /Filter /FlateDecode >> stream xÚµXKoÛ8¾ûW¹T"E"õ,°‡Ût»(Šnêì%-²DÛÚèáRt“üûΔ")ŠkèÅ|Í çùqdר®ñnñf¹¸¸¢‘‘8IHBc¹6<×u¨‘ç9!MŒenÜš^L¬¯Ë¿/®B2 ¥Ôs‚ÄA’èo,;ÍÿYfy¦°lÏ|“Ú"‘)؆§¢hj³põíÝxqåû¹6õ¨l“6©¿f©ØsÖŽ$L”B'‰I§Ð•S³ã²)¥æ¾e¹š­ŽßÜI­Ôú™~S½´xÛ œ$ Õ%yã´YZ²ãÕú“ Æ«¢fJ“b­F%ENÙÃTnQ©c• ^ï<“7ï"%C¦ã—ÖºÔ*HåtÀøîP¯ÄWz‘Ðq}¢®ù×JB3-÷쨣U FÅX+y¯{Ý) ÒæÛžñG»©K:ªð©Þï#¡6³¦B¯°:ûÄkÙÀKs¯F‡*¾].¾-]Ãëá3 Ä ãØÈªÅíW×ÈáâæÐ$6î%ieøÃȧ0/Ï‹ž™ê1zOÏsÐ÷ŒâÒ°‡_,ý÷õ<Öv#\ßc7rYgn8þ¦ÝD&«V¸–Gy^Ôtm›kI¾’T*×a»x&%PN¢öމl«vœ2âñ€ó\Àz’ó”“Ü™‡Ì|‡ô¶/v¢CÙµD;Iâc!ã¬lתi³V£ØzG"2b3Ô8׬i7iö¢„,ËÕj% YÙ`Ý;€!ÔU嶺dÔW7€œ‰´(;ùÀ²‰:l3*&¶úyhÊfÐå›çúE,1÷S ¿êmbzòWÚhüfº :¤S4ü¡ø®D—×ÊÃN$#ÆÁÁzzýnaÜÚ¾ïÃÕÅkHeHgïYàZÇ%ñ?öÂØŸbÚ;08Cܸé@æÅBz'Q~^G_ÜÀ•>Ld72òc³Bâó9ëŒï²Ý\×üC gêìl–o†üúãå„vúžé ­<ËÿËùü-};5düxóáÃ,u™>2>¦=ËS‘ÎËž´GÝ0~™b‘9œh3ŒÕ“wŠÂ7ïBŒñHˆëć:ã•„Ò«è:KؽÇCÚåõÍ[IkϤZ4÷¨N ã’oöоX”˜¢=X ‡ C¥úñýÂ¥†Ï³¯§Þ¸/ĶÑRaG†èS–­Z­»çºéúeŒfËNïw&åx¼@Þwž>¶°–ÆÅv­jóD†\bg¬,GÍ<¢iœ]O‰Úu±£¾÷Õ@Vdn_ua>©Ïý66¼Ø}g?þF¡S{ü'{¼N4búr·հQ'„ — p&ÍÂÉ*ÕQÃÙ`wÖp *_VBe_«šBXCKÔõAxVh±²ÂÉ4æ ½/¼Kü,tÏýç¿–¿åëªV~æ7è¢"ÓÝòÈýG«üÀÂÞPñèZ˜ƒ#è ìà/´ endstream endobj 3198 0 obj << /Length 1788 /Filter /FlateDecode >> stream xÚµXKsÛ6¾ëWp¦‡P3BðÍdzH›º3m’qc»ÇX„$&©€T<þ÷ÝH‘2­±3ÓÀ°»ØýözÎÚñœ?g¿]Í^ŸÇ¾“‰,öcçjåHÏA;‰”"2ç*wnÜ SÏQì~ÕËöúã\ºï.æ·W½>’ÁÑ ‹EêÀ˜É4ÀM3ÏÊêÆ×ça88µ’”Ž-üˆ.Õƒ6Íèü‘´$YêwÂ>©­næ‹ ÜzÅc©æ~â>ÌýÔEVD[Õ†'ËÚ¸LQWâHÈX9+e!cáYÕŒÎ÷|²¡/S„{Òmk…Êý ™Ré{žôBøS5oa"}7×+µ/Û¦gDné,ÓTd^ډݩ¦ÕÞ/òzžg|*Χàçõº¾šà/#jS¬'Øø°Ë‹ŸÍÔ’# @“$îL.mþM?<ßäÃæ…ïûìwœ}?pób 8ÖULUÉ4£”ïç é.a†òÀì~ì ÌŽLÐ8.VmQ­ù«®´fêíÄÅý$~ÜëvF`„(>œân«ÛM?ÿòq?h”º9èÆ éÆ1€¿jZÒ™Ü|Ã@Ñí¸Y,uYò>£wF7ºÂåV1‘NÖÄ“Šw&.ž±BiÖ\L(À”ɠزJE(8í¿B08Fîïªâ8½£ hÙU7Y½9ŽÚ`ˆeÇé@_|é2ͨô½IäʨÛÒ|µ7IÐÏDš¦Nò ^)t¯«¼QUŽ«Á.[$…îØ:ç¹j•]/ëöÔ…•@dYðÿ\—Ty|Y S?:uYº©Â`â §®3ʺÇi2N»Àç£ÿrdRÐ*K- ˜&T$Ä6F )E³û @~"¯†¡¢>·åE¯2â™G*¥p ØEc%é–…·V™§‹$ ~qo)Ú ^x"NÂqÐ x‚*ŒžHŸW¡)ð“¡B:Ï®Õ éƒ"þ“{œˆº0(©J>Ð K¹tÏ,¼&oCié© ö„Ñ}®Ø»¬¾Ã–çæF5z¸½°~ŠdIò¤ƒ$A2î'­_Õßöqèî(/ÖMÑ}ÿä‚sµ^k™4 ÷jc—H Ì"Û©íÖ0%Õ[ž‡ý™Úäkw¯u¥!‚jƒ¶O­ÈDjïãëÃrgIÛÎP{AË”î`ÃŽžï=0a©hyű¶Ü)Æ€Œ¯~:Ôæ`xX Ãw’SbŒ/Ø"çv\ :b›Aòn¸‚?íu1*ìiÙ¾6 ¬áÒ}àh°}ã½Q»Ý¡&aX™zß%õÞ£>¶øÀ»wל|(®Ðfúž^üüÖ¹GöyQåŸt±ÞR\M†LÝ ma›HTMe¨CI~Iu»ˆoB|“_5à‡o+Ã_yÑ´ ØØ]\äå »Nø§CþÑX(N½1øâÃÎåE¦ú¼¯8ºýÌGÛàpÁÙª+ƒ'[^ÛoÕŽgCøRL ñŽ;»~Ãã@"[ã¤:ö“)Hü, ¨«r¹/9ãš²[íÏ™„sÉqYì› v+ 4f;þØÖäµ\Û„eóGQ³w½ÝíÛ®Ç-ª#^ˆŠÎ 8ÇNÖ·æ}³iäºëmžÌöOtcÇÍË Û㫞Ðå>òÆìÙ“hPM–õ+Ÿ®?|8›4T‡ÿ Bá endstream endobj 3208 0 obj << /Length 470 /Filter /FlateDecode >> stream xÚíV]OÛ0}ﯰÊ­´ÜÚñGã˜F‘¦!š>mÊ—fklæ¦Òø÷¸I©âÎ0xAcÚ“#ûœs?|bŒnFç½÷io4¡c$AŠX tÆ@™@cB@P‰Ò}„ ¿¦Gw ”% qB èÒšaÄÅà»Ê‡dPÏ?^nI=¼‹5š0ÖaG4Æ Y‚¢xì6i+bÕBY¥sõnËu¼Èå!9?8…¢¬Ö.ƃ“v¹˜O§AθÍlVy`ŠƒP­¡RõÒ¸ŸimîúaÔV)?~ .Zh£²Õ·eîëçf]j°ŠAëg?9Î΂è<Ë— J]¨_#½š‡ ¿Cí£VåÍò›± ³JùüÜ({wí.´î‹·ªØäui\ƒM¡VÁÐlG²ïì æäS7uíöÑQ›ÁŒ¶k÷öƶù*[¯wã+»“Nðñ~|[ˆ7£ d²|(««m)*!áO*E„K`ø ,gç–Æ*®BÜTØ­~×½¦¿Áž5'/0Ã[±—x¾½ø{ýöš©Íê€PìÌ•$O›‹9s1¿'òž·ö­}Uÿ=U¼áßàkøTüe>Ý¿}Ö³´wìc± endstream endobj 3213 0 obj << /Length 1388 /Filter /FlateDecode >> stream xÚ½XÛnã6}÷Wû$+F%Y*°)š-š4ë:}Ù]ŒDÛj$Ê«K.ýúΔlËNbmE€˜¢8äœ9s£\ke¹ÖÏ““³Ëгb‡^h-–u]ÂüКQJB[‹ÔúdßÔ¢MË»6¿¿xÚT¢®³RN¿,~=»d³Y‡$r쬤hࢉk;»ôýÕ #ù–ãÍ`Ži™J¤mÒÀö¤(S‘¿Ç @Ømâ ®‘¼S'p]ûƒþyW‰%i ¾y÷†ä½x>¼½:¿ùë¸ !DM;±RuïÝg7 Ú¾» F-$>õôºójÕBN™g7õža†¿CáF4"AhØøÚŠêy`Ù=f!‰#¯£á£Zî0Æì”7¼Í«¬a‡†„²pþiçO½ÈNÓ íÌs}ð†W@U#ªŸ}»)Í~ðG"«Âmõp~Ÿz$Ž{¯š·‰:j@´΂}õ•ÁHšõé(~Ê€+ôóZ#–ݤÌÛBÖŠp5 0œ¶zbY•…#émCƒŠJÈDœ®è¼ù6ŠƒÁÉÿ³^Bü¶­î‰òªªŠÏ.ó¥0šÞU¦µËÊ(º6 Þ;RpÈt~”"[­Ñ¯ï¦üï–ó|UVY³.F+/!Á‰f]¦§«…ëÕñ©Ñ¼S㘪3¥ę̂êÛ zšÉ™:¾ïÛ¿oš-i™Lò6?èW—ò½–‚Q‰°Ç{²$M%ÄGº*+´½ïÚZ†Ô^eSj? =ãÚk@'*=†R”dª©Åk!õ‹¶ z¸E ÖðͦRÏOYÁs`g¿#‰ÿâkHpz=:ÐP¡g$¿Ê’1aV7\yÙFÆ3ã0¹E1XÝh‡eX°e9˜-Ú$ÏRÁ‘jߥvR‚Ñ„zðì‚Ë5oœ=‹b®¼_G\ó¢@ƒ5EîYV#"xÐø=¢4qú›w;¨q¹4Åe½“ G;n“µ ™LÅÓéŠý¢M Æ ÜA¹†Hõ³Þ †> õT%š¶’Ý‚ëC'ÃéƒÐþ[@ $žÃôZÊü¹Û&Ó *PܬɖÝ[ç˜KãÉä¿þ ˜çøúö¢koFq¤ùn ËbÓ6h3->ì1û¶ËûˆØSÐ𽪮:ÆcLyz W#¾â™T)ЀO ³IƒGG+³q§ðµJãìh •‰Ê,íJ—VZ%ÕÑù ¸++ÝÞl©kÕñnk*¤¢F'Np|ÜpõÙËk&!M@ÂÓ¹RM Þˆ~…‘°kEíúž¼Õ @ÿо]˜£Ì‘ÛƒÏu8{ßOPÓÅ575.)µ¿#ÇrÙaÁ €¦`TB£žKh0À¦»Æá i¤Þ)—ØÖX}¬µ=lŠ +¾aeXí†n_àO%1¦lØúK¿#Ø ãTµc8è{Zÿ{Cßë·÷®’߆^l+ŒÇê,sêž²¬*ù˜€ýoQx^kOñ§ª¦y+Ökó:&]†õy‹É× U—8ÚBðÜ€xql%ÅäÓ×Já%¤WÂâÈzTK ˇT;óñn—[L>¾x#Vß)·B—„>E6¢×¿SìØ# †Wˈöe¨„Adã&ÓÜq»ÑQ ìêFcpj<î‘ï.Ô ‹Xwc©“*ÛDä ô?`kÄóì1à5)Û®_Àð2US.j±}Õ9(Üôã*{P¤·åuͱÖ@ÇéÛ¤¯ž;ž9W}NÝ•Pæ;Ç@IzØiçÄ–6µš›ðÐE}• °ËšA±ÓЦfìéº}X–丮>þµ¨ü*7Î/ endstream endobj 3223 0 obj << /Length 569 /Filter /FlateDecode >> stream xÚíVMÓ0½÷WD»Z‰¸vœ/8©EBÕ mÓpp7Òxe;h˯gR§()îœlyÞÏŒß$ƒ½ÂÃÞ›Áël0žÑÄcˆÅAìe`Œh{ !(¦ÌËrïý¤ñècöv<‹ƒ”’…@ÆôN‹:—«ºü2}~RBë­¬Ö·—g!îÐý#ß8¤ÖËRóBôhçVpvO=Ÿ0”&Ñùp>àËÕg±6/G~„ñ!g¤¹|úEŒXúý½E,¨]wÂ|’¹Ýo¤²›uɵn+ú±@fQBŽ•ya!½pCÄÒ€‰Ö|ïð '—Üø$„"F 6±èJî‡<Ù¡Ø=ü±&m¦ØšxZßÒ’Ö܈Bª=Úq£¶ÏNÌFpSC¶\¯ìò°œÏè’ï…êAïrnø¬KizØ\@ªMPy“jó¬NÞW¡VR‹5{\NÙƒ>Ǿ£hƒp&?§ ½‘ËÚ‰ 1ý¯S;¢Vܸ¾: œ4½òÕå„¿)œø¼p¢Žpn|ø_“‰®¶¹w)³É|1ur %ë'´Ú÷ÕµÍEeÜòâyŽæ+1ÅPº])oá gøÛº/ª¤ÚñrûxGä¢ÏeñÐ‚ÎøÐk^ ´ák#û ”±;N®ŠmÕ;«v[/F·÷âéxÒ #BÛæœ¨¢Þ‰jDƒ¡Ñ'”+“‰þÉhÔÂ’58iTŸR \È4þäà¸N³Áw®%w0 endstream endobj 3233 0 obj << /Length 1593 /Filter /FlateDecode >> stream xÚÅXKÛ6¾ï¯œÃÊÀš+ŠÔ«9¥ÙlÑ"éÃvÚC’mÑ^µ’åPR6›_ß’R$Û»±‚…‹¤8ÃùæMyÎÖñœŸ.~\^\߆¾“$ôCg¹q¨çÆC'¢”„,q–©ó΋4k*²È³T.äÇé‡å/×·,ꑱ$$±Ç€©& q„›.<{Nû¼¾å¼G5cQ¬Éf~‹ÌBÄGE!Ib¿=é…Ú6…ÜMýØ­«éŒ1æÖ%>¹»š[WšÉ^T•Lû˜[Èú†@šZÒªY#§;C#*+üHì(Ç çGPhN;¼TRÔ «F‰ú·Õßr]ŸÔ÷ KgFÐ7Ô «x8_Ë;é‡Ü݉ŽÊyÖí«?Ž‘=Â|ÀiàÎÌjӽ߫¬*ËÌtS*3¸G"¡vÙn{-•j— ü¶²:xhi+ñŒ2'ÔȽmKõ@ Q«ìó€gÔ'Ià[Óƒ•häZb=Nå{qÐÌ·ªlö0«ÌT#ÁÁ¾’MZ®šü3—Ÿ÷ PdåÎÌ×"ŸRwÝ䢆µê9¬úÌ•Âz BÎ D’ °Xʼ)vÆ‹”Dn}§ÛwAf=«­ ðíNËÁ,Wífë©Ý‰†o9‡¾7a=Vû\ž§úž‡mÀ=ud³'œìv£<†jFb'ò‡/’Lgœs÷FnD“×Hf·Š<7ƒÍ€Cf•¢½ÔD\ë™g²úÏŃTç£ym?©Þ{WÁA¬qáBåßs3°ÏƬH3T»^JÀÛ²OSq¨ À¨ ÖäqŒ  E¥}æèŠyÞšçZ¸¡T)ÑkÄ'<í²SRuiÔ‡òãyVJTdµ×yM¢ce25ñ¥Ž +!C‹Ùé²:0@5Ú¥ª¼¬Ï7Ê|ƒq‚I “¹ )MyAy ´¥=¶5JÂ!±°¡S|’jUVò|©~W™‰Î¶@ØÌ6ŒÊ ªl²¸W¨û½Õ#4eIVBÖ£Nþ#󯻬Ÿ$Œ#´à JÁ›u„6BAÊÇ‚ô{œÀj\Iï©táƒJ±TC‰;mÖ ŽÔ0Y07µh¶j}HŸþÕÇCíãÇ ŠuØo§”R÷ÅëÅ«ÑöÒ5†¬FÔë—¦îeÚ±hÒ–¥¸+WfCD’-ÖŸºS9 SLÚ¨3y†ñÓ­¬ež›ºbã‚‘¥Ëo9€wOÌ«.Õæ˜Ôêh¬ùEš<å?Jz`õ;²,Xãè/ÛJqÞï Í‚mxÛÁºÓ" Åp¡ßVàük[ñ{Qȼ;˾ÜüÞèyîDGÚ'Sˆ ×LN™£MرÝ*¹E‹ŸÛl1»R"Ͼ莆œ­ÓqÙ†íM_)ºœ·’ ¸_Ù4)åˆþ™qâ'Qk‡_-?yƒAþHë *ò£dèE’X×åˆv`T’!íÃã-<ÈE=„|$ÂÄõè(„~LhÌ\Z¨-T©³±½1û©Õf ³òòõ|õ‹0Ât߉8ñH@Ão#:¯ï¿~ —©$†àf÷ŸÓ$„ÕÈGn–P ¦1a±õþ¹®KÕQM°õcSËSŽÜÅ"ˆ±N~ìcÁÁG{ñ¡E¾Ïê;³º•;Ùî³OeìóýäÔe7­ñ&0¤dú† ¯–1ØüóƲT\½”YÚå¹¾}uu*§¨¾FÌí„÷;B«*ÛOj™FX2‡mÃë›í€Ÿle÷›ûÿ«åÅÇ ªO¡Ýw ?¡à‘³..Þ}ðœ^4¸BÇνÞZ8`F¯â¹³¸øãÈU¼þDZ=rê@ª&1å~ü衃=$˸ ñŸ$jzúÅ~€ùô,rç8ÑLŸ€ú$¢Á˜Žwâ[޹Õk¿®ÜÈj­²}ëÞgRÔÇ„õÙäÒNç Ã`¦qü[ê“GãkÑaL?{Î %tÁÌÓÖ4=֙ォ’©8 ¢ÎT—'.¼oËá·¯+¾<É HB8~çêG Qö?¥þBte$&„è.ÈÆ¬ÏôÕç@¼|1/Äþ`ˆXx0'ܧc¹Ç¿Ûz!( endstream endobj 3245 0 obj << /Length 1301 /Filter /FlateDecode >> stream xÚíWKoÜ6¾ï¯œCµ@D‹õJЃ‹ØE ·EíuP Í+Q»jµ’£‡ÿ¾3J‘%^÷ÐSaÀ"‡ÃáÌð›o¸®µ³\ëÇÕ›Õé…Y KB/´6¹Å]—ù"´"ÎYè'Ö&³>Ø<Ž×7?Ÿ^„ÞDÕ<æ †´Ò•’wÿ@Å•kìŸ^1ÙáøÐ[/¡O_½Z;ëÚ×>}ªÛ×óº¡AZʶ5N$S¹`A4:ñ©ÌN,‰G…÷E[ô‡÷|Á”Ÿ°8ø¦%‡ ®Î’ 0ˬèÛ?ÝÀ­·©´{M·©, ¿§ÏIYß7ª=1 Œ1ؤ=CÏg ÿ?#&#pŽ;;'† …ÌMB:â¬ÙõU­}ÏîÚæž~ŸxŒ†xÌ„±C>í¬"¢²å I8«ÖŽïûvq;EÃz Þ‡ö‚yªŒ!‡CÜ¿àl³cÌúì[Ä€Ãmµæv†"awµq«Û«††?köeíñ.Ft*ÝÚñN’¹L»º™z$†û×¢½4*4Þ®½È~|K“º2uþfíÚ'ûÂ`ÅLÄý( l8ïK„z¡`ÂAüëÍå%iÍb€âóPÊGÏ÷:r€^±0s˜÷•Ž(£$ß­ƒÀ–e¯Ø~A™bøZaˆ±oŸ•mý Ë­§4¼zÑתod÷›Æõ›7TŠ3ãç›Õ§×ùÈ÷É,¥‡Õ‡®•Á"°ó“غתK@ì‘À$•Öõê÷¯œn*s¹ËB }ôŸá·úEÌöyS¦º\Ü®ñŸÄœ±]`5‘ÉN’$o´Òfƒýå…ô½$d Í]è—‚û,H 0Þ©6mŠÛ®¨«Åk}ÚsͦݞWr[*SáJ¶Æj¼†ë¬vCaF{+›Öp‘IÖ¼ìš"U¦´n]-wE6Àu‹scÓ¤…;UÕ‡"mÙ1|Ó"~‹zŸ¡à!^ƒìºÚý6˜•ÆÅ²¢y=tËé"x­XZ—ý¡šuo®mÜNUY.ióEÛ}U|‚’Εìú³9Ù±¹º9_ÜÔBêoYÛçyñ0Ûqqvy}NŒ²äÖû†ÄY=žÝß#±?b7ñì´¦n$‹JÃešÚq øÀZã8ÚK4ÂT˺öŽtô¡¡ñc\ÅTèž-«ŒÖ·²q–²šÖ6Øõãìú‚J&OÀGŸÁ«€:ˆ 4úÜî*ƆlÆl“O1Lu_Œjcð‰Ò(¼‡xîñ½R—uûÙ[€l±¿O¦Õ4ޝoÉŴȰï÷EŠÉ@§ ‘KšhA¶ÃWÖ_”脂ƺ´¢ïVzÍÌ È]ô—D:wo—À‘©\öegžš&¿Þ‹S3¥º›¼±Ij`:¦™¹yº`D“2œ¼Eû¡?/«sIxC"¨ƒ-…Î ÝgQ"–yûùð|læØ/òïõg+gMXú#“Í|ß\!IÜœ¬þ²G÷´ƒ}uWê@L7úWÐÈ¢Är«°îväÛ‰ÃOL†ó±J[óÓ‚öæ†åPÔË,вÅ® þ> endstream endobj 3255 0 obj << /Length 1275 /Filter /FlateDecode >> stream xÚåWëoÛ6ÿî¿B@Ì*ZõÖY—Š5k¼`@xŒEÛ$Ñ•¨$Þ_¿£H½åÑöË€}‘NÔÝñ¿#ï\kk¹Ö»ÙËÙâ,ô¬%¡ZË…]?´"ŒQHk™ZWóŒ¦ØýcõVØŽÏE™ò‚JVÙ×Ë_g$È“$D±K@{#‰ãD1Í\³áâÌwÜNËîx,-ti'áœf5‰ö*FâØrp‚üÀÿ¼±Fn•uÉ*´®nÕJ4çEÊ×Ù ƒÜ1M¤TRͱ£æ_nãÎ$ßg˜¤ þ‰³ñDðüµæ¢ú•ñJjj- ¥JR^ðb«¦jOËÊhÏ©,ù½r\t ôIhw¸ãûD[ëûž1D-mJ‘ë5F×j—aUtg`ÃpdzLS7ý2™— BT°ÙNyó°IyÇ+#d¶iíTKÆÎfýØ5õ_Y9á»ßC&*!¤ &ñ•aÂL(Û"e›úèmk@6†Jº£Ä3=½§9¤ªšÌCù¾ÂaèwŠ@‘Öõê•í®;ÿUHM”uñ]ç• ^™M ß™(5!j¹¯ŒÎ¢Þ²,ûH‹-3\ßëAîHg¬uªÈ¬RÞò:Úù0Ø%I[`ßšð =ò‘w¸§r·b¡4/@3[KQ&ô&1üSj„(ÁÞ8 ëhÃ!øºÛÚ4Ö>˜(]ìD¥š®vâNS7´\‹ŠTV·¯õÒ–£oZ)=”Ëû©dô[µ 5lÞækMD]ˆßè×Èî õ«K*WâæoˆßHòm  »hþh~«MÖ¢.d5b|`áp/ªÇ_ƒ«ÞôÀjˆ;.w&rÝIÖºª)yØë’9ööŒB´ýǯ»@F«p„Ÿñ?BµÅ7:ªDÕƒ+4Œ¢6ðMæ3rÖáT©ÖxÚŸíÕ†òüøÅZ;Çú÷üèpùu5žñ~Ï¢ò¼’ñbBÁˆÄäÅŠ®¯'ÒqRUôðEÙÀa€âèåq;)$¿éÁìN÷ ¸z#Œ"‚¿ $ðQØ\ºÃsÊÕi‘*ÿ†÷e+9;]Î>ÍÔŽ®…»Þ’Ä1Šà&_糫k×Já'`‘$¶îÖÜò¡}ˆ|ß̺˜ýöè]Þ4°àÁ Ä„>¶8‹Éqÿ:j]AŒTx(‰»8½·<êA¡öIÏA—""U"çëJ/_òŠ×¹¦—¼ªj¦ésQq R=’ÐE8Ÿíº;Ñ»C“‰\×dé'V­K¾—¦@?·~/§¡iÓN1pú´KèßZ¿á³óÏU8ôýÑ6ÎØú{E·ìå=ÜãVO$\AT]ÍY{ÂóL²oãçZÍ“r[笰 t»O÷›ÏØØs„ÄQ6"¸êb¯;®T<©ºÕUt¥š;„¦iWʽ¬%ÛËÊ&/«}›ŽUscªÙèá ‡?q@úc€øÙ±™£­ÏOP€Õq È‹ƒÎÁ>¼/÷ò¬ƒy"ðaöÐ'`¬qwÄFjðR׳¦—ô³ ÈI¡ß¢ÈšâÅZ uÊÆšÕ‰ÜHì¨ÔÔŽª0ßÚfL üvf‚¤7¥ ìs¦æœœÃÀb²c2ÓÍ[êC¨ÑQk. ›.— Ü%~”ö¾j0>ég/´)×¾átú@™ endstream endobj 3265 0 obj << /Length 961 /Filter /FlateDecode >> stream xÚ½VKoÛ8¾ûW9I@Å’¢¨Ç¡‡l_H‘»®h‹€kÓ¶P=QB¶ÿ~‡J¶¹i‹î^,r8Î7ßSˆykÈ ÑÏ`ELt†˜ˆ&$ tï…Ò«&ß·y]M@ÀMÉMŸ¥$NãCH ÝUÝU^»-nKÙ6ù?f-ÜMS—(Eè°x®Šb)«­jPņN0ÄóC.Ül—kk^V¨ù·çÃ+ 7Vöù¶FI3:d·nwx Ws/½„»™ù¹ôàð¹o0N‚— ˜´ºƒ+œ»²2¦xw—ï.ýQÞc[)M0¥'AöM„Ø34öAŸ&ó¹ïiÎD“ï3t“ª’¥zâù‚Rb¶·Ïð“-?¼ªü®Sd£dÛ53j`“ýšËfÛ•ªòxà¶ú»¨A3øRH“\‹#¨£`¨£? a²g(€,cnëÀïQñ·&}CU[º±ûa_®%&—*ðå¦6ÎÝãÆò`òæ>üµ?Ñ€›€¨¯Ðnw}Žƒôê…U4f»ÒüÚLºÇB¿H€'Ü?Ó7-LXÎßʯÆõHx ˆt­6²+ZdKÓÎgYâ³G™v㥑+‹NýZW+ã™H]‰-Vïe£ŠÆærËH-‹åXü ^ÕEWVVZŒÌ«5ô(P÷jƒG¥Áó}¡P²UU2öûø8P=³í“¹öӌΛ„.rmCYoð;Â9êG¨k¢_WöhÞBë³I†>"ÈùqÈ bÿíhå`!Lýß®×f®Ö‡áš ÛG3öµÁ›¯, 7¹Î»×W”ñ¹Ù0i Uüž©D!I¢ä·LÝ뺇;ä·p^  Ùl›¶2Àý¿gVÿ°ÉË>ß>Ÿæ|nÈ:of+Oûqq<·.Ú\ëNÝõ=”Ô-jí«íŬ©µü6½ÿ~/Û\'ú‘ýP@IMõ{›7­U :˃)|Vûmò Rv\ô—ü™p }ôÆÿàúИ endstream endobj 3177 0 obj << /Type /ObjStm /N 100 /First 974 /Length 1590 /Filter /FlateDecode >> stream xÚÍYMo7½ëWð˜\¸œ~F'ÛMØ ÐÖðA±ÕÔm*² ´ýõ}C9±IèJ‘lÏrg†3ÃáZ('œPªNþæê(ª#*ì82F 9®Ù<©¸¨”jâT¢ ê0ÑEΨ).f±‘êRU²+$¦X\-6RÉQ`STRŽm ›¦jR2³˜!ÓU#¤X¡¾GÌ4<#5½,"µ¹¶†ˆÕpŽRÀŠKša°íx‰¡,Õ$ØÏð4¡$˜-C‚ÙÊÍ)µÙ1©:6$µ„؉ÚÇšÈÜ+ˆg-6¦Ž“ lP„„ÀD‹qsŠ $g3A0QØœ"L-™L‚±JÍ„e%Ù †Ð޲Π©MS˜` C 6ˆ{K$™óŒq>JsÓÌð±Ìg€!˜ ’-clLÀ‘}K6ƒ*H]DUÉÔI‚”Ì ¤E[Z,£™0%©)V(NÚf¤j3´±Ép¡VI2\ -Cð""÷&!pF_H`›Å!‚mµ!HÒÖ1U¢™ˆä¢†¦ÎÂ+SŸÄLàmjqub&S0ÉVa¢üªmM1LÔæñU[¤¡¤V›€YXbS" #PI]²l’­,‰åº@A’6-»¤Á–¤háI6VÍw,*Áe“°£b5?3¦b®3†§Thpt4è^¸sl¿€M}꺟ù;+x±Ü)ûŒo?|¸<}ÚÐ'“ñ̹îy*X[›vç+Ö>@> s÷ðÀŸ`ØBóIPؽžN.ÏF3wîº×/N\÷fô÷Ì}¶õæŸ#¼¾ ºç°;Ïn¬04_Ýéèfr;½ÙÊG{5ºº>›üíÎ ”°¯rå N1Û&§¼³0_{½_{­mé™Õ#AËK_ X葜žh°Âää hQO¨ýÐZ*üî«› ²K XâÆ–¸±H¼¼Ò¯ãF]ò%7ºãñxmçóCÈüùÂl ºg“éÕhÚ´…‹îûîe÷¨ÝæÀ%\ao›M5xm'fòV$#{eƒÝ¾›Ae÷ÃõøÏîøè¨èŽ/gדqwÖ½=}i?~ŸÍ>Þ<麫ɵŸLßw~Böè]­9õÅ:yE{P¬©`0wÜBvæºï&o&túÛØŸÞŽß¾:~ýØ-Ÿ&vMé]>–ÀŸ;%&ß‹k”×u½Ìи(úLñ! cñòe¶õßÿ6æ5ÄfÚ}ó6ÔaÞ¢É^‹&ûß%bs³ºz!kÂ*=ÃjÎ/ëÏëE»Žß å“PïÙoMÁ5 ã^™p1É8KÐwz ¸Vò¸~l¬)ϧ£ált6ºg?½ûºËËWúÄÅ',=5|Â\\ U#êlôéÇÉô¯á‡ëG/†³áÝÙˆL+jRµO„ݾ}QòY¾½;E}Ñ‚¨àÖо© S(•нR¹|kwÀG¯±}áów3NŒ hßGŠ/¹ntgN•3I¶),²¦TH®Þ>(öCsÅ…KòaЉ¢òКpª}ÑèRs͇:ÃöTz5®–^•ÝK¯ò>Ë*Zµè"B8· ©}8ޏéK(ÿ³)æõôÉ“ÓáÕõíÍÊQÝb‹,‚Û¶õ-Í:4JŸ§L=ÑšQ)Í(Ä}ÝhµöEsRŸCÝãä]\\Ãù¸%ç#·aRÔmº¸µh–Õæx#Z ö ÇàÅöcßU2NZܱú¢œî‰%£].{ý»ÄAû‡Z*aŸ$LkH˜¾‚„i¦u´ÊâU„æ°znDLjÞCb_t¨^¹ôD+¡û”ž`a¨N;‚ÿfHÝ` endstream endobj 3279 0 obj << /Length 1225 /Filter /FlateDecode >> stream xÚ­WÛnã6}÷Wy ¬QÔÅjчÛ¤-ÚÅ6qƒÙ…ÁÈtÌ­.^QNê¿ïC)’£ÝÚmÀ")ÎèÌápæÄ÷=ß»ž|¿˜\\Å—Ò4bo±ö˜ïSÆ^Âyê-VÞ=¹‘bÅü?–Ûºz˜Î‚9‘ËB6b%1ý¸øùâŠ'=<éÜçðkÌRf6M|÷Í‹«ÐïížµÛgA‹.ëÇ]!Ë)H£æ‡OpöñϽKiÄt¤ ñ(éJÕˆ“˜¦ó ü~ Šf3qž¦Â'¸YSÕ{œ>+Ü —®eY*Ó8{RZí [¸Ûpö­¦Doª]¾r;Ê,ß­¤ 0f@~EçƒÏÃ\j$ú V:Óv£´ÞÉe^=×R/1îmù8r@Œ…4JZ»7#ž#ø:¹\ ¼^~ÒUIÍϨ_'ÙÙ‰r5CÌÛJ«FU¥^æJ74ÓOƒÓ‚ #Ï# &¡,aý£-E!O8Ûw׆pîXÅ1qHjHs\QåaÊöC˜9ŸˆÆ«µØãAm?U­ñ *{·2%¹êÅ4HÈþx8Ž«Lþ<ëªv¬l$Òbxž2"ßàt§[tÈ'[‹»Úîr@>06LêF”™<×8ÿÓ„#÷§Ò»Vy#kZˆ¦VÖ•5›ÎÂ($ÚÁ„PšéŒ‘‹µ„¡hvµ™I³‰÷k`Â3ϪÌ÷8‚[ &ö¢\B‰B‹hp´¦ˆ<™·×N¨iöC+ Àfƒû#æB•‡;[—0†AôÜž”½E§RŠ×§ÙoOH“ŸÚB5öÛ>²—{¤–oܲKôo ô0$gwXçœÜ±3÷Ò…Òœ¹ò1hiˆ‘)e-ewÓ4&"?àà vˆKgtîÕÆ‡7¯›‹O“”µd Ô»àkô…Üðí LóŒbòIf6G‚K b6 îVË*Äx+<ûAØ£èÇ=y÷öl~©PÜnE£D>0üa1ù> stream xÚÍU]OÛ0}ﯰò”HÔø#q’‡=”AÑФ1è ä¥. ä£4é¶Jüø]ÇI›´‰‰M{‰¯íë{ï9¾>!èt<8˜ öÇÜG!h2C”Ì]|J±à!šLÑ•MCæÜLNöÇ‚µ\¹`˜{>ªœÎ”œŽعþ¬æÛR:ÛÑdð8 `D׉„Ï1Eéàꆠ)lž Ø ô£rM‘ µø.;AçƒÏëxÛc…ÆuÛh(ÁÂ¥HxŒm ¥äòö<’‰˨ÌE§NÀéu‚0´ÁùÑñ(@„œ:Cî6Ó†o«,Oã¨0Ëq/ScŸGÕDDZ㠻•¹Ÿ×ÅBð×0c =÷)€ ×ó „CUD‹x^ÆyÖ¾! ÛÒû´n‡y…œó9-äܵ/j7àaZmüÆNà¶€o;Ô™XˆE˜L_ y§zKÜ-¹{ñ[%÷Ýù5ñÈ,NT&S6}± ßÄ-î–©ÊÎì²x±°g ª{°É»ÕwÚ}mÇš¶;ÕJ–ß ¥3ÔMXÙ².¼N·Îæl¡QÏ êÛû"ϰþ˜cݛ֭NÂæÜ5án¢úxaÞϻä\8!tu²TÒT#¦]ªYÉ¿:COØ÷**Ÿ+.ŒLˆ¿«"<ÐÌoË]¾’¯Ž3-j# ™¾Èz²«,#‡ »JRMß:<º4æT–òy:¸¯…o#œ Ì}éЬÕ]›M:€š8†˜ìþ@*ç8˜ ð*ÕEk½Ð+_h} 0lµyÏ{•én–«9ÈŸGˆýÎ ‘eÅÙ,_¤ÖžY³æ‹> stream xÚÅXmoÛ6þž_aôËd`fEŠ¢¨ ûmM±ah³Öí4àH´­U–½$õ¿ßI½Öv`ÅP •)¾Ü=w÷ÜC¹³õ̽¼øqyñüJ°YHBÁÄl¹šQ×%³€R"¼p¶Lfœ7*J.?Ιt ü³Ÿ³À‰æ-}~åƒÅ^(ˆt=ØZ/£¡‡“.\{Úó+îf/Úé À g]–ëf«ò¹Çœº-ŸþÛñ¡å6¢Ä¥Ùh•f*¶jbÂÈà@P²ÖÞkt.ª7ó…çyN=_PðW?o£ºL?™çµÊUÕ*1?o "ðÌfWեжæÍ®„Õð2VU•æk2ÅbhüÂZ² ’Â7öÔûÝ#¬»Ó§©8]í›4Fë:‡ l{œ8Ê<ô+­Z‡ô6`qï ܧ‰J>óÁ˜#‰Òz ŒM7Œº§<ÐO­7.sMR á„úí°Ñ,ÊÉÇ9‘Þp3úÝ|ÁùÐIî¬çÔÆâç9?½þùÅŸføZ/pú㎹½ð% Áâõ‰'è×q<ÍWE¹=à5 ‰”òK^+pû¨×i~5—žc÷?êfçâ×ñð®Ùaé}o® eQSÕ›“¥HáD(ÁQ"™Ôª<¿/míD5,Ë?'”×ãzGýk¥¢º)U5fê|ßîRUУ>ЦßùêòxÔ#Lv„\ÛÓ«éΠdO…¥ Æ%a@³#„L†’»&ÊëóqúcTÿ¹k·ËŒ–§y®A£j ¤j}8˜iRM<¥š¾µ±ÛXŒî0.à#ƨN±8ªÓ†8S÷øBev•Åz‚ÍÊ4?zG<ŽÛÀª¸?ÐWØñF‡WuQZº¿Bã^ãŸ÷æ]Tß”lœ!£ýdú´+±9¶ð ÛÑL#„œoØ/ëìHl®ŒtIÈÍÞCZ5ñ~ 'ÊuP’“"b¨ŸŠ}ôŶe©íÒà“a¥Um~<¤­2©ŠÓ¸Øb4oÓ|„ÅÊ,èrvUd™îá]S¿Ÿû¾v§:Éù#2*d>ñƒà|â§ ~ô3‰_pj¤'ÿˆœ•h…y|óòböaÁA:V»¨¬À}|îèL¶³ ¤Ü£m&bq§:B‰’¨Ž€„¹¤ ²¬2£QiwŽqjÖlóöEž˜‡žÐÛùp:Àɉë¡D¢@ܶººz8ƒé£¥Õc«¼.‹4©Î•V~E ÙJ “yZ•¦ÞàÍ×Pjèì“–_Ø‹õYfbldrQ&˜Æº ÂÔ47oëM©”]m°¶g£OŸ,EsÊõï½ù­Á†&eb¶PÛ&Ð,œÿ#¿Uu¤k÷½x¿ÍjŒQeÙB·%ýð˼Á3û-PgÇY“èÀ”H fÄmŠãô`»– D‚Nf o^‡|GÀÇa©7QmY¿Tù7–ð°sóxE!Fï D‚€£NyòÐ’ѧ•ˆÉB*”Y §UÔlûEÙãŠp${¨8*{<†OT=4t¢$I±¯D˜ Ô×,‰‰‰¤¹²jÉmÐøÇÊZ¤I• ¨0ײ‡uÂ0&ˆk*Ó—`zVZäB°ŸÔo¥Öømµ—mxÌöúk†n\ßUpå^Ü€£5q¦šªå ?Ôo¶ÊôÐ2ʾ‚¥Ô.\nºí˜ûÂðVjÈ.‹-},|È¥Ö²@[Öµ>½uãPªð7‚'})›4ñ#FÁåôÔÐ×&ÃÇû¡zè/ˆ´v}àüuA‡‹‰û­x´à9ÞÒ§9 \#;ߪ.}§èTs;׋[ˆ—pþQñ¼wh¤þ(Ü\ÆÇòïº,ÖF xÀ¾ïðö¤©SÙ͹z3€``+€âáàó…Þ¥<""ÇT©?ÅÁâÑW­åKž ßY5ylj€ ¬¡VÊ‘@ƒ‡ÚGáÈ. Ðö·óÃfMÃæÎøð&‰F]'x‹E*ÈüÆטj´áˆ.|œ¶ë Äá[ÐiPmœ1g9—Ü)Ì$è·™2Sº†P‡+­×Îð8ä.ŠªŒv¦­™Lt€þŠMƒ¬¿”“}>HâžS1î <Ÿ€Dðû,, e󈣡sö—â à™©²B¢[gÅmd¯œ?˜¢]¾y÷‰ì”I˜è’w6Ùï~«¢S«"€öêOXªÉsÍÖŒ!²:á©…CéJ¸hb(1/h }ßÃY ¨Ž4³K"s 6áfÀ.ãú&ÀB~0Q§ù ÙÞßî ÐÊ.SQe×—ðS2ÛçÄïYê>]窮¢ý¬³b‘¢xvçÉwnW4b”WE­Î¡é]Ò€¾Öõé /Õ]“vß0çÏfJñzMŠÔºþNñ é’gé/Íõµr=¹ñß¶Ù46à‰,SÉAç_,/þ~+ | endstream endobj 3319 0 obj << /Length 1114 /Filter /FlateDecode >> stream xÚ½WKoã6¾ûW9I@¥ˆ%Y(zHѤÀ"[ ŽÓËfŠL9ÂêáÕ£›ý÷;á$Ó‘S;Áö"ñ1ä|üøq8t­á.~_/.oüȈ8ôBcÌuŸ‡FĘú±±ÞŸLsëóúÃåMèí™ús<óH›•H6»g´[¸júëõâë-\ƒ3‡Qàð€i¹øôÙ56ÐùÁ€®xi|“¦¥ÁÁyÄ}(ÆÝâïq¾Ã¿„Ïù>|æ:!gF,îÆÇ¡ÁZmœçÄËq1·VÀÌ?ÉÆ²ý`iæþ#s“t µd4*©&+¢¬;AvuCí…œ%•SÔUÙ÷àú¼­Ä5OŸEQâÎìhÈ"‡Å>-ðѦM¾ëòºÒh™èÑU±4lŒzjøu•<"rÛ÷}S$íw,q³°€d“W[ª×Y´»¤i•P*“®ÉSZÿfznj޷ÉVÌ"}‰\Ä€ÜÓ´ðà.N'-}0aNdûó‹ìsõöTE«÷„Ô“‰¤ëÑæ¤uÑ— ¡ÀuÍßèÇf­ÕTs¼ãÓ·b§™^<0Ÿw¯z8gLû%ß9èIáÎ’!m•“×Ì'¶®IªvW·ºýÍÕíÝõ옾ʿöbpÒj£Ö«ûùA-¨mç´}–åÏ/ýÈöŒ@)ì…^5Û¾•å{f×¾ªÔc õGB"•v£•7ª¿’R+pàß AÊ÷«[ý vOª§´¼¥)ãôR:pªa´•W›ÁŠ£hï<ü|¨ÒÍåcÒ¤µeêÍwÞ{TÍOG>xºÜŠê­ —/ƒÈɸïv’0‘æÙwòþí)Oq矵*ÈÈ¥e´ ÚÕ}¬´¨šþýÇÁ¯Hf6Ó8ê©€®öWíE–ôEG•\ÍËÞºgïe€{|è’ À +h1\Ò²K²ÀÐV*‚ã^0Yi°,7úFB8äž Ê/YòÞ& ëïPÈ(Þ(ò2ï„R|^iýr¿a•Uªñ„¼ïPþoèÇûiì»ÐO×ãé1¥—!ø‘V0½Iz¡g¹ŒØ„ŠÃ&tA-¸Ùó„ZTQ§‹Ã©Å²šT*hlˆL±Í«JfiØF.P¶˜ìbKŠÆãŒ©Þ³µ¨eïa%’A&£âHL¤P‡#1‘"&¤MƆé cmâ%<äelØãeò@[Τ"šËpNæbm-á¢Áa[=ÞéÇüù™ÊI6j½!YàÓeLÄóê4Ô¾˱þ·o¨@¥C“/¸“úM8 ãÈÉpöW».Ö+ ´z=d`çéo?Û;™óÜëûß;7aëò">+$vKØ.lv¡B‹ºõw@¤˜VœÓÖ ÷âtCjÉŒ3—]Æœ–´ŸaþcÅ!ÌÖ‹³^lêÝsuøãš~Òš 'y¥D³'4ñŒ‹kñ­(âΙ¯Ø* G endstream endobj 3327 0 obj << /Length 793 /Filter /FlateDecode >> stream xÚµUÛr›0}ç+4΋=SdÄE@¦}èÅî´ã¤ÓÄyJ3ÇŒ\S§_ßEÂæbÈÄé ´gµ{V{ÖBKd¡ÏƇ¹1žR…8¤6EóD, ;.E>!˜:!šÇèvxÅY|ÉR‘Ël•.Gwó¯ã©ã×PNHq`9àSÙ“Ð+Œ «®JÒ¢8è¥øÈGóîBu×øÈÑ’§¥—ÿY˜IÖ[²"“4.ÐõþÚCŒÉÜøe@ZˆôÄu(¶)AÑÚ¸½³P ›à;a€~+Ó5rAr|·‘]ß{{_‰´M´€êð`x}¢USê5à6²W¯«‘G†¼x°xd:ž?déÈ$ÃòcVìˆj;ÖNQß×_´iÁä ”X»„žB‰NÝêÐkÇ·1ñ\Á'žGÙj#¡:Õ´¥ÞJ=CPO§bpH\-ÜáL°‘f>ù‚•Îû|Ûz_`Ãv) 79[ò×ëüË‘VÑ7TSÅòBjË"4¯²ªýŠMï Ǹ“F\ÞÌfÝÖ\2åîˆHx´½:“óåš§’U<'Ÿ7¼5\ÀM&Vq>hè!8| Ú¬v> stream xÚÍYßOã8~ç¯èÛµÒ&äW“fï‰cÄIÀ z+­Ž{0‰["¥N;K»ýy8~Ð’ý4ÏŽc}`9Ê£$ˆÈ ¶5<%aè¾e£Ï”|ü¼e´År¾ƒÝưçr>°äCs¶˜h.€ÉAŸÏ%.b¸!Q{Q¿(ÓŒAq†¢zBå"mf¡u“¼IÿÔ a·§BíVp³ÓŠÒx¬¬¡|ÞÔßo¨2²Ãp´®ýƒç:¯i¯FFùÇs ÏË"K¹üà~XAÐ: ‘žŸ2†Ïy¶ M›ŒÖlâƒÕúšâ±ÜÀFñž*´ÈÓ©†™©YÒMšeÁû´Yãc<´C·}¢í÷qÒ “òi¾­H)_Úš”ß#åÓ0ÒUŒŒ‘‘f$ìÆÌé ‘‘¿DhÉ;<éø©œÒôhÃmG½ÌÏ=g®C?ý Ã>ÉròhTh^M¾ŽÁ›Qã-u|Ù Á1Ür&ñ5œ¢N_52=*.a~£‰k<±áöÙ4'øÃCƤP¾¨5šhÿ‡Ž z¶@öÅqM ³¯é 6{, £÷³4Ù.'š¬fé; æÖ&­ÓEÀ· Bþö:ûv¥#Lø °Aþ¨]|°ïÂzÙ rZRÊêc&C!a îðüw1ñNØK@ éªXúlò€?ï4¹¼ø(&ª2E9¦åï:U(iºi÷üpTÙßèdñú$ºœ™AÀÀˆgŽä+У#ØZ"ï:°ùípHßeäË6ÆÆq|›ÎG·í.ÀKØî1(eäðù7±î]X}äv kÛ$¸ª”¥òöiÒÎoV¨&yODÔÝ :‡(ñRÎR:ºÛBo–ˆÐŸxd%AwsÊbfšpqè›ã•VÈJÅ@«8zIÅ`guãdRüÜYÁ[–/F^´™«ITúH»å ÞŸt‚‘±Ý¶Ò¡f•Ü&­¾Œï˜bY˜êº-~+å{8Œt§¢zäTØIQ1Ámmøm{ʸ‚ÄÕs¥«(@šÏñ½ö§ó§¢ÊS?Ö©?¼TÒ8Ô<•«ŽŒÝ*b`Jìå€èMtQauUbI]¤;ÖuÄ-;^}pS%9%e«DP_» r¨Æ?:0ž/E1Ï Ÿu÷9̯†ñÒA{"Ü?]Z%ë"’8b²9úRm×PÙ*ž ¶ŽWºÊßÁîÿ|ý¤yÖP6‚ýs&žÌUDÖûn{„¼íßmÜp—Ôõs3!²Ý¹„s²<º˜—”s(Œ[W éþ·Æ×ñÉÿÂSo endstream endobj 3352 0 obj << /Length 1897 /Filter /FlateDecode >> stream xÚÅXmoÛ6þž_!ô“ Ì,ß%¥†vm‡[‘¥î¾´Å Ø´£M–\½$iýîHêÍq\§À0ˆ)ŠÏ=÷Ü‘4Ø4øåìÅâìék̓„$šë`±¥DHDŒ-’`± >„—&]]Ìx¦Um^dåìÓâÍÓ×"͉&1ðU;ƒ%:£~¡§¯%žwÃç<‚Ná&ý9Kt˜æ­™L}BŽ ƒ9‹‰ŽÔ`ãÛ´(ë¦ÊŠÍ uB"Ø7ð|6—R†Ïgs!D˜guƒ-Þf͵ë«Ë­q­e¹ÅÍ_eEÚdeá:˵›Ð\ûQë2ÏKw‹ëÛ®›™RvCõù>bŒ†ŠHsƒ%¹3ð#gtoÒd;ØbÝn>RNÝ–'IÂT7d›0wpá ‰ãxô%ØhÉÂÔ/$*´Â5/9 >Ì¥àa½CFÌl{X 7Ùr˜JÁBs·«L]Ïæ,Ìf,D,qÀ*mÒgÐŒY¸4y^»Þ´ò_^âмÝÝ‹båk“6-|p«¹$¡éÁH¢<=*çšú¨¦s¦ —Éㆥ)šªÌVõOHIbÁ÷<¡"ž€€‰-L®µ®RKÎ$ê ëƒEf< íB¾§œÍaÿeµB#b8#+ÜÛæº2ÆÄíÆ Ý¡!?ÄLÚç/îÙ"-c’ qÇH[ï ûq0Ú„ãÿoØwÙÉëSÙ/<@š4s>`ŽM‡9¶¶enžmî_Ù…\ó>æøAÄßzÌùsÉõsAÕsûŒøÞ§¹ Ø˜Ât˜ïA2ç0•s¬4¿•ß§œ«Ã¾TƒÆÇ²›ÿδUÚs®„ÓÞ'åpQ…£h€zÙøM @E,âš@îrS/ªrãôFÄ"|¿ƒ_+6Æ÷X?Úi=¶òŠˆú ïüWªÒÒÄö¹M 0y’œ×º_«pÝK—D¸Öa[¯H$²"޾iqœØ¼ë›µ/)‚HÞGAS:#*S¬LåL¨ÐPo\»³Œõa f¶ë¡Äî+}‚tåáb˰tƒL‘^Ù@€!ýËUÆ%ᱞ*Åx9$·†ÈªRô’æ>¯j6B Ÿ–©9t:'qÒ{ýþרÀ‡àÓ@50±r6Tí#–ŒÐÞ×€gnªú#Ut“—Wiî¤òG÷³¸|ÿ i¯Ù1³ƒL!{»®,Œf]ö PG }j/¶Ea+Î]KHhuð¢;i¾¶îDnpê†)G­L“f¹Ÿ’ºKÔ=4·9C‰"<‘ɺÏQj«?ˆÀA^v¹Ik¿x¥ÝÑ(™®$QC½É6…iƒˆ?é­˜g˜…ŸÀy¯L¥Ä4öªâõòbf‹ ¢É³¯]IxDN(–Òº³hÝbÍr’–ÄÂN<$%‚¥ž'%¤=}̤ûi’³x¢#°fïÐÞ±µ2бЦpá È7ù›Ìøý,SÿÂóÙ2M·AŸN‹;â„PH;“ Øåiq4² É{\lLDáÏåvk.â|dÅ2oWž£Ô ŒQpaÏÆÚ|n¡Ì îÄø„‰q)âþº Ç¢,æÌ€pöÕ¬¼Q…:k¿ºîü›ùu ÒCÒ»uÛæMVãü²8`Ÿ‚2 ÒûœÚ$@S¹§6Îè8êyO!º#QǃX{ÇÚÁöœ…V@ø; "6¶W3"h/*—ŒžåœßKý äƒM%$—Î<ô'j=k,/Œë·éݯ[°g‹o]]mqífî“\UU²Ww;6×vŒwÞ•ŠÂ¢Ëa*OÏi I\ôåÀO.ˆÏÏ¿Eq-I4ä4 ¸’e_øü¦íq~œúc«¹.«²Ýà9CÛ ¼ÔT®¼]µ#û›òþE‘Ý›}Ñ$¡zÈž\”$Ñ^áPsz>€c.&&ùÀ™2góòÆT7™¹=!#HûµI™ù¶lNÒóý+ 'åöî`¨q„„|÷¹Íì±ß!OÖu»º/tðôB+ÒÇŠD É gÄ.]¢ÿ±ÔÞøË T|üí¥²ŠGˆm—œ_-Î>Ÿ1k믑T*‰Ár{öá Vðò ˜'ÍàÖÝ#H$ÑAyðîì{ Òñ]Õ}q• ’Sd•i¸«ÝS6­Õd2‡S ´Daìÿ¯ DÂ×6,Üù–í^W8¨ÜâS^¸ûl¾@IÆe½ÌL±œ)HõÃÐðX¢Ç@ã  ®ë¸RDí^^šzYe»ÆËøci‰ú;®¶Ùµþbl]Ù=Coèg·aS<˜ÅÓ`y_#©™õ~£1š-×WYb®( !]0ˤçզݚ˺¦>jÚ7LêL8l‘¶W&žv/!ΗMY}én¶¦Yá/GŒþúÇÞ¬™›{wY“òǯ3¹ULN7íÕd+·æð­iààâLÚ¥umV½2<"e ¢‰GþÞÜEBç_•ÏO endstream endobj 3366 0 obj << /Length 771 /Filter /FlateDecode >> stream xÚµVQo›0~ϯ°úÒpmllxØC§¶“ªmÚ’l/mXpR¦$p¶õßïŒM )MÓ­S¤pqÎwßwwþ A DÐûÑ»éèô’I”àD„M爂HRŠKÐ4C×Mbÿvzuz)ÂŽ+¸aJjœÆ*Í&S?fÞÙ¸.–…Ù1".ÑÅt´Q0 ¢»B2†f«Ñõ-Aüy…à¯$F¿×âCröMF_vñöŸ λD(Á‚S$¢Ç4ì`\晚¨MP‹z›CœÄ´¥öÁ¨W˜¯4óÅ^$¨•YÛ˜%éÕeã óti}²T§M’aòœaI_DÞ’$Ý$ÁqäHž«zVå¥Î‹uã×~ÇcÐší¸ GÆv7ög]¶ÜßqÛØ`a‚96Ú×:]¨AQõÛ×¢¢;wC"2+Š*Ãó|©ÞøADˆ—ÖuzoÍ·öq2±ˆOÀŸÙgÕb»RkŸ…ž®‚~츽!ë^ ˜±°±Ï~ÃôÜÙbk?0ר³ú§5nãÒ.BsaƒNóu¾^ئ|÷ƒPzÊö{3¿ ^€&_§Úm-íZ› ©÷öxb@%¥k©-ôѼ>¥+—·˜Û§ àÐ{GµØ-[´³|5_™ñiÝZ˜p °;sßüDxér«þbúÏÜøàU ÔšãÇM'X&;‰xBUz¹àÄSÙn( [‘ð~(Ó&=ÄMR°iŸÛD™r]ÖÅ#z ö½D?([ŒE8„{á¿j6ƒy‹¸ìÞ+wÊaÍ5Vš-½bk•†r—Îj–çU£î+'ìS_Êî 6\aΓ×ïÅñ¿‰wG&ÝiÛêr«­Ì«†žÑô½ ú9I|]ýv]4úm.œå•SoŒñ³*-^K¥mœÁñRvžWj¦‹êþi ÖwN®š ²£Ú/×Y(ÉñÐ.~ëÊå+Ó $W«ª¶JV•uEôHÍÛYïõî£þ}°àpVþB³n endstream endobj 3273 0 obj << /Type /ObjStm /N 100 /First 976 /Length 2055 /Filter /FlateDecode >> stream xÚÝZßs7~÷_ÁÇø!\‚eÜÞ¥íù®3íLÇN;½³ó°¶·¶.Šä“V©ï¿¿”V‘c)^9RšÞƒGØ%€ à[ÚÙHÊ(g£UðœÊVž“²¦ °r. áG'DPÁdE–Š^†’QÉȬD*q:aUÊ,o &•“—¬È8‘ŒG2Q”¦ ˆlA…$Z@Y}Ù(r–D!æ2eȇÄU zXƒW”PL>—wPXÔf¨™„‚àè°[L¢5'EÉŠVÌ¢ùÀ9,ž²-vâ]°ÓA5Å!†”µ…²Ê:èå”õ6 ÅÊFSø¼Â:I((ktF¦Q€‹»1¢œwe¢|y°Ï…"°‚ÿc.ŒŒVä¨ÄV¼‚ñ±sb®x9`ád¨/›2º™ÊTë@QfYqq²£Ê‹2C›š̅…ù FJGGÕwê ›È8Ö'ªúõŸÿÂ)3ZÖŽ“«64_|ýõ#Ü6j8æ>÷ñxÔª£#UcÓ¾L;†½.˜?Àó o1‚(1½‚Áð°<@`õÓd|yÚ´êLU?}w¬ªWÍ]«–º^ý÷¶Á@}ÝTßBo3j§’²Ì?¨Nšéx6¹l¦ódQÞýØ\ êoÆwêÌàEÀ©ŠÙ¾†¢z‚Ù`dš3¾Æv6OpbOIp "âCÊ”ƒêtvÑ–ç£7Õ7ãÉU3)êÌëêÕ÷Õ·gTÄÂK¬lÒ$Ámu,IHg„¹'§½'p½,þhoJ³Ð™´»tAL K“8Yê3é¦] ›ÉôüÙõp|QÏÏg£›‹ñDÛùù»ñàê⯋‡Ùhúfp[èò<¸±¸¹™Ê›¯>aî«“Ÿÿv~ø @©3à å¨ëxFG!‘lJ‡³}@-£Fÿ6kg“æœÔ”¸ª'íàrØLß³<ŒÚÉXß´o‡‡O^NQoˆÌP¡ýz#Úñ‘¸ªÛZ·õŰ9¼ß® ÀëÝÜc~´]]ËÍX$qìÉ- ÓS_nÞe/(/_ E* Z{ˆå»ÇVunÕ´ܸÇü¾WÃþù½0[ÙëÔ“Û'ÖÑõ•íÀMß5£ÌyÿÅ5=6> ëŸ 6l «ÌæuÜŒ2Èa?Ü.KGÒ›;IÎÌ}¹ëÀùK}è*†ƒã§‡ƒó[„Ã*óGá׹é“QŸì'oúÉ›§c×!—›Žè`w0‚;fî`w0‚;Á±#RGä}‹À¤½ K`¼ÕXà,¬Em,rÙ;僶§ýã oä /q…§¤õ\ÁØOù¦Üá oÏBþ#qEgR‡+3éÿ WprZ®¦:\Á†øO€+Y’z‹•8A„A,W@…:²Ý鑘/ép××Öã[TT4ô!•Î!F·1ön‡õh‡© xLî¸ØØ’Ò¡Ê­"á$ÄÍßHþ2wÆ‹5§Çþ2JœËÐk ,ÌÆ•Oˆ‰ÃöÛ77ksôÍžÓó1ß šßw„kQ ÑÐÓ×:ïµw~ÿ¸ö b0¹¤Ç&»\®*"B1êh7§¿“¦¾ú±½ûð6Hî‘û·`«Ìwäë¸=Ê_\÷Á{-7G´¦¯lQj{ÛíÈkZwg³n"Ú×—ÛZ4G}}B¹ÆÓgùˆPGNf— "¬ŸÞ‡®]¼°~·WÓŒ]Jòß0‹»iF †7wŽÃÁUsÚügçwÓ.rù4Þ]N ´´Î~FC–H\@¡Ë@Òˆ˜°u Û€Àà×_æÉÖ½p[’{‡÷Üÿ= Në endstream endobj 3382 0 obj << /Length 1668 /Filter /FlateDecode >> stream xÚÅXmoÛ6þž_!ä“Ä,ßD‰-ö!]› E–vm hŠB•åD›l¥’Ü4ÿ~GõæÊŽ“µØ‹¢ŽÇ»{ž;M½+z¿騻µ¢KO‚ ‘4j ïÝÁŸ¾Í§uBÊ¡Œ%™§Â˜èXL;Ñ­‡„£Å±Ö›·AÈüÌü$ó`&ÂÈÌॠàÇLÄþI)¿2"åEÜ>¸Ôì5“Hð‡Ä}¥€)Ï0B£_duZå7M^®F®ö.d±7c1q܇ ÂÏWæ)ýyî6Öqü°¨¬¯0jc:[”Õ2išÌ-}õîõŽ.©EV#sFÆÏÌÎ<$QâÎïëä*›4ù{Æ·.Dߣ}ICjtZqrŒèP¡\Z®WMÌBJý_ðqöþôôÈÊS'¶²e5ßSvYYº6^ï%ÞÜÝd#ÉÔ}XgWËlÕ$Èúð?¦0U•ù¼>!6©o‘MV÷>þ”^'U’‡OvÍl·ÐhlrA4c8Z&óß×Ïÿ8~óëë/ÿ2ÖÍ“&!ó¼rf-ʯn”Ôur7ÚûÐ.:l•ßÇ‚ãêj ~‚ûM½“ ÛXÐgûˆúP†tÌÛdðRû:˜IÙ\™'õß¿=ÅM€Ç >¦ØoÖ"û²Ç·y«;ûvSÁB“ ö‹ æ³)$ëër]¸”ÊViyI9u†A)‘p>‘«l•ÕäïkÁ†ÿ¡$‘–­,èc`‹¬ï˜»“;5bÞ…¤ÅºZmÝEi(tñp—g¨þ¸2¡^0Bu'o²fB)ØÀ¡ð9¡¦Dõ?ùÍà#Õ3!C+rH”%ö¢ ФĉÓ¡EØ€"¬£”€¬(žÔ7Á 6+üZß@-HŠéê„’Õ<_%°£‹ðcøÃ8#q${xÁ’0èÄ–FDƒ1CpûJü(|¥ÃW¶øJ‡¯D|å|e‡¯à+;|eg¾M!«~:²]p¶¡ºüg€>\à2=מ›{ãznp½ÃŒ‚° à.ð9J6ìuÌtm*¾AÆt{…Ý€g­ð¬²f]­ŽÌKì§fÃk'_·[®ÚA…Ïe`Šˆ›4ÕÓÍ8ˆK1Q*á’3º+v4Àb[als­E_÷!`ͨîXpL2ø‚ £vá.Cg¸ïŒ™³B<ÒÔÔÙiû‘™ÆÎ±™ Ì9ûì‚|ÒAÆG‘tmÓÞ„:Æè Ì®·BKZVÛÔw³bØš×Ï–A,ü£YÅ"¦våðìx"© ʼ7l”TÖ ØÚ VkLV\ÃðÕÕ΀qÅI<¦^Û>¦¶ûÚŽÊŒÝÍ´eiSVw.¶¥#j¾ÊÁ>kú…1ÖÝäwdmoI[ Û¶¤¿ìf„³t/´µû;w–,3çX @ƒ™ f?^›Ÿ çð¬AýØYÿs†¨åfÒTù·¡e›mº–hаU¿´‚ʸζÜ3w¶ç÷ü¯B×u¬ ™/%¦œô ÞyíÒÏTë_ÙzœÂýBýÙÔèÎG[íMv^;©EY¥‘»uäþ× ­GõÎ2<“‰íi¤‰ŠÂýË–·‰d—„ugcÙ8ŒÐú¢°M̾´û9¬ý­4u]‡¦?Œ6˜ÆÛ˜Ç‰ÔzæiʆøJ*¶1OCêêû™§û?¦™YAÕýÄÓb`O84qí$Ç@igFH;K6áÙú£ª§Ýwí82'w‡ÖžÔ“=õL¬ö`Þàú]rðM endstream endobj 3397 0 obj << /Length 1440 /Filter /FlateDecode >> stream xÚµWQoÛ6~÷¯Ò>È@D“EQÁúЮÉÚ!íºÄ4EÁÈŒ£N–\JjÚþúII–%K‡ "Ò<’Çß}wÄÞÚÃÞ/³ËÙâ$Œ½%œroyíŒQȸ‚x˜xË•÷Þ§Ï?,]œp:0 £ ÃBÖèLÉÕÙ÷µ*Œí ·[tßÅ “ƒB‡xá·Ð-qI MÞsδH·ß%¦­WŒ l"Qg²)s•6¹ªœÝh-Æé`1r4~v=±*&%Z7Fbg™Uó ÄØ/ÊzbU8;Ž’ÎöíÅééÄ‚vkÞºõ¤û¬dݶ®µÜ(×¼Íêײ~ΉßÌâçÐh-ª­¬3™»NZÎ8v©WY!kw&/ ”Ì oë^- r/].£À«p<¡]­Ä=ÆøŽ,>l^Ûª‘åÁHœþÞ Hù7Y¼"Ž endstream endobj 3409 0 obj << /Length 1821 /Filter /FlateDecode >> stream xÚ½YmoÛ6þž_a´f1+¾ˆ¢ZìC†-k‡¬º¬¶bÓ‰0Yò$9MúëwÇ™R”×6ý‘ô‘¼{xÏÝ‘‰&g“hòóÞÇ{/%›¤$•LNŽWE„ 9I(%’§“ãåäïé{-?äŸÏt9ûçø—‡< fðTqXÏȲˆ¢Ð^ä¶xq(D =çR%&s–À·sÖUAÚ«žÍã(š~o?ÏÖù¢®ÊæÙ>®kÍA¥4ŽÝÝfˬÍzSÞþqt4*½Ê‹V×}Ùƒ“ÅyVg øádtÒçžF\ºy½TMkýßVi¬`ÖZ™BgMk‡ªRjµ‚Ÿ9wº@cUE5c hQžÙ!·“íl`Ðìi_=›("%â&I’&Î1nÃÌ´,ö=Q@NJÃ"É‚‡×•¼ÙÃå+÷líõrÄåÔ}þ´[Í…’7™Å±â—³ªWùan`1^ˆÐ­q§5:Ì/RØ;õäÊު̨©Q¶ò³^wØjk¡-¡ìlp¾˜[–>h[& œ+µÛZŸ ¬'ÏŸôÀóRˆí»Øgí¶ºœŠØó_R™/Cë*_6Á¥Ë#‹£¥‘ðAÔ…óÎD.5(–!¶-ô“ß.ì1›*åRЏ¸m‹¼ ‚ê—ugùß½=:DÂ&ø9- 3t®«‰Ý¥ÅôLHƒ¯OԤĦĥÜ­ô LQl3ú2ñäÉd“_ê"<Û~Z¿^•„~j&Kt€T7ôÀG:›cüÕJfÊÿY,§Y^d§Þ†Ý;¦y”ª¬ð]%Ég]»âeX“ˆoáF¦ ¨Š-^º³ÑM›Cü+S¯:ÛMxr§YÙ{V§Xì5ù®ñÏ_ö$ê î ùÞ¾pžŸ{hîž&EºQ\@\¬EWš)>Ýwô»áæœ@UCå]ol§˜ß¾ù7߸Ò¶<³„× ÆjLéø(k¯ 7ß©$#Êû•ôè÷ë¯y^.õeŸl[9"ˆ (Ù¥"Ýë´(ñÉ»æ&EVÀ–Ðû>H,Šm“ÛÊøÁW˜UuqÓÞBÚÀ·YQwøçƒÓ´y°6öÿ_G}i®ˆ¹œî}iL5ÿýéxï¾§‘« endstream endobj 3424 0 obj << /Length 2159 /Filter /FlateDecode >> stream xÚÍY[oÛÆ~÷¯ úD³w’9(ŠÞR´(ŠžÔéKRÐÒJfK‘ /¶“_fv–IÑŠýP40`-—{™ýöÛof‡,Ø,øñêÛ뫯d¤Qj„ ®wg,’Ê1ç‘‘ip½ Þ†‚‰ÕŸ×?¿xeĨ©TI¤ŒãÚ¼¶ûºêŽ?mm¹IØ6ØãŠù‰^¼RlÔuíû®E u’Føc•š0+:;é9AíL‚5O"™$ýôÙöüãfw–N¥Ò(ქ/Wk¥TøÍj-¥ ‹¼i±¤Âû¼½¥º¦:X*mª®æ&/³6¯Jª¬vÔ¡½õ­vUQTØî>/÷Tu·ÒÚ-¦y9BN€ˆ£Dǰ–ðPdà;ÁÙ¬Ód9XâýjÞ1ÁhÉ|TÄuߤ­³²ÙÔù‘6e6šVQœêÑpÒB…™·þ¢$¨Ñ*¾þñ*x –PǬn(²¶Î&v»V°ÐÆ>kÛ4„$‚øŠ~®_¿ù^ñKvq®U ǃb»«jëÏ·‰Aºf÷‘º+KwOáuŒ„R/î'KÂWn?‘îV8¢kµýÈ ß%à c p–NOª#‘ªEšÎÙ \O†Ð( @TŽ…Í?k ·ë‹çc3Ü(õ)’¾Ë÷¥m[‹01X±Î1ÿbàY¢€%‘"=ñ¡Óo+Ь Ú"ÿØßÌ/ Ãd†é-Úupq´OR‘DºŽK""ÅXDàéy"ƒ›K&‡‚'9‡“åãÐg¢ç°röhZP»Ï­_Ï&ó/<‘}+Ûö DÚ>ù´ƒ/g3aÿ±ÈÊ‹G ŠbÀņ8ü®:œÑÀEÀó?/7E·õ}$vàœÁŠÓÝÜvÙæpØ?å\]´ã‚£]˪\÷0ÂùGtÿÎ(—ˆ¨ÜqÜ`†£?ß}ÏǬÓàÒa[]ÑæÏ,¤jÒ(ŽÍÄ>0Mçi2:‰^àø†>3Õó 1~c]c—îB+àø“1Ûkx$Ù)é·`$ðôúúµ4˜äaâdSn¥7÷5''ˆ©KõÎñ`¡ûéö¬KLàÝÚá>ZÍÚ»·˜E:]‰û•Jçe{ÆÓî*Í`ÒÍ©Aµ{†7&rð'_Ó!~ùòSwùdDq­$ê½ôžÍ¸€~Hö±ÔÞVuÕí1R5.ÚÇkMWm7²„aAÿb ‘Ÿ‹Í\c ÜÇÍÉxr±(g!CcíÓý7grÑ)k¾®îl}—Ûû'xåF›8„_«öIz>Ï“”»¬Â)ºqÁ=0í=é.¯)½8d|Ÿ¬ðÖ-O÷nŒú£ÖÉõ¥@Ñ€[¸qÌ6¸Ó;’ïýõµÿ”éð•y $œrrÓ?\_½¿âÎ.>¤ô¡L¤ÁæpõöOláåÏ`¾ù¹wMx‹(V¸UEðûÕÏàdãïç2«x €CŒ™³ogߌžôp-á'YÑ(ðo_ãÿ #Tÿ.¬ñêA[¢@` ?[ªr»­ñ®ù›Æ|Û®º€—.õ t¶ðõ„'€BêÓùß[J¾{M.GGÂೌ´vã3ˆðk‰&·¾vëËdžü7¾Èè§´÷ㆠ$yK·WW{`n©Xùñýkã=2–Aƒý‡êµ›L×ÐíÂn0&yǤêSö”p`Sa9Œ.Ù}Z.Z¼h&Ó;æ›È¾Ïþ’4"-ŠTu÷]S36Øw&Sý/ëÿ=¹Éú endstream endobj 3434 0 obj << /Length 987 /Filter /FlateDecode >> stream xÚ­VKÛ6¾ûW{’€ˆ+’%Í!Mv‹H›nœ^’  mÚQ ‡KI뤿¾CŽž®vã{’Èy¿oÈÀ98óËêçõêúV0'%©`ÂY‰)%‚§Îzç¼wïT.›ìÞc‰«^Vmi~šÚû¸þíú–Çkž ’|[;p£´ ºp×·a0Ñö{uŸÅ°ÉÑè…>´…*=κƒùùÜ…ÓÔǧ)aq‚ŽªÍµmΘ¥ ’&¬Ïö­jµl<Ÿs¶ž wÁÁ,¤ßyð)’vq ÕÈläå‘—…êâîñ;ø€Uèn=êVy[”ØòyÓS` 9E‡y©peÞªÅþårÞ·˜ÂØŽÛa;¬ð”5ŸQÔ|îR—Û"¸ÎvªŠUÔê «öèÁa»j·T‰IÄVÁ0‘›¯²8æêqÌN&g"ŠJK:_¦™‚(¸:nŠí§ºy~kj|ƒ½O’FÜG¨:ÜŸ|üÞa¿BaMmœŠÏPc<6³zŽŸ+kUáV7ëÕß+ Q‡„ SFR.œm±zÿ1pv „ÄT¬já„ÀÉ84ìÊ·«?l…eõœPž©Æ´7œ±Ú2úŒi0¢™9ä–Ю•†š³ÌAG‰«½ˆºòd1ôÙó©Û`%J› ¿{TTeýH'œG?Ò,7Xb!HŘõ+Uouv4ñÿ+&E3ÁÜ­ƒ1Tj—xèLp[¯ÙÑý̌ݙ Âh*[t'Unfc”¾áÿ.»ÏvYy@©Äò62GùÔ#·SœÏuÿ°•T¿ §ù«këžÅHÖz+Á:W¸ÚñUúj(r0.CØ®4nM+3ú]àAãF‘å¹é»Õ6Ìyùæµ¥ƒÝ0ÁqL1Ë„8…tQ®f‚fÏÑ7Ubá&J `°diÜðP-æƒó]-êòy³—t‰\¦d‘nLÌk™Œ Ú)Ü+½©Ì‘Ldë»w7ýyprÒ§ºCÓql^~½–ξÎon(BÝþ–ÐÒåt†<É…`ܶñ..¿ëU—ÞšªÛ¼±ØŽ`Zìe›{´Ï-«Q‰þp‚ýY^œÛ]±cxTMÔÒª6?õw_ì ^wªiuYϦC±|Îc#§£ïl@\€Þ'¹÷»×daž0ÓKsï 9c˜ÞdeUQ9ÛgQÏ[;þ'’^pÔö…4  W;q©«ÓÜî?OdLwáEÛŸJ¸€Îß#K3f zå >—º wó¿Æ÷Ü endstream endobj 3447 0 obj << /Length 845 /Filter /FlateDecode >> stream xÚÝVMOÛ@½çW¬ÔC©^öÛ6R)”JUU( \(c/ÁȉS¯)í¿ï¬w N0¤T­P^{ggß¼y™‚¦ˆ Oƒ“ÁÎP‚Åš\"JæB¡ˆR¬x‚&9: ÃóÉçÅ:¦\Ř ŽZ£ã"Ÿê£²j¬é€ø>N?–Ñ¥sIÌY„²Ùà유6?#ØJbtۚ΀û#Áa]¢ñàÛÒßú³@ˆn”`%(R2Æ <8pzžÎôž.KƒÇ{“‘1é\qÂpÓelCIƒÖÅ0ä2ö†ðZCÉ‚ÒØOQPÌÝVꟇ×ÚžÊý<…©/áÁÅKz2¦¨Âð¾6Y],š¢š¯„yîjÖcÒË.YçAK™[¶rá"„÷à @×Ú…¸+´>™ÂŒRçõĤSÝ æ!¸Õ„:p"ñj|óî%$s÷œéæªÊÝú²ªÝ"+Sc¼h“•Ä ,£ebßzäÝûD7ó]±¬¹â ŽåFO!• „ÂâDªZüN$©.,ƒïì¹¾Åv׸×÷îñõäËo€1†CÔ^7‡Œã„þ ZÊ"×cýc´ÈWDËdt> stream xÚ¥XYoÜ6~÷¯XìËj¯,‰Ô…"©k§ ÜÀHœö¡)®Ä]³Ñ±¥ØÛ_ß¡†:#·R ךÎñÍpFÖ긲Vo.~|¸¸ºõœUh†žã­+Û²LB½•oÛ¦GÂÕC¼úÃx/â#¿OòrûçÃÛ«[â÷Hè™E@\MêX®"º°ô W·”ö¨wÄ Ì€®vŽ{yd^”ÛkYÆ+|ܾ¾ûps©ä€Œhº.’2)Ùy@ûîãÝÝ$é±È«“¹ŸI}6SöS…áI´M¢®m‰hÎrxo½ ¯œŠ9Øþ0D7Ø~ýû·X¨ ‹Ž˜o’ÐAY1N¥Öú´O£Ï2…J×V׺G· GÆÒêÁ?.ô?t".q£ý ©j½p N`:aÊM¬Ž„š4h?ÐÝ_¶§ÄøfHÈl)ß\Íóæá⎑ª endstream endobj 3378 0 obj << /Type /ObjStm /N 100 /First 969 /Length 2057 /Filter /FlateDecode >> stream xÚÝYMs¹½óWàhŒºñ©ÒnâõFÉV%•-É[•Dò’Æ×4G5ÚοÏkP¤õA®!‰ªdsÕÃyºî× sÈÊ(æh” òߪLòŸ”å$+›œ ìqABˆêSÁâ)68å¬1'«<^YrY’Q‰UÓ$­•/œŠ>ŠàU2,BP xQ¥ìDH*»2Ú¨œ&ÎAYkdX̘>ÊLÙ(ëŒ(’­²>Ê[Ø`#ÉúçìE‚â6É0o`K5sRäŒèž3$åÁ[HÜA¿È:$F@bH°’x¤øëPwÈœ”ÅPg°¶‘·Î⃌Åò‚\ÁA[*3 D>ŒøS<ë,>¢¸¶¼ÈFV³p²õ¼rD2‹ ʹEŠØÇ\ÖHÊ¥P&ÍÊå,8l…·,c ;Ä,[ä!yq#ÉËLê}.¸¨|p^¤)‹E”•Fø˜DQØçÉ$ŒéREa|&†36ß„âyRÁQ” dËX8˜| ÅHx8°7£€­ \t‡ÚÁ9€.ÉgUð,ð"ø$‹9‰´â˜B,#°D\¾E(§\Ta'xÊ!& ¼JœaÎD%.Ž 7â#±åÑþþ¨ùQã zœçCÕüãŸÿRÖÍe“HC95[L§ïFßÿ 4±8ÜuhX¤\‰6I´¯C3{-¡ðhJ¬½«Õ›Øi‡ÌR‡¶ šØ;þ>èfƒÚßWÍK~ãå°ƒ@*#(–ˆÎ”ýêG ¶+‚>!OÈ&l~£vPǪùùÇÕ¼m¿ j½ÖÛ_µx1¾hGÍ¬ÛΆ¹¤Ñ2~Ô¶ónÑŸµóej-ßý­=ŸŒ辨cù"àdÆLï°Ð¸Çhæ¼i;ÃÚöœ‹éHºÚ#ÓÞwÔMðÊQ!M&<ÚYmàÝJ4“f[‹ö)i[k$ò‹fªU›(éìh[ìÜ —[T;xàR]ŸH9Þ¤åÚõÔ¼žÍ:Ìv¼,æ¢O©åׂ] ´x%,•¿£c™mÔ-N‡òü×Éìèù¡ëÏÛ¾hbÞ5i~jÞÛò ÊŸÁl2âo$'ÀèDR²Ž×ÅéGªùs÷¶SØ´‡ïgú¨]ôã᥸o“ ›ÖEQv½¦ÍÈ‚ÈÁ8c¡ :ƒë5j컵ÅŠæõþ~Y¡y}6LºYsÔürø“ü½¸†«ù^Óœõã™î_]õݯX@wýEs5>û€mûß]ôí|Þ¿Ü¢îÃ=b‡âo ‹ :ƒH¡¬é`ÝV·}ž —úp1Õ+•¶zðÁ*Åê€j»RÉ%ü—Šþ •.dzóiÛÏO^\L»Óñôäd1»<í¾œgNN>u“óÓ?^?,fó“«"—çÉŬƒps;—o¾{ÂØ·‡¿üéäå „Pg 0 À½C¹’<•-ü’Pë¨Ñïâo?ÁIm‰«q?LΦíü+äÕd6ô¾>N_>ÚbÖôÉ#˜„W‚Ý¢à]Ô`^;=¿Î»Ùt2´7´-é4³¾œÝ-"I_‹ÆI×™¨M^Gc+Ñh)´a÷‚9}­jwJá­â‡ˆ²Òùݯ’­…Îä{µPººÇÖBé·—·ŠTà¼I‡¤¥Ûq4£¦!kïô ]ž¿÷ýS$oõ)º^GzF¤sx"ÚÆynÇÀ£wÜý]'z®/Ciù¯^ n%ø•°Ç•VÂ5“’VÿZ°;¥KV¨‹´â¤å~ƒ"¨’Ê„ümhk¥E±C‘b÷q<ô“/»«ýÒlY8Z’Ѩ“x¹ü@*¡ðü,ÎQ@Ñ¥5‹sQtùwÂâ^:—µ%‹s¨3!Çÿ&‹[©´bqßRéÿÅ9ƒ³åiÍâ ttô;`q6ƒµ!;±O:Icƒ£a‘¿ÊΦ݉¥I;;i£\óá ƒ°Œr)7¯>‚—nï ®¦ãÙîN9Ö^®‰AšÐZY”D–KnʵU‹?,±·÷›êTìÖ‘ÛM¶Ö/³{–ÛJB.Mááû·Ôk{ø-_¼²¯:¼ü4i?ï¨@ë€\ìŠä³ÜÊÀݲŸóñ0ÖÃøtz·‘«üz t¼n$@ÛJ´ FÛMŸÑ ²o}­&Œÿ›î®6‚%| \ó9ÐRm«FƒžzÌ ì-Úx‹PnãÍADºåEꮺ ÞÀ/™}U+?ÁÔ‡$?($7¢YºŽÚ¹}bÍÖW¢]f„û3¡7Ér%š¡76¾½í÷‰h¡Î\« ™€³äÑ3m÷„±»Q,?w=ºMr;½û]Õ|v’K>Jòã­EÑ‹öÃßO¥ ìí¶³ñÇöM;ÞbÂe§Ü.”n¿þâáµß˜~w€F›’¼ÿ_@SÒ!æJ´$‹R% 1úÒZŸ°ÿX«7¡ÃôÖ>š¡6NlBÈz~®ñ* #öOKaCM •5Í…ûÉ ¬®8ÂN¯8YA2/ySœÊÁ鈶 „mØo´ãáìòsרáÝ•ßm2ZŒ´±ìR=÷ô0MJð„‡Ð€°©T££‹‰+Ñ$+߸ÎýÚiæw endstream endobj 3474 0 obj << /Length 981 /Filter /FlateDecode >> stream xÚµW]s›:}÷¯Ðø fŠª¸3}p›¤ÓN&soâ<¥} ;´R“IýÕ`„q‚ïLŸÑêì9»Ë®ŒÀ ðeöi5{AC°€ FX­FRŸcÈè¬RpçÄÜ«oï/é™RêÃHÂh“ë>/¿.‰œšoD\ge¡ŽÌPãé|5û=Ãr‰îœ°0€˜,@’Ïî~ ÊÍo@n-"ð¬MsàK¡Oåz nfÿvxçVâû}%AæcÀ‚JÀËq†R]`'ònõÝðpìĵ§@\‘£ Ü€8›f«…ë0’€'ˆ5¢ÐHz:Qg¼JDöx h/ÌÎp<AFÈ^Ù^¥ŽJc(Óèb%Ì“ÂäªV‹L.Œ“-Of0o«xÃGÉ’³“6 7HØw «OPiŠá"Œiyÿ“'’f€óÑ<®n//ßi{ÔØ6ü⪊_Þ0m`·ñ Õ4ÛRd›i–†‚§»Dg­dž5ry S1=-øš ^$|š³5ëàÕ´Ø¥ÈãmöGæ¼~(Sëd¢²0¿,7W%—, ÷›Ï«¹ÜÅ£4Ò,·)àZþ‚ël[sa^ŽÚVI¼åPgÉŽ£ÙHã:ž¥ëvñžž_ð™g›»Ðäg9êØÉôÑ|Ué¨qÛ8”2kÁ'ã,.ž8,E:ÙÅòòæ|ôÐ÷ee{X]ßžFB¨_{#©*Ž ýc)6»œ.%N]½ÚGÞèMS°û¼ÕC&)iÛü²!ga".ús ®•…C)$¨‡å½ s~ª&zàßB÷0Aª•{˜A¼ ýþ4™õUœsÓ»Ëõˆ_Bt[ì$‰ !ak•°~à#ˆÒ6 ý¿‚B!f¥éÄ'E¥ê¢ŸÛX¶uMÑM]½ËŠ…>f-Òa:33»-ŠzœVl35ú‘¼H‰ h—×ÒÁ&w–åתyØÎÍ^]*¾“”BðDÏè×bÚø¶øÚcèÿÕ›~J C&ëÝyj6e§åE%=Ä[óâ˜Ë· ï'ß Qn|öN\Dv ú?qF`„©-¥›Ê§*yÒå›Ô¥0!os°óûê Î®âÆlmì©•¢É9 0$Á+„·ExêBà£ÔG5¯4´ëI²i§%ýàz¾8íõC_Ý@šHÈ_MPäMääâÒ”ÉÙ8k«zÐc^©vÍlj'&<51=þݵiú‡¼ËU-Üë sa ‰‹Dñy(Å ¤¾#êøéýÑûŽ×† endstream endobj 3483 0 obj << /Length 1840 /Filter /FlateDecode >> stream xÚÍXKsÛ6¾ûWhœ¨!ø¦§9¸IÜIÇu=ŽÛ`’˜P¤† 㸿¾»X"eF•rêxÆÄcì~»û- g¶œ9³_O~¹;y}º³„%¡Îî3î8ÌóÃYÄ9 ½dv—Íî­Û›·ʹ[\֢ɫrþp÷ÛëK/,õ’ÅŽëE®¡Ð‰cÎ꾯/}°Êö¢X/³Ý=Z¬RQHVˆgY6Ù92 Y»Ý‰×b-ç¶çyVµ ¯Þ&£v!ænd=£°©Ê#…¸ã³Äï7½PJ64‡QõQÙU(…~âYü—|IƒjUµEF‚[6‚ Y¦•îgÄE»Á€Áé{!2'~Öø÷¦pȱגÆû Ô½ºBž°»vu)Ò €º&ëÆ‚„ГܒÔÙˆ¼~Ê•™ÈÊ]%U#7x9|n]Ë%Èå‰ahéõãÛ˜¢™å}2Ñ@Ú5˜£‘g‘`¥òc·Ælλ­ÑÍÓ,´ýk»j W‰[WkôY5JšGÀc 8Ì}r‡ˆ:ëà3’Ò`Ç&Ú°±–õ²kjÇNk—m¦)Ä7W ±‘0aNÜ¿ŠV°ŸÚ˞ǼÐïäm™n#¹j .°‘ëàÖå<¨M8Ó y>õ¨ñ9sƒ¾–‘ÁˆUŠÿl÷ŒÈŸQq¡EŽ;¾Øž‘²9j`:BÊpqrây‡Ìƒ¥Ñ ó¡:?è‘è†,ñ¯Snô¹?ã8Žã@Ó}è4g‰xÏÏP0AÛíÞ”»ï]”tqKÞ NÙp³^¤OD‹ÿ^帉KüJă]]ÊZe2Ýß™$£i—Æ€Ú©ïQË>v{ÚÂÁ¼»ærbÝså>9ž_+¸Ž®˜%ë¨Çµ”Yöt¬/W¹°¿ÊM=,¡0æT€ü­:‚X¿õàvðÁÔ¨®ðË•®"sn™®®&æ„¢˜¸BRùîÔmSA4çðš*ž1ØáeÌØ­ºþ*ÕŸƒ+Ù;sÁ-+c{Ýy¤+d`ÎàZ¬zc虣:qóT¯LÅVù?ãÛ¶7¨0(¸-7vtÿ*ëÇJQÂoê>Q ÚQWK°¤G@Û¦ŽV…1v¸õ²]›'ŸÁv#Ô÷P¥‡Í‹ßzàáë÷¤t™—Ù‡²‡ò¢L»Ÿ`3â#Çc¡Ç51ùÜüðžøWM2Ú$ÃŰ#p=j‚¯ïˆ‘ùìÕ+ˆHák .lÔmyÞ§–Yk~¿0r7xÓ¨R 7¿ÁÅv W=~&ÉŸmú~”-˜ù’÷üüª¶°œnשJÅiÇã;ÝߟÞ^_œ><Œ·T›"Çêä EÎhnAŸ7ôŸ~—ͪÊöœ2Þü‹y¹Ñ) /FÏþ%ê\<òRЦ…œ?vøcâ¾Ããï,¼mË›·«\`_üx±h:°¹ºÔ ø$ûh F^¾¼î3¢ oy…¿­vh¦»Ç¸ÖNMÒ¯Áý±g“áþþîä_2 ¨> endstream endobj 3488 0 obj << /Length 1100 /Filter /FlateDecode >> stream xÚíWK“£6¾ûWP“CpÕXƒ ‘Jï8ÚlMf¼•Ãf«"ƒl“ØàH°S“_¿-$d°Y׿QÉ!{¤îV÷×ÝŸšÀÛx÷ÍäëåäfA¨—¢4 o¹öp %Å%$õ–¹÷Æ6}»üþf‘„=QB1ŠC­ÐCSÎç·ZnXó7‹(ò($‘V˜‘(BqèÍB kĨU²Ø )ò&«‹ªœÎâ ð¿2«CƯ®Í{)žÎ¥ŒOiïLSDBçÓçFdàEN“N (k±‘¼9’pڈń¢0bmðZ @„qŒâ{3 4¶0¾rU)1ˆqqûòñîç ÆFO[¥ ŽQŠ™ÑúÌ>ˆµ¢ÌÄlÅ•ÈÍâwÖ}‰ÖìCÕoAÑÂødOo:7ê­}YRÕæuÇŸ…4¯\Ù§yÈÎ «SY1 ã©éÀå¶Q'nTåîÙZÈEYkûÅËl[I{öJÔOB”'þž¸ÂËüL ‹§ZŸlå¼ ku}Á[Åß导gÕþÐÔ-Ì|ç¬WÌ„3Q­~5R_Άy/5´ ò€ŒÈêA-À’Åg/êm•6îç·½t×m¹ ÎþÿôÓI Ø(±ðouÛUÅè àÀ%‡œ@ê.TÌOö¬Œ[@ùNU¶˜"sÅÝ3f6›l뺭…ƒ’~ A ã_F£AÒ ü†L÷Œ˜"1bIrÉRŠ0K;ºêº;“‚Ÿ1†ªüM½uMf2EŠi8ŠPq™®>µÍ¿Ò6®@úA†Á?Ñ6é®qçKÉKž»³4ù~iöt?œyçÕ' þ/j‰+ÅŸ‡BÚ®þZ-Q[K¶˜îÊ\géUeS$›²Ó›Ü-'¿O4'v3+¡QzÙ~òæmàå° uHʼ§VtïE0ÖÒH‡¶ó'?ºIõôÙÆIo0†°Ÿ$ðŒñ…™7‰j!J™cï{!u=Og$fþœ—UYdÓûz¬ 1õç•”ú[ì K¶r·Ó0öaòxV…º}ÄPÿ©èM”ÁÈøO0k¡l~!T&‹CGÛg`þB0¨ð…¥$¸é¦zŠ$8Ñ¤Ž»V3ˆù/ìó.Öv»Q-›ôôó‚oÌ$¦‹ýa'ö0†Ì¯ÚN}Z„ÌÊbʈ¯y¯5"j^ìŽ÷9`Û¢^Mg`¬j ð!pÑUR³—~×醗È×îc?kœã°ÖÝì°§`_»­!\“q h3¹Òй`þ^±ƒÀ×$E”¸¶EÖb?{³0 Ö—o˜ (±á¼V|#FwžÈaÉw‰dýj?2g7i™¯Ð~!„ú¤èl<ììbÍ›mëGÒ'Ü/Ær<¸ÝMÛ¿Ç„shDÛ¹7²§jøqà2/þ²ÔòáõݨBÙìQ–]}ÉÄšÀÀÍ ûEãn|(G¥aCž#@8†<Í-pÆ{rd ù endstream endobj 3497 0 obj << /Length 1345 /Filter /FlateDecode >> stream xÚXKsÛ6¾ûWh&‡R3&—HâЃ›ØvœtÆ–{iz@HHb‡ A:q}w±M*ŒBõ"€Àb±ÏoòVû•·úõê—íÕÛ»8XqÆã ^mw+ßóXÅ«Ä÷YòÕ6_ýå<ôõ»w7ë¿·¿¿½ “uÈc–z!ðÒtÇ‘èÊ3ìßÞEÑˆÚ “T“»!,ú)zófín<Ïy i¬dwhršïš–&Y)”"b>ר&ñ­?ÉäÖˆñt x”}+ºFgišžããúg°â‚eøf3¶Ì'oãá MN)šÏÿȬó¯õ¾7·L÷bÚ}Å‹OÚÿLÃǧûûY>š6XF[÷˲ màÍRî¤èúVªe|[Y7m%Êâ_99pwsÿx;«!°ÎDùCjÃ?kªcßI¶—µde#ò¢ÞOEÛ><ÍyÎ2Y–¬È—ôõÄB³>Ëös£ä2czÙÇ‹± Ä’o¢Ï›D_ºrƒ„Ü'º›vßW²^‡Ó©IÖŽ'qŒŒ|ÈÄOô$q'ižÄCMŽ»¢UÝÚ ÃЦÌ#àZodv 3×Y'“DX.ã̚:?"$!b-[.E:qË2 n¿v­@?sç(Z¨%[EßGÈI™ÓwS¯ƒÔéúú ×¾°æ;{œYéq«¨iÌEw¾Ýfòø‚?†ÏÈÞj.ÈH‚ëµD‘cÅ ‚p$NÎ#æà{Ñ úDp$pF"àLAÊ•fudhZuN“Ölß6ýqV2%·P·ë qžnmì_ä5ÕÁÕ¢Íx–ÇÏè¡][dvøåRH« º(úÌš²¯`¥Fç©© F}F= Ǿ.ŒšÏkð“h aÏ"[I<…âJŠšfÞÅ&0˜¾Xû H .„_ÙšÔÙј‰º© p¡Uʺ¦=Ñ(²¾¼8Û•”9ëÕîz35Ý‹§Ç’DOlíF濦õ4oHK#}ÝtÃ!Z#¶—Þ¢þò¸;4”ÇúΣ†foñ@™`«$õ½TËd‡o›µi‹s=ÓâÄÌKK`šŠ3ªE>ó¼þèQ·£€“c_šPÚµÖ‡… õµ>˜„ùä…ÑPY†¼PÒOJŒ2î´9’ƒ³®xÆûeùrqD­Î6žN›(âö%Š–Ps1Äõª‹ Ð*2š½—;Ñ—Ù¶çÐú`]45íiö°D¹Ú ãò@:`ËçRžoâȘñÎÖ¤Æ#Hïnê•Ñ]'5U]^TÇ}áò|7“‘ÏV˜´‰ÏÉuµÂe±ë¾pZÉvõ‰(È<þ´H‚é/Ô[wkß÷ê7òõüŒ1éâoË…(Uó,CýïV1 sÈR'(”ñ+GH)ðͤ))êp¦áˆ¬êØ~`¢pVÑL~-T§Íi¯ ™àðYùw[©²Y8óâè\Ãÿcc!¾ (g šyjÙÑÇ€;øÐÌÞ‚IŠUäí-m¸æØS5àØ—!¨ášQ§’ð§}!šW¾º©Òç¿VC9úr(2ds0e€0Õ$hEX§£Úu(öÛETMûbÛµ´ ŽÈý™ÇÒ·EdÃY’ÄË‹Èø!uÆw`ßçÆwö…ƒšç¦ ˜ÞüôUÄ#Ò@¿ŒŒÏÿ\óR²—³¯¢Ó‹ík(µ9pY«‘yÑÔ.µ<ÿä0,,rv¶´á¿'šä<À¾Echª šóv{õåCd‹ endstream endobj 3503 0 obj << /Length 985 /Filter /FlateDecode >> stream xÚ­VKoã6¾ûWÞCe bH‘’¥ =¤»NÐ"(¶‰÷ä,1¶¶z­(Õ›ßIÛb,Å[ 0`’óþ†3Cakkaë~òërr}GçVˆBßõ­å‹E0F”ùÖœäÓÐZ&ÖÊv ž­—¿_ßùnO”ºÑ CRè±-îë¨Ú=DUÅiTt*¬=]ß1ÜÓuÊŽ;"U&ž8Ÿ94 öm&JCý´ÂVÝÕöQg} YŒ0ö”Ùœ×[Žžx[GÍ»AuŠ#¥¸øåUÆÅH(æ*ƒÀ˜ÏA‚Ð9üðaæxÛ”ÚÔmqÓe‡`zZ0‰šè/ìáiµÉãg‘GY6…3’=‰ qÁ#Ïí[Ñ­ýñã­"Ôü[›Ö\¨S³/Õ¦s,x#®”øž+ò>ër'ª,mÔ¶lk%Õpq m¾òXïÓ¢) ëýµ=¾”µæíRW‰6@'ˆDeìgG­¢Ý@œ]ŽNø¯+æY&ÔöM)³"ʹ0Å»„®È Ãë÷RëþO~¿œ7Q0r¼Y­¦Ûºl«ézmF¤Èd: à‚¦;ªùÇ‘©ý ÔÁQ7MÎ@ ÅwÏøîHÝŸk¨Ý\´Y#£ë¤F² Abø¼}g.A! ÌF\Ig¥ß•Éb9ù6!rÄãHd®–q>Y­±•Œ#Ö^Šæƒ©9gö™õ4ùstVȹkÎ,€è3b1 #8?4R}ϰà¢0 Çq¨“¶)I‹tË‹„Ï<׎;n™Wri“–ÅxRhIõ?$EÇõ òÈ\øÄE\§ÕÑýù¼5®7CÿQaÇv¤–m­ác;ëCÇv’æ¼à&êÆ›دŠ^ó¤;÷hæ°Ù¿5Š.‡¬­à‰v! WYÙYÙŸY?˜­ ºyዊÓÓQ7‘ÄëPJõœ¤Lš…s7cœ˜Ïˆ-20$¦.:ÆìåŽ+±´¨ÚFm˜ATìÊ6Ky3s >-.^óœ7u«~äAtUx_D´å?þ¾{;feŸæŠ"!£ƒ)t°ÙÀOT­þ®LÔ^æLŽß,B´„F—0äÍ]ò“FÝ•õÛèôÕðÆ¢àôñ3dÇ!,D@1.x¸Êï Cø~¡øŠ%¯öj¨„NeÛ½?ÆŒœBåO/(ýÍ_M‡ÛÏÏÃJ…!èáA¡x½)…ÇòñËbP.]’~24â Õð‰¿Dðd •ÆÍ«ËxO?M—R%ã¸ß–÷YïÀ ýNnð< endstream endobj 3514 0 obj << /Length 1195 /Filter /FlateDecode >> stream xÚVYoÛ8~÷¯Ò‡•€ŠÑAê(°Þ6)ZE6qö¥- Z¦5²ä¥tóïwÈ¡lIQâ9÷ñ =kcyÖÇÙ_‹ÙéyX)I£ ²kË÷<ÒÈŠ}ŸDaj-VÖWûª-?½Ÿ;ߟOÏøÇ¦I¼ti¾À÷ÓÌ3êOÏ©×ãv;v7ˆá0D¡y½i·¢tÂÀnä@|ü êhßÕÄrý„„I‚ŠªåO‘5#îÆI“ óvî¸aÚ×¢­yƒtµt\Ùz–]£ÈõIcžr„mt¨ µí—@ù¶p|{¥Ž¨ÝTx%òü!¶¯÷ÉnSóÝíë½ZÜ 4Xò­¡ª5º2¥éeûµXµY“W%Ñ_íÈ*‡äH㺱Wtðï-’ß!±t‚Ø~@z%Ö¼-ޝáÁß;ñð»îRf×ûB‘}§Ê z“ÐVÎÓÔ–à»:Ëòo^H•€DÖFWÙÔy¹AšBëª#.ÝHíVý_¢Æ/€=R¬xìÂd§ŒõJ4m]BB©íaRÑ&™ý³ëòÌœÿÊ›[¤tg*â£Æ M¤<Ëy‰ŸjJ¶T•»×“¡Ê‡w/²¶à8:ÔcP0e«þº‡‘Š5/GkáNv:N¢iYTØÄg‹Ù¿3˜=Ëß/?û„V¶}ýîY+¸u$Lë—æÜZTÇT-¾ÂºžýýäÊÒ v¸µ|DÔ·(£„¦ñxÁöj±XÕõ»†¹r‚ÈnÕÔ²ÄþT®ÄÎa ÊßC㫳ª4G1,¼€Áˆ2—ÈT G üÿíj­Mj`x:K4Ð99"M˜oâ½Aýê`t„Ìê|×tæ_Û·‡lB$³×\6yÆñƒ›ª†Ýš»º2¢({ÖÏTCÞ9Ðä8‡J@C)ªRšèÁ~ÞtÐç‡-cB=ûÜI¨ÝI¯ºþmx^ÈA§Fè>G¬«Zƒ¬  m@… 4ô‡Díx­¶,¨µ|kNƒý& ë ä°? ¨¾T äÄ;/JI&;™BŸ I‹Ù~n4Œ=÷¦{åÛDa5¾ò :æyêÍÕ´Êb’ÔG7oãƒYXúã:Äß­hn«Õ»)˜8Ò·©~§ÊÓ90! /8þ€&þÄŸ/7“¬ežÉ'ó&ùjqOt_öXÏç×g“ÜÀIÖmiÞ=‘¸QÓp2)Öí«¾ÄâêfdÃÄ_BÛK²S-3ðß±éHׂÃS2áSAžã@N^Ro·±Ìi!iG¡Ó`2póÀ‡EÛk £ç….6ÒO‘¼[èQ:€| µ‡ü?&æ˜öwÂ\wßc=pyñsj\ŸÂ2bés£ðhba'üü„Ö endstream endobj 3526 0 obj << /Length 921 /Filter /FlateDecode >> stream xÚíVKoÛ8¾çWéae`ň"õ*°7HŠA±hÜÓvQ°m³µ$C¢šäßï#¥¦£¶2°—=q8šÎë›Qèm¼Ð{}öjuvqÍR/'y%ÞjíÑ0$Œ'^J)IXî­Jï?¢ÑâßÕ›‹ë$:eiLÂŒƒ!+ô®¯o.—Fî,Ì_\s~ 0žQ/ˆR`2Ôk>}–…þÓ(‚RïæqŒŸD׉ÇE‡¡ÿoßßÞNŠ®¥Ð}+»yÒµ*\É8œ”kåW¢ áˆ^/oï®\é¥A’¬ûºÐª©•sø²>Ÿ|ä«l?5t4VïÞ_M{^ªª#ûVÕÚQ /ãiù11:ì{A—½Ô¢’Ï9ŸŒý›ÒùøLçãtä”%éBçѤ,!IJƒÜ¶ŽóíCÓQ'b$§È~ñ-Þ1<+©·M‰ôºi‘(vÐeCwç‡@ œÄ)»ûqú™“<{¸“}+ô„¡('Y–ýÈN@yN€ã$á‘…6²‰¨ç—NüSàÜ\~œÛÿèÇÐéÇÌŽhž#zÙnúJÖ ùºs&üñyÔÙÆÍHΣÖ=ÚÎþIUtª€1ºgâOpÁ4XhBb–8I˜÷ère~Y*S±ÃÇÅø÷uƒŸÀ-àJ¼ìy²D¸oØ`áT§ijÝ~k{Îfjç ,¢ÔÄ«ÙΖP㹪7xoû=Îv6= ó}í+“ÊÁÖuûæò(ÃESí{-ONà8„f»õ 2Ås(¾\‹~£5ˆY>>ßá7½•ƒ‚†è†1Œ'$ãu<…Ô/än|Àc˜0S¨­„nÕY ¥€­±HYŽI1gÛK¤î•±k¨1Qö¢4žÆ«°•£¦¨»½M½ž†göÌèŽe< ÏßõÏÌrrYœi?»6ؽ4÷¿- {k› )U,¨/Þ‹Âô×—Eûb#‘i3'¶9Å ›½±Õ½„аÔÖ žEÔÜT%ì-òqÅþgQÊqpž÷¸®f‡ü7,;q†y²¨¿•ãpÙ#±‘µð £±e-”ÐãºWz‹ÔVm¶»ÆX¼G€íQBc êö—ÈÚ1H<5ÊÃ={Bq»Ã™ s´5Á*¨hm&˜~«qv–kœ0ʧWúÏÝ h=Og ­'×øA Nù†ôr_bsnÇO.Ô«ÕÙ>ñaÓ endstream endobj 3531 0 obj << /Length 853 /Filter /FlateDecode >> stream xÚÍUMo›@½ûW¬šCA*›]öˆÔƒ['U+«Rcç”DÆë„Æ€ËG£üûβ`ƒƒ’¸JÕ^`YÞÌì̼yKÐ "èÓèÃ|t|&]à@ºÍWˆ‚—È£K ù]ZçU:Ø®oíëù—ã3æu,X ±Oø«±.e4"Mˆö}|ÆyÇÊaž_›9®›ÌçjYEeœ¥8 Õó³Õ“8ðÝ6è2NTZ€]¸¶ÆØÎ‘ùðÖ?MãΡûÜÝ?ÌzøÓ³paå¶C-eSkw$.­;]Oðë3ëÞ ¬bc;z/НãÚ 0ÐòV™EQæqzcÖ {–Ze¹ÚC¥Ús•èçÂxÌÍÀši(ä'v Í{'ß­À—­Pj‰«â€îÍTi"†MóÂt™%zÍ7ÛáœkXiÒÌ׋éÔ¬îãuÓô4+[£¾CãäÐDV*,«\/OäLw³µª#—™yGY²©Je>>›sfÐã´v:ýQðCÝΠ8ö$Š’Ñå5AKø-Ã,ðÑ}L‡öy\ÏÞÍFß éÎy/cJ –œ"áy؃”vs>ÞËWŠž™ Ó6ásÛ•V¥ù"|k§ÊÔ só=‰‹(“8 ÓÒìŒ5< õ<¬Џx"u)@~üCr79’- *hH>QúT›z‡uª×`ê)|Ì|["ÓDm)ôq›a¥V‹&gƳ¡á´ Í·:`Y@;œ©ÒŽXµœiä ‡±Möc²nuõ¤7Ìo#a#Ô½r8:B7•¸(Â5Xƒg´{ &@›+"H¶ø¡¢ôLbaŒa¶I» ´IúèÈ@&jVëÒ|̘y'ª¼Í–'C µ‹Tÿ ꛣ‡hO0`¼j] þ ‹"|0Ñß›—Ö—Aè/•/2P·.x~~qÚKNAR ¼Õ.{ôD :O[ͰadФKu Þ@©¾¿4Ò‚ØÃrw-¬·J?×Û~;ͺ¾ô"ZCÉ GeÐÓŽ…·Õ—· »ìã]×{ìÇñžrãPÎ1Á+ì%,’Ïrq{í¼"ÅJGùéøØ8SU–Ct °jÙõóHdáü ÓÕ endstream endobj 3540 0 obj << /Length 1106 /Filter /FlateDecode >> stream xÚ¥WK›H¾ûW Ÿ°÷Ð4Æ)g+­<ѬǓK­ÚÐÆ½áá…&ÿû­~`†™ÁÚ¸©ªþªê«‡+±ëÑçõèêŽÌ­…¾ë[ë­…Ï·æ#Ÿ„Ö:¶¾Ù.ö&?Ö^Ýùî™(ñ=ä )¡U/Y.EG޹áêÎóÎt¦`[)MÝ9’“êÍâ»3s¤®'Ö„³™–(6ÿ°H|PŸö'ZUô0™ÎÇþ¤_ž–Ë^Ñ”nXZõ~Ú2*ê’UïòµtÉâ:¼ÈQN3ÖÒ§1÷^qRúÉÚ€ÇàýßýJcqKÖs{å~±rSTm(ëÕÓm¯pó¬Bû’碥€?ÎzÝÍ›èôè§÷ „:žö$5Ÿ<çœ8Zø‡†‹2©3àqmQµXÕ}vX& áy¡wΞ/[´Ÿû( ŽT^ä“)!ôÀGßVÊú`«ŸQ ¬Ó¯¬.©@o’ÞXŸb93¯ €L$Ü@FBÝ»W°Í&ØŽå‘g‹Â ;Vê׌‰œ‚^\ ‡HÎËe8Ê{&¨¾6¦Í[T¤u–k|ϰŠKË„™°&,g/ ·+àáòèê¦0<¾ .ƒ{h²® ¬maâ¹×J8ÈxžèÃ%Ï57¼ŠJß(dkn9M7žÉF·¼‘÷Éž‡/÷®)öÁþ=@Ù*òhBgg|Åþ”ƒ§Yq*X¬Ÿ¹Î±w<Ù]¥…´ø¬#–4†xTp‰æ’‡ëËéwÞ¥{ú¥Î$,C²]¶2ès{a8Ê¡¢*hÇU“b+HÝÀ¼Üß'ßG=Å.ôEwöÓ€:gè¾XxÏf4’Ç»“ßöÛ³#(Â"ÓD.rÓT.ç`{š ÎϪQÓÈ~ÊÛ™);9KÑÅ4Qrðý_'Ð;­»…]Ò<.2ýÞcñýxó3Ê„r–Õ#ÈO-Xi‹ü$Jí*ƒá냦&DíÔIkL«ŽM·ßH¨S_lKëTÁízôïƒeÇÂÇÓ rЊ²Ñ·ŽÃGX# ëY‰f–kÃÜ#ðžZ£¿^ÿjm¯ØA¾‡-œÂnøöŠêÏZšP’>vâúv-}žör2ƒ‰«,¨ßQZW‚•zÀoš&E m2{ÃkØšhx­½sz¶t—x°¥›Dß09zö*C}ËRwÓo–¤f gÀĦR]‘¿TyF¢è4£=-o¨àÙZµl+LOêW÷:ô©¢ {sŸ{o¯#|^ú×Áìµj;j¯×1Û—,’COÚ”ãYkN "nж|Œ‡½©ÖO¦‚¥öxõùºÈ·<‘"ˆ}e¥`¿­±©žñ}×)Þ^JÈ»aĸ!nß ¶oW=Õ߉ë‡û×>ÝׂnRÖQg‡?ò$ç[Ñ> stream xÚ­XKsÛ6¾ëWp|"g,ˆàKdfzp§NÒI%=$&!‰)I¨é8ýõÝÅ‚²(+Ž”éE\€‹Å>¾}P¾³r|ç×ÉóÅdö* œŒeI8‹¥Ã}Ÿ…QâÌ9gI˜9‹Âùè^õÍÑþí¥¡û„ÇÝÖ›r·ByŸ¿Ï^…ó)a–°Ôás>à12M|{íìUípOÃ$eiäLƒ9ì…t¦lÊ®«e}+[½.7Þ4ö}÷züñþõës § kÇt®Q…dºüWêãø[©UÕw¥jØF´¢–lG'ùác¢)TÍ´”ÅÜ +‰õ ã43&wBÜŸü˜“S#×M<%,¶ºhW}-/ ÜNü»ÿÜó7Êá)Kx@‚Ôí™w{Åsž°, †p^4Þ4 Å‘Ë&ÿFËZtmytäªö KUêŽ= {Ó”'Œ§œîƒ˜¬Uq¼~//ß^]¾¸@¤.._ž~à + "ºoyü½ /HÝo€SxHüõ]µ¤çV$-;EÏ^[¾%: ‰×²,¤åÕJµe·®™7‚Ä})—¢¯ Ö#gWÏ_¨æ“F«¾ÓCð3SòF®l;yÿÖ æ.é„)Üœƒ°(vÏ@»F[ºn£ŸÍf9€µºë‹R±\Õ³¯øRÞÎ6"Gêo/Ž]±’zV‘ö°w+´Ü[2ôÌÜ-°p,©¹PS«V¥6¨»>2†!›óè»åãÇqœò´±YñõZc‚£GŒ¿ƒÐíÖÖE7öpà5ÚT!ktì­1”®½¡ST[€ÃÔÜ1Ð@1c/={fÖÀÙ©ئ¸Þèæt<ï”Ä£±ücëEá”×Fô mƒž¨5v[JÛŠ¶7Ysa¸&SñøŽ¹ðòH‹#ægÉEýÄø_@ÒEÜÝi ¸Ì•‰Tתª*›m§Ð[ÑjÙH­ivª^ƒ,ûÚ‰!ë‘Æ¬?˜ÅÛR&îoåj*…ÑܽóâNõØñp]IQÕ¡/Ñ6§€t°¢ ÛøÅ¶²˜cög>”˜@<”±CUf·üiÊßn-:ê"Ï1?6Ã’Þ?ŠÖ[o=ð$ ï6壑þδpSl–ƒÒ’”$y´iÂÞ×&MÉD[¬VïVtª=·Å ¡ ¦ÕíÐ k+E7œ×X£ýŸHi(Ž6ò¸/k(UcS*•íÚÖ([˜Âk£22x×+ºD5.“&îó¾"Ã$çN^O>~ö^lX˜¥ÎWÃZ;@há¨X9ï&~w†1£êxŒá>K"î0™…£QõƒhKµçž$†TOùàŸ+úkñà™?Oa¢¡×lÝy1‡⯨‰!Ç…ª7}',†aSY1‚–«òNÚ7îË7f¦Ù$°†1¸ý~cî„¢BÇ`[ žÄü¾gOø?@+³SüO~ö|YÈxÚKê¼-7C-80rŽÐ¸?rþ…ãH+6z”q¡»ì›eŠª¤r2&äÎL:ÑXÜ ÑÑ0m¥yRRØ“õ{ ŒONÔGNÖ»hÄ:‹šáTR©Ü朾 Ñ K2Æ~8þóÿcþ‡bY¨íkut§äÛN‰XlN@A¯Çð64äi˜Èc3,®¦EEE¾-=°g"OIQ\ïîîÈAEµJáLa† rͣ쪴ÅOi‹°‘pj>pèÉ"<| …Û9BÀi¼HÝØZT¯‡æ$41aè3ÚDLI¶ÂNE¦Ñ>Ö ª?ÕG„'| Z¢5C¿8AÉ‚(Ö6õ8ƒ‡?ájÙIr=« endstream endobj 3554 0 obj << /Length 1184 /Filter /FlateDecode >> stream xÚWKsÛ6¾ëWp|"gB˜߇œ&î$uÜÔVNI&‘„ Vñ¿ï = Ӯ싈Ç.v¿}+pVNàü1{;Ÿ]^G™S"¥©3_:a(N, Iμr¾º4L½ïó—×)="JÒ0‡‡4ÑÝØ~¿†’m<Ÿæ.W³Àz?Ÿýœ…° œp/#ÍbRD¹S6³¯ß§‚Ë\¹³Õ¤ƒYÁºvîgïß;ýj q| $ H‡Nšd$SG¶Ž¶z€,±x))òpÌ£©;¶ž%¹«ù½$t'üâ;Óðℤ4{ <„Lø# BÓzLJ²)ºÖ‚q€cû4wü0AÈ}íåÀ)5»…+;ø…+*Þz4s¥X>àòeæò^ŽýÝZákÍ¢íZßxüˆÊ ]s¿º»½Âÿµéù0ˆv…û’×õ`X3iÞ-KàíFÔÃ\/»^ál>¬HŒ7Dµ›ša¹²çL6 D;\êçÚJ(´jÏ®y#à´dµâŠ-LÓ w˾2#MI^d(þËÀV|Òþýa‡¦í£ ü$Fªˆ#m·ø‡—òeˆ¯Ø00pXîoø¹ø|7{1I<Ô´iAtÍIÅ$›æ¨Ù‚+Oó¬x˧©[IÊ4"-k¸Ít;‚…oŸäiŒi~h‚þ] ˆ–Tœ(l5“IqŠÜßÿÒ³Ö…˜~ÂTÝjY¹†@_wueq„NË’÷¤‹: &¡þËûE7Ø6º¾º¹?íëM-$YØÚß~¹¹™¤^Š–“¦«Î}}OO&#d„ròãûiCmz¹ òasâí?ÿºÐÔþqHŽðټ̑îª_ªDTçòóù¼Ä„;éVaÍRht×&®Z,BÔÀ$u53,ñ«#—÷|ì™$'[Úøæu?LIÇ™~¾J@®já:]çAú8˜z© «^4Vç>h+¾Q\ê¢x¾²ô¨Ð¼VUUP¬WººÔ¹åLˆž­OÃ%;(QvõØÿn…\{²~¥ZÄ­ª?HÂД5ܪ½\a»Žž­÷ï'nC…°®‚1Ö}{¯?öd»µB¬ ä+´¶KùÙjßž(xVH‡Eì.°ãf]¯g †pçÒ—£²ÌÙ˜îøÏQ \ §=³˜àèñB¦Ô5íK™yV¬çx[)ÜïÍp#X]? ‰™«vr0§à®;-ÉÜ€¡¦zß0¨EÆÄG9cDøT(M|Õ«¢†ž6ä³mûI´¢1õ)-¦Í«.”yÕW ‚ØôÕNÅ„úê¸Æü¥À‹ìù1 Ÿ–x¶ä[O‰¸ížX óhÃZS´À¢Gãšöiž¨j.V­¶ìtç±ËÌÖh¦Ö¦²Àj×C`Y=æ-ðœfÆ8.r‚ÄHB‘ñAä„^·ŸÕ?ƒ—gÇ~FzM±MÇ»¾¤Û5„¹^í" ¢ºÑhÕáã\ÀóÝ?ŒÎ0³–ÕƒPž„Y0°:k& CÙ#“£ü³ûº•Ñj endstream endobj 3561 0 obj << /Length 1890 /Filter /FlateDecode >> stream xÚ­XYÛ6~ß_¡·Ê@¤•DZ Ín‚mšÍvã4’  eÚf£Ã¥=þ}g8”Vö*κè“Èá5ÇÇ™ò¬µåY¯N~›Ÿœ¾Œ+s³8ˆ­ùÊò=Ïeal%¾ïÆ,³æKë£}ÝUoê†WêböyþûéK–ŒV°,vSÁ~znà'8éÄ3GôßÓ—a8Zå°$ÕËœ tSZZÔëUî¶›F¨M],w¶Ù;4‰Ý, ,ÇÜ,òiù²”íÌaQl·Bµ²Z›NMßµ¨„¢æíFÎ|;Ÿ‰½! œ8 Rûötcß®+sœrƒ#¢ákaF¹9¦\™æßÎ UÖí¥üä1&QåpgE¤è'/òÀVGå¼ÐñgN¥öbæà9­ÖÏ¢¢‘v#°‘ÙýXj×$X7u·UÔ®W4;E¡Ü™“¾}&V¼+Zf¢çµ.ª¼ÐUzîÇÃaŒÙjKjŠ¥"A·¥¯V’±Ð^uUÞʺzFòE×R#ç5J©MÕ¦þ•l늣»áßEÏÿÐ ­Z]ÙŠÆ­ºò ¸1X½„ÉÁàø?‰v#~«º)yQÊ»ó7$Àý9¦¨¸ÂoÓUØÿš•9 64°YkèeM'©þ„Ö©ÅyÞ5GXm‚t#šE­ÄÓ>“j[pÔíÞ„C(ØVG ûÈÖ]Ü?ýìR´|É[ŽGà§¢++ƒÙnH*î ÂY íÈ–ý‚j)1§ˆqZØâM¹Ç%paÌ´‚+…w0Ìu¼H*+gä5+ 3΂ùÌžo¤Iý·œÔØM'5Ôé”Xîó<¯»ñ:8ˆ9W}âôé n»fAOÜFiîÛc'0Ê ÷ÛA#9ýEÍÉÇ#k%+á–õòl}Øè”@¦ÒnÄfZÓß: ¥¯é;¿FÕߟ?£îÙ9~Ó>W£HûM¯æ9Îݘ 8ܬöa6Iuè©y+Á;~|ˆ[ óy‘wouôÏ)†âõõås’+±åDqO#¼2+ t“ë¢ßOjZ\£š(F3QPH]?ÌÁÊöúQ1ó|“e½`3z\åucf`"C‘¸ÑŤ¹§®A L ÝiSÙLu arAN¥úöäßµ' JPº3·à Q¨'—ýàqNa£œÂ†œÚkÐÿõ×a„¡‹3ú‘äÇ£ ŽÑ|Û´ ·½ßqA.å ÂÄáþÕ bF†^\_¼»º¦öD¸QLÉ¢›k£HC¶iôàÎPÍ€tŒ õq¦ 7Ž*Ò‰0 èúNš"þú­K´0ôÆËBòX¹Ahˆä_³ ’^щïPÄÏù)(”º,5ôðZ€ñ}ñ}'º†÷åìŒ"ûp (ðA DƒŽˆ Ýl]+ˆò‘w°ÀWC1 Õ²Ú[„X£!BÊô-øhSUQ·êç}T}äiCfìØâ ¥²ÈJ7ÓY/&Š^ju3ñJ‡ëYO€GŠBQoA¢}Aþ">–ª©Nj°Wôc’šfÜ×oŸiT9±ç&l?÷ì#´—)¢Á«ÚðÀª®œïœÀô —W‹\õCµa}RÃòhj¶©VèT†¹‡âã ´†áèÖODÉ]”|t$¼ ŠC1óýÈ’¬Ú«¢^ðb¤Î^Ù(€dô„G Ͼ¼û/´/çÚ=‡ÌëµÙÍj_¾ÎÀ´úÌwo€Þ•~( ÇRçž”AjÃø¡$¶Š„ƒDœ=,)e%¨Kô™ÙœºT§P ͯßRý0‚ æ&ð%/ÍFµÙˆ8ˆÞ-Jdæj“GLS ‚.ú¼Z‹žXAHkÓy;pÆLö7HöíeØ$À¡Mß(ÑV Œ-Ös“Rј_=7z|  ÇbÓ r‡€ùD Ä3KÜ öÇsw“D3‹Þ At¥D˜€Àóܹ'¹I1¦,ºDËש—Ÿ¿éÙÐðÔ¢ÉP9¨¥^ìæóìdó“nôùüäÛ‰y–?üÔ`à3ØÏÊË“Ÿ=k ƒPö\–¥Ö­žZZ!ì„ø7£°Þüù¨Fyã?';ÁR‡¾Å¼K§þœŒÜG;KϤþÊërÛµúe‘Ú°|!W›ù@Å~R$½ Ï ÖÒY ‹ï“aÞÄ/¡ *ã™Zu&TÞÈmÿX9¶–˜,¾5(2(ð‡ òB_Yý¶0°;õ L@׺»KM¯©Ë½¼{["ø_gø [ |ýE é%äz£é¯ÑŽ7fM^—“T £eª7¤È?]·ç•¾“ü]2æFïñ>éËüJ{Ä“ÌéD D*DäÁ¥V¦Õÿ4Ð_è3¿~ÞWŒéú¼Ywø8‡dÓªƒ:ÿ@WM£žÌžÏï¶PÕP!#7òîxÞ^«§ŸiŠ›lÿó©ñÿý£æªë1éyHÿ¿½’Ð endstream endobj 3470 0 obj << /Type /ObjStm /N 100 /First 975 /Length 1441 /Filter /FlateDecode >> stream xÚÍX]o[7 }÷¯Ðãö¢+‘"%A~ Û€ (’4啎DŠ<¤(sÑRࢊâÿÊ!Kq!òÂWÉÙG$Ñ €J"Ð ¥¹PƒX_Ô‚–4@A›ï×(ÔÅ”#_ÕRÈI]g+!gë(¢âJZ†ÔªK5dÆRX€Ùb}­Á:®U…ÐC†í”Ì%,UÉŽÍ•|;à ªöí°¢å¾’•¾¢JÅgÍ ¹ I)Pæ†3˜@‚ì§%êÀroÀ( 0¬¯À˜Xu +´°K˜UX«5¹Ň*$Ô6ªHPÛª/ÈÀY6Ÿ…ãM]­[›Ünì¾0%c+òãJ†ãÈ+³Œãj‚á yXr† ß³øz¡ä»»2w¸Ä#"Ö €¤ÜǰgU‡–5écØÏ’@øcâ[q %I›À¼ŠˆëeЈ’›‚!*}ˆ!™oÇ`³›‡öð k(¥Ÿ¥Ô®Â@´n-ì)ZÈU@ªÅÇ@ðÌÏ] ¬1”5ªo ç#ú¾q2Ó¾q_s_ÂfrRƒ8{wfIuBÎ çqaa[øHJ?6N,¥[2$g-¾ƒ¸ã ŠYlŒÙêI!`­T¸VÁPPÕ ¸HZ7]» ''a8…ƒY}Ù)‚Ñì~S¸²!î?>èþþEŽ.¦°áðúf~}>½ —axýê4 ÓÏ·áA×ÅßM1qõn:^BïtvûÉ+Cñõ“álúi~ws=íc´ûiúöýÕ‹ùçp™‚;Å« ½¢«¬öºe àóÙlŽÝ.•Ëíy¤¶&ÃùÝo·ýûÇ÷³?'ËùÍÛéMß<½¾~^^æþáö\ã$”$f¤ e‚Ø‘pLÅ B(2À=ïþ;Ãwó‹y€ÿ¿9û}_½ÿx6}{wý­;æÞ’šº³™J%z]‰ÌøKQã"#!‚Æ© Ù9-b‰&k± ?Á¿Ê­q…ŠË€3¯³qgþ5^ç_Ë{ð¯-nºCQšÜkTôBÀÉà|™B1©lEÄ}-áˆzšOQ‘©dñÏ ~TzÚ’?®?Ü}º]KˆF[$Ä2øX’bEEÞ³°1>Ê!yÕ6ðJ·ãÕÊÑë6~ªë~â ÙGA—óãä>š_‹Æý+®Ì=ËÌÒÍ6œz#¬÷é|Œdu* å»QÅt ª,ƒ¿8-}LRG¢3J7û%àªËàVov»ÕÛë+û}y8PAϹF\µª)Zñ‹E<‡üÉ€+Øž¬¢§7ï¦ñ|zwsµVKý¥2:ð+à‡µ\9EoŽd$º ¹H¬GAsS÷ÚqШ(Þ‘ŽDçSÞ¡ü,7ÖÿÒò¢ç–¼Þs{Ê !~\p$oÑÔ®€ÿ›w›ÐxçÅF6AܾýÁ\"ÉW&‰c}Íxâ1¸C¹þ?)JºNQ*»S”d Š.ƒ܆†Û¯”C6‡¸å8op”íî(N[8jüV¢éQÀR£ª| èÒb ÆS úï‘{öGOµJ¸’ÖyÄmÙ6<² >FM³ª#Ñd¸¥“]üÇŸÑ蔣%Ú³P¬x)ö»xý•á¿aîà²Å+cüp飢òÆöqšµD4nÇA'‰©ñH4‰¡eÏcѹÄjí ¿»‚²¡”=z@Ù¦”'~ªÌÜŽƒÆk‚²ŽD :$%‰fJ±–¯î‡MÑ Œm T׬Û4ºé„[ËÆ2º Í”£Ô|4U¿¾—èðˆ:’L endstream endobj 3570 0 obj << /Length 727 /Filter /FlateDecode >> stream xÚíVMOÛ0¾÷WXpX"cÇŽc#íЄÐÔÑrbhrS²¥I–²þû9qZj>&íÀa'Û¯Ÿ÷ãyýØ wσOÓÁñˆ„@@Á|¦ €‚„2b `:7޹{;½81JB òu tU§ãÓaƒ .üùtðk€õ¼ÌÂR„A´ÜÜ"0×›@o ZèP<¤DÏ0|ÝÆ{:¶åSº[>FQ XÀu2òlešJÐsó¡àxKÅõ™S§®G8âÜ °#c:Í–í:KUZÓ°qIe².ã²ÍdçNôuÁÁÝpD–#b8„¦ä3UFEœWq–öˆ>î3æ-r=ŸGš¡é—žpg/UZê¨2‰+×çÎÚ 5¯£&t=Љ3r9q²¢sR•Œ“²‹8Ó#w²º2ë²Ê´³vi„É$ªÙ–ßrYÈ¥r±S©BÂÎQCKSñtDÀLÙ¥RF˜}0ˆÙfs~•N4n"–Þë0$|‡]ÀÝŽ{:äZVžÏ »[q]Ê;emö~óûõí7_×÷ (›ýPQuäzB„PÛð†·O ÀÆáðÐ ÎÔBÖIebÆ¥ªî³ù‰­]‰Úݦ"Ò!:m Øuî¶dYʵIñÑ _®//­Ð4Ê2@V\¡V0d:^NέèßÝWp¶†+Yô|¦W×çV}¬T1ËJõ xSµÖz óF.=|Øñ %«ºP6òáÍ­ù©ú½<Ÿ~?°úhÏaý„õíg”çEöûm½ÑòjÍžE¯è®/53_dÝ™D‰VJ÷¹½7– ܾ±,—î>ÂÃVoûq|BáKa> stream xÚWKoã6¾çW9I@¬è-«À²Á¦Ø"X‰ÓºEAËt¬®,¹"•Ç¿ß)‹®Ò•>ˆ¢gFß|œýÙÓÌŸýzöqyvy“†³ÜËÓ0-7³À÷½(NgYxi”Ï–ëÙŸÎ}Wß]_¹-»¼‰²t”§ÞÂÀ–’ ƒ…Î|mþò&ŽÒó(]x‹x63Ø‹H‡ ÁÞÜyâûÎz|y¼½½@;`c0ò$!Ñ g²k¹˜&]ï [2ñGåZþìí f‰Þ\Ý>|•~áåÓVz«7–ÎòþñH%%•gÞ®Á lP¯ËðömYKK!ø%—7¤ŒèDï9¼î Y6µW³ ëˆ8ÿÒ7n×ùÝõß磎 Î×^wäyŽÚ÷^Mw &òd¾¨ØSð6ô¼n˜9oôŠG-Jt¥pó²~¢÷¶« ySŸÌ¶*“±.ݲÈ*úð—n‡Ìk<­íÅݵ°Ù/šÝ¾“Üb;r„lZN‚Þð3>‚IMÀšoXWIý'†)j“]üˆ}óQDè‚þ‚(¢…>™‰·ÿ)xUÑ_¯´ñÄký׎ɶ|õÜyœÆÎF©Ä`“%¬j\=‘¢¢ m¶-ÀeU[J} :&ô‡açUKs£gœ3véŸÌì<¨ª² ø‰& ¬ø0¦ÖkˆrA¬LN õžÝ$qX[²ºÐ;*þÐ+ÐЖÞî®ñ™ª{qUúh ²˜a#|W 3`få*¾V윇,¡³¡ùÇO§…md·ÊÉäÞAÓ3¼R[}ð²ÙÓ]3ÕN*EÉ$×¹øRÊ-­¶ÀÎeÕ ÅrÇvÓèl—æ#˜î§&ç°ÇO÷ôZ·ÙÞv}à$¢œ„)ö‚ñ)âǨæA1¢Õÿ· öÀ%ñºf5Æ®¢öäø±§”ÉÜÂyðZ€šªðqâ´}'%s¸›:ßT½a>_àNîÊ^”_ý(FA¢º"¦Pç[jX°F~2‡o¨ò¥ÿ!þ jbÊÓ‘ìì‘e8Ð ¬±qL©¤Ž´”“yí'¹É”>p<ÜEæ0z´Ðùš­û9ŒºóŠê>‹…ÁìÆ0* ®ªhòÕ¹J\Ünè‡Ú|Uݰ‹7Z©ž16<7:…B d1óŽÐNž€öû¶yÎÑ£0• F™âP¸ÐUL'”úÔaUÇÍbßSAÒˆRöGorKÀ–ñZB£ã‡YêÔ3ïo[“ý¹QÎÜÑ¢ !PA:hÕðBã, Má £…óyCæ“èR7”NLãR“"´MS ìvHÛØ)«, “H3 MsUéÃR½a²á¢× ‘Ó> stream xÚÍVQOÛ0~ﯰàa‰DŒí8N2i›€ TM-O M&qÛŒ$e‰Ëè~ýÎq( 06xéãÏwßÝ}qJÐôyôi:Ú?òCãX0¦3D Á>(¤ ?FÓ;Œ÷bz²$Xê‡ ó@@ tº*'ãɱŽHÿp:ú9¢àD7¡E`N(JŠÑùA)lž ØŠ#ô«ˆCöûàçh2úº‰÷Ð6ü9ïò§ N‘"Hæ?N Š zçŽ#º)ÆeÂY•®ç‘3Y]»uTu“ÕÊx©}>6¾ÔªÔf:UÈRg‰Ý=.Su›•ó&ëp#¸À Ø¿ ¶`200ACLH`é¨:©²k-Ë^Ñ÷Å÷‡!F0Ìû~¹ ¡8c˜SC<µHížihã|#1íK->Í\ꪬ!¿Ì3í²ÐY[p¥ÒUÒðj–ƒ‘/;xiM¢òÜ3?vyeª*U‰°ëqÆ» Ct-e6Åd5Ì#äΪ‰o<½´6‘×zU)»ÖäY©dÕâ*YÖ³eUHKØ<[άmiË«6º^Hm½BÞfEöˆ©v/Ó­“ªöH£LÖ}6z¡zôÛQγ·9(ßï6Â,m# P¦Ni¼Ûwµ§ÏŒ˜ LÂö•>«å\ jc[+ýl[+íðÉòò‡Jôžë„8ãFmIÌÇ1¥öÈî®…¨™\åÚ.&¾µ…Ò‹eú~¨TͶ!å÷!wN˺–k›ãƒ5_ÎÆãAhÙƒd´Q2¾Rý¸;†å÷½!5Î+y½ø;7ªº\Â…ÓOOÏÁµR)^=@s6ˆ…Ñ4½>7³þ˜¬¯ˆu’šÜ~)âÞåÊqn.×w­@»²âÝÛ÷c3ªí8 P$|*ŒG9mƯ$œ™’æF©ŸA‹'³àËL<"³WPÙD§ ÍqЧ…Äð/ÆÿßB/Z𖄖˵ªúS©¥»õÙLSè“Ö endstream endobj 3594 0 obj << /Length 934 /Filter /FlateDecode >> stream xÚ­VKoœ0¾çW äP‚ÃÃxáÐCª&QªUÙM/MUyw½ZVؤʿï˜1,PÔ²UO˜ñÌx¾o¶gí,Ϻ;û°<»ºe•„ÌZn-ßóHH™5ó}ÂÂÄZn¬/öc•/æ‹{çëòÓÕm8먇 #±‚³Z1|­tæÿW·”v´ÝÅ$¦–Ì@¢Í«(W…Žyžý?Ëǧ›Kí ¼¸IE¨,…Øj MƒQ]BH-v“ú°ÞÞ³ùM’Ä÷Q~q.!~÷B½\o‹ëŒK‰d°¤ËOI4ó2Þ¡JJ’¸UXˆªäjÄQ8ŽÿäÇõiB@ÒeÒؼÛîbõ]¬Õ(]€‰¿õx}xšÏGU·‚«ªò/Ú µóžZäº,ŦZ«´ÈIÎ÷ýôžËL¦ç±ú!ú±Ÿk&¾[íJ~x™†ôÿ'›^œs¯—ó:*:°Ö».wÕ^äNØJöúnøTvø¤‰‹bи½6Ÿ1¨Û )ÈkÈh†`™=bܯUcíú û½9ñ<ƒ3ˆ5Îúèƒî@×·…ãÛ-¢¶*pëþqþá—i™­øôÐün#LŽî¡®×š-~¯ÁÌì7ü­G'Æc¢Þ‹Hóþ—UŽŠüT"óé.bT<ÃCª½fÔÄRö!41S{ ûC­UäÝ,)_ƒB¥ <ßàBª¢§âéwôdl› D‚YŽFvÙVºÓRfÿÐу_ âRK["2±NŸ½j‰ªêEàBªkMÖÌ[ ¬¯Uóò£°Qß:"­:24ÚÈ‘4=ýäÉ%‹m2[w8õy0®LÿÈê€èÊ×´®4 nŸ˜Îf~Níc*ïœ tH¾;…“Á0ž|ôB(SÁ¦+¡’‹½!G{s\J©VSmçê‹W?ÓÌ4V^¨Æ¨ïœˆ£½k'ã¸ÕåÝÞÐaÀ°O!µÇ>¡iqC³ih}¿Å­æÌ÷x/ÖJ:k¬©tTÀ!ÒJjzFJ›ˆxu¢ÈæeÊW™‘_õ_aÆ‘± f¤BQDääæÈø4ãdúæ¦úÚ©xœsfNwGúé{ðÒùǧ£ÇÙf&ÇØ«!¡B÷åðÙI˜Í³JŒ¾a ^ 2•›L™',^^ú9ásÀ´„z16™?·æÙºÊø1þúº0WGšìZ¬æ\™j4ö›åÙ/Y&ø endstream endobj 3600 0 obj << /Length 839 /Filter /FlateDecode >> stream xÚÕVMoÔ0½ï¯°à@"c;‰“ q(EBUd+€›x»¡Ùd‰³-å×3öd·¾ˆËz<ϼy~±—‘3ÂÈÓÙÃùìÞa˜ŒfRH2_Î #IΩ 32/ÉkOá¿?»w(Å^h(% e‰\ÐËM“?t`glÈÿd>û0ã`2Âw©eÓˆqR¬f¯ß2RÂâ3KYJ.]èŠDP=‰B°k’Ï^ìò}9:üQ´Ÿ3*#NdœB±ðëР™x´OÐ,å»f|!½MãaœzùfíÇÜÓÝEe´µJô?益¨ÜšªÑõ¨]Á\x-l…>÷œÑÛÕÄ;ðEì5ª¾2•q`¦ù‰$ÐÔOðƒ<°‰s”<¡ŒÅØÕcmŠ®Z÷ÀÛçâš“±Rð”Fñ5ÐGÆ<Cšyx D:S¢ÓòìŒ7,f¹m<`sô–ÕJ7¨ºê}Ø|…þN—›Âsv©ÁîÂf©À2[RKŒ:Ý&¸ÆTèºìNÏ}‡¯Ñ5µC—P—Å;Êmé…·ÁFÀÓ·è)Ôºßt }µEÓhÕá´ïTcm·RÛ¸w¹¬ _$Þ§+õ±ZUŸ´ÊõC½RÛFO7¥nŠ«!_;@XêêáϪ ×TŠÒd¿e;=·U]Ë€‘úAÆ†@œ[‡ÑÈÑ8ëÔz‰¦2vL]åm¶@œ÷öZ´Çç?¬o7Öòcm५>Nµ²PEßvÕ'GÅKf¤ãÀŠPHÊ’á.:1êLOª÷¦šÇ7ÃM5ç(MÖž¾×E×bÆ> stream xÚXÝo›HÏ_a¥Rذ°|¥êƒsJªFi9nz=6xmÓb@,´Jÿú›ÝY°q¹îëafv>3ØmfîìíÙõòìò6ôf IB/œ-×3êºÄgá,¢”„~2[®fY‹¶xzüsnÿ½¼»¼õ£v? Iìú L3zž¯˜Î\£ÿò–±nÇc³™ãE@óQ曨ŸK)l'p]ë >–‹7JhqÀ’$Y ±"í7óFysþ"êã¹Ly.ÈŠ7ü|T„¢ÉN¢í¼ûì´“ñ|’PŠôW¯Pù“Ïh¶å ÏëÒæ\JŒ_˜†›2D´‹ßÈ2#IÜ3<‰¶æÍˆ"/!qÿJCYB€2pÊd|sµo#~—Ï_DÚŒ† |â/ƒ?|¸¿²†Èº¼ik!ÿ‡Û(.ªtȸ£|µXµi“•)øNåºJÿ#Ë{©¯bhþ9ãŸq¡MÍ«í4ë§UtxzEO)OȺ;Èz å00í6¯7íN¶ïY4ëñó¨~”"ªì .ŽÚ}Q¥ëu59/lÇ÷}CkDxX®FÚ¡Üɘx¡ñÔ‹•§úîJu¡C-aSk¥HÌjJcV³Uh¡ŽºƒmäVFކû.î¯çÓ-´ÊdÛt9k»ÖøœƒÛ‹¬ü©ñXŸ2cã³¶XdÅ×m6—ÅÉqÖý7ÙØ¥«øñ/~hw*æÆžzèØ-‡OË]Õ6bhß’MY dTàðdœ&+±æmÞt…’ƒC˜ìé*ƒ‚’ ¦}eU÷Õ„ê5´¾*+A/„åBQKV4ûìúL Hd…ªÃƒljLœUè"K¬1‡\ºšŠ/¼Ð“FY¤XG £·c§àRÛaŒ©”` G‚{r#LNè[DUu#` i2ÙV€ú[Öë–‘“RÞ¡òdÛ!!<ðÒF¥zkê´)+™gôÀ­ µf.w“F+Àý4«T%¨Ÿª½5SYˆn0½ªðüÅýHÍä€\Z3Ùò<û¡ã«,‰<üÔk@j®š^/>êP‹ t¬ì_tOÙ>k0®84FŠìÅàõŽÙºÌWRãNd=*cyÓˆzB"-7E¦›ux.¥˜×»6ÇÌÓ×pcj‹Ô¢uEý r"jÀ‚D ÕÕFs\üüÝyÄ£¾ÓÊ슺„º4¼üB*Þ€n’G\üªgi_°û^ÓÍòì_Û¨-² endstream endobj 3619 0 obj << /Length 840 /Filter /FlateDecode >> stream xÚíVßoÔ8~ß¿Â*8RcìøG$^N´ „*®]ž!oânsl’;âøïolg·š«ÝI<ð”±g<žï›Ï³KÑQôbõÇzõäœç¨$¥ÊZ_#F)áB¡œ1¢x‰Ö5z‡³L$Ö¯žœ«ì(”+E¸*!Qº»õÕÅ™\Ñ)ÿÙzõyÅÀ¤ˆR«\AªÚÕ»Õà|…ÀUèKm‘€ÛsÁÁÞ¡«ÕŸ‡|ß~CýB×Ï(Q‚!% ¸Œÿ{iFÎÎe¤,ØL’)*–JeDõÜØjhn]Ów3.î8™k¡@)+ˆw4˜<B<›Á¬=Üඦ³Wï—d9þ݃©Ç*Ü–û¯5;S9SÇÕµÑnŒ%I*Ã/µ®¹1Þ฿=Jq=e»ÎÓÍäÔ@IŸRªXv¨!Þ%pÝ õÛ[]™è{O%mˆ eàHÒ¬€ŽA‹Ý°w€ü4†¦ê[ÈV›N2¿[ÈØpォOâ¶û" ¥†¥5nVóÔ©€’s¼5]àE‰Ï“BÄôpøºœnv6®õªÍq?º¸¶®•d»V¥wÕ¸Ó›°q«Ýg{7¬1ñ©Ï^5Rì_Ç›¡éœÏúÆ·ñÀL:¹ y¶'SÆc}¦¼äD楙"4ŸÍ[«·fQš÷¥:ö÷¥êëóí7Öž¤B|¯ö”gœ”ŒÅ#Å+¿@ËM_GûÚÓîj§í„&ßñø€æ0>/p(ŽçK«ažü½(+IQåI™( ìÌôr„7`óáüIM<,¨ 0é¯à³ø¹xûúõb(è£&£5³h¶êlgÈ1‹SôÉ¥÷œœ.½UxžÄ´3?‘-æ?ÌòÉÌ«?ñ¯ôãÉâ)P@ØN(ú%¤ñ¼i/=²…TÄ!ÙÃâ ÊÿKuTfç§Ì÷¨Ú7dOåOËHý„ŒäoÑ=Ö-¥3“Kd&òü÷€ùÿ”qïç þþ/Ô endstream endobj 3630 0 obj << /Length 1651 /Filter /FlateDecode >> stream xÚµXÝoÛ6Ï_a´&-‘ṵ́‡´k¶lE0¤.ö° ƒl1¶VY2ôQÄûëwÇ#eIUR;Àžt"ÇûüÝIÎl3sf?_¼]^,®>‹Yð`¶|˜¹ŽÃ„ÌB×eˆgËtö§u×Ë·ïç-]\‹°Ç.â€EŽaŠ‘s™.-qíy=n[„‘b·y‹‚½~=·}DZ> zîd³-S¢ÊŠˆužÔ5)Ä}}]ù¡køžX·z,Ž:†²­’fBYEÏɱ]/f°bƒkb߸æÞñ<¢ØÅ¥\ý#×Íµí ·*™¶ë&+ 2òGz¼Ú¯“W“ük™çõ€÷öÓ‡CÖ€XÓl7ät/ýI™2iÚJ~K¬æ®¥LY[Ë¡èIÖ¦.$ëÓ˜w‡;Ó‚ÖLîVrx‚?aaÝ$ÅîHš*{*[gÁØÀš0,-Áv}æªôpÚ¥ÆZ¡µ¶¸µ‡ºÇtk5%­•ÍVVDîæ®…)6·áLªÏ$Åè@c#|)r ’<§,Û]Y7Ç­r·+‹ü0Ζôd5=÷êVYísù˜5¨õÁÄõ4i“Ãé^ºU™«ó@O0ç¡u ×fk"g(¯sAOý©Ÿz¯ÚB‹-Îs‡ '[qQ*wt!ž&J¾Òw«mTŠ3¢o´½TÞŠL)ôRÛT”ÚÞZv.½KÎ MÄΨKexýz§¤g;·]«–ÃÅu¹Û·ÉhŒ+<ëjîºÜú2÷}+Éòd•}vIRÉ˱ݢ§{Ä‚ Fóž»Îsæ*ÊX{ïpg²íº~ktãÄøÀ¡7;AO{9·=Ðý“ò‡ãjÓnÝ(z}Ÿ¬qá³²£ß&U!kû—¶¡÷l•ið$¡>‹ëªlP¸jrcæ@_C´“ʇ¤Í›©ªî»Ð&‡Ø®äŽÿ^ßP O a‹`–z‘sN^DBy‰ëë%f› ¸†iBÆcéáÞMÒœÁ{h•¹ò˜½JjÃaJé·jY9O€óÜx4ô€«½(´~ËÛ b5Ò’ëRÝJz}([l$×M²²,rf8O“w_79_° ìÆÏmÓìëËÅb“5ÛvÅ †t?ܼ ]͉Á$®Åvniÿ~Õ[!À> Üæ‡•“‘a‰ð¸À³²¨Á¿IŽ €WÑzÓ—à Ó$¡Âiµ®7äS[ãxšjÑO]:‚3™Mu·ëy7Wò1ÁÒyc€³éƒ“g‰VÂÐC¤ºÇn<h‡#ÖÉøQx¾Ua~KÈïn²†ÏÀ ôÐmD£¼üM^[g÷Žðð@M¬„8@Ô0UªÖôJ%¬‹åˆKKÛCEäÐY§G]Ò\7.hê5Ô–çyO¡A9èt–«Áó)L ûhBÝ´ÃùD7MÏÉBæÅî0åéääèü±ÍLouS£Ï•J&ÝëÞá_Ý¿z©«Ó¦5süE–úz©Ö] jÞ¦o›žh›²bßêé£û¨:wŽ:~¾H]˜Ò‡á‡HHñ‚VÐÇ’m Û|WX¿¿»zCGoÞ])÷*&e&,’™¾IhÜÙê3Žù“´'?. ‚úS'\wvüžpç3NÁI‘G± Œã1§é—¨"¡p©²ÛB-Õ¹v¥`OíjYZPC+~JÛŒ< kLhË (ý“NÍ)÷Ñ "(„jD†Iè˜æ¶ w«æ^Ç€µCß6¨Ì-h㲬#Ž@àt@ðÃÚpŽÿj¼ÐÖShÃYÜñ(lëÆÜ£à´Á‰]Z s8þbjJ‚x–Åó &3~ÿ|;sllñÝcþxÞ”?^¨T«iM÷_ Ô”£!^›ì‹ê4zÝ(Aoæ?ÒYI’j1ú²4i’ëÄ_U»æË3ë¦Ûü<`ä“¿C^Øv£¸ÿ' _QúÍñºF i¨{-Aìhfb(ëìx>+F<Ý/Ó|—V´ŸƒƒÙS?ŸÌW®é{Þdß3Ï÷Ë‹ÿó >Ë endstream endobj 3638 0 obj << /Length 1143 /Filter /FlateDecode >> stream xÚ•Vßo›:~Ï_º"56` ÒzÕuÒÔM»m*MÚ¦É'ñ-`fCÚþ÷÷“´Néš=ù×9>ßù|ηöïãäŸÅd~&^†2J¨·Xy8PQ/ÁÑ0ó…÷Ý'„N.>Í/)yfR‚¢,†‹z£ë®¾ý|þÕN‚áþ‹Éï †iàáýÕ4‰&™—W“ï?¯€ÃOe©wß›V^Ñ“(„yéÝLþÝßw8öø£è9~ aÆ Ê’ìuhLìø”¥xŸÌ”P¿«§³0Ný½ïx:Q‚’þM:v0B;Å JIlA\p+Ñ´BÖô§ܧK½N%dŸµžÎH’øí†› dR‹•T•ÝýÌ̪,ìê¼i”œ’ÔëCöÛ¬οÂé,¦þ<:ýÄaFlw QñZƒ+í†âE—ïRØ3à"‹©…ØòÜ„ÜÔâwÇÑtE‘¿˜¦¡±Âûª‚øõÚÖ ûÜŸí^­«Xƒ*ÞndñþÄ,f%gª>±Ž.Y8CqLvž§6Ì£A#;»¨Ì¢Ó­…ò##eĵnYYÚ“žÝä>bŸëŒ• )Ú˜[¢É,Á~Ãz î¦qì³µ¹) z^9Z#1P¾l,u¨XJÂ]h Šð9¶ðÒ‹^§ˆPº»Á<âñ‚·L”Ú"´HÈSèCÌt‡û9ì–ðð©?ì®ddé€âLÓÌ¥cÃ?³Õ’¾]÷0½þxØÞ'ûœ7mÛè³ù|-ÚM·D¹¬æe•‹ºæzn2?hx7ù8CQ°¿Ê$NCÿ²/>e°‡>³C%·3QÛ±àM»¦BçÖBGreG[Æ›ÁtfÀiŒhB]L·å¦Q³ §àª|4µÞ¯o§Ø7â NíŽæÜNlOg©®¾‰­Ýk åž{e×KnˆQœD‡ì2õ ¶Hªõœ-õ§AÐ ö“ðgvÉ»¶~ŸKÞ, Rh`5¦ØZÞjSPcj÷RýÜvØ©_èh¾é$¹4¢ÆAà#„zµÔˆ„(B¿{g-.øŠuek7¡­ªœ9"¿ˆÔL¡k²C0â½×GtÇm¬÷v81·þ:9N¦5s­¿Ü^]½ ’/uj;5æqy~uóaÔ噸ºit÷²=u©QÍÅz³”J;.apõŠ=´x#k^·®¹e Ð(‘»hr ŸþÞÈ|£ã¨—UhU¤XË> stream xÚÅV]o›0}ϯ@éÃZi8‡=dZSiʪ©Iž¶irà†°‚A6´Ú¿ŸùH7&aR¥>ìs¿÷ž 6bw£Ï«ÑdîÙF€ÏöŒÕÖ°0FÄñŒ©e!Æ*2~\?Tlýmöýæ×êëdN¦GpxÈÇD:k€¶=­A#ÜùŸÌçm’©ßÀM"-¿5ººº1]Œ¯—¤}fPîò¨}ßæ¼} S*D›€çk9ÈZû>´%ªƒÿ¸ã´ØiüØ…§çܘ–ã Ç ä‹…×U¨ù‰]\Û4x¢BòÍËÍ5V¯dMôo[à§öq¿^,T¨×B«Œ蘚Î`\_˜)PÎÆÚ …yVä X)K{¡ÅË< ÕaÎ9¤´LòÞ PäáN €õš\#NKP ,måYÂP”ˆRõˆÖ¹(8Ðèœ×È¡¨R! B¢äÀâr7ÀˆA,Ix$hV¤pZ«/™^øÆl3°žó‰X­r>[,oõ”D¨j¢ÎÙ¯Ÿ#1,ç˜80—ýþŸ€oòWɯÖ·Zf8DUXw)zu®Æõ”þÖ7/B¨965Ã+ÛÚÛØDŠÖ;hÖ=$ñn#½žº’:ê»ÖyÙrä`Ò+[{yjR~!0Ë#H»SIÐ ïAÄ*9q:õ–4øþõ–48o)ÞQ’‰a{`UmÉ"¤ú†Ü-+'$nVÚ èé¾ù[Z¥å¬¾xéÒÕ  ×D†Í`X"ÍUç㈖¯Y¸¸ñ¤þ{D]ißa9qdë,úeL–ÜͤúHÏÊ{›,zª´ë··àÁ ذ€ÿzûçíjôPê endstream endobj 3651 0 obj << /Length 1563 /Filter /FlateDecode >> stream xÚµXQoÛ6~ϯ0ú$5kI”,ØC¶5E‹tRçiÝmÑ6‰2(Énþýîx”e©JjØKDïÈûŽ÷Ý‘™O¶“ùäãͯ˛wwáb’²4âÉr3ñçsòx²ð}‡éd™Mþò‚ ™þ½üüî.ÎTÃ8`<`!«ôÐèÇ/·¢âÍÜ­ÿîŽó3‹Yr…Ád,@’aµ7RdÓY4Ÿ{¿ÐÇ‹ËÀ3p#"§(kVîY¡¾3#jU^`’—k‘³u©µ\×ê êç¾Ñý¨•‘û&¯T©YU©·õî‚­´Ü‚SÉ*Qìs‰.ÊžY4Ø,&;ÑSúãñ~ܧÕejͱ¬Yµí‡óîöþë‡B*3ÖT}Gy0¾v!k£Öìé˜U?q¦…¦·M. 3{¶)¬ê ½Ê¤® ±¿B›å¢XeýP/koŒX÷t!é_Ö>„j§6õÀd<Ò¬ÊAD—F#ddÖ@bB¦iQômÞ4‚7/ägkõ$Ÿ/Ë Æ˜ÏRK¼ÞÜ·yä¿ùüœ­~b‰ê§éÝšmSH= ¯®z<~¼Ç…ü„% ´ •«€ŽƒJÑ+C‹˜¥IЖ–[=…Ò‚ Œ½ã~™qÖ3?f<ìá¿p?4H¨Ýz/*ùžœú^†"îÕ¥óªÞICC`Ȥ`—9;¡ö#þ¬<öüöÇÎúb™XÂDûóÈ3'ïi9”ÆÞb„u“Ð{‹’ª±õ_®Õ·yÈÑ "U@I¨‰Joi ,<‰ìhÙè5þ]ÑŠ†&@—úhjwQ܆Ɇ!€…çl%ÍãˆÐQ„©ƒª6Ê8ÈK¼Nâá7“Ð’r2€y8 â„ ŠÎ1r?ñ>i’o¥–fÜÑšNÜ&œ{TÝ&lµ+›Ü]LËM-u—êö°½xÎ9:Dç%<ô¢9»º«hx•ûRK]_•ÃΙÁ-±Ü´}ÞÍW@1Ù÷Rž'uv ÇT—ìÚÛ#½…/wœôßÃÑ…IËÄ ø‰ "ïÙ±+ÕÚý¶AÁmmeŽ]0²(í¬¨lj¢0SU-t»€ÒãIbã„Ø7¶Ä¥=̳(õniö¨2I“D(£dÝ^9CÇKP#ç*ú!Œ39þ‹ç™¤ë¶ØgoÝ,½‘RºO&ÊŒ?ÆñI¢Û³Û4zÝ]'Ötyàí“„~à³­ÕŽ yÙÞhIÂ=å*û®UqIÒòâó§%¾²ÓÛÃÁæ½WŽ`£oâË›š•å› endstream endobj 3657 0 obj << /Length 2515 /Filter /FlateDecode >> stream xÚí]Ü6î=¿b=ÀŽãï÷ÐÍ!‡äP¤›»‡¶8hmíŒ='ËÙn~}ù%gÖiwÞ‹Ö%Q$ER$'ºÙÝD7ÿ|õýÝ«×oŠä¦ë")nînâ( Ó¬¸)ã8,Òú殽ù9ø0õß÷ãæ×»½~“–‹åi]„U”1Z˜$5.z }ÿ}ý&Ë»¶iYѶmR2åÍ}¨C³Ï(\œWa]%þ¸½Þl“¬ úMRÓÿߦ ´å‰á¿Î*Ó›~Ç#½‰ƒ#­èƒá\^:ðWá  ¦Í6FÜ×ò¬é倣3óe&í¼ÓÊ¢E†t7/¶ø;’ŽsvFu³ã‘Ü603êü¶çÆx±cåÌÐ_!Œhò`ú°5£»F2¦: š¼×Ù¡ÌÞ»œÙíi¾{‰R³(%‰RžD¼' W#„HVÚáþ"K$æ@nØ®YËNÃÉ=%*gwL’í=÷îˆcðô àsu#ˆ~v."•ßľKÛ?£ˆºGÙqŒ:¶æ~rès+<>îM‡[‹šMÿ¦j NËH8EodfuR 9|ÁvÕíkÜþ ø¿b&›˜# „W¤Ô4€ž,ùžC§#®aæèœq+.`õNÙV tK–ˆì-äúDÅCüú ãè}'Ö| aL*Dç0¸´{«ú€QEñòÔ PùõF?‚!©öJ×Mª(Ð5Sˆ|æóF^@Ž ²€ôháºãô‘,žŒ§ãAÅ$Eð¶çY0pÚezòeFÒ 4{*zኵÚi K½^O Êj0žOd_tÍÖÙöuÓMyÚ³ È”^D_3_ã ¯# Ó:‘ëÐ.ŽáÁüŽ!ÞÚ¿¾Ü_ç1ïËΨ­8gGQ]nÀ‚‰îq¦¢äaú‚þð„ZÀ§€÷L=)AÕ· ˆÚŽxùóôÈ_Ò SŽó3 !} ì[ñ¥‰OqUüž A3â̵`ŒŒ?18šÃ±3ñSøèSî"§*ù‡Ï®î×i­ÆÏÓ,#nZßh›)Èë‰8ò£M°WÝj?2äeJ’TÁѲ|-Ä ™Úöƒ=È1w~Ý)=Ya’Ò‹Dƒ £²ê€îÀC2ûý0uœ ¦Iìmúlàð¦O¶‚;!ì0@ö€@Fß"”“F“è,sJ¢™™˜wÆ‹T*‰EHoUÛ“•pçµ àÔŸŒè–ýO^ ‰‹ À1}ù ôHñÖ5ªÆ;Ž˜õ ]7+_^te‰@OQѸ§k—n7Ë’3#ÇqCÂzºx+O-@Š €–Ìœ­P½y:A ÿ™èa ±Y"›,TiÜåiIN­‚‹k8Ý`ÂJø;é1]j) úÁ1 ¼¦HC]f—Y‡˜´5l4Œò%\ÏDÈ7—$¼¤/³~@E±Ï‚ŽS‡„CÈut¿ã\éEÆ//ßQsÞðçÁøìB.—T’é@ÔCÎå0pfÉ“£‚ðOW¥œ:ÁJ 5‡1ÂÏ àþ•R"ÂRb5þ/ë‹m§Á6Uæ“· Ì["Â|GY©>_ˆâ¨„¯w6=w‹9¿›¯Wã„Oär-¹—\¬?Ï Y[>M£|”Uu}ŒR:d /-ûžG¹„Yíwà™%$ùŒÃÌéŽQ½/ã œqÇ¡ÜW(£Y£Â0JîKq<ü¯.Óšl~¨(ÃÀŠý½ûÉ„²HÜœ )®0ã¤ô(÷vs³Dœðã÷d´€\KX P7T¾äKû ±xÏ-¢æ…SËZ™1Í0:Z v#7vËÊ1¾VÊ¥'ÓHÈ»¶ðP/¯9ÞsÔKÒEÏfƒyjš5ŒŸó›‘Ç‹r¼c—N|”KÒ¯ô§²˜[G°€ZGqp;ïe§\䪅p5ZR@90a&7¿ôH0VÖÏuJËã{äNÖ`¥ƒ©WͲ¯—…\»Éü¸ Õ°Êœä~Ø#yðOp¬)Ÿ7XQKIš¡ÝXª–~7±å^KFQò*©ö7ßðyU߸Á^ßOºÿÛ(þ6ŠËH1=.wW4)~ÒŽ»ügÄã2Œó¹ÉT¿ùf:¨#Õ¿jtÿÃ3ˆÕ°Àw>þ@Åðó_ â4ã2óľ•wUû×þÂêÆ"¯ ~x&k’„qUÏì#&`’†I–ûÕsKÔ'„)Œ2Ýø§ÚMÊ(,³ôÜç€é6Äé*õnSx&,ÔéÏÍj6XDPc…UAI«¼t·øªÍÅyUrŸ›¼·kÊõ=ð7K„œ*i!`É ¢—tŸ眙Žìw¾¤öúÞ°†<º ?=¶Wü°ó¦û%8U”Ê¢" þ9¿Ê·v¶8õ©{Tˆø°è¨FÁ¿Õ<#åI)¼a\*Áý'þHŽðÔxm…ŽçnïšæfãzoúOú} èñ“ñAbtªo¸™™q|LS%T›ø´|/ dÔ§5Þ†7\”Ð7Ú^\w'aTÉnªßM²¡=†À¹~Qÿþ¼òØSS5’¤¾Ü4È0°òoNr #g‹˜2AHóý0\-œœ‘”;øW Äïýë)ç2ÚÒõå§2e:£GXÓàí©­ý¯EA}’§( ؃áO[2¡”“?\ÂÛ0åù‡‹"¿lÜåsãîaŠª.Å|jo— K³ Vl]2#ôõŠÅ׋²ôÖu²Î›ö]sÛ¿ºÂS‰¡%N``Wõiu短»[ ¬ÓùÍ´ö>…•g“¼•¦bÁÆgìƒìÈþ°l'Þd­ô¤êrQÞãa$_Õíœ'p{!»Èµý÷‡»W¨i endstream endobj 3663 0 obj << /Length 2087 /Filter /FlateDecode >> stream xÚ¥YmoÛ6þÞ_a´*±*‰’,uØ€¬/k‹4 Út°cÓ6W½x””6ýõ»ãm)U²¸ýdòxäïå¹£LÖ“`ò˽ŸÏï=z.æ“ÜÏÓ(œ¯&aø"N'ó0ôS‘OΗ“?½HÓ¿Î_=zžF=V‘F~œ'pezÓUï^Ÿ!ã½€Ïw¿žÇqoçLıÝ:‹æ@tÀRUM)·ƒ®i7Oý<‹œÄß7ªÝ(3Eiìµ5ývb†x®n§ÑÜ»šÉn]ªje^«–´\_LgIâý3…žš†Þ¢Õ—ÈÌ»ëÕþ¼^&<Ÿ(çÓ Ä™JWkf­PwÐnÆË“„´l7º™Î„¼zÛjà™‰(÷ÖªRF¶Š—$“U‰¢A#T`¹´Gãú'¸§"{/¤xãÌ[È‚èžzw¤Û ªEݙ٘nrV"´æ"r¢i²¨Q…lÓ'Ýn˜}S7̤+GR4¨^ëÊjËÍV.Àª ŒDZw†¶—F–ªU¦È„ûÀϧ1=Yp3¨FÚ6ó!é'6jÉãD¡À†S,ÓMèvëaJ¡ƒŒ—Ú¦)O8Ž$MWµqôýup¾(øªˆ Hû¢Líó­j[ÂÊ$eTÄQßéÉœpÈx £ú·Ýá2²`磘ÏtcqÂ8Ô=áÌU¨¯€°X£_6%ÃÔSå’Òƒ…vЦç‹üoK••DüöDIÖ·™HrLt-úuC Ã\AŠ XBñÐ@¶TEb¸¤Ø¬ãïƒ$`„n  QUѾ€˜0ŒF‚5„Í!bg²«`0düMúѽ2㲋]Õ+ÉÐ9`J=sÚdä{É”s' ­gšvÌùxÃJÑŒ\‹ç|@C±þ°Ò30’F7™ V°Ø—”ç0ãâ(®GÊSËŽwMww iÊ òÑÅ¢s3•ƒnÁƒØKìµ?D‚²¨Å=:–q@¨§½P¿”Æo6zÕ~O¼Ñ ÞaÚ+ 8m[,ÔUòb)‹‚†M+tXžåÒ†P ¨ œ§`@Xg´¬£¾°!%dІa-’K­ihÃ2slï2çE×ÞÙJ§˜ŽAîÐ?´ÚÛ>¬Èí\I]Θ–.®†­MÃšÒ J‘w–E;îJe4]Ì&XïB{ €¸2uɹ§/5ßf=I?Î Ò6d]9»%ÆÍÍ) "ÃÃ#òR™ ìZïŠO† j+ÚÉŠu¿s8¸ @ æü´lî®Î1ç³¶8$ÍUŠbÕuç”Õ¥¦ûª†Sy—òõJ0Å» ddëZ`lzÆ]6‡<çöí^‚ñTR³mË??ð’„x@ tµíZ"­”l;è Ž°^…\ p¡¶í¶å^ÑSv }$æþ<ÙiâŽ!ÎÊqä‹lî5«pú,trr«D2÷Ã(F‚Q€Ù-·ë›I„ñÞL6MCÑ;Ò®cq;{rLkö…Ä—O޹²… !¿œ‘°rl@á:ÆdìÑön4QQò¡QÓ·þÝLòÒ61רöG ö‚DbÍaT3…ßãÈÞ]À‡Ü{áv†ÆCØSrɇ0öš.3,ä%áN€Ü)scÙØMT|¢^¬£[ù Oë–XII`CuPê)H}wrÂ.ŽÚ˜ÉÖ?Œ…y”ùY;³¹ô¼fÛ(òó-X]Ó:9›I›ÓwñHПƒ¤áw†rE{nðïÿÆÚÈíæîQq -C"0P¦ßJìp1vJ ï«OZwÁ÷ªò+þª~¬œÕºÖ›]S:¾néC•fë6E}@›fûêH¤´ÍŽm¿ÈàwÛaÁ€¹l%Ñ,¸à€zÚˆmÃ×áÎ?ÉïÊ"÷³$tŒ˜>aÔ¹WÑâ5üº|Á1çËíÕ-Ê#?ŽÄ àýÍÞvžkZîè ÏTš}á¥×B<@vüŠS-mCLÏ€~9á­Ýé¢fÿŒb#ý«å1ÅB”øT6«áoÓœÞù7|Í~2ÎÀ,™-‹ô!XŸ*.òv}ì¢{¬J]íž/²ÉÜÊ~¡OyÒ•Ìë—A]úy£Vð섾ù–›¼^¼¬*ê&òÄ;Áßlî½@ÿHè'à•i—Rï•]¢Ï yXiõ’&¯%Ί%ÍŽ·[c?Þ|ÖåAgøœs_·Jy«O1( \Œ~jvÑñÆËÍÍÐý[{«ÙÖèA£fAäÃÛ)J™; ÂìVû²¼gŸe¹-n°îè¿–Æ;kÏ}‘‡tÖƒpë  º‡À³Ç»KpIþ;3KáýíE¹ø`Ÿ÷m-áݳŒªøìüÞaSrD endstream endobj 3670 0 obj << /Length 938 /Filter /FlateDecode >> stream xÚVKoÛ8¾ûWÙCe bH‘zíÁ»IŠ› Û8{i‹B–˜X ÉòŠÒ&ý÷;äP²”¨ˆÛ‹I“óøf曩sïPçýâ÷õâô"ô„$¡:ë;‡QJ¸ˆ1òÄYçÎg÷&­ö¥¼½ü°üºþxzÁ£‘OBS挨ϙZPëáôB'éPhiG±÷ü9*ý¶ôJÝOÝ7·—«kÜUé7µ½º+Õâ6Àåú¥=‚7Q’ó~SeßT•–%нõ'ÚüÐzó̬±w¸´^ãA^Tj"ÁÞ Ëæ\Ú0®ËÚm¤êÊvÞYQi¹ca42ï²¶è³ð &£Ô²˜“˜±¾¯Pd’}AD> stream xÚÕYÛn7}×Wð1}(—ä ‡d`p’º šm ?ÈŠê¨u$C–‹ôï{†r]ÓÕ*”V¸ÔÙ¹ñÌ IQ6ÎP”hXð,¦}.&8g|2¡dãKÆ×LFð@9’¼aò:†S!õ0`£0ˆF<«¼lDT€)«†TLÎ:ƒ¢¼)© ãW‰™ŒÇ?µƒñá „çˆQd“\À@͉°Í«TXæ)×9ͤºsÁ¨ª*ð(õ³@f¬Ê`Œ—ª¬@Y"UQ "Sƒä\í-\‚JF€|I*¹h”T@@ü‚Wâ¼ þ$'h†ò¤#D¯õ0bØE뽎ðCFÉÀŪ6c¤‰w&$_U`.•ì!¹è‚‰Šwjr·ËXñï+ÎáÃ'Õæ!*hXƒ ”Uo€PFXªtNª"hhT’„J‡:Gs1Ò/b€ ]¸J Ѱ&Vˆ3eU«º‹¯*’aG:Gd8T)¤JúAì«”Œ‘¨xøÂXkèÀ"rªá#°4+;‚$a‰ àwa<so¡'νeFª/Â#Ñø ¬q¾°6ÎWƒñ.»ªV0Šê.ò!ƨFq£šÌÑÄäT  °Ô8P¬FòJu’aAÉj^ÃjªPV| „" ºjùAš;"Á@º~ ‡0¯’A*‘ª k…ùŠKµ^¼‘Tµd’‰zGG½æ¥9¯ËåÌ©i~ýíwd’³ÄÊE²šEã»ëë‹Þ³gŸGûT¬.Úúd2ž™£#ÓœÀÚÓüµ¬T†EóD2#}îÂý¼ñw}‚ÀæÍt28Î̹iÞ¼<1ÍÛáÇ™yÐõöŸ›!¾è_ {Í èŽg·Zª­½ætx;¹›†·óÚRç~¾õŸO>šsin¤. ¨?ÅÛ ” \ò½|ò½”êz lcÙ¨²(IÑÊc`)[çøÐ!ÛÒÖl4Ëh[x³D•%-ñf‘*«,B1§{`wåu%é΢”v`Ñ"ø!l!ZmµíÐèWÖ¡Ä|±äìÈÌëÌ¡{ 3íÈEðÿ¥ØÞØ­)sàèmÉ» ŒN`Ñ8™¾N«4wÑüмj^àçÀ 5`ÓC.6¡þy_lÀÖ§2ë¡1°Á%àÎî.gÙ¼ÿjŽŽª†æx0MÆÍYóËé+ý{òn2zêÅ!Vš?íM6˜\A‚Në|üö-¬ íZçÊøS b›pÞh‡Æ‰È:j‹öIlYµä –/ëäñi7ò,ùžwY„ܺíÝV&½¥`m{¡õ&©W V˜{QoEö©\$bõž„˜­ÏzýAÖéýêBI¥}åz?›ÝÜ>mš«ÑìýÝ¥L>4?^ß] §¯û—Íɫٷg?·P½v-°(«G¬àÀ"_¯g§FâG3³².ì°!Y?PÔ«—?Tñ@&Ïw·{0týh«wZJüCã^ õLVo5ÏëM›‹è„ÙÄ„[â^Kýa0‡·Í݇þMwvöL%pÝ;±Þà¡_ºLŒØt gúqô·L¯šþåmã3èãôžu•˜´ÃíÁx±™ÊУ  9ùúÐ{¹¶NF›’> stream xÚµTMsÛ6½ëWp’ 8c"ð£3=¨ã¸“Œ'ÓÖò)É"! -Eº$%Çùõ]¤lHŒ­LÒ ‰·»ïí.–뀿Ï~[ÌÞ\±4ÈqžÄI°X”Ìx¤”â„åÁ¢ >¢˜ÅáçÅû7WIüÊ’ Ó$GtSÈJ]Ê^èŒ Þ.fÿÎ(,I@Γ4Á4A±}üL‚.ßp•gÁ½…nñSÎ`]7³?þŽÿVçOP‚NƒD䘊x '÷j^×ÍûºT_<† Jxæ1Î3zP†aÄD†ú]¤hÆ_î\­zÍ.»¾iUyÄÅc d"*pBGÉäí|˜ØòÀ*Œ(jÜúa¼ûf8»ou¯ŽˆrsûÍÇÁa„¤‚þ¿ƒ€ ð§ÏM©f@ Šd5 Y—nØcU÷ªõ&D†JÙÓ‘&]øñœbž&?g2pÊ0‹ü£“Áä¨)ñ(< øØáf¥d¿kGœ®Ýßå ¶9É€‚Tô8Œ8gèÝÊ]îC!lµ\VæÚúÈá`°½kmÓïu©Jß=&€ëpßàV­!|wáŒM“º`F3èŒ y¹N“ó-¸éL Žw²ªìghðcC@®¥®»Þm”, “Û ’/¼>àcÝ9xêvU¯ëõak ÔnÕ™d—塊Î?<¦ÇÔ«Ÿ3ð~Þ_ËÉüÅã×ðŽΩ³yýÚ!.ÕJB6Üæ†¹ÿVõ›¦üeJ®Ë /æ—qä0QáÇ~4~u¿·×דè½ßDçU²‡çŽMkŸgÐÝUºÇˇÐC¶M©*¼ë”UéZÉöÕdãÝV{Wóë›·“è²Á¶Ý<øâ¯Ûo¢‹aº·žñV~ñà”L‚—USüƒ;ýU¡ ™N®LUÙšYcÏŽØeVí²éÎ =m£‰Æ›ýäÁhÿ6!¿! endstream endobj 3693 0 obj << /Length 473 /Filter /FlateDecode >> stream xÚÕ–AOÛ0Çïýiyµãĉ;0N›ºÖpÚ88‰ Ùœf²]ûôsŠjX†„:N¶ìßÿÙ/ïý“`t‰0ú0yWL¦3#œÅ KD0š0”ŒrTÔèÛñ¢J¾Vœ\Ÿ¦3ší(gcêÂy4¦tMðÝ ÓY’ìÐÍrGÔ-’¼žD)ÆÇ Ú­´W]ÝÏ—î'•Æô`|÷Æ$4#Û õHpj<¿>Z©E©ägaus3qÈ\æOÄ‹HÎ!æÄMð4}ð”¾ãoT^AC¨+ÈʾñÛ8ÜZJa×Zš>Ý·ýðå|>iÖÓufs`@_ÏÏc;º’+—ù8ÜG†VÜ8Áƒ0øåh ]÷(ÈVSWq²‡ŠŸ#nâÄŽÂÙÓ…NHR¾—BßÑ×B°hyé4#»C ëÊ õƳ£N1¿Tc¡¼G·]-¬MØ}ªYI¡%†uÛ‚Ùé|ñh¿¾@w³gtw©ºê'˜æ·|@ãa¾mVî2Jùšyq £é®¥.;32áÿÞr ¹ÖÂyŽCžçñ·²GË ÿÂe´sç«6{ùOÉë1 Ívÿ¿³ÏŠÉ]yKh endstream endobj 3698 0 obj << /Length 2009 /Filter /FlateDecode >> stream xÚ¥XIoÛF¾ûWèf ˆhî’Ž.b.š°öÐô0"Gk.*9ôÒ_ß· EÉL 5 ÙÞ̼õ{oèM6oòóÅOW·á|²t—IL×ßóÜ0J&sßw“p9yÌ&:AMÿzüåê6 ¤a²pýdÑCª ýQ…¤žÜpuyƒ=3»iÌa2ä­×ͦ+u5 Ç´Û[8.r»˜Ìü¥Å >¨^ý­SsÄÀ|óÄ].Ëóu5…aû¦³8qF6\7“Ý3îzKŸÏp]÷Œ EÒ`’ÒÝ;ÕBÏwôÔw2œŠS [f«î–ÚlaöeíÙ,®µ2]£ÛÓùü}ºÐF-××knû“hT©’»{–[ô‚«…)çŽÑ;EQä|ÔkÕ†Ér9áyÇŽjrµ*ôá îiRFn0ËϪi]S»ÞÀöSdù»´ÛIbˉï ˄łÖJƒº3ÜùêÅÞ®ÑÏyݵÅÏʈ}]kо´9vòŠéîùÄÏS|ÐQÞ‹LÎB¿ÎP`Á¸ŒcfT•»B|ùt']k©9‰nRËE™ƒRÎvøÙûxþŽ×ܼšF1´ñÀ3ö*Dn;#|·Ûº+Äï! Áe4ȇŠBüë•©÷Ú\s®lí®È»z;]°ßÀÑáB/â@€l› fȰHX3–Є®uàrÃ- 1Pb 4/ì—×ÊÎEN¦¿zaTåՆǛ¦îv£¾Á$ƒxM5h0vP¡¢\5À!†öC\õcwö⯙ä@A 7ô|K²³.áç.& ª”»÷ï1K2™â{vnô9fm½¼¬Á‹ ´›ßÇÄ V’#/(ëLn×êÓÝà Ï"o‰ÆÃ¦Èæ´jxX @ë‚ǵÌo ãUäÿêÌž0²ýž§`h¶ÎÛ¶® f"Tz£LþŒÖ†VyUzD™«Èë;X¸#Q™×xÉPçóÎÀ åUÕÙ%3zÉ#d+#8V †Wsqà;—C†/eRUÙw sw ’ ëååÙA †s»2?Ýx÷=þÌ! +n?¹“Ö]+ó˜pÅÅš ä- £¼ë·Sß÷ë_nxž:Ö Ø'ƒÎ1©³åamƒ¨·ˆUgF±½3u ¦…$JùñQ Ô1ŽFÎã=òùåFéÚ„õ=réƒ$;Ðò UDl©¹µÔÙÈj—²ýé&øc«÷M_1 zRP*œÈ9-º»ÿ‡/H~Pxü c”A©‚‘ùc‹tå–êõt¶>)L{‰ïô•DÑiž!&¡m4TKèÌI N“xb}ÆCëÌà[ÙŸõ^ rh}OÈ´1¹­Ü¸µd©¢¥ÿÝê|*ô—ÀWÖ¥šû¬8è` !Ùµ<¤$í ¨ < V†ç }ˆ°¢hÀ^wÄ$ )çú„ÇØp2m„¶-!ŠÆ¸¤@ïJü_Iµ;b@kÍ]›8cÈ·w4r‡ÌI¹wQ9'ñaÐ2 â ­uvHÌCSÕÕLÐc Çûøþpìcuuìï «¢NŸÜ’ÓéÚƒcä%m…^,y¦FU h{¢ìm³èÕtá (9M­âiT“$€Ýå®3ÊPÉ2wUÚhÅ ¢9 J¼¤È–HL ¥Â™7´RI£¯á¸Ûq ¬¥]¡$KÒyèØQÔ.ÀÊ2βé ù|]Ž&麰OëÖœüðI‚ÈæøÊe…JŸ¬xòãGL·¼ƒûÚ•b‡VyÕÚ÷ÙËÔ† ¹¡ªl/à‡ß»ø‚…ƒªTü8ƒÔ#—±]æh—¹óÄ[úŠ]-8bß¡EÎwûgݬêsªÀ9T­ì)¢yéìšzðÄY)á|mó-‰€Ð¹ééÅ«! Îæ]µ­:ÿ3x\Ã¨í·£œlóúñç›eÄL@Y¾Œ"‹ï+ðo°Ó¯Y3šI ˆZ}Á¾§Òº‘Z²dm™†p×׈Æ]•Ú5‹¡ï ‰PÎÁ.ÀØŽ"gÔM©›âמäþЇJnÜ¿ÔÇbká—mNX²íEž­©)IE¾ä˜ßHÉ^ñ:ôC² ´è ÉsžñIÞ»„SœP"LÏö\2^vt0”g*ZþÚ0"È#}{à\Tª'y\p®Ò<]K"$}oerÿ‚à±Õ0[áÎÅ`€ÚåŽR9œÊ߽踭þfÂ|CÔyWe²µ¶L”¬,f{$¬kKÞì/;øf$äˆúpeÏ„•F”I‚ıYàpŒ—`»¯Ñqô’ü¤ÝBž$¶´aß„1Á-(ë\4Í ðŒ°® m·2J-sñþdÂ*©ÔFxù ” l5–øoXýàý¶Rèí•‚[$yÓn©RQs~³ÀìKN_vÞSo¥ƒ'¿âC¦`‹f!X™lö:‘­×X½Æ°Ÿå[ÄvˆcàôÞBôJ‡™Ñi~¨5lùÔ•TrCÞ0ek pU“ñB¦ŸseÀd_¾eè<ûrïøMȘ†½°â÷¹ì’´SûiÙ¦ðöÂTe¿­Ð÷ç—^Ú£à~óxñ©–>ñ endstream endobj 3705 0 obj << /Length 740 /Filter /FlateDecode >> stream xÚÅVM›0½ó+,õPŠ×ÆàãVm¶ZU•ª¤{Ùî!K ¡‚8¢üýØ$°»A=ìÉxfÞ{žCÐtç|^873 …• $Z¤ˆ‚—(¤K¦Ðb…Ýy¼Ì“™1w׺¬¼§ÅýÍŒ…=?¦$Žƒ¨­GÀD³É!6Ñ×…óס`D9dH0¡Å…óøDÐ >Þ#ø¤"th·ˆŒ7as4w~ã¯-ÎûD(Á’S$ÅTöyœ8ÝA1ð °ŠhGæ.©=Ÿ‰ÈÍŠå:iÌЭbOP™/i/è8W¦0¥'p5œÈÈá;$–Ô—¤ŠËlWgz;àtâ68(!?€DŠ÷É1v$fb`¦ý€ñ›HL`Il¤_U` Â%¤áQuÄå1ý&‚èç?I\ò|Aˆ‹1†w´É±ü€aE[‹:=¹U;Ý9¥ÙjgËÜ>n²2©¬ë<\„´1?|0»æÌ¬ERoôÊÕ¥1â|YY…¤”Ç"<–ÑG+bŸ:ï×ÙCVeû⎄‚ê‰Ä«‘|*æÐ>”‘ÿ'å{ÐÞö[%}[®÷E²õXàÖÕ«¥ýFIg3gЗ¡M‚ŽêíÖ´Ÿ~ÌÒmÛµ6ëºkÛ~¯z>Œ¤Ø£nÛ²ðŽ»i©‹³´Cýl^Ÿ* ˜ì Ð¨V£ j4jìšÂ, @Yn]o’Ò˜mQy>ø­ªÉ›æ¾ã|׿ÑV³tŸçÆ‚Ö×ù¾C5y3ùŒ’“±uÓæz|³Îc¼IØlg·£ïz`ß²õfEgÛîˆÉ2™É{=–ﺩ±Ã˜2|Îy{+nPô[üÁSîñ}2éòo´©NÍÚ›‘A"ø) eǬsâVíîîº~ ò«“è2×€¡d˜¨#°¯¦š–¶/-óç¶±¬òq™,ëdeY½aNášá¡£ÞLên2_Ђ¿ªX•œé endstream endobj 3719 0 obj << /Length 1234 /Filter /FlateDecode >> stream xÚÅWKsÛ6¾ëWp’CÉ™! $;ÓƒkÇñd¦®¥6‡$˜‚$6|¨|Ôi}X"-Ž$÷â ñZ,öûv±XzÖÖò¬_?¯ïoid%$á·VË÷¬-|èz–?œÄ£ˆx,²Òbñù«g­añ΂¥$¶ž´ha10&bú¹µ\ü6è{Þj8ŒáøáÌ·8÷ˆ°©¥ÚÊ©…1œlHû=ÄëªØw­t\ƶRдµ6(ÑSMꄾ]Õê+3—mËì‹G™^¥n$ѧÎóÁ"’áKø@ÜÞŒyà‘ØÑüÙ¤u¶o³ªœ€>€Ÿ†Bl¹~LhÚ$¢T¾m`Àìûk…4 v³«º|múŽëÛ» C@ϔ޻;!·EÞIœ_g@böØi«´H»-®e ΀DUnóŒîoJ­|r‚È–æ¼¶2íNâ–\nŒ’´*\ ºÀ[6ö¢ÆÝ‘ÙÍûÝ‘­ñuyŽ£±‰Äq ìJrÄx¸½÷ë]¯ÂG÷׸Œ"ûQ4ý鈛#C‘½¯«½ãÂΪî9ËdÓâò 8Y¹™868b#²»BÙñ¨uʪ Jn¤h»ZÇ*Œž²v‡=bSt0a´äƒg{ÙXÐfi— sD»½»JG,ñB¯QàŒýws@ qM&Æ$ÕÓ ¸QG©UHµ@j$¿+IðEÚö »r­HP]ÑÏdà´ÓpTÇõšG\4Óáäʹê¾! ¹@~oÄVÎ^´ã‹7MZÏ/Þ$_)"«Ç?Ò;Ç =Ï&„(2{.Jߘðö-Š,)¶…lwÕû:PU'ÍEÓ˜üžL’#a4$¿ æ±¥lœ oD+fôqF¢0:¥P3B½dg௳¢ÁÞOØø?†fioSézá ú^½›¬xë.QE‡þiâ„0¾:q¯ÁÜRv5¼ÇŠà îÐIÞðÆÎѦ!ª]ÏîéœÉbµò%&‘}oö©x3+? GÁs®™Ó]‘}^µé۫˳ÒàV=íÎîý}.õ]ÕÛ®¥C»mN¦À3©~V¢Mª”ˆC,½“¯Ô{I)ì˜ÜžÙ<õ¿Ù ÷‡øÑÿ…ç ªjð轊j¨~¤ãÛêí£ ë e¼a5võЯغy©…:V.6ñÓ. ªê-°·Àl¦¶Éï¢ÈJùR[&áx±M«Qm@é`CgˆÓ,¤h_Ó)f*#µŠ• Ñ5 ÌèR ÚfT¯¦F…®B¤ÜÈVdyÓõK`®÷ŘAQ‚þO3¡‹5i 0èõ?RŠÃÏÔ„-Mý‹cÇä‚‹Í^U<ãPÂ^(cÆí•CDãt-¡è*±¿Ýb²QýÑ54F×È™<ìÇ1áqrTIÜSŸYÈ!iûCþ›VÝ*mGW–ª Öù Š7âϧöé?êl5—0änœÖþpóëò?~Ÿ4G&I YótRV8¤¬³)¶ƒRëx> à -úµ¨3<û“òeW·ÿÊ|Vü¨þê Ñ endstream endobj 3735 0 obj << /Length 1493 /Filter /FlateDecode >> stream xÚ­WÛŽÛ6}÷WÈCe fD‘’¨ /Û4) —f¾¤AÁÈ´W©.®(­7ß!‡’%¯ê8Û`µ4"çzæpx;/ð~[ü²^~ ¼ ||ªY*¼ƒ]ZzRœp“¬Â»^ü>æ¨HÓØh@bN½8I_ú"™Š3Ê{M¶‡$´¯ÒúÆ$<FÃëz…þF(y6¨š 2Jé÷‰Á3ˆ‹bX™PôéW¥³&ß·y]ÍBàw§Å¶!qºVZ“ÕŸ—«(ö¿¨¬EA®Í/ó%¾–'ëeµÁ‡½ld©ZÕ¸õº­¹s†¶M]&M³4²ÒÛº)Ér‹ÐéŒe²ÂÝàE˜øÊDg¡FIEè}§˜dŒùmm~9ìZR¿ÈºB¶ %ïL#*ÙhH]Ú(o:Yh|Ó¸°R°õ€Ï;U)M“Ýé8aax¯ÕQjsù_–+ê}6u ÏÀ:DÑÊ„•F¡, |h{¥ye2!m5­`[w6«ö›ÛÕú‚Þ'Qõ¶°?üaJ(ð>ÀòÌóÈ?˜ÚôEݵ UÚT­e$ âi‘&1ÙŒ[تÝ`žúºtEëªRo/’2Ax2 …é!u–SiÛm«0""qÜðA ÎséiceÑG wAà_3ü…~¸©7øl!gF§CœNxÊ– uø —Lìñ11õŒ6£Š¥DDg5A"RÂÍá2®Z¡nU¡ÿ ¢àþѾB­0a£ö…ÌT©ªö!!'È-ùa!Ÿ8„3‡&ÂEÏGlÝýy…¿·²è”S5E‘˜èªÙu‚%ƒ®Ögô_JPÑݹ>MbÈE8´u5$ Ù|º&º8ƒ\ÜïùÌ´ùiMqÃLÅ–Eêp?$ê2×ߨ6Û£Æ1E^õôáŽ$îºÙ¨…RŸ¬²&KËHþÜßé@±@u;WÜ”[_'þc™Æþ½ /dÄØL€x,rYyj¨–Û#ƺiOÚÄMIñêY`£šÉ<†6ÈsS蘞ÎhLMÝͨ€à‚¡š‡Ü0ºñ°Ûãlǰ;¡/ f’ý„Ùq³ïhéfÊÿÕV[%Û®QD¶m“îZ¥Ïóãñ‰CP’l‡96DÍ{åG ÔžŒ=g[ÌÙŸtX¦ŠâB÷“Žcz±û Ùô¾ü÷}tß +ò½þÆ 2jã4Oü"·LÀ…™ ¬¤5]{0ÿjü`Û¸·É3\+4€™¹v6J.îoÔ{œ0³|û5¯vn•e ÐRÚÀáÁŽ·æS)ïPr»„QÏœÍÒxÛxì´³\Ü’éÛ¢}Šb†ëLº°—Ž£.Azx[9Òs#,óo{ºD_ Vj2æ~_ýBjid¿®Ì‰üÖÉ¡†tà7ˆ5º’ôœ yŸ¿‡ýw`vÕ5²u›Ç÷#°Cµ0CuåêÆü¯_âG˜8›üÎYÁÒìnÔV´‰¥KµH£“©ÕÁþý›«ËSä ^ֆܾ âX¡ÒB¸X»ãíæ!½7: Ç$'­¾¼v5¤¬é½8ä;Ý_sÚâ§37ÁX©6¹¬þ¨s4â$9Þm^Û=hAfšëïwÚL4²è{Ffp+ÅAc™^%¡óäè ¯uÓòúU\ÌìNŸÎù8©‚½jBˆ%µ3Æ@Ÿ,=‰cBëB§¬ì­Òc79lÙèŽ>j>_/þà £- endstream endobj 3751 0 obj << /Length 1384 /Filter /FlateDecode >> stream xÚÝXKsÛ6¾ëWp’C© Æ›`¦—ÔãdÚC§©5ÓƒãéÐ$±¦H‡¤¬º¿¾»D‰2e;Í),Å·öEÒhÑèãè§éèüƒH¢”¤šëhºˆ¥DH%Œ-Òh:®c.ÌøfúËùÍ– % 5¹EWÓ±q•Í¢ª×¸aDÃ9ç$=Ø9Ùmð„Â+øhÛñD€Š¬œûAã%Òév’uÿ<žÛÂÏËlm›ÞQû#ûv8 Lfv"%kÛlжÁ ‹³Úz)êûáí˜'ñ£çeÞæYvnJ¿«Zð#&ª€þîL—=а”v‚°z•fønS^zU=·µ‡ÐV^t7æ&¶öÞK;#ï³ jmí¸&¤$"Ñn9UÊ«mÚ:Ë—+Ô´s¡Àô ªkQ´Eì˜Å¶ôÁü†€zÆã?V;á—Võ]^.ƒ oW~´¶õ8u~Ô£„³”(šPò¾i²G¿²Gƒä‡ÜUOéø/;T€˜ÅÍ¥dÜ®lc镳Á9 νø!^¶gC3’ô¹È×÷n_U·Yé!È%';<…}°E3[p¢„Ø-ËŠ¢r„" ­ã/[?z¾´Bè^ì€'<¬»Oµ§±0¥I*tÌ“aeªNÁ Tú³òÆËæUi½dÿ(ŸÏ}¹Ï0„-pãC dßåQ&nŠÊUg–ú"‡ÿ¨“BL' åñÏ‹¡ÔH91:é9­В¤­«,ºï`²´¥­³Öµ0 ¾¾øƒ\|mí70Lû^Œ‡_Ù @ñãp^B;–<›©!L%gXÈ qêÓ² ú=õÁ5Á]Q¾Í‹ÞÙ¦­ÖÙ2ŸA¾xô¢ÏTÈÝã IÆ¥ÝzI¸6¯[€Þ²yÖfƒÁô³Á•µ>dßM5ޝlºBx¦§£{H Œ¡BŸÚ÷’—g˜O›ØS  ÆÛÖr‡Z#!ƒ®·oÁÛ)Åúäнsw0)\r0/¬ëBÛͪ[ “ÆO\Ÿ‹ƒ‡Æ©÷®°ùÐ9¸¿]Ïþl ~9T±ãmŸ©¢ûe0c;E’™¾Q—å7ÚödKò?ãaXÑõõØýæææ[é2ÿ®OØzÊÀÇ {Û™æëÊUv¯aÇ:}CÒ§àú:¼L¦ÎޝE¦kt~è²ø~…$ÒæÎ%L@ä½ZÇÍMG`NˆJ“Þ|7àwN÷Td!±e|QŸP äs&P­¡ƒÓßùe€.§£/#æ ë>˜0Í Ñl=º¾¡ÑB4‘šhë–®# •8‘ˆ¥ˆ®FŸNÖ÷Uæ¨q Ð´Áaš”]=8Ý?@Õï7éžæßlívÀË–‰›Y[‹ƒšÉ­›À»3üá7•„wüŸ ;µgÌGå7™ÿ/¦ž{ endstream endobj 3763 0 obj << /Length 979 /Filter /FlateDecode >> stream xÚíVMsÛ6½ûWp’CÈ™ ~ˆîäÖVg2žb9—¤ˆ„d&  ”\÷×gñAE”©ÄÓCO9x@ì¾} ì.žŒƒM€ƒ?/~_^ÌET¨*Ò"X®ƒcD²"(“¤ –Mð)¼ýcÍI¨¨Ðk©ºè¯å»Ù‚”Ga¤*Ð µ)© èû<³E†ÐñÓŒÄ]1]«vÛ·RŒ‚¿“ŒR&ó N*4/s¾¼ou§i®w¢¶,vWSνC×½¿C'a%áåå^÷(Š3<v ëœaKë(‡_£<鯣†lÔ¸öÖÕrºâÞM{·Þwßoõål¶i{»Ý­P-»™¦}û…BÌì(#2w‡ûÆÐ€*÷w»Ó†µ"wɪ:¾$Ø©ö«p^Ê{¦ðïM¾!X:gï ï!åí¿ìŠöôuœ‡‹V4M·©jím’pa¶Œö;Å´GÝBUmÔÔiLN©¾~Æ$—QZ†Pá2-ÂLïxGÍ@3e¨}á“5ÎÔ ·RìÁïµ?:ûgœcA»!ÊŒ©µ¯˜2lØšBR€&Îù`š`]µÜ Û=„Åæ ­ØLÝÊ$«¥R¬îYãé0>"Òd $4U±.Ã7w|vÏ¡–r“l“ +!ÌPÙЪŠÎlÝž*mún,Б¶ÙQ®ƒ=!ÃèÆS0ÓeçZÐÖå7 ><Ö´,àÏ µk–Ûf™“fy"»v­®=ˆKŸD®™í %:tf 9%kƒy×£„¤Ãì›'7%O"Ë~ 0Ã#3«/ÐJ¨|uDÙ–ú²¥U‰‹zùÒ!®Ü¹Í-qkÇú{Ù\NUû$›…TVìF°áÇ …sÕŒsDû^½žâWlÍ5C u²aÜé[ÞßÝÜL6ù1F»®Å,?Ü]OÆs=ÂÂ>s07’hí%ãyÇÚ{½9„!1 $OòçÕ™'~œ r.©F½DŠm ð™'åðDDïŸé3+n_ö½x{s{}¶A€©ŸôfÞnŒÚfÌ_›©‹õßÊHþgäµäO­0 æ Ìö’dŒÿÀ‘L~qלîåø‚/öé‹I|-…fjÏPÇ:©ŸYEÅ`’‚?"h3Ú0q2Šg§]3Ö ×3ɲy’åÓ7bj%OðgûRcÍñ„üDƒÆ²ã¾×CkÚ굨Že0ÉP^&ÿf¯¼æ+e†ªùðúq‚'.DCP–W¿„ð—þBøä÷ÿzyñ ¡•TÉ endstream endobj 3677 0 obj << /Type /ObjStm /N 100 /First 969 /Length 1491 /Filter /FlateDecode >> stream xÚÕYËn[7Ýë+¸l7¼œ!‡CF'û@ ¶i /TGiƒ¸R )mò÷=Cù%[j®dÉMF†Wg†óæ!Îų’K┊«dKvÕˆè¨D#’c®FˆcüÈ.²!+û«.•: ÎÕI±/…\Žì”Ùe5X±E2":UÛ¹$W(;J$®dû9»³¸*l¾Ô2¡ŽBjìTmüÕEè’±$*Æ€­ˆÙö«fÈâׄ=¢ñÂBJj¶TÈmßÄQ®{TÈ+Æ«ò  •4­Yì`† 1ö-ÃI6D|âÔ„¨ù-UÇ *(•€Kp(e.RbÇb>RŠ ÌIJØ,“q|˹q@žÂ{P¼†³)Ê•u 0”kÓÁLwµ`…¦; ;‚d¡»íhºƒd¡<[ˆ›ò HŒ&…Œ*3Ì™b‘RÓ,KÛÍØj“pm¦Á) A (»ÄÁ IâÆ4K §k,ñ1õUɶ@F% à£,5Aœ-AYÒZ.j‚àlöiŠ ,y’Ì… ”Gį%‡@Šy ßÈI(MQvÂÜ8²$¶QêDB£Š“ŒÍaFt¢Í¹HO)dÁ)Ù\%ÉI ¶›(Ix8ºO¦hÉÄIÕ<÷gŠMHUšê2G }2ÊjMõ«á°ONµ}—%Ñàà`нtgй¢ž]÷ú—_Q4>b/„Ö ¢8þxyy>xöl5˜BhhØè¿t_aP?4r`½‘“žz£Y“Oµ¯&(jî£&ã¹;8pÝSÄÆv„l-5^-ƒ­e±€dŠ·+tœH7À ·Äw¯¦“‹“ÑܹîÕË#׎>ÍÝÍΧŸ?ŒðÃð÷Ñ {-FãùÌ:a0þAw<šM>N/F³E'lß~½y7|>ùäÎ ”ÑcP¥çØh8·Uo3{ɺI*é ·áˆðHàý cðEÓÒôÖ{¢{A|ú¡S.¾î£¯ú?D³xW=ÑQÔ3¥uŵTOK•¶\\;/§Å¦Ëå„ÑaërºÒç‹åô¨¾²½µe…µy3k»Ãñxig‹Êô¹·m º“¿ÍÛú§wã÷ƒîùdúf4mÂÃy÷}÷C÷âŒÚÂô¹€%˜B|Å<ˆ£Î‹!’}ÁA)¿wØ\vâºï&§süvìg.ßÍ¿5¯,EB7hlwÁ7ͧŠÏ‘z¢YÄ ŒÍü6‹—B¾m5ȃ Û@Ù+ÈJr?¥mîíÈ%ðmÏkWhF_Y¤§G‡âmfï‡!tÏØÐÛÌÚÍ8Ù IO4a¤J”ÛžÖuæÝt.¥ú0©I·Oj*$õ]ðmš"9RÞ ëWŽìU{‚­OWé+:’z»öC[–־Р0íkØØQJÇ}:nاïÆv?7}ÚõüЍWD »<§ ‘ƒò·BÂewYOÈp4´öŒþqxñþd>þýêr²tVïF•„þëµ*˜*ÓSë’áÞ‹ñ…p±P <‚ñ…£ÇP¼VÃÙløywjØ Rjö©½ü°·"ôy^«ÆÉ‹Óép<{;™þy–²G þÝ2¦ f©Õhª^³îmõµïkGkôºê f%:• ÷•«z‘ØQsµ/ší䣸Åx±f.¾ß˜wÒ‹…öâT·ïÅ‘®;/_éº;'½&ÊN/O(w\œÐ•ƒOöø)¨SœYÉSÍ›–ýnÚ²uB{¼†.„Àfë„*ku¹ý5ºœøã7ÃÙ~wêØERÚ“:²½6ôÀQ+bUòŸ¸&ažaûŸ‰”0B¥jëôT‡ÄµÅ™o•°Z•Ò_‰Võ68î‚¿|8¬BKÍîú‚ÿö'Aé¬ll«Ðd¯´'4Îj{ÕýJÑyÖø·ò­Ûw~øŠ§™¶¿fÞ ¥ï‚צô?D9¼¹ endstream endobj 3770 0 obj << /Length 668 /Filter /FlateDecode >> stream xÚíVMsÚ0½ó+<äP˜©Ù’uè!í„N;iÁ9¥[:¶ÕJ‚&ÿ>bó‘étšCŒðzß“võô,äÍ<ä}î|L;ƒzhÆ^:õ„“ØĘziîÝöB‚ú“ôë`‡T@ 1D«¤ñ§´Ÿàžd•š YZ@­çŒi }ÆDÄóá âš +æ?ÁÀg¼ï“÷>ÔCöEÈW}?èý’Ú><8ï«L»Qq÷ƒg6;`d‡÷6Nzêd²ËQó˜Â<CŒ=ß4‰FQ½ü¥Ò0-ØRȾ!dIìÐ]†Ý5ÆÍÏD¥¸\r(y)ä£_Ž/ZQ’ë…¬@TÅ#,™„¯¸r°éõM;TqžÃBq'; $ HäâuE\Þ‰ù{Ù`öéjGw¶oLˆuøì¬æãz,¹¾yýºicV0¥Öê£M¡¢a°Qß»:Å‘šlÆ|!™n! )$IrˆÇqšc侑ºUΪ¼–Òk µvÌÔÅÜmï^_·‹¥â¿a•+Ýéš•t÷heÊ%¯2&J‘óÂA^Ý\^¶s™Ò,åüÈþ¯ûa¦) W‰æ‡ö,LÍó+`Ê™‘ó ï]–ÑûœÝ| ƒÊâ}óíåô½{ïÃ*Ð$Ÿ :¹*c?v¨ãç~óJsyÚQke#m”Ï×x×0¸F´çííJY“‰ë–6áD²ƒÚo£6Ò6»x»N¿ÖI£¿í¤ÿÂJ¿¥Úãôi9h!Œ©ù<ÒÖšP͇À©îÏ=Õš0­åC|S†X0m r¦Ù@ü:NsP¿åÂvø¾iœÏ^9߯}s{‘ÞŒiç Øÿú· endstream endobj 3774 0 obj << /Length 1884 /Filter /FlateDecode >> stream xÚÅËŽÛ6ðž¯0r‰ Ä\=¨W‚’v7H‘nƒÄÛšbAËôZ­$º”älòõáP²ä( ;-ÐÉáp8ïÒÝÍÜÙëG¯–.®"–²4ò£Ùr3ó\—<šÅžÇ¢ -׳ß?,çIàhQÕ¥ËùËŸ.®‚xp,H#–¸5|î!Ò#×ÞsqÅù{D KøláÇ è̾nئ{¥ç‹Ðu4<ÞûŸ"1 ´¦Ò0$üLUµÔ{ÉJY*ýytèêåÛ—“§´lZ]1UŸÙ^hv'+YÎ.ßßL­¥\³¶–#lóÄãáä½Ô+u„ÿ5õˆc¼HJF„>º¡GJçîP^*L˜›$„÷Rßµ¥¬æï4õÈÇã‘A—2/´„ÔêO™5G&<ŽXšø½o~~3_AFi«¹Ÿàõ°æN)ß?è –Ò‹X%#eœvùK¼p½Î›\U¢ >vB‹R6R[>v¢®åšöeu9Òç,ˆ¥YgMçíÏžgޏ¥ûppÄt&‹‚‰¦Ñç°n8NÅZ4‚VŸòfK\grî9EA ¤œ¯ÚFÖ§©ÓgQšvN¿‘ZV™dɬTkYœÀ#’HCH¼ÙÌÜõœJ58ñë›·oŸ,Såø¢…–u¾nEQÚÃáÍVD­ BÇ8˜Ùi뼺£=‹ä9;­ÐªûùÂsrPÂ'’&ˆˆi"âJ5_ 3Èâ9(- œºÝí Hiã’me5Õ)'.ó=¯K¥ßpø#m¦) ¾»în5q‹—RKŽïÁ”…Q8nœ0‘<äi6?Áÿèh¼‚^5k³ùÿdóéø0oXê²ZG”’XÛXÞ++oÇ6<Œ­Ô•ªp2»Î¿tª€º&…>»Äšv¸aæ™rr½¼‡gvì®cß7iŠm¢ç(š÷"! ˆ„ïA_µUm±&è!Ó¾-Å¿§aÔ¦†)ZØý54^å«çŽ) Êôˆ$ï±þK[tl)Ò™½‡•9XÝ;?N9äõ †â÷ýZ •Xž®ßß¶Š˜¿ϰí5]oÀ‡o²!âVÐ  i«ÜÊÒ?.¨¹#‚”ðùtóv5÷ A—ïjTÁ¹¤þ—’ A»ÙÁßs‡¢”ÂFÑ©Õ×Éf”!°KM¾§KÍŠ|Ç öÞaá÷-zcp?2d,Ä<—ýhôè6˜Ï)Áö" 4¯'³yÄ<Þgó {µEý·npR].¶j6ŽÁ‡o©‘ž³$ìÿé· úÝ€¥)§v(1Úš ÇPß›MVÏC‡Ÿ$ØõÙæ|8žãvÈhâÚž3ñÈ«ðdï?!lÕ+ÁIíŽ/ã®(_‹ò ¥ò[Sšáª9õêÖd¹>´O$ £O橬h×òÖ~qäu­€;¥xýƒÊ¬oy\fj½©Ä®õ$ßÿ¸6Nc5£êq1•#ô|å”(1eîPKnÜýºÀlE¿à°¦ú„Ä ç–9ciÁ~Òât£UIh†#{(6œ˜‰­wÓ_~NþŒ^.ý5Þõ¥ endstream endobj 3784 0 obj << /Length 1448 /Filter /FlateDecode >> stream xÚÍWKsÛ6¾ëWp&“3L|ÆíÁIãL;i¦µåöf2)lùpAR®û뻋)Jfl9Óvr °ØýðíC®µ±\ëÍìåbvz!"+aIè…Öbmq×e­ˆsŠÄZ¬¬÷¶ç{·Å§¡7Ú*B—¹B€"½éêÕâR6]Ñ6¸wæš+úñôÂ÷G‡çÂ÷ôé¹ç±0¤#««Fª­d¥,ku·§èÀÐ(dIìYsî±$àtüûµ3al7²%¡­i\\:^d_¿6«Ÿ$ J6ùªK š•i«ò¿H^׊„´0_7²’ Љ;Ü6b%·ŽÛÒìΔL[¹¢I^]]Qœ¡+àÆ`M‚€Ìí ßœ¹Ï9]ˆB‘ª$q•¶)IàPóDáÚË®¥µÛ¼0gÛôtÏœ*ÀººÚH£!ÀQuÕH îçÍ¡Š´hêáª)[•l;U±º*îœXØlë¡*ÖÃ"-| v `ŸÑòJ®S`Mr³÷Âáp×ùÛ«×o¼O’á‘ãÉ=CØv0àX¢x;¢ø±GDAA£co»YE¢è}YZHfÞæš*:Ž3|h뮽éŒÂ´iR|”;3U½¦n9¾tiˆ´¡M5+¹F–ˆ Ký<]fEÃpFÛ&<; AHö4R®PõŒûL Ã/vJƒJ«U]’¬µ9óÀöË;Z2æ>ÇY¤©Nëä­9c–j¹ïÇÜŒ"¸¯Í« }zwýöí¬ÄuD¢ª 4”&°´Ÿ£mGã‘â­TËú)ðüúI‚kj4¾q棘Y*¤±°”@£M`£Ù¬pw ›7Ârb™ªæÉ‹4½;ÞôwiiøV¯M;žï¹ÓõhÎúÀ뎈mÒ‚&”Öª.æ‚Okt.¡CÓ™y¦žÊ'—ïÎOžüN•¼eÚ]V¡Oõ™÷E÷„ í½%yŒL³zxKˆd¢çîh,TeZäkjÃÄQðÆÖµÓ0ž@}=¡*ì»c_Ÿ|õWqHE'?S‰÷+~ 8ÅLÄ1¾Ô S[”Ø:ß¹aJ[Zª—u¡ý»ÌÌÂmÞ~ÚÛ H›¹†$¦$èÚ¿¹«±‡Òfô¾ZÐÎåh›qvóà ˆCiÓ›cõEt'BïËj¥ÀR¹2ê\wGD]Rá)L^‡O#}z®ké†ß¦þnT¥†û…aBÁ Í!4ëŠVúž“µI'k!?6ó)€på‹Û¦Oåt?â§@ ‚\åÐqP|(Ó~Q`*©ô[Ý!¬E”^ò&3›Š>)R`j~Í]¨ã3a0EE¤’¦!ï ê€ÝçØ^LqÑ…_—Å–Â)‰—÷Âù¡æM?â‹Üë6§ôYïMl?ðï{½˜ý9ãúZ`‘$ÌåÜÊÊÙû®µ‚ðBL$±u«·–4L,ò±.¬«ÙÏîúì}Ÿ¸ËBŸ["†÷Ž£[h軃½£ÐÉļÏOo¨ÚÆLXB•1z.À—µ^¡ ‰ª¢mçCîŸv?LX'OqŸÜt'þNŸ³ 1Eç;Ùd*¿isˆ‰/HP?íÕRp‹¨ðù³rpsmçîN^a<¦Úì¡põ•ùx;Îý‘!çÕ`̈†÷ò/DÖNÆ¡'!ãšpÄgbðÁj‡ðï Ã¬X/±<ÇF̵c:ÍšTæüèCzòÍœÆm_½ô<{F߯%´RõŠd]žQÈ HUæk²8> v@öÕtì¬?Ž,0úÇz%‹ Ub#xPô ó]a2zø(˜‚ÅñÐ%oŠ4“¥¬Ú/$ò!:£ ñðx4Ž÷+ÜÓðø*)2„ïÿJ‘R¿ƒ¿¥ÿø|ýüy­ÿŠ?G5M®{Ùjå?1xÈü endstream endobj 3800 0 obj << /Length 1279 /Filter /FlateDecode >> stream xÚWKsÛF ¾ëWp’CÉkÍ}ðuèÁuãN:ifjËí!É’VŠT¸¤<þ÷K™”eÜ!,ûûX…ÞÚ ½?&¿Í&—7±ð2–Å"öf+‡!“*öÎY,3o¶ô¾øwºÔ‹öcˆÔoõºÉÛ¢®n‚Tú:o»F›àÛìÏË™ É,fi(áëB(‰F“Ð|y£ÔÀz*“ÔšO%(yJ›Þ¿¦Qúw’¾[Ýnê%É«º!aQæÆˆ³a$\±(á=€_ÈdtªbYz0¸Óv‘ÈXš¦¯ù™r•1ÐL!iY9׳[mº²5_Ã(¬çß!…ç$þJŸw`ýέš²î ·õR—#ÃÏ÷Ÿ>¹EÆxæO8“B"SÅrÕ¬»­®)üÖŒîáø{:!‹3Ç ãè&G÷žÄTÑgëª ¦RJؘcÿÄæq"Ýn€)¡ÈÄù†]¤ÈTCgïSîë€ûKT)¿­¬v£-·‚)ì[º}xmUÝÒŽÎèeŸíóÐ;ìó²Óçã¯ô¾ÌÛœ$«|£ßž;äÒù‡ÿ»)˜¹ l7òµëÊÒÚh€¸dÓÙI»jêí›ÁÛÏFû9ß"†(óë}ï®ÿrWˆUƒ ¾8H“dDÉ€˜BøWçÜß@Ò¼(óyé\Wpˆ!q‘W$Ìíº÷×6…ÞcÚôÁ¼Qx(Ú͉ž!‹Ó¤¥Ô{]žj£ãæÃ^Í)ã(JÆü£^s~ý€9ÆòH—Z@ÍTއ§Fù¬®d2¥§ÂqÊ1`اþ 2ÈÿqÁ¼ü¸7Ýj˜E\–â)¡E®]ÚŸ;¸×HQT£ \èÏN›.Óê©P²ç™ißYL;è1hµnên슳Ôÿ¸èܹ†|TT Ç¬1;"Ù¢øJ¥—Ðó%ünú¥H|ì"öËÏF…­øºÂÉ (ᇠD™C¥'¶ÒÁ…Ã…k]Ujã6`wÔ$NUW壓ˆÜÂØÇ0É'bÃÆZ¸Áð0l9 jÌ8–ŽPß;ã$ŠO4G=¨oTÐ5‹¨X>b«¦bù0›üœà=~xÝÈD1Áo±|ùzKX”Lf©÷`M·žĉÂ÷KéÝMþ~q`Ú'Ôxfr ¥âžŒb&¢tü„zz> žN†ÇÑÈ“°/”)~#þä)ˆ¸o+.‚›ÁŒ€ß p¸býã"pV“¢³ î´Ó)‘œ‰0}KJ(ôðÄëQd’ñHàßµY4Å΂úe}íÆrÌ ôôcþXõi“ÐvÔÚªìí6ÀE»\ _°Õš”[ÔA‘»ÒmÀÑ ÃÖ@ñ*`ólS8÷«®Z´Økç°É«ýÚà> ?wU$!‘VÄ0Y°þ:{º( -`£eƒ´°ÏyÈça©õÛ*©Í5M.\-ª t+ýy£ó.ú)l²`ËU<Ì)ü§Î:”Áotð{"4¶«PHÕq¾hjcž^2}:•ò?ŽÊÙ —¶Þ¹š^ÔmgHß[ûËÆ=óÜÂVP8-b€}ìœgñ½É×úÕçð™Ïâ«î•ãÔÑ[šaû¾8•Úê‰Ûƒ?" ñy<ôÏÿ+œð¼×ÍÜ–ÓÀxv{ÿá¤ñj¿bçB‰F/v˜ñÏ£~öˆî¿Ð•þ¤Š¦ò endstream endobj 3809 0 obj << /Length 1373 /Filter /FlateDecode >> stream xÚWYÛ6~÷¯’‡JÀš&©‹Z´i)ŠôØMP ÙÚ¦m%²äŠòn·¿¾3$eë¸ëÀ€yh8üæã$õ6õ~žüx;™ÍÃÔËH–ðÄ»]{ŒRF‰—2F’0ónWÞGŸGQpwûËlžðž(Ïf¡U¨eó¶ ¸ðµ©e“Wå<¡¯ds¨•ŽQÇ„º­góˆö”M[mSžÂdhu¾ª7‡*ƒû,· .ꛊ˜ ¡VQµø àH‘ëf„b`}šLðÖ¢_Qz†¡_­m«ƒ)óUÀü˜‡Sh¦qì£z=6°hêtOYL2æˆ-׎›çƒzwØ!ð+ü«zˆï¨Î@k*;[+˜,/'µ–“;û%̯UBýû€§>ðÒŽ JøŽŠñÓ£.a¡¶_>јV¥S³¶ë€p¹D“·N{G8ˆ3'[W;Û{Øæ}iôûCQ -€v ®Å±EÝl•%é>¥²Îå¢PC2ÉÅÌÝ«zQiõ|î~¯s7vgàCËz¾?q«f}¿&ßàRÝð)nx·káG„W£ Ûýó Œ8%, [Mó¼\}p$Ο#ËöÜjL#p‹÷Z­,’|mÓÎ`Lj’XdíšS»6œÄìhìV"Ñ÷ø§p—Ð/+“0ódHåÀ?\œA² @¹#²Î Y¶®Œqˆ¾™ oBŽp "/OÁXD2z5JO#∤YÔ±tÎ+x”$C$„<ß^!5«UŽé[Ö®½¬!HUw™åÙÂ'ÙE.2*  BC'&BDVËkÕȼ8]Æ­-©]ú³oÓ çæ…9A>ÌM0ÌKÛÚ4ÂxDW—Ÿ’˜‹oF9Ýò­ÔåwEÔwLÖ‡ò {p6Û\[¬;¬TͶ2’+;÷…3©v6ÚÃ~9”þ8qþŸØ-A/He‰Ÿ7¶=è¼ÜØ.’òÔµÓ»-ä')ida"HÚÅÁÑÏì²\µöˆpÐwNCÁж§÷`*–œü #µjaÖÕa³`##N’$F;d –¤¶Iº‘5rà•èUÆ!ÝMåC€ÈŠƒºÈ%Er®!x83W2ñvÑ^<ÌåÊXÔ/ó瀹HyóÜí uþö4È&”1-ήeÌêzùÒ¥þ;Ș¦Þq}¬ªxt ÇÉañÅ6/u#ÑïÌ$†vnÞ¢^ËFÚñ^.¿@Õ³­\gÛ4{}=›mòf{Xeµ›i¸Z~–…\Ì´Q1]¡Ž0Š|QËúoÝfæÒpBxe¿Ñ{Y.Å‹¾ab`šrÖiÛ:3vªÞàAu&Ú¾Íñ¶¿¬JÈ_¥‰$‹Öh €Fu[ÔJ:íª>C·Þy3"¹¿ëâq Ê¡.ÖF~Q£Åë¼ÖNŒöm¸Z„¶p¹ï§ÎrÄòÛÂÝÒ¨¡ëª“´`~°Í‹F-·†ôìšßc^Õºwn›ŸnkYên¢„ž,òÍëãWg0r¿/Œ·ü5À6X⌘¿7éùϱ¡ÜÆñ¥äïEöywKíž]ݓˉµ´‘—ö¦\áš~p·K&on'O˜)tìøFäЦ)–»ÉÇ;ê­à#(7¯¸#ºó"È®i„Å¿ðn&|5ñ˜‡è¨rR’D°™ˆÒáó‰±ã·eo ‚›ÐƼSĘk!§Æ©ŸãÓ1÷75~qÇÆ¨·óÁ%Ó“œ°Òg–^‰µžx„³š$í•G/ë|ßúõ¥5æÆ¹Ö|øHwE¥}Û3]ÿtÙËÿdP. endstream endobj 3818 0 obj << /Length 932 /Filter /FlateDecode >> stream xÚ½VÉrÛ8½ë+p$«L 0U9$™hÆS©TÉÎ!Ζ YS\4å”ÿ>…¶ Q¶4ãä"ˆ@£»_/MÐôçèítt>NÊqž²Mˆ‚yœ¢ŒRœòMçè[0‘¥œu“wÓ‹:d"èä²-ºUSCÁYt›Vªðûôïó1϶tñ<Å‚p°d´°8ÑB#⌟c²%õâË`“ÛK—ªXJïÚ¡ÔÅÛ@ŠhŽO¶1\ÔÎ;Ç“k’mÁ\ó€ÌŸYŽ3Bû gàwÎ ÎB2ͬÁ4µ´ÍÊRމÈ|ŽX´Må[{†¼}HeY6ZõU½|µ›$¾å M…—¢kFÉS 2ÿzׄ‘;ÕÁBŸ²ÙKqLø´£f][Ô Ê´2ö¢˜fAãzÒ üG*YÔø.*Z¼.cõìÑùJ­a(è‘ÓJ÷àÝzkwƒ¾;Âk¬<Á)Ý¡÷tü~( ]1÷Ú=ó DÜ“ÿ•$Ñ¿lGcùÔ:o¬áJ*=g¨“)Ö½’ÇíŸCm×Ek F4Àös¯>2]3Ä!Ú/Î{[äø~:úw¤É‚ ú0Åqௌ¦hV¾}'h‡ðÐcž ôÈV(¦Èb=¤•h2ú|ð…6£¢ï %à EðÜã$æ{£âÞ¤µ©4ñ”1…èÂÚGW+ Ìtš’,˜èP½›ÚЇËVÿö%•()»±1Îì`x˜`8Îù)á±a 3K¦ÂQîRÍÚÕz¯–ÔÉð°jë`b»þÉô:f{áYz8É/:Mó½i:=yš~ñ©w/ZP[?Ã> endstream endobj 3827 0 obj << /Length 1051 /Filter /FlateDecode >> stream xÚÕVKoã6¾ûWð(÷$ôÔ6MÑ=ÍÆí6{ÐÚ´­Ö–IÞlúë;äPŽäGjo@aÀ’ø~3üæ›adIùaòítru#S’ÓÜC¦ £R’rNÌÉtNÞGB™øÃôÍÕƒ¥Ò0ªu†ü¢;ÛÝn‹*YÔ•kë6LX8çêF±ÁΤߚˆ%ø¦Yn7¶Š¥ˆºv´}ÿ æÔsFžÑ”+4TüÍκ=#/SCóL¼ ß6E'RJØ'ÚDG ŒŽL‚…„*rvª…-ºmcÛóþi»qƒCáß6ß;s𥢮ÆÑÆÂ`VÔ N–1 ôiÔÙ%øRÖÕùè9B)Ú¶x¾y±±c¸Î€ƒðŒŸ=Þmk÷Á"IvH‡ÎâGk×p_âÅ'Û|¬[{¾?7ž¼±àÅòà ÿúò)¥çÚSÝÛâÁ¾8á‘…›œcœúÐ@$}öIÏ2jÔ.û6¶[ÕsàûéäqÂa‚¾Ëgm M…&³ÍäýFæ0ù†ÀTž‘'¿tC¤|ª$¼¯ÉÝäödöyÑcá °p¢UNµ zðcµ»äë¢+öâcôÈ„€ñ˜€ï:®t6Ö6:æ½Ýã^Ë”*‘^â5zÇŽH¢f)å½X]ÛvÖ”=qý;‰ÒCÿànä‚Ú9µ/›ÎŠ04Aè~qT}U)ÏTÌûºgš¡Ž~‚Ș¿ˆ0O+Èý0Ü®ë~EeŸè·òsÐÿ?õ^‚á÷Cr‚ÄÑ\óSZ =áæ¼uîÅ |OYYr÷u~¤Þ­Ê™ãç*ȲÛÜKø)úŽc:*­í.ôžUT&û„Çùmvk›î9s…G úkœ›¨XoíE6¿õe:ˆ{~4#Í’ô¯o‚  å*ߣê+¾KIËúõ/¡÷Ä9)ŒBçT1ùï–¡`S£öðHkøZ¸)«9‚neQño]:ô–üˆÏXrýj-’QÎô?S xžÓLñ¿W Bd¾«}}r©ìô”ÞáãqØRûL=abM1ë°q4®ÃÚà>XI#oâ°Õ4ÐL.‹f^VKülëM8Åå¥et×5»/'„nÎ ·ÁÏ‚—ëPü÷`§PÈ[|6öZZ„nŽƒE˜,ðq.LÀÖ{&ÕgÜ—GOe¯+\pÏ{„?þ5`‡š„(aÂ~.6kWµdÎ"ÎööÆë-rælŽ 5ài.FFÂS^ÐXº»3‰Æàé gËÅV©è]¹^Q÷< ZÃËshù‹ß(Û‹Zü²â¥‚Tu•üa›z¬€ Ø¥QËÚÿº±è³Þu³mW/¡_ö v!…ÿ ŒÓ endstream endobj 3843 0 obj << /Length 812 /Filter /FlateDecode >> stream xÚ½UMSÛ0½çWèVy }YôD)t¦—é8¸±BÓqb°)?¿kÉ6¶›P ´“™H–´«·»ï­(ºE}š}˜ÏÏG–XÅš/£”©fŒ(aÑÁ6àˆnyp´ØÖÅr90‚«±†whçß] !¼á5"|ÕE3J\oËMXYm"nÚuÓ°}¿MÃò*wÓ ‡(ãöÒ˜AÌF‡«³´N_Ô›í ÈMÖîƒ H¿U,CÇ…±2`Œˆ6›_#«pšoÝÎ’LðNKÑ#†Û5Þ®#†]¹Z¤y€Uº»ÒUVý~Ö«bÓㆠð}3<Éõ~s½‡ÎÂõ§éú.wO³iT/ΔìBaBQÁWåjR9—]Ó„Jÿ¬ñ –1£Ä&½NêsÙlÊü&‚hk»’¾kÃÞ,‰4½”îÙ.'L)ÿèDv¢8¡W> .v*oWm‚éšÎg÷3–±¾H ¨•F‹õìꆢ 6!t"¬A?ýÑ5’Ð.´lpçèrv¾7;áŒõ T’!™$Dw¥›6œA™T22æ@Y6–Hb¼}”0œÖÍ·Æ'½£ÝÊ„HHñ  ÐSRK(kÛÚGW-ÊÕgöëdÛ„4sƒ‹oP:…¸E6W ¡*LÓ0´Ò réue[]\­6·¹‹.ÏÆ{h ªö é{ŒÅË¢ “‹÷£ƒ×EÙ¢Ë\®òê ×M´ÊÎ¥U«bPФ5eÐÁ@û ßûG`eÓpCÊàG *oQ7½øýÜ Ÿùóå›ÏÑSoSÔÛ {Þ¥Gi>ΫbOóx¤I-‡˜ŽŽö2|'A¹Öä_ '–(.†`OŠõ:Ýdo¡ÃÆÐ:84òìYªäÒBMôÛ¨’ÂîÝýKQžEÀ Ñ‹@<ŠÀí ½||Î<í§ý®çï%ÌçðLI“¼˜ù\ho7z2ÿ#õ÷sk:9~zi endstream endobj 3860 0 obj << /Length 999 /Filter /FlateDecode >> stream xÚ¥WKoÛ8¾ûWð(KŠ¢‡=¤›¸@ÝØ],Ðí±i…ˆ,y%¥MòëKjH[’]ÙÁ"@D[Ù ÊAŸ&—“s£§Q¡åQB0 #SŠ#–¢å}ó‚0™~_~þ0‚Ž(ã G4ÔŠZ¡…|®D³|”[i„'ÄÚ¸YNþ›P}$ˆîÕG1ÇŒ1´ÚN¾}'h­_~FúUš Ÿ­è…A2}ÎÑbò×^ßðÙrÃ.JpRñ<‡§IñÞݧ í’šrê‰fê3žxpŸzu«ã4µ0Á„Ð÷P äD"š`žFæZÖ«JíU= *ýP&È××ÔÃõ¿§ óD¥ÊçZ“aÌk w.áù0õƒÄ“ðAìv¹’k+1õ©g¥²l——Mà?ˆÚ½6_ÔÏö¢BLyt.=<Åq¹phq°¶2—iPeÎ!pšY¡²¨UÝX†åžã1˜¾µèÓöZTOg¡†)NåpÖÖúæ™ÎzâŹ^ÎÃò¥±'uÚÛE?6?Uã¸5Îb5 bï)«Êg§ÈqUîÃû±Ä{¥nô¨ß•Wéoâ$v´ïå¶4†~˜`ÝpUG® YÏtg=h')€9šI>XÀ¼•™ÔjƤ¯±`éÞ­ù)moºŒyY4 õ&/‡±.A—ÂNF¨&·€6ºè5P›æµz3¹T¿à]ù©RëÿÎÌh8„󽡂r=—U<ıî\/ukݯ“ô¯Î9âå « pØ~¸Ø‰F‰ül]Gú.O:uô8®e­²Â4#óiSVp¨A=|ø¡êg‘«7ašw ßýK8‘™µ¬ÿp‚ª ¹ãý š¦˜Qæ€|)ó×¹ºUÈ/º÷Ž1ˆ5ƒ}ÂÍ.·Èq@h×ÞµÚž³Õ›æHÇó#Mp<Ì{Y7e%ÏWt¤{µ^RHïšM‰^CYmYÁ×Õ>¯9×¢ÔËGQZ;}ecFЕ©Ú‹\ ÿ¸Ü5­^µKô ý¹"2«ä¹ ?1¶>–ùzÙ¶‹ÇÖM‘‹*;Mr»{ºéõÉÆ©,0~Ã, "¬”­E&O®.Ç«L?õ«Lgy0U䲬Ý1N)±?e¡#ÞzÀˆéÉ$9˜ïãb®»©öµAÈ44ŠSçó ñã„xÀãîëííÌ©ke-×wÈj½0 .T|¹ðV¨âŒ¤åfW'äwyó~¥\ëƒuë ô?I¹;f>¿º]Üô$ÔJïG"¿5íâw¤Ýù7æÃ€È¥©þð <~>@ endstream endobj 3767 0 obj << /Type /ObjStm /N 100 /First 976 /Length 1679 /Filter /FlateDecode >> stream xÚíYËn[7Ýë+¸l79>#@âÀm5l#hkd¡ØjêV‘ É’¿ïÊväÈ®¯”+¤‹n¤¹W‡œ3ÃáÌ✒ ŽsŠN’}WU äèHÉÞG5Ûv\íMV'Õåä”ÕrZ"„Â.eàMq…ìM®®b ü\ŒÑÐ@FRÅGWs< ›š’ aH\¨º fQ³±*ÅÅ+Mɦ•˜£éª˜8«M‚9c 6IeHRM‚²RÛ(«ÒøWKQÅP”:¢\|МPA‚bű°Ë €›óC ©9¢s_¶wÒŠ†šyx•ÕTà11µ03~ð-e›Ù¬b²™#X0Ö¬’h3G€%Ú`U RˆPaؼ²,ßüP¢›eel¹-WÁtxª¶À…ÈI`cL ©Ø€˜œDj ‘`1 ‰Æ*CEq¢æøB&IÃUHð~N˜.‰MÌRs#ð2ÛÄøÜ(2”™FH˜¸¤:°0•jÖ¶èKæ ÓÐÌ‹4¨ Db\ýšœíW.N¥1áê45G…fE¼0Ü£ÕBªÀv­ÉV@ÔÁwF¡—‚QÉ.EÄAÎB›Æ6 ºDÍ2„E",hF¼&æö*BÊiÐ<ž„ÌXD_ÛE1T›·¡&åØÞAW·À®¸‚€Q9€„m-,§ DÆþ1 Q‹ÃWîœÍÕÁ¸á/¿þæbã²·.'“7ƒçÏúh6½vnx„!ŠÛ°#x¯@ÇꆕJ·âl­,]ðÍ&Ïg§ãkwî†Ç¯ŽÜðlüáÚÝé:ûø÷?ŒÞÃCèO¯–"‚ OÆ‹Ùr~1^¬²N{÷ÓøòjôröÁ(a`o¿¢Ñ£ŒMù­†•íõ“íµ6Ó3‰·|Äô{ÖÞóì•Mk3u´6ç k3w³vü),Ô[~Ù>,Ö}³#;»¦<àš²¥k†/¦Óf;w­ŸV„VB ·BlÂgŒÚØÁðtùöº=ÿx5ýk0|9›_ŽçMox3ü~øÃðð<¶£z#cÌÞòünéeÆ| ‹ÇNìEóå©~7;›9¬Å7'¿OýÅl>Çx²œ@^ ߚóú¡Tƒ¤º[N¤ÙGdö§8½¯øÌÇ‹«ËåhÒ'%UŸ°‡˜‚oU6d/øfŽ>¤ô(¥ÓÃ3DÄrÒ§{ÁÓòÁÊÖÓT^,£ëDÚÆ*ÛìÂòÐ.$8‡¨#Z°šŠ‚× jîQÝ÷Nä ýÓÿè5´2Ö¦³¢¥òV¦{]1î±h•ð@‰®e÷¢UëÛe|ë¶ÄˆÒ®`ä?_KW4gd̘÷ƒêí”Ñ MT|@øe•y=þ%RvºvÈØ¹jוIí”t#¤>‹5iôŠØÑR¼±]qôlݱFy4õ]M/_æW£·“ñÑxt½D…쳡ƒ0RZ¼&pØòÕX¥êÓ×"…ã¨/X!¸žÂÁ„“ÇÙ«Õ*÷vfeoçâÎ)àø. oM;¢UpøÑ®sK†Û3uE³¢×êÊ„ð]ï­ù¼zwª&ñúȱl战v®v§Ñ=xÖÁOÏChUòvƒÐ }ìí®bhB+¥+o²[kŸ'~ä¤R¥ÏØ ¼¤;×»Œêóh—9¯:™NÅ® ‘û ÍÃüø1êt¼œ®7’¥-âvütÜ>„Ö”|%Ù:Vc鈖Œ¦¸3Øúéj$“ð®´I‘Ùí£Ï¨ÝЖ«YÊ.W oîG‰ÝöcQÞØ|ÛÏq¹n®cì¶×ÆÎŠ6’{»LfŠ^Úí¨àdÍOlÕŸßþ‰Iz¼ìX] 1¡rýA€¾ÎºM&Ÿƒt"óìÙêÉŸ\Žø‹ÉhÑgljfÎî×í²* ˜Ö‚PçÖp§¯ã®Èž©°ÏÔþ BSž·r×áìýûÑôò1¯µý(´EÚ&?ˆ¦äSG´¶#e툶ÌZSÞš¬ù,ѬÙwõe´ã©î•´¢:Â#´Óõw§EzJÊió¦hÙ=)kºIÁ7¶õ”‚ц"ÝÙÉâÂLpœöw^Æx¼[:žM>Þ'³ÓФˆE¦;>ÁÇþ|šÏ««÷Ÿsi1¤[\]Ýß%ƒ¬^™÷ƒæêsL»¢ÿÈÞyª endstream endobj 3880 0 obj << /Length 970 /Filter /FlateDecode >> stream xÚíXQoÛ6~ϯÚ‡ÊhÄH¤DQÀúà Mm†ÖX[lCÁXŒÌYŠÁœýú‘"¥HŽ”8Yî!È)òxßÝñî;:¡Wx¡÷þä|urv¡— Cì­®¼( б—FÀ(óV¹÷»ÿ‘]KªV¶c‹?W?ž] tpei…­0Œ3#t:Œ³‹8H(%­xS½ˆBM§e ñG˜„=DF‘V@²ÈJ~`’ýÌ VåNôt$aèעኋÊ~½±Ã É‹z1§M(ªX¾ÜófÖIž‹2_qU>`Þ§ W윮·…×½°ŽE8ŒEDôá¤QjO/eq½cÕA_5£(ŽQ5Š"!V‘Æ<¸„Ñ•¥dv7ön¯$]!¿¦’î˜b²1ß±¯„]¿\ø¬j–Û¹°~¬‰35 Ó¯ºÄéÍÑ^C `”i« ¼=Pl¯&R f€hל¾Ó H BÒÞôzæG {ùÏÖZ9§¾Xç©Î ç¥Q×ÎþkîÍoÛ B ÄIï˜I©â‰Á­ÝsŽácž9Ï> gAA–Àcýkµ>ÖÁÁÍí(¯ŽO¸_K¡&Çužm«¼ì1øOúˆ‹Çø~Ÿ†Í×Ûæ?‚óõ¦þ¶y´=á¿tÜ–sO—®ÛQZ~uå¿q—S¶t{Pò#*Ëbk_KgØ¢ý¶È°OËk6Ie†R˜3µ(j-ÐA·LÒš&4%%‰ÿ[«c˜õ#3çò—e#f˜UÿâIói§äÙ»Ô6kîÈ–îê’ÝÏî£$ ZŽ{ô ÌÝÿKÛâÞ³ŠéþÌìuͰ­13û›«Íh+§rkg½ù¦‹E¡f ×ñK~)©¼1íË]À°ß %ó+{5?vÌ©¢àÊtsxo߸ܪ„Ü™åj´¬ß§v¶ct¼»&¯sÜÖÍã’Wâ^–h¦·jiÒj°‚iÎùzì» •Á6Q)ʯ:i]óªmRÖÜ Ö~Ò½›Þœöóµfb÷µ¼jÁïX‹RÈn£-œ  aÝ´Hܱū¾ÝŠÄ &ý[OêgÀ]-ºóÅqö’e`]£šà\”Ie“¬¯íðVgoÿN´¼_~6ÅÚ( 6ª›R£ß¬>Ê5ëV”êw56üé·"yZýV‰ì-> stream xÚWYsÛ6~ׯàøEÔÔ„y3̓›Ä™vÜÌ4–ŸÒL‡"A‰-• |ô×w R„Å$Vl€‹=?ìÙÆÖ°‹_Ö‹«/2–„nh¬ ñmæù¡9 ½ÄXçÆgÓ ìÕ—õoW7¡;aõB‡Å¶Š$ÓÝ?+76yŸá²{—ö)Ê,leêêÆ÷„C…-Ï÷¤´åF@ôHGUnº´{þÓìív_µ½ [õ€˱Y(—òbeyžgþlÑšƒ=VtiÍQø‰ˆohéš¶«‘Ühdõ’v5Oõ#w8¹NGwÔѳncS6í7ˆò?þ•£}×n´#›IK_ ~¯ÇNP¡mDAS”Cˆé~_6[í0å⬧ÙðžGwäçOÊ0oë¿ömÙHãß0‘µUÛ ”IÉ$¼Ðcv^%ì@rä<Úw\éôпdåùæãõfè󎳡=íx¥jÿ±ìwÄ.2°í˜é¦¬Ê…TåCÅUi·åG+‚÷‚©â˜^‘…øºKlåâ½HAnîbN/JÏÒuLP,‰F"{¾†H»ù›gý¥VHG©é3•áU÷··—s¸6ˆ¼ÐxáÏžgÒ1ž³Stv1+'3'×ø3 íâ–?ðP»ËÚŽƒ,©ºoJ¸Œú‚†ÇŒ¾‡´c Œ.݃J)cBi›A¦öØ•½.{s}{÷~>dÎuÇ×›'KE¯;”oßþžö]ù4 ¸²i…îÈúÓý¼OûTÀën•1Fmzš7᱿&¯»íŠuå¹f/¾™ÖßIgJÔ½VëTQ­ÖZí5ÕÞ?tiO{÷Ah¢vúJš¡4YâÓjx½y`Çvùíû‰yÆVV%ЋôPõH÷MÙKáœî@nË†Ž !Që$2$§]¿ãÄ!»!vÜQa ÝœØm‹£ÌÌ ˆ`ë멳¡KˆÖA@‰ž “êg]SãÔ§[Qöåƒ|а€žoyG„V­)-kN[Ëú¶»ªJ¬!$ Ò˳²x¦G%~RE5þßß`¥ uŒå%n8²¼ô«Q…ûýQ|Uê$ n>€›ÿµ ³T Ë¡E{=P$¥µ“Sñ¡ÌyŽ“*N”ÿd]íœ@'‘D2’¹&CÝš&ŽLÜ)Aõl–©gxѵ5åæI:‘/ÃÄ\†lÂqp~6½¯Î*ýWÆáûž^Þ±&=ÌB¤ˆ£XDuç*¡h*Õ¶YÝtЉ)Wy[„‡šH¦‡î¾R‰Bó˜Ð–¿®¨Ôg1]êO¬åùøª‘úƒ¸RE…þôMGY!ö¡Ea x¡ùV¾©€ã˜m𱄠N S|Iò²Ü‘A ó¥R3À1äΩÎóñŸgõ³ ADRõ³¾à‡Ø¡–Û&½8*A‚U@ÏH;ÂK~T“'†!×S´=)–Ór”³æðŸ6?ÇäÝój@w؎܈ò‚¹*Ácþ[f2 ¨áI©VÙûp3ŒõáNzŽd¤àfå8މ26ûò€^ÿZ… endstream endobj 3898 0 obj << /Length 1335 /Filter /FlateDecode >> stream xÚµW[s£6~÷¯à¡3ÁBvŸÒݦÓÎôOš¦;Š‘1].ÈÉf}tâdãi:~@éè;}ßqàäNà|¿øvµ8=©“úiLcgµqHø,ŒNˆ³ÔYeÎ¥{Q™¼7Þº]·¼ZýxzÎøhKc? Ø4ëiDô¢E`韧ça8Úå1ž˜må0Éps'e6Ù=;‹Ç~šÐþ¨³¥ÇXìî–Mܦ+Tq»„‘Äé¢^Rî*™Ë%q[=ÇÝMÓâGµµ«Ì‰fÔlpÍð©uÖT8®µá}¥-^Ãqܕ֢±^ËV¨¦õ—^…î{¹ûRi?©ÁL£ÞÅ\B™?ósë¨G ¶ ÇÍkÑ©—g…n0Wiè÷K˜@qw˜†™ÇÆ2Îö»ZÙEã+¤^hçïí²Fû>øjfÑ»Ð=Éòw? ÕŸNŽ÷òV¶×M'_îè¯ma²cAì´_m“cÒ‰«óÓé =$Y!òºéT±Æ÷J‚¹ìŽF¼‘BíÛG¿T¸v {+Z±VXN¡‹¼VX§Ì%ëÏÀEµ¨À)i£­l‹z]î3Ù¿ÌòiBðÑXWx®ÌÆ©Õ%’0÷ˆ|Åè‹ïûG8ÞæûJbºl>všUlž²©G  oûä¨mcîyf9( ÆÈÒ‘Ñăûc™Æ®(÷ò >šà$ ¸•ú4N&)º{¸Ú«›Eî?üxW¨­E<„ù`ˆ3¡.YöwûÄG-ïì’Çùønµ¸Y€8d`éˆ$>¸ëjqy8|¾ñYš8wfiå„À=<ÔÔ\:‹ßÅ KÁ$Õ„~'‚ÃNŸ’‚Q4ãh²B>È”‹¢¤·°Œˆ{£g¸û`ê “a’øœ³cœDg‚ºF±FLïe·n‹*šú¨úHgôÚÅ^iãŽÉc+w@ ÓbïvB¢ìï(ÈQ% ¼äH]Õìêš¼®?bW ¥7º¥¹¬ÏX£ºƒî=qÅçn®›¦ÍŠZ¨çé-J!KqŸnK spœ›E¯ Pß–ûç Ñ¸*é¡ý,*ÕÀ2+]7óŠÜèiä›uÎã\Q>à°¿ÑÄÀÛ~X–ø9u"`s‹Ê8²bÜM[¨áè oNˆ{[t{Qz¦ð ;â³&âó¨fî¶rJõáÔ#6ôTý÷YþX¼§ÙXÏêæÄXÝ“&xœƒ,С´Ôy ad> †ŒV5«‚¨gå‡QˆB˜NÕ÷£|6ýP+)GÂKcÈ}-½RÖ¹¦oý>b=u»4­qQ‹iL,Ýë&rÆÐƒ$œt8õÑl¼«‹'´o`æÞ¶ zIešIÝré·kSfr@fGÕ´vF”»­À>K‚‘ÒiiT²Õí ¥têS‡s›¦,=g`e8{mó«Çp€yîu—„¢Üš*ÐÙA(”¹48PÈš ¤ÿá@êñ*€ÕD0Š‚¡YËå'<¸ [@Oɤ—÷ÿ¾Þç3ïÏ+û ¼ôêë_BHèG|Œ0§uˆÆÔç)ùÅ–†‘OS«O(?hÆø‚»ÓZ;XÒm#~x÷¼îR¸¤$^Gw)> stream xÚ•VMsÓ0½çWhÊÅžÁBþ’“‡2m™ét ) ÅQQÛ2–Ò´üzV’SâV-î!cKz»Ú÷öE2AkDÐÇɇùäÝYZ žÑ„¢ù Å„à4£¨ˆcLÓš/ÑuäIøs~þîŒ&Д&xC‹¹l™¬ú\Im°Òoq:ŸüžAñCvZä8#1*ëÉõO‚–°xŽ`i6E; ­QY ﺜ|yÈ÷øi)dÙ!…˜`šÅˆæSØ,}¹<à”bÓôÔ7¡¶¬x¥ù4Pm˜ÇMä&Êj«4ïD³6ã"`ÍÒ-ð»¶3X®”›[2ͰÝܯIFqD^¡‰ãN<í£q É‹®ÊN´ÚTrÈýŸC LQOq–{¤‹²´ZxSNJ‡F—mÅAÇÍ dçÖ–v皻Ѻ“ÛÖêeF?HN8^ã0*ò|¯fŸ”[75oÂdhÈx¿àžÐŒ–úR`¿0)‚[ƒ†@¨E ×,§Ž†Þ˜.E j¶¶¯æ˜v“;hR›A)«Š—š/¡°¼È‚ïá4 úhV)é‚ÛNš [CZ,ûŒ½Xg6é¸Óͬ9w@Žt"êý¢¥uXtߺ]ÇZÇÓè’¦i°Ú6¥é¤rCzÚ´i6l”ÅÊ>ˆ¹G a$všº †Õξß±š[%dwƒÝ_~`¯Èx#¡˜ýÉp¥Œ–>S=5ÙðOú¼ÉŒ)¬õ‹_И·¾þZgáÅ=´Œà½{|ºº¸xëv嚣ơ­eFbÁ<¯ÉŠYÕnØ ~­JVñú¨’; rä¥ìd;@Ï¿^zÓ+ëšÃ¼æ¼:òbo8o}•ô¢úƒÀf¸Üj¹Z Õ9ö£ÙÝôž&¯*…7b½©à§Ç7ꙘÒxðèÍÉir’P ãè­;~Óæ(ò{Š•\?“ñìøâÒ/|żz +{!ä/€¥9Û´ÛÍý~q1 y7Î4oG×Þ@%cS/DÃÇ•Ðj«ñõ#¢ðã yú³ýŽû>ÇOÜ«£6¬–•ø t'oøŸ‹n<(]Üò‘:.%†Û¦Ñbu?2bwqãz»lä-ïþ·ÝÓ€»¦föãq~‹<‡¹½ÓûdIj¾%¯‚þvy<¹oàë/yq¾Ä endstream endobj 3917 0 obj << /Length 612 /Filter /FlateDecode >> stream xÚåVM›0½çW z!Ò†zHµI¥*Šª†=µ=Ö|t#0ÝMýš¨qâlÙ•öÔCdã¼y3žÇ ci‰fiŸgŸ‚Ùbƒ¡æC¬±f[@Ö–¶ 0òµà^ûnì+Â3’ÍŸÿ ¾,6hyb‚| <  ]ÔfÖèc±qœ´‰°Ëîn»½é¨)Âñ]w@gIh3 ±|*²f•„ ¾Ý­ÕHšç H³$ÍÅÿƒÿ äŠMôÃr-ýÃíÞB¬ß ‡zRÓƒ8ÿÙÊ(bQ~…q³ÚîÕ±ç$¤ùk° ÉþPÉ`ùXÜ’ÕZL3NueNjZM¦ÔS%/¬¤Ó´¬xA ²ÉÏ" 4!y•’KíQ8ûªbý{ .Ímert‘\¾Šž³Çš6ºÒE“’J†Cu, ¯ÙƒŒÜ­^6dOÓš•œÖ"™Ùo:QÙ¬ŒY]ˆÃÊ {¼é÷BÊN—ä#DÀ·¥Nµ¡„·5íV'M<%=³ð¸ºº†æí ¿¶­4]{•”¾'œ¨u~ ´R½cØj£"+AÔrÇSt/ÈÓ4þßÊÓ}Kyâw+Ï÷®7W®7ñ5·N¿æ¶'êÏЂnU'mAË9‚o¤9à|=› :"ÛÈóNkól’æŽ%¾cÇjn"„Œ=mk‡= ÅŰ¡à‘'’‘È´€>›H&°#ýÆÃZPN@WÃ㨶(»½cp6œõn†-OGó£…c„sèe×ÁìM"i1 endstream endobj 3924 0 obj << /Length 2242 /Filter /FlateDecode >> stream xÚ¥ÛrÛ¶ò=_¡ILÍD0ï—æ)=“ô2™´“ø´M§…%Hâ)E2Ûùú³€…v-w21°Øû.Vþb·ðß?ûîêÙå›([¢HÃtqµ]¾/¢8]dA Ò¨X\m¿{a/ÿ¸úéòM޶Fi(ŠðО­4¥¬~©ƒ{Ÿùö ÷½|ǣë(Žñô*Ì1Ž­’æØ)=ApB`–Š"Ý­ïäA-W±yÍ2ð¶<4{ ³øpzf¹ `?—ú(«ò‹ËUšDÞ/]³ soìfU’Ž±ìºæØŠkÜpÇŸßOðëH0´¡IÂ¤Õ ˆUEÞõrG³'|Mb[‰ÈFQäî|iàÍ–¿$Š(Šȇ°ÑÔ4¼~Ôö@YŸhA‘ýÄ×ð'x<á–òuSA÷¯Ë<òÔÚ4(ñ êñ Xš¤»Š£ÀS8X/ÃÌÛVݰ5´,èz£ŠLâWÖüíÖxÞ”Æ)ÏVRk´ƒ,÷®ö¥={¸ónN±²Ò(½8&Ífžâ‰ä.ë]E ©Í½½ìäÚ 1árc¿5.ª+×¼÷ó2IõÑrHù)Öím­¬”1Ž=G®E¢ÖåG?ŠÕÆ%I€UÿD¾èPS<|ÿ•–“XqâvÝ©Õ ¸]”õ¶yPӱȂÂ9Ç@éwwldµ•Çʼ`šv;4º' ”rWkž°!Þ_¡h6ÿ;jc}e•ëÞt&^†¡Åíº–¤ö¿1lÔVÚìÈ–ùÊLзXì´S‡ï3¢QO B¯Á2Ïóö ›Ń0µLŒˆ`[É.Š` Ï+Šš7`¨Ï/ŸïKüR´ Äœ’m[Ý1ˆ‚ €šn£ºé®ƒ4Ö·#^>cÉh,¢Ï'ñÊ™9‰‘¥ÇÞ_åÝy§þâùŠZÓÓSÙY:?èuM{†Èq÷*JrËC’9D’Â¥†W¶¬žõQ3¼©í ÖZIáÄØEDcÔÌ- rkn ‰š’ø„‘0LEäHzóêí‡×¼iBx˜‹8s›˜¤ÜÓ{ÏS6@š[AÉ ²lª¿{=Cœ-j}Zf<(êÁOš$ ¥IbE M⃒"ñnö%Gm^ÜHc·Ñ4B¶cU1¦m׆n±îX'"¡!ZþlˆF¸í¼d˧ÿVª=×ßèu× ™ªÞTjâW‘˲8t¡£3غ¶µÄRYeÊÖ­¢œ]´û¹5eãâ¸ì0R¢~{Êe4¢5išOþ1 ü‡Ø£‘ãî£úV­0„xg1©Æ:ýK€„¾Ë«¨<.o.û’È0˜ *å[Ð_R@`—ˆEnI>…Š3—µWsÚ†*ŠOÜ4ªPq"Ý€½á1)§p ÁAÞB1¡òx`€ºm!\é’bBa³Òø„»d®–éõ8Q9Þk ŠŒ¡:Þôóu( âL@éä” Ûª4âúî!EƒŠ3e "‘çÑu-«Šõœd>éùX—œ=;’ŽóìD—Y°.qÉê2ÎSÖ%ÂdeÏõoZ—·<’ÑœXI“Qb]&ð6&j{÷ß·oç2 >)ãA·‰_£È|ÿD1Pþzp7XGwë= æ6—âŠ0ÃØX¬,FXE䬨ەÍdLÒ´éuBøé§èa0nô*ÂIYŸ¬ö–ÄÓ©³ÑN~¸Îäî8IšÌ9܉X£BäIï™/ñÙÚw©Ë×yΛž˜1' øÃ@hRœA¿¦&õEšÅÿ¤ßHøQ_JÜ”duA5¯†¸ÌWPí„}æ!©Nó²ÙKÃPKThŸÚF®C Ï­ëÊr•Gðø,S©­B˜mÓó¦T=J[fß"iÀfŸäã;”µXM³ÝÎðƒà{~1'6áç©ÛV8Âu_ü 8ƒT€e&áÌ:Íø _ n°kpÕ±Å#/†Â9âYÿÕ<ß:ÌC–#ðP=ùPfc“áÞ‡óðÝÞá(ö>¥­±t@¹Gn]8€{<"¿‚ïŧo¾¹àáÍ^uvß…Fäï|K6º‹ÚÑ!¤Ç‹OÁÅlü‹ÇWd kkUUZ`°­àÿc*Õ‰2_q}R•©qDÚ„ïIC–¨Rx5gn( €;Z„!"ŽAÔ!¯£”t…[æÇT4Ó±Ÿo<šÍ)Ô㚇K®SÐ<Û( ï‚ öqüÔ[ËÚVWå_†XNIm7Kpú¶ïÍæ6JnÆ×¼7$9a;?ÚíêL3«YÛOàªVUp«l¬pÆeñ´zb“¾6¼ÄDŒOê™e3}¿Ây6‘ÎÉ]²´çaÈ~§„òy îg LjL…}°S>ÊR·J*j7òÆ$d³¥Q/°‰‹!/y¥’®ó²ºçGôÓä(¸¸ù7T®Ïx€>» nÍÓ„yÝÜ>Eç}g^WGÃÉûsZç­]pý 0úŽÌBÆ,à²Ð·wª9ü9€>kþx`þI?]tª=ÇÎß«¶7…ûdâðzàä\Ûø{úCgí¹ «Á"Îø­èHÅŸ%±›6´Óñàžÿåv(m$ƒÙ=]ŸÙßþ^_=û?å^Cˆ endstream endobj 3930 0 obj << /Length 1750 /Filter /FlateDecode >> stream xÚ­XKsÛ6¾ëWhš 5cÑ$øn¦‡4‘;íô‘Æj/I Jh(’!A?ú뻋iRfÛéðp±X,>ì p–û¥³üiñãvq~²eb'! —Û|é:Žíùá2r];ô’å6[¾·.ëBª?v«uZÿˆT­>n9¿ð¢ÑOµµöÀkñ¬ƒ„­û1Aêû‘DÓ?žç”a8XX2? "ð–(fF Q÷ĈZó8•hó(ެíaœLäÜ•’-µÌ=ë½\ÞAæ ! º©lÒB˜Ÿ5qw­ñÆŒWUw󌡗îx#Úg`0~z.ø#/‡}ÉLÆn>Š;‚½É„1Na ¼¥ÓA*; wõÔ° K8 ˆZòê Ûú•wåp*Ú'©5YÃÔ.NÆÃ`ÆÉˆ¬Ý"ü’«ÒX+ÚVV%šC;½šðÙñ²Am©ûîÞ†O í穟?¸ÝØvü~·C@Ä’.³™ãö3û/F›z`Õ³yÐO‚ƱjÌ9gBqY<|È#m7Žaëž3sÊYeC+„Ö™*$ðí(Ö=#މÔÐvâ¨ga‡êJ<˜æÀÄ\PúŒf½Ù¼}·yý x»yc¼Ý$ðœëP‹Óoœâ¾.cv…½"_²]X8Iì0ˆOLÝ @P<ÞÚO4jÌ%œäìbÁ£×|…È0HQ5Îã=œ?W›w\×\÷¾ œZ!³]ðÃþÁ ,Ý™‘WÁ¯‹õ“ë[›¢gX‡¹XÛÏŒÈöÂd.bÜ»ÙñøTP"§1g·fo£k”$L±wštbÂóö ¯¡z 4¦è¶Ïü)’f:ÉRC% %éñIÎ9Ú¨6p`67üXcI2gß³wº„…þ`ïØ{L²^¼€¥ÇúuÁNÓ•ß®v˜[¦á»@3ÄN©™b†T·DâðÃ÷U×Ò/š˜ž2ÍJ§‚MîÂa´ƒVt WvµC4ÎÌZ$ÁÈýšï~»ô_¹ß¡±< v´ø·Jgpžnü­hŒª‚g ±oàiïn§º¦Eׂa¶_ìý?Ÿ`aÀØ”J[R?e±Ù.>/\]иÃ+ƒÒ!‰¢ez\¼ÿè,3á¶—ÄËkÍz\úàD‘Åòrñç­\?•Lc6ì?ôa±$´£0š<•ôŽ6r¨‡Æs¡ ˆ‡òJÏjéÕ[ÁÅŽbn„µAE#œšB¶Ê°æÄÒv;jJOËN¥˜ËÁ,>nìÛ!D·'àC883OF.$&¯¯ÓÞˆ6md}¯VøZ’ NñF“Þ>¶ã-åÏÒµ@@Q/ðFO;@RPNì:e~ÇOA¦¹½ ƒfvº¼jÏ ¸¥ITÙæ:é[ÊEÝfßôýÔ1Ï!¾Ü) I ª½»K= Ægø$Áðb˜wÍÏ{Å?é‡$âÛI¢¡Õ¸"öÔ\æ¸,[3 ó¦:ñÈKª¢f¶€î.HJÛ§2£dê[\&¯d6¼fI5”Êý)àuÖÈ«÷Z_þð1E~p> stream xÚ¥VÝoã6 Ï_atæ µkKþÄmÙÚ° »Ëía]W(Ž’h篳äëµý(Qvã4ézØ“iŠ"üÉÀÙ:óÓì‡åì⚦Nîç IœåÆ ƒÀ§Qâ¤aè'4w–kçÆ%q2¿]þ|q=Q?KsPd„Þ-çuo+ÖzEɤÔWfµtq{w½á²GR`RTñ^²-Ÿ\;õuÑ>ê …>Í#‹¥-…úmõ/Ô_A4†:Ÿ{q¸RŸù«üû?gbÍkuÂ!z:E«õÓÈ ‹nÛW¼žSâ*ù"àÿŠÈ"5IHšøyFÆ ó¾cjîQJá.`OÜ# &&=«Á s?LCÔ3áÕ–s’¹JubÕ+’ÀÝ4qŽÚ”¨·> "ĽäÖ— ¥Ä ²¦(Ù·íÜñ¦S|¼ÍÜ ÝTv:€ó Pó8F¦î¼’ÒFx‰qÒ |£(rë¦ö>ö m Å”@a“z#Ï/¥¬òù_ÌóÄee¼xŸØA ,ÐlÍ*ã$¥&Ç‘Ûls"ïòYœÚ‰þ ™‰r‚ŠÉ~%ù Çê.xYJ$Mt»¦Â?µãV²[Q³ò™}ÿ5åê3«Ú’Ë×?ì ”%Ñ+èHy†ºÖL1ϳvUw²be9>ZS ƒíZ_áÓ^H)¶5ÒÆ#CpaMÙhh6HuÜÊA)é22‡cñ±µíš¾•(øgq[£- d#žÙ6„¿dúK3C£|Ò¤²Àžt¼-Y1=\¾}õ,6jº´¤Æ€0±Ô÷¡M9Ê> stream xÚµW[›8~ϯ@éÂ4¸ø†áaÚíEªªîîLº/mx*Y É¿_Û`˜Lf¤U¤Ø>>çø\?›ÀÙ8óqñvµxý!$NŒâ„ÎêÖÁA€( 1 iì¬2ç›ÛÖlÑ›2õHän«úF¶ÞէרÈÒ8DQ@•f-E¸¦E`{¿Zü»Àj8¸?' Št·øö#p2µùÉQ[qäÜiÖÔ)‚Ú¹YüÝ뛎ÚƆÎà… ;!ˆ±Μéu¨hð‘‚âwÝhQϧ¡¿Yˇç±aÆGU2ÑÅŠ(9§ÊÇ!C4bj‚QÌù°¿<ÍNÇ÷Wz'˜È¥U-Q»­e³­ ëñïføòõóçY¡,o’¢¨îd†²¤M ò÷I^7OH‡VÚŠì’¶Îï/;qSW‡=ZŸm_žÉò2묬xŽm!Mög‚®‚/)ä7õæ°“¥G‰Û6g ú‰B¾Ÿ Ϩ/E¨Ê°/®¾Ý<*º+ÛÊ´¢ÚRÍ)ÍÂÔV«¢9Q>®K«ÝÇÅñ|u=m›àȉÿ³,Žjthaì´ …­»¼ÝZ;á4KÝ(Fì‚kI+­P»5àCÕ,·|¿<Îݤ8XW“ÚNjÙ&yù—ígú~-w¸ü˳‰ ;ÕâØ-º4† pj'3˜“.-pÜi ²4\íÖ*Û×F¿*x+¤íDžÏvߣ š"Tq“¸+¡"o4æ¤ð‡MwøϨ8t•‰mÇ­6Nm2Š 8]ýßÊ •Lå.!¡[Z3é£bƒ¨a>°cÓcùp'ŸÁ„»|´pk­e#qWª™õìÂÚ ãÑ,4^ÜÊr©¬±›À¹ë¼Lê£!uôfo¢’æ·Ç¼ÜâÝV]zÐ+Ö Cƒú0dè¡Ò="L`“u! Yç·Ëé.M S·¬,æwܺô˜{³­E6ƒC‰z›@øþZOŸ}1¹d.ŽûGÐÿñâмS^ðýu-ÛC]6}.Œ õC‘Soœnzý ¤*³aDg¿[;›Eó³oÌÁƒ­¿†ànï‚8~Ø(Bwñ]¥ìEÒÎC}ÿ7û… endstream endobj 3958 0 obj << /Length 941 /Filter /FlateDecode >> stream xÚVËŽÛ6Ýû+ˆl*C‘zP@Zt¦“ɦéŒÛÍdPèÁ±È’#RI›¯ïåC¶åHSOá%’÷ðœ{Ï¥LÐôëêz½zõ–¥(ÃYB´~D!!˜E JÃ',Cë Ý{4æþÃúý«· =ÙJ3‚#JÈlº )Ôõ?×y_v~@¹W‰wíGÂbQªºk¥†Xwò›õêó*„G‚ÂáIÊ0O)*w«û‚*X|`)ãè«ÙºCðJ#Ï º[ý~À;²(:UœD!Jâ³$™!­ù>6slAy<¢8ã! ô‡§P~À¢ÈËíp'†ÞC/wÓ¿Ÿ„~/Ý{a¥™«ìT×ÚQm…}f&ĩיnᦖª¯‹A³Õ3±÷Î=x =“tPZH mYìD»ˆ˜{ººUVê|Ahˆ)dÿ±‰'3–Š9ÇŒ97B–}½7TN3}ÌøÔ–$d8"Ô†¯·µ Œy%€×¾ø4õD[‹¶váqhK§Þ¤©Ž‹Ñåa¶<¦40Õ~ÇÞ'aj‹Ô¥rk£Ì›rhr5Î×'î¶3{ã{Hª¦¤$¶]3ÉF ¥PŽSά”?d¾³9ø>'SCŸådÙËILºBkƒ§ðIRëªß ;ÑúŒzJ>Iî?HÙcÏšiRÚ4^:Þ"ç5I¼àœs™ÀI2o„ÊëFþKÝ 0N”FÞý/c'WÙ´¹t©ÕI}б±§:‹q°Š}:EÏœ9ÅNæmå(,]¢Ó~Ž-sù¡éÔ ;MDÛøK-‡¼©ï7agÌ!f‹ê2#ÛÀ@œ,­ü"sÿég  âYq7ê­PCßN{Ööñ¡ìr·«Am»^çMŽmñ\ÏÜê3!C¢w®°wâÛç¡VùKÇ$:¿Î×}WÎǘŸ{QmUnq×o~šÕr1dÌ8œÞÈn¡iá‡9ê7h|¼]naW†i;,$çÁѽIÈ÷±Ú´g÷ÂÓõzów¾Û7B^~WrK¢ƒ&šÜç§ÊU®+ÿb_ìÊ¿ä.oš£ L{h/÷ïç¸üEˆ÷:°ãyÑÐJ3HŸÜˆâG;Ox9G`Ów×]3ìÚ1ÎþËN$&)¦MõÃÁwÇŽ87P9ƒC̳ìbËø2†lJ\m{!·]Sá¦û:QLɬÒcÀ¶Þl'Ì&48ͨ‹Z*Ü%Ä…:,^ð7é_hkÚ2 endstream endobj 3876 0 obj << /Type /ObjStm /N 100 /First 971 /Length 1578 /Filter /FlateDecode >> stream xÚíYMo›7 ¾ûWè¸]d‘õQúl6¬HzØôà&o×l®]8Öýû=”ÓÔ‰ííµcc°KÌWzDR$ERŠ”]pR’º˜ì7¹Êö›I1¢8*шêX šƒãlØLNØÀ’³¸Hq"‚]«Ó``-Nµ«K‹©ì2>¤r•lª°«šG!ˆQTl(UÕ˜C%Šdc ³$d¢­­öÁbÛC%Pm'm»¨¡ÐL°ÕÄÆ®‚ÊQ ¢BlÛ_©ê8ÀÂØ7•¶¦`ÆÚ0ÆÀå’`‚|Á¶X’Ø$9ޡŠ´-Çh*‚‚Æ ³šÑk€¬$Ù(°KÅ PAenL µˆùÊrcGFA§ …%0X³mH̦0”ÁÀ‰l¢Ú'‡¦ ,ÃJ6ÿˆšÂX4TØS4˜R°FLT—m̬•“íba…dc6ÑøAÛ¢MpBdc2­„\ÔfÁ˜6ûˆXàÀ µ€ˆ"Äb©6&ËÒ€q‰Ô& ®ŽµÚ&Ñ ¦T  Ši†xQbÛv p³+Øž2‡h§œÚq*ÔDPͰ´F‹Æ ‰ªd{„DMb¡£kN¦Q cÀJ3¨B><=h–Qû±µš0—B3(Î^ Å´ƒDcÃE—DÚ˜º-$á0€I¡^JìuR–<8: _ºs1ÁÁºá?ýl§È‹1—ê3ü<¹ß ž>ýý_Fo©´:õ §“¹;:rÃcäK…mÙqZäßÅÌ’ßíŒZŽýŒÃ©²Lj`8|5›^œusw^»áëîÓÜÝÉzýÇÇ£_ºÁðäv“ùµeÝ`ëÃÓîzz3»èl ‰½}ß]^žO?¹s%Ç\ù fXmÅDÀg“ÉÜÎÕÄôy ¶ó›·óöýÝÕä·ÁðùtvÙÍóðføíðdøâœÚ‡éseo VƒÇI¥½•$I¯µõ¬YïÌ ¿™¾ž:Xÿ«Ów?ß}è¾6›,{%/y¥Öæ”ÌŒâæ5.Ô ñÈ¢ýБ“½yKa"Ó-Å3 ñ†`º?÷"ë^0-…ÖXá¾Ú=˜êj0•¼]0-ï½”-\¶ ¾;£¡z«º‡@kRo NO4xS_µ`ÄÏc“Å’K‘:jYõ6NéΩ£Æ¦|ÞÁžrˆHòÍ å‚|m Oñ m‹(ݘEκ›ÙhþÃÛ_Áe9™ì%£Á>X³ ¥2šôÑ^Rî¥Ì“'gGó«Ñøä\âO/G×ïýÅxt}½’ójÞâ-ƒï¶dŸ9õELŒ+Ë!Ð1WŸ´7:Y†¬}Ñ|¢¾¼%³·Æ³šÐõ `b´+ÔMHWAê^kÆRJÙ5‹TZm@ìN´kͰëY￾«Y}:E;„x4kú5¡q}íÿ|+Z)¯Fi¿H¨V"Ò‘° ¾;2š¼hÞß‘ÙÙ4WMüi–J­=ì±Âr,>fD!‰g»ª3î:H¾ ÖqsQ{;ë~ïfþãhì¯&嶺—=tôràÖ±Å}î6vv‰¬É[\á’E¶'š}Þ jô"äwÛ” 4ö¦‚+Õ®9¹m1^^}x5žî±ÿáf¹ÓG yDcOuŽ»ÑüfÖ=Ti-Û$~^wcÃq·7Î~h)É+SO4Sô”óAДî¥ÿ¾Ê.kò¹<"ŸË6ù\ÖäóTQ­…ú¢í5(kO´*š±Ú—w¬ÉÛƒj?´àr{k²šaI’ÜÓšûn’Q¬CÛ>W/‡âƦc縌«÷V{øÝ9sǽ^W)Uô鸞¢¥c„6“YÑžØ1^6_WŸM.ÞOg0ÆJbŒ[\ï¿t¹Ñz°=’‰öDkÁo žèˆ$šÖ½æ®En^Aù‘ItcS¼Ÿ¶ªkBWºzûäbÿÚØÿ³-£0åHŽU|ë=ÿâ‘ãÅh|q3Í»ç£ÙÅô²;™¼ƒßÕtr½ÇDÑœ¦t§œ´ßü·Ê­ê´¶ Ñm›n8?amŽí…þNÿœ endstream endobj 3971 0 obj << /Length 979 /Filter /FlateDecode >> stream xÚµÛŽ£6ô=_aM_@-^ƒcöa/“J«ªRgÓ¾LG+Pq 3íß÷øf•l»ŠŽ}îW‚2DÐÏ«÷ÛÕ› ÷Q„#îs´Ý#JfGkJ1gÚ¦èÞÙº‚9MûA–eï>l?½Ù°õ‹8„DM퇑"Z«äv»z\Q ¢“|¾f˜ˆ%Õêþ Ÿ "ž5i…0a(±%ú¼úm’wúÕNÁ±”`PÄÃûa`8r`âïã#AGO6EºÜIÜ:²t=ø€¸ çbÈ 6/²\öƒ¹î5mÓiŽÞìᨑ±9gÅ“¬ÍMZ¸u*ˆë^ESÇ¥Áê/=$ ”í`œ‘‰ÂÐ9h‚$¯‹ÇƒÔÎ-œQì_nV²P!ä›ùFûGÙ']ÑŽÆ%ç¤T¨ã#,"jØïäpèT$Ó±aS:’pÑìÍ7“µ$€6æ@6äÒ\õC×Ô™™0ÄÎлƒ¶ÊP7G:€GÎT_HYÕº°6µ4"l­Ïbà)ÁtmÃÿ{grÑõóPÌ‹ô$c}þIBÒìþ’Éð”!P!•Þšµ÷u¢Ëùå‹ÛÅe øt†Ý¼ûåó­%Àƒ"z‰‡ïºìPAH˜oCò­¯NúoVkíçí÷±¨î$T¾MÕ,ç΂ˆ™RÏÊðè‡c¨^£ZÑ–›JçÐË«õÚ]¬ú×C¥*o§ëPvó6°éÖ6©AaíêL ]kÚT!7ëUÛWúæQsÐ3 0ºu.r#˜º™YÒf<þ8jI àú>i:Ùã«}…b¿ÜÍÛ¿‡Îމ6îâJ²³ö¶qßËt* #~X .C#xwÞ>Ã!ᓆj'Ó´¨³Óʘ÷¡OÄØŒÜðþáF܉˃¼jÚ'°ŸMÛ'•(h©f1K_›| W\µ¥ì/„ñ`²O€}ö‰Nã!Vãï¦ÝUÉ—¾ŠËòfœRúÙ#ðìYg^H–°¹ŒS%é|¨Î&â‹ûû›6‰o”¾×tþ`¸>¨êW@ßʤØÿcÏy‘äÓÄ'ˆ:ê2V@Þ< ŠkËu4ÃÕ Qß—†>Õ½7¯Ì<½´=é¥Í\¾ºÆn\ã|µÆy‹;œymBqé6G9ÇA þŸ}ŽÂjrñߺ+ö¹ý˜Îï»Ò5*K+Ý™O⩸0£ endstream endobj 3986 0 obj << /Length 948 /Filter /FlateDecode >> stream xÚÍWYoÛ8~÷¯ ²/¶bxèò}H7vEQ ©³/nPÐ2íh¡Ã•ä´?¿ÃC²åÈŽ]¤À"@H‘ùç›1AkDÐûÑ»ÙèzÊ#4Æã…h¶B”ÌýE”âÑl‰æ ‰û0ûçz²=RP €‘&š¹1wÊÍG™®]; ׃ÿeU«§#b%^O}²ÇÃk™x,‚CnXÝ×b-{ÏŽ­ÀÎß×>F1c«S¹™JÑl+Y!6BSs £x†¬\ü'“æ¾&ý«eš»^@ˆóÖ,tªXY)=ZF‰7U©ÄÉexzóáód~!2Q$/“‡†c¬½CÁ ÔD²å7`Þü¦ZosY¸œ9M}2/Àxö z …x³6‰nÓüN.·‰ëqÙ9„΋žPÏòð¨ÃýÀ]"VuZFnSšu[Ë‹åîRálé·ù®`dem_™u—Yœûf•„Ãâbåv©w¶r÷àã”G»&]XTVîii>²R,Ób]_¬^—égkwgü ÅŠÂøHºÔùæzÔÙŠÌÜʽ'¬ÈÕ;eE»·.ÿž6†Ê"Zûùg+vi=ó]'%„ _l¼­Ûóìžüh*aÃ!*‘ËFVVߨë6,.†%üáUгÙÞ=/]Æq@ÂV‡#AìáƒZ÷ãðø×‡ŽÈ¶Ã~Øoô¶®5=©ÀA²•ÇJã D›üù&“õù]%f¡ßéa>fZD#T;¹Ú,òäk‹,»j‘U£1ĵrw$C·ýÉ¢å>ÎïÞÏçW›D\=<¼17Ï:Ó1þ0÷7«F¥½fj`ðî¯Þƒø7hç0S#]ovw?iõMf£o#ªS”vƒ'Ç%ùhþ@Ðî@_ˆEŒ¾kÊùÐá"ŸÃ>CŸGŸŽFU;ý”«CŸ"û8Š£Îz=Ã,ž.aÐ{Ì "i[/ï%¸ˆ±SH7 ©Ü€9²îGuQê:…£•NgجÓ'© +ˆœDQH@-X²ã>aÃ!TÌN1Æ“Iù!Žíàu+ë¤J7*3~½xϪÝDf-8zYèj/»VSHQj×D‰«\”„}©ì_s’ì²bW6é•1v[ôÒ;ø? \Ãèæž±Èi­:Õ{(#˜]óÙeŠÓ“Yû²×étìÏnuw™Ò¦G ý> stream xÚµVQoÛ6~÷¯Š“€š!%’¢ö­IÐ"(°ÄÙK–N¢mm²¤Rr»üûII‘s‡~M¿ã}÷Ý‘8Ø8¸Yý¼Y]\ó8ÈPÆcl¶Á%”)!ˆ'Y°)‚Çp‰$Ô²î¶J_Öy‹pßè{Õ¯óJv]ô´ùpq¤3˜$ãHàœX€˜c´Âƒß‹kŠgÖëÑ|§0™¸M¿EeuT‹­/ ‡Dk"P&†Íwª?꺋ÖI’„Ò|høÙ\å}£Ýt³uß\U•Õò l8««ÍêÓŠ€'‰gˆð4È«Ç'°ø!€¥L_¬é! À[JMàUp¿úõÕ±ñœyJçŒ8%!øÀü 만Ϙàl è€/#Î^A„L@*Ó4Ô#áÅ,ÁIþ2yð’Àä*áßB‚ {dÆCŒ¤îïT—ë²í˦þ/)_ï•.{“s’†[Ý̈‡½¦^¤ÛÙXaʲ‰¢5M²ðý¡­TDƒª£8 {U¸ýYÖÕó€jµƒƒê÷Mz 7Q”]+{çÀÍ´GÝ‚…›N>îÕ¨fø!è]0ïnN!>9d.¾I'Ù_B",ën;J½«šÞA¡zYB”é«9¦"C˜%ÿ¯Ði d©ów²—çˆi©f§ñbñÇÆ25ö}ôKcâ,þ.úwYÐ ƒÆ${µkt™ËÊM4ãxaõ¥ý›cçæmäv$sÝtÃlWÖ»J­]›Í ¬(A¨×ÆñÝ'аiyе êT”îhq–5ˆí Mðoa†Ò°•ö±í¿ÆdÞÍW¢fdKÔ ´ת·¿ÃAÊï˜a…v ]änœ…ªbƒš²QäÈ0êÿÉIÿÁPÑ?·Êss‘„C±œëÎ\R‰”.㟸£‚œpG^$*eæ—l1"¶ Št&°ªË¿Ý”cʺ0L™6­ .0šÁÀ™Y˜83Î|„$ÒGØê/»N>›ª4Hgsæ8G˜NwþŸt^¼w/}(`{Îyz2òåq3¥ñôåÂB"s/6> stream xÚµYI“ÓF¾ó+\œä*$$µÖÜ&l•Ã)pÐHí±Y2ÝÃ$•ÿž·tË’ÇcìIQTáV/¯ßö½¥Ç_\/üÅ«G?_>zúR¤‹ÜË“0Y\®ï{"Jix‰È—Õâ'LÂåçË_Ÿ¾LÂÉVG^ D›.—™pTÑê•TÏ‹¾À|sÑÓ—‘?9êÚ³n˜Â¤` êzØÈv)B§×³ãû¿@.š2-Ü ÷D1¡¢-×Ò²ßãa&išxyZî/Z³þyÙB᾿{]â‰ÜtÙ‡ã—E™ÄãeÝÕÒçOY.§_ºBDεl¥*zYá§p®–aæÜžÎS–{±/xY·Õ¥±ówXŸ áƒrШØ[ÉUu×€G”Gæ&¶ûÎüª¥8Ì€·t£(r.×µæÅ²h­.H)ùCoù«¬?ù"²z¨ÍÖ®•¬§nen@Ýà/и µéŸöOLUå%I6øSøÇ¤¥Ñèçkà$ bT“T²-é3rHe´P÷Z6+ž-4Ïɺ_KÅã‚—¾.ÃÄí;Åß7°Áîím±‘š—ËN)é"›À‰ ðÌã„92šëÚ wædúe*ÙœÓÜ)eÓè'hßáËsæ)w6E¯êofmdh$g»fØ´òª”¼Ê¢°èyÄç1þð¦L¹Ax"÷ó…q¿“3Æ{9½˜a‚&ŒI`t³®KÄzEF3ˆÑ޳ävFZ±ï“ǰ5çË Õíé¢üNÛ‹@Ö-Ï ðS¢!Ö{±p'„lG”¦6;”ÿ*éC„ò±gˆö†‚#I¶š19„ý̹«~Ðf}gÀC꼇ÝÈ‹CSÂÝÈúzÝ{ êPöuמÀ´„€µÀ”$5T’ÆMv”öæÉ^‡A}f**4ZÏ‘¦¡À$Ÿ„ºÊT7o·H[³ð…’?²á€]j7ŽÉß~b6>ZýŒ›l.(M9ïž]ŒV«ö4@¦(¡)Õ†º©PþS³²x€`®°K¢ÅV4±/ãÍ ðúÃ/÷ÈM¬ö@™Âÿa¬¹PÁ»®%Õè©£YF_µ û2 5msûCmQÞeyäãÙtœ‡(¹toë.@þ{Ä:pŸ@îîM¥6­¬¸wuqì%a`I~ DôÇ9@Oöö =ìó?–ò¿|zÞ7‡ê4Ùux\©ƒí¡ÑÍÓy·Ke·Ù£ó²Á'àœŠö£a4þƒyÔoB¯íÔæôˆÿŽâZá!7 }çuhj}˜)šúï‚C(.u­í Lµ½/#x7è &Uèš×ŠUOVa5 ÔHa¿É1ÅÓá<ðݼäõéâc&£|‡¿#w¿cJ8OyXêâ/™ SÿÇïIÉLÁé-u?©¦§Âº ô‘aÝMÞ||ýúÉŽö¡*—²s‹9—±-îptC=¦2û®´£ã_,ù[37Ij8™R—ƆaN…@o®™ yv}ò—ÇÿŒâdØàm†55¯SZ›³ÙùH$BVgqúªì)htÛ1߃¾°L;’òÏ•MWg ÷¬ãÊQuž€6.\AaSWýúžêìU1h]Û󃺕Í^B¼ë›gJ&·g€ë…RcRà§¡½/ðµ–+³ÓœcwÝÙ¤¹î4U»û+ƒ+Œ=§·Z"†Ä3ï÷oÞ+€a‰Âƒ£z"ôD&fŠk½^Iy†ò~ëÄ"‚®ŸÂ|•Ÿ‘4/®AmäÕ0Þ*èé5W¼°Ù89, š5ChË;[ÆÃžbk’ä·ÚBsa+¡žÕý¡t™4œ0MÛ™õUª«NŸÑH¾S¦Ç2%!µIÝ5¿ypI¾¶ÀQÚâÙúÞÐC >ÓMwœ?àn7) X$Ô+hPšZKž«m-€³ØBJ|Ä¿Ayóc ÆýöMãþÇ<8¨äªšžœ“6têÐkÓã@HúÓOSAèÅÙøT%«š²òÉ%÷h¡}è…ù3O°¾[’E©çÙ…½br˜zYßyZ§ÖiÓ» 8KçÉ„uþÖeGÏj8æ¬YØ—ü*ÒìFãU<®[.ôÒÈË’x“¸÷ ÍÔ âñÏö k_*á…Ñ‘øAëè» PY0óQìLæ9#Ò¼ÅδÌlŸ»©BÏžŽÎ…jï|Q‡]4Ä]Z‰Äæ=˜›·ëš'Ç.›†%±I¦v® y…^/aa¤Êzà¦a?~9øúãükË‹ËGÿ‰6ñ endstream endobj 4021 0 obj << /Length 2260 /Filter /FlateDecode >> stream xÚµXK“Û6¾Ï¯Ð‘ªq‚Oç䨗Såì©ÝC¼X„FH(R©Œ'¿~»Ñ ŠÔÐã8©”ÀF£_?±º_‰ÕÛ«ï®nnódUÅUžä«»ÝJ «4_RƹªVwõê—èn]ªÈé¶ß÷Zzý¿»ŸnnU1Ù§ª<.…®~G’+$º|ÐÍm*&Ô›@¾I XT´éµ´múÙÆ3ƒÙq²„­".Ò‚%Ü›õ&*:hÛÒ¨̱§a·£ÿaoyåèÖuk8?Úšúäx»ƒî44¶55Í>a™¦[ÃßC¼ÞäYÝ¢U:Çùø.0¨½2Amú­³ÇÁví(¨ ªmÀÐU–‘ª¡2àc†}ç­»¦»\—itŸÊèØÝ3Yoxðq8i70Å »q~RDf ÝÐÿ+Óð(²ŠÉØq’ˆ•[óðÃÛ«Õ/› Eïì )b)d~ók¼…í1픑Èb¡äÌ_ ÄÏñ ç¤p`ÜoÒ\È´˜sCò2N &?›¼Né†=NÓh`€:ÛÞÓJmÁèf0DÞèàÅž>붦/ºé;ZÚ=`ÙާA£ËÀ”™¨¢ô¾!ÊOB¥®h²í”·¡\K›íýÿA©Ð:8û%¾ 5E:ò(íeœd%ñú”Hq±g8’!_um?¸ÓqP$Tü{*,’88– †æµAe[ÃD„Q Ð=ÆPÏAd5IØÐƒá/Foq¾'¿#ƒ“q4Ý4QHpÍ‚ '»óˆhÖ9È,-0 øÀÈËõpƒã¯ì¯g…×W%ýmh•Ô„9 h€£ -_¨V°jÓ ¿³Fx(¥¦º0” } ïKZT©@•è[mÿ°µaÂÏxæ#Ñò¦b"Î|¢›òdYRŸæÐºþkw¦ò™(ÁRy#¬È2ä=,TÍéÐö<‡ŸC[zÎ| Kã÷vD^óÙ¨'°áƒ Öd‹g² ¡mÖ—~@ßSø"E:¹“, Sœu¦k˜ï1Üe 3À0eTöfzáIŸ¶AsŽ)aÏ;XXÔK)èèLm·œ²0¨¹ûgNú³àÃ…"Šb¤  ¡ûÚ‹4š(àZó7§ùdò·¿I~˜¥±s¢U=ü?Íbæø×2WWUñ€¡*ÎBª¬"ólß{€"R½àû 0&ûŽ›`àSÄ.ä]㕘2ÌÑ= Çr2‚Ëɤ¡Eˆ—À‡µª*ÜÑzì †°Æ`òaZ2æ/Hª©Ò¢Æ_h••¬‚’Uİ7[5 ¿Ø5'Ìz0²íÜ¿ħK•Ĺäg“ÿ¬+ì~Næï¼h¼Û-4Mø(sî¿H´§´Ú2/•O/ xÛ \™°¬Þ,°;ôE/!;Íî…Ì}çìVó½õ§Od³'ÍtÙx.•ú+oEi\æcÏìÏ—˜ø«ÿÃýqÀ±Ó. >«S2(dœ«ôæ}L9É\¾få²máÚS‰ê/H‰Gͬ‹‡húû¥&È÷-ý¿ì{Íi§È à¯ÆßÏaáao(y…ª ;^q…´—ešÏµßkιlòõùšFº%ùáˆó#5;|ßô;ÐêØ·tÃ9ıè}¡xÍûBË8+²™ órÁÇýNUtÕ©¢½5Ôçp÷×í1Ë=Ùܦ@B‡˜Ú¿T“²‘—çëû öþÀÃÞóiéÀ±á‹\÷Çrî¤GP‹j^4«”ŠfOczÀÅà\ä#JxŽ—Œ3³˜Š¯ŒâŸ_¾׊_´p0à^_ü;þR×wêf)YÌ YK•ûÊ4uÿï“\í#:Ó Ïû7ñØàmÆžûè¼;jÙ¸ÉËöòs§àn–D<›Q|¼o.0§Šœ¾ÿèûFQÌÊàÜ÷Â9b ÂŽ !ö;u§žÖÙ£J&ưD¢:‰;57 €7Ó3=ñ…iš!9Xî …c~uyÛཾ»Ÿ6*­¿Žƒƒ™wÕ#…iÌ›åi¯5 ýëèhûå wYÝ>„KÃ÷=ØsËFÖ ]’Dw×ôOïÖ8V¢éš††Étƒc¿‚fÕ™½i{û?Éâ÷w¤dx½¡Íhüøú¸Æl^ñƒœÿöÚ—b‰ÏÚ4ÄÇídQ¼eY.bQV"yþÝ ù}ïæ—ÿoî®þì÷£0 endstream endobj 4028 0 obj << /Length 1038 /Filter /FlateDecode >> stream xÚ­VYoã6~÷¯²}°›¦n)hRl\ HöîK6(h‰Ž¹Ñµ$Ýô×wxÈ–lÙ›}â5óqæ#çÀγƒßG¿­Fó…;)J#/rVÇÅùAäÄ®‹"?uV¹ó8ö¢`ò´úc¾ˆ¼Ž¨ï¦û€£eV“ÄsR‰ åË—‰—Œ©ÌÔ°½'ëÉL­ ¡PFØ^>_¸7³x3/†=ß Þý eSоâ¹'å(Ю$ÎÌ‘ŸºëÇÉ,ÄxüPK3á»êZƒòÌÅ( ­»VNÖfd•¤(ìæ–šÉ’î8‘‰$fÝì…<ÛCAíd+e#®çóg&·»5Êêr.ˆd_IAÖs¡!f¹Â0£`kNøëâÃe°r‡„ss†¯šu™ù/W]9ÏE)ÑõmSs3ÉiYƒ€Îêjj­o &Ü­×_i&[BZj8…צUf…H•›É·å¯Cf*ëБ֯3Ë ¶üÑá^»~ˆŸÎ‚˜+.ø¡{íÅø€¡yˆ{<4”¥õ[‚„[N^gTV=[*3R’m{´¼ÓÓ¸’ìj_÷…Ͻñ%È«òÏ„3².肹ãTü?ÈËŒo0´ûÉÎ=аßZð¢ePýýOˆ§~žÀ kÿ<©²mÍEïJ+Ûx°² óÖ¨›^áæðµ¼O»Qv"ö³¥½Ø¬ Ùä|B§9ËTnë}ß×Ö«±µ¼%̺H¥9¾1ƒÝšدs]W¢ïØ/&%þMªª–:%‰÷>ãmžÿI%iíêæ­’,%ÈçûD~³ÿÖó³\Z2ïª\]Õ­+­Êèn5ú6rA;BfBqâdåèñ ;9œ6ªÄù®%K'€òª¸Îrô×Ù’§ 8T½N’¢Àu|?@qh³Ýj_˜¡(«‚|Z‹£°â¡4qµ=ŽÇ|ºãö×øa2¶o ³>«KµŠÇB_r,£J†:ÝìT%õÆ…Y¶Åï Qž‡"xñw0eÁ-—ú(Q­ré#gzßÁÞâ¸-R½D‚ü¤%tËT@DÊŸJÿ³jãÊfTõ ú@µB¯i„ÌVÑé‹ ×ÂŒ˜Aôú(š›]E™ 4…[÷4€Ýb@j S«müÕÑ_9ŒŒ?ºÎ«x¬däUɨx¦\óƒƒHQ+s¾kÓ¸ÙÊYI+,ÂÂ@;D‘iû]žbÒ QÒÆñ'¡º¦7·wO’œÿã*,µ»©n)Ë¡‘7™aÚcÙLsD„ ý {eήõ eì2ÓH œIâŒÚæ$ý<|º¿Ÿ½ÔKO,Ä— AeÓâ'ÈV©¢ìy»ÞשŸ‰s Ýl³“ +.nï—wÓÁ—…XÿÓYm endstream endobj 4035 0 obj << /Length 1382 /Filter /FlateDecode >> stream xÚµXKsÛ6¾ëWðr&¢ |zp'r§'“Ôr{H3˜„$6¤è¤UÿûîbAš”éXj§i…Çb÷÷‹]yÖÖò¬Ÿ?®W‘o¥nù‘µÞXÌóÜ€GV̘©µÎ­Ïöíþæ›ã'¶l3üÚ­*Çí;g Ÿ2Ï‹ýV9_Ö¿\\ñHUFnâpVâG!.Zxæì‹+ÎG«—A”¸ ·@'Œ´§‘Y]Ýw­t²ØîZå,Cϳ ¯«Ëë›Õ[T —`p†´ïA6wµ’“Õë_oWzí2ÕL6üá…Œ\àÞØ(–€A¡›z ­»l¶]%÷NàÛ­š¸sü}ä*b‰¤Æ³úîO™µG€Là‹#7Mü½Kg}#»F´$×pad£÷»ÈMKŽÀÕj}ê\æNæ®PJ<žnÇ”2GS¸Jpà‘,Û‹JºÎ’sn¿“Ñ•--+Í¿Q-oÎ7¿‘y—µE½?Ýòw\œ‚-¢$+žt F“ÔÖdn§ÌÀ¦nH(’,7*ÚFìÕF6ç;•:ãöÅkåV6dâƒÆ1k{‹}^d¢…ˆ¤ß‡]AÓò¼p˜m`P4DÎÿ«³Üä¢g±‡ž]ª%©Þ R;ÃijÈZ„‡À¶é$¤ÆàÞv'I¨d+´úWV—]…(ÐBV{Ü7“RžÐPc–ŒaÓC <@<Ãù·××® â¢*JÑLÕôÑ&sß_ß‹ûOl¿žù·ÓÑþÐUè¼ñÏØ…ˆë°ÀÄû”îëæ?ðÆ4  è„Þ‰¬ \§G9À­ê{Ýß%óáBýÓòAUk/òÁ©ÃüD‡ùœÃè4AFœ{¯ú>îðÎËÜ?4  oPªà&LP07Þ‚nÆ7u·Ç|Ï™w3û¦IÝÌ3û¾©5s2©"!–s!6Ã Šš“0bnÈýã²á´&ìø}'Á1¸`? õÕã÷ × ïŒ0‡Žk† @ ‰5CôÎCXúÄœ+Ìæ+‡1f_^OnV˜ãþM„—O§¢ÀŽP˜d*4³Ü†Î;“šV½+°¿4;_ —`ãfu~ÄôÅàÉñò±1ï,}þ6õ,\׎±Mè¨!/Äv_«ž\Ê Àx±•j®°L9:..sÒÈe'g Ë#“ J|2“p(QÖñšxÇCÑîHê1o°‚Ã'†*ÀÜÐOâs¤wé—„þ%…+KÒÔþyC¾0µ½¿üh–ŽÒ¨Ö¥æB“¬z(r™¿ôüÔ 7]Y’dH0S4fR”ª&IçJop~«KS Æþ*™]ÓÞAñ­6%u/2iÎ%& ©€‘ʬ5À \ìçœýËy8 ˜¼CI›ÏÌ[àžûÉ5zÏzÌèÝ_­-ãYlèл~À¬¬Z|þâY9L‚%@ˆÄ:襕ÅÁª˜cVZ7‹O/ö*º œ¶+Ìs#Î,?‰]ßãOm v «ênÔõ…HÖÕÚ‰c@"d61œ! Tw8$ñèÔã½²®ðWÜ7+zÍg´KçзuM uŠ‚iº¹PsPªù\èbö‰—õãÐe^t° 7ÓGû<e&FßI•5Åý³¾åÄ_; i€˜%Ç…Û€cÆ$|•㣆-€Ç¸|VÇ´Ÿb“š)Ü_ëŒo1Õ}·#>±3~Î2hÎ=g3»hëÊEgÿгÆ×Ñ_XUL×›§Ê¡íËÚä`Ñì4±Ô­4#?;ïÕ¿žáäüFât9 endstream endobj 4044 0 obj << /Length 876 /Filter /FlateDecode >> stream xÚµVKsÓ0¾çWèhâJÖË>–BÓé0í0 \€ƒ“¨©Áb9SòïYiåâ„!r’´ÚççÝÏ¢dM(™MÞÌ'g—\“<ÉUªÈüž0J.ÑŒ%Šçd¾"Ÿ£T©øëüúìR¥#UÎi"2޼ÒÇÇxšfѪèÍݶŽa»ð‚¶z_ÚÞÙOh{v)èÈÑtð4M59ú;ïÖ›Ú41O£Þî˜ï¯àNŒKÈÀM4ŽŠ¾­H«ØËa§n­’–¡¶+×'{ &eST/)6D5õ¬Ve³>¡Úw£Œ}í=®E€B8(b‚†°ßM¿|Hê¢ïÊŸÿžÙÝw—˜ºåSùx7Ÿü˜0P¦„=Ï‹ä:‘9YÖ“Ï_)YÁÝ5›<#O^³&&J ûŠÜM>üµ›ýLî64£‰ŒH–'œªaÜü¤]ÌÏ­-¶ûÐ(¹cŸByl4¨’ù9ìs=vîl¦ŸžƒC¿_›Æøk§-Óh…â§²À$k¡NcïۮƋ²ÁµaîÌ&xr¹B2S$—“ê[ÀYf¨Î¥Žó„AcV(YV…µÿ"—I*ÓS¾bNð :¡*$ùÖØeW>öeÛ$¤}.Ý#¢CÆSÁ( ¨C:¾>×oywöȃæ UqwáðÈxÔ=£í„%ÌGƒ[ WÀloîàݹôðº›àî9ü¡ó ø>q» yšH­C…¶X›£\ýœ½×Ý_¨¤íâ›Yö°cG3É^ëï‘BõaO!qO^øžÐ€ä¤Š?û©ç‰kœþ§8WQQmÌKúì¦ 1‰ýä®6®+µïÊJ|KˆÐ:Ú™µÔQ —ÿ—÷ ¤dºÓÛzqðaqŒøf¦GÙüf@ä4'´Û¦m¶µÅŒnÜ"#YˆéìÚê ,ƒ¯(ùë"áJ½ ù\–+4úÜtL†{k  ”˜; vn‹\G‹Âš` ±q­A‡káþÐeaG~´÷£?»…Ÿ> stream xÚµXKoã6¾çW{© D\‘¢^zHÛ$E±Ø»Þ^ºEÁØ´-Ô‘¼¢œ4ÿ¾3ÊÚµ 9xD9Ïof˜h²šD“‡«fWïïS1)X‘Št2[Nx±X¦“Œs–ÆÅd¶˜ü|ÙNC‘ ÕêϯOS »…zó¡4íôÙ/ïïãlpK\¤,bÑi†LW‘ûþ^Fî°gE‹±jÔJ;ÇŽýÂurhB> yÎâ<§‹t…j?Ö›ÙZÕìÌ×(‰ðæîˆ[‹$!nÓqšën?r÷ÚòI×»v&Q|O?<ò²ý¬µaõ_÷ýí‡ÏwG¨f¾fíëVçȵ}§6¥2’rï®içݶÑÏýpqïÅ Çcm´sçìÓ—‘)13ƺåÐã”П1+xŸ6/).vnúÿ;÷<$çû`œÁ˜s"aÄwÛ¬vOºšÆ"hÍÉ$þ—äµÁÇ[–²"=Ön§aÇÁ3¢TÏÛºÁoÔKZ_ˆ2.’Ç"­B+#ä K„¯³5›ÁÝÖôû2Y Ê–¾H½¬Ë6WÕ\oÊ)ªYñm§›WÚ,+k†ž×Õâbí)t¾k7›]öÒK~Fýñ«ï®i æÀÑzu&f³;s–8ÐjŽÇÖôµmjd~.záÕåÆjËùñB‘¯Tú­”ENúXZ¾lzº9Uí#Gµ¯‘ˆ, †V$,’E¯È°öyÀ—,ËÒž.ä§lä;4¦û² !@F«› }¾—1Å ·ÛµåÃ"ÚÌ›Ò&±½õ±s¡Ç>Ñ•½…~”»%FäÐ$¹ïÅ,‹óóÝ7è>ïI–ò"ïñ‘ûdTúÅ!20iò`˜¶€ãΑÀEŽ‚ DïH ŽÌÈ‘2?åHÁ"(šo9ÒTà,/\`ÌÖ%6[)ƒ­jÔ“†ðó ¡5Ÿëmk·;;v›¶Ün°‹H€Â¶-ëÊn+ô®4z]7m¸Þ¯9œØõŠùúΑXJÆ“a(=¶q EâÄ0”<;Ô—#W Ȩ49š'ŽŒ·yÒ÷£•ˆç:bj=ÎÝV|vú¼]EJäªÑÆØÎ¡¬ ½-çmIí"¦º‡8>V:uaý´ÁyúÞýÝ6ÊʳIÕØz¿UÆô%ê&] ,Ÿ4x3‘ŸÞ0n%ѾÄ=ÜÍNW  dÞO$Öï?éV•ÿ,2N§Ñ r?Í!‹±Y4hUø5nL¡H‹ÎLÄ‚iq[]«ïº²ÝIÂ???|ü‘NSÓĵ œgˆ„S=*c7–½2NÇõècz)ªõ!n­™º8D%‰IŸ8‘ã +oLE~ehS—p²!ZUöÛ‘ýL<Žk‘±,‘Çûœ‹ÀQŸôu—×Vn½Yœ”&#ÈŠô´'oeœ`å8К¸;Ïôd‡ë 1ò¥¶hP&Éi:\–Ȭ—\Õ¾ç%·‰}2»- Pvõ‚yÇs‘3‘ŽñÛ´HÁç;}>*=zæKÓ}xo®Ñ‡EP.½©Àß›íN§£[eÎÞ0öREñAÈ êèkƒ¯óŽzØÌÆ}µ¯ŠÃ ,h»>K›³{(¸c­ ]ð$gi!]€-ëvA) Â,‡"cOA–|y>\Qý5VHØâÐm6z´é¢WÆ…Mà g¿bn¾”Fƒ%âÙW&PÔÂÿ¬zÜÛz¾îG}Õ?sÊ ‡a…ÝŸyBNƒpyG{"ŸAˆöyã¹3cüФCqÎx¾FìÿèYœ|¸4õícÝþÎŒŸ;68]Kî+·–2fQ.]X~¬[ý_ºÍr(r¹«æètÒµÁ„ÿ†ýhWv´µ¡¤”†©_ÛçN|Æß!ïfWÿ2;Ïý endstream endobj 3967 0 obj << /Type /ObjStm /N 100 /First 970 /Length 1726 /Filter /FlateDecode >> stream xÚÍY]o[7 }÷¯Ðcû¢+R¢>† @Ú.]®(’ ØäÁMÜ4[f¶ ´ÿ~‡²“:‰È± ô¡ su.ÉKñ”ê‹ãŒ/Ñ™õ7™Âú› ù¬‚7”ƒ Á°¯P1œ*?XÁ!*8AKq=,e] Ž&…¢KlR &“˜TMò&gU“‚)^Õ$1%U5Ñc5š¤TáÙ‘ô2A-ÁM<‚Ä.©'*‰‡”FëjÆ„¬¦3>!rRoð#Á<ƒ”Ig(Îú`*Žá~q‚ºR’úÍÞ°«Ž#>ìªçϨºSõ±b†ïÁ9‡€ÍV£á ¤dÃ’K«Ð}ÅAKÌ&‹€á”$D ‚ .}5c²'îcz5øU [øb2,âA5v«žªÇp1Hµ )Â4$¼‘‚@ÂÞøŒCR0«T³!Cb5™*3© 2ÁÕBxM¤J'§6TÁL¢fú44s}bDÄÏ’B^!RxÆ1À†JÞé*ÒO¼ <^…ãúˆ UçiAò©’hà‰†ñ•Ôé«)¨X”Õ)cÙ{˜@¦KF:e[¥î^•¢ZŦG žyHH.<ƒDšuˆ«‰U¼ˆžÔ˜½d$:`øB‚$êÒ*†¢êÀ‹(AÕa!Ц$Bmb„¬/Ĥö‘81±¾ )Uû²†Ü p…¥··×ë^›1Ї¦ûó¯¿Ág½zƒßÈ3üzuuÚ{ñâa´[Bn5¢·ºµmhäˆM|O­ gÑ!Ù€„jCs)–‘[h!ëI·Ð£áÔìí™î_”AƒúÚj玼“±Ûó­NtCbe“ù’&Óõ݇ñèìh05'¦ûðúÀtǃoSscùøû—úƒ^÷ ^ †Ó‰VDÒ÷{Ýá`2ú:>Lfµ±>û}p~Ù9úfNDÒz̧0Ôãm­\nÜGÐv2ã½úsÇlôº£¯§õïw—Ã{ÝËÑø|0®ÊÝi÷[÷¶{uBõõç _‚jd³Wê{Kˆ‹Å*;±g¶xn¿FóÈtoFÇ#ƒÝxvøihýïãàüürx1y®¡Yܪä~löSw*q@΄%ûº¾aFò–óŽÐ.[FÁlC‹íJ+º)øF4ªºÕ׈öɦVGÐ ­xÞ h…ý*ÒÝâÙ-¶‘îÉ4Có¿G3dÅ“i–gþÔIe|‹dÑKŒð-£}$¶AòJ¾½õï±m3O0LYí”)­Cg-Ðlq¥'ï—Ÿ?ŽÆ÷xŸe Þ/‚o¸‰Î‚n݈–nRnDcÔ:¶¢ºV.hïØ:·4&S›²´¢I°—­1¡D5ÖMr%¯ŸHeÌK:fÙ c–¸M¬³.{07R •6¨ 6øÕ´Ùž}‹;¼©g’VÞÜ?Æ›h†˜v‚Æoõ¼ÐˆŽ`YâF4øhYv„˜ÅC«ß^PÃï2¸©6ñf+s'pá.‹êÁñé,Jó†Xfh=®Î…²M‚19Ñ"Z¤ÇÌâÅXÏ[Ç»õ¶a³F+ôhÖמ„¬^„<æÊÁåðüxÜN> Æ3·¶Ø·Ùƒí8¦â”j IÂEOX86£Ãa ZéÔ›Át2éÝŸö·çM@}È.ŽÑJí²z,fÔ ~¥/‡ûïßß«ƒ×éßTÁÖÁÍú¦ù\ÂfDdZBÄ'·³zÓ3£ѵ®…‡Î†Ë6Ó €?ò=ë@ ÷#Ê8½öA`IoD zÝéMzÔìèö÷öªnÿlz9vG݇oõß³ÏÓé—É/]w>º´£ñE5ä(vÿسÁÕNTT0¦XçéùŠ<|Ü×yŽ`ƒ^SU.yîºlæ+œíBDMÏ·VJ¼³Ç&e­Þȶâ¤^ëx¦+É[dÒŸ¯~?VL†N'zªgU½5Åy_ôn—žÿw¼Ç•º¼Î¼ÃkÍ;ËÐz§TZÁ$ ˆ›¶öUãV=yz É÷KÇõJÈ­OOëlAZk –]ÖÖ´0R,s#˜ÎÚ”~ºóŽ—û»ë}ÓîèÞîú°Æî.‚ov7 ªK.m—£}Î6²´¢]°Áï¬Gåe‡ßhò6IÚðëöuñ6’!,Û?=Â:SUðëP}ZôžrÉÍÉ6нÊq+ØéþJ#Ú‹³ú_Vmh¹É·P3¼ì­W89úV´v7þù.|dI{“¸^Î/NȲpeû?‰Ã;M endstream endobj 4070 0 obj << /Length 837 /Filter /FlateDecode >> stream xÚ•VMs›0½ûWhœ`&„@@gzH[;34Ó6N/iË6-Šä8é¯ï"aü‘CFì¾}»Ú·ŽƒÈA—ƒ“=¦ŠpÄ\†&sDS¡€Ìh„&3tg¸,4ï'_ì1s[¦Ôõ°O)£ŸfH¸JãiÆMbŒë#åºâß²BÖþ§ k=§dm‘,7€KªñnŠu•ðŽßnŬªàØl(T¯Iˆ,â0ÔpK)KñÞ¶7› ^ðœçñŠ \T »¢ÝY”ÒKž•vÅ…´&Zs‚Ý(hräÜ´(ê"Eª5*>Íöhª—£É›XŒãU™q±‡@wU¡CcÞ.t¡=uvfZ¾ã×ðäjS­ó÷508[ÄÁ‘ßôÔ%Ôïæiº*²É’‹¸Z‹_Žïˆ§Õ´È„vý —¤þ0_|eÞÅö¤þÛBºG$ìÆå³Ú¥Má˜ËQº·å,–@¸¦w• ¹—l¢:C¼z}88™ë`4üõîd'LÏs°ë¢d5¸»wÐ ¾6¦Qˆ6Êr…ĤXH½·d­³szF ¢çøÌER¥¥L‹¼·ý_ŽÇ®Òšì`4<˜¾o> stream xÚíW[oÛ6~÷¯ú$5Ë®ö-M†¡(º5 dEÁH´ÍA²<‰NÚþúCRŽä8®nô!1EñœóëGÑ`ÐàjòÃõäì2áANò„'Áõ<`”%AÊID\—Ámx£;½©§™oج˜²°’]7}ýóÙ¥HÂ"OHF¨¶b<ÉñЄzkýïÙe ¤f"ͬ،G$Ž'Ü©JF7+R+³lÊ‘& 4¤ É3Ì'yÌœüí…Z·ªF•ïwdÇÖ·Â4sÂàžü´#5òÔ yGÏáø”gá§éLˆ(4 þŠp½©*·ºŸÆq(!pítÆB yW)wz®¤Ù´ªs'çmS7uö[ÙÕ÷Çf…pïñŸj Zfáz:ãiØhx•†ÆÂ¡ÞÚ[°ëyÓÖÒ¼tR¥šËMy-Ú×Å4Ë .XÜ›óÛë×{ª‡ ÂYÔzXêñ-ÑíbIC¹1 Ø×…¬*›#¨F å9…AÄNÁ¦S.¤Ø#ú¹ÏÒÒ¿·±€ò†ÿw ‰{Ñø“k»Û€è08ߪ1P^îAûÍE ùìÍ™¥\¹mè«—”Ò“+Ñ'åZŸÞ·ú£Â`Å<„ºjª ¶> ÌaõêÏ~ì|é0§q®¡üÝ>w睊?tÐN U7­úƒÆþ™ÎbÊà 5³© ã`m˜q| ”Œé"+§ÆU Æ#\–ç>C tÖ§2'áŸ0jö!@ ëï– ŒÁóªkö" ðŸ’,hñÑ-}’è]\—zUÞÈVãL¸ì§ÁN¡ì…•y\¯>Êz]í=÷kÁd ,‰¶`R"rît•ÒHLÑ‹õ]]|èj貘¡mz)¤·ÏÆô[+Š6w6žP4üÞý<*ëuM^]Oþš0&¶¥H$$biPÔ“Û÷4(á%XtYð`ÖA–FH2Uðnò˳~Znǰ' 9hŒ†Ü†¼Ö“Úeâ‘8ÐKÆú.»¶ó#ζÜ“¥Gœò½¶ý~Òœ0pâ??tW‹,"ŒûbºP]ÑêµmùSz$xÅ“tÄùnÇÈ.[äÖNÙÉiü^·†¡,+÷ WŽ%ìàÁ Ëkvez ŒþîWjÕÔºèF†íz]IƒŠŽéM`à ]¨k¹P‡†,ÏI‡éh˜˜e«Ô¬ÔµZuà¬ô„/ÛV"U|rÚ,Ýêí›+?­9»Ä–óã°S=„#æ1‰Óíu ˆ§Dõ\™^À‘Àî¡`å*¤s©«î [ *ôLj­€ *Eæ²0MÛ’ä$[ ç«§ÓxÀÀ"öæÉaiÒk· ŽÀ¦t{IùÎY>-!ËñD³‰ 4ŸÍ‰»³¬ì> k¼:>éíÝÔð<&y/‰EÓ´¥^ÁåäËQHvª+ÔßOE+‡‡÷XÛFwÝÆRѸK“7ék~0á÷Æ¥µn ie©7'À§W‹j|̓KO1¼”W=â…¾‡Ó}W{ç¼ÁQ1n/Ž¿šƒž'p5eâß%43¾ÕnøWó?…ϸàÐÐÙ?Ãgœ¦$åÑ×ñY6ð*J™õ \Ù¸.ʢĞ֢”>¡5|½¥5|°­ˆl»¯·‹<‡'ÏáÊ8ËÔñî\á`í©®Ç´©Ý©Ÿ.ö] ·h nö8Œ[ý÷…Ä©[ES»î+·7h` pTä‘«R¶þC¦å¾p¾ñïÿ‚Óoüûòoÿ £ño¤ìÃX endstream endobj 4103 0 obj << /Length 1146 /Filter /FlateDecode >> stream xÚ­WKsÛ6¾ëWp|§CH¶“ƒÛØf<™©-ç’d: Élø2q›_ßŃIÑÔæ"@ØöÛ÷Òµö–kýºúy³zuãVäDÌcÖfga×u|¬c‡ù‘µI¬È \ûǾX}?rHÀà!Åô>ýú&ÍoKž¤Å¾‘ü+׈¹Þ¬žV¶®… , ND¬8_}øäZ ÐÞZ@‰BëYqæ ñaŸY÷«ß‡çæ«Ò‚±ØuÁ£¡áà›A3:¹î9Qˆš5ÏÒ¯Â^û4Dðˆ(š´,x¦îlŠ‘?I·@ÇÚ‹Bh1Ëúæ„8<ÇZQwÁ] ‡ŽÏ|÷hâ:­’±–m§.­µ¼†Çêú>jËJo´>jËØ`TÚk/@qÊ[‘hÂsÚ>ÊAµ8q™WŠ»,DaÃÚ6:¤&ê¬%:Ad"ï¡á{±¨Ä±RÓ8Rjìü.U­.øÀ‰ˆRÍYnÿq{©È®!1MJÒô¦®‹^ëÿH§Œæb'xÛÕbÊí»‹Ìq™MØ.¶Y'.YGF_¨b¾Ì_Õ¥TFzgÄsu{½È¿å/âo³{sèïno_Ð1ߦ…˜0oî®ïzÁ à!|J€\ÕûÒÑö=Qÿ5@´ÛgUa’'ƒ¢àõEá^t5oup—[Ј¡…&"׿…5<2Š©“¥¾ërÛ ȃ_Qñ;½&}ajt ¶eÞT—÷þ>ž?äïƒq("ÿ9äÎÉÀ~)³r§R Ë´âÛ°®gÛë¡'ú›VÊVÄÌc‘>ub èË´2ƒWº¬5%yªk½Cy8ìØÊ8á¶ìw² İӸ%á‹M)‚ÖˆQ'=-$6½é²Lî(JxËÑêcYŽSG8öšxT¢‚t¢¨¯\’#÷\ybçyµ €ü¾Œœe–¡ žáBÈ©?´}®V†ÄS§À‘Š.™ÊŠ@e…$È0ô†QA]ÓTþп—hÊZÿoâ/m…#ô›yàÆ†™ÉB­ÿK‹&bÇ!>¤ ^h&´ Ÿöqˆµãv_óâ³TAwyJ¨d_ô .ÍÀ·M™u­¡Üq¶+гü_+¼Ôåß³4ö=íŒú£á©Fè³UY©Ò—EÈT R¸>l`VÉ„iƒ“æå“°¸âmüø\ÖŸ5ë êö{)S u-ˆ&JT4Ë’:¨@  bPäß—ZBmÒBêÂu«÷xè4³´igm¢Ç ¾R8u9Xœ#¢}cA?ìÙ‘¸³Æ_ó™pµdo&|¢¹1=6÷lHP颵]‡Dƒ‡±Iò¿ÖK?6Í3æ<\üÉȄ쬟ÓF\š¹][Tgcr²`ò ÖE“{ØwBðÞÈæ×ñ¼ÊDsú°ŸfŒ‘Á|ú`3Asì¢ÚæñMγ좯䪊¹;ÑKƒ½™äÆ£æá£†0úFýÝ»H endstream endobj 4112 0 obj << /Length 892 /Filter /FlateDecode >> stream xÚ­VËŽÛ6Ýû+„¬$ fH½µèbšd ƒbÚñ´‹4 Z¢m¦´¤ŠT÷ë{ùÐÄò¨èŠ"yxyÏá%p°pðÓêÇÍêÍmªò86»€`Œ’4 BPžTÁ¦ >†¿‰ö^t*ú´ùðæ6)ÎàI•£'Ìã‚hÐ »øï7«¿V>q@žBçEŠÊ´êãêã'40ù!€©ª ¾è1Ha÷"ÕaEð°úå)ÞekòOÓóü FyJ‚<+PŽÓgù?-ÞÙl]Œª’LDx»,Z'YÖQFB&¢54BáÞ ­IØÚ~?E_&œf(Ãù5„-1¼p09IQEJ›æ;&ë÷ŠwíŒÜw’³Ó‚ekR¢¢*ÜòFq~•À"ICª›Ä’kí·!f¾ºm¥¦Í# n‚u5ƒ®¶ÓPåâü3¼g-³=ö­˜”ék;pdjàµt½û·v¹¬;€¹A¦jQˆ-¼™kÍ%.Μ’îÙ¢ÏE™WÌ…(®Xtö:œA&!¨Ê2 é¶ŸY­^›i<ŸÚ1ªFÃ`a²îÈ—aþ`›ŸïB’ÿÍ^çLE 3(Y ÊÖ*Ïd7¨òöæîáý"”JIO~Q÷C7öh뉖½àêeô¤Bóy”ÊC†:ÒožÐ#C'$øQzŠ!º½'²…jðÌÂ\Â3dÃà.ÕT±FW©¾!‹ŠzbÃ5R÷—ý{öRÑúOOlÝ·¼óæ×ÇeðŽ qyæ¯Ü­zµHs'xï[ªMƒÚŽKÏ\*Õ‚‚º^x|ߪ›a?Y%q÷ñ¿Þ¬Þ*û]øÚìÉ/r°µøÉÖØ8ÐéAߣ<\0Ûrí"¬IŽ’rþÈùo|•ðœ»U`™@¼³­sø:ó èÍý<öÌ/ mãY¢ýÌgЦ¤]ȸ“ƒÐV›ÛI¨ø¹Û÷@Ý~5m—deεØ”ñ/:kìÐ6Š U[ZªÖó‡wà|S\£¦qo%ßv¢¤ÝÞhí(-ÓÙuÃwïVš÷•ùLÞãÒ½¦ßq#·r6nÌkžŽÑu‚Ék³²&çÓõDó?e,ÿ¯„Šjf§Þ)ý~à¶Pìöµãdî×k:IÞÖblØÔqÇ|`ó¿±ÔÜ•†íè(Ümæ®$¨ÏjðìoüA‡äð endstream endobj 4123 0 obj << /Length 1562 /Filter /FlateDecode >> stream xÚÍXKÛ6¾ï¯0öbXsõ~ è!ÝfÓi$ÛmS´Dk™H–+Êɺ¿¾3R–»µÚKaÀ¢†ä¼çãP¹³Wß<\ÝÞÉ,cYìdz‡õÌs]„ñ,ñ<Ù졘ýæø‰¿øýá‡ÛûØ, ’„EIŒô¢·ÕæUÕt¸ðÊ5üíóö> ;—A”é­K?b@ TÓŽw©–Ä,K}+î ®^qèÈBl~êt²[ø‰³'j^q¥„¢—wnä6w‘ó´äORÁ”G+d²§9³(t8?áŸhyiˆâiÛ.–ž#ž£Ž$ŒH@ä4ë‘ àÑ-Ñ.Ð| ^Í¢ˆ,èZ¹Úu¸&ŠAøeÈMIï[ýÞt(n‹ïä|CS¼RYÄQz%Î\nòVpûç4×´ôœâh¦3»s´êµç ýŒ;¡¤"7SÈVä+Ç1GÖiéE, ‰(É÷—ö'^ ’¨ Od`# ¯Zx1ª‰5ßUú"ûyò?îµ)„–­8Åûbk<Ò¯l›Ý–­&XôwhLļ©šÖ¤rQUFsÌ¢ ùÎ ÑšÔ¦¥ŸqL®P~kjxO¼ÞVÖ)M+KÖ׆–71pj[Én’¥Ï@t’:kð¸V ÆrCÏ2’îäjÑñ‚wœÞtÐà©e’Ž ¶+zdJ4 42ÍlÀÔ¼7u~–㊲èDšcÈm#4™”&Û‹;ÕMqH¡=:ð[ÞbxN'Z¢ôñ-ES¿ÿ$›JN®Á=«ùÓåJýÈX£b»šDïIL"|Zh$Ú‰Éõ£À<¶g•¬Õ´¦¸“©îÐÙ/ZSÙ©1Lô AðÂsÌK¯¿šêʪ)/×Û¤îÖ‚w»V;TŸhBSÒ@å¼S•Û¸L€Ú²9{Ú1ê§]½±Èdˆ”U'gˆ‚¸µªPt^‘s1yމ¿OŽƒ“MÌ·;J:ª…RÒº× Æ¡mêˆ V²Å2 #ç:o MvxD¨k ¨ô¼F×ÓÕä~Å÷àæ‹ {9ða;>ܬ…ÁY Ã3†hánhZøŸLžÛIq£âðc°ŽçÍôVÒyéÇ™NF$éêA‚As¤$Ôd“…H¶m’Ç銳h©æý¥ ©GN­—Pl²:ž¼Üüïà„þ³¡@¬™î™ é£9åu8ç¹mÝt” žLT6oê•܈ËÕ½k,p“î9­j‘>ä}sâÂ'¢q1 €Kg-Ê¡áë/´ôü€Åî!;x—?~nÚ±Ga‚àäH×(eæfoYàmääÅÎ÷kb0’Ɔ®gÜ?{ùæù 1~È27±«nHB+ úH† M0?ŽÆÝ·§“ê†Z=§ÂÈZVÕ¤¾ì[NspëdW·­,Ja2kÅ8•À ˆPrfËܤØ|ŒƒÃŽkbò­+¹½\{è„#¹=7}‹â(ž®?ºA'ÅÑé:¸óMîë ¶i¤šP1…€®¦zÁÎÒ^gŠ‚®y86­IÝ÷5$c\ðht‡{&êÜrÕM9oîÌu×6¤t¥» ºû¨¿2Bl«ZóÎ3¯Å;¸3šåó²Ä•í|¸;Ô½Gb›2ÈKDBì~ fjÔÚ˜…d£±43Ÿ Þ.²è{½P‘¦¶û¾ž\–dÞ¿F'Ï ¿@'LÌѵˆ²ä8¹,Ìb»ßB·^ÿ5¹îáõϧð*Tóú_™XÚŸe}6Ix OÁ9EÕ©Ðø€Þ©—˜Øø¶mG-áºö ¿YœŠÏe®?ŠÚ½ç‹}ÎQAŒ4Â]CežÓõXÑãÄ«˜Åa¯AÂË û$ÄšëíªÎßëòíÛ&}·tý³Ñ‡1ý jEŽ\‡ƒ"°Uv}xˆÊ$ üÔFuÞ'ÌaIÈÂ4° ^ݽ÷N²aY\Ì¥7oé»1óýäfåË_~=Å%`at1£\ÿáã¬rPÐ~êýßCÅcG«NðñcÈÏlr ¾H×çWˆk. endstream endobj 4200 0 obj << /Length 1446 /Filter /FlateDecode >> stream xÚíZ[s£6~ϯà1™iXtáöè8—ÍŽ“q·/»ŽŠMC„ð6鯯0rb0ȇm_:™ ~ç|útîÂ2†eÜœXçÅüäÓ5ñ LM×s‘14e™„:†ƒÓÅÆ<2¾ÞŠˆ¿œý>ÿòö¢|‹¾éËUåK–qN}ÓC¤ZÿݲH¹üÓ5µvVy&±°\»Y&ë¼àY,jå®<„LSãaS%ôb'Ñ}.ù(ÏÙkõqwÞri‰XÉÿEᕦgd%ìêçìæÄøvN9Å^cO5 畸†ëXDã xÞÀöM×u\G‹@ÉÛƒp·NŠø.XrÏãÅò!mEƒ5m€Æóµh”¼=4: Žä„Á·´”¼= ÁúAKI#ñ ôÇ¢äU ”‹ÌÖbÂ㈋ý”š&¢:o«Xðê,ôò¹Tœ|ú£üÇEÌEÈ{:ßeüü™³â™­ÚöW¹~ÿýÙH˯’×0MÒ¢E;‘ì:>D;ÖjWòjÚgœES–åü"N‡ð{ä»`Ç/1óÑ,O“0x` ÁŠ1K:N–féSˆïÙ‹Àȯ;šÆÎÑVuÄ –ó"ïiÜah.¸àmñ‹HS´;"lk#®U¹¹^IØ<2±…ü¶hnQÓ±¼`©“‹dÒ· éEjìþÏìOa6þnÂ3¾ Ó¥§ýÁ_VÏó8‡(ÇïÙp”$w,{j/RÀÙÐEý³án”Šœg?xÔ Å÷ÍòŠ>d)yûõR'pÈòˆ>hVòêÒ$/™Xð!r'²8yN3¾ Æs=ž$ÏPöª×†X¾i{þ1nðÌEiòÒþ3­Ã¢‡ù+ù_Xøûkˆ: :J`Íÿ&x<µ(—1Á·@ù™èk%°¶û –uÒ¥|:ñâ¦#Þƒ= 9ØÕ¦Yú'‹và®æYG¸ÚÁ×»ÑtŽˆ7²é0A‰×ƒD~léã­ØÔ~“±ÕrÂV cÖÖy2áz°†HJ`³#»ˆ„Ž¡a:”ö£!˜·CtK[ðvIªoßýêñ1êçÁýÕ0êëxóÙÌHžgR©‘:¶‰±ÿ§#dz„iÆui\b¢Oü›Jâˆò÷q]¬³¾‰«¦¡û[£ûù=i^¼O3?F0òmøJ¢ø-þ{Ñ>‚¦>lYú TKÑßçˆãª³á‹ŒŠº‘i![¸‘—ísFèèÙÐÑïEG >æI’ÏxÙ“qQìì¡ÞQª2 Ñ^Û:J™äoEƒÊÙ!ðNåÅlz‰/ó3…tûŽ>ê+y{^uH;Xº-ߤ.d4íRý){Ýxjž1‘?òLƒl5îVS"êGjß½±¾RhíK8‡©ÛÏ ~›ýÜðb Dæ–(ÞtÃÐÌ|fÙs*^õŽOpƒÜ¿|›ü}ì’a ¾åyqõüÀ£HfÚA a·¿¥à” {åä#ìCóÑ—4Åðì9“4d‰¬.×aç­õ÷¼ wlµ’&±©u¹±-ðåˆÄðëšg¯]ÃnÒßcÜúãIÁ—eh8 ðÛéûû"Ý´ÿƒŒß ¿©ÐÝõ‰œƒI([–ñ*ïÏøc9Ðù0™Ä%ðL¢Z¥¡3‰ë‚3Éû|nVÎu‡ˆœ‚FNbh:€+àF‰³}n¹•¦†mS™?nÄü«ùÉ?–S(5 endstream endobj 4065 0 obj << /Type /ObjStm /N 100 /First 981 /Length 2261 /Filter /FlateDecode >> stream xÚÅZÛŽ·}߯à£ýÂfY¼ ²•U $ )AAãÕX¬Ì³#ÈþûœbO­VÒN§wÕcºT7«‹u'9)HtÁ¥ ÍQŒ rpTª䘓ì¸(OŽ.RV"¹ˆ·øJŸ:ssÒ‡$¹,ñ „¸š×JVtvD»(ÑÙŠ¾kÊV¢#N¢TÕÈU!ýJQ‹€ª¤LP ¨ÒAª#¡‚UHVŒw™ô‹ ªôÑŠ¥Õ¦rŠCê£X TtG¾ä8eÂUKë£Jˆ]Ià«]–7Vù -·¢È€t‘ ÚRMUh"báú z£®³†wS´ *õ ¨¦4c x‚ì1Öþ¨û MÝBˆšˆfÍ©+S”Ôß)UÛYU³Õ(ú ³vÑ)`ÖÆE)€4UãhUvë_(3Ù?L]ˆ¤ß>ƒ#` b……GØÍû·o_e¦:wnâ3¬5;öˆí™ÜÜ"6›Y|És¹asø3î‹ífßUwÚì³ 8L|x€ÿhš:<ÀI-Ƈ¬!žG>wÛ˧kÌ ^¸áÙú×½»žkôÇ«Wë³áÌ»Þì¯4IªáŸ¨©¯¶ïw—ë«1]öw[¿|³ú~û«ëÞ‘‰]i s?^íð5ŒÝ³®0qOù*OOù#‘Çe}&ÈÁoó>$fG×ÞGð>D]ÎÐVŒìè+4…`…^Ë‹kîî<<8?ï .÷o¶›áéð'?êßo^ï÷ï®þ4 >|ð¯Ö›õfõßõ•ßî^ ß~ôÑ;ÊÆ<ÕÂ!zAü/(ÜëõÛwÃn}µ?*æãÙ4Šÿ9ÙÍ3ªG†?ךïΨôóÃù&óÿç[¹SóZOfr‡èÕ|7J–G^>s`¯…ãܱ‘¯(Ø3¹´c7»1KYŸd©Oò×DÊÒÖ¾2eÕöeʪåþ)«†C¦ªd°´V-­¡;žÖî“h\}Š.´ú¦m4ìx‰½x³yùÏÕîÍê§·ë‹õjÿ™âf~eá¯ì+Z=4žµoi>Ã×b ZÊŽ µ[¯^>þû£åä@ƒäY·h@Ô!»1ö¤P<*ÈÕåêíúçÕå~»[R+HúŒÒ¤A«ê›väŒ4¡—E"¸¶šMŸó`#ô÷^r¼¶ºr8vúƒldÒ˜î+MÏ‘µÞ¡ØÝd¶„ N¯›À™ÜXCªy.wȾa«65únÄc»0;¶ì5»ÎäFƒ5W'œáħáfÝÍ•›{Xεåäuïw÷½Â±íÁg5y‰2L!~Q†õ„àNeø†&ôØbvx}Â|Ýï•ìuã}n¤³Hu&·TŦ™Ü‰±[h<“›5¥É\lÒHŽ÷èᎵmŸ¸Ò½‡øKç¡0ÏyÐ+}áÜêj·q3r3ž?ïž+70ß’˜îfàMº ö¾[ÏG‚Ã’ ¸r5=óŽè¸õ9¸ O©ú”ŽïŠß­ö—¯?lw¿,×¼W¤§eÑójô™YˆU’ö»J2îJÞÎ,c]*x®Ñ×|¼Ó½XC’‡«ýêóJzç‡)óm @ð-ÎæFS”e.7gäÊ’¾2W~Zhõˆü0tßPâðåµzÿPb %¶PŠÁ2‚ˆF$#ĈlD1£!'CN†œ 9r2ädÈÉ“!'CN†,†,†,†,†l‡‘d‡‘zßr Y Y 9r6älÈÙ³!gCΆœ 9r6äbÈÅ‹!C.†\ ¹r1äbÈÅí ƒì ƒì ƒì ƒì ƒì ƒª!WC®†\ ¹r3äfÈÍ›!7Cn‹žŽ ¼ÊH&_à£hÓ±¹'z¼O·¼C¡2.˜ «xõpÑCH½GlÅë]ŸHó­ÄãB”¼à6;¶^¦eJ/HYÈWØSRñS2Ô¶ "ZðZ†…Ñ¡éäkÀ‘% SŽ ÑÂ’BÀØn\¡ t9À|፠!´Ú«ó üSiG¾_CZ¸@~IiI)¤—å„M@tŒRèE*v SÑ!´ º{Æä)G_ú-;{Í8 Ý Oy¦ðò!š¢ÑÑ=S…Ò|q\„ò „@¨Æëð€Èe*2Ò„qA!˜5?»ˆ¬µv$½ÕP™‚¯SÑO ˆˆÿ+Óõ"Ë韛>«_¡;0å—‹*â¶#dÑŸ‚XÚŽ–<•1 -©ì¨ÐàDÒ}yê{è–T(ÝîÔ !N z 7 h«¼þÖF¯hÊ/k\¾t0&½§Q!ô§Ð¹*,(Z8Π*Ñ´á™ZÓ²y*m—ÔrÁž±]×rÎÑ©ŒI‹Æ‡^\`¿À)zl°åFŸ§ÁŠ -qªxÄr)`Ý\K¡·JS²¬‡é—¡=Bz Ó4–¦‰õ¢G 7"„ î1!õºÛýÖQ¶s endstream endobj 4298 0 obj << /Length 1726 /Filter /FlateDecode >> stream xÚÍZ[oÚH~ϯà1‘×sñeRRV$€f#uWÑ`¦ÄcÓ±]%ýõ;ÆCÖ€/œìTå™s>ŸëwÎŒÝ[öìÞÕÉÅìäÃx=f1»½Ù·²m‹P·ç!d¹„õf‹Þ×Sìѳ¿f¿º¸ò(ñ|ËGL Ú<4º¹üx_ ž­øºÔ³É£–‡·Z~ÓÔŸå÷d¡¨ü:¹:é}íBN‘ãµÂ(åõ¶·‹a|y^£ßQÏ3 àÚ­´À*‚Û(Én…Ìr9Ÿ‰uf`–g# Ön‡Rà )ÖõF Ôò]Ñî9íÁP ¬jŸäq½rÌ,ß÷Ê1"­ÊµÀR9zÕ¾A€‘»D!Ú}ÿ?m›”ª©]yÔ·È¿~Oæg}—žþ-‚,ÕÏVÅY‹wCë<9Y?ˆxššH0 Ì/žZE—<ã G W…"ñA±Ý AËÛÃ0¹äYdS˵ bÙ Ü ¶M/#Q€ùø¼2\‰¸¢–ã¯N)oÏ4éšËTXŸœ+™äuEØW/ჂÄo…¡åUa\Èp±ñMH¢-bb–ã@àà'iU<…k”›³ëd!"QKZñ¥°ZlOÓ5yZàˆ3±T¡&qQI뀨rA¤ÉnO-pÈ,LÓ\ ’D.ÂXeJÚfD©EPi·Û)ÔVbÕ§»á(þ–XÛ¤5Bå:ªé•ÓùRñQ7@Š9ä/Òž=[‰UÓì…M3xîB³Ó„K±+!‹djvœ•8ZQToáQ˜½ü!Âåc–š4‰‹À&™ðE˜·æ˜+úÐal"b¾¯Í·É9à–‡mz|ÏÓ94 x$†<ÈYçGùÓa íC‘X5ÇÖ‘ŽR §! ÄD¤y”¥&š?¦øøî¯ü’žƒ;hPMÏ™®U¶6ò0ø”è8ÐUÁtv>Yñus<¨Ÿ€ìt S¥ÀÄHóy*2ëµ±˜hr¸kos¸¯˜%ëM¡hâc0õ¬›¨*~žK‘š  …à¦èsSªkuuX f’Ç©šÙŽ ÐQwµ°ÃYöËzQ˜Ll;°ëÝÁtvÜ…i˜¯îÁšÝ±Ë«©Ùþ• Èa¹$à•ÖZеLÎúŸ"MÃxyÜbkÀ£ ”·/¸ Ôˆ®Xw¤Ê²êµÁGUg\袔Z`ÒPdÁ£ê”á"ç‘›»þñ~”ãÅt­%¢—;.C>W$¦¹NÁÇ"FÀSQê,`V‡lºÉPcãÖEMU6Èïºhÿs?]_ÍE¨çxÈbÌ×3ãìó¥XåÏ&ö ÈîÆ _ ûþAÇŒ‘1’þà —a2âIH#œ7`ÐäÊÈ)P¹¬éæ‚{«²m‚f#êAiö8YÞ$r¥&ÒŸÂ@”O'tùºþ2žRñ½)!Àü¶kÞá·¥ÔW#4LoÀ@¡&b“–FÎâ||Wj¨¬ÖêÊ5µ\ ªN~{@huH#IÁlhRll–¯F‚¡CÝÀµ¡˜Ò\<¬DÆõ¡‰lf9>(:X×¢¨”Xg“Ž ¼3 mç”ó§ä¥ÎŠˆøÔ¯îë¿Îžä)£oÉÓ'i&_‰ó\b2:j Zv†ð¶Á|pÛ(0Ü…ªL¥™ÖÅt.!ü\ŠØÈ–Ì~C¥RãPøC ’<ÎÌŒ|6C_sùTýÄÈJw¦„¤XKŒŒ8yàÃÊ)_­#ñåzd¢(a‚ EiS—ÈËôƒ‹âtP®…21caâwsé]Ú0Ýl(/^Ž[€¿°ã·îBóµ(ßïIŸÎ>YP|<½ ‹B*zÒty ÎQ(œ£Üʤ؋7„|°öØéOŦ)îÁ‰ï€+ðvZ󹈌ð"|0?šû+nÕ™¿sáö.Äü¿·@Þó†í]y‡·26¦¹ WÅE[#ôéႎ’ð‹!AÏÌF:r›^µu𓚒-ˆvsÀ× HjÖ ã0~‹@j¤iuœm×4­Û$zé ¨C<½tñ.~¼‡Ëúý ž™9Ü^tn4•*0yvpëÅÇÙÉ?×b‚§ endstream endobj 4203 0 obj << /Type /ObjStm /N 100 /First 1018 /Length 2765 /Filter /FlateDecode >> stream xÚ½[K‹]¹Þ÷¯Ð2ÙèJõ’f`fŒ“@fìEã…ãi¡{h·aòïó•έÛxauº†Á­sÏѧR©Þ¥‘ªœJ’ª’*“4‘©,ñ>hIW=Ùñj¤6_YIƒÙ5ÕbÍG”*•rƒ’Ÿo5aRõ‘¥ÚØÑð¢vë>ê SçÛ‘¨Î¹­$"|ŒQMtPÔ(HÂA­Íï$Q¾FÃû¦¶PŽ·-q¾Fë‰yn§Ä2÷ÓKbȽ&nsGwkX£ãñ ª;Ô¤ªcÚAUÇ?xí#,®Ç\,ds¿ }ÎødÌýŽš´ÌýJJÅ÷1¼+°åýéϧ¿œ~|WçÃÍé§ÛéöšÝ8`£YœôÑ2h‡ÈåÁøêûôâE:½I§?Ý¿½O§—é¿}ø÷m†>ý1}÷Ý þÛ@ƒj†@@[3 …¤PV¢¯SØG%g€<`!˜yÀÎ8ƒDdAE-ûY¡-·jO¬°ž ·u?¢Y ó"ð3LÉŠˆç“§–3[ˇâ¬ZTP¹Tò€G¸PÁ5sé+*è T”ž›ËhPQG.¦+*dÜÁyØ*x1h†¸?…|À•I¦¥Xí#Þ8 <žZÍ ,ÖìL!¤ð\ *x'ܳÇ`Gvƒ/®1ˆBàôAÕÂl¶k°‚4wŠÁ ü•¾0J6Jň¸´Rn:CÍ,&” ·K»Y6ê)wfØzÏ3>r^¸ãuMzZ7²B 3|ik¿]³ÇäÒ-ëR6u¿TˆqnÎ.™ý\Ôt%›¼Ñ£ Œ4âèEÍzÑUFàÌ×i°FÓE¡úÚ<`ª¡«0Wų`ÌB=š\A$a•ŸBˆ NgAÄN‘P(…z&#¹#ª@f[éq$³ð¤½\A" ‚:WЈÊ~:_'bØ~Fð€N¸‚6œ¥T?œ…‘Øâ…ïà†˜Îôì;`¾À™•ó¨;µ|‡$6Í}j‰› ¤Õ°]uRÔ!EHRœ<ó:t5± x³raÔö;8ŒÃT xaX/[ùW` œ´=±æËVZŠüp#ba ¢ZîG!ó°_¼ô£ÒwRÑ=çJŒ,Ôøl©fõúºr¤UËÎx ó@ÈCglQÙ !‡¹Ê­,c ÚÏ òD]ô ‚ ³•µPÛä!ôOd-×R¤ÊœŒ—ZjrFÀ^šŽ'F,Ö*ÐDþºß…ÔU¦/.„TütVDð~‚œ0׋3ÅÁ€ÙRKÛÌ&Òþ<\KÏf“`Ád©¥½^Å`¬ŸÜ)Õæ'¿¢‚öÇyQFh§™Ÿ«£AŒvÑ}W—BšŒi.g!ÍVzŠÚŸF+RB/bÉJE¨ï8£†uHŸ5,ZhÈ—qÅKÈ?¥ÓßÿñÏ4Ü!Jj$Y‡¤»Ï¿þúþ«W¤€þµ"!÷Ì_¿º¿{œ$¼šåöRy¯fÚtÝ~øx;³ã·¿ÝþüˇîO“ËV)µág÷úÃfÃ)×v|8Oèž-$§gvÎÅàòMÁ8j‰AÅ€cÈ5k ×@®\™™™™™™™™™™™™™™™™™™™™YYYYYYYYYYYYYYYYYYYYÙÙÙÙÙÙÙÙÙÙ¹r äÈ-[ ·@nܹr äÈ={ ÷@îܹräÈ=G @<yÈï7u•¼èò ίAJ<*)Ð5CxWáûÆH-š|f³ÄM>k#—e¸hÓ)ò8BgjðF`Õ<`Ü ñ{ïK*ÆþVЉäÙ.>·R ¼ê²t¯Û;lÆ4Y6Ï4Wábå+H<°û´ Ú²×h;¥âPE¬ª°zð0¹À,[±udzn Y«ÊpøÚ=£ñ\«µ ¢q‚­Ds#'6 ï®Á2ÀÍz.7à µ#§ߊ Ð UX¸98$è¦_aYiEDÛ߉WñT= p¡|ËŒn#°~5GYr+Î A„Gò+ µ+ˆ%QVج‹X2É,Nƒwž"ëª86¿½eÙï)’‰¾J¤d''¼Êâ›rK8ïÚ! ˆýÉ„µ;ëqÞÎ+OFB†a™ më}u'¼ÞÐ+3¦tVEâbûTÌëã—›2â^lÙ:ØK ²ÙÎÓ:Ka^mX®1–DìTØÅî­4nÙ«=Œæ"! ?¯J’eì¬<£FÊq•·ÀûXÅU[í%â§Þ¼ÇHX}$¤¹ÏKpHûûŠ\¶ûP¿™Ò‘"ùÊÃï*Öš¹~+"ÂNxÿÀ ÕGH#ÉoJŒ¶j3ªlg…÷ó¤?±‚»+ë*ÎÝYÿŠèÎûyìeòsúà ÒR–÷ ¯àÂXÝZösh…2ÊÆ+g^v™Þúç>zn.©@,šw‹·ÜV7—ô ÂI0Q¥? '÷LËJõΠ"ü¹7ôÌoßœ ¨a¸’JËz9íw!<›žýâC¸2þ®ê¢[c›sF^=Ò0.5·¾"B·ŠˆpmÃ{ëçàANÙê’ Ûïɼ¥7ôÉ•’t‘%mŒå.­õv ²È_–Ëu\A,Fª¶ËÅlذ±¼ ¼—ˆÃf{ï¦]lIñ–ß* *û³Ro4záðÈÅt6KùV½œðeÞhD${ñeTÿ%/®ÖÅv±ßÞhZR1®@E‡‘²'*ÜŽ“~+* êH‚úìñ ÙsÖ:{|ˆ¥ùñ¢=oñym>ÒÂy[~Aƒõýiˆß•/H ÉÅë¼~W~a+ï²f“±ê%ÈšMÆU&TöÛÌË=ùÃf>×b¬;ÿ?’¸5ÿ¸5äÿb+Nl½Š|¾›ÿ¸›ñ|Éë…„ â\ò¿PñlÉ_®p§-Jþq§ÍKþ­.K̶ÿž|Ôüãž¼×üU–T´ý×"¢æ×"ž-úW¹îÿ»Õ™ endstream endobj 4405 0 obj << /Length 1952 /Filter /FlateDecode >> stream xÚÅZYoÜF~ׯ˜ÇXµÙÙͼc¶ÉÑj&ÊÎbѶG„9䀇#ù×oQÓ¯ŠZ6 C‚@V}ýÕ]lg¶ž9³wGo—GoÎ=6ó‰ï1o¶ü4£ŽC¸ðf’Râq¶ fºøpzöŸŸÿ»üíÍ9—µ‡¹ïåpõô“nùБSIs.Díéc.áq)gÇLÂùî¥År~³ÑÛãU¤³¬C‡'ˆtå^Å¿*ð¨YZêÙýzóîhöñ˜sþs½A•ÀcÊ•îNìm˜…Åæ–ö£ð‰ä ƒÂó‡Qìv¡`¯‰‚7P(Ÿxž¨PˆØ¿‡ït §ö¬"Üa{ÕyjLõL]^é3L4õ¶£à$*²Ü¤ËÃkcI8–CQÇ<•§b- O9U‘‡Q˜‡&›x´yÌ¿†›"¿¿1Yå]&S‚xŠ!ÎFA¿©äµq\%A™Å*I ¿¡í¼óõ:5k›³‡mj²,Lâ$>À. DRÉk Ñɶ:Í yï¾K“bkÅ,jºYª@š1©^óÆÁðîq¢3s¥óÕ}‡~!ˆâý|Ø3*yMý&ŠNW;÷ ãµ À‡s|%¯ #‰"½ÍÌbkVãßÌܤáC*ê "Ø4XÇ”Ãþ¿P⻕N1Ì…ßYË{ORAtÿ×IúØ‹í)ÇyÆÄ0c•¼&HÚÉæ4Ìr¯¬ä!ÑyìtetWìáÊóÚ½áØ©äµµ/N;t3A|dz§»’×È ûV§]Ê}¢†voØ +yƒŸë,¿Iþ^¬tÔey,%Qçgƒ*y O¹û$ISé¼;}¢ó©l]‰ã2ÑÁ<Ž“Ç‹80VÊ«pÑqp™¬o¯nlxu´;\™\ŸCb*:û È“Ò(ÃT›BÈÔvð¦PãµIW&ÎçwÉ+ñ@=‰ˆ ô•)&·Q¨§Ðµá:3EÜÑçá~E¹h,7f]¦Š‹È±3B: =BÞ\ŸÌ/b¨Úio²‚·p­ÞH“ó$¯b¡¿»©Šq†NUà–ÿ.t Ó”•dÁFZ—F²¨ÂõmÔâqs—D—ÐÀØ™:'ŒÞä±ó úK˜: ¿Öüf|ô,Öðöë(É­äcŽçEž\'aœ/¯ÆNСcî­NWI`.âO‘Y•ìe=„PÇ'®ÂôŠlØí÷›pÞ-ÍCsF’Zñ{Ž6ÊÛH¯>ÏãàÏû0·c1Ý(âÛ¸mcž+,p…fá )]¢ÛØZÍ}t©Þ›g›;0ôþ^äQhÒ®òD¡ùw9ÇŒQá²ØF”¤§áf±Â܆k|š…‹ üýûu1Ȇa.ð«86qWçb±…ÈÐQ?ØRAG>hÔk…l‚æã|é¢Ó>uÕøø Úýô3}ÉÝÔQ>±á¯ñq©ïLT}áÍì€PÓA¨ˆ§y4³2s]C.Ãø³ z›[4„‘»¡báÇGÀïHGŠèaGZ# Ô=ò¥#·(::¹ë$zÈ–%i¨¨”θÜa$YbyËÃM¬­žŽ9ÝÔ-L‘ê|yo6Ɔ!˜PÓ QqP%j[¾À\†ö…[†ú.2–‹[Ùw‹Ûð+Fù5+Œ×v®G£ÉÝŶ&6]ò×OEi‡_~ÙF•§«7çž[‘8êð•ÏVÅÍ‹„M‹ÿA%¾|}%cŸB(åÄõ ôYäz1ª‰ãu/FáˆeŒ@µ×6r…ŧDµ;Ï|ǪÎl¼ºOÒîïÓ«K‡ã&™góbk¡O¨z±s+6ªƒ¾8JŸ­Ð_#pgT ©E˜+¿ƒa¥» ÞÉRB·Ý ´|¸I(B݃YþrvW&Zb]È8‡8;H«ßÞmÈl4} ’vÅq$j©1Ü—QΈÇ{B·÷š1º;غüFCÛa±‚½òÕ; CÿW~èÜúM/RÃ…z8¿:D6²AzûÔ¢$9ÙÞ?FÉKL²#ó•Nk¥3R~`;Õ¹îÎÿø¢ê¡»Hò)ÕCê·$‡å0¥ºÍ+™±| ¥çqCtÓ5l…³ gA˜OŸÙc7j˜…:€Ø‘öì²Ø6L…fSFdJLЭ˜4,ï+X5Qß©âw Õ;1‹ÌÀäÁèó¸é§¤i)*na&Gzô'ym;ý¸Kòõj”eúñEl‡›¯ï1‡Iõú".ÿI_4²I•œHJ[µ¹´HooðÒ«EíŸgË£ÿçrÉ endstream endobj 4300 0 obj << /Type /ObjStm /N 100 /First 1020 /Length 2776 /Filter /FlateDecode >> stream xÚ½[M]· ÝϯвÝè‰)J€ ‰á¶@ ±m /\gP Àÿ ù`$­ŠA+©µáJ½Tpµù &*æ@Mqá;Œǃ— Ú,Q›¨ø•lÎHêø@\Š£%ÆÃ>âÄ€QM\‡£˜$ÖZ0‡)Ø6G±–ØŽOñ£²zªåxv¤Ê¹—T뜷Sª2çíœj;>­©Úœ·Kª`…9:^¡LÎP4ߨÛA#L)s1:~Õê @µ¹K5@èX«Q“–ùì¤\s _ãÉj4Œ@ øTæDCSS¼4ðºÃGœš.F5µAæ#IV´øH“ÑñiKV©ÝadÉDºÿ[O¦6QF2#P«T’uQ²åĈS§âߣš: ùHRÇùHS×⬨¥ÞjÇ ÑÍß¼RO}”ù½‘0p~\ˆ:  §øl ’ãÓš†ÎgYÒ°ãSM£WçÌ-a°«Ê°¡BÅ 2Œ¨°Ìg`E˜ÅªC-ŽY Ã6‰Ã"`¢ÇÜZÇñ˜+•‰€%¢ùjØ'",f5"©¾àA¤æ«…ßñÕùòx–èàˆyˆÆ|AÁlLó³1ûÖWqç¨m~³±–ù]ÌòwÌSža6ØÔœ³aÃý1ì.a½ý1Ål•ç”Ý{ÙI*f«Úü-³Õ6ü5Õ}±×ù˜{úhz÷ìÙÝåõ¹O—o?|xø|wyõå_ŸçïýéÃî.ß=|üñþ㛂øPÞ^þ|ùËåû74¹»üpÿþszgȈ©Ëƾ.%WÄF=©øÞ·éÙ³ty•.zxý.ÏÓ~y÷ïûŒøcúæ›;ü·…ͪ_±(-Ã"V,d ¬nvïWü¬(»©£æÞÚ‚Dï—B09|U2»[·’æ¥rKcãRŒžÑUuÀ `s¤Y7´¬¼b1Ê f!-÷铇Y¨~> íÙÏT­’ͽÝ€~ô%‰" @¡Ì°Qhš™TÍ…–,x§YÀC’¶Áã~"Žú˜»èSq¸z©ÀDÉç«—–ž›-IÈNË„øéÓ <^iöEFË8OW$t# ¼²øyoPžÒ€„9'™%‰~‰†øÔI#8/Iœ®Dž£• z± |ò›¨ˆNòhb‰×ŠD=a;°žPÆv€LÓ Ò¶ƒë?÷ƒq¶ñŠ„íŽUºgU×X%D8^W Qi7‡Úšô‘C#“,9ðN‹À!Ú¼(jدY½Q¢ÔnXð¾b±3L¢õ,ÒœÈ#%ìåGÅaZd‘ᡈݟPÀ/ó°~K(“ãt‹h%å„aD†Òw¤ú¿Ê¹í„˜‰"07¯}®NŠ2-£ÂYíHÙŸ×Ô¹&ý–×ÀGqD,òn'çlðL¶«]Œ„â-7ZD¬j'h-£Š~$a†¾ a;÷ •lbE²Û=­‚Hø¾Ø‚ÄØyˆ!©õÚ˜…±üX wÏ^½c”©ÐÂAJ;a)°â&Âwñý‚·]²ût„êì}±8Ñ™{¶¶bA;Y`¶Úðî(ÈgßÅ÷¯˜ðŽ ÞYyþÐ{"ìÌlÄa'¼ÅEÖW,*í¯Ð ¹ykòZ¡£ÊAl|2×C„¼"ívˆP‡•öÕIÆ'l ráÇ ¡fyiv†UÀ&½~#¡šMV Ûï¦äõøWÅÁXt•ÞTÝ‚laÌfóQ‚Àðò*ÝÔ3ì b¢vI#¯³ŠßØåsß×a€þ!]þþ&äÌÞe5˜»¤_~þùm|ùÅÇÏõEµÔG=žzáÒ†^!^`o¼{ü2Ûô_× >:~àååLJ÷¯îñ*éòòù‹ty}ÿëçôö·«ó”ï.ßcÞûŸ?¹ÉMh_„O_>¾¿ÿtH óßþvÿãOï¾{ø5ÍuC>‘løIúòÝG<í%‰_œkþ O½ÀùL¹à:àÔH n_n1°ôŒë€J ™™™™™™™™™™™™™™™™™™¹r äÈ5k ×@®\¹r d d d d d d d d d d d d d d d d d d d d äÈ-[ ·@nܹr äÈ-----------{ ÷@îܹräÈ={ ÷@<yòäÈ7·<yò¸"K)18ßî‰4Š'g©á¤6C^É®¢ôYäº1»%/À§Ù³Â˜8øPC Tt¨Û8…¶ì»tcѼãߟˆ{‘×i³Ï\Û¼©žê]îÈÆ a//äPâš/S°NWâPø¯Êýû1…8WÛ¬‡WVÉÔÆ‚‘2”rÕá|;¾¸¦î:¯¢îß —áÈn›á*œ¬(ô(h÷.ö#dü²2ÞiV\99$8FuÁ¨ ìPàVBÇÎR'ÜÓ¸† ÷œ Ü"RÕá²"}uÇ@€×êv¡Wík%¶ÈVÇ<¼…;º+ \[È[\úê¼âp¹áÊ!¹ˆáÒ×Jï‘ÅyÅí"¨UxD"ך> stream xÚå\[oܸ~ϯ˜Ç,P3â|ô5MÑd Ï -°»XÐ=V#K®¤Ù$ýõ¥f4öH¢.´8n°EؤÃï\xîJ°X/‚Åû7g«7ï®0_H b‹ÕÝÀ„-8„€a¹XE‹_Þ"Î~úmõ·wW <йJChûЇO—ÿ¬{ÔÔß]rðüÉþ…ÄÍ?âÝk§E¡¾Óù$bOý/5eóˆE^°ûõ¦:‡Ñƒß¿!ÆDätqbØ•²f÷t³~Ðiyd¥%€K:×â—Œñ[(ÔôZÊì:‹ÓrÿG[00óP0ˆ¡¦×Äð‡ÎÕZ_~{ÌuQÄYjÁ!`ûÃQÓ;A0IvTÏTf‘þÞ%:, Ž¢G10€ é‚5и™™Á1ÙŸ†a‹±4škˈŠAéAbî•DM5ž½_éoåy–d¹cFØÙ˜Ï~9M£ÜÇ¥c&ÎÆ|–l´p££Ú‘ ™âCMþÐ`÷Pƒ,5–ù$( KMµUøEhᛀ€clCãU‘-¾³$ZÅebI€M`›íŸYêM®ÊÕ½~°ÑÛêžxgzÄæ!—5½Œç&D³¨2µ$‡.µdElªÒDÞ¾¢ŠzNWðȸñͤËs–ç«Æ)&^ôÏ_¤"‰#“3ýÛ".ŽA@¥«øÛ|5uƒ¯ ¼›ºÜähÔÊüêôæA=Ú€ ‚»Ôó?&ï„Ê­Ö÷9.âÍÃgø¨ø†‡˜×¹ý¶Þ®ò {ÑHŠ3Ò[`¥ôøi;RŸß—:­J©žÖ5o@êb­ZoÔ³©Ž¶ÞªÜñßY’¨ÇB_>Üê(2!úçM™Ä:/¼4SH0±™‚šh–:Œuñ<Ë0Ùi³a2¢$È% päFï¶¥”åñÃò1‰Ë¾–8wÆ[âM=ÜÆ©®ò˜ÂÇ&ÄÛ†d85†–DÃ,-sU”'å½Îrõ+¡Sê×&†<7.ò÷0Û¤V™NO‘,ÞèIhDÙœÚ<צ„87×F:½Ö/%¨~sÒˆgÜѳ@1qwÛhøùö_Fdÿ[([×Ú ÄOŸâã‡)t¼ä“" I`H´]ͦ(³‡‹¸(UjµyAí°q­]ÚgvÎéó9$&”­ú…Ê¿ô¥Þ)`¤Jîrõ`³8"€xö­I¥)háÅ¥Nó8¼¿éÙapüMíŸ-DÐ$ž”Èå&QcÒwj“”}}ßé‰À ¤øÈÐÞ-¶ÍÜL"°V¬Ë±ÍR`-):œ;Öô¶êkÅ:­²E•ütBƒàm®£MØ7œÞ…ô¯#ûJиñê^â4‰ä_M {ê Ì”t•“9¿Çœ11Z•smËãÇ5‚^0%ƒA1 ÚöÔ_»¹S±cmÒñúpÛFn˜ÊMu‰fuç‡ô8²eài_â5¦xÙÕQ–2Ø+,eìw c‰&3‰f'bìÌ«wš¾M ]F%”Ž'šm/Â\—º‘iþi—àËe9«C0ae ÏŽÅxl›(|»qw ýl »Ž>)›8ú<8¾œŠ÷‡ç¶5½D·ÍÏ-ÕËä6ûÚs¾;óÒ•ù§žcq´„ ª3þLß?j•úP &)¤yøò¶ZO€ ¸¿£kz­£?«|ÖZÿþìá|´¦×°Ã;êò÷uGÇ«ü°p3„¦¯ùÌ$Ý+¦+U”7Ù×e¨í£̆“5½‚ë±ÕiJ+Bý©é5R‡+ã¶7¹nxï™ÆšdϦÀQf6l¤zÄ0›*Ø¡ü{ª§éž‡Ñjs\Øä¼aW¾vä´¾X—óÙßù Ö#òøõˆ¯¨Ý†~Ð2”M/C«uG«æû‡êÎuã®u•.Ãû UªYÉÒkØÅà¯Ð›?Ù7…îèRœ€¤4ŒotG•x©7™p¶£816Ü܉š‡îÒè4I>ªü‹}ÔïŽÎÃð)‹lÓ ‰€|Þ8˜2í°±Ö]>£’cìW[·¤Õû¨€î¾+8H¦NÓð>³/_` w)F:ø{‚mì0­r•w:ä¼ Â=öF>i„Õ».MæêO&¼,Ppæœ=W²´Ðù:ê¿|Σt.¦Ò[Ö7Í;¸’õ’~=óÛ¯Ç~–ÛwXÛU'Y/IRöŠ}iÄF7ÙìÚF¿u:ï/ŠÙù)îÿ§µJcLuÃÌpŒáÄ5ÄôÇ—£ Ôv¯–*”›¤Œ?f‘J>éx}ÛsÅ¡ñä.‘Eø[…#í"ˆàép6ÄóP^Ó¶ñZwdùh|§J’ïŸU«ÛD×eŠUƦD N_ÍË1•ï¶³ÜÜÖAÎGZ'ÙKÒºñäaz‡h°Æ¼ÒÒߢW(FÚfÛUÖ ›‚L0W糂+Æ =/L’×ÞXÊ„)»·~/½÷Ï_­õͺ½šiVD•f¸ç6d[{]aH€p»›%Ñù½J×ÚÇ °ëËUvøîÌü¬ëXØoÿ¼\½ù/–§¯ endstream endobj 4407 0 obj << /Type /ObjStm /N 100 /First 1023 /Length 2924 /Filter /FlateDecode >> stream xÚ½[ËŽ\·ÝÏWp™lج"‹@0`[P [‹$‚Š<Œ3†€ó÷9‡·kF^„= N‚†=—}xn±Þä”l-¤P²õ ¹p0‚ÖŽAů“r Árå@Cmœ\s艓k #ÏÉ$µ9»ÑTo0j€<ž¼OGš i…hM‚ôF8LÑ”G9¨äÁQ ªøˆ‘-ÇÓÔòÀ­íDn=hOÆÞ`dÎë)ä4w YQº†œ§9ä‚Å1*¯KÝÖ&ç^CîM±FÇä4‘;ÈñÔt"üW&ò”eÎ T§ôÄ5àÇ”ð°`©’Á¨ÁðÂXc4È8Ïy=X©e3üø¬åÌö¢ó»BÄÃ~,òxj† ~—×Ìæ7zhµc?J¡u!ž¤Ð† G‚Äëc¤¡«Y°»ÙøZRB/ÇS ½OkèíxÚBïkH#IÀ2Ÿj CçS•0Êü®j6×ÕFídªP¡~<µ0Æñ]èPJ}N„%¨‡Ð¢” _E¡F©4¾K†¥ ö •°5+†ý˜ƒHš¿ˆ”Ê!Vô˜€Õ¤XMì@ÀjR” ;a2ƒÂŠŒÂ¹E¨èsñYT7û 𠩬¦…Š]€(ZÓœKû˜*V VÓÞæ\š_J«¬–…zT ÉÓ ¤ûLä€]Æc* Ô ÃZùn†Õ ú¤a5è ßͰT…|aèxË1qiYÛÍ‹7§7ÿýõ6œ¾½»»ÿ|súñË¿>ÏÏýùî?7§ïî?þtûñm‚‹HïN>ýåôý[™nN?Ü~øÞâ…#ØB-*ô¹ÔïCˆÐ6Ìû6¼xN?†ÓŸîß܇ÓËð‡_ßÿû6âÿ¾ùæÿ6°©?†Ÿ‡ËI‘.Í4Ç®yÅ¢<‹$‘ç…Hìµ®Xô,XP%úˆ´3Xb¤§)cÄ‘úŠÅx­ág}dÑ[„ëY°(º¢B4£VZ4ø?øÞXè»›Å1VzQóFY@ gì°÷YÀ+–ZbÊ+½¨Ï±#E¢1ùŽ˜ÆÔVzÑÒ3ÈBG¬Ì*\ø)ºÒ‹¶Ñ_ .G8Bi±2HŠ ˆ0ÜøÿÏASy†ýH𔔀ï‡T,´Ð -Ïà-(‘V¿ÒŠT¸Ð‚…m´S"ðš±§Ç(‚(†¨²Ð Çþ»G&˜ÈRc/L> Ñ^£C&y¥;-yi4$"ÈÌcgN™ $Õ#ß‰í’ Ü$sVHC^™­ÆZue¤uçv”ØQŽ<°È QžÀb´,2Ì î 8ñÂÒá Mº?µÈpŸƒ9'Ò-–<9˜ïB;sÀ²@þ+}‹ÊYQ ²›…ŠÃ؂٢¤«_QVuÐþ$OQpÈlb¡ ¨E+H€õÊ$Po°,uUc»Ž¿ò0ª¨6fSQ¹+ÐC‚c+#}†BLQnd±™r7„4ͰÝ+ƒËÅ[Ëá´—•Fì £5£þ-A²þi%ŽŽèõ¥mìLú3 ’Ý5$ù¥ÏöYÌp22­kI¢kHuIeRHb@¢Aj‰r%ç"L¹f¯× ¾°‚”Á.³þý*HögÛèÈs¥@@ý:‘‘áWvai—L-Ά°½*ØœUÓHëÎüÎbJ_±`)ÜòX´²ð<¾9³àöÔüšÛÞÂ\í+H¸MŸÄ¢ï/Ì%õÈS†ÙLäÑÀˆËýøÛ~I;KÀ?„ÓßÿñÏ0˜•Ôд̮ÜÝ—_~yç“_Ýß}ž ¯*ONÚñ­WàÐG>@FÓ‘áŸÌŽú£èV<¡£uóàO¯?Þøñ¯N¯_¾ §7·¿}ï~/©×àsú,nï>¢C˜ß§@>ÝùøávþNŽßýíö§Ÿßwÿ[˜2ä‰Lt¯ßÄ·¡9ÒŽ‰SþŸ°ð<¦"ŸyJuŒó@’Ä>ùüó|ê<0T48²8²:²:²:²:²:²:²:²:²:²:rväìÈÙ‘³#gGÎŽœ9;rväìÈÅ‘‹#G.Ž\¹8rqäâÈÅ‘‹#›#›#›#›#›#›#›#›#›#›#WG®Ž\¹:ruäêÈÕ‘«#WG®ŽÜ¹9rsäæÈÍ‘›#7GnŽÜ¹9rwäîÈÝ‘»#wGîŽÜ¹;rwäîÈч#GŽ<y8òpäáÈÑÇÙRòø@}}P|`>¨>h>è>pd·As4·As4·As4·As4·As4·As4·As4·As4·As4·As4·As4·As4·As4·As4·As4·As4·As4·As4·As´³ ¾Û•„Í'H¨"m<}Fy¬È©S]eŽ;›QÂ~=^+C#R¥¦HÉJ¨ ±QÇuê*aÛ&T‘D3> ’jÔ+’èe’°±ÿª A¨ìþ`ë• 18§Ê\:ËuH(Jë[©ŠÅáÍYÔ ¸¸Šœzy&¯ÊÜ Þøª ån\"±ó^œÙ¥ <ßeIXë@‘xeíé,üÌ*}Ýo†Ê?ñ²ˆ[²Yø¸ÕqãN¥@ÅhiçñT h*<­ víJ$PM žä•ªÈ©ð  éI] ±S)à¯Ù“Uª&ª Ôw¼fª¹8ÒÙy?BPÞÍ+gJeཱིK$,ïÜ”úÈH舃×f.‘­N3—iœ,LàŠÚXì¼B¤Æ®¨>²Àêµ=…ÚNÜ,jôWV*q(EÃó­U$µªÉ®¯žÒ_ ¨&¢8ry¤OÄÂi¶­®oþH5út)l”{ôÆÍãòöŠŸó¾²úÕ)ÆN}`c‚@6#¨ 4#¡@XE9{¾ {ž—o™b!† bFB1…ú’+I" B·=P^8´q™DÛê0-ó# Þ¥BIt‘Do{Cy›­ê3 8 6ï/’€íõ—ó¢°³€Ÿd;í2 {†X^X.¨¢Kg8]ÝÙI¢Á>x5d†&x ²Ï»}Õ;ßIB3"Ǽ©žÓ=Ó)T½È¹ò•Jã :y$ªT¬\&±ó$žšˆ„ñ‘D‘]“˒ت™°J­¼Ê&‘ÍQA^¡´Z†ôëÔ`‚_ç¡ó8(y™@[^¹æy.Oáy¥Þ9ÌÔ<ÄV·tŠ[€L†ýiUì/ìÃåÕ%Ýï%æá…ôG/‘ $òu$ᡜ'*ìË{(ç­Ã±Jjv^âbè†*ðtQ£H¨d^AEN³ÚŒgpÙÈ "O#|3xu¬®ï<\SØã6!þõçñ–uB®E"Ç$2ï3ò@EÂYËÁIõÊ‚P=8œå@J«þáNÞ*Ê(<æ1ø¹U”é+Ò¸’Z"càŸ\é ZÒ[B-+L%A"+…ØÙÌíyMÊ)À3Ì»¦(ØÖ ´Í«¦ÎA±ö<‰¿À¡n­¼˜Q–Yõu^#› ³ã‚e×ký‘À¹À;l<þô~€ÂYXgÙ™OÁGv6#*/ˆàg“Øyë¡|ÈÂ<‹ìo¢²94ÿñÜDUäCÊ•švnžÈµyàs¶N-TËEû²”ýæy¦À+•óZÝ H|Ãÿ7jƒ7 endstream endobj 4666 0 obj << /Length 2113 /Filter /FlateDecode >> stream xÚí[moÛFþî_¡9à¼Ù÷—⾸J»pRÃÒÚCÀH™ˆDúHª÷×ßR¢’Z.Iqí^E>X¨áÌ3³3Ï̬àd5“wg?ÎÏ^_r?<~Ž…ùO²ÿÒ;éÛuœíÅsVù% tþ+dpÿPM*\òÃ3—:ȶ‰ž-‚,Ó‰E$W@Y‰,fQEiÔß “Ì? 'InÙþãÝ»³É/ç„WÜm6Âp.Í”ѵ4{ö´ù¯ç: ’mjÑVaó:€>.ƒ¬|¦6T…"oœ#ŠSdocE(pÞ @2T‡d¥ãͧ$HKÏÕ4bÅú¨Ôt9€R¾Ç°S-nDHlQ+Óß2LH‚Ç*…ˆ¬iÕ#ê˜4ßRN[ ©[>%úQ¯- ³wƒšªI#ŠÆx;·¨ƒ(P”ŽÕ7Nh?€1w[€ä(†shÓp¹ Ö©ÅnàeòD{ÊSΛž¯c’ã}¥ó% àñ‚©û<%¸™:³‹4 ž¬i—Vú§n‡ç©ÃûßY`KT&¿ >~F^~î†_ €ñ1ú×›`¥Ál.õLÿÛ¤¦&n(¶(2¿¸Û–R' €÷¨Ÿe]i±®.µf£€âž”ÀªÐs¯ü}˜†ÛÍ=²)/„ä’§Àþ!ÁA’+ez•YG-IL*CYé ì&Á…À¦&wE­EøJѨ†¿LO‚Pi1êhe¤1ª#sæašnõ4Ž“e"žº²$2ì‘25ÈB7å;Hì¡Vkά†Ì!Ìzž‰.ëkïiXïဘ€Áˆ7ˆ:å€[âH©ÿ'ˆñçA ÿc-ˆ%A”~ÑÉm¢—á"ÏŶ†ÁLJvpê½Äzß²z\ÇÙ§ÏÛp½|>N‹˜»ûf@ò&ËK‚Ç‹FØ4†PŒÕH·çL ­¨E¡óÅ:HS/E !w¿x¬‚ííØDš”Ï Jio§q’èõŽUØ µ±“d N=¾kº(CF°¤‹»Q*žc (Ç{±A²‰£§~¸ÚxdIømÜwŸ.ê>÷¦gä‚×+t«B/d°.|X¬·iölAMXçÈöf=;;ûAX¾ÀK¶—|Ÿ>t´ q@pã„_Å¿éä&^Yœ<[¡b/,œû™á•GÎ][jkA\®æ?¿Ñ›í7/ƒ´ÆûG5_È=xåÜ|nT cË•²²§©3¸aöh|¬Û9åà”F7f€Y‡EIhÕ…InŠÚŸüvad¸«Ú·ƒ¨¸´úS°ø:3aõŸQ÷öJk°?þÆ;û~Eô­4ÆyøOp’{Ö_¬R•–HéßG”JøãƘ¸±Uè;*±Ã(»^¸‡à'`Ëza[Ù<^Œj¨Ë—»q(Öp¸Á&«½øË‹¨º >ëõ4_Ø™â QÕ1DÜ ¬#+a½7>|‚´“u›‡–YìÖzÔs=뺌 ‚b ðU=Gî3»n%W÷™ìëà)Þ>ßê§k4^[h¨¬õoz6FšuF"¤C.dµ²ÍÝo|sœ®„ˆ˜Œ›õÿ8wÙ/…áÜä wåÆª.¥ª‘ I°Ò³Eœh/ÙˆÂþÙèp2Ãè«^¶O¢¹‰@!å¤Ä\ÜË央ÞU’MªjñÑãK›Ø³ñÌw§×e<À1fs{‹ÙŒÃÙþì>Gb§¡Åé=ëõ¨C!°Ž|,üø©hˆ|4w”økÞÜå&]|Ÿ/}úvHË[*ä;’>Ñä6GQüt-µm¹]ÿ`/7v\\Û > stream xÚ½[M«d·Ý¿_¡e²Q«Jª’ƒÁLH`°½HbfáØ`bæ™ñœŸsÔ¯ºíEn¿…¦a`ÔïÞ{tn©ªtJÒmÍf*©5/IjeC’º³¡©ÎÉFMV•–Ü K}6<Í󥞤à:Z#‰L@kR‰ÐN`´$‰MöÓ5I×ÎVM2œ$zK2'Qº%•óUOªç«=iì­¤¦ }ô ¶ÆûFIÚ'ïxƒ©Dx…r¾ZS•I£¥Z•o1,Õf|á©ÚB=Õ®|ý1R6Ñǘ4Ÿ%¼(Ùó§QøXDák™’_Ám݇[úX÷tʺ¯'+ÆÞ`C“a膶ʫVJ²f–$3>kE“u™la,ŸµÒ’ÍóUK.çg=¹žŸíÉë ¡2’›ÀVV&†¯†IIÞ;ŸI>…Oˆ¦^Ÿšºt"KK½ -Œxk…-OÝúº¯§ÞË© [HöÙõlˆ!…(*ih%ŠjµF|´Z~¾jiôóUOc–eΞÐ`:Òïè.5k!çZÒl•}TIÓœ‚;Î~¾ZÓç«-Íé|_ü”"çËŽ¦Vr¨ôÞêëV¸oÁÀ Ÿ:éÓ•÷âÍ¥tú·5xp“„\Ï­àÃ" ¡Á‰E9G4ÃÊ`wc`YCoÒ _´1XFåèX[qC’AÑ‚ah 7QôÇ{N²pmëêØ€[ÛêŽ.pã…ÜÚÏ7𱱨¯Ÿx·W¯N_ÿ÷§ÇtúôÝ»§§¯~ùׇõû¯?¼ûÏÃé³§÷ß?¾ÿ¦ 3”·§?ŸþrúüY?N_>~÷!}#£dA‡ª=7ô#S³ÀÁ0ÎÄû>M¯^¥ÓWéô§§¯ŸÒé‹ô‡Ÿ¾ý÷cnöÇôÉ'ø·D·,+SHè"ë«Zî¦ÿŸƒ6ÝGB‹exIÒR3‡Z¥ç‚ Q©°Ä8°„ï'íJ¢HÌû‰á@hIŸ™Q©¥gÅðȘÇ$¤n´„H®œy‚„Ö¼¢ó •$Ìi­å‰$~Û£ïdM°@ž= Ò¨tÄèAx´´ŒD.ÖòÀt¤`V÷<ª…èN—Y˜«+rSb…Jƒ‚?qÃ,+“yÉ3ÇS2:ì] & ²f£™õ€ÃN;@*eª4¦8d®MæÌ\ý`4¤ot‰ÚÁS§ûÈÿ¬³ä¥°e$m+ûH`¶Ès½›ç¶&è’B˳ ób „C…G^LÁ-¹Ê6&Ì꯮ЬðH*ôN¯ )Íî$êÜi‰‰$uå5Q ñorØ©&êôìW ‘:  osØè(qèWÊÙKn“°†h:òDõt!Ñ$ æõ›$|£¢i I›UopÍ,?n’€Ô߈P—޹£`î¨LËI ÙÇÎŒ9\/$ZI´ß&!ºÑ­xVÔ“Pw¬Þ_ÀbìôÍžQa]H sŽf/ Q·ú&%ê…f -í6 -;Y@R ý Lïe¾ˆEß™5Gæ²£â˜\s²Ê ‡ò«ã(cmõMø"×ÊPuä¨JY8}Öî3}4(9–ý—4È-¶sú€¾ž\Ï  ƒbz›Ãα0ÌÝͯ|æÊµ® ÏwÆÆ¿€²òÛþ [Ó68j@X¨?ê°ÌE5Ì'˜ã 0óýêÎ:4>W]¡îÌI ÞÙ8Œ`ˆæ¹¿â»O9 1÷km«(=á ž10f·º•E ‡"H´_‡*§¶ƒñðÁQ $²D¡è G¶ä:7&-ã^$Pþq•tv£´f-è<ƒì.~DBö;ªßÌ%ìpІգð:> ÇÔ©¿a˜÷bñ¼:@q£ÿ°é\ƹ÷v0 [KÔåÜÑ©ž.Ê ­6îÿ 6«÷"9WíYá.áV È´£²ÜwNåüÊ.ªŠŸ]’–)½[YŽN¹CS'µÍrÌÎ+h<»ô=8kœ9ÐÜg¹Ea«¤_Ë–Aõ1“÷M[ýu0’BpÀ´¥Ó^ÀasÝSÏ[²‹ç ÆÉ-{Kòç‚£T‚óRoÔÉݯƒyÜû~EÃ黕]G¶âÿ³ÞÉ)1(}kpà¢@‘þs !fïî·9H—½Kœ¨‚"£W»MB»~¯„À«Ï)r¹%<¥Ï£ø„ M|%á‚@=¨8zù$êÌkƒ>H´ }qDb£OX*‚C1•Wõ¨¹°ü©7G%ÇVÇtt¦©Jãž8fð‚Q!'Ëz´·s·¥Aë+Cé…s¶Rc V$vΟ\Ðz%1ZÜ&!Ýö \¶z¸ÿO;ûÝ÷®­s\©)×ñ­Óh‚´ËCŽHì\D­çÎBWÖÑ)î;9HAe÷~'•m†•+ ïkuà6‰Í*»]) î ÖÛÆÎ¥*蘆8HXAº@Ü$!;7ê+·WPã¨AWRñwH¼ÎÑiP-ãN{ ¬7†û…E[iü,t§SDÕ£ ’ µË¨;5˜hl“º·êárHp` 2^BBŠí/B1c¬åÔ(BµáïG)s§)Z£¤:Ÿîë¬%wy4•eùÁÙ‰±Sé¦0¿r`pªÝæ [—«&3ñÀ™ói¡Þ¥]8ü€Ãܼ°®Ö ĵœ ·à©{Alz¯‰%~žA¬C))Æ:UNw9b±u ‘§Ý|B~<âù“¬`ÇübżûËtúû?þ™ VjóÔ2m¶ôî—|7¿~z÷a¡¾†¤¸ë©×ˆT]Ï?ZË+F³œïÆéÍû§ï¾zýtzóÅëtúúñ×éíï-ò,NŸ£«Çw~¦¿;Ÿç‹ÿüôËûï×ßÚùo{üþ‡o?{ú5-[± íëLî›oßãiÞ8Î7.;ÿŒŽ×ä³Îÿ?7<=#q³ÇÍ.ÑÐhÔh´hX4ÙÙÙ¹räÈ={ ÷@îܹräÈ#G @<yòäÈ#g Ï@ž<yò äÈ3g Ïgd/% FF‹†Eãѣ1¢ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ5k ×@®\¹r äÈ5k ·@nܹr äÈ-[ ·@ްò+·@¶@¶@¶@¶@ŽôˆAôˆAôˆAŽÁ·»>8@2åá/.ï¡@k%ó»7çW9­Þg?B ©Ê{µüvÊœgY’;?;8:g¿s{H¼ j—uœy :°ñ»¸µÒã÷9¼*V( Ö¹ÑQ—Øà7hðOÈM¹Ó^:ß\ìJbÌõÅÁ HlT>ñÏ~÷0ùÝzCsŸ•Üi ô^×ù@§^߯ef$ i~äš—ùÿšH9 endstream endobj 4669 0 obj << /Type /ObjStm /N 100 /First 1015 /Length 2432 /Filter /FlateDecode >> stream xÚ½[Í‹'¹ ½÷_ácrq[’eË0,lH9e÷6ä°I†3Ë29ä¿Ï{®ßÇ\ÖÕwÁ²SÝUe½’õñd©«7I%UošÄ*/,ië¼ÀOExáÉÍyÑRkÁ‹ž¢Ì·" S^Œ$÷«÷’DÆxÁ•`I3þ‹×¹h·$m¾Úk’>%vOsÝÞ’–ÂõzO*6׋¤Úç#i-|#JR·€Œ¢å¡I£fà †QZÔde¾žLw[(J‹ž¬v~aD²v¼;’õyw”dÑ2)…XIåzŸ¥ë ü¯J\ซ‡Ûq7⸋EG¥´1’Þ¥"\ ¾£AÑnUù;M^;(–¼•Á«š /ãö" 0\a3Êq·§&Ç»‘šöùÜH­s“’šö£‰`ûæ]ÑÔ&ª&–Ú f¬z¡&›xêJm4i©O]5é©×ãn¤ÞŽ•Gê݈@KêÑ 2Th\Y5ÅÔUSK1uÕ´¦¨…ë©§ðãnKÑŽ»°ª•FŠ©«¦#CWVÒÐÒ!ÃF7ß…ézܵ4T0©Ñ»žFw¬³LÁ° )‡¶ðaR`Fó=áU)^‚€F=µ¤ÄT7öAʘ»QaÃRŽ`Ä¢Ç_š@šÔÎoª&Ü \BšôJÁNo‰ÎÏrHÓ"üj‡4•ÊuÒ`ÿDæ¦õxÒÔ .@ÁiÂosHÓq<ið>Ð ÍTäåÇ—×ÿ÷ó§ôúýçÏ_¾¾¼þðß¿?ÿåߟÿóòú»/¿üóÓ/ BCùÛëŸ^ÿüúû2xyýë§|M¡Â¬pØ\Jó‘z†UdéÏ}Ÿ>|H¯?¤×?~ùñKzýCúÍÏ?ýëSÖ¿Mß}÷‚ÿ6 è% <—ƒQ&4B |"›÷_GÑÆFÑ2,õB‹åc>‹Ú‡¾‘C¿A¡žK´sZu£.ªgE8EèÍéÒ`&…_—¥*ÚF ÒÙwò˜6Q;! ÈƒÛ^£`Þ;0Ð$¡çƒ¶›1àˆÒÈ"y ¾ÓDŠ“dãªÝ°½g~  @ h™LI.#B] Bj$+wjð½E’‹ÆE##°_…Î(DÑ;þu-Í…(¢g_ZEßé£%«Í\6mT†”³{ß¹(hJHVO#2Lâ (úF]h9&{4˜ù7B¸N¶’Á·Vºï`œ3ƒÛÓ8f±Ncï€Â)Aœî( .Óš\AÊâ´Ì=÷æ¡PA ×Y¯d”& þ’¬ÕjÍ RögSÇ\o‹ùÔ&š% ß¹#%ã»QÏ!T’X€:jƒµŽ¾°‹aûƒ–¸Ä#d\ç+£Ù©φòIá”0Qä`òam—çÊ^A-Âg;*†Î¾aµ~ c+Ž}Bv)9<¶‹°ÉF¡Û¸ E„(HÕ: fí@¥ ¨ª _Q}¿ƒ8êñw½;›•0”•&dg*­¹Ž'ˆ*¹»ŸƒÐç%÷|î¨Ç¥ÌQ+lû¸’=ÆUª@ê¨(È(`$ ž§ ¶ªÂxÖÎY£îÉG–‚ýº•&v&Q3GÔî *Tœì;Ñú~£¨ T“`nF1Ú±*IÍv×@äYqB+mv’µ,OVw¦RA”ÒþDÚ‡ž£P{ý@!Ò9)zß7TCK'ÝéÆÑº-¥!¡Ã?º°’Û:‹õw@2ï9ä2Ó6‘3²ËÝ6 ¨Ž­–ÅÎ|.“M°“?‡É.رg=tÛIóx k¤w(’¹ ¼?’·~°<Ž­Zc"爱ƒ`&qÕ{ÓÕ>æPCp^±Ð=5™ƒî‰_,`”¨i’¡2ŽåM~á*“‹PÜ„§>ƒ·Âh[¬úTÓCÇz‘Syôm§ÑVnºsb³r å°‚ô˜3DË:h+Š z­#)Šõ1'£‘R`£:K‘~Š{°ÐÞælÅ-X(g9Z±W7ö¯ ¹r7ö¯eå¦Rm;û€¸±ÿsCö§uvÔG QXǨ+¢7¶rÞ8z¶ 5ó¯bÄ¢NT¥®NMÞ£(T ЧUpêd™M·‚èl—²gÞðé`£œ÷ÐÎÁ›Õ~l=¹‰cÀ£ á`Zø1àÁAœ«áê²?nÂÔráy÷-nUÑU°¾?bI€äÖvXG;{¼wó"80rÒ†ó<Ôbó˜J[”²³<†Uða¼eþ9 i&ªÒ[#y™Mû;ìG…mr¤÷¶ì#/#EìïS²mÜI¼o}Já)ï:—>¼ôÿ€‹»ê endstream endobj 4797 0 obj << /Length 2185 /Filter /FlateDecode >> stream xÚå[moÛ¶þÞ_á½À KRâÛG×iº ‰‘Å^Öa Ææ-²äIò–ì×_:–K¦)Ñ¢ÜýТ°ÎyÎãóJÁÞ¬{Ÿß}¿ûp°ž‚bÚÿÞC‚ ¤=† è§½_ÞcÆÿóÛøûïü4`p$´ —]Ï?}Yýì,¥¸Ãߟm8ÃLÿg°~l.Hä\åk4¡Ð„ ÿ-¥ë?€÷²•’õ?oWº(ÙyÈéæ9Ä­°“¶WðÓµ\,¢d6š¤™2 "0FÛ êýrÁ{D ÁZàÞbøa©²gƒþ@³BБ¬°ÍsŒT0µ°„ð÷ŒÖ ©ÃTãï L›j§cK>¶’Ï…Èj dr'³›8-JÇßEK8@ˆl ü ×§[“K}õ@-+’÷±ºP²Xfê€\îÊE¦W@†ÌÇÔîýˆb@¯Ú?WÙLÑ`ÜÏsirAª=6N§Za”M(Ô2“E§×ÐæmÙßMJ×±ªæ…,Ò„+L'nˆ=<¬VÃC”\Ë'ƒv¬ƒçNÚ©U{)°J@ô¤ã£¦!‹&~$m _1ä¹Pß郘˅Ó¼a'ÌŠb-Ïâê¼ïÅ(t÷„t*ã¨xþIE³‡"ïƒ5*Û‘q-Ö£¨ YEC™É^ž"¤}<­I>›Ä27ÉGP‡TÈZ„ÔÀé”=¤êcÂÈNÆ.äZ~[Aæ>ᔫp~¼_æêÏs5_šÂÕ>C˜G¥À3ŒAéZìpÅÅ}𬯸ˆG§¯qpË΀°VnØ:è:îI™b礼Aa,×CÀƒî‘&°Ç@ªƒ¾–T³! œ³ápX¤Ÿ3¹xèDÉ€½P*V=#í?)c| ~%m"ëºÚ?¨¹2U¾«üz§8´W¨‚FQrMx4ý¶,¾R3•˜l€ja3q°™¼±Íj£qX7:›ë¬ù:—…씥l g—7Ø fº¹ _G¬5Ý‹†eV- ¨…,&§ÙãÉ"tøéÐm:öºö#Ū#<¢<ØkÖNPì5"' ˜Ò7ÐÁOˆÛ½‘|T÷s†B¨£KÙœ”ë~vö£¬ZBòJXÃX BEµÎ¸ôŒ®†„K:æ‡DéE…çìCåõ†M;ŠfŸUbœLÑÚÓö­ýBe¸QMúšq‚] M¹EÜjÒøf¹§ü•MTRôïÓ¿üÌÞ)sž½—äl3°)Ss! Ø­Gn¨ûÖ+|,b™˜ÆúŸ˜tŽöyþK¤ :¯_;™’˜ÙÐÊrÝÊÖJêUÄ˼PÙ8SÊÇ‘ × â „ö7íe÷‡öML»(D>a¬Vq¤ñs%(w w z+‚›Z®Í€õT¥ÍÙÛ¶t;[†ÞÌ"‘®Óë‘1SÓhRZɸGƆ À4t×2Suó=S·êw•©d¢ŒcL—”áÉ È-UŒúmÿ˜}‚„B 6ðjÞ!TË¡VúíÛ¤RàžúÑ`|%Ók™=*ãtëìDC'$´ióºX}o×H.“BÍ2YDiâ kdËIú‡š&GDá^ÿ•¢ù¡»óæ~ytd¯±1“7 ¶@{)pkæ­š.'>b5G­ó0®€ðíxëx?^÷o:9žµ&#{›‘_!&Vƒ ;üj¤ÒÝFà”€x5RÖÿ®‘¥ƒ&`:¥íCBð’¬\-§éý2~üô´ÈTž›vÃFšKõ2ˆVbYf‹Xõ“éÏ*ŽÓ¿ ]ã†.=ÛÇXNµÄŸ¢Â4ª­@}] Ö›¢CÖ¶—s‘[9–9ÅÑT7Kzy…[/ã7üo@Œû·æ&—§1…Ñ®ªÌ]»|-˜›¦¾„”"á¨wQ-çwȇ÷µ³‰·6÷ÊRíðKóñ7cþæôûÃáÉÆ‚Ÿ¾ G˜¼Á” iá€M6ÞúÕd±è'Iú|º}7o½ïÞž¶’S¿xi8oÝ.l9Y«ÿ:HÓl%²0ŽH«×[A±—È¥@_ÈéJä0ô["‹ö%rñ˹œ)/×u@l®ë˜¸^dé½ú:W…œš›#‡æ §iT¼–hÄ3šÈX]ÈIa¾•â^û ì\û­°ôÓgéåH€Ý; »d\O^B‚ð¸À® ÛíXQCL¤ëviï†2Ió"‹’Ù¡ëQNwi¾Å÷áFf¹ú¥^†t¢ýúbÃD¶Â0üÜÉìYÔ§Cø²0ÝãÅÒÁ wæåƒnò4NßÃwº—Ëó‰Ÿõ–Gñpý3SI§œ¹é¡=“”÷Xø¢]©›®K¡~•ZÄd³‰Â†aÀ ©ó>ËÒåârªã=mç$Þ¸ô2&ñXÑ_j. p “íÃä–ŠÕ'_ǹí3çÔaØ>us–ýžã]õ×ÂAS«ÿT–ɾ&9 t ýrà€XÎæà,¥BýFè° Wþýî±}]r]h«ƒ·Q)×(Øÿù \`@ëæjçy`™ì\â7Qo,ñÓB·ÚÓþS”wù*Ñ÷-`ì“w¬y§¬FüÍ oß˸—1¤­‡Ëò—É`Ð÷ñ‰†¼õ'[ –ÉËWrËId¼ÄC}¸N,4|úX ¬Óp鉄ÚÓðªÝ¼%?B{pÌ!\)]$^:",“Õz~õ5qz²bñúù5Fö&šiåa¸GôæÃJ«wŒÚ_½Ü¥:Íd’_žl®Ø‚h7‡²·$t¥ï}Óñm¶^ÿÆž]É8C ÐÞÜa™Œ®F—>ÆbC÷I¹Voføõغ-ÿ4~÷?ßèD0 endstream endobj 4670 0 obj << /Type /ObjStm /N 100 /First 1025 /Length 2843 /Filter /FlateDecode >> stream xÚ½[K‹É¾Ï¯È£}ÉÎŒGfˆ…ݲ 6ˆ•¶…²v0‹—™EXÿ{‘ÕÑe¶zÀ9 =ÕõÅבñ®li­¦’¤5J•Å=þc!‰+%éÖ’”ùNµ1cÕkª½©¯pß°á+NT¸úJÕ&wXi"2¿··D²]…Ýîeæ+K4ÂÚ(‰¬5_UÈ/ÎmPbšä'æÉn€˜AÆÐÄm»·%îÛ½=±m÷‚ZÙî… :ï5\àyÕ@Hæ72èvoûv· fÈ0еíjKZ‹|-%öﯯÜ\ø2ª~Õ´ùÕŽ·Úýj/”t²ê…S+ιI J½ÃJS#›w´Ô„º¯zjªæ«‘Ú$Þ‹%hÄIÖ’ÀÌ?WkÂßý*v¬‰¯8uÞ®Jêb2ª¦ÞÈåÖ–z׿«žúØîi”í^K£ªs¦’¹š:Õ4d^ÀÐí*§Ñ¶«’Æ ìy'MccE-YÙ®öd+ÉXý[’%ßžÎ%ÙÆ b+(Ç6VؘÁ¼ûÝ뀨¶–7,…“;–:…óÀrãÆ†å˜R°ÜØ l¸nJqÝø ¤ÕMmiU¬Bš@ZmS„@ZísOÒ`ü.B 6’i´)O!6’ i´©O!6ý)¤Ñ´½®Fƒ¤A=NàÌ ‹Êeû¤1‘+÷VøÁü€¹ßº¥v¼¯ÜÈqáÔ®à·MÇÓ®ÜJó%¤‰ÛÝ‹w§·ÿþå>¾}xxürwzóõ_æû?ÿôð¯»ÓwŸ~¼ÿô® H”÷§?žþtúþ]oîN?Üü’Þ±ŽÜØ¿^ɾ½Ü5«ãsÍE Ÿû6½x‘NoÒéoÓéeúÝ/þyŸ«–ß§o¾¹Ã¿ÿŸ…´š¹»©Œ\§¾83”嬪Èo³ýo/ Á©¤Òé¯û{2ËŒ-‡}g…–¾þüóûøð«Ç‡/ô”ìF5ïz#"Û‘+{`he»ŒÓëOß܃}:½~ù*ÞÞÿú%½ÿ_…¼É»Ó÷uÿð峇ã)Ç¿÷çǯŸ>ÞÏ¿éö·¿ÜÿøÓ‡ïMSU̓¾ûëŸp·‡ð±}pªù3Ϩî|fP?/(—K E‹Eň…£Ä"G @<yòäÈ#---------íŒìqû¼¨± Xp,$‹‹‹‹@®\¹r äÈ5k ×@®\™™™™™™™™™™™™™™™™™™™™YYYYYYYYYYYYYYYYYYYY¹r äÈáDXÏ‹@nܹr äÈáƒ=|°‡öðÁ>ØÃ{ø`ìáƒ=|°‡öðÁ>ØÃ{ø`ìáƒ=|°‡öðÁ>ØÃûÙ߯ íU5ÃjNòLÏ­gO¤ðýL4òËX—^j¸)h†Úë d”iÝ2‰Þ(ÇU lDÓ–}««B0AÔì¹Ø&º®Ôå2úN¢K&8Äum!‰>²W‘V²"j]%a¶„InnˆgTköÚó*‰ª´Žšµl® Á> †Ò<ÎF†¿Í‚ÚJÿ@чÿ XÈk(ÁrõžE8£j=Ò…<ƒ—¢èC×2Ý ¬*¨¢®ôÒV2!_6T¢Ã[„Þ3ºaTc†×~¤Š•nÊŠúWÑp¶<¼WB…*JGA{hœmý†è4Êz‰›j`×Ú­X s V¢ ‡qšG wPB‹0øˆD_oŠWCyf¡½æ/ÅmÏ Ù¼¯†—²sRËRLÓ’ k¨Ä-• ú£Þ²¢àPn™íPu!‹ZÐÂ?*ç‚€…Æ:B…g±~#µÒI zå°`¨Ç©„{ç¥,ÎuBåLhQWÈ0âfAëëŠ ‰s]q¯¯+.$§ž¢Zê¥ç\ŠÖ<7ŸRs©xÄ £b³­ÜE¼Bƒ"Š*ÇNØ•‚ðöãœÅD(ûì!²˜(ÊŠ£ôÑø4Á%ûœÁ*° AUÑCÅÂÚ† ¾²Úëð숀…Ðáu°ªå TŒg`QP]úœ?X8+j·bQ}û²È ƒ@ÅÇöNêÈ4—’ˆØÍ¨iæÀ¯þ€!èÈ8WÚæh3T ß6}‰µ¶‰„a; dv±\'1úz7eXìsósÀbìÓ8¯Ü„lå¾s@ñyß5+B·ÃQÚÎ^bã:…•}˜¡Ä+z¡à±¤®rЕ1Bóè¼s ‚¯_ç°Ð$‰½Ý¡ztöÀu…C[Øü æ¡¶ß)àUýáé5 +ÃuC ÚúÂaÔlOðÌJKK CÖ†"\xEEäÄ^(\”ê"¥wÐÀ…Jºúæ* *+g®ÿj; ¸ku›¸Ê¢/Sµ¤¢Æó Äo[5£Kƒå¹+goFyïÊ™4ÆVK]ô\Î J3D*TØ•ýÌCz@BëúI c¤ÙeRÃè“M»ò•³h.!`™h‰`©†ˆa9í°Ô^YÙ‘O§h›LRŽî]9¡Ø²q4;[:ã–æÞ¸³h éí ,léØ isì$T#z¤õs+O$J5x„F¹”Ã"wå¸_½2TTýµP.ûƒ})Ä·bqX$H$º,R?mqdšem!µÜS‰¯’XÛ…Q °S?ùq6 äù¢G¡¢¯#–:Sg ôÁ"O`±VçàM^ºÇn"h¤ ŒVæs/¸ AjAµWú”ŽŠ¿2øh_Ù‡2ìÒd§ Œd6ž@biÁÝQâñNAK<‡]#QûÊr®É¥ÍáaÌta”3jÙá륋 1Ó+Løjó‡“1ÓOñY=­Í¤Á¹¬yØ ÝŽçE®ë#·7~|*"·k;j@úÊü±¦¨èDý¨"ÊH¬úÌyܨÌÃîÂ5lgaœÕa^e1žáiXE—Þ/EEõ'Övä £>ƒižO^LÓ#Y=j@Æ3tA~xržuí}†¬ZÑ3ó2øv¨éNû1<›]%!kó¹ùQÜ3 Ïçcôë$ÆÂØ-(&¸ÙåÄ“2G¡§œxZ»Å‹<óÈùYuŸæj¬ 訴YH¢xçÔÐ ?û ?aXfC:C¿|£Ñ² Û¡Ž aŸßiR°‚wNVÔÆ­XøöûI+¢Ì:ÀbÌ«zkµdÙ9LN|#>¸ò£ÌоÃÇ>XÈÈ)ÐÄÑ9†…E7£®3n; TÝ>`¼J¢ÒB/e7MÛY¸Ãh»N‚V>+æ¡~1BÙiö¹ŠÎj·ÚÎ~â]}*à?ò|â'<†ÿáð)ÔX»ýPÑðÿ`£±‹ü'@`WC…­Ü´£0EC^}È2c8‹VQ… Y¼Ùlu ‚ötÈx‹•çü)$8Ìñ¿ÿ a‹9©˜—ž7â ŒŒŽªÞ#‡ŠWáÍYõÜ{B«ëë ü³MŽºBIýë‹çþ¨šÝ6á§eÌ“XãðAÌRçháéŒýÑdD €£ÚÅJh€0ƒ…xùYä),V¦ôâO­waÝžDbeø6ùûOå, ù‰ÍRež½²Ã!¯-M§œuþ$u'¤°Pšg¯Ln5t¿'„ú#1çè}ž½2;z@·šÿÒiî endstream endobj 4946 0 obj << /Length 2235 /Filter /FlateDecode >> stream xÚå\YoÛFϧÐcXOæ>Š}q|ÁE’¶–’.Ð- ZÛÜP¤–¢Ú¦Ÿ¾#‘²5ÔpHŠGÐ-ò!þó›ÿ}Màäq'7¯ÞÎ^½¹æx¢€â˜Of! ”OB€5™-&?½¾ýpyõïü<ûöÍ5_&Š ‰!µûjû¥W° þæšÒƒoŸí¿~†…ùG’ÿènO?]:ˆc¤”{Úÿ,(›?@NÒíùÇ»í9œü(ÅþwJú!1 ›œ™Û*&žÍ®o/¯’¡1Qƒ‰È“|Á4ýpå‚DÁ e¢ÉOg„×S?Gvôʇ|þ}—ÃìàÏì(á±N`ªÎ G’ùÎ@ `[ñ{yÈ =7Lä('; –«H|ë`#5l$­äW¡œ %Åið«>ãäËm¼Ð¿;Pp„±ø6(°Ÿ 9AÅ<ˆôeØà6ñÊ$qW•ŨŸ32R@¸²½ÔŽ‘×Áybî*œi‚‰Åœc`6}b¼Ê3°ÿ@ó/Y„à/?æ¶Eо©!ˆ\ê `;/S#D0x¾ø³y%©þ6˜žfið['#÷ÛXÏ•øªBF`¥8½˜¯×Á—ÁÂ4B²ŸKzµ›âºP‚•(™¾us‹6% ÔJ³ bgó(X;e«1²n“V~ÝÆF·y…Ä¡v`¢}»˜½O:úÛpÿEëÒ ^?$éÒåë)Šu69akp&ͯ¼†J@¼»¡’S aR­äüµ¢Èø z¤±wz½‰2—ÍPã+휹±c_Ùêž5nQ ci¤êšÿ:ë'è—øfÛú–o¤oì¹¶Û0u¤çÙmœéÇ4ÈÂ$¾ÖA¶IµKÚSÀéj |„[¢ÁÎ8Ùß@à> f{*²ßlˆ*΀ÁQRþ*%`N-P€!Ö ­QÌœ¢“±¢†ºiÒ6*Zõ2h]†œS,™Ë!›*JQ©ŒÑVPülA°ÄŸì‡Mga¤;EÔ† ‚%ÇÁºoï'ÞO4¨÷;—l^ è·Ÿï!áð¼R#Ä%Fˆ?Rbîò@FI)Nµ-(hM$á"F8¤]#”÷“ñû¡Ðš@Œ¥œdJIÔP¥éa¤è§¸ñRãÓºò"R5‚Ý`Ç8¨œu©UÑp¬L­¬#ÊV…èŽÔÙ*˜õX]¢šNÂ@@Vέw@«úsí‡T´J¸˜Õ­K(Û÷wÎ×ÎaˆÐòg¶ügOzé¾](ô5| uâ; uˆÿ"Y.ƒxQ©ŠNYZPtHà»ûÿš t°ÑR#”l„4¡1r62Â!1³Å“¯HUŽ= {ríÿæ›` *ë|„(`uÎ^ê p&\Þâäz¤k= HÕ¤““:Šº¹4Ÿ^ÕMe 4‘ûðÝèìvéŽz*Àd÷É/¬i´Ÿ î“´9 ×ë¾H’tÆAænšÀJ8;ÉŽvÝÈ}·ï‘«ævä~,ÂSü p,º—5!2 ñÉÿNÇÁRWiiOÍ kzÁÄØv1ò ƒéÚê”í[Ÿu6ªZ=²¦9MµëJX9AA.ôTÿo¸…6›…Âê´qöK¢Zó³Uß¹jM„̧fÂ-Œ— J0Ê—`!S0ƒÊ6 Ô~£*g Â×Ë KC碞Ñn&þ=$5FÒ§FèÏ7Ê^…‘»MWAÑe¸ü>J²*%ë&à çõwyb¥ók?ÿ¬ñÁÖü“Wp¬cRPà +)°™QÕZ9ag¤¾UC{_©É±1ªì‹¯WQèœû/;§²˜Ô<2€&䑲( ¢Ë$ÛªÃÍM/© æêÁR ¹êY¬MËìðÖÕmªö6ÀÚÛÀìün¬*žwðî%cMóœÂK°]Ã!&[r ©Z™dN«:'µÒ©Þ\3oÑ>g•HOLü¢(Úžas¿Ö8çOI:Õ.µ&k¨×  h3c‡ãí—·A:Oú6~Øn…I¼®Üh¢K[<ü^éùíH×áØ¸MÃ[ eѾ¬¢ïÉûSÕÚûÏ’$rÉÕ|Äkد}Ø|aÛÍ’UU¥y­þ,¢§g~¬<«r'ÄÕ:.tøøtß× #›óöv+ç:-y#;"8Ø×$;8¢]!Jý羊^Ó¶0Þ UÃÊ`‘ƒîONÐ6“NE[­§1~Ì&øe|øQža$‰ÐP[kRÎGP©¬Û f^}®Û]"ÆÖ£m¨¬ð]yãù]p¯£ÊáA;?ê/® ‚6–釫ŠR¨}—·ºi4LYå/ë¥0¡KÚùÍÆ]Ïô”M`Õ<(ø¿}?ÿÎÿðð1Εþjy¯‹0~ì§ÇÄYóÓžñ«Eéý3; aRŸvaÛ_Såô\ ¾,ï“è]¸îVRù—oûñþ ¯ª˜ù¬lÓû¤apé£öjÇ .›ï1ÊŽ«Ú¼§æŽ•·´›ÈÖ-ûê,ðº'€`Vjµ~ ×áfù õâöÄFžòqÕbÊǪ¡ž8€i£ èBûül¶ úÁ¯ðêG%ð_G%ð×V‰?L—Uѱ=Šš) …bÂA7oý>jÿ_¡r¬øñ)ÌôÛ`þù1M6ñÂÕó—~UÙ^ç/VîwýfO¿¬Òä1Õ[½þ÷­üo4ãååÂð‹Œ\ò?¦afüD¾¾¼^-Etö”,òÏ›¸ºIn’LrÒžZñ’¶üî™@ïÂËÕìÕŸ¥VŠÊ endstream endobj 4799 0 obj << /Type /ObjStm /N 100 /First 1023 /Length 2814 /Filter /FlateDecode >> stream xÚ½[M·½ï¯à1¹pXÅ*’l J$€`éàDÐA‘c×V€óïóŠ=5#Ü3î‚ÄÝî~|]¬o²¥7M%Io-QôÄmøÿö%­ ƒ^RÃP…|Àɪú &*ó±.‰¸ÐF ȉÙ.ÛÕž¨mŽD}{Öyu”ÄeÎ9(ñÆgpâШ‰7FCƒæ ¶“Óh‰Çvo°±#Õ‚ÂÈR%óû¬¤Š?>¢T¥ùÆ©ªù+ZMµWˆáÙÑs˜¦jÏš´”ù„$ÂïF)IUÙG”´8 ÛÕšÔdŽ$µ2æ}šÓ¼¯¥VÅî0ê© ^£!Só‘¥Öç³Áy•(õ2¯§NZ|TSç>ï“Ô…|Àw•y_KXÊ‚9¨§î·`4Þ`øÈ°’¶ .il¬«[ç¼Ìil¬¸¦Ñ€‘¤Ñu>¡iŒáxÜ’ꘃ{2Ú®Žd<¥Á–L泬éä\)Y›ÏV¨¨&³ù,žJ™c©ð”%tJÕŠi*ԨȘ˜Ã5'(©tu¾R0à ”ˆÊœAÞ@a‰'Ál´Äãúdá"fÌFGh# AÑ'I<@¼‘Ä%â:9@)ˆ7’ø™‹îC·®ó1ÌÆcÌÇÜü 3fSÌVIºb¶ÊætÔÜ>Ùù6ÌVUNÃlµ™¯xÃlul7`¶jÛ ˜MÊœ†NÂìÌÜØ¥j¿{ñâîðö¿Þ§Ã·Ow‡7_þý4þûÏÿ½;|÷øé§ûOï \Dyøëáo‡ïßÑüáîðÃýǧô®Ž‘Õß\jVW©¢YÜTr©÷}›^¼H‡7éð—Ç·éð2ýé×ÿ¹ÏdãÏé›oîðw!‹JYa×'¹ôvkd¹¹‹ µd(Ð [È¢ƒ…«Oé¹ÁóB²¸ÐÈÔèYÀõ®c!BY >;AõDG®c’Ú…ô…¢0(%ÜxÍ–"T²`YªIfÑ=AðJâG¨é”=a9à…a«ƿǢ.\†ø'æ²»6Íð7`Uòž•r‘…$zφ¸_«N]À:yîàpsõÜ XpÍÂ7&Á£ÃVåD‚Ͳ–~+2²„p¯9Ó$(E;²Ú!!+f‡vOã~Э³@M¸¯›‰B¡ ?þkž¤5H)· O~+QH ¶™åf†vÃ8‘–²8°]Ýl žº!?cwî! H#¸âײÇa¥$ÈJA n«Î ^^ À}í)•gD‘ŒX~Iî¼§DëYñQƒEahÅ^¡ºÞLi ˆÚÉJ ÿ[ß…¬O°—g VÉ >ƒºeÔÌÂt¥•bõG?“`‚6\æ€âj¥$°^i›Ëâ’ð2¥õ\Ú‡¶>Ñ$§Fùä:á}dþVÇmÃs9/z‚ƒ ªw¯ .‘`êÏ`¢•3j+Oª¼ÊG¹•m‡C[™f"\³C¶ ï}‰ÓÊPîÑ’¼ê…"xr _¡^R£*+¼—àqyeä.zfª¬´=WÅ¿[—ž¦!ú–ôC:üøÏ%äf©sgA¶$éáË/¿¼›_=>aÇ})ß«(œe÷̺> stream xÚíZM‹$¹½÷¯ÐѾ¨_ú€aaí¡mƒËÎlsX¯³xé^†^°ÿ½ßSvÕØ‡UA]'CC«R™ÒˈÐÓ‹Pz¯-•ä½ö$flŒ¤¸æ½ár6$…š*ºÑ°Ô onž†U6"I9új-z‡V㳃;Çëm$©ÅÑê%I3NÔ%Éœ­wMZæÀÝ’Ê|¶{R=z#©½5) aŽÞ€vÎÛ{ÒTÇŒ9ò(ÉÊ|vH2½C“ÙÑkɼñ ‡';PHÖ¬³U“á1ÇÀÍ¥ÐrôbJ…=| ïì4VpäQÐQ9ò˜S–y†6¯EŠR­šBF»C«ÁÆVx­§ðÊ›ËHœ|HIÑæ³_ôÙ+šbÐKUæ³â©jål©Ú˜÷ÕTC+æ÷Å൞jD #Õ¡°óÐ’Z©E%5™½ª©ÙÑk©ùÑë©Åà©5å›ã–Ö£cm©1ïë©‹ÎQFê|€ì6{ñ2=”odšziDUëó>O€ÐŠ{qpÓV01žš½= ?zGÑ9Š—4šp—4zð>×Sñ>7Ä©_ÉžE~g¾w;¥ã—ŠH.t­ÁðvÌiƒÑZÜxµpÇƈD³âjyoçÕà¸>cjð†€#­UNÊ«ˆ 4½ÜY=®âa á¸5‡»ÐDä›ï­Àgbœ¸ÂÇÆ5‚¦Í«s ú¼Ê‰9¤a~6±>­Ô9ÞíÍ›»ÓûýôN_?>>=ßÞýü×çùû?<þãîô›§O{øô¡€ÊÇÓïO8ýöƒÌw§o¾N¤Kv˜B[ÍBKËàµ×\Mqß×éÍ›tz—N¿{zÿ”NoÓ¯~úîï9â×髯îð·Äh¹ù¸€P‰\°®‚‘}(TF–ò(¬fpÈ 0ÛˆÂKvøEÀ6ö%(ªnDQ%wpÀE¹€,®¢PoãÂFV°1v†,`‰ Û`ÏhžCV(bg\hɥК RM³pÉTÍà×…GÚ+€@xhkŸADÉ­ÊÄØ¢÷víÙ°ã¨À"XϽø/ƒ°– 9`£RÁò¬2-¡ª5w¯ K”WMž±?|Í‚ ¨« ([[@HiLh6lØ2J-(zß›³Aöd*oX'0 9Cúb•ß芅5BGUlk D왵ÁD+ÂÚh ‰À‚€Fö\¡Í¤q‘Â=¸ ]²â«²„Dg ™Ò4Ôn òULŒ­1Ñó”,à-áÖP…r‡¼UnEÝÒ`ø™Òt üœ¦ÁV¯v#I%Ú Z¡LAø=$ÃH wì LÏô‚‚n@pÅØ¨mŠJ™³œQ„A|Ú— ØHÝEØB/( &:2‹«(Àí;£¢Oá]Áš­÷ÞÈç°Á/b³m¤ ìXÙÜT¦26ük“.U^l´„CSB_¦ Ö4Äd @VT®‹22‹ëÌAb%·ëÎE g‚¨ÀäÊh`¹€~A&8Âo„â샦Ñc¯ U0Æ«¢ÑNES<ótæŒA*”¦\ÇÐvn^*ÐtqÁ`PüYW1Œ°}SÕž18èÇpW1ŒÛ'X‚ZêX»ó€íjp™'ö:U6ÔíÀ´‚0ö×sUYMæ(ÐÚü†a.Ô[xÉ}x0Ûm¬"„‘²<²ßØÁY)»8˜ÌüÆî(îùµ×á Pykªz  ¤­ŸcB:H»¬vòVöî›ç”y»HÁÚËÌ§í Š&ðþq4Êj®Ã/Êo£æUuoIyÖíæ¹hÄå$î8]}ÆQ÷Ä]@¼Ä]ñçp/çp×A¼Â1ÜÄË1Ü5à•a zà§wg£Ÿu\¡û0á`×KÆSê²"+±ÿ2Å[ÖZ°²Kú6þôç¿$A57lI½úøó?~<ß|ÿôø> stream xÚ3·Ô30W0P0bsC#…C®B.3 ˜’JÎåròäÒW03çÒ÷ sé{ú*”•¦ré;8+ré»(D*Äryº(ü‡‚ä1˜ÿÿÿÁ£ŒQÆ(c”AW…Å—«'W Ê  endstream endobj 4952 0 obj << /Length 361 /Filter /FlateDecode >> stream xÚ핱N…0†KHºðôªDãÔäzMd0ÑÉÁ8©£ƒFgx4…G`d {N[  !Ä\'/Ëé×6çü”óy–Ê+‘‰Kq"…”¹ù¹x•üƒËìBÏgz"7«/ï|WðôQèžÞâO‹;ñõùýÆÓÝýµ<Ý‹')²g^ìŸ¸Æ @;‡?&yxÄ|*t¤‰ŒTT#…Ôcްãú‘ôFGºßšjK Œ©ÆR¶FgIA£óö–°cƒ!„ 1 î'ŠtåÉU1¦Ä@”¸ª©IoIe3óC õŒÀqG`¤,Rh„-Rdd.R¼B‰y¡ ¤6SiŽå ÿŠsfê—ßo{O¬uÖZG®uò²|¯„ž|Çùä{Ó÷­ïéf~ûAHZØÛSãïŒ`*¡¼€p·@eI+¬b`–(ö#)ºÏÅéÁÀ&Š0Ðð›‚?ð&Ϭ endstream endobj 4953 0 obj << /Length 360 /Filter /FlateDecode >> stream xÚ½“½N„@Ç—l±É6<ûÊaDŠä<)L´²¸X©¥…Fkx4…G ¤ Œ3;;äâÇ¡“Üå—ù^ö¿Åùq^¸•;sG™+N\qê3ûb×9:W®È9òðl7•MïÜ:·éºmZ]»·×÷'›nn.\fÓ­Ûenuo«­Sh¬h™ ŒŒ%"0q†hjè9uT1''Ðad⪖ò¹Ê·n”Š|̇´¯ l@ ÄÔÍÿ±Ã‡|s,èT¨¨ýx?ƒÑ·jŽôkÂÌ(lý±Úð¦Ÿ0ž± §¢ùÉöåALÁú;–Qì78ßú?`ý'Ë%L~ÀI0>ŒÑ`DÛ{¨=c/ŠÚGÓ+y)¦ BÄ®„oÐÑ"6tϼxƒ“ùœu6Ú¤äÍD£ÕêA‰¬MÏj¤^_49Z9Gä³4-d¦ðáG5k­‡–ÇKCæ‘H\^ª²—•½µ/„@ endstream endobj 4954 0 obj << /Length 256 /Filter /FlateDecode >> stream xÚíÔ½jAð‘Â4>‚óÙ]C6 ¯LeR%)SD’.p,ìôÄçHaqrpåÁqvÏ%ˆX$Mp`?~ÿb¦ÓÒ—¦MšnäsMí+z2øŠF»D;»Ïã F1ª1IŽj 1ªxHo“÷gTÑè– ªÝÒ÷ ÐeðÅÌ.˜óD æÍºþrwTcy‹ zMþj¤ÒgÔ´Pg?QÚÙÉ(ûn¾!¡•v5æ|ø™W”ye¥¦©o¾ÓÌP^jûšW´rJ‚–­K¥¾**Ž(?YÙ¯(=ë¬-ö%ëůŸ¿öc¼Ã-Ê?[ endstream endobj 4955 0 obj << /Length 415 /Filter /FlateDecode >> stream xÚµ”±NÃ0†eˆä%?‰ L•J‘È€bFÌÉ›ôUò(}„Ž"¾óÙ9ŒMU9_bÙŸþ;ÇÚ« {m:³ñk/ÍÍÆ¼[ý¥­í þ<ã«·O½ëuûìçtº½÷uÛ?˜ŸïßÝîoÕíÞ¼XÓ½ê~oÀK©‡é¤À¢ü5„ÀáP ‰Jz¥¶@O«™¨‘N‘üZªTjŽ*,x³"á¤a$*™T€‹‡ÍY­p‰\Ra5Va5Vaµú¸ÒUXUXUX†Uˆf7'µ¤BjI…d’ $RK*$sȦDX‘1Q PÆýG—P¦&Õ2kÆ‚ÊԤ̔Ñj *SSYjræ’­’“Ëv‡ÌLÈ I©9©V8©V.R­š ¡VŸdj¾@‚šI¦æ{Eää{e»Ê@–š“©‹Ì©\Rãó ZÕð̬jØ+«Z3­g’OPR£¶MjÀ±!YÐb‘ mÕBÛFµp|£Z83Qm˜EwÕ¼-©á‡d¡‰xsÒw½~Ò¡¾¾I endstream endobj 4959 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ-ɱA…á“($§ñ ç Ì\v³T’µSH¨¢B© $:óÈ@\#Qþß_‡õTQUE&ªMGã…Ö-nÿu8³M [Yð,ÎVº]ï'†v=WéN;SÜ3uzÀ3üãéxîý:côÁEâ†_Ïìœ endstream endobj 4963 0 obj << /Length 113 /Filter /FlateDecode >> stream xÚ3¶Ô32V0P°P06S02U01SH1ä*ä24 (Be’s¹œ<¹ôà ͸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž.  ÿþøÿãÿ¿úÿüÿ™ÿ3Ô3ðq¹zrrJi` endstream endobj 4967 0 obj << /Length 209 /Filter /FlateDecode >> stream xÚeϱ Â@ à+B–>Bó^k­¸ª‚ÄIÛGë£ô:vž÷7HO„».!¹$‰'ó˜C^Ø›L9Yð%¢;Í ñDâ|£,'}àYLzc£¤ó-?¯+él·äˆôЇ'ÊWlŒ)•²¶½]¯ ÁJû¬aÐ@¿…£7ôÄ*Ñ8ºÙn¨•>ÒSúË_øWføÎÓ9sÖèä7p,"®Fâz"ª¾§K˜ŠýŽA=è7ƒcÙ×ÝÚ™üwߦÕ`PÓ:§=}Ù—š¦ endstream endobj 4973 0 obj << /Length 101 /Filter /FlateDecode >> stream xÚ32Ö32U0P0UÐ52T02R03RH1ä*ä24Š(XC¥’s¹œ<¹ôà ͸ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿ!àÀ …`ÀåêÉÈÓŽ¤Ô endstream endobj 4974 0 obj << /Length 98 /Filter /FlateDecode >> stream xÚ͉=@@ ÝwŠï¼}+6j?‰-$T Q¡TÎàfºG6¡¡2´JMé,'Å uw5Lão 2é¨RÝâkîÛ1C²&§B öJ3À<‚ßú‚Ò£ÅÀ|kø endstream endobj 4975 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚ32Ö30W0P0bCKCc…C®B. m1K$çr9yré‡ù\ú`ÒÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓE¿ÁþAý‡úÿÀ ˆgÿ€¿ËÕ“+ !$† endstream endobj 4976 0 obj << /Length 188 /Filter /FlateDecode >> stream xڵб Â0€áŠƒp/Ñ{“(‰8 µ‚ÄÉ::(:×GóQúJc.½¡Yt²P>z !ùÍtl JœøWÏQϰPpM3IŸôãt̂أ6 Ö~ Ânð~{œAdÛ%*9Ê#Øê$!óê i¸&¶‘ Ý“ÐRZÆT²,˜wDHcÚ/¸ÿÑþ&:'>¾ß¶¬z ¸ Wâf\Ð÷äºýÖ]y¿¬,ìàLiÙ“ endstream endobj 4977 0 obj << /Length 230 /Filter /FlateDecode >> stream xÚ}Ò±NÃ@ `Ÿ2Dò’7 ~.AE—T©‰ H01TLб$˜Þ¬}“ ^àCoˆbœl$8ƒ}¶GÛÇEAH9G§Žs|B7“>ëÚnñ°ÁE‰öŽÜ í•LÑ–×ôòüºF»¸¹ í’V9e÷X.‰Ù@̼c¢Dp#JÿêЊÎÿê‡Eïš¾¹êB‘—0ŸmkˆöªæâUi€Ä ”4p¤+nál¨ˆáM—áÊëÞ×#m¿všª ¥ #%í”âF• …^òQ0Ü_ß?Ô½ð²Ä[üPü¼ endstream endobj 4978 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚm̽ Â0ð@†Â-y„Ü˜ÔŠŽ…ZÁ ‚N⤎ŠŽÒ>Z¥à tÌP<ï*Ýò ÷ñ¿™Ÿdsô8å7ó˜-ðœÂ ø÷8”28]¡àö\ƒ[† >îÏ ¸b»Ä\‰‡ýB‰*Ji"¥ Q£l—wŒ‰Ü7=“|F4ý°cZF׌¤G䌈Ñôæ=’D?f+ÉV’¥æ‰LÙ3ë,Õ6¾(ŠÄ7Ú*ªªÎ#¬ìà WGiÒ endstream endobj 4979 0 obj << /Length 174 /Filter /FlateDecode >> stream xÚ31Ó34V0CcS …C®B.#° ¢’s¹œ<¹ôÃLŒ¸ô=€¢\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿ€à?’L2Ódþ"åÿƒÈúÿ€äù@òÿ y€ýl`þR%ÁˆJ6`(&ÑÍDA 74°ÿƒ» ìο?ìnþvÿ°_°ÿ``àrõä äE‰c endstream endobj 4980 0 obj << /Length 172 /Filter /FlateDecode >> stream xÚÎ1 1Б-ÓäfN`\‚Š .¬+¸… •…X©¥…¢«íQr„”)ÂÆ hoñŠùÃðÇLGó’Æd² ™]J¼£ÉÙ8yq¾aÝ¢>)Qo8EÝnéùx]Q×»qÚБONØ6¢¨R)ù¢—ADdPQe^ÅêË:¬ÞºA—À¿ìçÃLX²…ŒðæúP¤ÂsLj¸nq‹ÏV endstream endobj 4981 0 obj << /Length 182 /Filter /FlateDecode >> stream xڵα Â0àH‡À-}„Þ˜¦Æâ¨Ì èä Nêè èÜGÓGé#tÌ wBQÔM„䃻„»ßä}=Àùš‡#Üj8€É¨N¹ä‡Í j‰&5¥.(7ÃÓñ¼UÌǨA•¸Ò˜®Á•(„ˆ&|WTퟔžµ 6FA’òÖ#c/ÈÄs†¤áÿ¯§ªß ?û9ÓÖÏIgÕeãœ^D­ áJù/¤m-7$L,à¶Î—‰ endstream endobj 4982 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚ]Ž1‚@E?Ùb“i8{ƒ bâ&ZY+µ´Ðh ÞŒ£p„-)ë@,“™—ü?ÉÌ׋t¥Bµä‰Ó¡o=)NXΰ¸>(7¤O*NHïØ%möêýúÜI燊Hê©ðB¦P=€ÌÕ€sžó[ˆNt­×ƒ…C`™EY(›)j× ›‚kІ¯ÏPÎ`‡¢þ5ÿ••ìàW¢GÆ©¾œ²t-pHW¶†Žô<ÑcË endstream endobj 4983 0 obj << /Length 145 /Filter /FlateDecode >> stream xÚ32Õ36W0P0bcS …C®B.cC ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. õ˜ÿ`ÿÿƒÁþñ†ÿÇÿ0þïÿÇøŸÿ3³ÿaö?Ìøý>üÿÿLH=-0º¸\=¹¹ÍÈj2 endstream endobj 4984 0 obj << /Length 240 /Filter /FlateDecode >> stream xÚ±J1†G®L“7¸Ì ènÎ[´rá<Á-­,ÄJ--­7¶’GØä ÞøgµÑJ¾ 3?þYû£n%­¬äПÈÚËñ©šÏŠ’ÇhöôTñ7` V‰`ɪN´T%Zº àw:û~F¨¨b.H5#À@'ÄúJu– ÓHd3|MÞ㢿˜˜4Äé'rqúÉ– 8*U$²ˆ/¾á/© endstream endobj 4985 0 obj << /Length 148 /Filter /FlateDecode >> stream xÚ31Ó34V0P0bsS …C®B.S ßÄI$çr9yré‡+˜˜ré{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]þ3Á$;˜d¦%ùD²ÿ?$ùÿ’vü?€dÿ ùL>`ÿ'€É ’aÉÿÿÿÔÿÿIr¹zrr7 Šå endstream endobj 4986 0 obj << /Length 125 /Filter /FlateDecode >> stream xÚ32Ö30W0P0acSK…C®B.#rAɹ\Nž\úá F\ú@Q.}O_…’¢ÒT.}§gC.}…hCƒX.Oæ ü?äÿ€ý?ÊÕàŒÿþ#!þ ìÔFÿÿ€#.WO®@.ücQZ endstream endobj 4987 0 obj << /Length 175 /Filter /FlateDecode >> stream xÚ32Õ36W0PÐ5SÐ54S02T0µTH1ä*ä22 (˜›Âä’s¹œ<¹ôÌ̸ô=€\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. 5 Œÿ˜ÿ7€1ûÿ&RRO°?À`ÿ31ÃàÀò@lßðÿ@ýÿþ?ã†ÿÁ˜„ëÿc¨oÿtöþÿ€Þg`àrõä ä—‹¥ endstream endobj 4988 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚ32Ö30W0P0aS …C®B.#C ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Œÿþ#!þ ìƒ ýÿÿޏ\=¹¹õ'Xr endstream endobj 4989 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚÕ̱ Â@ àˆÃA–{„æ ¼V¡­‹C­à ‚NâTÁ>Z¥pc‡z1í䢻Càû“ŸÄÓјBŠd’& "> stream xÚ31Ó34V0P0bscs…C®B.S ßÄI$çr9yré‡+˜˜ré{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]þ1üg`øÿýÿ Éÿÿ´ãÿ$+øÿ0°ÿû$™ÿ?`ÿ'€É ’aÉÿÿÿÔÿÿIr¹zrr¿_u¬ endstream endobj 4991 0 obj << /Length 169 /Filter /FlateDecode >> stream xÚ•Ž1 ÂP †ÿâPÈâšøÞÓŠc¡Vð ‚N⤎ŠÎõh=JбCé3ƒàæ/„ü_ê&ó)[*µ<[ðÙѤ[ÖqXœ®”{2{™É¬•~ÃûóB&ß.Ù‘)øàØÉŒQ B‹(ÄF]Ô#n0nP¾A¥Èjdµ¢4_Aû~|>KF­Aš«ê¢Vê‡L®Õ™Vžvô›kó endstream endobj 4992 0 obj << /Length 183 /Filter /FlateDecode >> stream xڭϱ Â0€áH†Â-}„Þ hë(Ô ftr'utPt¶ÖGé#tÌP<Ó¦7%Ç7\ üÑÉH*ŒÝʵB5Å£„ èq»¨îêp†Ô€Ø¢ƒXº=³ÂÛõ~‘®ç(Ad¸“ïÁdȈ׌EÔø Âi£ÊY†–q*ÂÚ™O'ó¾OÞ;è,~6ÿxÙO@}ƒïñmeÔtÚYålúyûNmdìÕ_…… ¼óàa endstream endobj 4993 0 obj << /Length 138 /Filter /FlateDecode >> stream xÚ36Õ35R0Cccs…C®B.ccˆˆ9˜JÎåròäÒW06æÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0ücÀðÿŸü aÿHTüÿ7°ÿø¿ùÿAT¢á?¨ ‚H0МøÿÿÁåêÉÈN9V  endstream endobj 4994 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚ=Í= Â@à'Â49B殉;üSZYˆ•ZZ(Ú‰Içµö(ÁR!8¾ˆûÁüì¾í¦í~O;Ú­ñôu›ÈAÒŒý·­›½ sqKM3qSNÅå3=Ï;qÃùHqc]%ÚYK>VØ M3DäKÃWĸP…èëýcìN, …=á­¢7b[feƒ¸ ¼ð‡'¢?f–5¾â®Ì¬ð²îE€LrYÈŽR® endstream endobj 4995 0 obj << /Length 143 /Filter /FlateDecode >> stream xÚ36Ò31T0Pa# Sc…C®B.#3 ßÄI$çr9yré‡+™qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ä0°®ƒâÌÄÌ@ÌÄòÿÿ3üGÂìPqÊ1óB˜ù?{3þïg`øÔdÿ¨ñ—«'W S™Ov endstream endobj 4996 0 obj << /Length 148 /Filter /FlateDecode >> stream xÚÅÊ!Â@ÐÙTl2¦G蜀í¦[*IJIXA AP€D@@··ã(\¡ªŸY ñ_òg~˜Ï|%¥xMh¤jäìùÆ¡Ö^¦š§+·‘Ý^BÍn­Wvq#ûó®Ý.ųëä Ë#ÇNd& ~iAùDÈþÕüËb"Z$‡D€‘z¼Õ/5ƒÅÈ«È;þ.qmz endstream endobj 4997 0 obj << /Length 223 /Filter /FlateDecode >> stream xÚ]Î?nÂP pG Oò’4¾@û’<þ4RÕH¤f¨ÔN ˆ @ e@Jz³ .’#dÌPâú¡Ñ.¿ÁŸìÏ}óô’O!=Cê‡dF´ p‹&’©OÓFË ŽÔ32êw™£N>h¿;¬Q?ß(@=¡y@þ“ 1WYóÕ€* =!¿âpîBKápñÐQ¾då‹åWiG]xuÕâ^Ê÷ô8oqîæ/ÇéÚ"±%ûø$|¾"×+eqåzêÙuùâ°Ÿ ®„€Ó¿ð1|m endstream endobj 4998 0 obj << /Length 223 /Filter /FlateDecode >> stream xÚ…Ï1kÂPð?8‡4«“ï¾@ûòúp2`-4CA'éd;:(º‰ÉGËGy!c†`z§Ð‚.¿áŽûß]â^ÒWŽ9ágÇ~ÌiÂߎ¶ä½cNÓkg½¡iNvÉÞ“ý2Ùü“÷»ÃÙéüÙ¯Ç_”Ïx `€#Lèµ0]×üQ+A©”RÐ*µRAg5Bv™Õ¨&“Ð`$¾”ŽAÔb„þO Ðïn(ÿ1JV Eº õÐÆ•¢ŒÎ8A˜è¢‰¬—½Y(AÒä ž¾} rè=§ýòuƒ endstream endobj 5002 0 obj << /Length 204 /Filter /FlateDecode >> stream xڕб Â0à+ ‡Ø(z/ I• E¡*ØAÐÉAœÔÑAQp(â£õQ|„Ž^m‚E\$|Kîî¿¥Úý.Iòj’:Šzm}< ’Tœ00µÍãÅ’”D1åŠdF§ãy‡"žÈG1¦•Orɘ Æ<²ÀºØ€spùªÁ"–²G¥…9¦5¡4ÐÒʳò’ëQ3ÎܬŒxÇ:n¨™Ø«–~y~VýåòCTáé(Ô™£ÙüF++ÃI‚ |Û A¨ endstream endobj 5003 0 obj << /Length 194 /Filter /FlateDecode >> stream xڕн Â0ð+…Côï4_( Å¡V0ƒ “ƒ8©£ƒ¢àСÖGé#ttp0!‰Šƒ á·ärÿ$§T< N‚z’“’4”´xBÅÉ®‘ô¥ÝSlMŠ#››}dzA—óõ€,]NI Ëh#ˆoQgЀ–‰J£rÀª½Û—ÜHþÿððîNÔN#¨œ80om[…ÓµÀ™xáŠ"mTé#lûG[âX»)¼ŽúiuÞe0Û€3+|RA endstream endobj 5004 0 obj << /Length 137 /Filter /FlateDecode >> stream xÚ32Õ31S0P0´P06V06R0µPH1ä*ä24Š(™B¥’s¹œ<¹ôà ¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ŒØ?ðàÿ!†ü?Ø70aCÆŒ˜Øød,€‚@!.WO®@.õœ"m endstream endobj 5005 0 obj << /Length 136 /Filter /FlateDecode >> stream xÚ32Õ31S0P0SÐ54S02P°TH1ä*ä24 (™Be’s¹œ<¹ôà ¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÌØ?ðÿ ÿ ?°o`0`(`H 0703°3ð1È0X…B \®ž\\Ë—!Ð endstream endobj 5006 0 obj << /Length 93 /Filter /FlateDecode >> stream xÚ32Õ31S0P°bCK •bÈUÈâÄ@tr.—“'—~¸‚%—¾ˆðôU()*MåÒw pV0äÒwQˆ6T0ˆåòtQàc°o¨oø u 6 \®ž\\TtÓ endstream endobj 5007 0 obj << /Length 164 /Filter /FlateDecode >> stream xÚ31Ò31Q0P0TÐ52T05T03RH1ä*ä2±Š(XC¥’s¹œ<¹ôÃL,¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÀØ€L1C)0ÉÀ¡ø „’PÊB@¨õB€˜|‹P“ÙðX5Ù€X °:Õ¬NÇcV§† ² \®ž\\Á-› endstream endobj 5008 0 obj << /Length 117 /Filter /FlateDecode >> stream xÚ32Õ31S0P°b#3c3…C®B.C˜ˆ ’HÎåròäÒW04ãÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0Ø0Ô1üg„ÀŒ ˆ| ö õ ÿ!h€ —«'W %– â endstream endobj 5009 0 obj << /Length 96 /Filter /FlateDecode >> stream xÚ3²Ô37T0P0W04S0²T02TH1ä*ä2 (˜B$’s¹œ<¹ôÃÒ\ú ¦\úž¾ %E¥©\úNÎ @A…h ŽX.O…úÿ?€è?}àrõä ä¿Iz endstream endobj 5010 0 obj << /Length 94 /Filter /FlateDecode >> stream xÚ%‰»@@ûóç ÜÝ»¶öHl!¡Rˆ ¥‚ð÷„)¦˜ñšxOÃŒjéSªãl±Á…7ê?¦y„ôtRS!±á±Ÿ $o ZHÉÁÒŒˆ%ï—몈 û¢ endstream endobj 5011 0 obj << /Length 288 /Filter /FlateDecode >> stream xÚÐÁJÃ@à„=æ²/ î¼@MbÛ”BI V0AOŠ'õèAQÈ!¤y´}”øñ¶B0Îl&‘.?|C›Ì¿ðÏV3ôqzŽÓ`‰á +| àÂ9=öqvïža“€w‡á¼+z^ro¯ïOàmn.0o‹»ý{H¶èÐiQ¢)eMJ]©S2vÒH’¹k²˜Ì„©÷d-Œ!]#¾~šœu?ÌÚá»Úëþ8é,yl-”šÇVÝW6|tOGœ¾qÁáµ8ãîmhm›q¿m¨›QÝNcG«PtV<Wcù_õý:RÓ‰…â-•Ô\GIñ¶‘Ò»>˜)Í¿iRéòçÒJNøÚ¸ o/‹¶¸Là~¥Ÿ§£ endstream endobj 5012 0 obj << /Length 281 /Filter /FlateDecode >> stream xÚuѽJÄ@à )Óì ;/pæ“Sç ¦ÎÊB¬ÔÒBQ¸BâÂv>‚Ïß$peŠ8;»çå¢n±»³ 3³Ù~vˆNœÄSLcLð.†GHºŽpšmb·0+ ¼Â4ðœøüôrálqŠ1„s¼Ž1ºbŽ‚VÞšÝë{MuPJ{µ oM”Â7´"Øâ5?ÐKŠûZØgcGý?ÒQýFö´vè¸>*jˆ¹Ìµh¹è]> stream xÚmÐÍJÃ@ð 9æ’2/PÓH×V¨ Ô æ èɃxR‚ŠB%é£|‘^sÌ!¤ÎL¾ƒË$¿É.Løïlq¼pŠ“œsÔ3ÔgøÀhMÛSœŸ6g/°ŠÁ¿C­Á¿¢ðãküxÿ|usøk¼§a¯QÑJ ¿íC‘î>d<å2¡ŠJb«R¦PiAä‚ÕrNØw=ìÇp×Ãép wô×wÕÖåí¸zDDT#Õ#í ‡s%-åŽWVÊ’·Ð碶!{íá6“q`ǘøÞs|nàK°vŒõ+¨ƒÜ€ZV¨1œ{Ì‘'IM(”5ËŠ­o„M&D¦š\Í‚Ëná/c—Û endstream endobj 5014 0 obj << /Length 219 /Filter /FlateDecode >> stream xÚUнŠÂ@à]¶X˜"yp7Oà&B¼tþ€)­,ÄJ-…xœ`—¼¯äÜ+ä ÎÒBX³3wf>f¦˜Q6øbйËG)î38Aîf©kÝbw„q fù̼›‚)øûs>€/'˜™â&Ãt åEòæªPš‰>{Zâ; f,óOÈž?B]}tì1LÂU|÷hµ‡¼ª§!´ð‰’€‚©­õ°L+ôƒ^¤Þ¨†Ð=‚ˆ™ˆI æÂTÌB?…KkÙÝ Y +xir§ endstream endobj 5015 0 obj << /Length 245 /Filter /FlateDecode >> stream xÚUÐ;NÃ@à±RDšÆGðœ kK,¤‹”‡HPQ *BIAµs4ÅGp™"Êòÿ»Á6…õÍ®w»~¹¸óV¿ûÊüƒ*ýRÏuÉ%ƒ÷O]×ê^Ì{u{쪫íûøó¡ný´±JÝÖ^++ß´ÞšÌC‰„S¢É{)zÐÉü™\"i%»¬4á”6Íò‰Uj‰HSÑK&eo©ÂTF€çg³K´±³ðÿ5Ѥ²¨r#ïãŒØk¤ÁDV#¸ Ĉó7èÿ¯—'Šîïp*ÃSó¥±AÎ ×]­Ïú >à™ endstream endobj 5016 0 obj << /Length 275 /Filter /FlateDecode >> stream xÚ…ÐÍJÄ0ð顃}ƒí¼€öƒÍ² º‚=îɃxR‚ŠÂÄæÑú(y„{(3itáG&Édfôêd^QAeEÇ-–¤Wt_ªg¥5G Z”áèîQmj•_“Ö*¿à¸ÊëKz}y{PùæêŒx¿¥›’Š[Uo @<âˆ9ufÆ8g׋:&í°ç£ëh€¬FŽ÷ˆOÂ^|I‡ÌòÓNî{Œ§‘?,œ''Oìi%ÉÉõ‘”_ùàMÀü à–?ØK¯ÀÓ´ L Áz¢@;uÙúž3Áå2<ÛŒ+ãÙ¦Œ ÕJfWÄ-ƽ<Ï%5¾Þß’“É uöP›:¯ÕN}°m» endstream endobj 5017 0 obj << /Length 249 /Filter /FlateDecode >> stream xÚ]ѱNÃ0à‹Ù®ž¤f»–·Zªwn×BÆ{ÿG4êûèQ ù@ÅdNAÂÄBí¢Í^=•IÝ T‹d¬%sµ™÷˜Ú]KsýÄbr¦h6ó@Î^^43{2è±¹˜îƒzD!;‰(dý«­`ïÑ!´m¢X“Ú¯¡m㺠ZÆèB$B¤¹ŠÆRm7ó˜WúKPËÄ›–_ø †×Šæ endstream endobj 5018 0 obj << /Length 245 /Filter /FlateDecode >> stream xÚ]ÐÁJ„PÆñO\gã DsŸ « ×ZÄÓ¹jÕ"ZUË`Š‚Cúhó(>‚KÃØù®Žf‚þ¸ žû¿.;™ÏMbœÞÙ©qgæ%•wq™®.ùáùM–¹Øã2±7úVl~k>?¾^Å.ï®L*veS“> stream xÚeÐ1nÂ0à?Ê`é-¹¼Ô ÂС*R R3T¢CÅŒHµR¤äh…#ddˆ’úA vkÉþü{ño›áÀc6vŽ6c^'´##9–(›Õ–ÒŒô‚!ýjOIgoüµÿÞNçSNHÏø#áxIÙŒ¡;ê? *¡„Ðrú–§Ž£Ëħ¸óä>h Kur— FäP¡wåÙVÒ á¥¬Pu¨3ZB‰ŸŽÈç„Ïû®Òá(MnL| —Ü.G}Yƒk²ýzÉè~ƒm endstream endobj 5020 0 obj << /Length 270 /Filter /FlateDecode >> stream xÚmѽJÄ@ðÿ±ÅÂÞ˜yÍ— pppž` A+ ±RK EÁBÈ>Z:_#oà–)BÖ™½wáGf6󱩧ł2Ê :)¨:£òœžrójÊ’£UyL=¾˜umÒ;*K“^qܤõ5½¿}<›t}sAü¾¡ûœ²So€qĬ¼=f¼ï–›9fîðùÅ©Ëh€¤FŽ÷PC@s€>ítü©“óh¤G˜[†€ ´Rd‡ÔúÃJÉ " h"ö|š÷<zØŽÙtÄí! Í#ݲsi‘DÚ0$§'x,.$cq/õcÁ÷¢¿­,±Òág J z·ß\ÖæÖü­U endstream endobj 5021 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚÍб Â0à”…[úÞ˜V´…ZÁ ‚N⤎ŠÎí£ù(}„ŽJÏK‹ÑÀ@È—„ûá.‰Çé#œòfÌR<Åp…$å{d®æãxLÜa’‚\ñ+HµÆûíq™mƒÌqct•£ð‰tHTý€´#>EP3žßs‹Ò raJ !úÒ!L½Ñv(]p†gÑt.8÷Э xYÔ4}k]FhaZ7¥C|¦¢Ý©üÛxÞS)¨õºÞ‰ZX*ØÂ ¬Sšd endstream endobj 5022 0 obj << /Length 155 /Filter /FlateDecode >> stream xÚµÎ?AAð•Wl2#˜ØdKÉó$¶P)D…RA¨9š£8‚òbìóÆóË|3ÍüÐz´8*ãqqïà!ælK,Ýêf!‚™ç+˜´ÀËùzS/§èÀ4¸qh·TQûƒÒy”~1}áÉ „3îÌMP u|˜žðf*¡e´ðz”7"êÈ…`–`_ÂâSt endstream endobj 5023 0 obj << /Length 199 /Filter /FlateDecode >> stream xÚuϱ Â0€á”…[úz/ imŠu*Ô vtr'uªè\ÍGé#tìPŒÉE#.ßp—?"Æ 0ÁÁãã1îC8j ÚÑfw„¬¾F!€ÏÕx±ÀËùzž-§Ïqb°…"GÆ<)›o™×)˜Û~ôŒ­o¬mûÆ»mj¼ÙVFf+ɇ­cìlÝŸð¯üöO¾2¥ðê¥Î—”üVgvdMi5…”L?X:úpâêc=_ÿЧn3˜°‚'ä¯VO endstream endobj 5024 0 obj << /Length 203 /Filter /FlateDecode >> stream xÚMα Â0€á+…Cè ½'0©ØÚAª‚ÄI7ûh}”>BG‡bÌE1 䃻døÓA_æ$)å; tD‡/8ÌÌ,yä‡ý …bCà ÅÂlQ¨%Ý®÷#Šb5¥ÅŒ¶ ɪA¨u ÎD DµfcßÊ9ñ-O_pjÏ·3ðmß—3ômœÑß® ïýäð±5·áŸ~¶66¼fƒšÃ;_+­QÅáqÉšo&V—&9Ô ùx¾ç ×øûdœ endstream endobj 5025 0 obj << /Length 300 /Filter /FlateDecode >> stream xÚ]Ð?JÄ@ð¦˜"{¸3'0 ®› ë ¦ÖÊB¬ÔRˆ¢°U’›x ËÜÀ#˜8åÁøÞäŸIñ¿oŠóE«ÓÕZŠ&>Sç‘z Å‹ˆ( Ïb›ÿVEká_á«ð“kõöúþ$üíþB…Âß©»P÷"Ù)àÍ·é´$› £•NºšH’òA?%®“A^ à|‘6¤ï^ì£@Å(.§: \= )ʛɠâ¼Wš‘ªQY;àXývrÊšTfÀŠ©Š;£è¬ÈÀ‰£<Ö+fT ‡QR«‰÷ª8ä‚vÊ™– Y±eKÍa¦ hd'ÚÒþI~¶:t'mi «¹ ËÙª ñ#‰JkšRBÞÔVËAn+q™ˆñé¥™Ê endstream endobj 5026 0 obj << /Length 291 /Filter /FlateDecode >> stream xÚ]ÑÁJ„Pà#..œÅøÃÌ}‚Ô(u1 Lä"¨U‹hU-ƒ) \úhΛ½€ÐÆ…x;ç\G-PüëÿŸ(<‰Ou Ïè%œÇú)ÄWŒbZ¼äƒÇÜfèßé(FÿŠvÑÏ®õûÛÇ3úÛ› ¢¿Ó÷¡0ÛipM `L=GgŠ hTà6GÐ xŒŠa, B9Ǫ(A R}a9¡²Ø¬+ð,jX0ï?r¯•@5°dì'´ÛÂÆ¢ƒ„Qp,œÚé!@{F5Á(IÍ”’å€T@‘ÒÀõ£S’ _Ò =ß#¤ÂÏ% HÊŒVè–¿ HΈ^Z™ùƒGöÉ¿Ü (xš\Œ5™/3¼Å_Ë||Á endstream endobj 5027 0 obj << /Length 266 /Filter /FlateDecode >> stream xÚmбN„@à!$Óð;/ ÀHlÜä<)L´²0VjyÅ팷ƣð”äpþ9L0@¾e†ef§./ëZr)6r±]VWòVð«R£¹ÔÅœzÝó¶áìIª’³;sÖÜËçÇ×;gÛ‡Ñ÷<’¿p³"ŠO„ËO-“±.”4Ð7RD×Ê‘S4áEúYÚRÒzcéf‚ÒcÅ=¶T‰‡h\KΕÿHg:Ãd@ůq è¸_eÂÑ\·‚oÿŒã Ó™“ÍŒšEc†¶¼@[ÆÑµWðK›‡·†Y6' ÌPÇ¢ÕѶ’·‘›plЬ>ß6üÈ¿ƒmyä endstream endobj 5028 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚeÎ;Â0 ÐT¼ôõ H«*0V* Ñ &ÄŒ ˜Û£õ(=BGÔ`‡O1$ÏN;f2Î2LÐК¤h¦xLá†ó„Sg(JÐ[4ô’NA—+¼]ï'ÐÅz†)è9îRLöPÎQ¬µå°j¥¢Nå-ÑrÄ„TÿžD#ɉ~ –T?Bª¬”„frOMPÕ¨sÐÈ`à;¤vôî)Gÿ/¤O7ºr$òi%±O#É}jIå£$Ö£w{ðÆÚç?°(a/5ÿsR endstream endobj 5029 0 obj << /Length 325 /Filter /FlateDecode >> stream xÚmÑÁJÄ0à)=réu=%/ m-­+ÈÖìAГõ(¬¢7±é›|‘À¾@ËÆ™d -´—¯dštæO™Ÿ”¥HEv*޳Rà{q.^2öΊ—SqV µç7¶®Xr/Šœ%×X`Iu#>?¾^Y²¾½K6â!é#«6Â=Ð#mKôQGk:0HÜÂ7•Vȧ/AçÊ‘'Ö‘ÞzP·5×ý%4A?&4cüŸâšN1|‚lg¨uÜÍbi4®gí娕ˤvMƒõìÁÞÏe†ñjˆ•VjlYÂö ÃJ§oÚÃàZ`†ñ¯ZàøÑŽpÄp4TðçR«¤ë£éa;¬!»„%-_@êÙz:…«Ð!#=ºMiÕÓþÂy¶±«ŠÝ±üv’Ö endstream endobj 5030 0 obj << /Length 261 /Filter /FlateDecode >> stream xÚMÐAJÅ0Ð)]fa/ð¡sm+¶"ïìBЕ qõuéBQp×­Gɲü iœ™hMIyM:™ÌdhOúsj錎Oièˆ'Ͼa?ðbKýEú³ÅíˆÍõ67¼ŒÍxKïŸ/ØlﮨÃfGµO8îÊceID``g&@òY”â›ñ95³ü3çØ•’#­Ë™œœ¥ð “fW<@Ô ‚€E¿Çs>‰(Rµ §’:$ÓV.Á»¹bãAû*3ÂJêËü´€ î«Ê˜sìJ´¯Ú›?&¡JI_B”´›)J—rí&| eàýüD¯X‡×#ÞãdŒ? endstream endobj 5031 0 obj << /Length 255 /Filter /FlateDecode >> stream xÚeбJÄ@à?¤Lqy1óš;ÉåÄÀy‚)­,ÄJ--í‚É£í£äR®\g& wÚ|°ó'ìü[”‡å1Ϲäƒ#^¼<áǽP±’¡ŒSòðLëšò[.V”_ʘòúŠß^ߟ(__Ÿ³œ7|·àù=ÕP¹…aHÂ(fîãTÆÈ AêÄ#{Ľš8=N¦Ý¯™Ø#Ã_+ÑíÚAïžtjÖ›£4HÃ`~AWÓQ‚~,¨‚·@Ekÿ¥flF[bÛ³î[ªúÏ µ~”ö“-´½(½ÛN[¶N£ÏA/ñ£¼†V—í­‹³è¢¦ú?Fj¤ endstream endobj 5032 0 obj << /Length 214 /Filter /FlateDecode >> stream xÚUϱjÃ@ `ZîB­'¨ã«S0Òâ¡ÐNB§¤c )-t³ÍâGðè!øz²3HôñKh{~\.hN™ í)'—Ó)Ã+º,ä9Çqs<ã¦Äôƒ\†é>Œ1-_éçû÷ ÓÍÛ …é–áæË-ÏÕÞ±wzð´¶L“Ô 73ˆnb¤. fV÷ c†éF ÓI, —m%‰¦‘¬5µ¤Ò€Ä+I¤¹IbM/1šNb5Ó'ë1UÞó…Wà®Äwüݦpt endstream endobj 5033 0 obj << /Length 253 /Filter /FlateDecode >> stream xÚUÐAJ1à˜ÅÀ[4ç]@3SH[A¨œ… +âJ] Uº›£ÍQz„Yº(/É(™EøÂ !ÿŸY}:ŸrÅõŒO¦,[3ççšÞÈ™VlΆ£§WZ¶¤ïÙÒ×2'ÝÞðÇûç éåí%פWüPsõHíŠç¬r‡1ØZøµÐ p8áüŸƒ°ø#ól"kdû”ÜÓGvÈR !èPô)JÈ,Ô.¥Š ìRAE&‚Mñ½Ž#G±×˜¡ÞbToYè’=Ð$-¾C0dðLâÊÿ¡´øŠÈm¨.—ÛÒÖçFæüÃ’bðͺjéŽ~)kB endstream endobj 5034 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚUÎÁjÂ@à 9sÐ;/ ›UÖ¤*X æ èɃxRBZÚs·ôà­OP|–3ÿj˜€WòÄÄLĤ¹Å«ÈÀ3+¾®C ,¦Ít"‡”Éïå²y®¦\6´*ÀÒvè211©E[&:·|Ud–oÝäM~˜3óË\š<ü9äLæ ì…^|Ip…ÿù` endstream endobj 5035 0 obj << /Length 293 /Filter /FlateDecode >> stream xÚeѱJÄ@à [¶H^ °óšäð.¹êà<Á‚WYˆ•Z QìnßÌ ;ŸÀb!eŠpëÜn6âÚ}üà ?L=;^ž`e…G3$Î+¼+ù#¯”8_Ž£Û¾nx~…Õ‚çç”ó¼¹Àç§—{ž¯/O±äù¯K,nx³AcúÔ¦µ:¨sÒñ`§íõ+ ÑàÝEz’òb¿’^±ÓŽ^‰“ñŠHY ö&¡& ^T'¦{m „¤G©Q™PTjsªIÒ‹ªÔNê„Jœ´W¤„Ê1)T(¡Ú@ I{½;e$åõ!­êI¯ >Áª¤A|Yí½À(ß¡$ˆ>€è¼R'úoª')«á¤U?‰öRD ~Öð-ÿ:‰­T endstream endobj 5036 0 obj << /Length 275 /Filter /FlateDecode >> stream xÚeѱJÄ@à )¦0/ É>¹È™CÎL!he!Vj)œ¢BH-¾IÀÂÒ”W„¬³3ãA°X¾ewög7ÏŽVÇva—4òS{²²¾`îë…/ýäáצ·6_bzI«˜VWöíõý Óõõ¹Í0ÝØ»Ì.î±ÚXœŒsÿCÃõáЀøAdí1 mdçu¶¢ñÐáHlcµ`˶»­Êm ùìÄ/õ›ÛAôâ$šQÝÍ ÿçî÷Oó>‡jáÄZ&è¾?èJ6lKÎe@<€„!áü…ZCÄn!òϽHodn#iðXŸ©.œä7|pG_Ò¸‘u{w€Þà/:¹wÇ endstream endobj 5037 0 obj << /Length 212 /Filter /FlateDecode >> stream xÚMÎ?ŠÂ@ðoH1ðš\@È»€Nbj£àº°)´²+µ´P´ $`‘No°g‰7ñ)S„dgFA›ï/ê÷¢ˆ}q7`Âo:PhŠ>‡Ãgg³§iLjÉaDêG—IÅ¿|:žw¤¦ó/HÍx°¿¦xÆ@@6/ïcGÇÄP‰Âà”¨!×Rˆ^!ª'“ÌâTH3=™â,ÑšÅæ×R˜;÷â…g¹X²Kž%Hs$h%Æ¢uõg·+> stream xÚMÏ¿ŠÂ@Çñ‘-¦Ù70óÞ&a…ÀÀ‚VWˆÕ¥…rWšGË£lgé–[„è¬QsŧùMó¾yK)¦!õêúJp©á1¦Á°¹|îpœ£þ Ô žóŒ:_Ð÷ág‹z¼œP‚zJë„â æS‚ º¶àÄŽÿÔ¬jußkÉÀzçäEª’¥òÌ «¬°Q)Ü]ÑÈx’îÄŽ/ÊÕ¬eQPú»¬xÏÑžc=þrÔ_ÇÁ»°0’%t£ÿÀà,ÇÞ!_‰ endstream endobj 5039 0 obj << /Length 186 /Filter /FlateDecode >> stream xÚ]ο ‚PðOîœÅGð¼@]ÿ éb`955DS5¡öfö&>‚ã$»)5üÎð}œÃñü‘Ë6+X8!Cо¡ %j¡•P¦f•¢¶J`Rôò¢Ûþjµ×Ÿæ—­ùZzê FB”!Ì‚ž¥_©ºC4KhEoçM> endstream endobj 5040 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚUαN„@àÙPLÃ#0/  ¼æHÎ3‘ÂD+ c¥–íH ± Ó7ðY0¾ˆ@IAXÿÝcCl¾bvæß?;9Î2Id#G©d¹¬Oå!åg^å&²Þ^îŸxW²¾‘UÎúcÖ奼¾¼=²Þ]IÊz/·©$w\î…ˆÔÌGï ~=ÑBç‰Oá \N nk¢m`ˆª`Â\MèðÕd³G :5"ìÀ€šÕ»>ƒfÆâ®g¢ä|w3±ãÇòÞŒT8Ú¦¢º¥ŠLH[e"4ûü 8 ¿Ð6IõÔŸ—|ͬÁkÞ endstream endobj 5041 0 obj << /Length 193 /Filter /FlateDecode >> stream xÚmÎ=‚@à!$¯á¼ èòS $Љ&ZY+µ´Ðh²…‘åfx“=%-l,¾f&™LCö9áQÀQÂÑ„)LLès›ý‰¦‰ ‡ ‰…‰IK¾^nGÓÕŒ9oöwTä ”€Ý×pŸ< ÑAZ-¤Ý@:ÒÔh½M¦,ÃÑ™òTYõ(ûÖPà zãõG÷ãߨ IaévíÁU.R8Uk®èÏÍ ZÓ¢ B endstream endobj 5042 0 obj << /Length 216 /Filter /FlateDecode >> stream xڕб Â@ Ð!‹? 4? ×Zµ¤­`A'qRGE¡C©~Z?ÅO¨[©&‡á\îA.ärI»ÛêôÐÄf›–ƒ¶ƒÝ>n,؃íÒµ‰N¯Ì­w0 A.ÐvAN(2œâñpÚ‚ÎFh pi¡¹‚0@!D-%ŒŒð\"ùƒ¸ŨÞr"Ë®R\uêŠTÇP\(z>Sa¼¡Ø§#|¡sf’ÌC§¢ÈuªŠLç¯1>|Sþ¶Á$^IÁk,b&â…rŸˆñÕs\ ãæð;ø]ª endstream endobj 5043 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚEοJ1ðY¶L“2/ Ù¸{ºÀy‚[Z]!Vz¥…¢ ({ûh_$°¹"¬Î,»ÚüŠI曯^ŸSE º5Žê=:|ÆzÉÓŠÍôôð„›íŽê%Ú+ž£m¯éõåmvssAí–îU÷Øn @ð‰ÉëE2 ÊȨ èž1½JàAE8èƒA‡b„räÈßg|¯FÆí‰Ã„äÌ d¾]¥ 2÷ÑG€d˜÷Æ3úKê–‚ú'Îè‘'BÇ¥„žx`:!s\ÁIŸ²`~zNx /[¼Å_¨TdW endstream endobj 5044 0 obj << /Length 229 /Filter /FlateDecode >> stream xÚUϱJÄ@Ð7¤^“ò~@gãfa„ÅuSne!Vj)¬¢`•̧åS"þ@Ê-ÂÆûFaæ0Üa.wª³Óª’™,䤜NžJ~å¹Cˆøü÷æñ…W5Û;™;¶×ˆÙÖ7òþöñÌvu{)%۵ܗ2{àz-” DfJ £HŸGº„"|„Z¥ÑÖ¦ÁçÑԠÛ)ä€ò`ötfTvhÌ"Ã?|@‘×QZ×計VШó@0ã1ØE–Îã×¶-eý¶ƒÒƒ¯nOæ;`ëDŽhI|Uó†´éd" endstream endobj 5045 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚ…Í1 Â@ÐR,Lá^@ܹ€nŒ¦¢‚)­,ÄJ-m5âÅâMö)Sq79€3¯øÌ?ŠÃ<æ~ÈQÂq̇.ì6µŸý‰ÒŒô†£€ôžIgK¾]ïGÒéjÊ!éoCv”Í^a JH˸ìçø;%ü¢‡ŽB·‘Xœ[O”ë ÔŽgUð[¥kM•4FF~ŒúêÕxçÊÏ•€ÓìBTð hžÑš~; 9õ endstream endobj 5046 0 obj << /Length 215 /Filter /FlateDecode >> stream xÚ•Î;jÃ@à_¨0La]ÀDsyõˆ¬Á?À* I•"¤Š]¦ˆI Eu4ÅGXw[á‘× Æ¾f†™Ò|ø8☣Œ£¤à,æ<çuBß”¥Ò޹HÝìó‹¦%©7ÎRRK*Wü³ýÝš¾Ì8!5ç÷„ã*ç  /&bw¥ÜUa-« pÐð ¿6èu<ƒ@ôŃøÏâÉ×gè9{+p+tjkâܼ]]´GËsŒåw´¼¡QI\§•˜6¨Ñ†€ÿrYÛtZ”ôJ'L{JÓ endstream endobj 5047 0 obj << /Length 248 /Filter /FlateDecode >> stream xÚUαJÄ@àY¶X˜âòr™ÐM.ÞA\8O0… •…X©¥ ¢íeå _ë|“XÙFlR,‰3…m¾â˜ÿ/ʽe4§Ýœög4/é6ÇG,r|ð{¹¹Çe…ö’ŠÚSŽÑVgôüôr‡vy~L9Ú]å”]cµ"Ð-€"ÀŒ4ÉÈ6"ñn"ja ‰g\ô ôê½… ßÃ}abZvL£ºRÈ´WÝ€î¸Wq‘þæÏz=Aè…æ³ã=AF­…Zp2Ǥ>}Ýþ±áÄm¼§ÿ1¾fxÔ‘0Sè!9„¦ƒTxRáþé^ñ endstream endobj 5048 0 obj << /Length 172 /Filter /FlateDecode >> stream xÚ}Ì1 Â@…á‹ÀæbæºÙ…è ‚#˜BÐÊB¬ÔRPQH!š£å(9‚eŠÝÙµ¾êð”(E!¨/I )ÒtxA©M )»eÂ8E±!©Q,LF‘.év½QÄ«I m%…;L¿ð>?9›:À^ÖÓj¬šµœŠµ7óœ’ùNÁ‚ÿ÷Ö=¨»Öj •‘Av†G ¹Êç)®ñ ®E‡ endstream endobj 5049 0 obj << /Length 266 /Filter /FlateDecode >> stream xÚUÏAJÄ0à?dQÈÂ^`0¹€v:B[¡LaÁ.]¹WêR¨¢ÐU'GËQ2x€‹É¢t|MUÆÕG^Âÿ¿dùéyªæ*W'©Êçê,WO©xÙ‚†t,¦›Ç±ªEr§²…H®h,’úZ½¿}<‹dus¡R‘¬Õ==ˆz­˜Å€È!ò|¯e£2ŽL»Äñ²ä[+1“-ÿ2R•c;“–íë¶2l ›IÓTšõAp©ÝfÒvàî@tc[¥§Ö èÙÿư`æ)ôÏaTzÄCY?›ô£´‰/C ÷EåîPÚÌ5¡„Û&„së~´¡„o eŸôs*ÁP%Äe-nÅ7ã7x` endstream endobj 5050 0 obj << /Length 225 /Filter /FlateDecode >> stream xÚUϱjÂPà?ÜáÂâ ˆ9/Pc0$Bj¡;u(ÚŽ…V2H¼à‹åQî#dtí¹É`]¾á¿çÿáÆÉ8ÉxÂ)?DÏxšògD¿GNxšõ/ß4/)|å8¢ðYb Ëo7»/ çëKºä7é¼S¹dÏâ蓺øù@7=æÊbTªEV´žÓŠUш?âI4›öà´õMÔÐâÚç;žØ@ê½A¯êmQSuj#Síêõ}7µ÷ÝÈ~Ô9ìÌÜ`^¹©ÀBË× è©¤ú’tUž endstream endobj 5051 0 obj << /Length 190 /Filter /FlateDecode >> stream xÚ=ο ‚PðO„³ÜGð¼@]ÿAµ(˜AAM ÑT Em¢B/foâ#ÜÑA´«BÃßóÀ›;¼â™ËÇþ‚¯.=È÷tè°¿œ6—;Å)É#ûÉ­ŽI¦;~=ß7’ñ~Í.É„O.;gJ Àì+ˆ¯‚92´È =™ ¡¥Y5"¡ÙÕ$*GE1À_ßkÐMŒAÛŽÌfb)­n!ê ¢Êa—!"„ºt¨5¾}€6)è•GÏ endstream endobj 5052 0 obj << /Length 238 /Filter /FlateDecode >> stream xÚ]Ï¿NÃ0ð/Êé!÷Òš?"R)èÄ€˜ZF¤‚@ê€j?šyó=D ç¤$¶ôî|§Ïjr¢ŸÊ=.ÏYMxzÁ«’ÞH•]õlºo-_iVSñȪ¤âNêTÔ÷üñþùBÅìᆥ:ç'z¦zÎÈLfÜU¸ò›/à2¸k`£­¸Ö&[ˆ~‡ÜÀõ6bòÓùÝ‘Tƒ~4óЃ{ÚÎh{“FRýD“öJÎÊÈ*+o£Ft:‡^˶ñCØÆf\8ØŒ&‡†Ñôи%F–Ó¶öŸt[Ó‚~JlÓ endstream endobj 5053 0 obj << /Length 209 /Filter /FlateDecode >> stream xÚEÎ?NÃ0ðgy°ô-9‚¿ €“˜¿K+•"‘ &ÄÔ22€`«šl‹%GðèÁ²± U†ßòÞðž½:m¹æk>i.ø¬e{ÉÛ†ÞÉ–´æsû_mÞhÕ‘ybÛ’¹Ë9™îž??¾^ɬn¸!³æç†ëêÖ x ô·ÆBþ`'#¼ˆ"“QMU1"èQ~9üéé{Hw” \„šfÕP3] ˃ú,a!ÒaZW}¾²‡p{EÌÂL~& ‡< ‘ÒxD·=Ò/´8bª endstream endobj 5054 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚUÍ1 Â0à_:ÿ`/PìMC”v(j3:9ˆ“: U:ˆÍÑz”¡£ƒˆIÄ!Ë7¼ï‰é8âQL#NN"¦#Ç ¡ÃˆDòkgÌ%²- l©cdrE·ëý„,_ω#+h§‡ö( ò¯¿ ß0¬R‚GéC:k3•d¦V™ª4PÖ`  {@û1¼ÿ€¡gy9x–Ρoi|KãZ”Cf1.$nð ñÿ> stream xÚ=ͱjÂ`à2î’7hî èŸäÇ6]ˆ fìÔ¡tÒŽ…*:H|±é(V;Qû¬›X¶’¤\FjÓÛeý%E)æM“TÌ‚k1åRvûO1Åjª±˜™¾Ç}H9S Ü Á¹B†4øÅ7Z4^ë7^󝿬üð;r<×ÿŽÌȇ0È)¤ Êèz§»!ËB–e,; eá£__ß=Fʼ”W¹|/Hd endstream endobj 5056 0 obj << /Length 178 /Filter /FlateDecode >> stream xÚ]Ì1 Â@Ð )Óì„Ìt“MBÄ…Á-­,ÄJ-+³GËQr„”Bt ñóªÿá«|(¢œú1%Š2EûϨR.#Ê’ï²;baP®I¥(ç\£4 º^n”ÅrJ1Ê’61E[4%o!¨Aü™u4§x@ÕuŒ/øòØÓñYë¬qDówßûk;Ôp×pÒÐjh´WOü: ¬ðm 83¸Â7Ä¡B endstream endobj 5057 0 obj << /Length 216 /Filter /FlateDecode >> stream xÚ5É1JÄ@†áo˜"ð;ÉMB¢™……uS,he!Vj)¬¢°•›x¥9ÊaÊ)Bp’ÍS¼oÓ\^]sÉ-_TÜ´\·üZÑÕëK®õù¼¼Ó¶£â‘ë5w1SÑíùëóûŠíý WTìø©âò™º##„M~!ÝJõ‰Ë&Ò ­zåt9FìaÆô¹õ¹u‘Þ"øYa€áÌ b&ÄõÏ9ã1¬ÄM¤‘J·°‘^-}´ð‰?Ÿ°9:o,”U ÛŽè;¢VF endstream endobj 5058 0 obj << /Length 205 /Filter /FlateDecode >> stream xÚUÍ1jÃ@Ð/¶L!]ÀXsxµ^ƒ¶¬"W.B*'¥Á v+éh:ÊaKÆxl%4þ†oÝlÎ9üdxaØüa苬•2gëÆËþ@ËšôŽ­%½‘štý§ïó'éåë3Ò+~3œ¿S½b$PTˆ§h»$&wÊ;.CÕ¹ Yw¬þÐ ¡A ß †¿ ¸HD†‘)Ô€ TøC‰8À!ö#Çÿø_¢^P=”W¼ÉDC)´ƒö­kÚÒ V²Aš endstream endobj 5059 0 obj << /Length 238 /Filter /FlateDecode >> stream xÚUϱJÄ@à?l±0Åí ·óš,GHŠ`à<Á‚Vb¥–Â) r—GÛGÙGØ2ENÜS8¦ø`vfv¦,Ï]ÅW|測y]ñ³£7* žc]§—§WÚt”ßsYP~-iÊ»þxÿ|¡|s{ÉŽò-?8.©Û2" 5Bõ¶×+hßú……–‰&Q[Xo}ÝÂöÆïfô?´BÜÏôAqaú#ÐGØÏ L0P3 ¨(E§È>QZ–ÐAj4‰ú„¯ÄNq1 ‚2!šQydqõ-«`l.ŒÜÝvL¿@WÝÑaÔ endstream endobj 5060 0 obj << /Length 216 /Filter /FlateDecode >> stream xÚEͱJÄ@…áR Ü"y¹/ Iv"f!XW0… Õb¥–B…KœG›G™G¸eŠŒ,Ææ+þSS_l8ç’Ï .K6—üRÐ;™ís6Õiy~£]KÙÍ–²Û%SÖÞñçÇ×+e»ûk.(ÛócÁùµ{†òÊAzD¬jÈUW>õsèô‚ÕnVÐnŠ¡í-t‹ ¬ß+Ãʼ2ýü3¢;Ž_| üJà%Ár,¡cQvŽ$FŸŒ)úêX£‘F \ì@7-=ÐsºJÅ endstream endobj 5061 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚUпJÄ@ð/l˜Â¼€¸óšÄäHŠƒƒóSge!Vj)DÑN.>Z:_ca;S„à·Q9m~ ³ó)³“âT3­ô8¯´,´¨ô>—')Œfº(¾îeÝHz­ÅBÒ Æ%m.õåùõAÒõöLsI7z“kv+ÍFá˜QÁ¸‹Ø–Ú"qõ Ißîé`{¿ƒ}w3ÁˆÕ ¢™á›fÀÆÿaBì™»=ÑÌð3ã ÓKˆ·žM;tŸÄ~®è±='sŸ.ìC˜Ë±ä |G ew´†UuÌ‚%s‘LáárÞÈ•|–ob3 endstream endobj 5062 0 obj << /Length 211 /Filter /FlateDecode >> stream xÚ…Ž1jÃ@E¿P±0Eöš $+1˜Ø`bp°Š@R¹0®œ”ÛØ Î:šŽ¢#l¹…Èf Å<†?ïÈ<ͧ\ñ”k–9Ë3Õt" +–Ùýrø¡UCnË"ä6“kÞùr¾~“[}¼rMnÍ»š«=5kFÞç¬7Ê`€åhÛøÄß –#2o²YA¡;´§Ð `’°Hh¼ÎZ‘´"i‹¤Í ´É °!ó(£ðRF½ÛØ£µ±ÃÑDmå#þ½5ôI@%?‡ endstream endobj 5063 0 obj << /Length 230 /Filter /FlateDecode >> stream xÚ]бJAà?l±0Í>ÂÎ èÞ%w'6 Ä^!he!Vji¡hw˜_leáÊ+Bô¿\&Ìò±ÌÂìÌÓó¢ÐL/õlªE¥e©/¹¼Ë¬b2Óòb|y~“e-áAg•„¦%Ô·úùñõ*ayw¥¹„•>æš=I½RÀôü–4žt®…I6ÂFáZ“à˜€˜Ãt#ÍÀæÀ¤?ÀjvOG,I#¬“Ü1>ÂÇ-í k`#¾ØŽ°õ ™ìèyßñ¯½Dø}ÑçÛÃqç ž†÷à~`[ u¹®å^þš#g endstream endobj 5064 0 obj << /Length 176 /Filter /FlateDecode >> stream xÚmÎ1 Â@Ð iô™¸ILÀTÁ-­,ÄJ-mMŽ–x…ÁÒB\'î6æÿæO“„BÊØ(£4¥]„'Œ»v±;¶,4ªÅª·¨ôœ.çëU±˜P„ª¤uDáuI0vŽìà±ó[€>Ë™iÁ7 äw40`ÔV.Àªœ›óv^–'žVOȬh/|5V þÌW5cjSKü.[HG endstream endobj 5065 0 obj << /Length 277 /Filter /FlateDecode >> stream xÚ-±JÄ@„gI±°…y¹ü/ Iî/Åaà<Á‚V"¨¥E!Åá­øbkåkì#l™â¸ÜÿG‹ýŠfvþbzZ”ÑœN¦TœQYÒSn^ͬb1£rþç<¾˜ecÒ;šU&½bÙ¤Í5½¿}<›tysA¹IWtŸSö`šQì›ØA;(yD– Cõ˜Ž‹5£jÕ]ÆhAàG´ÑNùuÔ+7 œîÕÓA}Ù8¨o{õ‹Ä©=j‡5ÿ‹-?È nÿ_¥½L³s'æ¨;†ŒÅ¹è‡›ãt†¡-"s—=âŒHfÁ…¨{.Üî]=ð1#衇WC€Çà `.skR@eÝ endstream endobj 5066 0 obj << /Length 247 /Filter /FlateDecode >> stream xÚmÏÁJÃ@à?ì!0—¼A;/ IÛ„æPjsôäA„‚zª(ô 5¶²¾Á‚—Bë?Ôƒ‡ùv‡™ËéqYj¡µMµœkUéýDždVó²Ðj>¼Ü=ʲ‘üZgµäç¼–¼¹Ð—ç×É——§:‘|¥7-n¥Y)àzãyK=]€óIDÚ’ è02F ôØz² Æ:é×I‡ðKp>¼‹ølÉ;ÒÀ'Œ[rÂÂŽÅ^¸C4¼a p7é¬ï›þ‡ý¿ììy0Ï_ø·Þv„4’,ž0ÊÆ¢l-ÊÂöŒØÔ¢$¶Kι’/ÕRcë endstream endobj 5067 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚmÏÍŠÂ0ð„ sñ„Î ¬mm­—e?`{XГõèAQ؃­à‹ôr,XÌ΄Z4ÐMÂ?3·[qŒFø&Øéà:„D Ø ÿ¯V[¤àÏ0JÀÿ¦sðÓ<ìð“!Ò~„óƒ¤#´ úUÃ55†ÜâΖžAX²:•E––§Š¦DniÜßô8õuçÄ”M†öReeòŒ£7ŽVœª8@|Jâ—«)B„“;¥poT×Ó%zúªÄIjÕçÿb)\M͸úuÜw3¿ü険…q SødšY endstream endobj 5068 0 obj << /Length 242 /Filter /FlateDecode >> stream xÚeÏÁjÂ@àÉ!0—¼@ÑyvMˆ…¢`ÌA°'ÒSÛc¡-<ˆúby”ÜzMo9„lgÌÁJö[˜]fç7qÌ!ßòõ€ã”“„Ÿ#z§a*Å“´»yz¥iFvÍÔìBÊd³%~l_ÈNW÷‘ñ&âð‘²ÃFðsÔð+¿‚ï\©äœƒÐ*µR½+ºÿp§Œ.Ù)ogŽÂ6øþ*ÖTÿjÈ)”h` ìarAÖá’ö?æDƒžrìð8xuG+iN‘ iJ!Pú…’£ÂÂAm€½‘|cy‹¾ÎHníÐ<£úÔÐZˆ endstream endobj 5069 0 obj << /Length 250 /Filter /FlateDecode >> stream xÚMÐ1NÃ@Ðo¹°4à¹ØNì¤ÃR. ¢ˆ¨€2Etˆ,7sÇ-%.°¥ +æÏ*‚ûŠÙÝ?³[ÍΫJ - =›iµÔºÖ§Rv2_°Zh½> stream xÚ]ϽjÃ0ð·èB|/ÐÊvlJ 4¨‡@;uÚŽZZÈ¿A_ÉoA =+'7rIAüþÜ Ý¡,½Ì2Š)Ié"¥œONO ¾âhÌݘò«ÓÕã Î 4÷4£¹á>šbEïoÏhf·sJÐ,hPü€Å‚Ànaß- ÄO ±w°‘îD-V5JZU˯JW•ºWFšß1×À9Î p2[¨Ó4Œàâiª 莒‰> stream xÚM±JÄ@†ÿ°E`š¼™Ð$w‰±ºÀy‚)¯²+µ´P,Âm-²r‹3ñ_õäXøXfvþùØrqV–šë…ž.´<תҧB^eY³˜kUÿv_dÝJv§ËZ²k–%koôýíãY²õí¥’mô¾ÐüAÚÆHf¢™{`Š¢Ñ8ˆ"éá‘â€Õ"Ÿ`~à`ÁÛ'ìÀië8ØŒœiü'~aãÄa£ 73»PcãÄR¨K÷\ìO´0’!š‘ö˜ƒ… –ËРûgVÔ:Â.  ðP4IJìS¯áaòüŸ ‡ÈU+[ù§Œf9 endstream endobj 5072 0 obj << /Length 249 /Filter /FlateDecode >> stream xÚEÐ=NÃ0ðgyˆô!ï¤MD¤R$2 щ1QF$@ u@oFŽâ#xÌ¥üí1ø7ØïÓåâ¼,%— 9[H¹’ª’]ÁLq™KUÏ/ϯ¼n9{eÍÙ-®9kïäóãë…³õýµœmä±ü‰ÛéˆÌš£%šLOjHi¯%N{2½ò”ZÐèðN‡Àô‡gôŒŽ '> stream xÚÍ“?N…@ÆgC±É6½€QãÚ¸Éó™Ha¢•…±RK vF8Þä%^€’‚0Îì ‘¼Z ø-;;3|óqvrX”ºÐ§ú ÔÆhs¤ŸJõªL¡ù6Ç~çñEm*•ßiS¨üŠ^«¼ºÖïoÏ*ßÜ\èRå[}O‰TµÕ@W‚€dªR‰ˆ;Ȉ,Q–ˆG¨9ÛCi ì7rXKËä0—Aà@$ˆs;’²º:ñ>GOÔ11PV¨GG’ª à{ ré(µëÜ‘  J}1*7S(»$;SheIÙLõ>âoúCø¨^¥f­i0Ó¤ÚÙIñ™Î§ÉÌô¬ð§ Cœ4ôqú¢ŽHºèG®¹‹nJÛè°¬‰®³œcÔC +{ç7ZÛÎÛ¶>»ƒ Úà¿¢‹*E!¼Õe¥nÕ/ÙÏíã endstream endobj 5077 0 obj << /Length 244 /Filter /FlateDecode >> stream xÚ…¿J1‡gÙ"0M!óº·`D«Ày‚[ZYˆ•ZZ(Úºy´}”<•aÇ™¹ãôP1|ðå—?üâéáIO :¢ƒžâ1ÅH=>cT¹Pc;÷O¸°»¡Øcw!»á’^_Þ±[^‘ØÝÊ™;Và8ƒŒ‘?dm˜gPÇj·\R…q :“dÄ„*Á |…Vbn¶;ƒg³Eó çd˜ö1Öo( Ø÷aãhDBÿcü³!ýD[Áo˜¬1¿En¥ ¹±¦ä%iêÝînª6N:ó\ÒZÛ` æ]H›_ÙI<ð?yë­œ endstream endobj 5078 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚíѱ‚@ à& &]xúÞÜHLtr0Nêè ÑUy´{ጃ „zwÀ¡Í×6ÿÔd4”’™JBG´ñ„qlfiG{Ø1+P¬)ŽQÌÍE± Ëùz@‘-§¢Èi’Üb‘¤‚˜µ©ÒÁc®|æÚ!P÷Æái à±®!`{èø.ÿT¼ÊV6ß¡ýAÓõ_°yÍÀ4Õ8+p…o âøš endstream endobj 5079 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚµ‘±‚0†kHná¼Ђ±0’ &2˜èä`œÔÑA£3<šÂ#02Î^KL%!_sý{½þ¬æI‚!.qa¼@¥ðÁCT±Ý9ß +@P% 7º ²Øâóñº‚Ìv+Œ@æxŒ0> stream xÚ]Ð1NÃ@Ð¥°4¾;ÛŠBƒ¥$\ ‘ŠQ%Ú¬æ£ì\¦°v˜Y)¢yÒî·çÝT—ëk.¹æ‹Šë57 ¿UôIõJ/Kn®æäõƒ6O\¯¨¸×k*ºþþúy§bóxË[~®¸|¡nËXÊp8™ÎÙë…HDÑFä#ò°Ô々Ú~Àþ¨¨7ö'ÉQÈ”´^;LKZ+45qj@.dêtÜÇv“ù!¤¸Ç"iíÐÄÌôehÖ”ôÁjÛ]ˆÿdVçµ³½ÍSuž‡è ±ýõ?h©›ÓêgåcfKxýºëhG¿Á•¡Z endstream endobj 5081 0 obj << /Length 186 /Filter /FlateDecode >> stream xÚ35Ô34S0P0RÐ5T01Q07SH1ä*ä21 (˜›Cd’s¹œ<¹ôÃL ¹ô=€Â\úž¾ %E¥©\úNÎ @Q…h žX.O†ÀOþÁN2bÌH$;É&åÁ¤=˜¬“ÿA$3˜äÿÿÿÿ?†ÿ8H¨úANò7PJÊÃç‚”ÿÇ`$ÿƒHþÿ ÀØ`ÿð(Èþßÿ ýß E` q¹zrr:é“p endstream endobj 5085 0 obj << /Length 103 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0QÐ5´T05R¦ )†\…\¦ ` ˆTr.—“'—~¸‚©—¾‡‚ —¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹Býh“ÿ@)¨ —«'W )+« endstream endobj 5086 0 obj << /Length 96 /Filter /FlateDecode >> stream xÚ32Ö30W0P°bC K…C®B.K Ïȉ&çr9yré‡+Xré{€O_…’¢ÒT.}§gC.}…hCƒX.O9†z†ÿ PÈðÁ†ËÕ“+ ]› endstream endobj 5087 0 obj << /Length 94 /Filter /FlateDecode >> stream xÚMÉ=@PEáþ®â®À¼™x¨ý$^!¡Rˆ ¥‚°{ äTß±4J2:ÆÔ„–Ò”³bƒÙ‹ŽþÓŠ<@zšAjzHhxìçÉÛ‚ )9(݈Pò¾¯¨:<Ól ” endstream endobj 5088 0 obj << /Length 221 /Filter /FlateDecode >> stream xÚmбnÂ0à?bˆtK!÷8Á ¨Ô •èÄ€:µ¨ÚµðXŒî›¤o1ƒ…{‡ÕaKþ¤³ÿÁ¿«Ù¸œrÁÙ՜뿕t ª–¹ÐQ/^÷´lÉl¹ªÉ<Ê)™ö‰??¾ÞÉ,7+.ɬyWrñB횤NÀÑŸÄ9èÒÈm&6P¿¯:5 ’Â(Øß˜uHƒ27·P-òS0õ²nÔ@sÒ@ƒ¸Gh@Õ7ƽ@—ëèâJ' ¨N›E•®IpЖ÷êgôðþ×{ûï´ ‡–žécõƒÉ endstream endobj 5089 0 obj << /Length 233 /Filter /FlateDecode >> stream xÚUÐÁjÂ@à ƒ4׊ÁSµ`B{êAA{,ØÒž“GË£ôrô ngvÜ]vù˜]Øaþb:™Î•QOt ·O9~ᬠڕüpüÄe‰ú]Í ÔºE]nÕÏ÷ïêåëJå¨×j—+³Çr­€Ö€Ç(àYXU€õ‰zj&®|’€aOÃd pèùcš1uÔŽ¸Æ-1H[7c(< ¤bÆgá Xk;®>É÷èN`$ŸŽ³„Ö:¢‹ -åomc)¾ŠZ¶ç†/%¾á?OFi° endstream endobj 5090 0 obj << /Length 245 /Filter /FlateDecode >> stream xÚ}бNÃ@ `W"yé#ÄOÀ% í©‰ Htb@LÀÈ@ÕÎÍ£åQînìåøí‹ e@Ê铳å³_^-¯¥’¿+ï5±÷ˆ+ õÇÛ'¯[vÏâ=»dÙµ²ß>Ø­Ÿî¤f·‘—ZªWn7BÇ”R$c̤Ž(õÔ„•Ñ(NHN͇ÌxÎì‡ÙÄø—ù%ƒ•ƒõCke2Mo胵ŭB/ç©•ð›Äpè·8Yi¹RN„L4pʉ`Eÿ¡ËÀMôÓ¢s‚Ñd޽~Fgû:5ЗêTúŒŽšHºi¬Ù só}Ë[þL[œæ endstream endobj 5091 0 obj << /Length 266 /Filter /FlateDecode >> stream xÚÐÁJÃ@àYh`Í ”f^@“[ …ZÁ zò ‚ …* =É£åQò9î!tÝ™¤‡âAO;»³Ìü¶8-Î)£‚NÎhaÉô’›wcm(f´È‡›ç7³*MzOÖšô&”MZnèóãëÕ¤«Û+ ç5=ä”=šrM¢“@åë) ¼oç\SÝ%´Ø}‡«³ØqÝKK䄸´ã‡PËFïF왎»m4â„øˆ¤cž´ÂRÀ1Uó'~¤þú@õ›h`"[bzÄ ÉOv˜ÙJ:Y³åœ ¨°»®‡8!áÎy¥»@ì4÷h? î%<$ü¹.ÍùD‰pj endstream endobj 5092 0 obj << /Length 241 /Filter /FlateDecode >> stream xÚѽnƒ0àC"ÝÂ#pOƒ(TLH ‘ÂP©:D™ÚŒZ53<Â#02 ßÙ$i¤(Aœ>l#ÝÓxñSHiLÉ+}GøƒIfÖ!/ùàë€ËÕ'%ªÙEU¾Ñßïqjù¾¢UAۈ–A¥µîÄÑ©kó¡~ÍF AkóæpÖ³Þ`…Ñ9EåÌkð&Çkkpk ³Éá9ç“\SþX¿·ù}iúžõÙÀõ,3ÐðO®ùZ®)g{I!9ÅÎê·VÓ®ÈQ5’Fb´)e¬<îþR‚gJàëàÛ‘)›gpò-áºÄ<[?—Ò endstream endobj 5093 0 obj << /Length 230 /Filter /FlateDecode >> stream xÚmпJÄ@ð „´bæ ÜD؈ œ'˜B8+ µT´5y´> stream xڅн Â@ àÁB]ó^«=ì þ€ÄI¡}´>ŠàØ¡´&ZÚŠã#¹§N—,êñÑ.é>íl<¢v8·$•‹íGªiÕŒ«¨¼9O—=ªÑbL6ª ­m²6èMü”#Îi ÆÀx7.2>´Ê12¦VFS¨0•ªBÌ@‘ú3–ù`F²[ˆ…×cs4"#p}ãþ¢ýK¸—_†á_üŒà'Fújá¾À©‡K|ÒÐqj endstream endobj 5095 0 obj << /Length 270 /Filter /FlateDecode >> stream xÚ…Ð?JÄPð/¤ b.°ìÎ4‰°‚XW0Å‚Vb¥–ŠÂ²ÉÑr”=BÊ!Ï™I\ˆ ¾æG&óþÌ—¥§IÆ1/ù䌳”Ós~NèR-Æœ%ß§WZÝsšQt#eŠŠ ¼¾P´º½bù^óCÂñ#kôð…ÜUà9·µæµs`Ñàâ(+Ìw€z;#h¿GØÈž‹½œÐ!¯ éW¤øñze«»e0Òá¹TV<%× ä‘Êú_ÜHõ'Ëèo@Ûííeõ7®²)Àˆ%pÀb9 czCr™&!j.Ç; w¶³‘¶uØùÍLÚœ«ô$ – ]tGßPÄ< endstream endobj 5096 0 obj << /Length 217 /Filter /FlateDecode >> stream xڅѱ Â@ à YúÍx­ÒªSA+ØAÐÉAœÔÑAѹúf}ÁÑAŒI…C¹á~¾ä²Ü%ïvºJ¨''RÖ§mŠÌ3©-õb³ÇQ…vIy†v*]´ÕŒNÇóíh>¦mI«”’5V%AÍÜ0óåpFµ„6¦;˜—Â8HO?BEà >üˆ¡ƒDtWÈ£ød&VDñÍB;Hµ¢ph>?ìÃg_;ù# tXžymWú Ã,?‹“ øgÔ¬! endstream endobj 5097 0 obj << /Length 161 /Filter /FlateDecode >> stream xÚ3²Ô³´T0P0bc Ss…C®B.cS ßÄI$çr9yré‡+›ré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ìÿÿ!êAC=3Ø€õ`¢ñL0`'ÁÄ?3˜øƒƒ`?pü`âBL<ÀAØ£úA€=ÿÿÿñDp¹zrr¾aZ¡ endstream endobj 5098 0 obj << /Length 199 /Filter /FlateDecode >> stream xÚmÐ1 Â0à'„·ôBÞ4­¤ÖN…ZÁ ‚N"ê(¨èÜ­Gé::cÒ‚Ìò  üïÓÉ,¦€§$Šb:‡xG!tP”ô/§+fùŽ„@¾Ò1r¹¦çãuAžm"ÏiRp@™@ªTcYk5à¿ÿlÜ2ÛÚmj[¹-lK·Êœl?n½Ÿ¬ôZSÀXÔ¶C}´ªzͪ4çÝAG`ºæ R]d®3€˜/}Ï,åu3ömp)q‹_ûoaî endstream endobj 5099 0 obj << /Length 196 /Filter /FlateDecode >> stream xڅн Â0Àñ ‚…Côï LC[T?À ‚N⤎Š‚›>šÒGèØAŒEl ù‘Ëø'ªÙ¡"ÞIDI‹Ö wÛYh¯öaµÅ¾F9§¸ƒrÌS”zB‡ýqƒ²?B9¤…¢p‰zHp6&øÌÕžp¾|b¿-j8 endstream endobj 5100 0 obj << /Length 305 /Filter /FlateDecode >> stream xÚmÑ¿KÃ@ðxT³r¹X4íT¨Ì èä B :Š?Ð9'þ[·uô_ˆ®f’Áó½k›Úá¾|ÞÝÁ»Éá^¼/•ìÓôåA"¯c|ÀdHµâ’¦·8N1ºÉ£šÅ(=•OÏ7ÏŽdŒÑD^ÆR]a:‘[ Âþ’LK> "@ÎÚª(î ŠÖw­wVÞÒ¬¤˜nÐŒä5z+WñJ¥ð×ÕiÄ µì:yNÅR½ RN@WP!Ége¬Ë„¦­<½.#Òv­.©#ÍéFÝZ½ÊI»åÔ[Ê6È,,iÁ‡vR|Ÿ¶­¯•üŸZx¬ûZøsà!‰¥J¥“G*œh;‰¿ÜÚBamÅòi'> stream xÚeÑAK„@Àñ' Èk‡Àù©Úv¶ ò°P§KTÇ`‹:;}³‰û ó òèÁvzÏ]Å=èüFaü;“ON&S™ÈSºòs™ÉÇ_0Ïhžð”_<<ã¬ÄøVæÆWôãr!ß^ߟ0ž]_Èã¹\¦2¹Ãr.¡²„µjÀÊ5ƒn¡rh„߯á‡à3¾Û1¾ÖÒè}Z‡ÂCÑG¨tc‚P…ÙG¢zŒ°é1Ž Ú>#é ÖcxÖ,¬ ‹³ŠA•ºwÐÅÆ!2´EÕ *kíÐ8;´âAqÂ2¨À³jØGÅXmÁ Á'ñÎmA?N¼i¿ƒÞ/K¼Á¨‡xƒ endstream endobj 5102 0 obj << /Length 262 /Filter /FlateDecode >> stream xÚ…‘1NÅ0 †]e¨ä%Gˆ/m©xS¤ÇC¢L ˆ ßð¬´GëQz„ŒªÛdè"Jò)ËþÓ^žû+ªiGgÔzò;zmð„Þ³XSÛüܼqßaõHÞcuË2VÝ}¼¾aµ¿¿&>è©¡ú»€]@ƺ¼›ÙN¢ff¹üÒYÌ*˜à('‰’ ü‚Q‚ BФùŠ Id“!Ù‹¥T$·pÓa“¨èÿ‡6U.ÃοÀÅ~‹I2FE?h+(¸QÊ©š[/¹UöB–€éÃÄ oÄ\öLrƒD’Š5éßÑð¦ÃüÖ¼ˆ„ endstream endobj 5103 0 obj << /Length 207 /Filter /FlateDecode >> stream xڅϱ‚0à# $·ðÜX0)ÆÉD1‘ÁD'㤎áÑxÑP¯GIt0 Í—»¶×¿:è„bšòÒsÒ3º$xGrÛÒnœo¸ÌQH§¨6ÜE•oéùx]Q-w+JPetä1'Ì3‚ÂÓ€Ðõ˜ÀTPÔ\–6Bðæf ~ËxŽî3à9º:ð^vì@+ð{B#pˆ€‰*ɱpqä”íý‚>{È{ wƈõ( G5Já(ÿâ9Ò‡ýÂ6qã?¾}O endstream endobj 5104 0 obj << /Length 318 /Filter /FlateDecode >> stream xÚ…ÑÁJÄ0Ð)AÈÉh[0ëî©°®`‚{ò BA= *z5ý3û)ù„€—JãÌ´ Š¥í+“iÚ™Yž¸µ-ìÆ—+»rÖmìC©^”s-ì™›—îŸÔ¶VùuNå—Wy}eß^ßU¾½>·¥Êwö¶´Åªwôt¤Ôâ]ô:P¬=RÐâŸÙÀL ÓL”>n!#x`ï—´‘ÄI£&²QGÆ, L8s‰ïþ…‹’Ãßèþ7¢'ÌL`ª™n¢¥bÁ·}ÈcX±š*6áè+Öa}€”¡ØŸ6IôÀ~eÈ'¾:4‚:ä2ò`æ¤D@õÕe\ÏL<« ™¨§É£HéY ý4ñÈøÀàLÕE­öêoâ© endstream endobj 5105 0 obj << /Length 249 /Filter /FlateDecode >> stream xÚнNÃ0`G,Ý@¡÷à8UÚ2E*E"L ¨tìPsüh~”> stream xÚuнNÃ0ðä¡Ò-YÙz/IÀTt!R)`b@LÀˆ&PãGó£øÌV¤¨æÎa¨øÈðS|gûîlg{Í×lywŸíœç|×ÐY+Ášg͘¹} EGÕ[KÕ™„©êÎùåùõžªÅÅ ËzÉ× ×7Ô-0j`šÜ#ЧQ æ#ÀD¼LÚ€Òc0u(e ‹+9í1ü´ _¬E—ÿÿrùŠ4ê²A)'RòÐvd/Ú”F½¶™¢”NI/ÏJB7™,ú|z’5[%°m_‰«¾}תŒ¦£G9Ð;}ŒÞ£tøŒúBq)[m0”:˜Ï}ÐiG—ôy?x endstream endobj 5107 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚ…ÐÍ ‚@àÂyõ 5OÐ*h&‚ä!¨S‡‚êØ¡¨³>šâ#tô°d»µDFäÀð1?00~8r(9ôÈhïâ }OÔŽ,å`wÄ8E¶"ßC6]déœ.çëY¼˜‹,¡µKÎÓ„ŒZÿ¢‚¬Ô¹Y@T7sɸ z‚l»õbô¤ãÔ x³ýÄR I´;Èø‡®à­ŠªSqk¥¯([‰Å²µ\ÑŧÅy£NS\âwpmõ endstream endobj 5108 0 obj << /Length 240 /Filter /FlateDecode >> stream xÚ}ÐÁJÃ@à ¸0HsõPè¼€nHLO…ZÁ=yBA= * ÞÌ£åQò9öP:Îvô 9}à 3Uœ5gœ|Zp5çòœsz¥²ÒnÆå<ŽžiÙ»ã²"w¥}rÍ5¿¿}<‘[Þ\pNnÅ÷9gkjV,"­ùVöFZે˜áÀ&²WŽG˜"‰ì”“jØÈVÉFxA”Í=f‘^éþÇtXD:¥ýƒ$‚ߨÀQ`¢uþõÓ@ ¤ºú3 çØF«d@âma5_³óÙjέ ñ"btÙÐ-}”^p endstream endobj 5109 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚ]ÐÍJÃ@Àñ †@¯½9/ » ÄF„ZÁ„zò …Bõ(¨èMÌ>Ú>J¡Ç$ë~LµÙÃòcfØóê¬jHRYÒiE Iõ‚žJ|ÃÚmíxÁ§Ý .[T7(níE{GïŸÏ(–ëk*Q¬è±$¹ÁvEƌѱ©Q³y‰]CªÃœ*Ö>gY8U°³Î#å±`k½²ö¬&•³÷98ù7‹,¼ûàlïsÇJﯬËB>ø¬S}òŸƒ>éŸÙÔ±˜˜Œs¶aeÐø¬ý˜-«#ÕÔ¦~G~±—lÆÞ´x¿+%eÒ endstream endobj 5110 0 obj << /Length 318 /Filter /FlateDecode >> stream xÚmÑAK„@ð'‚ ëU(p¾@©™äÒAØ6ÈCP§Õ1¨¨³³ßl– Sb?‚ÑEXqz㨛ëžüñÈûó&ŽÃcêÓ  GtÒè„>ä•Ħ>¦íèá™ÌRâÝÐ8 ÞæÄK/éûÛÇñfWgÓ9½ÅŸîH:§BTºÁ†4‘Ò ÜÀ-AÇ]˜+ÅÉ@kS]Ñ”„žÆNZC E$«ž6ÒÑEfŠ{œ"92gÖ=ƒ4¦x? vl¸ìÈ% É„k‹0QÔq£µá¾¢t6Œ®,¤¬ ®${Qtpc6¢äÛ,2Ȳ.Þ¹lÉ!ÿ„ŽIËÉ׈¿Øã[qÝÓÄÓ$eO·e%7ŽXÊJÛÔqèòžvKÚl'A‘8Q”ÒÈyJ®Éj㬠endstream endobj 5111 0 obj << /Length 276 /Filter /FlateDecode >> stream xÚ]ѽJÄ@ð [†3iÏ*ûæã0^eà<Á‚VWÂZ §høf_$•¥¤LnœÝ™æ,–_f–ìþ™-‹³bi3[ð*K{~aŸr|ÅrÁuæJ·ñø‚«Ó-˜ÞpÓúÖ¾¿}o¨F`¦Î5@¦î5@/òÌ|ž™×øI¸ãÄÈOàRm\ŸÿáoC= þ‰þ‹×5Þãa“|Ú endstream endobj 5112 0 obj << /Length 212 /Filter /FlateDecode >> stream xÚmνŠÂPà„1­ÅBæ4¹a·ºà˜BÐÊB¬ÔRØ]VØ"xï£åQ|Ë!×1‚XØ|3p椪?pÂ)÷§)?y¯è‡†_²LXFsÙiœQ¼–ÅóÆlÁ¿§Åãå„ÅSÞ(N¶”Mpw"¯þ‘%Î@ ¯FÔ`_¨|ßÁ;Bgá9!¬4`Š&E£U ÁáEˆ ù¡­`ßàAíKª]Ã{ÒªÚAÞ5èä]m?ÎIT”ú*•%Ã!´4ËhE7U}Jì endstream endobj 5113 0 obj << /Length 227 /Filter /FlateDecode >> stream xÚuÐ=N1 à7JÉÍ!¾d¢Ù?FZ‰) ÚQ%$(`r´%G)V ž °ÍWØ–åçÉlßµÜð‚÷Of<]ðµ£;jçRlxzðÕ¹º¥eOvÍíœì‰”Éö§üpÿxCvyvÄŽìŠ/7—Ô¯ó1²ý¡Á/6;¨ yª &C†z‹‡PïÞ@oQ{½:CG ¢Ž2U¨…\Yô•MÁÿ‹Î:|…º$³ñB7¦0x¼âÅKœçP%¤ñ†ø${By‡œ:îéœ>ðLe endstream endobj 5114 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚ}Í1 Â@Ð/)S˜ ™ è&YIc@#˜BÐÊB¬ÔRPÑNÌ-Gñ)SHÖQ ±±xÅütæTÎ+ZS‘3P8¶†W]‘¡‹+|4(; ¬SúwXOøZ‘dx)ñeEûÇã÷îÝ>’ ÄÁ7¸{¦S¹•kœz(ƒ ÏhRЂž]«<ø endstream endobj 5115 0 obj << /Length 227 /Filter /FlateDecode >> stream xÚuÐÍ ‚@ð Á\öœ([2)Š„> A:D§êØ¡¨[¤æ£ØØÍCh3.FP-òCgwÿîŽë5u›ZäQC“Û¥N—vèj.¶¨Ó33ÛŽtVäjtf\F'˜ÓùtÙ£3ZŒ‰«Zóž ~ĨÂoÁ~yûcþáó·µO3I­âΪøÁúÐg¯`g²@¥`¥P?‰|ªXÞmc$EßbX©¹›KöoíJ>G}›—í¹Urì°Ô/ÛcCM~Yܼz¬Â'XÉ€…" 3Éå-8 p‰/¥fl endstream endobj 5116 0 obj << /Length 195 /Filter /FlateDecode >> stream xÚuŽ1 Â@D'¤ü´BþtE…Á‚Vb¥–‚Šv¢ñf%GHi!ê˜B´pgù3c[N¤¡6µ©í¨më2’­XK1|+åÏb-q*fªÖŠR“Žt¿;¬ÄÄã¾FbÑh.i¢À€ûÌÿR]Ü#¯sãìèÁ+ÀË ÿŠ JdDïz|ãɃšÿÇý÷y*Ô˜Œ*CѦ#6 wrÖp38UœßÛ{Ë •‰¼ÆÀAê endstream endobj 5117 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚuÎ= Â@à )¦É2'póƒ‘TÁ-­,ÄJ--m£×Š7Ù#¤L\w… lñ>˜÷šIÆ£tB%:iNãœö1ž0Íô™Ó »#–ùšÒ ù\·ÈÅ‚.çëy¹œRŒ¼¢MLÑEEpÓñTÀž |´E © ý¯ ¤†5àëæf‘Kó)%@h†ðî °€ó;Ô.^†ÞgéþñÍ T;gWø*S™ endstream endobj 5118 0 obj << /Length 257 /Filter /FlateDecode >> stream xÚu¿NÃ0Æ/Êé–<‚ï 1$Щ‘J‘È€S„„Œ : Æ/Æ£xcõèÕ|gÊF=üìûãû>»³‡ý‘´båÀΤ;•ã™ M_ íä·@¡§ýô™!3%Ÿ©×RJP™!ƒLjŸª ÒeTé"féSÊø‹_e鵟´!}Ñ ®©v–¡ŠYW}Çç#_ózGq endstream endobj 5119 0 obj << /Length 211 /Filter /FlateDecode >> stream xÚ}ϱ Â0à+Â-}ï L«­8YÐ vtr'utPtõ±#>€/àPßÀ±Ci¼4‡ùÈå.„ßë4Ý69Ôâíùäwiåâ=];ºÔ‡åûŠy-#¾Ei¿;¬Qô'rQ„4wÉY`X)ð:“ŸõÜZÙ÷?ëÆøŸ¶Q©UüξKþÁ~À ñ„{Í}C!`eá ¸èn!T˜Ëò2­V§ÏrS°’j9·eLtʲÜâÜJ½”’_oJ]pá?Rémì endstream endobj 5120 0 obj << /Length 150 /Filter /FlateDecode >> stream xÚ32Ö30W0P0aS3…C®B.#C ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ŒØ?0ðÑ0‚°0070àü˜ÿCƒýùdD (¨ž¡ýc`øƒ‚è1ÿ`øÿÿq¹zrrxæ<÷ endstream endobj 5121 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚÏ= ÂP ð”…,½€Ð\ ¾~ÐM¨ì èä Nê(¨è&¶GëQzÇ¥5Å>ñ9ø ÉHâc?"‡ìl7"/¢ ¤½‹gô=;ù2Û1ÉP¬É÷PÌ9@‘-èz¹P$Ë)¹(RÚ¸äl1K bÖh½n û†³ü]Z Ð}1˜þTR¥2¥ReI…j"*<~ð;Ð|ŒX®õjèz|Z§WÐ%ÜÍb‹·4ïKq–á _êãMt endstream endobj 5122 0 obj << /Length 226 /Filter /FlateDecode >> stream xÚ}бjÃ0Ð3·äâû‚ÊnâM¦P…vê:5IHVË[ËŸ¢­«Ç &ªî ­!œtèNgfå#åÄÛ,h^Ò¦ÀãœC¾øÚá²BýAÆ ~‰§¨«W:Ï[ÔË·'*P¯h]Pþ‰ÕŠ é!.7xùW‰é­Ý=Õ ¿çd°«B7ÒCÖ¦ k¸fÔ‹ «€FmS²°g~Ôr X%NXg¹@íÄÎqßÜ¢“vkùÒ5a{DƒW±-ðØK¬,¶#=¤=d„àCø³âs…ïø C„j­ endstream endobj 5123 0 obj << /Length 150 /Filter /FlateDecode >> stream xÚUÎ= Â@à‹Àk<‚s÷G‚vBŒà‚Vbe,-mGËQrËâ:Ó¨ ßÀ¼W=?Ù [öz9çS®Îðš­F}'fËÞÃ,¥… +¾^nG˜b=gSòαÝ#”Lô¢Zt*ë¨ÿõLd¢M D“ŠGb&(QÝSoð¯'ºÙcc#°Øàþ÷G> endstream endobj 5124 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚÌ1NÃ0àe°ô/½AûŸ'T e!R[$2T¢SÄT‘ÁV¥A\ª£QÀ ¡p¾¹EÔ´1r§a?‰]c{þ&ʶQÕÇ7P ‘_‘Hõ_"Ÿ" ë‚f´צ†8 endstream endobj 5125 0 obj << /Length 192 /Filter /FlateDecode >> stream xÚmÏ-Â@ài*šŒáÌ ØþŽ&¥$¬ … (@" àôXÈ%€ à++š.;¤rÅ|™·ó̦ƒ^”PH±´Oɶ0åräe³Ç\¢XR£˜ÚWrF§ãy‡"Ÿ)BQÐ*¢p² è¨Lo”ј§ª¬/¸do¸tï5Œ¬Ȭªõf;%_[Áa\kþ±vëÕ\`kð*·~Ŷ_;´§@ƒ1_c?Òú0¦Ä‰Äþà†[— endstream endobj 5126 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚuÎ= Â@àR¦ñ™ èf݈ÚðL!he!Vji¡h4GËQr„-·u²¢ìòov™—êN¯Ë ÷¸­95l¼×t"Ó—0a3üLvGç¤Ölú¤æ“Ê|9_¤ÆË kRSÞhN¶”OÈ* x9 ª –ƒ­N‚À a°Ž<+£ÀÆ‚ódørÿqB÷üƒ"ûøR -Oõl¿qÙ€äfM©ä¤’o#Eüf¼ä9b Ð,§½ ]Lß endstream endobj 5127 0 obj << /Length 225 /Filter /FlateDecode >> stream xÚ}οjÃ0ðÏh0Ü¢GȽ@+ 'îR0¤ ÔC¡:„NMÇB[’5ö£éQü1VOIó‡ÐD?„îôqÃâÖæœñ•Sð°àüŽç–¾I®™ìQ¾¯½Ò¸"ó*Md¥@¦zâÅÏòƒÌøù-™ Ï,goTM‰×-Pû²‚_—âÆéi€vP=ÒªƒZCù­ûK⑊]l¸¢Þé.*á3ÍŸ{P¾ï,›Øm¢ñ8Ôˆöb+ã þ’¹°º—T¬t€(‰"âêOìþ79ÕUÛ—Ú3iZÑ ýw'mË endstream endobj 5128 0 obj << /Length 222 /Filter /FlateDecode >> stream xÚuνJAðÿ±Å€¹6…yÝ;ïŒW1B®L•BREK EÁêöÞÌ}”{„-S„¬³1!HßÀ|1eqY]qÆc¾ÈÇ\–\ÜðsNo$9“¸.ö­Õ+M2  3“:™æ?Þ?_ÈLï8'3å§œ³%5S,†PÁUH¯P£úB‹¡O68÷j3¯=R¯{hŸFFnO_w,~IûÙ î”ёk#6~TAH‚´Ô·lk íÊßÊTðm<$;¶‘Í?$;ÖP±B„îšÓBd% endstream endobj 5129 0 obj << /Length 166 /Filter /FlateDecode >> stream xÚ36Ò35R0Pac3cs…C®B.cc ßÄI$çr9yré‡+sé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]äj˜ÿ7þg`ÿßÞßÀþ¿O¾Á~Ž}ƒ¼ˆ( ò òX€Ä{0Ñ'PˆzQ‡‹ø"þà ÁÄL‚$ñÿÿd‚ËÕ“+ ºæ;W endstream endobj 5130 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚ=ÊAjÂPà?¼E`²uç\ ¾—>‹Šµ`‚]¹WÖ¥ E¡‹Psæ%Þ Ðmètb© ÃÿÏøÇþð‰{~HÙØgüžÒ¼ãvüèï²ÝÓ$'»bïÈε&›/øt<ïÈN–SNÉÎx²ÛP>c˜ŸùÂ8jP£‰*&àYeqy×mwn\\q£¤‚‘F Râ"=-ÑJÚ¯ÚÁ¨è.SˆªL(—ŸJÐ÷¦«Ô/%è5§7ú9G, endstream endobj 5131 0 obj << /Length 176 /Filter /FlateDecode >> stream xÚUÉ= Â@à`Ú}ÐÍnT1‚[ZYˆ•Z *Ú‰ìÑÖ›ä–)„¸þ€føš™‰eW(¢uÅ’RA”‰#JåçYï0WÈ$ä;#WS:Ï[äùlDyAKAÑ UAЂŸö›¾ .€ œ Ü Xý­Î½ÁµÊß2 ÌxLÿ 3d°—>ÓÓ{ß”îÍ8µ†+àXáŸ?y<Œ endstream endobj 5132 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚeÎ1 Â0àW:Þ’ØwMC«u+Ô ftr'utPÜš£õ(9BÆ ÒZ)¾þyùb&3J© ©¤|NYA‰w ™†Ë–Ãr¾a¥PÂŽbjjKÏÇ늢ڭH¢¨é()=¡ª)rÛÆ·ÞE?˜nc ÌŒá†õà혤å=-$zL©“ %üÑ ”|(  D$q@3\O¼cæ=üi¡ÑÀµÂ=~] X€ endstream endobj 5133 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚ=Ë1 Â@Ð[»Ìt7&˜tBŒ` A+ µ´P´ÕÀxœ%G°´ÆÝDÃÀãó?øƒhÈŠCî{DìxïщÅæü°YvGŠS’+É™®I¦s¾œ¯’ñbÂɄ׫ ¥ ߫ܭª*ûá”pÞâ QˆDnRfi ±[:°J Jô ‘Al[CþÇÊ€±¨Æ1؆‡Æ­y¶¼4ݚ·è85øAÓ”–ôœF< endstream endobj 5134 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚUϱJAàY²0¯M¼yÝ=’»3BLÀ+„XY„À¦´P´Mö |„¼Ê‰àkhee‘òŠÀ:»kÀTüSüÿä£ÓQI†J:ɨÒ  û 1/844(ãåîÇê[Ê ÔW£®®éùée‰z<»¤ õ„æ™VrîÕmSwHÒ‚Õª-¬@~Eé–9ù: ZXïéz>÷ô±ñìÄÆ€L#‰­™Nä(± Ó ¬úÉ›ez‘3õŒ‰ÔêƒY×꛹hÔO@¬lÿáǤ‘c~$ <}M„ pZá þ„å]" endstream endobj 5135 0 obj << /Length 213 /Filter /FlateDecode >> stream xÚ5Í=jÃ@à·,nS4'ÈJ¶6 ŽQHªÁU’2…C ®,MGÑTn!´™“b>˜Þ”ËûÕ‚s.¤Ê/+þ,èHe%}®­.>¾iW“ã²"ÿ$Sòõ3ÿþœ¾Èï^¸ ¿çw¹> stream xÚMαJÃPà?Z8„fí x^@oÒD“É@­Ð ‚¤ ¨c¡Š‚SÍ£åQ|„Ž­¹Ô†sù†sá?šœç3º9‹3MsM.õ9–WI3n/’߯§ÌK1÷šfb–Ý^Ly«ïo/bæw׋YèC¬ÑZÊ…âp¨ ëý‰Â"lî1î^M+ ø{Œhðoƒ)à5ÈiD;['ZÔG½Êé;w>œ£ó‹SšÓˆ~;O{ë. a¯“Á@F‚‘`$ûõ^±ßŽZ¶´ìgÇΖaÛúylÓ_•›RVò§GS endstream endobj 5137 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚmޱ Â0†ÿP°pƒ¾Í˜ÖB¡S¡V0ƒ “ƒ8©£ƒ¢«Í£åQúJë]]î —||$Íy¢c½äIsfú’ÐøŒå&Î7*-™ïd6#íV?¯+™r·Ò ™J9s"[i ÃÐŽP=fjyÕ rÊ£@àP zP#ø0Âv‘8… æaâB\ˆ q!]']Ç®’®úÓ ÅexL¥;—î[Ü^þØý@kK{ú'žCÝ endstream endobj 5138 0 obj << /Length 210 /Filter /FlateDecode >> stream xÚuÏ1 Â@ÐR¦É2ÐM41Á‚Vb¥–Šv¢9Ú%GH™BÔÉJ›·ÃÌÀìƒnÔcŸÜéqrñ& =õciúůÉzGiNjÁý˜ÔDÚ¤ò)§-©t6â€TÆË€ýånàz¬*íp GÃ]bØp–êy¬Ú`JÁyãt‹÷C»Nþq•óÕ?Ê‹|µ¼¡[¼…A–´ . g©%„Ák™&® nW²„G-$ qNszmh± endstream endobj 5139 0 obj << /Length 161 /Filter /FlateDecode >> stream xÚeÎ1 Â@ÐYRÓäÎ Üìj0] Fp A+ ±Š–ŠÖÉÑö(9BJ É:‹-üÿ«¿2‹ÜRF[®)ÏéjðVz&UBsÇÊ¡>‘-PïxEíöôz¾o¨«Ã† êšÎ†² ºšÀ$,e¥<„Ð)1–o“V@,°1¦Ä7–ˆOl&†X*úØ\ø?¾mÏ×Ã0éqëðˆ?oEQ{ endstream endobj 5140 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚUαJÄ@Ð;L1ð óâ¾/pIÀB\XW0… Õ"j)¨(Øí|Ú|J>Á2EÈø®»æ0™{'/msÜh­-W§]§O¼I[+{eðø"«^âFÛZâ•Jì¯õãýóYâêæB‰k½k´¾—~­@5X£” ?,„T}ãaÄ!ü„S¸ ¯p3†˜1YÝöFù͆cÅø½~eOÿ°€M32![[à€cͳX«ØX0<' CÏ0d< ‚qD΀Œ/bav.ûŸB)%Udi`KÊžy‡\ör+?€¾f¿ endstream endobj 5141 0 obj << /Length 242 /Filter /FlateDecode >> stream xÚuϱJAà± ¢­•7/ {›Üy¸Dð A+ „ÄRPQ°òÖ7[ð|ûW¦8¼Ì$Ml¾…ÙÝf w\9ç>rQpYòÜÑ3*)æ\V››Ù#k²7<ªÈ^H™l}ɯ/odÇWvd§|ë8¿£zÊØKdiÐ"ëû¤D%(€ï;¥œ”Û<)÷ÿ‘”Ø_ŒïOIY Ó~0-Î`> stream xÚmнJÄ@ðØ"0;€°óšä.1åÂy‚)­,+µT´;LÞÄWÉø ûN™"dï r`óc™Ù-‹“jÁ9Ÿòñ‚Ë’«Šï z¦e­Áœ«zŸ¹{¤UCÙ /kÊ.4LYsɯ/o”­®Î¸ lÍ›‚ó[jÖ ¸ $N@*¾ƒímߥ=Z¤Œ$ãŒ`†t‡(ö·#üKúK¿ÇâmêÄxѦ­˜€/I$ù æ#`kõ¹›~jˆÞüÝL‹™ GÀ¨g:"#ŠÖŽº¡æ]§y<áØê^ðQµ¤Ñ¿7tMß_Ås‡ endstream endobj 5148 0 obj << /Length 99 /Filter /FlateDecode >> stream xÚ5É;@@Eáþ®@yWàŸ!^‰j˜BB¥J¡µu&ÁWž„¾J¨˜0ȨcFg ©kŠá7¦ÆBz¦ÚUˆmxìç1mA )9hª¶äu¿®_þóT€µ # endstream endobj 5149 0 obj << /Length 149 /Filter /FlateDecode >> stream xÚ31Ô35R0P0Bc3cs…C®B.c46K$çr9yré‡+pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ä00üÿÃÀøÿûÿÿ üÿÿÿÿÿýÿÿ@¸þÿÿ0üÿÿÿ?Ä`d=0s@f‚ÌÙ² d'Èn.WO®@.Æsud endstream endobj 5153 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚ1 Â@E°L¡70sÝì ’@°ˆÜBÐÊB„€ZZ( 9ZŽ’#XZ:IV›t«þ 3ïOÌØÄrÄ#²‰xjø¨éBºN%7nt8SjImYǤ–’“²+¾]ï'RézΚTÆ;ÍážlÆ@TðJô ø@ ðhxÁ«jze/¨ š]aöåÙáýÝ;¿íÇÎAdDÉ/ak+ÚÎ?i¶¥”T“‚RSÊ"§…¥ }G«@ endstream endobj 5154 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚ1 Â@E¿¤L/ :ÐÍ®A"ˆEŒà‚Vb¥–‚Š‚…EŽ–£äÁÍ$±ÐNxÕÌgæý¡˜1‡qß„l">hº.§!Ǧ^íO”XRÖcR 7'e—|»Þ¤’ÕŒ5©”·šÃÙ”s Î@ t€h~//i¹ÝKxO`L®Ð“tIVãçßxÅ?üÞù¼¨>ö‡©(=C±uÚ•¿/ñ@ªÅRÓr•iniMoEËBs endstream endobj 5155 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0WÐ5R²LLR ¹ ¹L @ÐÄ "“œËåäÉ¥®`jÀ¥ïæÒ÷ôU()*MåÒw pV0äÒwQˆ6T0ˆåòtQ`Æ`нLÉI†`’ù˜â‡ˆÙ@¨©˜RŒ)öÈ&U@¤c Œ‚ B•@5@µÃ ƒ µj-\ò²ÑÍ;@¶e¸\=¹¹³+ endstream endobj 5156 0 obj << /Length 161 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0WÐ5R²LLR ¹ ¹L @ÐÄ "“œËåäÉ¥®`jÀ¥ïæÒ÷ôU()*MåÒw pV0äÒwQˆ6T0ˆåòtQxÀJB±SŒ \Å¡˜!’ Ø%¡æý@5¯bÙ–A)~d%P PírÈFC-‚Z+‡ì$¨QL‚z…DK ¾árõä äµd*… endstream endobj 5157 0 obj << /Length 104 /Filter /FlateDecode >> stream xÚ32Ö30W0P0WÐ52T02R03RH1ä*ä24Š(XC¥’s¹œ<¹ôà M¸ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿÿüÿó‡a0C ¹\=¹¹¶ h endstream endobj 5158 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚÍŽ;@PÕggÜwAí“x…„J!*” Âî%>‰EÈt3ÍØ00 •¾UjÌØrR¬Ð豆iø¥qAæ 5‚T‡¸šûv̬ɩ‚½Ò p¯ó:½_ó¢thq_þh endstream endobj 5159 0 obj << /Length 103 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0WÐ5´T2u MR ¹ ¹L @Ð*•œËåäÉ¥®`jÀ¥ï¡`Â¥ïé«PRTšÊ¥ïà¬`È¥ï¢m¨`Ëåé¢PÿÀäÿP *ÈåêÉÈ- +´ endstream endobj 5160 0 obj << /Length 109 /Filter /FlateDecode >> stream xÚ32Ö30W0PaCs3…C®B.K ×ĉ'çr9yré‡+Xré{¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]dêþ7 ÂzlÐ+”Á Ѫ-õ@>—«'W Êî/ä endstream endobj 5161 0 obj << /Length 130 /Filter /FlateDecode >> stream xÚ-ɱ Â0…á gð 2œ'0¹-¥™k3:9ˆ TGAEçæÑòfÚ¢|Ûÿ—ÕÒ7ôlXUÔÀ:ð¢x@='eý;ý m„;P=ÜfÌpqË×ó}…kw+*\Ç£ÒŸ;Zä“Fy2d›åÏd“L*R!s™ÉB¬¹ËY°ŽØã ,P#Œ endstream endobj 5162 0 obj << /Length 164 /Filter /FlateDecode >> stream xÚ31Ô35R0P0U02S06W03RH1ä*ä26 (›Ad’s¹œ<¹ôÃŒ ¹ô=€Â\úž¾ %E¥©\úNÎ @Q…h žX.Oæö8qsƒÍ憺Ì ÿê››ÿØnÿÁÿ¸ÿóïý ÿÿ10Øÿ``àÁ 6P $RR ÒÒ 2d>»@nárõä äT¶Dí endstream endobj 5163 0 obj << /Length 105 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0UÐ5S03P0±PH1ä*ä25 …M 2ɹ\Nž\úá@.}0éé«PRTšÊ¥ïà¬`È¥ï¢m¨`Ëåé¢ÀÀÀ`ÀC‰ú ÔÐô—«'W —á)Ð endstream endobj 5164 0 obj << /Length 131 /Filter /FlateDecode >> stream xÚ-É1 Â@EÑ?^á ¦xЙ‰‰mŒà‚V"ÑRPÑ:³´Ù™&Nwo¾\ø’ž%红V\ó¦xA=y1žö:À¨n×w¸°ççý½ÃÕ‡ ®áYé/ ­tò‹½4è’M22ÉD³˜ÉT&2+•<å*ØñBÛ#´ endstream endobj 5165 0 obj << /Length 94 /Filter /FlateDecode >> stream xÚ32Ö30W0PaCsK…C®B.K Ïȉ&çr9yré‡+Xré{€O_…’¢ÒT.}§gC.}…hCƒX.O†z†ÿ 0XÏ ÃÀåêÉÈ[\w endstream endobj 5166 0 obj << /Length 153 /Filter /FlateDecode >> stream xڅ̽AÅñ ɉ¨ŠóÌ—eëµSH¨"‘ ” ôÍ£xw³ÓN¦ø5çæþgvZ8œ8K¿àÜñbñ€·²–>žÎ7TzOo¡×²C‡ _Ï÷ºÚ.)k̓<j*¥zÑP ¢±‰R˜è.NÑO|[ƧÕmÈÜÏdSéL6•Îeé\6•NdV;üxÔ*Æ endstream endobj 5167 0 obj << /Length 101 /Filter /FlateDecode >> stream xÚ32Ö30W0PaCsc3…C®B.K ×ĉ'çr9yré‡+Xré{¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]dêþ7À`=ƒ 1S—«'W fp"¸ endstream endobj 5168 0 obj << /Length 140 /Filter /FlateDecode >> stream xÚ32Ö30W0P0WÐ54S0´P06SH1ä*ä24PAS#¨Tr.—“'—~¸‚¡—¾PœKßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEA†¡žá Ö3È0຀`ý™ PÈx€±±¹™¨Ò‚¡€!ËÕ“+ &,• endstream endobj 5169 0 obj << /Length 107 /Filter /FlateDecode >> stream xÚ33Ñ3µP0P0U04T03P06TH1ä*ä25 (Ae’s¹œ<¹ôÃLM¸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. õÿAà˜üÿ‡Îj-Ô\®ž\\~,Ü endstream endobj 5170 0 obj << /Length 131 /Filter /FlateDecode >> stream xÚ32Ö30W0P0S06V04W0µPH1ä*ä24PA#SˆLr.—“'—~¸‚¡—¾P˜KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓE±¹A†A‚Á‚Á€¡€!0€Âs ÿþÁz ´oàcàrõä ä-#ª endstream endobj 5171 0 obj << /Length 162 /Filter /FlateDecode >> stream xÚUÌA ‚@à7 ÿÂu ÁÿŽXÓJ0ƒfÔªEBµ ,jímŽâ¼AiÒ"ßæ=xj1›kŽû¤)«%gš/ ÝI¥ÊÆå|£Â<°Ò$7}MÒlùùx]I»'$K>&ŸÈ”ÂGƒÈ½mÞ~¹¼ûi\Ô…ÎáðG8Ô¢x­8ÂM lÏŸj„¨0­ íéb+12 endstream endobj 5172 0 obj << /Length 94 /Filter /FlateDecode >> stream xÚMÉ=@PEáþ®â®À¼™x¨ý$^!¡Rˆ ¥‚°{ äTß±4J2:*5¡Å4嬨`ö¢£ÿÆ´"žfšû¹@ò¶ BJJ7"”¼ï몀Ði ‹ endstream endobj 5173 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚ32×3³P0PÐ5T06V0²P0µPH1ä*ä2‰(™B¥’s¹œ<¹ôÃj¸ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. Œ Ì Øð107È0°3H0°1X0ð10ð00È0$E@øPôPŸc0nøß`ÿàÿû0\@Œíø€Ìärõä ä;g0÷ endstream endobj 5174 0 obj << /Length 90 /Filter /FlateDecode >> stream xÚ31Ô35R0B#C##c…C®B.Cˆ D"9—ËÉ“K?\ÁÄKßCÁˆKßÓW¡¤¨4•Kß)ÀY(è¢ ÔËåé¢ð $—«'W Rˆ endstream endobj 5175 0 obj << /Length 91 /Filter /FlateDecode >> stream xÚ³0Ö30Q0B#C c#c…C®B. #ˆ D"9—ËÉ“K?\ÁˆKßCHxú*”•¦ré;8+ré»(D*Äryº(ü‡ƒHL.WO®@.ëë' endstream endobj 5176 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ31Ô35R0P°T0²T06V0µTH1ä*ä22 (Ce’s¹œ<¹ôÃŒŒ¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. 5 5ÿþýg„" Õ1ü*Êl*,,0‘ƒ—«'W /¨67 endstream endobj 5177 0 obj << /Length 200 /Filter /FlateDecode >> stream xÚµ‘½ Â0ǯ,ÒÙÁá^@ÓH[ëZ+˜AÐÉAA…*:ÛGË£ø&õ-8d¨ —áIøpéd8¢ˆȔҘ’ŒÏÈŒøŒã÷Óþ„¹B±æ(æ|B-èz¹QäË)Im$E[T@¼ >Øß²>¸˜A`AÇÉBË+ºø`3šô4;V¬è ‡+-¢ƒq€{m§z¡Öß×l[·]ý&G“ëG5Á˜jCãàØîŸ·Œ3…+|¯rPË endstream endobj 5178 0 obj << /Length 263 /Filter /FlateDecode >> stream xÚUÏAJÃPà‘Y13Ð4i»j³tåBA] * ]”vB.{b yÐ ÜdÞsJDìâÛüÃ{ÿÌqt”ô¹Ç &yÐ燈^(Ž4ìñ`ØMîŸhœSxÍqDá¹ÆæüöúþHáøò”5ð¾¹¥|€ü`aaÇ9Áïeå­ ã—R(£L¥(û3”]µ7EÉÛ`±¥EiÕÔêN-6Vj-pâW©|gÁÓíªÀ9£Ãpã«\ª²,~‰UsퟻNöŸívI ÊìN=k¿jF(uŠE}€¥ññ£òÖŸÚg\ غ]ÑYNWô_Z endstream endobj 5179 0 obj << /Length 295 /Filter /FlateDecode >> stream xÚ¥Q±JÄ@}a‹ÀîÚÁìh6± œ'˜B8+ j)DQlDîÓ⟠ø)-qf·ÑÚdáM^&/oÞlª“º±ÎÖö¸´ÁS{_ÒÕ•Î3úæî‘¶×¶®¨¸šŠîÒ¾<¿>P±ÝŸÙ’н)­»¥ng³@¯|a…Yn b Ä=Z F˜Á-µ;C4 ¬`Ú £ FŠhj…x‘†¹1føo8ý}}‹Èà¢IDœ3Ö솘sÓ{Hûõø ØC6æb‰“BKú¿à›i°”ªÁœSµÛr£æßØé(_Ó ƒ}NìÇ\F?t"@!„°Bzéï>a3û„óÉ'¼tíìס²¡é¼£+ú®E}d endstream endobj 5180 0 obj << /Length 172 /Filter /FlateDecode >> stream xÚ31Ó34V0P0bSK…C®B.# ßÄI$çr9yré‡+˜qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ø0Aý? Áøƒ½ýãù† ö@CÿùA2þ€’@5@’±D‚!™dþÀðPI¸ùÌCdþÃÀþƒ¡þÿƒÿÿ “\®ž\\^åˆÓ endstream endobj 5181 0 obj << /Length 175 /Filter /FlateDecode >> stream xÚ3±Ð31Q0P0bScSK…C®B.SßÄ1’s¹œ<¹ôÃL ¹ô=€¢\úž¾ %E¥©\úNÎ @Q…h ÊX.Oþ êÿ³ÿg``üÁ~¿ùûÆÿüäØÿÉ?`°gàÿ¤êàÔ õN}`o`üÁÀþ¤›™ÚÔøFÑ¢¢˜ÿ0°ÿÿƒÿÿ? Q\®ž\\à  endstream endobj 5182 0 obj << /Length 154 /Filter /FlateDecode >> stream xÚ31Ó34V0P0bSK…C®B.# ßÄI$çr9yré‡+˜qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]øÿ0AýÿÆÌذIù~ iÏ"ëÈ?P¨†ñ3õÈÿ@€JR×|Z“ÌÀ0ù Çÿÿ@&¹\=¹¹)“ endstream endobj 5183 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚåѱŠÂ@à?¤X˜f!ó·FHÄJð"˜BÐÊâ¸J--îÐÖ|1}_aaËÁu=ÎÒÎe¿Ùýg›Mû]îp,+íqÒçeL?”&Òwš¶¹X¬i˜“™sšË)™|›ßíŠÌpúÉ1™Œ¿$ùMyÆ€vˆ¤Š3|-{Pé½ÓeƒÓ!,¨„GpPghÁºFdPCWTíÓ-”k¦¡Cˆðj( ­g¸f"{¿!ªý—Â[ïÞ—ÿA£œftàùËC endstream endobj 5184 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚ3³Ô3R0P0b3sSK…C®B.3S ßÄI$çr9yré‡+˜™ré{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ø0Èÿ`‚úÿ ÿÿ=```üÁÞüÈ`Àxþ?!ßÀþŸAȰgàÿfÔ1ðÿAeücu1þ``ÿ4Ä`¦ã?`cÐÓƒ–Áü‡;€‘ýàÿÿƒÿÿ7`2¸\=¹¹UEÖ¾ endstream endobj 5185 0 obj << /Length 330 /Filter /FlateDecode >> stream xÚeÐ1KÄ0ð WbV‡“ä hÛÓëUw'ØAÐÉAA…Stp±7?S>ˆC>BÇGë{I<»üšòþÿ”‡ûÓJåê@íMTY¨2W÷âÓn檜„“»G>¯yv¥¦3žá6ÏêsõòüúÀ³ùÅB<[ªëBå7¼^* ák¬‡µÎ›Ø[ojW^ar¯„*ºóG½áÉ¿ý*šo¸ŠºhÈ¡YP~˜hˆ)?£_Ño`Ã`@tÑ6Š×éó£¯J[êL©žmS/t Ý]ŒÑ#”¯zð‰ŠI™m€’&Å+S£ % -%• -3_¸ÄP}ÑÒ˜w4ò&ë!Y½¬¯¼ðkC1 RÛ ¤u㛥ÞFt(×X@;xë1¸lYÛÀ1NNÛ|1`×'ÿ1:?­ù%ÿ©£rú endstream endobj 5186 0 obj << /Length 185 /Filter /FlateDecode >> stream xÚÌ1 Â@…á· LàœÀMŒÀBŒà‚Vb¥–‚Šv¢9ZŽ’#¤L!êÄ‚ºËWÌü0aÔíìs_„D¼hO¡Ïõ—±«-%–ôœCŸôX¶¤í„‡Ó†t2r@:å…œY’M¦€zÜáæ&óÐÎc¸¥§ÜÁ©ÎPÕêöøp±t¼¸e£] 0.â,$+IJ’“‹¬áâ­õ§_ÏFn_óoõ^:,Íè Àv;r endstream endobj 5187 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚmÐÁj1à é^=;OÐd-‘õ$¨…îAhO=”‚ÐöX¨ÒÞ„Í£í£ø{ô°˜N"¸Q6>fB&?™Nî'izàmf4Õô™ãáZûÒ||ã¢DõJÆ zâ.ªrM¿»¿/T‹ç%å¨Vô–“~ÇrEP@X×ìû8õ \²²IU{ó˜»ùÁ3ÌbÆYã¥1Ezôè$æ'i=SË©†LÂB„p6Pu Ž–8ç:R†£ ²Ž÷›[4ß9Þ²áéí…ÃŽ&ÎÈ&üZÚú'­ãXήÁÇ_ð%°m¼ endstream endobj 5188 0 obj << /Length 209 /Filter /FlateDecode >> stream xÚ•±‚0†0Üâ#pO`Amd3ALd0ÑÉÁ8©£ƒFgúh< ÀÈ@¨…«Ú´_®íÝýýe4fÐÜ,¹ ¹¤kˆ”µÓ„íÅåŽqŠâH2@±5§(Ò½žïŠx¿¦EB§‚3¦ i3 €5C8ZA–›À/:LÊ^ÕÁ­ûpšôXpžÛôkÚF¶­±bIF°Ü2ÕéqžËUœNÐC¨™E>ª_…ñ÷c‹ð+v·d¯ó¯åínÔâ&Å~VŸP endstream endobj 5189 0 obj << /Length 260 /Filter /FlateDecode >> stream xڭѱJÄ@à? LaZ áæ4‰Üª[-œ'˜BÐÊB¬ÔRPÑÖÌ›ø*¾‰yË+Äuv²g!–Bà#“ÍÌî¿ÎïúnÙñÎ;ÇÎóMG4÷Zly¿›¾\ßÑ¢§æ‚çžš-SÓŸòÓãó-5‹³#Ö÷%_vÜ^Q¿d ˆRPDZT†¸R´öR ÊOÔµ þ@ù*˜(ÞAWEÁ],øR‚º˜IµRê5ú7P­Ñ&?”2oÆ(~#FLØàgÈü5=dF#ïzv¢L;mf–Ä&,—mXJ[°Ìa Þ#å }Rº:%e-vÁvS½•Ô=U:î霾šes– endstream endobj 5190 0 obj << /Length 194 /Filter /FlateDecode >> stream xÚ33Ö31V0PaS Ss…C®B.S ßÄI$çr9yré‡+˜špé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÁõBýc``üßD@.ƒý0ÅÿL1ÿSŒÀÃ?UBÙ7@¨`JJ=SüPêŠýê (<ö¡9ÅñP¯@=ómrüC%h˜ACž  !@ y`> stream xÚuб Â0Ð  ·ô¼/0­ µ‚Dª£ƒ¢³ý4?Å/iLsqˆð’»INÍÆª œ&vª)©9 ¼¢‹åý¶O4¬4Ê©åÊFQê5Ýo3Êj³ ­ioK¨k2ýè D˜ÒÀ€§dFLƤ1’(­C8^Qˆ€„ÉÆDð¹ïɰ|pÃ1ÆÛ½Ó.þ"bøÿyÒ€Œ)™gëºk¸×¿àRã?UŸ’~ endstream endobj 5192 0 obj << /Length 166 /Filter /FlateDecode >> stream xÚ35Ñ3R0P0bSCSs…C®B.s ßÄI$çr9yré‡+˜˜sé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒÀd’ñƒü†ÿ Œ`’ᘬ“6`R‰äÁAòI68ÉØ€L2`%™‘Hv0)"ÿÿG'!âP5Ⱥ‰ A€J$ãÿ `G@%¹\=¹¹Mÿx× endstream endobj 5193 0 obj << /Length 254 /Filter /FlateDecode >> stream xڭѱJÄ@à?l˜&yM"&`µpž` A+ ±:--­7`ákMgé+ä ¼òŠãÖÙÍ& XšæKf’Íì¿]{Üt\ó)p×p{Æ =SŠu¨ÄÎæ‰V=U·ÜvT]j™ªþŠ__Þ©Z]Ÿ³>¯ù®áúžú5ð(ü6S¬ßü`À쑊-Ì— oÕ¶¸áÖë¥d‡ˆ¾¯ I¾Sòý03a‘™LlB".€¿Ñ!1ÍúOx½&ÂpcÄJÂ&ÆHù‹¸£…¸Û…˜„rI)¥ÌÜ” _ò,v0Ÿšõù{lØtéT–‰é¢§úî”Û endstream endobj 5194 0 obj << /Length 125 /Filter /FlateDecode >> stream xÚ33Ò3²P0P0bSKSs…C®B.SS ßÄI$çr9yré‡+˜šré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿÏøÿÿ?TŠñó bü78) À¤¯s‘)hèb y.WO®@.!»¥7 endstream endobj 5195 0 obj << /Length 106 /Filter /FlateDecode >> stream xÚ3²Ô³´T0P0aKSs…C®B.#3 ßÄI$çr9yré‡+™qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿ†€ˆ¡¾aècWüÅåêÉÈ3v\‚ endstream endobj 5196 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚ31Ò33W0P0VÐ5R0¶T05WH1ä*ä26 (˜ZBd’s¹œ<¹ôÃŒM¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. öÿÿ?@"äÿ000°ÿâ„=ˆ¨oÿ`#ø?0üoõ ü ä0X0È`a°o`àŠ2°7Ãñÿ qõ \®ž\\ŸÎ`¬ endstream endobj 5197 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚ]ÑÍJÃ@ðYrÌ¡¾@ û&A[sjsìɃxj= QôjöÑò(y„=HÇíÌÿДeöDzÌÌ~,¯/•/üUŒeé7~_òG‹8"ÇÝ;¯Οãšó›GÿõùýÆùúéΗœoüKé‹Wn6^DÈÅ8×I êF"!¢:˜+2oa[8˜®7“`¦dÎ`+ØÂÁÔôhLM‹fp ˜&byiguf0«­~5Õ¿jŸþ©RrÀyd* îÕõSkÜ_ Ÿ¨ NÔÇ÷9LÕxoéá ÿádÔÿ™‹„sù¾á-ÿ5Š•P endstream endobj 5198 0 obj << /Length 140 /Filter /FlateDecode >> stream xÚ35Ô³T0P0bKSs…C®B.S ßÄI$çr9yré‡+˜˜ré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿÿ€™dü€þ3 eR/i& 0È ò‚d“Ì`’LÊ?`üßÀðÿÁ@!¹\=¹¹Afl÷ endstream endobj 5199 0 obj << /Length 244 /Filter /FlateDecode >> stream xÚuÑ?kÂPð{<0p² Þ'ð%œÿ€ ur(Ávt°ÔÙ€«ê•]ÝÌGÈè|½¨X#yîøÝ=8. [~›< 8¢€:½û¸Ä°ËµW”ÅÇ|ýÕ”Â.ª1wQÅÏôõ¹ú@ÕjH¯>yoÉà瘣1 ýƒ¸ 8hFãx‡]Ê*ñ›1æ•øá8§¾yºØTBŸ¤,a P³ —À“M õ2Ü< œ fepÒˆ\$ÀIÂÖ5+zÛG4÷V¸Y5D NZ@fWðí¤'c´ÔÒÇýoÊÀQŒü¦Â! endstream endobj 5200 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚUпJÄ@ð/.0…ûfŸÀMNÖ?óSge!Vji¡hkRù\AKÁTÖ©$EØuwöŠM1üøf`Šï`¹·<’…Üw£¥>”w%=’Ö.>úÃí­jRWRkRçnKª¾ÏO/÷¤V›SY’ZËëR7T¯¥µ@fµm óÀ¦‡í¼ÅÏ0 à{d¾¦˜üۘÎ=õ4]LÕ3ùȦ€aÒ@b·´liº@ÏT|`Ä“MLjbËÀ¾Å4ŸLõ“ÿ1ÂÄdtFÀœW$®Gœ á*Ã.|ר™±ÕtIÿ6D†c endstream endobj 5201 0 obj << /Length 239 /Filter /FlateDecode >> stream xÚ­‘±‚0†Ï8˜ÜÂ#ô^@D'ÔDŒ“::htGáxWÚœmš~éÝßöú_LÂyÒxJsNgoô(ò»ÌéŠIŠîžÂÝ5‡ÑM7ô¸?/è&Ûñ~IŸ¼#¦K¶ Cµ¥ Ô¼*x1F%¨À)dBœÃè ñ‘Š…¬ªA«ÑŸ8çEÅjGîU…Ò(ßNk¼ûÈ4ª,— ~ÐjÔ…}Á<ÛC¿2[|Žþfa?­-ÈÖžÆ3ë ñ“­oŒ×œÈ¾}°]Ñ=ÂUŠ;ü”K‰É endstream endobj 5202 0 obj << /Length 167 /Filter /FlateDecode >> stream xÚ35Ó35T0P0bS#Ss…C®B.K ßÄI$çr9yré‡+˜Xré{E¹ô=}JŠJS¹ôœ ¹ô]¢ÆÄryº(ü‚ ê„úÏÀÀø¿,ÊÀ ÿLñSÌ? Ô0Åø™adªT Y;ªÑPû ¶CÝuP7ÈÙÿÀÔˆ ƒ™….ĵ˜—«'W ŽK€¿ endstream endobj 5203 0 obj << /Length 309 /Filter /FlateDecode >> stream xÚ­‘±JÄ@†ÿba æ3/ I ‰ Bà<ÁZYˆÕii¡(6‡Y±õ¡ò>D|I™"Ü:³$EÀÒò…Ù™Ù™ÿ/²Ãü˜Êé -¨àŸºKõ£Î3Ž&t”G›½¬t|My¦ã Žë¸ZÓóÓË½Ž——g”êxE7)%·ºZà[ÈÙV°óþz=ÞªEd€°‘¥ê€šKzNä¬.{7Aâ|®Œ$sQèЄÒ>j"‡vDÉmvsÔý#ƒL°ÿb~ÃüöùdóáGŒûñ¶[ÞVužeø½ÿajÖEyȳv¾Y©:À†%*?ñʵÑJî¤~D`q£ìû€@\qðíBìcáÌšpê`¶èŽÐþ ™j‚óÚ·²<§Øq}^é+ý 6²¥É endstream endobj 5204 0 obj << /Length 221 /Filter /FlateDecode >> stream xڕѽ Â0ð–‚ì#x/ i*Uœ ~€ÄIí£ù(}„ŽJãÙK Í"&…äHrÿt¢F*ÄÇ8 q¢0šâYÁ È€f4ãÊé óäžê ×´ 2Ùàãþ¼€œo¨@.ñ 08B²D­uåÐ uf,HW§‚ ô¥lüfëç¬(ºz¥eõ§Ö~ûüæÞ¦Øô§¹_Qš@™ñÍëõ6Ò+L®6ŸñeålóZ¹šÿ«›v,X¿ÕKéP~ï‡ÞEÔºe¯Ö©úN=â’¹«vð™<›Â endstream endobj 5205 0 obj << /Length 256 /Filter /FlateDecode >> stream xÚUϱNÄ0 à¿Ê)K¡~h{=îÄB¤ãè€Ó ˆ @°!ZÞ̉èF%Psw ²|Jì8¶ç‹Ãª¦’æt0£ùŒŽŽé®r®^j°¤EµËÜ>¸U㊠ÕKWœkØÍ=?½Ü»buyJz_ÓuEåkÖ?€ÆŒ!òÎf°l#>Ù3ZÎ;@Î'€ç7Àîx ïÉ&Œ&È–Nm9ƒR0—!¡G/aEïFD+E$½ÑŒµ²MX‰¿„^É>a‡-úÆü‘Mˆÿèû=¦×:upÇ´–¤-µiÞ}õèGŒˆA§Š^{s¦ywÖ¸+÷=Ÿ†# endstream endobj 5206 0 obj << /Length 150 /Filter /FlateDecode >> stream xÚ3µÔ³4W0P0bSsJ1ä*ä2ñÁ" Fr.—“'—~¸‚©1—¾P”KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEÁþ?<@£0ÿg`ÇÀøùA ˆbüP¢>€©T*L`¥€)‹`J+ŦF Åþ¿Hʃ‚ârõä äWÎr° endstream endobj 5207 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚåÐ= Â@àÑÖBÈ\@7‰¬ÆJðL!he!Vj)¨h«9šGÉ,SˆëlÅ3X,ßòf˜âu¢VsÀmnFlzlº¼ é@ÆH¸¤˜¬w4HH/ØÒ‰I'S>Ï[ÒƒÙCÒ#^†¬(±µÊ>ñl \3X~ZPCAù©J'BEH?4€þ—ºôuâ7{©-'¿ROrï%ËxºVÝ™‹Ã·¹CÙ ï qBszØxaº endstream endobj 5208 0 obj << /Length 240 /Filter /FlateDecode >> stream xÚmÐ1jÃ0Æñg1> stream xÚuÑ1KÄ0àW „ãºv8ÈûÚôÎb ç vtrá@ÿ…?'â)ΤC¹ø’£âMHøH^ÂK^Yì/Pá÷æX.°8ÄÛ\<ˆR¡ëÅÑvçæ^,k‘]b©DvJË"«ÏðéñùNdËócÌE¶Â«Õµ¨WhíÀ­í"kÿ·ä@öŒæ¤àmDâ$f~¤#; Hl ¿¥½8@£ÁŠwdFUšì¨%[pù¤^q(é`J7)¯Iˆ’›ÑMk¯T¢äRÙñRI JN%}¤½Ö<=“Dt2l¥IÜ©yÑÑ&ôFš:Uï; ôAš9ÉOŠ} ô5*¡¿­ºÿÄÿ‰°­ ÄœŒE'"'íEÑ<´¾¦®_g'µ¸ßÑÆ©Ñ endstream endobj 5210 0 obj << /Length 279 /Filter /FlateDecode >> stream xÚ]ÑAJÄ0àC»…МÀ¦Ç.„Â8‚]ãÊ…êÒ…¢ëöÁ«ô&æuW°ôù’<3‹ôãÑ¿ù».OËÊXSÒZ[svnž ýªIkÂè_<¾èM£ó;šu~žÍyûxÖùfwi oÍ}aìƒn¶¦E„'8p…@ë@Òµ1Ù±=™Ž h¨ $«3,ØÄ+N¼€ÝŠ­‚moƒµÛ³.˜ }0ý颿Q…£’x(`ÜO‡b<¾£âkˆç|ŽÑ4ºPS0á€%»â€ ¢–ƒöàØÞW¾œÌÈCeàË  »ä›PIÂ{Á7™½]øоiՈݱúªÑ·úR}Ý endstream endobj 5211 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚÍαJAàYÈÁL›"y÷.p1©b¯L•BAS¦P´Î=’p²2EÈ8»n@ô,†ofgÙ§“ËÉŒK®´¦×WüRÑ+ÕsË8ÆÅó– ¹5×sr·zJ®¹ã÷· ¹Åý5Wä–ü 7©Y²È ð~k%…öÒvìT²Z^{ÓcÝÙ³ ÷ÃâôU«o²CÕ0Ë–*¤ÅSTB¶‹ú`ζÑñÞ&‡í%‹ãE¶Ÿ´§QÒÈ0›b4è3¾Ýe}÷¿Íÿô"Ý_馡}Èl® endstream endobj 5212 0 obj << /Length 232 /Filter /FlateDecode >> stream xÚUÐ1JÄ@Æñ/¤¼&GØw“@B,ÄuSZYˆ ¨¥ ¢`—-GÙ#liv|ß‹ÜÀü`fÈŸ™iÊ“¶ÖRu«M«Ï•¼K]Ù¼ä”O¯²î¤¸Óº’âÊV¥è®õóãëEŠõÍ…ÚêFïí—é6¢}8rB²G‘š² ç g@þãîp ¬vøÂoûÑðDšD,ZŒN€Çà±E‹Ñ- ®Å-FIâ2vpŽeDZdøÓbt¤½k±Ùt`ÌÜÓÔel6óXÆË"÷ó­üdÁí=yÙ<"ú»ýW.;¹•_µštó endstream endobj 5213 0 obj << /Length 204 /Filter /FlateDecode >> stream xÚmÌ; Â@à . ´Vf. ›´1àL!he!Vji¡(X›£å({„”Á8ë£—åø‡ùÝéÅQ—Úš’˜º}Úi<"ÏÈŃ÷f{ÀQ†jÅ{T3ŽQes:Ÿ.{T£Å˜4ª ­5EÌ&¡€º6äü¥…°%/_x÷/PAP02gøýÁ0Ò¦–yp&îî¬dBw›:Œ+0ðÁüâ}¨AT¾yóMÞ6Ó¢5lö–¢.Ë5²Ài†K|¤øT£ endstream endobj 5214 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚ31Ó34V0P0RÐ5T01V0µPH1ä*ä21PASKˆLr.—“'—~¸‚‰—¾P˜KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEùÃT‚D0S$ê00|`ÇÀü¹A¾ù;ÿæ ì˜ÿå˜00þ* àÄ?8Q"êI&êPMÊøbÛ½`Ëßœq ä ã ò Ìê˜þÿ:]þ—«'W ÈckA endstream endobj 5215 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚÎA ‚`à'?( ‘œ ”ýüºÌ A­ZD«jXÔ.Ì£yàÒ…Tcu€ßæ 7f: 5ÙðP³™° ø éL¦ %¿—ý‰â”ü MþBbòÓ%_/·#ùñjÆ’&¼•ÎŽÒ„¡ZÀ{ÈUe5ÈTÆ©¬Ö-Õ‡W¨6êÀj@-ÐÉÅóOù¯Ó‰;*`{ú^‰ž[bàTd7“ý w§”§ÍSZÓ»= endstream endobj 5216 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚ31Ó34V0P0VÐ5T01Q0µPH1ä*ä21PASKˆLr.—“'—~¸‚‰—¾P˜KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEÿó‚ÁþT‚zó !ÿHÔ±÷`øÁøþó†ú쀶¤ „|P±=˜i«‡u âÉDª)öph‘<„ÚkrF=ÈAï?0þ`<ÿŸ¡†½ÿ?ƒü?þÿ ì@‡s¹zrroXhI endstream endobj 5217 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚ]Î1 Â@Ð\˜B/ 8ÐM²(ÚЦ´²+µT´“èÑr”!åbI qáÁ23ü;èö9änÀ¶ÏvÈû€ÎdC)úlGUgw¤IBfÍ6$3—2™dÁ×Ëí@f²œr@&æm)‰Ú¸·2Ï©\^¡sϵ2¸Î÷¯HÅøQ‰RñþQÖOþø—Ö5ÉQÑJrµìhè M£íÂá„TårL¼@³„Vô½£@ endstream endobj 5218 0 obj << /Length 141 /Filter /FlateDecode >> stream xÚ32Õ36W0P0bcSK…C®B.# ÌI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ê˜ÿ70ð|À ßþ€ÁžÿCÿ`ÆÌ00ŠÿÿÿÇäè§3ÿa`¨ÿÿ޹\=¹¹¢&[ endstream endobj 5219 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚ¿J1Æ¿00…ñ v^@³9ïäŠÃ…ó·´²+µT´[¸}´> stream xÚ31Ó34V0P0bS …C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Ì€à?É&™iN‚ìaþ`ÿD~°’È700nà?ÀÀüDþ“ØÀÈä‡$Ù€‚ëÿÿƒÿÿ7 “\®ž\\y endstream endobj 5221 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ32Ö30W0P0aCS3…C®B.C ßÄI$çr9yré‡+Zpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜ø0È@A@ 8~Àüá? ±q©ŽØ0üÿ‚¸\=¹¹(CE` endstream endobj 5222 0 obj << /Length 150 /Filter /FlateDecode >> stream xÚ32Õ36W0PÐ5QÐ54W0´P05SH1ä*ä22 (˜Ãä’s¹œ<¹ôÃŒ ¹ô=€\úž¾ %E¥©\úNÎ @Q…h ®X.OÆ ìø   P?`üÁð†Ø€¸ôE6Œ?êügüðŸ‚üc?PÃ~À†Ÿÿó.WO®@.ÿ§Wõ endstream endobj 5223 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚµÍ1 Â@Еir3'p.#˜BÐÊB¬ÔRPQ°ÍÑr±0EÈ:? êdÙ³3ó7èuÂ.{Œô¸òʧãH‰ÆrCqJzÆGz$¯¤Ó1öÇ5éx2`ŸtÂsŸ½¥ […RÊüâë?´LõºæÝ3Ø‚ærÁÊkm‚¨„;xÔÂ3êH†Kv¤Ø@%¯â.êýoÔ nn—**ŒÉù@Ô¦ôDr endstream endobj 5224 0 obj << /Length 108 /Filter /FlateDecode >> stream xÚ32Ö30W0P0aCS …C®B.C ßÄI$çr9yré‡+Zpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜?0ü‡!þ ̃±ÿ`øÿÿq¹zrrÆ‚Q. endstream endobj 5225 0 obj << /Length 177 /Filter /FlateDecode >> stream xÚ3³Ô3R0Pa3scs…C®B.3 ßÄI$çr9yré‡+˜™pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜?ð`Àðÿƒý†ú@úƒ=ãƒ:†ÿÈ77Ø3ðnà?Î ßÀüÿˆþÇÀDÿa`ÿÁÀNÿ``ÿ€þÀÀþ`Ð O€âÿÿƒÿÿ7ÿÿNs¹zrr#߈ endstream endobj 5226 0 obj << /Length 147 /Filter /FlateDecode >> stream xÚ31Ó34V0P0bcs…C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Ìø?00üÿ`ÿD~°’È70ðnà?ÀÀüDþ“ØÀÈä‡$Ù0½ñÿÿÁÿÿI.WO®@.‡e% endstream endobj 5227 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚŽ1‚@E¿¡ ™†#0Ðeƒ6 &na¢•…±RK v9Gá”Tâd)H¬ÌN^fþîþù‘žÌ¦ð”Çš£€Ã9Ÿ5Ý(ŒE”qÑßœ®”R{cRk‘I™ ?îÏ ©l»dM*çƒæàH&g8^W‰S­œQƒdHàVðá•R¾ ò!J*¨- Ài~ nNû/†ooñkg»Íîõ$AéÖHåŠ> éáwlzZÚÑIKÚ endstream endobj 5228 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚα Â@ àH†B¡y½ž­uj;:9ˆ“::(ºÚ>Z¥p"ØŠç]qÐQ |CB’?Šû2ä€Ü“1G!‡#ÞI:R°«aøm”d$V$f¶O"›óùtÙ“H–$R^K6”¥ŒÊ¯À¨\ƒ¹UW0÷Â/¼º%>Á«°T¨5*è´4hy~“ÿÌ÷ö²¥ý¦Ýß> stream xÚ31Ö³0R0P0VÐ54S01Q06WH1ä*ä21PASc¨Tr.—“'—~¸‚‰—¾PœKßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEùÃùŒêØ0üa<|€ùÃãìÊð?`0?À€Áþ€> stream xÚ36Ò35R0PacCcs…C®B.# ßÄI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ØÈ3üPàÿÃÇþ?nÿÀÿœýó3 ~Äo˜0ÿah`þÁÀ€‚?P³Íüÿÿs¹zrrjÙF„ endstream endobj 5231 0 obj << /Length 195 /Filter /FlateDecode >> stream xÚ=αJÄ@à¶X˜fßÀÌ x{›`TñSwÕ‡•Z * Wî£í£ÄÊ6`“"8Î%GŠ™ùÿfŠ|q~ÆK.ø4p¡ó‚½R^j¨çåÔ<> stream xÚ36Ò3²T0P0TÐ5T0²P05TH1ä*ä22 (˜Ad’s¹œ<¹ôÌ̸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž.  Ø W á Œ@Ì Äì@,ÿÿ?Ã(f„ÊQ „þ0‚pC sC3ƒ=;ÿ?°f.WO®@.uH– endstream endobj 5233 0 obj << /Length 153 /Filter /FlateDecode >> stream xÚ31Ó34V0P0RÐ5T01Q06WH1ä*ä21 ([@d’s¹œ<¹ôÃL ¹ô=€Â\úž¾ %E¥©\úNÎ @Q…h žX.Oæ ìþ`üJò`À‘p’ƒºBþ`°ÀÀðƒ¡üÆçÿì™Iùÿí@’ùÐ.WO®@.1c endstream endobj 5234 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚU̱ ‚PÆñ#‘k[çêªWJ'Á rjjˆ ¨Æ†¢¶ˆûh>Š`›Ph—º—jù ÿ¾@ BŸ\ò©ïQà“ÒÎÃ#ŠHE—Äè³l˜dÈ—$"äS•‘g3:Ÿ.{äÉ|Lò”V¹kÌRj×_œ œÒ.Á.X ,g0i)à <¡¥©¡pƒ¶&†®A†=éjœ|c(v‘kØ]þb=ÀÐ(Ô¿áúO¨ÁI† |F£?ê endstream endobj 5235 0 obj << /Length 233 /Filter /FlateDecode >> stream xÚUÎ=KÃPÅñs Xx³v(æùzËíËb ­`A' ÖQ|A7©‘|±€Ð~Lïx‡`¼7UÓN?8gù«áá°Ï!ñAÄjÀÝÏ"z$¥ìr·¿~nîh”¼d¥HžÚ™drÆÏO/·$GçcŽHNø*âðš’ WUPñ÷6¾Aß´4æðŠ5¹§q ‘þ" bxØ%âtÇq¿Á_ù®cùGˆÅ²h;²š÷L€ Ëtè5Â<þfúOk…2·|âµÁ+ñ–ZlECÝdÑ ±ï(°ç˜ÂÑIBô¥Y_™ endstream endobj 5236 0 obj << /Length 210 /Filter /FlateDecode >> stream xÚMν Â@ ð)(¡«ƒÐ> stream xÚUÎÁjÂ@àYi® Î èn²Zõ$¨sÚSE¨GÁ½‰æÑöQ|„x ‰³²Iéå;üÃüü=ÝF¤(¢N8 ^DúÖ!þ qª¨¯ÝiµÅIŒò‹ôåœs”ñ‚ö¿‡ ÊÉÇ”B”3úI-1žQY¦ãâàAægà//7ˆœŽ4gËZŽvª*Ì 0‰Ã¿˜Š+ã]S‡¸CEÉ@QsüϰFÕì,IqSn/¼'¶’gCþbŸ^m‘mjg`ç1øã'>ÚŸKø endstream endobj 5238 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚ%Î1 Â@„á‘@„‡$|'0‰+AA¢‚)­,D¨¥ ¢æQ<‚eŠ`œÅ_ìì·°&î# µÇL_M¬‡H.bìÚ£½ØŸ$I%ب‰$Xp• ]êíz?J¬¦Êu¦[>ÙI:ÓIU•uO§Ã)Fh~ðß!;£ó:còÌÛዬQÖ‘‚ôŸÿ)HÿåpIëH]R·YÀ#õH[¤mé(œ²âl2Oe-?uàC endstream endobj 5239 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚµ1 Â@EH!L“#d. ›ÍºˆBŒ` A+ ±RK EÁBb޶GÉR¦R×l´6¯˜˜ÿþPtÌ+îǬƬ5$Ii;ŒXÜf¢$#±a¥I,ì˜D¶äëåv$‘¬f,I¤¼•í(K~ |[äj¿„W¢‚opGÏà ÀÄ!´—S‹¢E¦ /‹òèzù´ÌO¾6x+Ó¸YÛ~åÕÎÜuдñí…æ­éÂÕ`ú endstream endobj 5240 0 obj << /Length 121 /Filter /FlateDecode >> stream xÚ31Ô35R0P0bc3SS…C®B.# ßÄI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]0001;Ëñÿ ÿaX*6T°ý†úÿÿ?À0—«'W ¾NÚ endstream endobj 5241 0 obj << /Length 228 /Filter /FlateDecode >> stream xÚmαJÄ@ÆñoÙ"0M^ป'p÷WóSZYˆ ¨¥ ¢`eòh>JáÊ+ŽŒóé5‚E~°;ÿY²¬šc­té_^iÓèC-/’³Ÿ+9¸’u'éZs–tî·’º }{}”´¾<ÕZÒFoj­n¥Û(Ê-€~‚Ù€8¶#J^ÎQì0CÜc…0áùîÈDÌ_úŸžÓÁïø:ßsöNüaçü™r$_΂[-> ³À,°ˆ, %‡s„'äƒlÏ"³ÈÌñ¥™aAZÒ›M°¿ÈY'Wò TŸc| endstream endobj 5242 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚuÐ1NÄ0ЉRXšß`3', ZiY$R AE¨€ ´ØGóQr„”[¬0¼„‰"OÊŒóÇ“ãîÈ/¥•^—ÒŸ‰÷òØñ+÷ÅVüɾóðÌëÝ­ôžÝ%Êì†+yûxb·¾>—ŽÝFî:iïyØ™-­2È9QµµÕ EëPõE6‚f¤LÍôV»&‘ÆàðÌÔb&e6‚€§Ñf“õÕŽó‘òY (yâ/ifU ý°Å_ cBüÔ¨M>Õ‹ý‚¸Ÿ™°y¥ÿ€‚޵¸2_ |ÃßÇ›jh endstream endobj 5243 0 obj << /Length 188 /Filter /FlateDecode >> stream xڕν Â@ ð+ At-(˜'ð®¶µkotr¡P?ÁQðÅ_ÄÇè èý‹­³ù‘äIàõÃ+FŠÃ!¯=Ú“™º,ñ‘o)Ñ$ìG$'¦KROùt8oH&³{$S^z¬V¤SBĢ⊠ØÀ©iƒèA«äf°1ë€h‚.p;»Áö`¯Z  \2ðoóŠß›ÿÂy™³54Ö4§òý`ö endstream endobj 5244 0 obj << /Length 226 /Filter /FlateDecode >> stream xÚ•Ï¿jAðïnaÜ ˆÎ ˜½s=b!j W¦J!‚`R ìnÍG¹G°´8ÜÌœEH:›_1;ödÏyŸSp¯ÏnÈyΟíÉ9)¦œ¿Ü_6[šd?Ø9²oR&[Ìùð}ü";YL9#;ãeÆéŠŠÇÀŒÇæÒºÂ„ÐpQ*Å+j .+xsº7á”xÄ•‘Íç–Üð‘\ƒ }µrÓþ† ”¿ø´•R þ/:tK­¬uéîNTc¨'Û¼‰Ä'ò¡jìiT”2ƒ®D¥×‚Þé+XÑ endstream endobj 5245 0 obj << /Length 243 /Filter /FlateDecode >> stream xÚm½JÄ@…OØ"p›¼ÁÎ}d³ƒÚXW0… •… j)¨hëäÑò(ó)S„ÏD…m>†{çüÜuuìVZj­G+­ÏÔ9}ªäMjÇa©îägóø"›VìÖNìÇbÛkýxÿ|»¹¹ÐJìVï+-¤Ý*Ðô@ P„sŽºø‚&¾³¾[ D>#E@ƒ¢Ç†r˜Iõ~2û> stream xڕα Â@ àHÁB}Ѽ€Þ]õ¤“…ª`A'uª(¸ÙGóQî|ƒšTZèàà‘û†?$w#3°i²ÔhdÈŽéhð‚CË!Çá·s8cœ ÚÐТZpŒ*YÒíz?¡ŠWS2¨f´5¤w˜ÌHŸP˜Qžç®ÎëY’ 4aÐ:B@à ¸Ç8 ‚—1¾ìn -¡SQ¼üRá-8­ð d“_Ñ®Ó+ÈJ¢_<ÿ!’¯tùâ<Á5~lúQ- endstream endobj 5247 0 obj << /Length 265 /Filter /FlateDecode >> stream xÚMÁJÃ@Eo˜ÅÀ[8мÐ$A„ÒB­`B]¹WêÒ…¢ÐEÁù´ù” ;#Ç›*ÖÍyóî{wæÎquÔLµÔZ§ZŸjÓè}%OR7KmN~&w²l¥¸Öº‘₲í¥¾<¿>H±\Ÿi%ÅJo*-o¥])L OÄ[ À`;d1ëa¶°3X`LpÀM6{ä{xÖSÏœ˜°Hpžî|tO¥0£1l¹6Ì ùi4ÈþÓ,ìÀe3zŸÓáw™gRÒô¦SÅß@v伕+ùÿcå endstream endobj 5248 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚuÏ1NÄ0бRDšÆ@ò\œlÖBT––E"Tˆ ¶¤AKr®â›ì!eŠ3³ ˆšgiÿ_×'aE5t¼¢æŒB ÇŸ± 2¬(œÎ_žpÓ¢¿¥& ¿”1úöŠ^_Þvè7×çT£ßÒ]MÕ=¶[‚b—….'0SÉ2*(ÙŒ`&p ÞÁõBì!Ît ç¼àÒð_èÝ_èR¥c§Ø™%Éž 6{6Cñ!I¬cˆ“Ä)A×ô?€Ö«ÌÁ“ôXZ1IÁØËN+éOVë”ùÀäqY‰-Þàú m9 endstream endobj 5252 0 obj << /Length 200 /Filter /FlateDecode >> stream xÚ•; ÂPEo°L“ ™ èË{? bSZYˆ•ZZ(ÚÆ,-KÉR¦uò)ÔN8Õ ÌœãúzÀO¸g4û†‡†šÎdŒL=ûíj¢0&µacH-dN*^òõr;’ W3Ö¤"ÞjövG t)PÂ*ÐÉaçp2¸)\ à <` %:5vQá9܆ Á÷ô‹×ÿü\ø<.¿š§òÝ)Z™FL ÅSl+ç¤ö— i‘"é’:i”Òª·Kó˜Öôï*c¸ endstream endobj 5253 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚ•= Â@F¿`˜&GÈ\@7»þ¥RðÜBÐÊB¬ÔÒBÑ.ÄÍ£ìR¦⸠j)¼jfÞk÷[ºÃ w¹i4›”{†wšŽdŒLNÛïÕö@#KjÅÆšÉœ”óùtÙ“-ƬIMx­9Ù°J @,ˆnB‰ BPÂÈ«gXxnˆ÷$ÊaõKý?¿¾GîýT¾‹ÃKæ%–{Ïúé,æâ/Ò"EÒûÆÌ÷J5M--é7Z£ endstream endobj 5254 0 obj << /Length 103 /Filter /FlateDecode >> stream xÚ37Ñ32W0P°PÐ52S03R† )†\…\¦ aS¨Tr.—“'—~¸‚©9—¾‡‚)—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹Bý0`€PÿÐi˜<—«'W ¦5° endstream endobj 5255 0 obj << /Length 112 /Filter /FlateDecode >> stream xÚ37Ñ32W0P0UÐ54R0³T05VH1ä*ä23Š(˜™B¥’s¹œ<¹ôÃÌŒ¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. Ì `0¢èÿð©áÁåêÉÈÇ‚J# endstream endobj 5256 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚ32Ó35V0P0b#CCc…C®B.C˜ˆ ’HÎåròäÒò¹ô=À¤§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹ƒýƒúõþÿ€AÏþ—«'W !‘$‡ endstream endobj 5257 0 obj << /Length 111 /Filter /FlateDecode >> stream xÚ32Ó35V0P0b#Ccs…C®B.C˜ˆ ’HÎåròäÒW04æÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(ð7Ø?¨ÿPÿáÿñìð70`¸Õs¹zrrD7„ endstream endobj 5258 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚM1 Â@EH!L“ÖBt. ›5*$BŒ` A+ µT,s“£ä)-ëÊÀ›Ïûãõ:ºÇ.·5w‡ì ¸ïó^Ó™$º2"«jw¤0&µ’R31¤â9_/·©p1aM*âµfwCqÄN‚ã &yæ–IK˜·m² …mòž…õŸ€É‚À # ‡d¸Ãʤ²R©ìT„ˆ¨%’Yh¢|Þ’å¼lAÓ˜–ô!K endstream endobj 5259 0 obj << /Length 193 /Filter /FlateDecode >> stream xÚM; Â@Eo˜"ð7 ú6 “‘‚ L!he!‚ –‚Š‚]²·2K™ÎvÊÂ8~@›s/ç>xq§v8àVÄQã„“”·!)î:¼ägÚìi˜“\pÜ%9q†d>åóé²#9œ8$™ñ2ä`EyÆXÃ+= ¿µÒWhºŽj@ß®¨×aÚ w~€§þ` ”›D‰»7X#¬²•°úƒ‡°æ‡âá}1¨`õMƒB½ŸÓ8§9=1hM& endstream endobj 5260 0 obj << /Length 170 /Filter /FlateDecode >> stream xÚÕ1 A Eÿ²]¯8;êÀvë N!he!Vji¡h«{´9ŠG°´ãd±QÄÞ<~~ „¸~·p\p/•³ìJ^[ÚÑ L}¡­V[ª™9J2ãä’ >ì2ÕtÈ–LÍ ËÅ’BÍ@.ÀY®*åtÀßà“}4˜I“½¨™kÆ\Ðê7B <µÄ/z‰¢ñ…íž¿aúš×³?I£@3zóպà endstream endobj 5261 0 obj << /Length 186 /Filter /FlateDecode >> stream xÚÕѱ‚@ à’.<‚}#èF‚˜xƒ‰NÆI4:ãñ(÷72(µeqbÑÉK._þÞµ7\šŽgÓDv6¥tN§¯˜%’czp¼`a0ÚQ–`´’*FfM÷ÛãŒQ±YTKÚKËMI>×A»Šk‰üb¶2p:È[àvä ²; ¯zªUë^_mT™ÐŒœè} ä2H«¾öÜ/;è¯óÿEægÎòMCâÒàßλáR endstream endobj 5262 0 obj << /Length 256 /Filter /FlateDecode >> stream xÚ}бNÃ0€á‹ó[ñòŽ«í#•Ú[wж¾£¯Ïï7´«ûkÊÑ®é)§ìë5€Ú‚,ÝÇH‡Y˜1Fu˜EÃ1˜Û$Ì`„Ú³$ª] ½ciÕÝiÇ’˜¶MÓ6Òj T§Ä%˜0Òú©`t‰è)ßšô »µýÚ£Éî§ûì0„R7¡ ŒÇ’A¢«Ó\—þt‚‡dèC@ëf;„wÛ€75>à/G°ž% endstream endobj 5263 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚÑ= Â0àJ‡Â[rß LK©¥S¡V0ƒ “ƒ8©£ƒ¢s{4Ò#tìP“ö¥qj |ä‡÷Ã[Æ‹$Dõ^†Åx àQ¢Î¾>ê‡ó 2ü€Q|£n‹->¯+ðl·ÂxŽÇýˆ¥^oÇémIiTEí¸²êud=X4ƒi;87v¶LNó7މoò™üTÏŒêd²T}Xö÷_õ§—QOË^Wþo5Q;ŽG2Ê7öOõ×Ò<êq.ÖœÔWX ØÃuRÖä endstream endobj 5264 0 obj << /Length 263 /Filter /FlateDecode >> stream xÚ½‘=NÄ@ …¥ÉÍ!¾L"±ËnC¤e‘H¢J ´$GóQr„-·­ñŒ7qF}#[ãŸ÷–«Óõ9Õ´ “†–g´XÑsƒo¨¬Sxm™§WÜtî5áZúúxÿ|Á°¹½¤Öª±Û´ (E¸TV";§‘èYäepšÒ{ðJý¥9†~P(eÔRÂé™XföìdH-Ø ÌXq*óKÏíÄ8§ãþ/÷ü§~ÖbyœoƃÑöq?´}Ý`ôƒéáÁô©ÀôºÓïëØ0fW Ø';´¬jœô÷#˜©†úcŠÍªþyÄ< ^ux‡ß³ = endstream endobj 5265 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚ37Ö32V0Pa3 Ss…C®B.3 ßÄI$çr9yré‡+˜™pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒ@˜þ¥ÿÃè õ?ØÿÓp,ÿBóÿ‡ÐÌ@@4#P2Íðÿ„®ÿ€JÛÿ@£ÿ@hytúú?iBöÿAu?œ†ú«þª¿aá¥aá ?öÿ¨á[ÿþ°ø@‰Ÿ?P\®ž\\2oÉ™ endstream endobj 5266 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚ}б Â0à+Â-}½'0­Út µ‚ÄI‡‚¯ì˜¡Û¤…¦VÇÇår~>ÅS hR(Šéâ#^ô¦-Ç &ÙŽ"ŽlUÜ"“kºßgdÉfA!²”ö!”)isÞÀKT •¡oéY<py~# ³ˆ?@Iæz­S=©Z¿ˆ¿‹Ah1s–Ì!oâ9)ù–¹ÁÓʦ«:#Ç¥Ä-~·Ê endstream endobj 5267 0 obj << /Length 159 /Filter /FlateDecode >> stream xÚ33Ð3°T0P0bS3Ss…C®B.S# ßÄI$çr9yré‡+˜qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒÁ¬CýfÅPÿLÉC(~ÅŽB1£PŒX© ª‚Å€Dý@¦!;˜úÿ7UÓ€j š ø(ÚP °ÅEq¹zrrco©· endstream endobj 5268 0 obj << /Length 262 /Filter /FlateDecode >> stream xڽѱNÃ0à«2Dº%à{p<¸-“¥R$2 ÁÄ€˜€‘súh~”> stream xÚ36Ó32T0P0aSs…C®B.crAɹ\Nž\úá Æ\ú@Q.}O_…’¢ÒT.}§gC.}…h 1±\ž. ÿÿÿÿƒŒê0 uŒî'.WO®@.•õy9 endstream endobj 5270 0 obj << /Length 138 /Filter /FlateDecode >> stream xÚ35×31V0PaScSs…C®B.K ßÄI$çr9yré‡+˜Xré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þVŠ¡þÃ0¤ØRüPŠ %BÙ£Põê?˜b„PÌŠÿ˜ªÿÝÿ8(.WO®@.‹† endstream endobj 5271 0 obj << /Length 253 /Filter /FlateDecode >> stream xÚ}Ò±jÃ0à·è ì{‚ʦIëBÀ¦P…vÊP:µ;´´ÒÁ~°~?‚Æ &×S !HÁßIËwWÅÙÅœ :—[U4¿¤—ß±šI_„6|<¿á²A·¦j†îV^Ñ5wôùñõŠnyM%º=–T> stream xÚeѽJÄ@ÀñYR¦É#džÀMü¸\·pž` A+ ±RK EA±ˆ¾™¾I|ƒ³Sˆgwv/'W,üfþÅn³¿ÓìQEþ4»tÐÐuw8›Ë\ùÑ/®nqÑ¢=§Ùí±Ü¢mOèáþñíâôj´Kº¨©ºÄvIÌ@ƼÚÀ˜À èøU´Á;€é=zÅ‹¬ž'|+ž|1 #G”R (¤ø¹¤2))€RT¸58BÒ )*¤¨¢BŠ ˜0Dtc„㈒ß(rþTd¾†À¿á±<\B¹…"!OÈL¬ÑmÁ%”‚Á£è!ü)ä Y‚Ùµx†n«Äº endstream endobj 5273 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚ33Õ3²P0P0b3Ss…C®B.S3 ÌI$çr9yré‡+˜šqé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒ˜ú¡þA¨ÿ õ?øÿQŒÿ€( Ä Êþ2%ÿ…úO&…b ª Pk!Ž€: ì@ˆ'@Ôõ¬q%vŠËÕ“+ 0¾ª( endstream endobj 5274 0 obj << /Length 233 /Filter /FlateDecode >> stream xڥѽ Â0ð‡Â->Bï4bÛ­àØAÐÉAAëækù(>BG‡Ð3͇‚uP=¤òAYý‡Ú¯K]¹k̵ÚpÍ&ŽËœÛÈ…MšÊgd ŸÎoç°Úk|x–¯pÿ +‡Â@Zä/0ƒ´d73(Mº\5|¢³3¿WU =e0ƒ>¬ß endstream endobj 5275 0 obj << /Length 263 /Filter /FlateDecode >> stream xÚeϱNÃ@ à?êÉyƒÆ/iJ"•¥‘J‘È€D'ÄŒ X{÷hy”^åc¡¯êŠ™D5‡=îþÙü:þé§“ÎÇ|ñ_.þ(Ø_’ IŸ˜4B±±ÌCjÑz8½–nZ:Ð7¡6 endstream endobj 5276 0 obj << /Length 152 /Filter /FlateDecode >> stream xÚ33Ó31V0Pa3cS3…C®B.SK ßÄI$çr9yré‡+˜Zré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ìÿƒANúÃÿÌÿêi†úõ Zþ@ˆæ‡Ó5`šNW€ifœôýà˜fÄI3€i0™4?(pÓ\®ž\\wG³æ endstream endobj 5277 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚíÑ1‚P Ð’.^@?'ILtr0Nêè ÑÍGã(ÑP[ˆ‰““£Cû_Û´Ë‚Á0$êûy4Šhïã CmJ9î&»#&š5…!š¹´Ñd ºœ¯4ÉrJ>š”6>y[ÌRbæ\æò €[B§øãgpq ‰¸þD¬…b¢ ¤û7 ›%é¸ÇXzÂ’¯²+pîC‘7 M=$¿©¯¬qÓ˜«ŽÀY†+|œ¼T endstream endobj 5278 0 obj << /Length 271 /Filter /FlateDecode >> stream xÚ}нNÃ0ÀqG"Ý’GȽ8‰DÃÔH¥Hd@‚‰uFlU›GË£¸o©‹‡¨ÇÝÅ|4RâülK§¿\•ç%æXâYUŽ>ð³Šy{9Þ<½Â¢û€³ ì ƒmnñãýóìâî °K|,0_A³D"êMLäþá¿1 /äΘ­¢c Œô/jEË802F¦x©åZ0WðýFf ÖÇàa2+x…3‘ ô .Hbìþ‰‚[¥TS'J &f N”@MüA­àÖy@»Qpâ: œèÜ7v#"Úõû†ö.€¶ÔBMíúŠGH'‘ SÄ~ }J× ÜÃ2ÿš` endstream endobj 5279 0 obj << /Length 199 /Filter /FlateDecode >> stream xÚuν Â0ð+„[ò¹'0­~€ÄIí›™Gé#tì =猪‹!ùAþ¹—úù€RÊÉG4Ó!Ã3vYªW}ØŸpR ßP>@¿}±¤ëåvD?YM)C?£mFé‹AhÀ0W–¹pµ•(Ô†Å&áRŽ_ïÕGW«¶RM©Êú1|šŠw5áFò—ú«ýö ]Ÿ÷æ·ñ¯¬5IW¦†º'C»§{p´Ü:ކ«ƒV†#Î \ã 8.y endstream endobj 5280 0 obj << /Length 191 /Filter /FlateDecode >> stream xڵϱ Â0ÐH†Â-ýï L«–ºj3:9ˆ“::(:·ŸÖOÉ'dìP{^ŠCEœÄ<¸Ü%¹$“Q”`„c^ Ïc¸À4å¸ }âp†Ì€Úâ4µä]Pf…·ëý*[Ï1•ã.Æh&GA‚}1è”t@%’c55lË)É1•’¬(*ÉÚúzí¼Ãºgã û¶?øqÛÛ[®ë„­Da_½=@ÖMÐ é4ÕBÚ3²ò'`a`Otí„€ endstream endobj 5281 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚ•Î; Â@à )ÓäBænbÄ*#¸… •…X©¥…¢­Ù£å(9BÊKÆY#X[Ìó‚?›M³ŒbJ]-(Ó9Á¦¹ô±kÝâtÅR£ÚSš£ZË•ÞÐãþ¼ *·KJPUtH(>¢®> stream xÚµ= Â@FR¦É2'p³$!vÁ-­,ÄJ--­o–£è ´‹dœ±ò¯æÁ·3ì<6{AŒ†\±Æ¸+ [ˆÎDi,7P3ŒP#¾eƸßÖ ²É5¨çƒ˜->E) ït´ÿD›ŽL®Ì”Z&U¼×!˧Òm,—J¯¿–yÿ"LŸXœÞI?ðåµ]ìÀ&^-Vìæ±gÇž·Zêø¿n$ù̴ɦ†¦p h¥Á endstream endobj 5283 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚ]ν Â0àS:wÉ#ä>m©Ð± ì èä Nêè (¸¥à‹õQò3ã­ þ\È'›3ʇEÁ)çrFçï2:RÞߥ}ì¶×”¬$S2{ZÏù|ºì)/&œQRñ:ãtCuňCèà:DávG|‡iÊFy”­öÐV;¡tPo¼0ðáƒÌ7ÀæÙ÷âª{äKxÕNÄ. P¡5­ô €’’ÒÒ‚¦5-éQle€ endstream endobj 5284 0 obj << /Length 155 /Filter /FlateDecode >> stream xÚ3²Ô3´P0P0a S …C®B.c ßÄI$çr9yré‡+›pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ä?000þÿÃÀÀþÿ?÷£¾ÁþÁÿ†ÿÿŒÿ¡óFÁð¿FØ1 bˆÿ ÓÑbõÒøÿÿÁåêÉÈŽXo5 endstream endobj 5285 0 obj << /Length 264 /Filter /FlateDecode >> stream xÚ…½NÄ0 Ç]1Dòropõ @ZµU™ˆt`b81#æô x¥lŒ¼B$€Ž7œbì´Bb"Š~±ì¿?â¶?é;ª¨¡ãº§¶§æ”j|ƶoE]·„îŸp3 ½¥¶A{)~´Ã½¾¼=¢Ý\ŸSvK»šª;¶rJ“€xþâP0ów4Éð{\í .c9ØNø]ÿ”"ÿßY¹pÒ&Zm­¬m¥1¬˜÷BÏ`­XëX Ï2ÝÌ1Ï2s–Pª)£Ö—àH˜²r”Á€—L¥5ø1ýÒýáU¥—Wôš[$ÜtUòÝ’ŒáYņ'¼ðr˜Ô endstream endobj 5286 0 obj << /Length 157 /Filter /FlateDecode >> stream xÚ35Ö30U0P0bS#S …C®B. ßÄI$çr9yré‡+˜Xpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þ3Á$;˜d¦%YH2ÿÿ$ùÿÿ’ò@Aæÿ6Œÿ˜ÿW€É òÃÿÌÿ ‘ H$Ã’ÿÿÿ±ÿÿ“ärõä ä WžH endstream endobj 5287 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ32Ó35V0Pa#SSK…C®B.#C ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ŒØÿ0ðÿ!ùÿ("”ªÁþ3Ô#!öÿ ÌÔFÿÿÿ€#.WO®@.Nq endstream endobj 5288 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚÍÎ1Â0 PwõÒ#Ô(i‚ í©‰ H01 &`dÁœJ\,Gér„I+: F,=þ°*G² ŒÒ ¥rBjLyI‰gTÝ9£i>dûVņTbfI×Ë툢ZÍH¢¨i+)Û¡© ë¸íEì¿ Yßëú¿Lì!æO`ý’@7Ú[§=·Û¾9nÙ…ÝØû4?ú×#nç×ø`9yÚ endstream endobj 5289 0 obj << /Length 198 /Filter /FlateDecode >> stream xڵб Â0àJ†Â-}„Þ˜TZèV¨ì èä Nêè èj}´¾¯ÐGè˜!ỗƒ:Èw÷'„dfœ¢Á‰ßiŽYŽûNf¾6\ò`w„²½Æ4=÷]Ðõ/çët¹œbºÂM‚f u…~ÑCQýÓˆº¯*ÇSÕK¦cã;[È©›èXeÙ°c£–ÅF:Ô‹’!÷ö1HÞ¿B !ù›%ލõÔ‰=Ûˆ…ec'lô’ü_Ù‚ì§0«aOP‡Œ± endstream endobj 5290 0 obj << /Length 105 /Filter /FlateDecode >> stream xÚ32Ó35V0Pa#3S …C®B.## ßÄI$çr9yré‡+qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þ3üGBìÿ˜úÿÿq¹zrrÊWù endstream endobj 5291 0 obj << /Length 188 /Filter /FlateDecode >> stream xÚÝÍ= Â` àˆC!‹GhNà×"Ú ‚ ì èä Nêè (¸µÒÁkyo =Â7:”¾¦ÅÉÁ8„<ù! úín(žt4BMl}>pÐÓº.«ÁfÏ£˜ÍR‚›©vÙÄ39Ï;6£ùX|6‘¬|ñÖGB%%9µ "” 4Dªrr•{Ef‡V5 ÜR×’S^r_Ô,µÿ¬¥»IQiâNÉë[)%ö[ôyü/ Èû[<‰yÁo¨Rµ€ endstream endobj 5292 0 obj << /Length 151 /Filter /FlateDecode >> stream xÚ35Ö30U0P0bS#cs…C®B. ßÄI$çr9yré‡+˜Xpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þ1Ô`øÿùÿ Éÿÿ”gþ$mÿ7°ÿ«’Ìÿ>0Éÿþ`þ‰l@"üÿÿýÿÿ˜$—«'W Žá‰ endstream endobj 5293 0 obj << /Length 176 /Filter /FlateDecode >> stream xÚ31×37U0P0bScs…C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Œÿ000ðÿÿ$ëÿÿ’ÿþ700ÿc°ÀÀþ‡Aþÿ2 \ i$Á €Êêäò?ˆl •Ä4b>Ä.dÛ!îp!îdræ~ùÿ€$Ø_\®ž\\-in« endstream endobj 5294 0 obj << /Length 193 /Filter /FlateDecode >> stream xڭп‚0ðš$·ðÞ h[I;˜èä`œÔÑA£3>Â#02Î+šhÔM‡þ†ûúçK£`¨#Ô8Âc¤1ˆqgàaÌSQðˆ¶H-¨†1¨ÏAÙ9žO—=¨t1A*õA½›¡ ]‘O›Pö±’JA…äy)Iˆ¼r&õÓ~ó®ßþàÇmý—·’ªkÂ]Ÿ{77”Ôx­Ü¿f}N$¹nýCâù&L-,á‹ endstream endobj 5295 0 obj << /Length 144 /Filter /FlateDecode >> stream xÚ3¶Ô36V0P0bcsJ1ä*ä26òÁ" ‰ä\.'O.ýpc.} (—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹Ã?æ ÿÿñÿöÿDM}Ãÿ?þ`ÿ÷áÿæÿ@Ä8ÑPß$쀈` 4'þÿÿ‡Ap¹zrr8WÖ endstream endobj 5296 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚ%Œ= ÂP„7¤¶ñÙ˜„‡Æ.à˜BÐÊB¬ÔÒBQ°“£y”á•[„ŒûHñÁÎÌθb2+$˜Š+ä’ó]n: 2ç/*NârN7ærZmåùx]9]ì–bîJŽV9qµ*ý> stream xÚ36×34Q0P0bc#Sc…C®B.#K ßÄI$çr9yré‡+Yré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ø0°<¶‡âz þÁŒ@ÌÄòÿÿ?ø„™bTÂðÆÿ ÿ7~`øøƒýÿ@Ç400ÿcàrõä äÎpR endstream endobj 5298 0 obj << /Length 149 /Filter /FlateDecode >> stream xÚ35Ö30U0P0bS#cs…C®B. ßÄI$çr9yré‡+˜Xpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þ30ØøÿŸÁþ?’ý?ãÿÌ@5J2"‘Ì0’ñ?;ˆlàÿÿ¨Ìèâúÿ€¤üÿÿA*þÿçrõä äðŒ endstream endobj 5299 0 obj << /Length 199 /Filter /FlateDecode >> stream xÚe̱ŠÂ@Ð7¤¼&`Þ8Éš …(¨ ›BX+ ±RK EÁBÐɧ䦜"8ÞqaZÜ÷=¸yÒÎ$‘/$ëI§+ë”wœå良þ±Úò¨`=—,gýƒ+ëb*‡ýqÃzô;–”õD©$K.&âœQÎ~8¢˜¼-x¥)؇%‰à Vd‰.hUAëmPþ[‡0ªÃ+|D0|D] ×zy‡ÊÝ^Öœ}÷b‡Uc\6úù?ù»à?#Zh endstream endobj 5300 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚuαJÄ@à9R,L³opÙ'p=…póSZYˆÕ¥…¢pE ûhû(û{]Ä#ãÌZ˜F˜ácfø«Ë³«Ú朻ªÍEmö%¾aµâ¹Q»WÜthMµB{Ë[´Ýùxÿ|A»¹¿6%Ú­y*MñŒÝÖ‰\Kÿ©&Ð#d!#P¬OIÇ*¿ —M «D // R2h‚``ÝRÌ“m\®ùÕ‹ãzð=@>6m8ˆ}F}:ä1Μ¢>²Šý ,EýÍfù¹œ‘]ˆîO Î sSq0€iî ›TxÓáþ¦‹j endstream endobj 5301 0 obj << /Length 214 /Filter /FlateDecode >> stream xÚeͱjÃ@ `-~„ÓôìÆ&lpˆ‡B2e™ÚŒZš-?šó&†¾ÀA–Œé– î㤻_*³—‚2z•S¼ÑbI_9þ`QJi©ŸßØthwT”h×ÒEÛ}Ðßï鈶ټS޶¥}NÙ»–˜a÷lÌ}ì!â!xHĢ µK{Ñ0S%¦ÓYLæIŒÙ±„4¬^½vA:ÓCžõÿ5ûÏ2?¹j,TÓkØ„pÂgÙ àe3D^63ÔìŸÅU‡[¼}l* endstream endobj 5302 0 obj << /Length 245 /Filter /FlateDecode >> stream xÚeϱJÄ@€áYR¦ÉÜÎ è&^¢‡óSZYˆ•ZZ( Wœ$/%ñEò[nnœYäÚ|Å,ü3[åû%åt@{Å!•Ç4?¢ûŸ°¬dšS5ÿ}º{ÄeƒîšÊ ݹÌÑ5ôòüú€nyyJºÝ”ßb³"fo8ü7a êLìàŒ¸{؈kq€ÐàEoÄÚ›A ª I¿sLÅlL;q›‰é6‘­˜ð,ú)þˆŽ"pøkë'ëaÒö“šß “6ª«jùTº…vûMtÕ%ü¥yþÖpû®É7«±šc%^–Æ ð¬Á+üš~oì endstream endobj 5303 0 obj << /Length 200 /Filter /FlateDecode >> stream xÚMÎ? Â0Çñ_ÉPxKŽÐwÓÚ‚bÁ?`A'qRGE¡ƒÐ-Gñ;ˆñ¥.ù@^ø’W EÁ)çáŒ9ñ)£+åa–†kx8^hV‘Ùq^YÉ”Lµæûíq&3ÛÌ9#³à}Æéª—Þ{÷G«¼-m,@{L¡?˜ y㉲§C¦|Ï uäj%@ª* éy RM§œT—rR)§~ØØI;Ýó¶Ri+&¶éPÚ¦¼•õþ¡eE[ú´åfN endstream endobj 5304 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ31×37U0P0bCS…C®B.cc ßÄI$çr9yré‡+sé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ä€ÀDübvQ$þÿG%úAüȨÿÿÿÁåêÉÈB•\ endstream endobj 5305 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚmÏÏJÄ0ð¯,Ì%ÐZ%c‹ã7¢â!¿02I†ñ|ÜøÖÛz¿ü¾“éGÆ­…Vx|–í,ÍïGi®˜•f¾ö‡×ã“4Û› ßI³ó÷odÞy¸A# ÕŒJõ—&E½8]&”ÃRj ©Ð¤ šÙõKXÿ™"9ãØß°öC¯ú"‚ãƒùÊÞáN¤¶¶šàžç‚ +–o¨q‘Ô ™€ï@æF2ŠÌÏh.ÊpFmLF IÿA.g¹•OÕ¬—´ endstream endobj 5306 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚ}±JÄ@†ÿbaš> stream xÚϱ ‚`ðáÁ{2As‰3È!¨©!šª±¡(hˆôÑzÁñĺïŒt©¡~Ãÿ8îÎûa@ ¨ç‘R0¤‡Gô=9›Îö€qŠîŠ|ÝÇè¦s:Ÿ.{tãÅ„8MhÍ3L®±â“+ÿ"dL-V¢K±x{°pprm î%@%*­!š¥ÞiÉfúÈ£ú1ƒÖºÕh¬´fG«£Ý¨ZŸFéȶ> stream xÚ32×3°P0P°PÐ5´T02P04PH1ä*ä24Š(YB¥’s¹œ<¹ôà ¹ô=€â\úž¾ %E¥©\úNÎ @Q…h ¦X.O9†ú†ÿ ÿᬠ—Àƒ€ ãÆæfv6> † $—«'W ÷ '® endstream endobj 5312 0 obj << /Length 171 /Filter /FlateDecode >> stream xÚåÌ1 Â@Ð [~¡ò/ »1F“JˆL!he!Vj§ ¢uöh%G°L²î‚……7pŠWÌÀÄj RVsÈ£˜Ç BºRäJœϲ?SVÜp”’\Øšd±äûíq$™­f’Ìy²ÚQ‘3ºÆ´_@ x6ÿÂÔQj‹yþÂka´–Dƒ D~ü:èVðhˆªt—%¨š´¦7¥Tm endstream endobj 5313 0 obj << /Length 229 /Filter /FlateDecode >> stream xÚuϱJAà¹ba ï ¼yÝÙhº…Á+­RˆPK E;1 ¾Øt¾Æ½±»âp½‹ S|Å?;?¬ŸÏxžjösö3¾­éüTCÆÍÍ=-r+öSrg“kÎùéñùŽÜââ„krK¾ªyrMÍ’a{è„Õ®lBŠ-`a:`Ðu)xªu‹w­äG½W‹˜ÕùÇ2©&e˯œɦá¶ÏÚnh›‡Î ÙÍhüuð‡aǨ‡k}ÿ¡ Þ[ bÔªµoŸb»ý"E“z“†O¾€Nº¤oÉŒla endstream endobj 5314 0 obj << /Length 159 /Filter /FlateDecode >> stream xÚ35Ñ34W0P0bSC…C®B.˜ˆ ’HÎåròäÒW01çÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0þaüÇÀðÿûÿ@RŽý´`üÁÀþ§€ñóŸ ÿ`ø$@äÿ†z É€ ÿa/É òmÃÿÿ?ìÿÿC&¹\=¹¹?qjS endstream endobj 5315 0 obj << /Length 144 /Filter /FlateDecode >> stream xÚ36׳4R0P0a3…C®B.c˜ˆ ’HÎåròäÒW06âÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0ÿ`þðÿ‡üŸÿ?lìþÿ(¨gÿñà?óÏÿ6ügü  u@lÃøŸñþC{Ì ´÷ÿÿpÌåêÉÈÈöPê endstream endobj 5316 0 obj << /Length 162 /Filter /FlateDecode >> stream xÚÍË1 Â@…á·¤L¡°˜ èfqCÊ@Œà‚Vb--+'GË‘<@Ⱥ!Xè l¾âý3©™ŒžóÔpjØZ>ºíÇ„m:”êL…#½c›‘^…™´[óíz?‘.6 6¤KÞNäJV- ð-rÿeÜByD¡z 7ÿ«ÿU}Ä`‡(øD,uxIƒé0nÒ·WR héhKo©b“ endstream endobj 5317 0 obj << /Length 248 /Filter /FlateDecode >> stream xÚeпJÄ@ðo \`^›B¼yÝÍ] ç ¦´²á@-íÄÛG²´Ì£äR^w¢ùÃÙüŠ™]¾™9ŽŽâ„ Oùpj8>åxƽPS5œÌþZ÷O´LIßpœ¾puÒé%¿½¾?’^^qDzÅ·›;JW\×…ªË¡~ lr¯&V‰÷g¸î¾{„'À´N2¬;säÀ8GÖêÊvn=§·õЪÊQoåb]pл ~‹‹¯^¶ã8ëõí®Ø:úg00ìœ7~Êžî¿®JT¥Ä٠Ͼüœ4s”M^!ÒyJ×ô[ÍX' endstream endobj 5318 0 obj << /Length 207 /Filter /FlateDecode >> stream xÚ½½ ÂP F¿Ò¡¥Ð¼€ÞVn«“‚?`A'qRGE7Áúf}”>BÇÅšÞ‚Šè*3$|9º×î†ì³æV‡uÈQÄÛ€¤}®+ê5“Íž†1©%kŸÔTڤ⟎ç©á|Ä©1¯öר8Ux·èã”À*à%V7±38©“ÂÎ \Aî&°rOP ådeyÜ¿¡>Xý ?c\%éý#øë£æË'q¶(I£©fÔ‰µNšÄ´ ƒ…) endstream endobj 5319 0 obj << /Length 259 /Filter /FlateDecode >> stream xÚ]ÐÁJ…@ÆñOf!"·."ç åÚÍE0p»A.‚Zµˆ ¨vµ ôÑ|Á¥‹ËÎgH0?˜ñ?p´¬NÎNmn¹ÊÒ®×ö¹wYUºÏ¹å‹§7ÙÔâîìªw¥§âêkûùñõ"nssa q[{_ØüAê­…ÙÈB´aD4%;˜>Ú#îp¨§Ýà{%*eÌdl”鈧W”]èHÿ‹ùOË·ž¦…dfä 3Âױt¢KÒ‡óF¼oæû¼³MØfl=³oÂ,"†EÌ"pLΉ~WІh–Fš¥F³*Ö4×€& !Œ3ž´DWþËZnåÎvj endstream endobj 5320 0 obj << /Length 257 /Filter /FlateDecode >> stream xÚmÁJÄ0†'ô˜ƒyÅÎ h[éÖÞ ë ö ¸'âiõ(¨èÕöÑò(y„sÆ™ì$ä;dfþò·ýùåšjjéì‚Ú5u=5ø†mMrºþPÙ¿àfÄêžÚ«~Æj¼¥÷Ïg¬6wWÔ`µ¥‡†êG·*€‰`ˆß‹Z@y˜æÂÂ`5@éNŽ0Þ8FéÁ„ Ê ðÒxÖ‘õPºŒÁ fÆÄ¾ŠÍ¡HmVJ[ù\8ô¥ )ƒqYT‹‘Nà K†Jˆ¿8L3#Úÿ±Ä™g¾DïU”kñèÙ-¬Ä2¥¡gþBá8&%ÁÃ1DñÂëwø>³vq endstream endobj 5321 0 obj << /Length 238 /Filter /FlateDecode >> stream xڭбJÄ@à?ìÂ4y1󺉗‹[8O0… •…‚Z *Úš<Ú>Ê=BÊKÖD¸Òæ+f™™¶ö‡Ç+.yÅG\×Ü4üPÑ -½Knü÷Ëý­;r×¼ôäÎ¥L®»à·×÷GrëËS®Èmø¦âò–º ÁØ`#úÁ¦” ÌJT&e« 0m´ã?H‚M¦ÈF3âC‚ …P J°@¤#ßJ“ÿ2 ‹_â.N”^‘v2%5+w:ù‹gY9–º×Cbì)û@;ä@¯ùf,B‘M¥—B‘~2ÑYGWô îøeß endstream endobj 5325 0 obj << /Length 185 /Filter /FlateDecode >> stream xÚMÎ= Â@àR,LãvNànB¢ þ€)­,ÄJ--íDs4o¢GH™"8nÂW ïÍÀä¶?ÌÙr’ó`À™RËû„N”f>¶œg¿nw¤qAfÍiFfîs2Å‚/çëÌx9á„Ì”7 Û-SŽ(–§“·“êѪEšÎ§#ÀZ^JtÔhàŸF{pš FÄUK½ÑóžÐ%\ÙÞùÝü3q UA‡R•ˆš´¢/Û W endstream endobj 5326 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚMÎ1nÂ@б\Xú Gð?»kǸ‹%p¤¸@"UŠˆ ()@¡‹bmÂ\.’åÏzEaéU3SL¡—eÁšMΫç%›LóÑÐ…²ÜÇš‹·Ww8Óº!õÍYNêÓ礚-ÿ^o'Rë݆ ©š ë=55#ê[$w,z¤w¤U‡‘CÜO|?Mì$í ÞƒàofÜ\‹‡X‘^ÄC0¶3UÊà-Ä%âbé#±þ }4ôEO·€[h endstream endobj 5327 0 obj << /Length 266 /Filter /FlateDecode >> stream xÚ342Ñ37S0P0bCCS ¶PH1ä*ä24° €@’ɹ\Nž\úá @ .}8—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹ÂxÀpÞÿÞÞTÞÞ9öÿÿIöÿ` Êc¨ÿÿ‰Ç±Êcã1@œãÕƒ …ñìÁ®ñäÁ4ŒÇ¶Æc»;l=ï‚LjŸ÷ì{²x?-,á %|¡‹+ ¸cóÎxGM¨é5-¡¤3Ô4ȶkÚe‡d 9ïØ#g8æ$…04àà!8Êå :¢Ä§ËÕ“+ é|0 endstream endobj 5328 0 obj << /Length 484 /Filter /FlateDecode >> stream xÚ…ÔÍjÜ0p ºø¬hvm($'Cš@öhO=”žšIHÏö£¹§¼†ß :ú`4ý4²ÖY‡vù¡Ñx,©Þ×g_ÍÞÔ{ó¥1©›½¹«õ“>¯ÑŒŽ¦‘Î?úò w?Íy­w7Ü¡w‡[óòü÷^ï.¿3h¾2¿0í·>\¥TA#þñSDÿÖ7š3f N*·¾ŸG03&õ…å¡3ÆŒ%XÒ€[-Gj§ìf°tLâ(9uÃxU„a¼xæÔ+¿¤EXÏÊ“…èa< ° Ì™³g¶f¨Þq D°Ýdµ"²\s>a±¦Û$0gö‰CâÙùJ†‰I0]"E¶qž§$„ÂÆÈž1{¢8º _[Énæ@*ïŸAÅír œ% ~Ž8Èr®LóŠ4O»$ùH™×¯³EÆw)‡f›ÞdZJ™§ ר TP:®íÂ*•¹L,óÄ,qùÀóx‹í&«è–|>'-T°ßdÜ8nÅñ”³ŠG0VG0–˜é– Dé ’|ÜÌÓ†¢J¾_ôæ$1E¯~ß ôÏæÛ/J35œP&$èd!ú,ÛH1U܇SØ«6܉™l¸Qî<úú èÿïï¶ endstream endobj 5329 0 obj << /Length 356 /Filter /FlateDecode >> stream xÚµ“±NÄ0 †Suˆ”%¿´UÜM‘ŽC¢L è&`dÁJ»ñZÝx¼7v¨0±“ö‚ÝDë«“Øþÿ(Ëê°>‚Žá ‚e 'K¸«Ô£ZÔ>YÂ"®Ü>¨U£ŠkXÔª8÷iU4ðüôr¯ŠÕå)TªXÃMåF5kBìEørÄψqJ{Âí´Ž82jtþÑøL6[GåaÛÑ&>GQâÀ8P*‘Q̸ÇŒ«åœ@츕I±ÿ-µÛ‹¡‘¡I9ÆcÆ«‹H‹YrTAâr ÈÎEñdm´§]ùιsGóí%e8ÚÝ„mŠÑIéÄ»?ÑîÃööÁ‹©[DºþsF]¾ã {CÚôa°Ìë6½$^½mçC—Þ#$£œùRœàcø±X:-qwH•%Û!Ã@B¨³F]©/À¾jé endstream endobj 5330 0 obj << /Length 305 /Filter /FlateDecode >> stream xÚÍ’±NÄ0 †Se¨ä¥P¿ôÊлN•ŽC¢L ˆ @07ÖGÉ#tÌPÕØN{¸+^ú9±ÿ4ñ¿+/¯pƒ^”¸­p[ãk PÕ¼¸ÁݼóòûŠG¬j(nyŠö¿>¿ß Øß_c ÅŸJÜ> stream xÚ’=NÄ0…¹ˆäÆGÈ\ò#ABeiY$R AE¶J ´ë=Ú%GH¹EäÁ3v¼ˆR„¥$Ÿ=ãycçuÍù%Tpg5´´WðR«wÕ6~±‚.FžßÔªWå#´*oý²*û;øüøzUåêþjU®á©†j£ú5!2œqÏ€ˆúæ\Œ î몛^=¨oaf+š endstream endobj 5332 0 obj << /Length 443 /Filter /FlateDecode >> stream xÚ½“½JÄ@Çw¹"°MÞàn_@sá<¼1pžà‚Vb¥–ŠvBâ›åQîR¦;ÎÇf7bD°p “_f?gþ“u~¸XÚ¹]Ú|¯ÖöxmrólV ŒÎmžù±û'³Ù™ìÆ®&» “í.íëËÛ£É6Wg67ÙÖÞæv~gv[«¼%-ùj¥ ‡¤9Ô @…Cˆ ~ã,pº¢Eœ@ƒåìU‚Ï :¯ç'ÐhŽ(œ´',9Z::¥%ÆNáfè¹²Ò‚NMq#]æ ÒKÂÄcõ¦ëÿÆ_o6Èb<ÍP)Œw¡f´X*IèëKè«.²’5ëÌzTmx>Ú”Õd7JÜgL]é;“"^7îJ9Ž7*è[º’:U•šÊYG9ýMƒÞº×UfóLs¾3׿.vÞ‘ endstream endobj 5333 0 obj << /Length 325 /Filter /FlateDecode >> stream xÚíÓ±JÄ@à„+Ûì#dŸÀ$Þ!¹*pž` A+ ±RK Eë|±_ä:Û”'„ü&3;;'Vr… /›ðÏì„,OŽs—»Åx-ç®8ÎÝ}ažLYŽ9ÝOîͪ6Ùµ+K“OÛ&«/ÜËóëƒÉV—§®0ÙÚÝ.¿5õÚE1v/àPF2UÚþ“ñët1ªFyZ„IhwiXmÑ c„Îfƒ6ÙR“²˜Õ6°i…œEä,"g9‹ÈYDÎ"6›@„™Í¨[b‚ð‚U¦ 4f£”ÿÁâvðƒRNå;à‰7på‘1àçÐGcëðƒêä÷›X)SôÊAh• °ÇÖs¦Œ¹ Ï­§¯Llö¹Vè…é>¡„‰’+ 7ž±’/ì„Tù§ió +Èú=ÍYm®ÌÏØ: endstream endobj 5334 0 obj << /Length 201 /Filter /FlateDecode >> stream xÚíÒ? ÂP ðH!‹GhNàkQZÿ€ÄI]mæQz„'v(ý|¯UÐMÁÑáã—’)a«ÙêŠ'm“ +aGÖ>ï8°½g[[¬¶ÜXÍ%h³›)«h"‡ýqê?ˆÏj( _¼%GC!š\M€1.Jk@b­©µabuÓ8³öäCŸj(ȅέ èÌŒýî5}x~÷–<­öoT "s¿4ÎŒ‘›V:TI¯æ_šýý@ù9Ë£ˆg|(4 endstream endobj 5335 0 obj << /Length 218 /Filter /FlateDecode >> stream xÚíÒ± Â0€á”…[ú½ÐäZœ UÁ‚N⤎Š®ÚGóQ|Ç¥±IEEP\¼åƒ þˆš*D…-l¶ IupA°†0ª¶ ‰øl¾‚$9Á090{é·›Ýd2ê"ìá”PÍ í¡¢õ|¨ó¦î ½úÆìÕ÷:¬ËzlÀƬ®õµ™Bè7½¾÷÷ ƒì7ÆYÝElú(ŸÝ›~ôÍÒ†’Ùä:srëÑÍmH'ïlÃÊý“ý˜ÖGž¹a/–\^ÎeVÇÐOa 0«   endstream endobj 5336 0 obj << /Length 220 /Filter /FlateDecode >> stream xÚíÓ½ Â0ð„ [ú½Ð6ƒÖN?À‚N⤎ŠN ¾˜à‹¾€àâ ž×3â âj w?.$dù»Ø•+cKÓ&5;˜Aêxc’>NFS¨çõ1uµy QÞÁÅ|9¨Þm O›8à;CÈ›¨ ]/ºñ¦Âýjµ–7Cq(¶â@lþþûKÛ/|pøf+Î>x%6tåz~Y?¬ ›£7W»'’4q ¶D; ÃFe†óq(ž>é›wÈíêm¹¼5·w(õ´æIZ¡•Cî‡o| endstream endobj 4949 0 obj << /Type /ObjStm /N 100 /First 948 /Length 4059 /Filter /FlateDecode >> stream xÚí[]%7}Ÿ_á?°=.[Šx Hß!Õœ5Y¡*.ñ´ì#%H±Ž7%§ 9± ÙÚS|7t€æ«%6kª Á¥Aq][tN%à¤Hb‹Š¹‚0ñ%"EõŽz zÊžSUÐR‚%F¢`æbb*Gª)tïµß=¸ž;Š•=´•+Þ)ª´%¦uêuQ<&'KŠPj L©5•]ÅÜÜe ÛØ áMZä´q…¶âSâZv‚V­ÕŽj&#cíºÎ˜pŒW¡c¤ð">`-·8ÙßaÑs2ÐÚ!Ù11 Qäz MØ¥¨–Xˆ÷’Ø «†m{(IÌH ¨Ö:ç0a=åˆÏËâ Ùt>åî‹5y÷wÿ«7¾ü)ûSöGŸ…øòî³Ïîîÿôï¼Fá»·îîÿøÏ¿|Ð, ãÝýïþÎg±ßi…ß>|xÿæ_î ¿yŸðÅ{þ­ô—£Ö矿CÜ+|_j^£Ã£?¼þöÝ?ßõú[÷Ùgîþ÷ïß}õÇ×Pïþ÷¿ø•»ÿõßþúús÷¥ûÙÏÐË›÷ß~øùßÞ» !~ó°gàÔîîÿüæëûvX_¼ÎÝý/ß~õîë7oÿ:ì°±6ÐjMËÐíµo¾¡_ø‡‘7XŒ^7XÁg>ÑJÒ&ÍY5ÂÞÝÿâÍ7ß¼~ÿú-òE÷0¾5Ýooß}øúõ7°fþþa¿©m[O„…´b"«0°0` ð¢îA ?Ì¢*„=1f–î(Ç#+ú4Ù Ù|(îÊURóÅ*AOs•éó*áÈðI4ú7/’^Ì"af®‘â/ÖH‘Ë5RÂ\#)rН˜²^îzYúˆ ¿TgñRgt+‡ÎöôYgÀU@DE߇ÊÒ¥Êò*+Se±o!Þ¬²_ª2¹a™Q‹ ífµ`4ÆÌÒX»ÔX¿ÔXõSc9nå*µpÿÐÂÒX#ð-uuô#^Ê z{UÜ+ &+|#·ª.•“£»ÞéN!ê#Ý)X=^9ÄÇF<ɦ†íù¿}—‹ÒÚ¶Ö>Ò #…lþëX~÷—ÊFÐ\6@Ã=Ý6›¼yFùv”û=Wð½ìmUìÍ\ ì ÷$ó‰·®Y4 Ÿ‰GÞ!ýÀØçå^J»Àº-}–Ô ŸFÙfI|¢âúr=ýøöÕOG+½Ð_ïËcñx‹¼%Þ2o 3¾'×X¨·®nˆ76¢øh|»7ö#…·Jxo\ Y_‹²¯º/*ëmÿVùòx¶C¾8r;zàK#w8Ç®üêðÊÊêÑK×^ú‘™íÍŸ\n““ËmËóSnÓ+‹kÓ{Ò»–g–´•™å‹µ:³”¢µ™U1úÉ·÷)•PŒ>¥ŠÑ§TÂqû·O©„ãö)•P}J´çúBs^nA ¯¢š%Hö f‰†È˜¥eÒ•?6KÇ °f©æ…ð½&c<²ß¸pÊÆ…C#O˜¼a‰Æ¸A¥ã¾JCߪìéÑ÷§ÜG?'“([¥?ÜÀÈsßR€&7¸­\¶HKUpK{E˜#.Ø8ðoF®­²Óñ|XØÑx¤‹ßLJöFM½·°õ£ïÇj"â†q3ù]c«tWÖ*²Ë—º›fjßèatš±¬v…Eô)myoŸó†e$í2Œ}Ø+^awi°(ò—–Q/X¸Ð]ôóI„¹ã•`ñhçW›#§W¦Ã…ö íjgÔÎ%š3\¨—Q/£^F½LU/'zái©4y¸ÐKE/½Ô@–€+¹š—@m½èТ¢EC‹&„¸Ð¢a܆žê5ÔƒíiývŸÀ[}ÖðŸ²þ¼±…t¥,jx3x‰/‡í YÉaúÈ9`^Ž\gî0|‘9ؽ¤‘³£fbŸþ¨™üò‡IäÇäýaz™òþ°‰£ûÃhk¼­Ì^8Þ¼1ÍÌM¿ÅñÊÑ A¬/uù´ìü‰åÀÜ1:ƒU¾ïž)K=Þ]ƒwõx£¬ñÀéÙNYøU{9d)ªÁ²|(r‡,E5xôÂø™—C–Êw‡,4<>²T¾C8da ЇC/•£‡´¼4r‡,•£‡éÁ9z8di=²4ý…ÑKYÁôñEC™ñ¥Qñ¥Q–xȨ¢‡,²Ä²0ruaäÚÂÈuƒ²OÞ`dÅ`dƒÁÈFƒM# › F@vAÊ”,d@ÖB†ÌXü‚ Ùg µÙ(• %PªJ`×çl²Å d§TB©ò”J(Uî&*åí Ü@vJ¥‘éEä¯Eé2²Õb™‘­=ýDd‹6ïö¸V©{H1Øã€ˆ{0Ñb+{tuhþ“ÿটÀ)5ÒÙ—¼ÕƒveÙ/q—r_TßSI9î—çãZcÁÑð¯'y™þeÜÕÕrúvj=­áÚNk¸öÓ²\P]—e“—.žp#£f(1rïfèÚŸƒ®’. «¤Kè*É@WC2Ÿå•PêàÞ;m5÷Ç<ü)N€IŸÛHc±Ô`%!.P#}œBÎÌ55*“P•Ö±æ:°É&a tJ¿¥mGhR2½÷?j꽃§=}’JÛú?1{MœÙjþQv?ªF[†ŸdŸ¡Gz¯¯ƒ_ƒ=ûc„©ø1?Ž(’œhZýHŒ@%¾±ö¿G”x ÞËcÒKMö­pRsE€“·óÉDÄ|2‘€NÆœI­É„ŠÏ&½W|6Ù½šÄIîŸMn¯ølR{Åg“Ù+>›Ä^ñÙäõŠÏzµølFQŸõnð™xoð™x1øL&†&>“‰¡‰Ïd¢m~25ñ™L M|&CŸÉÄ­Äg2±7ñ™LäO|&ùwÕ`6hM&èZ3´&’,ZÉÖ㈋ÖDªEk"Í¢5‘nÑšoÑš±hMB°hMB´hMB²žNB¶žNB±hMBµhMB³hMÂÉ-J<¹E‰bÑšÄ`ÑšÄhÑšD»‡„l¶hMb±hMâ)í~º~Ðëêƒo€9XHÜ¥Ò½´Û0N²kðÿø7Åp`„—\Zp Äg |fŒCädIzéþe¬·@à¤Ñ[˜öOˆÞJy‡t±©òå¦RÈfSiÀ[½[U7,›ÕMM#‰±é]ÁžÞŽÍÑn€À„9зC¿QÕ<µ(ûc¿ô¾÷9Pé@ÈæÎ]Û‰œoGæ; ÿo¢ó]¿kßíñßjëÿ±+ÀäUÙÄ1d\î™82>]Q¸å¸(rzÕ 6¿Fž´\OÑN¯qÆЛâ§Äšq¡^A½‚zõ ê•t-GÀ•oa¸P¯û+v'•7ð Á†-(¤š{‹Š¨fTV1ÒÜiTˆ4w/»–fc×2Ãd 2w#×ÜXäéF™ûŠÜÚ‘B‹3€‰ýfüDÝÁ ŸD/›è¸ÌÈ£ã2ãŒŽË ÿ%¾C™‘sÝFÎeƼ“Ž o’gä\ŠeQaò&²¨°x÷¦oâÑÉ›93zJ†fð4ë¹Òl"ça†N93rJ.¦×TÓ·¢ñª—GW½ÌÈ9õ2có…z™aÐB½L–XtVºa{2ù$ÙžL®YtMtÃöd1AÊ2™ ÙžL&H¶'‹ R–Å)Ëb‚”e1Aʲ˜ eYL²,&È9ZLs4™ ¹_XLs´˜ çh1AÎÑb‚œ£Å9G‹ rŽä-&HY¤,‹ R–ÅýtíÖµï\3œQf,ºë×á ƒ ‹3êxÉ0È`(£xŠYCùú†2òý e¤ e¤ e¤ e¤L†2R¨EÉ ƒ¡Œ”ÊPFJe(#¥2”‘RÊH© e¤T†2R*C)•¡Œú)'Ë ƒ¡Œ”*ÚãÈVË Cl/Ä«Éßzª0âÿ½àÕè Óóêñj”u€,¦ z÷'âøyãAöÍçgxD¬Ú¼Žæønp£¼6"Á©ðØ»7åçºs£ lc縸Õȃ€s•?ØðN5oú²@Iaì4äJ ÙýCAÔ3kêr«²ÑPê‹”ÂzèvYºØ¦Øßð,ƦÿžŽÜÀtÅ¢o1ÊÇ{Œr`δÔ®v45Õ=3V0”ó;T8žhãñâšÔÛàv88$\A\ÿäÁ¨6-øsyŒÀn;|@+Ø›‡ß[!Vx/8P€iY!ß‹óÌç 0Ô;Ÿ(àó®­Pô8õøþ¹V¸€ð5§Ï®D{aí`ÒúMBDŠEta"3bªí‰ƒ°íïÄã×/Å ¡èí9‚èí9‚8ý§þ”eúOÎs˜ž˜#LÔFÌ&j+*u2˜#LœFÌ&N#æs„‰ˆ2ÂDCDazS"‰01±"‰jãÆ¡žÐB=¡…zB õ„ê -TëÙCNÖ—¯}}âlõåMN¾¼…“/7ú(œ9ÐGéÌ>ŠgôQs š}”ièS_¾ô©/7ú(•9ÐG©Ì>JeôQ s b¬}ºz{=9ïÞNλwë¼£÷ÖyG/ÖyÇ úÔyGÿÒ“ßé‰ýVoœ·÷Oÿ ECÑ0Í·`NÏ`ÖŽ=öÝár·>†dcM¾­ˆ’®Øñÿœ»z×^=ë‹Âˆí?§Mê =\”fÙÒU;ÿã,·"ÏûôCÓÍø'ÝÑÅn¤Æ NûŠÃä»Þ¾ã§1»õÖc«°^u‚˜Î}²2Ï8á¹Z׉ÎÕº»× 'í% ÅþôÙÓűEö„£¼ôˆmºüÅ„ÏÇI•>7ѽ×ßoÿ_ âK5_ÎåÍ—sìÚ/'v³Iô’ïâúßvvŽ?°á[þ؇†á»lJQš(macÛ£”]¡ê£#4ú´ü±³ŽrSÿ ¬Õó5ô*GÀË~ÄD0Ö„E?…3€RtK«°7D´ôßUYI¿£ÿњˠ endstream endobj 5341 0 obj << /Length1 3040 /Length2 21659 /Length3 0 /Length 23164 /Filter /FlateDecode >> stream xÚœwT]˶ep÷`ArpwwwwwîîîÜ <¸Kpww NÁ5}òî7¹¯ûÿîу1`ÏUKæš{UÕ†ŒHQ…NÈÔÞ(noçBÇDÏÈ ²3±·s¶·1r1ò²d¥Sš»Ú9@kLlðddª–.6ÀÿÎ žLèälioÇý·¿ˆÐÈd5r…©ºrFž&V73;7虑‰ëߎöNÜ9K #  @ÅÂÈÉO&bïàédiná øû@iB dd§E3Ó”,²@7K Ý?(Í,œ]ìŒlô6F=šÛYÚЛØÛRÑþo ™˜þJøÏªž j6 ý¥·w2ÿ?E²Ðý eÿ7ýdø«¥­ó¿]MœM馮Tôÿp“µ4Ú9M®v¦@'€Š”,À ô^6ÙAÎ  Ð $¥)ÀØð륉ƒèÕç`ä`aPZ¸¸8p30üŠ3ûµDïlFota I,fg*bok ´sq†gb˜Zš¸Œæ–vð ¿R©z‚82Lfa9#'K€#=##€ñ×ÏßOz )Lííl<»ËƒÄ0È«‹H©Óü7Sô·³°°½À›@ÇÄÁ`cäp²°|ÿ™TÑÈò¿H1þ”²3³ü›¼©«Ã¿pûkð”ÿ<*À?SÉÛ»€4Pþ~kºŒlŒ& _LÿÍýËášž_±ŽÁŸ ÿ=Fÿ­ý==ÿcäŒÑ¿Gç—ÏNϯz]PÿÛÜüòùEÈþŸöÒÿ÷þùÿÛ3ÿã>ù¿ïqW›M!åãÍŸà¿ð?çBÜÈÖÒÆó‹…ü§§ð/âÿ]"•?UÊÅÄJÈÎÜæo“¥³¸¥ÐTÑÒÅÄ`fdã üË®ö«K; ¢½³å¯ƒ´%ØÿcMÕÂÒÄÚèì ø¯% é±7µ´30³±ŒœœŒ<áA›™™ àͰeò=@µèíì]@!W_‚Nð¿v;€Aè—é/Ä`þ8 "¿'€Aô7â0ˆý8 â¿€Aâ7b0HþF,©ßˆÀ ý¸ÈüF .²¿ˆ‹Üoâ"ÿ¸(ü8A\#¥ßÄEù7qQù@\T#µßÄEý7qÑø@\4#­¿ˆ‹öoŠ3ú@õŒœM,-M,L\mÿ¶³2ÿ²»,­ËýËÙåw,¨¦ñoŠ062±vmU‹¿­L̬¿ÌN@ý;™m€f.˜ÙþËü×ý;+Ó_fk Ë?ü¹Xþ¶ÿG¨u“¿ˆ¢‰½ h®ÿnŒõ—ÅÖö·LŒ }Lÿ†, •Mímlþä ºv€¿“‚<€ÿ(ÊþkÝÑtäüÄ4ð6F¶d)dö; ÈÃÌÒí´¿–í]ÿ, r1ÿ]´nþë3ø§ ¨ßj³‚D´ðt°Úýá²YþAä­þ€ i°þ‚ôúÝ;H›_ûþ÷:HÝ?:Ý„ ¿K±rÙ΋ß"€JÛ¹ÚÿºÍÿ Ä’Ëþ7iPNû?¢˜˜@:ü^Õp0rÚýãý³2ý—õŸoŸÔh„ì¿OVˆ6®4Á²8þnòr:ÿëôû›9ë/£=èKÇØæ@õí™@íýNËö Ýþž äî ú„ù› HŸÿØ Û‡á7{ÐÌàbáüc&@Í»¸ÛÿÊáú{ØA5ÿu9›Ø;ý© è5ºýA »ÿ±Õ@I=þ€ ªž@ú^¿9ƒ2yþbð3ßÄÕ $¿Ë¿¾„@¿±™%èÖ=€&ð+‹ö&šæda±ñ%§‹_̉J‡I¥˜•`k‹”i÷Õ(Òáë¯.Zþ¬\ó¤áT°¡Y]ô•þÈR3WY¹K8S R~ ˾|~5»¶èeàµðn2ƒ`i…ð5ó9—âf.Ý/êiçŠ]]7&º k­Ðµ»‰‹ ² é ¼à[º©¹Ö1¡Pkå—Sc…6‚¸= º·Éïî25KL”DJ©JÀKIõP=ŒáRl8Š`±*hSëçgÆiÔ­'ˆé_À›2t°ß•ᧇ­"îChÚyVñ™ÈCÎÅÈ1Y=Ù©Å Ü>Îíi‚›ç‚Í_Âï–éšieš¨#•úfËU«¸J´ÏaÏóõ’an9 Åã4&ç=iUæ€1ÅS"*—ñ~—=Û=ŽÉâû«0•¨¾Ä]»f],¾Ö¬§D¿=i(a]Ãý(§ˆ»âú~û Ò"µÝH~#x<Êç{W™mjR˜Û¤Dw šLä°•²Ü;s0ëR£ Ú+Ý6ÿMŒ(_Áf1?çcýÌ3¿ G™+×±Tm)„F¯ì$@&¬òÏ$F3¢Rîï¾®¢leðëÎÑ™–DÁ­Æˆ±µÇyñ ‹NdzLvù»o˜¹/“{{ž"ÕÙ•°: 2®—ŸÌ ˜úÆ«¹Ý½Æ³û#Í×ù:©¼ëÅMj‡<)ö§ †Ô‹CWÓtMR’νcº°k:òic' ÔÞpÍîOÿˆ›è€FLÀ9Tôð+¶Ç&Ë¢ÍgSMáÒWæWYªö. Ž‰Ð -ˆõFγ÷¹ž©ÑãÝþéì¨SËIV_XµÅN‚äÁùùÓ­àV£¿Zö¼š{Óâ­£ÿi8[ÐQòâ°v:" uçGžVÙ@Kƒ…R<©Á~–—Wž¦ùcTz(ïPvÇóëè¶…%yùg™BŠ /!¼r’ÒfG¹é¾0Õ$ÑúÙ9´¡ š…ôqñnºÅ¹ùå3Ioùkøí¢tR‹øÛÉz¦GˆU}Ÿ,{_¹u#°;ÞVJƒÞ 'ýZ/G—”⊭pÜO2J‰sm¡–Ÿˆ¼ÞŠn¨;'2¡,ª—£‘³¬‡<¹‹4Þñ\¹œ $¿ŸÛ]ŠæÌ”c¯w“bX·ÿ,‹)YÔzÙ9'é‹_\{ú3—Ȳ¥ÚêthYÁ7ñ#úS·ˆ’iõ¡j2Õ4·,“`Ó¬YXT#âIgššû¨5:îÜ*jÖ7š‰åÀPa$ŠúÒn¤ûïrÚø°?jÄÐ̤/«Ü ÛzvàfÉŠ¤ó°D›qÅÖxÊT O*yïˆcõ$²<‡[Í» ½£oBØf¸Gуã?*—+q%kz«"ÈÁ¿ëÃ7ÄJÚüøÕëu)ÛW²1føñ“ñ&^òå\D/"(†w”“¬ÌÕu©—/´é‘ÝâÐã2ɚ͂£RÆ[¶x à"7=GÁÓîµj¡Ç8üæ$iŠã2Ó{$–t…ã>»MÇÐ×ÅÂFÖâm¯2§õþôÍ©¿q¯ó|.܅ް#[ C[¼£¾Ï†Š#MŸ…„2qÚÌyç,]¤E û;Ð>¢üÜà4 =\ü½ßySco—ry͆å"Ó+ýÜS˜¯XZoÍ¡”:ä¹øCs±+}ZȘB=†N¸Y•ôIÜ4¾~|Ÿè^Ïãͧ)±’eÅ}éƒJð›¸n¦dJDAwxÎÛMÈœ§ÓÑ·/#œÀJ­ ¹-ƒ =ºà›uXpBîW`«„êœØR7Ÿ,7ßK›Sò I>{ŒÃ,*Ÿ"ï-pÊl•¯>qó=7u‘maYÔÉ·DÄ+ÓUØpVv%…·ØqñI.CÏ®&z§±›û¡\×6.ÒCÖÈ‘FJwisÇ.¼­ØŽØ¤sÅl¬;dþʽØ×ÿ€Ð\ÔÅ7𱘱¯ö¹òÙ¥Ùå܇ÓÞL4,ösñ*xÇV€‚=Gê ‚éÛáÊË^’ùE0ØR¹’Xq;áU¹]½tN¬ô@9€RKì0F šÄø6ÍSξ<ÜR@Äx·Í¼âÏãl”Ý'h½xgÆséªA™¯q["gÙ™´k[àbTÆÚ¤ÂyÌQVË L}•®×‡FKýK…ø!'1fØÐ¯ñʇVÜn×·ßgC×*Ú¡ˆhz¹hÖ,*JL¤%Q4Ç̺RL¨°hU¯{ËžYƒ ‘E£F×~Ò&FÈ+8EÆïPh?ÐçÁÌcRèu¶âöñ _-–îò®¸t=v| ^ó»oÜý|Î+ÿÚjðyëk[Ðìp °‚_ypdé.†þ›*VΠJ˜Ô…ñ¶â¦×24aä-võj‹ö#eH•/=8,#nàIiœClò‰!®M³A:È?°•§/G¢èŸóó±1øæ²Q,œ¡ó!öµòÁ²by3U¦Ü²Áfé"ò­°\–øb§¯KÑ ܹǷöl‡èzcÈ yž‘’,.jôYX_¬zÓ·Mo{‚ê^ýuë×1tŒ‘qº,ߥ{Áç‰JSª^,ã…óÔ…¬•š áVÃOIµGQ©ê DnŒû6zø€ñ6åõ®Ù.‹ªFM!e·ú%YК‡[Ùx< :RpXÑbüsê•ûNÄ/lmBûŒ$±^¦y—ÞïÙZz¶ô(fÏœ/mö‚ÌpŒ”f¡¶Oû´XY~ºEeûXö¬7ÀÚcÓL-}8Ç~õþ1fÕJ€=àÉ—³(k/c¼±H]º"É”ì³.2¤þ‰“ÖïÁ– ®C”øÃŒ}&íÜû²¼ý“í‚ci®ññŠ''â!é VÅ7Àc¼Ì<: µ÷ýÙI¢°”IÆ?$Ø›¦µPé‹›F¨ÊhIÀXC2vŸB_I]ó´>Œá·38Ôrÿä4†æEØj,*[Š­@Éÿ™ü¦`“v‚Ú Uöâ‚$µ°ñGTÛl2;=˜ÆxժᄄL…Gñôm!³çW Ã+?Ìì4³Æ2¹Èðsj͹¨fMäÝ3ͪ§±x€Îb²[D‡‚t¸¶ÓãE§5´ê~nO  °Û¶˜RT’ <]Pñ@“ ©éë¾ÑY 1m·9b•ÏåˆBžõªbñc;ÂÕ:šhŠÏW­Îè&1„ ‹LÔ7±ÞŬðiw,%€^&¹\;Òm=”÷ªáx4òÁˆê|f”š}ø_6ŽQÆ/KãAlÔz¢ö(­Çª’†‹ß&~觻宆<¦¯Ãøâ»Ç”sÝG‡\Ãu˜Óò[‘7\¦‘²Jì³ô6>Rî=«Í¿:Š+4QûbÏn´pbî†}`P»á9ÈåiãCéRL— é­×GÝ$†æ=€!ê¢dÚV[F( „ØƒÚ ºLÄl³ÔÌ×î&•%?³;–è{‰MÐÒ’m3"pò=Ÿíѽdô.(íÏšéÜ5±ø"rÃf7ÂP†ŠÞö½JÇum–dß(¡»Í¦y—Óµ·ªö|׋]}¤>Ê„ŠV­8ü*Ø…Ôˆ¢Ãúè•A@éûPŒ=flÅüÊtálØrMæ4ð+.Ÿ—ÙqÑ‚Ú }ârþˆ^JØþ-GyİÄ+ŸË¥ÝÍ‘ºÊ{ÕÄˤicºÂE2•±œú és÷o»t2nÓÈuÆ÷[CUQ¼]ÆúT¡Û„Î^_BJó­¤2Š2O ªì‹ðEUæÇi£nÕkµI&3Êð÷¢­s #÷”)È?® +gzšš\LjcŠiy‚Äñ*êæjm—d2Ï^Ô·ð´ëƒÀCãÚ˜Ök0Ù6‚†¡%F±Õ„jhO”< ®zfÍ&è.õ³û<Ђ*t«K>ÕPré%‰•E:ï´ðëœ8`"$+©tü·ä“2ã&å-Zq ÄŠ¹€_eÕÑYúöS¥¿‹ÛÊøS=›çz±T%bOEvrî1A;\â8ã!8iø'cIæ7«Ä_2.ó ϰŽÍ¥J•¤>u6%aô¹ ¶~š¨0^wþèÈ‚)—•Ì=ŒnÄT\ÈhW3ùA.%yâ¨}_Òñv²—Z“ú3¢ÕOÑ/êÒY¡ñ·T,uôÃ’ËøÝ¸# {ï]޾ÞßèÚc’P¦¡àܸ4Ñ[ëaî»Y,XÖµåÎC[­-àUCSÆ J]Áj’âYZª¦¯Þê^˜– "œ²ª¹xí(5Ö&ÛD§ã³ /¾E¥(w¦™ü Ööó˜íSöß…èíõžþhdýðágøŽtÔˆ7ÝOp™ÃîJÿÍ5’a¨‹¤U´/¸ªÊ·3ù™4m_߸H^DÕrÓzu>IÒ¯I Œ}H»Ê´ùÖ±&/b|ú,5Wø£1»ýÃæ¹ ãyïí«Á2djþ¹Â•:ÙÀí¡ø!Y“¡Ú¾­t\ýiCg\Ë,A2 MJ«1¢z¿RKPG¨21Î\@«”!Œ¯ä ,nËìvb;bç=öúv›Ð7;rÁhWQí7ÇÐ^£Äµ»áWì·£÷"c”èG[Ùv˜Ã8¢IÏ6‹.Ÿ ^=gá¬öâ8ýÈHúrVo&üÒ%ÝØu·²¬˜—…ýÖ6ïCsÀ‚ƒße|7Ò0W‚¯,d—í…ЫŸ€­…AƒgèfI„=ÙÈ¥è#¶.1mmš*"Þtú¹²ÆÈ¬À¶{ýÞìÔ2›$q\yîô‰´£ERŸk<}ÌÉmùg<Ý£k»ÐÙpê•pë³i;m8‘Œ2Ô¨ÞÛý«Ugvœ &ߖמOB•Qê™ Etè3=ÐÒ~ë!/rÙ[?£Õ{”#<ø[¼Žlï Äú»çµ÷ÎKæËCá¦1û¼ì%l ø9lº„£WË7‘•Uæº=H5¢ó`2W?'ùš‘õt ó'M'B‚æÅ`¿ÇÚÑH`žd»;‹¸³Ç.‹Füá›»QÔ)ó¾òüŒÓ©È=XeVrIrH˜ô¢rX>NÊ“vv¯LÁ5õ„s¡¨Ý“ÖôÇexÓ¸µDŸÒL¬&Òö4™G^Y·¨ŒótÄ?‰ñ´îÃ?—âŠ)AÝîÀ“êpq ésÀÕîïm“ê•)–ÐIdK.z`]HOï®gð Õ_ ™M¥DëÂAxFøÔËgoÕGrô¢ä<4ù`ËÐ'§¨âó„̳˜7Õb\金ƒˆ¡Ûn¼›¤Ãå#»Ôt§<‡HøZ2¢4»¯f‡Q å¨ÔDÜh¡ÙIiNƒ7‹•ž¸ÃÊÐYyÀ--5,ðý!ÆCsn˜iºU×1¦l?%ñ-˜+¬Lw`Ðûf­¦Wœ6«¯ÏÅßÖ7%âE^9+™º”éW}ߪâ¯_¤X=:yÂT“÷¸~Ì(†7”è&ý¤ÚhÕ÷"вsß'šú*¼`²¹dVÉ´)Øú³ÝóŠ˜24´Ç—É¡×]Ò¯t.i( ¨rwê9Y(I/F/¦þ©œ‚o %*bET“’²Îf Åqû£¬ü%˜Ÿ./å¶OKY9ÿǦ$ZøUvußí×Çó¯]×?¨¨jÇÅfg0Q{ºøÏ…jŒŽÈJÏ'6;§WÄ)p [B«i•>úåÙŽmõe`µÈ’{p}0t¶K¼ægÀ û4£¨o•’/ßDvœt#Å-Š·>¢nòY4[Iµ}W¤Õg¿¹Ã¢ª?xGË¥¶Ç†{/9ÍXôrކbßñÒþÒå·R¯ÜR» 8|»#âQ&€šTBÆþy¬%Ufñóšt|Ú‰o!k+öêtìÝf=¥I`GÒFº)ü²]ÐÈjÂV•[eš¤c¤†;¨¼ù€ `ª0lÿ %ÅÛŸíhYåJkÄÓÝʹxȩͮ±Íaå?vÜ̆ ¹}åB-¡LH¤t™´“¹ðz¸Xˆw6›4½Bå©9¦4µR̼/A¤RΦl“@–ÆË”•©uûb§¸Ÿ#üóÑE)¢G³Û]­Xd±Ë-¥„Ÿ&7&΢Mð¢f¥Æ BÞù“‰-š©¯š˜ê¨ûP”]ú,ÍËWvŠ»óK­8ΟŸö±=ô^©œ>4&DÇÄ_ ¶²žhjß~€>¿êѨ ôš5ÚW6Fš¾ƒ³mpÍ*쯥:Ù“_‹7%6ìµ5|üÒO°*¿åÿ¢îó©]:ñsöIÍî–|Hª.1®§V¦­4‘—DÙe- ·uˆ{¾7© ÙbdÏûêàûf´„ù‰ÈÊs›˜Ïëù\ËJ÷ñ÷ JpÁ kÊÌ”±ûÔ•B´VP‘ÐkKwí,‚Rì aœoP y^TãÛ髤Ä>î9+Z 0ø=ˆ'“¡.ÆMi ŽPÚBç¬Wß³ž0~þpU»^:-á…üM‚¤õ²î›x\GÍ¢„½«ŒBèÄ».Û*$¢þfO|¨­AaŒÁB¿K+Z¸d6?UíeF8ÿ].qZÚœG²O’¹¤DôÍä²M7ƒ¥i¤vàgakï²ý’F4¿u浃åÙϼ 6©Te2bÚŠ‘¶Éñ1T\Ÿt÷ö´yK5ûþ’p"®¸ÓUTT^cX›Má)×-åTµìÁ´¾{®Cs@?ÒïÅùþ¡ß›æá!ÌŒ60C*jÛF/çnKÔ»†Jþs|d3&ŸáXãø9YGZ`P¹d^CEÑXÉjKŽû®1,Q¯÷¾™p½×Æ\- ÜÎ,ÝY9¢õžê§5Œ*¶ ÿóa2bw2ƒw cÔ¯ŒŸIL·F®$ÛŸÄÑô’Îì†{Òa›œ£+¥t†t—[H¾­‡žºp³ÿ°ù*ۆdžS§êà¢B¶¶%§ŠHeÃR¥<Ò¬Þ{ª0Ù$qrማ‡ŽGØX+scF¶#  ~GRûðz9U©6lõl©§Š-:Bô?œkžÄóÚL:[îù>’CµÆÎØL‡J…“Ÿâ¤~FÛ¾JOänåx΀«þÈŠ…©&âÅ"”qÃB°â]ÁZ®?FÆ1WÝ‚P“0Äü&·€žE}’Яzs 8 ¥_í´é–¦©Îñ({zgE8†a±>¼ÈÜšôf£‰ãÝ{ºcýb¤U@ç ›„z\‡é] 1§Äì'å#Ø¡fûå½'ˆåÁÑ#™…ˆ:– –,1s™ýP"ÁŸ¸7ŸúT£ðæ[ÕÀ‘Q£Å«ÀøFØËÑu>&¥`;§)ÍT(ªÖ†ÔºˆåX¡ t׿â'ðŸ/Év»=BŽÃp}x6DŸ•g ÈO:Qeɵɦ4àç>2Ì6¥p¥W*ɤâAC½p¼ØÐBÛ¯ˆcá}\¾›ÉºO1i[|79“‘²mòéXXvT±õ-w@@êµq5iRcŽ{qB‚ý!ý‚ôÍäÈXéÓ2©§/l;/ãg4åÛxíº„ð‚Õ&¶+ôXIjqwª3?ÕpȇRµtpò׋f{¾È/°-çæ,X%ìgTnÄÑw/y¾jqõ?æ•{ˆ©/9@]bí¥!¾… öãŠSM+¶ÿ9æ»ß‹® µ8fþÌ 6g(öÐ\g„Ê X.xOˆ/¦d²PŸsÒ!¨4ÅÖZ¤Ï1µ1þàW¥åMGMŠÝS”}³^©­u#ŠO²ä-IØ`&O×ÖzGúÕêvÔ“ÃS)ñáð$£Dƒ&½qßÖÚKü!JBîÉv’Z …Õ€SEñmBîBn€³«eO MbQ¡eÑÈÏOñãŸ/$]‹nßvßü´ò¤µž2y!¡ØHÎ{‹K§ßNxŒ:-.Ý&kÜ]úµè]—¯½«åE_Ù¼uuÜ,­”úÅØÖ’»Ÿ¾'ã÷+D8 hFd³h.6^~¡Ã0#ú™Pñ÷iCUÀÀ„:¡‰œ šFù(,˜ÙUª¤Ÿ&dVC}*°=Ûz¨äõ4YŸëç—`cÕ[ä%º|} ùÍªéæ¦¿ÄY›xWaM™82ê!ÎáïìDw/Ê ,û2ëïsÒ#zUzb_·8&{‡'áÒ^ ÄŒS_¿Ò!´#ós®³1ß9Ny‰Ê[»¥7·„/·.P>Bº£d´tCÈfÈH¦W,c™ð?¥êó*i.ä’u P!ž™{v ë#t¡f}[ ¾ÇûAL›ë4®rB@ËòŒüøÅXÒëh%â2«Rì ™²åé­Ç½šì©ÑJgOm…WU,O›gÛÞ=õ¼rñàøktË®ÜæË…Áª©Nõ–Zº]Âëü³×§,®¡ŒãQ½[­DÀûMº•»ã–0üÒ$u`bòê§6ã~櫲š!JÞz*;9rú7U`î¡SS>mRïw%(öÞ†¿Ïw àÍ1•(°ý±ëѬ1g˜¿ÒŸ‚õ£‘†jñ¤þ{ßeôZMüOrgf=ƒ-wÓ}2Hù£÷8¤í«Ÿô!çR.Žt³sz¬?J-¤TyÒâ«£B1(ˆ× &9eRûÌŒÕê#ó\à\!v§Tg@K˜HvsDãsG öà&iU«Ý=½î3>üoãUY®dl/?²SÅ=†X/ž¼]•xTõúm÷Ÿõ¡í9[ÁŒý;ÁETÏd«,ز¥ça=‰RÈ}¸“Qî×âóÁ16hᡈ2:9¶ÐÔ¢GÉ ›Ž¶âjps¨&ãȾÍrg;.VO»lÞñ¬ášÑöesWE[‰É,–´_µ%爛 V¬žè!fWy¥MùÌÚc ŽÞ=Áž`‰'Åß#Js×ÞMI¿]†Ïa|éĽê‘ýnv”ÑSPY%蟖KåŽuìÁÒF8ÜÕ©•ú̧5ó:ƹ2™IwEJ±™Ÿ—ÉœŸð¹Ê)%;Ø@ëqÝ¥iƒ%ÌÍßuä3ü¾<²=¾ ~ƒ>ô²™”ÌNa“Ò¤”a}#K,6 ·{<óî¦ Üµ^dºo¹·þkæÆ6w¨ƒ¾‡Ò‰[N'²ûÆ ‡bý¶€EÜ‚µbçZ‡´­kÍ)÷Óä3öÜDJN÷U•ܾ¸M¦•rÜï­,¤,ÞÈz¸Ço6¿=væŸ`X{“ ßßr>ŸCL¸Í‹:)ް)´b"­lèá·ÁvÎ à†E7vó!óóLÁDý!›ÐÃ@0,ý¾n“ ¢ôaG‡Ž …uÄ]ªF?ózŽmÇrÏÈâž%ܹižE¶LyÁ¿Rm)W½&ýµ? QˆÈ¼NµO‘ÉÊÁ}ïMÌÚCQ€o‰¢|¾X±`¹¨IÍùÐÄgêÆdA€X{ÇOAdÄ*â^Œã!(zÿ ï êAýøš9—6¡ë° >« ù  ;Ø(fü¤Ú·Pº‡œÓÁî5§aU,Š™Z}Ãdž›ã=Ìös×¹ …¨ˆCžgØÛY9–Zïi¾?­øú ÊPDɦé¿Cÿ¤E,Ÿ ùË5@¶( nýÆïú†MîÉ¥Qçð0ú;ÉîÉ'-,ðq_½rÝÿb¾ŒÛag4šý¹YSnqõKꥩ~ëÄt””bÑÑd„<¾·f_ÛÉ=é]o¦ù{¢d^àˆØHèCÇðïc‹-p3)¥"D•ö4„âË;7`âçËni®æx€-Ä8ÌÚ˜G½|¡ü΃ÝCÐgé:Uµ0œÆÌcg3¢}‡ *¼ Eàý€lm‰»ÄeÕÑg›èÂët\zzÅ*w ó”)¤¤àÌöM©ôÚZ,ùzø]g¯îd"‹@ŽÑ—^ü~‡Úç» ¦˜Ítç,vˆøoU:ºòœk¨'¯o<àø }‘Šˆw¸Ô„ö›x'È| Þ>ä #»¸¥†vØqà6gEÑSjOš<×ÔrX¨£½¬Ö=‘Éòá2_¡5Ão#£™LA*pªÒt½h}Ë’Á½š1°q or¾ÒÅF½µqôf‡¹8òùÑvûDÖ8LœÎòüÊ”„-Q5Ñ ž’tLi§kÞ]›V’Ä"..ó¶Ò=7ä£9ª=¦{?ú f0s” 7º0’3‰’FYÐ/žeÖþ/ï{Œ²˜n–œ·’dnÖýÒ‹W>Dh×58å[,µ\˜hv@“£|KŒX„ö‰Í~ü†Ê¹ŸÛàkˆs¯VCÜÓz@ Ý€ö³"Ö­ ëžlv=}šÛB•<£)˜]¨jk#–uýO>Û¶Zó¹…û‘]rç;\85‚l÷?gkI±žÊ«Uõ³Â*ñ ›½¬U¡Öë‰'ÕyçÊ(1ü‡ÎÍ6×Ä9Šøìá{ÙJrÿPîyÎZU¸òø`ÞïHp75Éáúœ¤=-BOél}~™.‡t”£þD²a&úð§µ~}±¼pè‹mR- ! µáV`ä^´ŽZ™=sƈ.âû(>zÛ0§ÅJ~ôÉ1×”ƒ€Ý÷Ð-[Q!1²p.ç¨üÑáøNF9¸dPÒœ‚]y溱¦Áq ÍÐîy’BŠc)½_ú‘ŠÌÙlY¨«RݿܣžŒ[ ÷ù½©åLIš¹^gh€Ìe'V!yr‚>¿ Dšº+E(.]”–ñ®ÅCv|2Vf+…9ÍA¯Ç³ão™TDÀðz?¸‹-?ä?VˆË÷U8GÜ›÷®äJèãúUoƒÒÁ6ÅÀ¹;îXšµõÒ¢4õ€ƒ-[2_|.º&€òí °XûÊùRðÛÛ ëaw¾àïa#Øaº,Ôº7x³\ÝÜ÷œŠ3Vâ'Á·üì3˯ù2oS’û!N‰ƒûq¸Ý£mDÊ.Z;j³´¯ëÂdÏç.6¤»ºÒ*ZZ<¹ÞäwLä]î¦|}N" qooÉ6ÿRÈ9Ÿ ï¥/§/6G¾¢æf¬`¶Àpú üú²°ÓNÓpÀ|qøís`[ݽ0¤/W’„¦…—²—oDE)‘™¬ù}k¾¶ß^מ¤Ç€uðÍɘìy399ùjû¸«¾ýŽˆáÒêÕo:ÔcßA+¢N[ßsДâèorÅB…*‘¼mA†(«|/@!=£\Jܹ#:ƒ½Ð±³ƒéòU%ì± [⛳åĹ¥Äù³ÉÅü= j+¡Nm›{õ;Áø'˜¬D¸>væ|`Û ,…¦pÒ¶ý;_ )þ/gI¼ZgjhF;¶C\Qjê(‡©â¬¾Ã¼í¤gB˜†a°/±)wÝk«úŠ Ã ñÄ »³‘·SGåÔħ½ÐX²9±q¶/Ä ,,ÜrZ-0_Êo"¡*:Ò th¾c8ÄÇ=i&óù) Ž^ÔÂ%ÕXN¾æ´™(L¦'Ÿ"¢¡vò•Hæ¸$!_v¤!=J|×ðR¹óãxÛVŠüÉi`áOì(5­ ÖɃ¯CÁÆë… eø…"'±†kA¼¨SF>kú}Ùns±èƒ69ö‰ÀrM·›5µÁ³f¿Ä§{_¼iBhµŠ™XÒp‹ñ7ívC¹Dà+teÑBsµöò*'q«¸Ù…ß*XÌ?¸ÄÙbÊÝ¡ž‰)ôMŸ*Í´6ìÈøÒê>0•1'ådŠZ·wõkP‡Š@Kϵ"Ï0î»lºßj«lŒ#÷[[n%ŠtS%Hòivc‚·ˆòži PG>çdŸEÅŽ¦aæ"¨ô³ø_|-AÌT÷Nc/äçÌØ¾n dL¶þÂHª¢úPNnv©i÷{&qž¢Q†Oz¾½Í“+8¹R£u®— Vf¿öö‰Yb¥ìK=ãhŠý6ÜñV—ݨf~’£ƒAž3Ä13‚¬†CãÆôÀ.œžFXS¿§G>|tV´ËœFåö"øš>ö7–Šehr¾cØ‚7é†Lý.Ä%\Ö™ÔŽVeBrã{½Å»ï[=äyÈPד?kÝ8ާUcœLƒyoZܳ-@Å@-ݶâÇ‘z¦7¢b¨ º|Æm‘H‚h«–Á„¶D?æ#†‡p`/;‡šˆ-—•c,f>yL¤™Bß±>?c0ÁĨUá±êCi¢·ÝW @Ųxw³v»¯F˜·™×¨.f͇pƒœ‚MF¦œ>à/Z6¬˜3™ÄFöêp½[L–Ñ„•2dá ¥·OVñY_"¦FÊLª|FuÜÚ)9·T±¼Êûsk”Røƒ¾”e†¢Y%Ký[Q¤=ªïs¯1.¤"Ñ‘ÛSôaж’Wñ—9ükûé¹4¤1nuO Ò>ŸC\‰¡1ÌQ2ìåxl²·ª Ï.~;âH,£÷¶ONVÔ˜{-óL.ê9“JØO@b¼'õÅÕUàÏ @øvmqnBŠY4Ôwg{åmÃ9¦™·˜ßL31oÉ"O-‚ËÞ;H­€¯U8drHtØròø³Tå³üˈu—Hv$ö¨ÙêrÛ žø®+(C.±Á†¬†³Èö‡šÞ?iǬˆë¾¿9l³3:P«fëz[ñ ç››cêЫ' eÍ;£#â Ç8›h¨æ}ky <Æ¥‡±ê™"à0Ú;¯½16ßlâ' ‡uà';Ä#l™õ§°ÐávéŒ0Û_&ŸÂ{ÆKÕÑ“i)^Ç’ Ì«& ¶¨ïÎîlË‹Ø(ÏÆ Ùšäæíóºßpu"9±Á¾Ï©Â÷ê)í7#|©j˜ nX–TÛ^°æœkIN×°*åMð2šÐuß!ãX,Œ/Ó^n2ñŸälá»^"Û´õ=  qÏJ«|~²©€šM’êd±+cϧ´×¬SDƒ[“Ôh°s)À·\7 )üj%äºÃœ9'!Ñ„Y+?$•ë$B[4kõÔ¿³Õ¬Ãµe±tÆ:%ÊÉš•2]QCB+Umt2Qéß°íª­Éjæ^tµ]U×Ë)òyƵáu»#00ÜÔQ¨÷sÜ>写Ò]„¨Á¨Aí'<„0 [¨œÏô‘ml8~â¤xŠÀtù'Öâæ}¼Šë)nøEóѤ#¬£°…Ñ7gi‹ âHU NÓdpíРňq ùS¢qŠê>×ôØÌ’u3â,Z·Œ•¿ÄYðsãç ákQSY^µ@›¤$N’.RÑ(˜L9g+¶kV‘`“j7 (ôžyY°G«Ép'=»¡ÿ%z1îæLœ´çDŽ£]ìŠ9É’†zçzª êÉò¡wüÇ-Öû°!JFž7¸½oé±Q´·lÇEpµ¼ªVðaîU\‚ ÄÙsBOÇ-¤Æ»%¼‚ÁB&Èo¯‚˜2ÁÆ`ñÎÂ`Ä^GL"IÈ`/pL¦RõÍL¾#=Àc*™!k~ðO  ˆ7ðvÆ*¼ÃmÑ[~ÕD%Vž«¹­zEmdïQ¼x>¾oâl2ר1MÎj:|·äÛþMÒ“ü]õù¤Ù·^Þï¦åÌç(7‡ÜVv*ÃØW»wrñÉ!7}Îl«îÔ=—ÏßÝú†~–À©o†œ=«%´þ°²"BM¡4$o ñ,…’mµ»” ä<.ù°K‚œ´Ø–ŠÙ$sçT)#>˜û躎ôúgç{O »‘JÞ´ 3Á,ÖhM¡9*ш—©ÎîBŸ#Šæ=V·­Y A¤o7!̶uw4¨Xw¾Ý$aÎOLÚÞfîe°w±îœW¼u‚Ú«„˜+Œ6ïaÕ3díýE˜×>ˆê5P™ç˜aLêKÜÁ¶æ¸ÚëuôÝ|ÓZwoÆýjÚl6É ‹¤ DtHy*žÌ9ÌÆÆÚTBG×(E>¤•)†Tëîˆyƒ1™3EâÇ"p†ã©À¤Å)ò‹´°µ' aØæªV«¯‰›dî¬Ñ}5Ѷ ¾8ÅT™Ú{˘.¬«GK ˆ³ ÌÃü™u™^!kó¹¥… ½ٹиÏén$Pv<ögë¾kk=ÈD¿ù=w6`ç-ö`EiŪ§E¦_.…8ΘQ“¹"W¶ˆ ¦›Ð ›àu|‡ŠæûeÊmKA” ë̉o.B)×;»Õ”¸îåÕ`yžîu:ôÓ×#…4]Ô–,â4ñÍéƒ~òe£_ŠCr‹±‰ì–4ØÔeñÞ ‰]I»] `6Õô%J3*½REžø‡b"¾V<:C—KØ^;SÈ(¨Pëˆw Ká;ƒ¾T`œÉ‹Ùðóο‘¡OÝÅ£žÉiö:+ë µÒð‹W0¬Ç’¯#yàâ/ŸÈÚ„¢g²§Í›‰ªhÇYÞ_Å| ]JT»ù鎊ÂÞŽÑë¼:6p÷R•„'ACûøB¦ç¬:‚gRô4˜æ¡3Œ§yvCŸ¦ qþN#“¦xkd—Êú²çž1ãG²w—JÙ”o]ýþPT¾ú¼æÍ¬˜%lñ‡Io”œž7¨;w­áÚÁ h×íÝ VT Õ¿øùp˜£šÆ…}öçÍAŸõ­§°²ÂvâÚò°Ê*,Pf“:›àèË}u&—ƒ#.uy ÆŒ€iwÕźxû-†GªñÕæXG¸ˆb¶ËÉ6¤Œ×ÙÀŒýþs&»ý~évá"3/ù‹p³ìPž%gï'˜žúø¢¢ÌÅ‘IÔèA6‹6W¦bEã cô(뺦ãòî?¨t©hØÔb)x±c¯§øÜì™×ïg#ŒÍªÅG=B˜…÷­}px8•O䨂¼2-õ›m´ç÷w½)9Wòcg ŽÄ?îG´%þ—#ÝO!î³|>8‘oíñ…v8¢3ã?ˆl=·~õÜ?hNÙ«mç<“¹IåWéXXÝÕÄ}í¢}ö‚»‚Ï1ÆœüòØ•ø(²©äH•KCûùs4²mE‹>Û´‘äGUÂâïìz¼lš=e;ç€!RÿʰCRÛÈES4;”ÔQº§íµ)¥ì¸ü$ª¯«WÇZÊa,¶£$·äa†ãmM¶&¢ãôÛã¡§à»Ñ©U§p.),…9׬‚÷&)ÌÉÒtu4M^oÐíI¼öîÍGpÄIç""2ó›'!§4ìX­mÁ t5¹éeC?^‚­~GϨþê껣ôy?Ñ’ÓŠ–úåˆ* Ï×|ÌÇAˆœUæ¨Ò]ù²Nd6q!åbQ Ÿµ¶¸øý1¶%òþ;ZTS¼ïâò¨\Wœs¤/±˜‰2KÚÛ>äx‘ÝYªO|¤"ƒ HéTäå!) ú]ó1Õpíîõ)\ì±>Ð:rD®B¢Æ„’•ß$yü°åË5«û1|u-3Åu FS§ôù ­Díý@g ôuw’Ë’žfN íÈù¹ÜV"·{qZµdE)ß·’Íÿñëªk-êþŒÌ­4“\~±ˆ¡eXo¬¯›Øã‡z)7Žíöø$CT5u!§‹ñ&scšTøÞy·ØéøÿÂÃìêÀwJƒ0;‡£ƒh¡BÖ%¨Y´¿ë æ™s{úùæ A·NžÁ(È›fY_ꢤŒFˆø$3oû«9[~öøhÞlï4ÎýÃ0ÝËRý2*otªüŽÉVŠØ$û´ó#åºx–S.¦(å†ÇÕiöcFL¿À÷c×€’R$˜nMð|C*¼áÖ÷Ü'KÓ#¸eÇrÆæ+_lV‹G!&ý4©T«mòÙLÜv½ü1Ô£ë’h»)J‡rÌåRd §l9Ñ®  q¢Ø¾#»e}Þ8oèp‚+†l¥ò»ÝþjµÅǃÛ_¤{c!mÚ’^è51`|¸TAèVÍëéù¢h×WUâ»A}J\°[»ã‰®E _1k:¾1ÌrtíG§¶öä·‡Ë8ݧ4#Žhã¨Ïò\›í>ëâÖ1®ï~!kìó²KÏ‹‚6EÐü›s@o=1yÖ™ÅÁ‰#ÐÚ´× e‡É«¤c  mœlGÐ(ó|ãhgk²z÷ŒQ¼‚”ëáo˜;á­³¤q†Š6žÅÆíGON"Êñ}P8lŠ·ºÄ®;ÒšDÌhøá¡~~D—Î_çN¿|ù[¯¬¡ï­EѦõ º{Ý(ÆL.s¢ï’*Qåá1MaJ4¼ëYWµŠ´¦3?_R³!ÇñA \HÍ/‘ ¸éVäj*÷[rlÜZ­¢èf?¾Ýä“ú}KÝÌv”ðÞÀqå7žou·:C8°}Ò™õ —y-¨µ¤KŸæìd™4%»µF Ó5ZX ;Õ/Ÿ4×ko…I7ÊóÚ\» œZŒÃ÷Åw¡h¸¹YYD1MŽ­Žè9Çå97¾ÆÎ «—Uʽ/.¹ºÇݲ;ÛBŒ¦’i\ðS·w³ìy%ž„Y˜¤½ã$ùÀl MrÙ(Aƒ&C¼mŸ[,ßgòÓü ~«»ATêçOˆCÄ|CŒ÷YE°”XÓÃN¦èæOèÒ¾0!Tt.Yå¾|¯,¦Ð̵u4)ÞáZµ@[燀_¯qèú‰çh14 •Íùd¾¸ÿÔüÓ“?¡žn"yªI…·˜üGIƒäµ­.[æÓL¦5Ò3v0ÄÜX8ÒÞ;{&+±ï‘h(¤c[À p˜HºÛ‚&W?²µŸ$åôòLÙù…C5`†_Òà'F›ºó¹mm?¾sµ8ð‰˜Ry+Ì$3‚3XOe¤Û–eŽ%"–ÅŠçW¿³5fÊÉÙY¹‰Ä7G*ã|Gnýæ¥T›§gF!K[6¯ËÑ"-É%Ç©wØVŸÓ>ä¦Vÿ)«ƒ6IÄySÊúßÿÅH3)5$à錡æbËû Hw@p¨žÔì[G»éR ÂØAeþe¯æFñb¸¼!ÝVöXN¼&Ôädù²h±!ñ¨FØ~ùþï–Ó*8’±e|2}ñ’dt2ŽÌs¡òGˆ§“¡¼ §íÛ…ko™üËÝùu3²ÍƒœþÛ¬ y„ï"î êÒ8¼‘Qqu›Í(²{bý¯e¦ú ]róHo)Mßâ%`©¨xãÄéÉÌ=&3!6òŽþÁY9¤ÿ˧dâ|GñÄ墡j‘Ä'ü½‹sü`÷eÉãžh–§¸ ÝuRÏ׆¨[T ù=2Áþ†Á?uîÜ ’û>Sw$•Â]á6UáèíAc Ì•áMFl›¾ºŠ_:>½ˆ.œÛ œtÜag|ԼʃüšÒWýi¸÷+×\©,2¾•½:‚üîÑð÷=ê6ñŒ‰ ¥%ôíMÖ·-¸Zæ<¸»psx«_ßCZ:­õ¤5˜%ÀûEcw6^±ÿ¯z…ç+”tP÷¶í·Ä¿€gdgÁyb¥Bmbΰ:eñí‚«väÁ1ÌMc´Ølºéƒ›ø^#ºÿ˜Q«ÎÝ(›—¿ú“¤ÆL8w©©j‰zϲÒ¾¯ú‚.˜½šÓÓslŸ-å‹ ÄÒ‚|u`Ò¼¥°½¿Ì‚CŒOQ-!è»$Üäc£-w¨‡?Fw¶““Ç’´˜„)2k!L€éKŸ9pCÅhîªQY_™†W÷¡µÐzDlتp¨›£RáŒJ¨(éŸÀÁÕ86ÂA™Éñ¶°Žlª4½Ñ Ù}‚*W¹ÚšS_ÑYe±\ÙK4oƒ'ñ¢ÝÚë#tiª²øibÛ@©=±„™éƒ7v#VþcÞMЬÃ0»'õ·2bc :gâr~§ç*Ðtâ@îÇõñm7õ2XÃÌÝܶ‰rz#ƒq€V:ž³» ÎÌ„êç̆è´àÎÞ*Ëh@0S9© “aȺs QEÝ÷“múÌ p—©ðÒÛš -ó—<™¹Žø¬~£èµÈÑBœrbtçnåâß’öñ13‚Ugª}’s†#=ì Õ›÷€ñ2ûn5Y ·I¼õ„f\µÉ9Kççñt‘Û³´ÂXЇM¸…·ÇÖ=#›² “[—÷mý]rèÜerôò|ŽËä)o±îuk½‘Бj8èÌÛcÄ›ë|‰~-ösÞ§7üU•þÊM5Áð¡¤;IuQüKšµ¾Œå·‰I/¹ÌLÁ7oYQÑE6ŽtAô<&ú#|ª˜žìÔ_©‡¤àö| k1§ˆX¿*.°ì¥5‘‘„Âðúð@‡ÿMtmõyNóÙË Ææ(Ž4µè”X¤oŽÖ(cÉ2bõ¶ªCÚĈÓ%s¼COv?o¯ÀÏç$®¸yn<¨(F¯¾Þ)Xû¹ =g§Eª²ŸÉK‘®ÿ¶¨2|0êÞK“*+[¦>òÅ|¤Ÿ«~Œ5;jù¾žaÝÀ—fÖƒoòÖ(›Ô‚cBhéxƒÊO©enKöiUÌy$mÏA~ÔC6a¢ôXÄ ô¿ãËîö§­ÛoŒ3-ä¶Û(z™X5FiéÉNÖ‘4j)ÆÔî²³›ñçI·#Ýf@~‚Écû:‚ÀráÐ~- {²øEh7“*>Ãþ·ê)£¨.½_V™HžTm@w[Ðì{2˜ûò.ž‘)úg„ö\ßó½Fμ*Ú0„³Q ýÝxœ:ÔKsÚĘa2»³Þòªh—cU˜Lêlpþ¼l‚ÙÇ ¾ª= K£l`ßÙY´ew¸ùÚ¯›RºÈôÞ¿&n±ÚB»¤Úš-(ótœµ'fxÔ´DÓƒ1 (YmD}í%Jå*Ùöâ¶ÀÉIèùò˜ža‘ômc›½ÕÜï§gûE.Ø@A©Éqxtyñ1_Ý}@£WŸÖ¯ÏgÂÀf1Í¿\“•KªŸÕ¾HKÕ2îxfªÃÊ}I`©Óƒù‚ÕKü]Ñøn`SX\~Þ²¹í°"ϹÜÈû°›CûŸx~bmQŽ-¼Úcâb‘ê·SVˆkÑææw ttKUÝ¼ç¼Ø¢KƹeýæÅR\gÞ,ZEñ)‘tü渡z2À#ìê8N-ýP쌀‡^챕øp¦« rDBha=ùªa~*;Ñùƒ=¸¯‘•GK½”L ÊÞ#¤õº×}_BHJ8i2˜QÔù —Ë`–t f"/@DWêÔ¿<9›u'÷s4}íâ?©hÒuÍõæp˜V ¨ÓVp1O:S žòû¬* cã[ìɃM(L–C’Fo™«ÚeE® ÓUñ¹é(ú§éHC‹¼p§ÚÜó,ÞviêÛ®2ô‰ÿò–ÁŒ—;·~….誱óyeÜxVnæ®­¦6 .*øå…%iøåãÇ·BUBïçÛ­S°÷œ!ùC®ÛþŒ7–€×6ÔM»x;3ÅÆÁÝd–ޱúºXʾä—:Q$ûñ©nZ*T˜It×!“‚TÐ$†Vé°ïQ¦×œ09ÃKZ-âE¦÷ÅzFêM™4@(»+YÉwÖ,À¼gµaøäFT^¡öjDBnßYCæþíw.˜Rù4ÆeŽ®âIÆO® ŠŸ­qôº@ãíœÂÃãÐÛÀ˜·‚˜¸1ê£uhnýâ •ë2Q‹è'Û¢Lˆh öœ-õ¦\#ð 4£cˆÇªy¼Mâ¿Q߈p½mãÁm¾4àÏúèc`=fXÔ,ò4¨÷±‹о;üx*VÊ_â??„¬ˆ¦îû#YŸÊ¬¦‡TeXPͼª·Ï[Ç\³wÞ¼‘*±£¢Q+§ËÌ4/FáB í¡mÛõèj*ˆMÂ(P^Ûôq»;ü&ç9 :2/¤­ùÔÎi- «<û8]@±œ çlü£Â·› {i¨ƒºá#‡W[àa‡B"°ÁÅZh¼Á§€å^c]YyÓÄ^œ|P4п‚÷„9zÅܦvŽï_3Ðq:ŒŒ´Á)#k9²/`º†ìNùõðQ0oŒOÖgcp=‹t>O×YìÖ!oû zBRFª¤™@µÜ^?ãËðÓ²I¢Ï²ã¦4AU–×qò•0Ð3a-Ú?Å ûYÝ…TþS H+²S8´2eÒ áœÙ™ܤ°×æ³¾Æßº…hý¯ ¡»4v uƒ¥ \ ¥}tòó{ì¶ÅOön•ý^“/̲LÄOž"­¤â¿(ù‡8ÆåÍÚäž'0.òno±î)œ0}ªüp3S\¼ècíØ¯C2ëRWn²2íA°÷£Qðµrÿ´ÓEõx½Öt)òÇ0³Éà:Àœ*€IHri†#é1×Õ„îtÛ²`[Ìñt Ú£&&i!Ê›¦jˬøçiö™=ª„s–Å%Àט#ÛE6&,ø.e†›ÉÀl³n›|2ÃbÊ¿azA8ñm˜†í´fE¯{jmŽ5¦÷å0åpsK·k¨r’q•Š0¸•kD7Ç[¦Z[Æ<Ïé¢LÁÙ¦á‚ãF½¬@oAUA5oô"àu\x ||…Ãúyê½Åq'x,IéÎy±¡oô˪Óp»æ+?pÝH‡î‰ÐU-Oñ‘ýÃ/3•è L?‡=÷*…,d†i¥ÅnW)fænY€1¦y“X™Ýµ8K"}ä¡î¿a¦ê?,Çp2‚Œú¶{ëîŒÝ”døJÁøÉ\.Rx[އ›S÷j(&­¢,Aá¬Õ_ÖEØíE- ›7»…p6­'oÛ’u»_]cMM[£°ÌÆþ¬DÚÏÏÙäÑ~àGóø`†n— ›;ä6x# ”ïØOb³¦4Ý‘“Ø=¿ú·žø~¾_|v)RBĺ·Œ÷;s;—Ö r|îãéZr7ÞGÕÄâ­åMî;Ì[ÀÒÍæU’L¡Å÷UÊìG2Ÿ¤6æû3´ÿIÑ·¯91·Žšï»wVÿs«ñ^u1SÒ2¨-ã`š«ÖØ(|“ú¬˃ò›eúæý¥•ÿãÇaì+tõV~»àÍP'¯r•–‘¿IßÌÄÇ Ëb;³ä DN™ -ÃÃO‹÷Ä$ÄËñ.Ï„Þ9Çò»šûa ó—l¢J5ƒšÄû&ú}œ$/Ý];4Á&cíG¿.ÞNPþX ñ Ó:`ùÇ_ùG·]]p¼1ñ°äDšÏx˜ˆÔYÐÚÚ¿Ñçã.¯ïÏá™gKm¯ ¥<Þå̇DT&üâ‡P¦j§¦9åçàV*=½ç!vúr)X±[il’ÇOAØÑY:ŸŒ‡¬˜{ÔkŸKìšß‹õ\Œ¥b¹¶É[øÎP@(1Õ„‰¶ý»©Š6Õ³QÁ]™§,£±s;ƒâøMiÓaÜßÒ ¥—*„˜”ŸÈ€jt€¿‡#ÃÖyT¶)€·n™ðFð ÿ6ÁoƒèŒÄl=}kI„¢žh#›¡‚;Krˆ-¬X&- ) ¾„ÓH7´+Š:“1[^)f»lÍeÙc ­G=ÐtgÏ}vo n÷îcjÙiú·ñÐ J78oÏnÄ[gE6:W2Ò4Ñ;éZœ83 Þò3lŠ·Ÿ¤&Är_I{¥wŠ˜SïñƒÝŠ>mÕ¥ì·'!”/üxênA[¸ŠævcÓ'þt§ë„{ÕH=·Ëº76ºc­_$oR'ó—=·ÙA¬ÆEïÁ¦7eÆ ÈÜ&Š:(ôfX}E@oO´xwbNù»ÅüÊôé´ÿˆ5ylöFà«SpKjÆš¦æëÙwà,ãåA› vTø³ÕØaªgG4«4"]W,ei|ô ‘®‡ñÚºXÅîHª‹^ø½îY ƒ*;Ò.¤Ü…©1 <´µäà;+‘Û…°!¶Góû§Qå²oÓÁ!Ð*æ‚`ån§ SYbOÍü4½60óíQÇ ÀXÓ_ßÔÞµQ0ó*¬fLl‰¶üÑ…“I32”"cAjÁ–Ö#gáîzC¡‰Àª²pAÖ‰"z$ xàÉ|VòBñcL£Ðئ!3.Gkl3 /'%ÃþêHù§.t¨tÌDDÉ÷ˆ K«t™,M÷y{ÛÐPñÍŽóeœ Qg‡ A‡ Ë {ê2•^4ä×ÐêdIfÇ9%_]„Rn’ÚûUšÖ:åZã¬ði–B³•Í_é`prÂt—~£°ÉR#~!ãJá9zd“”Œj±Îémx¶ó¦eY1TvsZük‹W²_#K©<™n(+É›zÙÑIs K÷M8æ¡:9äù‹z™­~øÐVJoðø,Vm?Dðµ oLû¥ä§å&‰ð¯ˆnˆ$¾3Œ),ÒWË&iä¾ÐwÒ°=gú6€í€‰‹\ê8P”`úÀn†;_ÛúÈÔ¸gݹ‚‘àHÎÂFhG\fŸÆOºr>6ßcÖË–Ï!ˆ*êI*µùïë‚Ñõö@~{ké hÞòOX òFõ:÷Y™ß|eÞϦ£Ý€‚¡"JΞ®;‰3Ò]b®û¬OÜ·A]kz@Í¡º1w—^/£õeEÓcòç­½pÏ#ðYµ×ñ>L{T#¬ºh ¾n×aD"°-ºÐ%Ì!²>dË`[ï8{ÊsrãÏæHN8]»Ä¥Cœ>q1wY æÉèÐg="m-Ô–^N¹5KâZ¢.ž@øYs‚ƾd›ÊÀ#wº8ÕéQI{¶Æ &[}¾­ÿìnÉ—¬p ÈtôÈ o‘·ö½t?CïQán¼À€<™0wOI'E9^6çlù$qìHr=rû ¨¾EÔ †;<َ•åësà Øu30¯Ü´œ'e÷UÙñ3.Õï$ŸéÓ¢uäpÔ†ŸígåDÂÙ„F¶Ín˜“+ŸiuÛà6!-Ä 2ÓŽì —“"-ŸŠÞÕv5ë(?ÙÂX=d•ÿ K±¾T\W´5Sß\1«Ux­œ> endstream endobj 5343 0 obj << /Length1 1386 /Length2 6039 /Length3 0 /Length 6990 /Filter /FlateDecode >> stream xÚxTSÛº5Ò¤#H7 ½& ½wÞAjHB‚$t^¥7éJé]©Ò¤(]zQA^ôxî½çþÿìõ}ókk͹÷ád30T‚¢`ê($F$”¨è[‚€ PT!áä4c°¿í$œf04…”þ„Š ŒÁÚTÁ,P…ÜóD@¢¸4HBˆRQÒU° ÐÜC!ahN”»¯ÜɃ­ó÷%€ IIIü(¹Á<à0  Æ8Ãܰ!`ÀÃ0¾ÿHÁ#ëŒÁ¸K {{{ ÝÐB('y^€7ã 0‚¡a^0(à×È=°ìÏhB$œg8ú/‡1Êã ö€°C¢±!žH(Ì€­0ÖÒè»Ãuþþl$úWº?Ñ¿Á‘¿ƒÁÊÍŒô…#Žp  ¯®#„ñÁÀHè/ FaãÁ^`8ì€ün PW2€±þ™ ñ€»cÐBh8â׌¿Ò`·Y UA¹¹Á4ɯþTá0vß}…ÿ®+åôÿ{åGBõt6EÂx´Tÿ`°&’Ûœ`€PJ\\ €=À| ο ˜øºÃ~;›±3ú»£ÜŽØ1`pGö‡Ä ö‚0ž°@ÿÿtüsE pàs‚#Iþk†9þµÆž¿Ü`ÄÒþúüëÊË0( ‰ðý7ü÷ ›ªiÝ·4çÿ3ò¿œÊÊ(€¿ ˆ@PJ@â 1@à?ó€áúøX-¤# õW»Ø}ú»e¯?àù#^À?sé¡°Ì…xþMtk ‚ýýŸéþ;äÿÇò_YþW¢ÿwGêžÄo?Ï_€ÿÇvƒ#|ÿ °ÌõÄ`U ‹ÂjùßPsØ_ÒÕ…AážnÿíÕ€±jPB:a-º+¼û—ŽV‡ûÀ p Äù/Öüe7ý¥7 3@¡á¿î0Ø( ð¿|X‘A\±w4–š¿]0¬†þYW AA‰MDLöðû’`Ï»øƒ°ª„Â|~“ ,„Da°!ìŒG”ɯƒƒÑØ™áhWì98ÿr’ü£ÄÓë¶ßLÀVÿ{ý[Ú0˜ B2?‹‚È„»¼ï8¯UbòüæPæ¬âœgîÕˆ" zñéXõ]ï¯t§Q¥eg–:¸ Mq„ÃDm¿LПÛÇg'ƒDlÒå’ƒŸž*‹ XÝGÍ.dÓ4Œœ4Zxzl.Ëž#w„NžöÃ+-n§"7Z^w ÷Dí£8¾²ÐN…$Ytfo÷m%7k‰¾¥2ãSÇÔi¿CuÛñ&æ'Näã´wiÈÜW”š›`O4¥(4¡zg¢³Ž“©Gl)¡ð†ô {x1¢²)Q¬MåãmŒ©ÕX§ã¸…È£çcÓñ7RÕ™ÌݵwÛF½=÷”UÔÜsR¢«ÕºÁ\Rþø¤ÑfAªd'’Ôdà‰ÆP‘Y¤޳cÉBA{®hÛŠãQK,Uýw ÷ýÓ^æ4muÌÂ÷ý gxÅ¡ê’?¼ D?|¶Ðí«„ê®ûúp{ÝÆü“j¨n+A´åݥңȪ"ËÄ™7Ejû:—"«v"­7ª[ËQšéþ$ [>S 7‡¶¸»;<ÚQdç§ßÍõn³e«¥–ìfµ&NãÿàJ[ÍDÜV¿¢³Ò¡Â5r=gUÏw8(©äB©œÛJŠß÷ð…3{9Î ÂøÇésu·woמ!˜!|‹Ñì_«mƒŒª¾ØT¸E®Q¾…—†kWèM%°i݈{1ýâÇ:ý‰ÕO;Ì´¹LV÷›ƒÌAOEž;¾7¥4Ó7LŸäú¬žœ‚E?«—!ðÒ»Ž$}𫘟MaR4Í•ÊzªWdêÙÌ'~’©´ ß 3CÕ?~ïÕ–¿“¢ÐSŸv[&-·Nn䃼@øÀjie—5{å·¦ôì[“F»×½ŒTÒçŠñs UIȧíòéFr):]©éâëJZ綸õYÞóÙ4%P­!M?WÈ™h˜Ï$ÖØ¡ãaS­zGí±òQ4cé×QËšŽÂ]á¯W‰ãV…­?æX[t8õ ·³4Ã"S©e ¸î=yä•<#0ÀÑÀîlZª«p\¿­°œêÎ7.áEþî–Ü{:pUƒ"Uñ™^Š˜í¾hzŒÉçzIǶH£¯aITX«>oxYPbúË'yq¸é³ï)F~OiŽŽ7ý£&l©T?Ë®ùge­(§lÍ~90ŸqäV9ò]\©µ|>ý\ÑÂ*™Z‡d”xÀÆðåšvôÅ]W}¹[»?+gM)e Pjo}qÅ}›ÅG.AôÏj`çì{óØÜÆ´5ª=ÔöG3WÜç£C*IDzâZ3º•+<ü•pÒÊŠ-o6›Éç¾`0ÙîrÕ×ù‰úeºNcöB™Äô O[ã%±Ã,qe9ª÷E^È÷Y&«DÕY‰uãì“gå46£‚AþÑ“CŠÓü˜³áä×.Ë!à1wäÐûÕ†éO3þdzå¡8{Μèo›ûùœÖwËzÏèB×>W™-¬ †uƒË³mŽ7fHqw0…ˆÔLgJñä+ýh¯»R£Í7õRIÆ[<ƒ]6C÷3âWILg­âg¯dŠëïglt¬yͱJ¹’úR%Ð5j¦øºË0ª½[¤º0ì‚r'¤÷Âmª>æ8øi¨(°s†À>{³mÔeŒŠÇlp|in•¾ê|Ë;Ô™ vgn£Ê]Õû¹›I°µ‰ôµŽ0S?€ó !0j¾›)nîÃ-R·‘ˆšûŒ}E:ä’ã/çã!#G㨛ó¸U±9:šÅoÛ´?5åófž>Èç÷bé›Þ?Ú^\s„ÆN÷MÜ¥½ b=!ÚŒà’‰û8w¼nâ´c\6ôŒªð±Î‚Ÿ†'Ì2,¢ïÌUϼÑòå®úœì†r`}Ʀkýû^Â%£]ž…™q[‘9NJ ®ÒÅåŽ[x;NÜÅ&"À- 5ýz§ü.ƒáç6ÚêðBß<š€ÔįÛÔ{ü“ž°ö¥©5BÞ¾˜ÇKÑØ~'\}ÊB·™‹À»Ð„eGΨ4lzé}]g×$-Ù!ûJXoÓ*Tº•ô2.?`½–g­Õlæ`)V£¬ !ªíÈd~ÓoÑ£ÀnW?wÅÝ‘H ]@ O7}oz]䃟ð‡ú¦y¿)Þûá­1ª×Xî R|[ªíº7Å2Þ7þÞr¤4¸UE]ÿz™a®Ei-­õU'ÑU7¦yYh…câƒÓ-b‰0ˆákxƒ•'–8–táx».Dѳžk‚x%ˆÊáìñ½{¡@–¹Ÿ! •½f ðnjê¿£uÉþ€îbyè•‹¯Iv|Ho£™Ûà—ÇË Jß8© 3$%ïͽl˾&åw½ý³I´Êbpæa[rfäõR ßîc©¸ñ­G…(—Ó]íS—Â6!b‚Ñs~Píì‹Ò^­„ªÎžá}<ѳ&A$ê¸ã°“[v²s‰&¸>'+‰ãS»óuð •áo£R!ÏñOØÏ‰m"šï)ª gúºKì[A½!»£Å£Õ¨CÉÄ~moC§ñî¹| [òP¡ÙØè¼±ží:R³˜‡Ç¯¯.ÎÝÈn"Àcd6œ7w„ØKì“ÚËíž6Ùƒ×Ü_žö'°¢SpÅ|…,Âñ˜§FŸó|a.2)ÜÅ)9…‚´ Š\++ßĺ| ª,"bBýnUhMïEëœÅ3Æ¢QŒ–/°¯ë©þô˜~«Ô;ÏXÂT悔 Mqw¯Qç«,;©[ÌôÚóП†Ž!%7žQMá9J…ñÕ0íXHŸt­ËvdKó.ê°8âŽÆÓöJ¥pS\døYüiÛQļ J)N½µÚ|[!Ú=¸ïÍš¸ýæï½QbYà%F~=¿Q?cÒ‘FÕ›•ô^gl‰üÞöÞ᦭*¼ìÒªd_-›÷¡E¤‡íàæ¢iÔ÷€œŒ;ßÄÌ·'Mc·„ž]LÈ]ÅecßgzÄô z 6ÐÙR¥¬ kŸSùHXøÜ•‚j^ɸTŠˆQ© …JäœÌ¦ìeÔ4>žc¦ ÚV/cbje`Œr—Ûbq…Ø™½a¤ÎŒ ÝäÁO`k³nî‡_ïE¡këV2B®ìö·”¦‚DKW i7»•YÍŽrìK©µÑ%¹È‘<²QTnäù{_¯±£=+Vÿê4Ý]7O9kc-gG©¬’z¹óÁ‹ñýŠÛK/'ï6ƲF=Kšø znàHÿ–¸êH`Ö¸¿@üxµã:óg¥VÉ_yÙ"íh¬ûë¸;ÈçLƒãª€)¼xk\(°°uìÆ›´æ²[Æ»ÔG³Ò µuÙÉ¡rôÕ¯Ùn]»Í7ÒY!D ¼îMÐc$ÙÆ£8?ÿ(Û Òҩثǥåö8ÿãSy ¶×né°ƒaÅ1¹ùû”™ŠæÆyžä[×[3É×e}Ïsõ<ÉÀi„[ÅeýB%{¸½†â¾h„È ÊW%-›(Þ[ºçAMÆE_®,3摌¡ñY‰3\e|¶ ,ƒÉÜEŠú ®æ¡Ù¥±þgϺX'wk©¯¶æ+øÓ äÕÁM²…}¹ÝvвY¦›!Rîlv]¸¥† 'kÜ%z9 {Ë×3åÉqûËF_ºØ4P#D-äïú)Ì«îËéG\ët@’±Äû?¸å`É#Ï>/É·ñ¨khÔµÌWôµ{Žó|£¹ÚC–¨ê½Òznó,˜´“)‰vúÄ_-…v¸¸÷‘wÈ<Ãr•­Ùòº3#&÷ÔÏ•ÃÕ•Ãæîv -þ>ı¥ð{ e» ¾y†âáÈÑѼÓÇî·†5OR ¿dÅà;,—Ñ »]kAˆÛáª\âÍ8]ÃvîÓn>ºËÁ&ׇY¦™8×Ca"…r7Þü‘qÇãÖšÝôå•¢sß;<«5öœ þL”¥l†¬¹Â@.ô’Oë±ãºr%Ռǣ=µ¥=+Ìä‚“¾6s¼áSŽï/än2~ }—«°U…ðRÚˆV0foÍ0Ïàpòéj2÷2fmç˨@Ÿ.g^òpïd¨Ýt¹,P§b¤ìކD Y0é»Üg+*Ömî¼øÕ¼§?síngSñÖÍð´~Ï)n¼¡«ÛFÒXNö`À‹«©føLe鳨N“Î}t½·‰§2º£m¼öÜ ÿ¿`^uy¡é£Çuê'¦çìíÚc‘‘ü•S–]0 `%Oú)ÊÄ”­Ó ãäJ(õŠšÇRK0)aÿü䫌ý íú¥ "Mé†çO–-5Y@©+횃þ-ÞaƒF¶–“Ù ä$O8ÔËÞfhªÎš1*¸úN>n½i°È©.×Ú38 Ep:Z¨¡=gà\ÿP¯Áª_kØn+:X…hß„ÎoqÊ‘xXv:#-î"äšý]ìSY 4{»ãrù#‡} 1E(áBuY0ÕŠžˆ«cøåyOB4/ˆr«áÐky«û8Hû½¹®îô¢¨Â»ÄørÝC›oÒæ 27©¼n'EPf^·X‘¹®|;…8¦Ô‚&QÈ`YKF¡€ÍäY4@èF3šnïÔÔfíyXŠÜ¤EìÏ—)b /cƒ=‚u1ò¾r5‘|«!*x]mÉ:1ýLJu…î¦óþ’ô‹£kÖÇgsCÌ:!¸Ûa…©\ î©§†ŸŒ¶ÓÝ…£ÉxV™fO^öÍz™ïŒÓ3z¼:Gö/NTÖ+tß kNQg7ªʯàóÐ6œ2°OWNÊm‡ 7wÃ|P÷l–ßU°½ñ¾×ÿ(ø(?³=$Fµ_d¶2R^Ï_EUÜ\Uýò‚E"¶Þšý|¶|Àwýóp_*¡IAœŠØ…†‡ÓŠ)A¥ØŽÄ¨Çq\µ‰Ý±DÓ?jT¬ÍIæ?Þ"+¬!Ðõú¼Äãr S¶º ;/BìæØŒÙôâ¾1§ÐŸKfŒv#Š{šP½OldÕuk"¥'ërç ÑOîÐõ¾P5ÍùK™ÀÛûÖºAyYé9XbÂiDä*Íý¬»¬ÚÑNQøåýÏzÊ×)hãrMªÒ3ÜàSvÎí{CíÀOE¯W=U#sScȸ‚/û$¥„.gKÛ×½”!üAjÝü ¤Cb%Ñ\©c‹Vù ¤Ó1±–úº´B&m.‰ÀØT 2@î"¢âfUü©R_B>ÄÕü»kqQy'îˆE wØ‹¯,%t¹´=²¦¥/Þé½—ÔAA]ޣߑ‹RFÉ“fÝab<ȘÄp[¤Ci¥øÕ$êöõÖˆ² q’þý6‡qn­yÂQ 7(óÛß%ÐC½YâFXfœþ¼ír§9ÞÌbËRë3È“PW@Ñ÷¹PH­V³ç¼rJUŽÍ‹ëŸ7øšp,£lk˜¨_ž*ú­›Où†h}˜'²£yIk€|ëªÀNŸöÓþ-ÉíLŽ—Kö¡‚R´†Â}ÅŸuëaÁù s¯‡¶¦j¯±Rî8¯áÙÄ–8ìw_n¶oUÚm‰ÈNžf ðãSî`˜{*j­Æsë¢îþ,×W|Æ©›¬º¸I†)iœó"‹œ±flvXì=Ô5S§Š]ñ»j}1—’wÌ,oPNœ÷5‹b¢š*¯Ú ]*"KzØK¾Mš%)²¢Ö‰u.ÀM°¤¦­çC‰I¸Ò.ýL½ÃD¨™b#På3pŒ®AûìkæËªkS­®EÍ]Ýu.½Ñz_|‚>ÇM`qÒÙXÐü>u"9ÞØ=zîæÚ³a¹²µÞzŸóêÁˆ éŽs}±%ƒµpï^»‰5`,›ö¢hÌÄ»íçÉoN~JëÕxdÜÙå~;BÞ å¸j wgTF¶CVc‰õ¿lÛS•º§dú·,•i‰ßRÉоTÁö®Ís»IXùaØø-Çsì“*:ÇEGÉ-t>™ÞÄŸºJX"Ô[s®s‘=d_SK• h’±Ç§è'õúÁy~{¡ÆÄj2K`³ Ãe×xlÊè¿TIî»ñò™‘ö„&ÓyÞ÷µ»ùÂÊžZñÔý•~¤Í¢Æç·¸÷᪸ŠÊnUmV}B†WQŽ9MÏDôÇ`ŒÏ¾ôq²„ìòn» ž/ο¬`§iô$ÉTƒ¥ˆó÷Í×¢Kïr3ݬk-=Éü´îmø‚ñx¿ÖA]àÒ Hb`ô#ôbÀ¡\ ^yÈ)D£íg­w³06|ýbõŒNm‹P`f&2E%§{ EÃ{S0ädÐìÓ3é)FÓy‘Éù!Pô»×©ì݆æmOÂô/O&“ïòéûýh‚´¹@Ò*-¹.–>ÌÍÓ$îlÉmKP§YÒg5œž¿ÞßPCk-©Ç¦ ç*\¼‰ÍZ&³£…ôøÖ_˜´Õ&¥’®F›äLX§?±o¸-X«œ®=ñ¨8ô‚~ÔóÁô­ñ8 ¨.æåÜì±+ëÙð"õ=`¦Yδçßœ7W@áCe‚+Ÿ37qåã¼®TÊÓêµw¥ª;?Fúzûä0| ëïëî‹/™|;‰ Á«õÍû™ùôܘú:Ãýo›) ƒDsþ =ìK-õaÞé´¨\ÅgWñ„Eá <ÕËÝÑo4Ž'ÑAuë@ ŸÌUw[¢¥Ž%R±Ó*ã·:Æñf a¦‡£€ܱ@4ÊùH«Ö¥öUöµ¨#–O³›Ùv5*©¥Î“?$ÎhÖt½*ú¢²üc‰¢¡¼Ò¦ø ˆÖ[îO[ñ“íMã¯;/:׈/ŽØŠ ýË+a´ê“F•ÑÊüm8’ë¼5w8àðdS¿iMfTöí]!×I¯çX6›œêÆJèÂÓx#ü»DúÊWGœjoL6Sssf#S"˜¸ ©Ž‘ R{:D¢qYõdü•_¢ÓÒ(Ûü0WëTìÔ6„åTÖv™A©¸êØa¸ì#I5ÖDöÐ1H¼¤_mÊŽ—AŒÆ‡à°Ÿkßwé„XÁDÃg]ô?ÇK‹ endstream endobj 5345 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇw%gÏçáí4Œ3‰ä§áô–’>\ ‚‚6ý§ã°¿ õEJ™€õØ7ûÆ8ó 1¿’{Æ~ºðÏ`W(-ú¡;]¾è·Û%=°ùñýxŠ»‡ñe_,—bþ+-OÓ;qü\ÌL}œ†ñUÜÿI--=ž‡·B«•èãKª˜æÿ¾ÝE1ÿpÆ[ÎÓû! Mߊyuû>Û.NÛñ5K)Wb¹Ù¬Š8ö­iÇ[ž_®¹uÊ•MúÑzQ­Š¥Ò)V†€Ú(TØ€àx¿àÞ¢ žjy‹°°!ÀÐÔ•µZÔÀ2àP="¦ZdÔ0\ÃG©R\¡·”).–2*ÎШa!„U¼Ä,†³ÔÛHð° `+jÐÃ.¸5Nα@èâ°èÐVK-àxŸ%ô˜Ü3š% A°YÓ€z¡ÎšÔ>kP#¬³¦õ™5m0W£oš¦Ã¾žj­®§Üý·.†ÐZ¡ŽT$X/©)n)æ#W—„o(æ“oÀRZÞ $K¢p4’ŽZ¶-bâ\­1¦Ü°Jä æP"Gñ‘XÔQ¬‚i/8ºkÉ^€ÂZqŒ:ZsŒ½š9”d š­Bù Ž)ßsLù-ï7½æx˜ÏJ›¡¾Ò`¯ažÉ½)f¥É$†µ’1™¸ dÑŠcªCZCù<£7Ã3JÊgózÌnøþHȰíáÌYÉšäTœ¯a…Šï¯Æ,_»œ-Ÿ—Oë87Ë}êÛKÔ´Ü—Ll¹oKñšò+Êg­JÌâ.¾GZyóº‹Vðc­48¸’ï¼äØWtù]Í:P~`áŒñ±–rZŽq.nÍ1]Ç ÇàSÿæ/©ßP•ýïuö¿7Ùÿ¾Ìþ÷Uö¿·ÙÿÞeÿû:û?Èìÿ ²ÿƒÎþ&û?”Ùÿ!dÿ‡&û¿1y–¦¼ÍH·œn5þ¹ã)º½ÝyšÒ“Bï½x#†1Þž´Ãþ€]ôGoáõñÅ×Mñ?®Xê endstream endobj 5346 0 obj << /Length 814 /Filter /FlateDecode >> stream xÚuUÁn›@½óÛC¤äàx ,‘ei#åÐ$J¢ªWÖ)R ¶é×wßÌ8•šæ`ëñx3óæÖßžf®_ü,¹ÖêÑÆÓÔúYõ}³..ê±=íüp¼ó¾óÝùîáF=Lcûä겺­o‡þxÄ·CûvêüYõQé_ûá¯sÔå³ÿ9;šÙï~1Íô¬_àBÏ4ôÏýñ-è¾’¨À«O¼¢Ò~:ôãp£ÌµÖ:ë¡«Æö9Dsñ¤æg—Û~è&1¦^`32±êúö(WôÝîB0(~z?ýîvØŽÑr©æáæá8½“Ó«h~?u~ê‡WuùÉ]¸ûtÚïß<œ(­VªóÛÐ4dq·Ùy5ÿjÙÙóûÞ«˜® »kÇÎö›ÖO›áÕGK­WjÙ4«ÈÝ?÷LÂ%/Û³v´º _±NŠU´4(61¦‘‚ȘH`ZpÚ0a‘A‘SgAQ@Q LE…)5÷8ZÖPÔ\RC±¦%4k(4m¸¤AÓ%MÅJš÷ëŸ÷´‹óÞí¯Í$é¸*C™6TQ.€cæ3à„pô‚4ctÊ| œ1vÀ9׿À–yÒ\Û;æ‘´.y.i*æÉOÍY£§I¸¼a%aÎ2A†{&˜c¯xÓï”sÌÊ4c̲´» «lcw3Æî6aŒÝí‚ñ˜v7äÍfŒ©gΘ4–½a®ŸÈÊ’O³€g[2†O[1†[3¦þôKš?¾mÃgÁþSÌ-Ø }Áþ3è öŸÂOÁþ3ªeÿv/ØNzöŸ‘ž}æð\°Ï™ì-!={3ôpó“ïàßI¶ØËI¶)°dKÉýd‹gÃI¶˜å$[dè$[ÒH¶Ø×I¶ðì$[ìå$[ìë$[då$[ê/Ù¿“lá³”l1·”l¡/%[èKÉ~JÉ–j%[ì^J¶¤—lIoùí$,çv)%sìRJæxöÊš³¥>üf—T+™cVÍýSìÞß°¦nä$ 7G"Žñ·=MS8‹é¬§ó'k?ø¿ƒý¸G}èäü†«û&ú馿r endstream endobj 5347 0 obj << /Length 550 /Filter /FlateDecode >> stream xÚmSËŽâ0¼ç+¼$æÁ1$#„”‘8ìÌh@«½Bܰ‘À‰œp`¿~ÝÝ +8Ä*—«ÜåŽ=ùñ¹óSÝÁŸ¿Jñ]s³øùÏCëM&ESÝ®`úw z\íÞħmªôbšo‹­©û'ÞšêrÓ0ªž‹28׿¿ëˆé~û}øëÐúuHX¢z_÷§z.ŽßXA¶_`»º1o"x•R:bctÞ\ñ$7ÒˆÙ˜ïTm‡H∽@ ]Wý0£±ºº– ywïz¸nÍ©ñV+1ûr‹]oï”òÅ›}X ¶6g1ý–Í­ínm{Ì!¤·^ '·¥ëÁûá böü˜ÑþÞ‚P48YÕhèÚCö`Îà­¤\‹UY®=0úÛZÄŽãiÆ¡“Æ 7(©äÚ[¥Êá4rƒ”;"A"e"qD†»gs"2´dK$Øâ°#Ð’±%#KŽDÁDN¹Æs5&ªþì]ªJï[/G endstream endobj 5340 0 obj << /Type /ObjStm /N 100 /First 967 /Length 2944 /Filter /FlateDecode >> stream xÚÅZÛrG}×Wôãn¥¼}ЗªTªl'ÞõæºvâÜÊ”4’¸¦H™¤'_¿è€Ã‘&ãÈó°/6zfs}¡ g0Ÿ[MJ`Èc4¥8ƒ%yãÑeƒÁñGÑäBÆGj¥REãKJƈ&¸ìN<ú`‚ÏüŒœ3!ðgžø“€Ž]FÈ&ûõÉqè«§Ä=R¨±÷È¡°UŠ ªûX 8vÏo½žT Ø©gCòwÈa‡Á¥\ÁÁ@Ìd?K…0x­{ä·èjÄ®Ð{ƈ®ðcÄ B`ŒÄ}12‡‹„Œ‘‘1 ‡†‰£pZ0GrÑs kàÞ£!Ç®ÀçÈùÍP`Š;ðü Jâ!pôDyÜ¢ç )0#Éó)òw9¦ö(u€‘Љމ„ÄQÅÊ$Îs Ä™ÿ‰£g"FÆ(œµH yÐAŒÙ×As”™gn›X9f5°URk“\l‘3É—ªò&…’«LBOØ“¨ˆ•CÛƒª¦ÚѤÊ*[ɤmßl²óíÛÂ0³ ²lp$¹Ò™«êBŒ'9:“ÙUfI²Á³Jùþ¸*³†säà2ºê‹³|rvÄœy¹>-0 )Ø3û*•ù̉-u€‚)Ì>•M©3#;0¥Ê&±j òЧ©g(oJ¬y`ÁN ü1ç$±BJæVâïJá¤:§œÎ»÷®j#E¨»I–wÇ^Åä Õœ²Åzä<×È$¬=(Å“O?=± ¨iee8ó‚[ídfÍJ j+K«T­qz¥•j«h«za®ºT›þЬ~8‡Ú¬]´ÙÒγC›èÐl?îP?û¬ùûßocŸmÖûÏ›ÝÙvy³ßlOÚö7‹k~óå“WOŸ¿úäùúl³ÞmV‹ýâ%>zÑ\Þ®õÃÕârg°ëñäÉæ½ùÕ™G\Ex¢1³@¯OìãÝY³ÞwbŸ.nþÕ,/¯ÚFÅ“çÏ÷‹ÕòìñúrÕÔæË}sýŠu}b’Ï‘÷¾Zl_6{ó7ûØ>±Oíçö ûÌþÓþË>·ÿ¶_Ú¯ì×öû­ýÎþǾ°/í÷öûÊþh²?Û_ìÂ.vgËåÙr{v{Íö¾Ù.woìboOíéâìÍnµØ]±µµ§ÛÅY³j.öµ­´æ›fxÌv÷âÌžmV›5ÿ{}½°çö|³âÌØÆ¶‘Ûæííbe›÷g«Åµ½°Ëw½ØÜní¥½Ü6 ŽÂ^Ù«ßo®šµ]ÚÿÚ7veWÍng¯íÚ®—ëÆ®o¯O›íny¹¶»á7öf±mÖm(­ÕrÑnÎíÍêvgßÚ··Ín¿ä¸ÞÞnöÍùéª3vËšä¼â·vgwÍ;ÆÝ-ßÛnø{»¿Ú6Ýÿ¶±·öv}ÎÀg›mcßÙßì{û»ýÃþÑl7ïø~¶d¾¸.ù‡ê‡/žÿòóŸ<ýúåÏÞ èÏ„GuŽúª_ž±½† T3ô:zä ¥ôÈ£Š Ý‘˜À‹I¥p½Ø_ÝÜØ<Î9‰Œ»¼¸h8ûgÍÎü  ò}Ä[§ bœ¹ƒ[î:!‰$„ÔŽšúV•žŽ¨VJ­¨Z[:;áµÚi¥É+S'©N‹*»ƒBx |Ì„̈~Ïã׋‰k3ÏÆSž9ç«QWh1|#„PÔ Ê¨©¡) IhdQ΀Ya¤¸‚Ü’²!âP>!Ò¨¬nd”éÄN¡AVö!*å¨ÂC)ClW¨Q›ÃÉòÎÊ”tQw•\ É­,SlЃv·„C¨¨Ž£:N2ÒyEå`”PzLcC(ŠRn!‚`êzŪps HÝÈî… …Ò)‹¾*iTr2y’ŽJOpHœ4Šç$0©ð’2“d?z‚ãù ™Ì!΀ʲ C&EмéÑ ²–ªâ6*@Ù½@Ñ [Tô•àBi”la¡È*Ì;X'†L9tAŸ„PèDèPËÚN¤È•ªË$ï„à (/k.ún`CdA(B•"Ñ¡àÏ¡¢lÅ0I¡Ã‚,ß0ˆ=®áô$ÓíÝrµäôâG/a Ï€j—‹ ×z!ùj—¸›ÕþœÞ?AÐùp\ z˜Ó3Ü_ d uÓêHwëzÔÕk«ö—÷XY·¨Z BÑ3}ý­^6hº ó8«ýy_6,ºÆk¥Ý-áaÑ ð0¬tgÔõÂÖŸ¢e]Æ•t]Ì^pCús¬EH+ ê–âÝþéÀ‡ ü`<ƒ«L½Ú<Ü0ú‡óÖaÛ{Ø}LV˜À’m¤‹é¼”£~QûÚoo÷«åºvm10²>Õ Ú?lh[šŠtè»Ü¯~/û©ÇFî×;·ï¶Í»ö/#ŽCèºÇrèãtw ë›æ}ÖgÔ; ÓÎܱ³ñÈüÁ™Òð'Ît6‰3q¦Â¬ÎpÚY8scÎú”ÓtÊõÚ½sFqÄöà48 €ÆÀžœ&àØÓÀ€#z`š€c@OLÀ¡' LÀ¡' L„1BO€Ÿ&Àcøž?M€Æð=~š7 ÀàzM;ƒ³1öÎü”39O¨37F€sê,•4íŒÎà¾3ÙFvÎ`Ú™?r¦qÞqÎr™t–ÓÀ8˹wFÓÎ`àÌ9ÃÞÙ4é˜ó޳ž€4M@¢³1RO@š& Hc¤ž€8M@ƈ=qš€8 {â44 Ž{hšÇ žš&€ÐÔ€Óà€#{pš@c`ONú¿ñø Õö4 endstream endobj 5360 0 obj << /Type /ObjStm /N 100 /First 884 /Length 1564 /Filter /FlateDecode >> stream xÚ}˜Ank7 EçY…vPI¼$ß>>ð7PE7ÐAŠŠ¢ËïUZ›fÀrÅ‘%9¶Ë=æpÑáÎk,Åðícsì[†Ìkøº‡\œ²tÀ6®¡|¢O¶Œ?eØ-ovó1Ÿë¸À¿ÝkÜÃ.kÎÅpà×0¿ÇZªèX[6|m™÷0ãd¹ŒN†«÷Y¹|²E°r²Ý$óU–ó©N¾@2×µîM2÷´ç$™;Ù“/hg[KIæ¾ö’¹1n”dîlËu¶ÃÉ0’¹·­ ™ˆmëz_pkÊÞ9ö…{(—»ïmlžØ”7å&yts¨cÈRç`Ù‚¡fCä!Rä"Y9F2_$+'ŸÕ)8Ùn’ù¨¸“,בA2YrsO*s`N’¹Ì‹ä½©Êucó$ta@ÉÜ-ä"yr2¸å¡7pƒÔË¿sƒ°Û9à/΀ÄÅS7ˆ{s"7¨sòBðÏ:ÏÃÜ .ºú€n±»¢²H>K‘ã¹%’Ï8K8AòÙ¶%pƒê¼8‡u)ÉÜ Þ›dnÐæY87hó"™ä$™¤W’N9Ûå<Þ’Ï̓ñØîsu ðÂç ì\Ûs½Í‡}kªòÆÃ>—š\xÃy胋§nç½`ë(:o’õãÝC²r2­Ð''ó9àä¼LÎ%¾}ùòöÃ/¿}ÿý&ß}?¿ýðOò‡?ýúçûßy\zÿ÷ÀŸï}¼C?~ûñýïï|ž|üöõë+Œ'þ„I[¯0¹+Ø~Âöݶ'˜0Þ—'L{˜$ت`Øjaë~…ý·ÎO°°z+ Ø•€V/`%«°BÀìÌ$`Uf˜½€™¬JÀ ³pÞX/°Y ˜OçN Kf!àüŸ|¤‡½ x¬óì)À®VÀÉÛ+¬`×0ía’`«‚!`½ðXç'Xð^€k‚U<x/À“¯x°^€%^ °`½K¼`!ÀzšX%ÀB€ö4 °J€†íh • è ÐJBzH´€€^€$¨D„­°¥[a‹[aK¶*¶>–"lU„-"l}„-Eت[DØú[аU¶ˆ°õ¶a«"laë#l)ÂVEØ"ÂÖGØR„­Š°E„í‘Ðÿƒí«<:}`³ƒ-/°*Âúèô7­‡!ÁvÓ€í6_`u~‚­'ì‘Ðÿ]–`(`NzØN°YÁ$`½ðXg†yð^€#Á*¼àI€W<X/À’¯X°^€%^ °`½M¬ !@{šX%@C€ö4 ÐJ€†ôh%!½$Z @@/@’T$H/@’T$H/@’©Hؽ€H%`‡€Ý ØI€Tvؽ€•ìJÀ «°’€] X!`õV°*+Ì^ÀLV%`†€>š"üXç'Xè#ŒáÇ: aôFаVFD}„‘"Œ*ˆ£0R„QEaôFŠ0ª#"Œ>ÂHFaD„ÑG)¨"Œˆ0ú#EU„Fa¤£Š0"Âè#ŒaTFD}„‘"Œ*ˆ£0R„QEaôFŠ0ª#"Œ>ÂHFaD„ÑG)¨"Œˆ0ú#EU„Fa¤£Š0"Âè#ŒaTFD}„‘"Œ*ˆ£0R„QEaôFŠ0ª#"Œ>ÂHFaD„ÑG)¨"Œˆ0ú#EU„Æ”¶¬0ŸŸÑån?£ËýúU„徦=LlU0¬ý’D®×/Iëü{~I"—÷0M°âK¹,`ÒÃ^<Öù ¼àž`Å—$â!À{. V ðà½K¼à!Àz–x%ÀB€õ, °J€…íh`• Ú Ð$À*´€$@+Ð @ •„ô € ½Iðð•Ç•è endstream endobj 5361 0 obj << /Type /ObjStm /N 100 /First 876 /Length 2523 /Filter /FlateDecode >> stream xÚ˜Msã6†ïú™JeËcOí¦j3™²]ÙÃV csCI^ŠJÍä×§JšjÂ{°E —Ýýx)Ii«º’RVÖVšJh…¯º)ðÿjWIcN㫬”ü¬©´lðUWF|•iä ‹2u¬œ²¸¦j@á«®DAà^XWÞM·±² ¡ƒ÷Â`0X:ƒ¬ ÊjÒB]Á“…Á¦Ae…ÁÖ¢²Â`§P M,@VPרŒUAmñ_øThTƺÇW´¤@e¬ ¤Ãw!ePkª¨Rq¨rjtÞïçB.'4`ð›Y×r%lh ¾'E¨À`#A*¼ÀKùšÐyÔ9IêÖ¬*c%ÒTVlðÎë—Ö¢²4*c×d¨ ®RuÊØkU‡C])¡Qé(¨, Rÿ ä©$‚8A)c™Ji%Wx Åò”Á˜™²˜§œtV£ÌKS ~ˆ•é+ÃÂ4¢«°. µ¬°, Ö¬°*-±;XÖ„¢§°X’Ö&ä\iƒÆ‚´aÙák`€qE°ÝDŠ(Y›ÖbG¬Â„N¹Ê@¨_p)h‰+ÓH-Â&¡qÑáŽ:l^éÊŠ˜Öle¯p½ +¼r•m°ñxÕT.tLK\É W¢ra•áTM ¯$6Êe«ªF»§«Æ™ lC_EeP-…YýðÃêÝc7ö>PÇ]w¿zwƒ—zºüÔ~7b¼nN þ¸3ã»þ눋DÄw?þHÄTE1hr±¸õ¯Äê‹ز˜&b’Ãq“e1‘‹òœ‰ÁEL4E1a‰˜fÄD Ê‘ˆ2€š‘Ôe5 8uP—Ô@ͨ/ )>‹1 qIL—Å€Zpb*‰GJbçgI¤’— ˜ø¯àü7ÙoÙ}‰ùrÞ›¬·ì¼Äx9ßM¶[v]bºœç&Ë-;.1\Îo“Ý–Ý–˜-çµÉjËNKŒ–óÙd³e—%&Ëyl²Ø²Ãƒåü5ÙkÙ]‰¹rÞš¬µì¬ÄX9_M¶ZvUbªœ§&K-;*1TÎO“–Ý”˜)ç¥ÉJËNJŒ”óÑd£e%&Êyh²Ð²ƒåü3ÙgÙ=‰yrÞ™¬^ùöD~¦â¾Õ¥¯å‡PòmŸ{ÒNOSe/'_š¸–dJÅ’‘æ©]‡Ä t²[?ï‡?†¹Ó2› ¼½ß´‡ç·ë¾=b|%(ޢɃvû“˜‚£Æ´¿ó,VÄJð ¡A! š+þi7ú§¡ñ.¤ R/ÏyÚÝá‹è³ÔðCQ+_„ÇqÿißíÆ‡îϰ=tÝ, †™Z°õr ³|½ø¡}¢E“]0ˆ©dïÿñˆÇÎí¾ßa®®Ù¡0Ëdm|ßëýÆÿ´ûÒûuXh‡Sït¾ø¨˜AÃ6㺚²Û“÷}»þýf·ù÷s7F,Ó#Wu=«²ùàÞæÞoâ4ÈFöý&žâxÈ:20t›'ëûþpïCÚ¸VâÎ ùa»]vmÌ yU†ïFœpïqoûÝÚO;[»«ÌòˆÙVÕþßèXL¾ºŽ]¿¹í‡Ñƒ8œYó›ÙøÇnýìO‹05{npe² |“hPÈ"ïÐííMv¦†$ÌâhôˆÜªnÛ~ýÉèÓŸº§XÁâh¼ñlôØãqx½B'k6L1¯Š±])L¢È=øŸÛqýê“À ÄÙÊKøöÛzzèv±1¤ôÙøô€!hÀéб‚]¯äOUøàèúquÆÛÌnšRkfc>Ü+ª67ë|,NœÞ>Ü>âS’ïCK·4:ÝU³…çióSËŨǛûmûÏMü4ØwÜ]ÿ‹¹5óÑ_»CwÜþ*â\Ò¬]Øà—4/yß÷íËÁØ~ö› ‚þå8öOS6Y œºh—‘ôªߕӄ‡¿îü!¹®ë¡ûòTú:Ï…ð˜­$~?ÜuÛ‡—¾‹‹Y»…Ái*¹Õös·óaýÆvYÇMYË}µ8NŒoÓàq«ÝâßÓ~øvé#kˆ‰‰ÉåUS®Õx|ýòù¿¸W¢*ÇL_ÄU?âÉ|‘Q"—AãÙoïºÃØ¢i„›,œ$lmœß3å©çY|j{?žX²ýq÷Áï<ÌïOgXœt³=y׿?>ûí´ç²²ï¦g÷“¥ÊÓ/§WE_e}=™-÷®óãÔõo¾‡ÓHL–ÔÙmÿ‰Mž§72M²dèlù–:}ÃùG«<ÅÙ”…’¶øTx\ÇûÓÜâç³'&×¼3¥¦ó Ãzð£O«ÀÒîáizŽzŸš×ˆ…’Ï%ÌfÄ‚ÿ¢nM endstream endobj 5379 0 obj << /Type /ObjStm /N 100 /First 1055 /Length 6032 /Filter /FlateDecode >> stream xÚ¥\Ysã8’~ï_¡Çé}ð ²¢wb]®Ë¶Ûc»ªgckh‰esK5”TGÿúÍLðH Ùë'ùe"¿ˆ#*5._$‹ÔäÉB+zP Sø YJf‘ìB©”žÒ…²=e å2‡On¡M ùB›$ûžŠ…ÎteØ/r”PIP£Ð “)>™T“á“]Ø$Sø”.¬1Ÿ²TFVÜÂäAÿjCè¬E©MÀÿ =µ (R‡OÀB'Tf€ÖødYŽuØ$]8…´¡Î…3†pnáR›áS¾p¹¶¿ÀS±È¾XçÆ¤ø¤yŠÌ­Ò‹ÜTfEBºÊ. íHš. _¯Ê…K±6å*IÐK«rxÔFA-ª€GKnë]‚ZZÁc‘aå`E)­«6ðh3`³8ChUädFë”J¡6xB· -”v…†Ú ©”I` 6ãÙ¨Íd •BmÐæÈ Œ+ =Bm Bc{AJãÊæŠP[š8ôÌ@m©.R¨Í@miŠ]ÁZ¨-u†š jK‹ Y¨ Z Cb¡¶ yÃ#Ô–eÝG4©a§S«°P›ÃÈRÀ®˜@mj–ˆ·Êá|„Úrt ¡¶Ü9¬" Š„š z–*Œ¥R¨­ ®kÓ :v¢‘[Š}ßx„NždÛ ÞãákDñQÁ#ö¡›I«Œª€vÔªð»ÐðG¥)<¦ =BmÚYä Þ#jî _)£±Ý Úd 9¨ Þ6T*ºz¡×à?Z€.«­Ë±6µÙ_ í¨SèrøµQ—‡G¨-M)$0&hh¡ô—ß~ûå¯WåSµ[üÏ_n¾lNÞ4ªrÿTnOÔ¯@CÇÍ¢“ì¯×ÍJ èÓbwcùÛõ}ó½W0¹ +FÉÓ}µZÕ›‡Ý¯0Bå$ù×/½¨Ÿê½èßTë_¿üío3Fol/«rƒuYîŸ/öN¤Aùí*3“B-‚ÒOe‹…™™–"G%ÂàPWîö7×g§ç›}õЖûº!"0rõ ª\M1Í÷Ûe¹®Pß9Yæ½fõ‚}h«.æÄ?I/še¹o0N‹ŒE’9Óõ%gô̾7Á+8“¯ý¾j‘—NcRR†™‰÷ËÇ7å¾Dʉšnª]½:”ëZ5N¤Ì–4#T9Æ{eYåõœ½]׫ê¶ú7VžF¥^™7e½Y®×—eûµjÉó,II9t ¾jVÈdêS1r ÷º­Wë.§›åcã½Î'œbXÏ!“Àwm¹Ù}©ÚѪ Ú8$“6 ‘gëÃnï#ª”‘e^Q~7ŽÒ•,E£6`n«Ø!‡ÒˆC«êKyX{Œ`šÍ®j¿U«±«¨iGšb<Á H"cWúŠŒ¥:­Í㦢ábôܤõ9«4“e§»]ù“”µ xS?ÝT«Ã’0VÆÜžÝvÒfhM—Åb2p‰i?Þ!œéÞzL(µú²Y•뫪~x¼÷oô«gaßlò>FtLèUí3ñY‰¢AA}럘'CûLÆjŽ£ QP½óˆIüo·Ð¥Ëõú',êò~]u“ E(U/ûˆå±ˆÍ(¿Èb4‚q¥!¢©~©çc„Sûbýj¬)}©k§tÚ ‡ûnäA©+bRг‹Ž^ÏF6 ôl.Sv$is“QMèZfÚÅ•'Ï€úV0Ó·cÞdã`hüZM àŒð F£ïjF?¡“Oæ²Ü·õ;ü¾Út±äsc³^=–›Nµ’ÄÇV A²Ñ EyÉ¶äøŒ(6•¾‰bÞx6—!Clm!Æ·ÏXýf³¿­ÿ„h™œ¯Yß¿½ûsIò¬(y?¨‰„±±ü‚ö ¬~,¿ýùt߬ï«]ÙvX-xßWû<_ôå¾5sA0ƄϺ½Øï@t‘ˆ =ú;WŠÜŸ?•Øw§7´ŸÓ†¿¿£|Üb>ÒÍD¬ÐâS½«OŸhž«8@`ba\Çu0…–#0%3Gˆó|‚¶ß÷[ZûkQ„j& #yWïv‡ê¬iÚU½)÷øQ·|Í-cǰʼìݰ±HÍ©¾Èd,ts%Öæ–ï<Ž5È÷Cüu[­ê%:Œc(æ3ŸAùð÷¬-·4›g““›U¹{ ‹Äå˜!1"î~S=pµ<Ø—“< ‚! ßD’x%Fÿçwç›/ j˜dVÌç­Ô/x¦dG7eE™ÛEnñÔÁ‡²}j6?ƒ”&u!|‹°¡ãCó­jÇô[Á‡ .óŠì½8?;íòiy&¶°ä )²>Ò^pæëù$Y,|λe1LÕnÆ1©ól/«Ïø^€™\¤>ÏßÉä0àœ4RI ¸¸Ì‡!Ÿ'1ä«ù©œ ð}TßYª.wiùÂ4zUqéº/ªÊ´{OäÓaÕÜ…BŽð$€„™evn+jáÄ× 7 ½R*(]”?}2(Óq±÷Uœ`EòG£7¥ÈÏN$Ìd"ËŒ{9Þó‘+èV^Ÿk¦KˆIÕ6yÔ¿¾úXà ¼À`4¤›]½ÿ‰ç9{ ÿ^.¿ÞîÛò;z)AàÇ+H$â|íz“¹€ìÇ«ÜÄbÒ±ÔDâ„êåkô¿7õf?=ŽÑY‘…x3lнÐgg§˜JàëS*D¨åsÑ…†á„ âaÉÌ]¦$ò#‘¯…½¬å}µféxÇçû@èU‹‰ôI“¢ME©lQF !gÅ¡tp4€Ëœ*˜¯aà½]6-&_BïFTÚ/g\šÇ îÓñw‚hŽ¿"!jܲ»´#Ò:bBŽJ½ùZ­Æ¹Ôñ,¹†ó¥ãë$N’Pƒóü<Q¤yæ÷¢)W*ùçÉÍa}Ò­P=»õÄ÷¨™øè½ICoN¿6?K\Ýñ×—›M‹ÇUõƒ²tiLê­¡øìÐÖÍmU}¥Îó¥öDLêF¸""V¢Qøpx}yz}öû›·ÿÄ¥=”Q|UnšÝ¾… ¥fâé¸çÎ§íØ‰<Ê>Õ>TZ²ëPòÏj›?´gTŒtàñT3ÊÓËÉ;qµ¿Q­¸,×0j–{JjQäÍjWMûT®)¡¦óTÉ2¯XÄ(ŽÎJšŽ Ã’§yj#.¬pýÒ‚ ‚élƒr¾â̧Ë,Íf¥Ä.ž`w¿YâõW$2mÑÿ‰ºHýòãÅÝù®úw¿Ý-ë¦+˜c—åö‡ª¥B¾ÚíËIÏ ØBé§¼O%Ê|Äk⮤*Ó侈;ÅÚŽÂâ™OeëNº—ÆDû²ò1’|d"N½Þ\–{-ÎÔ1ß¹²LšdT_^Ö?ÀxÔÖ˜6/xƒË¼¢ „»e¹ïÜ肯«'bRçùÕ^~ñ×fE*¦µFŸg:ŽÀWÈÛtauú îý©­‹Š'+ç"{Ô×Êšóêª›Õ ž9ò¥N%ˆ„J"õ««}ÓeM’uu_‹H”Š¡à[ÿ¾|~ËNÂø1ÁÍA>W(¶0s{¢"³lNàA•É3¶|ºõŠJyíÍE“£/Ïyy78ö¹¾R„>bELÚ-;!Üâ›ÚûÕŒ0äÀ~ u¸˜ã(ÆóšåÎTP|[?t~&Ѳˆ¨óÀ\Ÿ—ërù@Ov}¢-’¾®ÚeµÙŸÞ7ßðô,1¼b&ó^¹™pÌ6ÑXhkŽcÈP@"ÕíºîÚŠœàÓîDìÕÅ „T"ÊrÚàá}7)‚Eè—{'8 YÿVñ&Éd©Y°71‰Ë£b¯.NÇs2}<2¼T<Çeä_x‚pK³ˆQü]íŠ=|R~{vÜF2ŠŸ£Îd$7¡ÛqýgD £o'ù4 ƒ³-ÛÊ_λ©¾TmEëC¼ þÊG'å°æ«åÞFe²ˆÔ2‰ÇŒ’  ‡‡`b^·OR¤’[Ãá¹Q¹ŽŠ½úÜò¤ } AF\¤;ŒâÚÇØ„-.3 5sE¾n'ËXt¢eÌ0¥èÄȈa­k4_H\ïªÃª¹?¬¿¾ý±m«ÝÎÇJ«ôH <›¸¾ I¼ógܦäà†µˆÃÌ'"tÈ0üäeÚíº:ݬþ»Z¯›ï01¦ÛùÜœ^]á•ù ;ÆqTC3»žn,ßt쳌u„Ø£Ø ¿ n÷ÒáLÄiTì[d.A]œ(ä;öSu™ÒTk’›åvK)# <÷­¢Kæ³bO¥˜—cJˆ©£zš? #s…8>ÌüÆŽ§C0ô‹o]gêüeæú¤â]¹ÜÓJÝ÷db82¨"U>¦”Ê‹J}|ä®1§&x60Û¶¹¯èé ¶Û+?¡i¾‡9Žö!ËBø˜Åt‚Àņ’ËýºÌŠ=<. ‘‰™h0¤£žôðQJ®èI»_—í®z]7¨š:Yæ'QÂáe׬IÑYFŠÆÆÈsÇ%Ý(c6x™lâ4¹23iO5¼q;\83í%½Ì+æSáƒU’„”¬Ž1žëEY²ìnÐhx­å|UÑù±aƒ3¡÷)h6¼ó­:knH“KI9 ·ÿÎ`ä—cµÑ¾ÝûWPŸ#½76âÍ0ÑÙ¨Ãc‡±¶1lJ³iÐÈ; +–gàp¥Ýí¨¬|ƒ!Æg¢/Ç¢ûðÖjö0{¬NÔ”) &†Ã†CM¤ò¥~±ÍЇ•Rpù©ŽkE+g£7%M™ÜaCY¡‹r».—5~…hÒ$ô-÷ªÄ@$åi’9nä”ò¬ Ï)vA—úÚåÑlN%TŒ¥ý«”ª|VåHG'3!ã Â–ö[å47¨ÔsÈgŃòéYèé\1F#…`é…Œ¿Ÿ…Ò ^YêV "’‡܈ãeó†>ŠˆÈ¼baÉ–TcDû\.ú›†4{U\„­xÙà sò×H¯Fæ;¨*òlZêÁy„Úèb¨£tÍ»¦S³ÊÆv¸~vÍICÜ^ÜžcqžÎŠÑ—Ìá£Ñv»ž÷N¦£H‘GžÏ«fûÂt2œ’œÍÃã–ÚÉ„+r_ì‰fóò¾ª,Ѣ˂n”êIɾ™W>"¸”ÖKG¢ÁE7zC;±ÐäÝ»ó7ï¨Ó!uŸQ‘ËyÌá@!Æ®O9egµôwÊMpÝ­Žg?&¸9×ËGê“!v’!Êx–.¸£\Dö>‡"ÃaIDÁ–ÂÍëœD9¾~Ðe³ªÖ¨Ì£å°„&d6w’„Œñ¥2±Å®ËÅÁU¦µ DòBö©o9WˆLë\!„:†èñ¤€ ã× œ®¶6-æt•œC ÎÔc±é¾¡´X÷0zº4“çûªÅ/ц³´àZGŽN 1¾Áå8~ÇÇEâÀÉJ2ûîjPø~Aæ´ó¡÷¶|Ú®«—8ùf|:~á)¿Uüæ–Ér“’²g-‘€lB¦¤†s\65 _y&I†5g=" ˆ7•|‘0ÊÙ`)¯Q‰ˆjœû˜¶  ÓT]pÅ4²­­Kòã M Þéñ˜_Rv|EJ½6€‰¬ A€bó¹ÓIÔ‘àæ3aãN/;Ÿæo«ux¦3~ެ žŒ)<%Eâš,W‘¸Eè?gQfïµSgÃc¾1&¸Âx ë ó^'|T æŠc2’­³ÿÇ¡Üìë5}ŠésGÙÎìD"6¼ü ì:Ž2ÊNK'ãunÝ1™vI²…æ§4¹ ¾Ñ“0t3^ŽEÀã˜HÛßÌ &’œ5OOåf5¥&/zö³þ~§‹xä–hYöê•°ð¸‰Á) ‡×*yrf$£ÚGÂÓ‡“èб"Σÿz˜¾/vGP³O@ékÔ¸]éûR~ „ÿ²$êWô6YòñX½´’4†?Ž£c½h˜X’–2¹E (¿Ü©=޽Ñv讨ûs½ÉÊ/‰6C9î ”ÍÜó±ïCsÔÖ B àÝO‹èí› wÕ“ÿÅYäß>E|óÌäÁgÏòS!÷òÌéP_&ÜŸ+M[#™{0Ûx®nöui¿{‘>5E0êëöy9$çñeŽÏY“Ãåñ5s¬?/pÅÜé¡Ã¸€øºÞw?ñøþ=ýö£›HûÃüòù å]<÷XГiîwÕþõÏ×e»„-íùæ ®8ü¨”UGÒVÓCíN€»¦Y£YþuÍ]³íG­Âéy¹7.ÞÞ9æûÔ†HälAX¸Ð-¾þËùùÈØ¥a\šæ2Rä©5áZ›ð.?„ÀâÒ(àñCr0Ž©x*nîéðit.ËHѨ¹Ðƒô1ã{? ã ±ùStC'“Ãò£ÐŽ•ïÿœelçï*ë0·+Xèô‰*²Àsu1©ó»Áœ~4ç‚ò¹*øvt*÷Ä D¢³!Æcò[HÃ7%¬ òˆŸIóŸtl0Jã†ß&|xí˧ïÏæIï€8ŠˆŒŽ’ãÂîzñ K_>sØÇx‡ úfÜñû5|ÀJI™§õiÝýP‰í~Us„ðªW—©®‡_4 >eøã±ÞW¯aýW8üM~°öG[ïÁ¹Ï‰MêqC‹ÿ>UûÇf…O_›áj2>ù”› ÞÀÛ‚xǨ-ýOÇÁZƒ¶Õ«W[tmûø“.ö$|öåÎ8*ÑЫ¬ü™1ã'é‰1 1þGáb5³%® AÝÚ|â%oDÿ‘ t _Ó®àímÕÖOÕÆ› ÃÉç?s®GíÄâ%ýïh<ëß$„èñ#Ç“>#ª,X†5óɇ”~^‡é€ÿTÜ·Õ÷ª=ٖ듚~ Guy!N1Ž¢!1PËåɃÿ F/D_ŽÖøÏhåÐW':Q)?¢_俉‡e³Ùã‹Ö KûǪiý?äπȔš‘ÏQu9øKH°”Å`Ù_s|&ä߸*Ë÷V+Œ=^_.×8д¸aï'ˆgľ”ËÊ×ð@_kéào”~oéŒÄñ›ÉUóO¹üszÑ‚†´¯~Чø¼wBoªÚVô]=_´> stream xÚ}\ÁŽ%· ¼ïWô1“ƒ-‰”(A¾ È!× #0œpþ«½óšSOº,µD%’EõÛ®æW¹ºÎzÕ1â¡]"r©ÏxÐkŒýš‚Áãr·x°«ÖÑâi^UšÇ“_U]¾uõ²æì1Î×ì³i<µ«úŒq.W«=–t½š´Oýj1ÕzW=[ µY1˼šÏÐÍý’ÚË·ÞKYêÖ¥]/õ’Ð~=-†Žx’Kf-ñ¤—¸Y<õK«bܸTŠÇ“]ª¦ñ4/ZãÉ/ÅÖk‚¥Eüµ®?Ô€ ×5A›±n …$f®1ÄãÝPÈ A]ÿx‰Õ– £ôX­Îk´Š¿ú5ÄúZ£•kt‰q ˆ10Kkטo4¹¬,ÕÖ“^Vï¿öËÄC—6.ëµËl†.m^æ3ZN™uÖµÆR|ÊŒ7¤^³[¼±–œ\–Ó§[X$zy…½Ò/ ­d¹¼[¬»Lu¡•̵ fY>/Ë×k]N/{¢/ké#^Zx×b=fWYÞczÕµ}jÇØ¾¥cìXvkì/ÓXbýS«Óõ§ÚªÆjk‡Ô&kÊõ¸VkŽ]3Ö¶À‰ÇµZs‰×Ö’UÖñ¸Vló¾và’ùµU«ÜÛc;{à ±Ÿ×tkµ±VSi1Ù²jiÐâµekU‹ýÛ‡ÄÞ¯ñÚX«­ýª¯ÃSû½I׫÷æéc­¶ÅkkµµKðÚZmÔ2×jÇGJ¬fq:cç®ÇµÚ°ªÛZmÜ›ky«Z-¡úraµæ1™­Õ,ŽÒz\«-¯áµµšMÇkkµY¦}ûÓŸ¾ýø×Ÿ~ýù·ëïøïOÿúù‡u¬?®‡ª\»¾ËìcùnfÙ„¬%™C&OYûDÓ«­Ä˱Köo?þå—_ù_Và5ðßþüç7Z¶Š•4MÛbÚ‘—Èf’)ÞíIÖcÜ:AOX(¾U34x Ü©y7Ò´ ¸6jVé.-¿4÷‘ ”‚QéM¹ð’öñ¸QRÂEŸÓ dyy…,a.²„¥nV²1†q,Cƒ×ÀšSäi²„ˆnII-åIVCÉ‘fS±BË{%çÇcàFIn=íAÕXʳJÀ­'Ìu@–0WàÖó»¢÷÷j†¯;5[Oû²nÉ‘¸õ„Qܦå7oÜ’z¼ˆQï•ôÇÀ’û­'·uà6J’·|î;p ßÏófé²sV34x ܨ9·„ÇnùìŽ Yränó ôe>qïUVò.×¸Ž 6)5ktÖà7l òíf òýc r v:ö×°ŽÔ,¹Ì€š%½ ¨YBÒ€š%$m¡&µäù°}l†Bƒ×Àš€ÍlØ,Áf3–Ï»×ÛLP΀-Í6Ämß(ùò÷Ü¦Ç ÜrržÀ-'ç¸5I'|n­$ÅgǸ¬æˆqMß«9_éqnÓã4L›—ŠíÖ4cä¥íæ[zÓ F%£½B¶9ßó•}›½aŠ´ß|á¶èGVH1.íAnšN³n’1w¡›Óã¯ôèÛãã7nÉE~ãöDiMåå ncnY {–- Eë&7úgnŒï5l@¦ÜØ 6`ʃ­È”[‰¦)T¶20N“ÌbÜ|¿)¡ÁkàNMÙóRÓú\T AО¢¸‘dØ)‰¶(Š%HÛ{-_`Ö]¡Ñê \Öè.¹»b¦„Ù*€K ³¡Äo)a6”øm¼?<Ðà5p§f×SdŒ2ÝSêh ¸¥äØ_éžÜаƒò.ˆ _Fm%? ¸Q„ ¥œÛ‚Ȭæ[reTØ2Ò±kQáËÈ›:*ü%{Ïy ÁkàFÍ )=¶ 22n -e”&7nÉ Ü<¿«½'íåoÑ­ŽØn9œ`Ëh_¬ÁvKɾE/–-Œß6›R> ¶Õ1è€XÖ'èÀ’¥:Ð,¯c÷e¶O*‰›Þ8lN¸–ÇÀš7lÉ‘ RÓšÇl3öØÐžA}/uãný,4bàFÉ ‹¾%ƒD_ï)‹ÝæYɨ®Å[Âõýª*’l@¶ñx¯;5[ËÖ·/Ë;dÉ•Qßg‡£¾—–¼0n 6ç»1p£dÐ-5/%!Ëx€DÏõ)n’ü€_r‹_K߸|¼òãØæGð‘¬p“ttòîYà$¹%¾H²:J|­›Ò ¼n´#Iž F ÍpÁTK·€Óž ‹(ñuäØ%¾šo|n¯xiÛüŒ@=55"{xŽ&îï)îwQä‚òÄLPÆ=ç‰Dà¶Sî3/nûB‚<ý+R†'ö‚–ÐHa`¤° ÀS0Šðïó}Î~5ƒ¶½ Èž˜Lä OíÀÈ©‹ ë©ëAßSs.B¾Ï÷QûÕÿÙ¶,åÙHžZv‘|¦1?q8ï©iQÞý=b¯–϶テÏL1#üTR5ùÀÓ‰àê©Fˆàî©*‹Ð¾˜ÔFµÏ}¶íó Í3Ó¶Š,àþtLDOÒ½&‹€Q’ ¯Úßëöêîl›;àú‰w"ö—DNúK èì”Ä!ÐØ)iGF _dë=Ñÿ̾ۮNÄüõúóÌGÈ_ ,‰Ð‚Nü¼$î|¯§ 77ße|õsvGÔnœžÎ@¤/‰ŠD _Tì‰f„Í%z*ghØ'¾‚FNïûêãlÛ8èâ”Ô¢‹¿WR@¥ê3ç¢>ÏÑÁy¾†Nï¡{õo¶í›è´švO4oZn¢wSk‰ÖMË-žèÜ,ÑÓýѸYÄè}=õêÛlÛ6@¥ÃM›ÅâÒÂ8z)a¢HHnô©çTѱY\íý¡x5l¶ýšh–´ÜÒò©ç^ŒfMËt7z5-SÇ.É¢0¾ùû>È«Q³íÓD§dñ¶Bl)ù^÷ýöó?ÿ÷ËþýÇÐLï)ý!.¨„är%yƒüýnDã&%µÌä´ª€ï'ç!G)ð<äòFrƒœ-›SÑš5Ë/œÌ@9%¤. Ñïç!ÞBV`üÒ7žCÈèØ ¨Y±üÂÁ 4{Æ÷÷!èBÛMŸ¡´ËÐøÊótåy€_ÞfÍò 3À'…ŽÐèä#tÝF'g 3ôÙryÈz§-‹–ÏeoEûø2þd0¬0¬0l50䣛m5pœyØQ¡X0·ËÃ*4”Ƥs¦Ò˜<;¹îæ N Ý„KÛ¬Y~ád0wÆ*0·B¾@×É wÈÉG ß“Ž î˜­|ŠåV5©ÆA=)ã 3Î!èMYeu;ätºÑt²v0#4Ë/œÌè—è—èöºN¾CËmAt¥L§;Ë/¬@CË8¤‚ù˜°¶]X-€®t2Ðà2¥“ŠcüÑDÖ,¿p2 sDI2%3Ð>âƒdJÖ‡lp!ë‡ìÝs2ŽEȸ96/Ð9£3fÆãºñx€ÎeH“ÙÁŒ‘‹q,BÐ1³Ij¡Qét¾A§l’¶àT6édà’Ü&9m1óz°"!vÌ`fÆôÌxï€vÙóºSø3§ø‹ôYfX.BìX„Ä*Zè€ÇMN¸]Ÿœ2pÃ> Y¦6 Y1Ñù¨‡0•Æ<!¸£Ÿ•¶Hн%gm rò.à'§ºÉ©ÄÞá\Ì\„=B89/á2•ÀåüdÊÊ7‡KúÙÈ8\ÔÏSqî¹ñcâ89càžrÆÀåýäŒ ü©_Í‹\ÿ: Jf=í&OH; ÷7“h¾Xr#9¡¬Ñy<ñÆ8â- Y~ádA•6¾X'€€ÕœÆãá*jAG”ÎÜý!À<„Y(–_8Xª9)Ìâ;‚%'+@ &…ÓûIáôþH`:9 %Àô=׃fù…“hÙ^fBN{¡Å+V+Å‚û+¯„œäUV¤j0^8Xå½±V9«¥³Zr²¤Ñ©¨Å—+®íÏ74Ë/œÌèB{\Ó©¯ë”­ktŠt÷gNíþÁõdEJzñÂÁ M§Ò_2,9Y²éÖÀÃX£+›ôúÁ ‘//œÌèÔÖÀÖQÊVø~` 'g€5z§èÖèçzãdEªã…ƒ ›>Ø €>X]€ÎÁ¬Ñ« Ð9¬ñÍ·§Y³üÂÁŒÐiÍÏO5r€n,èÔOÁ§Õ©òÇçÕç!g¤:*ÆŸŒæDî)œn÷Ω¤ÑÇsN%1½ÊÁ=[qLA5W¾§TsÉIÙë¤J®¸S¢Æu»/à8”ß7kíàŠ‘‹q,Bî[9êvàcŒ%gu'ä¬..é8d0§i èÉ8X‘‹;!Ðß,Ð9ÔÞyj  siC°½¾/Í¡Y~ád@ï¬@çB~… UpFÎo w–½SŒ²\„Ìc‚ûÀÂÁhôÁËtF¸üüáÑCÐ'z~È3!óX„àÞ°PO¸Mܲ:˜àš¼Õ‚›µÊqw‰•ãîk=œï™‹?!A6×t¼<®c‰17Ü4V®³\cù}3ÍóLÈ{ÊsâÇ"÷•Â.¨€ºOé´J+èöK \!< \q RžJ9^QJ+¨•W(/WP’W(ÏWtWŒ}’|E)Ç+J)pU:(ª•ªQ©}¶ Si" Ïôæy< §®¹ §¢Yàñ¯J²fù…“ÀÜY­ûÛV ߌP¹?¡ýÖH7$¬±ýþ¡øÆŠTÊñŠRð Z¡l%A6›p ²ÙDX-…œö°FüÄÿ«<Гõ–|E)Ç+J ²Ù„¨·(@ï .@'rŠÆ‚÷•Ð9’ãw´r¨%_QÊñŠR:@§zPð3\¡~¦t€nl@7V Ó­˜t g‡=•¯(åxE)ø‰®ðÄÏtù3tm” Þ(Ô­ðFáƒÞ(~ˆRùŠRŽW”ºÉ—xº)Ô–ÐM!.-àJå«€7*çOðF=|ƒ ùŠRŽW”º©œvA79€n*gcðF¥êXÀ•£x£žÂT¾¢”㥀n*§]ÐM%î/ ›Êa ¼Qé30oTaó€žöT¾¢”ã%úÊatS¹ÜÝdz*àJŸ x£*YÞ¨z°"Œã¥€mª²¶Àœ‹°MåØ Ú¨µæ¶&h£ŒÈEÈÑ ›JMVÙT¦ ›oÎ X£rÅÖ¨ÆãžŠ|E)Ç+JÙTÎ ›ÊdS'Ë9uð™•,h\ŸmH%ȱQpM¥/Ó\S©y¡àšJiAA•ê.iì…åøÏbÊ~?i¾£Ôïw”ÿUéô endstream endobj 5581 0 obj << /Type /ObjStm /N 100 /First 1041 /Length 4127 /Filter /FlateDecode >> stream xÚ}›»®-»qEóóú(°š¯z‚¾@pàTP` n ;¸úˆºÄ=÷ªd£7ÑlVM’Õ5X«×Š÷yŸµ¢?-ã\Œg¤Ÿ‹ù¬\çb=žó\Ø“ÙÏ…?­e;Wñ´y®òiçßµò}šÇú±¯Úyèé±»õ§Gާ?=ö3ûrz¬§»Û¹²§§ŸQ· £ù8WñŒá<%Ÿ±l÷°÷}†›ÿØWmÛkë´õg6›çjÔ,DŸ2IѧLRGô)K°£ÞŸÝ8–Ý*7}©Zˆ¾d’¢‹UÑM–Ô@tÓûQÏ‹É8†Ý /¢ëˆ®kd zh;¢§>ÑSïG½ÌÏnËî•Gôó~ÿ2Ì<¢§,ùr»X{ÂQ7jgÇôóRþÚ>hŸ…ùóK‡Â‹cn7ÝßsÑ®æíjîý¼Ó¿¶í²d'êUüXvw(ÜXˆ.ûr!ú½}ÊXˆ>Eô…躿ê­÷³ëç—û+'Ð|©h¾ÔZ4_¢ùBó%s´Ð|‰†xEZ·å ÃÜdý’kÐ1$7‘Ü\ƒ‘!¹ëóÏÛg/Žew‡Ê 4w5Í]474wYç†æ!÷;šk3êEñö¶; ñ2 qDÙÝŽè!»Û]C­#zŠwŽè©ÏG½†æïÝð; ñrM9¢§¬?¢û+kÁ“vq#]¬#º7™Œh´“áweÇéðƒvµvÒ.^ÇÝ5ƒ £]ÂGõ|;#î$$Ê$$}ÈÎD²‘Ñe©%¢ë #]_‰z³xïÅ„d™„$¢O5 ѧLF"º¾Ñ—LF"ºÆòD½U¼÷òNB²LBÑ%ªž×áÐÖ—©if*$¯—©0½Ÿ©ðâ…‘W r:|öa½L…ë0L…¤¯ëe*$¤.¸ÑcI;S!ApÁþÏ`÷­Xvw¨Ü`*$F.pSb×7]‚Ñ‚]' nôožsÔ‹× /îÉhU>¸ÀÍ4u›ñªYF»šuDï7F“¥ 7Fû¼¦°ìîP¸qpS ¸é¸Ù n IÂÜ]Ÿƒz|¯+Òžû+'Ð\rómÆP«Ð|¨Uh.!u!4{’ݶ×gáÄ•®rA›!)õ6cбÀfH ]PcH ]Pc/¨1Š@‹ew‡Ê 4_²/€Í\{›¡!j ·'šËT@aÅ‚W>x:^›a²¢€Í0ñØ }@!Ùñ‚Ãõ9¨çE¨íç—•ˆ: ¢‡š‹è!kj!ºx5æ+KjÌw^\ùàéPxl¦Î9°™ß˜5iW³íâ5ؘM½>êe/ö÷—(µ¼t#xœº‘´‹†èâܘrà°àÆ”‡7fÏ‹+< /ÀÍ^ÀÍ⸙ƒáÆê¢uõFá†ÝIˆ•I¸™ÒÑ%ꀛ)ç nL Âpc.}ê­Ê‹; ñòn¦œ!,p3M½Ct kpcjø‚ÓÔ=Ô+ΰìîP¸ˆ.V›©ÁÜLÍwáÆ QnÌ5àÆS ýèŽ1¢LB ÍÔlÚLͶ¡ÍS¹ýÚŽæ)lL9 9Ñ£­â˜îû 'lŽW ÖÍÝ.ÆØÜíbìa³Ý®ÆNÚEŒC»½Øy'!Y&!6Ç«ÛøÀæn×áƒvYQÏÆ+''2Y—'0·ª „Y×ýŸ]°—™è:3!™¶½ÌDOig&$^ÛËLH¼¶—™Ÿ7–Ý*7˜ Iµíe&$Õ¶—™&íÌ„¼.ÎK¯iÕÍê(¼¸ç¢¬QZCtÉÁ­!ú/¢O5 ѧzèr˜b õÖçÍmwÒÊ¥5D_j.¢/5Ñ%—7 ±k3¢KŠoõì-¼¸ÒA+k”Ö]^bÖÝÔ,D75 Ñå€Ü:¢Ë µuÔ+ª{v×(­¬QZGtWs]ÞnlJeÑå¥gÑåµcõ¢òâzëYY£´èB6=Ô DOuÑåífÑSÝ@½,ܸk”VÖ(íÐæhò3hS£Ô¡ÍÑäØÄœÖd26îv ¶w{l凌5J;´¹§^Ñ›nØC›»]ÝpÚeò6Ž¦ï’‰zÅÁ¹Ý5J+k”mê+`!ºœ§ÛBtÝ Ñå Ģˉ³-Ô[Åd\‰”•5J[hn::š›ŽŽæÕškT[h®Q j^8q{Q¾0 É5Ó1$w‘Ü\Š~fH®!ÕÜÅiC¼(Ô]£´²Fi†æ¡æ¢y¨¹h®±ÓÐ\ªç4 ²š£^Q/¶»FieÒÑ5D:¢kˆtD—ƒp;h6ºäøv q·ëóöÏy­Ý5J+k”vXsô¦Ãíjî½wqh”_,ØÆ}»,©£"•ºk”VÖ(í°æ~œDïòƒ( D׌0]3Â@ô©ÏG½â‡v×(­¬QZ ºÆÂ@tÍMõlìš(‚]~Ha`c¯2»FieÒ Í®1Úìr¶lÐf×X 6vµ`c×X 6vûL­v×(­¬Q´Ùý«m~Ý/mÊ–Ã]B¶Ã]òD‡{j綾5J7{èðLE¨L…„Z‡»Ô"nìr¢ípc/b­ß5J/k”nv‰µnÊ1 ƒ›]B°Ã]j—7v Í7Ž÷-¼¸'£¬Q:¸9šš»hÒn´«×N»ºwDr¢ípãèŸ3)¿k”^Ö(Ü”åàæ“7‡Ôn’í:Ü8†>õŠ“¿"­—5J‡6ÇÐÑÑ|©h¾Ô 4†w°qHÄv°qUN\ù`yÞìÀæÂw`sHœw`sHìPã0}’›>ñ¼ØwÒË¥›C-°©{l~‚¡Æ!i­C:¥Pã(ü®QzY£t`shè6‡†N`sh脇 ¼C#µõŠŸû]£ô²FéÀæ”tÔÍùªŠI»LÔ¨ûjœ‚Þ5Îâ´Ö綾5J6§¤lNAo6§#°q b;Ø85HsnÜ5J/k”mΡn º¿:´©Ánœ’;Ü8%t¸qÎVxqåƒ^Ö(Üœúš7§üÄÂÁ͹ô~D× 7N]kpã\ÅdÜ5J/k”nNɪÜÔHnN Îpã4½ÑMz…wR¿3ÀÍé:<¢»è®n º†;¸qJÍáÆê×Ú~×(½¬Q:¸i2:¸©¿ZspsiTƒõ›-‡׫ϟ´ÁöÞeÒ¡ÍÕÔ*£]GwÚeîÀFýËÁFýËÁF+^|w²ž `S¿œr`SÏ ØÔošjü†  Æ¥Qj\Åký®QzY£t`sMuÍ…üØ\rœéP£¦Ç5~Ñ€Í ®$ª $`MDk. \k.‰P4êwV4.ù½mË>ÏDÜ5Ê(k”kêÞXsIÚ°æúF[fB;€FIvh\yÇ]£Œ²F°æJÑåÐ2`Í%l@£~-@£~Æ@ãoßk}ïÆ]£Œ²F°¦ ›¬i¦kš„®…$h´®·7Ú­ðâJ£¬Q¬iR«XS¿› XÓ¤ÀP£-½ÑuÉBVDÚ¸k”QÖ(Ø4IØÔ~ØÔ 6š” l´oîG=_…×[/Êe@›&H@›ê¢‡š‹è¡æ"ºÔ:l´üL­q×(£¬Q´©ñ´©ÑÚôWö=ØèMÓi×ûí½ðâJ£¬Q´éº¿¡Mý¶( Mïz¿Ó®÷í*êUü®QFY£ hS—´é‚{múÐû]r]&ÀFŸŸ“Ú;‘вFÀ¦kÔ6]~ÖÀ¦/µ Í5JA.œPcõâ»k”Q¾0`M XÓ5Dš.8@£ë”úµL^ü"îe”5Ê€5=U+4Oþhº½Æ_êШ± hŒ·XPw2ÊeÀšñê0GôРkê×/4ê×/4†F 1Š/ã®QFY£ X3¤°ftuÑ…{hÔ¥4ê×24F‹; )k”k†œ%¬r–°fhÒ5êg45êç25FñÉzÜ5Ê(k”lê0l†F)`SŽ9l ©ÀØÂa6þö}Í/î$¤¬Q´ŠiÐfhL…6Cs#°1ôu6†&3`cD±Áïe”5Ê€6CâHB›_µMhSN–n Ù 7† J‘E r×(³¬Q&¸ò´7CÎrÜÌWÍ2Ú»´;íúü ýsÊ»F™e2ÁÍ KpS^$ nêW1 7fÓû;í¢ܘŽò®QfY£Lp3%è$¸™CÍBt©£%ܘCÍEt9rN¸1‹#ç¼k”YÖ(Ü”·t‚›)¼—àfJLK¸1å'áÆ”è‘pcå½¼"m–5Ê„6s©µh.彄6õó“õó“SÎyl,~Ë™w2Ël¦%°™òAa›)ybBú­LBéú|ÄóχRy×(³¬Q&°™®f¡¹†Z`3å8=¡FýX&¡F9åI¨1à /®|0Ëe›©o`3C­Bt9ÄJ¨Q?–I¨Q?–I¨ñ·e¾wã®Qæ¿j”ÿÒF.¶ endstream endobj 5762 0 obj << /Producer (pdfTeX-1.40.26) /Author(\376\377\000R\000a\000h\000u\000l\000\040\000S\000a\000t\000i\000j\000a)/Title(\376\377\000S\000e\000u\000r\000a\000t\000:\000\040\000T\000o\000o\000l\000s\000\040\000f\000o\000r\000\040\000S\000i\000n\000g\000l\000e\000\040\000C\000e\000l\000l\000\040\000G\000e\000n\000o\000m\000i\000c\000s)/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20250123171128Z) /ModDate (D:20250123171128Z) /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024) kpathsea version 6.4.0) >> endobj 5682 0 obj << /Type /ObjStm /N 80 /First 792 /Length 2595 /Filter /FlateDecode >> stream xÚ¥šoo¹ÆßûSðeS ö’œ?$p8àê»\Ó&ij§ÁŽPãMN8G2$M¾}‡”Åkr}‘`Lïr晙ݟ†2Kònp,):ŸS1ÈŬÅ`Ç™‹!N3C]ΡÉyŸ}±²ó1•ûòà<—{Ä~á5Ñ™YÁù$±¬Õí˶¶Sð¾Ük›‡«%.D)a˜ç@ZœY0s]Ë.¨·]t\Hq(–w!S83+¸8Hýmt±jÐÁ4D/Åb)†b‰‹L¹Xê¢+¹¨¹^—Mu°XÔކXÖ,HòÄæÃGÊE¢b‘#Ú[ìˆ÷–8’½¥Îd”¨|r”¨îœåúÛ`.Q—^óìÇ ZÖ춨Å[°‹)•]‚ýÈ%ãdŸ³ìâ4Ô;LtöõŽìd(¨¥I|É®Úb6–‰TîˆÑ q¹#’–Kd'¢%»&_TK&£:«vÉFLÎÜÖ³³,•ip¦¥ÄbÍš Îþ•&_¹æÞD«PÙÙ’¨Jeg²®J5 HsS~‘†ýuÙ%Ïeg\ Z~ËÞ¥˜Ä|Xê•Þ°ý]âZs&—J¹Íb—Rí—r¨×©Y5“œ\R½#»ì«Jk½j^Ä›%ùì»ïÎ.^/>[÷¯?lÇ÷»åzõÇóLúÌšÃ:npWîázªëܬçº.×ù™³¢Çfy¨—k³î˺¯Ûüzvñrùi¹k›ÞðëÙ÷ßϨàP¶ ­ûXשY§ºÞ¨c®ë¹Y—²}³^³üŒÙô†S2jÒc›ÜšôØdQjÒuR“R“nÍøx½fø„ŠôìÑ 'THM:µÑÖ¤Ûñx½&ÚpkÒ¹ ·&›–•š=æe”Ȧ7œ’Q“.M͵&½i­I—&*­I—¦5µ&]šâiÍžú*ò³G7œP¡5éÚ†U“®mX5éÚOkÒµ)žÖ¤kS<­ÙË'ŠQ"›ÞpBFªIoŒT“ž›¥šôܨN5é¹)^ªIÏíþ5{9Í«˜>vý)5ç¹ÉU*9÷mK%­ëmT©®75J¹®75Ê5y§Dð³éõ'Dä¡:iDä’rï›~Ρ®7âr¬ë¸\RîÛWs!Œ­Ÿ F‰lzÃ)5çAOl'Óíäëv[ÞØµO»Á`£ñõãúýŸ®w‹ÍÎ]}Xÿy³¼ù8^Ž··Û«ñn3nÇÕnQÜŸûŽï„}óÁІ‡øöÏùCß_ý]ÆÍ¸z?^ärýéßËÕøæv½Ûö|+T*T*TÞf ¾4ô|_nÆÅn¼´×›/¯»ÍòóÁûOŸïÞ-6=¿ „%$>!¤„’ôü>_lwWo.x±2Ï›šÝƒÛçËÕÍ«Åæ÷q³=¿ïíw .Õ!ûÙÏ2‡nÜÜŒ÷·ÈúÏ?½m=f̘!0#çQµ/ªºï¸/åÁÍ_Þ=±ú°>¿¾|ûÃv»øÒñyÐdÜ`xF„A=ŸX5÷Þÿºxÿûõn³øOè±k:¼Í #Á@x¾ÛYG¿/׋›_ÆÕòþSëÔC‡:u‡÷™ÌwÛêëöG¯_hýA’‡$Iˆ)t»èõëÝúçÍâî·ƒ³7›ñÎrý°¹:ŽdÈ ï€àB·™ŽÚÇçj\Üøá—ó«û[{¬77Ë•=Üý0 6Bm„Úˆ D„»ýõÐÛ‹O‹#¢(o´~kEH!5¢‘Q·µŽ»‹|u¿º~yýâ¼ÿ$AAA¡„¸¨ÛYðpx%íÝZ6‹ÕöÃzÓig‚,‚,‚,FÂq·½ì”jxøÇýbµ[ÞŽ­O†,†,†,Fºqq·³ìÿÕçµØâ¶Vøüêf±ýíüýíbÛí*†HHHpšÀi’nWÜ=xY¾[ní™~ç¿å¸'àžjj¨I»Íupž?ŽëOµ½7F¬qÓºå ”'…:ð™ÀgÒno}ìÆÏEñ]I³¨ã j€uR¨” P¦Ô|Ú8lÌGQ[@8á”Lp—À]Ús·õÓÑGÇ M€4e Ð@K™û.ʤ·7ÃÐi`™€eÊ`e€•ßõ†pôÛr00ÌÀ0NÌ`Cû>â±A´ã#á~Dí5€É&û~ɃËA©uº2èÊAƒ‘ F²ïW¼Hí-à)ƒ§2`È€!‡~ÁË0ùuð>vÜ lГÂì°ã8?ÛÛü4ñEíÐÁ@$‘!ˆc Žãü€ã§'lþá~ô#Tm ´1Åy_“19øN¥ÀC™ @c)Ϻ ~R®@rƒ 2C@Æóü¹X I¹‚vÊü1ðÇ  ƒX,ó­tR®8tž'pŽÁ9Æ<ÊP,ó­‡ÉS¤N½€5Öó'ƒL 2±Î·F¤I½¢vêž1xƘ7`b€‰u¾7âôÌɦÖW‚ àŒ1c2ŧùã›`&¾b§^ÀkŒq’A*©8ÏŸ2ÛçÖ‰/íÔ |cð1H2ˆÅ Ÿ8ñ"ÔËPÔñuP!àœ`€ ß°´äƒÍ'¶ö~k|á$–q:h†ÂH0Ÿ?´wæÄ—´õpOÀ=Á (@™erâË žáÊÐqàŸ`F0MÀ4 ó­a%˜¸Šm¹$P0 À&›„ùÖ8)—H§\À¡‡‚ÙO6Ø$η†È¤\’;å8L|° À&4ß’'å꼡4ÐP0è À&›Ð|ghœ”K¥S.àP€CÁ|'›lÂó­¡Ó¯C4wÊ p(˜ë`€Mx¾5tzšš‚v|Ap(à`€Md¾5R˜|ÚH-”4ÐP0® ¸&àšè|g$™”+åN¹@C sš€k®‰Î·FÊÓo¯u|Ah(Ó\Ìk’桜Ï~m _ ¡€†‚qMÀ5×$å'¹Ø~ ÀP²úñ§ìö0ÀPC %ó¼þ›'©‚ÉO@DDTQ‡ø?¤Îu)†ApTÀQGòÓŽº¾u ¡˜T`RI&Õó“$zÓ©bPT€RJ( ÔàOL§'ÇŸ¨€¤’ H* ©'¾Nz4–ô>z*fF$T@RIñ©=;/#£‚‘ F*©`¤ÆüÔ=†(FF$T@RI=ñWúø¹Ž+ùÞ ²*Ȫ «‚¬ ²jKÖ‡ï‡Ó•VXU`UùÉ#EW`¬-Œ»áM6ùqÜÚ•õψì^¬¾ýr7º‹ËÅnq»þxvñÆ»(îœ]üý~w»\í—ö÷¾n­„T.·¼ZߌÿÜŽ¸Ün¼W?Ô0\Ú“°xü/´ãÁØ endstream endobj 5763 0 obj << /Type /XRef /Index [0 5764] /Size 5764 /W [1 3 1] /Root 5761 0 R /Info 5762 0 R /ID [ ] /Length 14294 /Filter /FlateDecode >> stream xÚ%y`[Yyöu´Y’c;÷z‰Çv'N;‰Ívœëx‹/‰ÈIÛ‰PFbP¦‚¡3 ðDÙ†¶ k5¥ @PÁPa( J*PøLS©Ÿ ´ÈÃÒ¡”å;¿wþùÅ罋ï=Ïó^ßå='6›Íö»Íf·)›­AÿãüË5»­éé«Ä°Ûm®åNbWh:€“ØAbK4]ÀMÌ"¶H³xˆÍ»LÓ |Ä–‰]¢Y ¶»Klf¨×±¤‹Ø<Ͱ˜AlަLb»ˆÍÒlMÄ»H³´;JìÍ •Ø0±šm`'±sÄÎÓl»ˆ]%6M³t»ClŠfØm·¹›½Ä&iî{‰µ› ¹të"6Ns?8@¬›Ø9š=à ±ãÄÆh½Ää˜-š‡A±ibgiöƒ#ÄüÄFiLjÝ&v†æÔ±°"6Bó88Al;±aš'Á)br|C4Oƒ!bLjISV!6JìMùE£Ä.“]ÉAZÄÄ'hÊ ž#&Ç'‡!£{Í]ð¤);E¬•˜œ‚ˆržØ>bÇhŠ ˆÉñÉé‹f‰$v„¦iž˜xWºNLx‰˜sM1ð"±kĤÛÅüWˆÉ1÷Ò”ÄÑÝ^3\KL$[׈‰'Ò¼nOŠÜ+à&±3ÄÐ\kÄf‰‰UÖÁ-b׉uÓ¼ 6ˆm›mmÑš¸“Ø^š:ËlYì5! êY€O³${ÖN¬Ønš${ÖIl1<ž%Ù³nbýÄ:i’ìY1é0ò#K²g}ÄDä]4Iö¬NvOŽÜÊ’ìÙzbÒa;i’ìÙíÄv#/³${Ö$ÖG¬•&Éžm"& ANgIöl ± ÄZhÊ‚Vb7ˆÉ*²SýÛ<¡:bM4å€vÓÈîåd:‰3iJGì&&ç&‡&¨»ØSvÛN²ÝĶ“ÓBÁìbÒõ4Q?{Ø81霓í%¶JlM\—í#&KéN›ÕVö.ÉïðÑÄíÙcÄäÂ#R)ÙAb{‰yh’eÙÄÄ„"#š=ELLè¦Ivg‡ˆ ìÙbÒÏNš${v”Ø%bb’=«sË›–‹¹&Éž=GLŽY¬G²g'ˆ‰ÿl4Iöì1ÝM[â]’={žÆ­;4Iöìbø` ßgIöì,1Žokƒ&Éž'FŸn‘3Y’=«××a»E“dÏ.ë!F¾eIöìb'ˆ­Ñ$Ù³~bCÄÈÕ,Éž½FŒ?"[7i’ìÙÄÎ#ϳ‚›Ä.»ASv°FŒ?Â[²™ür}T¾(9³u¦ø±bò+å¤ïãõ–Ÿ¦î0õvìuÿacWÇ­«Ä° v…¦8‰%¶DÓÜÄHì­Eš5ÀCì&±Ë4½@[ÏWáJ³u‰f-ØF¬‘ØÍ:PO¬Ø<Ͱ]¶æhÀ$v„Ø,ÍFÐDŒDܺH³´›$væÐJl‘Ø Í6°“WÌ­ó4ÛNöÚYŒ¹5M³t“㛢Ùvã"¸5IsØKŒ+úÖÍ} ›Ø ±qšûÁb$ÓÖ9š=à ±9bc4^b\P¶,š‡A1éç³4ûî’Ú„ôó(Í£à1. [gh€AbÍÄFh'ˆ‘`[Ã4O‚SÄä<†hžCÄÄÔÒ”•GˆM;ES~Ñ(±b²+9H‹w['hÊ ž#¶NLC:Gïj›×Al¦tì1. [r "ÊybrÇhŠ ˆ‰ŸåôÅ ³Ä$9Ð#ÍãÎhKºNLx‰˜ø ¦x‘Ø1év1¿ÎŠmA.æ[½4%qüĸ3ÚÉ–Á5b;‰¤yÜ &-‘{Ü$&¹u€æ*X#Æ_ö-±Ê:¸ELú¯›æm°ALúOl¶ îãÁÖ^šú'ûºNö¦²NöméÄ=İ“NÜMÓœÄÄ ]4]ÀML. 4k€‡˜¸ƒ¦øˆI'î¢Y ¶ã–x«fÐÉ^7( ¶“fØNŒ¿º[m4 `ã¯ýV+ÍFÐDŒ[É­4›A 1¹Š¶Ð”­Ä–ˆÉ*²ÓÄ$qšhÊé#­‹‰ ²{9™NbMÄLšÒ»‰í'&‡&¸—w[ÛiîÝĸmÜ’ÓÚ“‹e=Íp˜ŸtÉ!ÐKl…Ø6š‡A1é?éÎ~ ­\W•cöÑ< Ž-EŠ0HLŽÙCó88Aì41‘ñ$8EL ç¦yè<¯Ç M[ba0BL<ä¤yŒãñkKìsXÄä÷ÚiŽsÄä"(ÖĦˆÙhN‚)bü%.Šw§–¶>Å_ââš3à1.¾ÅMšÁ,1îZŠ4çÀ<1ηx›æ¸DŒ¿ÄÅ[4/ƒEbx¨¸Ns \!FÒ×h^~bÜ1Wi.ƒkĸÅ.Þ¤yèUºy)®ÐÜ$ƪxƒ¦ì`…¢l&¿ü1|U¼FS|ƒ­¢üJ9é;ĸS(úiêsÐÉÞ÷  ä ¯SÀNŒ+Cñ MÐ26DHºâMpÃüÅEš5ÀCŒD,^¦é>b½Ä.ѬÛˆñ×¹¸@³Ôãv«8O³l'†ù‹s4 `ÃüÅYš ‰ÏQÅ‹4›Nñ††+^ ¹´ÃpÅšm`'19¾ó4ÛÁ.b˜°8M³tã‚Rœ¢Ùô©n¿—[ñâ$Í=`/غÁ~pô€ƒàè‡A8¦lí~?õƒ#@[´qy¬ƒ° ¤KH좇õŽƒeÛý^ÙÁ §À eÛwVœÃ`œ£à,°À8ÆÁs““–Þn’þ“Ž•)D#OT¹ÅbqŽXJ¼æËà¸n€p¬‚5°nÛ`l‚;?W8Á ®Øv¬ˆOO+[Ï1Yê ë8>n4—/ðÂê&oÚÁ0 .€«`ƒ÷4µ@Þöô€S`lðF¤4]`L‚Ë`—>À«œ0ïUÂò’c\¬Rpƒf°°^õ òf‚õ òϳóð~eû_žÀ‡OT¨àƒ ùVñ²¬² [•z@FU¶ò¨b²§ÒÈ™J S*­€ü¨ìdEe *€ ¨ìø¾‚ï+øž[qGßWð}ßWð}ßWð}ßWð}·s£î¨ÇÀÀÅœ]9ðn?sï¨`ïŠ[ÙNÝ+Òž¦#®€uÞxA8fÀ¸Ës¼t€Cà$˜×x*¯GÀi°Ä³Èó´VxJõ€&ÐúÁ0˜æÑv€n0dÁ Oh<±tìG™W!+dc…l¬HŒl¬²±B6ò°â¨²±B6VÈÆŠø€l¬²±"n'+dc…läÉÆQ!+dc…l¬²±B6ò ã¨²±B6VÈÆ ÙX!+dc…l¬²±B6Vî’Vò2X;p'p/ V¶3í²2г@žïòŒÈCat ›¢#à<¸X+û°ž7ùð^óqÒµ³v°tC€'–Ù‹à ¸ÃÃ…˜ ÈÃppw¸n>°ã`™ûµzÐãà,ç&°À8ÆÁ˜S`œ3@þì\³`̃p \‹` \W,ƒkà:¸VÀ°Î(ÛüÏE€UþÒÉa¬ƒ[à6§pÜæ^¥îÝàÁ5°É­U-àF)Ò¦Á`•ws%vP:F¸)7Ýåo¨ ( _ƒ@¾¹€|ù©ò½Ç ä+u—åÛNà‹Îrà;βø*³¼HÎl*›?!¿Ï:Ëœù9D¾¨l¯ ÊþŠ/·¾Ô,wƒfe{î„,åKÍrè»Á°ìG@Єƒ¿—͸+X>zÁapœýÊöÂËzÇÀ¼,ÖЉ·hr[±| a0΀i0 N*ÛŸ¬Éþ΂1pŒÞ°}\¯vrúý¸X:ì<˜ܺ,O)ÛŸ¾KörÌ‚9°.ËüµâI$ÒOó XKÊ­•mýà¸n€ wU«@Îí6wK¢ïº²=4-Ûn‚;, ™Ä I ’Ä I ’ÄÉþàÖ*Ûg|²ÞHÊ':¯²½eKb¸$‰K’òÝ—$åkŸ|Þ YR¾âá—$ª&µðüLv€#’òíŽ;Á$HÊ':|ÜÍ΀Ñ“˜!‰}’û÷ŽIäNîU¶G”Ø")[ÈГI<”Ä IÌÄ I1C-»?‚ {žZø÷÷ÊžqI—$1Hƒ$¹qM∤°EG$§öIbä<˜T¶ÇºdW8"Éýn$ñA$±@ò2@ó䂲}äaÙb `†$ê'—Hb$Hb$H®r<ÅeD”Æ ÉÛÄÈý¤6Ã'Ze§˜!y—6 €8€SÙ~üaY`}×÷…¯IÓ¸»n®Û@¨ `;0ÀNШl_º&Ûr³Ý¼´^Ùe= ]Ùþñ7²^èò–Ûófù,»ìòõõ8 *Û?½U¶•Ï­‡|díGPU6;ôcß7ã²2ßR›ùxÚ|ðÉ´ù4àCi3Íã`TÙ¾Û.[œ| m|mžÊöäË*<>4ó¬ÑÌçÌæ‹€˜Í €Ï”Í7Á¼²•†d >S6/>N6óèѼ ®ëà'péì5žbx »h®*[EÉ®nyHÚw"‡YFß0ú†Jµ}^bö‚F •þé3²}ÃÈæW†Ñ7Œ¾a¤ c‹0‚†[@;hMÊöó^ÙJ‡[é{¾Ÿ‡4¼SÙ~}Ÿ,åÑ-ÜÁÒÓiÃÈFî0 †»”íwŸ”•e) †>Œ_Â|lc0š‡Q:,¸û”²W6ÃaÃòÕü8oåÈ–/äòú©ž#§E#ÃÃJ¹¾!;À/a4Ëço4ËGolæSwx yÃSJùò²-ê‡>ŒAÂ|³c0ó¨^äéI¾¹bÖ0©¾¢TÃ#²?Àa,Æá€} $lxM©ÆÊÊFø0‡>Œð›R7 V) |Á 0Mi v¥vË©pSÈî‚\÷p|ò`ŒúÔ/à’BR=²É^Ày ØÀfÈX@îB“RÇFe=\RÀ\RàÊPÀ4|P ã ²QèRê¤[6C”ö) ~õ ¨_@ýêP¿€_ ¨_èWjxŸl‹úÔ/ ~õ ¨_@øy^Â-÷hY¶@îÅ4/ w¹ È]Ê R@ÆÂ´Rã/—ÍHö‚Ô.H±r¤DAê.)uþ¥²ž¼”“"‘qI©Å‡d)rHûr»°‚²tU©å/ËOòò¹ È]@îrî*õÈŠ¼£ ,`Ø(v(¥6~)«ÔJ†ypÞê@=hÛѲ tÒlM ˜J^"»j-`Ø d‹] M©ç\Ök]`7síû@7J…%[=à àÅÂp/èýààûGÑàæIÞ2ÉUE~ù `ãJ=Ð#;•÷Cà$#`œçÀ88Æ”Šlɶ`LipÌ(õð÷d•‹`̃p ð2dx,*õÆÊÊWTŸ,©9‘"žÒ’¸¥óümϽ”‘ÜRˆ£yÍãÈßÇ{ž«.^;È/Bä8"Ç4¾_©Ç^*ûCîøapåJv…xñ¥>Ú!ëáœøq€æqôŸRêC²Íãˆ?P:ŽÒq¼h× ò÷;d ,Çq4£yÍãh?¯Ô—e½ ` yÍã|_-’.q.ðñëà²R_í“-xeGø8ÂÇÑ<ŽÜñM€´ñJ墲²XÓÄy—7m·°7É¿CObø†RßzÜFS`Àk´:àãA÷€²òË*R®£ÍðÔ‚4}@J}ê€ø4€F`(õ7d=©èiRŸ£/ðÕVY %<;8s)ð¡R§®PŸSGQM¾<ó}Y™úœº.°P†S·W9²-Õ6u=€›ºph[üö;²^ Öý€Oì³rªƒà88΂cÊîÜ.›¼c¬#à ÀRöÚçÉÊcà³`RÙëoÈÒipÌ€‹€—usÊÞ<(«Ìƒp \Ô8¥ÿ®?XkàŠ²·ÿX¶]7Á*¸nƒ °ÉkRYo]Ù÷ü…ü$f¸«ìóEÂÂ!,¢_B¼€ é£ý²G„Ü€‡½ `ȧìÖ¬‚Bø „Bø%d,Â!Ô q2¡6°CÙG‘mñFˆ×½¡Ê>Ö"1Ì¢ð³(¿Hʱ:•}æ9²3„ðAh?Ø£ì‹/ ¸Z„°OˆBªÐe¿yŸ,À ! â•rG„pDáCýÊ~§"ëᜠáÞც†N*{ YÖáa€#B8"„}B¼a†ï'gå5ï®CÊþ‚qÙ–j–â~Â!ÌšVö½P–bвVê׿ÞáÞáÐ"@óЬ²¿äƒ²í€UBX%$¿ü:¸äóTûl9\ZUöW|Kv€¯Bë…Ä9X¥¬øiCÙ£ï”õxMÏ]P]ll*{ž+œ§Œ‡Êø lWö7U%†}Êòšç”1W™+H™‹G«”±Jo””ý­_ÍpNç”å#&.)sÌeù •é¡2—Œr‹²?ò%Ù¬skÍ  È^¸Œ”qN7•¹–”¥¤Ó”¥@¯CÙß[½H]æ*K5ö)ó¢|HÙ?ü+Yû”¥^eœS>°Oû”±O‡•±Jù”²'÷ɶ\UÊx¨ŒsÊ#Êþ‰¯ÊÜTÆå³ÊþxIb¸©Ì¥¥Ì5§< °T™«J•1MY¾ÍJ¿`•²¶EúÛ²¹,9•ý·/’5€û°%·²ç;ó¨u 4¹Ç4ù©ì¦²ï%²m3à‹ÎR+h;A;è½@‹üƒ˜l±ìû‚–öƒ òU_Þ×ÉáöÓ@ª&O‚ÃÊ^’Jµ¦”gòMiIŠ2)ÅœÚ?z•¬,%–RSyPI¹DéäÒ8˜àWnç§E0¥ìÿÕ.›Q!¹4. !—æåK €·ƒKWÀUph-~öÙ,ƒküy“~–/g7ÁКÿbP¶Xk`Ü·ÙL4¹ïrOÍÊi4O£yZvª/Ï<% ÜáÓ|K#w¹ÓÈ–ÉßmÊ1ñO6~’-€Oyéåp|]vE¿¤å6G¤qDš}éfåðþNVÁi|Æiü’î˜!ðé½õÓGÁnåhøoÙ¤ñA¤ñAû¤,æ‹búopg8R9´LSŽ&§ìõÓŸÆ%i*oÓ8'sÒ¨Ÿ>¤„v Há,.IŸUŽÖÙ fHKõ,"§§”£ó£²@*eñA¤©ü)ÊYÊ»áyåè~\ÖÃéK` Ói,^TŽÃï•U°J«¤±JúØ·Á²rÿ¼¬‡ÒX ÒŸæC7Ö>Z”žv¸X°¡Ã{e8•ãÁ iÖÊL;¼€¢Ñ·rÌ®ÊR>+vÔ*L;êè]YÂÏm¥>Y¯P4ÚÑ (í›Ê~¢"´£ð…²c7Ø:A›røß#{‘•ùBÙqt)ÇÚeA7Ø€ƒàèýà}ÊqçÙ£:À 8N‚S€ À¯¥òÚZ:âКߣd/|#í`Li0¤^ù¢rÜÛ)[Ìy°¤êYÊœ—€2/ƒÛàªr¼èAÙŒOµR¾,_¾¥hy¬ƒ[tg')’m©C–¦Ö÷%“R},šc”ŽJ¥1lQ­êǯÈRŒ¢V”ÚߨG9:* P:ŠÒÑ:€¢|€ä=Eß(úFÛ@£r¼vV¶Ý°E¥£hÝ©o—¥Hí¨Eý(JG‘6Š´Q¤öTb(_ª£èEß(’E)Ç[ÏËNÑ7Š´Q¤žè=E7¹ ÈÛé äŽ"^tH9Þ9#{9pNÔÈ=Ð<ŠæQ¹O”£GÆè´r<”mQ?Š_¢|"|á£Eøèe€æÑ%åxßËe3ü½ ø‚•sØñÇd)ˆb(êG)Tb¨”§cš(ÂW¤`|S9>ôolVö”õø(áñU\Êñï]²gW¤$¼F9R÷H T¤œ\^Ò‰©$¯ãk3¿·"ã¤iE'ûç¿"›IÁ¸Tˆc†ŠÔ…£~EªÁ¥ü P㣦©ˆæÂS×â«èìþ¹Q ã£ÆGŒ"E0>Š`ºéñŠÚaåxâû²Ž ÆGŒ"E0>J_|”¾ø¨ ñUN(Çן”-†êS<â£x¤qYº É*–r|ã¹²ÂSA⣂ÄGñˆâÅ#>ŠG|ø(ñQ<â£ØÃWÑøoÿHv€æø¨ñQ7â£nÄG݈ºu#>JF|”Œø(ñQ⫬)Ç÷ÏÉ^›º_EJõ¤×Dó»<ÊØ€¢ª¶@ñ‰9€Ô(羋]Ûhòs¶lu 4f`¯rüäý²«zÐä^O~[ è¦rT_&뵂 H¡?•!³Êñ«²ŠõKÿ> µûûTìS*?{P9þ§KV–ê|)Çïò†à( ô~vT¿ÏžTŽßýR6; ¨¦ŸÔÐÏR4?K!xQ~¹<N‚1å´ÏËfã`Ì€)å¬]‘Óà<¸ .(gãY0 æ”Í\K`,*g›SÖ» üà: 0fv¬‚5pl€M>C×ðÓ-åìü¢ì¥ùF_› ïÔç$Ð7árq³)ç51C¡åìý®4å³6J'P:Áè³"}Ÿ@äz$¶+çÑoÊÊø è› (ª œ“@К'¯‘ 8(x‰=Êy"-; w²{¤Mȸ‰Ê9ôYÊŒåD ¤M mi2–A2’á¨rž]•-Ð7!#(N7¾ ¤MÈðˆ3@Eœåõ=™¸´´Ó²¤M wb hA(@ÆÄ5pQ9/,Ȩš@К'Ò&¨~J h‚a#E}–~‘G~ïuåœBv€¾‰›‘ˆœ¸69Hò2±¡œW<²ò]bR¥¼Œðº”ó­çdAЙ¼”&ÅA^xkio=hZÐ;o‘õL@…—J"ï°tЦœ»¬ÜvqFR¶ut*gèM²tØ ºÁ~@e’—[Eiö‚àôƒ#€ò$ï10FÁ!弯Uö|œ§Ài@-“wPøäåŽÌOM¯ðŒãgІ×cà2ÊeÈX”pœUΚåWÊ å2¤ ‰Á"^©r\³ÊùÊßÊ2\…â*/ƒT¼Ô_yýÊùÚ˜,e@Š—(Þ ãNDË5å|cAV‘Ãõ¥wÑ<¨³6;&—f´ Ú•ó¯ž&ê]€¯ tAF9¥ŒQÁ&P«œï‘Á'AÔâ’ •vA„"|p7hVÎøY qI¹ƒ»>vlä5nPçtâAÙ̓èDË`·r~4. z. "|áƒDø ‚‘6¨Óù“wd ,ÄAêÿ‚ÈDî r‘;HM`ð„r~ú§²Å€_‚(Dé JQ:(…;rÓñ‚úÂýùûe[¤ 2l)ˆúAÄÁì#%‡¨¼¬œ_zJ¶@ß  BBý ¥‰Akt o†ä ÞTίõÉ2rè6ñBèDߌŒRÊù›—ÉO2ðA32Ü2åüÖe© ÷!§32ȇœÎÓTÍ j†¢þ]œA£Œ©œÉÚ >ÈÝ¤Í m¦ çôÍ o}3$qA3ˆœ!“3H›ÁWz2ƒx™ÝÊùäœì}3‡"gä\”(˜9¢œ¥ÈÊè›AÚ ÂgN|A·ÌiåüÑëe=”ÎØ¤ÍpáΠo3X sN9òKY¥3ät†„Í jU3¨šaZi3H›!Ù3ø CgÈÚŒÔJj[TåÚ™Aß úfZ–Aä "gD_‘!3$ƒ¾ !EÎÏtË^P:s—¼qTÀ€ªÉA7¨ŒðèîV®þÏÉÊÍ€šÊAŸrÙ.±m@†n5°eù(ˆŸd Ö ïڀ ºbTÔ`“ry¿.»bÐÕ``¨Õ` ÒsUƒ”q2fjð0=ïW®†ÇeÛÀè©AÊBû¢†A ?  y¤,tp ô*׎C²«Ó` ƒpœ˜甫ë?e‹ 0 ¦À4˜ÀE0 æuªƒë`A¹ºwÈxï=x\~° ®>XÞ+`¬q)Xã'™ÂÙ˜hyK¹z>#;Ýwrs½o*ê³¼ï_äU;rÇ|À®\§NHÌ>æ^€¾±:€´±ZåY••Ñ<†æ1Ê5þY€AbX%†ð1„!|LËÉ(ºÊuþY™:ߘŒ¶Cø˜ŒuëR®ùzY*Cé>&èdÄJÇdœÅs~z#F¡pì°r-Ëf¨CýêÇ>†ð1„!|ŒiŠ)†¾±Óʵ|J¶EøÂÇÐ2vF¹VöÈÔa•e¦1Ê’cCøŽˆM+ךX9†ú1Ô!| ácÓšo>_V‘’f4¡y ÍcØ"vM¹îé“UÐ%«œÌ8Q”õ΀³`D¹­çÉ*£` œ3ÀRî™gÇ@O€I ÕêçËå¾ô7²Ê,˜ó€á/Ý—À¸–Á:ð+÷ÕŠlv¬Õ½ d,·Œ½a´vD4º¥Ü+Ml mi#H‘ØH‘a×5Êý9ðˆŒ®fOD§éݤÄdtµ §FЈ ¢FЈ nLPÐ öƒ ‡@/8 ޱŠþÃ÷©ŸJ1…L©áRî쨜ùÇÁ pœ§Á2jð gÆÀ90&À$˜Óà<˜ÀE0 æÀÐ öƒ ‡@/8 ú@?8Ž‚c` ‚ãà8 NÓ` ƒpŒ‚³Àcà`LipÌ€ à"˜s`,€Kà2XKà ¸ ü`\×Á °n‚U°ÖÁ-pl€Mp 9ÃL Í-D¶$ãõÓûºe¤O©šÆ]6U³ÿ?%†,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀÂ>°ð…,|`á XøÀ˜(›(›Ìd2Ðd[“e“e“e“e“e“e“ mMª”MêšÍ4šS‡lR‡lR‡lR‡lRªl¦ÑœÊe“i†LŠ‘MŠ‘MŠ‘MæÁ5©H6Óˆœͪ¦£AޝCÕŒ¼F~B}ª”Mª”M&+2©M6©M6©M6©M6™Cפ@Ù¤@Ù¤@Ù¤@Ù¤@Ù¤¸ÙL£>™”%›Ì°kR›lR›lR›lR›lR›l2×®I²I²I]³™F}J•MJ•MJ•Mj“Mj“MŠ–Í4ê3’Im²Im²É½&Ê&Ê&5Ìfõ)K6)K6©W6Ó¨O²I1²I1²I•²™F}Š–Mj“Mj“M¦i2™ýÂd¶_“²d“²d“²d“¢e3úÔ0›T)›T)7úåI];`Æ1?…š~J6ýÔ7ùk€xP©èß(Fö3ÜOѼŸ25¿L /ãrâgð‰Ÿa(þ€7~ÆÞøå+Eî~©aø©Ÿ[?ƒgýò–}Ø äÝTþìÓNø™€Â/_Óz¼›ëò€/_˜œÎ È+ÌA o”N€“€ŠU?#êýC`Œ)‚¡\ÑX` œã€Á þI0¦Áy@1¼ŸLþ‹`Ìy rw©šûEŠU3ýß6åù†GP¨šK?ÒWàËÑXºGãê ÿ}²”“a‚–ÆåAUsí9ãd–9™e}õ¾~Lbœ ´4.èØ/$&µ—œŒü7E)ÎS5+-z÷+y›QÕaµõˆÆ­7jÜoÐØ|«Æ÷iÜ}µÆsþQãÏýS{Ð×j<¯IãÞç·‚_j„~§ñ‚j¼ð+/ú•ݹ,c=&UÍ‹è÷MiüÉ 0û{Iø¼ÆKÿNãþ—i¼ì0øW4ü¬Æ+vkDh¾òíÑÿÑx5»zèÏ4^ói×6k¼î´Æë»5ÞpVãÏnj¼ñ{1¶}ó‡4þ<«ñÖ;oûœÆ;|pZ亂þâq¿Ðx×#rhïþw÷T5ÞwDãýã¸Wã¯Ù_üß4û©Æéñ¿ÝÐøÐ-³« >Bç|ŒJ²ôãO¼JãïÖøäÇ5>õ ÏЧ)„úì+4>÷×Óÿ/p¾_|“FšSø+yUã‰¿ÔøÊ³ïA0+3î4.Ϩš¯é_+jdöjüSŸFö4rËʸ˜ x—çTMþ«zÁ?ãopúß(i|k»Æ¿Ìi|ƒ|çgßei!¨ñ½×k|ÿ'ÿŠ#Š5?@¨žÒxŠÞ-Ô(¿Rãß߯QaÛ=¨ñcDù-ÿ¤ïÿë¥?e? iTߦ±õu§¿©ñ —Æ/wjü iÿ›•ŸyTã×iü+ÿækÿ›Ôøíhüî70uúÙ¦5TXî÷ìq¼FÃùZ ןk¸ß«Q£{×ãujøtß{ju’x¶i}=uZFO½þEž†“£æ‰)Š—e™ÕqQyŒ^½Šñ”¬r\~å1uŸzÿF“ö§ùI’žAëøµF[Jc§¶²§]›Ð³kT£Ã_ÒèÔ— O×]Ýãà÷{¾­±WŸ´gŸî O÷ 4öïÄè.ñô|Tã[£W«ê9ür>í+Oÿó4ŽèÜ÷}—Æ€ÎÏà„ÆqÖ;ñ“ÕémCõ#Úkž3œê}!óŒÒk–ö•g̦qî¼Æ8§0‘Ó˜ÔWÏô¼Æy}ñðÌpÒtšz.Ò%symeÏ—ÈËG5µ¥í]¾|!² 2»n(ÏK^¬¼”޽ŸN|ö§ < /(ž9­—ë+ƒçŸÑˆ|Y#ª³Çó*3žW¿Yã!Îí5ÚÊž‡õÙóZ¤xÍ×Ó»oÀCoÔyäy“Î-O [¼Y_¥<þ7oá§·ñ+ßÎþÞ•YÒx'}ð÷kü%}ðWtì»>¦ñ¨¾À{Þ­¯»ž÷¼Eã½Hö>}Ùô¼RãdÏ_ë˵'NG<Æþþµ¸Öyþ–Ÿ>D?ø }¥ñ|A?Êi}ì5>>"ÝtÈ„pkÊó ¿^ðwúRêù¤¾Ô{>¥¯ÅžO_ÕøÌIÔ!ÏÞ§ñ9äy\__<Ÿ•½Èˆš·¡<_@/â—4û?×x‚.ùŠþ+äù*Žøš¾f{2š%!rœoþIÙÕ S Û”÷¶¾„{žZ–¢$¥¼#sò“]y¯é+ˆwE_P¼ë‰É49òµO¦dFÿ"3Œev^©—?ÂòÝ@¦oæÆ(N(ï½ÿ¢÷òbª,šž–ÿÞFþ ùOYäC‘ÿკžæÛìÓòŸgÈiÄìéO3XéiùßZ˜ìýiù¿Rä?ñѧÐìÐ{~asÍìÀœÀÜ x€ø@-Øê@=hÛLК@3h;@+h;A;Ø:@'è»Á°ìÝ`?8zÀApô‚àôƒ#à(8À 8N€“à8 †À0gÀ(8 ,0Îq0&Á˜çÁ ¸.‚Y0æÁ¸.ƒE°®€«À–Á5pÜ+à&Xk`Ü·ÁØwÂëûïÛ™T¦9€ð„ |á@øÂ>€ð„ |á@øÂ>€ð„ |á@øÂ>€ð„ |á@øÂ>€ð„ |á@øÂ>€ð„ |á@øÂ>€ð„ |á@øÂ>€ð„ |á@øÂ>€ð„ |á@øÂ>€ð„ |á@øÂ>€ð„ |á@øÂ>€ð„ |á@øÂ>€ð„ ¼þkê}Œâ¾æ<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>ðy„Ï#|áóŸGø<Âç>¯…oÑ÷ÊÞÏRÒB±t ÅÒ-K·P,ÝÂXÑBÅt Ó-TL·PrÝ2èµ`¨õ l0A#hÍ ì­  ìí`è  ì{À^°tƒýàèÁ!Ð ƒ>ÐŽ€£àƒà88N‚Sà4Ã`œ£à,°À8ÆÁ˜S`œ3à¸fÁ˜ ฬ¼ŸÑwKÞ'Flÿ]~Ò endstream endobj startxref 639802 %%EOF Seurat/build/stage23.rdb0000644000176200001440000000654014744474057014602 0ustar liggesusers‹Í\{WÜÆ ûàmðƒ`ÇŽ!vÁÎæ!6Á8¥Ç¯®I듪qµ«YP­•¶’Ö˜pÜï׿ûzòâΕ®vG³£=X×çŒÍýÍ}ÌK—c’$夑‘œ”ñ"ýoH’†çéϼŸG¤QŠ«Kò÷Ä$¶êM®˶õöø€˜·7eÍ’MË•‰¦»ð‡CÕÔ$‰¶Ù½¶PÕ^¹ê•Ø‹;Ïž<Ù}ºÏWvìºM”Æ$üäSê”Õ.†®*Ò«ºA¨8"ùÿ~åª ïšuŽBþ‡ýGkw¹z%bÖ-M78 +çMµI®ÙÒn§é7î‚QW§¸j³EMÁ¶ùåç¹û/ò-× Õ ZÎÝ|þìÅÞ˺ØÊûѨ)1€Gí~Åm¶*Uúß—‡ÕÚ7*ÕZ[74õÎݯïÝkÔîÞ]¯¼ mêåJS5+{¦KÀåÕcb;å*ïÙÜ‘Æ)X>«Ÿt@|ô=]‡FUéDJÐPÈ]CcþeCüe#û»/1èrï¹0[c Ô¦õFÞ'¢QY’ŸDuˆŸ šUo7‰éª®n™²nÊÕŠŽF¦¿ø²\ N–ïr¬ \IÍ;¶ù@ý:ƒXÐÀa(Dgš Å(rÞ­~' Ã[ñ2Ê—“jÍ+~¦ Õ!^AùÊà]êçÄòÿá®KˆWPNd#¡Ö‚¢ºêDèBœC9™QRùÔÄ –Œ|s¡ã¹¿s"ØåÑ!y4R)©‘"œãê®!Jœ<:$Jl•TÎõó bIèœñ³ÒÉWwž=Üð)  Ä’Ò,3\/ÇæUDΠ<“š×˜,[µº»›P IŽ¡<–¡&q-->¡Q$1š)¡«ÔB¶~P¶‰Ö®{+Š-y¡UWâdHIWQ¾ššàY¦‹Xõ˜òzúÃãÇñi#•ñΦ¤uQ–DuÛ6q3›@6€8ô¦ÍEY6¼$LÌk¹Lfš‹7dÙ©«){ì Ìü5ÕMmSH ðÊ7R“,Èr¹\ŽMf LKÝ@!5™ÜJl"L€³«úÌfÛ¶£ˆfÛ ÓA¸`ôl;ƒÝ0—´ûÞlûQZ:³’ŸÜbIH:#Z¡ü).&7h©ˆ8r"n^ Ã|ènË øL#^@ùBªU¬ÐVÁÉAln·×Q^Ï,«òŠ¡›¯%½²Z0!s=˜ð{ð,©Ï¯#.£¼œ´=-Ï!n ¼‘¡…ê–&v@Ý âm”o§vŠr⌺ƒxå{Ú@wI3B-®¤M”7?ô‚úß3ˆeÐ4.¡L>õrýE|LṉQC.ÏéÚ^÷7r£mÖý1$6ÑiÄ”WÎ?’/£¿o¢|sð!êo1ˆeÐ4˜Ó¾sŒä©ðî/&Ç9Œâ9̸¢EôêSµId«!kz“˜¥§rw£Ú°l¹nÙ6IÊ<(ßuñ¼Cœ9&”vPÞ|lú‡ b4 æ\îC<ïĤ6Ñ 8Žòxf‘}=ˆlÿh"™¹‡“€êâM” ›ñByx å0L‚úU± šsàuŽ¡\ Μb²»†| ãècFÑ|k[~CaÄ4¢;§b®%·’2¶ð âïQN´ªŒÛ×Ѓ€ß üÍàƒ Ôo1ˆeÐ4>F xNkj#Éí¥ëÍ€é×Ô9þÌÆiÂÚ´ì¦jè?-8]ÕM9×iÄU”“ U±§¹ÈCàrñk”¿Î0Á"6î n ñ.ÊwÏ?¯¯côÞC9Ñ=]BúM± šsl~Žy=ΜúÇ$ø‰ä'4àŒÔ¹9˜er/;+ÞGLmøUü䎗7PNt–ar‚Ùø ʉ¦±xÉ ên#n¡œhÚŠ—ÜŸ`~‹ò·ƒÏ*PŸA,ƒ¦!£<Ÿä.—Ë1‰}*ù‰ 8ŠòhfI=·mxÇ9r‹æ ÍiË„¥h’ˆ (/d–Íý#ÓȬ –Q.Ÿ:ƒºEÄ Ê•óOçO1h×Q^|ú ±dÔû1E âU {»½ ¥ÍáT&Xðó¬ƒX&«06ˆ¿ƒÉaŠ7527?“ü‘ 0Õ>$^n~†QÈ<¶‘2Bå#Ý=d·í2<¥!«šFT:šên\§Á)Äu”×3³OAy£m‘Ñ(K6…–0mL—Bü¤›Îç豤´Ê ÿ¨h\Z¿C¦zðH¨uBшS·õV÷ªÇ( qùÆÊ2†G€©CE¸pû˜½[øÄ¿[øïÆ=ƒuÈâÊK‰çÓp –Aû‘¹ƒ™a8maXGºy¢¹{¾Ž¬ÚDVߨº¡Ö ²—?s¦ŸásRéÍk» bI6†t1´cSmêõG†÷Z0ÕÎJÑÃMIqØ;“=! ׯ¥‰ ¨1ù¾—M:û¥ƒÉ‡ŸT4ÊØ§Óm_S¯9aß3Æ –ŒÖœŸýÅÖÝÓÒ9&ãuÉ_ü>BùQ† Òî3kï¹î\õQÛ<ò{µ–üö/"Ê(ËI;ÑÓ2î(¥ïQþ~ðaêÿÀ –Œ¼CQ ÇŠˆhèôFêKePŸc0Ýj§çì9yèÝ–ü,¼„r¢G["!d}è\Pér¸Íèöõ†©….]è±-DeÇáÈéÛn^Áw݃ Æ…•j–¡õVXAoÃaÛ»ÒÃòÅÁ9¶È\{Žk[¡øV-j5TeŒæC»é}I‚©uAÐ3ÎF&Í®·j³e6 ó=‰Š'LÓ=cñ¾EzDi½ô?¬e‘˜šÎÆÆbO+oTû”V‚ÓB>v8ËtÖ}ÓsR±ITq~SÛÔo¶méÎûC¬™…APP ÍrY‡ˆ†Xf‹Õ©WŒh‘;ý‰äH§»‚<ÌmÛB£„`ü§ÞdÝ)ò{ºÊgÚ¨LãìA§¥¶ ¨Œ Ýy`ƒZÐQ«í†;9 Q´H]WpŸ{åÍ©†s­£S WTªÚ³VˆÿXn#ŠÖ`=?.˜@M×n›}¸M*-:ìó@tf×úT„‡ÏQ®íOmëL×y×ýÔ齤ÀÇY(7ºûBvß¿Ë÷W1Þ*ð”üß—@!¬2†¶ù÷þþ ø}g³yÖ/hñ >¯´»âª6©TÔ*þ.´â;tðè|kœ¿úC~K3Ï«‰‚Gã«Üì •PxÀß^=¯./n‚}ULð€69óáDÄLûXÝ'/™Ž~”¼£K¸•:1èvåí»XMœøÞ½{wâ ‚>®c¿7`Rö±¤Ôôš¿ÈʹŠA¶6à<ÊóIºÀÍ-Û:0TïûzpzˆîÁߺNãdqœDÿtï+ìÒWá®&óP¯wüÈùy‡Iœ ½“SöΓô=$ (øhJBÒ%e§ºýÔÛ gAý+ïtèäÐu[Îf¥m—«k4jáÑ¢²eTpúÛ¢u^œ º;‹]|‚ò“LBŒ®GÊ‚d3Ê]åпhæÈ¢^±/þ­Ka.ùÐ&8¶@ ïû{¦,¼úmüÕ·c‹^×°ïýˆòiíp¦cÈéÀ>{¦¦{ Ó,,ô ¾…t_´Øç(~Bù§Ì¦Áîêx÷ÅNuïùþÞ³§ÙØ"ÁZ˜ámö!)ÁZ8á8Øañ²0Áýø&ðÏ£{ÿ)öPAYÉd<Q4KϦßkgXÛReѽ\Þ>@ùAjÏ>~¢ê&ݹ›$#?ïÄ÷s³C!Ú ìíÊZæ£#·wt o<ªnÑBi”í—K-›´èLêíwïÿW þ!¡"oÒYQ«Òoÿ„¤Ñ§\Seurat/man/0000755000176200001440000000000014744463014012277 5ustar liggesusersSeurat/man/AddAzimuthScores.Rd0000644000176200001440000000114514731364135016000 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{AddAzimuthScores} \alias{AddAzimuthScores} \title{Add Azimuth Scores} \usage{ AddAzimuthScores(object, filename) } \arguments{ \item{object}{A \code{\link[SeuratObject]{Seurat}} object} \item{filename}{Path to Azimuth mapping scores file} } \value{ \code{object} with the mapping scores added } \description{ Add mapping and prediction scores from Azimuth to a \code{\link[SeuratObject]{Seurat}} object } \examples{ \dontrun{ object <- AddAzimuthScores(object, filename = "azimuth_pred.tsv") } } \keyword{internal} Seurat/man/TransferSketchLabels.Rd0000644000176200001440000000341514731364135016642 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sketching.R \name{TransferSketchLabels} \alias{TransferSketchLabels} \title{Transfer data from sketch data to full data} \usage{ TransferSketchLabels( object, sketched.assay = "sketch", reduction, dims, refdata = NULL, k = 50, reduction.model = NULL, neighbors = NULL, recompute.neighbors = FALSE, recompute.weights = FALSE, verbose = TRUE ) } \arguments{ \item{object}{A Seurat object.} \item{sketched.assay}{Sketched assay name. Default is 'sketch'.} \item{reduction}{Dimensional reduction name to use for label transfer.} \item{dims}{An integer vector indicating which dimensions to use for label transfer.} \item{refdata}{A list of character strings indicating the metadata columns containing labels to transfer. Default is NULL. Similar to refdata in `MapQuery`} \item{k}{Number of neighbors to use for label transfer. Default is 50.} \item{reduction.model}{Dimensional reduction model to use for label transfer. Default is NULL.} \item{neighbors}{An object storing the neighbors found during the sketching process. Default is NULL.} \item{recompute.neighbors}{Whether to recompute the neighbors for label transfer. Default is FALSE.} \item{recompute.weights}{Whether to recompute the weights for label transfer. Default is FALSE.} \item{verbose}{Print progress and diagnostic messages} } \value{ A Seurat object with transferred labels stored in the metadata. If a UMAP model is provided, the full data are also projected onto the UMAP space, with the results stored in a new reduction, full.`reduction.model` } \description{ This function transfers cell type labels from a sketched dataset to a full dataset based on the similarities in the lower dimensional space. } \concept{sketching} Seurat/man/UpdateSCTAssays.Rd0000644000176200001440000000074114731364135015550 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{UpdateSCTAssays} \alias{UpdateSCTAssays} \title{Update pre-V4 Assays generated with SCTransform in the Seurat to the new SCTAssay class} \usage{ UpdateSCTAssays(object) } \arguments{ \item{object}{A Seurat object} } \value{ A Seurat object with updated SCTAssays } \description{ Update pre-V4 Assays generated with SCTransform in the Seurat to the new SCTAssay class } \concept{objects} Seurat/man/ReadSTARsolo.Rd0000644000176200001440000000061614731364134015032 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convenience.R \name{ReadSTARsolo} \alias{ReadSTARsolo} \title{Read output from STARsolo} \usage{ ReadSTARsolo(data.dir, ...) } \arguments{ \item{data.dir}{Directory containing the data files} \item{...}{Extra parameters passed to \code{\link{ReadMtx}}} } \description{ Read output from STARsolo } \concept{convenience} Seurat/man/DimHeatmap.Rd0000644000176200001440000000463314731364134014604 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R, R/convenience.R \name{DimHeatmap} \alias{DimHeatmap} \alias{PCHeatmap} \title{Dimensional reduction heatmap} \usage{ DimHeatmap( object, dims = 1, nfeatures = 30, cells = NULL, reduction = "pca", disp.min = -2.5, disp.max = NULL, balanced = TRUE, projected = FALSE, ncol = NULL, fast = TRUE, raster = TRUE, slot = "scale.data", assays = NULL, combine = TRUE ) PCHeatmap(object, ...) } \arguments{ \item{object}{Seurat object} \item{dims}{Dimensions to plot} \item{nfeatures}{Number of genes to plot} \item{cells}{A list of cells to plot. If numeric, just plots the top cells.} \item{reduction}{Which dimensional reduction to use} \item{disp.min}{Minimum display value (all values below are clipped)} \item{disp.max}{Maximum display value (all values above are clipped); defaults to 2.5 if \code{slot} is 'scale.data', 6 otherwise} \item{balanced}{Plot an equal number of genes with both + and - scores.} \item{projected}{Use the full projected dimensional reduction} \item{ncol}{Number of columns to plot} \item{fast}{If true, use \code{image} to generate plots; faster than using ggplot2, but not customizable} \item{raster}{If true, plot with geom_raster, else use geom_tile. geom_raster may look blurry on some viewing applications such as Preview due to how the raster is interpolated. Set this to FALSE if you are encountering that issue (note that plots may take longer to produce/render).} \item{slot}{Data slot to use, choose from 'raw.data', 'data', or 'scale.data'} \item{assays}{A vector of assays to pull data from} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} \item{...}{Extra parameters passed to \code{DimHeatmap}} } \value{ No return value by default. If using fast = FALSE, will return a \code{\link[patchwork]{patchwork}ed} ggplot object if combine = TRUE, otherwise returns a list of ggplot objects } \description{ Draws a heatmap focusing on a principal component. Both cells and genes are sorted by their principal component scores. Allows for nice visualization of sources of heterogeneity in the dataset. } \examples{ data("pbmc_small") DimHeatmap(object = pbmc_small) } \seealso{ \code{\link[graphics]{image}} \code{\link[ggplot2]{geom_raster}} } \concept{convenience} \concept{visualization} Seurat/man/ImageDimPlot.Rd0000644000176200001440000000645614744456127015123 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{ImageDimPlot} \alias{ImageDimPlot} \title{Spatial Cluster Plots} \usage{ ImageDimPlot( object, fov = NULL, boundaries = NULL, group.by = NULL, split.by = NULL, cols = NULL, shuffle.cols = FALSE, size = 0.5, molecules = NULL, mols.size = 0.1, mols.cols = NULL, mols.alpha = 1, nmols = 1000, alpha = 1, border.color = "white", border.size = NULL, na.value = "grey50", dark.background = TRUE, crop = FALSE, cells = NULL, overlap = FALSE, axes = FALSE, combine = TRUE, coord.fixed = TRUE, flip_xy = TRUE ) } \arguments{ \item{object}{A \code{\link[SeuratObject]{Seurat}} object} \item{fov}{Name of FOV to plot} \item{boundaries}{A vector of segmentation boundaries per image to plot; can be a character vector, a named character vector, or a named list. Names should be the names of FOVs and values should be the names of segmentation boundaries} \item{group.by}{Name of one or more metadata columns to group (color) cells by (for example, orig.ident); pass 'ident' to group by identity class} \item{split.by}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity} \item{cols}{Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. See \code{\link{DiscretePalette}} for details.} \item{shuffle.cols}{Randomly shuffle colors when a palette or vector of colors is provided to \code{cols}} \item{size}{Point size for cells when plotting centroids} \item{molecules}{A vector of molecules to plot} \item{mols.size}{Point size for molecules} \item{mols.cols}{A vector of color for molecules. The "Set1" palette from RColorBrewer is used by default.} \item{mols.alpha}{Alpha value for molecules, should be between 0 and 1} \item{nmols}{Max number of each molecule specified in `molecules` to plot} \item{alpha}{Alpha value for plotting (default is 1)} \item{border.color}{Color of cell segmentation border; pass \code{NA} to suppress borders for segmentation-based plots} \item{border.size}{Thickness of cell segmentation borders; pass \code{NA} to suppress borders for centroid-based plots} \item{na.value}{Color value for NA points when using custom scale} \item{dark.background}{Set plot background to black} \item{crop}{Crop the plots to area with cells only} \item{cells}{Vector of cells to plot (default is all cells)} \item{overlap}{Overlay boundaries from a single image to create a single plot; if \code{TRUE}, then boundaries are stacked in the order they're given (first is lowest)} \item{axes}{Keep axes and panel background} \item{combine}{Combine plots into a single \code{patchwork} ggplot object.If \code{FALSE}, return a list of ggplot objects} \item{coord.fixed}{Plot cartesian coordinates with fixed aspect ratio} \item{flip_xy}{Flag to flip X and Y axes. Default is FALSE.} } \value{ If \code{combine = TRUE}, a \code{patchwork} ggplot object; otherwise, a list of ggplot objects } \description{ Visualize clusters or other categorical groupings in a spatial context } \concept{spatial} \concept{visualization} Seurat/man/DotPlot.Rd0000644000176200001440000000530014744456127014160 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{DotPlot} \alias{DotPlot} \alias{SplitDotPlotGG} \title{Dot plot visualization} \usage{ DotPlot( object, features, assay = NULL, cols = c("lightgrey", "blue"), col.min = -2.5, col.max = 2.5, dot.min = 0, dot.scale = 6, idents = NULL, group.by = NULL, split.by = NULL, cluster.idents = FALSE, scale = TRUE, scale.by = "radius", scale.min = NA, scale.max = NA ) } \arguments{ \item{object}{Seurat object} \item{features}{Input vector of features, or named list of feature vectors if feature-grouped panels are desired (replicates the functionality of the old SplitDotPlotGG)} \item{assay}{Name of assay to use, defaults to the active assay} \item{cols}{Colors to plot: the name of a palette from \code{RColorBrewer::brewer.pal.info}, a pair of colors defining a gradient, or 3+ colors defining multiple gradients (if split.by is set)} \item{col.min}{Minimum scaled average expression threshold (everything smaller will be set to this)} \item{col.max}{Maximum scaled average expression threshold (everything larger will be set to this)} \item{dot.min}{The fraction of cells at which to draw the smallest dot (default is 0). All cell groups with less than this expressing the given gene will have no dot drawn.} \item{dot.scale}{Scale the size of the points, similar to cex} \item{idents}{Identity classes to include in plot (default is all)} \item{group.by}{Factor to group the cells by} \item{split.by}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity see \code{\link{FetchData}} for more details} \item{cluster.idents}{Whether to order identities by hierarchical clusters based on given features, default is FALSE} \item{scale}{Determine whether the data is scaled, TRUE for default} \item{scale.by}{Scale the size of the points by 'size' or by 'radius'} \item{scale.min}{Set lower limit for scaling, use NA for default} \item{scale.max}{Set upper limit for scaling, use NA for default} } \value{ A ggplot object } \description{ Intuitive way of visualizing how feature expression changes across different identity classes (clusters). The size of the dot encodes the percentage of cells within a class, while the color encodes the AverageExpression level across all cells within a class (blue is high). } \examples{ data("pbmc_small") cd_genes <- c("CD247", "CD3E", "CD9") DotPlot(object = pbmc_small, features = cd_genes) pbmc_small[['groups']] <- sample(x = c('g1', 'g2'), size = ncol(x = pbmc_small), replace = TRUE) DotPlot(object = pbmc_small, features = cd_genes, split.by = 'groups') } \seealso{ \code{RColorBrewer::brewer.pal.info} } \concept{visualization} Seurat/man/BuildNicheAssay.Rd0000644000176200001440000000172514731364135015602 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{BuildNicheAssay} \alias{BuildNicheAssay} \title{Construct an assay for spatial niche analysis} \usage{ BuildNicheAssay( object, fov, group.by, assay = "niche", cluster.name = "niches", neighbors.k = 20, niches.k = 4 ) } \arguments{ \item{object}{A Seurat object} \item{fov}{FOV object to gather cell positions from} \item{group.by}{Cell classifications to count in spatial neighborhood} \item{assay}{Name for spatial neighborhoods assay} \item{cluster.name}{Name of output clusters} \item{neighbors.k}{Number of neighbors to consider for each cell} \item{niches.k}{Number of clusters to return based on the niche assay} } \value{ Seurat object containing a new assay } \description{ This function will construct a new assay where each feature is a cell label The values represents the sum of a particular cell label neighboring a given cell. } \concept{clustering} Seurat/man/ProjectCellEmbeddings.Rd0000644000176200001440000000554714731364134016770 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/integration.R \name{ProjectCellEmbeddings} \alias{ProjectCellEmbeddings} \alias{ProjectCellEmbeddings.Seurat} \alias{ProjectCellEmbeddings.Assay} \alias{ProjectCellEmbeddings.SCTAssay} \alias{ProjectCellEmbeddings.StdAssay} \alias{ProjectCellEmbeddings.default} \alias{ProjectCellEmbeddings.IterableMatrix} \title{Project query data to the reference dimensional reduction} \usage{ ProjectCellEmbeddings(query, ...) \method{ProjectCellEmbeddings}{Seurat}( query, reference, query.assay = NULL, reference.assay = NULL, reduction = "pca", dims = 1:50, normalization.method = c("LogNormalize", "SCT"), scale = TRUE, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) \method{ProjectCellEmbeddings}{Assay}( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) \method{ProjectCellEmbeddings}{SCTAssay}( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) \method{ProjectCellEmbeddings}{StdAssay}( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) \method{ProjectCellEmbeddings}{default}( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, features = NULL, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, ... ) \method{ProjectCellEmbeddings}{IterableMatrix}( query, reference, reference.assay = NULL, reduction = "pca", dims = 1:50, scale = TRUE, normalization.method = NULL, verbose = TRUE, features = features, nCount_UMI = NULL, feature.mean = NULL, feature.sd = NULL, block.size = 10000, ... ) } \arguments{ \item{query}{An object for query cells} \item{reference}{An object for reference cells} \item{query.assay}{Assay name for query object} \item{reference.assay}{Assay name for reference object} \item{reduction}{Name of dimensional reduction from reference object} \item{dims}{Dimensions used for reference dimensional reduction} \item{scale}{Determine if scale query data based on reference data variance} \item{verbose}{Print progress} \item{feature.mean}{Mean of features in reference} \item{feature.sd}{Standard variance of features in reference} } \value{ A matrix with projected cell embeddings } \description{ Project query data to the reference dimensional reduction } \keyword{internal} Seurat/man/MixscapeLDA.Rd0000644000176200001440000000323314731364135014661 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{MixscapeLDA} \alias{MixscapeLDA} \title{Linear discriminant analysis on pooled CRISPR screen data.} \usage{ MixscapeLDA( object, assay = NULL, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "LDA_", seed = 42, pc.assay = "PRTB", labels = "gene", nt.label = "NT", npcs = 10, verbose = TRUE, logfc.threshold = 0.25 ) } \arguments{ \item{object}{An object of class Seurat.} \item{assay}{Assay to use for performing Linear Discriminant Analysis (LDA).} \item{ndims.print}{Number of LDA dimensions to print.} \item{nfeatures.print}{Number of features to print for each LDA component.} \item{reduction.key}{Reduction key name.} \item{seed}{Value for random seed} \item{pc.assay}{Assay to use for running Principle components analysis.} \item{labels}{Meta data column with target gene class labels.} \item{nt.label}{Name of non-targeting cell class.} \item{npcs}{Number of principle components to use.} \item{verbose}{Print progress bar.} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.25. Increasing logfc.threshold speeds up the function, but can miss weaker signals.} } \value{ Returns a Seurat object with LDA added in the reduction slot. } \description{ This function performs unsupervised PCA on each mixscape class separately and projects each subspace onto all cells in the data. Finally, it uses the first 10 principle components from each projection as input to lda in MASS package together with mixscape class labels. } \concept{mixscape} Seurat/man/SCTResults.Rd0000644000176200001440000000263614731364134014607 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/objects.R \name{SCTResults} \alias{SCTResults} \alias{SCTResults<-} \alias{SCTResults.SCTModel} \alias{SCTResults<-.SCTModel} \alias{SCTResults.SCTAssay} \alias{SCTResults<-.SCTAssay} \alias{SCTResults.Seurat} \title{Get SCT results from an Assay} \usage{ SCTResults(object, ...) SCTResults(object, ...) <- value \method{SCTResults}{SCTModel}(object, slot, ...) \method{SCTResults}{SCTModel}(object, slot, ...) <- value \method{SCTResults}{SCTAssay}(object, slot, model = NULL, ...) \method{SCTResults}{SCTAssay}(object, slot, model = NULL, ...) <- value \method{SCTResults}{Seurat}(object, assay = "SCT", slot, model = NULL, ...) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods (not used)} \item{value}{new data to set} \item{slot}{Which slot to pull the SCT results from} \item{model}{Name of SCModel to pull result from. Available names can be retrieved with \code{levels}.} \item{assay}{Assay in the Seurat object to pull from} } \value{ Returns the value present in the requested slot for the requested group. If group is not specified, returns a list of slot results for each group unless there is only one group present (in which case it just returns the slot directly). } \description{ Pull the \code{\link{SCTResults}} information from an \code{\link{SCTAssay}} object. } \concept{objects} Seurat/man/ProjectIntegration.Rd0000644000176200001440000000435014731364134016401 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{ProjectIntegration} \alias{ProjectIntegration} \title{Integrate embeddings from the integrated sketched.assay} \usage{ ProjectIntegration( object, sketched.assay = "sketch", assay = "RNA", reduction = "integrated_dr", features = NULL, layers = "data", reduction.name = NULL, reduction.key = NULL, method = c("sketch", "data"), ratio = 0.8, sketched.layers = NULL, seed = 123, verbose = TRUE ) } \arguments{ \item{object}{A Seurat object with all cells for one dataset} \item{sketched.assay}{Assay name for sketched-cell expression (default is 'sketch')} \item{assay}{Assay name for original expression (default is 'RNA')} \item{reduction}{Dimensional reduction name for batch-corrected embeddings in the sketched object (default is 'integrated_dr')} \item{features}{Features used for atomic sketch integration} \item{layers}{Names of layers for correction.} \item{reduction.name}{Name to save new reduction as; defaults to \code{paste0(reduction, '.orig')}} \item{reduction.key}{Key for new dimensional reduction; defaults to creating one from \code{reduction.name}} \item{method}{Methods to construct sketch-cell representation for all cells (default is 'sketch'). Can be one of: \itemize{ \item \dQuote{\code{sketch}}: Use random sketched data slot \item \dQuote{\code{data}}: Use data slot }} \item{ratio}{Sketch ratio of data slot when \code{dictionary.method} is set to \dQuote{\code{sketch}}; defaults to 0.8} \item{sketched.layers}{Names of sketched layers, defaults to all layers of \dQuote{\code{object[[assay]]}}} \item{seed}{A positive integer. The seed for the random number generator, defaults to 123.} \item{verbose}{Print progress and message} } \value{ Returns a Seurat object with an integrated dimensional reduction } \description{ The main steps of this procedure are outlined below. For a more detailed description of the methodology, please see Hao, et al Biorxiv 2022: \doi{10.1101/2022.02.24.481684} } \details{ First learn a atom dictionary representation to reconstruct each cell. Then, using this dictionary representation, reconstruct the embeddings of each cell from the integrated atoms. } \concept{integration} Seurat/man/SpatialImage-class.Rd0000644000176200001440000000061414731364133016230 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{SpatialImage-class} \alias{SpatialImage-class} \title{The SpatialImage Class} \description{ For more details, please see the documentation in \code{\link[SeuratObject:SpatialImage]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:SpatialImage]{SeuratObject::SpatialImage-class}} } Seurat/man/merge.SCTAssay.Rd0000644000176200001440000000203114731364135015312 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{merge.SCTAssay} \alias{merge.SCTAssay} \title{Merge SCTAssay objects} \usage{ \method{merge}{SCTAssay}( x = NULL, y = NULL, add.cell.ids = NULL, merge.data = TRUE, na.rm = TRUE, ... ) } \arguments{ \item{x}{A \code{\link[SeuratObject]{Seurat}} object} \item{y}{A single \code{Seurat} object or a list of \code{Seurat} objects} \item{add.cell.ids}{A character vector of \code{length(x = c(x, y))}; appends the corresponding values to the start of each objects' cell names} \item{merge.data}{Merge the data slots instead of just merging the counts (which requires renormalization); this is recommended if the same normalization approach was applied to all objects} \item{na.rm}{If na.rm = TRUE, this will only preserve residuals that are present in all SCTAssays being merged. Otherwise, missing residuals will be populated with NAs.} \item{...}{Arguments passed to other methods} } \description{ Merge SCTAssay objects } \concept{objects} Seurat/man/FastRowScale.Rd0000644000176200001440000000130014731364135015115 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{FastRowScale} \alias{FastRowScale} \title{Scale and/or center matrix rowwise} \usage{ FastRowScale(mat, center = TRUE, scale = TRUE, scale_max = 10) } \arguments{ \item{mat}{A matrix} \item{center}{a logical value indicating whether to center the rows} \item{scale}{a logical value indicating whether to scale the rows} \item{scale_max}{clip all values greater than scale_max to scale_max. Don't clip if Inf.} } \value{ Returns the center/scaled matrix } \description{ Performs row scaling and/or centering. Equivalent to using t(scale(t(mat))) in R except in the case of NA values. } \concept{utilities} Seurat/man/Graph-class.Rd0000644000176200001440000000054214731364133014731 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{Graph-class} \alias{Graph-class} \title{The Graph Class} \description{ For more details, please see the documentation in \code{\link[SeuratObject:Graph]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:Graph]{SeuratObject::Graph-class}} } Seurat/man/SlideSeq-class.Rd0000644000176200001440000000145714731364135015411 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{SlideSeq-class} \alias{SlideSeq-class} \alias{SlideSeq} \title{The SlideSeq class} \description{ The SlideSeq class represents spatial information from the Slide-seq platform } \section{Slots}{ \describe{ \item{\code{coordinates}}{...} }} \section{Slots}{ \describe{ \item{\code{assay}}{Name of assay to associate image data with; will give this image priority for visualization when the assay is set as the active/default assay in a \code{Seurat} object} \item{\code{key}}{A one-length character vector with the object's key; keys must be one or more alphanumeric characters followed by an underscore \dQuote{\code{_}} (regex pattern \dQuote{\code{^[a-zA-Z][a-zA-Z0-9]*_$}})} } } \concept{spatial} Seurat/man/HVFInfo.SCTAssay.Rd0000644000176200001440000000140714731364135015460 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{HVFInfo.SCTAssay} \alias{HVFInfo.SCTAssay} \title{Get Variable Feature Information} \usage{ \method{HVFInfo}{SCTAssay}(object, method, status = FALSE, ...) } \arguments{ \item{object}{An object} \item{method}{method to determine variable features} \item{status}{Add variable status to the resulting data frame} \item{...}{Arguments passed to other methods} } \description{ Get variable feature information from \code{\link{SCTAssay}} objects } \examples{ \dontrun{ # Get the HVF info directly from an SCTAssay object pbmc_small <- SCTransform(pbmc_small) HVFInfo(pbmc_small[["SCT"]], method = 'sct')[1:5, ] } } \seealso{ \code{\link[SeuratObject]{HVFInfo}} } \concept{objects} Seurat/man/AugmentPlot.Rd0000644000176200001440000000151614731364134015027 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{AugmentPlot} \alias{AugmentPlot} \title{Augments ggplot2-based plot with a PNG image.} \usage{ AugmentPlot(plot, width = 10, height = 10, dpi = 100) } \arguments{ \item{plot}{A ggplot object} \item{width, height}{Width and height of PNG version of plot} \item{dpi}{Plot resolution} } \value{ A ggplot object } \description{ Creates "vector-friendly" plots. Does this by saving a copy of the plot as a PNG file, then adding the PNG image with \code{\link[ggplot2]{annotation_raster}} to a blank plot of the same dimensions as \code{plot}. Please note: original legends and axes will be lost during augmentation. } \examples{ \dontrun{ data("pbmc_small") plot <- DimPlot(object = pbmc_small) AugmentPlot(plot = plot) } } \concept{visualization} Seurat/man/FindSpatiallyVariableFeatures.Rd0000644000176200001440000000544514731364134020505 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing.R, % R/preprocessing5.R \name{FindSpatiallyVariableFeatures} \alias{FindSpatiallyVariableFeatures} \alias{FindSpatiallyVariableFeatures.default} \alias{FindSpatiallyVariableFeatures.Assay} \alias{FindSpatiallyVariableFeatures.Seurat} \alias{FindSpatiallyVariableFeatures.StdAssay} \title{Find spatially variable features} \usage{ FindSpatiallyVariableFeatures(object, ...) \method{FindSpatiallyVariableFeatures}{default}( object, spatial.location, selection.method = c("markvariogram", "moransi"), r.metric = 5, x.cuts = NULL, y.cuts = NULL, verbose = TRUE, ... ) \method{FindSpatiallyVariableFeatures}{Assay}( object, slot = "scale.data", spatial.location, selection.method = c("markvariogram", "moransi"), features = NULL, r.metric = 5, x.cuts = NULL, y.cuts = NULL, nfeatures = nfeatures, verbose = TRUE, ... ) \method{FindSpatiallyVariableFeatures}{Seurat}( object, assay = NULL, slot = "scale.data", features = NULL, image = NULL, selection.method = c("markvariogram", "moransi"), r.metric = 5, x.cuts = NULL, y.cuts = NULL, nfeatures = 2000, verbose = TRUE, ... ) \method{FindSpatiallyVariableFeatures}{StdAssay}( object, layer = "scale.data", spatial.location, selection.method = c("markvariogram", "moransi"), features = NULL, r.metric = 5, x.cuts = NULL, y.cuts = NULL, nfeatures = nfeatures, verbose = TRUE, ... ) } \arguments{ \item{object}{A Seurat object, assay, or expression matrix} \item{...}{Arguments passed to other methods} \item{spatial.location}{Coordinates for each cell/spot/bead} \item{selection.method}{Method for selecting spatially variable features. \itemize{ \item \code{markvariogram}: See \code{\link{RunMarkVario}} for details \item \code{moransi}: See \code{\link{RunMoransI}} for details. }} \item{r.metric}{r value at which to report the "trans" value of the mark variogram} \item{x.cuts}{Number of divisions to make in the x direction, helps define the grid over which binning is performed} \item{y.cuts}{Number of divisions to make in the y direction, helps define the grid over which binning is performed} \item{verbose}{Print messages and progress} \item{slot}{Slot in the Assay to pull data from} \item{features}{If provided, only compute on given features. Otherwise, compute for all features.} \item{nfeatures}{Number of features to mark as the top spatially variable.} \item{assay}{Assay to pull the features (marks) from} \item{image}{Name of image to pull the coordinates from} \item{layer}{Layer in the Assay5 to pull data from} } \description{ Identify features whose variability in expression can be explained to some degree by spatial location. } \concept{preprocessing} \concept{spatial} Seurat/man/STARmap-class.Rd0000644000176200001440000000130114731364135015133 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{STARmap-class} \alias{STARmap-class} \alias{STARmap} \title{The STARmap class} \description{ The STARmap class } \section{Slots}{ \describe{ \item{\code{assay}}{Name of assay to associate image data with; will give this image priority for visualization when the assay is set as the active/default assay in a \code{Seurat} object} \item{\code{key}}{A one-length character vector with the object's key; keys must be one or more alphanumeric characters followed by an underscore \dQuote{\code{_}} (regex pattern \dQuote{\code{^[a-zA-Z][a-zA-Z0-9]*_$}})} } } \concept{objects} \concept{spatial} Seurat/man/RunGraphLaplacian.Rd0000644000176200001440000000242714731364134016125 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/integration.R \name{RunGraphLaplacian} \alias{RunGraphLaplacian} \alias{RunGraphLaplacian.Seurat} \alias{RunGraphLaplacian.default} \title{Run Graph Laplacian Eigendecomposition} \usage{ RunGraphLaplacian(object, ...) \method{RunGraphLaplacian}{Seurat}( object, graph, reduction.name = "lap", reduction.key = "LAP_", n = 50, verbose = TRUE, ... ) \method{RunGraphLaplacian}{default}(object, n = 50, reduction.key = "LAP_", verbose = TRUE, ...) } \arguments{ \item{object}{A Seurat object} \item{...}{Arguments passed to eigs_sym} \item{graph}{The name of graph} \item{reduction.name}{dimensional reduction name, lap by default} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names. LAP by default} \item{n}{Total Number of Eigenvectors to compute and store (50 by default)} \item{verbose}{Print message and process} } \value{ Returns Seurat object with the Graph laplacian eigenvector calculation stored in the reductions slot } \description{ Run a graph laplacian dimensionality reduction. It is used as a low dimensional representation for a cell-cell graph. The input graph should be symmetric } \concept{dimensional_reduction} Seurat/man/MappingScore.Rd0000644000176200001440000000540414731364134015157 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/integration.R \name{MappingScore} \alias{MappingScore} \alias{MappingScore.default} \alias{MappingScore.AnchorSet} \title{Metric for evaluating mapping success} \usage{ MappingScore(anchors, ...) \method{MappingScore}{default}( anchors, combined.object, query.neighbors, ref.embeddings, query.embeddings, kanchors = 50, ndim = 50, ksmooth = 100, ksnn = 20, snn.prune = 0, subtract.first.nn = TRUE, nn.method = "annoy", n.trees = 50, query.weights = NULL, verbose = TRUE, ... ) \method{MappingScore}{AnchorSet}( anchors, kanchors = 50, ndim = 50, ksmooth = 100, ksnn = 20, snn.prune = 0, subtract.first.nn = TRUE, nn.method = "annoy", n.trees = 50, query.weights = NULL, verbose = TRUE, ... ) } \arguments{ \item{anchors}{AnchorSet object or just anchor matrix from the Anchorset object returned from FindTransferAnchors} \item{...}{Reserved for internal use} \item{combined.object}{Combined object (ref + query) from the Anchorset object returned} \item{query.neighbors}{Neighbors object computed on query cells} \item{ref.embeddings}{Reference embeddings matrix} \item{query.embeddings}{Query embeddings matrix} \item{kanchors}{Number of anchors to use in projection steps when computing weights} \item{ndim}{Number of dimensions to use when working with low dimensional projections of the data} \item{ksmooth}{Number of cells to average over when computing transition probabilities} \item{ksnn}{Number of cells to average over when determining the kernel bandwidth from the SNN graph} \item{snn.prune}{Amount of pruning to apply to edges in SNN graph} \item{subtract.first.nn}{Option to the scoring function when computing distances to subtract the distance to the first nearest neighbor} \item{nn.method}{Nearest neighbor method to use (annoy or RANN)} \item{n.trees}{More trees gives higher precision when using annoy approximate nearest neighbor search} \item{query.weights}{Query weights matrix for reuse} \item{verbose}{Display messages/progress} } \value{ Returns a vector of cell scores } \description{ This metric was designed to help identify query cells that aren't well represented in the reference dataset. The intuition for the score is that we are going to project the query cells into a reference-defined space and then project them back onto the query. By comparing the neighborhoods before and after projection, we identify cells who's local neighborhoods are the most affected by this transformation. This could be because there is a population of query cells that aren't present in the reference or the state of the cells in the query is significantly different from the equivalent cell type in the reference. } \concept{integration} Seurat/man/HarmonyIntegration.Rd0000644000176200001440000000562114731364134016412 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration5.R \name{HarmonyIntegration} \alias{HarmonyIntegration} \title{Harmony Integration} \usage{ HarmonyIntegration( object, orig, features = NULL, scale.layer = "scale.data", new.reduction = "harmony", layers = NULL, npcs = 50L, key = "harmony_", theta = NULL, lambda = NULL, sigma = 0.1, nclust = NULL, tau = 0, block.size = 0.05, max.iter.harmony = 10L, max.iter.cluster = 20L, epsilon.cluster = 1e-05, epsilon.harmony = 1e-04, verbose = TRUE, ... ) } \arguments{ \item{object}{An \code{\link[SeuratObject]{Assay5}} object} \item{orig}{A \link[SeuratObject:DimReduc]{dimensional reduction} to correct} \item{features}{Ignored} \item{scale.layer}{Ignored} \item{new.reduction}{Name of new integrated dimensional reduction} \item{layers}{Ignored} \item{npcs}{If doing PCA on input matrix, number of PCs to compute} \item{key}{Key for Harmony dimensional reduction} \item{theta}{Diversity clustering penalty parameter} \item{lambda}{Ridge regression penalty parameter} \item{sigma}{Width of soft kmeans clusters} \item{nclust}{Number of clusters in model} \item{tau}{Protection against overclustering small datasets with large ones} \item{block.size}{What proportion of cells to update during clustering} \item{max.iter.harmony}{Maximum number of rounds to run Harmony} \item{max.iter.cluster}{Maximum number of rounds to run clustering at each round of Harmony} \item{epsilon.cluster}{Convergence tolerance for clustering round of Harmony} \item{epsilon.harmony}{Convergence tolerance for Harmony} \item{verbose}{Whether to print progress messages. TRUE to print, FALSE to suppress} \item{...}{Ignored} } \value{ ... } \description{ Harmony Integration } \note{ This function requires the \href{https://cran.r-project.org/package=harmony}{\pkg{harmony}} package to be installed } \examples{ \dontrun{ # Preprocessing obj <- SeuratData::LoadData("pbmcsca") obj[["RNA"]] <- split(obj[["RNA"]], f = obj$Method) obj <- NormalizeData(obj) obj <- FindVariableFeatures(obj) obj <- ScaleData(obj) obj <- RunPCA(obj) # After preprocessing, we integrate layers with added parameters specific to Harmony: obj <- IntegrateLayers(object = obj, method = HarmonyIntegration, orig.reduction = "pca", new.reduction = 'harmony', verbose = FALSE) # Modifying Parameters # We can also add arguments specific to Harmony such as theta, to give more diverse clusters obj <- IntegrateLayers(object = obj, method = HarmonyIntegration, orig.reduction = "pca", new.reduction = 'harmony', verbose = FALSE, theta = 3) # Integrating SCTransformed data obj <- SCTransform(object = obj) obj <- IntegrateLayers(object = obj, method = HarmonyIntegration, orig.reduction = "pca", new.reduction = 'harmony', assay = "SCT", verbose = FALSE) } } \seealso{ \code{\link[harmony:HarmonyMatrix]{harmony::HarmonyMatrix}()} } \concept{integration} Seurat/man/FindIntegrationAnchors.Rd0000644000176200001440000001350214731364134017170 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{FindIntegrationAnchors} \alias{FindIntegrationAnchors} \title{Find integration anchors} \usage{ FindIntegrationAnchors( object.list = NULL, assay = NULL, reference = NULL, anchor.features = 2000, scale = TRUE, normalization.method = c("LogNormalize", "SCT"), sct.clip.range = NULL, reduction = c("cca", "rpca", "jpca", "rlsi"), l2.norm = TRUE, dims = 1:30, k.anchor = 5, k.filter = 200, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, eps = 0, verbose = TRUE ) } \arguments{ \item{object.list}{A list of \code{\link{Seurat}} objects between which to find anchors for downstream integration.} \item{assay}{A vector of assay names specifying which assay to use when constructing anchors. If NULL, the current default assay for each object is used.} \item{reference}{A vector specifying the object/s to be used as a reference during integration. If NULL (default), all pairwise anchors are found (no reference/s). If not NULL, the corresponding objects in \code{object.list} will be used as references. When using a set of specified references, anchors are first found between each query and each reference. The references are then integrated through pairwise integration. Each query is then mapped to the integrated reference.} \item{anchor.features}{Can be either: \itemize{ \item{A numeric value. This will call \code{\link{SelectIntegrationFeatures}} to select the provided number of features to be used in anchor finding} \item{A vector of features to be used as input to the anchor finding process} }} \item{scale}{Whether or not to scale the features provided. Only set to FALSE if you have previously scaled the features you want to use for each object in the object.list} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{sct.clip.range}{Numeric of length two specifying the min and max values the Pearson residual will be clipped to} \item{reduction}{Dimensional reduction to perform when finding anchors. Can be one of: \itemize{ \item{cca: Canonical correlation analysis} \item{rpca: Reciprocal PCA} \item{jpca: Joint PCA} \item{rlsi: Reciprocal LSI} }} \item{l2.norm}{Perform L2 normalization on the CCA cell embeddings after dimensional reduction} \item{dims}{Which dimensions to use from the CCA to specify the neighbor search space} \item{k.anchor}{How many neighbors (k) to use when picking anchors} \item{k.filter}{How many neighbors (k) to use when filtering anchors} \item{k.score}{How many neighbors (k) to use when scoring anchors} \item{max.features}{The maximum number of features to use when specifying the neighborhood search space in the anchor filtering} \item{nn.method}{Method for nearest neighbor finding. Options include: rann, annoy} \item{n.trees}{More trees gives higher precision when using annoy approximate nearest neighbor search} \item{eps}{Error bound on the neighbor finding algorithm (from RANN/Annoy)} \item{verbose}{Print progress bars and output} } \value{ Returns an \code{\link{AnchorSet}} object that can be used as input to \code{\link{IntegrateData}}. } \description{ Find a set of anchors between a list of \code{\link{Seurat}} objects. These anchors can later be used to integrate the objects using the \code{\link{IntegrateData}} function. } \details{ The main steps of this procedure are outlined below. For a more detailed description of the methodology, please see Stuart, Butler, et al Cell 2019: \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} First, determine anchor.features if not explicitly specified using \code{\link{SelectIntegrationFeatures}}. Then for all pairwise combinations of reference and query datasets: \itemize{ \item{Perform dimensional reduction on the dataset pair as specified via the \code{reduction} parameter. If \code{l2.norm} is set to \code{TRUE}, perform L2 normalization of the embedding vectors.} \item{Identify anchors - pairs of cells from each dataset that are contained within each other's neighborhoods (also known as mutual nearest neighbors).} \item{Filter low confidence anchors to ensure anchors in the low dimension space are in broad agreement with the high dimensional measurements. This is done by looking at the neighbors of each query cell in the reference dataset using \code{max.features} to define this space. If the reference cell isn't found within the first \code{k.filter} neighbors, remove the anchor.} \item{Assign each remaining anchor a score. For each anchor cell, determine the nearest \code{k.score} anchors within its own dataset and within its pair's dataset. Based on these neighborhoods, construct an overall neighbor graph and then compute the shared neighbor overlap between anchor and query cells (analogous to an SNN graph). We use the 0.01 and 0.90 quantiles on these scores to dampen outlier effects and rescale to range between 0-1.} } } \examples{ \dontrun{ # to install the SeuratData package see https://github.com/satijalab/seurat-data library(SeuratData) data("panc8") # panc8 is a merged Seurat object containing 8 separate pancreas datasets # split the object by dataset pancreas.list <- SplitObject(panc8, split.by = "tech") # perform standard preprocessing on each object for (i in 1:length(pancreas.list)) { pancreas.list[[i]] <- NormalizeData(pancreas.list[[i]], verbose = FALSE) pancreas.list[[i]] <- FindVariableFeatures( pancreas.list[[i]], selection.method = "vst", nfeatures = 2000, verbose = FALSE ) } # find anchors anchors <- FindIntegrationAnchors(object.list = pancreas.list) # integrate data integrated <- IntegrateData(anchorset = anchors) } } \references{ Stuart T, Butler A, et al. Comprehensive Integration of Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031} } \concept{integration} Seurat/man/NormalizeData.Rd0000644000176200001440000000407014731364134015320 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing.R \name{NormalizeData} \alias{NormalizeData} \alias{NormalizeData.V3Matrix} \alias{NormalizeData.Assay} \alias{NormalizeData.Seurat} \title{Normalize Data} \usage{ NormalizeData(object, ...) \method{NormalizeData}{V3Matrix}( object, normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, block.size = NULL, verbose = TRUE, ... ) \method{NormalizeData}{Assay}( object, normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, verbose = TRUE, ... ) \method{NormalizeData}{Seurat}( object, assay = NULL, normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, verbose = TRUE, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{normalization.method}{Method for normalization. \itemize{ \item \dQuote{\code{LogNormalize}}: Feature counts for each cell are divided by the total counts for that cell and multiplied by the \code{scale.factor}. This is then natural-log transformed using \code{log1p} \item \dQuote{\code{CLR}}: Applies a centered log ratio transformation \item \dQuote{\code{RC}}: Relative counts. Feature counts for each cell are divided by the total counts for that cell and multiplied by the \code{scale.factor}. No log-transformation is applied. For counts per million (CPM) set \code{scale.factor = 1e6} }} \item{scale.factor}{Sets the scale factor for cell-level normalization} \item{margin}{If performing CLR normalization, normalize across features (1) or cells (2)} \item{block.size}{How many cells should be run in each chunk, will try to split evenly across threads} \item{verbose}{display progress bar for normalization procedure} \item{assay}{Name of assay to use} } \value{ Returns object after normalization } \description{ Normalize the count data present in a given assay. } \examples{ \dontrun{ data("pbmc_small") pbmc_small pmbc_small <- NormalizeData(object = pbmc_small) } } \concept{preprocessing} Seurat/man/DiscretePalette.Rd0000644000176200001440000000207314731364134015650 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{DiscretePalette} \alias{DiscretePalette} \title{Discrete colour palettes from pals} \usage{ DiscretePalette(n, palette = NULL, shuffle = FALSE) } \arguments{ \item{n}{Number of colours to be generated.} \item{palette}{Options are "alphabet", "alphabet2", "glasbey", "polychrome", "stepped", and "parade". Can be omitted and the function will use the one based on the requested n.} \item{shuffle}{Shuffle the colors in the selected palette.} } \value{ A vector of colors } \description{ These are included here because pals depends on a number of compiled packages, and this can lead to increases in run time for Travis, and generally should be avoided when possible. } \details{ These palettes are a much better default for data with many classes than the default ggplot2 palette. Many thanks to Kevin Wright for writing the pals package. Taken from the pals package (Licence: GPL-3). \url{https://cran.r-project.org/package=pals} Credit: Kevin Wright } \concept{visualization} Seurat/man/SubsetByBarcodeInflections.Rd0000644000176200001440000000203514731364135020004 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{SubsetByBarcodeInflections} \alias{SubsetByBarcodeInflections} \title{Subset a Seurat Object based on the Barcode Distribution Inflection Points} \usage{ SubsetByBarcodeInflections(object) } \arguments{ \item{object}{Seurat object} } \value{ Returns a subsetted Seurat object. } \description{ This convenience function subsets a Seurat object based on calculated inflection points. } \details{ See [CalculateBarcodeInflections()] to calculate inflection points and [BarcodeInflectionsPlot()] to visualize and test inflection point calculations. } \examples{ data("pbmc_small") pbmc_small <- CalculateBarcodeInflections( object = pbmc_small, group.column = 'groups', threshold.low = 20, threshold.high = 30 ) SubsetByBarcodeInflections(object = pbmc_small) } \seealso{ \code{\link{CalculateBarcodeInflections}} \code{\link{BarcodeInflectionsPlot}} } \author{ Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} } \concept{preprocessing} Seurat/man/FindMarkers.Rd0000644000176200001440000002672214744456127015013 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/differential_expression.R \name{FindMarkers} \alias{FindMarkers} \alias{FindMarkersNode} \alias{FindMarkers.default} \alias{FindMarkers.Assay} \alias{FindMarkers.SCTAssay} \alias{FindMarkers.DimReduc} \alias{FindMarkers.Seurat} \title{Gene expression markers of identity classes} \usage{ FindMarkers(object, ...) \method{FindMarkers}{default}( object, slot = "data", cells.1 = NULL, cells.2 = NULL, features = NULL, logfc.threshold = 0.1, test.use = "wilcox", min.pct = 0.01, min.diff.pct = -Inf, verbose = TRUE, only.pos = FALSE, max.cells.per.ident = Inf, random.seed = 1, latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, fc.results = NULL, densify = FALSE, ... ) \method{FindMarkers}{Assay}( object, slot = "data", cells.1 = NULL, cells.2 = NULL, features = NULL, test.use = "wilcox", fc.slot = "data", pseudocount.use = 1, norm.method = NULL, mean.fxn = NULL, fc.name = NULL, base = 2, ... ) \method{FindMarkers}{SCTAssay}( object, cells.1 = NULL, cells.2 = NULL, features = NULL, test.use = "wilcox", pseudocount.use = 1, slot = "data", fc.slot = "data", mean.fxn = NULL, fc.name = NULL, base = 2, recorrect_umi = TRUE, ... ) \method{FindMarkers}{DimReduc}( object, cells.1 = NULL, cells.2 = NULL, features = NULL, logfc.threshold = 0.1, test.use = "wilcox", min.pct = 0.01, min.diff.pct = -Inf, verbose = TRUE, only.pos = FALSE, max.cells.per.ident = Inf, random.seed = 1, latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, densify = FALSE, mean.fxn = rowMeans, fc.name = NULL, ... ) \method{FindMarkers}{Seurat}( object, ident.1 = NULL, ident.2 = NULL, latent.vars = NULL, group.by = NULL, subset.ident = NULL, assay = NULL, reduction = NULL, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods and to specific DE methods} \item{slot}{Slot to pull data from; note that if \code{test.use} is "negbinom", "poisson", or "DESeq2", \code{slot} will be set to "counts"} \item{cells.1}{Vector of cell names belonging to group 1} \item{cells.2}{Vector of cell names belonging to group 2} \item{features}{Genes to test. Default is to use all genes} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.1 Increasing logfc.threshold speeds up the function, but can miss weaker signals. If the \code{slot} parameter is "scale.data" no filtering is performed.} \item{test.use}{Denotes which test to use. Available options are: \itemize{ \item{"wilcox"} : Identifies differentially expressed genes between two groups of cells using a Wilcoxon Rank Sum test (default); will use a fast implementation by Presto if installed \item{"wilcox_limma"} : Identifies differentially expressed genes between two groups of cells using the limma implementation of the Wilcoxon Rank Sum test; set this option to reproduce results from Seurat v4 \item{"bimod"} : Likelihood-ratio test for single cell gene expression, (McDavid et al., Bioinformatics, 2013) \item{"roc"} : Identifies 'markers' of gene expression using ROC analysis. For each gene, evaluates (using AUC) a classifier built on that gene alone, to classify between two groups of cells. An AUC value of 1 means that expression values for this gene alone can perfectly classify the two groupings (i.e. Each of the cells in cells.1 exhibit a higher level than each of the cells in cells.2). An AUC value of 0 also means there is perfect classification, but in the other direction. A value of 0.5 implies that the gene has no predictive power to classify the two groups. Returns a 'predictive power' (abs(AUC-0.5) * 2) ranked matrix of putative differentially expressed genes. \item{"t"} : Identify differentially expressed genes between two groups of cells using the Student's t-test. \item{"negbinom"} : Identifies differentially expressed genes between two groups of cells using a negative binomial generalized linear model. Use only for UMI-based datasets \item{"poisson"} : Identifies differentially expressed genes between two groups of cells using a poisson generalized linear model. Use only for UMI-based datasets \item{"LR"} : Uses a logistic regression framework to determine differentially expressed genes. Constructs a logistic regression model predicting group membership based on each feature individually and compares this to a null model with a likelihood ratio test. \item{"MAST"} : Identifies differentially expressed genes between two groups of cells using a hurdle model tailored to scRNA-seq data. Utilizes the MAST package to run the DE testing. \item{"DESeq2"} : Identifies differentially expressed genes between two groups of cells based on a model using DESeq2 which uses a negative binomial distribution (Love et al, Genome Biology, 2014).This test does not support pre-filtering of genes based on average difference (or percent detection rate) between cell groups. However, genes may be pre-filtered based on their minimum detection rate (min.pct) across both cell groups. To use this method, please install DESeq2, using the instructions at https://bioconductor.org/packages/release/bioc/html/DESeq2.html }} \item{min.pct}{only test genes that are detected in a minimum fraction of min.pct cells in either of the two populations. Meant to speed up the function by not testing genes that are very infrequently expressed. Default is 0.01} \item{min.diff.pct}{only test genes that show a minimum difference in the fraction of detection between the two groups. Set to -Inf by default} \item{verbose}{Print a progress bar once expression testing begins} \item{only.pos}{Only return positive markers (FALSE by default)} \item{max.cells.per.ident}{Down sample each identity class to a max number. Default is no downsampling. Not activated by default (set to Inf)} \item{random.seed}{Random seed for downsampling} \item{latent.vars}{Variables to test, used only when \code{test.use} is one of 'LR', 'negbinom', 'poisson', or 'MAST'} \item{min.cells.feature}{Minimum number of cells expressing the feature in at least one of the two groups, currently only used for poisson and negative binomial tests} \item{min.cells.group}{Minimum number of cells in one of the groups} \item{fc.results}{data.frame from FoldChange} \item{densify}{Convert the sparse matrix to a dense form before running the DE test. This can provide speedups but might require higher memory; default is FALSE} \item{fc.slot}{Slot used to calculate fold-change - will also affect the default for \code{mean.fxn}, see below for more details.} \item{pseudocount.use}{Pseudocount to add to averaged expression values when calculating logFC. 1 by default.} \item{norm.method}{Normalization method for fold change calculation when \code{slot} is \dQuote{\code{data}}} \item{mean.fxn}{Function to use for fold change or average difference calculation. The default depends on the the value of \code{fc.slot}: \itemize{ \item{"counts"} : difference in the log of the mean counts, with pseudocount. \item{"data"} : difference in the log of the average exponentiated data, with pseudocount. This adjusts for differences in sequencing depth between cells, and assumes that "data" has been log-normalized. \item{"scale.data"} : difference in the means of scale.data. }} \item{fc.name}{Name of the fold change, average difference, or custom function column in the output data.frame. If NULL, the fold change column will be named according to the logarithm base (eg, "avg_log2FC"), or if using the scale.data slot "avg_diff".} \item{base}{The base with respect to which logarithms are computed.} \item{recorrect_umi}{Recalculate corrected UMI counts using minimum of the median UMIs when performing DE using multiple SCT objects; default is TRUE} \item{ident.1}{Identity class to define markers for; pass an object of class \code{phylo} or 'clustertree' to find markers for a node in a cluster tree; passing 'clustertree' requires \code{\link{BuildClusterTree}} to have been run} \item{ident.2}{A second identity class for comparison; if \code{NULL}, use all other cells for comparison; if an object of class \code{phylo} or 'clustertree' is passed to \code{ident.1}, must pass a node to find markers for} \item{group.by}{Regroup cells into a different identity class prior to performing differential expression (see example); \code{"ident"} to use Idents} \item{subset.ident}{Subset a particular identity class prior to regrouping. Only relevant if group.by is set (see example)} \item{assay}{Assay to use in differential expression testing} \item{reduction}{Reduction to use in differential expression testing - will test for DE on cell embeddings} } \value{ data.frame with a ranked list of putative markers as rows, and associated statistics as columns (p-values, ROC score, etc., depending on the test used (\code{test.use})). The following columns are always present: \itemize{ \item \code{avg_logFC}: log fold-chage of the average expression between the two groups. Positive values indicate that the gene is more highly expressed in the first group \item \code{pct.1}: The percentage of cells where the gene is detected in the first group \item \code{pct.2}: The percentage of cells where the gene is detected in the second group \item \code{p_val_adj}: Adjusted p-value, based on bonferroni correction using all genes in the dataset } } \description{ Finds markers (differentially expressed genes) for identity classes } \details{ p-value adjustment is performed using bonferroni correction based on the total number of genes in the dataset. Other correction methods are not recommended, as Seurat pre-filters genes using the arguments above, reducing the number of tests performed. Lastly, as Aaron Lun has pointed out, p-values should be interpreted cautiously, as the genes used for clustering are the same genes tested for differential expression. } \examples{ \dontrun{ data("pbmc_small") # Find markers for cluster 2 markers <- FindMarkers(object = pbmc_small, ident.1 = 2) head(x = markers) # Take all cells in cluster 2, and find markers that separate cells in the 'g1' group (metadata # variable 'group') markers <- FindMarkers(pbmc_small, ident.1 = "g1", group.by = 'groups', subset.ident = "2") head(x = markers) # Pass 'clustertree' or an object of class phylo to ident.1 and # a node to ident.2 as a replacement for FindMarkersNode if (requireNamespace("ape", quietly = TRUE)) { pbmc_small <- BuildClusterTree(object = pbmc_small) markers <- FindMarkers(object = pbmc_small, ident.1 = 'clustertree', ident.2 = 5) head(x = markers) } } } \references{ McDavid A, Finak G, Chattopadyay PK, et al. Data exploration, quality control and testing in single-cell qPCR-based gene expression experiments. Bioinformatics. 2013;29(4):461-467. doi:10.1093/bioinformatics/bts714 Trapnell C, et al. The dynamics and regulators of cell fate decisions are revealed by pseudotemporal ordering of single cells. Nature Biotechnology volume 32, pages 381-386 (2014) Andrew McDavid, Greg Finak and Masanao Yajima (2017). MAST: Model-based Analysis of Single Cell Transcriptomics. R package version 1.2.1. https://github.com/RGLab/MAST/ Love MI, Huber W and Anders S (2014). "Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2." Genome Biology. https://bioconductor.org/packages/release/bioc/html/DESeq2.html } \seealso{ \code{FoldChange} } \concept{differential_expression} Seurat/man/SelectIntegrationFeatures.Rd0000644000176200001440000000353714731364134017717 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{SelectIntegrationFeatures} \alias{SelectIntegrationFeatures} \title{Select integration features} \usage{ SelectIntegrationFeatures( object.list, nfeatures = 2000, assay = NULL, verbose = TRUE, fvf.nfeatures = 2000, ... ) } \arguments{ \item{object.list}{List of seurat objects} \item{nfeatures}{Number of features to return} \item{assay}{Name or vector of assay names (one for each object) from which to pull the variable features.} \item{verbose}{Print messages} \item{fvf.nfeatures}{nfeatures for \code{\link{FindVariableFeatures}}. Used if \code{VariableFeatures} have not been set for any object in \code{object.list}.} \item{...}{Additional parameters to \code{\link{FindVariableFeatures}}} } \value{ A vector of selected features } \description{ Choose the features to use when integrating multiple datasets. This function ranks features by the number of datasets they are deemed variable in, breaking ties by the median variable feature rank across datasets. It returns the top scoring features by this ranking. } \details{ If for any assay in the list, \code{\link{FindVariableFeatures}} hasn't been run, this method will try to run it using the \code{fvf.nfeatures} parameter and any additional ones specified through the \dots. } \examples{ \dontrun{ # to install the SeuratData package see https://github.com/satijalab/seurat-data library(SeuratData) data("panc8") # panc8 is a merged Seurat object containing 8 separate pancreas datasets # split the object by dataset and take the first 2 pancreas.list <- SplitObject(panc8, split.by = "tech")[1:2] # perform SCTransform normalization pancreas.list <- lapply(X = pancreas.list, FUN = SCTransform) # select integration features features <- SelectIntegrationFeatures(pancreas.list) } } \concept{integration} Seurat/man/AutoPointSize.Rd0000644000176200001440000000112514731364134015341 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{AutoPointSize} \alias{AutoPointSize} \title{Automagically calculate a point size for ggplot2-based scatter plots} \usage{ AutoPointSize(data, raster = NULL) } \arguments{ \item{data}{A data frame being passed to ggplot2} \item{raster}{If TRUE, point size is set to 1} } \value{ The "optimal" point size for visualizing these data } \description{ It happens to look good } \examples{ df <- data.frame(x = rnorm(n = 10000), y = runif(n = 10000)) AutoPointSize(data = df) } \concept{visualization} Seurat/man/SingleSpatialPlot.Rd0000644000176200001440000000455314744456127016202 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleSpatialPlot} \alias{SingleSpatialPlot} \title{Base plotting function for all Spatial plots} \usage{ SingleSpatialPlot( data, image, cols = NULL, image.alpha = 1, image.scale = "lowres", pt.alpha = NULL, crop = TRUE, pt.size.factor = NULL, shape = 21, stroke = NA, col.by = NULL, alpha.by = NULL, cells.highlight = NULL, cols.highlight = c("#DE2D26", "grey50"), geom = c("spatial", "interactive", "poly"), na.value = "grey50" ) } \arguments{ \item{data}{Data.frame with info to be plotted} \item{image}{\code{SpatialImage} object to be plotted} \item{cols}{Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns colors} \item{image.alpha}{Adjust the opacity of the background images. Set to 0 to remove.} \item{image.scale}{Choose the scale factor ("lowres"/"hires") to apply in order to matchthe plot with the specified `image` - defaults to "lowres"} \item{pt.alpha}{Adjust the opacity of the points if plotting a \code{SpatialDimPlot}} \item{crop}{Crop the plot in to focus on points plotted. Set to \code{FALSE} to show entire background image.} \item{pt.size.factor}{Sets the size of the points relative to spot.radius} \item{shape}{Control the shape of the spots - same as the ggplot2 parameter. The default is 21, which plots cirlces - use 22 to plot squares.} \item{stroke}{Control the width of the border around the spots} \item{col.by}{Mapping variable for the point color} \item{alpha.by}{Mapping variable for the point alpha value} \item{cells.highlight}{A list of character or numeric vectors of cells to highlight. If only one group of cells desired, can simply pass a vector instead of a list. If set, colors selected cells to the color(s) in cols.highlight} \item{cols.highlight}{A vector of colors to highlight the cells as; ordered the same as the groups in cells.highlight; last color corresponds to unselected cells.} \item{geom}{Switch between normal spatial geom and geom to enable hover functionality} \item{na.value}{Color for spots with NA values} } \value{ A ggplot2 object } \description{ Base plotting function for all Spatial plots } \keyword{internal} Seurat/man/VizDimLoadings.Rd0000644000176200001440000000241514731364134015452 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{VizDimLoadings} \alias{VizDimLoadings} \title{Visualize Dimensional Reduction genes} \usage{ VizDimLoadings( object, dims = 1:5, nfeatures = 30, col = "blue", reduction = "pca", projected = FALSE, balanced = FALSE, ncol = NULL, combine = TRUE ) } \arguments{ \item{object}{Seurat object} \item{dims}{Number of dimensions to display} \item{nfeatures}{Number of genes to display} \item{col}{Color of points to use} \item{reduction}{Reduction technique to visualize results for} \item{projected}{Use reduction values for full dataset (i.e. projected dimensional reduction values)} \item{balanced}{Return an equal number of genes with + and - scores. If FALSE (default), returns the top genes ranked by the scores absolute values} \item{ncol}{Number of columns to display} \item{combine}{Combine plots into a single \code{patchwork} ggplot object. If \code{FALSE}, return a list of ggplot objects} } \value{ A \code{patchwork} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ Visualize top genes associated with reduction components } \examples{ data("pbmc_small") VizDimLoadings(object = pbmc_small) } \concept{visualization} Seurat/man/Load10X_Spatial.Rd0000644000176200001440000000305414743751115015416 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Load10X_Spatial} \alias{Load10X_Spatial} \title{Load a 10x Genomics Visium Spatial Experiment into a \code{Seurat} object} \usage{ Load10X_Spatial( data.dir, filename = "filtered_feature_bc_matrix.h5", assay = "Spatial", slice = "slice1", bin.size = NULL, filter.matrix = TRUE, to.upper = FALSE, image = NULL, ... ) } \arguments{ \item{data.dir}{Directory containing the H5 file specified by \code{filename} and the image data in a subdirectory called \code{spatial}} \item{filename}{Name of H5 file containing the feature barcode matrix} \item{assay}{Name of the initial assay} \item{slice}{Name for the stored image of the tissue slice} \item{bin.size}{Specifies the bin sizes to read in - defaults to c(16, 8)} \item{filter.matrix}{Only keep spots that have been determined to be over tissue} \item{to.upper}{Converts all feature names to upper case. Can be useful when analyses require comparisons between human and mouse gene names for example.} \item{image}{\code{VisiumV1}/\code{VisiumV2} instance(s) - if a vector is passed in it should be co-indexed with \code{`bin.size`}} \item{...}{Arguments passed to \code{\link{Read10X_h5}}} } \value{ A \code{Seurat} object } \description{ Load a 10x Genomics Visium Spatial Experiment into a \code{Seurat} object } \examples{ \dontrun{ data_dir <- 'path/to/data/directory' list.files(data_dir) # Should show filtered_feature_bc_matrix.h5 Load10X_Spatial(data.dir = data_dir) } } \concept{preprocessing} Seurat/man/FetchResiduals.Rd0000644000176200001440000000330514731364135015474 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing5.R \name{FetchResiduals} \alias{FetchResiduals} \title{Calculate pearson residuals of features not in the scale.data} \usage{ FetchResiduals( object, features, assay = NULL, umi.assay = "RNA", layer = "counts", clip.range = NULL, reference.SCT.model = NULL, replace.value = FALSE, na.rm = TRUE, verbose = TRUE ) } \arguments{ \item{object}{A seurat object} \item{features}{Name of features to add into the scale.data} \item{assay}{Name of the assay of the seurat object generated by SCTransform} \item{umi.assay}{Name of the assay of the seurat object containing UMI matrix and the default is RNA} \item{layer}{Name (prefix) of the layer to pull counts from} \item{clip.range}{Numeric of length two specifying the min and max values the Pearson residual will be clipped to} \item{reference.SCT.model}{reference.SCT.model If a reference SCT model should be used for calculating the residuals. When set to not NULL, ignores the `SCTModel` paramater.} \item{replace.value}{Recalculate residuals for all features, even if they are already present. Useful if you want to change the clip.range.} \item{na.rm}{For features where there is no feature model stored, return NA for residual value in scale.data when na.rm = FALSE. When na.rm is TRUE, only return residuals for features with a model stored for all cells.} \item{verbose}{Whether to print messages and progress bars} } \value{ Returns a Seurat object containing Pearson residuals of added features in its scale.data } \description{ This function calls sctransform::get_residuals. } \seealso{ \code{\link[sctransform]{get_residuals}} } \concept{preprocessing} Seurat/man/CCAIntegration.Rd0000644000176200001440000000762614744463014015373 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration5.R \name{CCAIntegration} \alias{CCAIntegration} \title{Seurat-CCA Integration} \usage{ CCAIntegration( object = NULL, assay = NULL, layers = NULL, orig = NULL, new.reduction = "integrated.dr", reference = NULL, features = NULL, normalization.method = c("LogNormalize", "SCT"), dims = 1:30, k.filter = NA, scale.layer = "scale.data", dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) } \arguments{ \item{object}{A \code{Seurat} object} \item{assay}{Name of \code{Assay} in the \code{Seurat} object} \item{layers}{Names of layers in \code{assay}} \item{orig}{A \link[SeuratObject]{DimReduc} to correct} \item{new.reduction}{Name of new integrated dimensional reduction} \item{reference}{A reference \code{Seurat} object} \item{features}{A vector of features to use for integration} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{dims}{Dimensions of dimensional reduction to use for integration} \item{k.filter}{Number of anchors to filter} \item{scale.layer}{Name of scaled layer in \code{Assay}} \item{dims.to.integrate}{Number of dimensions to return integrated values for} \item{k.weight}{Number of neighbors to consider when weighting anchors} \item{weight.reduction}{Dimension reduction to use when calculating anchor weights. This can be one of: \itemize{ \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, specifying the object to use for each object in the integration} \item{NULL, in which case the full corrected space is used for computing anchor weights.} }} \item{sd.weight}{Controls the bandwidth of the Gaussian kernel for weighting} \item{sample.tree}{Specify the order of integration. Order of integration should be encoded in a matrix, where each row represents one of the pairwise integration steps. Negative numbers specify a dataset, positive numbers specify the integration results from a given row (the format of the merge matrix included in the \code{\link{hclust}} function output). For example: \code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives: \if{html}{\out{
}}\preformatted{ [,1] [,2] [1,] -2 -3 [2,] 1 -1 }\if{html}{\out{
}} Which would cause dataset 2 and 3 to be integrated first, then the resulting object integrated with dataset 1. If NULL, the sample tree will be computed automatically.} \item{preserve.order}{Do not reorder objects based on size for each pairwise integration.} \item{verbose}{Print progress} \item{...}{Arguments passed on to \code{FindIntegrationAnchors}} } \description{ Seurat-CCA Integration } \examples{ \dontrun{ # Preprocessing obj <- SeuratData::LoadData("pbmcsca") obj[["RNA"]] <- split(obj[["RNA"]], f = obj$Method) obj <- NormalizeData(obj) obj <- FindVariableFeatures(obj) obj <- ScaleData(obj) obj <- RunPCA(obj) # After preprocessing, we integrate layers. obj <- IntegrateLayers(object = obj, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated.cca", verbose = FALSE) # Modifying parameters # We can also specify parameters such as `k.anchor` to increase the strength of integration obj <- IntegrateLayers(object = obj, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated.cca", k.anchor = 20, verbose = FALSE) # Integrating SCTransformed data obj <- SCTransform(object = obj) obj <- IntegrateLayers(object = obj, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated.cca", assay = "SCT", verbose = FALSE) } } \concept{integration} Seurat/man/GetAssay.Rd0000644000176200001440000000114114731364134014302 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/objects.R \name{GetAssay} \alias{GetAssay} \alias{GetAssay.Seurat} \title{Get an Assay object from a given Seurat object.} \usage{ GetAssay(object, ...) \method{GetAssay}{Seurat}(object, assay = NULL, ...) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{assay}{Assay to get} } \value{ Returns an Assay object } \description{ Get an Assay object from a given Seurat object. } \examples{ data("pbmc_small") GetAssay(object = pbmc_small, assay = "RNA") } \concept{objects} Seurat/man/IntegrationData-class.Rd0000644000176200001440000000165514731364135016755 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{IntegrationData-class} \alias{IntegrationData-class} \alias{IntegrationData} \title{The IntegrationData Class} \description{ The IntegrationData object is an intermediate storage container used internally throughout the integration procedure to hold bits of data that are useful downstream. } \section{Slots}{ \describe{ \item{\code{neighbors}}{List of neighborhood information for cells (outputs of \code{RANN::nn2})} \item{\code{weights}}{Anchor weight matrix} \item{\code{integration.matrix}}{Integration matrix} \item{\code{anchors}}{Anchor matrix} \item{\code{offsets}}{The offsets used to enable cell look up in downstream functions} \item{\code{objects.ncell}}{Number of cells in each object in the object.list} \item{\code{sample.tree}}{Sample tree used for ordering multi-dataset integration} }} \concept{objects} Seurat/man/UpdateSymbolList.Rd0000644000176200001440000000425514731364135016040 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{UpdateSymbolList} \alias{UpdateSymbolList} \alias{GeneSymbolThesarus} \title{Get updated synonyms for gene symbols} \source{ \url{https://www.genenames.org/} \url{https://www.genenames.org/help/rest/} } \usage{ GeneSymbolThesarus( symbols, timeout = 10, several.ok = FALSE, search.types = c("alias_symbol", "prev_symbol"), verbose = TRUE, ... ) UpdateSymbolList( symbols, timeout = 10, several.ok = FALSE, verbose = TRUE, ... ) } \arguments{ \item{symbols}{A vector of gene symbols} \item{timeout}{Time to wait before canceling query in seconds} \item{several.ok}{Allow several current gene symbols for each provided symbol} \item{search.types}{Type of query to perform: \describe{ \item{\dQuote{\code{alias_symbol}}}{Find alternate symbols for the genes described by \code{symbols}} \item{\dQuote{\code{prev_symbol}}}{Find new new symbols for the genes described by \code{symbols}} } This parameter accepts multiple options and short-hand options (eg. \dQuote{\code{prev}} for \dQuote{\code{prev_symbol}})} \item{verbose}{Show a progress bar depicting search progress} \item{...}{Extra parameters passed to \code{\link[httr]{GET}}} } \value{ \code{GeneSymbolThesarus}:, if \code{several.ok}, a named list where each entry is the current symbol found for each symbol provided and the names are the provided symbols. Otherwise, a named vector with the same information. \code{UpdateSymbolList}: \code{symbols} with updated symbols from HGNC's gene names database } \description{ Find current gene symbols based on old or alias symbols using the gene names database from the HUGO Gene Nomenclature Committee (HGNC) } \details{ For each symbol passed, we query the HGNC gene names database for current symbols that have the provided symbol as either an alias (\code{alias_symbol}) or old (\code{prev_symbol}) symbol. All other queries are \strong{not} supported. } \note{ This function requires internet access } \examples{ \dontrun{ GeneSybmolThesarus(symbols = c("FAM64A")) } \dontrun{ UpdateSymbolList(symbols = cc.genes$s.genes) } } \seealso{ \code{\link[httr]{GET}} } \concept{utilities} Seurat/man/ScaleData.Rd0000644000176200001440000000744214731364134014415 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing.R \name{ScaleData} \alias{ScaleData} \alias{ScaleData.default} \alias{ScaleData.IterableMatrix} \alias{ScaleData.Assay} \alias{ScaleData.Seurat} \title{Scale and center the data.} \usage{ ScaleData(object, ...) \method{ScaleData}{default}( object, features = NULL, vars.to.regress = NULL, latent.data = NULL, split.by = NULL, model.use = "linear", use.umi = FALSE, do.scale = TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, verbose = TRUE, ... ) \method{ScaleData}{IterableMatrix}( object, features = NULL, do.scale = TRUE, do.center = TRUE, scale.max = 10, ... ) \method{ScaleData}{Assay}( object, features = NULL, vars.to.regress = NULL, latent.data = NULL, split.by = NULL, model.use = "linear", use.umi = FALSE, do.scale = TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, verbose = TRUE, ... ) \method{ScaleData}{Seurat}( object, features = NULL, assay = NULL, vars.to.regress = NULL, split.by = NULL, model.use = "linear", use.umi = FALSE, do.scale = TRUE, do.center = TRUE, scale.max = 10, block.size = 1000, min.cells.to.block = 3000, verbose = TRUE, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{features}{Vector of features names to scale/center. Default is variable features.} \item{vars.to.regress}{Variables to regress out (previously latent.vars in RegressOut). For example, nUMI, or percent.mito.} \item{latent.data}{Extra data to regress out, should be cells x latent data} \item{split.by}{Name of variable in object metadata or a vector or factor defining grouping of cells. See argument \code{f} in \code{\link[base]{split}} for more details} \item{model.use}{Use a linear model or generalized linear model (poisson, negative binomial) for the regression. Options are 'linear' (default), 'poisson', and 'negbinom'} \item{use.umi}{Regress on UMI count data. Default is FALSE for linear modeling, but automatically set to TRUE if model.use is 'negbinom' or 'poisson'} \item{do.scale}{Whether to scale the data.} \item{do.center}{Whether to center the data.} \item{scale.max}{Max value to return for scaled data. The default is 10. Setting this can help reduce the effects of features that are only expressed in a very small number of cells. If regressing out latent variables and using a non-linear model, the default is 50.} \item{block.size}{Default size for number of features to scale at in a single computation. Increasing block.size may speed up calculations but at an additional memory cost.} \item{min.cells.to.block}{If object contains fewer than this number of cells, don't block for scaling calculations.} \item{verbose}{Displays a progress bar for scaling procedure} \item{assay}{Name of Assay to scale} } \description{ Scales and centers features in the dataset. If variables are provided in vars.to.regress, they are individually regressed against each feature, and the resulting residuals are then scaled and centered. } \details{ ScaleData now incorporates the functionality of the function formerly known as RegressOut (which regressed out given the effects of provided variables and then scaled the residuals). To make use of the regression functionality, simply pass the variables you want to remove to the vars.to.regress parameter. Setting center to TRUE will center the expression for each feature by subtracting the average expression for that feature. Setting scale to TRUE will scale the expression level for each feature by dividing the centered feature expression levels by their standard deviations if center is TRUE and by their root mean square otherwise. } \concept{preprocessing} Seurat/man/TopCells.Rd0000644000176200001440000000157214731364135014320 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{TopCells} \alias{TopCells} \title{Find cells with highest scores for a given dimensional reduction technique} \usage{ TopCells(object, dim = 1, ncells = 20, balanced = FALSE, ...) } \arguments{ \item{object}{DimReduc object} \item{dim}{Dimension to use} \item{ncells}{Number of cells to return} \item{balanced}{Return an equal number of cells with both + and - scores.} \item{...}{Extra parameters passed to \code{\link{Embeddings}}} } \value{ Returns a vector of cells } \description{ Return a list of genes with the strongest contribution to a set of components } \examples{ data("pbmc_small") pbmc_small head(TopCells(object = pbmc_small[["pca"]])) # Can specify which dimension and how many cells to return TopCells(object = pbmc_small[["pca"]], dim = 2, ncells = 5) } \concept{objects} Seurat/man/AnnotateAnchors.Rd0000644000176200001440000000256414731364133015662 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/integration.R \name{AnnotateAnchors} \alias{AnnotateAnchors} \alias{AnnotateAnchors.default} \alias{AnnotateAnchors.IntegrationAnchorSet} \alias{AnnotateAnchors.TransferAnchorSet} \title{Add info to anchor matrix} \usage{ AnnotateAnchors(anchors, vars, slot, ...) \method{AnnotateAnchors}{default}( anchors, vars = NULL, slot = NULL, object.list, assay = NULL, ... ) \method{AnnotateAnchors}{IntegrationAnchorSet}( anchors, vars = NULL, slot = NULL, object.list = NULL, assay = NULL, ... ) \method{AnnotateAnchors}{TransferAnchorSet}( anchors, vars = NULL, slot = NULL, reference = NULL, query = NULL, assay = NULL, ... ) } \arguments{ \item{anchors}{An \code{\link{AnchorSet}} object} \item{vars}{Variables to pull for each object via FetchData} \item{slot}{Slot to pull feature data for} \item{...}{Arguments passed to other methods} \item{object.list}{List of Seurat objects} \item{assay}{Specify the Assay per object if annotating with expression data} \item{reference}{Reference object used in \code{\link{FindTransferAnchors}}} \item{query}{Query object used in \code{\link{FindTransferAnchors}}} } \value{ Returns the anchor dataframe with additional columns for annotation metadata } \description{ Add info to anchor matrix } \concept{integration} Seurat/man/LoadCurioSeeker.Rd0000644000176200001440000000103514731364135015605 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{LoadCurioSeeker} \alias{LoadCurioSeeker} \title{Load Curio Seeker data} \usage{ LoadCurioSeeker(data.dir, assay = "Spatial") } \arguments{ \item{data.dir}{location of data directory that contains the counts matrix, gene names, barcodes/beads, and barcodes/bead location files.} \item{assay}{Name of assay to associate spatial data to} } \value{ A \code{\link{Seurat}} object } \description{ Load Curio Seeker data } \concept{preprocessing} Seurat/man/ColorDimSplit.Rd0000644000176200001440000001077214744456127015330 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{ColorDimSplit} \alias{ColorDimSplit} \title{Color dimensional reduction plot by tree split} \usage{ ColorDimSplit( object, node, left.color = "red", right.color = "blue", other.color = "grey50", ... ) } \arguments{ \item{object}{Seurat object} \item{node}{Node in cluster tree on which to base the split} \item{left.color}{Color for the left side of the split} \item{right.color}{Color for the right side of the split} \item{other.color}{Color for all other cells} \item{...}{ Arguments passed on to \code{\link[=DimPlot]{DimPlot}} \describe{ \item{\code{dims}}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} \item{\code{cells}}{Vector of cells to plot (default is all cells)} \item{\code{cols}}{Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. See \code{\link{DiscretePalette}} for details.} \item{\code{pt.size}}{Adjust point size for plotting} \item{\code{reduction}}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} \item{\code{group.by}}{Name of one or more metadata columns to group (color) cells by (for example, orig.ident); pass 'ident' to group by identity class} \item{\code{split.by}}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity} \item{\code{shape.by}}{If NULL, all points are circles (default). You can specify any cell attribute (that can be pulled with FetchData) allowing for both different colors and different shapes on cells. Only applicable if \code{raster = FALSE}.} \item{\code{order}}{Specify the order of plotting for the idents. This can be useful for crowded plots if points of interest are being buried. Provide either a full list of valid idents or a subset to be plotted last (on top)} \item{\code{shuffle}}{Whether to randomly shuffle the order of points. This can be useful for crowded plots if points of interest are being buried. (default is FALSE)} \item{\code{seed}}{Sets the seed if randomly shuffling the order of points.} \item{\code{label}}{Whether to label the clusters} \item{\code{label.size}}{Sets size of labels} \item{\code{label.color}}{Sets the color of the label text} \item{\code{label.box}}{Whether to put a box around the label text (geom_text vs geom_label)} \item{\code{alpha}}{Alpha value for plotting (default is 1)} \item{\code{repel}}{Repel labels} \item{\code{stroke.size}}{Adjust stroke (outline) size of points} \item{\code{cells.highlight}}{A list of character or numeric vectors of cells to highlight. If only one group of cells desired, can simply pass a vector instead of a list. If set, colors selected cells to the color(s) in \code{cols.highlight} and other cells black (white if dark.theme = TRUE); will also resize to the size(s) passed to \code{sizes.highlight}} \item{\code{cols.highlight}}{A vector of colors to highlight the cells as; will repeat to the length groups in cells.highlight} \item{\code{sizes.highlight}}{Size of highlighted cells; will repeat to the length groups in cells.highlight. If \code{sizes.highlight = TRUE} size of all points will be this value.} \item{\code{na.value}}{Color value for NA points when using custom scale} \item{\code{ncol}}{Number of columns for display when combining plots} \item{\code{combine}}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} \item{\code{raster}}{Convert points to raster format, default is \code{NULL} which automatically rasterizes if plotting more than 100,000 cells} \item{\code{raster.dpi}}{Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512).} }} } \value{ Returns a DimPlot } \description{ Returns a DimPlot colored based on whether the cells fall in clusters to the left or to the right of a node split in the cluster tree. } \examples{ \dontrun{ if (requireNamespace("ape", quietly = TRUE)) { data("pbmc_small") pbmc_small <- BuildClusterTree(object = pbmc_small, verbose = FALSE) PlotClusterTree(pbmc_small) ColorDimSplit(pbmc_small, node = 5) } } } \seealso{ \code{\link{DimPlot}} } \concept{visualization} Seurat/man/RunMarkVario.Rd0000644000176200001440000000117114731364135015146 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{RunMarkVario} \alias{RunMarkVario} \title{Run the mark variogram computation on a given position matrix and expression matrix.} \usage{ RunMarkVario(spatial.location, data, ...) } \arguments{ \item{spatial.location}{A 2 column matrix giving the spatial locations of each of the data points also in data} \item{data}{Matrix containing the data used as "marks" (e.g. gene expression)} \item{...}{Arguments passed to markvario} } \description{ Wraps the functionality of markvario from the spatstat package. } \concept{preprocessing} Seurat/man/FindClusters.Rd0000644000176200001440000000622714744456127015211 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/clustering.R \name{FindClusters} \alias{FindClusters} \alias{FindClusters.default} \alias{FindClusters.Seurat} \title{Cluster Determination} \usage{ FindClusters(object, ...) \method{FindClusters}{default}( object, modularity.fxn = 1, initial.membership = NULL, node.sizes = NULL, resolution = 0.8, method = deprecated(), algorithm = 1, n.start = 10, n.iter = 10, random.seed = 0, group.singletons = TRUE, temp.file.location = NULL, edge.file.name = NULL, verbose = TRUE, ... ) \method{FindClusters}{Seurat}( object, graph.name = NULL, cluster.name = NULL, modularity.fxn = 1, initial.membership = NULL, node.sizes = NULL, resolution = 0.8, method = NULL, algorithm = 1, n.start = 10, n.iter = 10, random.seed = 0, group.singletons = TRUE, temp.file.location = NULL, edge.file.name = NULL, verbose = TRUE, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{modularity.fxn}{Modularity function (1 = standard; 2 = alternative).} \item{initial.membership}{Passed to the `initial_membership` parameter of `leidenbase::leiden_find_partition`.} \item{node.sizes}{Passed to the `node_sizes` parameter of `leidenbase::leiden_find_partition`.} \item{resolution}{Value of the resolution parameter, use a value above (below) 1.0 if you want to obtain a larger (smaller) number of communities.} \item{method}{DEPRECATED.} \item{algorithm}{Algorithm for modularity optimization (1 = original Louvain algorithm; 2 = Louvain algorithm with multilevel refinement; 3 = SLM algorithm; 4 = Leiden algorithm).} \item{n.start}{Number of random starts.} \item{n.iter}{Maximal number of iterations per random start.} \item{random.seed}{Seed of the random number generator.} \item{group.singletons}{Group singletons into nearest cluster. If FALSE, assign all singletons to a "singleton" group} \item{temp.file.location}{Directory where intermediate files will be written. Specify the ABSOLUTE path.} \item{edge.file.name}{Edge file to use as input for modularity optimizer jar.} \item{verbose}{Print output} \item{graph.name}{Name of graph to use for the clustering algorithm} \item{cluster.name}{Name of output clusters} } \value{ Returns a Seurat object where the idents have been updated with new cluster info; latest clustering results will be stored in object metadata under 'seurat_clusters'. Note that 'seurat_clusters' will be overwritten everytime FindClusters is run } \description{ Identify clusters of cells by a shared nearest neighbor (SNN) modularity optimization based clustering algorithm. First calculate k-nearest neighbors and construct the SNN graph. Then optimize the modularity function to determine clusters. For a full description of the algorithms, see Waltman and van Eck (2013) \emph{The European Physical Journal B}. Thanks to Nigel Delaney (evolvedmicrobe@github) for the rewrite of the Java modularity optimizer code in Rcpp! } \details{ To run Leiden algorithm, you must first install the leidenalg python package (e.g. via pip install leidenalg), see Traag et al (2018). } \concept{clustering} Seurat/man/ReadVitessce.Rd0000644000176200001440000000672514731364133015157 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R, R/convenience.R \name{ReadVitessce} \alias{ReadVitessce} \alias{LoadHuBMAPCODEX} \title{Read Data From Vitessce} \usage{ ReadVitessce( counts = NULL, coords = NULL, molecules = NULL, type = c("segmentations", "centroids"), filter = NA_character_ ) LoadHuBMAPCODEX(data.dir, fov, assay = "CODEX") } \arguments{ \item{counts}{Path or URL to a Vitessce-formatted JSON file with expression data; should end in \dQuote{\code{.genes.json}} or \dQuote{\code{.clusters.json}}; pass \code{NULL} to skip} \item{coords}{Path or URL to a Vitessce-formatted JSON file with cell/spot spatial coordinates; should end in \dQuote{\code{.cells.json}}; pass \code{NULL} to skip} \item{molecules}{Path or URL to a Vitessce-formatted JSON file with molecule spatial coordinates; should end in \dQuote{\code{.molecules.json}}; pass \code{NULL} to skip} \item{type}{Type of cell/spot spatial coordinates to return, choose one or more from: \itemize{ \item \dQuote{segmentations} cell/spot segmentations \item \dQuote{centroids} cell/spot centroids }} \item{filter}{A character to filter molecules by, pass \code{NA} to skip molecule filtering} \item{data.dir}{Path to a directory containing Vitessce cells and clusters JSONs} \item{fov}{Name to store FOV as} \item{assay}{Name to store expression matrix as} } \value{ \code{ReadVitessce}: A list with some combination of the following values: \itemize{ \item \dQuote{\code{counts}}: if \code{counts} is not \code{NULL}, an expression matrix with cells as columns and features as rows \item \dQuote{\code{centroids}}: if \code{coords} is not \code{NULL} and \code{type} is contains\dQuote{centroids}, a data frame with cell centroids in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{segmentations}}: if \code{coords} is not \code{NULL} and \code{type} contains \dQuote{centroids}, a data frame with cell segmentations in three columns: \dQuote{x}, \dQuote{y} and \dQuote{cell} \item \dQuote{\code{molecules}}: if \code{molecules} is not \code{NULL}, a data frame with molecule spatial coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} } \code{LoadHuBMAPCODEX}: A \code{\link[SeuratObject]{Seurat}} object } \description{ Read in data from Vitessce-formatted JSON files } \note{ This function requires the \href{https://cran.r-project.org/package=jsonlite}{\pkg{jsonlite}} package to be installed } \section{Progress Updates with \pkg{progressr}}{ This function uses \href{https://cran.r-project.org/package=progressr}{\pkg{progressr}} to render status updates and progress bars. To enable progress updates, wrap the function call in \code{\link[progressr]{with_progress}} or run \code{\link[progressr:handlers]{handlers(global = TRUE)}} before running this function. For more details about \pkg{progressr}, please read \href{https://progressr.futureverse.org/articles/progressr-intro.html}{\code{vignette("progressr-intro")}} } \examples{ \dontrun{ coords <- ReadVitessce( counts = "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/wang/wang.genes.json", coords = "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/wang/wang.cells.json", molecules = "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/wang/wang.molecules.json" ) names(coords) coords$counts[1:10, 1:10] head(coords$centroids) head(coords$segmentations) head(coords$molecules) } } \concept{preprocessing} Seurat/man/RunCCA.Rd0000644000176200001440000000502114744463014013637 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunCCA} \alias{RunCCA} \alias{RunCCA.default} \alias{RunCCA.Seurat} \title{Perform Canonical Correlation Analysis} \usage{ RunCCA(object1, object2, ...) \method{RunCCA}{default}( object1, object2, standardize = TRUE, num.cc = 20, seed.use = 42, verbose = FALSE, ... ) \method{RunCCA}{Seurat}( object1, object2, assay1 = NULL, assay2 = NULL, num.cc = 20, features = NULL, renormalize = FALSE, rescale = FALSE, compute.gene.loadings = TRUE, add.cell.id1 = NULL, add.cell.id2 = NULL, verbose = TRUE, ... ) } \arguments{ \item{object1}{First Seurat object} \item{object2}{Second Seurat object.} \item{...}{Extra parameters (passed onto MergeSeurat in case with two objects passed, passed onto ScaleData in case with single object and rescale.groups set to TRUE)} \item{standardize}{Standardize matrices - scales columns to have unit variance and mean 0} \item{num.cc}{Number of canonical vectors to calculate} \item{seed.use}{Random seed to set. If NULL, does not set a seed} \item{verbose}{Show progress messages} \item{assay1, assay2}{Assays to pull from in the first and second objects, respectively} \item{features}{Set of genes to use in CCA. Default is the union of both the variable features sets present in both objects.} \item{renormalize}{Renormalize raw data after merging the objects. If FALSE, merge the data matrices also.} \item{rescale}{Rescale the datasets prior to CCA. If FALSE, uses existing data in the scale data slots.} \item{compute.gene.loadings}{Also compute the gene loadings. NOTE - this will scale every gene in the dataset which may impose a high memory cost.} \item{add.cell.id1, add.cell.id2}{Add ...} } \value{ Returns a combined Seurat object with the CCA results stored. } \description{ Runs a canonical correlation analysis using a diagonal implementation of CCA. For details about stored CCA calculation parameters, see \code{PrintCCAParams}. } \examples{ \dontrun{ data("pbmc_small") pbmc_small # As CCA requires two datasets, we will split our test object into two just for this example pbmc1 <- subset(pbmc_small, cells = colnames(pbmc_small)[1:40]) pbmc2 <- subset(pbmc_small, cells = colnames(x = pbmc_small)[41:80]) pbmc1[["group"]] <- "group1" pbmc2[["group"]] <- "group2" pbmc_cca <- RunCCA(object1 = pbmc1, object2 = pbmc2) # Print results print(x = pbmc_cca[["cca"]]) } } \seealso{ \code{\link[SeuratObject]{merge.Seurat}} } \concept{dimensional_reduction} Seurat/man/JackStrawPlot.Rd0000644000176200001440000000330114731364134015312 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{JackStrawPlot} \alias{JackStrawPlot} \title{JackStraw Plot} \usage{ JackStrawPlot( object, dims = 1:5, cols = NULL, reduction = "pca", xmax = 0.1, ymax = 0.3 ) } \arguments{ \item{object}{Seurat object} \item{dims}{Dims to plot} \item{cols}{Vector of colors, each color corresponds to an individual PC. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. See \code{\link{DiscretePalette}} for details.} \item{reduction}{reduction to pull jackstraw info from} \item{xmax}{X-axis maximum on each QQ plot.} \item{ymax}{Y-axis maximum on each QQ plot.} } \value{ A ggplot object } \description{ Plots the results of the JackStraw analysis for PCA significance. For each PC, plots a QQ-plot comparing the distribution of p-values for all genes across each PC, compared with a uniform distribution. Also determines a p-value for the overall significance of each PC (see Details). } \details{ Significant PCs should show a p-value distribution (black curve) that is strongly skewed to the left compared to the null distribution (dashed line) The p-value for each PC is based on a proportion test comparing the number of genes with a p-value below a particular threshold (score.thresh), compared with the proportion of genes expected under a uniform distribution of p-values. } \examples{ data("pbmc_small") JackStrawPlot(object = pbmc_small) } \seealso{ \code{\link{ScoreJackStraw}} } \author{ Omri Wurtzel } \concept{visualization} Seurat/man/ReadParseBio.Rd0000644000176200001440000000064014731364134015065 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convenience.R \name{ReadParseBio} \alias{ReadParseBio} \title{Read output from Parse Biosciences} \usage{ ReadParseBio(data.dir, ...) } \arguments{ \item{data.dir}{Directory containing the data files} \item{...}{Extra parameters passed to \code{\link{ReadMtx}}} } \description{ Read output from Parse Biosciences } \concept{convenience} Seurat/man/MVP.Rd0000644000176200001440000000131214731364135013225 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing5.R \name{MVP} \alias{MVP} \title{Find variable features based on mean.var.plot} \usage{ MVP( data, verbose = TRUE, nselect = 2000L, mean.cutoff = c(0.1, 8), dispersion.cutoff = c(1, Inf), ... ) } \arguments{ \item{data}{Data matrix} \item{verbose}{Whether to print messages and progress bars} \item{nselect}{Number of features to select based on dispersion values} \item{mean.cutoff}{Numeric of length two specifying the min and max values} \item{dispersion.cutoff}{Numeric of length two specifying the min and max values} } \description{ Find variable features based on mean.var.plot } \keyword{internal} Seurat/man/SelectIntegrationFeatures5.Rd0000644000176200001440000000177714731364134020010 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{SelectIntegrationFeatures5} \alias{SelectIntegrationFeatures5} \title{Select integration features} \usage{ SelectIntegrationFeatures5( object, nfeatures = 2000, assay = NULL, method = NULL, layers = NULL, verbose = TRUE, ... ) } \arguments{ \item{object}{Seurat object} \item{nfeatures}{Number of features to return for integration} \item{assay}{Name of assay to use for integration feature selection} \item{method}{Which method to pull. For \code{HVFInfo} and \code{VariableFeatures}, choose one from one of the following: \itemize{ \item \dQuote{vst} \item \dQuote{sctransform} or \dQuote{sct} \item \dQuote{mean.var.plot}, \dQuote{dispersion}, \dQuote{mvp}, or \dQuote{disp} }} \item{layers}{Name of layers to use for integration feature selection} \item{verbose}{Print messages} \item{...}{Arguments passed on to \code{method}} } \description{ Select integration features } \concept{integration} Seurat/man/JointPCAIntegration.Rd0000644000176200001440000000606614744463014016411 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration5.R \name{JointPCAIntegration} \alias{JointPCAIntegration} \title{Seurat-Joint PCA Integration} \usage{ JointPCAIntegration( object = NULL, assay = NULL, layers = NULL, orig = NULL, new.reduction = "integrated.dr", reference = NULL, features = NULL, normalization.method = c("LogNormalize", "SCT"), dims = 1:30, k.anchor = 20, scale.layer = "scale.data", dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) } \arguments{ \item{object}{A \code{Seurat} object} \item{assay}{Name of \code{Assay} in the \code{Seurat} object} \item{layers}{Names of layers in \code{assay}} \item{orig}{A \link[SeuratObject]{DimReduc} to correct} \item{new.reduction}{Name of new integrated dimensional reduction} \item{reference}{A reference \code{Seurat} object} \item{features}{A vector of features to use for integration} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{dims}{Dimensions of dimensional reduction to use for integration} \item{k.anchor}{How many neighbors (k) to use when picking anchors} \item{scale.layer}{Name of scaled layer in \code{Assay}} \item{dims.to.integrate}{Number of dimensions to return integrated values for} \item{k.weight}{Number of neighbors to consider when weighting anchors} \item{weight.reduction}{Dimension reduction to use when calculating anchor weights. This can be one of: \itemize{ \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, specifying the object to use for each object in the integration} \item{NULL, in which case the full corrected space is used for computing anchor weights.} }} \item{sd.weight}{Controls the bandwidth of the Gaussian kernel for weighting} \item{sample.tree}{Specify the order of integration. Order of integration should be encoded in a matrix, where each row represents one of the pairwise integration steps. Negative numbers specify a dataset, positive numbers specify the integration results from a given row (the format of the merge matrix included in the \code{\link{hclust}} function output). For example: \code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives: \if{html}{\out{
}}\preformatted{ [,1] [,2] [1,] -2 -3 [2,] 1 -1 }\if{html}{\out{
}} Which would cause dataset 2 and 3 to be integrated first, then the resulting object integrated with dataset 1. If NULL, the sample tree will be computed automatically.} \item{preserve.order}{Do not reorder objects based on size for each pairwise integration.} \item{verbose}{Print progress} \item{...}{Arguments passed on to \code{FindIntegrationAnchors}} } \description{ Seurat-Joint PCA Integration } \concept{integration} Seurat/man/GetImage.Rd0000644000176200001440000000166114744456127014263 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{GetImage.SlideSeq} \alias{GetImage.SlideSeq} \alias{GetImage.STARmap} \alias{GetImage.VisiumV1} \alias{GetImage.VisiumV2} \title{Get Image Data} \usage{ \method{GetImage}{SlideSeq}(object, mode = c("grob", "raster", "plotly", "raw"), ...) \method{GetImage}{STARmap}(object, mode = c("grob", "raster", "plotly", "raw"), ...) \method{GetImage}{VisiumV1}(object, mode = c("grob", "raster", "plotly", "raw"), ...) \method{GetImage}{VisiumV2}(object, mode = c("grob", "raster", "plotly", "raw"), ...) } \arguments{ \item{object}{An object} \item{mode}{How to return the image; should accept one of \dQuote{grob}, \dQuote{raster}, \dQuote{plotly}, or \dQuote{raw}} \item{...}{Arguments passed to other methods} } \description{ Get Image Data } \seealso{ \code{\link[SeuratObject:GetImage]{SeuratObject::GetImage}} } \concept{objects} \concept{spatial} Seurat/man/FeatureScatter.Rd0000644000176200001440000000526714744456127015530 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{FeatureScatter} \alias{FeatureScatter} \alias{GenePlot} \title{Scatter plot of single cell data} \usage{ FeatureScatter( object, feature1, feature2, cells = NULL, shuffle = FALSE, seed = 1, group.by = NULL, split.by = NULL, cols = NULL, pt.size = 1, shape.by = NULL, span = NULL, smooth = FALSE, combine = TRUE, slot = "data", plot.cor = TRUE, ncol = NULL, raster = NULL, raster.dpi = c(512, 512), jitter = FALSE, log = FALSE ) } \arguments{ \item{object}{Seurat object} \item{feature1}{First feature to plot. Typically feature expression but can also be metrics, PC scores, etc. - anything that can be retreived with FetchData} \item{feature2}{Second feature to plot.} \item{cells}{Cells to include on the scatter plot.} \item{shuffle}{Whether to randomly shuffle the order of points. This can be useful for crowded plots if points of interest are being buried. (default is FALSE)} \item{seed}{Sets the seed if randomly shuffling the order of points.} \item{group.by}{Name of one or more metadata columns to group (color) cells by (for example, orig.ident); pass 'ident' to group by identity class} \item{split.by}{A factor in object metadata to split the feature plot by, pass 'ident' to split by cell identity} \item{cols}{Colors to use for identity class plotting.} \item{pt.size}{Size of the points on the plot} \item{shape.by}{Ignored for now} \item{span}{Spline span in loess function call, if \code{NULL}, no spline added} \item{smooth}{Smooth the graph (similar to smoothScatter)} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed}} \item{slot}{Slot to pull data from, should be one of 'counts', 'data', or 'scale.data'} \item{plot.cor}{Display correlation in plot title} \item{ncol}{Number of columns if plotting multiple plots} \item{raster}{Convert points to raster format, default is \code{NULL} which will automatically use raster if the number of points plotted is greater than 100,000} \item{raster.dpi}{Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512).} \item{jitter}{Jitter for easier visualization of crowded points (default is FALSE)} \item{log}{Plot features on the log scale (default is FALSE)} } \value{ A ggplot object } \description{ Creates a scatter plot of two features (typically feature expression), across a set of single cells. Cells are colored by their identity class. Pearson correlation between the two features is displayed above the plot. } \examples{ data("pbmc_small") FeatureScatter(object = pbmc_small, feature1 = 'CD9', feature2 = 'CD3E') } \concept{visualization} Seurat/man/SCTransform.Rd0000644000176200001440000001375414731364134015000 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing.R, % R/preprocessing5.R \name{SCTransform} \alias{SCTransform} \alias{SCTransform.default} \alias{SCTransform.Assay} \alias{SCTransform.Seurat} \alias{SCTransform.IterableMatrix} \title{Perform sctransform-based normalization} \usage{ SCTransform(object, ...) \method{SCTransform}{default}( object, cell.attr, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = umi)/30), sqrt(x = ncol(x = umi)/30)), vst.flavor = "v2", conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) \method{SCTransform}{Assay}( object, cell.attr, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object)/30), sqrt(x = ncol(x = object)/30)), vst.flavor = "v2", conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) \method{SCTransform}{Seurat}( object, assay = "RNA", new.assay.name = "SCT", reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object[[assay]])/30), sqrt(x = ncol(x = object[[assay]])/30)), vst.flavor = "v2", conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) \method{SCTransform}{IterableMatrix}( object, cell.attr, reference.SCT.model = NULL, do.correct.umi = TRUE, ncells = 5000, residual.features = NULL, variable.features.n = 3000, variable.features.rv.th = 1.3, vars.to.regress = NULL, latent.data = NULL, do.scale = FALSE, do.center = TRUE, clip.range = c(-sqrt(x = ncol(x = object)/30), sqrt(x = ncol(x = object)/30)), vst.flavor = "v2", conserve.memory = FALSE, return.only.var.genes = TRUE, seed.use = 1448145, verbose = TRUE, ... ) } \arguments{ \item{object}{UMI counts matrix} \item{...}{Additional parameters passed to \code{sctransform::vst}} \item{cell.attr}{A metadata with cell attributes} \item{reference.SCT.model}{If not NULL, compute residuals for the object using the provided SCT model; supports only log_umi as the latent variable. If residual.features are not specified, compute for the top variable.features.n specified in the model which are also present in the object. If residual.features are specified, the variable features of the resulting SCT assay are set to the top variable.features.n in the model.} \item{do.correct.umi}{Place corrected UMI matrix in assay counts slot; default is TRUE} \item{ncells}{Number of subsampling cells used to build NB regression; default is 5000} \item{residual.features}{Genes to calculate residual features for; default is NULL (all genes). If specified, will be set to VariableFeatures of the returned object.} \item{variable.features.n}{Use this many features as variable features after ranking by residual variance; default is 3000. Only applied if residual.features is not set.} \item{variable.features.rv.th}{Instead of setting a fixed number of variable features, use this residual variance cutoff; this is only used when \code{variable.features.n} is set to NULL; default is 1.3. Only applied if residual.features is not set.} \item{vars.to.regress}{Variables to regress out in a second non-regularized linear} \item{latent.data}{Extra data to regress out, should be cells x latent data regression. For example, percent.mito. Default is NULL} \item{do.scale}{Whether to scale residuals to have unit variance; default is FALSE} \item{do.center}{Whether to center residuals to have mean zero; default is TRUE} \item{clip.range}{Range to clip the residuals to; default is \code{c(-sqrt(n/30), sqrt(n/30))}, where n is the number of cells} \item{vst.flavor}{When set to 'v2' sets method = glmGamPoi_offset, n_cells=2000, and exclude_poisson = TRUE which causes the model to learn theta and intercept only besides excluding poisson genes from learning and regularization} \item{conserve.memory}{If set to TRUE the residual matrix for all genes is never created in full; useful for large data sets, but will take longer to run; this will also set return.only.var.genes to TRUE; default is FALSE} \item{return.only.var.genes}{If set to TRUE the scale.data matrices in output assay are subset to contain only the variable genes; default is TRUE} \item{seed.use}{Set a random seed. By default, sets the seed to 1448145. Setting NULL will not set a seed.} \item{verbose}{Whether to print messages and progress bars} \item{assay}{Name of assay to pull the count data from; default is 'RNA'} \item{new.assay.name}{Name for the new assay containing the normalized data; default is 'SCT'} } \value{ Returns a Seurat object with a new assay (named SCT by default) with counts being (corrected) counts, data being log1p(counts), scale.data being pearson residuals; sctransform::vst intermediate results are saved in misc slot of the new assay. } \description{ This function calls sctransform::vst. The sctransform package is available at https://github.com/satijalab/sctransform. Use this function as an alternative to the NormalizeData, FindVariableFeatures, ScaleData workflow. Results are saved in a new assay (named SCT by default) with counts being (corrected) counts, data being log1p(counts), scale.data being pearson residuals; sctransform::vst intermediate results are saved in misc slot of new assay. } \seealso{ \code{\link[sctransform]{correct_counts}} \code{\link[sctransform]{get_residuals}} } \concept{preprocessing} Seurat/man/DEenrichRPlot.Rd0000644000176200001440000001055214731364135015233 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{DEenrichRPlot} \alias{DEenrichRPlot} \title{DE and EnrichR pathway visualization barplot} \usage{ DEenrichRPlot( object, ident.1 = NULL, ident.2 = NULL, balanced = TRUE, logfc.threshold = 0.25, assay = NULL, max.genes, test.use = "wilcox", p.val.cutoff = 0.05, cols = NULL, enrich.database = NULL, num.pathway = 10, return.gene.list = FALSE, ... ) } \arguments{ \item{object}{Name of object class Seurat.} \item{ident.1}{Cell class identity 1.} \item{ident.2}{Cell class identity 2.} \item{balanced}{Option to display pathway enrichments for both negative and positive DE genes.If false, only positive DE gene will be displayed.} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.25. Increasing logfc.threshold speeds up the function, but can miss weaker signals.} \item{assay}{Assay to use in differential expression testing} \item{max.genes}{Maximum number of genes to use as input to enrichR.} \item{test.use}{Denotes which test to use. Available options are: \itemize{ \item{"wilcox"} : Identifies differentially expressed genes between two groups of cells using a Wilcoxon Rank Sum test (default); will use a fast implementation by Presto if installed \item{"wilcox_limma"} : Identifies differentially expressed genes between two groups of cells using the limma implementation of the Wilcoxon Rank Sum test; set this option to reproduce results from Seurat v4 \item{"bimod"} : Likelihood-ratio test for single cell gene expression, (McDavid et al., Bioinformatics, 2013) \item{"roc"} : Identifies 'markers' of gene expression using ROC analysis. For each gene, evaluates (using AUC) a classifier built on that gene alone, to classify between two groups of cells. An AUC value of 1 means that expression values for this gene alone can perfectly classify the two groupings (i.e. Each of the cells in cells.1 exhibit a higher level than each of the cells in cells.2). An AUC value of 0 also means there is perfect classification, but in the other direction. A value of 0.5 implies that the gene has no predictive power to classify the two groups. Returns a 'predictive power' (abs(AUC-0.5) * 2) ranked matrix of putative differentially expressed genes. \item{"t"} : Identify differentially expressed genes between two groups of cells using the Student's t-test. \item{"negbinom"} : Identifies differentially expressed genes between two groups of cells using a negative binomial generalized linear model. Use only for UMI-based datasets \item{"poisson"} : Identifies differentially expressed genes between two groups of cells using a poisson generalized linear model. Use only for UMI-based datasets \item{"LR"} : Uses a logistic regression framework to determine differentially expressed genes. Constructs a logistic regression model predicting group membership based on each feature individually and compares this to a null model with a likelihood ratio test. \item{"MAST"} : Identifies differentially expressed genes between two groups of cells using a hurdle model tailored to scRNA-seq data. Utilizes the MAST package to run the DE testing. \item{"DESeq2"} : Identifies differentially expressed genes between two groups of cells based on a model using DESeq2 which uses a negative binomial distribution (Love et al, Genome Biology, 2014).This test does not support pre-filtering of genes based on average difference (or percent detection rate) between cell groups. However, genes may be pre-filtered based on their minimum detection rate (min.pct) across both cell groups. To use this method, please install DESeq2, using the instructions at https://bioconductor.org/packages/release/bioc/html/DESeq2.html }} \item{p.val.cutoff}{Cutoff to select DE genes.} \item{cols}{A list of colors to use for barplots.} \item{enrich.database}{Database to use from enrichR.} \item{num.pathway}{Number of pathways to display in barplot.} \item{return.gene.list}{Return list of DE genes} \item{...}{Arguments passed to other methods and to specific DE methods} } \value{ Returns one (only enriched) or two (both enriched and depleted) barplots with the top enriched/depleted GO terms from EnrichR. } \description{ DE and EnrichR pathway visualization barplot } \concept{mixscape} Seurat/man/SingleDimPlot.Rd0000644000176200001440000000522014744456127015306 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleDimPlot} \alias{SingleDimPlot} \title{Plot a single dimension} \usage{ SingleDimPlot( data, dims, col.by = NULL, cols = NULL, pt.size = NULL, shape.by = NULL, alpha = 1, alpha.by = NULL, stroke.size = NULL, order = NULL, label = FALSE, repel = FALSE, label.size = 4, cells.highlight = NULL, cols.highlight = "#DE2D26", sizes.highlight = 1, na.value = "grey50", raster = NULL, raster.dpi = NULL ) } \arguments{ \item{data}{Data to plot} \item{dims}{A two-length numeric vector with dimensions to use} \item{col.by}{...} \item{cols}{Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}.By default, ggplot2 assigns colors} \item{pt.size}{Adjust point size for plotting} \item{shape.by}{If NULL, all points are circles (default). You can specify any cell attribute (that can be pulled with \code{\link{FetchData}}) allowing for both different colors and different shapes on cells.} \item{alpha}{Alpha value for plotting (default is 1)} \item{alpha.by}{Mapping variable for the point alpha value} \item{stroke.size}{Adjust stroke (outline) size of points} \item{order}{Specify the order of plotting for the idents. This can be useful for crowded plots if points of interest are being buried. Provide either a full list of valid idents or a subset to be plotted last (on top).} \item{label}{Whether to label the clusters} \item{repel}{Repel labels} \item{label.size}{Sets size of labels} \item{cells.highlight}{A list of character or numeric vectors of cells to highlight. If only one group of cells desired, can simply pass a vector instead of a list. If set, colors selected cells to the color(s) in \code{cols.highlight} and other cells black (white if dark.theme = TRUE); will also resize to the size(s) passed to \code{sizes.highlight}} \item{cols.highlight}{A vector of colors to highlight the cells as; will repeat to the length groups in cells.highlight} \item{sizes.highlight}{Size of highlighted cells; will repeat to the length groups in cells.highlight} \item{na.value}{Color value for NA points when using custom scale.} \item{raster}{Convert points to raster format, default is \code{NULL} which will automatically use raster if the number of points plotted is greater than 100,000} \item{raster.dpi}{the pixel resolution for rastered plots, passed to geom_scattermore(). Default is c(512, 512)} } \value{ A ggplot2 object } \description{ Plot a single dimension } \keyword{internal} Seurat/man/FastRPCAIntegration.Rd0000644000176200001440000000463314744456127016352 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{FastRPCAIntegration} \alias{FastRPCAIntegration} \title{Perform integration on the joint PCA cell embeddings.} \usage{ FastRPCAIntegration( object.list, reference = NULL, anchor.features = 2000, k.anchor = 20, dims = 1:30, scale = TRUE, normalization.method = c("LogNormalize", "SCT"), new.reduction.name = "integrated_dr", npcs = 50, findintegrationanchors.args = list(), verbose = TRUE ) } \arguments{ \item{object.list}{A list of \code{\link{Seurat}} objects between which to find anchors for downstream integration.} \item{reference}{A vector specifying the object/s to be used as a reference during integration. If NULL (default), all pairwise anchors are found (no reference/s). If not NULL, the corresponding objects in \code{object.list} will be used as references. When using a set of specified references, anchors are first found between each query and each reference. The references are then integrated through pairwise integration. Each query is then mapped to the integrated reference.} \item{anchor.features}{Can be either: \itemize{ \item{A numeric value. This will call \code{\link{SelectIntegrationFeatures}} to select the provided number of features to be used in anchor finding} \item{A vector of features to be used as input to the anchor finding process} }} \item{k.anchor}{How many neighbors (k) to use when picking anchors} \item{dims}{Which dimensions to use from the CCA to specify the neighbor search space} \item{scale}{Whether or not to scale the features provided. Only set to FALSE if you have previously scaled the features you want to use for each object in the object.list} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{new.reduction.name}{Name of integrated dimensional reduction} \item{npcs}{Total Number of PCs to compute and store (50 by default)} \item{findintegrationanchors.args}{A named list of additional arguments to \code{\link{FindIntegrationAnchors}}} \item{verbose}{Print messages and progress} } \value{ Returns a Seurat object with integrated dimensional reduction } \description{ This is a convenience wrapper function around the following three functions that are often run together when perform integration. \code{\link{FindIntegrationAnchors}}, \code{\link{RunPCA}}, \code{\link{IntegrateEmbeddings}}. } \concept{integration} Seurat/man/LogNormalize.Rd0000644000176200001440000000220414731364134015165 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing.R, % R/preprocessing5.R \name{LogNormalize} \alias{LogNormalize} \alias{LogNormalize.data.frame} \alias{LogNormalize.V3Matrix} \alias{LogNormalize.default} \title{Normalize Raw Data} \usage{ LogNormalize(data, scale.factor = 10000, margin = 2L, verbose = TRUE, ...) \method{LogNormalize}{data.frame}(data, scale.factor = 10000, margin = 2L, verbose = TRUE, ...) \method{LogNormalize}{V3Matrix}(data, scale.factor = 10000, margin = 2L, verbose = TRUE, ...) \method{LogNormalize}{default}(data, scale.factor = 10000, margin = 2L, verbose = TRUE, ...) } \arguments{ \item{data}{Matrix with the raw count data} \item{scale.factor}{Scale the data; default is \code{1e4}} \item{margin}{Margin to normalize over} \item{verbose}{Print progress} \item{...}{Arguments passed to other methods} } \value{ A matrix with the normalized and log-transformed data } \description{ Normalize Raw Data } \examples{ mat <- matrix(data = rbinom(n = 25, size = 5, prob = 0.2), nrow = 5) mat mat_norm <- LogNormalize(data = mat) mat_norm } \concept{preprocessing} Seurat/man/VisiumV2-class.Rd0000644000176200001440000000124614744456127015367 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{VisiumV2-class} \alias{VisiumV2-class} \alias{VisiumV2} \title{The VisiumV2 class} \description{ The VisiumV2 class represents spatial information from the 10X Genomics Visium HD platform - it can also accomodate data from the standard Visium platform } \section{Slots}{ \describe{ \item{\code{image}}{A three-dimensional array with PNG image data, see \code{\link[png]{readPNG}} for more details} \item{\code{scale.factors}}{An object of class \code{\link{scalefactors}}; see \code{\link{scalefactors}} for more information} }} \concept{objects} \concept{spatial} Seurat/man/L2Dim.Rd0000644000176200001440000000114114731364134013471 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensional_reduction.R \name{L2Dim} \alias{L2Dim} \title{L2-normalization} \usage{ L2Dim(object, reduction, new.dr = NULL, new.key = NULL) } \arguments{ \item{object}{Seurat object} \item{reduction}{Dimensional reduction to normalize} \item{new.dr}{name of new dimensional reduction to store (default is olddr.l2)} \item{new.key}{name of key for new dimensional reduction} } \value{ Returns a \code{\link{Seurat}} object } \description{ Perform l2 normalization on given dimensional reduction } \concept{dimensional_reduction} Seurat/man/TopFeatures.Rd0000644000176200001440000000172614731364135015035 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{TopFeatures} \alias{TopFeatures} \title{Find features with highest scores for a given dimensional reduction technique} \usage{ TopFeatures( object, dim = 1, nfeatures = 20, projected = FALSE, balanced = FALSE, ... ) } \arguments{ \item{object}{DimReduc object} \item{dim}{Dimension to use} \item{nfeatures}{Number of features to return} \item{projected}{Use the projected feature loadings} \item{balanced}{Return an equal number of features with both + and - scores.} \item{...}{Extra parameters passed to \code{\link{Loadings}}} } \value{ Returns a vector of features } \description{ Return a list of features with the strongest contribution to a set of components } \examples{ data("pbmc_small") pbmc_small TopFeatures(object = pbmc_small[["pca"]], dim = 1) # After projection: TopFeatures(object = pbmc_small[["pca"]], dim = 1, projected = TRUE) } \concept{objects} Seurat/man/ReadXenium.Rd0000644000176200001440000000503514743751115014633 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/convenience.R, R/preprocessing.R \name{LoadXenium} \alias{LoadXenium} \alias{ReadXenium} \title{Read and Load 10x Genomics Xenium in-situ data} \usage{ LoadXenium( data.dir, fov = "fov", assay = "Xenium", mols.qv.threshold = 20, cell.centroids = TRUE, molecule.coordinates = TRUE, segmentations = NULL, flip.xy = FALSE ) ReadXenium( data.dir, outs = c("segmentation_method", "matrix", "microns"), type = "centroids", mols.qv.threshold = 20, flip.xy = F ) } \arguments{ \item{data.dir}{Directory containing all Xenium output files with default filenames} \item{fov}{FOV name} \item{assay}{Assay name} \item{mols.qv.threshold}{Remove transcript molecules with a QV less than this threshold. QV >= 20 is the standard threshold used to construct the cell x gene count matrix.} \item{cell.centroids}{Whether or not to load cell centroids} \item{molecule.coordinates}{Whether or not to load molecule pixel coordinates} \item{segmentations}{One of "cell", "nucleus" or NULL (to load either cell segmentations, nucleus segmentations or neither)} \item{flip.xy}{Whether or not to flip the x/y coordinates of the Xenium outputs to match what is displayed in Xenium Explorer, or fit on your screen better.} \item{outs}{Types of molecular outputs to read; choose one or more of: \itemize{ \item \dQuote{matrix}: the counts matrix \item \dQuote{microns}: molecule coordinates \item \dQuote{segmentation_method}: cell segmentation method (for runs which use multi-modal segmentation) }} \item{type}{Type of cell spatial coordinate matrices to read; choose one or more of: \itemize{ \item \dQuote{centroids}: cell centroids in pixel coordinate space \item \dQuote{segmentations}: cell segmentations in pixel coordinate space \item \dQuote{nucleus_segmentations}: nucleus segmentations in pixel coordinate space }} } \value{ \code{LoadXenium}: A \code{\link[SeuratObject]{Seurat}} object \code{ReadXenium}: A list with some combination of the following values: \itemize{ \item \dQuote{\code{matrix}}: a \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells are columns and features are rows \item \dQuote{\code{centroids}}: a data frame with cell centroid coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{pixels}}: a data frame with molecule pixel coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} } } \description{ Read and Load 10x Genomics Xenium in-situ data } \concept{preprocessing} Seurat/man/RunICA.Rd0000644000176200001440000000426314731364134013653 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunICA} \alias{RunICA} \alias{RunICA.default} \alias{RunICA.Assay} \alias{RunICA.Seurat} \title{Run Independent Component Analysis on gene expression} \usage{ RunICA(object, ...) \method{RunICA}{default}( object, assay = NULL, nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "ica_", seed.use = 42, ... ) \method{RunICA}{Assay}( object, assay = NULL, features = NULL, nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "ica_", seed.use = 42, ... ) \method{RunICA}{Seurat}( object, assay = NULL, features = NULL, nics = 50, rev.ica = FALSE, ica.function = "icafast", verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "ica", reduction.key = "IC_", seed.use = 42, ... ) } \arguments{ \item{object}{Seurat object} \item{\dots}{Additional arguments to be passed to fastica} \item{assay}{Name of Assay ICA is being run on} \item{nics}{Number of ICs to compute} \item{rev.ica}{By default, computes the dimensional reduction on the cell x feature matrix. Setting to true will compute it on the transpose (feature x cell matrix).} \item{ica.function}{ICA function from ica package to run (options: icafast, icaimax, icajade)} \item{verbose}{Print the top genes associated with high/low loadings for the ICs} \item{ndims.print}{ICs to print genes for} \item{nfeatures.print}{Number of genes to print for each IC} \item{reduction.name}{dimensional reduction name} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names.} \item{seed.use}{Set a random seed. Setting NULL will not set a seed.} \item{features}{Features to compute ICA on} } \description{ Run fastica algorithm from the ica package for ICA dimensionality reduction. For details about stored ICA calculation parameters, see \code{PrintICAParams}. } \concept{dimensional_reduction} Seurat/man/GaussianSketch.Rd0000644000176200001440000000105214731364135015500 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sketching.R \name{GaussianSketch} \alias{GaussianSketch} \title{Gaussian sketching} \usage{ GaussianSketch(nsketch, ncells, seed = NA_integer_, ...) } \arguments{ \item{nsketch}{Number of sketching random cells} \item{ncells}{Number of cells in the original data} \item{seed}{a single value, interpreted as an integer, or \code{NULL} (see \sQuote{Details}).} \item{...}{Ignored} } \value{ ... } \description{ Gaussian sketching } \concept{sketching} \keyword{internal} Seurat/man/JackStrawData-class.Rd0000644000176200001440000000062214731364133016352 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{JackStrawData-class} \alias{JackStrawData-class} \title{The JackStrawData Class} \description{ For more details, please see the documentation in \code{\link[SeuratObject:JackStrawData]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:JackStrawData]{SeuratObject::JackStrawData-class}} } Seurat/man/GetResidual.Rd0000644000176200001440000000314014731364135014774 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{GetResidual} \alias{GetResidual} \title{Calculate pearson residuals of features not in the scale.data} \usage{ GetResidual( object, features, assay = NULL, umi.assay = "RNA", clip.range = NULL, replace.value = FALSE, na.rm = TRUE, verbose = TRUE ) } \arguments{ \item{object}{A seurat object} \item{features}{Name of features to add into the scale.data} \item{assay}{Name of the assay of the seurat object generated by SCTransform} \item{umi.assay}{Name of the assay of the seurat object containing UMI matrix and the default is RNA} \item{clip.range}{Numeric of length two specifying the min and max values the Pearson residual will be clipped to} \item{replace.value}{Recalculate residuals for all features, even if they are already present. Useful if you want to change the clip.range.} \item{na.rm}{For features where there is no feature model stored, return NA for residual value in scale.data when na.rm = FALSE. When na.rm is TRUE, only return residuals for features with a model stored for all cells.} \item{verbose}{Whether to print messages and progress bars} } \value{ Returns a Seurat object containing Pearson residuals of added features in its scale.data } \description{ This function calls sctransform::get_residuals. } \examples{ \dontrun{ data("pbmc_small") pbmc_small <- SCTransform(object = pbmc_small, variable.features.n = 20) pbmc_small <- GetResidual(object = pbmc_small, features = c('MS4A1', 'TCL1A')) } } \seealso{ \code{\link[sctransform]{get_residuals}} } \concept{preprocessing} Seurat/man/FoldChange.Rd0000644000176200001440000000670714731364134014571 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/differential_expression.R \name{FoldChange} \alias{FoldChange} \alias{FoldChange.default} \alias{FoldChange.Assay} \alias{FoldChange.SCTAssay} \alias{FoldChange.DimReduc} \alias{FoldChange.Seurat} \title{Fold Change} \usage{ FoldChange(object, ...) \method{FoldChange}{default}(object, cells.1, cells.2, mean.fxn, fc.name, features = NULL, ...) \method{FoldChange}{Assay}( object, cells.1, cells.2, features = NULL, slot = "data", pseudocount.use = 1, fc.name = NULL, mean.fxn = NULL, base = 2, norm.method = NULL, ... ) \method{FoldChange}{SCTAssay}( object, cells.1, cells.2, features = NULL, slot = "data", pseudocount.use = 1, fc.name = NULL, mean.fxn = NULL, base = 2, ... ) \method{FoldChange}{DimReduc}( object, cells.1, cells.2, features = NULL, slot = NULL, pseudocount.use = 1, fc.name = NULL, mean.fxn = NULL, ... ) \method{FoldChange}{Seurat}( object, ident.1 = NULL, ident.2 = NULL, group.by = NULL, subset.ident = NULL, assay = NULL, slot = "data", reduction = NULL, features = NULL, pseudocount.use = 1, mean.fxn = NULL, base = 2, fc.name = NULL, ... ) } \arguments{ \item{object}{A Seurat object} \item{...}{Arguments passed to other methods} \item{cells.1}{Vector of cell names belonging to group 1} \item{cells.2}{Vector of cell names belonging to group 2} \item{mean.fxn}{Function to use for fold change or average difference calculation} \item{fc.name}{Name of the fold change, average difference, or custom function column in the output data.frame} \item{features}{Features to calculate fold change for. If NULL, use all features} \item{slot}{Slot to pull data from} \item{pseudocount.use}{Pseudocount to add to averaged expression values when calculating logFC.} \item{base}{The base with respect to which logarithms are computed.} \item{norm.method}{Normalization method for mean function selection when \code{slot} is \dQuote{\code{data}}} \item{ident.1}{Identity class to calculate fold change for; pass an object of class \code{phylo} or 'clustertree' to calculate fold change for a node in a cluster tree; passing 'clustertree' requires \code{\link{BuildClusterTree}} to have been run} \item{ident.2}{A second identity class for comparison; if \code{NULL}, use all other cells for comparison; if an object of class \code{phylo} or 'clustertree' is passed to \code{ident.1}, must pass a node to calculate fold change for} \item{group.by}{Regroup cells into a different identity class prior to calculating fold change (see example in \code{\link{FindMarkers}})} \item{subset.ident}{Subset a particular identity class prior to regrouping. Only relevant if group.by is set (see example in \code{\link{FindMarkers}})} \item{assay}{Assay to use in fold change calculation} \item{reduction}{Reduction to use - will calculate average difference on cell embeddings} } \value{ Returns a data.frame } \description{ Calculate log fold change and percentage of cells expressing each feature for different identity classes. } \details{ If the slot is \code{scale.data} or a reduction is specified, average difference is returned instead of log fold change and the column is named "avg_diff". Otherwise, log2 fold change is returned with column named "avg_log2_FC". } \examples{ \dontrun{ data("pbmc_small") FoldChange(pbmc_small, ident.1 = 1) } } \seealso{ \code{FindMarkers} } \concept{differential_expression} Seurat/man/SetIntegrationData.Rd0000644000176200001440000000102314731364135016313 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{SetIntegrationData} \alias{SetIntegrationData} \title{Set integration data} \usage{ SetIntegrationData(object, integration.name, slot, new.data) } \arguments{ \item{object}{Seurat object} \item{integration.name}{Name of integration object} \item{slot}{Which slot in integration object to set} \item{new.data}{New data to insert} } \value{ Returns a \code{\link{Seurat}} object } \description{ Set integration data } \concept{objects} Seurat/man/ExpVar.Rd0000644000176200001440000000065514731364135014001 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{ExpVar} \alias{ExpVar} \title{Calculate the variance of logged values} \usage{ ExpVar(x) } \arguments{ \item{x}{A vector of values} } \value{ Returns the variance in log-space } \description{ Calculate variance of logged values in non-log space (return answer in log-space) } \examples{ ExpVar(x = c(1, 2, 3)) } \concept{utilities} Seurat/man/RegroupIdents.Rd0000644000176200001440000000113314731364135015356 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{RegroupIdents} \alias{RegroupIdents} \title{Regroup idents based on meta.data info} \usage{ RegroupIdents(object, metadata) } \arguments{ \item{object}{Seurat object} \item{metadata}{Name of metadata column} } \value{ A Seurat object with the active idents regrouped } \description{ For cells in each ident, set a new identity based on the most common value of a specified metadata column. } \examples{ data("pbmc_small") pbmc_small <- RegroupIdents(pbmc_small, metadata = "groups") } \concept{utilities} Seurat/man/RunLDA.Rd0000644000176200001440000000312514731364134013653 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/mixscape.R \name{RunLDA} \alias{RunLDA} \alias{RunLDA.default} \alias{RunLDA.Assay} \alias{RunLDA.Seurat} \title{Run Linear Discriminant Analysis} \usage{ RunLDA(object, ...) \method{RunLDA}{default}( object, labels, assay = NULL, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "LDA_", seed = 42, ... ) \method{RunLDA}{Assay}( object, assay = NULL, labels, features = NULL, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "LDA_", seed = 42, ... ) \method{RunLDA}{Seurat}( object, assay = NULL, labels, features = NULL, reduction.name = "lda", reduction.key = "LDA_", seed = 42, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, ... ) } \arguments{ \item{object}{An object of class Seurat.} \item{...}{Arguments passed to other methods} \item{labels}{Meta data column with target gene class labels.} \item{assay}{Assay to use for performing Linear Discriminant Analysis (LDA).} \item{verbose}{Print the top genes associated with high/low loadings for the PCs} \item{ndims.print}{Number of LDA dimensions to print.} \item{nfeatures.print}{Number of features to print for each LDA component.} \item{reduction.key}{Reduction key name.} \item{seed}{Value for random seed} \item{features}{Features to compute LDA on} \item{reduction.name}{dimensional reduction name, lda by default} } \description{ Run Linear Discriminant Analysis Function to perform Linear Discriminant Analysis. } \concept{mixscape} Seurat/man/cc.genes.Rd0000644000176200001440000000075414731364134014260 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{cc.genes} \alias{cc.genes} \title{Cell cycle genes} \format{ A list of two vectors \describe{ \item{s.genes}{Genes associated with S-phase} \item{g2m.genes}{Genes associated with G2M-phase} } } \source{ \url{https://www.science.org/doi/abs/10.1126/science.aad0501} } \usage{ cc.genes } \description{ A list of genes used in cell-cycle regression } \concept{data} \keyword{datasets} Seurat/man/MixscapeHeatmap.Rd0000644000176200001440000001211614731364135015640 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{MixscapeHeatmap} \alias{MixscapeHeatmap} \title{Differential expression heatmap for mixscape} \usage{ MixscapeHeatmap( object, ident.1 = NULL, ident.2 = NULL, balanced = TRUE, logfc.threshold = 0.25, assay = "RNA", max.genes = 100, test.use = "wilcox", max.cells.group = NULL, order.by.prob = TRUE, group.by = NULL, mixscape.class = "mixscape_class", prtb.type = "KO", fc.name = "avg_log2FC", pval.cutoff = 0.05, ... ) } \arguments{ \item{object}{An object} \item{ident.1}{Identity class to define markers for; pass an object of class \code{phylo} or 'clustertree' to find markers for a node in a cluster tree; passing 'clustertree' requires \code{\link{BuildClusterTree}} to have been run} \item{ident.2}{A second identity class for comparison; if \code{NULL}, use all other cells for comparison; if an object of class \code{phylo} or 'clustertree' is passed to \code{ident.1}, must pass a node to find markers for} \item{balanced}{Plot an equal number of genes with both groups of cells.} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.25. Increasing logfc.threshold speeds up the function, but can miss weaker signals.} \item{assay}{Assay to use in differential expression testing} \item{max.genes}{Total number of DE genes to plot.} \item{test.use}{Denotes which test to use. Available options are: \itemize{ \item{"wilcox"} : Identifies differentially expressed genes between two groups of cells using a Wilcoxon Rank Sum test (default); will use a fast implementation by Presto if installed \item{"wilcox_limma"} : Identifies differentially expressed genes between two groups of cells using the limma implementation of the Wilcoxon Rank Sum test; set this option to reproduce results from Seurat v4 \item{"bimod"} : Likelihood-ratio test for single cell gene expression, (McDavid et al., Bioinformatics, 2013) \item{"roc"} : Identifies 'markers' of gene expression using ROC analysis. For each gene, evaluates (using AUC) a classifier built on that gene alone, to classify between two groups of cells. An AUC value of 1 means that expression values for this gene alone can perfectly classify the two groupings (i.e. Each of the cells in cells.1 exhibit a higher level than each of the cells in cells.2). An AUC value of 0 also means there is perfect classification, but in the other direction. A value of 0.5 implies that the gene has no predictive power to classify the two groups. Returns a 'predictive power' (abs(AUC-0.5) * 2) ranked matrix of putative differentially expressed genes. \item{"t"} : Identify differentially expressed genes between two groups of cells using the Student's t-test. \item{"negbinom"} : Identifies differentially expressed genes between two groups of cells using a negative binomial generalized linear model. Use only for UMI-based datasets \item{"poisson"} : Identifies differentially expressed genes between two groups of cells using a poisson generalized linear model. Use only for UMI-based datasets \item{"LR"} : Uses a logistic regression framework to determine differentially expressed genes. Constructs a logistic regression model predicting group membership based on each feature individually and compares this to a null model with a likelihood ratio test. \item{"MAST"} : Identifies differentially expressed genes between two groups of cells using a hurdle model tailored to scRNA-seq data. Utilizes the MAST package to run the DE testing. \item{"DESeq2"} : Identifies differentially expressed genes between two groups of cells based on a model using DESeq2 which uses a negative binomial distribution (Love et al, Genome Biology, 2014).This test does not support pre-filtering of genes based on average difference (or percent detection rate) between cell groups. However, genes may be pre-filtered based on their minimum detection rate (min.pct) across both cell groups. To use this method, please install DESeq2, using the instructions at https://bioconductor.org/packages/release/bioc/html/DESeq2.html }} \item{max.cells.group}{Number of cells per identity to plot.} \item{order.by.prob}{Order cells on heatmap based on their mixscape knockout probability from highest to lowest score.} \item{group.by}{(Deprecated) Option to split densities based on mixscape classification. Please use mixscape.class instead} \item{mixscape.class}{metadata column with mixscape classifications.} \item{prtb.type}{specify type of CRISPR perturbation expected for labeling mixscape classifications. Default is KO.} \item{fc.name}{Name of the fold change, average difference, or custom function column in the output data.frame. Default is avg_log2FC} \item{pval.cutoff}{P-value cut-off for selection of significantly DE genes.} \item{...}{Arguments passed to other methods and to specific DE methods} } \value{ A ggplot object. } \description{ Draws a heatmap of single cell feature expression with cells ordered by their mixscape ko probabilities. } \concept{mixscape} Seurat/man/GetTransferPredictions.Rd0000644000176200001440000000207714731364134017223 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{GetTransferPredictions} \alias{GetTransferPredictions} \title{Get the predicted identity} \usage{ GetTransferPredictions( object, assay = "predictions", slot = "data", score.filter = 0.75 ) } \arguments{ \item{object}{Seurat object} \item{assay}{Name of the assay holding the predictions} \item{slot}{Slot of the assay in which the prediction scores are stored} \item{score.filter}{Return "Unassigned" for any cell with a score less than this value} } \value{ Returns a vector of predicted class names } \description{ Utility function to easily pull out the name of the class with the maximum prediction. This is useful if you've set \code{prediction.assay = TRUE} in \code{\link{TransferData}} and want to have a vector with the predicted class. } \examples{ \dontrun{ prediction.assay <- TransferData(anchorset = anchors, refdata = reference$class) query[["predictions"]] <- prediction.assay query$predicted.id <- GetTransferPredictions(query) } } \concept{integration} Seurat/man/IFeaturePlot.Rd0000644000176200001440000000144514731364134015134 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{IFeaturePlot} \alias{IFeaturePlot} \title{Visualize features in dimensional reduction space interactively} \usage{ IFeaturePlot(object, feature, dims = c(1, 2), reduction = NULL, slot = "data") } \arguments{ \item{object}{Seurat object} \item{feature}{Feature to plot} \item{dims}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} \item{reduction}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} \item{slot}{Which slot to pull expression data from?} } \value{ Returns the final plot as a ggplot object } \description{ Visualize features in dimensional reduction space interactively } \concept{visualization} Seurat/man/ModalityWeights-class.Rd0000644000176200001440000000176414731364135017016 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{ModalityWeights-class} \alias{ModalityWeights-class} \alias{ModalityWeights} \title{The ModalityWeights Class} \description{ The ModalityWeights class is an intermediate data storage class that stores the modality weight and other related information needed for performing downstream analyses - namely data integration (\code{FindModalityWeights}) and data transfer (\code{\link{FindMultiModalNeighbors}}). } \section{Slots}{ \describe{ \item{\code{modality.weight.list}}{A list of modality weights value from all modalities} \item{\code{modality.assay}}{Names of assays for the list of dimensional reductions} \item{\code{params}}{A list of parameters used in the FindModalityWeights} \item{\code{score.matrix}}{a list of score matrices representing cross and within-modality prediction score, and kernel value} \item{\code{command}}{Store log of parameters that were used} }} \concept{objects} Seurat/man/MULTIseqDemux.Rd0000644000176200001440000000240114744462764015204 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{MULTIseqDemux} \alias{MULTIseqDemux} \title{Demultiplex samples based on classification method from MULTI-seq (McGinnis et al., bioRxiv 2018)} \usage{ MULTIseqDemux( object, assay = "HTO", quantile = 0.7, autoThresh = FALSE, maxiter = 5, qrange = seq(from = 0.1, to = 0.9, by = 0.05), verbose = TRUE ) } \arguments{ \item{object}{Seurat object. Assumes that the specified assay data has been added} \item{assay}{Name of the multiplexing assay (HTO by default)} \item{quantile}{The quantile to use for classification} \item{autoThresh}{Whether to perform automated threshold finding to define the best quantile. Default is FALSE} \item{maxiter}{Maximum number of iterations if autoThresh = TRUE. Default is 5} \item{qrange}{A range of possible quantile values to try if autoThresh = TRUE} \item{verbose}{Prints the output} } \value{ A Seurat object with demultiplexing results stored at \code{object$MULTI_ID} } \description{ Identify singlets, doublets and negative cells from multiplexing experiments. Annotate singlets by tags. } \examples{ \dontrun{ object <- MULTIseqDemux(object) } } \references{ \doi{10.1038/s41592-019-0433-8} } \concept{preprocessing} Seurat/man/ReadMtx.Rd0000644000176200001440000000361114731364135014133 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{ReadMtx} \alias{ReadMtx} \title{Load in data from remote or local mtx files} \usage{ ReadMtx( mtx, cells, features, cell.column = 1, feature.column = 2, cell.sep = "\\t", feature.sep = "\\t", skip.cell = 0, skip.feature = 0, mtx.transpose = FALSE, unique.features = TRUE, strip.suffix = FALSE ) } \arguments{ \item{mtx}{Name or remote URL of the mtx file} \item{cells}{Name or remote URL of the cells/barcodes file} \item{features}{Name or remote URL of the features/genes file} \item{cell.column}{Specify which column of cells file to use for cell names; default is 1} \item{feature.column}{Specify which column of features files to use for feature/gene names; default is 2} \item{cell.sep}{Specify the delimiter in the cell name file} \item{feature.sep}{Specify the delimiter in the feature name file} \item{skip.cell}{Number of lines to skip in the cells file before beginning to read cell names} \item{skip.feature}{Number of lines to skip in the features file before beginning to gene names} \item{mtx.transpose}{Transpose the matrix after reading in} \item{unique.features}{Make feature names unique (default TRUE)} \item{strip.suffix}{Remove trailing "-1" if present in all cell barcodes.} } \value{ A sparse matrix containing the expression data. } \description{ Enables easy loading of sparse data matrices } \examples{ \dontrun{ # For local files: expression_matrix <- ReadMtx( mtx = "count_matrix.mtx.gz", features = "features.tsv.gz", cells = "barcodes.tsv.gz" ) seurat_object <- CreateSeuratObject(counts = expression_matrix) # For remote files: expression_matrix <- ReadMtx(mtx = "http://localhost/matrix.mtx", cells = "http://localhost/barcodes.tsv", features = "http://localhost/genes.tsv") seurat_object <- CreateSeuratObject(counts = data) } } \concept{preprocessing} Seurat/man/SingleRasterMap.Rd0000644000176200001440000000201614731364134015624 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleRasterMap} \alias{SingleRasterMap} \title{A single heatmap from ggplot2 using geom_raster} \usage{ SingleRasterMap( data, raster = TRUE, cell.order = NULL, feature.order = NULL, colors = PurpleAndYellow(), disp.min = -2.5, disp.max = 2.5, limits = NULL, group.by = NULL ) } \arguments{ \item{data}{A matrix or data frame with data to plot} \item{raster}{switch between geom_raster and geom_tile} \item{cell.order}{...} \item{feature.order}{...} \item{colors}{A vector of colors to use} \item{disp.min}{Minimum display value (all values below are clipped)} \item{disp.max}{Maximum display value (all values above are clipped)} \item{limits}{A two-length numeric vector with the limits for colors on the plot} \item{group.by}{A vector to group cells by, should be one grouping identity per cell} } \value{ A ggplot2 object } \description{ A single heatmap from ggplot2 using geom_raster } \keyword{internal} Seurat/man/LeverageScore.Rd0000644000176200001440000000534014741546375015327 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/sketching.R \name{LeverageScore} \alias{LeverageScore} \alias{LeverageScore.default} \alias{LeverageScore.StdAssay} \alias{LeverageScore.Assay} \alias{LeverageScore.Seurat} \title{Leverage Score Calculation} \usage{ LeverageScore(object, ...) \method{LeverageScore}{default}( object, nsketch = 5000L, ndims = NULL, method = CountSketch, eps = 0.5, seed = 123L, verbose = TRUE, ... ) \method{LeverageScore}{StdAssay}( object, nsketch = 5000L, ndims = NULL, method = CountSketch, vf.method = NULL, layer = "data", eps = 0.5, seed = 123L, verbose = TRUE, features = NULL, ... ) \method{LeverageScore}{Assay}( object, nsketch = 5000L, ndims = NULL, method = CountSketch, vf.method = NULL, layer = "data", eps = 0.5, seed = 123L, verbose = TRUE, features = NULL, ... ) \method{LeverageScore}{Seurat}( object, assay = NULL, nsketch = 5000L, ndims = NULL, var.name = "leverage.score", over.write = FALSE, method = CountSketch, vf.method = NULL, layer = "data", eps = 0.5, seed = 123L, verbose = TRUE, features = NULL, ... ) } \arguments{ \item{object}{A matrix-like object} \item{...}{Arguments passed to other methods} \item{nsketch}{A positive integer. The number of sketches to be used in the approximation. Default is 5000.} \item{ndims}{A positive integer or NULL. The number of dimensions to use. If NULL, the number of dimensions will default to the number of columns in the object.} \item{method}{The sketching method to use, defaults to CountSketch.} \item{eps}{A numeric. The error tolerance for the approximation in Johnson–Lindenstrauss embeddings, defaults to 0.5.} \item{seed}{A positive integer. The seed for the random number generator, defaults to 123.} \item{verbose}{Print progress and diagnostic messages} \item{vf.method}{VariableFeatures method} \item{layer}{layer to use} \item{features}{A vector of feature names to use for calculating leverage score.} \item{assay}{assay to use} \item{var.name}{name of slot to store leverage scores} \item{over.write}{whether to overwrite slot that currently stores leverage scores. Defaults to FALSE, in which case the 'var.name' is modified if it already exists in the object} } \description{ This function computes the leverage scores for a given object It uses the concept of sketching and random projections. The function provides an approximation to the leverage scores using a scalable method suitable for large matrices. } \references{ Clarkson, K. L. & Woodruff, D. P. Low-rank approximation and regression in input sparsity time. JACM 63, 1–45 (2017). \url{https://dl.acm.org/doi/10.1145/3019134}; } \concept{sketching} Seurat/man/ProjectDimReduc.Rd0000644000176200001440000000270714731364134015616 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{ProjectDimReduc} \alias{ProjectDimReduc} \title{Project query data to reference dimensional reduction} \usage{ ProjectDimReduc( query, reference, mode = c("pcaproject", "lsiproject"), reference.reduction, combine = FALSE, query.assay = NULL, reference.assay = NULL, features = NULL, do.scale = TRUE, reduction.name = NULL, reduction.key = NULL, verbose = TRUE ) } \arguments{ \item{query}{Query object} \item{reference}{Reference object} \item{mode}{Projection mode name for projection \itemize{ \item{pcaproject: PCA projection} \item{lsiproject: LSI projection} }} \item{reference.reduction}{Name of dimensional reduction in the reference object} \item{combine}{Determine if query and reference objects are combined} \item{query.assay}{Assay used for query object} \item{reference.assay}{Assay used for reference object} \item{features}{Features used for projection} \item{do.scale}{Determine if scale expression matrix in the pcaproject mode} \item{reduction.name}{dimensional reduction name, reference.reduction is used by default} \item{reduction.key}{dimensional reduction key, the key in reference.reduction is used by default} \item{verbose}{Print progress and message} } \value{ Returns a query-only or query-reference combined seurat object } \description{ Project query data to reference dimensional reduction } \concept{integration} Seurat/man/BridgeReferenceSet-class.Rd0000644000176200001440000000133614731364135017363 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{BridgeReferenceSet-class} \alias{BridgeReferenceSet-class} \alias{BridgeReferenceSet} \title{The BridgeReferenceSet Class The BridgeReferenceSet is an output from PrepareBridgeReference} \description{ The BridgeReferenceSet Class The BridgeReferenceSet is an output from PrepareBridgeReference } \section{Slots}{ \describe{ \item{\code{bridge}}{The multi-omic object} \item{\code{reference}}{The Reference object only containing bridge representation assay} \item{\code{params}}{A list of parameters used in the PrepareBridgeReference} \item{\code{command}}{Store log of parameters that were used} }} \concept{objects} Seurat/man/NNtoGraph.Rd0000644000176200001440000000111214731364134014420 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{NNtoGraph} \alias{NNtoGraph} \title{Convert Neighbor class to an asymmetrical Graph class} \usage{ NNtoGraph(nn.object, col.cells = NULL, weighted = FALSE) } \arguments{ \item{nn.object}{A neighbor class object} \item{col.cells}{Cells names of the neighbors, cell names in nn.object is used by default} \item{weighted}{Determine if use distance in the Graph} } \value{ Returns a Graph object } \description{ Convert Neighbor class to an asymmetrical Graph class } \concept{integration} Seurat/man/TransferAnchorSet-class.Rd0000644000176200001440000000061214731364135017263 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{TransferAnchorSet-class} \alias{TransferAnchorSet-class} \alias{TransferAnchorSet} \title{The TransferAnchorSet Class} \description{ Inherits from the Anchorset class. Implemented mainly for method dispatch purposes. See \code{\link{AnchorSet}} for slot details. } \concept{objects} Seurat/man/AddModuleScore.Rd0000644000176200001440000000473214731364135015426 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{AddModuleScore} \alias{AddModuleScore} \title{Calculate module scores for feature expression programs in single cells} \usage{ AddModuleScore( object, features, pool = NULL, nbin = 24, ctrl = 100, k = FALSE, assay = NULL, name = "Cluster", seed = 1, search = FALSE, slot = "data", ... ) } \arguments{ \item{object}{Seurat object} \item{features}{A list of vectors of features for expression programs; each entry should be a vector of feature names} \item{pool}{List of features to check expression levels against, defaults to \code{rownames(x = object)}} \item{nbin}{Number of bins of aggregate expression levels for all analyzed features} \item{ctrl}{Number of control features selected from the same bin per analyzed feature} \item{k}{Use feature clusters returned from DoKMeans} \item{assay}{Name of assay to use} \item{name}{Name for the expression programs; will append a number to the end for each entry in \code{features} (eg. if \code{features} has three programs, the results will be stored as \code{name1}, \code{name2}, \code{name3}, respectively)} \item{seed}{Set a random seed. If NULL, seed is not set.} \item{search}{Search for symbol synonyms for features in \code{features} that don't match features in \code{object}? Searches the HGNC's gene names database; see \code{\link{UpdateSymbolList}} for more details} \item{slot}{Slot to calculate score values off of. Defaults to data slot (i.e log-normalized counts)} \item{...}{Extra parameters passed to \code{\link{UpdateSymbolList}}} } \value{ Returns a Seurat object with module scores added to object meta data; each module is stored as \code{name#} for each module program present in \code{features} } \description{ Calculate the average expression levels of each program (cluster) on single cell level, subtracted by the aggregated expression of control feature sets. All analyzed features are binned based on averaged expression, and the control features are randomly selected from each bin. } \examples{ \dontrun{ data("pbmc_small") cd_features <- list(c( 'CD79B', 'CD79A', 'CD19', 'CD180', 'CD200', 'CD3D', 'CD2', 'CD3E', 'CD7', 'CD8A', 'CD14', 'CD1C', 'CD68', 'CD9', 'CD247' )) pbmc_small <- AddModuleScore( object = pbmc_small, features = cd_features, ctrl = 5, name = 'CD_Features' ) head(x = pbmc_small[]) } } \references{ Tirosh et al, Science (2016) } \concept{utilities} Seurat/man/SpatialPlot.Rd0000644000176200001440000001431214744456127015032 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R, R/convenience.R \name{SpatialPlot} \alias{SpatialPlot} \alias{SpatialDimPlot} \alias{SpatialFeaturePlot} \title{Visualize spatial clustering and expression data.} \usage{ SpatialPlot( object, group.by = NULL, features = NULL, images = NULL, cols = NULL, image.alpha = 1, image.scale = "lowres", crop = TRUE, slot = "data", keep.scale = "feature", min.cutoff = NA, max.cutoff = NA, cells.highlight = NULL, cols.highlight = c("#DE2D26", "grey50"), facet.highlight = FALSE, label = FALSE, label.size = 5, label.color = "white", label.box = TRUE, repel = FALSE, ncol = NULL, combine = TRUE, pt.size.factor = 1.6, alpha = c(1, 1), shape = 21, stroke = NA, interactive = FALSE, do.identify = FALSE, identify.ident = NULL, do.hover = FALSE, information = NULL ) SpatialDimPlot( object, group.by = NULL, images = NULL, cols = NULL, crop = TRUE, cells.highlight = NULL, cols.highlight = c("#DE2D26", "grey50"), facet.highlight = FALSE, label = FALSE, label.size = 7, label.color = "white", repel = FALSE, ncol = NULL, combine = TRUE, pt.size.factor = 1.6, alpha = c(1, 1), image.alpha = 1, image.scale = "lowres", shape = 21, stroke = NA, label.box = TRUE, interactive = FALSE, information = NULL ) SpatialFeaturePlot( object, features, images = NULL, crop = TRUE, slot = "data", keep.scale = "feature", min.cutoff = NA, max.cutoff = NA, ncol = NULL, combine = TRUE, pt.size.factor = 1.6, alpha = c(1, 1), image.alpha = 1, image.scale = "lowres", shape = 21, stroke = NA, interactive = FALSE, information = NULL ) } \arguments{ \item{object}{A Seurat object} \item{group.by}{Name of meta.data column to group the data by} \item{features}{Name of the feature to visualize. Provide either group.by OR features, not both.} \item{images}{Name of the images to use in the plot(s)} \item{cols}{Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns colors} \item{image.alpha}{Adjust the opacity of the background images. Set to 0 to remove.} \item{image.scale}{Choose the scale factor ("lowres"/"hires") to apply in order to matchthe plot with the specified `image` - defaults to "lowres"} \item{crop}{Crop the plot in to focus on points plotted. Set to \code{FALSE} to show entire background image.} \item{slot}{If plotting a feature, which data slot to pull from (counts, data, or scale.data)} \item{keep.scale}{How to handle the color scale across multiple plots. Options are: \itemize{ \item \dQuote{feature} (default; by row/feature scaling): The plots for each individual feature are scaled to the maximum expression of the feature across the conditions provided to \code{split.by} \item \dQuote{all} (universal scaling): The plots for all features and conditions are scaled to the maximum expression value for the feature with the highest overall expression \item \code{NULL} (no scaling): Each individual plot is scaled to the maximum expression value of the feature in the condition provided to \code{split.by}; be aware setting \code{NULL} will result in color scales that are not comparable between plots }} \item{min.cutoff, max.cutoff}{Vector of minimum and maximum cutoff values for each feature, may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10')} \item{cells.highlight}{A list of character or numeric vectors of cells to highlight. If only one group of cells desired, can simply pass a vector instead of a list. If set, colors selected cells to the color(s) in cols.highlight} \item{cols.highlight}{A vector of colors to highlight the cells as; ordered the same as the groups in cells.highlight; last color corresponds to unselected cells.} \item{facet.highlight}{When highlighting certain groups of cells, split each group into its own plot} \item{label}{Whether to label the clusters} \item{label.size}{Sets the size of the labels} \item{label.color}{Sets the color of the label text} \item{label.box}{Whether to put a box around the label text (geom_text vs geom_label)} \item{repel}{Repels the labels to prevent overlap} \item{ncol}{Number of columns if plotting multiple plots} \item{combine}{Combine plots into a single gg object; note that if TRUE; themeing will not work when plotting multiple features/groupings} \item{pt.size.factor}{Scale the size of the spots.} \item{alpha}{Controls opacity of spots. Provide as a vector specifying the min and max for SpatialFeaturePlot. For SpatialDimPlot, provide a single alpha value for each plot.} \item{shape}{Control the shape of the spots - same as the ggplot2 parameter. The default is 21, which plots circles - use 22 to plot squares.} \item{stroke}{Control the width of the border around the spots} \item{interactive}{Launch an interactive SpatialDimPlot or SpatialFeaturePlot session, see \code{\link{ISpatialDimPlot}} or \code{\link{ISpatialFeaturePlot}} for more details} \item{do.identify, do.hover}{DEPRECATED in favor of \code{interactive}} \item{identify.ident}{DEPRECATED} \item{information}{An optional dataframe or matrix of extra information to be displayed on hover} } \value{ If \code{do.identify}, either a vector of cells selected or the object with selected cells set to the value of \code{identify.ident} (if set). Else, if \code{do.hover}, a plotly object with interactive graphics. Else, a ggplot object } \description{ SpatialPlot plots a feature or discrete grouping (e.g. cluster assignments) as spots over the image that was collected. We also provide SpatialFeaturePlot and SpatialDimPlot as wrapper functions around SpatialPlot for a consistent naming framework. } \examples{ \dontrun{ # For functionality analagous to FeaturePlot SpatialPlot(seurat.object, features = "MS4A1") SpatialFeaturePlot(seurat.object, features = "MS4A1") # For functionality analagous to DimPlot SpatialPlot(seurat.object, group.by = "clusters") SpatialDimPlot(seurat.object, group.by = "clusters") } } \concept{convenience} \concept{spatial} \concept{visualization} Seurat/man/SetQuantile.Rd0000644000176200001440000000135614731364135015031 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{SetQuantile} \alias{SetQuantile} \title{Find the Quantile of Data} \usage{ SetQuantile(cutoff, data) } \arguments{ \item{cutoff}{The cutoff to turn into a quantile} \item{data}{The data to turn find the quantile of} } \value{ The numerical representation of the quantile } \description{ Converts a quantile in character form to a number regarding some data. String form for a quantile is represented as a number prefixed with \dQuote{q}; for example, 10th quantile is \dQuote{q10} while 2nd quantile is \dQuote{q2}. Will only take a quantile of non-zero data values } \examples{ set.seed(42) SetQuantile('q10', sample(1:100, 10)) } \concept{utilities} Seurat/man/PolyDimPlot.Rd0000644000176200001440000000151614731364134015004 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{PolyDimPlot} \alias{PolyDimPlot} \title{Polygon DimPlot} \usage{ PolyDimPlot( object, group.by = NULL, cells = NULL, poly.data = "spatial", flip.coords = FALSE ) } \arguments{ \item{object}{Seurat object} \item{group.by}{A grouping variable present in the metadata. Default is to use the groupings present in the current cell identities (\code{Idents(object = object)})} \item{cells}{Vector of cells to plot (default is all cells)} \item{poly.data}{Name of the polygon dataframe in the misc slot} \item{flip.coords}{Flip x and y coordinates} } \value{ Returns a ggplot object } \description{ Plot cells as polygons, rather than single points. Color cells by identity, or a categorical variable in metadata } \concept{visualization} Seurat/man/FindTransferAnchors.Rd0000644000176200001440000002017614744463014016477 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{FindTransferAnchors} \alias{FindTransferAnchors} \title{Find transfer anchors} \usage{ FindTransferAnchors( reference, query, normalization.method = "LogNormalize", recompute.residuals = TRUE, reference.assay = NULL, reference.neighbors = NULL, query.assay = NULL, reduction = "pcaproject", reference.reduction = NULL, project.query = FALSE, features = NULL, scale = TRUE, npcs = 30, l2.norm = TRUE, dims = 1:30, k.anchor = 5, k.filter = NA, k.score = 30, max.features = 200, nn.method = "annoy", n.trees = 50, eps = 0, approx.pca = TRUE, mapping.score.k = NULL, verbose = TRUE ) } \arguments{ \item{reference}{\code{\link[SeuratObject]{Seurat}} object to use as the reference} \item{query}{\code{\link[SeuratObject]{Seurat}} object to use as the query} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT.} \item{recompute.residuals}{If using SCT as a normalization method, compute query Pearson residuals using the reference SCT model parameters.} \item{reference.assay}{Name of the Assay to use from reference} \item{reference.neighbors}{Name of the Neighbor to use from the reference. Optionally enables reuse of precomputed neighbors.} \item{query.assay}{Name of the Assay to use from query} \item{reduction}{Dimensional reduction to perform when finding anchors. Options are: \itemize{ \item{pcaproject: Project the PCA from the reference onto the query. We recommend using PCA when reference and query datasets are from scRNA-seq} \item{lsiproject: Project the LSI from the reference onto the query. We recommend using LSI when reference and query datasets are from scATAC-seq. This requires that LSI has been computed for the reference dataset, and the same features (eg, peaks or genome bins) are present in both the reference and query. See \code{\link[Signac]{RunTFIDF}} and \code{\link[Signac]{RunSVD}}} \item{rpca: Project the PCA from the reference onto the query, and the PCA from the query onto the reference (reciprocal PCA projection).} \item{cca: Run a CCA on the reference and query } }} \item{reference.reduction}{Name of dimensional reduction to use from the reference if running the pcaproject workflow. Optionally enables reuse of precomputed reference dimensional reduction. If NULL (default), use a PCA computed on the reference object.} \item{project.query}{Project the PCA from the query dataset onto the reference. Use only in rare cases where the query dataset has a much larger cell number, but the reference dataset has a unique assay for transfer. In this case, the default features will be set to the variable features of the query object that are alos present in the reference.} \item{features}{Features to use for dimensional reduction. If not specified, set as variable features of the reference object which are also present in the query.} \item{scale}{Scale query data.} \item{npcs}{Number of PCs to compute on reference if reference.reduction is not provided.} \item{l2.norm}{Perform L2 normalization on the cell embeddings after dimensional reduction} \item{dims}{Which dimensions to use from the reduction to specify the neighbor search space} \item{k.anchor}{How many neighbors (k) to use when finding anchors} \item{k.filter}{How many neighbors (k) to use when filtering anchors. Set to NA to turn off filtering.} \item{k.score}{How many neighbors (k) to use when scoring anchors} \item{max.features}{The maximum number of features to use when specifying the neighborhood search space in the anchor filtering} \item{nn.method}{Method for nearest neighbor finding. Options include: rann, annoy} \item{n.trees}{More trees gives higher precision when using annoy approximate nearest neighbor search} \item{eps}{Error bound on the neighbor finding algorithm (from \code{\link[RANN]{RANN}} or \code{\link[RcppAnnoy]{RcppAnnoy}})} \item{approx.pca}{Use truncated singular value decomposition to approximate PCA} \item{mapping.score.k}{Compute and store nearest k query neighbors in the AnchorSet object that is returned. You can optionally set this if you plan on computing the mapping score and want to enable reuse of some downstream neighbor calculations to make the mapping score function more efficient.} \item{verbose}{Print progress bars and output} } \value{ Returns an \code{AnchorSet} object that can be used as input to \code{\link{TransferData}}, \code{\link{IntegrateEmbeddings}} and \code{\link{MapQuery}}. The dimension reduction used for finding anchors is stored in the \code{AnchorSet} object and can be used for computing anchor weights in downstream functions. Note that only the requested dimensions are stored in the dimension reduction object in the \code{AnchorSet}. This means that if \code{dims=2:20} is used, for example, the dimension of the stored reduction is \code{1:19}. } \description{ Find a set of anchors between a reference and query object. These anchors can later be used to transfer data from the reference to query object using the \code{\link{TransferData}} object. } \details{ The main steps of this procedure are outlined below. For a more detailed description of the methodology, please see Stuart, Butler, et al Cell 2019. \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} \itemize{ \item{Perform dimensional reduction. Exactly what is done here depends on the values set for the \code{reduction} and \code{project.query} parameters. If \code{reduction = "pcaproject"}, a PCA is performed on either the reference (if \code{project.query = FALSE}) or the query (if \code{project.query = TRUE}), using the \code{features} specified. The data from the other dataset is then projected onto this learned PCA structure. If \code{reduction = "cca"}, then CCA is performed on the reference and query for this dimensional reduction step. If \code{reduction = "lsiproject"}, the stored LSI dimension reduction in the reference object is used to project the query dataset onto the reference. If \code{l2.norm} is set to \code{TRUE}, perform L2 normalization of the embedding vectors.} \item{Identify anchors between the reference and query - pairs of cells from each dataset that are contained within each other's neighborhoods (also known as mutual nearest neighbors).} \item{Filter low confidence anchors to ensure anchors in the low dimension space are in broad agreement with the high dimensional measurements. This is done by looking at the neighbors of each query cell in the reference dataset using \code{max.features} to define this space. If the reference cell isn't found within the first \code{k.filter} neighbors, remove the anchor.} \item{Assign each remaining anchor a score. For each anchor cell, determine the nearest \code{k.score} anchors within its own dataset and within its pair's dataset. Based on these neighborhoods, construct an overall neighbor graph and then compute the shared neighbor overlap between anchor and query cells (analogous to an SNN graph). We use the 0.01 and 0.90 quantiles on these scores to dampen outlier effects and rescale to range between 0-1.} } } \examples{ \dontrun{ # to install the SeuratData package see https://github.com/satijalab/seurat-data library(SeuratData) data("pbmc3k") # for demonstration, split the object into reference and query pbmc.reference <- pbmc3k[, 1:1350] pbmc.query <- pbmc3k[, 1351:2700] # perform standard preprocessing on each object pbmc.reference <- NormalizeData(pbmc.reference) pbmc.reference <- FindVariableFeatures(pbmc.reference) pbmc.reference <- ScaleData(pbmc.reference) pbmc.query <- NormalizeData(pbmc.query) pbmc.query <- FindVariableFeatures(pbmc.query) pbmc.query <- ScaleData(pbmc.query) # find anchors anchors <- FindTransferAnchors(reference = pbmc.reference, query = pbmc.query) # transfer labels predictions <- TransferData( anchorset = anchors, refdata = pbmc.reference$seurat_annotations ) pbmc.query <- AddMetaData(object = pbmc.query, metadata = predictions) } } \references{ Stuart T, Butler A, et al. Comprehensive Integration of Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031}; } \concept{integration} Seurat/man/PercentAbove.Rd0000644000176200001440000000107614731364135015147 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{PercentAbove} \alias{PercentAbove} \title{Calculate the percentage of a vector above some threshold} \usage{ PercentAbove(x, threshold) } \arguments{ \item{x}{Vector of values} \item{threshold}{Threshold to use when calculating percentage} } \value{ Returns the percentage of \code{x} values above the given threshold } \description{ Calculate the percentage of a vector above some threshold } \examples{ set.seed(42) PercentAbove(sample(1:100, 10), 75) } \concept{utilities} Seurat/man/PrepSCTIntegration.Rd0000644000176200001440000000631614744463014016260 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{PrepSCTIntegration} \alias{PrepSCTIntegration} \title{Prepare an object list normalized with sctransform for integration.} \usage{ PrepSCTIntegration( object.list, assay = NULL, anchor.features = 2000, sct.clip.range = NULL, verbose = TRUE ) } \arguments{ \item{object.list}{A list of \code{\link[SeuratObject]{Seurat}} objects to prepare for integration} \item{assay}{The name of the \code{\link[SeuratObject]{Assay}} to use for integration. This can be a single name if all the assays to be integrated have the same name, or a character vector containing the name of each \code{\link[SeuratObject]{Assay}} in each object to be integrated. The specified assays must have been normalized using \code{\link{SCTransform}}. If NULL (default), the current default assay for each object is used.} \item{anchor.features}{Can be either: \itemize{ \item{A numeric value. This will call \code{\link{SelectIntegrationFeatures}} to select the provided number of features to be used in anchor finding} \item{A vector of features to be used as input to the anchor finding process} }} \item{sct.clip.range}{Numeric of length two specifying the min and max values the Pearson residual will be clipped to} \item{verbose}{Display output/messages} } \value{ A list of \code{\link[SeuratObject]{Seurat}} objects with the appropriate \code{scale.data} slots containing only the required \code{anchor.features}. } \description{ This function takes in a list of objects that have been normalized with the \code{\link{SCTransform}} method and performs the following steps: \itemize{ \item{If anchor.features is a numeric value, calls \code{\link{SelectIntegrationFeatures}} to determine the features to use in the downstream integration procedure.} \item{Ensures that the sctransform residuals for the features specified to anchor.features are present in each object in the list. This is necessary because the default behavior of \code{\link{SCTransform}} is to only store the residuals for the features determined to be variable. Residuals are recomputed for missing features using the stored model parameters via the \code{\link{GetResidual}} function.} \item{Subsets the \code{scale.data} slot to only contain the residuals for anchor.features for efficiency in downstream processing. } } } \examples{ \dontrun{ # to install the SeuratData package see https://github.com/satijalab/seurat-data library(SeuratData) data("panc8") # panc8 is a merged Seurat object containing 8 separate pancreas datasets # split the object by dataset and take the first 2 to integrate pancreas.list <- SplitObject(panc8, split.by = "tech")[1:2] # perform SCTransform normalization pancreas.list <- lapply(X = pancreas.list, FUN = SCTransform) # select integration features and prep step features <- SelectIntegrationFeatures(pancreas.list) pancreas.list <- PrepSCTIntegration( pancreas.list, anchor.features = features ) # downstream integration steps anchors <- FindIntegrationAnchors( pancreas.list, normalization.method = "SCT", anchor.features = features ) pancreas.integrated <- IntegrateData(anchors, normalization.method = "SCT") } } \concept{integration} Seurat/man/LabelClusters.Rd0000644000176200001440000000305014731364134015327 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{LabelClusters} \alias{LabelClusters} \title{Label clusters on a ggplot2-based scatter plot} \usage{ LabelClusters( plot, id, clusters = NULL, labels = NULL, split.by = NULL, repel = TRUE, box = FALSE, geom = "GeomPoint", position = "median", ... ) } \arguments{ \item{plot}{A ggplot2-based scatter plot} \item{id}{Name of variable used for coloring scatter plot} \item{clusters}{Vector of cluster ids to label} \item{labels}{Custom labels for the clusters} \item{split.by}{Split labels by some grouping label, useful when using \code{\link[ggplot2]{facet_wrap}} or \code{\link[ggplot2]{facet_grid}}} \item{repel}{Use \code{geom_text_repel} to create nicely-repelled labels} \item{box}{Use geom_label/geom_label_repel (includes a box around the text labels)} \item{geom}{Name of geom to get X/Y aesthetic names for} \item{position}{How to place the label if repel = FALSE. If "median", place the label at the median position. If "nearest" place the label at the position of the nearest data point to the median.} \item{...}{Extra parameters to \code{\link[ggrepel]{geom_text_repel}}, such as \code{size}} } \value{ A ggplot2-based scatter plot with cluster labels } \description{ Label clusters on a ggplot2-based scatter plot } \examples{ data("pbmc_small") plot <- DimPlot(object = pbmc_small) LabelClusters(plot = plot, id = 'ident') } \seealso{ \code{\link[ggrepel]{geom_text_repel}} \code{\link[ggplot2]{geom_text}} } \concept{visualization} Seurat/man/SCTAssay-class.Rd0000644000176200001440000000566614744463014015340 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{SCTAssay-class} \alias{SCTAssay-class} \alias{SCTModel} \alias{SCTAssay} \alias{levels.SCTAssay} \alias{levels<-.SCTAssay} \title{The SCTModel Class} \usage{ \method{levels}{SCTAssay}(x) \method{levels}{SCTAssay}(x) <- value } \arguments{ \item{x}{An \code{SCTAssay} object} \item{value}{New levels, must be in the same order as the levels present} } \value{ \code{levels}: SCT model names \code{levels<-}: \code{x} with updated SCT model names } \description{ The SCTModel object is a model and parameters storage from SCTransform. It can be used to calculate Pearson residuals for new genes. The SCTAssay object contains all the information found in an \code{\link[SeuratObject]{Assay}} object, with extra information from the results of \code{\link{SCTransform}} } \section{Slots}{ \describe{ \item{\code{feature.attributes}}{A data.frame with feature attributes in SCTransform} \item{\code{cell.attributes}}{A data.frame with cell attributes in SCTransform} \item{\code{clips}}{A list of two numeric of length two specifying the min and max values the Pearson residual will be clipped to. One for vst and one for SCTransform} \item{\code{umi.assay}}{Name of the assay of the seurat object containing UMI matrix and the default is RNA} \item{\code{model}}{A formula used in SCTransform} \item{\code{arguments}}{other information used in SCTransform} \item{\code{median_umi}}{Median UMI (or scale factor) used to calculate corrected counts} \item{\code{SCTModel.list}}{A list containing SCT models} }} \section{Get and set SCT model names}{ SCT results are named by initial run of \code{\link{SCTransform}} in order to keep SCT parameters straight between runs. When working with merged \code{SCTAssay} objects, these model names are important. \code{levels} allows querying the models present. \code{levels<-} allows the changing of the names of the models present, useful when merging \code{SCTAssay} objects. Note: unlike normal \code{\link[base]{levels<-}}, \code{levels<-.SCTAssay} allows complete changing of model names, not reordering. } \section{Creating an \code{SCTAssay} from an \code{Assay}}{ Conversion from an \code{Assay} object to an \code{SCTAssay} object by is done by adding the additional slots to the object. If \code{from} has results generated by \code{\link{SCTransform}} from Seurat v3.0.0 to v3.1.1, the conversion will automagically fill the new slots with the data } \examples{ \dontrun{ # SCTAssay objects are generated from SCTransform pbmc_small <- SCTransform(pbmc_small) } \dontrun{ # SCTAssay objects are generated from SCTransform pbmc_small <- SCTransform(pbmc_small) pbmc_small[["SCT"]] } \dontrun{ # Query and change SCT model names levels(pbmc_small[['SCT']]) levels(pbmc_small[['SCT']]) <- '3' levels(pbmc_small[['SCT']]) } } \seealso{ \code{\link[SeuratObject]{Assay}} \code{\link[SeuratObject]{Assay}} } \concept{objects} Seurat/man/ReadNanostring.Rd0000644000176200001440000001131514731364133015503 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R, R/convenience.R \name{ReadNanostring} \alias{ReadNanostring} \alias{LoadNanostring} \title{Read and Load Nanostring SMI data} \usage{ ReadNanostring( data.dir, mtx.file = NULL, metadata.file = NULL, molecules.file = NULL, segmentations.file = NULL, type = "centroids", mol.type = "pixels", metadata = NULL, mols.filter = NA_character_, genes.filter = NA_character_, fov.filter = NULL, subset.counts.matrix = NULL, cell.mols.only = TRUE ) LoadNanostring(data.dir, fov, assay = "Nanostring") } \arguments{ \item{data.dir}{Path to folder containing Nanostring SMI outputs} \item{mtx.file}{Path to Nanostring cell x gene matrix CSV} \item{metadata.file}{Contains metadata including cell center, area, and stain intensities} \item{molecules.file}{Path to molecules file} \item{segmentations.file}{Path to segmentations CSV} \item{type}{Type of cell spatial coordinate matrices to read; choose one or more of: \itemize{ \item \dQuote{centroids}: cell centroids in pixel coordinate space \item \dQuote{segmentations}: cell segmentations in pixel coordinate space }} \item{mol.type}{Type of molecule spatial coordinate matrices to read; choose one or more of: \itemize{ \item \dQuote{pixels}: molecule coordinates in pixel space }} \item{metadata}{Type of available metadata to read; choose zero or more of: \itemize{ \item \dQuote{Area}: number of pixels in cell segmentation \item \dQuote{fov}: cell's fov \item \dQuote{Mean.MembraneStain}: mean membrane stain intensity \item \dQuote{Mean.DAPI}: mean DAPI stain intensity \item \dQuote{Mean.G}: mean green channel stain intensity \item \dQuote{Mean.Y}: mean yellow channel stain intensity \item \dQuote{Mean.R}: mean red channel stain intensity \item \dQuote{Max.MembraneStain}: max membrane stain intensity \item \dQuote{Max.DAPI}: max DAPI stain intensity \item \dQuote{Max.G}: max green channel stain intensity \item \dQuote{Max.Y}: max yellow stain intensity \item \dQuote{Max.R}: max red stain intensity }} \item{mols.filter}{Filter molecules that match provided string} \item{genes.filter}{Filter genes from cell x gene matrix that match provided string} \item{fov.filter}{Only load in select FOVs. Nanostring SMI data contains 30 total FOVs.} \item{subset.counts.matrix}{If the counts matrix should be built from molecule coordinates for a specific segmentation; One of: \itemize{ \item \dQuote{Nuclear}: nuclear segmentations \item \dQuote{Cytoplasm}: cell cytoplasm segmentations \item \dQuote{Membrane}: cell membrane segmentations }} \item{cell.mols.only}{If TRUE, only load molecules within a cell} \item{fov}{Name to store FOV as} \item{assay}{Name to store expression matrix as} } \value{ \code{ReadNanostring}: A list with some combination of the following values: \itemize{ \item \dQuote{\code{matrix}}: a \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells are columns and features are rows \item \dQuote{\code{centroids}}: a data frame with cell centroid coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{pixels}}: a data frame with molecule pixel coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} } \code{LoadNanostring}: A \code{\link[SeuratObject]{Seurat}} object } \description{ Read and Load Nanostring SMI data } \note{ This function requires the \href{https://cran.r-project.org/package=data.table}{\pkg{data.table}} package to be installed } \section{Progress Updates with \pkg{progressr}}{ This function uses \href{https://cran.r-project.org/package=progressr}{\pkg{progressr}} to render status updates and progress bars. To enable progress updates, wrap the function call in \code{\link[progressr]{with_progress}} or run \code{\link[progressr:handlers]{handlers(global = TRUE)}} before running this function. For more details about \pkg{progressr}, please read \href{https://progressr.futureverse.org/articles/progressr-intro.html}{\code{vignette("progressr-intro")}} } \section{Parallelization with \pkg{future}}{ This function uses \href{https://cran.r-project.org/package=future}{\pkg{future}} to enable parallelization. Parallelization strategies can be set using \code{\link[future]{plan}}. Common plans include \dQuote{\code{sequential}} for non-parallelized processing or \dQuote{\code{multisession}} for parallel evaluation using multiple \R sessions; for other plans, see the \dQuote{Implemented evaluation strategies} section of \code{\link[future:plan]{?future::plan}}. For a more thorough introduction to \pkg{future}, see \href{https://future.futureverse.org/articles/future-1-overview.html}{\code{vignette("future-1-overview")}} } \concept{future} \concept{preprocessing} Seurat/man/PrepLDA.Rd0000644000176200001440000000230414731364135014014 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{PrepLDA} \alias{PrepLDA} \title{Function to prepare data for Linear Discriminant Analysis.} \usage{ PrepLDA( object, de.assay = "RNA", pc.assay = "PRTB", labels = "gene", nt.label = "NT", npcs = 10, verbose = TRUE, logfc.threshold = 0.25 ) } \arguments{ \item{object}{An object of class Seurat.} \item{de.assay}{Assay to use for selection of DE genes.} \item{pc.assay}{Assay to use for running Principle components analysis.} \item{labels}{Meta data column with target gene class labels.} \item{nt.label}{Name of non-targeting cell class.} \item{npcs}{Number of principle components to use.} \item{verbose}{Print progress bar.} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.25. Increasing logfc.threshold speeds up the function, but can miss weaker signals.} } \value{ Returns a list of the first 10 PCs from each projection. } \description{ This function performs unsupervised PCA on each mixscape class separately and projects each subspace onto all cells in the data. } \concept{mixscape} Seurat/man/CombinePlots.Rd0000644000176200001440000000212314731364134015161 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{CombinePlots} \alias{CombinePlots} \title{Combine ggplot2-based plots into a single plot} \usage{ CombinePlots(plots, ncol = NULL, legend = NULL, ...) } \arguments{ \item{plots}{A list of gg objects} \item{ncol}{Number of columns} \item{legend}{Combine legends into a single legend choose from 'right' or 'bottom'; pass 'none' to remove legends, or \code{NULL} to leave legends as they are} \item{...}{Extra parameters passed to plot_grid} } \value{ A combined plot } \description{ Combine ggplot2-based plots into a single plot } \examples{ data("pbmc_small") pbmc_small[['group']] <- sample( x = c('g1', 'g2'), size = ncol(x = pbmc_small), replace = TRUE ) plot1 <- FeaturePlot( object = pbmc_small, features = 'MS4A1', split.by = 'group' ) plot2 <- FeaturePlot( object = pbmc_small, features = 'FCN1', split.by = 'group' ) CombinePlots( plots = list(plot1, plot2), legend = 'none', nrow = length(x = unique(x = pbmc_small[['group', drop = TRUE]])) ) } \concept{visualization} Seurat/man/SingleExIPlot.Rd0000644000176200001440000000263614731364134015262 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleExIPlot} \alias{SingleExIPlot} \title{Plot a single expression by identity on a plot} \usage{ SingleExIPlot( data, idents, split = NULL, type = "violin", sort = FALSE, y.max = NULL, adjust = 1, pt.size = 0, alpha = 1, cols = NULL, seed.use = 42, log = FALSE, add.noise = TRUE, raster = NULL ) } \arguments{ \item{data}{Data to plot} \item{idents}{Idents to use} \item{split}{Use a split violin plot} \item{type}{Make either a \dQuote{ridge} or \dQuote{violin} plot} \item{sort}{Sort identity classes (on the x-axis) by the average expression of the attribute being potted} \item{y.max}{Maximum Y value to plot} \item{adjust}{Adjust parameter for geom_violin} \item{pt.size}{Size of points for violin plots} \item{alpha}{Alpha vlaue for violin plots} \item{cols}{Colors to use for plotting} \item{seed.use}{Random seed to use. If NULL, don't set a seed} \item{log}{plot Y axis on log10 scale} \item{add.noise}{determine if adding small noise for plotting} \item{raster}{Convert points to raster format. Requires 'ggrastr' to be installed. default is \code{NULL} which automatically rasterizes if ggrastr is installed and number of points exceed 100,000.} } \value{ A ggplot-based Expression-by-Identity plot } \description{ Plot a single expression by identity on a plot } \keyword{internal} Seurat/man/TransferData.Rd0000644000176200001440000001512414744463014015147 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{TransferData} \alias{TransferData} \title{Transfer data} \usage{ TransferData( anchorset, refdata, reference = NULL, query = NULL, query.assay = NULL, weight.reduction = "pcaproject", l2.norm = FALSE, dims = NULL, k.weight = 50, sd.weight = 1, eps = 0, n.trees = 50, verbose = TRUE, slot = "data", prediction.assay = FALSE, only.weights = FALSE, store.weights = TRUE ) } \arguments{ \item{anchorset}{An \code{\link{AnchorSet}} object generated by \code{\link{FindTransferAnchors}}} \item{refdata}{Data to transfer. This can be specified in one of two ways: \itemize{ \item{The reference data itself as either a vector where the names correspond to the reference cells, or a matrix, where the column names correspond to the reference cells.} \item{The name of the metadata field or assay from the reference object provided. This requires the reference parameter to be specified. If pulling assay data in this manner, it will pull the data from the data slot. To transfer data from other slots, please pull the data explicitly with \code{\link{GetAssayData}} and provide that matrix here.} }} \item{reference}{Reference object from which to pull data to transfer} \item{query}{Query object into which the data will be transferred.} \item{query.assay}{Name of the Assay to use from query} \item{weight.reduction}{Dimensional reduction to use for the weighting anchors. Options are: \itemize{ \item{pcaproject: Use the projected PCA used for anchor building} \item{lsiproject: Use the projected LSI used for anchor building} \item{pca: Use an internal PCA on the query only} \item{cca: Use the CCA used for anchor building} \item{custom DimReduc: User provided \code{\[SeuratObject]{DimReduc}} object computed on the query cells} }} \item{l2.norm}{Perform L2 normalization on the cell embeddings after dimensional reduction} \item{dims}{Set of dimensions to use in the anchor weighting procedure. If NULL, the same dimensions that were used to find anchors will be used for weighting.} \item{k.weight}{Number of neighbors to consider when weighting anchors} \item{sd.weight}{Controls the bandwidth of the Gaussian kernel for weighting} \item{eps}{Error bound on the neighbor finding algorithm (from \code{\link[RANN]{RANN}})} \item{n.trees}{More trees gives higher precision when using annoy approximate nearest neighbor search} \item{verbose}{Print progress bars and output} \item{slot}{Slot to store the imputed data. Must be either "data" (default) or "counts"} \item{prediction.assay}{Return an \code{Assay} object with the prediction scores for each class stored in the \code{data} slot.} \item{only.weights}{Only return weights matrix} \item{store.weights}{Optionally store the weights matrix used for predictions in the returned query object.} } \value{ If \code{query} is not provided, for the categorical data in \code{refdata}, returns a data.frame with label predictions. If \code{refdata} is a matrix, returns an Assay object where the imputed data has been stored in the provided slot. If \code{query} is provided, a modified query object is returned. For the categorical data in refdata, prediction scores are stored as Assays (prediction.score.NAME) and two additional metadata fields: predicted.NAME and predicted.NAME.score which contain the class prediction and the score for that predicted class. For continuous data, an Assay called NAME is returned. NAME here corresponds to the name of the element in the refdata list. } \description{ Transfer categorical or continuous data across single-cell datasets. For transferring categorical information, pass a vector from the reference dataset (e.g. \code{refdata = reference$celltype}). For transferring continuous information, pass a matrix from the reference dataset (e.g. \code{refdata = GetAssayData(reference[['RNA']])}). } \details{ The main steps of this procedure are outlined below. For a more detailed description of the methodology, please see Stuart, Butler, et al Cell 2019. \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} For both transferring discrete labels and also feature imputation, we first compute the weights matrix. \itemize{ \item{Construct a weights matrix that defines the association between each query cell and each anchor. These weights are computed as 1 - the distance between the query cell and the anchor divided by the distance of the query cell to the \code{k.weight}th anchor multiplied by the anchor score computed in \code{\link{FindIntegrationAnchors}}. We then apply a Gaussian kernel width a bandwidth defined by \code{sd.weight} and normalize across all \code{k.weight} anchors.} } The main difference between label transfer (classification) and feature imputation is what gets multiplied by the weights matrix. For label transfer, we perform the following steps: \itemize{ \item{Create a binary classification matrix, the rows corresponding to each possible class and the columns corresponding to the anchors. If the reference cell in the anchor pair is a member of a certain class, that matrix entry is filled with a 1, otherwise 0.} \item{Multiply this classification matrix by the transpose of weights matrix to compute a prediction score for each class for each cell in the query dataset.} } For feature imputation, we perform the following step: \itemize{ \item{Multiply the expression matrix for the reference anchor cells by the weights matrix. This returns a predicted expression matrix for the specified features for each cell in the query dataset.} } } \examples{ \dontrun{ # to install the SeuratData package see https://github.com/satijalab/seurat-data library(SeuratData) data("pbmc3k") # for demonstration, split the object into reference and query pbmc.reference <- pbmc3k[, 1:1350] pbmc.query <- pbmc3k[, 1351:2700] # perform standard preprocessing on each object pbmc.reference <- NormalizeData(pbmc.reference) pbmc.reference <- FindVariableFeatures(pbmc.reference) pbmc.reference <- ScaleData(pbmc.reference) pbmc.query <- NormalizeData(pbmc.query) pbmc.query <- FindVariableFeatures(pbmc.query) pbmc.query <- ScaleData(pbmc.query) # find anchors anchors <- FindTransferAnchors(reference = pbmc.reference, query = pbmc.query) # transfer labels predictions <- TransferData(anchorset = anchors, refdata = pbmc.reference$seurat_annotations) pbmc.query <- AddMetaData(object = pbmc.query, metadata = predictions) } } \references{ Stuart T, Butler A, et al. Comprehensive Integration of Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031} } \concept{integration} Seurat/man/CaseMatch.Rd0000644000176200001440000000113214731364135014413 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{CaseMatch} \alias{CaseMatch} \title{Match the case of character vectors} \usage{ CaseMatch(search, match) } \arguments{ \item{search}{A vector of search terms} \item{match}{A vector of characters whose case should be matched} } \value{ Values from search present in match with the case of match } \description{ Match the case of character vectors } \examples{ data("pbmc_small") cd_genes <- c('Cd79b', 'Cd19', 'Cd200') CaseMatch(search = cd_genes, match = rownames(x = pbmc_small)) } \concept{utilities} Seurat/man/RunMoransI.Rd0000644000176200001440000000073314731364135014626 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{RunMoransI} \alias{RunMoransI} \title{Compute Moran's I value.} \usage{ RunMoransI(data, pos, verbose = TRUE) } \arguments{ \item{data}{Expression matrix} \item{pos}{Position matrix} \item{verbose}{Display messages/progress} } \description{ Wraps the functionality of the Moran.I function from the ape package. Weights are computed as 1/distance. } \concept{preprocessing} Seurat/man/VisiumV1-class.Rd0000644000176200001440000000137714731364135015364 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{VisiumV1-class} \alias{VisiumV1-class} \alias{VisiumV1} \title{The VisiumV1 class} \description{ The VisiumV1 class represents spatial information from the 10X Genomics Visium platform } \section{Slots}{ \describe{ \item{\code{image}}{A three-dimensional array with PNG image data, see \code{\link[png]{readPNG}} for more details} \item{\code{scale.factors}}{An object of class \code{\link{scalefactors}}; see \code{\link{scalefactors}} for more information} \item{\code{coordinates}}{A data frame with tissue coordinate information} \item{\code{spot.radius}}{Single numeric value giving the radius of the spots} }} \concept{objects} \concept{spatial} Seurat/man/Assay-class.Rd0000644000176200001440000000062714731364133014754 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{Assay-class} \alias{Assay-class} \title{The Assay Class} \description{ The \code{Assay} object is the basic unit of Seurat; for more details, please see the documentation in \code{\link[SeuratObject:Assay]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:Assay]{SeuratObject::Assay-class}} } Seurat/man/CustomPalette.Rd0000644000176200001440000000223514731364134015360 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{BlackAndWhite} \alias{BlackAndWhite} \alias{BlueAndRed} \alias{CustomPalette} \alias{PurpleAndYellow} \title{Create a custom color palette} \usage{ BlackAndWhite(mid = NULL, k = 50) BlueAndRed(k = 50) CustomPalette(low = "white", high = "red", mid = NULL, k = 50) PurpleAndYellow(k = 50) } \arguments{ \item{mid}{middle color. Optional.} \item{k}{number of steps (colors levels) to include between low and high values} \item{low}{low color} \item{high}{high color} } \value{ A color palette for plotting } \description{ Creates a custom color palette based on low, middle, and high color values } \examples{ df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) plot(df, col = BlackAndWhite()) df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) plot(df, col = BlueAndRed()) myPalette <- CustomPalette() myPalette df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) plot(df, col = PurpleAndYellow()) } \concept{visualization} Seurat/man/CalculateBarcodeInflections.Rd0000644000176200001440000000455514744456127020161 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{CalculateBarcodeInflections} \alias{CalculateBarcodeInflections} \title{Calculate the Barcode Distribution Inflection} \usage{ CalculateBarcodeInflections( object, barcode.column = "nCount_RNA", group.column = "orig.ident", threshold.low = NULL, threshold.high = NULL ) } \arguments{ \item{object}{Seurat object} \item{barcode.column}{Column to use as proxy for barcodes ("nCount_RNA" by default)} \item{group.column}{Column to group by ("orig.ident" by default)} \item{threshold.low}{Ignore barcodes of rank below this threshold in inflection calculation} \item{threshold.high}{Ignore barcodes of rank above this threshold in inflection calculation} } \value{ Returns Seurat object with a new list in the `tools` slot, `CalculateBarcodeInflections` with values: * `barcode_distribution` - contains the full barcode distribution across the entire dataset * `inflection_points` - the calculated inflection points within the thresholds * `threshold_values` - the provided (or default) threshold values to search within for inflections * `cells_pass` - the cells that pass the inflection point calculation } \description{ This function calculates an adaptive inflection point ("knee") of the barcode distribution for each sample group. This is useful for determining a threshold for removing low-quality samples. } \details{ The function operates by calculating the slope of the barcode number vs. rank distribution, and then finding the point at which the distribution changes most steeply (the "knee"). Of note, this calculation often must be restricted as to the range at which it performs, so `threshold` parameters are provided to restrict the range of the calculation based on the rank of the barcodes. [BarcodeInflectionsPlot()] is provided as a convenience function to visualize and test different thresholds and thus provide more sensical end results. See [BarcodeInflectionsPlot()] to visualize the calculated inflection points and [SubsetByBarcodeInflections()] to subsequently subset the Seurat object. } \examples{ data("pbmc_small") CalculateBarcodeInflections(pbmc_small, group.column = 'groups') } \seealso{ \code{\link{BarcodeInflectionsPlot}} \code{\link{SubsetByBarcodeInflections}} } \author{ Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} } \concept{preprocessing} Seurat/man/DietSeurat.Rd0000644000176200001440000000255714731364135014650 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{DietSeurat} \alias{DietSeurat} \title{Slim down a Seurat object} \usage{ DietSeurat( object, layers = NULL, features = NULL, assays = NULL, dimreducs = NULL, graphs = NULL, misc = TRUE, counts = deprecated(), data = deprecated(), scale.data = deprecated(), ... ) } \arguments{ \item{object}{A \code{\link[SeuratObject]{Seurat}} object} \item{layers}{A vector or named list of layers to keep} \item{features}{Only keep a subset of features, defaults to all features} \item{assays}{Only keep a subset of assays specified here} \item{dimreducs}{Only keep a subset of DimReducs specified here (if \code{NULL}, remove all DimReducs)} \item{graphs}{Only keep a subset of Graphs specified here (if \code{NULL}, remove all Graphs)} \item{misc}{Preserve the \code{misc} slot; default is \code{TRUE}} \item{counts}{Preserve the count matrices for the assays specified} \item{data}{Preserve the data matrices for the assays specified} \item{scale.data}{Preserve the scale data matrices for the assays specified} \item{...}{Ignored} } \value{ \code{object} with only the sub-object specified retained } \description{ Keep only certain aspects of the Seurat object. Can be useful in functions that utilize merge as it reduces the amount of data in the merge } \concept{objects} Seurat/man/FindAllMarkers.Rd0000644000176200001440000001614014744456127015435 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/differential_expression.R \name{FindAllMarkers} \alias{FindAllMarkers} \alias{FindAllMarkersNode} \title{Gene expression markers for all identity classes} \usage{ FindAllMarkers( object, assay = NULL, features = NULL, group.by = NULL, logfc.threshold = 0.1, test.use = "wilcox", slot = "data", min.pct = 0.01, min.diff.pct = -Inf, node = NULL, verbose = TRUE, only.pos = FALSE, max.cells.per.ident = Inf, random.seed = 1, latent.vars = NULL, min.cells.feature = 3, min.cells.group = 3, mean.fxn = NULL, fc.name = NULL, base = 2, return.thresh = 0.01, densify = FALSE, ... ) } \arguments{ \item{object}{An object} \item{assay}{Assay to use in differential expression testing} \item{features}{Genes to test. Default is to use all genes} \item{group.by}{Regroup cells into a different identity class prior to performing differential expression (see example); \code{"ident"} to use Idents} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.1 Increasing logfc.threshold speeds up the function, but can miss weaker signals. If the \code{slot} parameter is "scale.data" no filtering is performed.} \item{test.use}{Denotes which test to use. Available options are: \itemize{ \item{"wilcox"} : Identifies differentially expressed genes between two groups of cells using a Wilcoxon Rank Sum test (default); will use a fast implementation by Presto if installed \item{"wilcox_limma"} : Identifies differentially expressed genes between two groups of cells using the limma implementation of the Wilcoxon Rank Sum test; set this option to reproduce results from Seurat v4 \item{"bimod"} : Likelihood-ratio test for single cell gene expression, (McDavid et al., Bioinformatics, 2013) \item{"roc"} : Identifies 'markers' of gene expression using ROC analysis. For each gene, evaluates (using AUC) a classifier built on that gene alone, to classify between two groups of cells. An AUC value of 1 means that expression values for this gene alone can perfectly classify the two groupings (i.e. Each of the cells in cells.1 exhibit a higher level than each of the cells in cells.2). An AUC value of 0 also means there is perfect classification, but in the other direction. A value of 0.5 implies that the gene has no predictive power to classify the two groups. Returns a 'predictive power' (abs(AUC-0.5) * 2) ranked matrix of putative differentially expressed genes. \item{"t"} : Identify differentially expressed genes between two groups of cells using the Student's t-test. \item{"negbinom"} : Identifies differentially expressed genes between two groups of cells using a negative binomial generalized linear model. Use only for UMI-based datasets \item{"poisson"} : Identifies differentially expressed genes between two groups of cells using a poisson generalized linear model. Use only for UMI-based datasets \item{"LR"} : Uses a logistic regression framework to determine differentially expressed genes. Constructs a logistic regression model predicting group membership based on each feature individually and compares this to a null model with a likelihood ratio test. \item{"MAST"} : Identifies differentially expressed genes between two groups of cells using a hurdle model tailored to scRNA-seq data. Utilizes the MAST package to run the DE testing. \item{"DESeq2"} : Identifies differentially expressed genes between two groups of cells based on a model using DESeq2 which uses a negative binomial distribution (Love et al, Genome Biology, 2014).This test does not support pre-filtering of genes based on average difference (or percent detection rate) between cell groups. However, genes may be pre-filtered based on their minimum detection rate (min.pct) across both cell groups. To use this method, please install DESeq2, using the instructions at https://bioconductor.org/packages/release/bioc/html/DESeq2.html }} \item{slot}{Slot to pull data from; note that if \code{test.use} is "negbinom", "poisson", or "DESeq2", \code{slot} will be set to "counts"} \item{min.pct}{only test genes that are detected in a minimum fraction of min.pct cells in either of the two populations. Meant to speed up the function by not testing genes that are very infrequently expressed. Default is 0.01} \item{min.diff.pct}{only test genes that show a minimum difference in the fraction of detection between the two groups. Set to -Inf by default} \item{node}{A node to find markers for and all its children; requires \code{\link{BuildClusterTree}} to have been run previously; replaces \code{FindAllMarkersNode}} \item{verbose}{Print a progress bar once expression testing begins} \item{only.pos}{Only return positive markers (FALSE by default)} \item{max.cells.per.ident}{Down sample each identity class to a max number. Default is no downsampling. Not activated by default (set to Inf)} \item{random.seed}{Random seed for downsampling} \item{latent.vars}{Variables to test, used only when \code{test.use} is one of 'LR', 'negbinom', 'poisson', or 'MAST'} \item{min.cells.feature}{Minimum number of cells expressing the feature in at least one of the two groups, currently only used for poisson and negative binomial tests} \item{min.cells.group}{Minimum number of cells in one of the groups} \item{mean.fxn}{Function to use for fold change or average difference calculation. The default depends on the the value of \code{fc.slot}: \itemize{ \item{"counts"} : difference in the log of the mean counts, with pseudocount. \item{"data"} : difference in the log of the average exponentiated data, with pseudocount. This adjusts for differences in sequencing depth between cells, and assumes that "data" has been log-normalized. \item{"scale.data"} : difference in the means of scale.data. }} \item{fc.name}{Name of the fold change, average difference, or custom function column in the output data.frame. If NULL, the fold change column will be named according to the logarithm base (eg, "avg_log2FC"), or if using the scale.data slot "avg_diff".} \item{base}{The base with respect to which logarithms are computed.} \item{return.thresh}{Only return markers that have a p-value < return.thresh, or a power > return.thresh (if the test is ROC)} \item{densify}{Convert the sparse matrix to a dense form before running the DE test. This can provide speedups but might require higher memory; default is FALSE} \item{...}{Arguments passed to other methods and to specific DE methods} } \value{ Matrix containing a ranked list of putative markers, and associated statistics (p-values, ROC score, etc.) } \description{ Finds markers (differentially expressed genes) for each of the identity classes in a dataset } \examples{ data("pbmc_small") # Find markers for all clusters all.markers <- FindAllMarkers(object = pbmc_small) head(x = all.markers) \dontrun{ # Pass a value to node as a replacement for FindAllMarkersNode pbmc_small <- BuildClusterTree(object = pbmc_small) all.markers <- FindAllMarkers(object = pbmc_small, node = 4) head(x = all.markers) } } \concept{differential_expression} Seurat/man/CellCycleScoring.Rd0000644000176200001440000000267614731364135015765 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{CellCycleScoring} \alias{CellCycleScoring} \title{Score cell cycle phases} \usage{ CellCycleScoring( object, s.features, g2m.features, ctrl = NULL, set.ident = FALSE, ... ) } \arguments{ \item{object}{A Seurat object} \item{s.features}{A vector of features associated with S phase} \item{g2m.features}{A vector of features associated with G2M phase} \item{ctrl}{Number of control features selected from the same bin per analyzed feature supplied to \code{\link{AddModuleScore}}. Defaults to value equivalent to minimum number of features present in 's.features' and 'g2m.features'.} \item{set.ident}{If true, sets identity to phase assignments Stashes old identities in 'old.ident'} \item{...}{Arguments to be passed to \code{\link{AddModuleScore}}} } \value{ A Seurat object with the following columns added to object meta data: S.Score, G2M.Score, and Phase } \description{ Score cell cycle phases } \examples{ \dontrun{ data("pbmc_small") # pbmc_small doesn't have any cell-cycle genes # To run CellCycleScoring, please use a dataset with cell-cycle genes # An example is available at http://satijalab.org/seurat/cell_cycle_vignette.html pbmc_small <- CellCycleScoring( object = pbmc_small, g2m.features = cc.genes$g2m.genes, s.features = cc.genes$s.genes ) head(x = pbmc_small@meta.data) } } \seealso{ \code{AddModuleScore} } \concept{utilities} Seurat/man/SplitObject.Rd0000644000176200001440000000215714731364135015015 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{SplitObject} \alias{SplitObject} \title{Splits object into a list of subsetted objects.} \usage{ SplitObject(object, split.by = "ident") } \arguments{ \item{object}{Seurat object} \item{split.by}{Attribute for splitting. Default is "ident". Currently only supported for class-level (i.e. non-quantitative) attributes.} } \value{ A named list of Seurat objects, each containing a subset of cells from the original object. } \description{ Splits object based on a single attribute into a list of subsetted objects, one for each level of the attribute. For example, useful for taking an object that contains cells from many patients, and subdividing it into patient-specific objects. } \examples{ data("pbmc_small") # Assign the test object a three level attribute groups <- sample(c("group1", "group2", "group3"), size = 80, replace = TRUE) names(groups) <- colnames(pbmc_small) pbmc_small <- AddMetaData(object = pbmc_small, metadata = groups, col.name = "group") obj.list <- SplitObject(pbmc_small, split.by = "group") } \concept{objects} Seurat/man/Neighbor-class.Rd0000644000176200001440000000056414731364133015431 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{Neighbor-class} \alias{Neighbor-class} \title{The Neighbor Class} \description{ For more details, please see the documentation in \code{\link[SeuratObject:Neighbor]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:Neighbor]{SeuratObject::Neighbor-class}} } Seurat/man/UnSketchEmbeddings.Rd0000644000176200001440000000114114731364134016270 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{UnSketchEmbeddings} \alias{UnSketchEmbeddings} \title{Transfer embeddings from sketched cells to the full data} \usage{ UnSketchEmbeddings( atom.data, atom.cells = NULL, orig.data, embeddings, sketch.matrix = NULL ) } \arguments{ \item{atom.data}{Atom data} \item{atom.cells}{Atom cells} \item{orig.data}{Original data} \item{embeddings}{Embeddings of atom cells} \item{sketch.matrix}{Sketch matrix} } \description{ Transfer embeddings from sketched cells to the full data } \concept{integration} Seurat/man/GetTissueCoordinates.Rd0000644000176200001440000000215314731364135016676 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{GetTissueCoordinates.SlideSeq} \alias{GetTissueCoordinates.SlideSeq} \alias{GetTissueCoordinates.STARmap} \alias{GetTissueCoordinates.VisiumV1} \alias{GetTissueCoordinates.VisiumV2} \title{Get Tissue Coordinates} \usage{ \method{GetTissueCoordinates}{SlideSeq}(object, ...) \method{GetTissueCoordinates}{STARmap}(object, qhulls = FALSE, ...) \method{GetTissueCoordinates}{VisiumV1}( object, scale = "lowres", cols = c("imagerow", "imagecol"), ... ) \method{GetTissueCoordinates}{VisiumV2}(object, scale = NULL, ...) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{qhulls}{return qhulls instead of centroids} \item{scale}{A factor to scale the coordinates by; choose from: 'tissue', 'fiducial', 'hires', 'lowres', or \code{NULL} for no scaling} \item{cols}{Columns of tissue coordinates data.frame to pull} } \description{ Get Tissue Coordinates } \seealso{ \code{\link[SeuratObject:GetTissueCoordinates]{SeuratObject::GetTissueCoordinates}} } \concept{objects} \concept{spatial} Seurat/man/BridgeCellsRepresentation.Rd0000644000176200001440000000306614731364134017674 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{BridgeCellsRepresentation} \alias{BridgeCellsRepresentation} \title{Construct a dictionary representation for each unimodal dataset} \usage{ BridgeCellsRepresentation( object.list, bridge.object, object.reduction, bridge.reduction, laplacian.reduction = "lap", laplacian.dims = 1:50, bridge.assay.name = "Bridge", return.all.assays = FALSE, l2.norm = TRUE, verbose = TRUE ) } \arguments{ \item{object.list}{A list of Seurat objects} \item{bridge.object}{A multi-omic bridge Seurat which is used as the basis to represent unimodal datasets} \item{object.reduction}{A list of dimensional reductions from object.list used to be reconstructed by bridge.object} \item{bridge.reduction}{A list of dimensional reductions from bridge.object used to reconstruct object.reduction} \item{laplacian.reduction}{Name of bridge graph laplacian dimensional reduction} \item{laplacian.dims}{Dimensions used for bridge graph laplacian dimensional reduction} \item{bridge.assay.name}{Assay name used for bridge object reconstruction value (default is 'Bridge')} \item{return.all.assays}{Whether to return all assays in the object.list. Only bridge assay is returned by default.} \item{l2.norm}{Whether to l2 normalize the dictionary representation} \item{verbose}{Print messages and progress} } \value{ Returns a object list in which each object has a bridge cell derived assay } \description{ Construct a dictionary representation for each unimodal dataset } \concept{integration} Seurat/man/ScoreJackStraw.Rd0000644000176200001440000000305014731364134015450 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{ScoreJackStraw} \alias{ScoreJackStraw} \alias{ScoreJackStraw.JackStrawData} \alias{ScoreJackStraw.DimReduc} \alias{ScoreJackStraw.Seurat} \title{Compute Jackstraw scores significance.} \usage{ ScoreJackStraw(object, ...) \method{ScoreJackStraw}{JackStrawData}(object, dims = 1:5, score.thresh = 1e-05, ...) \method{ScoreJackStraw}{DimReduc}(object, dims = 1:5, score.thresh = 1e-05, ...) \method{ScoreJackStraw}{Seurat}( object, reduction = "pca", dims = 1:5, score.thresh = 1e-05, do.plot = FALSE, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{dims}{Which dimensions to examine} \item{score.thresh}{Threshold to use for the proportion test of PC significance (see Details)} \item{reduction}{Reduction associated with JackStraw to score} \item{do.plot}{Show plot. To return ggplot object, use \code{JackStrawPlot} after running ScoreJackStraw.} } \value{ Returns a Seurat object } \description{ Significant PCs should show a p-value distribution that is strongly skewed to the left compared to the null distribution. The p-value for each PC is based on a proportion test comparing the number of features with a p-value below a particular threshold (score.thresh), compared with the proportion of features expected under a uniform distribution of p-values. } \seealso{ \code{\link{JackStrawPlot}} \code{\link{JackStrawPlot}} } \author{ Omri Wurtzel } \concept{dimensional_reduction} Seurat/man/LoadAnnoyIndex.Rd0000644000176200001440000000064314731364135015445 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{LoadAnnoyIndex} \alias{LoadAnnoyIndex} \title{Load the Annoy index file} \usage{ LoadAnnoyIndex(object, file) } \arguments{ \item{object}{Neighbor object} \item{file}{Path to file with annoy index} } \value{ Returns the Neighbor object with the index stored } \description{ Load the Annoy index file } \concept{utilities} Seurat/man/reexports.Rd0000644000176200001440000001002414731364133014614 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{import} \name{components} \alias{components} \alias{\%||\%} \alias{\%iff\%} \alias{reexports} \alias{AddMetaData} \alias{as.Graph} \alias{as.Neighbor} \alias{as.Seurat} \alias{as.sparse} \alias{Assays} \alias{Cells} \alias{CellsByIdentities} \alias{Command} \alias{CreateAssayObject} \alias{CreateDimReducObject} \alias{CreateSeuratObject} \alias{DefaultAssay} \alias{DefaultAssay<-} \alias{Distances} \alias{Embeddings} \alias{FetchData} \alias{GetAssayData} \alias{GetImage} \alias{GetTissueCoordinates} \alias{HVFInfo} \alias{Idents} \alias{Idents<-} \alias{Images} \alias{Index} \alias{Index<-} \alias{Indices} \alias{IsGlobal} \alias{JS} \alias{JS<-} \alias{Key} \alias{Key<-} \alias{Loadings} \alias{Loadings<-} \alias{LogSeuratCommand} \alias{Misc} \alias{Misc<-} \alias{Neighbors} \alias{Project} \alias{Project<-} \alias{Radius} \alias{Reductions} \alias{RenameCells} \alias{RenameIdents} \alias{ReorderIdent} \alias{RowMergeSparseMatrices} \alias{SetAssayData} \alias{SetIdent} \alias{SpatiallyVariableFeatures} \alias{StashIdent} \alias{Stdev} \alias{SVFInfo} \alias{Tool} \alias{Tool<-} \alias{UpdateSeuratObject} \alias{VariableFeatures} \alias{VariableFeatures<-} \alias{WhichCells} \title{Objects exported from other packages} \usage{ components(object, ...) x \%||\% y x \%iff\% y } \keyword{internal} \description{ These objects are imported from other packages. Follow the links below to see their documentation. \describe{ \item{SeuratObject}{\code{\link[SeuratObject]{AddMetaData}}, \code{\link[SeuratObject]{as.Graph}}, \code{\link[SeuratObject]{as.Neighbor}}, \code{\link[SeuratObject]{as.Seurat}}, \code{\link[SeuratObject]{as.sparse}}, \code{\link[SeuratObject:ObjectAccess]{Assays}}, \code{\link[SeuratObject]{Cells}}, \code{\link[SeuratObject]{CellsByIdentities}}, \code{\link[SeuratObject]{Command}}, \code{\link[SeuratObject]{CreateAssayObject}}, \code{\link[SeuratObject]{CreateDimReducObject}}, \code{\link[SeuratObject]{CreateSeuratObject}}, \code{\link[SeuratObject]{DefaultAssay}}, \code{\link[SeuratObject:DefaultAssay]{DefaultAssay<-}}, \code{\link[SeuratObject]{Distances}}, \code{\link[SeuratObject]{Embeddings}}, \code{\link[SeuratObject]{FetchData}}, \code{\link[SeuratObject:AssayData]{GetAssayData}}, \code{\link[SeuratObject]{GetImage}}, \code{\link[SeuratObject]{GetTissueCoordinates}}, \code{\link[SeuratObject:VariableFeatures]{HVFInfo}}, \code{\link[SeuratObject]{Idents}}, \code{\link[SeuratObject:Idents]{Idents<-}}, \code{\link[SeuratObject]{Images}}, \code{\link[SeuratObject:NNIndex]{Index}}, \code{\link[SeuratObject:NNIndex]{Index<-}}, \code{\link[SeuratObject]{Indices}}, \code{\link[SeuratObject]{IsGlobal}}, \code{\link[SeuratObject]{JS}}, \code{\link[SeuratObject:JS]{JS<-}}, \code{\link[SeuratObject]{Key}}, \code{\link[SeuratObject:Key]{Key<-}}, \code{\link[SeuratObject]{Loadings}}, \code{\link[SeuratObject:Loadings]{Loadings<-}}, \code{\link[SeuratObject]{LogSeuratCommand}}, \code{\link[SeuratObject]{Misc}}, \code{\link[SeuratObject:Misc]{Misc<-}}, \code{\link[SeuratObject:ObjectAccess]{Neighbors}}, \code{\link[SeuratObject]{Project}}, \code{\link[SeuratObject:Project]{Project<-}}, \code{\link[SeuratObject]{Radius}}, \code{\link[SeuratObject:ObjectAccess]{Reductions}}, \code{\link[SeuratObject]{RenameCells}}, \code{\link[SeuratObject:Idents]{RenameIdents}}, \code{\link[SeuratObject:Idents]{ReorderIdent}}, \code{\link[SeuratObject]{RowMergeSparseMatrices}}, \code{\link[SeuratObject:AssayData]{SetAssayData}}, \code{\link[SeuratObject:Idents]{SetIdent}}, \code{\link[SeuratObject:VariableFeatures]{SpatiallyVariableFeatures}}, \code{\link[SeuratObject:Idents]{StashIdent}}, \code{\link[SeuratObject]{Stdev}}, \code{\link[SeuratObject:VariableFeatures]{SVFInfo}}, \code{\link[SeuratObject]{Tool}}, \code{\link[SeuratObject:Tool]{Tool<-}}, \code{\link[SeuratObject]{UpdateSeuratObject}}, \code{\link[SeuratObject]{VariableFeatures}}, \code{\link[SeuratObject:VariableFeatures]{VariableFeatures<-}}, \code{\link[SeuratObject]{WhichCells}}} }} Seurat/man/PrepareBridgeReference.Rd0000644000176200001440000000613014744456127017127 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{PrepareBridgeReference} \alias{PrepareBridgeReference} \title{Prepare the bridge and reference datasets} \usage{ PrepareBridgeReference( reference, bridge, reference.reduction = "pca", reference.dims = 1:50, normalization.method = c("SCT", "LogNormalize"), reference.assay = NULL, bridge.ref.assay = "RNA", bridge.query.assay = "ATAC", supervised.reduction = c("slsi", "spca", NULL), bridge.query.reduction = NULL, bridge.query.features = NULL, laplacian.reduction.name = "lap", laplacian.reduction.key = "lap_", laplacian.reduction.dims = 1:50, verbose = TRUE ) } \arguments{ \item{reference}{A reference Seurat object} \item{bridge}{A multi-omic bridge Seurat object} \item{reference.reduction}{Name of dimensional reduction of the reference object (default is 'pca')} \item{reference.dims}{Number of dimensions used for the reference.reduction (default is 50)} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{reference.assay}{Assay name for reference (default is \code{\link{DefaultAssay}})} \item{bridge.ref.assay}{Assay name for bridge used for reference mapping. RNA by default} \item{bridge.query.assay}{Assay name for bridge used for query mapping. ATAC by default} \item{supervised.reduction}{Type of supervised dimensional reduction to be performed for integrating the bridge and query. Options are: \itemize{ \item{slsi: Perform supervised LSI as the dimensional reduction for the bridge-query integration} \item{spca: Perform supervised PCA as the dimensional reduction for the bridge-query integration} \item{NULL: no supervised dimensional reduction will be calculated. bridge.query.reduction is used for the bridge-query integration} }} \item{bridge.query.reduction}{Name of dimensions used for the bridge-query harmonization. 'bridge.query.reduction' and 'supervised.reduction' cannot be NULL together.} \item{bridge.query.features}{Features used for bridge query dimensional reduction (default is NULL which uses VariableFeatures from the bridge object)} \item{laplacian.reduction.name}{Name of dimensional reduction name of graph laplacian eigenspace (default is 'lap')} \item{laplacian.reduction.key}{Dimensional reduction key (default is 'lap_')} \item{laplacian.reduction.dims}{Number of dimensions used for graph laplacian eigenspace (default is 50)} \item{verbose}{Print progress and message (default is TRUE)} } \value{ Returns a \code{BridgeReferenceSet} that can be used as input to \code{\link{FindBridgeTransferAnchors}}. The parameters used are stored in the \code{BridgeReferenceSet} as well } \description{ Preprocess the multi-omic bridge and unimodal reference datasets into an extended reference. This function performs the following three steps: 1. Performs within-modality harmonization between bridge and reference 2. Performs dimensional reduction on the SNN graph of bridge datasets via Laplacian Eigendecomposition 3. Constructs a bridge dictionary representation for unimodal reference cells } \concept{integration} Seurat/man/NNPlot.Rd0000644000176200001440000000366114731364134013745 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{NNPlot} \alias{NNPlot} \title{Highlight Neighbors in DimPlot} \usage{ NNPlot( object, reduction, nn.idx, query.cells, dims = 1:2, label = FALSE, label.size = 4, repel = FALSE, sizes.highlight = 2, pt.size = 1, cols.highlight = c("#377eb8", "#e41a1c"), na.value = "#bdbdbd", order = c("self", "neighbors", "other"), show.all.cells = TRUE, ... ) } \arguments{ \item{object}{Seurat object} \item{reduction}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} \item{nn.idx}{the neighbor index of all cells} \item{query.cells}{cells used to find their neighbors} \item{dims}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} \item{label}{Whether to label the clusters} \item{label.size}{Sets size of labels} \item{repel}{Repel labels} \item{sizes.highlight}{Size of highlighted cells; will repeat to the length groups in cells.highlight. If \code{sizes.highlight = TRUE} size of all points will be this value.} \item{pt.size}{Adjust point size for plotting} \item{cols.highlight}{A vector of colors to highlight the cells as; will repeat to the length groups in cells.highlight} \item{na.value}{Color value for NA points when using custom scale} \item{order}{Specify the order of plotting for the idents. This can be useful for crowded plots if points of interest are being buried. Provide either a full list of valid idents or a subset to be plotted last (on top)} \item{show.all.cells}{Show all cells or only query and neighbor cells} \item{...}{Extra parameters passed to \code{DimPlot}} } \value{ A \code{\link[patchwork]{patchwork}ed} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ It will color the query cells and the neighbors of the query cells in the DimPlot } \concept{visualization} Seurat/man/RelativeCounts.Rd0000644000176200001440000000143214731364135015535 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{RelativeCounts} \alias{RelativeCounts} \title{Normalize raw data to fractions} \usage{ RelativeCounts(data, scale.factor = 1, verbose = TRUE) } \arguments{ \item{data}{Matrix with the raw count data} \item{scale.factor}{Scale the result. Default is 1} \item{verbose}{Print progress} } \value{ Returns a matrix with the relative counts } \description{ Normalize count data to relative counts per cell by dividing by the total per cell. Optionally use a scale factor, e.g. for counts per million (CPM) use \code{scale.factor = 1e6}. } \examples{ mat <- matrix(data = rbinom(n = 25, size = 5, prob = 0.2), nrow = 5) mat mat_norm <- RelativeCounts(data = mat) mat_norm } \concept{preprocessing} Seurat/man/LogVMR.Rd0000644000176200001440000000075114731364135013677 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{LogVMR} \alias{LogVMR} \title{Calculate the variance to mean ratio of logged values} \usage{ LogVMR(x, ...) } \arguments{ \item{x}{A vector of values} \item{...}{Other arguments (not used)} } \value{ Returns the VMR in log-space } \description{ Calculate the variance to mean ratio (VMR) in non-logspace (return answer in log-space) } \examples{ LogVMR(x = c(1, 2, 3)) } \concept{utilities} Seurat/man/VlnPlot.Rd0000644000176200001440000000535214744456127014200 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{VlnPlot} \alias{VlnPlot} \title{Single cell violin plot} \usage{ VlnPlot( object, features, cols = NULL, pt.size = NULL, alpha = 1, idents = NULL, sort = FALSE, assay = NULL, group.by = NULL, split.by = NULL, adjust = 1, y.max = NULL, same.y.lims = FALSE, log = FALSE, ncol = NULL, slot = deprecated(), layer = NULL, split.plot = FALSE, stack = FALSE, combine = TRUE, fill.by = "feature", flip = FALSE, add.noise = TRUE, raster = NULL ) } \arguments{ \item{object}{Seurat object} \item{features}{Features to plot (gene expression, metrics, PC scores, anything that can be retreived by FetchData)} \item{cols}{Colors to use for plotting} \item{pt.size}{Point size for points} \item{alpha}{Alpha value for points} \item{idents}{Which classes to include in the plot (default is all)} \item{sort}{Sort identity classes (on the x-axis) by the average expression of the attribute being potted, can also pass 'increasing' or 'decreasing' to change sort direction} \item{assay}{Name of assay to use, defaults to the active assay} \item{group.by}{Group (color) cells in different ways (for example, orig.ident)} \item{split.by}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity} \item{adjust}{Adjust parameter for geom_violin} \item{y.max}{Maximum y axis value} \item{same.y.lims}{Set all the y-axis limits to the same values} \item{log}{plot the feature axis on log scale} \item{ncol}{Number of columns if multiple plots are displayed} \item{slot}{Slot to pull expression data from (e.g. "counts" or "data")} \item{layer}{Layer to pull expression data from (e.g. "counts" or "data")} \item{split.plot}{plot each group of the split violin plots by multiple or single violin shapes.} \item{stack}{Horizontally stack plots for each feature} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot} \item{fill.by}{Color violins/ridges based on either 'feature' or 'ident'} \item{flip}{flip plot orientation (identities on x-axis)} \item{add.noise}{determine if adding a small noise for plotting} \item{raster}{Convert points to raster format. Requires 'ggrastr' to be installed.} } \value{ A \code{\link[patchwork]{patchwork}ed} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ Draws a violin plot of single cell data (gene expression, metrics, PC scores, etc.) } \examples{ data("pbmc_small") VlnPlot(object = pbmc_small, features = 'PC_1') VlnPlot(object = pbmc_small, features = 'LYZ', split.by = 'groups') } \seealso{ \code{\link{FetchData}} } \concept{visualization} Seurat/man/RenameCells.Rd0000644000176200001440000000143114731364135014757 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{RenameCells.SCTAssay} \alias{RenameCells.SCTAssay} \alias{RenameCells.SlideSeq} \alias{RenameCells.STARmap} \alias{RenameCells.VisiumV1} \title{Rename Cells in an Object} \usage{ \method{RenameCells}{SCTAssay}(object, new.names = NULL, ...) \method{RenameCells}{SlideSeq}(object, new.names = NULL, ...) \method{RenameCells}{STARmap}(object, new.names = NULL, ...) \method{RenameCells}{VisiumV1}(object, new.names = NULL, ...) } \arguments{ \item{object}{An object} \item{new.names}{vector of new cell names} \item{...}{Arguments passed to other methods} } \description{ Rename Cells in an Object } \seealso{ \code{\link[SeuratObject:RenameCells]{SeuratObject::RenameCells}} } \concept{objects} Seurat/man/IntegrateData.Rd0000644000176200001440000001365414744463014015313 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{IntegrateData} \alias{IntegrateData} \title{Integrate data} \usage{ IntegrateData( anchorset, new.assay.name = "integrated", normalization.method = c("LogNormalize", "SCT"), features = NULL, features.to.integrate = NULL, dims = 1:30, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, eps = 0, verbose = TRUE ) } \arguments{ \item{anchorset}{An \code{\link{AnchorSet}} object generated by \code{\link{FindIntegrationAnchors}}} \item{new.assay.name}{Name for the new assay containing the integrated data} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{features}{Vector of features to use when computing the PCA to determine the weights. Only set if you want a different set from those used in the anchor finding process} \item{features.to.integrate}{Vector of features to integrate. By default, will use the features used in anchor finding.} \item{dims}{Number of dimensions to use in the anchor weighting procedure} \item{k.weight}{Number of neighbors to consider when weighting anchors} \item{weight.reduction}{Dimension reduction to use when calculating anchor weights. This can be one of: \itemize{ \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, specifying the object to use for each object in the integration} \item{NULL, in which case a new PCA will be calculated and used to calculate anchor weights} } Note that, if specified, the requested dimension reduction will only be used for calculating anchor weights in the first merge between reference and query, as the merged object will subsequently contain more cells than was in query, and weights will need to be calculated for all cells in the object.} \item{sd.weight}{Controls the bandwidth of the Gaussian kernel for weighting} \item{sample.tree}{Specify the order of integration. Order of integration should be encoded in a matrix, where each row represents one of the pairwise integration steps. Negative numbers specify a dataset, positive numbers specify the integration results from a given row (the format of the merge matrix included in the \code{\link{hclust}} function output). For example: \code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives: \if{html}{\out{
}}\preformatted{ [,1] [,2] [1,] -2 -3 [2,] 1 -1 }\if{html}{\out{
}} Which would cause dataset 2 and 3 to be integrated first, then the resulting object integrated with dataset 1. If NULL, the sample tree will be computed automatically.} \item{preserve.order}{Do not reorder objects based on size for each pairwise integration.} \item{eps}{Error bound on the neighbor finding algorithm (from \code{\link[RANN]{RANN}})} \item{verbose}{Print progress bars and output} } \value{ Returns a \code{\link[SeuratObject]{Seurat}} object with a new integrated \code{\link[SeuratObject]{Assay}}. If \code{normalization.method = "LogNormalize"}, the integrated data is returned to the \code{data} slot and can be treated as log-normalized, corrected data. If \code{normalization.method = "SCT"}, the integrated data is returned to the \code{scale.data} slot and can be treated as centered, corrected Pearson residuals. } \description{ Perform dataset integration using a pre-computed \code{\link{AnchorSet}}. } \details{ The main steps of this procedure are outlined below. For a more detailed description of the methodology, please see Stuart, Butler, et al Cell 2019. \doi{10.1016/j.cell.2019.05.031}; \doi{10.1101/460147} For pairwise integration: \itemize{ \item{Construct a weights matrix that defines the association between each query cell and each anchor. These weights are computed as 1 - the distance between the query cell and the anchor divided by the distance of the query cell to the \code{k.weight}th anchor multiplied by the anchor score computed in \code{\link{FindIntegrationAnchors}}. We then apply a Gaussian kernel width a bandwidth defined by \code{sd.weight} and normalize across all \code{k.weight} anchors.} \item{Compute the anchor integration matrix as the difference between the two expression matrices for every pair of anchor cells} \item{Compute the transformation matrix as the product of the integration matrix and the weights matrix.} \item{Subtract the transformation matrix from the original expression matrix.} } For multiple dataset integration, we perform iterative pairwise integration. To determine the order of integration (if not specified via \code{sample.tree}), we \itemize{ \item{Define a distance between datasets as the total number of cells in the smaller dataset divided by the total number of anchors between the two datasets.} \item{Compute all pairwise distances between datasets} \item{Cluster this distance matrix to determine a guide tree} } } \examples{ \dontrun{ # to install the SeuratData package see https://github.com/satijalab/seurat-data library(SeuratData) data("panc8") # panc8 is a merged Seurat object containing 8 separate pancreas datasets # split the object by dataset pancreas.list <- SplitObject(panc8, split.by = "tech") # perform standard preprocessing on each object for (i in 1:length(pancreas.list)) { pancreas.list[[i]] <- NormalizeData(pancreas.list[[i]], verbose = FALSE) pancreas.list[[i]] <- FindVariableFeatures( pancreas.list[[i]], selection.method = "vst", nfeatures = 2000, verbose = FALSE ) } # find anchors anchors <- FindIntegrationAnchors(object.list = pancreas.list) # integrate data integrated <- IntegrateData(anchorset = anchors) } } \references{ Stuart T, Butler A, et al. Comprehensive Integration of Single-Cell Data. Cell. 2019;177:1888-1902 \doi{10.1016/j.cell.2019.05.031} } \concept{integration} Seurat/man/CountSketch.Rd0000644000176200001440000000142114731364135015016 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sketching.R \name{CountSketch} \alias{CountSketch} \title{Generate CountSketch random matrix} \usage{ CountSketch(nsketch, ncells, seed = NA_integer_, ...) } \arguments{ \item{nsketch}{Number of sketching random cells} \item{ncells}{Number of cells in the original data} \item{seed}{a single value, interpreted as an integer, or \code{NULL} (see \sQuote{Details}).} \item{...}{Ignored} } \value{ ... } \description{ Generate CountSketch random matrix } \references{ Clarkson, KL. & Woodruff, DP. Low-rank approximation and regression in input sparsity time. Journal of the ACM (JACM). 2017 Jan 30;63(6):1-45. \url{https://dl.acm.org/doi/abs/10.1145/3019134}; } \concept{sketching} \keyword{internal} Seurat/man/LoadSTARmap.Rd0000644000176200001440000000201114731364135014627 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{LoadSTARmap} \alias{LoadSTARmap} \title{Load STARmap data} \usage{ LoadSTARmap( data.dir, counts.file = "cell_barcode_count.csv", gene.file = "genes.csv", qhull.file = "qhulls.tsv", centroid.file = "centroids.tsv", assay = "Spatial", image = "image" ) } \arguments{ \item{data.dir}{location of data directory that contains the counts matrix, gene name, qhull, and centroid files.} \item{counts.file}{name of file containing the counts matrix (csv)} \item{gene.file}{name of file containing the gene names (csv)} \item{qhull.file}{name of file containing the hull coordinates (tsv)} \item{centroid.file}{name of file containing the centroid positions (tsv)} \item{assay}{Name of assay to associate spatial data to} \item{image}{Name of "image" object storing spatial coordinates} } \value{ A \code{\link{Seurat}} object } \description{ Load STARmap data } \seealso{ \code{\link{STARmap}} } \concept{preprocessing} Seurat/man/ReadSlideSeq.Rd0000644000176200001440000000077414731364135015103 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{ReadSlideSeq} \alias{ReadSlideSeq} \title{Load Slide-seq spatial data} \usage{ ReadSlideSeq(coord.file, assay = "Spatial") } \arguments{ \item{coord.file}{Path to csv file containing bead coordinate positions} \item{assay}{Name of assay to associate image to} } \value{ A \code{\link{SlideSeq}} object } \description{ Load Slide-seq spatial data } \seealso{ \code{\link{SlideSeq}} } \concept{preprocessing} Seurat/man/MinMax.Rd0000644000176200001440000000126214731364135013760 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{MinMax} \alias{MinMax} \title{Apply a ceiling and floor to all values in a matrix} \usage{ MinMax(data, min, max) } \arguments{ \item{data}{Matrix or data frame} \item{min}{all values below this min value will be replaced with min} \item{max}{all values above this max value will be replaced with max} } \value{ Returns matrix after performing these floor and ceil operations } \description{ Apply a ceiling and floor to all values in a matrix } \examples{ mat <- matrix(data = rbinom(n = 25, size = 20, prob = 0.2 ), nrow = 5) mat MinMax(data = mat, min = 4, max = 5) } \concept{utilities} Seurat/man/ISpatialDimPlot.Rd0000644000176200001440000000167414744456127015604 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{ISpatialDimPlot} \alias{ISpatialDimPlot} \title{Visualize clusters spatially and interactively} \usage{ ISpatialDimPlot( object, image = NULL, image.scale = "lowres", group.by = NULL, alpha = c(0.3, 1) ) } \arguments{ \item{object}{A Seurat object} \item{image}{Name of the image to use in the plot} \item{image.scale}{Choose the scale factor ("lowres"/"hires") to apply in order to matchthe plot with the specified `image` - defaults to "lowres"} \item{group.by}{Name of meta.data column to group the data by} \item{alpha}{Controls opacity of spots. Provide as a vector specifying the min and max for SpatialFeaturePlot. For SpatialDimPlot, provide a single alpha value for each plot.} } \value{ Returns final plot as a ggplot object } \description{ Visualize clusters spatially and interactively } \concept{spatial} \concept{visualization} Seurat/man/JackStraw.Rd0000644000176200001440000000330414744456127014466 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensional_reduction.R \name{JackStraw} \alias{JackStraw} \title{Determine statistical significance of PCA scores.} \usage{ JackStraw( object, reduction = "pca", assay = NULL, dims = 20, num.replicate = 100, prop.freq = 0.01, verbose = TRUE, maxit = 1000 ) } \arguments{ \item{object}{Seurat object} \item{reduction}{DimReduc to use. ONLY PCA CURRENTLY SUPPORTED.} \item{assay}{Assay used to calculate reduction.} \item{dims}{Number of PCs to compute significance for} \item{num.replicate}{Number of replicate samplings to perform} \item{prop.freq}{Proportion of the data to randomly permute for each replicate} \item{verbose}{Print progress bar showing the number of replicates that have been processed.} \item{maxit}{maximum number of iterations to be performed by the irlba function of RunPCA} } \value{ Returns a Seurat object where JS(object = object[['pca']], slot = 'empirical') represents p-values for each gene in the PCA analysis. If ProjectPCA is subsequently run, JS(object = object[['pca']], slot = 'full') then represents p-values for all genes. } \description{ Randomly permutes a subset of data, and calculates projected PCA scores for these 'random' genes. Then compares the PCA scores for the 'random' genes with the observed PCA scores to determine statistical significance. End result is a p-value for each gene's association with each principal component. } \examples{ \dontrun{ data("pbmc_small") pbmc_small = suppressWarnings(JackStraw(pbmc_small)) head(JS(object = pbmc_small[['pca']], slot = 'empirical')) } } \references{ Inspired by Chung et al, Bioinformatics (2014) } \concept{dimensional_reduction} Seurat/man/HTOHeatmap.Rd0000644000176200001440000000316614731364134014525 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{HTOHeatmap} \alias{HTOHeatmap} \title{Hashtag oligo heatmap} \usage{ HTOHeatmap( object, assay = "HTO", classification = paste0(assay, "_classification"), global.classification = paste0(assay, "_classification.global"), ncells = 5000, singlet.names = NULL, raster = TRUE ) } \arguments{ \item{object}{Seurat object. Assumes that the hash tag oligo (HTO) data has been added and normalized, and demultiplexing has been run with HTODemux().} \item{assay}{Hashtag assay name.} \item{classification}{The naming for metadata column with classification result from HTODemux().} \item{global.classification}{The slot for metadata column specifying a cell as singlet/doublet/negative.} \item{ncells}{Number of cells to plot. Default is to choose 5000 cells by random subsampling, to avoid having to draw exceptionally large heatmaps.} \item{singlet.names}{Namings for the singlets. Default is to use the same names as HTOs.} \item{raster}{If true, plot with geom_raster, else use geom_tile. geom_raster may look blurry on some viewing applications such as Preview due to how the raster is interpolated. Set this to FALSE if you are encountering that issue (note that plots may take longer to produce/render).} } \value{ Returns a ggplot2 plot object. } \description{ Draws a heatmap of hashtag oligo signals across singlets/doublets/negative cells. Allows for the visualization of HTO demultiplexing results. } \examples{ \dontrun{ object <- HTODemux(object) HTOHeatmap(object) } } \seealso{ \code{\link{HTODemux}} } \concept{visualization} Seurat/man/SingleCorPlot.Rd0000644000176200001440000000244014731364134015311 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleCorPlot} \alias{SingleCorPlot} \title{A single correlation plot} \usage{ SingleCorPlot( data, col.by = NULL, cols = NULL, pt.size = NULL, smooth = FALSE, rows.highlight = NULL, legend.title = NULL, na.value = "grey50", span = NULL, raster = NULL, raster.dpi = NULL, plot.cor = TRUE, jitter = TRUE ) } \arguments{ \item{data}{A data frame with two columns to be plotted} \item{col.by}{A vector or factor of values to color the plot by} \item{cols}{An optional vector of colors to use} \item{pt.size}{Point size for the plot} \item{smooth}{Make a smoothed scatter plot} \item{rows.highlight}{A vector of rows to highlight (like cells.highlight in \code{\link{SingleDimPlot}})} \item{legend.title}{Optional legend title} \item{raster}{Convert points to raster format, default is \code{NULL} which will automatically use raster if the number of points plotted is greater than 100,000} \item{raster.dpi}{the pixel resolution for rastered plots, passed to geom_scattermore(). Default is c(512, 512)} \item{plot.cor}{...} \item{jitter}{Jitter for easier visualization of crowded points} } \value{ A ggplot2 object } \description{ A single correlation plot } \keyword{internal} Seurat/man/Read10X_Coordinates.Rd0000644000176200001440000000105214731364135016262 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X_Coordinates} \alias{Read10X_Coordinates} \title{Load 10X Genomics Visium Tissue Positions} \usage{ Read10X_Coordinates(filename, filter.matrix) } \arguments{ \item{filename}{Path to a \code{tissue_positions_list.csv} file} \item{filter.matrix}{Filter spot/feature matrix to only include spots that have been determined to be over tissue} } \value{ A data.frame } \description{ Load 10X Genomics Visium Tissue Positions } \concept{preprocessing} Seurat/man/RunMixscape.Rd0000644000176200001440000000603714731364135015032 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{RunMixscape} \alias{RunMixscape} \title{Run Mixscape} \usage{ RunMixscape( object, assay = "PRTB", slot = "scale.data", labels = "gene", nt.class.name = "NT", new.class.name = "mixscape_class", min.de.genes = 5, min.cells = 5, de.assay = "RNA", logfc.threshold = 0.25, iter.num = 10, verbose = FALSE, split.by = NULL, fine.mode = FALSE, fine.mode.labels = "guide_ID", prtb.type = "KO" ) } \arguments{ \item{object}{An object of class Seurat.} \item{assay}{Assay to use for mixscape classification.} \item{slot}{Assay data slot to use.} \item{labels}{metadata column with target gene labels.} \item{nt.class.name}{Classification name of non-targeting gRNA cells.} \item{new.class.name}{Name of mixscape classification to be stored in metadata.} \item{min.de.genes}{Required number of genes that are differentially expressed for method to separate perturbed and non-perturbed cells.} \item{min.cells}{Minimum number of cells in target gene class. If fewer than this many cells are assigned to a target gene class during classification, all are assigned NP.} \item{de.assay}{Assay to use when performing differential expression analysis. Usually RNA.} \item{logfc.threshold}{Limit testing to genes which show, on average, at least X-fold difference (log-scale) between the two groups of cells. Default is 0.25 Increasing logfc.threshold speeds up the function, but can miss weaker signals.} \item{iter.num}{Number of normalmixEM iterations to run if convergence does not occur.} \item{verbose}{Display messages} \item{split.by}{metadata column with experimental condition/cell type classification information. This is meant to be used to account for cases a perturbation is condition/cell type -specific.} \item{fine.mode}{When this is equal to TRUE, DE genes for each target gene class will be calculated for each gRNA separately and pooled into one DE list for calculating the perturbation score of every cell and their subsequent classification.} \item{fine.mode.labels}{metadata column with gRNA ID labels.} \item{prtb.type}{specify type of CRISPR perturbation expected for labeling mixscape classifications. Default is KO.} } \value{ Returns Seurat object with with the following information in the meta data and tools slots: \describe{ \item{mixscape_class}{Classification result with cells being either classified as perturbed (KO, by default) or non-perturbed (NP) based on their target gene class.} \item{mixscape_class.global}{Global classification result (perturbed, NP or NT)} \item{p_ko}{Posterior probabilities used to determine if a cell is KO (default). Name of this item will change to match prtb.type parameter setting. (>0.5) or NP} \item{perturbation score}{Perturbation scores for every cell calculated in the first iteration of the function.} } } \description{ Function to identify perturbed and non-perturbed gRNA expressing cells that accounts for multiple treatments/conditions/chemical perturbations. } \concept{mixscape} Seurat/man/Read10X_h5.Rd0000644000176200001440000000132614731364135014330 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X_h5} \alias{Read10X_h5} \title{Read 10X hdf5 file} \usage{ Read10X_h5(filename, use.names = TRUE, unique.features = TRUE) } \arguments{ \item{filename}{Path to h5 file} \item{use.names}{Label row names with feature names rather than ID numbers.} \item{unique.features}{Make feature names unique (default TRUE)} } \value{ Returns a sparse matrix with rows and columns labeled. If multiple genomes are present, returns a list of sparse matrices (one per genome). } \description{ Read count matrix from 10X CellRanger hdf5 file. This can be used to read both scATAC-seq and scRNA-seq matrices. } \concept{preprocessing} Seurat/man/RunSLSI.Rd0000644000176200001440000000376314743751115014037 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunSLSI} \alias{RunSLSI} \alias{RunSLSI.default} \alias{RunSLSI.Assay} \alias{RunSLSI.StdAssay} \alias{RunSLSI.Seurat} \title{Run Supervised Latent Semantic Indexing} \usage{ RunSLSI(object, ...) \method{RunSLSI}{default}( object, assay = NULL, n = 50, reduction.key = "SLSI_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) \method{RunSLSI}{Assay}( object, assay = NULL, features = NULL, n = 50, reduction.key = "SLSI_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) \method{RunSLSI}{StdAssay}( object, assay = NULL, features = NULL, n = 50, reduction.key = "SLSI_", graph = NULL, layer = "data", verbose = TRUE, seed.use = 42, ... ) \method{RunSLSI}{Seurat}( object, assay = NULL, features = NULL, n = 50, reduction.name = "slsi", reduction.key = "SLSI_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to IRLBA irlba} \item{assay}{Name of Assay SLSI is being run on} \item{n}{Total Number of SLSI components to compute and store} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names} \item{graph}{Graph used supervised by SLSI} \item{verbose}{Display messages} \item{seed.use}{Set a random seed. Setting NULL will not set a seed.} \item{features}{Features to compute SLSI on. If features=NULL, SLSI will be run using the variable features for the Assay5.} \item{layer}{Layer to run SLSI on} \item{reduction.name}{dimensional reduction name} } \value{ Returns Seurat object with the SLSI calculation stored in the reductions slot } \description{ Run a supervised LSI (SLSI) dimensionality reduction supervised by a cell-cell kernel. SLSI is used to capture a linear transformation of peaks that maximizes its dependency to the given cell-cell kernel. } \concept{dimensional_reduction} Seurat/man/CollapseEmbeddingOutliers.Rd0000644000176200001440000000230414731364134017654 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{CollapseEmbeddingOutliers} \alias{CollapseEmbeddingOutliers} \title{Move outliers towards center on dimension reduction plot} \usage{ CollapseEmbeddingOutliers( object, reduction = "umap", dims = 1:2, group.by = "ident", outlier.sd = 2, reduction.key = "UMAP_" ) } \arguments{ \item{object}{Seurat object} \item{reduction}{Name of DimReduc to adjust} \item{dims}{Dimensions to visualize} \item{group.by}{Group (color) cells in different ways (for example, orig.ident)} \item{outlier.sd}{Controls the outlier distance} \item{reduction.key}{Key for DimReduc that is returned} } \value{ Returns a DimReduc object with the modified embeddings } \description{ Move outliers towards center on dimension reduction plot } \examples{ \dontrun{ data("pbmc_small") pbmc_small <- FindClusters(pbmc_small, resolution = 1.1) pbmc_small <- RunUMAP(pbmc_small, dims = 1:5) DimPlot(pbmc_small, reduction = "umap") pbmc_small[["umap_new"]] <- CollapseEmbeddingOutliers(pbmc_small, reduction = "umap", reduction.key = 'umap_', outlier.sd = 0.5) DimPlot(pbmc_small, reduction = "umap_new") } } \concept{visualization} Seurat/man/Read10X.Rd0000644000176200001440000000357414731364135013743 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X} \alias{Read10X} \title{Load in data from 10X} \usage{ Read10X( data.dir, gene.column = 2, cell.column = 1, unique.features = TRUE, strip.suffix = FALSE ) } \arguments{ \item{data.dir}{Directory containing the matrix.mtx, genes.tsv (or features.tsv), and barcodes.tsv files provided by 10X. A vector or named vector can be given in order to load several data directories. If a named vector is given, the cell barcode names will be prefixed with the name.} \item{gene.column}{Specify which column of genes.tsv or features.tsv to use for gene names; default is 2} \item{cell.column}{Specify which column of barcodes.tsv to use for cell names; default is 1} \item{unique.features}{Make feature names unique (default TRUE)} \item{strip.suffix}{Remove trailing "-1" if present in all cell barcodes.} } \value{ If features.csv indicates the data has multiple data types, a list containing a sparse matrix of the data from each type will be returned. Otherwise a sparse matrix containing the expression data will be returned. } \description{ Enables easy loading of sparse data matrices provided by 10X genomics. } \examples{ \dontrun{ # For output from CellRanger < 3.0 data_dir <- 'path/to/data/directory' list.files(data_dir) # Should show barcodes.tsv, genes.tsv, and matrix.mtx expression_matrix <- Read10X(data.dir = data_dir) seurat_object = CreateSeuratObject(counts = expression_matrix) # For output from CellRanger >= 3.0 with multiple data types data_dir <- 'path/to/data/directory' list.files(data_dir) # Should show barcodes.tsv.gz, features.tsv.gz, and matrix.mtx.gz data <- Read10X(data.dir = data_dir) seurat_object = CreateSeuratObject(counts = data$`Gene Expression`) seurat_object[['Protein']] = CreateAssayObject(counts = data$`Antibody Capture`) } } \concept{preprocessing} Seurat/man/FilterSlideSeq.Rd0000644000176200001440000000313514731364135015447 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{FilterSlideSeq} \alias{FilterSlideSeq} \title{Filter stray beads from Slide-seq puck} \usage{ FilterSlideSeq( object, image = "image", center = NULL, radius = NULL, do.plot = TRUE ) } \arguments{ \item{object}{Seurat object with slide-seq data} \item{image}{Name of the image where the coordinates are stored} \item{center}{Vector specifying the x and y coordinates for the center of the inclusion circle} \item{radius}{Radius of the circle of inclusion} \item{do.plot}{Display a \code{\link{SpatialDimPlot}} with the cells being removed labeled.} } \value{ Returns a Seurat object with only the subset of cells that pass the circular filter } \description{ This function is useful for removing stray beads that fall outside the main Slide-seq puck area. Essentially, it's a circular filter where you set a center and radius defining a circle of beads to keep. If the center is not set, it will be estimated from the bead coordinates (removing the 1st and 99th quantile to avoid skewing the center by the stray beads). By default, this function will display a \code{\link{SpatialDimPlot}} showing which cells were removed for easy adjustment of the center and/or radius. } \examples{ \dontrun{ # This example uses the ssHippo dataset which you can download # using the SeuratData package. library(SeuratData) data('ssHippo') # perform filtering of beads ssHippo.filtered <- FilterSlideSeq(ssHippo, radius = 2300) # This radius looks to small so increase and repeat until satisfied } } \concept{objects} \concept{spatial} Seurat/man/SampleUMI.Rd0000644000176200001440000000145514731364135014367 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{SampleUMI} \alias{SampleUMI} \title{Sample UMI} \usage{ SampleUMI(data, max.umi = 1000, upsample = FALSE, verbose = FALSE) } \arguments{ \item{data}{Matrix with the raw count data} \item{max.umi}{Number of UMIs to sample to} \item{upsample}{Upsamples all cells with fewer than max.umi} \item{verbose}{Display the progress bar} } \value{ Matrix with downsampled data } \description{ Downsample each cell to a specified number of UMIs. Includes an option to upsample cells below specified UMI as well. } \examples{ data("pbmc_small") counts = as.matrix(x = GetAssayData(object = pbmc_small, assay = "RNA", slot = "counts")) downsampled = SampleUMI(data = counts) head(x = downsampled) } \concept{preprocessing} Seurat/man/VariableFeaturePlot.Rd0000644000176200001440000000247414731364134016474 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{VariableFeaturePlot} \alias{VariableFeaturePlot} \alias{VariableGenePlot} \alias{MeanVarPlot} \title{View variable features} \usage{ VariableFeaturePlot( object, cols = c("black", "red"), pt.size = 1, log = NULL, selection.method = NULL, assay = NULL, raster = NULL, raster.dpi = c(512, 512) ) } \arguments{ \item{object}{Seurat object} \item{cols}{Colors to specify non-variable/variable status} \item{pt.size}{Size of the points on the plot} \item{log}{Plot the x-axis in log scale} \item{selection.method}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}}} \item{assay}{Assay to pull variable features from} \item{raster}{Convert points to raster format, default is \code{NULL} which will automatically use raster if the number of points plotted is greater than 100,000} \item{raster.dpi}{Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512).} } \value{ A ggplot object } \description{ View variable features } \examples{ data("pbmc_small") VariableFeaturePlot(object = pbmc_small) } \seealso{ \code{\link{FindVariableFeatures}} } \concept{visualization} Seurat/man/ProjectDim.Rd0000644000176200001440000000262714744456127014644 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensional_reduction.R \name{ProjectDim} \alias{ProjectDim} \title{Project Dimensional reduction onto full dataset} \usage{ ProjectDim( object, reduction = "pca", assay = NULL, dims.print = 1:5, nfeatures.print = 20, overwrite = FALSE, do.center = FALSE, verbose = TRUE ) } \arguments{ \item{object}{Seurat object} \item{reduction}{Reduction to use} \item{assay}{Assay to use} \item{dims.print}{Number of dims to print features for} \item{nfeatures.print}{Number of features with highest/lowest loadings to print for each dimension} \item{overwrite}{Replace the existing data in feature.loadings} \item{do.center}{Center the dataset prior to projection (should be set to TRUE)} \item{verbose}{Print top genes associated with the projected dimensions} } \value{ Returns Seurat object with the projected values } \description{ Takes a pre-computed dimensional reduction (typically calculated on a subset of genes) and projects this onto the entire dataset (all genes). Note that the cell loadings will remain unchanged, but now there are gene loadings for all genes. } \examples{ data("pbmc_small") pbmc_small pbmc_small <- ProjectDim(object = pbmc_small, reduction = "pca") # Visualize top projected genes in heatmap DimHeatmap(object = pbmc_small, reduction = "pca", dims = 1, balanced = TRUE) } \concept{dimensional_reduction} Seurat/man/MapQuery.Rd0000644000176200001440000000602114731364134014327 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{MapQuery} \alias{MapQuery} \title{Map query cells to a reference} \usage{ MapQuery( anchorset, query, reference, refdata = NULL, new.reduction.name = NULL, reference.reduction = NULL, reference.dims = NULL, query.dims = NULL, store.weights = FALSE, reduction.model = NULL, transferdata.args = list(), integrateembeddings.args = list(), projectumap.args = list(), verbose = TRUE ) } \arguments{ \item{anchorset}{An AnchorSet object} \item{query}{Query object used in anchorset construction} \item{reference}{Reference object used in anchorset construction} \item{refdata}{Data to transfer. This can be specified in one of two ways: \itemize{ \item{The reference data itself as either a vector where the names correspond to the reference cells, or a matrix, where the column names correspond to the reference cells.} \item{The name of the metadata field or assay from the reference object provided. This requires the reference parameter to be specified. If pulling assay data in this manner, it will pull the data from the data slot. To transfer data from other slots, please pull the data explicitly with \code{\link{GetAssayData}} and provide that matrix here.} }} \item{new.reduction.name}{Name for new integrated dimensional reduction.} \item{reference.reduction}{Name of reduction to use from the reference for neighbor finding} \item{reference.dims}{Dimensions (columns) to use from reference} \item{query.dims}{Dimensions (columns) to use from query} \item{store.weights}{Determine if the weight and anchor matrices are stored.} \item{reduction.model}{\code{DimReduc} object that contains the umap model} \item{transferdata.args}{A named list of additional arguments to \code{\link{TransferData}}} \item{integrateembeddings.args}{A named list of additional arguments to \code{\link{IntegrateEmbeddings}}} \item{projectumap.args}{A named list of additional arguments to \code{\link{ProjectUMAP}}} \item{verbose}{Print progress bars and output} } \value{ Returns a modified query Seurat object containing:#' \itemize{ \item{New Assays corresponding to the features transferred and/or their corresponding prediction scores from \code{\link{TransferData}}} \item{An integrated reduction from \code{\link{IntegrateEmbeddings}}} \item{A projected UMAP reduction of the query cells projected into the reference UMAP using \code{\link{ProjectUMAP}}} } } \description{ This is a convenience wrapper function around the following three functions that are often run together when mapping query data to a reference: \code{\link{TransferData}}, \code{\link{IntegrateEmbeddings}}, \code{\link{ProjectUMAP}}. Note that by default, the \code{weight.reduction} parameter for all functions will be set to the dimension reduction method used in the \code{\link{FindTransferAnchors}} function call used to construct the anchor object, and the \code{dims} parameter will be the same dimensions used to find anchors. } \concept{integration} Seurat/man/SaveAnnoyIndex.Rd0000644000176200001440000000057414731364135015467 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{SaveAnnoyIndex} \alias{SaveAnnoyIndex} \title{Save the Annoy index} \usage{ SaveAnnoyIndex(object, file) } \arguments{ \item{object}{A Neighbor object with the annoy index stored} \item{file}{Path to file to write index to} } \description{ Save the Annoy index } \concept{utilities} Seurat/man/Cells.Rd0000644000176200001440000000110614731364135013626 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{Cells.SCTModel} \alias{Cells.SCTModel} \alias{Cells.SlideSeq} \alias{Cells.STARmap} \alias{Cells.VisiumV1} \title{Get Cell Names} \usage{ \method{Cells}{SCTModel}(x, ...) \method{Cells}{SlideSeq}(x, ...) \method{Cells}{STARmap}(x, ...) \method{Cells}{VisiumV1}(x, ...) } \arguments{ \item{x}{An object} \item{...}{Arguments passed to other methods} } \description{ Get Cell Names } \seealso{ \code{\link[SeuratObject:Cells]{SeuratObject::Cells}} } \concept{objects} \concept{spatial} Seurat/man/FetchResiduals_reference.Rd0000644000176200001440000000141114731364135017506 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing5.R \name{FetchResiduals_reference} \alias{FetchResiduals_reference} \title{temporal function to get residuals from reference} \usage{ FetchResiduals_reference( object, reference.SCT.model = NULL, features = NULL, nCount_UMI = NULL, verbose = FALSE ) } \arguments{ \item{object}{A seurat object} \item{reference.SCT.model}{a reference SCT model that should be used for calculating the residuals} \item{features}{Names of features to compute} \item{nCount_UMI}{UMI counts. If not specified, defaults to column sums of object} \item{verbose}{Whether to print messages and progress bars} } \description{ temporal function to get residuals from reference } \keyword{internal} Seurat/man/contrast-theory.Rd0000644000176200001440000000131614731364134015733 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{contrast-theory} \alias{contrast-theory} \alias{Intensity} \alias{Luminance} \title{Get the intensity and/or luminance of a color} \source{ \url{https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color} } \usage{ Intensity(color) Luminance(color) } \arguments{ \item{color}{A vector of colors} } \value{ A vector of intensities/luminances for each color } \description{ Get the intensity and/or luminance of a color } \examples{ Intensity(color = c('black', 'white', '#E76BF3')) Luminance(color = c('black', 'white', '#E76BF3')) } \concept{visualization} Seurat/man/CellsByImage.Rd0000644000176200001440000000123014731364135015062 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{CellsByImage} \alias{CellsByImage} \title{Get a vector of cell names associated with an image (or set of images)} \usage{ CellsByImage(object, images = NULL, unlist = FALSE) } \arguments{ \item{object}{Seurat object} \item{images}{Vector of image names} \item{unlist}{Return as a single vector of cell names as opposed to a list, named by image name.} } \value{ A vector of cell names } \description{ Get a vector of cell names associated with an image (or set of images) } \examples{ \dontrun{ CellsByImage(object = object, images = "slice1") } } \keyword{internal} Seurat/man/RunUMAP.Rd0000644000176200001440000002267014744456127014033 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunUMAP} \alias{RunUMAP} \alias{RunUMAP.default} \alias{RunUMAP.Graph} \alias{RunUMAP.Neighbor} \alias{RunUMAP.Seurat} \title{Run UMAP} \usage{ RunUMAP(object, ...) \method{RunUMAP}{default}( object, reduction.key = "UMAP_", assay = NULL, reduction.model = NULL, return.model = FALSE, umap.method = "uwot", n.neighbors = 30L, n.components = 2L, metric = "cosine", n.epochs = NULL, learning.rate = 1, min.dist = 0.3, spread = 1, set.op.mix.ratio = 1, local.connectivity = 1L, repulsion.strength = 1, negative.sample.rate = 5, a = NULL, b = NULL, uwot.sgd = FALSE, seed.use = 42, metric.kwds = NULL, angular.rp.forest = FALSE, densmap = FALSE, dens.lambda = 2, dens.frac = 0.3, dens.var.shift = 0.1, verbose = TRUE, ... ) \method{RunUMAP}{Graph}( object, assay = NULL, umap.method = "umap-learn", n.components = 2L, metric = "correlation", n.epochs = 0L, learning.rate = 1, min.dist = 0.3, spread = 1, repulsion.strength = 1, negative.sample.rate = 5L, a = NULL, b = NULL, uwot.sgd = FALSE, seed.use = 42L, metric.kwds = NULL, densmap = FALSE, densmap.kwds = NULL, verbose = TRUE, reduction.key = "UMAP_", ... ) \method{RunUMAP}{Neighbor}(object, reduction.model, ...) \method{RunUMAP}{Seurat}( object, dims = NULL, reduction = "pca", features = NULL, graph = NULL, assay = DefaultAssay(object = object), nn.name = NULL, slot = "data", umap.method = "uwot", reduction.model = NULL, return.model = FALSE, n.neighbors = 30L, n.components = 2L, metric = "cosine", n.epochs = NULL, learning.rate = 1, min.dist = 0.3, spread = 1, set.op.mix.ratio = 1, local.connectivity = 1L, repulsion.strength = 1, negative.sample.rate = 5L, a = NULL, b = NULL, uwot.sgd = FALSE, seed.use = 42L, metric.kwds = NULL, angular.rp.forest = FALSE, densmap = FALSE, dens.lambda = 2, dens.frac = 0.3, dens.var.shift = 0.1, verbose = TRUE, reduction.name = "umap", reduction.key = NULL, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods and UMAP} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names. UMAP by default} \item{assay}{Assay to pull data for when using \code{features}, or assay used to construct Graph if running UMAP on a Graph} \item{reduction.model}{\code{DimReduc} object that contains the umap model} \item{return.model}{whether UMAP will return the uwot model} \item{umap.method}{UMAP implementation to run. Can be \describe{ \item{\code{uwot}:}{Runs umap via the uwot R package} \item{\code{uwot-learn}:}{Runs umap via the uwot R package and return the learned umap model} \item{\code{umap-learn}:}{Run the Seurat wrapper of the python umap-learn package} }} \item{n.neighbors}{This determines the number of neighboring points used in local approximations of manifold structure. Larger values will result in more global structure being preserved at the loss of detailed local structure. In general this parameter should often be in the range 5 to 50.} \item{n.components}{The dimension of the space to embed into.} \item{metric}{metric: This determines the choice of metric used to measure distance in the input space. A wide variety of metrics are already coded, and a user defined function can be passed as long as it has been JITd by numba.} \item{n.epochs}{he number of training epochs to be used in optimizing the low dimensional embedding. Larger values result in more accurate embeddings. If NULL is specified, a value will be selected based on the size of the input dataset (200 for large datasets, 500 for small).} \item{learning.rate}{The initial learning rate for the embedding optimization.} \item{min.dist}{This controls how tightly the embedding is allowed compress points together. Larger values ensure embedded points are more evenly distributed, while smaller values allow the algorithm to optimize more accurately with regard to local structure. Sensible values are in the range 0.001 to 0.5.} \item{spread}{The effective scale of embedded points. In combination with min.dist this determines how clustered/clumped the embedded points are.} \item{set.op.mix.ratio}{Interpolate between (fuzzy) union and intersection as the set operation used to combine local fuzzy simplicial sets to obtain a global fuzzy simplicial sets. Both fuzzy set operations use the product t-norm. The value of this parameter should be between 0.0 and 1.0; a value of 1.0 will use a pure fuzzy union, while 0.0 will use a pure fuzzy intersection.} \item{local.connectivity}{The local connectivity required - i.e. the number of nearest neighbors that should be assumed to be connected at a local level. The higher this value the more connected the manifold becomes locally. In practice this should be not more than the local intrinsic dimension of the manifold.} \item{repulsion.strength}{Weighting applied to negative samples in low dimensional embedding optimization. Values higher than one will result in greater weight being given to negative samples.} \item{negative.sample.rate}{The number of negative samples to select per positive sample in the optimization process. Increasing this value will result in greater repulsive force being applied, greater optimization cost, but slightly more accuracy.} \item{a}{More specific parameters controlling the embedding. If NULL, these values are set automatically as determined by min. dist and spread. Parameter of differentiable approximation of right adjoint functor.} \item{b}{More specific parameters controlling the embedding. If NULL, these values are set automatically as determined by min. dist and spread. Parameter of differentiable approximation of right adjoint functor.} \item{uwot.sgd}{Set \code{uwot::umap(fast_sgd = TRUE)}; see \code{\link[uwot]{umap}} for more details} \item{seed.use}{Set a random seed. By default, sets the seed to 42. Setting NULL will not set a seed} \item{metric.kwds}{A dictionary of arguments to pass on to the metric, such as the p value for Minkowski distance. If NULL then no arguments are passed on.} \item{angular.rp.forest}{Whether to use an angular random projection forest to initialize the approximate nearest neighbor search. This can be faster, but is mostly on useful for metric that use an angular style distance such as cosine, correlation etc. In the case of those metrics angular forests will be chosen automatically.} \item{densmap}{Whether to use the density-augmented objective of densMAP. Turning on this option generates an embedding where the local densities are encouraged to be correlated with those in the original space. Parameters below with the prefix ‘dens’ further control the behavior of this extension. Default is FALSE. Only compatible with 'umap-learn' method and version of umap-learn >= 0.5.0} \item{dens.lambda}{Specific parameter which controls the regularization weight of the density correlation term in densMAP. Higher values prioritize density preservation over the UMAP objective, and vice versa for values closer to zero. Setting this parameter to zero is equivalent to running the original UMAP algorithm. Default value is 2.} \item{dens.frac}{Specific parameter which controls the fraction of epochs (between 0 and 1) where the density-augmented objective is used in densMAP. The first (1 - dens_frac) fraction of epochs optimize the original UMAP objective before introducing the density correlation term. Default is 0.3.} \item{dens.var.shift}{Specific parameter which specifies a small constant added to the variance of local radii in the embedding when calculating the density correlation objective to prevent numerical instability from dividing by a small number. Default is 0.1.} \item{verbose}{Controls verbosity} \item{densmap.kwds}{A dictionary of arguments to pass on to the densMAP optimization.} \item{dims}{Which dimensions to use as input features, used only if \code{features} is NULL} \item{reduction}{Which dimensional reduction (PCA or ICA) to use for the UMAP input. Default is PCA} \item{features}{If set, run UMAP on this subset of features (instead of running on a set of reduced dimensions). Not set (NULL) by default; \code{dims} must be NULL to run on features} \item{graph}{Name of graph on which to run UMAP} \item{nn.name}{Name of knn output on which to run UMAP} \item{slot}{The slot used to pull data for when using \code{features}. data slot is by default.} \item{reduction.name}{Name to store dimensional reduction under in the Seurat object} } \value{ Returns a Seurat object containing a UMAP representation } \description{ Runs the Uniform Manifold Approximation and Projection (UMAP) dimensional reduction technique. To run using \code{umap.method="umap-learn"}, you must first install the umap-learn python package (e.g. via \code{pip install umap-learn}). Details on this package can be found here: \url{https://github.com/lmcinnes/umap}. For a more in depth discussion of the mathematics underlying UMAP, see the ArXiv paper here: \url{https://arxiv.org/abs/1802.03426}. } \examples{ \dontrun{ data("pbmc_small") pbmc_small # Run UMAP map on first 5 PCs pbmc_small <- RunUMAP(object = pbmc_small, dims = 1:5) # Plot results DimPlot(object = pbmc_small, reduction = 'umap') } } \references{ McInnes, L, Healy, J, UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction, ArXiv e-prints 1802.03426, 2018 } \concept{dimensional_reduction} Seurat/man/LocalStruct.Rd0000644000176200001440000000242214731364134015024 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{LocalStruct} \alias{LocalStruct} \title{Calculate the local structure preservation metric} \usage{ LocalStruct( object, grouping.var, idents = NULL, neighbors = 100, reduction = "pca", reduced.dims = 1:10, orig.dims = 1:10, verbose = TRUE ) } \arguments{ \item{object}{Seurat object} \item{grouping.var}{Grouping variable} \item{idents}{Optionally specify a set of idents to compute metric for} \item{neighbors}{Number of neighbors to compute in pca/corrected pca space} \item{reduction}{Dimensional reduction to use for corrected space} \item{reduced.dims}{Number of reduced dimensions to use} \item{orig.dims}{Number of PCs to use in original space} \item{verbose}{Display progress bar} } \value{ Returns the average preservation metric } \description{ Calculates a metric that describes how well the local structure of each group prior to integration is preserved after integration. This procedure works as follows: For each group, compute a PCA, compute the top num.neighbors in pca space, compute the top num.neighbors in corrected pca space, compute the size of the intersection of those two sets of neighbors. Return the average over all groups. } \concept{integration} Seurat/man/PlotClusterTree.Rd0000644000176200001440000000161414731364134015667 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{PlotClusterTree} \alias{PlotClusterTree} \title{Plot clusters as a tree} \usage{ PlotClusterTree(object, direction = "downwards", ...) } \arguments{ \item{object}{Seurat object} \item{direction}{A character string specifying the direction of the tree (default is downwards) Possible options: "rightwards", "leftwards", "upwards", and "downwards".} \item{\dots}{Additional arguments to \code{\link[ape:plot.phylo]{ape::plot.phylo}}} } \value{ Plots dendogram (must be precomputed using BuildClusterTree), returns no value } \description{ Plots previously computed tree (from BuildClusterTree) } \examples{ \dontrun{ if (requireNamespace("ape", quietly = TRUE)) { data("pbmc_small") pbmc_small <- BuildClusterTree(object = pbmc_small) PlotClusterTree(object = pbmc_small) } } } \concept{visualization} Seurat/man/CollapseSpeciesExpressionMatrix.Rd0000644000176200001440000000275214731364135021117 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{CollapseSpeciesExpressionMatrix} \alias{CollapseSpeciesExpressionMatrix} \title{Slim down a multi-species expression matrix, when only one species is primarily of interenst.} \usage{ CollapseSpeciesExpressionMatrix( object, prefix = "HUMAN_", controls = "MOUSE_", ncontrols = 100 ) } \arguments{ \item{object}{A UMI count matrix. Should contain rownames that start with the ensuing arguments prefix.1 or prefix.2} \item{prefix}{The prefix denoting rownames for the species of interest. Default is "HUMAN_". These rownames will have this prefix removed in the returned matrix.} \item{controls}{The prefix denoting rownames for the species of 'negative control' cells. Default is "MOUSE_".} \item{ncontrols}{How many of the most highly expressed (average) negative control features (by default, 100 mouse genes), should be kept? All other rownames starting with prefix.2 are discarded.} } \value{ A UMI count matrix. Rownames that started with \code{prefix} have this prefix discarded. For rownames starting with \code{controls}, only the \code{ncontrols} most highly expressed features are kept, and the prefix is kept. All other rows are retained. } \description{ Valuable for CITE-seq analyses, where we typically spike in rare populations of 'negative control' cells from a different species. } \examples{ \dontrun{ cbmc.rna.collapsed <- CollapseSpeciesExpressionMatrix(cbmc.rna) } } \concept{utilities} Seurat/man/Read10X_probe_metadata.Rd0000644000176200001440000000125614731364135016765 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X_probe_metadata} \alias{Read10X_probe_metadata} \title{Read10x Probe Metadata} \usage{ Read10X_probe_metadata(data.dir, filename = "raw_probe_bc_matrix.h5") } \arguments{ \item{data.dir}{The directory where the file is located.} \item{filename}{The name of the file containing the raw probe barcode matrix in HDF5 format. The default filename is 'raw_probe_bc_matrix.h5'.} } \value{ Returns a data.frame containing the probe metadata. } \description{ This function reads the probe metadata from a 10x Genomics probe barcode matrix file in HDF5 format. } \concept{preprocessing} Seurat/man/BarcodeInflectionsPlot.Rd0000644000176200001440000000203314731364134017157 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{BarcodeInflectionsPlot} \alias{BarcodeInflectionsPlot} \title{Plot the Barcode Distribution and Calculated Inflection Points} \usage{ BarcodeInflectionsPlot(object) } \arguments{ \item{object}{Seurat object} } \value{ Returns a `ggplot2` object showing the by-group inflection points and provided (or default) rank threshold values in grey. } \description{ This function plots the calculated inflection points derived from the barcode-rank distribution. } \details{ See [CalculateBarcodeInflections()] to calculate inflection points and [SubsetByBarcodeInflections()] to subsequently subset the Seurat object. } \examples{ data("pbmc_small") pbmc_small <- CalculateBarcodeInflections(pbmc_small, group.column = 'groups') BarcodeInflectionsPlot(pbmc_small) } \seealso{ \code{\link{CalculateBarcodeInflections}} \code{\link{SubsetByBarcodeInflections}} } \author{ Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} } \concept{visualization} Seurat/man/FindNeighbors.Rd0000644000176200001440000001263314744463014015314 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/clustering.R \name{FindNeighbors} \alias{FindNeighbors} \alias{FindNeighbors.default} \alias{FindNeighbors.Assay} \alias{FindNeighbors.dist} \alias{FindNeighbors.Seurat} \title{(Shared) Nearest-neighbor graph construction} \usage{ FindNeighbors(object, ...) \method{FindNeighbors}{default}( object, query = NULL, distance.matrix = FALSE, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, l2.norm = FALSE, cache.index = FALSE, index = NULL, ... ) \method{FindNeighbors}{Assay}( object, features = NULL, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, l2.norm = FALSE, cache.index = FALSE, ... ) \method{FindNeighbors}{dist}( object, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, l2.norm = FALSE, cache.index = FALSE, ... ) \method{FindNeighbors}{Seurat}( object, reduction = "pca", dims = 1:10, assay = NULL, features = NULL, k.param = 20, return.neighbor = FALSE, compute.SNN = !return.neighbor, prune.SNN = 1/15, nn.method = "annoy", n.trees = 50, annoy.metric = "euclidean", nn.eps = 0, verbose = TRUE, do.plot = FALSE, graph.name = NULL, l2.norm = FALSE, cache.index = FALSE, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{query}{Matrix of data to query against object. If missing, defaults to object.} \item{distance.matrix}{Boolean value of whether the provided matrix is a distance matrix; note, for objects of class \code{dist}, this parameter will be set automatically} \item{k.param}{Defines k for the k-nearest neighbor algorithm} \item{return.neighbor}{Return result as \code{\link[SeuratObject]{Neighbor}} object. Not used with distance matrix input.} \item{compute.SNN}{also compute the shared nearest neighbor graph} \item{prune.SNN}{Sets the cutoff for acceptable Jaccard index when computing the neighborhood overlap for the SNN construction. Any edges with values less than or equal to this will be set to 0 and removed from the SNN graph. Essentially sets the stringency of pruning (0 --- no pruning, 1 --- prune everything).} \item{nn.method}{Method for nearest neighbor finding. Options include: rann, annoy} \item{n.trees}{More trees gives higher precision when using annoy approximate nearest neighbor search} \item{annoy.metric}{Distance metric for annoy. Options include: euclidean, cosine, manhattan, and hamming} \item{nn.eps}{Error bound when performing nearest neighbor search using RANN; default of 0.0 implies exact nearest neighbor search} \item{verbose}{Whether or not to print output to the console} \item{l2.norm}{Take L2Norm of the data} \item{cache.index}{Include cached index in returned Neighbor object (only relevant if return.neighbor = TRUE)} \item{index}{Precomputed index. Useful if querying new data against existing index to avoid recomputing.} \item{features}{Features to use as input for building the (S)NN; used only when \code{dims} is \code{NULL}} \item{reduction}{Reduction to use as input for building the (S)NN} \item{dims}{Dimensions of reduction to use as input} \item{assay}{Assay to use in construction of (S)NN; used only when \code{dims} is \code{NULL}} \item{do.plot}{Plot SNN graph on tSNE coordinates} \item{graph.name}{Optional naming parameter for stored (S)NN graph (or Neighbor object, if return.neighbor = TRUE). Default is assay.name_(s)nn. To store both the neighbor graph and the shared nearest neighbor (SNN) graph, you must supply a vector containing two names to the \code{graph.name} parameter. The first element in the vector will be used to store the nearest neighbor (NN) graph, and the second element used to store the SNN graph. If only one name is supplied, only the NN graph is stored.} } \value{ This function can either return a \code{\link[SeuratObject]{Neighbor}} object with the KNN information or a list of \code{\link[SeuratObject]{Graph}} objects with the KNN and SNN depending on the settings of \code{return.neighbor} and \code{compute.SNN}. When running on a \code{\link[SeuratObject]{Seurat}} object, this returns the \code{\link[SeuratObject]{Seurat}} object with the Graphs or Neighbor objects stored in their respective slots. Names of the Graph or Neighbor object can be found with \code{\link[SeuratObject]{Graphs}} or \code{\link[SeuratObject]{Neighbors}}. } \description{ Computes the \code{k.param} nearest neighbors for a given dataset. Can also optionally (via \code{compute.SNN}), construct a shared nearest neighbor graph by calculating the neighborhood overlap (Jaccard index) between every cell and its \code{k.param} nearest neighbors. } \examples{ data("pbmc_small") pbmc_small # Compute an SNN on the gene expression level pbmc_small <- FindNeighbors(pbmc_small, features = VariableFeatures(object = pbmc_small)) # More commonly, we build the SNN on a dimensionally reduced form of the data # such as the first 10 principle components. pbmc_small <- FindNeighbors(pbmc_small, reduction = "pca", dims = 1:10) } \concept{clustering} Seurat/man/CreateCategoryMatrix.Rd0000644000176200001440000000105714731364135016657 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{CreateCategoryMatrix} \alias{CreateCategoryMatrix} \title{Create one hot matrix for a given label} \usage{ CreateCategoryMatrix( labels, method = c("aggregate", "average"), cells.name = NULL ) } \arguments{ \item{labels}{A vector of labels} \item{method}{Method to aggregate cells with the same label. Either 'aggregate' or 'average'} \item{cells.name}{A vector of cell names} } \description{ Create one hot matrix for a given label } \concept{utilities} Seurat/man/PrepSCTFindMarkers.Rd0000644000176200001440000000546214731364134016202 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/differential_expression.R \name{PrepSCTFindMarkers} \alias{PrepSCTFindMarkers} \title{Prepare object to run differential expression on SCT assay with multiple models} \usage{ PrepSCTFindMarkers(object, assay = "SCT", verbose = TRUE) } \arguments{ \item{object}{Seurat object with SCT assays} \item{assay}{Assay name where for SCT objects are stored; Default is 'SCT'} \item{verbose}{Print messages and progress} } \value{ Returns a Seurat object with recorrected counts and data in the SCT assay. } \description{ Given a merged object with multiple SCT models, this function uses minimum of the median UMI (calculated using the raw UMI counts) of individual objects to reverse the individual SCT regression model using minimum of median UMI as the sequencing depth covariate. The counts slot of the SCT assay is replaced with recorrected counts and the data slot is replaced with log1p of recorrected counts. } \section{Progress Updates with \pkg{progressr}}{ This function uses \href{https://cran.r-project.org/package=progressr}{\pkg{progressr}} to render status updates and progress bars. To enable progress updates, wrap the function call in \code{\link[progressr]{with_progress}} or run \code{\link[progressr:handlers]{handlers(global = TRUE)}} before running this function. For more details about \pkg{progressr}, please read \href{https://progressr.futureverse.org/articles/progressr-intro.html}{\code{vignette("progressr-intro")}} } \section{Parallelization with \pkg{future}}{ This function uses \href{https://cran.r-project.org/package=future}{\pkg{future}} to enable parallelization. Parallelization strategies can be set using \code{\link[future]{plan}}. Common plans include \dQuote{\code{sequential}} for non-parallelized processing or \dQuote{\code{multisession}} for parallel evaluation using multiple \R sessions; for other plans, see the \dQuote{Implemented evaluation strategies} section of \code{\link[future:plan]{?future::plan}}. For a more thorough introduction to \pkg{future}, see \href{https://future.futureverse.org/articles/future-1-overview.html}{\code{vignette("future-1-overview")}} } \examples{ data("pbmc_small") pbmc_small1 <- SCTransform(object = pbmc_small, variable.features.n = 20, vst.flavor="v1") pbmc_small2 <- SCTransform(object = pbmc_small, variable.features.n = 20, vst.flavor="v1") pbmc_merged <- merge(x = pbmc_small1, y = pbmc_small2) pbmc_merged <- PrepSCTFindMarkers(object = pbmc_merged) markers <- FindMarkers( object = pbmc_merged, ident.1 = "0", ident.2 = "1", assay = "SCT" ) pbmc_subset <- subset(pbmc_merged, idents = c("0", "1")) markers_subset <- FindMarkers( object = pbmc_subset, ident.1 = "0", ident.2 = "1", assay = "SCT", recorrect_umi = FALSE ) } \concept{differential_expression} \concept{future} Seurat/man/PseudobulkExpression.Rd0000644000176200001440000000516214731364134016766 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/utilities.R \name{PseudobulkExpression} \alias{PseudobulkExpression} \alias{PseudobulkExpression.Assay} \alias{PseudobulkExpression.StdAssay} \alias{PseudobulkExpression.Seurat} \title{Pseudobulk Expression} \usage{ PseudobulkExpression(object, ...) \method{PseudobulkExpression}{Assay}( object, assay, category.matrix, features = NULL, layer = "data", slot = deprecated(), verbose = TRUE, ... ) \method{PseudobulkExpression}{StdAssay}( object, assay, category.matrix, features = NULL, layer = "data", slot = deprecated(), verbose = TRUE, ... ) \method{PseudobulkExpression}{Seurat}( object, assays = NULL, features = NULL, return.seurat = FALSE, group.by = "ident", add.ident = NULL, layer = "data", slot = deprecated(), method = "average", normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, verbose = TRUE, ... ) } \arguments{ \item{object}{Seurat object} \item{...}{Arguments to be passed to methods such as \code{\link{CreateSeuratObject}}} \item{assay}{The name of the passed assay - used primarily for warning/error messages} \item{category.matrix}{A matrix defining groupings for pseudobulk expression calculations; each column represents an identity class, and each row a sample} \item{features}{Features to analyze. Default is all features in the assay} \item{layer}{Layer(s) to user; if multiple are given, assumed to follow the order of 'assays' (if specified) or object's assays} \item{slot}{(Deprecated) See \code{layer}} \item{verbose}{Print messages and show progress bar} \item{assays}{Which assays to use. Default is all assays} \item{return.seurat}{Whether to return the data as a Seurat object. Default is FALSE} \item{group.by}{Categories for grouping (e.g, "ident", "replicate", "celltype"); "ident" by default} \item{add.ident}{(Deprecated) See group.by} \item{method}{The method used for calculating pseudobulk expression; one of: "average" or "aggregate"} \item{normalization.method}{Method for normalization, see \code{\link{NormalizeData}}} \item{scale.factor}{Scale factor for normalization, see \code{\link{NormalizeData}}} \item{margin}{Margin to perform CLR normalization, see \code{\link{NormalizeData}}} } \value{ Returns object after normalization Returns a matrix with genes as rows, identity classes as columns. If return.seurat is TRUE, returns an object of class \code{\link{Seurat}}. } \description{ Normalize the count data present in a given assay. Returns a representative expression value for each identity class } \concept{utilities} Seurat/man/IntegrationAnchorSet-class.Rd0000644000176200001440000000062614731364135017767 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{IntegrationAnchorSet-class} \alias{IntegrationAnchorSet-class} \alias{IntegrationAnchorSet} \title{The IntegrationAnchorSet Class} \description{ Inherits from the Anchorset class. Implemented mainly for method dispatch purposes. See \code{\link{AnchorSet}} for slot details. } \concept{objects} Seurat/man/SketchData.Rd0000644000176200001440000000345214743751115014606 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sketching.R \name{SketchData} \alias{SketchData} \title{Sketch Data} \usage{ SketchData( object, assay = NULL, ncells = 5000L, sketched.assay = "sketch", method = c("LeverageScore", "Uniform"), var.name = "leverage.score", over.write = FALSE, seed = 123L, cast = "dgCMatrix", verbose = TRUE, features = NULL, ... ) } \arguments{ \item{object}{A Seurat object.} \item{assay}{Assay name. Default is NULL, in which case the default assay of the object is used.} \item{ncells}{A positive integer or a named vector/list specifying the number of cells to sample per layer. If a single integer is provided, the same number of cells will be sampled from each layer. Default is 5000.} \item{sketched.assay}{Sketched assay name. A sketch assay is created or overwrite with the sketch data. Default is 'sketch'.} \item{method}{Sketching method to use. Can be 'LeverageScore' or 'Uniform'. Default is 'LeverageScore'.} \item{var.name}{A metadata column name to store the leverage scores. Default is 'leverage.score'.} \item{over.write}{whether to overwrite existing column in the metadata. Default is FALSE.} \item{seed}{A positive integer for the seed of the random number generator. Default is 123.} \item{cast}{The type to cast the resulting assay to. Default is 'dgCMatrix'.} \item{verbose}{Print progress and diagnostic messages} \item{features}{A character vector of feature names to include in the sketched assay.} \item{...}{Arguments passed to other methods} } \value{ A Seurat object with the sketched data added as a new assay. } \description{ This function uses sketching methods to downsample high-dimensional single-cell RNA expression data, which can help with scalability for large datasets. } \concept{sketching} Seurat/man/ProjectData.Rd0000644000176200001440000000365714731364135015001 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sketching.R \name{ProjectData} \alias{ProjectData} \title{Project full data to the sketch assay} \usage{ ProjectData( object, assay = "RNA", sketched.assay = "sketch", sketched.reduction, full.reduction, dims, normalization.method = c("LogNormalize", "SCT"), refdata = NULL, k.weight = 50, umap.model = NULL, recompute.neighbors = FALSE, recompute.weights = FALSE, verbose = TRUE ) } \arguments{ \item{object}{A Seurat object.} \item{assay}{Assay name for the full data. Default is 'RNA'.} \item{sketched.assay}{Sketched assay name to project onto. Default is 'sketch'.} \item{sketched.reduction}{Dimensional reduction results of the sketched assay to project onto.} \item{full.reduction}{Dimensional reduction name for the projected full dataset.} \item{dims}{Dimensions to include in the projection.} \item{normalization.method}{Normalization method to use. Can be 'LogNormalize' or 'SCT'. Default is 'LogNormalize'.} \item{refdata}{An optional list for label transfer from sketch to full data. Default is NULL. Similar to refdata in `MapQuery`} \item{k.weight}{Number of neighbors to consider when weighting labels for transfer. Default is 50.} \item{umap.model}{An optional pre-computed UMAP model. Default is NULL.} \item{recompute.neighbors}{Whether to recompute the neighbors for label transfer. Default is FALSE.} \item{recompute.weights}{Whether to recompute the weights for label transfer. Default is FALSE.} \item{verbose}{Print progress and diagnostic messages.} } \value{ A Seurat object with the full data projected onto the sketched dimensional reduction results. The projected data are stored in the specified full reduction. } \description{ This function allows projection of high-dimensional single-cell RNA expression data from a full dataset onto the lower-dimensional embedding of the sketch of the dataset. } \concept{sketching} Seurat/man/MixingMetric.Rd0000644000176200001440000000227514731364134015172 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{MixingMetric} \alias{MixingMetric} \title{Calculates a mixing metric} \usage{ MixingMetric( object, grouping.var, reduction = "pca", dims = 1:2, k = 5, max.k = 300, eps = 0, verbose = TRUE ) } \arguments{ \item{object}{Seurat object} \item{grouping.var}{Grouping variable for dataset} \item{reduction}{Which dimensionally reduced space to use} \item{dims}{Dimensions to use} \item{k}{Neighbor number to examine per group} \item{max.k}{Maximum size of local neighborhood to compute} \item{eps}{Error bound on the neighbor finding algorithm (from RANN)} \item{verbose}{Displays progress bar} } \value{ Returns a vector of values of the mixing metric for each cell } \description{ Here we compute a measure of how well mixed a composite dataset is. To compute, we first examine the local neighborhood for each cell (looking at max.k neighbors) and determine for each group (could be the dataset after integration) the k nearest neighbor and what rank that neighbor was in the overall neighborhood. We then take the median across all groups as the mixing metric per cell. } \concept{integration} Seurat/man/as.Seurat.Rd0000644000176200001440000000241014731364135014430 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{as.Seurat.CellDataSet} \alias{as.Seurat.CellDataSet} \alias{as.Seurat.SingleCellExperiment} \title{Convert objects to \code{Seurat} objects} \usage{ \method{as.Seurat}{CellDataSet}(x, slot = "counts", assay = "RNA", verbose = TRUE, ...) \method{as.Seurat}{SingleCellExperiment}( x, counts = "counts", data = "logcounts", assay = NULL, project = "SingleCellExperiment", ... ) } \arguments{ \item{x}{An object to convert to class \code{Seurat}} \item{slot}{Slot to store expression data as} \item{assay}{Name of assays to convert; set to \code{NULL} for all assays to be converted} \item{verbose}{Show progress updates} \item{...}{Arguments passed to other methods} \item{counts}{name of the SingleCellExperiment assay to store as \code{counts}; set to \code{NULL} if only normalized data are present} \item{data}{name of the SingleCellExperiment assay to slot as \code{data}. Set to NULL if only counts are present} \item{project}{Project name for new Seurat object} } \value{ A \code{Seurat} object generated from \code{x} } \description{ Convert objects to \code{Seurat} objects } \seealso{ \code{\link[SeuratObject:as.Seurat]{SeuratObject::as.Seurat}} } \concept{objects} Seurat/man/Radius.Rd0000644000176200001440000000141014744456127014020 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{Radius.SlideSeq} \alias{Radius.SlideSeq} \alias{Radius.STARmap} \alias{Radius.VisiumV1} \alias{Radius.VisiumV2} \title{Get Spot Radius} \usage{ \method{Radius}{SlideSeq}(object, ...) \method{Radius}{STARmap}(object, ...) \method{Radius}{VisiumV1}(object, scale = "lowres", ...) \method{Radius}{VisiumV1}(object, scale = "lowres", ...) } \arguments{ \item{object}{An image object} \item{...}{Arguments passed to other methods} \item{scale}{A factor to scale the radius by; one of: "hires", "lowres", or \code{NULL} for the unscaled value.} } \description{ Get Spot Radius } \seealso{ \code{\link[SeuratObject:Radius]{SeuratObject::Radius}} } \concept{objects} \concept{spatial} Seurat/man/Seurat-package.Rd0000644000176200001440000001123714731364134015425 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/zzz.R \docType{package} \name{Seurat-package} \alias{Seurat} \alias{Seurat-package} \title{Seurat: Tools for Single Cell Genomics} \description{ A toolkit for quality control, analysis, and exploration of single cell RNA sequencing data. 'Seurat' aims to enable users to identify and interpret sources of heterogeneity from single cell transcriptomic measurements, and to integrate diverse types of single cell data. See Satija R, Farrell J, Gennert D, et al (2015) \doi{10.1038/nbt.3192}, Macosko E, Basu A, Satija R, et al (2015) \doi{10.1016/j.cell.2015.05.002}, Stuart T, Butler A, et al (2019) \doi{10.1016/j.cell.2019.05.031}, and Hao, Hao, et al (2020) \doi{10.1101/2020.10.12.335331} for more details. } \section{Package options}{ Seurat uses the following [options()] to configure behaviour: \describe{ \item{\code{Seurat.memsafe}}{global option to call gc() after many operations. This can be helpful in cleaning up the memory status of the R session and prevent use of swap space. However, it does add to the computational overhead and setting to FALSE can speed things up if you're working in an environment where RAM availability is not a concern.} \item{\code{Seurat.warn.umap.uwot}}{Show warning about the default backend for \code{\link{RunUMAP}} changing from Python UMAP via reticulate to UWOT} \item{\code{Seurat.checkdots}}{For functions that have ... as a parameter, this controls the behavior when an item isn't used. Can be one of warn, stop, or silent.} \item{\code{Seurat.limma.wilcox.msg}}{{Show message about more efficient Wilcoxon Rank Sum test available via the limma package}} \item{\code{Seurat.Rfast2.msg}}{{Show message about more efficient Moran's I function available via the Rfast2 package}} \item{\code{Seurat.warn.vlnplot.split}}{Show message about changes to default behavior of split/multi violin plots} } } \seealso{ Useful links: \itemize{ \item \url{https://satijalab.org/seurat} \item \url{https://github.com/satijalab/seurat} \item Report bugs at \url{https://github.com/satijalab/seurat/issues} } } \author{ \strong{Maintainer}: Rahul Satija \email{seurat@nygenome.org} (\href{https://orcid.org/0000-0001-9448-8833}{ORCID}) Other contributors: \itemize{ \item Andrew Butler \email{abutler@nygenome.org} (\href{https://orcid.org/0000-0003-3608-0463}{ORCID}) [contributor] \item Saket Choudhary \email{schoudhary@nygenome.org} (\href{https://orcid.org/0000-0001-5202-7633}{ORCID}) [contributor] \item David Collins \email{dcollins@nygenome.org} (\href{https://orcid.org/0000-0001-9243-7821}{ORCID}) [contributor] \item Charlotte Darby \email{cdarby@nygenome.org} (\href{https://orcid.org/0000-0003-2195-5300}{ORCID}) [contributor] \item Jeff Farrell \email{jfarrell@g.harvard.edu} [contributor] \item Isabella Grabski \email{igrabski@nygenome.org} (\href{https://orcid.org/0000-0002-0616-5469}{ORCID}) [contributor] \item Christoph Hafemeister \email{chafemeister@nygenome.org} (\href{https://orcid.org/0000-0001-6365-8254}{ORCID}) [contributor] \item Yuhan Hao \email{yhao@nygenome.org} (\href{https://orcid.org/0000-0002-1810-0822}{ORCID}) [contributor] \item Austin Hartman \email{ahartman@nygenome.org} (\href{https://orcid.org/0000-0001-7278-1852}{ORCID}) [contributor] \item Paul Hoffman \email{hoff0792@umn.edu} (\href{https://orcid.org/0000-0002-7693-8957}{ORCID}) [contributor] \item Jaison Jain \email{jjain@nygenome.org} (\href{https://orcid.org/0000-0002-9478-5018}{ORCID}) [contributor] \item Longda Jiang \email{ljiang@nygenome.org} (\href{https://orcid.org/0000-0003-4964-6497}{ORCID}) [contributor] \item Madeline Kowalski \email{mkowalski@nygenome.org} (\href{https://orcid.org/0000-0002-5655-7620}{ORCID}) [contributor] \item Skylar Li \email{sli@nygenome.org} [contributor] \item Gesmira Molla \email{gmolla@nygenome.org} (\href{https://orcid.org/0000-0002-8628-5056}{ORCID}) [contributor] \item Efthymia Papalexi \email{epapalexi@nygenome.org} (\href{https://orcid.org/0000-0001-5898-694X}{ORCID}) [contributor] \item Patrick Roelli \email{proelli@nygenome.org} [contributor] \item Karthik Shekhar \email{kshekhar@berkeley.edu} [contributor] \item Avi Srivastava \email{asrivastava@nygenome.org} (\href{https://orcid.org/0000-0001-9798-2079}{ORCID}) [contributor] \item Tim Stuart \email{tstuart@nygenome.org} (\href{https://orcid.org/0000-0002-3044-0897}{ORCID}) [contributor] \item Kristof Torkenczy (\href{https://orcid.org/0000-0002-4869-7957}{ORCID}) [contributor] \item Shiwei Zheng \email{szheng@nygenome.org} (\href{https://orcid.org/0000-0001-6682-6743}{ORCID}) [contributor] \item Satija Lab and Collaborators [funder] } } Seurat/man/ISpatialFeaturePlot.Rd0000644000176200001440000000202714744456127016457 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{ISpatialFeaturePlot} \alias{ISpatialFeaturePlot} \title{Visualize features spatially and interactively} \usage{ ISpatialFeaturePlot( object, feature, image = NULL, image.scale = "lowres", slot = "data", alpha = c(0.1, 1) ) } \arguments{ \item{object}{A Seurat object} \item{feature}{Feature to visualize} \item{image}{Name of the image to use in the plot} \item{image.scale}{Choose the scale factor ("lowres"/"hires") to apply in order to matchthe plot with the specified `image` - defaults to "lowres"} \item{slot}{If plotting a feature, which data slot to pull from (counts, data, or scale.data)} \item{alpha}{Controls opacity of spots. Provide as a vector specifying the min and max for SpatialFeaturePlot. For SpatialDimPlot, provide a single alpha value for each plot.} } \value{ Returns final plot as a ggplot object } \description{ Visualize features spatially and interactively } \concept{spatial} \concept{visualization} Seurat/man/RunLeiden.Rd0000644000176200001440000000274014744456127014465 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clustering.R \name{RunLeiden} \alias{RunLeiden} \title{Run Leiden clustering algorithm} \usage{ RunLeiden( object, method = deprecated(), partition.type = c("RBConfigurationVertexPartition", "ModularityVertexPartition", "RBERVertexPartition", "CPMVertexPartition", "MutableVertexPartition", "SignificanceVertexPartition", "SurpriseVertexPartition"), initial.membership = NULL, node.sizes = NULL, resolution.parameter = 1, random.seed = 1, n.iter = 10 ) } \arguments{ \item{object}{An adjacency matrix or adjacency list.} \item{method}{DEPRECATED.} \item{partition.type}{Type of partition to use for Leiden algorithm. Defaults to "RBConfigurationVertexPartition", see https://cran.rstudio.com/web/packages/leidenbase/leidenbase.pdf for more options.} \item{initial.membership}{Passed to the `initial_membership` parameter of `leidenbase::leiden_find_partition`.} \item{node.sizes}{Passed to the `node_sizes` parameter of `leidenbase::leiden_find_partition`.} \item{resolution.parameter}{A parameter controlling the coarseness of the clusters for Leiden algorithm. Higher values lead to more clusters. (defaults to 1.0 for partition types that accept a resolution parameter)} \item{random.seed}{Seed of the random number generator, must be greater than 0.} \item{n.iter}{Maximal number of iterations per random start} } \description{ Returns a vector of partition indices. } \concept{clustering} Seurat/man/RPCAIntegration.Rd0000644000176200001440000001041714744463014015522 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration5.R \name{RPCAIntegration} \alias{RPCAIntegration} \title{Seurat-RPCA Integration} \usage{ RPCAIntegration( object = NULL, assay = NULL, layers = NULL, orig = NULL, new.reduction = "integrated.dr", reference = NULL, features = NULL, normalization.method = c("LogNormalize", "SCT"), dims = 1:30, k.filter = NA, scale.layer = "scale.data", dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) } \arguments{ \item{object}{A \code{Seurat} object} \item{assay}{Name of \code{Assay} in the \code{Seurat} object} \item{layers}{Names of layers in \code{assay}} \item{orig}{A \link[SeuratObject]{DimReduc} to correct} \item{new.reduction}{Name of new integrated dimensional reduction} \item{reference}{A reference \code{Seurat} object} \item{features}{A vector of features to use for integration} \item{normalization.method}{Name of normalization method used: LogNormalize or SCT} \item{dims}{Dimensions of dimensional reduction to use for integration} \item{k.filter}{Number of anchors to filter} \item{scale.layer}{Name of scaled layer in \code{Assay}} \item{dims.to.integrate}{Number of dimensions to return integrated values for} \item{k.weight}{Number of neighbors to consider when weighting anchors} \item{weight.reduction}{Dimension reduction to use when calculating anchor weights. This can be one of: \itemize{ \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, specifying the object to use for each object in the integration} \item{NULL, in which case the full corrected space is used for computing anchor weights.} }} \item{sd.weight}{Controls the bandwidth of the Gaussian kernel for weighting} \item{sample.tree}{Specify the order of integration. Order of integration should be encoded in a matrix, where each row represents one of the pairwise integration steps. Negative numbers specify a dataset, positive numbers specify the integration results from a given row (the format of the merge matrix included in the \code{\link{hclust}} function output). For example: \code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives: \if{html}{\out{
}}\preformatted{ [,1] [,2] [1,] -2 -3 [2,] 1 -1 }\if{html}{\out{
}} Which would cause dataset 2 and 3 to be integrated first, then the resulting object integrated with dataset 1. If NULL, the sample tree will be computed automatically.} \item{preserve.order}{Do not reorder objects based on size for each pairwise integration.} \item{verbose}{Print progress} \item{...}{Arguments passed on to \code{FindIntegrationAnchors}} } \description{ Seurat-RPCA Integration } \examples{ \dontrun{ # Preprocessing obj <- SeuratData::LoadData("pbmcsca") obj[["RNA"]] <- split(obj[["RNA"]], f = obj$Method) obj <- NormalizeData(obj) obj <- FindVariableFeatures(obj) obj <- ScaleData(obj) obj <- RunPCA(obj) # After preprocessing, we run integration obj <- IntegrateLayers(object = obj, method = RPCAIntegration, orig.reduction = "pca", new.reduction = 'integrated.rpca', verbose = FALSE) # Reference-based Integration # Here, we use the first layer as a reference for integraion # Thus, we only identify anchors between the reference and the rest of the datasets, # saving computational resources obj <- IntegrateLayers(object = obj, method = RPCAIntegration, orig.reduction = "pca", new.reduction = 'integrated.rpca', reference = 1, verbose = FALSE) # Modifying parameters # We can also specify parameters such as `k.anchor` to increase the strength of # integration obj <- IntegrateLayers(object = obj, method = RPCAIntegration, orig.reduction = "pca", new.reduction = 'integrated.rpca', k.anchor = 20, verbose = FALSE) # Integrating SCTransformed data obj <- SCTransform(object = obj) obj <- IntegrateLayers(object = obj, method = RPCAIntegration, orig.reduction = "pca", new.reduction = 'integrated.rpca', assay = "SCT", verbose = FALSE) } } \concept{utilities} Seurat/man/CellScatter.Rd0000644000176200001440000000245714731364134015002 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{CellScatter} \alias{CellScatter} \alias{CellPlot} \title{Cell-cell scatter plot} \usage{ CellScatter( object, cell1, cell2, features = NULL, highlight = NULL, cols = NULL, pt.size = 1, smooth = FALSE, raster = NULL, raster.dpi = c(512, 512) ) } \arguments{ \item{object}{Seurat object} \item{cell1}{Cell 1 name} \item{cell2}{Cell 2 name} \item{features}{Features to plot (default, all features)} \item{highlight}{Features to highlight} \item{cols}{Colors to use for identity class plotting.} \item{pt.size}{Size of the points on the plot} \item{smooth}{Smooth the graph (similar to smoothScatter)} \item{raster}{Convert points to raster format, default is \code{NULL} which will automatically use raster if the number of points plotted is greater than 100,000} \item{raster.dpi}{Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512).} } \value{ A ggplot object } \description{ Creates a plot of scatter plot of features across two single cells. Pearson correlation between the two cells is displayed above the plot. } \examples{ data("pbmc_small") CellScatter(object = pbmc_small, cell1 = 'ATAGGAGAAACAGA', cell2 = 'CATCAGGATGCACA') } \concept{visualization} Seurat/man/VST.Rd0000644000176200001440000000336414731364134013247 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing5.R \name{VST} \alias{VST} \alias{VST.default} \alias{VST.IterableMatrix} \alias{VST.dgCMatrix} \alias{VST.matrix} \title{Variance Stabilizing Transformation} \usage{ VST(data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, ...) \method{VST}{default}(data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, ...) \method{VST}{IterableMatrix}( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, verbose = TRUE, ... ) \method{VST}{dgCMatrix}( data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, verbose = TRUE, ... ) \method{VST}{matrix}(data, margin = 1L, nselect = 2000L, span = 0.3, clip = NULL, ...) } \arguments{ \item{data}{A matrix-like object} \item{margin}{Unused} \item{nselect}{Number of of features to select} \item{span}{the parameter \eqn{\alpha} which controls the degree of smoothing.} \item{clip}{Upper bound for values post-standardization; defaults to the square root of the number of cells} \item{...}{Arguments passed to other methods} \item{verbose}{...} } \value{ A data frame with the following columns: \itemize{ \item \dQuote{\code{mean}}: ... \item \dQuote{\code{variance}}: ... \item \dQuote{\code{variance.expected}}: ... \item \dQuote{\code{variance.standardized}}: ... \item \dQuote{\code{variable}}: \code{TRUE} if the feature selected as variable, otherwise \code{FALSE} \item \dQuote{\code{rank}}: If the feature is selected as variable, then how it compares to other variable features with lower ranks as more variable; otherwise, \code{NA} } } \description{ Apply variance stabilizing transformation for selection of variable features } \keyword{internal} Seurat/man/ScaleFactors.Rd0000644000176200001440000000165114731364134015141 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/objects.R \name{ScaleFactors} \alias{ScaleFactors} \alias{scalefactors} \alias{ScaleFactors.VisiumV1} \alias{ScaleFactors.VisiumV2} \title{Get image scale factors} \usage{ ScaleFactors(object, ...) scalefactors(spot, fiducial, hires, lowres) \method{ScaleFactors}{VisiumV1}(object, ...) \method{ScaleFactors}{VisiumV2}(object, ...) } \arguments{ \item{object}{An object to get scale factors from} \item{...}{Arguments passed to other methods} \item{spot}{Spot full resolution scale factor} \item{fiducial}{Fiducial full resolution scale factor} \item{hires}{High resolutoin scale factor} \item{lowres}{Low resolution scale factor} } \value{ An object of class \code{scalefactors} } \description{ Get image scale factors } \note{ \code{scalefactors} objects can be created with \code{scalefactors()} } \concept{objects} \concept{spatial} Seurat/man/IntegrateEmbeddings.Rd0000644000176200001440000001032314744463014016471 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/integration.R \name{IntegrateEmbeddings} \alias{IntegrateEmbeddings} \alias{IntegrateEmbeddings.IntegrationAnchorSet} \alias{IntegrateEmbeddings.TransferAnchorSet} \title{Integrate low dimensional embeddings} \usage{ IntegrateEmbeddings(anchorset, ...) \method{IntegrateEmbeddings}{IntegrationAnchorSet}( anchorset, new.reduction.name = "integrated_dr", reductions = NULL, dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, sd.weight = 1, sample.tree = NULL, preserve.order = FALSE, verbose = TRUE, ... ) \method{IntegrateEmbeddings}{TransferAnchorSet}( anchorset, reference, query, query.assay = NULL, new.reduction.name = "integrated_dr", reductions = "pcaproject", dims.to.integrate = NULL, k.weight = 100, weight.reduction = NULL, reuse.weights.matrix = TRUE, sd.weight = 1, preserve.order = FALSE, verbose = TRUE, ... ) } \arguments{ \item{anchorset}{An AnchorSet object} \item{...}{Reserved for internal use} \item{new.reduction.name}{Name for new integrated dimensional reduction.} \item{reductions}{Name of reductions to be integrated. For a TransferAnchorSet, this should be the name of a reduction present in the anchorset object (for example, "pcaproject"). For an IntegrationAnchorSet, this should be a \code{\link[SeuratObject]{DimReduc}} object containing all cells present in the anchorset object.} \item{dims.to.integrate}{Number of dimensions to return integrated values for} \item{k.weight}{Number of neighbors to consider when weighting anchors} \item{weight.reduction}{Dimension reduction to use when calculating anchor weights. This can be one of: \itemize{ \item{A string, specifying the name of a dimension reduction present in all objects to be integrated} \item{A vector of strings, specifying the name of a dimension reduction to use for each object to be integrated} \item{A vector of \code{\link[SeuratObject]{DimReduc}} objects, specifying the object to use for each object in the integration} \item{NULL, in which case the full corrected space is used for computing anchor weights.} }} \item{sd.weight}{Controls the bandwidth of the Gaussian kernel for weighting} \item{sample.tree}{Specify the order of integration. Order of integration should be encoded in a matrix, where each row represents one of the pairwise integration steps. Negative numbers specify a dataset, positive numbers specify the integration results from a given row (the format of the merge matrix included in the \code{\link{hclust}} function output). For example: \code{matrix(c(-2, 1, -3, -1), ncol = 2)} gives: \if{html}{\out{
}}\preformatted{ [,1] [,2] [1,] -2 -3 [2,] 1 -1 }\if{html}{\out{
}} Which would cause dataset 2 and 3 to be integrated first, then the resulting object integrated with dataset 1. If NULL, the sample tree will be computed automatically.} \item{preserve.order}{Do not reorder objects based on size for each pairwise integration.} \item{verbose}{Print progress bars and output} \item{reference}{Reference object used in anchorset construction} \item{query}{Query object used in anchorset construction} \item{query.assay}{Name of the Assay to use from query} \item{reuse.weights.matrix}{Can be used in conjunction with the store.weights parameter in TransferData to reuse a precomputed weights matrix.} } \value{ When called on a TransferAnchorSet (from FindTransferAnchors), this will return the query object with the integrated embeddings stored in a new reduction. When called on an IntegrationAnchorSet (from IntegrateData), this will return a merged object with the integrated reduction stored. } \description{ Perform dataset integration using a pre-computed Anchorset of specified low dimensional representations. } \details{ The main steps of this procedure are identical to \code{\link{IntegrateData}} with one key distinction. When computing the weights matrix, the distance calculations are performed in the full space of integrated embeddings when integrating more than two datasets, as opposed to a reduced PCA space which is the default behavior in \code{\link{IntegrateData}}. } \concept{integration} Seurat/man/DoHeatmap.Rd0000644000176200001440000000474014731364134014434 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{DoHeatmap} \alias{DoHeatmap} \title{Feature expression heatmap} \usage{ DoHeatmap( object, features = NULL, cells = NULL, group.by = "ident", group.bar = TRUE, group.colors = NULL, disp.min = -2.5, disp.max = NULL, slot = "scale.data", assay = NULL, label = TRUE, size = 5.5, hjust = 0, vjust = 0, angle = 45, raster = TRUE, draw.lines = TRUE, lines.width = NULL, group.bar.height = 0.02, combine = TRUE ) } \arguments{ \item{object}{Seurat object} \item{features}{A vector of features to plot, defaults to \code{VariableFeatures(object = object)}} \item{cells}{A vector of cells to plot} \item{group.by}{A vector of variables to group cells by; pass 'ident' to group by cell identity classes} \item{group.bar}{Add a color bar showing group status for cells} \item{group.colors}{Colors to use for the color bar} \item{disp.min}{Minimum display value (all values below are clipped)} \item{disp.max}{Maximum display value (all values above are clipped); defaults to 2.5 if \code{slot} is 'scale.data', 6 otherwise} \item{slot}{Data slot to use, choose from 'raw.data', 'data', or 'scale.data'} \item{assay}{Assay to pull from} \item{label}{Label the cell identies above the color bar} \item{size}{Size of text above color bar} \item{hjust}{Horizontal justification of text above color bar} \item{vjust}{Vertical justification of text above color bar} \item{angle}{Angle of text above color bar} \item{raster}{If true, plot with geom_raster, else use geom_tile. geom_raster may look blurry on some viewing applications such as Preview due to how the raster is interpolated. Set this to FALSE if you are encountering that issue (note that plots may take longer to produce/render).} \item{draw.lines}{Include white lines to separate the groups} \item{lines.width}{Integer number to adjust the width of the separating white lines. Corresponds to the number of "cells" between each group.} \item{group.bar.height}{Scale the height of the color bar} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} } \value{ A \code{\link[patchwork]{patchwork}ed} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ Draws a heatmap of single cell feature expression. } \examples{ data("pbmc_small") DoHeatmap(object = pbmc_small) } \concept{visualization} Seurat/man/as.CellDataSet.Rd0000644000176200001440000000116014731364133015311 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/objects.R \name{as.CellDataSet} \alias{as.CellDataSet} \alias{as.CellDataSet.Seurat} \title{Convert objects to CellDataSet objects} \usage{ as.CellDataSet(x, ...) \method{as.CellDataSet}{Seurat}(x, assay = NULL, reduction = NULL, ...) } \arguments{ \item{x}{An object to convert to class \code{CellDataSet}} \item{...}{Arguments passed to other methods} \item{assay}{Assay to convert} \item{reduction}{Name of DimReduc to set to main reducedDim in cds} } \description{ Convert objects to CellDataSet objects } \concept{objects} Seurat/man/GetIntegrationData.Rd0000644000176200001440000000100014731364135016272 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{GetIntegrationData} \alias{GetIntegrationData} \title{Get integration data} \usage{ GetIntegrationData(object, integration.name, slot) } \arguments{ \item{object}{Seurat object} \item{integration.name}{Name of integration object} \item{slot}{Which slot in integration object to get} } \value{ Returns data from the requested slot within the integrated object } \description{ Get integration data } \concept{objects} Seurat/man/MetaFeature.Rd0000644000176200001440000000176014731364135014774 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{MetaFeature} \alias{MetaFeature} \title{Aggregate expression of multiple features into a single feature} \usage{ MetaFeature( object, features, meta.name = "metafeature", cells = NULL, assay = NULL, slot = "data" ) } \arguments{ \item{object}{A Seurat object} \item{features}{List of features to aggregate} \item{meta.name}{Name of column in metadata to store metafeature} \item{cells}{List of cells to use (default all cells)} \item{assay}{Which assay to use} \item{slot}{Which slot to take data from (default data)} } \value{ Returns a \code{Seurat} object with metafeature stored in objct metadata } \description{ Calculates relative contribution of each feature to each cell for given set of features. } \examples{ data("pbmc_small") pbmc_small <- MetaFeature( object = pbmc_small, features = c("LTB", "EAF2"), meta.name = 'var.aggregate' ) head(pbmc_small[[]]) } \concept{utilities} Seurat/man/subset.AnchorSet.Rd0000644000176200001440000000265714731364135015772 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{subset.AnchorSet} \alias{subset.AnchorSet} \title{Subset an AnchorSet object} \usage{ \method{subset}{AnchorSet}( x, score.threshold = NULL, disallowed.dataset.pairs = NULL, dataset.matrix = NULL, group.by = NULL, disallowed.ident.pairs = NULL, ident.matrix = NULL, ... ) } \arguments{ \item{x}{object to be subsetted.} \item{score.threshold}{Only anchor pairs with scores greater than this value are retained.} \item{disallowed.dataset.pairs}{Remove any anchors formed between the provided pairs. E.g. \code{list(c(1, 5), c(1, 2))} filters out any anchors between datasets 1 and 5 and datasets 1 and 2.} \item{dataset.matrix}{Provide a binary matrix specifying whether a dataset pair is allowable (1) or not (0). Should be a dataset x dataset matrix.} \item{group.by}{Grouping variable to determine allowable ident pairs} \item{disallowed.ident.pairs}{Remove any anchors formed between provided ident pairs. E.g. \code{list(c("CD4", "CD8"), c("B-cell", "T-cell"))}} \item{ident.matrix}{Provide a binary matrix specifying whether an ident pair is allowable (1) or not (0). Should be an ident x ident symmetric matrix} \item{...}{further arguments to be passed to or from other methods.} } \value{ Returns an \code{\link{AnchorSet}} object with specified anchors filtered out } \description{ Subset an AnchorSet object } \concept{objects} Seurat/man/CustomDistance.Rd0000644000176200001440000000147114731364135015516 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{CustomDistance} \alias{CustomDistance} \title{Run a custom distance function on an input data matrix} \usage{ CustomDistance(my.mat, my.function, ...) } \arguments{ \item{my.mat}{A matrix to calculate distance on} \item{my.function}{A function to calculate distance} \item{...}{Extra parameters to my.function} } \value{ A distance matrix } \description{ Run a custom distance function on an input data matrix } \examples{ data("pbmc_small") # Define custom distance matrix manhattan.distance <- function(x, y) return(sum(abs(x-y))) input.data <- GetAssayData(pbmc_small, assay.type = "RNA", slot = "scale.data") cell.manhattan.dist <- CustomDistance(input.data, manhattan.distance) } \author{ Jean Fan } \concept{utilities} Seurat/man/PlotPerturbScore.Rd0000644000176200001440000000272714731364135016054 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{PlotPerturbScore} \alias{PlotPerturbScore} \title{Function to plot perturbation score distributions.} \usage{ PlotPerturbScore( object, target.gene.class = "gene", target.gene.ident = NULL, mixscape.class = "mixscape_class", col = "orange2", split.by = NULL, before.mixscape = FALSE, prtb.type = "KO" ) } \arguments{ \item{object}{An object of class Seurat.} \item{target.gene.class}{meta data column specifying all target gene names in the experiment.} \item{target.gene.ident}{Target gene name to visualize perturbation scores for.} \item{mixscape.class}{meta data column specifying mixscape classifications.} \item{col}{Specify color of target gene class or knockout cell class. For control non-targeting and non-perturbed cells, colors are set to different shades of grey.} \item{split.by}{For datasets with more than one cell type. Set equal TRUE to visualize perturbation scores for each cell type separately.} \item{before.mixscape}{Option to split densities based on mixscape classification (default) or original target gene classification. Default is set to NULL and plots cells by original class ID.} \item{prtb.type}{specify type of CRISPR perturbation expected for labeling mixscape classifications. Default is KO.} } \value{ A ggplot object. } \description{ Density plots to visualize perturbation scores calculated from RunMixscape function. } \concept{mixscape} Seurat/man/LinkedPlots.Rd0000644000176200001440000000400014744456127015017 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{LinkedPlots} \alias{LinkedPlots} \alias{LinkedDimPlot} \alias{LinkedPlot} \alias{LinkedFeaturePlot} \title{Visualize spatial and clustering (dimensional reduction) data in a linked, interactive framework} \usage{ LinkedDimPlot( object, dims = 1:2, reduction = NULL, image = NULL, image.scale = "lowres", group.by = NULL, alpha = c(0.1, 1), combine = TRUE ) LinkedFeaturePlot( object, feature, dims = 1:2, reduction = NULL, image = NULL, image.scale = "lowres", slot = "data", alpha = c(0.1, 1), combine = TRUE ) } \arguments{ \item{object}{A Seurat object} \item{dims}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} \item{reduction}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} \item{image}{Name of the image to use in the plot} \item{image.scale}{Choose the scale factor ("lowres"/"hires") to apply in order to matchthe plot with the specified `image` - defaults to "lowres"} \item{group.by}{Name of meta.data column to group the data by} \item{alpha}{Controls opacity of spots. Provide as a vector specifying the min and max for SpatialFeaturePlot. For SpatialDimPlot, provide a single alpha value for each plot.} \item{combine}{Combine plots into a single gg object; note that if TRUE; themeing will not work when plotting multiple features/groupings} \item{feature}{Feature to visualize} \item{slot}{If plotting a feature, which data slot to pull from (counts, data, or scale.data)} } \value{ Returns final plots. If \code{combine}, plots are stiched together using \code{\link{CombinePlots}}; otherwise, returns a list of ggplot objects } \description{ Visualize spatial and clustering (dimensional reduction) data in a linked, interactive framework } \examples{ \dontrun{ LinkedDimPlot(seurat.object) LinkedFeaturePlot(seurat.object, feature = 'Hpca') } } \concept{spatial} \concept{visualization} Seurat/man/PercentageFeatureSet.Rd0000644000176200001440000000322514731364135016635 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{PercentageFeatureSet} \alias{PercentageFeatureSet} \title{Calculate the percentage of all counts that belong to a given set of features} \usage{ PercentageFeatureSet( object, pattern = NULL, features = NULL, col.name = NULL, assay = NULL ) } \arguments{ \item{object}{A Seurat object} \item{pattern}{A regex pattern to match features against} \item{features}{A defined feature set. If features provided, will ignore the pattern matching} \item{col.name}{Name in meta.data column to assign. If this is not null, returns a Seurat object with the proportion of the feature set stored in metadata.} \item{assay}{Assay to use} } \value{ Returns a vector with the proportion of the feature set or if md.name is set, returns a Seurat object with the proportion of the feature set stored in metadata. } \description{ This function enables you to easily calculate the percentage of all the counts belonging to a subset of the possible features for each cell. This is useful when trying to compute the percentage of transcripts that map to mitochondrial genes for example. The calculation here is simply the column sum of the matrix present in the counts slot for features belonging to the set divided by the column sum for all features times 100. } \examples{ data("pbmc_small") # Calculate the proportion of transcripts mapping to mitochondrial genes # NOTE: The pattern provided works for human gene names. You may need to adjust depending on your # system of interest pbmc_small[["percent.mt"]] <- PercentageFeatureSet(object = pbmc_small, pattern = "^MT-") } \concept{utilities} Seurat/man/CalcPerturbSig.Rd0000644000176200001440000000361114731364135015440 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixscape.R \name{CalcPerturbSig} \alias{CalcPerturbSig} \title{Calculate a perturbation Signature} \usage{ CalcPerturbSig( object, assay = NULL, features = NULL, slot = "data", gd.class = "guide_ID", nt.cell.class = "NT", split.by = NULL, num.neighbors = NULL, reduction = "pca", ndims = 15, new.assay.name = "PRTB", verbose = TRUE ) } \arguments{ \item{object}{An object of class Seurat.} \item{assay}{Name of Assay PRTB signature is being calculated on.} \item{features}{Features to compute PRTB signature for. Defaults to the variable features set in the assay specified.} \item{slot}{Data slot to use for PRTB signature calculation.} \item{gd.class}{Metadata column containing target gene classification.} \item{nt.cell.class}{Non-targeting gRNA cell classification identity.} \item{split.by}{Provide metadata column if multiple biological replicates exist to calculate PRTB signature for every replicate separately.} \item{num.neighbors}{Number of nearest neighbors to consider.} \item{reduction}{Reduction method used to calculate nearest neighbors.} \item{ndims}{Number of dimensions to use from dimensionality reduction method.} \item{new.assay.name}{Name for the new assay.} \item{verbose}{Display progress + messages} } \value{ Returns a Seurat object with a new assay added containing the perturbation signature for all cells in the data slot. } \description{ Function to calculate perturbation signature for pooled CRISPR screen datasets. For each target cell (expressing one target gRNA), we identified 20 cells from the control pool (non-targeting cells) with the most similar mRNA expression profiles. The perturbation signature is calculated by subtracting the averaged mRNA expression profile of the non-targeting neighbors from the mRNA expression profile of the target cell. } \concept{mixscape} Seurat/man/AddAzimuthResults.Rd0000644000176200001440000000126614731364135016207 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{AddAzimuthResults} \alias{AddAzimuthResults} \title{Add Azimuth Results} \usage{ AddAzimuthResults(object = NULL, filename) } \arguments{ \item{object}{A \code{\link[SeuratObject]{Seurat}} object} \item{filename}{Path to Azimuth mapping scores file} } \value{ \code{object} with Azimuth results added } \description{ Add mapping and prediction scores, UMAP embeddings, and imputed assay (if available) from Azimuth to an existing or new \code{\link[SeuratObject]{Seurat}} object } \examples{ \dontrun{ object <- AddAzimuthResults(object, filename = "azimuth_results.Rds") } } \concept{utilities} Seurat/man/Seurat-class.Rd0000644000176200001440000000066414731364133015140 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{Seurat-class} \alias{Seurat-class} \title{The Seurat Class} \description{ The Seurat object is a representation of single-cell expression data for R; for more details, please see the documentation in \code{\link[SeuratObject:Seurat]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:Seurat]{SeuratObject::Seurat-class}} } Seurat/man/RunPCA.Rd0000644000176200001440000000510214731364134013653 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunPCA} \alias{RunPCA} \alias{RunPCA.default} \alias{RunPCA.Assay} \alias{RunPCA.Seurat} \title{Run Principal Component Analysis} \usage{ RunPCA(object, ...) \method{RunPCA}{default}( object, assay = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "PC_", seed.use = 42, approx = TRUE, ... ) \method{RunPCA}{Assay}( object, assay = NULL, features = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.key = "PC_", seed.use = 42, ... ) \method{RunPCA}{Seurat}( object, assay = NULL, features = NULL, npcs = 50, rev.pca = FALSE, weight.by.var = TRUE, verbose = TRUE, ndims.print = 1:5, nfeatures.print = 30, reduction.name = "pca", reduction.key = "PC_", seed.use = 42, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods and IRLBA} \item{assay}{Name of Assay PCA is being run on} \item{npcs}{Total Number of PCs to compute and store (50 by default)} \item{rev.pca}{By default computes the PCA on the cell x gene matrix. Setting to true will compute it on gene x cell matrix.} \item{weight.by.var}{Weight the cell embeddings by the variance of each PC (weights the gene loadings if rev.pca is TRUE)} \item{verbose}{Print the top genes associated with high/low loadings for the PCs} \item{ndims.print}{PCs to print genes for} \item{nfeatures.print}{Number of genes to print for each PC} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names. PC by default} \item{seed.use}{Set a random seed. By default, sets the seed to 42. Setting NULL will not set a seed.} \item{approx}{Use truncated singular value decomposition to approximate PCA} \item{features}{Features to compute PCA on. If features=NULL, PCA will be run using the variable features for the Assay. Note that the features must be present in the scaled data. Any requested features that are not scaled or have 0 variance will be dropped, and the PCA will be run using the remaining features.} \item{reduction.name}{dimensional reduction name, pca by default} } \value{ Returns Seurat object with the PCA calculation stored in the reductions slot } \description{ Run a PCA dimensionality reduction. For details about stored PCA calculation parameters, see \code{PrintPCAParams}. } \concept{dimensional_reduction} Seurat/man/AnchorSet-class.Rd0000644000176200001440000000276314731364135015567 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \docType{class} \name{AnchorSet-class} \alias{AnchorSet-class} \alias{AnchorSet} \title{The AnchorSet Class} \description{ The AnchorSet class is an intermediate data storage class that stores the anchors and other related information needed for performing downstream analyses - namely data integration (\code{\link{IntegrateData}}) and data transfer (\code{\link{TransferData}}). } \section{Slots}{ \describe{ \item{\code{object.list}}{List of objects used to create anchors} \item{\code{reference.cells}}{List of cell names in the reference dataset - needed when performing data transfer.} \item{\code{reference.objects}}{Position of reference object/s in object.list} \item{\code{query.cells}}{List of cell names in the query dataset - needed when performing data transfer} \item{\code{anchors}}{The anchor matrix. This contains the cell indices of both anchor pair cells, the anchor score, and the index of the original dataset in the object.list for cell1 and cell2 of the anchor.} \item{\code{offsets}}{The offsets used to enable cell look up in downstream functions} \item{\code{weight.reduction}}{The weight dimensional reduction used to calculate weight matrix} \item{\code{anchor.features}}{The features used when performing anchor finding.} \item{\code{neighbors}}{List containing Neighbor objects for reuse later (e.g. mapping)} \item{\code{command}}{Store log of parameters that were used} }} \concept{objects} Seurat/man/PolyFeaturePlot.Rd0000644000176200001440000000263714731364134015673 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{PolyFeaturePlot} \alias{PolyFeaturePlot} \title{Polygon FeaturePlot} \usage{ PolyFeaturePlot( object, features, cells = NULL, poly.data = "spatial", ncol = ceiling(x = length(x = features)/2), min.cutoff = 0, max.cutoff = NA, common.scale = TRUE, flip.coords = FALSE ) } \arguments{ \item{object}{Seurat object} \item{features}{Vector of features to plot. Features can come from: \itemize{ \item An \code{Assay} feature (e.g. a gene name - "MS4A1") \item A column name from meta.data (e.g. mitochondrial percentage - "percent.mito") \item A column name from a \code{DimReduc} object corresponding to the cell embedding values (e.g. the PC 1 scores - "PC_1") }} \item{cells}{Vector of cells to plot (default is all cells)} \item{poly.data}{Name of the polygon dataframe in the misc slot} \item{ncol}{Number of columns to split the plot into} \item{min.cutoff, max.cutoff}{Vector of minimum and maximum cutoff values for each feature, may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10')} \item{common.scale}{...} \item{flip.coords}{Flip x and y coordinates} } \value{ Returns a ggplot object } \description{ Plot cells as polygons, rather than single points. Color cells by any value accessible by \code{\link{FetchData}}. } \concept{spatial} \concept{visualization} Seurat/man/DimReduc-class.Rd0000644000176200001440000000070614731364133015366 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{DimReduc-class} \alias{DimReduc-class} \title{The DimReduc Class} \description{ The \code{DimReduc} object stores a dimensionality reduction taken out in Seurat; for more details, please see the documentation in \code{\link[SeuratObject:DimReduc]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:DimReduc]{SeuratObject::DimReduc-class}} } Seurat/man/ExpSD.Rd0000644000176200001440000000066714731364135013562 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{ExpSD} \alias{ExpSD} \title{Calculate the standard deviation of logged values} \usage{ ExpSD(x) } \arguments{ \item{x}{A vector of values} } \value{ Returns the standard deviation in log-space } \description{ Calculate SD of logged values in non-log space (return answer in log-space) } \examples{ ExpSD(x = c(1, 2, 3)) } \concept{utilities} Seurat/man/cc.genes.updated.2019.Rd0000644000176200001440000000237614731364134016301 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{cc.genes.updated.2019} \alias{cc.genes.updated.2019} \title{Cell cycle genes: 2019 update} \format{ A list of two vectors \describe{ \item{s.genes}{Genes associated with S-phase} \item{g2m.genes}{Genes associated with G2M-phase} } } \source{ \url{https://www.science.org/doi/abs/10.1126/science.aad0501} } \usage{ cc.genes.updated.2019 } \description{ A list of genes used in cell-cycle regression, updated with 2019 symbols } \section{Updated symbols}{ The following symbols were updated from \code{\link{cc.genes}} \describe{ \item{s.genes}{ \itemize{ \item \emph{MCM2}: \emph{MCM7} \item \emph{MLF1IP}: \emph{CENPU} \item \emph{RPA2}: \emph{POLR1B} \item \emph{BRIP1}: \emph{MRPL36} } } \item{g2m.genes}{ \itemize{ \item \emph{FAM64A}: \emph{PIMREG} \item \emph{HN1}: \emph{JPT1} } } } } \examples{ \dontrun{ cc.genes.updated.2019 <- cc.genes cc.genes.updated.2019$s.genes <- UpdateSymbolList(symbols = cc.genes.updated.2019$s.genes) cc.genes.updated.2019$g2m.genes <- UpdateSymbolList(symbols = cc.genes.updated.2019$g2m.genes) } } \seealso{ \code{\link{cc.genes}} } \concept{data} \keyword{datasets} Seurat/man/DimPlot.Rd0000644000176200001440000001161014744456127014144 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R, R/convenience.R \name{DimPlot} \alias{DimPlot} \alias{TSNEPlot} \alias{PCAPlot} \alias{ICAPlot} \alias{UMAPPlot} \title{Dimensional reduction plot} \usage{ DimPlot( object, dims = c(1, 2), cells = NULL, cols = NULL, pt.size = NULL, reduction = NULL, group.by = NULL, split.by = NULL, shape.by = NULL, order = NULL, shuffle = FALSE, seed = 1, label = FALSE, label.size = 4, label.color = "black", label.box = FALSE, repel = FALSE, alpha = 1, stroke.size = NULL, cells.highlight = NULL, cols.highlight = "#DE2D26", sizes.highlight = 1, na.value = "grey50", ncol = NULL, combine = TRUE, raster = NULL, raster.dpi = c(512, 512) ) PCAPlot(object, ...) TSNEPlot(object, ...) UMAPPlot(object, ...) } \arguments{ \item{object}{Seurat object} \item{dims}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} \item{cells}{Vector of cells to plot (default is all cells)} \item{cols}{Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. See \code{\link{DiscretePalette}} for details.} \item{pt.size}{Adjust point size for plotting} \item{reduction}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} \item{group.by}{Name of one or more metadata columns to group (color) cells by (for example, orig.ident); pass 'ident' to group by identity class} \item{split.by}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity} \item{shape.by}{If NULL, all points are circles (default). You can specify any cell attribute (that can be pulled with FetchData) allowing for both different colors and different shapes on cells. Only applicable if \code{raster = FALSE}.} \item{order}{Specify the order of plotting for the idents. This can be useful for crowded plots if points of interest are being buried. Provide either a full list of valid idents or a subset to be plotted last (on top)} \item{shuffle}{Whether to randomly shuffle the order of points. This can be useful for crowded plots if points of interest are being buried. (default is FALSE)} \item{seed}{Sets the seed if randomly shuffling the order of points.} \item{label}{Whether to label the clusters} \item{label.size}{Sets size of labels} \item{label.color}{Sets the color of the label text} \item{label.box}{Whether to put a box around the label text (geom_text vs geom_label)} \item{repel}{Repel labels} \item{alpha}{Alpha value for plotting (default is 1)} \item{stroke.size}{Adjust stroke (outline) size of points} \item{cells.highlight}{A list of character or numeric vectors of cells to highlight. If only one group of cells desired, can simply pass a vector instead of a list. If set, colors selected cells to the color(s) in \code{cols.highlight} and other cells black (white if dark.theme = TRUE); will also resize to the size(s) passed to \code{sizes.highlight}} \item{cols.highlight}{A vector of colors to highlight the cells as; will repeat to the length groups in cells.highlight} \item{sizes.highlight}{Size of highlighted cells; will repeat to the length groups in cells.highlight. If \code{sizes.highlight = TRUE} size of all points will be this value.} \item{na.value}{Color value for NA points when using custom scale} \item{ncol}{Number of columns for display when combining plots} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} \item{raster}{Convert points to raster format, default is \code{NULL} which automatically rasterizes if plotting more than 100,000 cells} \item{raster.dpi}{Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512).} \item{...}{Extra parameters passed to \code{DimPlot}} } \value{ A \code{\link[patchwork]{patchwork}ed} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ Graphs the output of a dimensional reduction technique on a 2D scatter plot where each point is a cell and it's positioned based on the cell embeddings determined by the reduction technique. By default, cells are colored by their identity class (can be changed with the group.by parameter). } \note{ For the old \code{do.hover} and \code{do.identify} functionality, please see \code{HoverLocator} and \code{CellSelector}, respectively. } \examples{ data("pbmc_small") DimPlot(object = pbmc_small) DimPlot(object = pbmc_small, split.by = 'letter.idents') } \seealso{ \code{\link{FeaturePlot}} \code{\link{HoverLocator}} \code{\link{CellSelector}} \code{\link{FetchData}} } \concept{convenience} \concept{visualization} Seurat/man/ReadVizgen.Rd0000644000176200001440000001205514731364133014625 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R, R/convenience.R \name{ReadVizgen} \alias{ReadVizgen} \alias{LoadVizgen} \title{Read and Load MERFISH Input from Vizgen} \usage{ ReadVizgen( data.dir, transcripts = NULL, spatial = NULL, molecules = NULL, type = "segmentations", mol.type = "microns", metadata = NULL, filter = NA_character_, z = 3L ) LoadVizgen(data.dir, fov, assay = "Vizgen", z = 3L) } \arguments{ \item{data.dir}{Path to the directory with Vizgen MERFISH files; requires at least one of the following files present: \itemize{ \item \dQuote{\code{cell_by_gene.csv}}: used for reading count matrix \item \dQuote{\code{cell_metadata.csv}}: used for reading cell spatial coordinate matrices \item \dQuote{\code{detected_transcripts.csv}}: used for reading molecule spatial coordinate matrices }} \item{transcripts}{Optional file path for counts matrix; pass \code{NA} to suppress reading counts matrix} \item{spatial}{Optional file path for spatial metadata; pass \code{NA} to suppress reading spatial coordinates. If \code{spatial} is provided and \code{type} is \dQuote{segmentations}, uses \code{dirname(spatial)} instead of \code{data.dir} to find HDF5 files} \item{molecules}{Optional file path for molecule coordinates file; pass \code{NA} to suppress reading spatial molecule information} \item{type}{Type of cell spatial coordinate matrices to read; choose one or more of: \itemize{ \item \dQuote{segmentations}: cell segmentation vertices; requires \href{https://cran.r-project.org/package=hdf5r}{\pkg{hdf5r}} to be installed and requires a directory \dQuote{\code{cell_boundaries}} within \code{data.dir}. Within \dQuote{\code{cell_boundaries}}, there must be one or more HDF5 file named \dQuote{\code{feature_data_##.hdf5}} \item \dQuote{centroids}: cell centroids in micron coordinate space \item \dQuote{boxes}: cell box outlines in micron coordinate space }} \item{mol.type}{Type of molecule spatial coordinate matrices to read; choose one or more of: \itemize{ \item \dQuote{pixels}: molecule coordinates in pixel space \item \dQuote{microns}: molecule coordinates in micron space }} \item{metadata}{Type of available metadata to read; choose zero or more of: \itemize{ \item \dQuote{volume}: estimated cell volume \item \dQuote{fov}: cell's fov }} \item{filter}{A character to filter molecules by, pass \code{NA} to skip molecule filtering} \item{z}{Z-index to load; must be between 0 and 6, inclusive} \item{fov}{Name to store FOV as} \item{assay}{Name to store expression matrix as} } \value{ \code{ReadVizgen}: A list with some combination of the following values: \itemize{ \item \dQuote{\code{transcripts}}: a \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells are columns and features are rows \item \dQuote{\code{segmentations}}: a data frame with cell polygon outlines in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{centroids}}: a data frame with cell centroid coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{boxes}}: a data frame with cell box outlines in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{microns}}: a data frame with molecule micron coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} \item \dQuote{\code{pixels}}: a data frame with molecule pixel coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{gene} \item \dQuote{\code{metadata}}: a data frame with the cell-level metadata requested by \code{metadata} } \code{LoadVizgen}: A \code{\link[SeuratObject]{Seurat}} object } \description{ Read and load in MERFISH data from Vizgen-formatted files } \note{ This function requires the \href{https://cran.r-project.org/package=data.table}{\pkg{data.table}} package to be installed } \section{Progress Updates with \pkg{progressr}}{ This function uses \href{https://cran.r-project.org/package=progressr}{\pkg{progressr}} to render status updates and progress bars. To enable progress updates, wrap the function call in \code{\link[progressr]{with_progress}} or run \code{\link[progressr:handlers]{handlers(global = TRUE)}} before running this function. For more details about \pkg{progressr}, please read \href{https://progressr.futureverse.org/articles/progressr-intro.html}{\code{vignette("progressr-intro")}} } \section{Parallelization with \pkg{future}}{ This function uses \href{https://cran.r-project.org/package=future}{\pkg{future}} to enable parallelization. Parallelization strategies can be set using \code{\link[future]{plan}}. Common plans include \dQuote{\code{sequential}} for non-parallelized processing or \dQuote{\code{multisession}} for parallel evaluation using multiple \R sessions; for other plans, see the \dQuote{Implemented evaluation strategies} section of \code{\link[future:plan]{?future::plan}}. For a more thorough introduction to \pkg{future}, see \href{https://future.futureverse.org/articles/future-1-overview.html}{\code{vignette("future-1-overview")}} } \concept{future} \concept{preprocessing} Seurat/man/GroupCorrelationPlot.Rd0000644000176200001440000000152214731364134016722 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{GroupCorrelationPlot} \alias{GroupCorrelationPlot} \title{Boxplot of correlation of a variable (e.g. number of UMIs) with expression data} \usage{ GroupCorrelationPlot( object, assay = NULL, feature.group = "feature.grp", cor = "nCount_RNA_cor" ) } \arguments{ \item{object}{Seurat object} \item{assay}{Assay where the feature grouping info and correlations are stored} \item{feature.group}{Name of the column in meta.features where the feature grouping info is stored} \item{cor}{Name of the column in meta.features where correlation info is stored} } \value{ Returns a ggplot boxplot of correlations split by group } \description{ Boxplot of correlation of a variable (e.g. number of UMIs) with expression data } \concept{visualization} Seurat/man/FindConservedMarkers.Rd0000644000176200001440000000376014731364134016651 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/differential_expression.R \name{FindConservedMarkers} \alias{FindConservedMarkers} \title{Finds markers that are conserved between the groups} \usage{ FindConservedMarkers( object, ident.1, ident.2 = NULL, grouping.var, assay = "RNA", slot = "data", min.cells.group = 3, meta.method = metap::minimump, verbose = TRUE, ... ) } \arguments{ \item{object}{An object} \item{ident.1}{Identity class to define markers for} \item{ident.2}{A second identity class for comparison. If NULL (default) - use all other cells for comparison.} \item{grouping.var}{grouping variable} \item{assay}{of assay to fetch data for (default is RNA)} \item{slot}{Slot to pull data from; note that if \code{test.use} is "negbinom", "poisson", or "DESeq2", \code{slot} will be set to "counts"} \item{min.cells.group}{Minimum number of cells in one of the groups} \item{meta.method}{method for combining p-values. Should be a function from the metap package (NOTE: pass the function, not a string)} \item{verbose}{Print a progress bar once expression testing begins} \item{\dots}{parameters to pass to FindMarkers} } \value{ data.frame containing a ranked list of putative conserved markers, and associated statistics (p-values within each group and a combined p-value (such as Fishers combined p-value or others from the metap package), percentage of cells expressing the marker, average differences). Name of group is appended to each associated output column (e.g. CTRL_p_val). If only one group is tested in the grouping.var, max and combined p-values are not returned. } \description{ Finds markers that are conserved between the groups } \examples{ \dontrun{ data("pbmc_small") pbmc_small # Create a simulated grouping variable pbmc_small[['groups']] <- sample(x = c('g1', 'g2'), size = ncol(x = pbmc_small), replace = TRUE) FindConservedMarkers(pbmc_small, ident.1 = 0, ident.2 = 1, grouping.var = "groups") } } \concept{differential_expression} Seurat/man/HTODemux.Rd0000644000176200001440000000405414731364135014226 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{HTODemux} \alias{HTODemux} \title{Demultiplex samples based on data from cell 'hashing'} \usage{ HTODemux( object, assay = "HTO", positive.quantile = 0.99, init = NULL, nstarts = 100, kfunc = "clara", nsamples = 100, seed = 42, verbose = TRUE ) } \arguments{ \item{object}{Seurat object. Assumes that the hash tag oligo (HTO) data has been added and normalized.} \item{assay}{Name of the Hashtag assay (HTO by default)} \item{positive.quantile}{The quantile of inferred 'negative' distribution for each hashtag - over which the cell is considered 'positive'. Default is 0.99} \item{init}{Initial number of clusters for hashtags. Default is the # of hashtag oligo names + 1 (to account for negatives)} \item{nstarts}{nstarts value for k-means clustering (for kfunc = "kmeans"). 100 by default} \item{kfunc}{Clustering function for initial hashtag grouping. Default is "clara" for fast k-medoids clustering on large applications, also support "kmeans" for kmeans clustering} \item{nsamples}{Number of samples to be drawn from the dataset used for clustering, for kfunc = "clara"} \item{seed}{Sets the random seed. If NULL, seed is not set} \item{verbose}{Prints the output} } \value{ The Seurat object with the following demultiplexed information stored in the meta data: \describe{ \item{hash.maxID}{Name of hashtag with the highest signal} \item{hash.secondID}{Name of hashtag with the second highest signal} \item{hash.margin}{The difference between signals for hash.maxID and hash.secondID} \item{classification}{Classification result, with doublets/multiplets named by the top two highest hashtags} \item{classification.global}{Global classification result (singlet, doublet or negative)} \item{hash.ID}{Classification result where doublet IDs are collapsed} } } \description{ Assign sample-of-origin for each cell, annotate doublets. } \examples{ \dontrun{ object <- HTODemux(object) } } \seealso{ \code{\link{HTOHeatmap}} } \concept{preprocessing} Seurat/man/ExpMean.Rd0000644000176200001440000000072214731364135014124 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{ExpMean} \alias{ExpMean} \title{Calculate the mean of logged values} \usage{ ExpMean(x, ...) } \arguments{ \item{x}{A vector of values} \item{...}{Other arguments (not used)} } \value{ Returns the mean in log-space } \description{ Calculate mean of logged values in non-log space (return answer in log-space) } \examples{ ExpMean(x = c(1, 2, 3)) } \concept{utilities} Seurat/man/SelectSCTIntegrationFeatures.Rd0000644000176200001440000000120614731364134020260 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{SelectSCTIntegrationFeatures} \alias{SelectSCTIntegrationFeatures} \title{Select SCT integration features} \usage{ SelectSCTIntegrationFeatures( object, nfeatures = 3000, assay = NULL, verbose = TRUE, ... ) } \arguments{ \item{object}{Seurat object} \item{nfeatures}{Number of features to return for integration} \item{assay}{Name of assay to use for integration feature selection} \item{verbose}{Print messages} \item{...}{Arguments passed on to \code{method}} } \description{ Select SCT integration features } \concept{integration} Seurat/man/CreateSCTAssayObject.Rd0000644000176200001440000000223314731364135016473 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{CreateSCTAssayObject} \alias{CreateSCTAssayObject} \title{Create a SCT Assay object} \usage{ CreateSCTAssayObject( counts, data, scale.data = NULL, umi.assay = "RNA", min.cells = 0, min.features = 0, SCTModel.list = NULL ) } \arguments{ \item{counts}{Unnormalized data such as raw counts or TPMs} \item{data}{Prenormalized data; if provided, do not pass \code{counts}} \item{scale.data}{a residual matrix} \item{umi.assay}{The UMI assay name. Default is RNA} \item{min.cells}{Include features detected in at least this many cells. Will subset the counts matrix as well. To reintroduce excluded features, create a new object with a lower cutoff} \item{min.features}{Include cells where at least this many features are detected} \item{SCTModel.list}{list of SCTModels} } \description{ Create a SCT object from a feature (e.g. gene) expression matrix and a list of SCTModels. The expected format of the input matrix is features x cells. } \details{ Non-unique cell or feature names are not allowed. Please make unique before calling this function. } \concept{objects} Seurat/man/FindVariableFeatures.Rd0000644000176200001440000001127714744456127016632 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/preprocessing.R \name{FindVariableFeatures} \alias{FindVariableFeatures} \alias{FindVariableGenes} \alias{FindVariableFeatures.V3Matrix} \alias{FindVariableFeatures.Assay} \alias{FindVariableFeatures.SCTAssay} \alias{FindVariableFeatures.Seurat} \title{Find variable features} \usage{ FindVariableFeatures(object, ...) \method{FindVariableFeatures}{V3Matrix}( object, selection.method = "vst", loess.span = 0.3, clip.max = "auto", mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", verbose = TRUE, ... ) \method{FindVariableFeatures}{Assay}( object, selection.method = "vst", loess.span = 0.3, clip.max = "auto", mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", nfeatures = 2000, mean.cutoff = c(0.1, 8), dispersion.cutoff = c(1, Inf), verbose = TRUE, ... ) \method{FindVariableFeatures}{SCTAssay}(object, nfeatures = 2000, ...) \method{FindVariableFeatures}{Seurat}( object, assay = NULL, selection.method = "vst", loess.span = 0.3, clip.max = "auto", mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", nfeatures = 2000, mean.cutoff = c(0.1, 8), dispersion.cutoff = c(1, Inf), verbose = TRUE, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods} \item{selection.method}{How to choose top variable features. Choose one of : \itemize{ \item \dQuote{\code{vst}}: First, fits a line to the relationship of log(variance) and log(mean) using local polynomial regression (loess). Then standardizes the feature values using the observed mean and expected variance (given by the fitted line). Feature variance is then calculated on the standardized values after clipping to a maximum (see clip.max parameter). \item \dQuote{\code{mean.var.plot}} (mvp): First, uses a function to calculate average expression (mean.function) and dispersion (dispersion.function) for each feature. Next, divides features into \code{num.bin} (default 20) bins based on their average expression, and calculates z-scores for dispersion within each bin. The purpose of this is to identify variable features while controlling for the strong relationship between variability and average expression \item \dQuote{\code{dispersion}} (disp): selects the genes with the highest dispersion values }} \item{loess.span}{(vst method) Loess span parameter used when fitting the variance-mean relationship} \item{clip.max}{(vst method) After standardization values larger than clip.max will be set to clip.max; default is 'auto' which sets this value to the square root of the number of cells} \item{mean.function}{Function to compute x-axis value (average expression). Default is to take the mean of the detected (i.e. non-zero) values} \item{dispersion.function}{Function to compute y-axis value (dispersion). Default is to take the standard deviation of all values} \item{num.bin}{Total number of bins to use in the scaled analysis (default is 20)} \item{binning.method}{Specifies how the bins should be computed. Available methods are: \itemize{ \item \dQuote{\code{equal_width}}: each bin is of equal width along the x-axis (default) \item \dQuote{\code{equal_frequency}}: each bin contains an equal number of features (can increase statistical power to detect overdispersed features at high expression values, at the cost of reduced resolution along the x-axis) }} \item{verbose}{show progress bar for calculations} \item{nfeatures}{Number of features to select as top variable features; only used when \code{selection.method} is set to \code{'dispersion'} or \code{'vst'}} \item{mean.cutoff}{A two-length numeric vector with low- and high-cutoffs for feature means} \item{dispersion.cutoff}{A two-length numeric vector with low- and high-cutoffs for feature dispersions} \item{assay}{Assay to use} } \description{ Identifies features that are outliers on a 'mean variability plot'. } \details{ For the mean.var.plot method: Exact parameter settings may vary empirically from dataset to dataset, and based on visual inspection of the plot. Setting the y.cutoff parameter to 2 identifies features that are more than two standard deviations away from the average dispersion within a bin. The default X-axis function is the mean expression level, and for Y-axis it is the log(Variance/mean). All mean/variance calculations are not performed in log-space, but the results are reported in log-space - see relevant functions for exact details. } \concept{preprocessing} Seurat/man/ProjectUMAP.Rd0000644000176200001440000000611314731364134014657 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{ProjectUMAP} \alias{ProjectUMAP} \alias{ProjectUMAP.default} \alias{ProjectUMAP.DimReduc} \alias{ProjectUMAP.Seurat} \title{Project query into UMAP coordinates of a reference} \usage{ ProjectUMAP(query, ...) \method{ProjectUMAP}{default}( query, query.dims = NULL, reference, reference.dims = NULL, k.param = 30, nn.method = "annoy", n.trees = 50, annoy.metric = "cosine", l2.norm = FALSE, cache.index = TRUE, index = NULL, neighbor.name = "query_ref.nn", reduction.model, ... ) \method{ProjectUMAP}{DimReduc}( query, query.dims = NULL, reference, reference.dims = NULL, k.param = 30, nn.method = "annoy", n.trees = 50, annoy.metric = "cosine", l2.norm = FALSE, cache.index = TRUE, index = NULL, neighbor.name = "query_ref.nn", reduction.model, ... ) \method{ProjectUMAP}{Seurat}( query, query.reduction, query.dims = NULL, reference, reference.reduction, reference.dims = NULL, k.param = 30, nn.method = "annoy", n.trees = 50, annoy.metric = "cosine", l2.norm = FALSE, cache.index = TRUE, index = NULL, neighbor.name = "query_ref.nn", reduction.model, reduction.name = "ref.umap", reduction.key = "refUMAP_", ... ) } \arguments{ \item{query}{Query dataset} \item{...}{Additional parameters to \code{\link{RunUMAP}}} \item{query.dims}{Dimensions (columns) to use from query} \item{reference}{Reference dataset} \item{reference.dims}{Dimensions (columns) to use from reference} \item{k.param}{Defines k for the k-nearest neighbor algorithm} \item{nn.method}{Method for nearest neighbor finding. Options include: rann, annoy} \item{n.trees}{More trees gives higher precision when using annoy approximate nearest neighbor search} \item{annoy.metric}{Distance metric for annoy. Options include: euclidean, cosine, manhattan, and hamming} \item{l2.norm}{Take L2Norm of the data} \item{cache.index}{Include cached index in returned Neighbor object (only relevant if return.neighbor = TRUE)} \item{index}{Precomputed index. Useful if querying new data against existing index to avoid recomputing.} \item{neighbor.name}{Name to store neighbor information in the query} \item{reduction.model}{\code{DimReduc} object that contains the umap model} \item{query.reduction}{Name of reduction to use from the query for neighbor finding} \item{reference.reduction}{Name of reduction to use from the reference for neighbor finding} \item{reduction.name}{Name of projected UMAP to store in the query} \item{reduction.key}{Value for the projected UMAP key} } \description{ This function will take a query dataset and project it into the coordinates of a provided reference UMAP. This is essentially a wrapper around two steps: \itemize{ \item{FindNeighbors - Find the nearest reference cell neighbors and their distances for each query cell.} \item{RunUMAP - Perform umap projection by providing the neighbor set calculated above and the umap model previously computed in the reference.} } } \concept{dimensional_reduction} Seurat/man/FindBridgeIntegrationAnchors.Rd0000644000176200001440000000421014731364134020301 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{FindBridgeIntegrationAnchors} \alias{FindBridgeIntegrationAnchors} \title{Find integration bridge anchors between query and extended bridge-reference} \usage{ FindBridgeIntegrationAnchors( extended.reference, query, query.assay = NULL, dims = 1:30, scale = FALSE, reduction = c("lsiproject", "pcaproject"), integration.reduction = c("direct", "cca"), verbose = TRUE ) } \arguments{ \item{extended.reference}{BridgeReferenceSet object generated from \code{\link{PrepareBridgeReference}}} \item{query}{A query Seurat object} \item{query.assay}{Assay name for query-bridge integration} \item{dims}{Number of dimensions for query-bridge integration} \item{scale}{Determine if scale the query data for projection} \item{reduction}{Dimensional reduction to perform when finding anchors. Options are: \itemize{ \item{pcaproject: Project the PCA from the bridge onto the query. We recommend using PCA when bridge and query datasets are from scRNA-seq} \item{lsiproject: Project the LSI from the bridge onto the query. We recommend using LSI when bridge and query datasets are from scATAC-seq or scCUT&TAG data. This requires that LSI or supervised LSI has been computed for the bridge dataset, and the same features (eg, peaks or genome bins) are present in both the bridge and query. } }} \item{integration.reduction}{Dimensional reduction to perform when finding anchors between query and reference. Options are: \itemize{ \item{direct: find anchors directly on the bridge representation space} \item{cca: perform cca on the on the bridge representation space and then find anchors } }} \item{verbose}{Print messages and progress} } \value{ Returns an \code{AnchorSet} object that can be used as input to \code{\link{IntegrateEmbeddings}}. } \description{ Find a set of anchors between unimodal query and the other unimodal reference using a pre-computed \code{\link{BridgeReferenceSet}}. These integration anchors can later be used to integrate query and reference using the \code{\link{IntegrateEmbeddings}} object. } \concept{integration} Seurat/man/FindSubCluster.Rd0000644000176200001440000000200514744456127015466 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clustering.R \name{FindSubCluster} \alias{FindSubCluster} \title{Find subclusters under one cluster} \usage{ FindSubCluster( object, cluster, graph.name, subcluster.name = "sub.cluster", resolution = 0.5, algorithm = 1 ) } \arguments{ \item{object}{An object} \item{cluster}{the cluster to be sub-clustered} \item{graph.name}{Name of graph to use for the clustering algorithm} \item{subcluster.name}{the name of sub cluster added in the meta.data} \item{resolution}{Value of the resolution parameter, use a value above (below) 1.0 if you want to obtain a larger (smaller) number of communities.} \item{algorithm}{Algorithm for modularity optimization (1 = original Louvain algorithm; 2 = Louvain algorithm with multilevel refinement; 3 = SLM algorithm; 4 = Leiden algorithm).} } \value{ return a object with sub cluster labels in the sub-cluster.name variable } \description{ Find subclusters under one cluster } \concept{clustering} Seurat/man/FindBridgeTransferAnchors.Rd0000644000176200001440000000455414731364134017615 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{FindBridgeTransferAnchors} \alias{FindBridgeTransferAnchors} \title{Find bridge anchors between query and extended bridge-reference} \usage{ FindBridgeTransferAnchors( extended.reference, query, query.assay = NULL, dims = 1:30, scale = FALSE, reduction = c("lsiproject", "pcaproject"), bridge.reduction = c("direct", "cca"), verbose = TRUE ) } \arguments{ \item{extended.reference}{BridgeReferenceSet object generated from \code{\link{PrepareBridgeReference}}} \item{query}{A query Seurat object} \item{query.assay}{Assay name for query-bridge integration} \item{dims}{Number of dimensions for query-bridge integration} \item{scale}{Determine if scale the query data for projection} \item{reduction}{Dimensional reduction to perform when finding anchors. Options are: \itemize{ \item{pcaproject: Project the PCA from the bridge onto the query. We recommend using PCA when bridge and query datasets are from scRNA-seq} \item{lsiproject: Project the LSI from the bridge onto the query. We recommend using LSI when bridge and query datasets are from scATAC-seq or scCUT&TAG data. This requires that LSI or supervised LSI has been computed for the bridge dataset, and the same features (eg, peaks or genome bins) are present in both the bridge and query. } }} \item{bridge.reduction}{Dimensional reduction to perform when finding anchors. Can be one of: \itemize{ \item{cca: Canonical correlation analysis} \item{direct: Use assay data as a dimensional reduction} }} \item{verbose}{Print messages and progress} } \value{ Returns an \code{AnchorSet} object that can be used as input to \code{\link{TransferData}}, \code{\link{IntegrateEmbeddings}} and \code{\link{MapQuery}}. } \description{ Find a set of anchors between unimodal query and the other unimodal reference using a pre-computed \code{\link{BridgeReferenceSet}}. This function performs three steps: 1. Harmonize the bridge and query cells in the bridge query reduction space 2. Construct the bridge dictionary representations for query cells 3. Find a set of anchors between query and reference in the bridge graph laplacian eigenspace These anchors can later be used to integrate embeddings or transfer data from the reference to query object using the \code{\link{MapQuery}} object. } \concept{integration} Seurat/man/ReadAkoya.Rd0000644000176200001440000000526314731364133014432 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R, R/convenience.R \name{ReadAkoya} \alias{ReadAkoya} \alias{LoadAkoya} \title{Read and Load Akoya CODEX data} \usage{ ReadAkoya( filename, type = c("inform", "processor", "qupath"), filter = "DAPI|Blank|Empty", inform.quant = c("mean", "total", "min", "max", "std") ) LoadAkoya( filename, type = c("inform", "processor", "qupath"), fov, assay = "Akoya", ... ) } \arguments{ \item{filename}{Path to matrix generated by upstream processing.} \item{type}{Specify which type matrix is being provided. \itemize{ \item \dQuote{\code{processor}}: matrix generated by CODEX Processor \item \dQuote{\code{inform}}: matrix generated by inForm \item \dQuote{\code{qupath}}: matrix generated by QuPath }} \item{filter}{A pattern to filter features by; pass \code{NA} to skip feature filtering} \item{inform.quant}{When \code{type} is \dQuote{\code{inform}}, the quantification level to read in} \item{fov}{Name to store FOV as} \item{assay}{Name to store expression matrix as} \item{...}{Ignored} } \value{ \code{ReadAkoya}: A list with some combination of the following values \itemize{ \item \dQuote{\code{matrix}}: a \link[Matrix:dgCMatrix-class]{sparse matrix} with expression data; cells are columns and features are rows \item \dQuote{\code{centroids}}: a data frame with cell centroid coordinates in three columns: \dQuote{x}, \dQuote{y}, and \dQuote{cell} \item \dQuote{\code{metadata}}: a data frame with cell-level meta data; includes all columns in \code{filename} that aren't in \dQuote{\code{matrix}} or \dQuote{\code{centroids}} } When \code{type} is \dQuote{\code{inform}}, additional expression matrices are returned and named using their segmentation type (eg. \dQuote{nucleus}, \dQuote{membrane}). The \dQuote{Entire Cell} segmentation type is returned in the \dQuote{\code{matrix}} entry of the list \code{LoadAkoya}: A \code{\link[SeuratObject]{Seurat}} object } \description{ Read and Load Akoya CODEX data } \note{ This function requires the \href{https://cran.r-project.org/package=data.table}{\pkg{data.table}} package to be installed } \section{Progress Updates with \pkg{progressr}}{ This function uses \href{https://cran.r-project.org/package=progressr}{\pkg{progressr}} to render status updates and progress bars. To enable progress updates, wrap the function call in \code{\link[progressr]{with_progress}} or run \code{\link[progressr:handlers]{handlers(global = TRUE)}} before running this function. For more details about \pkg{progressr}, please read \href{https://progressr.futureverse.org/articles/progressr-intro.html}{\code{vignette("progressr-intro")}} } \concept{preprocessing} Seurat/man/FetchResidualSCTModel.Rd0000644000176200001440000000372514731364135016652 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing5.R \name{FetchResidualSCTModel} \alias{FetchResidualSCTModel} \title{Calculate pearson residuals of features not in the scale.data This function is the secondary function under FetchResiduals} \usage{ FetchResidualSCTModel( object, assay = "SCT", umi.assay = "RNA", layer = "counts", chunk_size = 2000, layer.cells = NULL, SCTModel = NULL, reference.SCT.model = NULL, new_features = NULL, clip.range = NULL, replace.value = FALSE, verbose = FALSE ) } \arguments{ \item{object}{A seurat object} \item{assay}{Name of the assay of the seurat object generated by SCTransform. Default is "SCT"} \item{umi.assay}{Name of the assay of the seurat object to fetch UMIs from. Default is "RNA"} \item{layer}{Name of the layer under `umi.assay` to fetch UMIs from. Default is "counts"} \item{chunk_size}{Number of cells to load in memory for calculating residuals} \item{layer.cells}{Vector of cells to calculate the residual for. Default is NULL which uses all cells in the layer} \item{SCTModel}{Which SCTmodel to use from the object for calculating the residual. Will be ignored if reference.SCT.model is set} \item{reference.SCT.model}{If a reference SCT model should be used for calculating the residuals. When set to not NULL, ignores the `SCTModel` paramater.} \item{new_features}{A vector of features to calculate the residuals for} \item{clip.range}{Numeric of length two specifying the min and max values the Pearson residual will be clipped to. Useful if you want to change the clip.range.} \item{replace.value}{Whether to replace the value of residuals if it already exists} \item{verbose}{Whether to print messages and progress bars} } \value{ Returns a matrix containing centered pearson residuals of added features } \description{ Calculate pearson residuals of features not in the scale.data This function is the secondary function under FetchResiduals } \keyword{internal} Seurat/man/SeuratTheme.Rd0000644000176200001440000000602114731364134015012 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SeuratTheme} \alias{SeuratTheme} \alias{CenterTitle} \alias{DarkTheme} \alias{FontSize} \alias{NoAxes} \alias{NoLegend} \alias{NoGrid} \alias{SeuratAxes} \alias{SpatialTheme} \alias{RestoreLegend} \alias{RotatedAxis} \alias{BoldTitle} \alias{WhiteBackground} \title{Seurat Themes} \usage{ SeuratTheme() CenterTitle(...) DarkTheme(...) FontSize( x.text = NULL, y.text = NULL, x.title = NULL, y.title = NULL, main = NULL, ... ) NoAxes(..., keep.text = FALSE, keep.ticks = FALSE) NoLegend(...) NoGrid(...) SeuratAxes(...) SpatialTheme(...) RestoreLegend(..., position = "right") RotatedAxis(...) BoldTitle(...) WhiteBackground(...) } \arguments{ \item{...}{Extra parameters to be passed to \code{theme}} \item{x.text, y.text}{X and Y axis text sizes} \item{x.title, y.title}{X and Y axis title sizes} \item{main}{Plot title size} \item{keep.text}{Keep axis text} \item{keep.ticks}{Keep axis ticks} \item{position}{A position to restore the legend to} } \value{ A ggplot2 theme object } \description{ Various themes to be applied to ggplot2-based plots \describe{ \item{\code{SeuratTheme}}{The curated Seurat theme, consists of ...} \item{\code{DarkTheme}}{A dark theme, axes and text turn to white, the background becomes black} \item{\code{NoAxes}}{Removes axis lines, text, and ticks} \item{\code{NoLegend}}{Removes the legend} \item{\code{FontSize}}{Sets axis and title font sizes} \item{\code{NoGrid}}{Removes grid lines} \item{\code{SeuratAxes}}{Set Seurat-style axes} \item{\code{SpatialTheme}}{A theme designed for spatial visualizations (eg \code{\link{PolyFeaturePlot}}, \code{\link{PolyDimPlot}})} \item{\code{RestoreLegend}}{Restore a legend after removal} \item{\code{RotatedAxis}}{Rotate X axis text 45 degrees} \item{\code{BoldTitle}}{Enlarges and emphasizes the title} } } \examples{ # Generate a plot with a dark theme library(ggplot2) df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) p + DarkTheme(legend.position = 'none') # Generate a plot with no axes library(ggplot2) df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) p + NoAxes() # Generate a plot with no legend library(ggplot2) df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) p + NoLegend() # Generate a plot with no grid lines library(ggplot2) df <- data.frame(x = rnorm(n = 100, mean = 20, sd = 2), y = rbinom(n = 100, size = 100, prob = 0.2)) p <- ggplot(data = df, mapping = aes(x = x, y = y)) + geom_point(mapping = aes(color = 'red')) p + NoGrid() } \seealso{ \code{\link[ggplot2]{theme}} } \concept{visualization} Seurat/man/FeaturePlot.Rd0000644000176200001440000001320214744456127015025 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{FeaturePlot} \alias{FeaturePlot} \alias{FeatureHeatmap} \title{Visualize 'features' on a dimensional reduction plot} \usage{ FeaturePlot( object, features, dims = c(1, 2), cells = NULL, cols = if (blend) { c("lightgrey", "#ff0000", "#00ff00") } else { c("lightgrey", "blue") }, pt.size = NULL, alpha = 1, order = FALSE, min.cutoff = NA, max.cutoff = NA, reduction = NULL, split.by = NULL, keep.scale = "feature", shape.by = NULL, slot = "data", blend = FALSE, blend.threshold = 0.5, label = FALSE, label.size = 4, label.color = "black", repel = FALSE, ncol = NULL, coord.fixed = FALSE, by.col = TRUE, sort.cell = deprecated(), interactive = FALSE, combine = TRUE, raster = NULL, raster.dpi = c(512, 512) ) } \arguments{ \item{object}{Seurat object} \item{features}{Vector of features to plot. Features can come from: \itemize{ \item An \code{Assay} feature (e.g. a gene name - "MS4A1") \item A column name from meta.data (e.g. mitochondrial percentage - "percent.mito") \item A column name from a \code{DimReduc} object corresponding to the cell embedding values (e.g. the PC 1 scores - "PC_1") }} \item{dims}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} \item{cells}{Vector of cells to plot (default is all cells)} \item{cols}{The two colors to form the gradient over. Provide as string vector with the first color corresponding to low values, the second to high. Also accepts a Brewer color scale or vector of colors. Note: this will bin the data into number of colors provided. When blend is \code{TRUE}, takes anywhere from 1-3 colors: \describe{ \item{1 color:}{Treated as color for double-negatives, will use default colors 2 and 3 for per-feature expression} \item{2 colors:}{Treated as colors for per-feature expression, will use default color 1 for double-negatives} \item{3+ colors:}{First color used for double-negatives, colors 2 and 3 used for per-feature expression, all others ignored} }} \item{pt.size}{Adjust point size for plotting} \item{alpha}{Alpha value for plotting (default is 1)} \item{order}{Boolean determining whether to plot cells in order of expression. Can be useful if cells expressing given feature are getting buried.} \item{min.cutoff, max.cutoff}{Vector of minimum and maximum cutoff values for each feature, may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10')} \item{reduction}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} \item{split.by}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity} \item{keep.scale}{How to handle the color scale across multiple plots. Options are: \itemize{ \item \dQuote{feature} (default; by row/feature scaling): The plots for each individual feature are scaled to the maximum expression of the feature across the conditions provided to \code{split.by} \item \dQuote{all} (universal scaling): The plots for all features and conditions are scaled to the maximum expression value for the feature with the highest overall expression \item \code{NULL} (no scaling): Each individual plot is scaled to the maximum expression value of the feature in the condition provided to \code{split.by}. Be aware setting \code{NULL} will result in color scales that are not comparable between plots }} \item{shape.by}{If NULL, all points are circles (default). You can specify any cell attribute (that can be pulled with FetchData) allowing for both different colors and different shapes on cells. Only applicable if \code{raster = FALSE}.} \item{slot}{Which slot to pull expression data from?} \item{blend}{Scale and blend expression values to visualize coexpression of two features} \item{blend.threshold}{The color cutoff from weak signal to strong signal; ranges from 0 to 1.} \item{label}{Whether to label the clusters} \item{label.size}{Sets size of labels} \item{label.color}{Sets the color of the label text} \item{repel}{Repel labels} \item{ncol}{Number of columns to combine multiple feature plots to, ignored if \code{split.by} is not \code{NULL}} \item{coord.fixed}{Plot cartesian coordinates with fixed aspect ratio} \item{by.col}{If splitting by a factor, plot the splits per column with the features as rows; ignored if \code{blend = TRUE}} \item{sort.cell}{Redundant with \code{order}. This argument is being deprecated. Please use \code{order} instead.} \item{interactive}{Launch an interactive \code{\link[Seurat:IFeaturePlot]{FeaturePlot}}} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} \item{raster}{Convert points to raster format, default is \code{NULL} which automatically rasterizes if plotting more than 100,000 cells} \item{raster.dpi}{Pixel resolution for rasterized plots, passed to geom_scattermore(). Default is c(512, 512).} } \value{ A \code{\link[patchwork]{patchwork}ed} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ Colors single cells on a dimensional reduction plot according to a 'feature' (i.e. gene expression, PC scores, number of genes detected, etc.) } \note{ For the old \code{do.hover} and \code{do.identify} functionality, please see \code{HoverLocator} and \code{CellSelector}, respectively. } \examples{ data("pbmc_small") FeaturePlot(object = pbmc_small, features = 'PC_1') } \seealso{ \code{\link{DimPlot}} \code{\link{HoverLocator}} \code{\link{CellSelector}} } \concept{visualization} Seurat/man/FindMultiModalNeighbors.Rd0000644000176200001440000000451014731364134017276 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clustering.R \name{FindMultiModalNeighbors} \alias{FindMultiModalNeighbors} \title{Construct weighted nearest neighbor graph} \usage{ FindMultiModalNeighbors( object, reduction.list, dims.list, k.nn = 20, l2.norm = TRUE, knn.graph.name = "wknn", snn.graph.name = "wsnn", weighted.nn.name = "weighted.nn", modality.weight.name = NULL, knn.range = 200, prune.SNN = 1/15, sd.scale = 1, cross.contant.list = NULL, smooth = FALSE, return.intermediate = FALSE, modality.weight = NULL, verbose = TRUE ) } \arguments{ \item{object}{A Seurat object} \item{reduction.list}{A list of two dimensional reductions, one for each of the modalities to be integrated} \item{dims.list}{A list containing the dimensions for each reduction to use} \item{k.nn}{the number of multimodal neighbors to compute. 20 by default} \item{l2.norm}{Perform L2 normalization on the cell embeddings after dimensional reduction. TRUE by default.} \item{knn.graph.name}{Multimodal knn graph name} \item{snn.graph.name}{Multimodal snn graph name} \item{weighted.nn.name}{Multimodal neighbor object name} \item{modality.weight.name}{Variable name to store modality weight in object meta data} \item{knn.range}{The number of approximate neighbors to compute} \item{prune.SNN}{Cutoff not to discard edge in SNN graph} \item{sd.scale}{The scaling factor for kernel width. 1 by default} \item{cross.contant.list}{Constant used to avoid divide-by-zero errors. 1e-4 by default} \item{smooth}{Smoothing modality score across each individual modality neighbors. FALSE by default} \item{return.intermediate}{Store intermediate results in misc} \item{modality.weight}{A \code{\link{ModalityWeights}} object generated by \code{FindModalityWeights}} \item{verbose}{Print progress bars and output} } \value{ Seurat object containing a nearest-neighbor object, KNN graph, and SNN graph - each based on a weighted combination of modalities. } \description{ This function will construct a weighted nearest neighbor (WNN) graph. For each cell, we identify the nearest neighbors based on a weighted combination of two modalities. Takes as input two dimensional reductions, one computed for each modality.Other parameters are listed for debugging, but can be left as default values. } \concept{clustering} Seurat/man/as.SingleCellExperiment.Rd0000644000176200001440000000114214731364133017246 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/objects.R \name{as.SingleCellExperiment} \alias{as.SingleCellExperiment} \alias{as.SingleCellExperiment.Seurat} \title{Convert objects to SingleCellExperiment objects} \usage{ as.SingleCellExperiment(x, ...) \method{as.SingleCellExperiment}{Seurat}(x, assay = NULL, ...) } \arguments{ \item{x}{An object to convert to class \code{SingleCellExperiment}} \item{...}{Arguments passed to other methods} \item{assay}{Assays to convert} } \description{ Convert objects to SingleCellExperiment objects } \concept{objects} Seurat/man/writing-integration.Rd0000644000176200001440000000340014731364134016566 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration5.R \name{writing-integration} \alias{writing-integration} \title{Writing Integration Method Functions} \description{ Integration method functions can be written by anyone to implement any integration method in Seurat. These methods should expect to take a \link[SeuratObject:Assay5]{v5 assay} as input and return a named list of objects that can be added back to a \code{Seurat} object (eg. a \link[SeuratObject:DimReduc]{dimensional reduction} or cell-level meta data) } \section{Provided Parameters}{ Every integration method function should expect the following arguments: \itemize{ \item \dQuote{\code{object}}: an \code{\link[SeuratObject]{Assay5}} object \item \dQuote{\code{orig}}: \link[SeuratObject:DimReduc]{dimensional reduction} to correct \item \dQuote{\code{layers}}: names of normalized layers in \code{object} \item \dQuote{\code{scale.layer}}: name(s) of scaled layer(s) in \code{object} \item \dQuote{\code{features}}: a vector of features for integration \item \dQuote{\code{groups}}: a one-column data frame with the groups for each cell in \code{object}; the column name will be \dQuote{group} } } \section{Method Discovery}{ The documentation for \code{\link{IntegrateLayers}()} will automatically link to integration method functions provided by packages in the \code{\link[base]{search}()} space. To make an integration method function discoverable by the documentation, simply add an attribute named \dQuote{\code{Seurat.method}} to the function with a value of \dQuote{\code{integration}} \preformatted{ attr(MyIntegrationFunction, which = "Seurat.method") <- "integration" } } \seealso{ \code{\link{IntegrateLayers}()} } \concept{integration} \keyword{internal} Seurat/man/AverageExpression.Rd0000644000176200001440000000467114731364135016230 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{AverageExpression} \alias{AverageExpression} \title{Averaged feature expression by identity class} \usage{ AverageExpression( object, assays = NULL, features = NULL, return.seurat = FALSE, group.by = "ident", add.ident = NULL, layer = "data", slot = deprecated(), verbose = TRUE, ... ) } \arguments{ \item{object}{Seurat object} \item{assays}{Which assays to use. Default is all assays} \item{features}{Features to analyze. Default is all features in the assay} \item{return.seurat}{Whether to return the data as a Seurat object. Default is FALSE} \item{group.by}{Category (or vector of categories) for grouping (e.g, ident, replicate, celltype); 'ident' by default To use multiple categories, specify a vector, such as c('ident', 'replicate', 'celltype')} \item{add.ident}{(Deprecated). Place an additional label on each cell prior to pseudobulking} \item{layer}{Layer(s) to use; if multiple layers are given, assumed to follow the order of 'assays' (if specified) or object's assays} \item{slot}{(Deprecated). Slots(s) to use} \item{verbose}{Print messages and show progress bar} \item{...}{Arguments to be passed to methods such as \code{\link{CreateSeuratObject}}} } \value{ Returns a matrix with genes as rows, identity classes as columns. If return.seurat is TRUE, returns an object of class \code{\link{Seurat}}. } \description{ Returns averaged expression values for each identity class. } \details{ If layer is set to 'data', this function assumes that the data has been log normalized and therefore feature values are exponentiated prior to averaging so that averaging is done in non-log space. Otherwise, if layer is set to either 'counts' or 'scale.data', no exponentiation is performed prior to averaging. If \code{return.seurat = TRUE} and layer is not 'scale.data', averaged values are placed in the 'counts' layer of the returned object and 'log1p' is run on the averaged counts and placed in the 'data' layer \code{\link{ScaleData}} is then run on the default assay before returning the object. If \code{return.seurat = TRUE} and layer is 'scale.data', the 'counts' layer contains average counts and 'scale.data' is set to the averaged values of 'scale.data'. } \examples{ data("pbmc_small") head(AverageExpression(object = pbmc_small)$RNA) head(AverageExpression(object = pbmc_small, group.by = c('ident', 'groups'))$RNA) } \concept{utilities} Seurat/man/AggregateExpression.Rd0000644000176200001440000000414414731364135016537 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{AggregateExpression} \alias{AggregateExpression} \title{Aggregated feature expression by identity class} \usage{ AggregateExpression( object, assays = NULL, features = NULL, return.seurat = FALSE, group.by = "ident", add.ident = NULL, normalization.method = "LogNormalize", scale.factor = 10000, margin = 1, verbose = TRUE, ... ) } \arguments{ \item{object}{Seurat object} \item{assays}{Which assays to use. Default is all assays} \item{features}{Features to analyze. Default is all features in the assay} \item{return.seurat}{Whether to return the data as a Seurat object. Default is FALSE} \item{group.by}{Category (or vector of categories) for grouping (e.g, ident, replicate, celltype); 'ident' by default To use multiple categories, specify a vector, such as c('ident', 'replicate', 'celltype')} \item{add.ident}{(Deprecated). Place an additional label on each cell prior to pseudobulking} \item{normalization.method}{Method for normalization, see \code{\link{NormalizeData}}} \item{scale.factor}{Scale factor for normalization, see \code{\link{NormalizeData}}} \item{margin}{Margin to perform CLR normalization, see \code{\link{NormalizeData}}} \item{verbose}{Print messages and show progress bar} \item{...}{Arguments to be passed to methods such as \code{\link{CreateSeuratObject}}} } \value{ Returns a matrix with genes as rows, identity classes as columns. If return.seurat is TRUE, returns an object of class \code{\link{Seurat}}. } \description{ Returns summed counts ("pseudobulk") for each identity class. } \details{ If \code{return.seurat = TRUE}, aggregated values are placed in the 'counts' layer of the returned object. The data is then normalized by running \code{\link{NormalizeData}} on the aggregated counts. \code{\link{ScaleData}} is then run on the default assay before returning the object. } \examples{ \dontrun{ data("pbmc_small") head(AggregateExpression(object = pbmc_small)$RNA) head(AggregateExpression(object = pbmc_small, group.by = c('ident', 'groups'))$RNA) } } \concept{utilities} Seurat/man/SingleImagePlot.Rd0000644000176200001440000000565114731364134015617 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleImagePlot} \alias{SingleImagePlot} \title{Single Spatial Plot} \usage{ SingleImagePlot( data, col.by = NA, col.factor = TRUE, cols = NULL, shuffle.cols = FALSE, size = 0.1, molecules = NULL, mols.size = 0.1, mols.cols = NULL, mols.alpha = 1, alpha = molecules \%iff\% 0.3 \%||\% 0.6, border.color = "white", border.size = NULL, na.value = "grey50", dark.background = TRUE, ... ) } \arguments{ \item{data}{A data frame with at least the following columns: \itemize{ \item \dQuote{\code{x}}: Spatial-resolved \emph{x} coordinates, will be plotted on the \emph{y}-axis \item \dQuote{\code{y}}: Spatially-resolved \emph{y} coordinates, will be plotted on the \emph{x}-axis \item \dQuote{\code{cell}}: Cell name \item \dQuote{\code{boundary}}: Segmentation boundary label; when plotting multiple segmentation layers, the order of boundary transparency is set by factor levels for this column } Can pass \code{NA} to \code{data} suppress segmentation visualization} \item{col.by}{Name of column in \code{data} to color cell segmentations by; pass \code{NA} to suppress coloring} \item{col.factor}{Are the colors a factor or discrete?} \item{cols}{Colors for cell segmentations; can be one of the following: \itemize{ \item \code{NULL} for default ggplot2 colors \item A numeric value or name of a \link[RColorBrewer:RColorBrewer]{color brewer palette} \item Name of a palette for \code{\link{DiscretePalette}} \item A vector of colors equal to the length of unique levels of \code{data$col.by} }} \item{shuffle.cols}{Randomly shuffle colors when a palette or vector of colors is provided to \code{cols}} \item{size}{Point size for cells when plotting centroids} \item{molecules}{A data frame with spatially-resolved molecule coordinates; should have the following columns: \itemize{ \item \dQuote{\code{x}}: Spatial-resolved \emph{x} coordinates, will be plotted on the \emph{y}-axis \item \dQuote{\code{y}}: Spatially-resolved \emph{y} coordinates, will be plotted on the \emph{x}-axis \item \dQuote{\code{molecule}}: Molecule name }} \item{mols.size}{Point size for molecules} \item{mols.cols}{A vector of color for molecules. The "Set1" palette from RColorBrewer is used by default.} \item{mols.alpha}{Alpha value for molecules, should be between 0 and 1} \item{alpha}{Alpha value, should be between 0 and 1; when plotting multiple boundaries, \code{alpha} is equivalent to max alpha} \item{border.color}{Color of cell segmentation border; pass \code{NA} to suppress borders for segmentation-based plots} \item{border.size}{Thickness of cell segmentation borders; pass \code{NA} to suppress borders for centroid-based plots} \item{na.value}{Color value for \code{NA} segmentations when using custom scale} \item{...}{Ignored} } \value{ A ggplot object } \description{ Single Spatial Plot } \keyword{internal} Seurat/man/fortify-Spatial.Rd0000644000176200001440000000177714744463014015657 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{fortify-Spatial} \alias{fortify-Spatial} \alias{fortify.Centroids} \alias{fortify} \alias{fortify.Molecules} \alias{fortify.Segmentation} \title{Prepare Coordinates for Spatial Plots} \usage{ \method{fortify}{Centroids}(model, data, ...) \method{fortify}{Molecules}(model, data, nmols = NULL, seed = NA_integer_, ...) \method{fortify}{Segmentation}(model, data, ...) } \arguments{ \item{model}{A \code{\link[SeuratObject:Segmentation-class]{Segmentation}}, \code{\link[SeuratObject:Centroids-class]{Centroids}}, or \code{\link[SeuratObject:Molecules-class]{Molecules}} object} \item{data}{Extra data to be used for annotating the cell segmentations; the easiest way to pass data is a one-column \code{\link[base:data.frame]{data frame}} with the values to color by and the cell names are rownames} \item{...}{Arguments passed to other methods} } \description{ Prepare Coordinates for Spatial Plots } \keyword{internal} Seurat/man/RunTSNE.Rd0000644000176200001440000000552514731364134014032 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunTSNE} \alias{RunTSNE} \alias{RunTSNE.matrix} \alias{RunTSNE.DimReduc} \alias{RunTSNE.dist} \alias{RunTSNE.Seurat} \title{Run t-distributed Stochastic Neighbor Embedding} \usage{ RunTSNE(object, ...) \method{RunTSNE}{matrix}( object, assay = NULL, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, reduction.key = "tSNE_", ... ) \method{RunTSNE}{DimReduc}( object, cells = NULL, dims = 1:5, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, reduction.key = "tSNE_", ... ) \method{RunTSNE}{dist}( object, assay = NULL, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, reduction.key = "tSNE_", ... ) \method{RunTSNE}{Seurat}( object, reduction = "pca", cells = NULL, dims = 1:5, features = NULL, seed.use = 1, tsne.method = "Rtsne", dim.embed = 2, distance.matrix = NULL, reduction.name = "tsne", reduction.key = "tSNE_", ... ) } \arguments{ \item{object}{Seurat object} \item{...}{Arguments passed to other methods and to t-SNE call (most commonly used is perplexity)} \item{assay}{Name of assay that that t-SNE is being run on} \item{seed.use}{Random seed for the t-SNE. If NULL, does not set the seed} \item{tsne.method}{Select the method to use to compute the tSNE. Available methods are: \itemize{ \item \dQuote{\code{Rtsne}}: Use the Rtsne package Barnes-Hut implementation of tSNE (default) \item \dQuote{\code{FIt-SNE}}: Use the FFT-accelerated Interpolation-based t-SNE. Based on Kluger Lab code found here: \url{https://github.com/KlugerLab/FIt-SNE} }} \item{dim.embed}{The dimensional space of the resulting tSNE embedding (default is 2). For example, set to 3 for a 3d tSNE} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names. \dQuote{\code{tSNE_}} by default} \item{cells}{Which cells to analyze (default, all cells)} \item{dims}{Which dimensions to use as input features} \item{reduction}{Which dimensional reduction (e.g. PCA, ICA) to use for the tSNE. Default is PCA} \item{features}{If set, run the tSNE on this subset of features (instead of running on a set of reduced dimensions). Not set (NULL) by default; \code{dims} must be NULL to run on features} \item{distance.matrix}{If set, runs tSNE on the given distance matrix instead of data matrix (experimental)} \item{reduction.name}{dimensional reduction name, specifies the position in the object$dr list. tsne by default} } \description{ Run t-SNE dimensionality reduction on selected features. Has the option of running in a reduced dimensional space (i.e. spectral tSNE, recommended), or running based on a set of genes. For details about stored TSNE calculation parameters, see \code{PrintTSNEParams}. } \concept{dimensional_reduction} Seurat/man/DISP.Rd0000644000176200001440000000071214731364135013325 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing5.R \name{DISP} \alias{DISP} \title{Find variable features based on dispersion} \usage{ DISP(data, nselect = 2000L, verbose = TRUE, ...) } \arguments{ \item{data}{Data matrix} \item{nselect}{Number of top features to select based on dispersion values} \item{verbose}{Display progress} } \description{ Find variable features based on dispersion } \keyword{internal} Seurat/man/ImageFeaturePlot.Rd0000644000176200001440000001070614744456127015776 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{ImageFeaturePlot} \alias{ImageFeaturePlot} \title{Spatial Feature Plots} \usage{ ImageFeaturePlot( object, features, fov = NULL, boundaries = NULL, cols = if (isTRUE(x = blend)) { c("lightgrey", "#ff0000", "#00ff00") } else { c("lightgrey", "firebrick1") }, size = 0.5, min.cutoff = NA, max.cutoff = NA, split.by = NULL, molecules = NULL, mols.size = 0.1, mols.cols = NULL, nmols = 1000, alpha = 1, border.color = "white", border.size = NULL, dark.background = TRUE, blend = FALSE, blend.threshold = 0.5, crop = FALSE, cells = NULL, scale = c("feature", "all", "none"), overlap = FALSE, axes = FALSE, combine = TRUE, coord.fixed = TRUE ) } \arguments{ \item{object}{Seurat object} \item{features}{Vector of features to plot. Features can come from: \itemize{ \item An \code{Assay} feature (e.g. a gene name - "MS4A1") \item A column name from meta.data (e.g. mitochondrial percentage - "percent.mito") \item A column name from a \code{DimReduc} object corresponding to the cell embedding values (e.g. the PC 1 scores - "PC_1") }} \item{fov}{Name of FOV to plot} \item{boundaries}{A vector of segmentation boundaries per image to plot; can be a character vector, a named character vector, or a named list. Names should be the names of FOVs and values should be the names of segmentation boundaries} \item{cols}{The two colors to form the gradient over. Provide as string vector with the first color corresponding to low values, the second to high. Also accepts a Brewer color scale or vector of colors. Note: this will bin the data into number of colors provided. When blend is \code{TRUE}, takes anywhere from 1-3 colors: \describe{ \item{1 color:}{Treated as color for double-negatives, will use default colors 2 and 3 for per-feature expression} \item{2 colors:}{Treated as colors for per-feature expression, will use default color 1 for double-negatives} \item{3+ colors:}{First color used for double-negatives, colors 2 and 3 used for per-feature expression, all others ignored} }} \item{size}{Point size for cells when plotting centroids} \item{min.cutoff, max.cutoff}{Vector of minimum and maximum cutoff values for each feature, may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10')} \item{split.by}{A factor in object metadata to split the plot by, pass 'ident' to split by cell identity} \item{molecules}{A vector of molecules to plot} \item{mols.size}{Point size for molecules} \item{mols.cols}{A vector of color for molecules. The "Set1" palette from RColorBrewer is used by default.} \item{nmols}{Max number of each molecule specified in `molecules` to plot} \item{alpha}{Alpha value for plotting (default is 1)} \item{border.color}{Color of cell segmentation border; pass \code{NA} to suppress borders for segmentation-based plots} \item{border.size}{Thickness of cell segmentation borders; pass \code{NA} to suppress borders for centroid-based plots} \item{dark.background}{Set plot background to black} \item{blend}{Scale and blend expression values to visualize coexpression of two features} \item{blend.threshold}{The color cutoff from weak signal to strong signal; ranges from 0 to 1.} \item{crop}{Crop the plots to area with cells only} \item{cells}{Vector of cells to plot (default is all cells)} \item{scale}{Set color scaling across multiple plots; choose from: \itemize{ \item \dQuote{\code{feature}}: Plots per-feature are scaled across splits \item \dQuote{\code{all}}: Plots per-feature are scaled across all features \item \dQuote{\code{none}}: Plots are not scaled; \strong{note}: setting \code{scale} to \dQuote{\code{none}} will result in color scales that are \emph{not} comparable between plots } Ignored if \code{blend = TRUE}} \item{overlap}{Overlay boundaries from a single image to create a single plot; if \code{TRUE}, then boundaries are stacked in the order they're given (first is lowest)} \item{axes}{Keep axes and panel background} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} \item{coord.fixed}{Plot cartesian coordinates with fixed aspect ratio} } \value{ If \code{combine = TRUE}, a \code{patchwork} ggplot object; otherwise, a list of ggplot objects } \description{ Visualize expression in a spatial context } \concept{spatial} \concept{visualization} Seurat/man/CellSelector.Rd0000644000176200001440000000234014731364134015144 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{CellSelector} \alias{CellSelector} \alias{FeatureLocator} \title{Cell Selector} \usage{ CellSelector(plot, object = NULL, ident = "SelectedCells", ...) FeatureLocator(plot, ...) } \arguments{ \item{plot}{A ggplot2 plot} \item{object}{An optional Seurat object; if passes, will return an object with the identities of selected cells set to \code{ident}} \item{ident}{An optional new identity class to assign the selected cells} \item{...}{Ignored} } \value{ If \code{object} is \code{NULL}, the names of the points selected; otherwise, a Seurat object with the selected cells identity classes set to \code{ident} } \description{ Select points on a scatterplot and get information about them } \examples{ \dontrun{ data("pbmc_small") plot <- DimPlot(object = pbmc_small) # Follow instructions in the terminal to select points cells.located <- CellSelector(plot = plot) cells.located # Automatically set the identity class of selected cells and return a new Seurat object pbmc_small <- CellSelector(plot = plot, object = pbmc_small, ident = 'SelectedCells') } } \seealso{ \code{\link{DimPlot}} \code{\link{FeaturePlot}} } \concept{visualization} Seurat/man/roxygen/0000755000176200001440000000000014657705516014003 5ustar liggesusersSeurat/man/roxygen/templates/0000755000176200001440000000000014730427000015756 5ustar liggesusersSeurat/man/roxygen/templates/note-reqdpkg.R0000644000176200001440000000021114670622051020501 0ustar liggesusers#' @note This function requires the #' \href{https://cran.r-project.org/package=<%= pkg %>}{\pkg{<%= pkg %>}} package #' to be installed Seurat/man/roxygen/templates/section-future.R0000644000176200001440000000132714670622051021066 0ustar liggesusers#' @section Parallelization with \pkg{future}: #' This function uses #' \href{https://cran.r-project.org/package=future}{\pkg{future}} to enable #' parallelization. Parallelization strategies can be set using #' \code{\link[future]{plan}}. Common plans include \dQuote{\code{sequential}} #' for non-parallelized processing or \dQuote{\code{multisession}} for parallel #' evaluation using multiple \R sessions; for other plans, see the #' \dQuote{Implemented evaluation strategies} section of #' \code{\link[future:plan]{?future::plan}}. For a more thorough introduction #' to \pkg{future}, see #' \href{https://future.futureverse.org/articles/future-1-overview.html}{\code{vignette("future-1-overview")}} #' #' @concept future Seurat/man/roxygen/templates/param-dotsm.R0000644000176200001440000000006114730427000020322 0ustar liggesusers#' @param ... Arguments passed to other methods Seurat/man/roxygen/templates/section-progressr.R0000644000176200001440000000104714670622051021601 0ustar liggesusers#' @section Progress Updates with \pkg{progressr}: #' This function uses #' \href{https://cran.r-project.org/package=progressr}{\pkg{progressr}} to #' render status updates and progress bars. To enable progress updates, wrap #' the function call in \code{\link[progressr]{with_progress}} or run #' \code{\link[progressr:handlers]{handlers(global = TRUE)}} before running #' this function. For more details about \pkg{progressr}, please read #' \href{https://progressr.futureverse.org/articles/progressr-intro.html}{\code{vignette("progressr-intro")}} Seurat/man/roxygen/templates/param-dotsi.R0000644000176200001440000000002614730427000020317 0ustar liggesusers#' @param ... Ignored Seurat/man/roxygen/templates/seealso-methods.R0000644000176200001440000000011014670622051021173 0ustar liggesusers#' @seealso \code{<%= cls %>} methods: \code{\link{<%= cls %>-methods}} Seurat/man/RunSPCA.Rd0000644000176200001440000000472614744463014014012 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/generics.R, R/dimensional_reduction.R \name{RunSPCA} \alias{RunSPCA} \alias{RunSPCA.default} \alias{RunSPCA.Assay} \alias{RunSPCA.Assay5} \alias{RunSPCA.Seurat} \title{Run Supervised Principal Component Analysis} \usage{ RunSPCA(object, ...) \method{RunSPCA}{default}( object, assay = NULL, npcs = 50, reduction.key = "SPC_", graph = NULL, verbose = FALSE, seed.use = 42, ... ) \method{RunSPCA}{Assay}( object, assay = NULL, features = NULL, npcs = 50, reduction.key = "SPC_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) \method{RunSPCA}{Assay5}( object, assay = NULL, features = NULL, npcs = 50, reduction.key = "SPC_", graph = NULL, verbose = TRUE, seed.use = 42, layer = "scale.data", ... ) \method{RunSPCA}{Seurat}( object, assay = NULL, features = NULL, npcs = 50, reduction.name = "spca", reduction.key = "SPC_", graph = NULL, verbose = TRUE, seed.use = 42, ... ) } \arguments{ \item{object}{An object} \item{...}{Arguments passed to other methods and IRLBA} \item{assay}{Name of Assay SPCA is being run on} \item{npcs}{Total Number of SPCs to compute and store (50 by default)} \item{reduction.key}{dimensional reduction key, specifies the string before the number for the dimension names. SPC by default} \item{graph}{Graph used supervised by SPCA} \item{verbose}{Print the top genes associated with high/low loadings for the SPCs} \item{seed.use}{Set a random seed. By default, sets the seed to 42. Setting NULL will not set a seed.} \item{features}{Features to compute SPCA on. If features=NULL, SPCA will be run using the variable features for the Assay.} \item{layer}{Layer to run SPCA on} \item{reduction.name}{dimensional reduction name, spca by default} } \value{ Returns Seurat object with the SPCA calculation stored in the reductions slot } \description{ Run a supervised PCA (SPCA) dimensionality reduction supervised by a cell-cell kernel. SPCA is used to capture a linear transformation which maximizes its dependency to the given cell-cell kernel. We use SNN graph as the kernel to supervise the linear matrix factorization. } \references{ Barshan E, Ghodsi A, Azimifar Z, Jahromi MZ. Supervised principal component analysis: Visualization, classification and regression on subspaces and submanifolds. Pattern Recognition. 2011 Jul 1;44(7):1357-71. \url{doi:10.1016/j.patcog.2010.12.015}; } \concept{dimensional_reduction} Seurat/man/L2CCA.Rd0000644000176200001440000000054114731364134013351 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensional_reduction.R \name{L2CCA} \alias{L2CCA} \title{L2-Normalize CCA} \usage{ L2CCA(object, ...) } \arguments{ \item{object}{Seurat object} \item{\dots}{Additional parameters to L2Dim.} } \description{ Perform l2 normalization on CCs } \concept{dimensional_reduction} Seurat/man/SeuratCommand-class.Rd0000644000176200001440000000062214731364133016431 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexports.R \docType{class} \name{SeuratCommand-class} \alias{SeuratCommand-class} \title{The SeuratCommand Class} \description{ For more details, please see the documentation in \code{\link[SeuratObject:SeuratCommand]{SeuratObject}} } \seealso{ \code{\link[SeuratObject:SeuratCommand]{SeuratObject::SeuratCommand-class}} } Seurat/man/Read10X_ScaleFactors.Rd0000644000176200001440000000065214731364135016366 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X_ScaleFactors} \alias{Read10X_ScaleFactors} \title{Load 10X Genomics Visium Scale Factors} \usage{ Read10X_ScaleFactors(filename) } \arguments{ \item{filename}{Path to a \code{scalefactors_json.json} file} } \value{ A scalefactors object } \description{ Load 10X Genomics Visium Scale Factors } \concept{preprocessing} Seurat/man/IntegrateLayers.Rd0000644000176200001440000000221214731364134015664 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration5.R \name{IntegrateLayers} \alias{IntegrateLayers} \title{Integrate Layers} \usage{ IntegrateLayers( object, method, orig.reduction = "pca", assay = NULL, features = NULL, layers = NULL, scale.layer = "scale.data", ... ) } \arguments{ \item{object}{A \code{\link[SeuratObject]{Seurat}} object} \item{method}{Integration method function} \item{orig.reduction}{Name of dimensional reduction for correction} \item{assay}{Name of assay for integration} \item{features}{A vector of features to use for integration} \item{layers}{Names of normalized layers in \code{assay}} \item{scale.layer}{Name(s) of scaled layer(s) in \code{assay}} \item{...}{Arguments passed on to \code{method}} } \value{ \code{object} with integration data added to it } \description{ Integrate Layers } \section{Integration Method Functions}{ The following integration method functions are available: \Sexpr[stage=render,results=rd]{Seurat:::.rd_methods("integration")} } \seealso{ \link[Seurat:writing-integration]{Writing integration method functions} } \concept{integration} Seurat/man/FindBridgeAnchor.Rd0000644000176200001440000000543514731364134015724 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/integration.R \name{FindBridgeAnchor} \alias{FindBridgeAnchor} \title{Find bridge anchors between two unimodal datasets} \usage{ FindBridgeAnchor( object.list, bridge.object, object.reduction, bridge.reduction, anchor.type = c("Transfer", "Integration"), reference = NULL, laplacian.reduction = "lap", laplacian.dims = 1:50, reduction = c("direct", "cca"), bridge.assay.name = "Bridge", reference.bridge.stored = FALSE, k.anchor = 20, k.score = 50, verbose = TRUE, ... ) } \arguments{ \item{object.list}{A list of Seurat objects} \item{bridge.object}{A multi-omic bridge Seurat which is used as the basis to represent unimodal datasets} \item{object.reduction}{A list of dimensional reductions from object.list used to be reconstructed by bridge.object} \item{bridge.reduction}{A list of dimensional reductions from bridge.object used to reconstruct object.reduction} \item{anchor.type}{The type of anchors. Can be one of: \itemize{ \item{Integration: Generate IntegrationAnchors for integration} \item{Transfer: Generate TransferAnchors for transfering data} }} \item{reference}{A vector specifying the object/s to be used as a reference during integration or transfer data.} \item{laplacian.reduction}{Name of bridge graph laplacian dimensional reduction} \item{laplacian.dims}{Dimensions used for bridge graph laplacian dimensional reduction} \item{reduction}{Dimensional reduction to perform when finding anchors. Can be one of: \itemize{ \item{cca: Canonical correlation analysis} \item{direct: Use assay data as a dimensional reduction} }} \item{bridge.assay.name}{Assay name used for bridge object reconstruction value (default is 'Bridge')} \item{reference.bridge.stored}{If refernece has stored the bridge dictionary representation} \item{k.anchor}{How many neighbors (k) to use when picking anchors} \item{k.score}{How many neighbors (k) to use when scoring anchors} \item{verbose}{Print messages and progress} \item{...}{Additional parameters passed to \code{FindIntegrationAnchors} or \code{FindTransferAnchors}} } \value{ Returns an \code{\link{AnchorSet}} object that can be used as input to \code{\link{IntegrateEmbeddings}}.or \code{\link{MapQuery}} } \description{ First, bridge object is used to reconstruct two single-modality profiles and then project those cells into bridage graph laplacian space. Next, find a set of anchors between two single-modality objects. These anchors can later be used to integrate embeddings or transfer data from the reference to query object using the \code{\link{MapQuery}} object. } \details{ \itemize{ \item{ Bridge cells reconstruction } \item{ Find anchors between objects. It can be either IntegrationAnchors or TransferAnchor. } } } \keyword{internal} Seurat/man/RidgePlot.Rd0000644000176200001440000000374114731364134014463 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{RidgePlot} \alias{RidgePlot} \title{Single cell ridge plot} \usage{ RidgePlot( object, features, cols = NULL, idents = NULL, sort = FALSE, assay = NULL, group.by = NULL, y.max = NULL, same.y.lims = FALSE, log = FALSE, ncol = NULL, slot = deprecated(), layer = "data", stack = FALSE, combine = TRUE, fill.by = "feature" ) } \arguments{ \item{object}{Seurat object} \item{features}{Features to plot (gene expression, metrics, PC scores, anything that can be retreived by FetchData)} \item{cols}{Colors to use for plotting} \item{idents}{Which classes to include in the plot (default is all)} \item{sort}{Sort identity classes (on the x-axis) by the average expression of the attribute being potted, can also pass 'increasing' or 'decreasing' to change sort direction} \item{assay}{Name of assay to use, defaults to the active assay} \item{group.by}{Group (color) cells in different ways (for example, orig.ident)} \item{y.max}{Maximum y axis value} \item{same.y.lims}{Set all the y-axis limits to the same values} \item{log}{plot the feature axis on log scale} \item{ncol}{Number of columns if multiple plots are displayed} \item{slot}{Slot to pull expression data from (e.g. "counts" or "data")} \item{layer}{Layer to pull expression data from (e.g. "counts" or "data")} \item{stack}{Horizontally stack plots for each feature} \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot} \item{fill.by}{Color violins/ridges based on either 'feature' or 'ident'} } \value{ A \code{\link[patchwork]{patchwork}ed} ggplot object if \code{combine = TRUE}; otherwise, a list of ggplot objects } \description{ Draws a ridge plot of single cell data (gene expression, metrics, PC scores, etc.) } \examples{ data("pbmc_small") RidgePlot(object = pbmc_small, features = 'PC_1') } \concept{visualization} Seurat/man/ElbowPlot.Rd0000644000176200001440000000144014731364134014473 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{ElbowPlot} \alias{ElbowPlot} \title{Quickly Pick Relevant Dimensions} \usage{ ElbowPlot(object, ndims = 20, reduction = "pca") } \arguments{ \item{object}{Seurat object} \item{ndims}{Number of dimensions to plot standard deviation for} \item{reduction}{Reduction technique to plot standard deviation for} } \value{ A ggplot object } \description{ Plots the standard deviations (or approximate singular values if running PCAFast) of the principle components for easy identification of an elbow in the graph. This elbow often corresponds well with the significant dims and is much faster to run than Jackstraw } \examples{ data("pbmc_small") ElbowPlot(object = pbmc_small) } \concept{visualization} Seurat/man/PCASigGenes.Rd0000644000176200001440000000206414731364134014617 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensional_reduction.R \name{PCASigGenes} \alias{PCASigGenes} \title{Significant genes from a PCA} \usage{ PCASigGenes( object, pcs.use, pval.cut = 0.1, use.full = FALSE, max.per.pc = NULL ) } \arguments{ \item{object}{Seurat object} \item{pcs.use}{PCS to use.} \item{pval.cut}{P-value cutoff} \item{use.full}{Use the full list of genes (from the projected PCA). Assumes that \code{ProjectDim} has been run. Currently, must be set to FALSE.} \item{max.per.pc}{Maximum number of genes to return per PC. Used to avoid genes from one PC dominating the entire analysis.} } \value{ A vector of genes whose p-values are statistically significant for at least one of the given PCs. } \description{ Returns a set of genes, based on the JackStraw analysis, that have statistically significant associations with a set of PCs. } \examples{ data("pbmc_small") PCASigGenes(pbmc_small, pcs.use = 1:2) } \seealso{ \code{\link{ProjectDim}} \code{\link{JackStraw}} } \concept{dimensional_reduction} Seurat/man/CalcDispersion.Rd0000644000176200001440000000136014731364135015470 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing5.R \name{CalcDispersion} \alias{CalcDispersion} \title{Calculate dispersion of features} \usage{ CalcDispersion( object, mean.function = FastExpMean, dispersion.function = FastLogVMR, num.bin = 20, binning.method = "equal_width", verbose = TRUE, ... ) } \arguments{ \item{object}{Data matrix} \item{mean.function}{Function to calculate mean} \item{dispersion.function}{Function to calculate dispersion} \item{num.bin}{Number of bins to use} \item{binning.method}{Method to use for binning. Options are 'equal_width' or 'equal_frequency'} \item{verbose}{Display progress} } \description{ Calculate dispersion of features } \keyword{internal} Seurat/man/SingleImageMap.Rd0000644000176200001440000000113514731364134015407 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{SingleImageMap} \alias{SingleImageMap} \title{A single heatmap from base R using \code{\link[graphics]{image}}} \usage{ SingleImageMap(data, order = NULL, title = NULL) } \arguments{ \item{data}{matrix of data to plot} \item{order}{optional vector of cell names to specify order in plot} \item{title}{Title for plot} } \value{ No return, generates a base-R heatmap using \code{\link[graphics]{image}} } \description{ A single heatmap from base R using \code{\link[graphics]{image}} } \keyword{internal} Seurat/man/LabelPoints.Rd0000644000176200001440000000245014731364134015002 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{LabelPoints} \alias{LabelPoints} \alias{Labeler} \title{Add text labels to a ggplot2 plot} \usage{ LabelPoints( plot, points, labels = NULL, repel = FALSE, xnudge = 0.3, ynudge = 0.05, ... ) } \arguments{ \item{plot}{A ggplot2 plot with a GeomPoint layer} \item{points}{A vector of points to label; if \code{NULL}, will use all points in the plot} \item{labels}{A vector of labels for the points; if \code{NULL}, will use rownames of the data provided to the plot at the points selected} \item{repel}{Use \code{geom_text_repel} to create a nicely-repelled labels; this is slow when a lot of points are being plotted. If using \code{repel}, set \code{xnudge} and \code{ynudge} to 0} \item{xnudge, ynudge}{Amount to nudge X and Y coordinates of labels by} \item{...}{Extra parameters passed to \code{geom_text}} } \value{ A ggplot object } \description{ Add text labels to a ggplot2 plot } \examples{ data("pbmc_small") ff <- TopFeatures(object = pbmc_small[['pca']]) cc <- TopCells(object = pbmc_small[['pca']]) plot <- FeatureScatter(object = pbmc_small, feature1 = ff[1], feature2 = ff[2]) LabelPoints(plot = plot, points = cc) } \seealso{ \code{\link[ggplot2]{geom_text}} } \concept{visualization} Seurat/man/BGTextColor.Rd0000644000176200001440000000223514731364134014723 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{BGTextColor} \alias{BGTextColor} \title{Determine text color based on background color} \source{ \url{https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color} } \usage{ BGTextColor( background, threshold = 186, w3c = FALSE, dark = "black", light = "white" ) } \arguments{ \item{background}{A vector of background colors; supports R color names and hexadecimal codes} \item{threshold}{Intensity threshold for light/dark cutoff; intensities greater than \code{theshold} yield \code{dark}, others yield \code{light}} \item{w3c}{Use \href{https://www.w3.org/TR/WCAG20/}{W3C} formula for calculating background text color; ignores \code{threshold}} \item{dark}{Color for dark text} \item{light}{Color for light text} } \value{ A named vector of either \code{dark} or \code{light}, depending on \code{background}; names of vector are \code{background} } \description{ Determine text color based on background color } \examples{ BGTextColor(background = c('black', 'white', '#E76BF3')) } \concept{visualization} Seurat/man/Read10X_Image.Rd0000644000176200001440000000207014744456127015042 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/preprocessing.R \name{Read10X_Image} \alias{Read10X_Image} \title{Load a 10X Genomics Visium Image} \usage{ Read10X_Image( image.dir, image.name = "tissue_lowres_image.png", assay = "Spatial", slice = "slice1", filter.matrix = TRUE, image.type = "VisiumV2" ) } \arguments{ \item{image.dir}{Path to directory with 10X Genomics visium image data; should include files \code{tissue_lowres_image.png}, \code{scalefactors_json.json} and \code{tissue_positions_list.csv}} \item{image.name}{PNG file to read in} \item{assay}{Name of associated assay} \item{slice}{Name for the image, used to populate the instance's key} \item{filter.matrix}{Filter spot/feature matrix to only include spots that have been determined to be over tissue} \item{image.type}{Image type to return, one of: "VisiumV1" or "VisiumV2"} } \value{ A \code{\link{VisiumV2}} object } \description{ Load a 10X Genomics Visium Image } \seealso{ \code{\link{VisiumV2}} \code{\link{Load10X_Spatial}} } \concept{preprocessing} Seurat/man/as.sparse.Rd0000644000176200001440000000256714731364135014477 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R, R/utilities.R \name{as.sparse.H5Group} \alias{as.sparse.H5Group} \alias{as.data.frame.Matrix} \title{Cast to Sparse} \usage{ \method{as.sparse}{H5Group}(x, ...) \method{as.data.frame}{Matrix}( x, row.names = NULL, optional = FALSE, ..., stringsAsFactors = getOption(x = "stringsAsFactors", default = FALSE) ) } \arguments{ \item{x}{An object} \item{...}{Arguments passed to other methods} \item{row.names}{\code{NULL} or a character vector giving the row names for the data; missing values are not allowed} \item{optional}{logical. If \code{TRUE}, setting row names and converting column names (to syntactic names: see \code{\link[base]{make.names}}) is optional. Note that all of \R's \pkg{base} package \code{as.data.frame()} methods use \code{optional} only for column names treatment, basically with the meaning of \code{\link[base]{data.frame}(*, check.names = !optional)}. See also the \code{make.names} argument of the \code{matrix} method.} \item{stringsAsFactors}{logical: should the character vector be converted to a factor?} } \value{ \code{as.data.frame.Matrix}: A data frame representation of the S4 Matrix } \description{ Cast to Sparse } \seealso{ \code{\link[SeuratObject:as.sparse]{SeuratObject::as.sparse}} } \concept{objects} \concept{utilities} Seurat/man/PredictAssay.Rd0000644000176200001440000000255514744456127015177 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clustering.R \name{PredictAssay} \alias{PredictAssay} \title{Predict value from nearest neighbors} \usage{ PredictAssay( object, nn.idx, assay, reduction = NULL, dims = NULL, return.assay = TRUE, slot = "scale.data", features = NULL, mean.function = rowMeans, seed = 4273, verbose = TRUE ) } \arguments{ \item{object}{The object used to calculate knn} \item{nn.idx}{k near neighbor indices. A cells x k matrix.} \item{assay}{Assay used for prediction} \item{reduction}{Cell embedding of the reduction used for prediction} \item{dims}{Number of dimensions of cell embedding} \item{return.assay}{Return an assay or a predicted matrix} \item{slot}{slot used for prediction} \item{features}{features used for prediction} \item{mean.function}{the function used to calculate row mean} \item{seed}{Sets the random seed to check if the nearest neighbor is query cell} \item{verbose}{Print progress} } \value{ return an assay containing predicted expression value in the data slot } \description{ This function will predict expression or cell embeddings from its k nearest neighbors index. For each cell, it will average its k neighbors value to get its new imputed value. It can average expression value in assays and cell embeddings from dimensional reductions. } \concept{integration} Seurat/man/BuildClusterTree.Rd0000644000176200001440000000400314731364135016004 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tree.R \name{BuildClusterTree} \alias{BuildClusterTree} \title{Phylogenetic Analysis of Identity Classes} \usage{ BuildClusterTree( object, assay = NULL, features = NULL, dims = NULL, reduction = "pca", graph = NULL, slot = "data", reorder = FALSE, reorder.numeric = FALSE, verbose = TRUE ) } \arguments{ \item{object}{Seurat object} \item{assay}{Assay to use for the analysis.} \item{features}{Genes to use for the analysis. Default is the set of variable genes (\code{VariableFeatures(object = object)})} \item{dims}{If set, tree is calculated in dimension reduction space; overrides \code{features}} \item{reduction}{Name of dimension reduction to use. Only used if \code{dims} is not NULL.} \item{graph}{If graph is passed, build tree based on graph connectivity between clusters; overrides \code{dims} and \code{features}} \item{slot}{slot/layer to use.} \item{reorder}{Re-order identity classes (factor ordering), according to position on the tree. This groups similar classes together which can be helpful, for example, when drawing violin plots.} \item{reorder.numeric}{Re-order identity classes according to position on the tree, assigning a numeric value ('1' is the leftmost node)} \item{verbose}{Show progress updates} } \value{ A Seurat object where the cluster tree can be accessed with \code{\link{Tool}} } \description{ Constructs a phylogenetic tree relating the 'aggregate' cell from each identity class. Tree is estimated based on a distance matrix constructed in either gene expression space or PCA space. } \details{ Note that the tree is calculated for an 'aggregate' cell, so gene expression or PC scores are summed across all cells in an identity class before the tree is constructed. } \examples{ \dontrun{ if (requireNamespace("ape", quietly = TRUE)) { data("pbmc_small") pbmc_small pbmc_small <- BuildClusterTree(object = pbmc_small) Tool(object = pbmc_small, slot = 'BuildClusterTree') } } } \concept{tree} Seurat/man/TopNeighbors.Rd0000644000176200001440000000075414744463014015177 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/objects.R \name{TopNeighbors} \alias{TopNeighbors} \title{Get nearest neighbors for given cell} \usage{ TopNeighbors(object, cell, n = 5) } \arguments{ \item{object}{\code{\link[SeuratObject]{Neighbor}} object} \item{cell}{Cell of interest} \item{n}{Number of neighbors to return} } \value{ Returns a vector of cell names } \description{ Return a vector of cell names of the nearest n cells. } \concept{objects} Seurat/man/GroupCorrelation.Rd0000644000176200001440000000212514731364135016064 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utilities.R \name{GroupCorrelation} \alias{GroupCorrelation} \title{Compute the correlation of features broken down by groups with another covariate} \usage{ GroupCorrelation( object, assay = NULL, slot = "scale.data", var = NULL, group.assay = NULL, min.cells = 5, ngroups = 6, do.plot = TRUE ) } \arguments{ \item{object}{Seurat object} \item{assay}{Assay to pull the data from} \item{slot}{Slot in the assay to pull feature expression data from (counts, data, or scale.data)} \item{var}{Variable with which to correlate the features} \item{group.assay}{Compute the gene groups based off the data in this assay.} \item{min.cells}{Only compute for genes in at least this many cells} \item{ngroups}{Number of groups to split into} \item{do.plot}{Display the group correlation boxplot (via \code{GroupCorrelationPlot})} } \value{ A Seurat object with the correlation stored in metafeatures } \description{ Compute the correlation of features broken down by groups with another covariate } \concept{utilities} Seurat/man/HoverLocator.Rd0000644000176200001440000000167414731364134015204 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/visualization.R \name{HoverLocator} \alias{HoverLocator} \title{Hover Locator} \usage{ HoverLocator(plot, information = NULL, axes = TRUE, dark.theme = FALSE, ...) } \arguments{ \item{plot}{A ggplot2 plot} \item{information}{An optional dataframe or matrix of extra information to be displayed on hover} \item{axes}{Display or hide x- and y-axes} \item{dark.theme}{Plot using a dark theme?} \item{...}{Extra parameters to be passed to \code{\link[plotly]{layout}}} } \description{ Get quick information from a scatterplot by hovering over points } \examples{ \dontrun{ data("pbmc_small") plot <- DimPlot(object = pbmc_small) HoverLocator(plot = plot, information = FetchData(object = pbmc_small, vars = 'percent.mito')) } } \seealso{ \code{\link[plotly]{layout}} \code{\link[ggplot2]{ggplot_build}} \code{\link{DimPlot}} \code{\link{FeaturePlot}} } \concept{visualization} Seurat/DESCRIPTION0000644000176200001440000001566214744634036013250 0ustar liggesusersPackage: Seurat Version: 5.2.1 Title: Tools for Single Cell Genomics Description: A toolkit for quality control, analysis, and exploration of single cell RNA sequencing data. 'Seurat' aims to enable users to identify and interpret sources of heterogeneity from single cell transcriptomic measurements, and to integrate diverse types of single cell data. See Satija R, Farrell J, Gennert D, et al (2015) , Macosko E, Basu A, Satija R, et al (2015) , Stuart T, Butler A, et al (2019) , and Hao, Hao, et al (2020) for more details. Authors@R: c( person(given = "Andrew", family = "Butler", email = "abutler@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0003-3608-0463")), person(given = "Saket", family = "Choudhary", email = "schoudhary@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0001-5202-7633")), person(given = 'David', family = 'Collins', email = 'dcollins@nygenome.org', role = 'ctb', comment = c(ORCID = '0000-0001-9243-7821')), person(given = "Charlotte", family = "Darby", email = "cdarby@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0003-2195-5300")), person(given = "Jeff", family = "Farrell", email = "jfarrell@g.harvard.edu", role = "ctb"), person(given = "Isabella", family = "Grabski", email = "igrabski@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0002-0616-5469")), person(given = "Christoph", family = "Hafemeister", email = "chafemeister@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0001-6365-8254")), person(given = "Yuhan", family = "Hao", email = "yhao@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0002-1810-0822")), person(given = "Austin", family = "Hartman", email = "ahartman@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0001-7278-1852")), person(given = "Paul", family = "Hoffman", email = "hoff0792@umn.edu", role = "ctb", comment = c(ORCID = "0000-0002-7693-8957")), person(given = "Jaison", family = "Jain", email = "jjain@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0002-9478-5018")), person(given = "Longda", family = "Jiang", email = "ljiang@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0003-4964-6497")), person(given = "Madeline", family = "Kowalski", email = "mkowalski@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0002-5655-7620")), person(given = "Skylar", family = "Li", email = "sli@nygenome.org", role = "ctb"), person(given = "Gesmira", family = "Molla", email = 'gmolla@nygenome.org', role = 'ctb', comment = c(ORCID = '0000-0002-8628-5056')), person(given = "Efthymia", family = "Papalexi", email = "epapalexi@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0001-5898-694X")), person(given = "Patrick", family = "Roelli", email = "proelli@nygenome.org", role = "ctb"), person(given = "Rahul", family = "Satija", email = "seurat@nygenome.org", role = c("aut", "cre"), comment = c(ORCID = "0000-0001-9448-8833")), person(given = "Karthik", family = "Shekhar", email = "kshekhar@berkeley.edu", role = "ctb"), person(given = "Avi", family = "Srivastava", email = "asrivastava@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0001-9798-2079")), person(given = "Tim", family = "Stuart", email = "tstuart@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0002-3044-0897")), person(given = "Kristof", family = "Torkenczy", email = "", role = "ctb", comment = c(ORCID = "0000-0002-4869-7957")), person(given = "Shiwei", family = "Zheng", email = "szheng@nygenome.org", role = "ctb", comment = c(ORCID = "0000-0001-6682-6743")), person("Satija Lab and Collaborators", role = "fnd") ) License: MIT + file LICENSE URL: https://satijalab.org/seurat, https://github.com/satijalab/seurat BugReports: https://github.com/satijalab/seurat/issues Additional_repositories: https://satijalab.r-universe.dev, https://bnprks.r-universe.dev Depends: R (>= 4.0.0), methods, SeuratObject (>= 5.0.2) Imports: cluster, cowplot, fastDummies, fitdistrplus, future, future.apply, generics (>= 0.1.3), ggplot2 (>= 3.3.0), ggrepel, ggridges, graphics, grDevices, grid, httr, ica, igraph, irlba, jsonlite, KernSmooth, leidenbase, lifecycle, lmtest, MASS, Matrix (>= 1.5-0), matrixStats, miniUI, patchwork, pbapply, plotly (>= 4.9.0), png, progressr, RANN, RColorBrewer, Rcpp (>= 1.0.7), RcppAnnoy (>= 0.0.18), RcppHNSW, reticulate, rlang, ROCR, RSpectra, Rtsne, scales, scattermore (>= 1.2), sctransform (>= 0.4.1), shiny, spatstat.explore, spatstat.geom, stats, tibble, tools, utils, uwot (>= 0.1.10) Suggests: ape, arrow, Biobase, BiocGenerics, BPCells, data.table, DESeq2, DelayedArray, enrichR, GenomicRanges, GenomeInfoDb, glmGamPoi, ggrastr, harmony, hdf5r, IRanges, limma, MAST, metap, mixtools, monocle, presto, rsvd, R.utils, Rfast2, rtracklayer, S4Vectors, sf (>= 1.0.0), SingleCellExperiment, SummarizedExperiment, testthat, VGAM LinkingTo: Rcpp (>= 0.11.0), RcppEigen, RcppProgress BuildManual: true Encoding: UTF-8 LazyData: true RoxygenNote: 7.3.2 Collate: 'RcppExports.R' 'reexports.R' 'generics.R' 'clustering.R' 'visualization.R' 'convenience.R' 'data.R' 'differential_expression.R' 'dimensional_reduction.R' 'integration.R' 'zzz.R' 'integration5.R' 'mixscape.R' 'objects.R' 'preprocessing.R' 'preprocessing5.R' 'roxygen.R' 'sketching.R' 'tree.R' 'utilities.R' NeedsCompilation: yes Packaged: 2025-01-23 17:11:30 UTC; root Author: Andrew Butler [ctb] (), Saket Choudhary [ctb] (), David Collins [ctb] (), Charlotte Darby [ctb] (), Jeff Farrell [ctb], Isabella Grabski [ctb] (), Christoph Hafemeister [ctb] (), Yuhan Hao [ctb] (), Austin Hartman [ctb] (), Paul Hoffman [ctb] (), Jaison Jain [ctb] (), Longda Jiang [ctb] (), Madeline Kowalski [ctb] (), Skylar Li [ctb], Gesmira Molla [ctb] (), Efthymia Papalexi [ctb] (), Patrick Roelli [ctb], Rahul Satija [aut, cre] (), Karthik Shekhar [ctb], Avi Srivastava [ctb] (), Tim Stuart [ctb] (), Kristof Torkenczy [ctb] (), Shiwei Zheng [ctb] (), Satija Lab and Collaborators [fnd] Maintainer: Rahul Satija Repository: CRAN Date/Publication: 2025-01-24 06:50:06 UTC