graph/DESCRIPTION0000644000175100017510000000211012607321273014376 0ustar00biocbuildbiocbuildPackage: graph Title: graph: A package to handle graph data structures Version: 1.48.0 Author: R. Gentleman, Elizabeth Whalen, W. Huber, S. Falcon Description: A package that implements some simple graph handling capabilities. Maintainer: Bioconductor Package Maintainer License: Artistic-2.0 Depends: R (>= 2.10), methods Imports: stats, stats4, tools, utils, BiocGenerics (>= 0.13.11) Suggests: SparseM (>= 0.36), XML, RBGL, RUnit, cluster Enhances: Rgraphviz Collate: AllClasses.R AllGenerics.R bitarray.R buildDepGraph.R methods-graph.R graphNEL.R clustergraph.R NELhandler.R edgefunctions.R graphfunctions.R GXLformals.R gxlReader.R random.R write.tlp.R mat2graph.R settings.R zzz.R standardLabeling.R TODOT.R toDotWithRI.R methods-graphAM.R attrData.R reverseEdgeDirections.R nodes-methods.R methods-multiGraph.R test_graph_package.R MultiGraph.R methods-graphBAM.R graph-constructors.R LazyLoad: yes Packaged: 2015-10-14 00:32:59 UTC; biocbuild biocViews: GraphAndNetwork NeedsCompilation: yes graph/NAMESPACE0000644000175100017510000000566712607264574014145 0ustar00biocbuildbiocbuilduseDynLib(BioC_graph, graph_attrData_lookup, graph_bitarray_Intersect_Attrs, graph_bitarray_Union_Attrs, graph_bitarray_edgeSetToMatrix, graph_bitarray_getBitCell, graph_bitarray_getEdgeAttrOrder, graph_bitarray_removeEdges, graph_bitarray_rowColPos, graph_bitarray_set, graph_bitarray_subGraph, graph_bitarray_sum, graph_bitarray_transpose, graph_bitarray_undirect, graph_intersection, graph_is_adjacent, graph_listLen, graph_sublist_assign) importClassesFrom(methods, ANY, character, list, logical, matrix, missing, "NULL", numeric, oldClass, vector) importMethodsFrom(methods, coerce, initialize, show) importClassesFrom(BiocGenerics, connection, dist) importFrom(BiocGenerics, union) importFrom(methods, as, callGeneric, is, isVirtualClass, new, slot, "slot<-", slotNames, validObject) importFrom(stats, as.dist, dhyper, phyper, runif) importFrom(stats4, plot) importFrom(tools, package.dependencies) importFrom(utils, CRAN.packages, modifyList) exportClasses(dist, distGraph, clusterGraph, graph, graphNEL, graphAM, attrData, simpleEdge, edgeSet, edgeSetNEL, edgeSetAM, multiGraph, renderInfo, MultiGraph, graphBAM, graphBase) exportMethods(DFS, Dist, acc, addEdge, addNode, adj, adjacencyMatrix, clearNode, clusteringCoefficient, combineNodes, complement, connComp, degree, dumpGXL, edgeL, edgeMatrix, edgeNames, edgeWeights, edgemode, "edgemode<-", edges, "nodes<-", fromGXL, inEdges, initialize, intersection, intersection2, isAdjacent, isConnected, isDirected, join, nodes, numNodes, numEdges, plot, removeEdge, removeNode, show, subGraph, threshold, toGXL, union, validateGXL, coerce, toDotR, attrDefaults, "attrDefaults<-", edgeDataDefaults, "edgeDataDefaults<-", mgEdgeDataDefaults, "mgEdgeDataDefaults<-", nodeDataDefaults, "nodeDataDefaults<-", edgeData, "edgeData<-", nodeData, "nodeData<-", attrDataItem, "attrDataItem<-", "removeAttrDataItem<-", ugraph, leaves, updateGraph, extractFromTo, graphIntersect, graphUnion, removeEdgesByWeight, edgeSets) export(graphNEL, graphAM, boundary, buildRepDepGraph, calcProb, calcSumProb, duplicatedEdges, graph2SparseM, listEdges, randomEGraph, randomGraph, randomNodeGraph, validGraph, eWV, pathWeights, .dropEdges, aveNumEdges, sparseM2Graph, gxlTreeNEL, ftM2adjM, ftM2graphNEL, .ftM2other, int2ftM, ftM2int, aM2bpG, mostEdges, numNoEdges, reverseEdgeDirections, ugraphOld) export(graph.par, graph.par.get, graphRenderInfo, nodeRenderInfo, edgeRenderInfo, parRenderInfo, "nodeRenderInfo<-", "edgeRenderInfo<-", "parRenderInfo<-", "graphRenderInfo<-", toDotWithRI) export(graphBAM) export(MultiGraph, eweights, edgeSetIntersect0, edgeSetUnion0, extractFromTo, subsetEdgeSets, extractGraphAM, extractGraphBAM, mgEdgeData, "mgEdgeData<-") S3method(write,tlp) graph/R/0000755000175100017510000000000012607264574013111 5ustar00biocbuildbiocbuildgraph/R/AllClasses.R0000644000175100017510000000720012607264574015261 0ustar00biocbuildbiocbuild## Classes for representing graphs setClass("attrData", representation(data="list", defaults="list")) ## (FH Oct 4.) The edgemode slot is deprecated, the information will ## go into the egemode item of the graphData list. setClass("graphBase") ## class to hold information regarding rendering of a graph. Doesn't ## make sense except as a slot in a graph (the names have to match) setClass("renderInfo", representation(nodes="list", # information on nodes edges="list", # information on edges graph="list", pars="list")) # list passed on to graph.par before rendering setClass("graph", representation(## edgemode="character", edgeData="attrData", nodeData="attrData", renderInfo="renderInfo", ## nodeInfo="list", ## edgeInfo="list", graphData="list", "VIRTUAL"), contains = "graphBase") ## Node Edge List representation setClass("graphNEL", contains="graph", representation(nodes="vector", edgeL="list"), validity=function(object) validGraph(object)) ## Adjacency Matrix representation setClass("graphAM", contains="graph", representation(adjMat="matrix"), validity=function(object) validGraph(object)) setClass("distGraph", representation(Dist="dist"), prototype=list(graphData=list(edgemode="undirected")), contains="graph") setClass("clusterGraph", representation(clusters="list"), contains="graph", prototype=list(graphData=list(edgemode="undirected"))) ## Misc classes setClass("simpleEdge", representation(edgeType="character", weight="numeric", directed="logical", bNode="character", ##begin - if directed eNode="character"), ##end - if directed prototype=list(edgeType="unknown", directed=FALSE, bNode="", eNode="", weight=1)) ##multigraphs - not clear if we should extend graph here, or have a ##whole new set of classes ##looks like redefining edgeSets is going to help us out here. setClass("edgeSet", contains="VIRTUAL", representation=representation( edgeData="attrData")) setClass("edgeSetNEL", contains="edgeSet", representation(edgemode="character", edgeL="list")) setClass("edgeSetAM", contains="edgeSet", representation(edgemode="character", adjMat="matrix")) setClass("multiGraph", representation(nodes="vector", edgeL="list", nodeData="attrData", graphData="list")) setClass("MGEdgeSet", representation = representation( bit_vector = "raw", weights = "numeric", edge_attrs = "list")) setClass("DiEdgeSet", contains = "MGEdgeSet") setClass("UEdgeSet", contains = "MGEdgeSet") setClass("attrPos", representation = representation( nodePos = "list", edgePos = "list")) setClass("MultiGraph", representation = representation( nodes = "character", nodeData = "attrData", ## items will be MGEdgeSet objects edge_sets = "list", edge_defaults = "list", userAttrPos = "attrPos"), contains = "graphBase") setClass("graphBAM", contains = "graph", representation(edgeSet = "MGEdgeSet", nodes = "character", userAttrPos = "attrPos")) graph/R/AllGenerics.R0000644000175100017510000001751012607264574015430 0ustar00biocbuildbiocbuild## Generic methods that all graph representation classes must support setGeneric("isDirected", function(object) standardGeneric("isDirected")) ## --------------------------------------------------------------------- ## Node and edge access ## --------------------------------------------------------------------- ## setGeneric("getNodes", function(x, which) standardGeneric("getNodes")) setGeneric("edgemode", function(object) standardGeneric("edgemode")) setGeneric("edgemode<-", function(object, value) standardGeneric("edgemode<-")) setGeneric("nodes", function(object, ...) standardGeneric("nodes")) setGeneric("nodes<-", function(object, value) standardGeneric("nodes<-")) ## internal use only so that nodes<- can be a template method setGeneric("renameNodes", function(g, value) standardGeneric("renameNodes")) setGeneric("edges", function(object, which, ...) standardGeneric("edges")) ## The funny arg=1, is to allow default values in the methods. ## We don't want to dispatch on those args, but we want them ## named as part of the interface, hence the trick of putting them ## after the (...). Note that this means partial matching for those ## args will not work, must specify full name. setGeneric("edgeWeights", function(object, index, ..., attr="weight", default=1, type.checker=is.numeric) standardGeneric("edgeWeights")) ## --------------------------------------------------------------------- ## --------------------------------------------------------------------- ## Node and edge operations ## --------------------------------------------------------------------- setGeneric("degree", function(object, Nodes) standardGeneric("degree")) setGeneric("adj", function(object, index) standardGeneric("adj")) setGeneric("acc", function(object, index) standardGeneric("acc")) setGeneric("numNodes", function(object) standardGeneric("numNodes")) setGeneric("numEdges", function(object) standardGeneric("numEdges")) ## default function numNoEdges(objGraph) already exists ##setGeneric("numNoEdges", function(object) standardGeneric("numNoEdges")) setGeneric("addNode", function(node, object, edges) standardGeneric("addNode")) setGeneric("removeNode", function(node, object) standardGeneric("removeNode")) setGeneric("clearNode", function(node, object) standardGeneric("clearNode")) setGeneric("combineNodes", function(nodes, graph, newName, ...) standardGeneric("combineNodes")) setGeneric("addEdge", function(from, to, graph, weights) standardGeneric("addEdge")) setGeneric("removeEdge", function(from, to, graph) standardGeneric("removeEdge")) setGeneric("removeEdges", function(container, from, to, ...) standardGeneric("removeEdges")) setGeneric("removeEdgesByWeight", function(graph, ...) standardGeneric("removeEdgesByWeight")) ## --------------------------------------------------------------------- ## --------------------------------------------------------------------- ## attrData generics ## --------------------------------------------------------------------- setGeneric("attrDefaults", function(self, attr) standardGeneric("attrDefaults")) setGeneric("attrDefaults<-", function(self, attr, value) standardGeneric("attrDefaults<-")) setGeneric("attrDataItem", function(self, x, attr) standardGeneric("attrDataItem")) setGeneric("attrDataItem<-", function(self, x, attr, value) standardGeneric("attrDataItem<-")) setGeneric("removeAttrDataItem<-", function(self, x, value) standardGeneric("removeAttrDataItem<-")) ## --------------------------------------------------------------------- ## graph, node, edge attribute generics ## --------------------------------------------------------------------- setGeneric("graphData", function(self, attr) standardGeneric("graphData")) setGeneric("graphData<-", function(self, attr, value) standardGeneric("graphData<-")) setGeneric("edgeDataDefaults", function(self, attr) standardGeneric("edgeDataDefaults")) setGeneric("edgeDataDefaults<-", function(self, attr, value) standardGeneric("edgeDataDefaults<-")) setGeneric("nodeDataDefaults", function(self, attr) standardGeneric("nodeDataDefaults")) setGeneric("nodeDataDefaults<-", function(self, attr, value) standardGeneric("nodeDataDefaults<-")) setGeneric("nodeData", function(self, n, attr) standardGeneric("nodeData")) setGeneric("nodeData<-", function(self, n, attr, value) standardGeneric("nodeData<-")) setGeneric("edgeData", function(self, from, to, attr) standardGeneric("edgeData")) setGeneric("edgeData<-", function(self, from, to, attr, value) standardGeneric("edgeData<-")) setGeneric("mgEdgeDataDefaults", function(self, edgeSet, attr) standardGeneric("mgEdgeDataDefaults")) setGeneric("mgEdgeDataDefaults<-", function(self, edgeSet, attr, value) standardGeneric("mgEdgeDataDefaults<-")) setGeneric("mgEdgeData", function(self, edgeSet, from, to, attr) standardGeneric("mgEdgeData")) setGeneric("mgEdgeData<-", function(self, edgeSet, from, to, attr, value) standardGeneric("mgEdgeData<-")) ## --------------------------------------------------------------------- ## Basic operations setGeneric("DFS", function(object, node, checkConn=TRUE) standardGeneric("DFS")) setGeneric("subGraph", function(snodes, graph) standardGeneric("subGraph")) setGeneric("intersection2", function(x, y) standardGeneric("intersection2")) setGeneric("intersection", function(x, y) standardGeneric("intersection")) setGeneric("join", function(x, y) standardGeneric("join")) setGeneric("ugraph", function(graph) standardGeneric("ugraph")) setGeneric("complement", function(x) standardGeneric("complement")) setGeneric("connComp", function(object) standardGeneric("connComp")) setGeneric("isConnected", function(object, ...) standardGeneric("isConnected")) setGeneric("inEdges", function(node, object) standardGeneric("inEdges")) setGeneric("leaves", signature="object", # don't dispatch on degree.dir function(object, degree.dir) standardGeneric("leaves")) setGeneric("edgeNames", function(object, ...) standardGeneric("edgeNames")) setGeneric("isAdjacent", function(object, from, to, ...) standardGeneric("isAdjacent")) ## Misc setGeneric("Dist", function(object) standardGeneric("Dist")) setGeneric("threshold", function(object, k, value=0) standardGeneric("threshold")) setGeneric("contents", function(object, all.names) standardGeneric("contents")) setGeneric("edgeMatrix", function(object, duplicates=FALSE) standardGeneric("edgeMatrix")) setGeneric("adjacencyMatrix", function(object) standardGeneric("adjacencyMatrix")) setGeneric("edgeL", function(graph, index) standardGeneric("edgeL")) setGeneric("clusteringCoefficient", function(object, ...) standardGeneric("clusteringCoefficient")) ## Generics for GXL setGeneric("fromGXL", function(con) standardGeneric("fromGXL")) setGeneric("dumpGXL", function(con) standardGeneric("dumpGXL")) setGeneric("validateGXL", function(con) standardGeneric("validateGXL")) setGeneric("toGXL", function(object, ...) standardGeneric("toGXL")) setGeneric("property", function(x, prop) standardGeneric("property")) setGeneric("toDotR", function(G, outDotFile, renderList, optList) standardGeneric("toDotR")) ## Updating a graph object setGeneric("updateGraph", function(object) standardGeneric("updateGraph")) setGeneric("extractFromTo", function(g) standardGeneric("extractFromTo")) setGeneric("graphIntersect", function(x, y, ...) standardGeneric("graphIntersect")) setGeneric("graphUnion", function(x, y, ...) standardGeneric("graphUnion")) setGeneric("edgeSets", function(object, ...) standardGeneric("edgeSets")) graph/R/GXLformals.R0000644000175100017510000001100212607264574015244 0ustar00biocbuildbiocbuild# # GXL support # ## fromGXL returns the graphNEL object only, and it may ## need to return more properties (7 mar 03) setMethod("fromGXL", signature(con="connection"), function(con) { contents <- paste(readLines(con), collapse="") xmlEventParse <- getExportedValue("XML", "xmlEventParse") xmlEventParse(contents, graph_handler(), asText=TRUE, saxVersion=2)$asGraphNEL() }) ## dumpGXL returns an R list with all? properties setMethod("dumpGXL", "connection", function(con) { xmlEventParse <- getExportedValue("XML", "xmlEventParse") xmlEventParse(paste(readLines(con), collapse=""), NELhandler(),asText=TRUE)$dump() }) ## validate against the dtd setMethod("validateGXL", "connection", function(con) { xmlTreeParse <- getExportedValue("XML", "xmlTreeParse") # maybe need a try here, xmlTreeParse dumps the whole stream when it hits an error tmp <- xmlTreeParse(paste(readLines(con), collapse=""), asText=TRUE, validate=TRUE) }) # # exporting # setMethod("toGXL", signature(object="graphNEL"), function(object, graph.name) { if (missing(graph.name)) { graph.name <- class(object)[1] } gxlTreeNEL(object, graph.name) }) gxlTreeNEL <- function(gnel, graph.name) { qrequire("XML") GXL_NAMESPACE <- c(gxl="http://www.gupro.de/GXL/gxl-1.1.dtd") out <- xmlOutputDOM("gxl", nsURI=GXL_NAMESPACE, nameSpace="gxl") ## NOTE: We could specify dtd="http://www.gupro.de/GXL/gxl-1.0.1.dtd", ## but this might mean that net access is required to write ## GXL which seems quite unacceptable. nodeAttrs <- names(nodeDataDefaults(gnel)) edgeAttrs <- names(edgeDataDefaults(gnel)) writeAttr <- function(attrName, val) { ## skip NA and NULL if (is.null(val) || is.na(val)) return(NULL) ## at present, can only handle length 1 if (length(val) > 1) { warning("GXL conversion only handles attributes ", "with length 1. Will try to represent ", "object of length ", length(val), " as a", "string.") val <- paste(val, collapse=", ") } atag <- switch(typeof(val), integer="int", character="string", double="float", { warning("I don't know how to convert ", "a ", typeof(val), " to GXL. ", " Skipping.") NULL }) if (is.null(atag)) return(NULL) out$addTag("attr", attrs=c(name=attrName), close=FALSE) out$addTag(atag, as.character(val)) out$closeTag() } writeNode <- function(n) { ## Helper function to write a graphNEL node to XML out$addTag("node", attrs=c(id=n), close=FALSE) for (nodeAttr in nodeAttrs) { val <- nodeData(gnel, n, attr=nodeAttr)[[1]] writeAttr(nodeAttr, val) } out$closeTag() ## node } edgeCount <- 1 writeEdge <- function(from, to) { ## Helper function to write a graphNEL node to XML edgeId <- edgeCount edgeCount <<- edgeCount + 1 out$addTag("edge", attrs=c(id=edgeId, from=from, to=to), close=FALSE) for (edgeAttr in edgeAttrs) { val <- edgeData(gnel, from, to, attr=edgeAttr)[[1]] writeAttr(edgeAttr, val) } out$closeTag() ## node } nds <- nodes(gnel) if (!isDirected(gnel)) { ## remove recipricol edges eds <- lapply(gnel@edgeL, function(x) x$edges) eds <- mapply(function(x, y) x[x < y], eds, seq(length=length(eds))) names(eds) <- nodes(gnel) eds <- lapply(eds, function(x) { if (length(x) > 0) nds[x] else character(0) }) } else { eds <- edges(gnel) } enms <- names(eds) out$addTag("graph", attrs=c(id=graph.name, edgemode=edgemode(gnel)), close=FALSE) for (n in nds) { writeNode(n) } for (from in enms) { for (to in eds[[from]]) { writeEdge(from=from, to=to) } } out$closeTag() # graph out } graph/R/MultiGraph.R0000644000175100017510000016674112607264574015327 0ustar00biocbuildbiocbuildMultiGraph <- function(edgeSets, nodes = NULL, directed = TRUE, ignore_dup_edges = FALSE) { .mg_validate_edgeSet(edgeSets) nodeNames <- .mg_node_names(edgeSets, nodes) n_nodes <- length(nodeNames) edge_sets <- makeMDEdgeSets(edgeSets, directed, nodeNames, ignore_dup_edges = ignore_dup_edges) mg <- new("MultiGraph", edge_sets = edge_sets, nodes = nodeNames) mg@edge_defaults <- sapply(names(edge_sets), function(x) { list("weight" = 1L) }, simplify = FALSE) mg } makeMDEdgeSets <- function(edgeSets, directed, nodes, ignore_dup_edges = FALSE) { directed <- if (length(directed) == 1L) rep(directed, length(edgeSets)) else if (length(directed) != length(edgeSets)) stop("'directed' must align with 'edgeSets' or have length one", call. = FALSE) else directed ans <- vector(mode = "list", length = length(edgeSets)) nms <- names(edgeSets) names(ans) <- nms for (i in seq_along(edgeSets)) { ans[[i]] <- .makeMDEdgeSet(nms[[i]], edgeSets[[i]], directed[[i]], nodes, ignore_dup_edges = ignore_dup_edges) } ans } .makeMDEdgeSet <- function(es_name, es, is_directed, nodes, ignore_dup_edges = FALSE) { if (!all(c("from", "to", "weight") %in% names(es))) stop("'edgeSets' must have columns 'from', 'to', 'weight'", call. = FALSE) n_nodes <- length(nodes) bitVect <- makebits(n_nodes * n_nodes, bitdim = c(n_nodes, n_nodes)) weights <- numeric(0L) if (nrow(es) > 0L) { from <- as.character(es[["from"]]) to <- as.character(es[["to"]]) weights <- es[["weight"]] if (!is_directed) { tmp <- .mg_undirectEdges(from, to, weights) from <- tmp[["from"]] to <- tmp[["to"]] weights <- tmp[["weight"]] } ## map 'from', 'to' from character to integer indicies from_i <- match(from, nodes) to_i <- match(to, nodes) edge_order <- order(to_i, from_i) weights <- weights[edge_order] if (!is.numeric(weights)) stop("'weight' column must be numeric", call. = FALSE) if (ignore_dup_edges) { ## NB: we only consider nodes for duplication, ignoring ## weight value. ft <- cbind(from_i, to_i)[edge_order, , drop=FALSE] tmp <- paste(ft[,"from_i"],ft[,"to_i"], sep="_") want <- !duplicated(tmp) from_i <- ft[want, 1] to_i <- ft[want, 2] weights <- weights[want] } else { from_i <- from_i[edge_order] to_i <- to_i[edge_order] } ## TODO: should not have to pass vector of 1s for each edge in ## setBitCell. bitVect <- setBitCell(bitVect, from_i, to_i, rep(1L, length(from_i))) edge_count <- nbitset(bitVect) if (length(from_i) != edge_count) .report_duplicate_edges(es_name, from, to, is_directed) } klass <- if (is_directed) "DiEdgeSet" else "UEdgeSet" ## FIXME: need to handle extra edge attributes. These will need to ## come in as a separate argument as a list of attribute lists that ## align with from/to new(klass, bit_vector = bitVect, weights = weights, edge_attrs = list()) } .report_duplicate_edges <- function(name, from, to, directed) { df <- cbind(from, to) sep <- if (directed) "=>" else "=" if (any(dups <- duplicated(df))) { stop("duplicate edges in edge set ", sQuote(name), ": ", pasteq(paste(from[dups], to[dups], sep = sep)), call. = FALSE) } } .mg_undirectEdges <- function(from, to, weight) { fromIsFirst <- from < to toIsFirst <- !fromIsFirst tmpFrom <- c(from[fromIsFirst], to[toIsFirst]) tmpTo <- c(to[fromIsFirst], from[toIsFirst]) tmpW <- c(weight[fromIsFirst], weight[toIsFirst]) list(from = tmpFrom, to = tmpTo, weight = tmpW) } .mg_validate_node_names <- function(nodeNames) { if (!all(valid <- .mg_valid_node_names(nodeNames))) { stop("invalid node names: ", pasteq(head(nodeNames[!valid], 10L)), call. = FALSE) } } .mg_node_names <- function(edgeSets, nodes) { ## XXX: we sort the node names and are thus subject ## to locale variation ftSets <- lapply(edgeSets, function(ft) { cbind(from = as.character(ft[["from"]]), to = as.character(ft[["to"]])) }) nodeNames <- unique(c(unlist(ftSets, use.names = FALSE), nodes)) if (is.null(nodeNames) || length(nodeNames) == 0L) nodeNames <- character(0) else { nodeNames <- sort(nodeNames, na.last = FALSE) .mg_validate_node_names(nodeNames) } nodeNames } .mg_validate_edgeSet <- function(edgeSets) { if (!is.list(edgeSets)) stop("'edgeSets' must be a named list or empty list", call. = FALSE) if (length(edgeSets) > 0L) { nms <- names(edgeSets) if (is.null(nms)) stop("'edgeSets' must be a named list", call. = FALSE) if (!all(nzchar(nms)) || any(is.na(nms)) || any(duplicated(nms))) stop("names(edgeSets) is invalid", call. = FALSE) } } MultiDiGraph <- function(edgeSets, nodes = NULL) { ## Nodes are stored in sorted order. The sparse Edge index vector ## is stored in sorted index order. Since R is column-major, this ## means that when translated to x, y coordinates, the ordering is ## sorted by column and then row. ## edgeSets is a list of from/to matrices ftSets <- lapply(edgeSets, function(ft) { cbind(from = as.character(ft[[1L]]), to = as.character(ft[[2L]])) }) nodeNames <- sort(unique(c(unlist(ftSets, use.names = FALSE), nodes)), na.last = FALSE) if (!all(valid <- .mg_valid_node_names(nodeNames))) { stop("node names invalid: ", pasteq(head(nodeNames[!valid], 10L))) } n_nodes <- length(nodeNames) if (n_nodes > 2^15) n_nodes <- as.double(n_nodes) n_edgeSets <- length(edgeSets) es_names <- names(edgeSets) edgeAttrs <- structure(vector("list", n_edgeSets), names = es_names) ## FIXME: should we enforce having a "weight" column? for (i in seq_len(n_edgeSets)) { ft <- ftSets[[i]] from_i <- match(ft[, 1L], nodeNames) to_i <- match(ft[, 2L], nodeNames) sparseAM <- .coordToIndex(from_i, to_i, n_nodes) edgeIdxOrder <- order(sparseAM) esi <- edgeSets[[i]] edgeAttrs[[i]] <- structure(data.frame(mdg_edge_index = sparseAM[edgeIdxOrder], esi[edgeIdxOrder, c(-1L, -2L)], row.names = NULL), names = c("mdg_edge_index", names(esi)[-(1:2)])) } new("MultiDiGraph", nodes = nodeNames, edgeAttrs = edgeAttrs) } .mg_valid_node_names <- function(names) { !(is.na(names) | (sapply(names, nchar) == 0) | (regexpr("\\||\n|\t", names) > 0)) } setMethod("numNodes", signature = signature(object = "MultiGraph"), function(object) { length(object@nodes) }) setMethod("numEdges", signature = signature(object = "MultiGraph"), function(object) { ## TODO: would it make more sense to just ## return the length of @weights? sapply(object@edge_sets, function(es) { nbitset(es@bit_vector) }) }) setMethod("nodes", signature = signature(object = "MultiGraph"), function(object, ...) { object@nodes }) setMethod("isDirected", signature = signature(object = "MultiGraph"), function(object) sapply(object@edge_sets, isDirected)) setMethod("isDirected", signature = signature(object = "DiEdgeSet"), function(object) TRUE) setMethod("isDirected", signature = signature(object = "UEdgeSet"), function(object) FALSE) setMethod("ugraph", signature = signature(graph = "MultiGraph"), function(graph) { graph@edge_sets <- lapply(graph@edge_sets, ugraph) graph }) ## FIXME: should ugraph on an undirected graph also drop ## attributes to keep things consistent? setMethod("ugraph", "UEdgeSet", function(graph) { new("UEdgeSet", bit_vector = graph@bit_vector, weights = rep(1L, length(graph@weights)), edge_attrs = list()) }) setMethod("ugraph", "DiEdgeSet", function(graph) { ## XXX: edge weights => 1, edge attributes dropped bit_vector <- .Call(graph_bitarray_undirect, graph@bit_vector) new("UEdgeSet", bit_vector = bit_vector, weights = rep(1L, nbitset(bit_vector)), edge_attrs = list()) }) setMethod("show", signature = signature(object = "MultiGraph"), function(object) { cat(class(object), sprintf("with %d nodes and %d edge sets\n", numNodes(object), length(object@edge_sets))) if (length(object@edge_sets)) { edgeCounts <- numEdges(object) df <- data.frame(edge_set = names(edgeCounts), directed = sapply(object@edge_sets, isDirected), edge_count = edgeCounts, stringsAsFactors = FALSE, row.names = NULL) print(head(df, 10L), row.names = FALSE) } invisible(NULL) }) eweights <- function(object, names.sep = NULL) { if (is.null(names.sep)) { lapply(object@edge_sets, function(es) { es@weights }) } else { sep <- names.sep[1] nn <- nodes(object) n_nodes <- length(object@nodes) lapply(object@edge_sets, function(es) { w <- es@weights ft <- .Call(graph_bitarray_rowColPos, es@bit_vector) names(w) <- paste(nn[ft[, "from"]], nn[ft[, "to"]], sep = names.sep) w }) } } # # edgeMatrices <- function(object) # { # n_nodes <- length(object@nodes) # lapply(object@edgeAttrs, function(attrs) { # matrix(t(.indexToCoord(attrs[[1L]], n_nodes)), # nrow = 2L, # dimnames = list(c("from", "to"), NULL)) # }) # } # # fromToList <- function(object) # { # nodeNames <- object@nodes # n_nodes <- length(nodeNames) # lapply(object@edgeAttrs, function(attrs) { # coord <- .indexToCoord(attrs[[1L]], n_nodes) # coord[] <- nodeNames[coord] # ft <- structure(data.frame(from = coord[ , 1L], to = coord[ , 2L], # attrs[-1L], stringsAsFactors = FALSE), # names = c("from", "to", names(attrs)[-1L])) # ft # }) # } # # # extractGraph <- function(object, which) # { # if (length(which) != 1L) # stop("'which' must be length one") # edgeAttr <- object@edgeAttrs[[which]] # nodeNames <- nodes(object) # ftmat <- .indexToCoord(edgeAttr[[1L]], length(nodeNames)) # ftmat[] <- nodeNames[ftmat] # ftM2graphNEL(ftmat, W = edgeAttr[[2L]], V = nodeNames, # edgemode = "directed") # } # ## Generate a random from/to table ## ## Returns a list with two elements: ## $node: character vector of node labels ## $ft: a data.frame with columns 'from', 'to', and 'weight' ## randFromTo <- function(numNodes, numEdges, weightFun = function(N) rep(1L, N), directed = TRUE) { if (numNodes > 2^15) numNodes <- as.double(numNodes) maxEdges <- numNodes * numNodes nodeNames <- sprintf("%010d", seq_len(numNodes)) ## use double to allow for large numNodes numToGen <- max(numEdges * 4, numNodes) idx <- unique(ceiling(runif(numToGen, min = 0, max = maxEdges))) stopifnot(length(idx) >= numEdges) idx <- idx[seq_len(numEdges)] to_i <- ((idx - 1L) %/% numNodes) + 1L from_i <- ((idx - 1L) %% numNodes) + 1L from <- nodeNames[from_i] to <- nodeNames[to_i] w <- weightFun(length(from)) list(nodes = nodeNames, ft = data.frame(from = from, to = to, weight = w, stringsAsFactors = FALSE)) } oneWeights <- function(x) rep(1L, nrow(x)) edgeSetIntersect0 <- function(g, edgeFun = NULL) { edge_sets <- g@edge_sets n_sets <- length(edge_sets) if (n_sets < 2L) return(g) nms <- names(edge_sets) nName <- paste(nms, collapse = "_") funList <- structure(list(edgeFun), names = nName) directed <- isDirected(g) klass <- if (all(directed)) "DiEdgeSet" else "UEdgeSet" if(!( all(directed) || all(!directed))) { stop("all edges must either be directed or undirected") } g1 <- subsetEdgeSets(g,nms[1]) names(g1@edge_sets) <- names(g1@edge_defaults) <- nName if(length(g1@userAttrPos@edgePos)) names(g1@userAttrPos@edgePos) <- nName for ( i in seq.int(2L, n_sets)) { g2 <- subsetEdgeSets(g, nms[i]) names(g2@edge_sets) <- names(g2@edge_defaults) <- nName if(length(g2@userAttrPos@edgePos)) names(g2@userAttrPos@edgePos) <- nName g1 <- graphIntersect(g1, g2, edgeFun = funList) } n_edges <- attr(g1@edge_sets[[1L]], "nbitset") <- .Call(graph_bitarray_sum, g1@edge_sets[[1L]]@bit_vector ) if(n_edges >0) { return(g1) } else { new_edge_sets <- list() return(new("MultiGraph", edge_sets = new_edge_sets, nodes = nodes(g1))) } } edgeSetUnion0 <- function(g, edgeFun = NULL) { edge_sets <- g@edge_sets n_sets <- length(edge_sets) if (n_sets < 2L) return(g) nms <- names(edge_sets) nName <- paste(names(edge_sets), collapse = "_") funList <- structure(list(edgeFun), names = nms[1]) directed <- isDirected(g) klass <- if (all(directed)) "DiEdgeSet" else "UEdgeSet" if(!( all(directed) || all(!directed))) { stop("all edges must either be directed or undirected") } g1 <- subsetEdgeSets(g,nms[1]) names(g1@edge_sets) <- nName for ( i in seq.int(2L, n_sets)) { g2 <- subsetEdgeSets(g, names(g@edge_sets)[i]) names(g2@edge_sets) <- nName g1 <- graphUnion(g1, g2, funList) } n_edges <- attr(g1@edge_sets[[1L]], "nbitset") <- .Call(graph_bitarray_sum, g1@edge_sets[[1L]]@bit_vector ) if(n_edges >0) { return(g1) } else { new_edge_sets <- list() return(new("MultiGraph", edge_sets = new_edge_sets, nodes = nodes(g1))) } } ## TODO: should you be allowed to rename edge sets? ## or at least name unnamed edge sets? subsetEdgeSets <- function(object, edgeSets) { if (!all(nzchar(edgeSets)) || any(is.na(edgeSets)) || !(all(edgeSets %in% names(object@edge_sets)))) stop("'edgeSet' is invalid") if(any(dups <- duplicated(edgeSets))) stop("duplicate edges specified in edge set ", edgeSets[dups]) object@edge_sets<- object@edge_sets[edgeSets] nms <- names(object@edge_defaults) mtch <- edgeSets[edgeSets %in% nms] object@edge_defaults <- if (length(mtch)) object@edge_defaults[mtch] else list() nms <- names( object@userAttrPos@edgePos) mtch <- edgeSets[edgeSets %in% nms] object@userAttrPos@edgePos <- if (length(mtch))object@userAttrPos@edgePos[mtch] else list() object } diEdgeSetToDataFrame <- function(edgeSets,nodes) { bitvec <- edgeSets@bit_vector df <- .Call(graph_bitarray_rowColPos, bitvec) data.frame(from = nodes[df[, "from"]], to = nodes[df[, "to"]], weight = edgeSets@weights) } .extractFromTo_mg <- function(g) { nn <- nodes(g) lapply(g@edge_sets, function(x) diEdgeSetToDataFrame(x, nn)) } setMethod("extractFromTo", "MultiGraph", .extractFromTo_mg) .mgDegree <- function(object) { nn <- nodes(object) len <- length(nn) idx_str <- as.character(seq_len(len)) lapply(object@edge_sets, function(edgeSet) { bitvec <- edgeSet@bit_vector df <- .Call(graph_bitarray_rowColPos, bitvec) tbl <- structure(table(df[, "from"]), class=NULL) indx <- idx_str %in% names(tbl) from <- to <- structure(rep(0, len), names=nn) from[indx] <- tbl tbl <- structure(table(df[, "to"]), class=NULL) indx <- idx_str %in% names(tbl) to[indx] <- tbl if (isDirected(edgeSet)) { list(inDegree = to, outDegree = from) } else { degree = from + to } }) } setMethod("subGraph", signature(snodes="character", graph="MultiGraph"), function(snodes, graph) { origNodes <- nodes(graph) snodes <- sort(snodes) snodesIdx <- match(snodes, origNodes) if (any(is.na(snodesIdx))) { bad <- snodes[which(is.na(snodesIdx))] stop("'snodes' contains nodes not in MultiGraph: ", pasteq(bad)) } nms <- names(graph@nodeData@defaults) len <- length(snodes) tmp <- makebits(len) for(i in nms){ indx <- bitToLogical(graph@userAttrPos@nodePos[[i]])[snodesIdx] graph@nodeData@data[[i]] <- .getNodeAttrVec(graph, i)[snodesIdx][indx] graph@userAttrPos@nodePos[[i]] <- setbitv(tmp, which(indx), rep(1L, length(which(indx)))) } graph@nodes <- snodes edgNms <- names(graph@edge_sets) for(i in edgNms) { res <- .Call(graph_bitarray_subGraph, graph@edge_sets[[i]]@bit_vector, snodesIdx) graph@edge_sets[[i]]@bit_vector <- res$bitVec graph@edge_sets[[i]]@weights <- graph@edge_sets[[i]]@weights[res$setPos] attrNms <- names(graph@edge_sets[[i]]@edge_attrs) for (j in attrNms) { attrBit <- graph@userAttrPos@edgePos[[i]][[j]] res <- .Call(graph_bitarray_subGraph, attrBit, snodesIdx) graph@edge_sets[[i]]@edge_attrs[[j]] <- graph@edge_sets[[i]]@edge_attrs[[j]][res$setPos] graph@userAttrPos@edgePos[[i]][[j]] <- res$bitVec } } graph }) extractGraphAM <- function(g, edgeSets) { if(missing(edgeSets)) edgeSets <- names(g@edge_sets) if (!all(nzchar(edgeSets)) || any(is.na(edgeSets)) || !(all(edgeSets %in% names(g@edge_sets)))) stop("'edgeSet' is invalid") nds <- nodes(g) drct <- isDirected(g) esets <- if (missing(edgeSets)) g@edge_sets else g@edge_sets[edgeSets] nms <- names(esets) names(nms) <- nms lapply(nms, function(x) { mat <- edgeSetToMatrix(nds, esets[[x]], drct[[x]]) bam <- graphAM(adjMat=mat, edgemode = if(drct[[x]]) "directed" else "undirected", values= list(weight = esets[[x]]@weights)) }) } edgeSetToMatrix <- function(nds, edgeSet, directed) { .Call(graph_bitarray_edgeSetToMatrix, nds, edgeSet@bit_vector, as.numeric(edgeSet@weights), as.logical(directed)) } setMethod("graphIntersect", c("MultiGraph", "MultiGraph"), function(x, y, nodeFun, edgeFun, ...){ nn <- intersect(nodes(x), nodes(y)) nnLen <- length(nn) nmsX <- names(x@edge_sets) nmsY <- names(y@edge_sets) eg <- intersect(nmsX, nmsY) dr1 <- isDirected(x)[eg] dr2 <- isDirected(y)[eg] if(!all(dr1 == dr2)) stop("edgeSets 'x' and 'y' must have same edgemode") theMode <- dr1 & dr2 if (nnLen == 0){ ft <- data.frame(from = character(0), to = character(0), weight = numeric(0)) es <- structure(rep(list(ft), length(eg)), names = eg) mg <- MultiGraph(es, directed = theMode) return(mg) } x <- subsetEdgeSets(x, eg) y <- subsetEdgeSets(y, eg) sgx <- if (nnLen == numNodes(x)) x else subGraph(nn, x) sgy <- if (nnLen == numNodes(y)) y else subGraph(nn, y) if(missing(edgeFun)) edgeFun <- structure( rep(list(NULL),length(eg)), names = eg) if(missing(nodeFun)) nodeFun <- NULL new_edge_sets <- structure(lapply(eg, function(k) { .getEdgeIntersect(sgx@edge_sets[[k]], sgy@edge_sets[[k]]) }), names = eg) mg <- .getMGIntersect(sgx, sgy, new_edge_sets, edgeFun) mg@nodeData@defaults <- .retNodeIntersectDefaults(sgx, sgy) mg@userAttrPos@nodePos <- .getIntNodeUserAttrPos(sgx, sgy) mg@nodeData@data <- .nodeIntersect(sgx, sgy, mg, nodeFun) mg }) .getMGIntersect <- function(g1, g2, edge_set, edgeFun) { nn <- intersect(nodes(g1), nodes(g2)) ans <- new("MultiGraph", edge_sets = edge_set, nodes = nn) eg <- intersect(names(g1@edge_sets), names(g2@edge_sets)) for( i in eg) { e1Attr <- names(g1@edge_sets[[i]]@edge_attrs) e2Attr <- names(g2@edge_sets[[i]]@edge_attrs) commonAttr <- intersect(e1Attr, e2Attr) funList <- edgeFun[[i]] if(!is.null(funList)) { fIndx <- names(funList) %in% c(commonAttr, "weight") if(!all(fIndx)) stop("attributes in 'funList' not in edge attributes: ", pasteq(names(funList)[fIndx])) } attrType <- .Call(graph_bitarray_Intersect_Attrs, edge_set[[i]]@bit_vector, g1@edge_sets[[i]]@bit_vector, g2@edge_sets[[i]]@bit_vector) if(length(attrType$from) >0) { ans@edge_sets[[i]]@weights <- .getIntersectAttrs("weight", attrType, g1@edge_sets[[i]]@weights, g2@edge_sets[[i]]@weights, funList) } bt <- (g1@edge_sets[[i]]@bit_vector) & (g2@edge_sets[[i]]@bit_vector) attributes(bt) <- attributes(g1@edge_sets[[i]]@bit_vector) ns <- .Call(graph_bitarray_sum, bt) attr(bt, "nbitset") <- ns for(j in commonAttr) { ans@userAttrPos@edgePos[[i]][[j]] <- bt xAttr <- .retMGAttrVec(g1, i, j) yAttr <- .retMGAttrVec(g2, i, j) if(length(attrType$from) >0) { ans@edge_sets[[i]]@edge_attrs[[j]] <- .getIntersectAttrs(j, attrType, xAttr, yAttr, funList) } } ans@edge_defaults[[i]]<- .retEdgeIntersectDefaults(g1@edge_defaults[[i]], g2@edge_defaults[[i]]) } ans } .scaleMG <- function(g, theNodes) { if (all(nodes(g) %in% theNodes) && length(nodes(g)) == length(theNodes)) return(g) else { es <- names(g@edge_sets) for (i in es) { g@edge_sets[[i]] <- .scaleEdgeSet(g, i, theNodes) nms <- names(g@userAttrPos@edgePos[[i]]) for(j in nms) { g@userAttrPos@edgePos[[i]][[j]] <- .scaleUserAttrPos(g@userAttrPos@edgePos[[i]][[j]], theNodes) } } } nms <- names(g@nodeData@defaults) for(i in nms){ origNds <- nodes(g)[(bitToLogical(g@userAttrPos@nodePos[[i]]))] ndsLen <- length(theNodes) indx <- match(origNds, theNodes) bt <- makebits(ndsLen) bt <- setbitv(bt, indx, rep(1L, length(indx))) g@userAttrPos@nodePos[[i]] <- bt g@nodeData@data[[i]] <- g@nodeData@data[[i]] } g@nodes <- theNodes g } .scaleUserAttrPos <- function(edgePos, nds) { ft <- .Call(graph_bitarray_rowColPos, edgePos) ndsLen <- length(nds) posBit <- .createZeroBitPos(ndsLen) setBitCell(posBit, ft[,"from"], ft[,"to"], rep(1L, nrow(ft))) } .scaleEdgeSet <- function(g, es, nds) { df <- diEdgeSetToDataFrame(g@edge_sets[[es]], nodes(g)) edge_sets <- .makeMDEdgeSet(es_name = 1, es = df, is_directed = isDirected(g@edge_sets[[es]]), nds, ignore_dup_edges = FALSE) edge_sets@edge_attrs <- g@edge_sets[[es]]@edge_attrs edge_sets } .retMGEdgeUnionUserAttrPos <- function(x, y) { nmsX <- names(x@edge_sets) nmsY <- names(y@edge_sets) cmnEdges <- intersect(nmsX, nmsY) allEdges <- union(nmsX, nmsY) snglEdges <- allEdges[! allEdges %in% cmnEdges] ans <- structure(vector(mode = "list", length(allEdges)), names = allEdges) for(i in cmnEdges) { xAttr <- names(x@edge_sets[[i]]@edge_attrs) yAttr <- names(y@edge_sets[[i]]@edge_attrs) unionAttrs <- unique(union(xAttr, yAttr)) commonAttrs <- intersect(xAttr,yAttr) singleAttrs <- unionAttrs[!unionAttrs %in% commonAttrs] ans[[i]] <- structure(vector(mode = "list", length(unionAttrs)), names = unionAttrs) bt <- (x@edge_sets[[i]]@bit_vector) | (y@edge_sets[[i]]@bit_vector) attributes(bt) <- attributes(x@edge_sets[[i]]@bit_vector) ns <- .Call(graph_bitarray_sum, bt) attr(bt, "nbitset") <- ns for (j in commonAttrs) { ans[[i]][[j]] <- bt } for(j in singleAttrs) { if(j %in% names(x@edge_sets[[i]])) ans[[i]][[j]] <- x@userAttrPos@edgePos[[i]][[j]] else ans[[i]][[j]] <- y@userAttrPos@edgePos[[i]][[j]] } } for(i in snglEdges) { if(i %in% names(x@edge_sets)) ans[[i]] <- x@userAttrPos@edgePos[[i]] else ans[[i]] <- y@userAttrPos@edgePos[[i]] } ans } .getUnionEdgeSet <- function(g1, g2, edgeFun) { eg <- intersect(names(g1@edge_sets),names(g2@edge_sets)) theNodes <- unique(c(nodes(g1), nodes(g2))) edge_sets <- structure(lapply(eg, function(i) { e1Attr <- names(g1@edge_sets[[i]]@edge_attrs) e2Attr <- names(g2@edge_sets[[i]]@edge_attrs) unionAttr <- unique(union(e1Attr, e2Attr)) if(!is.null(edgeFun[[i]])) { fIndx <- names(edgeFun[[i]]) %in% c(unionAttr, "weight") if(!all(fIndx)) stop("attributes in 'edgeFun' not in edge attributes: ", pasteq(names(edgeFun[[i]])[fIndx])) } bv <- g1@edge_sets[[i]]@bit_vector | g2@edge_sets[[i]]@bit_vector attributes(bv) <- attributes(g1@edge_sets[[i]]@bit_vector) attr(bv, "nbitset") <- ns <- .Call(graph_bitarray_sum, bv) dr1 <- isDirected(g1@edge_sets[[i]]) dr2 <- isDirected(g2@edge_sets[[i]]) theMode <- if (dr1 && dr2) "directed" else "undirected" c0 <- character(0) df <- data.frame(from = c0, to = c0, weight = numeric(0)) edge_set <- .makeMDEdgeSet(es_name = 1, es =df, is_directed = (theMode == "directed"), nodes = theNodes, ignore_dup_edges = FALSE) edge_set@bit_vector <- bv cmnBit <- g1@edge_sets[[i]]@bit_vector & g2@edge_sets[[i]]@bit_vector attributes(cmnBit) <- attributes(g1@edge_sets[[i]]@bit_vector) attr(cmnBit, "nbitset") <- .Call(graph_bitarray_sum, cmnBit) fromOneBit <- g1@edge_sets[[i]]@bit_vector & (!cmnBit) attributes(fromOneBit) <- attributes(g1@edge_sets[[i]]@bit_vector) attr(fromOneBit, "nbitset") <- .Call(graph_bitarray_sum, fromOneBit) fromTwoBit <- g2@edge_sets[[i]]@bit_vector & (!cmnBit) attributes(fromTwoBit) <- attributes(g2@edge_sets[[i]]@bit_vector) attr(fromTwoBit, "nbitset") <- .Call(graph_bitarray_sum, fromTwoBit) attrType <- .Call(graph_bitarray_Union_Attrs, bv, cmnBit, fromOneBit, fromTwoBit) if(length(attrType$from) >0) { edge_set@weights <- as.numeric(.getMGUnionWeights(attrType, g1, g2, i, edgeFun[[i]])) } if(!is.null(unionAttr)) { for(j in unionAttr) { edge_set@edge_attrs[[j]] <- .getMGUnionAttrs(j, attrType, g1, g2, i, edgeFun[[i]]) } } edge_set }), names = eg) edge_sets } .getMGUnionWeights <- function(attrType, g1, g2, es, funList) { len <- length(attrType$from) attr1 <- vector(len, mode = "numeric") attr1[seq_len(len)] <- NA ## from x k <- (as.numeric(attrType$from) ==1) attr1[k] <- g1@edge_sets[[es]]@weights[attrType$indx1[k]] ## from y k <- (as.numeric(attrType$from) == 2) attr1[k] <- g2@edge_sets[[es]]@weights[attrType$indx2[k]] ## resolve union k <- (as.numeric(attrType$from) ==0) if(any(k)) { val1 <- g1@edge_sets[[es]]@weights[attrType$indx1[k]] val2 <- g2@edge_sets[[es]]@weights[attrType$indx2[k]] if(!is.null(funList) && ("weight" %in% names(funList))) { attr1[k] <- sapply(seq_len(sum(k)), function(p) { return(funList[["weight"]](val1[[p]], val2[[p]])) }) } else if(is.vector(val1) && is.vector(val2)) { eqInd <- sapply(seq_len(length(val1)), function(x){ identical(val1[x], val2[x]) }) pt <- which(eqInd) lp <- length(which(k)) tmp <- vector(lp, mode ="numeric") tmp[seq_len(lp)] <- NA tmp[pt] <- val1[pt] attr1[k] <- tmp } } attr1 } .getMGUnionAttrs <- function(att, attrType, x , y, es, funList ) { len <- length(attrType$from) indx <- as.numeric(attrType$from) if(att %in% names(x@edge_sets[[es]]@edge_attrs)) mds <- mode(x@edge_sets[[es]]@edge_attrs[[att]]) else if(att %in% names(y@edge_sets[[es]]@edge_attrs)) mds <- mode(y@edge_sets[[es]]@edge_attrs[[att]]) attr1 <- vector(len , mode = mds) attr1[seq_len(len)] <- NA ## from x k <- (as.numeric(attrType$from) ==1) if(att %in% names(x@edge_sets[[es]]@edge_attrs)) { xAttr <- .retMGAttrVec(x, es, att) attr1[k] <- xAttr[ attrType$indx1[k]] } ## from y k <- (as.numeric(attrType$from) == 2) if(att %in% names(y@edge_sets[[es]]@edge_attrs)) { yAttr <- .retMGAttrVec(y, es, att) attr1[k] <- yAttr[ attrType$indx2[k]] } ## resolve union k <- (as.numeric(attrType$from) ==0) if(any(k)) { if(att %in% names(x@edge_sets[[es]]@edge_attrs)) val1 <- xAttr[ attrType$indx1[k]] else val1 <- yAttr[ attrType$indx2[k]] if(att %in% names(y@edge_sets[[es]]@edge_attrs)) val2 <- yAttr[ attrType$indx2[k]] else val2 <- xAttr[ attrType$indx1[k]] if(!is.null(funList) && (att %in% names(funList))) { attr1[k] <- sapply(seq_len(sum(k)), function(p) { return(funList[[att]](val1[[p]], val2[[p]])) }) } else if (is.vector(val1) && is.vector(val2)) { eqInd <- sapply(seq_len(length(val1)), function(x){ identical(val1[x], val2[x]) }) pt <- which(eqInd) lp <- sum(k) tmp <- vector(lp, mode = mds) tmp[seq_len(lp)] <- NA tmp[pt] <- val1[pt] attr1[k] <- tmp } } attr1 } setMethod("graphUnion", c("MultiGraph", "MultiGraph"), function(x, y, nodeFun, edgeFun, ...){ dr1 <- isDirected(x) dr2 <- isDirected(y) nmsX <- names(x@edge_sets) nmsY <- names(y@edge_sets) eg <- intersect(nmsX, nmsY) if(missing(edgeFun)) edgeFun <- structure( rep(list(NULL),length(eg)), names = eg) if(missing(nodeFun)) nodeFun <- NULL if(!all(dr1[eg] == dr2[eg])) stop("edgeSets 'x' and 'y' must have same edgemode") theNodes <- unique(c(nodes(x), nodes(y))) nnLen <- length(theNodes) mgx <- .scaleMG(x, theNodes) mgy <- .scaleMG(y, theNodes) xeg <- nmsX[ !nmsX %in% eg] yeg <- nmsY[ !nmsY %in% eg] new_edge_sets <- .getUnionEdgeSet(mgx, mgy, edgeFun) x_edge_sets <- x@edge_sets[xeg] y_edge_sets <- y@edge_sets[yeg] mg <- new("MultiGraph", edge_sets = c(new_edge_sets, x_edge_sets, y_edge_sets), nodes = theNodes) mg@userAttrPos@edgePos <- .retMGEdgeUnionUserAttrPos(mgx, mgy) mg@nodeData@defaults <- .retNodeUnionDefaults(mgx, mgy) mg@nodeData@data <- .nodeUnion(x, y, nodeFun) mg@userAttrPos@nodePos <- .getUnionNodeUserAttrPos(mg, mgx, mgy) mg@edge_defaults <- .retMGEdgeUnionDefaults(mgx, mgy) mg }) .retMGEdgeUnionDefaults <- function(g1, g2) { eg <- intersect(names(g1@edge_sets), names(g2@edge_sets)) structure(lapply(eg, function(i) { cmnAttrs <- intersect(names(g1@edge_defaults[[i]]), names(g2@edge_defaults[[i]])) unqAttrs <- unique(c(names(g1@edge_defaults[[i]]), names(g2@edge_defaults[[i]]))) singleAttrs <- unqAttrs[!( unqAttrs %in% cmnAttrs)] cmn <- structure(lapply(cmnAttrs, function(x) { if(identical(g1@edge_defaults[[i]][[x]], g2@edge_defaults[[i]][[x]])) g1@edge_defaults[[i]][[x]] else NA }), names = cmnAttrs) sng <- structure(lapply(singleAttrs, function(x) { if(x %in% names(g1@edge_defaults[[i]])) g1@edge_defaults[[i]][[x]] else g2@edge_defaults[[i]][[x]] }), names = singleAttrs) c(cmn, sng) }), names = eg) } extractGraphBAM <- function(g, edgeSets) { if(missing(edgeSets)) edgeSets <- names(g@edge_sets) if (!all(nzchar(edgeSets)) || any(is.na(edgeSets)) || !(all(edgeSets %in% names(g@edge_sets)))) stop("edgeSet is invalid") nn <- nodes(g) esets <- g@edge_sets[edgeSets] df_empty <- data.frame(from = character(0), to = character(0), weight = numeric(0)) structure(lapply(names(esets), function(x) { edgeMode <- if(isDirected(esets[[x]])) "directed" else "undirected" bam <- graphBAM(df_empty, nodes = nn, edgemode = edgeMode, ignore_dup_edges = TRUE) bam@edgeSet <- esets[[x]] bam@nodeData@data <- g@nodeData@data bam@nodeData@defaults <- g@nodeData@defaults bam@userAttrPos@nodePos <- g@userAttrPos@nodePos bam@edgeData@defaults <- g@edge_defaults[[x]] if(length(g@userAttrPos@edgePos)) bam@userAttrPos@edgePos <- g@userAttrPos@edgePos[[x]] bam }), names = names(esets)) } ## Degree of a multigraph setMethod("degree", signature(object = "MultiGraph", Nodes = "missing"), function(object){ .mgDegree(object) }) ## Node data accces methods .nodeDataRetrieve <- function(self, n, attr) { if (length(attr) != 1L) stop("'attr' argument must specify a single attribute name") if ( ! (attr %in% names(self@nodeData@defaults))) stop("attribute not present: ", sQuote(attr)) nds <- nodes(self) .verifyNodes(n, nds) idx <- match(n, nds) names(idx) <- seq_along(idx) idx <- sort(idx) n <- n[as.numeric(names(idx))] names(idx) <- NULL bt <- self@userAttrPos@nodePos[[attr]] ord <- .getNodeAttrPos(bt, idx) res <- vector(length(idx), mode = mode(self@nodeData@defaults[[attr]])) res[seq_along(idx)] <- self@nodeData@defaults[[attr]] if (length(ord$leftPos)) res[ord$leftPos] <- self@nodeData@data[[attr]][ord$rightPos] as.list(structure(res, names = n)) } setMethod("nodeData", signature(self = "MultiGraph", n = "character", attr = "character"), function(self, n, attr) { .nodeDataRetrieve(self, n, attr) }) setMethod("nodeData", signature(self = "MultiGraph", n = "missing", attr = "character"), function(self, n, attr) { if(length(attr) != 1L) stop("'attr' must specify a single attribute") if( ! (attr %in% names(self@nodeData@defaults))) stop("attribute not present: ", sQuote(attr)) nds <- nodes(self) nodeData(self, n= nds, attr= attr) }) setMethod("nodeData", signature(self = "MultiGraph", n = "character", attr = "missing"), function(self, n, attr) { nds <- nodes(self) .verifyNodes(n ,nds) nms <- names(self@nodeData@defaults) structure(lapply(nms, function(x) { nodeData(self, n, x) }), names = nms) }) setMethod("nodeData", signature(self = "MultiGraph", n = "missing", attr = "missing"), function(self, n, attr) { nds <- nodes(self) nms <- names(self@nodeData@defaults) structure(lapply(nms, function(x) { nodeData(self, nds, x) }), names = nms) }) ## Node data replacement methods .nodeDataReplaceNodeGiven <- function(self, n, attr, value) { .verifyAttrName(attr, names(self@nodeData@defaults)) if(length(attr) != 1L) stop("attr argument must specify a single attribute") if(is.vector(value)){ len <- length(value) } else { len <- 1 value <- list(value) } if(len!=1L && len != length(n)) { stop("value must be of length one or have the same length as n") } nms <- names(self@nodeData@data) nds <- nodes(self) .verifyNodes(n, nds) if(len==1L && len !=length(n)) value <- rep(value, length(n)) idx <- match(n, nds) names(idx) <- seq_along(idx) idx <- sort(idx) value <- value[as.numeric(names(idx))] names(idx) <- NULL bt <- self@userAttrPos@nodePos[[attr]] bt <- .Call(graph_bitarray_set, bt, as.integer(idx), as.integer(rep(1L, length(idx)))) ns <- attr(bt, "nbitset") self@userAttrPos@nodePos[[attr]] <- bt ord <- .getNodeAttrOrder(bt, idx) newAttr <- vector(ns, mode = mode(value)) newAttr[attr(ord$newVal, "newPos")] <- value[ord$newVal] newAttr[attr(ord$origVal, "origPos")] <- self@nodeData@data[[attr]][ord$origVal] self@nodeData@data[[attr]] <- newAttr self } .nodeDataReplaceNodeMissing <- function (self, attr, value) { .verifyAttrName(attr, names(self@nodeData@defaults)) if(length(attr) != 1L) stop("attr argument must specify a single attribute") lenNode <- length(nodes(self)) if(is.vector(value)){ lenVal <- length(value) } else { lenVal <- 1 value <- list(value) } if(lenVal !=1L && lenVal != lenNode) { stop("value must be of length one or have the same length as number of nodes of self") } idx <- seq_len(lenNode) nodeData(self, n = nodes(self), attr) <- value self } setReplaceMethod("nodeData", signature(self = "MultiGraph", n="character", attr="character", value="ANY"), function(self, n, attr, value) { .nodeDataReplaceNodeGiven(self, n, attr, value) }) setReplaceMethod("nodeData", signature(self = "MultiGraph", n="missing", attr="character", value="ANY"), function(self, n, attr, value) { .nodeDataReplaceNodeMissing(self, attr, value) }) .verifyMgEdgeSetNames <- function(mg, e) { if(!e %in% names(mg@edge_defaults)) stop("edgeSet not found: ", sQuote(e)) if(numEdges(mg)[e] == 0) stop("edgeSet does not have any connected edges: ", sQuote(e)) } .verifyMgEdges <- function(mg, e, from, to) { stopifnot(length(from) == length(to)) if (length(from) == 0L) stop("edges not in edgeSet: ", sQuote(e)) adjList <- .mgIsAdj(mg, e, from, to) if (any(!adjList)) { badFr <- from[!adjList] badTo <- to[!adjList] res <- paste(badFr, badTo, sep = "|", collapse = ", ") stop("edges not found: ", sQuote(res)) } TRUE } .verifyMGAttrs <- function(mg, e, attr) { if( !(attr %in% names(mg@edge_defaults[[e]]))) stop("attr ", sQuote(attr), " not in edgeSet ", sQuote(e)) } setMethod("mgEdgeDataDefaults", signature(self ="MultiGraph", edgeSet="character", attr="character"), function(self, edgeSet, attr) { self@edge_defaults[[edgeSet]][[attr]] }) setMethod("mgEdgeDataDefaults", signature(self ="MultiGraph", edgeSet="character", attr="missing"), function(self, edgeSet, attr) { self@edge_defaults[[edgeSet]] }) setReplaceMethod("mgEdgeDataDefaults", signature(self="MultiGraph", edgeSet = "character", attr="missing", value="list"), function(self, edgeSet, attr, value) { self@edge_defaults[[edgeSet]] <- value wt <- self@edge_defaults[[edgeSet]][["weights"]] if(!is.numeric(wt) && !is.null(wt)) stop("weights attribute has to be of type numeric") ndsLen <- length(nodes(self)) nms <- names(value) posBit <- .createZeroBitPos(ndsLen) for(i in seq_along(value)) { nms <- names(self@userAttrPos@edgePos[[edgeSet]]) if(!(nms[i] %in% nms)) { if(nms[i] != "weight"){ self@userAttrPos@edgePos[[edgeSet]][[nms[i]]] <- posBit } } } self }) setReplaceMethod("mgEdgeDataDefaults", signature(self="MultiGraph", edgeSet = "character", attr="character", value="ANY"), function(self, edgeSet, attr, value) { self@edge_defaults[[edgeSet]][[attr]] <- value if(attr == "weight") { wt <- self@edge_defaults[[edgeSet]][["weights"]] if(!is.numeric(wt) && !is.null(wt)) stop("weights attribute has to be of type numeric") } else{ ndsLen <- length(nodes(self)) posBit <- .createZeroBitPos(ndsLen) if(!(attr %in% names(self@userAttrPos@edgePos[[edgeSet]]))) { self@userAttrPos@edgePos[[edgeSet]][[attr]] <- posBit } } self }) ## MultiGraph edgeData methods setMethod("mgEdgeData", signature(self = "MultiGraph", edgeSet = "character", from = "character", to = "character", attr = "character"), function(self, edgeSet, from , to, attr) { nodeNames <- self@nodes .verifyMgEdgeSetNames(self, edgeSet) req_ft <- .align_from_to(from, to, nodeNames) if(nrow(req_ft) > 0) .verifyMgEdges(self, edgeSet, req_ft[,"from"], req_ft[,"to"]) .verifyMGAttrs(self, edgeSet, attr) numNodes <- length(nodeNames) bv <- self@edge_sets[[edgeSet]]@bit_vector val <- .retMGAttrVec(self, edgeSet, attr) ft <- .Call(graph_bitarray_rowColPos, self@edge_sets[[edgeSet]]@bit_vector) if(!isDirected(self@edge_sets[[edgeSet]])) { df <- cbind(from=ft[,"to"], to = ft[,"from"]) ft <- rbind(ft,df) val <- c(val, val) } ft <- data.frame(ft) ft <- ft[with(ft, order(to,from)),] req_i <- structure(match(req_ft, nodeNames), dim = dim(req_ft)) colnames(req_i) <- c("from", "to") tmp <- rbind(req_i, ft) pst <- paste(tmp[,"from"],tmp[,"to"], sep = "_") idx <- duplicated(pst)[seq(nrow(req_i) +1 , nrow(tmp))] ord <- order(req_i[,2], req_i[,1]) req_i <- req_i[ord,,drop =FALSE] val <- structure(val[idx], names = paste(nodeNames[req_i[,1]],nodeNames[req_i[,2]], sep = "|")) as.list(val) }) setMethod("mgEdgeData", signature(self = "MultiGraph", edgeSet = "character", from = "character", to = "missing", attr = "character"), function(self, edgeSet, from , to, attr) { .verifyMgEdgeSetNames(self,edgeSet) .mgGetAttrs( self, edgeSet, from, attr) }) setMethod("mgEdgeData", signature(self = "MultiGraph", edgeSet = "character", from = "missing", to = "character", attr = "character"), function(self, edgeSet, from , to, attr) { .verifyMgEdgeSetNames(self,edgeSet) nodeNames <- self@nodes numNodes <- length(nodeNames) bv <- self@edge_sets[[edgeSet]]@bit_vector val <- .retMGAttrVec(self, edgeSet, attr) ft <- .Call(graph_bitarray_rowColPos, self@edge_sets[[edgeSet]]@bit_vector) if(!isDirected(self@edge_sets[[edgeSet]])) { df <- cbind(from=ft[,"to"], to = ft[,"from"]) ft <- rbind(ft,df) val <- c(val,val) } tmp <- seq_len(length(val)) ft <- data.frame(ft, tmp, stringsAsFactors = FALSE) ft <- ft[ft[,"to"] %in% which(nodeNames %in% to),] if(nrow(ft) == 0) stop("edges in \"to\" not found in \"self\"") .verifyMgEdges(self, edgeSet, nodeNames[ft[,"from"]], nodeNames[ft[,"to"]]) nodeLbl <- paste( nodeNames[ft[,"from"]], nodeNames[ft[, "to"]], sep ="|") val <- val[ft[,"tmp"]][seq_along(nodeLbl)] names(val) <- nodeLbl as.list(val) }) setMethod("mgEdgeData", signature(self = "MultiGraph", edgeSet = "character", from = "missing", to = "missing", attr = "character"), function(self, edgeSet, from , to, attr) { .verifyMgEdgeSetNames(self,edgeSet) eg <- .edges_mg(self, edgeSet) .mgGetAttrs( self, edgeSet, from = names(eg), attr) }) ## MultiGraph edgeData replacement methods setReplaceMethod("mgEdgeData", signature(self = "MultiGraph", edgeSet = "character", from = "character", to = "character", attr = "character", value = "ANY"), function(self, edgeSet, from, to, attr, value) { .verifyMgEdgeSetNames(self,edgeSet) .verifyAttrName(attr, names(self@edge_defaults[[edgeSet]])) lenFrom <- length(from) lenTo <- length(to) if (lenFrom != lenTo) { if(lenFrom ==1) from <- rep(from, lenTo) else if (lenTo == 1) to <- rep(to , lenFrom) else stop("arguments 'from', 'to' differ in length") } if(length(edgeSet) != 1L) stop("edgeSet has to be of length 1") .mgSetAttrs(self, edgeSet, from, to, attr, value) }) setReplaceMethod("mgEdgeData", signature(self="MultiGraph", edgeSet = "character", from = "character", to = "missing", attr="character", value = "ANY"), function(self, edgeSet, from, to, attr, value) { .verifyAttrName(attr, names(self@edge_defaults[[edgeSet]])) .verifyMgEdgeSetNames(self,edgeSet) eg <- .edges_mg(self, edgeSet)[from] to <- unlist(eg, use.names = FALSE) len <- as.numeric(sapply(eg, length)) from <- rep(names(eg),len) .mgSetAttrs(self, edgeSet, from, to, attr, value) }) setReplaceMethod("mgEdgeData", signature(self="MultiGraph", edgeSet = "character", from="missing", to="character", attr="character", value="ANY"), function(self,edgeSet, from, to, attr, value) { .verifyMgEdgeSetNames(self,edgeSet) eg <- .edges_mg(self, edgeSet, direction = "in") eg <- eg[order(names(eg))][to] from <- unlist(eg, use.names = FALSE) len <- as.numeric(sapply(eg, length)) to <- rep(names(eg), len) .mgSetAttrs(self, edgeSet, from, to, attr, value) }) setReplaceMethod("mgEdgeData", signature(self="MultiGraph", edgeSet = "character", from="missing", to="missing", attr="character", value="ANY"), function(self, edgeSet, from, to, attr, value) { .verifyMgEdgeSetNames(self, edgeSet) nn <- nodes(self) df <- diEdgeSetToDataFrame(self@edge_sets[[edgeSet]], nn) from <- nn[df[,"from"]] to <- nn[df[,"to"]] .mgSetAttrs(self, edgeSet, from, to, attr, value) }) .edges_mg <- function(object, e, direction="out") { nn <- nodes(object) if (numEdges(object)[e] == 0L) { names(nn) <- nn c0 <- character(0L) return(lapply(nn, function(x) c0)) } ft <- .Call(graph_bitarray_rowColPos, object@edge_sets[[e]]@bit_vector) ft[] <- nn[ft] eL <- singles <- NULL if (isDirected(object@edge_sets[[e]])) { if (direction == "in") ft[ , c("from", "to")] <- ft[ , c("to", "from")] eL <- split(ft[ , "to"], ft[ , "from"]) singles <- nn[!(nn %in% ft[ , "from"])] } else { eL <- lapply(split(ft, ft[ , c("to", "from")]), unique) singles <- nn[!(nn %in% ft)] } if (length(singles) > 0) { names(singles) <- singles c0 <- character(0L) empties <- lapply(singles, function(x) c0) eL <- c(eL, empties) } eL[order(names(eL))] } .mgIsAdj <- function(object, e, from, to) { eSpec <- .normalizeEdges(from, to) from <- eSpec$from to <- eSpec$to fromIdx <- match(from, nodes(object), nomatch=0) toIdx <- match(to, nodes(object), nomatch=0) if (any(fromIdx == 0)) stop("unknown nodes in 'from': ", pasteq(from[fromIdx == 0])) if (any(toIdx == 0)) stop("unknown nodes in 'to': ", pasteq(to[toIdx == 0])) fromEdges <- .edges_mg(object, e)[from] .Call(graph_is_adjacent, fromEdges, to) } .mgSetAttrs <- function(mg, e, from, to, attr, value) { nodeNames <- mg@nodes req_ft <- .align_from_to(from, to, nodeNames) ## remove dups indx <- duplicated(paste(req_ft[,"from"], req_ft[,"to"], sep ="_")) req_ft <- req_ft[!indx, ,drop = FALSE] if(nrow(req_ft) > 0) .verifyMgEdges(mg, e, req_ft[,"from"], req_ft[,"to"]) else stop("edges specified could not be found in edgeSet ", sQuote(e)) if(is.vector(value)) { len <- length(value) }else{ len <- 1 value <- list(value) } if(len == 1L) value <- rep(value, nrow(req_ft)) if(length(value) != nrow(req_ft)) stop("number of edges and attribute values must be the same") ft <- .Call(graph_bitarray_rowColPos, mg@edge_sets[[e]]@bit_vector) if (!isDirected(mg@edge_sets[[e]])) { ## normalize from/to valIndx <- seq_len(length(value)) tmp <- .mg_undirectEdges(req_ft[ , 1], req_ft[, 2], valIndx) req_ft <- cbind(tmp[["from"]], tmp[["to"]]) value <- value[tmp[["weight"]]] } ## convert node names to index req_i <- structure(match(req_ft, nodeNames), dim = dim(req_ft)) colnames(req_i) <- c("from", "to") req_i <- data.frame(req_i) idx <- order(req_i[,2], req_i[,1]) req_i <- req_i[idx, ] value <- value[idx] if(attr == "weight") { attrBit <- mg@edge_sets[[e]]@bit_vector if(nrow(req_i)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, attrBit, as.integer(req_i[,"from"]), as.integer(req_i[,"to"])) mg@edge_sets[[e]]@bit_vector <- setBitCell(attrBit, req_i[,"from"], req_i[,"to"], rep(1L, nrow(req_i))) nt <- attr(mg@edge_set[[e]]@bit_vector, "nbitset") } else { nt <- attr(attrBit, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = mode(value)) newAttr[ord$origLeftPos] <- mg@edgeSet@weights[ord$origRightPos] newAttr[ord$newLeftPos] <- value[ord$newRightPos] mg@edge_sets[[e]]@weights <- newAttr } else { attrBit <- mg@userAttrPos@edgePos[[e]][[attr]] if(nrow(req_i)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, attrBit, as.integer(req_i[,"from"]), as.integer(req_i[,"to"])) mg@userAttrPos@edgePos[[e]][[attr]] <- setBitCell(attrBit, req_i[,"from"], req_i[,"to"], rep(1L, nrow(req_i))) nt <- attr(mg@userAttrPos@edgePos[[e]][[attr]], "nbitset") } else { nt <- attr(attrBit, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = mode(value)) newAttr[ord$origLeftPos] <- mg@edge_sets[[e]]@edge_attrs[[attr]][ord$origRightPos] newAttr[ord$newLeftPos] <- value[ord$newRightPos] mg@edge_sets[[e]]@edge_attrs[[attr]] <- newAttr } mg } .retMGAttrVec <- function(g, e, attr) { if(attr !="weight") { k1 <- g@edge_sets[[e]]@bit_vector k2<- g@userAttrPos@edgePos[[e]][[attr]] tmp <- attributes(k1) res <- k1& (!k2) attributes(res) <- tmp ns <- .Call(graph_bitarray_sum, res) attr(res, "nbitset") <- ns ft <- data.frame(.Call(graph_bitarray_rowColPos,res)) dflt <- g@edge_defaults[[e]][[attr]] attrBit <- g@userAttrPos@edgePos[[e]][[attr]] ft <- ft[with(ft, order(to, from)),] if(nrow(ft)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, attrBit, as.integer(ft[,"from"]), as.integer(ft[,"to"])) attrBit <- setBitCell(attrBit, ft[,"from"], ft[,"to"], rep(1L, nrow(ft))) nt <- attr(attrBit, "nbitset") } else { nt <- attr(attrBit, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = mode(dflt)) if(!is.null(g@edge_sets[[e]]@edge_attrs[[attr]])) { newAttr[ord$origLeftPos] <- g@edge_sets[[e]]@edge_attrs[[attr]][ord$origRightPos] newAttr[ord$newLeftPos] <- if(mode(dflt)=="list") { rep(list(dflt), length(ord$newLeftPos)) } else dflt }else{ newAttr[seq_len(nt)] <- if(mode(dflt)=="list") { rep(list(dflt), nt) } else dflt } }else{ newAttr <- g@edge_sets[[e]]@weights } newAttr } .mgGetAttrs <- function(self, edge, from, attr) { nodeNames <- self@nodes indx <- which(nodeNames %in% from) numNodes <- length(nodeNames) bv <- self@edge_sets[[edge]]@bit_vector .verifyMGAttrs(self, edge, attr) val <- .retMGAttrVec(self, edge, attr) ft <- .Call(graph_bitarray_rowColPos, bv) if(!isDirected(self@edge_sets[[edge]])) { df <- cbind(from=ft[,"to"], to = ft[,"from"]) ft <- rbind(ft,df) val <- c(val,val) } tmp <- seq_len(length(val)) ft <- data.frame(ft, tmp, stringsAsFactors = FALSE ) ft <- ft[ ft[,"from"] %in% indx,] if(nrow(ft) == 0) stop("edges specified in \"from\" not found in edgeSet ", sQuote(edge)) nodeLbl <- paste( nodeNames[ft[,"from"]], nodeNames[ft[, "to"]], sep ="|") val <- val[ft[,"tmp"]][seq_along(nodeLbl)] names(val) <- nodeLbl as.list(val) } setMethod("nodeDataDefaults", signature(self="MultiGraph", attr="missing"), function(self, attr){ attrDefaults(self@nodeData) }) setMethod("nodeDataDefaults", signature(self="MultiGraph", attr="character"), function(self, attr){ attrDefaults(self@nodeData, attr) }) setReplaceMethod("nodeDataDefaults", signature(self="MultiGraph", attr="missing", value="list"), function(self, attr, value) { attrDefaults(self@nodeData) <- value nmsNds <- names(self@nodeData@defaults) nmsAttr <- names(self@userAttrPos@nodePos) ndsLbls <- nmsNds[ !(nmsNds %in% nmsAttr)] if(length(ndsLbls)) { ndsLen <- length(nodes(self)) bt <- makebits(ndsLen) } for(i in ndsLbls) { self@userAttrPos@nodePos[[i]] <- bt } self }) setReplaceMethod("nodeDataDefaults", signature(self="MultiGraph", attr="character", value="ANY"), function(self, attr, value) { attrDefaults(self@nodeData, attr) <- value ndsLen <- length(nodes(self)) if(! (attr %in% names(self@userAttrPos@nodePos))){ bt <- makebits(ndsLen) self@userAttrPos@nodePos[[attr]] <- bt } self }) setMethod("edgeSets", signature("MultiGraph"), function(object, ...) { names(object@edge_sets) }) setMethod("edges", signature("MultiGraph", "character"), function(object, which, edgeSet) { if(missing(edgeSet)) edgeSet <- edgeSets(object) if (!all(edgeSet %in% edgeSets(object))) stop("edgeSet specified not found in MultiGraph") if (!all(which %in% nodes(object))) stop("nodes specified not found in MultiGraph") eg <- extractGraphBAM(object, edgeSet) if(length(eg) == 1) edges(eg[[edgeSet]], which) else lapply(eg, edges, which) }) setMethod("edges", signature("MultiGraph", "missing"), function(object, edgeSet) { if (missing(edgeSet)) edgeSet <- edgeSets(object) if (!all(edgeSet %in% edgeSets(object))) stop("edgeSet specified not found in MultiGraph") eg <- extractGraphBAM(object, edgeSet) if(length(eg) == 1) edges(eg[[edgeSet]]) else lapply(eg, edges) }) setMethod("edgeNames", signature("MultiGraph"), function(object, edgeSet) { if(missing(edgeSet)) edgeSet <- edgeSets(object) if (!all(edgeSet %in% edgeSets(object))) stop("edgeSet specified not found in MultiGraph") eg <- extractGraphBAM(object, edgeSet) if(length(eg) == 1) edgeNames(eg[[edgeSet]]) else lapply(eg, edgeNames) }) graph/R/NELhandler.R0000644000175100017510000001022412607264574015207 0ustar00biocbuildbiocbuildNELhandler <- function () { # # this function is to work with omegahat's XML xmlEventParse # current version: given a GXL graph, capture the node names and # edge data to return the graph as graph::graphNEL # graphID <- NULL curNode <- NULL curEdge <- NULL curAttr <- NULL inNode <- FALSE inEdge <- FALSE inAttr <- FALSE nodeL <- list() edgeL <- list() edgemode <- NULL # # handler elements: start elements are cased for # graph, node, attr, or edge # text is limited in the simple example to the attr tag, # which lives under a node or an edge # startElement = function(x, atts, ...) { if (x == "graph") { graphID <<- atts["id"] edgemode <<- atts["edgemode"] } else if (x == "node") { inNode <<- TRUE nodeL[[atts["id"]]] <<- list() curNode <<- atts["id"] } else if (x == "attr") { inAttr <<- TRUE curAttr <<- atts["name"] } else if (x == "edge") { inNode <<- FALSE inEdge <<- TRUE edgeL[[atts["id"]]] <<- list() edgeL[[atts["id"]]][["span"]] <<- c(atts["from"], atts["to"]) curEdge <<- atts["id"] } } text = function(x, atts, ...) { if (inNode & inAttr & nchar(x) > 0) nodeL[[curNode]][[curAttr]] <<- x else if (inEdge & inAttr & nchar(x) > 0) edgeL[[curEdge]][[curAttr]] <<- c(edgeL[[curEdge]][[curAttr]], x) } endElement = function(x, ...) { if (x == "attr") inAttr <<- FALSE else if (x == "node") inNode <<- FALSE else if (x == "edge") inEdge <<- FALSE } dump = function() { list(graphID = graphID, nodeL = nodeL, edgeL = edgeL, edgemode = edgemode) } asGraphNEL = function() { # # revised Jun 16 2004 # when callsed, nodeL is the named list of node data, edgeL is # named list of edge data (unrelated to edgeL of graphNEL!!!) # require(graph) ns <- names(nodeL) if (length(edgeL) == 0) return(graphNEL(nodes = ns, edgemode = edgemode)) # # edgeL has a span element giving source and destination of each # edge # src <- sapply(edgeL, function(x) x$span["from"]) dest <- sapply(edgeL, function(x) x$span["to"]) wts <- sapply(edgeL, function(x) as.numeric(x$weights)) NOWTS <- FALSE if (all(sapply(wts,length)==0)) NOWTS <- TRUE names(wts) <- dest # # graphNEL edgeL structure is a named list with one element # for each node of graph. the edges component for a node N # has node indices of the destinations of each edge starting at N # desti <- match(dest, ns) edl <- split(desti, src) wtl <- split(wts, src) for (i in seq_along(ns)) { if (length(edl[[ns[i]]]) == 0) edl[[ns[i]]] <- list(edges = integer(0)) else if (!NOWTS) edl[[ns[i]]] <- list(edges = edl[[ns[i]]], weights=wtl[[ns[i]]]) else edl[[ns[i]]] <- list(edges = edl[[ns[i]]]) } edl <- edl[ns] if (edgemode %in% c("undirected", "defaultundirected")) edgemode <- "undirected" else edgemode <- "directed" g <- graphNEL(nodes = ns, edgeL = edl, edgemode = edgemode) if (edgemode(g) == "undirected") { edgemode(g) <- "directed" # allow ugraph to do something g <- ugraph(g) edgemode(g) <- "undirected" } if (!validGraph(g)) { msg <- "GXL did not define a valid graph package graphNEL object. Most likely there is a failure of reciprocity for edges in an undirected graph. If there is a node for edge from A to B in an undirected graphNEL, there must also be an edge from B to A." stop(paste0(c("", strwrap(msg)), collapse="\n")) } return(g) } list(startElement = startElement, endElement = endElement, text = text, dump = dump, asGraphNEL = asGraphNEL) } graph/R/TODOT.R0000644000175100017510000000753712607264574014141 0ustar00biocbuildbiocbuild #setClass("compoundGraph", # representation(grList="list", # between="list")) #setMethod("grList","compoundGraph", function(object)object@grList) # #setMethod("between", "compoundGraph", function(object)object@between) setMethod("toDotR", c("graphNEL", "character", "list", "list"), function (G, outDotFile, renderList, optList=.standardToDotOptions) { buildEdge <- function(fromTok, toTok, opts, labField=NULL) { protq <- function(x) paste0("\"",x,"\"") core <- paste(protq(fromTok),"->",protq(toTok),";\n",sep=" ") UDB <- opts$useDirBack ELF <- opts$edgeLabelField if (length(UDB) == 0) UDB <- FALSE if (length(ELF) == 0 || nchar(ELF) == 0 || is.null(labField)) ELF <- FALSE else ELF <- TRUE if (!UDB & !ELF) return(core) if (UDB & !ELF) return(paste("edge [dir=back]", core, sep=" ")) if (!UDB & ELF) return( paste0("edge [label=", labField,"] ", core)) if (UDB & ELF) return(paste0("edge [dir=back label=", labField,"] ", core)) stop("logic error") } ## to get bottom to top orientation (B points up to A), use ## [dir=back] A->B if (is.null(renderList$start)) renderList$start <- "digraph G" out <- paste0(renderList[["start"]], " {\n") ned <- length(E <- edgeL(G)) enms <- names(E) nds <- nodes(G) ac <- as.character if (!is.null(pn <- renderList[["prenodes"]])) out <- paste(out, pn, "\n") ## need quote marks protq <- function(x) paste0("\"", x, "\"") ## this takes care of isolated nodes if present for (j in nds) out <- paste( out, protq(j), ";\n" ) ## deal with an edge statement if (!is.null(pe <- renderList[["preedges"]])) out <- paste(out, pe, "\n") if (ned > 0) for (i in seq_len(ned)) { if ((L <- length(E[[i]]$edges)) > 0) for (j in seq_len(L)) { builtEdge <- buildEdge(from=nds[ E[[i]]$edges[j] ], to=enms[i], optList, E[[i]][[ optList$edgeLabelField ]]) out <- paste(out, builtEdge, sep=" ") } } out <- paste(out, "}\n", sep = "", collapse = "") if (outDotFile != ".AS.STRING") { cat(out, file = outDotFile) paste("dot file written to", sQuote(outDotFile), " use 'dot -Tps [.dot] [.ps] to render.\n") invisible(0) } else out }) setMethod("toDotR", c("graphNEL", "character", "missing", "missing"), function(G, outDotFile, renderList, optList) toDotR(G, outDotFile, list(start="digraph G"), .standardToDotOptions)) # where=where) setMethod("toDotR", c("graphNEL", "missing", "missing", "missing"), function(G, outDotFile, renderList, optList) toDotR(G, , list(start="digraph G"), .standardToDotOptions)) #where=where) setMethod("toDotR", c("graphNEL", "missing", "character", "missing"), function (G, outDotFile, renderList, optList) toDotR(G, ".AS.STRING", list(start=renderList," "), .standardToDotOptions)) # where=where) setMethod("toDotR", c("graphNEL", "missing", "list", "list"), function(G, outDotFile, renderList, optList) toDotR(G, ".AS.STRING" , renderList, optList)) # where=where) setMethod("toDotR", c("graphNEL", "missing", "list", "missing"), function(G, outDotFile, renderList, optList) toDotR(G, ".AS.STRING" , renderList, .standardToDotOptions)) # where=where) setMethod("toDotR", c("graphNEL", "missing", "missing", "list"), function(G, outDotFile, renderList, optList) toDotR(G, ".AS.STRING" , list(start="digraph G"), optList)) # where=where) setMethod("toDotR", c("graphNEL", "character", "missing", "list"), function(G, outDotFile, renderList, optList) toDotR(G, outDotFile , list(start="digraph G"), optList)) # where=where) .standardToDotOptions <- list( useDirBack=TRUE ) graph/R/attrData.R0000644000175100017510000001110712607264574015000 0ustar00biocbuildbiocbuildsetMethod("initialize", signature("attrData"), function(.Object, defaults) { .Object@data <- list() if (missing(defaults)) defaults <- list() else { if (is.null(names(defaults)) || any(is.na(names(defaults)))) stop("defaults must have names for all elements") } .Object@defaults <- defaults .Object }) .addDefaultAttrs <- function(attrData, defaults) { if (is.null(attrData)) return(defaults) defaults[names(attrData)] <- attrData defaults } .verifyAttrListNames <- function(attrData, defaults) { if (any(! names(attrData) %in% names(defaults))) { nms <- names(attrData) badNms <- nms[! nms %in% names(defaults)] stop("attribute names not in attrData: ", pasteq(badNms)) } else { TRUE } } .checkAttrLength <- function(attrName) { if (length(attrName) != 1) stop("'attr' argument must specify a single attribute name") } .verifyAttrName <- function(attrName, knownNames) { .checkAttrLength(attrName) if (! attrName %in% knownNames) stop("unknown attribute name: ", sQuote(attrName)) TRUE } setMethod("attrDefaults", signature(self="attrData", attr="missing"), function(self, attr) { self@defaults }) setMethod("attrDefaults", signature(self="attrData", attr="character"), function(self, attr) { .verifyAttrName(attr, names(self@defaults)) self@defaults[[attr]] }) setReplaceMethod("attrDefaults", signature(self="attrData", attr="character", value="ANY"), function(self, attr, value) { .checkAttrLength(attr) self@defaults[[attr]] <- value self }) setReplaceMethod("attrDefaults", signature(self="attrData", attr="missing", value="list"), function(self, attr, value) { if (is.null(names(value))) stop("attribute list must have names") self@defaults <- value self }) setMethod("attrDataItem", signature(self="attrData", x="character", attr="missing"), function(self, x, attr) { itemData <- self@data[x] ## unknown items will have name NA and value NULL names(itemData) <- x itemData <- lapply(itemData, .addDefaultAttrs, self@defaults) itemData }) setMethod("attrDataItem", signature(self="attrData", x="character", attr="character"), function(self, x, attr) { .verifyAttrName(attr, names(self@defaults)) .Call(graph_attrData_lookup, self, x, attr) }) setReplaceMethod("attrDataItem", signature(self="attrData", x="character", attr="character", value="ANY"), function(self, x, attr, value) { .verifyAttrName(attr, names(self@defaults)) if (length(value) > 1 && length(value) != length(x)) stop("'value' must be length one or ", "have the same length as 'x'") self@data <- .Call(graph_sublist_assign, self@data, x, attr, value) self }) setReplaceMethod("removeAttrDataItem", signature(self="attrData", x="character", value="NULL"), function(self, x, value) { idx <- match(x, names(self@data)) idx <- idx[!is.na(idx)] if (length(idx)) self@data <- self@data[-idx] self }) setMethod("names", "attrData", function(x) { names(x@data) }) setReplaceMethod("names", signature(x="attrData", value="character"), function(x, value) { if (length(x@data) != length(value)) stop("'value' length doesn't match data") if (any(duplicated(value))) stop("'value' must specify unique names") if (any(is.na(value))) stop("'value' cannot contain NAs") names(x@data) <- value x }) graph/R/bitarray.R0000644000175100017510000000561112607264574015054 0ustar00biocbuildbiocbuild .indexToCoord <- function(i, nrow) { ## only for square if (nrow == 1L) return(cbind(1L, 1L)) ans <- matrix(0L, nrow = length(i), ncol = 2L) ans[ , 2L] <- ((i - 1L) %/% nrow) + 1L ans[ , 1L] <- ((i - 1L) %% nrow) + 1L ans } .coordToIndex <- function(x, y, nrow) { if (nrow == 1L) return(1L) (y * nrow) - (nrow - x) } .rowIndex <- function(x, n_row, n_col) .coordToIndex(rep(x, n_col), seq_len(n_col), n_row) .columnIndex <- function(y, n_row) .coordToIndex(seq_len(n_row), rep(y, n_row), n_row) makebits <- function(n, bitdim=NULL) { if (!is.null(bitdim)) bitdim <- as.integer(bitdim) n <- as.integer(n) structure(raw(ceiling(n / 8)), bitlen = n, bitdim = bitdim, nbitset = 0L) } bitdim <- function(x, dims) { attr(x, "bitdim") <- dims x } setBitCell <- function(xx, x, y, val) { dim <- attr(xx, "bitdim") idx <- .coordToIndex(x, y, dim[1L]) setbitv(xx, idx, val) } getBitCell <- function(xx, x, y) { dim <- attr(xx, "bitdim") idx <- .coordToIndex(x, y, dim[1L]) testbit(xx, idx) } getColumn <- function(xx, y) { dim <- attr(xx, "bitdim") idx <- .columnIndex(y, dim[1L]) testbit(xx, idx) ## wonder if there is a nice optimization since we will be reading ## consecutive bits for column oriented storage. } getRow <- function(xx, x) { dim <- attr(xx, "bitdim") n_row <- dim[1L] n_col <- dim[2L] idx <- .rowIndex(x, n_row, n_col) testbit(xx, idx) } bitlen <- function(x) attr(x, "bitlen") nbitset <- function(x) attr(x, "nbitset") bitToLogical <- function(x) { len <- attr(x, "bitlen") if (is.null(len)) len <- length(x) * 8L sapply(seq_len(len), function(i) testbit(x, i)) } setbitv <- function(xx, ii, v) { .Call(graph_bitarray_set, xx, ii, v) } ## can we vectorize these? setbit <- function(xx, ii) { i <- ii - 1L byteIdx <- (i %/% 8L) + 1L bit <- (i %% 8L) byte <- xx[byteIdx] xx[byteIdx] <- byte | rawShift(as.raw(1L), bit) xx } testbit <- function(xx, ii) { i <- ii - 1L byteIdx <- (i %/% 8L) + 1L bit <- (i %% 8L) byte <- xx[byteIdx] ans <- logical(length(byte)) for (i in seq_len(length(ans))) { ans[i] <- as.logical(byte[i] & rawShift(as.raw(1L), bit[i])) } ans } sumbits <- function(xx, ii) { s <- 0L i <- ii - 1L byteIdx <- (i %/% 8L) + 1L bit <- (i %% 8L) byte <- xx[byteIdx] for (i in seq_len(length(byte))) { s <- s + as.logical(byte[i] & rawShift(as.raw(1L), bit[i])) } s } bitToInteger <- function(x) { len <- attr(x, "bitlen") if (is.null(len)) len <- length(x) * 8L sapply(seq_len(len), function(i) if (testbit(x, i)) 1L else 0L) } bitToMat <- function(x) { len <- attr(x, "bitlen") bitdim <- attr(x, "bitdim") matrix(sapply(seq_len(len), function(i) if (testbit(x, i)) 1L else 0L), nrow = bitdim[1L], ncol = bitdim[2L]) } graph/R/buildDepGraph.R0000644000175100017510000000025712607264574015752 0ustar00biocbuildbiocbuildpkgInstOrder <- function() { .Defunct("getInstallOrder", package="pkgDepTools") } buildRepDepGraph <- function() { .Defunct("makeDepGraph", package="pkgDepTools") } graph/R/clustergraph.R0000644000175100017510000002445712607264574015753 0ustar00biocbuildbiocbuild##copyright 2002 R. Gentleman, all rights reserved ## a simple implementation of the notions of cluster graphs ## and clustering using distance measures ## for the adjacency matrix view of undirected graphs the ## storage of the graph in lower triangular form is appealing ## The lower triangle of the distance matrix stored by columns in a ## single vector. The vector has the attributes `"Size"', `"Diag"', ## `"Upper"', `"Labels"' and `"class"' equal to `"dist"'. ## the lower triangle stored by columns ## for i < j <= n the dissimilarity between row i and j is ## x[n*(i-1)-i*(i-1)/2+j-i] ## size is the number of obs ## labels are their labels, Diag and Upper indicate how to print ## ##a function for Martin -- if it ever gets good enough. ##FIXME: should look at other matrix packages; this is just subsetting ##from a lower (or upper) triangular matrix representation -- which ##should be easier...but maybe it needs to be done in C "[.dist" <- function(x, i, j, drop=TRUE) { lend <- attr(x, "Size") if( missing(i) ) if( missing(j) ) return(x) else { ## return columns i <- seq_len(lend) } if( missing(j) ) { j <- seq_len(lend) } ## we have both -- return a matrix leni <- length(i) lenj <- length(j) outl <- leni*lenj iuse <- rep(i, length.out=outl) juse <- rep(j, rep(leni, lenj), length.out=outl) igtj <- iuse > juse newi <- ifelse(!igtj, iuse, juse) newj <- ifelse(igtj, iuse, juse) lend <- attr(x, "Size") subs <- lend*(newi-1)-newi*(newi-1)/2+newj-newi zeros <- newi==newj rval <- rep(0, length(subs)) subs <- subs[!zeros] sdata <- unclass(x)[subs] rval[!zeros]<-sdata labels <- attr(x, "Labels") if( drop && (lenj == 1 || leni==1) ) { out<-rval if( leni == 1 ) names(out) <- labels[j] else names(out) <- labels[i] } else { out <- matrix(rval, ncol=lenj, nrow=leni) dimnames(out) <- list(labels[i], labels[j]) } out } setMethod("initialize", "distGraph", function(.Object, Dist) { if( is.null( attr(Dist, "Labels") ) ) attr(Dist, "Labels") = as.character(seq_len(attr(Dist, "Size"))) else checkValidNodeName(attr(Dist, "Labels")) .Object@Dist = Dist .Object }) setMethod("Dist", "distGraph", function(object) object@Dist) setMethod("show", "distGraph", function(object) { cat("distGraph with ", attr(object@Dist, "Size"), " nodes \n", sep="")}) setMethod("threshold", "distGraph", function(object, k, value=0) { nd <- object@Dist nd[nd > k ] <- value new("distGraph", Dist=nd) }) setMethod("addNode", c("character", "distGraph", "list"), function(node, object, edges) { gN = nodes(object) nNode = length(gN) nAdd = length(node) numE = sapply(edges, length) if( any(numE != nNode+nAdd) ) stop("must supply all internode distances") newN <- c(gN, node) nmE <- names(edges) if( length(nmE) != nAdd || any(!(names(edges) %in% node))) stop("edges must be named") edges <- edges[node] lapply(edges, function(x) if(any( !(names(x) %in% newN) ) ) stop("bad edge specification")) ordE <- lapply(edges, function(x) x[newN]) subM <- sapply(ordE, function(x) x) ##should be a matrix! oldD <- as.matrix(Dist(object)) f1 <- cbind(oldD, subM[seq_len(nNode),]) f2 <- rbind(f1, t(subM)) rv <- new("distGraph", Dist = as.dist(f2)) }) setMethod("numNodes", "distGraph", function(object) attr(Dist(object), "Size")) setMethod("adj", c("distGraph", "ANY"), function(object, index) { nodenames<- nodes(object) if( is.character(index) ) index <- match(index, nodenames) if( !is.numeric(index) ) stop("'index' not recognized") adjM <- object@Dist[index,] if( is.matrix(adjM) ) adjL <- split(adjM, row(adjM)) else adjL <- list(adjM) for(i in seq_along(adjL)) adjL[[i]] <- names(adjL[[i]])[adjL[[i]] > 0 ] return(adjL) }) setMethod("edges", c("distGraph", "missing"), function(object, which) { nN <- nodes(object) eL <- lapply(nN, function(x) adj(object, x)[[1]]) names(eL) <- nN return(eL) }) setMethod("edges", c("distGraph", "character"), function(object, which) { nN <- nodes(object) wh<-match(which, nN) if( any(is.na(wh)) ) stop("'which' nodes not all in graph") eL <- lapply(which, function(x) adj(object, x)[[1]]) names(eL) <- which eL}) ## FIXME: update for new attribute storage setMethod("edgeWeights", "distGraph", function(object, index, attr, default, type.checker) { edg <- edges(object) if( !missing(index) ) edg <- edg[index] NODES <- nodes(object) edLocs <- match(names(edg), NODES) edE <- lapply(edg, function(x) match(x, NODES)) for( i in seq(along=edLocs) ) edE[[i]] <- object@Dist[edLocs[i], edE[[i]]] names(edE) <- names(edg) edE }) setMethod("subGraph", c("character", "distGraph"), function(snodes, graph) { gN <- nodes(graph) whN <- match(snodes, gN) if( any(is.na(whN) ) ) stop("'snodes' not all in graph") nD <- as.matrix(Dist(graph))[whN, whN] new("distGraph", Dist=as.dist(nD)) }) setMethod("edgeL", "distGraph", function(graph, index) { edges <- edges(graph) edgeL <- mapply(function(x, y, nodes) { out <- list(edges=match(x, nodes), weights=y) }, edges, edgeWeights(graph), MoreArgs=list(nodes=nodes(graph)), SIMPLIFY=FALSE) names(edgeL) <- names(edges) if (! missing(index)) edgeL <- edgeL[[index]] edgeL }) #################################### ##clusterGraph code here #################################### # setMethod("initialize", "clusterGraph", function(.Object, clusters) { # if( is.factor(clusters) ) # clusters = split(names(clusters), clusters) # .Object@clusters = clusters # .Object # }) setMethod("edges", c("clusterGraph", "missing"), function(object, which) { edges<-list() for(clust in object@clusters) { cc <- as.character(clust) for(i in seq(along=cc) ) edges[[cc[i]]] <- cc[-i] } edges}) setMethod("edges", c("clusterGraph", "character"), function(object, which) { nN <- nodes(object) wh <- match(which, nN) if( any(is.na(wh)) ) stop("'which' nodes not all in graph") edges<-list() for(clust in object@clusters) { cc <- intersect(as.character(clust), which) for(i in seq(along=cc) ) edges[[cc[i]]] <- cc[-i] } edges[which]}) setMethod("edgeL", "clusterGraph", function(graph, index) { clusters <- connComp(graph) nodes <- nodes(graph) edgeL <- list() cur <- 1 for (i in seq(along=clusters)) { curClust <- clusters[[i]] for (j in seq(along = curClust)) { edgeL[[cur]] <- list(edges=match(curClust[-j], nodes)) cur <- cur + 1 } } names(edgeL) <- nodes if (! missing(index)) edgeL <- edgeL[[index]] edgeL }) ##FIXME: this should be done from distances, but for now...) ##eg, if a distance matrix was supplied we could use that to define ##edge weights -- as that seems appropriate ## FIXME: update for new attr storage setMethod("edgeWeights", "clusterGraph", function(object, index, attr, default, type.checker) { edg <- edges(object) if( !missing(index) ) edg <- edg[index] ans <- lapply(edg, function(x) { ans <- rep(1, length(x)); names(ans) <- x; ans}) ans}) setMethod("subGraph", c("character", "clusterGraph"), function(snodes, graph) { cList <- graph@clusters cL <- lapply(cList, function(x) intersect(x, snodes)) graph@clusters <- cL graph}) setMethod("numNodes", "clusterGraph", function(object) sum(sapply(object@clusters, length))) setMethod("adj", c("clusterGraph", "ANY"), function(object, index) { nIndex <- length(index) if( any(is.na(match(index, nodes(object)))) ) stop("invalid node label") rval <- vector("list", length=nIndex) names(rval) <- index for(i in seq_len(nIndex)) { for(cl in object@clusters) if( index[i] %in% cl ) rval[[i]] <- cl } return(rval)}) ##for cluster graphs, acc and adj are the same setMethod("acc", c("clusterGraph", "character"), function(object, index) { nIndex <- length(index) if( any(is.na(match(index, nodes(object)))) ) stop("invalid node label") rval <- vector("list", length=nIndex) names(rval) <- index for(i in seq_len(nIndex)) { for(cl in object@clusters) if( index[i] %in% cl ) rval[[i]] <- cl } return(rval)}) setMethod("connComp", "clusterGraph", function(object) object@clusters) setMethod("show", "clusterGraph", function(object) { numNull<-numNoEdges(object) numNodes<- numNodes(object) numEdge<-numEdges(object) cat("A graph with ", edgemode(object), " edges\n") cat("Number of Nodes = ",numNodes,"\n",sep="") cat("Number of Edges = ",numEdge,"\n",sep="") }) setAs(from="clusterGraph", to="matrix", function(from, to) { theNodes <- nodes(from) # will be grouped by cluster! numNodes <- length(theNodes) m <- matrix(0, nrow=numNodes, ncol=numNodes, dimnames=list(theNodes, theNodes)) for (clust in from@clusters) { idx <- match(clust, theNodes) m[idx, idx] <- 1 } diag(m) <- 0 # eliminate self-loops m }) graph/R/edgefunctions.R0000644000175100017510000001202412607264574016070 0ustar00biocbuildbiocbuild################################################################ # function: # aveNumEdges takes one parameter: # objgraph is the graph object # aveNumEdges counts the number of edges in the graph and divides # that by the number of nodes in the graph to give the # average number of edges. A double representing the average # number of edges will be returned. # # created by: Elizabeth Whalen # last updated: July 22, 2002 ################################################################ aveNumEdges<-function(objgraph) numEdges(objgraph)/length(nodes(objgraph)) ################################################################ # function: # calcProb takes two parameters: # origgraph is the original graph from which the subgraph was made # subgraph is the subgraph made from the original graph # calcProb calculates the probability of having the number of edges # found in the subgraph given that it was made from origgraph. # The hypergeometric distribution is used to calculate the # probability (using the pdf). # # created by: Elizabeth Whalen # last updated: July 22, 2002 ################################################################ calcProb <- function(subgraph, origgraph) { origNumNodes<-length(nodes(origgraph)) subNumNodes<-length(nodes(subgraph)) origNumEdges<-numEdges(origgraph) subNumEdges<-numEdges(subgraph) dyads <- (origNumNodes * (origNumNodes - 1) / 2) - origNumEdges sampledyads <- subNumNodes * (subNumNodes - 1) / 2 prob<-dhyper(subNumEdges,origNumEdges,dyads,sampledyads) prob } ################################################################ # function: # calcSumProb takes two parameters: # g is the original graph from which the subgraph was made # sg is the subgraph made from the original graph # calcSumProb calculates the probability of having greater than or equal # to the number of edges found in the subgraph given that it was made # from origgraph. # The hypergeometric distribution is used to calculate the summed # probability (using the cdf). # # notes: This calculates the upper tail of the hypergeometric # distribution. # # created by: Elizabeth Whalen # last updated: July 22, 2002 ################################################################ calcSumProb <- function(sg, g) { origNumNodes<-length(nodes(g)) #g subNumNodes<-length(nodes(sg)) #gs origNumEdges<-numEdges(g) #L subNumEdges<-numEdges(sg) #Ls dyads <- (origNumNodes * (origNumNodes - 1) / 2) - origNumEdges sampledyads <- subNumNodes * (subNumNodes - 1) / 2 prob<-phyper(subNumEdges,origNumEdges,dyads,sampledyads,lower.tail=FALSE) prob } ################################################################ # function: # mostEdges takes one parameter: # objGraph is the graph object # mostEdges finds the node that has the most edges in the graph. # The index of the node, the node id (ex. affy id, locus # link id, ...), and the number of edges for that node is returned # in a list. # # created by: Elizabeth Whalen # last updated: August 2, 2002 ################################################################ mostEdges<-function(objGraph) { oEdges<-edges(objGraph) lens <- sapply(oEdges, length) mx <- max(lens) return(names(oEdges)[match(mx, lens)]) } ################################################################ # function: # numNoEdges takes one parameter: # objGraph is the graph object # numNoEdges calculates the number of nodes that have an edge list # of NULL (i.e. no edges) and returns an integer representing # the number of NULL edge lists in the graph. # # created by: Elizabeth Whalen # last updated: July 22, 2002 ################################################################ numNoEdges<-function(objGraph) { els <- sapply(edges(objGraph), length) sum(els==0) } ########################################################## ##RG/2003 ########################################################## ##listEdges: list all edges for every pair of nodes in the graph ##so if there N nodes then there are N choose 2 possible entries ##dropNULL=T/F says whether to drop those pairs with no edges listEdges <- function(object, dropNULL=TRUE) { if( !is(object, "graphNEL") ) stop("'listEdges' only works for graphNEL objects") Nd <- nodes(object) Nn <- length(Nd) EL <- object@edgeL eList <- NULL for(i in seq_len(Nn)) { Node <- Nd[i] ELi <- EL[[i]] for( j in seq(along=ELi$edges) ) { toN <- Nd[ELi$edges[j]] btwn <- paste(sort(c(Node, toN)), collapse=":") newN <-new("simpleEdge", bNode=Node, eNode=toN, weight=if( is.null(ELi$weights[j])) 1 else ELi$weights[j] , directed = edgemode(object)=="directed", edgeType=if(is.null(ELi$type[j])) "" else ELi$type[j]) if( is.null(eList[[btwn]]) ) eList[[btwn]] <- list(newN) else eList[[btwn]] <- list(eList[[btwn]], newN ) } } return(eList) } listLen <- function(list) .Call(graph_listLen, list) graph/R/graph-constructors.R0000644000175100017510000000102312607264574017077 0ustar00biocbuildbiocbuild# constructors for two subclasses of graph: graphNEL, graphAM # graphNEL <- function (nodes=character(), edgeL=list(), edgemode='undirected') { new("graphNEL", nodes=nodes, edgeL=edgeL, edgemode=edgemode) } graphAM <- function (adjMat=matrix(integer(), 0, 0), edgemode='undirected', values=NA) { if (length (values) == 1L && is.na (values)) new("graphAM", adjMat=adjMat, edgemode=edgemode) else new("graphAM", adjMat=adjMat, edgemode=edgemode, values=values) } graph/R/graphNEL.R0000644000175100017510000005105512607264574014702 0ustar00biocbuildbiocbuildvalidGraph<-function(object, quietly=FALSE) { ## FIXME: we are doing if/else branching here on ## specific subclasses of graph. We should make this a generic ## so we can organize checking. Also, graphAM is not ## currently being checked in any way. bad = FALSE if (is(object, "graphNEL")) { objEdges<-edges(object) objNodes<-nodes(object) if (any(is.na(objNodes))) { if (!quietly ) cat("NA element in nodes.\n") bad <- TRUE } if(length(objEdges)>0) if(any(is.na(unlist(objEdges,use.names=FALSE)))) { if(!quietly) cat("NA element in edges.\n") bad <- TRUE } ##don't think we want to force this one ## if (length(objNodes)!=length(objEdges)) { ## if( !quietly ) ## cat("Nodes and edges must have the same length.\n") ## bad <- TRUE ## } if (!all( names(objEdges) %in% objNodes )) { if( !quietly ) cat("Edges don't have the same names as the nodes.\n") bad <- TRUE } if (any(duplicated(objNodes))) { if( !quietly ) cat("Node names may not be duplicated\n") bad <- TRUE } ##check for reciprocity in undirected graphs ##paste to->from and from->to if any are not duplicated then ##the edge is not reciprocal. Note we are not going to handle ##multiedges well. if(edgemode(object) == "undirected" && length(objEdges)>0 ) { fr <- rep(names(objEdges), sapply(objEdges, length)) to <- unlist(objEdges) frto <- paste(fr, to, sep=EDGE_KEY_SEP) tofr <- paste(to, fr, sep=EDGE_KEY_SEP) badEdges <- setdiff(tofr, frto) if (length(badEdges) > 0) { if (!quietly) { cat("the graph is undirected and the following edges", "are not reciprocated:\n", pasteq(badEdges), "\n\n") } bad <- TRUE } } } else if( is(object, "distGraph") ) { if( is(object@Dist, "dist") ) return(TRUE) else return(FALSE) } return(!bad) } setMethod("initialize", "graphNEL", function(.Object, ...) { .Object <- callNextMethod() validObject(.Object) return(.Object) }) graphNEL_init_edges_nested <- function(nodes, edgeL) { if(length(nodes) != length(edgeL) ) stop("'nodes' and 'edgeL' must have same length") nameE <- names(edgeL) if( !is.null(nameE) && !all( nameE %in% nodes) ) stop("'edgeL' names must agree with 'nodes'") if( !is.null(nameE) ) edgeL <- edgeL[nodes] edgeL <- lapply(edgeL, function(x) { if (is.character(x$edges)) x$edges <- match(x$edges, nodes) if (is.null(x) || is.null(x$edges)) x <- list(edges=numeric(0)) x }) edgeL } graphNEL_init_edgeL_weights <- function(gnel) { defaultWeight <- 1 edgeDataDefaults(gnel, attr="weight") <- defaultWeight edgeL <- gnel@edgeL wts <- unlist(lapply(edgeL, function(x) { w <- x$weights if (is.null(w) || length(w) == 0) return(rep(defaultWeight, length(x$edges))) w })) if (!is.numeric(wts)) stop("weights in edgeL must be numeric") eSpec <- .getAllEdges(gnel) from <- eSpec$from to <- eSpec$to edgeData(gnel, from=from, to=to, attr="weight") <- wts ## remove weights, since now stored in the edgeData edgeL <- lapply(edgeL, function(x) x["edges"]) gnel@edgeL <- edgeL gnel } graphNEL_init_edges <- function(nodes, edges) { nameE <- names(edges) if (is.null(nameE) || !all(nameE %in% nodes)) stop("'edges' names must agree with 'nodes'") if (any(unlist(lapply(edges, is.list)))) stop("'edges' must be list of character()") ##merge all edges with same names if(any(duplicated(nameE))){ edges <- split(edges, nameE) edges <- lapply(edges, unlist) nameE <- names(edges) } ##melt list m <- sapply(edges, length) n <- m > 0 els <- edges[n] edgeF <- rep(names(els), m[n]) edgeT <- unlist(els) edgeL <- unname(cbind(edgeF, edgeT)) if(sum(n)>0){ eL <- match(edgeL[, 2], nodes) edgeL <- split(eL, edgeL[, 1]) edgeL <- c(edgeL, lapply(edges[!n], function(x) integer(0))) }else{ edgeL <- lapply(edges, function(x) integer(0)) } edgeL <- edgeL[nameE] edgeL <- lapply(edgeL, function(x) list(edges=x)) edgeL } setMethod("initialize", "graphNEL", function(.Object, nodes=character(0), edgeL, edgemode) ## FIXME: what about edge weights? { if (length(nodes)) checkValidNodeName(nodes) if( missing(edgemode) ) edgemode <- "undirected" doWeights <- FALSE if (missing(edgeL) || (!is.null(edgeL) && length(edgeL) == 0)) { edgeL <- vector(mode="list", length=length(nodes)) names(edgeL) <- nodes } else { ## which list structure was used? edgeParser <- graphNEL_init_edges firstVal <- edgeL[[1]] if (is.null(firstVal)) stop("'edgeL' must be list of character or list of lists, got NULL") if (length(edgeL) > 0 && is.list(edgeL[[1]])) { edgeParser <- graphNEL_init_edges_nested doWeights <- TRUE } edgeL <- edgeParser(nodes, edgeL) } .Object@nodes <- nodes .Object@edgeL <- edgeL .Object@graphData$edgemode <- edgemode validObject(.Object) if (doWeights) .Object <- graphNEL_init_edgeL_weights(.Object) return(.Object) }) ##the graphNEL representation stores edges as indexes into the ##node label vector setMethod("edges", c("graphNEL", "missing"), function(object, which) { gNodes <- object@nodes lapply(object@edgeL, function(x) gNodes[x$edges])}) setMethod("edges", c("graphNEL", "character"), function(object, which) { gNodes <- nodes(object) lapply(object@edgeL[which], function(x) gNodes[x$edges])}) setMethod("adj", c("graphNEL", "ANY"), function(object, index) { initI <- as.character(index) nd <- nodes(object) if( is.character(index) ) index <- match(index, nd) if( is.na(index) || index < 0 || index > length(nd) ) stop("vertex is not in graph: ", sQuote(initI)) edges(object)[index]}) setMethod("edgeL", "graphNEL", function(graph, index) { if( missing(index) ) graph@edgeL else graph@edgeL[index]}) setMethod("subGraph", signature(snodes="character", graph="graphNEL"), function(snodes, graph) { origNodes <- nodes(graph) snodesIdx <- match(snodes, origNodes) if (any(is.na(snodesIdx))) { bad <- snodes[which(is.na(snodesIdx))] stop("'snodes' contains nodes not in graph: ", pasteq(bad)) } killedNodes <- origNodes[-snodesIdx] newEdges <- lapply(edges(graph)[snodes], function(x) { whD <- match(killedNodes, x, nomatch=0) if (any(whD)) x[-whD] else x }) ans <- graphNEL(nodes=snodes, edgeL=newEdges, edgemode=edgemode(graph)) ## FIXME: need to clean the attributes, right now we are passing ## too much. nodeIdx <- match(snodes, names(graph@nodeData), 0) ans@nodeData@defaults <- graph@nodeData@defaults ans@nodeData@data <- graph@nodeData@data[nodeIdx] ee <- .getAllEdges(ans) if (length(ee$from) && length(ee$to)) { kk <- .makeEdgeKeys(ee$from, ee$to) whkk <- match(kk, names(graph@edgeData), 0) ans@edgeData@defaults <- graph@edgeData@defaults ans@edgeData@data <- graph@edgeData@data[whkk] } ans }) setMethod("numNodes", "graphNEL", function(object) length(object@nodes)) setMethod("addNode", signature(node="character", object="graphNEL", edges="missing"), function(node, object, edges) { gN = nodes(object) already <- match(node, gN) if( any(!is.na(already)) ) stop("node(s) already in graph: ", pasteq(gN[already])) checkValidNodeName(node) ## add them on the end so we don't renumber gN = c(gN, node) edgeL <- object@edgeL nEd <- vector("list", length=length(node)) names(nEd) <- node for(i in seq(along=nEd)) nEd[[i]] <- list(edges=numeric(0)) edgeL <- c(edgeL, nEd) object@nodes <- gN object@edgeL <- edgeL object }) ##they need to supply a list of edges, one for each element of node ##it might be better to do this by first adding the nodes then ##calling addEdges on that graph setMethod("addNode", signature(node="character", object="graphNEL", edges="list"), function(node, object, edges) { ## first add the nodes, it does the checking too object <- addNode(node, object) ## now add the edges: if (!all(names(edges) == node)) stop("'edges' must be named and in the same order as nodes") doWeights <- FALSE newEdges <- lapply(edges, function(x) { if (is.character(x)) x else if (is.numeric(x)) { doWeights <<- TRUE ## set flag in function scope if (length(x) == 0) enms <- character(0) else enms <- names(x) if (is.null(enms)) stop("'edges' must be character or have names ", "corresponding to nodes") enms } else { stop("'edges' must be character or numeric list elements") } }) for (i in seq(along=newEdges)) { if (length(newEdges[[i]]) == 0) next if (doWeights) object <- addEdge(from=node[i], to=newEdges[[i]], object, weights=edges[[i]]) else object <- addEdge(from=node[i], to=newEdges[[i]], object) } object }) setMethod("removeNode", c("character", "graphNEL"), function(node, object) { ##first clear the node -- does the checking too object <- clearNode(node, object) nN <- nodes(object) wh <- match(node, nN) gN <- nN[-wh] nE <- object@edgeL[-wh] ## Now renumber the nodes as stored in the edgelist nE2 <- lapply(nE, function(el) { oldN <- nN[el$edges] el$edges <- match(oldN, gN) el }) object@nodes <- gN object@edgeL <- nE2 object }) setMethod("clearNode", c("character", "graphNEL"), function(node, object) { gN <- nodes(object) whN <- match(node, gN) if(any(is.na(whN)) ) stop("'node' not in graph: ", pasteq(gN[is.na(whN)])) ## clear node attributes object <- clearNodeData(object, node) object <- .dropEdges(object, whN) object@edgeL[whN] <- list(list(edges=numeric(0))) object }) edgeKiller <- function(edgeL, from, whichKill) { for (i in seq(along=from)) { toKill <- whichKill[[i]] toKill <- toKill[!is.na(toKill)] if (length(toKill) == 0) stop("no edge 'from' ", sQuote(from[i]), " to remove") edgeL[[from[i]]]$edges <- edgeL[[from[i]]]$edges[-toKill] } edgeL } setMethod("removeEdge", signature(from="character", to="character", graph="graphNEL"), function(from, to, graph) { gN <- nodes(graph) wh <- match(c(from, to), gN) if( any(is.na(wh)) ) stop("'from' or 'to' not in graph: ", pasteq(unique(wh[is.na[wh]]))) if (length(to) == 1) to <- rep(to, length(from)) if (length(from) == 1) from <- rep(from, length(to)) if (!isDirected(graph)) { fromOrig <- from from <- c(fromOrig, to) to <- c(to, fromOrig) remove(fromOrig) } graph <- clearEdgeData(graph, from, to) remEL <- split(to, from) fromU <- names(remEL) nE <- edges(graph, fromU) whD <- mapply(function(x, y) match(x, y), remEL, nE, SIMPLIFY=FALSE) graph@edgeL <- edgeKiller(graph@edgeL, fromU, whD) graph }) setMethod("addEdge", signature=signature(from="character", to="character", graph="graphNEL", weights="numeric"), function(from, to, graph, weights) { graph <- addEdge(from, to, graph) if (!("weight" %in% names(edgeDataDefaults(graph)))) edgeDataDefaults(graph, attr="weight") <- 1L edgeData(graph, from=from, to=to, attr="weight") <- weights graph }) setMethod("addEdge", signature=signature(from="character", to="character", graph="graphNEL", weights="missing"), function(from, to, graph) { preEdges <- isAdjacent(graph, from, to) if (any(preEdges)) { preFr <- from[preEdges] preTo <- to[preEdges] preEdges <- paste(preFr, preTo, sep=EDGE_KEY_SEP) warning("edges replaced: ", pasteq(preEdges)) } gN <- nodes(graph) whF <- match(from, gN) if( any(is.na(whF)) ) stop("not a node: ", pasteq(from[is.na(whF)])) whT <- match(to, gN) if( any(is.na(whT)) ) stop("not a node: ", pasteq(to[is.na(whT)])) ##roll out the shorter one lenT <- length(to) lenF <- length(from) if( lenT > lenF ) { from <- rep(from, lenT) whF <- rep(whF, lenT) } if( lenF > lenT ) { whT <- rep(whT, lenF) to <- rep(to, lenF) } ##now the same lenN <- max(lenT, lenF) eL <- graph@edgeL for(i in seq_len(lenN)) { old <- eL[[from[i]]] ## remove duplicate edges old$edges <- unique(c(old$edges, whT[i])) eL[[from[i]]] <- old } ##if undirected, then we need to go in both directions if( edgemode(graph) == "undirected") for(i in seq_len(lenN)) { old <- eL[[to[i]]] ## remove duplicate edges old$edges <- unique(c(old$edges, whF[i])) eL[[to[i]]] <- old } graph@edgeL <- eL ##FIXME: should we call validObject here? graph }) ## Collapse a set of nodes and the corresponding edges setMethod("combineNodes", c("character", "graphNEL", "character"), function(nodes, graph, newName, collapseFunction=sum) { if( length(newName) > 1 ) stop("'newName' must have length 1") gN <- nodes(graph) whN <- match(nodes, gN) if( any(is.na(whN)) ) stop("not a node: ", pasteq(from[is.na(whN)])) eL <- graph@edgeL outE <- eL[nodes] if( length(nodes) == 1 ) { warning("nothing to collapse") return(graph) } ##function to collapse weights for combined edges collapseFunction <- match.fun(collapseFunction) ##if undirected then we know everything inE <- if( edgemode(graph) == "directed" ) inEdges(nodes, graph) else NULL g2 <- removeNode(nodes, graph) g2 <- addNode(newName, g2) oE <- gN[unlist(lapply(outE[nodes], "[[", "edges"), use.names=FALSE)] oW <- unlist(edgeWeights(graph, nodes), use.names=FALSE) if (is.null(oW)) oW <- rep(1, length(oE)) toW <- tapply(oW, oE, collapseFunction)[setdiff(unique(oE), nodes)] ##there might be no edges to add if(length(toW)) g2 <- addEdge(newName, names(toW), g2, as.numeric(toW)) ##if directed we need to fix up the incoming edges if( !is.null(inE) ) { inE <- lapply(inE, setdiff, nodes) inEl <- unique(unlist(inE), use.names=FALSE) oW <- as.numeric(sapply(edgeWeights(graph, inEl), function(x) collapseFunction(x[intersect(names(x), nodes)]))) if(length(inEl)) g2 <- addEdge(inEl, newName, g2, oW) } g2 }) ##inEdges returns a list of all nodes with edges ##to the nodes in "node" setMethod("inEdges", c("missing", "graphNEL"), function(node, object) inEdges(nodes(object), object)) ##seems more sensible - if there is only one arg setMethod("inEdges", c("graphNEL", "missing"), function(node, object) inEdges(nodes(node), node)) setMethod("inEdges", c("character", "graphNEL"), function(node, object) { gN <- nodes(object) whN <- match(node, gN) if( any(is.na(whN)) ) stop("not a node: ", pasteq(node[is.na(whN)])) nN <- length(node) rval <- vector("list", length=nN) names(rval) <- node eL <- object@edgeL for (i in seq_len(nN)) { whOnes <- sapply(eL, function(x) { if (whN[i] %in% x$edges) return(TRUE) FALSE }) rval[[i]] <- gN[whOnes] } rval }) .dropEdges <- function(self, x) { ## Remove all edges in graphNEL self to node with ## index x. Also remove all edges from node with index x. ## Return the modified graphNEL. ## Removing edges also removes the associated attributes. oldEdgeL <- self@edgeL newEdgeL <- vector(mode="list", length=length(oldEdgeL)) names(newEdgeL) <- names(oldEdgeL) nds <- nodes(self) for (i in seq(along=nds)) { toList <- oldEdgeL[[i]]$edges if (i %in% x) { to <- nds[toList] if (length(to)) self <- clearEdgeData(self, from=nds[i], to=to) toList <- list(edges=numeric(0)) } else { bad <- match(x, toList) bad <- bad[!is.na(bad)] if (length(bad)) { self <- clearEdgeData(self, from=nds[i], to=nds[toList[bad]]) toList <- list(edges=toList[-bad]) } else { toList <- list(edges=toList) } } newEdgeL[[nds[i]]] <- (toList) } self@edgeL <- newEdgeL self } ##a leaf is an element of the graph with in edges and no out ## edges - the edgeL list in a directed graphNEL list the out ##edges inOutCounts <- function(object) { if(!(edgemode(object)) == "directed") stop("only for directed graphs") numOut=sapply(object@edgeL, function(x) length(x$edges)) inEdges = nodes(object)[unlist(sapply(object@edgeL, function(x) x$edges))] numIn = table(inEdges) return(list(numOut = numOut, numIn = numIn)) } ##FIXME: this is a replacement for the inEdges function - ##it needs to be tested and made to handle a list of ##nodes to find in edges - but that can easily be done ##simply by computing all and then subsetting inE <- function(object) { if(!(edgemode(object)) == "directed") stop("only for directed graphs") inEdges = nodes(object)[unlist(sapply(object@edgeL, function(x) x$edges))] numE = sapply(object@edgeL, function(x) length(x$edges)) froms = rep(names(object@edgeL), numE) split(froms, inEdges) } graph/R/graphfunctions.R0000644000175100017510000002156212607264574016274 0ustar00biocbuildbiocbuild################################################################ # function: # boundary takes two parameters: # graph is the original graph from which the subgraph will be created # subgraph either the subgraph or the nodes of the subgraph # boundary returns a list of length equal to the number of nodes in the # subgraph. Each element is a list of the nodes in graph # # created by: Elizabeth Whalen # last updated: Feb 15, 2003, RG ################################################################ boundary<-function(subgraph, graph) { if ( !is(graph, "graph") ) stop("'graph' must be an object of type graph") if( is(subgraph, "graph") ) snodes <- nodes(subgraph) else if( is.character(subgraph) ) snodes <- subgraph else stop("'subgraph' type incorrect") if( any( !(snodes %in% nodes(graph)) ) ) stop("some nodes not in graph") subE <- inEdges(graph)[snodes] lapply(subE, function(x) x[!(x %in% snodes)] ) } ##check to see if any edges are duplicated, as we often don't have ##good ways to deal with that duplicatedEdges <- function(graph) { if( !is(graph, "graphNEL") ) stop("only graphNEL supported") for(e in graph@edgeL) if( any(duplicated(e$edges)) ) return(TRUE) return(FALSE) } ugraphOld <- function() { .Defunct("ugraph") } setMethod("ugraph", "graph", function(graph) { if (!isDirected(graph)) return(graph) eMat <- edgeMatrix(graph) ## add recip edges eMat <- cbind(eMat, eMat[c(2, 1), ]) ## put into graphNEL edgeL format eL <- lapply(split(as.vector(eMat[2, ]), as.vector(eMat[1, ])), function(x) list(edges=unique(x))) theNodes <- nodes(graph) ## some nodes may be missing names(eL) <- theNodes[as.integer(names(eL))] ## add empty edge list for nodes with no edges noEdgeNodes <- theNodes[!(theNodes %in% names(eL))] noEdges <- lapply(noEdgeNodes, function(x) list(edges=numeric(0))) names(noEdges) <- noEdgeNodes ## FIXME: should we skip standard initialize for speed? ## need to copy over at least the nodeData... graphNEL(nodes=theNodes, edgeL=c(eL, noEdges), edgemode="undirected") }) setMethod("edgeMatrix", c("graphNEL", "ANY"), function(object, duplicates=FALSE) { ## Return a 2 row numeric matrix (from, to, weight) ed <- object@edgeL ##reorder to the same order as nodes ed <- ed[nodes(object)] nN <- length(ed) eds<-lapply(ed, function(x) x$edges) elem <- listLen(eds) from <- rep(seq_len(nN), elem) to <- unlist(eds, use.names=FALSE) ans <- rbind(from, to) ##we duplicate edges in undirected graphNEL ##so here we remove them if( edgemode(object) == "undirected" && !duplicates) { swap <- from>to ans[1,swap]<-to[swap] ans[2,swap]<-from[swap] t1 <- paste(ans[1,], ans[2,], sep="+") ans <- ans[ ,!duplicated(t1), drop=FALSE] } ans }) setMethod("edgeMatrix", c("clusterGraph", "ANY"), function(object, duplicates) { cls<-object@clusters nd <- nodes(object) ans <- numeric(0) for(cl in cls) { idx <- match(cl, nd) nn <- length(idx) v1 <- rep(idx[-nn], (nn-1):1) v2 <- numeric(0) for( i in 2:nn) v2 <- c(v2, i:nn) v2 <- idx[v2] ta <- rbind(v1, v2) if( is.matrix(ans) ) ans <- cbind(ans, rbind(v1, v2)) else ans <- rbind(v1, v2) } dimnames(ans) <- list(c("from", "to"), NULL) ans }) setMethod("edgeMatrix", c("distGraph", "ANY"), function(object, duplicates) { ## Return a 2 row numeric matrix (from, to, weight) ed <- edges(object) ##reorder to the same order as nodes NODES <- nodes(object) ed <- ed[NODES] nN <- length(ed) elem <- listLen(ed) from <- rep(seq_len(nN), elem) to <- match(unlist(ed), NODES) ans <- rbind(from, to) ##we duplicate edges in undirected graphNEL ##so here we remove them ##FIXME: see graphNEL for a speedup of this part if( edgemode(object) == "undirected" && !duplicates) { t1 <- apply(ans, 2, function(x) {paste(sort(x), collapse="+")}) ans <- ans[ ,!duplicated(t1), drop=FALSE] } ans }) setMethod("edgeMatrix", "graphAM", function(object, duplicates=FALSE) { to <- apply(object@adjMat, 1, function(x) which(x != 0)) from <- rep(seq_len(numNodes(object)), listLen(to)) to <- unlist(to, use.names=FALSE) ans <- rbind(from=from, to=to) ## we duplicate edges in undirected graphs ## so here we remove them if (!isDirected(object) && !duplicates) { swap <- from > to ans[1, swap] <- to[swap] ans[2, swap] <- from[swap] t1 <- paste(ans[1, ], ans[2, ], sep="+") ans <- ans[ , !duplicated(t1), drop=FALSE] } ans }) ##it seems to me that we might want the edge weights for ##a given edgeMatrix and that that would be much better done ##in the edgeMatrix function ##we are presuming that eM has integer offsets in it ##eWV <- function(g, eM, sep=ifelse(edgemode(g)=="directed", "->", ## "--")) ##{ ## unE <- unique(eM[1,]) ## edL <- g@edgeL ## eE <- lapply(edL, function(x) x$edges) ## eW <- lapply(edL, function(x) { ## ans = x$weights ## ed = length(x$edges) ## if( is.null(ans) && ed > 0 ) ## ans = rep(1, ed) ## ans}) ## ## nr <- listLen(eE) ## ##now we can subset - ## eMn <- paste(rep((1:length(nr))[unE],nr[unE]), unlist(eE[unE]), sep=sep) ## eWv <- unlist(eW[unE]) ## dE <- paste(eM[1,], eM[2,], sep=sep) ## wh<-match(dE, eMn) ## if(any(is.na(wh)) ) ## stop("edges in supplied edgematrix not found") ## ans <-eWv[wh] ## names(ans) <- eMn[wh] ## ans ##} #eWV <- function(g, eM, sep=ifelse(edgemode(g)=="directed", "->", # "--")) #{ # edL <- g@edgeL # ##fix up the edgeweights so we really find them # eW <- lapply(edL, function(x) { # ans = x$weights # ed = length(x$edges) # if( is.null(ans) && ed > 0 ) # ans = rep(1, ed) # if( length(ans) > 0 ) # names(ans) = x$edges # ans}) # # a1 <- apply(eM, 2, # function(x) eW[[x[1]]][as.character(x[2])]) # names(a1) <- paste(eM[1,], eM[2,], sep=sep) # return(a1) #} eWV <- function (g, eM, sep = ifelse(edgemode(g) == "directed", "->", "--"), useNNames = FALSE) { # returns vector of weights. default has names equal to node # indices, but useNNames can be set to put node names as names # of corresponding weights # n <- nodes(g) from <- n[eM["from", ]] to <- n[eM["to", ]] eW <- tryCatch(edgeData(g, from=from, to=to, attr="weight"), error=function(e) { edgeDataDefaults(g, "weight") <- 1L edgeData(g, from=from, to=to, attr="weight") }) eW <- unlist(eW) if (!useNNames) nms <- paste(eM["from", ], eM["to", ], sep=sep) else nms <- paste(from, to, sep=sep) names(eW) <- nms eW } pathWeights <- function (g, p, eM = NULL) { # # a path is a vector of names of adjacent nodes # we form the vector of steps through the path # (pairs of adjacent nodes) and attach the weights # for each step. no checking is done to verify # that the path p exists in g # if (length(p) < 2) stop("'p' has length < 2") if (is.null(eM)) eM <- edgeMatrix(g) wv <- eWV(g, eM, useNNames = TRUE) sep <- ifelse(edgemode(g) == "undirected", "--", "->") pcomps <- cbind(p[-length(p)], p[-1]) if (edgemode(g) == "undirected") pcomps <- rbind(pcomps, pcomps[,c(2,1)]) # don't know node order in wv labels inds <- apply(pcomps, 1, function(x) paste(x[1], x[2], sep = sep)) tmp <- wv[inds] tmp[!is.na(tmp)] } graph/R/gxlReader.R0000644000175100017510000002353112607264574015155 0ustar00biocbuildbiocbuildgraphNELhandler <- function () { ## ## this function is to work with omegahat's XML xmlEventParse ## current version: given a GXL graph, capture the node names and ## edge data to return the graph as graph::graphNEL ## graphID <- NULL curNode <- NULL curEdge <- NULL curAttr <- NULL inNode <- FALSE inEdge <- FALSE inAttr <- FALSE inInt <- FALSE inFloat <- FALSE inBool <- FALSE g <- graphNEL() nodeL <- list() edgeL <- list() edgemode <- NULL ## ## handler elements: start elements are cased for ## graph, node, attr, or edge ## text is limited in the simple example to the attr tag, ## which lives under a node or an edge ## startElement <- function(x, atts, ...) { if (x == "graph") { graphID <<- atts["id"] eMode <- atts["edgemode"] if (!is.na(eMode)) { if (eMode %in% c("undirected", "defaultundirected")) edgemode(g) <<- "undirected" else edgemode(g) <<- "directed" ## not sure we'll need this } else { ## default is directed for GXL edgemode(g) <<- "directed" } edgemode <<- atts["edgemode"] } else if (x == "node") { inNode <<- TRUE theNode <- as.character(atts["id"]) if (! (theNode %in% nodes(g))) g <<- addNode(theNode, g) nodeL[[theNode]] <<- list() curNode <<- theNode } else if (x == "attr") { inAttr <<- TRUE curAttr <<- atts["name"] } else if (x == "edge") { inNode <<- FALSE inEdge <<- TRUE from <- as.character(atts["from"]) to <- as.character(atts["to"]) if (!(from %in% nodes(g))) g <<- addNode(from, g) if (!(to %in% nodes(g))) g <<- addNode(to, g) g <<- addEdge(from=from, to=to, g) edgeL[[atts["id"]]] <<- list() edgeL[[atts["id"]]][["span"]] <<- c(from, to) curEdge <<- list(from=from, to=to) } else if (x == "int") { inInt <<- TRUE } else if (x == "float") { inFloat <<- TRUE } else if (x == "bool") { inBool <<- TRUE } } text <- function(x, atts, ...) { if (inAttr && nchar(x) > 0) { if (inInt) x <- as.integer(x) if (inFloat) x <- as.double(x) if (inBool) { if (identical(x, "true")) x <- TRUE else if (identical(x, "false")) x <- FALSE else stop("bad bool value: ", x) } if (inNode) { if (!(curAttr %in% nodeDataDefaults(g))) nodeDataDefaults(g, curAttr) <<- NA nodeData(g, curNode, curAttr) <<- x } else if (inEdge) { if (!(curAttr %in% edgeDataDefaults(g))) edgeDataDefaults(g, curAttr) <<- NA edgeData(g, from=curEdge$from, to=curEdge$to, curAttr) <<- x } } } endElement <- function(x, ...) { if (x == "attr") inAttr <<- FALSE else if (x == "node") inNode <<- FALSE else if (x == "edge") inEdge <<- FALSE else if (x == "int") inInt <<- FALSE else if (x == "float") inFloat <<- FALSE else if (x == "bool") inBool <<- FALSE } dump <- function() { list(graphID = graphID, nodeL = nodeL, edgeL = edgeL, edgemode = edgemode) } asGraphNEL <- function() { if (!validGraph(g)) { msg <- "GXL did not define a valid graph package graphNEL object. Most likely there is a failure of reciprocity for edges in an undirected graph. If there is a node for edge from A to B in an undirected graphNEL, there must also be an edge from B to A." stop(paste0(c("", strwrap(msg)), collapse="\n")) } return(g) } list(startElement = startElement, endElement = endElement, text = text, dump = dump, asGraphNEL = asGraphNEL) } graph_handler <- function () { ## ## this function is to work with omegahat's XML xmlEventParse ## current version: given a GXL graph, capture the node names and ## edge data to return the graph as graph::graphNEL ## all_nodes_e <- new.env(parent=emptyenv(), hash=TRUE) node_data_e <- new.env(parent=emptyenv(), hash=TRUE) node_defaults_e <- new.env(parent=emptyenv(), hash=TRUE) edge_data_e <- new.env(parent=emptyenv(), hash=TRUE) edge_defaults_e <- new.env(parent=emptyenv(), hash=TRUE) from_e <- new.env(parent=emptyenv(), hash=TRUE) to_e <- new.env(parent=emptyenv(), hash=TRUE) nodeCount <- 0L edgeCount <- 0L graphID <- NULL curNode <- NULL curAttr <- NULL inNode <- FALSE inEdge <- FALSE inAttr <- FALSE inInt <- FALSE inFloat <- FALSE inBool <- FALSE edgemode <- NULL add_node <- function(theNode) { if (!exists(theNode, all_nodes_e)) { nodeCount <<- nodeCount + 1L all_nodes_e[[theNode]] <- nodeCount } } add_edge <- function(from, to) { edgeCount <<- edgeCount + 1L ## FIXME: check for dup edge? k <- as.character(edgeCount) from_e[[k]] <- from to_e[[k]] <- to } ## ## handler elements: start elements are cased for ## graph, node, attr, or edge ## text is limited in the simple example to the attr tag, ## which lives under a node or an edge ## startElement <- function(x, atts, ...) { if (x == "graph") { if (!is.null(graphID)) stop("multiple graphs not supported") graphID <<- atts["id"] eMode <- atts["edgemode"] if (!is.na(eMode)) { if (eMode %in% c("undirected", "defaultundirected")) edgemode <<- "undirected" else edgemode <<- "directed" ## not sure we'll need this } else { ## default is directed for GXL edgemode <<- "directed" } } else if (x == "node") { inNode <<- TRUE theNode <- as.character(atts["id"]) add_node(theNode) curNode <<- theNode } else if (x == "attr") { inAttr <<- TRUE curAttr <<- atts["name"] } else if (x == "edge") { inNode <<- FALSE inEdge <<- TRUE from <- as.character(atts["from"]) to <- as.character(atts["to"]) add_node(from) add_node(to) add_edge(from, to) } else if (x == "int") { inInt <<- TRUE } else if (x == "float") { inFloat <<- TRUE } else if (x == "bool") { inBool <<- TRUE } } text <- function(x, atts, ...) { if (inAttr && nchar(x) > 0) { if (inInt) x <- as.integer(x) if (inFloat) x <- as.double(x) if (inBool) { if (identical(x, "true")) x <- TRUE else if (identical(x, "false")) x <- FALSE else stop("bad bool value: ", x) } if (inNode) { node_defaults_e[[curAttr]] <- as.character(NA) nattrs <- node_data_e[[curNode]] if (!length(nattrs)) nattrs <- list() nattrs[[curAttr]] <- x node_data_e[[curNode]] <- nattrs } else if (inEdge) { edge_defaults_e[[curAttr]] <- as.character(NA) k <- as.character(edgeCount) eattrs <- edge_data_e[[k]] if (!length(eattrs)) eattrs <- list() eattrs[[curAttr]] <- x edge_data_e[[k]] <- eattrs } } } endElement <- function(x, ...) { if (x == "attr") inAttr <<- FALSE else if (x == "node") inNode <<- FALSE else if (x == "edge") inEdge <<- FALSE else if (x == "int") inInt <<- FALSE else if (x == "float") inFloat <<- FALSE else if (x == "bool") inBool <<- FALSE } asGraphNEL <- function() { ftmat <- cbind(from=unlist(as.list(from_e)), to=unlist(as.list(to_e))) ## could call ftM2graphNEL here, but building up the object this ## way may be better... as we add the edges last. Note that ## ftM2graphNEL is much pickier about duplicated edges for ## undirected graphs, so we would need to filter those for the ## undirected case. nn <- unlist(as.list(all_nodes_e)) # retain original node order nn <- names(nn)[order(nn)] g <- graphNEL(nodes=nn, edgemode=edgemode) if (length(node_defaults_e)) { nd <- new("attrData", as.list(node_defaults_e)) nd@data <- as.list(node_data_e) g@nodeData <- nd } if (length(edge_data_e)) { ed <- new("attrData", as.list(edge_defaults_e)) edvals <- as.list(edge_data_e) names(edvals) <- .makeEdgeKeys(ftmat[, 1], ftmat[, 2]) ed@data <- edvals g@edgeData <- ed } g <- addEdge(ftmat[, 1], ftmat[, 2], g) validObject(g) g } list(startElement = startElement, endElement = endElement, text = text, asGraphNEL = asGraphNEL) } graph/R/mat2graph.R0000644000175100017510000001022312607264574015117 0ustar00biocbuildbiocbuildaM2bpG<-function(aM){ if(is.null(rownames(aM))) stop("'aM' must have row names") if(is.null(colnames(aM))) stop("'aM' must have column names") V <- c(rownames(aM),colnames(aM)) tmat<-which(aM>0,arr.ind=TRUE) tmat[,2] <- tmat[,2] + dim(aM)[1] numN<-length(V) numE<-dim(tmat)[1] rval <- vector("list", length = numN) for (i in seq_len(numE)) { rval[[tmat[i, 1]]]$edges <- c(rval[[tmat[i, 1]]]$edges, tmat[i, 2]) ln <- length(rval[[tmat[i, 1]]]$edges) rval[[tmat[i, 1]]]$weights <- c(rval[[tmat[i, 1]]]$weights, aM[tmat[i,1],(tmat[i,2]-dim(aM)[1])]) names(rval[[tmat[i, 1]]]$weights)[ln] <- tmat[i, 2] } names(rval) <- V graphNEL(nodes = V, edgeL = rval, edgemode="directed") } ## WH 23 June 2004, Ladir CH ftM2adjM <- function(ft, W=NULL, V=NULL, edgemode="directed") .ftM2other(ft, W, V, edgemode, "adjM") ftM2graphNEL <- function(ft, W=NULL, V=NULL, edgemode="directed") .ftM2other(ft, W, V, edgemode, "graphNEL") .ftM2other <- function(ft, W, V, edgemode, targetclass) { ## ft: nx2 matrix. if(!(is.matrix(ft) && ncol(ft)==2)) stop("'ft' must be an nx2 matrix") numE <- nrow(ft) ## deal with W if(is.null(W)) W <- rep(1,numE) if(!length(W)==numE) stop("length of 'W' must equal number of edges in 'ft'") ## deal with edgemode if(!edgemode %in% c("undirected", "directed")) stop("'edgemode' must be 'directed' or 'undirected'") if(edgemode == "undirected") { ## reflect each pair -- but *not* the self-edges! differ <- ft[,1] != ft[,2] ft <- rbind(ft, ft[differ, 2:1]) W <- c( W, W[differ]) } ## deal with V cft <- as.character(ft) if(is.null(V)) V <- unique(cft) ift <- array(match(cft, V), dim=dim(ft)) if(any(is.na(ift))) stop("node names in 'ft' must be in 'V'") numN <- length(V) ind <- ift[,1]+(ift[,2]-1)*numN if(any(duplicated(ind))) stop("duplicate edges not allowed") switch(targetclass, adjM = { mat <- matrix(0, ncol=numN, nrow=numN, dimnames=list(V,V)) mat[ind] <- W mat }, graphNEL = { ## ift[,2] are the indices of the to-nodes in V ## ft[,1] are the names of the from-nodes ## toN is a named list, whose names are the levels of ft[,1] and whose elements are the indices of to-nodes in V ## names(toN) is a subset of V, but not identical: the nodes with no outgoing edges are not in names(toN) ## Beware of partial matching! (This lead to a bug in earlier versions of this function, where edges were ## invented if there were nodes with no outgoing edges whose name partially matched the name of other ## nodes with outgoing edges. toN <- split(ift[,2], ft[,1]) eW <- split(W, ft[,1]) edgeL <- lapply(V, function(x) list(edges=NULL, weights=NULL)) names(edgeL) <- V mt = match(names(toN), V) for(k in seq(along=mt)) edgeL[[mt[k]]] <- list(edges=toN[[k]], weights=eW[[k]]) graphNEL(nodes=V, edgeL=edgeL, edgemode=edgemode) }, stop("'targetclass' unknown: ", sQuote(targetclass)) ) ## end switch } setAs("matrix", "graphAM", function(from) { if(!identical(ncol(from), nrow(from))) stop("'ncol(from)' and 'nrow(from)' must be identical") if(is.null(rownames(from))) { rownames(from) = if(is.null(colnames(from))) { paste(seq_len(nrow(from))) } else { colnames(from) } } if(is.null(colnames(from))) { colnames(from) = if(is.null(rownames(from))) { paste(seq_len(ncol(from))) } else { rownames(from) } } if(!identical(rownames(from),colnames(from))) stop("'rownames(from)' and 'colnames(from)' must be identical") if(!is.numeric(from)) storage.mode(from) = "integer" emode <- if (all(from == t(from))) "undirected" else "directed" defaultWeight <- vector(mode = typeof(from), length = 1L) defaultWeight[1L] <- 1L graphAM (from, edgemode=emode, values=list(weight=defaultWeight)) }) setAs("matrix", "graphNEL", function(from) as(as(from, "graphAM"), "graphNEL")) setAs("graphNEL", "matrix", function(from) { as(as(from, "graphAM"), "matrix") }) graph/R/methods-graph.R0000644000175100017510000011122712607264574016002 0ustar00biocbuildbiocbuild## String used as the separator to name edges in a graph. EDGE_KEY_SEP <- "|" EDGEMODE_DEPR_MSG <- "The edgemode slot is deprecated.\nUse 'updateGraph' to update this graph object." EDGEMODE_DEFUNCT_MSG <- "The edgemode slot no longer exists.\nUse 'updateGraph' to update this graph object." checkValidNodeName <- function(node) { if (!is.character(node)) stop("node names must be character, got: ", sQuote(class(node))) ## Node names must have nchar(n) > 0, not be NA, ## and not contain the EDGE_KEY_SEP character. if (any(nchar(node) == 0)) stop("invalid node names: empty string not allowed") if (any(is.na(node))) stop("invalid node names: missing value NA not allowed") bad <- grep(EDGE_KEY_SEP, node, fixed=TRUE) if (length(bad)) stop("node name(s) contain edge separator ", sQuote(EDGE_KEY_SEP), ": ", pasteq(node[bad])) TRUE } setMethod("isDirected", "graph", function(object){ edgemode(object) == "directed" }) ## Look through all serialized object within a folder, check if they are of ## class graph and update if necessary. This is not recursive, so lists of ## graphs or graphs within slots of objects will not be updated. updateFolder <- function(path="."){ files <- dir(path, pattern="\\.rda$") library(graph) for(f in files){ env <- new.env() load(f, envir=env) objects <- ls(env) needSave <- FALSE for(i in objects){ if(is(get(i, env), "graph") && !isUpToDate(get(i, env))){ assign(i, updateGraph(get(i, env)), envir=env) cat("Updated graph object", i, "\n") needSave <- TRUE } } if(needSave) save(list=objects, file=file.path(path,f), envir=env) } } ## Get the "real" slots of an object (slotNames gets the slots from ## the object definition) getObjectSlots <- function(object) { if(!is.object(object) || isVirtualClass(class(object))) return(NULL) value <- attributes(object) value$class <- NULL if(is(object, "vector")) { .Data <- as.vector(object) attr(.Data, "class") <- NULL attrNames <- c('comment', 'dim', 'dimnames', 'names', 'row.names', 'tsp') for (nm in names(value)[names(value) %in% attrNames]) attr(.Data, nm) <- value[[nm]] value <- value[!names(value) %in% attrNames] value$.Data <- .Data } value } ## (FH 11/7/07) If the graph object is not up to data give a ## deprecated warning and try to find something useful, ## else use the edgemode item of the graphData list setMethod("edgemode", "graph", function(object) { if(!isUpToDate(object)){ ## first check in graphData then in edgemode slot if(!"graphData" %in% names(getObjectSlots(object))){ .Defunct(msg=EDGEMODE_DEFUNCT_MSG) }else{ em <- object@graphData$edgemode if (is.null(em) && hasEdgemode(object)) em <- object@edgemode if(is.null(em)) stop("'graph' object is corrupted") } }else em <- object@graphData$edgemode return(em) }) ## (FH 11/7/07) Changed this to update the object in case it is outdated ## (edgemode now lives as a list item in graphData) setReplaceMethod("edgemode", c("graph", "character"), function(object, value) { if(length(value) != 1L) stop("'edgemode' must be length 1") if(!(value %in% c("directed", "undirected")) ) stop("'edgemode' must be 'directed' or 'undirected', was ", sQuote(value)) if(hasEdgemode(object)){ warning("'edgemode' slot is deprecated; ", "this graph object has been updated to ", "a new version", call.=FALSE) object <- updateGraph(object) } object@graphData$edgemode <- value edgeRenderInfo(object) <- list(arrowhead=NULL, arrowtail=NULL) object }) ## Check if graph object is up to date isUpToDate <- function(object, error=FALSE) { if(!is(object, "graph")) stop("'object' must inherit from class 'graph'") availSlots <- getObjectSlots(object) availSlotNames <- names(availSlots) definedSlotNames <- slotNames(object) valid <- setequal(availSlotNames, definedSlotNames) && length(object@graphData$edgemode) if(error && !valid) .Defunct(msg=EDGEMODE_DEFUNCT_MSG) return(valid) } hasEdgemode <- function(object) { if(!is(object, "graph")) stop("'object' must inherit from class 'graph'") sn <- names(getObjectSlots(object)) return("edgemode" %in% sn) } ## Update an old graph instance setMethod("updateGraph", "graph", function(object) { availSlots <- getObjectSlots(object) availSlotNames <- names(availSlots) definedSlotNames <- slotNames(object) if(isUpToDate(object)){ message("This graph object seems to be up to date") newObject <- object }else{ commonSlots <- intersect(definedSlotNames, availSlotNames) missingSlots <- setdiff(definedSlotNames, availSlotNames) if("graphData" %in% missingSlots && !"edgemode" %in% availSlotNames) stop("'object' is corrupted, don't know how to update.") newObject <- new(class(object)) for(s in commonSlots) slot(newObject, s) <- availSlots[[s]] edgemode(newObject) <- suppressWarnings(edgemode(object)) } return(newObject) }) setMethod("numEdges", signature(object="graph"), function(object) { gEdges <- edges(object) if (length(gEdges) == 0) return(0) numEdges <- length(unlist(gEdges, use.names=FALSE)) if (!isDirected(object)) { numSelfLoops <- sum(mapply(function(e, n) sum(n == e), gEdges, names(gEdges))) numEdges <- numSelfLoops + (numEdges - numSelfLoops) / 2 } numEdges }) ## a node-edge-list graph ##the edgeL is a list, with edges, weights etc setMethod("isAdjacent",signature(object="graph", from="character", to="character"), function(object, from, to) { eSpec <- .normalizeEdges(from, to) from <- eSpec$from to <- eSpec$to fromIdx <- match(from, nodes(object), nomatch=0) toIdx <- match(to, nodes(object), nomatch=0) if (any(fromIdx == 0)) stop("unknown nodes in 'from': ", pasteq(from[fromIdx == 0])) if (any(toIdx == 0)) stop("unknown nodes in 'to': ", pasteq(to[toIdx == 0])) fromEdges <- edges(object)[from] .Call(graph_is_adjacent, fromEdges, to) }) ##handle directed graphs by a list inDegree and outDegree setMethod("degree", signature(object="graph", Nodes="missing"), function(object) { degree(object, Nodes=nodes(object)) }) setMethod("degree", "graph", function(object, Nodes) { nl <- edges(object) nls <- nl[Nodes] deg <- listLen(nls) names(deg) <- Nodes if (!isDirected(object)) return(deg) else { b1 <- unlist(nl) b2 <- table(b1) nonZeroNodes <- Nodes[Nodes %in% names(b2)] inDegree <- structure(integer(length(Nodes)), names=Nodes) inDegree[nonZeroNodes] <- as.integer(b2[nonZeroNodes]) return(list(inDegree=inDegree, outDegree=deg)) } }) setMethod("leaves", "graph", function(object, degree.dir) { deg <- degree(object) leaf_degree <- 1L if (isDirected(object)) { if (missing(degree.dir)) stop("'degree.dir' must be specified for a directed graph") degree.dir <- switch(match.arg(degree.dir, c("in", "out")), "in"="inDegree", "out"="outDegree") deg <- deg[[degree.dir]] leaf_degree <- 0L } wh <- deg == leaf_degree names(deg)[wh] }) ## setMethod("acc", "graph", function(object, index) { ## visit <- function(ind) { ## marked[ind] <<- TRUE ## alist <- adj(object, ind)[[1]] ## for( EDGE in alist) { ## if( !marked[EDGE] ) { ## visit(EDGE) ## rval <<- c(EDGE, rval) ## } ## } ## } ## marked <- rep(FALSE, numNodes(object)) ## rval <- vector(length=0) ## names(marked) <- nodes(object) ## visit(index) ## return(rval) ## }, where = where) ##an iterative method ! yuck setMethod("acc", c("graph", "character"), function(object, index) { nN <- numNodes(object) nNames<- nodes(object) nIndex <- length(index) whN <- match(index, nNames) if( any(is.na(whN)) ) stop("unmatched node provided") rval <- vector("list", length=nIndex) names(rval) <- nNames[whN] for( i in seq_len(nIndex)) { marked<-rep(0, nN) distv <- rep(0, nN) names(distv) <- nNames distx <- 1 names(marked) <- nNames nmkd <- 0 marked[index[i]] <- 1 done <- FALSE while( !done ) { minds <- nNames[marked==1] for( node in minds) { avec <- adj(object, node)[[1]] avec <- avec[marked[avec]==0] #don't mark any already marked marked[avec] <- 1 distv[avec] <- distx } marked[minds] <- 2 distx <- distx+1 newmk <- sum(marked==1) if( newmk == 0 ) done <- TRUE } marked[index[i]] <- 0 ##not the node itself rval[[i]] <- distv[marked==2] } return(rval) }) setMethod("edgeWeights", signature(object="graph", index="character"), function(object, index, attr, default, type.checker) { ## Check extra args if (!is.character(attr) || length(attr) != 1) stop("'attr' must be character(1)") if (!is.null(type.checker) && !is.function(type.checker)) stop("'type.checker' be a function or NULL") if (! attr %in% names(edgeDataDefaults(object))) { ## No existing 'weight' edge attr, uses default edgeDataDefaults(object, attr) <- default } ew <- edgeData(object, from=index, attr=attr) if (!length(ew)) return(lapply(edges(object), function(x) vector(mode=mode(default), length=0))[index]) gEdges <- edges(object)[index] edgeCounts <- sapply(gEdges, length) nn <- rep(index, edgeCounts) names(ew) <- unlist(gEdges, use.names=FALSE) ew <- unlist(ew) if (!is.null(type.checker) && !isTRUE(type.checker(ew))) stop("edge weight type.checker(ew) not TRUE\n", "typeof(ew): ", typeof(ew)) ## for (el in ew) { ## ## XXX: if el is an S4 instance, it will match "list" ## if (!isTRUE(type.checker(el))) ## stop("invalid type of edge weight.\n", ## "type.checker(el) not TRUE\n", ## "typeof(el): ", typeof(el)) ## } ## if (!is.null(type.checker)) { ## dMode <- storage.mode(default) ## tryCatch(storage.mode(ew) <- dMode, ## warning=function(w) { ## wMsg <- conditionMessage(w) ## msg <- paste("unable to type.checker edge weight to", ## dMode, "\n", wMsg) ## if (grep("NA", msg)) ## stop(msg) ## else ## warning(wMsg) ## }) ans = split(unlist(ew), nn) ans <- c(ans, lapply(gEdges[edgeCounts == 0], as.numeric)) ans[index] ## split does sorting, we want orig order }) setMethod("edgeWeights", signature(object="graph", index="numeric"), function(object, index, attr, default, type.checker) { index <- nodes(object)[index] edgeWeights(object, index, attr=attr, default=default, type.checker=type.checker) }) setMethod("edgeWeights", signature(object="graph", index="missing"), function(object, index, attr, default, type.checker) { index <- nodes(object) edgeWeights(object, index, attr=attr, default=default, type.checker=type.checker) }) setMethod("DFS", c("graph", "character", "ANY"), function(object, node, checkConn=TRUE) { nNames <- nodes(object) marked <- rep(NA, length(nNames)) names(marked) <- nNames m1 <- match(node, nNames) if( is.na(m1) ) stop("node not in graph: ", sQuote(node)) ##this could be expensive if (checkConn) { c1 <- connComp(object) if(length(c1) != 1) stop("graph is not connected") } marked[m1] <- 0 ##repeat until all are marked - marked has no NA's counter <- 1 while( any(is.na(marked)) ) { fE <- boundary(nNames[!is.na(marked)], object) fE <- fE[sapply(fE, length) > 0] wh <- marked[names(fE)] v1 <- sort(wh) newN <- fE[[names(v1)[v1==max(v1)]]] marked[newN[1]] <- counter counter <- counter+1 } return(marked) }) ### yet another implementation of "intersection", in C setMethod("intersection2", c("graph", "graph"), function(x,y) { if (edgemode(x) != edgemode(y) ) stop("both graphs must have the same edgemode") if (edgemode(x) == "undirected") edgeM <- 0 else edgeM <- 1 .Call(graph_intersection, nodes(x), nodes(y), edges(x), edges(y), edgeM) }) setMethod("intersection", c("graph", "graph"), function(x,y) { if( edgemode(x) != edgemode(y) ) stop("both graphs must have the same edgemode") xN <- nodes(x) yN <- nodes(y) bN <- intersect(xN, yN) if( length(bN) == 0 ) return(graphNEL(nodes=character(0), edgeL=vector("list", 0), edgemode=edgemode(x))) ##lb <- length(bN) ##if(lb != length(xN) || lb != length(yN)) ## stop("graphs must have the same node set") xE <- edges(x, bN) xE = lapply(xE, function(x) { x[x %in% bN]}) yE <- edges(y, bN) yE = lapply(yE, function(x) { x[x %in% bN]}) rval <- vector("list", length=length(xE)) for(i in seq_along(xE) ) { ans <- intersect(xE[[i]], yE[[i]]) rval[[i]] <- list(edges=match(ans, bN), weights=rep(1, length(ans))) } names(rval) <- bN graphNEL(nodes=bN, edgeL=rval, edgemode=edgemode(x)) }) setMethod("join", c("graph", "graph"), function(x, y) { ex <- edgemode(x); ey <- edgemode(y) if(ex == ey) outmode <- ex else stop("cannot handle different edgemodes") nX <- nodes(x) numXnodes <- length(nX) nY <- nodes(y) ## Combine the two sets of nodes, removing any duplications newNodes <- unique(c(nX, nY)) eLX <- edgeL(x) eLY <- edgeL(y) newEdgeL <- eLX ## Can't just cat the edgeL's together like this ## as the node #s have all changed. if (length(eLY) > 0) { eLYnames <- names(eLY) for (i in seq_along(eLY)) { newEntry <- eLY[i] ## !! first need to adjust the targets on the edges newEdges <- newEntry[[1]]$edges if (length(newEdges) > 0) { for (j in seq_along(newEdges)) { curTo <- nY[newEdges[j]] newTo <- match(curTo,newNodes) if (is.na(newTo)) stop("error reassigning duplicated nodes") newEdges[j] <- newTo } } newEntry[[1]]$edges <- newEdges ## now need to attach it to the list. If this ## is a duplicated node, combine it with the ## original, otherwise add it ot the list if (length(newEdgeL) == 0) newEdgeL <- newEntry else if (eLYnames[i] %in% nX) { entry <- which(names(newEdgeL) == eLYnames[i]) if (length(entry) > 1) stop("duplicated node names in original graph") curEntry <- newEdgeL[[entry]] curEntry$edges <- c(curEntry$edges, newEntry[[1]]$edges) curEntry$weights <- c(curEntry$weights, newEntry[[1]]$weights) ##should be user adjustable - ##for now just remove extras dups = duplicated(curEntry$edges) if(any(dups) ) { curEntry$edges = curEntry$edges[!dups] curEntry$weights = curEntry$weights[!dups] } if (!is.null(curEntry)) newEdgeL[[entry]] <- curEntry } else newEdgeL <- c(newEdgeL,newEntry) } } ## Some graphs have edgeL's that are missing the original ## node from the edgeL. When we collated the edgeL above, ## those nodes will be missing - so need to make sure that ## all nodes are present, as the graphNEL() call below ## will check to make sure that length(nodes) == length(edgeL) for (missNode in newNodes[! newNodes %in% names(newEdgeL)]) { newEdgeL[[length(newEdgeL) + 1]] <- list(edges=numeric(), weights=numeric()) names(newEdgeL)[length(newEdgeL)] <- missNode } graphNEL(nodes=newNodes, edgeL=newEdgeL, edgemode=ex) }) setMethod("union", c("graph", "graph"), function(x, y, ...) { ex <- edgemode(x); ey <- edgemode(y); if( ex == ey ) outmode <- ex else stop("cannot handle different edgemodes") xN <- sort(nodes(x)) yN <- sort(nodes(y)) if( any(xN != yN) ) stop("graphs must have the same nodes") xE <- edges(x) yE <- edges(y) rval <- vector("list", length=length(xE)) names(rval) <- xN for(i in names(xE) ) { ans <- unique(c(xE[[i]], yE[[i]])) rval[[i]] <- if( length(ans) > 0 ) list(edges = match(ans, xN), weights= rep(1, length(ans))) else list(edges=numeric(0), weights=numeric(0)) } names(rval) <- xN graphNEL(nodes=xN, edgeL=rval, edgemode=outmode) }) setMethod("complement", c("graph"), function(x) { if( edgemode(x) != "undirected" ) stop("'edgemode' not supported: ", sQuote(edgemode(x))) xN <- nodes(x) xE <- edges(x) rval <- vector("list", length=length(xE)) names(rval) <- xN for( i in xN ) { ans <-xN[ !(xN %in% c(i, xE[[i]])) ] lena <- length(ans) if( lena > 0 ) rval[[i]] <- list(edges=match(ans, xN), weights=rep(1, lena)) else rval[[i]] <- list(edges=numeric(0), weights=numeric(0)) } graphNEL(nodes=xN, edgeL=rval, edgemode=edgemode(x)) }) ##connected components setMethod("connComp", "graph", function(object) { ##if directed we do weak connectivity ##by transforming to the underlying undirected graph if( edgemode(object) == "directed") object = ugraph(object) NL <- nodes(object) marked <- rep(0, length(NL)) names(marked) <- NL done <- FALSE rval <- vector("list", 1) cnode <- 1 index <- 1 nused <- numeric(0) while( !done ) { curracc <- acc(object, NL[cnode])[[1]] rval[[index]] <- curracc nused <- c(nused, cnode) index <- index + 1 if( length(curracc) > 0 ) marked[names(curracc)] <- 1 marked[cnode] <- 1 cnode <- match(0, marked) if( is.na(cnode) ) done <- TRUE } nmR <- NL[nused] nc <- length(rval) rL <- vector("list", length=nc) for(i in seq_len(nc)) rL[[i]]<-c(nmR[[i]], names(rval[[i]])) return(rL) }) setMethod("isConnected", "graph", function(object, ...) (length(connComp(object)) == 1)) setMethod("numNodes", "graph", function(object) length(nodes(object))) setMethod("show", signature("graph"), function(object) { isUpToDate(object, error=TRUE) numNodes<- numNodes(object) numEdge<-numEdges(object) cat("A", class(object), "graph with", edgemode(object), "edges\n") cat("Number of Nodes =", numNodes, "\n") cat("Number of Edges =", numEdge, "\n") }) .edgeWeight <- function(from, to, graph) { gN <- nodes(graph) wF <- match(from, gN) if( is.na(wF) ) stop("not a node: ", sQuote(from)) wT <- match(to, gN) if( is.na(wT) ) stop("not a node: ", sQuote(to)) eL <- graph@edgeL[[from]] mt <- match(wT, eL$edges) if(is.na(mt) ) stop("no edge from ", sQuote(from), " to ", sQuote(to)) eL$weights[mt] } ##take a sparse matrix - csr and put it into a graph sparseM2Graph <- function(sM, nodeNames, edgemode=c("directed", "undirected")) { ## FIXME: this needs to become a method qrequire("SparseM") edgemode <- match.arg(edgemode) nN <- dim(sM)[1] if( nN != dim(sM)[2] ) stop("only square matrices can be transformed") if( length(nodeNames) != nN ) stop("wrong number of node names supplied") if( !is.character(nodeNames) ) stop("wrong type of node names supplied") dd <- diff(sM@ia) e1 <- rep(seq_len(nN), dd) eL <- split(sM@ja, e1) eW <- split(sM@ra, e1) edL <- vector("list", length=nN) names(edL) <- seq_len(nN) for(i in as.character(seq_len(nN)) ){ ##need this because otherwise partial matching is done if( i %in% names(eL) ) edL[[i]] <- list(edges=eL[[i]], weights=eW[[i]]) else edL[[i]] <- list(edges=numeric(0)) } names(edL) <- nodeNames graphNEL(nodes=nodeNames, edgeL=edL, edgemode=edgemode) } ##translate a graph to a SparseMatrix: ##ra - the values; these will be 1's for now ##ja - the column indices ##ia the row offsets ( graph2SparseM <- function(g, useweights=FALSE) { ## FIXME: this needs to become a method qrequire("SparseM") if (! is(g, "graphNEL")) stop("coercion only works for graphNEL class") nr = nc = numNodes(g) e1 = g@edgeL e2 = lapply(e1, function(x) x$edges) eL = listLen(e2) if (useweights && ("weight" %in% names(edgeDataDefaults(g)))) ra <- unlist(edgeData(g, attr="weight")) else ra = rep(1, sum(eL)) ja = as.integer(unlist(e2)) ia = as.integer(cumsum(c(1, eL))) new("matrix.csr", ra=ra, ja=ja, ia=ia, dimension=c(nr, nc)) } ##-------------------------- ## edge names ##-------------------------- setMethod("edgeNames", signature="graph", definition=function(object, recipEdges=c("combined", "distinct")) { recipEdges <- match.arg(recipEdges) ## convert names to integers ("standard node labeling") to <- lapply(edges(object), match, nodes(object)) from <- match(names(to), nodes(object)) if(any(is.na(unlist(to)))||any(is.na(from))) stop("edge names do not match node names") ## from-to matrix ft <- matrix(c(rep(from, listLen(to)), to=unlist(to)), ncol=2) if (recipEdges == "combined") { ## revert those edges for which 'from' > 'to' revert <- ft[, 1] > ft[, 2] ft2 <- ft ft2[revert,] <- ft2[revert, c(2, 1)] ft <- ft[!duplicated.array(ft2, MARGIN=1),, drop=FALSE] } return(paste(nodes(object)[ft[, 1]], nodes(object)[ft[, 2]], sep="~")) }, valueClass="character") ##-------------------------- ## clustering coefficient ##-------------------------- setMethod("clusteringCoefficient", signature=signature(object="graph"), definition=function(object, selfLoops=FALSE) { if(edgemode(object)!="undirected") return(NULL) ## Convert names to integers ("standard node labeling") ## This is here for efficiency - the matching code in the for-loop ## below would also work for the characters (names). to <- lapply(edges(object), match, nodes(object)) from <- match(names(to), nodes(object)) if(any(is.na(unlist(to)))||any(is.na(from))) stop("edge names do not match node names") if(!selfLoops) { ufrom <- rep(from, listLen(to)) uto <- unlist(to) if(any(ufrom==uto)) stop("graph must not contain self-loops") totEdges <- function(i) i*(i-1) } else { totEdges <- function(i) i*i } clustCoef <- rep(as.numeric(NA), numNodes(object)) names(clustCoef) <- nodes(object) for (i in which(listLen(to)>0)) { ## to[[i]] are all the nodes reached from i. ## to[ to[[i]] ] are all second-degree neihbours nb <- sapply(to[ to[[i]] ], function(x) sum(!is.na(match(x, to[[i]])))) clustCoef[from[i]] <- sum(nb) / totEdges(length(nb)) } return(clustCoef) }, valueClass="numeric") ## --------------------------------------------------------------------- ## node data access ## --------------------------------------------------------------------- setMethod("nodeDataDefaults", signature(self="graph", attr="missing"), function(self, attr) attrDefaults(self@nodeData)) setMethod("nodeDataDefaults", signature(self="graph", attr="character"), function(self, attr) attrDefaults(self@nodeData, attr)) setReplaceMethod("nodeDataDefaults", signature(self="graph", attr="missing", value="list"), function(self, attr, value) { attrDefaults(self@nodeData) <- value self }) setReplaceMethod("nodeDataDefaults", signature(self="graph", attr="character", value="ANY"), function(self, attr, value) { attrDefaults(self@nodeData, attr) <- value self }) .verifyNodes <- function(n, nodes) { unknownNodes <- n[! n %in% nodes] if (length(unknownNodes) > 0) stop("unknown nodes: ", pasteq(unknownNodes)) TRUE } setMethod("nodeData", signature(self="graph", n="character", attr="character"), function(self, n, attr) { .verifyNodes(n, nodes(self)) attrDataItem(self@nodeData, x=n, attr=attr) }) setReplaceMethod("nodeData", signature(self="graph", n="character", attr="character", value="ANY"), function(self, n, attr, value) { .verifyNodes(n, nodes(self)) attrDataItem(self@nodeData, x=n, attr=attr) <- value self }) setMethod("nodeData", signature(self="graph", n="character", attr="missing"), function(self, n, attr) { .verifyNodes(n, nodes(self)) attrDataItem(self@nodeData, x=n) }) setMethod("nodeData", signature(self="graph", n="missing", attr="character"), function(self, n, attr) { attrDataItem(self@nodeData, x=nodes(self), attr=attr) }) setReplaceMethod("nodeData", signature(self="graph", n="missing", attr="character", value="ANY"), function(self, n, attr, value) { attrDataItem(self@nodeData, x=nodes(self), attr=attr) <- value self }) setMethod("nodeData", signature(self="graph", n="missing", attr="missing"), function(self, n, attr) { attrDataItem(self@nodeData, x=nodes(self)) }) ## --------------------------------------------------------------------- ## --------------------------------------------------------------------- ## edge data access ## --------------------------------------------------------------------- setMethod("edgeDataDefaults", signature(self="graph", attr="missing"), function(self, attr) attrDefaults(self@edgeData)) setMethod("edgeDataDefaults", signature(self="graph", attr="character"), function(self, attr) attrDefaults(self@edgeData, attr)) setReplaceMethod("edgeDataDefaults", signature(self="graph", attr="missing", value="list"), function(self, attr, value) { attrDefaults(self@edgeData) <- value self }) setReplaceMethod("edgeDataDefaults", signature(self="graph", attr="missing", value="list"), function(self, attr, value) { attrDefaults(self@edgeData) <- value self }) setReplaceMethod("edgeDataDefaults", signature(self="graph", attr="character", value="ANY"), function(self, attr, value) { attrDefaults(self@edgeData, attr) <- value self }) .normalizeEdges <- function(from, to) { lenFr <- length(from) lenTo <- length(to) if (lenFr > lenTo) { if (lenTo != 1) stop("'to' must be length 1 or ", lenFr) to <- rep(to, lenFr) } else if (lenFr < lenTo) { if (lenFr != 1) stop("'from' must be length 1 or ", lenTo) from <- rep(from, lenTo) } list(from=from, to=to) } .verifyEdges <- function(graph, from, to) { stopifnot(length(from) == length(to)) if (length(from) == 0L) return(TRUE) # no edges adjList <- isAdjacent(graph, from, to) if (any(!adjList)) { badFr <- from[!adjList] badTo <- to[!adjList] res <- paste(badFr, badTo, sep=EDGE_KEY_SEP, collapse=", ") stop("edges not found: ", sQuote(res)) } TRUE } .makeEdgeKeys <- function(from, to) { stopifnot(length(from) == length(to)) paste(from, to, sep=EDGE_KEY_SEP) } .getEdgeKeys <- function(graph, from, to) { eSpec <- .normalizeEdges(from, to) from <- eSpec$from to <- eSpec$to .verifyEdges(graph, from, to) edgeKeys <- .makeEdgeKeys(from, to) edgeKeys } setMethod("edgeData", signature(self="graph", from="character", to="character", attr="character"), function(self, from, to, attr) { edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) }) setMethod("edgeData", signature(self="graph", from="character", to="missing", attr="character"), function(self, from, to, attr) { .verifyNodes(from, nodes(self)) gEdges <- edges(self)[from] lens <- sapply(gEdges, length) fEdges <- rep(from, lens) if (!length(fEdges)) return(list()) tEdges <- unlist(gEdges) edgeKeys <- .getEdgeKeys(self, fEdges, tEdges) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) }) setMethod("edgeData", signature(self="graph", from="missing", to="character", attr="character"), function(self, from, to, attr) { eDat <- edges(self) inE <- inEdges(to, self) to <- rep(to, sapply(inE, length)) from <- unlist(inE) ## from <- names(eDat)[sapply(eDat, function(x) to %in% x)] edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) }) setReplaceMethod("edgeData", signature(self="graph", from="character", to="character", attr="character", value="ANY"), function(self, from, to, attr, value) { edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) <- value if (!isDirected(self)) { edgeKeys <- .getEdgeKeys(self, to, from) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) <- value } self }) setReplaceMethod("edgeData", signature(self="graph", from="character", to="missing", attr="character", value="ANY"), function(self, from, to, attr, value) { .verifyNodes(from, nodes(self)) gEdges <- edges(self)[from] lens <- sapply(gEdges, length) if (any(lens == 0)) warning("no edges from nodes: ", pasteq(from[lens == 0])) fEdges <- rep(from, lens) tEdges <- unlist(edges(self)[from]) edgeKeys <- .getEdgeKeys(self, fEdges, tEdges) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) <- value if (!isDirected(self)) { edgeKeys <- .getEdgeKeys(self, tEdges, fEdges) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) <- value } self }) setReplaceMethod("edgeData", signature(self="graph", from="missing", to="character", attr="character", value="ANY"), function(self, from, to, attr, value) { eDat <- edges(self) from <- names(eDat)[sapply(eDat, function(x) to[1] %in% x)] edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) <- value if (!isDirected(self)) { edgeKeys <- .getEdgeKeys(self, to, from) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) <- value } self }) .getAllEdges <- function(graph) { e1 <- edges(graph) if (length(e1) == 0L) { list(from=character(0), to=character(0)) } else { n1 <- nodes(graph) n1 <- rep(n1, sapply(e1, length)) list(from=n1, to=unlist(e1)) } } setMethod("edgeData", signature(self="graph", from="missing", to="missing", attr="character"), function(self, from, to, attr) { eSpec <- .getAllEdges(self) from <- eSpec$from to <- eSpec$to edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys, attr=attr) }) setMethod("edgeData", signature(self="graph", from="character", to="character", attr="missing"), function(self, from, to, attr) { edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys) }) setMethod("edgeData", signature(self="graph", from="missing", to="missing", attr="missing"), function(self, from, to, attr) { eSpec <- .getAllEdges(self) from <- eSpec$from to <- eSpec$to edgeKeys <- .getEdgeKeys(self, from, to) attrDataItem(self@edgeData, x=edgeKeys) }) ## still needed for Rgraphviz' plot() [well, as long as edgeL() is still there] setMethod("edgeL", "graph", function(graph, index) callGeneric(as(graph, "graphNEL"))) setMethod("plot", c("graph", "ANY"), function(x, y, ...) { qrequire("Rgraphviz") method <- getMethod("plot", c("graph", "ANY"), getNamespace("Rgraphviz")) method(x, y, ...) }) clearEdgeData <- function(self, from, to) { ##FIXME: make me a method edgeKeys <- .getEdgeKeys(self, from, to) removeAttrDataItem(self@edgeData, x=edgeKeys) <- NULL self } clearNodeData <- function(self, n) { ##FIXME: make me a method removeAttrDataItem(self@nodeData, x=n) <- NULL self } graph/R/methods-graphAM.R0000644000175100017510000002743112607264574016223 0ustar00biocbuildbiocbuild## adjacency matrix representation of a graph isValidAdjMat <- function(adjMat, mode="undirected") { ## Determine if adjacency matrix adjMat is valid Element adjMat[i, j] == 1 ## if the graph contains an edge FROM node i TO node j. If mode is ## "undirected", then adjMat should be symmetrix. if (length(adjMat) == 0L) return(character(0L)) if (! nrow(adjMat) == ncol(adjMat)) stop("adjacency matrix must be square") if (mode == "undirected") if (any(adjMat != t(adjMat))) ## XXX: this could be slow stop("adjacency matrix must be symmetric for undirected graphs") if (any(adjMat < 0)) stop("adjacency matrix must not have negative values") if (is.null(dimnames(adjMat))) { nNames <- NULL } else { ## take first non-null dimname nonNullIndices <- which(sapply(dimnames(adjMat), function(x) !is.null(x))) nNames <- dimnames(adjMat)[[nonNullIndices[1]]] if (any(duplicated(nNames))) stop("node names must be distinct") checkValidNodeName(nNames) if (length(nonNullIndices) == 2) { ## verify rownames match colnames if (any(rownames(adjMat) != colnames(adjMat))) stop("row and column names must match") } } return(nNames) } isValidNodeList <- function(nList, nNames) { if (!is.list(nList) || is.null(names(nList))) stop("nodes must be specified as a named list") if (!setequal(names(nList), nNames)) stop("names of node list must match graph node names") return(TRUE) } initEdgeSet <- function(self, values) { ## Put matrix elements into @edgeData using attr name from 'values'. if (!is.list(values) || length(values) != 1 || is.null(names(values))) stop("'values' must be a named list with one element") self@edgeData <- new("attrData", defaults=values) valName <- names(values)[1] eSpec <- .getAllEdges(self) from <- eSpec$from to <- eSpec$to if (length(from) > 0L && length(to) > 0L) { v <- t(self@adjMat) v <- v[v != 0] ## this unrolls the matrix in the right way edgeData(self, from=from, to=to, attr=valName) <- v ## FIXME: consider storing matrix as logical } self } setMethod("initialize", signature("graphAM"), function(.Object, adjMat, edgemode="undirected", values) { nNames <- isValidAdjMat(adjMat, edgemode) if (is.null(nNames)) nNames <- paste0("n", seq_len(ncol(adjMat))) .Object@graphData$edgemode <- edgemode .Object@nodeData <- new("attrData") colnames(adjMat) <- nNames rownames(adjMat) <- NULL .Object@adjMat <- adjMat if (!missing(values)) .Object <- initEdgeSet(.Object, values) else .Object@edgeData <- new("attrData") ## Matrix values have been stored in @edgeData, ## so now we normalize to 0/1 adjMat <- .Object@adjMat adjMat[adjMat != 0L] <- 1L .Object@adjMat <- adjMat .Object }) getEdgeList <- function(adjMat, nodeNames) { numNodes <- length(nodeNames) eList <- vector(mode="list", length=numNodes) for (i in seq(length=numNodes)) { aRow <- adjMat[i, ] result <- names(base::which(aRow != 0)) if (is.null(result)) result <- character(0) eList[[i]] <- result } names(eList) <- nodeNames eList } setMethod("edges", signature("graphAM", "missing"), function(object) { if (length(object@adjMat) == 0L) return(list()) getEdgeList(object@adjMat, nodes(object)) }) setMethod("edges", signature("graphAM", "character"), function(object, which) { if (length(object@adjMat) == 0L) return(list()) idx <- base::which(colnames(object@adjMat) %in% which) getEdgeList(object@adjMat[idx, ], nodes(object)[idx]) }) setMethod("numNodes", signature("graphAM"), function(object) length(nodes(object))) setMethod("numEdges", signature(object="graphAM"), function(object) { nE <- sum(object@adjMat != 0) if (!isDirected(object)) { selfLoops <- sum(diag(object@adjMat) != 0) nE <- selfLoops + (nE - selfLoops)/2 } nE }) setMethod("isAdjacent", signature(object="graphAM", from="character", to="character"), function(object, from, to) { eSpec <- .normalizeEdges(from, to) from <- eSpec$from to <- eSpec$to fromIdx <- match(from, nodes(object), nomatch=0) toIdx <- match(to, nodes(object), nomatch=0) if (any(fromIdx == 0)) stop("'from' unknown node(s): ", pasteq(from[fromIdx == 0])) if (any(toIdx == 0)) stop("'to' unknown nodes: ", pasteq(to[toIdx == 0])) result <- logical(length(fromIdx)) for (i in seq_along(fromIdx)) result[i] <- object@adjMat[fromIdx[i], toIdx[i]] != 0 result }) extendAdjMat <- function(adjMat, nodes) { nms <- c(colnames(adjMat), nodes) curCols <- ncol(adjMat) newCols <- matrix(0, nrow=curCols, ncol=length(nodes)) adjMat <- cbind(adjMat, newCols) newRows <- matrix(0, nrow=length(nodes), ncol=ncol(adjMat)) adjMat <- rbind(adjMat, newRows) colnames(adjMat) <- nms adjMat } getIndices <- function(nodes, from, to) { ## Return indices into the adjMat for nodes from and to. i <- match(from, nodes, nomatch=0) if (any(bad <- (i == 0))) stop("'from' unknown node(s): ", sQuote(from[bad])) j <- match(to, nodes, nomatch=0) if (any(bad <- (j == 0))) stop("'to' unknown node(s): ", sQuote(to[bad])) list(from=i, to=j) } setMethod("addNode", signature(node="character", object="graphAM", edges="missing"), function(node, object) { already <- node %in% nodes(object) if(any(already)) stop("node(s) already exist: ", pasteq(node[already])) checkValidNodeName(node) object@adjMat <- extendAdjMat(object@adjMat, node) object }) setMethod("addEdge", signature(from="character", to="character", graph="graphAM", weights="missing"), function(from, to, graph) { if (any(bad <- isAdjacent(graph, from, to))) stop("edge(s) already exist: ", pasteq(paste(from[bad], to[bad], sep="|"))) idx <- getIndices(nodes(graph), from, to) idx <- cbind(idx$from, idx$to) graph@adjMat[idx] <- 1L if (! isDirected(graph)) graph@adjMat[idx[ , c(2L, 1L)]] <- 1L graph }) setMethod("clearNode", signature(node="character", object="graphAM"), function(node, object) { idx <- getNodeIndex(nodes(object), node) zeroVect <- rep(0, ncol(object@adjMat)) ## clear edges from node to other object@adjMat[idx, ] <- zeroVect ## clear edges from other to node object@adjMat[, idx] <- zeroVect ## TODO: clear edge attributes object }) ## TODO: implement a clearEdgeAttributes method setMethod("removeNode", signature(node="character", object="graphAM"), function(node, object) { idx <- getNodeIndex(nodes(object), node) object@adjMat <- object@adjMat[-idx, -idx] ## TODO: clear edge attributes object }) getNodeIndex <- function(nodeNames, node) { idx <- match(node, nodeNames, nomatch=NA) if (any(is.na(idx))) stop("unknown node(s): ", pasteq(node[is.na(idx)])) idx } coordToIndex <- function(x, y, nrow) (y * nrow) - (nrow - x) setMethod("removeEdge", signature(from="character", to="character", graph="graphAM"), function(from, to, graph) { fromIdx <- getNodeIndex(nodes(graph), from) toIdx <- getNodeIndex(nodes(graph), to) rowCnt <- nrow(graph@adjMat) graph@adjMat[coordToIndex(fromIdx, toIdx, rowCnt)] <- 0 if (!isDirected(graph)) graph@adjMat[coordToIndex(toIdx, fromIdx, rowCnt)] <- 0 graph }) ## This signature looks strange, but to get in edges for all nodes ## it makes sense to be able to write inEdges(g) setMethod("inEdges", signature(node="graphAM", object="missing"), function(node, object) { allNodes <- nodes(node) return(inEdges(allNodes, node)) }) ## But we still want inEdges(object=g) to work setMethod("inEdges", signature(node="missing", object="graphAM"), function(node, object) { allNodes <- nodes(object) return(inEdges(allNodes, object)) }) setMethod("inEdges", signature(node="character", object="graphAM"), function(node, object) { allNodes <- nodes(object) unknownNodes <- !(node %in% allNodes) if (any(unknownNodes)) stop("unknown nodes: ", pasteq(node[unknownNodes])) ## cols of adjMat tells us in edges adjMat <- object@adjMat ans <- list() for (n in node) { ans[[n]] <- allNodes[as.logical(adjMat[, n])] } ans }) setAs(from="graphAM", to="matrix", function(from) { am <- from@adjMat if (length(am) == 0L) return(am) if ("weight" %in% names(edgeDataDefaults(from))) { tm <- t(am) tm[tm != 0] <- unlist(edgeData(from, attr="weight")) m <- t(tm) } else { m <- am } rownames(m) <- colnames(m) m }) ## ^^ the reverse is in ./mat2graph.R setAs(from="graphAM", to="graphNEL", function(from) { gnel <- graphNEL(nodes=nodes(from), edgeL=edges(from), edgemode=edgemode(from)) ## copy edge and node attributes: gnel@edgeData <- from@edgeData gnel@nodeData <- from@nodeData gnel }) ## This is also used in mat2graph.R : NEL2mat <- function(g) { theNodes <- nodes(g) numNodes <- length(theNodes) mat <- matrix(0:0, nrow=numNodes, ncol=numNodes) rownames(mat) <- colnames(mat) <- theNodes theEdges <- edges(g) wts <- edgeWeights(g) use.wts <- any(unlist(wts) != 1) for (n in theNodes) { e <- theEdges[[n]] if (length(e)) mat[n, e] <- if(use.wts) wts[[n]] else 1L } mat } setAs(from="graphNEL", to="graphAM", function(from) { theNodes <- nodes(from) numNodes <- length(theNodes) mat <- matrix(0, nrow=numNodes, ncol=numNodes, dimnames=list(theNodes, theNodes)) theEdges <- edges(from) for (n in theNodes) { e <- theEdges[[n]] if (length(e)) mat[n, e] <- 1 } ## XXX: it would be safer to pass mat here, but since we cannot ## yet pass in the edgeData and nodeData, we benefit greatly ## by avoiding the copying of large matrices. gam <- graphAM(matrix(0), edgemode=edgemode(from)) ## one of the things that initialize will do is remove row ## names, so that only one copy of node names are stored rownames(mat) <- NULL ## copy edge and node attributes gam@edgeData <- from@edgeData gam@nodeData <- from@nodeData gam@adjMat <- mat gam }) graph/R/methods-graphBAM.R0000644000175100017510000017055612607264574016334 0ustar00biocbuildbiocbuild## bit array adjacency matrix representation of a graph setMethod("initialize", signature("graphBAM"), function(.Object, nodes,edgeSet) { .Object@graphData$edgemode <- if (isDirected(edgeSet)) "directed" else "undirected" .Object@renderInfo@edges <- list(arrowhead=NULL, arrowtail=NULL) .Object@nodeData <- new("attrData") .Object@edgeData <- new("attrData") .Object@nodes <- nodes .Object@edgeSet <- edgeSet .Object }) graphBAM <- function(df, nodes = NULL, edgemode = "undirected", ignore_dup_edges = FALSE) { .required <- c("from", "to", "weight") cl <- .required %in% names(df) if (!all(cl)) { stop("required 'names(df)' not present: ", pasteq(.required[!cl])) } if (any(duplicated(nodes))) stop(sQuote(nodes), " must be unique") edge_nodes <- unique(c(as.character(df$from), as.character(df$to))) if (!all(edge_nodes %in% nodes)) nodes <- sort(c(edge_nodes, nodes)) else if (is.null(nodes)) nodes <- edge_nodes is_directed <- edgemode == "directed" edge_sets <- .makeMDEdgeSet(es_name = 1, es = df, is_directed = is_directed, nodes, ignore_dup_edges = ignore_dup_edges) g <- new("graphBAM", nodes = nodes, edgeSet = edge_sets) g@edgeData@defaults[["weight"]] <- 1L g } setMethod("numEdges", signature = signature(object = "graphBAM"), function(object) { numEdges(object@edgeSet) }) .undirectEdges <- function(from, to) { fromIsFirst <- from <= to toIsFirst <- !fromIsFirst tmpFrom <- c(from[fromIsFirst], to[toIsFirst]) tmpTo <- c(to[fromIsFirst], from[toIsFirst]) from <- tmpFrom to <- tmpTo list(from=from, to=to) } .edges_gbam <- function(object, which, direction="out") { nn <- nodes(object) if (numEdges(object) == 0L) { names(nn) <- nn c0 <- character(0L) return(lapply(nn, function(x) c0)) } ft <- .Call(graph_bitarray_rowColPos, object@edgeSet@bit_vector) ft[] <- nn[ft] eL <- singles <- NULL if (isDirected(object)) { if (direction == "in") ft[ , c("from", "to")] <- ft[ , c("to", "from")] eL <- split(ft[ , "to"], ft[ , "from"]) singles <- nn[!(nn %in% ft[ , "from"])] } else { eL <- lapply(split(ft, ft[ , c("to", "from")]), unique) singles <- nn[!(nn %in% ft)] } if (length(singles) > 0) { names(singles) <- singles c0 <- character(0L) empties <- lapply(singles, function(x) c0) eL <- c(eL, empties) } eL[order(names(eL))] } setMethod("inEdges", signature("character", "graphBAM"), function(node, object) { .edges_gbam(object, direction = "in")[node] }) setMethod("edges", signature("graphBAM", "missing"), .edges_gbam) setMethod("edges", signature("graphBAM", "character"), function(object, which) { ## TODO: refactor to optimize .edges_gbam(object)[which] }) setMethod("adj", c("graphBAM", "character"), function(object, index) edges(object, index)) getWeightList2 <- function(g){ nodeNames <- g@nodes numNodes <- length(nodeNames) w <- g@edgeSet@weights ft <- .Call(graph_bitarray_rowColPos, g@edgeSet@bit_vector) if(!isDirected(g)){ ft <- rbind(ft, ft[ , c(2L, 1L)]) w <- c(w,w) } ft[] <- nodeNames[ft] wList <- split(w, ft[ , 1L]) wNameList <- split(ft[ , 2L], ft[ , 1L]) wList <- mapply(function(wVals, wNames) { names(wVals) <- wNames a <- wVals[order(wNames)] if (!isDirected(g)) a[!duplicated(names(a))] else a }, wList, wNameList, SIMPLIFY=FALSE) haveNoEdge <- setdiff(nodeNames, names(wList)) names(haveNoEdge) <- haveNoEdge n0 <- numeric(0) haveNoEdge <- lapply(haveNoEdge, function(x) n0) c(wList, haveNoEdge)[nodeNames] } setMethod("edgeWeights", signature(object="graphBAM", index="character"), function(object, index, attr, default, type.checker) { if (!is.character(attr) || length(attr) != 1) stop("'attr' must be character(1)") if (!is.null(type.checker) && !is.function(type.checker)) stop("'type.checker' must be a function or NULL") getWeightList2(object)[index] }) setMethod("edgeWeights", signature(object="graphBAM", index="numeric"), function(object, index, attr, default, type.checker) { edgeWeights(object, nodes(object)[index], attr=attr, default=default, type.checker=type.checker) }) setMethod("edgeWeights", signature(object="graphBAM", index="missing"), function(object, index, attr, default, type.checker) { edgeWeights(object, nodes(object), attr=attr, default=default, type.checker=type.checker) }) .eAttrsFun <- function(self, from, attr) { nodeNames <- self@nodes indx <- which(nodeNames %in% from) numNodes <- length(nodeNames) bv <- self@edgeSet@bit_vector .verifyBAMAttrs(self, attr) val <- .retAttrVec(self, attr) ft <- .Call(graph_bitarray_rowColPos, bv) if(!isDirected(self)){ df <- cbind(from=ft[,"to"], to = ft[,"from"]) ft <- rbind(ft,df) val <- c(val,val) } tmp <- seq_len(length(val)) # indices into val ft <- data.frame(ft, tmp, stringsAsFactors = FALSE ) ft <- ft[ ft[,"from"] %in% indx,] if(nrow(ft) == 0) stop("edges specified in 'from' not found in 'self'") nodeLbl <- paste( nodeNames[ft[,"from"]], nodeNames[ft[, "to"]], sep ="|") val <- val[ft[,"tmp"]][seq_along(nodeLbl)] names(val) <- nodeLbl val } ## graphBAM edgeData methods setMethod("edgeData", signature(self="graphBAM", from="character", to= "missing", attr="character"), function(self, from, to, attr){ as.list(.eAttrsFun(self, from, attr)) }) setMethod("edgeData", signature(self="graphBAM", from="character", to="character", attr="character"), function(self, from, to, attr) { edgeData.from <- edgeData(self, attr=attr, from=from) unrecognized.nodes <- setdiff(to, nodes(self)) if(length(unrecognized.nodes) > 0) { msg <- sprintf("nodes not in graph: %s", paste(sQuote(unrecognized.nodes), collapse=", ")) stop(msg) } edgeNames <- names(edgeData.from) toStarts <- regexpr("|", edgeNames, fixed=TRUE) + 1L actual.to.nodes <- substring(edgeNames, toStarts, nchar(edgeNames)) edgeData.from[actual.to.nodes %in% to] }) setMethod("edgeData", signature(self="graphBAM", from="missing", to= "character", attr="character"), function(self, from, to, attr){ nodeNames <- self@nodes numNodes <- length(nodeNames) bv <- self@edgeSet@bit_vector .verifyBAMAttrs(self, attr) val <- .retAttrVec(self, attr) ft <- .Call(graph_bitarray_rowColPos, self@edgeSet@bit_vector) if(!isDirected(self)){ df <- cbind(from=ft[,"to"], to = ft[,"from"]) ft <- rbind(ft,df) val <- c(val,val) } tmp <- seq_len(length(val)) ft <- data.frame(ft, tmp, stringsAsFactors = FALSE) ft <- ft[ft[,"to"] %in% which(nodeNames %in% to),] if(nrow(ft) == 0) stop("edges specified in 'to' not found in 'self'") .verifyEdges(self, nodeNames[ft[,"from"]], nodeNames[ft[,"to"]]) nodeLbl <- paste( nodeNames[ft[,"from"]], nodeNames[ft[, "to"]], sep ="|") val <- val[ft[,"tmp"]][seq_along(nodeLbl)] names(val) <- nodeLbl as.list(val) }) setMethod("edgeData", signature(self="graphBAM", from="missing", to="missing", attr="missing"), function(self, from, to, attr) { nodeNames <- self@nodes numNodes <- length(nodeNames) attr <- "weight" bv <- self@edgeSet@bit_vector ft <- .Call(graph_bitarray_rowColPos, bv) w <- .retAttrVec(self, attr) if(!isDirected(self)){ df <- cbind(from=ft[,"to"], to = ft[,"from"]) ft <- rbind(ft,df) w <- c(w,w) } nodeLbl <- paste( nodeNames[ft[,"from"]], nodeNames[ft[, "to"]], sep ="|") names(w) <- nodeLbl lapply(w, function(x) list(weight = as.numeric(x))) }) setMethod("edgeData", signature(self="graphBAM", from="missing", to= "missing", attr="character"), function(self, from, to, attr){ as.list(.eAttrsFun(self, from = names(edges(self)), attr= attr)) }) .retAttrVec <- function(g, attr) { if(attr !="weight") { k1 <- g@edgeSet@bit_vector k2<- g@userAttrPos@edgePos[[attr]] tmp <- attributes(k1) res <- k1& (!k2) attributes(res) <- tmp ns <- .Call(graph_bitarray_sum, res) attr(res, "nbitset") <- ns ft <- data.frame(.Call(graph_bitarray_rowColPos, res)) dflt <- g@edgeData@defaults[[attr]] attrBit <- g@userAttrPos@edgePos[[attr]] ft <- ft[with(ft, order(to, from)),] if(nrow(ft)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, attrBit, as.integer(ft[,"from"]), as.integer(ft[,"to"])) attrBit <- setBitCell(attrBit, ft[,"from"], ft[,"to"], rep(1L, nrow(ft))) nt <- attr(attrBit, "nbitset") } else { nt <- attr(attrBit, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = mode(dflt)) if(!is.null(g@edgeSet@edge_attrs[[attr]])) { newAttr[ord$origLeftPos] <- g@edgeSet@edge_attrs[[attr]][ord$origRightPos] newAttr[ord$newLeftPos] <- if(mode(dflt)=="list") rep(list(dflt), length(ord$newLeftPos)) else dflt }else{ newAttr[seq_len(nt)] <- if(mode(dflt)=="list") rep(list(dflt), nt) else dflt } }else{ newAttr <- g@edgeSet@weights } newAttr } .align_from_to <- function(from, to, nodeNames) { from_len <- length(from) to_len <- length(to) req_nn <- unique(c(from, to)) if (!all(okidx <- req_nn %in% nodeNames)) stop("unknown nodes: ", pasteq(req_nn[!okidx])) if (from_len != to_len) { if (from_len == 1L) from <- rep(from, to_len) else if (to_len == 1L) to <- rep(to, from_len) else stop("invalid lengths of 'from' and 'to'") } df <- cbind(from=from, to=to) } .verifyBAMAttrs <- function(bam, attr) { if( !(attr %in% names(bam@edgeData@defaults))) stop("'attr' not found: ", sQuote(attr)) } .set_attrs <- function(g, from, to, attr, value) { nodeNames <- g@nodes req_ft <- .align_from_to(from, to, nodeNames) ## remove dups indx <- duplicated(paste(req_ft[,"from"], req_ft[,"to"], sep ="_")) req_ft <- req_ft[!indx, ,drop = FALSE] if(nrow(req_ft) > 0 ) .verifyEdges(g, req_ft[,1], req_ft[,2]) else stop("edges specified could not be found in \"self\"") if(is.vector(value)) { len <- length(value) }else{ len <- 1 value <- list(value) } if(len == 1L) value <- rep(value, nrow(req_ft)) if(length(value) != nrow(req_ft)) stop("number of edges and attribute values must be the same") ft <- .Call(graph_bitarray_rowColPos, g@edgeSet@bit_vector) if (!isDirected(g)) { ## normalize from/to valIndx <- seq_len(length(value)) tmp <- .mg_undirectEdges(req_ft[ , 1], req_ft[, 2], valIndx) req_ft <- cbind("from"= tmp[["from"]],"to" = tmp[["to"]]) value <- value[tmp[["weight"]]] } req_i <- structure(match(req_ft, nodeNames), dim = dim(req_ft)) colnames(req_i) <- c("from", "to") req_i <- data.frame(req_i) idx <- order(req_i[,2], req_i[,1]) req_i <- req_i[idx, ] value <- value[idx] if(attr == "weight") { attrBit <- g@edgeSet@bit_vector if(nrow(req_i)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, attrBit, as.integer(req_i[,"from"]), as.integer(req_i[,"to"])) g@edgeSet@bit_vector <- setBitCell(attrBit, req_i[,"from"], req_i[,"to"], rep(1L, nrow(req_i))) nt <- attr(g@edgeSet@bit_vector, "nbitset") } else { nt <- attr(attrBit, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = mode(value)) newAttr[ord$origLeftPos] <- g@edgeSet@weights[ord$origRightPos] newAttr[ord$newLeftPos] <- value[ord$newRightPos] g@edgeSet@weights <- newAttr }else { attrBit <- g@userAttrPos@edgePos[[attr]] if(nrow(req_i)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, attrBit, as.integer(req_i[,"from"]), as.integer(req_i[,"to"])) g@userAttrPos@edgePos[[attr]] <- setBitCell(attrBit, req_i[,"from"], req_i[,"to"], rep(1L, nrow(req_i))) nt <- attr(g@userAttrPos@edgePos[[attr]], "nbitset") } else { nt <- attr(attrBit, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = mode(value)) newAttr[ord$origLeftPos] <- g@edgeSet@edge_attrs[[attr]][ord$origRightPos] newAttr[ord$newLeftPos] <- value[ord$newRightPos] g@edgeSet@edge_attrs[[attr]] <- newAttr } g } ## graphBAM edgeData replacement methods setReplaceMethod("edgeData", signature(self="graphBAM", from="character", to="character", attr="character", value="ANY"), function(self, from, to, attr, value) { .verifyAttrName(attr, names(self@edgeData@defaults)) lenFrom <- length(from) lenTo <- length(to) if(lenFrom != lenTo) { if(lenFrom ==1) from <- rep(from, lenTo) else if (lenTo == 1) to <- rep(to , lenFrom) else stop("'from', 'to' differ in length") } .verifyEdges(self, from, to) .set_attrs(self, from, to, attr, value) }) setReplaceMethod("edgeData", signature(self="graphBAM", from="character", to="missing", attr="character", value="ANY"), function(self, from, to, attr, value) { .verifyAttrName(attr, names(self@edgeData@defaults)) eg <- edges(self,from) to <- unlist(eg, use.names = FALSE) len <- as.numeric(sapply(eg, length)) from <- rep(names(eg),len) .verifyEdges(self, from, to) .set_attrs(self, from, to, attr, value) }) setReplaceMethod("edgeData", signature(self="graphBAM", from="missing", to="character", attr="character", value="ANY"), function(self, from, to, attr, value) { .verifyAttrName(attr, names(self@edgeData@defaults)) eg <- inEdges(to, self) eg <- eg[order(names(eg))] from <- unlist(eg, use.names = FALSE) len <- as.numeric(sapply(eg, length)) to <- rep(names(eg), len) .verifyEdges(self, from, to) .set_attrs(self, from, to, attr, value) }) ## graphBAM edgeDataDefaults replacement methods setReplaceMethod("edgeDataDefaults", signature(self="graphBAM", attr="missing", value="list"), function(self, attr, value) { attrDefaults(self@edgeData) <- value wt <- self@edgeData@defaults[["weights"]] if(!is.numeric(wt) && !is.null(wt)) stop("'weights' attribute must be numeric()") ndsLen <- length(nodes(self)) nms <- names(value) for(i in seq_along(value)) { if(!(nms[i] %in% names(self@userAttrPos@edgePos))) { if(nms[i] != "weight"){ posBit <- .createZeroBitPos(ndsLen) self@userAttrPos@edgePos[[nms[i]]] <- posBit } } } self }) setReplaceMethod("edgeDataDefaults", signature(self="graphBAM", attr="character", value="ANY"), function(self, attr, value) { attrDefaults(self@edgeData, attr) <- value if(attr == "weight") { wt <- self@edgeData@defaults[["weights"]] if(!is.numeric(wt) && !is.null(wt)) stop("'weights' attribute must be numeric()") } else{ ndsLen <- length(nodes(self)) if(!(attr %in% names(self@userAttrPos@edgePos))) { posBit <- .createZeroBitPos(ndsLen) self@userAttrPos@edgePos[[attr]] <- posBit } } self }) .createZeroBitPos <- function(ndsLen) { makebits(ndsLen * ndsLen, bitdim = c(ndsLen, ndsLen)) } setMethod("numNodes", signature("graphBAM"), function(object) length(object@nodes)) setMethod("isAdjacent", signature(object="graphBAM", from="character", to="character"), function(object, from, to) { if(length(from) > 1 & length(to) == 1) to <- rep(to, length(from)) if(length(to) > 1 & length(from) == 1) from <- rep(from, length(to)) stopifnot(length(from) == length(to)) nodeNames <- object@nodes edge.matrix <- edgeMatrix(object) edge.count <- ncol(edge.matrix) reciprocal.edges <- edgemode(object) == "undirected" result <- rep(FALSE, length(from)) pair.count <- length(from) for(pc in seq_len(pair.count)) { for(ec in seq_len(edge.count)){ from.node <- nodeNames[edge.matrix["from", ec]] to.node <- nodeNames[edge.matrix["to", ec]] if(from.node == from[pc] & to.node == to[pc]){ result[pc] <- TRUE break; } if(reciprocal.edges & to.node == from[pc] & from.node == to[pc]){ result[pc] <- TRUE break; } } # for ec } # for pc result }) # isAdjacent setMethod("subGraph", signature(snodes="character", graph="graphBAM"), function(snodes, graph){ origNodes <- nodes(graph) snodes <- sort(snodes) snodesIdx <- match(snodes, origNodes) if (any(is.na(snodesIdx))) { bad <- snodes[which(is.na(snodesIdx))] stop("'snodes' not in MultiGraph: ", pasteq(bad)) } nms <- names(graph@nodeData@defaults) len <- length(snodes) tmp <- makebits(len) for(i in nms){ indx <- bitToLogical(graph@userAttrPos@nodePos[[i]])[snodesIdx] graph@nodeData@data[[i]] <- .getNodeAttrVec(graph, i)[snodesIdx][indx] graph@userAttrPos@nodePos[[i]] <- setbitv(tmp, which(indx), rep(1L, length(which(indx)))) } graph@nodes <- snodes res <- .Call(graph_bitarray_subGraph, graph@edgeSet@bit_vector, snodesIdx) graph@edgeSet@bit_vector <- res$bitVec graph@edgeSet@weights <- graph@edgeSet@weights[res$setPos] nms <- names(graph@edgeSet@edge_attrs) for(i in nms) { attrBit <- graph@userAttrPos@edgePos[[i]] res <- .Call(graph_bitarray_subGraph, attrBit, snodesIdx) graph@edgeSet@edge_attrs[[i]] <- graph@edgeSet@edge_attrs[[i]][res$setPos] graph@userAttrPos@edgePos[[i]] <- res$bitVec } graph }) setMethod("edgeMatrix", "graphBAM", function(object, duplicates=FALSE) { bitvec <- object@edgeSet@bit_vector nds <- nodes(object) df <- .Call(graph_bitarray_rowColPos, bitvec) if (duplicates) df <- rbind(df, cbind(as.vector(df[, "to"]), as.vector(df[, "from"]))) t(df) }) setMethod("adjacencyMatrix", "graphBAM", function(object) { reciprocal.edges <- edgemode(object) == "undirected"; em <- edgeMatrix(object) nodes <- nodes(object) node.count <- length(nodes) mtx.adj <- matrix(0, nrow=node.count, ncol=node.count, dimnames=list(nodes, nodes)) for(col in 1:ncol(em)){ from <- em["from", col] to <- em["to", col] from.node <- nodes[from] to.node <- nodes[to] mtx.adj[from.node, to.node] <- 1; if(reciprocal.edges) mtx.adj[to.node, from.node] <- 1; } mtx.adj }) setMethod("clearNode", signature(node="character", object="graphBAM"), function(node, object) { stop("operation not supported") }) setMethod("removeNode", signature(node="character", object="graphBAM"), function(node, object) { nn <- nodes(object) if(!all(node %in% nn)) stop("'node' not all in 'object'") df <- extractFromTo(object) indx <- ! ( (as.character(df[,"from"]) %in% node) | (as.character(df[,"to"]) %in% node)) nIndx <- !(nn %in% node) bam <- graphBAM(df[indx,], nodes = nn[nIndx] , edgemode = edgemode(object)) bam@edgeSet@weights <- object@edgeSet@weights[indx] bam@edgeData@defaults <- object@edgeData@defaults bam@nodeData@defaults <- object@nodeData@defaults nms <- names(object@edgeSet@edge_attrs) snodesIdx <- which(nIndx) for(i in nms) { attrBit <- object@userAttrPos@edgePos[[i]] res <- .Call(graph_bitarray_subGraph, attrBit, snodesIdx) bam@edgeSet@edge_attrs[[i]] <- object@edgeSet@edge_attrs[[i]][res$setPos] bam@userAttrPos@edgePos[[i]] <- res$bitVec } nms <- names(object@nodeData@defaults) len <- length(snodesIdx) tmp <- makebits(len) for(i in nms){ leftPos <- which(bitToLogical(object@userAttrPos@nodePos[[i]])[snodesIdx]) rightPos <- which(bitToLogical(object@userAttrPos@nodePos[[i]]))[snodesIdx] bt <- setbitv(tmp, leftPos, rep(1L, length(leftPos))) # k <- .getNodeAttrValues(bt, indx) bam@userAttrPos@nodePos[[i]] <- bt bam@nodeData@data[[i]] <- object@nodeData@data[[i]][rightPos] } bam }) setMethod("extractFromTo", "graphBAM", function(g) { diEdgeSetToDataFrame(g@edgeSet, nodes(g)) }) setAs(from="graphBAM", to="matrix", function(from) { edgeSetToMatrix(nodes(from), from@edgeSet, isDirected(from)) }) setAs(from="graphBAM", to="graphAM", function(from) { am <- graphAM(adjMat = as(from, "matrix"), edgemode = edgemode(from), values = list(weight=1)) am }) setAs(from="graphBAM", to="graphNEL", function(from) { am <- as(from, "graphAM") as(am, "graphNEL") }) graphToBAM <- function(object) { ew <- edgeWeights(object) df_empty <- data.frame(from = character(0), to = character(0), weight = numeric(0)) df_list <- lapply(names(ew), function(x){ tmp <- ew[[x]] if ((nw <- length(tmp)) > 0) { data.frame(from = rep(x, nw), to = names(tmp), weight = as.numeric(tmp)) } else df_empty }) df <- do.call(rbind, df_list) nn <- nodes(object) bam <- graphBAM(df, nodes = nn, edgemode = edgemode(object), ignore_dup_edges = TRUE) ## FIXME: graphBAM doesn't really handle edge attributes in the same way ## we can copy data over so it can be copied back, but it won't really ## be accessible in the new graphBAM object. bam } setAs(from="graphNEL", to="graphBAM", function(from) as(as(from, "graphAM"), "graphBAM")) setAs(from="graphAM", to="graphBAM", function(from) graphToBAM(from)) setMethod("ugraph", "graphBAM", function(graph) { graph@graphData$edgemode <- "undirected" graph@renderInfo <- new("renderInfo") graph@edgeSet <- ugraph(graph@edgeSet) graph }) setMethod("addEdge", signature=c("character", "character", "graphBAM", "numeric"), function(from, to, graph, weights) { nn <- nodes(graph) req_ft <- .align_from_to(from, to, nn) req_i <- structure(match(req_ft, nn), dim = dim(req_ft)) if(nrow(req_i)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, graph@edgeSet@bit_vector, as.integer(req_i[,1]), as.integer(req_i[,2])) graph@edgeSet@bit_vector <- setBitCell(graph@edgeSet@bit_vector, req_i[,1], req_i[,2], rep(1L, nrow(req_i))) nt <- attr(graph@edgeSet@bit_vector, "nbitset") } else { nt <- attr(graph@edgeSet@bit_vector, "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } newAttr <- vector(nt, mode = "numeric") newAttr[ord$origLeftPos] <- graph@edgeSet@weights[ord$origRightPos] newAttr[ord$newLeftPos] <- weights[ord$newRightPos] graph@edgeSet@weights <- newAttr graph@edgeData@defaults <- graph@edgeData@defaults graph@edgeSet@edge_attrs <- graph@edgeSet@edge_attrs graph@userAttrPos@edgePos <- graph@userAttrPos@edgePos graph@nodeData@defaults <- graph@nodeData@defaults graph@nodeData@data <- graph@nodeData@data graph@userAttrPos@nodePos <- graph@userAttrPos@nodePos graph }) setMethod("addEdge", signature=c("character", "character", "graphBAM", "missing"), function(from, to, graph, weights) { w <- rep(1L, max(length(from), length(to))) addEdge(from, to, graph, w) }) setMethod("addNode", signature(node="character", object="graphBAM", edges="missing"), function(node, object) { nds <- sort(unique(c(nodes(object), node))) ndsLen <- length(nds) df <- extractFromTo(object) g <- graphBAM(df, nodes = nds, edgemode = edgemode(object)) nms <- names(object@nodeData@defaults) for(i in nms){ origNds <- nodes(object)[(bitToLogical(object@userAttrPos@nodePos[[i]]))] indx <- match(origNds, nodes(g)) bt <- makebits(ndsLen) bt <- setbitv(bt, indx, rep(1L, length(indx))) g@userAttrPos@nodePos[[i]] <- bt g@nodeData@data[[i]] <- object@nodeData@data[[i]] } g@nodeData@defaults <- object@nodeData@defaults g@edgeSet@edge_attrs <- object@edgeSet@edge_attrs g@edgeData@defaults <- object@edgeData@defaults nms <- names(object@userAttrPos@edgePos) for(i in nms){ ft <- .Call(graph_bitarray_rowColPos,object@userAttrPos@edgePos[[i]]) posBit <- .createZeroBitPos(ndsLen) from.nodes.new <- match(nodes(object)[ft[, 'from']], nodes(g)) to.nodes.new <- match(nodes(object)[ft[, 'to']], nodes(g)) g@userAttrPos@edgePos[[i]] <- setBitCell(posBit, from.nodes.new, to.nodes.new, rep(1L, nrow(ft))) } g }) setReplaceMethod("edgemode", c("graphBAM", "character"), function(object, value) { if (length(value) != 1L) stop("'edgemode' must be length one") if (edgemode(object) == value) return(object) switch(value, "directed" = { ## add reciprocal edges df <- extractFromTo(object) es <- rbind(df, data.frame(from=df$to, to=df$from, weight=df$weight, stringsAsFactors=FALSE)) object <- graphBAM(es, nodes = nodes(object), edgemode = value) }, "undirected" = { object <- ugraph(object) }, stop("'edgemode' must be 'directed' or 'undirected', was ", sQuote(value))) object }) .remEdge <- function(from, to, graph) { lenFrom <- length(from) lenTo <- length(to) if(lenFrom != lenTo) { if(lenFrom ==1) from <- rep(from, lenTo) else if (lenTo == 1) to <- rep(to , lenFrom) else stop("arguments 'from', 'to' differ in length") } .verifyEdges(graph, from, to) nn <- nodes(graph) req_ft <- .align_from_to(from, to, nn) req_from <- match(req_ft[,"from"], nn) req_to <- match(req_ft[,"to"], nn) nms <- names(graph@edgeSet@edge_attrs) if(!is.null(nms)) { for(i in nms){ graph@userAttrPos@edgePos[[i]] <- setBitCell(graph@userAttrPos@edgePos[[i]], req_from, req_to, rep(0L, nrow(req_ft))) if(length(req_from)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, graph@userAttrPos@edgePos[[i]], as.integer(req_from), as.integer(req_to)) } else { nt <- attr(graph@userAttrPos@edgePos[[i]], "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } graph@edgeSet@edge_attrs[[i]] <- graph@edgeSet@edge_attrs[[i]][ord$origLeftPos] } } obv0 <- graph@edgeSet@bit_vector graph@edgeSet@bit_vector <- setBitCell(graph@edgeSet@bit_vector, match(from, nn), match(to, nn), rep(0L, nrow(req_ft))) nbv0 <- graph@edgeSet@bit_vector ord <- .Call(graph_bitarray_getEdgeAttrOrder, graph@edgeSet@bit_vector , as.integer(req_from), as.integer(req_to)) graph@edgeSet@weights <- graph@edgeSet@weights[ord$origLeftPos] if(edgemode(graph) == "undirected"){ # reverse from/to obv1 <- graph@edgeSet@bit_vector graph@edgeSet@bit_vector <- setBitCell(graph@edgeSet@bit_vector, match(to, nn), match(from, nn), rep(0L, nrow(req_ft))) nbv1 <- graph@edgeSet@bit_vector ord <- .Call(graph_bitarray_getEdgeAttrOrder, graph@edgeSet@bit_vector , as.integer(req_from), as.integer(req_to)) graph@edgeSet@weights <- graph@edgeSet@weights[ord$origLeftPos] } # if undirected graph } setMethod("removeEdge", c("character", "character", "graphBAM"), function(from, to, graph) .remEdge(from, to, graph)) setMethod("removeEdgesByWeight", c("graphBAM"), function(graph, lessThan, greaterThan ){ if(missing(lessThan) && missing(greaterThan)) stop("specify 'lessThan' or 'greaterThan'") if(!missing(lessThan) && !missing(greaterThan)){ indx <- ( graph@edgeSet@weights >= lessThan & graph@edgeSet@weights <= greaterThan) } else if(missing(lessThan)){ indx <- graph@edgeSet@weights <= greaterThan }else if(missing(greaterThan)){ indx <- graph@edgeSet@weights >= lessThan } nn <- nodes(graph) bt <- .Call(graph_bitarray_removeEdges, graph@edgeSet@bit_vector, indx) tempBit <- graph@edgeSet@bit_vector & (bt) attributes(tempBit) <- attributes(graph@edgeSet@bit_vector) attr(tempBit, "nbitset") <- .Call(graph_bitarray_sum, tempBit) ft <- .Call(graph_bitarray_rowColPos, tempBit) tp <- graph@edgeSet@bit_vector & (!bt) attributes(tp) <- attributes(graph@edgeSet@bit_vector) attr(tp, "nbitset") <- .Call(graph_bitarray_sum, tp) ft2 <- .Call(graph_bitarray_rowColPos, tp) graph@edgeSet@weights <- graph@edgeSet@weights[indx] graph@edgeSet@bit_vector <- bt nms <- names(graph@userAttrPos@edgePos) if(!is.null(nms)){ for(i in nms) { graph@userAttrPos@edgePos[[i]] <- setBitCell(graph@userAttrPos@edgePos[[i]], ft2[,"from"], ft2[,"to"], rep(0L, nrow(ft2))) if(nrow(ft2)) { ord <- .Call(graph_bitarray_getEdgeAttrOrder, graph@userAttrPos@edgePos[[i]], as.integer(ft2[,"from"]), as.integer(ft2[, "to"])) } else { nt <- attr(graph@userAttrPos@edgePos[[i]], "nbitset") ord <- list(newLeftPos = integer(0), newRightPos = integer(0), origLeftPos = seq_len(nt), origRightPos = seq_len(nt)) } graph@edgeSet@edge_attrs[[i]] <- graph@edgeSet@edge_attrs[[i]][ord$origLeftPos] } } graph }) setReplaceMethod("nodes", c("graphBAM", "character"), function(object, value) { stop("operation not supported") }) .getUnionWeights <- function(attrType, g1, g2, funList) { len <- length(attrType$from) attr1 <- vector(len, mode = "numeric") attr1[seq_len(len)] <- NA ## from x k <- (as.numeric(attrType$from) ==1) attr1[k] <- g1@edgeSet@weights[attrType$indx1[k]] ## from y k <- (as.numeric(attrType$from) == 2) attr1[k] <- g2@edgeSet@weights[attrType$indx2[k]] ## resolve union k <- (as.numeric(attrType$from) ==0) if(any(k)) { val1 <- g1@edgeSet@weights[attrType$indx1[k]] val2 <- g2@edgeSet@weights[attrType$indx2[k]] if(!is.null(funList) && ("weight" %in% names(funList))) { attr1[k] <- sapply(seq_len(sum(k)), function(p) { return(funList[["weight"]](val1[[p]], val2[[p]])) }) } else if(is.vector(val1) && is.vector(val2)) { eqInd <- sapply(seq_len(length(val1)), function(x){ identical(val1[x], val2[x]) }) pt <- which(eqInd) lp <- length(which(k)) tmp <- vector(lp, mode ="numeric") tmp[seq_len(lp)] <- NA tmp[pt] <- val1[pt] attr1[k] <- tmp } } attr1 } .getNodeAttrVec <- function(g, att) { unlist(nodeData(g, attr = att), use.names = FALSE) } .getUnionAttrs <- function(att, attrType, x , y, funList ) { len <- length(attrType$from) indx <- as.numeric(attrType$from) if(att %in% names(x@edgeSet@edge_attrs)) mds <- mode(x@edgeSet@edge_attrs) else if(att %in% names(y@edgeSet@edge_attrs)) mds <- mode(y@edgeSet@edge_attrs) attr1 <- vector(len , mode = mds) attr1[seq_len(len)] <- NA ## from x k <- (as.numeric(attrType$from) ==1) if(att %in% names(x@edgeSet@edge_attrs)) { xAttr <- .retAttrVec(x, att) attr1[k] <- xAttr[ attrType$indx1[k]] } ## from y k <- (as.numeric(attrType$from) == 2) if(att %in% names(y@edgeSet@edge_attrs)) { yAttr <- .retAttrVec(y, att) attr1[k] <- yAttr[ attrType$indx2[k]] } ## resolve union k <- (as.numeric(attrType$from) ==0) if(any(k)) { if(att %in% names(x@edgeSet@edge_attrs)) val1 <- xAttr[ attrType$indx1[k]] else val1 <- yAttr[ attrType$indx2[k]] if(att %in% names(y@edgeSet@edge_attrs)) val2 <- yAttr[ attrType$indx2[k]] else val2 <- xAttr[ attrType$indx1[k]] if(!is.null(funList) && (att %in% names(funList))) { attr1[k] <- sapply(seq_len(sum(k)), function(p) { return(funList[[att]](val1[[p]], val2[[p]])) }) } else if (is.vector(val1) && is.vector(val2)) { eqInd <- sapply(seq_len(length(val1)), function(x){ identical(val1[x], val2[x]) }) pt <- which(eqInd) lp <- sum(k) tmp <- vector(lp, mode = mds) tmp[seq_len(lp)] <- NA tmp[pt] <- val1[pt] attr1[k] <- tmp } } attr1 } .getEdgeIntersect <- function(e1, e2) { dr1 <- isDirected(e1) dr2 <- isDirected(e1) if(dr1 != dr2) stop("edges should both be directed or undirected") theMode <- if (dr1 && dr2) "directed" else "undirected" e1Attr <- names(e1@edge_attrs) e2Attr <- names(e2@edge_attrs) commonAttr <- intersect(e1Attr, e2Attr) bv <- e1@bit_vector & e2@bit_vector attributes(bv) <- attributes(e1@bit_vector) attr(bv, "nbitset") <- ns <- .Call(graph_bitarray_sum, bv) c0 <- character(0) df <- data.frame(from = c0, to = c0, weight = numeric(0), stringsAsFactors = FALSE) edge_set <- .makeMDEdgeSet(es_name = 1, es = df, is_directed = (theMode == "directed"), nodes = c0, ignore_dup_edges = FALSE) edge_set@bit_vector <- bv edge_set } .getBAMIntersect <- function(g1, g2, edge_set, funList) { nn <- intersect(nodes(g1), nodes(g2)) ans <- new("graphBAM", edgeSet= edge_set, nodes =nn) e1Attr <- names(g1@edgeSet@edge_attrs) e2Attr <- names(g2@edgeSet@edge_attrs) commonAttr <- intersect(e1Attr, e2Attr) attrType <- .Call(graph_bitarray_Intersect_Attrs, edge_set@bit_vector, g1@edgeSet@bit_vector, g2@edgeSet@bit_vector) if(!is.null(funList)) { fIndx <- names(funList) %in% c(commonAttr, "weight") if(!all(fIndx)) stop("attributes in 'funList' not in edge attributes: ", pasteq(names(funList)[fIndx])) } if(length(attrType$from) >0) { edge_set@weights <- .getIntersectAttrs("weight", attrType, g1@edgeSet@weights, g2@edgeSet@weights, funList) } for(i in commonAttr) { ans@userAttrPos@edgePos[[i]] <- edge_set@bit_vector xAttr <- .retAttrVec(g1, i) yAttr <- .retAttrVec(g2, i) if(length(attrType$from) >0) { edge_set@edge_attrs[[i]] <- .getIntersectAttrs(i, attrType, xAttr, yAttr, funList) } } ans@edgeSet <- edge_set ans } .bamIntersect <- function(g1, g2, funList) { e1 <- g1@edgeSet e2 <- g2@edgeSet dr1 <- isDirected(e1) dr2 <- isDirected(e1) if(dr1 != dr2) stop("edges should both be directed or undirected") theMode <- if (dr1 && dr2) "directed" else "undirected" e1Attr <- names(e1@edge_attrs) e2Attr <- names(e2@edge_attrs) commonAttr <- intersect(e1Attr, e2Attr) if(!is.null(funList)) { fIndx <- names(funList) %in% c(commonAttr, "weight") if(!all(fIndx)) stop("attributes in 'funList' not in edge attributes: ", pasteq(names(funList)[fIndx])) } bv <- e1@bit_vector & e2@bit_vector attributes(bv) <- attributes(e1@bit_vector) attr(bv, "nbitset") <- ns <- .Call(graph_bitarray_sum, bv) c0 <- character(0) df <- data.frame(from = c0, to = c0, weight = numeric(0), stringsAsFactors = FALSE) edge_set <- .makeMDEdgeSet(es_name = 1, es = df, is_directed = (theMode == "directed"), nodes = c0, ignore_dup_edges = FALSE) edge_set@bit_vector <- bv nn <- intersect(nodes(g1), nodes(g2)) ans <- new("graphBAM", edgeSet= edge_set, nodes =nn) attrType <- .Call(graph_bitarray_Intersect_Attrs, edge_set@bit_vector, e1@bit_vector, e2@bit_vector) if(length(attrType$from) >0) { edge_set@weights <- .getIntersectAttrs("weight", attrType, e1@weights, e2@weights, funList) } for(i in commonAttr) { ans@userAttrPos@edgePos[[i]] <- edge_set@bit_vector xAttr <- .retAttrVec(g1, i) yAttr <- .retAttrVec(g2, i) if(length(attrType$from) >0) { edge_set@edge_attrs[[i]] <- .getIntersectAttrs(i, attrType, xAttr, yAttr, funList) } } ans@edgeSet <- edge_set ans } .getUnionNodeUserAttrPos <- function(g, sg1, sg2) { cmnAttrs <- intersect(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults)) unqAttrs <- unique(c(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults))) singleAttrs <- unqAttrs[!( unqAttrs %in% cmnAttrs)] n1 <- structure(lapply(cmnAttrs, function(i){ len <- length(g@nodeData@data[[i]]) bt <- makebits(len) bt <- setbitv(bt, seq_len(len), rep(1L, len)) }),names = cmnAttrs) n2 <- structure(lapply(singleAttrs, function(i){ if(i %in% names(sg1@userAttrPos@nodePos)) return(sg1@userAttrPos@nodePos[[i]]) else if(i %in% names(sg2@userAttrPos@nodePos)) return(sg2@userAttrPos@nodePos[[i]]) }), names= singleAttrs) c(n1, n2) } .getIntNodeUserAttrPos <- function(sg1 , sg2) { nattr <- intersect(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults)) structure(lapply(nattr, function(i) { bv <- sg1@userAttrPos@nodePos[[i]] & sg2@userAttrPos@nodePos[[i]] attributes(bv) <- attributes(sg1@userAttrPos@nodePos[[i]]) attr(bv, "nbitset") <- ns <- .Call(graph_bitarray_sum, bv) bv }), names = nattr) } .getIntersectAttrs <- function(att, attrType, xAtt , yAtt, funList ) { len <- length(attrType$from) from1 <- attrType$indx1 from2 <- attrType$indx2 k <- (as.numeric(attrType$from) ==0) attr1 <- vector(sum(k), mode =mode(xAtt)) attr1[seq_len(sum(k))] <- NA val1 <- xAtt[attrType$indx1[k]] val2 <- yAtt[attrType$indx2[k]] if(!is.null(funList) && (att %in% names(funList))) { attr1[k] <- sapply(seq_len(sum(k)), function(p) { return(funList[[att]](val1[[p]], val2[[p]])) }) } else if (is.vector(val1) && is.vector(val2)) { eqInd <- sapply(seq_len(length(val1)), function(x){ identical(val1[x], val2[x]) }) pt <- which(eqInd) attr1[pt] <- val1[pt] } attr1 } setMethod("graphIntersect", c("graphBAM", "graphBAM"), function(x, y, nodeFun, edgeFun, ...){ nn <- intersect(nodes(x), nodes(y)) nnLen <- length(nn) if(nnLen ==0) { dr1 <- isDirected(x) dr2 <- isDirected(y) if(dr1 != dr2) stop("'x' and 'y' should both be directed or undirected") theMode <- if (dr1) "directed" else "undirected" c0 <- character(0) df <- data.frame(from = c0, to = c0, weight = numeric(0), stringsAsFactors = FALSE) ans <- graphBAM(df, edgemode = theMode) return(ans) } sg1 <- if (nnLen == numNodes(x)) x else subGraph(nn, x) sg2 <- if (nnLen == numNodes(y)) y else subGraph(nn, y) if(missing(nodeFun)) nodeFun <- NULL if(missing(edgeFun)) edgeFun <- NULL edge_set <- .getEdgeIntersect(sg1@edgeSet, sg2@edgeSet) ans <- .getBAMIntersect(sg1, sg2, edge_set, edgeFun) ans@edgeData@defaults <- .retEdgeIntersectDefaults(sg1@edgeData@defaults, sg2@edgeData@defaults) ans@nodeData@defaults <- .retNodeIntersectDefaults(sg1, sg2) ans@userAttrPos@nodePos <- .getIntNodeUserAttrPos(sg1, sg2) ans@nodeData@data <- .nodeIntersect(sg1, sg2, ans, nodeFun) ans }) .getIntersectEdgeUserAttrPos <- function(edge_set) { nms <- names(edge_set@edge_attrs) structure(lapply(nms, function(){ edge_set@bit_vector }), names = nms) } .retNodeUnionDefaults <- function(sg1, sg2) { cmnAttrs <- intersect(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults)) unqAttrs <- unique(c(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults))) singleAttrs <- unqAttrs[!( unqAttrs %in% cmnAttrs)] cmn <- structure(lapply(cmnAttrs, function(x) { if(identical(sg1@nodeData@defaults[[x]], sg2@nodeData@defaults[[x]])) sg1@nodeData@defaults[[x]] else NA }), names = cmnAttrs) sng <- structure(lapply(singleAttrs, function(x) { if(x %in% names(sg1@nodeData@defaults)) sg1@nodeData@defaults[[x]] else sg2@nodeData@defaults[[x]] }), names = singleAttrs) c(cmn, sng) } .retNodeIntersectDefaults <- function(sg1, sg2) { cmnAttrs <- intersect(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults)) structure(lapply(cmnAttrs, function(x) { if(identical(sg1@nodeData@defaults[[x]], sg2@nodeData@defaults[[x]])) sg1@nodeData@defaults[[x]] else NA }), names = cmnAttrs) } .retEdgeIntersectDefaults <- function(d1, d2) { cmnAttrs <- intersect(names(d1), names(d2)) structure(lapply(cmnAttrs, function(x) { if(identical(d1[[x]], d2[[x]])) d1[[x]] else NA }), names = cmnAttrs) } .retEdgeUnionDefaults <- function(sg1, sg2) { cmnAttrs <- intersect(names(sg1@edgeData@defaults), names(sg2@edgeData@defaults)) unqAttrs <- unique(c(names(sg1@edgeData@defaults), names(sg2@edgeData@defaults))) singleAttrs <- unqAttrs[!( unqAttrs %in% cmnAttrs)] cmn <- structure(lapply(cmnAttrs, function(x) { if(identical(sg1@edgeData@defaults[[x]], sg2@edgeData@defaults[[x]])) sg1@edgeData@defaults[[x]] else NA }), names = cmnAttrs) sng <- structure(lapply(singleAttrs, function(x) { if(x %in% names(sg1@edgeData@defaults)) sg1@edgeData@defaults[[x]] else sg2@edgeData@defaults[[x]] }), names = singleAttrs) c(cmn, sng) } .nodeIntersect <- function(sg1, sg2, ans, funList){ cmn <- intersect(names(sg1@nodeData@defaults), names(sg2@nodeData@defaults)) nattr <- structure(lapply(cmn, function(x) { attr1 <- .getNodeAttrVec(sg1, x) attr2 <- .getNodeAttrVec(sg2, x) len <- length(attr1) if(!is.null(funList) && (x %in% names(funList))) { res <- sapply(seq_len(len), function(p) { return(funList[[x]](attr1[[p]], attr2[[p]])) }) } else if (is.vector(attr1) && is.vector(attr2)) { indx <- which(sapply(seq_len(len), function(p){ identical(attr1[p], attr2[p]) })) res <- rep(NA, len) res[indx] <- attr1[indx] } res res[bitToLogical(ans@userAttrPos@nodePos[[x]])] }), names = cmn) nattr } .scaleGraphBAM <- function(g, theNodes, edgemode) { if(all(nodes(g) %in% theNodes) && length(nodes(g)) == length(theNodes)) return(g) else { ndsLen <- length(theNodes) df <- extractFromTo(g) bam <- graphBAM(df, nodes = theNodes, edgemode= edgemode, ignore_dup_edges = FALSE) bam@edgeSet@weights <- g@edgeSet@weights bam@edgeSet@edge_attrs <- g@edgeSet@edge_attrs bam@edgeData@defaults <- g@edgeData@defaults nms <- names(g@nodeData@defaults) for(i in nms){ origNds <- nodes(g)[(bitToLogical(g@userAttrPos@nodePos[[i]]))] indx <- match(origNds, theNodes) bt <- makebits(ndsLen) bt <- setbitv(bt, indx, rep(1L, length(indx))) bam@userAttrPos@nodePos[[i]] <- bt bam@nodeData@data[[i]] <- g@nodeData@data[[i]] } bam@nodeData@defaults <- g@nodeData@defaults nms <- names(g@userAttrPos@edgePos) for(i in nms) { ft <- .Call(graph_bitarray_rowColPos, g@userAttrPos@edgePos[[i]]) posBit <- .createZeroBitPos(ndsLen) bam@userAttrPos@edgePos[[i]] <- setBitCell(posBit, ft[,"from"], ft[,"to"], rep(1L, nrow(ft))) } return(bam) } } .bamUnion <- function(g1, g2, theNodes, nodeFun, edgeFun) { dr1 <- isDirected(g1) dr2 <- isDirected(g2) if(dr1 != dr2) stop("edges should both be directed or undirected") theMode <- if (dr1 && dr2) "directed" else "undirected" e1Attr <- names(g1@edgeSet@edge_attrs) e2Attr <- names(g2@edgeSet@edge_attrs) unionAttr <- unique(union(e1Attr, e2Attr)) if(!is.null(edgeFun)) { fIndx <- names(edgeFun) %in% c(unionAttr, "weight") if(!all(fIndx)) stop("attributes in 'edgeFun' not in edge attributes: ", pasteq(names(edgeFun)[fIndx])) } bam1 <- .scaleGraphBAM(g1, theNodes, theMode) bam2 <- .scaleGraphBAM(g2, theNodes, theMode) bv <- bam1@edgeSet@bit_vector | bam2@edgeSet@bit_vector attributes(bv) <- attributes(bam1@edgeSet@bit_vector) attr(bv, "nbitset") <- ns <- .Call(graph_bitarray_sum, bv) c0 <- character(0) df <- data.frame(from = c0, to = c0, weight = numeric(0)) edge_set <- .makeMDEdgeSet(es_name = 1, es =df, is_directed = (theMode == "directed"), nodes = theNodes, ignore_dup_edges = FALSE) edge_set@bit_vector <- bv ans <- new("graphBAM", edgeSet= edge_set, nodes =theNodes) cmnBit <- bam1@edgeSet@bit_vector & bam2@edgeSet@bit_vector attributes(cmnBit) <- attributes(bam1@edgeSet@bit_vector) attr(cmnBit, "nbitset") <- .Call(graph_bitarray_sum, cmnBit) fromOneBit <- bam1@edgeSet@bit_vector & (!cmnBit) attributes(fromOneBit) <- attributes(bam1@edgeSet@bit_vector) attr(fromOneBit, "nbitset") <- .Call(graph_bitarray_sum, fromOneBit) fromTwoBit <- bam2@edgeSet@bit_vector & (!cmnBit) attributes(fromTwoBit) <- attributes(bam2@edgeSet@bit_vector) attr(fromTwoBit, "nbitset") <- .Call(graph_bitarray_sum, fromTwoBit) attrType <- .Call(graph_bitarray_Union_Attrs, bv, cmnBit, fromOneBit, fromTwoBit) if(length(attrType$from) >0) { edge_set@weights <- as.numeric(.getUnionWeights(attrType, bam1, bam2, edgeFun)) } if(!is.null(unionAttr)) { for(i in unionAttr) { ans@userAttrPos@edgePos[[i]] <- edge_set@bit_vector edge_set@edge_attrs[[i]] <- .getUnionAttrs(i, attrType, bam1, bam2, edgeFun) } } ans@edgeSet <- edge_set ans@nodeData@data <- .nodeUnion(g1, g2, nodeFun) ans@userAttrPos@nodePos <- .getUnionNodeUserAttrPos(ans,bam1, bam2) ans } setMethod("graphUnion", c("graphBAM", "graphBAM"), function(x, y, nodeFun, edgeFun, ...) { theNodes <- unique(c(nodes(x), nodes(y))) nnLen <- length(theNodes) if(nnLen ==0) { dr1 <- isDirected(x) dr2 <- isDirected(y) if(dr1 != dr2) stop("'x' and 'y' should both be directed or undirected") theMode <- if (dr1) "directed" else "undirected" c0 <- character(0) df <- data.frame(from = c0, to = c0, weight = numeric(0), stringsAsFactors = FALSE) ans <- graphBAM(df, edgemode = theMode) return(ans) } if(missing(nodeFun)) nodeFun <- NULL if(missing(edgeFun)) edgeFun <- NULL ans <- .bamUnion(x, y, theNodes, nodeFun, edgeFun) ans@nodeData@defaults <- .retNodeUnionDefaults(x, y) ans@edgeData@defaults <- .retEdgeUnionDefaults(x, y) ans }) .nodeUnion <- function(g1, g2, funList) { xAttr <- names(g1@nodeData@defaults) yAttr <- names(g2@nodeData@defaults) if(!is.null(funList)) { fIndx <- names(funList) %in% c(xAttr, yAttr) if(!all(fIndx)) stop("attributes in 'nodeFun' not in node attributes: ", pasteq(names(funList)[fIndx])) } ndX <- nodes(g1) ndY <- nodes(g2) ndAns <- unique(c(ndX, ndY)) unionAttrs <- union(xAttr, yAttr) commonAttrs <- intersect(xAttr,yAttr) singleAttrs <- unionAttrs[!unionAttrs %in% commonAttrs] cmnNds <- intersect(ndX, ndY) fxNds <- ndX[!ndX %in% cmnNds] fyNds <- ndY[!ndY %in% cmnNds] ### deal with single attrs n1 <- sapply(singleAttrs, function(k){ if(k %in% xAttr){ att <- .getNodeAttrVec(g1, k) } else if(k %in% yAttr){ att <- .getNodeAttrVec(g2, k) } list(att) }) n2 <- sapply(commonAttrs, function(k) { att <- rep(NA, length(ndAns)) ##from X indx <- match(fxNds, ndAns) attr1 <- .getNodeAttrVec(g1, k) attr2 <- .getNodeAttrVec(g2, k) att[indx] <- attr1[match(fxNds,ndX)] ##from Y indx <- match(fyNds, ndAns) att[indx] <- attr2[match(fyNds,ndY)] if(!is.null(funList) && (k %in% names(funList))) { tmp <- sapply(cmnNds, function(p){ dX <- match(p, ndX) dY <- match(p, ndY) funList[[k]](attr1[[dX]], attr2[[dY]]) }, USE.NAMES = FALSE) indx <- match(cmnNds, ndAns) att[indx] <- tmp } else if (is.vector(attr1) && is.vector(attr2)){ tmp <- sapply(cmnNds, function(p){ dX <- match(p, ndX) dY <- match(p, ndY) identical(attr1[[dX]], attr2[[dY]]) }, USE.NAMES = FALSE) indx <- match(cmnNds[tmp], ndAns) att[indx] <- attr1[match(cmnNds[tmp], ndX)] } list(att) }) c(n1,n2) } setMethod("nodeDataDefaults", signature(self="graphBAM", attr="missing"), function(self, attr){ attrDefaults(self@nodeData) }) setMethod("nodeDataDefaults", signature(self="graphBAM", attr="character"), function(self, attr){ attrDefaults(self@nodeData, attr) }) setReplaceMethod("nodeDataDefaults", signature(self="graphBAM", attr="missing", value="list"), function(self, attr, value) { attrDefaults(self@nodeData) <- value nmsNds <- names(self@nodeData@defaults) nmsAttr <- names(self@userAttrPos@nodePos) ndsLbls <- nmsNds[ !(nmsNds %in% nmsAttr)] if(length(ndsLbls)) { ndsLen <- length(nodes(self)) bt <- makebits(ndsLen) } for(i in ndsLbls) { self@userAttrPos@nodePos[[i]] <- bt } self }) setReplaceMethod("nodeDataDefaults", signature(self="graphBAM", attr="character", value="ANY"), function(self, attr, value) { attrDefaults(self@nodeData, attr) <- value ndsLen <- length(nodes(self)) if(! (attr %in% names(self@userAttrPos@nodePos))){ bt <- makebits(ndsLen) self@userAttrPos@nodePos[[attr]] <- bt } self }) ## Node data replacement methods .getNodeAttrOrder <- function(x, indx) { len <- attr(x, "bitlen") nset <- attr(x, "nbitset") if (is.null(len)) len <- length(x) * 8L k <- p <- 1 setIndx = 1 attrIndx = 1 k2<- k3 <- k1 <- 1 nval = vector(length(indx), mode ="integer") npos <- nval fpos = vector(max(c(nset, length(indx))), mode ="integer") fval = vector(max(c(nset, length(indx))), mode ="integer") mm <- length(indx) for( i in seq_len(len)) { bt <- testbit(x, i) intIndx <- indx[attrIndx] if(bt) { if(intIndx == i) { nval[k2] = attrIndx npos[k2] = k3 k2 <- k2 + 1 k3 <- k3 + 1 if(attrIndx < mm) attrIndx = attrIndx +1 } if(intIndx != i){ fpos[k1] <- setIndx fval[k1] <- k1 k1 <- k1+1 k3 <- k3+ 1 } setIndx <- setIndx +1 } } length(fpos) <- k1-1 length(fval) <- k1-1 attributes(fval) <- list("origPos" = fpos) attributes(nval) <- list("newPos" = npos) list( origVal = fval, newVal = nval) } setReplaceMethod("nodeData", signature(self = "graphBAM", n="character", attr="character", value="ANY"), function(self, n, attr, value) { .nodeDataReplaceNodeGiven(self, n ,attr, value) }) setReplaceMethod("nodeData", signature(self = "graphBAM", n="missing", attr="character", value="ANY"), function(self, n, attr, value) { .nodeDataReplaceNodeMissing(self, attr, value) }) .getNodeAttrPos <- function(x, indx) { bt <- bitToLogical(x) leftPos <- which(bt[indx]) cs <- cumsum(bt) k <- indx[bt[indx]] rightPos <- cs[k ] list(leftPos= leftPos, rightPos = rightPos) } ## Node data accces methods setMethod("nodeData", signature(self = "graphBAM", n = "character", attr = "character"), function(self, n, attr) { .nodeDataRetrieve(self, n, attr) }) setMethod("nodeData", signature(self = "graphBAM", n = "missing", attr = "character"), function(self, n, attr) { if(length(attr) != 1L) stop("'attr' must specify a single attribute name") nds <- nodes(self) nodeData(self, n= nds, attr= attr) }) setMethod("nodeData", signature(self = "graphBAM", n = "character", attr = "missing"), function(self, n, attr) { nds <- nodes(self) .verifyNodes(n ,nds) nms <- names(self@nodeData@defaults) structure(lapply(nms, function(x) { nodeData(self, n, x) }), names = nms) }) setMethod("nodeData", signature(self = "graphBAM", n = "missing", attr = "missing"), function(self, n, attr) { nds <- nodes(self) nms <- names(self@nodeData@defaults) structure(lapply(nms, function(x) { nodeData(self, nds, x) }), names = nms) }) graph/R/methods-multiGraph.R0000644000175100017510000001031112607264574017005 0ustar00biocbuildbiocbuild##some methods for the multigraph class setMethod("show", signature("multiGraph"), function(object) { numNodes<- numNodes(object) cat("A", class(object), "with \n") cat("Number of nodes =", numNodes, "\n") cat("Number of edge lists =", length(object@edgeL), "\n") }) setMethod("isDirected", "multiGraph", function(object) sapply(object@edgeL, isDirected)) setMethod("nodes", signature(object="multiGraph"), function(object) object@nodes) setMethod("numNodes", signature(object="multiGraph"), function(object) length(nodes(object))) setMethod("edges", signature("multiGraph", "missing"), function(object) { nV = nodes(object) lapply(object@edgeL, function(x) edges(x, nV, nV)) }) setMethod("edges", signature("multiGraph", "character"), function(object, which) { nV = nodes(object) lapply(object@edgeL, function(x) edges(x, which, nV)) }) setMethod("numEdges", signature(object="MGEdgeSet"), function(object) { attr(object@bit_vector, "nbitset") }) setMethod("numEdges", signature(object="multiGraph"), function(object) { sapply(object@edge_sets, numEdges) }) # #numEHelper = function(gEdges, directed) { # if (length(gEdges) == 0) # return(length(gEdges)) # numEdges <- length(unlist(gEdges, use.names=FALSE)) # if (directed) { # numSelfLoops <- sum(mapply(function(e, n) sum(n == e), # gEdges, names(gEdges))) # numEdges <- numSelfLoops + (numEdges - numSelfLoops) / 2 # } # numEdges #} # #setMethod("numEdges", signature(object="multiGraph"), # function(object) { # gEdges <- edges(object) # dir <- isDirected(object) # ans <- rep(NA, length(dir)) # for(i in 1:length(dir)) # ans[i] = numEHelper(gEdges[[i]], dir[i]) # ans # }) # ##we need a validity checking method: ensure that nodes are the same ##in all edgeSets - which is hard as the edgeSets don't always seem to ##know #####edgeSet methods here ##this is a bit dangerous as these are not really the nodes of the ##graph - we don't enforce having all nodes in the adj matrix setMethod("isDirected", "edgeSet", function(object) edgemode(object) == "directed") setMethod("edgemode", "edgeSet", function(object) edgemode(object)) setMethod("show", signature("edgeSet"), function(object) { numEdge<-numEdges(object) cat("A", class(object), "with", edgemode(object), "edges\n") cat("Number of Edges =", numEdge, "\n") }) ###edgeSetAM methods setMethod("nodes", signature(object="edgeSetAM"), function(object) rownames(object@adjMat)) #setMethod("edges", signature("edgeSetAM", "missing"), # function(object) { # getEdgeList(object@adjMat, nodes(object)) # }) setMethod("edges", signature("edgeSetAM", "character"), function(object, which, nodes) { stopifnot( is.character(nodes) ) idx <- base::which(colnames(object@adjMat) %in% which) getEdgeList(object@adjMat[idx, ], nodes[idx]) }) setMethod("numEdges", signature(object="edgeSetAM"), function(object) { nE <- sum(object@adjMat != 0) if (!isDirected(object)) { selfLoops <- sum(diag(object@adjMat) != 0) nE <- selfLoops + (nE - selfLoops)/2 } nE }) ##edgeSetNEL methods here ##and here we are a bit scuppered by the way we represent the edge ##lists - we need to have the node set around #setMethod("edges", c("edgeSetNEL", "missing"), function(object, which) { # gNodes <- object@nodes # lapply(object@edgeL, function(x) gNodes[x$edges])}) setMethod("edges", signature("edgeSetNEL", "character"), function(object, which, nodes) { stopifnot( is.character(nodes) ) lapply(object@edgeL[which], function(x) nodes[x$edges])}) graph/R/nodes-methods.R0000644000175100017510000000607512607264574016015 0ustar00biocbuildbiocbuild### helpers .node_rename_check <- function(g, new_nodes) { checkValidNodeName(new_nodes) if (length(new_nodes) != numNodes(g)) stop("need as many names as there are nodes", call.=FALSE) if (any(duplicated(new_nodes))) stop("node names must be unique", call.=FALSE) } .rename_node_attributes <- function(g, new_nodes) { ## FIXME: should be done in place? ## FIXME: we are doing the verification twice :-( old <- nodes(g) idx <- match(names(g@nodeData), old, 0) names(g@nodeData) <- new_nodes[idx] g } .get_edgeData_indicies <- function(g) { ee <- .getAllEdges(g) if (length(ee$from) && length(ee$to)) { kk <- .makeEdgeKeys(ee$from, ee$to) match(names(g@edgeData), kk) } else { integer(0) } } .rename_edge_attributes <- function(g, whEdges) { ee <- .getAllEdges(g) if (length(ee$from) && length(ee$to)) { kk <- .makeEdgeKeys(ee$from, ee$to) names(g@edgeData) <- kk[whEdges] } g } ### graph ## A template method for node<- on graph objects ## ## Subclasses should define a renameNodes method only. ## This way, validation of node names and handling ## of node and edge attributes can be shared. ## setReplaceMethod("nodes", c("graph", "character"), function(object, value) { .node_rename_check(object, value) whEdges <- .get_edgeData_indicies(object) object <- .rename_node_attributes(object, value) ## the template method for different ## graph representations object <- renameNodes(object, value) ## if (length(whEdges)) .rename_edge_attributes(object, whEdges) else object }) ### graphNEL setMethod("nodes", "graphNEL", function(object) object@nodes) setMethod("renameNodes", "graphNEL", function(g, value) { g@nodes <- value names(g@edgeL) <- value g }) ### graphAM setMethod("nodes", signature("graphAM"), function(object) { if (!is.null(nn <- colnames(object@adjMat))) nn else # empty graph character(0) }) setMethod("renameNodes", "graphAM", function(g, value) { colnames(g@adjMat) <- value g }) ### graphBAM setMethod("nodes", signature("graphBAM"), function(object) { object@nodes }) setMethod("renameNodes", "graphBAM", function(g, value) { colnames(g@nodes) <- value g }) ### clusterGraph setMethod("nodes", "clusterGraph", function(object) as.character(unlist(object@clusters))) setMethod("renameNodes", "clusterGraph", function(g, value) { clens = sapply(g@clusters, length) nc = length(clens) ni = rep(seq_len(nc), clens) newc = split(value, ni) names(newc) = names(g@clusters) g@clusters = newc g }) ### distGraph setMethod("nodes", "distGraph", function(object) attr(object@Dist, "Labels" )) graph/R/random.R0000644000175100017510000000636412607264574014525 0ustar00biocbuildbiocbuild##Copyright R. Gentleman, 2002, all rights reserved ##code for generating random graphs ##two different methods of generating random graphs on a given set of ##nodes ##M1: randomly generate edges from the choose(|V|, 2) possible edges ##M2: given V and a set of shared attributes M, select for each node ## of V a subset of M. Then compute edges according to whether ## nodes share common elements of M ##M2: sample "properties" from M with prob p randomGraph <- function(V, M, p, weights = TRUE) { if( any(duplicated(V)) ) stop("node names must be unique") V = as.character(V) lenM <- length(M) lenV <- length(V) nSel <- lapply(V, function(x) M[sample(c(TRUE,FALSE), lenM, TRUE, prob=c(p, 1-p))]) lens <- sapply(nSel, length) objs <- unlist(nSel) wh <- rep(seq_len(lenV), lens) rval <- rep(list(list(edges=numeric(0))), lenV) names(rval) <- V tmp <- split(wh, objs) for( vec in tmp ) for(i in vec) for(j in vec) if( i != j ) { pos <- match(j, rval[[i]]$edges) if(is.na(pos) ) { rval[[i]]$edges <- c(rval[[i]]$edges, j) if (weights) { ln <-length(rval[[i]]$edges) rval[[i]]$weights <- c(rval[[i]]$weights, 1) names(rval[[i]]$weights)[ln] <- j } } else if (weights) rval[[i]]$weights[[pos]] <- rval[[i]]$weights[[pos]]+1 } graphNEL(nodes = V, edgeL=rval) } ## gg<-randomGraph(letters[1:10], 1:4, .3) ## Random Edge Graph randomEGraph <- function(V, p, edges) { nNodes <- length(V) nEdges <- nNodes*(nNodes-1)/2 if( any(duplicated(V)) ) stop("elements of 'V' must be unique") if( !xor(missing(p), missing(edges)) ) stop("specify either 'edges' or 'p'") if( !missing(p) && (!is.numeric(p) || length(p)!=1 || 0>p || p>1 )) stop("for 'p', specify a number between 0 and 1") if( !missing(edges) && (length(edges) != 1 || edges < 0 || edges > nEdges)) stop("for 'edges', specify a number between 0 and ", nEdges) ## sample the edges if(!missing(p)) { i <- which(runif(nEdges) <= p) } else { i <- sample(nEdges, replace=FALSE, size=edges) } ## convert to from-to matrix ft <- int2ftM(i) ## replace integers by node names ft <- cbind(V[ft[,1]], V[ft[,2]]) return(ftM2graphNEL(ft, V=V, edgemode="undirected")) } randomNodeGraph <- function(nodeDegree) { if( any(nodeDegree < 0 ) ) stop("only positive degrees allowed") numEdge <- sum(nodeDegree) if( numEdge %% 2 != 0 ) stop("sum of degrees must be even") wh <- sample(numEdge) Nodes <- rep(names(nodeDegree), nodeDegree) if( is.null(Nodes) ) stop("nodes must be named") from <- Nodes[wh[seq_len(numEdge/2)]] to <- Nodes[wh[(1+numEdge/2):numEdge]] edL <- split(to, from) eN <- names(nodeDegree) outL <- lapply(edL, function(x) list(edges=match(x, eN), weights=rep(1, length(x)))) oL <- rep(list(list(numeric(0))), length(eN)) names(oL) <- eN oL[names(outL)] <- outL g <- graphNEL(nodes=names(oL), edgeL=oL, edgemode="directed") g } graph/R/reverseEdgeDirections.R0000644000175100017510000000047212607264574017523 0ustar00biocbuildbiocbuildreverseEdgeDirections <- function(g) { ## FIXME: This needs to fix edge attributes, but for now, we punt ## and we are only using node attrs here anyhow... gam <- as(g, "graphAM") nodeNames <- nodes(g) gam@adjMat <- t(gam@adjMat) colnames(gam@adjMat) <- nodeNames as(gam, "graphNEL") } graph/R/settings.R0000644000175100017510000001542212607264574015100 0ustar00biocbuildbiocbuild## change or return the current defaults for a graph's rendering information graph.par <- function(...) { new <- list(...) if (is.null(names(new)) && length(new) == 1 && is.list(new[[1]])) new <- new[[1]] old <- .GraphEnv$par ## if no args supplied, returns full par list if (length(new) == 0) return(old) ## typically getting par nm <- names(new) if (is.null(nm)) return(old[unlist(new)]) ## setting at least one par, but may get some as well (unlikely in practice) isNamed <- nm != "" if (any(!isNamed)) nm[!isNamed] <- unlist(new[!isNamed]) ## so now everything has non-"" names, but only the isNamed ones ## should be set. Everything should be returned though. retVal <- old[nm] names(retVal) <- nm nm <- nm[isNamed] .GraphEnv$par <- modifyList(old, new[nm]) invisible(retVal) } ## get a particular graph rendering parameter set. Valid sets are "nodes", ## "edges" and "graph" graph.par.get <- function(name) .GraphEnv$par[[name]] ## need NULL or empty string for everything that should not be set to ## allow for resetting (like labels and title) .default.graph.pars <- function() list(nodes = list(col = "black", fill = "transparent", textCol = "black", fontsize=14, lty = 1, lwd = 1, label=NULL, fixedsize=FALSE, shape="circle", iwidth=0.75, iheight=0.5), edges = list(col = "black", lty = 1, lwd = 1, textCol = "black", cex = 1, fontsize=14), graph = list(laidout=FALSE, recipEdges="combined", main="", sub="", cex.main=1.2, cex.sub=1, label=NULL, col.main="black", col.sub="black")) ## create a renderInfo object .renderInfoPrototype <- new("renderInfo") ## FIXME: make these generic? ## return node-specific rendering parameters nodeRenderInfo <- function(g, name) { if(missing(name)) g@renderInfo@nodes else{ tmp <- g@renderInfo@nodes[name] if(length(tmp)==1) tmp <- tmp[[1]] tmp } } ## return edge-specific rendering parameters edgeRenderInfo <- function(g, name) { if(missing(name)) g@renderInfo@edges else{ tmp <- g@renderInfo@edges[name] if(length(tmp)==1) tmp <- tmp[[1]] tmp } } ## return graph-specific rendering parameters graphRenderInfo <- function(g, name) { if(missing(name)) g@renderInfo@graph else{ tmp <- g@renderInfo@graph[name] if(length(tmp)==1) tmp <- tmp[[1]] tmp } } ## return content of the pars slot parRenderInfo <- function(g, name) { if(missing(name)) g@renderInfo@pars else g@renderInfo@pars[[name]] } ## changes renderInfo settings of a graph g setRenderInfo <- function(g, what, value, validNames, n = length(validNames)) { ## FIXME: what's supposed to happen if graph is not already laid out? if (!is.list(value) || is.null(names(value)) || any(!nzchar(names(value)))) stop("'value' must be a list of named parameters") for (i in names(value)) { thisVal <- value[[i]] if (is.null(slot(g@renderInfo, what)[[i]])) { ## i doesn't exist. Need to create appropriate placeholder m <- if(is.null(thisVal)) "character" else mode(thisVal) slot(g@renderInfo, what)[[i]] <- vector(mode=m, length = n) ## initialize to NA (seems to work for lists too, but may ## need methods for non-trivial objects) is.na(slot(g@renderInfo, what)[[i]]) <- TRUE names(slot(g@renderInfo, what)[[i]]) <- validNames } ## Now replace relevant parts if (length(thisVal) <= 1 && is.null(names(thisVal))) { ## change everything or revert to default if value is NULL repl <- if(is.null(thisVal)) graph.par()[[what]][[i]] else thisVal if(is.null(repl)){ slot(g@renderInfo, what)[[i]] <- repl }else{ for(j in seq_along(slot(g@renderInfo, what)[[i]])) slot(g@renderInfo, what)[[i]][[j]] <- repl } } else { ## change only named values ## FIXME: check for all(names(thisVal) %in% nms) ? repNames <- intersect(names(thisVal), validNames) null <- sapply(thisVal, is.null) if(any(!null)) slot(g@renderInfo, what)[[i]][repNames][!null] <- thisVal[intersect(repNames, names(which(!null)))] if(any(null)) slot(g@renderInfo, what)[[i]][intersect(repNames, names(which(null)))] <- graph.par()[[what]][[i]] } } g } ## setter for node render parameters "nodeRenderInfo<-" <- function(g, value) { suppressWarnings(setRenderInfo(g, what = "nodes", value = value, validNames = nodes(g))) } ## swap tail and head in edge names swapNames <- function(names){ if(!is.null(names)){ ns <- strsplit(names, "~") sapply(ns, function(x) paste(x[2], x[1], sep="~")) } } ## setter for edge render parameters "edgeRenderInfo<-" <- function(g, value) { ## edge tail and head order doesn't matter for undirected graphs ## so we simply duplicate the settings and swap tails and heads ## in the duplicate's names if(!isDirected(g)){ value <- lapply(value, function(x){ y <- x if(length(x)>1 && !is.null(names(x))){ y <- rep(x,2) names(y) <- c(names(x), swapNames(names(x))) } y }) } suppressWarnings(setRenderInfo(g, what = "edges", value = value, validNames=edgeNames(g, recipEdges=graphRenderInfo(g, "recipEdges")))) } ## setter for graph render parameters "graphRenderInfo<-" <- function(g, value) { ## value may be a arbitrary list if (!is.list(value)) stop("'value' must be a list") g@renderInfo@graph <- suppressWarnings(modifyList(g@renderInfo@graph, value)) g } ## setter for the pars slot "parRenderInfo<-" <- function(g, value) { ## value may be a list with components nodes, edges (like graph.pars()) if (!is.list(value) || !names(value) %in% c("nodes", "edges", "graph")) stop("'value' must be a list, with possible components named ", "'nodes', 'edges' and 'graph'") if (any(unlist(lapply(value, function(x) sapply(x, length))) > 1)) stop("all components of 'value$nodes', 'value$edges' and ", "'value$graph' must have length 1") g@renderInfo@pars <- suppressWarnings(modifyList(g@renderInfo@pars, value)) g } graph/R/standardLabeling.R0000644000175100017510000000133512607264574016474 0ustar00biocbuildbiocbuildint2ftM <- function(i) { if(!is.numeric(i)||any(i<=0)||!is.vector(i)) stop("'i' must be a positive-valued numeric vector") ## Solve the quadratic equation ## a*n1^2 + b*n1 + c = 0 ## with b<0 and a*c<0. It has a positive solution ## n1 = (-b+sqrt(b*b-4*a*c))/(2*a) ## Here: a=1/2, b=-1/2, c=-i+1 n1 <- floor(0.5+sqrt(0.25+2*(i-1))) n2 <- i - n1*(n1-1)/2 ## +1 since we start counting at 1 return(cbind(n1=n1+1, n2)) } ftM2int <-function(ft) { if(!is.numeric(ft)||any(ft<=0)) stop("'ft' must contain positive numbers.") if(!is.matrix(ft) || !any(dim(ft)==2)) stop("'ft' must be a 2xn or nx2 matrix") if(ncol(ft)!=2) ft <- t(ft) return(ft[,2] + (ft[,1]-1)*(ft[,1]-2)/2) } graph/R/test_graph_package.R0000644000175100017510000000030212607264574017042 0ustar00biocbuildbiocbuild.test <- function(dir, pattern = ".*_test\\.R$") { if (missing(dir)) dir <- system.file(package="graph", "unitTests") BiocGenerics:::testPackage("graph", dir, pattern=pattern) } graph/R/toDotWithRI.R0000644000175100017510000001245412607264574015422 0ustar00biocbuildbiocbuild.invertListOfLists <- function(x) { if (length(x) == 0) { return(list()) } numItems <- length(x[[1]]) resList.inverted <- vector(mode="list", length=numItems) for (i in seq_len(numItems)) { resList.inverted[[i]] <- lapply(x, "[[", i=i) } names(resList.inverted) <- names(x[[1L]]) resList.inverted } .wrapID <- function(id) { if (is.null(id) || id == "") { NULL } else { paste0("\"", id, "\"") } } .wrapAttrVal <- function(id) { id_names <- names(id) isHTML <- grepl("^<.*>$", id) ## escape the newlines id[!isHTML] <- paste0("\"", gsub("\n", "\\\n", id[!isHTML], fixed=TRUE), "\"") names(id) <- id_names id } .splitRenderInfo <- function(renderInfo.list) { ## extract the attributes that are global attr_names <- names(renderInfo.list) global <- list() local <- list() for (attr_name in attr_names) { if (length(unique(renderInfo.list[[attr_name]])) == 1) { global[[attr_name]] <- unique(renderInfo.list[[attr_name]]) } else { local[[attr_name]] <- renderInfo.list[[attr_name]] } } list(global=global, local=.invertListOfLists(local)) } .splitNodeRenderInfo <- function(graph) { nri <- nodeRenderInfo(graph) .splitRenderInfo(nri) } .splitEdgeRenderInfo <- function(graph) { eri <- edgeRenderInfo(graph) .splitRenderInfo(eri) } .print_attr_list <- function(attr_list) { ## make the attribute list double-quoted strings; ## with escapted newline characters attr_vec <- unlist(attr_list, use.names=TRUE) if (length(attr_vec) == 0) { return("[]") } attr_vec <- attr_vec[!is.na(attr_vec)] attr_vec <- .wrapAttrVal(attr_vec) if (length(attr_vec) > 0) { foo <- paste(names(attr_vec), attr_vec, sep="=", collapse = ", ") paste0("[", foo, "]") } else { "[]" } } .print_node_stmt <- function(node_id, attr_list) { node_id <- .wrapID(node_id) paste( node_id, .print_attr_list(attr_list)) } .print_edge_stmt <- function(edge_id, attr_list, edgeop) { ## name uses a tilde between nodes as teh edgename nodes <- strsplit(edge_id, "~", fixed=TRUE)[[1L]] nodes <- .wrapID(nodes) edge_id <- paste(nodes[1L], edgeop, nodes[2L]) paste(edge_id, .print_attr_list(attr_list)) } .print_attr_stmt <- function(type, attr_list) { paste(type, .print_attr_list(attr_list)) } .print_stmt_list_fromGraph <- function(graph, edgeop) { ##print the graph, edges and nodes graph_attr_list <- graphRenderInfo(graph) node_RI_split <- .splitNodeRenderInfo(graph) edge_RI_split <- .splitEdgeRenderInfo(graph) ## print global graph attributes graph_printed <- .print_attr_stmt("graph", graph_attr_list) ## print global node attributes nodes_printed <- character(length(nodes(graph)) + 1L) nodes_printed[1L] <- .print_attr_stmt("node", node_RI_split$global) ## then ensure only renderInfo of present nodes is used locally ## and in correct order i <- 2L for (node_id in nodes(graph)) { nodes_printed[i] <- .print_node_stmt(node_id=node_id, attr_list=node_RI_split$local[[node_id]]) i <- i + 1L } ## print the global edge attributes if (edgeop == "->") { ## directed edge_names <- edgeNames(graph, recipEdges="distinct") } else { edge_names <- edgeNames(graph, recipEdges="combined") } edges_printed <- character(length(edge_names) + 1L) edges_printed[1L] <- .print_attr_stmt("edge", edge_RI_split$global) ## then ensure that only renderInfo of present edges is used and ## in correct order i <- 2L for (edge_id in edge_names) { edges_printed[i] <- .print_edge_stmt(edge_id=edge_id, attr_list=edge_RI_split$local[[edge_id]], edgeop=edgeop) i <- i + 1L } paste0(c(graph_printed, nodes_printed, edges_printed), ";") } .print_subgraph <- function(subgraph_id, subgraph, edgeop) { first_line <- paste("subgraph", .wrapID(subgraph_id), "{") last_line <- "}" stmt_list <- .print_stmt_list_fromGraph(subgraph, edgeop) c(first_line, stmt_list, last_line) } ## see ?toDotWithRI toDotWithRI <- function(graph, graph_name=NULL, subGraphList=list(), isStrict=TRUE) { ## check for the correct class if (!inherits(graph, "graph")) { stop("graph has to inherit from class graph") } if (!all(unlist(lapply(subGraphList, inherits, what="graph")))) { stop("all elements in subGraphList must inherit from class graph") } if (isStrict) { strict_item <- "strict" } else { strict_item <- NULL } if (isDirected(graph)) { graph_type <- "digraph" edgeop <- "->" } else { graph_type <- "graph" edgeop <- "--" } printed_graph_stmts <- .print_stmt_list_fromGraph(graph, edgeop) printed_subgraph_list <- vector("list", length(subGraphList)) for (i in seq_along(subGraphList)) { printed_subgraph_list[[i]] <- .print_subgraph(names(subGraphList)[i], subGraphList[[i]], edgeop) } c(paste(strict_item, graph_type, .wrapID(graph_name), "{"), printed_graph_stmts, unlist(printed_subgraph_list), "}") } graph/R/write.tlp.R0000644000175100017510000000160612607264574015167 0ustar00biocbuildbiocbuild## Copyright Laurent Gautier, 2003 write.tlp <- function(graph, filename) { m <- edgeMatrix(graph) n <- numNodes(graph) con <- file(filename, open="w") ## nodes declaration writeLines("(nodes ", con, sep="") writeLines(as.character(seq(1, n, length=n)), con, sep=" ") writeLines(")\n", con, sep="") ## edges declaration for (i in seq(1, ncol(m), length=ncol(m))) { writeLines("(edge ", con, sep="") writeLines(as.character(c(i, m[1, i], m[2, i])), con, sep=" ") writeLines(")\n", con, sep="") } rm(m) ## nodes label declaration allnodes <- nodes(graph) writeLines("(property 0 string \"viewLabel\"\n", con, sep="") writeLines("(default \"\" \"\" )\n", con, sep="") for (i in seq(along=allnodes)) { writeLines(c("(node ", as.character(i), " \"", allnodes[i], "\")\n"), con, sep="") } writeLines(")\n", con, sep="") close(con) } graph/R/zzz.R0000644000175100017510000000121612607264574014071 0ustar00biocbuildbiocbuild## unexported environment for persistent stuff like par settings ## specific to the graph package .GraphEnv <- new.env(parent = emptyenv()) .GraphEnv$par <- list() graph.par(.default.graph.pars()) .onUnload <- function( libpath ) { library.dynam.unload("BioC_graph", libpath ) } ## utilities qrequire <- function(package, quietly=TRUE, character.only=TRUE) { suppressWarnings({ require(package, quietly=quietly, character.only=character.only) }) || stop("package required but not installed: ", sQuote(package), call.=FALSE) } pasteq <- function(..., collapse=", ") paste(sQuote(...), collapse=collapse) graph/TODO0000644000175100017510000000023612607264574013401 0ustar00biocbuildbiocbuildsf 24.01.2006: Need to improve toGXL so that attributes are properly written out. wh 28.01.2005: can we have a "==" function for graphs (e.g. graphNEL)? graph/build/0000755000175100017510000000000012607321273013775 5ustar00biocbuildbiocbuildgraph/build/vignette.rds0000644000175100017510000000054612607321273016341 0ustar00biocbuildbiocbuild‹•SÝNÂ0- #j Üû{”À…!ã…·e+£ftK[B¼ó½MÄ®´[;&Ñ‹v=§ßÏÙù¶·‚Bu Æjë«5T«º TÏ›9ÇÅæ1ÃBD/loØñb—IÚz5Œ³„ëK‡Ó1ÖÄDJNW;IŽ5üæWºšASf¸{ö0Y ÌTë@q)„vëÊС R#ÑsÁ]­­sŽŽiÏ«wKqÆ’"YÿfI}å[RóƧFÓ’òªÍcºáF'Ó°JýYö"õàèd¥Ýòغc ÓçH蓉+ÿV«µû¼-Ã%ƒ¶ÁŒ”¥v[o(#(#˜³’ÿG£.tI†·Ä¾YßÝ͈ x¥²Ár:3ÇN5Š))KìG{ùD>ö9WØoò|Ùfץџj;_MEú'hh$XâhÍU¾Bß?OŠå÷graph/data/0000755000175100017510000000000012607264574013621 5ustar00biocbuildbiocbuildgraph/data/MAPKsig.rda0000644000175100017510000000136512607264574015551 0ustar00biocbuildbiocbuild‹íXKoÚ@6¯`H‚HP*õÀ‘ŠHSªŠÁ!‰L"­”«……€e›V•öG÷$ÝÝñú]»j/Éöú›ùffè˜Ê·íòmY„¬É=G†ù,¹e¡Z"Ïâgi¢X ]Èä^†L…ÕZCTÉuâ€ye*Ý8ã½ÉµÒ™žñ·©4º”¹­(M¯./†çœ&)_:îx* ù˜$o<8åãÁÕWÅçú’ÌKH7“ðÒu^ŽšÖÆ0LdY ÕXvëµc¨6g?ìµußj˜èa­¹øaS]Ù‹7Açã¦<–>6 s½\Ì[ }åZš3´\6¬ùbÁ…GšŽFd·j°ðìIŒB…®FO€O¯îò˜`óú±×Ýå›þÌn‚E°ˆ“i°˜† 5FŸOS‹œ˜·á"wKL²¹>³YcÙÛ?ó¥™Ä—.gûîÙ7ezèö6OÀõ¼ÜÅX,Ìó±ßó6˜ïù{<<ãvFþÎeŸïŠy}ìsÑM0‹nòdÝÏóü>'›oôƒÙÎ-¯Ÿñ.¾äÜ%ºÈ“¢Û:¼þFñÚnÃí]èæ%_œ¦nÀ8MBÁæõ1Ü|Cxø$YmC«]¸žÀÅ\ôà‚—»îù~w.xô¼‘ûø"F“«hž dº˜/iN¢´VúÃì’Ò±FîGû+Ült•ßlÉ¿”¬<†V̯w'>Q%>U%>S#êÎóŒæ¼Võ¼«Jl« §ÃBÞccWÍɉÎ>6¾RMéP•øB¨à鑚'e¢á¸¬ªGl¡É÷lff0TW¶²²»Â‚1ŽcT–‘yÖib(×4àB»·…°Ý¢M*à°LÇÁP³˜TänZ±kC͇APÒ¡PO†èC­çOºÀwR|ÂèÝÌ’ëû~[ á3˜¡kbnºAISaIÞÜX¢àM"a=³1¡¿º¡ÆË!“_ÞÈ"Õ ï¡·QX7¿~?«¤Þ~/;Žæaç ‚^p)Lq!xåCîgÕCs‰â±”ŒE!‹>ô„²W+œs3œÆQDaùÅð*=a¼\lêdôöäŽj_¾²ªûfœ%graph/data/biocRepos.rda0000644000175100017510000000354512607264574016245 0ustar00biocbuildbiocbuild‹í\ëoÛ6÷3¶•Äqì¤]€}†}Ú‡aë]lU^ ²Úiê [¿*íÑÃd·)ü!Zÿ¤ýíôà‘GÊèõŠšw¼ãÝñx”Å287ŒÉØ<|± ‡Ö¹}:>{ÙgB1¦N§¶#Ïbë«·,Ú˜xdd;£4 Ïó##‚Ø4ÏNN#ކ1]ö0UÒe¢ñgˈ 0‘XðqÅõ­€Œñ@Ów'L§ç!=•£ ýùáÑ8bF$„€VÍV¤fƒ]ø<Ø=;㳃ÛÚØw¦ç‡aò,”f²d åy¯¼‰Œsœo“7qd<Ãùƒ˜[md˜Ñ í±s¹3ð´éNYZ› Ìõ‹ñôéccö`øç0Iœ/‘y‘RÀ¢fœ3{f80$Y¦‰ãGZ9'Na'›)õ©á’è·˜Wã‰î6LgrÙ• òæÜãëŽí2 áı=fHÕsx”—m˜ h®qILkD¼§$ùâ.S‘Éhêq‡“§±?ÒžÁûnb+‡ôõ½ÈÇcg# $c3ΩØ/bߦ;ff¿¥„‹©kxýþÀ˜LloÌÔ_‘àñOÀÓ‰á²í¯r|ª%ñ1ɘl‡Ž¶¿V_§›X…ž\¤H<(Þ«•^)-Ri[NÒ-I~½”ýèMúA®p†Ë*œ 1!¾—´•õÖRûpSÁ[ ”õã%Í´¢I#ôm¿¦í7´]Á›OPW@ÑmÔ˜… H²ð“Ǩ¢ße3n-iƲþmÑhÿv·å*`ê÷KšéÖµgÑ`@.?¤í£b&Wu*¦]gí³bŠjL]&¨,EÞZ ¢?¡3þXlÆ:sá)m’\)¸=Ë`Ùç—Pæ#XXxÝ¡†ýLÛ_>WŸ?½@Yß]’ó+úž¸~úÞuÖîÓþ>í/kþꬔ<’¢{íõr¢Y.ºnu¹BJê¿f¦ëGÅßZ€W°èT´ä“[PÍ-cÁ .ï!ö3h°§U82 £žgë¨÷i¿Oûƒÿo°*:u½èÑ_Ï}‹‘£r½œèÖsßVÀ°ì¤¨‹ò2ªˆmׇÅßZ Å\£_RôÓkÚ¾ËÚ—”þR§-åÃÃúÙ%âA€?¤ÒJs÷/'aÃb o-P†Ç㻟žpžß|× Ô[ï’zëy©Þz«·Þ¥ñ­7Ô&V´šIÑ:HöJþê®–í¡´8Nåê ¯ÅòÅ0[Ú×Ä_D¥uYI*I%©$•¤’T’JRI*I%©$•¤’T’JRI*I%©$•¤’T’JRI*ÉRþV}JGtù­ú\¼No#¿YïÒAóÜ {—SæâæVvÛ>_tÍÞxø¶}rð¥{hÒÝ{›ÒE4JåÖo &HfJLQ×2p¡#=a€ x³°;ÛCòi›æùûÈg À-Ì1Â`=íÌÅ«ãVFäi3ðÁ¡¶Ð`ž_ô8/‡„à¬0¡ËyD¡ËÇJ±ï!Žt¥ÞA,Œ,è€rIÕ£sß{Œ–Ëé6caåk<1Gh‡¦!ôD:V2"NÌ9¬b5í ØŠ”´Àž„,Ç{æÄm:CTÜadѦ ÞÈë@Æi«‘!<Ö€‚­Ñ1GPŽ6±¬9ÆpdÎ'TqÒVBÂÐŽfB@ð-é L­ÑGwà¨ô0YÊ?Ä’*!âpˆV%¡EÚÐLÒR ¶¦Í)(eè8¹^FY;ÙÌXyðI‘$:˜…̹éyÜÆÎ"6¶e á[äèö0O4g³pÀº#UÔõì"×(§»–ÑP,©¨ieD“Ñ€ÀÀ2t‡Ìt9dFÞKˆƒÂûGÔ,gÑxÎÔå ØÔãâ´ÃY‹ÁNh:ö´Æ¬<£ÁR¦.J:$YÜ&]›’K$â “Q¥ào ‚^m¢GáÌY…rYn&$´¿Ö ji;¡ Y‘ƒpYddÄå:¼ë£5Ó¨ÄJOcDQ"ÅÄÁ‰a^cµ‹ Ñ÷‹LNþ)„ˆ:[IÌëqsR¿ùáãö´rpÜ Ä‹Ÿ½‘ÏM¨HSrU€ì]È„y1kÉFúG°-\Éž„8T¯,­sÓ²ŸJV>80Þ=„+Ï;ää°C Kïÿ4_‚Û7Dgraph/data/defunctGraph.rda0000644000175100017510000000137412607264574016730 0ustar00biocbuildbiocbuild‹íXKoÚ@6¯ðH‚HP*õÀ‘ŠHRªŠÁ!‰L"­”«……€e›V•öG÷$ÝÝÙ5~«öR"¿™of<»èÛ0Rî…»‚$II)™%Ÿ)b¦“ä#!I¥<¹g¿ÈCÕžR"õ:àÊÌ:²‰Q"× ÓêH¾åöÞðFmŽÎÄÓHî_)—•G×W—½ A“Õ¯M×É=a’¼²»§Âî^S¹êÈŠh©+ß?Š‚¤õ†zê)ߺüa_vfÐS;nX§Ûoô]}{ßC‹?Õì¥iZȶ«š¹0ú[î(ÕÆ?…ýP¯Zèq¡»øaM›;Ówþàãš2?UMk1›NêUcîzjc4›Uí¥õbþÁ#Ý@}²Ze<»§T¤ÓhKð×®ð{ŽÁÕÓÝÕóe¦à“'ë!Û„N Kúy"m'Ñ~ã-¿ ±º=‘¶J·0  »zûªµxU“ü^ܾb=Þ€’‚Ø>‹;á÷q‰ÍøC:"×ñ¶·n1Æ;ÇƇ¸Ä‹Lü_¾€0ýUaóv"G‚äG|þR”_Ñ-âD‘Ö) ^ îúÏ¿Öîú½hjÜ;Qß—sÇÜ1wÌs=ÓAÿ{ ûT7±Låbè‰2Ê "0°«¦(P&ª ƒž2耓0è*Ô¤ âÊ€˜ÂÂq@f!3í ­u‹ÉX.$f¨.$¢U1—^@hYòŠ!aA…pÒjÍÖŽPfx_èsMa-Ž•Y 8 ×à‚z8 ÎÔUaiq” ¯ü­hHÜu4Ñ–3ÇþÓm¶:·gšMÓyÃsšãXìŒø1ÂÔÆšÙ3†¥™÷<Ü2ý•ÂÞÈÒöÊ«vsçüóú~ ¡ÃçºòÌ©¬N6‰;§O-4vþÂð¼'ª§—:dE—ý :ôuW°Ð\GÖÍ|²X (Hø”é5¢œiS³ÄÐKx{ÙlÐpýÅIõÆgraph/data/esetsFemale.rda0000644000175100017510000016310412607264574016553 0ustar00biocbuildbiocbuildý7zXZi"Þ6!ÏXÌç=æ])TW"änRÊŸãXa“ÆqÅjnçj-&êa{ÔúŽG²%D·i¿â]´ÿ_mê6¬N½xZ• † ÄŽûæ×ƪ ¹ø°,ù›¨„[¬ÜÌYó^é©ê °kM tUÅo©f5GÑ-æ> ¥VÊø¼k¼¾¡'O¢.æÄI:´‚™4|ó­ìó€ ÒE¨x ¥áw™8ž"úÏæ[§m¡Çì_—YWƒ³m[³¯]ñøûêŸýjhjÃ< Ðl5x݃ÖJMrL»s÷—Pèûú¤ª|“u bšö I'µÓëùº¥èm_ZYXÇçyÉ:©])ä¶…Ö¾LdÅóŒHʾäÈwÑ>û£zùª¼î¬=£Z ›ÊôIŠj¨X›µX-{‹É£íÏEº1[SN :€j²QÆ(£µ_vÝ,—kéùöäbû²evmâáÙ(’Ͱ!Xó{#~9p;Ì{-+(-‚U°ð3瘮=,b0©K}: ±ÖKö¦¢ÆþÂÇŽêvÛª|xý{ŠfñŒeÊÒ-®âæðé»?ž€¸»mÄSS 監>¿L–‹óÑ=æ”_«ŸÚ K¬‰Ek°ÊÙà:§ÍPq?û&ߊ¹ мÛcÙÿÁù’R–D»UëÃÆ;Œµxh;¬«´dœVâ8–¶†0ÌÔÄ ž°¥©û|Ä÷\Žé©¬Õ*ìÖÖÐÜ|Ðj·f²ÝTkÂõÝLœÎ3lªzö»ÓP½Ptˆ›çÛ·žáбS*^ÔVßñ/Àt¶¦«(F €¼IΛ±“_-âµC'Ø\’Ú°áŒ>‹ Û£sÊÊ5;”“òJ°aD]£¤¯ 5›h¼sÅõÈ¥Ò&‹Pfq˜€îɾšH²¢:mÞÄ)^Š+ßpBw´÷)„<6çðþä|aåËôLr÷ÏNÙáøB’µëP,ˆ”@9f¬U™àÖ!M\ÐLÿMø5›®vBAù.n×[Ð#)¢q,Dôó¸w__s\ÿŽ"÷§fÌoû1ßz½‡a…—=逾qÖM©Ý²2riöƒ‰¼²sïh³ÑÚr½ÉqeA¯3 aÌVª›4ddY!ýêQÓ¬ m2™Î,Ím¶HNTötfk-û¢¥ëÕ`Ùr×9öïjnˆIÛ4¼7„#…è¯rN°£ç²]\=F GPÿžÈm¿×xˆy¢©ð àMtè®b_ekõ,S¹j5šI¼ï3b®9.í Èe:‡ÊžÔKf5瑼ƒÙÕ÷ðMÒÖAÄö¢û›äo© JâY‘ë«c¸‘ù;„BIFx¡å°†z¯jXäÌFFø{ÆÖvéûÇÑÍß‘8m¹3ÌqcZ_.騍Š\L^0ßÌ[àùr»ðÓ åÇJWíÒé¼£º›îá£ñioVlû7D=OBy“#¬BÛµYÊö—´¨+Ç;Zj&\Êø9opöZ ìZTuE£)ؾL3´%×þÿ»ÃD©¬gc+ÐJÁH,ñnÆ-|yW¶¤£Ò˜É£‰Ýñ÷¯œ¡á ”ÍsÅš7wè?uH¬¢KmËÛT¢ò½ÇËh8¸1nîÕ#'¥¢9Àwž‘‡ÙR6"IÛ†ÛÞˆá~nAf¡¬y…\/Íég©ÅOã aÅiiñÎí'Ö Á•¸p]ÜìKù¨=Ü£ø¯`zè…×à‘&¿ÝΤ'^mâ´¡•A¥¸!ì#»Êï±!bñ3#ÄÃýã–³çé-Ö/> ké ×¼S\Ì>äÇ÷Κ¯&ôÚ(ØÅ@MMív³éM–Î+ÓÕÒ‰f F¼:¹(аl܈sÕåª%XÏ]ôÂw‚ÊÖ_D¸U¶×é^²ÓlÌ|êUÕ)jÓ„•Å1¶¼Z„ŠX“#ø +*Ñô\»ASBøâDù‡â[uw¼l‘U…*Û‘ÞB•~}`£S޲˜¤rß/ñË*ô»Íf)ª¬Áu \7ÜjóMZÓôÒo£'¸Hc|ºÿ$•qò#2ƒi'g‹wÁza×ò¡5ühw…AT"î w¸Œ?õ[¼(Ø ®m†È¯`^ éòõ › ÎÀn OÄÆ´†Û¼5CKXã\¥K&hS:ÿF’_Nªe\¶ôwjçe¤lÿu˜KEð\¸ñSõ\”¸ž–=†Z hBÙ¬â9œþÇ£÷À8“&¥Ù:²;ÚÏo}¢ä“‰pëÁa6»ÔG|‹:É@€ ¹&MU J§(¢2Ñ\+–ªòj"ë®_í  5vº‚d9:Ó·ÜïR„Ó§Øþ?i¹¦þª þúõš‹Lc‘ ##wò½grÎð‘¹NOHXbý¯“Š&¡ûGîš’Ê[S{kî»IÕ™†K·Ü]•q\Ù–ÛÇuÞÄpà23”4p«/ʈºý9ùìe³7ÿU\{äò¬ËœsBϪ[VG<“û¡Q²³ÎÊW‡Ã’ågÊë{È6—*›ÊºIYó"êì’í7InÛ6›œ&§£N9*Ë©€6­ÿc¯­ÝDMáRÆÈ¹úåƒÿ~³°-(Œ¬óäH„²æa¢”¥œž’ÈåE,ZÂİý¬+«†ã¥ÀÒ]2¬ÉëÓ!vŒ˜pßB ‘)â® ½^5ȼƒ?2É8Rb „ø^(5N·­³òw³“D³¶œ{œ Á~ê„÷Žméðûwfc¬Â_§ÂÓÏð-ý?`4¼ ?©6½„szÒäö@­^Gt 4D¢ó : )“ÑŠI Èóì ‘Ä#)¸hºòuslËá@Uð‰ý—½{ê‹¢>czqH¨Æ†¹Ê¿vÛç>ªIà.t´3 Ô×´57t&×þy»¢µÚÂ>èú–pA¢ÞŽbLˆÎþ¢AçßrE;á¢Ò£Ã߯ò«TaËõ»ýÄoš?àŒ5éö©3œe5ÛÒ ‚4 vðEG:g«Ø9Mc{DF($þôqdQP¸#Ð }Gáñß>ˆ×´{– ]ƒ!­è¤5¤L—g¹mßõ6lfA Ò½ :ÀÔ•ilDÌêܸ(*ÿÊÌ€î!Å|;àÅÏü{AfÆùå$øðœúS˹#Wçè‘hÀVCFnÒ†œ¼%2|\¬ ‡ÎO ’Æ‚‰¢4ö dS²ÕÇ›ûÓ3¥¹gægƒWxnû~Ÿ¿IÿX/#iù˜íCYdÿ]‚iËu€ s`†¿áè…˜(˜é¢¼*o„òƒ¬Ð\]øô=?Üå7e|íÙ½N¥ÇBÈö&]¶ö»Í) ÑèlÜîwXé E,'Þ\ª6•¹¼YÀ_:·¬kljK|m{ZÏ:aß…$Dq•¨òñ³Ó<÷ɽÅ4AMÁž1Þ‹)HyØZ¶÷q´"Ì•?ÒG¦ hzªtêñ™qfSÒXºÎ¾ ¨×»‡Ò9¸ëÔsvsiËI’I?+ î3¸º™Ìáï{q˜¤VUZ²2ÓW‚%ª†^¢hbÚe‹°Ð8(õ mû‡–hËG¡…¼ß†»^:æÚøÊ%¶–ˆÀÇ@mFýÈEKXC§†ä4Ì[fßÁ1ÀƒÿšH½÷d] Ž©ž×Ãúp¯ŽÐ“U‹(±cþGÝ/ ©°à$ÚòÛB’ÐÉ,Yg;.Á(ÉQ@X¸Wà?Ò-4­ûSlz^\•:sƒF$BÁØ‚/TŽã|•)ZG$mÈÖmŽ+DÙûÿ‹<4è™…×—€…ÜVç @1D„õ¤KíÂÎ1“†íöÅþxåávq0&Tƒ0cº¯ °ùÓC¿~vbÁCü›Ž}#r,ÅD“OUL JPõ$ùžŽ|g’Àµ3^|Cæ£c?G ÷‘ œ¢ ³õOá§€èHˆ¼nfu­‡µa°ÄÔÌÝXÆMŸºã?úǨ*5w€)ûr/N7ˆŸÁW]– ä4=ÂcˆR¥¬^Fâ~ êR¼Tyð<¼ X%€RlÄ^¶qå1±xÉq9*i¦B¿ÂF{8„à _<•µðé™ÕúÏ„£*Z²ÆÞašÜŸöJÁÿ·…y9 öwE…ýQ4lá!«õÜZ1ß—)êYð²,éç1á>ž³l±æAઆ5] ¦qÝåŸì%2 äýEÀQž†o(LH [’f¡ÍÖrû‹ƒmÒ§‚*Yä görözsö´œ¯%¡Váãuâ~²æ¥Ôt .Ú¨KÆìž2½£1éøâxÆ¥Rž²>DõE­í•ì~À¤‘ê]L.âèw €• †šÂô%½×Q´C³ùŸùž\Á áŽEöd÷ôëqÉÅj­È ßIÿp696PúêhnR£™ýÈê_Î[ ›'‰¾k°l Ò¡$F~$6K·U°sY^ÃO-bc@Ò&œ*[¹ês(ÿÖa°à,˲LÂ{ä6M‰eŸ¢P‡"9ýÛ‹äÃH€ñ2pÓÿ,‰ûÁ ò‡J’)Æ@ƒcî®Î¢à<ÿ‘“àWkì`s .QêHs6×Íp[ú ‚Æ­—Q黺,]Õà.[¼bq:zÉ>-±—”k]N4pèë¶¼>ˆ@f™Æå޼iȸm$ ‚ãÐ ê¶{d[ºÓýLòE.¿Òk¸7î„»U]cdM^Î*…@UAáÏoÓê[ïÀô“#(}#û8˜DÀ×Ô²ô5? ²[2Ä]ýš–k7kü`þÓnÀ‚ ¼¶Öå@:׊ê ÅÂ<÷»ñLÊFY9³£iúÐ{9B ¹s¹ i 1QjYXÍtNÊ´–¶ÙùE2¥ßˆ’—ØþGªI(ð‰¥ìòÉÉCRÔIòï5ïu\”v™‡~Þâì ÚËÁÁI_y› ïõ›çä,¬Üd` ˜.…YêçµÎ+-½½ÚT2×qt°&eØ¥ŒIlŽ’åt¼½¾†õ~láUäüe åÔƒ62{çÇ—¥Ž|í¨¶Þ…êOÏÆJØÀA6p‘ÍôHlMkóGm|•m'éƒÏî\#Õ1T?»ÃÕðcµ,—7ïxqCï©2RúyžK¿|ÕËž·ƒ;å»;§:YÊC T¦½zCŽ6úÅ„ œ<ÂÛ ~¥`Å^”tPG«ù í&{¿KÐ=dqÖa:õÆO9_gœÞrHÓŠa)â©·þæ«j…²æ©Ê î9 PÆuþe]-È)§?m¨ lÚ¿Ni;Ï; @{¸ØþnoAÊÉÔ£ÜúIÔ*êÿ§Ùщ²r5€õÇDµúí2ŽÑé³C#ú1þïJDb<¹¦‹'‡Ê$û£B³5¬BÐèž^^57£% uF–¯•D…ñ±©€fÖv/†” _гҟŒá†î•Q±ü¼bFãRpÞkêÞÀ|HR. ¢ÄB$¿¨¸¹"PWðâ\\[6)k¸$2ã“@ð|6/ß&Çφ :ýéö^ß¼Ði¾_Ž˜ü >òé½ÕÙgÛóð0ê¼ã²'~dß3ÕÍ\–4¾^-mcF…BGÅj”¼GI/×HútuFîk_9”#¾´)›~¢ )¡X…¤UNÿÚc¯•€3¹æ‘õçá›p‘çè&h訋u>*Ê»ÞfjXä'¬Râ~Cëæ;9†|EäXVÚ7}ËGRH¹ïê×*_Îp šâõÕ*Y¹2Ýܼ%2vf¸íT7©Á'Tn‰“®œ15Ô~ø¡\ïE¥ù€¢çžÖ‚qû"܉™Ø`Nª+‡_<6 ^4ì¾èï²Rx£sp?K­Ù¼ð¸«Ž»jö¬`ü”–1o•sA½j'mµªôÝjn” ƒšY‘I°„‚Â’&{ü<¨亻¹‡€$á?Õyå®L$Hžû·DYsa%?)f-¥™Q²“Ñg•Uƒ ÝFîŒÃ—ÁºÁð²Èü:,Ú `ô¼ü’dÚx‹sÐ˶ ÷‹ÚnXÏð ¿ËˆØÖ*¶uH¬¼EdâIÎG %Ò,…šf–Ë6’+uEÔªôW}Vƒ‚åM„ÆÊÍŒ/»Ê‚×;U£.4Êÿµ}g#=Y6pŸàUAŸ±Çˆ¾™dÈÑ ‘zɦ¬°œ#‘Ũ¯éJÅ7^¿Uìäá˜Þ²KÁF‹©¹ç³Š&ô%m<&Æm¥L¢Ló¡A,ÆÀdŧ¸P+­›zÇ%ŽæáVðóÿGêõÎ{®.áø- ¹ï° M¹ÞW*­q¦ :a7¹}³17†bè‹,cC¿;f¿\Ã`é÷hË­tÚÀ RêDà ËéÛò¡ô?=roÅyعàðRVÏSòV± ˜AúIª6W›Î8C[ˆF!…_0á‹à\åŬØsAý.­¢„åaR#, nŽ>áÙi‰Æ7ž¹xÚ_)²XÞSov嬰wRS§bê]/~{ÓhYâ¬Òüú›B³Ô¨Ÿ´hÑ,MjÝ€TEÈæp㊠óF݃E µô€¿†¹…£3 ÷Ãàé¾}Ç͆‹a|sqÈ@ÂϸÅYdºqÑö12ov°ýòà³JCYÛM©¬Vß F•‡ÇùïGcý89œù$ÆV|YØbYX‚šÁ 8IYäk±ê “£KH32N—ÎàᲘМ½P½uÅ5à'áeAÑe?IcJä< Å`—ÏOvmm8÷x8‹Ñ=†WDÊÔ4ZщBåšwé÷ûåܺķU¡i顟L°ˆØ¦nÊ… hÖ`þ.m4Ñðš¶¾ÿs·ò}}%buT™°HaÓÑÙOÚ[ß÷S|iÃB5ÿ‚JÒ›'ÕÈ n†[÷a9`òÓ…,ɉÄì=k¸1N„ ¨,Rz”vE9ÈŠnÓM¾_ÏKÜlßjò¡v£zÉÛn‡KM°¯ä¨]•@¶t'SCVƒ`CþBºžn½¨¦•—‹X¸'::䥗±"föšû1CWÀÌ‘h$zéÉþÓ`)ÁZ(—lͧ‚q`ƪ­_!†¥0õ}°§ãy‰K¥³*<b2vðï5 -ÄÊ–#b>!6pI‹iµç `ô‹SžÀ.HTæ:fÇ;Rά´‰Î8äžR(´÷¬‚ºÚ(^F¥¡ÓZW£NÂ1v‘ ½ºéŸ$W›R |4ÈçÙÒ€’E–XÊ´g˜Â{IyÒPIü{rDá*cõ~}"6ûؘ™%j÷Ùû\~J냧_Í¿3¿M±ôÍ©³Q$ •Á$ÙÄh!Á6DÁ ¬iBøú-ò©rzwóFÔäöì~ò´Ö8ðMZ¶-]ÿ‹÷ÌÚšPÜÙ}E.öpe¥Î  [-Ìâ¨ô°÷þ ™)-Ï\ÀÞ5C’;7uõo ð³D\}÷ï­œ™áÇ~hîÄëßJÀ𬻇²Ùy(M5<)` Æðå²@‰ eÌô‘¤kuË_¿âD6ÅßùM5¢wìµl-Bl›ƒ µÂÔ%@6\˜ |Ħ$ Ù€2EÕ¸ÃUø¯(=tøF¬­®€¼ÐjÉBáN‰Õ"áB~vNȽ` Ø ¸£¡w´Úk„‡á;ÝÀíönü€Þ§Ëˇÿ;=±ž+»=/®.˜Sc…„ mE?n~¡J—Žþ8ˆ´'ÞÖ»–¡)ñø¿pÊé…€õ°X:jo­­Œ¼å¸0ÔA;Ãù­âJÝË,$N1‡ÄhßÝ Mòœ|ØY4SŸÇóΓq_`ÏŠÇvjñe²À¹ÿQ ßAàÃofSnQÐû 1û`2ú?¿âQ®¼ëˆQf hÑ=\|_fÀG$–"SO}¼ÌÒ›R~p%ƒ`iP)µŸSñ$ï<(-jA ½ ¿Ÿ@BÉÊØä÷¡A¤¢¤™ÔN¥âgò: 70dÕ+‘BЗ–9gqd$@˜‚f¦§Iñ^ø5¨ÈÌ%ù¥sØ üAªå°ÓÁÈUO˜”°ÂçBynafí¯¹Ù‹|ÿ[­JŒ"¾öР㠜îƒ|3·Å3'm'Á6§—öÿWBô z¶ I¥aþX0zBO›ò2Ži?lþƒæà[GQŸV¼A;ëxËBÊHÌQ‚Á¿Q '{ìeh3ùsÙ–ÜÀ r I÷(-0¾Y*‰F 0ek¯>¢]Eõºx[d‡ ¿NìS}áõîœrœþ̵iþ¯iXC3›O Äl ¼«@ª¾ÅpØ4û®V¸J‚x¦#L‹Íë«mü¡äƒ‰ÐažÙè ù¬ú\žÊ„f\*æîÓ¿>ì€%E÷{ìí³obý (ý2èI¤jfϪJµ_#†PKDázªã …ÿÿ3]?Z@‘yYš¿GÎìЇ[¤+ã_ÍÀC Aâ'aXúæˆa.žz†e|DªhŒ{ÞR$ï Ð"„".*ßloè/tžY>åCVع›tE%›ë6|¼|ïéi¸:Ppo×nÖvøŽçÁ_7ÎÕÛ(óô8wn.Ç# 7àÌú B̳èÛ‘¶GËåÑ‘òíæáÀž9u˜daFÇåÄ…J~Í­FÔ©)Rj¦…VáSû.Ÿc`ù…Ú–îÃÌ/r”9š .LJ°6¹íî°ÓÖ¶ô¼sÉ=œ<îl3ð@ìíÓ ¦¦Pç"Lz+PÓûÊSÒ†þtúŸR#i…Æî==|SΆNš~+Ýò¶ÝÝä½Þ>ßÃ.Ji¨Zmñ§ =KúŽ«-­•Ò»+¿´(­ïùÞ¿ˆÁª–ëE!T „7±ÕÍÒ¯„=ÛYPxOÒ'Í.®¹ï+#éð¯¼cå€;(ñ ¢Ï±IBO®š¿’yÿ\lšašûÈž–tê‘Ê‚1q–îË ýñƒÇ¡#Ê:Ê‘픜¶DÔ¾(8¿Ä»¤|‘°ÒzO[cxú?…†áÚÀZ2 dŠ©(.z#"H›+ª¹…0BDbУ¥ê¢ <–t!™öD+æ E9û¾OŽ~=ºIm”Û…Îò¶eéÍž ò¢üG™²qïñ¬{aý„vë$܉Ÿßñ]“í’œÓßÛìûÞÒø‡…§±£m6ÀÆø$² ´F”a ŸoŽÎSÜ’ï2xŽI®¢ Nw –¸ØnQy¹ Úžåag±PDRÙÆÎ¬Ór ´‰’0çF{ö¬Zqk²¼v¾›Ññ5zƒÙ"‹17'e+•/Ò蕊pã¨r…Äù` ýŠäKsþ­E?™•§ßâl1’1^uýí[ž-È·±&¦µe`%²ññ l‚d´×ã2n8=Äé2èèÏA·Ò¯ž@½]ü/2^€åÞP'I´²ìÀ'qWË¡ìo’«œµÚ(Ð>9ŸÓ°8H„8dåëÿrË:¶¸P£ë)sQ@ìŸB°ÑªåYÊpÍR6•¨/¿ëÆ@£03ˆ­OâS‡ÃèžiOÑí’¾¡üy7Ýöl”Ô±iÖ¨¬±¨üÞ«Én÷ÖwØ`,ÕÌ?),#t¥°ºEªp·.iÃèãu&?ð+£18–ñž±RÁº=¿øœÿž}$a¸™!ç=Z)Qb7I:²3ļÕí¦ÔOFlÌ'¤·Õ¬y'À¢O§¼¿ºÂtue2™RXîõŸê~²pðœ°ÛÅ3!­Ÿu/ìêÕàÞÅÃ2œÝ*KÚ¥§%ŸuþÈóÚ˜Q&üP¿ŠUùªú÷’ œ26ß]+1*K¥öžìX@o¨PWó+n4D{3¯ÓõFæIØYhø'‰mé[‹‡G«Ïo,ØIŽ!É ¬óŒmð‚¸œð6e0uÅfQl#§G¾cÈX`wǾ³íŸ¿ºÊV¨oåITrMÁÁ,´ø ðlý˜,Ê©·Úì÷¾™I^eÜÈ@3É$’|~?G€íˆ6€GjªOb xw9fÛä±…t¢S,\«Q4o­IòÀÝîL–Û0êý ù>‘”‡µÏb]<÷’‹øËѺhQé‚ $€†¼wË~Ïöüa·Þ\޵•Üi oøõbô”BOý‰è f.ë0A?ð"øÊpÎë°ýu@v"9qcG=“]zl9îç—JÍÜ}éÛB“W²zŠPÝ=VY=”?f †ç¿¾^(<íDK{ŒVB®4ÙGñ„9™®[rÀLVš\Npä%Û;úÛHû³37-šQHn½oŒ¥£©èùMϳ8sjI8;¦F&׈…募3KF€ÈgªNZ­9©>™Pì>ó[¥š8™_¿qû$ (#vPŠñb¥­?¢p¨ï‚oùŸGàµOhTË{ò8Eþˆ“ øŽuÈ熞ÁLãí!d¡z>óØz¼° ÄÏž’Z^ô`Í oºA<ã?ÂzF d$³0ø'j­>ØÌ‚æ¨?ák«èb“Y»ú VÈiŠ,o£„”\KÑ‘ÆCe~ÏýÝayÔMU`Xó‹wäÓevʪ·ô3ô ª“¤ÛØèµö‰—Œ’ #ì½<šñôM¬ÅšI—ÿkÆ{•Jê(ú|g¥šÅ ­ P†önÝݾk½„Yj«·Zƒ@ñ‰Ú„»ÁNê(p×â3{êSˆ3Ég·í¤RÄ‚ÚV GûÆÌzÆæ£D’‰èUÛµr¡ÆþW÷ÇVòê|õú†˜{öÓpÎ#Su0_[¥i>+¸m?o˜ñ*޼£ùhÀóÁ0=/"iæùeÖ¸ÕRw;ƒ^ô­$GêèùòQÌkO @›©K¾/‹‰]ᵚr\¯îVla2ëDÀÿEpFô¼“ƒ°GcOõ(”QÚÔƒ¢t²,}?GeÓ ëÓÚ™xSàÕ¨—¢(…‰eÀ3[]ÅiÄK”¢pÛt¥åÈ‹œ¿i°¾T @Fÿ¿•ïrrÝ›“×#ûÃEú˜HÍùG6ñˆÁÓÙ± ÉæP éwID?Ï5tÉòsDq£A—ŒûâvÐ÷_.üY‚Õ“ ð§ ‹Òa«Š#á`ñvkvoRS  ¼ŸÉËk¿E”šUôýøx;- 5PΨ•æíkM„ði'£àT+„QíÝätÐNÊÐRŠã§âCõYúšFã/g‡cñ +ì›6ó=:gb²ÿ¤|žÀÚ5rÛèÞ]÷Š8 €rᯠrmhñeöEïy„Í5Ò…>2òuNÆ––ä_S±ôÀ°¢àè¬Dxãí‘S:ÔTÍŠ¨>¤]n­Ÿ»:¶"£¯ä;ôЬ.W(”×°+a ÿkIšÉñˆ D³â]W³ÜKP®d ôÜAiºFM—…‹’z9'å•ö7‘·'PQöÚ™!ü®4ÿCç\ðs±ïpÝA«Õ€WèOaˆ oj{ôx™NÏ+ƒ†z¡Q>¶£49Ä s¿—ìûuK-Þò ‹|ѵØèè/;07æÿ»¦•–_/æòM·PÆV}§Â‰jÂæ?QSlèšSè´ìÿ3QÓJ%×:Ë)°leI›r^ÇKrõUC¾–Ž0À”rh×±qoô3¸H…ô=Ï„¸Ag^* øeÅX-lGV’ÍþÝÛX¥%C;5K?óÓ®»jw!Ø÷`-~e(xÆb±µôê?¸J?ÁÍg*QýN“!U¿ûÄî/¿0Á‡EƒÍ¥YI¶àâùâæA†4˜ñÏ·¾;[eôT?×þÌo%×|yš Ê_OF±Ó±š†ä V5‹2ó¢üeÛ—%|Ò“ê÷sãFþQ¦#8l9t&"ÃÔôbm-7Å÷/’‚H ¿ø1=X%÷¹Ö²XÒ&¡]J ZMo¼š™Fƒ¥$¬xêx—ÜI‚¬íWlaÇ7Þ½]ÆÎ«”BBB΋¢_Düqß»æ‡2é j ">+œj¼ €Âå¾ðŒ÷=SŽBdzoDÜŠzá–ê ¹˜ž[ÜÝ­j¥ËvoaŒøÂ“Ú™• N[£üª¿Í36$Â?õ&rÅ/¤ñÊnÉñäp\úH[Xðç*H•-þ¶/ˆô)A|*¥81=‰5šHm⺔æ0&­f8ë÷1ï\tOŸ$VŠÿ‰¦]bd–hêìc{ëü¶t¯xœ^þ… ð<¯á&ˈ`5%ÿ‰®Xàh¾¦/d- Ï­¡¼udò¥zÆ8"Æú:…ªv»[…^îèÀêØzªxˆfh)Æw¹-T/~=ÆÊ%žÖ+Í'¬þ ³ Ix©ïŸìxr'*ÈM†¿û†}a(i² ¨¨h‰jyn©¨˜âE„YûÊX±Ú)ë¤MÒ4/¾»uETGå?ö‹+ô,MM©ÌÈô»3„šdßß{½£h0©idî~K¯”^]…¶%îÖt³LR¸~ï&X¸o„ ¸P=x)M ½âB  ”-ý7¶pYwýø ‹Ó}¯Ð¥Z˜A†a.F윢™”}†Ð»ebPV£j2•$Àq1ë:-9‚»hˆ*tûÝ›š7~¬äÊÒc&ª%8‘ꇰ~JUÀúna¹!?¾ÙÝÎ%{Í F÷)K/¬­m·šŠ~úLÅÖ¯£)éMY)Ò©àuÒ&¹â’âÖ¯†<Â%rÃ.»,}ËMà±Úd"d¥¡Ÿ3éÑA ~¸åÏN$=ì¡ûád¬È½©Ð$BÍó“öЖH$iIKÜ9Ê5ØÉ …¦(d‘;ÃÀ3ÍY!­þ„¬CíYÀ‹Eiöê…SÛŸZNX#@£ˆNîx'ÙžpËÿcí‚i’> ûµà¿ëE¤ÁdS;SŽEÙ:y+ÞÊ"‘-û€©©$30\èÈÈåÞ6{3˜¹LÊÐù[6‹«×RÞc ?&ÓhIòð‡Q ¼s©wòL|É„WÃÃÕC•=WYU6*ÿ+SÙ{戜²[ÔvÙ©”› ½Qìz%±ë¦:_ºY •¯RµJkß±ÜùÍùÈÀsŽgdη¶Uw@"úé$I€9uigZ%g¨ b²h|VóɃT×÷$dð[-´¸Ý±FJ»¢v$¦Â“£öª`µqP[¬Š“òCªüïrKê´–Y|LLLI‹l?fîÏÈ@—[‚•±eó3Û^›ã´ jøzPqi'œMgRF7iCòÊ!ÊWÌhiÀâ܃™u4÷¨á¯ áËâºïJôÑ`éM‰Èrê`6ÇkäiOe·dnõöíbÙáîÛ Ñ§ªvKk›ß‘„$]i´Wueäœ>XQN5׎ÕëQðÎAÉZÑ…!¸f?wšÇ‚u§ ƒ`Ïx¬¤òù¼Ê߯ ôb´P—õÞ}ò-©˜œ‰axãŠÙb4{;¢ò®í°ãª!ÖÌ¢²æêÛL«GptùÓ"†{¢Gå6ÔŸ.ÝåUÀ©D™H˵ÕúaDaÍ-9ŒÒÍJ;(á¿Zí–ÌénÂ’ñÃvÓ¦óçŸÌÄXäp²Þìs€1­ÜH4,}Í•žÌÕÄ/¨kÓâ²wR3oׂïØfZ$ QBZ­CzäËË•&‚i¿/FцA›Á:63ý­É¯4QUvÿtåí8IWó .D<â7ª³ÎþóþU‘+1&¿0$.x˜Þ~¼"Э€sÅoÆ(lm”dÊHGã7tëC„|‘w\?`9¾‰:wû…‚3è µEb= +ÀÅL æ£H)!§˜™ýpSxN¶‰-7^“º©¾5¿Ð)WN¬þ =ùL¦:´‹ükD‡ž­Kó>°BXH‡*ͪëeÿO`QÏ{ÓzPÝ,>BÈÈÐ5q.òå¨åNÃOÇ~܉n>•D–g@ݾ«˜ìQÎ@å¾R45Å0sˆB¨ñ´ÕŽ¿ª¡N@ b††@Ãmh¶-Œ·(ß™3·ÑËÓa%º,AÕt…Ì!ö~•Ÿë²›GÆÂ°ê” „^îy°ÔÄr²¬¹Ù“‚½Û6i6>wùæÏLG¦bgq‚€Õw`GÐ œ£z7lâÑ%Î*²çùrKýuLb°˜·¬‡¢Å>~äàülaŒ–Š‹y5$‹=”¡\HtxÏ^:ž*TŸÔpR­š‡Ç .ï=’V4º>óÇ>Tõ®ã »¹ 0#ß³P¯Ú4@R™5Z‰op16a°·0<È·h€¹¿ÝR™6p³BFæxÉ% @~àˆ¿ {2tÄC¦¾À±ðªÊEúŒEühàcàãÖø¨u²­Îy9n±4¬f9òâ/†O­dÑ+ž¶~È(â¼À»Ò6ñˆœ±ùÖÇcmö=)Ç™§wòÊÏuåj¼i±"Gü3®ê±j÷fÍ©@ˆ´(à#¦ìÄŽ‚9MŽ«Æƒ­Ô™øI@w¤‚™[Xî-8à”T@$xA¥²óu˜*äW…¼~^QÔ£÷é¼³ð‘ãd˜3Y%‚Z7Xy½¸×5€çw"v¶ð “AÖrßi(¢ö\g„L´ «Ù›9xùç|÷]‹LhðiF‡ö¬ä¥ÅPÚ™O…α߃ñ õ‡®[gÆvêáÀvSÄûŽþ"˜Uµ(Élä`B-g•þB†ÇN}»tødZØ ý£WNaúù‰âJŸ²B7u®yý{å—³V'ÇäW4 ( ª@šÃÑ”ÔÅVÖ£MHÓý74ºdBwDócwWWfF8¼gEhÀ{¨ÌI~4b¦‘Þ—=/;1¢0ÌÓ ßÓØã¼®H\-ññçlÃ`X¬/ê+xµƒeKÐ’]䨿ðØg›D"Â×jK*49J87åš"tµuÌé_­~Æv‹ðà`~d0GZf}ÖKf@šÌþœe—ÛfJŠêU¸!–t>n?åN¥'Jò9ÚO‰w‹·i Ñšð‹›˜L¦ÛàÛW!‚nx¶€XqX" áåïï R( ³-q‚o'@üõœè¯å ÈË‚—_z ü ž·ÛÜØ»èåÓ« Ñd¸ý!]ŒÆ.5'cÁ®v«÷3}ô6R±RT‘G‚Åþ'ý¸ÿƒjƒ–y¯®$Cð£[.Áî‰Ó¬‘CÇâ±3ƒI´–·zTÕ×Én©$Tø¿†ÈÂÝ)7v wn6ø‰³'!Ò]—gÝÖ »Ãé´cžþúÃPñÙèÅ/É4¸•ñ? £öZ~G˃ÒK«å}¬‰ŒÁuÀÜ*y–Ÿéùq%¾‹$2¶‘\!;¹\Vïý¼z3ÿîøHu5†zY}‚F|û‹O]îÐYâç&ÝÙøöËéJ¯òä>À¸wT]æ±ù˜kìCb7tÚþ· ‰ûë‰ËBþèˆFœQF¸”n›ž‹Ô²Å[[x°Š36ϲP¹»!¥…r\K)Ü;‹45°£b&‰÷ò¬Bæ0Uš9dïhcI€îŸ#=y›t¤ ì磡Æ×£Kò?¿*$œWtì€"-xº•y 0ò,"C6;iŠêxc¼¸f£’½;‚¯†ÓÍ›MÁÌJ G‹ÚòE³H"IF œNîœå("èEÍÁ—¬Í`žšo—Ã/þ[@h—>*–5Ü}ô¡LÿÚ¹±¯3öô͹r=mû×–ïLo;' lâáá–J2©“Æbåjñäî»i4ã-Ç@￈x@òVgiä'€\(u»–Ç.rǘýä6]»¦rT)XGÌrÂô÷²ä”ñ}ÊÞÓ·’0¶Ž§E#ð(Î幎 ÁzJ)LzMÈà¶«Ïéܯ&B­–ŽjÛ90&y¬÷‰‰ºdWû§:ÐíYRqdñKA"(”ƒ ‚ˆ‹jb‹Ë¸|?T7ÖÅzßîïØNYèN¡sVMU‡gÍ@ WZAÞƒÉ`gù†óìÖ#Ó˜ë2i?å0GÉ!Õ+/ÿ óªjCgŸJð^tЍ_êŸIš‡ôzÀ(Æ ù‹«ƒ¶6·vžŠÐ‡©hFª]X9x]uDå~-ênæ¿!$vã†=záX\zþ Þf*^”Þµ=麴Ìÿ”é|‘f¬ðó±Á-œ2-(</Ûór"×ÎS·ö+ä¦.~ãqg`TIÓzм¡&ß ‘¸Ü Qÿ¡w3´ñö§àÃPHñtlì–nßå‘r·*½9 É.¡øˆ2€ ñ¬ëdIºõB´ñ(qT ™ôóCÿ—˜)ÿÂ`ô4ÞÛ,1›Q4yýÍ©8lÔ£žAi Ì“õNÅí"£Ÿz¥ª™†f#xzÊœñ÷rhSŠÝ;Œéœ¢ÿî,ƒó úa'Šò¤ÀÖÞV±¡ã\€y%ž ½Ã”®Ýåµ½š“ÉøÐ‘Óôø©üœÅŸ°‘®°®sŸ= ± œ~¤¹)ŠÔU¼9E£ÅiÉi–À? c6a±<þÂ4¥éìÆö‚…S8¼Ù!GjAªâN%N¥ˆøRk3ð…¡Ÿ®=ÀÑmUäÌðÏà6ÚUmûíÖ!ÄZÒm¡¥ lYOU¡{þÓc¶¥(è98»IˆˆÏÓ8{ò;qÜJú†NŸLÚR7½Ð@Q|æ7žRû·‡Ùþh˜Mߘ’±þŒÊÜMzÒtnV†È#PÙ¸ÜTà=bXq-Yh2&Ì?æyu.à1Àöª[¼åêÃ0¶ÅN+í¬ß[lI;Õº§¬³,Y&:"Õ43•™dLªŒx7doðWûщzñ 6ùª !Û(‘RäA¥êÙ›y;,Ýd=ˆíÎ5%±µJÖvÉ[&º4­ÕS[ºuR—a*pû‚þäyÔè!¨°’eY¹âè¸áÏÃ}ÇßT'èϰˆe§*”#ý_Vä®vÔT.H`¯—âP”îEMì¨%GÐyä63Ùøt›Ýmáyƒ”;i.ò“r,o’á}e—Õìa+$¹S`3F¹TÓ¶h IâåjÞaÌ áÞDTÜ~¸”J‰mZÐOüvŶôû®«SíÌŒœ»#1 Cd…Á35o#‘¼Ya-$&š `n®ïÓ~àUz)'Gøw¤©P1*RzÔç†Ùü…k qio>žf‹HÞÒ¥‹ºÃ~Énóü."k$Ú æÑ1[o¿Õe9°xñajÿRÎ>ìQĉ°!?]ØÜ÷„(£Œ~§ð¾|Œacød^X0Üæ^øW¶r`cÄ×%ó?"ÅYØÇÜݘ7§Oc¯Ñáëw]éõ¦F‹9éò\½«OÉÆ”Žkÿ,|¯Š‰»>å…%8Ôj–­kAyº1‡b ã- ä­E•å9†âU`2)ë;)VHšÅ)þeQŽŠx†Ý¹{-œÔnšQ|As±C Ì@;4±G.³9ƒçDÆ€3—¬éç#• ÌõÖˆ,Ï¿³/UTÆo<‰/´÷do˜yG®d*/P9‚ËD­Ÿ‡Øƒ¥çømâÁ¯˜ÊŒË‡yÓçD¼mÕÄ^ý”ãð›þQC¾H246}ŠˆtÏ ïlÍ?È…ú èv¸ŠŸÇ^¤›%éßOIëið‘´ÆFÈîšÒigÑá¨ÄÚÞgCðF¤\Þ°l¶Q^  µzŽìžgó£*Ø=ˆ³lVPe»ötªz¡ÌUÉWqsø5ÐÇC¡;¼(tñ#C‹'åñ aqt¿ÑåÖ&Çl««‹ü£u—8üæÑ­A.Íz »×j zß¶‘‰*4³Ié‘r—s6Ç<¥¨ÜM("x÷ «L¾“ËSJg|ÍÙ’Ç䯤ã4 Õš€¬f›îÁöWzõOr(gÃt…6–êáéðqÕTý?ÚÊcoJy&Þ³­>™t ?7ê5Œ jÊèZ5jß.¼·=æÚª?ãfcˆB VŠ m’AŸés*^ô£Ÿ)@;¶ê–Bøî÷jaÞ‰ÕMêB<ÁƒOºñ‰©[¦%"À­C7ÑØóSeù]Å㿯® 0=Ó4b M™^NØô9¢Yê”-¬§'"Ìa&Øz\¶a¯Úðé ý+î²ÃV”ÿøO¸¥1#Û&|c(,s ÐvÃSÓ¬yrÆ„>5‚÷š ÆmöøH¢Íäëúl~-¦Ñg€²(ð& c"lÃ;¸ÓW^¥0B{cv߃`Ñ…—Ϊê–”fdÈ+¹¢F]þ†¯âædá•ÑD’qŒÝ~)…Ð@[V{òbN–çÙö…¹æÄÜÁœ¤âà—ÙèÁwÜÍgÄ'’¢ùŽQ’ åˆ@6¥‹r(̹‹¾6PžVØŠf 3g}íÅØIu¹WsàÙ‰‰ ‹”hhÚž~½ƒŽe´hŠæœ ñ…byà4 0ìœ{’pÁ1^`48—iH^yÁ7ÝìËLJÃ1ž$ñÑÜû>^Ø»_P?"ÿùBÌÚlÉU–×›ÏÓµà%r'Ø3µ¢EÂ/ó§hÁïbBðKtǯ?+=T×,ŽA4.N´å6zÈ>® À‚ØsöVEgïsQ¨þ1«-.8aZ}DGPBè¿7ƒlà’…Nã* ôI;ÏÏÏ!Š}ÏOe.Èåíù€ughõuÚÌ®F<¹ x/Œ Ø8½}6SG3e«oTRÒ´þ°ALÇýkŸ>‘fÔ®êÃ|wûa÷„aë"kñþ¦C¹ÆOs¯5÷êM@KKzñ±ôK¡uj=Ig=ɦØ`ÜF,èXÈvj¡.†I§¦fQr‡› Qb—Oàöy2~Ш$ £î@S©G†žé÷¯ƒÜ Jy†CÒíãsk@(G®8íœ+•RàÈmáêÀ|o7Y“yáÛ€}Ðx%< JÔ£Qå°¹d5§„bLÒøÝ $•=šÑÿ9=»‰«Ïª¥çå[i§Ocþi^ÅG€õâàÞ˜7l Çó³Å~×ñþp‹Êex'V$¡ÃîÕw3E ¿ÊBìÖ¤u%Ì}í#†ˆG±¥°ôù¥OýÕÁ~Zž‡©v’\ðYª„îÓÞ»Ìõ– ´·f!"ÿŽ­önŽAã&zÎÚ\(Á—´±…f„×â9˜f‹¼P ‘7@"®ÿ`'ŠwÉö°oê`)o/øý†–8oÚq*ŪT™ ‘Ì&ÑäÏ ®Ô*ºÀ5^×+5$Ê2øœ¸5 5Û„ øý^Dí\¹p º‰H°)¥S¦'få±>ÄVÝ‹£F g{àkÑÂ' Ä¹õ—b—”v9ý´a0Êû½Lˆ¥'¦:} …ßïCÖJ,|D éŸ&ÈâhPò±áAÇ{‹ègà”.V›Sòý&Åhû#Û{ÕIŸ`*¿þ@ráMº¬ ~Þf$Y<š²ƒÞ¶±áŠÙºöInÎõkŒ¿«¯P„¬Ð¿ÉöGxVÄ™Ô9î"[ªPÖ‰¹é`_žEk{¯Ò”ÅÎ#”‘$²ŠemìSžíC\N%ò—öuýkUɾG]OCÖ†{hmBÛögÀ¬Ú4N{9Ï"[×¹£Ñ¹lÁÊ¡àÙ¸ Å’gtaðWøçާ/ÉÀ.Îë‰SZ‚û‡GµZ%À‚@a*Ô%X‚›™¹]²HÚמBÈ£|ßÇé±DÚ´LfG ll„¾“¶(r>S\@l< ³G°Qã¸þ²Ä$V'¢Å‡`br ¦Ðo¬Eïs¤°wxzBõé ’Ûµ\×Yàª ÅÆa&•X„J¾£æº{D:Ã’©ùŒ©I¤·ü)53ÿÅ XÃ%B¶w–¿~£vÔ$Y1üriBn¿wHßNU.fÞv·Q‘xÍÑhøøÚ`° ü.íù{5ÍLõTØbøë¬õp¾B͹Ž[ärÈ—rþ²Ï{9 Säç­!Ð%Ékr}ÊŒ"—AýœÊ7•ä¬éd>éËZÌÕnøX üÈÓØŠÝ+v]5Iç"*ð¦¢7¶ôŠV&¤µÀc1\_Ü1¿IZgPú‚å)–¤ôâŸ5«¥–­ýnCv÷qT¹íz%dÉ éÐIzA*^Šm†BÙ±q|‘z¾¡#1/y¨-~»ñº³·PgöÌC©Å—ÇNZÃÎRð÷cJA T¶—¶>>ðÖôy# KsoT:ô²‡©tÛ¯³Ø©w}B¨ævçöVÖBjåÙ÷Jòë½*![>ýMÐRüPà}]+Ui—á¼½; „Êó±·Ð:s>_à-¹(‹vyÕ«»ª¬U€]I’W£1®}6ŽÇ9–Kf³dJròŒ!P"†Õ­±ë@(º¡I-J“1bà©ëÍ£e””§“ÅK¤¶`iàœî{OŸ×ß}eƒI¨ó‰ ´Äî<:ñ -»ðR¸Â$*‰dÏ~Däô5·(º¡ëªZðq“FqúÍ9VZ+69ä,|õó£‘ÅÚ;òËtÀ`2]*Š u'Ã^x s}ȱâl‹ˆ«i+Yü`í8E9ŽÆ.ÎUi¡‡<|Ô:Þ»½ÂóåªÄŒ¹(HËížÛÎyQ‘?NÙº6&áÇûaœ&Íý㨓aKP£ôe¶L¹8h†ä¦m~J0Ùl½«®™5i`Ý?’lé†1ÕPˆ]ÕžÄg½|hïý¨f–8#Í…~f@¢äß@‘^¢}w=A“‹ÊÆÕRÇö=´;r@y–½ƒ›òÍá`ÕD¬Ã®¿òæÐþyÕ3e²2ÒD¬5%i)…_ƒ¡Wàà¬!Ž¥‚22ÈÏbº½!íjý€üÞ1ÑuŠ@ÞmZ½?òéÄ唌/§€:Þ<¢|=Ø}•=ȵÁK%ÍñŒšý>Ÿ¦Ëµñêé“d6Ö ]Ϊ¤¡“¨hM »`M\kgë;Ç×ñ•î’“iãXk 7ÙýG?ô½`!v¯È{iå㽞½$0ÚæÚ)c¿9rºç¢#ÐIÜ¡¼m©¡_¥ç)w#/¾d¤Rñ)Ic¾½w™Æî¬€OÜQìôº`qdô•$¿6¸C15?\`€È±¬Ê ¿6sUÃôµT‚GkýñÖÇÈs äl¾uw¨¦èÎ'гõ`”m=Œ€à® • › Pé¼*KÈ—߸}âL!CK9ÊqÔE8~N~Ôõº_$¿{?´Í+&¢ –âÁh’¸bÕxRq¦ÀÔvİìOœMïíûÓÀ¹f4ÿºbë£*`O%r(Fñ Ÿ“ÛIµ/Ÿ-{8œ)6*2Õ¢‡vÖä*2Âѱ¨mŒÓQÕ=ÖfÀßãÅvv®ÃR1ŸÙJá²üLÜPÖIkÀETÓzÆç"ªkt‘ðÚQ…W·Àü)¢Ê$Ì-žÛ& @ïÚ,¤×Ä5Ä ÀþÅ·ˆ¿qçd`ù/±gõJS‘€¾;ôÝâ36û‰è(L¶ÆŽ6E“z2€ømACšûÔËñs$ìîq„êP[þÿ­ûvðé*+ Ó%ërÿÔyrî‚*µÂ]O°–ÐDýTP«Z)Ñcš]»†Ó7S­am‹®|À£T¯€ŠVò†#ÃaÆ6ríE;*s z‹ƒ¤'+.†%g¯®KsÙ;[_ŠR|9X X¯,‹ñ58Nëúe & Œ ÀN‰Gù§¼2‘?°´¡£‰¹Ü{K,ÇEœ»÷~ù^ëúÙ–„¿Xúù±“ã–ܽŠ$cÛ=†‡»ÈYüì9Ì4'õ »Êãó0“‰¶hÄïa4cXTâ˜OÑ|žàHCÁÓÈrè­Ž´o§µt§ú´ÔŽòœã„”+ü kl¿ŽMÑÌl;íTá-|Ê0|²sžáUT‘UcRú² *!klÍr#ò퇻‘N6ùªQzlÓŸk°g•­ ^\@ÞÆ"×ò¯›øÜ6çbƽJf«‘<™lØyÝ[žl]1búL ÚzÂY$ÜØ¦!ÛÑ\ÍXþœ®°æqÀ€e ¦Mºxd– A.kYQŒ7÷w´¼ÊÎ¯Š¿„ŒYõwE’Ço©èf]¼”qIKåÏ|öë6lP$y7f`y–!®Ø…µrìþͲýÇ Æ¡IÝzÕ¡^d Œ´ èjDÐ&Ž‘k_ŠýäÝ.@gº·ÌSæ=µ€éby=$Ã@.ðÚù.y×x®ÑrÂK[;àÏ©(ÒæµÃõ(ôЖ í[(!Î’! ŸVn—Q>¯QEµû“JˆÊY²Z=(Bä¬NdÈö‡f9ÞËMòi ¯;R"è‰P( ôŇªrz[áxÕë8Ë÷ ×_ucçø#µ`ê1)?4Æ?;Ô‚ˆl¼‡ d «ÉîƒÕY@è>IìkMFŒA^Ư”؇gu;©Ì.1%£åÞ-?´ 'ñt»Dm-soL´ëÉn(Òg¼L¡È¦º]¦(1¤¼ÍüÊ®g^NQGŒ¶ØAÓZS! Œ$²N|ŸÉ/Þ,G*&6ÅíE›`Š® òövñ¿H¦*Ší÷!~l„¨"R¶2Ål¡ß—˜EƆïr”ì~ã†W|éŠÓ'É‹ž9 ¡§™Ÿ&G\ÒË|‚»¿ŠüTáUÇ4*e'Ø XÓ’)íÄw‡ùf|XX‘_§Rf¢«Œ\¬ùóõ+‚=[Úì%Lë8×~¢[Öû‘]m>^„ÆÊÇÆóËAÎ…ZP>¸Î«Œð‘rDÆ v–Ü!ÞÿG…l fž°G¢»,ÐLüró+|ýAd>V@Í®UبQËôÞ2€¸’h"ãó'›zÒÒyLY:q²È4Öò0!³*Û7wªÂd a¸ñH¨ä±®°¿évÊk1ããî­‚"Q<­B…$o¦Š;þzJSÄ`PúÚUBé›ëÛ–êOÜÑA°5óGæ¨þV£™3Æ~ÇM–"ÊØçá:b–FÙ˜8‰øÕ÷Ë@eGÍç÷ðz ·óʉ0(úõRèÝ %”¦×yó“8HÄhr9Jƃ¤ƒ ; ¹ÉSIyų2¨Ÿ{Y ©qÄøL±²¹¤ËÀpŸ’Üí$“ßàEصR±¬í(7Žà‚œ¶9Ã<‹$Ùµ»lqf‰^—°7U)6ˆEŠ©NH'»j+‹šŽ\:¦yÖ*ÀñF|5ÇÝ×ÿ'_hNk^»fªKjiQÚ#‰Ð· OǶÖ,¸ÒêÊÙ“/†È`•vX¬~­¼ÊÇ£8U¼éŸ¨·4Ø­Ó©.þÙÚ«Š °Í<­Å+ù´›w%þÿ(í@ÙY`º_,Un9 ËùL©¬¸‚{ýFu%ËBåxä4½«ðv‡|ktÉyõÓ¸jåFÕÏ6´ø1@ól¿ðM”@?eEÐ; >pÜ—kJŽ$¢®šcNj¤¹ŠA¥šSU@ßúj¡!U½ÈUc‰[CH¬Žnx0ÊG ‚šq"&1—¢!³:=°üJ=1Ì«Haì7Ë•{ðögÝ}~Í>ŠïSÉ5 ñŸI%u65k"úó»æÔw˜nÀyÐ šMøiÉÝ^¥¤ŒÎ˜[¾ššŠo ~4úl¿ÁB°!…˜ˆ×†bÅÍJ(,æ\uJšföÑ÷cYÔ‚ªGþª!ú/îVœG€›Z§¹ê¾3h·­S Í'†<™û'>œOU›}©‚` Ël[‰èç’Éšn„ÏpÃÀܹ¨ÕµKÛ2@4kÑ7Z·þ¬äX·yïçä6îí{!áaôÃû½ ÂÔ»5Ù.[½“>/àWÅ/k¿JÂpYŒ»C÷a;­6hÌs6UheÛR30«ñ ²n/N¯Uþýáù`7ø°½eÇס}^ëû-¤ì%Q¿ÜÃ{6©¤r5ƒíƒ×ŠL,‰Ž‹/!vhóÀ<ðR‡@P¼'Ãk÷7ëOífÂÞ›‚U€Ú=e &£°A È<,ÍLó¶ñZŸ¶†6ØÏÉ5áÿ“Êñ6ŸÏ07Ôô²ÀÕ »6>/qiÞ&®w¤ì·ò7õ“ôÓìüBáÀ’HñxïÝYHQ!(dPÝ6Ús¹R:ùAb?¦2¿Y»Leòä«ð0ó’DQÿD2df@› JN”ø\9ÆXÛ¿¶%‰ÛôǪ'7±+Œñ§–¼É( å„ü=¶×Ì­ ¸:p.çÇc ùö¸P> Û‰’‡ÂûIQf§VZQž<˜|¢B¸>Úüç»ÃBLî«5– o@ÌZœSü‹–ÀÝ΃¢~?8´j-t1,ÙµîT|‘‚J"v!çV¶ tÃ8E;É“ Å–mézäï_Œ)WM³ŽwJd¿@ô;;»]0é\æU½ÁÈbb——üÁVú1x»œA†æ’HžSsv ó±œ~{Ø"cÖ>`Œ«ŸUpQºc'VÀ9a’Ë—Ä>ÔÑ;’[çR ˜RlJ<‹¾sk†/©Suž0›ÑF}‰|ÜÊtã•â µ‚L®9L,4âTÁ)<Ü¿š¹§ÿC¡'•p±K ì﯇gµïk9‚ 3ƒ ×åE¶{#w0fÂÒÖèêÕÕ%ʳû}¸DÊÇ–Ugª àÃqÞ9Ö…õ“㽄a¹TèUî÷"L½7qní²8ßF23e{<õ ›È¬“ßƒÏØ%]Y*'ü%à NPË©¤j‹â=ÌW@ ÝÒþÔ1g÷TëYù=ÍÓ½drÁì™È¼°U>[øÄ7[ÿ½$ÓôرÊÞx¤H϶oìãˆ|ª'žMËÄàÃ"*‹`ž§óbL6?LÄKñÏǺY[®ÊdoãS®×˜ïñ«3>•§—­ãa—§5¡¶Ô޲⠊ 6d†…Èz€ŒÒ*ï”ädX¾âå: ¾ Zh2ˆ~hƒ^¨Ü„:gÓ«S÷[T| Qˆ¸PC™ TS·žœÇð¡aÿ²aˆŠZi†°bÀ®6‹€vcϽk¤d}ï§!ñ^l^ôNëÃ~`¿äË'™<Wy”$§sîÝÑÝ=³·”´î”õÉ5ÔÝ@IíQ Ix¯jcÙ`,]j-¾j¡Tˆà®äl"_ê°‘~ }Á(„†XnFŽ öv1þ Ⅎ!ô|vÃñŠF/Ÿ…€Ôм0­5…'óèò˸K˜,̹-ߥüù”oû… ßÔÎm ÙÚ^?"Wןû45¾qZýU´ât`yùâ+1@…‡¥Ö×Ç}LX4‘-o~Ytk´ÃXc¶ðL÷òÔ’«þ-«ƒ´a,øÍ×4Á£‚iä¥L n †]9E{ž‡q7òS¦¯>³~· à2òöW-P«f :d°BìVÏiÓkÅö`¹ ä´ü"Âp?€€7[)6 >\†ú)c}—  qüÕsfOÇûñ†j¶TµòçáB òœ,Õü ïÿ˘õ÷>[zFá¤ÛÅaz%â#Ö$H³*¸‹¢½#*=¤ð,–ÏÙÞ¤<Ìkl—€·•ïÃ…¹ûªBëté§õÕ'‡„U’fó¨Žd¹‡›ï­æzê-„”’¹7¬×éÉ/€hFµ­›È³£5›'ô«ݹŒç%³ù÷«§ùm§Ù暥LdJ‚yU7Ç\Î{'<‚‡£Æo³ÚŽP0Ú ‡wépÒOø¤¿°ú¥¹o+æhÉù\ŸÁÄ£‚žiØô#¥(ÅIÿ uNìã\º•u±•¡«cIä4~É×À¹,F»Çÿžª3Põ&°KÖ/:ê6M…½,Pù‚±~ŸÌDóz cžXÀgážüî­›Ð(⣚ˆ'H3÷Æü N;Û]@_=馸°ÐÆOÂpYÝÍ);P°Eoü]0«‡¶²‹TW]iç?T3]÷îâJA™…%iÙS–š)\qŽ©™{TœˆÓç|J1sCÖÖ׿°bÀ`< Í…Ï5cguy‡@õ::ÎŽÿ³E*¼0¬PÙ‰>áC±åÒµ3"_’ݘ÷"Á²Ü—†à*UÆ+Zê;yΔu@Èþ×Á5ü¬†xîkêf45E¡žðuÌÁpºÖ‹Œ‡½¨ ·ñ¦ò×A-ãÄáPV+d ÌosìJu:uíÝ|¼ÃÇr˜]¾F¼°—h —™g­*š9„Â-è~Ebžájh×5šsiÎÓs¡ª O›7/øj#¡´1:éV/ÆüDå¼f¼äý@®/–ÙœvJ"CoÆY¹a|ôzlgL÷ÚµQ·u|=Kš]¹=ú<å&ç„ÕÈ„¤­Ï#ˆÏì¶Ì"µ˜(Ü[Õèw‡õªUQ¬ñ/NN·„È+ßcÌÿÉž·¸ó˜áܸá“pŠ •X-êlñ;0p™£ú¶NõþlSë¼ÐÉ3ßýG•†Ufg6Ï}sê©å{ŸÈh’P°sµÒì¡$´ —Ý"j|Ð* ì/´9øh–Œ¶ûå\8,` e‚ÓÍÿÖU»VIàó‘•i›à02R*Í EsÝ,aµËÆG?kw+QMW~kK¹Z{-Ódïg¦« ¼ó†$N˜æK}¼ %—®â¡ÝNÒn§ÉŠfáOô^øS¥ ½„*"µÞë d&7Ge ;½é.9•tõE~$4¶§[œO£Ålúœ±GðÊW²ÿ ­v&uœœ~Cû䈺ëƒqtÊ ?ü.“Ñ;…Žtƒë"7óeÈk f½$4 ÚÄÔÜ5RBK¨öUöAHXÂUZü±v¯ –“"Eõ^„éå©;QÜZP¼gïB¬gä;Ò“— wPat¿A3ÝË›þN“Ë?y3oÐÓ3àþ0Ù¼µ:3ÿv°³¾(Œ†| Š=uü6|=ép é¹"µ y?nõkSW“d Þ¼?R£g^p)¹GyS£$ZIVÈ£îA¯1ᶪ”½Ò°‹6ÜG‚Ñ«CÐýà¤-B]•õ"ã`<©b(Ã}d †á„Ù~¿«Úq{JYSroÅ3"þ‘%0ÆñŽ?kOĺ±÷\vVª%ÜYÕ>kzÞm戣[O^5º½’È]ÖÒ[Þ‚—·iéý§o½xJÚ¬òMû±ÿ”-磼š 0#TÊâc†GkßÙVÔF>ª ŠÇhb\snâžö*ò/#ÉÁPjöIÇÆ+: É_ kQ.Qû¿›ŸÌrs™Ø{ÈBJôÈj,}cƉ(\3Ï$†Ýä­Y³ó¶â=ùœ Ķge8ôŸ¿×Y@ˆñÄ,FQ2³BþÅ„*Hv]ohŠA’6ø«Áñ*ñ7ܪ ¸Âý¦™W{~úDí’¬0W½ä3«vèƒêº[ ÞXæÚ |QX¶ˆQTÆ'Ýé¦þöTÇ Áâäxꨂ,N¢Â»pŽxfþ”¼%1ÛÉk]÷âß 9’HxÓ`¨JÑ·s Ù~dŰëêÂ~{õS¡Üëí²_n¡‹¨©íÁ¯hä+¢ÙŸpßêÓJ#‰¦ C’nèxkCkƒ9Æ®S bf`šx'¡°¸“’nk>¶qQRÇ O¶32b}Š!vj?ŽÉ©‰iŒSgTæ“eð»qùÔZ^ƒtê+…Ÿu„ý<3¨]fnÞndG£(Éß …àq6ì\¾SÒºÜg1ð`ÝøUS…ªÛЇ…è{’š×8ú©^;’a`vå®ÿ;é2ÍŒw–r#¸¤Fξ‘-„\œ˜þÈ DÇãys ïD[lÓ*;c f/Ü˰Àf¼½£joA„@+åÓ—-|c¢0?௴ìÁ h‘$”kƒ0¹õÆàÄ]ÿA˜vaßW¬MQÀ¡µªÌ™ D ~3`:u’ù,ÑHdgØ òx»«þöN6ç…ÌÝUÇ»3pVÓìgˆ}þxÚó×þ=«cmUÇþ¡¼…Zà/óÒÜH}è&}2ë„GŸXŒI£T¼vмÐWÀÝ÷–d2]ÿvÆ‹vl¦ÉËÇêlh›‰,…¤ÈNoñi>$jÊC ¶¯¨HgµÔó`‘?“XJpˆò]޶|õ#o§þ³â»-" ’#¨«‹Ò¹ÏH¤üäØYŠj^àØFàÁïÞ?m]F=¥éÕ¨1’lsN ˜æ¦|ñ:fÀ#zøç š93/ŒaCSÑ4@ZÆ"s­m&³o±y€\·Fáw£»®9&ÇîZ£Ž!{Ë# ì[ððíÿÐÏhT¢eú7±%ã{=Åp’Ìnpó^9á¿õ9á#º¢Z8¯¼'Öà—ÜÜ`ØÜ˜Q‚´¤XAÊ:ò+—Åx§ÐZ!R{ %wmÀ’F@C•ÃyFyÊÁ×ýo ó„¥›{_ImAͱƨŠâç1¨0öÔœš)…ÙT/vvB_ C)ªy‘ÍržäõÆ„Á=PЇu_KU.^„ÓpKj!_þðsrÛ¯r/1Oa<ò0IS´žOoµSaçG'"±ÕmRé œØœ–8 o~è²b·´ØŒØÞ¹Šlb<ÐÌ–¬ˆ£®´ÎÐÄZH©£ÁˆŸ[ '~iþ´ëÀ]̤†Õ2JªCYÒà(ÓÑ^Ô:± "ÙG54öÔ–êxìÁ·¤äè0C¹f{Ъ²‘V_ïØ(³¥â£Ò1!y4|Å•ft­ß±†q¸c<Œ¨(ñ¹@mP¸L9½¨Ìº6}@œ°½0Á?Yñ¯s0`ñoÿLò›ûº³†!ÁD0²Ÿ>\·‘" ™©¶Qê¬r³Ÿî‘†‚/ÓkÌÜݬÚM¦AÞî,’Yˆ¢A_QÅPæôÏí | oÏW©_‘2«@Åb]k*¸}â„ÈßZtšfø(bÊíâ¾ÄgzorÍÉÏ,\zóŸ”x)v=]¥ÊâêkŠCÛ‘R¹Fj難ñÁcVÐo‰+|¼‘]ãõü†áÞ&R2ï7Õ¿¿!÷Å%×o¡û§ÒÚR(û™™ÀqpÎ ÔQ9ƒi¨àk<*H*¶ºæIä}Iô­ûjçE—ãÝrÄ™üñ,7»ˆÁ¾ÑPaÕrNOÕdW¶'Ž`•&ºVIô¼}'P—§ õë/Èa€¶âö˜mªèàã¤É='•] =hÈu  鳿֯e=ÒwÃýÅÝX ½õ;<Ü!¨}1öæ®™ÿ#°tËaâH²“ñGaÒ=ô¤lc@KûøH4’;Öÿœ.”Yvƒè §›à­àÐõ©r^îßsµ’î »ÃÊy Ã9b£¢&üg[‚3jY/ìdÞýì·ª¶ ¤½8“dA£—;^J%Í ÿ" ŠS¦îô*ýç<)³6ßÏ|±‡Ü3;‰ýð=q©×26ýnÕÓO3™d˜4¢–1,]p£™&ÔW÷âl¯-÷‚ôK¸KgO­h*w6çáå6z „JwCgêÿó>Yq»‚ 4.…×C•Kƒ)L^)ÌLYliA|c©_A.ìʉì”Ö e aTu tHñºµ­¤u: le#ÓäÚ¯3§`à^vÞ=ç PY/é/Ù1Sž­ìl‚Å :Ó`ˆ¬Õ±c8¤0ÙÉ» ¯¢kl—r²þxWqÝ«Ew9%õ„¤ÕUUá(s í§ß,Õ³`Ò1‡¯sÓãµ)Cäv¾©3»f†?—ªnh2œ‘ÿR2…a™¡B7‘Ús‡ÍKݵ瘬.»èrÆú]¨!is|SÈû4¸9œ]œ[…Ô9[þï…»e³€GXQFÞâL¤Ñ¬¤r`:6­oÆðzÄè¤5uFL…Å 3 Gâ]Ì'~Š"INðŒL_¦¼*ä“ÍáÑÜÕÝß<<ý›îˆÔVt¼‹wçøD]b•«Iû\Õ¿¨“Õ5«ŠÈ¾ðÖz#Tqd ¢°\:ºúÇ›ù¥$¬ƒã'^¡rŠ!2|ܹ1_Ýi¢”C-<šÜɓឡßPobŠðÔ v(•#2Cã±_¥]yÝ}÷´nõ$[‚u<îÝÉÊY¿‘šlÇËm<ƒïm^.ÒOK’«>Òh‹€Ìæ¨=€‡Ä8^Œt=+C.L˜—#2ñ×WúFÈriñµBÄäñ<ݼjï6z2^T«àÙ˜Ñdg‘\'nï5Î<´¹ºÎD…Ýwîó"pS„ÐV‹¢AR¿2“ìÇyúïuP ¼qS´¸<øÑY:OH¢¢ðcÕu‚¢>¾U6—0rˆHÌ…‡Ì—?#‡4¦SYõ™Óº©Xû¾ŸÅ.S$´‚©9´l.ñ«Vç«RæEeo™¼Ì퇃\–‚a±<:õÄ0ƒ…ê Á-Z-.º¯‰4.§)öaU,OpJÖ+$ˆIFé‡[Èõ—X¥-’9ïgSÍ|ÎÖ–vÛ®ïÝÙ¥zÊæêþsx<ÛizŒ€oHé«g¥±yØ‚/üµ¬¨0¬"¼íB|sN®½è¯àµÌ.öqNìŒûêg¤æ—¾NËh –÷ؾ/ß=ŒÈuùü¡„©¶F2E:̪[¡°0+O0jŸ{ÕP™â®PNò^JæW²§êw¼§îâµó[öA5 <\¨´Õ¢3ËvJ‰M%ÐD·5lûOš™6ª§h·gSÏTÉ„@ -cŒé•ÔÈéûÅóVH+_Zf(yß­`ú¨üÎåp­Ñž·¥„/¢&û–èîR'á$ÇÇH³YN7 ÞÛUÅî(f— ±“GE 2ËŸ¤Æäå è>¤ÿGGÛñ^à'L°g£ÎBæþ^¸¨ºh!eÃÅI&ÍQz .L€b—}rã/ Ê!Kƒïºg‹±o´<ð3r€KåÖ`6ØöîÛ6gQ‡‰ƒÔ>·¾æ5r-€Ò:Öó*M3Œ” /88úµ¥;mÏÆK|w­«s~¹ëšxÜPÉì Ý0_‹¦u.6eȲÀÕ¿Fœ,aÓÞ§ÌñÿÄfi!G:ûqFÄÝ[­‡WÞ<ë¢"EÑŠÞˆâ$ÿ4_û­=ã‹4×ìôÃÿÖrwAëµMÉN¯e§°+ö½˜5’7ƒç)DÚ»"D˜Je(Hjò“ËÛ¶uŽBÚš=Z÷?eœ×M{b4oö„¥à8I‘1ôL‰jžç~ß:&U“$ýž¦mñ®†it8LqH.´ñÂõ…­l¦baÔØ¼„'œ˜HÇ-Àòrf:T3d)2*é–ÆJthz§ö¿klhfåóÈÌ×^sDÖÞ¶0ê“/+¦}™`h;Z§w„Ï*yReÓiÄ:Î$×sö@Ææ¸Ü¸c‹ÖºBº+Ck'Í0ÁˆpœY•‹a=ߟ}ŸE’ªï^s%A¼…W-’ÜŒŠi¦ŠŒö¢äËèãY&!õíõÏ©ª×¶Í KRYÒLmºÕÔ];×êµÎS©ˆoÜF¢ÿŸµ,®oÁ)äs9D’Ñ(\üˆÒ &™žÀÁ>¨=Å.™¯œ¾@3WxcbˆtçÞ.IFž$UB˜¦­‘N¿,à{Œ®%!•IÅ$Ö*·öuªžwbNì€é}ÞüÌ0úB¿Ä¨;%a6Dvàf…ÌŒC­4¾â=3„±FÌotõ´@_È:I{æSÏ|’g éM®Šæ ð~ë´Ù>Æ<#Š)²­2S8WE#ËvÔLÑIý*Ͳ*ï3xËHq·Rú‘nž}÷Ü™³Ô⥴›œð$ Æû,å4.õG· 7cÎ 9ø¸ýÌn9$›ÝyXÑêQ]ç LÎM!±Y S»ú8 (m·½ù'ý÷ DŒY8ÿÊ¢y%pg ¬À`U •]$‰l2S&‹$–l.öj¢0½‰c:èD68‹q Ùó šL¶•;gÐcÄzꬋõé²Öz€+­ÜØ0uñ­p“< ·å¸•`H]LG¢7d¡W+Æ Á)^rÖì*&x ‘º¬ð‚©-h®õ}78yñ¶.ŒŠzö1÷A}äDí!šÒ¹<|ïIÎ,D‹WñÔŽAþíÑ#’5z !2W1ã—‡ä*œIh鑵Jsx—~ÐöXi¸õ™³ÙlsHÒ90¬°Í‘±/15eŒ‚Ö¿±Ðà 7½*ƒŸÛW°œÊ*#…ôWP7¾ºÜd_ËŸÉÉ+œØ÷Óz÷NÏic€ÉU¸9üPdÎà—–ã ×]d"¹wúÍÒ­›ãz’@n® ˆ=5BÓÝœÉäëÚq°öÍ `ö6‡Ô9¦Á¡ïÈ«Šýz4iˆe/¹3IÀØV§ÏÚ|Жa ÂªƒA»=Ï®­|Ø1[Ï½í§˜eú8ZŽ^Ø-ò>a$Zø¸o×›Væu-A:˜—è”í-¼¿ê—EÙá2]„çÛÿj¢ó„ U8 ѨÔÂÐíüJåÿ«B+,(öÁà;ÍDz\,„ãlFl¨™:(UⵡÈL…tb“…Äè …4pZpGˆÒ#6?ÀôÛ´9j­–Üþ †¢ ÊøÜ^³C'ôm)2u/ùµ”Çæs²eX¶¿%èUã×´L1\¼/¹wÓ¼LsÎ{bßwZ¿¾!ñ,3k+ß^$eú^èzC `cÔÄsåC†ÊÍ{~#sÉ ³”ä ÊNÁÙz>¢,çN*wƒUf˜•”% _×AQpU·¾~ˆð$EX1ûéÅzŠ`*E¤ªWq’R£?Â}uùÞ±9Š[8‘TŸŽ3Ù² ð!\&*¬<ÐÙö%%Ã, 4’Œ–WUp#T©mWôÊ%\Mð„xÆù«¶ì!·ý_M÷’Ò¶ª¾‡Ø„Ì^ŸôÚ—Bq½Ó¨Ç¾P¬Õ·3«CÙСSJ»Eˆ4K ÒŒR¹õˆé’+ž"ßµ/ëŸ#ÎÔ&Gc~¡<5ï(McOú™“Z_p»ÊªÜ]©Ú{”øÓI<ÐÝ¢üê/Ö Dš V½r=-À7’Õßû”µ^„é'Òƒ³:u÷ã'¯¶8^iæÌ–»YøÁqabq‡÷ “Q½û74øÕ†Ò¼ÇAy_¶yƒÝ@Â5#kÀ'¿ kxm÷Ѳº§¤uë¯Yô÷©y»Bs;à\K´ôþÔCâË… 3Ë%y›[?ï7¸bÔj±Â£'Z2ÍDæàÂ!Åm?^}Ôpõ…&[":xôuý<ëÓZÉÙ ?–ôA÷Ã7_' `æ@ëÑ b²5ˆ“çiøMÉú¡@üíþ’¥]É|É)¥87ã©§¼ñºªÓYä§j÷òغOÊL@£ *•0S¶×[çç*+Z,…±úYn&`óæì°W—Êa„©×’%†á¾} ÁÞ—VU¢<·ê=\Ôï’ÕGkóù€7š>ÞlYÃ"CSD%ƒÙ:hX¼Rä€(ÉºÒæ(9y‚&0þÖÞ´˜1wŸ÷„ÄWi†Y€¥\÷á<ÐOša[?‰æ¾y^$€úĨ} œSl.ûQ:Õ„ÚG)uQ(– ºÔ¨yˆ·“üÀ“'ñr½òlß„ƒ`k®ƒ8„–¥gÔ~@úÈkÃû®ÐÙlt42.ýœw·P¢Ãÿ·?rÎK¹ìL'yíC5®bZD+7ŸnY»‚û6SPè>Ý&*o¼~øN¹Qø'óèA«3WWd"Ûê¹"^…lú¤ªíB#Z·Ô7 \Ý+­€í6äSqV¹ªã½½Ó8ÞvÚõAM°æ\¥8GŸÐ‚—›Ù{t]%q9Ù>È¥³ËЋÉó´·Jí2ÑÇÜûRòÀX2¢²ª¨«ÙàJ…‚߀mçéVI©²NaBãbmkAÞÆà»—æÂÆS(VW‡±Bp§: ü#l:YÆ…2-‘óìÅá{‚ú€¢ÿ°VNRsÇ Ã ”/$psV÷µðK’{. ¯N_ÒØÈᙑ@q‰‘¦ Ce¸ÃEÆt‚$ ‚¿ì*brÜ?·Ó²šÑígã. 1¼é=#²&óC„ìg Ä伋 ‘y·÷\˜½òú'è”æÁœ—ŽgI²à áùž<þí šr€D-ÁÚPsÔ±—»4p·qÉT±HÆÙݺª{9\£€ùÓ‚Ù@2¬Yøë½Îî âWLvG¬¡N`®Ì£]!«QÔ#PIõ6ª<‚'ðnª6Ø/©KnÎDùÈôÿE§Í­ËfÇ@¢>Q½áNÈ‹uk¨,Á/9ŒÈˆÆJ„¼;ÕªrÕˆ4¤ŽíÖ2¸ÕÍ Â¬1G²å=÷‡g6÷ÉÑ0éÀ¸«>ݸXX2Æ¢+ôÂÎCˆÑx ´æª0:Ý,9‚(±él³ Ë”ßØq”ýÓ?°×ƒï‚vcÿKÿ½¸a Ähä 1þðž™3ǵ9•`ùN†³<Üá @`Üq]̯øÁfëõ _äÔШžðȪèäŸx‘ À<íY"ì®[¬A”k°ñP«}¨çgTjâi.Ä ¡T  å+Ÿ†~y^.ɦ(q@ß(€TûnÖöX ¶W-­xZå}íĪöÔhg¯Ð/K¦Ï›*öï'Œ£¬ÔC3øÔň« ²K;¹»¡âÀ2@ü¾Îø("óEH»)×Ik`%ºjÂo}öˆS°Ã.Ù0¾Cetõˆ“Jì@Á±†ü7íÊßOH”Už/òN¸E†z5k=ëð{ý<ƒøJ`[tj>·¶Sö…HßZ\ÝÍ6b›ž&5F[Åð ·<É£áòmm–N’ð„€v«›Ô8JÞ©Äþ‘7xÀ©v0ÇüÁ{,?zÎÃY[¶)ê’H7E¾:x|J?ƒíˆ"4‹=çè•ÈšoF€;ViÐV M†¬ü?ÿÉÞ«Ôè^é:°œ«±åÃ7Ëb0׉#_’nšÞºØãHÍ_.ª%!»"{œ-%% J’•h%[tž7ëÅØ9 ¡\^…AÃÙ¥ 6o +½Ud®t[7¹e¨¾“¨T²À•E)Yáæ¾©Þ`„ñr³‚Bƒë¡cýc†±KPri˜"¼coH)rx±™Ñ®Tñ¸Êœ:Ù³•ÓÒw/ŸmŽõyE‚é´¯´â3€ >éÁâàq*qTôUÿÌ\m‘ÖÛ˼ºvX P"8¹¬P¦L ûË€J§ÃžYÉéäfÒQ‰¯(Çz0¯¦B¬GµÞìãî«Ô±0š@'°Ô5¥¼ßt^Ô8uG)I«XnÑT7Yß‹€Úp#Xb€Äz¹‰ËaõéRUZÐ,ÑþP5€ 'qèD¢è‹ÍtF)úßÑéŒøG’@˜øðÙ}¸¡û/p –"™}Q<«lL{8C ‹º¿ˆ)ØÙ“ÁK˜¿%ÇZ`‡_ÖF?X:”µ‚£¯ëˆ5¡ }ÓÎ–È ñ e½n7¿çõÖ­&ƒPÓb;Uâj]NÓLhšÏÕI^ú^Ë3߀;¦Ú}ãË ¸Ü“Í~ëÊ”Yò&Ýãúà\’’6ïorMO©·6źœ•©_;ƒ#f…;vҩ䲫ƒ“el‰£_§«G·ª«@všoßvkauTI××,ò²þ06d²Ž¯—€9îcðÈÆ|Ïqõä WQ–Kõ–™.Š_çªØZêºÍM7£ïVÉÒB€ÌÄ`Á…5÷ð½(š2tŒ•š/Ïñ_Òt†éæ@wV$$ZC€$¸š®®%+tE`†üÒ^ÝÝë= Æ(òÿɲ¸wbŸö,®ZW( 85` i(jí(S¬n˜´tNlŸ'hfSŸä(~õd0ÅeYëbÔ¢ O5¼²ì¨¿.Àc'm½¿åGHòðhë›x3Ý#óÀ<ÖzÎeÅè÷µâ•@5YzGû°øj}‹Ûä 9a ¶`_“€CÉ×b;ðmΧëÐ䩲uÀM]ÅUNN¨Ž»œBàŠ,Õ@‘öRÔwþwÂ;p£}¿ÊUPÙzâ° d,ÚºG8ö“þâq!àg¥þ¼=Hš]ê`êcêü^SÂÕÏ;†£ÈóÌóNr-5ÚñûŠl4¼£i^c1˜$,¢\Có<³peÚñ<žÓô&ÁK9eújàßlZ¬Aûþõ£DWåR~ßÑEÅ ÊŽ×5O áÌŠhyPÆ{-éÃ5d n÷L4…RÜh#n­­9lâ:È"¡r\¶ðí]´,ÜQ’I£”À-§|{H!Ò†æ=GoM®–ñ¾‹\ÑP¸úiØ'‰‹¾ÐÿsOè:n¤ªîż»¾ d.Ÿ'šHwD9ŠîX炾K–€L!¥úبð ôuí·¨ûˆµS¢µ‡³KrÃu׫–ƒss(¨éæí(ø±uOñ(ž<¼¤š›¹^ºÒí™hôQº“WÕ±sÞzžqm±eß[Û+áÆg ?˜rØÍ@7X«¡àdµB~¹Pî‡ð&0/¢ó¸îRÝ0 ~øA­ T3“ U%ˆ€3|5[<í\³5÷‹Õ9”<þÕy˜¦ŠÊ c¥ž©#‡V?™¬FM#\Éʈ~ j˵–uià°²Š¦ÔHí°Òù—ýn&+ÄMá[fDŠªP´³ Ê8|-Øsd*9r€[>Âù[ãþ'!#þ © ÏÄôE˜9éà<™H/蓟tjVxT ‡^xðpò¡¢hp|ˆ¤d¨­eøjÂT<1ó€×HúÖ£“úkLù|¬W1ß'\g©¬›½ç¡WV±Ö˜òîÐ:Ux­(|ŒÑ3°jàó]–Ò/H#ü1d «°Ë›ÿ^ 6xk ƒðÒo$VýÿƒŒ¦ùz¼õìô“„¤õ8T"ŸóltÝ4„‘'æVñŠkh÷¤`ÐA<ƒuaus!»VaÅ9*ùãØ¶åt«hìß”ª)ïS!é"{'Š#‰´òD•xJ9ûp¯ÆË´9ö}o3ÄF„1>9?k ó?Ù£ÕD¿–Eâ÷~^ùnŒç®}ÐÜ㎼hü¾ d¯×’ ¹w}[ ì(zQdãõÄ”McµGŒÒØ#õ´ÌN8Ô©›Š!'~0ÿöa}|lX8äcÉ̦€ÂU*]{–R`¶¬!•¼ŸJàªýË$|}WFo»Ö¨›^$_=Fµ_ECîj÷§ÿ·H_ž ýØüh]ãp-f|zýiLQT5“¢ñZ(/úâßAg®*‰Öú·ð*Œ±dr¤úsRf,ÚÖÊ#?a0,{ÚHNm"¥í·ØÑ©ä3𫲯BU¼M¾1 ¨­ÔüÎ' 7š6Ïe†h#€2¥:¾æ, qÃ¥_^‰jM<¤¶˜f+fºŒÙïFĬ|* áJ¡Wq‚^M¢%n¢Eaý@xójVª­këj'Q¨Qݰ[„#/¢âÈ|¢`‡òzR4FÇé‘^œŠÆê à­O£zà ¸Lï9X£ Ž5Žº …|Œ”¥nËsõ{4®'ìcæ¸ð å¯A³{î4<Iýt'Ü3mñaÖÇBóA\8¾»n‘£mKï wÃÝ/weÍÿó™KoEâø Íö`3:éW~B(-ðÔFkW¹¢çªf™ãÖ.>­R„ÏDÂw]»MÐïÎÑmµwþ(Ù vJõ‚³p{åq¦µ¯!T ýÁö5èÓ./æ?Jö©iÝJWõ†&¿HÔö©^Fo»Ñ®êî˜ÅMƒV:‘¶ËÓ±ãÌ»'Ü+[õ™ÁjfVi”˜3GyCÚš…XŸXŒGÛi‰bÝ£?hÌ:%.ˆ}AOÓ„‡êõ¼=Ô€úóe!9¢šûÒU(âŸYjï¶SRÞâY#LÈäiúºg9‰ìÃuÔŸ¶Ø f’¬ Û3ŠÄ^÷7E6¾{2óŠ«J[´ÌpElÒµ-J‰(¼¥mQ³„×´ƒ—áÚ¥˜4´ýmè¤ô1/QÒßû[ 9@óÑåGº¾ÇyYä#?‹a‚ °µ¥ j㹃ß$QÍk•9,s8®|‹¦`Ò©!À ›Ò¿í-IŒL´Ó÷‘†èBP9Ó‚¡TÁšÝ]à졤+¿môÁ@V}íO·8w!¿ù¤{POŽ„‰3àòž7 ®J!x ‡µ“‰3û@bÑê!U#ªÎXuîŠÔi)¥b¼ë ü¡jŠ>ã†Ñ»3†D®×óm˜È—¯ý´à3WÀ¨ÂSúí­ÞVƒ‘ŒáÇho»ïÛ.qð+q<[²²Â“»isöä¾c~]ðÊÎ6°mA'd•5Π¶uæ¥-JÌz~E–ý9îÝÖŸlBOt¡­´S’º6sdZîacëý+Ê—F÷ÍÞO¯IÒ½²)kj£¤´Ë±Úq•ÈZE3foa×…‚CÛž'†R“BOÞÏ‘”¸l,ž_£.žÕ×tpAH¦žˆçPœJç‰Àî_$(ßÄŒ'säî9Ï“&vŒ¾ºžð¦|ÌMñ…´ôÏÚAÿàÇ€¾ØOÆ&ŸÃ9zSe&áÊçXõðX™%ÙȉŠWŸ¾q9`J‹ílPHL~™£…ê^—È÷}´¾c{ ŠíÈCÙ“ÒÁy„E0x½Å\§’å)ö0k3^ «•¯òöüÚ¸öKd)üYh‘} ÿQ”=Õß‘oùÖ¢h‰È©ëо©ä/Æ®4´h+8%ɦ äºX kNl$Ÿ·à·atªs²ÄŽû°Þ l9 Ö{´#FWëì¡–Š æ‹KŸœ2ºhÿyB¾X'ý™ËoyñÝHhïgÖ]ì_zDoTÈ$˜ß¯öº~ñµëcÞÂGädÊàid_]Æî¶*e}n‘ëP+×fø¤¶Ä¹{õĘûûÝžHÓ/[YX§€I, õ»ýbD™õÑyM¢Ú°n‚(TïÈ{ñ G‰kÁw¬µ®m&FÌnÁåµù[ò"jæsKS°–Ê‚ÖyVRO=~I}Ìñ>ÂSŒ Ìáhvˇ n§~= ™²ÍYŒŸÇwEàgOÛ‚B_F1%¿‘Ýâ!åýÕkU5 mÊÊrtÔ—òî‰âŽßøFK7SeGm¾×i0õ÷FçïZt¦|¤wSK„ÚMT+Ý2Ôà!ˆ$LGÕ&ÝTÛ3Å{d3¹¸Íb̹FiñÈîýµ¶æ•´ËÉ,+qWj­´$½M´>y¥þ¼è¤IâÑ1`•p‚ ÷®q·]çĉõ•àØâÀ›öœ¶1í:_+4n½?Í—ÅS ‹ á\)3¥ñè†û+‡˜²Ü2|aT¼ââ±íæÂLBêÈj%xÈë BD:ib ´sD 0:ûd¸Ë¡Ù×›¹m)}ŠÑ7”%8íkÃë1U86а»(Lª,ßàÙ<Ç—‡¬iP`âáùu^ÿª¢¸Ø57$·k‡¸Ñò–ÀÓù|1öfº/÷XÉXѬÉ{Ù¯ž×-*Ô–õ8Ð^š¥ÛéÚ†ÍKá祕ˆ-ñä½–+–R‡¦K¹ô²²Íõ¿˜¤t§ª¥+œ¶C[ˆÄrÚF¸B}]!Šú¡e· (þ ®^¯†zA…ªêÈœLQzZ­Ú}×ÓU¾ÜÎÄ0ÿsæ'n²× LTðñ¿o¤i‚©;²rA•ð…®ž7{7|¤N®J…uü²íå[}ûÎ —†vn4©ºUùØþÄ=M@­(dÚ~c-O™·ÊÕÏWéV>,¥dÈÁâÍ^¡À%>.làîgü0±ŽòÏ›y²Kt6û4 èßÝëKfi~/°ûÎá9TVG3’;¢“RY—³#ñdáÆ4É4ÆÄªd S05q˜ÍÎþ¬VõØáQè­íû²|p3Û$§ 3R"½` ïõ–¹Ó«Î )»^è7iUŨ‹¿`ƒi˹Ø~¢ÎöI~š#Š$aÖ´>F)‘%ïÃÚžƒ\£fÐ*i‡^¨/±¬-ò³!PGª.EG£ß ‚¥ËXÏà9@Ô!³,™pF€ðz²H1Ø•8ì@#¬Ô-¡ˆ R L•!oöƒ6©ÌÚÁ ^W×úÜKaOYÂð¤Ój?¡VôƤa]Ü9S†£7b­;êêl|<ø€Uª;Ù¦æ5Õï ÆO~½RÔ|7ÂfÏÙz]+a¿¡’´de;2~–^ìêOLã½sAw|÷_­ˆî2|V7ºË5/¥N‚­•7½ †T胨îöÙhSåªI 'gÆ m8FFhÉÌ sî0<|FS~ b…;}v*yõyG²÷PzZà}–v„‡)Ít“š±Á –ò; *±¶ØJÒÁ)ï9Z†j n©’"ºéwÔ¸1Ï¥V&ã’´?DLœ_Îö5Ã`¨WÑN!zžUR©IMÃÿ*žO3 ^ï ôoËÊN¤¼q„Ï3VõçÕòFûñæ`®7A&‰Ž ÙÎf½fØF5ôšù•Z¥¼@QŸØÓÉLG¿ð° \¡xfÞ2+)éBãd´Üsмÿ…h­vÆÉý#/…:uZv· ò¯:î!2äÞ ™^V1”4uÓ˜Q¿EÌï'ý¬nv‘}pLô(ò¥¢KçÛܬ¹”©®8¬zÚ–)Çœ©ñ˜“Ä ítu¥ì>{™ó¡¾J2l\V¸Ù4hKÙ68¾a®ŸNfÊ‹F@6þ ïÓ¤>¬õü¦Ÿãëä6k†Çi“Ý_©Œf,5·f E‘c›Fè@ ¶_ÐC²Ò°Øß!Î!ßž4yFBÇŒî=ÊsÀ|ÂgЦü¥hÈNÛož¡ÁÕšÊp«Ô⟤½‘3bƒçŽ(‹µœé¤ƒVn• ‰ îbÊÚÊü‘ú÷% 1X™5òå›Õvhí1w}<3«ˆ—àú¬G `n°dö°< KœD&Wñ‘1쫦¿cÈT>â;Ž8Ž2ÆE#¸R½ Iùi¸¸O6]ëº>v›m&¡j0Mßê½$iù¹øçèdl,ü¡’c| ¯¸|Ø ø,B¬žê|{^11€µZ˜|"! ÕŽn2«6±ßßÍåîp +0€6bѤÛÔ ")m㾯×Ú:@½¤cŠ\O´‚ó¤Y`·Á•>À;»MhùµrŽ÷oÇÒ´ŒßUÜ­‰Žj=àL?'µdRøšÀû «gø~Ž®ùù =€kšá´!Ý0-ù髈£Y?õâ>~W1g”&'´úˆ9º£dú?R¦ÆxßE¢ÈÅ«\Ÿs¢å|P¤¡ãr;(Õw„iü,t¢?_"Áb]*»v’cìÕe±oí*iV&Ä¿¦WÄ®ØÂX§ÍES²©•ù‹Óaù"µAT¶$_°’îFßWxÎT¦Ÿ¯!ã0ì¤Bääø&â†Ïø˜)NÍWw¼K¥’šžüîM$ÌlŽÉuã‘Îl&æý„mè4Oþûñ\§_Tm€²7º`§Î  ÁN)쇼ºúŸÊ©RÚŸaÝïý t4³ù£mŠŠ¶~»%3_[\ H¶ûmܰJhqF£å%)£Ž©>-~s3ðÜa Â;ûS\Qïò«‚yñÜ=LJŽ—ÿ²|*À|œˆúÙ7Ê©Â÷×Ä™Âc…4/¿….³ß•Iä˜ä‹UqX¨×4s £8}*‹„À¹¦ÛûÙ½ÌV’.HoBïffEaŒÙˆW$_j²õIšKí ѹµo¹QBÙþ)p­wdïb\6Z”—"A8ññòvá]¾YÓÙ‹^+_Ÿž³#-úeºèúÕ·‰Cw眣†ÙîcK€¡F‘3fAñØÈgÓŸ«bþëòäðÍÖÌ^ŸfúÈjõ`ÐèlÂJSÌE¦Ù¯;âÝ  ÷Œ$xõ1¬ñ%òÏ4Ûòº[gŽ"à{Ó¼Ç>ž=l"uwÄVsî‡PBµ©rBp)h||u:‚JÜaØm»¦¾ÿ[£í«ÓEøÉù@„s(•Fyr'x?Î|=*y8åGUkׄƒ#\Ú{é=1£øhÄÑ,5·w@ ]=Q`s<eú£„FçÙˆ,?ú CG Äi§·ì“8«ô“2 ­{“‰¦,ÑEXCà•öLÖŠ¥U´û;Í]ë±ýJšjŽÁ¯NG 0‘ïÕ%PE@!óQøUÁ•Ã~Þ´%NóŒÇùœ=óO7áV?Úx §{±¦V~hÑ”øÁŬ÷—Ñ“_58 ݲ/$–†›âíʤ3§dH3 ‚mçEt`ÿ„?|„!ŠU¨—…¸g—êâË-Í·_l0‹Z©¥ÛÎE{5„ÒyN§ª."ž® çG­4oÜ? 7!¦I@~ä41¦jUÏ»ÿ‘ˆQ¤I²2†XÝ8ð,ȪÔz°Wo{‚i R”ýþOÍ«§¾Ï`4Beþýâ« +~ŸÞ͈Ȩ(Üa^ f]" 4fÝ»ðÆ8£°ZbÖvíw¢)‚–Ðñ8€²ÚùO¿1÷€P–fyžbŸ% l>ÊÒ8b¼„j':•ý,Y蜵L?ÀÄ ×îÌH!*NïŸQ÷/½Ûn—ñl’£´£pèå~nŠO¹¿»©u:Þ¢#Î&@xÎÛU€¥é]­´ý‘FoA™tG#G˜Æ;竣 Üy¼Ç”çZ.(}Pê;ˆhœÔÑmÁ˜c&ã"S/})!ÿ˜Íi–+ÄáGãPR¢de´¬±‘æõãÒq´–`ËÃxh¦‡Ô>¤±Tc.¨¦Ë·HÒ»DÚ´Á†]î•×!˜_,idÔp¦Ï½žHP›0,óI ‹ȃf Bò gÂÖ@jLsÁí-ºy.;s2Ð…×*HµÏ¤ùH”y@ÜŬ<9ê½üYª$‚µ2-I«ÖŒLUSBœŒ8 5ãŠÃš¸0*$ür5x“²ù*Äq¬G¤_JzÏ‹tuQ;×¼ƒ€A¶ó‹VÕ:H”›¥aˆÃÚ‡¨æªàRh[ú\FýrÕó-[Ãn+àØ•¨Ö¼ÅX«/‹=™È"µ?]Õ£åZ ÿ~€<Ÿ™7],6ÈÝLLhZQ`lP,'Ì9Öà%qQ¼Ó£\ï^uëiJû¸ä&ÅÊ–¾D;âr“;[zÈÙÜ9{Ü 5à0Ý "L;‡@K©ÆÜ’YQAC§ÓzÑüUWÑÛ?ÍH\ {_Ån`2iE£*ÄdxvÐâí`Ñ“2¼Ù²ìݽkG܆¬æY¾kŒTâÜÞcW?Hä,8[y£6;úIZ´£i |8É=}ý¬-Ùß*T lô:3n‡ðýåñÎ0MÙu†ßçØ)–ÅWHJ°‹iZB?âª"n{ÀôvDÍŽdÄÛ†¾z>¨ÿª]b áažqçIÀÓòöe2¨I lB’b5Øä?\½}Â×m± ëý[¯^7öt\¤Fg%5ór´Mg‰±lïG¸ Ñä­‹›‹‘¦U3'Ñ?ˆhn¦ä7fÏy+KÝ.[•Xæ]fþŸï^I// •Ã_I·r¸P%ÜvŸ@SÇŸ9°eSyñ)/´9Ô?'y?ZCõê*žÆÆOíP\‹Þ†jРNÆSX9Å1&[ŸdÓSØcw˜’›ô1yƒÞ¯ÕM»Q÷·ZK®ÀiÒçÖOÊ^ «u¡Xۜô ;ìö3Ì‹¯îHL !VOYtr­l¶+‘ûÝ|зvè‹° Äáðä_eý¬¬Ùƒ^ž£¥xw?/ 5¦-°ÉÀ{l©ˆÞþ_Ï×À»À·+ê<§ƒÊðAq—g&²`?ûN½)H¢ð *¥„Ú¶¨pH¯gF@cït\ ”…ns$Y¾°wðà¨ÛjJ¾ÈLB$õx¸û3âN/¹ž™ºÆÒ±)4CÔ Ô¥;¹‘Î>TïÝaøŸ pÜ<#o0ë3{#Ý÷ÃÕgûÞ; þ$­1>y]~@¤5ÆíCî>K¹ögu‰°Â̇cÆ¡òÆ–r¬eè*ŸÅâÀi\újÎYý±áKíyàÒB˵5Z áÇ|PˆF E—òþvöñNW±P,Æ©´FL06bÊu·¶ræø…ñU*?¯/ž›kº‚Rä¾Þ‡Y‹Ô‘\ÖÙfO®yš“ÚŒ4›â.„«ä¼æÜÜM£¥»7\¤q^y3S‚ÙÍàÄwÖþ$‘EÄJ3í"WüзÍŒtyC½T NÅL,ùëÎîuæÓ«–q¡SDÐ#ãÉñ„`¥ÜœŒEʉj¨§¬ž‘ì.|0K’ÚRd^$RFÔ£¥þŸë.#nz6è ZÆÄ—àxФ‰"Ùc+¤y!œ–޲K2¿•® í˜éñKI­óO¨¦tšÕùƒŒr—eÓ?’è;t"ï ÿXSîj§«Då³Vvr„≆£@g%Ê|­0_>ã=¾³Lԥдæ!Lò{ ×/~¯u~V|‚tk©Ã\§ò/¢%?åû(þøU z‚öÑ•ÞtS»4”#|Åâ_c9O•'(ùeJ j‹J^&¢³+rçA¨_õ”+Z`£Z%ï¯ïNç)§›5VÜ&: @È45doN+5Ÿv¢CóAd\CàRÚdÌ—LØèܪglÓLHê% `Ú8Å1÷×C¡ @„ß}ø„*}‡ràéR o wîÆK=¶)êûÀy–±÷J7”¼Â ·!Løœ¸†õ{BæhÇØ-7&Æ-Ñ¡¦ëi²ÄÇBx€–9_v¼PUBÌTÆ=T†/2È)oít,Àd,šCãœ8ö˜á48lk~AúQ.St¦Hf“¯ž0fñrÁ„´ò€\ºùK¬JBÔƒD“`éy¿,ŒuCD™yOê£Å4ž-c?à;}>Ìó|(ÓãKA@Û©!Îõ%{4f¬ö;„5Y³µnù8‘æö¹D!Fiî´{7µÃfÓˆäòœÿE@žüF•¼ñuí]›¤yƒýWoÛ›Ë^Åub!vT9¼Ž-‘ÊaÌ·l|86ô›~šµBŠ9£zvŸ¹Î©9ÔÌeÓ2ÑT2 ™sÀ„Áa½KYZýŠœï¼£´È#¸U_ö˜jµòu¦FM« zÈ$ï5cœì<» ùÈÉßu«núƒâ × W<ŒÆhq}Dv_™Ñwkƒ=ã¼mç aùœKk¨˜»Šæ¸RZҧµùàWck÷ôÅF kìÚ”‹Ø)e…I¹ KKñJš¬`e­†ÚµpøÂ•ó õûþ1ÅSYÙÓ<‘Åõ=«:ó¿RÜöO/-IÛÚE"ç‹ôªÎ™pÒ€géÁ‡R V@¡•B ȸðÛ¾ž³;Ä|ÓŸ6Äê ÕÍ# þrYTüØMT+cÇ*‡fÎ`°Û ÈcÏŽ¿øüI+rùÒs[›ÀçRËÜD«•·æ‰­v°_ù`‡û¯  ²é þ š» 0¸± š#Kïù äôcÕækt|úQ[8Ö¹»n(ó"ÖEæˆQñº”“®DÏôhËÚåÉý¿…Š\`EÂoÚOC\ôÏ7–MFÎ5öÞuÓGb ÔÜ¢%ÊÖ+ šD_‰7L† yÞûW“  ³ ä%I•ÎÅ:Ó¸‰Þoê‚Û´Dݽ~)(‰8NÐ÷ …³´² +:á½pa䓈³h@´ƒü•7è6 ¶›quÎ@ANdhÖ5þ¼˜½æh%ÔdNø8Öïå÷ó4¥E¹¬ûKQ2ü;³V*p$ŸI ¹æž7µ'†éøsLé~~’áϘ8¨O¤Ô¶ÿ¢¯[„~ψþê¶EÒO&ç áG‡R®’®g:B{‹¦VÞÉõÝT®×­¶47€’k‘cÚ³N«Ÿþ¹! í¬`çä[þÓàۊð qPajªEÑ”!¶n€¯¨žlt'h•Fd8<…cÐÑösÔmìÝꥌ€ZL.>øQl•O0>©Ÿí ÚeTdJµ!NU+ÉÂÔk€Ðž!Bô€×®fÉva.z<ž1ì½—’JÃÈX±‚AÑd1ÇåËo¸ð^G±9²ˆF%¬d°ë—ñRáø–:àI]ªq¤¤ù×Nf(ç½K˜ï.Ö®‘7Ó,ãæ.%zïüh÷½P%KFv6CõÐ*ÛÜE…çq(»Æ(Ò>R`Áôì“ úá #ûñ/b¯¾fÿ Z>¯Yán¯–4àD£ö“•©E9ÌLPV·hÿ~^fuÓŸ!çœ$‹–mâ锌8vŸT¥œõ5WÚÔ[S„ Ôß;c&“!Æ9KóÓ—U±Á«‚è½$*FÖ†å!¸Ê㹄j÷vxXˆ§A‚äüÙu3î%1üØÉWb¡ÌGÆYåeNA,ËøäÞç`4hÑ÷}ŒÐ°7Ùþ% É)¢zÅȊƽumaC€–;EœâPÈuj<:ßgJ¶àñ‘ £¾9`ú%© Ç8^»“í+8þŒ“ó÷ªqô·ô›­CH½“kwYLý%¹!i9<ª¿B”øƒcó³QÂ!̆^Ý>öï‚AAßszamÁNçÊ1sû-š›`ïË ·k_qôèYN|M±]ÃzhQB>H†Ö¶EÏñÅÔ?&i„:ÎÜàD',4ôTË´ÊÉ–* VèÐj‹'Ýu«:õEÓ{LeO°¯7¤®_ظ¡Xù($ Š!s%·Z°J9™oûêRžAÒîˆ+F‹PÌ~tµíÊ*QÓQž(v¼»âX[´tž8V•iÂ.»*Äç/Ò¹ç Ã{僚aÍ=]#äy„Z$™0½½§Óqž?EÇ “ÓìŸÎËAÈÎô;ô?´ýÝ‚ãæ§[~Dg¬e¨‘±—;Üú8Φ×.5µãc1Vªî…©:Œr§P’ØgB±ÙzàÿxÈ,!\ô#(íáȵµ‡ÐßdÈ%R6 (¢Ýéî„é¾Ì[ 6ÀâoNÀèžœm¸uáAÖŒò6dT,hè¹  |s(SP¥¬`}g£æåhÚ†eI¦ T‹CNuæ[£€1$Üapx\øŠ}aiÆ=ômÕ´Ù ‘Ž‹(“¢ªrúØø2òçOgÇZªc|šãòÐléš±’1÷@«XtöÉ<¸¹ðÛåüI+G·SS_ !ƒÚþ€Ê-&“dò³†öAŒÙu÷]i1 1i>0-½%ÂODÅ'ËØEë Q8 41W™#eÁ•Õã×v2êƒ`N6¾ði4¤¿ýÈPþnϤ¨ÅN7E‘wó£g‹e¶ÖvÐæÆâ…)®ÂÓxžcÙ‰‡pI¼¯kºù3PkFõ;"jÁšœa¢t‘~îqhŸä¼ïG­tˆUõ£>Ìd.˜N¹2o„t¥y["£#È+4°´Íu º!$¤¦Eóbžk¾E[Ô$-ºk"G%ítÒ´Aü3D©4&Ì_¬]Þ£^ånº“‘«ß»É;ßex‰~7å¤!ª‚Ð0±Å‹* PÍkBú~âv› G©ÔÈsÐï19úæ‡+|$Y¾ ².$éº{äB.Ïf~¬§|ýlX•ü¿„£Í€ö`µkó©‡å­ÙÑoYižŒ©¢¾jGBÇQìÑZ ÖM/@tVŽ͒þ´Í(n hš„òÊ×á†%óó`«À•¼£< ÞÛZFV>x/T®ÃѤL‰M{ê0ôl]b¨Yè>Ó…üýÓ´W]=9—û¡©ˆŠ’]^†oP¾BåT?*k~ŠV%²/žÁÃè¾Ð ˜E˜%fËõ©ìêÏ]ÚsP;)®áz¢ 1Êø‰èßûº/ÕozL†[éTèòBQ/:b>Y¡HK¨¨a€#_=ºˆï=úéjQª÷ÊkG•OÕìàÖwE:³÷Uh‹¿L¥ 12‚d>:ìr‘£¼¢;æj`Dõ‹Ðµ¨€=®H¶ËaU%áo˜ÿ#hòß½"š:.|ãî!ÍWßÝtþŽ£Y×1`oÖªDÛ›ž±ð}½V­ÄZ¹ÙMà.™55³QGðé÷B{³ôÖP°ÁVŽ£•Y='æ$Ü’«—ÀöÄ|´bèR²Tcºù©>˜”}Ä^0ÙmÆ–\§ˆ Z ÊIöï-.÷0Í PuìùCûH ;ÿ#2»¡0-²+ŒÕéËÞ¡Á5‰ÃÊÃÒMÖ„Ì0ùRH ‹ên³_×—xXÛ-oˆíf‡¼*J}Ã<ñh¿x¤ò’Ë.ÝÝ ÌëYåÊK@eŸÄ¨YàÛ,ÀQ—7©™æ(W3 =kwÐ%Äjc2§íƒ•¡ºlî˜n›ÚWiFÓ€“˜r¡(/G¢–ÒÓpçÏ©#`ÂÇãLQlÊ·‡ <Üe{D*ÛÎTïB0{+Žo8ÍEzRaÑïÕ°µŽ¶fP³Â·ÿ¢@¯Ê{Ê®ô'0~ÈÁóÒ[ d£Š\ÙÇØ"nU4Pë?ÒåÍBš1i»²B¨Êf¡-5¹á}Ñ´tÔ¯œgæ‰/“l†Ç8œÍçhÞ&¬ʺšŽuÁ6ƒZo5¥³–óš ÏÑX NïTÁE=ùo&ì’ñHÖX¯o—Žd ½»=‚©÷s™Gaâ«t‚Ì"‡$‚»ÑíYáÝF™šY0s—Â}!åZH"8¡ÁT?`K'o¨ ´a®zÕ ÆÈø¤$¸º°¹ôà¨vQ}ua…ËŠ~„VØvxݤ „#2'KÁÇK‹i¬Áõ¸ž(ŸŸ>éƒÞeÿ •'°õm‚S»Ä´Âø4ÌþÈŽPìWn{ÃJz–óS—…`‘‰¼|«÷:…|ªCtJÆOeÈÈ®Gì¹´è ­I!Jõ^´‡êÌòè–e‚ôÅ  ¥Ã™xåÞö¤9¼¥”X€ˆe† <Ïê“ãVÀ‡@PZú°‹]ÿyáЭœ*8· 3L(«á6ö•½ÓÂ1‰G”N§v(³Da%4#<6fHè­àŸ÷^/çMûzÕ\'™Ž&a¬Oß“bE9i/lc-K¸‚Àø"Û|¯ª°µÑÈ æ…}ö—¯­8ß)|.es—:AÊÍ«N§Q‡ZµjN1$Ëk4¤m¸ÂÓr'÷ì5¡ìi+›8èÿPÞ’Þî+]k¸>Ìpc›*ì³ÙG! jö~§¿€½¬àª5’¸oùÛFo,t¢eõæç|üEÿSùÄÌd›?SÀK¸³°]³è ®~9‰n=CÔê6™PÐ0÷¬yþ¹«<w(M•a/ý‹‰Í3ËM*{ÐÖÎ 6å|¸ÊŒ‚$â¶¼EpO™g@Vø)‘dwÉ%7”Œ'Áž>؃¨!^*O?îcñá–b‰fÎUlàN¿!vî+ÍÕIÆç>ë%aIù½¡HIÿÊwÒ%?¼?›‹ OL:3¢nÜk­ÉËxfÑÁ)ùk6èÓ½v×J†G®h›9åÊÂÚ¹Ä'Z~N¬|OZ¶±áptšÃ”–¶øe7É]ðduï@¸¿ÓÈ3ƒVn‰;@G-i×Ò”à5ÖlT“sƒ‰Ý½æÚ»Ó!ì¸ø®cƹø±Ü”ufXPfV“Hš™Ýv ¯`Õi¥çÎé壢sÊ Ilïû¯³ ¾Ke_LÀ]´¬®8ŒÀ:;Y¸Ö2Kž>®Ç_ŽÒ‘t"‚<•†9†™ð…oZß'*¸ˆ¯ÇûŒ¤´AÍ«tëÊMèÎM“ Ñùùš1Q$ÇÒ»ÌìÓÐ)Ã3Ïž—ß?e`bžŽjÒe›æÕàhõ>}½v§MfâÜ¢¿¾ ê—Œ£€ÚѬ%`Lé .Ë•°gŸ\&ƒ­Ov6¿ z/;ªÖ.ºkH*MÔJ@£êÄÅ2m±% z…zI…ùuCD3êý³ß EñÚAdtÞ6…ÆMZ#²æ7|,2,týúÏcUÌïP÷¯9Vâ£î—£EÈa7ÞÉ(³© hAØ-êHÐ%"k³ŭe5<²@¢µèÅð³íì•}œG,æìøÁzæÅV~œ•œZÞ®`v†˜ˆÃîǽO&~ïN.. 2þꈫ0&½j›ŠÝAe#ÏOL:ÿ Ö<0f߯µ™÷ mcÊÌQ¡‘’“åñ—¯²gqEèýºÐ âÆ›.àÒ!ä™o…•ÊQ‘ù)þÕ9÷ágÃ&Mê¸ê2vÐ)㯻­µ³uêûgNo©ÍM´ä¿­=PŠ9ç}[³`"”÷S“"þalòÝô‡î c¥Ûﲎ%IêÛ­ˆ½$í3ቔ¨7_}UZ®6?EúÎNÝÝl^’éÐs?¹˜›ÃZ¿½dј†/ƒÏ‘ãHv}eÚGñ•g&»Ãa4©J_&’–ÝvHcð?,Ú#þÊöÍjp¢0…CÌ'æË£Ïb}ä Ϧ!º•Q×A‰È ÄcœêÔcÚ‹<>¤!kUC÷ך!fEJ3Ø{,v)êr‘Ÿ0JY4Š&¬×ÒÌ‹_R˜»d Ãió¸æhû± 㑆(áZÆ:þÙà/Wú&7Á+Æ?Ó'ò‡?#m{ŒKœ‡ŽÈ3yôî¾ D\µ± hÔ%GÕi{)O}S*»ž“±²âÐP,”‘êÓs0 !¸Åwazaf¡“ð~¬µI”Ôˆ9#»ë(*·þqngYB¯Lj®ˆ§ÓÑ=èoð›ÒþVD¶ìSãuÏøúÍ{ìi?5Û‰˜VœOE‚ÅÓ‚0Õ 2‡Î:/øöDf¦kA¨®×Èg8ÔNv¬;·¿W¬"{p•gˆP°„tÐÂ%~ئ4nb;‰ÉÙç‡ Q_ÊÇ»‚1cí ¨ÅOÝFE;˜NÔýWþ£‡h1ÐD“Ħ`Bq¢.ÞNÇ­ a9· œ..h–w$؈Ÿ*#f2)dr.T xk*Sï²ÑJ IRÂû× šñshµ uKlÉ-¸«mù^I& ø&Ô.ÅV‘´Çü˜ýr¾Ã€âI˜Su-°äÔm€V>ž® nÖM¹ãnÇÒ†ùJ±°®|jŸ$:¤mêx¼”'‚IÝi”üE³oì-ÜÝPü&v¤—Ä(/‘¸uÑWãØGR±#ÁjMõöŽ…Rü@ø•öþs­tˆ^ňLÒ¸ƒh†ˆ½´·í·£þhñc;PÍ n6DЀ]™ÃÔàåNš s‹þèøïÊCHY¸km„ô.Ây4å½-‰0°acÌ”NÄr]!ñÜ/>pÀ›-Èä4)›DAÕxC€å:Sšº¢¡Þ §‹sX¸‹†Ng*ž©9+y Ò³ j@”ÎE³ô„ksaMãn¹¥ÇÛ.]OÑI_I!]¡8EóüÒš9†kûØÀaˆ@$ñüÛwø5m.¶Ÿs§aW ÁÀMÐJY²¹žáÎÂÜôt…û™û½øÑˆÿ!ë»1y™;96ËÏ‘Ùd7-Ú Œ{nkÞ”säãú(X×äÜPlÖ*òŠÑN]"ýÄA‹xì˜× ¨ã”@Ü!ãyæ•Wa6Æ@‰Ôw°dAšŽ£>½&.øß¯ÔšŸb˜k„X¶uö½¨è‡¹Åõm¯ÖÞúÆeÁ_Ö5±!ýþ˜– ¿¯yû5>í¿$,˜ˆ½öûD\jº¾8ä œòß.|À; ZWóÓ2T%ÑF©T©ý½O,¥µÔ±)2ÓkÈ2"nªÒ°±bcÕù Ï¡¯ä?^ñ¹L "õ¤ÛS#¯uÄ[õ8è[ï“=ªÆéŒ2Œ29Ï·³ÀúhTigÅF4FqNÌå±reÜöÒ=ð¡YÝ㓎Õ;šNÓLðWÙ†Œu‚9ŸÙYŸ;x¶-Š/t³´˜ é’õžÐÅˈ-—ÿ;êíGp“šéöÞÕ¥·Ô±ÏÑå¼}žÔ%³q×ÊT{iUÙì—v•S::BlŽs?ÙÅìlIÜ$¤/¡YSþ½q Ôû²Ñý§Mª3‰ÿWeõ xIì‚1½~m°Ì¡sÏœ ‹Eîä œ Éߣ‰ÿ6Ì“—ø_\î4 ÷\GºÂ0n7¿D°ÓsH"×{ˆB‡Ð£š~áÓHÔ/ãOÒ]é6j§,œ;¸0¯5â£Û«5Î)ž#}Õþ{Xµ?'碾£ÂÓD7’& Ip—-µˆ=[d{=w#_Hôû¹Î =XÆ(¹—–gf÷Í„ÛÝKçRš`Óófü¡býeõ*G÷€˜ hDÿ®F÷Ô+\‹Ï¤ÄÕ%Z ©(¼çÌPÑÎtBôò‡(pYÿPŽø»ôñml’ægšìl& Ôkûƒ×ÆÚë|íÁÙR j®|zS°å:£SFw0æùª}øò¶8ñìN”þôäeŽÆ^i¨ñûþhyÒ°ŽôÓUX–ÿh‚ä“ÒâЯœšËþôPXÑçvF›Ic79ë¼¶G”?ΗlºËÖ:¥AÓ¯G‡½ü‡Þƒ°C$)#EèFÄèP¤à,›íÁßJ¢dwúmAHÿ6ÒÊQø5“o$˜V-LT]ö¡§?/仪†ñ=qÕæ³ÊeÞ0iÀº@M‰&úCÖžBkdÙ̵*úçÜ5¹SÓŠªy„f¢©ÒãÑ¡>˯ÉVØ™Á·åc«NÇ5üQʶ+…Ѭ1ŸÜ€‡qLí·,б+UˆïÐ Ÿ¿›#‰™ö`…³ã»Ï -迬6‚wKls©ìPK~WÍÁH¥¹!ì?=y›³{L£A_è‡ÂÍ¡M†èÛØÌÂMlBÍÊ_³÷ïpLål(ÿût§ŒQÂ_KÝ¿ˆu¯$³Ïçeë6ðv÷àãLÔ’ƒ©nV7±ÝßtMØ–¡ê®0j|ÂQÆð˜è¶ €!£À mט¦§1I1iÞäUû²õzG8°`“•àøÒFéóºöÄ]b €®Uwè-TÿüëQ ïKˆàŒ%p'‰B1-o6¿çL´ ƒëºDrÑP#aÖ•-‚,0H»¼\V&-½’L;ûsË„eE6QRI`^Q„».r- ãíñ³üÈGuÉ|Ë Å ÀuÓz,o¤5qcå™èâ]\   T•·ìì‘g7.Á¡‡¸Cà"¡¿Œ¾¥èJÞ0Á–Ù†ÍúŽRª/#½X œ Îvè)ä<|Zùùƒƒ?ÖX”­D+ÌñyýÌ!×Ð_~¸(nÕ¹,á­j§a]ù­OPqGGL×=îìf©‘Cò/ :/¯*FðñÉ–/¢}òª —Öü4´{³ÕS«$# ¥yÜN˜;Þe ·­¥EÀQÿ–8¾e'½ÉMäÚî¼÷Ôbq¼Ü–F&,ç nµh¬$QÒ“ôoF3a_5n]Û–ÛìmI*RãXoãuaòÍi5`c{a•Þ "wt²Ç-ºÆ:'=¿ð7FÓ•Ú>Û4}!’~ûIgx)û‡)Ü\ÁÝÅÉW-º¢í/ÉTÌ÷Ç¥4'Øj•<«hWì-Àÿ¸´Ü¥ÄœýÞclw ^ÖuûÙA„0ÂÉr £ÔRùš_ÐΛzGÌ`%?AR¢‘뇜HŒ…Ðd’BÞ;G‹›eÆO›¶/˘8«¶¶U ZÄT|ÖyÓE°ò8³nÊÕºñÿ´:½ó--Ç (¡(‰h¥ü’E.ÁÁDíxwÖpã½üW÷O:ã-0._Zk¤ÔÑöŠY!á ½xXlwUOŸ7=²Ùr¢+cqŸÕÆÃB¼È0ÄUæÈ«"¹ìKùÉS­š^;Î{ÂáXuÝN™#ÇøZü”ªÐí0Z ãô[ŸM‰žïZ5)]GÈÄP¹PÂPŠJ}ˆA~{bðÂ7I$$-ÜÙ0wƒåO¢e÷ÔСÝœ»ñ§i¹¼Ûñ—]ÝlŸÂf®Æê`† »»HÓ€¢ ôÊûw¤„g{¢´lÙÿsxcH‰ÒgÔÖV!Äß=n Œzÿ#Y:JfŸÀ>ù§ ºÛX~ùÚÌóú¤“÷g푾òе¶¼ÿµ]zA MܨMétJhV# î ÐõîΤ~aÝØ­Ô€#J°Ó:¡«´ê[œaùØÁAnFø™¼&ê þR3ž¥<ܾêók\3QE·’%ˆ+Ó°¿['£ïþöc#fu¶F¸Èå #ã·§KÚØ¯–—ðù:yŽÛHñƒ"0°”NðI²¶A÷m˜Ï¿N4´ Ù­’úÕÒÔ‚ÀÕ½EZ=NÊ-Ê öºRy!ýàÝ‘K?èf&IªT 𕊙´™¿Oß “÷Ó¦ Oo>jãd1‰BHs8ñ‘÷Or­T’®:ÂÅ·@T°¶`¿n%nRS`:†#©ªTkBäG9*«ÏV”^÷€sˆ>©ë3°«Åðkæf7šL„~ÔË7“çÅ´<ˆ]à—c0WpŠæÀ×T±Ÿghxÿ—¹þž™e‘µßT¶ï ¦pƒàG7}tn“ÉæÒ’wœïtÖNxKÉ©r8ƒiœ~èíR¬ÆÊqœW®Ìšœ1_ž­vuò èNâ¥ã\ŸC¼f~&ãºZ5:°4á½Ê¡~ñ˜ v Fä*º’BeêèÚ^%b:a %@ÁRøû¦®Æ‚æyAãv÷Í>3Õ³’´sâËЫ> Õšr{€a¯y›ôO ‚Î.+è@x * ûnÁÛÃ[Æý¬+xް¿Â¨¿2µ½[6Õ˜dVT gÖ0ó2œ´É\ÂËRÐqIyˆ22lÖ!¡S`ƒG–EC$]qÁ *QŸ°"0¸»õÑ5Kؾ â´ÄãmèíÑt F¬K¥QÖÓ+:¾à§2ÞqŸ^4ÇF®æºÚô~ù†4#C¼©Óß Ñò'æg§“ñ?ê^òÚ$ä$Aü¾®c:—W·§¨~7븯е|ÀÎÆVàßs‚'™)êñùÀ›Ê“f~Ü[Ì—‘”¥Oá_é\;æ ýY´ä9åu¸ŠRÚÒò)Ñ(=%/”+‘@ªhJµÇÇA¾û¢ïàÓbÒ¤qÇ#ake àNLý3yŽÿ*%®”â&­_ݾ¹æÕ#_ÿþJ€-—$æ.¥ôféû.i(A-,²!t9´>{øi.¸õJýoY†ÆMú Œ^ÄsÊ R\CºÉîp×ÚªDI,‘ ºÁ*ïØ{n@Rq6›]ïO]g‘Cx\µ¥'„¶sÔÜHÿ ±ÿZÔZ‰]ñ$Aè9Ñö/SÝ’# öÝ©es‡ÏÉLÛ·]3ÛIÎK˜5'v°ñ®w¿II˜·5NQçMoª†*ëQ?ô‚Ê£MÖk¨ XXÂ¥´Õ]ÀÑ“¾X~ÔYÅš÷þÇG´þöh"ƒ\;dtò SIá´]7óî½e"ã¯E;úE ä'TÀ—4ß+]þ1Eˆ-ònˆª°¡å¢á@§ð»VsÞ¨>ÀìþlM†ÆlBáýÒyñ˜‡¿¥x³´X›Qø’™Ýèi€–ßM’߸\Œ%ÕóáXF $¦ä$²'QmÇÆYm`ŽÕîÅMfÏŒó¬øIÆÀ2$Œ9›?_2íÞj›‡%PíëÅ ÁÐ?ïUëlxôKõ!e¼y"& Ó_!Þü‘â^ÔÀ~àTzáß7·/\b’h Þ¼7tûÔ¶ˆD{h9¤…ðÓ_El"Í|䡊ýYûa<Äa'Óë ¥z.Í'ð嫘‡,P&\Uîü8¨~±Û&‹A©ª™]TVÞúÌŠ8ù3ÏI¶Õiócjbsë&ÄÔ?2á©ìàìŸÙ˜zK„(ð³Öì(žAô[‹·RÉ2Œ„æ7dˆci°³;ègÏFÝd èä 4Û?¢»ªÆ£+åÚI?ç±y¥ÄøÊÙÖÄŽö5=Â!·gUHPM w5_Q¯¤–‰?ù@Xg¦?/†ŒüW’^=Îá:|ªöIO©³M;¹Ñ3XÕ;O~Îh•öŒrÔ“´³9äf!ŽM½9:Ø :ƒ°Q˜ú,°Äƒ¬ôÕÕŽ·„Ñ«¾þœ‡Ôryl­Òv€µAm{Yª.õw¥åª‰ýoÒ„ÍiI:EeÜ€±‹§ÙÑ(õnáß®Ÿî•òÁA?ïJ ÃdŽýN3‰@\þÑÌýIy IA}Pdô0==iRö"¯]u…ýf@¨ÕËœýæÏDéC‰§âךҦõ9,wöÙ*²LÉà[­L¯Ú7ÛhyÉëìŠdøô¸z0ç ʓ릆¯ðSh«ü 71ÊNO‡©òl¡Í¤n; D\¥€Û×û/ã 9úÉ[a³TÙèkŽ0NóJ„GðÜT°¸ö˜í/\àǤQ”GìLàã2z%©¹U«£±¾3ê÷¬NÁã–O–Uh'·ì7t6åßɸC2ƒÇ½ØC“j3ÁpÇEbÍFxšC‡%hÀÊg¾zÊʇI@AT¥wäÕAÐ' V76.ƒŒu¦t¤¹0²J\CuÌcìý¾ëlåÔ¾#W\šÛ ¢³¦”µJ@”Eë¿1ëÇ%xB7,¨V\J¼Šx'ýgŠz±ß¦A½xÀÆÙM?ì¹{g@±ŠjQ u’%~»({Ì€Y*Xu„¢©¢´12vF¡L+8«-wëïý…ëÓßµVÌ™;²@Ží³û7ï í·õÞûk¨»äÚRŽu‚$ñÒsžz ¸XÅå(éhñƒ8½Nmøu/ÙñÛþŸ'žJ›ÉðÜÆùö]'¨ÅÁÃÇuþù0§½éaÛÅ…™jRE1¥°hM{Fö¶Íôš:IJu!tްçÔž°ç|—aØO6Ï’Å«#I½&n¿ ÉF–{$"Ó—zä¬0@ó-±«{üÇgum¨0…pŽ@ÚŠë9zê‚zn£ˆ1 Õ nµZ̬ ³'C–>CÐáÿKñµóÙê¥$, #_œL°¯¿ðü“‰ûC£Ã¾8)¹¡BKQS ó¸^ã\¹ÝüFÞ?NǃŽ^«o‡çÎ#’¦ç{±ÇÕÁÜéWWà†2ÀÈ.z¢9À §áÛ?x2 +\8siàmrÛOWVW³ÖcSkªyò%†òlOŸë6ÚNæõ(:@;;²–¥=²r.ÂG—ê"éÞpSm£{ V­†‹”J‚WIõa/E3)/¨yô|Óóá,»K})Á®R•f’äld_@Ïâ¬=Fq2m°¦ƒILà€íŸé%Š’ïšÜòRùéáÕ¨owD_ºÌÇ‹Cõ¸Aÿqš°.B5Ú2ÜjülhÂåàÑu–„?†c?îF¿Ÿ÷bÇ„gÝÇ>m^ü…@8"y0¿qje?£E½_‚_§8\‘.½îÐ +†ß¡¼ÐXcáæ*õ1LmyíøïD38ÇŸá–ÝÀ­Ö`7'Ä„£½ |nw(ØöÒÔ¨À{1º™HŠï¹¯Uh*)6²V”s±ä˜Pd¨Èl ø‡ ’“ÿàl×AËU-/×Â=0܈"(­bçŽJsŽå{špååa}mué,?Ø$9£Ãû£Z¶ëÂt¹ƒz7¯À:ãUyé¨+‹u½ä˜¾Êòï|ñTó?Ö…Š»Ô;&CÁÏ@Ô0+Þ·m‘1Uµf¢ŽçÊ¡‚ÕK€Rs`r»"ÿlZì:ÑÝ3›° úáÐÊ *‰½f¤™+¬ZV Ùp ©­Y hYjL mÁ7ps!w~Wì7?WÈjj¶%ôÏNŽ7}T­XãD©»g>a›ÓYêÛºU°ñï0‡gq7µuMS-v: -_­3¹-¦ÞéŒóµnVžÄÁÆwîã¨ßÚåOÌ2¬¬tôÅ»‹Lm ‹Ð¼Ø— D#PýFWˆ„‘õ å¯Ó•â.'V+µÕðCq©{'žÁ9žá›&maÂöîàŽk-'Œ6’þ#m[.”~ÇW†¨6 J{Ñ ÒÛ“I³œ“k•.KzO ÕUK ])|¢×1ù7qìJD¨˜î¾ ¤N”[{Ž4Q_*¬ÙÒ«þä9jGùڦùÓªµÎà„“_ :Øf¹²]ÙÎ4êöv/ô «¦°CwE|q¤;]ˆXÉ-Ö—’š,é0c&€ £¿žÄäÁPܦ>‰Àˆ,ïP\zÖ‹YD.DóãP àF×߃1\Ž #‹\¥yÁP•k½(•L:í“9ÿÝYä¨þÜÖTúè§çÀÍægý2ßõØ›1çÀ½$&Ƹ»‹F”PX}­¢ñž¢;ÌzðoIû¯é êó§¤`'"3[0•kìçà/\Âìñ 9­™ š ÇUš{f«ì~*ŒyR!š+ÕYd|µImŸN"“Ã5ôñú_Ø«±Tºô„}˜ª„% ÄíÅÝÉó™9@âLâ!¡7°Qäjò¨'ˆýŠÙ>`N&¨8éÍHZ8œÛuæ'àà÷'~!Ýùæ_èõÐ2¢õ;‡«Ùò°=’̤º^†€T^ë¼·c£;°M¼5=´–»‘ :ë£Ã~[Ch÷`J©Àª8Ç#ò‡iÂÙ,šnHóƒbºI“6¡6lÈé—! [þµš‚}†x«<¿càÝ»ülûDð•uÉÎ2ì7ŽQôöik|×a#㑞ðjx„ð{—0ñ„a³Ê@dN^›Ü€R ÝBÕeåÍn™gÇqvÞuÕ¯‡`D£®æÌIÇaÏø$0>Ñ=û¨D ëñ„(QŠ~q¹7þzƒ²~ÜŒ¶í˜Ftt×i±'.(ú"[´a !…y¯¤C´Èž×=hÂ}Ô „¸ä…r# ÿ¿«4¨/]„9 üX9*È…Aavgªîó ³}Þ{m¸öI'ÿÃ[|cd Ïq[´Ê^Hoï÷ñ&"Ò‰qRøkʜ漵lW¼à2Ÿy˜os£)ª ³ÎBm•}9ÜÚíŒ[q&¦Y®Ú8]WòK‹º›Üuô”d$<5^n¥ÍÜÛêÀ!>6®‰#„p(ÂE43hr2²æ1}§Øä4Ì»e꨽c¨Ï +Óxÿ1Çé m¿›X¹EÒªM‹­nÈwSc,sÿúÀ= ?|fdY¯pÅÚ¯sHåDÝ}qg0\á’û¯ðûY”€¨vftWׇF‘õI$©!É=ÀúË#`-œ-`ö,¿€@°…•×z¶u< ðï>9)ˆ—„e`12Ûz%¥•> l,^{ØÀ½Vu±íø7z5Ëç6=X¢˜»QÑ‹m`“iK0 /Ʋé±îb7HûžžµûÕÁéòkŒÖÀP‡TÀ¹#ÒUê{f4þjŸ {ÊZÔá }p)9㣤Âßॗnþ–dM¥¦Ú‚Ö º2ç¯*p½ËãݸW÷~Òé¦U ?é¦ç ÍÜè³CÆ¡0`ÖZ;2<:”ó:”KG29Tè›Nq]ù]ˆlJò¶p›49¾Þ¤Ï_kÙ•ÖsÜ.Âå×ÀÖµÇù«Îœ!â±þ¬Qfê ¬ôîË€š‡ž7"gxúrÌ$ÒÓ‡xÃÿ–z—žð—–Ÿe«öíhVYû%eÿ5’¹ÒXB…QÀò˜~JØ×y’ï$°æ®ß!JÞ¦3F²9$bç>g§:D06¦rP¦ÀBÔ&d]AÒÈ p-BBÂ%2Ì¥ìQY½]ƒ žt Ç€&vU«]ŠU9=­‡è 0zb1ìPFu ¡;ëtÉî­Ä‹kÿµêÌL„û§5²`m¥ÖÐŽ”ðD~ÌÍ‹, ±(—¥-eG°4-”ʊפ‡øšÿiøaêaœÎÐ`r“…TpËÊØ'†VøªÇ‰ÿùÉé~-Ã%+€(þÜÛƒÃÕô3{Eý¥Y¯8˜c„××,Xnƒ¹Í¤­èh‚ hT»ÝT·lªð·Jlù¸§`ló«Ãè±öàN£´ŒÔé’3rJƒ7UñDcãÁ=’š÷Ÿ]Ù^¨D>6ér{Ë®¼+Ùž.†iâ8ø²*%Õª€—8¹Í.î&eEƒk  u©ø¦u|°¬†¢`ñÊ£ð†`à¶"O7ÓŠA]H„¥µÏ\wºfÚ`Î9 qÎZTvÞd„Ô”B’¼,„€ñVN.xr_¬.§Ï=k³t#É5¾ÐuÎÛÈ*>tοX¼[ßóuö²õˆO–n5'ÉÇà ÇA$ö¥[lj Ú‚%™7oÐsæº]¢óæÝÒx‚«æ³o&¼Ãå< µ¹ ÿ"ᦴ‹é¸¢(eN&uµ2'fË׳â“mB½›ŸÑ¨Š’³)ªAƒ?Ãö Œóþ¹âRo­NÞ p¨iS™N¥ì º‘XpíF—VOÎ{¿-\ÏîhÆÄ0"c‹»¦v œo2spòÀcìjÒx&_rêý{B¿S×o¼vC å #Ûœ0xkή;%¥ðz ™úÀrPæœæ€ ¯FWNX°´-üVµ³6Eó.VçC÷—¾k{g§8u‰Ønõ1Õè{bÂjIaé‚M{–؃~Üòn1A›ú?ïϽèI×mYM"?ȱ=€æ é?V—KØWÌÌ[D<ª±Wæ uó‚²_lûÜÚ o„[Ý€‰Ñ¤厇ÑC_rÈrøØŸÛ3Ïo`rô¥aûnÔi¸âÏ7ùÔì‰O- úÚ£(?ý¥Ö±žŽüï—ÌŸ‹Ü1¶ä`–ð?ŠÙEL°äPX»ª˜Ÿ}ÅÈn¥b³F“]ôü4V†ª‹DqÍDœ>|ŲE–IV{eÏPÿbÕ‰eËe{O´;ó׸Ÿo.U ‡™“¨³’8Ù*ÎpÆ{º±Òå·¬ƒ¾!0z”bE†rú™…*wmqÀxÑϽJð¬–uPi ®±ja¡ŒªÄÇÈR«R9Åb‰@ÌÂRƒ’óãsî­Ø²pâ;Ñ¡S›p•eÐDdÕT¿[Ž0¨©TM¸e‚ýèêÆÛ(Wlöa]haJ¿P¬³ƒß=N9‘!Aüò™ÓÁƒÐfþf6mÇ—ž¥õq'ÎN”† 7ŠOÒ(äí]cB™Ðo¬Üœ«iýßÇ8zÕ#á™x]Sb‡Þ°¢V.¦rºŒ¬@*<öÄÔZÆ’]îMÞ£Ý,_MˆYuÚ·7׉0ºK¿Þ-(#¯¯"BqÞ{6)uµÕF±¥xkŽó®¥ú†,“¨í&׋­oì¡RÜ€ðPe®G”T4½o§VN:É7ñeðÄíüÑ?Íü»ëT§—_ÙÁÔ%þ½ áU¹¨XM^•õÍa•§óslOQ ð%3n¸²yßÝôè]Ür=_vÃ:–Q ŽÒêH`sNð’ü=ÝþùÚM+–íìåz45 l7°yµâ}ë…„¤zñª¨uaÊ l0ÕŒR5)H›©tbýªÙ<}õÕÐÞ ï/3óŸâ”Fb*}Œ^ý•ÆP^àªÔZéÕ$èzËû'Êɪe ›mšÛô© “p™¾z1²Ø#´¦¼CöuâïRáñöí1ú|…Ý%bF¹ÿæR2œ™ch ŸjA¹añút…£gªnŠ<*¡ÒL÷ïX?vQߺ/5ÄÊÀÔªß<&²)ŽuâÄÕ1â¬2–®5È‹ ç|üÑ¢s´Z G¿ð Çr Þ|DÉ t¯”JV0#"ŒŒžabåžÔê ¢¶yåI€Ý.^1¯­gHˆŽ3; WíEú”~óÎ!;ž[C˜•Ý;Ì{›“¨ö«² I¾Sýpâ¤äœ§°ò\ÑÒ'\gðGØCˆìv˜›üÙÄïì‚o›¸ÙÁºž—¤ÀɵÜýpõÚÌK`E…| ˆ%ØqìùB ™£ï€'n²Âj$ͤs«æa¸ø×kxÌH;œ †ß¯-"i÷húþƨ. ‹ÈXeÖü³ó‘]©IA}ªðsº”¯ã9ñÌ'«öÈ{ñ¤DÍû×uµ †ÊJÅT¼A_[Léß)ØmÂÌ¡q¦¾ß4º®_œéÅxÈ12>'#ßjYÈÏøÙœ¹uÂ"ˆMú§{õM£a›Š¨ÆU(†/óá¤Ñ ‘c»$fE¸üå‡ë9†žG©*uZgaân_Df¥©…Z4²î’ÀrMÊ=LªŠAÓx“ߢf'ˆ¤½ ÄèbÒ‚=w[XNHv9%}Ó°Cí[œò28‚„†@*dÒ…=¨†5MD­ñ‰ÖÚt4Tÿ§éÀ¼ü(µÚþ–*mû]9îžï0\¿¨ÈK+õœ*þ!õZ[5•U5Û§±Ý;·Ù>ïµ#AÄÑ%šre °6R¼³g>3g¸¸µ„ÎEŒR-å ÆKú&-"*ã*^– ò{&õXï&Ç’Úœgj÷*·DF¶fσåB ã\Rµ6ƒZ÷ÙQ£JØ ãÒÿVk+YÒѤ 5´´öaCôõÑîK·ì"þ× xÃÐN&E*’=U7O›Œ1«q%PáSÀȟ̾ž¾ò6%>0 ‹YZgraph/data/esetsMale.rda0000644000175100017510000016027012607264574016241 0ustar00biocbuildbiocbuildý7zXZi"Þ6!ÏXÌæöÅà|])TW"änRÊŸãXa“ÆqÅjnçj-' ½;ÎÕQˬŽ:„r¶]SŒ2£—]«Ñ:çŒ\.ú†.‹I fòf5ÐÒ=ù6»ÕrVŸø`+–™ö¢”(ª’€)›Udìÿ¿ETEîÞÈFšø 2gÑx+T:òb_Y™á[<ˆWC¶Ý2Ph§ Ÿ‹f•ñäPá=æË‘r7õ´<àìŒÞz¸5o˳(”1Ÿ?énW‹`H‹>}ZÍ>¾"±7Årð1+u^À{IV€°w'0´6r+1Î å^cðªÓÚ_‘Aµéj,b–µ:¸Æ§_ ÷t–³×h’žÔ5nUü vùkªÊ°%ÛÅR !«HŒO9Ú‘}éÉkyp6ì<€ÏèG.þ­¿4ÉDYú„}sЍàö§Ð)×ýã">ÖǛԇ¿Èð. ƒ+:ß5œùÞ²›2ŒUÒ2Ò6`·æš¬:Qÿ¢£wà ñýge3ZïqÑDÌ©r…ËTþý°}° êän‘Àòìx¯é è,¨îõ_3#>×ÓSN™N\¨:é«-&{Qƒžë„G’i(É¡‡ÜÆýr/Ü"Ø…Ö´itŠ{¾Ã¬)Ï4÷x·Ÿö)X«>ãÛâ+A÷ˆ¢Ïû„sþvFè=žEó˜(=2±Ó½ñ"˜—®ÃN&â£&oî܆Fœ’¸w~Üáv—ׄÛDå¥ÞF§WÍ&|Ÿ%’˜eÞÇšg¹²HžR7õÞãBã$º¢™+Œ@ê‚ÉTžd{¶ƒª‰u"×GêA_à—þÃ7 tÕ<ÀÃ4º¾g¹]ÅÊCÖ’^ö¢ X™Ųo *bK¯ÉœbñßŶ¢¡‹ý]Ÿ“_‹%Wcm¼²\× Ù#q>#„:PìÊ'² Z%êiŠóÔ—8âîù””菉óG%‘¡dú}Ûa~çáS·88OJ©Äg‡ýÛFd˜™])}íZŽ>B„½ÇDÌl§Ì—N«þù‰ÐÞ]¸X|Œ¯Û™þ‚úÂÛ:ŽI½×6CqUTjq ýS>éõP™œÉ,ó£œ*ŠRiÒñ­&ŽÏ%mA Å¥G•Ý9¬PMçlÒ±€Ê¥ïÀ+Âö¾b4¥}Y~Íd3½´{¸Q… bn–R:É…¨EºâòG ¡˜êgwÛß“† ý✭‰Å½¿k,X_çÌEš÷â<`¤6Ü¢M~<=gT­@­EÖåÇ´m@ õ–*åÐ ;û ˆè*­•U˜‰“E1…"³JXÛ¡³ä×foõb¬£äC7g®ûb:R3寙/GÙÚÕ†!Eli¸B9M2ÉÖ2]ï9ãKÎú€[ˆZœ0¬ïß׀OÚvÜ(1|ö£ ä’Üå†víͰIäÊ©J0‹KƒÐŒªaj ´¶bŽÞ€ƒÿ[jr<.UÎi¬žô’ifu8œ­¯¡$§îm•œÃ8õå€{®Çþ™]0StŽÀê#f}³ Jj˜:0Ú˜ ?=â–\iþõ&ì”írÅÔ¥ƒüš­þ÷WKÄ4Ðݽp²áâˆóyÜß %ù7Á–±û§k¼HûÁfÿâK9©d„‡úñØè+A÷ÏÝÍ:¶®›!ý%§¯™`®:?tùN98–P0ðÎüŸ‚‰âªw#Ôh§à|¼ v—Äo\k¡þê&"™zbFp|SçÏbŸœ#‹—U¦¤²¬¸§³ÎÙ 2Üs_x•„Y¿¸Åm"#ÃMº®ûN ÛÄ ä¹M”íÙ'‹èÆe[örMœF2¹u… ‚ãã-ùL0ø¢H‰•¼vJùŽw'C* £ÿs^-eØâµGõ#£TçNˆr|FÈö;+=à^8ÆÂ?‹¸6~D•òWüg<þ¥mîLðÅ®ã¤I/J?Ïÿïþ„M•còèAÏFn@àI'Ýæ¾âë6— ÔÈ;Õ¸H\Y "¡–"¢£mD Èlb¬­ž†«ýõ¹ÃDU©þã󅟱r=˵h=’pJiÊ.cé;ÔëΗZSrL€x[ý˜g6wÐ" ü:ÿ‡qÂqf‚2X.óúáqCWNLÝ\qòÓðî^¬jMá¿ù –7ts!¶\¢ÿª+ÈH‰1" W H“=Ä0{͘kw«ÐìãKËô¢i{ü>ôŒí³ÎS Ò’Yâñ+  `ާqûàŠ2ÞfÖcé(OœÚ+ H²­ù=r|‚-m•s:YRÎ’ã¬i$ ´˜0_g}|IWê⯋EŒš\>ýÀš™"ƒ%M^êW*­NvNù¼ŒÖ »ÉjA¡Õ‡ä~BwA‘`ŒW2ΜøšÅ8#Dõ€5ÄfòÄ›Ýï±÷Pÿ¤€Eäáù(F\ª !u[bc«/Wíß¿þm‹°E¡sÞŘ2~ü ‘sg^á¯ùõ7E N¿ß)C¼RÆÙÇrºî"ô©eÆà¢ì…PõÞ êYÍý¬U°rñ@º‰îP…ûÊÍï--LÓ´õlC`o Æé¡úD—Ä ’ÓWæáÖâ¸èÎÙÝò^&.Õ dN˜·ryû,5ZuÄË,,ÿygq™ð*žpÀîXdB1Ê㤧ԞÿG½- \«¢²ÏÉÏIª$®«¥Tbù53ޝ]ndÊ=‚û±„錑£Ì@øÆ_¿ZÑ••£Êk‘oÉ#Ý Os%_ãØ)(i5¡âI¥î—è½ö9æÎeásFwÞþ5jª z~º²óìZT9J¯>³a2,¼ÍôÒ±lâùþó;ŸõÌc±_Âb«eP^f ‚“§Âc{°7îÐÂe¾\Î2hò5p3Päk/¿¯c.«°žȯrÀˆãJá“(Œ»TÚµIˆðFûWÏIËsñxèßÞFî\Íèj(ÅŸ¶ØŒ¸xMM{íj­.g7ÚeùÜÈÉô¡AìÉÁ;΂>Ë{‚P rÚ5ÎB‰Û,ªJ0Í™…²e6´Ð£_Ä‹óörõì‰g¯¦¼ò ÃùS‰*¯hîÊj1y‰pm,²Ër†U‡•/2ìa !B—ÅñTØa[÷µÂÁ±ð &øþÓÉ>3E T3‚ñyw«Éq…þý6½N,¦›L Ðõ 5«ÔÇ0Œ÷óÅ̆ÓCËf5‚,É`ë%ža/ˆVWû¾h¥_¼:š‹bøvÙˆ¤†klÞ¥)~×ôÉÇ à¦J–qì‚Ñ×+ Û1§•ý÷f»N‚Öæód‹1NBöCIÚN+&0»‡øEçIÑþŸ ÑÕÂz¿ pÖ[» M—|ÓϨßñ¬ÊE° u¢`½ƒ~zŒ‰W¼ ƒ ØÚS+`œR°ÊâC‘C·»ü € åj§Pºß²¨ÎÊ·}Îü#•Lp×ݳÈ=j ÏKÝ©øÂ~ÂÎ3¯¢UÖò‘5·µi»¥¾ Ï"BéIÒkk&Õ¶ô$H–Õ#5JˆcPÅ,@A41" bÕ®¥ÞNd;—[Èðâˆë6ÆÕC?p4D~€Ê.ÆI ¢ÁA½û[¶«»jóÏ&#ÕNæ]Ö ‹1€'då ölh9÷ 4²f|œ¢Ð¢¦jcÜM'Ø ü±"3˜žµ¡°#eä!ÏÅ#:Ȉ{TîkeÞq‚é›|ΚD¼˜íZÃV™÷oÒ”8âC´7Ášr‡u•êÄ3D5L=}ü±¢7&žK9ˆÓ»VøoœÄ6,¤ÿ=ϯ–À’M¼¬VìJôeígay>vMlk‰ÙPsoIÓïåð:u5j­´ì­,Þ7^ÜùŒÉQôþðOÁ`ë0Ÿ¥8±íÓ>Y‡:lLDzÇe½mA{^-P¼›ü©èLüb®oÂ-ºîª/~Ø*»W<ºþZ95ªÑuÇB^ÂÜb§FÛ›°(’Ó¶˜Rc~èÝŒðˆ2ç~M)7ÂüɆ•˜qUŒþC‰Åq2é'’‘È­žò¡×̤ý×jJ ʹÖboÄ©å2m÷?’Òû¡m9„vJã=Gù¶ÆáS¹¿´íz Â^ö€NŸ£t{¨ë Û|`zä¯yuv?[‹ 'Œ<|’ùÅx: ¯q¬ÿY>ƒÂé:’6:©H¤„BV¬”PËTËÂ(fÏqÞ´y ëT ¸µÇÕ¡Aj¢"!ð“ŸÂä“Ò!•á–px§zzŒ¶‹º"­úÖÄ=X´Í^ª%LLàU(d â,Ó• p°eD7Âp×£9«`Ÿ*u€Å ®’¯áõ…›$¾ƒÈX¨ŸÌ0v–)*n's-‹ÊΖˆâ°-F˜µ¾öñÍWüŽ^í\WŠ^Wq*öCÞ6ô(€)Â~9T¤MRý·ù°3gl•oM¬‚Ê"Ϥj¯Õ6¥îñgpUÇî¤Þ" IÄ8Q[ï¦g“dEÙHq#‚Ô“ÑP=ì-¥#© žþaÜI¢NÓ¹rV!b ¶øøŠ`A Ú6³Ûøl^†ôûKÖ&,Ÿšå%Ñá^…ÜꎾW“qt, ë®Ì\ÔhÁxi“î=­ ÒÆhí¤¿Ò—ÄëBé»K€(— 7ƒ%¬aä i×ãDS:ôs$®AqKÕ8âÚ²ºPã³¶¥±c&BljiQJ²áÙ9̤¢Þ_û Vç¦ñì Ѻÿ'wI…ígÕp}áª]6på·KeÉS­nãZƒod³¸Ü3÷¥.c¸5Jñ‰Š&ÍûgÑa!nö1FüËŒ·‘¼jäÉ·e¬‚ã÷(£Z¨ÖkÛ8g|!w ¶é1èðâ¤ebnÎèÚøöeMÚ…*BDIÈà”âÅÆ½ªÝD§×f˜|øY¾?Ë *rô)L>¤ü¨{¨BæFܪŒa¦:Ú…¤zl­N4 o”?§kšI£Ó%‘lK˜ºŽ¡þÀž]òwáÜ“=±³"zX[ÓôÑU–µPc3ž ‚}Ï7=‹.ÉD%»4BqöfA{T}¸•æÅ\Ûvç ÷omýË¥qlð2›| (¤Â4lÂêÙ­ŸŽØ_“õ„´3=ÚÐCÒ‚ÐbB@¾Òeœ ܪ :t¿KŠ•êWŒ@vaU(ÁÊn/’›c‹3(0 ’:V§;yލ„ ç$Êü`qE8CRÇG5cÎ :ЗnMg¤_½]†&Ím=³´m‚xï¥kí+ìÑ[ø£l)|4³¤Á"z/H~‚OÒÅÖŽ;ØDÜa]oôÕ,Í¢p…EM3Äé¿1kúQÊÛª}â=ç7™…5l~»¤¥ù¡mˆÝ:³Ý¬úŸu`4|U³HVµ›Úî §(jꬒšŠÿ{7²rêâó°ªu"àÍœ%ø°Ž5}óÁÂ!$™Ý# —#^·ý ÞhŸ¾N¥^XÓWžÁ( JáfC’k«M`j¢v4ô+^ó“Ÿ¡ûÏÛ‚fm¢aºø®ÇÞnhžé7öd¯ã.µ3×~Z[OÜ\>;ØÛ8I…zASƒYÌš.^µm ÏÉðzΞԀ–Vëº]LxVŒˆL¢hµmh#±lÍFÓZ;Ò.Ò¨Äèû_¢o?`×þÏ|K"±ÈT’þmŽn,Eë´` >Šn\ªx•qQ/Ë(îßt°ˆÅ×!Õê^þÆ ºN˜Õz-VÑõPÃè]Îþþä~Ыýé¬\6˜¼-AbÝu#¦ è|Q+mÃÆŽ+1úA…ªôifQەɪ Œ…¬DQôì=çÝ£Ó¨ðƒmà9q‚E#îaSvé¦ô“ýæÊìúý𕹱OüÉi%ÂÕü÷!ÂnÑüú\ËDŒ!ê9•c¹j‹×^»±žfyÝû$P*é¤öDã¬çÒ´6ú,¹£õcý¶z–SŠ™~;Œ#&ul1;’‰¾Pš¸7Æšþ~÷à‹‘< Ʊ=øGz]À²ò¹þäº;ß!ÂN±ae¥IµÙ (M¿FÅP:ìqtž¶b–u¯ -›Y9±Rî€@ú:Æ£c¡£˜vÄÝ%Uqˆç0®\õAô÷&†:28”Û(BtÇùr‚±ÚÐ:µÚ1t.iµšø ü¡žbb¦ÒùÆV쥵2óM\~¾Õ0,å™ º=Ác9Úß«Ùfeà†™kRôŽ?={%öp‚£I+¼ ÃT¿ùöŽ«EàVç>‰§Cœ_g™%ÆÕ|ÊÃ&éP•&|Vˆþ!øÞ¼4pè>Pù š|R_B±$„^à!¸2ïÔÎeÑO•À£ÚuqÆ…ðF5†eŽêV¤t7BŠ=6žGÂ~ÙÖ{§Gö<^¯Z0ÇÏõ±ô²ØNSx;«Q‰”tÐñ—Q1­$ýVœò€} ÚÔf#™^ài¤†¥–³î‘o8hç)‚y‡ßëËm“c9!Âé?]莧ýÿ_†ØåHR%$‚Ù %iªÒN}(¿ [›MqÞd{Z  >\ó×=¥ÊjÏÔ¾ø''Z4ë%f&-| Ѹ÷9h\‰kæD7/7¯€<8þ@Î7ó<Â`&(G³| hÿ y‘&pRO°-Ÿ!!0òm°ŠûÜÓKûï÷›2ñ‹pÓ­R8ÁõÌt浈rD¨è¸zïzZ?U)IÁÀågÞx´¢d³lÌH‚ŠÃR,Ù1£•“b¿“xƒ²×òˆ¦W­-dmºmg®±.Œj·ÝÏG~+NŸ¸)ÎNÚ7O8,‡ úÙdÖý–E2U‹çGïC©”Ž1s‚‰I¥a«¯mâ¨gûsß±léDSI>¿òæKòôvîªYéŠÅMr³sÙP[á¶yß§Ãî<â'–²>t{Z¸ým[“úCE“ì¯â¯ ï%<È‚åûª¢’¬cÿwR†…Lràì$W\ óüš‡º­”}£$M " @¡oÃv8…¡.YÓ4+P×;…¬¯°õ”.xtøê½c;œî·/Þ¦$Æí3¡I£}³è# †ü!ÿÛ£µÌhÀ½¢‡éŽ¢|Î.Tçko•ÈÉQªÕ§çâéþª%zP(ÆVmƒçÄõf ¿å,LËb›½Ú¢w¤•Ý´t “ïM•$÷†îñ"tµŠôñí®­Ö„rî­e>mÁ˜÷œ0# "l.ç ÞãiM¦œ¾%•S²D6˜×'!¦ºA¸A-ín®^Õš–VÛMRY>‹t騄¨Wf”X9£(™ HP'ÂÜ.&hˆcàBr5N“pŒ˜ë“ÏV£'œ«ú$Ê· æ:Èw²çv "Ô¹Ö¾9‡-í|Îé²~NISರµ[nþéÝŽ>G2ë·*Ä0žÜ§k‹QoLPæ–!ðbdˆ×Ó×ÿ%]T0j-…EÈÞ±Ãàƒ®öÆÃ(œúгyPñ{«B¨¢[‹pbj—#;-•6'aIñÓ:NÊJKÎÁECä*4Ï6L[íªõø4Ré)ô—˜ª†û-¼¿›$&6 ýÆ\u¡¤¸*^èaT.éKÇð:Іf˜ÃUÔ0ð•j¡„sZYÔ•á²h·ˆ?,iÅDÒ:1†Ç—£{øì7 »Èó$4½¦ä7vª_†6>¾f-vâ+#ÆMƒÒîBY£»I}ßjs ìL̉1ü‡dÀEÕ†y†ÛPwl[–ãæwŒÈ¸Å*žb|ÿÕ±û?¢6ŠŸÆõX‚cŠ˜B@ZÖ¤¯;àjbåN‘F†–žÅf@Ö>Nèä+ÖÝ×”1ÔˆóTÇizx0VyÓ„èCmHûžÏÛrY2ø‰ê'æD:½ÆfÅ?‹~®ã0}Ieq? ¯|[7~‘Ól—.~·'•Þr&8WuÛ2‰8luCT'nv몃 3¾ÄáiéNy極àKMb_åA „v …éÿmµã&5Õëø5MÐÏíÊGÓÔ§x2~n¥Eàù©·QzÄpÅ«Øî;iH2\šK¡ÛêA•FÑ6 §n#+iKÛ/°¦hÏÖžîÑà5µÄÐjPØr²„Aæ2šc…œª{ÁŒ.·’¡ºl~Ð4ˆ•5wÛˆp"³n˜èD®kܽúSðÚDbS´ÐJû™êAÉäö–L¤Ø§ýKFÿ@²6®<äª'H¤ÛaF2mYÑÞ.ëïyÁQš4`ƒ˜ûÅQÒÛÎb[N~ªÔG[!%ÿõ–Ÿ4޹˜Á,g†‹‡<·]ÓŠÞZßûì,ûlkŠq.(»>Fs›@Úe¢L£i [[i˜pºx©2þÁZÇõ+'jÏV¾Ì5ug¿M Ë{8ø±мØ&ÿº¶;çצ‘ÜÙp¬\þ+‰”qÆôI€o’@! Œ#Œ¸ ‡x4òi+Åã G™;”±’ƒ(8ȺMä ½aÖÁZAâü®]þqŸ•0®OèÇØ¬¢?jp?È¥Xò©ùrÛÊ&ÁÄä9¢?õ42¾ô"2º^Ê—º’ hÀŠªÚôF~­Ž0ªú)C“÷˜¶ÎYÎþ¹Sú©°‚ì $\C¿^N•YÓ¯ð”W]£”„›CÊPò¥‹wÝO‹ éçõçûžŽèÝ$Ün$ÊW˜c ¼z›ûõC˳ 8½“ VñNÜ) 7ʽQÕ1Ž,£tÏ’ElúÇ®ÿSfCÎ/ä1ð˜£w™Wš¶Ž-úÊîçHÉù?wÙXã΀ºÙMµÓ!>J´ΓJ,)>ðê`–b)À…`Ü)#¹WiÃn¶·"Oµ”‹Ú>+?U«ÄUžUËʆvÖ\=)³ØER`Å˺æ@sÜ¿h¶†ó….Å‹²´ÙÄðjaÂÔ÷ª¾ýÛ³"t5D¶l1ÕòpöÔT£nƒÝæ¯B6Q——8K}§JÑx … í¦dòNF-;bÄð„òZ¶Û#¡Í #èC+Ìs'žë/Ú¶‚lJ9;`_†2ÌU8ÑÛ–·üµˆäÏ f&ôn#^•˜ì—æuçÈŸ×wdð"-¿ ¥ÝL‹¿š|RLĤ„áŒÕ"„væ:š ÔB„¾Õ‡vó->Og$ŠÝ¾H”çÑ´žïVH.¼Ø©!àªÏ@½M!Ò‡¹b Løè¿ý × $º‡†¦~Žþ×SëéÊâ?’qüUg–v0¤Sm×”…?¹{>”®Ï|ü¢è× ~tÍðG×À¾õ²*ø8å8ÿ{Ôt þÔtŒH¯©¬ÇÊ«žg—è€Àö»¬°anŠæg‡G‡f3›‰%AKc-”•èzòsÄZ¥ó,ç‰U- N†˜Š7W›r-˜µíìØ<ò˜NR“œõDØì†$V9=“‘ E<¯ã°vY» ;ÜΦ˜¡tÜav`©ªg_» aÌ Òq2Lq  üKúM›ýŽS0‚i²vtî,¡<ßCØ5ß× FÐá cò±‰èmÍß¹ÃU¥¶áz»A§Û7Hü½a€jø¬¸Ç P,Œõb}\™Y;ôeM¶‡xrù¡ öS !¢ÍEÚkí¦‘ĬC™$}á™/¦D„Þvì¶ÝéfCmgÈ¢a›…Ë1+QL¦¨a¼šu¦T3\‘€Y™M\ãW„¡m@¯ÓÓ=¥Û%¡`ŒÙ¦BLèvå1—ô´ÌIÂF¼ó/åh*]7\âß»LQä¦!Å¥ŸSu?ÉÍÔÆâôéÿ"Š:IMFðz®´6º‰Z7šlÛ …¯­oã•Ì|Pça,†pU Ñˤ^Ü„’–ñÝ„Có‘!£ÓŠF*Äb<Ù£2O é¨&n-á} o Éïr[þN$KOKž©®¤ÑÂù£Ê~ÁÛÐ6§g·k`&ƒÎƒvFõÆ6ò5qšï¥zÃÖ¾#ò¾g?•b ÇÚ•;ƒex<„RÚÂÍò§5ÆDê(A€,ÒóLãU%ž )íI›mAD`à!m)4çÅ17ÇY®1¸.ã·°zÙ;‰nË<6害ޑ›ÆÓÒÇ+78ø,œí›"D5…)¡×eë³j>&h}Ezó…¿(‰T²òLi•—è®÷öü • Ìï„ù¥Å Ÿòh…,Í’’Ÿƒ2}ЧˆÎ—MŸBlÀQb™ù#%äšÄzd·ÌWßÔ5ÎÓëÀ5;˜Yýý¢ö:¬0^dªLÃ~íOžû*à‡Ðw2õdh§¥í¤¸<µ[c¥yMöVF#þR´ú컾¶õs$óøê„{‰LòÇd°¿ÔV‘~‹¸=U0¯~Œ7Šä¨×¡–qOŒJkŽdK°ö®4‰ nãV ÷î’MPZn¹}uÐÙ¡#Ó\Æ›&™Î…mq½ô©¼5¤*V'9¦ß––ªšÈòßò±ë 5~iâ9xÊ…°7'ãþ`ÆÙgs0SÏ9×Êw`+¡à`2 D—”¢‰†íV7Pd¯áý}4ÞÐû •…Qû½ŸRm¼ydVíi L­ÿ„7Úzƒ3ýÎìµ?ºŒ:UæøÞ"ŠHì—CXÔ2ªwhgé0]9ÃÉ÷çÑËMôÅ®4¢7˜ë|Àq»D7n\â‹°pŒ®4åØƒ"Ø6ÝMÉæ©«X6¡¤ç€–éøzy{ÐÏ$RnAD}ÿüçÔízÎtË)=ZëhËÏôü`r‘üz™3’bc®7F')·D©UîÛ%ºÙVÙGË^©×½T|PóòíÎ…ܲN*>¾Zì{ÏaºÉÍñD·ôe4Òú¼UB\çù2z4•ѵñ#Ï ï¹Dã—%[Xatz¶\á24/s-ÿ~†€™õ<³úàx`‰€.:±¼s,n›šùo€ƒT§ºžŸíLAV·}¶%”9üò© –—OY1«òì–qFÃn¥ïñf#¨ÛÜ‘¸±[ÓÂùwXô;A£ÃQƒ%n+;7ä„ J ·ƒ¿Š ]P9 ¨xì¿–@4Í%%ö)Ÿwжki¿™—ü#>år0寋IÇð‹x'u“É£Íñ4jGòñÃZíð…¯Ã_Y+uÅtâ¡sï–ƒ æ°ÞààþU¶}+C+ëŠ,ªµš¾öØ»=·Û‹ørLqÄ!¯¦ÈÛyŽÍ~؆ޔœ ·óÄÑ(¾J‘ŽØñ'¤/Ú·gyWwÞq™¤mEÇ„s?A3Ÿ_ƒos(²CÖ ôeš5vf:¼‘"îQ1Âr=• ²®„H<“Îj|(•> -/F3™LGö›ÜYAÕ¥¿ÇùyÚz`@FB ÄnýÄw!j«`E¬ÌTºtÓü]4'¢'Ê>»möùÑÍ·ˆy+UžÎí[uÇ<ÄÂz>\vÓÍmr7˜ Æ|ýß^¾­¢Ui°þáM\³ÆÐ8ØšâúpŽõgœ^#sû”¢¦ðfÈc¸·_Œ÷ S.*Á¤ÚlŠçš”¹vñy ò çéMO‘¥X‹a::•»óÔ´%t ÚÌt)”/sìe<uñ‚f¹ßÕ#¦‘õÒ–µŸtFmþŠ:Ô2*×9€™Èñ<=ûä;»œ*¨ï,“Á©Õu‚4“$Õ7¹=»QË|,ª t—Æu/8žYCˆyZKXžC²Ø¢C}‘¸Th °žPŸ€Ó²KÆTÞ›——BÃÁä ãk1x²õÆ‹˜ZN`y~U´D€WCâê2ð¾®BZE"äëÒpàûÓyçI‘·AD$¿!R•¤{'ƒ,ºúkmTéÜP{ÙÅNÚXwÀx#8 ‘ÐÛ»µ\‘šSÕæŸF¸C¢p²ñgŠÕžÒÛO4üó„þä8Õêexå±Í¥«ÓÚKNsûQN—myñÁ‘¯-M„Hs#¸”X}wÛ’`ç$,èy#³GUÆiüå]WëIÇ0aÂhèrvFÍD›0OøÁ µÐ $g)•àHÞg«hÌXùÖܳèÇìníYóp¥œ¥ ²¼$¯)+QjÞ£C`:yÓ,ôjŒ9LúßtžB¶¥tP| cUå$s*™sìÂyæÜ 9Õž¯k6,‹LóŠ#·ÝCµ´û¿€ù5²tɧ4b9β’­Ãò^,]|h-}}?P\Ê',g:’¬ÆB¡¶^ZNû&ærc‚è]SnàL"E ]¹¥7ž"dåÁä^ËRÞ)tI(?8ƒ mV«4k±êv ð4š¥5i…X}(h©Ñïgm@¹Níuk.;O^ñªÐ¹[óU‰2 2 ZñÞ—ÇkèQhE›µo˱ñÔGáÀ¡›©¹ì*µ°ìEð:Ét/ðJÏÑ&UŽöuŸ¬ýµß®‘~ Ð^þÿó_; ^Åq`ýá„Ú$ rs¿üŸÂ›)ü9Ȥú{¯iÆo¤ÈîÔÙâèÍSWR°£Ggûö ²8vCâbØlucTSL vm“•}•Ô%*Ø t G'Ö˜ÛŽœÜý~Mþ)ÌÓùP¶ºõ¹P6þG½–ÇÑÉôT4ä@^Z 5bj¤¼¡\»)„¦¯Òj$&e‰Õ‘ð i5·i.ûõ%7€Üt*ÏT½S¥Xi[Ñr!mdŒ ÅÛä113O_îp]§µ:ÎÇÓÎï?UKë1ñ´ 0‡ – ÅåÚFWÑ5Ø üpƒ•*mL#|QkóTÏšÔUÉæ_K›5Ücn<ÿ®"aõÚ¹gaïÿô¯‘ÿ«Ö"ú}~³™j7‘.uгû¸ô®k•ÔlrJüü¢ÈPýMhxDó [{vöu@:;ïƒí‡Y´·-ØYyo¼µ!§q.Ló«ùüj`,iÑþÑŒ©œ!Oe?“2ßÃHt]ÔN¡óÐn‘kÀÝ×½Tù;î­´€ÒWÖ?6f0¬°®ü ¸ft=[€Áž Nwƒv—'INãµ»Ç0”´Â‚VNµ_Å"ëñüÿoçt ;É'LqiT<¤=OüðJBc6±‚bŠF0Ø<¾•Hcy´‰™|«(s¯˜ÈËÖGšb»Ž× $:SÁ¥¸›ýMØ{Î_šj×{@³ôŸS<Ì¥EŠ•7¢µDabB ¶@?á”ðÈñI•¶ ¸O“SìÖLÚC©A'JsnÈ¢iL˜z;—ø]‘jh4DÌ´$Ï•áK®eˆËQSîêk£ôßsK &-Êtám‹Y Q¤¿Áy ª*䌰WÞå‚'Mû EšûB‹î˜r£À®C;°^Pjvš²#"A­}Ö*чó„RŽÛ³ >£FÊ¡À¤Íý»ÑŽÛîÔñêïd`§ˆ¢Û›±¿(. ²Çs.‰Bó[Ö‚ ŸmGãœæ%Öê5Ä·S‚Ñ,dçsÁ…Na,õ5â}¹øXpÐázº‘㑎ú6ÁÀÙîÝ¿à<ú0¥·PG¶’'¯PÁVmûóµ}œ­'lcV^¹HÉx{÷-e7Ž>à§{Ã÷LL‚T²vÆ©Ï<¶ h-œ1e”sOlúrOiø’©ŽŒg›t¿˜m?€ Ñ3MJõ¢aâì×gšk4€óÕšâæº9ý›zÔ®ÙãmN:‰€\]ÁÏþ< ÷ïBÁ~žuWP0Ÿ‹ðYÜÂ:uJdæ-™±Œ&SÈ­€Y!­×3œóEm^•Ò:Z"Â(5Wògê$ÝA´k)ㆯ áT¡`„k¯Ù²ÏºrÛs­÷ç¥Ó[,”[>åÙËÌr“²ÞýÙH ƒŽO1¸µwSL†b H3ñtR°5ÚJÞ4žæyª‡!˜˜:‹Æý9cÚþ·UÙ§´îvµðeáJi¼OÅÜÔ‡ÏdÙñæù®Ã=ßîºóì[•ÉqEФ„-YïÄ•-‰Q¨1x±)@¸ü*cdU ‡Pìë“S]W9úBÈù^¼–Vä&°ÌÃÈl½êµw> žƒO-†‹0ïÌBÓý¿h€eà‚Ç]{¢õßw% £øˆ¸IFkzÍé«÷Z±tˆxú|-y",Œ~³-)DÉíòF ŠžºƒÑw”§j7sÌJ—ÀoQò®hïÏßXƒÊþ¨Å•œrˆlŒ4Ћá¶ŠÙý_ö“)‰ÝÙ;)çäœJºlû'è]ÝlAè ï50 –¦"'f‡<)-îÁ>­ä'*î#ª“ Fžoć𫊎uŸ^ÒëˆeŸ6|ÄÝÔ'ÕÁœOSY?ÿþóR_TÁ(âï)Åû£½ÍLyä¸þ¶_=»ŠÃ˜î{zÕ™Æxw-é¯å§Âò^2à‘­ÓU¤¤JUƒ¥v𩚥ԫAûÅ­·gãzDt ê4ié¯Q¤cD€/?˜£!'pâêjt7ìÙ ƒz&T¶: ži£¤9‚t±¦ ™cñ!ÅE§¾)-Í}__áÅ'?™Ä„Òw˜ÕìQÉÖÜíã†á纃¦¨˜(8W®°Ï‹¸’Ï– }qŠg˜Ë‚ŸN ³Â­ÞJ{Ù?SMËêU“²]n;pgø,M¾ŽÔ@?ÀUu ßD7!Z>sŸ/.g¿‰…nñi Öd“P%ƒÒb忊ՔRXȾLá§ G(8ôrOMŠaÒ†ˆ.tâ§™oRÊ&ÑW“¸Î„VcàKôNc©çï`N _¾§ Î¥ÒW²u†GÔIj‹*nígW = EØ>­l'_Ìvˆéø¹ÏHD Ì"?4 šÇ±)Î;ß™Ôxž5†h‰cºÞ¸Ÿ­à™ByµÅÓ‰ÿ­¸L‘Èè ‰k$²¸€ZO«Š ·î ¸o¿½uÿÈת¼©†2¹›…и^¬ï¬#בüÝôø­½èéÀùÈ2®ÞN6¦˜ÈœÿÿŠöŸ{R÷0"9I²²ªQE‰¤gŸš¸Ž7ÈnPíËáif¡ŸÏ¶ c!ÖC¹3C¦`)±ýâðG/¤ëÅ#Ü¥Yè´ÊZ²¸*WRƒòÿk x{Sã«@‡½_Ò†)žU\85dŒ@˜*;šîÂ÷Öö²N Æ¸ÏßQ¥ü~úå1s¿™4 ƒ¥×Æ-C?E”¦‘Æ“\å ˆÓ÷Œô–¬9{Ö8;§w%ûɨvãvî…ùvŒ¼"‡- ˲¶®3åÚ}­:vÅ(.¶íÓÔ…H«Rº æs3U¥žÀéãðÍoΆ¿rÒŸæiYG7Ý?¥²rR žætË ²/!zËî`D3@¶tq3:½®ºã¿:f/ÿòÔÔw§jABþÿ°¬Ô߃pzENk\£u ·h¹”Ö=³ÙTù™Þ–Ÿ¶ ʨ‘CjÔé4ØýZ%šªm_Ë|NI÷ø™Gè>`•isØsðw'qØÍåo; ³ŠÉþÚúGCÿ`s¥R"¸‹¥Ìyx­ø¼óÆc•%vùBü,4Å:¾ÖcEEª#{½§û±-9==Þ-A-ˆ¯O–sæ¬j¯Õ*½ÍÀ®„Ÿ«(JÑæ4¹ñ5vÅ®ýc#€Wm2˜2¤Åƒb±ÙMûu™v£’’Ú—O‰km66¸n7‡“gIî±ÀÿIélº¡p†œÒ< mÞÍ[åe Í:¼=)ìÁûp#@A®mCœ©©p!Ò㶇ćʡøÕš'¯Š‡£z!]Õ÷ƒOþÁv×4®÷R,e¢(Æ -ÐÿY2>b¢rƒ®Û°Ý{®4±ýJœýÎy…„±Uó|rûapÆèm$é*Åå~[°™°‚pçÒí8¼¨4/1]QC*þîŒbŠºfê«Oý ùØöeJkÉáÍ8­-ZiõÓ)+ý‘–íR½ÿˆ)‰q@¤¶ ³Z $4])6ðòä&®v½Œa˜æuöT™Â¡:£éõ4"ò•‹µþ_Wö†„³÷oøýk)}Š*]õëÉlê0¡„/3Êo8¼btk—Óòv#ìâ’H9•Áœ=v‹¯ö¤`ü‘,íxš(¨ÊÂNÓZÆ9£C„ùf0Ó8í„Ù Šô‰Œñd«Ý©&ºzØ÷€†ÂÔTq*ˆ쳥íK‘Y-=×Ùà|Yüøˆ¥"JÖêîÖ~”g‡uö§!èÙRŒ8V\Czô! ÿÜHb^9§2<ÊiBkrüäZJ{§âFXËzªÀ¯ó‰Íðòê.#ÉÌžAêí¯Šsö–¿SÊ?¦°ˆxÙ ˜Jî¨7Ðfš|¸èÝAìÅ X`ô!ÖûèŸK^Ñå/åFLàŸOå´ÏZSw¯Q—¯‚¨ëÑ^!”!QïÉœhyý$“<(Öƒg’gŒw—¸%QC¤ࢳò‰#%f‡í5 Å¡¢L£;VSVô;óHœi;Ýe„Ný÷c ÂS¸)C溘BõÞ§§½.Ê›íê2Ê„¨r–P.1ˆ#w°_·ÆáÓ¤‡Õ…Èð§c†BÜ É èéþ§ˆ°¶à‰c´Ë¹Î}(7 " U&'¨Suc¸¹ùµÊetNþ¶O1eš÷ÓáÍ* ßEÄ¡êyªr\ÏJwTÃýº“1:7pòy`õÂÕð‚ƒBYXŒºÙ©ÄF¨.çIaÆ&ðxcÏÚP7êZùWÃcYNÖ´Í-üÈ'Ì‹ÉRšÑÕdɼQàŸ:ª£Â€Ü‹K~\Ö‹/i¯ÃD¢)ªÇ‰‰?á½Kòe E¢=^šCü(‘€½d¬vê37h(勹öyK°ÓÙi?<ðiªÓ=b–©v]Š#¢RS°éˆéF÷”R˜”¡ÒЈøZEOÌÒ·Ô ²ñ¨¡o¸^'27Gø6­Ó4õMézCw“z/æk’‡7Às®±¤ 3©Ç„æÌ?xÅ›P("´„¦1ߨæëĨúlQ®RKX«7v±B~IÍ †ôR„µPRñÜ(œxÊë:È}…¤VèB|îÔI}À)L.à©Æ_…Ë`—÷Ý©$ã 4Q“+&%‹©þ3CæíºÄªo˜óδ€Y »ÿx#Á¼Ïì(.hѱ1+«Ù€*Daª;ZõùÊwðÕ¸ª)Þ=S`‹ìvU’ûý‚Íos„¶†X(±§Y¼éê`j2³Ýs¡Ü_ò̯ëòó¸ùw•W ÆÓ>¥…*S^,-ý|ÑÚ!HS¿þ‡ê[£ÅÕ.J#Cõ "¬EZxæð$²PÌ—¿ZR Á5¹VÑØ<·?±Â€k… !`d~úV±qÖ=ˆ~¬/…ø¥h\ÝE ,B ™-…5¢3ìòö™( šƒYEmÕH”\“ߊ Q¢dIgóþ4‹r`£ahBܳTÚƒ?ÉZŠ3µ’Ž#-½…§\[ Ô̇€Ä€U‹J†qßÛ\ª–iêóðÿªÄž—$k[)å‘Ão­ögKäÿ¬æ¬B* Ú¡*;¥q<êøÏ´fæ.üZS­vjQÝü8•áM¿»pÏ™ŒÃ¹]‡e68‰¶Ú A(+§xŒ eÙ™XÖÎ30aÉìçb-†Vƒ/i*¼P¢5ó[…èù¡À–ï‹Îvc—R(æKã?r° £ï\Ò°£î¤× ÀדZ^ö{MFNŸ«ˆ¦CÆÌljŠé(á ãD•‡»@t­° ÷íËÈËÖhÔ• [’!Äël¸jûèÛö¹ÖZœ¡­Y¡,^†,¥™dV¦ë3fYHõ(¿îŒ4PD´a½/E;¿Ø†Z¤`€¤ŽtïÊ¢[õéÚч-®nn÷1wºâ0ŒZÇ 4>²“/^©æ¼Yi_ÒVh“ :èÂ4¡Êø/½À¼lñåO'Ïñ¡ÃŽÍh€œ„HYgÏÜ#J‡P—˜2|á·ˆøXGÄSÙÓAzi= s·øÀCÔÒ´ÕþS>”Î÷UÂá hCÝð0~sÖcõW& eæ¸išì=Ú÷n2 øD@‰ÑàñUÂ;‘2Â*`hÔwBzÑ>S'Ìs9R¡=ä×`–.òþŽ ë-”'Ò1lþ6ü™6e‡÷ÃȽ‘TBˆ …Ï4ïÑS÷ôSIÕ.˜ÌhŸÎ7¢!Ç‘c€”¿¬S¤—0ô”¡l§T¾£òÂO¨¤­Ô¬QÀv¢—ÉâbùUÙ!KbîèÌn«ß¦¹+1ÿ5—Qû¶"[V;®˜)þ‚Üã²xï`$)<Wœ1ÖŠ´#€.×IÚ´bÓa8!\M&M:òHHêqÑ%`!âðZMÓ²ññ3vùòËÊÔ”íËÛ®)«lRÎþ<´‘^VðH‘H»dš±†Ãu…àM\M­øu ›êϬžáIó×P2䩱|´z¡ýu‡.ú?J)Qøω(7êÇ;‘Ô–Ow°ŒžÐŽJ*Îò¡ûéb+¢ÙËãm)ÙcbzäÉ´ØR"ú¬óüØ(žžct©ñ¯ò$æÒÅ!§ß'§A&£ß&ò£™BXƒ.¡ƒªG”fçkOm0Bõ&ÿá!e¤ÂþJæûà3Ê8(Š)uÆÑY]Ä"?µ6J!”ò¼*ö©%dÎW\CÝ­ºzE½:÷®Ih ߀-m}ð13$áÓ‚¶û!sGø0ѳ]øI‘ûN3]D,]ø†g–Ì»~lñª—©f³?os–dw3êB!;™ §EQ1v‘|¡gú¾AG Ïx >‰,m¤Õí¸²á­•/Ïõ•ä®;½£G_˜_ë&H““ÞÆ)`xvPËá?ˆðjö¶4àŠóØ[da˜7‹Ù|ƒª”5º\Jqs[KŸ† sR'Å“>ìÄš†%¡°½¾ø#6<áVš¢—Œæñy–}`nù•¯Ý%ÃYUHç.ž! ˆ›þOè gëj—×ó ìÜp#É4>[ÃàØE–¤–¤ªóh‘Š!4D 8fNÀùÈ—Xvo‚NpH*B ìwÈÚíue wèçºT¬ôOp¦=üèR%ŒZРޕJ&ó`Dtª&{v¨3¤¸Ä7"ìÞ㦆aËÐ –âO6ÁÅùN4næOþ¬‚íøï58s²!¸%? 8ôç–ÇâPÝ1v¿ëÛÇ^Ú¯U©Î‚_ÛJU9lí4?:í˜ridn#])VÂá*‡Xäæ«àæó¹¥oöë4±­ã\$Æà bVTA~ê݈Tn~«„R¦^»(ðxØì$ÐJüa«åµ™ý3 Ç…kô³u Êš{Cgß´±Š”jÓ”XMp/<^ÃոϛzGæ‘§zf1ÂÑ§Š‰·ùKî7ˆï®¶Íß}ÝÁê¡Xšvó™^€Aùˆžë0Ñõ…æ”d(JÌò”lüíPY£=„Ü?ƒn«J5q¥•—z6§v7èÀÒY#‰k;Yüâ3ûÞôpMÒ c#·ÛÎwúŸúÆõ.è­Òà‰O5ª$*êj-,ó0_ëÉ ÝÏ­~$–ôb¿b0‰¼î«s8(Ü^¹ÝHHŸgÛrÀjâ&3â}ÊêìÃäØ*‡Üî'®J‚ÅÔtÜ’A«¾é"SC}G®Í§Ä#­«1b­¡5iL†"ãËqž7E>{ jPA²αì\þ³…¿`³¨ï΃nrÅ€?âô™³¼é«jOóέÌ+ã„»Ó¶!¶eÂöh¢ˆf‹.øý•0Ü$³Øïë=òLî§^›W†@äÛòv¼œîç>‹Z°§„Bì€[Lbˆã;FK[¨OŽl6ìKŸ °j–ÇÁ;:™>Ê(¾ˆ‡nåÄήDÊŽƒmè*Î#±xZHeµ²ÞØ÷¥N#CüÑ©-1R{¢N“`ògåH޶c†˜½_â7›ú‚wÄZ~9"=Q€ ›ièf|mäºþC¿Š›—-É)dÁ€¡aOçpvh§C0sFf§¼É mg®¦dQR˜õ¯w‰ßõ½ý1ôŒã«£Æö<‚ b䤹X’}èå-êJ« ùR¯EÉ™p'¶'¬«”­Éó0ÉaÒ¤ðqY<\8E¹íüÿ–Cs5ÃOFʈ¼½“d:=ÇÕ¡mÝLŸéƒ)jøm5e·ÃàÐÚÙúÂH¾¬²Þ]å³2ðÝ­—8µm D ɳ‹rãû°ù±=À¼ã¿Æ€øpêèeæŠé X©!ôû´ò‹ä `QZà10’âBÇ2L€Ò•O¡í,O~ú}jöans)°ÚøùµÓ×KÞæâ2媒ÚÝÆ™÷VßÊ´j†n"TГ­ˆÝ›‡RÆÇØã–Õí@¦à³Ï&r@HrÚè·9 gEî¦å™N„4˜ØkúÕ¿áà×N‹°Šúú²§Ê‘EðšéŽÎ&¾úÍ©b!±T…Ã*¶Ü’ލV÷.˜­zKE³ö¢2µÔ?¶ü©¬‹Õ×G/ªÐáN¬<Ä)ŒØ£î£ØLØë) T 3ÖÆ®Rå¡ò u§OIB·!лoÂ+Œ•ž°‡Yü¯ßçÿ=a™}E¤œûyéŒ6Àäý«ž÷#Ox¢‚ÆY¦ˆ¸á+¼†7ÒÁÐÐ$gOZžÆ•X?Õ„í5ErnÏ{G½Í’¾!©†'‰©^Ï€Îg…UÎ>ÊW·Ç)ÞŸŽ›³¼¸qÇ:¼Ìf3nA ŽÞ²³B"šªí8Wl$À#ŠçŽê͇{ÇÀª‘Uò:K|ùöbìS[dpçX¼r· D`ªä#”ô\³™WŒé-íl 0ñT@- Ïå†GAwÑ¿8ÞNÈ+ëÚÇx«òkk7ì†äþð™îØÐÐÏ;1½ÝÊ}Ÿ5»b¹*¯<‚ã·uÜ!ªÄç™Ag ÷^Zäâj˜—ÉQˆ$á(Ù{ ª€a3Fj’Áoïdчn7ˆ]ŒÉMi«ô“õà ~Z øpéÒDß§Þ \ Ë÷å= %§öm¦¤hbØ|rÇ﻽‰ŒóUôâ·Ýì2ÚÄf{ɬùýÉ mu†˜½ákÐ×Òæ¤½ÍY‡1ù_”F2žÝ üC!ïHÌèi…U[åAe×Ô2ë áy,%2Û™˜'®ô‘\)iW^TûÉX^%½jjZòÕ–:Øo˜†ê"0rªIûDé÷VàWÙhYUxçƒÙ¢Òôî ,b<¯Œï\=çêíw/ä:.Á%”ÐòÍ´¦t¾¾O½?Vo¤5N7 >b¹H©Ž{› ÿwBµ46ÞfÊU ´}ò¶ý|š<’ +ëÇ5'Bž˜1ø–ålP“ôF„mJ¨oމ¸²x2ð4fP•KP'Ã=ë™ÁZàn]ñe³àK Ì)ò4 l¯¡ñ©æq³}v@b­IÁ¤ ¡˜§ÂCžáe@3ÔÓQ °j–öœYˆSoÉr$ra©¶rþ@õ6&㙑û.¤[.T Q’}BÁaK²¼elBöT€j³ú8¥Ã>"Ê™]’oúÈ@4æ3!)¶ÛY'¤ôk‚ØX„˜Álü‰ó• åC.ÞhüÁcW‡JïÊk:ÞÐw¬˜jLæ7韈þdL>Þ³QîPrtºÁvà´#ÅLµEY&/ßšÜ{V‰à€cOÐ~i:\ßÀÕÁá†SéÍäÇÏ–ogf!½ð'y%è‰oeW2 ~øD­eÛ;„álÜ噼3`ÝÞÙ:–« ãÜ,N ñðƒ1ýÜ{%O´Ð Ñ~wuSóÍ8üôß´Ô»dçÊÆŽºðã'¦Ñêªõû t¿íã¯à&àD;ÜISd¨$C6úA¾¼ÏÙý ¼ÕŽ6U®T _(ˆ¨Å«éP¶5³Žæwü­ŒµC4¹¿¾ÿÙªCOJfL®íõ¸o!ß eìK/ÿöõ.¦‘í?=á"P}Êñ\´iæ ê•Ý<Ã'ï´1áÝóÁˆi1À~b<¬4- ÅaglaO¾´ß¦8ŸwA,‚Ë'kÇoʬúæÅÈJ&$¿ý¡yõ' äuÇÎ&Ò\0—?z¢K\å·çÉÖØÁîÙÛñ‘Rßd k¦ +P[VãÂUw¼öW”ºmAëÛØœ^Š[¢41“§ }{käi>+atÄã6Z3!M|Ò¿uÀBEG+™ÆÌH&P28÷sš¢ð¹­‘·^Þ$MÆf¢”¾‚ò~ûjOû ß´¹ÍëÈ0[üEž)¯,È)ʵ;©±sÞýâ­z&‹äÑIoÞ3†’CJž‰Rg=ÀÄ0rí‹2Üc\<ŽŸ³'\»ÊuÂÑs’,„ÆKjóÃÛ—í§ëË^øJ™e“Z;`,m)ôñ °ËNÉ.úbè;0]þüÕþé#" = 0²å%7ˆå"j°†H?'"Cɇns½~Û6‡³Á÷no…P Þ«1ñi¬d¸c¬Ë1„EMÉIf§Úú¡èш ’QQ‡¿hy,@Px€øïó=6ƒHÄ·qÐsœàb‡fð]‹Œ´ÆÄѼžŽÆüCm:èÛËduBùe‚LÅ¿ÜÚ¶²¡í–mç&ÝÌqì®ô•YÜ•}€mtðŒêA¡Û°ƒ®,ÛAÃùÈâAg]NÔU*b‚_·tqñjw>ý~JàbÅžøëq ¦™|Ûjóë$²òŒ¬±v¥’7´¨”„;õ!ˆaÒ(ßÏ*rY ($ Üù8­ëVFáíªIC_>Y¤Ïxñyƒð¿ãí]OL¶Þ¹q£¤Ucz–Ð#]9%—þhs™­!¼ÔÊH—PEõ‚HÕdS¶Ò¤43~‹ï"Åô&]¾µ¬¯þîÞ | ©_Þ4#…»¿®1Æ»37´õŠ£ÄF„kð%>¶xš›¨ÜŠ^ÈBµÔ¸’QLß`u–] ÑCÛžoyÿ÷‰8‡ûϱ#”]²r*å¤T_³[#ðë "ù?|‹‹[¾Ryh³hqßÜý. ÎãYãñýÙl9eÜH©æH‡ÀJËôýXd‰pâ™Vá~+è›ÃÂÀ®äŸÉÍrÏ!R‹o ·ùkÒ„ÀÊs3­õ™ ÕÐBqæv}²o’MŸm8€U(dñí1é|Ùc½ºƒVæ|H‚l|cëZyÝ<3œ9%Q0ûµËR–,` Ö›˜‚ùe•åïÿ¨9½eL5n=N^¦±A'¡yƒ¨J«_L™ški—Gŷ㜩Ò1í;gªî¼ßké:&n죢Gw$–ß² vŒp"y».Y†'ºNèI_ÜV, ®ŒºÎ\B¨¢ö~RLý“D­  gCƒ ,HúLyåØ&ù/Í%³»X{Á¸.È0×iJ%Y])*[¶8¼µ@ÒðÇåQ“Q—QI€t…¸ýîÒAÈœXñ ©Ô†œ5Ú®Œ>ç—Új>ô6ÇΘk]ÚêþZ¨äÖ¼µt31@ä4ß:üÁ³ú¤;zÜ?Ž8LI7…d®“Œ·!hKž…â~í¯Òö`© bæ4tf†úŠ®ú§>¼ú¿,4ҾІ¹Å2…mGÿÌêâsÒš„ãåÕ(Ø~ȤôV(„uér—ÑÀl#r9}ÆûxzýØçoóOЙ æ2í‘;g.ª¾’…]k;vá³:¨\ § Y{ ™|µ®âë“´÷@p¨ld6šR‚4«ÿlíûµ¿\öž¨oµj™*èñz±LÞØ¤Džõ5q1e:ÄÄpÊg!&³M™B]I—A{@éEÍás Xš›DEÅ”dÖáBfI*µ'dÇI¸ì~©P’žqNöE÷³Õ#öãpÐ5hÕ£»²Ÿ©l÷4Ñ)=‹ß\ M@ƒ:NŽ‹CÎí¹P’Æ¢™Z8û¥Šx9øôôµž¹rs<{á:ÓŒ´H'ƒ ÖsVr>þª ¬ùmxÂepecã6›ÓZˆ ‘$ˆw­œÀ·Bü͈ ¼j”–à€‰Û ?šY;1þ:l%ú`½ÜOÐ ;[ -êôå P’tC§ÔBY%•ÎK6È+OӵܺœühMPŽ ÅTšÙ¹’V­LºÝ¼•±Ÿ×/‰ç+iD¤üª €ÉéÕƒ ‰öÕÔyšPÍ1™©·9± Ÿùˆ,"¶u È¥ŸUm•Q"k"|ÄNÊ5Åa£[9–£È#$ÏcsJ©c¶ NB³n6šõ¶MžKÎ?¤l$tÎ`)nlwU{u0[¼Ê«ü…—~ú9ä¦PpñúÀV{K¤µ…®4/ &¡ÇñÃá]¤Ro®wzßÖPÁl؆^ìý‘p[1%ºõX0•O3WÛ9!Âò@pÚÈ\Øó0mÓͶý±ŸÃœeíÈz¾RCñ˜Fß¡Wù‘Q‚(ƒ0x;I³¶§C“ý+.ok$4Ë45„ÁÚ›óÖ)yšýWáÚ¿MÅä +7)®V?ÿfO«Wøå€Âßl^PÀ<ó¯3xÉ õ„0 ›Ì‘×ÍÙðÌXI"9Cw^/Ÿ~™n8F~˜¢ÇÀþ{·ì„®GK_R¾6êÅoqõ—éHŸ-¢7­/^/gcg yVžFVÔÁ ý7oatIëèHF©.²äž‘mUxç ã Óøëj b…ã‡)%ý«G[ÉkæŠgËŸuíx½­ËW“üˆ‘z©ÕMÞ.µ’º<¾TõÑ`Ü-\­Wè¾[‹ý„Šõ3}jõU¿”ã)ëñòx1aµ©ê`MþeɹÀYêûóšâ•oš l=Þ=­‚ÚÄ/ºY®S ¤ªç»v€¹Kߘ-Æ v¥üvtM Ú(Íõûà8ÿfãgŽkQHŠHj° )³Y]OJ«ðŸá±<[Èl¨cc%Á E bÐ#ÅxÇ/;8Tlž_Úè\aÜPH³‘–¯¬;†~}uûĉ¹°m„º"6O{M S¿<2CØÐ9m”IÉÇ> ¬^µG°HôS~KÐFþ¹¾2}£<éëIu‹!4áÚÒ^qËY1h¾Ü«fzˆõ¡¦‰L¹£o¯qNKéIp”Ê€Üq”rà —0sŒjàQTÿ‰…Ðõ.fí|±÷F¬å¨ZyÀò8çзµvU­.ϲCDjéÓ¯ù½zßÔ^à‚;ž8§ez@ߟIc¼\ßH8„Ѭm×; Fëðó1ZF¼%¥wË]'¾ ˜R¨A™t|!4צˆBÿ‰{aá®#©4v±¾’; w"g$º²†Ëž ,×Dfî>)º{k>ÓáÕ4A$n’½’#õ`âÐÌ/²RäùìéH1ì­nƒµüþhØj(y5›³Ì{¤Ñ8nÕéÐ-Ãu³¾%Ä y4\¢_-˜68*áÎ{Â%ŸM¾Çì îD³[ŽeËôž0\Ú¿õ[èÇ<Íï°c2&2¼=‰¸Xm­'ïÒSh>Ê,{6íå»DtÒ¸“ú-dT˜&„$Cº‰þ‰àÔð¨“}|ÓGÛ]1b'à‘VW¤¶ü¤£Vضï¤Ö½+(ÓÉtžÚ8FeXµÙk²%–ârý ¸*²q‡YT|Uá »°)’ÙŠ<ÒíJ¯ð3;Ý,nTkXø´,w]ÍGÆ)`UÂøñ(ø“Œ½Ò¼xë&E/gT&< ÆAÎÖwÃZ xRÃóop‘&Ñ—Óµ‰Sh‘œ::9?9‰eÚ¹ÖÒ0,B¨´ð0fœÔÖ3 7—ÆYge2å¬ ql¸ÉºšIÛÚ31Åùõ~_;Vb>±3*Íû•Â+¤¬Œ-“gÀñY,œ9hŸ>Úâª^Túج¾Uô\¼:âÝó>¼Ùû2ÃGIï9ˆ½|¿‘—}…p‰>THØ=)e Z!Gǣ߀8v|¤%¼)¯ç~гuÚ’ÿ £ÞÒò©lGî„f 88ÌD¯õÞÌ/`LzJ…b³Íª[MÏ.?÷îZìRMGáfmò›Ö©ò£a;`9¾P¥wÆìç†Nn©¸WÈí(é{åL¦¡z0qAORêx;B¹qEI”Œ7+ˆl‡>»(+«´}øžú€c÷¨¨vÊÒ3㪸ÒW¨K¼uÔ0i­½F/æ[à´îñhöîLº,þÛ¯ÆôÎÌðG;Ì×_L¡­”¿>T²d}&7hÉNïb¬¤Ã/¹ðîò)Yb½„,TÄt ?äÂæ}ÀõG˜1d­ÔÍ;I hQLµàŽCAÚ­¢S @ ëlË(W¬  K{1Kp¹”0q]wâç x~…èʘ¯ÿ[À&5îx¶<%G«(|GWÐGÈ‚ ðÒ# €îêÙÿίú¡úÿd×µ%DéʤÎÉNS¦ƒ“»³èøyaÒÇW¨Ù€ L¼ˆŠýTž1·®0zݽ—ÈîÆÜúýí˜{þçkì!-$4™gîÃ1õab˜I ù@$YR(ŒŠj¼w\K}§©›ëjn¼K¥ÃäaÌX=ž¸lŽ¢m…€z†ÀùdþÎQq`„| <Üë0K•÷ …Ëèb?ÖãCO”BD‘ÈèŽ <*ĸ±5*îÛv¸°éè£è­@$e08Àðcv%`oÚKbßl:ÕäÃIÈEYш¥H´árQ+ôiðR—.¤æK #…›foICozg?ªïªI9œ0¤&ube(ôƒ»»8L —s -7HV(Æ}7°ùà¬éÆ D?Üœ>5šßÿÄ+Ö­, J×ÈÐ(|ëõ=ô'lç­‚$ATA°Œ,Ÿë±¾ tØfx YkÚ{6k|Ç@yª ÂL Z=@ôy,šÕ•{š@uäVo †´j’—…ή±à^ÌõwXb@ ¥vX_rÒÂ'ªØYvfSTи°ÜÑd£Jäø®‡åo÷íÅ…X"?÷oçÆHPNÁn3§KÒLÙ ¼ÔeìCêí)^‚LK»ðç6­us}-ˆ|°5œ7ìÝͽéžF¨Å)oÚ®áÄçƒÐM±(Ø«Àö`ˆxïÆ!8 Êh|E‚ŠÒ#X,ÁÍÌjJ¤\ zOX¹šïfçK~pÌÕbmcYIVÔÎ[è$à‘/ ];b…¾á¿èGiÍ õ¨‘Šrôêe)œ¯„½¨·ä“u‚­&07ûÓ€M'¬·ªòîì‹ Û£Gß¿(XìJ$ãmj\ Îr6ä z Ͷo¨ŒÎ 1¯ÏBAÙPµð!ª´nBsɱ•¬i[»TF_7Êî92\ØO%iÝÙß´=j¹°®=e!Ìs¥ <ÚìFŠž¹ óbÏÈÂX¿ôôSU‚Ë:By¤sZ-¨EÖĦSôòBçÞþG=o%á2£Ñâã¾|¢¿ò]¦ƒc;>,#.Î(ÇéŒ3Z‡àvP­r/SµSdkgO&ÉÉ‹ÍUòÎG/Ç]L{ËÐÕÑ£…Â{.E‚›ÅVR‡¢Ò¹¥&ª5-lµ´ZN—d‹=T2Û&MG˜¾ª:p ŽÖVö…!“2IÓ2Ýè‡áï’r?8Q{ô—õר?+–Ó‡q%ðvþú7iˆÅ&4H­;Sú[`a÷õ#‰+É5Nrާ;a1ŽmùnÑú—BÉÞ‘[•ëøå½„z‰ÙKP ç“ÉoÛ˜B¨á(Ð_’®JvçŠp…‚f3oŸÉ`ówÍ ™ªNÓ1­|ªba‹C²’Y—Pï™Ù)‚œn Qr×-áBG':x7}6V/ú DF û|ªU`ì9pÇþBºµá6ο¯ðMUðñßNü‚ó Npº¸êŠ×ä»×py аœ ·‡Ê-½ßQw hCýMëÕw3u×Ó»yðÎ9ß÷Ä|Ôhrm¤zÂ5µë-u˜jv¹[áûò[k ÷½@¦™~}–ùUÝ]ÀIžýUû¦õ€åÉfWqƒœ•nÚjŠ].2 ˜N Q(Îi"àÊtµŠ^«ª?§\Ž?5·¼ 6 DÈëFÍa:¼\0ާkmÊaC SP5š¿ð8: ÉÏÜy+ÓYJy}¢>"·`ª°É¶w›6»7@Ü_ׇ««ñ[³yX}E+SÃh`–›Ìgò!±#¦½­•àFš¨Äü¿;¼?¤Õðÿ FTíTe#]§·àQµëëWtЉõ{kµ÷}”Žòb§ˆmô×”EÖY¿Æ— ¾U÷®cäÿS©>ÑMqÄýïXÎë¦)ÿØ–~³Ö‰mVóU¼Å¶ätëÖøOs\»)œèíT@)§Ùqá(÷K¢ z#žºu‡gåË7Í¿^8ð`C±™.ƒ†doÓìÆë¿6ô«7a)Ô¹œ¸E%žu2FÓߊùQøõÐâ`äªb‹=ß¡X> $„ú²8äÿ¸Èc³‹ßr²…™¤ä`Dœ¶²1…íÉ™cZ…-¿hå½ËZ‘*AœQ ¤{^ÒöGuº-5X½4ìÅ® —)àý¦T§|ªRA£¦¤þ1 [< C±¯dãH§‡œÚdT!PñƒÞìf&sNj•T>ðÏ0l)â8ôáO¸>a º%ž™;Îá¢î<´(ê>Tø&2 Ìf(Êïä®vOPëÙwÐ y·P$9ÑfêÞóÖllYé{Ö`šŽP·ÕýœEåoCih·»‹g}ݘ/=£ÈTþX¿±A~±ÀÇf̓&ËtE4ÃÖ;À6à ÃQŸˆ¥»ïÎcN}ñë9^åF6 ÇÔ(Eðáª#§‘Q}à »/%x/¶‡cg¤ÔU=.UÏæÝ%g—>÷±Új§|êMÆUr1N’®vx’~, –Ò@j«u¾º|‚j hc…õÆí ȉü#BGf°+9Mاÿ/zë‚!Gw–vgBUÞ*yÎN.Žá·2tœC¨JWP?(É£çÃãk„3Ñ™è†Z›ÑsÚ0»ÿ)ÖJvá+Q' âê1m«X†N„¡ZŽ[nö”Ù“xwŽÓ]¹©:j«…‚¶IA[Û7׎:oº»ÐN6ÛT×u5ñ{éÎËKpî=¶BVìœßxQkBq¡bO{á‘ t|؋廹ûR¦Ãý™Æ)å³lªØE¢±:Å ¬bt¯còE'MxàUóNÅ¥ÓC°Åzã쨉áhF-ð‹ 5ic™@›þS'/\Ž©ÔKi ‰Tºàú†§ßª=ŒÐÌåÖ"º¯Óôt…¯¥+xõ§ßlŸ^,Lb íEB¸`›á¤:Žžp5bP]šyxù‚ÀBZ¨Nɽ±Efx'ÒhÑ…KLMÐò­f´Fµ‰#¤CmäðßD=S1hTêU€§Ìÿ“8 çðv_0˜[ Áû%{Wìx«dW—^UfßZ³LÙ,õ&6æ x÷q4H\ÝE¯.ÉÂE­£¨¿dA@Œ§gÜDpß4"¯/bIUVê&ýÊŸ€ŸónWCf…ÆíàÕÄ0®¿sØVüJõîØ]b'i%íòTp)‡»£?– :¶K¸žPã­@()0­tAåí?srÖ˜IJæxBQåéyˆ_H `Ú. B3h ¬ý –cêѰ>© ÅzwªÏî™&?ö\'Ò‚‡ÿxñ}4ùÚÙþkZq¼[icÍ܉éZ‹K÷í…"íÞ8ÍÊÕñ)àÃÐH7tíÞB(àDµ6¬…®=K~‹&ß­ËSÎê€=¦.!¾`}Z²94Y'<ÖÚÕÅf]P„ãßÀ2˰ÿ9_½æž7UDg@ަBÖ° W4òaRNM¡5iÕ•7ÏzÒ7Œs¦3G"Xp~Î66‹]À\ag™•Du #en¶v¬Ñu½Öå ¸»ct˜ÂÐgºËδAˆnP²ÚWãH€®½y[ñ÷`†ø9ֹƻ8 ø9äÌz~çíGÿšõ{ÄÖüzÑ*µÝÀ±ErÇ«hî_¢½-èQ~:F||Ð ¶¼•ÊöÞ ¡õŒ¥‘ùÓ,5Ø)Xí¸o8ó³NO«ø™àyv{c÷›[’µL|¹ñÌâzŸé÷†˜ž.Ìn.éÜ3–‰]¨¹Kó…©³GV„Ÿ…ÑW G˜µ{À!%AjÞ)nîj¸°JCA !8IK»žSú"ü`9ÛØÜ<_n^µY.¦€ùæõÁ~ õ@ŒsÍðw È’®vû†ykÔ,›½pýKQßj«Ç5¹”¡ÝµÓ‚¥=I´`ðßéäÐWÇŠdã ½ù4«šÿ‘‹>÷ dsà:Û¹Mvw‰CÝJHþ†¥ ¢Y%A?$N'ž'•ü”άy§”©¿”dkêÄ8ÿJáQ2e²ÙÍh;þŸ™\œbïÓ™_AÙáÝ‚`pÏŒ9ªOµ%çNbf»oª‚ÅŒöÛyQÆc±Y–ióÊçð¼»îÞW ²ušÛ}Yº£¦ß$<ª¼#æÇ„HÛÍ•¡L̛ܥˆ^]Ÿ—·UjÈ^¤èð˜À6W9áø!¢·ñ¨$Õlô…éâ¿,œ_1rû5YÜ.¬]7¡„¿—s[­éÏô3:LNØi3K fªÄWø$ÀkQ©ƒ´m RðYèI`‡u À鮋3C{o&l+#‚Ò5rÒüˆÄ'„áÐr·Z2vñ³üª‡{4ÙóÕi³Õ~Ëþ¡h7ÍëVçY_äó`Œ”——ý‹Z®¶ÂùÐè ŒHuŽH6‡ÍK$®ØaÑšs£$Ç™€å”;Y·=A $Êô§{°¶ê`}³—qW7$eºÃ…®ÄÏÑ*‘Έtòf En´©ÐB~|º»–‚ðô¸¬ˆC&VÈr¯äº÷d`ù¼ñ[¾4’¦rÆ×UQц )ô¸šä8P9IíjèúíïÊ?ã^W÷tËFµjA›íÌdÖå9Íz¼Ið«87þ¶jôžÆó—Ï9GuŠºVUA­#6Ozd˜Ž|JŸÈ*=êÇË#?"Æ`è%h¥S>Œ„{ÆßVÖF¼ˆÐ׆´†.Òk^Œ%7߃ïažÌ.©>ÓËÒ™éÒⶇ»®›ïs†?t`iåÆƒRqmÁd§ÐÇr{=†ö/á*Ø ãØv+žìx´¬¿šÒg|JÒ¯¼º^ye&PÇ5½µÂ÷f8…!ùà†t_d3{„ßö£î®/¤AU¿Spö¢Þ2}¹¯åë˜NefIê×?Ù9PÍîòkô«¼Of%‚’ÌÌg@Z—ÿ‡v¦<³|½µ  ¤¡ ¯ÀÒOÝõñÃ`ADwâœFßgcÓ’–¼–¤â<+é§;PÐæÙå~µi°²/= 5MF4]=ÆÀqÇ¥Ãõ~ÏÈ&ž ¡ü¨™—–Ÿ¯~}¨€¤é¾s­kã+NÖ^œ]ÏÊ®—J;%×°l Af4`„„|ÀFU°Œ+ŠXl¼ƒ ŒD5?žG†g8L4:ì.—Cñ’Ý^ª©¨yo GwíesçÃ-Ñ™±L«á•Õx¢‰ Ðäª)³Åy/¦¢¸hÞºœÉVÑ_ÊÙàg86q‚JäÔóY ,¸÷´§]S‘S¡eÊ22c¡¾±êŽœÖÄF«Ð¯•IFUš Ïþm²\Ó½ÎÌm’MJrS [VU‚šªÓW¹gª*wÏ·âMrñ$²”­[Oñ´¼ßàWO*`¾¥kA cW^ûž³ Þ}&Í]F»ÀÐb*(V8'…£\£žïêvÊ3_4‡8¬üçªOWhçìÞ-‡\R.ñ×~MƒÀ ÊÑ8‹5(ª×£ÁÀ/ê²™gC ²~j»sq q>!‰ù‰En •,ÿUº%Ò»ñ$ ÖÜ”@<£Æ¬ì9‚¨%G§÷dÍðèÇÉFÃÙ»üƒHß,®m`­ÆÑ!èRSzc~ˆÙ)ô|:÷ð7f|zEŸØ¿0r8­¦ÜMìR(5˜Zø””=xÉ”PÄT3ÖïŠÖé©¢ò=D¼_¶½PÕ㩈FæÛùÃ܇0ºä©‰*ÙnÇ´ÃÅ8‚SEŒ‹ñjÞ󽚚ƒkFcàd|Êjß΃5¦d •_<`øÈ!¯¹P ´½•H$¼ÄÎI³`0x¢âÂ9Ö.4I~™O^ˆ FbP¢;ÇΊ•UcCQξñBÊkëVÌåá0ý…݉B½u·HaMtŒVÕ>mŸêäTŠ©¤“xšq9IÔPa×y¬˜_ìEðõËFC¤O  \MÜžî;šÖœ‘ewq^»Ü)º"Â]­7¾êåŽHQÇTŸ:°ËáÂZ¦Q§{s=«àƒF( jÎÙµQQá~' eÂÀ¿Ù…EGÁßp\×_x ««ÂÿòR\½ùG|`44™è`‚†®Ï=îU›Ü$îV#´¬W›—áÏuXð lpï?æ0N0õ–µÐk]#ñB¸kÆs) ©‰™3ùêš·R’‚5íw„‹ÏüJ%À‚£s)îF¼*Ð çà3 /0NmÂTW •«†™4p@?‰•.K")è‘z‹wMæ7ÞCiŽÛ×>³“ .ŒØt¯шXeƨi9œ˜:c^ÐÁ¿yy–˜AA2,pÍ06f!(ç7£ä~«E±”õr÷%Ÿj ö|×™ÙðÍßÍ|ÔÞýuêwu¹œÉ¥2¢Ò]¼½˜CTò¡ÒÝ¥ ï3H»ö—{"kN¤ý]?HŒ¨Þ›mÌõY5±"01Íü;þû‡rSʾˆßׄ5–tzÊQ²À\U5î¡Á!G,¸G6‹3ÿ‰g Xpe,´jUÇ”µvlö¸…L™‰BçóÔUèÓøsØ—A¾y1r‹eë&çœ ¿mHŽ~V©QDMe"}ÑËÆ—NSª_dµµA“.CÞÜœ¸ ¤-_†%h—í&#Í@"ŸÉõl†tUÕ$ùôoÕ&±“WìÁ¤R㬗À'T{Ë*09f×òŒØ B,˜X¼vŒÌÇ@A´Ëõϯ?]¤¯‡#®åm)\›…rã-VU4„/]#C†ÌÝMâ ,5;ANìÿøòZ¤X)ßʧ*ª£¼JïôOé¬áõëµñ²~â]Òð‡~/³oeÎUgÀ¨gE^W À¬Q¬¸à F¦³ &ò+϶+3Ŷ N S¼€2?P’þ"ίÝ8s9 8€ ¸Äý ÀÔ{îï€=4÷šÊ·ŽG­°­OusC48Úˆa&(ó}ÊþŸZnÛ·½VþòßZ"ÛŸ¦¿ü1•ÙV²‚ý“þ08€ÊSÂ{|°eyãÀÍË®€§{ÖÐÖ«˜:(^!÷þ‰’ùúBÂÑ€…úwY“1©HèìêUÓc…ÃÛwþV@ÝåGò_ª]$Õcga‘ÃÞ~ÍcnGuŸ¸mÏôy±àå†m‰+§ @iñ8“±Ã–î¶ò^2}I­ØÞÏ¢ë嫪ÅÏéÁÄhÔ4ᆦoDËŸ‡†bêÕ°¤ÚBÛ=ó!ô2ä½>Wœç£!•‚ˆh;eZ¨Œ ‘º°Šg¼$­}ýEIóÒiÒßÙIÁ®"äÇÍ›I*À¤³¾&…Wõã”câEþaˆ| µzrzçb7*|Ó{˜úPØhý}ÇÔùTú‰'÷7ðe¹óYtnîñøÛlÆ04I·:ÔÞ¦v@uTmÌX…ÑÞ=!5j•D«m™’HÑ/j¥%w»šqGù±'ƒ ¹ëhC’j¥ºEõF³™tlÔ~>lf(ñ»f¹è ÀdÄÆÔõÚ{[¬Ôº,Ð…+Auµ…õïàŸ×N@àHlrrØ!Û+}fGY€åØÈÇ“K˜» nSÀÎ\ Ý*¤`| *¬Ï;~Sëåg†c÷à9ÞjnÙ7¿×ë(¥8Ô¸¾JÞ`Ëï^9ž…‘F§'«yþ¾?,@l!× …~‘?ÿ‹€/¹h…m“èu^¦«3£ÂÒ+qG\£ƒ-V ó;"ºr³ßÊë(ftÔgŨT–Ag‡^f¶‘¶á¨¾Ë¹G0øäÊ:dëTtHÌ"-ý©ÍGcœž>a"ÒN›— )—ŽN½ê3›Š…M×÷p¨W Áy6ÁIbÓ¼€;n7Ëä2ȵͰ¾‚Ϊ(/Z6 *!Ä â_6Ã+ æ¡[]}eÅíl¸å°Œáih”x‹öNàzÿèìó’IÀæ! ÈdeœxC7‡^ƒ>°'„p‘oÿ™"æ9Œ$BôóN<>wT6¾H\L›W™a¬p̼ƒF¼"RGž*tQžï‡Bæ÷a{±©š«]ȬŠÝ¥áï¡>ÜîÕ_õPâÝ:Qͦ2c–ªâ]=è³-ô0Ÿi*få—kXgWæb" È_9IJŒ¹>ÄŠðK8jQmð³6j–¿°5[‰ —NÉÛ¼ÏHyy§]²/Êãà$ã{s?Ê-ªˆäh~Éî\°y2^+ç<‰|\²ÓFÑ%nžª»¤y(tﺸÂdŒ‘àÀÎ:ŒáÅ¥¾–áüûÕþo-Ï÷ɃüqÿÚ"/7°.¶u8„&©¿ØòƲ oïDgùOÑŠ£dKØþ#¸5’ãec’ê%p5›`ª[XÙÎ B‡xV òê,‘ ØTãùí§W, ‚hþ™CMþÖº‡BBÇèÊlÄuLpð4ýTW½’}û_Ñß³ã§[P…Nä9x¾á¥×'±L$‰òrÕxȃ+ÝbinÐiÿ-EÝ«–, l ÕÅÅ2ùh5²í3+˜y`Í­JwªõµårùÃ;¦¼à5²ÜR Ÿ Í–RÌ"§e³W"ÛŠÊíïMCùêDuy´]žjr3X”–»1!EèTôýÞ1e¯}Š>j¡iRæ”V¥JÃòF^ ž XzÚôsŠ.©2•ϸӠKO«Cg³zÙ¤•+j{¥ Ô‘OGÀþæßºEnÊ\D‹¼Ô?oZPŒDbI—0T6rÖ +Õ*<ÍÅ“Ø`'°šµRèm SbÁ|AsJ®±L¤¤¾¶æÐ7ϳ·¬Ò$!/!µ{‰¸CCÐ>¹eí Î*—ˆMÒhÁhê†aéV£«„Ù–ÙRgñòÁ•à‘÷<ñô Ã¼4í3ƾRøpV¾>\þ}¶\¤¤§ðg6×v/Ò _1Þ@‡ê‚ðpP€¶JEOŸ5—[Vý°¿·öÑ«.s’¨Úôê£Í÷%{ÇÛpÀy˜ÈTT«3‘JÐWí´¬Í׸"‘¶§4âÆ˜<;(,%ôSÁbÌÞSXLbêQÌ7m@}©W)¼î¨ =¦“°V,þêtIo %øñ@ fÝ0^lDÔe±ÎW³IžAã‡ÿÇáx<(¯™Ww\:–X•Q6·`G±Ã€µË&Rmu+ì΂Ëæ˜ÃIòÒIìd4U2 G@J¦·Ìûãá¿RI+íQ±cÕÎØmé,"sj®ßu2gãzø€“é ªO×ìö|åKÇÕpibMôš¥/ ¸px¬·\ñ¬Ê 9¦ó¸‰…[gE®¹eª¤w®Î÷9ÿ„AgXˆº¢Ÿf*{Î>"šz¶Îa:k5;M \[RJ\7ü¶Ø¿ Î¬ª^² —4°›qsD6þuouѨBÖ‡ð‘+´&Bâ8›¶™âv¨PE<ñ~(7inšËHæù _×&´Õ3 `·f/=e÷¡áÚ.}|ñ8Yl\Ù~p¨¾•ùýðmtÍuAÜC©ë_³ ÄôµŸfwŸ"‚ÑÑïì~4Ž–¥?¢(æTzØåéÅ2þZ±CÛ0«»ð}ÿ9‰& »×ƒø·àò”Q! «žœ£ºi`µ{áÀ(M¤ç}ØøÿßKƒõìFùïnÏÝ,ÂIºŸ·W]4‘!þk›€¥8¨ìy™ˆÐáTŠ„eO‘ ’+ШùŒ˜— ûÿ*J Ç›-Pë0Cuº#50u„„¾®ìCóÌÛZõ¹g0D˜¤ÙˆÜò€‡‹Ïû¨L»/ùúÏ2ØÇ„«?R¾NË \×qpMi^®WæfîïcWóÄþÏ]òÑå !;ê…#n®¶(å’xŽUí×/êc¤Ç½›4Y;&lnÈœµu/ñ›*›Ù’Hýo·< ²—;xIÜWÙ×Hp—§Ú¶ÓÀ â'³¡-Â8‚¨Ç>Žóƒ§×vrŸò0jŽ„ñÔ>„ƾDߣùC.>ò–s—*F  º‹UØU}1Çü=è `èYäþ¶U¿À$gFº0šÔ»OJU~^P½ÔâÃîm´qëm:oUÙÃt¼!!úqmŸ~W^ð²^ŽRuV$æ÷ó¼Ò ê8V4ËÚYnÚ¯"æb ]›%š2†½ž‡;™Ò`ñóòPÅ™íèD–åeñVZSÑÐŒi«œJÅFK»¯§Tí»ÅE©Ÿ€Èf›ä‘˜.2¥ÊÏÿžH”qãNãÀ;3'V÷ÜáÝñŸ¿Gx´R{¿¸@Xr†÷ÝX0?™£ÚјNFJºÕ@¥q7Æ{¾êú߇ù‰«þ/ª \°ú“œ,ÛfÄÐ?³q j—ÛlMéó òæãêRÿfg{XœŽ%­p€DAÚ ž%ˆàfqÐhðžìûS¥Hˆ…–èØE¹£ÃUܲêþÑ¥#2bc_$jŽ´KB¤zÊ@†«á] ëØæ†¶òÀÐ_ÔJqÞ®xÑ*žï1ì&ëmõ:Ì·ÂÆâJaàÖ¿·üüL-쬀*á¿~²XÙOYJ8¾C´*Í$rm íÀøÚsr¦`V— å’Ãz¨/s¿/–_Së,)C¼‹ahp7ȦVd¢R2ÚͨúxC|Y±%õ³€ÓT~ýÐê'~ñD7Ðõ÷9vu·ÌtT,`}Å,ð~i~²_gk™¿ùJ¡ÖÞœ_@…J슊µMÝ Ë(3ØF¯",–zø_âÐéá–Ó‚Éøì#ÀÔ ˜Öí—¯ ÓäÑ'F`Ü|”ê6;L¦Ú»t³*ÒÛ+°ËÌ:êâ/cà?×Q´‚K5¹³â'àiQgœìà™}m«lMvßÃÖºk:7Ãh…´‘š÷›×PS„JC]"xßÅK;=üëeŸ› wåD³ÛW_Šé…Ñ &X¦ s+-ŠÁßϤÞD9t"ÒIÁ8YÐ ß ž¹òtŸÌ;®’ÿ*ã}riÂ`CgÝÁù´Ë‘'‡U‰<îL1Ìùa@Á«¼ cVpÄJÑÒ5.öè=RŽ" a™º)fÿ»Â7ÃqÙyÌèyô½ó‚„yeˆóèUÎê­;1–(ÃdLçᆬ +ÿPˆ•#™“ãó¢óϸ—ÅÔ5¤Í1úg-½ w qOÜø„uв’dŸÌöe®Èê•n(\çYHÇÖÈ+WÔÆ"ÿ” ˜®Ðá*‘Z Kg‹©þäËà©·ý ohI9 ã\ ™+(µE¸Dm`\Š©P†±,ÂDg‘Ûp؉·cŸv€_7Ь‘»®Æ,T1æ¤û‚¡´Øì.?6Cu£¨‘Ö±<©YÎÎm¶¾ÌbýMVÖ(ßç$w[\I.ˆ¢ù ©4WSu Jo誱e[ý^Nyfz?†dAŽã®Jåw¹‘Áꋜå©ÌKÊÝöG<äQ”¼q>¸!Æ»îPÛË;Ž ½Eû4O‡nᜠGâµ\bK$ñ>ù!§”sJO+OqsKœ/ú¸=”9óÎôr=(Þè,ä. ÝSÑ»¼²ÀjŽÐ:˜Ê3§¬ üÿŠà´¯¸M ÁrTïãlouIZï<«åü±>8´€ô ½CÐÆ^PYÒŽDŸOÖm¥›Ñ(«¼RœÊ°‰=¼yüZ\9«¤Þ,n³tÚXòÃÀÞ×>->b•Ç$Awœ×šú´F—•«ÖÅYøò…êMJµXg¾J6Âà·3ªRÍ÷áöcÏcÆ_>ŒÔphÑ—N¦1ZiïY%Wn·)G ]ÇÏ¿sj©¾ù¾¡‘7ð‰§v8i¹v­øùÑEÇU¥Vħªu()nòæ£,$M=©IQ&‘z÷£»¹èýQ Ëü*ÕÄ9ª;=R«2êô{½êX·/ÙàiAv¿‡i(oö¯Ú&Öâài£^çŽ0·"ÂP9ÍUŸšžÒ^n¡Œ ö*¿L¦™ô27/gR±ÍMü”Ïc¸Ó8Ÿó~~7C=Hÿe³#‡cÔVž–ìƒkD£y±kØ«V¼.ÔXYáÏ€ÂoúNu ûÝ2&óu¥¬æe|ãÜкJ°†Ï¸jè.˜¬¤@z-_º{‚#aàÓºà‰•?xwBžŠ Š cñÙÑÆPý g?cÅAÃú·o’4Žé­¼ÑŒ"p0*Q“‘*œÇRhÍaæOλ&)u/lHªê?¾V,.ƽ+‘ Ü©J,šZsù‘j1ag¤ò5ªìWÍ:^[2Öanä\bÚ i>±./+¡ŸR%{V”±«(–3¾ÞãæÔSÛïz]b@6!X|`cåŠÃ¶œè.ôPÓx@Ó0òa;2ˆ7‡ª9i\nß<_ ÁÅ‹d<¶Äƒ2'j<¹F_–܉̺«W¨šÌмë;åu‚¥ ̹+()Yã.öÞfí@,À‚ôÛ§ÁÅšö/rd@]ôi+îSŠŒ7/ŸDH5H½n˜0©[?á}êÉôWxeص„¸¾“˜€r+D·‰@»iúwëšÐ86][6‡¤B 1°D¦Å°@B¾¨ÓZ|t1d=â¿6LF,|¢;å¶ ý=$u7húH ЮÚÆü § q»ÔÈÎIX žg°fb—õ•Ø™…¤r  -‰û +'7hÎ F1R.½þ96Ë©!†:[B‡®¹ßÇÊ‚âSÿrO k„Ͻg7µšÎP¸‰V:Îvv·Ûí ¯²¡ÑU+?ï­0ˆçLðsàMp¢1ŸÁæqUAºSò±™q-žÆQ…Kñ£é˜²q©Ðܯæ×ÅÛëC6Žñ0,ˆžåoG©Üƒk•ŽÆœ'E•«{CoÎv\X! [‚ÀãaQ(F¢‹ zTOüC!×-ýC PÓ¿8¬È¿áÐÕpîÜäÕøÁ°RhÙáüoÝà;´4ð}'±'ý³qnx=× 2·~:5ÑÈ]›tŠ_NÔV~#¨$6.赋mUJK‰² è€ f“­`5<팺´Í» kx–ç¿dï´½—Ê¡ÜCAúº=@Ï]Ö’¼]{âc%‹}Y@Vdq‹Ãª P7-ßVÞGá›…óIZ£c•Þ9‘’ÈŒ{(h#r˜³šÊn”öéŠÚ*%*¿ÙG‰>Â(iuöµÕ„!zøÎËoÂr÷¶3ÈxX²ÒpýÛÆ[ÊžÕ6u[Ât6xå &ÚŠpþî TÊq“\*O×9öGôúëÇ08­¬âȉ­÷¦ö¡._\q|È­e1ƒ½Œf´"Z$[OÏKÌö+õgÐäý²Ã¯£~q:èú¤»ü Îè.…—Ef%ý5)S&ÕÍôå–Þi=þá÷ï™ •%^ÄïOŽøaÉͶÈ+·˜µÒ|&ßžb”¥ŸoÊÕ`ó…’( árÜ_|»b0ç½Ü5Ì­Þ KP§¬èܼ”7¸(ŽZ5#€":ÄzxM MÒ'(mÖO–‹ð«_ÓP˜¿hØVB‡o–Ü}´—›ˆoÁ¯J¸aføòç2¯¹-¾1,ƒA¤„ 7_Ç™Š)Ðp ²ü•Ú\ÅÕ7»wÚÜk².O[ê ÚÓ.M­^ ÓÊ †.}%9ù±vdQÂû·¥õ™×”§s\Þ’Œ¹9g:áfÞy¢ ?gÚí¡íux@»‰e&#‘¹jÌ©“À!yòSÎ…œ½5IvæFN’xÏÙû·÷ø/+±†Ë²ÜABÌ{þ‰šª1‰‚4ÎNüÕ9œ,NÝ–š£èÿO@01'L(½e8Mí@®n¼¶Õ\ÕwÒU2–Õ¾zƒÇ‡2@¥#ÿF?7OÜ™ˆ CU?ÐïpmÞô†þ„7uÿvƒ"‘©ž'PÒ20?¹>ÈNñ|±e»aFðÖK\…ÿòÝTCéfDÀÈèsi1“L8+%|xzêmh*¾Ÿh’{z¶NûKÁȇ:¼sBÆ}™îïçc?jy=ª§*&C€ËÓŠ»Î¦òµêFÞˆU €ÈÄ-d;íã½ÇP ˜={NÃ-9Ó†r›]G))7DöRc®DÌüËÚ{¿ƒ±ù™—ÁW¼™:Ô&ÌáŠy¤¯&e(èvLŒ+ÍaÒ¼åC6‡\ 5tg{låÕ¢2Ø%h­× ?[mÎ}WÊç}IæØìØé ,7ÁIt……ó¼BŒ1 X‰s¯@p!»üçeõøÄ;WwеZ_Ø¥EŒžÒ”#7Ssq.jö^Èô2Z!\ßzËL~©r:ï°7žbÆØÑ›Üð`´M%ÌZÐYü•`h}[Þ´Š.4a¢l$V>L5-B§clT†HZ2d²Îz}Ó+gú‹ ½?KTŽ“ŠŠJÔçnzò²$¯Mù˜áªõ|0ߎœVDCêYv;lŒºžÞiÚÆîrÆ’þ”%3¸}™¿5HX„ìŸ&ƒýAŸþo¨ô 3ÞQv¸34(ˆÝØ×ôª¬cå­¤.›åÁÝàj0šWwñ›cû7ù¼gý±ô‡3S2¤5,¸PÂr_hûø!VØ´(™ïÿ‚ÝÞ-ò01þPí>—Æ)6¥ «é„W'5Ö‰C[%bÅ#Pùo=r¾jûcÄJ¢fýVÍÐ*^5(4øô Íþ»Äá%ºpa.A¤ ¬—9ìWiU#—‚ÂØ(u"¿B ž< PMºÌ¼ÂvÌ:­jmf¡g"Lj@íŒåø¹]8È‘bñ¿?u–iôK&Â@k¿´_!Zg‚Ë·‘u~Up¿ÂCcRºÕz» ªþŸö]Oí0êOŸ9á*'AN.:7b)ÿÔ¨SK‡‡‹]júa³þæ@XFw@m隈ڳԟZ|%~V[˜ïG8⎒›¾̳ƜçЬ]Ö·—ɧ÷› Þu­‚šý§#¹Gª·zÈâ_dLg„üæUØ,,€Üý»>&eÌÀPd›g »,uaÊnjþ_Ôî7°©÷°3ùµ¹aJ÷%# ì7ÚáÙä[T£˜8î²êˆÀΤ˜çÓ–EóÚúòc¶6a8®kûz­k%“ŒhË\Ú!?¦(~䦰üñ†`^øÕw"1k)Wôü¯"^è3A³puÐóÖ‹ég!Ïb9—žBÎ’œÆ×†=0RÊf‹ªDsyTÕ<•(@ÃÑð0H°z}Ò/ÝÕM@A/;ò¼LyTégàÄ¢¶GÍ÷ù»‹PöĪ LÛÍ„3€q* 1I\3jéEÄ›¦ÜÑ7Ñï 01d‘æ´E½*>r‹JëxŠz…`&×Ç¡•³Ët\ü–Û#ÈHàЖ© ÃJô³8äDðï:?Í F‡Zò}N0mnÏò ¶ÕèQæEMè媇« !ôg«K3ÆÈ±dóå-XY+Ãø§Ý“¶·˜JfÛËÐW(cYˆH^|?w²xžz­ƒBkÂVÊ0¾KÉ—Þ¥å•v‘‡oÞr¸Ó”X>OÎquŸ*B•&»—tœCÝéïz¬Æ Ÿÿ µg«N\È¿˜E¢m{T ’Òñ&]^ÈôBÞ…RvÒ¹î| ×1S Ár‡˜‡>x;ÔõŸ>|²PzšØZ€®‚»b}ËÁ%6 VGu5i Ê®‘'h9Úú§Tù$&ÊÔß©}H‰yR9™”j&ÇâøL'¤à@= B¾' (b Œ!sð}AÜʲlX¥º T»©7Aòú–\G¶ÓÄšg&že“yxU¯×3q{ÁùEzOàlm(­x¦h8àç_ÇÚo”<˜’$µ¿«¶ø@7>X•䮄ô0?êj7°å•µJ+Xm!4 —i&>€uDP˜£ «¯syRäGJO†øsÍ ŠÜkÊN¹(º¹î†rAÞ+“]¥²È½JB쇻H¦‰Kˆ•†6 œ–S°Çd"Í¥ð'=xþµç¾ÛB婚ɡÔT¹¥pfZT}&"¯ëÖÛ›Û»k¢Ž Æñ»_÷Úû}±A_p#ô™qó !€h“Ѹ?ˆ`BÈΤ¥ù@7õ”à”A{÷î|.«Ô}ûe(Ñæjî‰À¸›êš»†Þ¦V¼e„q&HckVu™aüðo±»ŽÐƒðt `öe€ÿ¥—a]EVœäó¤Î†KŽ‘°p;•áÉÛÝúš§å–Øê±Çpx3“è3©7íã¢ÉÔßÛnBÓ‚OÇ4Ú‚&CÆþÂV·â´âVnH„K¶†´ÕuW< Kt×U±%:0ÎvëE:JoáóD|\öóö˜®Èb‚ªÐóAe¦!"*ÿŒÕÜÑ_Å€–1<6‰´—Öüj;ĺ46aÄCpõeé•Òÿç 0u’˺Ʈ®âKï=Ù ‚Y!/ª‘ÃNìWÇÿÿ½SqÂt ,dò+ Ž ¦ .¼\W1adÕ<ÿå½±"m^ovrì^òW¬Ÿ¯ö3 º\‚j”€Í­Líù°¥C1M ¯ßëþÒ7G¦±¼á/°ÌëÄV|`ËKxšx¸Q+ÓKµ·N§®Ñ1çzƒ§¦yŠÅ†èpÌä{Éøú:èùv£Ä:ËGaóÒÚjxà#ñ¢ë½àšH׸½Ì„+Ý”Á†ô.‚¶¾Ø ÀÅá¬c¹Ô«2©ÂÂ7Èå!ie YДàÔBDÁ(æh ÀáÓj‚=-Æ¢'ŸL…›ÞV„2þ-3ÍyÔ¥Lš†[‚eJ›LœwO»¯‹gTJ˜–ôèx¢ŽÚR<¾2¾«ÓF ó 4c}á\qÙŠØM1UlCy6žF—ŒDñvå;TÉA2/ç`žZƒ*ìí’Ô“orNÄ/¬½fB>çQ$¸v«:nöV1Т:Åwtö¢P~Ë7/ ɽYõØù¼Cá_˜Úñ­ò}11Çh†SAŒÇLQ‰²… G#zöø¢3 E=XJÿâKš°Œ/ \ŸðuäýÀ´š%JÇ­%ˆÔ9Ê ëL¸ÐËÖëcß&Ó#²¾`-I-!ÿdZ€w”J¡Osö÷QŽÆ›Ô[ ¯§H_Ó"ò%“²Un7âúêÔ=^êÎp~‡ÆÍ„Dw:ô‹ì<.JÎÞoË,¤aš^’}ízßz-¯L ìäHó¶.Ûq]³…ÿ__óÇã'®Ñѹ=—3HŒ@¢5N€ì°Ø¯^À]™4.™w†d%¾©•1Ka}§½¦õªôöÆ«¼Œ•vfä¨çR'–j “÷¾Ÿ|Q€ŒM§Ï-ײÆûŸöŒ¥Vý9Ÿôg¹»æ¥5Ü·# ð°æw[t.³5Ól.Íc'¿”“MD·E¬ªºªÛyÞĨGU¢!ÛÓthëK¬†×‰þee å,ü¶Ü4Ú=j·=†Â\TbÙä«3]œ!D61OüŒÔ7-ö:e¡ NæÕœ}€ç”D?æ”é’ÌšÜËø¯ÑÍÐ]ù‘´ˆ‘€*Ú›ªpHÕ®`jJ/åDü.®V³ŒÚ÷òä(½'«,l3z«£ÄÁˆVŹb:]ÇGšÿd!Äy)ÌàÂ;fÈ+0{/&0ëâbyo\ØÖÝbѬIYú‡Qó–;Cçìõ1 <ƒyŸÇ_L,ƒ瘊¿ =p}\sØ{)v·òmNtíýQ"9?§¸ 28 ãû-Çp_ÂÙ)a1a´‰ U@w È®;ÅMƒïÏÃ8פsJsÒ4H0É·¤o ‹æözlt%z˜›æè[…i%ÝÚ^Âf*$¦¿Gß¾d½L^–ËøºöQ CÉ[ãŒ2»&ju‘ry‚ÝB“Á¨3Õ5h"ôg×µ|‘(wT½Î©>åÆý Aº²ø:“oy]‡®`úcTû^z•éÊÕ pÏ\@Åå'?öxî_<ÛÊ£õÂr)÷>ŸrR)aÊãÿf:âXÌ·kK–+GXè> RD`¡éºÎkåÛV9‚‹àõ­hÆò+ø‚ qæÀ]|é¡y`ýþsð2ƤêÊÅž™ÖÕÁ”¤ˆGoß8ÍÌ"…k®@%Ú¾œ#: ‰a¾'}ÎÓ«Šp•8ü´VæU§>»âVúÒ¸ ®°çòû Ú5v®ºŽ¼‡Ž×„¬ÿßv[øy_fäчtÜobMiËr]¤/4uM®|íÊâBcì·G‘ññ8ûŒ=À<œÄò*2 B—·rdÿݼû¸òdàDU‰À™æ¾û_€à_û~®ÃUæF¤¼+~àØ8`êÔÈöºI΢»ó¯bù®ÚWmTù.`áâm]ò»ßO4ÚßµùÞ‚¶WîÝÉ Ÿ'°ÞTc/`²‘ìÌiÜ=l<™, »Etq™Í(YôÐ_$ðTeŽ·ë4È«ÆqwÿÊ$ÑÒ3£¸&‚ -N‘.XFf^Ý.;ß«¼bN^ŸúXô½'ªz<ÂDGªq¼-õÑ7î)ÞËÌSVJ]Y2^‘'ýÍñÀkŽu'·KHV©*ý¾ÈíÄÇlgßáCO¹õ}ljÈÑéznÈÄgí×чìãÕŒ&‘#$ï!öX>®ðÙ9ÕLÙ·_NÖô=äõ Ïr`ÈS*– ­ìíU±qD°½FÜjçÚuæÚ4­iìS>ØhEcs3=G|ô<U·ô]uDÁQå‰D¶ñaŒ˜öð[g}õnŽÞÉ–2TÓÁ$Õט<_ìrê/·Õ] ßX+³}sOÙ‡…®¨Ì¬ý#…™Ý dû0š«×z,©ÉÊïf‚ƒAûÞRoüS¨ˆpÆM{Ö g®ÊÞÓ¦*ûåºíÿ ˆ,ÌDìN-5Ic…huëK—×HA²È°»Ž­öºø£?/·Î-" éðC7­{SOxÈü9gl3o˜q)ÞÒgò>bÖ5`BÁÊAæyê½ÙÅÀ™!/ûW¯C<êM`ζcƘ‰ DîË·¤Íæ¦Ød$–s~¡ÿžðÅHHqø\@h4ÿÕžèë)‘á²ü˜õ\q´Qô;Øhs8:e¯•޹`¢êsXb;ﮤÛãÛÇÜ×OŠ/"ænJ þd}†¬›Äž!“ fÕâZ~J&RéˆzÊV“'y2òýidIòWǧŸfbÁ`™Yk½Ñ âyð¤5Z.ÖèQ‹‡ÝqŠ)ÈN‡çÓÆy­JÿCµrç²TùâÂù‰4ÀÚ#†!öÓ5¯KwrÁF"èQÃu7ŸÍÞžÎ-fB<êG¡l8}@y/ õ>ŒöïGtg‰4K¢”u,±mzˆì€û Épwu+ØIa埽Ëã0bÑå• À³%Ùár¾J´Êz}‚ÕEØÃ6÷ àý!¹(×è$^L]üóË¿o”w ù5#‰¤aøSù{Ÿ“;gáa´+9֥톘G^ŸA_»âMÿ*[”Ë3f·H44F?ÚZÖU×pÜ6¤îí6Ã#›¿Ž’«Ò'02›8ˆ}¸ZBÎgæàÕÍ-ÂÆ‰Uãé‡ ‡j…åÙÞ%³ y|•’‚ƒ¯C (g«ß”§é"qü¸^ïˆt:w˜ÇAw§Óš„¢É·ígÜ{ɰþ¿o ±)‹ Œ]y ®)¹O€Ù¿Em$)¥-q³` ¾µY`êræ9‹Ð ¾reM(±c \ŠÂ•/г¼Ã~Çb¾nT+CÇÍÚÖè‘]ðYB/úc,0djJ<ˆA‹+=8¹ç53Ÿ,f–jâ:ø}î/Z8H‘ÐÅ´Šº Û6¯[Ä’}Û¯¯‹A1ŽC ý¤ž¬¹h×&¾1î fÇe³Ý**"›Ýì°¿5=SÐ!>/vha”º¬thRBÍiÌ ">ã^ Ñý‰\ÿg¯"¥æâ\¾Ô÷{ÅBÞ÷'éÞB)6%l:ÙwõÕ²\i;|v“GÄV–™~ ®¸uÕ—ð˜¹ðê0U‚ÕçÜ¿ßsÃEoÃÊä d =0×J¾APÐURîßÓÇfck±c.£rUùµ˜ïÁn¬dA 4P‹Šm&ù’ÿ¬p.î|4Ñoî4´×Ž+ËÛíz“q ì•1¨JøJ>^ÆÚaté‹N¸¨)úD|3SÂôà°ì;ý¿ú™Ó¢5µÇ§¯À:z}HrPlm2F}+K:‘67ÑoÅÓfÁ”\| q&ë•7GmIt[C†7HŒ|–§ogyïâ)܇às¯%ãoräcF¹ˆbZéÂÙ«ªdYÇ Ö¿Á2àÿÛ‹–Ùo80Ö¨k+¿N+ëéJtú23ŠûlT^EÒ‚nôz°˜Ó&zÐfÒšw»CA ì‰v½Àb…/†!¤éÄÅê‚P„oεr–uæÆ–:,ƒåѨN+Tvd[‹vUk¢“Ìúób!ö6 8ÙUöΠƒj–ê”Õ/A­ÜøÛÇlRPú'aÄI†cð¼.ú dmKZP`•ÃÚÛϵä‘U>áME5âA±¨[îþRµ)À<( Ö™‹€¶Øå^¾‰Ó)ЂÃññî;#O@OŸ@ÚAΞԣܚ7²Œ«Ážüb§…•v [Qú§ÑRÂ+\œ€¤ à:ïÀƒt¤›¶_±|öx£œ¯QIƱrËYiZ!,·¸1[È8_ëâuiò9¶¤> ú‚–Q$éÎÃ;bÛ¿¬,®mÚS×_ “fh_Ÿj‚¦ö±áÙ9±²C¾"ÇÙÄÝ`:'FØ£¶ãÕ´¿8IØ‘Ì~fòb_Å‘rÊùõ¨dÛ¡7³n1- ÷¡«Z¦>€2ëï¡%–D½(alm¾`Š­ÅÇÓWú!èÂÞW²’ĆõÐ)F¼Çkù%ožŠºŽz5b Œ°åÑSIðñ{±g[>‰Ì˜VH®è­gu€×U[Ù7x@`Úlyˆ‘Lt4/;rK8P ¯Q4ñ…J‘y/kÍñÿâ®Iû| -ý›$:à•ÆõdÂò\·vkâ„Q‡Î ×?{—awàÈ—>…—P†¯åÚîXèÁù‚¦}£É¼ ÖD2?iîO™@Ì9Z¸špŒÉ–çßÑ{yx÷ƒûxy5àÕšîV=gø•Íb‹«Ò÷†fù)…ø•o Ó"Å»%¶#Êý”™yâ¸í\j Ž3ÐßÛ7ÏŸ¥ŠØ¢"Šlw)ôu_§ßGï@ lã-ÉÑQ’~qù{/k䌯9æ'ÏÞ¥¡ ?_ºUÁDê ˆUV|ÊXÁ6_é$”'‡÷a‹võNÚ~X87ÆÿIÈT‚3=P£—ç@"‚³]Ð#ªØ¯á.Sv÷ÜÙü8¢&_âOP•û1å2ï£7™a¯µ¸S†5}Ucðªpñoà&@±RÅQK¬Á¯^(m'µEm-eÑ>øô¢âê ×F9ÉԪǡù¥lp¹žrÒ¼=“ƒ»ñƒ—<òðï4Ÿ<9œëÉzQUOÎý–«k¾á¦y°U4Mؤ ‹>ÐáWÜ“,2*rqßí^<·hñ‡ÐŒ0h¹ï›ÝÉ×A"ç;ªÐ²]®é‡É¬×:úRcÞÎÀ{Ô0Õô ±«³Uó/•Ý}t¡H(×d20lyûÂ=9nà,­—œ& ,™­óÒ´b3Í¥OgÕ›fÌTu~hYãñìÏÙW¥ž­OaŠâ1ÏŽ&¹Ñ0ä®~É$ë7;OOx9SP)P›¥Ošù;Žr5Û{†f©{D°R“;èòp¤LDɲæR 怊Ùksc=O óŸŽZ'¯Y{Öztòn„M ÌS±'.=lx…·W6M„B[ÜA6“Ý9«ŠXNèÕ†©[X€É¯Y žÍEC«vúÓܾE9Õ¦[¡ E¡º‘`l<|R-«€áo HEÿ‚1v&M¿o£:KI[¹­!ü%Ev¹[ Ú: ¹¼Dvê äö›:§ ë;ꬿɬà£oÍÚú)`ÑÒH_@yàæôñ:ÓCk®ûQu⤽öÎ:„ýýDåñKêŠéûßùwx¬à ]€¤™¼?•Öàd T‡˜iE§õc|Ä“Óå`h¢¤RüaS`(©Œ‘Û¡¬…sh%¡n´ä/Øh¤–‚LÇ[}J„ÀÒùÃ4¡ œOîγ ²·lá òr§+|†>'Ñ'LàO^Rœ)†K\³üoÄ9ãç›Ô¦9HÊ€F4î%ŒÏŸ¿„|^Õt »oƒlô¯ýä–wÖ Š?ebb«÷L;N-wÈ:”R!fÙ€·héj;rÞBÚ 5Pú‚Õ‰©@çnG/am²8‰ÿåsίÿ÷(­ÍfØ?#HH 4ÎdrÆíú¹ÄDøËU…çßÑã+ªPd$ *ÁŠM ,­h1•ÀÕºæüˆ±êzÛûÜõsŸ{i•möœ6¤;Íò‹$mñžRNŠFisÏ»“q­Æ×÷þ.Mˆm‡¼Ý|0kÐ\«ê–[Ø÷‹v úqèò^¡=ÜFÇ£9h1f²ë-)÷bË#Í>»hëÁ*lz÷Óf°úI4Ù` sÛ¼J°Š¬ÍÔ ¶OXêEc%fú&ª¨§ 'ö#–†¯syª‰PÉÙçÍOBJÁÆ,Ýxt&?“° Q ÍOô–CÒ:¡žIÒŽNsǪ©èá®MšdØÏùGÅ÷ñ‚JÄ[ò5¹6€êƒtíÐΕy̰oÒ¯K/¢/vdV‚¹Æt=º.'EÇ%n:ø½2û¨àrewD’ú²'9w;Ý(z}Eaë8´ˆ)þÞe³îèÏâòüˆ.‘t©jhŽÜ×{í­r!–31á•GZÒo’i„@eë * Ίxž+# IŽ8ãéô9$¾B¤q«pDÓ2fg¾˜Ûîâà;„«øë—¢EæÊqz§S®G¡læu)WU+ÀqêÂÜR-glVéÙ@›èkZBÅð×Rï¨É¹°Î˜¾.Þ!b]D¾b¡Ç—+ÿÑ:$ª­‹¯8Ôì—–#_‘ŒsA¶w›Git_ŽvþÁÚŽùƒŒÉñ8‘˵çΙU2©ƒ`ISêyàj!,<ïçéfŽå Á‹'i¹¸[ä{¶VÙRP‡z;î÷Ј?\¯°«×2î\Ï—õ6Ä®€L í9=Èf^‚1ñbÿï’Ì̤‡l¢B!o‹Ó,ÿùñ W[™—Š_mE` 0Ù—.oaŸçµ!¯†#g"š,MÒMlo[MÕ~¿¸Ö-4É+n´öÛÈòllºyã´WÇþÖªÉaѼ©ÿ‚àùc\¿Õ¥(fÈ^ysŒ)fÝí÷7VÊþù·àâMvŠžÞž1pNS12'P}öÊv§Â·×%ß[2fØMfñ{yz ú0I,µsÙíÙOg0ÜBñ-¨Ì¯iÄÙ×ïÇ^•'!¢õûª2Rôkîâ%ö¹Åþ´¨õäÿèèijÉãÊ Nü/WyWV³xÖ•lŒF(Ô¿í»ðfãź9$/çË{öÙŒŽ`G;qèfìÆ@þVo¢ÙËð¼jT‚ cÌÿv¬°(œ$jZT¼W¦L•²?žéKg´x†[ž3žÌ¸àA9‰C3;¨_r7^k­—5ÙP*s­ÁÎJ.m}»™®sPãW{´í¹¨&K®ªÂÁ¼’f7">hÙ î¡\xWÞ¦°ÀöFÀæÔ\L>éîú¦˜3ZG\X[ $0"¶+ÔÌå]ˆÑ¶¥¿M•Ï»1+Û+Eê){ÐçÈ¿¶æü­o ÍÙÇm/ ™xŸ†Ÿ†\@[6ÞBz¼›Ô²ì¤¥_Ü;4S-¹†1Þ„ý`¿üôÞØ—º=x¨`ô¬_–' ãd{ü‚$õ H9pK—æ2ÆÛÝqÜòÄ!á?_Šý‹0[kf*ÊjŸe3N!2kcÒE<”Ìp!ÉÖ¤'³z”hÔÝ+Ýæk´fáq4]¥$ΛÜ1´%ª @®ë¹¦òàlþ®IŒµç»!—øa¸Í½Z¨-Eæ´jöãÛ«µ ÿ¨<Máè½ø;©ÔJ‘¡\­‚0û'–Ö\Ës;1_Ä3£VéJÅô@%‘Á*_úЬ0žýb¶ k ˜Þ+CTQ£:TU1âHÎÉ’ü00 之—©;¾•ÑÜá\›Å’œl¡Û"žy²kÑΰóh ã3Ü9Üæ*Cõ¯i Ö ù šªÑŠÜ7_^ÉŸFMçj€í-¾SN°ú„ç<«§GÓ“·»ŸJ·pÞY¢ê´¨­ZÐsr€œÙne¹Pj]¬ñqíÖSÔ® ‰³‹dˆL…hÅBég…¼Á[›Íâ<®lÛTn ŒºKµSYòðp|‹°ím>+&"¸@ykl`ŠŠñ²‘ è—°ç{U^YÑ?±jôQA~`aÿáMÚãL~va t¯[`»©84øàNB%®Ùì`~ìÒf×ÑŸŸ¾;Ó?ʆ.¦³k–<ó¬üö9<-<:#ºØ[µK]üOænû' ²2ÕY%šÑ?c“&ŽîI÷¢±ÅlüÍ ™rå[:] Èa iÛ.©:*­†Ãýs]Å6bE!]½Mû¯ØÄJàìŠKº_ÍC¨]kÒoaZO潋ÁùSª†¸ÕU¸º¬€2éA‚,vª´á…â­94Äí;›^)R‡Z½t~X4u>†]xî×v|'ZÑM£AŒ#/ÈZ8Üþê6àl,Ñê¨q³†/ðóÞÉs!så-j¦¹žh§“£Jž£ìg¸CZ7þ~à`Ð 4>~$å;qéáRSæ™áÔ5ðp)ýûG'3L9s“UB'\šÅšrâ6Ä‚x Õ ¦Ú'_šIìIšØ”R³laSnŸFXWe?eI't±»úH_½dJ>¶hí`»ìŸüÀþО¶Ëw‹8úýr»ú´f­ÔG϶™’ž±¿ãƾŽ*„ƒéšì¨ðÝCY<£Ì Wýøú<§é'º5¢!RÅ䯸vÿc 1z’ oÛÀÐaÞúR9‚ÜWI3ÜŸE¤KD32v¯üØ÷§…*´§h{ þì/˜wT FúþYZíØô) ñmm=A¹(P´¸c¶5ß®H¯Iœ^±}Z@„JÏBõçcÿÝ¡íÕÆòñd{ø˜vâ„ù!‡ÙvÚ¡ ¹&ß»¾j@ý•9Õm›=WòX§:D¡¯˜_tjFËÅAÀÆ-ß§vþrª\$Ã%œ,&eêK§vU¶Lˆ›¡aVÉ.6ÝŽ0ymw=jÌ… P]e§ØÐ~p&òÊ ªð>2*Yê”ÀÇr~nfß(ͧ)¿›¨p˜vOfxú}ƒ\ ­ ÂcÎd{JÖ”‚W\ ´ê‰Ðü-ö„§’ÀÞƒÉÁ©fœPl`¶ém³·‡ˆ¦GBÌ̉α6’dž˜–WRÆ£­'†Â’½gA#òÇA#û0—ó oIˆ^íˆ=«“18`®ÊE éYuõÔ h4±Ê†­RC:rÚï=zÌÉû©8c©k3²á¦Ñðç±x½rvwXPxÁª¿ø#,‚u;Vm6ˆŸ£-ZG_j[¸ù)$çæËâ}ܤR€7Jsº¥dÒ7§€P¨FFR{ƒ±öž/6”¹]ãiÙü7s«<Îäµ®TÑ">a ʼnžÅüÊÜ“~=è‘v03ª!mÀâ÷ا¥›M\Í~Ð7ö9OT¼í¹”H<36’/¨–Ál1a$`‰j”Çõ…À"Û>1ŽòÙÏ–)”7ç¹{eãœõfŠà8ó ”þåuêùõu$:ð"‹FççoŒ7ÓI…b:\”z¼3h~ÆvÊZ %®¿;èM§ïUŽûó‡í¶±’ÁÅX±ÞŽE©C—Jß;äg3kÜ£‰³žb¬ Ý`VéŒ7€d‡¢„=Ï¡É7«ÍXZÝ\­ÒO²«/0e±<ûOUº§yÊf«#+½¦ËË‹XU”ÇOÏY«lD×ä¡ȹbµ ötœ)Ö;m tu-èë;/ ç‘›Gbá\yw2ԟÿxe|YÞØqIñ¨$† leChÖGíÀ±WÇlë)¾,æ;¼4%‘)¸Îë™A`t†O‚°ýT†¾FЛ0,óHã·¯ìsw}†Ø¼-X’ð&"1¶? v-ôvDŽõ,W%<9g}¡‘ìI#,ƒÓ!¡ŠæÊ~H‰W:"$Ò Ã<|\“µc.ßfÝM!o· `L#¥ÈØ£G( Nþ¿óâ7埲ôÞGHa¯ÕØUÔ£Aé±¥à@EÀ ÷wM¦ú:áÜqø8÷(žõáGé¢Éüv9|˜Ò2îC’ã[UKµËrq£ª²Îé7ßìš¹vo•ÿßïõ¦ˆv³*CÀeŠð£ƒ"ô·C5ÌI’:Ô@öD;%¹ñ&@ K«‚™×wÝ(CW‡÷üÔ3A -Â*¹Á]癆Ba±W˜ç6iÜò§Þtõ3Wù0àEëÑ9—Jp40Ìë›ûh ÞNñŸ´ç@$$L3&eD=—$ôÄVTåEIf ì™ztç™XœÀ¼Ã¶ÚMò~‡fþÕ•5¦yu­•Õ.rjK¾(°@”š„¬(ó«·_nù/¿ÄZ\²r™$(·‰^^¿-¹tHýÆz=ßç ²˜;⦄3_[_ ª ‹T.Ò¨÷‹q'½Ô¨mÕåÑó_tj¸öEúhÐFf–ǦFL‰ÄúM Í2®ç¾†õ|ÅÆ7šðþÖ½s:'Á†z%XÞŠ‚5)‰ÅQó'ŸÔD tÇšç“$gJDèÌî—~Œi齜 »Ûäy ;ã GÍÇ­VËÔyü› ûŠ|dl®Ø(¦VPœ:jä²D¿–G6Äž3 Õ>;˜wš¢Q>=+1ý%±J‚—úûBë; ÆÆˆ·.ÅNƒùRŽR†Ësé¤i–Oö¢¢nîÒsbü¹FÀè Ž Š å^uÁ)Ñ0*=hç²!f§Àü1—¯òvLòÀ_5‹ ñjRÓâ6´s±L†¢Ð7Prtÿ¯®‡"`+z¼r¯„ tÝ̼?B¨Fý—T»zÒóYÇ—;mcAé·öýÏú¿eJá«Ó˜y)0ÁÕ+"q/{“s»k¨³d}1bãRªôºÛª*w¹ŠMáWlT³tbgî‹-ùÑ U8Ê7P°¾²Z,Å„óʤ±[2˜’u ‘£s4=fª­òä@í)Þ¥„*X‚}È‘”^p4î®X©_4¸‚PÅžuf¥×1 é­"{L@¥ô!ßëmKAÊd»½Œ§®`„£žu§WŠÇÂ’äÂÀM›ŸwŽñýPU%Ýá%Ä÷¡—Ùî ø\$z¦eÈ(™Ó uÄ(éLçðõ±¡ÞA¯´>ÙÀû:÷ØæÙ¨ËQ‚N³fžLÒaÖ×òBÏmßA—V »Ú®¶ü©÷-ͽâŠÎ×ümÔýÀO¶-«Í¦û—KVø"óf‰© ~\w(}Ø–UT̃ ƒ0<>ûàÑ«­—²ßK—<ûÆiHœ0lªúÄu¹VP¡[¯#Z–‰Eq£Æ\§8Çö»7c]{$ü¬$÷1°ø5øäÒf}¨VøÀ:Ëö²žz6„2ü´"q¬òV-mþY!U¨˜UŽP…á¤ÇQä@,0Ùà8ßX¡µëÜë ø§F,?`Z¨ù=Š=ÞuÆ^œ¦Lçb¸>©^öºÎë-6&èÆM‡ Å‘&bÁ––™ ñ}ú˜J°-ïÄâoÉg«ÜÖ%.d.»­¢Ä^vHÙV”o¦R?MÃaÐ;y†°ôRƒ DªiòÂv3”P oÂZ²oØë•u®Òªöye;m>b2¸-Î'GŸ¬h¦^P |,Y F·^OnW_C³ø‹24]›¥²°ŽÏ/å äOŠ0YËá)ÜjðÎR´N$„vÄaÀ/KᚎԂ‘#§Ú„ß{1o¹+$ ,‡¾ù8ÐáÓŠmÞ¦FÂ3‚"fºßè‘ï›}•YÁ¢dªx×ëmäê°Ÿºum—)¹’5Öéýø*›Û\ÙöUÃä&άWÖ>§P9>­¬[þð¡¸Ò2M|âv]®¼8-a»¹½ú)…ªŒÐVÊèð¼b–ßîv ŸqMÞû·àí’#t+ŽâW}6JGª3Öèaò†<{ùÛ†åÄ´ÖL‘­.ú¸éa'Þ#-ñoœne[ÿúž×fñå/V´»XƆârû¸Ìö!d“™3‰º3ÙlÚøiŸÜÙWjI^ã}Bú ñRuÍÜêÂ@Âì¹ëéUfüÀÚ€ÖýHÁ5È2,ûnõ{ýš¬4‰ ÑyÆÚ9~ú„nÛ¤6­B´ð ¿ör<$±‚^þñ¶Úú̈́Ц’-%¸$ZI­‚¢ˆ–P­¥ódO«9¦;pýï#ëà;DÍ›µKÁWi^ˆèב ?¨¿ÑB76åê¦V8ÓûE‚Xö³-CX“º¥±êß‚b;evƒ-yŒ2<¯Þ é•_¹GÓ¾H ó>08åY^M¹ýt"äè1¨¦›ÄÅ'žëœÑ/Ž/:œþ @¡Èg¡n1úT{$;VÚêQËãžæ/“2pêD‹¥ƒ9ùö ¥ûbLšðŠIµ7E·žmÕ<Æ›á]¿D÷¥ü6"ônô»O–>áÔ›He„wŒ"®åx¥ìçB颶ƒiÕ"™–€þ)„7;sUž /a”ˆd.®>ĈƒM'Õƒ!Òi½j@#PÉKÓìôîXKW!-{åÿË5Ãç‡_"€§5‘€¯ö‡·oì¬O‹záE–yÐ ð«ì~`Æ, }À¶Ÿ*ZäF}`áH®‡èÈqò ±hñ p;íÓ¦êáÜæµßŠ /†jÂoº{ÖÜ ‰ˆü¤Ž‰±öùoðÕ¾µexá4·ÞÆÎE²‚ÄÉãðÁè¼kÿ-ÐØ~6!8.&kNù[`rÃæÁ³”åÛž¬„5!Ž5eδUY­2AÃã0-Pn»6é½M¨©ü^ñ@‡ku¡Óê­[9^K\c[ÛÞ<â€øKz$8SR]ÏΡɊQôí’2 ÌXàÂRHõ-[óàa/ƒŠVË'.ƒ­z_–¾zB…nžrs—ÈâǪðOIÙ`MmM (t£2ßà®Oмöý„áЩ§q†¯‚˜‹ERÌr²8ûígȽ@•ÂäêhœÜæ2|}ÞÑ#¼!ÚŽ pÕ¨ ÊÊ8Ò·ÿ¾}óË@ŒìÓþÚþwo9”Ž9Ò´0&¼„ESbF]5óAïnÅP¥“?²Ý:ˆ•:¨àn~C4u~¼ ‘ÿÞØÓa[KGê!êã‡×²Ñl¤8Ð8GÛ –Ǥò¬G-(?ËÁøÔÀÃŽÛA7ö¾K†z=>FÃço»™•q¦+À gŒÿ‰(tÛ˜Èh.w‡Ñæ\<îÂÔ@®ý‘ᛑaFY]+B“ÔlN—”Ufˆ£uCÏ¢zvûFDš$¿)‘¼ZÕôÊš¾Ìñâ{_Ô¤³„bE/,Eµ+‰ù—Ù»©Ž{sÛóQ+öFmHs”vúÔ4Æê5¶­‡öûÎLÔ±%7x("—TL±ÃŽ§Ù«›ɤ­¢Ð­×ö} pñ^ί¿lcÁ@äƒ7$•P'÷úu˜5Hó/nÓ3k S¹o3@ñóHA”øÌùˆî²cµ©uò^„¹Uh;±wÄEd¹VbgTµõd†ð9å²M±ˆåe™ã/ð:TôäRóAÊ!(ÀkåÞ=‚/9]±°M‡Ç8!¨AˆFo‹ÅÿCãusñ³³9±à0†òJìùóð]çºÕ䦱3h¸¬à8BèYXzºïF na]ŸÂîÃÊœ¡·kÅúûDÒ;¿86Ë+Û´rgå>;Qjá–q8„^š?`_¼ÖÊù}Q(pq;–ç<µ¤Ü«¥ïö×ô¢8W¸˜aΠµ+8Ð:Å/ŒgÖÚD†{âSuJÂ;F‚Uç7÷¸ä}•žÀ|¥×Và2üE_QÛãóÒ,ÞL0Èý«&#6±0Á¡s+8‡_'ÌÂðäGžµ˜ó•?+bíöŘøˆ©W[ =Jß%"t™¾J¯pÈÆ§îV ÉI«ª*'~ïñu¸<‹yLØi’§ÿï÷O3âS‰p*“BŸ7ÑPÑ|Ãli+"hü¾;Ÿ{Ïï9"¼xÂXlÙø¯û~]FWO¡½H(Ÿÿ3uàƒ„ëÈ%.-Nh‚f›ê.©ÄºÑpó‡p¡âå–@Êf ±70Áz¡:ó£‰ÿEê«òYëú"FÂÛCp–£™ð_ò7p~ÞÊdzš9(¡ØIÆÇùcâ- j6ò¥Í—hIjªÕ˜íœ T1†ùttvSªa‹,ƒ(OŽOÜh <žÅâ½g,oîk[„xp.kؼècòµ~æ;i£‚“ú­®jì(’ËâíY&Óüºäcä›Ár”üLÕZj°`7xév‹àtQÜÒCxñ{;ÈYèo˜©¢)ñOHmµ·ÙÇùOIHN.Š‚7µ*²`LÐ"‘ž•€b.¢é$Öi«{ô‘ ´ÕË@ãQŒz‹£.3x‚ÂpBòü³¹ô†ÌˆÌ<Ï5?Èhê÷›ñóãz´Å¸Œ€÷Á?ÚIxD#ƒEðŠ%t÷Ú¥¿$I²=xužæJ«›éÙ¸îÒÛP‡—=þÇç…m=yÿ¨´:$¿³í*‰%Êâe>#ÉØªPñêØ *ZœÜˆ ‹÷çµÈ˦·'|Úû¿5Ê—g¼C3z˜xÞh9Øv:ظ®ÅŽíÆÚŬ14$"–•M‰àúHý‘Ô!@ãV÷Ÿ´£ þ(„p̬ò<§Î…ŒÔµ®áyñ9[…Dÿ¤ý*~ãÅPiºû†‘—9u«+1à¦Îø%ê^>µ}:ˆï‘‡)O¤|\¤Ë+ãÍ4¯A°–[ð{ ƒío”RësƒóÞ¯ˆ¤s~È?Í"qÝd>ž.Õ}ç¡ïØÖÜ¥«È±àè¼W·y†‰³½â±¿ud€ÉcRt˜¤ïë^gsvõ´<«Ï¢ìÊe€£ª‰*L="/u”“›J*£¦Ø&# <ÒÜç™9E¾rtL”“Ümj‹! 6ÍB¦(Gj¨eµåã»Ô¯wˆ(6áy£©hÓt_¤a X¼zþÜÒaÞ¦žÐÂG 9¹pϳÁ"Á©£[ĸòBœ–úOQ0UŒscvÇ¿+ñò„1ž¯…µtÙ%”ƒ‹ÔíÆù"çûóóÝÀZË|޹²Ù„XQF¢˜Ñç'5•î¾› TºinàEv¦až2^`BŽï?l»¹W]20gΪ°˜¾•ž5ï¹,A€¸úxHš3ÚfÁÉ­ÞN¿TËÍÆVuÒD>yEuNÈÇiÐ)&6MJ¸­éÄÆ8KðDVŽ;v6¹ÕóAü žFDDgš†;¬eä~HUÎHqèfŸ¼¶û~ÿõh[²%ß©µ'L´¦ÝP*îìK#e©Sòc·ü§©©…ßÿD-²œèªÛÒ¢å#õqS?‚ö Mh˜vÚø¶£G®åË7ˆÑì5%YÐÞ 9Ãn„9ÒÐÖõè0uQ,d3”?ÄÕî‡4M"$|¥ò$¡YHæ­ ºcù&"Àž Ðß]ô{Ïù{ôåÜI¤úm3ÜK[úÝ#ÒÑ sD»‹´kXiBĬ¥Œ"öÁh­a _`c/Ÿs¿‡™´ð4 kî±We©wRÇö*»ß{ï Û@8×ýQCCE~iA,BÁï´H-© Ä!ìïJliM,&ÛPj¶ßÆ£Khôx_éà…TÑÓAT‚ã•_‘E¬ß,a&“Œ}4x8@Þçj19¥:«L)nr–”4 <2îÉÉ·JF)¯î*™ªÚb¸X[¯º *«WlõjNæÔaø‰f©ÐÓ„;^®j6&“N—û<Þêúç`0`ÉZVKBØtrÏŠ cÙ hb–è+Ë㘋2IH‹·;ôÿËH¹YEVØdðiçæ #'ðì½_¼±™…`W÷SÙÇÚöFµÔdŠDTÆë”f{÷ °u3Š€Í´¨ét䢮®ÿYuš[0þŒ\èÆÂÛv|Ÿ%ŸÆaW•ðÀöV Ú—¶%1ÙócwÒð0’JŸ>ž¾à²¢šÖŸž8'rNÀæà~‰¬ù—Z§³ÉžØµ¾&½¹ÇÉÓ%¥±p^ßí±oNê¡wfé}%§ƒ™£Ë\ëìi–í é×ɘÜ0=ä–rZL˜LiÅZ‰Hý)8Çïs[5-}<—Ñ2»xx±n£Ú Œ{DL2RŽe^F–ÎAÃÁ3¿ø“ømÞ7ðGdèÍÖ1È#’ó=÷Lé6ªœo€å–†˜pW/‰«%ö¾bö)GTQVˆàc¸€­ÄGyofjcEHLŠÈVPçn3ÑÑsÿ §ÅSšÏ2qùQ¹s•Ž¥1Kã.9Úÿ ºÛÞ2aîo~Øßœ‘‚RîêØF¥Y¢u„r9Aý ™2 =™‹DcPO_Ò%[_>C*öòœXºÒÀQz‚º÷½e×0âÔìuKq~„ÔÊz‰„LEP¬…²Õ«Ü]¿÷D6Úf-·É@‚i´«Òz³CècK]ØÙ£~ú Ä(8Fì"â’[ˆ³Œ©q‡‹3&C^,ßýÙs4HjE;Îü"? ÄÑR\Á ©w³9wzmŸÝg¬êŠrjam!D eG0/˜í\o,§õ.î.mQMÒÁ𨵒dfµ™ä±sÒUÆ-¤º­Kèuï{ÌeJºÀL 2#î¿*„—±eïz—\Ôfª{ø«·v³‰äkÅ>SÊä ‹Ùs#òÄ3³ÃÒÏ-Ó¥ÅõÞ>¢ý›,"{ÌL$dÜuÍù!-øç 3ÊOAæƒàrxaoi5©eöŒùiRŽ=b‘º/†$«bu˧¸àö§«:Ø: Q~Üì*Hó.¿`Cwf‘CzÝÖösç°TÑÂ÷–X,벎­â–¾Ó¾ŸüUJ‚6#ïÚ¿OÇÑWî 9]?ö.|zîT^ʧ¢ŒÛ„´)øfRŠ#úÞ÷ %k3ëÿB£Ï˜œî"Ë}¨ö:ö”sj¾u¨›yM]»¿Á8’Ðço°…΂|ùYQ×aßåQϪ¿ÞáÍ ¿d€bX€Z}b´sÝ"¡MÈû÷³÷0të4íŒ:j$#¾ôöØ”ÁÆí²@õw>0 ‹YZgraph/data/graphExamples.rda0000644000175100017510000001564512607264574017124 0ustar00biocbuildbiocbuild‹í=ksÜÆ‘X€’(]år•¸|u[.Wʹ$º}rwý„dÊŽbYQ$KÖ%öIKrI®Ä—–Kññ‰ßó'î§ìOº_Ý.Ñ=êÌèÁ‚X–{z€môô4zzzzVžÕŸ-Z–e[öüøÿθ8cÿW²¬› cx}sÐÝߺ{ÜÝÙßîŒ+~1þ÷/VÉùµtãìîÞúù 7Çÿ&'•¥.Vá¶ÒÖ¬c¡‡—6°f [x©5/åÇöÖ7{÷ÇœÿÂ{ì9œÜ°4¹èZÞŸ{à¿üÀ²…KÚÔÝm²ƒO<dî¨×ßÜNîù‡üð¯þ/ÉÃgÞ&|^‰™žÏ? Ñ,ÿÑç¡Ü =ŸCöïó¸è\qç%¾eyIý”3þSÐ ÝoÔÆàÓ„)˜ŸpµÒvßaúfÖ'õži´äß­÷6º‡ÛÃâúìÚv÷`|ѾüQw8œ?,|óÜ~wíUw³4Îm´Çt”ñ‰]3~åm˜™9 ŸûÏùYx‡ÅAow½7¸·»±ç³`K ÛsRXøœw]œÙï¤Fä%ASÎ/z‚8×é’ÿësÕY<Ü]ïzkÃÞº¤­!=Úw‰O>*îóÇ<¸{_ǰP'7Î轓ß8o¡)3Òkj£™A³bq Só¬ôlˆ¡9äâ3=½Ðýš}‚¿›}›ñûº˜õ¯¾¥ÍÁ5 ¿.áK*†’½è7Þæû½þ@S‡’ yç…WXØÆÂv±°‡…},¼ÆÂ Xbá o°p„lcá §’uú@z;çÑ9s?øŸ+«›[;þqX‰¥ˆÓõÀßüÝ’ø¬lHü.lá{&"§ZøyLϹæ1áİ,ÉëcIn”œP.-V>"|"²|>ÜO™ù!&#ý’ùB~xûqNðC½o2Ìz™¤a?Qúƒ|þ ê“Üo¦ô˜¼*ùC}#쟋‚?Š/ùý“í¨»´‘tˆô»¬—(WÔKÃý™Œ'µsÈ/ȕٮÐ|ªì<.Iã)3Ÿs¤½ËÆþ^ò‘ßJïäþ£Æs3òºéWiö&úYæ[¶;È?Á7¿ ‚_äSöŸäñŬݹáCöWtý9ÙNšÖKŠ_YŽhQ/ y²¿ÇÈ/òƒò’ßcäƒÙмòûKõ#¾¼~&Ýe€¨gr¿Éü)ú‘‰ßº‹‘qMæ_w\á—}yãûMÍCdþ)?Ì츳ÑWÊ¿‘õAæw™•¯Ñ…üÈý‹rKݯ¡ûß«HH,b‚dLÐ~—–‡bgvÎòÞÙ‚Bç 'uþú;5Ƽe½V×# [–øcYØ®ÀG¬tKèR°Ñû„•^ÞèðË‹·?mˆ1ç«ø Àæ²KÌ Ó)è„q*FÌbÄ$GLL–r‡¨E3ýÝ!NRfÇÕ«¨pW^õ»=îí¬ö{xãÁv¯‡Zweü«ªçÌÁQ¯Ì¯xè9{ÎnïH=åTMÇõú$¸´¸GSæôyÂÎDwFÐ%|LÏá¶¢N$à\æ•‹jé9¶LŸM>Dà‰o)œœnèþ<b„+F8r„û-°sµ9Ü*ß]ïû{¨¨W—#U ÷v‡½äížßÓŠÜã:yœõêä§ÿõÃãÀ#E•ÿ£¨úÝï âÊørC\^||r0ì픟¾£Ùtî?~†Ô¾ïïöÏyÆ»ÜÛÞÞÛÝÿ'¸=ôÿPÅfÏ>ëù÷Ïûpûð¹¹Ú‰ôฟ:!OèõǨ#;×®<S/ù,?0-DÙ¸UvUMrw~›óIîe¥SÂuŠœñU´/[:¶p/ݦ˜‚ΦSrWάòUÐ)èt :N)}Lèþb–YÌ2s5Ë,bbELL'‘q–\(ô!çID·6Q©ËÔ–Þ)ï\$U¾œéó]Kz>%—lùºJn)Pñ§è?&þ¢[ä•!_¼ò¢ù¡¶ð™•Ïœ’äÃÔ{e)ž/¯à™Ò”ï;?qå2-~¨-–YÛ›¸ïµ´‰¿9¥=$¶ %~èþi æ…‡Yx˜¤‡9S)Cžál΃—ˆNèþ¸VX€Â`…ç —¹H7_‹ÃñPy³y£º?½šV¬°b¤{`ÅÙœëóÆŠ³ÚO:)Ø]lª½ºŠ¥5l¬½Ž­µ{˜ºio`{íMl°½µ…¥>6Ù~‰m¶_a£ímlµ½ƒÍ¶w±Ýö6ÜÞÇ–Û¯±éöÛn`ãí!¶Þ>ÄæÛo°ýöÑ–Ž1ToŸœ`éeàt…œU!gMˆÁYrpzBΆ„³)Dál Y8}! 祆óJˆÃÙòpv„@œ]!gOˆÄÙ2q^ ¡8!ç@ˆÅ ¹8‡B0Î!çHˆÆ9²qN„pœÓSyH~ ™ô/” j‚N¡Aq@@­"ŸIóÀ/~ ð+€.Â3Þü6àw¿ø×€ ø]€ß@ý7€ ø·€ÿð?~ð?!„úïÞ‡úû€ðÔ?ü!àÿ àqŽ<øêAý#¸ÿ\ ×ÃõÇÞu‹ÇøŠÔ“2@ÔE`;¶~gè ½ø`\ýPéÅ à+€ß<©žÜœÔÀeýø3à\è‹ ëGŒè\'õêÍêϧäVJod»"ë‹Ê~gâ$ÖaO¢¾Dô R/¢ýø!ÔSúAÙÔJ?bë\7«ËäYf²^PgÚÉöCqÆ _¿ŽvGªú_Œ€Ëz@õÄ. >ò`Ò~vêyû½Mâ.Dì„âÌ6rüp‚T~5N}(ëé?×Ð'ÛÀyõÀÕ^)Ôõ3Òú£*#µ PÛÏHù±õðØú„øÈƒ”>eëŸ~¡\(æÒ“¸þF\?5®Þ(ÇÀQ(½1¦/.@¬y0¢/p?©7^½Å4ŸQ~‡ò?tõ†²+Üú’tÞ»PWÒÚ6½ëäüî'ìŽÅ£?+±AÊM[qí×¼Y鮚7Gô ê»]y0µŸ ×¹ã.@L[¿¨8®^™ßbÛ'ÀW'ýj¨§\¥GìñÀ³ö‹€¨2T5îee—”ãß™ëà¤$ý%À#ãÀ´þ2^¸i}I™¸GÚSú’6®£\;ŽP5^%µ/ÓYø2u‚yÜq*­¾°ùÓ©ø/êMÜõØþÀHüêµý¨ÏZo’nH Æ¥¤ñÙž$ÕöqpSq1>¹yÉ/¶xôæ3¶ñ‰šw™òk´Ç'€Iã<©çé•ãÒȃB?à¾é®+|{^žT_ÐÞ¨ôCŽ»A¤?дÉ[hj½q:ã =âöoUy ìþ,@îù4êMÜq…mê§ã×ê3*{¡ëÏRߌL:/N›ç’™P¥?BoFÔÕ3q¹è¼ÇtÞœlGŒ­D=I­ÉøB¨7¶N×§›GGÏ—eûR˜V¸×-e=’ç=I×%MÏsØ×›ÏFo:©çËqõ'®ÝÑTq·ÄúŒ§TæSTêÔOg]ˆÎ›‘ç91äˆG‘íÈ´×±ÙæC€SãRÄŽ¸ym]®óêÑçäiçÅrž.•ÇÛŽLê×&&Í“QÍ—ó½ý™ ÄçiªÆ¸y¼ÜöE•ÏMÆÛB½n^§ö:â#æ3Ÿ7þ:s`Z?E7ßÊÔüH¬>m7’îD|äAÒ¯…ûÌæO}®ôWʹìIÜø½<ÅÎÓ<±Ÿxbð¸qÛH>àÓÙç§µ'Y­óÄÍ{ÒÞG}ÿÀÔù)pÝìxõG’¸§k/TûÓÎe¿ƒË>Ïëy0ñ¼®g½Þw¼Áq&óõ`ÀãŽ/Üy’YïKÌ6Ÿû6ûú`RÿDWTqYå|à @Yobïk<³ý#p=Ÿq•¯s£O¦òp]„gÔŽïÌË|I×Ò>—êÍêWtÿRÒ<—´ólU\/¶_¸v\ Ûù€'Ö¨O¼ êÍêþú÷z$×x—xÿ$àqóRç×4½’\ŸœWøü&U>¦JoÒ®c³­/œÖøÅ¾Ÿê³×n“ëQºóûiåG˜>w(é:„2ßê3óË¡>ës‡€hìø¡¬GºëTÔz8› ø àiçoìû#y0_û–¾É,O<©ÿcú\€ÜåžØOr">ò ÒA}^òÿb~h„´K¦æÿIóvVªôjêzxl  ¡ü í|c®ó%tíW^WÚó3ó§GLôp+ëõ0ÕúFÜ|t*톋Ú¯½¯ ©q(óùÔç%K7Î÷\NÔ•?lEé—ý0•_!ûËT~![|wäÁéæêç –æíü`Sq.½Éúû ”½™NÜïÛþ™¸çäMŸŒ­sTž§P[¯yP;¯êÍêÕmˆÅÎ÷25O§ü2?Ç“‡±¸ò´öY°ùÍP?ís’î늫Oìy„€g‡Ê6®!>ò`âÛõ¬äß7ÕÕÝý¢¦ý¶u-À•~@òÜX¨g;ðiÅûtõ'i¼X•Gû{§ž\øÖ—õD7¿"ñ>š‘ó·Ñßg¬ë«ì 5QßMN×h컸“ž“Ã~žàfõ%:›¯•öÜrÓyÆÜ~nâõN€ïÇ~ãO] ¦œsùźãVÚõ)öx@‘7 ¸j;päÁ„ùÖ´÷S%]Š;_Ê:îÇ•Wñ~~Çߌ|OÒý2—.® ¸îþ=ãçÃõéìWï¤>_Pu^©®ÿÄvÎ-ÀȺàÆó¿&ןRž— ÄRŸ3©»OO5ž©üœÌì ÀÄû=B½±s/àútýæŽ ÄØòÞUç¤ûž<à”ÞDâ7¡>³vSûn(<í:‡öyÍP¿xR}Qí¿1~.ÔçÃ>EÏ×Iz.SÚï±— ò{5e}á²';N˜þ{ºû(tíIÚý{SÛõ™Ïוß7òê­¬í µ>Å=OK{n©ñq ¹? {Üî#õ o^Æ—lyY¿­koÒêÛw*ó’¿ùƒÑyyÚxPÚïë©ô&uÞ2સPêsšB½ñ¼ ¨Ïëy\ç¶sûŽ?ŠCg–—xìq ê§ûýµøû%Ê“®‹Rq›¬ó¾V&žw>íýèÓñ‹ãw$é÷˹âÊÆüfÀ#qfÀÓÆ—Óê•r(ÔÇÜ7l%Ö£Ðý®'·”ºXX…•Ö°f =¼´5›XØÂK}¬y‰…WXØÆÂv±°‡…},¼ÆÂ Xbá o°p„lcá §pÝŦګ«XZÃÆÚëØZ»×ÃÒ¶×ÞÄÛ[[Xêc“í—Øfû6ÚÞÆVÛ;Øl{ÛmïaÃí}l¹ý›n°íö6ÞbëíCl¾ýÛoaéøK''X:E8]!gUHÁYbpÖ…œž„³!$ál Q8[BN_Ãy)¤á¼âp¶…<œ!gWHÄÙ"qö…Lœ×B(Î@HÅ9bq†B.ΡŒóFHÆ9¢qŽ…lœ!çô\:ð~̾µJί½ò•É»2±½–‡ÏIøü·'ïR Tm¾;VºÃ®w}ß5¼>»9èîoyÃ.fýÀ«ÚÒ®Iøu _R1´8èí®÷÷v7öb°tã- r%ÿæó¾Y<Ü]ïzkÃÞºd¾„&ængo½çS‹Jéü‘îÞ×c),É7€ÙõîñsTùÙ“½#YÝ;õ‘ÓÀ•¹½½çkB¡g'(*úÜjw¼6AñÚÕíþêøÞI¾±s§ýÍàíT:톯u7C¤Æ÷NªÔ«þövoÜì}¯©öÀ Éݰ,·¥ SÐ)è\j:¡û/·É,¼…Â[ ½…›Vî&B¡!þ¦ôÊϹ^©WØ0R‘‹ÇäÌ+WrÊ™ð± <ùZ~>±eâgåAž@HÉÅ,_Q9Éý¦â‹—Ÿ¼Ñq„\$ýa¢?§4óžä޾“ž…|Sk£fä|ÔÏ´gC›áwÉbäÙe€iÏèÏú=D¹Ëï£n.»tß®%ñKå”Äý2±ÖÏÄ÷u22€|Ë3L*w*{·¨ÔݽƼã×ÍØß”¿Bñ©yvS;®jçºP~ƒ¬MVþ¢v-nN©—”:™oÊÏPåäòêíÛ'ªo‹›¶¿*}Ö=ÃÇŒýõý8Ô ä—òÛÒ~‹…™ÿˆ¼u÷ˆë~ÛL–¿)}Qñ÷ì ‰o&~£óOäåJùk*™W®sJ¿Gæ³Îúü¨ûWeÏTïóxæZ ~©y35_6ã—ùý*÷§ÂMþüÐýïU$ªˆÉ1Y2&ûñ{õ&L †³¡Cqß%»÷¡ë)ß7¥©ø5Nëî¹Kxf—Å3>üRŒ»ª³Ì’ž]–¶Ý¼í½™:îŠí¦ú÷+¢ÐLíà¢ãÏw“¾Ô|å‚ýËÛþ‹ÌÐK:¦ÞoÕ š{d™ÚýäüÛo%lÖvNÈ á™ÍÚ;Z~¨7² ùýó÷޲(ÇËñÞ}¨ÝnÔ‹h÷åö'ÔïW ü^Éï]ñ~y0r¼Xï×ÍÄëâùòË~Y?PùÕ۟梓ÜnÈú ë?0{ÝùbÙçÊ+‰è¯¼n9äµÄ¦or>ŽÙyO|û¢ÊWÈ·}‰ïwéÎS-I>TÞÁÅð»øôBs=uÊzÁfï°Ý‰íÞŰwéýJU¼Gwel:~%»žÈö ±ÞäSOÌÙjœ¹þkörCý)ä–LnòYÍÙÈÍœ?#ûŸÀ´¶£¿(ù˜±CÉãq×kò0¾Î&µ7ç~™*žclü‚eÞ7þe^nÞs.œ+ÏßuýZŸejwíw{C÷Ù2ÌÙ2EnZ‘›Fæ¦ýØ™©·êM¿\«‹òrkËÍj§¨oˆúFÛ¯oUr Ëíjëgë•fMü Ù¬Š7+µ*–Bã224[íT;qa¹%ž0f¢í—Eýlu¹^©úH«å·­]k~º)ðóV£ø…`°]_îøŒ·*~9X¿ìK¯Òl‰ßÖÚâžv¥õcÉÔê¾X«@Ùg»Ù¬û«Ö|é5kþƒ«•Z€hÃç¢VÅòlµY[n‘V஀6Tüö%ãKÌoO£V÷·M×Wõ¢ ¿'n·|&šÍC>¡F¥R÷‰¶‚Ì´*ÀP¥¶ì—}™ŽéøÊSoûbYn·L™\¨¶ƒH ßšMÿ¶VE¼3NÕW€FÇï·z«P€NͯoW÷Ô³Óôù^°Ôj‡$éK R ¼K¾–ŒË¾¢wü7zò뎸Ҩ5[wÚÔ¸[~}ÕWÊJÇ×±f5 õí€âVý7·í¿Uã²O¹hO»x)Û­à•€lšË¾uhvü— 1~S‚­óÍCµìàŠ¸©Ó®û7ù-ÿz¹y£ãwRÇ·!cRþ[Ó¼5­NÀ|úelN=ßlêox3ð€fàµôMȸ\”F7¨u_2õe¡î“r3ðÁܸG«lš¯ãrÓ@gÙŸZ!â—;U_,J¨«Ò®5}6ªE ¥üþÝPHŠ‹N g£wŸ•Þ51u©ƒ<ÀcÕå{þàO®ü9+ŸþÑ8µÁ©–|,û€pÜ9Óó¹è”ܧ.'_%÷E™“ž-äüÍ'Ý¡gxìüS¯Ü¿²>'otÆýó¿—¹}3âsøù’'€¿xq™ÛÍEÇ·krùÓ™þ áȃs9å:#ž!´§/ÎòØ%棸èÌ 9âg<~‚þúÙøsÀŸÃ}ÏGylOÞèØÂùÅŤO¿b¦÷ôŒ“ž?kˆ.ïgóF§äþÌ*7.:Žð‡P¯»/8ùäÖëËJ§Ä~ˆ*ΣžŒxéâÔ÷g¼tq^÷‚U|ýó].ù²Ý§ÐÍ%3bŸûà8ù-áçÍØèñiR£/rÖ?|íãŽ/ãÆEž‡ðµïogœí+á¼6wíü‰¹Üó‰*+=G|îñ,€¬í·E|öG—W˜éqû}˜ZÛò“7:¶ˆO=9»Ìí,a“Mn¨?Œò(·ú‡Lôñ9Ü^{Ý®ËI¿„ŸÑe£WfmÉu™éý†•ž-â½/˜ù|ÄÚ/y£sÙý>[Ì»åËÜN>}àõk¹í_¼ö'ot¸ßë~†=gíäk¯ÿ\ÂÏÔ³ÑãŽ#q·—›¿;9—ïüíòó•w}Ë7=×KÙ׋?b¥ÇÇoœ¨”þh‰Þï™é=å±øÚ÷Œµ}Üò*ažPrz¡û‹Í'þ/ŠÍ'Åæ¡bóI±ù¤Ø|’§Í'8p;h‹´‘´ ðs¿úäb·ÓBνւÎ{C't¿ Å/,mai‘%ëÿ@ÈTÍ<›graph/data/integrinMediatedCellAdhesion.rda0000644000175100017510000000535712607264574022052 0ustar00biocbuildbiocbuild‹í\[l\G>{ή÷ìæR·5¥…ºåÖ¤Ùk;uË¥g½vl7N²Z›(¡/=¬×öÒÍîjw­4ÒyH &/HˆËKß*U!Šhâ4ª’¶€H}‚ q{àªJ‘PÌÌ™Û?çì±½c;Ù…±t<óÏÌ÷ÿÿü3³sùçœÂä©LúTÚ0 Ó0môßBѸ‰þÅ £?…ÂÔì±\vºáÖWŒ˜uW 3Q­-–š(ÒžQ\Ãg¦'@ÎpÓ…‰ /qbžFûfÜC·É2 ⼧ ,?vZˆ’^k•+åÖ9š˜UàTRÞ¯j¤ƒÔHªJþˆ*pö¼0î Q•éb=ËQÓ$£N††c4<¼]ÆCM¤áÃjŒ… >FÃìöš\ÓQ51UãÇXUnÐtÆi]‡U°æ{HÅš‰7ßÇÕ%ØïE¨ç2Æ9Õ*Òª9ŸPmEÛ˜Î'©äGT%+«ì(Ï+gTYUà„Z-&‘Õ•Ík Ø%-g‚JÎÑpJ‘éL˜3©jÄ)e ªÑ;ŠÉÚÛ™U5­«jÇ1iªÁ´ªÑrªÀUk+.iv°«ªIôvÝÐÛu£7¶ë¬óò^mã^=é¶Ü6‡RñEœNFÇc[ßí’8[*/¯´ŒŽöÉ©‘©‘©‘©‘©‘©‘©‘ù¿Œvw£¶©‘ÙMH©Äc´D É{à,Þ& ütœÐâTžÐâhž0çæ¤€81Dz8ù·s‰FÌ!DÌ=qàocúû4,ŽŠ}l\4LsGAE=ÉY&”'|Iõ„ß ‰¢žðØ(êÿÁ˜n{”ì—Æ%=áb؃¢ž|mcëyÂÝ@h`AŸ†ó„ûÁFXØIL ¼O ¿E “ÐIAŠs„7Lí0 •Á4ðmøÅ…#‰t “еaãà˜ðË ¸j)õ.Lo‹ãÀ)¿b@`U i¬©Ý/¶Ÿ"¬å—˜‡5J‘á¦I¢(Ð1…IX'?_¸l’¨(ìN˜­ƒIÐ:˜” „€'&ågmh‚ð %‘h˜r<è*²qp¥üLÀ …3=àD²qÜž¤õ"÷èoM yÙKKîj¥ÕÜî Ç9&Š·‰ÙõC1n«ÕðyrádÝ->á.—wÂcÙ¿î3«Œo¤ËŽÁ>¬ÞíBÝd€¶×7Ö'r©o¤@ºQª.–³Õ¥šPÁ ˆ¬˜w¾m&“Ó.3^w`¨"P…ª¤üÌIáMÚÙ^,7JÅVi1Ü„—ö jÁ{Q¦¯^—éo|^–{¶Ÿðýy=ʹÒóûœË é—ÿHÃ?ÑðÏ4$Íá\Ýq çò¯hþ¯iøþ–„/<-ëõÖ/§ôužvÒË|ÿmÙ&/®^oUd›¬½&ã^ªø¼)Ó¯~S¦_ü+¤÷:_$mç\x†/Ó¶ÙÒVÎkÆyÆ(ýJ¿Dè_üÃñ÷ŸòÃÿ$ò’Ü >ó½‡ez­)Ó×¾-Ó_ûŠLõ ™~:.ÓÏ~Ò¦så6¢ç•¹ÜåßÉô+œ—p?üÁ];ÓÎó×Húó?¢áIøê{Iø÷ŸÊ|.=GÒ/ÆÊ×y}ãR–±œòï ö³$Ñyå)9í_$}íþ[–ñ¥!H'œ' í<éÐ0OÃÇiXêd:×>ç×ǹòs™÷wGaYøÐþøOš­×ÿÇëˆÞ[<€Õ8D÷CÓ§es®H vw“4ÜêhcÊöɘ4ÂÓuÛý%ÜBZí;ãCïÐÂhk=°9ÅuÜGkbF,Cb™tnó€ÏÑ¢,"M[Œ3ë"±U‘µóÚïÇàš¬³öbëòù‘¯g_¯9—z )•è£%BŽ*ßX´gëº8ÜžÞ;r†˜^¿Á‡–{Ö£(÷è}zÿf ©>Þ›š<½Z½ §Fšª`õ5k«b›mŽC&¬beMãlÂJ¸ä< ¦ðDtÀ¸i«5½ë‚ƒœÈšðÅÆÀäjÒÇ /›ÄË—Jsw,jîVáHÏùCërÝÞò%¥ð˜*Ǿ(އU9&£8>¨ÊÑŽâ8®ÚL)ÒßÚ7ÓC4bŽ*u¬]:BcÓ§°4è)Sç:ìÔAy­»'’e§–ê¸ZêvèTZ©‹ãnr znè>æð)õx¼íÁÇR8m <SÖã<Æ»k¦Ó¾ÅÅ%©¸÷Eˆó‡n@Úˆ’4“XÎxW¤õ¸¨Œòè 6MÌØVƒ`Ýî@Ï»£tÎdxLy* „ë¬n†;#Y*Ï?wE²ìtRÏï‰ÔAy‚¹;’¥Ò c-±µ0›ö#8#::ûÁðg¥ .¯€Ú(ÅJâë{Ðs_dÄOÁ0)õ,<ÑsoÔálDy€½?ÒDÊk§ iËNÍ >v¸ëšÄR!¶¢)ƶ/!êÑøÌ6¢<î‰låÓû£XŽ*°›´H” 0ô–\oÉ#>\Òö<9ø©Ñ®?¡ÕHÔHÔHÔHýÒ±Fj¤F†v‚ìâÝ&ïÌöØ;²›½ä~‰s×_Úì‰×2õ«—ê¯^^¯ì·(éØ×7ˆŒ®¿At³ÞV !‚B‘WM™c@ñÖ-æÅï‚XB¡RÛ”uÀµë=OwõÞ¹,o–ñu¸¶ŠìúU9~x‹oH#'xeÛ¤Ï.Ý¢º‘÷·M*ËŒª —Óm—¹·úºÈFgïv¯í04²£=˜MKlöŸÎ¾Ò³ÉWxÀguôºPO–Û[ûÈËÅøó&ôƒ$a®V\mÎùó+ÿf ,`7W?3=Wn¶˜èÿGÑWósgraph/data/pancrCaIni.rda0000644000175100017510000000137212607264574016323 0ustar00biocbuildbiocbuild‹íXKoÚ@6C"AU¨ÔGz(jBšRõP  ²!§•r]á A!ƲM«Jû£û ’îîxmü( ®ÚK‰d<þf¾™ñî¢oˆ¡ÞœTn*’$奼L? Ô,æéGN’ªez¯ØÈ;}4´¦R®ð2æÝ²æ&v©Q¥×‘5C¹öííÑPk§âÉPô UøJŠqyq>84EûÒlC›’”Ðî »ùUóíBOQEK}åzôAü¬ŒN´ã¥ò½QÀ骰·®Z/ëõõ=pÑZä¡ã?4Ý…m;ØuÈžÛ^ëµï¨6Ç?¼¹{ßj8øanø^YÞôM4ø°©^)¶3ŸMo[‰xv›c<›5Ü…óaÑ…ÇæëtÃj°ðüNÒ>[®ݺ—} ¾{è!ؽHf>.eÝã'„ÒYd)>=‡ÈÚÉu_-—_‡ØXŸÈZe§˜^zí¬_µ™­jÞ¿ï¯_±•mò‚Ø=ͺÂo³ÛÙé€^‡ëV\»Å ïô.ëb¼ÏJ<ûÇÄÿ… ØÓ_&±ÞÁFÈl#Tä¡”‰¡h26´?ÕŸ~®<ÕÛßñtrç¥}6Ì sÃÜ07ÌÕÌHûuÀ"v˜.!ˆ*sÄn)FÈ$‡öAµ„@rÑhô’C»>‰€nBMF! ž9ÀÆy…̬C"´4(¦!¨˜C ªˆU%¾´ÂÊFI &„Ó¦ˆPcŽñ¶HŠòÂûBÄ×ìÖñ±oÄô\PÄÄ—¹ê<-IìÐßI÷'ÄÛÄ·h1óÜ?=fá\6ž!—¥[—‘ç9|Fˆ—l4¾G˾5q}É“-³ÿBDçmÖ^-l·{–ŸV÷SN —«¨8Ø2±3´nça ùXÉ䜚êuÒœE91bâE–{Éð*eîTÃ!-cËæÔÁc›¿9|ø£ß&O.6/ru®?³Céñ)‚8‚©graph/inst/0000755000175100017510000000000012607321273013653 5ustar00biocbuildbiocbuildgraph/inst/GXL/0000755000175100017510000000000012607264574014317 5ustar00biocbuildbiocbuildgraph/inst/GXL/attributesExample.gxl0000644000175100017510000000226712607264574020544 0ustar00biocbuildbiocbuild main.c 555 1.234 true false test.c 225 316 127 1 2 true false 4.5 42 graph/inst/GXL/c2.gxl0000644000175100017510000000573312607264574015347 0ustar00biocbuildbiocbuild main carey max min a b 8 19 graph/inst/GXL/complexExample.gxl0000644000175100017510000000565112607264574020025 0ustar00biocbuildbiocbuild main max min a b 8 19 graph/inst/GXL/createGraphExamples.R0000644000175100017510000000035412607264574020370 0ustar00biocbuildbiocbuildgxlFiles <- list.files(pattern="graphExample-[0-9]+\\.gxl\\.gz$") graphExamples <- list() i <- 1 for (gf in gxlFiles) { con <- gzfile(gf, open="rb") graphExamples[[i]] <- graph::fromGXL(con) i <- i + 1 close(con) } graph/inst/GXL/graphExample-01.gxl.gz0000644000175100017510000000046112607264574020306 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-01.gxlÔ»nà à=OØ !·6QœLQ—¨s×ÄàK‹8_ð¥Ã‘+ýƒ% ÿ§Çû㫺±§q÷ÒÖ Wb·Ûç¯Û.<,¬Ö÷8Jxá}³“²m[‘?g…6òóû,Ãâ›Jh¯y ƒu—¦`¥Nx7ú:93:7•Õ&áZ—ΤÞô¢'uXêÄe˜”ãìDæ dR £Œ2ÉLdJ óó&~†.£8Ëœ­b3™·¤ï15a£Ñ¸YsÌj4¯³&©³!Fæ}4^çƒä<[b½©9AABÑ£A ‚#©%AHïÔŠ ¨k‚ FlʦPÿÖÝkñª”Ã]y˜ý s•RMgraph/inst/GXL/graphExample-02.gxl.gz0000644000175100017510000000041712607264574020310 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-02.gxlÓ= àÝ_AØñ[cu2.ÆÙÕ¶M,T ­?_(e!5¹¡ åÞ'À%w8}«7j…6¥’fd†OÇ :äß÷Þ}ÈU¥ñ« ÖÖ{J»®#ySkE¸ —û•ºâ”F¸åØÑÁêG] ’g¸_ÝÎWŒÏE¥¸Èp#y©ÅÓŠ ‘®Ô 9lÒ¸;’Q€L È| È@Æ2 ÓþÏø÷†ÑK«Ê?Y•ô§FÌ<Œ˜EbÀ,£1ðsVÑØ`>³NŒ˜M4 ¼oÛÄ@ÎÙEÓÂ{Àf ½\øë§Î2&ù8ù/('Eëgraph/inst/GXL/graphExample-03.gxl.gz0000644000175100017510000000033112607264574020304 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-03.gxl‘=ƒ †w¹½PÚÍø15]Lç®Ö£j¢`«?¿€ºÛ8÷>.J§¶!¡ûZÉ8=Cš$*§&´‹ØTö®Š¡2¦ Ç‘–C§EÁîÏŒÙðÄ)§h¬º¸:ï*Rc ¾zÜ2 KÑ*1 k- #fcV¤¼‘/M¶vw˜×¦8ÀàoÆ=×3È[«ÖHŒÚÜí¨ç²qòÎuuð3ïü§º9±ePIð~½ÍbÊgraph/inst/GXL/graphExample-04.gxl.gz0000644000175100017510000000173512607264574020316 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-04.gxl•ÚÉnÛ0…á}žÂð¾6©"ƒ «¢› ënÓH±xЇXòÓ׉c8HŸ‹q|?X¹<¤ä‹ÞÜ·‹ùà½Ùlg«åíÐŽÌðþîjp3iç×§ƒÓ»ËíÇO·Ãén·¾‡Ãh²_oV£ºÿúó0>½ùÃŽì¨ÞÕÃý²›Çõt0«o‡Ÿ?ýþù04õ¤Y¬êæv¸_Ö³Mó´kÎâL–§·>Åã×/Ç—ß~SóÔ<šÔ4 æÔL@ÍÔÌ@Í ¨y5sP³5KP³5kPój6 f jv fjÞAÍÔ´ ¦5Çÿ×|lãÏ;DZîsAd»ûBІ >ï¼åÞ Bƒ…J9#¼Dž,}DnÁ"‹¬ ²ÝC&ˆ$"ä‚H"B!hGPŸˆß¹Á "‰• ’ˆà¡U„3ƈ"‡„5VIŸ5™(?krQ$Ö¢ÞÒ\ãÅ ¹yX£ÉØ#¥ÑxGªÏF›0‹ãË–?8Û8¿l†iq€Ùòg'˜mBæã³MÈ|œa¶ ™CÌ6!‡qŠÙ&$*Ž1[~Z«Ù@‰Ê4¤últüܵq”Ù%¤7Î2»„UŽÃÌŽG²qšÙ%œlqœÙñ›¤óÌŽß%mhv 9ŒÍ.!‡q¤Ù%$*Î4 “û8Ô<&¬WœjÖ+Ž5 w¢8×<&¬rlîDq²yLY// q¶ù¥ÚïÔùÕç[8½üzÕÎï®þÓ=,!graph/inst/GXL/graphExample-05.gxl.gz0000644000175100017510000000026312607264574020312 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-05.gxlm1ƒ …w¹½PW#:5]Lç®MïŠ$ ±øó‹H7‡KÞ½÷¾\®í·yb_ò‹¶FBͯÐwkÕ65iXJͲ+ c®"ÆÈÕê¼åHâþD /5¯9„„Ö¿ÜÈ4JÈêq€*š-’„Õ öôtbR” *¦ø»'ÏYçØòÁýQžèªp ùrægraph/inst/GXL/graphExample-06.gxl.gz0000644000175100017510000000040512607264574020311 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-06.gxlÓ»‚0€áݧhºÛŠ·NÆÅ8»[ B/Ö*<¾-……`r’ÒóÓIÇN6èËí»Ò*à Yác¾@Ñ5©ÿŸªw8e¸tΤ”¶mKÄÇXM§çÛ…úá2! aŽaOkï¦DËpºž.q&¸ÔŒgø£XeùÃñ("Q~Ô >\Òñv¦)4% ©ÍÐÔ€¦4Ð(@£4¯ÿMXyß$V˰8äôdÇ¡š1ëÑÈh €ÙLL0ÛѨhÀì&¦˜ýhL4圉ý£ ï1_ü÷륪graph/inst/GXL/graphExample-07.gxl.gz0000644000175100017510000000052012607264574020310 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-07.gxl•”Ínà „ïy Ä=&$ýâäTõõÜkR6ŽUÆuÔ§/Ø8bà` ³óíbψÍîÂ+ôª)¥È1Íx·¡Mq©ÖæA¦*»ÊñYëzMH×uYÑÖJf Èû瞘âœf4cšaƒ:Vê3*YŽûÕÇÛ#`pÉ Ç­`¥‚/ 1 ”zBµÂm“qߣ*…V2ÓìXEè¾A ˆþJ~,!BØTuÜ 9ð˜†Ý!²_¤R@VY·zÅè¤$wi9qÈJ=àrÈ•‡¼÷;€>Œ¨34aêãˆ:‹{tš‹ý4ÒƒïiðóÍÛ0¤Ñ/>z¿üz=· MJ7ƒÿñi C<õò÷é Ñ×|Ù'N^ùØÐàá­¿ÈìÝHÜå¸ý~ßÞH>graph/inst/GXL/graphExample-08.gxl.gz0000644000175100017510000000066412607264574020322 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-08.gxl•–ÉjÃ0†ïyŠA×¹^Ú,Ä ¤ ¡ƒ›å*ÕØr•Æ}ûÊ[{qÚ1Ø`3ßÿ3£±GšÎó$†O®2‘JŸØôÌg=˜Fy<17˜¨ÌŠ'Ÿœµ¾L,ëv»ÑèzQ)eÜZ7– ljS¦1ÒZ«N—3æ“òéuµ!ÀYÄ“”qŸ\%Š¿k^)*‰4¡Rñ¨Ï°bB›Œê°ÕÄ[è§Nô‹Ô\±“>!Øa'çýp‹ F‰ù!b¶DŒ!b,“19S1%³#böDLEÄÔÿÇ -¿Å×ÉÚ¦šât ôoˆzb‡1£ÙF‚až£Àl £Æòk‹À0ωÁÂ$“ñkKÁ0k fqB² šF!çS•“Då¤Q9MãPð£*b@TN *§“SÊ4MDÉ77 19…•“Då¤å Š š&b÷Bõ@ÔvœbfO€˜>Iˆé“ 1}’PÉ i"ö/ü1i@LÉeˆ*y ˆ*yˆª^ ˆ©ž í4MDÅ—\…€¨— ˆ)¹R€˜’+ ˆ)¹Š1‹Š1‹JQÍM1ÍÕ =ƒ¦‰¨ù‰Ð! f"´D½*@̦5 ¦¹:DU/T=CãÙí®?½Ÿ]«åÛuñ:D6graph/inst/GXL/graphExample-10.gxl.gz0000644000175100017510000000027412607264574020310 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-10.gxl1ƒ0 EwNyoRVD`ªº Î])¶B$HP Çotc`°dû¿7Øe½Žû’›µ5r~‡ºÊX©Ö¡ˆÅbjæ­“Ð{?B„¸Z&g9’x¾Ã[ÎsŽ!ª‡ëÚ©g%¤îõh€*-’„Å vÔyÚ]11JF{,Å{Â|.0Ý/0tÆìS:nû—8Ve?¦Í xRgraph/inst/GXL/graphExample-11.gxl.gz0000644000175100017510000000032712607264574020310 0ustar00biocbuildbiocbuild‹¢`áCgraphExample-11.gxl‘±‚0†wŸâr»­] …ɸgWc+@KJ¡èÓÛt0šthr¹ÿû’濼\úfiÆV+ŽŒ°,v×K—ù>Uc˜86Ö¥Î9ROƒÑDHzºTÔ‡{FV W7×\‡ZÁ1Nçc… E-{-$ÇI‰ÖÈ›•«±*ÊGѰے¾·?˜)™—À, Ì#yþgB5‘aw£ûðy°ú«‹@ņé§âp+º«Ø½^»“Îgraph/inst/GXL/graphExample-12.gxl.gz0000644000175100017510000003157512607264574020322 0ustar00biocbuildbiocbuild‹à`áCgraphExample-12.gxl•½ËÎWÒe9¯§Hä¼3ýÜÏ)Ô_5jô¤Ðãž*Sw‰¤’wñé;þ‹|9 Ë ¤¤Ø ±lÛ¶ü"þÇÿúúæ÷¿|þáý‡_Þ½ý·¿¦¿ý_ÿó¿ýåüôõ÷ÿþúß_^ÿõí‡ÿÿöן?~üã¿ÿýï_¾|ùÛOŸþxÿîoßÿð÷ÿçÿûßýÇÿ+ý-ýíûßÿõ%ý/íûïþøù/¿|ÿoýÿ÷ÿþßÿû¯ùáûŸ~xóîûþí¯ŸÞ~ÿËûþùñ‡ÿTü§äíë?ý‡â»ÿú—?ÿíÍcþ!óOñ˜ïÅc~ùQ<æ'ñ˜ŸÅc~ùU<æ7ñ˜ßÅcވǼy'ó‡xÌ¿ÄcÞ‹Ç|ù(óI<æ³xÌñ˜¯â1ŠÇ|ùN ªšT5ªjVÕ°ªiUãªæU ¬šX5²jfÕЪ©Uc«æV ®š\5ºjvÕðªéUã«æW °›`7Ân†Ý»)vcìæØ ²›d7Ên–Ý0»ivãìæÙ ´›h7Òn¦ÝP»©vcíæÚ ¶›l7Úÿ‡Ùþ÷ýJýËïß½ù÷ü—ï.©úßu£É§æ{¯)Í?„¦žšü¯Ó.óëô‹æŸB3NÍþ÷6/ó{[ù½¥ã"úÁˆ6 ?ù?QÊÑ÷FT."õÛ«ÑF´iøùÁŸ©_DæeJã"R¦y©?Ó&â—{\DæÏ”ÓEdØËù"2Där™g/׋È<{¹]D?Ñ&â×ÏÞ¸ˆÔ³7/"õì­‹È<{师̳WÒEdž½’/¢_ŒhñÛƒS/"ó:•v™×©ô‹H=åã"ROù¼ˆ~2¢u™§¼ѯF´‰øÝ¿N5_D* ”‹ÈŒF­‘yÊk»ˆÌS^ûEdF£Ž‹H½Nó"R¯Óºˆ~¢¶‰xó €¥‹È¼¸-_Df[¹ˆÌ¶z"Z»ˆ ­_D†ˆ6."CD›‘zq×Eô»õMÄ[ODO‘yq{¾ˆÌ‹ÛËEd^Ü^/"óâöv™·÷‹È¼¸}\DfÜû¼ˆÔ‹».¢7B46ï<#]DÆ#F¾ˆÌå"2DŒz"F»ˆ £_D†ˆ1."CĘ‘ñˆ±."ƒÑ¼a0šW"ÞÑ&âGx¹ˆ {³^DÆÂf»ˆ °³_DÆ÷済 ås^D†ò¹."Cù:."CùJ‘¡|]‰0”¯+†òu%ÂP¾®D¼3¢MÄ¿<åk\Dªkš‘¡|­‹HU@ÇqQ©êãH•A6ù¢2̦£\TÚtÔ‹ÊP›ŽvQlÓqà ˜Ž+ÆiÓqEÛŽÍÆûý[Ô—ïpÑ_¾Àa˜ïp æûF…ùþQÑa¾@T”˜ï-æ{ï„)jÌ÷ˆJW6QùÊÆJueã_JµÙøð¤/•¢7ÊÌ8Œ6óãÎüðÀ£Ïüð€Þ(4?<à0Í8ŒJóÃ?ŒNóÃzË• Eo¹²¡è-W6½åÊÆ{¥Úl||À|4›0ÕæG7Rt›ø|”›ÌW´›LJÔ›LJô›LJœLJ4œLJ½²¡&¥^ÙP“R¯l¨I©W6Ô¤´+”j³ñéÁ¤DÑùéóÑt~òGaŠªóÓæ£ëüô`§DÙùéÁ¤DÛùéÁ¤DÝùéA"оóÓƒùŠÂóÓƒùêW6Ô|õ+j¾ú• 5_ýʆš¯~eCí”~eã£Rm6>?˜¯(>??ØDÑ|~~0•Q}~~°‰¢ûüü`–£üüü`*£ýüü`¾¢þüü`¾¢ÿüü`¾¢ýü`¾Æ• 5_ãʆš”qeCí”yeCMʼ²¡6Ѽ²¡æk^Ùø¤T›/¦2šÐ/æ+ªÐ/æ+ºÐ/&%ÊÐ/öW´¡_ÌWÔ¡_ÌWô¡_ÌW¢_ÌW4¢_Ì׺²¡æk]ÙPóµ®l(æ×•ÏJµÙøú`§D/úÕ3Ÿ£ýê3[Ž^ô«g>G/úÕ3Ÿ£ýê™ÏÑ‹~õÌçèE¿zæsô¢_=ó9zѯžù|\Ù0™-W6̤äteÃLJNW6Ì&Êéʆ™¯œ®l˜ùÊéÊÆ¥Úlüé7QŽ^ôO?Ë9zÑ?Ìrô¢ú¤—£ýóD/úçˆ^ôÏ½èŸ zÑ?8@ô¢>p€|eC9@¾²¡ _ÙP¯l(ÈW6ÌÕ–Ë• ååʆɢ¹\ÙP¾Q®l˜,šË• åÑ‹~{0ËÑ‹~óY4G/úíD/úíÁ,G/úíÁ,G/úíÁ,G/úíÁ,G/úíÁ,G/úíÁ,G/úíÁ,×+j–ë• 5ËõʆšÊzeCmózeCÍr»²¡f¹]ÙP³Ü®l¨äЮl(hW6¾*Õfã»ïŽ(FO™JÑŒž2eQž2÷Cë*S–åè)s?M‘®2e:Qž2å:Ñž2e;Qž2å;”( é DmöJ”‰tP¢\¤ƒe#”( DÉ%ÊI(QV2@‰ò’JþT2PòMÉ6%ÿøÇ Šºô”©¤}é)SÎ…é)SÎé)SΕé)SÎé)S¥é)S­é)Sµé)Syd‚å%”(/™ DyÉ%ÊK(Q¦°@‰šîJÔt/PòJQ þóÉÏpGƒzÊ”+D…zÊ”+D‡zÊÜO6®«Ìýlãq•©Ÿš‹õ”©ŸoŒõ”©ŸpŒ"õ”3)Ѥž2c&å%æ"*(1ã]PbÆ» ÄŒw9@‰‰ %ã %J%ÆLJ%ÆLJ%&*”Jþ¡~†6jÕïŸ|&Dôªß?øXˆÅê)S?³Íê)3T¢Z=eêçv£[=eʃ¢\=eîg¬ËU¦<(êÕS¦<(úÕS¦<(ƒhJ%ʺ2(1§XÉ ÄħR@‰‰O¥€å¯”(- De%Ê( (QFY@‰2ÊJ”QP⯓*ŠÂõ‡ŸjS¢qýáÁÛ”¨\xðÙ6%:×S¦œ2J×S¦œ2Z×S¦œ2j×S¦œ2z×S¦œ2Š×S¦œ2š×S¦œ²å” ”(§l D9e%Ê)(QNÙ@‰rÊJ”S6P¢’h%Ê`(QÛA‰2ØJ”ÁvP¢ ¶ƒ•D;(Q×péÀÄùy'ÎÏ;@ù^yet°?>ø±ì>D¬DûãƒÏ+ÑÁž2õg‹öÇ@V¢ƒ=ej}D{ÊÔúˆö”©õì)Së#:ØS¦ }€eè”(CŸ Dú%æÍ‹2A‰Ú”(CŸ Dú%Ê™'(Q;A‰²Ø J”ÅNPâ,ogy œü |!jØŸ|4a‰ö”)«Œö”¹'¥]eî9éW™{JÆU¦¬2ZØS¦Oì¸ÊLö­Ñž2c•õ%Æ*ëJŒUÖ”«¬(1VYPb¬² ÄDæz€ã°õ%&ûÖJŒÃÖJLö­ ”c® ”c® ”¨0Z0QÎ\8QÎ\@QÎ\HùQ}À^4±??ø`ÖMìÏ>šµF{ÊÔ“Mì)SÏe4±??øT×Mì)SŸ:Mì)SŸ;Mì)SŽMì)SŸ=Mì)SŽžA‰rôJ”£P¢¬¹€å±”(- Dyl%Êc (QfY@‰2ËJLŠ­…^¢Ì¤ÒL”›Tº‰²“ PœÇVú‰2”JCQŽmì/>`ºFû˃O‹®ÑÆþòàó¢k´±¿<øÄèmì/>3ºF{ÊÔ3mì/>lºF{Ê”ÉF{Ê”ÉF{Ê”É6P¢L¶›(QÞÜ@‰ŠÍ ”(oî Dys%Ê›;(Qù·ƒeé”(Kï DYz%ÎÒ;0q–ÞÁ‰‹Í 8K ÅYú*ÎÒXùÙ}:õ†å×_¬‚(d}ðyù5 Ù_|Ž}Böןd_£=eW™{&×Uæ>éû¸ÊÔ*ˆBö”)OBö”)OŸ D¹ì%*8OPbzÜ:A‰rÙ J”ËNP¢\v‚e— ”8»\ÀÄ%ÙNœ].€âlog{ ¨8Û[`å5­QÊþöàK+j”²¿=øÚŠ¥ìo¾¸¢E){ÊÌk×¢”ýíÁ7^´(e{ð-JÙß|ëE‹Rö”©ÜRö·_—Ñ¢”ýíÁf´”¸¯b%&Þ·”˜UÐ(1»%PbVAK Ä¬‚–@‰Éé-“Ó[%fƒ´JÌi ”˜ÀÝ(1¤%P¢6HËÀDî–Á‰Ú<-µyZ)*¨· TÔÆj¬¨Õ2`Q«eТ6VËÀåWåaÑÌþþàkZ4³¿?øâŸÍì)sß“¯2ÅJ4³§L¡ÍìᄄE3ûûƒ¯jÑÌþþàK€Z4³¿?ù hfO™Ú=”˜{¢UP¢–H%j‰TP¢–H%æ i”¨ÝSA‰Ú=”¨ÝSA‰¹^Z%jeUP¢VV%ne5`âVV'ne5Ú‰ò“RÜêi@Å­žVÜêi€Å­žZÜêiÀå7åaÑξyòefÑξyòufÑξyò5cÑξyôEcõ*S/]´³§L½ÑξyòucQξyð…c-ºÙS¦˜¨fO™Ú=”˜÷'Ú%ê\ DmºJÔ¦ DížJÔî DížJÔ D-‘Jœ©O`âî NÜ2˜´å'“~¢ eÒP”£L°â–Á,nLÐâ–Aô³oß>põègß>ø&ÃýìÛßeØ¢ž}ûàÛ [´³o|Ÿa‹röíƒ/'lÑ;}ðõ„-ªÙSæ¾²²_ejD1{ÊÔ2X D-ƒJÌ2è(1Ë  Ä,ƒ~€s¿ô”˜ÒPb–A?@‰9DúJTÄï0Q.Ûp¢\¶E¹lO E¹lO@E¹lO`E¹lO€å×í»_Ú£ =eê{f£ }÷à{E{´§L}Am´ï|!i‚ö݃oíÑϾ{ðý¢=êÙw¾a´G;ûîÁwŒö(gß=øÂОA‰1õžA‰rç J”;gP¢Ü9ƒ“¹{%Êf (Q6[@‰Éܽ€çΘ¨¬Þ 8QY½€¢²z/ Åm‘TÜ)`Åm‘XÜ© Åm‘ \Ü©àåwõeÖ•¶¢|¥ÒW”±DGûǃ/îÑÑž2Egt´§LÁí)sß¾®2÷éÇU¦ÈŒŠö”)0£¡=eŠË(hO™Â2úÙS¦(i Äܽµµ(Q[«µµ(1o¥ôJÔ)ÒA‰:E:(Q«µƒµZ;(1uVï D­ÖJÔ{"½·Z;8q«µ·ZHq+r·"Xq+r·"hq+r·"xq+r€·"xy§Ü/jÚ=ø ô-í)STGI{ÊÔÑÑž2ÅtT´§L! í)SDGA{ÊÐÑÏž2ÅsÔ³§Láíì)S4OP¢`^ D±¼@‰ByµÈ(Q‹|µÈ(Q‹|µÈ(Q‹|uµ.Pb6ò8@‰Z­ã&jµŽœ¨Õ:€¢Vë8@ŠºZÇTÔJXQ«u€E­Öq€µZÇ\Ôj‰®ble$ÚŠñ•‘è+ÆXFt´ïßûÕ:¢¢=eæØQÑž2uT´§L±í)ShFE{ÊÌjQÑž2tT´§Lqí)SXFE{ÊÌŽ”(˜3(Q,gP¢PΠÄ,»‘A‰Yv#ƒ³ìF%fÙJÌÕ: (1;rP¢vd%æj”¸ÕZ€‰*’G'nE€âVd)nE ¢®ÖQÁŠ[­°¸YA‹[‘¸¨ësTðâVk/nµVðâVk/ÿ2¡}DGûáÕí)SÓí)S+9:ÚS¦f(:ÚS¦F(:ÚS¦&(:ÚS¦(:ÚS¦æ':ÚS¦’it´§LM]%jè(Q³ÓA‰JÔätP¢§ƒ:(Q ƒ:(Q ƒ:(1µõè Då†JTn Då†J\nÀÄå†NÜ)?ŠË¤¸¼1€ŠÛÿ¬¸ý?‹Ûÿ´¸ý?‹Ûÿ¼¸=>Á‹Ûã¼¼W~íÇöt´§LQí)SPGG{ÊÔFŽŽö”©í)SDGG{ÊÔFŽŽö”©9ˆŽö”)œ££=eŠæJÔF^ DÍÀ%j(Q°@‰ÙÈó%f#Ï”˜<Pb6ò<@‰ÙÈó%f#Ï”˜<Pb6ò<@‰Ú¬ó&j³Îœ¨’|&€¢6òL Em䙀Šjf+ª˜ °¨0hQåúLÀE%‡™À‹J3•f/ª˜¼¨03xù Œ,ZÚOŸ|˜ÑÒž25}ÑÒž25|ÑÒž25{ÑÒž25zÑÒž25yÑÒž25xÑÒž25?ÑÒž25>ÑÒž25=”˜Ø= (Q3W@‰¹JLÞ˜”˜à0 (QóV@‰ ”¨àPA‰ ”¨àPA‰J”¨PA‰ºÉg&.9Tpâ’C(.9Tâ’C*.94°â@,n“7Ðâ6y£©(Wite+¶¢|¥·ÉxQ·ülàÅ%€¨i?~¢¦=ejŠ¢¦=ejˆ¢¦=ej†¢¦=ej„¢¦=ej'GM{ÊÔ DM{ÊÏQÓž2…sÔ´§LÑÕA‰‚k€µî(Q h€u¹P¢öÖ%jo PâöÏ&nÿ pâöÏ(nÿ âöÏ*nÿL°â.Ð XÜÞš Åí­ \Tw='xqûn‚·ï&xq—ë/nONðâöä/nO.ðâöä/•—EWûå˃ý]í)S.]í)S&]í)S]í)S£]í)S“]í)3»¢«=ef^Wtµ§ÌŒëŠ®ö”™i](1úPbfu ÄŒê:@‰™Ôu€3¨ë%fN×J̘®JÌ…½(1öJ Äœ•@‰ 8+pV%&à¬JÔa¾0QÁh%p¢‚ÑJE£•AŠ F+ŒV+ªÒ_°¨@µ2hQjeà¢ÕÊàEª•Á‹ T+ƒŒV/*­^T0Z¼¨`´ xQÁhð¢‚Ñ*àE£}íׯ>­èkO™r‰èkO™ÚèkO™šÙèkO™ÙèkO™šØèkO™ØèkO™š×èkO™×èkO™ F”¨a­ DÍj%jT+(QWA‰œJTTi DE•JTTi DE•JTTi DE•J\TiÀÄE•N\TiÅE•R\Té@ÅE•V\Té€ÅE•Z\TéÀÅE•^\TéàÅE•^T÷³:xqg€qxqg€qxqg€qxqg€—Oʪxù¬¼z€—/ʬ£³ýóÏ™**ÛS¦Ü,ÛS¦Ì, ÛS¦<)úÚS¦,)êÚS¦)ÚÚS¦ )ÊÚS¦|%ºÚS¦l%ªÚS¦\e‚e* ”(OY DYÊ%Ê(Qư@‰ò…J”-,P¢\ae ”¨(¶@‰‰bé8€‰ÊT/!íÄøÉKTT:z i)ÆS^BšŠq•—¶b|å%2*鼄€FE—ب¬óvÒ‘@ŽJ;/!-ÆxÌKrTny AŽ ./!Æ8ÍKH«1^óÒlŒÛ¼„´ã7/!ÈùjnÆ—p“óí›o’ÒMî©3ùå¥KW3œhrOó›hrOI>/]½êœME“{êœKE“{êœ×D“{êœÕD“{êœÓdðâü¢€“d^:ðâl¦€g¼˜0óÒç1¼8§(àÅÍ{/&™¼tàÅE“BqSŒÌ4Ĩ¢è%¤Å8©ôg2•&ã\¦ÒeœÍT`#ÃP72 U€#ÃP92 5#ÃP92 5£ºŸ—äÈÕ@ŽLQ äÈÕ@ŽLQ äÈLÓ@ŽÌ4 äüéL.:ßï^.õ Eé»….ÖDë»…Îs¢öÝBç9Ñûn¡³Ž(~·ÐYG4¿[è¬#ªß-tÝï:ˆòw  ’ã`çƒä8$Ç9À 9. ’ã¬cw€ ’ãbÕ 9άÉqf5IŽ3«Ir\$›$Gf²Itd¶šdG†«Ixdºš¤GÆ«I|d¾šäG¬I€dÂZ$HF¬E„dÆZdH†¬E†dXZdH†žE†dêYdHÆžE†d{´n<șк1!åBé¸q!eC)*ä¼4ߥ¨·Pe¦ò*+IQ!o¡r’ò*#IQ!o¡ò‘ò*IQ!o¡r‘ò*+HQ!o¡r‚”HŽ [)‘å )‘e )‘å)‘•™R"9ÊwR"9*ú¤Dr”ë¤Drœéd’ã<'“}R&9.ú¤Lt\•2Ùq¡)eÂãÞžK™ô¸¸•2ñqq+eòãâVÊÈÅ­TH M©!šR!C.4¥B†\hJ… ¹j*2äâV*dÈÅ­TÈ‹[©!õ·Œ^J2ä‚ZªdȵTÉ{Ÿ/U2ä"^ªdHµJ†¾“æuó?_Öå{±uó:ÓŒºy gFݼ…Î2£nÞBç˜Q7o¡3̨›·ÐùeÔÍ[èì2êæ-tžuó:Ëk$ÇùV#9ζÉQ…Zj$ÇÙ]#9Îí:Éq–ÕIŽs¬Nrœít’ã2^'9ήúç8Óé7¦ã\§ß¸Ž³~c;Îwúï8ãÄG®A~dàÈõ[iÜx3Ÿqc>Î}’k!¸’k!÷n`dHFµI†dT›dHFµI†dT›dHƦI†d36É \“ }sgê$Cÿô÷/zÕ¢ÞB÷+Fý¼…Î3£}ÞBg™Q>o¡sÌèž·ÐEµ¨ž·Ð9m4Ï[èŒ6Šç-t>½ó:›]$Çyå"9Ê*óAr”Sæƒä(»ËÉQž•’£,+$GEµ|euù 9ʯòAr\âÊÑqv•²ãWN„Ç%®œHK\9WŽåD~\âʉ¹Ä• r‰+'"äWNdÈ%®œÈK\9‘!—¸r&C.qåL†\nÊùÆ‚œår&”oLȹP&C®âÊ™ ¹¬–3r‰+g2äWÎdH–c¹"Ör!Eÿ”ö-ô/óò9/G ½…ò7[!”¿Õ¡³Ûh ·Ð¹mÐ[¨âZŽþy ×Fý¼…ê}ˆíó:§òy ÑV’ã|¶’g–•丸VIŽ3ÙJrœÇV’ã,¶’ç“•ä8›l$ǹd#9Î$Ûç8Ói7¦ã\§Ý¸Ž³Fxd@l¤GÄF|d@läÇ•y¹ -; rïžæN„d´ìdHFËN†d´ìdHFËN†d´ìdHFËN†\™—;’¡´“!-’Ñr!-’Ñr!WæA†d(dH†ÒA†l(„È&˨¡|y׃€-ôº_1Jè-tFô:· z ÙF½…. F½…Îj£ÞBç—Q?o¡³ËhŸ·Ð¹å$9Î,'Éq^¹H޳ÊErœS.’ãŒr‘ç“‹ä8³[$ÇyÝ"9ÎêÉqN·n<Ǚκ1å:å¸qe;å <.–ƒô¸|Xâãòa9Èˇå @.–ƒ¹|X"äòa9Èˇå C.–D†\>,‰ ¹|Xrù°$2äòaIdÈ•–%‘!—K"C.–D†\V+‰ ÉÄU!’5`ɤH†µ’‰Ñ÷ÒÅ¢ˆþéå$¾A,ÑCo¡üÍVåoµAèü6Jè-tvô:· z ÙF½…*Y–蟷Йt´Ï[è<ºgÑ…ä8‡.$Çt!9Îe Éq†WHŽ ˆ¥g”…ä8Ÿ¬$G%ËRIŽJ–¥ÞxŽ3Jt¤»V²#͵é­•ôÈ„X‰Lˆ•üÈ„X Lˆ¹7§K#B2[62$³e#C2[62$³e#C2[62$b#C2!62$s^#C2çu2$s^'C®, ¹°t2$³e'C®, Ù|Ø ‘͇ý M¬£¥‹Eýó˃¤Ò(¢·Ðí‡è¡·Ð=·QCo¡{f£…ÞB÷¼F ½…îYz Ýjˆ z Ýfˆz Ýbˆúy Ý^$Ç™û$9$Çô$9Ο'Éqü$9Î×'Éq¶>IŽsõIrœ©O’ã<}’gé‹ä8G_$GæàEtd^dG.‘ExäY¤G®E|äYäGæàE€d^$Èåàz!—ƒëA†\®r9¸dÈåàz!—ƒëA†\ÇZ2ät=ÈKÐõ C®c­rÙ»&2äÞ½¯‰ ¹Ô^r©½&2äR{MdÈ¥öšÈKí5‘!—Úk"C²K®‰ÉÀ_)’¿fb$ÍäHþš ÒOίkÑ¿¼ÜÖß 5Šè-T;´F½…îe‰"z å3; ”Ïë„P>« BµkÑ[èv`Ñ[èYÑ[èöX!9n’ãvQ!9n’ã6Q!9n’ãöP!9n U’ã|½’gΕäHo®DÇðZÉŽ4õJx¤§×ßqÆSoŒÇ9O½qg=•ÉÝH ÃÉ0ÜÈ ¦ É`ÚÈ ¦ ÉxÙÈ ‰ ÉØÈ ‰ ÉØÉ ‰ýƆœõ;rFÔïŒÈ9Q¿s"gEÙØÉ‘Mz ýìNó]ô¯¯ÃúAÖ‹&z ÝSMôº'(šè-tŽMôºç5šè-tÏj4Ñ[èŒ:šè-tuG4Ñ[è >šè-tYogÒƒä8ž$ÇE¶Irœ·O’ã"Û$9n'L’ãVÂ$9n#L’ãÌy’i°“èHdGF½Ex¤».Ò#ÍuØù‘½ç"@2ê-$£Þ"B²÷\dHöž‹ Éx¹È‹—í C.^¶ƒ ¹Þ³dÈÓvÜx2¡vܘr¡vܸ²¡v!LÛA†\0mrÁ´dHÓ–‘ ¦-‘"Ù^¶DŒd0m‰Éö²%‚$3mK$IfÚ–ˆÒ/Îw[´Ò¿½\ÓÇáôÊfAè^–裷н(ÑFo¡{I¢‹ÞB÷‚D½…îåˆ&z ÕlÑDo¡Z‚-šè-Tû¨e’ãVC&9Îß3ÉQá´’ãܽg´…äH·,DGše!;Ò+ á‘VYHtÊB|¤Qò#}² i“•¹xÚ*rñ´U2äâi«dÈÅÓVÉ‹§­’!O[%C2ðU2äÞèn• ÉÀWÉ | ÉÀ×nlÈùP#C2ð52d_#D6ð5R$›ÈÖˆ‘ |ÙÀ×’ |$ÙÀ׉’ |,ý*­,Êéß_FôŸH8aÐáÅô:¢–ÞB· £”ÞBÇPTÒ[èŠBz ?QHo¡£' é-tìD!½…ŽœArÜ$Ç­ÀArÜ$Ç­±Ar\É2HŽ Òƒä¸Še·p'Éqûv’·4'Éq;s’·ø&É‘Ëk¹»&Ù‘Ñ}ÞØŽóyã;Îxæñ8çY7Îã¬gÝXóžE‚dŒ^DH†áE†dãºÈl\’ë"C2€/2$ø"C®«írѽ7&¤\¨7.¤l¨dÈE÷~!ÝûA†dtïÇ)'ê)’ù»ÄHæï~#™¿{"H2÷D’dþî‰(ÉüÝYúÍu =zé7oÞ¢‘~÷òŸ¿GôÑ[è^˜è£·P-—}ôÊe@(_’ ¡Ú,#úè-t¯dôÑ[¨öʈ>z ÑGo¡Ú*#“µTF&9j§ŒLrÔJ™ä¨22Éq %“·O2ÉQ1z’ãöP!9n ’ã¶P!9n ’#wP!:r²#7P!<.FBzäþ)ÄG®ŸJ~\Œ•ɽUI‹Ñ£!¹ð*r³zT2äø¨dÈðQÉ+²G%C.ºJ†\t ¹è>’ѽ‘!Ýr e42$C#C2ô72$C#C2ô72dC#D6ôwR$ÿùèÄÈÞ Ù{¡$ùÎÄè$Éž(ÙS£“%ùÎÄè„É^)4Ù+¥“¦7Òµiz+m;ªé?^¦ëßÔQMo¡C?ªé-tàG5½…û¨¦·ÐAÕô:䣚ÞBGmTÓ[è˜jz ±QMo¡ãu’Gë$9ŽÕIr\˜$ÇŒIr\¾˜$ÇÅ‹Ir\º˜$Ç…‹Ir\¶X$ÇE‹Er\²X$Ç‹Er\®X$GnøEtä‚_dGî÷Exäz_¤Gn÷E|܆žùq zÈíçy ·žçA„ÜvžrËydÈ]Fó Cî2šr—Ñ<È»ŒæA†Üe4r—ÑL7&¤\h¦R64Ó )š‰ ¹ûf&2$ï›™‘¼of"Eò¾™‰Éûf&r$ï›™ ’¼of&Iò¾™™(Éûff²$”™ “üëS3“&y¤ÌLšÞ¹†hFEý¯—‹ù#eFE½…Žß¨¨·ÐÑõ:v£¢ÞBGnTÔ[踊z µQQo¡c6ê-t ? ê-t¨’ã@/$Çå„BrÜ|T’ãRB%9.$T’ã2B%9."T’ãB%9. T’£Ž”YIŽ‹•ä¸tPIŽ ä¸lÐHŽŒèÈõÞÈŽÜîðÈåÞHÜíøÈÕÞÈÜìÉ»¨‘  :’‰ “!yQu2$£D'C2It2$/ªN†äEÕɼ¨:’U'Cò¢êdH^Tƒ ¹÷šæ CòdHÞbƒ É[l!y‹ 2dªAˆìA5H‘=¨1²Õ Gö*šÉ^E“$Éw}æ$Jö šdÉT“0É7Œæ$Mö›¤I¾a4'i²gÜ$MH÷’úýË;rQRo¡›š(©·ÐÍL”Ô[è&&Jê-t!%Jê-tƒõºY‰Šz ݤDC½…nN¢ ÞB7%‹ä¨YÉQ²’£æc$GMÇ:HŽŠ ë 9jׯƒä¨U¿’£6ý:HŽZôë 9îÈYÇé(×YéÆu”í¬tc;ÊwV"=nß®D|ÜÎ\‰ü¸•¹rs%ä¶ÞJDÈ-½•ÈÛy+‘!·òV&CîàX™ ¹ƒce2䎕É;8V¾ñ gBùÆ„œ e2äΆ•É;V¾ó!gDùΈœ•;'rVTî¬ÈyQ!GònXå&¹²f•›$-°%yr¬r“…¤ –›4$]°Üä!w7¬r“ˆ¤ƒÖ›L$-´Þ¤"é¡•4ýKZa4Õ^Fæß9ZÑTo¡¸hª·Ð[4Õ[è†-šê-t£Mõ:䣩ÞB—¢©ÞB7)ÑTo¡›“(ª·Ð¡ÞH޽‘‡y#9òFrܺo$ÇíìFrÜâm$ÇÅÿNrÜÂî$ÇíëNrTË·úç8ÓéDG.ÜNvä¾í„G®ÛNzä¶í7Æãœ§ß8³žA€äª$HnÚqc>Î}’gà CrW2$Ãÿ C2ü2$Ãÿ C2Â2$#ü$C®ù_“ Ù? ‘Mð“Ù?‰‘Mð“Ù> ’á“$Ù,=‰’ÍÒ“,Ù,½“ÍÒ‹4Ù,½H“ìà×"M6†/Òô^VÑQ|yʃõº‹Žz ݸEG½…nØ¢£ÞB3jùˆŽz Í ½„ B3f/a†Ðìß—°@h¦ó%¬š{ Iޝ—ä˜áz IŽ­—ä˜Íû’³>ó‘HŽIð/!É1 þ%$9f_¿„$Ç,Ý—ä¨ þRµ­_J²£–õKIxÔ®~)IZÕ/%ñQá?™ü¨EýR µ1_J¤æKI„Ô¾|)ÉZ—/%RÛò¥$CjY¾”dHEø—’ ©ÿRÞXó rãAÎ„Ê 9*dH…ÿ—òƆœ•;rFT‘ ÿ/))ráÿ%%F.ü¿¤äÈÕ÷/)ArwC>ê9;ªDÉý¡—”,¹æÿ%½ICêZyII“»V^RÒ䮕—”4¹kå%%MîZyII“»V^RÒ䮕|4Ò䮕—”4}Mõ§—êCç%,º¬Mõ:k‰¦z ±DS½…ÎV¢©ÞB7£ÑTo¡³hª·Ð Y4Õ[èæ$šê-tSÒI޽“‡y'9òNr\Êè$Ç…ŒNr\Æè$ÇEŒNrÜ¡3HŽ ƒäÈ|1ˆŽäŒ¨Ü‘s¢rçDΊÊ9/*w^ą̈$y\•r“ƒ¤©¢$ß-+…,É»¬Â$ï²RH“|·¬TÒ$OºRI“<éJ%Mò¤+•4É“®TÒ$ÿîc©¤I^ƒ¥’&y –zçLΚ*i’wY©¤é«ë©Jt×ß¾}{pÒ•¨®·ÐYZ4×[è -Šë-tv½õ:3‹Úz ]°ŠÖz Fi½…ÎÆ¢³ÞBgbQYo¡³°Nrœu’ãì«“ç@ä8ÿé$ǹO'9Î{:ÉqÎÓIŽ‹aä¸ÖIŽsºArœÏ ’ã\nw}’#Cß :2ó ²#sÛ <2¶ Ò#oÈA|dÞäGƽI€dÚ›$H†½I„dÖ›dHF½I†dÒ›dH½I†dâšdH®I†dÞšdH^Ÿ‹ Éës‘!™Ó’1m‘!y·.2äÞN,‹ Ù³u"{¶.RdÏÖEŒìٺȑ<[ëAäÙZ’$ÏÖz%y¶ÖãΔ!Õƒ0ɲ¤Iõ Mò€¬Ç')SªÇ))WªÇ+)[ª‰4ɲ¦;_RÆTÓ1)gªéΙn­é?ÿé§÷ßýñóëÿ럾þþ?ÿÛÿòØÉ8!graph/inst/GXL/graphExample-13.gxl.gz0000644000175100017510000000036712607264574020316 0ustar00biocbuildbiocbuild‹à`áCgraphExample-13.gxlR½ Þ} Â.صiu2.³[C) ¡­Ô>½G[7‡HŽ|wÉWœ¦—%oz㺒fì@OÇ)ôdsxЮOSIÛað9ç1F¦G“Š_npŸ±ŒÉARnÚ |KŒ,é2]Ï%JjõrR•tì¤ ê>¨U±J:€…SÝnÿ!xQ¼ÆÍ(ÞŒô{8Wß½G2fCމ‰q´¦ðĘËFæ'&&hGs„‹ <±1=µ š÷wƒõ·3uoe?î¾½Šu:graph/inst/GXL/graphExample-14.gxl.gz0000644000175100017510000000064412607264574020315 0ustar00biocbuildbiocbuild‹à`áCgraphExample-14.gxl•ÖOo‚0𻟂ô>°­â4¢§e³ó®ËèÔ +ˆ~ûñG8:ó]˜NtÄÖK­ø}¼ ú·O2'"“™”ÈX"“™œÈœ‰Œ#2"S™’È\‰LEdnDæþ¦¯6#…÷ã²´¯È`žšÔ£z“ðFƒ9fÖ›´3 aæ`˜³…`˜³-zcù}^Á0û,Á0=S@)ƒ†I8ó§“ µ“d4 ƒã.瀨šB@TË€¨F¼¢1LD9â;Ä4BI@L#”Ä4Bi@L#Ô cÐ0×5…€¨š€¨š†‰¨Fo ˆ9ž&â>âO\bÆH+@LMZ¢jšbZ®ç€˜1Ò! òê¾µwºæš<É=CI graph/inst/GXL/graphExample-15.gxl.gz0000644000175100017510000000214612607264574020315 0ustar00biocbuildbiocbuild‹à`áCgraphExample-15.gxl•šKoA„ïùˆ{`fwvVœœ¢\¢œsM¼kÀæe`_üú`c¦¥RU,¨OÞí®îYJþôeج']s8®vÛû©™é—Ï&ŸÃúîò3¹|º=¾þv?]žNû»ù¼ïûÙ¢Ýv³º™ûù}~ùð£ÙY}ª§ô=üÚ/'«ú~úöۯߧ“¦^4›]ÝÜOÛm½:4§æJ\‘íå£7â×û›óÛ»Ñü&4„¦&4 ¡y$4 B³$4+BóDhž ÍšÐlÍ–Ðì͞мš¡9š¡i MGhzB3š‘Мÿ­yã7N»Íë MN;˜ÛWÕ_˜âÆÔU@LŸª ¦O•ˆéSU´a Ж²#öŠ’G€¨å³Â¼ˆYaÞÄ4×1Íõ%@Ìhx3¾ˆÙ{>;âEqO ư>Ä,Ÿbª @Lõ‚ˆ©^(b†0”íÈ´g ìˆ?¹ÁÄ,Ëbæ)D€ï…ã½hb¼-@̲Œ@/ ”qT|sw1Ë2V1}Š ªz fcˆ˜bú” @Ì& 3„©èÀ@Ù'~r“ˆ s*€˜ã3y€¥3¹)Äx/%€˜Só̭±@1Šq’5è ÆJÖ -Ž•}Ñ*²7ãâ²Á•T™U™c(+ñeË/&+ùe«p”˜­ÂQ’`¶ GI„ÙòÇ•µè ÊQbvüz²’bvŠ8WbÌNáCÉ1;ÅÞ ³ã+If§¨¼D™bH–Ù)ú%aæ;u¢¨ ¨–¢²7zE—%Ïì@Í^±$Ñì@"Í^á É4{…7$Ôì]–TsPìy‰5Å,K®9(¦R‚ÍAq:H²9(º,Ñæ Ø’mü³®•psP8JÒÍA±$Þ³ìÐÔ,;ôFGQÙ#ÿÈJÄ9*|(ç¨ð¡„œ£Â‡’rŽü—\+1ç¨ð¡äœ£ÂQtŽŠç I:GÅf“¨sT¸·BoP›­Bo •½qVœDwžÛFòγ¢_xžOz’xžgŠDžgÅÞÌóüŸ p}õöo\——﯆õçCvÀµ<&graph/inst/GXL/graphExample-16.gxl.gz0000644000175100017510000000443712607264574020323 0ustar00biocbuildbiocbuild‹â`áCgraphExample-16.gxl•œMSÜF†ïþÔÞÒÌH#¹Œ}JåâÊ9WÌ.»‹ùò²ŸùõÛ­&ÝNê郫 ÌS£§ßY^Vúðéxw¶_lž×—³ö¼™}úøîìÃòx÷þåßÙËWž_ÿw9[m·Oï/.‡Ãùr÷´y<Ÿ/.þøëóÅËkÏÛóùv>{A²›«§ÕÙz~9ûþ¿?ÿ<;[Ì—‹ûÇùâr¶{˜¯7‹ëíâñyxùÒwâêç'/䳿Xó¬¹kæ`ͬ¹k–`Í ¬Yƒ5·`ÍW°æ¬¹kÀšG°æ ¬ùÖlÀšg°f ÖìÀš=XskŽ`Í ¬ù¬¹BƒŠ&*šU4¬hZѸ¢yEû?ûœßµ³³›ÍãýkümMR¾®ú“„Yp& sÙb˜`:Ã\¦fÉ¿·jò½ †¹Ìhòó´¾h2aÅw¡M"ÛÐf‘}h‹–ê „v¯7ڽɇu`÷¡Ý Dv/5"»—Z­” D¶ˆ¤QŸ D,ï‹È–÷È–÷½ˆå}5ºNƒÐu DF£6"iT­÷²FyªÖˆMF| üLˆ{µ7q¯V÷ê` â^ D4†Ö@Ĉ!è‰@Ù@$kqo°FɬDØa2bø™¡ c4ê0ËÇÖ@Äò1ˆX>f‘ë4‘Ñ;‘Ñ{ËÇɈgnÄ8ˆX>ŽBÅLÓŠ\ݶi E®TÛ$C‘KÕ6ÙPdÛ¦Š\¬¶é õ Q“Û@çÔTC¡Ò© …:»f4rCëËmÀ í/·|ô[-0·£´ÁÜŒÒ s˧¿Õs0ªµnleÝ`űuMJkÝ@Î'ëÆ3¢&7v‘n; í†v™»€óZfîÎk›¹ Ø«uæ.`¯ö™»ÀUÖBs°WÍ]À ­4w7²uc‹¨É}à/ Újî)ªµæ>`”öšû€QZlî)ªÍæ>`”V›û@j·¹ç¿)´Znîj»¹xX¬(mŠu¥M±n (Ö 4Ëźæ«X7Ð|ëÆQ“‡ÀÎkÍy¼"Òžó˜e-:YÖ¦ó˜e­:YÖ®ó0JËÎC ´í<@ëÎC`–;ëzEÔ[7½½uƒýÝÙº’­·n Œê­{DMn#?Wo(4)Ú{“¢Åç10)Ú|“¢Õç1à¼vŸÇ€óZ~nhûy LŠÖŸÇ€QÕºŒªÖ¢¬(ç«uƒ½±Ãºòp°n v°n v°n Œ¬è„Õ"ôØymBO×*ôHíBOÐ2ô¹Ê£¡Phz ¸¡}è)0ËZˆž³¬è)àáhÝ@ŽÖ äáhÝ@i3Z7ŽˆšÜ¸º H¯Å¨`Äú¤Í¨`èÝFZ †Þo¤Ý¨`Dü¤å¨`Äü¤í¨`Dý¤õ¨`Äý¤ý¨`Dþ¤©`ÄþÔ8Kˆþ©q–ÿSë,!Zg ™€Ô:KN›,¹¾æƒ“´' Ž¥‚±79öCƒ£U©`hp´+ Ž–¥‚¡ÁѶT048Z— †GûRÁÐà$g œä,Aƒ“œ%hp’³ Nr– ÁIÎ’+49Ú›ÎçÓâT0ôVZmNCo¦ÕêT04§Ú †æTËSÁÐ[jµ= ·Ö§‚¡ñÖþT0òKaÒU04ÞÙYBªTœ%hN‹³„üЗгÅY‚‚²8KPâg J¼â,AÑUœ%(ºŠ³EWq– èêœ%,º:§É5ºs@ ÕÅ‚wRIUÁPvi¥*Ê.íTCÙ¥¥ª`(»´U …Öª‚¡Ò^U0RM%-VC٥ͪ`hP{g ÞY‚²«w– ‰Óvõ&p“\ÒzU0””Ú¯ †TÖ‚U0¤²6¬‚¡óT+VÁÊÚ± †N-YCNjË*rRkVÁÐáQ%è®ÎtæTg œê,AP%èÌœ%ìÌœ&ìÌœ'ÿ¾‘ø?¹I”eànΤë2pãhÒÒU04àÚº Æn\«Cg•ö®‚¡×âU0tVió*:«´z å‚v¯‚¡\%häFg :«Fg šÔÑY²@¿3ŽN4©£Óq£Óݧ×8MÈñ‘§ ôÜ8MH çÆiB=7N±¹qš ˆÍóElnœ'(bsãD¹A·›j » Ü*žµ†]îeÏoîµÜÍžßÜm¿âÑœßÜo¿âÑœßÜq¿âÑœßÜs¿âÑœßÜu¿âÑœµ†ŒDsÖV0͹u–hÎÉYB¢9'g ‰æœœ%(šsrš,‘•Éy‚’!9OÐÍÉy‚"=9OP¤'ç Šôäì>߾ݒ¿<}üQ>Ýì¿¿¼<}º¾~}}½ºýùô|º:¯ÿóÛµ<ü¨¯ôÕáå°èûü×Ó÷ÝÝáf?}úã·oûÝñp{|8Ž7ûŸ‡»çãß/Ç1CåÑ„°Ñúóÿ¯—ïšKÌB ÀÌëœØhŽŒæ-j2š˜`–´E£)oÈä¼×ä¼2˜9¶T1#‡ª³Î™ "Ù99-²#.¡Ñt°Šl‰1¢Nm]ŠÔ+[EtŠÍޏM6ó*§^ÁÑÊ}å#Y‚IÄiRŽŒf•Aé*ÄÄÌP,yoÑþjƒrßt Z‘ˆ“q踌&fÚ›@²ºØ‘·¬,)”6’†(©Qh:£ÈÜ 9,AF#!çU ß$´TÑiy´qž-Õ)E–š b/9{V€Ù¡*CÒ!)Ä#²RT1mB9:T!29N£”;ÆÁÞ#¿Q¡&R£rã2â`#+7‘kL¤L‹SÖkdšNv¬UÖb‡G¡þËETäÄ õU™Ý dÍÎxÄRoÐåÀX”¬ÿö*£JíQ¥ö*±ÞE£ž?¡¾UÌоËB3¡ü;”ÕÅ%¢è¾ä3êÔœô‡0†Ñ…I£&GØŸœ˜ä—E^Yp Y'ÆN%¬Í¨†ÉbQ™X3»/3J”Ë+&¨lÊhì²F“ŽŽõߨ–ˆº{ÇĤXÀ,JCPw%f¨AÔˆš„ÓÙþ"ö Õ1#Nuȵ¥‘ÞÑYÖ(³¢%‚ñ’ñè¼ôÿõEl‡Ûïþy>=œ5ÉÝËéRÄ,¶ï Í‚œÃ¨]qBn%ÑÒ­N‹ê5âÓ/ÈIA†9k^3t#ºu qNúÖˆÓ´nQQŸ&äVÁë óê³R#›+á¼i‘Fæ«k Ejj*TšÕ¡ÛK(Ü&íšÅº0æv ¦IõZìM“4C·’{»†Ó$-n¦þK<]HŒ=ln Å¡0kHMÂÌÝÊL=h(¿Ly+÷ 5¢Ì²ÉÛ78=¨mö¸²Z$PW'¬ÆhÍTv*ÊÉÐ7ôTd {¡–õÀ±‚ÇRÀÔ€*zÅ9ó´2T'f¯›·I½ÂQªó>m„TWh#(kjòd?´Vk/¡[ɾumÚ¥±ƒµk@ÍÂÃМÃ{ØÌÑî5 뤑ãÔp£YN÷׋NÚT=[yƨkbªÔ“Ù믯T{ÐJQåR9{ݼßéA+Ed$ \-zE™¡›wT=hCQ:/Îh­kDMšÇE¹–¢Ö܃؆¡bÌWIJÇÁ¨¨EoÒFÈ«:ç"Œ¬×WšÊK‡{¡k÷°µ%/÷þ¡îØÖå-`ö»Õµ{à¶+7C•Úû:e?ØÐ‡Æ«óºÕ$.œYÙ ³­y†¼æ¦xå¡âÚºgÆ ºc‘†n>5 ÂÒ–Àņ¦JcûÖpš¤‰!¨oy­ÔˆC¸„n•ç46daUšÜÐÜóìXkš¶¼È#—ŸXÛò¸\`¶¿­éA›>jér·/zPÓÔ%ž.¤ì¸2Ô¤€ 9®eO/MÉöW tþ6ý,M¾ž¿½Ýùðe~œ 'graph/inst/GXL/graphExample-18.gxl.gz0000644000175100017510000000030712607264574020315 0ustar00biocbuildbiocbuild‹â`áCgraphExample-18.gxl‘»ƒ0 E÷~Eä½IY©ê‚:w¥Ø ‘   ŸßðèÆàÁ’í{ÎbgÅÒµâK~´½ÓÈùEdfiÓX"¦n\; MCªÔ<ÏÒLƒï%’z¼JÃk"‰!ª‡ë«¡5lÝó^‚ 4ÔõH&‡ÖSh7vÅÅh3ªc©þÛæÍ`jƒ †̇ÁÓ0{ÆìÓvìõêx`~ùËXÔšâgraph/inst/GXL/gxl-1.0.1.dtd0000644000175100017510000000664712607264574016256 0ustar00biocbuildbiocbuild graph/inst/GXL/kmstEx.gxl0000644000175100017510000000162012607264574016305 0ustar00biocbuildbiocbuild 1 1 2 7 3 1 1 1 graph/inst/GXL/outOfOrderExample.gxl0000644000175100017510000000144512607264574020443 0ustar00biocbuildbiocbuild 127 27 test.c main.c 225 316 42 graph/inst/GXL/simplExample.gxl.www0000644000175100017510000000312012607264574020312 0ustar00biocbuildbiocbuild main.c test.c 225 316 127 27 42 graph/inst/GXL/simpleExample.gxl0000644000175100017510000000130112607264574017633 0ustar00biocbuildbiocbuild main.c test.c 225 316 127 27 42 graph/inst/Scripts/0000755000175100017510000000000012607264574015314 5ustar00biocbuildbiocbuildgraph/inst/Scripts/Graph.R0000644000175100017510000000577712607264574016520 0ustar00biocbuildbiocbuild##some new things library(methods) library(graph) library(GO) library(hgu95a) xx <- ls(env = hgu95aGO) set.seed(1234) myGenes <- sample(xx, 100) mG <- mget(myGenes, env=hgu95aGO) makeGoGraph <- function(x) { library(GO) newNodes <- get(x, env=hgu95aGO) if( is.na(x) ) return(NULL) oldEdges <- vector("list", length=0) oldNodes <- vector("character", length=0) done <- FALSE while( !done ) { newNodes <- newNodes[!(newNodes %in% oldNodes)] if( length(newNodes) == 0 ) done <- TRUE else { oldNodes <- c(oldNodes, newNodes) numE <- length(newNodes) nedges <- vector("list", length=numE) names(nedges) <- newNodes nedges <- mget(newNodes, env=GOmolecularfunction) nedges <- nedges[!is.na(nedges)] oldEdges <- c(oldEdges, nedges) newNodes <- sort(unique(unlist(nedges))) } } rE <- vector("list", length=length(oldNodes)) names(rE) <- oldNodes rE[names(oldEdges)] <- oldEdges return(list(nodes=oldNodes, edges=rE)) } Gmf1 <- makeGoGraph(myGenes[1]) ##old examples library(graph) data(pmedu95aAffy) pmG <- pmedu95aAffy edgeL <- lapply(pmG@edges, function(x) list(edges=x)) pmG <- graphNEL(nodes=pmG@nodes, edgeL=edgeL) xx1<-acc(pmG, "1025_g_at") xx2<-acc2(pmG, "1025_g_at") set.seed(12345) myNodes <- sample(nodes(pmG), 500) pmS <- makeSubGraph(pmG, myNodes) xx<- acc(pmS, "35990_at") xy <- dfs(pmS) zz <- acc(pmS, "35990_at") zz2 <- acc(pmS, "35990_at") pm2 <- makeSubGraph(pmG, myNodes[1:100]) pm3<-isect(pm2, pmS) ##Sept 27 -- trying to test some graph code #library(methods) #setwd("c:\\cygwin/home/rgentlem\\Software\\graph\\R") #source("graph.R") #.initGraph(globalenv()) x<-1:100 rw <- rep("a", 100) for(i in 1:100) rw[i] <- paste(sample(letters, 10, replace=TRUE), sep="", collapse="") set.seed(121) ##this is a directed graph -- the nodes are one way nodes y<- vector("list", length=100) for(i in 1:100) { nnodes<- floor(runif(1)*20) y[[i]] <- list(edges=sample(x, nnodes), weights=runif(nnodes)) } sapply(y, function(x) length(x$weights)) names(y) <- rw g1 <- graphNEL(nodes=rw, edgeL=y) z<-lapply(y, function(x) {x$weights<-NULL; x}) g2 <- graphNEL(nodes=rw, edgeL=z) #get the adjcency list for node number 10 vv<-adj(g1, 10) #get the accessibility list for node number 10 vw <- acc(g1, 2) ##for an undirected graph we generate a node list for each node set.seed(333) y2<- vector("list", length=100) for(i in 1:100) y2[[i]] <- list(edges=numeric(0), weights=numeric(0)) for(i in 1:100) { nnodes<- floor(runif(1)*3) jj<-sample(x, nnodes) for (j in jj) { wt <- 18*runif(1) y2[[i]]$edges <- c(y2[[i]]$edges, j) y2[[i]]$weights <- c(y2[[i]]$weights, wt) y2[[j]]$edges <- c(y2[[j]]$edges, i) y2[[j]]$weights <- c(y2[[j]]$weights, wt) } } g3 <- graphNEL(nodes=rw, edgeL=y2) b1 <- isect(g1, g3) sN1 <- sample(1:100, 20) g4 <- subGraph(g1, sN1) E1 <- edgeL(g3) E2 <- edgeL(g3, sN1) graph/inst/Scripts/distGraph.R0000644000175100017510000000126312607264574017366 0ustar00biocbuildbiocbuild ##some code for distGraphs ## a concrete example: library(Biobase) library(mva) setwd("c:/cygwin/home/rgentlem/Software/graph/R") source("clustergraph.R") data(eset) d1 <- dist(exprs(eset)) length(d1) ##should be 124750 ##500*499/2 ## 124750 ## we could take deciles and deciles <- quantile(unclass(d1), probs=seq(0.1,0.9,0.1)) dG <- new("distGraph", Dist=d1) dG2 <- threshold(dG, deciles[8]) dG3 <- threshold(dG, deciles[4]) xx<- d1[1:10, c(3,5,11)] ad1 <- adj(dG3, 10) ac1 <- acc(dG3, 10) cc <- connComp(dG3) dG4 <- threshold(dG, deciles[1]/2.1) cc4 <- connComp(dG4) J<- sapply(cc4, function(x) length(x)) table(J) graph/inst/Scripts/multigraph.R0000644000175100017510000000100412607264574017606 0ustar00biocbuildbiocbuild set.seed(123) V <- LETTERS[1:4] edL <- vector("list", length=4) names(edL) <- V for(i in 1:4) edL[[i]] <- list(edges=5-i, weights=runif(1)) e1 = new("edgeSetNEL", edgemode="undirected", edgeL = edL) x = matrix(rnorm(12), nrow=4, dimnames=list(V, NULL)) d1 = as.matrix(dist(x)) e2 = new("edgeSetAM", edgemode="undirected", adjMat = ifelse(d1>1, 1, 0)) mg1 = new("multiGraph", nodes = V, edgeL = list(e1, e2)) mg1 edges(mg1) isDirected(mg1) numEdges(mg1) graph/inst/Scripts/pTreetest.R0000644000175100017510000000046012607264574017416 0ustar00biocbuildbiocbuild library(methods) .initpTreeClass(globalenv()) pT1 <- new("pTree") npT<-pTreeInsert(pT1, "a", 10) objs <- letters[1:12] vals<-c(2, 14, 7, 21, 16, 18, 11, 1, 25, 3, 8, 5) for( i in 1:12) npT <- pTreeInsert(npT, objs[i], vals[i]) unlist(npT@values) xx<-pTreeDelete(npT, "d") graph/inst/Scripts/testintersection.R0000644000175100017510000000303212607264574021043 0ustar00biocbuildbiocbuild## ------------------------------------------------------------ ## (wh) 05 Feb 2005 ## Test and benchmark the three different implementations of ## graph intersection ## Results: for sparse graphs (e.g. nodes=edges=2000), intersection3 ## is fastest; for dense graphs (e.g. nodes=200, edges=10000), ## intersection2 is faster. With the given parameters, I obtained: ## ## Sparse ## t1 27.74 0.23 58.75 0 0 ## t2 27.35 0.11 61.68 0 0 ## t3 5.03 0.02 10.98 0 0 ## ## Dense: ## t1 2.61 0.00 2.77 0 0 ## t2 1.13 0.01 1.57 0 0 ## t3 6.28 0.01 7.15 0 0 library("graph") options(error=recover) nodes = 2000; edges = 2000 ## sparse ## nodes = 200; edges = 10000 ## dense V = paste(formatC(1:nodes, width=5, flag="0")) B = 5 set.seed(123) g1 <-lapply(1:B, function(i) randomEGraph(V=V, edges=edges)) g2 <-lapply(1:B, function(i) randomEGraph(V=V, edges=edges)) t3 <- system.time( i3 <- mapply(intersection3, g1, g2) ) t1 <- system.time( i1 <- mapply(intersection, g1, g2) ) t2 <- system.time( i2 <- mapply(intersection2, g1, g2) ) identical.graphs = function(g1, g2) { if(!identical(nodes(g1), nodes(g2))) stop("Baeh 1") e1 <- edges(g1) e2 <- edges(g2) s = mapply(function(x,y) all(sort(x)==sort(y)), e1, e2) if(!all(s)) stop("Baeh 2") return(TRUE) } cat("system.time:\n") print(rbind(t1,t2,t3)) ## Check whether all are identical cat("Now checking:\n") for(i in seq(along=i1)) { stopifnot(identical.graphs(i1[[i]], i2[[i]])) stopifnot(identical.graphs(i1[[i]], i3[[i]])) } graph/inst/doc/0000755000175100017510000000000012607321273014420 5ustar00biocbuildbiocbuildgraph/inst/doc/GraphClass.R0000644000175100017510000000061612607321273016575 0ustar00biocbuildbiocbuild### R code from vignette source 'GraphClass.Rnw' ################################################### ### code chunk number 1: graphClassDef ################################################### library("graph") getClass("graph") ################################################### ### code chunk number 2: multiGraphDef ################################################### getClass("multiGraph") graph/inst/doc/GraphClass.Rnw0000644000175100017510000002714112607321273017144 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT GraphClass.Rnw!!! % GraphClass.tex file will get overwritten. % %\VignetteIndexEntry{Graph Design} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \begin{document} \section{Introduction} The purpose of this document is to describe the implementation the classes used to represent graphs in the \Rpackage{graph} package and to discuss design issues for future development. There are many different ways to represent a graph and to deal with the edges and nodes within that graph. Below we discuss the graph representations implemented in the \Rpackage{graph} package and define the set of methods that form the \textit{graph interface} as determined empiracally by the methods used by packages like \Rpackage{RBGL} when interacting with \Robject{graph} objects. A graph is a pair of sets, $G=(V,E)$ where $V$ is the set of nodes and $E$ is the set of edges, which are determined by relationships that exist between the nodes. If we let $n = |V|$, be the number of nodes then, excluding self-loops there are at most $n$ choose 2 edges in $G$. A \textit{simple graph} is a graph with at most one edge between any pair of nodes and no self-loops. \section{The \Rclass{graph} class} The \Rclass{graph} class and its subclasses support simple graphs as well as graphs with at most one self-loop on any given node. Not all graph representations can easily support more general graphs. Limiting to simple graphs with self-loops allows for reversible conversions between different graph representations. Furthermore, this limitation simplifies the interface of edge related methods which would otherwise have to support ways of identifying one of many edges between the same pair of nodes. Arbitrary attributes can be associated with a graph, with a node, or with an edge. For both nodes and edges if one edge or node has a particular attribute then all nodes and edges must have that attribute. Nodes and edges can have more than one attribute associated with them. \textit{This raises the question of whether we should use the \Rclass{AnnotatedDataFrame} class from Biobase here as a way to implement general node and edge attributes.} \textit{However, currently AnnotatedDataFrame is based on a data.frame and cannot easily support arbitrary attributes. Even having a vector of length greater than one as the value of an attribute could cause problems.} The \Rclass{graph} class itself is VIRTUAL and has the following definition: <>= library("graph") getClass("graph") @ The \Robject{edgemode} slot indicates whether the graph is \textit{directed} or \textit{undirected}. Since some graph algorithms only make sense in a directed graph, the edgemode is a property of the entire graph, rather than a property of an edge. The \Robject{graphData} slot was recently added to hold arbitrary attributes for the graph. Although edgemode is such an attribute, it isn't clear whether it should move inside the generic container since edgemode is of such high semantic importance. It probably doesn't matter as long as methods such as \Rfunction{isDirected} do the right thing. The \Robject{edgeData} and \Robject{nodeData} slots store the attributes for the edges and nodes of the graph, respectively. There are currently implementations for the \Rclass{graphNEL} class, where nodes are a vector and edges are a list, each element of the list correspondes to one node and the values are nodes corresponding to the out-edges from that node. If the graph is directed then all edges essentially appear twice. The \Rclass{graphAM} class, which stores the edge information in an adjacency matrix. The matrix must be square and the row names must match the column names. If the graph is undirected then the matrix must also be symmetric. There are two specialized classes, \Rclass{distGraph} which takes a distance matrix directly and has special thresholding capabilities. It is not clear whether this should be a specialization of the \Rclass{graphAM} class or not. The second specialized class is a \Rclass{clusterGraph} which can be used to represent the output of a clustering algorithm as a graph. Samples represent nodes and all samples in the same cluster have edges, while samples in distinct clusters do not. Instances of this class must have their edgemode as \texttt{undirected}, if the edgemode is reset then coercion to some other mode of graph is needed. \subsection{Methods of graphs} Here are some of the methods that all graph-like objects should support: \begin{description} \item[nodes(object)] Return a character vector of the node labels. The order is not defined. \item[nodes<-(object)] Return a new graph object with the node labels set as specified by a character vector. This is slightly fragile since here order does matter, but the order can only really be determined by first calling \Rfunction{nodes}. by providing a character vector of the appropriate length. \item[addNode(node, object, edges)] Return a new graph object with additional nodes and (optionally) edges. The methods that have been implemented expect \Robject{node} to be the node labels of the new nodes specified as a character vector. Optional edges can be specified. \item[removeNode(node, object)] Return a new graph object with nodes (and their incident edges) removed. Current methods are implemented for \Robject{node} being a character vector of node labels to remove. \item[edges(object, which)] Return a list with an element for each node in the graph. The names of the list are the node labels. Each element is a character vector giving the node labels of the nodes which the given element shares an edge with. For undirected graphs, reciprocal edges should be included. This representation is very similar to the NEL edgeL structure. \item[edgeWeights(object, index)] \item[addEdge(from, to, graph, weights)] Return a new graph object with additional edges. \item[removeEdge(from, to, graph)] Return a new graph object with the specified edges removed. \item[numNodes(object)] Return a count of the nodes in the graph. \item[numEdges(object)] Return a count of the edges in the graph. \item[isDirected(object)] Return TRUE if the graph is directed and false otherwise. \item[acc(object, index)] See man page. \item[adj(object, index)] See man page. \item[nodeData] Access to node attributes. See man page. \item[edgeData] Access to edge attributes. See man page. \end{description} \subsection{Some Details} Once both nodes and edges are instances of classes they will be quite large. In order to reduce the storage requirements (especially for large graphs) using integer indices may be beneficial. The minimum amount of storage required is $|V|+|E|$. If we use an incidence matrix representation then the storage is $|V|^2$. If we use a node and edge list representation then the storage requirements are $|V|+2|E|$. When either $|V|$ or $|E|$ are large these mechanisms will not be especially efficient. In some cases it may be better to keep the actual node and edge data stored in hash tables and keep other integer vectors available for accessing the necessary components. \subsubsection{Representation of Edges} \label{sec:edgerep} We have taken the approach of allowing the representation of the edge sets to not contain every node. When the graphs are sparse this can be a fairly large savings in space, but it means that one cannot determine the nodes in a graph from the edges in the graph. Also, for the \Rclass{graphNEL} class we do not store the names of the nodes in the NEL, but rather indexes into a the node vector. This is important for allowing us to perform permutations on the nodes of a graph, but causes a number of problems when subsetting graphs, and means that knowledge of the edges does not provide knowledge of the nodes. \section{Multi-graphs} There are no clear and widely used definitions for multi-graphs, so here we will make clear a definition that we believe will be useful for biological computations. We define a multi-graph to consist of two components, one a set of nodes and the second a list of edge sets. Each edge set corresponds to a potentially different set of relationships between the nodes (which are common to all edge sets). We denote this by $G=(V, E_L)$, where $V$ is the set of nodes and $E_L = (E_1, \ldots, E_L)$ is a collection of $L$ edge sets. Each with a potentially distinct set of relationships. The edge sets are essentially identical to the edge sets for a graph, and hence can have arbitrary attributes associated with them, the edges can be either \textit{directed} or \textit{undirected} and self-loops are allowed. It is not clear whether there should be distinct types of multigraphs as there are graphs. It will surely be more flexible to support a list of edge sets, and to allow these to have different structures. Current definition does not extend the \Rclass{graph} class. The definition is: <>= getClass("multiGraph") @ \begin{description} \item[nodes] A vector of node identifiers. %% FIXME: if these are node identifiers, then shouldn't we use %% "character"? Elsewhere, there seems to be an assumption that %% node labels or identifiers are character. \item[edgeL] A possibly named list of instances of the \Rclass{edgeSet} class. \end{description} The \Rclass{edgeSet} class is a virtual class with several different extensions. These include a \Rclass{edgeSetNEL} and an \Rclass{edgeSetAM}, others will be added once the interface stabilizes. Edge attributes are in the edgeData slot in the edgeSet class. This implies that edgeSets in a multiGraph can have completely unrelated edge attributes. Another approach would be to maintain a list conforming to the edgeSet list containing edge attributes that would enforce the same attributes to be defined for all edges in the multiGraph. \subsection{Methods} In some ways it would be most natural to have \Robject{edges} methods for the \Rclass{edgeSet} class the issues raised in Section~\ref{sec:edgerep} seem to preclude this and it only seems to make sense to have \Robject{node} and \Robject{edges} methods for the \Rclass{multiGraph} class. It will probably make sense to be able to name the edgeSets within a multiGraph and to be able to extract graph objects from the multiGraph representing any of the edgeSets. There should be methods to produce graph objects based on intersection, union, and more complex combination algorithms. The edgeSets may represent interaction data with reliability estimates as edge weights. The user may want to produce a graph object combining the available data to obtain most reliable edges. We may want to consider apply type operations to apply an operation across all edgeSets in a multiGraph. \subsection{Use Cases} An important motivator for the \Rclass{multiGraph} class is the representation of data from protein interaction experiments. Our goal is to represent these data in terms of what interactions were tested, and of those which ones are either positive or negative. \section{Bipartite Graphs} A bipartite graph graph is a graph where the nodes can be divided into two sets, say $V_1$ and $V_2$, such that all edges are between members of $V_1$ and members of $V_2$ and there are no edges between any two elements of $V_1$, nor of $V_2$. \end{document} graph/inst/doc/GraphClass.pdf0000644000175100017510000044605412607321273017157 0ustar00biocbuildbiocbuild%PDF-1.5 %ÐÔÅØ 41 0 obj << /Length 3393 /Filter /FlateDecode >> stream xÚ•É’ÛÆõÊÅ`•£Ñh,N%UR,9Jì‰/ŽáMÔDŸ·v7@ÌH:H¯_¿}ëysûÕ7ïr{cŠÔe~s{S5i~S6YZ5ææv{ókbVkcr—¼_™ä´²&ááܯÖ6K¶— ¾í{úöÛí?¾yWß4iSæ%"ËnÖ¹Ië¬fL·ÖáÆ*y¼ ø÷¸ZçUÒú©Nú{A̸cÿ^Úö½•ËwœVy €ô1‚{ïp ÁÏøõv—J¡ïÂÖã#üw@¤Çިɦ…†þt½q#{ÚaèÂñâfÀ{æ ùí…ñn˜3°Ãåöñ! Ú«\Q”Ƥs,J¡$n³Hä¦J-œÀvt–Ë ë•zò*-3‹tµäú•+“v‡,Z›´'ø°ågå·ªRÆ 4ˇnÀO;˜Íl¸0Ï´rߟå7#V5‡.BòeÓ¡x{$î¨Â2IJ2Yç ˜i-’)c#ST °îŸEKjýÈoÊÂ2ce‡×;<ásË;˜?X$Û‚ß3B?.h¾µ|´W(/ž¶‚A¤Äg{ã¶z†{”w¹#ù!OªørbŸØªx'ˆ‚­ÁÉ›¢X0£‰ µ¸”®Öθä â$ù£ ž¬b¡t¼eË>g’Í…tÌ«žnBÊù황“õ'³—DhvÉ 4¹ cî\ƒÅ’OX[¦¹ù|§¨ ÷¢SÀq^(„Žm¨8éù7k[iVšE§% ûb-ð`íØ)¢RѶ®’¢všþLòwû"ïÆe©ËÍ"ïë°sžÆNÜïžù€îZ4%º[®¨Z¡ŽØÕ鎬Ñ|&Õ=î»i2?ò÷;TêÇ)£óud-‰„Ì­S' ,è¤ò,µÆNe­H E$íŠ4 âsm­,ÿ„ñ=üûáZ8Ö¤Îz9?=°ÁúøçÓ IºÝˆÌö(ªǼÈý™W$¿ãá”± ™…3Y½Q7Eäºø&Ù[üq,RV,-£ãï 1¼b²Œ‰ 2NœUʾ¿¦Üd–¼$ÿ‚z¯Á¿\¶„ *—FA&ËäÏP¯”eòv1œ\0fä‰ý’BúõÖ¥yV…3–èmœ'"’“ú{$”‰ NÁ¬%x“t9´\Ò4ilñí"!ui?Eˆž@ˆõÉåV†·“¿ˆþ%rtËmZTå4ñnÕ[â@U¨‡Ò3¥Ã,ìë¡…Ü/Ýÿ´Ü•r#:®d$q¸ÊMâ¼FrîØö׮ʒ÷÷ŒÊ'4=0 Veä("Ü…büÍEVË(ŠX=²·“ßÉÓª¬g–6AQ§Yîfêoª¨ÍÚEE¯J¦c¾)$](Àƒ€ù¥¤щþÁ'Lc³hv iÕ¶A¡^´Ø:a´sâÌ7ëƒ?„ê¼ÆI!çŠPÈáóÈ¿Gj–ô¥ÖV/*Ì!ÅÔ=!ƒ”óOT~¹"”å³3«J¬ê…е…õ6„fMÁ륬] §mÑq‡BÚ+?QÅ8ŒóP@‚ÃW¦® ¸×“¥+UL•ͬfT‘SjëO?ˆ€8“=jW‰ðÂ9Dš2:øW´´i+ßB2PizeAƒöóÖ6ÃÀ•6¹Ä«\úÚÛ¨•Ê«xƒƒ^*e#H» Òžâ.ÊÔïßZ©‹‡kÕ¬ äܼª{ãkS€b¦ šütíZ• jLE÷eŠVxÖZC>!Ô…Õ&Û•>0M½Ûã#}¦Âs »¦† À¾lçÊï“ïçÑÚ2i|4n…Pìr"–„=åXìOM)÷ÓpBv\ÔPQ4S3¦n¾°‘9ÂËå¶S>Ï ø,$¾äÇ~”ÝÊMQÄý/hKù @cIØÊ©]K ´–ɰÂ*óÕ|:ö‘ŠÀ¯×BžÉ'?ì5Yq€. éRãÙƒ8Î0– ´›b§•IP)Šg5$p‰ï ¸Û”UivX «‡ žH´ÜEtlxP ¬F„üGD}GgsEF-B²Æ ž àHÀ§ßÙqQŒ§}®†Ó¥λU]$—³7t­œX¯Æ2 Á°”+s’Ïþ( “Ù~žêF†…Œ¦ò2îéõº5AQ{"T#–Q€ÇųZmÇ䨅ÿCàrì“#|I ð”ú‹»•ó& 80t O=°¨¶’Zta.¦éa)hÙ|a¨c­O=xÜv2þÕûê¡[ó™·r·:ÉmQÍ`ó©ÍiZìd€a'Š!êÛQ^âN+>òº°E‘, z^£îÔÍÉWÏDfÁ*ÏÂáätœiË™¬ólÐ '™Éî½9è¼ÐMÃ8n`„Q¼>E 5ãî¯òäp^µH§ï4V;Ãn¦»˜ü>ÚwÕ„=;,ÓôY”etÊÀ d&ü¨i)†ƒGDào\ß0Øgjznù‡tNfËnj9ðá`­…Á¶×} µ¸à”45?}d§-?“Å·£6˜pqaî€á,©gÞ¸@$.¨r )ý8i.®æÍ1ãB0E;¡¦V¿ É0ò)Ýá €š ‡ŽŒïÂ4›ÄÁ±rb;çX ¾ïŸääše%»o¢›’V'If<g¹#MpŒBeˆ&àm¦ žbºÈe,>ðc,iÚ «W ,I|ݶ¤çôÞ‹E4›«0ЦÂí‰âåÈKÇNÕª<S{ñ©á)žÝiñâé>|Aéã45M%¾® †¼ýà¯n àK™ð!®t}û ’ ,dÇxüUÃ9í$á–]0MäVFå?>´'Á€Õ3è'‰ÆŽµÞ.aAÏÓÝs&G‚ËXäýE¼µ ²‘†‹ A÷‘ˆíï¸%c/ˆzâú¹˜ä>݈¥ý‚›Åj¹µ64Ÿ2 ·„üý—÷?­jKáñ߯д €‡v˜Ä[¹Pœ6³bmrE³¢§I¾V˸E/m À ˜&Ì þºZ»Üúºú.ÁŸ)R›äOtð|BÏë4u^К`×…ôýM‡¤~–ðE'Ì.ø.¾1µN™ m?.‚éÀt\ŸMËÏŸKŸ•¥V*–?äY"èËLò› &·©þõÁÏ^­:¯•Íà~|ó¿…ˆ“5Rz$p .ìŽ]e¤4R]Á Ùáv8€áÚ{Y»ç*ÒdEµÈÞåBS½¤ìo…>ݨÕÊŸ€ùlYVÞÊýtu&î·2Ûg8…ì—4ý&â²#Í_£ÿç*hå‰#;¢üY õNìk.°îó(@[yK·xlw¯^ ÿþu ºˆˆï—¬:Ú¢4_¢mª…ÏØþœ4ÏFøØõ'>ŸŒÌÓ"ܦÍ=ç8ñ’«“Š"Íœ¿¼Z&ä wÎ*® —Ñzzð3É«¹Í&C x ÃjÂ6,V×U|õ±Ý‡‚J“}¨®ïnË4s{¨ 0©ñbèËÎ(lZ—.šýYCMUʦcæ†þ8eZ.`az¸•S{ÐQ/d ꯜ\“¦IŽ­\q¯‹‡¥'ï1° ³ úÖòÏV“CçÛò—ió^“k{&ò·ïôA2¼?…­øÌߣӑó(€dS¡”g>Õz?aÛó•mLÂUxÉM’Û¨½ S°T;ÑŸ¶=êU˜Ìj>N§.íi2ßY¨ûËO8”R®1Ï_æ/ä‹ÙõÔböÊ×xêŠÓ­!OnÂTÒÏ“¡åßê¤kË ÔBÁïC‹íù.*˜Îí9B0éŸ}m®·8¹å±mtéX¸ØzÐꌜ÷¡»e)(ÚÍb«°è©Öf¡ÏÄêå†hƒ'=ðM¥I[·º0þ}Šëa[!H†@yò~dHö>4¥öNbâ¦?úpß×:Èå» èœ|¥ÅVÈ>ðP\:ãן™Q‡±ÉàÁí°\GÇ"T ù.ª§;Iõa^tíÀ.u¹¿à݆©uÜÔÐÔ $,·Øò<øK ;¥KM]A¨R« •ÿ_½½ýêÿÖg endstream endobj 55 0 obj << /Length 3188 /Filter /FlateDecode >> stream xÚ½ZY“Û¸~÷¯˜G©Êâ’x¥ò²IƉS»NÕzRyÈæCi$yuE”Föþúô <ÆãM%3"q4Ðî¯ðo¾{WÞUQ•§ùÝÃÓ]e£ÄÚ»¼Š£¢Jî–wÿœ=læÉl5ÿ×Ã_¿{gRopGIžÜÅÐìáIÅY¦ÃpÔQÖùæ5ÚÎÆ¡í|aâtÖâóñL´¨ß7ò\_„îy ÿáïz‘Uiº™=ñìn¦2,‹µ7Vø£±ÌÄ"-fKoÄñi„R:[Ÿë¶¼Å×bv¦'˜ÏVÍY¾[$ÖDERÂCU ,âéàΟç°ÎBî¿ÌK;‹hVb£ NšçäþI«@*ض÷Ü\Qø‡ÔHöâȈ”–ÛŸv"¥ý Æ”|4º™ã¡ebNv0íâëWœ} ÏVÏoMëgp4§Í‡{xùaäÄ‹¨ÌRÑà^êEò³ ¿Ûf%\W9 liy?õY¹çŸgdcÕˆ:𮽭Âã¦Ió$*òð@œ,MA”ág·¥)LOØ”D«nPº¤g·Ú{r‡žœUÆÊ Uv+ÃRqZ]4çH{Wå G^Ÿú„R ©D«>,ùÁ™ {žgЃË^UŒÈãy‚[Õßü;ÑÞÛ–XE0áýI®ñPÅyéìHÖ¹@ZB¼‹tö„ä{|1NPõ…;ýÃ@A¬™½â.Ÿ¶Ú ¿m…2í‘6¯ª±Zs‘Z–D³ã¾pw«ï IÖ;5)ƒªîCŠqVF` G7¼÷Eg#؇ØgŘi}ÿã(šÊŽ›•‰ãÙ 9æí°â¦UâÃkË-*Ô¬Lm†:¶xÖŒ {‡  ÜÉ’ÄIµþ¢?‘¥¬pjó…‡îiæY$ùþðXM¬r ÉýA܈½²-©G:ÙsQÿY(ÚöߢðŒh ™gðL*ˆ‚¹ñû¡Þ«ÀÛ{®j¯Ô p( ôÄ ²‚ŽýH·=cºd]Às–XVåþÔ´韄îV̯ñ¬Û³@xã´Ú's%ëIõ󘱆l¢jãöÛ#+ô#{4~iIÿá4‰烛×:.«gb±\ûÈ Îy²­‰üº’£ƒ¢Þ­âÒÛ1×dË(7Î"–ÈÿÌ–ÄÚQë:ë¶‘ÕÝA[ e~!—Ó /ø“òÉÌŬHÕáq ÐØ8„§bŠí@aËÔ€=ɰ'‹a÷É´REÝÝ;·¤ õ©~”f’³"œSRð#ïQr蚣?–$°s˜oŠª^¥CQIðŽ®;9ÑÜ8[¦—šg9=À™x¡ ''ë­2¦¦L¢´È^¦Y”$#`Ê·)(IÙŠ:Èc]Ô¾‚÷ [ft¤ÄÞÜBä×Îij€_ÅÎq¿!¢³ÕG«1vh Y•]È%‡ÍPªÁVg¸ƒÃÈã¨4Õ¤aоüñÁanŽEŒ;%’Á.ÒГ¬­=éHOZÇ«¨Ö‰C}ƒ‡ïøcHÁêcмÑÀ§ÕüàìE/#!±>ªÒÂ{ìÊÉüè—6“ã*23ûH¾ÂÕ2œ8:9Ôú²~DKÔÅ1ѳ#8´­÷'.e¨8[k€Ç×–½¿ô˜>3½Mòåx9ðÓ.ø¡h—âq v’§²Ï2%hUâAí\â†æÂ=#!s—ÞV-ò4™½?ôñÔ-Gf_¥!¸À»ê7újèüÇØFÀꉢ£´b÷Jûiìà £›v$î¹Ó«¨˜â®sÙ‹vù´og`«iìÜÖ[‰h)ø "dñÄ]b³÷ó€Ô… 0ÆÅï«ËxøÛ8ÉC7]e¬„íq¯±|€ðÐÕ‘‘ã1ÎM·18ê•fô/bi¤æŽå˜¢<" ™$e±¤ Oæ ïÔÎ~\]6¸Ãx¶DºƒþòÚhíPÒx^%9“ü‹ NŒ—UÃ&=®Ç`Ï’…¶Î®ÛñtÆÏ34gY¨óýEU—Í2  ]t 4Åyâ,ÉfÚ«€¢ägg™ð;æÙf¦ó"õË5$;U’Ÿã,>RA,pöiÕ\ %Н0 ;§¨?‘ßׄ¦Uª^À؆dZ7Îò¹OìO"Yu¢’> ´Œ ýÑ9ÌÄ-˜'>xI$KoY_ r8$ŸãÄ"dWшÂ7‰1Í'ÄÈór?+£ “ˆë÷#”˨Šs°è)ÂÄI`¤[ÝI\eå$lFå ü¡ÊÁŸÃÄÒ9 '.ˆm!g¸9wÈc|“Uƒ®qìL¸§åà(×ÚæGy¤~‰ÕhºQ?¾LL¨ùÿ<‰’ª ¸_B¿]V 6Ùræ=¶i®7½ ö>‰\ëõ–Ã_žã<4øÙ¾ ˆ Ë£¬»wõLšˆî·(¸¬)R³e [ YõïÐß°§ä5’RX+eI†iñÓçžëZ*¢ÑNö,iõäå"å±—³úVhjå\º1R3NЍª&‹Æ#` !wÒ™˜¸¿‘“ ¥ñÏ[ÏñRÂó?@#®üК')ëKׯáÑa­Gñ$É«(Ž3”BJ‘KaàCˆ,ˆ =°Á¡4³VP»–³•ÆÑ#ÉlT&Óðaò˜3²˜QñÆÏ^É ÞúØa²*À"²\zñ5ÇõŽÇö‹¼8\k5ðŒl«œµò¤ê,¥eä˜b/®Å´6ÏÁüñ˜ pßJ›É$ŽÜ7 Ý„!cá2¥ …Kì®"É€€Îês˜æ]Æ®n2eS÷*Có°ö”:Xc¶ÂKÅ?Âö!ÀmlÙÕ2x§0.’òU^ÅpÊU”Q’÷R®±r²y ëÉ Ä#w†Z°øÏuÓA# LwõK„¿¡\½úéH/Nn»˜·>LÔ¶z)¸€œ¤†6 â¯â"4aBÊi·XI~¥)§Î”ÍËn?1½f“˜M*ò˜Ié웺â"ö ãLjÜ>èe¬Ð$&I¥*|ï’'qr°–:ŽFá¸Kƒa†Ú$qG-š"é­Yb"8Õ^•òèÙ Åh‹2²?^ÝME·FÆ­š+´ÜNÕG|˜¼£b x:žÇ¬3‰´«×ZgÅ©³NÑ6uM6áâüL¹&ìÞqa+•?’¬gÍØã¢°Î ±™¡ ×À¶LŠWµÖ—ñ«UÞó5£‰„Ü¡·ºiÒÞÌ ?Mèx Bl§SAJŽ?Á¥Zê0¾×2|â¶®(»+Ox^u7|ðÖK< …ŠEcÕ+ee¢~¦ôïൠ‹–w‹2…¸¨w$ceÞ%§ex±XŽÄãØ8Ð4™ØÎîkÖ75!–²»€(IOq¬‡ÌªžyÈÈ],´®·ÏÉ¡n~ÅzîZûTø½lºq!6D³Ã"~æ­™Pp àÆÕÀSs»‘û$¹”½Â güÂʧjÐöïõI£®.Ô»Ç)|%¢ë»Üt×[s× PEÏ¿eœ’l¸L w^¥st#R¢³qµa¯&#É´—1OÔ6ƒ¯zi¶ZŸ%`§œ å»Ý¹{Ó Üä_ð~¸ÿ¡ïÇ¥¡Õ›•«êy‚Õo­Ì+Áå5™•‘ºËh*.¾z«%>Šé\O„ó÷n1ñŸ|û®Gñ"ïòºÖ|“ÔA½áÖü‚ÜÚi -ŠÈæ5•­ôïÔ ð½@›ozk$WïÌèHŒoR_EÇ!ÙgPYDQ÷þGL(ÄžSüaD|óÝLGÕÿID¾Z% ­cÞy¼J¥jx@ "[û¯©ûMŠ«§Ü]’¾\úÃZ¥ÐW•öÜ*Fï:&?÷˜ˆMd½òhP«©åëbî*’²œG~çƒCþ Óãó¾‚ÓÞ¶òý-Ð\龑ß,Êí‹ì>ÀãO¨¿ï¶ÿ•Ot‚úëôW:ò)S:{â/¼z®wÿ°³mÇŸ4¡nšoGôÁG˜eWúˆƒ½ËM+OT'œØSz‰OSômÛ³…ý/·‡^*rÓ——‘o:3uß]|ß4 0ÞÈqªžÏ5P½‡í¾él»PäãÊ»z©]õoŠÞτϟæb£4{]䇿ï¾JU&ôÚºcÂzg’zLÔëU÷í@^FÞ3˜$*SùÐ7Å®7÷oþ>k„¤ endstream endobj 62 0 obj << /Length 3604 /Filter /FlateDecode >> stream xÚ½ZÝsã¶Ï_áÉ“<àçuÚ™krÉ\çréyš‡$4EÛêI¢+ʹ\ÿúî'>(Ê—tš>Ø"p±Ø]ìþv¿Ü|öå7Ö]“µei¯nî®ê6³WU›guk®n6W?¬lvmVözmŒ-WïFxÙÃßp½vu¹úz8ÁKÛü›®ºùë—ß4WmÖV¶B‚ùÕÚ4™k„Úß`Ô¡g…iW·×k[­F¤òÀ-x¡µ^mpØÄ­6oð¹Y Øqï{ŽÚ©#Ä>õ±E½ãß#«Ý4Eäy~xÿÈC> ¥ýÑû-14ðË¿ ý œÂÌDòH|e×ë:7«×=bëÙ8†¹F~$Öq5O‘H‰ÇYÅÚuVçMº…hñîX»&×wzždWGÖ:4]RlSeyõë…zI¯ÕŒB}Uemíš@Àe•“¶KºÕ¯£1 ü²á7$ü†„ßD‡öŽ‘«•ŽZtݪ›åOw"ÙéÄ$ýGÝt‹÷²¸£MMé&£·=[…L0±jM^dy;S­Ä‚…]XgyQþÏ•+¢Ìlmµ-ê+eºÿë^,k»ú^ƒÊ÷ ñëóù,U•••û]E3«ýãÆf•5¿«´&L¸ºšÅ>hðy ƒ(Ìöèàrl±{?±œHìø… Í‰Ÿø•$ s\‹2ª ‚^¥A/ìQîkqw¦.³¢-gˆa¼fÛzÕwŠzðm«}ñÅGßø†žÄåùs2øøž¼ ùåÐ÷æíú“liXµÌ`ž C߃“z߃­r+¿-ÁWràGRÃôÀdÈ!Ýîü’«0ÃûkYÕðÈ cºæÀ+…3ÄÀ™Ÿií½f‚µH ?_—0§‚Iae†±º¾W£b %*!¾¢À†0’,ó#waë¸gû3à‡VBFþ/å¶Ìê¢ÔÀÃèüûE³ú;;xoñ‡kàöÔ¶£zs»ÂÇ;~|E:ãÑŸJ¾¿n ZX‘¯DR§ ›Ô!´¨,àµ{T0v²ù¨À›ƒœ`·#ó‚ž1,EJ™y‹—Æ1¥}ÎJˆ’ðB$oãØ‘ýƇçžiê4bºDJdü|äuÄÑ9[²ÊïãàZ'Û_c´Î-ÁÁñVz¤†iH?߆zBiu;¬šÐüÜûÇØWÕs¿ óˆ‚ÏÏî…ø6pÎÌ}öT¯nŸØ=áäÛSän»Ã9äNºÆCXYOŽø"e&‰¤I»™ô™Ápq׉†°·•oÚæq^Äi,6܉`Æý"ÝÃRFèÍÆE\ÈtÄ ^Rî=¢Üò‚fs7L;Òå1`È×ùî‰ßÒâdo_ÁË›¬YeMëc©¤Ñ,œLq>ùl ¨r¯!q"Ö† º½†%Üi 1äVf~6øí«7_ðÓ­ž¿uo?D‘Œèá_¼ÿB7ºÕÏÄÜÞàÈK—‰ê u­‹³Há»mV7øn9?î%¤Öü…Ô5$]m‚²‰  ìõp³©×ƒ®'¡ç™.W7ŽäÀ‘Èž‡Dí{$õ¤Ó‡(ÄáÏ­[GÞ© |Xdâ ²¢t±Ê Û’Çìž|¹Z:þ9H.okõNXb6ªôÀ_#Þ½Ô‚ çƒ‚a|AÒO·Nò§±GÄŽ”˜´Œ$p²ý@ÞF«0:aþ½¸VËN >è±[9}¶è“:‹ÍèÙ9©÷rTŒîFÇû l œöSÞO– ‹Ì••Ðî…ƒ+!f” ¿C¡îHkr.X%||XÆÖd äéQÝF㸋žÑ¸ð·ß ëŽ2H „øüa«%7 Kh'¤_!ËÁBÒA„D|Ž¢Gî7jX÷Á.2õÌ&pà$ܱo–}nÓº"Q˜#‹ÂŽdQü³Ìm¨sä  ‹­ Å—6.¤í¶">»Z—2'Ã+ý–÷ß)•[¼„h(Š@×=Ré»Oß#.…o抌i]Y  p@>Åä–c,LÔàu€&|ôa·µÞÁÁW=O³|âdé4UŽuI†ýyÞCZ€@P8°ÔÕñøx.ygCÛ9‚ ´žíªxÓy"Ìü&¡×`â©œÝ ,âü)†s“ñË!Îxˆ:zŠ2òGëßL#f¯ÀeÙgêM¬ h‚{Ù ÏI¥(>¶NØÖhµ$³0!âóÞ6™5>‡ßp5¦Ä)aþÞQ—VX“zR[ÏËï yc3JO”%ÿ¶9 `0÷.˃tÈ-ÈìÐÎîÖbp,èñQò޵Î&Õ<­Ún2ÍÑÁÛÏwðkD3ƪ)LH‘°™s‡îÈoœ FR¦Ö¨B óŽ7ÝHtãM’Ô€¡¾#sŠ&òLL&­«Mi­O¾™¡1; NõÞûø¤qÊËlº|%á+¤>=¦—d>³Üø ¢u€ƒ¦üË>œ‰äRñÏÔçÏ$9{V”0…jîlBâé·MFŸü MDÑ÷òÌËóTï/°û“ ë2½¢õÎÛ»ñ‡>/’q2ð­Ü‹(_à…ŠBëø—KN›bßä«Õá’×RqÁ55yf猑…Zà»!¨*YM•å®\tQ|È•àX\ªÏ›K,X¿™2dÉÙÞŸñ5}¹yc¸<«5}=Ç~=‘ïïÄ(¯ÌD§„úERJ9‹.M"Ä ªÑB>B4µÈBƒcÎꈧø‚ЂÀpí³:CßójÁ×®-(¥7y¢8Ö–ft™iªgudV/¿[@¤-äÜþ^‹ ‰èð_¢kR ßn³ÑD?Ö ­ çwg×è¼¥‹>໪·¢*Ìþ;‚몆„{v§3Ò Õïê\’!½õg'ZlÄG*çeøkŒýµ&9Xr¬Ù1î7WíÙ×é§ï´Œ#£¶`^MY±y)¯ù‘*¬êD†)å‹ÎOΨû%E¼t—ì9¬öùñØûk¹ˆÏsØjùz猽?l9RlÈù¹wŽmz/ UºV=U4¯ŠÕKIRÂÙ$Ýexô§X¡í\»ÖÅmx¢P²w!/‡ö½Ü3ÐKz[Yq·TyLüº‘ë%‡;=µÜûK*&@h“77 gø6ñVkñžðì*Dtp¨ð ϊѳ£ÖƒïçBBšæÙ~}U3½n:¬i‘@<:~ºx„éb‹£ê‹N+Çè7÷Ë÷ fþ…¯3'Ð3ä~ìA,D³Ú@äk³¦iôz>{uóÙWA_ endstream endobj 68 0 obj << /Length 1719 /Filter /FlateDecode >> stream xÚ¥XKÛ6¾çWø(µ"’¢Ǧh‚(zˆÛŠd[»vjI†åífÿ}çŇ,¯Ó6—]rÄypæ›ýnýæí{mJ¥µµz±~X”uªE¥e­ëÝâĤK•¨åJ)m“ŸaÝ^öÃre²d7.ÿ\ÿôö}µ¨ÓºÐòg‹•ªRS óÇOæÉ8tÈÉ›ç¥.“ÿ¼qD¢M°¼øïU2<²cÊf¹Ò³Û% £œíaÓ\àÏÓWG¦"aàåžý"[6×èÈ^ÙÔÖ`6™Û’J•<’±hÛ삺N•)C×’Ù*A—€ž»Pž< ç`Ìž²ú,’Vª´ˆÕ[ìœòO,{f±i Áž-º©ƒ#ƒ:ÒŽ~Ç'$ˆaä("·»p¦GE‹•É5ܯ‚(&XÇ'äÞ¢`<9`LmžhœæÝØ¢¹n¬÷?,O°<?ŠvìZæ Cb8ì›~Ç Xß㋨@1mç8&jÚü…¡n=x©Q1=Œî¹ N®s˜žxí Läi®<&šžNÎ…ª:µ¥ýoX+ w±FQË3]KÔ >ÿ€F#¹‹A£SSø«v¥ãÃð¢gÁ]'’03ÑšT©XLÙ°2K­±S4}ÄØª*yFÇ#o&Ãù7(å…ÉÆ´¢ªú*¦@p1…å†|"ôççtÆ£‹èûp¬¥x´÷‹À ÈÏ|w”s…µð¿‘Ä.“ïóÍi/'{©es›‹`óÌ`r¡Ê‰ùÔ…íiÙ¢CNƒNØ3WŸÑg[w€Âƒ° Ý54hn#*ÓÛ€dJg á–‚‚\ïD5Ikz.ólÑÿ¿Dê( £rç±sëÞkâ<;?)* ûÁ™»cbäÖ ²Æ]P²fdºƒJNçðÑ¿ òÅ¥$7½ â6{*¨°£©œ7Àg÷è¹”~‡óä©¿¦p5Ä þ¾Y²º“ƒö—×ñÇPëÆEƒ:ä­ÒµÁ. 7#±ÖšŸ.W9ôõõ¾åƒ7òÉônÚ0P‹‰ÀŸur˜^¿™täß‘m o¨$<‚䣧Œ>¸Ý…Šíè€Ú¹›¶bhCÿs2ôW6õÔ3· à~Ü;K€«BiA8¾ª)#Æ«iUà†§wg¤8h[ -±mù–Ž:»‚œ'xÙä35Liƒ@Þr¾‚”˱8Ñêl’ÅUíº›- ÓûŽá»÷:n"{‡ÍÅM=Sºatcˆ÷4˜«9ñáœ;™üû²Â¸¬òÂwæE܉~$Š˜—ûÀ „É 'ž¤s0Aˆ®1 up;`l"(¶QŽW†"]ª½¡Ÿ ™$~l¶òq”-68\\:ù.ž&ñ¯çóý¢Œ‰Ky:ÊC´t™Ve4Ækã]réÄp•6ù° ÅéëCý÷TÝJ²½;Q±¥bBÐñ‰  ÀŽs1Cñâ&`~ˆÖ÷¦•ÃQêÿ;žhp‡¹=+Ë ÆÈ†–í¦¾v₆| ¡ÆcÔÏ7 ŸO0´L:,|ç"p‘9ï ܇¸mJqD' " µI­¶7š?»Ø( ÁÆ‘ª¸J~O±Z¨÷ø8Òuá.DA;R_¹³?¶—^O‡ã;‘=/Ý5ÏSÃŽB9Ï{æ‹x^mžÙWès¬iG§g‡ý2ÓÜ/ñ³SÆ“òè`5+ün˜Û¢|73õm”šótLñ½’ڜ藔t™BQš ßx™ö±‰ŽÀD¥lžš¼p) Óx­%gsI×wÂyÂ$=_œ-’½Î’¾§ýíÜÕ*­²Jr_@Æ·‘SsŽŒwBáÀ´3Y.ã¶ýìûódP³Ó)¾÷aÜ¢g)¶MÏ‹0¾ák˜=ü œÀgpJ´ôc!ŒarQ Å–É(݆<o—è!T–©ñ™ßøD¹(Òº„WV“´R`”æu·ÔÜáeZWÔp&~Nôá{Ðæ_ѧ&úô\¼=ËX»&O²à½¼ueš•†ž5…G^‡n…Ñɳ °–o·\0ˆ³kyô -rä—7\ĺ0ßîó †’¹ÏÉ\úåI†'_4åZ7*Mš©oŽË]›¢RâÝ»¸PÃrŠ»î\õ$ºT€p}ÕOŽRJã&•ë¦{ §fÆþ;÷ØWCæakl †³,ÞÈPÿøv-ö^Æu¬[ÆT¥·,ð70PSù ßÞü¸~ói endstream endobj 82 0 obj << /Length1 1906 /Length2 13602 /Length3 0 /Length 14777 /Filter /FlateDecode >> stream xÚ÷PœÛÒ ãîî Ü%¸»‡à68 î\ƒ»»»;îî\BpÉeË9{Ÿïÿ«î­©šyŸî§mu÷šJ2%UFS1PdçÌÈÊÄ SÕbe°°°3±°°!PRªY:Ûÿ#G Ô::Y‚ìxÿÅs9¿ËĜ߉ ;€¬‹ €•ÀÊÉËÊÅËÂ`caáùäÈ 7rµ4(0dAv@'J1½‡£¥¹…ó{œÿ<hLh¬<<\ šDlŽ–&Fv#g  í{D#€*ÈÄèìñ?.hø-œíy™™ÝÜܘŒl˜@Žæ‚´ 7Kg € Ð èè 4üQ2@ÑÈøwiL”5 K§¿ª 3g7#G à]`ci´sz7q±3:Þ£TeäŸìv‘åÿ"0þ>+ëÝýmý‡#K»?LL@¶öFv–væ3K à“¤<“³»3ÀÈÎô¢‘èÝÞÈÕÈÒÆÈøðgêFIe€Ñ{…×çdâhiïìÄädióG̸y?f ;S1­-ÐÎÙ áüÄ-&ïçîÁüws­í@nv^ÿAf–v¦f”aêbϬngéà”ÿ›ó.BøGft|daaáâä@w æ?¨yØÿT²þ!~¯ÁÇËd0{/èci|ÿ@ðr2rœ]€>^ÿVü/B`e˜Zš8Œæ–vÿxÍþÂïýw´tè°¼+€åןôÞ'ÌdgãñýÏ3«¨ÖS¡ÿ»äÿ*EEAî/ÆœF¶,VVN×ûƒÏÿúùï ü§ú?¥JF–g÷/2vf Ï_E¼ŸÞ qý{2hþ^ZÀÿFP½Ï3@óÏøë²|d1ycýÿ¼šüÿ›ý?¼ü¿ŽÿÿÍHÒÅÆæO=Í_„ÿ½‘­¥Çߌ÷yvq~ß Ðû†Øý_ª&ð¯…Ù˜þ_Œ³Ñû†ˆØ™Ûü÷-$-ݦJ–Î& ѺðîÜÆÒ¨r²üãÂ0²²°üÝûΙX¿_*Nï½úS|_©ÿ )ag2ýc÷ØÞûnäèhäðÞúwôàÅú¾¤¦@÷?gÀÌdr~7¼ç09"üÑÑ÷ö3‹ÿ!ú ñ˜%þ‹¸8Ìòÿ w¦â7Ûûþƒ¸ÌšÿE<ïÈèôngüz`ò_ÄÁñŽÞ·ûögÀlú/È `þ ¾‡5ûd0›ÿ ¾»³øÇùÇwäaoñ~±ýÃx—Yþ ¾Whõ/øžœí?ð}·˜ÿeû¾ÍÌ ¼¿sßïû©ßS³ÿGýnkÿ~åÚÙÍœÿ‘²þ-ýk+þ+~OÃþ}@ÿ*œõ½ÇÁ÷Äþß-þ±fg7пÔïpù|oë¿à{ênÿ@¶wk÷?áÿL–‰‹ã{¢ÎîþûØýÿyÅî@„•E _U}PçC­¡ãÁ¤Àåf*-£×Šc—Ë lmMæ—-Ç;‘¤Ñ~´õ= š[áUÒW¯Ó¶FØÐöåŽgïƒ8•™ƒ„åiœ¡©ÂS‘†Abx"F5áCïWokÈ6ðYÊ\n¥|Ì·)÷†ÁòµñÅåÃN9Ä—òYÆhõ(Ý€’yÊ<ã¬gÑìE^ÚÛl1 ž•jlN½øðµñˆ!o1Æg¨¼D’eq—¼J‹£¶–²¹Â¿Ž¬ Ä/Èià“û*á9•1 døË÷`~èÍq3Ép´Ñ0™RPQ“6ÀyS–J™%TSŒ–dYú=¾R«Æk›Òwõ‘ôž]¨÷ÐyÇÅãeþ1iKr'€¹ÛåËùòÃ\a4#%d¶I±ªø gvB5ÏGBeÔ)º±ÐKgðwSñ=£¤U¨w±³­î&ï¢;7®Òä³±RãQÂåùkQO¬Å¨NS-Ö-và4šA7OØÞ´3Û{B3×uƒ ®(ÊyE÷ˆlêË–­‘:„æ´ò“©ÖÑÌ ÊÜkV÷y¹ÐšòÆÇ9P%R:Qo.‚)ÍÞÏ`z‚H(3`Ÿû"›tÌÛ¢NàR(ž ­c›¦Ï$›×³v¼˜¡Âê%Á²Ãs“©Lé£Ó¤¿ÈãZ¡S|'³uÛdë è°ûî¸óÁ;ò÷Œƹ©Ã<‹n‡ÓÛ^{¹œ!Õ“N“ è AiðTÊŒßì¿ü §ŠHS ªçjDoCOvÖÞz†Òu$öóþ˜¤PÒú‘¼á ]w jñÙê mÔd’xLTC‡ü™}bÜÙXwWÏwð»ÓœÑ,rw–þ{ ÈŠ-áUŸ£òÅ@„QS™8 :x€UÏ¡Þá +SŸ³{vüe¼µDßg›üšbÓP&F ,â†á[±Ø$X¿bÒ2¹=œ&qd+»r,­PB¤uñfïªÎ¼°o·Ö‚G–Yý+gh`X˜îµQ§Æm.ýB„Å!3uñ#†´K6§,ÏÞ¤—d¿d)’9¤ü!~›²¡Ë©fOU1éSÈ:ùèRN¨¬äqçÁ^R]ˆu½i­Üóyȱ.ëx½Ï´‹PŽ+·ÐÜÔ—í‚[Û\Ò9¹†à1°~ÔÍ´èŽí»Í³1 9R£‹5EùÚ¾b?R"Õ™ %"Å:vØs }ß¿e“Jv%0ã*ÉÄ^tÜÇ'Ü«íúÅ(š(Ô,Û™Ð~Y>h.1_[Ð É®Žfç  ­¼þö96ç›ì‰«G­L.ìŠ\”®ñ¯ì;}~¼,[³µãgM{b ½?È}Æ.ÓA‹‡¯<Dþ†ôÃÙŠ Ž}PaÃc׳8èaGHûªEøðIKIÔRðfú´èòlÍ5LCrAWĺ”Ú\ ½–É E ‘uyIÓ3D®(C ìZÂÃáÙñ;œcéÞ6`ÇMK,žu²e¬7¼’ û›ÿrBÆüàvùq“¦Ðð[JdÛk!Þš§1;4Ëâ÷[F<5Z¯ÎøéËØHýPn ¦èðî.rJ ñ G”âu0`¿÷) §MP°G˜S®œ0͘NÍâ1³u^†—Cq+ § `ÛÚ#äÒ}Æp¾úX½ŽÏ(@óm²¹ ·µÑ[G%}§Nðc€L4fPy–cË-’;šEµ…ÙžµÆwÕ‘j®PÄ5‹#µ„[¬ ÐéhÀ}P M5’¦©“ºÌƒÀ¥ÞÓ\š‚÷tzœ©ìƒîçr” )ÔS´-ů{D­^ä86º=ë‘jn „´ðË+‘K©Ç[€Æ¾¾ßÝ­û- ð¾’è§€îÐX-Ùã[î7Ñælcnÿé¶-äÅ4…²Ú®Æ¨*Œå’] Kû˜íÔHÚaÇË2¤\ßý Ö›tÄþ¥¯é°ü|~¦ 5úsœEfY J½ö“¥ÞWÕÖ*Üí\M¿H-Ã`šë€ýž †Ì,ÅÙ|"áŽZ Œ£,ÃQÉÐîMyÊy[u¢ÌÎ#ÌFQ '݇ZR;û»í¶ÿFãC·N¾N_Ôkpª™:>Ç[dt}6¾2ŒUÛMüSPC\ŒyG(©yÊhs™Œ’X«·Ó"¼¨¬cf> Àv{Ô¶”ÓÐS˜_ÂØiÜNëú„§3?i +£éü$˜™¯-©‰üP…¨Êv£¿:'ƒ¶ú® +C"F×qD“©on&”X4 æ±·¾B+:q¥Û-¼jp5%+d ppXI úÅÍ¡¿83¶‹Ú3#žÓLdôÂÃ…´WØÚ;íU5Z’Q¡MÖh`Èè¸j³ò•î²ÃüK^ö>ÑJûrDž3”¼¸ù,¯±,|Ø“|û€ÃW‚ÄaÇVõx ËU4dQTq±·ÆÚÕSžíLÕb~Jrq^ôK&Yƒ ÃåjÜãw ×tÕåË)}€Ö{)(€&©¿%4Ãuóðð–ÆÊó: Q÷Åá·é7zS¸&†NEëöG¿pZ[j[ÞF5˜éxž\”œŒH‰pWµBÍyC'€ˆªÎâĦÌ6ñ‡¤(ömŠEL‰øþé1Jm´¢Êšþs  8ì—DtAvÒ·$Ç;> öht‹eHl ô…»*Š÷ÝUŠ7ìd |µ"¤_©”³ŽFVþˆž9&XnõýE"äÚXöµ5—<:¤A°ÉíxÃõ¹aÇû.ÇIðœ“ЂåCØ”=X£ñà®®#|4ŠHÅ·mmþGWúò1˜y±ýޤIúRâ5nˆ¯XÉD‘Lîb³+C9T_zÔK“|VteÂI³ÆžÆpeÍ ‘²zwx×Ä…ðÊÆñ°4? Ðû˜’ψ?Fk© 2¯=u•zÁòVsoc£~ÜX•ħ’ÿ2îm°ðÆ4Z™ïjt²­zÂÇ¥N9n͹'$*jxál]è/Ñ€Úä¯&­‚<4A.™vr®…Vê½î1uéâ{ ŒnQaÝãÊ¡;W˜ Ž}Œ!§Ù>™Å}]šè×ÏŽþŒ¾ðùE9Žñ\q…Æ'•Øq!é&NÓ²Û¨p6ˆPÜ-°Dˆ¨‚ÀwDiç<Ñ)E’G[¼@µö¶¨!ý\‡+Ë“ O¬èD»^æ¾jŽø›czIEÁB:zHtvÑiœSž–P&#Âü®Kºë„é&ñû桲f匳½Bs)1S™ù¼‰Ò݆*€°añWÚ…¯¨Å®À¶dcþ9›n›þß\°#¦ÅFòÝ`Äg®—•èÕeÃBÄ:{U!ÊVKïï‘ÎÞ`:p÷8Æü„\ ™³\¸N£ÓvM_¦ÑšgÊÝØ86Ñ–‚{M™/Ä}uhkaÍ9JòØ^7¤¨À˜íû)Q“ˆWøª:‘ÁSxÁ£ðìNN°û}ÜұљÁ¼à‹¦*ý X˜ŒËRö¬È´÷b„ù# ‘¿Ü½yz,ÚÌÓþ~%¯¬]ÝÊåaNíön¨Û‚fÓ.àVØ ÁL R|hý³ö~x&lóâó£×Ý_Þ®I>’Âç‚ú¯Ñʲ÷¤äQ=ÆÔV¹~òK¬]î¾õ:„kúŠ5æ?Ú~Æ¿øÜc2¥|B:dü]Ì·…Ùóµ¥åÃþµþ$D® ÃçL&bÉçõÄBðôJðD©o¸íXVÝ T`8êT“ª•å,¨'i„Q©ªUæÝº{­ýÏi§3PôÜL¡Xd£%Bq¿9| éÇGå¥^šŠ/æñÝ’H t×ø jSˆ4Æãå•5\΢$ÚQ!zTäËῼùË- ð^׬J‹œûŬ¤Ø£?ÄNÇ"w»p<ðº>ÔBë3Y-{¬`N>ûáã÷µA·y…˜›Xƒ\VêB¶ÜdÇämîaRÇ&ÒÊ:+x?¨½"¹­[†TË$Ké~Ù7¼…Pp gôó˾~Ñ Ç+ö('ñ\"­ñ§âU#lÀ€²>Èã5Z?·b–Šs+%üîÇpe~?¿Ûn©€µPâ$äÚ›•p¥’7‘õŽGäÛYˆ“Öë·e¹b«’´{=?ß4nþ^á½Ø¾Töæ«¶¶¬Ð/”Ià<\Š“W<}cõûû" må¿É+îñÜ{„Ÿ6ôᇜÁŒ–ha¦HÕ_hÅ™„&Áy:³jÌ8TîØÊ/cf´ÚÚÆ‘áÜ(HP T< á´Ç]hv¶½O˜w(·pì{ªg[?”°·ÑÅÇãÝah¹áæÎà(Súb•õøçAãfÓ‘¾‹f™]-X²•âdÚkÝ râ„£³&}÷'4üùZxñxLYG¤ÓÒÇmÈìÒ8aÃ`Áe²_oû!•¸â“(¾“|U¡o5Qß© VSۧɦ%m~‘Ó7]£lì%ÿù¦É$7XžCåÍåê¶ õŠ¿œñ”ýa[#|F1¯{ùÍÆv–ÓMW&Äo;%ª}l¢ç¬ªJ#SÈå âêP!-Uâþ2DÊŇþÉÇŸaÚFŠõ­~kwHd…ú˜žˆ[ØÃCYõÔe ý2qJËó-Ûöx…Ý}éW¸¥Yt•“Kät¼idÊ€#žX–ÐMg`Ò¸†Ÿ¦©ÇÆÚGYÔØ†™#ëõS–Ó™DÕö Õ ¹¶ýhÚVlhÿ¥§r‚ð¤&›Vã§+ÂÚ7/ðS^¯FC*€ªýÛÂ]È<¦J1Î!ä$Ьžvà«ZÑü  X/ÆFiªŠjÛ”ÜØï©5GÁ Öº*\²Ï ;òÚÉXÿI @U]b2ò+ÈþZão3òÂ"‘ðù‡×ÆX'àzDwÝš‹tŸ¾’(T9¯.2¨^™Àè5å²GTŸ0Ji-þðѦɛÇ%TÂdï4 ߇3,ÿeëöì¹\Y¿Ý£—à#ÏçÚ‘]:¤ýZ¹ÜÆçØßÐ (“ÿñì>ÁêdPV‰O£Ë6¶§½ß­Í4·Ž %t¿±Kp$ÈŠjtinæ>FFeß¶O~áFw`Hê¦zØ@ÕaW@úµã3à¼ÈŒ9UÞת†Ä÷ã"þ¹UŒ;QO\¼Î…e¶i¡PùEGÀÓÿm¬H)NNLÝ!Þ:,1pb Kè‡u[-"2­üõù³‘ Ií°¦ 2)¹Êg®«Í·ŽõY°¹“Å¡ÚÓðË´=záɆµ Eµa¡_¸Q…kF²î¾mÜø#.öMùÞÈíB/kñСuzU4åÏ¢ˆ©™Þ>V¯P˜§ážF&I3–èQ>•Æ8€Asfê7ãüAp¶˜÷Mk|“½_À¨@¿ÝÏ OlOïõf¿ÔŸ”m—Ü\¬tÏ lOR–{æõÛëø(›×¯žb4tÖÀ(ìax3p­Ñð6°$Œü¯žª#™Õ` Éüø±R©¬ÌÞ°£OuŠˆ¼­Æ íAM’øìëÙÅÙ4ÜÙ¼¼†îÚsâža 6"Ì%盬g|¹6–V֩š.#¹&«ùod ’ƒÑpØ^£ bó­Ý*C­I| Ö<âƒ:¾¤g&É6«ÊöæçO¾{%¦³ ¶Ýƒý~ô!ë›—Ú übV.Y +2ã„­o%·0 XÍþÙD·…š8Ü|#¡ê.Œ´Ëlš‹¬=“Ї2¼ŒoÒ|}BÑé‘&$ÁѺn{.ëÛ…ò 8ukœãž?QùpªÜ/ñJýЧ®å’%‰`»ž„Ä! ¼”\õ#Óêg8žÏ¢ŽB­ªêÜëmÌ`y!z¾»(%yè…b2ŠÛGö©Û鳆QTÂçf®O™ÛŒ\Þy—ØôbvI<‹Äã.鎒o#Úà’7d4‰`jMçÑ¢[%“7¥ÁÔ-!ªâ ù°H}.€ªíRÖŸ-{gÍKg”øTÅÂ"£ÌÑËð*~Zgcñ PÿìPÞfÒà é¶ |ÊØT>©ØäV6„ÎKKOjj-d<èÀ t¿¢]ÄÆÅï—ûßÎÖH~ºGü_m'f–fVLHøÊͧÁÍ<Õ㓇ÓkÓ–’œb¦0Oш³8€ÔX•œ@Ó#9ûKÜuQ¾4­aë¥2„¯)Ê#/#£Tô‹N§Ý3`¤á“§³©ˆö>é¯ îò&fy§¯\HÞ°›|JÑúâ…Ÿ3íÓ%¸Ñþ(9íÎQ òUèUšavî^¥{)¸m9„yS¯€±IGC-µ©*˜¡ë˰?à¢îœÈUë µÈ¦õ#iÖ£”sb±öÀ«Õ6¥Óf¢`—UTA®75oWtÜ „ Q€ˆmƒjá™`hOæöˆõ…x$«w¨] ‰!|·Z š²Ì©¡ÊÖܯe[Z‰Ÿ_Ñc»…|bq%×ãe06dR„€‡‚\Ô §6R/‚¦h§>ÍÈG(5µÞ4G¨;Ý#¶$V0Ü/îÕh·KzГ0ÆJkÕŸA<„íihZÂý¬C‡W2)ÜJâb©™4ƒE¿ڿ_ûäÓXx]„9£ m5/˜g—Túj¬7 —„‹; ó>-¶p„ÉŒŠ.¶üøƒ*¾E¢pÙ|ÚÞGH™Qh[%¬¬Õ˜ Ú©§{ÒA‚D?n5¹i{®Ž¦—Ò…ZAÈ< €ósU³¤O¯Zy¸g¿îw á»›• ˜PéZžWòA£·™½É2½H'ó5]˜T¿ÉîÞPkd‡Í.•œ®Ä°+Ž$÷hYu}û}öÁ¸ ü’Ð7Ë V]Á  Ñ…á)æ„æ¾eð c”Ü…[ ­¸:ß…©Õ“ƒ”²éˆ Í0ᄞX‹«T¸‚p*ÑֵׂðsTì1’çÇÌÚ·"/&6ÛEÌ)üÊ øßËbX+<²ÜµÈ’pOxãm[\P,2WßôdEOj…ÞÎóÁó:^X|=¿ ôùf¡º#)çXì£ï{ÚÀ¨_S^ªX!§u[‰»Eý¾^h„O“Gÿ¬Ô€£ôyŸ"Ï÷þUÀê^ê÷S‡W$†^U𩨝¯r-…÷GªËß{ÍzFåi¥“éŸÑö6|æ(>(ãq„ºið‘ãE0¤,tõ'uÂù I0TôêÊÍóp5t’ŽFO± y£?´´Å~s™ é}Á3ïÿ\aÆ)†~òRYð,ºNzÐ'0«š„3ØŸ¢õ‡Q2#ùŸö¢1ç=ÙÈ’µöYçC޲p½‹ftµíÜÞh*Õëþ…m«^¥™2Oueâ¼]ú³lS ûýÕVÑ Ý˜ðÛ—–íbÊ6£Ty䔟NtÔ«’žÎð%7èy´¿&¨2tÆ£ü¶ÜHN=Ûš²¾ÌÅËt‹òur¶––è«Z±ZÕ8_ ©– U2å­íÀ©@3SEÌI î–îˆà—vnÑÔ3¤Ý.‚Ÿ7W²¯+gc‹Ð‰’4”Êè/¾Ñ4â¿ùË«Ý{éh/m3ŒÅ³@oÐGa?H5±Ëϯ!€¿ôZPT©Z“ oúy¶÷#Í}99£Ešác+ó`æI©·êKï>ï¸X Ö]5 Lòwäåé¦×|“Ž™ ÊÔlqM^9x{›ç9acÐ:îÒɺË(ÃH\_³Êò’õ>ö®SŒ‘Ρ·ïÙ`³¾¶W£¹ÍNЬ*a×r9žTMÑ pèÔEý°…â«Â0h¶Ã(3%0Oê^íô–R¥—ó¿÷º»›šŽJHß2[|˜µÇHÏYõ yÌÌûØœŠÈ’ŒÕ§¾¾ÕoqÛµ{ÒaØuÕa™¿L4+€µ ŠQ€fàhII­¶ÖèîÞèc‰0ŸgÌeh@¹C¾ …Hág”Ú9K»¯Qà³^¿ò3_š ÆL®Šd5€êçGr2Åb €g¨ >Br5Bž·ò—¸ªrˆ›9 TM&CÆ+àíü|¯2|T7݉ÀQÌ+.ÉÆk_Ÿ)hôAc±¤±[¢ôw«'dMøÂÏPž¿Sèfîh½ ñõ‚yí+6ã×½oSåó\šz;Ž&í' Åu,\ÈZS¤¦V*Œ™­Óžï Xbçê¦÷L¿;ƒÈCkмá€íßÖ*\Ï"ŸûÆ{¾yRiß´è¶þJSĉH ©'Y ÚZ&;’‚1´ò{Del¸¥t&Ç€p•ò¹•ä–Ñ¥nôÂÃgÇÄ»7­#ss” 4%[i,3bi†;Îá;@Lq8ç€ì‰•Jœ½Ã¼Ù^ò/ì^|š¡9žéÒŸp¿{5Ð üþÆp;Åyæ–ËÌÿ¦ÌŒôY¤IñV?Я¤V>ŽaCõŠoNë­=r¬ÛÇ–0ÜáËcKb*NíšuåéÔ¶$´ÿN3½ÁlÖ·Ö*cxX¶Lµ^ Љô©ø!œÈǼ¸Øû>NÃ!»0„_<ácÀƒûyRcøÓ.—æL¢Ádá´Œä‹<î‹ToVu;·“TUˆÐ݈Üûµ#/‚ÎÅR š^£*r*—°Þƒ­'üboÏyP ¢¶eµyJYIc²¦ŠOÀ|¦—ƒ˜)2\ê–3‚I35§—QEÐ#í/È’_±OôåAçK\?¥M:TZ6ÝJ„×ïu^¯d2Ô|Zçhû³²“Õï5NÂæí¯C·b­è.º¤Ç ZÚÑLjü9ªypº„/˜p¡ç™éÔ6C´Ålç/{`KÁá‰œÑ N»WKê0Y޾zà±óÉ bä}É®n¤æÊ¡š™éšOêâ„®Í)…›,´ jšéÂù)àw?ë„üô=V¹>¥0ZáÒQT/.RôÔNd¤E Y6}øñ0(¬v5n×ɦ)w“]¾"¹UÖƒõ]¼ØNÒýåIR¶3‰Œ´®ß8‹öRi”=SÊiz,m´2èÛÛÛÜ©‰pÐïqB¹Ïþµ„넌¡ù–ôºˆÝnxf6œµ£Ø±‘Ü+E¸?KOÐê *ö9›7"ö)A¨vÛ|ã ó R·ûö XªÓÇUI ]"ÎÔZŽð›~Ç)ø¹ëÉÌÎns6zÑY´›(\ûýñÏ<Ì[cˆ*ǹ ­¾Ÿ©Ôv9¨* 6·a8yùáM»îóßïVwf¥0ßHæ"?qœ ¼1™¼”s tVÙFHÛ(âw$ÂCmR ’¾ÚA¬Ÿ,B%r²]Z ^³ôÄÕé~¼°›‡ƒ‚Z^&XN©¾ú>-wÙî‹™ ÐÞ €²Ê{(PaU…l «qʨó®pì_¿¾§;ž*…àà Eã­«vP+h­è&4øµ]óµ_.6Ý ˆ{ØMiüdÙO¾§xP£ÖrË®*|Ø®æ•} ¿Õ˜Þ‘VÈ’ôÕÿqk÷þã*ù@%«ã;vd‚¦p (0•œiü`Û&ü‰ðâàæûüÊÒ\ÆæG»™•DeÆÄºsô‡6mf·3A¨¬SBνN¥CoÁj½zÞþÖŠn½ÝŸ!½Œ •Q—>êÉPÓŸ~ç´|‡Ý¨ÖC¢_ZÕêÛ£Òƒt0нG—ʤyØ:ùM­s#ñÜ£ìë´Jð©ß¬wM·vÖ/ž0 Q0’[²2'0ïI¯w–Õ˜Ý>†´ÐVU>1¼¼˜ñ¬qeeàà ‘`‡m #{èRw¬j>Îï°™Z.2’<¼ZYðXåkT“\œ²òuAŒž+¶=ìÙfšnõ¡·aÝΆ› ¢ªkVa¨Vžë¥]·Q ÆåÁ¹, ëZ‹[µÙ8W˜%¼$:O‰À­½%?ì`óú7©S61•ÇêWŽi¢ØQ—!)v=¸#7GÐTqý0" ÌçíŒëc£ZÿtüuiðÖíì@‹-UËäîù ˆD©×ò#,ÿ·«^ú7¬çù£tvHé!o/dN5MÑ¢˜Ãâ’ࢯÇ?¾ì©œ ާÛÂåÄâCò´ÌE1+4}îÕÄv "þzäR\Ï,a±ý†A«·¬²K¦†ÅwMŠÆWÆösG¿¾zë®›äWs=Ý9¶p(™3Ñ,ñèçŽ%¼Q™ ‚ñÀúð‡Ÿ÷çÅÜkýÕ"ÆiçFÂV‡Ã,¡ƒ;¾Ã¼tÞÊ}çÀpgå … *‰ÐaJ–‚/»#´H,Éœ¢åê&h® Õ>¥—Å ÕÚ Åçvý†7Ê<È¡äÊ\<âTKíSöó˜ºû |nžÇãÔXh¿|GÖ¬rWD&sã8£Œ> ]êôd:žøÃXÕ¾äúÀ ½‹§ïúãñÙX; 4â§~®W’’–˜*¸­¬{SxKp/‰AQq¥·lCKiN˜U¿åß9ØÜ®¯›Éð(iÝß ·‡Âamݨ}÷dáÄgÅÇ#s¡¸”ãЬHÛð•è>è¸jóá2Wéz.p|…­i2Øq_QÛE|˜ì›„éÈ»Y¦ËÕ’2¬Ì”§´Ä:CŰ1ïèÀÇX 7‘¯êâI¯Lw°E î·Ji¯VEÕ>¸0fñ“Ü`àO³©Èá¡´Ÿ/ˆÏG—:WËCBšl~bóé¢S1sl17·¨Îìa¹_ú"Þí/)9³‰öûÁ:…Íì bÒs^ç¸BÒ=ÂЄÓw  ¼ö ÊÉ s§¶NVª5Tè9±õ‹Qd·ŸŽ¨$>¼±ˆèº øž"õ „Ú(`«y8Øzih<÷ÿ$Љו\ñÙG£­OÔí\Ì»ÑÉà £Ôáµô=S(¼ºc¶0EÕ¡MuE(Ôœfh‹?šlÖxøP±G{)‹}WÊwèÏ«ãŠøæ„ÒÏ“X@¾4¾øF•r±øSÛsNÉþ,–¡´9ª;#¬ 'wöq‹!F¤`z´.bÍé¹tvø/ÑíVowò{ôúp¿ßöO¦µ½Þy3¿ •‡š¤)I%“勨;ÜP¤×[ùt>ªrìç˜í4×¹sC´.iTÌD+´þpRðH¢óJÈ£é÷¨òÃMÚç¨$:‰ðšØ¸ßX‹é™sR-„õ1µ‹·Þ24vgÅ™uS}m•ÿ ”5` QÂÔ-œ¨'ë ¢ÓHÞ‹w¦ë Ôp6¹Ñ'd¬®¨“ÑzÓv•^1ꢈedô@&U‚ómü®àØq¸Z2Ý㘑š`8Nœ–úáí¹º½ý*´óÁŒçè#KQBàÌ—#6§ðB°ÄDt¾ )Ðп¢žeqÅ­ºl$ŠpH5Z?(¸ ÇÙwËtæÙ× â ò¶Cº6Àõ×D@ÞØdγíqïÅŒ ´îèÌæwØ ˆgÛÊó€h9"ÑLÏ0ü“æ·ªDfš1¶¥Xí¤ˆ\Tf!Ii{8SŒã]¦:kÕp…¶e‰”šµT~ŒøØÙD“/4 ÈŸ9Z$tÁËÞjä íÉ~׋z]]™“,…\ö#+ô>må¾f^"eV›Å Wi}\Á èè±RGõóÔæà²ƒ‚(B^R¨Ûò2Å„à)ÛÖϵøåÛéÑÜ›¾à3Ëê¥ï=…Ü«Ñ7‹·5«¡ø6ÔŸCmj›‚l—ôŠ^É•}RÑ]Xùܯ‹È m׆HD…ƒ   Ç*š!ݲD#L‘¹q}ŸÕ»_ïxN~®60PìÑÛÆ%ûª˜ÕEÒQYu\áqóMÇHçã(sBï\uisVë^Â-•€·fâ(¹#ãj§8@F`~ÖVTS-÷ŠC™§0‰‹ØíäÔ Ð¾ÿ’•Nw'‹H»ðƒ-Á4vÖ‘³qONÙÖB"ÜÑã°'Ü7‚Àó«ÞúäQïq´4›ÂQ˜¢Yè-&åËŽ?gœ6éï“pûaöxYà™9ã·;TO#N|Qµ…Ï]šXŽað)mû<¸ìí°tãÌn ÛVßáÛÏoã:W[šxíæŒ_Ñœ¯IÍÙͧÏ~1$WÆ[Ç4 $®Ð^–5XéÈÿ…w Ñ5Z¥Å6ÙiÈù(ÝT¢áŒÜ ÏßéôS(9Q0À%©¤æ¹›щiËÍ7IçõÃÈ?—~”'Ä€ßsêN¿ÆÝ¦­ÐDôYê7ú­“_`Â=ŸÅÎEóꎸ(‰ Þ«Må ¬rî.NT ¶¦·E>Æra?LŽï Å`éS€Q^I´}צÈ:óM~Ý0B÷B+Þ<&/¹Ñañ~ û{ÿ> ·á†5@™ñºöêzðÔuÒŠ}ï¥hÜ|P;a©2Ojé5¤äcŸ“0t õÄ©i!€)ð´HŒŒnÂèÇÆò†"ÒCר!îsIg¥ß›øŒŽÐ%e'3™€¶jH2ÃjgA¹ï@¯Ö.ü@•5¹“ãô‘[ÓGs¼GSde¤™¿n€½èd˜ù-¢êç:ç¨7ƒN‚ûÝ$ǘ% Úv;±ê¨§ ëHûBbNBù¢ôYCÝC@»®ÈRâ:…˜»Ç·ó6&ûqΨ³Ñ¥]p¯iÒ˺7¾£¾f¯Œß(üÓÒ}Hà‹`Úìðo­Úq™8DF<2.h0dÈ!ß…›Z}q/>îÞy4Úó~^ÅÖ¶«6«d–¦"&<-O&—Š¿Õ>Ÿ§âôóž ?w®JïíæÜ–ÐÆ×ß¼¢°¤]!ÓZ¤HÛû¤„ to¤Vçrü¿ vkî|× Ü d,²E.¤•tÀ‘²…$Ä<è|÷ë/ ˆr™ªe8oi0Sañ4”•_3À²[uU¤-oñÛæcQz?åöì`ÙFß×›z~‚(²…9˜T “~Yký)/` )yÖéTžuaŽ0?1žP:Ï)Á€pÔÓ„­*beŒjSò[(ï¶Q‰’}„º}ΨY,PZëãtJQt¥’Š\g*±<ÁúôåR‡ÑÂpà$”ÁÅð~â‚ 7‘) °ZE”Ävˆœrâž~¢Ó›ßU¥ž *Æ`\o¦Îòæ /ûá‰Ó‘ sʺ=ö³Ù¦Ÿ3`vÓþÐ…¥6ÄçüÅs… žÙ¥ñtxJ$\F•!—„d’Å-ÅfíºÁóZn?ÞΖÝS‘:ø)çfµ¾ŒìÉ¢šE{„I_‹gmÖÿÉö›#¿t»-ó—8û®gÌÑ`Â@0ßÏÔAîýëE‡¼ÖcᕦbA£½€ÜÞú#9²PŽÖè¯ÂÝUë!ÅáLš^_ëë0%’®jÔ/ñ™NÌx<Ñ<éËN¹%Š¡=£œÜ—¨bq'Sd3—ºrӥ¤}«f qt_AÖ|àÜî›cöqv›ÌOj©\G!Î)J¿/±V¶½ï1G¼ªß×þ\y´¥¨'¨ŽK[¸^»vz®ÙB±zÎnÌû“¿x"Šè}ÿµU0ªDÉ>æZo< D wÔj˜šeG3¢éøäï%yÓ?’$¡wŸœôœ‘/°—²†´lˆÀ¯™ãdvão+*ìOä9ǹ­ŸùÅÍkS„—ªjy Áq -¾·R†®I±­a¸˜}WȇýûmÊhþ«ü˪kæ ûoé¿‹ì Ÿ¬ Å‘´vÞ/Ä´!­ãLzLQAŸç9*r³ß<#V+túK—±Ë—Ò|X‹?é.KÂD¼ðnô ÎÐÖúHÖ‰4ŒÊW©ÁÔÏ`Q¥H¤Î-8c(¯Ô¢Æ~=<…)oüžRhbÖšx,™éÆEÿÖÞn»‡ß½h2»zÇÇÌùðd‚‡¯£œ=f{DÝÑS ä)¬Wf¹0¬Þ°±]ze¦XÇÇ…,Ä0FÞK.ùÓµ21öy¹QŠ'Å’4•Å—ÖÂŒ+É!•¤K²ôWÇ:"? ë«ÍŒCö3ÖHªêÀOaJðåžpr¦ävz‰S‰S‘sóÞ½ÒåÝ Ä¬â´±êÌœ¯Ï´—¤öù:©2«1ËS³¡C W!¾—Ý.ƒSG¬©ØÎ…åÎÄó‘½Ig%‹E½}9ž#‰Ü–Dª/ðŸë\MXëòyPÙ¨[ǘ[ !|Y½{s tC¾5Ì6¿2žâuÅ=C€± Ó “CâSP«ø0{ ýRÜù3äwXG‘”j—ÿñ‘‡T(Sñ§‹2éøìÑ«,LI0âN`¶­ö%£GVc™²Æµ4Dôë]ަ[a=:Y·l8k⯡]ü u×iµRÈ ¶i7*àR³Xú·Ý€À¬h ®Ý¸ìb0^é# á,äò€£³"C2nAÑ›QÐŤŽ´VÚjRßÕgB¬ÓÕœ .1ãDZ`¹CÎÆ6"’Œå&7šÌ«Ýƒ\exÇiÓhSüòB1×4K‚ O=wªøU).Œ)ù4—9ßt«G;IcÕ“p‰±Y ,(xI”ßøI%VHëâe“Ç5ï Hl5d1מ¹*¬æ<£ëåâ> stream xÚ¶T›é.ŒCñâNpw÷âîî%H‚»»)/ÅJ¡hqw/NñR\ w»tfÎÌœóÿkÝ»²Vò=Û÷~Ÿý~¡£ÒÐf“´†Z‚ä 76.vNa€´ª”7€““‡““•ŽNìæú•Näâ †B„ÿe!íº=Ëd€nφªP@ÉÝÀÅàâææäpsr ýÇê" z€­ªì%(äŠJ' uòv¿¶u{ÎóŸG£€KHH€õw€¤#Èl„Tn¶ ÇçŒV@€6Ô róþ¯Œ¢¶nnNžžžì@GWv¨Ëkq&V€'ØÍ r¹x€¬¿[¨AµÆŽJб»þ©Ð†Ú¸y]@€gØ q}vq‡Xƒ\ÏÙÚŠ*u'äOc•? X ÀÅÎõw¸¿¼CþpZYA€o0ä5Àì¨Ë©°»y¹±€ë߆@Wè³?ÐvZ>üQ: '© >wøW®V.`'7WvW°Ãï9~‡y³,ÄZê肸¹¢þ®Oì²zž»7Ç_‡kzB|ÿƒlÀk›ßmX»;qèBÀÎî E™¿lžE¨ÿÈ^ƒÜ|œœœüB3äeeËñ;Ž·è%×oñsþ¾NP'€Ís ° èùÕ×踹¸ƒü}ÿ­øo„ÊŰ[¹,A¯ÁÔ¢?‹A6âçów{Œ9ŸéÇàüýùûÉô™aÖPˆƒ÷?æ1‡‘¦¶š¦Ë_-ÿ­”’‚z|ÙøxlÜ|\..!€'Àÿ¿ãü=ÿtÿ‡Tþ«:Î"*Bl ¡?›xžÞñø‹Œ­ à¿3¨AŸù 0þCN>N«ç/®ÿç%øÃåÿû¿£ü_éÿ¿ɹ;8ü¡güÓàÿ£:‚¼ÿ²xæ³»Ûón¨BŸ7ò¿¦ú ?Z ê`ý¿:E7àó†HB^;ü=F°«Ø d­v³²ý“Dÿ9…çà`Hê þ}áØ¸89ÿG÷¼sVöÏ—ŠëóYý¡=¯Ô§”…XA­ï7?èâôFå|&7À—ëyI­A^pÀÁº=»ž›óØ@]PŸ(??€Cê·èO$àþ 8dþF\ù€Cñôì§ú7|Öiÿƒx:ÿ >‡îßHèÙøpXý~OƒÃú_ð9?è_Àaó7äû î.ÿÒ?ñú_ð¹ Û¿!ïs¶ÞN¶ÏwÞ?Ï2ð¿àsóÿ‚ϵ9þ¹žkû—ïó¢s@ÿ‰þlûü*ø—ú¹:§ÔÏ#wzf>ô_Íq=—÷¯â¹žkqý|öpû§×çdn¶. <“ƒÃÍú/‡ç¹ºÿÿ‹,Vî..Ïéëṳ̈ÿà?nmÈ d…º0 µ ³«k½þ"Iêɶ5&önK?‰ÍwÁ¥Íý9…©ò}ÈŠË¥dÊP7öÒ†,ãÅ«EÊßý¦ZäÈædÍ–;¿{ó·Z“[-¨óýã÷%kúÈ_±é¼Úö{pöÓ ¶‡o‚íP¢ËuvÄÔÈǽöì•÷ªé+ù>1»¥¹]ɯŒv_2ŧûÆ$¸hš.Ï2{†ˆÉ…çØ kúâòNÎø¥Ò[Tÿƒ8žB_£Uîø›Ÿe:ܮĴÄFDäð8#“ô¾R»©J„s¾ÅŸ”"b?Ù›Í6ˆ·ay«¨:DK†Ç׆‰ö̃¥K°6&#¬4×餆ö´sÚ‰prkЦ¸Ì P]5Ûw|b˧߻„JôÛ»jpGfô$9P„]0J µïFî¦ÎñÏç÷÷ L1Ô&=¾z;Ïm™çfÜå ôÂ8l‡¸>ñ—‡ |0>×1<×™€!¢~å²¥ÊA²8ü ?Ø_ód/Kú9nNÙn¤jE©Ãó©GíþU¨Ä¢™èöÍ+t¸Õ9g-÷°yëcÐd|¦°RaXù.††[;ÿ‹ñ»ý¾l)K‰‘2UØhXµ@e1ø15:Ÿ¤1òõyÑ•¹ðXíäç©(´=ëJ)ë$¿IÅ’‰_á fžQªX¥ã ™#®ìRýä‚Îhö‘‰³%vþ¹ŠirÑtbÕ¡ê:ñ0"Fâ2µü©èë¡4Yâ Fv]—¶ùCu,麞•O'¨÷µ´‰›=ë&kújìÒ…ŒzS&GjÛÛd¹mÝ«Fh4\• µÇ{Ûh{¯ÍvX®¾í±r'wŠï¿ÔXLü¢æî2ˤ"ænû9~&djPfl!¯¹Kc:֬ȟ¨¡‘±³su“­xÌG—yô;OÙNÀå†B¡'a¨Ï–¦0ÜÌr %æìÚ(û»I|+¯æ‚¢´ÆÌQ#ÑþùL>åïÓ™5°ßX|î_Ê·åqÂ2uº–%ÇÏUâ YåÃHa|ÎPÔ› ~@œÝÊÕjÊÒ2Ũ{/Ô‹hd”EîègE ‹¬J  Q4qŒPƒ‰€d¼û¹uˆ~™KÌiBü`£‚žå‚0?‹Ò¬Þû€²øcô0>«¼ ^6Œñ+Ãâ6epZ—MU(Æ=G¡•~Z¨LúÀq± lè×[­~F¬â°æ1Ü|„Þ…©ŽÌ{Z§cÜdª jò¥3¡š7Z1£SÿÏï—MYö}@áDzÈÆ__ 9Ö±µ3¯lt®ò~£]x§'cÄV™ÚU‘1­¿¨œêTW‰þ+¿±>/@ÇýªðxV}¿† ÿmÕM0Y0‹^€÷cè⛽¥©Ž>dV±f–á=9B«mž>ž/ÃÄ‚ö}h¶戇H-ø;’”Ä`æV]HÃ¥ZçÆt‡ðq^‘qíh޵ðØ 6ÃîAúN•{Ób„Ï¥B%áL¸€h³æãàíjyûhÀê£U.ΜªÅ‹âÕh\*!sqŸ•þ(r?_–‹#Îo§ã¦Ô§#o¡ð&·’ ú€àtQX”ˆoˆí_£‹Š³*T˜•ÂêŠW¼ÄY`B"L•ÏaÃ3cŸŽDJã¾nMtÌoߌesÁ¸T¥|>8ï7*ý5²,1?*¸®a븛ˆDã’Ñ8ŸÌ,Žâo&}ûîF蓇˜­l§¹c¿wb„Úu:2£IÑ¡5߬hþ²o b .UÂ1ºtÒY ¥ËøÒöl“ùiSƒ<<¢æTŠÚЬûæÆéRaC²:6q2§!Ë”F•æ»Úy£Ò57e18-Ö\G…9‚o¯©XñPÛ–üãò05ÇXŽ‘…xô|í)šq³ûòuõë0T"”p°ÞÎ,kÛ¥'SJµ)’ûˆH/¶=®ì8\&f߇‘k`3ñ~±™eQw20r ð¥'hÑŠÚæJ/{¦·QžÜñjHâ¾ó´µìT¸áËú‡…Ôc:ø\¥há_Ó’»‡7–ÍåõÅ ïuòÑâпÙÃd{Ñ\ 4WDÜ®Kv´M.Ùœ2´6í;g5¡°gÏJsº“éæ_‘´Ñ—l}g•œ|áÉFÍÂ[C»\(>Õô1]Œ¦ôJ™Y®U6ºÒ Á|ˆM©íÝš%ùXAdÁ™‘uÂñgÛÈÔÄêØ„^q/µÃÏùËN ®ðŸ²›äU‚Ô mÅÏr¾Aãοíçg“tÂ,*‰+±˜8¢ŽQ’)ßñ}í¶'ÆŸu ¢FRCXÈLu·vmù=}%±¬DÅ–+<ü³F°4`¤ WP¦˜cü\%çÒl”ûYÎ˹¨‚Ë㊒µ!7û6hâÍ_2G˜’¨3Sáß(‚ßuNwT(×lÚr£¼™µo`1ý/£ÁòzüžÀXÂ5ZÇêQl#MR3•™NµŸZΙ—Tß™†ÜUÔ[ÇÄ,G~Ý›ÿPzñ ¢(!ÊwRˆˆ¦ƒîãZT{èï®b‘ª:TÒN-ðA¹ýü¯«–Ó͈‚Þê€XßÓÓÄ~¹LÝì2dd¦ýHA3sãÐÇ ž÷ïìè%*B9+ãmÔTöeZ… ×—iµo’€~.e9-¤€ÃØ@X¯4’Tž,üÊ.iœ©ù;”ã0U(5 †W|,1?åEXM]ù?2ѪÌ+Û¨scý¨^_0ªM×ê&V²Õ‚žÚ\sÞœº£k•6y¿Ñ±w ofX­V8ü†¾,4ÂöŽé¦ãν µÓÏ¡Öúb“·n¯Ñ糕Škd2ÁµŽ’±0b™ÇÉ}øö ýhµëXU|æfŒ/jˆà£_*6g6rÓEh0#ï Øc#æÀQªÜ%Œu©Ÿn¦>!&m„YˆeËï´82\x?îïî¨Þ§ÌÀdÍÉyøâMOk:5F)œaãçæê?¹TJ j$ưÆT’ØàIûPÇ­ð_–Ä.]ñÈûêÀï0d.æ%@:iÍÄá¦rgrÙ²‚–ƒ–ä®Û=UÕu+e\•Ò‡5I›ko»B}‘_Ü·é,·7œsWè¿­Ps]™Š¿;Å l§“ ]´}sú–lŽuíLOz@—(G¨ö´%¿>èÑ‚$a¡-¼º/¬rÒꩺ\Ê*…y“;üCÔðÊ2˜V_~>° ¿‚÷mµ}m6Tð'ím 5eB gÆžüÄfÙ&,/5áMÎ0ZÎçZt ORÙ:¡¢‹qZµ–°EÑü‡â§(j;ÄWøU’ùŸ²•µÙ3*÷Ô»TÌ6D,YT°º’Ñoǿ¡³Jðàtnx ¤žðÓv<©ÎbÄ¢6hqïІR†Ü c-ó9’Wä;j–h W&ŸM,,×6fh/]ÄÚ™F%9>‘\ Å‹fAq¥t±î/T°çò}Þ ’ªßÐRdÔ ©‰ô¨p7èɽ^r½Þ.Ú/sN·OK8xÃ0âjˆ«lý¡`|T‘¹)„oÖöx5UÞ«÷Ü™ò¦y°Î|‚ë>ŠÀ¦sýºeº‰¾þfÊ´ˆ*¼u änþ(1‰»´äž»µ!Ÿ3ûåUµpžCÙmŸ+p[pw¡]¾yJ/Ʀå\éekÞRû~áˆ"¬¨EÓ¯x6‰_¦"lgûHòþÚ´@?ô«5(ú\½½;ÑgöCešw0ŒÜÏô°e§žZn ¼¦ä^EæåZB)éqqo‰Luó!XÄVÞ4œ{áõ”*KÙ\=Ó0®ú)½ãKÖPêHe¨§µe"¤ù€øi$gÙ†WÞl¤Ì>‰Ñw§gTx %£îqÙ” ¤Ô0oI’2l<#_•s?b;tåÊ‚3–sÛo^çšõ¡_»š0{—œèVì †­:™qyl¢«=•ã!¾]˜S¸KŸ¯ê?ÿ½x'GÆ~ÐÖ"Î$ÇÅÝZ|åDä Ü$IjÞþ+*g>™ae¡–5{M ±È¿õ˜ÃŸaâÎLùž‘´IKsˆÁ3éûx„r_º³^Qo"çq¡{ OŽÖäð •Î Ñøuí4öa¸@!Ž4Ú4þuR’™½ƒtõ‘7VóÙ#%Ó¤^Fî½: ž*v†wyàÞôNÀ™‘sÛáçEJ°b~x0í§éa,f¯Ð’>Ó»’T¦sJp,¬¯QVªÌ´©ãVt°Þ7˜·‹êwÉÁA­L¯aÀM¨§tlpJºý¹Æ6_t ¦9ØI­" bƒQt¢X¯lŽUóyÇ’½ðÙÞ©Y³{ttñ¸ÈÒ8§ÁOÊE± ò:mÙ0¿jù4¬ÒÓØ›ƒæ]Q’úå|œkR뇯;¦ô‰©õ×N”Á¹Ë€ù —š=ªJxÞ–‡œÉÄ‹–76ІàÕo,f ¬é˜¿øÍ9¾ëûÚÎ qDOfþ±Û©ÑöŸzݮٺ8¡?ò=óÔ4f1ŠQJÊwnDeiZ{…v´áa]±S…ÈÚ(¢;¢kÉ“Wê"”×bV vg^«…•¹‘éhuÒá© vÉ6N¨ä¸úFËÔÒð¢]‡Êø?›Ø‰4ÐB ±­¿æ0ŒŽ*Ë¢§28%o¡¿Q\.™K¿$„åšµÆÄ¼ÿz”•Å\â¥îø$jüs¨ÌQ H€n¾9c'Èžƒ[±Þ>š¡¼ÈÞRtD*çÒo@Äpý-ZE‡C§œï| +þåûíB!T\VñP‡}²#gçW_,¢‰ð¤c¿übÅä'^ô;Õ%Þ­6æøì{Ý8²µí{n^CóLn‡ìVãNÆ‹ô%Ù²ðÄ÷ôµÊTìœn{Le…‰Ø6Ç3Óg)Hñ“LUÏ-Ñ÷h~C×yÇËžDÜ4-_…ý†'Zù—óæxn¾NÛ»œ(†ÁÈÆ:žOŸdz”GWZ²vgz•„¯ b†¿jH_u!S!lèd¸¥ä¶(”N0`1ßNo×¢‘ß”Ôëu3‘Y¶Æh¯¥z1Ë´Î쾂øÝçÜr“ðKHúÒýRÃÉÃOÕj1_rêéÎ&‰_£Àœ’èÐÛŽFñ'Ϋ·ïœÝ®NëqW™-]'ÂbúÈWÞÀj¹Sc¥Þ6mæÚOÔ âwì¯-.I¤øåwP÷¥R(î­ ~%Öá]Ä7ÈúÃT½? ßéã´˜ïæ88h~Æå@C‹Ã‚“äDkIx¦3îଫÑ,k"™yŽýíñÍ¢—-#œo/ÀŠÞ#=É$“*®jPô+LAÍ ˜Y̪´Qþ ¶÷*$üòér¬k }ã¹]¨ p<´GÕ*`+ lØpiQ¨ÚwM]Œ^¼7*Ú*+aG0}ì2%Ì¥ªÇ·eôøeÙ+à—8,Eð|þj¼éÓÙÇ@*: 5|(jIeݵžŒ49ëà‡Æ¥VNÏwî6‘Èv ÂÈÏcOábÚÔy¿ 00ÎEÇŽ…EÞ³ÆÑgàoQ’,¾“¿Pâ8B£ &§ª]÷ÏÅØBPU®A“l0¾Ì%nïÂxûê7R!§™·,«ý† ¹AÃV™`l{Ñ£é!S·\+XJ´xTËojvõîXq¤§µ,9Ô+œ9SK´kåt½žúH˜~?`,ã…¾ü.b¡NçÅ;R5¡ù1àX0ãv.¢…±õ µþë·'¡ÛÆñÁmòõHÛšr€èÒ°Wúº»7PæDÓŠPprC›jlþ)¤»¼ùÑ3"Z׸KÕzçp_³=ãqÙ¦6y¢ÎSøÇšaLzÓ]Õf‘,æþ·÷ëfªÝSÞwòÖM*dEüTÕtÊËN«oY37 N]*ú2,~®_­õåù+ª½¹-Kñ x•å «iz Lîð̰¹`c¿å¥†`ŒI¦*-à"¥¬Qâ‹°À&È(ÏÀ/ACŒ>MˆxZzµî„R݇uës8¦tíè'M“]mår;"À“&ô0Eå‰U9f1㿚¿²ýÐ×NU«¨¸ª¢Óø‰0ä–Û;„͹dº’½!ÊÔ²ÂÃE¤m/ú¼j½Ù'!‘´yO}ó}]“#vëÄ>OŽ3#‹:97Zñù›°Œ¹s¦ý,S¼»hWŒÔX¾tX,&K‡àLU3cüƠѤðà&A;%RA¯?ÇöwBä!χ j©è D4ÆwõÚnÛ)§}fz’Ž%»À-ºŠ#ÓÊ&66SµðA¼Ù£úD }!§×=¦Ž*¹ôeµ‡0…“A?- Ìrt²¥£"僮nly¸~¯};¦×òä†ézÚö›¤<)r§ìuÆ C6*§•T .šò!v‘ÁOܧ;_x2Òƒ3]Š- É£¤5È¥KUµ‰0áÈ$J*g®ÑŠ 's·i&P$² 3’kí”™8«‹cúà=õìùÌá–;6R¦gBP'êgFàжŠfuzlà¿»¸é1ưÿÆ÷8žçN¡>«“nJ~È´ÖPViIÍý„žy$®Êqýivý žIðri“8Þ÷¶/si¥^ º"ŽE ›Ês)ziMÔò³­Ø³_³Œ÷œˆ8;›W*þ!°A†¬»Q„…ݳ·pkÌg±Š';¢EòÔ'YÃ{Á ³ßö¾v×K ¥$«§$ϲà×:Ÿº?%Žœ²êæK{LPÞE±{Hö&ÚÀÐ!–öÛé?â «Í3ë1ÜCf$ŠzP%ÝB¾öö=¾wP†ù9cXåms!€£hÏbnµ`-|¿Zþ¤ˆüåàr½h0?té‡*ÆZñ1j¾:ŠI²ª`Í/óã>DogVœZˆ=d=l@Ê_üŠê̸L97Z§GþÉàñ»6š³áãtá1Ì«w?>9[èŠw/¦;5‚î§0¢Ùó«=öò”Óê_®ËÁ®‚Â0)Y~nELæ¥4çšÙ›¤%: ¸±(c~œ$&í&Ó'eÚV{ce‡¦/ùfX?çÁ wí$ušëýœqRÀçvÕ f¡©Ì{Bö¶ä[¯[ ‘â‚ûÞ/µŽ7¦Tžãz9æTÉQRiž_ºËM_åN)ˆÊG\aF$”f9ìŠOF2Ô( 3ß“Y¢®h8&ƒ²±«˜|µ`\—¤À[á„ÌEn¦öínl£˜A‡/&a׃.h_ÉŠgª<Šg¾¯x¹y†Xs;VÐËý(‰›ôµg=’´Éé ió:ª„u”at«¥ì<ú,.¿õÞõ¬h?Î:dý:»²P¯$Úª+ˆ×ÍA‰Öû¾ãƒ˜æ‰Õd”ƒÙdØ%¾ÌMÕŠþ[–Ú6&·BÕÓ3ÆÊU®!œ­” Ø=ËÓé]¿ ³ka.]­Óª¬’û¸/Ÿê‚ðê ÄÖ_Âû2{ôÖ—³ŠôÕɰpÿê0ê´£`Z¯ÿp]*Z˜R¼̾‡yG5­©#_ˆ“í^,BÓ@a÷¾›ï»U¡|¡ö¹ºÍ|6R£ÙÍývã©=”MòœÞ¸ùCÆÛ™&'ë«æ—“ mØnø| ^‚»sÓ3}Õ­²2Þ¥Mk|Òᯠp’íäeTaÉq ‘ËP§[P¢÷ÔWn>>•ÕCî?Qk>\xÓ;GÏFu»ëÍç-ožlúæ,ÙÚP/Ä]ˆ=ɉ=ž ×$ædúž65ü-<¨MÒ®Ÿs9çíÉÚ”y½½_¶IòÇ>Ï¥ÝR‚C$QŒa{E•°ñd»SChážfìöõ«-i­»ÃïõB\QPåòÊÈØ‹¡¹ó—ýu¯×³Wó›Ló=žÈ’ÉãQå’ToT£ñŠBD1ü¸”7ëÆ$Ñt,úuÄ0wxãP¿½SÅMǵ~ýZz°¡U”C¸Ôá>3dò뛯q!V›Ô“ëî$J%’ݲ²¢¨ŠìZu¯Rᤨ<µ¢Q`ÈDù]ßÄ`¯.;¢8“ã açE/|ƒû†vÝûêHfÌÂRøraOŒ\ÓœuOˆE Seßu;ÿ,GÒÙ™yŸÍ ÉGbôQb©þ„Né/¢*Ê%Ì$?nn,}–œ·<èøϼ»ª^»õÏa +ô° ±çå° LB—Æ¿”Éä»6_%e÷¬£ãY¸2eÌ»«á"'ì€0Ãóc°é6w%`F^ã¥;&YFÁhÅeE¤ì»û.¦ƒßkâškY‡prÎ+IÇߨ2y|ÄÝxdÐ9JB¤×ᯢZÂö n.â×>«m,ER@°WDDaõã‹Á—ahî«þÚñ„ÆRG¬I]W…í×6û_X…ÍËRX+àG?E?². 6b‚S›áP‰„…í8e‚ŒZµ rn’Ü{GàkLÜEW÷ÚãQ˜¨zU¬Ž„6å¹*k*TJZþûyóÌãl¸L>¾tÒ"þ&†”ŽÚ* ̲㰞Œ½¬úÃô4Q^ò¨Õe¦qÁœ[€ÚÙˆ:U>@Õɲy¥åǾ9š·— í Æß÷Õ*îXÇgõ ã&µ£Öw^Åpcnû ÏbÈ«sö•Ⱥìx,£ø—Sx*±F±ÎßÝâS¹®=§éµ@_ErÕ^›À¢ÏŽï§~õÊÕãû T½ÝZM¯à±Ñ>ƒ[jƒ!ØÃŠ"³}ŸÅp4ލÝͽ]ñÚø Tç°i¦]„–¤w=35ýT-^YNÑl7ú[ §.g«Áyôå\Œœè²òªbóÐù‹µ‰—¹d&(”äC‹wò"‹ÁZÕÜ׋  ¸Ô¤^‚ë¨w4zd…ƒÞMUˆW{°•Naèæ=A¾T˜œ’OâÛI[|q²™/³ì71d#Õ Ê'S©MñúXü °LAmýÌŒ?3wÊd[ý’Í4à£Ù¦°µè‰,O¿ÓyµŽ=GISŸ„·õÉD…ÇÃÊ“jÓHÔ} "\ÆA­õª†y/´ªõdø¦“ݱsE-T}.JÛ¯LŸš²}Ia÷é¦ ¨ $ªW8KÄšEæ‘0R8¤Àw¯¹ÈŠoâVcGV» •ŽÝÈxCÿá ýÁA%%ÌGòŠyn0ÏË—Ñ •Ûcs_ßš~{¦ ÝÉöe¥À±öíÿųթÖH9‰ð£“¥)é>:uÕië™<µ$ì O²LÝ|öªžÍÈZTOÉjÒÜ™V–c!Hµ€Ã¨•²$yfBîb½2o÷„ü†’ŠøŠzØ?sFif‚5*+5‡‚TëÒÀ&ÓÕÇý‡¦»½x€Þ8™ßxn¦êݪÞêÕôü7×!‡¢0ùtÉjÓoÚ‹mŒîh[Ï]N‰‚„•×RàþCêŠB×dqµÉ¡8¬T{I,3*°òúEypÁOÔUT*½=QAÁ«#¯»¾ºQ£^FÓu<ÙúžgMáÈP ³1U81G‰”\­€çhǰõ¨¾-˜ØÖ^8®OC;Ò€ð~¼ 'âƒ5gàôŒ§Æpdã´O³úö0u¥©Ä¨x¨Só¥QÛcï^EªœwÊáµ¶go¿J~;£¹O±¹e˜$¢•]|huøÎeî óÑÊíxÞ(µ–cÏcÅò—oóµ3øÍHŒNAEÚ%ó±al‘ÑOiâÀÀG^LUÿV­BÌO‰é=ϦõÊ}&¦ÅEºËD‚ßè|ÓŸP Ø£_ÚâSåõ­ÙK²vø¥32öD‘Þ²ªz\óc6z'BIùã$Xàm×›HàcëLÕžJ½’ )…®ÿÛ‹Å3š|¹@'6ÿ]?åÌôâsêã—{lã%Ó õP5-: ŠÆ»š€]z‡æ›°2N%™°¯t,6\Ú'ÎyѲ‡"\ ÂÝ{5£‘^éÂ!?^>ÔaMkäO3óö¢û~BogAÓ·îë£Ùƒ4Ö—¾’ÞóXÕmJƒž> ÆJ!‡6}ôØÇóŽL½ø2¢„\Lä‡ Ó¸ ¥—LÀO­ÑÊ#œã„×)OQ;f¨ö)ù‰Ò–=3"·’l!cܱ©ðâj¬ˆ!¾FUOÅxßq°pQ çfœÛ|§“]÷½“ÿ1! Í€öW¬Tx÷É dÕÇHáV, ¶sõPvŠr}sgHøzlåÏ“Hüáy/ŸOc0²ºõ6߃¦Nçãàu«Ý%¸TÕ65í ¬wËt)Iƒoß•<–ÝÞ°P=¦¦þ8*¿ÂÙŸPÀغ1#–9Ù$ÁÝâ0·*{A˜UrÇà$♽X•¡–ÒFBšM“"ó)bõ&4ž›9ðnEe ¦ÖyòÖ¾Ý4GÔø¾G|ß 0«ˆj_‹ùêúQNÆd·Øœ°Ê¨L¸ìèI¯?*¯H”mœ =ÞŸØj_i L*îß~¡²J©Üß—OÇ5S$rñ”YZcúZþ~EÏXçúç¢ÿIȧŠ!­‘ùc8SÊ;•#©p­få_>]²Õ¿âWe©u»ÊK·âG6‹â¡Æ@U…½5N§$ŠJ”8̺ÙÀ¢4?ÞŠ‘r1ƒkÒñ•ϨA¡!@swA«Ôä +¦ð·ËÕ[µÇÄ4´sw sJæzÀ¥%ÚlÊœåql™ SмB½¡_>õ^,7|¾¬3,·Ù¯™”Ÿ³Z‘@ü /„¾‰š¹~¹Ÿ õ3>áÇñ¢˜nÍ;5ÛytÕèiÐBÑØÅ7ÆaÄö%Zö6‹ßî›ÝÚAt‘cn³2ΟÔ&Ã+eL¥Ø€Rù¾Î÷šŽT¼qû¨sB"OG‡¶!èa­õ>¶Øà<— .Ɇ?Ž(˜÷mÙ’ EË{ßCb? "l ʺêÒ[ãaK|u& |rÝÜ-I½6ø²CŒlì,DÃþxɨa­°‘g{FúöG·ÎŽªiN_MÇ{o3ÓÄ¢Hˆko›éáÇÚ0SWÚ¡#=º8¦'tã ûŒwŸ‰XòAJÚˆípE¡àÖeï‡ú€ïOàU¸ôôœ¤²¡™ö+fÓÀÁðº>hš‘ÓFdqb#ïD…cËâz°!E’Fj€‰aú[ž€x†¬±ÃÇ ‘•ç×¹`G§ÅE^ùägÊJŠØêí4Í‹‹nËLæv'·—JàLñùÖkÿö¥ûä\±0|«yý¸Æ-ÇeSÂ(æ™ÝÞwDÈÄhûi‡…Ki~aoò¶Œ#îvÚ¤0žvöl7‘ÊášGô–Ki´*ª¡G|t“•ïP"3·¿†{4uôé®ãI² ó~4\‹@󵜊޴aU¾áQ£ÝšDúœ³BÑ#â NÝ(ýB×7þ2{­L4¹Å×–3NÕ^Ì6e Ÿ’Ÿv#™û]°Fš G{¦tš«(3¡å/èz÷—ÒŠ‚ãÇ@úµ8¬ù¤‘ª ¯ƒÓþ.X ïÄÖœücÝ*°ï„Oš¸<ß-£¨­j’vây™¡ð¨%çSÁ jL[XŸþ\²B`ÄÙÀûÊuœ¦ˆ öÚðPW Œ¸ES¢ÜÉ ¼üÁ7ŸÍÔ~Sת:·.Lƒå­£Œ’ =É@æ»™œ—Ž’x-G{>‚è¯Ã™Ùúj^žÊb ¤¨€ÚV“XKuÉ|²Š5úd͆L*2¬ÍÔ[º>µªðÿŒŠ÷õ endstream endobj 86 0 obj << /Length1 1472 /Length2 6988 /Length3 0 /Length 7968 /Filter /FlateDecode >> stream xÚWeT”m·¦A¤‡„‘înîîu€†˜º¤A@Té‘Néi¥;%Ƀ¾õ½ß9?Κµfž½÷µãºï}=k Ë=Cy[¸5XCñðòKµÌŒÔøüüB¼üü‚ø,,FüOŸÅŒ@Bà0ÉÿÀ("À Ô­O „º…jÃa@ 7(P@( *) &ÉÏäç—ø GH•@î[ 6/P#ñYá.^ˆ½ê¶Ó_@v €„„÷ït ¼3±Á€Ú ”Øù¶£  4„Û@À(¯•`—v@¡\$ùø<<cUE}mC®¿IÿVP€{}x%€<‚"ü@A1a ˜ˆ0Ðïß•þ>ƒ¿øÿöê Î÷Õavp Ä4nÏï/*îîûŸòáþ»ƒüv¯Á@ödðˆ_„ßæöKàÿ-†ß)ÿ—~UùÈà¿gRqƒB#Øÿ‚ü/Èõús»Ùn¨[•hÃoµûo¨)øq+À¡¶ÿSGnµ"³¿Ýwa^~á?ü¤ Äl«AÙ8ü±O]Çm(Öƒ#!¿Þ@·Yüüÿ»• Óí[y{i¿Cà[…ý»¯2ÌnûKŠ‚"¢@ò¿Ý[Kè#p«Y[°çï5òñÂà¨Ûà-C? ÿëj%Ä€| _®ß–¿Ïþ?La ŸÃ?¦€ Ïå?ÌÛ(â·ù¯‘l܈[õþÞžÛyÿ²¿*À`O° þô$ÜF*ı*¤é¬BžÖƒguHP˜°ûðù1žéŠ2ûº~¢ôÏ#¡ì¨)ù¶ñµ¨Ÿ dÛ‚7µNf”üNç}_GIRNW7aÛY/sû“=<ßFj¹ ®i¶¶Z<‚ÙÚS~¯3èõ8–ã âv=XHßT•f­+;-uøŽËV³ÃK€1…K-..D€Ò,ŸÞ\¦P)?6ޢΌ<”ÚM¸¯²ùóu×€ ÈR÷L7:dñ5íÖ¡‹æqú–LÊÆGÑ{šO‡c,+•©/âØƒŽ›BÙ­‘ƒz¯J57R§.z¼(§^k ª~xç÷$ %¡k ÐY—B¨×ÀÉT©—f (S ]­B /+éʪ‡7ϲpX.‡CtGãVÔh“LPôb×Ö×¢Æo9ÉSD[°ºn-ðDOö]õW.+Ç}ôÞ8ýT´4í”Ûå›WtÄE]È\îÐlæ¹´=4{"´÷žôÒçM³À†–¹‘J†•T:œå¢Ç»ÂRCgµÖ@÷•«š KŽòÕãA®š )¹8{ÍQ|Jôc—šƒÓ—*“oµ‡Ç¢ÚÒÐ5N#¶¾—vñ2LxÍ]•¶N,Ÿýà±áLhJð í¥z:}šé?qCàñ`¨þ$·ÿsUÁ°|°á»0u—Ÿ°QãÓøÓûiådçÆq§9½NÍ‰Ž«ø8;Q€Éèüg“º‘[„ù5r!f‹"ƾn½èë ÑQdAÝ×{‡Kù<††’‘ÈDf‚·¶›ÖVh!>VÒ‹^b®~§RTùFxB‹´ôGU¬›ó™£+û°%H¿ËŸSëÏOè éÎÝN¼*¥Ç̉´2"÷Å–DGC5ÍÿTÜVi½›nZ:›9ÕÕSñˆ_c›˜»—ljäuç¢ÃØòÎQ•wŒ-Ùf™2žHGª[Æ'šßå¾ÜI ³‘DjÁçWçIçé½ÂD£¢nu^!M—Ïÿ:fØ®ä‚ÙÆΔÖá­0â%FTι˿žËg®qTO`n+¥ù:ñh65 ,Õ@8Üc¡ÎÙ¥4Ék>™MÚ¹ë!Ï—ýŠR£?c«WfömŸ‡=/W½‘UARLÛ—{Ö&\ÑhDòEÆg ¨UkË+‚®ðaKèÈ\5³´õ0œÎZ¼ªÎk!ìYÚtÁrÂ@Þ] ž2 ÑCGôОT!Ú]e0Ze9Ö~Cʧ̫)úÃøoy£ ûU+„U.$¾—†‘vtÄOë` ìÁ…¿_VI½vø"»Ý¸™J³UiéBA³ÿ®½w¾[ª`7î ®5é½Qm¾›ÇÄ—É3â Ö§Ì*¯•±D/>>‚{¹çÅáVÁÓ˜­rc«ú{ >Á±¯2l>ð5ð‹È i¸¯ñL»\»Ø Õ#¾°Ý­°KVçR%Ò‰¯Ë¨ÑTÐ6,ŽËÛÅjžàµÚ„Mà˜À¤ åt¦É}5³n¥'É E»ÏOV˜1Èg“u¿ñç²åb œ©@Xàìb=‰­©š!›µ¶Çã+Ò¾‹§ŠÑ2T2dÌ&SM*ÉeÜʵ±£#,}äð§avç.Ýl“%i)ç¡a>óK…¡î{Ÿ™å*®öpåå¬À㌠F/Vô9uõ9±q’ˆ6¹´y1þåÕL¶ÂAüÇàD +·Æ%(Íàºl|c­—Ã38æá§ßô0o—BfÏÜÇ}ÆœßIÞ¿±CAÀ—ÑʨGÕ‹¬eÇMõÕ(År˜Øu±X¤žçª–-…Ü<Úá+~Ç<ÆŽp#ò)ßu¤ù °Ö^ÙÐ’™Ù®é.ÍŒw[’z™É•É5éfx.ñ¶s;ál–õ&Š‘oJJ¨2(œç¦yIz’åbŒ°©z?šo¾‹}%+˜f&»o¶ó¹3®!ü$³œÚ²çt§ÆÌ±rÓ̰êÎâöÙmS' ôäu÷‹Ýç/tEb(ñõ\ M´O·•kä-ðÓ~" {“±atÕ¢VöCªfÈ -lAÄAÈê@ǯÐw§¾“u±€ƒË?Ößµ­#üÇNÝmrÈÐz¢\jlR@rT)—ó{ϨZe¶£< YíâÑóÂ~vD”wµ1ÛàêmWìÌ<£@§ºßÀ}ÓèÓzDX"©^(µ;RŤOQWù`µúòíñ;”l—bkeJ8Æ!7þ7Ü]M…¯{lm¥¸¯ó·x•ìS—íMÔ›{È18j±m':Dc¢ÐÎöÎ'w4õhO=(Ìf;»ÜZˬËÕꋎ2ð¼0HLµÄkéér F+ÀýTyˆqÇû©´0¿e%ì=(Û²F-6\lbþ›` LLO—:“Ôøíœ¸h\“C›aÜF(ññ»,¡1 oâ)_µ>QˆÖ#å8FGŒËÉÉKd“v^ù%Û$LLJ*Ö†,Ëöû ì­ýɲ٪€ —µD‰©T’¦*#~+R(±vÏžµ–½!¼¨W¢êøIzw÷ù&ÝŠji¼;3g{uÕÖš«e£¶1À®~Až;ÅíDÓ×Ns >_8%^Œ´[*@*'Ëx¤#ã2}Å…ßEX v­±kG’t¬) Ž›…>)|çç$¦òm;<#tX¯ª¨÷F4=«FI°Ë³¬™™6¯žÔ¹Úkýâ«J‡ÄUß`ù„jK óçnM×ЙöôB¦ž]ÈÜœ&—xfÙ<óó‚:y_ýBû»& ê´ªRªÐí¾µ&,[æEqú¬cžuôCã6ÄõÁ™ßmÔê³}ü¼›Ìr…öÐò‡`Œ>!àØ§!/;¾"KúÚ»ö0ç Ü"f–½”V69 Å„^Ï—™žR™µgù8Û¼Æ Àù# »£0+Ÿ(ªIŸ™Zƒ)8ä=.OâZÔæH\$¯â'%!\î¦ò6» Wû ­¬8Œƒ‚Ü3³‡—W—íãž+©ÂÆžµ0» =ºJsÕFÉôcÆGY*ôG ÚÅ{»*ªEÛ9ÀFîôŒäbœÝ&4öâo²9ô{Œ Ÿ=ø²4ÊêጩÅ,[ì_ñ¨•C¨p¦D¼]ØN–ýN?‡Ïܰ–Gý*G¿º÷(¡¡©8¬µbÔaS_Ǥë*¿ø>Pf4>*qµ@§¸ƒžÐÔy)Y¨}Sáxß8ЉnšF£ôiýî~*T!9Z´®ãÜÅ„y$O“my®8ƒO²¤GG`N›·ÛN&vüyÿ‰GÑ^NÇ%Û“ŒßþÃ\.;5ÃMû¶jþ=ê:ÍVÌõ&•Íf9oÀ:hËØÓÇów´hZF-'ŠÅEvtu£÷ãs(Ú…N¥ ÕPÛÖзàžma:3êò6Æå¸’Jœr)ñÂÞ0y ?CÕï™8S‚iˆªè‚ª>—N`¡à •H¤¿ÁÙ8œ®|ÉÆzÁÇú‚Åj5æv•Òéùöç¶­½MWźÒj;…yÝ·´^ÖGbiÑ _…)nLtNÅ£Ñ3wL.|EM% Õ¯¿SÃ`ãÑNÍÝ]m­øœSÿV‚áÛw±¤žínxüý”O±éÐO}>úŠ˜¹.ýÌ–F³r“¼Y8è ¾¶²ÏÄ£™¬º<´£Ý °âµ—æM]LjxÇ¥£0X0b`Ìxm½ö¯ž;±¢›d..ÁØ£iõª£õÁÓ¸¨ž]Û.ã±Öf•£žsdzVe¢4Qº—ùxf‰/õ<|JrWÒâ]ÊÝo †æ334Šêǃ_š9ìãU¨Âû€Huò–‹¡3„ K–¸FwÅŠÛ¤R€¥˜wzþÁ×q ®i™K÷«½#úçò”½»ž@WU›+wêŸh<~É}˜Sbp1žh÷‡Frg˜ü˜t±ØX]<æùäŽâѬYæn˜Å”z¦–Ñ(8|ccÏŽt¦'my@TªÎ¡Y œ]ûÀø½#ÝN÷¹k(W{N|&Ut p{§N_~À_!y[áXȲQIùêõ¦i&µâ±Mhž². !6¼œd0|¿À%7¶›’ô¬=ØÛ‚Êj›uVlÄ# “ÁV~kc¸úXÔá•4 ²i ýS­Ï›ý©)PüœmàÈ‹jih!oY¹4¥] E‹ƒ—­ eÄéq0Ï {¼o®;íàŸ›¤—‚›rÒZEk.4QÞP­Ø½ò{«¯Z¤°Q#'øâô…;šm•v òTõõíÿÈì×kXlDä ó« £³¾\~+?,)L#V6>™ëJÕ&¾‘¬ÓN¶ó;ܶâwg×¹/y=kƒ ËkJ±x‹×®àëŽÕ öÎõ8ŒA˜á¨·i±K' âûÊaÍK&l.†Ž ÞNv¢T!WD¶¥2Y€:Ì=ߺíÕiùgòãL9/}xïQ±×QèUªÉ±:tî©ñÚˆ‡%1œàxL{R ÷޵n¾­Ì‘òXM½âô$Î~q_¥í¤ /'|¸ª‘@c¼?¦)¿šü¹‰²hÁÇkŸOüÙ¥žÉ’ÔN}pl ÌÙ‰;<¯•×O+q\œá‹)uIÑo(äv¯µ7Ûr}÷d©ÞuмÜi—íC÷»3è‡sá.BæµYÚš+ŠŒpbÏ =‘bÇDI~x9i׃ ¢¯UßÝ?šŸ‰µÏaÌ#0ˆ+Ë&/:—|™×ÖdZïlXWÈ/|äñs4KNÜsý11çL²V¼~•6»¤Ê€MñÔ1Óhtž"h†¨õ Ærã…9J`ørXz¿¿;böý¥êª{ª ÒšL.‹[‡×Ñyñ¥R™HUV ÕÆË„ éz ¢‡;ý}æÌh¥ä¾ä#hNÁ§¬\CõÝEÛʇîI¤‚Ûb¤áÝL%3Ó‚ƒjŸmª$óö 7Ñ i‹àH†žÄéWÝÏVÀ£fÛk¾›u=âÏa!ïËÖà[߸Ë蹞<Óå¹AÚÁŽz*ýá¾²FZ´‡Ù‘Eä˜Þf;(æñPè¸`®ÝæB RK±Þ¸­tq͹äÀt²V*j4‹üÙ<oÄÇ.Žb¤æm6®:p©Çn(¯µŠh7ºo¼jX%ZJÊì¨É«MÅÐM: 9PLkLd‰i d7äNõâ4÷Ѱ£¥Ý3ƒF•sHú yµ¼0[KT´úÞ1ŽoPÕ¾RÍcÄ8{Ç7…Ϩ& »‚°°¼yÍ#ÅÐía¨eQWœÑ`‚7;ëú%˜düiZ§òÒDªÀrcüå4FÜÐe!tyè™ §|´jÓ4¯³<®ße­“Q|lÞîék¢k=ÆîFSøÑÏ3ð´Áe`OÊ)ý‰i%oÌá’q_x5ä*Öµ9"еDâ|Þ Ø6n¸ø²Ršÿq–°¢žto)J6^ƒ¿’ ³ÈÑè™ÇÙ"Ñô§¨&Ý}D>ÅGYö‘s2£7Q½aG¾ÆBÞ†lm–gáá JN€£Àæv<ئS!'bFW º1°š¹­áÓ¥&ß"A–¼ÔѺYþ-¿òÁ«”È]ü÷ŒaUX f ’Ôg¦´øgåËzõõ•”;-¹yÃ9Ǩ]Ldp65ÈËïöû¿õf2ÎǬ¥ëÃ|¼8_WåB¸ðð3¶áâlÂUäFÓ²ÛQd±L.Þ6Qzg‹“´.±áç'©~sÄÎ >d±èöZÌ=/¯”Œ'Ç+²štYó+ÕV_Õ"ËaUˆh¢§ôb»’ÇlMjîZ£­y—$¬‘ÏyÓˆû„| wLõ{äUÔ˜aÌ5¤·¯„±t¡Ll>‚Läâ,r¸ªKÈÔoÔ Tž‡(.&Ñ ß3ÌséöÉjž§ÓÓ”1bµ!ù¶y®€?¢ØÜm”ˆC2Žq‡Jq0µq×ï©—8íÊÍsº,Zôuå#a/\Í÷¼EĪV×äøXŽæº2ÇPÄZè7ÍÌG4ïM£rú’ãïz]¥hßx ÕFξc§h9„»•Ï–îGËm´mÞ(ïWM^ΰ7Ý5sª*=zð©J™ñ]ä®VîË],xâo®·s“…‰"¶ôØ© s›…™òø³y>‰ÛœK“~ õSÜ ”Ç•ü2Ö@·;M®XV—•i•_ D±UTB·áâúÒ—˜åÃsý%{ÛúÐќælâ;{°À-?‡¦'*¤žfg7ôOÙÏcT¸,u>V蜜Õc&nRJ>÷¢0P|2F8\!·¨:ÿ†OÙ°/Ô-<ʼn«@¸í4ç@Ÿ^@L__¦”£ÂS+¤KBB3ÇÌp•fµb'C#Ö˜ÎmŽzmžçz–°¢ÞV¼Z´¸ùâòZü›ÎŒälMìP<ªX~ákG–9²[„¬ËLqþÀ¸î„ ¦‚ª§%7ˆÆämÓ—¶L,ò+×v.üÄ«¤†ŽîÊwÁ?X*sX–”á%4xÅl OúÝŰÁ÷1‚jM½zörÉ?ûOÞ{Ôš‹uò³ùAQá±h–Ÿ„ìiëߣ·žûš¨Oû§ûlÙëT–Ôº·“õ¤f¾ŠÍûðe]ÚƒÖüåò£Óçgµ…Ð÷neÒ&4¯3i(²Ð÷nåý»Ìh®Ë#–”%ºî7çÏ~ÂË®»¶&´§è681=3{¿M1äõà0¾@E½‡V {C¥øÉPçœó‘#²ùj¬e]ï˜ä)Ö,ûCîš¶'#kwF‚±ÎE¾ô·ù„4ôªð¼¹#+PÒNÖ«p~Ú‰l•½ÅzÂÐÙ¸•žZ–Ju(˜½·Ôøž“ ‡ËÕóþŒé ×,,[dêõQÏ$K:§J»f–1ã.pÞ£§Uļ¾ÇÕ²I±M¦wZ£ÈÁ†–„0wŒÌètC)…xœƒb’ˆ}3ìEû"šp—šq6È3´kÙªÅ7Ûï-¢‡±Ÿ~‘°X/1±TÑó{,×dÞ³h~£hÈoá(½[›Ü¤ÚþéL%¶ìxŒ¬qŒ¯Õ?뉖?K“£|^‰†ãW[÷%³:Ξ‰6™‹üaaì#/KÂO1Ùó=w®kñ—å8ÉlSæÑ ª×Ÿ˜B*ÈD­GÈM'³óùdië%ŸM ¸7˜E ©YgsTf§:[Øx³¿-d²Wj¢tz‰þha#ðN™ø¤îô;I`¦O}D{- _ìÍ]f ×ÍÙª]…€&jo£cZ#EÖMüõÇxRnmhû¹ðk¬†½æ÷ö °$å.?ç)jRJäÛTÏíù_úx'‚È+AìAêõ žw'RâLRnHûں ¯ Ä2Êså­èØEGí=Îaç:z1Ô盀0>†+ú9¡Àkœ©Âƒ&ö ¶ÖÄ÷|ÎÅ…L9¯®Fª©4•G-<nS!Ÿh†(\uÎv•ø·>Û`2=ÞÿTE&è NÅðXÑiÒ´0BʾõäXŠÃ›?öìeÔ˜ðá\MMîßXzªeÔo½:e…>I¤#<©âaÜÅÃLXšmUðM<ωZ5 T3 ¯Û3þQ!,w>¼õì0eÈnÍ™çÂ7¯w9“1½Ftì8†êÂßE¸õ£E–oõé²²Žpv†Û àùo'‡çHùš}%,¤¤Ò¯ßë¿÷šaÁ `iufhš~Äö\Oè»0;š¾¥8‡ˆªb£¢-ÕÿãÈøÒµ©KéÎ5v§‘ËQÎÒ¸¶/kÙ4@»_aù³e„´P°êŽÿNH]Ö‹îU E¼§SöoÛ²Â')˜-’_séPôš#w+\$^øÄõm,݌甸. [Ž—G PßÀ;ùÈpLxY¢5ü±d'X<žÖ«Ëç´‡m„a¾$âÎÐÄþo|gëí3¡T:£:d'{™T7³|vY9U¬`Kçú³ÂäU\ç;Ýåî&%ÉPG“‰À§lÂЗØiø9[Ñþv¬³j:}åĪ~ „)*Æwnd;Wlë^°öC#ߺŒé µÊövוЮ†Z´Qò¬õ1?¼á| 5Ã/½z¹Cm•¯oÊÙ׳nà?¶ n9ÃËT=%þ˜yvO»,òpS÷Ç*¹oz3Nöª_úÞ WbÆoˆd«W ˜Ù°>à#™ 9n¤ÑÚ±‚"Tñ"±%€¦W ¤™°p„þL‹Ù\¡‚î|Ƚ,µþ'*$æúd_½[Ï¥ (M¤E¼©è¿{Õ«Ä2ûÄògö11Ÿ•AÍ…j±mB±™sJîwü]VSÔ÷œhY_1V®–'}CSðªå¼HXãKnx±ÊDºJî’Š?kä²wNº¡‘<Ã6Fäê•MpN‚ø g}ý endstream endobj 88 0 obj << /Length1 1509 /Length2 7177 /Length3 0 /Length 8187 /Filter /FlateDecode >> stream xÚwT“Û?RRJŠ4Cémtw§4H0jcÝ„Ò!)--HŠ€’¢´")!!Ò]ïôWÏïùÿÏyß³s¶ûêëó½>×÷Üccy¨Ï+g·*ÃÝм`>8@AKK €@| ?› íýKOÄfE¢`p7ñÿðP@B!hŒN‚Æ8jÁÝê.°,,ü Ø_Žp¤8@â ³hñÔánP›Ⴤ98¢1uþzpØrÀbb"<¿Ãr®P$ÌâЂ ¡®˜Š¶€>ÜEûü+‡¤#½¼¼ø ®(>8ÒAš“àC;ô ((Òjø  q…þ ˆ `àCýaЇۣ½ H(£pÙBÝP˜7;(€©ÐWÓè  n8kþáÀøóp`>ðßéþŒþ•æö;bk wE@Ü|`n{˜  £¬É‡öFó nv¿!.(8&â ¹@l0¿[‡”åt Â?ñ¡l‘0Ň‚¹üÂü•sÌJnv pWW¨Eô«?Ej‹9wàŸÃuvƒ{¹ùý%ÙÃÜììÁ°ó@ Ý`îP5Å?}0*¢tP4@$*" *€º Þ¶ŽÀ_ |ÐßFð/5C€ŽØc`@`öPÌ‘ â  ‘пÿ4ü["ƒv0[4Àês#ú';F µÿCÆÌ ó˜0ô@¿>?Y`fwsñùÇý÷ˆzÆj J†ÜBþÛ(/÷øñ ðxù…@0HP ‚yøwž¿Oà/ô¿µ!°?»ûŒjnöpÀ¯¿P`Žï/$žRƒãϽáü»„6Ch(€ãþ›ƒ„@¶˜/ðÿy ~‡üÿÈÿ+ËÿÊÿÿîHÙÃÅå·ã‡ÿÇq…¹øüé!´³ZpÌŠ¸ý·«1ôÖ‚ÚÁ<\ÿÛª††`–DÎÍCt^° Hð= ¥ ó†Ú=„¡mÿ Ó_ÓÀÔp¹AÂQ°_& ú/f÷l1— 3³?LfÑ¿ÇûK†bVíß}(¹ÙÂí~í$¿0‚DB|ˆ0”ÀHB?0fyí Þ¿9ò¹ÁјsÀŽ$ú5ha1Pé—ê·$Uþ‘„@Í¿%QŒdô·$„‰Ã\®¿5` €nÿ8ˆ€ÌØáv¿UÿjÚ։ĠúÍ6 ¢¿äß· ê µ%ú2 ·•wª o;©•£÷â]–ÄÛÎ81áç.²$@÷(Z-&éçdOk”+é+[:uhË»ŸäÎMíû-×3¿ò<âeV^s`¶I˜¼>º1žìwÌpo’´ë¹qš<“x)²ë!c,Y'¡ŒC>©ÿƒº®ÏÉ^ìTeÊ"êmÚíµeÙšÔ bF?¾é¡[lú V„hä}s}¶gþ8]ûÙ= ÉöS¢$¯²…¾þònÆ·±!êž¡+;¬‘hr%‰~EÁ›5F3·/òJ=7ŸQøÙ¨PÊnÚõTÌs¦Ôiï9.ïmZ°p¤tŠ8Z§ØÇøž2’#f¨ä3ù…«1v_s£˜qšú¤“QF]™0ÕwsUßÕ£"4|¦Ç»F.<4ÒÕÌ>ö†sðh%I]U.ÿh`{ïi‰Ýú 6|Y‰›:›s#À>¬ —Õ%gæˆ#bܘßL4ñÍ@ºdF,¼5Ø„\@à–',£Úð6°á{ßÍbÓ#?_Á«‚ýövyöi÷šX·xŠ8ß…úÿgEÏ϶ÁÀ÷¯l3_Æ)øz¹.ù×x/Zhö¹Â‹ª|Û\…¶¦ÈŸÄÁÅ̹/6:bÂãiøZß«úºÔ}ÈT‰`‡U¦_qvBý¡Þ†%@äYw¶é{¹‰ý  M„xå‹WþðŽ„Ñh‡ƒp_A1¶ôžë]éÖt`uAW9ÐÐ¥ž@ãd U¿_;wuë2…ùbÌcå£VʲŽ,©c/åWŽ'·B©tûÃÖ“žÆµÉ-´äÅr޽¤ß"i+“ !à{ñ={ó@Àžn?[ê6³Y»óµÍ5ÜêÎŽ<ƒQÑüYoèàÍÆ=ã{Ì[´ØË9Yï {ëðGÊ(DÎð”"¶m;þ½¯8í×UcªÒ‡Š‡;_s{LSo·m½z vzTæPv¿lÓÞ’­^ñ·nwŒ/µ â|ëe¶mkÆrJÙ©3Áñ9q ¢Ìp¤ÕoŠ(`Ç  @\ñŽnØOZ ç“VD=ô.‚¾Fëûknzû ŒVñPÙšz.l_ÿ´ÄTc_“Ø瓾Ì,ùHý'ó(OŸ:çóXÆÙ$=Ûñl!€FZÉã/mPâQÌœ÷Ÿ·¹G¦ÉÇnþ0n¨ã@À³ϳ+ã´{KØO©ÖŸ™1[(½uz¦×ä>'^^¦Þ<Ë ›u]ö5™IBÔäe娲Ï„Ø5²4KØ “~çY:ó¤ºo«ñ”kfR‚Û÷ã›&q5¾·œw‹tÇæ½z¤!î½6Â+àxµ³–a 2ö觉ãD©è û–FÉ'‹'c¬ÎÍ.GslV®¬d™bK¼Ýaù+w!šƒAt3§‚ý>…PÒQ¹å?~2‘«<ígcðf¨Í?òÛV~•ßcÍÑMöèÎN¢“±¥’…³ãŸ óÒ2!”Ó˯ ò?÷Ãêy=['ŠbÊ‚¶l÷·®12¼¥¡ö9ßj¾ž…^6)k½'¼çŽ_°? è¤XIá¬ÅÕ×3Iõ¹K!™zÅcÙ¶ÖJÆÖIòÔ0§5bÁOz<˜_YóBÁ>¿f« xŽøz×#µ t EÌMK/Å’Y¨îÝínœ ÌÎtÄrA¶£A†A`¨ ‘ïi‘c„žŸ3õ’àŒÜ«Ò°]_µ"":¾xa‘*âb l~?xæSüå>‚Ÿ5Óp˜R\œ#¤ËÿH@œ&§‰¾_ÒTeÄ|rmk¤F[‹#Ìa…Ôºwòa6[®½Éoa ƒ, î_Km3~@f¾öôùZãhÉõVUãËKóƒÏ¦½(è´6 x¸ºc<…øÊ‹ÅJîÖæÝ†´½"¿ 5]€#ü‚?@# ôÓʨ–zøuÜͯCÀRáÎÀÁÇ =gù¤èÞ+—ŸÒ^Is&’ßTMãk{q½=)ÞP/+ó²fÝ˲¡báhðuVÔÕ³AKÔ÷Ý^w*jîÎq&^Ö¦=¬Ã<Í<˜¯Ÿ¹v’ãʲvÒ-YGÈQò]b0¤V÷–!s¸Âf탬ÄI—–t]ÙŒ#–¨à"â4á´Df˜&‰³•ÑÖjuPq“|Ô^‡ÀxîöRY^™Ç)hö81Þ˜TÍ^#tHò~´ì´aâ3aÈKÞyMS£Gå6?Mr͆@CNÔÒJãÎuÁu,&=š í'Ïû Ók²–ZQ.gª ýn£W>YÝPÃÞÞë T„îLv œnweZsÖBÕi™Nñ¹™ûé!ùfÔ¾3Cö/ƒ)Ò§ìÕ¸fÍìi¥°µ(¨Æ8ÙÚv_T“%»—W7êpàu˜ó>b‰£eÊÝTï"Råd@ê%40ê ÐØh¥‡…œ)~ÐKézè\‰P ]Dß§Oâ)0´¢Ö|(“ØÐ7pW[¡zU_ëh¶=qkZ:õ6yïÇãè’•]®)§ûÆ]9Š¢k±¬{cþ{¹,MÊ1óC1ÍWtëÓšÉVADvºiêj¬­i]¦ýŸi¨]õÜ×( ÕÍh’í'ÉpÄxÒ*„ë¿ÝµŸŽzˆ_o¾`ÐçÁ“?• # ÞŸ”ï™÷qá]Ò¼Ñòý:ŸgÛ0âç5ÂNÚ WÙQ.êó*±„¯J-ØÅÆ:¼Ói“oãHkU׫4·!ªøL÷Ì}‹.ß‘Gǘ•œŒðürÀ÷ÁCa/S4/G…|Œ5ü}ƒG÷—Òwü§Ñ7‹œäíÖ#Œ¤ª}¿LwLª¶­šÕµ7\MX_zæ_!Üa†$ZFÆåYG|ß)MyÑk™ëµUuü¾9»‰áÅXQD’úÂhpƒK÷¬õk›g«1Xy­Xj›Ô#ŒVœ92÷Ç­ dJ·õÑ·Š m…~|PX” …÷‘õyk*~èˈi ºìÑ.aü¤GÐŒÝʶïõ^åWäH r˯›žÌþ ›‰/ÿ8ò"u«ëK[|Ø·3>äA-Ó¾’Ù ^œÊ˦‡·×ÂÊB|ߤ­ùO±Eƒ ‡¤V•ekZSø¶ù-õÅâyŒªÒ•еé‡C³õã5ÇŸû¦ž‡¸g¯óî6h-Ê û¢¬Q6 ¹q_.»PͲTVɨ6 vzî’rtG8©N’Ò»Št—Ÿ±sŽæ*Ö67Ž L¢EÏšX9æöú- (kÜŸ½?Ü^ÚWÀ»WqíÙÛ|ètEŽ/“‘w63(Ç8Ö´*ÄW†o·è£—P寎xS'ãÒñªÎ–Šbù ëaññ ” ðë/üä3Ø—h#™š-†z!Î 8 ˜7’†ÇôB:"ÃýÛLŽç½éáX÷Ùpõó|ó¤KÍ•7´ûÌ– K1óå]±•Úy|Ž7+gC‘­´´O¹ìt;“–ädv«ŽîŽœNGu$ê½ýK6Ž™sİâWÕ{üìx¼ˆbíÀÚÇ6K,RJûºë)雊’õNµÝMgó_ÔVNùQTŒóçr¯"U’?hë÷ÅØöò_´N!)ø"g—D&žX*Èç/Æ®ÕRIÍ"F¬Óö¨²]Ü«8ø-f;2µ¡ô9k) zÆ2¥£pÚñ.±e|ÆÞmª;äÖõ¯™¥4f¯e”NW5è³²Øë¹÷"ÍYù Yͦâ€Þ“v¬Ío¦†Ï+ÝÃ𸰭ó‘€ÇrÄUɆ¢½}=ð.Š„áô–Rñ‘‹s©¬›.÷þ„^bœ[nÒc~Ÿ‘5Ôá_˜^¯i¬Ö02»_!J·—›ŠPo÷ÈÉ¡V²¥ NÎëªì’R;\\ªÞg½ó>Å„SÏ{{.i=§Û›Ph„oÚ±ì>A«¢*íFÞP?¶mCàÛjõb’¥Èæíbqw\êÞ~GÙWWÊ’¦×yŸ".»ü÷*šæ ÇÉ) €ÈŽËæšm¹n›¶¾ÂWçË.•l.¾ g@Ô÷dŇ Ú‚æ³{«2J÷wõÜFSïm,:ߟÍ;H’ÕÏ?óW'æ¼>P5ǥǧ àIõ4”Q”ä LÛ¶(ʺ,ú™úz'©òÛܺʧ>ò·ÉxXMÏ X×Ô´Ž}b±ž‰R µýk›:îçIY Óõâaã%¢oQ‹:0Á Öð%mNS³óZn-åÑDs3IHÝÊÂUùä+J&¢D°GÖ±>v>\þ »DÐP’ Ñ Ž~—v—êþ@Ôÿ<ãÀ¦æS&1 Z3Jtä%(} ÚÿãØF»ç¼û§2åT4ašNv¡”w]qk^ìô­Ï%V«=R×Éd—Üé5£:b+‘rC4Ï͉},Iy¤¼­âÞVâ½~Ú9ÿ\X‡ ÊI~zIT&B&üûŠ"Þëx¬D³'>Š)_:nº—XÝO²‰…\§ù{q’«Y/VuÁ H/ê /ŸzŽâž@¿œ,ûªì›-êoc¡@|üìÎ48ðè)z„ŽØ›8uÿ{ˆšK¤q[õ£Õ‰®ä Ø¥Üfp£þ«ó„Pº ê,MõÉË0;gc„ÈŠ»Þ¨dÓ¢7±Ôo¶g4î…ÊGª€ZÓ–Ÿ¾¶™ã5y9aØ»®F“ó•šÏÒ–Œb_ܸBK_’v°ƒ• ”,v۞ϗê³1°k5ûÄš*¥Úœ.5—ÄsÊyÝÑ($:~`¨JÌ&,T^ft1FFIâ ^h XÑYDg>Èð¬a<—Ñõ!rZˆø”[´˜ô–8ß·ÖV“ 7üà•.yÞOßÀ~rrììkzÍ3ºH‘ñâ*îGƒyòq/çc:6¤š ¸Ø‡B D*Dƒ¢îgŒ.ôv¸¤¾e¾ÓÈ\×ó¦ÙQý¼©äm>C‡SüµÍ µ”?:ŽžÇv4DÑriÚ®}õ%iÔê…UÙM9~ÎÌÅüT™6l/·¬ëký)y/\(¬¿x¦¢Þ®‡L)(ù|€½‹*ô3~oiÑIf Ÿ èÕ,ïÄÒ´¾µ V¨ˆ;ÔàYu©¤M11®kš­EëXG2Œîòéx³z'y'ß}rbÒL›_9è ª¡BeõTÏ2 ?ð-1Û„‰÷á·qïá¦kÔ·u\Làz}r2¨lw FNoìi&³‹›Æt·e&–Ê‹4í¤ãGakÜ̺%{.0aþS_[\ôy!õÜõ’yC™9Îåq=¶‘óix\SpÆštŒð­¥î¾@Î B$¢Š}&^B€÷ý3Ë8 ´¬@š9õŠvâæ…d¦¾Ã·¹ ­Cø}GĈÁ:[÷ÞÊ ^½|éb®á3ÂѲýüBÑŽmkÛ­þj|Bo­uO†rZï¾H×Õík\縸y,˜,D“ZoY6J¥5_f$Rá²–ù §¬Uvk¡+øjbÈaéÉ¢Ó~zÛ ç «]¨LjWYÔ’¸¥Ñ½Ia¦IäÓìNøJ¾³‘µKömô€ð:‹ñæÑpÂ™ÒÆ^µ–mážs5ƒ·¬QñWÃ>Y_¢~&ßPMCÀZV¯ls-h\Ø¿Î?WîšoyG¦S´Îz¿?†€EQ¼ +–+‚û&„f)KË;ù²¿ïž•fú™ Ã;; ®3ñ¨IÐ6¿…ˆ7ÇVAqõCÑ6.>\O!Æ\Ô äá“z MÝHÐ6×I£ÆVêw“¬4”w^>ötíJ¶š–7íyo°ËÙvïˆy ­÷VÏ.xšbqæ´Cä<Á•OÈéFþ„9šä»¢¶rk{è¨Ú7¿Úñ$ìˉY{I{Tçõêø…;_uìÀ cÇì§â¨»ÝÃÅ›}.)FÞ‡9å$Glš6¾tø6ú¾c¯$áâ úoÜÃï¼üòiMœÇÞQ ƒTe±€5LÖEyÞÔöóÛd›æ5‹[ÊåÍàÎk¡àƒË2|б¸:դѲ„» š5úÞÓUãàYõ'úôfê[%–ÌþÃú‘u…1ŽäøŸ§Í„viúbÎöa}æX÷-ªzÆw¶·ÄZƒÀ°¯è‹¢çœ)±µãŒAßäÞÙ¡àf±¼VeêÎOßÅs’«½YCpÞåÿ}·ï(צ/»oÏܨF¬¥Ac²m?£áÅM¶c¹Gh·tÎ`)é ôú–÷Y2j¦ÄKçpÛÚ„ç(´>‹Â¶_ö€8x„¾k ¢¸_Ë3Ïõ}º»íÌVºê¦dόӄæûÖ]UÓèH“D‘‘º‘Ð.ê½8…{\Õà‹˜qCñU÷£Œv½ueÐù¾[à‚X#µ}ud«±¥ujËÚ‹¾îÅš!Žy%Å”UWð>§²=Éë><é0UýóOÌ3ujÄ"[oÁo$ôtÜÂ/ZÜIqøøèBLã% 4Í/W^WÁ²a*ºt2á0¿p¥ßL‡,P» "€óª¸DN}¸%κ^¢:º3jð¨ãnÏálôòË@§ùpÆxÆŠ´4ÎËë$‰‰÷.פèVm,¨ö)õ3Ž#Ež£×o Ü¿¼.š±d¾»KäÎ1Mt?&‘˱³|2 eÜÜj5WóhwÖ); )/Y”xd=[mwÈà¬3&Ç÷Çf§á>SOú éùÉlc jkúEVñŒDÜ N «³2Ð’» ilŪö$‹©fØ{ÅþΕFßN7ÜFBÒ}ÃÞÓôm"4q †*rKR„ñŒ$:“fΤ”y×Û—ýÂêaW)&”ÁѪíÕéÙ %û²÷ÚÉÒH/ýE°üçć埞ëÔSª°…—s×Ì޵¯$õ¿Éw©dÍ®3¸ÝtÞÕãR⽬§bÝLkLr]1hâH U:Ðof£Ù:¿ž*zòuõýmµ£ô¬fÖØƒñÍî•ûcC»AÚj N¹½¢yV\S29ÞÖræi1Í‹^=„•KößÇ”ÉZ(§xÞŽËy­iBÒýãñøP΢Ÿr~/¯.dPx¶ 8PȃGK:‹º$Ú:‘ç/h¦ÅDgµ“ö>Gv§lškÜhŽ+¾?å½²ÆÌÛ„Ò»«>Yð9ùdEVh^¦·×ôƒv3ý‚ɱ̢:E»öôzsm‚eIjë)4 `9­kðo¼H¯þÌŒ ±;ñi‚^|7ð½$DëW\ìò ÕKiÅ®–YX‹a/˜ßj D‘õ4‰'çJþ‚Neúç=mX&7ª õ_§\ùônåF„3!_Ôƒ]…eä~¯­Ÿ“µay‡.§LÞt§ðÇç-¹ÌIËŠÖ”àz[_•ƒ%èêó£:¬ÍÏ„R¼Ãõ¶òqë<¤ŸxU•H%f±™ϨMêzÙœr®´þ{.£œ‘.A‚fáÜxrd² =„> stream xÚxuT”kß.)ˆ"]ò 3t7(Ý¥ ÃCÌCƒ„t Jˆ Ý)!!% ‚H+Š„”¤#Í7êÞïþö{ÎZç¬Ykæùõ}Ý¿ëzþÐm=C~E[” \ …DóCÀR€²¶¶º8 €ÁB$ í ÿËM2»{ PH©ÿ• ì‡¢±>(›§BžÎD€ˆIAÄ¥À`@ –ü;å.¨@½¶€¶ BÂ=H@Ê(W_w„½;æïG€ Æ @$%Åù~—Š.pw Š´¡h¸ v" ê ¢`8Ú÷_-¸dÐhW)AAooo¨‹‡ÊÝ^Ž›ðF ¸ÜÝ n ü è@]à €#„Ç¿!Êí u‡X‡3Gz`+<‘¶pw;0T×t]áÈ?ÉZø€¿î€@þÓî¯ê_ÈßÅP åâ Eú"ö€Âèªi  }Ð|iû+êìÂÖC½ g¨ 6á÷É¡€š¢>Åü žÌáŠöð@8ÿ‚(ø« ö–U‘¶Ê(8íAòë|*w8 {í¾‚6ë„Dy#ýÿ2ìH[»_ l=]‘7O¸ºÊ_)XÉ?>{8Kˆ Kp7îsüÕÞÈ×þ;ùåÆ"ôwE¹vXð@„ûCâïõ‚hwOx ÿÿüÛ"@[ ØÀíH’ºcÝp»?6vùîà>Ë=þõùÏÓ,½lQHgßÒïWPûŽ¦ŠªïÄÿ‰))¡|~À/$  q Ž}üw—ÿàÿûo¯ñ×ÙÀÿ4TGÚ¡øìåýÃë/Zpý%nàß#tPX.î¨oð_ÿoü.ù¿ñþW—ÿõÿû@jžÎοÃ\¿ãÿGê‚pöý+KeO4VÚ(¬8ÿj ÿ#em¸-ÂÓå¿£êh(VŠH{,Åù!"`‘?~„‡Ân«‡@Ãþéï]`g8#p=”â×[ÿW «:˜ö­âÝØŸÔ+Aôïåþ²áX‘ýûªHÊö—…DŨ»;Ô—K¬% øC°²µ…ûüæ; (€D¡±%s `‡r'ùµfq1@Pë—‹ä_mažîîØ¹¿Ù€ù·ý[ñp¸F2;…‚I‡9Ö†µU+2zó¯ŒÊ ñæ[£{U'¬¾$fgÍi–ªÍö@Ô,;t”ÜŽžš>ð_®c©÷Áð³¨}³g±IšºÄàN¦øÿdb"oÂÉ5MUº%UäÞ‹£Ç{ãÍUy[û^Cygm÷LŠ7U±š¸Fx«Nû›êâ,-&I“­%t³M¿ÑŠè!gÎ’K⣯qÑi:ÏX5eÚI’½«n|îì_ èaîŒ Ñð ]Ùe@S¨J÷3©ˆU™,ä‘åym>»éos‡Ré.÷ý î”⤕Ì^ÓM‚ ÈªA—ÕøUÏ—Ò]ÁŽ›¥gYŠÃê™ÅÈ]³¬õ‡ß®|¯«9YÐ8d¹¤Ã¹ÒšX)¼«ðüÖVþþÝV0S•sO`¼Ä$kx‚„H>»:Íâg,”p»|z°Šde¸™¹·`‹Bla‡cÛì¶í“û¥c»íS>VOĤÙoÞ»0²¥•¯ä¡‹V:sz_Ü’ W‚…óG)æikÏ´äK\±Š§j””Ô#Ì6hd¹æ¼g÷²†ÿÐöA(ÙÕòóÅ Uã^Æó«qÚ‡vY²7yNRU?&}ýк…Ë鱇Â7.âgIæw_}+iˆj÷_/‘{ã19SœŸ#Y÷éçXš>çPW¾eܵ±’†hΊ›+ønϨ¯NjýPz ¯&ŠBì™:Sï´Ió½Í×’éѳh&eÉcnUEŒ?K""zK¾uš‰³èäKq¾ï¡Ü¢–YìŠN–Mí S³Ù#ûR.’Cœ©Óç¯~ŠLîÓ ~7°¸.BkW©¾Ë[C@ºpA”bõ 8PåMaA¶å¥ýUš<üÜ—y¤Ÿ`yW¯ÿбkÓÉÛoåÊ}9$I¼ŠÆmcêÇêqvï@²ª_<‰ã§>Ñ+j¼‹Õ1/¦£3A«!<ÿS&á¹à’í¡ÑœÝÖÉ(‰ÈÒGÛ—Ü2{_nÆ” ï«H‰,™œVw{³Ï»eëåxÀ»Ö׳#‹r@ªÅeöLºßý„Ü?2ëO-¿Wê†Ø§OÈ>O¾¤Wøjq3ÁÞ¸eR9À¹#I·*ôlwñ¶âû9L=\=GÜ×[Ôiˆ×ØZg‘á´d/Iæ–›ÿÌòÛãàý¢„mÁÔ(¦›ÔIaTO5OÏ7%z|7fXçÞç^\åÍì{:'UÑ”wŸJçŒ"+`ÀEZfQ[pnÊúxk‡åE’!eê5\?°ÀzY^KÎ혞;¡ßºV2éÝð,÷6¼9:VºŽhFMJìn­6Q¼Ë{f—’ú^x¶nkâÊ÷KDú³ž›>`ͳIÄdÁtÎbÔÏAüߟ3-âœÊ‘Õ5gr a^µ¶dÝI9Å×*:¯7xs»ƒ\K Lõ Ü*Oùy¿;ì@uŽMÔÕ9‚¬u¹3’Íô¬›&róüpº·2Ï„‡’!Ë’ÿÞ]‡IÇçQÚݶcÕÞv¨GË ÷ê¬|2^éæ5¼?ºƒ2IùBLKøY?§’é‹h 4üLÛ·ëÏå8& i`÷£ãŒšÍ3âûÓæ®¯O Ó£¦žDõhÁ_ùlv|X˹ ˽aÊÂØ&¤Óum¡É…æð_zd.ä¾1ìªfø¦Ê®è:ÞϼI.²¢ªbQ‘pi¡–@ö=&Zº. |ej7jË÷Ö8Mê}¬øB Ó\-zç .ãNÂßíÚ‰õpj" ¯Zoúen¯¨2ê³uˆT|Ye Sq ‡|fÆÏlÛt¿ ›/–E’ÖTd ß P”h·´â?­bOÐ0Ì(IÒqÈûrVEúÖv¶ï^¦ßL™/Z2‘…e׉®íú˜¤šèhˆQqåÍçÐO‘AâE-Ÿ'k\ÉVr¿”E¢/¯ñN&%D—=ì8 ûj)Búš6}”5Œ-y»¡íGÁ‘›z»2;O™ø¹ûËP3C#]¸I¾BS ö™ Xf“yCЄ¯p!*cw4˜…õtSuŸ+ £¨³ßn˜Ú¸]òŠ’ù|Äó5¦™õS¤ZÔÀ³yÕ­tÛV›º»MSs?÷v½ÁÔ±EÞ ~Œä&M¦4sx nŸ> ¹wsh”ȱJæ‹þ„ š/}ZšiW)TOv°ðÎð¤ˆ"øE´°ú½ cJüGò[wli½ðç¸Þ0ÙLºGמÔ[ÆSÆH5ÁCµ·¸£Ø.>'VÜìZžÜßà-sñX•*] Ã?36¦Åoë ghNŽ ˜W´lAÒ„ãŠ"ëõx„Ý….š¿M"ñ¯ËŒiæO„÷nqhâ )‡¬Ï«Kæ–[iC™»e·{\Xtf +ˆ¤šL eº'¥bÈ¥P'É+1SÚé/NœJ?„ÛÄЯscß[nl›÷Ãíx²WBzÎ?nVˆ>šR»ÞŽ3G"u(ï¾ËÛ@^~½k,§?Ö·´æ%ÕVo½Å_²3ù˜ð3¿]äíÀ¾`Ô‘TÍ]÷n—ÈžŸ`h–nh¶†'ÚåK W²1YÒ•ö1óžÇÆ–r$¼o 4n©Ù¦ÐÚëbʘ‡×¤dû¿Ù«jÇ.ãÔx^ê'»š„иrˆß—t›§ÐG©??k0I%HÔzíI<:¹pX*ξŸÔØÍ .©%º—?!70ñ:{lyx@°[y3ÐSÂÿÄuÆçÎöù~y|6Q<'ÑZ¬}‡ß smqJäÑîß‹ÆÑ:¶¦ÂgÍŠ¯”Õ*2RÍ]ž‡[^ÛRˆ ,œñ˜jIÚ‘c´»ý€ifZƒâÅÄ{åwΫ=éZÖ?èÓ$Lø*'¶VšzÌÒ|%í®^∮ Q7b¤P ÖØn‡‹ç௅³›¼sÑÖ^íY ÙNõrfÃpŠíe^‹­“8J‰%½»Ø®:#žùòA5b:ŠBnN<ç34¼¼%èKo÷`—dCî×ÍrÅ:y?䤶 ‡bõ!g]v ¾õðAçúþ$×ê2¤ljžåa׺ߤ£¢÷‘g%T‚ ­3Xí–»C8NVšÏ~÷ÓÓGT u³ÞéRçm(<®èˆmx͸ìKÁìÙVë-&Jí~Äc©¦¨!pôNyPÄ|qÒþ䫊0;ž=_x·º3³A:%A[Fs\ÅÄô8ÂU{ƒr¢<£Æé›ÒCŽ‚GTQ•çÏŸX4ê™Zr¶ˆ’½Ý¸ôÍ)çøe'Âev¸š?R¿!dòpÊËÿ†Ú#ª—¼v4#Oå6ž¶¤Úð¤áFÅýÜî¥äç˜& 9ŽÏ¬ÑJ¡{Wé aϦcéo ‰ª„¬¸¨§¶:L®kA´¹ÞîÎsëaˆAü‚ÎèM¦ô XÛ)mPÊ£ëVojp÷âöÓ";Z3¿ŠPn¨q?CNœà¶ô†´­ë‰;Õ^æQ('IŽÁaLU¥¨ÐŒYŸ„ûÙHÐú±5*-^*þËH3§°ëçûl¯Xó{˜~­l½N`1Ëùöb}h»íö’Zý‡ñ » ¥¦)»Ùðž…".nœºª VýøÏ ›qº^7ÞdK½F1ÅwËž,¥=Ÿ Âô¤îp:>š»Ë£eµ6˜›´Êi@“ ô¶ÜÁ9dÊ*$Þô×^”`Qá©5à;Zñ—]TRL}š ²ËÓóëÕvZY$p»2©Ím‚–Ú-×h6~’ÖZ8k&æÄãU„¢ÅÙ,oæ•ÞôÑyªh¢¢çˆŽÔoP¬N¤0š•˜„îF=%&-U¢Sj_±‚U$ÜÈòÒ¹ùÖYíS¦1 gÓ²oÀê *ÎK å¬0ãs¹ê…u×W’Òè§ ÖÿyÒv1ÜÈü÷åé[ŸŸÜÃ{cá_Û²©Âïª; “0Þþ10ã&Óe¿>‡ñõüåþ~š+‚×›?Hûæ?}yÞ3gðSÓJ÷=9\‹ÓÚ9¶¯Ô™Ë~]@{Š$¤£&(lӤðm´—NYuHQF‘ݱ¬á&\2¤¸)Ñß:x­¤^Ñ»fC†¡ÒbŠ6–~Õâ%Gò\ª¡W æĨ™¦¿³Ä ¬¾ ª!:g‘ŒgoûO}—XelîëÀÍ5¸&½w_:µ8½¹zül’bÍ—OõóÞñç&§½ïú5‚¢ÉF~ö,ëò/ð"8œ¯ o!Љì3µ£áWéri&ù¢W÷je>ŸÜ[f÷eîË™+áåæJ&ôqkþXYï9_ŸnCWD¿@g¦$¶²ÞD‡ j‡¤TLÝò~=÷ã˜>À,ÎkKÀdÊò0ï‡ —ØX_”ü,ÌjÔ1ï„äÁ|›ÉYþ¼P®3«>ËÒ8)kÿùÂK¥ãS¢i"ŽÜÜ++ ‡˜É‹«³’w{ÜŒ…öù×q i°ÂàVÛ]•W×òé•WÞ‰zi®ªž L>Ý>iZ;n®¯‘v{Jž|‹œxt¦ 7õK9HÛv|XÓµcloîÖ¶²½–˜`ØÉ”Z¿¸k:B%c÷a ¡Û:¼-W`¦™ µ#ÄÚ+'YÅÍ,õq·BúkЕ À:ɉDU”T­º—‰NÉÑ9“"@%dúD¦Ô³¾]sŽq‡~‹Uö WB‚W@˜öüu‹å …À¦È»Ÿ´ÖYô«O”ý’ŽG/]aˆ™<*ŸîÂ÷g 4nyxZœXù Â6±Ó7úŠC–Á%éê˜QíÏy>µݸqÙ‘®â²g7•³i,ó–IOW?«-Ù×î5ù›;7À§¼½]{#üìŽnZ½|™."ÜÀ¢ÖYÛ-Ì5IÀ;HaTg-“Ïy) ÝUXˆ¨·};¨Ê˜¯­ÏcÀÃ>= +?뜛%¥èRœ¹ÎŸÔ“¼} 7>ÌJˆfí”™ÎyªÑìûtí­€¥v:ɱõ|Õá¤Bâ'^„M~ƒÛëX;'_´Vå–‡Y y.8Ü*ÿ.õ^?o­$ºëÅä} j­ØO'·Üœ½ r".¥iö=ùù@#ïriœYõQÜ!|õ˜7·ËË ¾¿ÄÉš¿Jqýü¡æ}©—Ï™©®O}oTùYZÒ”ê%â•=ã:œ‰Ú3ûyƒ´¬¾Føë ¿B”Õ¹°º:]‡àôÓîÊ”ß&>vêµ{hß `FzÇÎMªÊË5Hø'fò| ïŽ1#­Í.¤J{²Ê å[ÔèÚ/‰Ò=1¨/?ˆo,h-R¼“Úg"£Û—"kXç¯_qÄ5þšûÊÜeÍ“­9FËz¡Q·H±Tî.EÂ<¢èt©3(B»ýªDg„f—®Å ¦ëvÇ*ÁXÄÁ­>·‘¬\þ"®€Ä…K¶ø¾ˆˆ[cÛ½[žƒ+`=+ÁdzE›òs¬ž)ÍÛá¯Úò¥âêªÑ3«91©Ñ¬6b\: —¶& ãH´Œê%ŸÀÊZPlñI2ÊÎï|÷½)æôX0¶ÊÔ¿ä\üârþ*'+ö°Ã±X:ßòY!c4•Xï§}9G»CŠ¢ FßµÖ¶{‹æÈê)'ý‰=ÈXzñŠq¸:WKÊRh_ ÖwÀ½¡ô­Quþ:¡Üzø®§=å«o4‰)JœK´'6·Ã¸eRÃ"o+ôóH'ù³|i$äü¢'2DUþa~îož®YÑ…qqô;à{@e¾Ø+.|齃—xme"žRN3çÙ`;Üû©·ëZaÃ7Å*.Äg¨¾ý‚J"4j—-ÓbÿNåð D”$reA–Ÿl­2´›[höNáz©¢òèåÏ«y?†(X£ÇRbäÓgܬÙã…5ÒÒÔ+Ê”á‹R½0ÇàúÕŸÿïgêÏ L‚+S 9L¡7¯K`®•JaéZ ¯Ì/¿²¦ä3Q¯àË'2ŠÃÆÃÓªg.tµt);£²?xã»d?c$WvxÄ~t¿"õ¦YŠ¿ dM½+¯YéuÔ ù_äM·L8~ÊʸX§Ždù+oúãØ÷–êÑ5#¦¤oåj³ZÉà ÜÕ1VKŸI‰Ü‹êé‰zºÖÉÐâtn¾ùUh«Â­ÝŒjš¤v'Óûp|ÄÒtÓ»çl·T_å]f÷C‰‡\OX/îMœgS‹v>ÓdÅU1º8 A¤¥{2¸ßŽpVãsÜ•© 2£Ó·óQþÚúÔLêÚAè½sðÓ×nCM³ã[ÈÜ)$ŒíMÐ}ÛŽ˱-7v"zò–&úû½ ééâOˆOphš@æyßfƒ¿lú^?Ð=ë 6¡Äݵ™(ƒlÏâ? |yI¸t-BC3Y–d¤HYñ² utðøú­¤Ÿ¼V*‘¾\Äõ{¢Þj¯/u@¿Kô2õ²:eØ+kM&’¼Ÿ9e-Ky‘xkÌ™Š-k#H’&E)XÛ±Í,äMІðDÅ\u?f©Jßdm´éQ|¿áåÈ\Î;&âZªÅipÇ%•oC7=‹H¯ éê‡Bésa†é¶lÅõǨû¶Y;w7“BºJm†ïðlÓP5ø‚I7;¿§on_¹(QyÀ‡­lýú9ÍRUj[ÛÅÌPœ©ǘ£’‰r%¸(K¬Áaù¨ËîQRôqƒ‚Ko'ü~u7Y4$HÀ¬Ê~%Ja÷ÅÚ·b'ý»:”&­[ú'qP£A Üí¦ @Wf× ¾¯7yy™ hë†Ë†Ž' ’Sí©ÄçÓ4¢Nvä¦hŸÉ1âEÜ#=‚ª$¥ïÌÔ4L&(øÍdºM ½›9®‰Kí˜L“ô7ùéÔ)dͬsíC›ö2‡ú`²S]ÇØõ8¯5ZeÛ±2“ŒNüØUn¾2^A O©•=«¿£)芿Úö9uNãÒͰ¨aR%zЭ6>^çOs€p¼NM)Ãu7'ãg)G%´‹0ŸŒŸSNÝq/èÈ&ˆÅ©lŸhi¶üÿ=½†¬FOƒ“i“Ç¥w`ÙáG’ôéÉa F~Eèç#Ú7•Ÿ ¨Oí¤p˜•A EH{ù­-´+WÆj S N·ÜþFç#Õ•;ú¨úŒ<¢û“ö\ÃÍàD[/ÎÒúÌ&ºÎVž.9j„³šM2K€6#•o=t4¼Ê&þÀk®”UÐ<^‡»Ùç§€ªYN¢—Õòñ¨Ù›O®Oì$@«?øƒejŠP´ù׿ۋ‡¡çßxæU•˜û»ôɲ½¾¤ìǨ)9&4—Ýë´ò|?ÇqOðäI‰F endstream endobj 92 0 obj << /Length1 1368 /Length2 5885 /Length3 0 /Length 6810 /Filter /FlateDecode >> stream xÚwuTTm×>]*% Í¡A‰¤é‡ f`héA )¤QIii %%¤¤A•úFŸzŸ÷÷[ëûÖ¬uæì½¯½÷}Ý{_^N#SaÆ®‰A{ ƒE@r€š¾¾Ž*€@â" /¯Ò ÿ;@ÁkÇz"1h¹ÿ€¨aá/œOâ…CêcÐÀ-oÀRr`i9dÿb°r€:Ä ôE€[4Ü“‚W ãîE:9{áýõ @°¬¬´Ðït@Å ŽEB!h@âå wÃu„BP€)Š„{ùÿ«„€¼³——»œ¨¨¯¯¯ÄÍSƒuR|‘^΀ ÜŽõÀ_¤ˆü/n"¼€™3Òóˆ)áå Áœ…„ÂÑž¸o4 ŽpíS=ÀÐŽþ¬÷@øóv°øïrfÿ*„DÿN†@¡7wÚ‰vH0ÔÔñòó hØ/ å‰ÁåC| HÄø}v ©b @pÿ$è Å"ݽ%ˆ¶Ø`êId?Ua•TXþ$â,}¥÷›eK^…4Ñéå’Vu0‡V ÿ ø„ LÇÌø\}å6‡ßd‘”äÜóãP™¾Ù˜ñï]Ê&)št¶WDøðžÈJ­y¡\Ý©S¥Õú¶Y)¶žŒ6\þy[Y•äžm\»i[–T‡çÀ{Ñôœp!C%y=ï|ÎñÖú0ài“Ê^=Õ죽Rìø:ô…¶CCÁí…Å®˜…Äwžì*A6DzŹ£s×”g¤'õð™Y ‚–úyÝàÒ¥årO'³Î:d¿t¼$÷‹3«Iˆ¥:£Ö”ÿv7“#:Û>J§=€­*“œ^Xv¥ÿKI+YÑýD/ËÃi·‘ü‘ÇŠarŠû·(®é5÷)¹1ëϋ݊à#ziî'ó®hwóŽÀpÎ6á5üiF]õU7ûL«§¼"a†/s?héOiÔnL×â3¦HQmŸí;@g龺ï8M¯CÒ)ušÍ¶Œ¾“—Ÿ./ãëö6‰Ó›‹ g€®í?¶¦ä}ña6£×x,7ÐÃHÚÒIÚºž¼¹jš’8î’@<¯'uCÖ^æÌ&`'ZhªR–ú >ng}&Âg[D³ Zs0'³÷$ÿö¤ÏуÕ3õPó~ý܈¾ŒÕ‚†êéaLûçmÿ†e:Õ½(¹é•=j´S‡TûCbò‰N'eÏÏRõR1YsŒwÄ×ýÏcd‰zûG6±·Bäæ‹ýɯ·ê‰d±Üh­Í$îù>¸èZþF4¡<¦ŒÉÚÞ*7³Á^»ú½™^ŠHmÂZoGo?°´õ³¹¡÷”ÁUìU‡Æ UBW¾¤¬¨N²®5S­ÖŒ|XÚɯ[z*!Ÿýªž5_¨­a¦ÿ€½6<·vÀ´’Æ™„e• ÁŠçŸÑAدƒVæ,T=8çØ»Ô|„”j8?$j¾§ÿÙ²Ÿ·&ë›Æœôò¿Q£zöhßÖ[I‚hf<­‹|#‘ÕÙóµÛK»ÏÂ9E/Ç'ü#âgs[¥ÕàOò’` Æó®ë‡CÜQ]™_nЋnÔ&rßìó&ß Ù=¼TK1‰Ut4çq[a"òÈ„geŠgÔ ³ £ &f|l™P¾°)x/erâ-ô ÏŒ²öX!<úíAYÑ,¸ãGqkÛ Å¨T7TÞɤ Æ§ýávCœv©X|vÌ£™kíkAÄæÐéN<‚:ÃS ²Pb¸_Ü4E»à¼ÝØ›yÍ6Ÿ5o±DÊ9HÜ¿Ém$Ú=ñ‘¹É»™´»˜6eæ<¶”,=õ6Û}Îå­„ŒÜ`ç{¨MZÍû:êÁC€^Ø~!~ñ‰ˆòWüüQÉô‰Î‚[øÞ:ßP¥{­¢ÿÁ@_£ÚÏæpþº†1‹?,M3BšX’éÔÓtÅ®˜«,“¢MiÍd¦VÏrbÏˉ‰(2>ö+a:Œ†gЛåÃ~<í#]†ŽZM*϶ƒÙ΢÷ÀIu‡œx=þr.>Ç>÷¶©ç“5wÁ¤cHt{z ß™ê@fKvà­Ø½ é–]}“·‘“!ç7Ñv?I}­HI4™(¾ÍܽÍTó-±6·v§îûÁ‡ÄG˜ÏxºÆ­Êò>S¥ìß§õñü´>>˜ñZÓ¤5¨6¼*¾ƒèMî–ð»qÚÓH÷õ½7ˆôͦYÌÆj(s áØ5–!X~$\?…œ{7ûµXõ뺪à½`O Ü-«»èm»é…`î¹›ø÷kçí;æÜoƒNÙ *)¥zV[çXæÂ¡k"äç9ö,ÏÉŠ$©Û±:•W©.k±“‡¥<ÙÑuHÔ‰T¬çž ´¦ñˆé¯§”ÌõÜr&æÍêfÝÈÈ Ž¢¦ˆ™b%Îa{ zv®Þä;3 ì²^Pg^^”~£iz®ŽB™3­+|š¦ï’Ôidk2ûfohßy—zKv p_lÓv}w›ûì‡ghn>º*0_† lNða^2àø¨ÜŠñGʶS[ô?xr(2|%ë•öµxO+˜‘ÝòÔæ$b5^i¦Áßf”ÉwÚE®ø”{’§k8„‚â¢e˜ëëG+Æ/k#«à°}lík^° @4fÉ-Vôí·IÚêã•M`†ÓÙ¥™!,8ÿKK_%¤.pöQÙóv‡o.ÈÖ%¸G§óVÃצao‚VárðÔ¹÷êžý#ô[{**./8+žßä~騌4£ËÍÊ“71™âž¸†xbi¨›û^¢Ý’Ž^f¿þË£°—C.õо¯oš \爑¥‰è˜ª ¿½`àÊÐΕ+—@¤S8Ÿéät‚ªýÆu? ¾/ò”½Û þ¸uËæê³K¯ù•ûUN&’›/~íÐ,x]þ ÿÌqŠO4³—+3çÜ¿ë¨vFˆAÁãð*‹jýr¦–¬â9,j3w vdE«ùVÝñ¿ž"ô@” Uy\©Ê›z³úUƒ#!¥}¸ù0“„jo@“qq³ü½ ­UwܫơìÓwì+ÚûhCѨң ®ŽžÐ\¼¨Ò‰û|÷ì'UQºf²¼DLï??£ æ»Jß^{Ú%dMÔ2%¾ ý€núÜõ*Nen ÝyNÜFb©v3ʺ®TÁ§°¯LWÃ9ˆ#†œÿ{!,Ò6)ÿž4º³†;ýl7Ÿ7 a¸_µ=ЕCeªæ¡ÔqªÒYrîè8p2ØHSH7—ðg³”mb±ÿ¤Sm³ñXðÝéÙñï~YÏÄTçöàV`â¡«yœ¯‡ûôó½> qѼxן _šÌg–¶žxÔûú¨±¿Æ`Òž¤¬âöúˆxߘn¯p‹üOÁµ¢Óù¹/ïJ÷»IЇ€Ç’ëO‰Ÿ3Lv,³u&-]8 Ζ¹é¿î éHº¸g•M9v¼A¹{å‚&IĨ幷OÇ(j³O`š9{·š&ꙟ{¹+km¯KŒç+û}ÑþOãF9w»ˆÑ•Ôºg‘r´Q‘w'"8eÚõ·ý—û/9VuJБ^†qÛ¸<þiܧ+{¡¾ÜZ4žæùW!‡p˜O2Ÿ.ñhõ˜GŽd¡Ý0}ùd£ƒO߸Y5Ñú¨éCºzz•ó”…Pð˜FîHúÞæHæM¦gÙ¤p³£!ïEó¤8ÏŠ%:–M.õ¼Îpw™¦ä»û‘6…ò÷­ã#–H3µ•deiÄnë 7í±ƒ‹ýBÎG¦VµëNñò‰w'/›pK+~H±aâ‚r$wœ6Ìk%G¾Â›”ŒñWºã+VÍæ÷VÛÛÄís¯[Eñû½áDJåWÌx>{ÖU:ýÙzéçÓQt¤·ÔŒ`JcágÛKõ—E=iV*…XÉÂ,&»ÆVÕ¾2%ãqáÖwÃV.JÓÇÕ}e9D!;Ì&zm®k±ý&{E}\S™7tãeõ # ¥ç›$ÞÂË‹Ø5íˆ¾ŽŠ *îwÒwVÞî"e¥vÌ&ïZ›‚nIÇ3ÿÈxG[Yÿ¥2¢é±›.ˆ¬cûxÒʽÀ'ßÉöHÏÈ׆o¸»Ä­V¬×eqÜ€’×½¢Œ­L*é<ÁÖ²Û®7"9Öf Ç(†²á,Yýr¶sïÃx ü%ƒ¨§€§§,à!á2ýSì4l¯ì•ñÒãtM6FëÁ(â-ùBŽ3’îÆy{-¡‹„,Ôþs¶ŸýÐ"µ´{ÙRçòR±.¬V‹ÍDkZ]%›9Wð#%'zíÁ]âö¡.I+®ò?Û²@jngÓÛl¤xXP-, Ñ{o˪í]ÿTø–ësŸ^VÁ]¦¦—’öàÅ‚ó¼W¬5Ÿ«\DS Ê?-¥)ŠDÁ/…[ÀžIk”É'Â&,Ç»:´?ž Æ Wß—$¦Ók$” wuœ6h– K(ǃŸW› úŸ±Ý{Ú1Ìk¢es{ƒÖËÁúy=]Érd°þh•ü¢|~Rqr­j‰•~êàhj(¥éuB˜íAžrEwþVãž™ôÍÞô$Mc­×žúšƒ·æ—Re+)™Å¦1J CfÊèUàËåÂÿ¶z…ëLü9ÀÍ´/ z{ùô(‰Òo}Єà“õO±A˜odÕb•ÅŒåiI6¦Üèwô؉YAÑÎáž=M½‰ôÅ"gÀ[ã!Q›n5ˆo4=á; ® ›¡ûC<þN{eØÜ&:ªÎâõÚÂñŠ”( ”§ž›È…5ʧØêh7¿l wø‰´·>òòeŸÙr–Ý÷ îwâ`T<‡übò/aíßîh'%¾óc«»óº§þ~±Ê…å¹Û×Tw‚Xw„èuúÕªMxdÒ$ŸþÆÂ0Í3ï%Û0 ­ñ«K|ß„sŽ]å™—Ÿ× &ðCçP¬ ÄWÓö¾8…¤deÌh}%Ê'è99¼µ_1ð†¨šå*‹öJ¸­ç„8)Ká’½ý@D@Y÷ûIZoEîÕ¸q󉨜´qÀTT(ÖÍo&0»aZ²V²áФVó~c#x랬¥î½³˜"š÷Åð{t´Êð5|¢âù:˜߈¦¤+.õ']Ç64È·æBÙÓ–¦{Ã’$H äÓºðÔ<É/CŒ•âoUmØôJwr}„e˜¤e<Ìš8¬¾$ öB=Á¤~X Ã#ÙXï"²¤EݯA9 <æ´,ü^Ö¹ß<ã.m»u`#/ÿZñJ§ÏH ¥‡Í§'uwz÷hô™$J®v2–ˆoÁ,«(ÆOfZÈüCx~tD_»[•Âp‘º’¹zƒ,ƒá&»šù±´™²ãzèfã‹‚)‘½kᬯ›Uß”Vä¤ÙóQ‘šÜe§ˆë7¿»Q~c¶ ôÃqOÄ»MŽ•yþ)Àô…DÖåqì áüP'¡mM -Mirpgü†5 Á'ÚǸ( IÍŠm*lZ&©Q fKÛ=fünGÇÐxC±v÷ÃÉ9_ endstream endobj 94 0 obj << /Length1 2315 /Length2 19681 /Length3 0 /Length 21036 /Filter /FlateDecode >> stream xÚŒöPœ]ÓŠww‚kpwwwÜÜ-$¸»w î4¸kp‚·CÞO’￷ꜚª™gµî^ݽŸ¡$URe6s0J8؃X™y¢ò*,Ìff6FffVxJJ5+-ðßbxJ  ³‹•ƒ=Ï_¢Î@cЛLÌôf'ï`qµ°°X8yX>ð03X™™¹ÿcèàÌ3v³2È3dì.𔢎žÎV– ·4ÿyИÒX¸¹?Ðÿã¶:[™ÛäA–@»·Œ¦Æ¶US+ ÈóBÐðY‚@Žé¿—™ƒ½­çóúˤ­¡ª)¦N÷¯Šÿ«qðx3°3X9˜,¿‡ìÃÛƒïÿ†ù/ÿ)þ©’±Õ¿÷WDi{s÷¿jx#ï?u¸ý{,hþ½2´€ÿÍ àð6Ë@ÍŸÑ×cæ`6}ûbùÿ¼ÿ¸üÿ›ûßQþßFÿÿHÂÕÖö5Í?úÿµ±•­ç¿ ÞFÙô¶òoËaÿM5ÿZey ™•«ÝÿÕJƒŒßÖCØÞÂö¿4Z¹HXyÍ”¬@¦–ÿš¡ÿtá-¼­•=PÉÁÅê÷e`xkØÿѽ-œ©ÍÛ…âòÖ«TÀ·}úß”âö¦f¿•ƒ`ììlì ÿÖú7ÄðfyÛP3 Ç?£ `b´w½¹ÞÊó˜;8Ãÿî('€Iø·è_ˆÀ$ò}0‰þA\&±?ˆÀ$þ_ôÀ$ñ±˜$ÿ V“ÔÄ`’þƒÞòÉýAoþ · ŠÿE\oQTþ ·(ª;€Iíz«HýzË ñ½U¤ù_Äý†Œÿ ·ì&Ð[vÓÿ"Ž7©ƒí[“þ#agÿ-±³ûãÿ»{LfÁ7€øúœ\ßæûÁ[Iæà›ù_ý7´úƒÿß0ÿ‹ã·ÖÁÕù¯àoÁ·p–ÿF‘¥§£%Ðþ/‹7Ù_ñ™ßx³þ ¾Qeó|ããïJÞȲû«’7"þŠü»2‡?¹ßlßÞ‘©ßÎîøGýæëøöž²·šƒþHYþ-ý×mò_ñÛ!ßî‡?´³¿ÕíhëêòWü7‰Ó!Û[z'W‡·ÿŸH,¿ùþ‹>–76þŽñ–èñÛ-Ʋtþ)âm;™@î9¼ñåú|ãËí/øv÷¿Zûæíñ| ïù|ãÇëø?‹oêêüÆ蟫ùíVøþçõ zMá—æLyC¬ëBÚïj„ Ü~LðÏPþÐL¥eð^rîp}@†I¢­Î Úp¾NéE]ݧ¹Z&yö>þÚÖš Üöèód§2ý£ ~q {p²ðX¸~€ŽAMhÏçÙÉG#Ðâ+X— e®“+²R>Æ{¿¤Gý@ÙÊØÇùÊ{Õœ²Oeߢգô¿ÌRæ™dÍá’Aƒˆ`ߣŸ{ Ì^ßÌ çL¾’ÈÄÑÁûžD³yël²~¾ŸóZ«Pcu鯣ÀÓÁ%‚¸F›¦ò9H–ÁYð.)Z\ôøÊWD’ƒDŸ²Ê€ÊxÀšQm¥ißÜWë6¶Ôɲ››¡&ÄØM¨-mÆ4t&SĪn3ŒÄÕ²Ù‰:ÍEÖÚo4zÌ­S—¹¿×¿f‘´-Zz¼œÖFFn?¦´Þ4îôøj~$´pgy/n©±ºÂ“A”UïÖJc¢Ò/»%q=A‡òy]ˆ<à³l23ëpAõþäÈõ¹øì[Ùx®Ð¹9‹¶`뎮üÌ©ðjÒ•r~^ˆgÉ&n”ù‘&/C¼çSÞz µ2o°q6¸Œé|³›Q¬Ô“D.~›cñbˆ¢ˆ]Z²ïÇBÕH„^§õ=wãOJõ¶XŽeÒÝ“H†ñƒÆÀa‘àÐ~í›òr¬CûóJ÷p‘‘Ï[jBò>uªät»(¦I G‚ßîÌõÁ™Ÿª‰¸‘Ú5Ç hªñ?ìŒw?¹Ó—I‹QR-ÉÈò…ù,é/ŠõáÕaºn`­ëP¼£y‡˜‰ºö™2so‚ܰc¤Yãâ_„@Uí.ŸÜkó]ßÂ÷ñÒoÓ;Þ¶•z_Øû[¼Qi¶qT¤ ;éWü4Q/æ-ëêî ˄µ³ƒÀ“á1Hr˜6fL‰)@a)uæº\æë|B¶õ¶W–ÐIL •‹^Ý:æ5_h9¿^·6ņ˜`¸úÜÔÞgRÎwÉby¾ž²QyÛØXS“!8‚g$xõ!ùÁp,J7©óŠËC‰eŽèŠ4y'õn‰—3ík‹¯³¬+Ë!Ûcººè;(«tì)PeÝôŒï'.ñü‹Ÿ)1¥Þ†ÓY€^kë»"»©n†á­tk~ÍY}õÖàži$>óQù¥¼Ì½|Ž6sÅXŒ›7çnâ¼Þ]Ü9Çi$Œ ÿ"1Kí»¶,ãª,îÑm=Žä¨¬·q¸¨Žˆdv<1‘ç r„,õÇ>VEæ”*Ni% ÛÇÇŠ†œMÝnÜãYàøHäÝ>,žìØ+¥E¢IµWØ­Ì^½«ƒŸ|k?®×ºk|ZnØ,çûô¶÷ÅH½HåÓ¯Ü]%‚ý²‰Ø¦´¸ß&o·ôÎ-r@•T‚¥;Ÿ'û=ÚC«»w$ìµSäš)艶dN,+ÞÌO i²zp9‘Ê™}¯Ú!p8öÛeÑ`ŠáªýõpJÊߣçàuOqz?u;@Ù_Ù5=‚å¾µ¾ÅªïPÖ·¨2|”¶ü†âz'b÷S‡§‘v1Ù ¶tØ“ó6¨{y@$T‚+gÏ¡zéNUÊpòz¯•ÁV*³ahhð.æµ‡Ï #¡W)2*foZÑ·sq•ÏŸô} µÈá×ãß"“Ø|•¸SË3yLëÔülKckQÕ“µlò½2z´å l.yî›ÞÖó½1»2 N͘ œ{ÛI£¨åËX ÞÅÀæ4ßÅìs†=²W\,LeÁ~!Ï<¡\¶žþg´ó2g„ˆ¢ü²`7±ÎHyÉÜÒrV/T ‹[ö¶œž`a2p1Š—|²p?Ž•Æ ? ㎺}Lð_ÿn›Oµßx§ýc¡ziâæòÔ`ªî|æ@YÀ V:“œÕÒwW8“lü^Qx®¡~/a©¢¹60xOÆKÝ\¯Ûk a×ʲ,DGáIF]öÕEV÷D:S¨´ð§×’Pl¬n a€,”Øo·œ—^¡»ºö¶$¼Á‡xÕøêA:aŽáê×dÉÆÛ­óÃbaDÛfŒéŸ,F«\®ŒW®t?w–È®xÏéý½F¦)áÚª7r= †™S]‚Ðæ‡ñÐ5Y$<&Τl,^ìâ¢=4<¯—Ѧ³ÈôɽüpS¾8º]ö e}ŒK»Y(atáþDeߢ-Z)ÊòÐ*3"¿-áz7e£6)[–;Ã[Ð}4›`(ñ@°¥pQ Æ»¹UdöRÑûx _‰ú´ñ¾=‚o°8/ig#£ Â¥»˜›¯Q2ITÜ(Tã0ßr³c¤ŸK9aB¢ÈA©£{-ØŸ¢,¶ƒlš­ýV‰{ûD'Ú…; ŒÚh§’éÄyYóžG!±èdØeæz(±™DÚ<1Ó€Hs-”Š•Ý½ÔÖ ab–Uó £Î}-tðD‘Ûäµà™bqÆè¸fß{ tý5¦b#ϲ(åZ¸ð‘D=å¤^‰÷e«VjØÑ €3Ãy£àª”jõ ­²bªaéTÒæOt‹2ž†µ¯0Nµ€¾íµ‹„ˆE‘·‹ÚaJ¿à'$ÀÔÅóO®^¢Îgdƒ»çP¤¢¨ëÀt”…&P¤—6A”»¯É™Ýº%´ú©:Ÿr-'ì³kñµ©gWŒ{›Ôú.¨µœýg7Ò˜ì í“ däò°`i’…àëös¿M¥ÃW6*yËJ4n¬œØd˜¬÷ÚùaŸÉUèîªç}ð~ GwÛ>“ÛXmÝËgOøÅ’Jáál'üúÓ% ³wðêÒ^gâ}Zéí¨Ëõ¹C¦‰wœç<,©¨(I¤7Ž),£¦¿NÓÉñ3Ž=¦‰c¨…‹RªôÞMõÄl•Ÿc$z Š-¢ÏW¿Œ®ƒÆ‘þä&:ó‰!/Ï·`’-Ã:¯ªÑ°œ¿XÝfÛa¡Á®Ú¯Âú´ÀŒ H¹ðæ íà“WÂp-Ü—Haàaï>ü€ÓòTÕ÷»ÍO«¼·u™?¬H€#IÎr#e¾?hŽH B\ÛxøY*¾a¬d~§äÁ š‹ås£ùÔÀ»"I<‰ªAÆ&ò‹céêiïnKJl¦\úŽ%y"íÔ”CᎻÌQ€õƒL›ÈóU£ Äψ& š_¥XÊôÈ ݪm®ñI—–@ n}NLªð;Ï*Z«F¼·‘CëÞÍ’H¹~"cÛ®czÃÜí,ž:ù/Õ{?W0Ï"`0>·U¢4ø—<2Y†n,å‘ú®%þ<£Ò$ .ÛWÖúJ-µñee $]XÙç?<Ǹ¤Mx!´hUjøëÄ~5°©Sñi$¬Å ‡dŸ™"e¸Žm`ºbßè—=ÃmD\3uZ"+¶~Î ìoêY%©ŽkH<°íRvŒûˆ_žï?CÛý±)ë¾±è’)šFÑàë5Ï.R¦ÖZèÓ£¼>Xœ†Yr”w¢kEÙ üséP¢õ×ólTÞl¾X'ûÅ]×@­œ(K‚V?€c?Þ)n¡ßé{Q àn䔋¨*]7aKŸ1p\•u­\&Y~y4$É–æb¦‘–¸8¢üƒÉÎQCö˜æ30‡¶oeqÝ8B*¹rSçëL5»k´ºo×@ÿ~߯hLuÀ4é·dí¤“£w÷¤³`Ò°³Ú?Jfrðd)L‹Ä«[Nˆ3øE–Ƥõ T¡YnäW3­h–ÈcºÊå,Ë´~ù©:¿xsä•´%Kç¦x‰¹!£ õ!K§q´ßaG† qįmLÓàÃßeÆ dõ7ˆIY‡å£î¸`9cy¬&Ãï1ö ,OÍWWçMÚ¤T-ÛöóR%W“óí/§×\ciͧw%¼2Œš‡šów¤Mß ©JQ%ó½BµÇÿ„ºÙ¿ãÂÌ’"ÔÛѨ-c¸2®&õôlßṘ¡ÃÌ6%-ð8‡J2™”™ÿ´Ådî˶‘œqü­xh‡L²4­rŸÚ\Þef–DKSýÙ÷馱¹E»¿1Ú!`vÒz|ˆTªó,RQêvdü3‰á}S$ïAXÝÄ¥ܶL‹[r] þ*9<ÅLÊ µ¨¥` G_ˆ*î3QÛé·šž ¡„JÜ,¸t㊆Ì4aÓˆ‡¶š` ò4—1ÐÎïš¿¯-LÙk{[¯±ùØ‚»UµRKÛæ>ûoÖ’þhxÊ»žQê=ñṄ¯N=ãŸp4>0@\´ülÓ¢ÂxœqýìF0dLjN=®ºÓ+Ö6¶dëùD‚û!;Qûz^´¾rÀî°Ñ ©ZÒ•ÃP2æ®q‰¥øÄ5‹ð²=¶}¿Éþ©–¥Ò>ÜðQLÀךnϼ̂ے‚è¡dL_èLþÞhÑàûWIÙ^ŽrèB÷¡ã6È]ig§3á6sá  m4+׊€ÞµÝ¾ËŽé³“ïèÚΨ‡Db×7<1ÑËfÄ0*Ek€aâ1CY,=&ív«qYáH«åö$·îì×WXÕ}\nÙx¼´~5ÙRc-Š]w‹‘„&Å`ÝmpH§¡àOHišä×vkT¹/eÒݦ¾>–ÄÝq^bÛꓽ±îmÚÑtÏ:<gûý“…™,]—¶þKÀn‚!0#×;!p|ÈŠ¬ùÕðƒ†ôAƒeN‚ŸLÙžÓFÆçyèÅÃHºÕ¨Fß;Çij zÝñ{ NŒ‰ ó¼ö¬.åŒCpÐ}­GköG„ "~øø{ ìi6AÁ¤ý°sùœÊlÿÙ¹ÚVP§Ôë*2i=R eŸë”Ä‘Anšj¸àâLÖH`ÔPBÙk”œÿs­kÄ¥L°Õí[Û ÞÓ§÷ñXóÏÊ£[% &æ¡t+íë!ÙdpÑK_ÔáÚ½¦¯,Ž,Æw?Ǻ6HäN§ñõah=x®µ”UL?¼o¶¸yeÔbÕïe/‘JÏÏX¸L7è™r’:Ôe¦ªŸ^ù!ÞÅÇO}8¡,¼J“²Ío-©þ@vè-öQ…‰ô,?0ôëÞåGqÀ£ ·´Ö¯xó‚ÒÌiˆí×ÉçG:Œ¥b-ñ“/ɨÌG[¤ÝS}dïeVT? w/kWÃ@Y¯ Q}_>A¤+ß ïúÚ‹¾ŒÎ¬÷ƒ‚Ó­N_Míù n•\Ê+ûÄ—Ÿû‚ï&©oNnûîý%pÌ4$åæééö±]°*$_ 7 ˜ZJú GnÀ,£P*îïuˆ+¼BÄJABˆl·@ôôŒœùE!kZ>MK£]ùöp×…ü‘W¿-àæ©†˜ÌœOJk«ŠïôQçˆaœAµaáásÜgðÔ‚øD%_^¨²™vÙ›ò‰8µÜfd‰Û½}üç[ƒÙ"|Þ4¸nŸ#€˜^’”ë,ç«òÀóT*u–2Û° ¯yËg¶+Õ1ž2k´ÓÊL “ÀhžâëÏL"gõÀ^<ýš¯Ðí´Ûg9=ú¶Y÷¨ºûyS¼¨ô T%ÔV¥zµ Ê=Ò—R³ã¿¦HºÕxN…%Îpö^`TµzÖ˜kù*hÛ,75ç¡;ØÍ¿Jˆ5[Ƭ0.Ö«Ó¨BM3‡Ú»û>Ó#„ë(´ˆcM‰‚ýª¾EÐFˆV6zõÎÞœ³µ׃oZ¾¼hoqÅàHøfxôDC¨gûDRkÅ7……H ¡¨Ï£rJ#葤…ì¯Þ<ñŒh>‚Ìs¿—föÅžiÔ#ó^Ä‚=cS_ö¼qÝ•È4‡[* ½VÚ(¥ çB zR/Ê|p§­:·Àˆø†å4˳ifM^ôµz+ÜÆi¡(³Ýʼná«P<¼,„䇘²Jå©0𽲇K/ŸÐ ß‚~¹¹UŒˆ"žó²9»ö/½Âlg1ó窬ýüxqóºõfÍ‹ O2™z«õØÄ•„—ئ'˸O÷(>Ðß@Ö,ÓƒÂûÎ/XUÝÓU/xc2n½ô²$>`p— ¡“Ië±±™ð©OÊ! º«ë|ê=Z<„AË+‚¦t7”›µp§ m«"ªÜï‚{êÁ¢Ë²Éúæû3ë-ÔÛ×v LJ5`¡WhêÞS¢Ü¡+îh±"¢vB 0H+û´½ŠøŠ>Rá8§ð ›I‹1…úÂ3XÀ8½ô¾Ù^¢Œ=Gdʲã¿”eÀ[XÓ,Rý¡9^%\&IÜÝ¿ú€S?õ}LüŒuqJJéCN5ñ©ö®æCĺ¸|Ü‚~ú°È§í ôwú¬”|Ê_÷¶ýö , ¶ˆwÇNjü †È—‡¼ÍŠݧCˆÞY=X‘8Àr;'Œ«{Û{}óåTÕ¿âW2Ü9ÅüÔ¨hWVsT.RPÑýq«èPø¬©ÈYÆh6¸U‰/Dº¿r l€_…³/‹Pµ*ÚÌK Z›mc‚ÚS¥kÑìAÒmÁÈ #ÚLH‰›Ì0ÓøIÞ#ˆó~.#NƒTHù.ÑŽÕýk×ÌáîÞr@lÑL´YŠMÙ~ûüXÀ.ý²¥.¶(\Ó@Î;«Ÿ——+àah#ø9;C$yUøquøvÙ¼H´áÏL™¶„@Ñ¢ä( B)ë³üóŸscÓ7(3Ë}ÐÉ‘j;BÖ-… F¶ÊQJ\š]DÐÂCnQÍ©à:õïÇ::‹YSj~bT î‹j¹!§²tÚ^~Q,i6R¹£Ñ5 Eŵ¯¼C–i¾öì’Í·ç ïÊÊ¥ZõšÈ޵æ ÝÞÜG—Žï®‰ˆ8ž»D 5à&Gü„”¤6™Õ5–܈¥çš:¿€†9m¼ÅÚO ªÎ Þ æ;ä’<ý)=Nÿ}Ì‘+{©éíÍ;ÅëŠD-tù±;ߢÑvÉæZäŠrþ%Dæ\Lé©«³Eà6[ó¯©Õkg›z§ Ÿ~üH£íT«1/˜Ûul¯XóÚà‘;nâ{ܦ‡<6ßþÙží{Æ£n 6øf÷7;¢:ú+÷©æWíÏìÞ­û§÷¡øÚÓ3¹hGÇ·‹_"Û6ÑêÅ(æ¥ü[x}“¼ï'xá²(+ê=ÅÍY÷Ÿñ cý.:ģσ°2"›c_DVp©ïÏîìá•Ì7[7QsÈ;‘a†t¯OßxOòŒn»v`jš8ëÌ XAëNÞÍ‚õý_Š) Ì\•³J’¤7.ñ°z½%/t޲û/»ŒvÄ’B]}Y‡{Ó‡9ˆà¯ä·¾ÒFpN<å§Éº6›Du̬.6d2DwÖñ߯®‘G„†‚¼H)d"”u‹£YÍ6LyPÉÒÃüc22t7zʘ`¡gÆizÙi$›8Ë®d®Ï`[e¶Ïè,ÆÍ"˜iÍíÅT{¤.Æý'Ìcúl# î®ZëEÚ Ò.1ŽXXÖg-v®šY¿YT'JT|Õ»I;{"öQÎúB}G÷gèR¥Ò<£>Oš–”P«¬s¹ÝGR•N6àÖûæ§èäTTÊO(ôU9Î%“ò+þÅÆï·è×§*õ»]D{«d?ìÚôôØ 9…Âør@¸¶*¾“ôT?‹!8({¦è™JF8Jf?M¨µ»~„ €@©Ä%ö$°úµƒP °-¬ì²»ÑHd TJ×SG¾XÄ/XØÕèï8žY KpÏãÓÿ&ãß.B‰‰Em ŒZcëd?…k#8K¢\9yÑI“»Ê©1YI áÈ¡ù¤3JaÙ‡‡»£{ Å÷HÉG1¨«SLF"EÈŽÌJ®i­ÂÏfJ^6¤æ5ˆ×Œ%ÈnV­S`¶¶¯™­]cÚ°9Ý?é!Êsò3¥|—¥dºF÷Û^ærSò%ÉÏh"þ(÷á$7K3…øƒd…O"ø *|ç|i8U·çxervÊÙwPÞ÷v®µŽºäÐA2yå“ch¹n}T7Œc èÏÐyà6²=Èb‹Ù<Òvº+)B”ÿ¡Ï¹‚ÉÂc­Ñ#§ˆoÊ\8Üü½ùךù°ëJ‰ ^ëôþÖ©¼áü\*Õ•éCð§]'õƒu˜ÉŠTRð¯cqg[lv”ÃaŸá·Çé›J®gÂ>T×ÔDë¤Õ64‡wUu(üŒ!h£7_µ¼9BŠìk­ê{±LýùÉ»öó¯J™sçΜˤJóaÓT*öKôŽvÊË—ôÎŒ÷‹£/|Ÿfbv`ÁŹִŸÝÔ6%ÓŒ‰-¥‹/ÿàPÚ”!?ˆýç´bÂ(CšYÁðêk¡Nó§äãÄ!{pYåqRy¨Ô÷û”ä’¯¾ûlISÀ%N·mR=¾í’óš"ø[ø×:œ² +…³û!”žxß]B±ŽbÅøÉîM3Ÿ‡ÂiƒÜµ¥µbcÔ›>Ì{df–¹Fñ‘’œ.ùøêçK⸴¯M¶ü€Ô[Iéì2ªß,l°ôc@MÙ°Wc©õ6šá«€Š“çﻉ< à¹p/õ³¸à: ð$ 5Ëó›'QîÕÉãÔÄOºô mžæ6º^ %~­²ÄïxÁz¤`Kfúþ:»_Î’Pßj„E¢LÅ…¯õJKŽÙîºã|qàf#êß) ´ÉTA)¡\·GˆC ‹>MZOªJMŠÿ„ò«Ü|‡>ëb \þÓ–kxÈ]—Úé}G@j±åVU™½¿=dþ‹î@\µ¼œ~=áÕ†ãuûqߨ¬ß×2îCð*:ÙÖ…U"žFîßLÌÆ‡i§ ®ú©åÅh‹*È ïA£T¾”húóÝP s–Ùx}{÷mãÉn–~ö2-(ñ¬ßüN’…Å5“ñle»µõ{߯û^M—/Kè'³åº× qVà³ûøcy}—9S¦µè3Œ” {ù]Ì0™© <`+GU.âEÛ[µP)ú$ö rmJ¢+r%u€úmkòÎY~½è¢: |BB^ü͹¬pl°c¾wBèÔÐï6U¤Ö )‰v‰ÇÆ€£¾õ»¨+éj£%½ çN%]r¾,±â °DÍ‹Øùqq¢ÜŠ31gVz?«wêwk¡“#' @ÒAZiÞO×áÄâQ:+†…Ã×ÍÓÓ)!«˜:WQÚ;{?g|ÄE‡ÊÛšŽòϬ¿êU‘Ô’@ìÜRªq\­Ågvž·_‰YSïçD€ÉG Q”³Ú-6E|R­„TtS9µ½Xõœe~PVˆÉÕðÌ·Ò7ŒQYåXo€æ²kGÅåŸÕ…hŠ´Ùé4Xd.v)öøz†©(å;ÄôÔ$:'cxÄLw‹ÝqÞ`¨7û83é€Ívž&õo·ÙJ®¯Ã^3¶4èöÅh&’k7Ȥ‰ñÕ¿2Ðß.Ä—}ÜwÈ Ðâ=Š6=ïPVÕÌUŒ±rìåxYEï–{‡â ©ôÀOl¾Z–ˆ²ÚtõB%ŸK -×7 Ôæü9ó0ÌÍÖcy‰W-YÎmšÅ#3èy+„3`˜)ÖÃâqì…GÔKÜ è®·*bâží¸å2G`rÂ4Iõ36uó(ÔÕ·³m|‡6ŠÀâEJ´zNàUµÔºf®Šêrl¬Q„•š—oÄ¥W`½ìømv•Ö ¤˜ÌÓ¿öõ:xìF–Œ¢ezÒðÌ%a¢ þ²½JTFŸ»À-ZZ?ƈõzÜš9 ²M‘•‡SRH­B+P¿²Ûð]p?Ãh…FIÖ ^n¢D¨,6 ÎA ·×¿ä/wqîÄ:hçeCîȾœs½¶êæ‹4‰±1[ø(d“|`µ³=uÞ_(g­PXjkeP†mgH9U?w¥Y³ÆËù›™¾rbT.Ý\.}ŒxR]s/õrKVtpÒÜ,ÎÕ¢©¿ÜR 4j”Î=›YI„ç&8»ÇtnñÞžNU—Áa C.k£üV“èÉ­ÉHúç:(;v›ar÷ýu+œñ%96rfÚµ[Ü&eîÐ*t ûÔ™FWPé€Ö*¬émïƒešÀ8ÞÉþp^µôËr–xÖÒ„—È3°Y3¡LP<!%51 ml„ê5ЏYw€´{B<‚QhPj½~Gð:Üæ¥e¹œîãM ûm-‡õ ý}VÍaª‹—æI*éMdà ÿôæ¬Í{…([û"‡RR`¹^M{>Aº…ŸêÇ Ûy¾éddZ«Î›Y©Š³;Š.MsQ`XVˆN !mÇS:ÙSÙ¥©ózšÐJŽ$VœL~e*‘*qê »¨[|¦"úþÃÝ↋§©ä+ñ è,·¿Oç¯Sš‚ûÚ™¨Gü0O²Õ Š&)ðDl#þ¼ã7¾ì`Ì`öëL?>[OÒ‰\ |DuÊù9‡°Ëµéò¤Në—¤ûÆà‘Ÿ&)¹ZžX†4³ÈBÈж:¨ùùEÐxTÄóóæ1Ȇü –U§÷` iHÑÀ.†©¸Àh²-Ë~8æ§Û×ksÓuߌâÍO nÆ{e‹Qç£{àcµ‹dÈJ­¢†>óR¸;¼éÞ…sC‘ p©ÀÌî ‹£¶R©ßø¬›/æ\H±  Á„Ôé#J€”]‡ýͺÈðÑßk_>Iåp¼d/ã½$ÿˆ„¯ø$g—/Ë5–ÃZŸêŸÃʼ½ÇyŸ„óÉ%AiŽý´¶ µt&« k2eb‚âÝã7>\jqˆCo%{ŰA4³‹9öÇxè[‚E¹œ6Ö`U Ñá{½ø'ÖP„Fœ”ز³”}&_ziSaÐg•ÄNe†À:¨U\Krú•äL K{üc¼öš5;@oýIµ!ƒxpLïɳ1Q"–³b Çô¶ÌøCøÓ¹Áñ»ÀÚè겪¸I£LaK ã‡-R¾@>M i#®°küì=åóçOÖ_Ôs ºÓñrð"*¡›^¡%ˆ›2 ¡ýÕÌdƒ‚ÙHBLÒÄ{š˜s/«ÞÅMÜ4( %³ç!•'³Ã µÒZ©hw …I¥XL9~Dì'IŠ<ûØu‘fÎÌîb‹’ 'ÄJÂ]«qX®ã[÷Ýðc6©Ï Ó(ïZ]át*ãQ)e®a|´®ҸГ(‚ÉEÞÚTq/RiÀêz-ÿrŸ”h¶‹ù£ŽmýöÚûä"E¸ÿ_ ¤\šè ®®èòæ\ÕÅðº°r’Í2‘‰iâf!>W$s&? >ë4ˆ7±Ï¿îQ3yÈ„P¼ Ù¿£¡ñ¡b>NÞXïü˜w~¥PNƒˆ¡uƒ6#AÑÅ?£.]6é• #ÔcO‡¼bOš^‰ÔŽ'˼vŠ:±t/|_ò°…fÁ?úÈT»?K¶VÉ;¸,E­}ê{O¾}1BG´1²cãÚØ˜õ}4íP æÛmF ‚–;ŒßgV½¹ú/øXñêm#µSî£ ²(×Êå­í„·‚ÄnƒãƒM~~±#!hö^¢$j 1§“„k¢Í°×ê1ªç”تDbä c㹨Úu”ÔÅå¯Ü–$RˆU‹·òt &Ï3Ô(ì²ù„Í$«ñ› qõžÖ覊î}Ôzçn²IæU¿–bFýLSÿÕ{ð}Ú°]Ù´U41óÊ(~èpLfÇýy³ÅÙÅŽ¾$Ü­ã,.µ‹=H«}¦­& ˆ¡Ov äêë¶Ñ»åžîyW%Ó–þëñÙßÓ2©33z¹Ã"×áz•§ücÏw•;Ôbè¶b.ó‹©h&½à‰1ä(L„ªÜw3j¹œ”’‰á÷+2–v“Ÿ†p$_A$¶2õ2Í“£™FDŒ[Øút%ÕD(ÛE-ÓåèÕÖïyÔ!‹(m½©MÓyÊß´AuÆU+£›² 1h>:Œ€OÁ=g}ÒŠÅ´¨=3m ââPôØ™þÖR¶WÐ÷·õÂõßÒ…ÓCñoùð< ¤|R ù¹¼\úì-£P¦ae;7gÑŽ¾€ºš±š(''tßðØ08Ù}/ó#TE"äga—Ü•¦Ò¬g¹H³7î—5Îh;çgtmDrOÙŒŒTHíÄÆ~ÆÀeÍX +å<®\WmæµÍ.lYùÖZó`èdWuÑ%FÊáý"³¥Ý0¾Úˆtn~eÁˆs´ö´µî¦AÝöh猄ÉU$šñdöx³“ ùš8•Q±Hš×`‹9fΓ˜÷Pä©}°ã6Œ:®N7’s `© çC˜/}1ùZèJäPª/`ߵ쟽7 KRq…EL7«² i·Å9Ú9O€º¨í¡‰f ÷€©­7æ~¤ÓŠ}œrûØÏ93KúQÙȾ§Ø Ö²7¡;vŠó2mû$1ØPçb.M²©Û¾F˜a2eƒ±««³÷n`{ÔëYPvÇ¡EªÚ–¸^À°‘þë'_Ó°øsa~Ð8ŸÊ§ÓƼ3éÝvÓð5z‰p=1ÄÒè÷ü`²U?m…‹œD¨è^3=¯5ë "ߦøÜl¡Ñxøë§®\t ',œuœ>=ÊÂu@¹Ìóœ›rW0fµÈ.‹°ƒs>—{ %5å¨YFý,¨ôÓ€TWÙædæŒÔÙGvŠ+È€‹0:D³(¼<ü¢p§'w®A¾>ƒMÚ_Jå×XÕkúôÓà4§MH“_)}I£=بŸä {V>wÇQœÎ<'|ê$‹Õ¼ý![>$ƒé|ˆcÇ (úг%ù"ÙM‰&Ü·Œ&”LcyÊs>º§} £_“(ÞcržOÑãNÑÖØ£AÙæä¨™…¶²žäc`¾Ç´¯Ï¯(˜2•ã‘YóK5Ožv…ÉÅhý¢4 Ùo7ç}éjxcuØ~ÚÙÇ\°îœóãÌ*åZHÓ9Çewl_s!÷Æ!¹;ƒÎ9EO7AŒÃ.hµ°¹%š®ŽQ†ÑÆ+.Y6»–ûE¡˜;-¤V¸ÿ*´¾¿J°4byY_“\CÒÇCT=ï{Û>Õaet%Dó  QE?\€&¨wé ¤ çÕ5òÎuÚ+ý8‚EY¦Xr›ç32´]C¡7Æžé›î5æu`I”${)¶óp­²hwAAoÍj05ÏUž65t[‚^zr€¥Oí¨³±„"Ä~OÞ_žgŒ"ÃÛÔ»øÄ8ã–Cav»çg·4:PݯdéŒó—ë9¹ÉßϾ£$Ïë9Æ&®+™±ç{²jæúŸCFéK ¯k¢¾âƒxù´Ù°4¾'z#rtáßûÌê@-0?3ßaË~¦Äë«N#àÄh So÷j*…]s,Ýu×gAVt÷õ‡ ?=Ûšón¦ZÖ>¨4rMkS5DwË5iŸÜ#W‰y¦ëá'úúÝÞ98Ûc µ‡p¹Ñr=å…-ż;¹Ü¨o.òúSJ ÒÞHwG(:"Fw´Ü—^˜ý°I÷§Ùœ@QŸásUX-ô’Ê^æ”n´«n…&Rá1|°HÑŠd„XÞÂxœ8æ]®äevFuÊ n:ïÓ9œscò¬I SãÙ{Ky¬:Ù|J4£rLÖ…|eÅ1°\•»]†¯mÝøSZ›z 2àSÒ¥6ÊTp _½)pú²s×ç°2x¹È~7mÜ‘‰bN(þgžùÓëHdøšÝ˜`(ãG‰ê4ÿ’ÍÆš»´v“ÖúHç‡E‡„Ptg¬E•+íL¶WN·¸Ñ>ͦoŠ`€ ½øëÎ@¿4ÉÓ.aé/¦nÔ®q£ŸšŒ çÔQDF)Óa·'öGA¥Mó†ù¢«¾OZ8ä(¥6r6‹¤@>ÄÎêgàð ëÉü—Ç&LõUFÏõmLm¡éÒ¼0…8Xñ¬º©bñt»U_?^3Ýݯ¥CV[ºd‡»c× 3b@”ŸñÝýH ©ëÍÁ>y´Ésí¤Ö6ˆJ¿ðN°o´emž™õY1½ yŽ6V}0*œÒPÂûôâùöP:Äq-ƒ)î¯Ñ#4œ‰WTóŽ•Fô³`y*SŸÊF¬å¨Ü娂²Ûs† ÊÁÎ.‡¾$ ,e5é'ÿîÒôdÈA[„n7 *RÒ2b‹ð\5žrq++¨rì Ëî52ZÇ€™lšÃ äGm=¡P‡“«sû|ìq¡Œß½0©.ï»—KwŸ£ÃùtoÆ7³ ÝñY‹w÷t hŠÜ‡ë Ï@ÇñíéŒÍƒW($üÚã…rÛ12˜ƒªÕŠTL³g°eô‘Ð3ïÖƒ{=&Lo ÚO ›5?Šà»ìИ#üUöelÉqÕ ¿EàMŒqÅ]xP¡…\9ObD×~²žÚv`e–Ô;þÖõÐìkw!1ij½ãhÞs4bìÛb¯Ú]?bgrг¤Fšè ÆIdb€x¯H<»„£V}ÚØÝt&ÏBÑGÇå’ øž>_À×¢¾y;ûEÕxàå+¢pD·W"K»ÿ@µ`[õ•îbzyÒò#ô£‚édñ¯]þî'î< S;›4s˜Ã^“å‰Y_ßÕ›vÆôŸã˜J%ôö•ò\_CØ« jty,C ŒmœƒÒîÕ«ÐÎ|ÖÛïÖM 7´¦pºŒïä d5A:i¯“Ú–Çü©ƒ—õ‘™º~ʶ4v–Q™zÆÜò€ÉÞ‹ì”Tñþ㥨϶ð‚µl–A^ ÃÝO,^` g’¾Ô¤ð«´Ï"oò¨B–~±jêÀä¹mÕðùÊr©£NY ¡ÿ3Á‘ SDq´ÑÀ¾‡s»7ŒÁªo†! €Õ~á•RŽýjoo–E’LzøyB÷ØþOt+Í‚¿ƒ=©ÍcÔôÚ¿–7sæEš:#Ä´u©îö ^²Óå…B†+ÆXV[^KX¼d¿øuMqeî€ÔKñšS4îÒ~X·…,˜´¿â6¥Æ³ßÁ¤`ŸtKÌÜ&ÈR¶Ì¾­.}£Gõ–™•ü5òÙ¿ÂU#e{Y‰^î=bÕã®éåÝ$£ƒ¦ÒL‰Zq;¸GóuLj¯#å-[§ñŒü§Î&þ"Mwá‚w …÷Ë ü=L®G!× ŽsQ?ïñaèŠ×.Vc`©¸ œOx¥~>¸õí¼dEËë³Ø09?pîø´V·ˆb~µCøö§“¡ Óø›—kµe¨Ë<¹|ZàÚQS. ø²>sHæÀ1HÛQáo\½ØSmÉ«h ‘Þ–+­ O©D½H(·S«Ó_Ä|˜mmV+F1Y ˜¨úÆ–~”Ted®L³ÏÒEþ{Ú–% X}tQZ¼^ø䧯‡H±²U†Û"iN>M½#˜`˜uý¥©*8_§¾¦’ê{.»_öõdtDË»w/p_wóãòÙN\ñÀ#T³u~ѹ¸—H÷#ÇÎ!hÃTádìëȾ©íÕõ•`~òŒ»fv™f¥'–Üæ82ÀhSu_a‚`á»ÇÿîËã¾E]7KÆAíÔ%µ÷Èꪫ÷sr¯‰œ0‚*ñõ{8y^»¦qê>ä!„*^€…˯êâ5$ã9 årJoÄ=Üh½ÿà}íyE(¡}Cà‰ *ºìlN²Ô ÂÒ=˰ðÔg}H.ÊÏ&Ëó¼ÜÒžœ¾îZ?}ŸY£t³_s@0(öÒ¶Í´ÙéÕMEúc‰2ý§$ö‡œ†•¡mÃÛz¡9_Sì4ðïÒp—ˆ”ÀÊ>'bÐ TÛ/÷ÖTÀ“îJ£sÓ.‰_e+Z¹ÊgòË[.F¬¬Qï®bÁÃŹ¬óCSƒïÞHŸíˆRwã CÒí~C„âw(‘»g ÿ©Âma£Y¥ë»©aÚ+Üò=yÅ£S ˜y‡Žw’'tçld±¨q§œýdõ²—Þ=’!mÅÝÖ#„Tîèƒ{Ö~ˆëýWû —Öä<ýƒï3íØðO;9U2ÌŠè^Pf?pý]N¡ ßÅò7»Úè§¶ ÍwS3Ø" íaWò3|›ÌÜëN áͪB•²FüÀ°å)NÀ™Î*Ï‘\´ž\!ù@þý{߯‹×¤xk]ƒ-Wéèýf×àòKŸì_ù¤ðФ¬¡5HYbƒ³½^Òœýñá³öšWˆûö©69,éùôì“„ìÄò¨c±¥_oœ:ƒ»šªWÌJuø»«]SP3âÂl™.ÑÂçŽÀ®êBg5^v¿U*ðÔO#ÝÜÎŽ»Ä`¶þ¨¥ª%‡òヮuß݇?àc,ÑA7‰–n4Gîšôò+Gå•­‡ËÏN#£·4îhÿvM=rĆ/#0›ý¨vÙ'6Nvf à]™=ð@ÃÆZÜýQÈ¿ˆì[ÿ¬áþ ˜‰ñˆ"ò}楰ò¢d7+¢‚Ê•[?9†î˯ìs`U0úk1APêÈõ2Ú÷„Uf_ ²o[é&¾¬têGÉÍ–rŠ"xB½¬ÝôñÇ|ZÄæxÔeZ ƒ“p›Ú0W²A¬k#Çqiວ™Ù°5Äe—(r—Ä„¹dAÍÞV]òPaô¯b§.ÛŸ÷ƒ9¥Ùà™ K©è?ïA•,Ã’¸½5òJC4bôÏ]§ºá›:;¸84´¸*+Oc-›“S­gdm¡©ñ.¼qŌӡ<Dã»"hk©hÛ¼3"‚_¼™ òðP?ëH•Ê µ'éjZ†w+ö@Œ@jM˜¾(ïˆÀ×?¢¿t®ñX])Bt²ÉdÚxÙ ¿³ý ¯©µH•4ŠØ$@벯\ÑAÐú+h>Îîô]ØÆÊ]ê¹qMCêÜã¤E‘˜©‡:څОÝ-õž"òê§?ðû…‡jÃÐUª!X+~XsŒá¨ðƪ£ÝÈM©ÈšW—HëîžîQÌÃ.¤ËgµW ެ44³~-ß²žð¢ô”7—kŸ`ô4²þ"_àWèùZXEh…@‚÷ž÷iNFûérÛ€ÞìRå™õOZQl<Úl=Ý-ïxÁYsA8šÞˆ›³«›Bõ§uL{¼™Ea¤ÖåÅ|8›Ž­ì2Z„ïÏ(NÅhH“#LÇî¿ÍI‹WÌ…D²„ŒÐ zŸ2è ~‘î&–Ь=LbL˜¯É4 óEn<ÏÎÚ&¡ì—•ÙŸ Wÿøh€ø,oáÈ@Þ?Hß²ñŒ‹I€J× ð÷åóµ ó¿2ÈM½ikh2l~g«áµ#þñžˆ´F;QˆÄð—ê2ð­4±ñUðü-DN²È@ç ƒÉO/“¨¬A6#RÅKE>°V‡2‰@—Ù÷‘¼`Á¾Å+\þ¾œ60ê–‡¼*“úpïè¡dt8u—Ó5ØiæÒþDûH§:¸™,[î3ÁÕŸ„å`$g¨Ù4(¸_u˜¸>Ÿ´cUòÝ%•b’ÒÆÐ'8=›Tˆ€ÊC©¢àÀ9‡É¦®‹fIÿ˜t"ª' Î8Ùvwq¬”ËhîÇJ5Ž¡"Î\Y%訰¹æb†VmÏ C °ùÙp!:—Õá/^íNDžq¯¨üA,AýÚÙvd>J¢íûˆžSŽÑ™À1~4S_ÅF5»]ÁŒÒÃVo‚ Éñ˜¸å[¤àÖš^‚Ä$† =ħ4Åguœå-*kÌzm¨f~~ò'§d)‰ ³ˆÃ.áè*e„ýtîH×Ô®T,ÒˆP1¿J9[\C(ÛHUþÒžvÌ:zŒ˜##»Ì­äùMò÷t‚ŠY¬[¢:t'Üæ¯FζýNXê–‰I}NýŸ$7à«å‡gÈ´¼ækl„”“©L IÅMgòJ‰$ã\gÖúóU£~7ò¡ Ré¤m{zë[ofå¶¶kœŽ©êa;Å(Ñä¶ðµÔ͹nÝ@„aˆa—h=Ž €€”KÓ J½¡yœ5Ç—2À„"Üdï_úJ9„PŒS%ñ‹H»Nhlô_–sï*óR÷×#˜µµ‹XÏòp9“#0朳´_úEM¡õ ]$ 9f³~ÉÇôO·Ù.Wp—_oI¬Œò5ïÕò¤yÐù|_ë3Ì0."~ÛѤ.µÞ¤yûȆÞè)EŒhÕ)âzG·Œ‹ xiÖ’ Rgã^~£8ç>6-›×ë˜PniZ²„K†®MÁ€Cò1Hƒ"HÜ>b¼³T¤J@ßp+Eß ?ÕS¸6ÂÉ >S´³ïWg¸zø«bM¹æg탾g­»%z/ú/¾- +NŒGrˆÅ pgÊϤ„MXQZÚök…X'dhâ€`×È­ì.½N¶˜–Í×Ï~Z÷¸nÞsNMúîÿA9çU ¹÷Û¸›ô€RvI ˜"%|½'qÊ6'‡P–JÆÇ¥Ü,@ÎØ7Åÿ­§³O •pB^G]ßå,Ä“nêP8°‘‹é‹É™}Õ“Ö*€ÊÎRAÑ^a\)ÜŽ:0ÈrMo?5[+Ù‡âpó®Uï@9pAk@qµ©3"óÚN@Ðvñ\Ä'Qu'{"7³(YftŸ<>ͬõbŽ¡ŸÇµû«[i÷|aÊRµšÑL»wéçž.‚’7ù£^›ôGF…%;?MyUú\~dKSTƒ_œî ÿø 6¤'À’Ó¶Žnj‡¡gNš zã3øM£:Ýô+ß^a]‡ÐõSžF€‰_êjd:Cã⩟5ŠÈTëó//Ñ‰ï ­ +e§s¸“Žõs Bþç”#Q‡ ¦¿ç #råvèŠÚñíc=1]Ǫ¿g ¦~jî\Áq%¸›Kyh°©VQÏXïúˆØ<09?7X—Y,ë>ÄwÅQœð ݲˆw äfŠ¥iâp²®šèÃêæŠ¾KÆø1Én}eKS?ŽÌí2÷êö¬÷Àl«.{ù¤0ÚŠé@އ´Š®ê°Ø#ÖàŸÇä FyЈ}^H ƒê«€1Šò7+ßödi£ªÂŇí^‰–'ßkRñ^öÊLjôæÅ¢ö>Ñä ºû7mriZd¹åÃjß uoß( P…0·8q{qE=Û[úÉ&Bž¯y,‘„€èžéLjè<ƒY¡bç¥Öc‘MC¿µÜõÚ½/ ’Qß<­í#bâ®ñK­K˜ì'«V’øüÏÜ2CPU]€ß^o“dß¾v†môêe¤© â&lå’F‘t•‰¹aÙ„ªË×½i%ú ~Ú1ùŒçNjÁÛ)‰%ÈB7™§>%ç¸äº:V*¹Ö1]²Ó/c¶P [³þæÄX0Õ• „Û‘à1³µŸ1UcêÈ…ßØµK@Ós>lJ =Dbe3Ý•°È>Ô@±¦³ÝÚ v7wô {¿°Oâô³0[ü<Æv“©Jä§èbé²ÚˆÈýŒ7žI½ RzêZÓg²ÇS²ö\_í¢.ð…Ë–Nê {KE^‡CŠÐDãÆ>µ+¥*}/²ïÓÏ[BãdŠ™×[ nVÅòmˆBbUW+Õ~"Ë¢{‹tgõv ÒØ;ëS­g°”"Zl°>lº7UVêIH:õmé7|96"³Þ¥°Ýœ×à Ã< §ðø_] !ÐŽ£xµáD·ˆøxñªjHmn·` ¶f7â:Ió‰+Ö”‘[4ª·ÖÝxpK©ÿŠÖaë¿'éÅwÜÉO¸žÇ? ;{ðPðp&fFžŒ£Ý“w»Û›YÉ•*R…ÒF‰é&‚ù : ›³:=o¦Q|¿¾(m®)TÂ…Ù1å^S؄Ցr˜cæ–uÖɹç\ÁÅkËhý‚,;3Tÿ£H3øwÇXdw”[Uë¸(»Ô¬id,”ZžXž&qâÈï—Üö9íUø`±[O6„Š€•=©Íz—b5ÆÃ½Ø^¼‰Ç€bÀbV%v™wB­}$=Á™Ûù×Ù¹5›êsÊNþHóª¡ïÔ‚n®‰÷.@Óž0è†,8ÿÄRȟʼnð¥ÛžMµte†ÛïJü¨s'OnaØ7µ €U7\Z-; •ÖßüÕA•¤=ªrÆ©½ˆ(9f ŠÑ<®„áÕqÜæÊåD®+Cž3v¦@§:Ïb§9¶…= 4ï㩃U²ñdívÈçhºû2;œL0¶ íÚðxÎn>›xÜèö*ŒN=2À$WÓÇXpÃ]â Bg‹¡î¬]˜Ê°]ïc¹ó©2Ѽ r-ÝŸAáà†ÙN{^M¤Ò Zðî úà–â"6Ö!Wþg¢½¿˜ }'…†3(§á“…^q߯"ð¨äí&pY¾§ ƒŠójÕKt€ù­ÞRu3<Ñ­oRÅ£HN,=ù%7£W‚± +õåäÓzæ¼Ò€B.ÜŸQb3+âjÕÏžFÌ=?Í—üZ5H4ûÅ”±C‹JërÝš“°Y[Å^B|ÁµX-dò‹kZ&÷A¨ãˆèº›² K\F(F]aV¿–hzÌ%Çó£3ÉÕy1Dù•I»Æp|û:%/×:¾V›p'ýÍ·y×e·eï5ÓÉ•îk¶?|„°ÕÃ޶ #ÖrÔ–îÛü“Š”«?¤.ì@â9ÿ®xðvÜþ1;R»ÈÓ=ÎE ¦ Ï‡a3¸TsùììBŸªŠBÄÏÍjtå…ÍQ½aˆdz¹ë¥özVJõ÷,¾§œYzád‚áy©o¯µ%£g—‘Б­So9ï³IŽ)ú¯&’/øÎ[¶´¨T‘lnmñ<Æã~Ž5©—ÕaØ7*¯&lŸÿî-¨xòªñ3¦õ@^7ÈIU¸òÑÆƒfÓÁÉÞÂÑœür|œ{Åâí cCwëèU®—+®æ¯ áñ¼^çô÷¡Îøarß›½~ëÌÞxA É#>V®V¹ä]‚H–€šÿI׫ӀˆñT‘ãBhÒP38Úâ~1Ñ„ÿ¥&f œ)ýBàFáßýy[½>²YC½ªÐ'+vÊ¥÷½ÛŽ)z”ýÞ0Ó~¤^Ÿ:Ð8?Á&ë''´0Ï?QAžÍe‡\ÐÇŠ©’Z"àM@CëA#÷¨.¯¤Ÿ'öúð/á `›…ú‰V]Íö ?€}C '60÷û¥ªHßðÉ(·O²oÖ¦O4ògÆn^?£ÈÂ`¯0cEBæ95cÆN_îΤ«¨ÓGø”½¸öÛ ’éÞ¨èŠßöÓW–ÑO#Ó½ É"´Î}[ôóç˜l̉¬ò¡µ¶Xd𾨬ûû+õ÷ª`\;tߪïå¢ÒÓ¦jíé8c¾é´î®¾/=š©å`P„k´fw¼Âã&˜A4‘ƒÝšt•mÛoþ–MbÙrmØÛ½L(ÝYÌù)[ªJ‘ó Ç% ŸZê-=·p“wböÎÒ”@ùAŠ©^ƒ”š:Qf+þƒ$§ }ÚL¿¬‘ýëyÍ…sÜo¦‹Wã“÷¸C”¬²ÙpŸ[üsªµÆc@‚ç^5ϯ±qWÙ„,.哾èS@¤Âª¾M2¿q…ÍÈC`5°Åx’’;Þ“çß”úyIUõ`©$øGj ,⢸­‡^±Î¤llÓ†ÄÂq&ÉîÐrDmwÿ)§¬Fª°}M{±@*éÝÇŸbÌõÔ>á¦ýUJÞ2ýê¯'Ye;»Š6 £ÕÉ¿ÄöIˆåî‘rXÄ1ì×#Ô OC)y Í%HÞÝ Aè]f<mÚ*¬N£Êªs?A`+÷ö˜3!åVóN8Q¦üþ*4nÓ±. rúaÄé¹4l¥gߢ¤À£L^ endstream endobj 96 0 obj << /Length1 1395 /Length2 6090 /Length3 0 /Length 7032 /Filter /FlateDecode >> stream xÚVTì»§$F‡42 ¥·‘‚t·¤„Ôlƒ1r4J ’ ’ÒŠ(ÒÒ RJJ()ÒÜéW÷ûß{νgçlïÓÏï}~Ï{ÆÕÈTTÅ í×D£°¢1°PÍÀDKˆÁâ~~3Öþ‡ÀŽñF QrÿÍ®†C±x:‹w3@£€º>@ˆ"-‘‘ƒâ`°ì_ŽhŒPê‹pˆuÑ(¸7€_ í€A¸¸bñUþ:`‚@ˆ¬¬ŒÈïp  ŽAÀ ( ë Gâ+ @S4 Çü+…€¼+ë)ùùù‰A‘ÞbhŒ‹¢ ÐušÀ½á_¸ð\ ! ÿ L À4sExÿ¡6E;cý 8¯ð@Àà(o|€Ê ŽâkMuô·<á¨?œõÿpþy5@ˆäïtFÿJ„@ý†Â`h¤'€@¹pà-M}1¬?VE9ýr„zx£ññP_(ÂêˆwøÝ8¨©b „âñý‰Î†Axb½Å¼¿‚~¥Á_²ÊI DÂQXoÀ¯þÔ8 ë ßcuG¡ýP¸?ÎΔ“ó/N>ž sÂË®£þ§^øGçÇ¥À`°Œ,÷Âýa® _ÉÍ<á¿_j|ÿÁ8O´'ÐŒp†ã8o¨/ˆÅøÀƒqÿÝðo 0,Ðî‚@þÉŽWÃÿñ“Ç üwÀxâA€à_Ÿ¿O¶xn9¡Qÿ¸ÿ.HÓJKÃÈ\ø7à¿Mªªh NT\(*.B ââ@ü!øßYþÆÿößZ#(âÏÞÀÿdÔA9£²@ÀßÝ_0|ÿä„ÀŸë"üwC4žÇp À?´·Kaø/Èÿ›ü¿Cþ7ÎÿÊòÐþ?ûÑôñðømøeþV(áð§Ïb,~# Ðø½@ý§«ü%6€;!|ÿiÕÁBñ›¡‚rñøûÞš¸“ sýƒ@ÍŸÞ‚¡½¿ž ( þ~×`îø§Ä?©ß&8~•þ]RC;ýÚ9q)i ƒðƒÇKR@¿œNpÿß¼‚ÄPh,>ˆ‡ tFc¿æ)) á«_Êß2¾ë‡þ-ÿ«ÌƒÁ/ßo"à»øKþ½ép¸?˜š@ÃnÞu{u÷Ía• ‡Ÿèò Â(ÿ²E¦ (n ÓìsLC–&ø";bs ’Ö×A÷iIC`_yšû ·Þðš,º1Ÿé$èÔ>Ùdd¹ 09ÌüvèéºJu7§¨™òJЙWÐípwâÂV]þ‘|ã¥R/ñÕ—…Ÿ­”õý(­˜Êéô§+g"¡•žDR+«§àýÜÞPº-ÜW9Cí+žÖÓ§2j‡¯]^”Ž Óå½Ê® °=•{sÚ—[qš[k-½òjˆšÛ˜Z“ÆàuH·3y…C(q_ ‡ç*¢¬= &ŨHÕ]xJá”"¢kWQsƒDdgÈ6®¸ÊÂÂþAˆƒb·F8ÆÝµl”Èí–ßZó'¯ "Š÷k")+öJaÞŸ÷ÅÀ®ð¤ ”ŠÇ-bRsRÒÇïs3¶±rS$¸w¦¯Ä¥9l&X?¯Kíí=0e ¦LPJ«! …‘}I]¶èvA·$o%Ÿ³¿«|åØŽ¸á ÷>l©2¦Eßík”ÔÌO>bô­wð8̈êöÖr)ódR›'Â=¹ÞÁm{|ç‹C[VM»F…¹ š|ë[Å¥›ª¡óýö™¶úH£>³øIÒÆâP{¾í¯tÏ©û|Ô˜¢&%É2TÙ¬M|$©ÖrJý;æ‹æF äÏsã!“ó-ÜÓdXFu²ù9NׂGC“×g–Í]–…\æÓá¼ðšh¤Ã[-jÀ2´vÛß}¦Ã¿{CyöÍØL6£õœ®´kØöóÅiW•骹Á÷¤rt­¼IhÇ ßÆY&0¼ÅæŒ{6“°#¿› œÒ·vifôB5×Í^àL 0wXë‰ûöYëñu\'äc›²Ó zH€%¦%M½ò–uR©FŸØPÒ'…õ~»Òføí¶zÁúö'ß>t÷|˜ÛÙDn7²97²‘]bà4I³:ÌÆÖ™é#÷@„_Œõ¾ãŒ Ô›4àB¾ä(zY”½s:I!l÷µ~ÂW¥ú ­Ñ®åÏ]î˹±iY§ã¯BÔ÷ÃâuîS²ÞãqEÿiµŽòÖu©’ÈÔ½í«~ù£v_S¨Ž˜&»Š&}Sˆ÷F$ED #àßߌ6’+Lb—62”Õ«½à^íéôO*8É«EóóJÉý56·€|ûŸ2˜“ „$Ðo*3#¬Æ„Á8aC±ã³š°nÅ¡˜˜ë yáu=:º'œgÛ÷Ñj<Þž¨ˆª<ñNâXAãtÚ­rHrÌÚð8€àž^ˆ_x£Ò9áóÓµ-Þô×yQ$²åì7÷¯IT. >6  ¡”‰ þdWƒôáÐÜÊžì?ŽËO}Vå‚”î •¿m§çAÌ=xûAÀÏʧ<E7hµèóWº¿tÕuµ¨Æ¸5Ó¬¾‰ë4ÍtH²±£e¿x|"\d›Ãí¶¼n¤æ–:­E¦ÈZñ±9ž”×~NËܦ¡Íý¸Î©½âòÑù”¶SX¡œ>`û"»Üÿ>Û6Eâë9å#óàaôI¾r<Å;4ZŸmý {¥d_=® Fx–@÷ÈNòCxÞµ§º)èímsFài¸³4û˜çANvûÁäbékm–¢ìÛ˜¥Ø—ƒi‡Š_*h¹%¯‘ku+aŠl‚¤³Jiõê Âý:ŠY“?ufª cÆT“`«39y÷Ú}YóW_?“ã|ØôW: †U®Í¸ã¼$,ìT Ê®?ù,pÆÈjUDÐëŠOXt™¬=0]P"ða8"˜î¢:#ÚÈ°îæ®ªM‹y€HF½^§0Õ\?ד)¸ž‚«ñ~¡°†´‰Hkõ¡÷°Ór5ìåž$U>YŸàÌHò¦ö'i:–¾œ2Åù’ÄñØ :ü:ƒÐ7òÚëÄåÅÝÒËJ_–×Q­*y ¸ìœªGÜ"M 1¸,ƒ˜ ± ¤¡$[£ûÜŠcVƒ‡Øàˆ®œ¸5wfeÁFƒ Ž­¸X#z=Gþhßóls»ð™‚}½I«x Ä•œCí3^Ô™´µ—î¨?ªKßÂŽèÐg²jŒ6oöSÆÚ†'8w¯ÞþV9žR1ë&sjíkû±Ï#ŠãÝÝdY)á ?¾ 8[åt¼•1sç» ý–öó7dc*–DÓëM©]%?Í]råÝk¼JôÙ:«U+V&Þ ¹=m¤w¥™Ð‰¿NÅw©EyZ)&òÊà/÷ôª†8¨mœ¿.ûè®d4Óèå.ïqó•(z¯Ínî’^WY)—5ö–J—­ÑÕátš'‰ß\Zx…V{ýy#’[E\¡MõHi«ðM;I } ÝžO$¤öä§—˜F…~?”a&}¡dçø^2òó^0ö'<§íœ˜•hlú¢N²~-EßÉz xO<ÊâG½ØºdIb¤ØV“ÿ€PÑ0W5s¿úTжµRõæ]™»‰ÂçTBÔêòFK~7Û£ØyÊ@ÝÆÃ´¼Ï¤ß*r}gRgÏU2²¿ØÆ£ó~èÅ¥%éÇ]‡•Çí×qìÏR|✋λde2%Udj}?É”œHu3tpñŽ „xyºà~šÃ FY];ˆ:tåÜy#6Ö}{⳦p¿ŸãçÜŒ/‚&–´¼\õÅG²EÞ’ß-cy^ñ:.Òúëãr`Qša†Ï Üȯg½Ï3ŽKÆ6p‰s|4›F…l‰mVDï¶ös¤•Ûw_aÜaKª?wx®y –nåœrZHñˆ¹„|•0U|vu cwÀ{öÆ áÁ¥ÏQÔéiˆÌú©¯ê2 }Ìê§MG•?x—_ìÏ´¡5N ŒÀ£`Ï2Tùûû6á]S•'“\2éïì)›Œ’FštÅR±"ÔѪ³‚òòP|Ä⎗owfµXpïm×0™ìøì<¶Ûh°}-#Îõ¼5zçÀ_†i¹ÎTƒ¹Iªª0íVÎäð¶ù;9%ôs/ªj: Úów—¿/sçzų°Í¼ÃÊï_v%\ªéèX0ñ}!sŸVÑ ¢{¥ÑZŠI}_±3ë(ƒìÑN÷D6Óa!ïå&WS•ê Eñ®YÒHò[ãJ´<^³´#êßnEEïû¸ïKÚsÏôäð–Q9¶Æƒ +È"èšìÕ–ŸM©Ê/*T¸¬ëÝ¢€Ž¡ÍW7¯F¥8èö?ÿÈ&+ÝcRØ_!s#+þîÊЯþépì|4ÄVÁú|"d Ü§)N÷¥›Ÿú+Dv§WÏÎBFÿ‚P æC«»öÚ Lw(ˆ(ž¹‡Ôžü^Åב¥«ŒTÍw£ ..ÀºŽß/Õú¤SÔž,ÞvB›5ØWhðE•DGô­ÕÖÿÑÌÓ >Hb,áõ9‡®}ž'[’/ C’vs^\ ޽/jýºBólï0ÍV¦6c µvï,m¥•FN:ö`r…×á9 ÚÀ¡^gþËC-µ86X÷¼N‚I‡€3=ák*­ÒbÚWEa2+=25k¦{üå©ÞL‚ž†~Îúï\hßbQ7ùèzWÿ„(6>z†~±¬L  )òí@y¦.éqO§‡è"¿? cżÏê[}¢6³Œ¼ôhÞ€`y„­÷<ÖQa}8’È\_ KÈŽ…žV0FV^µu\ŒÎ—s'%ÌáÅ9ÆÒnÉ|è¶b¯ÖP'cC—­ôEx5¾ûFöOœÕßP £U–ÿJT*Ûî¼ûx±£þl´Õj+ƒ¥MfÜÎÝóÝÀ¡eÊRdªïMXü˜‚jÆÐ6ªôüÓ )šéN§ãDÿhkï…Mï.樛U\2WhvM×d[ÍçÅH=· Þ2˜Ô|E÷äî×ÅQQôÖ¬À[ƒVféj¶+ˆ±ÐñÛo'@=6»šâhcRh¯ÚD>.žô&áÂÓ2²»%Ñ›7ÊÕjŸûºÇŠ[iÏÓ¥&iñ­ëNuí¥dܪQÔ§æÖœù!Fɯ÷i³àâ£Å4-Íô×Y ëKTi>0Ncº‚“q“D¦â¤U³§œš§ÀÏŠÛ˜µÈƒ¬ô͸ø›šÃW´&J¾_?ká’{Õ]VètyƒÙ2z¤ófßv ´Ðß ´Ê !>môFò9z¦‡}ð¬“7wÜóö%—ik®ïU_ïùDhÅòàEï°HI~a󻈳âë7šú<Óžú½ÓJ@á²] ¤*g$²äc×'Ô­Ad²Å籨k|îÝÆYï‘„Õ”¨ÁÉ+ôžLµÐñ«6›mÜî-„ {¦&âÏ—ÑÔ>Ö3-$¾j¯ì ÎAfQèafQ ÜÝ‹ô…²Z…îö ¿±áxïî“Ñt®˜HÛpÕìggù~AIß§Rî¤ÙÖvMÒø©Œ;›;-S€y‰qß¶Ãø›‘¸ô ÖžG눱ŸS°ÙõVmw—…Ìï3  þuj´#Ž€ïš·}âÑZ5è¾ëŒÍgæm>ä5kWÃp²›dÕµ¼¯U´¤U•j¹»{@ p»«L׊‰O÷„cíË6†2h¦Tš Ûµ‹Û·ÌBiwt]šÕ»i•žÀiOFš+ ²uXhl¦$€lòaúø³‚i7¿%Àé1ú“©©Ê÷Ø…äÀô†Gÿªy) Ë×) êîW•ò¦ä”I|©›\ã@¿éÄ2³EI©Œp>d®^€j\¦êMôÏl+©©ì8Ö\¦ð·¼¿—^, •5Ö_Í¿ä5ÒtPO´! ι¼hý3ù•à³7<#ŠïDÓø}­¨àiºs­Â§@®Oˆø æ±Ï–èEœBfi FMåí2Îqpw'{Àeôpõª¬\#pZÞñÕ`”òG@àTô"‡0Ã+üœ‹À¡'c3 MÉ”¤µ­(…égè—¥ÏXvžŽÓTr9 ا$Y­·ƒ-µËø%«„ f´‰±~›¬ÀáøöûãäÁGa?º¦ß@CT ÏìüaÉ(œp).ÓqèG¸³ôq%4ê#ä‹[ñ’ 3±k…ùˆE‘6aWÙƒTýã‰Ó„|WÁµPÃÁÁÒæ¥r=EJp ¶Ø~‰ZÈáV ¹œÔÊXƒœÇKÁÉA‡ËÖ†Mæ=?ׯòÎQh¦U«JÏÑi4„¬ 9~RƒrHâùô Œ¨ž ÙìÆ˜ÍqÙ§ d»8¨QRã%=3=r„”Uü@éÔYÖ³y#IT:Î|°—Õ…è]¦Øª–SÁÍý0nvÝÕËü’ò3Ã!¥£Œöâý›©5nåMN·:[¹¿Ä-›Î áe<Ís”C HÂrÙ”8Øç>Ç {ÑJsTËiµ+.cRå¶H"Û¬ý×lFâ®E ë‚–ß}gZS¬}§Ä»SÂm)7QzÙs²õúáíŒñ•BL¢ ª0á—Äí»YÛ¬•nÝÃïg´wX`mân½ÞÕjÓtö`ÛXnYWy´ë¼ç¬•RW£ã+“nXôpIj9K«’Üå 1fr.ñÌsTŸ#øÈªSJùÀñ$ð• (ôÓie µÇ–ŸDŒÍ×G6–9K*½­Y¡’Yïm_l¦¥øF-EN‹CZPæœÝËuj–&“ÑltW[Í@&u¥œ²VXáÙZ/cÙ#½"*Ó¸|#Ì8æÚær {†Ö‚”mšù‰ß’EÁÕì7;ù,÷oÀTwë¯;㨊rQ¹ÆW^Y¾ÅP˜T?@å›4'AfÉT©W¾>b±ÎŽÿøxµcU”v”\£pßÝmehýåÎóã£T‰ÛH<>äÙ’ãýû•÷dÄð¶k¦#­fÊVC‚ Õ=Ÿg˜qšI[ó?Ö¦€ÑvcÝÊw%r³§m.…RéªAàFÎ"Y®;Yo $:ÇAó°¯’Så›Éz³§/ìªC)$·ùUÙ•ùÊ œj7øn¬{§Ü7zg+¶ºØ‘O1¼¶ëEO2ðI2s?‰/PzÛÊ·ºã­v-i‹)0‚M C)¬ô ¢Lºï‹â¢7nçZ]e™2µe =Õ—“W¼_ü´µ…Õùã}­C,n%(Ý&—è– 6¤Ô¼7ž-;LH–¸ÃCÅÓTƒA>ƒgÇd¬göã&ÇÎ%ô¹Ùe¬ºd?é©Îx³nBâ`¬wã%·ÍáÎÖtZ˜3Øu?ï%0L¾òâSþ=ê€ÈÉ·Ù˜~›7FsGêQ vÏ{ ú³÷wmîñÐU©µh:nÿð00& Lãnì_ÌßÑ™yAPu£ÞÙ—ªBtjpžˆ:§èVø¨ªÙí‡$,Úe3V,ÂmžºÁ¦€¹¾WHÏ]6‰¨Ò>«{gÐoªÏ¹$5B¦ÆVúªFöw"´-HTºŒ]œW€;-œ!ô¥‰wüßÏ?‘x.’}ó”õŠYlþï&{–}†û=íºZ”ñúø ËK.9Ò‰\B —{>ï¸g˜ŒkrÞËÓ‹Qv6Ì›w¡Éãrpâ鮉d`-}†¡\\¦Ÿd÷Æ4JJ±Å›Švš3õѱØû?&š¿px¯ÉK3·Üš„$x o>[j^ä âF¿Ôë™)pw¨ ;~Y‡ !®’;\Šw_ò˜Ã%¦. HH‹F3zTŒ)±„ïLEÚ&Qv¿þq-.ò£a@GÌÔà‘Í­døËm$%:µšýËæï¼ÔÐã2O±;_¶Ì_òº…ðÒ*¬äˆm'Æç¤øŽ?ÅòöoµCù¤a¬m…Þ¢™#gyß„ßß1‘áLÇŹ— e.¡õîSªP \¿<\s-3ž´4›¥ZÁÁÚuÐ:°>÷ÇøÞôcr¾¾a‰‡¬6ÚS²¡ ‹ó+»¤å/l5zîXˆ8@ ˆ˜™¯_ŒÃ¥|6ÝÓY$"ÕAL´*yØóo™¦RZîv}æ n-Q`»Û~¸—¼mÔ“øÖÒ—ÄÂTÈ*!4¼Ä_iã”A.É^¨Êœ ŸûÚ°À[oÂÞ j}I\T½éÄ®½éËÞʾ éÐUð¢dŠþB£­¨˜Ç‘­”Çv½/å{ò‘"’³GöÚ ÆÖ'ϧ}ƒynÌxF˜­eb| ^‚Äòk)W¦Þhu([å/&\©Þ›"–âùòƒhvà¼î£ËýØÝçþÌõpÁ6–¢&³œ®U×pûEíܹ!¥º¡„¡ò‡šòŸ~|lÿ“áÖ”m3ÃBw¢X¾¼‚„0RT®Ñ·'v¹Y1xõ»ä·‹®F@ˆÜí·LRb‘íÞºPø·,Ò±¿h CDF&||×Cg;ÿ_ #‡a endstream endobj 98 0 obj << /Length1 1719 /Length2 9093 /Length3 0 /Length 10194 /Filter /FlateDecode >> stream xÚvuT”_Ô5Ý Š4ÌÐ!ÝHwJ  C Ý ]ÒtHHI()  ÝÝ]ÒR/úë÷ûþx׬õ̳ÏÙ÷œ{î9û®‡NM“]Âf‘…ÙÃÙA@!€”²¦’–¹9€@.,-(Üò‹Aâä …Ù ý‹#å1ƒ?ؤÍàTe˜=@ÑÅâ€ø„@üB@ € ü‹sH›¹B-ÊE˜=Ä‹A æàáµ²†?dúëÀf€ùÙ~/HØAœ `3{€²Üb÷lf Є¡¸ÇB0=·†Ã„89ÝÜÜ8Ììœ9`NV¢Ìl7(Ü q†8¹B,¿Ê¨˜ÙAþ.Ž‹ e uþÃ¥ ³„»™9A[(bïü°ÈÅÞâxÈÐTP¨:@ìÿ +ýA`üy<èïp®þjÿ{± ³s0³÷€Ú[,¡¶€ª¬ÜÎ0³·øE4³u†=¬7s5ƒÚš™?~oÞ +¡0{¨ñÏ ÁNP¸3‡3ÔöW•œ¿Â<´Œ½…ÌÎbwÆúµ?i¨üpòœ·ø•=ÌÍÞël µ·°üUŠ…‹§¶=ÔÑ¢ ý'ëÁ„õÍ ð@‡ÆBw°5ç¯$ZßNÐ/óC>^0€åC)¨%äáËËÙÌ€;¹@|¼þíø/ÂP0`±‚ÚcýýÁ ±ü?LÔ`|Bøë÷÷›ñÜYÀìm=þ¡ÿn4§Ú e9Ö¿‹þÛ-) sx±sì\ÜÜ>?€Oàóß@Á_åÿ¶ª™AÿÜÞ¿*Ø[‚Tñp|Uâúçx0ý©fÀ3¨ÀÆ`úGF@^ øáú?ká÷’ÿŸ~Eù?¨àïIÖÅÖö7ƒé/ÊÿÃ0³ƒÚzüÉyløƒH”aR±ÿßT]ÈÚV†X@]ìþ·Wnö  {«‡gäàáûà u–…ºC,Ô p°õïáù«l¡ö5˜3ô×`ýÕ”¿} ¿z¸dœšöÛyسÊ؃a¿”ÈÅË0sr2óÀ>Œ//À ô Y ˆûï)prØÃàKú,aNX¿ZËÇà”úeúøAN¹¿‘àƒÏì$à4ÿ¦•ò/È à´úòq= _÷åÃQþCápZÿ ò8¡ÿ‚ámÿœvÿ@ÐC@‡¿!ð=Ünö¶Kø?VПÖ?fï/3÷CZGbaþ¯ø ë¿özØŒó¿ €þ/øp.ÿ@®‡D¿áZvqzHÿ­š‡>ý…߈;Œ53  ¿¶©yÝ|Y%A鯾1ÈÝɧýãÞ…–+Úqé³ Ù«RJžÜs¤,iµ>kÑJCdedÄ7”2Ñün¯%[8Ð "ɇSìsÔ>WÂ9Â`>vRÄE‘¥¼Ý‘òø"HWöCŸATj€P3FìG}i°µí¨ŠFIS–_©º=É,Hò3𻪼­¯ºÚxo«4Ð&04[±­~äŠQÑ»~ÿâqE ¡éÄd—$.¯ßxˆ¼æÈœR¿”_¨u ë§uË ñVÄv¶ÂˆÆ­S¶ÂÞ‹%äxß'OEœøÕI>E\>'IËN p}=‰Ç—0žFÜ"Ï£ùy<¦È ©h£ÃÃ'†n‡}XíÔíâtÉ#ú4t Ü¿“ègòhF­Ä§”c±Šm^¢XÌ1>OQX,܆ïà류õ(Kg?¢ÓfÜ—ö8žx3ÆÌ!ʾG>Ì")ÇÀÅûÀA†Š¾9ú×cWË›®ªÜÝ(åKmK;K!ÝFª¹0ïº |Aü<¼^5!,Šá®p·Z_Ñã3IE)j7¬>°îè;)8ûáIrs1U*Þ%­ÂõM…ÜšÙ1I7ÁH£oX«}Dªvµ_Zç‡QuÎ2Õð®*Œwa"IøàvísNã±ñr2M‹q[ç¯JOS[[Óyð€w‡üt4e}ÌaçE!ì„ËžV]¸y›é­x(„ãµã):ýÁ?jNý6R*ÑŠ½yÉ0+öo8库„ µ~ªK)sáåx¡e¦¢¨fdò;@sß¼sîÃ`úˆ‡öªQ‚‚†Y™Ïø²£VCÿåØ3›%÷J ãäëq© b×µæN CIçâ®À©ÎÁÚK̸¼…{V,x qªÖž_g àš´5ÂçÉ!4'_bQ®KÖâZCM‘2Ù«BtÊ~äæfÔA/C¶}Ê:ÙDMaw²]ziЧW=O Fì’#F: %¡Õ7XZ5Ÿ„ˆM Ŷ£Ý2®ä[iwd”3ù£O³ê'¾HÚnr¤tL°6ð´¢ <{|tßâú‘«}â9Öª¹'æ}7ºfG“¯TÇvp•zUH}ŒeR¼w ú½SÓenš´Ôú^rM²¤ ï›lŽáçI5;0W™ ™Ý‘}yÊXëê~«qÅûžUÀD¿aÝ^¼è6qãb/ƒCrRã1â°ìÞ¡ÀKÏ^dn<ëÑ!²ÃRà`ÍN)Å™Ô)| ›W=)âú€a…HwUOðÌ›5Òý*@æ´o¨£"«¸V±8ï\0 <X01û¡ËéXÝxSïƒçˆgf.â´ê0Y*m7Kö@kfVÌ©(}â’¼´H%WÛ¶¹ 6Û´LÝJ»jšÆñK*ÁùíøÇ ÍÌ=E~'tÎår¼ K7¬Éœ!Î"Õá3»2+õrñõJüûhò,Âk‘2#vžLg‹Eéòep½,‰Î=Pî‚°•¢ØG“᱓iÒ“oÇ¿ÃoCåà®cD:¥\D[yt(îÝtH`ºôM¸Þ”¢ARt,Íâ„ÓðlèP+´ÛçÖ(vÿ¶õá›Föãʶ©"2½ú}¹¢«nJC¸Çô—å°~~±Ú´òUá‰yNxS­/nÕÂ>Œýë6ùܺ±&œÍ¢uúͼëšÔ› úWE+«ogKÖË>ÙºkŠÙ;ÔšCÜWõFLè þñ¡>cåF’ëįÇb·¼ðMíÖ‡,ÜO¸¼Ùiäö;˜W?’ÈÏŠº—nic·óp|ð6à}jh ¼¥³å Æ^Bõ"}œ%?Ñ–¤w…}ØÇ½ï;ÌžuŽeçgôq}5^Þ„g ¬ùk ›õ4eŸ»ŒÉ}¤¡õK#GF󲂶ä&ÙijÊ7ë½C´{¬s“|ÝoE ñ¦(<^ &Úáj¤df 3xºÅðP‹$lJ£L'Wúè9Z‡ó Gè7¿1IëpoQØÀNHèñ/òÃÖ$= rKCáovY¯ÞûóLam~]a)ÇkŸaŒu|„µ“…,'+ ç»íuFŠÀ†eæ¢IBÞ¼˜d¿•t]‚Vy®yò Ÿ^áîšÆ*¬îHM® ] íA ¦ï:^¶$(Y_êé5 f{zõCÖ¯÷ò‹+4Q2ú¢t¬îE1?¾Ç5B1øÒŒí‚}ÎÝSª›­=±op~m¦µ÷$[Å—…ÀǰˆªñØaq¸ëRšT2ÝPÉSŠÝú¹RùÔ¦QT¿±”`‡ŒÄzè˜GñºàþªX„_íìt‚ÂÐT×ÖB€fïÓ±$z†MÚdµãÄrÊÔ[ƒÄ iqÏ|[<‹Ö&˾¼”ãR®–eŸïªÓÑšB~NàÒåb1ùûS¢PöÇã(”a1ˆÜׄB6k)f·(ú6qùISš—ÙiËÉÊdÎp|‹¿oÕ+l?:¬B¸¸¥¸¿Hu·7“¥OúÐêÌÉOT_Ô/¬Âö(¢¡˜ŸœŽ NòãOŸ5À>^º@g‡¶ß7ñsg,µ”MðEè¯GÜˆçæ†P¡vµ„ДÅS-[cvrñ-4.&*M#郯¢8ÎÊØ¸,VŽÇV‹ÝR—™y°Ð\âfƒØoÈ 5Lîêù‰Ý'³Ok¶ ?Æ^g¯BÐ@“ó½d ~îÂcìñK*1º{&þùÍG‰œ§ûwa±¢`\:<×ÑoϵîrHÇëlï¥J·¥‚Û,­€'®}{…v®B‘i¦Xî‘…Z ]S{Ý òY—ÛGR.çô{k´³3XÏ™–ßÉ”XâL- ¿·^JÒ‡ìÆôº,oøjÄ$7Š#6©ïÀø§ìN›ç¢'a¤LñKmÈóÏ<ó§(6ñ×r¼ŒXôŽOCÕX»‰ÝvŸ8JLQeN{ Û½¿g™¤7ÎÝëÐá”De…|¥ä5ódy!]+ðTƒœŸ¡ŽÜé¾¶6×ÒqBu‹X檟*‘sküþòÌ7/#Ç£ñÁx')vƒj×lm¼ãVJåH®/¢/íÄN%l]ÒÞ-Å—ÑTˆvrdRVoEèÙ¬‹d ¡¬ÂG§0CYØbTôK°âÓ^¡”û›¢l4P ÓM£rÃBrü’º.ék’ïÂíÙõüî"sš(TÉ­ïfvE¾f!@‚y“¨Xë˵p²ŽvYÌ{4:n½N£x=΀֎ð¤ÍÙŠPA/ÙŸŸÝó± ü 8 @Þ—½á®_V•Lµû³¾.Ë‚Ô7D²¨ÜŽÔý—*Ù·Ú“…£·ÂMù?øº 0ß>Û¡JjAB#ÖDoRFMïF¼,Á†Übú^¡úlVg Hój™]Ö*åR.X]YÖzk¹!ö ³(éòJVXÉXί¤fLûód²ׯŽáäf# žq†ÍÂL‰Šè=•râŽÏÇ™ŠjÖOï±[Fq'ŠÃÜ ºys¿ø¸’õH > pó&sÏÅ$Œ¤†žµzT:H·U bœ·—€¼Ê¯ÖZ·&¤ƒ[ZÎ'ïÈl'4ʨï ÁÀƒR{uÅÛéF£ Œ•U¦(‘Qk>FoõÁ–O÷…¾ö·ßÞp¡¾vdkÜ2’ìñ‡UD:ˆ r¾îØCα¶é—]ަð k•äo¥ÍÁ‘•¨¨@Ëës9Cº(¤Û˜¶w[ÖÞ.¸%É*!1±[¨ÿàbËŠ_˳ ‘½’Gyg»A¾³«$š¥KYŸbÓGài9ï9t{“°z÷“ÄòIŒ3;ôJô$ÊOÍÏø ǾQ>®f‡XÔÖqhº,‹ÈFó×1¦}×·/”ãßcìAæ”ä©ð#AU™k^UŽÆÍr8&'¬1+Bïüén±ÐO,1 ˆxy1±¾Jxö¶cÞ<XÀ=Õ\LjG:då®Uç ·2¯öBŠ-Óœˆ’B˜"ÊãË òÿ.‰ì{$¤&JÆo¦Gÿv‘ 2¨Òšp ›ù!Ý>M°¤`,6°Ÿg£ZpùŒ––¥÷¸T³¸œkÂK}F`çüÖgO!X&s¾‹þb“ðý¥Q¡Ïó]9œ \Ý:=&%·ˆ­ÓÀƒ¦DƒÖ—ñGUßãE’\íËOˆóŽ¥à‹=# ˜ÔÔ}—KKtØ”þiIºÑ¬Œ.ÿ¾…(}e*²Šë…Û¨pöʉ£ÑÔ •ª8Ž»r…rEü®ÑZuMà6ñmض@PWµ´¹¸¦¯ÖÜÛvùò‰•Mw…Ãy&6Iç–ÜÙ‘b£¡INöOüé¹r¹.ÞfPï•›s4~ñXÔß•âï™ïë#õmW¬Š©=¡^ رq?Í$TeÊlø„juVDÊVÊ [^¯V%¼}ô ¡¥1\É}êFõL d6Ÿªœx_Z˜$…Þ´SŒ¸Ðü!7â^ÚvᆿÅÔi‡?ò¥jáÊ—·rù0-Ì >Ó•/gtO¦ÊÈjÄšò‡!"º­ ñŒ-}-ÎKºÇèZÎU”ÏwÓ8H‰ Äǽ¤b¨f×Ï8QÛ&e¨¿d®ñ)Ú^õQ‡÷^­ÌÕÅD^{„ŽÇ?Þå猕†Ü;ÖFkK´.À½ÀÆê}^×ß_q¦jac.qp_ }eòÆ#¯§×1NÜ’Œ30¶VÖI­™EéV‹Ý‹÷ŸäÏâ¶'ÞþþA¼ÒÎù–»]ƒ²~ÔÀ”B`£¶O‹ø©D‹ ü¹H<˜Ú.UœÙä€|ú…l^kì žÜ(z‘ð±î8˜4í¹r” p%°ëÜûCLò‡Aa$ÞžÄD°UìOz}qJyoSfÌHªwÌîu»f1õýÅ­¼AÝ­Šùeºâ‰ô¹²T¹q†ç“¯š…ØÄ>3¡teâÊy“u+¾ˆo‘0ŽJH4ñž‹y”GF~Aéý5âÓ™š{bu—e0㸋oÓ¸û€œYuÄï1·f¥ÝI¬ Š9f÷Z§^#îFÓÜvç´Ñí0ϯè4¨ÁîqÓ~ßD™$)plµ¿häqr€ÝòÞ–¾UÎý.åzW*T`pgÂ_ùB`#4î.wgùÚÈÍdØ·®ap»VÍ”ø™"B:žs{´‡TÒâP]€Õ>ßœ:i«Øã©Õ2ÝînÖj3aßÁˆ•¥vÌ&ɰÙfÅÍ5NGqªFÉ>’¶š)¬†—%-Z ü‰¶Å­5Þž8%„fݦšž7.×oDy"ìË1}Þkð³Óx’‰ Œl– %3/²dBÏtÄáÅ¢DáÁ€õ}¼ß/“Œª»ÐØ[«iø>Îç.B ,Leû2n7SMa‚ã>,•·V0íö‰PAAX-B²eìmWeø¤gæÊ7O=ð3ÒÔ³Åùõ 1Á˜ý/Æ€æj¡èÇZ¸g£7Ÿ‡1%ŒzçÆ“AÎþØgôNà6¾Hq&¶³Ö“öÒ…³…¼3(Ú¬DÃè" 'K/QK…}î¸a˜áõiøêýÒ©Æû¼º¼×'‰qòÆé¬Oñ|’´éqú:.p~ÞïƒMa[gWV:Ï·¹9 Ô¥Èü)‹«Ì·îî2oÂq®`–º¨9:5óq„çýš×y%›<ÔÉ9háì È2¼mÂ5ðѪ%’{ï×Ñ äèH11ÁõsŸÉãfè”  Ê+3\ñ+µjžÒŠ.mY¯cî ÓëYŸòzn€6JõÞ(^¸!JÄŽ‹$â¡.= \wœ„pWÙ÷INDùãL­~DL)üœk¶•Äâ÷ù¢ôé@B“— úÖW‹ÏÉ4¶­ºm/ÚZU6°ŠÎ¡Ç)¹³Ñ€Ž}<±¦:„PÚz©f›*¤ÈŠ,s9êa£ªõ¡Z)¯O l OǦÃ'_öË÷Êš¬(E.Ùg ãj…}ô~ÓBË÷¬ŒÂs¡ÄCd»ßž,!“º13Qh—igñZ­4]“Ò1C™ëØÌ\rnÖq£D°^°ˆ$ÃÑœh,™ÚðÆ}_MÏTÛ(ê“J%H¬mþ­£ìS>÷”[¢o´«´_ à1<KˆÅŸÿj°·Ü´_ ±æ£6ÍÚyP;9ÀrƱ*1ïå׊$÷Â÷Oo§ï…óŠløM‹Ûì<Ù©À6TúØRJÇŠqéÔ‰ÍN]Ås³Ý'wÊä®P3œª$%›µ34ì^ Ò5Ý÷Ÿ¨ÿà0(ÿÒä9ÕGýÖ+ñ¤…Húò˜%`“ÿ{ê%Ýîé*i‘×5ÝUèr¿TîZ©”…r•O G¨(+ºáïœh÷ªôL‰Þ×´„ö/Ö?š³€_Li\_¬‰~Q=ˆ3&%©F â=B_7È¥¼¼©ª'YPÝú’ʇ‘˜‡zt ™‰0f‡2Øz·Å‡Ø_Ö~Ýü„uô¥¦âEJöª¢u¶ 'Ÿ«ºR䪥ç}à  Iµ`<³×z§i',(›þs-Å‘a:ϲý ¹p‰ÇÔœâ6O~ôÚþØiœÇívÞßsµ;(;Eu±·v^áÉ™‚9.µr~ Hå«ñxAÙÞ)ö:‡ÑxpwÉz¨ÑÍdmù}›\úÁz–L½ˆ»(-U}B·gû­”õÑ7c$™Ö„iü7fhjWQëÏfÏ8ˆ«ÅÕq’­¦*ú0JpJ.Ä\2}惞O3Âúò=÷>Ï$ê|'i†•3P„‡xi÷[ ±#ñ#0d-ˆ' |VK¾î •éJ!ë ¢­Ê¸î4Ž“5a~ðœ#;'^”¾óFú -Ò ÂQiñxÇ[vC¬AÚ¥9Âe-ÝÄ´Ä$s°5ØèçÙ6×m€Jôiý˜©‹¬ãw'ôÏó&ÿ½:¿" endstream endobj 100 0 obj << /Length1 1401 /Length2 5903 /Length3 0 /Length 6858 /Filter /FlateDecode >> stream xÚxTSëÒ6"½wÒkÒ¥÷Þ›H !@H„R¥IoÒ¤)ÒQª€té Ò¤+"è=ž{ï¹ÿ¿Ö÷­¬•ìwæ™™÷y白÷ 7‡‘©°²ÊªBb„A"@Y€ª¾©5ÅE€@1bnn38ýÛNÌmõDÃQHÙÿ@¨zBÁ¬M ŒÁõQH€Ž€$eAR²@ @ ”ùˆò”¨½áN}€ Es«¢<ü<áÎ.l¿/|~HFFJèw8@Ùê ‡€‘}0Æꎭ#¦(ŠñûG ¾;.Œ‡¬¨¨Ø-‚òtVàøÀ1.(êé uü¢ 0»CÿP!昹ÀÑ9LQ0ŒØ Àp‰Æ†x! žlu€©¶ÀЊü ¬÷@ðçp пÒý‰þ•Žü †@Pî`¤é €ÁP€¡†žÆ##~Á4 öÃ`G,à÷ÖÁ ecËð?4ÄîA‹ áˆ_E¥Á³:ÒIåîEbÐÄ¿ö§÷„B°çî'ú§¹nH”2àï Žt‚ý¢áäå!jŽ„ß÷‚j«ýÁ`MÄÿ¶9C1  Œ¤¤½€úB\D0óó€þvþ6c9x <0, hÅþ ÁÞPÆÓ 🎮ˆA €‚8BáHâgÇš¡°¿ÖØþ{Â}6@¬ü@à¯Ï¿®l± sB!~ÿ†ÿn±¨•šŽ¥†ªàÊÿrª¨ |Âb2aI I¤¤$AÿÌó¯ø›ýo«þgwÿ‘Q Cdþ"=½¿‰xÿQߟ±áü³‚ «g(€ïßò¿”B°_ ÿóüùÿiÿW–ÿUþÿ½# /â·Ÿï/Àÿã»Ã~X={a°³¡ÂNò¿¡–пZê÷rÿo¯6Œe¤3Vç Û"ÀÛÙáh ¸/ÔÉޏü¥¥¿›­€#¡F(4ü×}þ—;z7ì½mÙo;Yÿ¬«Ž„ œ~ ˜„$ìé ö#Æ*»’€°³êõý-q€¨…Á†°ƒ0”'ñ¯Æ‚€’QG°ç/+ñ?2C¼<=±Ã÷[ز¯O:ê …/Ì¢ r®Ï#:Îë”™}„7G VV»b’¬û£%0æ{ïUnèr†VG½]åP¸pèÛñ+g(›ŠÉy\êqÌ:åçdcVr|ÞTËÙˇR=â[Ï>_u¡·îÊìÜ¥§̘xåü®=ÜGÖ\«˜aë{ Tž6™^fÚæãW¸à g*qŒßüÖm²†ß¿;ÐÿXü¨H··V²&’š‘Æ_‡#$e‘69Wç‡GEâTµ"=‰“±Ä=’gÏAjùûtÑ@{ò ¸W“³jèMÃoš½P³òù=ËG,ö9fßDIZRb\„ês©p×:áœg~®GôâÓ±º–~êO£ÊÊϬõp›ã„‹Û}œ`8wˆÏN‰Ù¦Ë#¤?³Z˜~+A´õ핲ãÈÊ"ëÄ™7EVFê‡zWbëöb­7kZ+PZéÄ zß)Fš¡]Þî/ÆÀvéùé…¥;«I¶zÚQéAVkâ4îÉwž´õL»ÆOº{Áz”¸&. glùŽ_Jkƃ£¤ªç¶€Ò’¥>¢oØ *\6Ϋ¿wÀÞt†Pd,Gs~ª± 6©þh[é¹Añ^¡[i84•À¡}3îùôóï[ _M(Øc¦-岺ß|ÉôRâ»U‰xSF=}ÓüIn@àúׯÆA`ñMr^z×±´/~53añ&EËR¹¼§fM®cÑbyâ©jÛ0M¸ªáñ’w[þ~ŠbOC»\Zn½üÈ;¡ˆõ²ª®{œUßšÓ³é'M®{›¨¦Ï—à竹3’M+Ù åÒä’wºQÑÅ;Â[ÊÚçFv¸• Y> ÙÔ¥NÚCZþn|3ñpßïIl±C¡û¦ÃæFÚ °Ý±ŠQ4ÓC’O£Öµ…¢ûÞ¯Çm [¿Ï³µèq*íei…G¦RÝY6âMÐy:²ì<#4ÀÕÈéb^¦¯xÒ°§¸šê!0!åM6G/¿dB­k’§*¤HØŠ§Ç˜m6HÃÚ"L~Æ¥Qá­†ü¤Õ@©éSÜdoDh’_¤˜ø?¥>>†íDMØQª¹¼;¹³Q•µ¦’>²;tñr`!-ãU=ö[^«³|6ýLÉÂ&Zd’ºÏÎøñšnôåm7CyúƒUJ³æ€”òw¡÷F(õGËôÝpßf IÝdzYä Ø?»x16¿=}Õf7Çõ‚'nóøÈ–R‘ž¸ñÝÊñJ4imÍŽ?›Ãl³/LzŒ»Zýia¢a•.´Ó”³P.q;ýÒËÇ4†XYâ(KREžr©È¹”e¶NT“•X?ÞÁùpò¬‚ÚV”`T88( zr`H©`:CðK6œìÚU<æZZoœþ0PIjP†óÙ…ý­rç0€Ó:·jPL¶±Ym±¸16Þ ®È¶=ÙVœ"Á=8rÄ"R3]($“F{÷Ø—˜ì¼iI2Øáp{œÝx•Ä|Öê)yÖñJ®¤ánÆv÷À†÷<›Œ‰e]“VŠŸ‡“ÚÐÜ: Õ•ñ”;!{ha[ý>ÇÑ_SU‘“;,ú¾Ä‡c»>cT2~¤ÄÄh›ëã‹VÙŸoù‡:ÔoÍo—8ñV÷nv3 ·6“¼ÃeîpIŠZèfŽ›GOâ>ò°öî%S_‘™ôøË“…xÈÈqÓ8Šf·:6GO«äm›î»“ãæ|þ̯„÷óç– Ö~éý£í%9׈©íõßÄ]9+5©,®˜yOrÇë'N+0¦åCÅäNŠïë­hñ©ù­Ãö¹X6Y¿<И¿³­Ô±ãÖ°ÔK¸brÀ·83n'6ÏMÄU¾¼Úwhlj#ßAº‡£¦_ïWÜf4Þl£­‰(ôË£LM\ôf§ú,ø ©¸€­/M½ ’ðöù^ŠþÀÞœhÍ)+Ýfþ!Þ¥4;rÁHµqÇÛàÓ§¦dIé>é'‚|Û&P¡2}Ò˸4ÁÀ­:¾V‹™/+±šåÕ©0]³%ÿ²gýüwMÎÞÊÛ#‘Vú€R¾n†ÞôúÈÏŒþ¢ïšü§ôzïF¶Æ¨]c¸-Lþm¨~àÑËt×ô¢åXyp5ªš(ºáõ*ã|‹òFZë«N ¢«~LëªÐÇ,Ô=¦_ÄúÐ(F ñ Z‘X +íÂñq[Œb`;×ñK•'Â9ã'z?‡qYç„6VõZ(»©¨bü·¤ú»Kœ~ºú™eLJö6Y¸~|¼Êx¿ì³ê0còqòçù—mÙ×dü¯·ošE«.‹öa´%÷gF^/C± <–‰ðŸÑ~Tˆr­5?Ð=¥öu-l¹!D0z.誛}þ…¤W;¡¦÷Ùø.žxèY³‘0uÒqÔÉ{gºs…*¼='‹+ P—¸õØ)êK1*!#ÀVµRëžÆ gމh§¨6œéë®±o… ¾‡Œ–ŒÖ Ž¤ûu}ŒßÇ{ä €ì¨ÉÂDfc£óÆzöêIô,bœ¼þyyîNJƒ‘ÚrÓì‹p–:$µWØ?3~g fÚðxyÚŸÀ6LHˆNÁ•ð± OÄc™}Æÿå#K‘YáNé©H· È­ªêM¬ëûàª""f$П¾Róë*ûý˜‰{à Kãnÿˆiç­óVÅLE=âm?`_×Süé[1ý6©·ŠYÃÕn©¿ Kñð¨Õ¨*ÿZ¿œéýÙÓpÚi )…¼YL9…“ ¨eÞ·’ýÚµ¥0Ø‘-+0º¬Ç çí•Iá§¸Ê ²ж£nðO,*§8÷Öé ì†Zéöà.Y4óú/Ü=~£ÌºÈùétüfÃŒYGeoVÒ’ÞØ ™ÎÞç£;5xù•Mé¡,úNÞ»±Ž/4ËæQ98·¾IXDìÁ&Ícwï…]NÊÿŒËƾÏôHõl£³e¾”±%ml¦ ³ :{(‡Õ ½’t­“ T “Êù:C’ò9£¶éñ< E°ÈލF93óPë°(c’»Ú‹+ÂÉâ%qabì&3 yݘu÷8ú¤…jTª«_Ëýi¸«<,^¶fL»Ó­Âfqò€ëPF½¨.ÉUžø‘­" j;/Àçz­=¹„øY‰Æ'çéî†Ûy*YÛ9ûÊåUT«÷Ÿ޳¯¼\ž¼ÝDËUœ4ñ ôÌÆðöFõ±Ð¬iäÉzÇu–'žÅe6Éï_y;| éhªÿOÒì{¦Éõ³€9¢dw\$¨°uìæ›´åôïÆ»4F³Ò uõÙÉaò 5¯`ôרF:+ED·|úbL¤Ûø”eû“BZ:•z x´Ý翪`ÅñÚ=úeXi AGfù“sÊBUkûò ]`\Í¢ᢵXÝraÂäžú»q¹¹qÙÞÞ«¥Å?„ÀZ /j)ÚUñ-3”ŽFŽ¿‹ç>ö`G×>I5þ˜ƒï¸ZN+êq|­éø ‹Yêý.Ii|û3Ê”)ÝÈ=jã·„?‹ÜuxüåîÌt焺­ÛÀ¥ÞŒÓ5îå>ýÂ+@wuß*Äìòs‡y&ÎíH”H±BÌ‘?dvÒZ{¾ºVtîw‹o½Ö{1 ’™¢Œ£Ã˜-Wȃ^ñm=m©T VÏx>ú¬¾òÙ3¹èl¨Ëoü”ë‚ë¹< Ó‡°¹\Å]'%q?…­x%SÙî Ë ·€~K/SÖNI¾œªÓÓÕÌëCžŒu ׫ J&ŠîhÈC4+&ý@“÷lMõ^F›?~ ÿ)Á\{ölÊ"þú¾Ö‹œ’¦›úúmÄM ¤÷¼yšk‡ÏTW6Å pšõî¢|ÌŒ¼’éÐmãuçFù…ój* Í=®×øj~nÄÙ®;)XÕ1eÝ•¢VVñ¥ŸÁ˜™³õåœÝe^QñYk 'Å!ž}ý$ç0C»õQy‚HK¶ñÙ“Uk-VGPjÓZ»Ö`@‹Oø ‰õd6#™ñ.ò·Zj GLŠG„~“[iŒ–¹5äÛÃzT¢NN 5uç\4Ú´àkÛïF‡¨šÑù/OÁnlݸ3‘wzÍá6ö©¬šÕáí¸Z}Ïådrƒ€<Œp1ø^y嚘¬|ŒòÒ‘Ï ¦Øm<ò^Ýí> Ö]² ÈÕŸ^WœKŒ¯Ð?²ý&kÉ(GCéÍžô"óºÕšÜõö”1eVÔ‰"F«ÚrŠfÅÑ‘›/Ðtûx§æ¶ÏÂSä'­bܼJ‘h|â¢Qð“¯XuTÅëz`GÚ‰égVö¬/Dð6Ÿ÷—¦__»wr6_0Ģл^h”Ê#…ÁãžziúËé:ß^<žŒg“{áÅÏ¹Ó wñÎ4=£Ç»säðò«êƒÅnðvÑ NIs‘: Âî‰à;]ãé #çðtÕ¤ü^èôÎòA¸/JÇvu®’ãÏ¥¤á{‘ Gù!˜½‘` ÊÃ"‹µ‘ŠÁjÊ’Õ5//Y¥bÌÑaÙÏf+ü¶6‡ûR Í âT%.5=×Ì ú($Þp%F=Žã ¬KlêŽ%zþ^³rc^:ÿñ.ia-¾÷æ Ÿ+=¦,|}@úe¼ùå Çv̶ß÷%ÃCÃùd¦hw2‘¸§ 5‡7Llºè'2Qw\o}$úÁ¶Õת¡ž'{)ÄN~øðž~pd–OvšX¯xú0rúnÖm6Ýhç(üŠþí➊-rj¥¸\³ê4À /ø”“{@7ÐÁX7èCÑëõ#/µÈÜÔ² cž«>i‘«Ù²ö-G&oˆ`°z· "ÉDi4BæÄªÕHaé|rC[cKV±“6ŸD`jn8 sSu·)ùPe(¥êfyáVRTщ;bUËþük)].9mÏó²çsKÒz('×%ô™8E”IÖ-f¦/“^«t'ZAu©úCƒ ¢,§8é€~Û£8÷Ö<Ñ(Æ›_(òÛçhKœ˜¼YãFXgœþ`÷AyPŸìdqd©÷åIi(¢Æû\ÈeÖŽj8s^9§ªÄæÅõ/}J8‘S±3N4¬HÿÖ- rS¼!Ü ÙŽÇõbE{€l÷g½!ô‡Ã[böL®—+aAÂ2´Æ¢}%›ú Ð|ÅùWƒC»SuMר(ö]6ðlcK»o\í´ïVÙïŠÝ™<ÍħØÇ°ôTÖÙŒçÖG3êþ¨0T*æÖOÖ[Þ!Å”6Í{„GÎÜcju\Ÿì=ҷРJütÓÞ³”Q€eU¼PLœ÷5Ÿˆc¢š«~¶ºVF–ör–5~<ù”4K\08dC;­ëR€›`MEÛÀ?’r£]ù‘z‹;˜P+åŽPµïXà ºí{P¢•GC—r}#jþúèKÙÍÖ»’ qÜ…–']L…-ïR%’áé0ð¾¨;–/ßxçc°™×FTÊÆpJ¬mDøôÚOĨc9t—Åc&F8í6'¿9ßÿ!¬‡©ðÉypÊÿ†AæDrÜ4Ñ3ª#{¡ë±7 ¿}Ùs &*óHÉ hY)×–¤WÍнRÅõ©Ës§!¬z7lú–ë™ñw¶IU½“¢ãä:ßLŸºJYj´,ç\ç!}À±¡žª0Ø,ç€OÞOâýûœ}±ÖÌæ2K`û9 ŠË©ùØœÉ5~¥Š Â/öãí;#ëådœLçu×Ïžæ¹™gjåSGÁ­W†‘¶óˆZß¼’>Gë’VÏU)ºÕtÙ _EÁrøœ•|la¥Y#=6»Áöâ@ßvØìȕŽ«o ®æxOÕ²4‹]ó&!ö¿Ø4kY¾.¼§q¼ušsÍ&ÇßowýÕÈnŒ‡g¹›>É %¥(ÏË'â陈ÞáŒéÙÇ>nÖÐþmQ“Áóå…—•œ bM^Ä™êЉsÁ¾…:tÙÝ#^&"šúÖ²¯™¶£Ÿ3Ö™"¨ \ûOIŒLþ„ÞŒ8Ë!k¸E¨uýïÐÆFl]®ŸÑ©ï ­C-Ħ(åõéQÔü4¡:A‹ŲSLæ b“- C è¹×©œäÝÆ–mO ¯¾N&ß0ôÿÞ&i9v…¤UYó\®¼›Ÿ§NÜߕߓ¢J³fÈj<=}¸+¤,Ö^шMÍU¼|›µJj F‹4l=7kkLÊ$ýmV”7c›búÀ¹í¾`«v¾öijòÈÛé½/¦oƒÏEHm9/‡¦Ç¾¼gÛ›xÔï õj¦ƒà΂¥" ßI.¤êK3O>Îë*å<í^7Êúó¤Ÿoã§ðþ‰î¾øÒiá·“j¼:¿¼™$ç¦T×ï~ÛIYD ^äe€~¬£:Ê;—¯Üt“LXíqµÂS»:ý6@ û\¿$÷ÍÉ1´§ð\øÊ{‡`Ôa1Ýz¤ºz©©ˆá NßÂïå§Ä…ãÁ îµ…×Õø€IŸ¾£]w¹ëÞ5B|R¡IãaJq™4TC-âvtàœ4HpX¥ßò„¸.Z" V‡}óKØîÝð¼!¯^PüÃ0Œž$‚6·B6!Í;ÞèÌùE«¿¨ƒD mi ûÅk×ÕòòÿŽsKÊ endstream endobj 102 0 obj << /Length1 1930 /Length2 14793 /Length3 0 /Length 15978 /Filter /FlateDecode >> stream xÚ÷PÚÒ€‹âînÁÝ%¸»;„à0¸3¸{pO‚{pw·àîî îzÙrÎÞç¯êÞ¢ æëÕ¾º×”¤ÊjŒ"¦öÆ@I{;#+ /@LA]†•ÀÂÂÎĆ@I©n ²þGŽ@© tr¶´·ãý—†˜Ðô.7½+*ØÛd]l¬ìV.^Ö¼,,6žÿ(Ú;ñÄ\-M LY{; 3¥˜½ƒ‡“¥¹è=Î>hLh¬<<þ4ˆØ,MŒì F  í{D#€š½‰%äñ?.hø-@ ^ff777&#[g&{'sAZ€›%È  t:¹M” P4²þ]%@ÝÂÒù¯5{3›‘ð.°±4Ú9¿›¸Ø™ïÑj2ò% Ý_Êò)0þn€•‰õ¿îþ¶þѥݟÆF&&ö¶Fv–væ3K @IRž äbÙ™þ¡hdãlÿnoäjdicdü®ðgêFI€Ñ{…×çlâdérfr¶´ù£Fæ?ܼ·YÂÎTÌÞÖhrFø#?qK' É{ß=˜ÿ¾\k;{7;¯ÿ™¥©Ùe˜º80kØY:ºeÄÿÖy!ü#3‚œ,,,ÜlÜ #ènbÁüGuàŸ‡¬ˆßkðñr°w˜½—ô±4¾ÿAðr6r@N.@¯ü/!°²L-M@c ¹¥Â?ÞßÅ@³¿øýþ,ÝŸYÞÇÀòÇÏ?é½O˜©½Ç?ê^1³ŠŽŒˆ†(ýß%ÿ÷PTÔÞàÅÈÎ `dãd°²²q>¾ðù_?ÿíÀªÿSªldùwvÿò(cgfàù«ˆ÷îý§׿'ƒæïµ¡üoEû÷yhþ]N“÷_¬ÿŸ—àO“ÿ³ÿ‡—ÿ×ñÿ¿IºØØüyNó—ÂÿϹ‘­¥Çßïóìzß û÷ ±û¿ªZÀ¿ZhjébûOe@Fï;"bgþ>猬L,É-%-ݦʖ ‹¿fé?—ñÃÆÒ¨lïlùÇ»ónÅÂòÎÞWÏÄúýmq~¿²?€ï›õ¿q%ìLìMÿXA6N.€‘““‘Âû¼'À‹õ}WMîŽ8€™ÉÎônx¯Ñ`fï„ðÇÅrq˜EþýE\fшÀ,þñ˜%þKYÌ’ÿ+€Yêb0KÿCï>åÿ¡f…è=‚â‰ûÝNõb0«ýCfõÿÏ»£èÝ‹ñ?ôž§É‰ãÝîý²ýGû.3›þ ßsþ ß“0û¾gaþ/|wgñ/|ïžå¿ð=›á{&¶ÿàûÆ2Ûý ßãÚÿ ßã:ü“ö{ÓÞ—Äþ_‰¾1;þ ßSqú¾§âü/|wú¾7Ìå_øž¨ë¿ð=Q·í=3?ñFÍÄÅÉéý5þóMxŸÃÿðŸO?è4AXš·7á ¶ª n»¯!tcÜgã@¸†ÓÚ•Àw=P ã¸bÏ‹\éšÝ|ØÄ8a+zk´ÖÆa±ÖßðN‰äÅYªkƒ63ÞaðžÄxºNñ¢–ˆ¥dõOvNê’žÒR)LIxÄŸ‹ð’S¿‚k˜²Ðå¼å«‡¦ôÕ“3fR FÒ0”Õ®¼X§LàG"ƒœb,DÛ?ìø©eFÃZ-جN€ª5òÛzQ¥)IQ#.žˆOÈ5󉼹&NG¥x,s°¿>1·Q37b$0Ÿ€UŸâôš>fÛϳ^õÿÔ‰4úòs¡'<³ÚÉUžÌÁRíñ+cQ!^®ùAC˜è²uKØ Ÿ*¹xòÓÌM†a¸ B÷J®3ú”¥ÙÌKóÑH˜Þ[p-?Ä<Ïçê_–oi_m2ε¾½…|Ш5‹@,õ™ÈqŒÖ7a.KöúR;ÂÕã{¶!!«ÖYSò³Öõ†"©öÚ²–Œâ¢F) !7•$KsI%^èlíŽ ì²´Œ«Ä%¼hdÜУÆÅ7¯¦ l›¸|'ï+ÏMç^o5ù˜‚@¬“1ÆåÌ`é_+²ñ RãIñ¯Ý€œY29’µúƒÛ‘:œæùX¶vFÙ8JSç'F@°=Þ |í„«YQš°I f+Tæ“'> }n%Iuî"±ÏE‚ky]>íÊ}ð÷ûÆë³„ÖÎì°¤gö»F{ÉÆì2ñQrÜ{Ðû €(Âz‰ªÒŸŒZÅÌöÊ PÃ>JÝk->fÖÿ6cª)Š÷Ùh=_Ö³¶I:‰%Ö%cÛ¿zR­qÅ>Šù“!,µ9-'ÖpɯnU jÖ§$'©vÒäfOõœS¯¸IÆaQ½¹gIņ=þÄw á/z܈¹eYª ×Ê×uZu?ÁÇÚ=õ$Ѱes:=Wj÷åǽÉÄ$ªÜ|D÷ÓûÚ Ž*X*Ø©®\C8Tx]ä¾»µ_ÓÛ‰ÍúºvÞ΃ìÁ2ky¿Õ2 {’èÂâÂã>m—8ïÕtŸOLTâøâšŽtaµÅ÷8ü°‚§¹@Šßìò;š² ÷_òÌQä|þA„2}Å0BÁÆLö ëÊ̯0‹+‡„’V•rØx{ɪ8;ˆ 6Äö ;­ÞnDB…QŒyÌù«\ãì›x@ùe½nY €*;îö£© é§•ñ˜žV…/*50ãÉÌšs¦µ[àpk=ô¯¢«Ø•ZøTA2g«D27"7…˜tÍÅ€^-èªÞCtÂË[Ôü*t ë"-¶y)ª½hõz M~ŠbuóBù“Å—¨kO¡3ýºçj¾²¶êÕßÇ×£Œ‹÷¾ËqûôÐnÆŽÊ ©T’X>w¤M‰(èešÍiï 5¸ëGZ6ß§ìŸÛi>žä®R7½ÐLu© Å㥌1a!±ÊC1Õ¹5ŒZ…†¬K——¾Ý‘‹E3š àÂV˜­Ñ"¨'ÖHH…ú=…áÓd\$°‚ì…$ Íg8SºyJâcëPHý¯'¥>9õRÌçìβ®äw»úî±Ú¹-xO¬>X§‹ï™…q[1ÝŸÚü®ìAõ¶ñFGG*®e.½_Må£N¡aSÖã‡ß²»›©ž½G°Ñý)ö¼è¿É›—¼•NíÍ8ãè‚=Ï Ü/L"¢?I„OŒÕ°/C)ø‘K”|ÿ“%—3ÙŽ¤¥Øßµ\0–ŽÔ€ þìÐ@Ï1ê»y6Ñé4DË'Ëל:õeS–­þxÚC‰õnŒ˜EÍrp¦[tŒ¡Ðâ%Š 0ïÚèï?”¤· bÑ/Ö…Üu˜¿æ¥}A|y >î ­1¯Cö§6ër¬uk -¤ËåêÌ=în¨ § ²øÉÁ^h·?}gðüþÐç9Ù »ÿ£’’•49l »¡ª6T‹ÌÁeâd{m¤êÄZ´±ãôü\…),Fƒ¨ŸÑˆ jØzSÕgù9&Â8óšëD5­}"›Û(¼;7»'ÝÜðŽL(VY@€Üá}¾H¤é„ÿÑë[$…íìJlå—2œh]ªŒhN´Ã|ŽW+3zug §FœÝÐìyL’ˆ¤~Æ@¡Y<Ńn5vº¢³Qû†öáÍ“s»c£±<7¢â8Zñ{)eZÊÚdüvëÔ+?Þ»PµåâE ñ·_ËULÄ⢕†3ǃGûD„›Ûþ•uä>¥ªd0<ì•)̹Ý2ù¡Ð8•m-˜ -S€,t&2¨¬6x:þtÆœµ*}N)=gž¨çg€D²>ÏGÏ#19Á¦þv´ip_¬î“ïŸ0}ƒ^¨·'Ø{í[N/®üZ éìuì{ð`À¤|Ø=)z'–ã#«S%Ô×=ßðRôÇ… ?}1§\u‚E 9¹ ñTk·<^ýâq­¡¯ó3[J(ÃrªL~àôí`áÆFÙ¶2½æl¥ÄAØŽÁcg̹|˜·Ï]1­>÷(HNÛˆü.ÒäFÓð¼HùÖ‡YS·3Zp¸°"ØÚ¿ŠyÏ ¹nwå¡g&mð¢Ï§ˆâ!­‘ͼFNFK<÷j‚9c*ñ/î"H³t wÏLÂÿàåwŒä!v½†$fì9ÙWŽˆÖØšÂW½“üÓº;1)7ãMîDõ²ýû®¬O½çšV—sÞHÒ„©x4œ¶ô#Fº®éJF‚U‡-»û*¥Ý µ ¬ÛON©ð±ÒVKwM†ÓÁ[É—SpÒ\øÓ çn2=ÁTÏËvÓBc"ËP]-”5·0ÊsxåRÈmŠãW‘¡žÄUñ“ðæ#EѸˮꤧžCYó`aYAÌW&¡žÑ„©ÊYæU›ÕÏ6kTéX᪾±Zn¢¤y× wOvzýÜô2œnŸô¤]1WkÚù4Ⱦ“\mF)âãu¯Bc4Ÿs\¦…N¬Ñ­Áü¼ðÒÉø¥ÁkO/O9¶&ðRuȤj­u Bwñ)ut® ì*bPÙ®’¬Rí²5J‡î¼_µÜ$ØËò@òx>1rŸ4ÓÀ•‹ÕBW¹ËF ÕXe䪮-5·ÐËàÔö'ƒÎIµÌðÝúOmEGÛüå·®wš!_tæ>Mɯ(]üÈ¿ó-SI¤%êR‡d£à×h³ ƒW"®‚šÄGI?%y«Å±û 3ÊÛûp–olŽi·oçH|ò úK)‚…(×Y­¾UóÑ2‘{ÔŒ ±P`LY‚R‡=Òúõ¶’lÑù]þmíëA´Ó·ÙqÈpÞÐnbëæW6¡0<õ¨S†G•ŸàešŸŽ‚kE%Ž e;¨œÚtŒáq†«”Ôúùf}%yLÉ˜|Ão™Oé0•È7féÿ:Ò‰™ºnѧ³p^£„%[8¤›•*A”Œ]Âßñâ£ÚȘhÛÐÒørçS¨¶s%l¿]ÙáCE3©Jí¼‰„kJ‚ÁúòØR´>x#Èñ}«†-žT BºÇÕ=‘>`çÆ !#*Œ‰Ü¤ÌòUÞ-Dø ¿í°#wä2³­Ä~q¦¥ÕÇ,Z…ºµ¼-þº™ÎŠ­Ú·x ™ÀëûÚ_1@ßtHbÎA2UÃaÃÜݧ­ I?é-cfì•c1Ž$‘ó%P3è³Cš7·q¥X6n›è¸æb`ÎlãÀÐ7ó¤Êu:Ã:¡ç•8ØŒåÐ1D±àÖÌË+Zù9 ñe´žÕé35µq0{’q8|‰n*¬ºóÒÓõ“¿óàTßM_Iäm¨THìG­²™$námêü*“Ñï¯4b¤‹àâÆÝ7pD£i0ÅîKV”¿›¦>ýîë9“ÓzI`½L‹^ÿzÃüÉ$Ü‘ÍÄãÇyùàÆß«Cd4Qƒôó~M ôaC«tÑ0ˆ5)úÙ[ŽONI +Ý}ÅWÆ{|&f+‚ßPÏ.ÞZ–KØc›ø†2Aó=+îõs¹?O l7Ó]EzæX²Ãäç²¢8¶Øùú<„%É‘sâÔùNpC2^͈‰J n®¤$9 ¯¶wRÚ™³Ù·;Ù|­».p™ATˆm5º;ß²3Óß:ðÒ_ÍJÜõ½ ßž‰RG‡$¤îÄ—g3¼v='³qÚøbçyÏý8q§ìMô ¢ÚIV#o·ë±­‘n ·>¼Aõ[E]°kíw©âB= ^¿Jd£‡˜¡ éÒz¶Ö«›aƒ÷­ùÝÐØ@e†dN„ƒ‚D±O…jD;§ùs `Ÿ­[ãȱR ‰WøBÎ)ãÛ ¶(>½¦dV½)ƒAß-Ô<|FˆºŠ1!Ýñ8нŽè¦2סMÂûx.îÅ ”   £‹¤°¼76ae[ÊøwÁ|㕞Œ§"îo¡ÙgõG2' z¯¬ÙßÑ»´šÑ£ŸÆÏZËì=#lg4ÆÉï¼C~ìôçÂ(ìûOó¥0ú¹ˆ{Œq}çuÅIý-A{DY—ª ¾‰>'~ÛAšeé…z™¿–º |8®Æ MÓ…™×¡¢æûȃx’¢×õªGw2y+ –-˜(ÛË\Nši¥$IÃ¥Ùb ÓVc…ðçt©×ÄrÆwWéLH&ÓËÄæóPš¤ÉA,8QáÔ¹¾*Éö?ß„¢O¿àÓ:K ²2,wÛd›•Êäß ~úåIpÍtrÓ!µþéå ½súsm"“Rv®ƒB­Ù¦•+ÑDæ€ÝhbÄÕ·%˜z3–”}\C‘7"ô©›•€À SùõÓˆ½AjʦnãK|â+wQYÄÔ6`sW÷A kJ—Š€÷Ï+g•>3wT£Ì„£Ù)¹3>+óH¨­ŸšîF¦ s«`¶–Í‚­Q¢9–/ž‘?#‘"Æd©ø~„@qââ¿ÇK—‰Æ2«p½R¤ãþÄ”Qì>AG¤Ý‡¾–tôÐì«XS2£`ô'öðµ$Yâ³_ÖD4~ù!JäÛäõŸµ•g ÕÇÑì¤ÊÈ›wõœøM/á`͵’ ¤)9%ùÈ‘œeÌ*Y…åj·r‘̦%î½_àÒ6ˆ³Ë½bfDáÀ†–ÅQc®DÞ²üo¿Èzi¢–úÅh®NBd {nmW} ûáb·êÕ`ý«sAw#¬}Ñ¥5*áAÀáIÍ'NÖ—Hí wðºËdKÜh*VH–õ‘$1çdÛ„s™¢äòNR=´q–£ -VR¤Á¡’Æ^ŒŒ¯ ØF8 2GÛ×j?«Óð™ô’+Ì>PÉ—Ÿ&[­WhvÄòêj¦cBùÐßyzUÖÄIx¨çâRŒtFê‹¿E¢ ÐEõd—H“)«Ók^íKŒ(¸ÊV9žÏÅ:ýŒ/¥B“#m¬à'?̆ ‡è3Ýz®Ñ;Å©Fô«¢%ÜÙyÊmÜýá²B³—{ðÕG“€ñx[ÒN6‡ ìç8?.r`ίÏ–qg›ó¿nlý(ÆàéÛÃHêç¨ÅSÚ0¡ÝŽxâjêB-D6ÀKàºæ[Y é¸!ã ¨Ò¼ÈIôÒHŒ6¼«8Hû®`>ÊöÇÎvQ뙿ðèÌnƨܸå/Ö¿kt>¥ò®±9 '² Ô¤ï° 2LùÞb¨b€v|›™z\÷|LX»¹8‰¥RЉ˜ñtUæ„?eoÙy*,!è*ŠÌÃÁ•OÏ‚Ùõ¸ÁצӴé6‰šÃN÷‘.¢V0ŸÄ^d¢rö'6—SñÃ|(Pàt{Ëžñ˜ }C–ëFÞa¶Þ¿ÊìÝüå.Ò!ÐxÜÍŒºC…ÄUeäÅ(UÉ2îÙô&D%°Ç Ã’“t/ÆOBr›DÛ‘M"’Ð>ØÊu ¿rK ò©$“â/4U â=÷åÒû Låêš?¶„O©Ñncè{0©¢ËgƲ–tÎZÛ‡»ÎLY]Ŧ4`p®ezdDeJW>"xø9)ºžI9³WH¨ábjÓÔJd­²ý-.~ Éì,$3Ÿá”ÆôÄÖp…Ün…a‰\’ßM)é8Rì#ʯ\òº'¯ÀªW­–DÅ‘j©ŽD:ʪ•íà5ž× IAîcÚ’$ŽENà ÷Å)Þü¨öºGãݚƷŸé0Í'DIÀµÅ2òå•D£/“k#Âç£ÍN‚õéý®Gº}ŠüQV¯U¯ÏkÙQÖ¶ºX\"wŠ Î‰u s3Shï•È•Ýçy¨­‚Œ!v?¡­ ëæñÙ‘§–#‰ÎÜä.ëƒ-ØX´?šXÈ…ƒìU…™LùYë÷i‹¦à.V››Ç¶0z÷jâ†Kašè3—¦óe¸ØƒL:kL?§(¸bëÂR%Q7î%l0OØÆ‚“W£Ñ–ðsñɶ^n ÷*FŸ(æ"ihU¿ßó†1­Ò†´®b‚ã• GšDàôUÁòóӜֺZ«¯r¸DDg}î=‹Õ µß³æŒÛ*>|´ ¼W6þš~ÉõXLÚ\ µ%C™Ïƒá`RªþS J›ý÷[ã½á:ÊÑkÜžS:Ñr*¨Ö_\W¶¨âd“Ï8PÕ¬³×¨l…„`æÃûÍ JƳø¿3cX¦5P²=¢âË$÷VZ|É%.Iñ÷sa­ 4§Ð7ˆŠ§ 󞜵Ÿ5§Kº*мx]Cîu¡€~à+;ùÖˆ|»eZµUyò†ƒÍÏ—+—dö‹Â‚Û¢1¤†Su½åê¡,ø5è(K<DPdY«TÈ^;:1aÅgÁm‰=…¯Õ:jìÙ3>Ù GSÀ÷xÝ$[-‡(ŒY+èA:;h çC“õm7p.Îp±Ó<|56®#çB€ 3›wèú ‚÷ð´ù®th÷é”Báó›¼¶¤rw£ÒÁ›u”VE,gJGÍløŽ ×Õ¥Óœ& U÷òëâØA¢®xòû"Êxéc^5‹5ÚK!2#®Å#®XéFê,Télþ²?Ä`~7BÁ¼$ª3EwHwý~vøÝNU„&6§ôOÍ€æ¯ãöL‹/?ÀØ’÷½[‹4põ$ àŸ¦í5|j#lkj‰ôJFËü©ù‡“¶>ãÂ}ÿ?E\¢ ÉzóR`”vEÁ§íÀ]¸¨¶IÝDÈ¿áYö8Ò£¯…Vª1?’¡b3¿È›B³+Š«ÙpûÁäwÕ@ÕÛ™þt¹V¿²¾´¶ÉÁØé†^’ ]Ò·Ø_#T—G}pÏ1t¯º3;tãÆý5ó/Á}Xjù!^—¯ Š•ˆ1¡d™”“§NgÓŽ'»º —i˜¿ùxû%ü_ƽ;­÷ºeÄ)Î>@ü¬þÙçïfÅË(»bz âWÊ]Îõ@£Õ~kàÁ à†fo"Þ0¸p3½¨íìÞŽ&&yÔYTTÞòhç]!SaàÆ%F Ý¢ h ºôÑãæI÷ût¸›~Ã¥3~J%éε#-Y⎢æ"\£„ù±GN­&éJY5:A¤«97R/‡ÉÏ0„›}–†.÷±w}÷µµjÆf¬,U±7ãZÏm:§`­ÂF¯ébú Äò&cÈ7†pùœ…‡eØ¢³aeÈgiƒ–Æ>Zx;,tGö ,¶riý[ÈÊP|c˜æÃ·ÔQ ~w¥ïGf*f‡í…À1ôØ«ªý¯X=;¡<§è[¯Ðç¶èQ<7ç÷ÌŸ„×]M¨úÁÒ†‡Ã+˜"Q²ã:0ë|}4q{ñR¢ºý;½Ý2ÕIûVH…—µ¤:rý`ç.¢ñîN}—ùï@VùìcfW ^D·Íçå§Ï”Ùzüä:q™ß5­ïxY­í½›¦O-aê7>ÿV2S!¯â´:·Çfæg-·ö©cþ‰—×vú¶!:itß“9/јÕÔOWf奿wqXÐÖ|`ωPÎä)#Ž¿Y›,)%.jè(4ÔÆÐ3ø…T>‹M)b€#Z'Lf*,&.¤¼Á°èƒ·‘7¿UùYþêË1áÄ!Õ·Ô´lù¾äjCü/ª'+n Ýì’Ûã‹å AË¥f²kÞ4Ø8ߟ\VÍýà½ReJ=Ñ ’ÇBѽ0ë""VÀèÕ§ÕU1ߣ~½‡Œ¯éÄ ÕXŽÊƒÛo;è!ôDóä)D÷°ü=±ð ¿HƒûÖXX¼T–SÔEËaóŠ­VŽÒåäÌl3"ꉀhµ[KþùÐÔpßJT§Ñ/(’³÷ÓMy¦ÇZì%ù#›;™l5ØrãÊŸ˜†wo!@Ä2ÑL~3‚ï>„¿Ü“+=]-\~Ü¿Ž0ˆTJe0{ë×™ç߯ä[Âà‚Ùf›v‚ï cµI¹_õJ÷ôˆŸj±’oÜÔm÷6¡€ï¿ÑQÒ U·±Ct$QL,: ¼Ö—=ò6S]ŸhYíÓÛ;óAÇÏþ‡÷k«m\¹Æmëå#†d•nЧTÍ9”YØGQ‰CÒÔvwšõXWô!»)ù-¨±v-‹Âi‰Ar©ÙønºžTÉÃGíË´ýæXôr÷Ž@ ÄQu›”Hw\pè2ÐIº(T'Ú5HÑ£¹VŸ³Ud:ŽúûKPÀŠô6à€4SÇÚ{ohw§»ÔììÝÕìåI&¯7„EÙâºo2"Ê™*e\Ó"‘%r°L§W>œZ|ØKBDu³+âƒußQ+oª9ûÌpɺ0fM1ÕsÂ^È U#"! À;Mq†7…·.3†ßvi)’4g¤uøáÑH\8½«cöMKR=ï;¦´ë°ùF;UPlÍ´ 7§Öé·pSÄÊŸÈîôšâÍ3ÜŸHXɤÓ^Ck¡J”·út1Û4NÙÔì´×åhDvµ)¦mr†7Œg7ñ,Ø|ï¨Ù‚c&‘=¦ˆoRW(ÄTðÎ,«T“9ñ³GXvXªA >M¨ ‘}ºE\…#tùYc§‚¬õóXÈR¶mh=Örù&^8v_õàc¤)VÎÈÍÄ}#]^öÿ¥ÄV÷6 ­¶†Ø¶òzg™LIÇêïÝX‰ÈLb ;º>–Í4Hœ7‹«¡¥×TKó-7$.èå>]ü>ô’‚ØÉ]þçße/÷…ËÕôü͈4=eNþØáøˆ+yÔŽ»Ñ}Ê bÔ…RM÷禄©¯ÖÞ¢ÁŒëw Ú YîÇBô«•™_Ƕ4ÆñÒËvÚ;¤Ú N×jÆ›9ìÉe™ÔUè&ƒGF„ß «›了\›;÷…9–PÉO²&Ø:E ŒLqË훕Rmö?Ú߇œý|캨öˆÜdÁqç6ÔÞ‡âÒ^]3“Þ\¿8&R/L© àUUçíQÆÆ*KfÂêfY¯ë¿ìidhL2´±‚š½k[˜›ôé(z\¸Ñ“1ÂÌLô®\Ò DMe ±Ñ[·Óû24Ma¸—?R™tê¢êl8—КÏ*÷܌آ‰6[[í½–üp ]úÖ¥Šþ"ò#Ù[”ºýWÕõ'D©nHÁ°ï! õÝÀwü(§ù—èb¯'žÞÖ¶ôû¾¡—4%§o¼šôîýD”‰¶»•SçǹZãðÀê;´»´ý¶`WR¿ð§5¶¯îrÚä¾8R_¯ƒ8Lþ  =I ßdÍo’‹Od"^<™c´_®µ"غñÐŽ‘¿ÅáÄßU2íï©¶J­™júÃGC?†*ü–žàøˆ1“Ì6HÞ'# < Jiù*h… Të»¶¸hÜà¿G[RW­èðxlPÅo[ÄtNŠøçntºë?—ñMSÇ´‰—ÔÔ52'/i¸®òilgŠ“ùK‡¼dÒâðžE¶æà–ížJ†P¶B ºïÁ€Gã^K$U‘–#Ký',©×úá´ùü %½[É0ɑ݅<É÷áî¾ ½C^¢ êѬwŸ¢ê·c3åÉ¥-¢¦qHæ·SΚ";šsT–³áÆàš1¬¶N~EчóF.Ú‹ˆýÜq©Nâm)Þþtp2eâ·øuwTþ ©3¯t÷ÎæØÇuý­6Rb+å5‡ ”oµÑ5†íˆ^hÓ·~¼ Ñôí´þ J7Z„Ms z…¦äi|cŸË)Ç'[7IïX' ÊSÅÈÖ”Ü m²\D뺻håþfµ©pML²êäèÖ˜ëß»WÝ›ÄÈu¬N é® «•¹ŸuöVÚ¯(°Çü¡¤ih Ýi§`/á\i&TQì"¶ Œ®œÄOŠûSž*:ÕTm:ÞVWa>ÿöÜ–n˜É+¶ —)â Gb’È[A²Z”~Ì-Ñ™ækŒAÜÿìþĆ)0"pö¸ZŽÉNbtÉ vNBU,·Ñä€výü%æÜ¶ÉÁ"ì.Á·ƒ¤J³÷)L;SðÜ=5V4èse¸Øiº–NƒirçLÐ]2Å`pëƒ3ýgõQx̸¦ƒ½£0l]ö¬0ÛénŸ{—nF²§§¯zÀ4KCÔå¿d)î‹}MÊ´ AÌ’K¥;bÁÒòq_4Ô£õ¸°ILlW§’ß5²N3´óf`dbFèøØ‰u ¡á7 Ó[@ÏXôšóWÔH)*6%ÃOÀ¼ÈõØ% P{ðwçrî \—RlÈüfÒ5´-sC9/øã ˆ ƒöœ2S–æs[_íî-xÓïSãÉÇЃµ¾[ QDÀuÃ9ßà €7ìGRœ¸¸€ÿ'&S‰¡¸ß;·vûWÛOî¯%t,ëÉpŸÐìa—€¸³"Á*8_Úú67¥: >•à˜'ÿâ•{üÁYñHõZ„/ŠxÑÖù”§ò à·zÜøä@ƒèmU;¿O‚£‘¹_‹¡yÉ(J€´ß̧i‘ª ôÏ*²À—\­@,úØ~3̺ö[Š-gŽWøÍw0·ë‚_9?EH™çÎ6t`ƒ ­!YÎä,©q?°ŸË3êü€ý8yóâõDÞñŠv ßT.ÓƒÀ®9™[>ÐÍÑs(™á‰83A÷¨&[ðæ±l‹² ¯„#ñ)½æÜÁqìm »J‘§zôüx¥¸PÒÊ£þ!äCýçmeÌCÄujE%éÄ£uFýËaY]›¨Wñ̼¸ý2ÃA'¯JÙïæbô6—Íu ¦ceÖ`¿;rS¹§ð™ ï‡¢q¿PüÜAÜvUõüXX#µÍŠD“÷¥^Ïb bTüÙÈžþp¦?OÎt÷ø“ÞqQ‹ƒËЉ•DIh½ ‡Sß⥠rEÒ.ÙIEJJi&ÏTt"ûrgK‹èjФQK¾Z¶ì'vÂâ<ƒ¨+¢·Í”E#<}á/{6Üq<ô–ÝaFÇ‹^þAîW4›;M¨¿@I$ðPÎÄGiáèæ»t’\Ñ"EÈ3i$„ÎÒÙêsžÎU"t,T1 éW®Ÿ²1GM¦–Ú€Ò·0Vû™g5t¹OXqD0°rnO†ÐäîEpÑëÔáS_%z¿imŠfùhp?ü6ŸC»“È…’øéd”ý+*o|«*êËs•ŠKÒæˆ]&_½ÉåOµÙä}î+ßå¶ s«n|Û»=rçÞ!eæ·^>6UgtcŠæø[OR+9ô Ó(¿êäOjH–¼Õ°L€Þ“ºrÖ·¼´ŸA)L=Î~“&3éÁ‚CÚ|„§fzÌ ÔplîÃ]¥[FSgw®Ö@›£fú°rÛ¾`ý›Ï¬jÃ|Ž Í]N»‰ l0vDGšE,È0Dò9%tcð°ê@×Ç·þ]°u¥¾Ò¨}•Y¯½WŠ×<ï»FhL,kȶy¶™U¸0دº—Ñzšç»jêg™úúyKA™ŽŠÃ·—|z¡¡¢Fkɧ¡WôÉðØ  „ßêuÀèY·XЧWþƒ%¿0ôÌÈà$$¯~~hõp|¢¿õü‹rÛäÅh¹šËN†•þU… þëïâŸ]‚0õùÖ\¶˜Hp~¤¸A5{Y¨êë¨?§ŸÊkARzÞƒ}g‘b$XÏN‹°ÂÁ8âGæÒF^íÝ/j#³KÖ?ûÉÆe¾-Ã'}ó›É£Þë:ʶ;ï¥ö ê9äN’ÀzЦª'lGº÷0>î/tàÿÕ56rßzka¯…õV,øJ,1ƧÏ.0;Ž)#¼…CšÑŸÈ—éAîW×\Ë^»eæ<*–Ø÷ˆ^>ƒ½…ÚÖÜA%æVùâZ&7¨~5ÊÎèŠýؤt©B ÂðšÖ-6‚­Ù²²D_@06ë¸üà"CqÂÚµEé1å.kÛ^fà¾_'çe\²›Žo«^ˆÓl‚¥ûj³ý~%ÇSj„cûE?ÀùüþDš´ØYçNl¾D9NîljG¢$»ÌZª8¨6;Ž|˜9Ö­whÌ÷âÄÚ¯ èЭÞ7ßàîW/3œ,—˜¡×>y“ƒ@BïÅÑ«ØYèà&–Ke\7GÐâ_=Nr;=®@UÅÈVÐ¥öÙe­¼‰v“Lü©æltа.ÚîÅò82a¡%¸¨[‰A‚'çOˆ‡¯;ð$¬ù˜nç…dü&Uïß*/[÷r×â꟢É}úÂþ†‰Dûã=ö7é´;T¾ˆn¦œ‰(äߟjgo·kX—×T~“Æ÷R BI|ÿ„Þ#‹µãÜ›¾_ÊT/ÉŸõ¥(/#×\N§nMeà‚õ|ñé^ÛÊÅÕ2hökU8Ò§˜”“²®­H2E’_a^ŒŠuz¦ê<4‘W„²³M©™}_ÍÌJMŒ(F&)}(cDŠßèÇ\ƒ°ò9[HË&P õÝ.‚]ID¥ç&ɳýôæ:„DÓÑ ôøÎE,¦õ¶ …¦³?þ’ñëÛ‚’.JÊæÛ’í~…ÿU/¯ts´«¯dÑa+ §- O{^Ò_‡‹twÂçò½Q¼ía‚ýY%j­RHç·o`Ög¼R`ÔUeñ–Vó×ÑðM‹dµk¡6Úi‚Ž´éóÞÖ²¹§PÈ-÷<)ÛÏÏn`ÝžŒe BÓA®Ü•©Rd ·ªuc V?xã¯ZûiçÇ4•‘‹¢vÖ¡*ç›8c°Ra>)bQM¡± ¼— -DÒ‚ZÜ¢œŽ¨ªñ?>uøïg_Ó®¿wÝDZž“‹” Gyý® ²Ùþ’„£€X(™\\1BÀM-¸JøÝã“ïyeפ§*^Úrñ[;‡y½•I ãG¾§d²(“MÈÀ5p©Æ5œ’%_iúŠE–áââžQ]ŽÀ~HáFNÎ(Û¬¸–žÅÒà ^†¹ûAì‡1my‚ÓØ­ï>VÅD´'b†SÎbó̹õBþÜ:hdf^ªtê!®xe®!U§Ó°.íºÈó=Fp¤®€ôC´¥JÒ“Ê0:ÎØYèBʕ׳]Ò (—e¨î¢Ím¼h&Ô¼˜È•ùqÖEžjoú=éÈ 9%»}‹“å÷ˆCŽBòúvnâÜßTžè·hBÈNɢPÇÍPå?×ÐÄœ»ßcÚé?r:åŠwÑRÑÙ­—yÔ^¢è”ñÀ¥sðX‘`œPñt: \ õ+?§xM‰)MŽƒI0îtÞ[Çz¸ím0`•6„õ‚gj,±&8’|B>ê¨õÝÐÖƒéS60²5§'sJÞP™º»ý b±6Ç0ºù˜ ¾ºüF®Ð 5Îÿáôxf=ÑþW¡~¾kÁˆ‚ÿ&å™›Ýó窖¶‚³~>õìW˜&Å„ÉÝp¢j'pš¨ÁO—#1"ž÷rßš§L‹ådW°­lÖÇž­^–äj€¾hAÍjÏ‹‡Ù§l²ó i¸!ÿ‰nwâ«h[ýs"š|Jÿ´/‘Ï·Ëëî à/ŽÕ#<•>}„³ÔUVDÉeÁ/¿MKc9Æ5•›.ÕFõ-ÛV ITIŠ€cÄœ•.r\ì£nc)"4—8–X&¤Â¹‹7R.¯Œ‰ÃÙ²CÎ?M•;N[™±Ñû7ÞD/luìÔjÜN†æ‹š§ïy@, -=`UåsØ æ¬„Â¶éJž~,BgGýºN_CNi[<Þ7ch ç Aä×>LsѨK|I›¸(WÝßCËE«ˆ<Ñö’ŸÅÒØ¥‚‹6hî=´´«¡ÀãÌý¥2ñú×Û-¼Ôýê&¾òŽl³:|´Šgnê¿¡`úTù26l\‡ëž@¡73ºèÚ_ñõ1l÷³Ø@Š¿„€VÚä}OÀ•ºG?5ÒZGÈîT@–õKЩáîjŒPHîÊÙŠ­Â —m¥àއhô¥ÖÙ°ÄÊb> stream xÚ÷p%ØöÀ GÛÎI:¶mÛ¶NlÛ¶ÝQ§cÛ¶ÓaÇèØé¨Ã—™;wfîÿûªÞ«T%ç·¼ö^kŸ ±¢ ©½1PÜÞÎ…Ž‰ž‘ "§ªÊÄ`dd¡gdd†%#Sµt±þWK¦tr¶´·ãþ—…ˆÐÈåC&jäòa(govµ0±˜Ø¹™8¸ÌŒŒ\ÿ5´w∹YšäèÒöv@gX2{O'Ks —<ÿý 4¡0qqqÐþé²:YšÙäŒ\,€¶MŒl*ö&–@Ïÿ AÉkáââÀÍÀàîîNodëLoïdÎOE p·t±(Nn@SÀ-älµFKPµ°tþBÅÞÌÅÝÈ øØXšíœ?\\íLN€ì)Y€‚Ðî?Ʋÿ1 üu8&z¦¿ÃýåýG K»?LLìmŒì<-íÌf–6@€‚¸,½‹‡ -ÀÈÎôC#gû#7#K#ãƒ?K7ˆ )Œ>:ü«?g'KgzgK›?zdø#ÌÇ1‹Ù™ŠØÛÚí\œaÿ¨OÔÒ hòqîž ]®µ½»÷ÉÌÒÎÔì6L]Ôì,]R¢Ù|ˆ`ÿ‘™]lŒŒŒœ,Ì #èabÁðGUOàŸJ¦?Ä=øz;Ø;Ì>ÚúZš?þÀz;¹.N®@_ï+þ—`™˜¦–&.c ¹¥ì?Ñ?Ä@³ÿðÇý;Yzt?Æ ÀøÇÏߟô>&ÌÔÞÎÆóó?¯˜AMHU^M毖ÿV Û{¼éXtÌ,,6;;À÷£üÝÿ{ÿSªhdùWmÿŠ'egfàúO g÷ß6Üþš Ê¿–† ð¿äí?¦ ügøuÙM>~1ý^?]þÿMþQþ_‡ÿÿV$îjcó§žò?ÿ?z#[KÏ¿,>¦ÙÕåc3äì?öÃîÿšjÿ³Îr@SKWÛÿ«•r1úØ!;s›¿ÒÒYÜÒhªhébbñçÄü÷>¢ÛXÚí-ÿxotLŒŒÿG÷±r&ÖoŠóÇeý©~lÔÿf³3±7ýcõ˜ÙØFNNFž°ŒóÅÌÆðfúØQS ÇŸ£ ` ·³wùp|tç 0³w‚ýãJÙÙ BˆþCìáˆÀ òqDÿ!.ƒØßÄÁ`ø‡X RÿÐG™è#ƒì?ô‘AîúÈ ÿ7q~DQù‡>üÔÿ&®?£èÃÏøú¨ÅØÉÈÄøñÒ›¹ü#gù[þŸ¡ü[ñÑŠÉßÄöÌÄÞæã>þ+aeýCbkûOÂ?.ŠÁô_ø‘ø/d0˜ý ?›ÿ ?ÂYü ?ŽÇò_øÑ™õ¿ð£›áG©¶ÿàÇî3Øý ?ʰÿ~”áð7²|¤utµwšÿ+ Ó‡Ôé_øQŒó¿ðãÐ]þ…µ¹þ ?jsû~Ôæþ2Ôæñ'þϼš¸:9}<å>)Ãü_þó{ôšÀþX²7á ±ªé|¬Âs§ÛŸæ›'Û×È ¢óþáÔåú„•JU“´åt/”:Ö¼¾'Fy'¸Jôê}ÚÖÞž¬Ôñìób¨<·ß»2‹9(áÑ0T¾6¶´¯tPÃ.÷Rþ.V-F7°d¬ÀøË"6 ¤ 45ê•ÒÂÝý=ÄçÜ:²R¨XŒ6N?¸$&I};5àaröU ¨ëN—±iÌÜÝÅ% Z‹õFÃa"œhLåÜâ¡ä=½v~@ÜiÞÉœž×Ïèxë˜íÂÀîb¬·oˆ¾†;ú¢ËAâßpöúYe—‘ÖyXÍœ9Ì{x¨t Wˆ]¸"ÂB¥f"!£e5s%ÞÕ¡±êÂÔpuƒÀèöQéŒá¬Š«­Ñ;^¼±žLjgpÊ<{¹»ã7yÚ¤ÌK±£¶Y™$žkcT‚!fFÑ&sä-•ËÔq?~”^3­œë?’ ?|è3(/x6EùlNSÿtÊ×rı ý%ÜÈ¿µ%]?Jþ=J’M‹auW»~¸è¨¨ |(Olê›ÎÄ4y~¬\?ëÑâÃ=BÌOÈ4$l k³–yª2Lá—±ñ›ñ~såL™²½È©^•yÅ ÖÞw¤øÊo|wå»:“øÉ?ôj?ûeLjÏ÷i¯xŽ{ŒÖÄÔ‡×j‹ê$΃d“£6í·/òpáw„*úþöíNÜê˜3º[²¢7xŽÍ_$jÚ°;ˆÕ?yv›—k™§ö°m]Ä<ЪNGŸä?[G wÚG«Lp0ófíõa¬8Ì;þ£wÂPÓmá33KÿX¢,±9V+³n›cs¯¿N®±€½1âMØRxõj+>ˆ»qYAð¥1½ou1sŒ%A\ÆO 3ì‡ ¦*‡ÐºÜ³‚"b=OÜFBŒä8e˜f].o}Òc.úÕ–æØ²kQçW¶‘‡µa©Îâ‚(æKY>‡ƒRW,+£ ¨dæÂ"땫΂»V×@ZVîþæN—Ùïcãi«_cs,n3£ZsvÞ¨€‘Àš3Œ"(†Â‡fGr"“å_—QÅ•ù¨Í]—ƘaAþ®@m*ryD^0Mï/Éç«ÌÎa›úÕéOƒ×\taÅÑGvj)øžŽ¹‹6ŠB…:1¡Ê2ë«¶>+~\÷ÐÆ”â"6ô½e£Pa®0‹ gàk½¸¾²@Ý—Ô/7ýÅŽ˜!Pú9ÄÏ1`ÔLæî‡Ì½¬ Åùy­,=‚»ºµ^kF^'sLøÇT‘-ôÛ™W¿£Å<‚´(ÚGËNØ"ÄMüù쬺™w»!—LÐÜ™àc_'XŒó¤ôÂs¢ú<[ë¹ã&"˜-”­ŸD'ïŸ\?—š™Ÿ‘õ8<óZ^)RRx—Å/ÖO ºW¼©¨³)8E߯'æðv˜g¦{| Ä«„KíçcÛÏÑô!‚ûÒ/´‹ó áN¼S¤&T…!‚*xωgDídkŒ>?Îð°mä)Ú -ŒÒä«/{mŒMÊ6Á$ Ç6dÑWE„ÍStƒ%Ç­­Ýë;©LÔ{PVÎ.ù&¡_ÃöÊõùVè|‡F`Dø”ôp}„êD0©ž»„Rƒâ€<äMxH¢‡Î)iRµ ,uSË2)D˜Öú xé!9²ÿt…I¶ëuÇ­í§2ÃK~”9}CBFÊÔªy HÛÌ'8 $™Ýy þ<”±mEyZn¹#ï( feDAvݼmº«E}LÍXŠ€µ£;qLzG‹ŒOZxy7Ï6AFå¥î“?ä«Õ¦J «ªnw³ä¸ê  K›7v'ÞM‡Ÿìt WýžR%Ú n4Æ­áH¬ço9\àÞ‘lø~TTC±ßo¸m¡Ù¯ª/Ua' ´ùÙ\ˆÒ5•t÷0oˆºq¿´˜p¿¼ (%tˆØB¤äƒ¨Ðbj;¸¯ˆÌW뙫,e8Sxú¤ KfH~†ïB‰-3ÄM/rf9%ÃUØã!9D‡æ¶+ö²ÀêaÀF±Ÿÿ£ý%*kö6·Ät׆ÂxÂxÑ6Mòž \{Ä9´#/o÷ =(qó ÊÑuаe¤nI.¬û¶ÏüùxÁ”ŒÊþÜz°+ u§½i¼ˆîð8ÑËtQïk rF™vé-„;ë,·G`(@ÏmšðÅAöA½ÉAA-Õÿ¾ZBù¼ÊÔã–'ªù²"d•@¬ñ+Øšïd˜<[«àÌ’ð‡û¯° ¬Rì/an"5ÑŠ@¯=qˆºÍØcCñà]i(âÞŠ7¯á‚‘¯bôTœ_…r\ iÒ§íO~œ¤@WW!{¡û¼ùWQWO™ªÁ%@@QÑ»Há[8&.¿ER3‚ç;^´×Ôð†ÈcŒ¨Á ± Æos p)¸4ë°øÄ^±91‚ÿjs^y{^á„ÚJÕÈÀw•êêŒó^?7¬GO5uOÁóYA~÷bhÉ9’¤èÖ& ‰ü’¹"7]Ä[´?¬<ZÍ˱å]#ë°‰2ð NE††ºsd=¾Îr–©j_ô"bçËÊߢýî4ZëÝá„Õ§¦ýÎ%Vž·´ Q½ãšÈʵʿmhãØ=ÅT´ãwŒè±›¯ê“cÆE´\)ЫyMï:*ìa&a,öBï®ÁóšiOÛ ƒõMXÖÚZ¦ÉŠË ÚÜü…ÔæØ§‚¼/à;6¢Ü¨õ×ÒûH‚·ÏëÍügjg&ÇþSÍP -`èáv­òH³™ÓL1Y‡Å›ÃoP¥?ÞÕ×áË2ä]!i¸ÞW‘X9P¢=%(çúß¶¶Jú{£Hª¼Æwíú R|*M´ß𽄋‚[´„ˆ6ºo }z¤íã $ò“Lc¤‚¾Aiõ†^^ä,aE«› 7Ú@ ýˆåR{?‘® AÕqÐë‡[ý4î0m³Ò—?Ý›Tz¦Æ0³˜ìUp¸Ù-&Ðð–ŒõÂM(ÍS}÷T ñN6©™rAºÎe<Æå°×(®oš%.‡V¡(ôyØ,1@•Ä ?†Bøþ¦YBž¤Ü=(6r §WÊ,p6Â-`AÅI>‰Á l„l|Ÿ–LŒÕÎÑtå‚Ü"Ç; ®ÉêÕÅ´EÊNŠÑâû¨Á»Ådµo¹ËÁ~øJÚÍZ­ml–ÉîÓºM¨º*Ù·qoÜð]û4‰5N”ROL1Ò'÷ÔÄ1mRÁ™>cFþ5.9ÅÓ ¨‡…Ú5Öt݆© Úó–úr”Ú.N›B2*ý%9ð~ÏX8ofzôe™Óg}Mb&wsãR—§]ÖnxÒ„9b«ÆƒHs=Ÿ‰X€{c¥-mÓå3áÀ6¦YÛÜCªyH”JPÇ++8ê ß² J=ƒ·¢{ …f,¬ÈÁ±§ü–Ó¿’_ÿØËƒvÕ[?iÊDÏ){—ݾº%¬©í®`t³ÒE2Yu]äufªÀ3븨Çù›ݳµE8Â^Ö !À›Ï¬·¹’” þ8äK}Lö›:õ©üÉÅÔ¹3[TÞˤ¹#«ä9ˆMÂoÊ¥¿58aŽ&X0­ÀGÚÓ3vö¢èåÞŸ1Òj,ÏägŦ}+fsÝâ“&T½yªJ–ŒÀå,ÕÚiÁ´kE›ñ~©£ Dê||‚Îuyÿî«ør–â2ˆQX"íÑʹ<:¯Œ¿¶C¥ë=nèºñ®ƒGÔTrKvÜÆÒÿÊѯ»èd&/MÔtò=s“ùš/^e]Y×ðé¦[Áª'½ ·zkõ€¦Jˆ»8ë\&·¨žMUþ˜‘ö«oª\úZKýz"›³ñ¬—©ïÒô³´,¦š\ã¨ÉP¶qɤR"þew›™IËì|žScW ¯¹_ìez"›VÌ _ ÊþµÞ©)¬`DQ€Û¢¤óvÐóÝ:Æð ÃÍn{ô¤µ:þ†ëùOÿ”×‚è¥ d_ V›ÔÙ”}Áß5= R[m8Ù3 Þ ú^žt¦NSØfx]“DO¨Ò[sK×!Ëó½*_Êö(òpñ¼¼qÚN›¾Í›X+Cû ‚¬À2Ôõ<OyáíIÍW‡ ¨·F+—“ÎÓ~# *=cÈ?):Û $Ë€äìkÈy‘ƒqW{È9cM_Y¤ÍÙ¶,×2Üj£®èiÑÄ:ÞÊ%Q·|ñkÇëõZoçÝô T;™ K×ú†—'ª×>±eëú%lšýÙWáGŒ^Õ¸Ie±Í/ Å€%J½°ñ'²Uù˜$ž³¨~¶éäj¡Ì>L:=N£¼£ÍGC›òwÈɬ¤,̘àAø4‡©ÂÀ׃ñGè0£Äœšõ*¬\ng,2(7Bj9ÞIH Ïãå]+.y)ÝOÃl±‹HtºÉQ¿Ê/`ôÑÖ˜+ØQpbŒ½Œ–WUcáŠ-„Qð¼…2aÂ÷ÂrÆý)p~ilñKç+ï9~“L¨~L#QÂKqw˜¶ÊÆH^´Ðdzhࡸ+ýÔ¨_ìˆÄ;CyùËÿ©M¢.ȉl`4­‡GdcšNcS¡JâMhÉ^kàæ¤®°†Y š`™v˜Tn¼eÎéÑQP+?w><¯Æ,pc.r®XþÙÖWK JF'è÷Pm÷üƒPÆ¥²â$”¢µ%*è~rQÂö©a„Ë´BD’âp–Ídü½ª7µ.£*Ü!Ù¨ðê~¾|>|½À'Æ”tœ÷ó7Ù«ÆÍÆ:„ÕÍߢ)FòûüF¨N¬ËÉ‹‚8¿M»ËÓûRÝjØÐÀNÚsØ€ƒ¢fÊ4-&|Š–`ïÎkš‰œoY ³¶¶ÑYkU*Éýµuá-€Ïw£=P=%W%û‡µ½ÃHå6‡ˆwõx¿3÷£¥7!*수¿£®€E}=Ä, ÐÂZªæÈ«u¾˜ªªFÓAy3`fÙ æyÅ oWšÅ4.)LÌTBKˆÞ[¥—{&Á˵ù‰¥^ŠÔJeé*ËÊû¦ÔD‡6òçX+ñÆhVcáeè`î]®C%àØøŒ[Ø,ß zløÀ޶ü•®o\Ínw a¯)¤`ä! ;vÆÐ­Ê¯3©`ÇãN³æëir› „PGæf w;ÊØÉ%gSD¸–l>ù p8Õ£þ’øMÆ~#íôÖÌ»IYa.¡ß?ØØàWã¡x © ³»¹€ƒÕ·­õ¤*:‘LòØšBŠ.`ÖÂA˜¾šµå‹Ò–¤9ñÓþ(âå%‡b—F5èÃqç—çñÈ%Þ´9ž HEw…¼ÌH±Üƒ¶å’wAÁ!H å êpµ49pžú)àk¢íÓ܇þ‰TdTgŽÐ2jx ÷ää¹~»{˜—ÅG(ÑK|G‹õ^jE_rU–gŒŽW]°J sNö{’OJ ™n^ׇÙCÁWÀˆ׬ñ†¥#“À2㇌v uŠ#+ Bø~ê)L˜‘пh¹}‘ÛÂÈê”;Æï$NYxÎÙÓ*"Õ`|ýß=ÇáŸužôy‰éŠ™HkÙdS6åPP¤èøß0S¤.@˜ÂM?ç Js]gJч~®Ì ™Çm5›Pw£€Ò”Va¬‹kØ™†ÉùÎ(k¹f+‚·U¹eš˜ËY³iÛÚo ÿÄ/Íkþn–u.ÑÏ¿ð²Òt:A›‡œ_™±gn=¦&ƉÖ"ž‘·bh!Ï`èY‚t8½{ÌÌl ^úä2CÉ 3(¸çÃ#R¼¢gäľ·¨y‡¢ÑJ Ö)¢€y©t©eXzh(m \³MhQ²àx}ŒÆ OÌ3F33‚×C=Ø#+÷P9ry˜mÜ“R,'ƒ“näml/“-u`7§bߊç¾hNpÃ’Ô·듨ÜíH €rUAñT†tªò´d/µ¤®;µ¦g¹¤j>«c°¥Ýdpf†_ýõ-…­¨¦”BžÓI.‚ ŠFŒÛ-6jœ$¼u¾ü²Ì'٨ؓgF >ΰÁþ¡nz{syYFbì¼méÈO;ˆ«m7N0PšÍrМ¤üVg>¼bÿ\ŒÑ à#=SþÝòž×ô¶^ùô©&|WšÛĪœ¥8ÈŒV>©‰›ED$GyÜ„×s´AH€‹¯g!Ü(i{ÔýéIn¢#ªùžÜWöÀÎõK±?ö7Öµ“¹—¼Ùngë­[˜“^K·á¼OpS ×i£³_7@¸& 7±›IrŒƒ\š3Ç3H=gË— ÔÏziØýKßø¿nì1‚ç¢Üù) 'µhPh‹Œ gG)䞨Àœ26,ÅcµM/õ¶Cî«„Ô±M§>ÐùrDA/ cþ ë˦Æj•©Ž÷fm ŠÊØÒjø Uã¤H) ‡k—ʾG„Þ_Èe¹Ç¶eŒ"ú*ÿPODHá.Û€ºO‹ZoE’z ¢áÖà)7mlæ–ÝVôŸœv1Lª:,y®¹SB'È,ô|ƒ<¹L±×£µ‘\ ;+óý´(Þ’i"=ÿÈ‹;HÇEzòÄ¿1§×Xp(eãVí©xûãÅ4f^‡<È¥ÝkÎý'ÏœˆÉ7®´šcMxÎ3Tï/‰ˆ‹_´*¥Y­1œÛ®(Hh²]²^Ã8¨B¨¶lÉ£e5&•öd9’©ªÌïZÖ%N%6“ÐGôv¾›"Ų_©wa‘j±äÆïƒ¸9ðkî¬pm³3Àáˉ›(Š!zÐYÚ<Ðñxuœ?+ ."óqNí6ô3ÛǸóôÓ弸LJZÐçðÁ&9ç6„÷\xW5>Ÿ6h8¯Á°$ùö#øéÍÈ ½Îyß›¥\‘½}Ïy¬uïÿpq:0Ñ@»Ò£´´Ó¨1P]:‘÷)¡B° Ï%‘ùr¬a2ÞÜ‚œ?ÕãLƒ ‹Ì¼”ÞF†EÒ õS|U¦n»ßKÐ@»šV¶¸;füº*v×\Bu…¹à™«æ +Î%ØËrû’Ä6ã¬ýë ý,Üf)ÀÑ/ñ>ÎŽÖ¶lîT5Ù Š¹§½sjÊÑQ09ö³Lýf’. # ãâº$¯ïÛ£BmÔ3N¼S–PÑÍŠàìƒh¬—y¹ºèÉoòMåQÎNž59³ÜP§Cý5úò¥{§&¬Ò\©Î!çF‡œZp»öÈ.ì»B”Éô2™Ã\Gü bu™p˜!ƒŒÃ¡ë8I K‰ "ƒ i$b œB-Õ܇.íË'èˆëPS·Ødòwm]ÛÕ1 ÅæOŠi¡åYG[*……©¸†‡üæ˜_ú;<’kKa豬fF‡ŠÀ zð¼ò‚‚“~¥Ç=b,'áJà—L(eÝuc^55I+Ù*ݨYJ7>*¢b –{¿!7´©ûZ:äLs³Þ‚ö=‹›VQbÍÔ*¹„ w—zA<áyÅ[¦øôöõb, 8™0Åêfg—`Ò’†Ø[ÖíÝ·SV¯¡Ò$ÿ[ÇÒgg;ŠƒouÑ*Í Øœ]¯AËÖjúTê—1ÄÈèßZõ7:¶öÐh‡ËTÁ§‹)ºZº™Ç½éŽY$=wóø96HwöÙ|×iD—ÎU:¶#¦Èø /Ô ÈÈ“{iÔSÊ(ñDÎw§¿ûvl¢ÑþœYž—‚.ä\±79ޝZÚ \M•°óÁˆïŒ‡°Œ¢ÖÊuø°ñ ¾g—ã]18ÛP…ºþÜÛ³þîÚ±¼óøÎÁ?ëËò“á÷€7M{·ì‰cø×…FBs§pÐ#UHwòmó4™B¥ÑlÚfÅ[í—·îÒž—ÚSeîöªÚh Þ×oÜcJŠÜBN¡ix+q*2ÍœÌ5Íô³¬ø˜‡¨áh©G¸^lü3#üæÚBÌé©Ï<)Ñ?* ™ºPAÀM2Íæ™¦¼fà 0oxÎRwNpÏ\l Íaq›ì.i”‚•Þà)Ëïãñ·zIñ$P­Ùjä¢u{–¶#Å-”»*Ê7Náûf3ùé;8jt'ÓÝ3[³/ëp©”ó‡àD¼"ÑUŸ©t6çM¢êwv’´É-Tw‹¥tp„µJÆ=LO©Âj!óq‘³bŠ‘장$`Ó:ß5™§½dvVå¶7yþ}%[)Öíô ¿’ç–œNy ºÒÀ! µ.u®P®á¶×RÏQyTèpŠ*îxæ Ã!Z¥¸Fö¸ÚDÔØLkJ"OEWÀ“š}‰`bÀÎTJ]ßëàå9ÌÃíåÿ¬J¬~Sq™Ï&ÝÅÆ€HºOqþf!ýý¹¥Úsö—}2F¬ãX–ñë„xs4˜Fîu~¾Yc,¼3îÝê—Ò1é éë"Õ_’Gç`t¥ç«–-rPæ®r'öBu™ê¢ò`}]íI±<¯l¦:*‘®ÈJªÚaòtŸ)Æ|´@ Ìª“Û]à ? ið?¯`æB˜½ÝÁd&7YxJ”ÉÀ •¸ëßñX;R^ë —ƒRr’ÔQ…²÷;P&iÙ¯Œ³Õ/‚0 }A§½äü™¿ÀTœñ­ÐÏÞ¹ð H|nÔx™¸óx²#Q¢¥)Š„G›ˆröK5:<çOÙ§Ãi…†sò8F… ÂØÊ»E’X!i~è= §/eºÏ—ùu4Õf ®WÊššª}1á„ÕíÑxkõ¸ˆ‰´·zêö‰Ÿw-“ÐváHE,¥ö*}ǺI–á%††£Õ&­³çÜñ7]6ß²EÊ~çg¦æ9ÜùÝœ¥½7ó‚2í#GöÉrë—kͯOôûÂQ-íÑÃè äPÆk)Ü–_ãQ{©É3Ȉג—³^™âd2àñJWebúYsohÖÀlfJù •;DÑÚ|ÃfQû…r°{WÆô-•ÜÇQ_yÁƒ"nS©ô•¶[Ö;´öiöÉTÛ)ìØëk¹ð”/4ú0gSI‘Æ…YÍÔ/×¼à®þ{÷ /°_Ò/5|Bô6'=\ôÅ2 vh;ñ(gUå‚éM[nGp*êŽ ³²E5alšß@‰«mŸ+>s³ÿ„_É$$XyÁ’^ÈK.ÙæÓýbOF¤•?nV¦»I†CuhL÷½å•|vºÄìˆ<–ýT¹mÓQ©#3å^]wvÎX*êf€_í‹°m ¾NJNNdÐZòÒøŽÁóe7æ éU-íç’qÞ¢o~†”M~ïI÷¢~[ÎjÃ-‘8«¶Ýé6÷ÔjxAdRµY¹.ú}saj}ËB‡>u{ýçEŸï3í`¯ó‰ÊRO@ò=Æží ËÔrM.ÝનùÖíæ®ž£–̬…ݵAŠbʽY¬Ã%ðú»go¼IªŒ¿éÞÈ?iYvgáÛs@lVöp©n„ôbë¾5f–‹#.m^]šX¢5õõ Y+Ä_R¿eÑMyÛ«‚óÄ­³årSÂ1 Ù FÇ4Ö©B¬¬6£vù (²}åÌPip#¸Å­‰Ÿ#ë…e_·ÒÍ‘ƒ[@ŒmRªwŽTÇp9S…-uŸoÖz‰ÔžQ®(² )Øõm¾èÔŠËwT}&µw‰H‡ï(>žâ˜f’q® ,›g©MØm[þ…= ˜vU^ˆ^u%¶]Ã+¾[TC zxzÚ"‘’ „¶Ü]%å­ß½ƒ¯ò«´”¡/Ä<É„_·ˆz÷×HCǸSV‚ß&Œ×J NTßqõ­tj+„‚½‰ÚQ9^@¡îôÊUm v:)‘K°%Ã+' Ó>‚.Á€xzÃÕ "ŠƒïbG&©ƒp 8òaiY713Ð/£8Q&震Ã?ë°'Íöɲ;ER —áÂÝv1€a­B,A—ùw§ÆJ:uúéeŸXù„Ä;Ø‹zcí9$ÞÍUi$w~zÙF\%¼ìšN©„îz$³+ Ïã„$›ä·]'Üž^ÒBªU¦c› ç…æOÖƒ1Š¡Mݵ0Ï1›s‡]û‰ïÓL—©©q!4nCZœ^ç~n=CQ5'þœhç/—.5uÆj.n´·'<¦¯Nà²1°7r•fK½}ó”™#øÀ·ÞñDF ~ÁhKR™ö¹²0ÝA`ÏÿGP}XÉ-Ëã¯~À÷Ÿ_ãÑý~ R/F"w±ʇ‡GÅëõ^ÉÑý% x…>¡{uWePd{[؉`º{Uðs„‘Vñ¥f*B³9Dbê1U¤ØÃ\RÝ<¶Œ·våÎ!äô ^M¢.Êšâ ÅšÑg …-VL<¤son ½†¿dÙY[©í/FÌÕð8$Ð/é¤X¥¨ÿR1Q¢l4*ŒˆKÂM.€îåKÖ,“e§ó^ÿ5ÝgF¹wæ3û•Yƒv-H mL©LûNæýçTy8žÏèã¢ÜT×4;õ¥ÁìªHm¨Œ®V`ï1\ÕÌç)t>Ï"0¿uKpÃK±w„V•d¼ D1rejðë1ÆŽûÚ•$d™­7_§¥ÉÁû3´Å5E3¤œ¥œ3?e˜UÊ1sÀ솚 k“éÉlÂÈ.2j9afé{ͼîŸÍ£‰öÆûôö²H‚m^»žyßÅR:7k* n$ "ËÑÔèOYpgaoËé7áÛIµ¶$®à3ÉÙr;|8½eÐðÚ2²FèƒÂ¼q‡öó›Å̇ÇÓƒcã1œÌ±~e~âGgDL¨"Ï\¦ØPÊðÝî ¨ké²ê¯wç·|œdÒŠy>ƒ¥Æl’F"Ì$;ä÷@$ȾŸ¢$±ž j‚‹,Ä ÇècG™uÜ^Ø‚ jy?ï1Û€ Iß}¢÷bv²Ëga„YqVÌ“WÂɼĜ†s1Ì¢$J<¬–„]¢yéÑA‰I/ü! S}f-Ôrhøý7fªü{’” ¬¯Ÿ[A30Ëð8Ðq„¡OVMí×…œH«9¬«ÅÞ'Þ¥ý|*Ưʃñ÷ò è"gïI ¾Ímž Á*‡©m;G÷ÜJ\ü½¾­ü[?­á³È†ª¶¤ÄÍ¡¨Z"i¤ë‰X:*°Œ-p»ÒdKeûk+ .Á”;©k?Šž9ß‚rRò‰s„_ BmgbÎòuÜÁ~B>H>ƒ€Gþ‚Ùß rßhNš|€­ºWîZZ)êÏÀvÔÓ¡x~GFü¾RR²·þ\ÖÌt˜ÄM6G½lù2®EP—ïí[,b±Fu d ­,ÄÕœF^…ZÐz‘]?ŬشԞÌ )+ L¢œøMv9xY7wÙK lþÆê´=Œs¢zĈ®Ù}ŸgZD k¥ì 2îU¡ÉhœÞkñSdkXÏÌ=RÙ“>³Û•˜L!Ž#oªEÅOD¸3"o]ÔòîÙ³Žƒõ×´ä±¾V§ú[IP›Ù^¿KóÎèhÍÄ‚ 4k\Í[‹!mPCc±§TLy3úÝ×a‚Ï_a(‚ô[âû±0…(Û°’¾%.> f‘ÿ0 €µÍPÛ£FæåÖbá×RͳÃÄÈmò+†¼õWÑÀ¯æLŸŽr¦•R™hR–Ò[¶ÌÈ3”5‚”û'¢w‹ë¶hé¡aYÕÒ'¤¥ò“Fò¹šÍ6ùfàø–Átâq¶|פnFÀvïu{Ð<;Áùy5@jjšç²MýŠ:wNž)N¤Í§|PØNzàŸ>ñfœ&â'x!ØŠƒ¾3°ßØ“Æçk LFu…ßʯ—ÿz#s h !ÝÃú² ¼ÓAA÷­Ž»ð›¼ÚFÕô{‹ÉoǽA6Hr[sOÔCvZ ù+´1Þ÷ÉÜH\ËfSõ»£äwœ…~­hìÑR^ªKÄ?¸S명¦S"5kgèÛ‘™eJh40 Wã1‰=€¶ŽŸØçâÁè\rˆDöI‹ ò‡³×~=÷4®Ë%±-¥ßSNÐônâwaNëö>*þ`x_®¤³v ó¾ÁŽ5Kü4 »®ŸzÆÑ\QÿÈàRCw‡/©`¯ÚäÍõ?{\ê]=d•pïî,/ʸ8šM‹õ¿ P¢iÀ°òPz2Ä*°Ë H„Úšve*Ñ:'iâ’&b"ÌÎýoæçˆSŒ`]}§Âº¡™¹/æªÊ_б„z±05è´Â¸ÛG:ª)¤0~×WÉ/`Ç·ÍNj>S“ÂNœ 3‘(—³3õ“ËÆQYÚœº›<Àª+™~wNp¢pÐâå|Xôѯ\ƒHÔ5SêÐÍ¥V¶ôâ§a¤Ö"™bR NùcòS£iᜠ¹"òÛBiñwØ %#;D´-4–‰bjÔ@íÞ«i¹ùóð¯Í@ó n'ߤ×D³[Êö_.?â¨ç2qy–»üî´„àeÆžZf„i–=:-°pŒÌŽ5ˆño]<’ñ5å. tt瘽«ÃTßD)¥äu}¸½ÌaÃä|žÛ»ŠMœ9äNÜ“´_}G¬ßôÉFµó½@6GÈyä¨â®Îyó;—(ùjFu›m£ƒœTˆîÂ>±bá¢S:F„iT­‘Õg0Z… •WƒÝmwÔžæJòy‹BFtr,µnœOˆœX ~éVY–ÕJÐÍ/ŸÛ’]¤&&B u×^Â!ŠœL½ž¦HÏáÅfÌ5ïrµº!•ó#V#®¡ÏØré„ö2‡šUÌa*tÆ(iî÷lìXÄ1%Üô†êÇõwô+…s{ÇâéL-ý‘óÔ5@rNk–6þDzáD½o½†d°â‰<;íWæ³Áfd¬ùº©ìH¯ìÔ¸ðŽxø«LÔ¾¼µù6&Íùlü‡Ât%3‹„J@/Œ…J5‹0¦ÓÜ2®×i+$l%%Ú µÏ~< úÓf RtÞy†½óæÌæ>~*¦%· 4ö76x7š8:äOâ£~rŸëÝŽ§ ( ˆ–Ï8"™ø¦\¾„Å^KÜ tCHÊ‹y]Ë[Ê\ ªòh_\/Žu  NPLmŽ)ûŠqƒ*&Í5fg­!¾±[ —<)º… וš/ð)ta*¦H§ŒŠ!hÍö©SžŒx4D–•´cVâ|òÂå]ˆ®´øB¹•DçɹÒî„íu”ñÛžïÅèø I† †"§—§«ZÑxQw‘™=Î\1O}Ë£œµÊš¬ÕL¯ïptùd†åýÔ<ÆŒïjjm+çöÙûj_Ð0F×<äû5pO·²Òvïõ‘öŒ±™0_*ñê¯û9²ø“÷µò [J¡éM½ÁÞÎ<ÍÒwZxpÑÃKPÇõm¿Ákå9a|ìÎT÷œ›©Q0Û}©¼ù eõÆ?U i¯mo,qÖ‹×P¨Øub®Åq ªàiO[¯B&b†Þ™ñX{•@Ôèá¿,ѹâÊÌâ_ñ0óBÜrCÕ²±‚aÞ¥E(%Ï$J—o@êá ©9vY­Â¸‚.%Ò„Îó–ÂÔ+LþÔÄ ºÂÎÙ@»^ÌãõŽÇÚoˆK´"¸w©ôk@Ÿ8…´Ïô7„~Ý¡©\™3f…yÀºg1nT«5Ü俤_Päúú¤~aÊ!¯O¤&Ý!ŒñYìºïq¦Á¾}[z,Ÿ¼i TÀïkâhR¡«®ç£Mí¬ Q·¯ë¼)-‚l§|(Ѫ‰ƒìðMÁãs}Q»Œ·{ßv(u‡-In_oâBúü¸z—á`ÁaÛõ‹&ÊâžyÅ’á:´£ˆûû . „¬uÔ´šUÉ“¥㣠èÚ¥c6zü*üÐßöšT~]ÆeGÁ@àUYèOáMתyŒL™™DW÷«ÛH[¼N?ÜÄçÀ7*7GRùPõ¾½dýOŦöOÙ^ å#­¹m»@{¨~¤D(ž»`gfGÂÚ xÖÞÎöèC-Æó¶—ºïÃ}í–‰mÔ¿KÊX¾ç°G×U_nl]Õ>1Ñc$Åíc`ÜVù;R }%@\E å›P]V¥:;VÌ‹Uo9¤“P[䯂ϨšíjäxÉpVÿzXê±°»+ »ŠNs2uëëÏo\f’ 0l[ÄÇoëóüFåj2ˆ—ñ½`¨Ñ`.šcE$‘/Õ&kKÎÛ± Ròp³7K0›Ę§6ŸÐ"OŒÒà+ê&êZg©‰öÒdê“k­¦'K,)¥ÿe-íoL^Ü*ÕEk´+w´ê@ƸÅð,I³_Ýò ‚—])¥ÄsÔñÕ+¥>hï‚UUj}«O½‚b¿ŒhŸ›Ép¹ìŸï5¯IËå”e rë¨V™÷ǰÍ#T7#û‡åžÓˆË+,Q–êž¹Ä9³®œP/37&JwÛ~Ô”8: ëX)\¥ Nö qÓgôu‰C,@®Èµ,O1}ùïÌ;pî^v‘~¾¶X>É!÷cØí¿RÉ Ñi4ø+ÈÔzDÙ_ÁÖÊld« A]?#íáï¸Ç¬UÞ¸ r‰|ÿöÃOx)ö§Ÿ‰¬†~«þ…ô¼ãúáå‹ÚrlB}à€9ígRMÿóó/ÇÓ¬?¹o63 æoŒ ¿BywTÍ­úwJøT÷x þÂ-³_“ƒV–u?Ómf:`Úª~ük/"T7¬W¹`·ÆEš³þŽü ¯’V\"&ß™°"¶ÓÀž5\·XÆ|òBeÚç:ƒW0'ÍÂ,ƒûÀ@êŒ,¹ï´qÛOÿÝX/èÛìÞWª`¼&V}4Æ7Ž4^>vØîgïïJ¹EDÞœíÑÚ‚Ðã¡ö"­Ôš=bD²,L¨Áè·®ñúJÎ53…ªÚ¶‚ŸKàC˜{AFØŽîÏ­«[3'^¸‚Tµ·)"OX!tfžãì¢ÓÈÚ­ýYéû·ä{"¾T}õm´q†S·d:ûù¿Ê Ñg3um´MõoÙ=6ex| ÒCm ”?kªŠÎá•5Ÿñµ<,VÞ´æb±ÆéÓŽt° tC|Þ$ËCäj1>Îqe*ì1ñô‚û±Ûí1ü'Áä¼IŸ.§ýêô$Ö»GB5¯©rg¸ŽQÆ­lÉKão-Be3M×Y¸ 0±Š8¼ŒL¿s‰»Y?]W`·òà™ãUGgÖž×ö{Ô(³ÖV‘Niâ’$\hcAa@mE×-…øÈ¿›‰çLz•tН )Kü~»Çp Ó/ºyg<[t‡xˆSRí ˆÎ²0K¦v„F¬fÖ^}¢Q;åßö¦Øš^ý >ì°+rU{ã¤ëøê÷ÃyÓÁs¡X“|>†W]ˆë¹fTÚϽÑ.¶S…[~æk“§¥uG=nLy¶óM4îlæLî°;¯¯?äj¿?›gŒäñRËŠœQ;:¡#y|oíNƒ«'¬N)‡°Vz Á’J~ÚU&¼M£zZ©—Ý=\!ßœõû¼µFL* l¥úï4Xò1Z øò ÓTž<Ó„â-yJJÊ›ôHõ§pÅ-?O£J°—Zl ·‘Õçø†Ú•¬W5Ò,τ⋭WÏ@¦Ú´ ˜¬Œ’-ŒhNrÛH ½‹¦‹ÈCSW×à„'ÅJ©‘(ÿ‹Å¶œ[Aó<·8!ð‰\8dt< ׇ‰Ð5s‹‘d`˜’2;(Ço~”ùÇ«ýËê$ˆ{Ð:8ß •=81Þó—+,µ©j)… þÕ¬Ïõ3‚|,ßäµìw·~·É9âZÁºv¾2Ö·Êâ¾Bh*=Õ+¼éáR˜“|Þ_#HŽlßÙäx<ë׫( aºt^xSåKRÃó¨S¹©Øb»ƒ›,÷R¨ÿ?Ù^Œ endstream endobj 113 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.14)/Keywords() /CreationDate (D:20151013203236-04'00') /ModDate (D:20151013203236-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) kpathsea version 6.1.1) >> endobj 2 0 obj << /Type /ObjStm /N 95 /First 742 /Length 3230 /Filter /FlateDecode >> stream xÚíZYs¹~çWè1®[AûV•š*/±“;‹—,“ò±;6à™Éýõ÷;RêãdÞ¦ Ôjéè,ß9:’@’ f™Ì1cYdÞ2)XÔL⣓<<“-¨ÅÀ”dJ‡ŽRL9Ôe*âáÀ&¢Ê´1ÄQ[<4ÓZ˜’iÏŒÆ#@ú#3AuŒbÖ£_3a(­ež¹…óÚ1° ^3ëXtÐNBAa™…6Â8 B“GúZ¼€DE<#LÐÐLÁp'`8XBò,ú]°D– ¦ÈB­h¨” >Ñ*æžQ1t)d¶K‰w°–°¬•„}ž€†Tz‚@x§U†E;Ðð"° ˜‘P*Hf<„]+A•,`É€Åá=BUtÂ$§0®qFŠN„êFFÕ„g¾Sä4àìM 7j(Í%Ðò¬­gº1h \  Üáßà¼èÝàÁ×’TR@ò‹tàt£‚>R¡;ú1‡tV¤ñR #À'p^ÄH7ÄHÀòbBªÀ$%HáH¾@EA3I kH´ÜˆÔ òº§šõ)¨Ï§wŒ:ID-¾,)B¨‘‘›ð&bçÉÆO?Žßc&ÕÅ´?våûí·Î£çÃéxty›Ú¶Ö«L|z]±«qïæš] z“É úÛOó!3 GÕôzt9a£Ïyì†Õ²NF_+¶WM{ýÁšA3iÇÕ͸šTÃizHèÓË«j²Þ4]ky;˜ößCAݲëĵ5g“Šíö&w)b2åNÿ¦7žö§;X­ÌG$ÁŽßïOÏiÈ“'~úý¦büuïªêðÝÑp &˜dDØáÇÕdt;¾¨&”VRËQuÙïíŒþf©ÁÑœŽê¼cŒ¤h&²šw!òý‡ß™]J ¶‹€Þçëèb¢]|õë­1]Ó’¼‹Á´¯ÒÏð¤Yœ«HrS×ÍÚ\Ç|A¨ë†fw®##Z1£w4û©iüõxtqRMÙG ½·Ïøiõ÷”ÍYékÛn€rƒ5÷sCƒ.&BWbÍZƒZ‰TN‰Z ,ˆíŒ6ü :NµÑq R'ï‡Nƒî®Ø["Ä"×ö ]”¿Y”–XF¦§ehúÒ=Xœ] ØÒuOXrÛÄ=|{8ÏGÚu-q©»ÃOn?MÓûaø¥ÃwFãËjœËsþŒ?ç»É$qNš\À)‘[a¦³¾«`¢Ô¶KË¢òÚYÐm³û.…#ý=CÈß7„Ú„Vû.ö?&4ùMóÜšÙ»2šîŽˆ>è®?ï|´.vuTâ-D¤_<ñ¤d*-ö7©;ÈH%FêºN}÷ýÖ£sI;´ÄÛ¬®¬ËÜQ¨E‹.vAvioQ÷J£Äî šE´£ñid¥‹²›6Pô ’à4 D˜ëÁ)ít :Q`æûZ°”!5g-Ré…ê†ZsWÔÛVYL‚ÌÔJ au]yÔµ•õˆÜ:Ã!i,ܼ%ZDøläœ:SO¶›Ê䛲7c•êäW^þýþc_B8’­ViÞ§²h1«²U§èÍenWÑQ€Ò†yNÌF—\Ï4G•÷Ý0{²\úTZHYÔ,"€æ ÚE8ÉÖˆ?´jJx.Í3š ñ"QI#k@L¤Ø GÑ š.BG1ï ­Ôçm¢£MèˆÂ¦Ì- Š4°‰õÂö4¯Ê§‘ º ©ÅD¶J R'ŽJ€ %K´ÒÔøt|ãÔ‡™–é $B‡„­þÿð Ђ¼¦-Å_®ç¼÷3eͳ(½ksÎ-ÞP´y‘’»LköâΧüiUš#”)3iæ)Šæ”3åÏ N‰k_KP)«;š‹µ„L™Ê‰OÙB3BÏ‘H+fJiSn1N¤ïâ-÷.ÚÊ1ÔªRþ2Íø¤W‰Kâ§hÙ3"Ͳ:7ÍF;G:™´ƒfHš³6ç¥Ì]딨̹F‹ÔK¦õ¥\cÒ|Oo*!5ÏG1­•RÈä¢"y©9I³¨•TeªX$ºº¯Po•bë¾jI‹ÌÕø”´ý€”FE †lV‚-'Ç:¼Ò®è´ËNXØéh1%µÄ'·¥±5÷¼m©·4‰¿ÍpJ¡æâ-í¼‰õÂÐv­€ 1«½QÔ ï¥Ö†OÕ‚Gí Û¤Î:m¦tÞf‡½Ù€\Ïe’L"íTÚaþl™ùÔ¥¡%ÐΫ˜ªKz§5Œ~ŒdQ¢¥ÍžNëíäÒ¬‡ã4ý"HIذÒÁ9p‘·i]r´e˦Ĕ4l]X2eò°ÇÂF›D“èH°”8ñæj.]ðs­IN‰Fi‘5.e%›°OÏœMY|MO­3ûSk¤2·DíkŠmî7–ô0¿Ì¨Î‹C;öªÉŸ3ó9äeï+zŽÏ>¼}qüŸÝ£÷R cлš0“)vÒáð1ÎË…­tô1á¶'tDt”»½›gUÿê¯Áá(Tå¾Ç’:ŸO{ƒþÅöðjP1°?™V_ß‚zÞ׃GàqÝÓ)æßãOù!Éù;ÞãŸø¿}ýÚã—¼âŸù¿æ×ßo®«!ïó?øW>ä#>Vü†ßЩuP}žæÚ˜˜ó›jÜ]ò1Ÿð)Ÿþ5â·üOþÿ{+¸ß‡Z¡ñ3ÄðúýÍÉË7Ï2^j ^šð¢ruü5x‰¸¯¾ ÌpÀ>â'ü”Ÿµ‹­Ï8ð7!4!k s=®ªŒQ³ :g»oŽN:§Ï×Å“Šu<)OñdŠÏc £B~-B½Á 7Ìr›˜uüîùîÓ3˜u´Ö(ܳQ„8]ßÓ(¯ ›´,mz ò·õÜÖžl61ðèàÅÞÓ×É@¿Ú>9Ë^þ"ó‚\kÞaiI›X²ûìàÕ‡ÿ&KvÖùJÚYJ÷3´ @©×à ¢Z ƒ6J8Þž¼Û£Ø;^g޳Ðñg|3Ï7.®õÌvpžò}„ ý®GÉúÒuN>o‹´= ‹ä]}»í ()ѧÏé3X‘¡þà_ÚYêŽÄ~3¸ðoüÛíhZ厥d–>ÿÎÿ×ðÁFimÿÃÁÓ×Ékf‡ò³é¡Ô/q_ïB–5¬Ù(›½~ñüèí¬99<=]›¤)¨4xÒÿÙ…AR6 ¢×¹AJ©Ö‰÷ª]„M…P¸W=ø!‘W«5þO¿ü4¨ý}Ë¿7ðØ(ù½ßûï»ý]ÂãÃ]KV¤á%e opÀÙKF¬ÅãS¯±Va^obΛߟoŸíÀœõ+°¶óp5¿(›»pgÎXdŒClT^Öùbõo±M™oQ¾ÍýL³ù{ÒéÙöé˳·„ÎÚÐ79ò­þ©Èß,›ÒîEÍ ²(!óiÜ»øRMSè×õüËÉuÜ—º¥)²´ó¥+!+¡+þΡFè¼Ó›TéÏ‹¥Ciº ’þ4Úï'S24Åùa¯~‘ oïú—Óë ]>ÙXx{÷Ýn—„ÛR¸ôsáAn.|ysÛïÛâ£oˆ7 Ûí€omB[Âc[¸ áð~sá­ bSv”mÙÞ²ée&Zl.ziG×¾q®Œ8WØ­6ÞÚ}µD/Å¥„"ØÕ"Þ`xs×ѽk&¢maõ"}y‡Ð’¾lÚ4 — ñH1í¹)œ.‰µae¼¥·™x·¹øöÚ¿œâÖeZ T[ºýô…çWì‚èrÀ„nÜB¾è_Næwtê['õeˆü‡vëßþW·ÓAH,’,{7Égº¾W0c>ØÇF×'ómºO™jõ5ºp—ßÇÕŸt¹®Ô9Õó¡¢1T™rdX©âl¤r+G¾¤˵Z1ÒÎGª;Ô %Wxf¦NŒ*‘y¬Z²äL– MYnY19ÇQ6q …ZR5T…*³—ZÙâ>‡ZŠUÜ“¡«Ôšíî@«}æ¬âLᤢtw¡5wŒ\-)qoÄmüäöFO¦½ñt‹.ìRˆ?ºÁt ;$Fïj‹îë.Þõs%½Ù¢‹·é½¸‹©ólá‡ý¯ýiK\AwÞÖª¸¡é›L!WéfDk[7µnjJ¹¢Lå2}º©|[áB“6õ²Ö­+’º¾tCGÆ%Q­á+ÇÍ…æ$EwhIÝ ÍÏx'äwqDFÅ)W¬Ê»=lâGWœ*ç· f‰¯´…”ó8¼ªŽF—?›T‹,ùê¦n'èæx-ìÿ j… endstream endobj 114 0 obj << /Type /XRef /Index [0 115] /Size 115 /W [1 3 1] /Root 112 0 R /Info 113 0 R /ID [<3FA803979F0CA3ABCFE07426220261C0> <3FA803979F0CA3ABCFE07426220261C0>] /Length 277 /Filter /FlateDecode >> stream xÚÒ7NCQ@Ñ™GÆcÒ“mÂ'šœŒÉØÆäœ…+Z6@› BT”´Ð"$:zB ÜiŽ®ôF#ôDD~ˆuÉ€Pµp <8‚<ȇ8„(„8€"(†V؇(…6؃”A'ìBÊ¡ v àÃ6„¡ª NEBvB5ÔÀd`6`Ö`²° P¯|´-X„4´CšT"9i†UHA7ÄTüO{í€è…>臈à Á0ŒÀ(Œ©Ä¿l˸ʵXM¨<¼XMª¼¥­¦T¾_­¦U~n¬ªá;«Õœo•T½õ¬fUŸ¯¬æTߟ¬æÕ¹{«Ø‚8…38‡ ¸T—øøÿ/YOþ§:#; endstream endobj startxref 150039 %%EOF graph/inst/doc/MultiGraphClass.R0000644000175100017510000002027312607321273017611 0ustar00biocbuildbiocbuild### R code from vignette source 'MultiGraphClass.Rnw' ################################################### ### code chunk number 1: loadGraph ################################################### library(graph) ################################################### ### code chunk number 2: creategraphBAM ################################################### df <- data.frame(from = c("SEA", "SFO", "SEA", "LAX", "SEA"), to = c("SFO", "LAX", "LAX", "SEA", "DEN"), weight = c( 90, 96, 124, 115, 259)) g <- graphBAM(df, edgemode = "directed") g ################################################### ### code chunk number 3: nodeAndWeights ################################################### nodes(g) edgeWeights(g, index = c("SEA", "LAX")) ################################################### ### code chunk number 4: addNodeEdge ################################################### g <- addNode("IAH", g) g <- addEdge(from = "DEN", to = "IAH", graph = g, weight = 120) g ################################################### ### code chunk number 5: removeEdge ################################################### g <- removeEdge(from ="DEN", to = "IAH", g) g <- removeNode(node = "IAH", g) g ################################################### ### code chunk number 6: subGraph ################################################### g <- subGraph(snodes = c("DEN","LAX", "SEA"), g) g ################################################### ### code chunk number 7: fromTo ################################################### extractFromTo(g) ################################################### ### code chunk number 8: loadData1 ################################################### data("esetsFemale") data("esetsMale") ################################################### ### code chunk number 9: dataFrames ################################################### dfMale <- esetsMale[["brain"]] dfFemale <- esetsFemale[["brain"]] head(dfMale) ################################################### ### code chunk number 10: creategraphBAMs ################################################### male <- graphBAM(dfMale, edgemode = "directed") female <- graphBAM(dfFemale, edgemode = "directed") ################################################### ### code chunk number 11: bamIntersect ################################################### intrsct <- graphIntersect(male, female, edgeFun=list(weight = sum)) intrsct ################################################### ### code chunk number 12: removeEdges ################################################### resWt <- removeEdgesByWeight(intrsct, lessThan = 1.5) ################################################### ### code chunk number 13: updateColor ################################################### ftSub <- extractFromTo(resWt) edgeDataDefaults(male, attr = "color") <- "white" edgeDataDefaults(female, attr = "color") <- "white" edgeData(male, from = as.character(ftSub[,"from"]), to = as.character(ftSub[,"to"]), attr = "color") <- "red" edgeData(female, from = as.character(ftSub[,"from"]), to = as.character(ftSub[,"to"]), attr = "color") <- "red" ################################################### ### code chunk number 14: loadRBGL ################################################### library(graph) library(RBGL) ################################################### ### code chunk number 15: createDataFrames ################################################### ft1 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA"), to = c("SFO", "LAX", "LAX", "SEA", "DEN"), weight = c( 90, 96, 124, 115, 259)) ft2 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA", "DEN", "SEA", "IAH", "DEN"), to = c("SFO", "LAX", "LAX", "SEA", "DEN", "IAH", "IAH", "DEN", "BWI"), weight= c(169, 65, 110, 110, 269, 256, 304, 256, 271)) ft3 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA", "DEN", "SEA", "IAH", "DEN", "BWI"), to = c("SFO", "LAX", "LAX", "SEA", "DEN", "IAH", "IAH", "DEN", "BWI", "SFO"), weight = c(237, 65, 156, 139, 281, 161, 282, 265, 298, 244)) ft4 <- data.frame( from = c("SEA", "SFO", "SEA", "SEA", "DEN", "SEA", "BWI"), to = c("SFO", "LAX", "LAX", "DEN", "IAH", "IAH", "SFO"), weight = c(237, 60, 125, 259, 265, 349, 191)) ################################################### ### code chunk number 16: createMG ################################################### esets <- list(Alaska = ft1, United = ft2, Delta = ft3, American = ft4) mg <- MultiGraph(esets, directed = TRUE) mg ################################################### ### code chunk number 17: cities ################################################### nodes(mg) ################################################### ### code chunk number 18: DeltafromSeattle ################################################### mgEdgeData(mg, "Delta", from = "SEA", attr = "weight") ################################################### ### code chunk number 19: nodeData ################################################### nodeDataDefaults(mg, attr="shape") <- "square" nodeData(mg, n = c("SEA", "DEN", "IAH", "LAX", "SFO"), attr = "shape") <- c("triangle", "circle", "circle", "circle", "circle") ################################################### ### code chunk number 20: nodeDataVal ################################################### nodeData(mg, attr = "shape") ################################################### ### code chunk number 21: edgeDataVal ################################################### mgEdgeDataDefaults(mg, "Delta", attr = "color") <- "red" mgEdgeData(mg, "Delta", from = c("SEA", "SEA", "SEA", "SEA"), to = c("DEN", "IAH", "LAX", "SFO"), attr = "color") <- "green" ################################################### ### code chunk number 22: mgEdgeDataVal ################################################### mgEdgeData(mg, "Delta", attr = "color") ################################################### ### code chunk number 23: subsetMG ################################################### g <- subsetEdgeSets(mg, edgeSets = c("Alaska", "United", "Delta")) ################################################### ### code chunk number 24: intersecmg ################################################### edgeFun <- list( weight = min) gInt <- edgeSetIntersect0(g, edgeFun = edgeFun) gInt ################################################### ### code chunk number 25: intersectWeights ################################################### mgEdgeData(gInt, "Alaska_United_Delta", attr= "weight") ################################################### ### code chunk number 26: loadData ################################################### data("esetsFemale") data("esetsMale") names(esetsFemale) head(esetsFemale$brain) ################################################### ### code chunk number 27: createMultiGraphs ################################################### female <- MultiGraph(edgeSets = esetsFemale, directed = TRUE) male <- MultiGraph(edgeSets = esetsMale, directed = TRUE ) male female ################################################### ### code chunk number 28: graphBAMs ################################################### maleBrain <- extractGraphBAM(male, "brain")[["brain"]] maleBrain femaleBrain <- extractGraphBAM(female, "brain")[["brain"]] ################################################### ### code chunk number 29: edgeDistance ################################################### maleWt <- bellman.ford.sp(maleBrain, start = c("10024416717"))$distance maleWt <- maleWt[maleWt != Inf & maleWt != 0] maleWt femaleWt <- bellman.ford.sp(femaleBrain, start = c("10024416717"))$distance femaleWt <- femaleWt[femaleWt != Inf & femaleWt != 0] femaleWt ################################################### ### code chunk number 30: nodeAttr ################################################### nodeDataDefaults(male, attr = "color") <- "gray" nodeData(male , n = c("10024416717", names(maleWt)), attr = "color" ) <- c("red") nodeDataDefaults(female, attr = "color") <- "gray" nodeData(female , n = c("10024416717", names(femaleWt)), attr = "color" ) <- c("red") ################################################### ### code chunk number 31: nodeSub ################################################### resInt <- graphIntersect(male, female) resInt graph/inst/doc/MultiGraphClass.Rnw0000644000175100017510000004412512607321273020160 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{graphBAM and MultiGraph classes} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \begin{document} \title{graphBAM and MultiGraph classes.} \author{N. Gopalakrishnan} \maketitle \section{graphBAM class} \subsection{Introduction} The \Rclass{graphBAM} class has been created as a more efficient replacement for the \Rclass{graphAM} class in the \Rpackage{graph} package. The adjacency matrix in the \Rclass{graphBAM} class is represented as a bit array using a \Rcode{raw} vector. This significantly reduces the memory occupied by graphs having a large number of nodes. The bit vector representation also provides advantages in terms of performing operations such as intersection or union of graphs. We first load the \Rpackage{graph} package which provides the class definition and methods for the \Rclass{graphBAM} class. <>= library(graph) @ One of the arguments \Rcode{df} to the \Rclass{graphBAM} constructor is a \Robject{data.frame} containing three columns: "from","to" and "weight", each row in the \Robject{data.frame} representing an edge in the graph. The \Rcode{from} and \Rcode{to} columns can be character vectors or factors, while the \Rcode{weight} column must be a numeric vector. The argument \Rcode{nodes} are calculated from the unique names in the \Rcode{from} and \Rcode{to} columns of the \Robject{data.frame}. The argument \Rcode{edgeMode} should be a character vector, either "directed" or "undirected" indicating whether the graph represented should be directed or undirected respectively. \subsection{ A simple graph represented using graphBAM class} We proceed to represent a simple graph using the \Rclass{graphBAM} class. Our example is a directed graph representing airlines flying between different cities. In this example, cities represent the nodes of the graph and each edge represents a flight from an originating city (\Rcode{from}) to the destination city (\Rcode{to}). The weight represents the fare for flying between the \Rcode{from} and \Rcode{to} cities. <>= df <- data.frame(from = c("SEA", "SFO", "SEA", "LAX", "SEA"), to = c("SFO", "LAX", "LAX", "SEA", "DEN"), weight = c( 90, 96, 124, 115, 259)) g <- graphBAM(df, edgemode = "directed") g @ The cities (nodes) included in our \Rclass{graph} object as well as the stored fares(\Rcode{weight}) can be obtained using the \Rmethod{nodes} and \Rmethod{edgeWeights} methods respectively. <>= nodes(g) edgeWeights(g, index = c("SEA", "LAX")) @ Additional nodes or edges can be added to our graph using the \Rmethod{addNode} and \Rmethod{addEdge} methods. For our example, we first add a new city "IAH" to our graph. We then add a flight connection between "DEN" and "IAH" having a fare of \$120. <>= g <- addNode("IAH", g) g <- addEdge(from = "DEN", to = "IAH", graph = g, weight = 120) g @ Similarly edges and nodes can be removed from the graph using the \Rmethod{removeNode} and \Rmethod{removeEdge} methods respectively. We proceed to remove the flight connection from "DEN" to "IAH" and subsequently the node "IAH". <>= g <- removeEdge(from ="DEN", to = "IAH", g) g <- removeNode(node = "IAH", g) g @ We can create a subgraph with only the cities "DEN", "LAX" and "SEA" using the \Rmethod{subGraph} method. <>= g <- subGraph(snodes = c("DEN","LAX", "SEA"), g) g @ We can extract the \Rcode{from}-\Rcode{to} relationships for our graph using the \Rmethod{extractFromTo} method. <>= extractFromTo(g) @ \subsection{Mice gene interaction data for brain tissue (SAGE data)} The C57BL/6J and C3H/HeJ mouse strains exhibit different cardiovascular and metabolic phenotypes on the hyperlipidemic apolipoprotein E (Apoe) null background. The interaction data for the genes from adipose, brain, liver and muscle tissue samples from male and female mice were studied. This interaction data for the various genes is included in the \Rpackage{graph} package as a list of \Robject{data.frame}s containing information for \Rcode{from-gene}, \Rcode{to-gene} and the strength of interaction \Rcode{weight} for each of the tissues studied. We proceed to load the data for male and female mice. <>= data("esetsFemale") data("esetsMale") @ We are interested in studying the interaction data for the genes in the brain tissue for male and female mice and hence proceed to represent this data as directed graphs using \Rclass{graphBAM} objects for male and female mice. <>= dfMale <- esetsMale[["brain"]] dfFemale <- esetsFemale[["brain"]] head(dfMale) @ <>= male <- graphBAM(dfMale, edgemode = "directed") female <- graphBAM(dfFemale, edgemode = "directed") @ We are interested in pathways that are common to both male and female graphs for the brain tissue and hence proceed to perform a graph intersection operation using the \Rmethod{graphIntersect} method. Since edges can have different values of the weight attribute, we would like the result to have the sum of the weight attribute in the male and female graphs. We pass in \Rcode{sum} as the function for handling weights to the \Rcode{edgeFun} argument. The \Rcode{edgeFun} argument should be passed a list of named functions corresponding to the edge attributes to be handled during the intersection process. <>= intrsct <- graphIntersect(male, female, edgeFun=list(weight = sum)) intrsct @ If node attributes were present in the \Robject{graphBAM} objects, a list of named function could be passed as input to the \Rcode{graphIntersect} method for handling them during the intersection process. We proceed to remove edges from the \Robject{graphBAM} result we just calculated with a weight attribute less than a numeric value of 0.8 using the \Rmethod{removeEdgesByWeight} method. <>= resWt <- removeEdgesByWeight(intrsct, lessThan = 1.5) @ Once we have narrowed down to the edges that we are interested in, we would like to change the color attribute for these edges in our original \Robject{graphBAM} objects for the male and female graphs to "red". Before an attribute can be added, we have to set its default value using the \Rfunction{edgedataDefaults} method. For our example, we set the default value for the color attribute to white. We first obtain the from - to relationship for the \Rcode{resWt} graph using the \Rmethod{extractFromTo} method and then make use of the \Rmethod{edgeData} method to update the "color" edge attribute. <>= ftSub <- extractFromTo(resWt) edgeDataDefaults(male, attr = "color") <- "white" edgeDataDefaults(female, attr = "color") <- "white" edgeData(male, from = as.character(ftSub[,"from"]), to = as.character(ftSub[,"to"]), attr = "color") <- "red" edgeData(female, from = as.character(ftSub[,"from"]), to = as.character(ftSub[,"to"]), attr = "color") <- "red" @ \section{MultiGraphs} \subsection{Introduction} The \Rclass{MultiGraph} class can be used to represent graphs that share a single node set and have have one or more edge sets, each edge set representing a different type of interaction between the nodes. An \Robject{edgeSet} object can be described as representing the relationship between a set of from-nodes and to-nodes which can either be directed or undirected. A numeric value (weight) indicates the strength of interaction between the connected edges. Self loops are permitted in the \Rclass{MultiGraph} class representation (i.e. the from-node is the same as the to-node). The \Rclass{MultiGraph} class supports the handling of arbitrary node and edge attributes. These attributes are stored separately from the edge weights to facilitate efficient edge weight computation. We shall load the \Rpackage{graph} and \Rpackage{RBGL} packages that we will be using. We will then create a \Rclass{MultiGraph} object and then spend some time examining some of the different functions that can be applied to \Rclass{MultiGraph} objects. <>= library(graph) library(RBGL) @ \subsection{ A simple MultiGraph example} We proceed to construct a \Rclass{MultiGraph} object with directed \Robject{edgeSets} to represent the flight connections of airlines Alaska, Delta, United and American that fly between the cities Baltimore, Denver, Houston, Los Angeles, Seattle and San Francisco. For our example, the cities represent the nodes of the \Rclass{MultiGraph} and we have one \Robject{edgeSet} each for the airlines. Each \Robject{edgeSet} represents the flight connections from an originating city(\Rcode{from}) to the destination city(\Rcode{to}). The weight represents the fare for flying between the \Rcode{from} and \Rcode{to} cities. For each airline, we proceed to create a \Rclass{data.frame} containing the originating city, the destination city and the fare. <>= ft1 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA"), to = c("SFO", "LAX", "LAX", "SEA", "DEN"), weight = c( 90, 96, 124, 115, 259)) ft2 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA", "DEN", "SEA", "IAH", "DEN"), to = c("SFO", "LAX", "LAX", "SEA", "DEN", "IAH", "IAH", "DEN", "BWI"), weight= c(169, 65, 110, 110, 269, 256, 304, 256, 271)) ft3 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA", "DEN", "SEA", "IAH", "DEN", "BWI"), to = c("SFO", "LAX", "LAX", "SEA", "DEN", "IAH", "IAH", "DEN", "BWI", "SFO"), weight = c(237, 65, 156, 139, 281, 161, 282, 265, 298, 244)) ft4 <- data.frame( from = c("SEA", "SFO", "SEA", "SEA", "DEN", "SEA", "BWI"), to = c("SFO", "LAX", "LAX", "DEN", "IAH", "IAH", "SFO"), weight = c(237, 60, 125, 259, 265, 349, 191)) @ These data frames are then passed to \Rclass{MultiGraph} class constructor as a named \Robject{list}, each member of the list being a \Robject{data.frame} for an airline. A logical vector passed to the \Rcode{directed} argument of the \Rclass{MultiGraph} constructor indicates whether the \Robject{MultiGraph} to be created should have directed or undirected edge sets. <>= esets <- list(Alaska = ft1, United = ft2, Delta = ft3, American = ft4) mg <- MultiGraph(esets, directed = TRUE) mg @ The nodes (cities) of the \Rclass{MultiGraph} object can be obtained by using the \Rmethod{nodes} method. <>= nodes(mg) @ To find the fares for all the flights that originate from SEA for the Delta airline, we can use the \Rmethod{mgEdgeData} method. <>= mgEdgeData(mg, "Delta", from = "SEA", attr = "weight") @ We proceed to add some node attributes to the \Robject{MultiGraph} using the \Rfunction{nodeData} method. Before node attributes can be added, we have to set a default value for each node attribute using the \Rfunction{nodeDataDefuault} method. For our example, we would like to set a default value of square for the node attribute shape. We would like to set the node attribute "shape" for Seattle to the value \Rcode{"triangle"} and that for the cities that connect with Seattle to the value \Rcode{"circle"}. <>= nodeDataDefaults(mg, attr="shape") <- "square" nodeData(mg, n = c("SEA", "DEN", "IAH", "LAX", "SFO"), attr = "shape") <- c("triangle", "circle", "circle", "circle", "circle") @ The node attribute shape for cities we have not specifically assigned a value (such as BWI) gets assigned the default value of "square". <>= nodeData(mg, attr = "shape") @ We then update the edge attribute \Rcode{color} for the Delta airline flights that connect with Seattle to "green". For the remaining Delta flights that connect to other destination in the MultiGraph, we would like to assign a default color of "red". Before edge attributes can be added to the MultiGraph, their default values must be set using the \Rfunction{mgEdgeDataDefaults} method. Subsequently, the \Rfunction{megEdgeData<-} method can be used to update specific edge attributes. <>= mgEdgeDataDefaults(mg, "Delta", attr = "color") <- "red" mgEdgeData(mg, "Delta", from = c("SEA", "SEA", "SEA", "SEA"), to = c("DEN", "IAH", "LAX", "SFO"), attr = "color") <- "green" @ <>= mgEdgeData(mg, "Delta", attr = "color") @ We are only interested in studying the fares for the airlines Alaska, United and Delta and hence would like to create a smaller \Rclass{MultiGraph} object containing edge sets for only these airlines. This can be achieved using the \Rmethod{subsetEdgeSets} method. <>= g <- subsetEdgeSets(mg, edgeSets = c("Alaska", "United", "Delta")) @ We proceed to find out the lowest fares for Alaska, United and Delta along the routes common to them. To do this, we make use of the \Rmethod{edgeSetIntersect0} method which computes the intersection of all the edgesets in a MultiGraph. While computing the intersection of edge sets, we are interesting in retaining the lowest fares in cases where different airlines flying along a route have different fares. To do this, we pass in a named list containing the \Rmethod{weight} function that calculates the minimum of the fares as the input to the \Rmethod{edgeSetIntersect0} method. (The user has the option of specifying any function for appropriate handling of edge attributes ). <>= edgeFun <- list( weight = min) gInt <- edgeSetIntersect0(g, edgeFun = edgeFun) gInt @ The edge set by the \Rmethod{edgeSetIntersect0} operation is named by concatenating the names of the edgeSets passed as input to the function. <>= mgEdgeData(gInt, "Alaska_United_Delta", attr= "weight") @ \subsection{MultiGraph representation of mice gene interaction data. (SAGE)} The C57BL/6J and C3H/HeJ mouse strains exhibit different cardiovascular and metabolic phenotypes on the hyperlipidemic apolipoprotein E (Apoe) null background. The interaction data for the genes from adipose, brain, liver and muscle tissue samples from male and female mice were studied. This interaction data for the various genes is included in the \Rpackage{graph} package as a list of \Robject{data.frame}s containing information for \Rcode{from-gene}, \Rcode{to-gene} and the strength of interaction \Rcode{weight} for each of the tissues studied. We proceed to load the data for male and female mice. <>= data("esetsFemale") data("esetsMale") names(esetsFemale) head(esetsFemale$brain) @ The \Robject{esetsFemale} and \Robject{esetsMale} objects are a named \Robject{list} of data frames corresponding to the data obtained from adipose, brain, liver and muscle tissues for the male and female mice that were studied. Each data frame has a from, to and a weight column corresponding to the from and to genes that were studied and weight representing the strength of interaction of the corresponding genes. We proceed to create \Rclass{MultiGraph} objects for the male and female data sets by making use of the \Rclass{MultiGraph} constructor, which directly accepts a named list of data frames as the input and returns a MultiGraph with edgeSets corresponding to the names of the data frames. <>= female <- MultiGraph(edgeSets = esetsFemale, directed = TRUE) male <- MultiGraph(edgeSets = esetsMale, directed = TRUE ) male female @ We then select a particular gene of interest in this network and proceed to identify its neighboring genes connected to this gene in terms of the maximum sum of weights along the path that connects the genes for the brain edge set. We are interested in the gene "10024416717" and the sum of the weights along the path that connects this genes to the other genes for the brain tissue. Since the algorithms in the \Rpackage{RBGL} package that we will use to find the edges that are connected to the gene "10024416717" do not work directly with \Rpackage{MultiGraph} objects, we proceed to create \Rcode{graphBAM} objects from the male and female edge sets for the brain tissue. \Rpackage{MultiGraph} objects can be converted to a named list of \Robject{graphBAM} objects using the \Rmethod{graphBAM} method. <>= maleBrain <- extractGraphBAM(male, "brain")[["brain"]] maleBrain femaleBrain <- extractGraphBAM(female, "brain")[["brain"]] @ We then identify the genes connected to gene "10024416717" as well as the sum of the weights along the path that connect the identified genes using the function \Rfunction{bellman.ford.sp} function from the \Rpackage{RBGL} package. <>= maleWt <- bellman.ford.sp(maleBrain, start = c("10024416717"))$distance maleWt <- maleWt[maleWt != Inf & maleWt != 0] maleWt femaleWt <- bellman.ford.sp(femaleBrain, start = c("10024416717"))$distance femaleWt <- femaleWt[femaleWt != Inf & femaleWt != 0] femaleWt @ For the subset of genes we identified, we proceed to add node attributes to our original \Robject{MultiGraph} objects for the male and female data. The node "10024416717" and all its connected nodes are assigned a color attribute "red" while the rest of the nodes are assigned a color color attribute of "gray". <>= nodeDataDefaults(male, attr = "color") <- "gray" nodeData(male , n = c("10024416717", names(maleWt)), attr = "color" ) <- c("red") nodeDataDefaults(female, attr = "color") <- "gray" nodeData(female , n = c("10024416717", names(femaleWt)), attr = "color" ) <- c("red") @ Our \Robject{MultiGraph} objects now contain the required node attributes for the subset of genes that we have narrowed our selection to. For the \Robject{MultiGraph} objects for male and female, we are also interested in the genes that are common to both \Robject{MultiGraph}s. This can be calculated using the \Rfunction{graphIntersect} method. <>= resInt <- graphIntersect(male, female) resInt @ The operations we have dealt with so far only deal with manipulation of \Rclass{MultiGraph} objects. Additional functions will need to be implemented for the visualization of the \Rclass{MultiGraph} objects. \end{document} graph/inst/doc/MultiGraphClass.pdf0000644000175100017510000037703212607321273020171 0ustar00biocbuildbiocbuild%PDF-1.5 %ÐÔÅØ 37 0 obj << /Length 2573 /Filter /FlateDecode >> stream xÚ¥YoÛFú=¿BÈ…µ&œrH.ÚlR´Ø$k  ´ûÀH´¬Ö’¼:âæßïwÍAŠ’­öAæpŽo¾û¢ßݾzóÁ–])£Ëbr{ÃJUÖM\Q«¦¨'·‹É/Ùrª³]ûïá÷î-üù8Ù\gíÆ çÙÇ#ŒàwXý µ9.µðg¿‡?Ý^Mÿ{ûÓ›º™h­š²4xwåTi›ÉÌÔªn _ýISf?lálå’öw¼~+„Šxmduƒ°'…*ý™±ÊVÃú ‹óüÙ~™ÎŒËºÃÖ0eop\d&‡]2z…™èBÙÂz3]5ª4v2+g+¼ÑÓ™Ö„y„HÞ¿ƒ¿žGU™Í™pú°‘Ꜭs-ð" @$r,°TˆÝH`ø‘ÈXm=µo>Ô“F5Î8¨kekx‹Ìéx9î3ZiàQžyZš¬ >žB.*`Nb`ºfEnH9Zë 9\Á­pó†gæˆ×RœmålË5Ò¸ëx­û5×e¶b0¦>Ð zôš0ïÖà w‡Ç‡³ôƒ®ërŒþ1Ú‹Rµ;KüŠdÁ¢Þ]8³SÔqÆò?½øôZS)gŒ¿–,`>Öþ>-]Ö.;°Pôì–ïœY[dí^~kçÌàß7žG.ÿwˆì<)xãð >†ºv5è~u•²hU=Ê0ºXžA–4Øw„˜( %Û[|” _lù™Ý±ùÁ9"ÖfǽìØ,ýA¦Ê¥TÕFU.hôN<ÈÓ)1³Âæà›¾è¾¢ÊuÈèã0À>ÉâVLªi\¶ÇñE±•.P$­h+«ð7ÞG@áIvr:Š^+’b·¦ëèX‰NèžÏâ"WÂ6<üEX‚û–Dßã}Dìž8ö5áζüx ¦.;~#|kܽ'Ý~'cÞçiù¥„y$ÂÂÒž‘1[ã 3)Úyˆ]àY{@|·ÞÙ>ˆE œ%ì¶)e ÏNܽøJ¦-ý’ØIûðæµ¬™ð|ôÄ‹“OM¨¢XV(â%#±M6’Ñ1ÆmÏB î+B@‹N’9Ìãñóf­ÉŽ›¸LQÆ…Tîx1ª5ÅÀ ý<­ Ô1 |C-Ý S<…<Þ¶ ~¹ä) ŠërÔQŒ:·²<ïÛø²'oM´vÏ“! ¢˜S÷ñ£Wñ=´è²ò)ôü Ê„«íFh$;ó€D·¼.ϱÂÔ¹ªëò§ !’ HÀz²Iœ§dNå àc,ÏE!þ1AšBCʾ«Zy~#òËœt5.ùô–ô)^^cèž*æS›.Õ5ëƒ-ÛÝ]ÒºçÒ÷#n¸©TÓ„DdA¦uŠW6$z&l™FY]_µt¢Ö•dïÓ¯cÈ wLâ*Ƴ±øRå0Ô)aí”óƒ–<$û/u$¢‡Q ¡SŒ¼ã"µ’Ôw™pƒ\¦Ha¾}Ì×DËßÉà^¿¾ž½žbÖI8m~¿áÑý½ y¡+Ùô„î(ÐÝ{å8‚š|yëMÏó}âwŸA骟Aõ6x ÷Wê”u& úœtÞáeMx[詆§ãî‰Ð–IÁ™æÄãâ „Aѱ—„÷)Òªl‚¿¼ ~ ÑIC hƒ¤!"SàüO9°™SÃ*•‰›†êÕ–òHìÇ—"ãFie›‡Ž°§ÃÔHmeùŽÎˆ)Áê ú¬\|ýûÜ74îuPŽÄóIò…•øµ{RŒj-„§b”Xºœ#ÛŸª…NIŸá{~Ìã&HM²Ãï½|zÍiîòKà÷y|éÌ©Éôž?%*y3Ömýð¼¨oO—)8ƒæ\®@3Yú§,}ºD Ôª¯ñBo” zkà-×â«‹¯š’ý)ü•qÊÈkqô}²!£Eë–'7Öl‹Ÿ ƒ¢mró0_÷òø”ê×ÓA\—/F÷„Ç—?5ÜAƒñíK:³…¦ŸÂ×›0uóQVìÇ´ä“/æ¤ó)9<žßFGðé¤zN9YŒ±çe€ßŸà˜.Ÿi¬ºÞÛ™5õH6BýyR•á'šxÊÇm>¿ ‹4Ürâ8ò½¯„`Wë+ÚøÁeã×õ²È~“²ƒ¦¯wiz ͵¾iŸPí£úv—àƒßþ\Ç26~Ï{iKH+k™}6h7<ˆÕ/<¶_bïµón2³?íR#) Æ—"TU}eG_u‡Fôó(Fïs¹ªŠÀ§u(“£î“bøªú³Í5”;®©ú_Ä=ò¥÷5cüë…ä²Ò¯3üãl{õþöÕÿÐ"x endstream endobj 50 0 obj << /Length 1404 /Filter /FlateDecode >> stream xÚíXKÛ6¾çWA6°RER¤$ -à »Ýiz¨HrP´^{µZÞlúï;/J¢%?¶M€z D Éá<¿!ùröì»+ëFE\8íF³ÛQVÄzäŠ$Î 5šÝŒÞßMÔXAû0‰¬6ãçÐý Ú%´7О·ä×ЦÐÞ†äßeö´O¾‚ö‘?Ì~IòŽ$É(Ò*.TÎbüÈ+ç0ûÚöÿïЖÐvÐjhï›ù‚W㬵pÀU_˜üªvM_î†G_SZ¥ü‡5q‡5yð†é8AÁkyBk^Ú°ÝŒ~[» ,Õ0`¡<…BR:‰T’f@VãįÓdR­Lí>Œ ¬$D,+ßõ¢Jã"MCLÑü7wâ)ünÖåý$2I2^o&‘ÎØA5’`pËCsò»§VåšÉiÁœ©%±æ !î°Á®o ¿eòb ýò je½h.çÞÔYçY6 eJ §ɇM^=[˜"¶©kr ö7PEœ¤fˆÿeüÃü­_¸š‹—­Iëx¥FCüä튾ŒLž‘+—zc¥I&™öZ¡Áîçœ ©¶ãljÎÑô8ë}¢R\SÓ¶@râ .ùƒJÏy¸â1R ˜¾š^Lè\{çáºV燩ú8gòÔ˱˜¯÷…p^Õ`,qs¶Ú lkÔ®jã’Ç|Œ‰¸ 6üÍ LÒÕ ,~ƒš$¹wvdÀø–0¶,‘Ýgä_˜hPZüÜ–[ò7ýln™É ¥“ølÔ\ðç{àq÷pØøJ0á:ÄÀEìöµ?kËË=—-oÉÉ,Í*Àæ~Ùi„‘(Ù›|Dr h’þ…Rñ8XXº“=¸&çãdU˜’O_Š*¿UáQ„ݵ¤!mE—J†‡êi=¤ü\¢ xâ–×oÈkÔÝ£:°–ýçŒ/{2v»óа;Üçîm‡&Á q®[[à¯ÉVè¯9º@eoã2²$ Çàà(?a€L½¢5”Ԉ‰‚{³âŸ¥xYX`<¬G~ÁP=2‰‰³¤}ïë•xã³üŸ¨MÖÆ¹µçÔ&WèS{¨S‘)ÒX.Œ…Ázð«ÀjdùOlçœÙ¸ìD€,YÑ–¥);¶ÿª¹Ä=²ô¥f±Ë:þjg,¥ÃcÁ'î˜^Q šVÇæÜÀÙŠÿ;…=BU.ëŠ"¥óýZF˵HŒñ€IRÏ S»é䨄â.Kšùú7ºÑûÝSוpgì«.Ù ¨?/0ŽÃ¾úª˜ÿäju^5*¬ò¿Ì]9²ÿpåp_¯r¤ßªrœy]ñˆ¢mÒà¾N‹qEÆ)Ù,D)yR‚} Édf±1Φó¦$(þï–-§ª{;²„DÁì_ $úsóëé[À ¥SÆŒvÝݦ4fÉhuç ‰’®-VÁ•"÷x_‹ÑÑà?÷b©gÌ4µÕÇî#C`—ÄYã„SPs\¦&?ë^ŽîGÃÞí¿¯4UaPíoè)®s‚¾jÒی羶1‡nˆKçÕP'…í<¤ªæÑyj$íûá@Vá1ð>),5„}¦ð*VP(D2˜öìröìoCê endstream endobj 54 0 obj << /Length 2548 /Filter /FlateDecode >> stream xڵɎÛFöî¯høDÍ*²¸“ì=I0Î% øäÀ–¨%ņ{æïçmµpëV'Îb-¯ª^½ý=êýý«·3}§T\£ïî7wE뻼Jâ¢Rw÷ë»_"/T”.–Ji}‚ö~Õ,–ia¢-tš#u²h\¤*ºàЩ†ß6÷üz£—š¡7ÐîNÜ~ ø½‡¼`ûŒÏU6ÿ51ÉÏ祈þý!Ü |ôZüvÿãÛå]W¹Îñ*ÉÝR•qZÊ=îwˆ¬ÖIô/S¼ÿÏÛüGîÕG˜YËLúýÛïèË\Û]YwÆOx*¡{æQÿïNîð°'Ähb-c¿&*E SC—Ô¨*ZÕ¸Ùa:þ²0yTŸWпð˜Óö¡k?,–:ºƒ±ÂI=B“î‰ º îù¿#psF"]ˆáL—¨ž)&æ®áön°±¤“å8¼YÓÊÁ¸¢FÈÂã#ÝG¡WG‚!8L¼q÷€\LÜ¥êx>E¾—4aJ¶²•§ÞQblj!´wdeV2‹\0Äêаç$X« EVÅ‚6ç^Ș eYqi¥×<þÌ{Ø„¸ ˆ“5Õ)Êä={Ö~àüÒ¬Œ5éþÞcøöiÒË(ålSáªÉ¢ß>r²¸‡»e–$`wV§Öp=W¬=Ø­§4<™ÕíÍH•hêä,¨y‹òý"*áCà-Mqü7zžÖÿͬ ¹«9ãó-°ÛÉ^µÄÚb¦IZ¢ž›#·=0E}ï‡UVðàYW2#»…è*^¥*‘GÓÉcûå´**çÁÓ ç Í/U’Órž7S9~»§v¨½•|€J.O1ÅÄôyªØ½õ˨’Ó\¿Õ*Ùó¨Tòä•L˜4‰Š¹mo-{'/C% bo5É üù½3ZkÏx*f€J!sÙͦòic´ ŒŠ­@_ËðŒ±xãMÚ:Ð[1 kæwüz-£{ë%©¡"ïènЏ67YÚ^nÎÿí—|AЗQm“yh‹$M/ès Ð̣ǚƒ;€ÿŠqImkEgµ¡€ N‚,³k[õ hÇM)g]v è2ÜÁ&aù¨P³Îì<.²Ësæ½ÚË|€çcÅ«”*)Ç`ÃÕÖV2ó8Ðá¸\MWEXCÛp–Ìã5CnO‹q¯ƒŸ¬—ïÌ×qmÉUµ.á¤ç¶›]3áS¬jørJÖ(Á%A䱚ÎK‹rƒäŒ §T?£Áµ-¹Z 6’}Ð,Wœ¸1CÆw·`—œÊ–Û]°i€­ì$5¾H™hYlBª†¯¤»¸ãʃc9ï¢^aóƒÌLßÙåÌЦ$§ŠH¨ô iظ%û[î%p¼^ü"kÆÛyíLl!3É%q¢¬]¦zy×!;qF*ASs­Æ§ê&i¢cS徘Ŭh' b>©ÏêÇðjS6§Ov† JÂ/¥\ÅîhëcZÇiRô…Y -mYæŒq<5ãÂcxÅÜÄYê RCÿñÑ"=QÉJâ¤t%02ÃÛkèÑÜ@Æ{?ir X©þŽƒéúç-Ü’ZÀû€†;Â{›·ÂHÍ´ ¥8Lª ï#•¿øÍU,W`<¥Æ¥•‰Ó2í³jEƙݟ/ÞmÑKªƒÊUX¬¢2øÖ¦«ó6â<ÚÅßiº)BþmI’EG© j%f ÎˆQO+œü’ÇКxӗзrzφe*Ïâ4¯ž ˼ Œío—É¥7ŒQ’Šì) yðº@H‘=M†öÈ?ì)/Y±÷ Þž j*½’-øÚšaÅJe_”½äOÝÐÞifLì¿}»@6Kžd¹Éß$ôthÐÇ»åþZ®wšp,֛쇖|Dy¦ç³®•*b]V3ßf*5ûm¦RÎ7URCn»^ÄY)ëìPø«Äe¶‹ç¸¤ gÅŸ–lç.ØsºE•¸0".ð<~Ç9+Ù3™bÓ‰kÖÅaúk`,±_˰‹à$@.ìY3.¾áN5„AƒãàÜm_0jñÌò¥‹ÿ÷ÐZÞÛ?xÀL/}! }…™„ ’Ôî%€Ï)Ž*3H×ÊYƒÊÄé -³ SÿÏ·}¯T­ûï׳‰áðûœ.óؘt29è|ž B¾Ý…\¬0ïÖ]rvÅçÞršó¦ÀG)©Ê™ÙbŽÖ&+H— ÿ–tìÕ‡ûWÿ4§Í endstream endobj 58 0 obj << /Length 3043 /Filter /FlateDecode >> stream xÚíYÛÆùÝ¿b±Oj1œá   `Ãv’Ân€x‹HóÀ•¨£‘DA”âøß÷»f†§6vk Eû°«¹ç»¯áˇg_½ÉHuz÷°¾+L¤Œ¹K‹8Ê u÷°ºûiöý\ÍŽKøWÍInfæ:ãv2Û–Øùu®s7r,ϰÿjœâÅ+ž[ùÑ#u¡ß܆K*h®6ø¿éΗ>+@aft¥Ü¿;"0¸º¢ÑþQO`Ø!6Ï¡]¤xFÞÁª¾Âì¯æAlâ†_Z [0/qu„›ªÉϾ[(@Ò…RQa-“tYãÉõy¾Ð¢t’á]W1ÎêÙÚ¯ÔáèF&;dÂB›„Œl¬éô ÏÂ{„í«76mñ^6ÊR}3Œ©„¿“Üûþ^Àß;ÞÞ–c¢4³nsý8_X3ûB¶¼ðÈTL‚C¹—Ç®q{gjs.,M8¥Æf2»Ÿ+m æ %»sA›82I&lHÊ—xþºéÑYŒ„ߥŒ™p&–ÀßõV-™åÔDuê·ã½+b ˆ˜Î /b8ÛUqÀCå´ºðí;¹¼á):p]:Ù”E¿Î­m®2l6ŽË!îÊcç‰6DaAN;•o— þ¾’ñµôHì@&ò4Jbø¡’•[B™îö¦¯$oæ L(,I’xaNúßðúÃI.¯žó°·Ðn”Øh›•„-PEÐ_…”¸H™ )eÿº>“ÓRâ¶Ö¼íÃvç•Ú!=f~œ“é¶¥³¿Çʈ 6ÈòÜ¢V /œšÃ W#h#fçúÀ…Ì×ü{®„^õ®F i¶btN²ŸtÓ:!3˜«Ü±õ,X¡ÿHð ä@瀪߰!«rÚòMC‰MoÞžB³èìoŽ "”Ké¿ñ~Œü=P{\¢§Ô´”dàW,¬ 8ÉðïpN¸@\AŽã…¥w0@xJ»^÷…kˆ'\’$vJ1_ushŒmç·pêÉçõDVŒÔýÒß­´Ù”záGÛºÐqÎvv#Xm@¡zó@B ‚m*)"£R°Íq”§Ãú5ø ãÎ÷rÊ#ÿš n~:稔eª+±4¥ˆ½q×E|n›¦ÿS†Ñß|é½,Χ»“úÿÜ Vµlªü{rŸ,8ñAĪmsî;ÈÙ/ÜZ–ýw"y›CëŽDµ/…‘ ±•ú2YÉX‹X]W³Ÿè>Æ{ÝaûÙÑ—`ú‡ùÂdÊ:Åþò@^Àp_‚áçVLòo`ôÒúŸÍðôÿ '†“W1c©Ä@ênÖ$‚I!‘žÃð]ï£=E>ßø¬fÛ„è\w‚N¢\ö#bfß‘OóøN€îºäxŠæžAΣ$—\ú¡íîM;DŠ£Ôú°†¡ER¢yû†ˆa9hÜ`MÞ×/)Âk$o¶z¶ÄD>QÁεq)± 4)HÄÀšM%É4Ì)Ÿ{5a—OÈ¡'n}&¥ŒSp·Ù‡‰£Ëz0³ñ{+¹†²?d™m—pp0B¬äÚ™Î÷"3 i*f—çaÇ.FÇîvÀÙ˜xV•’ÙóZɱ©Óp,Em&–&*_y`ŒyQÉw¬v$ê*qçI‹‹.ØþxrÂ!Œq#‡Æí’F¹twê´ö‘ˆÉÁJN„$¥ã·ócH¾*¶‹,6³Ç‘´gnú–õ½üŽDüm«$¨,’4ö94¶üÔñ-}EÄ£·â%%Š`,ÄÉWzZ<|×µ“8ØþT&ÔiŒ¤Ÿì†(ª‡_oɋޤ³JâÞ£àAŠ·˜)ÖÝ‘í&“êÁÚòˆ§%´+mY^`P·œq¼s*¾¼x+K“”Úfœ®PγsòJ.ƒV‚ÈØ4™½À•†…—*ǰ%ŸÑK«aDÜŒdê¼x³ÅžÁ ^zç’ØT5<ådsµ=Âä¸a¬iðbÄaˆ.eÁõ•Î:uÂDF,e‹ñ,Yƒ´hI¢s t”ÌJ¬Ks3×'íÙ“Óa(Ä/"Ÿê““•"”6Óœ’tæŒÂîÒrâ+^¾sš;@‡®F%yd•ýL_£m:îkàv‚õ䦩Úä.;TøDv‘¯Š,,Üëù KÖC5r“ŒªÜÛÑo.¥•9£l¤gçÛѬR|ñ‚}•'B[œM{ï<ŸLPÈ©'È™D&wÝ:ñ¾Š3fÆ“ÿº„éÖØå:ôJLÛΗS¸Ü€¿$KNrÈ•à¿<; 2mẵ½¤‰N²ß)[7}‚5­bx’DYÞÓ„‘2š³5”Ρ甾>;¹—A’C8“’Ä¥á l=šfq7tfc< Œ÷"û¶­ÇÃ=i¡Ý-00k>¥ÿÞÕÖ[£ ˆÔ¸ÞºYÖt({Û«BDQÄýe‘Ø8|üív©‰ódS´ K=uÎl nŸV‰Cl@E&Náá2~p6E %´ƒª9ÿìƒëÂÌ^»F>å“[hó/ÃØ71í„®Â;°488niœ­Ccc£¬HºLõÙFåÀoíLÁ†²›²[jËRc)͹Å1ÒÄ‘²^"ºe÷a„ >%(ð*1î¹­¸ÍBïáê§½= '!Te']‹?€ Ð0¦ ™ób—§Ò}#ù?ÁYX(®]v%¯¹°šì¹Á ·Õ wø:4ÐþÍÜ—v†±\ºú½,3‘*ŠÑ¤¤ûµS”„TcŠÈ­ZVpA Õ"ƒLLO}½’²²ùš2tèÑä4 _±LHIк.}šªñÐ(Ë¢8ñ¡Ñª¼”‘y¸è0¿Ù8²Ê[Tf)°ò7(­/7¼#PÜÒXœok,ëy«ráÚgW©D£äÓ.™¢¬´æOuŽ¡XÐËþY°ý‡9½X?¾ù}ÂðåªÿÉTÔzÛ+åm¯j™§©GÜéÈeˆùïŘ¿–ïòîÃcœ›Âo!¾ŸšØõV†ÿöô®'^£m–&#“#L@y”O€²5õJ¦þòûHRÒHŠÕ":—q„¨W@/×b7 ]Eù–š™îþÙ0¤¥[ŸøBÅI¤þߖȼþ}»¾“áo?Mxz>LFƒMÒÄò”lpݳ×Ïþ Û&wÝ endstream endobj 62 0 obj << /Length 2057 /Filter /FlateDecode >> stream xÚåYë·ÿî¿B8䃄Fô’Kr—@ZÀ†í´A@|A$F»–t§kNÒU;òÇgf8ärŸ§kÏö‡~XhÉçÍßPÏ/Ÿ<}eʉÎ*;¹¼šN¨‰u™(œœ\.'?Oÿ2››ÂæÓãLNwð®òé_ýÏf~ÉL?ð¼†ç<ßñøsO…¯_Ãó žŸô ¾äÏ­O/øÓ·ÝOÿàЧ†Ïáù‘W_x•%Q¼¹üj’MæR gL4––NNßÁ žx®áYÃìZYYx\½)M=”L•N©.Å|l=•ó"=J…SoÁÚÒOª°õ ÿͯ¸býr?ü^çþu ¯Å_Rïy¼aK‘9ú-ª2gâš­¹' ¢f$BGV=z„ެú(ª¬t!e¦‹ÿó| { IÆëOõU”#>»†³½•Ž’µR»ä M¨ls*P©n™0Í)ǔɔæg¨˜Þ ?HÀ€ýtàѳü¬|µQý\êüSäë£'åCÓËòQÒ«urªnü›nzµ²$çtpM^®ÿ˜|ú*UR §5èW `Õ%*²:vó\)Ÿ'>IhsdT0oû@í³ivÙúñ]…¬8³dŠÄèTk„Õ›„øÈO·hQ4ï—´£îÖ]%L.ŠR‡• \å÷ôâ¢vÛ':Jz©ãnß3¤%ºÊK·­(ï—,£MeT…p.ÊxËÎ÷¬;b©L”¥ ÄŸ#÷|ºª3UB¬Ð^›ÕGo¡K{ ¸y^æB™¼w»+€pÊçÛÚÛ‡$…ÆÈÌúÀÜRdÒlÕ£N©E‘EmΫ†]ã[¡UÔ ]iË-ÿÞ0—Û ÓJÌæ…ÔŒQƒÝ5R-ª[œRÓw36Èâ˜p¼#ϼ{ˆŽkV:1KWS•QJ—ª„¢MXm£µ®v$Åúõ‰Ì±Eï±ÝÁ=ÞwN §Êf­ä¤è ûBCA¯"^ “«ñ;4ê!Fwj¶ÜYRut^TAS {(Œ­ÇkƬ) hæLCjvï‘wù2 œ;bÕ8Øfµv^ À$Ç‚|äe^ú)ôÿzväÉu…óýÁ+—ÑÃѽL»ã,Se&t;ËN©±ö1im®ð¼[ä9IB–;P¾xK¥:fÍÊʈdÅ+V,סƒLš•%"ÏXçŠ?ýêkrrâ°“@­¨{~u÷-JÀØ &¼¡oA^/x–à¥}5uÛ»XßÝ6¾~µŒs^¼E£u­…¯©Ð—0ó=ñà:àúÙ2ò\Öim¨à{·³º½%ã••ŸjÚu2BAEoèÕ\'§ÿlõ\cöqY°ø'–—Ò‰„ÌÔ-¢Ÿ xÓ?¸™ˆÔã ldâ¢Eš|z¤‡.¤áû*9@Ž•Í³ážÔ­èÖT' •÷¡9_¯|¨ ÖX†f9OpË›…ÿ(È©ê!ô@Òö©Ð8ÉÀgRÚÿÀ•5¬ÚÁ`ôôß\{I€‚ |©(?á‹mR£ßâ)ð»'Á°:‚ëD‹þƒÍ‰2/ƒ ÝÌêb<è'ÐoB­ÙȧÂ<·¥PÒ€£ !¹¦¥£»i¬dNÊ—Ÿùx3ÔÝ tSíÒ@[6ÐT4Vçõ³2'P— ªÔþ@†! ’€{áž#¾ï8Ô„ὺ¥Üì,~&´lkD |þâ·ÜÕѯÛ퉌‚‡AÍ_Q¯¿ñ‹Híg]RC*I­ o"(Æ-Vþ\ÒÊ@±'ôKTù¸íéP³CgóhÓ¤\…ÐyÙªÀ/ ¿›˜Fõðøæe}ØçFU.‚3_ŸºØ|h}TCŸ¦P]&?”Bõ}ìÇpP]Èÿw}ì ƒüÙYÇijR‡^òÞ%„1«UÝÆÆÒN«%Í™éa·Yù·m]ɘUuL.ŠnÞ22=ò9Óâ8ˆ$àtya£EŽ.«¡Ìõý=ºÖBçvÉÜSöµ…¯ús @ê9~ºÚíƒ €l +¬,šqÛ€@’µŒ ÏÛ†‘­cÀ¤5àÃu¸ù2´x¥V¸xZ"ß›˜ ƒ×7,ÄÌÿMLx¸ê÷73Ö£ˆs §;~¥[¼‚nñ`Ô ¢qýV¾39P|ÞÅë^á›Ý°ÙVu«­n»šÖ)ƒˆÑ:¦Žr6ÚšµÍ7¨@i[î jKƒ™éëUø—ŸÛ¶ËL„áÇt>W2½ß¼hÉXÅvÎ·€ê™éxKYmkó‘M*6+ïnMûî#ZûЛ¤‚S­ÊUÂ)è2–ÚÑм¾õÚ_Ç+ÍcÔ 6¦»FJôl­ÓÐå6k2Zk‘ÜÅ,Æ­¤¥(l<»ÛÌ` ŠC{[–¥ÿD×)O^^>ù”SÆý endstream endobj 67 0 obj << /Length 1268 /Filter /FlateDecode >> stream xÚÝXÝoÛ6Ï_!{°±J©Oë€Iöu{¨h L±Ù˜*¥‘Ýb@ÿøïŽ"ËNâz˰Â"yw¼;Þýîè³ÙÉóË$÷T R™z³k/SôR™Þlá½™|?õMš©˜´00Jç0 kþ=çõkžo`Ô¼ßÁx&!ü¼‡QÁxFR=na¼€qÊK–tÃ’OIŠ Îï`æÓ§aøÀÇ,Œ˜ÞÍ~ñBÏ"PIò(“ÆUnèçýÌ-V㌠?ðü™Õðœ·~ÛÞú™9~ÚÞú•·þØÞÒg]ÂøÝõÍϺ*ßï_Æ;Øõ^JÞûvêËT¨»¦›+\±Ø†ÝV;âíçLzËßON†¦ƒ¹Ï/Ý|q âØó¥DÈá3["›‹ŒcÈ—G.nH¯®8,×– CßßhGš%7í­þN'ó“ëß²£ÅOS8„‰éê`þq*ó*k"îX6ü6±6¸¨Ù俉¨è:>£jJÌÒž~>N ©Yy>ƒï[ómæúì%ó°’g¯u8Séy¥å®; #ßøÒ ¦¢(BãÙËzоEdÙ¦Àªt5,i¥½&z¸O™XL( h1 ;€^8¼ßƒáóæ+4KG4co}”g0ÐËcÈö64¼{2Ê(PBØ,P=ì€ÝIå`å[´;¦|ç‹™ÿŒäGÐqDþýȸûø#رÖXó×Ó<Æ„K9ÿJÔç WsC™C ßrRêÍŠ7Ý‚Ķå"Iæ`"*2çÄ«ù÷v[©‚LJÃ`°³×Ǫ‡mIÝg-¬Å“Â8I¯¯K @™4Zjx¥æe ·XÓ•lyΫŸ4;‘¢G^•Ȳîo£—Õ&ÊPIï–ªÂL-B„.?p»Ô÷„æ†Òº¾‘þ=Z×Ë*½õÝYmÜäÚZcj®AÚ 4vÂ|Þj1ˆÍóµ%iInÛ»›õYPÅâòÕ˜`Y¡·ˆgÅaåVÒÎKÓ7–ù¢Š›%!læ}!Ôð»Å¢°Ë’šýex"«>¸’«OÕÐN±¯ÚÌÛÚ„ÙV¥1˜ºpjŒ7(w¬Ï¶Èí-WÔ4!¶Š'ÃÆA§Mß8tD¡c­hèûªï4ëÕÖ5BœmŒÓÔõ±¦C×N>.n˜ |«Ü2Qª ç¶[ôI\„7½Ž1TDp¶^è˜æ ‘ƒÐ/yccŠSín8ÄG`# ²¸S‡/¸dW=T¶FeA®ì!%S.mÓi ´ˆÖ s¦ù€i0³ú® òVû7TÎ¥Œ˜%e dìÚU>ж¾gÚ xÎí6Áà™Ž*ýÑGU¤bºEÓ—©>®Ìu™‹¢vÏDDq> ûA;ŠÝŽˆç”H¶fDÑ®ÆY+ÐíkÜÒAãvœHØõþ;u8kGÚéCß^ÛåmÇÛ«çèáåžíC ?ذkV¦EîÃÞÁÇÙê»#Þ€jœ‰Äën-ÿSOòýa1ò—GåDFÉ5ß¶’‡§ÅS„ý^>D¢’$RXûsD†&èqϽìÏwßQw$GiÄÑ>ÑP¾¥¢{{òÑÔôù_k—©Ÿï>ßžÀ®£æ¦ü¿gØþ¬:æÅÝ ÈÁ»øÿtq6lðRÍ¢ 訂<ω.Õt'³“/½5¸ endstream endobj 71 0 obj << /Length 1766 /Filter /FlateDecode >> stream xÚÅYmoÛ6þÞ_aû µ*R%ë€IŠë¬.: -:E‘c­±eXvƒûñ»7J”äxh›´Säñx¯ÏåçóGOÎc3ÉüÌh3™/&Iæë‰É?ÉÔd~9yç½›*OÁóa:‹uèÀð ž-<¥õ;‡ç犯Õíòá×)ŠuŽü1ŠÝ—^Ïó[x^:z±¿^/ýpûêDû>zÝ™hOÎS‡Šü,Š@cåGpq{;M#Ø3‹”òræAãy\ßâKàUÄS§Þ®´'5»Ö–DÏ$4l`ˆ«{4óíTÖ®x–Ý1 >³ásõ–DUò8¯äÚòÁ3Þü 'óæÓ46^þæÂÀ{³B’O„Ë× §"7îÝåãuß‹’"df­æúàfª¯Þ ØFQ+â'´TÉs(EÍÂ4ÍÙn4“óÚk•_ ³r+¹ž µdm”½Bë’xÞ òI jl–c§Ç‘©ÝY_@ÔDÞ?hb‡ç‡^Q³oјdâJBè ×cöòUÉÄ ¾í~!á |i]ÜÈâºí{Ðk'Æ›#a%ì ð›<5¾ ±¹D*H® ™.–z`),ËÏdrôC¨=tKãêô;޹qŠeÆOUl̓®ÀíSãRéL@ãJæ^;kÍØæ‰ñ£ Íì•¥\B$€ÔÈÈQÜ]3•„¾Vi?Aá4¿âŸŸa_'«òÞq€'$™[yt‘<埢ãq"HGy(ì?Éø¤ãÃ7â65[î‘õ²Óá*ûóE¸šØÛh±ù‹R!4]~Õû@E‚¸Rïw‰ ’]ÓàC@±,„ ”w+ø„¤8A‹C¬  XÕ·mÊNû¦àuáß‘–{ËTÄ@‡Õ«䨣òÚÄp-Ǧ( Ê|š†d£ÐÇdh骆=ˆsbÇ€h-ÂÛ¾!ª^ð\'û8-•☵yy,:_JdY;n|(d>M†ˆªïÎQñÆ"ŒÀ M5æÎ¦gf«Ž¨+3é„"‰ Ùä  S#tœú&MúEFJÂ,Œæ0.É%q”ôÄéjÍ¿'d¯®w¢Â ± V  Y¬4õ`ËÊ–fúmdóÎ…ÑØôÄ8¦#Y‹<äîNl~iJ G:Fu¡ƒlïKB 8é³d ÉÓ cíè ã`¦=Z›öV—úG ‡'£Œ7o~Û…QÊ1rùÊ‚\[^;~/Xc‰€Ü¤j»“̆äÉ"_Eí•äF\P Œ,é”,„‘Ÿv¥Ͳ_s¯Ä[)ªí±(“#)9¨ ¤ËmÄ6=)i¼²TT†A¹= h‘²¥·!íšdÆ ŽÒœ°>é׃„MÞ&sGR©Çæƒ,ÍÔÃpÄÇ›$èUm6æŽ^ÔâñYôNžpM@tPj6=¿Á*ÙVš ·“(`µ\T0§¦ø–_bµ‹à\BñSOfúÞh ?vªh~ê@jÛ‡Tí%ºÕ¥|šAÏÊu2túo §­øl+éýön¨¹´J‡:Ì@z¤¤×Z}{n•µœ¬ì ö.$ÄÈÃíÀe'Å!.…È¿wí6™Å‰éw]C>¹{|> stream xÚÍYY¹~÷¯Œ}h#ºI6ÙÝ@ÀØ^,v ž v‰Fê)«c ÃŽüøÔE²/5› ‡ñ(ëb±>ηw¯Þ¼w~R«Ú?¹{˜”µ2_窬õän9ù1ûfúóÝ÷@U·¨œ2FOr&ø‡øA~˜êì-|ƒïßð}„ï 9[¯\aŸc=+¼ªk;™i­jç˜ðG`§áûy:sÆR¿×³™±ªÖ¿™BI¤Ð{øþô?S¨ʼy_˜ \Œº•ª*y•Q@g§ÀɸìÚçÍ þ®?àï¾§ÕtfK—ìÐß#þÙM­ÎNHqZßýŽÉöÐ~Àf‘mq|Ñðø#´›tÖq}¶Yt¸,‰¯L)P(ϳŸr—£åÞâÂhOѬaÕ2è§+e+ñÝÝ w¶&ÏþèÊoxã¿çÞ|3K™±ß½ùÕ’¹íþÌŠR¤$ù‘G‘ü_Èï×$1M,eì§\[$:°½LIºÎsd¶$qøÓÔùl~\ùq›ÃPÂmCö¸ŸÎŒÏöÙb“àh’ž¸`Bž_Ð]DÜCL·ÃM]h¶òªáöª·¥¤žd;Ô¬ÙÊÆ¸bŽ”e’GºOb¯=roØÝDÿLðå[ÞgO‹r'Q­ª °ÙðÀ=ª¾@é~Ö#±>ïD ˆ_åÑÑÈŸw&§&xnqYqCKçcÔÀ¹ƒ%ò‚ÝȨãFÄ5‡ý ÁË®ޏìæ¬ÏîSôÈYìÊÈ"2‹Ý.Û¢®‚‹MÅgA…#²>Ë ¶ç[´ø†'>D²í¼Å$QáŠÎl<´ØùLâÒ,„sˆÝ&X¿¶`}¬c$ÏFZ§è׬ì|!Ç;øÃ€A–ÁØ ÎÀö)7wù°h陯áè&èA† ¿8H&$©Vé%(»pª-ZÙÄØB•!?’§œ°_ ñÊCªÚ§VÈ¢À"þ\äEÃÁË’Àû‡‘|_iår8/%/¦ü¨9¥¿Mª´ÅsF™¼LDŠ;@œÃÊ–À'gÎlíœÌnà8 #¨s¸\=ÀøPR+_G‚Ì{‘yF{rˆìÆuÀ{¯Š nƶPÞE‚“p¿†³VÚDçÅ3ªÄ\íxP°=ràÐ ø~לvdv†ÒêÂ*gã]ÿYd\‹¼+òò@VëT›¶)oÁî F\E2ù<ÊÔ:@¡»Æ¬q<§Ä6³`ÛªªºnNç×ÐéQD® U½ä¯Óª ›ÖZŠþçu ±FN±S¨‰Á¿ŸÓ¸‰¶c.@ª  ¶1N桊ף51“álÈdx@Øòm΂4Ðkð.úLn«×â£üž¤ý^ú[!ßHÿ5/ÕcǯÛéöå;ì:IÙÈ./Ñ%•ZøÍ»öë• ¯…Iºù8£ø‘쾕¿BþiíJÖ2¤ÉOá éÍo%NTš´-4t}>êô•¬ÿ #}sA‘ Æ£dÖ‹ÀnNDÁêp`PÈ‹ ‚!AÕ;‘:a›\>_!_.¿¾Š¾‹ä¾Z~qÞÑüLçEItJX8¢ GóuQ¼Œ1ÿ‰â{¢8™Å>/J@‚¥ìã¯Å –BQ´ˆ’ÇoD”âë¢8᛿ÌAž4èZ¥úr¬J»Ââ?Ï]-J=â +´fÌ*þ:Qjáÿ_Šââ7¸hÇv¥Ø>Î@¤Sùw}Þìêµ*ÒÓ‚\r#ûå*·þ¹ýnŸßÇå1Âú=KWdÿl‹ ŽÈ Šrá3PÊ9¥Í·Í˜LµU¥6ˆµíxc U•I€æÞeÐ' Û%‘¨f=¸v‰h+ Á5—®D)™34W §JS•Jû^®ä}qSUø}*‡èÐpU¦÷Ä ë_q­ nøöb÷N@FëbaÚAÕX»ŽTÙ<‘ \#> ÊV™0“g¹ Zá)ö˜JîUo¿ŠAnx‘"½ŸŒ¢aÚnÝ~¥¡au´–”çœk‹ ˆ¢¬YGAœI¨rŠh²ÇütÍ×¥Jo²·á¹ž?0¶×ãØÞʦÄ6–,Q:šA¨`pè&\zã!ê.d‘Îi…Ž)›Sÿ]ò%ðü¥Ub>2A|´,‘FYÆŒ1ÓÞ+Wû®Í{V¹üÜᬪêhÌy9FÖ9X†â†}ŽÕëŠSdËÏpëƒäZ‚›‘°î)˜ÁÚ€ wñbX&8ÞRR4 ÉÃ|+ •`ä±uJ$É®ˆWΧ!Ö$iÙ=„a$âûE,Ó)¯’YEH~` g­³nEz]{l>†ÍŽÃ#&7ÏØù:íGþ®}™^:Å—í5Ž¥ *;€êa´ÚáÚëwô(Cd·bÇŽmZ *> stream xÚÍÙŽÛ6ð=_á.ŠBÖŠHêšY$)Z4yH·ÈCZ[öº±­À’“ìßw83)™>v“ y Äsf8÷оº~ôøE’ŽŠ°He:ºž²"”£´ˆÂ¬£ëÙèmðr,‚´´ÚگжÐJh ÝŽ'‰TÁ'^níTÝšþJšÚ@·†6ƒVAkhZÃÚà4cúT¼q›qªás-ž}wýû( ¥£‰a‘$DuÿœþÁÍæ ™1µ[žž2ÌÊáƒ2eòwLoÛ‘À¤DAÉg—Ì£º£`"SQ×Ð í/hÏÇ•¦pH‚9–#\…q<¸ÛÃý%Rqb†ÐDP ĨlÅ@>ò·G€)è' ,F`çÞ pͼi˜W«3îœu €>~‘; 9Uùh"|Å›qk˜*ÎH×*â‚7ÕÊȳ¥™’>Ê­£ÁS£Ò0‹Ë‹jC„êA=§/qW–Ê(JÓº«– º¡1ÂjÇ2›€ãµ>úžÉa%Gš4Ãk`N†¬ª*»ÔÖɬréÐ3shwv™ s¬ç·ýæ<à_²¶.Hl"‹8î Ž9 áDQ0­õhÃŒ„ùÍ·¨ÊÐe3_2j/*:û–»9·fÀÈ[sšYÃuù™ï¶ÖÝaW§O‡#âªsÍÖRQj©Ö›…‹fxÙÞZÒnË–ï‹§S‡£D峇cJózK§Rd®¥QX¯Ð¥ðjCš"‚ìÝ#£î2•A¹íÌI³˜¯NªÙ6ãõÎ7˜;`¿Ót ïb,dˆ(’àfÒLdã‰PVK‡‡0ôY-ŒnÝ‚ü¤©êd“VêV6zcïȦä¸ÑÁԲђMO³ãí©% 1jÙMÖ]#'}ŽžíƒÚêê­â¾A‡l„ÌëH„–Ê®BO%‚?)N+/¤rµ@wa)Û¬ àÓ)t™IìøLÇa$RPWdÈë+Ùì»W%Â\*³Ícª…ö~œ¤A¹pIDKiíÿU–„¹*úúúiɾu5žÄfÇa/N2Ã{Ýý;±ùfñÖìM44BQiôÀ˜>åX®ë¬ðŒÅÖƒY_¥·ùŒ@êÌßÔŒµ»Þ¾§Q—Ct¨Wä™q«ᾌ®³,L±0¿ÚŽЄ·ûKT˜)iVƒOâà_k—@:DZ2BÝOƒ[º‡Ž2•qå"¡ëSØÊÖQ(7+2‡~b°.öÒ?h{ íå>É …H“LTÌ1®iàÚ ×åʺªi(½Uë\aÐ9W°AÁj,e¦BzÒ,×o·àÙ V¡Gª>÷}¾h“0Ù1>ÅyLáþØ¡Ð^ñlÁà#Š}ë½h̺¥þ¤htåšÖã`µä|­¥MàØ÷u@F`êÅCU “¢8u5tÈð…%üÖ§¹³<{ 1“8ŠÃTeƒ¼ÕÔ·d*3“uÞ7\7ý…*…5£7ÉçÕ~Ž®·ý ݉­->3J³Ód¿½×™D‡ûH/ 2¸3O pNêã-·c[ßaó¤=g_y_næ=%HÇåw`Ë¡Šóe]ã»å+®cÖÌ".Žôù3pì¾ò³OúÕoŽu‹$½’ç{ôºHL›ï€Âf=éÍÖýWDqö54÷öo¤Á}û7NÚ[RF²_RÂx‰Âí’m¬¿îzµnë§‹‘ò•TEÙ™Â3:ŽgyP6´N¹çVXí0®^#šIrÍ${´rG—é¥ézµKÓÖŠ]I$\SqêžØØÙ{’˜JÒ²g]þ—óC¬f`“-¶ô¨*\¬ rŽÏ3S§â¯}þH¦‘ "ÆüVÜŒjn0ÊÖ¬h3žkPË÷,ÂÒ¬î6&Ô1)D$&fëCösŠ, •ÍøŽ%ó“Xä¡ÈÓ¾ÙOêó½ÄÐ>ߨç3'”=œuCٕǤ/íû_ËK[K{é…yἦEøþHN2æù”§à¯ã]øó£ó†ç¢Ý°Ç«|>ý^¬óï"×vÂÐå ÿÆôp¬øé$vçltÏÿƼw뇘a„øŽ!ãË©í&¸%H)T¬ *Ö¹+UÊÀS~[<¯ÜÐâO @OVw(L}338?*ÿæ|+ï&ó8âI3¹ŒSærÚƒÌF9&SðZ|žÙ$ÜW'ÍÆþ@@fcæsÖŠÔjDª¬è_à…N¢°¾Žr'ÝÈQYvÚ<þýEOR^’ó¦Ü$'Ø?• (¡z‡=«3U˜xA9³Ó[ó1 Ìh0Ã]r†¹kmú=Uï(oÇkáãÝÂX)äRû‚Wúg¶¤‹éçýĶ/UÄ¡(Ò¾P}ŵ,ŠîíC÷Ýd †ÝŠt/¿E>x^Ñ«3LìÊês%‚kÌàŠ!ÿôF&;à Ê3WÔw~ÆÐùóWCSå–é(›3Ú í÷˜jIÏîÓzeÞ‚”<,l\¥«àß n!QEùyeßùÏþΓhH­­ŽŸØBÑü »rÂk»†å‚ËhcZw¸ù°K?u1/áxòÒøŠáøÒU2Öê8MÀìò/à+.{Y;¸Û¶{sqÄñpFŸ©A'¾Mò_àÔ¨S©Ø÷£Yýè(¥þçIŠŒEùÿ£ç×þ¾ºÛ¿ endstream endobj 84 0 obj << /Length 980 /Filter /FlateDecode >> stream xÚ¥VYoã6~ϯÐ#¬¸â¥X,Л¢Š…÷©- %–“,,)•äí¯ïÌp(S¶c,vÆÉ9>ÎÉ77ïo«¤–u¡‹d³Kj+•µIQ粬U²Ù&ˆßR%cú׿—÷·®ˆ˜u.+W'¹gûÙ€ö@3ÐÐO@#Pô ôèµÄ“U]%Ã]š9+¾´À|Z¦43e.ú!Õ¥xõ‹û¡OuEFš§Þïͤ]‰Ö/GTðÏa „v»hÊ@ÕöÈÛÌŒxDÞ;¼ÆL§l]‰|cdˆ%§ Lí ;E-†?yh{T1E2Í쯈½EG$Y­d™«$SJÖÎy<’¿â þ %£Eߌ|vmýÙp #ø6¬bÚû†¡÷l¸$ÙUVÖeo¶ðfoÓÊÒ%µ«Â%ÏCnŒtªøÞ[Y^8BØ,*ÛûpiW‹=»e&ÜîøT‰wZÃÞñä· ¹'õèCZ#ÜyC¸)k¦°b˜a‹O‚²*Šp|ˆA>5‹‘ºâ@1W¹‘Ú®c>{PÁ;JÏa>ºn' ÷ÝÐRç6(™dšYkÄæ‘5L ânú#ªÂ'#ìñ÷°÷w^†Çhò¾UâÁï½™P 꿬,gà•ø™U-Qâ(RÆÐþÙËBÚÜ¥]ËÒÇÚ—Œ%–Ê t´Ü•I¦!6ªòÒ!?µñ=„-ÑÑøÌüç·áWâÏÜåð×±h”ШuÇËÓcR”Tù:®B>A¾¾ð×%Yxåãù¸å೪‰h«§ìVÜs)¿p»aH[¿´þ¯eÆ_@¸œå»Þ×I­OÚæZN‰¿#/sœ¶ñ8ˆœßA\ÒrÏð± ÂAòOì£aAµ£j±ïß>}‚’+•|W¾'çÒÚ“;ÝE^÷uY“ª¸O‰È\Jˆ=+xYRðº"GDíêüžûbbßì¯ÜF–Ÿ×iÏ H»UúmÂwП}ßC›Áiæ”+—>o\ã•Gfd)ÛŸÄÄòe*2LƒÿÇêjF6Øó…þ]+¹¨ £QDáõÒ„‚¡©‹ w\p6nâZK8\uqJ¥6¦N‹æùòàT¦~{rB#‡é,~ØRC¢ðxbØ“iCI¥ùJo„åxütX¦•úž®é_$虨럌°eX î9¤ µâÕÌeñ剅/•°ÿfÒ!<põßÚÏÀG/~åxñKn·²°Õn§²pê Ïx¥–×<ïg{‘K0O Yh~@+Êü›O››ÿm¦¿ endstream endobj 86 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 97 0 obj << /Length1 1871 /Length2 11395 /Length3 0 /Length 12556 /Filter /FlateDecode >> stream xÚôPØÚŠâ<8ÁwwB ¸»o qhhÜ‚ Ü îîîî‚ î\fΜ™9ÿ{U÷VWu÷ú|í½¾MM®¬Æ,b 6I‚휘ÙYØb ¢Úì66N66djjuK'ÐíÈÔš ˆ£%ØNà_bÐéÕ&tz TÛdmìœvv^66ÿÁ€8ÐÅÒ ÀÛ‘©ÅÀöîKs §×>ÿý  3¡°óóó2ý™±A,M€v “Èöµ£ Р6±9¹ÿO :A ''{VVWWW ­# b.DÏpµt²¨‚A)àÊE -è/j,ÈÔu KÇÿ8ÔÀfN®@ðj°±4Ù9¾¦8Û™‚ €×î5y€’=Èî?Áòÿ `üu8vö¿Ëý•ýG!K»?“&&`[{ »¥9ÀÌÒP’”gqrsbíLÿÚ8‚_ó.@K ñkÀŸ£’"*à+ÿø9š@,íY-mþàÈúG™×c–°3Ûڂ윑ÿ˜OÜ2y=wwÖ¿.×Úìjçù_dfigjö Sg{V ;KgŒø_1¯&älæ '7/?ä¹™X°þÑ@ÝÝô§“ýó+oO{°=Àì•ÈÛÒ ôúƒìétœ Î oÏ;þ!³³L-MœÆ sK;䪿šAfÿÁ¯÷±tè²½ÊÀöÇçïú¯ 3ÛÙ¸ÿþç³~R•×Vfü‹òßNQQ°À“™›ÀÌÁÍ`gçäðr³¼ÿ·Îß'ð_öZ•–MÇöOE;30€ÿ?$^Oï¿D\þRÝ_kCøßŠàW=ƒtÿÈ_›Íäõ‹ýÿóü™òÿOûTù•ÿÿHÒÙÆæO?Ýþü@[K÷¿"^õììôº à× ±û¿¡Z ÿ,´(ØÆôÿúdœ€¯"bgnó÷1Z:JZºL•-L,þ#¢ÿÞÂkqK;2ØÑòÀÌÎÆö|¯;gbýú¨8¾ÞÕŸ.ÐëJýoK ;°é»ÇÁÍB @wd¶Wqps<Ù_—Ôäö§¶¬,v`§×À+9o€‚üÇòpXEþ0ýñXEÿAüV‰¿/;€UêÄ `•ùñXþF|¯>µ¿ÿ«øâ°ÿƒ^;˜üþàÏjú/øÚô/È`5û|íbþ/È`µø|åeù/øÚÖæ_ðµ¯í?ýµ¯Ý¿àk_ðßë5öõaÿ—ûuûܯ¹ö¯o« ÈÌé+û_ÖÿÈÿoóëùÚ¿Šü/–쯃Cþ_wü|Íø'ÿuX,  ¦yÕ«“+ø_ ¯Çíüäxõ»ý ÿG6&Î×áœþ\ìWMýÿù~ƒ@n ä¥y°Éû «ê ÖÛJ"WæŸãf¨j%Ñ3{.AÚœïÑè+ÒÖ!×" Cݘ+ÛtW—Éž<šjC›ãTZ¼ cU§~¶ /NâõOä‰Ôô‘¼!fVÿ¸ëõäà¥éo ÛÝ!Kåà̇®œƒ}ëÚ+åVÓWüc4dþ§ÊnÊcñ4óH=ÿ‚Yêlãô9 'f$¬37ŒÙ«ë¬Ì‰2ÙXFdï__8ó=u68¢îæ¿9Æ?…kâÖ\Œ—ëBð­ø]J– Ž`8Ïb ·ÜÙ”èFÇ·RmÙlÐô¾O¥qá 8C&9Ðx¢hEÙ¼2šsþOðó?³´^šRUõÑêÒø{áutRIl½LðÁA¡U1þC2z¶!ŠP!>vÉñ‡?Q¯³ÙôŸÌäQS!p‹óp ­þJ½/>HË«cÇQ©eаè†i—wÉü¿u™U¢=²æ›h} Ox",䃾Wí§ÓÃ( jÇÎë]šîHy¤²?ÃŽ#Ÿ¤ Y¹à¯‰T|àÕ9÷.J[‰Ñg<òh"ê&¿y‡`[ÇÜΰ¾Ý¹Áõ‡j)^S\‡¹"±«ÛGÝù&ÿl^騆7¶”üΟØ˜JÃË•¸y°2ÝчÈô¡™q¤XSßd—³³r„p€ÏºÅâ—!ü1‚M RÌ:0åg]@õbçÚl‡ÀYvn2ÕX¦©À¤¥ î|²Õ“؃ÇŽÑ(7¤\>úB —`§&oð~£¬}ÌgãÙ$ kAÁèMáF6¹¿¡òa…7’d^Ñu™üânvB}âO$®¸V>Œ£,Á1ü¡õ[BTA!&iŸrƒ’Ah ¡ Ÿ·Xk>ôpüø‰R™Ì8†AŒ³¡ß8n[clS,wïÆÓÙ¡ U E¿.û„tJNFׄ'¢Æø¶”u m÷c(mAâÊ—S)…Ÿyš‰bãïø¿»|°è4Ô¦ëw Q¼MB¤ãW°‡oÊ=/˜³¦ÍU ßÂM}†ª-–ŠP)A*{UÒÞ€©·8«¯CМHZ[žú¸dÃÐ8;J$ð‰¸ŽYˆØ~ˆ÷:¡Q¾ù¡v`Q'c@̧fÀæêîª4«Å4™=oL€Õÿ`N΄3€Ü¶âý%]eœñ ‘ŸSÓО òÅfþHª¼®~ Šü= ´»ãænÉo´iÙÚ_‘#x„7».7V¬É¹å´@eLz®J³yF%{mÃÏN>îDÝhU*A‹,±5פ6²ß\Ê"Øñ®Æ¾Òwœ–ÞAuºù¶¿<Š:ª‡cAí±·³¼Q¢Â¢_q;o†\û ìÉÍ^ËùNÈ*Ÿ» Âóü<&Ï+Ëňž´›E<„˜˜3{i7AŽ*'wÿMr+€‰Ó·:%qzÕ±']¿ecFõ%,.¿[­ÞoÔ¤ ±„ãWl µÿ£»¸žBí[5~éÅ3•/­sé³K©ƒG=nîÐÊí%\ÝàOµô¸{xr;jùĵ>vMÉe ï´˜øhryhý¦TÏßVP œXµ°üÝ':|;z .J¹Uä<é—>ŒAk‰·š µ€ß—uRí—ÞY1ƒ0>*•1Žö*½¦´‡§àéû‚.O¦¬=²îaŒþ=S'ÄdúÆûÅÿ˜ž_~QÎL‰cµÜk@§8[«SÁ\ ziƒøfFž;£ª–4¹Gª[Ûà 5ÓnTKÏ ®ñO0ÇÓßu<8W!w:3âØÔš^ípÕ4z™È;†ÆáݪË"è À—ºŒ¿{ ÞÖ S¼PÀehF«T„·<=‘7»0“œe-FÉ…cŽÇȳVжDô¯<ôÚðSáK×âUY“!\yGûGx ÷…‰xsP© ’®¾ƒ§ nÚ(ýsßZNå1RûA訅…úï áAå`ÐƸ|-3,Qò„ îÛ∕N)ï|uhÂ=Ú”åìh»NÊA!˜èé¬yÚ,æÔF8¿5¿ÉÛvW%õ˜ qGÙ¤¢æÚû®@OÄ7þmêkí —åš„±åŠŽëÓQç¾íԢˑç?¨ˆ˜6/„2wCß]€ä¾-SH§OT ÏbdK8ÆE1 5Æxie«èêO[HR§ÎËLØ•eVc6oXl²Tf¡­†$©­2 •k‘ÙOZ<Œ9†Ê«´üÖm傚ú̘(VX9}r{+Þ?\'òæ°òv•}3ï©Rû…ïnØ%ËŠÖ´Û…~áa;è¶èÄQ•ä¯ÌTŸGõŒ¡Ë¡I:£ZŽñ¹´èxwór­ðbÕ¹‡X˜‰ºHô‹:F_3èeù³ÔÖ KC‚°‘šÀÆ‘€,È^µ´~ãÖw‹?µ*2kdUðÓ®Ýà·ú²Ë5˜¨#$œ™öÍù@¾CªûJ Òä¬9k’ßfkfAىё™#(åXEµ¨Ê®DuüWTŠ-AË‚9O…/Ÿ)¬´á[´aŸ ï%*j¥ÏÉ?Rì“ÿb0#`L%‡Ö ‹†AeæÄêÜvãMüÍCIÔñ$¿ÿðy›rûá e(aÈ9?Â8§‘5n]ª£f… ­|£W¤gd¼¹=Gu ùÐN?&ÃúýÝ ”`*[Tóðh‰·œ%‹»h›@´~[U\“Ϥ Ð$ÇÞ¦!q{Ën¾[pTêdð!1äW$3@‡½5äKE몴îiyÊŽ$¶YÍåãt®åA½ëÞ´;å“iÊ L÷Èi&µãðºOª,è.ìvFŸ.êtYàç9£9Ox {eÅ38ëç¶Tæ|ÒÇjþl›Òû>Gà.ßþR»Tó´f¸YË¥ìÛÖì•ö£üQhA£¦“(fá“+ý÷ÌGxRÞjT¤@/Ô›M0êB½µ3í©k*æSÅ7w(Éä 5ûžZRœ¦¸^o†µZ|Q± !wá%Ã!høV®oX[ UÆ{YšúAìõÓšgwÆL¡r`I6Sãà»æ_„/£™kf\R£¥Ö_é<÷zÆV‘’ëž×ô™A² ‹ÆïFLüç„q«2G-†n±Æs|Ãïû ëS3úÕªñÓ÷I˜€N…î–ÐU¿§F!ÏMԵ璜„æ˜ù™ùk49 Þ‹? 93Å­-Œ¾èeBœM…Ö¿¿±l!2l? ÃEKN%›X_)¦ÎFÜ’ÙåÜ»,àÎÑs¤$üHþºCEyŒÆs7åù|ŠôX²·U^¯'ér¥ñK‹¥ÃÏæ™Ú ^×¼vó8ØŠÇ'K ew…âëWk±êSwŒæjâg2úIj»z­9É4%V(Ìd÷2ß!œÙ=Ÿ ‡¶ã¢e2K™œ`ªï™b#ê© nÅ}úÅ{‰ô—d–™ÐÐN\:©‰šP³ú¶?Ãü5g b—•âüýʯZéÍ¡,Ÿ›Ï©™ad5ú³tÍ*ÕµygYYÞ›„âEø#iÀ}fº±à=åSÈáš8$~ã±Ï/°=Z³iõl q¹JU¾Œ¢Dúš…dìçvÞ²mxÓò}D¾§±7Ž$¤8.°òr‚cJõ#«§Ù‘ŠØoïÓáN¤Á…kŸÅmHÍy,WËSæTÌUK¤™r.¸áدCa†Ñ€–) ý„Çõ‡–§ÅâØÐékØTÊá¨Õ^š÷ôó±l¨Ê”cHø\ýNøæ¼þ›ÂµTyO=(Õi *úE5YùUwb+ƒŒÞø¯$uÐ1ýĤôÓê“>“r:°"¸÷ÊlðѲÊx>tB>ü[4=ùk.][/Hðíôm¡ÚÜ{D,`§€Š˜‹ÕEÔ_Øá·æ]ØWÌ]„÷ü¸xjxý¥¯cñŽÈŸ/ê/Ÿº¬r¶”¸H Ûp–ÚW_~æ5}vÊ–HF÷ö“eaLéR»±á@½Ý~BI¾Òñô øÒs¹FÆD€zÌ72@[¯ó¦¶kÌHmnŠæÓâc¼½/§5[r¤‘år}1¬˜’sÍ$˜X¾Ùƒ±ªÜ+Û4ÙÎ é„gdµÍšòÁõ¾aÞÍBiW„OÓÂÅÖ2iDOb‡áG ûvk2™úAëQ½ÿ^êD¬®ÚI£À×%þË·qR>Óñ“g˜x-%Êm ¸'°HÏê}•]>¦ép&íØ˜œj"­}ÜOTà éõŠ¡Ø[|höyStôÇáG „ú EÇwAÝáRox^?^êÅæä=?kV™zë0Ú²WXcÁQѬk¯÷Ÿ¶bQÊ;l:%=‹™p¯Óvóù‘±i™„mŽˆsu>Vá…àˆETž0¡ó.{kîWër yÞ6ŽþÜõ¼4¬!·Mz«n'ÝUÒŠDévpLM­9 ›Ó}i~ ¦ÙÙÕÜìoB”Í”]Š‚ëOmÁ4¯!´ŽÛìÆ³5WÊ–a¯‘ÉVžµì.é»ÊüYkÈo™ (‰¨|ÛËÙß).eaÆLݺ)nÅþ›ƒ˜Ÿ‚?6$m@ˆåñ:iïÉ8GŒòExÅ¢}´ w“ÚU)¥vD4{ôÃÅ×LÑÚkÉß̳ùm1ø;¯Ãÿð¸4ÞÁ¯ Hª$:*|š:þ^­^™YO}1EhŽu>øNC›Æbì3OÌ¢RûÞÅýƬÖ8G•Á2Ám 4º‡TÅñ#ÀR1kz¼äéÉݬÍPí…bIèÅÜèú(ÔòÓà‘héã ©öILÎUT“¶„7TUÚqpð.H «Åp?ÓÆF¥›ç Á\äÿUR°&æçlò£ìóê–"5Þš ‚ë8Áj`Dg*DY¤@ŽõFØÑïbѪ¯üäLŸ¹åÔ 3¹"Kk·|@ô‰G—m]#e†ó~©ÆÇöØY5—9ß·aÒ"]u䘸¶ü¨Sð³´˜Nÿ¹K?G¼ׂ~Ðã•j¦+[l³ÂùÃXw=Ô£½€Ppøé© %‘ißt*Tü%é¸bv±s¿éD7”Ôœ.æ46ºYmûG?^mÝ,TÌhÄS,-ZžY‘©+YÖS*1’(òÚ-ï,´m?8¹‘ë,Âö.´ØX°7Îh¹¤Jöš@„Z$^\ƒ²…"Þøî²KÓSŠF®e 4_ Áòi-¾ÁMü™ÌhOki\ 3F0CŠª`×úùV=Å© ì‘Ïxò-MÙCÈRú›x(y"Eþ)ŸŒÀñ6`6ëýBH ]-ò rìðÌ „¿Ø¢qbp—d+×®mšEÎGpeÄ-iËÙ¨Hù[ÅŸoÒîŽ*Q×ð{@wYó³kH˜†n—‚éÞñ‘J{òóšYmâd«Àê*å:þ¾BóûT†žØ«Ç-…îi÷)Ó¦+yâòjjR¹5ûX¦”m;û.PÚI«k²Ål<âÌt cT"á@)¼Œ J^¸¤?JÕÇysDKŒàN‚ƒÆ —7¶ñOQ0еÁmôûÜÜÁk‡#CÈíõfÝý¡8äzg³ÍJ!Vî B_¯æâ´›pÞg )b[¼üI]~ª_ÑÄ̬¯<ˆ3Zƒ¦ÅooÞ£o+ŸEóTZ{ •?åwh”kÉ«A›.f*åïssgáËÉ~8²9sF£ê…Nû¾ëe×kŠìw3Y¯N¢N•ˆ¢Á´!D7æˆúréEGF%"? ›ŒJ;‹:Q!Â,D5…àkCj”o0±³Y³?ž E¸o>¿dk§øäEÝú [ð¹kO«SÖøh©¦^ —Á;«šI“ýs«Ð㇫»]4ëîç‰lgš¥yõ$}’cú͆Ò*»–Ĭï(–sÏ|„UÉއ·'°,|×+;„Qž÷})+ëõ¼ÕåߨU1‰Àœ×‚צ-‡m…®õ¸*¥ÔØ—„é!î\¢QO¾ â,–Û5@hèk#§ÆÚ“(âS*W-b)¬¬Ëý`¯¹#è²^„?!Ná,!n1Ÿ·ÖáÜù%fôÚ=O¾¶9±Ö?‰éSgútE–S$!Æ8¶ìgSr©¼ÕÃï¥áò9©oT¶ ªpåŠmp®\‚6'ùÓqœQiÃóyއ¡2§}gZµ½øKïÄÅc„B éi'Îõj;fUß~©÷%´Œ’RnÙ™MÃ~ë­‡OÔmÜ=á)SѸ É%ïÐ%´ìxÈùJËj¼ä‹æ¢#žËâ•!‘݇zß9Øž=yqüØclq0¥0"0 ‹ 6gJñ)1_–Q %9„@JkÓz•ÍÇ”9ðx—7Nºü[ü‘ G@rk è‘j}ø0A±Ÿš…)‘_Wè=Œðé¡“+¥?ˆx•›ëf’[uî${ÊlT¼Nl]*âxx4†‘ûÄÔþ– çœuVÈâ7ÿs<ÕØlG÷3 þ{~’ö÷Pež[ý¹LŒÄˆCgé”ug¦6Œqhp»·oÒ1 ' 4¾â~sŸí–ž©ŠÆvºÔü^õ¸ö-%ó œuA å5ïÒלÅ™ï“ùì‚»ˆwF Áª˸gBÆÐqg&áÇ£Äùô]Rß `ƒ»§ s;'¨däBžHE§œÒ¢â'¸Hû×§¶“ªWËpÆl4™nPH8áÝ(Ë•&Órms£/îbŠø±Ç+q"9Õµ”ÛÄWÔ­ŒÄhðX–rtC;.¼¶®(ô ›RAÌd³›ÐYM¶«ö¤½Ž\‚ÙrÉ&æ>Hì⻾Iév†m"¢Ñ¼¤ú“6¥1lïèšpö8ìç¦×Qú;¦ÝÌ?ù^¦yJ)0c.HtÅ¢S„ ß]¬0{äãçµú SË54­ÌÁó^pûs<;->ÕÅj¬UÎKd¶…6ftj íÂNR«§~”KUMôôÃd`ÙFS#žŠï2;¦¨àKM²ÀL¾G‘Ek¡ØHEŸå½%@#0_oØ ^¢êN~îÉ©UÜìÑÚ[þ¤~¹Ïþ«åÚ0>éˆ&X"ÚWßøƒ¢ˆ?iBØ¢´{{~e1F¡ý¦ûe·³¯P‹´»î¡š}9Fsó›­³mìVsñ† (¡ȧéÁ>Ξ¶QEK¸i‘á¹£6®_úý\c¸%ÚÍXáW¹íïLÞ¡öÂ/ŽkÿÊúË…×Ïùk ÂÁzd×°;Šeê Ç8À»Sš€Ù•€Ôƒ¹0kƒâ·„Iú«·oÜzSôç±R͘=bhÈ$•Bâg(±úÒ’oƒ"×,¾3öÛ%µLnXóózyÈÔR2gI 0š»ýaŸÔÆÎ`2ÏÙ„ÛT¬#ÅXÅ2ò¨Rñ³«úæÂ½ò{Žï¼†%rLMìՆ˸¿íDqe{¢»á…ä~sÆîd?ØŠì´VÞp…D&0^Ø\£+ÝœKqh•, +pÉŸ£ÞTþˆa-´þðÐŽ>øs÷¬-“,^¹ ´'xøòåú[×*Å >›}"lÉOà \¡Ëûc œ„—{åè—½œ8C.Býƒí6†hÛÕ… ´ÍØÎp-ä èV}ÞH‰Å¨Ä{À4ÆJ0í¦þ¬MÓ™îKj‡z¹Û"¸6x¥ús)0\ UTðÛÅ2^}Au ÎÉÒ½R½¦Ï?µºù»Sû–¸"joÓÝÅŒËK*‘åMUÒ÷©veøÅXõcótpkšÙvý4}߯ÖbÇUŸ·Ö,kp•D1* {wU˜ž Eˆ>è§þ$—0ù…s]žáMÆ6'Ô·fEìèÈj«è‰B™!Ã?(±/~ôN>PãZ}ÚÕ-ϯGZ¨ï²~‰¼Úˆ2ii_Bèy–eº¿û¬r¦l1‹ª¦Ø³îÜ}eуã;áàKð ÉZ3 W>Ê,,Øé›U+ïüöÛ¬ì¥^¢e§¹o×t.yKc™>–•Ž›°m”ûëæcÊLJ·í½º–a5+ôOf/k‰Y´ÙTVä™jîoÞênãŽ;ÇÖˆ¡ ó¹¢TsÞ&ÓóµØ4-ú_“^¬•§“ˆíBÑld´™Õ\M†ÂÍn¯{\Æé=˽X™_»Ú>=~¸¥Ï5‰ÅneŸÐ#L„]ܪ2'Ü ©ˆ`¥N!Ç5ÓOÌ;°6´ ]ÂãÖS®øˆ¯»ÈÖ’Oº_8Ñô°ÀFJ@/3«(×%ÞÖ/À ûÖ†38½m-À¯Àßù¾Êúðc ªµ"ù×ù{®4f„&«iÊø¦A%’‚q¨X”à0ÌjTè½*šU"ÿMQosG¹xÖ!ËÌ6²AV§}[ÎÙ…õÀú²6p¦I]9S:¾ë>–™W¨ëdEEͨ¦²¹¼.î†ãNú)Ÿûé¯þCù´<¶‹·èê DjÉŠw›óAtðÌSiކCï•¢}mƲ*·ÐM*ÍËIU²eWó”êZáF5ÍŽ?†nwÀ)ÓîM3§RZÙH¼U&zr9VËþÜi‚É òÊñœ¤ S»yƒVËDçƒáw\¥}Û¬œûdžÁ%¤[ÔŸØ1‡Ž!‹I÷Ó¯þ0ÎØQ~w¦äZ–&ÆêìHƒŸ#@õ# Üþ3ƒsã¤ÞÈÖÔâ¡• íz¿ÞôuzÐñªÞõQòo›(1¡ò@+{¶ÉÍÛ1‰$IŽm·ˆ-ty©±ÉkårÚvðéÅhÅV’‡i@î–ý¢ùì•™Œâ_òŽ#Dk<Åz©î_²ì¾Ù)dÕ~4ÇŒ÷õ¹qQ̈²ïxi´@yZ-ŸT`5D«ç¹-À ¢‰u±$€ÅÉ´ž?×ïîüÎ]Ë‹~é3°UñÈ ?¨›/´¥D6øGn€m¤ZôŽf‹VbTu¸(È­›O/¼$õEt¶þ±ÅÆdᥠÜNÝŽ…®tð¾fh56èSî :ƒD¢& Êžº7·ª IR³žn÷+¹Ãûþes|:KC-ب€Xqb™ÜÎæFä'áøø·ªtI6÷I ~ã/-ð%0 bšãf*VšÞÉŽ­z sÈGÀöi>ÒÞ†ÈØúäél)f|+ ·R² ‰g¼xQÂ)f5Ä¿€IK–ÂNO²üiÏ9o|’àeÃþÊCÐq—±‘£Eø@ïç‹Ht%¿æ]Å—­ÝˆËÒã#8¼Kòydѱ|˜vKx×o XÃŒñòýOhƒŸš±ÖÛZ8ùÇãäxÉýÍ é{¬ˆÎªp@k‰sµs÷‰²AFVd  „›ÜQ š¹³®·GiZ¥qå³²ÁÁªÃÓFcà¨{«éñ¶=“M¤Òã¹€U1“…O…ÅËKîŽÌ(pÇùÎqÊg^!fÜÏ‹qŒb^}uÅ÷:2ZO”yf7)fdÝøš@ÕScþöu~ޤ·ú¶4‰gFU«¦|EfÒyŸ$Ôó¢Xº0ì5=˵¯:Ãå¼ñ?2’œ)×2\÷?±ÍÛ|¡(BŒvƇx3T‘!ádÆÞ­ƒÙ|Àßm¨£Ýãi‰3Ð)¦Ÿ^W‚u÷A÷rX&:ÜðØ YË˽{é#¥±˜¶$]¾ÍsÌw´4ÍŒJ ­k%r|Γq\² äü¹«âÊx…š!6ë>L=°‡”*9U|(rCéDS­'vx>ÇŸògƒu‹%†@(ä-úûè½O[4y·A'Þá|Åx‰[]¶ˆüŒÒ¸©·Q:뻘¬ez¹w#4ÂKœå"Ñlº×”å<}ó¼X1B0‡¬qfr¡½F<ö_Ì,*=DÄN#ÅÅ.«üd hŠ]–ÅLJÛ;%\ún˜Ÿás ¯oS–"Â7æ?ËT Ëò}b¬Í¡ß;Œô—Qåÿáø°‘IÅ{ bí9Ÿ ð0•õm‰2yš}C'GÛW®˜ÀÉ›ý•ßyj)üK-MÉí¡lU~_4iÓïr‚¸ÍBFT#! %½¿‹ý°ÞÞ‚¡MâÒEçÝ*‹1vÖÄ‘x¿…ˆB€VIõ€ÐÑ)ã¿ÀÊð!FÕðvâÌM™­Å–%—CìÄàí`óãýÞÁÀxjñQYø[üÇï"Ì«ŠýioæµýbïVrܽú<{ß}~BNl/Ç ÜB÷Âh\Z¬'^"ˆÂ¯Ùm»°\Ó)í_+»ŒVáñþz¯´átúøiÈÂÐurbõˆ#y+­Æê+$_½úDÝ.Œ´É&$r 9Ýln˜œ7ص:ŽY27âL$9'¡­ˆ»ÒÔF4X(`t@L<ŠðÖW_‘Zà«Í¥‚óï{ß\Ѽ(z›4e×Ã21 ÓjÏ‹ŒŠtC·¡·M "A<|3b/RgaÅDþß+ñˆ¢ôŸ¿GQ¨?Ľ0/›€ó\çõV†7æ' œEê¿EÆOÛNXOÎ;ºÃn®ç´èç,4€›µåq…ç(›´šº+‘EDW9¤EÑxpJòB ,S&[É®@ëm†Ö‰X[ñÇ—.]±ª&AËj’çÌL.ç…å´ì(Ø•|+¾ÀQV™—¥RÜP…å!J›[Ç v–_ÀqÅ:Ñý…Ï;âløÖ=< þÎ(~þy0ÏBѓϜ«‘Á¶É¾‚У%_&вŒaˆèô:资kýñOÑ•öëŸ{4ûO㺙sƒq«9¢z¯ïúÊÄF4§—‡–³lÔ©<§"ú'PúÕø#“ß6ÉžÒ9ð·dØOöM,;ÇN5Š“*:)úâë»–“ñÔMÚ‹ëVåÝ*î]ø±; éLM¦4ˆ$§â}¬,%ÌÓâ8×|'tc÷QÉ›@ˆ1«#]z®a:.~…}Í 3D°ÙâyÇ2)nf@Â9° ³W;üL¹ß~—ÆÎïàu.ÛÀ’ªŠ ™ñ0РŠ^Žõňý̦¡ÂéL¹½TrÊ>D‰³ÛEì=Ê1þÝUÚTñFÜg‡¼ŠÒAù^Òk»t-s¹5ñöÞg|^Eƒö%ðBü(ZHÅÁøùžéEŵeÔìü€Çm3îmxÚ˜ˆI:)>×HôÈ ânÝã2zù@ä#Ë›TåÓ&-é}–ôS/ðäöWÌnkHáöBʤ?vé÷€¥UCÞ2,›µ3Z1UlêŽÝo<ˆÞñû*4½ ¸#£ªªîʯ%0Å#^3 ÷Ïîé¢ÁENÛÅ‘|ÔÛ„z8ó~ÄG,Fö_Ÿàà,—úÑ‹©Î…ÍP3/MD4Á5\ ç¾Jÿn\xX³å¶®å„xéûvVY5—L€ùàrjÑ͆‹©)ÒEßï½kªZè7°bš»„^ÝS¹4½4oüÄ Uø- 0­\[ô5ÜðÊ%c5É(¤EÎÐ+$cáGl¢ƒI¼-"Œ\¾x1Ùbe_µ¤¸ø7yÑ»c’Sð SúˆÒ`°4”àÇÀ«¾çë_~å,hw%U)G¥$<æ»Ï'eñ š:X5±¦ wkNÏ_º‡Gc¦±Œs"R‰®6éúN“ S“šã÷T€qtü¶d,§€ÝJTtð-/kß:1ø«WâS=÷d$Õ #ý)•ä‚n‚=ºô”þŠxÂø;ìê¢/DéÇÏréÕ°œüä\/äÇ马UÒx²®•)¦•IÚÒ¨Üûù™kï¤ëÖ§‡ú{Œ2 .)>ØwV²êŠ.6TˆV=X0øo.èaå"/±‡G0ÔRfžìñíºš>‚óŽºåÖÚ])StËXRTòz¡FK{Ô€ÓâþÍê B+œPr\4I©MžztG¸ðä_Œ°‘êç#¤B;å‡Jö†Å>¥ûâU›nZ±l«ÃÓü”U Â-°&¨®1’?/I žw7ï ú•à§ÅÜû:ñ„y³ëHÑ} ¶Ãø xw£üþ°K¯s‘ĘC¶Ö)±­­ ‰”í|¢87‡ÝŒí³8Â=…Ídž|Sí ŽÎ;¥Ùí«áª²°´»É#ï’Oqº´"œ½°Ç]TV?Ìà|7™/¹ï°r<ÏWc’7KbÚÍ`KMq&3ÛsŽÓD £Êšê¼›õ&¾QìPkFl—1r2,JA‡`wý ˜íÚÁƒIÍ¢ªÌJ+h¨n,äÓVÒàI—ѧRŠüèïF˜eyv;DŽû\ÚÝ©{'¡í y‹›‡GÊn¬. ¶Ó#ü”MŠOóv6ý¤Y'§›ò²/ˆ®Y\…p¢0"!Y @,÷Æœÿg&C*h¾vo“-ðÍ *¹DnÑ þëå>›Ì\PÛTÉç–ñæ— Õõ·µcéùæŸÁ\±hý ÇÛ«R’rùÖ™î1íí“ÀÆå¨ãVÏmݵ£½_ “QÖè9YÅbñ{'GVä…´ /çuõ×f ´A&a»Ý簚̂ì&Ú’>Ü9œuëSM•¥ƒ£¦R¹l =ç<#çH‹AK^†¾u>Ö©C”ý¾PŠ*»!&žEÏ-ÚzSr³ÉX{:D?r‹\Ès5Þ7Äž0Ì<˜‡ì ò¥‰5cc½™í÷®³E?"m¢ln©BóP¿š¶…ŸDö<Ê‹hž”ñë¹b3½„°ÜK§c[ËÜ-‡dÓ%è”wí'ÓC@F{ŽñY x[êþ®|ó2B RÆ÷ÿh Šý endstream endobj 99 0 obj << /Length1 2437 /Length2 21307 /Length3 0 /Length 22712 /Filter /FlateDecode >> stream xÚŒöt\× ÇNcëÄ6Ú¨±íÆ<±mÛjÒØil«±mÛnÒX7}^´ï÷ÿcÜ;2FræÂ\{͵ö>!'–W¢0²1ŠÚX;Ò330q„d™™LL¬ LL,pääÊfŽ–À›áÈUöf6Ö\ÙõßmÂúŽïq26ÖI'K3+€™ƒ‹ù#€…‰‰ó?6ö\a}g3#€ @ÒÆèG.dcëfofbêø^æ?T†ÔfNÎtÿ¤¬€öf†úÖ}GS Õ{EC}K€’¡ÐÑí(¨xLm¹]\\ô­lìM>SÓ\ÌMŠ@ ½3Ðð»a€¬¾ð_1À‘”MÍþeW²1vtÑ·Þ –f†@k‡÷ 'k# =à½8@IB g ´þW°ô¿èÿÖÀÌÀü_ºgÿ&2³þ'YßÐÐÆÊVßÚÍÌÚ`lf ȉJ38º:Òô­~ê[:ؼçë;ë›Yê¼üsr}€¨€@ÿ½Á·ç`hofëèÀà`fù»EÆß4ï*‹X ÙXY­à~ŸOØÌhø.»ã¿&kamãbíño`lfmdü» #'[Fk3;' „ð¿CÞMpl&@G;ÓGNVÐt54eüM¯ìf üÇÉüÛüÞ—‡­-Àø½  —™1ðýœ‡ƒ¾3àhïôòøÛñ¿Ž™`dfè0š˜YÃýa7ÿ…߇ooæ Ðdzß=fÓïŸÿ~Ò~_/#kK·?áÿÌ—QPE^RN–ö_ÿ×'(hã ð gcг°3˜/ÙÇ÷^ÿKó_þÓü?Vy}³î/F kcç¿zxï?}8ÿ{-¨þ}e¨ÿ[AÖæ}—ª?«¯ÅÄÎdøþ‹ùÿóø'åÿßÞÿfù[ýÿ{ Q'KËÜTÿøÿÜúVf–nÿx_e'Ç÷k!có~9¬ÿo¨ð_WYhdædõ½Žúï×CÀÚÄò¿2š9ˆš¹äÍ MÿµCÿ™Â;½¥™5PÞÆÁì÷c Øÿñ½_8C‹÷Åá}Vÿ¸€ï÷éKŠXÚý¾x,ì}{{}7¸÷Ñ¿#v€óû 5ºþ³ÚFkÇ÷À{{^c{¸ßå`0 ü6ý q¼ïÖôÀ(ô}0 ÿAœF‘ÿ¢LFÑ?ˆÀ(ö±Åÿ V£ÄÄ`”üƒÞ«KÿAïÕeþ ÷ê²Ð{u¹ÿ¢OïœJÐ;§òôÞŸÊôΩö½s~ù/â|÷éÿAï>ƒ?轞áû»ÏÐÆò}dÿ±°±ý¶XYýÉÿ=KF£ÿBÖ÷ÖŒl,-õíÿŠx— ø‡ô=â_»õ'à]9ã?ð=Üø/ÈöšýÁ¿ƒÿ@vÖßÐù?óoƒåÿïp§¿ó`ò|ç7ýÓ໌¦n¶¦@ë¿"ÞmÕgzoÀü/ø.§Å_ð]3˿໠Vµö.Öfö÷Të÷íÿËÿ޻͟ü'Ûüû½Û?îw2Û÷¯:kK ñ5Ù˜ÿmµÿ‘ÙÞOmûþ ÙýE÷®„ݟѽ açdã42°üß\æß3øKAæwAþtñÿRŒý=Üáý­ÿoí÷>,õLÿ¢x?ΟïÏ%££©=ð¯-yïÍÑÅæ¯„w§¿à»ÌÎÁw¥\þZ‘÷l׿à;½Û_ð]E÷?‡{grÚÿ«Ôÿ<9†Nöï2:þó¥ðþýÿóź á–æm ¹ÍkÛî«ð\è÷ÆygÈ÷Ô¾QÓ{,Ù·;=~€þJ]™î¿a+ðu¨yuG„ꆙèÅ㤹:¤%A¡õÉóY7Nqj¯nq³"ÿD ¶Ÿ^™ßóÅÎSÕϼô‡$y¶Ó§ò¹h÷.½b®µ}%+£Áó{ û•RðÏ%ÓôQ*‘Z~ßgÉs 2æ°I é `hP/]‘fongP³&Þˆ$ãhá¼N£X <46Y¢æÜ×Ê”Y:qÈp4° ÀoPG§(<“$±<Š Vû]›y ˆ²é’Wé‘YÒ*Í#¬{ªG—:˜w³¿)ñúÑvª‹ÑuíIä0*[u#ЫY-€‡Æ‚km·ª]ÆæÉøËœÓµo€YDuÓߦ.§:»µ¡á~ú»àä–û¡Æá./µï|}|ø&.Ì4"¦šá«+\iÉ%Žc`j@ tdºe篟ž!õƒx<ü >â2oç31i|‚ìÅ?gÏöüíU^)Û±9‹²`邪ðÀ!ûfð#ùò2Ç”UD/=˜*'M¤+,g=†R»X?PÂx¹YŽÉ \ìF$¿Í¾øs€¬€MB¬go¡b(\ËßÍü3á\µ\¥5–=Ox÷4‚~ì°ÞoP0 ¨—óÖèpû¶´TPãÈFõá²Ü%Tp(zKùc`NX‡¢oV§ƒ\Š˜@XáÝÎ\¬陲 3±Uc ’š2ïãÎXgá³ ]‰„09eÁ’LŸÔOˆç’ö¢pAN•/?fØM£/KM»Ü=B:òZ4yúþ 8©nûP£êÏW\A<%åû\R÷Mž…é±â‘©2Ër­ïl½MnöÈpË8 â…ßÔë ^ªÈðWãð¦uºeüê´Ù~àÆéà(„ )t;+úçñSq@~1eúºt-úÛ|B¦ù¶{ÿ#QLo…ƒVÍ:ú OP)¯V§:(Ù†0_¨Ê1ìäþ3Ç׬iW±ëR¼Ôpœ]³JòùÄLâ…)8i¬jÍÌT”_;>ÔÄ‘ÆA_üa Q"`@vxæ(Ñkb’~*¢É³ŠäÒsU£P¢l¾N |Dªd€\ê­’‘t,¡èñøËQ Gê§:Ù3Ùy27/>‡—pÁX<üAtÁÄ…D”=1Æå§R(™g囟ÏøÁx2<ü”žwO!3S±'LÊOë‘ÕE]ãÃbúúéåzvàFù‘/L}}UUߎßõǤLxÝÑlHͯן\åyؘç®y'îÅA–‘¹9Rš›¼ì¥œ˜XŸRU„@ ÍR1ëÄËk¦f¼nݰ ç_½ ɵ6ì.|µZZöÙäØœ‰5Ótï$Zr«.j+Ÿ1ú÷ #p™6J¯d$d²Ô™ÊFcœ=86°çµî{`öYvC©$¬8¼wà‰ÊÓêR «RØÇCÔ]tXbÃRú¡B‚b™íp„n+TÂ¥(ƒ{Xä˜fT“+8$äÉÈ,ŸŽËšè°65;±OfcC÷¸08R£ ,ä&‰•î!w’£8)tN6Þ2e,½ØîëNñ)Ù!³4©­4…ˆ}݈¥Soœ?Æ‹6øzó¤1 ©±G&î¶´.M²Ë)øŠw¢'z=YC)Ÿ¸´'ì·‘eÉj 5¥å/ËÝÎO𨱸~²#–6š®ØÁ³9ñÞeVeŒäå¯þõxFÌߥžcãþ@vö0y7àKÞ[þcjÃek}‹EÛ¦¤gP¡ûÂ'a:‚ät˜#hu. …ÅUÏüf1ɦxÐãοsy@ ŠXˆ-mÍ®tåBQL2SU™)æ~_ÄyŒÍ;H¿K5úÒ&ñl*ûX7ï±+‡ øð\ÚÙpÎ Ò¬¾°“bDæôت—¿Qm.¸;¿ÜjÕ€œié$Í£^ê toNÂF£ñMO†e;¹¼K¡ªµ’ 4ã>O æ9;Z‰P¦@ÞÆ]†%w…ÇH'<iËâHkQ¨x˜o Ÿ<mâQºz•±¨vuÕ.Á ^}¤’bBïÝRnÚ¶Zù.®8¨êÛbp:kì"c«‡ ¨øYº«ÍIbõw[—G¾T„–hSçÌz«Ÿœ®hÏw–H¯?s_Òù¸ÕM‘ÃÙ´Vnd»‚2}sðG™ÄAUcu8Ÿ=LÞ˜¼ZÅEÕ»ªºÝÔ/£Leh“º{c'·u¾êBÌ ŽK¹]ì+b°ä #ðnR*b~ìu,1â'½+ú2i!2!Uš=Ã×y<›`é'úH¿){^ʽ¹U`ôZÖýt_Žü¼AÓÎÓ_˜óu§-­Ü¡³“§^,QHD/Hõ(×t³}¨—C!a\´ÀF¾½w{ %À‡¬$¶dŠ•µíNžsóT#Ê3”Ro§œñÔ~YíK6±àtÐaæf ±‘ˆÊ8!]‡@m-ˆ‚…͵ØÒ~Ÿl–Eí­Æe-¨ÿTŽÓà-oD®0 mxL­‡FU{±PÏ­$R¡6t(QKák7ž(Mɪ™2æÏ¨CYÀ­‘nžŒ^@~°¹r­l‹ÔǘJZÅ”ùSMû‚´çAõ›>´3u; W[õ">BAÄÝ¢zˆüã/¸qQP‘ÜÓë×ÈË©€Î9$ñHÊšúÏ  üãHK›Žäy»oIéšEÔ{):ž³MÇ­3ªqŽÔ)gWô»”{~R~±÷™ÝHa´Öµþ .)ƒ C•ÄWs=2™ W^/Kà!%Z¿±r©c‘f°Þm}ìy¦']™§ ³¢Ÿ¯’ÚÜçñŠê¼}!½±Ú²ŸË–ð‹ù™š½•ÀÛ¹ÃWôîþë+k pš”VÞâ»a‡›K›4t~8·yxb!!¢,C5†Ó Â}&,køMÛ ùoFdôSZ·•ã³iÒ<¶? P›,Ñ<›½Óê>>2 õ&5и»9méÖºW ‡dÿbásžmƒ;¾n»YéùªŸGü g.ß .i%ÛÄe‰æþãž(¬:¿›’¶÷Ï ,°”òKÁù£²X¢¤ gb¦‡ÃÆpÑD„µÇób‘ }ÍPã{yW6_ñ l Ïchµç:î1Âytdu4VÁ_ìK×Ïû÷[âZ$3¥šP÷ÌIã)g†ì²÷œ%¶ŸY>J¶ ¾\×;0‚Ÿ‡7˜Pý*vÅP ûàøY³bûÓX‚˜C_“‘"§6:E裕[µY=N¸óБy÷­ZQ„t¯¢ ¢ ¾å×ZÝìõ ®v™ï•ûç+èáÐhÑ­åHõx>EOŒæùA›}K9Ä^ëz‰ç'Âjø¾ƒ%»ó _šÉ Ä7¾ :Jä—·Áú Î1,©ãÿä_´Æ(µOBÖýuj½ê× ƒØ!÷¼ã( I/h‘Ì©»Ž©£´b‚_ï‰ÙÃ¥GX5yV$%²~ÉìmèZ%ªŒk‚ûœxhùCÁ6.·4×g†º3¸!㡾àŠ1ŠZ ‡A§ù†k×B²Úœÿݵ´6@„ŠIl˜{¼cEÁ,ºx ÑB™²ù2™;“'ÖÏzq×ÉÏÑRZˆ9áK/€} 7Î.n¡×nºÀo7bÒYH‰¶?Ož¹Ç›8¦Ä2ÏZ*™$³<øÕ’êçL= a pHaÑÊV–]ê#¨Ú 0Ü“ºgeq]?\<©|S£y¦’Í)JÅëG_ïAϯ"(tÀñH’ú×ÓcâYP ˜Yõ½¢™,)òCÑʦS§4^Á¥Q m<_%(æ;éõL Šé‡QM…`iÓuú=o%ûW7}v€Œ¼ºXñÜ$7!'D¾6Dñ–:fD?»oüÚÆ.Ü}zÜgøŒž€Æ!aqó\ä { ×Õ$¸}†îÏË“ó••9ÉË–½ÜI•¤<Ë©UWÀXjã©]Q÷4½ÆF¾Ü C~%qŠ$ž7ȶøs ³5È'4¿ Q|­ÕêÖ¾kýrb7·¶®Ÿ3´è™†Äy®—Iþ2¯óa[ŒÆ^¬Ii'#…;$bÅI(唯2SгD_ÔT^¼žoë›Ô{ë£tà}gÈÍLjÅ;."äÄß`†Æ¢‰t"¸CjƯ|â¶%›œs>Ôøi¯’‘-A— ­P ™òù±§ð*a¿´žTuýäO(Ç΀MÕ/«ó¥GOð1 >²´Q­“¡ºŠ²iüNº¢·0i­îa¾¢Çêi æLP¡×B)a™ýâ³YM¼W÷œs3#ß=|ꑘ %Rùí‚wÜVÿPÞoÑôDÎ\/£ñuq:ªn|D |s˵lD­X¾HpDA8¡/‰¥C§ÞnÑ/Éj1ÝžàÔœýîô£t€Í)ˆÒ«,U¬ÿ…l×Åd(¡A.@sÌ5Ïn Ï B‚*é­Í™]ú{‰D§a½—§)a'Yœ»ð6šÊDw¬K«zmûK™×øÅAïD~_:ó«zKŸ%`'Þ¨žÓ=?®'DÙ)Æüjèa]j¿Î2Þ9c¦ÛÔ“žþejá b¸fåx8²ÞtǨHf^· nä©>!BŽû¾Ù•´~ ª—ùpÕÁÿS^øžWŸ+Òþ…Z$tÊžuˆCô7&kš*-ù4ŠÝ¯#¾£F|n:øtFdK/=E1˜÷~!¥÷ WWDÞ­—”{¾öcÈ¡„¯Åy¤µ_Gë9Œ&cþEax«HÖÀ8ˆv¥­c=0Ó†6jé» l›ûԵɱɘþnt¬ShöT OÚ—G·µ¦’²I°Gš6°A“Û76¾/,ÚݱlEâ©c¹i W©:]“vÒ@›šôo*g×Þwññ“?ŸR÷ç_§ˆ[Çf‚µ• |$9òVäadq|‘éøõà°WèûdÁ)ñåW¼q^qúøöÛÄË-ÚRá‘ÓïIȃ Ç[Ä“=$4’+J?t.«VÂàB^˜¯ PL/ J"Жî‡þhn…A]Få½I’ÍÙ#ãp®QÂUVG #]Á®N~cÿ~~À—2Ay{z×óà#Še¤*&=OG{€é€Q&öš¿©ÃØTlW×1t jÙ‡Töð AXæ(\ìÈÀzDMMË:”YäÿlNÍ£fª·+Óúùm!wèÍ{ ¸y¦*,9ç™ÜÒòÉkê»}ø V¿ò Àà!¼1ö Ø·¼øDy/nÈp’™6©ÛÒñ8åìÆ¢wZ¸/w:³ à¸àðÜ)°žÇŠa­^Dq§YŽ7…¾—Éo” ¬ƒÜ®¤MÑD¬×DJ£\%æ(g+äMŽ’qÐŒŸ‡säÞÎÓ ìU×ýºq\µ«š¡Ú>So_duÕkûZf<€³Ût käLŠr#ÓÉRQ¢™‡kUË*tI\‰ÏŽýš$êäSæ:ã_½À:}ƒ‡VúÒµÆTÍSFÝjº©6å×ÎfÜ,*Üh³Â°X« F­£9EOdíâõBª!Û$‚1)ú«ò^>JXïÞ={{ÉÚ6­×°èxöúª¾Å®ƒ%ê­›æÚ®’éAù%¾~ $PŒIe™C^‹(%ð`õöó3תîØÐç¹BN &/Ì™z-E ˜ V•e÷þŸCN»¢éÆà£KùA7òEÃÔ"±¡ŸüŸU Ò]¨+.MÐÂG0ìf¹6ÌI š+W1BM¡íà ÒÛlé›ùãá¤ÀÅ>Æì”{*L†€í—<î4®Ü<ƒü½òz¥çê”Р¸|Kæ¬Ú¾w °^ÄÌ_*Á³ôòâÄÍkÖ5.&? yB8v˜3Oõ§ Ø¿†cTtNU¼âŒJ:wÓIy‚Â^ÕM|U]M‡ûöœ¦X§¹ºÎ£Òõ… Ây…Ïö–|³öL¶uUP‰3ø> «4ª$“¤g¾7½ÖäPù¨mmWÇ X­j…ª†† éUvH™°¤ƒ.Kl_Þ£î^ÀSLeŸÌ-`$!„§ÇêçGoåp×±¼B} O—bÃ¥ó“¢ÇYXS+PÚ“«(£ èÅì]}Īœ¹`Yœ—ÿØ…UIx¦¾«6D_#:„*"· :(¶E† ¢ý“…œG¡yÛ{ÜTg‹pçhô´Ê'o€tyÀèÐÖe*ÄìÑì˜È†Ó>aLÅÃÚ}Ä‹CIûšW^wç Ó/¬^Ц l«P «¨ù=üNÎ&ÿEMŽ£„Á¨«—Ÿø`!ùP@·ë@ ¾bU¨‘›Üqut>¨•r_‰¶I­ Q³ -€x‚`1..Hj0ÃGä-ö/Â]B8˜!›<-Ú†Ñùk×ÈæþÁ´OxÑ T¨QœUÁz{nÔw—nôƒ©&¦"lC_ˆY–çëë5ð¨Îq# Œ”>‚´"t‹°2t»d^0J÷<]²5ÁOè )’ _Üü"÷ò¼~ntêif¹* /By‡ß¼)Ÿ^ÏR!Rþ“Ú(çÈÆo`µ4£ííõ…,ÉUçhýBê@Nˆ©c¼ Ö×_dKjõ.(Tþ~ü‘qm+ $oÜ:ø¥r­Ùé~ddS¬ºÏ¤F[²ïn¢ŠÇv×m/¢>Ÿ4ëp’"„!~UžÈø1šT¡åôm~}J‹¥OI…¬ÔkÀ%0iê;2bjœ6M̱; [±áÝí€4ÙO–Ñj¨ÒžE½í¢ÍÔÊJu{–˜²Ñ%&¯/5Z-›¿U®±w\ljž9ž{«ò"·Q¬âÅä½¢o×°ª¦½aÌ«ƒEì8‹ìs}tÝxzÿÏöâÀ-y¡î³Wfo#°=²½·ü€b~Õúò±ØÎæÑrpö”‡«>5“r qr·ø=¢Ý,ƒf>ÇDè‡ê›ù'fý9¤n±ò!ͪ8ì @À—Ç…m5J<ïÚ|W¥äZÙ»›14BbBäèyÇôòÚÛZæ°héu~é$Ýc>¦:sH²¸1ÛÏ£ºHÆˆŽ“4A†Ç$“ŽsG“ù>ù™$ ÿtÄò÷˲q1¸J¢á¸¡{o‹s·!Lò±5J ‘4>U¨ñ¦aÝõþ¯L¡‘ Çöww7ë35}ÏÏùpæV¸¹Ò÷‡ŠôS‰âÊ ¬oyÕRÏgäàBl5«¦#Hà˜@ÙÑ3*0m²­›@I’Ä]>*æÜ87öfz»®íÛõ@¶ @Ì WéÓ' ]çqÍ& ¾“ kH’|Ͱ®À«Õô…©fÖYQ0¹´Ôú'Báµ?,Jp|[$àï…@Jõöh}"H…MÆ×w¢¢ÕõJâ[Ûãý‘ÀYJº'UØÒi)œ•Vÿ+žŽÔdþ5ïÇ`Øé˜´ü(•õiœ §²?ù—‹‰Å µ6ð ‘ÉU¡ø+沋¥dâ:}å6£‘RïmtÓçlvvæmfå!ôJµ1ë¼Uz!¢ðÑ8TïÜ7€>apôÝ ¢[z;FD:„ºŸ…Iì5—Ùzêá²íCúQq Ç{¾k…Oèí9müMô‡A–½¼<™U „ð`z/“7cÚ×µ¦--:%V[ððøÊõ]ÌÀTxú“ Z·‰ R«àfÚ‰XÖïƒ5è­µÔN¼ÂNähqÑæo\ª1h¿hÐ*+‹*vqfG¶p[ ÷:k´3Õ»Ä güÄ/ï ó+—s‡6|ÊÙâH/vxÑñ™×ì`Û¾­– Ó ¦òűÓ†Oà_‘W=0Œ‡ö'Ý™­Á‡ì€ìiv’pn¸ÏdK×Bä>\¤¨fK×õ¬YÔ÷’¡Â»B¬SÁúëÚ©h}Õ夅€Àa@;L'{4ÉÉÃ÷ÿâþÁ5Â<6É­G{Û háöy•Xs¾ÆóS ‘ÚÎÀ ÐC8 <™ÏÙâö;4ñ·Ù#s!u° ¢ÃqZ3…å‡ÒŸ ô«j dq)Ÿ”HWŶI®Ø‹Êx¾ë{À^5-ËhGŽ'ƒŒ‚ÌÇ›XO~ËIä O˜S­²¡3³hÏ+ý*X:Èaf¤õÅg—<Òb5°tðZhûWÖÝ?ôÁè+²ÁŠ÷åP9Fx¿ºÐ ÉÌ&|ĦLÇ•”LÊÙ»HtÙåwX9ò¨3ZRnoÊ£\§ëw­²4•˜4yá`Òyõ@NuR¿µhcœÙ­¬2ˆº—˜4B©åÃT0Ûn*ÑÎ1+½­c™Í¬s“‡3î_Ä„á,Üà[>„D% °TD½9êŒsµ %+ðl½ân¾úÁ$ƒ£#O:#“ãR½ö1d^PåÊ‚—bᧃð—…Œ"n)C›Š—–z-G^¢8‡@"šËL\ǦúŒÛ²pÕ79 ”yDzI_qR þj@RŸV{(*º¡l‚Ôç+ÏÊj(R‚Y Ñî“Âv½9‚¡è—Ÿm• 1-¼4÷Fé{4*×¹,ht7û,ÍÝ'»ñÜ ^{Ðò©¼¹'WFßù!oÈòÍ“ÕËýHϬKÜI¤¨úÇ\òŸÖØ„c7€gò*¶=MEC–ë•~qq‰ÙëŒ2AöšŒ£!fw~íH߈ô¿7%¼ªÊF\8“ÒX+4–yðV>F’sÔiŽEbŽœ xƒ dð=ŸS3¡Õ) äwæOt3jºB÷oE° ÷϶鼂k‚ XÅØu4Œ*ú7¬zœCبËS\%—ˆÂÁVx™‰–q ïÅý“!!ë/òoúRÄhÀëÄÞA!øv¢–ž£‡ŠavÒâo•Žf›?º"G¸P{˜n$ÈQª"°Ù>‘êâERùuÖ.r†Ãµ¦úΘgýLC\O¶Â¼5»(ïSO5Òv‡&Gˆ±{9«zX>Úüxé‘YÁ%½gIÜÙ¹P‹@ò,î2¼S×w½ÍˆsYÞë}@cû”‚ÔÁäeçÂCµæ¿ÇQ»À¾~ÎGUERö¦"Ì œ!µšî›ÌeýRð³…m+ ªˆù'[ïÓž!"ÏÇã_íšòM‘ 3Ê~ú†kØšYlXµÅw 4ÛÓ+²…Ì9¦äÛŠ?*5 =çÕ2ÀD–•_sÏFõ-1sTºí k® Úûo°IöÀûú_ÁE«ÏÖgÛúj-ØÁjZ~a5tZ¾¦ÁYÕàkîç!%l1÷·V¼âêîˆ4ZL5rDרJ°aM?§R x®.Ü`g·ò$i!92²óØ'9S~Å1@K™‚ÆqxOã®ïŒm›¡ü´¼äwç›Ún#h£Éó…1ÐÌ!+–êÓå¡`&ÚGPºÁ.áBAÖRõNåHÛP”í_V*jä„Ý.<4©ï;$Þ‘ÓÒ#˜~×6–ØB º}s˜l÷j±pã$ã–×Ó$¼ÞJŠùîO /ÏðTj¶§’±øR7mÍ‚sŸÄQ fd‘æPõ£ö1Æ„²Mê÷d:·$í§&ÃG³í]—ŽäVFNéÙ9Tu¥%–5]íg仺ãGJÙõûèr©ïP˜“A]¿Ê,×>@´F¹,K"½ï/gÝŠ&»¸¶è™"ŸÚ¸žs”ê\FUz‡Õ³ð“;мMðëÚ§E¢¾OR#¦¶Ä÷WÚL0ƒšöGÃÓ33”’‚›íà>U)ŽŠ´r¢O]mc¹#-O5‡¯2Kç¢> J³D"Rr”»qBë¾ÆâQêËÂJr ³ÅÜ t^ûPDÔðuC`QHìUD0ÈHµQ ç w‡¤osô ÃaÄúJs™º©®P´œ/â6ªÎ ØÉ Hd Sz¥½, *÷[­ý´Ð•,6‚Ь HÛŸoB_½‘x}>'IVÓN9“~Øâvy8õý!v”“f˜ñ,R±…r `ìÒPy2šÆ<·6jÊìË\’EÒ•ÅI¦;§”$3VÑ`Çÿ×êVÊÈ$O^ÝÊûz)9‹/µÝÜú0^ŒIijÛ#iáG ÷f×!ìÈqhìíXÐ`â‚NZʘß0©4hìGÞLJÍéÓ&Hg*Uʦ¬rìûn­eWÔèäã¶1€£ ž:ì!´®ÜÞ¬hõäȯš œoÆêqÎ=‘`wºDÏŽ\NÑ˼!ö‘î䘓s¯|gMVš;A*»ö>YdžÔ7Ët%IÃ&„вŸhëJ ­Ô$­Ê–'àý{¢Íf zr Á>l\¦ã?ìun÷&±ç·¼ ¦9”³ä¹JM§h«»T€Ü¥³–3#§®Òwmj>h†˜i*R˼í¦Ä€ŸVZöR&à |·áŸ)“MC>~———gì=K«óqtšwÎÇg_mR…˸÷tµ1ÚS¶±]À O›^1J\Àµˆ‚ÿ‰Eºƒžy4`õb—[Yawãã~¸½ô±{â²×zAÅ ôW©þޱ‚Z9æh©½¨D?óõʲÓQ™°%j?™O QÃ@hîBMNît{oªÃª;FL-è©sÉ2ú”fL½¿• º0Ƶ™ˆo¯“=Û¤tÍI.©Ûø's´WÑ!tdßpæOÐþÑ`qœeÆÌ´«a?.žÚ9ΠìfA`ÙS5ʺîp„BFˆ‹$Q}tú"“Û'Nxu^lÐ(ƒ €®PË$˜.1zíø>‚›ûQéÏ‹Ç?®¢Ç+M$' +}©ðòòYå¼4k`ìUMCIÀÓû1³AgñVNÏçÒºµ°Ì dmëìø Â³ (¬Pì¶Pt@ùèí`2±b5Ž‚w¹WíæœƒŸÎ˜a9•÷޵@ÍÖã[ D»Ý~µ\¸ôÀbn6n“&™"Fw“x9ïÂØÒ»ýÚA‚ÑG@ kžOÍóχ"_Áƒ_ÃQ6½8±(Æ‘¥=-ÞÈc«éù¨kFÈEÏrˆÕuekFá/—ðüÉ ºÓ™zÖI´ÝY&&5.Ë!fÖzÈœ¢Ø¿x‚¬£Õ£Iµ>'ó*,rõØëm4ŸSÍ:20ˆÙËk"2ÓÁéöd™uU›?õ¸ò¡…³¸QcЉ’±µ¹ 6i´š«>= W^ìeþö-+ZZ+TNùlëGßÔ °º{‹ªÑÈ$TJ¸Gi“Zµ'¯É;ícxf-ðfa†âmíâ°:ÿ¥áx‘ÂNPÒÞÆჃ¿-—kÇá2,¥@œd<¸‡ÔüŸòP%5ÝԴѵ§Ÿ¹Ù'bPúnÞŽe ’æˆ ž2);éyY‡¤|Í.§—nk›ù*Ó¬HÕUl=ˆq^6—¨ü¶»~!ÿƒüõmK¦ 懣ö]íífU¸×<ûúúsrîè+s)y»Qïüúh­Þç³jzjTք勒¿æk=¶ÒÀÒ¿nVO}áéaØÕ“M† Žæ¾–*ÖèÖ ~™á[5ŒêG„Øá½(íÞæñîf¥õ-kåã pÓ+APë úIËt9ÈvYj¥k܃aK:R^Œ'ˆUg\=!jî‰Wxâôb<³×¢::Ÿ"¯ ÉŸÙvW ì(êAľä¤¿€£.VMÓ\ór•&8ȸ.‡S›ÍÔt8{{˜—»™Ž0ôvÏ=HHþ&ÅφZ^ß¼Æc b“\ŽRD!_O{ëÄ–&½Ýl‘²-`õ8‚ÿ%“ÜÒˆ•œ—¸êX'eî³”ïCN«aþ\#[ZܺêId<"¡IÒDP“J`‚©ÑŒuDPQÓ»$N^…VÉv­Ö¡Wû•£2¯±½„š̸¢JÔÛ‡í3ì~#ê#­eµ¥ ;ÉOþ¶JüÅö˜0Ϻݚۈ6 d| õl ¢)ù!Ämss¬ÕÕÉkitùI÷i”>Iî‹t\>têŠçï¼k=Û¸y;ý᧬ΟºØ¹{jtÐË⇺&¼Îý¥0AºXûRp†Cü²`žT­lr¯ÍYÄ™”U®ðbŠÖ±nOz¦3 ?M×M*sNYAÓ묒X‰÷q'm‡¼¾’Sd®#k1^<1K覡-MÖž!c¢ ”'ÎtØ£\¯L2¦Àºï#„k\¬ñf¼,äÀÄ¥l„ç¶Êò°Ë%³ÃÑ·cƒRv›X„eàA4?îÒr©ƒ¢ |¢CnŒ¶iƧHí~X/¼Z4½:t1ž {b}¹ž+‘CÅ;O_Šw0¯T¼ýö«Î}<Âñ¡X äPMSBA ,EÐòIocKÂwŽècN¡¹Ÿ¥uó™Ÿoä ¥ sè/´("8²à2q-eQ…„¿o_®{ïK¡ôabÙ7ˆhžb+…× ¬ìSž1@?ódš^·Æ|"®4ßI +fEæuÊg^þÓzöz2Íæ·iþ£º³ Ÿ¤ežhÅX¨„Š+½‹©9f'Ç߆\®˜#mƧO^J„5a›’'øP´õ.:V'(MÐŽ|¯e·Ž>ªx‡Z“ûš[wu}txýRc÷í+âH•òR¾þï-AÑúKi~–Bů`¯~q|AÙa„ ÿQc?ÍöYîÄ>ÛÉ ·±{D²×G+Õ7'ÕšsJè ‚Äfåù+.˜†iÆàŒ›yÁLÜswöÒëüŒÔiW-¯juÜçêCävs’ÖW“«b<Éö¨ž{僬í-–¨4 bæ!I&ài»ÕË=Œ‡7„M¸=(PÛ§|‘¬Óßi–¬×Œ?kTxœ ùU\zfÚ{Ä„gÚ¦aÐw‚þR·ûæxuQâ[ßW"„o·¿mÁ;©¼Ç^!NgQ$ŠWdïÕ Î 4 jmR©ú2# šA|BŒ™Põ3Z‘p:ñ œŠý“£Ooµœ©vû(—…hçŒ9¼YµŸÝÚw$˜øgqç®bsÐŹÙÏ•}4@ÎV¼RVFºZ­Â¯ôË×Àj÷ð¼Úûù-æíáá-C*›™x­‰*OKòÑó×]ªI)ë7õÒÓ™É^YJA‚ÔÍeÈù‡`æI‘1é‰èè‰ê§°REÔ‹‘ˇJ›–°¢‰­ö¤‚B«4η¡Gã1C Ùç&_—.?$†Üú«­ó°ë…ŽPâ1•]h÷h ê¼°SÉ=ú,C2×f¾}Z>á,mV¼~F7žUav–ú6èPl¢Cæ¡^Ê„=ä¤qõ¥‚‚‰;&øbD?¤29ŒHA/“ô(íÎ °4m¦ñä~-{˜ã1®ìR§wç4HPÖz;™¿Bºç/©B] re(c#Ëò]&«&’ãún=îñ’æ•—\Ý;ìàÍ0º‰Ò¢(ÄpÔR rãËÃè}šJ¤•þ_S®]Ê0Ã9]?cApƒ¶Édi¡T¡&ܰb"Crà¸AÁ>`~ÍzAúq¾KhóŸ4ø‰&A¹#q Z]@AKÓÕŒÌC–â¥{¾á$Á¹Ôó™Ü³&ÀtjwÃ:Få6·@?%&f6Ós<òxIÆtë…Û/[é‹ÞÇ­î"œõ¢û²¬‚·}´ s¨W‰Rƒ4Ì4ãÞ¶èô‚é`?»²c³´žäÔ¯ex5S3Q_„ú²¶ûDI ¥¢Åñ¼óóÎäÁ±µÒƒë*Ô1p \JD”’USê[W;Ó.‹cèú.𠸘õò¥AéG“WŠv;10qyf».º¢E›¦‹ ü‹J°ÌÚØPpk¡­Ø°WfåÐt;Q aƪ]ã(r“næÇ–êõ–µ…©]à]^íˆYÎì¨?¹âÚäíýÄÀŒêå U„¡N’™·š©ÁÖ0ò'A)žÏªÓt'U x•Ðz0‡U{±]­¬ŸrìyñnÍÀ}Q1¿íÞÒnL«_pÀ–[ï` iMÂß‘“îäVXHø ‰†Âê=»·ÏG ÇÉV׿DÚ¤SÝn °—¿¼*êèÊ1ß^=Ê1ý:³Â޹ÓhP×…Å…mYö÷åâÇð¹LÜ'– C³¾£;KÉçöËW/#WŒÒ8OE¡îZ+¤·b­1(2V2Ó:âj8ñWÇå f²Q&WâÌP‘1qÇÄœ‘Vþ4zoˆ¥·]žMÞ©YÛÛਜ§ÀgpœË7NüÉù2¥ˆ&Q‰·‘Âæ|ýáD–cF²_:Z4†>š×sS’¼hYÚ4æ HTç„©¾^ÞÝìXå¶þíûƒÉãbqÿ‚"ÿªÎ¤Nz€vUù–2„ìmtµ¤ëWìæcð¹ps§Uâ@mÒÅ-/êc<Í3gšðX>*°®Tñï´Ÿ‡ïÖ2žVsœíi¹&.ÀHuÚ¨á¯Zpˆ‰gwÅ”Š2üݧ‡›­lF¿ØAÉâ{¡Ñß+±ƒÛEð¨ R€k[˜ܬ±Â.×FORË¢ìe`ø&Cº•pofÁ–1DúwVž¤²hw²Èh8ŽWyC…[`ˆ°G’ýz’¡G㘄ztTÖRµu®È–®‡9ÕØ¢Þ¥T3òI‘ ± — ¦DžõŨȳ‚˜õ^Ínc7{u^ij`„Sñ¿Çù9JÐ9T6L=z#bÌæÙïî¯~ÆôÖ4¨>Ùz;¬:JÅÞX)­3}âÞñëÃ[ÿ‰Ë½»ÛQâž\L BNŽD„kË,?Mųý¢àFö)¸ÏÅœýiužÚ%z³jWdU¸†K×pjgb¡ *7ÒØ’ŸìJŠ62wRÅË–“×RS&´2’PŠ@?› ÕkÖõtXVØ^”½M¨éÿ¤»f!"Ü‹„qËx\žN{ðkŽ#']òÜ!ØWAÅÆ' @q_(åÌFè˜Pöô÷`èR´>ÅÈé²ÁšWÛnÌì%»” J^…Þ2Ï¿)Û—‹a¯ZtÀ€ËбץǪZâdØiàÛý‰Ó_V܃ԃW_|QbôÇšreóÕ€†ÛI·u¹.ZL®™áy¼G‡/ûç›gw&JXf3gæIU_Þ-⬕¯üð&gaêêÌ7ž¬ç2æ›;Ó“”C3­óJÛ„e5˜ùÕm‰a 44Ç„­yQ ÈÁÝ+^iV…•Ú†ÆÙnk¼"Ynw+”,¶*üCr4OÞòK™Æd °¡ÞM¸þ+–æ_“Þ²J]õ9‰Ì¾ž–lüØ4e±òOÇ º´ùÄÕ¨éH÷0¶»ÌKÔCì^Êg…ê,Dð…?·ÝàTPÔ…Ž¦Fêð2u? ÛÜaX7㺨àÈlưõˆ²XÑŠÇ6¸“/c£ìôF±ükJ˜ a—yÅúq‰µ¥bmo-çEEí~·%ðDnŒ;˜AT…ÃUÀõM¦2VOÍ/Í¢T/þYÿÛŸn1ò]6švÈÁ\Â’¥¤Î‚¹Š›lâ@_ÓbÙ${V‹å£QÆj}!8^™b köø-íj×CeR–ú^é–úf8×BÌE›Þæ š‹þÛGUh5•=锴ʆó|¹kJò‚«õdAØQpXš•šÚãuü®¡âÚìÜ}·Üıi§(±îÅîsû¹õC.šÚ%è3!¯iì,Nµ ›ÔðýÖ;4@ 1>[gÝ›ffn¾Çöi¡´–¯ä?LØ©=sÞ\mçušõmðQÅ*¿<¼'€ô¢•ö¦Ä˜äÂK»hšé»ý ßÝ@YB,Öö‹:œg¤¾nd¦gH9ðø¸×îs›Š&6mN$Ñ´9ûÆ59÷)ÿ4C’KýåUR]æ_P•? ð-z˜›Æ}Å'`Cä·!\ _ìUV Jº¢0E±}Î`%Qå“#õÆgð«sˆyD|i$–§É"ܯòÃ(?UG+”&Ap‘!È×þ¶õü¢5U·ëô_½“±Ìƒîëíßhá÷JË2­‹.§LY©¦ã—pçê?±ˆØ)"×$ø`>6Ö šø•‘èW<ø¡ê9>Ez~a&Ḫ%Gê6Ñ 8¿•‹&yåÁŽå3:¯žn2;܆nnÃÅ}]wd'ÐxP|¨¬lê^üüìf[£D¢À9\±Er03vZËùK*¤à'Ä¢<MÖpÿ>rÓÕ,‹Ly[$‹&ÕCçD2vJNã%Ò“ÑfÅäGœÞh˜9äk×äÐÅ7ùØ]5A2ÜY¢ )6U›óe~°Ly úÔÚ};AŽO˜ó\.0Hø¥ ³’Ê0yųUBßímâ0#jýwœUöE=‘›‚¼¯…Óá¼BP U™ñG¡°GéÏ%„D9W?fRÑ ‰0h{³¸ß< ¼â*g5!c𓣟hˆö‘Ú¡ Á’¼¸ìA> ¦f`¬lzYÍ÷¯¥äP†ôC-Ãê±n[ê÷>g þ&Þë,â e¿ç[\6¿O6ƒex+œ7,¨ÏnKf‰u"ñ›r ªxU—ÛmH:nw-_”Pt„$XÆV $™öEŠš¦D©ÈjÀ’–-‰ ñiÚ|8F›°rá=`l*¡b À8¡ÿ9«~á2ô ÜC;Í€’ïÂK>ø@×Ó20E€®Y·–ºWSåÒK–‘â³ Cžj¡×}Âò >3î3*H «Õ©ñPwÙv5µµaœé´PD¡‘©^<§•ˆï°ràe@-þ0Û‹KgÀøT ƒâAë{î#Å"ý`±Z¨MåÒ¡¨VðAÞᯋ„©õÔôû¨"$PÓb¸ªª:ì{¥ÜçHyQá³,í¢"ÚVɳJOko²†]É8°Þ|?÷¹0òƒ{-œh[’)ßX ÓPåyïê¸!ŸÍ¬WírÅvrµ1ÑNPØ=ëuĪúk•Æ}a/îEjui\5ã”Jö~ËGg¨øÝ9*x•äå#âÞ¡;Òé=Ò7$ºWÑl(ó4 -1úTy4½~Œ‡`’zÕ;ôã€8ÐºÛæ®øA^týŸñQV²þÛÛv9RUóá•·.@´»tþ–Í*ú®5·AÏ¡¨E¿°’çØš0Ž*ôBÁ•Ï ÅûΡrÜú{(=Ž;ë5 BScìHd…'Av¿+ûýÜ”PÓn“ £^‚°¡&'ïyaÿn¿¿Dɉ¸£%Qœ6h´³³°­š>´ÊmÏh38ÁDHÀšŽ3K·úàèéõˆ[6¯ötÄ€Pá°¾œs8H¸, Ä’< ¯µöwÚe»©„ ‚!qõƒ†3…û|€ŽG¶md•\w”póãBrÝR©cj`Ù¬²Ñ}’ü‡ÿ§zÐáÔ5óc½ uãÞ‚°¾C Dû&;UÏ‚ e!û¬®¤¬ Üf RHO=ðb T†,UÏ„„£¾üY—”R®“ѯ¬åŸÃ!™°Ð(Ë`¡¿ˆ3w>´¨?¸DNšL¦·³x«ØÁi&¤®m;ÿP¬Ñ¥9 ¸}IQ m¥EÆc]Ú¸‚Ã3¼hŽÉ#CBpóWµ9ø‘.³sY‚Nr'ß¾.Ž U”ù#œòd‹è—HR%hÉõH,kÜÏ«9'¾QŠþZq¸m” _æ¶:Ï­•Hr²-ffM×y±Ò}lããJ)=xÚ•|Q7†Þ>¢èúAHB†ŠÅ™ ³—·Æè°Ör“Ä0k¹²äO)ìBÿøÌ­Ðrd5^gYy[)%QÈB(£dÒ»øã[®J’™½…GÎ×l‹žD.›eðÞhe==ÂÚÙ :‹± >R/ÄP¼g™YOïõë›S=óØ.’•âÞjœùûÒGE®ä½©a­jXˆZC®@}™J®ŠÒ¹YZij¦5¶GYfLY«O ÞšÆvkþÚC& rºÂÿ¨VÀ›êÜÀÌC³S{ÜŽüÝ0¼PEJ®4dùu†vP[LS¼¼Îy )ú@Ï®°OñçXù1¹Ï̈öügÄ– lZãZL±íš•.¨ýXŒ°¸O$‘$Ô’×qDZVî«>Ãí‡ŽèÆ‰ò#ŒÚ(ö"pOŒÂqª·è5½ßšÄ™J|’ÇM½Å„±*>ˆÁÁi¨¶V Šuž44&…}WˆÜx“£=šMú±h¯øÑƒ5Ûõsa‘h°w¹ò8&l#„ÿÂÆ¥há˜Aâê½÷ 6˜¤‘9¸§m),Þ$)füÕ€r‚ÂŽ *‡Ûö$YéºIúeç€S·Æ›œüg"ýoZ‚T|à¤Ah=./l¼½ ¾÷ê||81§_—ÃQ(øQ…õÑ8GÜŸø•˜B¶Ñ¾Åý˜·7»Í`RLúðe‰»ø²2ÿ)œÊ~f­¨Ðà\µLÔ¾Fó¾­¶k¹_‡\Ö´ù rd¢ÊN±/Ú=,ÕÈ`"šâÙ(nûµáã~X¨>ÙÀwÞË%hšƒ4FC1U d”AÒ’m£¹¯³W”¾D7)LèØ~ί(‰ðŒãɹý3½N42…PiËøÖIì0Fг%ÃÍø—ªí×Ûã3ZãÛf¢f¨ª'Œ™uó½†ô›`ù…øã^†Ÿ[ŠMÉCÄr™ü4Â÷ºX>Л.ðÜà$CÏ÷ˆŸÍ­`ôR¼>wû#è ñNID äO윜o%m_d%h6°nÙó;ØfØ©¥·ÆÌ{„ÝÙ£½¹à¶£ ]$ÅXŒ¡6ö‘µx¾dVyƯ%‚‡ÖžË§0þ?ñè²6:´ÒÖ£H<3QÛÑ~ ˜þ%Òڰ혤eê× ¶ëâ«¿yxòI¿§¿¥Ë1“%S­N•_}~§EäÏLÀ©[DÉ«àNy# ïëäMYWôBçí¼ïw¢B{§@ðæbÌ`ë ä¢Ãi$<ÐAä`1·¨š:,EŸhÞ¹óès¬Üpw§Tªø Õšãaÿ‘ã—bàyF£>Âkˆ’š,‹t0ÇoEPkŽ­f:<ª²&ùý,uòŠIÎÿy÷Pݫֆ¥Än‰Eî/z|SºEQ¶å@")úÍ^þTBy¤#¨Yß0¶,bV|”Æ:ï³öºêÍ]’{+‡>Ÿƒ ýëñV«]AE»72ßêªÌ—¿Ê6ƒÚ,Kš.9ò2¯áš¨ó×Ñâ³ÐåÓ¡*ŸGˆö—èi;³E@…YÚ(f!¼¢c‚~Ú›#ÀâZ…Üc y¼Õ:HŽø³8À°WäµY)õœ$ŸŽÏža¾…³caCƒÓ†Vkïgj@soûŒ6þ‡uzQuq…¿Â¡9›¸d²*V#ÂÄAÐÉ×”¹ºçÀi‡(ô;(dë#ª?õæy‰›—Ñž¢ ôÖ Þj=VÕ¶p<®7ï·SöŒBš.¯êéÇö¡´ ¾øªR=…‡êÙT'!ö>«F?×7Æíp× IáËLfÎÂêÒ: zò9´µKèëð¬ZÐ;(§ÒÊÃÐŽ ¡™ŽÐ¾(:' ¾ìyÓ–hÌo–ÇìKäå´au"Wä‘Áúä&¢–¥ñœg°cjCL’ècpM^4bõ¥t§|è] ØOÊl•ÊlSwú“°ëcêÿÙÖ µ=¨]±à3Ýø ‰AlìÏ9<,“èঠ窛!ô¸ 'Ì„½ëáÓ¿ÚéFö.}õ¥³Þ5’øDFR5ˆÉgö,ÑÁ¶hJ!µ‘moÍú€‰£§Ý²¨®|¯©¯8è:7=ƒ’±÷T«Öãõeu%©ØçÏmЇØkúëzòÊü·B /Ö„(“Ò¢O¸ä£^}˶»ÙB4ƒ‰Q=O+¤ó—TØ µÎ[£ž#­ä#e×HÖ¥tÒ.õ¦?„kžeè—Ä Q*mlÒó³ÍõÖA´ÐK›˜í+ÒOÙ‰Eä‹@¡ŽÅ¦‘TÈI÷ê—¹ ¤«ÃÚh„íþלw[IöËn{t¦û˜Á#ÊbG;L*{b‡`g£Ûͳ¹]„XRdD/34’“þV·”~Lé<—Èlƒþ¹Ó&4q4°ïñÜT{@pÉUƒÞûƘE ¡·”'å"¼¬ìÜL Îü)…Œ–¨’ðÏäצÃcQä_Ù3›`‰±;œDIü¶3l-(½dðî.¬½¸~d°°ˆÆºO4O 9ºjU^f옙UÄÁ˜§^íÎi‚·]"v«Û#¥žB;ˆœ¨ªÜ'»‹y»Õ” …‚5ï­„÷ .ÅIbäê/b<û¸5ÌyÐÓ+,vPÂ×™h³êMÀO´"G‰Ac[–ÕFb8¿ÿÿZÆugª{Çíuf9›áó6•‡"ª¾ e²èö…vK…»7-èÕj'‘¬ei^ÊÂ[†6¶…ÂÙ„> ¯a N—³¶eky5¿›H— šqë’©&âùœÍÖ¤ŒãŒ+Á2#¿3Â^§òÇL^yÖ‡ž' ˆ£}ÇOu:†¡ÿ«ÿ`$i2Ç:¿·ïtÃy4=+xGg[fGý²á2ž›)±u}k:ˆÎ.Þ‰Z'G´tx¦Ík”Naƒ'mN–¡t˜JrÐRY6ã0njêØKØJEyŒ¦Æ½Ú­v[v+¼^R#á4:âZ¤Ž-‹7ë ý{ÛbÅøÁ¼r4@ùlêwV-QŒ äaxƒ%‡]ÍݳŸ0š€ÅI÷è?c4_Öí–®›‰NS4Yb¹¢œ4ºw}Dr°œâàÚQÅ÷5^¿xWt½—ÿ‚è_XqÿkG¸ímabŠÈc¦]´.˜œ‡£9ÅÄ÷J$ûîÜ&{‰c9‡Ý3ˆ#z­ y«šC“ø¼í©ã‡ã1oö§3bâ…hÙ=‚-píPD¬~e u9ü\¢ÀI¦º³0Åý6lþ,ó¿Ê›å‹x ª%öÇB1‡ ú̧2áa+émüê2¯ç/­õ÷µû&2¶ÃsZVÍ­^°Fj•EéXX¢l‘@-^ŒY õ8l `oFúuÁ¦¨Ðx™ö1hE£x@*SõNXÒºï4k1¹ã\Œ—iÊ.Ú†e µÝ ÅÏ×WÇør6.ÀNzàj>;±ªëùD×EZ\Ñ:ꃤá•ÜSÀ_Æ7U’R†p\F9@ C-γ‹~ ¦¨@ü£ªkÝX·]-§¥@¨ªÅlQ¯Ž™¼4®{ÏceHzáâ³E£ù]Ëïùq`}ËÈF”^¬;lOGÅ‹2ï72Ž”/¦ÙZJ>LçÛû"æË‚,ö?¬ºÕ^™ܰOÄ—1QîŽÍ—9¬LZñ½—¬y‡£"6 1šI6èè=~™.©Ê(ÃL¨¬ ÇéâS¹ÞÖÝ0ÜaÙEô/¾ €\î!Ü"ŠåS±¨è¿y¨»S7¤TI¥Mc^ðÛ~7pÔç§µ´–Æ{¨¿ª¬,qº™@YQþÞ“uƒ+{Û“ ZŒfnÆõ† ûÝ®(ðâ<ýèTMXQ {ဠn£xö¥ú`P*E XËÃý~öp¶R”d ÅGŠ'OD¹iôêšÕ ¯R0k€ìäÇ\‡úPMOʪðo ’“ÁÔ"¿÷¢Ô`¸<ÌäÁ÷šÉ`—›šØE÷WÇ è¦j¹ÐK:™5Ÿ“wÕO(7B½L"b)jo4rÍaÞfËž¯C‹ß®„|œ@Ôypßç Ez”5E˜*PÄ>r¬_ÀÑhX%ü¤¹{r÷Áhd»ÁYäbøï=ÑÂWXÛ‡tÕvf½:Èë¯Ýz5”þÊò2üLV|ýӌᒨ}H/¨ ª-™L rFžº:å­‹#†CAð+Ðu*«3h @ÒÒo‹0XL$”W@.§x|;©F­è¢­¾î¾ÅÒ† &ÄsÈŽü›ó ÿ9馹žÓ4óroò»Nˆ„µ(VÇ&cÒšóÓ{ì-¼üõ†Šçc±"9+¶õ­YX²9°n«IhßÙ¡|:†éú®g}VؾŠOT´¬%V¶ÄÕôî` J,ºb¢DYkäÏMìë˜ÆCÑl;qì„àê$ââÐŒrf[™ +ÿœL£!‹c±9ÜÁ$«,éÊS/Fæà“nX¹Y´ÌÊEöwøöv×µÁŸuÑHÙW¹¢ ‚ÏIUVíSU±‘p•;0ð´œÓ•¶5¾*ÿõ!S·î± kB GL€PÍLû$Phõ:ã’¤ìR—`X[Ø +iô·…=ö›1±Óõ>óÿt±\eDdÃAO‚ ¸QÄ4“KÀêYõ$ú"év †ÍÊezÜUØô2æy¡Ö¾WHMÕp0뢇TŸ®­äv®Chž»s¾É@÷à¯_5äJ_…A‘Xóž;ÚA+ðà±9³’¡ŽZRï9r ×LWeaKvLtáÇKØ[‰âqC!ZMü=mRÒ" çÏË–ÚKµ÷%[—€V8]×=óm ß¡æ+‰¯Y|˜…û¡$WÉe DðH YÇÓ]Ð%,þwàìÁ 4<cxÀÕx¨YÅþ#>ƒ{Öf?êî°‡g5¶­—R¾ÿÕ8æ.²þô€9ÚÒèa¡kØzmß“KV´/-s]$V‹jè{Û5)Ó>°¹ÇÅ@›š—Ì«¥`¡LKuN±ýa2<õSÌï”F‹]‡cª°0Ìt¶PD»:è|??'ßÜ“kV*ü@†uÞõZÀüFa?€JS˜̃*&[MË}æ§ >~§EãéÎoô_Ý¡jªn¬©ñƈý8@/¹§ûÆ“M•h„ÂìÚôÜ‹UN}‚ï¦õVÀåB@ëûc ¥ºCí ¤ö ÷7"`ËйÁuËÓ6«a`I91.c“÷©'Ƙô¤½ºŠa†¯s¼î| É3ñ·£ÇLJs;X€c¸ßáÉ.v²ƒ?Ï)Ûxà ÚlZìãZù2ð+÷c'±9Eu ÝÙè|‘J°*õ°¬Ý3b„ŸûÁxœÈíà.’_[0èåED5¨‘¹–ÛfjFÈnv<­hFևѳóWúNk‚äÅ̹×áO§‡ÝÛ{hâR^Çè]ó%)›Y›z·Ùxì«êóo&¡AìÈS[‘·ÜOû”|âÃTï7¥Žª_!+Êê…ÿ×À"¯¡jŸÅ\ìæt7A´,‰úŽD¯Ý­“1ùæ}¦,Xü+šŸ¡˜¸Ú»*â÷™üùÄÝ,"ôÞ¯cÒèÖÑW·æ†âd¦,Y%¿Á9]îµRFJ]ç°X=Å’zèa:ÈK³Ÿÿ+wÜE‘¬aÊÁç”çjµ[PD‡’bNúõƱÖÄ–ºz‘—;HŽíøA¹2ú\«£Bµ¤±Ï#£GÛµ8¨q;ÃÔœKU¬’ %‰0+À¬üð¼“.ØEŠ™4cŸõ,0~éÕN蘄¸ðê±DÎHôéÈI˜wW ²‹E§ñèÐåè7PÜox£Õ‘¾N¨ G½%¦‘Hëj!¡œùœ5·üÒœ^<ßs‰ô(hÕ#Õ ÚLÆ=Ò9T"‘“£‘†? újüýŒiÅ+önlˆÂ®‰†´44´þ*s2·K“NrVL,:Ÿ ©v6'•NƒXé©D™\µ]> stream xÚ´TØ. )RÜ¥„¶¸—R´w‡" !¸-îîNqw)N‘âîZZ´¸ytfîÌÜûÿk½·²V’oïoËwÎÞ‡–FYUÌÔÖüÎêÀÊÁH(¨rp€@.6 ƒ–Vâ` þËŒA« †ÛCl¡‚ÿ"HÀÁ ‡GÛ[Ã#OÁ u´pp8x9ø@'(ð¢-\ðä1(°dm¡`{ Z [˜+bnáðXæ? &Œ>–?Âb6`8Ä(€,À6M@Ö5[ØÁõ¿R0Y88ÀÙÙÙ@6öl¶psaF€3ÄÁ  ¶ÃÀ¦€ß‚Š ðŸÊØ0hêû?íj¶fÎ 8ðh°†˜€¡öŽPS0ðX &#P‚¡’åÿ$°þ:ÇßéþŠþý#dbbkA]!Ps€Ä Pz'ÏæàâÀAMAÖö¶ñ 'ÄdüHø£sà˜ ô(ð/yö&pÌÁžÍbý["ûï4§, 5•°µ±Cì1~÷÷›<»+ûŸ7kµu†ºÿÌ PS³ß"LaìPˆ#Xæí_”GÆ?6s°€ò pÀv°‹‰ûïôê®0ðNŽßæGžî0[ÀìQØb~üÁp·9pG°§û¿ÿ088¦€1ØÅø'û£lö'~¼|8Ä |œ=ð÷çïúãej µvý‡þÇý²k˼ÓÕVgþSñß>qq[€;+7€•“‡ ÀÏàã<ÿ;Ëßúÿ£ý«2òWoÀÊ@ÍlJx<»ÿÈpúk*þÚFÀWP´}e0€áŸÉäš<~qü?Ïÿ!ÿcÿ;Ëÿmòÿ·¡wŽÖÖ¸þðÿÜ ˆµë_„ÇIvtxÜ ÛÇÝ€þ/U üç&+€M!Ž6ÿë•q=n‡ÔÜúïc„Ø¿ƒ¸€M•!&ŽÐná1½5 V¶µ‡ü~k¬@àÿø÷ÍÄêñ=±¼«?\àÇuúï’’P[Óß{ÇÉà Áá W àãxqòðÜ9ÔìòÇdØÙ ¶!€Gyž3[8Æïåã°Ký6ý‰øìŠÿ »ÒßH€Àú=2ÿAL“¿7÷#zÜרóÌþòpØÍ NàùC,þyìÁÇÒVÿ‚µ­ÿ@;ô_ð±”í?½ÿìxƒÏX‘æ» ¿‹èÂ]Ú”d8] ¾sßkªE lŽUiùåqk­:¾Õ‚17Füe4oO¬¦— ’U]ô»Ç‡¦Õ“&ÄvYÚ,;G~lå‚+ç)—šÞâÅ¡€™-•ï¼r˜·Å¬áaï} ¦h³Ó§I_ :°R=eÂ?rÁ™:¿˜ÄÏ} –fÆðÜçÊw×]㌸žv[.Uç´ï {E¦KJõähœÎ]|;A–dÖ½0>”8MüyxÝ&ŽÃz›ÁmKQõ ¾sb@G;*È@FÊþ„P&4lµY:Ʀ€&•;ýhIvÕEæ„¯ÉØžE)ò dÍWãŠ)°Õy“Yã¶Æ@T­Í¨jA_C íæ ¤B̬¡ÃÊÝ2ï» 'Yyßg²<¸LX×(€m$IÕôÙ{Ã<­ÚÙggYf`É¥_fêXÖm"Èig“ÉšðèÌ$ÕöKû÷a{S2ÄxÚº:ß7Û•Íñ™o1™)B‰kÒ©/š(PÈÃ_Ƨ¥d5qÕ)cöêWoía2¦Vl·ô:c\õînk?ˆU”eñ§áå¡K£EF\7 ®;K­ ¾]Á\— ЏgÈ9Õ*ë:n;=ÔÏe ±›«‰ã`)ZÇèf(EÉNfGðPÔvÞ È53¡xü|‡áëÿàÞ Xô.ž‘dY%Ëøe׊D"üÙhè²—P­Ò{O¯Ý½sàµó1¸B†5ðšÌUw@ùÜ¡y3‰Xø¡jn öã9‡šf%¢gdŸà§Ž•bЩ)ТgÖÝËKÈušÓù`(3á&€è£9Ï—O|ú0®ý()¤|-¼Ã>ŒœN1 q©“>ûhÚ^‚$Û0C"ÿÜŽ)ô¼–âã¦3=G–½Ï©â[§Üú° Ü46©žZ5h«‹îáϼb·ÉÔ_léj¡± gÔŒ‹B a?î”'-¼_ qȼT2ܲ_ÎkééwiîXÙ½y@l¼f¹Èì€põ“}ôëY¦r £ ýÍf$'¯»ÌlÆ'˜ärô-‚|g~L¥P2ú¾E­ôûøy•ˆfJá‰ËDª6ø§  òiP«3g'‘o©KD%‰Ž8•©G·gŠ1ñ>™<ØF¥‡ž@€w}N†5Ä¿Eÿ6 iüµ60÷x°1åšywÔtY_|'pâ™H_ŒyȵþPìSõ¸Á·†b#ÔÈsâ¶H<³_X›,ŠK–`gî÷¥ÑCOÕ£æ}[*Ævv¬5nˆÜhŠõéá"¿D˜Ì¨W¯<¢¦/Ær$Ϥ:¿´‹¢´`áA­R?¸mƒBzs•.„»W6e3ÂjÄ23F’JõzÐQ[J S¨4‚»ßÜ¡¸†“òœÁâŽU35.Oèú€­Í…Q¾ô ¬k©EÕüñã2b.LC¹¯Öi–Ì©UŸJ{«!P–¼VíÔD8ÐXóÞ¡±þ®0_:ÎiN ´½ÈFøQ½‡/–ô¦Þy4Ö‹Q¤éI¾ÄÓÕ¬McB>ƒ «ÔŒ¢sÙ×¥&Ï0;â˜NŸÍ‡KQv|Ê[›÷H™ê~¤‘÷`2\¾š³=Ph=åµË;a‘‹¢‡Î9¿Z7–õœZwÍIã,eúUÙƒ–Q³¯Ûæ¨y¶$ ÿ ]+ãG)ñ™lD·}’¿!UîPuL2Šk„×<¹‡»ªoN8oOmÆ`¢xb$Ÿ¥Ì%9šI wg"ù] ˆ0ø¶€ë!I”Sôh—›!†²•í âOÀ0µQÆ„=¬tb“Ù%ÞiXÛ3 Z$tOj† ï-•`¢¯A}d]ödf]÷1l¾á~»Î~ò<+ÒÀ'ÕJôXÍp(b‹ZÂÚÀuÈs¡žÕN@´y|ü°‚.ZÕrÿ -«Á#ÄY!kB(°ªLÄð-CÈŠ¿­âu|1_Ÿ4{lnw¢ê‚4i O[Ù¤7êÌ–FÑ,Ë;Ja¦%¿0ÿ'¥! ê-X06©Ÿ¢Ö˜ ] AåVï+/éKZ$aõÏ£V•ëOwàŽ+uD ! Ž#ZF´"ä8*üTgÎR\æTÞ÷¯[1MóQ—¬mчɛ8ï°b5ÖOÏ;x7’$fBiÉ{uÔÏéUÏÂúÈ-'2mg8¨Š¡žò÷‘ÌG±‚J÷uìCF—¢~?&3'#¶ˆˆ¸#jKd1°ýűB‡ú_•耦+¥‰ÐÅ¢½ÌÄ2*qd§B+¯Q9yð¢MIÍu·Ó^ˆ„É”ÑV2<×>sŠüÎçÉQ+€h]"V!·PîHÍ›÷4!A?¶—9åf­Ê:úÌ—è”>loŒkÉÈŠI«ž¡¼H?£‡—GuŽU¯“A²l_L–†Ë^Ì$–³»”;„…¢{_Ü/i_«8fSk2V|ÌÆ¶x-ŒØ4y’&¬ÒH×D‘ÐçR¾µ7ÔäMÂn °’(¬4³Ób¿óãµ ¶EcJ‚1³]˜[ZëfÁŸ[8PDŽˆp ræ;ÌÏ»ÒQ¼K¦qº°£>Ä>¨lyǦ0‰íNZ´þ:E ½1Ž)qê!ÐQa–Mü²YAÐËK—õj?õW”¦+þîKÎåhå(¹ß™e%›ú·xL„ó@Òmº¼@þ­©L·ªÞt)Û Ž¡©$e×Þª¸y.º4½8mÎ’ Y³ª‰Ÿ ›‡´pnn vãrŇ}zòä‹'r‹]\[ŸñŽOvª|J”,FeÅú’SjZ… ðœ2'£\™(Ðèel'ËM_&úæÆÉOR|©ºduÓ|¼5¥ù¬Š‰—ê”RÇtœ…êÓþMà{‰Zyï[S«¹nòãW•7šÇ}Å Üž<àèiÅ xt™L>‹R/ýZ>Ùú(žuN u@*†ÿC€¢Ò.éÂKú ’zÆSÍ-Ö†ÙºÝ6WíUôÏ…4ún³K¢³lõÞE×DX<Á£¬‘±oåky áóÒ[;evæ¾ìÏá? |q·Í‡+”icC]¥¦»í .YSbw&{½IƒÍ£Ù9·:¦Ë þL‚W¶á¦FA99b 7ÊÆþa¬Ð¼èÀ äý—uùÁ_¬Íé&Á…‰e8Û Æ<¦ãLJ’èn¤‚‘‰†„#Úeññ¢åøtåß¾åÆŸ™}—á(¤™²tè¦àdg“ÉÊÎ\@CE¬ã éC& Lz&äÇœ]]¿\¥¹dÌYú|}TëUÑ"оåÖ-ÓFƒüéK=,¥Ø®­ NàFÕ°×7~mø<œU^ðGØ%;QéBùŒ4—ðGpsŒÃåº/î¤ÿ›Q4ªfGü1¤$R¦H½ .)öÌ!–Äbb_2_5«Qßü+äŠ2§U´]ª]bštö=a#Xå¼Ú4=æ/¡¦£z±Îxßü}  þ¦ó‰¶S¶Ô—†÷ãl9±7…–[ŠÑ‘‚ª(ûžuâ =tQˆ’i7Àø|V¦÷Êô­ú®î î5ÖD·eOÚo,ÄC‰í‡¤€³±R³}¯8š[ÔúLJ-M] §ùRÞÌ-!o!îÚâ°1š <‰ºéd1Z‹œÛKìÅ*T;g蘣±…û#4ÚGŽªSI‚•XQ¬hý‰9Ï›-—á!ŸÚž‡… I¯ç• ü$¸žŠ™g32oýãb’‚ÛKRò©Ûi|¢HVP¼_è{"Ö¿#lï툞—T'àì·Q…¡ê‚sˆ}{½4ÏÍ6bú¶QZBÔÒè´ˆÜ5)fÊQ žc¯õÔ±'&k™`ø<ÛâˆãÉt毡`ÇjžAÕlÞ¬(8›/hê>ññMÇe2xçINýRK™â{D£7+êíá‡r›î–Gqi1Oß9Qj~PËͱᢽ§×ɹøq¦ë’IN4ãñ_€-ís/öŠœg½Þ[¥õ´ Ϭ‚¿uÀ®‚ô™’T/Ö×[IÕ\@r+¼%Õ3Š™ï†pSa©üµ‚ÅRë‡O±êB¹#_­Ý³ý–+KkŒ€®Lš¥#2xŒÿy8}×ȱ‡Ÿ¦šçy rᵆFò­Òàëž‹…8xW¦Âþ!ýäO±‡®ŸQ›7·¡¡ ZkÜÚ:åß…d2ãÕ¼P¡u{ÓóªPÑQ¨H–WU*ñb°vi(ÐÉfå[ íùuwKfÍ¡~ée OÿÛ%CÎ¥¾)«»sBº½/H˜;¯ÁUR|³1(ù2 WaŸ*fìÍÑè!¿¨ÉVS3À4jœ±ïÆ^‡ÏDA‰¼¹Ï¥,£/?Xŧ Í+Ћ…,ª KP6¯*xÞè˜Ê‹;628'õ÷Ò¦¥d™p§ÚÔ„Û._lÛó!ŠaÞr¢Š¢Ia{„I—f=ß–¯ý8W*óº 3ðl¾q”ZÊ—ñaî|¾Ðþ¯ þÞUý9b¤¦ú¾^»ŠmÂYqäN¢*ÚjË• äÊ£ôË~ìQE¾€Î*» ÉsLó×Û±@3r÷¹˜_︨ÐcÃýÔœ¥¡0Ï·UÀ´›½3×óo ³aAE¾åøÊŠ›}Ì"KߣRý„„qÿ&ý²–Û“á#b…yï‡V þ6Ö™ˆÙÝŸ‡ E¯<÷SIoƒ¿«§¡ªc*$¦ù+—Uù¦‚²ÜÂÜïéSÓ‚\°‚‰˜Sb0¾’ýr˜PL™ïZµ–‘¦ÊZ¶Oï~shÆ©ÚB&¹ðÊã).b Ÿ­l/’×Knè ·g21?û`ceæT(Á¿<ØGàð와:LW4ÒÏoèË“ÿ,¬¡„³>ÞWE¾¤†¯:Öñ¬ØTô£ª~烅ȂžÍG˜ÈË}—ÜD ²ów[·š“Ô†¥§2ŽŠâÒ8ôûˆ5G$½šZÅDa4Ú¼Sàí–Sv/Oû+×áô”†EOŽàƒÏÀŽoöóIA=¨—Ž(ÁßÏH~TÚ÷åJ=s zŸG"q"‹ÅèC·Úa£LK¼™5ÔŽ–òY¬½slè„&Qš•+_€Ÿ/+Þ<¿À;OUýpkóÀûÚ/¢ ÝIyƒ‘@ªâvsK™”§ÚLŸ6RÉÁÇ+²ik“ÔÚ¬UÌ m#_x`&óãzµg½háhCõæJÑ©!ÝBF”—×#³Þ•)a3¿˜³I^ Dq~‡&‰§»9!QêKìôé›0o{ûŒ‡5û×¢0ù ^וo)P›Z.³gß÷ߣÚ~¡^<8µiÖÄ(bÉW×k=EÍŸùÒ÷Â#ÚæFÞ0g±í8ÖM°Ð{êRf\8+È€3Mâ­sk}„;ʤÔp§b «/÷¦8d†Û-d%ç`€Œ”†<ì6ƒM“P²WÖG¸vÈŸLv7¿Zße?õ˜PP½i`5 £X«À*zÍû]áÆ£7³ÛüÉ÷¥À±X¯Êú„Á¶uþuÊÇœ<ÙZgß9¶¡±sÆŸÙ;Ì vfºP£mMùVÛ‘š0'C ³é¹1§¸ìÙV0xvöj¢º¨íÂß$¶( UïJ”šåš(9¹Žã“Úõ$¹ËÂrôV]€ƒôP9¶^Q?¦¯îÑ3îLv[ÓRQûñ¦2*öÉ)”q™ÜoÂ*õ:õ¾'ü)x*œe;¼gúŠZ,wæ]úœU-»ñûóÍíj'™åËïH ˜O²UðWðOÓßVMížþ²º²Oȱ®O1ú /R®dø`I«\ÐØ? ŒƒQ'¥e/ï3.‚”œø­îèúÓòrt]gˆ…ã9Ýççbˆ¯pÃ|çho"LÞ+c½bx±‚Õ»Q|}w^°¾2ÐÑI?‹àö™2,3‘ùEì7oŠFÂ…F¿bÍ éä˜ó²ºp©…ÌKi— œÖõêቒDû(Ön˜ZjI§DMu– †ï° ª¾ê¤»›DÕ“ÀfW¥fµ¶ïÌkê/n^Ì|пXE§YqŠ¥ oÑQúT/o“©º¿1à ÞI`¼2·[Ž¥w 4W6ªØÌ7˜ˆ`™¤ÁéÎvšÞ²™Ã”¥‰®b*¯bW«FêïBz£0$à©M¥·¨Êµ~#ÆÉ¬ègº÷bà á/ºäyŒÞ!NöȤ®¢¢ï[ ªÍ®Ô¤Da¹ÔøGr?„y&BÙxäÖoˆ&…™Ñü˜¹[\§E ‰VPÒ#ÆÄ§êéP7¶Æ£—R±Ýâ…ÅÇEGÓä°z«j*ÀyÑM_áY†_–8—ƒÉ3›ËÂhÙŒØ.Nž9tÄb‘÷{el_ÔFB9¶,8P·ñE°júš÷KèµÍ7Â¥J¤ûùRç.g%G&ž+l+“ôäÍÜ©NRé.;þJμQ<®ãœ‘““Y¯éÔ³?6µTæ~Q:œÏ!Ñï{Æõ;ÒµV³irWòaóD îŸÀ³ÈVëÈehË$†äÛp¬ZÚ¶\ð¸ò” okj_ùMî7„èm¡t­:Š'ÄüîÏ£m$4æ^7¨8ÜSl¦ë•‡è®ããY~I©õÐy¢ÂMÝÿ]BˆH<:÷“ÄöÛÖÍÛ¾ªi:ü“{ë5ª›•šTR~dž¤ÁdÀ!»ÍŸäÆŸÎI0("ÆJ‡’d“ jŒ;›}÷†#¾ÝàWbúŽýy6Æ)`à*Éc•¾j|ñ¤ÁQÝÖpøµÖ‘"7ñþSÞfÓdXŠÅ/o¶a#Ë*ðÜ9fádêMòΞIŒ¿MV%Å^,h£¯[ åsæÙßÈFM¬_yè,"]°41©Ø÷)&¦PVåå>Òì¨òÐÿ÷b~Œ$- ­×H™rA=£?f u4ÆãQSFÎÌÝX¨-ɵîö’¨ê·õEH$°81‘78ÚÿÚ*¤¹ðN«»×­’z”ÍDö ·ö¤WØÄ¶Jœ“ßšZ7~5Êy ™TÐÆ¢Ò@ü×r CU¬pšØjÎQ‰¼h’¾œnÆžo<~ïKÇDëZöè 5‚øÔÃäué&}9Û^p&7­47àÐnúÜ‚“O éœST}]âz讇€=:yßZg¡ùXcT¤6+™”‘U„‡ZŽúŠýgH†<ŸÃ–ŸåÄŸN KëDÎól?3ÖŠ¼wè9?BFÔó‘±cQ˜ir ÊŽ7CÉûÂ.˜¼N]^¦Ï¼º¾®©žÙ@µ°’‹ ü¸‡`ŸÓàõ~k=Ú”¿ppb‡úUÏ +š4õzØÏ©Ù±L93§u€~Èš6Zä¹ "¹=’§õãò’ޤ¤ŠñŽì13j'üêµÁESTDcñçª8‘J4»D£Ô–«áKò$k\‡»î®;Ui³’[uÙâá_ž(g1´SÊJ|d}ƽá¯4í¢åö<~ l k<Ì>ÑXl$±R…Ã…ÿ°M7WJz°<&wK«8`bûJ‹Ë‰±Ù$O\ÐŽ—Åe¬{¤Ö!ïÔãZ¹§9˜ð|:üVeËaw”âSϰ[ÄúDÛøˆ*gLÇa%? Jò"_ï‰ePi¾:Ó+"vSAü@'ü fHô×MI¡FcŽË™Uõ,&FLŽ%ŽNªlÔb—Æ&w³ÑÚ†¿&¤…äëâû¦åÎ[w¸¾;ÅÑY·¯ Uš½.r þÔÍ·õ>µójZÞ¾uú†þ'ê Dm%|ÑÁ«Óêº0wpë.“¸kmNý¸ B·ó¢|ãè;Òh|asgÍ IŒ#kAÝ»Q :nc*ìªç~ ZRæFÇJwQaš:Ór{YäÉVEâO‹Œ¬d€7©×¿æ?Åu¯†â?2Ê¥½Éñ%ô˜ê&ý5T¨!‰ËC1¸ÎàWW"Â~Ðf=÷FÕ…½ï™6°‚x>[p§)Õ±ûrdäÂåïéåq½ôvHG'žêÉÍ%¼ÇÎV_̹'2$Ó͇uõ# 1 6HG©h¨ý|ûöšç;r~ús9Üd?¢V† ŽB¡¬æ,D³Å˜,ei²íÂ_P9|a¿=.™œÀL…£ðÂ8É–ðÂg£ÙЗ‹©ƒè£ñ‹ñ"ëÃ]š/#ؤTÏg¸0-%[³¶…¸‰kÖnÜ­Kúõ þJõoú©Ì›KÒ!D!*—ó+U­N17k ƒ‡–û6í¬‘ˆVƒj„*¾H2“øëì¼$ÙÍÈ6Ø/Jvô%;Qæ•—ç!`e¥Ý²-Ošô9E”† mO—=/Ìäî‹”êr“q±Ý-ð‹NŽ4ùd^WE6™êÇîyÇÛ_½—<ô]¹×VüCU( ÷ºã&÷=½VààV[]xؾßðfKX¾y¦t‘[3 ³ýü… _b:þ,†í>U;ÚØÕÚà Ÿ+þØ—‚{¡¿v«ý 1Wb7eÔ{3‰sÑ@Þ«‰WnÛ‡ûFg< «¦ÛT·|h>ß?2°ÖÓôuÍ{ P?ÕMU5´ÏRÁ'ù¥+ªºH'~Ð:†ßPÞԠͨJ”Ýû¯Ïk/3UKIÕë‡ØÊu&ä¼>5âébåmíZr ¿º>åá˜nÞY‹tÛŒ¼o­½[›¦ä š@ÁëÍ ƒ ©u6<±ç†éZâøñ…ËöÆ4Ñï·‰ÇiÚ—,·gÈì´-F}. U"ó` ñ9ª _V‡È|ÈÀ¶ ÈHŽs‹Asµ`=Ã;ˆR gòÌ’íŠçtŽÂÓp¸MìîB[†]7ðL³å[xkÀ V©ˆl›äA¨jZ•>‡wʉŽê„Ȯӭ®VIü²]ýCWzFAŸ±oU‘6õ»‚uè•r*©¶]U—M@ðT:{v²¸a‚:þæ1äž#ª,„ ÏI1vï´Sj0ÌŒÕõ%4/ëW£ŽÃø‰¯ÝºbaRþÜŠä˜v%°.í†áÙ¡SÖúMÈ%± ù »”m&*¬•KOÐѾ•["ÀmŸÈÀ’Yå|½—¯h8ôl%仹¶¸A<Ê¥TÔs$Ña:‚7eÞ{`ÒûF“Ä!Xßü¥?®RÄû=sø—j E¯`Qöà>9~oÊNtãÞÀ£˜’Åç³\ðiÊ5œŒ`ÆÎk¦}Þ?Ñp%~•4Âkq0éܘ—ÿµ„9{“Ñ”Æò]ËŠüþ[è qÏ.žÀfd¡f˜aMQ™Òµµ®´È9ÝWBoè†~.=P”õAµ°!™§Ûœ¯OµˆÆ°€˜è5Ãpô¤$^<]u÷DœnÒAuz‹@wmå ¶Rí¤'ïÎëâ´ñ †:ë ;yVЪÍ@X&I2£ËÕKs±VØ(#µͯ6‘ϾD(W|s¬÷tàœfÇ*M ¥Fwïã+–y8+)úí$ÿ§ø„ÅRÍúl²þ›•›.‚þ-qñ{mq÷\$ä„ ß§÷ŸHm™âz#~©&¤Y/©,Ê¢.EÌcZDàÆ ¹Á í)×J8åÃw£ÒŽ®xu¨}-¹fíÍ’B8y¤Êl”âÀŽ.ÇŠú]ý5÷±U0—§è.°ð'1‡¾ÒjJ|{Ái”}§ÖAmMßy£wpyɶ׃ŠM“–¡Ñiì0ùçxoû·¼+¢\«Hô7 w̯ p•X“)Ž*XzN$ëŽóTÛ®á¥eÚÍÛpEX¥ E%¸ÙêÀ'!§¬ÆŸÙVY¢t-ÞêZi3F¼äd7©LÆ}°be IF{6ø†M„=J{¶šöĈžÖ‰©¹ªƒýÁT÷@ဳ›C„4$ÇöáYRÛÁRâW†X¤€×Ï”'S°.¥<·zCó;iZ» ½?„š« Gž?\µïËîê ,#Å¿½âu1¡ÏÔV<¦e!oŒÅÜDg=RÅ…•» ¾ÊÅuÄý/¨É§1ʼnñiÁÑJ¦/ìdØ»× 7hù€m¨ÆÌaüª²Eg¬’Éɻθ3W>“îâ|zÇ·ª¤û®Kî©3Cƒ}¶tnqå͘mµ‚:‹‚ÊHe”Ý"Ž2)ª8mg‡†§†cv š%ãˆD]Ð*!°æ8œ‡¦dêx!¦ßaÁS}Ò´|¯H¬NÒX'ÈàÞJêè‘êB«è1H""€ ~Ý—E<ú”šBðÒÀôHÖÁ¨9;‘È´ãE;P{Ñì“„'S»†ÊÚç‡Dþ,ë4f”@½Sò½ë5šGË.ªS[]ÌÙœªr7wók|ß)\Kx“«Æ—Ÿßå‚÷-Î8ƒ‰qý‘ö´°íQëR͘éî†pKò"âò]ÑšŸ=íÇÓI0›×àªa?”Á-öý´?1ý}A9¡+Ä.kTó³6×yy3·Œ6èŽSÒ½î„Ø o,t#0eXøŠŽƒðL« D‰†Þ};ý“½ ´šãyrÎZzç3VðœýéƒÓ­äaEr¹¯?8ß^,FIþ]‡l-í=g,õÀË)9»Ö½ü’ðèFÍâOdR¤$ïÝñÌ÷3¢+ÍÉEü?5¼¸UâkÞ‡+ObGì¤Èe¹2Ðþ¬ä+<Ñ `×ðÄÐB{‹ÜÀç!ˆŸc|»²ÊKŒus’Ï÷†—nèyÃdšÊæjâPµáD·¾õþ1=!9û%ãéŠYôÂ8êÑ;\9£ 2Ý ¾úøs{xhó/ƒý1¿\³VÍæó2¤x$Ʋæb{Sêr v<¡^7þ˜‹ gÓ'óP‡—„„ÆÛКm­WeÍ:„ô÷ÔG×´t‘ÙüÀU<óGŠ2@\ò¨¼ Ù—>E¡m¦çP.$Ëþ:Þi<.—YèòkýÎRÝÉvWì¼Mi…çtEÐHÞ‘ç9Á.XãDÍ ÕE¸ï¦Lðzú FÄÑ'/¦ô@ÔÛê&ŒŒ^šCé}M\iÆ”xƒ™w‹<±žnž°¡`ØzWÌ3Pÿ˜!dµR¿ã­+[Ðz:æiÀ˜6(•x+ó~2¼Î}÷Àø©½î<"])¤uŸ£¨V8ÉÑ èoÜ|­xâ$Œ%LpÑ>U•¢=ã:çxÛŸh`Ǜڬ«–h8Cõô2Zþ×G_;`p~ÖJ£b)ŒÚX `9¾^êÏŒÃ~yD¨uy—g&[ƒgNžR*âÒϪªž¥°$°ÔØÒœÍò9°t€Ý¢`7-³ß_}©±ß[CG¥<ÊK²>3%=Œ¿—¥"ç§°Ö3T‰=¤%|ÿÔŒ:eÌD«C%‹~†³æaãÌÕÅ~ù(,#•~S/#eÐÄ­I¿tõ檜-Z Êø%[DSÊû÷û×WÂãƒV=Á~Õ+O2:~‰5d¼cí‡øá%ï‹'¢b“¥>׫ϧ–T 0 œmo†J ¡éÉ—l®ä‚ÛB[ûˆnw†vl¿Î’¼#nŸ´ÎftiónC¢šgš¿ÌéùòùŽitÉçEH~¶ÞÛñ©¨ ­s¼;—qæ{6æú G,¢3M‘)R×mtúPÃ÷¿½Ò<¿Þ¿`ÜË£ÜY .Ö {Š' —⎂§$vÕX‹ÞÎr_[ÃL¯:l #¾xé ¤r¸÷´<µ3S~f]ÑÎæy_è¦+Í‚GÀ¡³ áœ/žÁÞ$—ûLø\žÖ<ß^øIÝ¢E>ŒiÝGÍþæ”wJ ½|zqBð0ކc*TЗ¬öõÊ@œ endstream endobj 103 0 obj << /Length1 1653 /Length2 9181 /Length3 0 /Length 10249 /Filter /FlateDecode >> stream xÚ·PœÙ-ŒC€àÁ¥q×@àîîÞ@ M7îwÁÝ!8Á!X€à4@pK‚Ü™™;3÷þÕ{ÕUÝßÚ²ÎYgï}êkzju-v +˜HueçæàH©hró¸¸^rpqñ ÓÓkƒ]! ¿Ìèôº g0 *ô¯)gÐõÉ& t}ŠSAŠn÷K÷+!n~!..—àaÎBi ;Ø  ÂP„AA.èôR0G/g°­ëÓ2ÿy0Y2¸ùÙþHH8€œÁ–@(@èj rxZÑhÁ,Á W¯ÿ¢`¶uuuâäôððà:¸pÀœmD™Ù`W[€&Èäì²ü P:€þTÆNж»üiׂY»zA€'l ‚º.@wÀÕÙ äçóoÇ#tnn€ØÒ`²CÑÿa2ƒ¬ÿÄOÅw{Œ¸žzÀõûó÷“ÉS{YÁ ¯Âÿ¨/§´¾¤®²>럊ÿöIJÂ<>ì/_Øyø¸‚¼|~^A€ß³ü­ÿ?Úÿ°ªÁíëB¨5 ø§„§³û ÷¿º‚鯉aü÷ ª°§V˜þé|c.>.˧/îÿçþÿ#åÿ¯í³üß:ÿ7$ëüáfúÃÿÿqÀ¯¿ž:ÙÍõi*T`O³ýßP=П“¬²»9ü¯WÁø4PÈßÇv‘{‚¬ÔÁ®–¶¶ÐªðDCAê0ðï»ÀÎÍÅõ?¾§y³´ºO\žjõ‡ ô4Nÿ½¤ Ôfõ{îxø^€ÎÎ@/t®§öâáãøp? ¨ÈóÎpr@a®O)€'y~k˜3úâpJü6ý‰^8%ÿFüÜN¹?€Såo$ø„€ÿ A§åßè·N«Á'пàK§Í¿ /€Óö_ðiCàA'äÈýÄ ýäp:þ yŸvïøÔR°­ÍýÄîü/øÄîò/ø”áú/ø$Êíø_gléæìüt÷ü1Oøþ㢠În7X¨É̲‚V/$’‡zp–6e˜ÎÅ©î}ö>6 †·&j´ÝúÞ™ÅkNn·¡Ï!ìŸ(Ú“¨ï£xFή-¾ã{ïä«høþ“"}ž“›–zþ•G¯œg}_ù·Ñ°¹m¯”0îʧØcubŒKfèó-²g‰iP\Ù)ÐXðŽ=±gÎ/¦ñr'©ãYÑýöc_û®ñ¼½žõ^®Ôæqé"¡#1$¦@<Çdð‘ü‘¢HôÕ§ô}4N ÇOÁ½b¶É~$ú¼"5“évÀg»q¥nTéý‹µ(OPXÇÈÎe€ Ú±·l»TZôŽ^¨œg·H«ƒ9,i—ÃÇðâ“ïÕ¬ÛâdI!Ø"àù(WçÊǨ·/œS Й„t sÊßù±¹yjÍuwÛÈôE:h”4À5ÀÚ]UŸK–[,ÈÃAþ¦žÎ߉½œÙ½“*jm†ö«½/ö5–CðUÌœ¬¶ÊÆí„nq©Š<Â:íÖ×I/C¹Ž$Ë“jíýõÔK?{'Ály<¢ýç„ñç>U÷œ>W¢Waš¡×)= ›z³»ç¼?.X<7l§ÚWyÃ)l³ôëeq)H‡i§W`Ô/†È}9]Òž >Jݲ¿Báÿúy†=ÿýCâC£šu¦$s-¢Î¤”µŒGýs=.Ÿ•¹™÷‡¡I?ž5âKÖ^F…Jâk’8ÒÚ¶-£àbí~ÚP2[ ?ÿ¤rv±à«#µ’^1Í2vÀÒ·pÜ=¥îéЙSãL¹ûb=Z`‚SX›ä‡fˆ$§¦Ç•>Oàå½aÝèZ@k°é¥­4x÷WC÷'P•öëR£…Ü”³› JÅøÜ'5·H+Amºçˆ#3`Íõ£Æþ‡7…#£[ˆ1‚´Œd(Æ%Íe9X‹Žã»•ñŠ||5(6Þˆüïmää«"&¤˜ß.Lß.6„r°çË ¯‘ ‘`G ´I+®,ZÌ×ûËÍx©1´"…õôoЬáöß}•Ø}î…ÚBú¦k*ë°)RxBxss…S’a?Êqqt»-ýž‰«”x™W\_$`ò¥å¯¶Çeº‘†m4{šž+Ù¹¼6K|ïö–ÇdcFÄB–ø58]b8ÍO/oóÎ º!Åjláöí†=*«ÔgY¡[Œ¦wt Ö·¸%FºhÜÙ*®ùS:„šX-÷WcòàáW}9/?‹y(üx‘ãöQ\Dv:c^‚ú}%»Z÷z–´ØœŸSԻɂ!çžÑî» [$xöƒ÷vr³§“cqz”§ˆY\¯ªQU§b3”þõpÔébB(+—ˆ s9 ³zê‚Q¡¤eNkîôzÀ£=Ë 0¢¡7ãÅrbdÂñ€o¹3•ߘŸ(+ÞwÀÞHÙ)Ù,¿IoÍšz·æ@ä8,;«~f®Úÿn¡F©2—uŸ;@¢ëóD¿{0gß„Jj ØÄ”ŒD£GUxlwZ‚KÒYœ¦šµÜÚ/j¼Ö§èàæ¾êðlÚÆÖ”ÊÈmQ9 ×WÞ¤é-K[ÎGä”6¡ªxð™L9%uP][ˆV>…ÚY´jN¶M˜ç¥VÐŒû™¿£ÂM‰ò,êÒb\àñÊ="8þÊÝ ]äÙvm·Cø¥Q¢5wpÐpB?~¤X+5óyù—‚ŸrW\¤–QgÕ­RÆêÄR^&å^ŠÃ¤ÝªèTü\Ž’J"~®\HªîDDëTHá–Ís¸[•ßÿó7Ý4ÏŸØË-IïBç—U±kí`öHM­éTS±¡ ákM.?£eþÌé|rÿëÆ<@%½É§/'µóÖuÖyäð‘¦ýG¾S©9'/T-™‡b\½ÆšÌ€f¥ó¿2ãQÑ#bPò§óýò•‘½ml¡üP.K³æ*€ûìLmçˆÌºÕü‰©U¸6§“Tc}ž«ç,BSä³Â¾r£:û<[¥—î1œ×ñFú©Qa?ÓÜ5ÓñØ L¿st1·'ŠÛ¨gU&5Ÿx1ï7â=kbÁŒ3ê´ùDÿ%ñ[4Mä/ÀâÌ(Èø·*oeü´q¡[—ËŽ#”íT‘>/t_8ÃG5ÖµêÑ-)PA†mލ›_’à’ íz™ F^ÎÓþ ©Ö”Ô`‚ŸÙU»gÕ¼ lÌ÷%®ŽûÝ0vÓ+q--–¸šIP4$ýKÿꋤ °î—à$Kq¼‘ @¯;ÇÛz›.#!vÿ¦®þ/è`‰(õúËc»gÆšT·p–¥e»10¨`~2W/Þ1χËÝj–N<ƒæ­KŸZ×OEÐbibsPO·j¶™ýZÅn˜~.Z¤õÂÀK,{­td¡S¥üŽ€Ä}sÑôƒ¨xŠ 1°9UL¬A3R!gD“=&õš®Ë?¿¥ÜyŸ©Qcª=aН)lE»â´Ëzâºå,ÃrT:\P¡ ImºàÒˆS*þÒOMŒŽ:†ßø¡ Éɇía9RˆáUK(ýÅ=¢U€š®­«Àšg*zûÅ¢¡…×kj.8/…½%lÍ–Xìþ>œèË`³‹Ù¹Î ždÑÑûàãE¼WõÙ™[祸>£A\¡çmÙ& õ$)Iº!o*ǧº ¬–HT哚ž¹?Oseš¨Ò! ÏÇc%OêÞî1êû4"-ýŽ}ªÃ-×”«Œq51X&»t¯*¶;0Äh)Fa†Ød4ëþüÚÒCûõ˜·Ý˜~D؆EŽê0øEóht+J¸µý8;J§Aܰ9 iœ„ÓÊÓšpðöƒc[s³cãReúŒyf<åBÕžÒ¤Òæz‹$ÞiBEP¥wz'ã°ØêÙ\ï+Ó} ÂmÐýšR/ÁkÚ,øÉ‘(du•2J ³º’<©JÀç\öLpþŒ’K+oqaÙ†±)n´sü.w®JŸ YS¯û™e˜…)oSrÄ¢p$ÅÎ<ß„‚KßS» }´ír×ÿh( ¾ fRaƒ÷Èò‹áž>¾7x즮|÷›¬üŽÎ·ûúåíFŠ—ÈêÙ`G\þì»a¢Œ"JkäÍ:¼ñOl똟§ú“<ÕœN‚Mö kuû 2&+Z1 ˰ é– ãéF7¦Öó"®3Õ¬ÒI)±Ækªo0™d(¢­d……ûUâלû¶cðk» [[è•FYYn–<öF•|‹Ú®Þ‘4BI„‹Ãôµñ>í†Àåz™s£+XCùtÙê«ôG@ŽX¥±:òR‚ç7´`䯗°†·*p˜©pÙ{L€_] šF¤g{ ð§l´g³QÊškœïKÂÑíâ9–Bnæ0?gÆy®nxVhÅ:x`Û”n2ø³ÍâØ66Â’zE½šL ¯ÀˆÊ¸lk8Me˜ØcöÁ*=Ïjçûî4ìqC1ý•S‡îv$Þæ6‹\(ºŸ³ê§èÌf=?¾ÕòæìߢóèK•‰-"0XÇ‚ÈÁõï]¤§¾Ù°¥‰þžP÷I·Z)ØhVGçõy¹ú+îg› £HÜ¿¯ 7ó&¡Ru:Ò¸)1¡Bm}A8çø æGùR4ƒ¢›W¹¢Ù)xd›cZ§å|Œ¥„ãÇ€žªì ÝŒ—Kдiûš±4ó3;—ŠÃqÛ-2ze5 ×wh$šiß  HäÙEknä6(ê¼ÆšI*´…ôo6höE£!ì©J–}6$m}›a:pÖe„a¾ ¦”\Œ¿€mòGSjS–ö'¬ÆÑ9 Ê`öO¡Ü²å0[¼N3ž“ÇÔ tBG¢ ¢[›Y†nîÒ¢;¬Pž/ÙÆ#[Ü¥²×ÚãÈÜòV€{äIi3:{7™c¥PÞ¿Ê«xO>•:ê]í"4ëIêg%¯¹Ôl¼Gu jÏ]é;MàŽú ªª´¨žöËM‚¶É†Å)¸ÜUÖà•m #zsêR„˪î«ÙEW/xI!bUø8q{H*´dÐWÉ/âWþü)kˆçå‡K(z«·±_Îf\šÑVÃ/Ùá¹ÙzÌ=¼MÂbq$?–ûäÇýÃTHtÊØ,™¹¶"Xsû¤_ôG®ž‘äg¼y±ö!ý—p xlhÛSÚ¼ÁIÃúÔ1¥C¶ü[Ëu9-“b¬8#¢ß—‘CIJjó»æƒÂNëÇ@5N˜Ã{÷ÈSl»È†:¨ÐÐÏœâi‡Åê&³—!Ó‘R™Ʊ¼¶£Å¨úµh±&›ŸhžïÉÛMèÆöQæ3Õýº)€È†S±öèÚ Ý±óg´$uç½6È@à”¼0]‘Ù|eî°^ê.BtLߺ(‘Á¨×¾V‘¾kÍ“¤Ó?ˆ~÷f™]Å_+Dâð2Z–X€ãj9†ÛR,Œ6“ˆ:jIR¥öì¡cÁ„èþk¸Ð0²œô¦AÚ)icåN¥¿|Fc_Ñg<£ÚT;sºó³õ¯/ ºó’FîCeZ€ \As&$I¢¼Žýb:r,'{jø;Egþ-‘|')rUqsQÓn®‘†^ Bé' ‡Îzà-ÏŒt‚£ù#HŒå¨Ë=ï³¹ºë Ÿ€ÎñŠä)aX­·àgìÜÙwl__‡Š•ºë› [«3ñ•ò ÁË C@Ð †¶.CD^j™PLX‰`Hü^“Oúf´D;Š–ƒ^ýNj€ Mô½³ŒûÂví ù¢íI~V¯vDGQ¿©U0½ƒB1òMê ¯dĉÓ`kš—}¡5Éà"KÐÁ›œNÔ/Ž\‚ÔÛºÜN0Η½Æv?$ ØÒ÷§‚8ÊïÀÀÏåÓQ‘"{3ÏY³ƒfó¡ðÕ^êÈÝc7'ØtŽ[ȶ­ýn…‰´‡à þŒ„àˆÊÌJ¸É‚ü;º~'éšÍ$Œþ)TPæzû+ÓWc…±ÒÄ×ÒTÍŽJED©Õ, ÈV˜F ‚l)ê¨êÁÑ#~„[ø´»ã:­ç>&mIëcx悃MgTÊâd´ã!ûhÀÝÖ‚,KêøOHùÇ\å_éS=â ³Ó(OïThîµñˆ9$éÕ¤e‰ÓNÎÇ?†z«H”£!…ån÷›45{D[ÀZNb.Xˆ»4>u{‡ìzy¬´-2Ø(—F_)cMÑgÇ"¦èï„5MJ¬©åÅ\'>Iõ^|¢êDâ-þöè–-3ãv®0I9?·ø‚J)ìý(ì`<¡#¬p$¤§Ì÷<áLyÔõÛ§á—<¸ÇŒ¯R^´e€€a¦S·Ð¯•ÉÔH5„;V ì"#tçï²¶ â½5•ò »²ÒóQk)浪TpqR]iK†aÏD“M•ž­õjå(¥ã £‚P+/ƒËÞo¨~¥èQéÕ‹ÖppÇi/™Ö»¡ *ƒŽeâØi:ÍÛ2 í¨ÈÃ&kÌ0õiagÖ!Ò‹bw ¤¸=FµðCg2,9"º¯N즿ÇDµv­zíâlÞÊt°Þ˓ɦ˜ñ]±8êMMå{Üj3:˜¨Z 0x×P.ñʾöR¤ÎKË"-¢?2;®x×rfj±{‹eÂkÚ¿’]ÈE=×aÈ2†„ìˆòÕzËiäbB¨. eξ5vƒ¿ ú¾såeït5ð‹!W©|æ$ÐY +†·÷­ÚDËùಈi­úË1§²d#‹qxª"W×ö¾Æ}TÖBûœ« ói&¬ç•“s>‰£[ÏT’±ÙFˆHô’¦»hháÔFÐ.˜¨¾"JÚˆq‡Gm°}™IÃ}¾¨8×fe.ÿåm«EÅ·:ßFÞWvÊ>wf¤W(Š>ä«þ{¢›º“Þ€.\JNÕ˜1£Ø[Ï"/ñ·\+J\I{ÿžÂWú,ѳ§÷KãòÎã9Y’àÔÎ3+{¢•-®5¯3ÛH 5?G…ìñó­Óד“gÔŸR,S6²¤b˜˜r΢ÄE›÷½~M±ÁdÞ—ú`/Mç ÖšôIéöðãÛD†œ'J•Våœ*êðø~ÙMا¡jˆÍb#®¿ñð«þŠú2þuîw2®€ÛÕ~¢û–Ì)ÕrTø-€~ÍÕ¨}D 2uìX ÝÕOQºcú›¢J‰Ú_‚~é0Iòw{/Yuµ¹ì»/æ½Hã¸ú!4­ f)gûS¢«'¸Aßß¾¯§å·à}öí3*ðD Þ5U`Ï€ mX/#á“K LÝ/ùí[Gs¹vEQpi™ÖAõ“§8çg¾ z÷ñ,qœ ž›4¬pp EY¾ø­ÍÕ„pä"åJ\A¡|Â÷4hjÙ Šb;|q+ÙæsÅŒ‹±~ïÄkÜcìÖƒYªå K%+s-œpJbѺÞ1£"¦\'|äž¾ã}ÏQâp¬¦¼0ïb²´jªôía ÃRQ^vü+(‚uÔ¼Šâ‚S¢%=#!¾Lž;ê*¤‹R©EԽ÷NË<­ú¢?A‘Y±6„)« a95AióÜ9ðhma «¡+84AÒgñƒëÜ×Ü K_ » TdÝ™š¶jųög/…BÕ=2¢2½Ÿ{‘ܲQcu¨ÇÕ(íbO ESÔà¤ÛH^ô‚x½ìÌÖÓ7wB^׌Ù1ízä~¿\›…Xýc8¸¦õb`a.ÆD¹eú¬Û׬ž¹Ô*õ(ö–}4‰œ Öˆµ µŸíÊrþIýÆØi‡={6õîâm›>ÿ9?,ÿE“wcÌ]4OöèüÁ­{Âù,›7dðǶŽíÖ³ö63œgtEÕâŠ<©¾Ä²÷)ÏCï£.LJ̘Á” b´åï+£‰‚‡¸"ò­%–^ͺ”õô"ïˬF¶R# ¤îÓMŠE ÎÌú¦Ÿ1oæpò7ó C›÷*νGéD1ËiZ›¤”Ès ²¸p+ѳ¢¿KŒ{oµi|Ö’e Où-†­ÒÈÆ+†¿ÙQŽšZL-¤<)5ùßp™ó$ûB]<©\­·2LÁ Åf~/*øKÕYqË])X5×ià §õQåè¾ûWk*õÅ­ÂúmÎÖ‰VǶŸD;. »A³ÿMÂþ:-u|ÑÏ¥ˆh£|½÷ÑE±¸£²åò¸–ëÓ[yã^¼J ÅûéÁæ_u7ÛŠ«Ö;!ëäçC6‰>'_ãԓ䘖¥í³èq2l7R–EGeÑiE>¹1¬júº¾×¥:Þña@Ç‹²"à"B‰­Ý¿î¡$“×(DUú¬,è×½¿¹ÑxˆXÝÈ×–¥Í¾1I8Ÿýäõ-RQ1~¼äçöûM"£>û˜œ:û9©¯|_Di¸¯Õl[f˜•oˆ. ˜Ažˆü£¿Ø>Îq>P7–Äñcx©[Ì·¶n+–k§YâÅöÄhl¢ÌŒs÷±oA={K#F»>ñ†o%iŸA²2úgk¨™aúFXÙ‚ !<“Ƶv`§zÐñ…­Ÿú˜OŸ…]¦ÆþØôúÏ„¥gMƒ¬«Sšö½¸ô5mzV€oê½5s»¢–2¦è¾ç88cÛõÛI¶Q[H Öx1~t϶"E…úZêV#Ò?hùùƒŒqëíÜÊÆÉ.æµ¥¤,²b“+ø½‰ÝEÉ®’ „ÂÙˆÅquç‡1*Â5ˆM.Ìs7ŸÏ6òTZ¥.Ñ'ePFTü)½PõpÒrïOŠš>L%c×QËB@·\ˆgãŠr»së)˽ÅRMU¹h©ÚUÕ^Š9Æ` 9«#ÑÊ^<úa^.Rtv‚CtßkÉÉG$ÅÍYç²”6s“9/ò#T˜ÁÈ=¢š¥«Z…ATy5”íK¬œjr&±a¥åÒójSç?øÃ²ÁúÓãfQÙÅWX;Yïí¢päš /õa¸,I#?Tµx]q y@æ›@ú¶¥Ót5wÌ“™A¤–):oå.Ú^<ûŠúÂ1Äè9ÖYó‰#½ðj|¬â"Ü«i¼óaŒCYíã44±”Þ÷Ô‡ç&Ópš-ŽQÌ ‘hÝ”ŽT;ëŽMÉ^axÍ`ó%Q‹6ˆŠJo§‘Ùµ½Ê9 ‚Éý¸4"¥¦"S8P(XããÃÑbx|—2ãuЈ¤>&x§[˳ŸšàµùðÅ%.…ƒO—§ÃL¡[õ¡¼iv»Å8ÛA¸j© â]^õiûÂæ:v´òQì*yË)ɲç|h«ì¹o’5Ún¹â½ F³—¶-7Y¶QŸÉ¤ÎÕ³å>í…‘æÄ2(¼Km×)|G»#ÛÓ€LÀ8eÌï8{ˆéÏ9ªôyWÈ­`Ñðm* ½ öd¨§Šß44üß»í>!ã*ì{Àç{ëõ(",åo¸Ý«'§át5˜ïgæ©X&Mì‡p´ùålÖFÜýDEMir÷Öm„ŠŸv–î½ðpÊ"_ieF4¹åQ?ŒGà;;¼ZÌ·vÿ~CT¤8ΕŸQ5X vÓS¢œû0#ðŽ ê!Gg6Õ:„ž¯ú‚_¤\–¾EßÀAÜÙQa5‹‰/ëÛ”5à1¨¼ä…È~”@4†b ÁÈCisM8jZçžà(‰q/x~À$bi|µ_a/ºË´ÔâeIÂJI\†¤f┈)©j‚Î,DcyˆÑ—óµÀÉZ&Œ>Ôn.ªç’Bê̆OÄñÃy%O²+]õñ!è…Þšq‘ƒs.sˆ’{dJþ«×t ¦ú·™‹¢|Æ<Ö}ßnŸa ‰É´UsÒK¢RŽÁó?H5¿~œßªkÿâÞ¡3Å;Èt”X/¨ÜŠ­‹",W#f÷€æ‡ÿê(Ђyï:h‹¼=~ÀžÇ<Ùª—M1µ/ö¢.54 é\e Úe`,¼Ø˜¾Ï!îí\k9ªò„Ϥa+xèçÞ¤¤}yÐüýžS-"y±ÍFŒ½;¤÷‹ômî/w|ƒûÌõIkJím󛡨»Âø‡ýa¢·~ô”‡Qýj¤’?Ý¢º¿\8e[ì( [Š—*_öm®£á?5»aÌ•ÖÇÄl„˜lí«* (©ãØ÷ 4‚ÞU7±3» |'¾(½j pÞçÀX$ù6ß}¦Ný¨frCó³ægCÔ ôYE5TŒQoßоØÅiM3.Õ‰jO®œ]ÛÑØ9ˆ0Î%8OžM¦“‡ºˆ!©WPëÎ aÃì(W–ÛTËh¯7Óõ;"¶öy Ñ8rúf}„QÜdÇ­ý³8N9ÕP„Z¸Í|ÿðÕ.&(–ÁÐш4wÙºœ+ÜTœºE—&„`ë"™X³&ÈÙAMÀ¸ªGW=3NøEa¿ÂKÕˆ™– áÖcÝ?E¬Ódï¦9RÞJØóòÏù§²”fe…ÓÁ` 9cŠRžuâ„ÊÞòIeô“m9}°| tâ×™¥”ŸN/ŰàÉ.–%Ìãÿ"€3áR€ok]%̾Qâ¥o:ç _½Øvb™?ÀXüŠw{…Í´ÜîQ¦éë„/}^Ý†Ñ áv –¨y½vR‘ÜoqÙP 3Ù@VÍ Ì/C‘Ä"ãhaCÖñ6âœéETs…¨<Œ‡e( ˜pÀ+w÷äûuÝ;_íŽèS…f5^ìÔƒêƒ<¯ôwY«ç´ðŸyq"‘hBeˆ3Ћò¶G[1b½Òè->ô½ á¼ =lè>tµt]B/ÅFWÈX ë¶¹aó{ÔC¼ñ~k¹«Fd²ó´e­?è2“»îò³JºÆÈÃ>Ic—˜G Uéåãdv#´ï)°’ÎW És©!ßÙ°cO°^ ªøÓµè{ÏhˆŽîȱÌîs=«wÝ,“›öjøñªb–L'ݵV/KƒÐ}öImg¼•_äaÜš”0Çth&#†z±Þp ¤ã¾]q(ïOÁÍja>Á•$ŽZT/ÆÆ3¹{Ü0ëÛ¬éLwѹ°z¹ ,s Qñe~3Ð eÕÚ‚ï_cFR,Ñ5-¨+ Š?ÖøÆRuŒùk„~…ú¤ ZJÕ¥³4¥Sí×/w* 6ôžÊïFa2g`Ÿ¯õo«gÂ_c/ú*?QS¥¥ì&{¶ ¼M÷<¬£7q˜\PÑ^CÕèAn†OeáTŸ‰­®Àå×âh€Ö×w’»»0À+ÛäϦ‹QXêkóÆ•bÊ쌯C艵âÍ=íI¨ºŒVádÇËy%¾¼Ó“ Mì÷üÞ´I¡0E µ_$½ß˜ªþ†îãœ5SñÒ*r<¹ËÿXöë´ endstream endobj 105 0 obj << /Length1 2502 /Length2 16278 /Length3 0 /Length 17733 /Filter /FlateDecode >> stream xÚŒ¶eTÙ-Š;®wwww÷  îîîî ¸»—àî.Á-ØÝ}¤Óç¾÷ãÆfU­’YUk}$Êj "fö&@I{;Ff^€˜‚š¼º: 3€™™‘™™‚BÝÊÅøGƒ@¡ tr¶²·ãý‡˜ÐØ$7v™*ØÛd]m,lN^.^ff+33Ï íxâÆnVfF€¬½ÐBÌÞÁÓÉÊÂÒé¿ÿ¨Mi,<<\ôÿ:±:Y™ÛŒ],¶ ˆ¦Æ65{S+ ‹çÿ¸ æ·tqqàebrwwg4¶uf´w²¤¡¸[¹XTÎ@'7 ௲ŠÆ¶À¿‹cD ¨[Z9ÿ[¥foîânì€6V¦@;gÐ!W;3  &#PrÚýÛXþßô€ÿÐ`adùÛÝNÿåÈÊî_‡MMímŒí<­ì,æV6@€’¤<£‹‡ =ÀØÎì/Ccg{Ðyc7c+cÁ¿’7HЍŒA5þ§BgS'+gFg+›¿ªdúË ˆh ;31{[[ ‹3Â_ù‰[9MAÌ{2ýÝâÏvöîvÞ°¹•™ù_¥˜¹:0iØY9ºeÄÿc!ü‘Y]ÌÌÌÜ Æ@SK¦¿‚¨{:ÿ¥dùK ªÃ×ÛÁÞ`*èkeýAðv6v\œ\¾ÞÿTü/B`a˜Y™ºL€Vv¼ƒÄ@ócÐ8Yyô˜ACÈ`þëçïÿ @sffogãùÇü_fRUÕ¡û»è¿Õ¢¢öoVf+€“… ÀÉà ðý_GSðßòÿ%U6¶úOzÿp(cgnàùw úþ[‰Ûƃú?ÛCøßŠö ±¨ÿl>3³)èËÿó.üëÈÿß üååÿa þïœ$]mlþeAý_“ÿ…±­•çl@ƒíêZ{ЪØýߦZÀï¶ÐÌÊÕöÿÖʸƒ–EÄÎ4ð <Œìœÿ[9KZyÍ”­\L-ÿ5<ÿm(‚•PÙÞÙê¯ ÀÀòߦü­m égÐ%ã jÚ¿T@ЂýoT ;S{³¿6‘•ƒ`ìädì‰À 5V€7 heÍ€ÿšr£½ èT¡/ÀÜÞ á¯Örr˜Dþýq˜Dÿ n“øÄ`’øq1˜$ÿ “ÔÄ `’þƒØL2(‚üÄë?OñÅSúqƒ|ªþA Ÿj;€IýU¤ñ"hýA Ú#ÎøoÄÒÛ:€fü¯[ìoÔäÕiâdlúzXÌ]þÈÙþ–ÿ{ðÿV€Š0ý±ƒݶ‚þÕr¦?ÑØ@ì˜ÙÛØ;ýÃø75™ ø?!8ÿÒ;º‚Vèo/ l@-·1¶ý‡æ¼€,Ì­Üþáö/µ½ë?ÂL,þé-þzÿ4•cù§8ï–ž– WåHfõ"üó? ˆÛ?Ys‚˜°ùkÔÿèAäý£ЕÇôÇ7È—hEþ¡aÿ'ÐaûÿQƒJpø£9s=vÿÓGv–ÿHÿ·‹ Uf †•ýŸN±ƒèq°qýG¶ O&Ç?=qãèjï43±ù‡ HúY@ôüñÀñºýƒ?¹3èøs”ÈŸ´@×*“‹¥ðmUåânÿ –\ÿL#(¿>œMíþI ¨nÿ€ êÜÿ@лÂôXAQ=ÿð:êtúwÈÿ¹™L]@Dºüë][ÿÅÿú`=€¦Ë‹ö¦|!Ö !u"øî ûSlœ÷ï®Äì±6໌ýŠ8ŸËñÙ î¸SsÅ•Ç-kô  ÁÃð%b¹Ü?óˆv1¢ E‡ŽÄ;cläWäEº„£ž¹bÀKŒÁIÿr,æù]ú‚¤ò^‡BPl]-ÌÓŸðQ÷ðÈQ Ÿ¨òk5¼ÒÑ" Öï _JÒ6~*¼0?F»Å™­ƒÂÓe{ZfŸ¨du[Î>Vw¡-,Š"søÿ“Bpi¸4Á×)çâížìaýmÙ%'Ü ÞK_•OuxC_<ú°,™äGF.àÄ¥‚õ- àÚŸR".¹x>ÉÚq'«dàà.8ýƒ6„w)ÃÞÜ=ð´ØRúWœWWùéhç¼4õÅô¹«¹ #²}¨/ŠÑüXa2äábKZQÓÇÒ¡"í­g¸÷ï6‰û’œ‰Ÿ ›páu^R†]¶PFÔe5+ÑÎôˆÐNJâ}óFrÆz_ Î}èf¨³Æä¶1ü$$Õõ¸;YÚ=Rv©–¿.ðšιè^öUÔx†5N+̲Ð%–k{Í6ù¹M³‰Tã¾}#HB1˜Y?ÄýQHôûj^–XÝC‚‚ŠiuѼ3 Îrz~44/ îÛ®Ûö^!2AíÙ %Xƒhš^…@'tð4e¶JEiº¤‡¡g¶þyŒªœÎm45ͬ_¾Â¼€v›¹ìî¸yÊH†åC•x¾ ^,Y yQ0U‡ŒÒ̈ {0÷ÙóD݇¤®ÊC?ý{qW0m1I3Áj„OÓ>*j ʨ2/ÞÌ`¤û$f<†ãã­¨¬¡;¸©Ö\…˜g¢ÝÌ"®‰AǦú2úÅîLAÃʼ¨»/O´þÂÎx†’mãpk÷Ú ´æmŽ2ÊSŒÁ‰½@*ªi¯Æ“ÁüF\ 5F³6ÎÃòäÝÝYì(Ìo\$D•ã4w%a èû[^]Ù8.:I-Øñø’4’ðLïnü÷Ók`J½!9pàkZÏ^À˜¤†Ryuu©Ô«ˆ)°¢ä{Ãä¤C)eçp9X$T8ÃQw À|nÁ#¢Q`D1xìkTÕù4Oi½éQƒþ`öüCQìÓm·s@DOÔ¹t0èç@+m÷“+|báú;‚K:f†úi@*ç@À-õp–Ó‹Q$x!QºÌ¬<6R §Ë­7 (fxfªÔ¬¼/øZœÝdõv$ë[9@/hdÿ&i6¨}þ‘Æë¥ȲZ-&Ú1Ó¨2ÜÂh_Š˜©xqÐb}^Zþ~£ØÕÞI#ÔòVÑÇWãL–á$ÀT®oÞe;aâ¤79o¶þÓîåÃDÄÇ›†Æ&uæØzÚóPb|Yec‡‹ô•B8g mzóãä€Ó{•ëÙ{ð<ûÖ Æ«ÃÏÛªxy°^ñ}¬™',~碓:·{ QMŠ*R˜HЪ^ânŽÌdX>ÄÅX¸ëB.+‹¨´ Šd j²™wgV'“=JrÅ–nË iˆy „èkºÖMAá1•’gѺ%ýTXŠ {ÏBv¢ÿA;HDÝí°Ñ}v½¢=„Ëó¶ùø½i;Cií[f©nf9Ã×v¸ñY‡SF/Z¼ ˆÿ„ï¿—ÜLµâŸ”Ñ55⦉ÜÔõz.*b·d” ¯6©¿Æ*[ ­¼–í¬[ÊJ²Ÿ54iB9ú"¦«Ü¡å*жòfÿ|ö š%z{nÞ÷b‡y}àQ-tü„.È? ³59î%–öºMgpÏΑëÁ­Gu^Û_¹qïÿ UÏìŒtÓÿËÇÆ¡› " ÇS1h5ͯ/Ë -µËMåmÜÔZ’˜–i¼ái-NòEO/ˆJ?ðÈñSK5 :…IÉ뤡xZý‰©›° ú]–çˆaÉýZÕ˜ ³½ïìe3¬*šŠ§X•ô¾{ê&)vA…ºÞ±)X'ªY¢ºiŒyP\@8Ñ/ÆÊ¼Ba¨O³ ݆ßÊ\šñØë¥ºX‰;_v‚åßÄ>Tñ$Ÿœ²3ž—Vÿ:2-é#ç™ý¢šè•¸.ÑÕg7¢Œ܉õåkk'Šå<'?ᘟñ³ã¤µa(n³àÓ Ä–ƒkž¾]¦J˜$Õ¡{Ç7eS*Lœ[°/D¿ñrä#'0Wký¼yÁª—uJ¯#°FB‰z®Vñ¹‚†/‚È™ —Þk^ÎÅ"©çm‹æŸ&ÀÀú³ê™½®/ŠfmÓ¢fûôD­ê_Ô‹Ú¾ñb źg?IwK(äpÅ´ÝäQ4],|µ9`Lï[ ke¤üxùÞåÖÁÚ»ÀÐL°Jf2þ¢e|¹øY)¢mú¸Y~TÛ×@"Ý'å¤hÂ'#Kâ¥]]yüë"mæÌ™áÁR†ƒÏ>cÚ"ƒ5“¸%9È4/%}Ûì(FõÁkòLÌ.Æbíj?ÆèÉçj³-ójR!9~‰SלözØ<±g ÕóÎÂýxñ¶—ÿ{ÛìŽú¼n0¦pG®W#òºÏ¼8PPý¤-ô&/½iQ³˜Ü~-R麄µÎœä©Ò‡.Úã)Pâf|º¯: ¡³Q¶´ðŽ'°*’¹ha¥yÐéJÅà@»ÙkÖ+§|Ii'ƒxˆ6o²;'7îF4eSZ\ †µçÈ„Gƒ~I"d»W©FõêÏÚQÒÇÖΚ‘ÿkç©|=æÍº4¦0gúÈå‰í–¨ÚheãD…Éæë‘9QÇdKyB1ZœÙlóŸÊb ÎôÁåPvS¡±8(ô8j¤¸GI¨=0Ó‚ŒlMT7ø0Û.„}Ú/ÐŒ6ÇøZŒðZEç3Í®™ôn§/ÔÃK}_õãÏ^»Aß4’Û/NˆF²¤*ïU²nZé­‘žKß·"&¸„3«vøÖ˜\ÚýëÖÏì†pW÷ Ô\èͺ—ÖÜvŲIGÜd-,Æn7-·|ó´veóŽ ‹øÔ¦ÙžZô©a[Ì’Â}ç«ôE÷0C~\Æz£ÙqïMS˜y\²úÐCIõÑìt`I¯z”j ö²36ûèrëYñ¼ Ù0b"nBÏycÌ•^èIUEyB¼§‰=ó›aȽC°õ· îØ;A¡K’6dŸ¬ì‚n ·\ÂÁ÷0ÆzÖ³üd¨ïHeRYÔ“Ö.™r»ŽŸ°7:Íž€& +E‚¼âT¾W©œiR®ÊzÄwš[Ù×–KÏNœ·\µ°®‡ÆÆ„cýP©l÷îëÎï¹%mSÄô|H¡D |V.6.-¶Dˆ f‹ý±ÃÒ3äÇëH³y ÃÊLQöÈ”ù)Î@Ý!˜¾Ž%Xê2ÝÂÌ~yþ¢x ®Ö£³ÉOFŽ )â o:óÇœ4 ›3ÝLi­º=hŠ´_•ÎdmÔ?Þ @÷¾}Œ0 d 4}3¹/u!lBDl6•Û Kà­À’<9[#Hßã±VŽá×6É¢âlÞ, ›MÉIÕìÃ3Ìó„w"’cKÕEíÞ½»Ê´MŶI˜m„ØÐ™ÍÕŒÅ=N@Ô# ¬Õf¦úþÿV)Mž|Š‘ºKÂWæë2Ì´¹æ…ö+ÖYÚ^É¡€ÚAÇ#ØtÙÛxƒöÀ¬“ëj‹­‘€ ¯õÎRÒº'îNæqˆñu;j&Ȥ nd]"óÁèãò+‚;”,4{\˜Ò³e 3æFñ£¬½aÉJé×– q—1á›âtÎóñ‘÷Ö|OÇ ~ì úW z$(Æ06‡zö]!õªßaã£ì§ïø£1KÞë„w5NrýË‚T?×äÉs´ Ád=”ŸxžrÐ)¶Èª™9Ù3ž8AAîq\ÍÊÑèí™øY¸ò^sMHcH¼o.‰«./†™}]2ûˆ)ÜÉ#%‰ˆjØ7Áî™P\®{õ'Bc¡ù”2»k{2›ùÞgót«¦—ǹÜIo’’.±‘‰¯£ÎQˆö9Ðú¢V“,ÞÔ’ceƒ,;Ìn…ÒÉßB‚.‘OŒâѰevŽÅwùBƒyÏôEKo}Ÿz®“å-µµ[¡ó¼¼'€{ϧ_K«Õ ²'¦&Ïc4-Þ¯á;j‘õ¡t¿w"º¢"Þ±‡kåi,œéÞ=ÛÁ¨Ÿ’å)úÑ¢ùê•´]9lÌ >ŠXbë—Z“K€¹Bòñ‡¿·kÈ­ëÁuÚÊÑŽq°,§¯è`‘ÀŸ‹Þ?ãA Eùs6®,%ËLÿ<\T%ŸO%¥8 NS¾J©ÂϘ|Õ½^öújƒbÖÝn>^˜~UÎ:¢ÙµåûKÉs)V×ßiß´|«THúý#œáã(üˆ8p¶gt^ëÝtãW(ëÄóý¯EQ#¢|M×@É%óÅš4¦HT³Iÿ±úmúû>‹0V6±@¶ïbC½8˜‹¾Äš«Ò u¡-ë{€ˆS¼X+øoNWè“ë7­_“n([í;]­V¦j[1¸Ø²7»*8£t~µ€ï'±±  »Âˆ*“¶,õŠ'1áX9×Û6R¦ä¯ tLŸbo+ôYͶ¯æwJÝ3¶hØ`\W‚^põT ßZ¸0=ónõ:ožóv€0, ‹k£82þ|ó I›ŠqŒZ§†_;/S€ùägoñ‚¦È$(nscüêoùØ?šlÞ¦ÄÊÄB{™i»dnÕãç;™^ÍÁb%êx¶ÙõFU-#;­}Ü××bQ®w`¤§»Ä+ËüÔ[eæH?7ùj-7Su€ÇÅq£®[û~ªqimÂàí*gWçö\?mo:W!bí±©“6{ ×(½¾þÄ;@ÝÍ÷Ö§Õ¾âq¼ W¦Ât?!sùI¨Ÿ³ä9‰i[ûN»HjPpÚ§É$ MìÄç0ö¢•oä&„ÃåÂkÂuzol,0w\P:DÇ”HЇöäTÂpîN:ÛZóÖw¼ü1•ä$Æ [ï–Ç}„r•L‡¯pá&ûh+t#bãšY±™TITßëäH­ Ò 6r ØÈã…Úq™û NË §¨S†”ùª*ÀjŸlÝðzx ý½–‡`ágpƒøÒìæ¼’Ô„@¦ÔÒTÄ9ºO[c<ÿ€‘°‹îvrTkNÌ1nÃÁWÚS!ØHv+[×yè,±hTT#6ºò^Ÿ _@ÈÌ€Ÿ²ƒ3GÞ á€‹)EôÓXÈP³ji}hTáòÙ1‚…O~Z£çb©[Íú6 ¬zø&¦ÕÊ)™7ýc¸T Ïò4LUî± »·fë2îEtÙ‘¾ã¤™ë_Û Ô¸žI{±…Ýr“‘š€‡«^,:†üÕuwöàB†9ÊÂB0_E90¥‹Ÿ‰Í²©ý{ˆ ã È2hI¹{ùCQèu„å%KƒVd@–\Q±4 ëÑçïPuÍáçJŒqEã‚í3ž".) ÂNq§±˜„œm–TVd·ä .`Ò#ì;dÑû”¯Þã3j¦wìqÒ–å M}Q‡(C Ÿ4m®nSÉ!gkÎtô"÷cÙû«ßwÆÂ‚c7ˆtâKRÅã¯ÚÒ’7Öœ“àÖàj¥»®uæC¶!¶(ÃMöl’¡a/yÄX7ïõøÛw®Ó|ÕïøÏì¤r›<•4UYUýÇ+G^b€ºÝÏ`ޤ.3¹vÞBK嵸ràH­‰`c‹ôQ“öÜPPB_ˆ3H$’é¬EIdîñ8*&„{ ¿OOšxN¶E°ééùòÝyÆ!ÖjÂ*6m7¤¤p'Ä3ž¬ª€mÛÇÕ ­Q4ï4} w®ÊÌA¯ýi){™@Éú©O´ÓIŒˆìË‹#š‘4lÔSÅHÜÄÛcáH7ì×÷ym q籤E¦A¤…ËW¿ @é“Äs9¹—i¿Þ»ÄÍ:sÛKŸïÄþHgžâDÂv»q5ûypÓ¼Rž‘qp¢„c›a µ“V’ºcn‰ÐCvÕÊÔß®hî0}ž…$„•´H” UQE´ï~5ߢ„/I}|’ä“7ò¯fQ6 þ}½8lmKqý¾ DµLof,O€Q‹F rìÛ±\]/A÷­±ky¡4 mˆªà;€‚“•"M[÷Û$GÛj\òlFøm·gžƒ¨Ë‘RZœóÑ&3‡ÂçÝîÃE‡1ðЮ®»Å·I›Õ*'Âw=Sæór;Ù×¥]*ýÏI ¸íê9KN* •ž®oïÅ~v¯c h¬P€á¾<Õ÷ *¬S®ˆê¢hÇ"à)¦¾SȼYKë ©¹­(q<¯ˆnQ®nâ|$I‘êj˜Âq×[ˆ‡b’ý>;÷-mæ×u÷TIyj3•{VúÜø»…f̼8ŸÅ…¡*löq÷‘NÔ“nƒsµð[Ò­ÇѼÌ×¼¦__’wÞ~3`™“Å93X= ^Çø+û$X3žéEVëŠ9¼ Ï’¤Øïž§>sû"'Ï“T w \•—&@f©ËÙõ®s3è”B 2¼¦‹cÜæ¬ yE€½6‡+Âàà€Gñ-î…ù ¸°Ž|£¶‡À qAÇÖ¨’Ä>‰kaRï _©¶xE/‚àü}æ·&<Òs¹ØCÕÊõ $¤âÓªøÆðƒäâJ͋É-gMJö¤Æï ƒ_‘#mµ1Ù ì§ž)+¼¶3|äq~®à{ÁHEö3 S§Ý,X|eªÂVRL®õœgý!3Z2*aÒVo¦F”^®¾Õßôß‚e† =åRMèŸ2§Í¬wv6w<ÈSktÍvÞÀ°}ƒæÓ@ô[[I7»³ëKºn³^T£_ÌL!®Ø1Õ‘IGÑj‰È…½Z^Ó4ä^—øA.å·AîHnÔ™iÔ0ߨ"­2”×Ê:CÏÌðÄVÍ”„]¯Æ`Ù\Hb‡às6Öe-À^~I­ëûúARLAɽ'¿]GƒyÔFûIÿHuVãj×R]Ä)B_ÖªÉë=>ö¼¶ñFMV­Äß/ÚiÉ ]2—:°[m–jˆü+ 5_®¤ÀÓà8³³‹×Ë÷N¶3üIg.y™çË œƒIÈmò~ø¯Ü1†qâòºþç´J=ó…žñÎ-„ëëô*ÖbÊsi¸O†zQëËèô+¾¼üÝ£;ü"ê¿!.)Ïé°7qX‰ìšG£À}hé¿@üˆûYêø…;”ÛŠ•àäÂqiØ¿üû æ j´x^Ì"X‡Ó§s³‚h¬£Ì“Ög rÇ—¨ù™Ôl¸ûÏtS!jâDüaëMF>½Ylì?'GŽ=5³óìS Ï=Qô9îgø¡Íýú,#ÞöRy!Š·|Z³*Õ‡¡ÝÊvÛëÇóµIÂdïžoŸ`ur®ªBˆ]aŠû2AêzáÏ„}ÿò.ä ax®l¾6ˆÖnñÔù–ß`R\Òƒ™-¼¦h¬KñÎZîMpÿê»{’]MLuø ˆRÞ$üãÚñƒÇUUµ´îa‹X©Y暢íöoÂHÙé£m´³èÏqÞm<ÝÍÝ:x²–ຢæËÖ…¥éeEV÷ ºë<²óØyãîˆÊï¨â|ß*ŸÀöø£·F;Ü-Œúf‘–’) _MÉ0šòhÁ_<±%å;^u*·FÏ Ìv#ˆÆŽhÉîÔB¾Ù×zlPzÝuJ=}"GÖK“öË)¶lÌîe²ZP§jAHx† M~(â6H´h-kg”üÛܽµ‘õçÉz)Þñ¯íÁª-gG‰Éæ`ÁNÄ•½^’a"Ní¶àGpÞ†£l‰k=µØ=!ºË~³/ h‹éµætòR”ŠèJñÇý™p¾Ç³9»õ(Û‘{„[^>Ÿ)xµ«‹£öå:Â0¥qX5kµÞ: l ú“馤Úò6(zØKGâ çºX‰ç¡^ÒéâÊGâ¡áÈØ«ô.’µÔ2‚ÍÛÌñ:LQú!eTÞ3ÈûÈ g× ¨¦ù(¶ý>~üùŽ2¸!w= ™’ÿ~)ÿ[GÌ*hè9ðâ^÷ñ·¼\]È-çó7¡ù‚ÍÇCïÕϼ´ «oái‘8`mŠhɰ·NPôY¥Ý|')¡î™~fŹëŒNÆôÝRNä'2' AjfùVUÙЂ.7fd?Ëɉ üá%> ß4¼­âÓŠúŃ£\ûI­‚!½ñÖ-Ý…£ )L뇟Œ™\¾Q68?™u[d%¶b늞Q=ÍS®H¸_kJ<°˜É[å2¶VYâBÐ|ùrG*øá¥PŸ^ç“Ùãz¿b´ÓŸñš÷P7§Á';s#¤¼³Øòžhf9âí-¤nªƒ6ÝïÜ;œVm< Þôä“Öýpæ1†Ö­ó«hqmR¯²KÔùcó¾û¸ZïyMrÐÌýU]Fv>w .Ì·"¾·ÐsíW®øÒñ]ß,q¢1‘êéÃ3̽¢[¯úMDbTíÇø$b>ƒM¶YœYø )I¬f¹å¡—Œl²ÉD9á±L³öOÁÏ÷ m¶õþ{DýãpsßP¼,Úh8Ù¤ÂÛ ¼Ž†«¿. ÍÏ]XwÌô ¾yßWR‘kqÇ+„Ât[4Qóž8£ró÷¹%™pþeN¾ÑܵL§úåäh ® ‚àÓeg–éî¢óõšå›/ÞxÏñúœÓé{¸Ø{S«ò÷QÄ“‹kÊPºaIeàz½`i ¢¦Ç-Ö?cã|¦Ž¾ÑÔ¢&ЏWChêñQÛá¨a'êêù—Ä¢qʨ…©¤ÍþÈ}díO~Ê~ÂæÇopkJæ(Šr…ˆúôg>Bþi{ØÆè˦;ëÁ®ÁT ¸ýâ³²œÜúev‰·Y\d%x cŽ­ÇTÏ,Fa)   À„þ,Û;Šg-Ò t¦.•Ú1ÑèhulÈ›<= oD Ën—2bÞ ÇªÛçÉ ³96Ÿ¡³]dIHÎÌŸÈq¼/êRªú¶–®.¹¤ô8¸eÏD)&OÈw8Ǹžî+'°æ }#uSÌ2è6C*÷äyeº¡IÈÛĸ"%ß²U võ>|ô& v͈:‘£³[Ã/*Sòv‰Yò[ˆò;»ïs g-7ó= –5›ìá&oÌ'óÈ|ÌY@­ÁÞ[KÂMޱǓàSNÄ/ãÙiæ9íY}ósP¾L?»Û´äš¼à0)ì¢H’žFÕÒŽ¿²Ü4©O%ý·¶2xžñGÚ£ø)φ%vTè¨-f¤$B ÏìEVxUú iì)+A¾oeŠ¡–ÕÀè²mÊG’c»äÈ8h°¬òOWš!øxãp (ö`K™Ã–þ#2Ë`hì×|¶¡HØßüg°|mxš¯¡r–oWŒ~j)~ nvaý˜#öã‹­“ ¢kjúÊKõq$Ø+S}«>·½dè÷0[ãeü‡S~°ª$f`j>m~í=áDZ¬W¯u½•¿Ø¢I5•6jƒ»üÇ8Äkð·±è@2¸Á£Ûؾ*§{¾bñi¢¯Û^k8íz%s¾zê‹YÞõ¨•M$ÈrßЭÛsá­šlƒe𝵵Xy58HåÙv7(. Q×u¦/ÇŒ¨d1Û¬Oà=ô/¿‡›N¬SB$y©ü Û#Õoóp5|sðZµj@u‰#Sµ+±d({ ʰš¾þšÏ·§' ‡ \T† ü´vƒŽ·Ì uJÔ›©š3°¼Ù…?N˜§QË/9ÉZ!,}‰‘)ÍÚÄ’Yþšôº2Åæ†Žñ8ðå¢N»±`3©ê™bE ‰î›øDN î”XÙ{#¥ÍzÍIŠÒ‡Ô¯Fª,\¿ƒØ§r(±ÝÒuC|·í|Õ«4O•Ðác/7ã?U‡ÍáŒ$3âΧH X$L¨ðF8£ÉÞðöE¶¹›DÍÊ£gC(ŸÞ§$JÜüä{àQÀ])Âp]ì>ØÜ/¹|z߃¥ ¸ý8àÚërÔ8”mGéÙöX0[œ‡Î¥þàJ»‘º0m·ëÿB ÿ#ºÈ0ØÿÁ¥}Íéˆ|fnãuñí¨’ }ù)¢ÓݰX^q™õ½kõ qwvÄè£YÅ:MÂeú7Ÿy 7œ£àKJâ7[§8î ä⯬jØ•GmÙö”ЦÖåûÚ¤Îb%?$²dm”*äzâ8*Û.ÜÙÜ’§'ç3“iN¨%¼ç‘îJV<(Þ3?œYK‘hF»~8QÕ{íÞŒ)μçú—šNÓym^Ùçkø1™p&î ÇäªgJðGdÆ„I£áN?|g¼ŽF0Ç—¹/2=.7ñu=!û[xþŒ°öóÔ”é;]›Kü`êÓ.|#DT´~P ±(ãøbwa¾ÉIµÝp ÚéH­kS(;·Ž@QD7Í|>A¦œÆP!üNËn-ÉìJ‘Ž(¤þX³°yùNñĦ=QãõÒ×à'8å]ÆSPt ßEÕrÊgÙ¯§,™Ð U*cËÉ% ú…¼ƒÝGåìÐ?”¤q1­ó²hÃ…—¥ÁM%“Ô¡î7/nÃv“…9•óÛ¾k”‰—¤§VéBïÄÈ©†«e®ý„ÄÖÅùÆ÷Fvµf”¡dY4±ÈÉžý!üƒšöLnÌp†ÀK"udcŠZgFJrˆÕ¨LÝÉÄØ+Ö¤…?ZÕ›k¸Œ®§›È‡u¿ …t×Α¬Mh#üœ›Ãìßµr6ƒÂÚªèÃYè&CÙ‰;{Y~3¼õŽUqlðÅü=B½uà:–Þì‘M‡$mÓxqßÊžWïô–D˜ rª’ÙÑ\ς;þĽÊéÜbÕ)áQ#`Ò‘Ä[Ú^ûÀäb¥¹†y¨\‘ízAÄn{ÖïgLsq B!"ró5͈ht¨`L†í¤±ÿÞ<_h¡#û€Ó£§zy‰|”Ñdø‰ᢋâ¸â­¥èM}_Eͪ”v)ä•å_›ýioÌÁñe8«®©‹cŠž;îÒFÆl¤LÒ@Qå2;cô#Íž§*¤ˆ/ã’GžeŬc=6nÇR޾š\ç^Ù¦ƒ¶§{¡×esRQ® _Ècaì‚jéc©BŒ‡sÿ;{¦.0FL3V8µ*… ˜óq F­†•5Î&áóÖ4Ti~yëÌZAt[–£yøË N/çvûÐuuÇöVä…hTÏ#”€À*"¥T~žÝ‡ÁÜÑo„ò_<;ñª!àªêìHpEÐÇÚÛçÁå»FJT˜óÜqtÉî>/" *bx€Šé;xïkT)&ëÎ,/±A>†æ¡;R°3±Q—šzí ýê…òuä'þˆÚ >ކáÐæ9ý|XU$O?ø*h˜c§%=^»Ü–>³‹pÇ ó àŽ~M–,Ê—&Dóäq6ƒ:Wµív9[s®O5¯¼Ÿ¤«g—,^?¶(•acª–5}ÁnÞ¥ë?¢³›û`Æ(µ¡ÒêS|a¡>{ lcÏ–H«;牺5µ"£‡½‚›Ú¾ÎûW×Ý69ñ"èa¬nÇkµ"]uVŠ:¸4Ñá&ƒÄôºXÿqÅO£³\¶¤ùÌ&¯°2¸›±ñãšÒÍ××ÒKø¶Ï´®QØjª1$³GØg[$´´CŸfþš‹è­ÄÒf®]#Õí+‘lÊŽS*ŸKáÜôXngC­ ­ 7èþØ’*°¯Ø/óe“²T¾YöþYù,-A3ëÖë#;‘\O-\]ƒ&³v>÷Rdz´ôèk[ÿE¼/o[h;Û&g‰§¾ %Q°vü%ÊÊ<ÚÕªNÎ+ÄG&ETަÏÃøËÜä etª+x¸¾¶Þ iáJùÏ0þ“Æ)iünÛ¨L|“Ú¬­¦™M_í'·U ÌÏóaG†wrx¢6NÖm.L·œjËÅ\rÝ‹Œ"Hžà7¶–YÚê¹~4HCFײR ŸT›íÙÊy.ƒkê pú¹ÓÏÚN2Ý}NïKøÚŒËl#c$É×QK›„ð­M¾áÔ'ÊE„|»ïNíæÍI%ÊöôX6cõåÅX[NqÆÜn ©ÀÙÄúÕ*-Íê2fŸnê†uØÆÆ}Í'¤rlE…ö~©†¡sóÌ9 B¨bӭǹ: HÄl«•Fõ΂Ìb~·‚ 2+VFÚKöLçúæ™hlµÁïþ£h<õýkt•iøVT~Ö=•¸¨h††­æÞÆ„5ɰž‡ûÆ‘CÐ2±Pá³lÒÝ+³OÆë¢R«Å£¼ø@ÇÓ3Wo³Û-¾œßüÔî©]ß–àZ+§Pèãxo–ÎÕ¨_vÿÜnÜ¥9§÷ë’ÔO|*¿‹vûû*ôÏqqŠªæ+×6R*Ç•îÎqi¯ÕŠƒã•i§sâOŸ„æˆUú‚q§©ÕÒ`Y[r÷þRß’%’EBB†oTÃ0f¯"gü›ùÂ/¢h)IxXäãHŸ|‚\3;| šÉ‹zØ«ÕÇú„q‡zÙª$Ä7ºÚ±œü~|È=ÍŒ’~AñUrn„kû¨å\§F åF{4–Þo?Û¸pˆ8–mÇ Ë …|pê²þ1I8¿ËPÚÇÄUB‚uk°«¨%Èeç§Ž¹z&ªÇ_  êÁÍ…ìª9ÙŒràDŸ„Â>N(#úv„“I¹žÅÝ™I4FšP`‘íS[:Ê^7ùÂ^ƒ¯Éhe¥çæC£‡Á~Rd|’nñ%ÎãPgóW>KÔ‚y”øz^óâÙßT ‡áfî•ÃL 5 #Ó\)JÝËÍ–b£Ðr> És±lñžasò¦Âåº}ç#Ó}tBá9껪§)"HZL:–¯° p=ÐïGá÷MŸø#Ôø‚'tšèZ)§n;àá¬k°h5v¯ÜÌ«¢h~ÝÝ=-æ”ãÜ¥I˜”O+f¨+aGùq;ÒñFÊð3ru¸ ÌJ”tŠ]óbðX»çN±† iZé=Ô¦)§êç&Rëm!ľoÏ;rêof[³.‰“ÁÐø\Ó÷.0f'”Ài¾ï»H¸ÍÚ„ôÓ%|ZB ¯Â¾…Q¬á˜Á’ê¥:ªApÏçA]Â#‹+Q»2L+7dK49ÊìYe’–ïwÅ_Zº]Ì6 ÎÓÙåÂç~~K(HòØþmñ܈Ÿ Ú7 :-Xè^„aÙÚ˜œ6W^°`d9C_¸6G^Òýþ‡ùÆqüV«¤Ïhdr騡~¨Û[ÍnÙRr¼ÉtÄ‘Cå}DJñF¾/"±@¨Ù˜ sütÑåéžö‚`Ï>õȵu9ÕÕÎt·~pqñL¢‚B¢ð( B!?ï…]½Èߎ»Z¶˜ejq¹§JXÜc»êý×c»ã"-M`YãinLž zHACþ¢;—æÅ„ ”Îͼ™ÔfÓ÷Vbé¬Äù˜=¬gÐá*þ4éŒ%8^!Xš$LÈW=K˲¿ì ,Xú»_ð³4â>€q¦VSƒ?"ÌL úCZÏÍ"|2ÒÑSf þAMäã9ª½wBxbw/DÙ%#´¼;ëÅÅóEô§¼êb>–Ý´TÝi….Iˆ ê[ë–¯Ù°Q?é^Ð㨱ü'"ÍdtCHIqNI­€5oФÛµË]õ|A¯äózÙ_þþs<Û=‹‘ëºã‡mŒü—LkQ,Nm ¬ÿqJeïÇ„½¦Ö²D8Šéî÷d0™íØzXë–ÜéóëJÙÄ9•ŸnÂLGÄ,Æéi¾Åöv•× ‘/Ñšzë|ämkþôHVcdQ…†[:·®œ¾ëñbÅÈÁÒœ¬À½2ÁÁ¥RÊõä‹°‹8´Ïê²8ÕŸqïQ£bí§*f×r—˜rË3P– ìô‡ÛpÐÍ~«Ê³aϯ\ø×Ãÿ,^®R~ |曎%´‘qÏ'¦Jè›þþX©‡sjì°vÏÈ¿‘}š´Ý°ù –ú}µ”‡^ƒtÊg–ç¢yó†;gž‡xª×+\j”~ÔÝú\ƒ1ߊW9Ä;9©ÒÀª¿û\9ÎòÇ¡*¬ŸBSŽSËC¥PÕŒÙ÷üð÷]%’½;»,!´kÞu¹Žë¯‡yæ¦e…Ò×[Ãܘrå ùÓôï–¯ws“tƒ3,#‡+x9—qýÝt¯ï®ò”?¶•RëSÑ7Œ7(Ÿzt¾(®ÃÚÕŠ’æ¶kk; Ž@'>„Ó+±cj»áÅ~p¶Èv¶j»E•HOxý`þ™­{˜} àÅw—ãYìúPÏš‚àúϸ'šz#Hõ¸Ë'‹_Õ™ÅsØLlé€M飠ͫ…ÿ¢ZeJuA;]{L(‚i†q+l í¯ýÚ®Hx&–KÑÕ±(8ÖàM 0Bj´B‡`,š{O·¢•4†jR8Œ7÷gÇÚ¸ uºâä‰WìW ç®ÒeçÉ•zUÉ$xÝñöó§÷zYÛŠRá&öëR3"ÆÉ*=ã‡cÀ×°_(ú\{2…¹¹P:ÉÒÞ|’PÌ¥Ú”n·ht,„˜Æ®orôÏÀ£ÜÞjÇðº}x£å¨ÿŒg0ZdÃ9e@ônæÔ[Í®Vbº‡ñ‹åW(’G±²W3Ž7LÀ5Aï–Tzý4Ñ`J¼†„xyv[¹÷[¯:ø79è^"àSîÐA X-”0‡ÿ0Õ«€»Eïæ9þÆ89?õA—Ä=„û-˜Xc9÷—ò¼¶.kùc•ÃgfŽŸ¥;n‚Ù‡kÏå±Õ61HºðØ‹'Õn` 1'_¡ƒ }`r®6­M°}&aG€]™nZ“ªÁQ¥sˆg§oÈ_¹Ã™~&i¨a Žå¥ O>ø‘@9K,­®¡×¿±UZ"èv5)Oßk*gòžçƒDËýdµšöxê¼WøLŽŒDã»ï Ä›2Ÿüí€T:âÈUi;„øïò`4Yëo‘ƒÑ-úªôD·6‘˜_u7¯Å#±·ñ æ©ó¼È›éè&*ßðdò"¨˜\Ý{lce} 1x,Xf‡yÇÜ1ù2Ewq^¿E[·Š\$hB Òʱ‚Aa|øåÆÑšk2ýµ§õ[I\J¸Â2iE_ò*–6jÅÈöïGx«×I‚3±îÀñ¯2Ÿß~HÂä¾Î-‡†é&ÔoÏ[Â}Ýêƒn‡ÜÞ½œ/UëJïsC?£'Z²ù”š 2ªöc–Hê­ÛÞ&¡Ðhì"£ŽÄ,)Ç•7û|’ÍÛƒ/n¡Â,´]÷ò˜-Ë /F&‡ü~¹‡F Kq:üèÊ€Öi"”«•–ÙxS\µ*ù½”·W‹ßïÿ£½ÏëóoýkBeÂÓˆDrŠ·Y²ît¹lƒW/z¢ûeý1Â7&ÍP W¯½kG]£<«§°º¨7&3¬”:Yß§ †ÚÂßüLJå‡ ¹Mh©ž%ÈÑܾ«ÉuÎômfÞø¢™äsVuh$¤áŒÄo® d•ÛsÇð;)¶îÁn?„¹Œlo"·o«Ì¤ÓäJ0ŽA/E•I~ ûò½E%§mHBÞg›VSGÈpgªTr6%(×*ö×x|”b°>Ë·äj†ÏÉÉ]‘’r8˜s6½g܉ÈÐûuU‰ü .×2¤0Q^ŒÚ0!wâõ6ÆñGvŸŽ")¸7^à¼úí0ÇÆu4\ÐkHìÅp&d„Ö?ÜD_¨®,÷7™Qˆ6Ð=3K|ò#~ÙDž µ’×08v°ŸC~Ø™1y\¥®þ2æe &'¬€Æ)TÕœý«išÂ’·òêûÑÏ$áÏãVÆ—?Ézˆ—%Óæ#;üw¶õ±‡T<÷sÈ-´}ÄŒ„Ú®ƒ¼¤Kàö¯‚óÍvMêÍh."#¾Væ«Zýhn_¾yÁ;#È1nƒ‰sÜîÃǨúíµZîhwðS'!©øåŠÝ¢°#™ìZ;Þ0JSa3»ªTÂ"åMç¦5³nm°;ø!òèL^!Ó?ή¢j-ÝÒ;¡JfŸ8¼ñnv÷Z¯ÚaÎÊq•maö e<áÄýrœðÚççþªºÍÞÄ T -—“8Û÷7ïo†lþ¼H$ZP¦§7ë›SÐ"àÁŸDÇ•~„«uôEê×N»b'dÃkj#ì•z¢ñœŽ¥r°Í 4ùÒÑìÑXy!¦É{Õ£€’„d-¸_‚ðÈ$µu“!æB–ÏÏ<ó©RÙåTÝz(åªjÒþ³ŸØ—$¶)wõ÷cG(ÏbÅeBð:iѹ¤ºr‚Mõƒç¯ŠñŸ½â~v#Fo’×Å`[¿èá/4mÓmÃ#*ø}ÝBÜñ?.çz ²îþJãƒ0ÿz¬`5t=/Lø6G‹$Bã>žB‰ª ùæ¦"È8é@¾P 8i÷1¿nÅtþd>øóv¼nôx¼Ý˜’ðhR ¾üùÄ£ü˜2qA˜+—2‚Wr°¶h‚G°‰ƒÜ€?šh8°årêúµ*€^Ž{ƒ®¾‚~‹ £ŽÁ~¨l  yzM˜Á:ühÜ£öª–ù¢'?d0a;”Úø~åQö» Ýï75­ )}Ñwò¯M)¬UÍvy‹öXèl?ûKê:óKœp¥×±ÑF³zþ˜ðån#QEYø(ƒrÌ5/i²Ä_™ˆÔÄ?üI-Yï$ßKR“Z1=xqÕîk!¢P¡†–œÞ/§ãÂ/4…“#y[9nZk=Ò³¢/ÒüÞa4…݇A{ÈÈéÇßò0´äÊQˆ8jD]×{ž édi )ö,ÙWŸýŸ|ƒü³e¶†K±Ãˆ!â-¨K†Á9?•r`•PóìAäNÖŠzDúë–SBÓ¶È– Ú›E'jbӡ߇-(þΖC«—3ô~‹9ªËëÖr¶{B$`ÝŒk‰UY’Þ œ€ªö]8bKŸ¡‡Í·‘ì²EAŒÍ@ø}¨ïLM¡¦AJk‹é âã jä8׺zýð«·7’;®Ø¥õÄ1²$ÅŠ{<|Çðý wR.µrTtòq©‘‘s.Þ¸Õ¸53`c:ëôdi%ñ§€½­ÏÁJ¦=X8cá(ôœŠ†ŠËÇ,øÉˆh¼NªM¤R<ºõúqŒ˜m\6tSõU#O§†ÆÃ,Όڹӿ}¸™ÒýÉÇ&j“SZæ“ò&¿Ó³Å4½¼ª¯ß<qlú$N{Åp{lºw(g­që’GÃ~À+¤ƒàä>ûT·Ê!s_u–ïfè 3tŒd¥(YZ›jÐÏKØ=b𼚱êÔ†ŸçÝΓCÔŸžðËÈiÒÆ:PwÉ'Åa¼qfO€Ž!¸¯Ãç".hñh¯MY,âJº"ºvüqL¿h&P€ÖOQO”Ú+ßSf~”×bÁ›ô¡D`»I² _l¦³â˜¥ê§–žŸªõC;Kr–}ýçÒÑšM¡¿1þñ/+|—sýãXk SÛažy…g§÷N¼q£èÆ1d®¯Ë,k€®k‡lâ- âbMç†å™X–ÞØ¢÷8ëLbD¨ÿ«Ö7ô|†G\èjŒp±¯%Ì‹ÑÚÐÕê6W÷è–8,Å–À¬lkÄŒÈìWRPŸd–Îú{]Û^Tk‡AaCh,OéßÀ›"ÌuƒgB¤«'¦·Hmº\×Vª¤F†2\ó(ÆÝ)=1œâ˜ÇüøaeJzù;6µéÕ9:=®U¹Ë™ÄQfê¹€%‡%PBc^ÍY‚²}¡Áj– (˃N~í "d,¹*G/^sÒžqÿl³¨èȧ†Ñ$óCÒs¨ñò¢<ÞÃr'¹™;Óó¡/L}Šz}AW+MâÆ wFè_§¶äÈT Z3z€³¦(óTŒäó®àmjÿ„}‘l†‘DŸÙ “Þ¿*ˆÈèÈ7bøx93^ó_Ij^¯5‹ÕŽD Í8DQô¡¹ú&ðz÷®š©ñm|ìÒs endstream endobj 107 0 obj << /Length1 1700 /Length2 11195 /Length3 0 /Length 12284 /Filter /FlateDecode >> stream xÚ´PœÛ-Œ{p×ÁAƒ[pwKp`pÜ=X<¸;ÁÝ]ƒ ®Á‚»?ŽÜ{Ͻÿ_õ^Q5|«{u÷^»»7-¥ª«¸¹ƒ)HÚÁÂÊÁÆ.PÒ”ã`°³s±±³s¢ÐÒj‚!¶ ÙQhµAÎ.`{0$œA&W›¤ 䕨ä`wµpp8Þ pð °³8ÙÙùÿEtpHš¸ÍJly{ ­„ƒ£§3ØÒ òZç_Ÿ3F??/ËŸáq;3ØÌÄ d±Ù½V43±h8˜AÏÿJÁ d8 îîîl&v.lΖ"Œ,w0Ä  r9»ÌH(›Øþ–ƆB д»üåÐp°€¸›8ƒ¯[°ÈÞå5ÄÕÞä x­ÐS¨8‚ìÿ"+þE`ü}96ާû;úD`û?ƒMÌÌìMì=Áö– °- "­Èñ€°LìÍÿ šØº8¼Æ›¸™€mML_ Ý -®0yUø·>3g°#Ä…Ílû‡Fài^¯YÊÞ\ÂÁÎdqAùã|’`gÙë½{ÿn®½ƒ»½÷¿ØÞÜâ殎@-{°“+HNòoΫ å?6KÀÃÎÎÎÇÉ9@fVÀ? hz:‚þtrüa~Õàëíèà°x•ò[€^ÿ¡x»˜¸gW¯÷?ÿP88æ`3Àd ¶GùOöW3Èâ/üÚg°àûëøqØÿøû÷—Áë„™;ØÛzþ‡þg‹òÚ JzJÌKþ·óÝ;€7+€•“‡ÀÁÁÉ à}ýðýï<ÿ¾©ÿÓªjþûtÿÈ(goáàÿKÄëíýKˆÛß“Áð÷Ú0þ»‚²Ãë<ƒ ÿ}vv³×Žÿç%ø3äÿoöÿÈòÿÿ=‘´«­íŸ~†¿ÿ¿‰ØÖóoÆë<»B^wCÉáuCìÿ—ªúk¡•@æ`W»ÿõÊAL^wDÜÞòuÎY9¸Ùعÿ²ƒ]¤Á sU0ÄÌê¯YúW3^kØ‚íAª.à?Þ×(vöÿñ½®ž™ÍëÛâòÚ²?] ×ÍúïºRöfæ¬ 'Ï[€‰³³‰'Êë¼"€7Ç뮚ƒ<þqÍÞòxÕè °ppFù£±oy@ñ?L¡·à»#^Pæ?èÕ§øÄ *ýñq€êÿFü¯>“£?TÍÿ_³‚þ_C-þ¹@Ë@nÐêßûõ°VžŽV¯/Ö¯6ð? hûÈÚýr¼süOºWEޝ“èðÓq¼tþ|¥@þ_•¹þ ÿ« f®ÎίïÔŸÛòÚ¡á?EÈd†òsÎÁL0ĺ&¤í¶JœÄugœ“ûÍÀyä%’ζ‘Û®Z„ÐÝW^Ô‚x×̯¨»uìCÎâ—F]|vÃ5Ÿ”(üŸumð¦[,>“ØÂ÷‡.Š®œ¿:;ßsÙ›[âŸ4©¹_ŠM3°8í̦ïËÑ5UÜ|³:A¤oøÍ†3…HÈÇÇ…Ò.žÞ^ñ®Z|z¦CŽÆå\lü(žLzÿ.¥”“gs`±”¼‘BrpðÆQá2ý@äë^Ï[bãIÀ4íváÆ Ë¶@S—ï¢Ô‚rÛ“ç²çÛ1rê–M²ƒë°ýɰë_¨Nבųz=Vÿ¿¤%Ùfœê$¿„’iU·ˆD-óÈqŠ14c +OôþX;ú¶ÇïdM4R^£³¦´¯ÖíŠ&¡ö\KEsV£’›J‘¥ýS-Vôje‰꼬œëm©k>tñ踱/v«_^MÔ&ù·­¼$þ«ÎÞjê1%ábD 6Sìó顲-bÿÖ72äÓh‡%¿·sf¨(òH°ï³JS&r)úʵL{§jÙKGL°¸‚}2ÜʸØDìïhÆ÷gu݈™t¢]bUážÚW [é>k °õ›PðêþàñöCTJñÚ•@íÔÜÀH¼².L è{ ÛHE0D™U´úVQø Á÷Å$M!náÒu첈«6Üb¨_þVöð+mlMîîIX`FªyP™ EÇ/®ù)[}‹¤e?1^ —ü¶³ÎþÉéølÑM0xv­[Ÿ]œ®Õ…æþÞ¼ ÌuÒ£•ò‹Š™†g݇-Aýæø“ñ‚̇2<‰R%~º†A^B'Z$&áù†KÚø§, $¯¸‰j`:Ss6^AA‡"c}b¾08êèqÃ/«‰^;\èë~Ö6@ÓB'àóû>¾½ƒ X:¿å§‚àÙ$»Àïl´^Ø’~f¾]hvÈ ŒÚ--bôŒc3ÂAš:Èz™1´T¶Õ8;‘E]¾gÈǽ§˜²¦aûr‹#±D0,òãÖÜy«K/Ç«‡+aL’ØŠ‚áa¥Ô3®D´´réÞ¥ *ÌE2„RÁMÎCЍ@z{;óèdV[¤]ðµñÐwu°OuiTŽþY]Êj¹eöœ´5ÚžÒñ8ÏÜÚmë$KŸ' Ãy…žÔ‰T³(®2aÂY¨Ì§Ž¿G@ûÐJ2šêÒE዆ Õò 9Ø7ÙV ÷Oðý‰ÙÎTúi`qÔŠ ûÓÖâ<õ^zÜgЫ@ç8' SHĨr>ó4ðöSwZK€†ÉÓæÚïÐ>˜ cåË{Õ6É&°vÍØÆ ¨žÔh\rˆê#Ò[2òàŽ”î èWYadé%8Ë´S&6{ø«g{­ Í2öêLê-½J+Öˆ&¾Òˆ}4àCÍ-ÏRßmºT½¬;Ó±ªëƒZk÷2ÆÄ“[ÈéôZªÝû¥8îC%!UåîûîWz{Á~{ã…[(·š€ë ÂW÷öKf{‰?·Îë9ˆTfm@²I-ËÏ }D"=B¾ãvE€ËNM÷éÄD%¾ùhNp[lc¡°ýˆ(‚$ÃZì¶°H—ÿþ”]DôO¯ežÇÈØÄùhè?.XFi8TGP¸þEYos(hÕiGLWø~Z—d¿EŒ£°;ÁK«wB•Rc• x3æ’¤Ð8ó"øí¼^¿3QšÞ @?:60sÂ|÷[?™ètf”lNú¸.ÏYðÃÓ€ãi Š”MϾ» ¥_|€­Ô ýhÙµ60°'ÍltàœÀ5‡_S„ è*¸ªÃ*RdÃÏaô¿›á†Þûô]Õ3£Ï*d»ýÜùá›)ÿHÓê²z‰sH+-»ñúÉ ÛVۧߦ|}š¹)Þ‘,ªx®Gü¨p´T(iØc} -X—†A ZXrK^ÍÅY?·-î6j\vñ¡:éKR¤Áî2tœ#¦D’BºŸ1®&eÇo:aÝf¦ƒÎQEt“¹ÃÎ Iúgè6¨ nZ\çÃN9Í=_@6ëïãLÉ9ïüO›íd­#8|žZËŒT9ñ}VLø~ û}ýnS£ºqÍípWht¸Žù›tSXx /ù"¥À-m&6ü"ó¢lxmiŒïV‹çC³Ñ4új÷ãþ%AØndã~$Hà婉c&Ó´æd!ÿ勤q8ì\ç7ö³ÝÆmû\õåà.¹ëŽuž` Ñï^…`vÃÃQ¡Øïá*bÌ;#ÃèÝcvQ‘Ê ™tprLjŠ Ò?F84œ=Dn¡'&`Øs1ÖÑpîñ‚™êBo:,ŸóÒ>¢>½„tPÖXÖ½  ·èuªuo€Ì§+侟}€Ü\ÑÁOÁd³QC=1nê}eñúz×ï5Ùø«°’–ƒ21j0»¡ª6L‡ÊÑuâ`wi¢îÌQ¼¶åüøX…#&΀j˜ÑøÒ°ñ¢nÈ^5¦Á>ñžíİ|Wû@5»Vts"iqK¹¾&ìW¢6»%ðxÏЉü!²×¯X+ÆÅÜÚ?e$Þ¦LÕ’t xJX+Œ0‡qqýÅÈ@ Š<»¡;Ñë€"Mó„…F»dŠËzìxéýZýåçL²žÍ޵Æ"HÈ쨚Ó÷Š£Ÿ)?dlÌÆ¯7޽ó3}ŠÔ[î`ž¡1Q÷ pÝ$Ä­öh0xr<ùEøÅùø08FoóÑ«J‡""r4FT†ÐÄÝDE£’²×Zga¶šcµm\„mÝLW'ò aø†}j†zõÛh½O׊ÐÑy‘Ê!â¥_U¡ëÜk·k܃µÄcN´ó˜W ¦ãh†$}ãÐÚ®d®÷2@Š>æ#Æų C)ãëÆÒÆýe9·8ìm’cÞ“ ,…¶Zf—ÖI¯lN—³~øâç†næî}ÿŽŽˆq{Ç{MàÜÏ&:Ý—O3Ã+9KšŸXÄ4ƒCÝËPŸoJfˆ²Ž«J½†Ú¦‹Öñ'¼@³7H°+6qfÂ^ƒ§W&Ûw²Æ³Æ4I×Ü}X÷(QëØ²?e Óô$§©‘ÇÝqWR&Ó~XDBþGåÍaؘ:º™JßÅFê &¤e”9Þû0áÝp Ï}½D.gzĄ̀~¥»xòo›¡azM%!1© ˜ŠvU> ¢²fѲ½‹o¡ß;šPœ ÀúÝN…Ný7"kd14É3?‡#玪5”ßðôH ¯2F PRÏóAƒ|†Æâg,«Œ”+æÔ`šp®–ˆsŠ3ŠàÓã—ôµÄ;?Á› ‰ŒÔ­Tœ¢lh‡*e¯ŽóxAža”ìN’êÁÏíòçª ÝÁvÝ{½Š£E9×f…JSÙ6"q²rß°E.¤F•ÕFz§PÀ|ÜeÙSZÙ $‹ˆx#l4ªÐ è9ž/ÌüR“?°95û¿7 ý’¨;ý¤Òü!¬v§búöÍù(Ë;áp¡S±õZNEîÃNØŽÙ"{þu\®Ð®Ó²¯›×…Bž‡æ;šá9 O.Îeë¦}óO·ô+fó>ᳺ™óm)c •îù ¤aQé­uÊ´^õç(C¿õûgÄã¶šš"ïá ÎÏÖówÇ%¨ƒÉŒØ¸¹Ž[ÙÞßþâ´û¿›¸!ÑÜfXÝ¢ºRAUn¿Szm™¦³ÇbÕö"Èùîb*å0Áwœu=‹gk5¡Óoý¤Mâ4w)sÄ»ä‡á*·YìoH>µåå•úìnlâ]éôÊáëbNóNhùµ»2ê†W?¡2>‡Y–*w•È•=Q˜0_h¶Ç9€zZŽÏ/ü[Œ™÷Þ;ô"@ÉøryÑôN,ÆFU§JiÞ¯*{½¦Ž ‰Âë}´¤YvFÄ ?¼}ê¥Ñ >XNõ¼ †×RA~ß—-#ša;U®8xü²;†`«jWˆÕ€p²Tê(fÏâéßCÊ=‡?æR="ÐVŸA°¬ kÂI}‚ô ÖâÎÐð¸Há ïÇ©©Ûú^°7¿‰.Ò:°†sË"½jái`!kôd(¨Œî)«\¡¦b$Ÿ}4!œ°•Œ”tQN¤Ý#<2ˆÈ¼ýÐ<%.WÐ$L}¢&;¿¡b6¶¦Vo%òâØtÇ'äog¼(jpœ·Ý–7á¯÷ZÑérÉM˜0—¬‚GÒ•½ÇN×7_ʈ³îðgäòX¦µ¢·@uàù+¨ÝWÚ©ãê¯Èñ8‚ñTüxD&-Åô–x¶™‰§zøŸ6›æãÙ‡ëjáløÄÐ#*‡ÑB¯«XВć{â—a$#š÷¹•ß•º"wmyB0&½ Ë›‡Š¨ >%±‰ö|›ªœ.Û.°]¡KßÅ%ÆŽP÷û¬ãþŽ2ï2îæÁÞ`€YŽÇ]Ï@Ö g¹¦]P‹jð+Åeðz´2a÷2ë`©Ýä‹a„i-³¾­-íÿlna–ïH„œRêX¹7Ú‰+o PܸÜj†}z?«7¥¸¤rV˜ã)_®ÏHÚ¥ Ë E#¤;ØfE/¬B^7I„ž~LñR‹/nÿa*L +ö3/à$ß&ÑÇþ—½ùa2üÇ2«woOj ­›÷I=¢§ELEƒjäÊãTB¹ÐV/7Uä‹Ooò¯kŸwcœ“g¦%a#ÂùÈmšŸ9Eà 5SàŽYîÕ õv‘åšöCjßIíÃËwÐ9·½7EÆ©RÑœñs’æ7¢¾-,33K&j™Ké0WÌ7eHíÄŠJ]µê?Z£Œ+_4aš‘)E•þü“hË[P‚d+g¦kÀbI_›;—B·™+e—|aOæ.³õ2&ª) ìÏßçLÑ!óAQL®F,™T¼õøR÷@y‡—ûií ªÒ˜øUÊŒ`åÍÂ`¤/ºéË×›Ž\ çÒç.ŒŒ†8ÅËp×àë’¤Õ¨t<õþ…+ÃaÒ@Å éçØ¦= KnŠ©n[`w¿®:,󤜅iˆwŽÕ8šTÎÇ žàö,i>|ä•Ù,mïf¡µ‡©˜”ƒ ÞÏ4'[&T®2׉>.}AÌ(P ‹”@•iÍ<¿`Tœ•’\ÄìYþqB¬¡1å@ Q1@.ÕOEÔþ|¸|pšê¿êºn€”‰JÖªZH]§Ž"/³™%1HP.¬AKšv_!‘~OC*ñ þiM{Ô4¥wÔßs¢ óÇqž³š´›Ô³ˆud³ñûóœß¹ õª PYÍ4`ý}žS‚|9Ñ *]µŒ>7+îëýFDMˈ(Û}!X.pp"a'›BÔPÏ%ÙZžKÒcÿ‚>Áð?#éÝ·XMHh8µé%‚.;} ÝaÖ·¨,‰'qº:¦Øw‰Ÿ:Ý iH$¬ù3Qù›OümB‚Â{%+’$;©GÝÌ™ìë­l#ÁVâmW2 Ĉ®µ­¦B+(9;C$ý¥ƒ0-þÙ¢ÔÄÔ@ÄÇøå‘4õû°´Ë®ÌMƒäâL†÷¶×d6~›ãçYS‚)3CbÇèvŠå¨ëÍzÚ´Þß¡ÆUJ)"_rˆº¤ŒoB8£ šå8 ¦Œ†ü6ð1òˆXaê*ÆDõÇ¿ÐìäpÇ 6•» oi“¬Ýƾå[N9ɱºJ‹)úà‘T¶¥ŒÉ7]êÉx(FçKË>©ß— <Œ3xæÈƆýŠuÐå¨ÓŒó(<~ÒZîài7­5N}ã}÷f!Ìùˆx«Ç4AéWÀÁVWIϱ·ÉDŒnøâ©GÙRŒû¤°u©êÐëX³’×ý0”Y`oŒóü•Ôy±½q x†.œ¼ÎH5 ¿{ÖO¨f}ïzThhg³—¢ù‚‰òÌÅ„éVZŠ4† ª÷ jÜP¡œNRÍšÏ<±ÝUï'„¥™å>çóÓš¥(ÀÏ;Óá×¹V‘¸¹ Ãúñ„OÍè"+ÂÁ²Øm›mQ&—·ºj Ÿ¥›À:pɢث±.å·ÂA–]Ž äÓÍ7ÇA/ ën¤·zÖ£z¨ü¤Î<¤ç "‰°^C³ bP²v%ŠáE^o »ÛÀ°·tDè¢ÈÊ¿³Ö–alÙ¸ˆºNdhŽ?ë‰j'Ÿ8Àd‚bDÎã"k\}ØCÕë™ú¸lHSD" §)´šP¿…”¨rÓ°£*¶úGzVj¹è1R㊿˜ÙÙ'?Æfç &~ý¶æ³†ÙÐuT]iõ¤/‡VÀÔQŸX•‚ƒV½Ãj}˜Á§ÜV Ân0V‹V1‘ŒW³ÛÇô²4À€'ªo¼*áY¥“‰€¨ââc¡éE\„Ñïò ‘0rŽL|èRʉàèÃ:ììÐ[>™1{ÇÒF‘º¡zSzô ï'û§{\µ";?Ë)®Ÿc’æ¿J±e{åBî7dÞæ&<-&²Ú‘Âö-í~g„³E…üḇõ2à <ìz´¨+…–—M?‹"äl}-ÿêeà§ÎS8ñM—¥¥‘T 2¤}ù”Ÿn98banHæ0O“«Qs·}c_~lÚ{—1}§‚,o>«À0¿84Ž'–`'¢z´0Ih00ñm'—Rz I¢ù¥&Á©f°([‡ÏÛ§)‹Ô}ýlª£¾+Ñý¾Nçþp¹u*ƦîÖš‘bDè]}z”ÆÈ‡ö©ê¥iƒtm¬–Ò3ú­¥Eú;í+Ì1š˜•3z$жS1Iʺ1‹UPB;V*Ÿ+Ùfœíµ+Êj³Q±Ï3ð#i‘ßGˆ°ß:^7ˆ(¶°d ÁÊ£ÝñÀÛd±•–íŽ|'¬©u3"ÿ€ô[Ô³¾¿ÐD®=ÂïêtMð8¿† , ÅÍŒ€~EÔì´w&P%Jƒ£ÊL®H†•üõ°jƒdKüÒT@¼ ï³­dà×HC,˜2¼± ûk²Ã7ýmÉ”~”¼Ÿ\bŽ*¤§ÎJ;(/ó–':,ú¿åj3­àlë´4² LYÆB¯Ï€y{Ôü»ç#z#Ièîi ÉÎ:ŠåÞ6?i1Æg£ÉËjÇÒ—Úœâ˜ù޽ç2\—O“ï6¸'·uç³HCUŽ7Æá¨ÅKªÎ—¡àòëÑ ¿Üt‘”Ãrˆøì‘ZÀbrá•{ ÿœUg9V‹‡£àÝ£Q‰Â1—9É¿eù]É /sŒ:´”}}ê”@KÇR KÌÀxëMEµÅ§n‹;‚À´‚Þır#w±˜Íõø¼”ÍÒ›Û‰EH Žõ ?}+ªÍ.ô#œsTç|_ë…ÂAkýîqÎéD Ž€nNû̒ј,²}s=š´@¨°1-­ËÂæ”:êZk+ îÀkÊâ£ÓzëØ]w!4¼lGøêà:˜rÉ»«‚Nø~–°q[ºïû­»^8G¬B ¼ÔŸÐk> ŽÒ¼œs8~€“ß?kƒ´|“kèÆcÖRí³}X*ŸU´ütt{ÿM\¾[~–•U2Ú:ºÜ´‹öüÀ‹—0;*ï»›9 .JöŹ÷b£þ*¶³çjÓrkÁ·¡ý3áÀw_#K…ëSÛH\­F¥kZé´÷³»cDôíw•680ËÊnJµ 7ìÆê’¼i0N§l½™0ÎV˜õ †÷ 8ŒŒCÕS8Žáåù¸?eYQû—‘×cxŽu¸ô¥üá´–jÄ÷[ Ô爘ÐI‰„ây.(¹XNÌˈÔë÷D[ ff<ìJ/´MXVÂ=_5$)#µíž]B<ꬵ„{5Æšègé>­dWçqìõ.ÖªŒˆâÏþ˜éýá‡^o¸lÑøCå}%ŽÀ%õý×SÆ€¶s¢dÆG“O•ßM‘°yÔ¢Õ}A;§ à7©¹?•¨stÌlèüçHì‘—àƒG.<8¡ §„=†¼‹Nš]ŠëY!Œ$ŸÙ.r©oDÏšñsch™àäÀ'…-eÛ"EÒgºMÑ! Ltä¢g¼ž!ìk&P¤Y#…A˜¼³àô§00ûä`ØÆÆH8©1G*Tž÷Î-®u0Ý:9ÿ!‹otN”wל(y †â½Çh$•®³ëÂeËà~ê3yÚ‚ÓÉ[3k"È3Ê ?ŽuªÕÌÄóÃÌçßw·›>4¿”-½ ]È¢9êŸV²ÆÛÃçÖDªJýû‘4û DT~*@¿(£Ù‰Ái~^Ÿ2 l\'Ð*ïxŒeÕ{ôÎv©«ïTàHâÝ;µ¦Óž]ª¸S³EµŠ€°IÃA3ŽÁçIH9IÄBí™Vv§{_ñ"Àˆ„x¬¤r…dzÒЊsž­Ã|õ~Þˆä\#j«rjÜEÕ áǑ̷_±n­ªoEy;â'¼YåDå…ÑjôIO™| „Íw¥J J§Ëf-GƒÚŒµvïÈ„&9âÏRÈÖÌ=¾·û¦ÏË9îeE­ªqðë>ªå*Ô(=*óô^¡:ÎwB΀à{vÎpør‡ê±Â6úýl* B»g±L¯3Œ²¸Àsœa`âéï)†3>™pê{ärÖ*‡¬ÎQ7ÆœÌ5Á«à`¢Iy7 ÛÑn&çûHl¾ŒíQ‚RŸ;ÈW\ã%úLYôT!•‘»Kä÷çlõü‡÷*txïp¢v)ªíÏiœÖº—÷ÄÌË ÁŽ®Ù3H ZƒgþšZ{ä£lìk eÇÃ’¢äÇm†z šõPˆÄ®½ò!¦q÷ÛÖPk–ôìþ:Â&o¼’uT‰¸zWâ1CWØ|ÒYÉß¼àt…g~2Î[ŒVžJÐ,·` Žêû-Buü6Áió\,ÇïcÈÍúbDÊË,«u+žù7ö¸N† óý­)Ç0ÑXǃa„•ÚCQÖüs‘JôT#iñ0QôL¦_+s)ëb1d!@^¢ˆÌ5Q1U<æìM6 É¢_lwÙ:×s—bbµ“lû…Ѝ Ké²]44pý:z²Ôšßò‰9_ô0žH-и5º…> ó-_#ò~¬ÜÔc¾J w^iš@¨µäkxÔ•f]Q×/Œ¦ÀB%À÷¥g0Þ6`DátS’›?Ú„Ú" 0±¤nÔêÏ”hp7à8E …ÕÒÚ·{iKzø)›@OØd¹¥0¿ÀIôN:ËEš„ò©µÌöÕ± ÅO3½0YXÛoåÛ³ðàõŸëÆ)Á‡Ýá/¢CAiÐÑ84¿Õ`Zjh<¡ÏŒªîbôJúU¶‘T„$ÅŸñõD:ÓŽÎ&;šYé'®(ÔÅ^ô ÃÂèè&íQìå‘@ÚáÜWì‡jù|Ä:S#¤r—ûÔ8n_‰dšúï?G¶˜£°yJð=çDQ›Z\FÖ']çI v)—ý{Sƒ–¸„Ñ·d̯- ëk£$4^«MûûèÎÂ7­þ®ÄtZj”—2¥ëí•— g‹.åQdxbi«®2Ã6nª;É.&,k·:Y"]«/¾V4ƒùÈ k§þÙ4±¯ºÖ„×j&ˆ~ë»ùÜ—ëð?þû»ÚIä²%1̺[øã«Ÿ¿´ºí¥ˆ]Úå•;½ø_Î{õlU^®bÜo1¡Émä–³Z>ûïÇŠóðéȶ(ÿ¢ŸJ¡ˆOk°A*zÂçÍÈ4žäXò¢Ö1ü¾q†p ½{”•ÈÌ0^XnÊÖCYk¦ïáuO0 y`?ÿz2«¯´ wHŠö[/a3ì/fÖXc$Bt3Èj+Ÿ§n ˜?WÊgŸÂ5˜µÓa+b`QÕ__æ*Lj ,²D\o[– ç… æ4ýóÄ6oÈÞÀ¾7<Íó/ù†uí´ù8Óú^)‡5-B+ƒmžÍÿʉãW,Ú|½ ÓOpÐ ´,¾„ýT÷Ï|,>E’ôͳ}eÜEŒˆ­£5"K\)嘖 IÀç¹–Æ b„Óù´ýëex ‡¡fF;.ªÚ2bBê¢<:âC_ýžwBÃjé½q¿sÜï„áŒý¬æ‡ø¾U~â\Í’sÛãHÜiv,^†~’êü•4N jgA4i0âµÕá̉;”Zÿþõé3àfû1Dõ®’–Ÿ‹gèGmÓÕ·Ôâ/jxM© …{msðÞó|Ìñòjg= ñÓ<ÖB…¬œ‚Óò¿Êí ¤§íºÜØV¸ˆÞ>Ê"w~$èÜ¥ô‰öŠêº‚%ï2󚫸q"DgShе*¬¤åƒ¸@Àc°œÆÀ[„tÔåA6¢óÉ:‹~ŸÔ4 q„³{c¹ÆÍ÷¦i‹/WÞm9Q…ˆé´teò¹Œ¨ë]ذnŒaîP×Э#åõcB=ß¾oRÝŠ"Ê*ÞÄ_zªø‹kbœõPª{÷d=Zœ©wÞi¿Árÿzß$¼é£wýó<–-`⊾ßSr9Tî{i>EþI0›¯ÝÅ>LTƒzˆY˜>-šP%y2⎮Ã{”aò%,ÓŽ~ç0)H\ånåt¾ý¡H3n?(SØZaÄÄ^9;UDB\ŠýÒ©If¾ÊGÑ)âhóåJ#L·å~ÒU- “U´Ïðþ}.á+n´ð•xÆWÂÊÒ’u¾|Mª)ÈâŠQi㜨ªeh€¢`ïÛ53îMr{Â…vúIÒl.…¥ ¤G ÇNq0±q&«°ó.kî©«¥T>÷÷=°²m-„µH¿ €‚ Æ€°œ4n(‘)†rwe Ö“Þ½ÚSWK;»S9óW«r¬Ûu*ð!›¡EâÃt©áÍcú×Ï)ñ$OæÌM²—+‰7 CcM„·jÞ×g@ÔyœglSâ­5Ej/0ƒ‹L·ë‚°8…€¬ƒ)|¸N¦<Œ(Edœ,ׯ-«mUCú[ŸŽprÂÂ}ÛëR–º+~â°pÀ™¨Ç*LôåfH±E/tû¼ ˆ^;ÏžB ¥Ç¶òÅméÕt~á.×%×›Ûá¼`rËHÀÅIKšÉfÐýÀòÁ³ïWŽò!zÒ¯Á©k6`¡>Å^U¾tPR“pKR`Þþeطדs̓«.>DsÝÇ#t'£ÕJ• ðZ kÉJó¿Ç{±hÈk;"´Xñš®&ñ(eS¬m*­KI´XÖáëT„Þ?O>2åmR„>q× w³9Zm=ˆˆg¦&\¸òßËýNK&§²×È¢YÈÕ §·Ô,ì=íS‡ÓAÂõŸ(/: RT¤y1´C¶ÌÈ~¹‰Ýñ°Õâ¼~ø®•fSˆî~>4·¸E93’ž¹éZ‡£=—ÛL–f/\ª££åC]þ®r±“¿ÄßÏ„kFÓ`žÍ‹¸KVr¡™2ˆvt+J Ü˜pöðslq!Pq¾00Î÷ƒUc·ðôOÇÿ4÷ endstream endobj 109 0 obj << /Length1 2357 /Length2 16691 /Length3 0 /Length 18085 /Filter /FlateDecode >> stream xÚŒ÷tZ× ǶÕdǶ­Æ¶767¶ÆhlÛv›Ñðæœ=ï÷ÿcÜ;2F²ŸÉõÌ5ç\;äÄŠ*ô¦vÆ@q;[gzf&€¨œª*3€‰‰•‰‰Žœ\ÕÒÙø9¹:ÐÑÉÒΖ碎@#çÙg#çC9;[€´‹ €™ÀÌÁÃÌÉÃÄ`abâþ¡#೑«¥)@Ž mg t‚#µ³÷p´4·pþÈóŸ*j377'Ýßîá/@GK#[€œ‘³ðËGF#€Š‰%ÐÙãBPñY8;Ûó02º¹¹1}qb°s4 ¦¸Y:[”N@GW )à/Êy£/ÀSc€#¨ZX:ýK¡bgæìfä|l,M€¶N..¶¦@GÀGv€Š”,@Áhû/cÙÐþ]3óÃýÛû¯@–¶;™˜Ø}±7²õ°´5˜YÚ â² ÎîÎt#[Ó¿ lœì>ü\,mŒŒ? þ>º@\X `ôÁðßüœL-íœ,mþâÈøW˜2‹ÙšŠÚ}ù´uv‚ûë|Ÿ-&u÷`ü÷åZÛÚ¹Ùzý™YÚššýEÃÔÅžQÍÖÒÁ(õùß6"¸?2s 3€‰‰‰‹•tÝM,ÿJ êaü[Éü—øƒƒ—½=ÀìƒÐÇÒ øñÎËÉÈpvtúxýSñ¿Ž™`jiâ 0š[ÚÂý‰þ!šý Ü¿£¥;@‡é£ý˜Lýü÷“ÞG‡™ÚÙÚxü1ÿûŠ5ETÕ>+Ñþ›ò•""vî/z6= ++€•ÀÁÍðùß(ÿåÿîK,ÿ}¶Ä“²5³pÿ‹ÂGíþCÃõß}Aõï¡¡üoy»n¨þ4¿.;“ÉÇ/æÿÏ#ð·Ëÿ¿Îÿ+Êÿkóÿ߉»ØØü­§ú—ÁÿÞ若ǿ->ºÙÅùc2äì>æÃöÿšjÿ5Îr@SK—/ÿW+ålô1!¶æ6ÿ-¤¥“¸¥;ÐTÑÒÙÄâïŽùÏ5|D·±´*Ú9YþµoôÌLLÿG÷1r&Ö;Åéã²þV?&ê3ŠÙšØ™þ5z,ì#GG#8¦þbagx1̨)ÐýïÖ02ØÚ9¸>ØùÌìáþºRv£ð_¢!£ÈÄ`üüqÅþ‹8™Œâ3€Qâb0JþA¬F©?è#ƒìÄ `”ûƒ>òÉÿAùþ‹¸>b*ÿA1Uþ 6£êôÁHíúÈ ñ}dÐü/âþÐýA:ãÿ"f– ÆFŽÔL¬ˆ™ó9ëåÿêõÿ*>Îoò'ÞÇÝ2šþ²~”ÁÔÎÆæ ˜?†žø_øq›ŒÀÿ Èñ—ÞÁåcFþ¸|TÅìËÇQÌ,]ÿã/µË?s|˜˜ÿ~´ø/dû¨œ…‡½ÅÇCðÇâCfùøQ2ëÀšý9ÇE›¿šõþ£_þÀ]Åø'6ûG,Û&ÿ‡þƒ¡ÝŸã|8ÛýúƒŽýõGì?6ˆé?,>è9ü)ò;;g ©ñ?jÆü!ýGE˜?þ91û_èú °˜;},è?yÿ\ÊÇJct¶pþ£è$ÝìþáðÁÓåO[|døûåu2±sü'¹Rºþ~wûG7~ýÇX>²zü©Ä‡«'Ðñ_)ÿg;˜¸8:~<œ/ðÕñü÷+ ºMàVíLxƒ¬jƒÚ«…ñÝè÷'ùçÈ÷5R©é½V;\ž “¨«26ï…“FzQÖvŨî„V‰^½N[ê¡CZ”Úž½_ â”göÛà–§±§ N…ë>ÁЫ x¿:x«û[ƒ·€vI“ç:¸p!)æ£?ºõK¸× ”ýÿ¶¸¯tPÅ!ÿR6K¥©ë_ØÌ}C{šZûS¤%Z377q‰|…æ¢~ýƒá؇PGZS9×hy¯ƒíˆ;­Ó;™ÓóÚ)ÏQ³X¸̵&‘õϯ!>rP·\ÝÞV¥d5^}VSgösîî*ƒåb¿\à  ’ÒQÐ Ò9ÉGâîjÐÙta«¸ÛŒA`u{¨uFpWÅÕ~28\¼±çk§rÉ<{º¹4xØ$NI±£5Y™ÄkcV€!¥…Ó%pæ,Ž”ÉÔð<’ Iÿ4ý!4Ó&~:!røÐcP–÷lŠJjN[ûtÊßt$p1¯bäÛÜ”¢A.‡.ɮŸºË§];XpT2Š…/6Q¨36I‘%ßËv´ðp¹•ŒŒcaomÖ*¯S™IŽ%ò22z]%Þ+h®œ&SZ§6˧2§ÐÜýŽSQÈW¶£3NЗ°¢WMú5u\{®G{ÙcÔ}¸*²6¤fÈ_ƒâ³NÜÜ1HZÃ~ë/ 7A[°¢ÏoŸÎ¸Í®¾£»E+ƒ×ɨÜÕ1I¢†uÛƒ(ý“ÇA·˜‘9¹¦9÷/Í XZ?R0ÆÎÖ÷Ñ+bíͼ˜>w{s•ægñê0VuZxOM3<+ ClŒTË̃É´¹×_£ÐXóÃŽXò"lÊ¿|ý"Þ·~Qþ)«>¥ u!m„5V\æ«Ö·BN!,UNá5¹gE¤pÞèõØHÉQZËoš5Ù¼>µñÙVZšwbK.åDíßÙ‡ÚìÆŠHµmç…«°^Js9í•:¢Ø˜L@%ÓæØ.]tÎÝ´:ú’Ó³÷³XÚuœ§gGF“W¿GÖg Zܦ…7gn¿Ñ¬|#óƒ3,4 '(#g„ñø£ä^•RG—z«Í\ –žFšaCý.GÿÜPàüˆ2ošÒ[œË_‘‘É>qÓîK‹ßXðËŠ³‡üÔRè=k}•t&tL•dÚ!OmmZü¸æ!¶…9ÑYl*`¶i=_q&ß›·ï{­¸¾²`2}VRÖuo‘V´~&ñs$ ³¹ÛÃ!KwcQnN3k—PùŽn5§çO#Ï“f‚cê°&†­´Ëÿ1÷-ÊÖᲇöPq_~[«N–ލEŒ£X7f„¨—Çñ#V?ã)½ÌðæZžèñ=D³Å¼Òµ“ˆ„ý“«¢ç3ó3ò.û¼g>Ë+"B*J¯Ò˜…Ú1$·ò7•`%×ç÷«±ü:–©ÉîÂñJ?‘…»¹¨Ö¸st}ˆÀž”_ÚE9Pð§+ï”I±•ß@¼fÄSÃúŒ¶34†ýŸ§xÙ×3 ¿ÏÓæª/z®~Ï0Á" Á1dÕWE‚ËQt…£À«®Þí9©ˆÓ{PVÎ(-…Яbå&½>ߦ9%;\¢>Нå)¦Ò < y(CÀ¥wŒWÍû–´€¥eé$Bg^rHâ;Y.F’árÕ¶¢µõTjx!€:£oHRO•T9G õ%íé¼ %²ÌÎ"¥@j¦Ø–¢<Ü‘W¸ «‹2’‡nΖ ýå‚>–f¥ßÏ£;_q,‹Ô>È-üœëg›£²·ñùjöņ••·;érÜ5P{Òæ³ÆnÄ;)ãíNýþ£ª³‰ •Ÿ»ÁFx4ˆõ|-óÜÚ ß J! #)÷{ ·,ô¡zTUc¤Êm%À6{ù¨ñ×Ñ}¹†hë÷‹»þ©~÷KëÊBûÐM$*~ˆr-æ–ƒûò°\µ®™ŠÆ3…'HU8rCŠ3¯ *™Ñ3Ë îü.wÉzt×±—y6wvÂÐý˜Ü•Ö—ðô~ºÛìbÓvJã1ãuºdÉ{€BBõ×À6¬¼¼íƒv¿Ä5$´ƒËaÓPÍ¢\"Xçmùóñ¼)#8´ÝùWšþŽd´íÖNäÑ. †ýãXó¯Z;d?3ªä /a¼i'¹ÝO†‚T„ì†1\o´ëL4´ýÙÕbªçUæ.×9PÍ—ea«Xbuˆ›@kvþ“AŠ ­¼3K·›ocÞØ%8Yß\E«"ž»â5Qdžâ;ÒÐ ÄÝåožƒyC}ßŨ¹¾ g:Ò¦LÚ¬œ$Âü¨Dô ôÄ0< ö~ó­4¢ù1az¨ MÍà,E`á·ôJHÞëð˯µÆ¯Jà0HsH v€uh8f‹¹ß[Á¹Q‡Õ;ê’Ý‘ ü¦Å~pùíy™ z3I#•Àá³ì@G{´×Ú¹a-F°©["¾÷R¢„ô»'cSæ‘$e§6YPØ HÚ²ÜdWTÁVtÌ 6Êxh4h ç¦W•¬ýj߃:59:Úö‘õèk`ÐYšª]Á‹¨­›@“ö»ãpµW›#všö;·XYÎâ¼Äm—86îU-C;\‡Î Æ€‚í¯ÇHî;É1*ÁÞ™fÜDK‚ÝšW .Ã"îfÆb/ n¼ÏÁivtݰ؅"²ÖÖ2 ^ÐÜf0ææ/t 6ÇÞåíø~³8HrÃF4ßçÉîÃ>u¹’®5 œqª™ûNô5B—ƒP6a„Ø6Ë#O§M2G¦il –¿A—¬¼«¯!”¦Ê»@Ñr¿¯"³q¢FxH SÍô¾mn"–ø#öv‡“TzŽî Ù)ô$zW˜h¿xŠ 5iû ­wþÞ2útOÞÇ7Œ= ™ÄL}Öê¾ø•¹ˆv¬Zd.Ro¾Å­ö*~"]%H‚¦c¯× ¿ 9j?i¹Ü“;Ù_rõM ŒËoj!Á3ïp£Sö›`ßXö ¡Lï»§aÔN7œ\n#!!–Ú}“N‰Öè¡èÂlñÖЦút2-) ;"t2ÉiªÐ÷ý`4ÈA#â›QÜ5nÕZ%v669´+! ‰ß8aªÇñÒŽ·¼”.dê {”ÅÂ:2½nBøï=YBãy̺*s[J.Ì‘—á²ÊÄØxbóß(y?½3cBv¿eŽúRâÞil Jæ*î9“äMû©Î %“(á'ºÙOZe`&,Xh2?ÔñRÞ•LCÖë9 óMQ]Üø>õ°KtùP b&õáñ‰ `MShmÊUI¼-9ª \Õ~båƒ5ƒJ>Ì (³Ü4gLsoË«–Ÿ9œSc¼6ý…¡ä_ŽAjç£%-£ð{ ”®sîA8õBYqœZÑÚ’ïACt?¡ qëÔ0ÔyR!4^q0Ýf<æ^Õ‹F—I~‚|Xdu?W>¡V’)1Å÷ýüMö²>Q³¾quã÷çD#y¨}#4Çv¶¥„!Üߦe)=‰‡®Uìu`'­™ì@ÌþÏfÊ´M&üŠ–`ïNå?5ã¸>½¥ÏOùá—þ“W¬²Jö¤_/SÒ»R%¡·º&¤ @z7ÜÝU|ù8ö©¾xÿ°º»m¹Ìæé®ÿwÚ.`ø¡ä:H… ëwøÁ%°àWO1+¨Œˆ–ª9J*Ô*T–jžªQêdh@hNù˜fƼyNQÛüÛ¥f‘­s"s µð"’×fÉãÅ®IàRun\y‰§"ÒXiŠÊ’ò¾) Ñ¡ü9örŒ1ºÕHH)˜[‡‹Á@18Ó&k¡A×—>~pÆ£M_¥«Û:³Û|¸+J)Xyˆü¶Át«²«4j¸ÑèÓô¹ZÚìÆ¦þúŽAžYl¬Ó…ª Øw5À‹™£ì²Ù2$VÉþ]$[cßÛwá‡ǯ(°DM0J]Óð#™ß·N>,‘¸^JÂÔnxÒ'ÎК[ј–¬.‘Êh¬`ªìqÆÞ„_OŸâùŽYž»9q…}‚ýsÒð e5ç8ŸQ(Á yˆ¦æ¯:Àê»êãJ[A1¯¸Ì#¥@Éî$è’ÞÇå =|$NŠ2±G©Mâ× 7n’Óß9·eà‰¹DF;¢m@GÖÀìî§°\B]ádš‚T'˜´ùÊ>µ_ËégÛ‰m/^$"òi†šeõ¿m5ùÑÂ#unñ}‘hqò0gâ(®'!d>.:×­NVH5"¨8¡ŽˆH©6E.Ì»^£­òˆ`•Û¬]mȼ+-Θì/;à”ÜAfív%Ÿ”BëÒ\=¯3/¡+Wl1†%CãÀRã‡ÔVÁruÊ*#÷KLB„^ší ,Ø¡<ж¯rû¢¢·ùa?ï˜fIÓñ2&UD€ñ÷ÎzŒ"<ëÌ?ÏëóÓ1“U³Ë&nÈ¡¢JÑ ¼a-$Jýa1%ÍD“æþE‘&LZ˜0Þl4¡iA¥-©Ä\×°5ý&ç3¥¬å’f¬ÞPéš~h"h`.gÍ®m×o·Ž±GP’S8k–û ü+öæ¹D¯ÀüËrÃéD(]JnEꮹõˆ˜z“ xjβ¡Q¨<£¡=T1òáäÎ1 ‹%xÉ“ó,£N¿Ð®7¯hÑ&ˆž‘#Çî‚æbF3X»hD8ˆÖ}˜ÒY˜–aÉ¡¡´HÕ¡Eñ¼ÃÕ1:1ïÃõÔ~M—¬ÜCÅÐÅa†qWb‘œ nŠ‘—±L†ÔíŒZ]3¾Û‚ù§kÖøž…(ï8åN‡O‚¨—å”O¥È *O‹vR‹êºýÐ?õ,U͇#¢t 6µ ά¾üøþ–È^PUB)Ïå†,JM+Æã >JÞ¸l÷\„Ùà';SþÝôžÓð¶VñY•C ¾#ÍcbUÆZ`Æ'ßÀÃ**Ë«€2êJÂç‹5\',ÈÍß5b?‡3ì…ñô$7ÖÞxOá#{`ë’Uä‹SÈö3G]g|‹–!ß Øø¤„Ìù¾<–ù„¡Ñgdqh®Çdæ¥Êk¯œ/Ãõìa­ykÜsñ6„ï ~ä*yxúû:÷¸#ÔNƒ?I¦q€scÚh*™ÇñtÙbžú@O#§wqv^àûú.x6ê/‘bH|“Í'mÑ‘ÁŒp…ì?ØS¦ºc¿£ìÖ€ÉÅîV¨}• öɤzΰ˜ùA¬úž ìf)Ñ1^ÌÃ-ß„ÃS7µêö à:*ÄQIÀÀãÙ¦¢qìa´Çäs[î²o£~~•¨%"¤t“íEDݧC«µ"I:Ñp­ó›46sÍh)øM@A·ðMúÇ·@”™Æv ³àó~LŠ„RÅn÷æz )4œô´÷Ó‚K~*ä±”Ü#Ož@:ÙÉ“À"ÄŒ^}Þ¡”ëÅÛ•ÓÈ9BðgÔVÏ·=Þ “BîäªcM®34¯¬8¤…,­ i6kL§–KJ2GÚ çô×Nê êÍ/²ãJ󈻲œ Ô•uæ÷~Mþß–nâ&âIB»ÛßÍ¡(b¯4;pÈÕØr£÷<œUwVx_2RÁʈ(‹ º0X[Ü1úñùt¿öÊ!~…åâžÚÆ®ë§9µŽðäè§Èyõq‹% 4aÌ€sͬ‹ì:ó­jžÖi8ý„e÷éEñ?øª7%/ü:óõ"zøY¼­Ûú}ffœÕa ”|ŽÉ ¸á$øtÚ°ÿõ³’8nSnK¶i‚z{µñÇ?Jz£n(I4…Dô‰¶“ݯ1tÒš&¥mèPh/‚UOò²ò4:þTf7äøGÒp…ðÓ=´jgÄ-+”b±RÝéKÚ” sê«röPùF·~Ô?­+nL§¶ZáÝ8UÚ4|Ï|›X‚”ÁÔ,-N20 Q!…;¤úA|™¹¼m%/úLñ’Ùéú[1ï7½©”Å£v±¾œcÖ1XB)¨{‘+ËÀ A¦-@fŸ}¯îò¯–uÄGº%µjë©»ƒ†o1@º#…|µ^)È¥)ÎÐr‘¦ºvyñ‘^óæZõ,Òu.Žm;ôY]ÃÕO”5Œ‡OãÓ-b' ¶×—6YáŠdfY¦<Òÿ­ ‹ðêê}‹Ø<. Y̘ÔBKà–´u¶Äp¨²´JYË»‡ =Kª’–8?kWU¯í‹¶\¼37—ŽSÜ÷­Á2ä&šÊøÈSc=ƒ›86L1^˜_FÊgs'¥¢“9L‚ô<Ñ ÎŒ¸Ã 0n·CöÀ§qüƒ?&Ÿ@€â—,nÒ\>p¯ú7YØ­Š¾˜0ì¶Ý'ûj‰¸Çëà´8ä@ MV œ7¬°~>…±¾ó]{ßÐ=!J“ÝŒœ²l3gAµH¸®î·˜[óßOC;L«K>iJÜ*Ôg¥D4ħ3Þý¡ËÈqxwùýÚtÈîä§l˜P/ ¤»Ð‹7Ç1ÕüçŽ×8~8PÌÃ,äFFçXƒeþuÃô!>x1ªq(q¥Rsg°¾ŒÔ†ØÚ±û*¤¢µéVÂÚ‡ÔéBA$#¬]¬%›öôXlгgµ%++Ù5$‰àÙêÂöÍEÆ¿"uB˜Ã¤èC¯ÇÚXií{ud…³¹\ÛB=Osnvº' Ï·=Qâ5¶T¶*ne¼Ù_Õ#eˆ¡mÚíÊâ³À£—ÆNnÇ|Ÿ†0ʯüí,¥‰±«¿ªN „.¾!ñ ¥Æü {ñm·}µß"^ÓëßUè!O÷]ÄAG&•…šÿ´J°k¦Û x–NòƒdãæÉ‚ت‘\ÀUN%GtÀä˜×!}^Á¬{§ a6³+x'MÝa̽a¤Ïn¼ô½ºîsÜÛß\*v„¼Ã'ÅŸéŽuaˆ¹ /˜ZW ŒZYÙÉ*J¼½<4§FðA,‘qA³`Ô^_«6+K?Ç|Š%>k¡çüÍã­vö땚²7þ’~líõ[[™÷=‹ÅU š.AšŽIBðš·¦¹O!­suÌL‚Û>­¿i–…%úZ¹)r?†Š¸–~#4Ÿžg™Ž£?‘½uoK£[èn1¿tÒÞi‹´,ŠˆççÃæ¢…¯Sºæ;oÐæõ/†hÖŠí{à¡lXø&ôŽNÐŽ"ƒš»Sþȯ:ƒoÅOx7ƒâb×Ki1íw„ú3·ïdŸMºW‰‡Ò&ø d௙/§_ ûÀú/|Ü‘nš9¾®‚}j]Ñ4¾UxÏ{À!“˜½—_·>y™”¶:úY=4Ä[ÿÚÊn±` ƒòC+±ù‰]ÓªJÀdäÂA˜røü«óPЙàNÒu7G™é 6™ã±ý]ñ Žwˆâ°Î*fŽÎ²ãÛ]ӥ;Yƒ1òŒ·É¼K³“/»êÎ(Œ ¡žO-Å&Û…Ëèæ–wåow£Öv¥yQ§c 9d÷ÆW;°.Ðß'ž³¿2LIÌK1[žÔg¶¢¸»ë ˜Øé"ȉ0fäÓÐ3²ƒ œÑ絸GDtã±ÇLφ§ï~¢(݉Ærxç*P—˜+‚ ¨ÒCa§*NÓ¸Œx°êJ$l¹J™Â¶§ÈsýUCáš’¬žP×óQ>€ï çwÆ*Цp·œ_øÂjILù}ö§ŒÜgnÝŠ@ÎRp*°¡÷?£ÊjäýXQ›®«Rp!.šsmR§œòœÎGeŽogCW-BÛ©^n’˲øÓgL£¡¦QÎÕî'{—¾½Ù}Áˆ¡?wep®ÑMÖ!àÉlW—œÚ À°Sïèƒ8ગß}ù‹~L,™:H{ûÛ’Í öø[ŒwÇž¶çãé\¯±m;-~­Éòo³9´«êÃW³]#T„AxN <`±frÞÌ´+/¾YGv$]ÅßY6u‘ùï— Ô ±ó“1(0tÎ…nÒt“Y§¥Í;©Š ÙIó,§ÅDO)2˜…FÃWŽPùo‘+±æ»Í¿àÁñadÚ~Fyd+€œ]›½‚EÄ7ÑŸ2žQ^w¥‡2gÂCáøz %ÒîË]¢ …ìõ²þ9Áž`ÿWQK– „ ‘Jè=ÓìŽrë1u¶}Î,}ÞÑ΄`_ÀBT;±¨Âvv,j•ý —ö&½ËUà–3ÓÀsŸgÒ`J/ÛóµM¥7âSäcR<ˆ]S½tJh&ÎÁí‘RïuU 6:Ø éÀ¸ÑZ”\WÝH³HNp©Ï{‘Ul“ââOÿ%Ôm=t}o­„e¸YÜ_¡/ñŽ{î =HÓ°\&›X®Þöžù‡òo½om# l]˦$ ÍQº ’!;*HÌpçõíšœJ‚I¡ÏÎýÍ“´ïŒ§…þç-öêCfô¦y†ÙÐ7¯Û(ËB‡fɰm³móŠ{ô‘D[ItûS‡æ5öŒŰ*åa÷æA”×ÅœGEÄÓÞ+h ÷BÔ6:Ùfßv»Ìkx[qÃ|8ß¹Ú]ÙZZL#ö êx(FS#ú­â’!ë­ÅîÇb4´;ÓŽ~Êl9Ý4ÅÜé;x–!æ‹cåóÞ=m¶¿ë¬—qöÈhÊgäò)ùÍ…"¾ckà ;Ñä®ä¹TToàgTr3…édOž–i*â÷ýF—ã¨M[NÀVÔ¹ Š“ C!wS–.×N[û\‡!B‚½Gç° Xå>Á«Ë4qg9¬Ð)&3ù¾o5Ô>¹¬®UOF`h#žY†;䦃îbÜÅØÂhØJÙ÷PèÚg8O{úºZKvÃÑ×¢¾ÿÙÕÇíÂbé=Ìf»ØZ->yŒáµ|HÉjöœóPa¾ fÃ!c<7®zh Fœ0„”§·½)îÄ“GnÂɾIye…ì'¸»»]/Ìí—ý1U€©Úh»3OlpØÑÅ#,Z/Fù±å¦0Ü¢×'[üTm„W'I±YÊAG,ü´¼õêîX½ŸúOñXÓŒ¹ÂNíÓoRå@­ÀÅ}c4ÍÄ@•½ 8Qø`T3³ÆÀ!]Rßq†‰R‰ßo¨%—àçQ˜Ž²­¢]Ë(ö”^› _„  æŽ¤Ö30gŽZ"íLÜ[7Xô¿ÌDnm¯Œ¹¿R½'í4j`pïW f*7N§;s¡ÏZ᜘]¸m†¶ $n&L,¯­«eY†´¡.ôÖ‰¦”[ª0+àñUÜ…F§Eø¢>Ihßûjù‚ÍÆ#P²Y¨ž6ù‰°q¡k¾"p®0ó@UxÑvß‹²^Ä’?û•á­]-s㬅dv…íHf¸:EïG5Ì£Ð(v” ü1™nQ’qóÏÐo'cÖ·µ…nj¡9áèzÎ>'é£þùµç=Ö.dx:þ1ÆDº eÍê¿ã¾™mÖÃ,÷ÆIiéçä—§ð±ýFëlµSÛuÅu÷#~Ý?ªŠI3r–FÀqË0wa}nŒý:óå{ø[ob¸ŸD@”­à°Èûn(]¤î°÷âø‘ÑÉ:W¾†ä†EÀé|»uk¶ý+vW0*öY>醭ô–”Òz¢®ÂÄAî8'®légás—¥ K¡«væ4^ÙP]Іðþá†MvmHYˆOƒ{2“³ òùÈ;Ä&‡¼üö­mUðY"TaÃúõôÎHD¡ X×½>kèQSãttML8ÞŒ;T¥\¥75üÕÐÍY‰%‡ì*Pê±6„{ì°LX¢q¾÷­0gC»›žQ½ú¥ 5êô.îû3(|[QÐöB=em0ÎÇmY(Ä‹LPTªêc±[wœfpv$êé+"y9«úðý7›á/ˆÄ/¥U¨%6Q`øœnÕ9PŸ¡&D¬‘è…õŸTÍáÔÈ·›J!²sÍUÀZí!Ücón1k㱑—ǘ#I¢Ý·ctkŸ„äô„AòúÉ1Í5“YÇáf·¾kܪƒ‡©;yâ‘8³ÄÈ¢¿/¨I|ö:DÂ,©¸‘?χÜ–žçx„nß¹£½.׊[²:ÂäÜÛ«Õñ F…Á€y¡æÍ¯âîa/‹òPk’ž`¶Ô°¶5}!˜eê¾%ñÏ, GJP¨Aþ‘.m+bZÜÎß%/H078‰_Â|+ 'ϧ¢!^Aꋦ=,¢–Å9Ï…@ cB%œWfGÆ”ÅïÀ+éõp67·ÆòÝ[g_ƳEŸÅ<ØEß/èÇAT'ߘ$ÔE»þv ã¦LKšB:Š<Ô¦9,WO™_ƶI§Ç¯›àŠx"lJ%QÀÔwG7D(E'z!ÐóByÛU¤.F+ÜÖ2Q:6Œê®bDp÷äßtC‡»]œï¿UÖ—" gΡ4¾^†w¡xž’Á¡2\#97'Ëž>³À5µ¢ö[§H§zÀƒ9‰ÄaåÈÒ!ËÒ€"JIî—¦vº[«þ.ßÇWݤÀ„ÁêýÁÿUxûûÐô‘™Ï°ˆô×ëK®B“!«4ÛgV}§v ¤–FÃJÈý—Ç''71,­’ñ$WC5HL²÷KR=øqë@Ÿß8j©£;wt#ÇCå€ØÄ ±7Øg:Ö­¨2"|ÆxÄ$'W¼ŠZ-ÿÉ2úè«‘GW%Ð1wȧŒÊµ£ÇG/7¨½3¹JÛ,¡Ëx·FoáB*Õ6i]údçO¨ðb›©^¡ó§èŠzò6š™ÀsC:Ñ÷M+úNÎMâf¿‡¤ ?·nUù*AÉÔé÷(°O‘|ŽæÙÒŒt¼ñÞF+]0ý)b<ö¦£(¾ ¤‹&¿åý@"Ð×Óê"§6Àà]«Éhe͸†½; ²™~¯0oИz¦Qo"+¨¤d5D£çcQ Q÷ 1 …äõ’¾Þo.%щ—"Ï öÃî†> ×䛞‰çp¨N­—=rc>-›ÌÿÒ§€–÷¿aŸ4Óévl²øµD™=†Î>aŒ®ì^ÎʬfaÓÈ4¢íO1Í-À]Å`ˆA"%ªŠV¦Ôêdü—¤KÎ T°ÛMÒå½»£= )/Yoš‡ù˜‘ 6MBàáj@+ú©Þ-Ø5'çNä7ĺoIøÈ›ÅgŽðÝ7ò f \ϯ*s”îMòH,ï™<ù2_¥ê¿î€D'¹Ø_<]õ•ãRAdAv*™ç%ºø³W@Š™“5ª|“ü¹XÀÌýèÙm¼kŸüƒŽ=2ÚÍŽH@‚ýÔxàÆÀrsˆ£˜ c¨ŸöiäLãÙoüb±½ŽÖÑãe^ðODªÍÄRºùyÑÈ+ÎèIŠÏ¼+Æ!s9(W#Ý«µÌô›÷Pa_üÛ0é.F(=,0KÃmðn~'LÚ¦g›‰†j`VÑMžC¥ðŠTï™Â:UjpL6™/yŽÉù4ÖÊcÝ*“ÒÓ$³°hy;?6„ËG£‹Žü>Ž]Ÿ»,äIYá û æÇ@ü…œ?475Íÿ¡…ûµKSäX®S0ŽÈÓP<Álû…+œKß)*ˆQ“ö‚mTôš)öŒS5’„­üîñm¡"ñ!¶*Dù»Îz7¸ÅQ¹ fÀ±Õû ‡)uÚ6WW‰Ž>OÛøkw¡T°äýŒ»œ]P©«Ó*-m"”æa“‰lY Û7× (®!Zßn ™xz‰Z s#SÆÒ5=vgzæîÆ,I·YEžæU êý¨…pÒ˜m¡4¡kÏø"F„gØë9É=][ÊqôfÅ·³† ûމ­4o¥q"6|-Íh$kóG ’]57QÎ$“üÚ$"͸s—œe†CÆ®ÜÑÊÑ,èѶ£EÏNüE1š{L¿EÂ:l®bÃpÑ^á)\‰¯J]}/ §±>PV,œØ¿v †ŸÂÙFÃsð¨Hµ%R%o`?±ØÊ_ùÖíU¼ÎmpÎE,š¯§uó±.ŠúY•±î WÏÄñP6§žgZfÊ`yø´ÌY°?ùL±)ž=Å£e™ÛQ\¹6ê K“;R—,²Ç„¨ÞŸX¼}üHì¿DèoàÂìÌÁežÑši¤Ø §P¥2Hï*©aYþfu!pWüŠ˜ŠÝ‡1ˆ§%=ùéöÀQLÛ‰ZpúN4jó@CŸ–ºT‘-ùmŒy2ðõm#no +Ge4joÐ3±<ø¾<í–w˜T‡³ÔòŒGÌðd.³üìÆ­øÚ„€Ç² ƒ{xÌ}€h”=Ä$’FíF¸ò²ÒjË8ô’uÏkìù$Ï B7ÑGÛïðHñQCÁÒ6`ˆ%N>3;ÇHaî+.À—Û3[KÃÒùàËá[õ”ûh,QsÖPß„qzø;0öz:nT®ž3É-œïò›L`0¥‚ú(-Bjšœ$ËYíòî5¼ñJhå—ºèIgÁi¸Hf™Vâ‡^~`åßI T)É=Š‹½èË7Ñ·è„•¡$Jâ…9wôr-QX{Dݼ?ýIøìè›Òê°—ÖJ7¬l¨ÐOÎjr߬bE¯³òæÖëÅÏ„¯õJY9±(ž™Õ³$Ï{a‚(•¾›}o"vmìT¤gynêDX…QTsØñçXÓgom¦Mf&{ ½ï·Æšd‡ít”‚?¤ÄLM %öM("’’}Òg¹‰å¯Í|¥UDêÄ»!£ËV0§ãœ8§3dÿ:Yá}>¶Ë̲jôŽL{B2=‰*$p¼L¨£(}·H+&šQ+ %¼óEEDhò~¥}Š{¡•Åôë©UýЋµvs1IèÚ…ª·­L£s¯¨ ÇÐV¹Ê¡eñ)~ÆÝ£Ðb½]…ÓâKv CK­P/œùͪ”7Xª“Ðoæ7¨É—§ÌÆ=ݧ„Wœî8ß9áŠ'õ§‘+‰5Èrµ”«H¤Ì‡¾4‹ßSß²º.¾Ñç[Â'¢6_ÿð'g ,÷b<Þ*W²ËaÌ J€^ÚRemÕ²%Âÿ¤Sh¯æb‘p¼^äû{ÝCĨúG"u‚2ž}æÛH¬2æ±u ?ýÞæ&—ŽÕ°3£&uJ!a ¿žŸÕ$Mhû«Pæks×ågFHc…nRê@Êo†é|:Øm"È•+× ›L„/}kä:pA»Þ“Uì;õ@JÀÐLl2\iXcÞðC}™n¸Ic£ñ~§§ÿÃψô~ˆ´Ñ}虉ÍïèAãå ÆYä‹ ®mœ56\æÑ~»[²ß¾]•¦ãÒY¤/Ç@ΕÖ2‹~ Ø{ð‰ .R¹BøÒÓ”ØWÍö‚ð±@zȾÃÕÿ¢H¼::Ó`˜d]x8¼ô.ýé$hÍÁü< B|ˆ³ø³‘y£ýö{bù¯ÍóDi”°ú‘QsZñb8OrðK¹àЭ³“tW5 _bO¾êxõ홽s¢ŸctÎN‘ÊÔ!‰‰7Åuª&üFƒGÑþDÊthZÍ¿j­ìbâÛfÕ6*ö˜æ:±ÏÂ)Ó¬¦Vœ,k\Yç­€gh³1žH]v—LŒ`Œ/Wh1´a!¦Tn{&¯ÉÖk”j†ÓÉ"Ð…u• ƒltÒ>ÌdÄk^Í%õ ?ùIÐ×d9¥‹ÎãtÆ”¤ì°3>¿Ÿ%Ç0æsÏР’qi‹ÀÑÔcwÍÊ ÷¯^¾Åa&Ñxƒö]N¶ã ©>>–ðF6FgÞo1-¾”xÀ¸O³ñ"PK%fÅK3õ €´ Ã*/Š2â½øuSìQ©uLå2bð1t?K¶Ÿð %p}£8bV ߟywy œ7Y¿6Ú&ÃÅ!Ä­Ÿ<½÷¡"µé.ãÀ&6®ˆX Òð~¢ñæ`Š2)ާý¤²?wÊJî(~^Þ,û ¦:¶†ìÈî…Ï I*qñ˜ö¢ËæEE¹ N>óìL†è€š-cÂÆz…v„÷+äºÃàÀYãzZÌÞ„¨ ‰œâi:Ø”ÊBJdcï|•ÐkËJRÄÃÞZ#£”s“S½,-*Ììõ+ð™Í¯2)˜Éx$3¨TKÕåÒúl0M‚ÀQz\‚PíÕ@á¥ãï¡Ø«h¾”œ·ÁêÀ‚ûc¥H¾Î½ÎÂWñ-ÆËÝò©Ã°”öWìì4>/âöÞó¹xmø ëÀµ“’ê’jÉy4¤7Ó°C~7zàÐÃÂ’^úçNÖ57f˜ýçƒóÍï álu Äc[8Åçeîó°:Y'<0×É%¤õk\Í.Aƒë¬%™IŸÙ™©ÙnnxñÚT^Ûzà jž`Ê&Ü1¼̘ç<±=D!_b*Y Ž•ûŽ®ÈóÄA—ÕŸ©ÒâÆÒçâó-YÉ€xý ÍÅ5ˆ¸G­ÅŒ1¢P06äW]jø3î-¸²(P*&¬£¸Ðû8¯"…W5Ùj(Ѽ]rÚïvQ-3kn€Çmpµ ¦mŽ©Çà#ÑIÁ°ÉhÀû/Ïk7D „åœ2Çe³ñ_¾ xÀÑíÉ­ ¿E™,]?ÉØªFè–™=‹ôr¦œ§ÜKñ*³‘ÝÆwªŒÊÁA¥y´~OÛÚ@ÿN²0l.®\OüÅ.«ñÕEÔ¹Ê š[[óáËËYŸ·¬‡µs굇mQ§Ëæœ|© ˜¸±!ï3UŒzH;“S«yÐô’w˜ìôƒRDÔ/%2ãx{p=qúYI1œœ«.Ù×1¨- •ëž÷Þ 3:"˜ZÏÈ)ÿéÙ*14šEª«ò×ÕÔ——Ÿ·®³÷aŸ ¿½ë¿DÒQ×Éìê"dùN^4lîÛõô{‚í¢YL—ô²tqÙþã¾—mg6U@×ðI¡>¾Ñ]n º#ÍWÊ»Qï=Û£Ëç`}¼]!øN‹ÀŽã÷8Ë3ñÀuK7í½ûöÜÔ|~­‘)AN&c»AÈ–¨¦·ÀÓÂ(}ñNèá-#’&âe-`æk;”LÓ.ú…÷UÊ^ÑIÕö½HÌ[³LˆU«7y9"MÈ|³].ô55|UžÚWÐèV‰Æ(nèúž"ŠÝ¸ŸÏ®o77=ªêl$òµ“±§2f‘ïßci¤ã]OCW?Ù*V·ɎGk5)cžeK—^ÙÑ‹¯f¬ç 03…´ úÒ2<ïüÙž :G^ n݆D<Ê ;É@ÌNbJ‘5.Rg Ê="?UðòדŸBraNµÚd$fC×@¨‚8D +{”@1ŠZYyâp¾¼ÛOS¾Jž…,C«“¯¾`Äf)'ð2]57~|Ë”uÆ/Žþü½µ ?ÛL,IX³;Eæ~¢Rq wö#)™÷Ÿ¾ãE5ÍÜ}ns3šœä‡ä£ãœ:ê 3#oâ†cËüM¼"¶V íKò¥Ss§Ÿx&¬êϱ¥çÍÃÒxFd†f@†}9é €[0¹™xp¥¢ÂŒ‰X3{Ý¥_S‚Ž2œžk¿¸U·m/ù®­ð’q?Ëß¼*vî8Pú‹ÍÚÌÒû'½ÖmHù'“b¸‰03õ¸w_)Á™1.â= bDÀ¿'ì&§'êD§fx®É[ï:¸ƒnNµ`<‚2ˆ'ñÏeÞK éJmíÅÔ_ßJ-“°ÆÏÍN™i^œaþ„lÝ>f/Duï@(¯»k‡¹YˆËŒ°x: , io†V@9s!¼Ûn‚#<É“J—¹›'˜û=í7F8¢ýö®·L—„™¨óªÙ°Ö¨æ1ߨ-äe)ÕÇùI£C˜µÅ‹jØÛ0·­¬®ËVe˜bøÙhç;Îíúi*ðP¬G&ì×8¤ŒX5A™¬6Í„­/iIMS@žÆ&|á3fY`Ñ&uœBIF~£Í9Ì–°óÈS¤È6¬EÚ5˜ƒ!µ'£Q!Ìuãthl ‹RxzN­Ë³€ë•}­n /D~eP{øÚ_×p!-Ä·L¢®ä z,[ÚPì2ë*ÖRB_gµDÑ]h˜ÊÐE0¯nï#›Î:D8¥K°›ušL¥Zµü#™6¿0¯VÝWŠ vB‡Ð;iÒÚfÝYÖ‚g¿:É:”mÆð8û´†7ÆÚì>º¸á±B¯Zî{#òNÐín«Cœ5Pª)É“  Ø®¤¬/+«3AáÝ¥¹H p»bwDÑ%æ;õœ·†mÞ &°Xò]2å· G![é†ìÌä²1̶º(Ô«sçâzUiúà@÷Õšw9C›ÙñÝ胯Nü—”i‚aã“6ب$,Q%%è&\þ,ÓO^Œg¨RÕ8ª9®·Ý°•Š5gÐÓ]æ×PíífP´4â–ku 8»¨Ã»mÜ 4¥}«'Dsü5Q84tñ46øÄ§SÕ\¥–»¸WÕ÷fÙH^qëÿœ~)•5{wÕà£ðœ¦Äs  CSÁ@¹n7ÈîUs¥ÏO.à ¨éyð°<ÿLîŠÊwæèveŽQåž [–Uç+ЯÆ]ÜÌV-§ßþvgÃ1±¤t…J"â²hᲑIkyB·3ýiXx&ü°(½×äûd¯ìç¬>!ÙþŽîVTç>^ð2eá}£ðVböŠiöíFÇPbö‚ÅñÛˆó ¸kïŜ勴NÎÓ£5ÉO$WÛ®”öi~y„#l'nr›­k¬d–º6Áן¥•œìŒÂ0ûØ­Ýî´VSžHò{¾IK¨¢.¡ñºè+®?Ìg5Œg³¤l“ êgŸä³ALkÇ“ŽÓ WÃnEe”)»WèCŠ @eøÏ\{°™Ã… QH²ÍÊ3N‘´Ròjúê†àTó`Šñ%eN”Bßa'aI WVkt-—+b:­«CÔ7°>»ÑÜ‘i¤ÞÍëÕÒ5õ•šlÉG·öÚìcZ‚ ¸”Ïë1¦çƒ¸™^šÑ;æÃ[4Þ·”fôà>öùÑ-þ¥)ðô¢Ù2æÆ3»j½ShÛÒ{Ô|ù´;MÕ(Œ,Î)JÙÞmاG0ó–#°Ö“×¹¦"¶[З‡]GŸC,²æ †/)lÛØî[^ødä%¦¬µ(MÈûx¶qáy/ákã…¸’°\D9¡ÒXêvUÎ8Úî|íš?TYxt,[Ѫ5¤hy¨Ã<7ÍØ[[ð>£`©xÙ§] á²þP’í|/gçÆûTËιNJ` 'Ìæ­ˆº bXJugã“Æ;¥”Hmãôë˜Ï1N‚ƒì.Z'ÈTMÍQ%”v/Ç= 9왚wqÞ‘L!!¢^ðÏ%xüˆODÉ£uË LYxÍ2ÖžÕtw};‡‰;¨ƒÓŒ°´jfùèF]@²Ñ%Y‰ŸÅÆ)òí&B§Ï¹“á2*Rðµûy{^”<%(æM1#ÀÝ_Ç!ªAG§Œ$ä\µÒô†Ô–ˆéûy~k¹ˆQülUÉñk\Ég¦ÁÚÝäúžÑoD1ÃV ²@„(Ëõ‰«”»÷hj‡Øÿ=D MÁñ\¿(…êaõÔÍì¼ÏýLº/´x~ߨ¡íP-áÿL £þÎ0÷…ašD1¥õkÿÌEõ¸3´å]¨¿‡Õ¨À‰d…D¯ã}Tc•³€Ãó®uä…>â¶&Å›×€MX>°– ŸX.Ì®š³¢ËHìíùÆíÎ[û)Íô¾—9•&eÅ $ iCB"r&{Âk…Ö ý§;pû“'ÒÑ(1û 0¶ž†ã¨nÏ!‚„ã/_à¨u‡8³åGKŸI„K1|~[ÖƃÜ3¡«yAöThÞEEYùŸ›ð˜ðd^;ã%ÞúÔóâ‹úÔă5aBžCÇøå¦ÜLmr.HiÊ­7z¡¡rSI@Äg;Ücä=õe«èéd}h¶¤ˆ5‚ÀŸ‘Ϩ‰´$C2a×ÛNßXŒ#w}ºP8:£©LO`vIú¢BßÚ}M(ÜŠ1‹2-ßÅtƒ£ >x³¦ã3Pg©ÒöœÒݹ¦´oÅa(Ëgð/wW¤¼\Et+u h5lÌì.&–QÓåV5±s‹s@v¢þÄößpâ”ì/QPj»®´9º˜Î N Çpñ"Uâç„<‰ÙýWZRñÔq~áhE0½®Ø¢16Ʋ¬ÄɤÖ¨äK7ï`˜è”Rñ2ª¨gù§ê¢Ý¤!Å8ä2{¨&"&Ç÷ˆF´Ðh_‡ § ½AUÞs'Š•M~×Ö>`óÖÎMñKã?¸±ø÷†¾gÄ€Ó°r½b~Ç:&>¨ ba¬”MŒ‘ˆZûù…£ ãsw¡ÂQ¾“&âFZÞëŠèO‰é×ëJ:3•õ ¸6Ý&e•~ްs¬q',{h—­eŒH=ŒŽ»‡Ì÷"ëfûî Q’éXrûUßôœS[®EÑ¿rÀÅÝS'6ËϦ^}íl3’Kê\¤m‚_ŠÔVÆGÈïš)çík8DíTÌM¦4,»v†ƒ2å!îPFTfi[¾ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 793 /Length 3212 /Filter /FlateDecode >> stream xÚíZ[sÛ¶~ׯÀcÐ\"*‚…‚j4‹΄[#¡b @+ ÁÔo Ø» ô@ÑE¾Å5R’[… Åœ€[)ÞIR$Yð†´C¤¨¤&Å%i§£ê¥Q1B´‘I¤^’BŽ!E¯DIA""¹œ ƒ‚‰NÁM’B[êÔC¦jí{Ïž1þñ—“ã ã‡ìIUfÃɸ/÷Ø7ßôž\L‹ë˃ý#6Uµ·N>ÿ¼±ój<›NÎæ©õŽ*`û¬^]J–ä±iy=-«r<+ÏØ¼Ž/ØNzèÌõh8Ãr\²!8M‹ÔÍΊYÁÎ'SöyZ Çl6¬ªyÉ~}òaÿå·©ó×½½­¨ÔúÍG³áKRévUÔΨuHa¬¼)¨éº«dƒg‘ ˜œ³«­Øôk,6Àð ‰M°÷Œ¿ÎNIƳg=~üçuÉø»â¢ìñç0Ï*dH"ìñ÷e5™OeE¹.µ•gÃâ`rÃ> 4PþðQöÀ`Š‘4}ˆ¬æÝyòó/˜ª}E¹´i;žF§Ûèb¢}Év'¡õ¢O‰ýnB"QÜIˆüЗªÃñ°aè ÐQ‰yˆÌ’ë†[]O‰'W­¡$S×±<,|€Tm¨ä þn:|(gì|qø‚ñãòfÆ–Â7:ÉŠ®“-ä$d§»Ô°ÙŠ–Ñ5Èt ²êaY}¿¨[¡Ûuåÿ¸‹Ã"œ‡Ößß5Rö¹¡ ²/|¸›PÝWXP·`ÜÆuK µÝÐ`ÿ@ŒêbìÄÃ0vr·i´iêÜLéQë1†®%ugh¨û*†~Mã¼\3.ÞË8¯;Æyñðd¸´b»G›¼ëêÍ ½çÒì»ë£S ÆæjGDî“<‹NX[}x :_ÿ6ãÖÖÇ f\Ð;w”¼{&ö=þaþy–n©Q÷ø›âªLq“å³éÌê l¦Iþšúi¦:H¦Ó“6eØŠŸ¶a"#º*½º¸,=ãxZÍž_Sì>{üuѺùix6»¬hw›þv<˜œÑŽ&ÔqE„Ä»¢ oò'£ûˆüÓ–µ‹q€x~^Â-¤Ø§èxÝÔYpK6Ûüëïô_”ÿY´±U릅ëûôl)Uf>íÒ».çÜâ1'5òœîG<,ؾcÞZ<´:« “÷šZDAZ{0Â)ß§7J-N‰k_KP±oð€®(Ÿf ™2•1Ÿv‹“IR„ÁØ6*m›r‹Ás)ýš»ÜÛ´µÇP«²¤E„xÖ«Kâ§$Ñ ÒMëD¡1šfE ílâË ©%—Êg/¦^!Ö~›ScȦt§&i ÝGAxK!“3R³j•D’Å4µ6•IÝT&öí¾–z›ÛöSkZd®Æ“ê¹Ì-dšÉíÙ,GV¸ EHÁP8€N» wc§CHEéêþº-­¹~Y^ó·N)ÔR¼¥EžX7†vk-³Ú­zË{©uŧªáQ»Â®Rg )~tLü²CZ½Ù€\Ïe’|J ¤ï[–KŠL‹–Þ+SM/k¹ç1eÍ1—FQƒ»Õ2E:•tLD¿‘¬M´£á``—iîéˆ~<? ;ƒD› ÷y »¥pÉfÆ”:l]:¢—¼ïƒÓàL¢#ÁRbš«¹tÁ/µ&9m4ÚYãRn²É/éšs ò‹¯é©uajTæ–˜ðOã–´¹ßXÒÃ`D¨½Ôôe„Rž¤WùZ9˜D5>(‰Ëâç1}Ðî°\æ¯ ¶wzéoÒ4BÆæDgàu¢ÒV“§…N#Uš5ðqL£ô‚_YóV4­Yò&*M/è…[ÞØV ^­5wÄÆh›^>.j*æ·%‹þ4"æW-.M:ƒ¬Ç.©rŸN§©›êä“À³á‘eæÓ.½ŒÉý*MU*s AO‹&M‡¨%–—÷…Ì!¹cÑEHèšR+¢1^Ö }èa’X꯹¦Ñu¶Q0 ï$¡–™ÊÉv¥Å"KÖFb½ÞnÉœ °mצrX¡©Çæö”×kl¼J™=móL4ÒwD²5×SïigûsXVƒéðz6™æ}LÞüüüþ‡Ã“wÿy~tp":FÅEÅL{§óÔjöTÑGIÑni´_ h«ç"(Ÿ×ߕËKÜlaH õ=•ÔùjVŒ†ƒýñŨd°Yyõ#}têñ“z’tÞ×Ð~é ßçü[þ’¿âGü/øg>àg¼äçü‚_ò!ñ+>æ>—üš_Ó–sTžÏrmJùu9NÎø”W|Æg—Ó²ä³?&|Îoö²]/†Ð&®¼gº ¦ƒï¾û0½—b3JØ %Z9Å](é{¡äÚ iÙé9?P/Õwë{þ€½áoÚ1ÿÈâ'5xƒÉh2FyuUȳÉhTLgâ TÏéÈÓÿÀ<âçØÇ&°/ÿ¼¾,ÇÀüü·÷ñ°ßüßùïóɬ<û<ÊÍ䌪üvÕð†W£¢ºì8ç ÿƒßð?ù_ü¯r:YñTÜÅS'¯^ürrœ<µ%ž‘RS<Ç¾Ž£ìVG½L.Y8‚\Pfœ)” ÔV(oŽÚ.xŽÝÓƒ_Ÿ$4ü4tŽÛh/M¼7v V·Ñݰ}‰0-ê9½˜Ñã®ùóU‹õ.¼=øø x}|¼m²*š¬t¼AbWE¯D–FK¹b4Ý.VJ­ý4Þs²¶§êb¢¾_™ªÅ¨Šñbåó´üVÎÒÔªëy ¶Íãò÷y1âåÍ`T\ѤNS9Ïã‹iYÌÊi{>SàʪÚmJ_æUk^w¦ôêdžÏ`Í`2-›y½Èv·~ÿãG?Á­Ç¯¶9UÛ:Ke3±ŸJ³tk¸Õ­/“3ßó¢µD-Q¦ŒÙŠëµ¨Þiý998þxø_2kL›ÒV?*¤ÅW‹hÄ1"ô–XÞÅ«á{¿°í.:Î-kNç2`9(ª2½¼^{”Zq&0J¯p›·¿F´ÞþJ%–¯£Ù]xçeU6jê§(h Wp½»ðΚÛ®Ö,7má²yñíîÂ;K\W¸YîV„ûF¸Û]øújÓ•ïºòµ^A^6òÅîò»i±+}=èì6ëÕüÞÉJér-êôŠã•i¤oxª¡R}‘šS[~_¢Cr‰íójy ¦>URŸ±¨ÔßÈóäÓ[¸›mÜëï³õWÉú3]þ u?B#3ÈŸ³ëb!oç³ÒXU#ÄêP%€èl_þâ“ø©åÀ!R) Mût¤4Õjí£ÞMË/ômªi©âb¤r·Œ¬5yC_Ò´ÚÀÆ.Ù¨lÒÈ ÈÅHVFÒ‰ÇFƒö¬]ª“€©Õ©yªWÙK¿doVØ›s¹Á"¹„TŠ­CË8éÖ™,Áu›Xäad/Á”›É`¶'ÓB“„H­É"ôä€|r8<ý0+¦³=:^LÑøäÁJÇ uhß‹=:oÛ4¨=ú¸ÙÜë=:_ÜÜ›=:Oœâš¿^ gi ªÓ®F©ÝîÑé↛ۣSÅͽߣÓÄÍ}Ø£SÄÍ}Ü£SÃé¾uUwõYÈj­éÓ:±)k„ºgUý†f"—Ú“´kíé|§ÒÚÁGù®Þ-ºÔëúwNtj¹Æ­CÑmX²ÌYKæé ç«­¯î6ocŠE´Rnxä}^àásrÑËù³I¿‹ÜØšÉXÙ¤‹òhrVòUÙ$Ò·×åx?ŸOÕ˧¨ÿqݺó endstream endobj 120 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.14)/Keywords() /CreationDate (D:20151013203256-04'00') /ModDate (D:20151013203256-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) kpathsea version 6.1.1) >> endobj 121 0 obj << /Type /XRef /Index [0 122] /Size 122 /W [1 3 1] /Root 119 0 R /Info 120 0 R /ID [ ] /Length 294 /Filter /FlateDecode >> stream xÚÒ¹6CQ‡ñ½cÈ`HÌÄSÌ!f1_C1ѪU* Oà”E«Q(u* òíæ·¾õ?ëÜu‹#"òçq‰ê׫P•p .¨‚cȃ|¨†#(€Bh„CpƒZà¼àƒVÈ@CìC ”BöÀ(ƒñÛï–Cl€k°[° ›‚ Ôªø®íuÐõ*¸m ÐÍ*Á[ÛBÐ *áÛ‡èR‰xì ú¡W%æØÖ;0*‰;;ˆ@ †T’iÛ†a FTœOÛFUR^«q˜€LÂLà ÌÂÌ箽ٵ•ûŒURåýÁjQÕýaµ¤ÍZ-«Þ„¬VTŸ­V! »p gpp Y¸RýyÎ=©ßoùs‰'³ endstream endobj startxref 130036 %%EOF graph/inst/doc/clusterGraph.R0000644000175100017510000000245312607321273017212 0ustar00biocbuildbiocbuild### R code from vignette source 'clusterGraph.Rnw' ################################################### ### code chunk number 1: clustering ################################################### library("graph") library("cluster") data(ruspini) pm <- pam(ruspini, 4) cG <- new("clusterGraph", clusters = split(names(pm$clustering), pm$clustering)) nodes(cG) ################################################### ### code chunk number 2: kmeans ################################################### library(stats) km = kmeans(ruspini, 4) cG.km = new("clusterGraph", clusters=split(as.character(1:75), km$cluster)) inBoth = intersection(cG.km, cG) ################################################### ### code chunk number 3: clusterGraph.Rnw:95-106 ################################################### d1 = dist(ruspini) dG = new("distGraph", Dist=d1) rl = NULL j=1 for(i in c(40, 30, 10, 5) ){ nG = threshold(dG, i) rl[[j]] = connComp(nG) j=j+1 } ################################################### ### code chunk number 4: howmany ################################################### sapply(rl, length) ################################################### ### code chunk number 5: somecomps ################################################### dr = range(d1) rl.lens = sapply(rl[[4]], length) graph/inst/doc/clusterGraph.Rnw0000644000175100017510000000610012607321273017550 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT clusterGraph.Rnw!!! % clusterGraph.tex file will get overwritten. % %\VignetteIndexEntry{clusterGraph and distGraph} %\VignetteDepends{graph, stats} %\VignetteKeywords{Graph, clustering, machine learning} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \begin{document} \title{How To use the clusterGraph and distGraph classes} \maketitle \section*{Introduction} Graphs can be used to help explore different clustering algorithms. While they have not been extensively used in this regard that is probably due to the lack of software rather than for any other reasons. As we demonstrate below, one can easily and naturally compare different aspects of clustering algorithms using these tools. \section*{clusterGraph} A \textit{clusterGraph} is a graph defined on a set of nodes that have been clustered or grouped in some fashion. The grouping must form a partition of the nodes. In this graph all nodes within the same cluster are adjacent while there are no edges between clusters. Thus, each cluster is a complete graph but there are no between cluster edges. <>= library("graph") library("cluster") data(ruspini) pm <- pam(ruspini, 4) cG <- new("clusterGraph", clusters = split(names(pm$clustering), pm$clustering)) nodes(cG) @ We now have a graph that we could perform various operations on. For example, we could try a second clustering algorithm on the same data and see if the two largely agree. <>= library(stats) km = kmeans(ruspini, 4) cG.km = new("clusterGraph", clusters=split(as.character(1:75), km$cluster)) inBoth = intersection(cG.km, cG) @ The graph \Robject{inBoth} is of length \Sexpr{length(inBoth)} indicating that there are that many distinct groups. One could, compute various measures of correspondence between the two clustering algorithms using the graph representation. \section*{distGraph} We use this same data to consider some potential uses for the \Rclass{distGraph} class. Others have considered a similar structure for exploring clustering algorithms. %%FIXME: track down the Butte et al and the Shamir references <<>>= d1 = dist(ruspini) dG = new("distGraph", Dist=d1) rl = NULL j=1 for(i in c(40, 30, 10, 5) ){ nG = threshold(dG, i) rl[[j]] = connComp(nG) j=j+1 } @ We can then examine the components of \Robject{rl} to see how the graph is being reduced. <>= sapply(rl, length) @ <>= dr = range(d1) rl.lens = sapply(rl[[4]], length) @ We see that when we remove all distances that are bigger than 5 units (the range of distances was from \Sexpr{round(dr[1], 3)} to \Sexpr{round(dr[2],3)}) there are still only \Sexpr{length(rl[[4]])} connected components - one of which is of size \Sexpr{max(rl.lens)}. \end{document} graph/inst/doc/clusterGraph.pdf0000644000175100017510000025643612607321273017576 0ustar00biocbuildbiocbuild%PDF-1.5 %ÐÔÅØ 5 0 obj << /Length 1952 /Filter /FlateDecode >> stream xÚ½YKÛ6¾çW‹dt­ˆQRÑH€&M/½,Cšƒbk×Û¬-Ã’³Í¿/çA‰ÒxAÑvE‡Ãùf†Ã!ýæêÅË·Æ.T‘j•ÛÅÕõBi“ZS-œ-ÓÊ–‹«Íâcò[»ÔEr¿\™L%WË¢JZhgÉi©’®!zïÛÛ†èë;ßÁÁ¾ñÿÿ€ƒê½oo¨½ñÍ[äl(§îhÿoùéê÷—oUµP*­ò\£Æ&Oui«\§Ú9ÒøϽÚÏË•vIsôuž(O2—ÔÖ¾ù?•“X«ʦÆ:»RE•æÚ,VV§eY‘Ü÷ž¿4í„{AÆ WížD•‹*­œv ([¬´JËŒmùìQF@´ÒÖ%koßÈжHêœx³!–žÖƒ&LlîÐRÈ×ü m ´ UC\Á¬fÊ4Hß/uéåàœÈC0tdæý M®aø¦ ä–Ü:ére•M>lyän\@%ßF5kœ¯°.3ßÛžÚìšmŠhŒš}ÇkÐü;”ìÍ %ÿ“E)!˜\F  ÉyKF†>ÙÆÃªÌŒu?ÎdÎÑ"Çëÿ™–EŽÍ‰Àám´“1^× ï"´×4·ó `Å}ä‡ëcCǺçXÀ´ÚSçºeª'ø¹¬I;ØúaÃÒîÙM¹_åu71oŽû%ر £¤Ù ózŒÎžqÚlH“€J`ÿXÁ®‚ `à'%02¾eØêV¡÷Qú Æ lkÐaw¨£ÐIƒb)^‹žEw ¡5«ÞÑD4:hÅz Ð&qqœ?캣l˜jL2¸­c™Ö¢ÅZÜ¥ç2‹ltZiöÆúnª'Áí“™ä5 YT–*¿ZÆ¢'ø)\e eîÁSëäeêŠ*á}¡ZúÜ ó8MƒÈ{É‚yr·vDH< ÕóÐ5}÷d® IL"^Ð,qx "ÓY– Ç1R¼=q椰ÞÐÐmUø­ºk¨u§¦: vtçbåÊ´ÔÓè¸Ú†Ô Ã*‡8Ô´‰,8Jù$N:šrjdFØü&KÞ‡<rué܇ ã>$æ™?`ø>ÞC~Õã . «wÜ9ã^‹ö÷™ VÚÕëø¤‚=uÒøÝtŸmÆaZµÙ"Ðl@ì b1:DNò) rëùtA›6peí4‘z¯Ÿ^’ü’†õ½Ù!ËVð+o€ÚãÚ>ý˜ýˆeê.O€séÔÓ ßa ,iá&4Ávú/ßæY”'VÁ&>+Uª ›ü'A€ò3'š¿ß0ŸçPw]€ðh8ÔDÄ¢Î]ß'}p(š›±1ëÙUòÉ*–Üó—%#‰Ã&ŽªG%h·Cógß\ÔGžµÆ%ͲO/·Æl?_nÏV¸¾±Þ=à¦Ës‹ÿU±5 ìH•Wô (ǚí#Û4,ˆ‡Lþá åƒín‚Áþ OXžö—WSµ×lÏ Áo*¾©ÖŠ·ôá’âÿ>‘ì î^,W*³öõ¬of};ëç³¾›õ‹Y¿œõ«Y_ñ]êbª¢’$-IF’¬$‘Êx³b»9i''e’TJR5%i‰QKŒZbÔ£–õè–˜ä$©¤R’fÚ›Aû3iõ#3Ì¢ÌHxFÂ3ž‘ðŒ„g$<#á ÏHxV:ÇJí­ÔÞJí­ÔÞN0“±geìY ÏJxV³^.áå^.áå^.áåÒ9¹Ô>—ÚçRû\jïÎÆ^d='cÏIxNÂsž“ðœ„ç$<'á9 ÏIx…tN!µ/¤ö…Ô¾ÚqìMoj“ŒO‹ËÒbùW…›¿Ýù¾¸M±¦Ï´Î¬ÆÚH*5>øöoQw|³÷̇ð̦ø^³#ƯËÜùŠô6\¼:bo#þz¼ãt4‰/[+§³ä-ÀÁG?-¼ÕT)7t”ÛÌ=®\?”‡8^Ó)2©è9ñ™q݆'‹/·TP½}î †Ú}T¦7Ôîè’ä[›š*K’2¬éYæ¸EsN¯<¡Êx.ïñåéˆõzx²òê¼7çÊ÷l7Ï/­»¨&îÇâæ±zèËXø¾Š)TÕ\_uÿM ±¤Î¨ðÂÎOÂÊ«£+kNY·m䕚i±Hžéç§(}LKß/Ï,}ŸWîï¼á²—‚5¶uà˜co"·<{/‹åÑYG?•‡GŸâl'‹p[¥¥-â0‰N, ¿C¨|öl†é ¶p•ñ¼õ!ËfÞMÈÖØ@c=¤Äf*5KÇÙøÜŽ/Éž0Üûa0æ£ÏÇUü‹KXfÍÏR~0z¾‚—$§þš²gÉQr½ä<šei–¹i`¬[Xõp\¾²>ßûÓ '=é@舼£×ëÇEÃd°|ט[i„Î JÐMÐ¥¿p€(Z|A&¦ò'úA„!Ïß.GgìXÕS½öárÛ5ÇÚö\å¨á½²‹^¸'#½Ai¥…¿ø“–šß[0ö_üzõâZr*× endstream endobj 20 0 obj << /Length 940 /Filter /FlateDecode >> stream xÚ…VKs›0¾çW0=Á¤$ÄëúHf:öâNiˆíŽØuÓNÿ{wW+¶“Úç·/Þ..®n”p„ "•Hgñè¤y $ƒ4΢rîÜj=xÂÝÁºíáQÀÚ®¼ûÅÇ«›ÌɃ<‘ 2†Ž/E…™æúæeÊ­=?’©»–÷(g „Â9q‡¢á› …ïHÃHÙá6sKܶhÆVUã×DC×À%l=žÝ޾·õX 2­oRêA3<¢Ü~nX­]S¶o2•A˜¤à##‚!(€H,Ýâ* D––rƒ6 Ïx¾RÂý‚ü¤°'idĊ܇ÍOÜf·Ê®E rÝÐ×jtüHdŒÇ"ÈãX+C£Hs4ø åèg$ÝaGè w_rX÷=C<#"@YÿÂP#{×3ŠhÈRS’G{“õHÁ×^/GFò´Aê@C‡'¹“ Î7žˈœz{=}±‡õ=ŒCã ÞZ–®5‰ ¨Â9F–ŽÛ™Ž–³ç0ÉÅÈÛªoYoÁ:WL÷ZKyD~Í"Ä9“’™I=Ì6é3|ù ë­çùÁŠ^r˜̶³{k}£Q£m9]*XáäW4?Šù16ÞщvÂýsΚKÏqªÃ4ÇßÔaÏqøÜqW“mÇáõäÀsá6úz–rÇ !»§eÛP²¾–×;>7lÖß²þÿ)5qÁ÷åI|’‘Uÿ=í$Ðs¥¸DÒ£öik‹VïÇ.ÖZ5\4¦"ê#*ÐiǨ{¶šÚÏŽûPt\µÒ¶+A8µ8 í©õQÆ™!2MÛS=Y  ê–µvaIe-–Nëɨ08qk»ë˜¤©°”´;×o|æ4à|å¼þ«ª·œ.Oóf³™’n3ìŒb„ÖäÄfGîŽ[¤ŸU å5¾My‰©ð’Zgj|x9}ާ³Ê!¼1¦Ã¦óaL$<˜‡#ÊM7U@Ulp̪ŒGäNg&‡b°Ô…™=°À^´\šén[ÄFÄZ?·]3Ø,•£3&|¢¼i—|‚¦÷ØÈ-ãËGÒ4Y lvAcóì¡X(E „šÒ•³ZÄ*À¶™'º"åXnÖ -¬= 3§7š‡êpó¤Q2Uz×R…Ò𦷮š-•D×Î~-ÄçR¶úaW‡j/Ñý•¾YÏj_ÿ8 p¿'f†’~¡”¢Ú$;!%ñêâÃââÁ]_Ò endstream endobj 30 0 obj << /Length1 1613 /Length2 8269 /Length3 0 /Length 9304 /Filter /FlateDecode >> stream xÚ´TÞ- "JƒtÊÐÍÐ%ÝÝÒ 0Ä Cw H)H‰tIwII#- Ò)ýõÿûÖzoÍZ3³Oìs÷¹ç\M)+˜XEppsr‰dÔ¤ ¸y\\¼œ\\< º„ø/;Ãs0܃Šü+B!îm² Ä}  Pvupó¸D¸E¸¸<\\ÂÂà"YÄ  Æ P†AÁ. 20'O8ÄÆq_篿fK·°° ûït€”#±Aj „-Øñ¾¢%È ³„€žÿ¡`µE œD€@wwwN£ ' n#ÎÂp‡ lÚ`0Ü lø% rÿ)ƒ k qùá³F¸ƒà`À½Áb †ºÜ§¸B­ÀpÀ}u€Ž’*@à ý#XõvÀŸÍpsrÿM÷gö/"ôw2ÈÒæè‚zB 6kˆ !¯Ê‰ð@°@P«_ Ø}>È qYÜü>: /¥Ý+üSŸ‹%â„pát8üÒüEsßf9¨• ÌÑ E¸`ü:Ÿ,¶¼ï»'ðÏ˵‡ÂÜ¡Þ!kÔÊú— +W' âì V’ý3æÞ„ñÍŒðsqq Àΰ‡¥-ðW]O'ðo'÷/ó½_o'˜Àú^Øb ¾ÿÁðv¹¸+Ø×ûߎÿ" nn€Ä°Û@ ÿ°ß›ÁÖàûû‡C<F\÷ãÇ àúõùûŸÉý„YÁ žÿ„ÿ¾b Œž”¬¡<ÛŸ’ÿvJKÃ<Þü¼~n77¯0@Ÿ àû_ž¿;ð—úßVMäÏÓqý赆„ÿqß½¿„¸ý9Ì® à¿Ôa÷ó 0ÿ3þÆ\ü\–÷_ÜÿÏKð;åÿoö±ü_ÇÿO$ïêàðÛÏüGÀÿÇr„8xþq?Ï®ˆûÝPƒÝoôCõÁ,´4ÌÁê}JÐý†HAmþn#ÄEâ¶Ò„ ,mÿ¢¿nážÜkÂ\ ¿7×ÿøîwÎÒþþQq¹¿«ß.ðýJý·¤Ôfõk÷xø 8ä‰Áu?`<üüoîû%µ{üžm CܧîÅù¬apŒ_7*È *ü2ýx@¥¿‘° ú €–£_gZý Þó€ÿù@ÛA~ò/(:ü¹ï© ÿ‚÷T°AÐé_ðžþ/xÏìò/("þï¸þ†ÿiš¥+~ÿ üëûŽþ…¿^`°Øcv fù,ÄîcHóE……;Çú°Ø†uýïYx‹ëÎãD–ò·AßàgR‰ýxó«ŗ’sÔ·Þ» ÕÃßh5]ûܘÅk­7aÌŒ÷Œ¼ß•ªê¦B§äЕÜð¹uöyhҀܦÌåì*„£™CpáþIÁ£ª»èë`ØÔºÖF¹€ æMÑ8G´Þ+ãÀü †l‹ŒIRÚG*4VüC܉ӳ/ø™#wÔÊñl¾ß£yó¼ —xb.'½Jty\ÚÉèÉ I©PNñǽ¥·’”I¦½ >Ä*‡E}°¦2ªoÁ9óUÒ´ÍŠ Œ,n›Êᮎ…ÅZj­0H÷o;èd¶’âgU æßr›åb¸hµnÞ{E•N¼…KôØ#ö4yÂS»^;< 9e–xÔº¾•4-0C–ÓÓ-ì7ÎTýúÎ_2~†Ç"aÔá òÀÞk} xñÃwdDŠöÎèD÷Åž¸î(e?è3·-Mæ³Gæ{ïôûzÊðïìÅ‘) £Ç¨Ø V~Snó¹ëR·k,1g*ºq)‰õ`iÚYwÝ5dƪÈ<“f'¢Ü}8 rIÇ£“Sa”°Û!m/1X¢† ù(X^½OŠÈa"¯·9É?פ®+‰¹mU.mõÚgL©ht?TÑÔý¥nYñ˜NVö€;£˜WÿMn{çàèq›2'±ÀtÙ•hŠ.™ZÿwÚñ8)3Y‰zP/Ñ»$¬•`ºtñ:C»Ž3Ûœþ¶½Ÿîåw?V1nªéãÖºFWŒ—õÕ9eò˜Ÿ¨olPfµtÖó>ÁA’8r0Ãsé(T Ó¬;/Âlñ´Öñ,Xžj³Xz2Ôe.ìJåÓs¦¹ÒW¡î ŸbQsµ-Œ™ ÍnìМˆ2Í÷%­«§FmoŸÀXã(öÒcúú”·dÓïlU1Ï$Øk]KäÁdÿã&jœ©å!΄1"KÆ"â\7Òä"ræ´ |QCÑH™4~•¯iUÈ_ؼnž(´ds!³´ûÃ_”¼‰™.'ì·ÌA&–Æ.ÌTz>x‹:µž¥×®m‚]óVøª¡a:•£% ,$¼2.°?HÉØ1L)Ìšš°³¾‡u–EÆeLvk­Š•83õ0±9PãÓÚÜÂÐ^Lzi;.2Ê3äæÏLsÔÉÖ•ÁØ7ÀáRøƒ›˜­\»™sg\˜úEÊcfaòüM+þ)ÑœE¾"Ô&~šØC,™ôGrO•ÏbŠ[ëðŒg&L ² I“žV—¥ßÌ:°ÖO Rˆ¼ ¬á§têM)‚w[‹6ÅK^ˆœoHPnžãw¯óDm¢ zª/7(FrY|Þ¡Ÿœ¼´ú—Û8èM 3%Ôš7޶oŠÀÖGLÍõ›FÎéuùhœS2\®”z9çTß[‹Ö¿²K¡»sвñUÑ/æ‰7¼O£+Kª°ê?h–‹(G<4ëçPnIèÅ´ Î Ï=6´Š=,´ OŠûûIÜC}¯0gÑi5ÖåCFƒ‚jÀ¬Fž­øqæXôɗݬ‚ òv¤9åg‡ÊlÆŽÃÔ”ÊdפŸ;íÉb¦…i©cÌeÇ;ŒZ[¶îÞR¸–¢b‹en¾éƒ¸šH2yßÐÆY#}\¤¦“¿[«ô°”rÓ–Fç¿Ñ^¾ï^õ£‹ö7{ÂfBõ®ÆrHCt©<yûÙy ÅQ R°nÉzéɪs‰Œã{Qx.àªC&Y¦wüæ&Šçe¨Eaª:¹É¥¾£íœvFó•U°ßUU£yXÌÂÈoÿÆlAýV&HIB”ÿG*¦.–—K~õž¯«ªy’ÚL@Q+­à;•Ö/˜(ûç›MGka Bž€(¸÷>Ynæ,O;9eÃ()y³g7UèÉs·ÐS›ì¼þÓ’Æ\º2dIš–¾hßE¼ÉëÔÅ® ´¬|\Ìó=>˜!ðÆSÖX­ú‰Ž°âÌ¡VtódÜúD!ßôƘŸ?<‘nuÖÈ(ôÅH5 Ñ&±ÊšNž)eµ´!µTÜàš]ˆ1W„ÝcEÿ3y!ÓÔÇœñióoûDšv\ÂW¯¥âÍ2+6„ª/Ûl%Þ#ï̦;Í&’CB8À¸’š¯Uï,b}JÎèœPiÚT¢qT©5 ¾yYà|È4 ³?÷½ Üca QQ±ÖàÁ]( \Y0«OTëÅ•sTƒïZàþ™¯Ž\±´‹<_éÚ;‹72-}TÜû‚µ(<Ä‘ÀrÙvíZ‰ÑîÊFèPmuºÆW³]ïUh©êþ†øBWù‘‘j‰Û0ùMèÆ+ ýõ‹(5"ÖFì uTÈÁ¾ªõ±µü0_3i0†7ˆÙE#ü²Ôº<,´CÕFG Fß´§Â¤úa½h’û*s³ ¿0¨KÓB®F8ÿt„^½)dN4ç¶àî%­j“ Ê­œ|fG®¼ú{Ƥê íÍwVkR¶td=©ˆø‘ϰØ%xñÛW=“~ÐQ´ÝhŽ#Å^®Òõ\ßbö'ö»æ‘DYäÔß|Sh«š§(jž›[,¯NÒŸÁÅZY†$â€ÈÏ…cDÓaÒzx;»³‚eœYü…«¤Òµ«ÚJ€Ôª’ç%»±ÁËËÌ[ŒbÌQóùZÐÇ›)kßgkmœ wµÿöãÙ9¤AŠÂ¬u?‚&o6–jiªž>uA 5Ϲr›&šdáIKüšúzžn[àrÌûçÚMñæJY­±¼Û©Þw}*̶‡} T#›ê ¼½P;¿<|Ì ¢yÚׯMíd>xâ6Î3Pþ¤fe€ÖêOÊ¿Õ"ªá¥z–ú÷Nlú:·ìÎQC”rBé?dÊ è¦³zu›\m&±œPC2‘‘|†éIÏ‘&L×#ŸAŠŸÓ¸~PvÚÌbƒùÙ€qÄÀñ@Y¯'ËȺB×@pÈIjNˆ¦÷ð%û¹­àZßÈ%º×–°Èê`Õ²ÝOG¸ÛiºæI ¶øë,4‹£¦U³ó¦ª]õŸ21=‹ÃŠÞWœŒðãŽiK½­wµd~ø[}nGë›>ó›Y…WmÓ”£ð5ÝfŽÅ6½²ÖÌ…Õí´©}a3ebOÁÙ0~Õ÷¶ê?èFŒ¥í ÚmVéøŽÿÜS÷Âs ‹œ¬]‹\ž²#A/X¬òóJWõv–2FÒ·¥g‰ñR×QV]ð¤´3}÷)¡÷5U r\åS–qÝQ¿QC)¢+M.ÔØ GÊšÄ~Ìâ~Â+Œ]y‹n+¦w´hÁ¨­,-áü›b¶(êãA u¼™… Ñܨ+Sn¸çmÜ$6øªÏâ‰wi~רŸÜvØå¬hðQ´ζZ,Ü­¿oˆFFdËymT­Ÿþ`<ð>v×2b3ŒT~ã\ÁÖ°,‰y°êeÿf§•³VÂrÄ,ÐV *×{XZý§\¨3íB=”¤ ÷.C/R„ÂäÓ{iš¢nu‰e¢ÈƒM¦i)Î3ûvoQ;Îd‰uz EÎ*ƒ¥vu`Ø2´™æ!kðêQZ¶0!¡P$õ¼:®«™nÆNw-5ã>+*ø½º)c¾«’ÏéeÛÝWa -¦&rœ‰ÎãÃÒâN2=÷S Z¹ékªÑã]1ùØ.Ñê,Ü1#ÚP.B¤'«·˜©§†ÞÞAÑ]'‹Ôœ!¤X{B½Lµ†èÕCf +l¿&ÿ8‹Õ-ý‰â]½,¯°#䳜¨Ïêa9gìJ€Qð>}óƒxíÍfé²åjnX;*ÐA:kÌÅ+ôœc# ³Uõ­>¾eg2 ©Èa%19½YÇ}yz6o&ó„™{Ê çæó HNgž¶íƒ¨ÑN‰/ª`€ ÃLcêf€=G©Ö>‚©4ßÅBtP:ÿ̧÷Ù‹•x̲6‡vyï™"v¢³·yÂLìâÁ»”¹†ÎÎ’æÄ¤„2Qûì8ds>Gzd[xz ½/ê×7¼O̪(#ï‡Û!£Ù¨ù4e^®d54î-cµ 'b›¥$/ÏúðtrâX0ñQŒÃ4MÍ}Ý@ô-¦O?vÛEvýá¢;)]ÓgŸÑfÅìi>ÅËŠ¼ {ø?¥$¹˜<Ç“‰in¥åìFiEAË}x/B%ëR–à”ª$uíLWÔ¼"æyR‚2±~lf)­Út kRÏ?!L"e­°[«iЧ¸VX]¿¡~õ:±X#©J© Ø-†¿ÛûðQ=²"³–áxŒÌ é¨\Ï€Ñvè¥@ÜŒFëæñÕÒ„þ0O¥ééE2Ž—BùÞ ¢ž5>\|{ëiÝb¦sG;+~Íic~F.- °‰qÛ·+øô¦ÏÊ`?®†ð4¦Á@Ωòí^hèX¿Él+ÓÁA«@àöVøZ^´*Žœw"õÆåçŠ:ñ¢Ö#S÷aÒ…à¨.ïtF¹ÒW"9öb܈mŠi”Ò•uJ>y‰™~“séåÖ*…{<@ì¾W‡cM=ó ïÕl•Ÿãž=†v.GžÝ*¼I±r×%i.bîÆ0½¤ˆó¡ÉÏ’QšZ"[–A@—Oºµ‘"Q‘Ã|ï×ÀÏFß½zpº€GùÁ/nó›’Ø·¬ÆÂÛ`Ñ){å3í[ ärBH “Fxã8ÖÕùž’‚FYXxQÈ·­ðõ™𔥠®N•˜ô~2T14Õ+¾YØ«ÕTª0¥ê EβÈZ;°ããa¾„ƒeòZÙ‹"Q:¯ˆßÔiÚê<&Þ˜sk¸MÓË…T! “ÎT ˜˜ž'* v5—¼ vÅ eMÓíøv´RK{ ‰²ë7œzÆXz6[£‹ž€¤J¡.\¥à'Æne¯¦Ãš˜«1î0ÚP>¹ƒ ÙÖômP­äB[Æ0UüDç6àCUQÈûH÷i_pl“w’NŒ‡ÏG Å–JR>žÅ§x”¸LMôŒÓ9VVey`døaôY®»…Çqó.q0ÍMH§>Ð1±ós[E²ÜR37‘P†Ä̓7JmòÍTà|fäÜö]w+MµŽ¿Ò’ªný’ +Ï [4‚ÇEåœU_šX”¹ÁŸµ,óGœT®4zÅÆQ4nk¬½­ipÄkÝåÍtffÓ âÁ,8y’:}²›nBxá‚ÅŸò—EÕÂ!0MÍÔȨ>`èuhh¸õ!õ£ÜO¾À¯$ûÝ/V´Òe¾¨˜Ì µ:nˆÄ£nÓçRŽE[ u†²“òõÐ>©ƒÚ8l}a'›.GÕ,ÆÛ’ê=¤¬»q•!µwÔg{^o(Ä[¯\’-D¹'78ÇÛàõòŒžaMæ&‡ïöJpä¬ãlñ~[ViÔßç`ð-Ÿq"5ǯcõŸ™j†%gÚK$QuùE1nã|ÎÏ‚®5‹ŸYs-ÕO„ÚQ÷M¾øqˆH=à=K£Ø ø7b“$7§“ ‘•^ïðÚU¤Ö\6ú¨ºÃX!IW£²TðýTüZ#ÅU£°gŸš¦|Ø«Ó6?Ï…:³û^Íß;5':Ö ‡vÙŸ«H,ªáÄ*êÊzve¾&§!Õyíæ]à:zý)R¬3½ÔpÖ-XEñ=ÛééØº]>Úôü Cb‘òÂi»!bl(aРCôægð÷D}ÕŠf%]" Ó‹Ó›p¦÷”žÒÊyOºs]+¯°‘o®·6›úðËãO#ë èaqòOr•êåì„g'æÎ¼Í³#%ÆÃ°ÓúÃx+¶Ö´´¹[g]¸ðºçÆTÁ?rB‘{ÌçßÕ ‰~¨þê¿Ý3ý°:a‘@Õš²ßû]3@ªæ>æWÄßâ«þi¬ü™ÁÃú¸ þÞ&ŸŒï-?¥ìr§X°I^È©‚Ï”¹á]iÛO~L¥Š¼KkFÆÜâ=Èk ×,šÚÃOk6‰ÿ´|ýS±ùù$õš|’p^/Òy™ëÈðRp4òkîA£³`tÍaFF˜Þ´~˜È#Ø·]&BýÎ¥ §×8hÇÉžKÊ—-©“È¥w$ÆOÇvJ•QÒSƒ8Ó(â$’™ž‹w¦Ú€U4Lk¾"™¡¹µµ²®å´îµZ=8÷Kçã²—Ë£Cñ¿Û.Å'£¿§Sp7O®/Ë’©îèô¡ã"•)ýªqY¬³2ʰÿnþQð@hûì²ë‹uDüdôKôÏžëRMU†-0ž=-kkš-Þkí2›_fã(¾F,uœô/‰HáUúyqøó<ƒ ¨T—¼l*?ÕŽÞB—$[£¦œ¾º Ïh8ͦ.W–ÐV-ð؉²Abf#v#˜µ0E3WÍLµ³£ˆwö%ùœÉÿ†©Eû0kœÿmÔ‹ò¦z_™°¢ÌS~ঊáâ ¤ç wB’WQÓé®—O¾îìDÚ#¦U8v§dž¯ DZœpd¿( QøZÝ]¨}wêÙ¡¢¨k³·OÂlŒÍÓKÕ¯—ëÛE¡Z&µñ «Æ®ö‹­<úW{×ðøÉ.]æ«Ævu’s„ÁáíÇ>%×ïDÝ’íä$øv;ýy5’”ÈJ%È‘áØÒÍÕ„·*Úé×Äœ @€o2ßÕ2. Šxó·5s)Ýjû þÉ´º1x‹vɬ4®_v Áî²Ç´¦¥)[ˆÝGwÝÆûŒÓ¯® ˆûhÉ?W~£…h{ˆqjJSÙ>‘ÿàäû½FÎÑ£«’¯+@‘/NŸI©‹û•'Ï+_´É5"€4áTê¥v-BÖn#vwU¯ ‹í¬Bgì¥Òa¾£ƒÐ‚Wé%ö)‹õ~¹A ÒWàyCЇHçz#W\ z¬ð̱¼ÞÊNêhxeþ˜®sÝÆIÚw'õ)×Y 9|7nͽ;TT´òŸD‚Ã)‚ÖSª‹Â±qñý40ŠV ·3t¦©%fUI½½Å“Û›uSÍÕ:¾ãS£\jŒÊÇXül*£8áj>õ:õ8ú>è”K‰îT¦3óªYÙñ.Ì øé؟Ć Fûô±M«¨3UùK±2Êj¼3ßüƒ,gžô ð¿ BÂÒ¾aËV)tgÀöŸm9Ø|¦óÒ˜Í ^åÝ~“¢M¸x‘cë¸ w¯P¾Ù1:M²SÐSš¨‘i8ÒbìA;éàTÚ—F‡t‚+Š»î‹Ì¨&¹[oñ®ëxˆ•Ä}ªðˆ„ˆ×Ÿz*öèp\¬èä&Ç[ç[ád( æëåÎ6#ÂË:¶¼ÂVs2ændk2iÔN¤GVìè†?È&íõ[wX¾¦{|I’cC;º 6»5E‹ Á;ÅîX{c·ñ/‰ä²XdÃç^ï-k,o³U8Œ=i[ÑfDÚâb‹­Æ2Fì•»Ãz“z¤¦rbwF¿ÇÛ­è†ÑR¤w#Žü¯ ù .è:“qXgÊkF.„„ŽHU.Í×¢šÖ+Kts=캑ÞÚá5&4Û8®CÙÏqØŽVŠ2@Ù·Ÿ.œXÞgÙ‡â00¾Y”;$ܬ9ž±HI‚˧§õ˜(X&gÑÏPw½jpÅÚÜž<û„º©ÝÒ¨ãfè6Yèb‹z¹„À£`‹ˆD ˆ8ÿ™ÀŠ…5뚤ûŽ¿¹ï!]Éí•d >ò:ñ–¹!;4âûËiêúÖA·Dó±^Öõ¨œ6D@Fo¹®V׿«5+T+ùpàSHmÜŽV) É–°cù‹ýšó˜¨|§ùÚf•OÍþ;ÉEO˜DÑ E·:?ƒö·@Gœ2dî¬Ý#•íeM?AJæßI̦RÈ6vAç'Ò„ ß>Üœ‹u‚óêN¨âõŠ ÀÄÚsóD†ŠØ–†$&š1ì–oøÏýhbäÃg_Ç%ãÜ Äç?’¯¼0\׃eDîë¼<ß÷Àdý,}¸äý®Æ¼I‡‘b²Ò¼VdÕÝð:˜8Üèð‘íéÔ&a¡:+ÑO¢°MtéݼI† d!ûøI4“ ]§¾Lc]¿óñ'Š\ÅŠ»Š ͦ´r¡»‘Mªê6“8)ÀTþqPÊmzj»Üs$ªÿ8#} endstream endobj 32 0 obj << /Length1 2089 /Length2 16813 /Length3 0 /Length 18076 /Filter /FlateDecode >> stream xÚŒöp¤k× ÇÉ$3±'èØ¶mÛNÛ¶m'Û˜ØžØÆDÛ'{¿Øó~ÿ_uNuU÷s-ÝëZ¸û!!W¢0¶1ŠÚX;Ò0ÐÒs„dèôôL´ôôŒ°$$ÊæŽ–À‹aITöæ6֜٠?dÂŽv26ÖI'K€•““žÀHOÏñC{N€°³¹1@† ic t€%²±u³775sü8æ?r# õßî+ ½¹‘5@ÆÀÑ hõq¢‘%@ÉÆÈèèö?!ȹÍm9éè\\\h ¬hmìMy)¨.æŽfE ÐÞh ø‹0@ÖÀ ø/f´°$e3s‡É•lL] 쀥¹ÐÚáÃÃÉÚhø8 $! ³ZÿËXú_Ô€×À@Ëðßpÿöþ+¹õßÎFF6V¶ÖnæÖ¦sK @NTšÖÑÕ‘``mü—¡¥ƒÍ‡¿³¹¥á‡Áß™DÿMÏÁÈÞÜÖÑÖÁÜò/Št…ù¨²ˆµ±•ÐÚÑö¯ü„ÍíFew£ûWg-¬m\¬=þ LÌ­Mþ"aìdK§bmnç”þ·É‡ö™)ÐÀBOOÏÆÁÚ€®Fft…Wv³þ­døKüÁÀËÃÖÆ`òAèenüøõp0pí€^*þÁ20ŒÍ†@SskØ¢ˆ&ÿÂÍ·7whÑÌ€þ¯ÏŸt>ÆËØÆÚÒíó¿ûK§"¬(£©Aõ/ÆÿÕ Ú¸6Ôèú÷hèh­m?\ô¼&6ö°u”•@'ð—èoÄF ý1èÄþAL:‰€N@§übЩýq| ƒ;€ÎðôÅ迈ù#ÊÇMbõõ_¡3þ~dü2èLþJ“?à_JóÿB¦¿ ó?Þ,émœìÿ÷abúüHÇìŸä> eæfköqGþcñ!3ÿ²è¾ý?ˆ[ü?˜[þ?¨[ý‘ûÑ"³|¸Zôÿý9›’ùp¶ùõÛÔÁl?.{kK ‰ã?R†Kÿµ’ÿdmû±ˆ6Ô™áƒú…aøàéðOrJ‡+ëõG„â}ì8£™=ðJ¤ãèbó‡Ã=§?àGeœÿ€ä\þhã‡÷‡1~„wû~wÿþÏZ9ÙuüûâúØ™ÿà¿ÿœ€@W ìò‚Wà·ºÀö‡¯.4û“<³$ûj©4ËöNOðÐIÕ™þ›öwI#½ˆk»"ä·ü+ø¯'­ Ð!m ?ž=_ôâ§÷À.M¡þü~"P?€û ‡F™ÿ—ç«§ªŸx+h—$I®;¼|>ʃK¿˜ký@Ùêxð¾¯jV)¸—²š(•Hm¿â9’<ìyLB(G\Jä W„¹Û»YäœŸïø’qT°^¿£˜ =4·£çÝ×+”º±ˆ±41qÁo‘ǧI=“%1=J ×—\[¹ ñs¾P§¬Ñ Ò2fT›+FX7÷Õ:/w2ìå&ɾ¢ì%Ô–6£êÙÊ¡UÿЋ@q¬e²âvš®·ß©ö˜|KÁYᘩÌ}Ñ0;ñméñxn°[¤¹Ni{iÝíñR+æàÃ1ua 1Ó _[åÌÀM,sœëVJ "R¯8'±¿@q{ø_ >a3ì|§§×d‡ìÇ9cÉõ¼Œöªl¼íÜšCZ´tAÖ x`•}7ìJ¹¸øŽeÆ$¢ŸLž—!Ò–·C¦ÀUlœ (£»ØªD§.u׎ßaYº".d–ëÛ_¬ ×öwûöÈQ@{¦Z©ò#–¥@`ïwÍÄa£ß°`@P?ÇñáÎ]y¹ .Ú‘êãE¥K¨àHô¶2[`^X§¢oN·ƒ\š˜@XÑýî|ß'C¢SeAg«æ5ež§Ý‰î¢ê2 a²Âe™©#îÏe%áÂ>¬_~ô°Ûf_ƺ¹rÏ™ˆëÑ$™¿VÁ‰ô:FšU/ß°¿*)?ä¹oô-ÎLìŒMï{XVj3÷·¸X"ÓÀ-ãH w}Ó¯7yÈ#ÃßLÂ[6T\Vpj3替‡Ç!‰ ;˜èQy'‹¾—’enHR¡¾/$dÛqÏâÂiá©rЮÛ@½å*çÑîÖ%Þæ U9þ4õë…5)gÆU,OÁz¨ükz8Öžy5ÉBb6Áâ4¬4#F­Vv:ÒÍn¡A¤Iº?ŒÑ!R È.÷<êp]Lò¥"Š<“HA g-ÒÖÛ”¼$B5-ärä$ˆ¤ciŸT,k-,‘ŸêTßT÷Éü‚øüׄëºÒQxÑESBQ–Ä—K¥PbÏêw?îɃÉ8¸i}ï&î,<úRO˜´wîGVç ÍK™#f¹›•G¾055|#Xú|×lÉ'èpzã¹ZI×ì®òÜÌ ó¸×<Ž?ÄAV¾p±¦µ¶xÙK911=§«@š§£7ˆ;VÖMÏzݹaâ-¼yá‘hoÚûj·µýb–cv&ÐÊл—h˯9¯¯~AüeM¿‰[~%#ù(“£A_1ãìÁº‰™¸ ýгϱI'dÂâ¹OÌRžÑ¢]“Â<¡è¡Æ•ò0ÒËî€ÅÃu[%‡—" îc”£ŸUM©b•'&¶|>zªh¡IÀØÒêÆ<™NŒD< aÃ`I/’2’˜&V»‡ÜKŽc¥Q;ÙxËT0öcºo8ŧå†Ì±R¦ÿ ,ú2Ðû¥|ú£k²d“¯¿@*݈sìçý¶ö…iŽc%)_énôÏþ›gk(å—Ž„_íĹƲÚB-ß'Wäî~òª1ºâ²ÛHÏTí~µ9ñÞcP¥‹ä᯽y:% ïÑȳq$>}œºò%é¯ìšAsÙÞØfÔ±)ëÛTé½òI˜!8æ Z‰Bap62ÀÃ,%Ô»±Þûw¯lpE¿”bJ[³(]¹–ÒœÌÖTg‹¹?”pcò “Åï‘¿¶K¼˜É>5,xìÉ!àSÀ¥æ­Ð Í‹ºI‡ e~[õó7«ÍWb~¯´Z3$¡_N…¤|ÒO?îÏKØL 3¹íË²ì ‘aÌãÄS P”¦ûÅ]†~Æ‚R&”-P°yŸeÉUå1Ö GNÔ¶¤i- O’ ÈdÔÓ¯ŒA¾§§vf(ðæ#åi#§‡²0›¢†´ù†×ñÅmOæðÕ·<·V·ãÞÀ1†_Žá$. Dô?±‰É (m×AFfqJl@óu] ܪâ½Íýg¤¨Ô'd˲ÇrÂ^IÞ* Ä’ª`Œš Ž×*E,ÄšÒðª9uÞ¹ßFñ¹"2z zaÇѨ!ð²ù,ÚÃiˆi_׈"L=­IuÕP$Œ¡ë…Üê/Êòï·Î¹°ÀQêxÛ·ì{³„§–'ôËØÀH}*Kl˜{ ÂýB¬¿ +¶ø¦¼ó´;–Êš^MÎê f9eÙÞPruŒ Õ¡­o0—ÇzÙø'¿J&ôCUU®¥¼ö‰ÐYø/ÈUr´rÙ[æÔíììå x¿û‚ƒLsx´y¶ø E·ž¤D”ó ŸSã:Uý¢-É-M«z²V g*£Ö ZËæ“çÇ´·_ ˜0jƽå;vª…-Åã…€x]‹Ó|ãè kx÷¸èÊ‚ƒïœ 8ÒÙîX:ÑHeöpá…ùeβÂ2blÄÒæo¤ K¦_·­-YÝ@C$?ňÊ5^qK}Ú?‘Ÿø.- €9êœà³1c™OzÐø ±¿Ø@¶< ¢¶2µ@ÚOï'xÃBK§3ÿd¾<ãôÉ0»W–}¨ß]@¼p>‡ ÖöJ+×µugÝ‘AÀ©²,ë³­ÀOZ-æ¥%FC—D*#€cé÷3Y 6¦ŽðxÝ:Üaž÷^9›­öwW,d1XÝu‘ª‰µÃ4dœ½µÖd±Æûí‹#_r<Ï–Í(Óg úkìN´×NTg»Ë„O×¼\Ô>î# Ó$°6?ª7s]Á‡éSü‘†±ÕD]žÍ¦lL߬â¢]UÝnW¦³uˆÜ½1SŠm¯z¾dáÇ¥Ý- ”ÐÚ r„£Y·hU 1<õ;–óÝ—°ƒLYȆÌEHÕ€æÎrtÏ%Xú‰>‘CÁ-EÊ^‡rmm¿Uô>Ÿ‚ÆW"¾lR¶‡så%í ¢”;tqp7ŠÅ|ÑR=Ê7Ûêé'ASH˜-´‘ïèß™F ð!.‹í œfbj¿—çXäø­åÀJ¦¿[‰÷å·ýŠÚ#§lbáïa‡ÙÛ¡Äf|~(“€Ï™º¸jëA¤ŒÌ.È¥–îp¿ˆçÕÎQê\ÖƒËq¾ìÊå ŒN¨õQŠ"ë¬Ó黕E*Ô~ IÔVHêý*JY¶f®Œ~u¨+ ¸3Ö+Ñø¬D¢\/Û&ÅS C¥˜¶ð[˾0ãeXãvåTÃèÕ^»„ó¹0â~I#DþévRTE$ÿ÷õ[äŬT@÷<‚x$Y]#/¨¦ÿ$‚Äò–#IÁÞ{rf·V [?içK®Ù¤uÖçZ¬# ²¹UƒÞ&å¾K2u{Ÿ¹Í4:k=ë$pIéÇûEa ·ehdê ŸjLL3­}W=9—A*ÍmÛÜ‚`‰òÙ³Õ;£ýð‰v¤?¹‰ÊdrÈÝ­Ä9[¯Nнj4$'ø†‘Ïy® ìøºýv1¤OÔ €€kþ»lòj¦©Ë24,ÌÛ¾è' ~7%ïË °´ÊGKÁ…£Š„OøÉYÎô‡ÍᢉþŸ×7ŸÎJE6 ´BýMä]™}ŃrÑ<¡Õ^¸VÅðP5P™oX–¯_~=l‹kΖkA=0$O¦±È>p”Ùò2²Iþ|½nt ? o2%¿)uES †wäÕªÚaŸHshñãÄW$æÐaE% }²r«¢0oÄ w9úÖ{§V!ݯ(¨‹«(h`ÙuâZ¯—»¨‘ÅYÇ"S\ ±ùëlõ<%úG%BãWŸ’gºo߃¶–ó¼6ôÏN„IÕp|‡ËöÔ[‰¡Ä7‹Æ%¾W¶òž§]ÖÀ¹ä_²F+·OFÔ»ùm½æ× ó¥Sîe×Q@’Fú‹urD ¤Þº®^Ъ)j|£w6ú` W”>^ÍÔi‰”`ÈÆ+°¿©g ¿:®–7ñвKÁ6.»<ßg–¢;¸)ë±±ðŠ.Š Z ‹ì³në-çž#„dí7þcT×òúrz±Q®É6´U;°èÒ¡D e²Ö‹lD®lîX»¯ÖK{N~Ž–ÒB êý– ìX»¸Å~»™B?¾½ˆ)w!%ªnœy†>o<à˜ãS¹d²ÌÊh`’%ùål#1 ^pDaŸÎÊV–EŠ TíîIÑ·º´a.ž\¹¥Ù:[Íì¥âÕ5ÐÐwS…ª˜&KÖHú} òH0*3§±_2›ƒ%ErhT(RÝòï9ƒGpy\B端Ã=€èz¶ É ~\K!XÚ¬Lƒfßß[ÉþÍÍ€ #¯!V:?Å…Ç…£Q:¡‚ÄÏ⿾9MŽ ûÇ —ÕÐ<",þ-$q×ÍÍßu-öm/ïÊÔBuuÞO‹”ªË~.Òäj"ôš+`,…Éôž¨{†~óP3_þ®„¿’8i2÷;d{üÐÙ„Å/KÔG{Wµ¶ŒiàÚ R€ÀÍ­}—ór– 5Ûˆ Àõ2Ùßð§ÌÛBØ6‰ÓfrÆÉXÑÐ.¡Xi2R噉ŒÃ4ô¾ºšÊ«×Ë]cs‹Fc”.œïÜ"É·‰!ñÎó9ñw˜‘‰h|½Ç¦®ÃºÉ+Ÿ¸Éç<ø:?5"Xâeè2„U2!3>?–4î@%ÌWܧc5=—ü •˜YŸÒ *|iPÓ|ŒÂƒ,mÔ@dȯb ìAš‹‰Võ§¬5<¾­ê3yZ‚9ãVé·‘IXæ¾úlÕì7¼äÝÎÊ÷ŽþöḢ©N=ç™´58Ô…ó[2;‘³×Ïj>ËØµ}xú\Éîä¶Fl•¼~äkâed×GÅÒãæMðº®3Ÿõôõ¡û7¼ u%h§c.Å/sNñ«ÜN¹ þUò*= œß®¨jç›Ý:o…ÓáV?gèöe¿{@vP†¸¦6IŒÊ©óR7Þ—)÷]]Ì­1Á(7_Yå–&&Ì*õ“-¾v+TÉøtšY¦À{\óÝEqþµX?“Ÿ¯-Š´'·¯Îd¾CV´ÈdJ»½Â?Æ—-Ý^ð1ÙÐó?kÜ.ÕWX5ê6U‹9±è‰e@?4.3=#8ÒEÎÁ½mEï\Àn1‡Õ2TZ‡ê= ózÙBQý2)3å0#Æ}*Õá?—yÔ_Òi“ºãb)‡úî2tòbOÂÞî\ „ÉDÀSÉܩ·w}¯ïªcúü÷ ²†=â®ðígLÔŠ1´b!ø: AÀéó MY,5*ÅN›AÙ÷‘6³ŸZsÅNï0J˜RñXHýÊR¥êÄ{.¦# MrZ;`®_í† Ü $È“ßÛ¿!²H—It5zyšáuǹ ï ¨üìuù¡EÕñZ¡É9y~Ðÿóû@&C×U£¥Ï2°û먾Ó?¶'DÅo|´…µÐÆôAÝÖ¯gtÙnÓÏúyÈEÃ_µª'Ãõg:ÇE² z]°{ à}ýœçþËüJÚ ÙëÛhÍÁÿsAø¾×€+¯sµ&Hè´}ë‡èTzkJxøjK>ÍR÷눤QäÞ–öS|[éiÒá‚gðs)}^€~C I¯~rþÙz׈C_›óØA]í—0Êx´…W…ÑíYC“ ªÕöÎÀlÂOQËÅ*ŸÚݧ¯MM' ö¢cDs§Ó¸ûPÔŸÜÖ[Ê*¦Àž(ÛÁ†MïÞ™ùÔuzc™KÄÓ'ò3¯Òu{¦ì¤6u™©*§×ÞŸï ãã§ØxS ~¿N·ŽÍk+©`#<òVä¦ct|•ºytØ/ò}¶àP¿‰7)(ÍœßyÿùúL…²\¤.ò»8q˜öx› {ªRrU‰ ¾{E¯çòüÛê\Ò™eCÉÏTå¿B»ZÀ ¯ óÜ&Ëæí³:×)a+k …­bVI§¼3OŸðe€ü$»û}ß÷è#Ša¬*&½@Mu€î€V!öö}K—®¥Ô®¡bäÔ,r¡âñQ¯Â=P¸Ô‘ÿ3Ó=9=#çPf‰Ÿ÷·š™þžL{(ïûbþÈ»÷6pëTUXrÞ3¥­MÁkºXÈ>|cPyX`øÎó,µ >QÞ‹ 2œp¶]ên–h2N9·^ôþIûûõ^w.Ž+íS·ç±"@X»ßÿ‹¸Óë»ÂÀëT*Y–Ó°!—+QK4>Ó5¾Ò8gÙ7C¤ÓU’GÉ8h:ÞÑ<¹÷³L\{Õ ¿^,WšV¨v^ŠóœžF_ˬGp›ND­ƒ¼)Q.DjYÒ2óÒpíZY…‰+ñ¹‰›)ün>eÎSþ%ÑsŒÙw8h%õžuúZî Šf[j P~Ì&­¢ÂÍf1«´KõÊ`ºJÓ4xAÖ.^¯Ôp¡š²-"hSB 7Õ÷ppQŠÀF÷Þ¹» ¦ömئ%ÇÓ·7mý Qo½ מ¨p•lÏ2õøÆ¡@1~•DV 8mü´Àƒµ;ÞÎU½g°Þù"J z/ôÙFmB%4˜s&•÷Á˧=ÑLðñåïA·ò›%£"±¡ìþ/*…™O.U¦(áchvsœ[Æßˆ [«×ÐBÍ í†à 3Ûl¾Ð´òÇÃJ‹±ÅìVz*L…€ý*{Úh^¹;xù{ôKÏ7(¡„rúš”Í[µ÷ 0Ç,\(Á1öó`Å-hÕ7/%¼Hfj¯Õ£ãUâ\¡ý^Áô}yDð„sìüÆ0=˜!p`ÿŽVÕ=]õ†5.éÜK-…ï úéª!èg’êFll&lêK†B`ƒÖÚ·J:'„ÿÊ*ŸÕÉVí§SÙk‚J,Á=õ QeÙ„} ý™õ¦‡ÊGíë{º†¥j0P«äu”Ä€H¨Š‡C ´ðÈ„Ý ]TYûÊ> ÷BîÂ`R û.c ¡¯út¡~^°4ß ¬îÚc–Wã¯á™RÌØ”~R4X‹ëj…JûòUebdýèýkOõS3ã"çŒKSâòl=Õx§{j#4u¢#È"2q‹:éÂa;9ÄÈ :—Œ$Ü ­¿v¼›énãíÿ®ñ)"Zò0.²u™Ä12?Æ·á°O˜Pñ°vóbUÒ¹æ‘×Û=E÷ kT´+(Û*Ê*j‡ßËÙ|U“c-£5ܮĿ'8XL9ÐÅ®Â8‚«Zjæ"q\_úAùK‰ªE­ç‹V JàËÉg‹IqA"ÃYzX|o±G8®è2¼á4Ù”Ñv´î›=c›‡G³á%7P¡fq&ë}Øqß=êqx3-t!Ò/Ÿšr@Ìs<ßÞ®G <,bØBý\­TÆŸpB†o5ò!5¹èŠf Åqt猚‡­ÌýÀüιTÀáq4Å*·;r&+äºÃŒ^T¿ÂTF«5àxfàUÉVûÆñntíæž®§åÄí¿s>‰&€>Ê]NnYG~ÂÝ5ö-É2z%óÓ,c)Ë?älJ r³q®a¯vJ¸Ó»ª£ ú ñfçön&ßè:Yà-ÙWuÛA¬›ìá°Òv#ùÏá:×èEþœ ¸ûØüêi#Åû°Ï:ÛçH²ÂߨËß øÐ<¬˜r³g{“BŸÔTðo 2T7]Ð)æìI¥»¬€f©Ïè'×Ãi[:* ûB1áöýT…\¨r}·ØÕaÊȼ?9%8@ÚÆÌ {„¶¼OÔ’š^ÎÔ‰—²ÜhJÊ”É;ð‡³­‡o±Çøƒ±¢ Óży‡˜’$§˜‹Jhªu±;&¹”þ¸X ³AWf[ƨ0œ25LI= qXù’C6Y¶Ù DDÛ¦M0(Æ3 é¼&«³øïû¢+ü)/-/M,ýç^AGË‚4‚þ þ<¦R˜ LÑf±ñi×¶Bϵ9rXúœ<4•˨Ðèc—†Â„Ï:TahÁ«rþíÆ/‰f¡žä”ApVpZÒÄ$?´ÉšŠ¦CÞ6E†»y ( ðÂ'¥âõe—*ž:4Ñf[î¥pÂW@®S¿?¯§áLi2„|Se°ÒiÛÆ™·M±QY4üLÃAœÒÄ›AW¶ØèC’2Îe©9û‡çÐSî˜ÁeÌmÐB;HÕÁœ^)¢=!g5“ù¦.½L §þfó5NúÝ Ð˜ÆÆ>»*å0#ïkVÅúNˆpF*²Éµ&îKBqßj¬º ¶©¹Lï%™ªÚ¾aüËÉÕRÚ¶Qذð÷¾‘±Ú¬bå|a©=LX¯)ù5â䤿ýh®xM­‡^{Ÿi‚'RœÈµÇ%©ÎÛÆF'FJϳPU–„Ë¡y¹g·# Ñì£|¼Î×Ü3uÉËø•â-Šîõ*LÀ}%>Ï„úD`—$X˜ l` “(¼Pê¢R~·$½$Ïôg©®Á°²þ¶æ0GZ:å‹p”<)Úãû ™îAèÊÒl˜-Ï‘$6] ErMVšFÁ¢×m§»øäl(ò>%(è« o°ý"?t!”ïõV‚Ø4¾õwµCŒžW³§«U•îkmY–Éâñ€I qqëÍ͉ÞÙÝÕ‹¯c[© ÌÝí-uXå€P §,‘|m¦B‰T7[©¿AÃÔ×ÿ–7¹ øä‰ï¢…*u4§…âø‡]|93èÏ_ˆÌÐó¶~pç$wœü\aðÁÝ®@(Nʵ>doZr+ñÅl´J /ÉÈhJcÙÅ‹îq¸…¯Wˆ5.}¶ë•U3C«öjá"úGùº`eñ'kÁ{ªÕÞVoÌŠ{8pÇyç|-†;ˆv“p”å$aJ6DCàÊN³ÔMÛ›zßÔ¤aŸ¹@bÇå¦`2¾ò]ž*è Y?&a1¦â2]EÉo‘È x¼X’"„V¯Ë[ ³O '%ü:ñı jÔ±‡«¸dW­viý¬,q¸^@x¥™¿E‚(Á°Ùx(§Ñe½ú‰Ù±™2ܘ~QìnF=;ê¢Íî@–“¥È(¬’•£ÆñK†x>p½´'€Ã¼«p%X‰ZäØ÷Gch×2›bâÂÓ³Œ+µ(…¼¦ú¨Skò”͕þ 2³ ëÀU+©/ÌÛ1:»9ö³¥Ì9N2k`u(ùòY}q#±ƒŽCakmë“PÒ´™Y6qùÌíûlÏ× ä; ²2¶Ü*øŽÉ8zÝE Ú-÷jEëÓ{¦§ ­ÆîF†\Ô óŽµŸEó¶OºSG^¨â÷ÞNØoáj%ÎÂàØ~¡ ”‚îáÁ$㫯—Îî“&,áëWü¤§¸P)T§„_ÍêSn~uFë"ß,®ÝâÀ'ÍåS™›Â0QÙND‡Ó¹¤ãF7~EjaÔAzÈÉÅúšÌ[Õ^Ÿ&)¡ E ™´tA³´;l |{· ©Qcø†ãꀳ׀B²±oW¿øKÝq–æ½@èïõtSª±k¿ PP©FE1xp°B9Ü{áOF[dU<)ã}~Ýj©Ý; öí×e+v.¶B×Àæž¶;©J2Ò_ÖÑÑÞ¹3 œ~ÆèB.ìˆqLáä1À§Ô$QÈ‘™µ^ÙzËì¡í4åuèPQü-/møƒrà2­=Æ ë÷Õì9´Î-׳µ‘,аÐû#æïùç·Xâ²î–¦\"*Äp>Z0 ¤'Þ£æl jb÷%L¯S¹×q1ÐlE~Ñb)F'}jð#7!äôp›ZíFX¨`šòè7ñ„Öjïa9óš¹Z:±æ« ?3Åù>….ÔToã=Þ{{°Ü/Õ -èø¨^ ºwÑd§õÊ0ç é„Ë;l×–ú¸Ï‘¬çÓÃ'PHŠ<Ÿd®y• îÙ)̾Óô7›ªèc<fõÅt¬*|ç¢3P–Hï ŽRáˆÈ-ŽVå[DàðWx>!ö‡}«9¨ŸÅNf²Õ8‘´¾œÁ:ã¿ Kcf×'У؈Nüu"¡t rB«¶ô§W,°%˜?{Ò<µ "šJž·‹2‘àüÆqÒ·cšSHÂô ±L«@xÒAe ´KÕA,ƒŸæ²³%Ëìf^¬P%É»Bݸm9ô="„¤œ‚:÷¾áø 2Òa%ªUGm%8H½gí£p5÷bEbÍøÐšÑ¤õsjŸKÇF[¹ç‡ÈúUõ×¢Ìú¯AÔaõ¢éÑÐ*7Ú½?óHWèÐí ;ë”à ÇHcˆ„apDT°à‘ª7#Ñ*—A4³Yß–©¥•Kí_°´œ1‚+[ØÈÆ4}R·4bÎÐCÔ€ÃXc¬ª'!<ܱ?¬ ÌI0ó`jjÄ…*§˜ŽÇk®vmÞÊõð€P¥šõ¸(ÖY ®‚´Zºu´äÎL®IFif ìÅ¡ñÌ(Åý­C\k 7íùüJ™ èç/éŸóp}€ 0úÙ¾j€kl Ñ­‹‚m£É@¦J îAí"cáAÑеÿ:‰ˆ>Ï,Ü'Ò}« fÅ:'ŽŒTi{‡,xÌþ*”©¿þyþ³7 ˜i˜|Þƒ6OšKz»s–Š/fÖáã½´\ Ü¸ƒ÷èç’Z¹L¯¾ŠC>‰éÊÛZ{¿ÂIgj}œ6cÃ7B¶÷L{ÅøžÌü&û9•lTÖ>uºZ¸ì, )¥S]i˜jí(\:Ç‚úÏ_wgÐÚØv˜2Ës1þ²ñnƒçìRS^М7xàTÙJ€4­­éÓ,¹ú­ìÊžüÃaÛ×/ƒÍ ôëLJ@c/±l÷Šm…Yú˲B³§ CÏÖgXÖh÷àrüû˜‡_´ XD/ OÞ137TÄi³Ï›¶‘BŒ?h·ñbÄŸí] ³ŸUÃ;PrÖH=F%n‹…G&6B³ÇêEÂÎþR¹c* Š.+çØ}UíŠ?ÈOʺÖÅdýCµéZÝ™¬FQ÷éý uŸ[›8Ê | ®SfÀô# Ä™J´„rLC¬\8šÞEþŒIÃ_ÿ!‚ã?Ï Y ³æ *§ã9‘Cžþ\Hޝ jcˆcg;Õ›¥®Í˜7¸³¯›¸DZ·ØP;ú¡0èÓ:u†—6™"?Fõ"tm`ù9qêB`EÎGA¢³&Æh¥Ãƒ—„wÊÏyݘ5¹kó6£-Ïð¶ùÛ¬ÜÉšÒyÊÖ$V[FÚ`Mq.o‰â†¬;ÞÁXr9Dl·2~²¼½:ëªÏ-µù&u›Œ@ nsÈhm%0¢cû®rK©ð±ÚþÓÃ`N·Ù54[¸ð¯Ûá]Øuú‚-ØìfÉzsù²·«aw«;§Öã‹ ÝBbx¸"Ç>¾]²EQEÅõ¾'¸Ù£óüýøv6‰ú8éCÛ´˜ÊÉ÷Y£@g0Kéòè'­"®á3‰߱UMx ,xÛüüaÂÐ7–‰Û·¼¸ÆÓÍ?Ç116ÝÀÌ &?•‚k´üÞØÈE¢ß¦Æn´LŒfãÁD EŒƒx•)?;ÄFó—ñæ–M"aXŽù¥«ö5Lâ\æ¼|Iaÿ¨7?¹e‘¥§°ŒÔþ¬ùékˆÞxȯ+g ?a’g¯Å!@w÷+2ƒéàÕʤ9.>Ñæ J#•Ò-˜ý{ïCÿiëø{åígR“ß2òѨUÝ»,ÑI‰Ù•׋zç€oM8˜s›RØ€É wé­iÏ¡e ¢un/‘-M‹UùºšºDüž¯&K9S‡ýI M/²‰ƒ]_홎¼×0 ÛaƒM²*4蕵ŒÊ²»¬ò˜v[1• §?^é““Û#_+œeÙ¿åq17çû–šRî0à;<¶Ð~=… jýŽqôzˆÁxÚzèfôÝÕc¿%m¿Oƒ_Kv8eÙ„ÿ‰qµ,©?Ûá ѽyÍo3¤5L¸ä ±í™[dϧ)¢ÆÂ­÷’“³cÏ£¤,ÍÓ‚ˆ\ ž¸Pœ˜¡Ù)j¹Û¯L¦wÞMÉö6#ˆ1,4Œ¶Ø1FW³ÃDÛ™B$øt©ù…#)õWS\Ö´L—2¢ãEÏ´~Ÿ…7uJNµ+ÅQ†ª@§_3ÉOŸNv}q‚‹OÑ€˜J냼©ÏÉpÌ0 SP»+rrQˆ¢ð§…;ü_ßGĽ ¶0‰‹t †¸€û€MP»gùsV-X’¤é­Ï߉‡Oh•º}Zœ° _7.RXOËê=]¾“ÿ\¦¶‹ž˜09ò·é˜"¯ŽbG¯ûRNƒO0u5äu@ÑV$ÝÐcÝЋôE‰µåɽ4ÆlÙÖêkýür‰¦u7|õ’I³Lé} ɦu¨Ùá‘îúœ·ÜHßRNñ [=NÐ}·uO†Œü$øó©ž_Ii®WQÏ&(4uoÙ|7þ5êm‹¼ŠÃü˸:?ÞðŽ 3*PW—y6”s-¬ŒãœÐשùkçØ«gûe\&ßs‹Æ öÓàÏ,†ëD_È}EQ¯ó¦\Éæ 5‚RŽ®@®†Éù•ÞzˆM• %1¼„ÖOU*Á k&mÝS ;i—¸€üU6"óO€»ÍÞ,ËÈ›tÛ]Ê­d£~…ÆûxÛß¿8S ÅÓ³3zM™J]ÇYà ­ä'ˆž†vZ¬Ïº¦¢ ÕŸÒÒÖ¤eK}ò CÜSxOg,+EÎ=%· ‹ 3Ñ«7¾o`ÜùÌÁ¶p0¨¹­†é‡¬ÀW0Ì=t˜yÂØdUþ’Ùã©ã§.«„:¢ ýßA ºêÉ¿l§›¤ŸÞDRCV†Ûm²+7‡-æ‚¥\®®ä™ò$œŠé´Ïô½2œô–¯% 5s¼¥¦ •t™ZwSËÑÏïü ’}ž¦í¾ØfJÄ3ïrG4çÐ$6$ãn¬‚L{Ϲoç´¨8¥5­)¬TR¾¼÷Lt¨:”‹V<íÜBf1Yt+8¶/i4È$ÅYø¾R ÈÏÓv´$©U¤¼Aë‰åŽª"äQ‹öeLÙ P¢Xk4¬™NKOz ”_´î·;I&·!´%£$ËTwêÁ!Øx\・¥E–ÕK)^Ãn~é#ž(×9#Ußk\œ;¦ 0ÙÒ¸A?Z3,ýAAV…7€Ìæ„èôhÝ}:­Ÿûy’^ó Z lž¥…áÊÙ£Ž¡©„OÑGån(y ÒV½-Ó­È ó³•9r¼ò”­[¬Ç¤`‘®d>h"µ¸-œ -T[T í",e¨kD{¹­Ô*æ,qÞáë6Ë€Á˜îËNi¾e«¿å| Ð틤áHD‘û½AEô`>ú )Ó|¥±\¢‡{Ê­¼Q(¢ùÛ¡ŒþLÁ;>._xZo™!¢Ä3l·® xG™µ…5ÓçïâǶ³ªwˆ‚c<µV7àØléšx«€|Ùh¯&Å–pdf<ÑþƒÉã/ZÒ?4 /U=fï;ÇH=`¸pcR¨‹‰Ü0MF ɧ"OÞÌÓààV`‰´ê®mÓÓ8†,´"õ>N¶jµÕ„3´Ü.ѤgüQoBî£Ü÷ÍoYa¯Ø:þÎHbLPi¾e?™øÌcè|ÙÝ´{õFjâï¨Sgu³lÎô¶—e@~¾`”®'kzg!áñËÖ½Ub†¡‹û×ƒªŠBs$ä¸týÒN NŒ¶\ÕV{Kc1¢™Æœ§žC8䨤øwˆ+ØñïšÄíXOoú6Q‘&oÁEðiÒºËA%è ÆQ0Q6¿˜1ZÅ…j%æÆqü} ,î690¹Õ×û3iÄ£ ]5ïíQç÷m×ÞºGá7\*=ЙG ~du®OÆY&áûò,‹£ãÔæú„7{ë <©óæ{د7ævtùL#ºYpt³|7ÉÖå‘ ŸÌo'ZéÃ$@ªˆSF¢‹Y9U¹¶ZÖÂQý’§šß¸»ǃFÊ(?QÀízÕµáI ö´`Ù¶ðmÓR™ÀÅ2¥IIçNeµüä2/{ÿ®*8Üeëö8Ô†[\#Ú'jW¸­”ë ¬qÑËþ‰ñ„ÙQy-2†¾+ïZTkú‰¢n»z0·F{ü¨ñK¾fÿW¹…åκq:ï[U+K­Ah’—$ÛràWÞˆ†úJ<õñ’ÕÐ R±½žø/ç4’íw‡âNŠ—hgYmF_'»¢¢Dñý-Í…s® j| ífS˜gi‡J–#Òñr¶°º~*E³`‚Á¢§Ö0#I%Ê~0çY·Éú•òQ]B ûGKDròбÎÏÉ „qÛ/à¸5<;Çû»h½rTÔlö¼‚‡095«®y^ü™Y˜Ü­b|Ñf”¶lˆ‘§ ^BO:ô{Ò™G¡Ÿmö-!Ý–sˆÖØÌ;#:ÕˆcnT%$ÑJõ¤+ûG*¾¬)²š5ƃ˜êö1¤à  ÷°¹ë‹S%,GÖr9{à¯OsúÐ;Âxbô çYêöˆÑžŽoOZ³6+CZ¢½”3Šï/\ý ¸&éó°MO-»µvÊØýDÍ"µ_Ǫ´ÅûM³±Æ3dØäÍÔ†Þ½4xêøðÜ£\òÄ\o13>}Æ;( W_u¥e`NTøæ;L»XÔôÅÎmæÓ·½vtå'Fmè$ä0qPV+ãyZpdrÈÑ'Ô V ¹ïí‘Æ'=>¼Öò·™Œ.I8Ø Y¤óÉ?þóÙ1Ù˜ªLEÑÍ{3bÔÜü~{>«pTåRáå»°:Eì3œ0“VæEà›¹–ŒËú§D¾1Q[µzD‘ë"7ÓO9Úá^Ùî§°uËÙxd¾¾__0&Áï Ò°™šÕYt_˜%ÃsûÀ!0bçZ!Vw§Âé/22:ÍÞñú&å i CѱZNösÙJô—Ia \«vÕ+çe÷á~DL 냧f¤N+µ71$É(ÒTÝÜ9ËxûL%*'Æpç×déØäð,ßèïÄol†Zìš(íÜa¿EšE\ž~ÇOÀÂ>.=±D3wgŽÌ#¶w}Óh­'¨ ‰¾Qqe ‚@‚®?Pª¯­öKµ9"5=É ˆ°GoYó¤Ì÷¸~K_ˆ×L%ÁÏ"|^Ðq¯ÏrŽ‹%hk3G;Q¾”ëw‡ói¼Øv-ÖØBÝÊN³!zªí"«oiA7Æ´F½I– (šJEÜäH}úëþ™«ó…rŸg 'J6•¯¢‚±·"ˆ_—™”©¦áöânVBN—zàAÝù„÷ì žšÂH‰Ã6ækÍ2ö¢üÂ\˜Ì—º¤*Ž›t@uǨډ.¶ñ»ÓÇ2‡´ø>(„ktLÛÈ£¯;ÀOhb lxàjŒQ Dú tiNˆ«¿![ü$"Qz¦ãò[ó~¼,;ïx!R]°ã}¾o+©îŸž³#êJòqÁ”šdÕ½$~˼ű8‚ƒ[À•-µW`4×¢ô˪Ñmˆ[ ^#Øn¤ì`Àpp´¬3H¢IŠÐ¶-<­Ý*öó“ÎzÁ\Çè*™¶ëÜòäf‹©ƒ@0òÀäµÃ™_lÇÕyúRšr–ŸHW¹›ŠÖ\tîLgÓ’ ëòŒMwQóÚdØ>:J½àô‹^îTÁïì ®ZHèb)äUNYžùòxµ÷_¹MeMâüoÃÖž‹~=úxåÊ9©o±/âȼú)7â"s-Ù°)²A W~úN׳ÖTp@”º2Bž–[+‹ÏK¥=—«m_mC”i׋nÿ4ea/T‹¸Ë)Þº[,Îp•Ú@’¬9 Wñ)‡l¦âqŽ^&lU” {zûǼ;ôE×'¿¸°Ëtïc×väCã½”·Yx§¼YˆœnÊiÕà·>#™á6Þ{¿g fy^u§«bJ5+îøòøNm§°7Ið/A¸ÒûŒäþÑm—Ãæ‡+¯É1„¯6è“}¾›)8^Pô 싽€³Q–m×ÿfÉ2—Î4o)”´.‡;0 !Ë$<Œ¹ÊŸ%åñ–¸çÅjΈ¢‚/¬Í¦Š%×à »h§Ìò% -°æQ6E,ø"üNòG]M$:a¡üw™´ÅÎ|å¥ÜœûÈÉ]DI0ÊóÁÇT:JÒ P%§©ÏUÀã=, ˆHÞm˜öé|±µoÍëu÷7Qº‘§ìÉï£(xš¾ìÂðT&Þ-Fx6ï“]¦|Ênn‰`áÌ|r“2<|QwqldÈÅ6{T2‘¹qQH²wéµ[TêÆ O®‡p¥(˜gvT^7bXºFiÜ´ãzT_ò#äöPL|×µ©*8x&i{@žMgOˆ*LÌJæÆöN»ÇÝyÊò°êçs(„<8(jê÷8úÚ¬ÙEÏ¹à“ þg<9-ê8›úÚ‹^ôÇ9~ž®½‡4S_ž¼?µ?‹x}ë¶ÂÊÕsÆÃ9|ýF“V@æ°’ªîwFÞîv‡a¾2rë%~ü”pÁbç«”ôAGF—þç4õ¢§¢ ‰IsFx­å_ïkâJµS)“Tª‚ˆºo·Ê: áE…ñ±(¿›Ÿ[›?jƒ6ÌúöÀE¢/ EtŠ7z/ßtÑEäH•$Fw"}ç³]cŽIúCábTÀÓQGåm·ÜY¬Þùé“<äj×QÖoï‹âÈ‚'T`‰0­ÊR™ì•C4›ÊçFp˜Ó?^¸SúùùÁ%%ý–öYlåYv0ŒÂÃI°ñàñ'×9ý ÊVa´j.@PÅXÌ®{þÇØsS]·³Ñ–Äëw?ƒ;-ßPh?<61kåŸ$}Òfƹ‡RêB!ªê½«=Úö±ÿO"Ýú-Œ·y±ÃÐU­ˆI{PP±ãØjă'©¢!åmäÑŒÜ5#ƒT|4~ w>_’Ñ"ºâÕÚ,Î0W‚¯ê,ç©d‰>¦ã«þµïÝ &K !×ʈ «÷¼ÝJå1÷zÞPÏ&ÁV¥©¬3ìäÆ*[Xc’9œ”Óãx¹ìÎPIƒ¢=÷÷6@\c'Áaé²uëJÞå-µß\óg<¿ùœP¥‘ïÆ;Ü‹"Øy[zŽ¡åÜ?.„þ׿¢ïÔejm4¾ÅdÕ•IçÇͽf‹{\7>Ê/JîÀõ$CÓa©¸£“,í4´¬N6ú)è/ePyºÒÐ&•i»‡K*ĤõÀà‰â\õìeLt˜Ì–(æb~Á­ªZžQ|V´º’6ïu÷{Hã(Jаhâ'¸‹¥ÅµOeÚ÷ ¾‡óÜ|€Xer81mŠÁ5F~bSE7²$Þoærc‘'Ól €@y¼u9Îj.r+âIcý _~ò2Ù¨û—›â4Á†îIÿ“twovè,pÖÚ ã³.Áú»Ò  mˆ †µQGh‡Þ*»šüL€í0ä_ $šmaE?FbÁ_’ÿ½'"}é„Ï)øÉ€ ÇÂýh¬Êk}èš·na¨‚¸‚nT’eû÷õKÁÑ…—Ñ]¸ìVØ™Kš€+t»ZÈ*ÇpÂh/Ä ’ÆÃ`‹nþŽæ/§‡Ë9c2·\ð?—À傈ö=zú¸ÛÇnW±#Þmû;¬tO›Åò;¸,‡nJ\“f]óó"ß·LÇn³ü…èÔŠ9¬£ß`g¹ }þЕCŸO€ ƇŽô]êød?¢}¥Ã~­ˆ4Å:ž?s+–êU¥v^—,Y7i9Ù†PÔ½œ…m)ö2‚Ø÷‹!š=®°èVjåL$u‰7@Çÿ­¶«ÂkŒ{ó†øi§ªÇj—Ô5—ÞÏœ&íatÁ?6ÎìÍ<-7o~­¥ðܩȱŠ„3ÐÉ?}‡hœ—9iž LÛ(sŒ<–ŠÌ\Rù6çHË” €t'hê='¡CÁ¨,•ܽÀúVI>ûÆuú™º|+â‚9¶R«—M;‘x NGÜÆ?ãžt¾w&T9~úÒñ‹´ËU‡ÍäµíÄ„u&(µ…•²²$HÐ+,ž¢#ïq.tfpW,° ÷€êïN¼S5“ëÑŸ ,Ÿ“\pùþ©19Å‹‘^z|¿ *4(wÓ ë ñ¬ƒ¸aÊó~ç4o‚s„öôœðQ[íÁÃÙ<c^îcªv#?Ú'Q¡ZãgŒ‘~xîâê Ø»¸è$[ >ü gJ’×û\¼Å’ñ¡&sPìž©1ÖÜ-_ddå1!u{@´Tߥ„ìÀ’åNÂß~jš›Ê„~ÿ14 òn­01þæ:(7ï´Æió¯ÕÐ[È·ÒãveŸ\kdI‡6©ï‡lÊÚ»+ùÓê ¾bì_y endstream endobj 34 0 obj << /Length1 1574 /Length2 7755 /Length3 0 /Length 8786 /Filter /FlateDecode >> stream xÚ´TÞ-LHwHÒ=tw#ÝŠÄ0 00Ìà04HJI#Ý%!Ý)R""!€´E§ oô×ÿï[ë½5kÍÌÙçœ}ï¾wŸËÁjh" ì€°‡h à(aA  @UÏXXŠ "¦P ò'LÀaAz@p™¨"! S¡Ðuz8@ÇKÈKÊ Pú¯BR ò‚:ô:8ă€Cáî‹„:9£ÐËüõÀ æKKKòÿn(»AP0Сœ!nèÁ À†BP¾ÿ¡à–sF¡Üe„„¼½½An‚¤“?ÀŠrC< H/ˆà—`€>È ò‡2A€©3ÔãÜáˆò!!4ƒ‚!pt‡'Ü‚ ˜hë Ü!ð?Šuÿ(àüy6aAá¿éþìþE…ÿnÁ7wÜ w8Ba€†® ÊÅÁ~‚`t?È …ìÑ¿wh(@hÊó#¡î(A(ì—D¡_4èSV‡;¨"ÜÜ p”Á¯ý©A‘0úØ}…þ¸YW8Âîÿgà…;8þáàé.d‡>ò„h«ýY‚†þÁœ (€8””@ >`g¡_ô¦¾îßIá_0ZA ¿;Âàˆ „:BÐ?þ /…ô„úÿ;ñ߈@Xà£ö'(œàv4 qü#F_>ê°¢½' þúüýÏm/æûOùïûR3ÕUÕ0åûCñß9„À_@T ". –’HŠÿeù[ÿ_Ú£† èŸ{þC¨ wD¤ÿ€>»¿dxýé î?'†ðßôh+CÜÿ8ÿ!PF ÿ?ûÿwËÿŸí±üßœÿ¿Òð„Á~§¹çÿ?iæûgÚÉž(ôTè!гÿßR È“¬q€zºýoVBO‡2Ü ö÷1B=4 >C( ìü‡…þº4= ‡"< ¿Þ€€0ø?9ô¼]Ñï‰ú®~§ èqúï’êp0Âá×܉ˆK@H$È—ˆ¶—ˆ¸8À_= ŸßÎ Â(t -/àˆ@üºQIi€Á/èw$-²ÿ'BçÀGbbè=… ¿a´K… ‡â¢!G¨×?€0ÚýBˆÐtèÇñ_i4#ò_¡@õº匄ü‹ˆF¼ÿŇެùðŸC{"‘èÇâ·mÑ'öWüûe‚@| `‚ùX6Ü¥!¼ë¼N™Á[`óüǦE€ÿ<²Ûó’/•§6'tyªœ:ÜG¶´®Î}¢´Àríÿ¥½ /²#ŨóGÀ•m’ñÄf'ÁÜ{š×ã%_”™ðL•¶®˜‡¸b·cöèp<ò”"1,¢<÷Ðôi¬\˜Ù4Úª•¸GxU9)gû0¤lš£Ð>÷Ý]\”Óm^Š}Òé“Ó)Šüñ$>‚À¯q¢¥þVEâ/>ø-W™Šx¼ºÃ~çö Åè§¿ÊNší¬yé r4ýM÷ØšÛ3aطߦ¾ñ9r÷І“c\†û6•öÓØ•­d·2Öd\±Üý%íCÉv{~ƒdèL²QܘPz³÷2¿Ño›ºÁ’7ÒØ™:µ‘Þ/É„™ßÈIU¼é4tGûñáxyd™ª¹MšÄN©½;ø“SNƒwÈî²)ëð’Ïíé¿É(¯Ýu^Õþ18ñºgkÌÃÁíŽ f*Gss¨üN]Gj¾!ÃSšÆ\&ÏSévú8¶Ôœ¬‚vÑfCÂ![ë†Í/„<Ùµ;ƒÞçQƒŸ×©*Í*o”k« ¤rÈKðµðâ/Z±"ׯV‚Ž€Î³þAArn¸D¼¿æ§]FP?qý;4íÍÁE#ƒ´f¨spìãñoGÓ^ÕÉs½¢yVù$­Ïd¶%ä;˜Áú|äQo&énºäRŸ¢Q'M¶ÖÀƒižôŸ%|ôÑnF\”ÒksÚ’¸E ©M.µ¬‰»,–À⃑¶¬ ¾ÏãËÖ*»iT“ÄŠCÉNe ß–=åç 6­•v¸ 'Ò4Yâ‚»ÐT¾°Ø—:8>µD2½Å[Kã{÷·Ç†6¥×¾ßEíÂÌ.©ýX+­¹"‘Š?yYVÎ?œNp©kö¾îQÂé$"‡»f?öÛ|[ˆ,68Uèÿ¸®“Û¨œÏ“÷.ãE¤Õ>ngU“Yt¿ü5Žï^ø µû³ý6ã|³³¶CJÎ!`WG9eb(WšÀjvEƒeêJûFÙ‡w´˜}uɉÅ›N+؃ñ…¬q¯9Æ7³Õொ¬°çqzóU"N”;‹‚TOL$Sè.[¼ÇS‚xÛ±KUo¯¤™ÛSIÚ|rÍΫ8Ñ‘­è¿zÆ{D<§ÉøêyÉê|@vòt?s”YÉ x¬f¥h‡d¸6´–"1éœ%c…/2¿Òü>?‘™åÁª—ÙqÖ'X—aùP‰Û~Çì‹\& yÎ.ÁvͱN|¿GF¸-SñhCr&Žo|Ð<}€¿qhQœÄ@SÞHºJz‚¤‹ö=^mdð› ‘túëFUôUÑM†’¤¡Ò õg1îdÆ.AyÌï€1»¼Ig.÷ªÉu>ŸT¯1ËÀˆŧ£äš3¢äjL2é¡6- Í…Sù‰¼œíbîsÈO>qWkâlæ‚gÒlW¥ÛÑøMU˜ îhàB‹À#i¥Ž‰ÈÍG|¥úΟÏñ Zb¼õb)`*éCjî<9W©N¼ZÙÔJÉ!-¡”âV±tã-ºNñ—ÕSÁ¸3›fÍÔ³üŒc¼Ka±áØ”U1 –M÷hº0}¢÷V¬œÕ8”‰Œ›ƒìAÎÜ8°L»Ç]ëÖnï"=ŸÔÝW҃Ǵz¾³°ãP¤'5’b:öÖub þ)ÛEèPŠÛ¶AàÑ·‹\¥˜­x¾’ø”¡:ó”ƒ~ð¾é —ñqì½Ë$F>bF˜I¯¨û3c?EÆàg³Ð¨Ý™RØöTþTü&5õ°X[|Ó ’p¢§£oØ_Ü}¨Ó¢ÆWN rÒh=»s$÷Q7ý‡W€Ü7 ¼iÍù %TÜ#ˈX…µáwmÚjŽ:nfËc¯Ô‘-É@á&iLØ åÚ{ 5Á˜,¥ä·ÓÒ¬SzÉø².WëaIǶÔG\iw¾¼]²så5%jᮩ°Îë'•7ž°êåV¯þª¬Ã*ê!ƒáU.ú¼Tý¬O®X» 1ŸeEe5óà†ôlHoÐšÔ ª9PºÎõÓ'Û³×]š ETÚ ÒÄÅ!Iµô£ZÕÚ¥ü­x\«¥wÖÆÉaE,Ùá7úŸéØ|@ø#¦y·Í7:¹[Yuš[¼ôµ\Áï.gµ®õ›]Ršl ®¸ &ÿ1.¢¦Û$n‹œ×ÚÜ­~äZV+ÄŒÜ. %Ûq«5äHyê¨røÜ“öʧ`Zùüe0c¤c¼°èê¾Ã2w8¯LÞ9"ÎÁ.ª¨HYïÒÐ><6B^’¹[‹º•lÍÖ\ýæÄ9<)O¯&ÝI³w œà5PÇO$®73u¾¼³ óê‘îd°åÁ¼˜¾3Êõú ß(w›^<þ‡®ÃæO“ Ü G†P`U»ŽŸ€Ùñ Á5RâU÷•¹¹v“£„u²yˆèk)ŸMÉÀÕÝãã×@È‹bÖ^|æâyk+6Ïô2ðÞýÂZ¾f‡ðGó§¯)€ê^£øß\SQÞá©‚žbC‚,ÕSùâpòç P)ñŸ¼[¯ÃÓ}VáÝJ,½ê?°Ô o: ìTÚ'‹_mÚàó¯@„÷+¨Ï ‹\ÙVk¼{ÝûךnÆRú¯×P͹4L‹¯Xm…]SÈÿÒ+¢äuþ”I¥Ck¾¹–¤îÕER¿ö8¹ÿ­] ñW³šž{±ŒüœBvXêÒ¿®N\Úx_$¬«R÷bœ‚Mg£³yÿÕÑÏþƒ6&wZZ õ€ ãå ò¤{’tÕS·´…˧]Pý\ÃR2BܱÚyš…ù x¸#Í1C·îDfË…ñ6T Oç9>ys.!o壚‚j;¥{6ýúµ_²ÞzþºIÑÔï±ÔwWŽNÃ5ó°¶—uJÂdŽЕَ=¢®Z¨u§Í¥Ý&•Y/ìs1ôìð͆]®ù«ÔNuu¬üÅ0ÉÌ9‘êbúP¦¤dƒ€ÝÐ<û­Új=¯¼ÏLŸiŸpz ľ#ª‘°dpbƒ;ŒGZ¥x“o„‡À¹ÃæãÓÓ–³2Û'_Ÿ!DHÖå–;+ñ±¢ê‡ˆ{I±˜#}ôµ{lº«­ØÔL??˜!» šìwh] Mn«K{Û›`ux ªàù%®Íd½ibmÎqÚÇ*™¹¢’('[]³Ç#3XÚ“,è…I‚”ï®À-‹F„›1;ÅžÀ“Bî1õ¨ Ðè+W¬ÉKÓ:‰Ë³°ñåÆñ i¸YÈSb®ë]@IÑ’êçÏhÇ«„?KΈîy‘UÊÒÃ’H7Œõ'ø®u f‹UÏ૤yuSJ‘7nÆP9üç}HQ pèË +³ã§ä¡œÎ“N js†ŒÜEÛâJ’Õ²f¡ôL 0Añ¦pÊœx¾o’T#ƒQÇ ®yÇzmÙñ|Y{ÿaHh.¯F = ›"‘!ÃV|[°îÕÞã4z·þÇ.ûÏr’okx1š¿°DßÛŸ$Ã{Èu¿èôuüñƒÐ˜|Ê8¦è¨™€- iN¼œîA’ŽHIÒµ–`£®ÇðV€®x´Åæ7!«¬nF:«”Ð`cOH핦æÀ8a©Æe­‹áÛZ~‹íg4Æ 5ž’Mˆ¿vž»¸Á"b²DóY—öïH#“ÿÐÇAñwÉì<¤XÄÙéÁ·Ê/ÌÌ2¯ Fd.–“¶‘Ÿ;(„Ǽ¡¿=B2švAÌâÔñfv…ð*½ŽÉç#o¼kÄá'?À^n†é)×J­#a¬™~:Ò´4éåöq£‘–ã䢿3¿q’ʺJÞP50üjÉVdihÚõú„Š’óËk,Â]YH½¦äl2N©vÚyl7ÐȱW¨#é?æË•½ì<«É§‘ø÷²q3‰pê`Q™M—ÄÈ3žÇ®©Y£óz\ÊOËT;Vôl/­#tU<Û¸½3Þ r>hêð’îM¿4‰Pí¨ú¼Fô”Bõcƒï)é+eÄ~¡Ê8s¬ØX¾ùXWÒAJNàDp0QúÄLŒ‰•J>ý&õ¶õ[xp}ä›"q×Çd~vçªy»ß}!ërP§|ë²ÿ‰ñÖû·Hê'½õWi¯Uë“\7})_<þè©Å¶Ë-E2®/Ùð"]Ò¦e&t’ÝIê9ÒûÏ%ÿÐeÂO‰ 3ñÖ‚»ªÕ¿á]~9ö=Ù9–„—ç(‹*ªŸÆ “å«`®àl†¤ã€ÇÍ ËùÚ͘؛òó‘щ5 ðÄë¦mq»ÑÔbþÕ5¡é}¤¬¸"½ôÈÜ>©‚QŽþ¬æ(^XÕÊYN’Sz„»¼Ä”-é›Là´Ö˜÷Û&O‹î©R¿€lÓѦusm½õZGÞ•âp‰>j¼QðvÍ‚\zޱø˜—€w ï¦é\BÔÅQšp¨yÑs"h¤âFQ¨ŽŠã“‚;¹_˜ŒŸcáAý7´ØšÄœ ¹Ÿ`08 >î"z)0?ûùI÷•Ò9wà×lº«è-Ó\SB½ôœpÃêúP»=÷é¨B;¿XÿŸ\Ù9Q>DÑ{Ô|YÉoiå¾Ë¡f“¥õ³æ{GW`ÚZL˹ýò{ÒºÑO£·hOƒJ„uÞUVðÆÍÖõTèZe¶Äyð‚N”滹:z•«J- Q†GK›º?PJ°!}]^•to}!Ò’j¤û¢Q²¡Äýq+ƒÒ6±uï³â‚•ÛwE¶¯>Åé@þ[Þ[Š¿ÆÃìÖ¥ÛÚŸ<õU´H¹¾b6îÇÓš[TRDzZJLC²,;„‚=Î}Çr³¾q/J Gë¾Úð˜ÏˆÀ=óĉÞ:¦Ý®ó*Ö$özXB«z¨ƒQÀ¹òÊM/šƒáÖzÁh^ÖÃ[Ê=½ïG%ÝU« ŠuË(JuTÚ'§ä'ÙÆ/ŠÝn$dÃâ«ñ½ ?ñPjÖ^­oÒq68Zs$ B‚Ú7×é`Ž]Ê®xŸ )†gòŸ¬5³¶(EÙŽ·6¬ßàTYPqn—óà°]¼› ®ËŠùÁWHË>œ(²µÍ¬PÉõóºµgÇh­º;d æÛ ™ˆíoÂá ¹h®ÙÔc¶wEœÎ>{óñšeñ(þȭÜ ‚¿ÔÔªë·x~¾Ç5ˆŒ_x9ßúNž¯@peÛ<ÉÏü¼Ïgáè}Y’wŠ|MÌâ‰û,{!£™?“@lKùD¨J4à ?6‚þÑBAfÈÎ`4àÑz´CNáǵw¢»ôØSýìkŸ…Ž&õŒ/[ìbVk‰*d%¶ô.óûŸÝxVZÕù]ó7¸Ó!Nô™0uÒ¯Þ)­m½3á|Á±AîÇ –0ª5KOª¢µF’݇ÙÆà2~e*-L·g˜R†¬m™?¶6 ˜ðfú­ZèŘlË×%¦`Á0—éÃ&]³/²Ä݆LÇñïÄ |8gQ.žÑÈsm²x²¾Óॽ|¶5ŒÕJˆ]hDñ‘â(S­~úóÑ×s´"g…–,»'Iù ¸ Ã:îÇ.†5mo†H š5-`©º!ŠX™¹‘ÍûÏOo-'UpöÆ8{ž`pv3+cF°“ņÆMs\ÆKƒÝÕä¾û‘hðSåÅõIsÄÚWœáW½T©“d~On1Ææ§óÝMÙfh£Zh «4ÿ¤“™|²p§9NXs!ÿLË'æÓ}Ò®]Ó†±É؉ýî&±¸/zU É„bKKû@À¸ÖÆSþ~ªõØ‘о&3‚[|«¦lvWvwç!ø¯]“r\E”³69Ãl–wîûMÈ;’Gï¦ñœ;¹(/§pùDÚ«:ÈÕ®—ÚLÆóO±’öz}Øt›#ÔaMªç•«©2iÀzÓ‡%¯7*hÉdµh,ºv©,§æðåî'/ |õ“d«=AÒÂwSôõCÕ˜Öû¶Yœé¨c‹X(öïm+ˆO>ç¾·vI=¥À‡Æ'ÖéûA©œú#Nnü{•ß­î³´u=;Á¯b°»"M~–t0–ÄZZ&Pqbl®‡”Àw`'w‰;{á]¡Ï﨎ûÆÍ!h'xzHŒz•B`Gwð&(*oç´).¼é …ûM,BŒsWƒÙànT ê°~ÎGÐy÷yxòꓸbø€cr3oÌ‹§{¥«´úIÕ‰ —Œ“‹½;<œ ú}\&b’…Ë÷†V‰“´;&éáÀ„õ«\{‹•BÖ"ý¥îóÔ þïÀdÇ„.XÂ2¼sŠ@]-ލÉoG)sPwÄD¾9ýÕˆì–|ñFÒÕ§Ñ\‹fl)æ$7U³¹VÙV#ÔO†õ\«š˜+•ä.¯³šîc‰±¼ÙR•£~ŸûN‹ØØ¼T‹} æJ "¿^hعx ’´äõ ›‹ÊdŸyYÉ¥Õ~ÆŒ€Y»ùVï EkAæ¼F—4ŠÛw£8!bs7Ú¦¡z“Ð}Žp>Ò¤Ó¨¥ÏίGt3µ bGÁ"wß;?f(Wí[ c~F«ÿ¶dÔðœ’É‚ôpØ”è£W*v9*6hn4¬R7 TJ£½-F³f3ÜGšwÑú6ˆ‰öžà³TESFÙðiñQ <{vSQÐ"õ53ò..v›ñ5Aê]!Å'¿õÉÏ{‹„xKiÉBÄCO4f,êÙ3úgÖ„ÏTY±ò)… dˆÜÕ ¾utÛ ’nwke°lÎHÜGz}pïî!áÖ$e´Æ8¿÷þ<×Û³±ã¹ÏÃížûV”»ÉñžÇØ£.¶-¡ó£œ´2¢îÛ™Çãˆ8ªM*[ ×5+™ò’…—%_çÒZlÃ}¹Û}øFípHÚó¾¦Kï]üOÇ,œûëÆ¶®]_ŒPøÊ’%›Ô`µx!Óº)Çm¥Áìx˨F-»ì÷U =—Á¢ ì â î$ùÙÈ.اž4Ÿ†”0Oç2dmTÿ+γ‚ÂÙ #Ÿï=Þ4³„YËF¨[ánÚ©”myCsÙ{bªZϘÿÍÙÊœýÄ,JGœ_3V\:k11ŸõöY^ó[‹žlF/Íȉ*æî¶Ij#~àçÇ2zd±+†Ü¤³Mäw;“«7pÛ‡8iLµ*‹MÎÃ)gâÏn—1‡˜›osÎ&vT ÂÖ)¢XÙ#JcfàdðÕTŒjë"7O-Þ:&*Ž›ú<€ ‰\C ï k@õÕ»óIêÌqF×—66›,ó#.Ûå…­Y=†´p'oyOÙUªj–Άäìk±ï@³s_µxÓóFoè&{p§hj¦[ 3¿½†Ük‚5ò»äì–R”ä¹ÁÀvÎAÔ´iŸ¿€u_®J2ùËÝA­Âõ¥àº_ëi‘©W—ÿ°x ÒR+^8Pº´‰èÆzý¬%öQ‘( ^¸ mÈ: W£X>sµ$I»0 °$æWõž¯îmb·ø~Oµ÷©¢øb AC©ëøiµé•ñ!ýç‹ÅO37Å…tÞ^déÓ(MÑþ‰Uu|¼\ì>o-^Ürõ·+ªŠdG­9bÃL¹kĤùÔóÔ…#)3¦tRÇkßNr·Ôe0îž~ X%Êœ­(•º]SŸ `,èH¦}<”'ftM½ññOaŽ%çÍhÛwá®'ýzP‹Tà6á'ùÕF »ŠÛ ²âãO/ÆóßG(D9ŽQf¢ºÖ[÷çʰ¼”I’!zÜæy/åµ3R{ªœøŽS+ú¾VåƒfîšÃ¡²¶‰J¸?Øžç®r xøìý:9´Kï4l&[à§9jîlM¹öFe1ÅÂs}QË}«8ðóâVY¨uîR¬æc¶ÖÛ+c‡0ëóWÞ& Ò—¹²æI½U\y䬛L«)ÃB3ùÆäÄž£€‰P²Ãü'˜Í²ü–~Ó"."FòR}‚[øF¨TÛGÇàgXNVGEü7}§[§¦À8ÌsP¨ÞóÔ¼Mòé—ðS-š.ê£C¸äçNÅ{\á­Óx ?¾){¶§·Šª2 Þì.û<»A«)wƒˆØçu r\G6ª›SžO¤Tt¨ÞIÿ±˜õÌÕÕVà¢CŽÒâçUðîÌæªcYÀì£ÞtÊ âçD‚øQãÕ]í9ÇÛùÛv-Ø ue¦Å\ÆÝY¢+KöQ 2-àµÌ‹†ÆËÄ'qßdİ›^ÒÝs+‰8«°ò ŽXÙjcò –x5à,µÒ¼~HmvpO™ñ[ïÝÙ˜™µ•e| ÎR Ľ}éH0s…zoñLˆ9^ùqþÀò{ÓIšÅ1—æóßïbX3 /¯†ŒÞ[·…nˇxšP‡M\œpä‹$ØáêÏk_(++EÅc¶¦¼p©ºvØ&Ðå×t›Ížúù´õïéu·hTŸö*¶Þ;î¨øÞæŸ9šÏ‰K™:m@›E)%N«s•;C¥…w‡tõ»‹KV¨¿›@Ø1êÖVñ§³W®kÚ¹|¯ŒÏk¼z¹öhaD„åå«–Š2SÓnõìÊo;èÏLutÅÀšwÁ»W Ñ*ïFTç”›·""50¼§§.ÖÕ¾ÎPhRlBÒ´&Ãön›GsɾÆ~»E–JÈM"?Rö›Û Û&Lµwdó"¸š<ÓìVâPµ§×Œ{ÈK|ûmêù«ˆÞtÓeýˆÊ”7`¶!Ÿ·w[CŒØ«CÔGñ7Þ³­œžM »`¯J#E›ÃŸpwLà9:ßùªºDb}ß*“¡±FÈ3RoËÚk¡Nù°dË/1¸UB“?ûék?†Ez' kURdþù¼LIFê»[ßA˜Ô.å+ëyV‹ØÛðcÇÔ^L^˜ÌÅ}åÚifß=÷¤§­°[žº®Ïá[Tœq_ŒY.cƒ¯ö¼ã H‘ ]ïý/IÔYO;\"ß>Í3tÁÝäh[UWc/n·çú.iíS%qÉ^JçÐã¯Zª¾óváÁÃŽØÒÅ&Дl§qW5}´Åˆà2ßS,s¼Ïï܈˜c4l#ßL|·â¨ª±¾¦ÚêÁq`8§A$ØÉ¢Ö~›Òc$Lʨ~ðÙþQν#»¡G÷XÕ‹§1]ñCË#»CÖt­ÿ¿vÖ2 endstream endobj 36 0 obj << /Length1 1635 /Length2 9071 /Length3 0 /Length 10119 /Filter /FlateDecode >> stream xÚ¶T›Û- Å]‹KŠ´¸SÜŠ;-N€ Üݵ¸k‘w+R¬hq)n¥¸»<Úsî9½÷ÿÇxodŒä›KæÞsíµöÚ*êÌbf 4 efgaãH(ª±óØØ8YØØ8Pii5@PàßfTZ- ƒ#æÿ#@Âh }²ICŸâ!`€¼“ €ÀþšŸ‡Ÿ ÀÁÆÆ÷Ÿ@ˆ?@ÒØdPdÈCÀ@GTZ ˆ›ÈÂú´Ìt¦ôv>>¦ßé1[ ÈÔ P4†ZmŸV45¶¨CLA@¨ÛQÐ ZB¡vü¬¬...,ƶŽ, az&€ j P:œf€_‚JƶÀ¿”± Ò4,AŽÙÕ!æPc àÉ`2‚Ÿ2œÀf@ÀÓâu¹7e; ø¯à70þ® €…ýº¿³À¿“MM!¶vÆ`7Ø`²”¥ß°@]¡Lc°Ù¯@cGÈS¾±³1ÈÆØä)à÷ÎÒbªã'Ës4uÙAYA6¿$²þ¢yª²ØLbk CQíOä4}*»ë_'k †¸€=þæ °™ù/fNv¬š`½PNòï'ê¿6 ÀÍÆÆÆÃÇ Ú€®¦–¬¿è5Ü쀿ì¿ÌO ¼<ì vó'@/9ðéÕÃÑØ€:8½<þtü7Beg˜L¡ Œú/û“hþ~:|+à-ÛSï±Ø~}þyÒj/3ØÆíßðßçË*¦.%¥#Éø—â|ââW€3''€™ƒ› ÀÇÅ àáâxý7Ë?úÿ£ý·UÅô÷ÞØþ%”›C|IxªÝd8ÿÝtO =à¿WP‚<µ2@÷oç¿cãf3}úbÿîÿß)ÿmÿ‹åÿÖùÿ»!i'›ßnºßþÿÛØdãöwÀS';AŸ¦Bò4àÿ Õþ5ÉŠ@3“íÿzå ÆOÓ!¶°ù§Œ Gi+ÐL5µü«…þs Oô6 0PâúuטÙÙØþÇ÷4o¦ÖO÷‰ãÓYývŸÆé¿—”›BÌ~Í÷k€±ƒƒ±*ÛS{qps<ØŸÔ èú»³¬,`ô)ð$Ï `q@ýu¢<ìV™_¦¿€UöÄË`ÕøññXÿE|VÓЯ³šýŸXÀ'"Ë? 7€ôä°Úü ÙŸ¨ÀÀ'*Èði‡vÀ'f‡?à³ãð5€ú|Ràô|’àòþWEMžnšß=ÿTîÿàß×è 4E›†˜ ZU¶^UŠ‘º0oŽMÐnj§Ð3{Ì9´9Ý`"%ÒWdø/;\ˆ%~íÂ^X—¢;§¼÷ØmªE i~¯Úrëyg§6¶Ù‚:û w´`W¬¦‡…ŒYCtËóÞÞSËÏ® ¶]ž6ÇÞ‰S%ïÊ¥[Ƶ¦§ôûPðô¦êVÅk´»Òqæ(ÍÈw~E“´¹&™SDTˆPfrdÜ#W¬Éó‹ ÜìÑGJù8FT¯½(ÎB½Žèë)÷ÅOŽÄ4ÄzDäpç¸Cc/=Ä·“ä g<Š?D`7² räÝËgêï…¡ÎÊ¿ 3Øôýâa5¢Ð‰$¹w±þÒÜ6¸uéë…ˆ|ä.Ý*Q‹±¥¤+ãÚ)Ôl«JIøŠÃbú [ï¢ÝójÊi_~¬(dâ‹1Äöy©)<ú¹C2>*¿–^Vi¬““«úlAçç#‹<©ž0‡/¼uâº8º˜;Ë*"‰2óy9ØßURy>c-¦wn% E"Ÿ´¶ãF `Úú ^ENKk(®ÝŽj+Ê>[¥Þ˜sÓ“iK0=Ž|¡Q©³š|éeamÏ—)‹K¸‡AwîQvÏ*æz%|¬´ŸÔõr]{jçœËoû‚ÁuÍr¼u™+¤Ž\Î%Éc ^0K’wúH—S‹pÛ9­o¬ü^Ž‚å.èòm1T³Z_QúK=ÓÝòN_³öçÈ€c&š)J“>d£%– sDÒ×78tf7drj|0¢‚ô¥ÓwùLdê‘ï/}k³-ŒGæÕ¨Þ ÙÊøfÒûM¬Ö`‘|ê2ƒAÂëq­‘¿c‘²Ø;¯=ø‘>¦âøCÎÖ¢ª¢5£÷`ÞUJ=&5á¬Ã+Æ"VÔ¼I <‹™¾füÐĤەÁ©ôƒ¡m5è¡‘[óªêÏÑ,gÅÏ{Özµeñƒ¢Meï%Äq4¢ÑÛï$\ȽDŸ² nqÊæ4î]/Ú}áû8p™þËðk,!ç9fá¯|ø¸}w¸Þ¢H¦Ø©úÃúò$ËDƒÑmµB(\¨9dz. £ YŒ¢ó4¥Îãs)3óÈðew´‚É1ÚÒmúÁr•£g=¤×¯qÆ"F]^Œ&Èá*3ð)ŒS=«ÊuÇ‹%yD°-¸¼ÉÆ´£Ÿ * ç8Åò%2ô× ¢ºC …­ó¢5k<…Î r!†1}‹Nîî‡/fÛˆ1ײø³}Úü‡öbÈÈq8>¨ÜI6p¦‹zBeƒHÆÉ¾Aõñ­;5E³²xÌ9íÞ)J cŽJQ¾}´öÇ*­bֱݕe%•VFC;Õx¥_Õp0Ζ48?_ǧ6‡¾f8Ó7%#Övq€‰—_øµ%±Ø¥H[W£k©7`Ý÷úâÄsrIJŸ‰iì~–KÇÒû£)'m!ŽeÚ>铲ëDHÃùBІShãüg…/ªª‰^¯Nuä4 abì¼ ‹1|ã§;Kî{Ç›!-v £¤Š;~Î ·àÒ…Þ©=í³V{‚ZæÉÈOó„kXNn}éŸ|ßø2QEËU’TtI[  _ª‘sOÏË~Ú~绿FºÜ¡úÒç»É× Á¦0(¬‘ú­f>PæÛà邯TÀaò†õ"ÏÌ—IæÜpuÊæéâôUpšcæR¼,5rÚlKk}2“‚¶QêðÄ«.ǃÄñÔˆí¨-[q0wÚ× —CÎÛÏ.æ<5%×R?NE0 ï3ôÌuŽ«¸Ú~Ϊt Øy¾Á;ʪ3 Aüœ§M-PœÕ ÝåJ‡ÃïÒ[{@+¢ Ð`pi) Ú9©ílfPj¿ÝÎgÿL1µ.&÷Y¡O•ý¸ò~ÉߤEënp¤¶zX×ûà?8´É÷HýŠñ]QCIæ<šÝÈΧ8ynîp<±~2²e¡£t~Ñs·óµA,̹²‚+ÄÈÃÄXa¼-’òKsz&³5>2“®„Ê/[àüƒ¾öèö® ­àôÞ͈í`¸!5’¿kHÛ.„ åRúÝÜ\!F¥Y±\ÞnJ~ c+&ZäÕòã4=iy\ä­¬ÝD¶¦êº²žÎi1ÅÇsqocn|L|÷ .Ÿ!nF‹F­}ó6ç\ïÕO'ø(Õ œžàG"Åš 3T“¡Ô¶N¾*ØF§÷aŽºw–rù+>¶Aúf‹]‚åè\ø¸xeßÎKÏc"„ò›.²œštF„Ô §“FEH?–2˵®§H hðX…ÝëMxæ²î_Yý#Fd £mB¶¹nÇÖ»>³ÌO qЋj—å¿RÒü¸D+0~:ÄÈ&$E_Ê@¯’<÷6ßBȦ–aZ}æôºÏ¥5C7ž ÞFU{ÒáHH‡áݲ§¿ó6:~#û® â-a¥`¹¿èÚœ1»bKh7 =¥rf¤Ô;W)ÿɇqÝW,óÝ[¬×9†µgT1¹J¤oÀ ‚§Ò¦Ì?²:-B…$hÎÏ RN™nìÔ]ë·±³ ^µ¹ÖobéÄ?šyÑ žçØ„¶Z!øž¨©Oïï×ÓŽÊWIL~Y<‘ózÓ¦þösÙ¥BÚòöûb.º7Ýä ;eÉxÙ,EŸ¨yزm’­´FC›Ç«r·L®J<>_¾k¥¸þÄZlLˆ šöëwXTª²‚XË…Ö7×¥RŽD¾Ž ^«±y½]äIŸÈ%ó©X}×Të,êN—9Ï îK}ë{¡w*ŸŽÝè÷ê° QêÐCEÞ~¶h§ýöþ{UØ `Þ=Üfä{™û¼”þ[Ç"Ó¶C)ÄÍd¡7TO½GebÆ•ò¡  `^š!u–°“W <ߟåj Ÿj nÖÓþ¾Ê€Dw”‡ÞI£kÙ(¯dØ“GÓùn«þµ¨º:CLe—80Â&õ›¿Ï>ùª#¯M=`3Ä+Þ^šüh-€(Z}Ž»ñÈ7žv˜^7ž¥™I†ðɵÀ‹#Oä]¾e•ˆ»´ÂU¡y‘Á««è€·÷`zX̲ÉGs«"üæÚÌû‚¦¥#Ïœcí,µÆ(¬ÞInìˆËË©éÏk‰ÂC÷Gó¸¯k2Ó7΋Ÿáx ù³·d꿬!NJÐ ôþ42Þ¡k¶@¬$›Ðà‹âŒ‘â,L7Z¦‰O›‹ËH–йÙõ¶§}7B2–y¬É.SŸýí8|´¿Dzá^Id§ïë+SrC¸ú·SÎצ.ÃîVÃ:¡õ ʃ€ç ÛàˆfÄPPsëQŠu™f­¨^ƒ%|.(»™£9~?ºÂ®¥¡Á®náSê¤QzÅ\Ù®ü˜Âúj£8îi|‘O±{b+í Ð eºûµÁž Á&p[§²Øïš:vlÛ6 ‘´ú“”аº(GâàK6sŒÏ+ñ…¥hH¦^T’õ4ãTáK>#\òu/½ô>=?ÅmR–è\8¶ke`"mÊ×ëaòÕXÏK–qŠBLáËËêÏàÅj…»§’QÕžç¤y÷óµÅK¨·(vT5Ÿÿà œÇÜF@—ÅOÆï$‘QÖä²2+k­1ãý*I¶ùNeÔÙð‘s?Y¥>¹_)—'ùò‡ÅÇÒž2µjî*û$’fÊîóÈÃ@‘©É™ÉÕgñUеdþ¦Û—(³)AßœvÊ1^ØŠduš:ëø2¡ {[…–r( û?„Nã1’êkz¦ž ‹—`ï«K¸,û }G ±z\ÒqfüA÷C€“ è“7÷Nâ›XÏÎkÎÛµ$7¡å³þ¶˜Ü©;g½÷RÊpˆÍa_-Vaåˆ~b™Gþ<ÕãX+gµç«·®]©Þ’Ò™¹T1ˆ¨š”lô5~uºÖ‰®ŽJÈv¦”Q<†(!R×´¢äîG'EQg&-(Ø«·º}îÙŠÆ£á4`n¢]nfº^ôØã^´ÿ=|C¥‘%a`ò²bQF"§›À&?Gµ‰É†MQ+ä5Le‚›n¦î>åßñàÅ"+,úZG€ê›Ó!³É&@–ȧw* ñ®ßŸák" ÔqBj£aГa2wéÇžZbTuð(»r°§LÔgSáoÔVX?… Zű,ÖÞL£Ù}Iq]^sý¨eë‚5bµ_¼þÒ‡i Û²®’Ð-ìÖP«¯w‚{ƒÃ´‚]_‚Ž5l ¦Ø…R5ë×§j„îÃ÷&ùëÝ–Xtvƒèà…¼ó9àN²£fœÆpʵ)ZݵwƒÆ¥'Y*ª4_wÓF¦w÷*/5Ù{Í2Š*âG|u»V¹BÀÛ)MMóR•×ì(ëMùáÄÎ?V¸(?ÛQ9)Ð!-=ü€Øçix&ryF‡¹Tý¾yëWÙ™I¸¤ëÃê§¥Ü¯Š FŽÒ]µ”™iZiœ à” ëÊácd £3+Ç#–¤´o”U¡±ÈÄjºh)ßÁuµðd™+Ndˆ*\ïÔ©ói½×¨öD ?ÛU>Ú÷Ï/ù¢GÒfÐwÖñÍhD!>w9\ç  Ð (î_Ž¡±ï—BïG¼eÊ¢70žxuNLYÍû^é¤êž¼ öHZ¹FúDú+ó“oÀ%]šó¢¶Wìo¨ú0y é6 b¥ÕÌaÃY™ã?Èý]so e?“0!”u…ÓÔÓíd¿UÕö“+n³­e­1¾å˜”Œ·3zŠ0v8ç|§7Rsój-‰ŸWé²ó}ÁÊžºqöÁòô´ý¸T}}3jiv&ºTzÁwy¡ðŸDÓÀyš“\Â\Ä·[!ÖŠ¨n«]³•ì«ÏMqï å<·J}CG6oyœ›Ñ­Ña£-¯SßÌ—ÚF.æ|Ã%zlß_˜âfoNÜ?Ïà¿ïUaÿBõù!Ôž×_¥¥Ãéí\~Ñmx§"¾À”º7îÏRrp2þR:!&´;‰Á˜é?• æU…-çuSAè¾9Æ¢±Û@@³lîuÊO}ºÐœäI‹ÈöQœ\ ÑŸ“¥i²éµ—¬\O@ëÍ’@¦¯¶¾6x=œ%It-IÙ`§P@˜\Î «Õl†¨V>“.FRFÚ?üö–çÙ¥ìZÊÝQµ:†‡Ÿ~KÂê0®_½ØåQÒÔ,#{ÈÆ;Íy¦/Š`ÛásØJgh“]yã2S(ìNïâ©öïáÔåñì‰Nl´+S2D©Çfãô‚ÜUðÅJ‘ჳ7{õëk|] u{GL¸ªGêÝfíFêF),ÄKÛ·3Q¨Sáã´wÁ‚júEæ/dE÷åGÛ‡%º/Ú)?Ãs~xï”{-5ét.7F1;=ÿœR!øõ0x$þ#Zp Á``Wˆ#þìÍôû8«2Á·Z]\˜Ç´-·bM.äE¯^º};ÿï¿•‰/à+ Lü¶Ì€XoQ¥~H[ ·»+?ɾܑ–œ G[I2ªR¢\ƒa‰y”èHy¶p¡Œ"œh €r¶Ò­ž¥Š+ˆDú4PòaMi†¼K±[X;BÕÖ»µhBû†:À?O<œŽ;h¥f{8Ifùòë–¢ô;˜¡DÕIºu¬ôšC8Za´£Ž¾$ÇÃÇðFðdši?K˜mÜÕ±ÕÄÈðæŽe·ìõ[©6‚{YRéd|Cî cL–Ù.§‡ª´Ïµt/öóиVx/qKfzÈ“g%¥áçQGéí–óÜ+Y“U|Xݶïç¥B*[gH/dÂ1F4Ò¯w}…¹kÚ£YuÙ˜¿>+/ ¢Ï¼}ç{ãÿ-dëÊÍÚçðªïäe¶Bé䱟ƒ:f$Ww´:òhãyÿ¢A• ç°}…Ÿ4éà| ®’ÐÕµ5¹gÛ»Jsþ=ÖåÚÙ}ÆóOcÓï‡Ä6P±˜ ‰µ&:¨¨a”‘/èH35q!Ï»dÂÇ ¥-x6¬ëBíEaˆõ?±‹!öuKMÄ+ Š˜ôŠw;²Ÿ†ufë¶E]§ ¢Lët à~˜‚oɉF9[.²wvfZ§‡´ó½f˜õïz¼=a7±§ö†ˆ‘9^š£Ð‘`ÌmÎiÑ4ß©0Äæ¦ÈúÍ‘ ûrd†ox„Ç3b„T_"¥¹š?` Ü­r#` Ýââ°¦é¶/ƒ¶ˆ1A«Æ=i-ß$Ÿúr­ì¢<¡-{I’º¯Î|fà °Z|湬f~€“²™85þFÁú•ˆ& …suwœ|‘O„¤Ä86ÙEöEu€´]–-z„ãEˆy ¿0ÜD¾„zr{Ns4–L´ø­Ù2¿ãOYô@ð¬W˶ó^¤¡ŸvtjýÚ`rf.ì¯U³÷šm²Ëqß<ýU¤“Ž‹=óì¾¶†þ({OíYçÀgFuM†xÛÇŽ„©WÏ`cÓTXØ{53§ûÆR”±?áFŸ†ômV„²Ó¢™f¥h’*/Ì|³OÎX'ö\N8h`K*b¾Ö.í´u`nS¨õø“O¤ãö‹>v nIi]Üb3fþ*UºcaÓ§œt2±ØºPGB©Øb2Ï Í“çÏß^!J±Qø¯ÓÛXö½à!ŠK˜èë°B¯¡!©˜ ž©ÚbçõšKÌHDÃŒ+.Ž»K/íGÃ&»…äÙ°« ÊŽc¥seØ¢ÖE‹Á“éáRíÏye؈Z-Ëú°ùNšJ'ÓJ¡@Û“·ÒY‰_ ù"r,<:8Ð<´ raùÈ üÜ­ºh?vÃQ°.2sí2op‹DùðdUKèCc¸;¡ÂüöK“&'ö¢3d„úUí£ –Ø€(I[Ѽ)cüÇ|¼­µÝÝÇLdâò4X7LhðWå74¶ê¨wšèù—;{—Ÿ„¶ëF_•ì¸ËÐã¼4QÎ,-(@¥aT^!å^i&‚r×Í(Xúµµ(iw Â—:ÎÄ”¯Ó«ºõêX`1iÔ±¿Ð« YEÌA™ÞŽUõªpƒhƒu·'K1Ùð•m{ϾÒ\š>dCîkÇ—ôÎqéc¤NöS¦éWè|vI{‡ŽdŽKJä&žµ~wÅ»¹A¾°Ÿ@š0cî?/æ 2ðîB,KaOOÛƒXöC¹BâC2b¢ÂmìŽi†Ë¤‰™­ËÞalXk E[æ”ûGqáLãiS®Y…$•½–Œp²ÂãÖ¹õÅ*G<“Î*õàFÄ%©þ¥ÇécØÐŠM)“6œN$zûMbÖË•`[—I£Ì"ÚzÙ8Κ8ÀáaˆÃùeÞ5¦‰|‚z,å›/ï†×ס¼È—ØwÓ풤з 0V'OvÅfIÄ™…íD¯¸9©×³)AîÞ—'éeã"Å'¡ì_4‰€c§¨…´ÑW]LíïÈBºµÄ (וK¼ÂŽÔãf¬«qV›I߆{îDަÈ~¦¢VŠ)³îóxçƒr# éYN¬®×]W ëñtF”åÀ«CZ¯gÕèTçŸÞ¡À~;/þíT6Yñu=ãâ‰ê€ñc )­ªþ1šŠê÷½q†*gølf°óÄûä4åe…†¬Îøßn„Ñ鬫zª‡LE*ÔJÉ­•žKs³“ŒÞÁ‘³Ø?[²Ün=dòF‚ 3³Å’A¦›''ޤj’W6)Úû‡“fûgÚáXl'mB¥¢˜}êKz­ê…ìU à'[ÂH<¾Ó¬sæ Lf-Ýêtmò8U™[´M'ç4c;¶a¯¦Þ"‘q$•ç^&&ÈfQûË¡®¨39¥Å\áõ*íD±?ã¢æ0|~ȵ½– Io^)ÚNŠnSÀ¿Ó»ëä™1iø ±Ÿ jD*¯„±†dÖ%Õ3¡b E(zD¶“圞;sWXTfáiÑ›rV,)k£5‰­z÷%þvjo†çAÀ}@ßÃ/†ñЍyµwN&þ”çK…ªmÑÙ3Fµ÷0äb™Èvs½~ m¡Ž›z‰+ÛÝvJÊ„rùí¯L@$”‰}B•MéÝê<÷‹Å¸‚ƾJ%dó°˜ìÝŽß>ÞÁøH(æ¶}+á÷ì¸Têo 4'à $â.>LQ9"ÓÚù²e˜5¦æ[Æôêðùyì}‚~æväzïpÔ$l­Viú•Œf[è{d•Ÿ¨8¿=_WÍ‹Hž{K ÚàdR1çe¦ÆÌÀ[Ì,Hž˜W%—ÇAx|ø^Ê÷íDᆇKªe ÏfH{åÍ^B=t‡ïùL,5¢aàüŽ‘zŽDÀ0$rñhÃÚ±Õø-É4yí{dF´W6yí|po»h¡‚¾µ EK¨Dì Z1äR@ ò£]Ä22®$ðB8c ‡Wñb¡cñäEÆŽ‘–?µø†ujÌ»¢9NÌ™·¬âKA_Xç‰sM”©©Z‚e¾Ù%i>Sláe†«V• iÞå&zvµ¼J˜Q Íú‘Rb Õ¨Ò„yFçÊ ‹Ù:( ßFÆocËŒ |rL®Ϧ. Q4‘*%¼W¡¯~œ&óTñv½"íþ”Z(ßQ ç h;ñ÷r 7aÂ{D>ÞYÛ™[¾,.^ >q¾t"C/ÉÉ--“JÚÏi-¥®Ùkg¹K4tÊ-«²¬#ª½ÊsLs¸æÔªyÁŠBVÅQcÏú©ôøÃ͉´¿¢;°[3Vkj-J¿-«¥«-ö??ÀŸ×WJÝ/ò7dÆÁädÞS7kNòÁ)^ðöV/ï{Û]ÖÎ…)˜÷èIÝéö‘£Z”72Šõœñ§yE,(Ñ qÃU÷&å^Hž“iG mß5òæZ¨i¹¾Ð[ ­æ¦Šþ9¡Ë´ë;KœylˆäÍy •߇q³<ö7¾‰ÀÑf™XšM!ÀTî‰ ¥T2ªøf©¢•Áh0n·amÓ Ž1K¬«ê ·vkÃVaª^m⾨QrJ¯Ý3“öm–Ú¶`ÐCv)Ò@]h?{+?Oô1 £Êß’–Î$ÕXŽÇ“%ƒÚ¡ø¹Ÿwq€*ó=]VÑþóK€ EÒû“«¢=,ë!¡*QvO0¾ý÷ô#ýjF«¥ÁðlH½„²ã$!6“ÂÙþÐé :ßÖÙ"’D4QÚy]é.†ý@YgÏ·6<”¥G%'¦øQµøðƒÜ-Ò¯åí߬f å}Jzº;:óh˜w4cÃ;Ò-Z¨ž$÷â]¡âdˆ¡§¡®^L!åŽb7_»™¤LÜîža!q§ò•&ƒ±ù£ˆ^ø’"}£†/¤dØŸw"È6«:TÞ8Ó½Ü5^!‡.Ð ½Ž¥ö y½#KSø ³Ía¶Í”º~×-k¾¼lIZx1«Šß˜ßQû=±ä܉Ö4²@á¿ëLúcûº0Ã}…ŒŸ´›…‚¼îAá WÎÀOèF'ý^Vð*à.²¾ ÞÖýÃâWϤg’ô÷m§?×)J´˜òƒ¯Ïe„:öâÝÛ4óRS[–l?w‘õ»ÁͲ¹ôÈÅúÐ*È@ˆÆ\ÉÚ^A“Ô5…³EAõeª ·ë@Ä`×Gbc8¿\—‡g÷M3Že"DˆÇ:~ú(³vB×lqŒ K˜¬Æò×ûíB¼Û„UäÒX1ÃIÒ[wãj<õGJ×bDצ®BÇ6 ?9Ò·­Ï¸I*Hƒ6Éûœ6Ìû8F³p6^jq?S/½tûTòÐy°ëѶ™–oÅå« ˜Ï Ð~rY;]R(Íêûî«í” ,I„9bƬ¦}x‰ @µ~7ÈìóÒ-¼KÆšîû™ž¥ûr£î‰È·z#Îã>özP ãKÓ™ÿ(ĵŒ,Ïã`n¹8¥dwáí†ëí}a¯5iC™Î¤úRrèV:¢u›.|”hz0ÞíÜx~./Uy¸Væ¢fmzÎD‘o€oñR4N‚>CAŸ{zZZ8>l{Ø–ª‹·¡tñüüЧ¦_ò¤Î…£5RÆþ.f/¶nY·ä5éxªrÆ›1ȶ¶ÖÏ=×Óê²5`è-2ƒ„‰5\ÀÏÀ‰â2ô(àË߯8“Ö5‚ KZ\í‹§W!cÆ'Ô줒êÌ3¹‡®±‹“y¯Ð9Qcú‘\H»ÏÊ0 Üß:±*e¬5òO`ÈSŸŒmRV«IW_åù? HÜ¿´ºqª4ÊQ‚ójytÄú?Qž¿s endstream endobj 38 0 obj << /Length1 2252 /Length2 13274 /Length3 0 /Length 14614 /Filter /FlateDecode >> stream xÚ¶eT\ÙÖŠ»NáîîNp×àR8î\ƒ;'¸w Ü-¸»BWé¾·Ó÷{ïÇ5FU͵æÚË÷9Td*êLbæ S 4ÈÁ•‰™• ¡¨® ¡ÁÆ `eå`feeG¢¢Ò°vµþÑ Qi]¬AüÿâH8M\Á2IW0Uäs³°qظùÙxøYY쬬|ÿ%‚œù’&îÖæEf€Èè‚D%rôr¶¶´r{úï_­€‡ñ/s€˜=ÐÙÚÌÄ hâj´{43±¨ƒÌ¬®^ÿs­ •««#? ‹‡‡³‰½ 3ÈÙR˜ŽàaíjPºÝæ€ßi”Lìÿ$ÇŒDа²vù[¥²põ0qÀ;k3 ƒ ØÈÍÁè û¨Ë*”“þ&0þS3Û?ÇýÇú÷AÖ›˜™ìM¼¬,Öv@€²´³«§+#ÀÄÁü7ÑÄζ7q7±¶31þ Þ -¦ 0çøŸ ]Ìœ­]]˜]¬í~gÉòûp¡¥Ì%@öö@W¤ßñIZ;ÍÀ•÷bù§Å¶ Ÿ?ØÂÚÁÜâw*ænŽ,šÖNn@YÉÿ°À"¤?2K +€‹•••ÜX èifÅòÛ‰†—#ð/%Ûo18?G#Àœ ÐÏÚþAòq1q\Ý€~>ÿVü/Bbc˜[›¹L–ÖHN‹cð8[{ôXÁCÈ`ýýùçŸxÎÌAv^è5šEZE[CJ›áŸ¤ÿQ‹‹ƒ<>Lì¬&v7€›à÷¿ýS‚ÿ¦ÿ—TÅÄú?áýë@Y €ïï,Àåûo&îÿÚÿlà=(Àc ÐþÙ}V.V3ðÛÿï]øËäÿk~Ÿòÿc þoLÒnvv1hÿKù1Lì­í¼þö›+xIAàUqø¿Tmàß»­4·v³ÿ¿ZYWð²ˆ9X‚ž‰™“ûo±µ‹´µ'Ð\ÅÚÕÌê¯áùo;À쬀* ë߀‰í¿MùGÞ@3[ð%ãnÚ_* xÁþ׫”ƒÈü÷&²sqLœM¼XÁ£ÆÎÅða¯¬9Ðó¯)°0;€\Á&p†~ 3ÒïÖrsXÄ‹þF<‰?ˆÀ"ùâa°¼ûƒÀv ˜©ôâå°hþƒøÀgšüA`¦é?ˆ MÌ€v@ ׉¹þ#þ{Œþ1fû[l tý>Ç?òÿcÀ`1ûq}›ìÀ¥þ¯„“ó·ÄÞþO|¿{Àbþä§i²³3qþðO‘~#'7ðÿ!°X,þxgaíþÇ‚ë·äöïÁË?'‚õ–¿6ÀSÀ‘Zý‰\+/G+ Ã¿`™õ¿ 8r›AplÿÁ¥ø178g»ßSöG.œý¾mXþå |ñ€þ悟„ÿRƒpü£Û:‚EÿÓ2N¶ÿHÿ·aà¥aqwô§œàâ8Ú¹ý Ž\ '7+ÐÜô_EgKÿU/6p5þ˜pýF@÷—‹ ìé_ð Åâjå üwàŠ¹ý ‚³ôø×„‚ ¼þÄ.§7ÐùïšüÏ~š¹9ƒ“týë*/ïñ_M Ðh†´¼2±©éx¨#ô`Ú›àèçÖüñêFʉk¹Ã Õ§„g[FșǛ’#©2f%\­­ O(ËãaË'ÞÉ õ& J&’à”¹AP‰åvꊵŸ !/íÓ‘„×ÌYÅ]*a‰q,õ0NñÃûƒC'e8B’ŠÂ*DåÃ:>ÜÇçÊ2vþªüps#]’¬6ÂÓ庿Lÿ¤‘{üåôþMU'–ñü€8*WÀ\Ø;$×úKSBÝ2þ®ñnöG«NyÑ.ÈÆâ¨<šƒÆâ‘ûeèD J!gUÜö(€[_r‰¤ôÂÙ8{Ûl¬²£‡ðä}ÿJº ¢…GÐI±•Ìyœw.OÙÉH ÷¬ íÅ'¬™në™oÆ{0Ÿ”¢qÃòe)Ã%–´£&-dBÅZ›Oñ¼Ú%ìIs'5â#ê>Í'uÝDCÔÓª8À<2"Ã:C+KöÎË›èù2LÑfŽÊo-`ûKIkèñv°µšx&ïÐ,Îó› ̸¼¿ì­Ü¯ö k˜TœfcH(Óñ>n qŸä0ø V…ÿÒN)”ˆ!f0µy€?W@òx5+G¬ê&CÃÀ±>ŒhÚî×`;9»@œ•ôk}ß ñZ.öÖ«F¸Ù,­‰Adÿç Œù* µÙ’¶>ùúsä†Np¯ñÄ$«aÙ ë<æØŒe§f \_š„³UÈbéè‹üIÜJT´&fk¾¾èð„þ-âÍM}C£kl#ýY()¡œŠ‰ãE PÚJ” •#œÅQRàÉÕëé% æÝÌW¶[j¹ðÞ{Ù3ŽÙüÏÄÇuow룕TÑ“YÈ0+ŸânÍeÙÐãc,=ÞC-«ˆ©¶ ‹ekqXteT}M¢xæ‰-Ý0‘¥Ñ”ð Gïýsý>Ïì›ö-¹aA)>ü6Šc}tŒ·1@Ú.Çï]§×+:ƒø|/C[éÊkí¥žøÙ”L…+œtcÓº÷'ÌÞbôóØPùPñCKîf:‡ª`iiÆM2“¸kèõì_”Çnʪ\mÐƪX’Ь<Þ^·’“æ<­oÔ‚qòC9IS½ÃÌQoæÏZüåI2Mòò«iÏ›îùžOQ¼ÀÉKXpns|Ì["õy‹Áà'WŽ'¯ÍYM_Å÷¿`êX]PnúÎ}í»ˆ"ñ¼”>¬¦ú÷fzc¦tºK¢½Œ™ÙH“Ò³ŒÕÿ\Ë@~ÒÓû@£tèdø%ž– ‹Ê´äyÜH2µîX‚Ü]Të.ÓkبäÇZ:ͨ,+ȘþŠº ^ SÕK¢RfÏ#eƒœåm~¹†Þ‘D†y‚†YŒÅ‡¸Àp’OÞ̹²¢²0†Óõ]FíŸ]›8ëÞu²»vÎój¿?DÕ²néuîp( R÷Õê!χ¯(Y‰—^‚ªŸÎ”$"igí‹f~ƒ€èˬcõ¾º(š¶OšîÕ·®{BÒ(b®oiçÇ1*9ŒõÈú)ÓEz$¥˜ÍÓr“KÕx1?$n·ÏœÖ;ÏÐÌÙ3NýæòµÓ½½g^©‰h•ÂtìIÛärÁV9¢eò¨UaDé­ŸTšoòqÑ7ßôL©§V •1CöúŒ©S£ýYŒ‰G*œZÓ¢I“¼!JšwÏgµŸ¨5ŒØ°¼FšÍ»¢u¬óOnR(da×õ^ÓŽ›ž½²\äL%¦+^½BGôEŽk¦qKòÐ+˜ÞŠÊ¦úöo8ÑŒ#ê‚×XX]M$ZÕçF)gj²¬Â3«™R Ï>Åiè O Þoƒ8Bõ |2ñß\¼lä=n™ßÑžÕd <ÓTLáÉ×ókF^÷Z k·„Þ䦕¡,hS‚Ö"•¯KØ›,!É~~Á¤öeˆöü$u36Ù[…ÔƒÓ WZpÇTÉZ4¿Ò4à|¥j°¯Óä=í¹¤<…—N:HŸ;Þ•w#Lž¼!#)TÍÞ}hʧɸ$D¶Õ£\§veHÄ·v˜ø¦¹cžn¸$àšÌ¥í]ž¯ëÆC*K˜‹P]äò±ÔÖô| ÌÏc$Ië‘ PÙQGK¹"1ÚÜY³†ŸcóÏ€ŒÁe0¡±xhŒxêäø‡‰åÝp“ÂÌ4P7„ßá¶Ð/D}[/07F¾4‹ Ïf˜_³èÝN^h„— û=ë<}î¿ÓH·m=9#ËA“«¾Vʹk§5Gz- mF|ãiȨܘ_cqmmðG­]?1}=Ä_Ý5Pwe4ïZŠ_sß‘ˆÏ"v—³´½Ý°ÚôËÕÞ‘Ë=".PŸäøÙÿEŸ¾9Ð<1Üo¶R_|'dîòㆱïî$•¹çu»/#4É»Ó^ºí6\™aϲMäNæ&ß÷\”zÆÖ|Ϥ"vÌ8Ȱ3>oßäÈÌw§¨¡ýD¾£‹=õŸbʹC²°nÛ=FcH”1â¯è„þZÏhµ„G8æ)e‚û­geh¤ïDcZQÔÚ*|»N¿;2É)ÿŽ uŹl·B%ôLýîƒÀINEoK"'iîr~Ôüº&[ žÍ}…Š:CáöãÌ’ªŽ™¢+rZ´H‚%!;’6GT:«åÞèAé)êÃu¤ù¬”QE†8gdòìwÐûA „3¡®DÊ2ÃâÔ^YÞà;dÉ/øÚ.¦‹Ì\ßß‘~h×=â¦ÓdÚ€¾ŸêbIm~ß©D_¨|*g§ñæN¶çåM„5sÙÈ‹éRWâÖ(d”ú`“Pùï ñüå¸ÒǧkD‰»|6A¢*1‚úѦ™t0ÜM%aÓÉÙ)Z½F¹^PÎ$ò)ï1ú€w¯n²Âp-1ä-Ræßà ˆìèÌŒgj Fã¾AÕ! ‘­Õd¤øÍÉ|•l¯! O:!ˆÆNÙa øìçú•ecÍó<ÖEÆQÅ1ŸÖQ׃+ØlÙÇä;ý¾yÏÕ&G"Qû•­¤cW2Ü’Âó»p+fêƒég„áu©Œ{' ¯ëC¬þ`’ÈôuRAr÷¦=ܨ;Õ\ß2Dkýwgåó\UÒNâ¥Éì_G‡>›³ÝmO„éð3tDX…ª¦RŒ²(0Ìa¾ŽÙŒœ;"•a c#œ'¯„#1KÐ>ëšÄwÕÎò}Ía«üÏç¤ñ3Ì á$=´E/yØd{TµŒ ì¬)*/¼<âxšT¢±Z33ñÚ¼gQFQø_\V]ŸŒ2z=;e÷“y“†KÕßÞ{dÀðt¸íÖ‹Œ†åQËî¬íÊnäùœRÍ2¬š]"å@ó&¾HK»rÅF&<¸@E!ƒ²óaõÅ­ÇËÙ|h¥G?<°ms±ºÈ$µ‡|¸D=6þˆùVvûHbaG 4øÿTX´ôÒkØ}¤`õ £Ó ›ëíó ¸û뤰´J&ëÛÄøYŒ–åë•0b[ ª>ŒÐû¡d7 ä;Žáâpí\ÍùÓ÷w¿à4N(r•üé1ýôJˆZ®¿O <ˆY½Õ.5'•sD>¬Õ¹éw®ìµ«Îà¼gV¶Y*"ózƒÎôf†0"’ã¿ÍNšÉ3Œ®MÂÙ^a@ܘ$OË-HzÉb¡:•%Ã|<`´n‹ñG¯e;‡DÇÄ`O^:΂©ÖªÌ|mèý—õ]@Ä A¬5b»óÖøúMsaâ u3¨íÁÍzeò°¦›‡#k£³bž;J÷ü ä^"v 3Œ¤"‘hÓJ¯x±Ÿ{½å{ò„”®ÙÏæÛ &}vó­«ÙíRôM:N$8·„•`¦'|=5£—/<8ž ¹7õzm 7¿r·pló k#x²ž³L‰JqÌÚ'F…—ÉÀ<ÊÓ—ˆÂf¨dhî3£‚/yoçí^&$Ê%B{Xé»îUcgÙ­b¡%ÚÓë jÚÆÚ{ø+nÏèQnwä';¤+ËH‚´›åRŸ-P7j¬6RtGÅq#n›{þjq©-¢­ª§Wg žEû›ŽU¨ØÐ[ÚÄnè 5jïÂEBˆ}Œ<}z+>§›p†Ac '±Ebýì%¯qûšWúrƒü“^-qX`›0!—‰7½¼d/¥0>6D#¾ókCC¾…Ó¼òŽT¼>¬·2¶KWâéæò¨¾ÓåÜD¢³Óû:÷\ÞC´«$BÅPîò±ö"7bvnå‰$uM±ÎN´Šª]ÃG€]¡\~˜m×™EÄpz&Ù8%ÝÏH‰¶0•Æ0{ëF×_û[_kèñˆæƒÓ™$—¦7f•ß}ÊФ€Yš€‰8Ã2çkiø(Øo,êú~+5ª¹[7æ¿~ÿ…'õgÄpV3GçYè4 ©xT6LÃ[,•Ý^WÀ©~G®Ü)2â~W3ªèŸ£!ƒMj¥u¡Q˧GH–¾µú© ^ ¥îÕë[tðá8Ö+'>Œáê0Ýd|ËK°p•9GÂ>8ÍËø™°ŸõÆÍÝ~oƒHÃzýÅæÛ/7é)ñøÅ⣨Qw§÷®8#llD³•Ôýú·„oÙ6tÇ€H²ŽÂlVŒ—;—sJ"ÏÃlO™šôbýr”JJ¥·È¾ÏjkŽ‹+p&å óöw<¬JøäPpHÛÅ&Ròö™ï2#»¤ÞÆ=Ã~½ Ypç=¨ó´ÅÈð‰=JÜ´š¢«+j‡bª5¡/ÇßXrÀÝœ==Ì»Æüy›óÙÿ…7}~–¸w á»\s(|-”ÿÕ Çv™É\ ÷Sç„•˜¬PÍX€¢Ì%•“°Ý•±û¬LÓ§Úb± |ˆ}•¯Úóz¬ð¾¹&XÏ_jÑxÙÝ i¢®š‹ùr´Ãòý—uUÍ•„¹zÙ2¿ó½šF"/Û D¸ú'‡²/|úäR2Nýêð–ãi›±ºµ‹ëË™Rk¾ÌÌYKùIÒÆ1CíôÌ¥ÔÞÂ$ÎQ½Xç ¡45PòãUKjÒ÷5—D„5„“Îk%ÝÙ-`ˆ=Ú×FG¾thØR.)îÍkáÖÛ¤@Õ+á/NrùÀ ¾ (ºÊÌʾ£•Cï @íŽ-„¹ëTŽƒÈRY ¾<$JsÄècÔ8ˆFäi:9“Tƒ8™ì®òo¢=ÄCGEÀãF¾ã-ñû·ŒŒyü@O“uQU»–›rr„cÒô)/v5À–ýÃê…ö¦Oª¾¥OEÆ€÷Þä;ltÝ„!ýd"32ç2Ò°Ö÷ýHtM; 2¹ \<™ú½Ú£^ï¹l©‘©Pi$á U/ý0údyœÝL>ë<ÿp›váÉœmÇÍ¥±Žs!N\î{%*”N@q‚úLç 0,gW[75.´,UÀ¢ƒ»çð>ñz™È›…jqókc+Lo|‘w2òÌ;Y"n]ÑB¿›‹âæ4ßo*Y^L÷’¢¬ŒÔ"^Âo‰TNŽ×´3ˆ< œ†Òw¥£ý Ý8¼_î³—°?¼Õò‹W/B®*ÁP/ˆÑíc—j M $@ky WÄÕÀ‘qèôë'ê°uõF¦ì¯T…óùðJçù=®}\ç¡BaûÀe8é>´­`ì¤ù-üvY¬º?.”Cäq© ¸QÍtÐý/¾ËÕ˜§Éß“—î™ú”‚‹-ü­9.‰H+¹Q1¹Φ#t§qlÝíŠÖ.+‰í441¼´eÚûPUEqdP׳Ş5bIÊÃOiƒwUl*¤× ßPmì©®m[‰4ËŒæ& DØ5˜DŠÉG~mËUuR í5È3¨ó¥ž˜˜ƒœ4ùC*nvªT·ïÛÇ9¸R9Vã’¦ÓÃo»¼jõÅ]•[0ã\7X¹mwº#$ C;;ï^ÆñìæÕ*‰_õÌXÏÊTåž—†ßÓèÏ{S!lmÓÆÍXqÓPùªÖóu¶¿û;<Æc²Ã¾ö檽~ Á=ቨ*Šv* ž` é=ζ²ùönf3J’À;¢Kœ§‹4EZ¬ª ®`Ìí꾘loEÀÁcS‡õyÝ#EZŠ–É\õ;cÎǹsV~<[IQ˜r»=ü=”cÄÛ`ámÂ/i6c˜ÞkÞ“ÏOIÛ/L¸q.LÖ?…¯cT âm˜Oõ QÕ{Eb®Â3¥é…ö:¾ÎÒžº’WàK¬A8®*ÈaD³ÕfïøÔ:At¼CùðÁèš!Žy‹¼<ì þÚ¡›‹ 高÷Hqâºðü:êú.ob$ÔGƒj"ç8¾¥iÔÇ õ…+F1$—¡©G-D”_e÷•+×SÐÐJ?W%÷ù‡M4¿ÞK¯)­T?9ÛsW'gk>^œG·ÔtÄdÅsžx%¯ðÛO PÆù»Av죦ê'NºØp>«‰Zw¼cÑt«ã>µì ™Ò–U “±~13.§övó«j× –4ò’O1eü˜1T¹Žhe­CA3Ì¿%mŒðé’î 0K´[h¹Š)kÂÝ“Îù ¯Ž™¡Õ|pp©a_œW;†ˆ-0‘ó&âáçgV¡ªèïçßó£â©H£·PzdÐê~iqSHâkt›“¶Ÿv~ ¾áñÂcµH¿æ&ÁÛîmÍúø0$q¼1HGìÆÈâ¶ù€=ða^†–˜†p£e’³:ˆÀÆU-þ^BÍ¢æC7.ÐËt9šˆawÎKèrqxr«ê[Á|y–/ ûkÿsggœ]'-+VÀ=ŽSâþHì°¸ð/þºµAŸ!-týè;“ËZ;ãàHtÜÚ{ÛgX¤Ë•{öài…M „ˆÜ½7h¿ÉŽ« º×<ÈH ßá"ÌÀér¬"'9Àúçd´Oz¡eÿœËì¡ÈG]Arú•b>K¹áÙI]­ITȇŒÂÉ=†Oâ_u?gC w…Vë­ãÞ@g~ªîHŽ¥Ày5ãR®²ïf|hóF°¶Ñ¤Ô$ €#1à~Sñí•TŒrrxf.ëWmoÒñë`ãdžWÖz‚Uä|Å`EÕ(\µ×ˆ±ÒCwüˆQ!QC„põçô `Äw¢ö/jýaÏf~ÚÒFC¦ÏC0ÖÝš5ºafªñÉR×hÉ,êp~ä…"&b,|_¸¦AµoA¶©l2ëÜŸ•÷ÆÑ¥M|ÁÏj›k¨j˜Ôa°GAݘJ53u3:ú¤ÈÌ6KïTàl.0j!rà­˜Y4éç¿q¼ÞI{j„°'ô,ê1¤E‚??ÿy¦œ±&»è$ÁÏé\µt÷çþÜ„ŸÍîɾR5$Ñ÷ék¿±3‡ò_´D¥KˆèYOÃ@‹ˆjM­Dé§ØÕi%˜"zÑ~Èæ‚™°‰“GF¤ÂµuŽ.,Ž„ûÙ‹§} OÙ5 ¨­_žê,W+ï Zr–8òe òæå nG‘y[L—YYR‚Ð9ÏytÇ}Umi‘JE‚¢•b(Ьœ0ä¶Ì\«RM9ÜÓ¨ìU?(4 0h1/ŸV-‹~!³øå[ ½TgjWé½Ú*L–½(Â0õ¦…Á§?{!-ŸS(»ú›„¼¸+ \Üðp_ìPž5„òÕsÓ=R8ó«ÓˆÝRá‡n\²¾2émC“ŠΜÊ÷ŠÉBÍÞ%]òc²ýìhªHù«-‹aJ¦§O²P{ZÓÁyh)î&!qÚjzŒ¹!*\ԫʇ%'ì^y]¨ÌãÕý°˜Lõ¼!ê•.ǰ9ÌÓ?6oG¬sóí–'Îû3gõC˜Ì·6âÄɇ·ã£DeÏOð¬WGNöddc814Nø¥ÆÜ”—:Fc¿™ØG™g9ß³+ü"¯Á¼cLt°ìjޱÆÐÄ%¾ÔPZ:1Ç餪®m4ÙÔ–3KÏçc2B _Ï»ìâ…î”À踟tkffùUˆç¬º%§SqܬgÝ%~7ïªIÔíü’)s`€K]³ãÙÉo¬.±áÌ4†šp.ÿ1„bð]¯so”A<ÜžÚé45 ÏL¨—gö£ NºÅg“bîU‡²>–•H$“ÍU·åAZOHCvƒ3<­N”/s'éÚÞÍœ‚~ÜiÎ0ºek/›¨ã—Ò׎R7Ч„ÛL‚7ÝÄ“šÞEiÚ•¿ŠÐ½–ë/fâcÚDf "ˆ®ÏºŠª8Ñû$‹×º d©Ð†5ÂJë‚`ëD?Ø‘L³^%žÌ'=ŽÖ¼¿iP=Åz–ŽÕÅ ˆ.IJ$û±¦ {¢@]Y‰AÆ£d®ý 8Lƒ¨%ö%ìã†@çnÚm<^E3q€†/•MTÿRm‘£íˆÎ!ßš•1X¦M¦È†IÀÈÃOõVAp½AûC5†MSÇÃÅø½àÒÅáûo§%J/ÄËaâ&Èag±¸=’òQ9UuÛ“ø19ðÝXîœÍ‹Â6ŒÛ â4ÇÊ_4Ñ?N½eÈÙetÞÆØ²¥;Ø8·•% rµW膩-2¸9ÉgZ¸Úh7,ñÄ݃òÊ¢ÉWÈ,'½®×ÄfmHQ1±œh ´¥.˜†8e~Bê)Fˆ-ø`‚š)È F¶æ†8¾lÚäéðÌ]Wê>Ðq‰™S#oÁ…ç%¬,´ðkC«Ä&Y‰•鄼CÓi›xÙEl ú9y؈€]CGqßrÄ_ÑTh`Ôùš°QPè9þK\È`ƒ°#z”£F7÷V¬+á± VªÊPJD¹ó3Ù•ç´Ö¬^]:4sˆR%ÚæÎ¬õW RtÕFzÙ{¶¯Jl±çRr’ Âå¿Tí™»ôøÍÆ8Úä²ùk«œƵ !9†à6¿Á['`DtÊo*ˆ¿ªÔÒ”;Ü×—QI–_l@kêÆÃðxŸÅRؼ[ª¿ßÒ‰Ùi†b-Q-$Ñoœ á×éõæÚ“™Ö!ÖÃKcxK?²]éI'L’\”ÝM$= ?§Ðp^íÇ´Gv³§WÈÏ#RⵘÐl%F¿:"®îHáX á ñ¤§T 1Ð'L-#HT—Ù¾ç7¯ï–'³m×\{ ÷p·)-$$j¢#®ã0Qå°¿„‹î Q€®w@©hŸ–²úÐ)Õä,³ˆÉ]îµ÷«ç%ê9ÝøáþÛúi­¿lJò¼ÞZI£ƒ}˜BÓ ;±¸ðºÉ££OƧmúóÄ5•©ž:ËC¤Ïè6„l‘ý WXy‚4$¼¨•âJ¡ÖA¸¸yDØÍà†LbÆ-ú‰Y€oþtëòKx¤$ ÌÏ›w»|ÕÉAÑŒËÍ«©·xdD²ÁTé’‡¬o,?Ð)‹;¿½›sU±~—‘D,ÓqýÕœÈÎß³p–_’M•ï²Þj9Äᇫ{mÀ‡ðE‡Èçõ¹ÍÄü£Ìær‡ @A^ûMî5RsÚ4·<ÕÕþ] Ƴ8"ªÉáuµ¿tݰª€ a“fœØ®?m#¾|'‹-±ºhY3m쇥e¹“¡l)yš¯€O$ßîr3—“ÐÊqÖB$N!ßæòwö1áu-'´úáu„ç„W©ÐOu"ÞΧª0o”opçj_ÇCÁBP"‰Dá5Q¬Ÿ’¹¨‘=¹oíë ®Ž}˜$0öRwFî_³:½ÍUmšte—3ñ¬¼©ÞŠÓ° k&Ú Ùž®ž3kà|r‰RçìvÛÈvYq¿šSúlÈËxßMBkàÌ¢á~Hu¶Z¹\8’±¾¸ÿ ™­{‘}Á0¿&”zNi+IÛ­\!Mõ]Rÿ:Âa»Væ± n?ð'ø¤ õÎAÈ_És9Ëêý¥}‡ƒøM’Zž=’âÆÁ&W˜² Ô\¯5´­$¤ ždKãÏ0’îŽ MZõéûÏÖŸÐm3Ž äó 5Þnµp¥ÛK«“)´QŠ é‡Ué[(~“ÚïrCbœÃÄI© êÜ•§käù„óì0ò’î䊨~›>]}W5óŒù ]l×AÚ'ŠGjì’‰‰Ûþr$!ì1<ó›q®XÒ’¶„„ƒÓp–z ‹d®{$’÷Õó¾sг”µ’oÚóœúœá6F¤þ¯6E’@e飯ۗ®xeÒæÔµO™¹+¸îr^_£ªZƒ¡•i*!˜¥0¢°?™ïtXŽ­™Á~61H->ÁT.Ê"¥•¨RÖ'î«ê€¢¤$D>=yÈæA'=âQø­ïÙlq¤£{¸?›8ÛÉ©3)>ùÂZã¹MSh­~­Õ{J?ÄKµný¾È:oûõ Xùóóg)Ú|ŒfÌ€RTZ ¾ÌYk¿kŒ…¡SGŠ L¤•P¼w¤y PþC8A^—¢Þ=†EN+C¦pÅw¬¶U=®#r£´s½¬ë¿.ÓræI ‡(l›kðÖïÞÔ÷½¿NOy)Ð-QlXÜWƒ4l¾¾xT:FÇ'·´‡œõ}‚‹;¶pm¯¦}…Åì(4n­§ã‰º>}Gûs1ô E–qŸH©ì‚ }sb‡¨)3Ìõlr_‹ˆæ(T”âP•ã%lš‰ìÖÎpe•…õñÌ)lÄOqš-w`kæÐŽÕ_Ë<¡ì‡´øLtÐè´Õ]~ï5jÕIÌÝÇðNxZkb+ˆ]V1Þü3Ÿ<…ÙO|A†=Œ1Øf'*¥x"zÒÇœD>BìôÛÄzƒÒÑ^9¡®´˜9‡Ílét2RqiëNüJcÒ ánn(£54g2ŸðGñ°l­üï9¶æÇ­¡mÎm°;骒W{§óGæcáBÝõŽ×Œ¯´WÅšN·{9}ìD“©Â&ï'Aúˆó¦¯Qy¬”Ö¦ê oÝÛ7Q‰‹ìq÷02v¨í#øû¸—ß~lJVàK¶FõA¸å[È”wsNƒbÒó„v½äJ×'ìAí]Oœ6*<Œ:dQ Ñø#J¿/ÃÜn™7ŸlL †¿V”0(DqÉܤH± ed>¨<¿Ñ²Mìi`Aá@z)Ø{ƒN4ñ­@†ô“_¡L‚p‡òQVÓƒ Wþšlö¸öòæ-½®£;úFøƒ ¦úC(sH­‡¿c³ºß‡œ—%‘’•µm†IK¢zEÑÒmèüÑŠ¨ÍRˆÎ£;WaÃñ6jã Ïäµñäƒü¡®ç ò*ßK?õ=æ!‘y_/îî°¹ŒU¦É°Ã²vš±é‚B#ŠuÙ%º5³¾ X»ÉyÕ´P\¿ úlÙ,‹£Ž±(PÄFÀw"&¿÷ï%MóJ!"BÃõ^¹äiܘÖÔe.jlÛûº TzŸ¦_(݉ hÅE³É“'7y'>¯d.Þ­ì´|é·ˆ©zî‰V¦ÝïŒìRJ»„„IýlÒƒt×ç€?b †—5Ñ=«h8—Î)Þ1CS}ϯ”< m€³³é+éØé°”Œ[ctçC~`w”êŽÕA)¸[ZêŽÉMtÉ +Χs£5r 8+  ªA\æi‡;€°Ú‡‚‹|²Î½N݆ÈM#|Í´‘n™qk¤O(‹ëă/Gául ‘ؾ;ÀLÖRг>MNÛ®\üqBÌaG¨”/LâÜ3ë[ºæ…6¸H¤%òÖŽ2>:wø§ê,m‘1á7À¦ô,:»¤¡Ú€Ov 5®ª|ã|´ªùÕ4å/ñ8µœ(Êmçm»Çð#Ó©îVó–´B’{fDƒ/XAž!€oòêÖ-lD‚eÁÝ’é²»`ÊÈWlÛµ¦@/¼¡…JåQ® )¤ –Œ©_ÛìÏŸ8)Õ,özñ±V„Ó¦ =vm/ø*VÅØ"#& ]Ÿà2µÆ†C8è~Ô«‡ŠàfoÏÔj –öh8²;Ü…žsxž<C¿D7öå’lʽ`b™{±ŒE± e«Ë&3¥{è˜ùäkXÉ ãÑÄón–í9ïGήêØTëÐl‡»v?ÉÈ÷Ëü¶è).Á‡?ò‰óy‹³À_È"Ô:ã› gJa‘¬T½sÝþ½=t„Þ€r G Üú-ú8·Ÿƒ¨Å\·4(sûdå‡"¯Rí¾M@­ó·ÂÆO¾òÒ±PöJ¹¡:l>9*| ß1ÐÌé'o†¿àž6­í¦Ÿu–`ÁÀœ¢WvÁݬ­l6ZÞŒ_Ž£y7\Eæ`"îM̉l¾ô—YÌ·9õ,áÐÁÝ?/U`½z»{Ö^’»9™"—äþ`ÕQf„cZcN¸H·øÌQ1t81_¹ýƒ(cÓê˜J0¨vÀíLÒoPѰ«”gçVGvûåÝIfæÍ[ë ƒÎœ ÎæQ– ZnxJUîªIW¢MZˆ÷Pä ¬ßê(ø§*ŪF´Š#C(¨E´ó ™ ñ(l|¨÷œÏw#ÒÊŽ÷ý§ÊSƒfo‡Ô¾œÜW?¼8…‡'$ÃÎÎfÕAÉÙ~úºk¬›Ö‡µ$×5ï¬b”ï9ØŽÀ%ª0Ÿ Þ|ÔYôÆ+PÈY‘85}šðk?D’KžÏVXõOž<‹”„ ¢VCé°n¥¥›Zà‰š =%‰6C—³å˘â@ˆòÉíÜmÜþB”Iõ#ë½ìÉ7Œ¨„å^ض¼ùëo·ÐÌÓ«,Œ, ?ôdÚ8.X麓iŒj:îŒé‚È~ wàò¬½iiôÈ£i‚ªd§%ú×EDûþrQE†j—, ‰ ƒöywÚc™&wµàq‹úþv²î8XÄ·8¿ìãm…V„üc=®NèäúÉbzD«ƒö"IGCçíkkIzAòCÔCR$Qfj˸ɕ^z4€ŒCJMºPd1P¯,‰Ñh]EÂêÃ…—žA@‰È_x.`zû+Ð?Ó¯‹ˆà^"iS·Ïpꫲ7…][CˆË ÖÀýÁ¸XÚÃÙ:e¹5Ò–}3õöÆÜ·ë6ñ["BýÝ'O³ 0oölGTc+Bt“¡ÿ²Ê ô«]ƒÀu7Ò§ÜU•&Quó{òÏ××ɬ¦Q”ÅC„Ý®lµk4þ·ýÊîF¨1*JŸ# ï]Ò_ÏõZoäØºýPæo˜•S˜›²zœâ7ÓƒÏ+Ù%,S0 ]£IWë쯵Ò +Wi+€.²šÌ½[ zz“?õ4>½Xºož&ª£'aŽz¢}£P±ð5&ûe§;~· ¿—b%(öM9†üýmÂ[z´8ªçKl8· ‰j…àër£TÏ ÍwW66;ÚTÍož­Bwvº&!/¯å‘wyoRßÌÐ zÀk ^R/¨ƒÝDNñPþ.ô¤¤PÑÙ`9p -oz¢Û>Ä›r®½!åmS¬œ‡Iý;Õ!A†ã&@«º6Ü…E)<€ú&µ÷šIï#O4h—c>Ä?>%Qe-®q1MÞ~o§‹=<¾Í”Ìû2ëu×H³^Êo…¥žØLSFµ“À|WWAÓµ¯÷a c×ý nbåìV©›—!'"®<[\öÁõÔ 5È eŠÄTÀµ>’›5øüË»!QÒN§¶#¢ŸyëÒÌšÓTƒAHŽ*ûkߦ•5- WÕ¹!:i«8JOš [!ç í¡ßàà]X¾Õ¸n¨¦noÇù=ˆh«Sˆå;ÎDÒ”iüU(}´ÊRžë’Iײ}S¢8*JÖÛËáꌵá«€Âh`«Ó5C?ê8óqI}PÄgRAÑgLDuøðàÊÊ b.ЗG&ûhJÌJPÓG¾±3BïÜ –xU\TDUÉ™ÄOI´}ƒø}ó½$-± ø©:E.úŽìv0_¿ig[ïî,Ï‚™nÒù\þFBAÌ1¥ÌH Ñ0° Qøq `p‰ëzÞ‚«ÎLð¥ýËÔwK &©_ ì÷bøˆÖY­Ã§qhH’—yܵâÔ5ï5¼äÇ^ŒâK‚åÒŒ²4 u’1ªfºdù/96rMçO>`Ý`©­²V…¥6rD+¡â÷?GÅ|gÇÊÂ4¢xD——X{ì,Å(ƒ'ã/@Œª>îQc¸4¿(ÌÄ8pOΥϯÁgð= Æèvö|BˆEˆÑ`v; –dB¦%DVuTà…ú>´ñŠÝ’¸Ã—”]O´-1øå˜«4f·•Ü*.ì´0äiíhÝy—‘Û‚’y ã! `ÔÏr!•Ô¾ ]ØÀœ7Êfd > stream xÚ·T”]6Lww C7CwJw§Ô0 0Ä 1€tH#(%"¢¤4HƒtKwI Š€„tóáïó¼ïÿ¯õ}kÖºç\;ÏÞçÚgÝ7+£ž!¯‚=Ü¢‡!xøø%ŠÚFêü~~!>~~AVV#(Âò·‡Õâé…Ã$ÿe¡è !dJ ă¡6ÐðvD%Ä$ùù‚üüÂ=%J ¨=@› ‡A¼pXáî~žPG'ÄCž¿—0'@@BBŒçw€‚Ä ÁÚ „Äí!#ä 0„ƒ¡„ß…àvB Ü%@___>›ÜÓQ–“à E8 ^Oˆ=àwÉä¯ÒøpXFNP¯?†p„/Èx¸BÁ˜×ƒ‹7Ìâ xÈ0T×èºC`kýiÀø«9>ÿ„ûËûw (ìg wsÁü 0G€ÔÐUÑâC] èØþ°ª4‡<}øØÂlúL’ ÜEªÚ§îï¶¿Ê†Ï ÷õ˜ÅÛ¨ÆôÌâtž«áùh1¹ƒP ¯^ñRå:nÕG!Žš×å¨ÙÒŠÇͧN³lcÕqž.æzO@¦n›6膢­î#j¤Qb¨üoª~Bï3_¹fš¦ßG>2®vHŠÃ- ËñH°óDÊ—¥ÄÔ ‰v¬ÊÅi¶W—ôÔøœ²¤Öœ@k˜X~Uë>ÇÉ}ÃðÞdA?Iniù– ÒQi™h‰w>rÑШmIµwp^u ÒWúò¼W§íߺ«˜G´eŠ0øìHަ>—nЄ4ã«ÒOá5ìÿÜ Ë™fÒdÈ£%ùrõ¾$Rϰԩájûq¨Ÿ½¸Ç…J&Õ£*LƒADFBÍoÁÁ2º=cæCÃeúÜ+aWínVídvg,ESÀ× b3ëŸA ÆÔÎðßRëÃm7Z'L;uþ&JÙsýhý †5ÎŒ–SyŇkuEÑ#Èæ[Û‚^ý¡ÁéáO?i@¨„öúÆøÖE¢8ý§L`éç)_VƒuœÊãXùl¿D+•[ãŽNôØÿõ†'•üufV—]ôV鞯…ýG¨ÐA—I|Æw&n‘‚@¾TƒóýDÛyÕ'¥äOÇæé´%¼ØêûŨ]+!Ž®·A›šBGCÒ%ƒˆZ%€Ú V{Íf ®Gy¼W*£ó€ns®‚ÀU”~_áG à8À|ûÍ·æâ uú”½Éc<¬' â| ÿšFµTþÞY›ä¡Uㆠ‹ðç@s[LvGN²Á’mIËáN„ïÍS=U[ÓšüU3žÝNÈଵ :Gÿ’ŠU8õØkù+qÜܲ÷[õÊ'z'µ¿Lj{æGZý­TˆÈÕçsÚýk~|× dRTþèôøûÛÞÖ‚í þ !6÷cŸHa}Iï~Í×¾­'Ü0Åé`Ÿö³Yé]M¸d:¨†ß/œÁ“ÚœJ|¿U àõ­ºópl¬’"˜Ò~¨ƒôYKR—ûØ †Ç/¼¤MÙŽí ·ØPäÿ‘›lš|<‚Écž!A Ó!Ù±CHá{ÑVNÖA»eñçâìg¢˜É nä™uXCÊú¼Š ø#^¯4¦ï•ÂÊê,ËÂe „(ȯìeÍGw%šµcô«1FÓ€&3ö5ëÈXË]Üw·–PÈ+/M©Ùž©ÿ:_¢S?uÏR8-$uâj*tó˜¢ìþAL{tfC˜ÿ‘ØØ¥ÈTpV•í[Âå·“‰4K±‘c¡Öî|½÷-Ú Ø_BîÀºvÊ力Cª,G°jioçd˜wþ"X¬œ²×Šè4lddz¼M?mŽÿI[æ„‚¶Õ;‡³ïrõO­èã¡MßaƲWa¹K¬ƒ·FrIÔÏ2FøÈðAZh|µ¾õÃPPTäŠZyéÝö9³b¯­£ %f…Ã2'ŽQJµ²jTÈu4%$SÝ[™ì\N…ÖwJ$£ÓK¢$éE-cèɸª¹gw8ËlÎwÀÁûc­ÍŽÞ ²Vñ'É]çGPì·JßÀtÑâ.t|û®{•]„®ÄÄIxÅ5ÀÒ‹¥7Rì‚zVÒØë°ó©ªé WËÅ›ùÐ5ɼ´õçoÙy§¼Âý"ÉgE!CJ…© âk娱‘j¡/éréÒ.zøsEÒ` ŸŠC}Êe_p1Úð1oÜë¹Q†ƒ×ÆÚ=8¥4¤šÞLĬiÖíLúYñ \bm ±CrŸ³óom!Yíh·"$é^„9v¬öõýPáv ßñLš¥¨.æ"C Ì4i½ Pµ²Ñg‰vÃ‡Š zO #CKÖs#ÊêqŠ…¸nÞµ?)·“l\¹Ô1(öŒhÆbåפY;èçÛhIüi'Þc”›¡Ç£Gî½'‹ÆÊ„ÓÖ—)@2Ò3ÿ‰øÄ:\Ó˜X}Ñ¿©èý¦Ãåzµ×R;{q† ÔW•MpЮ€ZIÚìáé¸Úèy;ªÏôTø®¬YºpÔmï4Û:ÂʧÍXèhÀ#§©ë%ÄeÍ"ÙŽ^ð2ä°ÉMÍ9V Èã¶¹ÔFO"p$þ³` 8fhØ¥ZoýL~ùÁfw+šè'ÝW™oÄä ØÇ>™ÓIÑÇ DÇ¥«‹#âÆ"Ošl¦vp;'8·O 2nƒëWƒá’÷·Ó Dv (øJ$n)ƒ†Tl£QgÛËùÏÁ[ ›°\ƒ¥gêg1îµ~PC¹aHJ¡½ÇÑ=äw¯Ÿ¥a"š¸žŸ! G܈° þúµ›KÑÒ`a:Ær×®­/©7Ö2Üa¹ß1êûá¬xì#ïÜ(3z¿f£•&Up^âÛ­3Ùˆ¤²do&…Õ”4·ïßÿý`”õH»Ü² ÌݧûegG¢ÉMž™)è±Rêà@¬žAÔi‹ŽÆ„ûA¦E8ÆE±û&láb•Ys™’概ª‹ ÞÆÄÂë]Ç­?"HK%tݤæ¬eƒ^‘?㞯+%㵜ªžÞüÈ‚È8hö¸÷8×àDñYÖʶg % ÛKê>É$›´ûb¡Äš-5Ü^Í9JþÙ‚^¿zÑ‹îêw„¹;·CÚÚb¿IÊ*ÀBܯŒ€³ lf÷‰ÓË9‹F‰<òFÏ"¥|Kqï΋§©ßï,ñÿÜ2U¸F1¶ã™9ÇB]vIËø÷ž‚6/ÕlglY(_ ÷_âŒÅ¯‘¨-¨Z¿²#°LïMo'o¶F½éD¸ìzQ1©$nt¾ &Ô²MW}i`ÎâÂZ™»Š’ÙŠ^Õ)˜ ¾ 2¥è`ôUHÿIëòy€ÝH[ZÞp"<"¡¢ÕEOܺ´IV®ôÇqyä0à›’`¨&°n}«]³Ý_võQKúôÂ@ÜÜü^•–¡¾H—ŠÌ gl#óœ82$p`~$eÚ±* ÃF§bV¥‘ôtI’&§(«ýmÊ¢¥±ÂM{"º½´¼ å`írÅ!κI„”vöʨˆ?âEÛíàU´ï®U#fn¾Êj×êÖù£[k¨0çlüA»a"ÛE6YM½€ZèEgSYes½c~ˆÌ'[R;dUÃrˆM± ±!ÁcŠ\GžyÉ-¡<>I"hÔƒ9Üøù»bía¢nÓ“¨šÒŠ© ü£I$ÇK™héCùµA-á>ëvÔ¶™BŠu‚ø™PdÇaéë¯g¤ýžîÚ»1jˆÎáxzëå Ðqnܶ_O¼`_cÌFÏš½›kÉÙèvÎ…¿j“‘SÙXcÌœÃ1¸+@²^»ºÃÜo¹†èëk‰í.4=¸/"åX&%϶]¨uÿ¼Q`ÝþÙ(Œx. &î”3S_ÿèÿ™ÑíÊ5•=Ú—°kÿK/~™Py£N½¬íúòkµ:r*V4X”l´Å˜‹¡Ðé¡1€Vùe“vN›Ø’—³G]¸µÙ÷•üÔ´[ÂŒhJlÌ8¸µüÔ¦Ýà€ý³íÊ’r™·Z_®ÚVߘý=ú€Qk2Ò ÿ´äyòÉ–{nï¢Â@R ògéû’_õFÙèjEÇÿž*Ãz䳺yŒ#‹ì’'&Q¸ÂîÅãHÃdèÎRz¤ßé3tc]l‹žlU¹,7Ô‰2­þýû­¹_®zn•aÄõ‹%îò0¿.:áYНBäAÉÞ§:™uY”ÛÏ4Í@‚ÌW8X‰¨Þ_Žú›y@†Xt/iuíÆpÁ¹¯²Í}_¢H/xTV`Ç~Vj6·ÖR:~jÆÉèÀef&Nú™{D#Æ_ñPhqãX&Ô7öé»TêG!;x~Š'ËxŠvñãmTå¸D ÍRUib¤.)©ù›Y÷š»†G­¯75@uþ˦^yC©cöJѱÌÔ®HÞZÚ/f%;·…p =]b…ݲ»ÚÈC4u ¯*Ý È,—ÕEÜ¡äºÁ"²ãŽòæ‹"›iÜ4]·_çRøjkÐ\Äå nb+ð"Ï>òx¼RèJYBQÚmÚÖy\âuԱᇠ÷·r/kú\˜ÊTøŠO®k8y¢r¸äºôÄu™íí I¬Að SßÇŒy'Éç×0«>qnu_s+5Ò¥êV)c¦þ× 'ÏÖžëPSu.¡“4 eF-s-côœÊXdý4}çÖbY–¹ýxxÇÖ\ã3ðŒØ;¨ÔÃëcxGþ×*•rmªn ·èíKÐ5šoïäüðünvíž=w0¦Ôzù”Xÿ<_ž0Êx‰W´²¸½Ðô‰[¢¦/ qÈhê@íÛ·ßঠ3ܪµ~²Ñ„zk1c>¡µ¨ûëCþ¹ŸF™~ ']‡2ª ‹´Y‹»"¶.ýG´qj‚·û ÷5 °'Q’I/Äù.iޤ°ï0úÝtô˜R§Ç¢5ÖÎMÛ_èž>Ÿ’µ“ ¯V/Kֆ㭜|ÕÕ(:<Ï?«¹ÛJðLŸžRB•Œê§wiº”‹¦2Ê@Ûç¹Òÿ`¾…­Þt½QóXy]£Í³Å›bð£®aŸÔt°‡Šø3óŇR08úÓlF›½V¾ß«¡vâø7+N½s‡ÕÏÈ4 û²\Óª%¸*/¨7¤Ù!®ê`371ÏÛùhÑÜÙ ¶¯¹ÊnéÇ0j´>Õû…(HuIRoþ¶`†é£@M©ô*Ìâ @¾,êÓ—µ×Œ—义ýxø¸Ú# §ÓR•çóýqAv÷Bøm¹@ÁÅ1^œœÖ¤EKhgгâW+ñoÈ zçOcT½¯ú*úé^$5þ`pf˜¨vvöš rª;ØEä8â)çÄ„[‰<{ãÉ ·¢¯TÌæ¡ly<ƒl2ÀÄ¥^`1ÝÐ?î˜Z¹Âe[+w³ø3«@/*NW1¢ùÝÑ1§ÖŒ²Ò¢®¥ÉCÃQ$8 B×.»Äò ¦‘ páúä:ÔëóDïioCüY=¢TNñCžƒ eáÙ›!ì%>ÐÞ+EÆùUd%»ÎS,ºáL åâ§4 ά{æ{½]š¦·ÉG™ +¯¶r€æ.ù¶l>‰‘£K_én}./Ø5$ð.#)S€yãÒ|uõ’™L;£~QÚ ç•1ú!ø\ʪ1M]ÀjÂæsð:a5/JmňœåèK–o9 ýe>&´«I¢âóÏ2~AÔy½UäµÉi+[2F_ËæÛ-ve]ˆ§GeÔm«‡í&[Ý d“ ¾&Þép7m"N¸‘=h.ƒûǹM2Ÿ\âÏGyîÑltÙåbh”Êà ñVòM§æô¡Px³—­Ì¹M‡ZûÆyxF鬅ñ=4€ð(ùÍœüQCItŽÒ¼ö8}Ãà+ÞDÜc„*·e@.2²'ø¾0B£`¬ìÛ»/©Sͬ ™”ë;úÒÙD•°áâ%ç=–e4zg.g’~GyI?JŽ«öä4¨ãêr ¥ËEžb0nÄ-(Öû ̯ØèìZ®b'|³›\ôìK¿IÊεéO{¢¨V¾¸JTß±WU€höc+V@Ö$25[QFCÖº$n¾ž“¥`ÜÔ '¨·Õ® RJÑqÛ&E—òw´"D§®k8-Y„†¿}$ aJNIBf—…{É\-ˆKÓòq±JN°6²!*_Ëu1Ø´ƒ°ª­íûžTö®Ò0/\-žÛ©'ìªÖ¬ÊÂ#¨0ò2G«r^]ÊÓà©Z=BóÂÐ –êôîÎk¦Në^út1÷H#3Cò¦Sƒ¡WèàT€×\߇tOZé$Fú…q^bꉛü9¡~ºi¦>tNlõ”ê“ÜŽHqmß¼bŸk‰š¦§ªèrHÕa—) ]·‰uÈ›¯¨¸É»Â¬;ž±6;;͉‰îs v§Ù68–Fõ£ïkôúpE±±óÇè’‰•ãç(V¶vÓ§ˆ’%om! Ií­.òÔÏFF*¥é߸Ú÷^¥ˆP 7 B$0‘MÍí¯=ÎK,lFE>-n“!)ûîXåÍYkÖËó‰ ê2ÚчY¸¥†ãã”mb§î ѹ ôÖáB’öMB›=ù„ôÒ ï‹b]ÀóåXTInçÄïGn´æ8éü…-ŽꕃH.¨÷íN‡ØÝËóÖ—`_ ;.% ˜WÛŠ{Þ ¨¼ ž»ÔøáÌ4b´\ª8\‡ N’%¬ÕÍJd½Ù=éqb?Ÿ.ν#5‡R åeÑÖmÚ3Ù°ÐýìùÑ']p6,â1LKxù½ó†ñ’ŠáxòL,»¥Ÿ>«hò=É’>~ûÆØQÓóœ¥C©ÔfÞ³Tè—–‚Oäk¬FŠ¥œï¢Wª–o™:¥f1‡Ÿ~¥7YRd™˜‹%é5*MÜ“|ÎôˆÖ#ržÆK™ÍR°l(2™éSjó#%‘ç ×çyý~ÁJ²£„¾ÂxMzãÛ´kàÈ}¸Ãüö5±0Ž ¯ØIÛ1ôbI§ $ó¨—RoÚuh9¶‰°”Æ|·¤Pò‘ãÉ[¶^$|õ´{ CD€1¾ñ ê M!Æ¿ÖXޤé:¨e9—¡kÐðFÉ„•ÏTlô£Úk'3 ú“íó†ˆK½Žkå“BM0í{/zß'\ ?©—P“Úë¦wO£T$`¦ìû•{Ð2‡ä³mÊl@Í#“ Úl%&ó ç6~çô"‰£*ÍO-up~’zBæÒ˜W‘/U·[æJU“Ÿ>æùžªX) Že47Þ€”6o¦œM| ƒ}ÝÊD«_Àºzï%¾½{ô„}®ËùqLبY¼‘þÛw’Ž`b’(žÏ'Õ F¸~a Ye\kC£×£]«øn;¶?ƒqg_®`ß þ$ä SÏsçPö§õWîÛ•h¨à3Žö®p¾VÊðj a±¥Çåçòªûš´=­(1@ñÑc.…~iJ)D謇}]°z.€ƒ¬ÇéV\×LRb.`›a]–º±ËÀ>Ì¢¨>Óýmt²ÌoéýyÚDÆqsC“Ó¯òéhPYîìhVó2Å"žÅE7ŠŸ¿>¢kê½Ùý…T5$ô5#Úëfh ¿&+Ã$ƒp‡Þ£\‹ÜFOÍþ›ì¼"­»hû!¥0³sÀ ”oÚ¦•É£©ÐXäQÔGçwž3™_\[ÜOã ,ßûvÞ­Ôû⊾’…öÇÅ @ÇäaZ”Qµá‰FTtÙëß?…$WväÅ4šŒ·fGþPrZË£zDd n›;óÖyåJ/l&3õ ƒley¦àD I}•ʲ³}Õe…Ó9Ÿ–å£.Tâ†Àðw:/Í%†;3­âùk_aÿêåºm¼\ÅÐS‡²Éw\kª'Ðm¨ž?A†óÍaàrÑFÓµWuå®VÄÝ_R…&å¡Ä „)'åXLÚ}¾¶2zöÁ£E’¥Î–uuEe"F×Z‹$©~eÖX™Ï³†3­©e¿ÜHäxX!À×vÂß$ÑM.üxÃp‚Æáj <|¢Þþ‰ŸâMõw¢V€M馊5Uf™XßEØþ—%!žs?EÔ’56Ê-zº¤“Aáa3ûK„¿”!žò´ã½2r™’²~fIÿÈ^ñÂcâÇjï…j{ç³ÑÞ(Ýø,úüÔ Ô2 8zÃσõ€Ÿ@dXK„Ø›hÆgà ¾f™6ùÉÒF3óÅ{ 2 .¥s"Q,rŽ#Ôd #ñÉÂ[ìÙ ˜<=Ù‘¥­'t3«Å.¬¥ëÂÞ?ATW*ž1lòŽ5o³r:ÙLú¹Z=/5¾8f$îÄûð òð^ƒ›Óó_(’W`W>ÑÊCþÜ QŒ÷Í)ƒ«éáœá‰‰ålC͘CH|äVÒ>¥1²E{ñÚ|ZÏq-d~Ls[çä>¿Æð‰u·÷h׿=elwô%ó2ÕÜÓ©jƪ•ö Y^Šm¢W¤Ü]©Šî‹“Ì{à•]Ig”< |îb‡ü8ð™ê)‹hå& ¢³œ¼G:'˜¾;»ìô)hø591Õ;šíÍëôãûq/^ Ýs>–¿šfw6ýVÒ‡×S®kkâÛz9ž­V<š•éPÉYp¹¸n ûB`xë9g%*ؘÇ_·'¼‹ÖçùÀqK-{å¶-&ƒ'lC!ÙxÈ¡þ¸Ð7­yM;_aÆÓ&QŠ.þÌ6ÿÒù×[_饻÷Öó¶;”EZÕè ‡ìÞéÑÖ’æ¼×ŒÎQF.¤¸B«¤¶¢íiaψ¼7S¹] ŠÁyÚ¶Ahû¯yoD#|ƒ’X?¶ñÑ«žþlg¿Nê‰C„õZ7!w·DÀ»ÉìFƒâ[Òn“gë>´Ø‘…ŽòÓÆï›ÒQî¿f¯;vk n «Ò&îåJнõË3¢b9^%ð¼ÞOy†ü³trøZå]ld`É Aå‚}ÐÑèš ³ÕßÞEPªEC•Þy„ÍÜüy46×ì´öÖ@1ú³×¶q ø|ïkMõø¥'ÙÆö‰`ƒ!H­Ø(fáÇ"b:8ˆ¥À@}ÅÍ‚=ÎtCÞ’þsä G•C!»QÞK`,÷mYëg¿‡·©°ƒBz=7a§}ñƒ0JNFi6.Ôï]xÃSôŒåùø„¤¦™ BÂA ãNQ‰Óoá™AÄPd‡CQJKó1)KéÁŠ!”¡éc7Óù½V“Bª®¸bMAjè/Vk›ÆÚµ"Ô!š—2åðfªÇRJ$]=îEÝuÛ$a¹@­Òü~ã=š0Bš¾úK?b§3åìÌ=7е%u,©ˆ„› !ñÖ§€ •ÐÖäm„?áñéᎠ¾Ì‚„¥ÐäönÍW´°¯—¶ðA*gŒ]ÑÜÓÛÂ×ë1J¨?}×› ^W#Ÿ–£Š­µŒtP–tyCý§Æ·]B*gò>Ëê¬(`{Œâ~ª%bO}øÊRÜï£ö=0Õņ6Æúof”[‘á6¿¹RÄ‘O+«ÔË?$Ï2ZÔý=eÔtÍ–›5Ïk焎KÂánTÈ”±”zÔ²¤1R÷I_“’YqMü ²YåãîkÍgؤ¸;ÿ}׺Á˶Ͷ2‹…’¤åÒÌ)n­Ïƒ!wùÎ 8ÌjD›J³E|Ð&x'ó:ð;Gv˜þ-2¡Q®Z=c4²mO«±Ž.çJ˵ØP '9õÖ>TðÛùÊê¾»ÆN%FïÜÍÝÎ!A„xžá= i1 ¯øU ÌuXÅ4­­Ü!^kq™CÊ+i[uÞ‰Ô©%„¶sѶjö¥^HWmf7E‡ÿËÊ2Æç1ë‘@hbȄ٠/¿~)Ø¿:a±g‡`)êà]@&CW™W1Ò ¼îÏÜŽ\7›C›Ð·`²b†=¯5ææ#ëþèq–O¸ƒœ2g“d®p£H¥«Á ù”òŽÔ*Ì÷}ÀëÍ»$@K9!pÚ³…õxv|_´ù6U[qœûæ£$bÿÃ'ÃI5ÅaÃhäµ–þbëKÄ`/!–V7åzabþ&¯ã8DâñtëºÕ8M÷p!¢*úDÙ\±åñ¢;ó÷vAÌÓ%² _&W‡Z;ØtÄ”Tбœ6Üì8ì¥ÒxÛ”t¥{Ã_¢·m¾ œÇ'˜m¯O â“Ž„ªÞÝÅ)?‰|Ó‘ì4•ðl¥)z endstream endobj 42 0 obj << /Length1 1735 /Length2 10295 /Length3 0 /Length 11405 /Filter /FlateDecode >> stream xÚ¶Pú.L—t#µtw#JwJ‡Ä ,µ°4 H‰ ÝÝÝ Òt‹4Ò ¡4Âåô9ÿwv†Ý÷yóyã70ÐhhqHZBÌArGWNnQ€´ª¶67€››“››ƒAìjú Ç`ÐA]ÀGÑYHCA@×'Lèúd¨ q(¹Ùxø<‚¢¹žØù¬ PŒßF*(à’ú ú]áp™Cv §WÒÊõœïoüþ¥xÊÉú/òdj~:Ž¿Þ'âýàáæpÙüKpÿ% ¸ìÿŸö›ËñŸ`BOÒScþ¥*ò·È/ò$ýKÍ÷”ÊÙ â ²4ÿwÌ'ôŸzž:Åårý+Ë“Þåé(ÿqx¢ù/ŠO)]m  q|*ÒÕã_e–øèL ”FX‘ Ü”È4ä»^ãÎZ&õe¿,OKûñé-ycþw[¡n†C°Äcñ&Á üTØgm.¸Iç°ç:Ë“rû5WÑ-<ñ®²ÓM+¹XS¹þ$o+€¬•c–»:Ï¢‘PY8])lœc¨X¹³¿û·ÖøW½Ú R#ÔAïç ŠZÂéóQwm4âó‰<€r#þhqX|¸[F]KÐK¦p–Qéoÿô¶|lVK7déO%¯ôèÍÕ”¾§ÀÔaHôþ \Ê¢êx¾pdþúǨCÜѰðùhbBk°*§U¼Þ+]ü=»‘e¾wAG)Úü{iG_þWM†Ð¡jX”¤[ÇðQD¶4k~V¾rÃ-†_déÕº„̹cŒ+0ÃoÛs31J+Ø'ÝJ„z¡\¼KÿŒÓmHÊÓJÞ\öžÓCïÅ]p „½ ¤@JÅÎN¹†*b…fm}Ïo¿ïSÆø‰Üš[uÈš7Kùž²Ón¹ñՑΑÅþÛ±ÞFÔ28¦&ÂPÇf5œÉ”qžˆÔÝB½Õ²Ôâ/ºË˜%Éjn(l"K8üBx¼äq˜§zÖְаzºÂi+¼G6±!ê=¦ñ>å†ÞRù;ï$š ý%©W:nÖ%€y ÏÄmrsñèÝW´ãD ðè]Á'ßÓçIÞïkZKÕÛ#|‰Ñù%w T%N‹oädÜól yÄiÜ&b±;{¼+¶ø,DAØb.Î;gwµC%D¼Îÿ!Žä^”JùËʋÛ½G†Qýø  $úÅPQóa§­z9ËT©qªy%MfxA#mÖc~šôÈ)/83&Õ†_̈Ï*ЪŽGT Ê4$é¬büµi­("h‘ÄAWIúEŒ±š}²ƒ‡ÏŒ‹yUüBúà‘0ÏÄmX„G‰¸¤€¸Vï.ãhHZ¹ÃN]q›TÅú? êsÃ{·ó¬Ñ Ò5ùÞ艭ñØnƒ7…wÑwð×€à«ëë»%*Ûìîã9Ún¯÷ -¢+ç/Ï|)dë?3oi|ãæŒë¬úȳÊòÌòŽøÃ;º#Š(c/Úü5ŒIðÛ‡ÎZˆ5á;î÷ZÙãi‡ÄÓ2â.·Ì¥²&Ƈî„}–¿ÊOd®®œ¼yѪ€‰á8°bÁ¶VåI­?ŽB˜ÍC#.ºN´×’¸KìJGÕ»N,ÎÐ2u•`®Õ 2òNÍÁûFÖlX’neŽ0m9nƒÑ‚úŽÔƒÝ/¼Ýò£%Ìß¡èG{Ö[ ¬˜A¿â3B»v)°°Pð£È¢–ZL_á¡`ñhhY"ÿ„#Ý6 ÿlÆ’ßSq1ÕGº ŠNü½3ÏøÙµ&¾ñ¤œb¥¶çiš­µy¦Bœ%'³(F÷æIY:gÄ$BC¾“sgéÏWÄoË_™ì{{²/ÁLbÇ,Œ¡i›‚ʦ†–‹œ¡ÕrW…8íeé_ €õ“ΛÆÂ7ô„^ÍMRa(–?ì¥UWc9=@îºß—õâà ëlüÛÒ[WK—\â4ix5o‹Æ¶Ô¢»@y¿±·‹=Í™ ÀïÊYË2 |øð-cso¦Î!Ñí  žd}iÊ+~R6Œ_…nk/•¨´Ïo+âÂˆà…‹ 6šˆ› &'`÷58Ÿ®oÑ2]§}5îâ]ûˆr‹”<넆f4)¾np’¼˜¹­<…‘S7ýdØoá닺êy3u QS¢n8xø0qžò+[®Â®¼öYòy‡ºmgRûóʵ¥¶zT=Ðó¹I—Õ9ݤ,¥×ɉ?º×QK•Î tÏ>§ ×uñtÿB±¤SRá!'P­' íO3/}ÝMqÒÑbeÑ49“­o¯z&fmïy’#`P¥<ñ2@kûÌøÐC",ßßU`NÁe=ðîb™hà€ë|³õè.ÅŠÛŽõ··ñ¿r>ÌÇõeâ·O˜Œß–¸©ê4UW\k"K›à‚E› y{qXBÇH=±¬ÈsÚG©oñ…”Ö¦æÏ®ƒfº®êµ2J¶˜²ž“{ÃÈZÍ f,ì4ÌÑüà1¸sjzz¯ Ǽɷg*h‚°´ß5Ð,¥Ÿa/  ,>âÊÞ“‚Ë?Ú `”MFî®K¼WE÷йJ?âOZ\êcO_†˜­µ°‚ Ø"ªÆä³6eøµ’wy/·Š­zèìHOJ„$ä…gÉ·~^sp˼óUß'“åÔ6o0Ä›kñKÅ3å ×Í­ÿN–ROί¹OEIœ_;ÙppºU QJú¨×ÍØIÔâ£gÈ|t0© ‚>,±:.d©Þ›·3ä¬÷!sNVµ\A’)êB€êNÅJ«*6ŠB•쵿°i+¢¦ø9y@ Òfn‡ãM\øÍ7*óY¢nö*kuG&a¢áû¡ÒŠJ’ç²³!L/(‚yˆ¡[!é#o™È~ ö»Å3å—B7´9ãæþÚÓ‰´¯Éã=œÆmÓˆâælôy®ê^0]O"×›:ãˆM0Ÿüx{Û- ßõ,$Œk 7yFNmŠn™Äf_¦M £ V›ºCuÕ¿熠ÁG[¡$îf–Ú¼[³æJñlË©V›:˜Ñá?·–þNø: ŒÎ Ã×@UÙ(ð¦?Œ½cæJ2ùDSc”UÃ,v¥§ ¿—µ~hæ:®«1j?u© c}íýlŒŠaHji;[-³V™;>ɉìñøAå´>^¿¾kiõF&¨†²ý €ýÄ¿7'AvcÙQšÔ¿ë^%@X‡pК."ꓱÒdk²x©Fxt)ûª#Lù:;éàðÁ?õë ÙŠ*•ƒ>ãtŸ ­¸žêšÐ&ÝÅP'jgÑéõgÊú¢íÝê®¶œRû]ì‹Zò›”-ÀÐUñy– 6ñMøÎ)(ÿ{w' ¼?š”¶5n2ÊJ/±vŽ60y<,0,«lÁŠ(mÖ:«°möáT¿Ð”Í5ž'‡—Er¶V|}²eñn¡:;¦¬Ø[ƒõõç’$­ÍmKVê]{µc’Å(sÛáÐBv7Óþ"DR î5R¾ÓN‡Þ—ˆ\{ko_Ÿý¬s³ú¹™‹qƤˆ®†”Û¶)>Làl[z–‚1òñ0u¦–-³1GpŠrš»ÙV"Ȩ0/-2ïEöé‚Öâÿ¿a =W‚>4Š­2—YË›ôôÕ×ùUyj죘ø+o®Î’‘t¯ÜË|Ž£½nާ'·j¢JZJ]óÅk‰Õÿü ²¶ËwŸÎ´É¦ òºðËò¼‘ëˆG‰$ºaŒž$ǃ·Ðlà0DÔ\ñÈ(cƒEÛÜÀ;.cß”ü=0, }» ‘饇Œ¦¨Àá  ÓwϦi¯àîj×;^<çó‘Œñ–Û0à¿ÔC]Ô¢PIVÚ(ÊÜgñ{$dH/27êÄSï=ëA”¥éºÖ2([!'N›©·íãÿb®RQð{$B¼>ÓËð=囟.¾¼d°×’,Ï•\Qõ×?ùÜ"4ñù´ÓœbÌ}¨üocÅöyﺄÈÌ%}ƒ²Rž¨èϪ îÞqá2!˜‰ROÌžµ#ÔwÖÇSµÂ [G(ÂÓ_ȳ'<Žªšyùʦ“Œˆ³XÄ.#¯þHL}ÚP~F#,5ÒþÑ~˜srA5AÜ0ç採ܤ%>Æm(VJùé\Õ$"‹°1%¦f )c™ø ®7ù³¡Ó`w¬‹9È·¸GzYs‹¼*ª§¥âÙ/<~S/WlÄÔrÁ–RÔnŠ˜›u?ÇÿÚkÈ¡F×l³s·§÷©_q;;¶c¼ö„›‚B¶n_‡Õ¥¸{Ÿí¦õ¿;…}9ã2+•˜_%·Š—é2U=O‰¨0{X7ƈÑsàÛü>¨nKKÿÌ}_Á=M M%wI×’®ÜAxÙ3í5‚yg4{7k"FÃQÈC_- ¿ªŠ‡§Èñêx.^ñ;O¨%]:¾’ÈwÆÅ(Ä`ºÀD¿õǵF Ö6)‰-ŸÒ…kpÆ@¨àÖœþV^3;Â'éáppêÄ—ï_½70+Þ5S2•ªZ§²)šu>Û'Ƥy1Ìy>1HÞÉÚש¢zU>x²›fÞ_¨ªL–„™C”Ów§t‚ ÍäsÖ”ç|±Ýs‘>1šΔâx§eL·%8;ðZ·óÅyÝ7}¨_ÁóÚÖC"L× LlC(*óâò«Š™Ô„=pTÃPÙdEÝ#0ÂGhƒ›gJOJÞnÄ =‰_L`~4«sÀ¼ªEžŸœ”К»¬ƒ_±÷=7t¡ì-NãÛé‰MŽ2ÔX,Bî ‰>^ÒiÞ4=f5<,—ß"We1!n*‰ZØ–òZñb¨Å6ˆòIKG¿PÇq§{K2STü|;jÌŠ7JÑwm3©¼ƒ'Ü-ἇ%–,¡ò|±äö:^ÃvËÊ#çÜÚœ!—%­gG½‚ëõ4ÍûùiÒw‡èâ&ò0.Z¬Á›MŸ­¼ŽZòçºXP!ž+¢JÿÌøg’xk‰åÓçÞcP>ŒO™’/){Êßû‚ÔÕåóPäóñ^[– ˧I~1îߨÚÅñ-†)ô¼6”Ë»¿nâ!ä­¬øÁŸNØiEDÅÕÖ^Ä`tÉzdà@:\¯.¹\Ÿfšv¦Ùð„pÁŠDP‘§5nïvi…zжå× ·"é…ƒ²h1Ð’“~àeŽ5¸´ÆŸ®¥¤ÕTÊ«æãÚ:ÝË æÚÂ_1e—Kch—ÖôÍG’é¼?ÊTñŒ´ÙãE÷Ï ó¯,‡¦è ü0R+a¨ß™H)Ð:$¥n6~ NÅŠHÊ>ÐN–WíÛ{çÁ“}’Š Tîþ!óù»;Y·ÊçB¯?{çŸ/º×ò6í@].…Ë}ƒÙ`´—mºàa<®N­f¦¤Dݳ¢ <|äÝû…±J›ÄÁŠõº*¿ï=WK)g4¸ë¾V/ï–Qd¿ÞlÝ«…A––Ñ—À õìÂ{ëÐ’Äiˆ:³t"dÇnZчz^zˆý¯xÕtdtÖ÷NTΆ_ZK&/Ø0O™¡ l»¾DÊÌÙ<¹P\-®•æÀ÷2 '«fähn»FÔ¥ÍÆ£ÄÆÅ´ðÇpµ Ns_ÅfD´Ëo[ì'еŠt3̯ö¡… kB<ø}Áê‡õ Z'΀b«pd}ÏrÀlLRl—X‰è}²=×;ýÜ/³„›âÓe½¤Ðê7$Î!­ ~@Ý<ÞËcªºÄõþªjG{#iš`÷¨ù슫Ë7ó\ôÚHêvDù^–ÓI[yËŸX©·%2½/z ©ä¦ßÛÆ‘Îr×ò³e£ÜžþŠwù”²š³H]¼wVi Ñ©÷6G!Þ Á¨Ñz3À«}mi=ù‰¾ Qô„l笅̭ZFrP¦m-Nåm\ïižÏ£nF¿ fgäËùÐwqMÖ:®É(¡çQmAï3y¶ða¡£—Ës¼ùˆº¥1TÌv*F@ùNÑ•Õò\Y×¼?mr)=Ún¤Ëꀃ„áS|µŒÔÀÐ'9 …1iàâdA‹J㥇às;›¦7BÆŠª?,[n…6‘Y2¦½äy}-„n¬RÌ[²kÇcnª “nl/å*O¯=šæeBä:ºè`v~™èu«FбÖ›BQóöa:ðâLþ¤T·~A•:ÚmuþåsöI'á@3û} º„NEÒÉT^) YðÕ~}ÎTßÈÃw·ºÝòãD¸Ì@ÇgÇ9Õ¯÷¹oýF³Ë>KU‚J0ÈÆüy3¿ÁÂcÙ°ÂËÔ¤VÉ鯗Ú,^pU`´˜:Mê5‹‹pšwîÌ’n}R-Ò‰<_6[r‹›?S¦¿ 9æ5ã¾g]g^1KÍ&ùA¨¼ËÝ 3>÷Óï}V`õÍMJ†4%ŸbÆ^àª-&äìÑþÆØJ¼Ò­ê `¶ÈàÐwî’œqž‡Š(pi„,åçÀýLÒ÷‚<ˆ…{ßûçôˆnªÉC0yàëtl[*Î…NÇZªŒÑÏØ0¢²*W §Õª [ÿlˆÂ»­¬Ÿ||¸ÄsÄ\øa#— ù©®­»¶.ù¹äÌzÚ‚ˆ5®/Ëó§õÚÔF¬]g9xkåu¤,ÃUï@îò©án0ù ÍâŦ³Šíz*K„׿<¼TÈÊ©Ò,Lßi­{ot7VËú$Á3BäÌ5,ß å9¦¥ê“d8e;uêc³c(vÙ~ý©Ç³8„£\VÊ»>ÎkåFÉU…¿°>”ì®—;Ù¾ÒlPRøÚÔfkJôl/ÄØôš^±»VgŠ%­¸Âà§.P)-ÛˆÀs“AP K5RýO#SIOÍg„ÚQ½—ò·X,‘?$FZÖ¬Hv/Xг\ÜUUMκ¾Jj»Žâõˆfr+ öËaz­Ôÿœxžkèrm›ß•TO©*sB; ^(Ï4xýÎMÑ8Ã7Uã¹÷À‹eâ”i íÚ›CmçÈ3AÌbÓgNŽz_ÈBùYé1ûÅ[ïå¢~X d/ßãUt¯ãß96‹ªÛjŠÞXð< µØ.ÒÝ¡¼YŠõi_±íÖÞŽÅõúa~†£ Ö(¨9*Î< út÷Ö2¿g‰]¬eåâÀƒy¥‰Á’&qÁåm‹¬Ò±ñ²Äfî¾—–ªžX\2_ßã´KÖw*µXŠk¢yÔÍ1;”-W˜&óÁ\4Ý„0-YÙd"гD†_ËšªyšéŠêÔûMYao;Gî†pçR_ÁgAœý÷£$’Â[\SÏ‹&ÑC6°_ñf5¦Ì‰_ì˜B„— Ë`NM-õrŸìj÷RXkc x³&].n› íoÞ3e–èò¬¼½?ÿ@ý OZ¢S§Íd~X©yžr$0I ·É´ñd½m¹Ke•]D}°qÙgŸ2Ø=XÛ¿oÝéS(Ó³^3U¬"@¼¨ÅAf”>”:ΈËÔ‚­v]Ö6¸€ýoéÞc£‹]E#ðÝ‘žÎ ÓT–jQ¸äZ&öçJu’°º!1œí…1äO¿;ki©K“a¡º¨f¿*ÂC±'Ôbõ-%«NÒõX/ò·9v78mèV)—‡·»`xd¨?gY&^¸Ç/]³­å.oÞî "LRd_8vò8i¦öR ôçû<Œ~œ†ÛQtÏC[8 tcÐãLuÌØj"©©ˆ™í´~¨¤¤ø¾ ݉-°\M(NÃMUÝp j}¬,6Ü[²V:|†Û*ÜÊÉ%^™€®'4¾©Ý›R+‚Ø®&²•4%®ºsÙÒ›»¬VÇb“²ªfX4wQs̆j¼ÒSc»ÁÝ#|ß"•6v%ïoãya„bDš¡§‘ûRá+æ˜ –9„ú•}Ç\÷7õÜ•»&ËãQ݇EÊ}uRo&ü$ \**ôeÖ„Ö†u¶BHâÏ@éU!æX´ÖÄì¢â¢N šWÇ ºA“Zx,zܳÓß9ì‡ÚòäÊ0ÊÓEìbLºz)ªäœF³³ÙXæ^„ +—w‰~.Ûj{ ÍkuÀW:߃ žOá¶SÓpC69õ•ñ’ê ­šŒDr}çÈ`eÞ½øsêTñž/¹âg|ƒ— øÕT£º6Ò¯"ö¢=B9ºíç|:Ãl¥ï£K€/t¤ ;ÿ•LèÔ]q‚ϬÊ-º#ϼºßÐW™wêÚÒ§ï?Þq{ìç}zŒþp?ž L¯ > ¦ úÙjÍY_™\nˆë(@±©†4¯F†MQïŒ=o"²_TºEÑð@ è†-×”éo2«nébÂÿ0îlÎ4,7N¸%S´å1êm½NÇ´³®_À7Ô¸¥¹ÍŒfk$3XÑypÜH=®'Ü©[œ§©—àÉŽXOQ`ƾ"7;¥‚{Pû:Ÿý¦ ?Š¥þà-BÖ]NQåôË÷†cRSe¿ܨðìy<_vû<Ì#ëWÅø[L&›-à,¢šWŠß²ÓÔû_y8±ã¼ âq¸î²›Ws<žÁLH.Š7›•Y‡ÜÞ5c™*vÙK6Ü]#¼¹–t †ô›K£Ä¸ÁVgs÷Œ‡–'ÔgKh’ýLºsC™>Qõ&¨‰¹JëxÞº”¢¼×=œˆeÔÈw±®Šè¾©ŒÊs0·ÅýñO¦ÓK’˜•úS™^žÎŠzœnaö„¥ –Žåokð”Lãàúñ‚´ÃÐ á·ÕÎÈÍæŽ)š•×Öj¦†£:\÷îeV’b‹Ìëß®W¿s¿‰*›éÃçåk|ûÙ³&/o=»±,³(=ýûãÍxÕòÌfeƒ’uü• ܼjíîbšSwbƒÅ§dò“¥ØUþ(ÔøƒÛ½Õ*š¦Ì#¥Üˆ®o§úÚÇS4ylu[;):î½DI![8ј´ =¡UÇ’5BqØûfaK·X¡éœ¢Yçšþê!ŒtÖT4üi°¬äpTáË;eÞ¿+P¿!tžæ¤ ©•'ÈLrWÎý ì?í]ФïeטY·JšËQËï@*ÿ–ÜhÛI R’Ï›ÂMâ®á=±ñ™Kþ4’@`Ýž^þX"ŽcWMCuœqÉäȾ)—¶¶“THÑðî°e¤ƒ^7ª©õ<++Ú%õÄ?ç¡·®!4›ÿìÿ_b¿ endstream endobj 47 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.14)/Keywords() /CreationDate (D:20151013203256-04'00') /ModDate (D:20151013203256-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) kpathsea version 6.1.1) >> endobj 2 0 obj << /Type /ObjStm /N 36 /First 266 /Length 1933 /Filter /FlateDecode >> stream xÚíY[sÇ~çWÌ£uRbî·ªTª$alWäKI8VìÒFk‰±_òëóõÌËJDâ8ç<¥J ===}ù¦»wXI&˜fZ2Ǥ’Ì3é“‚)/Í”Ì00‰Ì0$3Ñ2¥˜Õ¶#³Þ1¥™óÂØ)%S[¾¡ÓY|cIY KУèO²ªetLãbG[¦½W`Jb&• ÌÀ¦ßhØ&¿$ƒš‡álGfñ ¾X/™´Ìºß ³~JÇlIJôÌ Òb˜£PeŽ3Ž9-DçÇ?güY9(ï±Èœ1ÞW—ì§Ÿ°Üáƒo³‚ñ7Ãë¢ÃOÊiUL«³$×ágÅ¢\ÎGÅx%ÆËâj<<.¿² ˜d>ªË¶Ï±Ü!±ZóÆÞůï™]H ÛŽM—“É屘ÄD×[ý  ézõ°>dW¶åú–@}m€s'k'„CÉt:—š ÚÔ´t25N…hèçoæå輨Ø@Ûë3>(¾Vlmú^Ì•hƒ.ǺŒƒ}K.〧ޅÓÿ‘Åõïçù\þ‹æÿqïu×1otM?Xдæ]èF´c Ñu}-áÑ…¹¢½Š]4v§¨¥]ëÊcŒ¤§Éq2Y´×Jƒ½+m®¦›ãDúlfyuÃkî!®²äE¾j¿²\CŸ’$+È7­“„ÆnÊ¿@ÞÙ¤!A'Ê“N-Ò*ž{íG1†bJ3•0I{h……²&H[5FÉf6TSJ‡än“úæZýûÛõQw¼ÈZ'×ó˜9uX½ ËQ.@á,惡t€œvîMœ)¥«×k^Ú[kü²¼Öo3œR¨µyKÏR½ ´M5 HÊêÓhÐÓKÜ­3UõQØmé,¡#åŽI_>Æj ÓyL–‘]!—ð¸‚7x€YÜÉ`ÞB‹Î#¼,°)¦B´5tÄ*a郂éàL’‹Ò©šÌ£ £– #Ù©)§ÖÜšc\ªt›¢Lß¹BQ­¾–'n½'s#™µ¯%6²yÝXòÃ`XIE7JåQ&$4¾c$-«Gêïž™ƒŸ,©ÿ¤½MIFÃC”ƒ¥X3Ý\M]6.ºtƒì‹Ñ|<«Êy¾Q¾ÞbåäíQï}ÿ‡“—ÇRaa2¼Æo,qœn¼‡øpˆ_X¨NÊ1+pï=ZŒèÞë"$O†³çÅøúÓàp«-òÚ¡¤ÅÕp2M¯'~^·¿ §b‡_Ô›ÐV ãf8§«éþŒ¿àC>âW¼à7|Ì'|ÊK>ãs¾à_dÏúcèÓ¢yë~(з½³—ïE gRÜ'~”"NêÖâ¡8õ£âtÍ0µl†yÄû)Ô×|Àß!àyTÞÞSàŸø'üñ÷üá×ãæÛ즘“ßøïÀåÈLÇÓð”g|F?F&ŧ*Ss²ËgÅ|\^%ø㯀°º™¯¾”|É?ó/ü+ÿÆÿÜ‚UíkopzÒ$Xw¤úFJŸÂ?ƒªÝ‰êëŽEF/ƒ3ß üÏb^nElö‰øèüéÓ‹^ŠØïˆXçDŠíÈÄGGlwDlu3b±].Ï‘AS0üËV¤nŸHûoÞ ž¾C¤ç§ƒÁ®ªQT5š®Äè;Ñ5‚•r+Xš®ƒUJm{Q5Çü„÷ó)Åߦªù8ŽŠ”ó‰Ê9OäïEµfƒÎ ”“rº®´«r2Î\ñÇr8¡²kÜõ¼VÅünáMŠÅ"Ußc o6Y.ø˲*®>NrŸ¡l•8 *ÀvF†}ÎéüÍÅÏg8§Á‹]§¤mÝÛ¤2ßS…‡Ò¬Ï)ì<§g­Œ¼·}›½Ú÷óW'GÇÇãÎL49­þ®DÊÃ)–äy´*ÉF§nfCÊ…vcngƒÙÑ‘áéòc•¦Ä„‹ÇÃE‘ÞÝy®oKïHÓ{­þx¾¨(.\‹:ütXO$u¶wã«êfA¯Y÷6ÞzÖ¶lë¶m¹e›deÛío»õ@jÙ¶mÛtûhÄí6¶Ãþ¶[†–mÿæqc;îoûn³n™móz+te7æÍþæÛ=hÛ¸Ù#ßìþÆÛÍ¡e\ÿ}äÍC×wÓKâ½%^ÂRêçñÕbõ‚;¿¿]¿¨¥V…µ'½rtx^ çÕK‡ÎžÌ ¤+˜kLÕýß#ÍŨ—Óÿˆ-ä¤nñôý³$Ùæ§ãÛqÕ2۔ܼp.3÷œîɰ¼îä`Wï³ëxL]4´ö²¼*øÛEñzYMÐÑ€ËëY1=J¶˜\)þ ؇Xª endstream endobj 48 0 obj << /Type /XRef /Index [0 49] /Size 49 /W [1 3 1] /Root 46 0 R /Info 47 0 R /ID [ ] /Length 143 /Filter /FlateDecode >> stream xÚϹm…á÷–c1`–û4·È•XFD.„JH6FBFnÄBÿ$Ÿþ f¤‘¤g"%²÷¹(CÙRcø‚ ac(Á ¦0‡T!µÒGœªÀÔ ŸÐ€ šÐ²jÿ±Ñ¶¶·¨Žuü‹êZù%ªg]ÏQ}뾋Ø›ï¨!,akûçðþò÷¤³I endstream endobj startxref 88981 %%EOF graph/inst/doc/graph.R0000644000175100017510000000671212607321273015652 0ustar00biocbuildbiocbuild### R code from vignette source 'graph.Rnw' ################################################### ### code chunk number 1: g1 ################################################### library(graph) set.seed(123) g1 = randomEGraph(LETTERS[1:15], edges=100) g1 ################################################### ### code chunk number 2: simplefuns ################################################### nodes(g1) degree(g1) adj(g1, "A") acc(g1, c("E", "G")) ################################################### ### code chunk number 3: subG ################################################### sg1 = subGraph(c("A", "E", "F","L"), g1) boundary(sg1, g1) edges(sg1) edgeWeights(sg1) ################################################### ### code chunk number 4: example1 ################################################### V <- LETTERS[1:4] edL1 <- vector("list", length=4) names(edL1) <- V for(i in 1:4) edL1[[i]] <- list(edges=c(2,1,4,3)[i], weights=sqrt(i)) gR <- graphNEL(nodes=V, edgeL=edL1) edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") ################################################### ### code chunk number 5: addNodes ################################################### gX = addNode(c("E", "F"), gR) gX gX2 = addEdge(c("E", "F", "F"), c("A", "D", "E"), gX, c(1,2,3)) gX2 gR3 = combineNodes(c("A","B"), gR, "W") gR3 clearNode("A", gX) ################################################### ### code chunk number 6: combine ################################################### ##find the underlying graph ugraph(gR2) ################################################### ### code chunk number 7: unions ################################################### set.seed(123) gR3 <- randomGraph(LETTERS[1:4], M<-1:2, p=.5) x1 <- intersection(gR,gR3) x1 x2 <- union(gR,gR3) x2 x3 <- complement(gR) x3 ################################################### ### code chunk number 8: randomEGraph ################################################### set.seed(333) V = letters[1:12] g1 = randomEGraph(V, .1) g1 g2 = randomEGraph(V, edges=20) g2 ################################################### ### code chunk number 9: randomGraph ################################################### set.seed(23) V <- LETTERS[1:20] M <- 1:4 g1 <- randomGraph(V, M, .2) ################################################### ### code chunk number 10: randomNodeGraph ################################################### set.seed(123) c1 <- c(1,1,2,4) names(c1) <- letters[1:4] g1 <- randomNodeGraph(c1) ################################################### ### code chunk number 11: rGraph ################################################### g1 g1cc <- connComp(g1) g1cc g1.sub <- subGraph(g1cc[[2]], g1) g1.sub ################################################### ### code chunk number 12: dfs ################################################### DFS(gX2, "E") ################################################### ### code chunk number 13: clusterGraph ################################################### cG1 <- new("clusterGraph", clusters=list(a=c(1,2,3), b=c(4,5,6))) cG1 acc(cG1, c("1", "2")) ################################################### ### code chunk number 14: distanceGraph ################################################### set.seed(123) x <- rnorm(26) names(x) <- letters library(stats) d1 <- dist(x) g1 <- new("distGraph", Dist=d1) g1 graph/inst/doc/graph.Rnw0000644000175100017510000003444612607321273016224 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT graph.Rnw!!! % graph.tex file will get overwritten. % %\VignetteIndexEntry{Graph} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \begin{document} \title{How To use the graph package} \maketitle \section{Introduction} The \Rpackage{graph} package provides an implementation of graphs (the kind with nodes and edges) in R. Software infrastructure is provided by three different, but related packages, \begin{description} \item[graph] Provides the basic class definitions and functionality. \item[RBGL] Provides an interface to graph algorithms (such as shortest path, connectivity etc). \item[Rgraphviz] Provides rendering functionality. Different layout algorithms are provided and node plotting, line type, color etc parameters can be controlled by the user. \end{description} A short description of the R classes and methods is given at the end of this document. But here, we begin by creating some graphs and performing different operations on those graphs. The reader will benefit greatly from also have the \Rpackage{Rgraphviz} package available and from using it to render the different graphs as they proceed through these notes. \section{Getting Started} We will first create a graph and then spend some time examining some of the different functions that can be applied to the graph. We will create a random graph as the basis for our explorations (but will delay explaining the creation of this graph until Section~\ref{sec:rg}). First we attach the \Rpackage{graph} package and create a random graph (this is based on the Erdos-Renyi model for random graphs). <>= library(graph) set.seed(123) g1 = randomEGraph(LETTERS[1:15], edges=100) g1 @ We can next list the nodes in our graph, or ask for the degree (since this is an undirected graph we do not distinguish between in-degree and out-degree). For any node in \Robject{g1} we can find out which nodes are adjacent to it using the \Rfunction{adj} function. Or we can find out which nodes are accessible from it using the \Rfunction{acc} function. Both functions are \textit{vectorized}, that is, the user can supply a vector of node names, and each returns a named list. The names of the list elements correspond to the names of the nodes that were supplied. For \Rfunction{acc} the elements of the list are named vectors, the names correspond to the nodes that can be reached and the values correspond to their distance from the starting node. <>= nodes(g1) degree(g1) adj(g1, "A") acc(g1, c("E", "G")) @ One can obtain subgraphs of a given graph by specifying the set of nodes that they are interested in. A subgraph is actually a copy of the relevant part of the original graph. A subgraph is the set of specified nodes plus any edges between them. We can also compute the boundary of a subgraph. The boundary is the set of all nodes in the original graph that have an edge to the specified subgraph. The \Rfunction{boundary} returns a named list with one component for each node in the subgraph. The elements of this list are vectors which contain all nodes in the original graph that have an edge to that element of the subgraph. We also demonstrate two edge related functions in the code chunk below. One retrieves all edges from a graph and is called \Rfunction{edges} while the other retrieves the edge weights and is called \Rfunction{edgeWeights}. <>= sg1 = subGraph(c("A", "E", "F","L"), g1) boundary(sg1, g1) edges(sg1) edgeWeights(sg1) @ \subsection{Some Algebraic Manipulations} The examples here originally came from Chris Volinsky at AT\&T, but have been modified in places as the \Rpackage{graph} package has evolved. In the code chunk below we demonstrate how to create a graph \textit{from scratch}. In this code chunk two graphs are created, \Robject{gR} and \Robject{gR2}, the first is undirected while the second is a directed graph. <>= V <- LETTERS[1:4] edL1 <- vector("list", length=4) names(edL1) <- V for(i in 1:4) edL1[[i]] <- list(edges=c(2,1,4,3)[i], weights=sqrt(i)) gR <- graphNEL(nodes=V, edgeL=edL1) edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") @ New graphs can be constructed from these graphs in many different ways but in all cases the existing graph itself is not altered, but rather a copy is made and the changes are carried out on that copy. Nodes and or edges can be added to the graphs using the functions \Rfunction{addNode}, \Rfunction{addEdge}, \Rfunction{removeNode} and \Rfunction{removeEdge}. All functions will take a vector of nodes or edges and add or remove all of them at one time. One other function in this family is \Rfunction{combineNodes}, this function takes a vector of nodes and a graph and combines those nodes into a single new node (the name of which must be supplied). The function \Rfunction{clearNode} removes all edges to the specified nodes. <>= gX = addNode(c("E", "F"), gR) gX gX2 = addEdge(c("E", "F", "F"), c("A", "D", "E"), gX, c(1,2,3)) gX2 gR3 = combineNodes(c("A","B"), gR, "W") gR3 clearNode("A", gX) @ When working with directed graphs it is sometimes of interest to find the \textit{underlying} graph. This is the graph with all edge orientation removed. The function \Rfunction{ugraph} provides this functionality. <>= ##find the underlying graph ugraph(gR2) @ Other operations that can be carried out on graphs, that are of some interest, are unions, intersections and complements. We have take a rather specialized definition of these operations and it is not one that is widely used, but it is very useful for the bioinformatics and computational biology projects that we are working on. For two or more graphs all with \textbf{the same nodes} we define: \begin{description} \item[union] to be the graph with the same set of nodes as the inputs and edges between any two nodes that were connected in any one graph. \item[intersection] to be the graph with the same set of nodes as the inputs and with edges between two nodes if there was an edge in all graphs. \item[complement] to be the graph with the same set of nodes as its input and edges in the complement if there were none in the original graph. \end{description} In the code chunk below we generate a random graph and then demonstrate the concepts of union, intersection and complement. <>= set.seed(123) gR3 <- randomGraph(LETTERS[1:4], M<-1:2, p=.5) x1 <- intersection(gR,gR3) x1 x2 <- union(gR,gR3) x2 x3 <- complement(gR) x3 @ Notice that while the graphs \Robject{gR} and \Robject{gR2} have different sets of edge weights these are lost when the \Rmethod{union}, \Rmethod{intersection} and \Rmethod{complement} are taken. It is not clear how they should be treated and in the current implementation they are ignored and replaced by weight 1 in the output. \section{Random Graphs} \label{sec:rg} Three basic strategies for finding random graphs have been implemented: \begin{description} \item[randomEGraph] A random edge graph. In this graph edges are randomly generated according to a specified probability, or the number of edges can be specified and they are randomly assigned. \item[randomGraph] For this graph the number of nodes is specified as well as some latent factor. The user provides both the node labels and a factor with some fixed number of levels. Each node is randomly assigned levels of the factor and then edges are created between nodes that share the same levels of the factor. \item[randomNodeGraph] A random graph with a pre-specified node distribution is generated. \end{description} The function \Rfunction{randomEGraph} will generate graphs using the random edge model. In the code chunk below we generate a graph, \Robject{g1} on 12 nodes (with labels from the first 12 letters of the alphabet) and specify that the probability of each edge existing is $0.1$. The graph \Robject{g2} is on the same set of nodes but we specify that it will contain 20 edges. <>= set.seed(333) V = letters[1:12] g1 = randomEGraph(V, .1) g1 g2 = randomEGraph(V, edges=20) g2 @ The function \Rfunction{randomGraph} generates graphs according to the latent variable model. In the code chunk bel <>= set.seed(23) V <- LETTERS[1:20] M <- 1:4 g1 <- randomGraph(V, M, .2) @ Our last example involves the generating random graphs with a prespecified node degree distribution. In the example below we require a node degree distribution of 1, 1, 2 and 4. We note that self-loops are allowed (and if someone wants to provide the code to eliminate them, we would be glad to have it). <>= set.seed(123) c1 <- c(1,1,2,4) names(c1) <- letters[1:4] g1 <- randomNodeGraph(c1) @ \section{Some Graph Algorithms} In addition to the simple algebraic operations that we have demonstrated in the preceeding sections of this document we also have available implementations of some more sophisticated graph algorithms. If possible though, one should use the algorithms provided in the \Rpackage{RBGL}. The function \Rfunction{connComp} returns a list of the connected components of the given graph. For a \textit{directed graph} or \textit{digraph} the underlying graph is the graph that results from removing all direction from the edges. This can be achieved using the function \Rfunction{ugraph}. A weakly connected component of a digraph is one that is a connected component of the underlying graph and this is the default behavior of \Rfunction{connComp}. <>= g1 g1cc <- connComp(g1) g1cc g1.sub <- subGraph(g1cc[[2]], g1) g1.sub @ Another useful set of graph algorithms are the so-called searching algorithm. For the \Rpackage{graph} package we have implemented the depth first searching algorithm as described in Algorithm 4.2.1 of \cite{GrossYellen}. More efficient and comprehensive algorithms are available through the \Rpackage{RBGL} package. The returned value is a named vector. The names correspond to the nodes of the graph and the values correspond to the distance (often the number of steps) or sum of the edgeweights along the path to that node. <>= DFS(gX2, "E") @ \section{Special Types of Graphs} We have found it useful to define a few special types or classes of graphs for some bioinformatic problems but they likely have broader applicability. All of the functions described above should have methods for these special types of graphs (although we may not yet have implemented all of them, please let the maintainer know if you detect any omissions). First is the \Robject{clusterGraph}. A cluster graph is a graph where the nodes are separated into groups or clusters. Within a cluster all nodes are connected (a complete graph) but between clusters there are no edges. Such graphs are useful representations of the output of clustering algorithms. <>= cG1 <- new("clusterGraph", clusters=list(a=c(1,2,3), b=c(4,5,6))) cG1 acc(cG1, c("1", "2")) @ The other special type of graph that we have implemented is based on distances. This graph is completely connected but the edge weights come from inter-node distances (perhaps computed from an expression experiment). <>= set.seed(123) x <- rnorm(26) names(x) <- letters library(stats) d1 <- dist(x) g1 <- new("distGraph", Dist=d1) g1 @ \section{Coercion} There are very many different ways to represent graphs. The one chosen for our basic implementation is a node and edge-list representation. However, many others use an adjacency matrix representation. We provide a number of different tools that should help users coerce graphs between the different representations. Coercion from an adjacency matrix to a \Rclass{graphNEL} object requires a numeric matrix with both row and column names. These are taken to define the nodes of the graph and the edge weights in the resultant graph are determined by the values in the array (weights zero are taken to indicate the absence of an edge). The function \Rfunction{ftM2adjM} converts a \textit{from-to} matrix into an adjacency matrix. Conversion to a \Rclass{graphNEL} graph can be carried out using the \Rfunction{as} method for that class. An \texttt{aM} is an affiliation matrix which is frequently used in social networks analysis. The rows of \texttt{aM} represent actors, and the columns represent events. A one, \texttt{1}, in the ith row and jth column represents the affiliation of the ith actor with the jth event. The function \Rfunction{aM2bpG} coerces a \texttt{aM} into an instance of the \Rclass{graphNEL} where the nodes are both the actors and the events (there is currently no bipartite graph representation, although one could be added). The two functions \Rfunction{sparseM2Graph} and \Rfunction{graph2SparseM} provide coercion between \Rclass{graphNEL} instances and sparse matrix representations. Currently we rely on the \Rpackage{SparseM} of Koncker and Ng for the sparse matrix implementation. @ \subsection{Classes} We briefly review some of the class structure here and refer the reader to the technical documentation for this package for more details. The basic class, \Rclass{graph}, is a virtual class and all other classes will extend this class. There are three main implementations available. Which is best will depend on the particular data set and what the user wants to do with it. The only slot defined in the virtual class is \Robject{edgemode} which can be either \textit{directed} or \textit{undirected} indicating whether the edges are directed or not. The class \Rclass{graphNEL} is a node and edge-list representation of a graph. That is the graph is comprised of two components a list of nodes and a list of the out edges for each node. The class \Rclass{graphAM} is an adjacency matrix implementation. It will be developed next and will use the \Rpackage{SparseM} package if it is available. The class \Rclass{clusterGraph} is a special form of graph for clustering. In this graph each cluster is a completely connected component (a clique) and there are no between cluster edges. \end{document} graph/inst/doc/graph.pdf0000644000175100017510000043205112607321273016221 0ustar00biocbuildbiocbuild%PDF-1.5 %ÐÔÅØ 38 0 obj << /Length 2519 /Filter /FlateDecode >> stream xÚYKã6¾Ï¯ðÑÆŠH½dìÌì.ÙEO{HrPÛjÛÛjHrw:¿~ëIR²<éƒaŠ*Y_=XUúpÿî‡OI¶0EdM–.î¦Ê£¼ZäiUi¹¸ß.~Yþ³]Ùbù²Z'q¼¼_å²åñee–}ƒc³`¼ox~×ÁCý„3<Ãzƒ\¾­²dYïà¹Yývÿï>™jaLTe™ÅísÅI²Xg6²yÎÛÿˆ7Ⱦ}X­m¾l:`j³¥©ä=-Œcø™Œ¹¦vaÒ(Isâº6Eeø¦6*ËŠùšÕÚXû/Xw^%,BG¢-·ÚñÐÒ;bY.ª¨ÊmŽ ãÅÚš¨Œ û½—'­:SEyÔD…Bw«Ì2ûk–6J“(í°d- ÷„È’:žñxðÛ6¨~[ŸùçOÈâˆç:5$¬A‘êA¶BÜ>ò 4a÷kœ!¦¤Yf¿áú3îÌÏ/GCÏg:á¶Ûâ"4·¢Á;xcp ãÏ,'º‹ðß.¿Âѵ-Áø€_Ý)Ì Èá†ÎÜ Vdm szVƒ˜’ éÔ Î ÿÈ꣮dlËd͈»XhQðÝX÷ùËŒÀE”ÇÕÛF'ÁÃB…‘ I¢ÝÍWì:ËàE}ܵ“¦O^xñ˜þBøo]#ïQ¹{Z­›öbOµ*BlgCh ~¸Ý³‡®P³l„Ù†\ÉÜ“ñƒéMˆv^ÄÿÏkx³<²Å[àM ¶ó³N*Pç¿Eˆ/çP¦À(Ô"Rb–ÙòBCN&Œ!Ks n5#“íE¦‰—¨H1=õò®kxp#Žnù”Άa< g<©±µÖŽ%…‡£ÁÉ.*UË?;CyŸøRSµ#WbݱÉ8ýò#Œ®F›kEX¬ ײu£Wÿ¢u¶ÞéÇq¤s&5 |Ëwj[‹5F2GÒ"Ù7LdbÙõð¤¡@î\ƒ÷’†»ÂôϺð#SõyËÂÞ+Hhò¿c·œ›³¬f·£ð-|G':x¦[Þ¥¹œkD`ÖYa—.^ò½*§yϨA>R¥éØDèZkTkzã=œ§×ëØÕCèSTÚS£±*¼Å)öœÝ]#Ù“Y>’ŽNaC^{óB£åm°>H"d—ö<¾NÚ^ÄrÁ`dû™âÞÙ[,RJø€ì®âãxä±lèƒhÒˆ>|ºEžÔˆèèʳÛOΡötnÝÕÍåú'%Ö&+IþgƒspÒ¯”£Ô’”ÝÌô¥føÞNx’¬«¤<”uz¥g'È‹8ããE5ÿ9¸ˆ’]4+¼´g&C×~rqA©úöäª'žä ÿ@æìÝ¡Y CÀ„‚œ¬ß{vÛÛWn6}÷ÁÑAR´³xl`º”Äu gÎèOz'’8c%™`LÒÄ+ÞŽ”Ïãpé<Œ {’ºÏ¸ZE²žÿ]I cŸ÷ÞùŽŽÙbeLø»ü «Gyެ•4ñáâc׋A”›Ap늇0óûC¬Uˇ šOl4±‚—ºj=>H³­\ìÃx&'"I×h›¡¥õRµÁÃu÷Àm~í·I\EEfÃKÌ̘[å‰Q"WAÚØ×ÿ6^JeD)#àÅݼ¨þ\{ &Ç–Æ ·É´ÁZk5…Dvû»´Ë‚B -\—V®ÙKf'°<,³F k£ý‘¿éל  xU«#Õë¬ú*:´N®g­£?¦@½UÚB¿%ëwïßýñáhö endstream endobj 52 0 obj << /Length 1468 /Filter /FlateDecode >> stream xÚÍËŽâ8ðÞ_FsÒ’!Æyv¥~@¿»/Hs˜CÂc 0¨ÿ~«\e'ÍìC{HÊe—Ëõ®8Wý‹/½0j¤~‰¨Ñ5âÔ(mûq4úÃÆ7ï·f+oÑ ¼ž!<9<+x~o‡mcxBƒæ÷þ°Œk,C_ˆ Ñ/â„x~ã߉÷'^Âó©B¯lôÚFol´k£=½µÑ;½·Ñ}´Ñ'}¶Ñ}U(Ù£nâ–à ldm\´hÉãü§ ßËf+hËÌIðšá Ã.ÃÃ[†w ï>0|døÄð™á ÃWËh~†$ Ê-IË¡¨†笛ÀÍì$Á!Ú}?µ.Ê8þØwË/»Ñ|ÐS;¬?«h9‡á¹rw4îéµ+HåÊË9yvt ˆü(ºnä\hÆæÿÂ^¡©/"³a;áþ8CѨ²)œ]˜/iÑ”%é¹ùòbYëõÐ*€Ùjó©R?©'þ!å£SÊ ÙöErPù¯ §<7a—:Œƾ¡fä»®TRvüHî_ªÔ}e®Qê{øW+ä7¾3•ÜtGá[ÖÎ…ërÿÂ布õÌTP» š;SîþëØmRZþãÍʈ·Ú¿-žø›ò¡;ztðŽ~Ö¬ðÕÿIUmû¾×uÙúïªw\ŸŸT`ÿ®ÚsµÓ²ÿg¾8&ûÓ¿þç¡õ±?:*y÷‹¾3aÏÍÐÓá{üOVíç”ÕD>î ž~RñHvÑí_ü¢ë © endstream endobj 56 0 obj << /Length 1379 /Filter /FlateDecode >> stream xÚÕWKoã6¾ï¯0‚E!£±*ReM·p€n]#=d÷ µåb[®%¯›ßyQ/ËI€Ûö@‹&‡óø8ä|üiúî»Û0êÅnl´éM½(vuÏÄžŪ7÷œ÷}åŒûŸ¦¿ö¼Þ@)7Cžx€ íSjß¹‚îÚUõ÷¶ùwBE“öÝXÕLܾÒĸ©sô’‰ÊÂä bl-p¦Ú½jÈzì”DN âshKhØÿC¾k[A+ åÐ>z¡'Ý¥¸CJŒE—½'¯;¢³ß·üé@ñ\ù¹°=0z›úK›oÎÞ¬}ò²ïãWjiÓI$Ð=V£­Lä#Ñ.í,ØÑ¡ó!ƒ?[ʈ…Îhƒ[éñùH’Ìxê7ü¿[ï(‚ý'³]Î&‡M§ÔÐõ‡‚Àt%ôÐIÿÂÕhqzÒ‡#g…&"“lzâÏ.AAlO,;K¶)÷(˜myÕÏh…VŠÎûþÐw² éÀ¤~¬T$¯¡ÈÆ¿ÁŸkü Ýc!~Q¬ÐùÒGç­àIg(ݱØ6£!Daf‰.RÏxÎ/ˆrgˆ G¢§Ì4÷GEÐŒ“nHN¼üÔ'(IdŽ·mV!›™•©UkmÁ¦­‡´%ŸðgIz,F @ý¡GgGPZ0¢”S¸/ƒ@7ðÃæ¡ÌéLXì‹áq†¿ïÁ0V3Àø¦„Qy%ŒkºoihVeQ*#ˆâ C>J?ÚÕ0q¢Íâå!Ù‹FÑ–êzðÌ)ÙÏ/u®šz‚ý~™ò! KÌ’Õ—.e®ªÄX—rt‡¾Ð5FYA<„*hd ‡êS±ø^\ŽÀ™ ˜ç¬*7g‰“…zSél™Èi]V†ƒ—¦ïzaÜÜ}kÖ÷)¿àÓa­úµÌS¯)ØxËßóçX4°…‡‹þTÚX°üͲ‡ï¡Ä":ʈh¶L` eå‹ 6>É Np%à­…2vÍ«7²z'ÔÁ‚{#~YqÁµÔ”­¨©‘‘¦×¢©íüý3ºçÁ¬yFîf®­†—|ýŠf{ô mMø—L®æ^¸VhËZÔ7²"¢ b¶s-þá×·~6MËnœžáx7òýS )ê°”JÏ00 Lù8·Ã\ÚKË»˜½“„Tfv²!óVØ÷Umd&"Ò™ ¯Ëxý¿ÌxýŸËxý•3¾þÿ_Ïø®4úºY¯/‹o[n$aËÕÊw»þêÙl=¯×A³vÝ¥'äw¦ÅC´‰Èê ¬&ðùÀÎŽ­²ÚJ‚òe½Î¹hãX­Âæ¼d½ãïl=z▙㵙˜¹ÃlÁ³DB‰æ?U~Ûg€6a©Tž"ÔŸ%¹0yüW¬¬S†ß8kËbéÈ-™QXèê—! eHšòQØ,ªÁ»gQÁÃäMQFĬx&ø~dž„R%‹æ7«Ixn–í$,Í zÂBI˜9MØ8iuß¾vË´rÑOìÓæì{.%YÍ= \$iw7)Z® &Oí̼«±e²¬kŽj|DÒ—²©rž ÉŽ;e2ÒRÔ3O«õò¸ n³n%Ž`,ùº,0æ×©%Š,,{ŸÙ„(ŸÍ Êì{Æ+f-Çs.÷Iu´ÏÆ ¿¢Ðçª#×3a—æqãy«æCë*²%öÿ ¨vÏ% Ín'„”ù(øn<}÷7Ä(€Ó endstream endobj 60 0 obj << /Length 1702 /Filter /FlateDecode >> stream xÚíYKoÛF¾çWÍ…"†Üå³@ $¨}(Š$@Û#R²‰4D;†ûë3OrùcÍÍ›»³³³³3ßÎÎŽÞ®_¼¾Ì¹Ÿ'&Y¬·‹4÷Í"É?ÍÃź\üéõ2ôÊåßëß__Æ©Ãæ~.æ:SGøkàï«ô/hrèí¨OBÜåbã› R!þrG¹÷æpX®l’z[˜t‹ËonàßE×-eÞ”Š/K“Â*ÄPðçëÒd^µQähNLm¶ü­IÛÌ*QY‘­\H*wÎ@Q—Ò(i[wêhû ªÀ‹ ëµ.‹ª\¡AŽÂsƒ–Y¬ÒÐÏÃh± áÇl“¦&Ë­¬á-à¦X*²¹÷:5 ^CRQ‰s“õvÏÖcVl×½HTeßòж@îQéûž¹q¿ Bð]€8§=kÁ;+¥ßN?‰bö —¶½râÝÔýN™WõìÐ\[r €Úé¼ô‹•I¬ŸE‰¸%‘S|Õ⾸&=‰ ¡y›æˆë~îLÑ2¶Õ´âW˜4£°ñ4ÃØnD<µ*rw¨˜Bòï¤íÈâiq°ì­sÈ×ÂBöâ|ƒK_1ñˆmÄR{ƒ„<¼’£†ÚàÚàú s+\ áƒPÍCoÍèD‹C„ϺtŠ7›ùy¹p;œ ÂüfÓXø6¬ÁqeÐXÛYkx'»JFÔÖl Ý–LÀFìiÿaĶ IõÀÃhÞcâ¨¸Ê ü¦1`#AÆšþ QFÐOÜü…?…최9bâñMßüI¢1~_±l^ I¼õª_ìƒRg|6Ðiê«`¸ƒ7=÷Iüu-æ{'ZýqŽ…ÈíozÒ­œ€R†ôÒP_ñ9DÖjpIøïèDK_Hq>ÚuËÍi$s’üwÁ]Áf+Á( aÆ9¤ŒWz2R¾ ž‘¨7Óy¿MIgqøiV23áFùkû¹mØõ¸?¸ñ“€ûüèÎZVqÌ=ùûöÁ˜ç€ò£Ëø0¢X÷gD‰ãìBTøhD}?Ex(Li”P×?»õ‡ŠG¹u’Ò…‘ŸGÑí£>ƒð]àK²®÷ IY3Žäls18r ½qLŒƒ»S¡m™²Ç\8Hùé}Œ?ͱêi=+%×Á(¥'3UšTY—]BsǺ_¼O6ÉQîæÅ&ðsk5¯%Ô”•lãp¯As7µ^”û¶K¨å%s%»½µûôsuÁÅÊf±oÂtyR²ÛI£Þƒì3 6›èQcNNOºÁ;x8q'SqîÎ)w‰ZG–µq³/à™—lœùÉ] NOéÄz6‚«ÎAž“(Äê–΃büŽUÕÆXïÀ¦‚Íß/³hþ‘`rx,'9Xˆfx½„é/—üNÞw„†œË8¼tp¡g?sw.f¿ ç­×EZ½*ÍshEÀh 8ùÿB«} ´¦O ­ïÕŠ¢†1‘×à«7ñªÓð¬¶8*˜2uкEÍÓ>ó,îÐ 8Iñ€Ø›[ZŽÛ2Í©·´|W›(®R°3Y¹-ÓÚæØÏáNž+B¡²§óÙ ‡ÈàE{o«q’"¥šÑE‹Öˆ¢ Âѵæ)ÇÊÕŒk«$ÎàJƒPPñ„«Â­0"Å-|!Æ"ÒÙ#W¬ PÀ â+*OZ¬ù·êÕ)+)\ÔΡÁ­Ó|4§®HhE…¦/}ðª]@k™*§Ø`™$m/cTýºAµÞrã“ÐùXïQ¹Zïº`{¸gÊ­z£Ä2bhéàÜ:3ÇBr1çIŠž ½?̵Õò¡ÞÈ·©À×$„lw6¢(ƒL]~+ÖuŒU\èŸf' ]Ÿ89ˆcïŸ.=i]¤†< LwZ‡›¶8IÃɈœ@O÷oMÎbµ—BÚ>Ýh†2«LËa:@ó©Ë9Óèæw²Pá ü’½_oôVϸÔV¥SkΤ…µI Ëßf© r 2{õóŒ+cS?M’áUÛ‡jL3ÖK:ÕUÃØ©šñ €Ýa%ƒ¤iÊßvÅ[ìT ëXrÍhTo$RÑ:¢*¦QB|Í'D÷Ulhqvv(€^—pÓdJ_d)eÌüäâlN „Ìæ³P¦pMîÛЙ©»¸«…VýuáÖ©ô¦'§R„]„yìg…¼Öøa*ëÑ}üâbýâtG7† endstream endobj 64 0 obj << /Length 2234 /Filter /FlateDecode >> stream xÚíËn#7ò>_¡£ X’ý6 dÏ`Ù9ìú–äЖZŒÜ2ÔRÿýÖ‹dõÃŽ“,ö”CKd±ºX¬«ªÿqÿ᛹]ÔI]¸bq¿]”uâEm’²¶‹ûÍâÇå¡»IÝòÒÞØå¹‡Ÿv}9Àß žîæçû~ó±Rïib«taøÝ !®Ò:]>ܬ\¹lqâ¾—ñîÜ<á”Ñžax¸øù³oý¨½ðà´åÿîDä7È_Ï ¦gŠš2ÞánW„zÄnÃg\¾D^Z$·óôüÅUÀ(ÎZ’‚ìã¡'Ëb•V‰+‹ÅÊÚ¤ÎsHÇAV[á M‰­-y{8ÅöŒ”Ámp;Pˆ0 ¼9y°C ÍëVÔ@Ó+—%µ)¿:±yÍü­Q­(¡#îÿزògôœ'™ÍÆzΜÒsf£ìa¬ô 3–õ^¡Éy3Ò³š°Ä ´ °)f¢ðŒ•ìÕ /[tN€ÆÅ×7;EÄK2sc®Ö¸)‹ñQ4 ¡É$µg&ÉI¬Jí¯h•ÍéܲºSW•Fƒa|:ãÂŽWá(GÆ]#bÂ\ ¦R`¢JÀv™‰ÏHöÔç‚éZ S p°=²wÅ}¾"´ ÅËöHè°öÌÈr “ ;:Ss‰;4üGy‹ãìã¾?ÀsϽ‘†+k‚4ngHçIUÕá÷e sEP £wèÒ:ëÑÞ&{åy⪸——¯a)6_Q#mGIÔ*K‹åg¸©ˆýž»“ÀÖ~O C+{Ô#IJ§_»§UþqÃXãÉöÄM£‚.„Ôƾœ1µÊÖ9ù.H'jz}¢CSM¹>Sõ)þp–Ý] Ë&»|‘LÝ×Y‡ÕÄóÆgñ2 ‘oÖjý·xQÕxpƒÀ˜}»n£†Cè§ñ5)Y N<ÞÌï…U½#—ncÅ»‘W×FÎ>´{'6ìb9ÜK¹zXÿÄ*XÇ»!kc)û$Vqzhü¥xð­¯—›*ÃÒ£¾OIw|÷ƒêcëL¬é$Ý®aûKhßÞ aèo0kp§"¹|ähNÀ)5`sòfj\lÞÝ*›ZÛ'ŸL,­„à–ÞÒ>¢üPp™KÇ6ƒ ØÉ\ #¸ò†XqÅŠ¯Œº¡RäÒDQŠ]!Z#8¡9…ÝD½Ð“§ ;Ç`–¾†¨ÛÆ_§3øHiSˆCís“¤éôVï[4Œ¢^>ýMô‹È$tøJ#>ùm¡Ò3Xí†,X=6ªi%4‚±à˜ÿ0Î5ë‹vt‚aNÙ¯ÁÍ›æËdîÈÂ8¹-»Êóœ2`¼³ŸœÄG³<Ì&ï:þå²+ÓY>Ya­b€¡Ä^9ôa˜j= Õn3Âìx>ôcÄ< ‘µ¿€Tø ñ_5Ò±™î®ß’2uˆ¹”’„=†ÅH@±™œζÝ£Ñ(† Ì"öðþ@`ø"!Ù°>_ÖÀåíJ}%ýÖ+I‰6X kÆ)b×-8½Ÿ*»9@6ÝkÅÉÃU§ÃêÒÎ\T"²Åª* ç5£ïCgüÏ'ökµÁLæ^'yÌ€_k^ÞÍ60§©{‘˜‘Ÿ}ÕwdŽæÙÖ A®Þͺâ3N%S ˜<*?Jâ^!Ÿ[B8bHäé¾úf¶Iòbôýa®w_¨Þ}1ß»/ 2$\•4æv¶î…’¶*u­jgKr‹c²  kÿ"^ÏPéÉ Œxš„u@Ýú„å‘çAt€æ~fƒ¦¹ß”¢ÁE—=#p¼~X€is¤´µª?J³ˆÅÕmD )$]U>lˆó˜-Fë,6"ü¼å1߈”·?x+U™áðw±œKºp‘À‚²7^ÅKëÐ+Wf»Íƒ+ÃK†•gu s©MÊ:8ß·3•wRÁ,ÚrY+/Ï1kjD…M²<Õ6äf{'UYêâ½gÚdNJ²%”¿ˤ½he³s*’®ùˆkꤪG)Kð, t`ÝÆr3ÞW©ÿ$IÃA¨ñ—¦FÕÎH’ì‹P3Iij¸}€·JJ½—>ÜÝø/,¥o endstream endobj 69 0 obj << /Length 1785 /Filter /FlateDecode >> stream xÚíXIÛ6¾çWøh±"’Z‹¶@R$AŠ$#=¤9(’Æ6bK®ä™Iÿ}ßFŠ’='èvè¶D>>¾å{ õdõàѳ8™åAžèd¶ºš¥y gIi®f«jö~þãbk3ïj^Ã8Â`ØwŒßÂ8„?ã ˜R‹«Ÿgál©TÇñˆã;þûÿvÿ£ÖÁ®©gW Ö*ˆ´fêÇõôè×"ÖË»Hhú·b*™ºöôÛÊ.´béY´bRë´µL÷ç4BA®ÅNGh?šïŠ_‹5+ÇÊ·;{ë›™?=‘ÓgžŠ“»íìyEÿÅ€8µ¡æ Îð2 èÿò…]rXˆ$ó(TäQ4&[mèe¤²ù•µeyc¶Í§&*P&ƒóˆÁ]Ø;Å݉<À(Îe´®‘EM{Èq=Kµ¦b!3ú¶l;ëõ†lEKÇVþV¢Ù®°Ph:…U˜Mç7‹8™*Z 7vÆ=ðª–é`±LÃpþ¢áÄ^HKRZ¨ÑçKeÒ Iã±ëKD|Ëÿ‚A QªMBX(ú#¿ Í?(ÅA ƒ³Gpò þ´8}ƒŽ—0Ö&õ¡‰¯{T£°a'€Æå® Û=3_w…ÕRØÝzù) ž>tBh•¥PnIoáRÅä@wˆ)èjÑ¨Ú ÐŽˆÑrí% Ä"CßÚÏó+I!&Ek“æl:´åÞš)>:Qw-Zí–‰oÑ–²‘äú’=-ü×øÑHL)†×]=RÒèÅlÝ9}hc{Åä còÐýk9¡HÏä‡8Só_™±Ê4íq8Ò:\L‹=)y…øÞ9‰ÛÃ]E©°Š†pîγ¦âyA½ ¦¶\SðÕm÷uÛ Œn‘EAh=2žpöÈâà#aˆºÓTõ@´8•#M¸Ô;Ù¼'hÖ*¡EÄžƒÓ(Ã"ùⵘ,w“[xÐËzWÈ´=K…lbX #V8Úˆ¤~±ÑÒ‰Ê/M¶ê²„kTd¨Zœf·rÌì¡÷¯å?º€y#‰pïuq¶ô;þéñ—^W¢{> ðu¹{ÚDÝ“ËË».,‰×íœJu×ä£g‘Æ\o¢D‹ÿ²Hn‰Ñ¶èxþ¶uÆ„¨çÏtžxŒ–[·67{Áã²ÂøÊÂÌˈP÷‹Ê¶0£Ü'[LëQ½À=ýVdr‰‘õGkÀ-™Œ–Ú!ÿ†Ò@ÏÄŸòœëž7ãHÒʆkÛ¸rÀñ\ñ.^ÛAƒëËkŠ¯Ì‘Vµí׷ž…¿:çBb½µXL¡–%5×~Ÿgtè)¥ØR}Ë/~ºŠÐNÄ1›qçºCá0¶?¡ÃåP6ð`]ÅED+›ùeßÚ|nWQ½·6(=ÆCÝ”X·"äAŠL>qÖlê5Û¾·ÏÈç­öz½‘t ÝiÛÔüÐóÚNJ Ì\÷§›åÕJ74& qÏkAèPU*«%0µðñäpͽhÒi„Qj/ožHîxyx: ´Š,¥4):£Òq±!éK/Bq%ÉQJ6kdüäeºÃ©dQÄiâߢê£Ü;ÁŠRðßnhYèa¥3å."8G4TàÝå·ò–ö€Æ‹wŽcè™a½åö5C„óÌpC¨·g‹,š·öŒ³òZig¥ŠÛ¶XÃ!1 v¤§Š})D餃\Û=ÅasÖÇJYþ Ê© JIžD–.Ÿp5I c»ÅG8èë¾9PVEßüa;wÌgЊ¡6üfsUfœÃ¦Dš-Oy83î+FOýÏqØ-c‡·GµwáäçT’E¦t_Gê ªO™Ž"o¶ÄX‹³±?jú:A· Ê8 GUSaöj¸#z6x)ä ¤µƒVÅk”PìUY8KÁ"ä¸Dœ HÆAb®Ÿïý aT`´r)ô˜…¸µ—·â»™Ä)[äué}c"ÅïŠ4ÚHÕ@)º¬¨á›•—ÝhÛKšæñ$l¯3ºTèDãFú/xyšDJ¤(Ï‹M/'‚d”Ôñõ~È#…—xÂÞDð@¿dû¢ºü•hî.ŠQJ¾ ¥š¼ßñ"÷D!´Zé7çe¤É¸bL. Ë(2A½âôΠ (ý›ßÌÿKŸ@£¿ëógt¦è0HµðÒÀ'HôàéêÁŸþq endstream endobj 73 0 obj << /Length 1894 /Filter /FlateDecode >> stream xÚ½XYÛ6~ϯ0}µ*Š:¦E’î(Ò}h ´À&@i[>[ZHrûï;uïÆ Š<¢†Ãápf8ó‘o—¯~¼ £YꦑÍ–ÛYœºþ,J=7NÕl¹™Ý;?ÏÊ bg7WŽ‚¶¦¶}íüÝw‘Z@Ë¥½“ÿ´hŸ¼Ðƒ¿jþyùÛÌ›-”rÓ0|i1`5㎚8-ucó´{`»—)Ÿ©ueG-3ÆWÐ5ЮÚßUÿwC¿"É×®µˆ]ÍŸ\-|vµµ•7°ù`3C¸Ð*hgÒphøvD9ï¡•²-4ú~løµ´ñ”sÍÿ«úú}ÕWoÚU†ºÞA»öá9"?B÷­nI!!w&;¬¥¿a–Lºr5µµ;ÙÆI š‘LšÁ¼åîÄö¦Eä×üQS±w™à›‘Ž#Á_ bI:*pÓ ¸OhQ£É3ÐB{)Wáš[ì™H„šûÅ¿¡³#ˆ;pÀwEÙuɉ5Gfá~-NÎDv±@/™ã±õ²a$e4o=÷cš’óHDö‰Ýù"Ðs;O@Õr¸"Y%H;fѱçê8’E8ÔBv¶ÛÐ] =áŽRîË<Œ³#ù³E |7 â~D="n9 IƒÿÿÌýÄ”!­NYŽc»fèÚ ~)èÚðGÚ'O¥œÂšISfÌ)´hxä4ŠM‚ý ïÂÀÙP®-dÚ ; §LOÝ7§4ÒB'Àìà»”*H<ň¿—hV;^ – ¬¡{"te‡?³ÛCå9¿¥õ3úA»: ú~ÈÀFZ´F^è8uL.{‚þº o°=3‚ pJã2œ!Ûí¯’±Ò2±£Ñ :QàûÕQüã4*ðÀíöêT¼úIì&‰¶{ÿã­¤ûciØv>­h³D;K^Š–¥ ×’£ÊÜFŒðŽ2$ÖL’8é[ø ÇrsjâØ·àBä0ÔÄSÎ’Ô• RR,8«—<€…ã°°N¾šùl·Vç¦#‘cOuØüA>C墛³ç[cœ‘°ÚHIgUƒÏ7í*¤—îg¢aÑ¡âUI,™|-ëimk7¨-å Ï›öù€ …2—ØíŠT ¤®e¿Z;V8åŠê: _u– ¼<§cJègT”2Ée -„«d©ŠgQ„6ÁhÝ›þ`l®Ò­·,©™ž3=–Qh\‚“°,þ Ü·Ð>öÁÎ_n®[üuCø«6á”·üyg“BMŸÛ)w*óùò'àÇ}q%|,à:ˆ|áѾ†‚CA¶R~è|„ÀÓ|FÊwÀ êŸ-!K%‡ïû[í«qAÈ«ÜÄKy­?±°‚?ý©:†Ä-¥29;>$øCÍß²@¢DN$wcË9¨‘f˜k‹CL’Ó•áñ8˜F ( ;ÄÁŠÉ×8gmoU œB*î¹ääïÛ‘-'&­ŠSƽf¶â ›-ø…ô¯B8õArT±jJù$ÂDðwÆOâ6+<ñÿQD~±ç 4–L` ®ì¢f#€©”̰…ÍÊ– .Yd4(#/áò}d(8¬n÷Éq¹ÍÜd¼â! ¸¸ g|4ŒŠ¾Ú±Sí)VŽ’g²7CžSf­#IaÒšÖa(kV„0õ8bØ‹˜Ø¢ìà­£4ö>"#’U(ÇÕû^ɆÑáÁÜíã‰ò¢æÎíK~ºŽlæ½ =M0™:VKñ0_#!mg›J¶%ÔûLòd8¾eYCXÑ–‘/â~rä#çîßZ°KÛ“/D-ež(&g“sÅ9LÀ‚t rÁÕHò}{Yé¨vkïvÝÆIƒ5âdò{=ôÝ8lð¢Íç)Û{ØÔÍy”#D÷ ¬Bèðè +±&¹Ð’©}hÑWÛX–îø£ÜÈ$&=ü¿CHƒr:Ü•-ñ¦4Û¯]9G÷ÙòkÕ+ÎÍex¡4\Šæ§ã¥Ù"òÖVÉÊÞ»(ý»Ä!çY¦;¹g´yúƒò»Sû#Ê xÉIGCµ§“gh> stream xÚZKs㸾ϯpå$U¹$@dU²U“Éîd“ì^ÖU9ds )ZöŒ$zEjlç×§ŸHQ±'[$Ð~|ÝàŸoÞ}÷cQ^ÕI]šòêæîÊÕ‰¹*ë4quvu³¹ú×êûõ¿oþöÝUD”åIçW×™KrËT7÷ëlÕ­¯sãVýÏô~Ćr5<®¯á§k¡íþš·kS­^¤SÆÞq×öˆt÷JÈ6#¿?­TFP;¾ÅÙ¤WÙ?¿²±ÇìÆ‰º Oò0ðï-N0hkàß N1ÀiÈz7$ëkgrØ,w §Í#±Ç“RH ¤£RÊ’º(XLm¼<WÄ‹°ø²¾¶©Yá*ýိ,|Ù4[Ýž¨žI?C¶Úv<^äÂRÞÞãÛÈœ"),.ƒîPºÀ BÚ ì¹Fz8·ÚÈËþµNkV¿¥EŠ›âcÄñ÷$‘!ÚÅIw¼áž;xŒ™QpéTdÝ3M¤´æ »Ãs²ÖÒ|ÏÑÚtòo‰wüeð“°O´=èð÷ëëÂX:ôN¤ŸˆtžóL÷‹sø³ºÄï2ã3ÿüEËGb…Ì"؇yqÎòõ9¤ö<².e†g=_uíLÏâèV×)'ëìD¦·BÛÈïKXÏ[‰ü¯s¿!ÎùÛÈZ:á|?—çÛ.Îw=>…¹þ ‡/ó)ÚÚ£x¤{ϳüeFþ'™"{+[¬wî¢Þ½ÎMö$dchb]ñ{í…³NÏôu'ŠÜ ?·yi„Äš$+r¦É³Ì«ìl FÖŠù…k²¤J«8$9.Ø<]5þ9Sg E×gëÕ¾!ô¤$’ßÒÌú)ÄCQ/¹9òù/âg qá‘<Å# æc%°  2ðë¼,}øBŠþ -»ïe jB—Õ…îDçDÏCP0-7pRƒÛ‡èÓŒÁ-(Ž[àñÃOº:ˆ#¡¥9lø<Òÿ_«™#wÑæE‘ºaâcXµ[ýµÇî':>œ#›€-r>LJSC|÷';ðj§!æNØGŽ?ãrmG!CÂì‰òÖÏ»‹‡¦ì ¯ "ûçºÊ)î;Ëã{F0H„†= þäèNä7è–DËn¨~8û?ô{Gûi½o„·pO²ã€‡$¶ÇJ|g±Ã-ÏJM­òžOu–o9à€òA•Ô3F«{ÁítGEÄ4‡ÜÈ%ÍüqLpŽ}lE켨&aßjwç ó‚í¥jËE¢ùÓ qbu O«2)Àƒ¥ÌË–Ö+ ÂÉ_~€—œ»®¼JòÚêˆÄ ZÿÙoG^ˆÄò;¢ÙÎQ sA;!9€Å A¤ñaO‘7ÇwÖFAÏ!M,?; 1ÖëÜ–ìr[€ö nötbÔE a߉£s…G7t<¢9ÊÃØ|Q‡,CUÆð¸éX{òƒ(•-':† ENjà)É””R–‰°21.¦q>ŸGµøP-BÚJ!-v1v]Ðb‘Êà´óx^#t‡Tß|r²Š÷Ú’;°XLöÇ/º êz³“ÜqÐŒ´¹ÈŠà$Ör„“qàsÎejë4ÉKûŠPÑTàpê·‚H€Ïvd }óÁÊŠõ*»(Ž»"²Wã^[¢û<µwðlÛ¹Y}à9ôvï6oÀ7ºÌërv¾ñ"1Þd‚LÉV Vã=?ÇÈ‚÷¼áŽÏ‚Rðy²[v ¹K!Ì” Ø¶º Í¢^÷27E›s‘Gȉ¥8B†‹ÕÁYïlìçi/2ÿU†? :‡,h¥ak9Æ)ÜüdH>7Sµäˆu+ ý§…à‘'EeB¸Š ½ƒja½Ü$¦Ì_w-.Íb×2 CF| êÃa^èÓs ³´e‘¸ª^<Ë$^&ÎßÄ!ðžÑ§¸„`jãÁ>Ï0'65žTS$AÓ4‘rв_¨2± ÃÌjßûýÛP÷hp–Ýð&×ní¼ nê8gz¿`[.‹Í$vK ùež˜ªŠ­Mý.a©†[¾>ÈÙÒ9“t‘ñ È ‘8#wB5¹¸ŽØW_$c _îè¨è†rÔ¼}ÃDgçÆLÌŸ^‘ +Gy áÔÑI®™¥I9ÑûFò±‹ ájy©€Že3*-Sé^š[½¬ÞÊÒ‚’áq#¿´1-Ô¦™¡¤Š$ )IY" ¾#³»~äqqqyTHÌý <‘øj)<Ÿ«2¶’©{ÓÑKXÉè·µ·.½¾ÞêÔäÂð<‚Îwˆ*ܧQQ_ºø–’ã¹ÝCR_'Y9¯›­³uèüø²YH™ (zû¥e2“dµO¨àøk 2i=AAÓ ê¬>õtßM÷>ñÉ]ød¯íÄA73ßë¯Ú1.Œ‰«>ôc(AU€#M½\i…¼{âøÊœ4ä[ó3Ó•) '®7½­¤4Q|¸p[‰]o½­$bŒùÑŠ¾ÒÈI»IyÿL±è³:xõÉQËߪ("Áï‚Øÿ¦6©æW1 ?L\î’Ò&ÎrÍŸM+"|àü3¹´JëÑç7’ÜR¶vEˆG‹ûGÏ´­?©Õ³JgרŸ­Þ½-òçåkz–'颚}X.Üצš—As©”ç*åÐ~Žyóbþ%Ø+á•Yý4òÀ8šá{È}sFk¡0°ë%Êm˜”ÎüYÄŽ +.Àicðïruîu¬6æ­Å—d¶üƼ&v&N;—€!²(šý0†ÔAõPÀCƒM*Ä-Áfå… ¬«ÅAlA] P6¿3U-’Ô¨5±OêÇ› ™}™¶´35µþä›5N›[ÿ]"~åÑó7YôB÷˜@×_¨Aá3µAEt¶xíZºÕO¦T ü]ˆÂ[°C/£“Vãô#…<[EãQ“%¦¶—¿5TÉiîkíÅo ­¹à½¨Kj^â‚Zõ`¿ŸÚàGgì« kÍ·8# ×rí+*+Íà¯]‚Ž3O¦*gLš8Õøù’u5‹ Â®w?ܼû/Ë„.û endstream endobj 81 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 94 0 obj << /Length1 1750 /Length2 12213 /Length3 0 /Length 13317 /Filter /FlateDecode >> stream xÚµTØ-Šw kÜÝÝ]‚Cð§q n‚;'¸»»C.ÁÝ=¸?fîÜ;sïÿk½·z­î³«êT}ªöiJRe5FQS;c”Ø™‘•‰… ®(¦ÍÊ`aagbaaC¤¤T·t¶ýÛŽH© rt²´óý#BÜt~³IßíÀ9+;€•‹•›…ÀÆÂÂûï@;G>€ÐÕҠȳƒœ)Åíì=-Í-œßêü{  1¡°òòr3ü¹ j r´4‚Š@g í[E  @ÍÎÄäìñ_)h,œíù˜™ÝÜܘ€¶NLvŽæB´ 7Kg €*È äè 2üA ´ýE ‘ naéô/‡š™³Ðx3ØXš€ÀNo[\À¦ GÀ[u€š¬à£=ü¯`…0þº+ëÒýµûD–à?7MLìlí`K°9ÀÌÒø(¥ÀäìîÌ‚MÿÚ8Ù½íº-m€ÆoUßþÅÏÉÄÑÒÞÙ‰ÉÉÒæŽÌ¤y»fI°©¸­-ìì„øÇù$,A&o÷îÁüWs­Ávn`Ï#3K°©Ù4L]ì™5À–. Y‰¿bÞLˆÛÌAÎNn.Èr7±`þ£€º‡=èO'ëæ7Þžövö³7 oK3ÐÛ¢§Ðpvty{þÓñß‘•`jiâ 0™[‚ÿÎþf™ý ¿õßÑÒ Ëò6~¬–?>ÿYé¿M˜©ØÆãïð?[̬*¦­¬,Kÿåÿ8ÅÄìÜžŒœ\F6N++€ûmáýßyþsÿfÿ§Uhù×éþ‘Qlfàý‰·Ûû7׿&ƒæ/ÙÐþ»‚’ÝÛ<ƒ4¿ '‹ÉÛëÿ³þÜòÿ7ûdù¿ŽÿÿžHÊÅÆæO?Í¿þ?~ ­¥Ç_oóìâü¦ E»7…€ÿ7T ô/A‹ÙÙ˜þ¯OÖø¦Q°¹Í®ÑÒIÊÒdªlélbñ¯!úwÞ’ÛX‚AÊvN–<8FV–ÿñ½iÎÄúíQqzëÕŸ.Л¤þ»¤$ØÄÎôí±½õèèô@|kýâx²¾‰Ôäþçl˜™ÀvÎo[oä¼fvŽˆt”‹ À,ö‡é_ˆÀ,ùÄÍ `–þ½E*üxÌJÿA£ ;ÈqaÎ΄?Ȫ&¨í®J”ÀqgLpšrG+…–ÑsÁ±Ýå.‘¶2=`ÍñF4q¸}yK’æZd‘äÙó¨¹.¤%^¥õÑëÉ0Vur§ñ×îÀxÞ‘hm?!£ºÈ®×³ƒ—¦¿5t3d§e¶ƒ ªr.Ö[Ÿ´{mÉÒè—¹•ÝJ.y¤§’)ÆH=ÿÂÊãŒY<2XgF"x:Ìsw´™ë›i̬ñW¹XzDïãHö|Ou¶¨ûÙÏ+eêlN]øø:xDÐט£“TžbûIrïç=‹ "Öç3¹Ã¢‡ƒúâfå5ñÉ|”ñƒŠÓü:±(º²ÜLÒm4MÆ•TÔ$µðžÁ”EÒfñäÃE†„–¾÷ÏäDjqÚ¦ôíÝÄ]ǧt^qÑx|¬‘{c¶Ä7‚X›>\O÷°Ì¥ÀIi˜D3ˆUòE¥¸S?Õr¼%U‡"ëò&%œìF~Îè8)^R9Å<æ8©†ËD"éOeJµ÷5œøI(œî¿ÍsšÉgwÀרñÁ%O"^G×6Õ€yX?½¼ë;Ç‘ _osÅ17‹»ã¬ àCE¢õ-¸ÌMÈkŽ© ßí`±¡â÷m,·Ëʵb’6øLß©ÚA•ìy¢r0˜ü)tÚEÔ˜xÿ £#ï«,së(•&p+)—[óøŸ`}’IÉç¨ØOsºÊ^AŽÞpÞjºnÑùå“«üB.I;HÏ>Uá\Å!J@3NVt.øÃá=/° Îp•šêPJ¢‘Wš\³5ÿ^ÄÕúë°s“$¡×çÒN\Ë4þL¥jäò$Ì<ødçð“èÅ2¢‹ÜsÂBd¥™ß3Þ;' »ñÓMî„Úp"u"II¡ˆim?°«“¾ôCå±ÑÕÀÎü4"ˆàáÓŽiñÿm£Qú®)H6÷JX×­êÃæ¨ •ΞQ!þdqVÇj²“© Hª ™·‰ÎiwejÂ_Ý”wF ¸žŽ¼¨5 Œ¥H2¯am}2CƒÓÛO„c9@à>!ªŽ`Ð|{Rxo…AþƒÔÖm•­•¼üÃqƒÂ+üuRóD.!^³T»Ðèõ£ŸI:Ñ «¡l{ÉKùŽMìÐ|¹ÎíÒØºKª* É_©¬ÐÌŠ?ÊT˜<ƆŒžë¸”¨Çj7Úóþƒî~õô$ ‹AMe•­ 5÷±ŒŠº\ޝgT£¯È·º¹ÒÜÃeƒf1æýb«ßv~ÁpļX”¯÷‰‚ëƒ.½¿†äWò¦ÅœÇ4(ã5LO •›%xz×t"wŸÙ© ¨&¹ ‚ÎÙ’—a¿vRÂÐÓ$^}³ö3ªÁ“X{a®‚J´¦ÁދжNA·¯Du6º18ë}ÁÛœ­Ö“ñ÷9ü„exSü#®îþË„² ͇›tQÎuÞ Í;e×aÎmwbÝs+›ë fŘÓX<†bP*• c¯}ÀuÕ×TEªî:ŒfŒ$gµÇwzŽD¾^œ‰Š…Mœdµt•hDÇ‹‡Uc‰Qµ ­ —fVô ±Ç#í? o޲†3ÈÜYzn-È¡K×\tE½7öÈæ‡Mec%éV»ú»ý®LÝÎîÍð8ÅgqÖ’ÝŸlr+ ¼MC˜ArH{µƒ×â1‰p¾‚$Åò[¸õ(VàJY2líäe‰¯;ª¶œÐÞkk¡}ËŒ¶ž…ctl,÷ªˆ#ãf—a‚‚/“ÕqC†Ô3Íf§ŒÏ]‰O;¢&(¾­(ÒÄÓȹ&6Ågã ÄŸÕÄeM¡«"‹¸Þe$:÷w‘èA-ëOhgÙ˜Ï@´[Çé¢{ç¸p ÃC}Ö"´¶Î-“•ÝjÙ׿KÝ×@‹áˆØ²Ù0U›%=0ç댭A+‹Ékš“©ô+ë>z¼?+^²󎲦>0†Üîd?âë¢ÇAA–ô£ô"ï9[q#Á³÷+®xl~.ÚeØÖ9oÙ}PÅV³ºÜž8Ê?;^r Õ”šÕµ°®¶Ki¨€YGOçyG •úî쌶s€(LIöƒŠk!/ÔçÖ×0Žù[[4˜‡–H"ãpÍXp!îUàì§ùÎõ¯ûUš<£lÉáÍÏyxKŸÙaX¶~\3â©kVy¶U"Üʜń„èv€°lÄ77Q’£ˆž8"”.‚Û]¡¸ÍBB‚ ¬Bv•ø ÆoÔ,“k'ÅxYQä×rðZøµ•Pn½Ç`LçsΊe|öÈA’¨Þ±6ü_-ïÞ¡õÌyéª~Û¨âô—Ä *Épl¼FvG·¨°ð ݲÖü¡6TÁ"‹t§n1T¿Æ^±;ö¿ Š¢©@Ö2uÒ½<Ó˜NEWôš†ùk*w§÷©DµTÚí‘Ô}M)z‹°É“ ׿^ï+@ßz¨‚G1õòì\ôLPpüÎñ ¹mà{C·cë~Mº-#ü-¨70REzÿ’Ý+ÖiÌã7Ñ<©2—ªX\Õ^QŽù«pÓÑ>j=%œvÐñ¬9Ûg{…õòRÏ|ô78~_S†Jƒi®ü³ å.û±"¯ó ë6Užîú+b!K¤PØÐ†jÀ 3¨6=Ci*—P¤µÊs?èRWL*¤c•ArÆVƒ0½m«N ä×FGQE¶sß`— _÷\jRtèæêvG<§˜iðãs¼„GÖdâ«ÀZ5_Æ=ÕÆ~…5o !1O^³[]F!¥$Òø€ÝÕf–_ܺL3“`»ÞožÏªí¬Ì-dlÔ­§¶ÄÓ3ÔŽÒrþ!0ÌÌ߉\O¶«JXn»ÒS‘•F[qSŒ&¥ç8¤ÅŠÜ==g—?á±5¶@+6úõ\¯CdÑÜÿ b\NØ éà°tÅÃa079²‰Ö9)‘Õ@|âåFÞÊkêšð,.LÃ,Õ!­34bt\´Yˆ¦;ku€ HÃËÜ&\hùõ5Çù‚8¤ù"ØX!ôA¡¥Ï!úC ãž§A/t‰’ªf­Ú^97gýw ¸†òxc¼ ëÓ@¢ËóœoñÒ»Ð÷Má[dZÎbzü9¢Ew0úOß¿Ã×\˜á »yxxÉ`çx~ÑðÁ°é¾(^Á¤ Ctøaœ:-Í7ÿZG3œlë{›’ ïKþê§2l…–õ‚ñ*î¡"ƒ ‡2ÓÄš)ùë»0(Ð ¨©°Øjà‚ë·ßã Àn’ Š“%ÞÁa°G[ CB} ‚øy~œÏ¦ê@œQÁ³Y ýÂP™¼u$Š çû°ôÙÀ«O’_.ŒÕiOÑ*ѲÉ"¿Ô Õ»¬¸>ÖnxQ¼gâ8Œ§™v^B´¼ ·‡¨3îßÔsDˆäE-í]׸w¥/­TßnM£/"ZâŠÆN"¼÷grŸZÈ¢ èÔ(Jô^ГÝùêH’1ò0ò^Μ9£kƒowIBïCñ Ž&í÷Œn¦¤c"ÎHmUd#楇ö"O8^£ žu´èð;E)L *…€Q/ÃÙ¦á²ì8WàáºÚN2?·å¨5?ô–²˜˜Ñ©³už7‚dÏZ½Ÿ^¨Œ*ÊÀO2©ÔÃmôª¯eñ3Ÿ ‹RëNWM¸é¼lHœLy­–± ž‹¢ßv¬(ÈGŒÙOO¿bO”h¼Sˆ¼‘fã™.cµ,Kq€ySA‚n…„¥|FÓu 9ʧ§õgJè?…ÜùWQ‡ }BÓM˜³eöÇK鉣F)Ål¹'q3Õ¾±=¡»è—L´s æï mgÞňjá:Ô-BV@Ÿ;E·kê&hTGþ½ _œ#–P#$؆~ñ‹ç¼á+ELf–éN89 ɤÝ]‚³‹nÝ´ÊÏÑGIARB¼þz$«1NXn’¯—we• Ç\-¥Zó‘H_°TxPNj)Ým¨ü ç®ÊÑO}Ä,6×¥êr×ÈØôšõ¶}§«EA4E¨6R{tý_?q?-D.þ2ÊCª¶W¦l²ôú~ïì¡ ‹k,pOÀ­(xŸ>ÅýÞix\ÿ!`½a²Äc}>¸Ë”ÙøTÂG—¶òΜ£0‡}ÿyEš ‚Ù^)°‡-‘h¿¼Í9~2™2Ï~ÿùû¾ÇÛMñ3„'Bþx™ßw&ãâä-+R­(ð¼]”€›—Ïs63´¯Ïd5€¥ókù¬ñ­À® [»©ÔSø¶<¨doZ¿Œ­½Ïñë|øÕ·g×KAR÷$Ùv=çýèÅ™ÛûÒ h#ê‹Ü¿$—Î6_º´|Äërïm?á_ L)wY„^ ø×°:£)¶/ Æ ²…>¥3I=.'äA~Ë¢„Lî}ß‚mÕÁ@qŠ«A5¦VV‚v˜JQš¢VþÓ¼Co«©çñkêÑÊä;z ¦lÒáÂ:áØWoúþÑ᫜”3Sñѹþ›#b龎ªï~yý:ä¢uqx9ŵgSè Éf!4¨NU…„€?ù_"^ Zå©áÓWÌÊJµ°‰ìt,ò×Ûþ}ÏË´ÞÓÐrŠædSœ<†æ¥âNlâõÜ òYh³™Âðc­cã´Ù»‰¡«È¨Ë¬ä=v-¥IÍïqdI´M2”où„5²¾Àlä÷s<ã sM'ÐZ},Xâú€(vϑ٥ST¼XkÉa×ð{ƒ¥”¹n›E‚Ö cÐK/V"eÊ^„Ö7¸¾ߥ^Ž¿8yÓi?÷þ’/°*L½4±×÷õIåèÙŠéNaoønռÖ@™ÉË­4vNñÙ'Æ §û+”­B¯‚Òï­GØQm7þ—cxpžvœDã‰V‚IøçÄo[F¥‡ê [ÉYÔ¤vsó( ¼91š¡êgxQZ‡uOÀÖ ê5<»Å–ÚñZÚž2Î:†ÄHœ;,-üôq|<å\rÏNŒŠ¾ÀŒ]ߨÙD¸ÏœYš Cz{#¶\_i™©ÎRǬ¼Áð”I÷í!ÍŽ@®6Þ` SÆ>É„ÌA3 » nè Dp±\ôu´2÷]\"ùâhUú&R"uõ HšLZ’†'IyÓ%ʺ.²ß/jáLòý%YT^Ü!n³ÒÏø¿Ò2)Ö5Ã&•r:~½ØØNq9°éÉ~ñ]OŽhY†øÙyœG*d§íCÌF‚TâÞ—ã®%y7³ÁÊ]¼3'_÷™N’oí~ä'†‘¥1Ö°ª0%î{î÷¡%ÚZÉŠš UÞâÅ?ïI~þÈ0ïÜ/6£bÒû5wv¹. ÇÜwì·T§‹S.Ìg7~Ú»!mø²ê—ý4g{OtSÝz¬dCJ3½‘t¦ú8#1Û–©Ïy»­|iFK}ìúÄñu¼´[RNÓwL—·Ó6Ÿ*ôØ1ÕŠ4tüó˜¿ÎÝ`ê4pY)0e4õ ,ÖŠ[«à<­v*v.a~¤vx°ELSšÆwÝrû½î¶l¡–¨€HÓþVš`×p%Ö9FŠúˆtñfŽ?‹’“çõÄØA¬É¥ËWÆ(H®9sC×(D…]»|Éʦ\YÚ:yRví‹1·vL$•ÛLÏÛîç1PÁÉ€#|¡h–hJ75»"Ú0–×JÍÖ (¯ØþªÚ Ë€Gž5åуΜ9ᬯh‘»ìP €,`‰­k5”`Ò÷¬å*Ÿ€?´Tî®­=@%kÌŽÕu³Œ1»T$g²É7L¯FÜØ KHÞ·®½#;rÒ§J®\ÚÔO·¾<éQ«S8ó8^5|±ºû‘¢:ß p¶ø=Ú< ïÈÜXÚý>Í®{ÙƒhkUþ;NL6§š ¹|Ú{]*äù2¼Ý+“~äl|˜ßüi¦Í$èïzkÖ6D¨è yD<ÛÈ–Îv‡Óô2¢´ðíÊ&ÿ!èCFDKCÏ ûº}Ò†„Cü@ÕÝ š.»"òÕ†lŸó3ÖxIw“:2ÿÞiÜcš8?N‚¾„Dµ Ë ÜwäÙ<•']ÁÏ~/#ùÊ9tòâqÖÙ [äãØÂ{ÖÍUH(´Š'Ò„ªÄUƒZ²($dªŸ¸Ï µ^Z—§ ¦çªŽÂÎR·XèEÆjgÕW”Ô…¯ÞGä-ú[åJÝ=|šyð‡\ìës½PZ„9Ϫð_)tiž•L2È£*'Ö4Jghx&PˆS%;UŽd0w`Ñ™z̸ö>Ïåôj`®²—à ¿´øú ã‰oé?_nù‘°M½'ÃCŠm†nIÉñL>÷>³y^uèš c°Fà "˜Aj‡5C$bænxv–ïË.cJå!Œ±Hg¤w…nìü^­„Ä×d<ÛX/…ϾœYiHÓÉÇgäî¡©CAûûn嫹ÔLÃÞrZÀ…±ŒŠn9öD1ñißJ ‡í*ÿÒåŽÊ»%É€`­}þw×ýôÌÄ™få™^I7ÏDt–Á¶[p?ö)¾a÷zª÷+Ìe”Óé‘¢³¢0þ´õ)ã‚üÓñÕíMô©‰ÂÌ·0sgËoBIÚÍ&¸I[Ò üp)ÊùÇÌ—*9ÝÓ|‰w´®^ŸÎè=U¹„¤ÎbuÜòã ,L‘¿’(3(}hß+‘*L€Øôù,I@ôÅ.'9[cß´âž÷“˜£p“šÏr3s+DNÝ}ŸMÔÂŒÍnÐì·\8מmx·òî.æ xO°c6Á,§v†QȺqóY;/Â]hCp\‰BqHCóÆlðÄ?L$¬±ÅÉë±FT»’:1èôÔìy.Á3ð8‡š›£Ò ÖƒNÎv<¢ÌÄéŽÆ°4”´Ê~›s9"ôí™ciÛ®‘ص ÷4»d I<‹ ÁW°1ó£*YV—g+ 59À~éÃìŒó‰‚!H=Ðè,ÌeÏ“>ù†/ÏGkêcWÐ,ƒ®‹)78ö·çÁB¹W™•+·© ©¿?­‡éJ\cÈè²I#À|ä¥Äu'JÃQé%A§ó´nÛ? mÅ~=ØM~12¼9¦ÏW=@hº1Ö'CSÒ:qt( %‰ü]fµæzLN[|3-ò)&h»é6Ó©T-Ñe~·d¿ð›ªäâºý·c².ôûc¹M OD=âø$9+&œîçâÑyvàh"] Bž&;é({ò@ÖV 87ú7¥¿ìíÌÁ»kù}¦˜æñ„€dr$GqÑÑm‚®ÕKèþ}÷í*>ݧfíAÇÕ4Dõ|lûxš-Wö+—³ßŠ\”ÌМʵ¿–”(Ô—Ä“Âò* nä6Ǻ2ÃIÌ—Ysf¾û9Ú(r{}kÁNòû< IKïÔñ×Ҥ‹åÞí¼ˆÆ’ƒÈ ýåEÈžv·ßýš<Ù»fý@Û{P¹Gãù³fôžËü‘é`uj呉áÒÞ«„bLŽÔôœŸ£h Ub¢wgz÷C?¾ž%–¬ˆfiy¿›(¬ R¬de‰íÏÔ½ßKúà]gpJrY)s]U¸òŒ²™>qcÌño+|=>ÕõlxÏmÒ³»Ò]0¹iÓ»ÜÖݦŸ“Ú‘²‹$2Lud,­39}{©à±açZ,dügbt þ¾»ÿÈà ±¡™&Ù‰ ñ2gAX2<Å7‹éÚ1ñ\±`ûÓxþJeL´©jQQXÿk~啃5¶ÚmŽÀë§Æ>\­—ïqèç«°²ëõÑ’úŽ<^„bn†7Îß ¢¾¬¿çDxýîiÓUÎùô¼t[×ÐÓa‰û ~¡›:\‹+¡tÎ×Î=ÀؾÛšðçFíùÁÞ1ÿ˜Ãm§~q?ŸœpUð®#7 æWÙ1"M±ïú™fµ»ü„»ê³óÅÕ²öVqV&1³÷/j#Yäj D¡Y-Ÿù†TT0Åã§ã!ïYç–iºEªLª(¯wPÄö”²éwÖ_ ¨“v™ëú}š€Fñ[œvðÝ_ÍÌ‹¢¨.ú·QÔ¶3æl…?2Ÿ/ýß݇f¡öŽéÝ:âGjÇò.µqÍýˆg¬WõÙ1^£zo*'äW=‚åÜÏC×â[d‚’äÈ2=ðp9 bÑiJ5É’¤qæh‡ÙR­›Q2Í6639Êv »¶Ôw×ôW¸æîýXð±I¹7…ûs¸ÀGí¥!ÑÏ‹7š½‹^Nñ í",!Ld¯Eš#l‰ûí—*se~.’½±Ã¸¼Ú¼+Ü<#·ÊAǼ"·S›ßò(¸u&wMýÐ'ï^s’Ó ìØ]ê{G›[vÒE*›x”äøgý8‹õ”iÄé×’¯[-¶F*˜DÜG³9ç˜sÑ)qko쫆÷â›ï÷®]&>ùBÀ@Ž%!>dDË6Ó”1'õ—ÿôÛP¼Ü~·t‰ì}C J ‚`n±Ã¥$ÒD7½Æ1ió*`{‹2‹Ë®šà[†áGW>’.e鼙̛†ÕhŒã½ SkS{fáØ¨‡<\—Ó”œß†¦ˆkNŒhœdwÁòÔ»¸¦Cü§Ù‰þ)ˆëëjkµ¹YíjÖ1¶Ù…vÆžX¡ò Y(NÝå$#Ǧ0KE’¶êÇd‰¸}\®ò{AÌÜã}’:kCÙÕúYÅ×™”Š?í­µñ_2µB¶ÛBÿø°¹&Ž”æT ¯§/XYß”AJ™4z¿úönÀÐû1ë䨅[E2b@f׬æ}×wéC¯„k²Ö[†$pÞ¥‡Êr^ËQ[žÜWÅ%C „ÈKXÂ=b¯ºHÕËk‹íàÄÑ'<úÌ(6âpÆÎ´‘Q?à9磻ùNÿ`òá¬heÇr£ÔëT³õüÜ«»¤{VẼ?’:÷·øE}ĵRÂåÒ0'.Ÿ²{Ëë öDF~ï¼è-mòà«u5h‘;ïê>¸Ìï+¥òlÝ»™ÉÐéˆ--âøTà–’JåKÁã×û”f«Ú­€Í4ÿ¬_ÀúwëÐ=9<œ ¡švïÕûÃ/Üô*A¼+£p†oÂåÈÙ.•mBaÂòSg—Þeþ:w˜“® B·}äcþ úgO«Ï…ñÒÜ'ãþ á‰2‘8ﱊ ã=Ôá„£EDf_üÅîEJjš[ÍeÀ#…ðÐŽëŒK!•¨¶ÒxšÚfp¬ ›Ù0=Ú‘…?ÒfÌ$= C÷Ñ ÷\‚Z 5œaï¶1Î7ò2½.ÊÁj¼ß®V¢7‰s¥k®<õ÷äáÄ„$¨u\­=ä«ê¸Ÿ¼„mUD¯ÑŽP…Œ°=ºêZ ë)sx‰`;m©Ç)0ýt÷zµ#'Æl…_®áL©\HAÕÇ>÷¹]¾IqF£Œ’ÏiH3`’È({©O´ôø§m;\™Ùní?«ÄÝÑ$mØwYÆCLDîS^6º*¯$.”³ ›ê¼sÿ@¯ud‹~’iX°ÊðQ›îý@ä Ó7@8ü+úæ~S±\Ÿ®EϬR†¹üI§R,Ĉh›DM§Nõ7m1 *5¯¯T©XÏž’¢ŸyááQgˆû¹8öûÔŠáé¶9„±øYë²½1nŒÕVï‹`Ôm¤K€á¡Wp1ȃq ý2âîmÊfQÞÓ([Ãâä94½ÀyÀ¯yh‚¯ëU£q•ƒ8E"äG·Z߆ÕÏüG£¬pʃsOKïŽò}µ!%ðS?1Á œŒUÀu§›•Wµ^¤ØéÂú*;ƒ]õò"ðÝøCz {¡Î)Iüo\šã¤‰eûæð¯ô?šyäû“nvzäb}~’9PA”ÜÂU“YæB;QHðû•OîØ¸Â!Y¶$‰2eJv¢²ª°†Ûðúz²^¸ š*^g¢êkðWº¹kî°)¥‘O¼võ+ó:uXZó W) †ñP…Þ¦ÑRCóš+6sê'2ÅA RןÔ%àÔ ú`6Ò]d¸Ñ³-8CöŠfZ5bk)øä)Ȯ촉p­ÝxbÐí¾ð>£ÃÃ@ø,ÔkbtÓ$ÕÙGƒ 8²4Ø’‹¬ß?i¶ZHQû¡ä`…1FF^à®Ü~i8îâ»åå42Â_z78—'¼WÔ'tC.åÓ„æóø!á<’-§ÏsŒê'Ê t¸t2zH-u¤"½¥ôãñ*Aõ¤í68ø\0G¥[§ˆï;±xîÇÖGkPÑ,:‘Êh,t¹] UÇž…YBc)v¯ZtíE¼Íõw/¸¡Ç‘š.9T¥*>¶Ë/S]ÔJQšh&*!ÐMüNû®èf]å Lz½¤‰Æ,ÀÓX"E§Ö†¤)ô¦¯8$"÷ݘo%Fyuüû—hŠJ¡Z&ч6þy¶ UDý ŸH[ˆJªÙ” • ³ciŠDîÎè£F|±‘ú‹~ª'ÔTúõªÑ£Éw¤H6Ýmt¿? R&ÖÌ£v@…%†l10:ÌhÔP a÷QÀˆÍ6ÊInäÐùú‰1[ ½50¸¼!jNîÌ=õÈ©maT— †<0' 1o'÷å^ºoÇ2çÔ#ñF5‚a?¯;u&)|8ܶ¿¿Ï®‰^lØG•ÍV·¤jöxPD‡œ…ªÅ"’Z¶\¾8ÊÜR¬&èpn9¯t »Nž¯•O3øMÖšÚOóéÂ,ßTq=÷ÉÏûúÊ3 Õ¦sé, (ƒi­½×¯€µ H/]ÜHÒ+a %ë£+Õæ§ºuS…o$ÅžXµEDïáB¶#XþLÜãÉ¿>Ôùuœ­£èAHL'_m£k4F~ ÂÉÐfRr‰â 'J]£S**VSïuâ_MÌ«œŒïBÐ’YtŽ r§ðk“7õ×=6›²ùP=ßëéø,W€Žîx>²*ÅÏ OCëiN…¬aÝLQȨ֕dûœ{.ÎF=î­²C‹Ád›ƒÄõNmíWh°ÅèÁ–h§ôhÈå½@¯”:™i?"/FÂj¬ªzZ:³9›X‡aV o”nomxQáun©*^¦ãZ´{uS}Ò5l ¤|¸;SGEÖøŽjÛ0¢6ô%FãïlžȨp˜úòâÛÕ½S^ÿãó…uלp!2å¥ôˆoºÊ£WÉO¿:ÏGïbúGqó.¦‘MÇ7'¼þ,{Y•ph%ë²-Œ[\†0¨orb¡ÀÖØ¼:L€›­h¦ê’A¸‚7TåëAs×_¶@ß%7p|:ºì+AÏœ)Š! …\øªˆ;gÀÊ“9£jú*ô®+z3©²­m‘€–[U0âžè‹Çíï]Þ*™ï‘(ÖéeäÊãô&óíqÂÖTÛGYN!7!°”JS=„(„]ªj‰€Žó€0ž¨Þ“ò¢±lÉÀïöóüTÅJ™H(WEI/h‰¤÷ïkŽÓ¥ŸX=W•e5ˆ ‡ˆJ[̇C—™ÎoêäŠúu›+0´§VŒW¥S€Éù"íœ[ÈÍ¡uUÂÇ­&ÅzˆO$„÷Q*3"— O™‰‹ÐrD )¤±ô‹e®Ñh} .pñøØdµ`¯/óP£†¶T Wé¹Â^+|ȳ>Ý ?%ÓÓX`3Ò®(w²£Õ;Â6Woöhmk GÖ}» 3J¬’ÉV†Ë9Y²0Ê« ÷ ä}7–ŠzVvÇQ¼Qò¤—’8˨‡:¤×.|ƒP“£ U˜ÙU ”)Æé!DŒ[®”ËzÞà (˯°±´–¤€bçwÑÒË'UÕÛ²(wD¨‡ü\×€ B6n1ï±h‰lÔjÚ¿ë'[MÏê;cÄèE2`VÕ)J#~y5hE€þe Eùh9jnÏÀ-£²A(´’UŸ"¡KÔþÀ¦`H&ƒ!®Jæ]X ÐÀ`+8]³e6‡Pz±Ó¾Ç9 Iä=ì}Ip¾z.öâ¸Y¨¢ó|ÁœÆgIïäa˜÷ºPW?#6=[¾¼£{>Y´ƒ:… ¥úäP'׸VÁÅ úáüEÅ”Ø3BŸ³àK(¬Uƒ®ÌU¾i3T•…*ž]rÅNdÆÓ@;—ÿÖ¾]DYžidm‹IŠÂ§å€Çwʘ ç¾8šÞqÅA‰´ÐH³ ‚Ò‰˜¦ì°ý…¿ã°æh!‰çâîˆÑ*êƒä¬^¥DÅ'VnDrë[¸ê–¦ÀèªÇxAùÕ0‹„uBô $ŸLDRáªõǹ¥C1î"&ÖšóX ZÔ£d§-Ò‹ö6r_©ßIPZ@š ÍV¨ÒÕ“;—WþÂá*ôªÆN%¦Õm¶ØŠ%bk·Ï -|YA¦=²¡ÓR­z¢‘ Ø+Û€·Ð쀾!Œw²øƒ²^2ϱ îo¶5)fõD~¹?ØõùÀ¶€ÑöŠô"S+ÀNslÉólž±‘Ñ÷Dùr~è_{Ò|¶š’î¿(d‚zÅ(Ña›CÜ]@§:$ÉèÑsULÊÏÖ»N/™RqᆯԂV ,YÕÍ8Œw¼D›4h´ù2Nd \Ùã¡ %†›®4m {ýÜÒ%=$¤¯gSFSUÉ;g ­ÿXir-á_<µ’ |WÀöÌB¼7§—OŠtEîÜ+|j+×eÃܬàéaVú:Wx.WtˆóIPÚ3‡(ÏýÖaØ%Ö׉¹œ¿ƒÄŠL…רR †[já+'ò<¡žÍÛ~ÍŽ\øÆ´xÕ—·ÚXà>93‹Ky§[5µµŸA£ÖCãÍeGèå5G‚³a#•¡k„‚iØE_ï…pðÂÎñvGcÖ2­ÜºÏ …Èe¶ãO‘R"пø:NÅ“X>Õ&®;Í€ï|6‰™¹Ÿ.Md$Xó0•Ö—X»jû€­.î¼ÑmL¬æPÖæRi0ÀzM_î.ü¿å€ªÚî ºû~|Qƒ²€}|h›Xºn9ƒ;Y^ ¾F”جN$ú¹9—‹K>ÑÒc𠾆íÐÜF›jˆµ2›¤MlâÇiH…íôÎJðÆlde€hJÑŽF{GkŠúÁŸ²ò œµN¶Ú‰!#Zq‰:±—Kðnâ;”ž^­=òÈÜHÀ R;ËÇk=z¼Ï oL•ü…]óBÍ¿žÁÈõ¯œ[|¥Žø4"†±uâ&¸óüCÊJ³ ¿>œÃSæFÔLß°m`ã\k–è{„wsNÁØËPCð–0î‰kÚJ˽äͽO\.³Ž‘ÀÊ´ÒÍ®þÂ`ä›]™ÍçÀUCë³Èl³éÑr[ôÄ™f Õ“,QQLÑw-Í¥D¡Ãie5·IOᬉbÌ!æuóºL¤¡ùÈâ3Š ¿Ú!N‡új|ÅäÆâºÛ[¯Vkææ·{»ÜÊçóW}ÔøÛ+ˆî U˜ $á·å~ãÏ–¥6Žúö3Å?°Ågb"njê E$¼ÒAØéC2ÈÏ]Ù é‰2›ÚÌÕ«á'j÷L¢¸…!±Óæúø‰¬+Ê#Ô˜ás#FÑ~~N¬µw¾ÐÇÏ Ên¼SPúÙC­RVód×h¦®Êù)—ö»GëŒFàF•/ [§X½¼Á5ëè},ň‚²Äššõl±Ý²L¡8Sk]fGˆ}Ö9ÿÎù Þk_“f¸Ÿ?.ðÙyï¦ÙËÄ¿†~  „²¯6 žoW»Æ9Îrêê•Æò·Mpw-¢,ðµûtà‘Ò2bª¼ ¥c<Š]<³ÙXm¾,ï÷ÿfÍ*橮“—)K<…:M¯ë sj-ºÒˤ«ÐÒÖdNœ/9]èpÖÔiÇA°ieÔïnsUmÞI3ðo@xôq±zIfä5Ô9Ò©€Ì䜫Á+W ¥¹-¨”ÎŒyç’æ¯2› ˜ÛÅÁ?+nO ž45 H°ÖåÝ=µ VÙ.*  ÷¿\1Ä’€¸L̳µZÖ‰ «å§ÒÔuŒ¾ÍÔ`u„oŠöUPD¾î,’7£ßŸQ=©wÏKZ$éWB²Þí0åyò•f:æ÷+ [m'·¹©©¾:T@uÍž³ Ï‘#t¶6>:]ïUØMD¿TβÞ,Ú¾àѬ ¢½ýƽ€â†ê/R‰NýËÝyNN—3• OíÀûд]·Qe3‹ì¬nÓšWØß~5¼½E-;ÎøYl3ßt¥Çë„i~;ö•¿Òü¬UŠ ^õ’5¬ègÈ5)×I1Á„(a„@çò0’¨zøe¶e»¶ç| /#ïa×CÕų K ùÑÙË"VŽCö àQ4[6dÕ8õ ¹ endstream endobj 96 0 obj << /Length1 1890 /Length2 11875 /Length3 0 /Length 13054 /Filter /FlateDecode >> stream xÚöTØÒ CÐàÁ!HãîîÁ Þ@4и» ¸wÁ]ƒwww ö˜¹sgæ~ÿ¿Ö{‹µ wÕ®:Uuv††BMƒEÂÌÎ$kqbá`eH)KêppØÙ¹XÙÙ9Qhh4ÁN6 ÿÚQh>€ Ž`;ˆà¿RPÐéÅ& tz!*ÛA Î6.¯ Ÿ ;;€“]à¿D;¨ @è6(³ì G);{w(ØÂÒéåœÿ~Л28ø˜ÿ HØ‚ `S   t²Ù¾œh ´hØ™‚ANîÿ“‚^ØÒÉÉ^ÍÕÕ•hëÈjµe`¸‚,ê GÔdø£e€ ÐôWk¬(4MK°ãvæN®@(ðb°›‚ Ž/!Î3ðr:@C^  j‚ü‡¬ô3à¯á8X9þN÷Wô‰À?ƒ¦¦v¶ö@ˆ;b0Û€ª²J¬NnNÌ Äì"ÐÆÑî%èÛM^–ÈJ¼_:ü«?GS(ØÞÉ‘ÕlóGl¤y³ ÄLÊÎÖqrDù£>i0dú2ww¶¿.×bç ñü/2CÌÌÿhÃÌÙžM vpÉKÿÅy1¡üc³9xØÙÙùx ÈÍÔ’í4ÝíA:9þ0¿ôàíiog0iä 6½üAñtº€NPg·ç¿ÿ‹P88f`S'€ È Aù'û‹dþürÿP°@ýE~ö?~þþdð¢03;ˆû?ô?¯˜Mí£êûwÒLµü·SRÒÎ àÉÂÃ`áäáppp øxØÞÿ›çï ü·û?­j@ð_Õ±ÿ“QbnøO/Óûo#.)ƒþ¯µaüï *v/zèÿ‘¿>;»éË/ŽÿÏKðgÈÿ?íÿ‘åÿUþÿ·"Yg›?ýôÿ!üÿø¶`÷¿/zvvzÙ e»— ü_ª6è? -igcö}òNÀ— ‘€XØü=F°£,Ø d¦v2µüˆþ{ /ÉmÀš#øÀÂÁÎþ|/;gjýò¨8¾ÜÕŸ.ÐËJýï‘2S;³?v“‡„Bî(ì/ãäáxr¼,©ÈíOmØX!vN/!€—æ¼ævP”?n”—À&ñ‡é?ˆÀ&õ7âã°Éýƒ¸lòÿ ¦ò߈ŸÀ¦þzajüƒ¸lš#—8à?ˆÀfò°™þþ˜›Ù¿àK5 Á—#Íÿ†/šg3»üãçùÃmç ýWÀ Åâ_ð¥,ËÁ—9€ÿ_ ³ù|©ÌöÈñRä_ð¥2»¿!÷ ÷å‹à_î—Rìÿqó¾ ÝÛý«5Ž—ZþU)ÇK-Žÿtòât|y"þq¿dpúÇýr¸“%ô¯Ö_ªsrµûWÀËÌÿœ/îÂÿQ’©3úòÊþ¹ë/2û/þóIÜ@¦( ³v¦BAVß‚Zo¿J¼ueù9*2EóS;…ÅsÚæü)‘¡êKÀôZ"q°kyK†þJ|‘üÑó ©)´9þ}˽׃Ñgõ‰Ÿ-(óãø}cù5ßI_“°hŠïx=:x}ð·†k‚íP ÉvpæÇPËŹuí•s«ù^º42ûóýN¯"êCé$Ë'­(}ÿ¢iš“ŒBJD'RdFìS7Ìé«ë)쬱gr…ÏL(Þ‡Ÿ¸ áÈ(ãÒŽÏë g¿èP`Å竜&NÑ$R<¤¬ ‚Ò•«ôãe&¡mR¥‹6èZu][æÖ1¥h=¹V=Ÿm¡<ÔRÇn÷Œoêoh«°JИÔ?QÙÙ!Énënäzƒ0-!vnc„åØU¢¢ÖpSŠÚín®á^¼1Ûa²þf¤ÇXÀ™Ô>ºïZms ö«Š3t–AIÄÙ²$z&`r@zt!§¹Km:Ò°È›°¡‘¡³se›¥xÔC‹qd‰Œ«|×çzë]+A ÇÏ÷‚¯f‘ZÈ1f7FX&ðLÝšKñó\“K‰éÓ°…u…#xçÓx—¦Ój`§˜<Þȵå°Ã2túB?–ÇGÎUášæÂâK¢—äðɘñD˜ý™­ýÜ”®n€^÷E AW7ÔÖË”À.(´:Ö0@^ß6D&Ä’š°ÿóí:›ˆ]ŸèÑ\ - ?? ŸØê¯Úû샼¸2r^щ 'Dÿƒnq‡Ü?¹Ë¼:ý­ÀT;9P:¥ÿ‘¨˜6ðÇoõ>z}Ìâ æQœ\øÞ…ÉŽ´jûSœxŠqJÒå š(u€Ÿî¹wÉ—åX¦P0á$½Ô¯‰mëXÚ×¶:×¹ q©>Hë²T%uU¦Nk/*&Ù×U¡ç6Öçøh:ߜΪÔpà}.§¸ó'ñ¦Óòqçî"DýZžìøŽÄ,ÒÌ4TúA–Àt‡ë;××!¢~~ë猪‡FGˆ6-x»äØ5`ÚϺ€†k•Î~ôéÁÓœ"½Tê‘,3Áq°)ÞlªÕ£Ô½2ç¶ñ0´R)æB0p»&à÷zEûˆÏú“i6öœ²ñëâõp s#Qµý*odÙü’ë Q„ùœÄú¤ŸÈÜñ­¤ü WZÈL „GwDÖoˆÐ„E™ßùT– Àj‰Vù¼Á^õa€ H’ËbÁ5 b›ELæ¼mµMïÜfpÀ@«K/¿‹ê–¯ŠEðoªéÂÚîÅ"RÙ‚¤Õ.'ÒŠÃx›ß~N¸(t±”é4Ò¡ïs Q¹MA¢ .Ú%0ã™Î]Õá.EháÁ¡ˆ9EÓ‘JGü*C¦p]ÖÞ€¥??m “ƒKØœDV[™þ°`ÃØ8=üVð#I‹(‰ý ßub£Ró}mÿ¼nf¿”OM¿ÍÕÝUyv‹Y*Gþˆ ›ÿo€3n?JÛ²÷§Œ÷£L§H\<í‰ï?ÙÌÈUÖÕo¢óÁP‘¿‚uw`ÚØ);CŸT¨Mô•8@@|½ãrcÅŸYü¨Kª†ÅÀýÕ|–IÕ^Ç(ÌÉÀ“¤£®K-l™-µêšÒF~vÏ­&“àjiÒáûîŽ ,ãP§‡Y`{èq“¨ŽwKM:õ§'“Íí‰Ükï¡Î¦}÷ ƒåu‹1ÐHa§.ÞÖ2¾d~N×Úè·«çÞP„Ìš1+ÅîL¢•{CzØF[ús‰Ybâµ+ %w õjèdS~ŠU%H\‘QûU«Lx•¼Ñ ‹B[B?ª éh^hÞ…®YÌi‰ehRì·È˜^Q7•£’ÜUû­G¸ÂŒ&9%¿ÕKÑ‹¬)»O—SÙÅÄ0‹ B§ Lú¶(£ä$ D÷¼„?º­‰p¢gmý(UÐÆÒ“]zm§€=K^WO LSa‘ÕJïôaL5©‚5äIÆ/G‰¹äCsÅ>¦Ë  ÿŠOEñ»üï[>TŸ|Þ0†fÖéƒO)ðîFÀ_~8 ¥Ø*kæmÙaîŒw°Þ×á`¹¼®ÀX‚ jÛo!.ÂXºïß*Í첫ì«;¤]S,1ò :+©¶ŽŠ˜øŽø?­(¼~” æ9+@@ÕDóp,ª=òvV2NRž÷+m§äËTlŸB…;¾Ùm9ßYáwWDzžŸÇæ{e»3u³J‡på,ì$*R'áæí½Nm0sù~KKš\qìÉ&hYŸR/èÖD¯÷6­F*ã<üHãÿà.­¯\ûFCàÝüéûO­3PóK¹"Ã}žÐDª­<½àcµ x»øŠÛ†$µ>¦Ô eb{f~Ú<> zŸõSòJ"ª¡›6¶ÿ¼ûX‡oG/aòE9wã{EO†‘˜`méV3Ñ;bÐþ¢nºýB"18ˆ„)®§ôlãU~Me@ÉÛ¡ø C‰\MghÍã0K7ÄtòÆûÙÿˆ†@i^Ñ\•s¥Òs@¯2]«[ÅR znƒúfE;£©—5¹GiZÛà‹6Ó­{w4…¶*0À’Àp×qï\ÒéÌ„kSkvµÍ]÷«Ñ£ÄTÉ14ÿVSQO¡Üe”ø!x'JL;\å6R±ý« øäXÉüÂ\vš­H 5f8ÁktØ8B‘½Œ¾)¹ïdpå ßFŽP¾š Î– åÎ?Ø;ÀWþ]œ„?“>'ëê;pâ¡‹68÷­ÕíT!³€ž›«/„V‰ ¨Åƒ1G•âéXàÞ~G3Å{S¹|Ã%ç]  K´K—¶˜é¤0}3™=K—Í’Þï·ê·,{Ûª[%í¨2ôþmsíï®@O¤×÷þmš«í —œ•ˆ>Wª8®MFߟcú¶ÓH.ZF/Q“Ì1o\ˆfí„_ØýRL^¤|—1V…1™ h,ã•Ä*Öá£S¨¦¯?i!íOŸ8¯0åP“_‰Ý¸aµÉ~? k5(Kc•U¬V‹ÂqÜâaÂ9XY­í·ªÌd«ØÔÔ×oÎL¹ÌÆå“×[%tÄ—ËÆ×U!2dDz«Nã±³I"Q¬'‡ìÀ>óJ°ÿê¶ìÄU—øš¥9‹æKŸK›rJ½ë+8tiÙA|ó|£ülÕ¹‹Tœ…6ÿö&VöÁ‡ çÅ0¹Í—†D1c ÁõA½zßpý æ­ï¦@zLTöЊðÇ=È@r}Åeÿê«èdÜ©õöÙ@þ}êßT” äqìkRTÒ3óU󠜤˜¨¬!ÔJì’€Z45×·2uEWcÔ*-A‹Â¹ÅÏa”V:-:ŽpÊPâù}™ªÚÃŒ¥Ê=ŠCFsB¦t X-‰ðÏc?^¡1‹qawn¹ñ%ñR½íxR\Dˆ„mQ àÜ?¢&:Dšä6²Å¯ÉuÔ,SÞ©Ýè—è›llÍP_CEÚFÄbÙ ‰o¢…Óíp$µ°öø*Y³yJ¶%ë·Ôå©5@JÂ8[´¤no8,vŠÊR¬E’B£Xº­!ŸªZWÞéT¦mËáš5\Ä'óÀ¿ê]w'Ý©ÍÒž_u„`Ñ8þXóIׇÝ…ßNÐGŸ,¢þ<r6ç‹Mà,/{gÿÜ’ËšÍDÿ&Ø—cSþû»#p‡o¡]®yòC„y˥›֜åöƒ‚ayXaã¦ãh±ã+!–‹|D9o j2 Ú͆Ú\½µ3݉k:ÖcU²»?Œì~JЪ}O-'nS|¯·<ãj-¤Ô˜¨»XšªÑ ,B+w2öƒàfbµ‰Ìnöƒ Žúɧw&Ì”¡Šv²ìf&±@âæC¢çá¬Usn9Ãárë8zÏÝžÁeäÔº§UBü qâ©ÿŒ^uÖðåà#öh®oÄï>£:ÇôÌ>o{¤Ì@§bw0lõÙÄ0ô©‰¦ö\–‹èÁ« «`5’6WÙ{~©x€+KÚzÀÒø“~ÔÙLtíLèÜ$ñÖ¨ý8ÅNÖh"ÕÔúJ%}:ò–bœûÛeo†3-q)5n›šê÷nÂóéù¡lw³²^_ÖåJëP›µÃÏæ…Æ AÏ¢vë(؊ק[ uo™2.ÎÐÚFêÛ‰;fó2 É9Ã8 ¤^{Fö‹* ®2Vª{…ï îô®Ï…®CÛQÉ"9X>7ØŸº0KjH3Ñ-°ô»Á}énÃ%98 Ö‰[7=éÌ´íÏpÿS0ŸUïãýý*¯Z,`ÀOM(ç4,¯´ú²õÌ¿jêðM³±›†âGú#kÁ‡1ßXòð+çr퓼öØÜ®Ù°z²…º\¥«]FS¡‹Æe#›ø¹·lÝ´)õ4öf¡º—…”Æ~½ãÁœPgó4?x/uæ]fö£y`îÚg~ Zó‹¢ Ž»å1k"öª%Ê\-Ï®áȯCyŠÉŽ9ã˜×ˆmIÛÓr~dðd-|"mØj·FÃ{òéH!ÔuÂ1$b¦~;bcÖŠàuñjGº’§ƒ„>Œú¤%5C¤ ‡Š†‚ÒŠ;‰•afoBill äæ¸Ï¸¢.œÞo5v„˜D5|zQMÚž‚U—®MÃgJä@„v†¶PžÝ·"–p*“@¬ùo%4Ÿ86g]9–-\Ävý¸ykøüß]Æ? xº¨S¹|ì²ÊÝTå&-nÃ]h7Yyþ™ßô Ö)GöÜý|§æçÕí‰ç…ë{=&Ý…¸\‡F¦¦ qÔ“-[óš•2DÆ\͵X]Ž´J ¾¢ö#FwÚ­J0AqÞs†"V„à[ƒÞ|IŠÒï*b~ x'»ts¬×ÖžÂjÝÉb?©ÙLr·hLÕkýC6 ­ðŒ[çi9¸¸üäË*˜ÎFšûiõhä´ÇŒ |CÚ"gy¯«» ¦çYö’:JTATØX3 ¤ÓвnÞJ-×+UJ™¹{_ÒñÓóÙ˜á>òlÌ =Ê`7v\˜7[¨©WºžžŸz.WÉYƒÑŽø‡úéêu_×vi,ÌÐ}Z|cM¶öµ§Ë´²=BÎa¯s#¨d„ä^3ËÆAÇà×»¯lDëv+6L·òB:˜Øl$³'|pá<‚oXv²QÛU¾hãáh›¶@cÆq~‡D‰ùv`6óƒÕ§*,w"ÑTï¤ÁUæï’>ômWÊrüè.]KÅz(í ,Ñ·j †`™ýÈ¢Q”AK¢³ÿ‰œ"»^6’zCË1k†ñðã(#ƒ±ÌMÙQ(¬·?XîÀçÇG3ßœºëgÍÆ)_oNWQä g"<,™ˆ}íÕ/ôqó3je‡M§¬ç|)3Þõ—:fÑ@›’<]ñ¯Æøá„¸R‘_™1x‰½Îµˆö¾éqö—xÞ6ÿÜñ¼4ª!‰x·MF«^'ýUʲLùVpìÚZE Vv§_ å±Xæ§W3Ó|‰ˆÑ64eן:Â_P½Ñ;nsOW] 9©Z~z ·ò®æÌq¿»ûZ0m =ó‘‚‘‰.°½œ>Ks©¯2aîÖKs+ ðßÀú,Þ²%Q"hè¤ûMÎ5$h\ Á'ã£Ãd´“Ò®N%·-ñ¡×É BzÕ ½½–âõ,»ß&£¿óÂ’Ç¥É6Á×€”¯oÊ 'Ž ¿©D|ͪ§¹˜ ²@†9 ÖÒ¡µ ãWmß½ø½>­=ÊYm¸Hx ‹á!Wuô«dOŽ–=>º›·ièÂ=­lªÐ௾G4t%\ ŒìñL§•©ˆ̵`†ÿz{–F"Y\Ý ïUˆ’å3³˜^e®X¶v+Ä{tÙÖ5P§¸~/ÔøØY£¨ç±ø6lA[ÞU8&-†/>èý,/e…7xê2 Ȧ¨Ç³dôx¥›ë½Ã+µYáZòÿ¡·êчñ €Xtøñ±¨%‰yÏl"Tÿ¢ƒ×îSÊQÕô|ç^±L7?ŒÜŒÖ$†ym‘»¸ŸŽ^6V$,Ò/3lm:Þ‰â{¹+¶Tj)ÒhŠÚMïlô-?xeÅT‰]Áël¢ö.ôÏŸí¼q‡+eßç¬ FjDáÇ7¨Yj áî,º4=¦iåk`ùËOjy oNå‡{ZËã1ƒÓÔ…»ÖÎ7ë)OYá|FSo‘i+îCê4_'À(½U¨‘óa޶sØ~Ï…´Ð×¢<£tÀý˜z† ”Z6Ž ìnæAÚ&iP}„—‡ÜR6Ý*TgïM øÇ!wÔIzF…ÝÍO®!áZz]Êf»GïÛSŸVÍkÑÆë\WV¨†0h ö”›…Òx?_=l*wOºßË™5])‘ñR|£!S\µ_ÿÌœ¶±ïÂ'SòÑ–fòrüa¦-Ç[ùÍɤ I‡AQ®àUï1ßÄ.×  ë37%}T"Iábû-bâ9ž«lŒ´â ìв]€ná¸Pž«‰ÛEë~ ÅCP·6›mb÷޾·É2ë­N'ø¸R.(\‘Ê3§L†¼7óc7–™ßÛ)j5|åו4 ~sº°X"ã •NW±ÖÀ‡˜Tº@…Ú6xÂ/«7›=bbß6ÿRÝþR×d‹Õ:~À•å@ϤJʉZ|”:wÉpn€{É“‹É db㟦l¨gƒ×è7ÜÜÆo‡'GÌëõfÛYÒ!@t½³Ùb£” ¯ôF@¥O¨×pqÚI<ÿnøA¶tø“¦òÄ ª‰…Å@%xwö¤>][ÀÞ¢ÇÀV)›ö±¼ö¦`Âoß8Ï0‹O‹.C*Ü>TÎßçæÎÒ—‹chcê”VÝ ƒN¨ëyÇk‚ü¬È™¼×7I·‚ZBÅ¿hÒƒ*{@s¹ð¬ûá•ÁrdA@9µN6M’r¤yˆ>[a\cz´o0‰³y³?¾<¡e„oÐÇ£“oÍLŠ|ŽzÅ95VôAQe\Ûƒ‰¨|+áÙfõÍ]W'Í顳Q–ý·x=R,”ºV<ž<c®Qûµ#àA…Õ½™æhÿ~*í¼Áz²‚ÞÀÓ×½=?ñþZ*Y~ðÖkCôzáø(Ø × $SK‘MC›dŽÙ—tœÑmɤXNû 2=Jü B«9`_UÊ·Å1£uà7;"N…Xæe…ñÜœ]föÄg%ÃPxê›TÕÀñ`U¿Åî+…-¤÷òŽz6—Waîòaäc«n½ j媺ø[*2 œï,p%£Ö’ HfvÑáI?ŠºœœRŠ4•"µ }Q’ð½«"d?3kC2Xiõ'4‡|KÄx{‹MÂF$Aóaò8ûãb¾âÙ¤Ñ\½GgÁ ºˆ)Àê#kœ\—7|3´IHn yÃÞO`Yü€Çù!àà9憤èǽ “ÁWU±-v‹Ù™/*‚{×½W-c±$i©ÇƇ¥üÀã¨Á­²Ž«‰îu© ¶‘Za³Æn[TŽ#5.àÄ· ÑÒ\û†…v𘠭›_„ ÉI¤û–—ã–±Ú¿z+¿ï]k„š$D8†ù˜Ò m¦¿LÕ~æû E'‚pe28ü }y—õ»UV}™£_uT™Ç]zlPžwÚØ7™Ñ…ì-PœHˆ6løåûÉT…g°tªÉTäÔŽÂe‡›ÐæÓuPk³€(’ÛyGMƒmƒPÈl‹‘êñÆú“”¨^sþ7þ„á®wKóxF&M§%ú㔎m#í9³ßõjŒè9j…i“c/T <ê† ¼¿%,;^a–™DBë<˜Ÿ³B´Lø~O§¥£úÈ£^çÅFšåáb“ú*-~¼¼æ‡#w.×7E«bØËhˆÊÕa-$lÞ(ÿ~ì—†)W!I‹Ö¶ÿZBíÚa^bTˆ3ó•eéê(óÒ íÑùº@ÄÏ@4"gR2ê QkBpżÝБЅCÙ)C¡¶Q.ïf{-’_ǼD÷$+*¬``pÝ´ƒ4üƒHl^ï0ƒk•ËÀú”¶¨7ÂW“+G3J(>@˛ɳ’žß%Çß_ù¹Ê ·ñ”ò 0^²Šš:2P› p›ÿúÃÙr!¸7Þ÷™#×D~HDXW?/ƒ²\ùJa¶mØfó·1+ÒB·~øV£~ –v)EJñÊHË|÷€4ðÝ+ÄöäÑà0rÝ민éþ¸mÓ~¢R9$xßF i‰f,Ì«f#3)½Zj¥·1•qßÓc†—uõ#;Œ7õž¹]eÞ¿Ê”ï)¿Œ“¹L ›må!Ó<¦âr-©Ž–C¯axO[…“óÝ] arzP_£œÇi6¦,a5æ0ºHD¾?÷sJå-%¾ñ<4?ö”óÁô8 yòó&I¥ Q‹˜s,ú±‹½¹ú–Ì@2×[¨afBâ”êÁ‚mÎ8ãN6‡Ôlr¶ÊæsߪŸ¹åÚå8 gjÆP'IhA˜kgh–‰éS8"{Qˆ4·wöÃãÆ¿½Í×xŸ’ð@òu0¶ ?9·”µŠ’SÚ«âèÂK«b‘l-V?‰ä0ï`ð‰\T# ¹N¾<áÇUå<ÕˆG’ Ù\­Y*¯Åñqá³VóÏ BCFx™¯Œ¯‚l½žWý?yà\­ó„aË[œW|´€ 憇•,ܪFÙ¤:™Ï9†,…zH’ýé;¬ˆÆ¬.aKåF¯-÷¦Zد®H—lQ»Ö~.¿Úßݰò#Í˳ÈLW³øí49je£1y”־Ⱝá„I¦¨eé, ¿XÀJõ«³ïg›¬¼ÌgßÖ`© “Ÿž:!›ê80¨¤un lû~>~]¿•-OX°86I q¬{zK ¼“Q¤ŒÍ!3X4îªYmKl¯ü'ŽH8%tó¦ÉiMlÓA aȃ©˜Ç4FÂê=q0ǰ U«Ð+ÓþÃ[3oBËmˆMô€<Í){w¶Þ¨0n·ÓUÖD(¹Š«ópX“ÕÑ,‰w¸¯ø-]uñ²p§œÇòÑvê ÷{-×/UÕÎ"&[S¸Ú°„*qsW¬ýr•à~Pv= ®!NÁ1CâD4Ü™þ%bUíS¨^˜+úöÇ[ò7#u¿jæUÞIŸ]—5*\=qÿl÷líwåXõ Œ›æ&Èwµ“Û"‡72Ñ1öétA¢à03o^¯'\«­"ëTËÝ ZÁóŠËRº³SŽ HcX–Z8zøVG Ïë —ù*Å_=`ÏUUèÓ?ï-}ÀŠ9\Âú]Øù– €CŒ°¨:/ ù&“X®¦yˆ ÉK¹_ËÔLüØ6¢nœØ‘IÏÜ_ºÂè¾ÇZÏGZf¥mWÆ9Y(!Àò¹—’£‹Ñ¶^©èå'n·CªÞ2‰èG³€ºÉ‰ô ±r¸Ê_>Üüeíå=ûQ¾ò-2룧O^ºRi§²…>’®¬@\>ûìœ ‡ÖÀ‚³Ú£;ÒÖ/SXñm%âì@ŠÆ4oOQÎ×Í Æ8y´¯ùÔ£òu g Ác6RgÌß2?ÏüNÞw¼‰Ë[WæZ€ïTæèºPlÈ 6ÇcÚÒfªÄHàòàŠ©®Œ© ¨©|§‚Æ.£©fñŠ’†‡‚¨Õ l Í–L¹A%*!P+Å@‚õ‚f7 Áߺ\Ëuxu—û¡ëΰÞà‚‰ãŧnm¯C û÷ƒ 600Š‹}óöj$c8iÎË”l{ÐèeÔ› Dí¾¿ªñÉ ì4& úM¹N\&±ÖìFè=•½~·†Æitc «û©e¾¯“û½‰ßÏ Ü8§Q›-«žÌXBtÅ»Q#.úîËöúrvbúد™A˜fDÌ& ÙÜšˆÌ›=¿«ØOÐC° f‰…ÞkÕµ¢ \üBþv“àãÚ`Þ³(ýÙÕ…?{ÑxËðÓåRæ“~ªO¾jû2Ê5ǹÙÛHdÜv@ ñbX†`ö°ÓLœE'.µJþg8'‘QÉå+¯ßÒÙoŽ>MªO"Õk8Sé˜Ú3z‡à—w²XIÌ·“ðoÃ3bV¦÷¦{üH©ŒÝõvºÃDYÀ‘=»Ÿ‘×¥£=V†J% Í<±qÂÛSÍ]$åÀ»âW–ë¤ã"8Pˆ(–~¾ wzð†ncŽÏÔÖàÀ°k6Æ ÏFc?|ÊëàÿnQ>a×G7Nûè$p·¡lƒgñê<¼h{cÓœ¥Ô¾tÍÈÍù6¤WfÒ+øQ³ÔBÔÅÆÈ..«—˜ Ÿ|©ó«?£(wâÕ›÷ßVWöv÷£ ­ÿHC‡ÆÍõ) ßr•»GC“ùSna7ç<ÁQÌÚ܃ÚG±xT;C]aXW*ØB\!¢ªèê¨uõà“7cßòM‡©08ö¡8<ž¤Û¶Lù„‰àñ¾7·tF˜çõ‘ú¯Ôi‘H«òó— O ¶Xù´'Ù¢ìWñ3aŒ¥¥ÿ¦jRUÅ61ý©¯-©ß6¼Œ¦¹î_P¯Õ΃“©QvÄuö Ñ, ÿl ?‰ÍØû¹Ã.nV8D`^Gw@G/­ìÝöæcZúVéusÔ~cŽç6ššZw •êèAã¦TLEuYïo…>íª<ÏÌ ØN™ÉÃqæJ-ÜùHØ È,¼2’µ¢õ1N¦…Š`ÇÃÝYa¬x ÒÙo¥öøÁÕ”(Œ™:¶ Jªb‹CŠìðk g–‘á;úa_5*žfk”0ñÒé@7IJÕÛzöð½ŒmäÁ×Ú)KàTómR½´\i Ï„lêUH¼!³Õ‡«ùžû>7]”gÃHž á/³Çè7G Ôß<“4|¦íèVÄ#?8¤”!ÆT+ŸÈîozZ«©Qô*yL…~T•>Ÿè_Ñvæ,hç£e —²‰‚©u¹ X#qÿ|ÔáðÌóI[;‰¾„-ÃR\ÅFŸƒ¾bf]D*÷Ñ7äl-=–ùæÍ[Zlì6úGUMþC³°cØM§ù1*Þ8/SWΊ™ÍF1\#õw®NqEK„2,ÇCxBТû'¦·F;|Ëœ ;MÁšÉyI(m²dΨ"ý@ÄC²(e¿4±Ñ÷­¯¤ #à«Ïû¥›Ê‹y¾ÿv©©¾‰)*ø,›/ ¡)D0ÈCnì;“ØåZ­ ŸÂ:x­è+ð§Ž!_?ã'‡ Êì?éKðÁ›¹éäfÜu6ÉãÊà©c…—‹¡•Oß‹ù… éW•>!Á¶{Üu}­¨Vô¼#óÍÁû¨hy*;Óý4Ä¢¾œ²ûÑ[uÉø³­‹Ûï·¾€!˲œ(LV±Ç3ŵÄK7˜lm5›hS¾êÑ èVM<ßîÛzsšQuÐïÏ! À=érÁ»n=Þȱš[dB»,wvLÎÄŸˆ|D°I¾îÔœ3¬¾³°î~sü‰†P]³A±U£X£:E‹DŽÅXúöæùË*È;³ô÷ŽKŽté”]DÏ,b{K¨ÖRç™TZÁïÔØž‹>Ð6 ’ñíHºÕqáZmÚÈðaW¨÷J­×JSîØK ²7:ІWQ(I*\"ͨÛh'¸¡¢!3Ö>„£Hؘš¦ K3ü¾åÿðÙ©6z»ÙzûJ6SÍ=>ù6ÔîJ~}©Ëí§XÝÒ¦¢ï¬øÁ¢7)ÝóÁ¢×Ÿ¯:dgòLM‰ˆH¹^ç~o´Þ–}‰`‡³"7D  D¥ÁÿxÁ—œä^ÂEì¯_«|Þ÷5``ÚÈŸ­û| ^¼»BA™C¹,âa¿{…Ñ´5Såìàó™ðGI7©¸ª.éM*¤›hUW0ýR¯Ç]Ô w¨šÃ§Ö&g䋺ygÜÙÄ5½ƒ¥;:äH-)8wÂàì¬Q¡çÙ Å A?”N¬DÜ»йð¯d}a“'T‹NŸv»ÑåVMUÁN‹±dzk• Gã]Š_»Ñ¦¢è‚?í^¢"e˜Ðº™µô«k1Tcé¦ÄÞ÷ô³ðzhú†\r^áVþ.«ö2P,Ð!¥Ò0¹ðá .J…®¿hú ë>uÇúQºnŸò7!r?%+·R¼ö† jÐâJ7D%æ8€&döí–ï ²Æb£iéÎJs.ã&lsRŒBƒá©]BÓ¤œ˜Ça3;óç-S“o¬ö#ÉqtÐXÞŽ÷Ãí÷–ey[¨Ì0ÏGõâÆ+…ßñŽRÜW¤ íVdÎ%s=‘»¥GÜRR|_ÃÜÔ1”-îw¬b-0N€goeä¾ÑP,jk˜ãj+PŠ•Ë Ûê3šÑê‹°•åû …+ÎÎþÚÆ—D·p[BŒ^ÛárBx(²›ã]’FÔùÞ¦“À¤–”¹+uKÅW%tW"<ض9?çühV‡ìüD›³S¯˜¡¸P†¥ŽÂa£^R» 鯧ð‰Þs%rôüñL‰ogŠ$}ë4³hº+Ó„´ žUšNw#®–-¬q49íÉG‰æ›õ¸Ëºÿ.üƒa±ÐwNܵdMAVÍÝrxÀѸï,Òá:Á+tþш=Œç4ÇTæbÆ w±Z™.z‚LÍoÀ`m_>?,¶¡…Jðl‡M­g2/»fÙJ.© ÉYqó©âuêT, &j¬P~Ž]*}a/¾ëû”G¤À>©' -jC°š§êô{)ÞÏ›`ñÊu©àÎ.µÇßhÀÚL«‡xµ¥$—%{×å^Mì”5-”8Š TCû]õ^‰A|ÌçO¡,ØX†aa¯«#Ðo“PÕ`s§‡=ºã¾²(4Éi쎾ÉÕ7_/Œ†cpNñ^½Ý/@˜?r£/8›ó`UL€é ¿<Ü*ÀuX;¬¥ 2[…é]}Ô¾› +«ô$5®ñSó`5áæ¾>³_lûÉV~:±_hð)&¨9¼.ºü“~ ;÷mpnªx}]Uw¥1ކL¢JaI½Ð°0y×›¦¼&_ šä^8ÏÌ–ZÈf—»¬â]Ø5Œ®›nkæé|ìƒÅºewãÆ.¢Hg º]&]…`Ú#lzaž–8W¾ß1ŒÌÔʇ8qóki<Êùú½H?gĹԛy[T ö„§o^5Ž73™ÉkÎ9¤¶DøCõ‰¤mbs”kÖÚ•’Å òR~s= ú7þ3)Šì ž÷R’Ôáø¸EAñµXô2a>o¬õuòiLüêþ©££¿¡ÐTŽjvñª¨Ö})LXÆÜ\Iœ¹éN,Ü”hž’w ý€{¥)?ÓýY²1 1x¯lè*ì®w1–Ì”£öéÅ)óSF­Øâýÿ úPÙ endstream endobj 98 0 obj << /Length1 1420 /Length2 5888 /Length3 0 /Length 6851 /Filter /FlateDecode >> stream xÚwT“ÛÒ6Ò "U¤JDàPšHï½WB ”$$¡…"HoJïMºÒ{¥ ˆR•R¤¨(½|±œ{ï¹ÿ¿Ö÷­¬•ì=óÌÌ~ö<ó®7¼×ŒL…•a(;¸ ‰‹€d€ªúúÚ`ļ¼fœ üo;€×ŽÁ"PH™ÿ@¨bàÁ¦Á€ú($PÇÝ‚¥dÀ7e@  tëo #Tƒx `@}  ÇxUQho ÂÁG¨ó÷È‚oݺyãW8PÙŽA@!H >çw%T„B\€¦((ŽóþG ~9G-#*êéé)qÅŠ 0 7€žœ#ÐŽ…c<à0àOÊ@ˆ+ü5/ÐÌýí0EÙãÂìA ,¡g¿],aq¿Úûs'ŒÚ?Ï¡Ž„¢`?gRLR Á` Þ‚$;I ˜0¼0¸×/ÍEE(!Hàì´Ga?-) Eºƒ‚ý´þ‘êŽÁŠÿ¡ðßû_Ç{Á¡€É T6Ø©&¸õ°J™ÝSxeHŽl+õð¶˜ðPÁ}J\·úˆÍb¼iVæ”î3É.°Æ}§v·Ãì¹÷;>˵\uÞûÂ\k\v±çûÆ|8¸'h›ˆžX&«\•)ÆtqFÑuP)ºMyi}ÿªéüàÉÇT¢qS'¤Õ ­£ª$S™ã–Åç&¸f»>³É]–¿r>º>Zо‘bέ+×vˆ÷¬¤[èíïâ|¨ãñpåO(Ž^]¶CM‚¢Òb&ïÒœbÍt;MF¥MXwé¼@òaÁ¶ãòö¦õ5þÄŽ›Ž¶‰öÑàÏø#Nzô “J*&756ÆEÒØ«p€µèLCh½š+ÿÈ鬢ë=5Ö9¼ðÃ]7EÛêmO0ÿ ýxù³²åÏ~õ¼/b<ìC‰[þªJ¦_VbÎØð³ÊëáqÉšÙç³³’Nul5S(š¹Üp›^\œÆ‘Za~I´þS/Eá}¼ÄYÞN[› ß”[e2†!¿P;ã›^ðäx ,úºšV­Š÷t]Ü÷­ôZ´ÖëuEú•ã[]%¿,¼§’re?Ýh Žai‰à.Ÿ^ê ß»ZF #*1È-=Þ d~Óƒj%x”FoâO7‰Ótžì™ÑeY‹‘v©Þ¼njb…ÉçßZR t$\•Aƒ§&â Í‚L}>mByÌ-Ë ·èCî+oõ— •hý„§ùÑöåbk‰| ¥È­§Ÿ27wÅØÙv2å/qYµÙpÛ£l.Sá°(˜?îy8@ѰmÉÍõ…•x¹!+ãÕd{uWk'œXÀ»ÛnöŒ6x^>ª¥°§æ·÷r:+®ûNÒ¥Ö/uÕ`§»A%—ÈÛÁvmÍ™:Ï ¾¶mŽ1Åv^zÞ Ú‚Zñœ¿ÕÜ&ºé}è`Lud5m Éã#{àÇ€>Ù°Ÿ¸„œLغÙ]$ðë;kH“…vN›¸Re­ 1Þ79.É!ÒxkPàQoZ†J¨é£y¬øÛÇsoܶ‹Oÿ†h¦„P„Hب/m0’1Ìœô ƒ·„†§èG/Ð~¶¬¯ëG£2ÕN2K#HÚ¼úíßkÕ[qY›©ï¿tJ7é‹ô:¡^^fÞ¦§ÒͺH/ãoÏÄ£kvs2²´®YÌ®5ÈÂ$òòÍ i'%en,{0]‡ê>œ™¿½Lq;º’Oã ¼R`<:ïÙ­q뱓ZÇh7éÒñ…(ÂßÄɇoØ77È}sÒýñh”ǹÉeŽ×fוǚ.íÖ’pWPîÊgˆÞÀ¶™£T³·F`ŸwŒlLÈ܈GãÙS>vf/[íÉC?~É-÷‰ÐÙä ïèôßκµÔ_´p|ðµ~^A1qj¹Î,÷C꫉gúè¢ ìj¼y ºMѲÆÉñ’…ÙûäKÓ%¿àÜ0ÜêÔí¼ î›Ûn¸àûc¿†ÕáDªPiRS“ÑÛIÞWä2±ubNI†÷[ƒZèx;.>6Ïj YðQ‹Í-«|ªêŠš_ ñ–ù=AO_}òqd–Pˆdˆ¤¸ï©VôM n¼ »ÔE²AÀî ß_Pj¯W¤D_DˆËrÔªt7+sÂON®öîî]$æ.×…®¯Ú» ?^ÿ0C Ër06½8ö.˜¼Žf$çI3â€ÔdI‹Ý—aÉjdï“»£9ì><‡Zh³V‘HñÛ`ô¹#p!°€€ Ùg›¡bÖPdq_bç\~‹ó &í¹‡÷t¥ã}Á—Zº“Õ¾÷v?܉ðd¬gÓßÌ¿!Xßé!é'ò¬ðVÑ•ªn)Hký%øõt¿X©§b~ºA ¯6UÌCÏ£)¦E‹¥:ü"@ÛÎ*ñá=g._<ãçnoÈ}ÔºSÕCêåÁð‚Ñ/`YC˜'ƒ;ÃŽé=ÞYÍØÄ'[Û{iÝ© ©+Ë™zÙ€u_¢|”\â(mw¾væÜIY0ÃÖa$ÌøYu Ñ'ÙÀ*cs®`U´ÝÚ%ÙÃNU¢[ðu> +þ(@ޣأ"Å!– Qä—Ô֛݊ ú{CJ˹wÄK%9%îG Ùƒ¸gÑø ¾Jɽ‹¯GJŽêÇ?PV Ïëݱ¸ûÌî³Äíl«Aû ³‚ú˜sM@͵ÛÝz±m ‡OzãÌSªö3–€úa.ÇfZ}È‘3ïŒ.¸yOÏùlˆ2éLf$*DœkÈך Xi¶¼ÊŽoœ5¨àKbKÔ7+Õ‡ŠˆÞ"–íÖ¾°ñVŸÈSÔ`þAT—˜Äå½½”—ÛB.'•7 ÆÓ¯ú¡––h­ ïñ´]’sBå;ÕÞ(¯w N_S¼òkL_¤’Üó®@^QlɶX{¨ÓÀzõˆ\ˆ«Ý’kÅŒŸ´O­`Hyo¯-8keÏ*O¬ÏÀ,>*ÀÛúýi]‚Û³ŠC~²ö{Âw¯E³^ÍÞÔéh p`Œ÷cë9%÷ó˜±Øéù‰* I:3|f97öÌ3<»É,ù#ü:»LÒûyæ6ÌzFŠqõ½ýW T+VMõ÷Ç[ã4S I—è{Þ„¯\\ù..øÞéºeg–Ú†ôZÏö¨ïvöµFÈùþÁȦ3¶õ)½Y›˜q²Ž6OCKrç>þ,Ì®&nkŒù:V,ñþöt$·n$—JÕ~¼b>Îõ÷R?ß|ÊazƒLüX1ˆ’zgBy¬{ÞÛ…ÿá’Þ…æ·¸ç¹\$[æ± _?¯Qu°–º*2ŸÄš1ÝŠVo&.´4tžJžxM[¥µŽ^e¹Ñ"¿ÊMy_púŠNtdôj°º“™O8b<dVd¡w:"ém©ë‹ÙYJùæ;Õ€£(pR­‡XÈWà'ŧ:Ì&tü[W­jÚêÏÆÅmO=rÏÐHLùE} Ëgû"ŸïãÖÒR׫ÊkÄðYãßã‚ ‰Âr¦R8p½K׬ís»ôÕH¢œ"íMæaN¬»i;c6p:õK¦8šBs¨äç7ª‹JQQÝ’t½^zjoÚ•S#œvq¾3¡êE}É´ïñZSãO~8ˆÌ­™šÈœFÌÄ<{;ü4KÓ9ÙôñX3GYEruGÝê©0IÙiãç½KkA%øÉ+1d´ #<…*ϨõˆE#c?É4©0ï'æÞóh²g Ý¥@ÖXÛ@@ün’ozK5³DÎ|1ÿú7•šSazçÖçÍÙ=ÉÎ…‹»'Ïu¯V¸FÍ*ÍÙ(ÿµú¾ãnËhå 8•똚IyLG Úà[Å·jòÛ3 Ê§Ò®ÊøÉ½O™¤°6Yîå4òáø’6ô|ë~Êå&VUÍ¢K ïrªuÍûÊu)¾JÑu(ÏŒõÚÚ.·9ɈR_!º[û8àü̼ˆWðXŠýÞ‡•ÕÅ„©8¹þ£h4‰Sy@GϺg'.DQ2‡¨(Ðy6–Ýøc øÂ¼°{àvíNK–Sˆ_àÞ+œ–êÅVÿÑÕ4Q€Úâ ðy?•Þµt1¤LîI%{ÛÆÛSßW">)Ъ0—CУüpþb橪”©B_ßp4qLÞm:Cóù¾ÓAŠiëxÔŸÅkhŸ Ì_™+'+ÃÍ›¬ 2\x@¼^Î×NUÓdn­²~îçì¯7¬ôéKÙ+šMù®û¥Ž6œ+3šTÒv£q‡JØûW½4ÏEâB)i7Y BÓïF}uª\Ò`2›i}Gsƒ²Äf2]uŒµO¬Ë/øpÏ5ê FU ­>  \' x©¾f·uCµÂm§“/ôô6ã¦v~FÏX*)æÅ½é†W_Ÿ<1£l=â[0°+hÅÏoÇ**3íÇU‡.“W?h¶$ÛG‡Ží8“ç õ)çrÑñOZë/³¾§§¥¢cÚŸ‰½X>»”ùqJ)äZrƒÿ²ÕèuiÙ‹žl×ï`I9sîoTÉ;¨~Ë‹« œU½©éð¨9õè5» 푊ü-ž=Šï½›,<‚Rq{Ç}ŽÚ½kAT\ð2ÙµK#–Ý"%0ÿÍ3zêâQÁœx¹¡0Æ QiñÌíbÜ`Seib9Ýú“CÁOoëù‰{™3X17ׯgŠÙ" uŽ÷e}ööÌš%Ò…vä¼z\l·5F·@Þæ¼¹Ð[ðz©í¨.ßT^hošÅwøÑ´|Õ~xò%Cl–µâ:MaiÚÙF·UU `<ê~êÝlnè¼@Kx#©ï`/}ØìÛzÛh,×âE7ÿ:~nxÃÕÇãÅ£Nœ`Îà÷t(‘ZZõ [<µ,ÎylN8#kC‚“·¸¸L£äh+õâáì—¶ $ʆ9ü¡Ø×öÕ¼ü3'è!µi-n1>²Tat$µî–U„ÝÒ®ø5ywõãõÄJþM59ÙZ§ª®þÆãùIí•#1,g^Ãü‰rC¨fÂÓÞHhØØ–÷‘ÐÙ¥›ãªî«ªä.F­U1ÉÏbb‡m“·™2]ÜÊùŬgÛÓ àìYºk‰ ZÎÏŠÅ#hpòÁwêû1©Û—˜.ÓÛù›žsÉëΞ+ª­ê²gdðÕ íDäcîñˆQñX½õš@‹·m~¼cþ¤Ì-ˆ¬^Ø6|z L]ž`.ÝÓÛŠDc/rѨî»8Û)!…veM⢑ÙñbÞoC+™ƒ'ü®>_Ó]ÿ kat½Tšm1:; ­.ÓæÙŸ•=̬e NÈé,ë”×Þ[(Öéµýö:ñ¶€‰×Ö\üz,I—•ä°È”cÉuÊ5-ÖœIP1´Þÿe3³NáťЦ­ÀB7Ræž>GoÝÙº3 Y¹;ç9ïB~øwún—6ÎSÑ3bÚO‹¸*·”»ì6Z{óëN–]Êx]ð» tˆ?öS‚š‘ª„î½†ÙíUEõëßM#IÜ‹Î×gsvã•Ls}u¨Îwµî‘²“3ùÝHñ0WT“HÞ².È8-øšôü[|ÙǹuÍw½ô/ȈÓÍxÖ´õ÷½£ˆÒ¥™%Dõ9}«Û¯çÈÛJ±õ“Åáh‡¤û¯"òÖÈå쎒2sš/–rXÂ…®ÊÊÓdjN?x€—¦»iŠAó…ÖðD8ï-¿QZ¢¬/J‚è„¿J¾Ât½¿î{’ºkWùñjõEœ^˜ôp5(¥?Ü÷íèF›áUy·w+tI8ªdÃâ|y¯šÂ–n²¨)šE6«Ýòç t§B)•#†·VB•ýYžÜ£^ô¾O{CÞË&úe©9ÙóÇóO¤ )ÜT¦–¤Cƒ?­¨‘=!Šã°z´ë­–8ÙNájYds=Þ. ržìë)@¯m»@[Þ‰€@|!=ØÂ":Yfhnñ>e%¾Uo¥_˜?Ž>%'!îHF‰î?Æ ³Q{Q'íì 2 ÞlØÒzksh,·ËöÀ4™]¨v—LÝÆ'k=ª‚9[¢o®¸y›ŒÈõ^]ô¢–ßÎô'ý¡ù–ɯêNóW<4ml·ò­°‚ø»«ÅÄ<™^zò’¥CÔÓ g˜!yÑjÚv>°†™Ÿºõ÷Vñ'óŦ¼|úMÞ1ùwT ©ìŽ–šŠb„¨”=/ëæ^9Êã2©òÕ¥–9],1aräg‡úý6lÖfáiþ¥zTrž({œBÞe,&>xIê+\Õ£# Þ­3#¥ÏùŠ÷'β}C¾‰Ro0Ðìf©´ÿƒ°Øë©# =í.I¯¤¹.7pÕt¿hrÔ9i,z™Ë‘Çïsn·"È,ï‹‹f¿I1tƒ\·ªêÞ`å,Z<‰ÊzÁ#‰O¸¹k°m§—tN×Ñ?À£$ƒú gJkae$têNúù:™~ ï).8| ×,¢ª›_š2µU½Hôð¦Ü,½€¹XήÆÕ4ÎTáÌ, mC9F¾IˆzñxÅ{}¢ÿþèðvknÙ€ƒ´®&“ÍWPíµÀ Ô.¾È2èÛàB¦—ܲUh›4E·¶µýÇ„©ç§§X·0³²6LJR˜©m½>Ë;‘]­iqÀ%‡gõz0…èˆ0b]Š ¥ññ{_M d¤Ÿä3ÿå@º^4Oi®8'°í½í)ùF”{`Ñ×9­„ÎÊ#Ê2§SÚ¦IÝ´pµwïe6HuÝ=l¶ÎÛµ½rAØ$—_¡Ppè˜j¤äsŸ˜d¸cëÚV‹¯¶ˆ¤ûK[c£üƒ‰‡¶ßŸ¦÷6¬óÿ 8HdIª½_4üI¾ÎI)©)h«øÆDC¿„f¡3àl|ÐaéѺÃ~jžIrFÔ&Ù¦…•4Ç}ÑíÚd°Òx7¹QÕ©t4ðt*ýÅÞ/µ~Írs0{¬~¹¡G»yKêðÆ‰¶ÙKž°˜³!ïŒÉ°¯ ´’шæÕs ¨c¶5‹ ßôüÎY™æWt†ë<×û")¯©É”EÑ…ð S0AX–2ô½Nûz¹môRŽ9^ÁeÂ&@[bÖ7½ø?·H ©+Œ¤[9DH=$9³±vr{j­õŒCA[‚‡ º_’Þ 5*)ÀE„§PÏF¯©²V°Ò’&?é pé§Ûê¾çÏj"t™Ç£•¬V˜6å:Oyæx´‘»á ¿øI͉YÜܯÀçV8MZòuó…uœ¯Žýp©ˆê?älŸ}Wv¥k¨p³×%ÑÂK|Ï,ëÙÅ}^=;<¹)~´N%;núé|áék$¢?~uY• RžÁ÷Qÿ~¤&̃ÂÀÇg“wJØ*z)[8U(§™A¥Ä1•®÷¨rÈ_-œcý' œ“¼MáÞPŸ“9¢D,1ŠÚc/ë*Ù`XÌ£¦ 3O{Åõø,x©ÎÈ·<¹Bÿa´ E‹.ì‡WùîÓ6eÉH80öRm×»ç[±}4{y—As8hÕà>©DS*⦑¾ƒ ‡×pöp,2]ÏcãSºYóá²÷øÛâIýZz}­±ŒÒ {ù|ëØ»÷|Ö{™Ük¥(HòY;ÈüBsi&S¼6§¿ÚüCâM– endstream endobj 100 0 obj << /Length1 2414 /Length2 20884 /Length3 0 /Length 22282 /Filter /FlateDecode >> stream xÚŒ÷P]ÛÒ ãîîlÜÝ%¸»»ÃÆÝÝ!· w‡àîÁÝÝ!hGι÷äÜïÿ«Þ«]Å^£»g9º{ε¡ QRe6s0J8Ø»2°02óDåUX˜ÌÌlŒÌ̬pjV®¶Àÿ˜á(4€Î.Vö¼ÿ u»¾ÛÄŒ]ßãäì2n¶6 '/ /33€•™™ç¿μ1cw+3€<#@ÆÁèG!êàèåleaéúNóßGµ) €…‡‡‹þ¯åa; ³•©±=@ÞØÕh÷Îhjl Pu0µºzýO j~KWWG^&&Fc;Fg z€‡•«%@ètvš~ (ÛÿVÆGP³´rùÛ®ê`îêaì ¼l­Lö.ï+Üì̀΀wr€ª´@Ñhÿw°Üßô€ÿÔÀÂÈòOºÿ¬þÈÊþ¯ÅƦ¦vŽÆö^Vös+[ @QBŽÑÕÓ•`loö;ÐØÖÅá}½±»±•­±É{À_;7H+ŒßþGž‹©³•£« £‹•ío‰L¿Ó¼WYÜÞLÔÁÎhïê÷{bVÎ@Ó÷²{1ýÝY{{Ÿÿs+{3óß"ÌÜ™Ôí­œÜ€Òbÿ y7Áý±Y]ÌÌÌ\Ë@õŸÑ×cæ`6}ÿÃòÿùüµäÿßÜÿÎòÿ6úÿwCn¶¶¹©ÿòÿÿ¸í¬l½þð>Ên®ïÇBÞáýpØÿßPMàßGYhfåf÷½Ò®ÆïÇCØÞÂöŸ2Z¹HXyÍ”¬\M-ÿž¡ÿvá=½­•=PÉÁÅê÷e`xoØÿñ½8S›÷ Åå½W¹€ïçé)ÅíMÌ~ü®ŒÓ¿à»ð•…å]¥ËŸ²ýF@÷•ã=Üåýšÿ³àâáû½Èäjé üW£ß÷ëêáð¯ï•rû|¯”û¿à»zuù}õ¿ÈXßÓ{ý ¾WÆûØ÷LÞ@ç¿©þçn1us~/ë_·ÿûÅó_ü×ôšÂ-Í;˜ò…Z׆¶=T ã{0ìM|˜¡ØÓL£aðYrnw{B‚þLSõ%xÃùNøópÊêŽ8õ­Ð2ñ‹ÏIs=ôÇ–$åÖ_¾Ï† *Ó{­p‹SX“ù'Âuý„° jBû¾/N¾A6àÍ 2ߜܸ‘”rÑ<ú$=ëúKWÆÂç÷”÷«8eáŸK0ĨGëÍRä˜dÍáB¹2ÂТ]z"ÏÞÞÍ }|#–I ƒó;a+ðÑÙd}œó^+WcuéÂ%ÇÕÁ!¿E›¦ô9L‘Á^ð).XXôlæ/ þŠHŸºÊ€ÂxÈšYe¥eߨ[ã>¶ÔÁ²ûí3 ” }7©¦¤ÃЙT³ªÕ0 ݵ†ÍHxØa.²Öv§ÑmnJ°Ìó£î 0‹¨myØÔíó«Þimxd€á><µåa¸qd§ÛO³H°_Àƒ…VÜR7ru…7“0²Ôu¬K(B¿ìþ™ûÒ8Œß'øJä e;Ÿ™Y‡²tŒàœã›ïU¬_EÃ¥BÇæ,ê‚­š~È[§Â›Igêåe>®%›¸Ñ—pêœLñîO9ëqTÊ|µÀ†ÙR¦ËÍ ,F±/b¹ÄmŽÅ«AòviÉÞ½…ÊáH½`/ëGž<Æs õÖxŽž;³Ãí»²2Ì#ÇË ‘áØ-5®ÐœO*_»\Ó%…£À ïwæzaMÈÎÔDÜIìã5Õ><íŒw>{ЗJ‹QP,É÷Ëñô]Ò_+èÅ­ÂútÛÈZÛ®ø@ ‚ðe-–âËþ 8™aûp£ÆÕ+ž¾ªÚC.™÷&HïÂñ’ÑérÛ ½"ö¾&Gt:¸m%ÉÂN`ÆÍÆêèÈWóȦuuáúe‚šÌÙàÆéЄt;3†ÀÄ© ¿„ê˺\ÆÛ|R¶õ¶w–Ðq\Ó‡J½ÚuŒ[þ°²z]Ú äb‚êǰSûÏœŸ¿þð”ÌQ¶,ÃψÄݵª¢˜OÎ&Y˜†“cÁ®ÑÍÎ@ý¹S@Cm¦ czˆ²Ã?G…1T—r¥‚®Ä&žCÊÀ[ƒJ…ºù:%Œ$ƒ\ŹÔW+*3"ãZ BÙëÃÏYG¤1Õ;Õu27/5‡ŸtÅT2‚$±`áA*Á‘çq¥Aî[õä Ì?q0‘ ?mäÿ?‹ˆ…¹Ä&ý¿õÈñqñËú°ååú·ÐŠ£@˜††êêLÁa\#Á®”,xñoºŸ;n¸=•øÙYæo>¸N>H,##òq¦77ù9˺±±ýÊP´ÊÀª—r­¨žñ»óÂ!šõ7%¢ÐÛpºÔkiÙgWdw'ÑÍ4¼—nÉ­¾¨«zÆØ7ÂcÞ ,»–—y”ÿªÍ\>çîù“<¯÷Ð sþê4œAʆûá<9K퇶,ãª,Îñ0M7=¶äˆ¬q„¨Žˆdv;¡× 5R¤,Ux/«"óŒFj%§´9¹í¯£§ò&†$ìMÝ.œ“YàøpÔà  ®ìØ%+…E²I•÷Ç{™1Ütz7ùrÖ>ïu·Äôog9i3Zi û{˦ßx:'Š7ûòd“±LipF'ï·ô.-¾ºVP –ìÄNöýüe¥vâÑž´ßFþÍLAO´)3bYñn~R¨@“Õ“øÛ‰DÎìGå¾Ã‰ÿ.‹SôÈ¡šŸOg$̉ÝÚ9ÞägS÷ƒ}ÓØ[ë[¬ú¥½€JÃAiËQd·Ã»s (lÞ$˜Å3˜’!/Îûà®åu¡bq(Žœ=‡êµe ÃÉLuU¶¤÷C1Ï1·!ªÄ]ê±—6égK…§úyŸ]E4R ¸œ»éœ&¤UCaå©üé±]ŸP£æ\xN~…ݪ óR$í“QÆ t_NÒF“ùmo–m;…’8k/‘†0ªˆÓ>)Ö9z©h¶pÞÆ}–-_¥Ïh<5YË¢¤½T")LHH(·Ê¢C"jwŸ6õ®¡æ%˜‰ðk€¬¯ƒ<¼!úüLª&êÆ+AB;¢×®üág`Ù·ƒö{c×lb!E–“¦,‰+âäïl^Ddé;¦Èòò S’ý:/kºàvåo-Þ“ÑP°h¶¥e¤=2•@ˆE ‘8M¿ šxˆUÕ¡+\úœ‹ õ¢ 4¬&¬‚öV‰˜AðÒv¥,ÆÃv9ˆé@ψBCÝ -TìÁ›ŸÊߪÕ”ÞnÝC¾=ÂGè_—ñBœ,“žš’ܰ®âC£èl}ð`îÊ÷óñ†BæØœlxRJÆîÓÞ¸ê㘆Õ_Ç1tÊXˆhKwcЪâäéMÃù|ÖJÇ`ƒ*”Ù°54øsÚÆ#fÑ*³7­èÛ¸¹Ëæ‰BN{ÃÃ,¾~Ðû°)D*±ù$+ñ –cò+-¡C#(Ö–ÚÖ¢²;kÙäGEÌIÓaé\ÊܨÞÖË£1»2 võ˜? ŒgÛI£ ©h¬èb`s–ëb›iäÐ ]‘wÏ;O —í«‹zYê Y[â® Ö%/ÉÅC.-gõJ™$¼h¿eoËéúQ6NB±áš_vïDi<_1VXgÄ=<)`ý‡m.åAÃöÞB=ÕÒˆæòÔ^eW.s,à3ƒÉ Öj釬I6^(÷`Ÿ·°TÁÜW6P8/ÆkÝožÍÛk®,Ân¥YŽÂ“Œºìyª‹¬&Ét¦×’üs Ž%ØXí|?i: ‘ÿn—£^¾‡'.šö¶$œÁ‡xåøêa&ÁWÃÕæɆû­Ë£@j"aÛFôés£Un7Æ7ºó%Ò§¾Kúïáúi 8‡ÖªožàCÌi.Á¨óC¸hš,ž“糇©‹W»„˜O ¯Û†eÔé,R}2oœÔ"G÷ënÄ,Âð„ô»ÅþbFgžOä˜öMÚ¢¢,O}®¥fBd÷ÅÜ S6 g£d«A¿ÍðåuÏ&ÙIÜG©œ4!Qà ÔÞ·=@^ßN:ÍÆÖv¯Ä³ÀsªãÂó”Êh§‚ñÔyYó‘W!¹àtÈeæv0¹‘XÊ<á‹¡æZ%+»Z‰­7ü>ù,«æz­ÇZØÀ©"É[Þ©báWô‘qÍ^Z 4ý5¦B#¯Òhå؈ád=åÏ=ø´¥«VjXW1‡ €;3à ^óð0$¢¢ÄQ>ئ0Œš:ßO/ˆö™±íá7MÃ,\”ÒÌȦõîª&f3)åø;!КmÑ|›ý3빟‡ûR¾Ó™O z{»‡oÖŠxWŽ|üþ“UÐ}¶  ìø¦ívác¯¨q 7î\¾\ÊÊG %h8˜®= Xm!/U}ÿ«°¯`é¶"óGåI°Ä)Yî$̇‘ÉÁkOç%âƺÁæJžìRaß0}¡5ŸëùV$‰æ1P´ÑIÙD~r,Ý<ï?lIé‘ΔéB=°¤L¤Ÿ™r(<ð”: °rɴмÜ4¸0ŸG~· þY≩Lä* [¹Í=ž$éÒßÄK¬BΣωAñdçUIcÕ€é>|dÝs§Y%×§"b@¨"blÛyâYgømA;‹·–C¾¨ bcÿ|ã"=¶µ¹? ø“u~ØfÿR‰ßºQòù‰¥&AàPéî¼²V39”ÔFÑò˜«t~ElÀÐã’6Á•Т=f™s ŠáÏSûÕ ÄÅçWaH9Dû”¨TAHÃu,ð ŒÄÿl¬8¾#¢ê©³bY‘ë—œÀ¾ïÝ«ÄU Mpɇ¶ÊŽ áxe¹34]áß³ ®™bø Uq© šoyw]!dj¬…Ž1<ËêBÄ©™%Gø&Z0W”ÀbK“mÔ¨š/³Qø²ùãðíwÝ‚\måDY’´úãx©pN }N? ‚w£¦¼YDUéºò”Xzý‰€Ã`ª¬ãðle2)òË#¡Ÿm©¯fÈaˆZ€ÃÊ{LvŽ ²\ š/ÀH_šÞ•ÅuãH©”ŠMæ™*v·u¿Îþ¾ƒÞŸÅPê€i’Ñí줂 $³ Ò0³Ú{Å3_qe)M Ä«šN‰~e~Y“ÖÇT…b¹ÝÌ´ Z"é*‡ËY–j3ìû«:¿zsä•´%Kæ¦øˆx bô!J¦±µA°¢Â„8×6¦©ñà¾$Àgõ†4‹IYÌEÙqÁtÆ ö\MÛgìXžš¯ªÊ™´I­\¶íã£L©"ã?XΨ¾ÆÓ˜OïJxg56 æîH›‚©JQ¦ð¿A¶%žCÝíA¸Ñƒ²$‚ ôv4jJÙúoŒ+„I¼¼Úvx¯fè0²MIò~â;üX;q°-Ó䞃T¤¿JG¾]мB%j)đΪŠóBØz6ZÝ}%”T“›a\^È€‘.`~dë  Z/O}å ÒXD¶b´0e¯íc½bÄæk æNXiÔB%mûí%`³†d¯þ9çvF©gäÔ'9J¼*íâÄ£ñ¡|Т剢 ¸QVãyæŽãÃB·›×*¹óuÊÚÍg78s?S§^:Žn/’—5ý¹¬'ü‡®S$uú Ð×o4ûV¼R×ß:ÃúV¨+ ŠAG„¯NSPXån‡›} ’¼[W}Þ!Ùa™R:zqêgî‹] DˆSÞ;8›£"1^ jÛMßÙ>àTjl ¶ÙaÈ$>`1̰…ÞZí,H ­Æ™O†¼Ø4©0ždÞ¾¸SÚ1¢Q«îôˆµŽ-Ùz=ãp%aå"hß΋ÖUôÛ5|¯’tã0”Ì„~hXb)ü…ìÊ= ÿº3¶} ·Éþ©†¥Â>Â𗘀Ÿ#ݾy©%9áSq?¨¾Ð…ü£Ñ¢ÁfIÙ;>Ž2¨|Á“Vˆ]ig§ áb6sáà mT+·òÀžµÝÞëöé‹ÓhÚÎ(G„b·w¼q1ËfDÐ*àk€$aWT„†Òxz šíãÒüáËíIÝÙ"·7ÕÙDÜPÔ>5Ùc-ò]‹á¤ïŠ!ºÛ`žQøNƒ!y^ÒÔ)omÖ(rE¥Ò]¦ ~¾–D]ä ÞbÛèê“=ñ­Ú1tí/å:¼}“ùý_X:¯l–€]øƒ FnB`x¾å§Ä˜ó«‡õËœøçLÙ^Ó¿ŒŒ/sÐ ‡#u«&"QŒ~tŒ‰gçõxàuCžá#äxï[]ˇb£ùYT ýÊ‹ÜóëðDÞ¿Ðü ¾gÿÑ%6ٞɩÊVP§Äû&êóZ”@Ó÷±#ƒÜ4åPÞ/ð Y#€Q}1EQJîùZç°K©`‹ûhë€Þó'ÚDÌùå‘­bó0º•¶ŽõÐlRؘ¥"uØ6ïé‹c‹qãÝØx·z‰oÓéü½èZO^kM¥åS`O´m`Cwoì‚Z¬ú=ñìÅRã¹™ ×ÝSNr@‡Ú/iêg7þ÷‰‰S\§4ù7éRöñÙ`-ÅÂ\¤G>bá*üL¬®/òýƒ?]ö ÙðHkýL4Ï+ù2 ¾ý6ùò‹}©PKü´(eˆñx‹¤kª—”VfE• ©kY›¨ †àòÂz‘òÇ’ð¡ ]Ù~Dgs+ Ú2Ú‡Û…œ=rN÷ZU<5mÔOd+8•r©oìEç‚™ “Tw§÷½Øf’róôtX.˜å’¯ù›LM%Nõ½Ãw –ÑýÈå:DåÞ¡b%®Bl÷@´ŒÌ¯‡ò‹BÖ4üš–F»òmo ¹Ãoþ[ÀÍ3 1™9ßÔ–-d¿é"QçÈ!ìµ!á¡Cxsœ°´¼Äd%?>ÈHÒ™6Ù»²‰µoH÷Ozx/÷³Ià„xàð|é°]¾Ç*1½¾`D)·YÎ7åþ—©4ª,e¶!>O²¦Xb¶bÕ1ÞRkÔ³Š&W™h&‘Å·ó/„ÎëA=¸žúÕÍPm4Û_»ôm³Á9:Ptr¦$øPè(‹©Ð­J"õj”»¥¯¥fÇNw ªñž -J\`(¼ÁC«ju¯1×ð—Ó´ZnjÎCµ³›7Kˆ5ZÆ­0.֩ѨBN3…Ù{ø½ÐÃGè(4‰cN‰‚þ¬º‡×†Q6x÷ÌÞ]²µýЃû¾èzöúª½Åa‡-áo˜éÙ®žíE¥•Ø0ø1TRY}…S^8=ô`õNà™wXÃðذÀ\!­4³ÖLƒ©Ï"&Ì›ú²÷ÀÕ°Û®Äsð±¥ü°[¥âñønäàgõ‚/O4•—è‘£˜N³¼›fÖdÍU«˜–ÐNƒð_Ú\š…ádÁ%¹âvH+|•§>‚í—>ít®½]|ÂýòúäæêUÑ# xÍKçìÚŠz„Ù.âæ/UáYû>à&ÌëÖ™5.&=Ë|Ñ[­Ã"ª ¸Æ2=]Æ |~Dö…uí°f™È>p~Ĭ욮|Å“qï¡—%ö…½®›ü¬±ÿ.í9S9´^wu_½[‹—"xyEДîŽb³öL¡uUD•ƒ'ü!¤»4¦4›´w¾ïKÅ¡ÚQÛÚ®I‰f? Ô u--9 Úªüá32:i'ÌCĹ¢WÛ»€¿ œÛ9•OØLZ߈)"ÈŽÁÊé­7j{<öùE–vf…ŽÓ¡„ VOVÇÄ0<ÎIãê>öÞ£~œªú7” wΰ‚>5¨Ú”Õ• Tt‹"ïò_49KͶ*ð„HR… ð*±dá+WEù(\WÇæÃZ™ ÷Uéš4»u›Ðsˆ'6R"d&3ÌpÄþ’ðâ|±¥DCé ©?$Ú0»~îš9<ƒ‘­r´·f'!”ð {tc˜NíX{{C!kjõ9zåÀ¨6bú?K§õõ'ù’f¥*upcPtBÛ ’Lã­W‡l®=}gÖ7ÊUïY€ìXËWÄû»Ç˜’ñÝ5ÇK—“f2„OˆŸÕ&³:ÇR0õÜÒæP1¦·XûðUÕùÀAý=BS¦‹P3ôi㎽YÙKLïïåØÉ¯XW$j ÊN<ø¶‹7¹hÊË {—˜¿aHOÝ\,ê„´Úš7§U­qt\lêž¹žûk|@i£\ÅË{ÅØ®eÓÈ|Ü׋Úqßç1=âòÜøõþËöâÀ+e¡^À/»¯ØÝÞWq@9¿jùÔlg÷i98{ ËÃÓžžù†z qr¿XÕº‰Z'F>/ÐÄç÷Ùçq‚6‹¢ü°ÎKÜœõà/?þÈÿª]<æ2³>3ª1.èUd‡ê1ùèâÁAÉ|¶ˆÛø „'^Š.fgÕÓm¯°+»¥QnªÞ:µ?¢'í‘Þ%o$|-eA-MŸðŒf«Q¯E‚Ù4©ø7B‡;˜ä\põ¶ÂÐ6ŠDøXÕò)BnOÖ×s­¦Ôð~Dv3‹ ýµ°#ù'nJ¼Ùý,„Ï¢ÁýÌ‹?}(Cj Ÿ8*ˆ4 ¾Ò¨4í;4ÆWàLÏ.ÎôAâõ£·XDàV±Jg쥠œçoS6-¿+;tɸ¦;Žu}  Áœ˜ÞÒ%ÐŽÕ'(XöZ(³iÆsÅÿ5°”7ø*M÷À¤¦4^‡YvM¦F‹!÷³G*9–' &=Øqt‘& ¨ÑlJ`T–lÑrõ#ze,\ùi|o)´ú<ØÁ ¦ÁšæÉP:4%(š\ÌÂ*v–ê"Æ¡Ç-Kt¯ps‘ðD'Ë׈ä‡ç¬É·'#Öá۾»§v(Þê|*Ùcbú“nò±›P7ñâæ²y½_‹7ô¤´`œ¢hŬ©R'‰‰ZÂæ8–êÜË|f,‰\u| ãØö­üÛŸ¨žÓê:ÍbÞ¨±šx6 ÊðÁѪ\(0ø2‚©1Ïž8Jû§¦Œ0sðÑYôx”ó¯ád•˜ËL /C«\â{;W±tÊl’¸‡Ë ²µèÑÁ\@ç‚´œdM¼{º‰î–5†M´‡»®²pp Qêã¯f,mˆ€m;*0„éKÜ0lù¿*‹reÛSôS)4Ks·¾ÆÞZ*è%D]®0µ’ÀBìd WY©e§b}ÇF"Çç)Jž›,mpŒ•6˜ß:â,Òa– !¨#¬wenh£+O埞͹SoEír ]S%P#ãUÁÄtŠnœo©ØeëS6Ál?­*»šÎ‚B-5=ù¥……ß×õJî#ìf4œ (Mwã73çöv¡« \Ž|¿óUi¤öB¯Ï¾ŸUí^è!DŽ]惹‰±]¤ÆøNÉÖs—•íúßømc|óÒ›;ç°Lüm‡]U9£=×xæ™4šÜceãñôÚàeΚ¸sp•Ž–š7'Œ`­ ‰‰XÞ¡qv´‹²AÂU á=еy”»ªð§# z4Ãêt1ÆæSq³BΘÞ&Í­(vðÊ…çùirœkÇCëÚ6@CVÉò$æ,3ÐÆ‘S‡‰:Pê)Ü&ï` ‡äÓ||‹ÑÎ1ÔyFÉ@qó]àO–†í!eWùrhGI÷­5­ œmØU:ï0ã¥a¦X¿b_& o›nôƒ7Í­§‰×_…¯½Âèf 5ðö Z(ftKÛ_íì‰{¥öqïåås‰LÕ¦40·”W*æ«Oƒªã™à Ÿ—­öãhŠÅ:E†¶ÞÄ„ëÍ£e ã[³%¿š•ËVäö;d S§( ùgÁ%Ð=¿vh~ּЊVÞè¥Cm=Ÿ·kݼåÀ¡PúéOGB †ì€ ž§;CS•, 2‰]$`ö‹½Oõ&ûtÀÛRæ€2Èn:Õ ÖÿTè:¶ÀUÁɰ÷ lŽXœ6ÈZùä†Çà´|µrÁ|‚“e MÁA5œã¬¡ì|W0¾ ¡BÍ™,ààÇFèÇøé™³  È¡tàÍœ8#ÂÇœx˜%”µ:"YÙóЬîoL|- ⯠g|°¯6]¸‹õÇå¡]™XgñÊ1´~ߤ¶óU{(~ñ×±«,ΠäÖO^äD'¨™f´NTÕÑò»6ÏÎâû¶¸íîêÅ=bôÒ‰?ÊÔJÌ$°Ï>’—õ¸xÑiž£^œ»¨¤[faC&ô l)º EÜóëŬ³âu{q ]hŽËo<°ZÈ^ýê™K¥PjÉîH."»ENµn(ÇdÊ¡µ©4| ZÞ§èiþ‚©rêAÞ©a-¨›Qjó°å½·í—1À‚]Áà„³sÐ-O•«¹Çó®›q ”ž”ý¢îJ¸Ï Å̯"™8ãÿÐ×Yœ»yœWÉ'ì°ÔÌrŠAÈ3~±KQ¼w{Ëõà[•1TZþ|!ˆœ ÄÿÁ1Ës¡\‰Õ!~ìB~ŠÒ¢ÓvfE¤|¹ìuaÔ‚ Êðˆ­®—«VÒ‘ýÓ¡¢U¿0"þI¤çsă†xõºäô¡fMLöGúÓ‚Y3ÈȦó}þdêÝ –üôé ‚Ä#îßrcɧH…^[=ù7Ï D’¾ÕJ¨ÿ©6®.sšþc¬]ÌÕ·ÂêÚìï×òÙG9w1Sº¾Ö‚’!ª´ ÒµÜéVηáOÝ àg”^:~þô¹€õórEQé|™Šjä›Ôï÷ÁòãX©²02©ºd5€®£į̂3¶¸PÁbvâÏ~Qåôüªu‰½E$Üi*廤B¥RÂð˜Qt‹¢èq†$˜ ð8bœƒÙ'ãâ?ÒàýE4 y@ï.ÂÅ0ÛnØó¥_™“RN3íŠP–’èê”x=¯—YnØ_ÊžƒÂ§‚âtž'f‰r*´(HoÛœù .¦³÷Kì1dü·ÐFU½ÈŒgÈ·:âÚº‡ köÃMj«Oor©:#£Þ‘:ô¨Kð.ÆÇÝ“ ýò4J9ýlH‡•ñ-äºðÙ¯šRìaX_× ý*å´‚¿uWÐMÇâ†ÞeÝuXð×(`ì±d†Úé”ã6´AlÈ£åt84ÑqVyŒL«¯í\ kÔjh ahÏ;+@¡H\Õj/J1äœl›r,#’—^ßK¬o©iĉÑUJ¶Ç6ŽÄm÷?}(yê&¼l*È8úå?NâÍñCñïçq¬Vȼècb(‹~J¿þÒCd¼-³Ðr7IŸgþ™Fï äüu8r·.º39•xUÁÞ.‡ ¦‡E|Îa­dà^g̈åÉ€…¿dt*Èö.×jEIêüîö0^À^¹aPÆ*$‰)’$õTÌšÏù(YN´å«õ«µ mˬ%ÛùDXYö¥P³ŠÌš‚=bоyÓk&Ž~_ZAds(%ô_R ­ÆÑþ’'‡ì…úGe\hø› 35åe 8Vz·B6¼{>I¾8/ëç^›'¤±Zfv½þÏH~m$ÖuÚd3âË[w ¼&6ÜÝŸt4›,f§ö—@#ÎõFw‰z 8çm§ð F-«N±"90:Ÿ‰©Íf>ÌtáÁÙ›Ù Î9B!sãX H¹”讬WZ´ø}o« ¿ÒWýæÖA/fÙ Y¢šBþ#Oå»´2³gbŒîº  rU{§Ñ—¨Ýx"1X°#±Y–ˆRnáuÛ¥_*äÇõ6Îo3\ó ÇH§Ë]åCݵZGßQgÍ©½ HºÕ'Ò–ã‰aKø4aKžÞcN ÙÖ›«Ûc_¢Bi,…”ªäµ,ÖIô¯Ë'’ ÁYöžæ*ê5Ù£Ÿš—3’¦¨Ä>7r€lLz¾„Kâ)BPú¿#ñʺ«îµÕ¯™QOH=_†'ÓZrpÀg£WûÈswbÛb»¨Z@±à*¬Ì‰7G ZÔ¸;V˜=ç9Ü¡nÂP¡_Oaئ/ŠŸß—–y Ïžª9Öc½†|ჳõÀ˜<†QbHJÞY^^yšéLJ¾)wQ4ÙÛÈÁB÷—ó./ݬ=µ×>`B¶î¢ïãd ûx‹¬yÍCÁEñæF¾µ±oÊ‹WñÌj'ûÉÐ÷c j¢ÆŒùÆé)šyÙmüÔ‚V«ò‘"¿t!&÷ís_ÀXšëŠgwq?œŽOðGÀ¹0:‡‡±ïgC5)wƒ"yá© ¨æ&§N’{|ã©>—øÈG¹±.ðÙñ¬VŠm\W‹ÀÚÂöóåŽ}L(öàMc¼2Äõ±,ÜÃŽýtø{›^DåŸ(Ÿ}6%üVANNÏ+?à =ëÂÆ¶hàZ#ƒºàq¼á´pÊLIÞJ‘ Þ” šãº¼%­ŒG¹ú µ{‹Ëx°Š;–;Û–ÕRáàòòìÇÐàâšyEYLz^jŒžÉ¯ƒæ>æ;ÔßÄo]Ø\˜ÔŒ$Œ¯†¬Â2’´Mœâê­gŠ˜¿;R0 Y‘{(^Æ‚ƒ¦}zšc±n„ìýÒÕÌ_»YšW+•)n«7ûHèN*Žƒ„‹e„p‡r/çVáSÇ_1Ÿ,ñ˜@òxF*¡Îmƒ· !6ÌÉ€HâÝõÌüQ‡ç™°à_Z E®”mßvˆ_!±Öd%£ûWÆÏeƒ§µ ©Z•»[Âc ÷[jò÷ž˜­2¡B|³ qNT Pf éûŠóf>ÀkåP-AàRÁ‚ eHwУEãM„-¿–U‘IìZÍ¢¿)S A!äÀÊûEOß…áºãsr–«¸£l0‡òO10v¨—õ(ÈÆ6KÂÃÙ>ò&'ƦòH×½Ñ&öñd?sèÑ )D{Žû7-àNaTËßú_±er–?t³åÔíºëR£Càò[ X,¸°~ÓO•ÄPh^»(—Áb³ÜT¥îYûþñ§†kw‚I_K‰-l–×¢ µOJlô×Êt–…ãæ´CZÖ“p~ÚÛ+D¶‡b*Ø¡Ú$(ÚÓ~FwMøÒÙºØ\¡±2Y$××ûMùaý‹†`*/ÂÃ΋YΗæzb"=î7RáŠ6aø½Oá¶+ø7ø t,:b)–Ç•ê9¬G™Ð?ÜÕTÃW”0KëïÙs6lÂ:œ„Aéã·–àx; 4Yzù¦‚S|°ÝÌÜÁ©zúžyìâ°fÉ;ñû%w×ÕpÎ`büL_NŒ ÷´ž1kù¨:*éyÛYü”mƒÆ“ùa?Ù¡å°áH?_åë!äõxÌШ˜9‡µxZ ·ë_;gÁÔ7ášCö„ÓÆ-%ˆxòbûkÑ ?yZ/èÐÐ_Ñ.ÔöÒp7EßõÑ%Î] ²­M_qß-ÔUÞ•¬»~¤Y¡tùÊ:¯·V½©Xþsv[\3ÚØ#Œá[öÍã¸`©ôà­;`V « çÝñJš `¬á,yè–Š¨“Õóe¦ö—Mž™dGœœbxbŠž•›©ì: ÑlgžEÜkÎCÄØ²¾M4é,fcã±mSv¶éà!1“F.u$Î#yu /;ùëd±-øúRêEÈ’,F3Lñ/í¶dgz8ψÎÀyìØX´’©ä0BáIlˆ3)÷©"`˜ t嵑…‚h棪,$Z{ÝPYÎø<±Ô NV×X‚9’|*±#¦01ªìKÍaûàC{ñA¥Áa©Èp,RsÁ´<¡jþñ?Q?k¹û—¨æéÏorw„•¢øù‘³Œt ÿZ:Êéáio±4¡qc£ÿÈõ6*È#>šTRÕSÉõ‚Ÿéw¥ª•`óL©œºNÐ:EË=GºRËMÍÆÕ–ÓÜbOƒ¼–|‹p¤n"Öùƒ@ÝusÓ›Æ`“FÉê©#ÊË3¢}–a=Ð÷ÅoCs¡/‹De/üN„+Ó5ÃP ¢û¦Jº6Eƒf­;;h§VUöœ8$JÈCç†áéæ†çŠ»…WÝûXQé­¥L6xï}À›{Lç“‘‹2Z2Öt &s“;jÈ ÷©úü+yÉú™Îîy=.´$Kbq³\ ‡9‘š·´~ b“¶fÉgLFLê&gy£ZNW“¢®À®º9VÇ%‘&ÚßDÆþJ¨úƒb,¹Ð ioÁ˜ÌFýÀè1âÆ;"ÙQþ¾ÑV(¼Ë}f/ð»ÿåü£Ô¤ºñg”°ÌþÚcˆì_ЂÞa”3¹ý¤1Ÿ‚ŸÀdéHÚx£M5ý°mOC?[‰QE·A#Iöå6n{ ^6>Ç \N)¼å†U/ê6q¦Œ^1ë\v’]eiÝÆWÅoU‰žÓGlÄÒo^wFÝËo¶ðÏd!ë´c}0¢(zó[VK¶Ä:¹ˆE#¾³Ùè€W´´àò¥S¿Eÿ®fq˜_´j¶4?Ûà$-¨ÒhQ¥÷‰ãê%)¹{ðȪ y¥×0ô‘6ÜxÂ^$Ëà@úîCúsŒ[J$U\\°_ü — TC£;Î"çû¿ºÓýñâh‚)YµŠ/9±£ƒ³¿«§ ›÷ˆ\ifÓÙd¹j»ô=—!Í™Š ÷&R6'8 ÅÀ’¸ô·ºø¥7!¬4H$SÑ«%ÛžŒ $S:ûÖzE_AX¨L¶#[¡Ì$0Sƒš ­Hƒ€ÏsQ 'žvŸé+ÀƯ¯0\ü›RìâÁBììq<±PÑ‚\”¹½NV éu¤ÌÓoŽ˜¾'eÙ5gaé—‡ÃvÞ÷ÿ—n§7dqpE÷¶¿ôóùKÉà…y]û§ÛâµÕ“uúÁð~E$s²té¥dä¾¢ˆf†Í,œd2¼ˆ} \<ôn=ß³j¼Qê:’ÇùðŒ³…Oªùæç>3ìw‹s¨ÌtL±‡Wšç{OÐóyì¥ Ü Em>ŶÆíf4å-1áæh]á©~¢EBRJà6ãOÄ¡<#t¹rDß4nÃÀ¦—ë´!€®å??×»œòÕ%â÷I¨f?º˜^A×Y=÷̵Tj(—pi¨Œ<È~÷$Ü¥7Ç£Ny °5G ²?Ü—£6KêûQ°’½Øb¬8eèÏÀ8SÇ¡Èzú@z8âLDÈN¹ˆ$`æéÞ°™ç,F¬ÎS +:ÿɤ…G“b#Q­éêì Jr3¦Àˆ#…ì‡;åÁ0J‘ô†I}B<6˜<¦rÎ#•'y ,ª\ ›Ú÷À"·DKÌ;»DžHoQï“úaÄö@® ªþvmÏÖ$€#eù%õ ­©î†cðâ¹aŠjˆÚ”ÖCJ£öð®&)1¤Ãi ÇíŠ]5âÑ8žÉkÞQÃç[¬Êö¸èF3'o”Û†}?Å|E€JFä–a+غH-cò©ÝÓžSß[š£\„þœ˜g*ö¹ê¤8KÆ´æLÅÅ· ð²ÖáküZñ7fØýbäÕÇ`ÆhËÈ3,᜚ù•0W>Í€ó/¼üß{)u‚ºýÇè„[Àêo:6¿r%]°ÀÚÉÕqz®YðapºŽª®ðˆ¶0];ˆåË(ÍìëîÛõÌS]2ðø7•H¡\h\OJÿÒw¿.ƒH© TFõ&­¸Õû(õT¹L®Òž™4ÒÈ_=üpðç¡Ê)½Ü·¦l1þdA»ñLšj[~.­˜ÝCJi-ÆuòƒqÏE†_kò;§ç¯UÝŽ Ÿ‰ä¡Õ„hvÆb.²W®¨F:<‘Ì*9 ÄB)¬jýÂÍj©eå…¯¢‹.[õuZ;- bÚ± œ@©!•õ˜ì“m•×5ðÅ(«ˆ@íA:¡z*÷Jò/R¦Ç;5£¹Äÿþ¡G’ÐQ!C ¦f¬Cº@ø »d}âfº]ßERs04h½âà6a?>€‘Jç/ ³#L§"þ3wù+yY5:+¹²NÈU#ïmc®!ö‘* èÞè¦ 4¥7ÔwŒWÎ~ ÇMmŸ˜ ^© Œ¬ÜF)Ö8ѧ} v!–Çé²Å”E¿î£²ù3P­?^û^&š©ÇXô¯ˆ…’}>å>³Y*a9¢&0™„êžx”\l³G¢ "Xåì‹_ÄæJ5ªådý¢^U}hÌœ=iNš*U@ÆF×5ÌøCV·Ûn<ö£ùQÿ—½þ^øêé á…Ä?T.¸¦8ݹ]hYºÞØ-~È`FqìOœ ÈÔuwõ?Æ´Y3:3} JëþÄå#{ƒH†žÍO…üÓqëÚôþgC°0 VhÆ;t!§/@m¦À\¦äSùc4‚O|vF­¬µ–P8ìfÌøf³Š2?#†JçìT”àŽÂŒ½xÄðnžÿì(Wuò&F·:[Ê™AÉyðÊZâ$Nwè}(àUr׬PIþK ´ù<§_ò¹–ÉFú [ŽW?\§.ªœÌßb97œ“µ (õ–y6-³MoiXË­”ñ| Ù[Á¬]w.ÃI„­3kVŠÍ,R$c‰*¿ÙÍËN‘áÈc"Úi×î˜HrJhÝ7ˆ±·%?¥¡#†¬Pєڊ­ûÇIë. sÕƒ¨ÓgׄÇö{Ý„6p*×çÔuvŸï… ˆµ'ŽÓs©«·xhˆc7ó=K¶è*ÐŽ»Pˆ_7ƒ+„!y.¨N§Ì¨R{Ÿ©/ ˆ\V¤s×=`Ò»¢{k¦=HòäMD& Ô«³n¯\…X-lk ±àU·µî¥ÜÑJü$áUX#ˆ\áÅ .Zÿ¨q/KªÃ„nnÈí-…‘‰adÅŠz1ŠÕµªYh…FÓTc3ï"SR6AiM`žòôAŒ¹ƒs7q6׌º/àÖÆ§‰ß›X‚;¼vã1VÐËU¬ÜÖì¾ -;¾$‚¢Èà&>ÎÅj]ƒÕg4*Šë®†$¯—i-R&NPn”݉ê™Êí‚Òl\ lè'úlkL£t;Ä,X|Ž)âbY*ÜùÿH»8ˆ‚º…ÐB¦á?S3…¥ÁgÕAu7,õ‘8l"HþŒ%LºûpÀV&è+²²ÔçQÔ£7AÙHÃMOûéüׂÁ³ ¥ç{Aг&S7àäSCŸ`èESüíÄÁ·Îô#¦|p-q‚1¼{ ÖmgèÇØBÑî¡3ÖÍm—‰ûtΛûDÍ¡-tnA¥ð®Úþ3=Hl7ÎëÍI³þ‹Ó‚3@Oô—ØyŒ%ãjÈ!‡1‰:ò©P${zj¬ÀeK­ÑQ3ò~ùm]EÔ¢n•Õí,V³N­r2‘7Jƃ"‘?ÑêØ—~¤5:;lÈ0P´wIwf؉[zzµ×ñ};Ì=†äO£Æ™{‘‚§É„¡Å5^ÇG†ç ŒZòNI<Ë1ÂûÉëß«ÝXê£(Ø<¿§#ƒ{B[ÍuTâ@8N²¸cX9‡Õ3U&¿‰ëò1ôÆBì+Ùeç7|UŠi÷8ùþÓòpȼÒ®ygóA_zÿ‡¾URÕ„s» Ä Š§¯LÃ^åî>å÷Ãü:øàЬZ2\‚G]¬ 75¢C7OÆ^'ÌÕCò ÷™3'Yÿ5Búþˆ¯'%à2‰w)ÛŠ ìŒ%¯²'©¥£’ÒÞFò‹í5XݱúÛë×”Ú‘ˆû.<^Jn óÕ…Ê,«q½‹êbxí<ÇW‚'ãÐ÷¯óÿOW¨êÆ,÷ñÕé¨|å Ϊ*«èg³Õ€ƒ œµrIu±ª¢¹3ÚÇL˜%å5%Ê(ޝxm%^bE.õ~†ÖÒÐâæê5,?u«m8É÷m#7g\²ý®AÔ–àÚáé#QŸ±Å¥˜WŠ‚v|§Q@¦µ«âszÈÙÓ! #2Ÿ‡)!K„IáÁTÞ(‚$4B kél-ZN°Äú5rèd`,Z!Œ©E­Q¶½:r®úÌÇQ© êL¼µ')ƒ‘rOÂ|ÃÅðSü9œ'‰ÅÉçηLïˆw&Tð vKÖÈ—‘eÕÑ÷øÿÅZÖ%^žù@qas¨‰¶rqÙ으Ê3³½.)R±L—-!ÇøOn¹Á4ÇEC‚ä¾ÿCµ‰¶²ÄT02JOsœŒs Ö/u¹GJ¬¨6ôèÇDŠsó×! t¸û‹&Œi”|oNyÞg—qUBëLÃön#BQ3Y*Þêkñ!ád¹ª\J#lPÿîÆkkåþ¿ð6/”’È( ÿ‚è:»:~¼×üñ^4]öáÜE|®`lï;Mù"âr¡×!«ÿ­1«½9º •×˃6ÈåÎÉDèf…Oû ‡N´SدqÖh« ¡Ûûýâ3‡—ùUÔ­È7sßYe3M¾¶ÜŸë*w‰Yp¾ÂÚCµ³ïÙÆ ÿ¶…„rqUágM¼ä¢þ\ZÈÉÝõ}$P¸Ä줺^XÍX:Ð%éù¸ê}ëß/áhTfxŸ¶fHé4ç³±®”g,nvmÒ‰*wˆ•x÷G­ÃûÐ}ieöFÕÌÎû0S4ã.Á…MØÿŒø(2h,H¿/a=ü­yÁçÚú®A R¼Ëþ±Ý5C*;‡5£èbdô‚sõ>ûDÓÁSÏyÃË­c3&œ^=ÅËõPm\ÉQ•°Z9(• Rf!78.ª§îа“Á¦á$7®´µ¯ÊØû ÕBL¿E ‘ÜãHŸ£"ùh[Ì…æcÅÐHãVª&›Ÿ¾Ý¨ YÍÄDŽ$"I ùì¤íb `-Kà»ôŒ‚“‚í(Iñ‚ü¼ùG~âa"‡§ÔÚ¤AãF…:oï`†íîïyðô_ÈÕÒÞß…‚A…Ó ÕX³ •Ëà­ë|‰Å¾ÊŸC.è–ëoH š/ÁÅ%Ÿw¨öCÞ¼áß½6«±Þ™0å´¶§†vHfIé Öêe¸çqWèÇ‹øX)oz·)¬{€Ë‚‰¼^î¹ûlík¾)ÍÀ)ÖWV |ë£ý¡‹–¡H†’‘žÑiZ/²ˆ ûB7 eXð×-´W3œü¿p}‡÷{;Òa¸¼N Iã*œŠI…'y¦a³[ßÂLÑž¿p~Ž;ô”Æo>`LÓ¢eé^ ìÆ/:ØïcàŠ?‹Å僥ÄÚöÀÉŽfé¡ †vHd¾5 È&)ÚþI œ©=€¹á·#¡`` ’. ¬«ç—;Ù=ßA#׆äd(’YØx#““÷_¿wñï úg=ÑçÓÜšÈÄyxãÖSØ*;Øg9íw’dñ wÌcŽ£_7éàZig‚fÂ’áœmø-£åÒ3}`hQn›&wnM„4åp”—ÄójWß!}ÞMó.•,³i;íȆ’Ù7]F5"O_U¯Üïs‚LÁbã^8ÿËÛ3DëßЈâ¤>VŸ½Éè r¥p‡ +ÿ8hTÎ8FòÚâ¶;‹÷ÚŽqñ7BT‰MWÅ©x—ñ ^nå•ölõ1í3§„à@1B)@Péĺq”íýÈDo8ñ I‡Jr=¬mtBÂ?-ü cCOzÄr+;Ìõ©| …ÀJîе ìþ¼ÈHz˜€À|¬±ÀNÕµ˜ÿ\bþP¬kWŽåQIõ¬AŸ:s&Qá¾4ÂÜ.}M'oYØ}~­ºps„9'ˆ„d¬xùË-ÐX9 £Õ(ûµÿÀrxjmùú(—š&þ«’J5qŒƒõ•%ŒÂ_1eHŠÆÄ#t•’ý»eL \Ì&AaW o ež‰6=\K€MžûØèåW” ÅA†YÅŽõ7* DôPØ…Fjç^i¬Èæmæsv-Ý}P›•µõÐðÞy¤ñºâ]I‹S}»㊟é ü.®øCqD.£¾Ç[ÕfÔ½Ý9(r"¿:’Ž qCU¤à€f Üñ<7üÏ>Þçí|ö#äøÉ»Mc ˜©ûõÇÍ`Çz¿ë¦çN5„××a¯m®ä’ù Ù¡fþêõ´í/Aáe_8Û/LaÂ_­ “`õw€‡XêEžNŸLW/—X!§Tç¡]Ï?%x*qCÅünzÇËpÓå"@.*¢ÖzË7<‡À|¾­ù˜ÚɃBy)¨Õñ|ÏÎT FàLC½ýNöÃf—ŃZ/Eá@ï>ס{ó†ÒçØ¬E<°ûv Äw äŒ%õÇù±$V¥¿¸Zñ£Œ3¾¡¿ v¤Â¾Ò`¾­€ýÁn¢zÄw!sa†…´žÿȼÛ÷Ÿiè×9½¢ŽP¬ºÛA-Iþì{uûÛþSÝÞe-MµH_²ò·0r§L#c Ëd\ð7÷‹ŒL¸²:l\ÁVGž\^„HǨò_"ѽ÷ßË¿GÈß$å˜ ô¤{þ?Âf@å¬?ö^‚ñ_žt-7º »É\襘é«#ÆÑ]쾜é{ä7`Z_-:¿[×QLÈ+ÀçÃv(C åÇõºI(íš^©éxùy éÉÍX>ÙÓæ$qq/±].=ãÊ]‹Ô­XÞÖþÉöYÑ”ýÀÜáõ˜Ø†+_Ú·È*ÃGýsd5äÿã^5pü¾<Ägÿçi)qÿÂeÙ·š¥w-¡ù*”ìGü¡…ÌúÜŠt„;¡Òׄ¨¨dœ`t¬ïO94¸5¯ç3Ùí(BʹÙNÇ[ž¥¨Á€ˆU ƒ†HüŽ®½Ã %›(ŽÒ¾šêí:;Ó™ë‡öíÁÔS\Ü?ín¬=VcÁ•5rWsÄïS”Û¯rÖo<üú/Ù\@U–X4ø™Àâ †Â:”œ±±‰L«ÙT8MEÔYQ”†ÅBA^â*ˆèËëd ¶6ÞÞ\jf-¦çn“ú`là8{Øc.áíé´Eg ù1¯}ºáÛ+ í¼Ø¯S€lÍ%©sþy’ܨÔóÈô”2+*Ð<±Ê:£d!©Ð«ݲ Im«8¼q˜÷Á¤#+žÔx¢\Ç?-4– 97Në–•òÆã¹"–_¥ãc=ôŠ$B"õ¥©ù(3‚ÛTÒÒ²ÿZ®D4lªÒÆÞ®îIYfE·?nûŽÏˆKƒ|þô´ät*}t‰[Ä}jÚŸG´ŽùÐãô¹,Ë:ÎHËÁ P/aã>û”#öÒÒÛΪû½î}Û“Y*‚›ç½Ä³º½%qó‡KM@6ŠÙœ ¼Êÿðd̪]H#ÊœþŸPãÕ±IN~Ûɺ†9çÅXE£Çè€ôW?õtaxûä{* -*j4²†åâȦ´ÆUš˜’Ïyÿƒ3J[®Pù K¨ uêîN¹ôå*€èd7h¨"¾ôh˜É¦²58×®˜QÄ6:NòÏ.Ö(ï*– •Wj&'”ÚžÌJƒ¹è­øý³Ù)º• ZÃú]%¯Ñ»û³ýÞECf¸fѤØeJBöË$ÿ^'›Û€IL>$d}äá Ë,xùg¼ð…ïPÄœ™uK7Ùo²…€J®Kk§—F †Q¥á‚ÎîRãÄ 0lÈú_¬¤³öz¤C‰$3ÄÙ]hÔÝjyqëÀlnaÔû>É€ø»|ÝŸÓÏ\wT E‘ù¯·M“ÿ‰\¸¯Šô¾!¿ŒãDìòžô‹ÂƒnðˆÛ?VÇdDN2ÿ¿¼ÞêÓú¸Åå_>Þ8Np³à>¿×@Ðù?¬:bõY`kk²¯NÂg¬B1î"2Ú:G”ØCckÕ 1_)1* C¼XÞÍÐ0;JÁó%3dOáãV¾6‰3o¨¸a¹\ ØkïHc ÇøÄ.÷†zJñgYê¾;´µšµÇÕhá{ÁY[¡]Gˆg¼™QÀøîŒd|ýÚ½§/„Ë(w¤YÝÑuˆáqñæ,Ã… ¡Ê0lÌÆl‰[e}û‹²þ»ˆS»C#ké¦ÂÜõaœ‚åL Qª¦Ò‰|_«ìnª}ÓÈŸ³jÇ_wîwŒ_}$9.½ÙpÖ¡iŽ>ö§*ŒÏÐ"aŸí¢¶LqöÉl¢’NMjÿkÒ˜:„ Äôïà<¡R€"æKXXÑ«g–Û=,m3N]¥l›W³ üñã–ßà«d'·éª.j#³Í~óPu|NÆ8¼Ü”AS„s¬Ô(‰Å6© ”¹óPqœ0ŸùÉÉŸHte ›­ï­ò»¢t¢ñ/ºeÅ%éql›ž/¤°tý‹ÑÄ¿o²t&hûBä6 Y´ ô§>¸ …un»–µ³Eä¿ô™8®œóÁ Ä”éßúôú®zy°~,‰œÁ9碞"A"rŠò8ú¤`e«Þí¼h›»œPéÇuY6¶1²–RÊ~fƒ8O°Âj#í åùùÄrÁY«Ö4µPír…áyCá¶Ì”ý„q’¹ZVÉc‹ùg`ñ¼+“J À äÛDÚMn‡_È’r>"‘XгOgÃÆéfQʳ Â?4,ÞÌ1Û² éOñÁÍ2<ÆÂwN-&™v ’º¨_Zq‹m ûвóÑï9ù69eÿÊ‹­\qÿÉk|„;]Ø—Áýžƒ-EPu¤Á[ðªfóOãõ& ¦Hëóu¨¨(>k¢•‰K+,B#œ½á%®]5(§™Wð«F>2…Œ°ÿeW ¡k%ísU€}’eúÚp ½s-9—GÍ@‹Û…øöž¼,Œ7²UÌL§—eH<|2ó„þšþÅgϵüm¼DŸÖ{^)ø˜ê]bÒìSÜ,Û*¼ áщ,ECÕWŸ+õTñ€+„a!(0½í (|-|ŸÚTŸ[I–zúC<@jŒ±cØÙæ]3Ï+©îV8´ ®:Úk¿‹jÑ)#ë¼”¶‘õKrú¸æí>h¡ó $Ú`I½ÚY¯Ù±d°bľ½BÄ’ {‚„´‚×2BY /T¤nm—®g?)«€¬ìÕqû´*µO>á¸ÁPÕ…M6¯¹²=(ŠGH?)Y·Î„˜œ£Ï4á@×ÛIáÑþÂ#¡ÿ£fºFɲQñ¡C¸å yÈ\jåXˆ"«6gÇ>6”xÌ,ýG;Ðç÷Èm_¸Eko¨Ô•Ð$•ޝzð'q¿ðe´HþâÂ@+ì¿VÇÅDÈ‚§Áˆ#wkÊF[Ë'\ðÿ/ükEÓ¥b6ò‡ÂÈ­g0#•0h‹ºF9ú/ô¯I@:;  $<¯Y¯P~i-¦züáÛõ¦rNV&Ž‚=›ÓG«ƒYåž®·€]|÷Oµ%*Tbwz gß„$R,ôêF©],¹GËÆŸY1–“äË»ì-o·ìæÃ¼‚”Ôi‘÷Q¬ÄŸ1~.0Ý(Ÿ†^±Ž/QÍŸ!þùÿ¤oºK0@rËcG˜vŒEI?8´ûÜÃ!Hþüieu77ž 3Vãõþ¢Á:$)\\Xg4Ƌ֙ªrÀý;˜<&£:‘ ÙìyoÏ/3È2øòxE^¯0ÞÜ ‘:ÝÑgT²V•MÄfµÁCnWܬøŽ\Íû¥Wp6d!©Ãü`˜¯°VúFºID #Áÿ1P÷_ÚŸ&óÜþáñ‹·ƒ4jWÕ½ñöûذƒ{™ážkïE›*YšÝlð—\Iä<ÿ²¨z¨üEA üV‘®š¼Z¥8x@¤¿è:U¬<—ï>¡­‘HÑá°]²î‰ã½îx¨ªÇ¡n=vüA¬òÊ^¡Û¥Ý$ÅQ©cfQ–o8¿îjßíÆšÂCšözéM ì¬°iÔ”Ž÷YBòÝcsÕÍ;áÕx}’®•"Ò3Œÿø}yæÿT^P*º¡Ý§¬ëàdÇ~•°7|WÿÇË–+ä}kdÌ;~­šfp0ó²Û…PÓ§’á/|âAËgÊoh2–¡ÇO¹)»dþ÷Æ2î|sº/ŽSle !éwžë‹ü{ûUxQ†Îý»BZ»)n<œ3'Þ,KûR]“ÁþÐKØpXv»Õ©XPU —9„Ú6ê9ßÃ_Ñ^ÉK;܈a)œ¯Ò¬÷Î(±7·á$;7üQÚ#´eWðé¾zlÒÏŠU™3ê—¸Q˜1©rD N¸W‡‚—Uã AZêŽ*ü2'üt]iç4&Ëþø0Â?ÿ™Ííeö8þÖå„džÄØÉáÆÎ'~ið=Ú¥ ”z…zïeŒpÍ ¤˜@ ý)ÙùSô,ÿ ò“¸‘´#¸]ùë%¼k@¨üµçëkMŒ­d«!Žß˹Àm¤LüO[õN,ÊמqNJTAyÊÉ{@lf1Û„õ¨•9ñBwX-Eú:ÃÂëV‹ ˆÚ û É’¸­ï)ép 1]{îðKOl€0Î+ôàá—¸t endstream endobj 102 0 obj << /Length1 1574 /Length2 7755 /Length3 0 /Length 8786 /Filter /FlateDecode >> stream xÚ´TÞ-LHwHÒ=tw#ÝŠÄ0 00Ìà04HJI#Ý%!Ý)R""!€´E§ oô×ÿï[ë½5kÍÌÙçœ}ï¾wŸËÁjh" ì€°‡h à(aA  @UÏXXŠ "¦P ò'LÀaAz@p™¨"! S¡Ðuz8@ÇKÈKÊ Pú¯BR ò‚:ô:8ă€Cáî‹„:9£ÐËüõÀ æKKKòÿn(»AP0Сœ!nèÁ À†BP¾ÿ¡à–sF¡Üe„„¼½½An‚¤“?ÀŠrC< H/ˆà—`€>È ò‡2A€©3ÔãÜáˆò!!4ƒ‚!pt‡'Ü‚ ˜hë Ü!ð?Šuÿ(àüy6aAá¿éþìþE…ÿnÁ7wÜ w8Ba€†® ÊÅÁ~‚`t?È …ìÑ¿wh(@hÊó#¡î(A(ì—D¡_4èSV‡;¨"ÜÜ p”Á¯ý©A‘0úØ}…þ¸YW8Âîÿgà…;8þáàé.d‡>ò„h«ýY‚†þÁœ (€8””@ >`g¡_ô¦¾îßIá_0ZA ¿;Âàˆ „:BÐ?þ /…ô„úÿ;ñ߈@Xà£ö'(œàv4 qü#F_>ê°¢½' þúüýÏm/æûOùïûR3ÕUÕ0åûCñß9„À_@T ". –’HŠÿeù[ÿ_Ú£† èŸ{þC¨ wD¤ÿ€>»¿dxýé î?'†ðßôh+CÜÿ8ÿ!PF ÿ?ûÿwËÿŸí±üßœÿ¿Òð„Á~§¹çÿ?iæûgÚÉž(ôTè!гÿßR È“¬q€zºýoVBO‡2Ü ö÷1B=4 >C( ìü‡…þº4= ‡"< ¿Þ€€0ø?9ô¼]Ñï‰ú®~§ èqúï’êp0Âá×܉ˆK@H$È—ˆ¶—ˆ¸8À_= ŸßÎ Â(t -/àˆ@üºQIi€Á/èw$-²ÿ'BçÀGbbè=… ¿a´K… ‡â¢!G¨×?€0ÚýBˆÐtèÇñ_i4#ò_¡@õº匄ü‹ˆF¼ÿŇެùðŸC{"‘èÇâ·mÑ'öWüûe‚@| `‚ùX6Ü¥!¼ë¼N™Á[`óüǦE€ÿ<²Ûó’/•§6'tyªœ:ÜG¶´®Î}¢´Àríÿ¥½ /²#ŨóGÀ•m’ñÄf'ÁÜ{š×ã%_”™ðL•¶®˜‡¸b·cöèp<ò”"1,¢<÷Ðôi¬\˜Ù4Úª•¸GxU9)gû0¤lš£Ð>÷Ý]\”Óm^Š}Òé“Ó)Šüñ$>‚À¯q¢¥þVEâ/>ø-W™Šx¼ºÃ~çö Åè§¿ÊNší¬yé r4ýM÷ØšÛ3aطߦ¾ñ9r÷І“c\†û6•öÓØ•­d·2Öd\±Üý%íCÉv{~ƒdèL²QܘPz³÷2¿Ño›ºÁ’7ÒØ™:µ‘Þ/É„™ßÈIU¼é4tGûñáxyd™ª¹MšÄN©½;ø“SNƒwÈî²)ëð’Ïíé¿É(¯Ýu^Õþ18ñºgkÌÃÁíŽ f*Gss¨üN]Gj¾!ÃSšÆ\&ÏSévú8¶Ôœ¬‚vÑfCÂ![ë†Í/„<Ùµ;ƒÞçQƒŸ×©*Í*o”k« ¤rÈKðµðâ/Z±"ׯV‚Ž€Î³þAArn¸D¼¿æ§]FP?qý;4íÍÁE#ƒ´f¨spìãñoGÓ^ÕÉs½¢yVù$­Ïd¶%ä;˜Áú|äQo&énºäRŸ¢Q'M¶ÖÀƒižôŸ%|ôÑnF\”ÒksÚ’¸E ©M.µ¬‰»,–À⃑¶¬ ¾ÏãËÖ*»iT“ÄŠCÉNe ß–=åç 6­•v¸ 'Ò4Yâ‚»ÐT¾°Ø—:8>µD2½Å[Kã{÷·Ç†6¥×¾ßEíÂÌ.©ýX+­¹"‘Š?yYVÎ?œNp©kö¾îQÂé$"‡»f?öÛ|[ˆ,68Uèÿ¸®“Û¨œÏ“÷.ãE¤Õ>ngU“Yt¿ü5Žï^ø µû³ý6ã|³³¶CJÎ!`WG9eb(WšÀjvEƒeêJûFÙ‡w´˜}uɉÅ›N+؃ñ…¬q¯9Æ7³Õொ¬°çqzóU"N”;‹‚TOL$Sè.[¼ÇS‚xÛ±KUo¯¤™ÛSIÚ|rÍΫ8Ñ‘­è¿zÆ{D<§ÉøêyÉê|@vòt?s”YÉ x¬f¥h‡d¸6´–"1éœ%c…/2¿Òü>?‘™åÁª—ÙqÖ'X—aùP‰Û~Çì‹\& yÎ.ÁvͱN|¿GF¸-SñhCr&Žo|Ð<}€¿qhQœÄ@SÞHºJz‚¤‹ö=^mdð› ‘túëFUôUÑM†’¤¡Ò õg1îdÆ.AyÌï€1»¼Ig.÷ªÉu>ŸT¯1ËÀˆŧ£äš3¢äjL2é¡6- Í…Sù‰¼œíbîsÈO>qWkâlæ‚gÒlW¥ÛÑøMU˜ îhàB‹À#i¥Ž‰ÈÍG|¥úΟÏñ Zb¼õb)`*éCjî<9W©N¼ZÙÔJÉ!-¡”âV±tã-ºNñ—ÕSÁ¸3›fÍÔ³üŒc¼Ka±áØ”U1 –M÷hº0}¢÷V¬œÕ8”‰Œ›ƒìAÎÜ8°L»Ç]ëÖnï"=ŸÔÝW҃Ǵz¾³°ãP¤'5’b:öÖub þ)ÛEèPŠÛ¶AàÑ·‹\¥˜­x¾’ø”¡:ó”ƒ~ð¾é —ñqì½Ë$F>bF˜I¯¨û3c?EÆàg³Ð¨Ý™RØöTþTü&5õ°X[|Ó ’p¢§£oØ_Ü}¨Ó¢ÆWN rÒh=»s$÷Q7ý‡W€Ü7 ¼iÍù %TÜ#ˈX…µáwmÚjŽ:nfËc¯Ô‘-É@á&iLØ åÚ{ 5Á˜,¥ä·ÓÒ¬SzÉø².WëaIǶÔG\iw¾¼]²så5%jᮩ°Îë'•7ž°êåV¯þª¬Ã*ê!ƒáU.ú¼Tý¬O®X» 1ŸeEe5óà†ôlHoÐšÔ ª9PºÎõÓ'Û³×]š ETÚ ÒÄÅ!Iµô£ZÕÚ¥ü­x\«¥wÖÆÉaE,Ùá7úŸéØ|@ø#¦y·Í7:¹[Yuš[¼ôµ\Áï.gµ®õ›]Ršl ®¸ &ÿ1.¢¦Û$n‹œ×ÚÜ­~äZV+ÄŒÜ. %Ûq«5äHyê¨røÜ“öʧ`Zùüe0c¤c¼°èê¾Ã2w8¯LÞ9"ÎÁ.ª¨HYïÒÐ><6B^’¹[‹º•lÍÖ\ýæÄ9<)O¯&ÝI³w œà5PÇO$®73u¾¼³ óê‘îd°åÁ¼˜¾3Êõú ß(w›^<þ‡®ÃæO“ Ü G†P`U»ŽŸ€Ùñ Á5RâU÷•¹¹v“£„u²yˆèk)ŸMÉÀÕÝãã×@È‹bÖ^|æâyk+6Ïô2ðÞýÂZ¾f‡ðGó§¯)€ê^£øß\SQÞá©‚žbC‚,ÕSùâpòç P)ñŸ¼[¯ÃÓ}VáÝJ,½ê?°Ô o: ìTÚ'‹_mÚàó¯@„÷+¨Ï ‹\ÙVk¼{ÝûךnÆRú¯×P͹4L‹¯Xm…]SÈÿÒ+¢äuþ”I¥Ck¾¹–¤îÕER¿ö8¹ÿ­] ñW³šž{±ŒüœBvXêÒ¿®N\Úx_$¬«R÷bœ‚Mg£³yÿÕÑÏþƒ6&wZZ õ€ ãå ò¤{’tÕS·´…˧]Pý\ÃR2BܱÚyš…ù x¸#Í1C·îDfË…ñ6T Oç9>ys.!o壚‚j;¥{6ýúµ_²ÞzþºIÑÔï±ÔwWŽNÃ5ó°¶—uJÂdŽЕَ=¢®Z¨u§Í¥Ý&•Y/ìs1ôìð͆]®ù«ÔNuu¬üÅ0ÉÌ9‘êbúP¦¤dƒ€ÝÐ<û­Új=¯¼ÏLŸiŸpz ľ#ª‘°dpbƒ;ŒGZ¥x“o„‡À¹ÃæãÓÓ–³2Û'_Ÿ!DHÖå–;+ñ±¢ê‡ˆ{I±˜#}ôµ{lº«­ØÔL??˜!» šìwh] Mn«K{Û›`ux ªàù%®Íd½ibmÎqÚÇ*™¹¢’('[]³Ç#3XÚ“,è…I‚”ï®À-‹F„›1;ÅžÀ“Bî1õ¨ Ðè+W¬ÉKÓ:‰Ë³°ñåÆñ i¸YÈSb®ë]@IÑ’êçÏhÇ«„?KΈîy‘UÊÒÃ’H7Œõ'ø®u f‹UÏ૤yuSJ‘7nÆP9üç}HQ pèË +³ã§ä¡œÎ“N js†ŒÜEÛâJ’Õ²f¡ôL 0Añ¦pÊœx¾o’T#ƒQÇ ®yÇzmÙñ|Y{ÿaHh.¯F = ›"‘!ÃV|[°îÕÞã4z·þÇ.ûÏr’okx1š¿°DßÛŸ$Ã{Èu¿èôuüñƒÐ˜|Ê8¦è¨™€- iN¼œîA’ŽHIÒµ–`£®ÇðV€®x´Åæ7!«¬nF:«”Ð`cOH핦æÀ8a©Æe­‹áÛZ~‹íg4Æ 5ž’Mˆ¿vž»¸Á"b²DóY—öïH#“ÿÐÇAñwÉì<¤XÄÙéÁ·Ê/ÌÌ2¯ Fd.–“¶‘Ÿ;(„Ǽ¡¿=B2švAÌâÔñfv…ð*½ŽÉç#o¼kÄá'?À^n†é)×J­#a¬™~:Ò´4éåöq£‘–ã䢿3¿q’ʺJÞP50üjÉVdihÚõú„Š’óËk,Â]YH½¦äl2N©vÚyl7ÐȱW¨#é?æË•½ì<«É§‘ø÷²q3‰pê`Q™M—ÄÈ3žÇ®©Y£óz\ÊOËT;Vôl/­#tU<Û¸½3Þ r>hêð’îM¿4‰Pí¨ú¼Fô”Bõcƒï)é+eÄ~¡Ê8s¬ØX¾ùXWÒAJNàDp0QúÄLŒ‰•J>ý&õ¶õ[xp}ä›"q×Çd~vçªy»ß}!ërP§|ë²ÿ‰ñÖû·Hê'½õWi¯Uë“\7})_<þè©Å¶Ë-E2®/Ùð"]Ò¦e&t’ÝIê9ÒûÏ%ÿÐeÂO‰ 3ñÖ‚»ªÕ¿á]~9ö=Ù9–„—ç(‹*ªŸÆ “å«`®àl†¤ã€ÇÍ ËùÚ͘؛òó‘щ5 ðÄë¦mq»ÑÔbþÕ5¡é}¤¬¸"½ôÈÜ>©‚QŽþ¬æ(^XÕÊYN’Sz„»¼Ä”-é›Là´Ö˜÷Û&O‹î©R¿€lÓѦusm½õZGÞ•âp‰>j¼QðvÍ‚\zޱø˜—€w ï¦é\BÔÅQšp¨yÑs"h¤âFQ¨ŽŠã“‚;¹_˜ŒŸcáAý7´ØšÄœ ¹Ÿ`08 >î"z)0?ûùI÷•Ò9wà×lº«è-Ó\SB½ôœpÃêúP»=÷é¨B;¿XÿŸ\Ù9Q>DÑ{Ô|YÉoiå¾Ë¡f“¥õ³æ{GW`ÚZL˹ýò{ÒºÑO£·hOƒJ„uÞUVðÆÍÖõTèZe¶Äyð‚N”滹:z•«J- Q†GK›º?PJ°!}]^•to}!Ò’j¤û¢Q²¡Äýq+ƒÒ6±uï³â‚•ÛwE¶¯>Åé@þ[Þ[Š¿ÆÃìÖ¥ÛÚŸ<õU´H¹¾b6îÇÓš[TRDzZJLC²,;„‚=Î}Çr³¾q/J Gë¾Úð˜ÏˆÀ=óĉÞ:¦Ý®ó*Ö$özXB«z¨ƒQÀ¹òÊM/šƒáÖzÁh^ÖÃ[Ê=½ïG%ÝU« ŠuË(JuTÚ'§ä'ÙÆ/ŠÝn$dÃâ«ñ½ ?ñPjÖ^­oÒq68Zs$ B‚Ú7×é`Ž]Ê®xŸ )†gòŸ¬5³¶(EÙŽ·6¬ßàTYPqn—óà°]¼› ®ËŠùÁWHË>œ(²µÍ¬PÉõóºµgÇh­º;d æÛ ™ˆíoÂá ¹h®ÙÔc¶wEœÎ>{óñšeñ(þȭÜ ‚¿ÔÔªë·x~¾Ç5ˆŒ_x9ßúNž¯@peÛ<ÉÏü¼Ïgáè}Y’wŠ|MÌâ‰û,{!£™?“@lKùD¨J4à ?6‚þÑBAfÈÎ`4àÑz´CNáǵw¢»ôØSýìkŸ…Ž&õŒ/[ìbVk‰*d%¶ô.óûŸÝxVZÕù]ó7¸Ó!Nô™0uÒ¯Þ)­m½3á|Á±AîÇ –0ª5KOª¢µF’݇ÙÆà2~e*-L·g˜R†¬m™?¶6 ˜ðfú­ZèŘlË×%¦`Á0—éÃ&]³/²Ä݆LÇñïÄ |8gQ.žÑÈsm²x²¾Óॽ|¶5ŒÕJˆ]hDñ‘â(S­~úóÑ×s´"g…–,»'Iù ¸ Ã:îÇ.†5mo†H š5-`©º!ŠX™¹‘ÍûÏOo-'UpöÆ8{ž`pv3+cF°“ņÆMs\ÆKƒÝÕä¾û‘hðSåÅõIsÄÚWœáW½T©“d~On1Ææ§óÝMÙfh£Zh «4ÿ¤“™|²p§9NXs!ÿLË'æÓ}Ò®]Ó†±É؉ýî&±¸/zU É„bKKû@À¸ÖÆSþ~ªõØ‘о&3‚[|«¦lvWvwç!ø¯]“r\E”³69Ãl–wîûMÈ;’Gï¦ñœ;¹(/§pùDÚ«:ÈÕ®—ÚLÆóO±’öz}Øt›#ÔaMªç•«©2iÀzÓ‡%¯7*hÉdµh,ºv©,§æðåî'/ |õ“d«=AÒÂwSôõCÕ˜Öû¶Yœé¨c‹X(öïm+ˆO>ç¾·vI=¥À‡Æ'ÖéûA©œú#Nnü{•ß­î³´u=;Á¯b°»"M~–t0–ÄZZ&Pqbl®‡”Àw`'w‰;{á]¡Ï﨎ûÆÍ!h'xzHŒz•B`Gwð&(*oç´).¼é …ûM,BŒsWƒÙànT ê°~ÎGÐy÷yxòꓸbø€cr3oÌ‹§{¥«´úIÕ‰ —Œ“‹½;<œ ú}\&b’…Ë÷†V‰“´;&éáÀ„õ«\{‹•BÖ"ý¥îóÔ þïÀdÇ„.XÂ2¼sŠ@]-ލÉoG)sPwÄD¾9ýÕˆì–|ñFÒÕ§Ñ\‹fl)æ$7U³¹VÙV#ÔO†õ\«š˜+•ä.¯³šîc‰±¼ÙR•£~ŸûN‹ØØ¼T‹} æJ "¿^hعx ’´äõ ›‹ÊdŸyYÉ¥Õ~ÆŒ€Y»ùVï EkAæ¼F—4ŠÛw£8!bs7Ú¦¡z“Ð}Žp>Ò¤Ó¨¥ÏίGt3µ bGÁ"wß;?f(Wí[ c~F«ÿ¶dÔðœ’É‚ôpØ”è£W*v9*6hn4¬R7 TJ£½-F³f3ÜGšwÑú6ˆ‰öžà³TESFÙðiñQ <{vSQÐ"õ53ò..v›ñ5Aê]!Å'¿õÉÏ{‹„xKiÉBÄCO4f,êÙ3úgÖ„ÏTY±ò)… dˆÜÕ ¾utÛ ’nwke°lÎHÜGz}pïî!áÖ$e´Æ8¿÷þ<×Û³±ã¹ÏÃížûV”»ÉñžÇØ£.¶-¡ó£œ´2¢îÛ™Çãˆ8ªM*[ ×5+™ò’…—%_çÒZlÃ}¹Û}øFípHÚó¾¦Kï]üOÇ,œûëÆ¶®]_ŒPøÊ’%›Ô`µx!Óº)Çm¥Áìx˨F-»ì÷U =—Á¢ ì â î$ùÙÈ.اž4Ÿ†”0Oç2dmTÿ+γ‚ÂÙ #Ÿï=Þ4³„YËF¨[ánÚ©”myCsÙ{bªZϘÿÍÙÊœýÄ,JGœ_3V\:k11ŸõöY^ó[‹žlF/Íȉ*æî¶Ij#~àçÇ2zd±+†Ü¤³Mäw;“«7pÛ‡8iLµ*‹MÎÃ)gâÏn—1‡˜›osÎ&vT ÂÖ)¢XÙ#JcfàdðÕTŒjë"7O-Þ:&*Ž›ú<€ ‰\C ï k@õÕ»óIêÌqF×—66›,ó#.Ûå…­Y=†´p'oyOÙUªj–Άäìk±ï@³s_µxÓóFoè&{p§hj¦[ 3¿½†Ük‚5ò»äì–R”ä¹ÁÀvÎAÔ´iŸ¿€u_®J2ùËÝA­Âõ¥àº_ëi‘©W—ÿ°x ÒR+^8Pº´‰èÆzý¬%öQ‘( ^¸ mÈ: W£X>sµ$I»0 °$æWõž¯îmb·ø~Oµ÷©¢øb AC©ëøiµé•ñ!ýç‹ÅO37Å…tÞ^déÓ(MÑþ‰Uu|¼\ì>o-^Ürõ·+ªŠdG­9bÃL¹kĤùÔóÔ…#)3¦tRÇkßNr·Ôe0îž~ X%Êœ­(•º]SŸ `,èH¦}<”'ftM½ññOaŽ%çÍhÛwá®'ýzP‹Tà6á'ùÕF »ŠÛ ²âãO/ÆóßG(D9ŽQf¢ºÖ[÷çʰ¼”I’!zÜæy/åµ3R{ªœøŽS+ú¾VåƒfîšÃ¡²¶‰J¸?Øžç®r xøìý:9´Kï4l&[à§9jîlM¹öFe1ÅÂs}QË}«8ðóâVY¨uîR¬æc¶ÖÛ+c‡0ëóWÞ& Ò—¹²æI½U\y䬛L«)ÃB3ùÆäÄž£€‰P²Ãü'˜Í²ü–~Ó"."FòR}‚[øF¨TÛGÇàgXNVGEü7}§[§¦À8ÌsP¨ÞóÔ¼Mòé—ðS-š.ê£C¸äçNÅ{\á­Óx ?¾){¶§·Šª2 Þì.û<»A«)wƒˆØçu r\G6ª›SžO¤Tt¨ÞIÿ±˜õÌÕÕVà¢CŽÒâçUðîÌæªcYÀì£ÞtÊ âçD‚øQãÕ]í9ÇÛùÛv-Ø ue¦Å\ÆÝY¢+KöQ 2-àµÌ‹†ÆËÄ'qßdİ›^ÒÝs+‰8«°ò ŽXÙjcò –x5à,µÒ¼~HmvpO™ñ[ïÝÙ˜™µ•e| ÎR Ľ}éH0s…zoñLˆ9^ùqþÀò{ÓIšÅ1—æóßïbX3 /¯†ŒÞ[·…nˇxšP‡M\œpä‹$ØáêÏk_(++EÅc¶¦¼p©ºvØ&Ðå×t›Ížúù´õïéu·hTŸö*¶Þ;î¨øÞæŸ9šÏ‰K™:m@›E)%N«s•;C¥…w‡tõ»‹KV¨¿›@Ø1êÖVñ§³W®kÚ¹|¯ŒÏk¼z¹öhaD„åå«–Š2SÓnõìÊo;èÏLutÅÀšwÁ»W Ñ*ïFTç”›·""50¼§§.ÖÕ¾ÎPhRlBÒ´&Ãön›GsɾÆ~»E–JÈM"?Rö›Û Û&Lµwdó"¸š<ÓìVâPµ§×Œ{ÈK|ûmêù«ˆÞtÓeýˆÊ”7`¶!Ÿ·w[CŒØ«CÔGñ7Þ³­œžM »`¯J#E›ÃŸpwLà9:ßùªºDb}ß*“¡±FÈ3RoËÚk¡Nù°dË/1¸UB“?ûék?†Ez' kURdþù¼LIFê»[ßA˜Ô.å+ëyV‹ØÛðcÇÔ^L^˜ÌÅ}åÚifß=÷¤§­°[žº®Ïá[Tœq_ŒY.cƒ¯ö¼ã H‘ ]ïý/IÔYO;\"ß>Í3tÁÝäh[UWc/n·çú.iíS%qÉ^JçÐã¯Zª¾óváÁÃŽØÒÅ&Дl§qW5}´Åˆà2ßS,s¼Ïï܈˜c4l#ßL|·â¨ª±¾¦ÚêÁq`8§A$ØÉ¢Ö~›Òc$Lʨ~ðÙþQν#»¡G÷XÕ‹§1]ñCË#»CÖt­ÿ¿vÖ2 endstream endobj 104 0 obj << /Length1 1591 /Length2 8647 /Length3 0 /Length 9684 /Filter /FlateDecode >> stream xÚ¶T”Ý6Lƒ€’J %!ÝÝÝÝ= 00A‡t·Ò)%Ý)% Ò݈Ò]‚|èûžsÞsþ­ï[ÏZó<×]{_÷¾î½†ŽJ]‹E n ’…Ã\X8XÙR*š|vv.VvvNL::m° ô·“Nää †Ãÿ å²py´I[¸<Æ©ÀaEW€ƒ ÀÁ+ÈÁ'ÈÎàdgøW ÜI mᶨ°á03&ÜÁÓ lcëò¸Ì¿> @F‡€óŸt€äZÀ*.¶ èãŠ@ @ ƒ\<ÿ«ƒ°­‹‹ƒ ›»»;«Ô™îd#ÊÈ p»Ø4AÎ '7à7a€ªô3VL:€¶-Øù/»ÜÚÅÝ x4@À@Ìù1Ãfr<.ÐRP¨9€`+ÿÀ ø»7VŽ—û;ûw!0ìO²‡:XÀ<Á0€5¨É*³ºx¸0,`V¿- ÎðÇ| 7 0ÄÂò1àÏÎ-²‹G‚Ós:\œYÁßÙ~—yì² ÌJ …‚`.Θ¿÷' vÛîÉö×ÉÚÃàî0¯¿5feý›„•«› ìè Rþ;äÑ„ù› ÈÀÃÎÎÎ'À9@@[¶ßåµ=@œ¿Í |¼àëG °5èñ…éålá¸8¹‚|¼þéøo„ÉÁ°]– 0 ó?ÕÍ ë¿ðãá;=FìÚã°ÿ~þýeò(/+8 âùŸð?ç˦©¯'£®úú/ÆÿöIJÂ=^,\\Nv€7€[àóßUþÍÿ_ÜÿXÕ-Àïý?`Öp€À_{÷/n«‚áï‰aü÷ ªðG)ƒ ÿQ¾1;;ðñ‡ãÿYÿRþÿdÿ»ÊÿMùÿ»!YWä›áÿÿã¶€‚!ž<*ÙÕåq*Tà³ûßP=Ð_“¬²»Bÿ׫àbñ80È¿Ûv–{€¬ÔÁ.@Û¿$ô¯Sx,Ã@êpgðï»ÀÂÁÎþ?¾ÇyÚ?Þ'ÎgõÇz§ÿ^R„[ýž;N^€…““…'&û£¼8yx^jòø£l+ îò˜x¤ç°†;aþ>Q>N›üoÓÄÏ `Óþ7à°Yü Ø€ÿF eýrØlþ Ùþ>V²ÿ|œ 6ø?àãþsþylÎÿ€¼6—ÀÇÊ®ÿ€›tÿÿ«K@W'§ÇÛãŽ[ø/üçª<@@Ì…Y8P(Ø®&¸õºJâ¥;Ëö¨Èݶ^ #‹×‚S›ëí3ôDÆÊŒÀ5§K‰Ä/]¸Ë[2 â‹”÷^{ŸêÐÚßk´üô¾3‹ÓœØnÁœ'êËß“¨í%BÆ¢-þÍûÞÑ[7ÀùâgEºŽ®üÏÔs ®Ý{ä†Êùg2ú‘MmÔâ¼(ë2“@@'èõ¨”“³ÊØìŸNÖî¤F¨;ï!Cmª+[3ú=d´bSÎ;|rimÞ‰[R…Í?Kß´øHøÄlЕÁ ¯ @ k5í¥UØô©ø SÁF˜‹ÔzýÍf‡¢M}ÿÜy,ªÉ7à4RäM± e9òÊ ä,θë¾à}œW¤ÜÀÕ`ä ŽˆÛ‹è—§„øýwø¾âMèQ@ÜT“Åk$CoÛêDžpc~8™wÏQÈ?-¼Hã$Rí ³¸±²> ‹ŠÌu&Éœ‘^Å Àcñò4MÔh&LØ‚’áPú»¿“{&ã·Ž-Øö=Óû…`‡éòó Ù7f îç­ýÅ~[÷÷+¿£NŽÕ«”m3 U¨;ï}yË75êìN5– O‚¯Æ$ 28ITã&I}QÑ»!Êh]˜3ñ±šˆ\¬}þÕËæJ˜%·Jˆvq%“P Öòyþ5į8—Ä4±ß‹?Ù‚n¬ÌL©ÊlKÃ5OZ(ÃdË4¦'œXÔ>÷­N­·Èy~Ü,¶ÅõÍ›#*ôù6Òg›Y‚Ù~mÃûïÌÉÈñ8? ©ßI7r¥Ÿˆ{»È‡ ¾˜$w1!´ïÔÏÊâ³ær0V‘>Äx6&Ciô`ˆSRÍb8 Ý“’ç)«&Š…u¦MoRÝx8Éž4´¸X/ 9K€½i6×7#'Ñvyø '.¯àKKb‘{¡žv×j_Жÿ¡ Õ©÷ô¨íÀkt&æ‰ûy}[OžR? ]žmÚÁËU>;f5©°Æ‹åm×ð¦Åv¥n Dú3}„X_⢧þñ³‰Å÷}“Íð–K‡å±—*»n ?a%Ë}3ûzaaV­ŽDu¨,ÓÑe‹Ä›8®žÁýée~Cïý™)B¢‹ªÈ+»dí…°¯4Éyfå˾{¿;€£Ü _íRw÷ûo3åöée°+ I‡j§–bÕ.Ë-kÏ%µ¿Fã›ëžfÉùø«ùW½šuº$c5²Î„”µ ?kíS=v¯ÕÍ~¹é‡! ߟÔHV_EŽ„Hh’:ÐØ¶¬ á=Ûý¼©d¶vñYåürÁ[G:r5µt&Ši䀩wá¸sRÝÚžUåD±û|#ŠŒMP›ô9_›f°$›+!¶ûµ>gÀ•¯Þ nT5 9ÈôÊV¼{Z×ù”A©-Tdô=£bfKB¡]©€@ƒã¤ê'Êj e‹îòÐ4Xs㨾ï—oÞÐðWähú—hÆ…ÅYϱFwËâyxJ«ÐlÞ ó½ °‘“/“bx»0õs±.„•%G^xc„'‚¿EZquÁÐr¾ÖOnÚƒXíUË!r`È—^ƒ¾-‘u¼¾»9‰Ý§žèMd %]SYèr„HÞa0eÀíí5Ztašý0ëåÑÏmé ìE$+Üâú"þ\ÀÓ–‡þš¡ºm {ê®kÙÙ-@B÷7m,M‰ÆôÈyLqëº$šŸ7¹~~¸0¤ÿኣñ¯w7ôA‰D¥6à Ór8µ­S ±Éõ}„³¶Á­BÞº4ÄÄj¥K¸››Ÿ |ü¢ä"6JäWÞ§Ë,×Oú£"šð³ióBôÕÌ Ý›™æ´l¢o,ù²îéívHј#hÁÛðïÜ?'¶ºÚY§†9óÅõÊóèUuJ·Bè„#ÏãC^³‹È0–01ª'/åÙˆ@ê˜fµVÎnúÝ[3 â‰â!zÓžL÷ F@:'ø'Gº2²¯ù‰²âOã6¸¯”’íÁŠojsÆä»u(±Ã ìŒú¹¹jß»…* ”²¼×ûþyÏî±}%úÜ‚ØzÇT’›©$&¦l`j=ʼc»³BLx‚Îâ¼0å ðë~~ý>y›ðu›GÃ6ŽþƒTZv“Êa˜¾òu‡hqÊJ2›,xx ]ÅÇÌ`"Ð1?¡ò'^ýbgÙ¬9Ñ2fþ!¹”zÔÇ„ä%^|p¤G~‡ý§göáñÜ«¨Ø"ç¶K«ªÿ©F¡ÖìÁAÝ Ýè‘bµÔt÷Ê©‚rGl„–Q{ù­­RÚÚ÷÷EÜ Ê=ä‡ »åQÉÙ¬…eÔÄ|ìÙd;ݱðæÉÂOfÁNU>¿î%Ý8+M ïBfœVTqªíàö(á Íõ©”“±/cÂ7šì>F+|éS9d~•ÆŸêÜA…=‰gî\Ú6t68åP¦ü†v(Õ/ ‚Ê—ÍC°®…žM¤A^d¤òðšqªˆè¿Rò£õŸ£giY(9EÈЬ†»ðã=9SÙ9 ¾þÚø™¥Y¸:«ý…Ææ<{×y¸¦H·Â8O‰Ñ'è>ç×¢+·h¶›8#ýäÈЩ nïSñYrMëwX;[ߋۨgä—%4žx2î×ã?i`Â3j·ùL7þ~)Š:â°è‹ ]*£L2*øÓ¹Øv$ƒ¶,Òë‰é`ø Fúz½bø+“(7ÍŒ&KÔÕ'E`YÀv£X@#?ëñÿRmúÂ`ŒÑ]»kÍ<·xÄ› OÇín§W\K‹)¶ªKIô; ßpæ‡4¶Ã|âeÉ7³hâ5ø_F¦ŠIIÜ–tÂԅ𖉓o~ay²nw"áN[¿ÐÍ›yÖ´ÎQˆ‰˜»@·A‘­çŽïÅî€i5C+žFýV©W-–ý‡"h±è}c`W§j¦ÆKûõÒÝPýl Hó¥§XæzÑÐB»JÉ!©ËÖ¢i¥¨`’å%:r@c²˜X.v ¤TΈ:sDJˆ¶Ã/§­ÄuŸ¡^c²3~’§!tU»ô¬Ãzì¦é< 8,& Ð‚"‰1•{eÄ&we‡¯&FK•'¨¯ì@qôbþµ’ÉÃò¬&’w oæ§¢méȵ朌Ú~¾hhé)DÅŽà©Ð¯·Œ£ÙƒÓ7̓udv93۾ə(:|t¼ˆÏ[›™þõ¢ Ïk8=ä¢%ÓäU-iR‚n°oÙèd‡Õ2©ª|B£ÿ·§)n¢ cå:„t9ø¯É:·»Œz?ñGI¿cÙ†épÈ5d+cDŽ Ë.ß«Šíö¡Š‘›!7͸=½ºk ¼±ÑoÛ0ÉQ=oü‹jF 7·§Ø—ëÔ‰6P¢ôãƒp›9›ãÞV:´46:Ô/—¥N›§ÇQ,”L(mm4IâŸÅ—ÃÐTz¦¾¥X=™íá5Ý·$Ú}ׯ*ò¸¡É@œø@{YS&£2«)ü UèÎf©d@ð£—\^}‹Ï4ŒIr¥™ås¾sQêÎ{<|ÓÇ({À(ˆJñ3)K|!×£*8‘.åK¯»ýùN Îóâ5ü„° JEyÚ92†DhÏL2¦æóÜ 4ß¶ØP)­•Žêæ‹àÅgßQQå “ &„_È©épÛY•·ÖZñ‘&Û6Vßw6–rm &«7$¨æð%_!qÚ”–ô–kÖðTC“^4Sö\D‹ÍLÏMo yÁ'7(6a~Z††½z2Ÿ2îº[ñ”ÊÁL,«è¦ïÏüdÄ×.¼ú² _øcø,31ùɉŽw깨dyî–LûZ È*­ÝêÎ!=»ç/ÿ¯Ò¨Ý94;ór¢gúÚ ˜Ã-W»NÄCQð%Ñ ƒªÃ¢{†B4ÇÔ¹ÅGƒA®êà2_žÝDåw´Þ7\?7“m×AkK½¢H+àVáCo@dáÁRäþSõ&Ö„Áé«Ê9©=D¼>OÌvݰ;Ìõ! b<\†¹úû”[BçCª6DìÍŽ å³aT«9éO€,±2cuÔåx%$BŒ Ôz.xÝ[ìd„Ì=À‰·®u=Ê“=Ä3fšó™HeÍu¶…a˜vq¬+õGÁ·³XÝé±k›¥Z1PwœQ»ƒ¢­W~Ì3¸¶õõð„QÏÆ:Ãk0²2ó:nC16Έ}„Jדêù€^”; {¼l?åä/wß$Þf7Š]*º]0î¤;j'iÍf<>½ÕzÃÖ÷•Ö½7Y&¦$’Ð`ãD¡oï:75ÙwÓ6†:j'¾æ³n…RÑŒŽŽÐE‰:/Ç“­Oy‘¤n;ëƒÜ è”íÔ®J è0[¯îE¥B®ùQŽõ€¨îÖu¶hfþË­­Ë³ú"¢Ñã4@Wefšn×2,eʾjäÃÆüÜιôpÔöëK:e5 —w¤šX—)K°ú:²ÌüuW24uncÍš<:ßMš½QH{jÇy’Å݆/šß¦™öŸwa™¯)$ã.áG[|‘AÚE}ñk±´Ž2Ø}“h?™³-…,¦è/HI¢køÛaCÐ(¨æF¦/?¶vi0¡«¤˶q¨–w©ŸíµöXÓ¿¾Q@x`Ij1µpzÓoþ,‰âž÷C)oÙ4Lê¨g­ƒÈ¬+¡ï5Y­È•fý=:”¸5{·æ,ž#rT^fY4å“k‘ Up¾ÿ&zàZV @TF¶ éͪK­¨º­eæC\<%ITcÅí!ɰÂc<%ŸðÓœù³×ÁW•W0Ìæ7Æ>Y[±¹jF_ëNegg>é1vq7‹ùÇ’~_é•õ U!×)f2² Ý+ý¼/bíœ4'Í÷ùzeê©pxä˶‡´y£†»u‘CR›lÉRÓM ƒbŒ8=²Ïx—È¡$•ùÝ ãA^»õC€úÑ-â Ç.¢®&8ú‘U0]<,o@2ã žŠJ¯}æ¹%FÙ§Eól¢ñ‰¿–`tž/x/_ÞnL7¦—"‡¡æô6"FùºK×^ðn„…/­)¡óƒAf?›ä¥¹PMxzãµ9t£ÈM䥅Cê×ËþB¬Zpµ*èŻ撴úQï|wQi0U, ´‚%¯¢dIøY¯W¢_qÅBiÒ‰©"—%EЪÏõm.˜ßÏ… ¢ÊñÃnë¤6÷ÐîTòJ¦5ö-qGÓ*LµÓ§ê±»í¬OÇA«´…mô‡Ê4„ÜÆtH‚DI ËåTÄHVæäày GÎObùǫ̈å]$‘Œù »ÙFz EŸ% ulµ?9§¥ãÌ@bLGn–ÍÕ]NxøuŽW%ψB« 8ºq²gnÝüp¼½¡¥«57·c¶Vçâ«%—W—†€Ài,m)¼Wá’‹£C ‚ãö¼R·¢$ZÑ´ zµß’ýMx¨£îdܶÃinÈmOr2z´; Ú¸Šú Í©m䊾ɷܒá'ŽůS<íó¬I™|³*©4ž¹8òª·t¸ž`](®xŽìVƘS÷'Y‹ïÀÝ%S‘"{ÓO_gÎäÀø5+ø=ÕQ;GnOph¾¢bÙ6÷¹æ½§9_êLó¥ÅåâBT¦WÃLäßÑ~‚ô9JWm%`õeI¡‚Ò7ZyMyGòb¤In¤)”ò‰“+˜@u:Íp*$Ù"ôa5ôƒ£q#>¤[[ÄÍ”»ã­§^&- #øæ ç”Êâ/KiXGƒ÷1,v›s3€T…ˆŸQrŽÙKæè’=øãˆ2S(ÎîâU¨ IN¡ zU)â4óq¿ CÞ¨J”` „fo÷™4ÔºD›ÀZŽbÎÏw©¼jöYô>¼¦i’ÁA»‚ÍQĘbÎŒ„OÒÝ… kšZSÉ‹8+Ž}‘ê¹üLÙŽÂ]°ôë½kÎÌ´ë…ÂÅüìâsJ¥Ð_˜G¡£ñ¥X¡-DCÁ]ù`ž§ñçÊÃ.K“ljDãuøiß8=‹t¸1Vü†é޽‚þV&R¡TY|³áäaÊ8íÈÚ‚ ¾÷T•ɿڕ•žÄZO2¯V¥ÜD`}êHAZ¾4 }"šhªôä|½G+K)_„^¶xTüqSu޼K¥GT/Jê†ÛZ8¥wK˜+IDzӄM“Ù¾úòMEÖa8Qcš¡W '½ö™N븣?Éùè!²‰6`€v _ŸØMíDG6w¬yîâný”ic"º—)›LhÆsiñŒµÖÔT¾ËõWuZ{ÕAS.÷:?Ú~ñ\/yò¼´,Ê"æè£ÃZî›*@ÖtµNô0ÿý¢LXUëÜËK¹È§£:LYúàà=QžÚÏoÙ ,ØY¾ U†0fþ4vE¼ ûvíiïwtÝú*[©dú$ÀIëY4wÏ[-Œ±¦‹Óju®ÇÊÙ—C‹±øª"×7öäÞmƽ”Ö‚ûlkuó)&¯/Ê&f½ÞK|}¢’ˆÃൌÐÞm0±.Veºí:Œ7h0?ôÑóàÞáàÝŽ¼5ã3cÍ= K:èq46,è–-õK¬ rã“§Â#Y'l/myȬȴ a§zšÀúÍ™h𞋤6Ši¿i¤5CðWL~Š–#}ãúyueqëFm¯Î®{GØÑèS'KDÑF2êKO‘衬výšÔJG*^y9?qfQéâFöm“üeõi®ýW4–k‘’@NY÷¯=­vvʆ™çë#?©ªÐ1<¿ucà¬,Ù§}¿e‹òéeä4ð0Ÿƒ´Ÿ£ö.Æ…mÝ®.ø–5'ß5c¶Ý¶h¸Ã>+¾/TÅ­náÊgy‹¥NSÀÇ5y°D.±Îû›Q^‡ «@Ú1À!ù…ö“NêCóˆ‚hôæX~¶ŠëÑ0ÌÙ³ri”–7ïòšjöÕ+zf”êŸÞô$ÑPöi94¤>ÐüÑ‹JlévÂ'ÚäQlÁ ÄæRù¡i´ìÎbRÔžŸæÈC¶\ã”Ì”t5=¦¨¡ȉï=èŒ_»/ÇÁRâ¸Õí×”> gœW1 ¥ Rmi8“mG¥» °¼8!ÑÑß­VJÐ@ú€ì²¼G&ùü¸5à#ø­AM/p¨Ÿw­Å £ñ—‡}s‰p¯«,q¡NªÌñAéƒy$· „  «È*(™¯ßó;’'Õeb*ï.ûÇø¦0ÒS±¥ç‡µŸª“%‹cêÈý‰›³~=Ñwµ «ÜO‚CóÎyÛYωŠk}…Œ0.õÈNR*ŽÞ3Ðw؉T¶Qꪸq0sÞšÁ›XH…¿=_ÅÆxf¿íGXûÌlí¹0gw§°@vÕ.=æÒf6Êc1»6.2Ç2*l©•îæó}[æÜˆœÁpÛ~÷¡¿4·õG²qLÕÁH ÉÎKÔŽ‘ìïQ¿|¿´ë¢Ình‹y¢ç[õè7”ŒW«Oð@W§ž¼ãÏÐM,d¹ºNö´ A~NÒn?—q,ÚÄìµòïK"WV>”ÎbYDºq¬Qs[?ÇGœf|š”ŽÉü­ƒ+U¼ÓÝäÚàßÚe±L¤*Þé˜ì‘5ÊË«Ÿ"N&Œ‘€°ÈÇœôP…¿H¨ÓçÐa$öY–Š >wħ*0ãæmiÞÖ±>|rû çw)}Ô$ý)sUüGNiHiÿMÀp6óCž¤O‰LsãÈÝàU¡œÝÓF¸ê‹i±“°žÒ¬FzîúÞ-³¼ag¿9CVäçõEœ*ªÏ§/d;Ÿ°äÐÕÐ:#Sw/ê"}‘vÆâ;ukWƒÀ²9¬y¯Æñž8ÜÓõBÓõ¤úhäf£¡W÷S=<µ|j2•è$• è}¡€Ø¹ x™„ú±FoKµ)!D9A¥‚/­ÛE\íÐp¡DNC¤e):oh¾Ïuú}$ôOQÄžaóPüÍf–˜QŽŸuI'ŽYwüDé Â/Ô†Q•zs@íº·s´wž¶óZ’;ŸQÅo;ždvKÚVË‚cf]â-‘–=ûœI"ѲQ«ÕB<ÒF¼å¸ð‰pÂBby€Š›N ‡ì?¶bý¾k`ì˜Æš(¯•{¹ÐÖ½mt(Ö4ÂVTnµñŒÄwü'ÄÖK,ešÑpZ¬Áœîþ­Ã€ðšœ™wŸc~¾?ÜMXé[t¯òæ—ç)wEi¼~ð­xB~ÃÎTbåh0O&“T@áÉù:¯G“èõ®Zu®†ðÈŽo@¶Ë ÖÉ5 qÀ¶ÑvÍÀ#í)€)Ý4tˆš¼eWD—Ec31@ÓGw?PÊuyÂ÷Ê(ñ“ÃàÔÄhÂÒ+ _Çž©>–éãU(P‰1(åÄ+5ç¥Á7ßb…bZ÷ª#+#–ý%BãI µTŤWàÕÎê%V%™†Û ‚šóR…G»/î!Üeäøš¸!ÌêT75GQ`WÄt€0(÷ÝJ ¨{u¼ðÞ’ôNzä»ù/=›ÈÕyë"v•7½³:ˆÁÄ¿hdŒÑ¤%¹ôKcƒ+Oˆ¡A“žÇT±Î6hˆo¢¾£™äqb™Q“ýÐüÈ=üUb4é9ïc:r _Q׬t¹f+šÖ¾“ï¦p3ð 9n–ÅK{ÏAÂr1õöù¾‰é´}DK™¡ƒVŽyƪýÌL+ìl³™„X·á‚‰0;»7Y†½hk¤+õà ­¼>nϹÚNTØ3}©î{vГ°Šaô#¡ßN£•Ç‹!”ÓùSºƒÙ³*Æ}‹ žxÂ|xƒ_d”pi²‹&ý-}M¾çÊäëðß]f¢Uí©#ÓzY†ÌŽ3ÇG &Í=Ÿ_F_‹\jl‰nªÊbM¬Þöïé!×Úé^)~³…í¡åø(:26:OøDíÃ÷ϳ{žåˆE/×ÁÜ[7•~û¦\¹i³”zv£@æ³QÚ øŽ ö‚Z5öÙÛÁZ¶IðR)U«zlæ sXºˆù¤¦ 鎜!€1Ý0¯+L˜±UüÕv@ž~—EÓ¨°UBV׿Bá…âZ¹Ýûx=¿³¥èÍÚQÓwvM«ó‹ƒ×E˜3 M1ßòr#ã­†¼(ãeF…\ ™Z)Ðq¾,Qjlà4 Æ6‘*BÉüÌüèeÂM»á =æý+uÇ ñ¾GOFQõô܆çËÜûâ‹bÛ4hn¯†,^rtðœ©"¯›à¦€G2° OÚ•=ʶR3ÍrÞ@¿í¿“`yE»=7ºq>px'ŒÚ’?tE\RÜ­s›(æ’²ÏËžͳvßÑ~…âç™ÞÇÚµõvHRÑ&~a’°’ŸFE“E5’ÝÖ1Ïã> stream xÚ·sT%z/œm»m{²ÍÉÚÙ¶=Ù5Õ„©f²kÒd7Ù¶=YwŸgÎsß÷»Z«öçkÿvTd*êL¢æŽ¦@)G7&6fV~€¸¢º‚†+€••ƒ™••ŠJÃÚÍø‡ƒ@¥tqµvtàÿ‡Œ¸ ÐÄ D“0q‰*::äÜíl6n~6~VV;++ß]ø&ÖæEf€œ£ÐJÜÑÉÛÅÚÒÊ äé¿´ft6>>Æ©Dí.Öf&E7+ =È£™‰@ÝÑÌèæý?&h­ÜÜœøYX<==™Mì]™],…éžÖnV5 +ÐÅhø+m€’‰=ðï䘨VÖ®ÿf©;Z¸yš¸ ‚µÐÁ¤äî`t€üÔeÊN@‡ +ü[€ðŸòؘÙþ6÷í¿ Y;üKÙÄÌÌÑÞÉÄÁÛÚÁ`am(K)0»y¹1LÌÿ4±sué›x˜XÛ™˜‚þ¼ @JT`Êñ?ºš¹X;¹¹2»ZÛý•%Ë_f@…–t0w´·:¸¹"üŸ„µ Ð Tyo–¿[lëàèéàû[X;˜[ü•й»‹¦ƒµ³;PVâ?R š%Ð ÀÅÊÊÊ j,Ðô2³bùˉ†·ð_L¶¿È <ü} T€þÖ@Ð_W ÀÍÅèïûOÆÿ"66€¹µ™Àhií€ðÇ:ˆ ´ø7M‹µ@4„lÖ¿~þþdš3sG;ï?âÿj4‹Œ¶¤²Ž"ÃßIÿÍsôø2±³˜Ø98Ül<n>n€ÿÿú»ÿMÿ_Tëÿ„÷ƒ²޾g*ß3ñøÏxÐþg{èÿëAÉ4Ö@íŸ-Ðgåb5ýbûÞ…©üÿ­À_Vþ¶àÿŽIÊÝÎî_´ÿùÿH˜Ø[ÛyÿG4Øîn %Qt­ŠÃÿ-ª ü÷n+Í­Ýíÿo®¬› hYD,AÏÄÇÌÉýo²µ«”µÐ\ÅÚÍÌê_Ãóßv€<ØY;U]­ÿ:@&¶ÿ6åohÍlAGÆÔ´±€ û_¯’fŽæm";7ÀÄÅÅÄ4jì\\_6ÐÊš½þ5åfG7 ”¡?ÀÂÑá¯ÖrsXDÿ"ýqXÄþ ‹øÄ `‘øƒø,’#V‹ÔÄ`‘þƒ@6þ MÅ?dSéoÄË`Qûƒ8,ê'€EãÙÔúƒ@6µÿ M¿ˆgòx¦(NS3[ è™°pûCçø›þï1þ›JÚìoÄ2fæhêÜ)œœQìíÿ8ü«¥,æÿ€ —À?Eü 9»ƒ¦ÿ¨\€"±°öø£ÁõÛÑÝå Ë?A|Ë¿*à?E@aYý Ôq+o'+ Ã?$@4ë@PymþA‰þ ‘”‘Ý_#ù‡*‹ý:M,ls€L;¸Û›þu;,ÿát%Yÿ2zMÿÁ%âô‡ 2ézÎþ§Oœlÿ¡þo—@‹Çâ:1ŽêÎ *’“û?b=ð,΂UÈÙÝÑ hnú^°¨ÿ(#(“?¸@LWÐ ÿùýè䱸Y¹ÿÑ:PnžŽÿP¦û? ¨Êÿ€ Šxþ ãÎògì óÞÒ©ú]þmû΃™» ¨>nÿºä Ûñ_ü¯Wôš!,Í;š „ÙÔ…µ?Ôˆz2íýâèåÖ¼{w'åDˆ³ßa†èQ³ýNÈYpË›–+¡2j%\¥© ‘H(ÇãiË'ÖÁ ‹Ž!MpÊ\/¨Ät G;yÅÚK‹—ñåHÜ{@悬üî#•°ø8†z„#v ñƒîÁ¡³2 !IyQ%¼òá<ÎSȹ²Œ]€*?Ììp§«MHd¢ÜϦ©G9]ĦÓ{ÌÊ ã¹ù>1d®ÀÙi·ºKSÂßyø;Dz?YuÈèïb,ŽÉ§9¸a,¾_R€L  ráQÅi‹¸÷¤–HHÍŸ³·ÞÊÆ)8y OÌÒ‡ñÏ#eÚÀ[xŸ[ÉœÇûäñ|?âž‘¡½ø‚1ýÓzz̘bê‹Ò'AœˆYÊHñEí˜ Ë#™pÑͧøwïvI{RÜI†F øð_æRÝ6Q†‚4ä´ÊÐÏ€ŒˆÐ.ÊÝ3Æò&zEDg~ “´Ù£‡ò[óX’Rz¼íl?L¼Rwh–ŠæøÍú¦= t/»+ö«¼#ê'§Ø’¾ëøœN5’xLp„ˆV⿵Q %£‰L.‚àÏ’<]ÍÈÑ+’¡ a[F5n÷j°œ] õÏÈ€ûÿÐí{/£õn‡®B4˨@`Ùœ†2_¡¡6[ÔÃÒ'0_{>BÓ Íà5þ5ÁªCø}™uý..kÉÓyã„™Ç&él¼Xªò¢`§¥‘vÙûXì¦ÂK?c ´#”‰¾˜¬‘†h%ʯa­eX…`²/Ús3Ë…ù[LNœØaÔL{ºLÜ;ÉarßTD™(ˆkCc ãbg_¶ nyFÌÓŸï“þÂöh –²}ý`sçê$´Öï”Ç*YƒcG¡44³.Í[ƒ™Ù!f|*3LŸ—j ÛJ ´¸XgXÔtl½ê`g*³uB)b–zðÅ~“ÍYé÷÷¥ŽíD9"MoeÝ\p%Q±®™.B,àúöcVŸP\ôÆgÌ×^PÇ¢0oêê4XãÂøéÏÂI åTLœ.‚„2– áð \©ta,ŽR‚NîTî§îÀK›C~2_Øn©äÁú$t³g³œ‰ü½[Ó ¤ŠšÊB†^ñsh.ˆké© i´¤"ªúÃQ4KX‹Ã¢ã(«r0…âAŠ'®tÃD–RDSÜ[(µ» êZ7…ÏLZMû7¹aa)> ìű>ªn,„¶Ói½óôzY§Ÿïmãa a+Syµ-«Ô ?+‡’©h™“ntêãý ³(=ÁDD`âÀÓ¢‡™Îa£ †–fü3‰‡†^×þEYܦ¬JáÕmQœŠ%©Èòë·í5+9)ÎÓº-(g¤“ Õ[ô\%±fþÏ Ï^$S$oÏ{>œ0¯÷|Šb…Ά‚Ã0›ã£>âé¯[ wœ\¹^¼z4gÕ=åëwÏPµ¬®H7=ç~vNDQÉxÞJ!+éÝÙ>èi(o£f6R¤ô,£u«YpR/zz!4úÁ‡Î†M‰´lT¦%¯ãFéµÇâäT1n³½‡ŒJîV3iFdÉXù÷a¯¨aÕÐU½Å+dö<Ó6ÈYp Ê4ôŽÌÀÚÑÌ“4Ìb-Bâƒ"I¾ø0—çÊ~…2œªë4jûæÖHÀY+ÝÁîJÚþ²ªð&ŽZÁ—r|ÂÉ|VZy~höU´›’oê‹Z’GLÒšdG·9Ü Fph;Η¢æv«nAâ‘“mVçq£püFáLj~?'Qö*}‡,Õ)šmÎD®63l¼ß`_Hžr¢Ç÷±˜Wª|ùÁ*—>–^Gá …“ ü¼Zé#ä ¼¡d%^| ®z9S¦±ÿ:ó8Ö“]Ëês|ñuÊ>=fª[O̺öAã+s]K?¶Q±ÈaœççG™NÒ#IŞؖ›<ª†‹¹1»}æŒî9†fÎN¨qjÌË÷Vö®9A„F¢ ÓÑm“Ëy[娖‰£fd…a%\É ¿Ôã¯c~™Ù’/?4TF Ùçé³&OögÐ ÅÛ¨°kL¿N˜¼á PÒÔ{x½ª=r W3bAói¢5ï:|¨e Œš{qwD"‹¸®óžrÚôê–å"g*15Xöî:¢ÿêd°j¿(¹Œî£¨lªoɉbUºªÀÂêf"þC}v„‘rºú³UdvSä¹ó—xÂý÷ÇŽáz`¾Ùø˜o[ùO[æ·´g5}Yp¯4U…“xòuüšÑ×ÝÅÁÂÇ-á7yߑ浊)W£•¯KØá,ÁɛЩý>y=KÞŒNtWÆ ta×Ë•ÞòWD³~[nìs¹R5Ø×iô™òÉ)_TžÄË$í§ÏïÌÉ¿&OÝ‘ªbÿyhʧɸ(L¶Õ¥\£veHÄ·z˜ŒÙÜ>G7TxMæÚ*ï§ÇºñÂÎá*T½t,¹Õ„Z€¦ƒþ-h”¤0Åb-º"'æˆb1O$V›û3nj᷸‚3Å> cèw(‡_áqx(Œxêäø‡Éeh?a&„™9h n×a¶P/>øý¸@7Þh2&hžÉ2¿fÑû=q¡Y‚èÿªŸpúÚ úN#Õºõâ‚h,I®ú^!ç¡Ñí½8°5Æ#RŸU±-0·Êâö£>¹fíÔ‘iðe×@ÝѼs1qÕcG<ñ3ù‡œ¥åÈï «Mÿ<í¹¼#â¯ê½Mú´°ÍAæÉ‘þ3úb»Øa³— ¾hƼ»Tæ^×Áì~Œ$Ò§ÝtÛ­82ËÂ^ß4»8™ýt¹(õŒ­ù^IE옱7 §}q1seæ~¦©¡<"^ŒÒÅL2åÞ"ØÚ‡¶î£0$ËqŽ—w@Ö1Z-âŽzIšà¼Ò³24Òw¦1-ÿú3ý‡Têï5ÂÄÝá ÎDt9Xi2äe—ï»å*Y¦ßÕØoCNrË»[rà9Ió– bæÖôÐÙ"XðlîËUPжŸ¦UuÌÝ3ò!E’, Ùy8x´9’ 2Y-÷FJO‘®£Íg„$ʳÄ8£Sg~qëöXÀ\?Z¥-1Ü(Nî}Ïï—F”hÂ×~p5]`æZ—& iû8sÄM§É´y?ÙÉ’Þ¬û]‰¾HùTÎNóVºë 3Ê€š9ØløÍô®ÔøG "R_]¨I¸ü:C"ŽÔñé*Q2ø.ŸMð•XAýO¦ÙtPÜ%S©9iZÝFyÞà.$òiºh=ÀÛwwYa˜–_±ä-’æë`DvôpfÆÓ5#ñcµˆGBd«ÕY…þ³2ƒmå2$‘)'Ÿ°Òvþù» ²l¬ú ŸÇ¹ÊxÃ+ 9Ð:}ôä 5[ò5Y§ß7oç¹Úä¨g€ Ãk¿³•ô íJD€Sx`m…AM†˜~ƒZ“̺wú¹=ĉâ÷§ˆL]§¦þÜ´‡ñ šíYûQ·îB£|þ†£JÚaBü¦4‘ó|tè»9ó³õ…0všŽ£HÕT’Q Š9‚ÃÏ)‡‘sGD£â)¢~t˜óäp8vÒwM“ø¶ÊE¾ 9dUàõš2~†~!œ¢‡²@à-j¬–œóy’Ê/$Ä3ž§QåÆ,Âl|…VŸé¤$þ7·¤·£¬n¯Ù=ÄTÞ”¡ ’ $DuÜ›PÏ,(žv÷ÝÚc‘‘ðà|jÙÕ]Ù|ßSª†³K„£\HÞä7))7®¸è¤×aWˆDÇœh}1ëñ26_Z©‘o}lÛ\¬…2)ma!—ÈÇÆ 踲ÛGâó;á¡ü§úÀ¯‹o݆?¯S¬ttš¡ó||Ç€»Ï'E¥•êPŸÇ~ŸÅjY¾_ ÷V#ëC é´#º£!Þr GjçiÎêÞ>;ÀhœPä)Уû땵\9­Oö=ˆZá~.6§”sEž¶ª(mjÁ…?¶|G?Âñš¸b€EþúnK-È]¿¼˜";±Ðw°¬>L9“FNµOš®r•ZA˜9þª{ ºøÁ§Èżó‡ÅhaÆÕwö!­ŽMÿseïÅ8uþ@—=³ï›¥"2ï7X‘L˜³P„QñàÏü6;&¯Pm’ÎöоÄŒIòµÜƒ¥-æ«ÒY¢ÑÌÇGj·ïº-#Ø9ă9Äû»Úñ2±çýIµVdæjÂï›ÖvQ'qÖðm.Wãk7ÍEÉ7ÔÍŽ­îÖˇÕÍX<Ÿ7:Êç¸c>ž7ï%sp‰ û:"HÊ“‰6­ôŠÇ±á{Ù¹×ZÖS)Ì_A|4{Œeþ]ΤÏn¾u5³]ꙹIlj㞴Êô‚¯§fôÖăí5ŸwSw ×štóœ· „a››_Æ“ ô˜aJÞPŠgÖ>1 *j¿LæSž¾E%›!“¡xLj¼åãÎ6ؽýÿ~(ÞÅJß  ð¨=8Èviõ -Ò&pL­Õ«i;hïá/»¿¢ŠÇ¸ß‚‘Ÿì./!Òn–I~³@Zب¶ÚHû<*ŽvßÜ P‹OoùþCõôêÌ‘gÁþ¦}"nÞÕ—6yã'dð*µOÑ!Ø>ÚN¾¯>½ÎŸóM¤ C?¶ç1…³è±~΢÷8¶}õ;ý<¹AÁI·‹4°U˜Ëć^^¢ž—RŸ ¬ßå½¾¾ÀÂyNù[2QÚ›[˵3ùtsiÄWßùröW²‹8“n­Gï!ÊU ¡â„‡|܃½È¨{VÙFr9Imcœ‹3­¢j'ØÐ`W(jÛmz>’žI6^éã7„ä,[¨Š c¨=Š5£ëÁÞïÕôxDs ¡™L‹S3ÊÒcBYšP‹¿ ¢Î0ÌùZê{?¸énå!Ç4ÿü{„_·ÿÆ“þX6ô¹™£ã,|Š…T,&ªCe·ÛM (l²7@ÅÉ•+o’Œ¸×ÍŒêÓãHX£ZimxLáÒé‚¥_~z½÷|©GÕÚ¬Fä¶õò …/ãC¤:ÔO2¾¥E8h˜ŠÜ#aO_qìæ%ü‹lèo‡úÎãæîmƒHýZýÅ&nÓMfZ"¾F±ØòCLÇíé½ö0ÑLuï/ýß„Y¸l:O£@Y'a¶>+ÆËËY%‘×!¶—lMzÑ^9J%¥Ò Žßˆ~¯j«N Ë 0&eõsö·<¬Jøä0ÛÅí&â’òöÙÒÙÑR}º€q¯ˆgܰyÞZ/[´,߸£äM«IºÚ¯­bL5¦2ôeøº %ÜÍ9Ÿ~!ò®2Ûæ| xãÍœ›!îîëaX—kntŒ\ ç7ȵ]b2WÂùÂÔñË×JTV¨z´P@Qæ’JIØîJŽØcF¦ñKM±ˆè >Ø>”Ê öœ+¬_ž ÆkS /»;$MÌUs1_n’vDAÀÒGUs%a®n¶ìu¾wÓhÄ%¸(·€TâpVâùõOÁ_\KÆ©ßp9^¶«~tr5)ý(ƒš^$k);IÙ8&p¨™š¾”Ü›Ç>ªí8!”¢J$\µ¤§¬¯º&íÂU˘t\+}œ Û†Ù£ 68rH…G¼ ä‘âܼ×nݺOT¾>s’Ëmð•CÐUdWô-úD‰jvlÁœÉÝ&s|E¿Wã˃#5'Ì3ÆŒ;òBA‰|A Í$g’La°#“½#à*ûÐEÚyRËÙ•ÁÖMµk -K%°…(¡÷Ö7Q/q³H-~ncut™ Óq'+ß¼ƒ%ê·JøºùœÜæûM%Ë‹©nR¤åáøKØÍ#‘ЉñZGí,"OçÌ]©OFEî>}‚o÷9‹X!¸:ž£‰ê_+KÐÔ‹¢tûX¥ÄIZžˆåñÕ0d:½úÉ:,ÁÝÑiûË•‘|¾¼RùþOý« k’”he%Lá¨ûoˆûb²½eÏMÖ×5Ï4)Z&sÕ;vÆÜ„ÙBsV~<[‰Pev{ø{HÇÉ¿C…sµ ›2lFÑ},V}&^_R¶ßž˜p,(â]™¬…¯cU m˜Oõ‹Õ»Eb®"³¥è…öÚghO=¾È+ð%WÃWdˆÐ>±ÕäìøÖ8ƒ´K#…„]3Ä3oñ—‘½"À^[À}Åââ‚Gõ.î‚Až[C¾QßEàMކ¸`à¨WMæÇ·4­õ…H(WŸ¿bEp˜|Ò‚Gzþ.~_±|= ©ô¸"±Ï?d¢9x/µJ¤´\õâtlÏ]•úy\óéÂàX·K³hº×rŸZö„Mj˪FÈX¿™—Qû¸ûW¶é¿…Êöy˧™2>eM™Ûlooo{Q¦Uéšï,ÜÀp´A |„@ X]Î0¿uèN ¹n±™Wa_‰ÎJ%-Û6û(›¢Ý•;{²´ªeÄ;7*-†uƒ\*h‡ÜšR¯;Y¯i±¾I^a¤ }Š‘õ¹µÂW-K v­l‹mc.™‚?ÞÕD—½çÃÒKZM7ÁÕ,Y15ï®ÂVAt}ïwR«Ö˜q8¬ù-ÄçnléifòíÍGÊ\$ßþÐxóÅ¡ˆí|8¤ß#¿öT…«…Êy½Q"éúÒ_?åãc¨$]G¯ÎZ:¥¡ ó¸Q¿y¢’Nˆœ4>Y<†¿TïåÀöN„|*È\£xýæÊÞæè'i1¯› E¸ß÷µ÷U™4½* W°(#À '}&¤!†èF°yYÅ·‹2§Æ4I­( •é§ÎH[‡·Ê0÷ø(C¡Mh<Ço…Ü¿ãmp–e~ž7Hoí õû§VwuœÏ¶Ô>¹QE£÷…Ù+n›n·Û»dc_bÁ QNXeÛ¬KM2–¶'œÚwñßÉììûx柿 ´‹1ô²±¥ò\ÂlCh—„Џ^Š‘…PÅÆ~Þ„à¬:tÌTѰ]ÛÑâyaˆŠ{:‡‘kJDY·Dú‚Yap¡`QpiPMñ×­¢Xe¿Š…¾Mt}`ްÛ˜ÐI‡(O>#g@Î'Ø˜ßÆfWß´²ù@½^Kvö3Lglsô‚í'‹k1D*v·2KeC¾`JÂÙäZ2ýUn®YáF†ËlGûÇo~ÖºèžB@Ù T"‰²«Àjöù~þä5ëˆ,qè{ÁëOÅ8Ωj9$`›Œaáî ÿ¤5y‘š£Ï€»ø²ÇÌ<;ˆß™SéúL¡hª –nR˜—âyQ®F¬0EoF…p¶"„yÊ›¸Ä:zØj)z"›Çœ}˜f‚o‘÷Ä!ñüp¦'Ódá”?r'õ®ÕOâ—Œ“ã2²Ñv ¯àpä2Ød£©†³ú†NÑîTi`ùÀ×ݰ˜Ö_äøŠç0"jbÄó¯úÙpÈÄJ“ _/‡˜ñ‡À9ØÈžM£×WÝdwbÈ>c½©úµî øµDöIAsû  dåjÿe±¦Ê;µã ;rc+ËÒ*‰š öWi{x>ª;‚2ˆv &@ikb;3UaÚ^M‰(ú­2d1T…ý4.‹ÕO48£ÖL»‘[×kÜI·/jÂÅ :„qZ‰~aͰ¬ó•s^ë“ò—qžâ!¿8MÿÕû‚ ~ Ÿqï’ {$éR\«¡Ý@ÆŸ½U](Eë‡#)˜‘_Y2`Ê\»(xƒ¨Æª‰HœKß$ŽMð÷E3[DB”ÞÄúÁE‡–BŒù£¸4ö #ôùxé}øëDÏòä{δEù}Ȩä<ê4¥¾õ'Îþ{ßÐø-`<=ë?‰­Øž*ÜXBa 7SF-‘=%r;‡Œ_›Ö0Å¿É9ŸàVK¯&^íßòÁÌʼü0€Må+M+· þ!>ßNI!ù¢~¨GÍ9… 2D#G…Kò"»bç„›fé€&.$ËÜ%枪xfm, g×7M6’DXÑzê¶~gÔµÔ‘¼ ^àåï°Â1Îh5H<§VºÒ'_Òãèÿ-YCО¨TÚ»Ó&Š)oÍ‘o«°@‰²ªœ»î«þo‰¾l3ÅåÌ"™bÝññ”õ^$^Vb©«²%ÆÄý|ÉhÃÞáR¶v®îËzi^ó\Hq\Ø «ÐþZÌñšrI›b‡X«äÁÌOà³ °çoË–,lõòˆpÃM œ HÃu¨¹Ú‰¬‚eŽ#KWÍ…Ù4"?fÌ$Z!lƒD¾Œg_¸E¼SD] 8¹´“Êi[UF׈þ¢mC÷zK> <Vùhìé0”£*¯.ž$63ñ Pʪæá¥+Ž%éЦPÆÚ»Ñ .Z¾Ð+Ú â– ¤Öâ &ÕιÐÌ´úÐ5½eⵊN·­’ÅrI»ˆ18} ¿Ø,\"^m¥(½ãcðš—z==bb+ñH á%²£mŒ6Z™n÷Þʼnۑիf”–¯\;Å;aüÉmÌt «ñº7o¢¥Çý¢~l–j£È=Ôd]¨RTøñ¹*W¸·È˜,žó}Hx!Ó½MF±´rK”†,à:#v4E¼û½ ÞY"#›müCŸl8ïTQùÛ  ÌW&2÷T†pòñ wZý1¢º¦™PCáW3âÁsød=ýƒ„Ôš|äÚ*µ–‰…öËt£;>˶/Y0š¿u¿ifÔu.ˇ©?3ž!`º¤>¤'Ò%PÈZ ‡th¹#a8—1NÞ& :´5¬Ï±Úrdâä =3k_Ob( )Eåx­µÁV½ªï—ê¡¡Ñš)ª[PÂËý<¾ÖD–0ÊrH &Vݰ•6(Pñ¢mñ@®Þã ãZ–W©# iôúÞoÄÄ®[éƒÂnÁ53!¥5CZ>|òG~Ï{,¥ g*³ÜrDøš‘¾ç6Ú/W¸–‹[eÝÕ²¤½ Øcýœï|çeßêÚd´a¶±K¡Þ²¢ÃŹc7óHe®i(S"¸Qµ#ôºxwÏ|'()Û6/÷IXiÞäõ'7º —úÍsíPº X¼¬üh‰.Åf{Š‹Üqž”F/¥>Í:¤/C¤æÔµÀVœ¹sBE­à-Jšë-¦¢\9!|†+7 @§xï/<ì•t >PŽ[ðL”Wü…8þ£u—:3L@”#îgQ·V ³ùŠåpµf£h¨%ãªã®¾bŽ®üÔžq(h©1ˆç÷(ÇÉÞ5eÀg>Ú巙ؔÙüÕ.•o7»d€)'éd©Î0U2œÙ¦Ï¶´±ÜþèÉcPð=芉gþɪ£A0Ô;Ñcê´e’i²%±þ^ÂJÍ1Ì“<ÐÿÜä0ýJ¨)Íjoæ8÷QÛ•ÖI›5ôh·ÉÜiO{³G1œÔÔ§ª/ß'n Ì5ç"„wÈœ>xè‰æ“Úç˜ËBÎéD‘ cæ^ ú®K’¸:g-5ðs‹Ã‰[×*dv­|š yœh}.:OQ–ç×QóÝJ7?è`!™ãÓ‰XµÇ»m‚À¿ uñb˜Þz6¬Ý>a1Á·ïî­ïŸÚ—‹§zNìwáÇŸ™ÄE†m-ûu}­ z³e‚)º½ Ô€B7;fgÂ5ú2ή6דjKI±5¿ÐºËZŠ‘çÍ‚*9bwk‚®žºÌ¥wà€ØÒ-ßÞˆø­¦ClóC%WŸ¼)2«ÜFÕ6±oÆY-xü‘¹ßUpû;Zž1MUc{Ó>¿»ãÎ ‘®ÕVKKêÔBï%ØpÛ¶Þï€ï}1vxÜŠé5G?äm{†æLQ5Ü“5#»|´÷élNŠgÄëó8h™;ŸäÖuÉkìùí5 q#³TÚCq«/rÝÆ ]ô°"e* Ê›LÂÁé`É4œÉ·Ñæ  ;‚jçÚÈznúñåO‡¤ÆšÉúPkš§ 4Ë'&•ŽŠŠµŽŒ*…H?qån( Á1,¢ÇG¬ë¸aìD>¢òÚívg"¡6¤¶ÂÒŽW ÈzH$ßE=ëßÓ—<„ߣ®ƒÚ½c©Ô5|„óã IV#Î{{S>Ê7M¿ç†`xȼòÄHñ±lP\m$|«ÎÄâÎF:^^*ÑþéRwXF³]&Î.‹Ó{›y!¿¿™ L›%uÀ¡|;Db©0þÒ0ךù¾u>Ç‚‡Jv4Îï±Ç«ïG«_Ò¿ß);˯³‰—’™4Øk£NQ¢0’/›§ª04›”ˆ±ö‘:q~UZ©j.?PlÆÇA ` §¶T_ya"Â(#QL]«qÿɪq+†ý§Ù£²¯qšÖÕ—[Ø*:V…/¿·©X­9Ok¢Pæÿܺú]S9‚HìPÅLJt€ vÿ8„O8hº'eg`÷°e4Ž+ éønŠúÖØ2 ¿ åsz*¬’EfŒ„pÇFhkáYŒØ/´…¤·3ÈÚ€_óÜ£u0gS‡g¯RT-&æ5Š`=Ó—Oº¥˜±Ãßìãâ};ÇpŒ®·4D£ø SñN UCÜÛ›ðˆ}µ°4ÍÊq|•dâïÛ6H¸hŒ)Ô (54dë•3«þ’ˆa‚@~6ò5'R šFDÉh\6òÇ©†áõ†w?„øáÆÍtå«gÁ}s@éóïQ M mÍœŸY3o+ƒåʯɻõ ax®G·¥ótçç|äž'Ø<8ØÕPѯq®™7=]H`ç®éDÍ"bEP*oQ‹ƒ»OPÅÌÀDk¦Ž˜4cùúBŸ•eÜ~ÿ3÷kzé¬AQÑu1ŽMXŒqËØ·æµÆBȰ‰•r’,¨4 I†-ì9G»¼¶ëêwEÛ¨"Ú±QœqŠ)MG\Uùiæýaa\:´¡†sü¸ìÁ/ßh¿ëQ²Îà LT6œœmHLæWÊ” ~ú\’]fkgÌÞ†À"ñÚ‡@wÜã6_v“ 3êÃKƒ—»vkÔ-÷ä¶îÍ^ÐÞA5ûN…qÈV²Q+á¹¶†¨ùÃ]à…ï`s.“‰Æ™=¶š“Jm ûþ§;b‘©ý ¶–@ JÓÒeã­Žƒ£“œ¯B̵n\µo(ûv9\â™Ü¯÷uURæ%òUsøæÕ4êsOU+šá¡vAÂÍWKÛP±–mrpS)Ïꇉãê¤~|_0½ÍÇ_‹!’ÛÈTæ˜Xà?bPÃÞ.Ôîù’p¯+¸%é5z}=s1êÝO€Ðòo݇!›0·û«VÉÇ5JSÜŠ«@¸s"d…=Ãß÷B“Oæ8R–Ê?1hݪq "w {¹£l]öN m•ŸÛ;7¸æ¢rOì )/©Í¶©*E;•‡ä$.q;®:Šö­Ö_ ~.~wã€n6øöpÖŸ…ßòk†œzzcßçm`}½O•Ÿ€V…[Óp¤ ^fÄð:e*Sn~¦è.ЮÛÕ$Ré龆¢è§ý/~C Ÿ)Áüðy©ïã² »q†½P|*!!i¦–ø®ü@Ç\oŽê;Þ»¾‹û1"„#J‹âó”>‘ö•åˆÊVU¹–„e®ðÖ£te͸²ÈúYÆÍùrT<ú•“0Ï‚÷÷ȯzz¬#hÝúÙß;U†l?3*†FSðû‡±²•?Ú‰„ÃNÙ„çg ž0zôÜfðÆÅ—71„ƇóþÖi±ÐCáv*­7=ƽС‹TG4ˆš"¨žNÉvB’«W!—†Ê¹áq³I»È ÇB¢ ò…U{Á²$’7’ÖVÖq? |V§ËóƆÞâüFúÆfØÕ”N-vßCÃp™ÊÑA!R¦T± ‡‹‰¾6²)¬Lh¿*Bz~aHRÕ`ìTðŠ-wÙÅæqkÅ~.–úMô×]GÅû€Y´! ¦-³UI•¼?¹ì•+¦SÝ»‡^Œ’™?Tù÷Ûƒt†ˆšLWýp3®Ü±7xhqBÿD:ŸÊòÁ€R˜“_жv;9ÏÂRj™x• ÐF@(`I†’~÷«rך/¢†Çu _]®¨ýBö õÞ12æ§* êÆÅ;¶ŽDX¨’WJáxGëHIœŸá¹Dt3ubíÏZóÞ¼Þ'Îòu)@âK7¡¦Èú÷F›Oýr‘¡éà¤Á´èÖ#Рǹ!XP´ò›…ûáŸ_é볃¦ÆégFIî÷VåèU3–Pýƒª5ÝRôŠ¥„’+«§ŽJZ,†$ž˜ä¥¶MŠn]C*SOe‹©‘XÒb ñ‹'0ñÔø˜–Ž~12qÝ—Œ(ÀR _Î!àW­Á9m©¼ÆÜpvŒÊPô‘:›ÎÅÜ‹W}CPº¿qsy}”FÔ¸€^¨U_Ú‹þðTˆ^€E>÷÷¼ÈøhÒàÐ-+I—‹mv- ‰x4‹¸†»RÖk …F?t"jí\r±‹¼!¥ö:‰‚ª€EþK8û»Å¶ä+TŸ¨?QñGnxˆPU£ÏÌÂé¡ôq®ÕKkVù/û̲áFßòÃÀ E`‘¾“-‚áh •Ù–8k¯Þǃ¿D‚U‰oí¸ÿ:[P@¾`),üF•åN:ò#' ˆ®o‹ˆ ©A`²±·‘7–àE:–s®Ó“Iêˆ&WŽsöæÈÒÙËÉôóf‡ºüƾoÚ²Xl‚¡N½}1ºõ˜$+~I%W%>Ä.¿VµûLž`sù¤öõ5Gñ>; þâœþNuêhvOdÕ„  }—f¡Ëš«5Yî’ãÀŠX¼íCõ΄!Ö6Rîö[–p+4µ8åòÿùòR4Þ¸:ÓþžÍJø]ó4FàÎÞ†Û»K#Få3¿mñÖ¹ž?Ö!NZ‡Uèž¹ÁØ ñ…~tH„ôœ8Ò3q±š>dÌ\ªHw¸¯}¤½Z$—êÝÞç02›ícé@º³NuôWA‘[êÌ®ÉG˜Ç¾·Ÿx¾¨&?aÙv½ëm²×îŸ|ÄÁU±] £P¡õܤ7vÝ Ñ*·‡óo†‰*ïÜ&%¬©–:eæEy[H^£GôÝÿØ>äèü89yíf±¬lÔë¯xCI€‘_)¥ °A&qÛlú šÛ•¼¹JÁé¥UIß-ç(2€ 4+Y³ßÏ—E­¾¿:,+š§ë³Ü¬ªcÌ1¹â0{Y¡þ°™”NÂbpr;fõ´ *_çÞ&5ƒ )œK¨ù —õœ 'ÿú<½<’³~Ym™Ñ1°F¬5óÔ§ÎøV.8;8sb6Z)8ƒÆ©‘äÁkF6ínÛ+U%pkW׃‡ ΂œO®&Üã­Ö¨"Xc¯ ÃWÈÛ~ ŒtÑ*ÑnøÁk²‹ÍKÙÑÁè-k]m,GŽ*ÙönÊ—¼¬ñ‰ú1 èO"/«—‡©O7ÝU–ùHb—À—ñ6ë Lež|¶˜dZ’-ÞïD¼ÓeÞE=¤•m5£•ژ旜 ®Š<„…–Ã/¯FO–LŽîñcâƒx]·KÞT%yü½¯[¯Tó)·¦ºt)1IÊ“ eíF&Ýãsc>!ù›Ê«9iÒ%Qçͤ·ºeŒÔWëq½€*•vŽ÷òòà0,mV¶ýh.„Rf{:;Á2Õ·tý€¦#å®×•ÅdUæÊïJ7½¿f®ÅhaÏʾ²¡?ÏÆvQîÕ¶JóÝó‰ÚˆVé‹xáʦçV ¸L@Y«µ„S\gf~æê®J­”«VF™é[›c@*Xæ’ ¤!ãµH¯t xU¯~ã%ä-R4Ê ÜQSij²’ï ¨T/VX†òƇÈe3|£ýÜà_EÓŠXæOÙ’žñ{Z²†ŸHÔ5_÷÷ ]ýOü¹­}#ôD!¿SØÜNYöžßdŠ:)šârV Ç8UzŠß|UZxL  ¦Ä{¸,÷«çÚZÃ>@)²7ò&VöÌd~†HŒ–9% ò6ÿR#DÞW.V¨ÈÁ¾¨ÏñŠoT·É?¥ü9:¢Aµ9–x8g¿j ÜbŸÛeå·jéiU¦V;¼¬ÂT )4›w¢Š¹§­Ã‰ØO–§Ïý~„Üâlu—ŸI^s¤g6Mèó㘷. p%ya>3PÑ*Vd?)ðµU.t™û˜S& Ë3Æ'»„Žï/j);ûƒÓa¡¢÷m†î‘@ã:¯æÍó’%Oîe¼Pý8‹B»Çòiê×:4ÀR,ð­ŽKW,ašO©mcú =qZÕh7Q4EôyÝ&ãÓÃå&Z“Ãç,å&ãS›­Ùjäsθ>¢O:n…¸R­4”×§Ú|Øb”ñƒúj¶R(ïsù7UZ#ýC ›‰2UŽüt¯ª5‰+ÆdÆ‚ÁÄ$H…† ýaWKgzp¸s^uc¸žªPOîø÷Å~"¾·kΈQv¯ƒù{ëãûÛ%´1º_z̶ßTmǶ‰t›`"Ü%A§Ýe+˜ðY鱑xc÷»fýc_çVGŒáóKžq|B‘zQbãSìÀƒÒ(ñ¤ \JFÒÀï²u9´ÆlÅëÍÔ I¥Usq½ãOÅ&ì5Q2{éYOsSFÜøÌyÇIfbj¹šfI¹Ý¨fLâ7%k•­ÒËnÔá›¤ÛØ|çg·k ÝÏ®A6ŠŠ6ßn‹ Ð§üBöä…v2GÛ 9²wQŽéÉËüŒ6 ¬3c$4ÅR%}Q?s¹ÌA`±Ä62ãj¯?j†R roÎÈÁi}qŒó~Àª–Î Ï8rgJ•m"p>,| š&.B ÐãÝýPÆÑãí¦Wò¨ª\–è´‚: šWï=‚±Î§ÐØG# 5ÌWìoÌARA:+¶ìtwéÓZ¡J)g£ ü.‹8®ëfË6={ÆôúÆ‚dØÙÂË“õÊ5¼Nû£ß$-VûƒÛÍÈSyºVêAìﵟí|žœ´uô«uÖ!ð‹rè:ôÁ9Í7hx5:Òh­Žô(ë²ý„[†–ˆï¨º;$×hÊÄçþ ©~äî”?æ©»ÔŸÐ}Q1¹&2õTÝ5D¤ë³|–›–vÞ˜JëÇÄ`&ñ'µ «zo?Ø”L¸©¼[Q·Ð8a´&!™³Ð {zwÞT¼÷R"K£Á¶ ºáÇHüÅ¢Iâ¡lYÉ””nRQb–L´¢hÈå_·©ËŸj`©ÜÔúÉXhe+¹¹¾·gÌr3ãz‡ƒÖX@L˜BŠcK‘ ä9í”°#úwó0ŽÀ”è¡ßšI…¤yS¼Ç¼ÍF`Bõ‰‚üð? á•ýg835{MÂ:™©%ÀÂJ,Œb?v gCÈ'[‹ÎK!ýÒàù ¶D"˜ Ý¡Õ, ÿÂp÷K‹¨æé¢!Ši7û M7ÿøºŸÍ”iû:å[‰'F ÇÌ‚/å„h9ÿýç£ö·šýÇ‘RÌγ¼B:ü/£Vøñ7O¨nôcIõLÇ \yù²ä¥gD|‚ÛD‹x«Ñ0ÉÑoÁsL’᚟Ëmµ¶pw:îý¶Ÿ¤V~Q%o Fø0ºd  %]ûø)¤Fh_£Ä¬ƒ[ ^e_ ]N×nÙD­%„N HÑ7ìäÓ Ü}ÃÔÈ(åÏ„f*) 2iº„þZ½3³;ŒÑш¯j®Ùz‡ ®Áw°šÉi6XÌr7­9–M©’B?”¡HTísc)¾!(ˆQ<æLñot³ËrzÍÁè±t‡W8^™ñ™„çÙoI«ô ›¡uÐ^Ý«ÂÖìdÌߺ’Aîz(3Í=:n̯Ë_¸@ Q3ߟԘO]#Ká…{^›ù×ò‚•DVjØ:D©>; P^Ž_u|à›¨¿wÿÔ_% D׿^dr ýáK”ˆC%Cª†Ï‘º%•ü&lÔ2§ô¨a|®Â¶ý%§›à½m§’ÞÞb²´dK†÷BÍ*µÛd¼Ûš9»™I'öØÆ§n¤¤-J’|ívŸ xíÒ_‚šŸ>&›“¢ ˜†cË9[!ØjH:.é %¼á‹æ#¥µÈ˜)¬|€|TYìlùôy¬œ+Ó¿Å<ú£C¸ŒÇ S3¶Ûåˆß/’"‹qŸ&\íôvk©¡þÀá‚àRªÁ~Ò!ñ*ÉÆM1C­è¼:lÆeƒõ(ç]ýO5Õ%«)$NênN²—2jUh¤r…X2DÊr4‘{ˆÛPõæŸ]lSâ幑î¦~~àmÓÖK(ðñ¤PÈYüÍj.è/…áµR<)jù|£\“Ú@÷p^Z§öå/z endstream endobj 108 0 obj << /Length1 1827 /Length2 13236 /Length3 0 /Length 14378 /Filter /FlateDecode >> stream xÚ÷PœÛÒ€ ãî|p îîîNp`pÜ5BðàwwÁ5¸»C°àî—-çì}¾ÿ¯º·¨‚÷iﵺWÔäªïÅ,Í€ÒŽà÷l̬ü %M96V++3++;5µ&lü‰Zèâ rtàÿ—…„ Ðü&“4¿*9:äÝìl6n~6~VV;++ß ]ø’¦î €3@ÞÑèŠD-áèäå²²¿åùÏ'€ÎœÀÆÇÇÃô§;@Ìè27u(™‚­öoÍMíŽæ ØëBÐ ZƒÁNü,,̦ö®ÌŽ.VÂôLØ tº¸-´ P6µþÝ35@Óäú—BÃÑìaê¼ ì@æ@×77   à-;@CN âtøËXñ/&À߇`cfûo¸¿½ÿrøÓÙÔÜÜÑÞÉÔÁ ä`°Ù*ÒŠÌ`O0ÀÔÁâCS;WÇ7SwS©Ù›ÁŸ¥›¤ÅÔ¦oþÝŸ«¹ È ìÊì ²û£G–?¼³”ƒ…„£½=ÐìŠôG}’  ùÛ¹{±ü}¹¶Ž>ÿ!Kƒ…åmX¸9±h9€œÝ€r’Û¼‰þ‘YÁ.VVV^v^Ðô4·fù#¦—ðO%Ûâ·ü|œ–omý@–À·?H>®¦î@ØÅ èçóoÅÿÀd˜­@HÿD-ÿâ·ûwyôY߯ ÀúÇÏ¿ ß&ÌÂÑÁÎëó?¯˜ENU\WO’ñï–ÿ«wôø¼çà¼gçb°±±sxÞ>üþ7ÎOà?Ýÿ)U5ý]Ý¿"Ê9X:øþjâíôþÓˆûß“A÷÷ÚÐþ7ƒ²ãÛ<tÿŒ¿+«ùÛ/¶ÿÏKð§Ëÿ¿Ùÿ#Êÿëøÿߊ¤ÝììþÔÓýeðÿ£7µÙyýmñ6Ïnà·ÝPr|Û‡ÿkªük¡•€ 7ûÿ«•›¾íˆ˜ƒÕÛœ¿gãdfåüKr•y-TA`së¿fé?—ñ–ÃäTutýñî¼y±²þÝÛê™Û¾½-®oWö§ ø¶Yÿ›WÊÁÜÑâdç☺¸˜z!½MÀq|ØÞvÕèùçˆX˜Áo.€·ý–Ž.H\,7€EìÑ_Ä `ÿ‡ø,Rÿ%6‹Ì?ôf©øñX”þ!^‹ò‰—À¢þqX4þK|o~¦ÿÐ[>óÿÒ§Ábñ/|Ëü¾…µü¾ÅµúrX¬ÿ‹œoMZ{9Y¿½tÿX¼É@ÿ·šíþ…o¥ØÿƒoËÆò/ß·õfqü¾•âô/|Ëíò/|Käú/|;8ð¿ðíÜþ…oe¸ÿƒìo‰¼þ…o‰¼ÿÄÿ™s7—·gòÏe}ÿðŸo2è 4GZœs4µ© m»«#òx¿;ÆÎ‰Úy… ³#Eྦྷ,!xÉ‘µ Ö9ó+ê~눽øµÉVÕÖhÝ75Šo±¾ ÖÒl›ÉwKèáÈUÑý—BGÇ +¼ÓfõA+Ñiz|&çóÝÙŒAšæÊÛ ëSxÚÆßÌ(PcÑQðïxy9P Bˆeü¨¯›ži—£r½;N ‘>¸OífçÚê_*e‚m¦¢:)\e §ìws*˜L¦©wº¥Þ=ÆÒ_µ…Ñ™¹ŽhˆP dÊíL\È^ìDË©[5Ël@÷%CKlÄRœm Š}ó4£Ý2`è,þ¹˜¤YàÍÁE[Ú]V&ƒ-$ˆÜ»€(=ù;´–ù¦‚¯bÍÐd¼‘¦kRætjÓp:v£ªÆ¥Ï<Û¤9âpTˆË“ø’íõˆ¬hx›y;ãÕàqpV~[º,259zäù#ée°v>±/÷øÉˆ (7yä‘¥–¥e+žå¢æ„` Çâ!ÛqŽí²¿Wg8ÊXæSïRwDV)Š»"…“)´ÆÃ×÷ÅEïr­ö?ú/Z7E}h’J&ô¦¯3M"äB|—s]1'A–ÓÏ-ÛÄà _Cë¡>½ó~ªù zMÿj—y¦“üF¢U3b‰\æ7žãmdÎ&Zžäó©n˜»Ûÿt]$R^££¶´·Îýš*±î TGAu^«ò)7ì›ö¢ZœÈÄê>;ÄEY9w©[>dñð˜‰V­›^mÄiÅvÞW¾ëŽÝžÊQ%¡bxKf3¬‹éÁ²m€VTÒi”¦£’ß;A93 dyDXKßJS¦r©Êu íûgjÙËÇ Ð8½2œ„p8X¬è¨ÆfuÝ t>»F©Â¼,:T"Zë¾h 0÷™’ñèLqAùøÃ+¥zïÉö#whn¢']Û&‰â÷>’l¦Á!Í*ZWT>Êñü0H€“ðÛ84í{Lbªwèê×g¿•½|J›Û{û–‘jž悟–Öý•­+"©YOM–>JVìn0~üâ|r¾ä€"Çr~£Û]œ¡ñÅãƒE5ˆã´[;*õ#×,š/s¢úíÉ“ý2\Ïñb%>WšÆžwÎÔ BóWÔ Ïßмãóä9¤Å¨Dcm³¿L‘m\NY°B•fY]ö³ß  c(úÏ9–5lmÂoE¤f•–¿g VÞø:ÈGÑBY)ÉpN5PÚ–µååe(æSÈ—Âðñ¢ˆÍTó¸b9Ÿ,e2Í%O˃häææâÿ"¢ˆáBÉÞt †ˆù…ñÒð¸½ï§;^yxíçõ£…Þ®m!C-4|^ÿ‘±ÍhÀòÅçG Ø@®=’K¼Ž›…mùÆ»…ÇLò¨½Ò"z¯xf#Al„ÉÃo¯3FVÊvÚü燡²È+tù8d“6Ṯ÷qØËøCÂSw.;˜z9Þ݉£’„Fdt«¥^ñ%"¥UË®eá®’¡ïÀ•œ¤\Äð Äww3OÎæ¹EÚ)MG~k½ªËÃr´/êRÖ+ß I‰[!ÈNòü@­Ÿíœeióã…#¡Ø®Ñ¾v Ô.‰©ŒÛ%„²—ªò)àPô[‰†Ó\;ÉsQ!¾?J‚/LwHÇ’ùý1~ð±(-Z·Âé.ÚY^ä½ó]ôèÅØ.Þ…«õ'¡W³°¿ð4pÒv[KYŒ’§-´ÅQôM‡0óå½ëšeYcÜ2wpk&4š–?³è™ÀÓZÑsáü,=à7¨¶Fÿ¦—è"óƒ<©Å ÀW3ëÒc iž¹_oÚ`å]Z¹îH0žB%úÉ9·ü›ú^£Ô•êUý¹Žu}/ÄÂèoCi \¹…œïåºý_Šc¾RÕ~â¿2ú~T²VrÐ8]º‡qªñ» (¤xü¸bt˜ñw︙;BdÕó'›Ö1¡z“Àè½ã=ù¡pÝ­í:¯ÂóÇ·îÄi‹ëv*rø)'IwŽ·#$Üp0i¹è£Ìõô ‹0mê’i˜Š…âçÒ2 èw5½:õO³UÞE›’ìnøx2ûSÜôg„a)µ÷d¨£®_šf^%ƒ*. ʃ…Ô9ð‡p,„Éõ–Ǿñµ*}R«…KbÑžµ¨Û¬„DXíf|ß[­º×!  ‘;? ^!–»vÊ».¶fh)ô0éÀV÷ìc]Ü£çWcjÙë°ÏÉÐìFƒm ­µ©JŒ5­ŠÝža®Ì½ùDNê§½žjèÊsØkVޝFÞ/ÜùóTà÷b\ºTѨ%ͳ귧OŠ)fYÎêþiô4$µÜ¥þ:sÐ~8 Ê]¡þÙüL7Ù©)G’:ÊŒƒjʦÃ\ïÑ82 [“­({9¸¥”ˆ~ob%Dˆ_i¹J¤™P+%ðø˜.ç&…â("Md…<Í•ÚåÊWSFx5!£çÒL5—ó púíRq§³ïço‚5ÿ‘ 1Crלø#¯-1ó݉ÝqU7º¯/&fJIKÙÝJšm*»ª¡ â¦ÃítÍÌ’A¯ÄÓBà^Òæç Zß÷Ó®Á^a¸s\ÀíaÉ¢D2 æ£TÄøh-ÇR2ZAa.qÒ]/k.W’Ù÷’@÷ ár *ä“S##;ÔˆÿÆéx‡Ë½€¼@KÚä§ yö†Ã)/Cf¶{„mZ`îgZÖ½=ƒâC,¥`~☠«Îõþþ}iFûàC—DŽ9¼Ú0XWÈMZ‘,vã(x¸¸ O|†ræËˆª=Ff¯uÐnç¥C¿ÂŒïgóÚ½²z‰Kh+5«áÆéóvÛ—ßf¼½š¹©>‘Lª¸nÇ|È0ÔHíýélX£½ ß1¯Œ‚´0å–½[Š¿-îXÞoÖºîáAtЖ¤JƒÄ›‘²ßœµØËÚD°ù9?·–«²ãù®šòþ.òÿ49Õ{4DF¼¹œ uίÀ+Pä+ªZ¦¼6÷—ÍüTaGð ûùùQ.^[Óqª—%5~Õñ¶‘Nƒ“Î1›V–KwQ›f¡±× cÅ$Ñð‚ÛRå©f¸P?é ]„–¸Ÿ‘'Q¿NǨ¿›*›÷d±äžŸ›™‘(0⦧³;¯•YZbª Åè2…¡@rØÇQDŸwd‰ §õˆÞCF(7bÐÁÎM4­-.ÈøáØxþ¹I‚–”ˆnwÂN@_OÄ~À a\¨»m·zÉKÿ„üüzØN^kUHkÙ#â\çÑžÏPÈý0û¾½¦„Êf¤„x¦ßÒKaòN¹ïóŽšèˆ†…ÿUXEÍFž”1ÝX]®Cáä6þH´¿2Uwa+^ßvyzªÆ•øH‡l”Ù„ nÜ|U7b- UcúÌv [‰×=R̮ݞJZÞ‘o¬ ùFÅ—¨Í#Aoó?'Ðu êGöøË`F»º“Ú¤þL°-SE¶"Þf9{W'7‡~ykl¨AšÝØ•ä}H–€¢yÊD¥]2ɇi3z²üa½á*æƒä5›k«}½©:;¬æv³yⓟ‰è[¤þýêYy¿ßÇ]BÌzŸªŽ+Ç‹O˜÷HŒ—×ñmø.­ºt0""Gã§Ê Š˜»ˆHTrbözë,ÔvKœ¶­«»ÙÚx$ïoí`ÁcjŸ³©â:aob9xÜŒëj4í -±èSí<ÆUˆéxªAI¿x”¶k™ë§ýL ¥¢/z?€ñ˜~Ã#*ÓHÊ䦩´é`EÎ=k‡è„ç4ÐS¡­ŽÑµ5GÒ;›Ýõ¼¶ø¥ñ“±ë  ½=b—_XÌ!ÀéA“en±™F÷õËÌPÁjβæ&QÍ02ä—Û’‚o'Õ¥ÞƒmÓExã‡ÞÀÙ[èUÛxs!ï³kÓ{Y“Y*ü¯7œ½˜èHãQX²‹2F,´`WçÉŸO{cnÄ\ f}Ððïøž”·† £ëifªü–š(3VæxÂ…ö>²ø>4Hè²gÎ ëàu’{ˆ%ÿ&²¢ÕTÕ˜ ®üa«ÊkIPÖ",R¶Y6ØÕ„`T`iØÜëPè0@^'‰¦JžYŠœ_8®QÔPFåê–Z£è'§œç…ú-Œ&ÌXÕ$Á+WΩA5c_¯ðægÁf$,h‰=u|µ5ÆÿY¿Zy†´©* ”½6Æå ~R²?ýÚêù!ÿi~¡ÆðÈdߵߣ8\”s³i^¨Ô4™m+/+W€.r%6®ª1~<Ô;ƒ`ÉÇY‘=£–G°ŒH0 0ÆB¡Û„œãŠe䓚˜Âb×ì…iü%QöE¥E?¼n»rúõb Âê^è£à™èF»"g¿Qtûl‘”Q4ïGXçYYÊÖM¡ W“ç‘Åî“fÓÇ:ÏgW€²MóÅæ—;ÚUs¸yß³èºYóm©£‡@•®ùà¯íB"ÒÛäé +¼ëZÅj9ã¼H_eX…ë½òùù[‹;Æ‘Q‘ztUè¹úEÓZç>‚éæWæìZÜY̤¶U-]%¢Þ.cošÛq·Ú ÜÍñBñz:2 ñœ°ÔÂWŒÑÁT»ÍE×ZyÏ] \>XlùÎ(‡Wן>#×±$ðè?i²Si TܼÚn~þ0«7©¸¬r^˜ë%_®–@OÜ© ÍA%¨;ÐfM+¨BZ 3A€–qBöZ‡'æ 7ÎßÃ8Í·M²ÂvøåàLz” û© ÉZœû´ÎȦå`‰Øóó´°™Hp­\y¼J§#ÊÚÕ–Š|ñÙmþMÝË^´KòÌ´$tø/©mË »ÈÇwš©0'Lj…z{ˆr-¡uâR°òí4.mÌñ~V«hô Ìø;Kó™RÞ–™›'|ŸKm·PÈ7cíÿ:Ü•¶fÝ÷aþ¬V=G¾h Ì0#SŠ,³H°í# A ´“3×µ`2e,|äÎK¥ÙÊ•²O¾t €‰fV—Ù~ Ö–†B ôå°§êø")$×À—L*Q…¡=cëÉïqs¿   "+Š]§ÎTÝ. Dú¡™½ns ¶ç²°/Ç|r¥§7Â.^¹Ý”|]‹Ê`ÃUï[¸пëûÚ_9@×¼OfÅI6YËiÇÒÕ§«Í8á+giê“c=†"•ó)Ø+Dß)Ý—×´J"› ¿M|R{ˆ‚A9¸àÃLÓÀP²UbÕƒI½ÈÓr,|fjx¤²DhkÖÅ%½â¬”äF÷ÊÔ)¡†Æ„#!XÅ,±Ô ^Sˆeññê1Ðup²ïº¯“,ê¦\&"QX§j)_t“6Œ¸Âlzü•N‚|aRÒ¬ëx$NªÄ“pцú¸yR︯ûTAç9ží"=zíë^‹ž-X´=›™/€ëâÞC°G üÞ\:À÷%5Ø¢ÊMË8f§‚€’š^¶ëR œÿðTÂ^6• ±C²µ<—¨Û>ámœîvFÒ§w©† èÑ$ÄNV¦0šìô¡t»yï’²$®ÄÙÚˆìÀ5aòl;´1é]í'¨ñªX¼b܉‰ ”¬‰¾ÚKÝÊ8éfÍdßlg ´ೀi:Ûj+ ¶ƒ“³3…3^Ûߥ'¼X–z™ ûš¼>§ I»îÉÜ6J.ÍdúìxOdãµ :ÅÌñŸpáO:š:}þA¶u³Õ€k£Œrmb¶åDò ÓorΡó«SæQøêE*Í,ÌmÈ€ÞǤµAÓ²o5à&ˆÎ& >,k<"Ž{"Rw8 Þ1%˜SÿdÛúðK‰£”ZDº,è qMÛ³0lN’c3œ4ôßÄCÏ#xU_9*b0Kµ›Ã=Ð\î>´­M´~ÇÍ»’z”{ï&-ªè‹KTÕ–:–"œo¶ÜùXŒÆ›ž}Úp toøÂ–‚yØé¤Ó‚ý$4vÚZîèi?­5FyësºîrL¸Ým– §ô+pJ õ}€›¤×(w2½;žXÚq¶ý1t}š:俬äMù7úEþjÚ¼èþ˜?,]'v^G¤š†ÿÃû/È—`FŸdHHó×¢Pù‚ñòݬ¥ÄéVj²t|ºM&ŠÀœ0ÁœbÍÚ®¸®êãBÒIŒr1ù|Ôæé§ 0„ó.4xõ#/*òý?¯Ã1§žñ(é]e…Ù˜–ºì²-ËäòÖÖL`¿)Çe¾ï¿bRìÑØòßb#Ê®Äñêæ[`£†ãÖ4‘‹[½=U)³Žhyƒ C#$lÖQlƒé”lÜ¢y—ÅšÃï7Ѭ\à:ɾe¼·Ñ–yضuqÏÔ{ÑÑN>u„ÊF /\ÄGÖºù²†©70ôrا G@N“i5#W„–¨rR1ƒ¢*·û~v¯ÖqТ§ÅÇšÛ;$?Åeç$éKÈV¬û®c4v×€[½¨çKÄ 0tÔÇפ` †ï1[ç…ñÈwTƒq‡MÔ>«˜J&¨ŽÚ`à x[¢Ã44]—p-ƒ‚3H„ñ q´ÂŽ®Bh‹¼‚Dôìý…?'cºärÂØÐŽ»ø»´VÏæŒ>cqÔQÄîÈ>äž=BÉž×­ˆ./rŠ'¤£„ïòYR¤˜‹²½s!ö ²îrŸ—’ÞÛ“ Ãõ.ïŽÐÃØ!ƒ0œCz™°†žöÝZ”U‚++f1'"p9›$±ÃåSÈÞ†þê\…ãºLß›ˆùÀƒÚWÏùVó@&ÆÆd>ã4©%gÛqÌ(ëÊSó¾xæôç{D©ð‹YºÀù¥Á1\ÑD{aÕã…‰w†ýãÌcعäÒëàH"ÍØÚDçÚ¢l^ßæoÄç“í°Iõ:G+­“Ѷõw6ôd?Å Ô£4~.èÿ˜ì¦\þ)íi˜¡ù½ôœv{y‰ö^ûcT…*zõœ¬íLÔsB˜¼þ»(‘¯å0ñf¯É=FŒÝû{¤µCãbß–OÄEþŸÀBþÛh¸]@‚¸Â’Q,8kÏr4§CÓ¥Vjæ{ÒÝóærä%ŒˆüCâÛÍê/×ÀÝL9µõS©÷:'\ QXuéø?¾ßAýâ†.#ꉢ) à5u ¬(mŸ¤D͘ˆ´`ÖܸûÒìÏÓžwÄçOsåM´3ý™5¶Úd¯‡žM¸´¹&z‘®,µT×j[³s ù €a[?ηNï>ÒëÂÀ¤àCЫÞgœÁæÜS÷ö à'¯?\ö\…ò3ìONƒ¶³«t*‘:(‹%§.¹;Ò¸Y#Uí€Ë‘ .=‡-Lr¢‘¯—×ñ­Øç„ßBy1åŠ E#fýrú­*¼`{Í—L¹Ì§°H"¦û‡> òŸð—w.I9õ% I9'×~µ i/ý6‘«”Ü wNB3wv#PÌß‘QöÊÔo&ÚÇÅY?æñ¤SŽ£yÚÓÚNùAr¢¯Pç„qði•ºÏª0‘þPˆ4`äl›RúšvÀuæÉŠi‚ê’íÅeÂÖ î³·¹láôù¤dÔ•ÆÓbþ9¤ƒ¾0r†Éþ.¡TTÍ:W§ÿzULëB¨kþ‚oâ—»û|Ëž˜böqseµ&…#Êcše·CúÏ÷èÁ“£ÄiÇít»]q‘󼻂ÈÛ}¾QOŠ‹ŽÜ^p¡˜YúX¶ÚÅ· à:‰î[Þ!¢ò¶©N\y¹ÿ–Jì(n²ù®ì=XÛëÚ×Y¼¼K[(èç–%[_Θ¨ý0º˜K¼f6wC×°x®^Eûµóû|ÚxÚÐ'ÄgÉ7µ-Ù-{ªýÏG›¬z¬þ›T¿.nÆ6uhw‘nŸgIøâª¶9a2UÊBy#ÆZc#ÛídÂHÇv>_R…Œªæ;jضˢijZÍÄŸµwžz:13¹ ¸ü åeŸ#©|`SØ`€f’›\ÈÞÿZM%ßÜÚlÝIŠÃsº§5 ×S—˜m€„§_½¨œ_cª‘É~y‘9Eþ ·Š[碽gg´\Þ¢#€ÐíqF‰ úlY|JHÌèÑ|ù`1ÏaŽ• ¯šg!yv®«¢³R*ñ¡ÁÆñRÁ£ìç½æò>§ÄœqrT¿± üI¢¢s¢Ö—@²9…ÞúÑÒET?t{¸_ô|O+¨G!´±A|}a/‰¯|‚&W(·”Ÿjö³•&(²æ,!VE§î.3R .d¯l[8hvâ Ó2ßè¦Û7¯¾”ßìjbï0kÆX 1‚{B¼c­ã’‰¹Ì[Ö(ò4¯¸0/xu,Â9´êñÄgeN‡»—[DÏk¿OTìœ}w ¦h ø¢‰ #×éA°U…BUoq%l©C«ûcî%vi•«Kl’1‡[Õ#­ýØV૮ȎTˆ0/”Ò ¶ì°SâVì•Øz¤f£Êf+*ÑWGË•Aa€î+w¿r«´V›vU™²"è‚5š.VbÀç~/·Ç€CKš2—¾‰íœücúÈ‚´†kÝ9^€¨ŸÒgÓàBü“>43UL,rD5DN>S%ŽÞ:wm*‚„ÉOØ¡SmåQ5ƒ·7øÄ|Oi&§–§@ÇÈZ?á@/ kÊT¬ò:¾jI‚  éûI>ËêÖ Ô¿Óì•~ÇâL²¢·ÑEzцݮüE3ƼºÙð}/Q~2›Š)»çO{úyæk\Í;±#mó;~óÖ u’•íö‰k&£`Ô5sMm¸&ñnV|29m²¤BÉw›"N93§žÕ€@ G$W`Ÿ{¾õI¢¼j2± ¦çpe$¾?-Ig›²ƒ*úî>½N€ma6S‘bAÖW+»l0opHMâá|«ï‡ºuil#;sS½¼smIL›ú!Óbú2}SL‘†¯Ø|²sÑCºf¡>A-öÙm¿µ)6’üª°_«¸ïTno9U!½fVÍ“gr³?ÆÔr­Ïè{â©­¿©¯¿òkòÐ:ï|6Aóîqc J>ah1gNªƒYjbìɧ¡gµL];RN{ƒTÕšU€ï;7¡ñ¯†cR£(¯›J¤n.xIUª‘þΆñ5÷†Ð×ixð(DF²‹ˆ @ÛÞà+ÿ€ŠÔ Ùé_t̽~6¦zeAö°ùä¤xòØÍ,]'—­‡~¥ÚІp~,œkÜ!‹džÙÇLŠñßè*Ö”9UOÅ`rjšmË #|çÜ*‹Î4]¶Þ“¡©ÖåËíÆEô|Êp‘A}0„“AóªQÓf>a÷x^7«YüœùÁᣞˆ[:ÿ Cƒ«ú¦ÈA4ž)3ÙÖRl––U'¯‹aÃó¨"øíh¤\Éu|âú7~…¬°ã7 $ [v£t{ãvTÍò_ÓÁêDÂN3W‘w[n[Ä ²,Yv«ÖªM³˜qP½0ø$Lô)0&’üIr#ê„EŠºÕ(»0Øbú‘¿w =™~šwôÃjÈæx˜k·òµ™d¥taCìÊöÏŽÊ“;×.:‘K]WáûAÝ„+<‹¹†ï•{Mœun¼·ìŠÐÏ@¦\­F‹9«=!cf<§Æ‰ls2ŽÅb_v?¸BÆBîœÓ3P;2 {N"ì " ŠWy{ëíNâ3D}:4¿@žÐ‡ÁR‹{›0¦ óÅÌêOT Wýš.)_Øg¶ù 0­c´0xõ¹¿[Dzˆêœ‰k1|žV‹zbBä›ÄÛ®ÃÑ|‚QîqÂE¦_ƒúéŸqš+HøÒàÔˆ†Ô®GWé/Jnòå‰zÏhÒ`Å8üꦊK.`ºœÞ31Cfz‰’85Ïd¸B†æ`&kÉ&­æ¯¯µÃS¥ ®Ô2ü\oÕï>˵u¹|Ó âÔ†N¸Ç'¬øPû‚´ M•YtAlBHPÅ¢98°ŠtT‹ž.œûÓí5{þ÷—î—2èvüš´Ê9²§“nr0„…GM˜Q‡ŠÌ°Š«½A…;;áwjž,G¬-OMÕ#©Ã/Ø«yDáœû>Gxàf‚» víVp\q‹o!ù!§L×:ûAÚ êØóH ®˜p¯hC›_kJX[Tv•UÅ‘š0÷yÿ'ÕÆ |"ú/çLâ͹£ßÎbQqªFµpừ/Óhé„–!bwÃ}·Ôupå<ž³!S?½ÕÂÚ£m¨G6 ËÓ®tìä[Ø»c¶y7këñ‹iäÄÞÉáÖä ݆6%ÓÎXû¬™35~:—+’µEF#“­Gô÷3g`„î`NGÁH±©ÉúÔš÷ž q)MÍt7Çxô›Ã½=–÷Ö‡G~ããÝ Šƒ-<¶/-s½¡ ·,‘²{¯¯ÄÄÈe u°²–ÃþÂ(•YÜM Õ<ó0®ååè¦lŸÚ\âäÌDÁ¦a¢áZÑÀ }í8¬‡–¡ rE™ j Æö³_—íX†f©göcG~MúZº 5‹êqÕtzi0zç´Ï£eF]n]ýCä6PSòrªÐ2ÚQ‡ ÚU Z’¶˜Me€jAÝ;ôÈ.NÍ æ^¢û¦lu•ܘE‡ nÑþ£d!’[ Å×HETÏÔßõžCèT¥0ZÄ®sŒLôG÷è£Ö¨“½Œ4£øÇÕ¿›>¨\¸4‰$y"’iìTµVoŒ7C0Z™<_é­áP«r•Ô…âJ´•ÆL5#aúsæœ3‘cúU´;yˆ 2+ï]ÐÝû"Ù?»¦•ÂAY?Ë?zÞOÏI¥Æá=@ð¢á ظóÈŠµé–»|ð—⵸¨ˆ;‚'ÖÑk¦2ZåðdϬo´ØùÎz æ'Hh”'ƒ†Ù1øÈü[^»†œÜI¾š¥êqŽ£„¸~ÇDu>BLbf4 ŠÌ·, ê\Xz·ÂY"®ÐVt__»MÍt_íÅÊ'*BØšeE“ÖWspÌr2­Y‡Æp5Õ®Ù,E܋ԒÄYà¡Dþ9äSŠþüP¸Ñ©ÖÎw*¢¬3¢gsü‰RîÍñ!);ùó›­Î 17Û-‚ok®¦¤ãgCË~GÎ;NŸp}@öùL‡VÝ4ç"Éí}‘1ˆ£ÛÑf7&GJK¹-«eSMé‹ é”Ñ7‘ÚHÅMº6Åã™b–åõšàcÌÕí£Þ4!B5~´—¹~ïIÖ×î#'«¥ãÞ­áDˆ‡}X3«B¾ZcrSyÔMQ:ˆ2¾†k С”¡ú9¹*tÖ7";+*Ý܃œ»ô’ ûõ §*á¶”*ò.™ò©m3òQ-‘µ¯”ðž»] C[K²éwÕwº–!EÁKÔ‚”iaEO~äðëY}”#hÆèô…V\Ë€…½õ¯#Jœ%o®“öB‰?«j…ÌnÕ,ú®ã)r$5ƒ8Î[¤Àï(S ÃQ2tï…¡˜®ç®ù½ò ^¥âø^=ļ,p·Äš 1jGd1+Ä“_0ÂNåÃís‰gëq62w!+;N‡J¯ >z>ýÄ_ÔRÆV Bÿ‘sŠÆó£ÏHmŸ<È ó·ö^àJÖm„%…„z§¡õ“2Ìm…O¹ºÛ·R8/òÓ&üE>oÆ…É2Þ¸‡øÕvœж˜ Ò¡„RVoYüuÃò£+ï~Z‡*ï¯ì*(Ô> š7ŸY­Xn ìseóXè,Äto˜¡„› m¶Y÷×%ýlôHÝéK€üuÇO¹âñ^¹•yV£-Ú°‹MŽ*zíÐJàêb@D°QËлŸ !ª—ÕvŠ'è³c]Üé}veœb|á±…]p ¡†.´ípÐþKËÈ[r3ÆxN‚çìrúÕ—mÜ;Fš ð 1ñêÈ9gЦ˜£ì-"‡«,î <9È•§·ÿû RX+H‘Ó©d½º{ìaJÀV“vxøý~¸^ Ýßz]ž7š+Zã4´Fò’_øtyaa” æ†s›¶Á® MøE%uÙv–×b÷þ܇%›áê@ Í|²Ãpš…ð7×°MkÁ;R¡XêöåÓ¹¶p¼/9Ë‘6uÚ±DyU'½¯@E"4º‡¢%K$'&×=ÛŸb`ðbDõRúƒS;u¨ 4BbT[S<¢~3võ…çPždÐmÞX>.Ч‚IËHŸç1 ÀsrŒÁ6¿ÍJ(]9¢Þ`‰$‚š­T’Ü­±æÎ$OdP†Ò;%¼.çíµÿ€ÿ•i)'º¡ò*Lµ»ƒ¬ndÇ’íÓNò¦ša(À;¿FФãùc̸q¯‹¿—§Æ]õ§=sK«k@Cbתـჲ"ó¸”ÿ³cß›¢à¢p}Fpo8Õ­(ãÆy/"™?áÊÕ'Q;ç*¬ªÇ¦3EQ-D3–Ä¥%tô•+££j+é(¦ÃšƒPþ„¥»¤ Ñ;°0—»&’&‰wj‡)á~¬9ƒ$ýW1š5'ëþ YÕïs“ÎRÑj!„âh+SEÛåò(H b¦¬¥JZb{§xÄ…Ý“žoªK„hN„g©ÁiÝžm'¬ÞÛó<×ïÆ#§>æ.Æ/nrÔfºLŸ*(LT2¯)ÿ>}ÍÛ@§ßkŸßç\Sâ@ÂÁ¤xijֹÁñ,Þß§ñUzªi¹wM$f'<¹ØIDþ™6~äöá#ŒU·Þ*¥šNôiÌIÍšº…šÍ……QWēɢ²¯º?#ûˆ_80áNUÓ¥ûÝŠ~ŸŠLŸ øÙ“ ýàڥ͛Âþø¤Ãn¶ÝÒÝÝš íÀ¢Õâ¥öÝ3‡ùn¹‡2Ed{u¿þ Òë³ÎúÕ:“ƒÇÌL¡3tGXê´ÿçS+_ëçaè®I*܆–ÃÏ5Iüö”Æ·õjíjøËÌïmµ É:MzL5„;í1¢òpäð@¿Úʇ7yÎôJÒ{8õÌу¯.Ö–6P¹‚ôcøûF¯ê¬&4^óm‹ ‘¡Mð‹L媋冬âGl½/L‘3VŠ´m%‘…ø8VÞp'¢>«ÞùË"8Ÿ1CrÝ"T†L–χŸ?bœYV¦Ž«$ñGÙú¿¤c\"R3-¼ß^®³›òI6Y i!ï)üŽÎÛ.Ì; ”'Jû3ºRAhÙ趬`Üü’ɦ†©¡pZÇ ÑÒwRÑÕín+{Wß¼½XzØ uè #fN* y¡sãw¢X¼×þ&ïŠu}ä± J9d“GòbU»\É]c£MW²ZÔ);|…ƒÈæ¼°4zs¾^<î¶Å×;×´0«r¿Ç:ª(Øë%`¸À{&Zµ2ÜwnµM•l1†*ü•{,Ü'Ï|ø« 'ɵÍIÕ¥ÀYë7• ¼¶vðüЮLßY|’dÀÌ:\VÌö,ÖGnMšy«cJšÖ2Æynÿ|‚èÓk‘†+O;@cõ5å¹.ŒÚ,DOÌÿÆ~ endstream endobj 110 0 obj << /Length1 2197 /Length2 15605 /Length3 0 /Length 16918 /Filter /FlateDecode >> stream xÚŒõPÚÒ #Á݃wwwww:¸»»»»ÜÝÝ5H— ¸=Ε“s¿ÿ¯z¯¦jfVûêݽ79‰’*½°È(²s¦gf`âˆÊ«©13˜˜X˜˜XàÉÉÕ,m€ÿ•Ók,Av<ÿ°u;¿ËÄŒß åAv3+€™ƒ‡™“‡‰ ÀÂÄÄý_C#@ÌØÕÒ ÏÙàÉEAöŽ–Ÿßóü÷/€Ê”ÀÌÍÍI÷/w€°-ÐÑÒÔØ oìühûžÑÔØ  2µ:{üO*¾ÏÎÎö<ŒŒnnn ƶN G j:€›¥óg€ Ð èè 4üE `l ü5xr€ÚgK§+TAæÎnÆŽ@À»ÀÆÒhçôîâbgt¼g¨JËívÿ6–û·à?Í030ÿî?Þ²´û—³±©)ÈÖÞØÎÃÒÎ`ni(JÈ18»;ÓŒíÌþ24¶q½û»[Ú›¼ü«tc€„°2Àøáø9™:ZÚ;;18YÚüÅ‘ñ¯0ïm·3ÙÚíœàÿªOÌÒhúÞwÆÿ®µÈÍÎë¿ÈÜÒÎÌü/f.öŒêv–.@i±ÿؼ‹àÿÈ,€Îv&&&.VÐt7ýÌøW5{࿔̉ß9øxÙƒìæï4€>–æÀ÷x/'cW ÀÙÑèãõOÅÿ"xff€™¥©3Àhaiÿ'ú»hþoü~þŽ–î]¦÷ñc0ýõùûŸþû„™ìl<þ˜ÿëˆÅ5Ä”Õ4iÿCùo¥ˆÈàEÏ gae°³r8¸9>ÿåoþÿåþ/©’±åjûG€ºùCœêFhøÅë´½ &¬#I¹óÉûÙ0Ae~¿~m{d¶øT¸q˜Ž€^MèÀûÅÁ[#À²¼W†<ßÁ… Y©ãÞmHÒ½q¸rc*te_ù –Cá¹r>F=Z/ l‰¼À$gù#)´3=!, ú/w”¥›ÛEô¼Ù7b™ZxŸ³Ö/ï,±Ëž[Õj,N}¸d¸: !oЧæ)¼DŽRepV½ÊK£·ùWs™¨À¶§†‰½'{IÎytå¤Ñq˜l¿rKN‘ùt62h "Âeï«ÙÓ4ØŸ"¯~¤5ws“,Tl+28 ƒ» w¤5“wƒQðð:ØùúáFûôFöô¼aV×sB×|~k³UdKì%ÌÁSšà÷WŸw±UVY½× Õì™ý¢û»j÷H•øOdx˜â” TŒâÌNòñ„›z 6=¸ZîN08½~jÝqÜu õ ‡ËƒW¶ó‚)t.Ù'O77‚f›äÙRivôVb+Ó„s¬jäŒHº$μâ•ñJÙzžûOB2f_„æ;%ÎÀ§åÃïú + žÌÐ>YÐ6<žò· œF~XÒÉ 3ökkMÓ$ˆT¸ÁŒ”b×f\ÿÁ§Ó0R|T\6œŽ/>]¢;9C‘#0Àv´|w‹½Šòñ³½µyk¸‚nM69¶ÈóøÄU­Ä€ …J†lE£~Ät<Ÿê¢R`[ßJ\u ÿMå®îÁ`ÒWýºO¾éS:‹ý:kîcµÑ aõ£šbº ‹Ç`YèÍû˼¤Ü!J>>= Û½ƒóÆ7+V †/31ùë“RÄÍ[v1'÷#nqã‹ò­‹4î¶mËØÚ_Ò0§Î6‘÷1ªãíͽ˜Äú¼9„ªóŽsxõOk{>{ÏÎ1Ü—©ø6^'»i›msk°I¡¹éµ5êEÔZøëÅVbo뢊0§)­}9cœ5^BÖW;´„S[SxSþIQ 9’7v+>Zj‚Ö2T«>—×§!ñ>óÀjX[ëF|եЏ«ˆ}´Ó~#^Dº«t§ R€ý\‘Ïi¯ÜÃÆd .•±´ÌöËE÷ ÉM»{053w?‡¥K×yna|"u½(º)[ðóïŒÈ6“ìWš¯„dþðf#%F‘d¥ĬžTÒÀüË êØ oõù‹‘ŠÓhsè‡* ±æbç{Ô%³´²|þê¬löéë.?Zü–âŸVœýä§–BoiØ»chÔ¸àóá“jŒ`sáxê›sÇõwñíÌÉÎâ³ ­[…BHó…þ8̸ƒE *‚©ô9)9W¥ØÁ0Ù$OÑ4Ìnw‡,}lŒ¥ùym¬½BU»zuœžÆž'óÌÇÔ­ ß3~]D‰»jSvŒUÞ°‡K˜úñÛYõ°ìv/C¯˜bÅ»1#Æ<ßO±ú›äIë‡eGö{´5ðÄNí!™¯TlžD%íŸ\–>•›[œ‘÷Ú<ñY^+QQzUÄ-7L"»U½ª¨³(¹ÄÞ.'çñwYfgú|ˆî$jüE–ËA‹1 ç‚úÓ~ê”æA#œ~}£L‰¯ EWôš—H4ÞÉÒ xºŸåeßÊ.V²^£Í×XðÜš(JÌ2Å&ûhÄj † Ÿ§ä OWW÷£ÿ¤:AÿNE%«R´DôƒA-û ÷§ßÂç;´‚£"§d‡›£Ô'B‰ Ô‹96’Ú•Q$é«zõ),g æ*Îv6¢M›|=I†ýRƒää‰it@âýêWcLóeÚìP!þ 5ƒ³4Ág‡„Õ×p"&È|‡Ÿþõþµ‡Á X£êpì#Äcqß9Q†ü¹[tY½c~±;2A^·Û¬½>­qÁl§h¦8ˆÉ wwÅzmž5`&™¹%ã{¯#Iʼy2¶fIQöèG|ËX“Ÿ)æŠ)þ7¢ƒ: ^ ËǹíU+gÿ mðNƒš}çÈzb“5(ø,C Tü,jçÃ&Ъóæ8VçÕéˆÓ¯®óÆ-^™·²$ùeÇ%{]à»סgš1°xÇ÷Ù}75N5Ä;Ûœ›xµZ°Oë’ÁeLÄÝ\ÒDü™ÁM“÷)$DׇS""gm-ÛìÃmkañLnsì]EÑ…ï¿ðY~̘¦h‰ì6‚°×õÓf‹À§ú™é±ßô` Le+f˜]›Ê\Æ stæa©æ·‘ªW˜ò¯o›ˆé .дÜoë(lœhQ’(Tó¯ÛÛHåH}‘¤5ž»È ÅÃdïjSWO‘⃠¡Vaâ­ž‡ïBÆE@÷Ô}|ÁøCÒ¬ð·qí¾‹ŸÙ+8Çj¥"M60¾Æp«¿HœÈÔ ’¢ëÚë ¬CMØÏ|Ž^ëÏŸéK,¿ U‡àòŸ]Nò,8üÖ#*Øèÿ‘„óÌC$Åûåæ±@ó|J+9øæÙZŽÉ8·ý& ³L‘¢*p]z5šs6’ì˜ym0#Jùæ*H„ØÚó yŒ*%áO#æ þj¤æѤwi¯Ze‰*=C⣧úå,rþ'¡C`/?SsQLa1Š£šݦ&‘àt0…7ÿrFm•玂Ôb÷ìfÞ&ã Ãjõy ÐäÛf¶Ú·Üåä8|!ëa«‚×55+äöé\g Ô\”@í<[Wü—>„ÍâM“åT?T'&§™’zkc™¿Q#˜=aG}ºž†žæíôWÒÇAïo¾lÇVï}My>J醤K&ÌÊI ¸ýa"’7;3ö¼Êå½¹!9›ûmëB·C ÞndÚ”%|»ÖXk3Ÿ™Dç;ÖZ{ê>*¶ó'¢ÁïØ‚äíów)Á‘ª½@]ÏÌ<à4Xˆ`bû3uÚ£Ø"¤ýclðЙb0‡ë§Kq¼I\Ô0œ¥{“éÈ–‘ã:…cß!²ôÙ 4znÜz»¡l³ê‰ªÔo°ûÚd?CŒ¨‹jnæ‡>®ò@EbÿìMAÓG¸WAן“þ¢fíþ+ËÊÂ$W*É –о÷¢*›€!z"¼ØÞ¡·ò·¶_µ€Á±§;ݺ—Aâ´©¾cÖ.èKkhsûMÁØ·jg©$µMÑ—ÙU@Š"ïœÃn€>צG[«H8HÎÉߋ߼¯¥šŒ q?ìCsDþ@…ŒþXùèlæTˆ% ®àiÚÒ™YöÈ.é;í·6Ж œ°D.™U ƒGþÐ7qò¤ìãÙŸ5ÖnªÌ`ûH ÿQÊî²Í/C¤võX“$ŽÎU®½ÓŠm׆17ëõ\O€Òuÿ›ëü¶à£ô|–ì<„UX&ãޘµ:¶¨B°±Ã€£ç5aä²õ¦‹ŽOÜ\ö›ü¸µ?<î9„s@oÙÑ.0TA†¸ùä5jö*ã%_¢Æºº¡êªGѪ7­ïËöúmŒ&oyΩB~Y#-Šºò>=õºÿ;L¥Ì¥¶ÆådWÓYsÿ ´Ù'9flA ù¦1A Òá,“²)å~d‚‹žvsÓÖ¹Å<ǦîZ> ߘ‹´víZÙYþÕýKýS3x¡ðbCöe)§ïO7›X#'ŒW»QSÖ[.{~É/Q+?Q}(ÙlRæ’÷…j{ ¥·Û9q³f½â >xzЛ9NtG2Ç/èž"~Dç”Ùž_¹¼^]ì»kRÍ©øA™‡‡ïé…Û~jÒ\²hj­dë;¶ÏTP?0x_:í‰ÿCz±†$I-¨-J¥’l‘®„(°üŒ1ÿH¬øl7€B<š«¿1côYÎMý.ûŒ-mm}ˆ.û»ei˜¶Ñv; pM_›6Æá·|B1MkŽo~Ÿçfß7õÑ9¡Ð4í¢Pü<1ýŽÉm[—œÐŽ'Åc\q5“f´åvßL4CÖH¦Ÿ¸ùÐMøl*Ǥq„ØÅ sÍ'¿v‘‘*@¡2i±šý½XíÞš:TÁ'sRrpãBa3œfŠƒEÁšQ¡Æ W¸µ›58¹´Q8ÇY‹3Á°«À„pëv1.ƒüHÀ´ý‘µÄ°×v’ñhÛOùòw£‹ùïÝBøKJi8……»‚ãV•—Ôð±§™‹ ´¹-Âè£ó„sŽ…»RsÉ¢Ü+¶ŽPÞƒœŽ è×’ägSîÒª…½9o|óÜï¹%zW '’)˜.ðSéÉ–?`?ƒÁs+8£á&†pvºXš8MïÉø»Á›êx·ôcB‘‰ŽéÎYF®!,Þ=5|ïáÅcõNð”ØÑf»Õ„YS%šH—Ù)Ë=¦ö}Ã$Ï.3ÑíES¼æÅÊSq Ûn¯a/$ÍÕÜ÷öç]þ"Íñ3"Y ‚RÏ,òHöá·“K4®—²0µžÌ‰3ŒÖ÷X,KV—htVµ,öo"ßÓÇD¾c–§>N\aŸ€¼ ¼9­%EŽÃ'FTJ#âÙ¥Ënˆ¦Þ¦„r¢p¬K.‹hip²Iº”·)y#É“Òlœ AjÓÄM¨oש™oœ;²$\"ݱ6àã ›ˆ ¢Yìæe—pWxÙÖ`UÁi&¾J®+yƒ\8ÄÎÊE2ŸV¸™1PÉÀwô{«?- rÏw>[Év× &n²&R"æãÒs½àLµt ¢ªÚ¸ˆ´Zkôò’ëúWàQs1œJ§µ« ™wåÝ“ƒý¯nxew°yGЩGåðÆ WÏËìá _Àð¯—lqFå£SÀ “»ôÁ* ÊZc÷_XDˆ4;ÓØp£à¾Qòû¢¢¿ #¾$ß0-:fâ;eͨŠ~9€àXð˜@|Ò]zZ2à#¡/e&«c—Kþ&†&M/ðŠ½œ,ýŒ9ÌìS6º ÷OŠ é8ÈOõ€Ùa‹ØíSšN4pÚò¬M M;³PyŸYm— %ÈÖÀ×ÌCSAC ykvÐh s <¯1hÁ„8F« dzÞš‘q¸£‘=tÊáÌî1 ‹%dù£ó$£îÐo^ÑÒm0}cGŽËZ7HÁšmt]¢Q‘``ŠØ·ÊgÚFå‡F2†"µß‰>—-9\cp!’ðŽ3\ÍŽâ÷Ò õÊÉßU^f™ô&—ÊËâ¦{™€d³¤ìæÕƒAmønË„W¬‰ýË1Þ *=„‚h¿ª(+PÀUW@Ò+zC0ú–+jcQ1º†Û:͆gV¡_Š^“Ù‹kË)¸ÜPäÃÉahÅy\£á#'Hƒ!Û+/*üv’ŒKݱygµcmïêgF€1W¤&Nß-è†ðtì&˳X¢sST%õ#k §R¬.?Ù™ÊCë[^óëfõ#Tm%ä® ©U%ki 9 ¼Bb3«¨h<¯"ê„+)ŸöX£° 7ïR˜qââÇ1/ÌÇGùÉÎÈ–[ ¹;—œR¿%lyºSßi CLNÊÉœo«â™OZ|ÆWFûMçŸk½öªøø²\Ïî6Û¶±§Ø–éÑi Ưd-MS†OuèÜÌbËÖ'PŠmu<ÍéCEd”æÅy_Úú²ºÂMç¼;ê«Ðµ8'¨ü¤¹];ôvÓûɳÊïµ›Ö$»Î‹ùÎÊ(!ŠÙ}Èð*D˜h<}Áóßê7À„ªµ\à WB|¼?ÐM,–•ã- ÇM›³ÄIûlï¦U÷0Gº¤ü–,hì¡ôõ—³N´@À>Wó€q$¨I'{;4ûï‘s³mdéddbý(xª5£Hž÷;f5PÌuàyaNT§¡É37GÃ!:¨€­hL'ãêD-J±LeÀˆ[Æþ¡Îusƒ$¾˜ð·ùh ›Ï½Ò™µ…ç¾ç\4ÌWSµø ßG:æí_—YP€ÕF`’ƒ˜ýS—IŸEòQLß î´Q$ãz½C½SP2ÑìÒj%¦J,8YeóCN1Ù°”ãÚ³k pH:쀷ÏC¡4|¼âsF«¸œ—6b¨\ÁÐÇ‚x:I'ýBŠññÎ4¦!ÕÌ8~ò¡›LÇlÏ0½cÊz#¼O .??ÍT†ÝžHA±9÷ D¾m…‚íãg·vitâÊX‡¬£ê“î@H¸yU¼ž|ì¡ÝM“màvƒç”.àR,éJÞÿäÅKÃøv,œÜY;=hüó¼L5¦UÇÖÿáÆëI¿Ô¯ðî4nguÓjžöãC[B ,eËË~,'¥óWÊv½Ø,MÖ D²Ø3ÿd›Æ¥SåC;Ÿ6ó ü0h1‹|pe^yv[ú7µ­Ãí#u^pÆ‘µ·Ç¦šhŸ8°Ÿ¯®›&|O’¨èB\:-1µ7§ÐöäQûf¬N*ºq3«yhµ¸Ç寣¸UHûÛ“]«øâ3©ã³W:ÉJã#w:OxUÕ¼)@Saf:Ý,ÄäÂþÎÆ†)î;O.Å^n_U©§¬nýóR¨µuTŠ.:Ö·¿Ï…—{è~ÜÄ«-†2~®ªìŸØÙ„@Ötç ²,ÎÍÇ ZNì1*Rj©Ç“yEóøš`ËÏõ?—ˆß¶Ñ›ÀÿW†¶1º]¸]Éʈ9)ÉÎi$æÐÒ®(SRá ‚TýÁªzÂ6ýþ¤S9~àbÕOÛ0NO?ûõmñ£ ÐL1÷×±,®Š2ÍGîÑÉ J2­a$‹¹Ëâ€vÍi¹T{òqDÿˆ#Â'ÞcÊJܵH+¾4{úHåêE8ÔãœëT;·L¸«Ÿ~æ©YF¹©hö½ù+/`¿Û+¢ÙÚù à‡ÉU ƒÇÂç*%©UZc×Li{²]©(Ðs:\˜tiO¦«ŸöÎcä%y¥"mÝ3U3fÝUM@q¯¼œh.ή†òØ”~E2 û‘†Æ¹C{Œ?ÑËEÞÕÁSo'½ä‘ˆ×¿úùdÉFµï2µþ@W_Ë3œ{,%Ä^Zº÷—ó=byÝ[ÞdÉå'ÝLA_ÝÛ©‚Õ©njÊ“"Wñ…E ƒmh™‚\²>.ÄAd%¨\jå,Fs¥¿gbP!öé ×5(‚8÷öï¨ 8¡1ù6@À B¡l¶6 ŒNä~á0„2@ß1S++÷(9+ºÇ2kT|£òTét 0™Îàø‰@Üé×ëŠJ^(ž@N&~qBM8ùFNlÄ-—@ÄTˆ§«P8è¸ #DöŸÕêâ}`ð6“JœÖ¨T°ïšh=Ô•l2ln_ä+^Èáé-¡•ÜLÂôõÂC§žy`žv]P‰™Ä]ÍULãKgQUµuòÐÝ btïçIL@€Ä‘5å1ì·Ð¿m ¡S”Ž·öît0Œ “÷•YvsYQX°sZ;‚¼uŸ0ít¹Ì˜* ¾~^À{..4Ýá¤î÷vÐú¢óȰ®9½€S{“Ê:PžAÀrœþ˜/^Ä¿6Â[fbH¯ªi12<7]ÙÒC…ÞJ÷<Ê;!}°D­bC“Ëvxä^+ÈYÌŠŒŸ¸ó•‘&ÿÁ{ú¢½ÄÕX^fŒéç{@€œp™[1Ié‰(F6<ÙW÷îú6ÖÏáñvz.FLŒŠ‰vZÓ …8ÛÇu+ÃÄ‚|.’h˜ø¥E…ìåH^£©zN±†óüsjí“©ë²ç•ßc/u`„mZ¸p€ç(ïÔ.¶±9oQV*X`=Õp|So4˜]¶»!g¸Ë,äçÍÙѤЃÍ9Äp&Gª^Ö-óŸ6&$Üõå-óý;"X¡†óO *?,D£1úWÌSœØÎdÝ/?®wµ º½1Y™=¾b2fåßVܵú “…ñé˜àï ¸K:pÈNYsJ *BXˆ¦–¡¶ ´ƒ-ÃHz¬Ç8ÏΧkOÔ­„lðS 6dRQ.0ž<]^ü¾|iCœ­"•d\=”ƒõÇýö–›Þ¤̳¡å\­>N* æSXÝv­”‡-ñ&²‚Ñø6 n›«‹ù °ŠXç ¬í›`üã$aÆëw‘Ú~%Çš9^,‚Ê‘ÚT= c>)ÿªíÔ!|Sú™Þ©(PzQmmíÄ ³“‹—ÓpѰ§»ˆam?7¿à @ºÞž$mÔÔ–8Ì‘ {‡¶‘êqë×ýXÚ«¡yÿmx„äv u?ï Ê3Ò†ˆ~!oæ×hÐGN:ý©óú‰Å¹ÈÑkr½„}¡ØýTÁÐ_W¶•Sm’‰-†ëWìÛ3Öƒf•MHò‚rª‹^¼Vì_ð¶|Ë/ ±ªµl¸ö-äö‹êñÚ™ÃÂFRžèŸ‘ âjÍIäòĵᑤÔp»¸e]‘oõÿ›5“c‡¢¹û¯û †ÃIÆ1^›Õ”6ªFDž5ø[±B;,àXRí¹G!èùšSëvÞ®•¸Ç|­ ¥Êû¡â£t²ûB2ØçpG¸ E| †Q½!|zðnŒ[ŸÚ:bfÅÑJo¤dEx>–Ê[cI2Ú½yƒ=ù6è·þ#7 ºlCŒMŠå<~NðG~Ù@¾¶>÷!/X ä€ÓAW¦±[bù0gÝë:Ùõ5ßEÚú€9YF‡ªº[_œç§ÃêT$"tœn‡mg×9;XÀ(Àp)[h`æ–A…ÊTÑÖh‹-ÎØÛ–J\øçºë^’6µã- Gý “íüÑ@yœ0„ô år!Ze­' .`]w^n/³ù£ŽXâIXò$Áï‰Â™Zoè }’‰ÛnÐcKE?—ߦEº‘òfÜá ñBôVÓö•éÀèÓ1ôgv«Ë*GZpÖx6GUzîþ_ÍVw5.ë,õ‡ò6»÷‚¢úȵœçŒ²=²ªÜ Ò¯¨öƒ?ÛÅ;=>¨b33o:»²DkmLôa÷"«ÄwÖ,‚˜nv¸Ê™‡£ét÷ÇaÖÃÅŸ¸@T7µŽàÇûLP¬QÚ§\òý¹;Ôš{C¥Žµ³îÍçPÄiª-(ØiPœáT êÛ£Ä:Pº¼ì>Ùq—W¤ <:xHSµóú@95Щp¿)¿è~ð⑆÷Áeí+J‰XC貚JbËì³­ -®„/4„ ­úQ®Oþ³tIêóœmU†±ÜZß­}—çéWY›Û+db±rUG§T-,ÒLP©0â&6>4iRg”|X+Ь+Ç"t„²Û‚¿3Ôþå CxqÇæûÉ O”½ÄI½Úö@_\t5÷lÈ "ίQÒ ¥l¶Fì‘7`œ1¨>ƒF‡f'('G¼úư=±ì‘X-wEi´_Ê\* nõpgÃ/ÄOÚ }rÕÔ]ÓI/ÒÚlhÜoF wOYtÉ~Zc^ 2ù*©Æ·<.ÿÁ ¥úQcçE• ‡6ÆŒ¿Á;""c_Z]€JÖ(ëB^dгþËã ˜Ugvo <¬º±f+œÑ ÁT© UQyÅoVs.´ê7 Öuÿ»ì+³^S <õV_¾º ôꆑ Ϻ³8Σ­ahø,TujW¢ô „…’ ö³áh4 ¡ø4VwÕÒ:Ãu®öØ• ºâÒºÝ♯qmqÉõ¥ú¤h£ù9ùèéÜ,¹v´,2,ïø«SC3K÷UÃ0°íF6à¥ÞŠq3±æi–ÜY£Ú¿ø§weˆZ ÉÙ‰2Z,"E×ð…ãnìö(¦À6×{”€V“^†–pëV(»ð :,~°›T鋞®± ®¢ ¿ ìðGM{Æ0«Q&›FR>=><€µù:;Û ò%ã¡Vb9m/ZëwéWp€û¯Xª´ÎØšÝÅ…Vy@DœR!72ƒù8ùd Ž‘ðЇ¸Wâü‚báÌf èsÈvê£ÉYëÝ…Æ9ñÜA] õ1—ˆíæGÂ`{ƒzñ2Ÿ—,‘r¤•‹g‰€ ]÷!B–ƒéxÐCyÆCÞ± fç¢XftEŸG»ß_lp¶ž nxè˨”58§?þbsûa,Jb¦AŽjÅë.:ðô[O9׌R9—(4¶-ú~°ZÏ9­ ûf’Ú>z¤r )—Ÿ¹¹ÆϼBëÆcU×ïY†øVî¢~YÍ}¼—ǯ Þ°”pÓ Qmtëì«\+}Ï1Ëàœ)t¶â\ù5ýÞè™æ¹#f8šž "Cìäu–“cei#ô÷\Cò$©ŒXæOÀXϧµ”p™Ïçüø¬®Ù=òùûRMß@w™Ê¨Ö‹X{êóð>Ã:½X„`Ÿ ù˜•V­kPеY =™Ye‚ûcãÀ-’»š³‡åIg ©ÿ‚[–n4U.À¬Žˆ:eur¦HÅñ7‘wgT¡Œ-gõÿýÅúMáUS ‹$XPa´×Ö¢«ÑU²–q©é¸ðU`WÒ(HxÆ3‹J‡n?E@OWÙ!j??:Њ?Ó÷á€u-§Ïã¼k¶ÄQí/]@h%$8ɱdƒ… Ï.o 7àÊu«I«`8e2ÕŒô;÷3¹×—×X™TacN{䔟éRËKi;óÖZö'—®´‘ŠzÅ@B,µ‰ÝÏß{µÐbÚÙôæpB2Y£D“‹ðN¿,$ ¼E«¨,ËR¶KâP¦Ï„ʰ·6O_wâ`”«ðñTÇ3$¿j§0ÄOA¢Þ?§ñ©ž+úÉŽ ãÊ òÞÉ…‹õ¨é¹Z»ØÀ·óÊrµIœ|£èŽK¥ô6‚Ïå²cÓ& e[¯Š|™tjz´öØè|ü†¶*ý:äÞ}ûÅ(Ñ:àôì[™#´ ߥÛ/¢¸¬Ý£KîѲ÷‰·Ùò%×_ܬÉIÌ_°•žÏÞ µYy¿Áˆ rR팤5d/<|báTé1÷ÓŒSpJ;$¼ý‰ÈÿùÓÕ<Û6ï«\“ ±]9ä+;LÊÏPµŒÑR“¡¦³‹X¢ùÈP Þ”(Ð×°3(uDÞÝì{ëä ½ŽŽEFãΉÕ)òŸî­‰ƒ+5×àa3‡Œb¾dKQjÒÅÜîñ9àiu3J c*èBÿˆèˆ[YÃaœv§—Ñ\‰ˆcgÿ6;g½ß¼.),£ÎØ‹§)DRclßtÌ,áç®Q Œ&2 ¢iDŸV¹Ò¢½C@!Ù<Ñ IùÇE·X”‘%MÞ>JJÜnßÄ §€\)e»«/§åÚ{˜.x@FÚÉÅßß! to­7HsTÁ×Ë ^o?è}1~6rgR†²¹¬ãÑÊyí¤õz4Az®Ž\óšÇB¢yr³õ&þf€0Z»7ßH>ç#Û_*]¼~;@–ßµ’«h3ß©`êh?8°yÚ/€GGŽ ´¦\(YâÌÖ¾ªë)D¡^ÄÏeÏ÷ÂÖ·ŒÉbS¸ŠäN0›‹SwGÊŒÊñr 8i² ý&XÒ°ÐPú92hL´µ"îW:ÃÎD¨¤KKY·@áóÓ÷È·msrz²|m–¥!Œ5€S½;Êðò@¡ƒ,úL×Ät>R7¤ñ Tô e0à͇áÅÚ¤*³‰ÂkaòÜ—[Ì1C¢\€,+À›HŸÈ{’«CèÑ…1L2„´~Y ÂÇ% Íäòñ’î2Ô°Ðt^ÿóMRCF0¿zëk8¯ÓG†(«&ŽZÕo™¦[ì•FeÉ °­Þ•èŒG¯_T^áQQnX³ú³íß ù_Ï26ö‹+mj"ç°ÇÙâÝ'ô>Ñ-r‹”?~ÚïqöÃt|úæ½Z)S—¨[„¹ç*-<˜{ý¬¸-"%ÌšOº#&%æuNcDSzÛôkàñzèäu^‘/ø«Èø³Ë éP¥ãYÛ#Ùê…yµâÜä©áeÂUpÐG£¾ÔvŽD,úW½¨t¶;‚£%Øš¤63‰;ϸêµOdv¥‡‚˪Û1'5b‰8ÚçLV€Õ ÃÄI‹°õ'³Èð/¤€ÒŒì]Ï@êjäÓ<ÍûNönšåÇïɤA±:ÊQ±ô}(×ú–ZÌ{‘ÔµžgÊ&ßloú|;J|®·}Nͱi6FK™s†…ì«îLuVóØmÏD€ïë¼(6e³ŸgÈêÙ;o4¿®ÁõLémȧ\ËãôïvSIîá± J»ØåYßpÐ^Š9¿T ¸I›ÄxÂTlB%rèË€»Bv¦;コÑÅ;ø+í¸n É @8÷$öôWLáöq$Taò|ç‚ÄÚÒáŲ»•€ú÷˜$”nùMTµÒ-¹¯Ý*†°àYøûŒ‘³sõÒ|7l”IP˜lº‹&µ­³ÏÄÔ|ôÚä•îÔ{>úõçN£—7‘BS¤Ç©´nñth”¨[†_{¾¡Ea†O››¬`\joM!¥u–±ÃOL×1¾ªý‰@qð/ €¯´ß“#d(¢~µ«ó 2 òæRT¢‚`î!o@SÚks·µ²@iICcZEÜ^‚XÞL|*ö’íZí9ã39«ÔÃÝ4">ø*¶¸¾õù‰éŽYÑ¿!‰ßägñu² ™‡Ìág7Ôâö›¨‡‹é¨Ëã³6\)¬°_0šÍÚ#e§ZZDÔ—J}%'Vó“èJ–”xÓ4FŽó¯q é_avieìB~jמ×óBÅX0j Î?᢭/C:â/±9 £o²­Ÿ´ÓªÅ'x†9ŒÇ(ÖíˤÊèßžáŸ<Íneϋҙœ™V£_Kh`ÁÀŠC¬D1S§tä§þD “=LZ=ž×Ük‚ŽGüL¡ñY›Ä`ÈÛäê$í6Áæ¥dB²m5„%ÕÜ8a,};è‘ &É5N­;q½‹–—‰ä6[gJÈ$ñʬxò5‰:™úËðZø4^5kp›%Š37¾H½xEªºõwnÛ qÝ2I¥`‡G?´^ëz÷а”GPaÍûÀœŸ}†‡ú„|äUÚ· 5ÝÃMSFë³±²‚û‘É—ãÖg¬ ‰³ë ¹{ÒÀÉé8R)ÄFøÕ;%:-®?^'Í÷¿r¡Yüb\]ëÃëøYÂSM©Qü£deÆ ö8Û ¢Õ_3H±ÏR=,Ù{Ü*´_ºü¹ôd¡±n¬“iÒ¨e¦3`ž㪈c"bóð(¡S‚6U]W€UûEÁŸÛv)~œX:êLdçùkÁDøÚY›XöVý<¶Òמ:ÜÇò¼qmªêж6ùzÜ p·¾§ ôù¾íºõÃaMõo^ß’ºá³ê­µÜÏd™ßµô§Z4ˆúYu,¯˜5ùù¾€c@Mòo7ô@¥Ô½¡6Mgw qØ`†_ËÃpNzáᖃ̘?©Ãæ+ÛÂ'P(5œ¥ŠÙ@÷hiúÄŶàC„®FdFŸ”ÁÈZE2#´ZÝÜ—÷Wèú¤jÁá‘g²«â³„ögdׯT–/7qQ×ëvÍ‹SdXºõvŠ}ßÐ0õÍWéxY!TèÐ÷ŸëÓ(ç¾#OTÞ³†ÀâÓ¡%ØÐ·4F~ì´"ãYcà@à Ww!¶ñê¨)/FÆŽñRõBZr}€ó?ÙmW\ÂmM•UkX'Cßñ*â`d¤iXÞô ÑîPp ¼‚pxòŒHbŽ­@«œCôêþLW‡èÄVÆCîµsCßûÍ?˜TW—Œðõ²ÕŸ 4 ú½¢Žv}ͤ‚—£>Ó²µÔ´ˆ6®a‡ØÍp©!UmJ‹lkÚˆ?ïñÒÝG°„! ¾~îl×”¹¢“ô¼’ãø%¨ÛJÝAP„l?éq㮓"ùVËAa·Uµ —ÊLsݹ4ç.T)ÂÂEŽ÷Ü›O½#v›ûÊÙƒt=krJßrFˆø}…ÐFCн¨QH‡ÿˆ‘ñ•r¤ X­‰Šë7;8ó•"HO(„͸(¡Ûb™Ñ y“Z­å´sEéÇq•‰Ágwë¦.a´"ïë+£úA+˜x6Í%ÁŠîÔ) ‰Ç¯(à9$1j¼¸ãW=Õµsà Kœi; (­ÿI8{$]$mö@´hA›¿ê@t>I¼_ÞÅûZXñ³Ë¸Öá—Ë ™Ÿâ ø†ÔBL)ª¢»å}{D9W17 §çûñ°wRŸ„ŠØSƒËó´öün'·D¦ø¤ê±^¨šO‹®ƒÒv_|eÖTÛîX \9Äc™Iµõ?ɨŸèšŒÒòJN‚æ–Í”øò‘X¸ >)¿¶l=ßKÚÒHr—v’áŠ¦Ë D®Yô!ŸçEb &ëÀ|:5¦Ç¥p#„Kÿrx>8{,†÷ÌxÎ:14Ú½ÇlÙ–¼‘u>Ÿ%‹îÕ¿Í‘Fé¶HŸ9þK'zl&N¼–!‹œ™yBÌŒ8Åg¯M‹l6Hò·ŠBµåÎò´JÁI­Ñ“qáÓyp,·CÂB)1Ý/tç&¶>+¶®2Ñ5´å§ì½“³fðÌûÞ˜Êå’±¶Tõ7¶¥Îçâ<å"mD¥7~< Øu=_ŒÊDÚÇ.¡öÑ"¾íÁí‚_Û¿³¢ÕHë7ßFZRH¸d³“²;ÒE'ŠÄÕ*)(6Õy+Àȼ“ý³«oÃUL“›òlriÞÈí ¯M$=ÎÓ4ª:x©=x̧ь~¶5‰ =Ü+ÈÀÃ[´+N30p¬ðÕ3*Kß•Ìl¡çãäŠÆ¾i ûÌCœÜÅ^8Êþ–;«ãnMþZÚhÙ—Ÿ­`Ÿþø(¤ä§áøð­áÐÇT×Öiø÷›R~?u.šF±÷~¹Íö‡ºÒŽ,¬ß*4ëTRcbRVN2q>S >Š4ÇV®Îx)Z‡[êÉ–b·_4¢¦:Ñ´d¬³î©Þé¦ÎWL5I9õô%—kÔÔXмÎðtËÙÜÚ ™çZê^G:2XXåïÕÑ}ל˫F3è"öQkCFbÝÑøê¤Òßoáàè\ó£ŽuÇÚÝ.pýÒÂ`pr “ã÷Bo* eùîY´ªØèžô>ˆ±×êçG›r™S/hâ&ûÔOÃHÀ06E·h’IÈâ^Œìv—oÏ aNÄí­vågG+SÙPuFVïž*‹«BpZ)K#p8Æo Atô?¹Ša›t÷ÑènT=Nô„£Û”êÖø¾¤` å?,L÷ëcÁéÇ„w”ðH¬£°z×Õ—RèãÉRh|ÙÎ þ-•– ‡5Tghèbe(Jˆ}hke#^!Qî;Úûm±,™Eº€¾*\™EZ}²Ù‚€6U þQŸzKVŒ\×öáRÖuh¨¸Ç„§'úÐ2(‚€n/˜«æVà¶úå£Ô |çÒïÑ×>~(ª‚µ2"ø \ÀŒ¤uêbÀ¡d 0²‡êO¦kJ1 /pDz‰&¦Výq¢á’V ëkoB Ê·|mòŸ'g­Qï—Xká}•Ô€ƻպX ÍÕÉçºujE—7Zd"¯°ÃFf„wE†#{yƒÊÅtTŒiI-qUéß"tûa¯(v Ó½æ‚Ø™C‡7mŸ6½q–†ÃÕ*èÆ9¾½ ð&.y ÛHÕVÑ1r†oì > eâõø-€T}%qš0’óƒü4?ßq’ÜøyñnAѲñw—ôH§í{€¦‰Ÿ#á¿ÙRذˆ¥6p*vµpàµXœÆ`Bó+þJëJf¬¼_êdãõ$³—¿Ò ú”¾ô¤i³¤{ÂѼS[‹^gUóvŒí´iU‚µGi l#Ù^¢~’Ó í)ЇÏ~3·l‘ MvùmÊšLS$×Uyo²¤Ém‘ úf·Ed U{Öõ¬ååu¼H¥&„aÆl¸¹>¯¬mÖ4Ï3mqÕÇÆÔZ£ÃÊh„é`*W7‡mèpßñMâW Öîe+e1˜æà¨šQ–—}ÜáçÞsCxÛ‰™{6ÄýRˆ†¬ÈÄv÷»3i!¾º‚Gfü­¡Õ6 Ÿ£€—[R’_M¾@âh·jgæF)a—hN>xÉ9áOecšÓfG®pLv× £×Ù£î‡Èöˆ)Ô5=øQŽj¨5’ò´zÍ+ÈÑL¯ÅóÃÕßô‹ÒæØá¨<¥:ó^t¡ãóK”TÊ“J“¥Óê.§ˆŽ,A¹0¸ŸD›b«½–M:ßö%^x<¶s´Üî蘀½þØåœGhK¹­×lÛùý MT|îISô%ÇÜú1¤¶»YîXÃ^iÏβE¸b:ֱˈa¶¶+üaÊ0ŽËÅ¥zgðŽv&-¡ÓK[³c…P¾<{–Ð#T=‹ˆ2¿ÃAl–ƒs·( ˜”«'ùbþ°®kÙ]ó'™Õ_@ûúB¬…Eif)ÀùG¤Ö-8Áµ/^B«ÇKñ3JÅtÐŒ’ખ,Ë‘oNòõ6ˆpMÞr6éîÇx/gñ:Ô}›ý6ÎØÅ+mBÜÙ€Q‘“Ðð~¤`2ìQs;Ð^öö“¢*ÕD‘uòOò~ûQ¢ l´,ãÒµ„caQŪ‘ôXú×ÉSÉ€ñ3t¢©ú¨þ¬kù‡Z5<ô£9Ÿ;©ì«7ßðž_Ÿòq…uÏ2¨ÍiÒÓ5rQs të5zó`Š"gîþfퟫ¥:ýòí¢µ/Ù=çG¸!zÅt3¿,1MlùÃ1Ç`qg(gÞ!CˆEzïíb!^—¸1ë–sy"¡.Š=ŒŽ$â… sƒþóKŸýl¸Î"Éÿ—hÿJº½|Ñ;e«Š7•[¤£U ùOŒýG¸¤='·’ÈSŸ1îÞ—¸>b2.Í]»E“¥q@\Þ˜>3†T¦§Gv¿MkG– a¯à¢lîíQ'È€ŒLÎKÖîlé+ðQÉ`™¡‘OŠÉ¡ãQÜÔ¸XÛíÖµì.ÔÀ,=Mý0[ ö[gǘR¢px\Ï#1E.HEý± endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 794 /Length 3425 /Filter /FlateDecode >> stream xÚí[[S¹~÷¯Ðc¨S±Fw©*µU\ra7$l`7ä¤xpÌ|blb›\öן¯[cÏxŒÞó´,k¤V_¾nµ$¢D!œ0…ðÂ:‘DpB"¡ð§£PV(—„ BE|E¡ '´Ú¸ŽÖB£O£}Ú £PMÂXæhZŒ0I¡EØ_NXjñÂY‹áCìØBð5 ñ"‰/«„S"…(4)Ô,„RPÎAEƒpÐI(¥ ¬JUG?š¬WÊa°‹d‚||²Âc|ˆ°Z{o„]ŠÐ¦€‘AwlRJCI|ƒO€¹B‚…õÖ£Àø auPU;§a°€}hÒ>ÂNôí:ÏÁ{‚X“¼¨Rò"T™Ô&ž¢~Ä0Õ8ÀR1°¶Ú˜N*„õ ¾èV@)2UQ$“ao‚iz%à,Œ…'‚¸ª Ð AHQÃä‚À]g! ˆC´Àढ4œC’AC“%U ÀRKNƒOm)zס¨JPÉF L-ÉÓhž40ä@RÊäWòµ…‡ 59tP ¾Öpoáá]P<PE B¢0@%ÂD›ðRÓâZ ’¸kEÒ<É!oST+§©¤'_S€û³gB ùr|<rO<™–ýÙ`<êª-ñË/'û£Ùd|vÍm[k‰u&~YÎfƒÑ¹8šõ&³òìúëO‹!s GãËRlÏËO“Þ /z£ÁÕõ°GDÓõMü®7:_Š—“ÞÕÅ-Ô¶!ŠiIàx2˜]\Þ2ÊU£®Êþ 7Ç?¯Ê©¾SšÏãvÇå¤3l5 ~Ãî°7–«\?"›â/³S¢|ö¬#I!{çeGîŽG³r4›bÖaG¾+§ãëIº"ÁpËAy6è팈<"'$}Úƒ FR¨2Ùöh4Ÿ”¹HäigIwwäÑõ§?¿Œ¾täÎxrVN˜±:•¯ä¾Üý¨ðPœ’&ý жëÍò¢k%KÕEò2Zwµ Û·{¹Ò¢Åɇc&waGẅ£ëáðt]bº¢0©î$t>uí}8šàº¹m‰ð|ÁƼ0œ"²ã(誎 RK®GÊ*Us¢u)×sªêž2LU”]¨iòp2î•€q°÷BÈãòǬí±V€8ÝWl 5NÝÃ57[Ñà¡ùƒì ºg`¹•0ðE·pë-oXÛDáÎ0x "¾XA$>‘´‘‹F¬µùƨ¡¶m¨×3Ô›û¹~‰Ž\¯£ë°[çúÆ4n¢³f.4#Bñ¾ã1è¤tÂщ÷D'¶ÑA"UØ®=4%,#òè‰L‘ î…Hð-D‚¾"Kt9Uènté1ˆ¬Y%šHab„Ç!µ;!<©{ÆNhÇŽSª«‹t7¡v¦«€Ú= ]“ d$ª±#¢FÓ‘oz—%{"ërЛMZ·Pº %𯮟fª–N¥8Uà4ÿž6@µUÚ¿„ëvo ±?œLg»½ (ùº×xx?8›]Lé$Æ~|>êÏhŸ«IA„Ä{J‡³Ê‡­¡]ÚiÃÚù8øbðùs §“b“—½äÈô謧ltÝxÚùèp~þçó?ûüƒðÿaÌ %b²]+"è‘ZLÑEÐGÕ¥_–êA”©°HR©Àœ68è Ç#S¡Pú¤ºÏñø"’è D˜ë ý¸©NÑvC%GynÎZp ¬/8eQÝ7ê.¸ªV=cZg¦”gÕ¼®C—~ºRÕˆÜZãV_øEKr±kæ#ԙ²Ý:.mÍÞŒU®ç’µºÆÒm¡Òì1eæÓ,ƒosÎ-^5@áWì=ló}` áØ¢Lg"QPLÏVi²0¦'æšÇW4ãw깄LÉeJħÙâKª ˜i¢Ò´)·X_ð§~ʽu[s µjŽÒ¨ñ¬Wæ§)0mÁQ`˜ÂÌG{O:YRËx0ÍHš;æžËh¨%—¼@ î-Š•OÀyÔZâÍOšñâ1ôœ8¦U¡ØQܬ%‘d1u­IexÂä’Ù7ûêݤغ^Ñ"sµTÏen!ÓBÁ!‘Íbð|äɃŒg7ÑŸ]QÛé5ýþé«þªÇVÜsz©RówNUè…xG›6b]Ú®5 `f•7õ†÷¸uɧºæQ¹Â-Sg ÃIÏp6¬ÒèÍäz.Y2eE ÑùÇ–™OUZMQŠæŒâ(§’ž£Mè)‘5LK D6£lËóNCtc3 |ìÀÎ'Â1pOp]ú ØSZÍf$N®ªG“(kþ]š¹e:L?ÏVÕ\úZ“œ&M‹œåÜJ«pçïœO[BEO­sû¹5Q™[’ EM›û­#=,FÀ'5÷e„rËSÚûáÔ£}—^`:DFé%q™& Ú½æLDen †ÖV³ðP°Þê¯çKžê-ÖÉ¥´VoêýÂÏå]³Ù‹çîý~üž°X¹6®3 Üb㸥äW,!¯«E„pyWìžÉ³ñpØ›¬ Û‹*N›+ÃrÐݲÜxjÍÐzÑ+wzÓ’ßv¬ìS—|CW¤øwþú7WŠp¿#ˆ› oo[ÂC[¸õKÂÕBxR› oï¾ZÂS[¸‹ áô07Üm.»µQZM÷ÏZ²)šoD==Àå­•¿-ܬ n›ÂUýZ(éÄÛòܾo´[mOµp³¹ðÕµ±-%äŒ]r1l.¿ëÛÒWbκu³-m.½][Ò•º¿í7¬pô2xJoƒ¯)/ÞíÒÝEfûÛàlº¸ U]ª.ÅT7Fª{ùBÀé-Üõ:îÕ›óp'‡8‘¯-To [#Þ^φƒ bHDuq„¡÷¬ùheî|àë]êÍ×âè–/×*uõrŽdb=¿CG„›Ät×3?OÊot»³öÝþ¬u™?d]žª·à¯oã_iú†^Vߨ§šóQñ>Ê7ùØU>*,øØ[øÄ&›â6 ŒÕ2Æ7¨¾@ø6€mCà܈ ¶j‚­n{µºYs_Ò6>ˆÃ'{ãþS¾ýºE¯ñ)&Ÿ\!bé’§Ig½E÷½ëg³E÷¼ëg»E÷ºëg·E÷¹9¸åëÁå`Ö6§:m+Äí~‹n{×ÜÂÝãÝææçÆõ_³Ü•Ãr ”V+JÍ6¨V”j\ËUi™' Õ-Á`¦ç’[÷‡•Ziç µFµÕjˆlS/Ô˹D倿«ÔùÛßü:fÈÉ Uê†õe·‡=ìø¼““Yý晪h ˜ª§êyy0>+åÓ²Nko¯ÊÑ6k@ÿ¡’ö_ðYô® endstream endobj 120 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.14)/Keywords() /CreationDate (D:20151013203257-04'00') /ModDate (D:20151013203257-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) kpathsea version 6.1.1) >> endobj 121 0 obj << /Type /XRef /Index [0 122] /Size 122 /W [1 3 1] /Root 119 0 R /Info 120 0 R /ID [ ] /Length 293 /Filter /FlateDecode >> stream xÚ%ÒGNÂQ€ñ™¿Ø°€l ŠbG;"öÞ{A%á žÅ˜¸ñÆ¥§páÖ˜¸Òµò›_¾Ì{™¼ÅùuDQ'ü%”.AÁ?\@¸ çP %Ð gP eЧPn€¨€JˆÁ1TA5 ÃxÀ 5P *â±7×A=lÁ&¬ÁìÀ*lÃ.ìA34ª¸“¶¥ Z¡EÅ›±YÚ!¤âû±YD ¬ø´Y¬C/t©Dþ/wCúT¢)›õÃìCUßv:¤’ Y%`’0ã0“0Ó0)˜-,ø°i•»¼ÕœÊã›UFåÕo5¯¼·ZPMç¬UóOVKªÏV˪ïY«8€C¸‚,\à ÜBNØKáKÅ]òy't endstream endobj startxref 143876 %%EOF graph/inst/doc/graphAttributes.R0000644000175100017510000000766012607321273017724 0ustar00biocbuildbiocbuild### R code from vignette source 'graphAttributes.Rnw' ################################################### ### code chunk number 1: exampleGraph1 ################################################### library("graph") mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] ################################################### ### code chunk number 2: exampleGraph2 ################################################### g1 <- graphAM(adjMat=mat) ################################################### ### code chunk number 3: foo ################################################### if (require("Rgraphviz")) { gn = as(g1, "graphNEL") plot(gn, nodeAttrs=makeNodeAttrs(gn, shape="circle", fillcolor="orange")) } else { plot(1, 1, main="Rgraphviz required for this plot") } ################################################### ### code chunk number 4: edgeDataDefaults1 ################################################### edgeDataDefaults(g1) ################################################### ### code chunk number 5: edgeDataDefaults2 ################################################### edgeDataDefaults(g1, "weight") <- 1 edgeDataDefaults(g1, "code") <- "plain" edgeDataDefaults(g1) ################################################### ### code chunk number 6: edgeDataDefaults3 ################################################### edgeDataDefaults(g1, "weight") ################################################### ### code chunk number 7: edgeData1 ################################################### edgeData(g1, from="a", to="d", attr="weight") edgeData(g1, from="a", attr="weight") edgeData(g1, to="a", attr="weight") allAttrsAllEdges <- edgeData(g1) weightAttrAllEdges <- edgeData(g1, attr="weight") ################################################### ### code chunk number 8: edgeData2 ################################################### edgeData(g1, from="a", to="d", attr="weight") <- 2 edgeData(g1, from="a", attr="code") <- "fancy" edgeData(g1, from="a", attr="weight") edgeData(g1, from="a", attr="code") ################################################### ### code chunk number 9: edgeData3 ################################################### f <- c("a", "b") t <- c("c", "c") edgeData(g1, from=f, to=t, attr="weight") <- 10 edgeData(g1, from=f, to=t, attr="weight") ################################################### ### code chunk number 10: edgeData4 ################################################### edgeData(g1, from=f, to=t, attr="weight") <- c(11, 22) edgeData(g1, from=f, to=t, attr="weight") ################################################### ### code chunk number 11: edgeData5 ################################################### edgeData(g1, from="a", to="d", attr="code") <- list(1:10) edgeData(g1, from=f, to=t, attr="weight") <- mapply(c, f, t, "e", SIMPLIFY=FALSE) edgeData(g1, from="a", to="d", attr="code") edgeData(g1, from=f, to=t, attr="weight") ################################################### ### code chunk number 12: defaultNodeData1 ################################################### nodeDataDefaults(g1) nodeDataDefaults(g1, attr="weight") <- 1 nodeDataDefaults(g1, attr="type") <- "vital" nodeDataDefaults(g1) nodeDataDefaults(g1, "weight") ################################################### ### code chunk number 13: nodeData1 ################################################### nodeData(g1, n="a") nodeData(g1, n="a", attr="weight") <- 100 nodeData(g1, n=c("a", "b"), attr="weight") nodeData(g1, n=c("a", "b"), attr="weight") <- 500 nodeData(g1, n=c("a", "b"), attr="weight") nodeData(g1, n=c("a", "b"), attr="weight") <- c(11, 22) nodeData(g1, n=c("a", "b"), attr="weight") ################################################### ### code chunk number 14: other ################################################### ## We need to reconcile this #g2 <- as(g1, "graphNEL") #edgeWeights(g2) graph/inst/doc/graphAttributes.Rnw0000644000175100017510000001367012607321273020267 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT howtogenefilter.Rnw!!! % Biobase.tex file will get overwritten. % %\VignetteIndexEntry{Attributes for Graph Objects} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \newcommand{\myincfig}[3]{\begin{figure}[htbp] \begin{center} \includegraphics[width=#2]{#1} \caption{\label{#1}#3} \end{center} \end{figure}} \begin{document} \title{Attributes for Graph Objects} \author{Seth Falcon} \maketitle \section{Introduction} The \Rpackage{graph} package provides representations of graphs (nodes and edges) as S4 classes. This vignette demonstrates how to add arbitrary node and edge attributes to graph objects. First, we create a graph to use as an example. We will work with a \Rclass{graphAM-class} instance, however, any subclass of \Rclass{graph-class} would work. See Figure~\ref{foo}. <>= library("graph") mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] @ <>= g1 <- graphAM(adjMat=mat) @ <>= if (require("Rgraphviz")) { gn = as(g1, "graphNEL") plot(gn, nodeAttrs=makeNodeAttrs(gn, shape="circle", fillcolor="orange")) } else { plot(1, 1, main="Rgraphviz required for this plot") } @ \myincfig{foo}{0.33\textwidth}{The graph \Robject{g1}.} \section{Edge Attributes} \subsection{Default edge attributes} All edges in a graph support the same set of attributes. The set of supported attributes can be defined and accessed using the \Rmethod{edgeDataDefaults} method. A new graph instance will not have any edge attributes defined. % <>= edgeDataDefaults(g1) @ When a new edge attribute is defined, a default value must be specified. Here we will define two edge attributes: \Rcode{weight} and \Rcode{code} and specify a default value for each one. <>= edgeDataDefaults(g1, "weight") <- 1 edgeDataDefaults(g1, "code") <- "plain" edgeDataDefaults(g1) @ The default value for a particular attribute can be obtained by specifying the attribute name in the call to \Rmethod{edgeDataDefaults}. <>= edgeDataDefaults(g1, "weight") @ \subsection{Getting edge attributes} Edge attributes are set and accessed using the \Rmethod{edgeData} method. Only attributes defined using \Rmethod{edgeDataDefaults} can be accessed using \Rmethod{edgeData}. If an attribute has not be set using \Rmethod{edgeData} for a given edge, then the default value is used. <>= edgeData(g1, from="a", to="d", attr="weight") edgeData(g1, from="a", attr="weight") edgeData(g1, to="a", attr="weight") allAttrsAllEdges <- edgeData(g1) weightAttrAllEdges <- edgeData(g1, attr="weight") @ \subsection{Setting edge attributes} Attributes are set using the replacement form of \Rmethod{edgeData}. This method allows the user to update the attribute for single edge, set the attributes for a collection of edges to a single value, and to set the attributes for a collection of edges to different values specified by a vector of values. <>= edgeData(g1, from="a", to="d", attr="weight") <- 2 edgeData(g1, from="a", attr="code") <- "fancy" edgeData(g1, from="a", attr="weight") edgeData(g1, from="a", attr="code") @ We can set the attributes for multiple edges to a single value. <>= f <- c("a", "b") t <- c("c", "c") edgeData(g1, from=f, to=t, attr="weight") <- 10 edgeData(g1, from=f, to=t, attr="weight") @ It is also possible to set multiple attributes to different values in a single call to \Rmethod{edgeData}. <>= edgeData(g1, from=f, to=t, attr="weight") <- c(11, 22) edgeData(g1, from=f, to=t, attr="weight") @ Finally, we can set the an attribute to a vector of values by packing it into a list: % <>= edgeData(g1, from="a", to="d", attr="code") <- list(1:10) edgeData(g1, from=f, to=t, attr="weight") <- mapply(c, f, t, "e", SIMPLIFY=FALSE) edgeData(g1, from="a", to="d", attr="code") edgeData(g1, from=f, to=t, attr="weight") @ \section{Node Attributes} \subsection{Default node attributes} Like edge attributes, all nodes in a graph support the same set of attributes. The supported set of attributes and their default values is accessed using the \Rmethod{nodeDataDefaults} method. The interface is similar to \Rmethod{edgeDataDefaults}. <>= nodeDataDefaults(g1) nodeDataDefaults(g1, attr="weight") <- 1 nodeDataDefaults(g1, attr="type") <- "vital" nodeDataDefaults(g1) nodeDataDefaults(g1, "weight") @ As with edge attributes, default values are required for each node attribute. The default value is used as the node attribute for all nodes in the graph that have not had their attribute value explicitly set. Attribute values can be any R object. \subsection{Getting and setting node attributes} Once a node attribute has been defined and given a default value using \Rmethod{nodeDataDefaults}, individual node attributes can be accessed using \Rmethod{nodeData}. <>= nodeData(g1, n="a") nodeData(g1, n="a", attr="weight") <- 100 nodeData(g1, n=c("a", "b"), attr="weight") nodeData(g1, n=c("a", "b"), attr="weight") <- 500 nodeData(g1, n=c("a", "b"), attr="weight") nodeData(g1, n=c("a", "b"), attr="weight") <- c(11, 22) nodeData(g1, n=c("a", "b"), attr="weight") @ <>= ## We need to reconcile this #g2 <- as(g1, "graphNEL") #edgeWeights(g2) @ \end{document} graph/inst/doc/graphAttributes.pdf0000644000175100017510000031374012607321273020273 0ustar00biocbuildbiocbuild%PDF-1.5 %ÐÔÅØ 39 0 obj << /Length 1130 /Filter /FlateDecode >> stream xÚ½V[oÛ6~÷¯ö$a#R¤DË€K†H‡-öÐõA±åKK™/ñòïwn²åX]l ZÔÏw¾s!yÞŒG7¹‹t©Œv6Ï"“ie‚‹ ëU°>O£ñUbŠx»]':^ÞÃßƶ†¿M’晎g0m×<ÿæëêþ(ÈâŸ`zŸ¤NÇŸ`VOPw“|¿»¸Ñ!ÒZç š.µÒ0KW>¶|‡*[3.¾I¼‰+x€1iĉR«ÒXÐÌU^ZÖD³ÔlÁ8Я׌ A”¿â¹yC;æcM¤­ÊmA|R]åL¥Ö(ïãê$Õtß‚^“äà :Ü¢¯ñtG—-}#H S ` µò™Du¼@çÄrè­3™ ÞÁrZ6GüÄÛ‹sL–6e·Ã^MSÆŸWÄÕ¼^Þ‘8‚ü ùÁ˜v郯˜×š–°&ö°}©¶¢Ð6²ºáÓÆsTCNœß3‡Ñl  =ETùR5h’ç?“%PÐ VÉÂ;ËO¬’ JÒj‰B¶®ŸèMa¤:ËÅ—ö´Ð °ì™“… ;>ƒ&è2Wµ$r6àWáU™›!¿¾ê’ÓÊAâE•£º“POÙd?Ô:ÆÜØ<¾«5ÛÌ|·> µbcN÷¬¥N*ã=kA˱ö=Ô¦ÉÉä’Ž~Ùhò|†!Å7h¥÷™+œåt4`„³ÓÐ úJT¶üúåûÅÙ\XG›“ã4ãÍ€J½©~9 ñm’ú•ÿ‚TËþ5 0Šæ—Jï%êY‚†ØÆ%Œ1Œ_`ü ãúÛH0[)/\j‡Wœ$®ÞHªVTgšvŠä¦ŸE¾%^¤ùAtŽÇ>3GŒx¥Ãx-”>þM!õ]øßù l›9­}‰>´K®`ÜV´Å¹Éºí±½bÏ{9?ëM‚.»Žï+v¿ð™ÄûÞ)¢„wÚÝF¢I/\S^Z˲ù! Õô^nÌ•œ0nÒÇlÎxú^’;=@‘ø’v¨,þðõÇ>0u“£ëñHzéÈ@—VÂŬá|Ρ[›¬FŒ Ïäï‡ ‰;\¼]éè‡vô3üºOi‡—öß`/ÒB TÐa› lN»ÓÃý5ßÒžõçÕŒ2EÞ¿¢ôùe¤3e×37(…ÝuZfÊYÛuÔ®¿9Òå endstream endobj 37 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./foo.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 51 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 52 0 R>> /ExtGState << >>/ColorSpace << /sRGB 53 0 R >>>> /Length 784 /Filter /FlateDecode >> stream xœ¥•Ën1 †÷óYÂ&Äv®ÛV€T ¤Ò#±@,àU‹TºàõùíLf2‹Vu|Éï/—Ü•#wç—k÷è‚ÁÏÁEaý;Rñ9¸ï_Ü{÷myñôîõ…;?-_@tŽÅr‚{:÷åÍV÷þûæò-NKr?–]p· ¹+üÜ-dw¾YœËɇâ$GŸª{ØJõ"®d/ì¤6õ¶`žnœJA|ÝÜDsæ°za‹^ORðU¶\™KËVz½¸ä91ë^,§_´nd^1(Ÿ¾ºXýê迺+Š *‹;=¸gŸž»ÓÝòòôÐÎ eßd†5NzÏÂÕS<$’ùv^’’Ï»?ró\ۢדÞöÈ•Cíظ{õÓ!—޵ÿ™Þb×_È }þ4j&•¡gÓ 7MÆ @8G-`aêë–6Æ´ñá‡Ü8×¶èõ$°ç4rõ½öjYt¿{=ºzîQ÷ÿ@ã{]ñ1´ó_BËÅGž™UòT†ìÆê]»êÆlõÆ9/NU'ZI|.#/ÎUã^µßÙV5=ï õÿ8‰f6uL·¦|%Œ]ôµnÎö¤{ò~!fKNžÌÆÄ#¬°Úš“@:5°¡œ0ú!’ÚYlœ ¶pS»DOä»&Z½*¾aSÔ4ØM|hÀ‡¦6£0ÁèÓø›¥5û¨Á: 8/¯hlx}„E±°`ñÜ d4Üh"^%)lSÍz¯ ¶’RñµšàêüBú¤*¸ê²£P}Œåú_õ [¥°P5Ábàï ¦T GëÊVDT°¢„`Á·CQmlµ–p5;WMTÂÉìT=wÂI0F #Ìæ×=¶6?:à‰°à1}báh31«4ì¾ ±`ºÐû†˜1¶IvÄCñ@ÌX¿qBlÒÚŽX¥Ñ„˜…Ë„¨8Oˆ·õ|‹<ì:­vaÕµÛ™õ_án'Ò§ÞmŒJ›ãñS™ljX/“—L³?„ÃýŠ¥™àëå'ã ­ endstream endobj 55 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 58 0 obj << /Length 1331 /Filter /FlateDecode >> stream xÚíXÉŽ#E½÷WX#URW’[m1Àpáb‰Ã0Õvy‘ÜvË.ÕOlµÙe»Õ pà`;—È—‘ñ""#ýÃøæëŸ¼¯œOìh<¥¹²£$×*ÍÍh<} lcãàCh‚é¼ #—úà}èLPÁHµ…¯åÝÛå.ü<þ•Êã˜õ(²Neº†S ióG\5ƒ¯>ûUÅàåtŽã؉i¦Bôí¾`£~d£l”«<±‰lc2å2Ùæý ÄVaÚsÐzq€0kž(xd¾-`pÁ½ª‚ý‡0²I°ÙV,\‘ë…bÅ}§ƒM‘ÛÌx¬ ó âh!Ò]JWaä]Œµä•»> àŠ‡ZzõT”¯zਵ€Óô¤CÞÁò4-¦h½?´ñkF3’åˆ.¶\S°‡Oò ˜Lj}w%eÁ~'[®ç,Tñˆ‘Øu(1:UÎ%°—„ LÝ ‘_È¡ éãxãÄ ÏžeÊj[ƒß—"¹ØÐy§lâ,¶à«¤æ%ÜnÇ{lBš`kRòÌ*ž„g_o*n,HGØçKÈÆÅAX GîˆÓ‘…#“Ç*vÙ‘¡iÄöïÈ9G‡(‘-ŢÄÌæÈó¡göû0Š­{¡µÑIb-Ë wÍÅÜp$“ñÞ+q H»¸K dÜû>ÀïìK¡¹¦Í™òÀCe“‡pþ|±ÀrÇ¿=S²ï›à¨Ò¾ÞdÚ$£="rYÇË+± Þ#Ñ{v’jƒ fw’ëèa>ÑžOŸ‰ðYòÈ R+5¨˜  ØPÐ Å\db­’üÈ{ß&ônõ¥¯! ÍQ‘ä·Ð‹¸i†2ü›«Ù§ô‚zïˆD†-êk…ücj?-±}uÖøŠ~èÏG@”Óžxþ ‹Öºž[ÇMõb†bCå:Ãv¤1œŽ +QÔõÈrBµ±T/Û4[ 9á{–ÚwTÝ”¼rsG,.Û$MÃw˜ë¹½ãr¨äˆ‡Ï#n²&N°W§™+7®‹{i5•¡îÔ4ÃÙuRÔ9ÒDE<žúÓÊë7+œŠm>œ£ 8œ³ÿµu>ØÒóñ3ôªHU–v_üRñÁÏ%q^רøŠ8}Rœy»\xR´ ð¿‹7*HÀ.[m8Xß`qT\ã<Õâ Ôzó©Ù¬öpGû§9ØÉé|¬´qWêgïM𪳢Hã3œÖ­•l¹c¥_'G¨ R~rž9KÄ¡è­V6?ª£_HI¢’¸)F0-yÝIK^[, ðMÀLÉë†Û‘¦C ­tö\~ŒJÛb ëÆXg¬«i/g7 ‡ÊŽÛ¨&=`ŽÏW{(N\£É(ë²ç»\š4…_}±Ð9j~cðè¼Ïïµù‚W@¹–BkÛÛ6ý6o¨ûº@¿ ¬ËúÁ2pÙ¾»ö’õŸ~VBN˜3¡Ëü?á;I”…üŠX%"õô´?Ý$4A«Å^Š›º‡E|G$VÖ6úç äMÍ{ýÕyt‘L¬’ä"8©2P3]­¯þ}ŽÞ€„ôµI˜¼ ÉŠÜÿç\侪ÓôÞÉp5B5Å©r&©ÿº±›㛿 ¯þ¡ endstream endobj 63 0 obj << /Length 1036 /Filter /FlateDecode >> stream xÚÝWÝkÛ0ï_aÂl˜UKò'lƒŽµ°½.°‡¶0ÇqÚ@—Äi)ìßtªeç«ë’ÒôA‰,ÝîK?Ý}ퟜ^DÒÉX‹Øéœ$c‰³€%wúCçÒýà]÷UhQELîšà7ÈAf »`äk$ñˆÅñVQ¾ˆçÜñ9gYiÂKÇa\{~$$L„øB²ŒïMñáë(|Üâ3xÆ¥8¾hʘ&4Î`Ô4æ0´föÏa î70Jµ¯D|‚©¯§e‡â›²RKÄÿ« h›ëÏ'ÛÖn$eL,·$©«çAuüØøÉ>ó3ŒŒM:ö,óN/BáhûEB$L&‰¶V0 •x@DîOV£„ñìÆóeºåP« ‘ÖC)'–µ6R’v¢2™RÒžy"iôW¬0–uã%É7ŸÓAAæ.ÊZO–¸3e¢"D¾["T*9&ë@iYS€*òÕr>™¨%Xy JÛ¼%Þ‚rÞlTÚ tËÉjòœqŽúÄÔöE•ŽÚž¯Æ@BDîÜ¥&ß'Z~ĸPêÜ E¡R‡Qçú9egðEç”\ËÅèU“ y¼¨‰¯šém›¢¦ãÍy•&Pb…Jm[ç{/‚ ÙY*ÅáR͆+RcâŽ' HÄ;\¨.¥I<˜ T—ŠÊEÙ2IÐ@¤Q¹wcÉ1Q‡)Ú>¾ ¸ÔI?é©Êt@V.Éɸ´À˜ÄâÞPï õQ &ýîqéÉýFy£YÇ‹ ¶æE J_z#»J]Þôrú'²šHÌö°½ýbèì"·ØòVÔÀMÄ:¤C7jŽ#’;#ÆGÅðÆ,zÞsÖBîN]ñÿåQNåQqluQ|x0ÅÅÛ¸ðÿ|ÞEÖì¼ÄÇ–M[ jXURøo¯?[¶„ôƒ—p9!丣ze5EHçÎZEÈšçsÝëé· m·J£X/š‹´æ–ôÈÊÞîN§Þ%ºX]> stream xÚÕXYoã6~ϯ0‚>H@̈‡®¢-b7E‹íÖ/Åî•%9v×vR[ÎvþøÎp†º,%éîÆ@hRäp.9ŸçÛÙÙåu2IE©h2[LR#¤1“( DœÊɬ˜¼ö®}é­ m³5übûà'Æ»ð§Zkッ¯¤qžmq ¼} T+.KÓºö²Ê®KoǼçž`N8¼eZêî­œœÉnw4{» Æ÷~yV¿ŠÞÓê÷| ñLg¹¯bï³Ú -®XWš†MÇò×+Ë—Äé¿ýpyÊ–ë¦Òˆ|7•0‡Sè»oüi¨´‡:Vœ´ã¨ óÂþM¼,¡]Ю;èÚÚ×ÐÎyÇyCV1‰[.ºËNŽs·#Ëy[Á:“’v}_S®Ù_ÎxVVZ?P¸½à–I." ÃgrÁbØôêq“ß³ì Z2ͨéVlÞU´¥Ï[¾å©ß`ø=´¡ýíã-ûuÅñ¯!ýËSº÷F—G·.¥À(™Q_0‰i‘„B) „–àH:Ôé+û˜“ E=Èjª‘¤]G¿f×½õ§201Œ©WÜkî ÷!÷÷1÷ ÷)9®ÏÀsBövÜòºJ'<ãü#Ï8RÊÑCv÷—îBý™w?)®ù^*-\Òütëæ'±nþ4ë.¯š@‚Ó&R|–Z5ic_ªÐû‰Ófà˜Èãž1ÍdSýü`“ü¾áiÕs<ÁIÀÔÂjKŒ1ÄËŸÆaé:6ÞeI–eZ¨‚ Eåä$Ý(”‰Ð Ky…¤ïÃRìÍâ¬Ñœ}Eúc6„ bŒöy`õ€Q‰–! bFÝ ²Ëî–ô…Iõ@éŽ pME¬jr4Ù¦õQ2¢ŸFÍÚðŽšÂŸÆAâÍ–®, [wN ^Å ÿŒ3 'îJ$Â<|¡ì¸âÇ¡\ÙÄÎõiâN{šI0„á‡<ˆmž“ga¦,hÓaïÐÜMK^9p#”IE¹;³íå¦þú‚çë˜ãì_YuŽ¢*‰…V¡c¾)™rÙœC˜4çàL#´YòëºÈòî²wMG²a÷öH°Y±bÙ®Û·æ#’æÉx,…üWóµU옋At¬ðÖ%ƒ íÓã(á=-ÿŒÀÚÖf9¾ùyÿÜðõ!ÀxZÕ+ÎwýÙÀ…{¶Ñ©²nçØç7å©ðeì@í%^9ú^jó‰Fø¨³F8>A|€8ä´î³ãþq·w]a²HA¾sÊ’¾ë¼®SõPýaOf˜ JS©MS!§)ÎóÈ>Ûñà ãÚý×Yï8¹âÊ•.P!¬F$N½6t`ŽÕ°‚H"™z3WVI;ùtÍ…—T¶ó©ãªÚI¥®W´õPçVxÙžú:…ÓgOU$Ãvµ6)-Y>‘•Ë÷0Ë€©–ËLÔÔÖ(«èÛŽ±¶sïªQVO[ÕI½eVô qX¤£ûP)ÊÔ°äÐÌ”»rÀŠ!󪪋·ïà€ Èxåðz¬Ö;=®h¡0WD›[ÇäÙ¶®u)ïW.ŽEh¼?Q|NòG`w,’¸ »•…ÝÆû®´jÖø =¾Û‚ÆŒ{Ûî?ûœtPù0†èóŸ‘£CC`'–áà€[AÓZƒévÕÇžÆs»5(·4cÙ¼ ¤áŠ  ~äé0,ŒoVö¡ÅÐÚ¶´‰(pYó*ÚÙã‹“T©æxüôi©…‰ôs¡S„g5ô½ O®è Ég.‹È T'Ô™F"í—A:·–Šº#ÞßÓr]v¾§M},söñáH:v‘Œc›§yèÈFЏqï @UA*d ? ç §Áí@E­I}mõ” \@x]„Æ[‰¢ ’½œý £nS endstream endobj 71 0 obj << /Length 326 /Filter /FlateDecode >> stream xÚíUMKÄ0½÷W„â¡;)I7 D=xÎmÝî눊ÅïK“Ò´›¢²¢(;Ë̼ùÈczd’½SY1͵Š™+Vk.˜Ò%¯51³fól'§l™/Ì+YAĵ”¡ƒÚßฮ $)—4‡ƒ€E^HQÁô1¢âÃ‚Ž·^Ç–?ÒĈ/…ùìûh<ÏÚ\ŒJÁ¨¶*˜hæ˜Ã=¢€µŸèسtlç¥,ý¶înŸuÐÖqQiïê’-ž‚°øÊœEÈeïã_Ñ튲²Ed_ÒýEÄš«°ÁíGtRM?ʤø6t4ÚÍHO«jqB#õoÞòXH2*$õ7…TO ).ù)!É÷9¾áèü¸ ‚hØ¢€)‚Gú?[g‹¶8Yn½m;³ !ðý&0*âùÒÒÆ%'&yå¡«” endstream endobj 73 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 84 0 obj << /Length1 1766 /Length2 10140 /Length3 0 /Length 11254 /Filter /FlateDecode >> stream xÚ·Tj- J·tÊÐ 1tww—¤3ÀPÃÐÝÒ ‚„HHKw‡‚t‡”HH·ÔÅsÎwÎù¾ÿ_ëÞÅZ0ûÉw¿Ï~ÞY0ÑiëqÊ€aVE˜3‚“‡‹[ §!kÌÃ àææãâææÅbbÒ‡"!ÿ±c1BànP˜³è¿"äàâÁ&B<jÀœªîŽ> ((77€—›[ä?0¸(@ä4¸ª0gˆ“ÌŵµC<ôùÏG«5€GDDˆãt€Œµ94@;ˆÓCGk#@f … ¼ÿ««¸á" zzzrœÜ¸`p[I6€'aÐ…¸Aà0à7e€&È ò5.,&€¾ÔíO‡Ìá ‚CG¨5ÄÙí!ÅÝ ºôTÔZ.ç?ƒÕÿ àüu9.ž¿Ëý•ý»Ôùdµ5ÌÉäì u¶Ø@!-Eu.„‚rÿ9ºÁòA ¨#Èê!ࣃŠ2:Ðÿø¹Yá.7.7¨ãoŽÀße®YÁ,sr‚8#ܰ~ŸO ‡X?Ü»7ð¯á:8Ã<}ÿƒl Î`›ß4Àî.@g¨«;DEþ¯˜Ö?6[ ÀÍÍ-$(€¸ ^ÖvÀß ô½] 8y~›8øûºÀ\64 þPÈÃ,_7€€»Cü}ÿíøo„ÅÃC­+ˆ-ÔëŸêfˆÍŸøaþp¨À”ûA~<îß?2PæìèýOø#êihéè±ÿEùo§¬,Ì àË)Ààäàððð‰„¸þÿ]çïøû?¬Ú è_§ãþ§¢Š³ ò'‰‡Ûû¿”Áú×Ú°þ»ƒ&ìAÏë?ò7ãà¶~øÅóÿ¼¤üÿiÿw•ÿ«üÿ÷DŠîŽŽøYÿ øÿøANPGï¿"ôìŽxØ ØÃ†8ÿo¨äÏ…–…9‚ÿ×§‚=lˆŒ³­ãß×uS„zAÀÚP„µÝŸ"úÏŠ;B!Ú07èïÀÉÃÍý?¾‡³vxxTÜfõ‡ ò°RÿÝRÁÙþ½{¼‚òÆâ~¯€À—çaIÁ¯?´ r9Ã)€rþë÷D@™ß¦?‘0(ÿþFB< Ò?ˆTù=äiþ„|z#!ôzˆ´ú=t°þýæÿ >t„ü ò€6ÿ‚]lÿˆ@ÿú8þy*;ÿ >T†ý ùNñðtÿƒ@—iÂþu~þ/øÐÍí_ð!ñ7|P9a‡üSñaz@„'ì_ —âþü¯iZ»Ãá/Ýûö0êÿà?žUÄ b5? ³ ³¯ k»¬’¡òäÜ•˜bÚ0Jcãô‡·»ÿÂCOa«|ò ~.“2ð‘`i]õLzöÖw·¹=²%Y§õÚïÆ2Iwb£knœôóXþ®Lm/ &5§¾ô¦ß­«Ÿa°ÃãfäNU¦Wwa<í<¢KÏ%¯ÚÞÒÅáˆÙ ÍJA5ì›ÒIÎ8ƒX³à¢i¦\«¬rz4' Æ3ÂC/üé³ó)Âì±{ZÕ$v,ÿŸq|¾&+¼ñW3>_Ëôyݺ()LÈiŸO0ûÊþHU%ûâ[\˜ ShCc1Û(ÙŽr實ëœ/["ß¶ –+Å_ŸˆH°ÖYc’ØvÔËî 'Ì©*š¼å±|å¦Ó±uKêS>ý*õÙ±§Í™þé•ãÓ°3V)´Ž‘?R¿ÎQä}î ˜d©{u(4Çk•‹0íöyáîu<º<òSrÆxgzªÿ|OR‰z€4ÈcG—-†öbïQÿç Â{Idª’¸‰GjöÃÕßT;}ðî?i¾Ûµ•Z°ß¼’Æy´òÅUÃ=l\j ™ˆÏ°UívFR»ŽfàÕË«2}½Û›%kE(5\¦ «ª,òS£òX(›"mO‹.´iDGë&J&_boƒ+eÁ¯ü&TJÇ÷Õ-<_jàW|ƒ0ÈËðd}à3J~ßÅ5<~Ò©ÊE*ø¥bšF·¥[{:Ƣȟ¼±‰µ«kë;gñ¨Á³‘ŧ|e[çëÊžd¡>:¢fÐ[iñfWG¸^OX{µ”’¾÷ SJÉšB(n"-8—! ¶8Q‹<ÅîsóD©=—™­+þ¼,9ZôK%ñ€u2©,nI®ŠáLð-êìFŽÑ}s¦®9ný[‘T“L'?k2XXdubð@ˆŠ™S„&RD€súë=œó n3Š[uœL8ÊÜ,JJ[°VÏ}ÆÂב½øÌò.|äÇbÈa¬ƒ, ›´ÁoºmªCqo€ÖFoBåÓún)Š…‘Cé~f5Ã/k%ÊC陟ì̸at9$J¦§§Y:©ÕH™û—¼]J4gßõ„“¢›¦bR¢9Õsv<û¶ÞµÂ_HÌ8ÿÚPÞ„³2µ»"}ÚhA-Õ¥¾g?¯©!7@ßý¢àpVk·–‡$©Œî*˜:”É,ÄŸº…»½4ÙÙ‹Î!ÑÂ>Tj¨Hf½É×ËW5DÑ'ìЋm÷Óuͱ•dKÆ#ñ(c£>¤ñ\³«wºSô0·È4q$,:µ&™M·¿•»ÖàýþbX^¡žp"úžü{m~ÿ¯•òŽ‘€•;ëÂ//0‹W¢ˆèlD,%µw*ý1óKÎË%Qç6ÓˆRÒÐ70ø“Ûh„} 0ØUÉ÷P¯(žPàˆKr(TX|èG6¬ xB¸À†"B–ª”ÍIlÆ>6‰ö†÷²-Ñ)ºy5šÅƒ¯N)ùyÚ+iòaxYj,~DxMÛÙéG"ƒD^ût"£ø¥` UÒë+‘B ;….KcÖÏÞ‰š—iè¬"”E[d`Yñ¼ecþRÔV"º„Cc¹L´*…§ªçñ: Ìæ¦Ís‰É[RŸÖUdÞÌ;>kš¦}N]Ï)Ií2 tžÒ¤Þr]×7gò®O. ¶Ïñìê¬,š°œÎ“?" þ°¥ã îÃj_òËÅÓe?Dá3ôt¤èÄ9Îî*UÔ7¬á !щÑ>Böve_Ýüp„;©Z—(³‹Š†¹éqa„Ï,¼ 5¡Ñ&`㯲™e×r1¶|‰¤š&èš0ŠÛåÈ-{¦µÓ]ók˽ö´³ê T¾âƒ*ø‡…Ô›â8ýô¹HÑ%¹d¤™ºylªÃïKÞã⣠4ºÚÆãÄl .Yª nÖ';Ù%—BlŽYÚš‚¶L]3‹0¸²få¸Ý© ò.h~¶3—n,rÈL`zrÒ³ó×2.HN6ç§I0T@¤Õž=jSˆªD Xpª¶¿îö¢}ùþÄœpXb™šX“Ð#饹W’·ì²žàö¸0«YI=h^«ÀNò${ w:µ›SœEÙ…´ *v¨Ênæ„5JK­Jq-H>øÑ‚(~Ö)X„MðB~²Û´ýðÃNÐÓWßZ\b¹ÂÃ?s_I®àÆä³h?7™/o~Ú¨}f?-ç¡ .+JÖs¾Êï]`ˆ ´|ò,œæ]½ôŽäJuúvÐu(ÍI V °iÏyéýLï Ïÿ< ªd(è jD&[etª‰ð'ð1Ñ¡²PŸÙâÖÜÑuÍ8§[|&4à®®Õ6*a8°cùUóV.DEJ\à¨[ÇÇ­¨nÏß]ýEªÆ\Pi½Ð;µŽ)ìÇû[­Çß#¾ {kb|óýr<^°=ýÈ%AMÍ—;¿™¢Æ˜BAüþfz€ƒ/°&#uò«Û§,y²Ö•)Ýû¨ä‚ú¸ AÃÖÕèx&…2ßxË›iÔ=ÑQž;Ô‰k›É‚Ûœ*Yܘ D¦0¬Ï{˜†?«c#Ù"Uû®W`A]àÜœ^®Ai|Í!Ìü^„ûÌx÷æk ¶hD<ç=ÖØÙC^„qRÆß¤£æË6/1‚n$ß–l…QBvL2]æS(¡aœ|iíWê÷V ~eç .¨ô‚jqxê´ÚÆCß|¬ð ³M"¬'/üïƒ÷ؘÈÔçÔl´xñ¿V¯­X5§ë +9ë ÷íðÀìØcwÝÍÞ±úޤ’-,+5Ê{S8Ë"!œ¯Ù®:¯Ý«±ºÜÙ‰ëÀgßùë·›|J¬ÕÝ"“I/õUÑLEQËOÊ u—K Á8·t™‚¢7WœS©Ue¨¥7‘ïe¸·?Úuë*ŠTeëÏâø&²æ1§2~ O :µë¤¼¸?Kи·ïÚB/ÎÆ™£úÉ”¨øˆÌ0ì~á¥ÒZ¿GcšÔ =Ñ•]QUˆ‹îçá†üËÀ5‘ÌH±9C_ÅŸ_˜:÷¿i(?í[~¿‹A<µÒ±:*¼Ãø«“‚1.A8ã@ƒMsd³l–›š›=„]AXR‡£íI¥P/Rt6ƨÙ¶ žw[|ÿ’ÞÞµÕØíñ­œrnG¡²îgÖŒú ýºŸÏlÈÙ3é d¢’ÆápHñv­{ ¥ 2PuÞƒèN¢%^®3ô]ßb¤ ¸ÅXå5“¿)uÖ.1”µ/ÌJÌ^X­®Ï0žÃ%:ØF¤…”"ñâ™0"Y‚Ýy¡ ®’urÙ†u]@zmˆžÜŽh™Æë ífÑn™kšCŠDjÄÏXN€ O[D\eÛWeÓƒŠŒïŠ Ç-zÒ“ï¡Û ž[“Þ ·àŒûG‡"˜Ü¿dš=†\E]N™³Æ,`‰nƒx[ò¥&ˆ––|Ãs6Ö•²gßaH׈~Îu,ûÕëÚþ1ß¡Ô2imÓzªú¤-w©c·`XYüEó~<§Ôþ™¹çÉ.)š’¿ãSÎÅ* çKƒƒ;Ëg&Ámåï`$Å´°e—Ou¼O‰›“{üUž-בÉÊIzKehY £¶ñ¿!¼]K©¶RØÊ14ãi˜4<¼²â¥Tƒ)rƒ­A”-?)—mø•,†Ë^±ún}]ÂÂH¯¿[6焨6ÎYQ¦ YÏH‘Tgß Û \¸±ŽæFÿúlYï–ùî³^ Y֢؊\}41 ¿kfª;V䣸±%(È.XŽaÎÓðŸ[,îçË–wè·{g– wK~;»€6ËPYvìG‘`Á-'Ò­Î43§c.i_äýòøB2ÃÆ›‘²˜þê;#îàÕ„ïÝÆÍ‡­µŠ3E3ƒŸF4ØAŽûXL^¨¦¶uÓ{áö‚„rØÓ$Kô¯^Y88ÊÕxã·,1QßѲ397Í(¾Õ"k¤{—Ooœ˜¸¶ï•,ÐBUòƒ ³å†ô3Ÿy…–öš_—n¥²ÒB³‘‘ü&™©†HÓæNQÁ†SHI Z×ÉÁAgml¶Hлf¬c&ÎGªŸsLmªô…¦\”áÖ‘¤1Á(/9.ì„„5òøÇv¨1}~ˆˆ®×®Úß9Á=Î2µOãp%_å`Xy·®[^´©jêÉÆöþQšZu:&€?¡+ ôµÙÕ‘;òÿìÂèÿr0·¯Ý¦«|Ìßz›=‘xÖk£ýÖ¸Ô©1ÅnÁ‘†·/h \4òµ›8FMdì ÛoÕêùOÞí©Fú`O¸EDÏ4|^µ'Ã,^® ðÉT÷u•1CÒ´cd‹õÑÔSUÿêMmoñ®çuß+šzäÄÏÔOÙ&õÇÆÕLËüÒæFMASÕ& `• YcþT°ìѽfqOŠÚÁÖi,°E%a÷Xs2¤I0WSÂǃº6ëÆ³dë!µÄ/X+¬|žDºKwwR¯yzÛmŸ·¦ÅOSÜN<ßaõõ~#¿9‘«xì}¼Y»qvÄ|à{â©cÊn­ú*ϵ ‹½yUû`Ýə㛽†³‚ Žv±®M¥JyÝs¼Já—šádÅïï³Ô¢E©Ì{òeéJ{É4¥‚TI¢¶X¾Èp;tùŠk÷|#µÁ´Ê[g²Ö­ ŽXun£Cyº~œ‘+BL,M»¤‰ïn©Ÿµ“ÁÓ€C˼ÿ ’¯iÁ\ä®âwvÆ~?Ë]RO-Šœ&ÓC?,ÿðQ°ÂÀóL‹^áËu Íøáñ®„bÂ'ñÏ´9ø¦ôá^ÜÄHOÖo±ÓÏL|}Câ>.Ór…‘ãì õ±4˜`ÖuX‚˜lÁ¸­‰Vë?ÔŒ¦?ìäøD#ŸçÅ jfEäs¨Æ!ûPÌ­GŽ’ 7[å«Öëï#ºPÙŽ²9Ä}Â/87s°;4Qß‘Y·ÂƉ¶Ã£Èb¥?r€ƒÍÅ ËÔúº]LÄÂÝò?›ÆÕ³ÝžûFÉ×1ðc_†Êû‚JÌìÅ ÀƒÙ,##j 8©,.É8 ©§çK–rOÈyfÁxx7ƒ7 ¼%~úÎBqÓ2T¡ !¦¹–ô­  ¯JƒCKy‘çc+ñaÙÂs¿>±çkIØŽ]оs¥$ço7 D°ˆX8$Cw©ß›¸ºJW½ "'–‹©ÚçÀ¤Xð;6 øQcÊÛWâ{Ù4¼±é{jYKý nǬ6Ó.Ö³´%…²õðÄ·Ìujt\܈m¶²‚D›Ã³™é¡´xÇ ç Ï cñ·Ø~¸—¹M‡Ëžä¼ ­ƒ¢~Cãm‚˹_ø•¯ª ¦àG*aH ñN§ÓGåQ•VM3¼JC‚Wû ž‡K7¦­À©ÕÉ»X~Ñò ‰¾(’K0f·ÜLëÐePú.c؃0–_ãvÔÑaÎr­= vÿ†ºèsjõ¬*$­Šj÷üùÄ^aftUvÓÉ…-Òq?¥1³ÝÈKÁÄ9­Ž­“_+ÓF£¼Õ ä—‰Èx>J•{7¨fÎäè‡Û[o›vK½{úyÉk.Û甲‚J[X·ý»²)OoúÁÆû‰õÄgñÍÆ þHÕo÷ÂÃ7!F„­–?²uJˆoÑ °â°àWŠâµ‰”|Óé7&ï¾®i2‘.ë YxŽ’ ùä›É¬P+šç ÀÚ¦:Ê –-®nTñ+HÁʘYȬ´Q+:xö}ºê›ØS|¿ækœö°tßs6®Ã[•«wÝR¢nLŠ6ÊJ¹PÌïºÍÉòÄéHìØ†Ÿü2mL•IJ—"øƒM¿Eú|ÆëЊBŸßµ¦rüODšt ÂâÒö*§çº~4S*|FRš1%˜$³©+ò–26ÍÁ!ˆAFß±¶ªÊ_+©°ähâéêÖüsp׃P4Ôj±eMDÏs(:ºq“’`þÄÊ:¹Ë¢1z±¤ÉÚvz褣› Í·ÈÂÈêÍ-.^ª j+KuÇ–¡+Þýíx­þ@”ëñnÀhú%sùuÄ|½>æk$u*M‘Z¥ vÐh;(øëKD+kÖ=VçãÁ©{¸H©]ÓXÿ&ÍÚ{çöI&lµñ¥!¯´5wo&ÑŽ5™ð¸ócª©eaÈÇò–;ψ(Ón ðÖÞ®NGúݲM]úx½§èׯ CxÌæ?4ZÄ2Ÿ5 &ݬYh|œô¾V7Ÿ©S ÒÕ0=U[vYIâÈXwvé&}ª`$Ïîç66R¬¨ñæA·ú@Œn̪¦TPÃг/4±Å7à '% Hâ§wÆ•IU=™'¤BKY¥%ã @NW›AZ‚…˜Ž‹½÷´ò:iÛ% ¥» ûhtJù8Øù™êÂJ—XŽÌË/FcæÝBðbnìÂî]o]^ ÊŠº~S!YÈ/^ïN; "ôÒéJ®Z”—æVp±öU¨Ó굟„Dª–m­ïoë›ÚÆwù²]YÙµhx±‹OcÃÒ¿œ²ífš_G¹á¦Æ¤¡ 㳩[9ghX˜:’4¼ ÿúNÚB‹ö¾Ç¸¹hL†>ày帤—ªðGÅf}Ý çØL9îµ0”q*ýÚ`ª80¯læä4× ï'ž=hHÄ5q±ýdÃ|[V·‡T0´óâ½E¶K–\”K¤RpÀÅ•] ÏÎÐêÔ!³®ýc±îûM¿ Ú£"wÚWâ0t“rFÍà¢I ¸qøÜ;_½®%µ.8ãy˜oÖ -re"–”Hõ¥#Ø‚N)ÿëNaÙX´z^&¦Î\Wº‘D­Ô‘øÌ#lu\$‹Ø‡%º@po ){2pªÍØO¤¼Ò­—bh‘]>²’ä[ÍÒ™|CäËìék{Ø8n úUÁK&–ÃýÖp%Ù%7¶ö%/ŸK§Žç?zvÔ’§(®TÌqÞP5Ä“6„Òa‰¿l78GÅ>o¶6W骢¦´|7¯µ‰ÆìÍÜI‹.”.ÁmƒÑ.±]["ñ³¡Æü\½–eè]ÐuMž%vJÍáÜà°„0Æ4ùä×¥+NSRÆRÙlt|[½…KÚ]Ã…ÊR—0Š@b~¦ó‘¯™\!1·Dî ¥ ÙŒ êSo¯%Ô˜Qï2¾§NÊé9ìÂx†~öùùF\^@þäjH†$9ÕûeðY- €¹Ñ4¡–qó¥Ekt )áÛ”‚›f“NeR7&$7±§DQ ÕjcP°-döÒ¸•Ýc_`¬F-öHooý^væ] VxžšÜ0k1èMϬˆi¬Ðñ§Ùh±w£Ò(—ç©·G׺ï¨<åÈr‚…Ô[m²+f¸-ŸúZšBS½±›Ãá÷éYœÖ»³™CSׄê6_*^`¿¿æp}ÔO‡˜Ûû!é‹lç‡_/ß'Ù@Å\±«#hÝ,gj©?óHu½ª$íYïâýš PhнºvY[+ÚˆÍMâøÆiGÿ’×ø‹‰^M%|1i§˜‰ÜÒ‘óQ­Htù»L&ּв]±JCŽ"#+z¿Ì Çû~¸Eï– Lئl½ËV7¸_%z£„É‘…G«> 뚣Lâšx+‰Ò¦…Sí&`R6©ê?hÃjê²{o¨k•Ôê—hÞ6æ Uð­“?¸!ÜéN®(õ„~¥5xÉÒþ¨$%äs~¢´JbÖ9x=ØìÀbumušÕ¡.¡Èžþ*w¤üÀn43õÊkY=ÀÍû‰¦”Í£u¡gÏŒKwv©m¼~Þ‹®iẉûÒÔÉÔ&æ²Xw¶¯Ìhu,‹Wbt²MßÐè–*ºÒ[ȃÃT-d'5€ÄÖýÛ˜/ÙV¶³Yñt_±º?j$ !k\àAdçÚчñ¹±°¿Õj4)šãnÆï(°©ŸÏòåF5Ò“nñ;Gì(NK#tˆy¦Šm$«ÜAßÿ\€aÁ\PŸ+Äb¸’OP¬Bœ7çuÍ$SÂ)¶´íï?gØprÝíw”·/ˆŽïdÃ7 §ìfLsˆ.ÊBHyæ]g¼ŠWç°ê®»yý„]g”W‹ƒTxù††×bÝâ +õ©K|¯f(BâùTAB™“ôBÎ ´ýÑa¦QÀ/\•ÑM–3†:2’žyWTè•XYÖBqf£bËË×(tþö}/B. =·'Ä·ÊÁ8sjˆs!$ó\c^ðˆÂâ’C¹Ñ–O?ŽY¿}¬º–GÑøÓ57‰ä÷ÔAÙÒž 9ÍLšÝÂ!®ðS$…ö¯ ÊÔiL²?ÿ ëÎíÓïœqf޲ü@÷‰–‘Ê!œ·vªJy•ÉdGì—';Ì~ó*²PØQéžö½ëí cv%8ù[Ž=|¥oQ±A1]x :Üñ4Þ¸çzd)–1oE&º˜û e"T[K4UÅl«âí–rW¼{¿ g¥¿ûèGâòe9/|!Å)šøËTÙ¯aCä&69ÂÂ’´Á½Ü™Y)KÅ£ûǦ,TÛ,6,ûgñõ.½%Gà“õëU@jT¹¶S€DM¡äIu,ç Æ…wò›ñW³BO¤ø ‹;ù®ˆÓ^Ýñ9—»_P03¬1EžVصë½6î«SŽ7ü0ù¼¢X³éýý+éFDÒ–lËm9üTÅKžÎ–µdHUgž×†Ð.wRÚ-±?5Ó ¿·ïtȇOÉVcâ\ð*¨î³ÑvÆípÆ¥¬žp¢{cdÛöµ™‹¡ÂêLŽÐK/YûÑiÑZVe Ú[?57œ=jÏn­o¯Ñ_ 'F±þ¨ó²Õàf»»—›ŒÜu“Cî•*ÛŽ#rhˆ™HsD‘}ûªõt)IÉcÞ=+$ª7Ÿ€ó‹nk1¯'»th=C¼Ik,°Wà )¶'BCûwJ.Ô«"n+=a¥OÊÁ:¹ßμ÷ ÑáU²°sôõ–™‰cæ[Ìéiz‡ãG‰±¶Á‘ ʧ»oÞ8Ÿ°Îj, ÅÚrÒ í¼¿xóäË·±‡jé÷ÙryÖÒ²ŒÓÃÄíõÂéÁ?ÊB}p+ “ìêŠÖ¨Ws¾C0äš'—ñä&íè–€IììÛÄÈZë4Ÿ•c¢Ï±/ÍVMN´êhÌTn¡Ê‚Qk÷O„{Q\B—&`Ò©6öØÚeŠ`:÷ã·¡]BÅ!©“97+ìa¯šüLIQí“I-ª’j²îDÔî d×J ’r7KcñtÞÐwÇrÓ’=ý68.šS¬!½+îÄ3×'ŒY[½‰J]%'—ú9µ·¹d؆¥¦šŸ4=´m†Z;mD¹sëŽh {™f}ÀÂ-´$qíõÉ^Ù¿ú"Vâöì'kçÈ虓˜ÂªSzÔ}ðxmYRiúñ™Rç:lqŽòü²±½”›fDÁïÚzg¥]ÿ±ö°í"‚K O×(D*¥©†(­‹³#c纨ØÖCa=¸±¢ãÁÄ^æ®âIA7­D66ßwPäÓ/ \}•–o¶kxÌk7¸ž5«Þ=ŸÎ)Xnšˆ?«wä“êÿð…ÅlxSÒ¬­£ðÀõ.4ðëÍÊë t‡g¤4–;TSU.CÀL*ù¯Íª°}±|äª3N”zóÐ „¹ âfÀºjdGÒrâPm5%-^é¸H ¬Wªõ8û5Pþç4ïVeBâ`5îþÂQ–‰;˜öW£r­çŠNvKg©•ëM°‰lá7“ hp¾foÍÊO—¾wo#Ö¤›žú7‘}e„º“‰b·½ó AC0š½f/A¤ ¤ÖÙÔïn“# 3£ºG/ž`¤Gú®Êý|…mý²[²:¡lÿé]ÿ-_Ì6ùµêã9AaÙÞ’1ÛLÍ_ÖŸûçÌ`9ƃ Í–ˆÁý­_hø›íÎÁ>ú}Ÿ¶Ý÷ޤ3ûþˆÂŒã‚Ë(ßã`aòXï.rôܬ ‰ø‡GL²¿ãnTÏ邯°0mãæÃ—€Lõq¤â¢SqýªÄ³.WF’[Jö`ÑõJ:± ~ù™aù[ŸÈ9Ü-‹ØJOÛ6Oü/ÍÄ-ÎMàVWË\_•ÜmÌW ,³‡L4Ìod6© Çdh˜§ðuFÉg[Y‰iëœZP䄚]Šï`öDJ/ôršobÈ—x_%9¥ìøYLEÛ.ê%©ôÝìÓÒãtÜž=ݽîDyÿÖÓl_€µø„Ç 2ʡǎ®‹Ì)JxŒÿm ëSûs´4Ï;z\]·T#«ÁR–wÔ·Rë8³rýé~M-Z'©ÊaÍq7gä¢H{»¥ŒÙMffzû¤‰iO .‡SÜ%¶†Í”¿ðnÜë_føîÑ›†5²Ãî0{ds­Q¨)ê.÷®,#Q˜ûÑáÕt·‹$ß?²EŠeªŒ]p&Z¨ñ[ ‚ÁŽ„™µÓM[º®iÚP%ù eB+>Ië¼óìBt3ªÍ/ùÅ‘·?›ÐAÍ·)3¿óXƒÈ]ÅrOÛr€àñ—¹ ŽJèT]ÀÆönk©}^_ôÌ„-׋·ÍÜvÝTÍü„Ù7âuŠÞ ,¿ßû @¡x«ãáÀÕ£å1ou·–.oE ˜É:}Onˆ‹|+û{Þ|«Pêôé p b•!xÂŒ¹êþ&ë¾Xykß(ÜR¾åÚ2%„Ú,<ƒñ.˜¨ ê†AírìâuSÅ…‘…ý‹üQ+ID:»¸Èž¦*¾½Ö‹eÑÛ]‘UÉÞ½ _ué5ÛʨÅã}-¢³æÐßûQzKÛrjS%ãÆÍˆ×>Å‹}3`‡1{wI³÷&ÊAŒs¨Tn¯—_ <-G./7æÞJ¥Ó-â;NiT½ÂQDy-zHÊ3ý±‚ÌäUu÷-dÊ#I2e«àò4‹ä=N¤MÄ>eÄË ·ÎÏ×fû†Ò #¿vYǃ”ÏÍÏl §Sö+¤¹?g±MñÛÒ̯ñÚ;(‹ïÅ‘¯Ü’:è…5’¨{;õ®Áj…Íà)ܳœ¸ƒÓ<;Û¥?l?œË¢áÕj×’+TS:3Rzê¹î×wŒsKMuºUõSÇ 9†Œ¾¼Ò½è%*iðÛÀaO¬ÂÙ#&í” 5_!ü¨Ë4Cre±9ýͨ­Œf”ÑºŠ½‰Ç#" ̳¨Úrˆ· ãvÕ¸üa<&T¤N)è³>Ø×dÁƒ2ʧC¢q¹ŸzÎnì"´â3»'Û+›Ÿ<(drä 1b›PEPÀ4Œò$­¢õ'§‹ƒg¡™<˜/â\¡Vè}§ÊÒ–P,c1q`iòS)Ö!—¹M° >HNÙpçÌÒ2fÔÈœ¡Î­§¢[•¡ðñÀJ£KÒyŸB[ãeiþR|®ÝÛ…éÔ¢×b£hM|¾GY™×OPû®RÙ£âÏË š~‡õŒ½,½U.O§‚rØËÇ#Â~°—`a6’ú©,“ä½uÓ}5ÒÕ}ä£nÆZ)8tIé <ƤñPOŒò¼7N©Oq.™Ÿ‡.NõØwL-,!üþˆ‚ýŒ·Ÿ!î•mÐuD€bÎÌON)¿/å°zbí + ¥y§8AV0&BwÕ[ÍÔl8üÈ[„nu*Ó#tSqB¬—óªÎhŽŽ†Á+é ÖX·|óxÛœ´[—ôêöü“%¡W†“ÓoLWs:a¯Ã“‡\*ÿjìª endstream endobj 86 0 obj << /Length1 2111 /Length2 17378 /Length3 0 /Length 18643 /Filter /FlateDecode >> stream xÚŒõtÝ[÷ ÇÙX;¶mÛ¶³£ÆfcÛ6š¤q“ƶmÛN77ç¼8}ÿß7ƽ#cìüž©5Ÿ‰µÈˆUè„LíŒâv¶ÎtLôŒÜ9e&F## =##3,™ª¥³5ðßbX2u £“¥-÷"Ž@#癨‘ó‡œ-@ÚÅÀÄ`bçfâàfd032rýÇÐΑ jäji £HÛÙ`ÉDìì=-Í-œ?ŽùÏ'€Ò„ ÀÄÅÅAû·;@Èèhibd 3r¶Ú|œhbd P±3±:{üOJ^ gg{n777z#'z;Gs~*Z€›¥³@èttšþ" 7²þ‹=,@ÕÂÒé_r;3g7#G àC`mi´uúðp±5:>¨HÉì¶ÿ2–ý—-àßµ0Ñ3ý7Ü¿½ÿ diû·³‘‰‰½‘­‡¥­9ÀÌÒP—¥wvw¦Ùšþehdíd÷áoäjdimdüaðwæFq!%€ÑÁÓs2q´´wv¢w²´þ‹"Ã_a>ª,fk*bgc´uv‚ý+?QKG ÉGÙ=þÕÙ/¶vn¶^ÿf–¶¦f‘0u±gP³µtpJ‰þÛäCûÌè `cddäàb@w †¿Â«zØÿV2ý%þ`àãeog0û ô±4~üƒõr2rœ]€>^*þÁ21L-MœÆ@sK[Ø¢ˆfÿÂÍw´tè0~Ì€ñ¯¿ÿ~é}Œ—©­µÇ?æ÷—AAMEERŒæ_Œÿ«¶sxѱ2è˜ÙL ÇLJÏÿ†ùoþCþo©¢‘å¿“û#¢”­™€ë_>Š÷®ÿ ʯ àO·û˜e €òŸÑ×edc4ùøaúÿ¼»üÿ›û¿¢ü¿þÿMHÜÅÚúo5åßúÿµ‘¥µÇ¿ >FÙÅùc-äì>–ÃöÿšjÿµÊr@SK›ÿ«•r6úX![sëÿ–ÑÒIÜÒhªhélbñ¯úO>Â[[Úíœ,ÿºlt û?º…3ùòq¡8}ôêoðcŸþ÷H1[;Ó¿™`äèhäûÑúÄðbúØPS ûߣ ` ·µsþp|Ðó˜Ù9ÂþÕQv6ƒÐ_¢!.ƒØ#€AüÄ `ü±¤þAìÙÐG…ÿ"Î?åЇŸÊ?ˆÀ úâ0hüq} £'€Áøôq‚ÉÛ‡ÎÄÎú£„ÿ‘°²þ%±±ùÇÿ¯Ú2˜þ™ À?àG’fÿÀ¥Ùð/¥å?DZü]ÿñfûKoçâøG¸ó?àG:Àš[þ?ŠgõüàýåøAÎúøÁÜæD?XÙþ?·û§ ¶ÏÑêDíÿQøÚ< ¶Ö@3ç¤Lÿ–þkqÿ+þHÒþc]íþ¨áǃÈàðü`ùG ˜>X:ý?üîã"`p¶pþQÄlœÝìþpø¨ƒËð£®ÀnntèÃÛýøÞãoø?ËbââøAÌùïëìc“þƒÿ~²€@w  ìò‚ OU]PÛc®Ýþß,Ù¾Fײc»Ë3â§dªê¬€MÇ_BÉÃ=Èk»b”÷‚+„o^§ÍõŸB[•Z_¼_ â•§÷[a—¦0&‹N…~ôãÃàÑ© x¿9x«ûoí”&ËspáDT,@{të“pÿÑ_¾:²°¯tPÍ.÷Z>C­¥ëÿmŽ,ß8{‹Ê™šõÊiîþ×,jîä;¡t< ¬ÏY4K±—ösÌÓ¼çz…*³S6)¶6>ø=êØ4¹—ðQŠ4æ¢WiñÚÀ’{3o1a.mê2ýsfµ¥r¤mco­ëØrÓ^^2 ˆwm/±¶¬ñ³#±zu«A$šs-Ë þQ‡™ðzÛ/õn3«T¼®™ï€9-‹S¿¦n¯—z‡õᑺ‡Ô–ÇáÆ‘ÝnoýxænLÔb:k«Ü™ø©åÎã`]@©ÏÈ´+®Éœ¯FÁ¼^×ÂÏ8L;EŒŒÚœ½ cxlyÞ×1>• Wò[s(‹Ön¨zïìòïÆ©WWEØ,b†Y!”ù™bÝáù±J®_¦G;¿¾ÖG?¶Sºªt ŽÙVåÊïPöËírRH—Š+yØï…1&9Wv%²iŒEÒPå{Þï*yu£-—%£(^–ë—9æ õ^Ö[-îÅ®ñÄ¿oôc®kWx¤ÏB^!Ë:X'1hnT¿þ#Œ«¢úX@â¹Ò»83¾K4:½Kêe]©ûµ¯ ÀÕnON´¸ë—q»ÉGñÛ,¢iCÍM¨~¯6sn¸y64!Lò©…ñ3ÿÄ™$ ¨Œ"kC¶˜æóûBbŽÕŽg¶à3al_•“nÝÆç{Þàï|º]Z ¤›¢aj'0S¯ìɹ3îùJ¶ƒßq3"°÷,«É’rˆ§ae™A0kur2Pîv‹}©ˆ¢Ì‚5 MŽP"¡Avyç)>ÕŦ\+£)²ˆåÑq×¢P lýžB”Fª¦‡\î«‘ž‘v.!ïõ c¯…%ñWŸêê:_œÇM¼d(A_4w#gKŠu»V #õ®~÷·Sâ8œH…ƒ›6üú“7›€‰±Ì:ý·õØæ²¾ñi)kcØâj#/h³òغ¡¡¦&S`ÛPà–#åÎ`,R'¹ã–Ó]‘—•iÿ–ÏyòQd ‡=½¹ÉÇQÆ…é˜å%CMÒ2£^Ò¹²nzÖç—ÁÂï¯&dº›—~º--¬ ¬®D:™R-5—?ª_ÑL"q7ñ¿ßÈI?Éåj1VŒÅºz±ob%-è>öÀs†3ˆY°ùÀ“²Ug´dè×d°N†©ºi1%Fd¼ŒÂD´…%rÚa ð=V)#d(Bz™gÕS«Ø¥II­_ŽŸ+šè1·tº°Nç€ãу8ÐØ2c‹äÌdæIÆÕž¡ÒcØé´.v_å*˜û°<7\ÒóBçØ©3Z©Kú{¾O¿suN”n ôÊ$a˜PaN>lë^™ç:W’ ”íÆLöݽØB©žºµ'´‘æ™ÊëŠ4eM¬(üZ˜,Ö`v'<ât ’5©Úŵ;ýºÇ¤Î5$Ì'X{÷|NĘЭ•oçùDzþ4õ0èGÖWÙ9=Œî¶½±Í¬gWÞ» ¨2x²Er9ʶ¹‡Âän`B„^J1….ò`èZÙà‹#”aÉÚ²©Ü¸‘—ÑÎÖTçHx>–r`ñ Q$ìQ޽µI½ZÈ?×/xí) Ó˜Àe]MæmÐ!-JºÈ‡ˆåÎNlú5æC*±Š*mÖŒÉ—Ó ©Ÿ 3N?õå'n&2˜Ý÷f[·“)Š1çs¨ Q©Ë2ð–c\°¡•‹än>d[óTyvÁQ’´,iBÚŠC%CG‚¤qz)/Ù% t÷©bRîh\ ýö•ñ¶“ƒ3@[˜MÕ@Ùüߎà±'wôÎî÷=¯V¿ýÁÈ9‡ZPé4Ÿ!Düš0é'‹Iú® ’œÜâ”D¿öÛº¸MÅ{‹çd”¸/ ªuùÓwâiþ* Ä’ºp¬†0žÏ¡:UÄšÊЪ%6mþ¥ÿÆ·KeTŒ&ŒâöVñèAðòvÅlú£vYˆi?÷Gˆ, Mõ0ÌÁÛ;¥¼jUÅ÷{×À¼'Xàm‚ýïœ@G_‹Äç¦DŒë¸ (Ck/è ÒÃBœ &; Žä¦¢‘ë´'¶Ú8ºAMîøçíïLÔå{ƒÑ¨Õ±r4ƒÆö~!<^ëåc0þ•J,Gêê—ÖƒþF'ϽygÝ™IÈ¥²<Þ^h’^‡µPe‰ÙØ-‰Æà\Vt!ÄÁ²À«[‡ë'N'"øº÷‡†Ã^·ÈÍUkGVM¬j|í(/×`­9E¢áaûêØ’@Þºmú‚ÉpÓ…þÖ…æbw™øù–ŸçŠÖ×s¸~š Ö®µz3Ï|ˆ1Í)eaUƒIÜ}òbî(u`þÛ&>ºÁ]Ýã¾ae:›XÄó+Vê7{×›n„lüøô_Ký¥ôŽÂ\á¤è¶MZ"•"LÏ}Î如$¥œ S_äCç"ej@ófy »Næ­ýÅŸ)¡à–¢äo#J@y¶¶‹MWô¼œƒ&T"¿nR·Eð”ä'ïö£¡•ƒ;u•pñ6HÄ"ˆˆ«Xlµ÷‘¡+%NˆÛ)¶÷íL£ú’–ǵO³°´=(r-riG;q…‚RîV œ9®h,i…*>ßÁNˆƒª‰œÝþŽºš• ìšG’Œ¢¨kàÕVœ@’ZÞr&+Ü{OÉêÒ)¥âè#ïxͳ˜°Í†¯Å>Ö¢˜[5êù©Ú{M¡éè;·™Î`k`› .-›M™"[w˜7:•[Ù ï%#Þ°¹z¥ÿ%Óx£Çöä+ƹ¡lu¡ôªQ‘Z>hs¿×kªëÎ¥ìæZËAkâS©/š£Ðû…SòçžÛ[íMpêôV¾²‡§û+»ÌÏÆ‚^ñ pÐD""„‘^˜&Ðô¾Ú?Ï. 1má¶ŒíƒÍÓLIé¦uUOÌe’ËòÚwB 6!Y£Á{7ͬç¶êù¥Q)Û§,¬¯,ldÝyêþà oQ+›»ŽMî[5ÄæÁÅêçˈOh1­•H ¸¾¥/ VEÁ[ýËùD>†I§¢äx~Cå{ JšÍ¤P’›ß‘Æœ¥Š*Û`|‡æé—µð®—lÑ¿;¦ ÜÙ®ù÷@#t(¼î: ÉCÒÉ"ئD¦ @l`诚Nhøšƒ1ËmHP3u^*#ºqÅìûÙ½FXßËŸtdÝ©d‚ó½Àw–ª+ägöSCñ C4Ï'l xýæ{î=géZ+Á“ÏîߊQ2JŒðL´ ¯*9€Å” &}Q¥h¾ÊAæÉásÀµ]Úsñw¶–aJÔì°ã¤Â:Ä/ö9Ìû ìENy2‰¨Ðtá*2õ~%ƒ©0ñ|—N‘[ J¶¦¼žm …&h+í3ØØË³Ép€j¼#¼©zW—6Œ"$S*·´›g«Y]¢Õ|:ûû{ïJ¡>«¦‰FS´’ÏN@žˆæ@¥ ç´öKgs±eÈŽLŠÅª›Î^2ù„—ǤôpýT ˜$·³-(ˆc:J!²åZtû_U{±äµ$Êæ§x¸ ¢ñô ʦ1µ@0"ƒÙüÖ7§)q`³âùá²{‡E%­B wÐÑÜ×R`è{øW¦ª«ó'¿¤V­X÷ñ§T“ð®dÔÜã¨Ì¦÷Ä=3  v¥L@U$ÉSxß!Û. €®¶ œhþÙâxº»êµå,ý·F•BDm»Ü׳4ŸsLˆ ݯ SŒ'å~/„o3˜ù°l¦džŽ– îK”¥ TR˜É9Mš#ÔÔP{óyýÕÐØ¤Õ×­ç7·Hf5>H$Ùq© ù=<Chðô3’ç(´nâÆ7~GºÉ5±Î_o–tùS9Ò*…ˆ…€?[:o Ö~ëùhM÷µ`b%V6L†QE½Ýçt!_“ˆck; Ðz9Ê›X(GÆo$«†‹S¶Z^V«†,ÞÖ`®øU†-RÖyo¾[µDûõ¯ù÷³Š=#g^IPbÕi—|öFGúpþK§ _À ³/2wíŸá+9]<ÖHoRÖo“]`Í|Lziغ=¾½­ëÍg?ã>v!ªÑV‚v8çQXrKÞäu(÷­RVüñÅÕ;~;LAaðW¸mõÑIp‡m_÷yægJjë’Ū».u Lyîêcm G{ùÉ«î4ýdáêÒ<Ýh³ù,ðˆA7Ëô€o¹»()¸ço6øö¥I™þ4óþÍ•ÂoІ•b\e·G´ulÙÚã•‹#£^ë~AäGe¿ÍqƒþÏj 6‰ÌO ËL%/HÎ Qsp¿·¢Çv®`·XÃk™*mà ^Dù}ì¡hÌÊ͹,HñŸKûAõ/åž —ôgš%d~ñ°}‡*rƽÿŽbJðI¹|(äŒJWGû™j§Å¨¼h¸Åbg’Kgî›Ë;´Ê!—LvJŸªL™‘&éž›ùpâO…@0÷H\‡ÁÀB)Ê”÷6+d6ÙoåR]& >Þ]¤ñž¢;hj“=qn­ZÑ4íoÚÜ—‡}“EýYL7 Ö¾ËÀ.ÜAPC—GA0oˆŠ3Bô…µ°£úŒývÜ †éC£«|Ô’!„ê‰dÙŽ1±œÂ7œnÈ3#\ø|ÏËY£ LT«‘šÃaÁ—ˆ}Ÿ~_w¤ƒKŸŸÒ÷mCbÒm©½«­´Ë³,t$ Oóý ¬³¹u•ï>E>Ÿ”ݵNGU %œd«J6õuâÛÅ¡@&È$ů³‡Þ'_qLSu ÙZšC 'ô ‰ßE[ú Meõ½ÿ@-¢ú‘*žž´ *<ƒDËœáY€¨™¹GrK‚üVT¼†{rmaüï‹Ãï_·[çê¢ÒóÞ©--šH>ÓßD#†0T‡„†Žà̰ÞÀÒ ’}x #ˆgÛd~Í’LÄ«æ5"Š?<ëâ¼=èÏ%‚ãã€Ãñ¤ÃtyŸ(Duû$]æØß•úߦÒ(²•X†ŒyÜIšbYn UƸ˭ŒQÎWÉšœ¥ã?1ðä+¼_dá;ªoø÷`»ëÕ4CµñSí\æv7èùYg?³Ùu ëæO‰ó ÓÊ“—R Y–EèÖÊ+uKÝHÎßMv ¨rŸ .‰_bÊ¿Ã}RÑì^g¬å­ jµØÒX€òog5km´ˆ]¥_ú¡ F¥¯9MGlëæóF ¦-ß$†>%zWý§­ lðì™ûuÅÒ6£ ûsÉùü÷o­m6ÃXLñ¯™îÝÑàj9Þ‘š ƒ¡A‚Hj ÈìRpº„éA‡k¿ø_¹‡Õ ^À†ùçK¸¨¥}0ft‰½–С/YÔV<®‡]öijÌÀÇ–‹‚ï7KG¨ÄâÂ8‘^ÕŠ³žÝ¨ª®ÌÑ"FÑ渷L­HŠ›«×ÐÃ,>9 Âgµ9Ù!Ð5 &ÀÊ€KpÄîWz+M…‚”?ï´o<¼ƒ| ûdçëUÐ"йýÌÊçmÚ¾õ±\Æ.\©À1÷ñaÇ/èü0m\J|•ÎÒ]ûAP‰wƒar¶‚å÷ú„ä 5êÜaÅ4=)tèø;½ªkºê7ö˜´k­ ¡7(ÌM}ðd²úF\\lÚk¦RP½ÎÚ¯Z·&7DÀʪ€ Í/²­Z˜sùÖ5a6®ÇÀî Ñå9Ľ }Y?ÌTÛÖ÷ôË4ú¡¡V)ë¨IQnPGTèQ‰»ÁúŸå‰+{µ<‹y‹CÈ1Sy„L¥Dp Âü}`鬠잺£Ö7HcoY2¬8Ôãþ2tØ‹ëÅ*ûŠ‘ãUBå}}kϘ?¦fÆÄ.™—¦$9º1« εö4†éêćQÅäâõ2†„ÃwrIQAô®™Éx•šv¾€[èoìÕø’¬ z™–Ø»MáƒX>[žÚAs9&Ž«yÙzŽú°«èÝò)ìžcø‡7¨Ú”T핊å•u¾E<(ؽi(°—Ó›lWâ.¦ éãTaÊÀU­‰4ò9¯-·2@¨Ð4it#è4¡åNá¿LH “Ï2Â~•x‚ã‰)'J‡OoCïºÛ3µ{|²è]òi”dQ²ÝÙ‡óÛ£C´ÐÁ!G€ùÙŸ b™ëýû÷-ð¸Þ‰MG¤¯Â‰§™ÆŸ)tè^«R •‡¡dROΤqÈÆ"ÉÌÿ’G ÜqO[¢r»=ïp¢B¡ëø)ÜäUÝêº 0Rå¬Ç7ƒ¨N±ÚÇ4Fp§ï(4÷|›4­ éXÄý,žú¤ˆ»œÒ´ŽúŒ¿kâ?RšmòFá¯3PÎV^ &yÄ#ü3½ŸÄÃ决Ú%ñ—ÁMõyƒ屃¹´(H-grZÄÌôÝC=´`Þ;±b"„P®êÎÞ3&Ñ}Fa()-yÁq6Àž¸çÿ‚ÝêÕúë³Wš 6k}~[bµ;5ßò×ì,Îzµ¤J‹ ±“u´¦ªMFëI Š‘¾|é–ÆÐpNMÓºQÆM[ã»n¶YLõžÓn¥RøZ6¢Á‚7ѸŒ‡ ¬O¤›78»ÝX#­ òÀ{ \M½ûva컜£Áð²6_Eø'½[Œ’n&ü}AÍôáoû°/zÛ—(ò¢V4OßßнlúYòrÎ2M.¿’:­©xÉÂd‡¥Ñ sG }üVþê¢y!)ÕR|õˆÄí^QwwÉ6 „Ä8y¡@»™âwz%~A?¿žã+Zóí­ï– ÑÁ}ðå`ŠÎ׃¸;§X¹l’¨ú,DçBÞo°ªg«ðˆ§"EØC Nt^€&!ëŨÿ¸GI5WÞ€|»Ô„S¯‡ÎÝøÈ4¢…±¡×‡p·qiÂ&È¿ç8­è@òf6>²öC¼ºsœÝB{ȶf¡ÚqÚO&I´'h.m±i½, ¤ï$ãQU˜W?Èý.«œ2ÇÕˆ§ß ÝX)*­ÉÌÚè/Ķʹ¶[y/¾²dâ—«³ÛÔˆ;’{1ðu…Ø'¾@·@L¥¬ñ£s<\XÕ—¬EX[»CWïíÜß‚?ÐìQs^ãb÷ºÒð‡5oE4Z‹ÓÒÛ Œm’ˆÄM*¼®ÖS©”U—æôlpô¯|äeñ+¾´pó½+ÝäDöœ…v,ÇAc®¨” J™#ÑþòFÈMè…Æ†/ú‚Ž6ZG=tC}ƒéìöÍ[Wf…’êܽA¢h‰uvBƒ€N Ú VŸŠ€ÓßP¯‹øe¤Ù© à~z»Q¿Ë7žâƒñ5«BôþÒyMIa:¡Í¿®´XÍú­yöÕbhO´ÒÌ7sQcÌÇ>8á¼´ àô{2ù v_#ç`;‚¦VqFçomÃl1ÉþFy†¡ç ¼[_8–HA=Þè kB&,!—£UzïõFPÛ}*&#ás7’öÛàÓ-îiszºÑmº2E{î¸^å4>»°¬€KëLRþÀbÂë—RÏ帪áÙkÏãÑ*Ï¡ýú+q=h‹ÄŒAïQÑhMv£‚@åqâC—$ÕMäsjP¡¬1¨Uõ!ý,·Gò"°Ãt.J›¬¬œ6䇋Xcì©0ºeëç& ŸH‡¬ì 6™@nU×|ï@„ÓÁúr•X‹`(¹á~8ëè×®Œûaxb’þ=”Ô“Jo ØÀ@ñÆao#ä”9ãy¶ë½I¸Oëi#RŽ å&ÍÂyß´VFyä eS>}ò&õ5å莰;`ZL–"ÀïÇ›î |+^fUg…¹”Zìκ#å7õwªhÕ7˜ºÊ M%Û®‡È[#ÞÊ[[1î%î“íð[ØZó×( oý1Ô³L \z{ìã)`xš¯^ãêjTµìV¥¥iaáñÚâúpÿœA6‘# ð=ј>ÙžŽ\ڊߊG‹½,na½IÿIS4ð`‡÷{®À NîAMÌ}å p?[Ji3–äž©¿·¯“+ÐW£¤'®ñŠA*’ÊÐÝX­hÍg wŒÌ­¾’óÄl²¶¨ªI½4—ë¸/ #±.Jyóä{ÐÛnÑ JkšI³wtºÊÊ@iõHG[C:Ôt¾ðÜ@ý^*Ä^‹Ì_.2ÓÉÅØ6³š¡Ð_k­¼Å¸kÓŠÜÁpf£"‹à]fÜ«æpø?Õá”UP}%‘DtÆ=œ²ËÀ>8õœ.ùŽ$Ê £Ñ„Ä5mªU ©øÄ\HúU$$Ïs?7ƒÝan‘=«m8Ðqwzô'á¢î…oò7×ÂêSƒàÌ ’•2oâß3+t•4Cž­‹¨D»âssä³wÛ;KäW9¶–g0´ÌCm–<|>îŽHÚcÈ~¬Ö_®?íÑÆ •è ìÂ1cŠW/…)ÃX Ïì‡ô·‡²¼õ"B'³#hÞCy·~aôí*˜Óo@tÚ×÷¬nëL¡®InSÀmÙVQÖ\ ^0ßóHû# GÜ gH»+Ü ,™ã-î›iH7¡ÃÑ„!ZÃÀÐÑw¯¹_¢¨ðœnÁ´ 9/iÒÜ7I+{3œO9DYŠØƒpq ™ª·÷wMûŒ¦K¹^™$–Cï5 :+‘,®$u«ãŒ}†ûãA³Â~ž4%·qºt$úi·‚ã Dáê¤gêž±Q½­‚ó-/"•Eèù)6ŽT÷ ù*äí<+œd[âžïhí4"fÓYJ‡Ñ¥ˆ¯òÌ'Ì ãIÌÄÕ/ð÷jÐU!¡!ÆgCµ’íãMUU[§Ê#„»“ Ì¥LáT”ÚP§'F­‰ð—¨ eô‡Ñyi)£* ½¡‡èvµ(¾uxÔº>Hô.U]SKÒ)tŠSHP½’p˜„`yq”µRÊá4›·sk¼£3#ƒJ§ñË·u-C/çÏ6S{²6>ÌP’…Gä[ç…˜Òêh“Ó^‹(0²ð‘YžŸúeL{&ª­9S|M¶9ºPôõ(,[¦ª†'Ä#µg-ÿ&8Òc€k²sDº.ÍR}ŠáÁ¼Àƒǯk©;çñ/Ö±½˜ÈI}@;Áˆ‰ ?‡Å¸ÁrRšYƒ ¸²Úz qV®?ŠLï4 æKX N€øúÙnÏqÁKÓµOÓ=Æš’׈dÑ2rF· )﫱—÷@Æ<ò½óT‹nàÉÖã²SkÔØüm{r’¿’©—õ²IL— \‹6»@«/¯;ÔŒÅ'J6-‘&×슢ïEùîË'_<Š÷a#|bx¶ß&<„BGÔÝR*Ýg¸4Õ Æþ éÛìÍÊ2ÖÇp«p÷¦vUɯjø(‰ ö×ù]Ë©zäÁZ3/¯Á,¶ÀD¦[Ý ª’¹ØüE¦â2lx<ôOxÈ÷±É*+è:3aÓ1nɬS‹lv¶ìj6A-B_5SÑ)O†Y‘xÄSüÊ:ž$bß‹¡š7ä x8ô hêªSŽÉ¶ÈÉšsƒžÔžâW‘ÃmùŸh¹Ò5²U¬Ÿb q{(Çl%h)c6%¿m··iC ½ëcËž!qÇeåÄ ñêg08+)ÅJá@ÜQšD'Ê–qÎçõ†\|Nü$ëÕÁT^ÝÓrþ<¤ÎK§ÏÑc³óí RQ{š’C‰ÏÒÕ{ŒÛã„•`#ZK³$(–àUï'Ô·)f‡…«>?6$D5ý‚çòñüî™´ü-¢:ôQ1$T(¨Êè‰3F{X xþÛ(ULíÒîZ-wàÌëÚV7Ž ¤ Jo¿ Â_¥Ïé§_Û #+¥Å’"¾Ækz™pR…§‡}•÷N#+(Ùgß—t>z‘0ºWº®Ö15|…¶®³n\û1•õìîÖCªöÌÜM"˜¿„9%ßeºeEU¿HàçØ‰@’»ñ ¿ad^ÂF£"WûÏŽX Gµ#S)¡,5ìd‚Wzaë™užAæâ¶:þÃåWŽ0lš^§´”Ú¨í^Û4.k\uôþ¾®uT,›ÒXÏtt©ŸPÊ]~ˆäÉ]òY@Âô †«|_ÚH(òêÆ®w!#°ãŽŽeB_™¬X Li¯ÛÍ5J‹>uºCt [ÞÀy Eú­a)wc”ÍCËïÔä¸APŒdØ4šÁµÞ “Ço°‘8Wf¤Á&OZOvŸý±¯ÑH´x¡ÚS”n°eæŠ®Ç û¿‰|B”ýÕ·Š^/cØÙ€^ûÒ<4»ÓÝ[T ¸3x2¸Ç«`ñí>ï¨ÿ%[Žº[R÷(oA+R’±Hê IXÉDkÿi%”ž”hùóôÔ\¡¹%jœ\¢OQÎâ|<>Š”Hg¬(\Kî™·ÓÜ‘Xž ÁÃï¶ØP·%‰£!*¬ÕºTÆËgì Ök‚®’8ÑN“ºÝÅ{\Šgy͵|ÊúˆŸ+45àÆÄ?#È}~"u>Ç1úI"\MŠí*ð›ÛÕu•Ñn–Íù’$‘ýrF%Uƒõu" hŸnòò<°E.,c Ú¾”KluÎ*‰²óUD‡·Ö›‡*ÚÙ 0¿š¾=š•x–TÉEÊÓBí¦Ž TX ù-yÚ֪عÐÒa?¤VàØ6EÏœèQær¬Î[–\ß˵s_‹ö° :LîHüyE<Ç"ÿÀQ)-UQ¿‘”RÚ¬Npå '›>‹mdd1ܦ%³ö»§1]~KNII=Û丶®~yp¶.Ùkjû‡`‡ky$ªf²Šl¬G,T§*p_ƒi†:¸“ûÈ™ÆëÕ/H=.®iì`l„â±IK!ñØÎŹ Eé15ßñÛ§#·Ÿ;š·&/fÌüI5XÈ_Ç<Ú÷0éÀöþ*ΛEÒZ³Ø-ôK‡) P;¬¹>!w”Þjd•üEuöm.šwÖH4±ÎRq"ØYH ð[‡ÝÝôkÁ—OÑ,%ºT‚¸_Û¯&~*ñØ¡@¨öȱQd½^Ñÿ@~_r‰ïÞ¥´8üb>ö= í´»µJõe¾ØAt/¸•ѼD`u7ÛñöÖ,ÒºwÞ ÈqœO=u¥è$Ù˜óõló— ÐùZºo¥S“¢bᤠ@-,gÛŽê){^ÌÕ‹ìŽM½K|¯(Áˆñ…Á‚Ï€1pjŽÑÅÖ8ÿF˜ ·peë— Ët×÷âòG­­F®2œçÖð/üuÞÚy,^÷£S„­8õ×År^rÛ‚cÕë°αPáoV̶Xb,5²‹í7"r1 þØí„*¿ÀDó‚nPk·€Ý«åxây·i£™Õ¾zE+ꡳŽ®Q¥x”^dËtvŒsGÙÁ]N}m#ч<Û­S[w¸±Û4QÎ869é¼ã}µª‚™<„J3JyG§äÐ:níOyBø S¹eýÉwª[Ò —(ÔÅbÝ1 ’l´Î¼íæ Yuû îä>W õ㵕œï馠t«~¤Z°%Ä[(é½ýéC/´Q<­\\¥—L}Qw©,kºi*5© v±ƒxåk ÝÔS ›î—dûÝ á8ó¸âeZ.nKÖ;±|”¦wawоpH¿õ7VSŠ€¾Ÿ_àéã©"Írèo~ëu:‹®*wØ•Ò=g|>°æaúÂýµìÈ¡"íš4þˤeÊHûyëÀ^—…dfF¤á°΂ÿrôÊð´\ïN¸ôå×A[WÒ=•EE±îºö|bÂÒvœö·ºì“* xØV7:Ô$÷Gme¹ìpvÁZjzá¿ûI_1;¨8«eTÙÜ…Á·IÈ¥úaÕ«€oµ„¿]WC̺¥c“ÃY´Ýì•C®P´Ðpbøò2ï/ÚÔîHèÛ¶öã…9x_ÈØÍví.CG¨I «ZŠOÓô»»‘ܾèut—ògj£ÉISا!I9|ææÝE ”!þz‡¶ÁZîÝ®´äX ‚ÓùJèTÅâWF½-xZäk4Ÿ6;±:û,<0núcÜh¢¥ØÁÁ’vÐ…J^§wà+ qæý&îrwD´$ßnLƒ7-ÎÎÈ’(rݳS ¸Ã‚)ºsS/7ëNmC«P¦7!O;U?LŸÔ¾[¿P¨•'4Àu(”!Ró’1ðBˆœÁU³ÿR°É;VU ›¡ËO²mÓ/Añ¹aOaÏ&¬nõD‰õorƼ`.ЦxoÍi;ÎÎ'y£V!QuÃÄ.þŽÚ†®ñòNù2‰ÁqÉõ­ù*‡„ý̓`‘-‘îy‡X¨nYØE÷λ¹’m¥óYI‘B> ѰÓÐ/Z&ÎNÞX¶‚ÄÈ—dý„}ƒúvÖÔiu±¡WÒÿûDc.ÊRý3?A-–_mV}ú§6uÝ©ðF¾Üå±"ZÒã¸&_Š5Qòç€R¾h¶Æ>O´z«¡\!ò害¿ila¹žÂÑÖ¡Ùû¯°LuÖ)xšQ)íy÷ìÖSjfhØÒM®6Çy³‘±ySfäð5þ¿–š³„˜ÛÞ¬¢æi<ËÄÁ)¬»<.kçÞŠ:Do³*-_o6­š ¹¹8äõôg„e;ÕŸB†srk S¨ÓÅa'‘ÕüdÊ좤®„rŽ+FÂÁìÓê\}O˜$Û¬­ Ä~k€ÊÊœõC¤”Ïßµª2àu£ ]­•n''ë%züõÊT~³Þîöi³3HŒ‰ ·åÛ—G…øìÛ;Ø­T‰•êkÇÕEz®TÝËÔ#ø{i*W±°Ð«·ìÔöõ£@yкêCB6„œñ𔀳.Á—!Á'ë–í6ÖJÔÚ¡¬£fæ Ìü¦æmÎ9Ȫ¹¯éh¢yð¸\Mž™Ï~‘UÁ<œ¬ãæŠ1oô#½ÈîbS5£Û²gÚB Z"]ký~«=δÉsÅÂÜ( mF‰)7I £ܪSW(ײ›Þ½jƒW¾‹&1¬53×w‹ÜÓ†5˶OËÍWÓó„!U¢ßJ<†ƒ›fvyFï[av+ï{²¿bîò8·éGÐ+בl¸­NnÔÝ" ¦9³éF£Žb/ÖIu[ºaËÖ ^îƒÿ˜¾×i–Þ²½°œú‹õ,”å`…ß®‘é=éVW"qEWÍãtÍnˆ‹U± èw¨4³J`—gÁ¼Fìçªø•›a: +¢0D!‹0 ´àg)±ã¸lëþLðÌ#ÍýÜ«•²v쫹~]£^«Õ4ó%ô;E%âvñ6\‹©¸â:øi\0Ð ªôˆ¥ã«,}þu¥ÿ\ üŒú`A_fëíôô@Õ}b“t‡00¸ã7¹ˆÅúºöÞ˯ô®ÙÚ> B¬Eá;Ú{¡æ“[slf®½ÑEWD”ßÑX·UÈ9_X2­V«KÌ!^hu¢‰Ó Õ>°‰È±*Ã0ós«õ»H¢ûÉ ûí7Š;ÓhÀÕ—hŠ‚ÍÇYd^Ã=,[ ¸þ:Léºè\& Kß®–›/pv;HïŠÚÄ_Ï_²È¬‚Š@Iþ¤#¯A¹Ã©vb‘ö‡c ‘•ÂÛ¦aQŒ ~£Ÿê÷0 ¿ÆIáΚ™$²í`!‰>>õ‹™¯™ø6“8d,tm!~ûóˆŒnï­R²ýõéØ$ö0,§ß¨¿%G3ýÁUZèâunÅÓÇž(^ÕµþáÅyZs*t•ÀŠ|**¬g¯ÖÉ3lîAµ{99±ö4ª»’‚×f`gß^˜Žî„MÀ¸O‰‚WîQZ uª¼ xМ$=÷áËj&’ äÔ_é2å08æ8q„<_ŒEÉ\Ä·¿ù#F#ÖåøÀ5¬·$Õy™Öù‘84£/„oÛ2»®©nY¸´´€}q¢K‘#î–QJyökQvO8ýø|¬¤‚X/6࡚L£kô!&ôÏ,‚6µârãö}*ÊõÕÙ3Ô î|Œm \ò„.¨ú É`æ»z!Bìc ·×´.ò̧·æNÄzࣸÏ÷Pé„}Jÿ/Ò¹ßupñÙºZB‹Z®û…@,AvŠÃ¢z*+·OöX2BÕdí®1u38Åýh]?lF[ÁJ£è3¾Câ)×|Ñ‘ÏnýjnrZÓ^…Í.ˆ;FœßË kzÃB^rÓᵘ?û`d| 1ó`[‰¨åµ}ÓP’éa±Ô²ßÑ|Š»á½ŒÑgpdT šq^Bߺœ@,á¿aÉÙ:0ú;ÛUÀ¶³?HD’ÄI1ÎH¹Ðì%«"8"Æ3wc˜,Y,ÉÔØ YA}i›ãèLiÛ HÿjñP“‰6y”ûpê#Yeª&æ­·äf¯sÕ‰*Ýú+v§ƒ8}lÇáòk/@ZÀ±ùþ&Ì‹;ÿ–iÕ„.…vãj®B#²®ãYÖF‡… £.Lk¨–•ð0di"Áæ,#ÈõR6}9rØÜ ¥ÿ§äø0©ó.˜ª÷<ÎÅP‰:à‡¬ùè‡ †¦ÅxƒÍ\» O qCu‘we»ÍNjSÎfØV¹¯Úò?lù‚ÑXêËÔÞ;r:eV,ËÐíå}D.X$°>©\, ¶~.Må$|ï*%ì è|)t^íYns€T¬š0̨\Ö¦­_Xe‘"ú¹&yÚQ©{)²ÁE£±óüÏ­LZ9 HR¦@È–¤9ôë-£s“w‹pªý“oÊ2…<\ªÉq1+}7u\C'ö+šU5òz“EñØkèO즿  |º˜É§Kŧm{-¨Ñ¦c•*·­2‰xST6ÿú}6²é´}^!52ר€j– dr~œpÙí@­’ra#㻄Hk¥¥•sdacºýí´÷ ERÏïpïÌç]–µòŒâ‚ n!Ìuá{ß#GO…mb¡Ö¨c°_b‡Süì¦*kýG®EC¯(ðÁG’PèiyËþtC™¹to˜¾$ J£%"; Ÿã¾Iˆ7³n„СÜ'ÄêàÀÆ%Ÿj.û¦ú*,[w´±Ðô¶óHˆ”ú+2ëòš**ªHóœ/äJT·MJÙw``³®²FýØÛšƒBN£ÃŒªzr$´Ú‰÷ëÛË~áUðzr¯%{{&GÖÈWò¾VPneR‚}Å6!²½%ˆ”qn˜aƒäç7)h–Ü28±AG¡Õä1ð¥f«ª÷7!¡¸ëÆ2ùRÿÜÒ./œ>E_¬ ŠÐv…~"kä=9ç¼Ù0šGGŒv(âRn-S!~ÅLc±ÕèõàÔ[ÐË<*|*æB}{¥ ×B%ÊË-}Ÿx¹«ª‹×`Y ¯5!$P \’S¼oêÍ@ráæáÎ5U«ÌïþÔvCÝëÄܰ<ÿPz½Üx3f}AüÉiÍèüÑ&éRŽ0¢V¯¬Yºlïh6*Yj!=—‚Ê#%zô3LFs¿Ø!øøùÖ’+ 6f¤BÎJþl®*^\ †UÇ!Ì8¸Áî3“róú"ÃHM“Lþ”-¨”Ô¨(ièzݤ¡K’Á8œ4Ž«Å]ã½ÞNàjùçúÛ­Ð*RÑ=R¼1¢Nëx€»>ÃZy­3H ذ#„£‚Ð7˜%ï!I‘a^§—Gúôn+Ëdz¸´îO„H”„çqò}Öt&È‘©È?¾¬Ùy0ñžl/_z•hƒûé«™/æß!*:Ž,‚PpRkÄßGi= ù\CåF…j²ÂýNàÁà&=¾EnÇ{MÆÅ)ã?R@y—ÓÓH»¸/îåñisŽô=̯9@éÆMUóëŽÚÜÇè7vô=ÉѰ%µŒÊìêô•ÈÊ-’Ø™H–TXƒ4OxÙ§<{#í²±Æž5d0»ÕîŒÃ†ãäe°ÏjOý0 ¡ Ó¾‚-¹ ô ZH…í;a¯²C žÁc:=_Ú}œ½E¸‘¢x³z\üùH­”Äç¯Põ$«²ŸÊV«~€ýL|Híš @*=¡JõC‘öÀr1ž§c/Ü\Î!;v²™Ejû ÁÇ?qò]ÏàͲ@œ $Êú“ò‚K6v|×!Óyâ–¯ƒm+Í#!q¤2ÍÝ8E7,`¦ÕÐJßkËF×Ìî±ZÂt܉1myEçíšp«Èa#þbUZ–ZiI÷«àÜ©U‹»v ÆyR—f„ÎË­g/È<î¼]¯À¨Àj—±¯½ýqßRx µH¦\ã½Ärâ& íå®1£#<7V£ß Ê›òêMxD;ÃÊVûÓ¶ÉŠ31»k Obåuö .=å÷nZvqz]ÓP>ß4vTW”ÕÒËöŽ/â*CrÑÞªÎ,&k¦>OÑÇH¤È™Ô±‡˜.RÀe2qÆêÇ8îcb8ù)ækûϪº¦Á…0╯¹SYI©±2ÚØØ²6| e‡™¥ßpñY(”7¦ì“Py¹Èzpé=H[¢²J82K.Üû¨+ÜG»äÉðüÔÛ×ìÈþ2çžþÍ¡/Æ>¿ºEÇ4^í!à.ñèž(*—F ÔŽ’cà^ä0[×0©Ï5ÅX%«¶;ÙãÁáàž`,üL–™+uÊ8ØM"ðùÄvö'¡³Ë%›JÇT×–U¾aÄN}!ól'þ!laßCûÄRktS9ÞV®®¬|Š¡xˆöL©ŠŠádDFþ-ð|ëY2qkYP¸ÝÅît³îJ×2hgÕ;²FiMhI-U’Xuêe4p™¶4!ÇÀé–víK©$ºw–¥Ý#Ô«í§Z¬™uÓëÍÙm“<ö´ž¨äSIOrÛpJÑ7ߘËçkè-ºoâ2z³‹0c³­†ÓîÐ\槸I¡°5Ö*9Sù8ßD ÜD§¸˜1çœ^ö:¶¸‘NÂYžÒ"8geý˜±MÏ¿“h³ ›h‘.´ïxŸ0fö„Á LDÐS埉¾WÀRŽÙ(ޢƜèN™,­>Úé¡Ú®¾bÅÑ« „k½ì¬s {MóD¦çñâÎ.Ÿð)Y$bˆ YlÁׯ‘¼M0Žúq¦ùÏÙÍîúíA,–0‡T›óÂ…ÁPs0“‘'ã&WŽFª3©áxUÝü¬ †(ŽÞæá¢×ðª•UrßÌf——á6ÎŽ7·¯³;I*ùÔ8øfêÌ—Ö¨þ.oS¸rVE{Ï~ÍC{ÞR4|„'3¦Ú0Õ@5 fñ#Œ#ÙØò‹'‘k”gÕ"úEjÔ[QH`:*! Âû¡˜÷|=›¸Ï‚Z½æä—çJ-±gR¸Ûa­.¿Ê[ÞqãÆ™VXDMÿ]/O¥Ò}^Ç.Ÿšü½»5N†ïukaE]Üè߃–°J%~›ñèp:›·F§CûöŠ–*C’Žì›ÛœiOÁë(è7»ªÑý‚©™r}Jv?»{U~ÈwÁ¹ÒRQ¶­€UfÍTº¾z®õ#ï÷u ntúr΄Y¶;Q ½;Àkð(ÕqÞܶh '£Äâ(1Ê/jÈcÏ'ùdW£©™gÌA–¤” èæþŒ°)x²pŒÀ“*;¥ðÓè–tùHÂâ-! Ç®È:‹á—¯’üUc ÑyÚì 'œ·Äµ–ìðµçuëÄÅ}…{Ð äê5 Ñq“ÈtA™$—(|z‘ç'9uœÖ¸E#ÿ²ºY¹bاX)؃¥SÒ!zòùø$Ì]g²„ÁOèÝù’,¾Ï™óJHŒÿrlð¬ É–sj¨{î4B´Ð9ºðGþðáêˆöQ‚<ä}•ÃŽÉÕ“úHÊB °6L·©æjÍùÁ²õƾ{w`(ónþà;7?mUq+€ D½KÑy™¦î,ÌÒ /Ë))‡ü”µ«rÔ±|[[-ÊbF+wd{†¶ßCÀ§ÛgÝÒG£VïŠ=ÃHÐþòúà?8™pLàÊîŠ Õõ#'êB>à¼TXû63XÊÝrè-¯õážz×=ìæ'_Æà°x?ÿùiokv ùñŒ®?ëë¸ÕˆÖœàŽÓéߪƒÊlÐo¶ìE = ly+“ý] oâå1„w©òƒàOD ÄY:PsRUe‚–&G:™¸9Gn_øœ7‘ÜsïòÉ i(#ñšBU’ª³œÐÅ€¦/¸ºº¿^Sšƒ0vþ ‘ž'ÇíiWÿ‡Ò{vg{¯ô€ ÅÿÊË[»ÓXLÞCr±v Åî¯!I.ôBE'¼&e eë úWé$©vÛ×;Þ1gý$›ï±‰¾à6†ïÇD—TØíèPº¢  K ÷”ôŒÒ:EÊÞ«;¤K¼}%Ù¶™ÚªùÚÑ]-þ«Ànäyªš‚Ö÷&볌ž¯ç±ªÍ÷0C(N·77H;MÓOv÷¬ÆÉóÑ_xKp§æ™œK°7=NüþCº¬w€"”a“B-›I;üG™v øK1ÖUçäUq<ÏŽ=÷hS,Ã1çbÃ×ÊèW¢¨žl5{‹ÏŠ"ÚA6‘Àž#ôlôÉ˦ڹåQCˆIn6Ë«âC@âåÖ&‡;‹'ÎÙÉ_ÿì’…{<µ™Hó˜F²²EŠ· îh‘iÙœµ–æ{•þÂ'bbßÌMúº7ÃÈqA˜ch9—ÎIª@âh­ê£Ä oÂ&ÄY “ï¢6àù¤«d¡d³u©÷ìEü±ž]˜ç±wêxyßEùbKÀ?M,¶¡¹ðŽÞ§EIÓÉ7u­[ÖUfˆ¹^­¥FõßC(È|1KUÇ28K@g @×rÉPN¼I>+˜x ýÑ£:{Ìîæ’LúêÜo*d+"_—÷vŠ9Fg(‡}ŧРw6½ åo“rî›]&ÎZ2»«æM9Ñþ§;£„Ƨw€dæ.ï~ïJ ï-Û0Fv®±¥á-Î¥%äàîŤlv x®Ð–‘Hn!œÇ‹t¤nžëø†ÆgF{ \>NäÞzJH‡:йßÉJ…¾ü(>r0ùt iæÌ8 ÑoUÿ¸&KÁpGCGXG°$³¦Ÿ5“ÿi"0‰î~ÆßaåÀ¾²äq¡tT1•aƒhcT1¡R[6&¨¤;öPñÊ\ÁùÇ¡¡+M à²ÅeQ3ô[ ]a`$ê8á­[„Y4Jñ¼Ó9Óoõ”¯ Ø4ºsaÎ… HÚé ]àŽÚÝãÄ£~ëLÍ­/Ȁࠊ+Kc`„›9šKWR–ŸaÇ@45¿’„ž«ï ¦Z‘¼ú0U9×Tl¤à¯–úð’x%îä íÏ­‰Ÿb¬0T²È…Jƒˆ$sÈ=;+:~e8'ʦ j-&‡0¬V?™Ö2¢!o5÷r4ÿÆ~üÝ ­Ö|°$Ûiòç Ò°zÃD´Š8žf^KÓ|ô¨é.u ŽÜ¡ÙPïâ˜â;07ä×@3wœ´•îPï 5ý©l@ Åß,è$7.êô¶ì;î€.çû}tIÀŒ5ß`ʆ½ endstream endobj 88 0 obj << /Length1 1661 /Length2 8862 /Length3 0 /Length 9938 /Filter /FlateDecode >> stream xÚµTê6L#%ÒHÒ=twHw   1à0ÀÐ)%!Ý ¢HwJ—Ò݈”4žsî9çÞÿ_ëûÖ¬Å̳ãÙïóî½_é´t9e¬­ÀŠÎP8'P §®Ãà ù¸€@^lFF=Üü—›Ñ s…8CEÿ [Âlò–ð‡8ug(@ÅÍÀÃàå¼@ Èa¢yKwˆ5@  â »b3Ê9»x ¶vð‡2ÿù `±xDD„8þHÈ8a% n ·;=TY:tA0Üó¿(XÄíàpQnn.K'W.g˜­$+À·è€]Á0w°5à·`€†¥øOe\ØŒ=;ˆëŸv]g¸‡% x08B@`¨ëC†Ô <è*«4]ÀÐ?ƒÕþ àüu7.ž¿éþÊþMþ‘l 9;¹XB=!P[€ Ä ÐTTã‚#àK¨õï@KGWç‡|KwKˆ£¥ÕCÀ'·(Êh,þ%σ¸À]¹\!Ž¿%rÿ¦y¸e¨µœ³“ wÅþ}>y z¸vOî?;ëuö€zÿl Pk›ß"¬Ý\¸õ¡Wn`eù¿BLØÿØlÁp€á€_À÷oz=OðNžßæ¾Þ.Î.›`_ˆ øá ÛÛÕÒ €ÃÜÀ¾Þÿvü7ÂæáXC@p€ØÅþ‡ýÁ ¶ù?4A^füýùû—ÙÃxY;C=ÿ ÿ£¿ÜªÚŠú&úì*þÛ'+ëŒxsòñ8yx"ÂÂ! À÷¿YþÖÿíXµ,! ø¡2ÔÆ ò§„‡»û ÷¿¦‚å¯aüw ç‡QXþ™|S ôð‡çÿyþÿHùÿûß,ÿ·Éÿß)º9:þáfùÃÿÿq[:A=ÿ x˜d7øÃV¨;?ìôC Án²:Øâæô¿^e¸åÃvÈ@mÿ¾Fˆ«"¶Ö‚ÀAvŽÐºð@œ]!¿ß'ø?¾‡}9<¼'®½úÃ~X§ÿ.©9[ÿÞ;^A€% fé‰ |/^€7ÏÂZƒL6€› ê H<ÈóØ8ðwTàVümú‰¸5ÿFÂ|nÝ¿‘ˆ€Ûò$ à¶ú=äþFüüèa_ÿ‰æy˜gnðßPàØâþ—ÿ!Åî_ðÝñÈópHè¿à™ó?Õj?¼¹ÿr?pÁþÜðJ?äÂí`àæîñ/¾‡Ú^`ØŸ†ÿºk öðý± øþãÁƒ`öì”3H,ľ:¤õ²R†ÒƒssDb‚qÓ0••Ó{Öævý3‰µ"3hv.“4Øõda]åLzŽöÖ{¯©3¬9A»å—ÏÍË8±Í왯¤}£…{25½ÔXTœzÒ[>·¯| P›ÛUs_¹ ?ÖÊ'ºôèyލé-™ ÚÔÞªTŹ)çŒÖ2 ,žd̳ÊúFþ ÎIýˆð?yv>A˜3zO«ÇŽíû#š¯ÈÛd…7æê›×b©¯kÇS†§&äÔ¨g„CcLÞ²;É*dÓÞï‹–aC)ßHÛ†WywX¼65t.a»?Í™GEYž’s£+¿‰ZnVŠw*¦‹ÇàÏ:ZPYF(ÿj²råÐŒ‡Ük: Õèàˆlv^çÔxí`²T±…騑$ÕÐB»¨‘sj˜‡lÚößD“-™öƒ?/×5Š<¶P nj X³Í¬öÜ]Ô£\@ (O«x‡»ï®³9‚2œûÚ·†]­žš#'1ÖÕIìT6'åÈã°S¾!­É¢v;i¢D§ˆ¦OÊLÏmâ«ÓÂéiV½¹‡ÃšQ±ÓÒë}Þû}¸D¿ä^¦¢,W8“ K 36æª%luØôù×UQù%°U•ð˜;–Ðüò®“áO'‡fœ@q®[]Y|\ ÇD"“lÍ·j‡y1”æ"µÝÄw¢ÅªÍlè>ŠØA!÷ÞÝ€¹°€’)Žå§Ù¿^µ¢I¶ÙÍS{ÉÕÚ½wÌFÝ»ûþ»¯#Z!OqÅžzš jÁÑÖóQH%ï«f\¶ixu *‘}cûEßu,•XžXíz¦½ýýÅ0¾ñzìå$_‡’¼¶èóC J8D¾ ¦¢ydå7º2É*Χ;FŽ÷Úºý#ŠJ7Ò™Í+¶7g팔¯×Å=˜yr]OÌ5äÝ ê£²Ÿdr=ï©Õ…¶"L ãI½&2~qeé¾IP?¥e lˆ:p¿Õš°  çQ¦×|¹éºXØÒ3 xaëVÙ½¾Ojµb?Ïǽ¼OˆÏ;ú…—ã¤õ‘Á|½ËÄ+èmáb3e‡Av1zó3‚vk{L­þqÔ´E³ôäñ1M•”Aúûq2Äx†øDéy÷Y·3 7Eh¡KJ;•‰4ƒ¥Ç¤g’5å®"ÂI»‡™HDpuFY#ßRx“Y>eì­°àøscúû÷QëE3ÙÝdâq<©þxÛbKÏúC™wÕcæ %±g"¤é\»$öà¨O*èˆ \Ñ΂­…ÑCc_íQÛþM¿Š¯»ð]Gýk/º3æ0˜Ô/)6ÚåKŸ·ßÎÇXòNŸwöµK£·à@2ü¼vÀûs‘½šç’ÝKë*ÙQ529¬Ù#©Ã^ô`a´”§SëGtKÜ¢{F“ œ‘¸$5êäè_4þ$bê¶6¿'zĜ̹’ñ¡Z˜(i ®|/ƒ`*`X¥[°¥ÕA%W ÐE¢ú(¦Ói€´¯¿ðCŠÎñ]´úlé¯-‘æÎ<ñk½¡òëzÑV©&Ô"¹G˹ÉVÄBækÙÎTÄJAx؉l'x³ÑÏ©:Þ®ÌúdÄOvÓ„ëÞƒ†Ë—ów¾wœô_M·KDÅ;»\÷5ç- ­ÉŠ»þiúšc«–#«Aãc§£æéYÔ„„L­–ØÛ¥¤§*1Ý®©!/© †ªãÓÐ=cüg)|¼u‚ò£{j³?§È¦Ä Ù+_P`’… ¤ò¦PÜÖXGÜ3âÞ§J ñãHß#‘|çg‰§jå’@> ÓZdÛ1»”ޝ³#’܇|C«¥Þ <Ÿâ#§M 2¯­Ë›ÈyËÆÔÄì2[CD߬ €QircÍíð3¤u_ÅlÒÊ9š›c ùÎÕs¾‘n[ß/aIWµÜ½ÃÌmð‰ôP„%€ˆE–µHX6²Å„[0+Ä’J„ú•¸ øStæ”È[>•M`LmêבLs(Rù ³-G… •FZÒnºD<&ÖÐÅýú‚Ž© è-Õf/ƒ¿Ï· 'FI½¶Q‡ÊÕG»0·×•ÆÒêÐÈ·C F) |maêSç|¶Ôwb­8ÖE ŽŸ±†)šxoqôWOÎÜ:×Rå¦Þ0Rôë1ëœFõSØ#å8OñP«—@}ÕîbÙ‘ŽD5ï긇,.¤ƒ·'r&b6IHùcj?ª`?‘Å}34ÀðÑØò[¥ –Lœ¿-TY;ñ鉸’FÊ/wñ}AÌÉç³ÒðèWF¡Q’«ƒ±.ÊdeŒ•,4F§îIŸ·„|yjE?ÊT¨Î• Ó ñØ›üêXº zm_.åÞCd¬1®’Ò·^AÔ+È”Ëð#ã×[qOÂïô.ø£•¨PŠàSûJ.½$¤³0ò¦a›“9^U½YÏÃE:†&Ÿ™“•]è<)$B„ù˜Ð™÷âòP°œ¶©?l€8ÝgFóóSr[•kÜÿ`¦H;GUïâÛl#8þ¹[øQÓnTE¦?-½¦UÒ¼˜PÄ=gâ­'%&³²¼q¢\ÔZƒþ0%¨ Qm‚rËR‘ÛM÷úÆš®M91Ã?<½Ží8#°}Cd+—L·¼WÞšÈa¦›"ÞŠ¡òÚà¸?´ÄžÌïk'Ž[RÒ‡õ(•)qh6` 2¯=]%p̯¡ ÍÀ¹ÕÐüN>G°DÂú¬©—ýÈ`“³…¥N¥®Áä“§Ñ2VÛ{:³ ¯ééi®ú€W$¸ûH£œ± òjµ/a³J›»e¯lƒŠ+¸i`ÛÅAOvl‡+´Þ ¥ÖßÛ“;¹“2· ½ÞÔÏÍ£yù7ÆÖ‹,!l¢Ù—ÎÑÖáùù2ê×ZV!Q¡œÐ¸°Ý 8Z¼}]QDŸ£-Óàø}JþN²•€5Ñ›¦–À[¼*}=»ë§‹Žîí"-”/Y‘¯&Ÿ1¸Èe¤÷íQ?abiTÁúÖ:§õËàM¼¦KÞç~8H΢ù[î0#¦§: \X ÔX†¥—y7>œG%‡—¢‚(qBâ3TJÁ%&fÕòA~¤iÅÕwfÖ//ùg©?ùªçU°×YOIšƒ– ÞöLúà·ÄDOYK!ç¨`€&mMÙDŽ”à%DXVàŽm«/$±m“¦íTø…"¯u/Ùœ f V>›ÿaÞí°Ä1.‘$¹ÌËw _)÷êté^­½Nè¾]…×e‘RÏwнä´NôX꽋n¬qã×9Æ¥š±ÏÔǵEÊÍã{5A ¼Ñv:?ôËÛU£¨8˜¾ÎíRÒVšRô•½]ØøšÏ£&[ùq”^e£¹î¨ãä®û¸‘Ú…Œ H2 F1z­BH§*d¢&ÿ̲ éÔfK™ç=•Ô¤=¼›yPX”›%J9ûy^Î&Òç:ÁÈ~´§a©xâÁìyÕ`ç€ËLDöŒ}à‰ðZÿŠ‘öM¯nåOthïúêaàçíF.2Éüú®fVb¶qÈ4Ñœj¢ÛQÜ$¥såC.D–3ÉðE׿ò ®úlXÄat$3)( äJÕƒž?žº$Æ•›OéOªæ´èŸe@«(Sw_ÆüNýÔ§æ5“kOÔn¹ ]-=Ôz4ìE‚ÁFH ”%Äz6&ÅyÒ™ö¢øåë‰Î¼×Å[J°P«¨úñ:ñQhÂêo•ÛͱÛNË^0XËë}7™zr…;ÞmßÓ°”ñÑäÚVñ°ÒEiví•Åôz»:•>PKW—Îk{„R8uC,øþÉÊü°&–JÛôs>΂籿̳e¨QþÐ1Or ÿkh\ *u§¦'©†Ì‡U 2[‰}CsÄð :"°¶ç~.[ÁŸ¦²s.LöÄW#çtJ9FþsHb|jDûÇô"ÚvºÀ·äƒ(KèÏÌ|‘ë‰Û{;âfôˆxœt âXïº`|–¤Àþ½^:›µøþô–HÝL&CoÊ)¤rŒù—÷x%WzŠë¸SÒ AØx›< 39žqÂ5”ܸÍSÍëŧ³ÅMÝ?ƒ²ž°™+úRÐÒKájQnÅ4pbÜú%S8uûÙ%fÆ?Rt§2èÐF¨Íp=Á4e6Î?ï‹95 ŠÌ!ЦŽŸòÙ"aÂÌlë}¼dÂ_­Ðnõƒ6pÔ"´ 7÷¹_D¢´Q‘¿H ÐÔq“ÝHn>ïÅ)òBº®°×úRÁao¸˜Hª3Wî&Tû ïGË¥½“#vhd:_ÝÂÑSX|ÈE4k÷‰…[0]µE íý•¾~Úæg1?ßù÷ø—Ö’!‘>?J¾Â£µmþ„‰Žì¨ãì^t™ÃNPóL›ÑK¢‡á½>²›x‰Š Îó”óϵ CaîNK5dŒgWÝ-95ãÄf¥Zr¾!7 /yú'nψ‰˜öúPpvÅÀUÏ…¦ãÑ‹”“/£Ú€Ú6ÜÍqçX‘¿hŸ.fdƒét×|xc¿ŠEO½…’ð‰ž=·vÁêç”>4«Î,ó¦x^GRŽªyYÝÜ÷Ú,ÔZMÖ­‘Å#u — ðí¹ þáä'Ýh ñŽ¢Ï¹½¢ *­!µGœzaSѳ±xÌ»TYØ™‚å ¡‡2Rå!"džù‹„Þì iØ ¨ Èpðû&z×–%ïáò죘ýq¥ ÚuÖˆ…®Ži½1Úã*®q²[¹ª8‡MO¢~KnJô»,ÂG5„jîøËÜÊd48¶b; @u ï™ø_Š|ÔX ÑÁºJP_ù*à>æõÞ©çÙ†¥MapÀûL>)…ó.'9²‘—Ñ7SÐA£ú>š?ß³7éS3ÔÂÆ$fÃ"Þ–SBßÞÖn X %p¬¬rO™ÃĤ(D>ÏáKjgjL?7`—._dÆÙ¦„ºHx‡N¼ÄHN* K²|©u3l›(òòÉЪ]7PV_¯°a[.ì"Ám—Ï™‹§dê »sz”³mªãÏĆ_$óä¿Ã…„Imä©ÈÚ¼Î}šµG­ó⽡D_Ëo‡Ãò9—Ҷׯ[øçTÌô÷×mÃÄÒ—,¾?2Èo"¶Hõ21ôpÔS2C´Êª‚,]&Ãó,¼¢¼ï˜32ø‡$ìéñØ_ÈÄÄáÓñ"é³CËŽÊJÔ¹‹®Y݇®`üÊ¡µ!4²sÿB•‘’lÑÓ•íÔ^¤5ôD»²lϤgüœlÜßË /~î' ÅÃÑs1‘Ž5'êC-É…¹4|ä­O ÒVûX#T]èÒ×@j-½ÍªcÖyo'5÷Â鵋ýDA ÍcKÊÙ«ægFÃÂ#å57 Y%|æÈ5G1d½†%$QtF‚“àt£–n_×KÏá¬ô}–y_žˆý6`džëljxÆ…zÄÖ)Ùv¥kÁs<ÏpÓB2¹Ÿ*H¹¬LËNꌔhë¹Cí˜é¦h2í_‡~ ¹È•権È6ÏÎ Î2tü® œîÅ‚cʰܵÖX‰žWܬoj‘3âWÛ˜1ÆjÂýc›6×ÉmZe0×ò%§r^¯ÖÑúÖK‡¿m¨^¿GÿpbHÌ´ýžþjd: 2=jê{Ãà[Þ-ÈË´²Y^îh‡Tfr»ýf ö€À±¨æZt¶àÏWuå›ê”À¦ÖЋ¼iÓá; ç>Úù“˜§fìEz/ZO0 f§,C™{a1sŸfF$Øs¹vá/ëÆ9˜Þui±Î|-Ά±M¬ò¾v™fÈÅ¡Ò÷¦æŒª?$Ayȉ ¥x5—›–mi¡9äój=Â:=oiu„o—u¢»™aõ;÷‰Ï¸ºÎu§EåJî1Á-õkŸÞœn[¿ŸÆ·’UŽ?Yœ[gï1&m)Òðx$44vN…°Dù»œZÏÕ9ÇʹÑçg?Çi¢±âUG—ámF°§§/—!:óFá&™¨.a’©IF®gŠÂÄ*~`FjZW0¥ýèžù¡VB1¬¢~öÔLϧgÌ ˜æµb¨©»-Qù6õJ‰¼H<îq•q×ý<ͱÝóí’V¦`J1kÆ¡–ÛÊôl}§Ú]yñbk¥5O›p‰ð$ Y¾jòûÉ/‡K×ä|;Éút‹×q9–Ñ´*YüìµÊC%ñ±ëž:&©ŽI¡¤e…mÔ]½;G[ŒûÀÔiçv†ÄÔF#ƒÊð$*(z’ñ:Fdª…ûì9˳%ÜÞµ’«Û³ºÐÕèƒÄIãO¼^£QE夰?KØ l$žk .1XSŠL‹?›{ZÍó|.çB ¹fŒßº«W=<þqÙõ-g·‹nÆÇN¹šêÜW¢ØA¨""0ÃLgÂÛK® 5¬YÊS³YwŠk‹}EÞâÆâÙ «Ï!.ÓW&Cr“‰*ؼzq穎ט„ AÄn2륭½Ìb3"ÌJVËZ¼b½È|<†c‚¿;ÏýÛ¦Ó Ž ]\›xy·n5Ê@Š„úˆ¯õ‹y¾Õk^v`ë½gkîHŠ‚X gñ/¹ðóF&L44‚ä)©×»¶iíÈI¢ |h T·%Æßp °¨®^“LH²c†³ó·x~“~O²„žóUöÛÁ cÚÆÖÄ3¬RjN‹‚¨¤ˆÄ¸ãá8º¢bNŸg:ê0A,kûè‹å`Šœæ²è}F. ®óŸxðŽl òãÿðìóÚX(Ϧê56ÖÉZ  ‡^9m/iV¢Ü͆’{tyhº±iô_>v@B€"³Òî &;EJ•º^ WòŽðçüü9íÿ-ã4?˜+P7ƒ}€Lš ¿-2δg̬#ËÊp9._c©Èe–IJûoÛê»m™ÀVÆ­uÁÜ‘ƒ‰WžPlNþÐ~‚&Q°·C¼6”eXG‰J*ìMç$§?Ó Ö  ¿£\ÏzQi²\BH`ß—^ëcŒªÍO;°%'Nb9 sÞØ¼–úbôOð'¸«Þ¹2áÛõwï@e&Ö=¢Y”¶¸ã3zq”:å Q®Cëü(eÆE“]cŸ,KøÈo7œ Ì?s¯ì«¤>9b aÇ;ß_ønÇÙÇõYMògšRnÔÈ•÷ÙW;?Ê÷r]+ÁT½ƒ‰dQ_ ‡´.‰¨ ñêá.¹'¡¾‡GùÏ —¨ùdZ‘*o󓮚vág_5|ñ§&SåJL’Ò£ ™B´bS7ãV cà?Òža 6ÒëÜb'=ã–”*´õZÿ~8ƒ¹ÏçÛÒÿZqÊ»Š!µ{j•çBŽ%‡ˆ[×E!w¿¹Í‚ÓtMc'›ãÚ¹ þŽ;`§¦iŽfri†Ý ÊÐl@ms óhRxS¾{Ž¢”¶h"}ÉhíÏFÆ9^ÒÕ?3(ìÒ佉–¹Uí}9¨Çæ{yÞâ—wê`I   ƒËXÌ¥{ÙBëT¡Õž¼Dµö¿ Çâ  #H÷×¾ÊL/ vÒ,€?z$ÚVu¶¯„*°Â´÷œÛ¼ øg³˜‹>dxy’ù>Î~ʪP· F(Rl!”5„€G¦0«Y6¿‹0Eµ-_»@»ï-TÍe|³gc¦{&/µ(E•Ýeú.–æÒÔ¿¡Š?G>à¢MUñW-yfñãX#·"2S¢eM$Âú­/â®¶´ïÉ÷Ü5"!¬»‹ß€1 Óíâ"y؉Šo|i䨒¬¿î[}Êj»“{é4ŠÂ{S½Ú˸ÿ͘/»9º ¤Ó’åùl-(µ=,Zô(«ï†.ú¢t§àT¯òÇ”}|åë¬=UIõ¸QEf™<Å.÷9«55³é$¤Î4Å2çbJó|ùÀVpgesëXöÏÒ-?}ÚI¡ºÒ罤êŠ%Ç gLãøÔœ;k¼¨Pâ–'á«]µñ¶¯†„MÄŸ<òíúNÖêÝzc8N0¯àò¨*Ñ/×`@k/$uu-1ùËÒ¦ø‰“ &ƒw¯¿qÂW­"%Zƒ3d>6ß"Y1.†pyHì'®Å‘^É@Ñô˜±…[’Úûl6 A) õ•*O{ÿå’âóÃU;@2X™1 1d˜Ž½ÛËKyÛ#ñÃ~×ö¡› =Tû |J}©ê•oäÈß¹q•íí0ÖÃ-š‚¡\_`BN ãEÜÞ¸*Þ°&„W¶áNC,P~~g%+ÆÊ4UÁÁkùÉêâe½‰ü¯"P.ðûe£UÒ/[J­ü@ek+.®4ß¡ØYT•–j’6kù‡û´²&4êÉ—€OjÔò›¿è6†¥ß„mÛ‹³ur¬1I¯)!Ò‚1o»³R\Ñ*†µFô‰:Ÿ u„½ÓU1)VFEµÛÔ|:£yš¸S#1à1–6ña‡Ô#Lgú§ˆÉL j/ÍJÚflˆ—Q‘¦È2ÎòÛØGˆZ2ߊ©KW§Òƒnñ=ÑíØbž&În´çV.ª:%sJŸÈ]Q·H™ôóS†æÌHVE×Ì:(r>L|Œ–ß%µ{bä+PËŸ§TÆ &¶[M®f)•¦î£o‚Æ‹ö‘ô°b£“¦ó¾ØO¸}jê¯ÕI—)¿*Ȥ暅^ÚA€Õê$;ÈǦÍE…ô)…[‚˜}¸ê\ß»"ØìUKÌò™°Oë9~1Q]¼2ÍXB» 5?¦R,))]2 UÈᔪÇP1üNå,Éïo0Í“ªé&¤m4H8;ì6‰PoÕxŸž¿Qç¿Ô}rT´föi^] Í+ [µÉÀƸnýV#Ÿq)Ü{C›M€z|ªˆ¦0ës?ÈÂi >HÓ¼(¸Ô.7ü~¿°LJæÑž‘ ¦ Aˆ÷9 ÏO$¾×!êïcr¡}ý%Gs-)×B¬+†ËûXôóô›å‹2ô©ø‘tÝð|Ó ”f7B}®ÇoI6­h†tjðÂUcå6A{–Â*<Ì5ö™¯ˆJE䛄ÊÃú}nV7Y­1€jcÈ”0Ž, å,Ž_y ¨’·‚HL ȵàvÜ8¯¦§)°x©ß§¦lB ËvèÁÀ#iœewŒ¯º;¦@¹·áhéc±ra$£÷á³Q'angBVLæKv´½~ÈpŸw«A ]¸QMËÓ‚I‘sgUu7d¿PËW †¨¹›¼hk—Ò´M³ÓëÐ>Ý9g(üàá´{eŽì9b¶7 €Ôu¯2Bàó-Uìm_ÔÜ›¾pjrŠnA~…OÕ3Ö. VÎrã^ŸA “M^³¸ÂÔ̧>we›NÅ¿û'÷4(fîì–«u0–"MŠ)MâI¬SµDIôFïmQïé…öMsµAì=)]íë,4Á¦_³^«TZGÉýJ/A´i é.>Æ_¡åì‡ËìGÜWn=~†E½/s$.<&Ü> ÿ’tÎù oתّ£E7wÝZJç‘GþpþJq‡þiTík¦ý!úDÑíxeŠõ¹Šu¿Ün<–p>IÍ…¼kÀÀ¶þh„bÉgÕ¸á$MÍhëMàHýž¬¬zþ(ÉZJyO\+E@ß–®ewÀåG;ÕàxB4è&6cjvW$JîWy±³sÎ#¾jTj4@mÏykÛ Ÿˆ_çµê?¤ÅlS‘2וƒ¾ôŠŽÈ*ÿDa5ý(|×]³÷†=tûÄ›÷­#®wP³^¸R/½D~oèe‡Õ˜Htýq’äGî8ØÎ.¿®[˜ã“±*qéƒf£>#kÎ)õFUu¦ÊŽ\ÎÔ"ñ2”6ê)ê´õ`Ÿp¤‚¨yþü2ÅËÁ(lN¬§ÙÙ˜4¶Y>MЃRG 4”ZµÞÜfêÓNéÆ×—t†6+üµËCÏ)¯Ki*6-MiÒÈ´G:uGj¯eX7eèì;" f„. ½–/AutÛ<ˆ¼è]%'\7Q¥‘W.v ytöÊ_í‘ÃTüí6c† ÙŠRÄ—!JÚXñßø£Ý)VÄõ½?Õ3/m„M$5>ê´Äů˜ÜÀ· ÔcÄ®$"ýôäê—c•9s©°÷œÌX& º/ :´7¼¼ZV¾Tð ¥Ô²j”1±ß½•Lç`¸z²x²kSûCR ^v߈r♿(e5k°‡7Ø”‘9cµb|üµÆÛ+Éâ5Ï`ƒ›Ãr¦oNBÍ—°\¦4fØ[–°½QO‡,Á‹²û•p<ø<É–@^}1S”àŽªdøæex·Á Ãͺ|xô`¯a±œp·QjY0ïgÿ‡ÿu"’QïŒж pòÐô+­ú*Žãrn‚íÎvº[…^éõ¤Ïù!ˆJyj„µ(6¶ûžI©µŽ×;ª¶Ê39ã?ÁÍF}#Hæò ó铱Å>ã,È‹—ÞÎS+bNó…Ó.zôr~•²Õ1¡Ç‰ÿEÿ °%“ endstream endobj 90 0 obj << /Length1 1619 /Length2 8599 /Length3 0 /Length 9639 /Filter /FlateDecode >> stream xÚ¶PÞ5LƒtIH-Ý ÒÝÝÝ, ,±K7HJwƒ4JJ7H§t#%¡H#Ý/úëÿ÷ͼïì »ç‰sï¹÷»7û7kzB|ÿÖ`ˆ•õ/VîNì:°³;HAúÏ’§ê?1€—ƒƒƒO€r€¼€¶ì¿èµ½@¿“œ¿ÂO ü} Në' °5èé Õ×ÕÂpsqùûþ;ñ_„ÊÉ °Ý– 0õö§0Èúütù.`/€Ç“÷8¿>ÿ2y²—âàýOùïûe×1”Ô•ÒfþCñß9II¨À—•›ÀÊÅËàáðñüÿËò·þ¿´ÿŽª[€ÿÜÇ?„ k(@à Og÷— ?]ÁðçÄ0þ»‚*ôÉÊ Ã?Î7æàå>ýáüöÿï–ÿ?Ûÿbù¿9ÿ7$ëîàð;Íð;ÿÿI[8‚¼ÿ,xr²»ÛÓT¨@Ÿfò¿¥z ?&Ydvwü߬‚›ÅÓtH@lþ>F°«,Ø d¥vÚþa¡¿ná‰Þ ©C]Á¿Þ+'Çÿäžæ hÿôž¸>ÝÕïèiœþ»¤ µú5w\¼/..Þ¨Oöââåør> ¨Èë·³ìl¨ÛS àIž?Àê‚úëF_òØ%~…~#>N»Ü?HÀ®ö7à°[üƒøì–ÿ §Jà߈óɽì A.»õ¿ €Ýö_ðiàÁ—v»àÓ±CÿŸ¨œþŸ¨\þŸ¨\ÿŸ¨ÜþŸ¸ÿ†ÿ9A »‹ËÓËòÛãOÇûþýŒ@^ êâ(jWÚvU%Aâɺ=&2M»­—ÁÈê»èÒî~ƒ‰œÊøñMðšË…DêP7öò¦ ùøŽï^srxK²Fë­ßY¢æäv+êÂAÿxñžDmÙ3RVmño~÷Î~ºAöðͰŸióÝù1Õ ñ®<{å¼jûÊ¿|~=·­ñíãK%´»ò)ÖXã ’ÚËœY"*$7V2&Üc/¬™ó‹iܼñG ÅDfTÿýXî·¾†ë\q׳>+Ú\®Ä4ĆDdð縟'é|%wÒ ç}KßEc7±pÞ+æ˜ìG¢.(R2˜nöøÚ)u!Kï_¬GÑy^·|» ôGB9ö‘m“ªC‰þ¦f çÕ%Òâ¨A MÂaÂa^|ò»šu?Pœ,É"[b|æèXmŽŠ{î’ŽÊ ¨k˜[žàÏâPÜÕqlS(ÓéÒÃ_/i€c€¹»¦>-–*·T˜øE=“¯k%»ë[º¨y´Ê϶VbÜX!LÇ`᫘9Ym•ÛqÝ·¥*òp_©·æ'½ åÚS€'1”ÚUú_Ó/ýmìräq ÷1Ï}+ïÙ%|#®D¯^k†\ã§uÓmêÍîžóí\0ymØNµ­ñ„ד)x¦9a ' çJóÏpëîxd L~¸W g» »ƒN¬DèÔ˜¨Èö4°Ü­í´èuÄ„œ°h×ÎRX ˜¯² k[#‘¼¼Áa°º!UЀf,Ÿ»+z` %íÔŠI¾ ¬cγ±[Ò<¤J>v” Ìa|E:ýµëEE·™ 2^Ÿ×G0™1›ŒÍþÏ©ºÃïÙÑê®ß…àmª?¶½é?\ò’ÑŠÏL9ëô/¤±I·nV…,`foX¼#4³t¿á‚VÁж™vÑ(løWæë|`Ç/„k»úfó¼]}Ÿê:Ýô3Jħ̄¢~eÖá4Ѹíþmr¢o”ÜàåpÔ5–ˆÇ"«è†>îÀn€xr4;ÓdÔDñÅÑH\{È3Ôü“Oðñ<¹>G”È íƹ‚y¯Úƒ?ï'˜“’áp½R¿“näÎ>÷s“C|1E:áf‚oߥ#ž›ËgÍíd¬"}ˆ‚9.CaôhŒU^Íj8æ¸'%Ï)N"«&ІvªMoRÝx8Å‘6²´T/ 9‡‡¾a6ß8+'Ñ~qˆ‰•Xôv¨5µÔ³DÏ@»{µ?d3ðÐò§ß̘í 32Ëäý‚–¾­7ïûW@nÚ·8¶Y$«|v,j^ÓáçËÚîMKJ=©þô§ú :oaâK1“æR»Êîû§Z ­NËã$*»A)·òåþÙ}½ðp«6g‚:DÖ™˜Š% ,wïÐìŠW#ÉÃ,äa1¥ Ud‡»eí…Ð/5Éxç–ä+vŒý ×È—»T=ÛL…ý!zo8”F¤_kg¾G«] •›9]Öž 9Jß²¿Bâ›ï™a-x÷Ð ÿP¯f-ÉX ¯3)e-ÃÏV‹¡ ÇỺ1 7óî0,eçY=ždõeÔh˜$ž&±µmë æî§ %³µðóO*g‹~:ÒQ«™ïg£™F˜ú»¦Ô½;r«\ÈwŸæg×Ö&~Î×®*ÉîŽîy¥Ït 7¬] h 1½´•ïþ¬ëúzC¡-Tj´SÄÙA>»)¡Ð¡ôOƒó¤êa5زU÷~d¬ùõ¨¾ÿ! häó|ŒÀ#5= ’qIcY.æšÓØnE¢"/ïû*$x¾„ 9ùʈq)† ¸ÅéÛ¥º06Öyáub”Qb¬HþViÅÕECË…ÚWr3^„jt­‡ðÁaC}ý›"ë8ýwó»ÞÈM¤ /º¦²ŽË‘"E‡¡A77WH1%YöŸÙ.Žn·¥ß1p”­ðˆë‹Nr¶>®ð׌Ôm£ØSu_ÙÈÎå·ññ<}ÚY›Séዘ×at‰`4?mpßæŸÒÿpGˆÕØÂéÛ}ý¨D¤RûÆ Õòsf{—@5l“{r¤«¶Á­BÑú+rÇ0«•náè<ø¸x•çåçñÑ"E͹îÍúc"šÐÓóäï«9t¯g_¼5§Ácõi°ä[̽§·û®@ŒÄIÞ†îðÜNnvw°-Mæ*f׫,¢WÕy¿F+4uº”ÆÌ!"ÃXÎĨž¾hTd#âPÇ4§µsz=àÙöÆ ‰ ÉACoÆ›éÄȆáßrf+ØŸ(+Þ·C¤ì”lV2[ÞL%¬;: ËΪŸ™«ö',VI Tá0ïsJaÞ£Hô{„À°÷«¤72‰LLÙÁTzEÇv§%¨Ð¥aŠYàÖ~qýµ>Y;'»ðU»WÃ6–þ£TV^“Êa¸¾ò&U§hYÆJ<»,øó`²Š'¯™Ád°sqJ;Å5J¸ú)ÌβEs²uÜŽ<‡t;Ýñˆ–©Â-‹×p—*ß«ž/º^?°VšRÂæ‚]VT±ªí ö -õ™S±¡qákM£¾ìéÒW¿7×y‚JzSO=¹'µó¿ê|å’ÃC˜~52¨ðBÍùÜ $u±rÙ< íJs2ËáÅ›L¾·/͸TDôé”^ÑøMÌÓ³¶Ž.–ŠÂ¼Ñ¬†ºñã<;SÚ9!2o5~bCh®Îíx¡±‡ºÀÑ}¡)Ò£0Á[nÔ¬ã¸ÏµUzéÃ~h¤ŸõúG¦‚‡Fr&.k¡iýw¶Nƶdcõ7Å)'ÞŒûõ؄ϘÐ#ÄŒ:l>ÑN$‰¦Šü X @rûR飌—1&xëZl?’AÚNéóFõƒ1|T#f^ÿðy‹I T˜eF+êîŸ °,`ûµL@#7÷é ÿ‚PmúÂ`œÑ Y»{ͼ°lÔGÇãn«á¥¸–S|U·$(Ú!s"øÕÙWW~‡Àv¸’³,ÙñF I¼æwëQ`tºŒ˜Èã‹N¸ºnðÁ2aúõš7ÛvöŒõ Ý¢ÙHMëœ%¨ðAÁ…‹´_Éóô"p}9œP­fiij¨â™úÔâ9~(‚–J“ƒ»»Ts4Hì×ßï¾ÖÏC th¹0ðËY/YìP)¿Ã'ö`Ý\2ý¨z;ÅJ‚ Ô˜.&V§‹ëð^Έ*gTJˆ¦óUA)R¹â>C½ÆÔ[\Ô¤)ކ׫ÚïO;­Ç¯›Î²€Ÿ¥ÃZ$Q¦ /Ø¥/ípÕÄh(³¡xõ;œ}YVrŠÐ¼« ¤'<"Zø)iZ; ­¹¦¢·Ÿ/Zz QrÀx+ è-ci6ÅbõÏðbG_†˜]ÌÎulp¥Š~¾9^Â}Y›“½u^ ‡ãû9˜#ì¼5Ç„®–8-E74 blªÓÀj™XU>¥1ð™F†‡(Ãx¥>m.3iJ×v·Qß§þhéÖmˆ§\Cž2ÚIÔø`™ìò½ªØîÀ=PŒÌ ¾ÁhÖãè©-4êc7ªѶa’# 8 yÞ¸‰nAŠ·´gØWêÔ‰6Q à‚S°[¸Z’â>:µ66:Õ/WdΘg'’/Vî‰ L*m~m’Ä=Mª„ ¨ôNË:|kõl®÷¥é¾%Á6hG¿ªÔ[àšú ìäŽc$IM…ŒȬ¦$_ªГÇú‘æ½äòj4Ç06ÍzŽÏõÎM©§ˆ~0ýºŸQö€Q‘ü6-W|1 Û«*4•6c¨ÏÓ~”ì{ Öó²5Ü”’ð ‡Ê¤3x‰:ÑÞÙtTÍç…!Yƒíñ¯¥´ZU:«[ο „.aî "*Êã§ãN ¿SÓá±³ªl«µâ’&Ý6Vÿ îj|Ͻ!˜®Þ>¨ZÀ—~ Çe󾼯R³†·ÚÁ9íE EïyÌQ¨ØìÌüÌW8_èÔWòÁæeÇpºg aî»0(ÌÄr»€ú,ÏFì"Á«ùo„ßEÌá±’˜œèøež‰JV†`hÉ„x®‹|A¤±{\Õ9¤çð~Ü’Fì)pˆE²3/0!#ÀÔ÷Òn@ýÜzép×…ûh( ¾ fPa…õ|ã Ã9}fñÎà]ˆ»:¸"€w7U9Ưëšûv#Í[díl°=¾`öÎÃ0YF ©%rÈæ+¬Ñ,똧ú“\ØìëÖköA$ VžÕLbÀ×拏-èO7ºÐµ0"9ÎTß”N"I‰Õ7¯« 1ÈE×[É ÷«$~Ý9÷kCãÓv¶¶Ô+²n–<öE•|‰ÚÇPobKž¹ü¸"'•ßKàP”§ÑÌâÀ¡¢~‡©>BNˆƒÍ0_ŸqƒïzH¹Â‹¾Ñ¢¡|úÑj^º+Va¬Ž¸œäõ_%±žZ§ƒž“³Ç8ñÓ• ªGx¶§{ÊB}6¥¬¹Îþ®$Õ.‘m¥þ(ôfÍ©';ÞkmÃë½V¬£'Ö˜ÝAé&Ý+–YlÛúzhJ¯¨wc‰á^‡e»¡ kÔ>DB¥ûYõBP†=Nú+åô¡»oqyâ#Šç,€;éÎÚ)³Y¯æ8-öþ-Ͼt™Øò(|ƒ¯˜r0ý{W…™é¶±TÑß“j>é~P 1šÕÑ:/WÉùl³¹(ŠØãûúp#O 2E‡•»2ÄÖ7„}ž…g©Ph~T E5(X¸y•'š“†K²9ªuqZÎK_J0vœ讣ÈÉÒÍâ^†dLÛWž Ø˜ŸÙ¹¾?³Ý"¡UVÓpK@!Ö4@»Èø©¯C Í)^w'µARç1ÖLQ¡.¢ Ø þÑ·§v|\$YÖcø¢%.Ëtà¬ÓÍ| L.¹”x=Úä‹ !×&/íOZ‹§q”AïŸBºeÉe´²˜¦?'&Š©á8FãG·42 =þØÜ¥Fu\%&?_¶MD´¼Ëüd¯µÇ–½å£óÈ.’ÖjjáâÓPlŽ™F~ÿ2ÿýËDÒˆÔQïZ'YwJ?3i­È¥fý=²#a[Þ:vÍigÔ<¨²ÂòCÈ´^ ¤Uöu¼‚ëý7Ñ÷Šj¬2¼ dDoN]Š`EÕc-§ØÁÍVRH6^ÜÞ!R2hŒ£äñ³`á”9Ôëòã%µÅÇØ?w3¾PÍh«î§ìðÜl³c7Oƒ°X`<ñÎJŸüØ«×*ÄI:e,@FŽ­æ¼>éçý‘kgÄYÏ×?fþm{I›×9kxZ—:¥µË–iº.§fPŒ§‡÷Ÿè9”$§4¿;a<(ê°~ Rc‡:¾óˆ<Ų‹¬«N€~ä¾v\:¬l€3㎠’Êþ8†é½-FѯE9Ùø,PË@0¦(¼W,o7®ÛG^ÀPóó¦ÐA6œ‚¹[×^ðn”•/«)¥+_È gŽ]òÂ\¨&"»ñÊÜñk©‡‰…SæÖÅ@‰ Z-¸ZHô"¡%_’Fÿ :!`‘UÅO+Tâð2Z–ˆŸíj%†Ž(öš:›2jYR©úì¡cÑ„ð~>\pQŽrS'휲±‡t§R„W>£±¯h‰=–õÁT;{º½ÇÎúçhՀ漤žóP™`Sؘí"Q^Ãz19š›35ü,Ø«à–P¾ã be7QcqÃnž‘†^Bé' Ç:öZ‹[®é$'óGÓQ§GþFsu·^~ãUÉS‚×Õœ=Xy³7¯°üü߯Ö\ߌÛZ‰¯–_\^‚gд¥pè"òÓËc^—„&î5øfnFK´!i9êÕ~K4᥊¾w‘ñXÜŽ ¾a ]²=)xÓ«Ýé ­¨ßÐ"ÙN¦~Ã#qâwòÌ.Ò™h,õ4 JÛÅÌÓå"Áö€'òËâEÖ+–G>—@v%"ö—Z2DøÚ0jDEòþa×´Ìóîß\Äà‘ö¶ªédkß>h(Åßà 0/häã„§›zÑ9óÁà á§wÕaBeëûÙÛˆ£)ƃöÄ–B&v}y¾Ás­¦åøéÚΉãakƒ µ·î”ÕëØôt_rÄu·¶1nÐÇê)‰­Å•p\ÞX†ÎÉÚñ-ûAFo5W`ÂØž‘•(€Ö+¾9”¤Òqu=ÃF•7”ì¡§oB•œ&=®_°añ&·¨IÐäô¡ˆ1½™“Kð,bx‰ÛXYæ=öõ:‰ODkÜvÉØ—ìÂ"I#sö< ÂÜìf\°ÃcÎ_bùt$£ •ØÚ½usÊPÆ—Ák½“úÂ` ‡¦I0ˆóÌrëQ £«ñԠܧ§†Ø.VMOÿ†x&&¬"Zé2åìÂâE<‡s‰z-[ç³ñV}X½ŸµÍ›°KkSKÇ´7 ›éÕ‘$ʆä˜Ñâô p›¡'•Öûßôè „9?‹íÍÀ^-,Q õÎO˹= ¾º¬PÉIŠ=Ôw9/™'ˆH¡¾g)ðN&/C/˜R.“Ç•teéÚœe»`íÎàs땚R%Sèø ©+yh‚¤˜¨tëz4)Päœ7¼·N©x\ß<øñj÷Ä=ÀèQÊ&5ȧ~/&€7^ÆX–QU’ƒ ¼Çpz†­ÍòB´ç¾…U¿œ|Âtè£4.7h§Ï(Í;rm„akû¥ó|9ÿvf»¬Šf"m!r;¶Dêeÿô¦‘Tà bF¥ã´Lùe”Ëë9xÍb²[¤Â"÷ⳌõÐ7h>²ÙR¡³§+£iù÷óÏV²B2µ©îÚßMå"¼ëXœ{“ ÷!ßy*½]uÈ¿ÏUMÓVÈõΓÍ}E¤äùPq÷Á°zý(”ÚÂá8C#à :û™ÌzLͲú Êæ®Æüõ«…] :ØVe-‰Îuªœ=nÜìŽ×úz4ýÚÒÆÍ-pË9C)Z7Ãáz|ö:}Aˆñå|§j;òávñN ßNc~ö´$ £ï9Þ$-É\¿|ž?ø1 ¿ÚÀºð§G_¹«ü6ˆ9§& þÖC‘jÓQ/ñæH€–÷éA ¢;UO„ú‘åýéi,ú”ÛÙYùÔóD´Pwž·Ä–&w¡ ðn1õlHNÒq&š¡y¤ñqE~ A-PŠF$k¾ÝêlÎð]wµF"¸ï‹+¥bLÔ[-N£¹Rã¾µÀÏW´K¬5sƒ±ú˱ýÖ.´¿TOfj]Þð ñöiÔ:¡ÐÑ PJœ"YÅL]>˜½ÃŠßHaCÚS°,È µ™l4mdî™DÑXúáø<­U8ª7pS¢4ÁXtíª'J[U ÁÔ¡ü$Å{€Ï\ÒTÜÉ[§‡‹\Þº©5é‘?~D’=‡&yýô2ɤ¥§ß’Hë™5Û?Ó¾k»äanÇãPɽ œKµO–µ;†}M§‘OÓÒF´ÞN}üÖîáŽÞþx*Ø`Öâ­\³Ž“J–ÎB °0ÐýGë ù˜ÃBû'° ýDÔ@5âÝhFÆš-ê€iÛ{^Ûù •ˆc(½¯G …¯½;ŽYÒÒsQx'òx%Ìbõ5ñæAÌW}ðzm`×_yÙ•;ç¶#-ÐAæÔÉê=FhYv-Ыµ. ­n|©v©Ÿi¾hxIèÚª-æê#¶ßBU¦cä)¾Ù°æ\sYáØ&ù µòÛ³cëR|Fv –ÏZÚ÷ÜìÞþ{]d?˜˜‹ð…µÄ†4“ G©ÈS ¾÷X«û²d_”Rè£Pè5ÑÕ0ÉJ (lSÞÆñ'hüò7SLIl’ãb<„@âÉÞBjテç(A_y𥣖¹þ…S^voÍ“F {Ç-qÓcŠ3"},8cÙü<Ž4_¥, åµ»îÚ¹x÷ŠBDƒÛ[±Vœî2 Bò=ÖÁ4>:³2„7–Œ¡×ûâÍÛ¶@ÚÍ»²úçŧ×UÇÝì“0c"K{–dQ×ÉkxhÔ‹ª³ßÜJb2âú!ÃAÌÉþ|¸ t߉rÈçU úpÖ ?vÁË Îâxö— ÑÊS Îe‘'«í\G{DØšž“Üî´¦ÐDž¬ ¢›ª Cqlöéx±*Gët«’n×°(Ý%ß;õ¿ÌL—°Úh/¨®ì˜Ìæg®2ƒïºö °¼š•–MÅ »¤V™È~ÉÞcÎ@º‹›ök3N¾\û;4ôY´5»‘ã7èqKî² ê´ûÜA@h—ŠL¶Lqµïzñ=…íÛ1_ËÄq³+æäÐíW‰…h‡ø<[´ÓæLêàQ ü#8Bá=Ë=ñ“ЋÖXªOkØ‹ ’•}Ûë;©R ‹ˆ°= šªçw$Œô°kv¶‹"<’ ÄÛM>în…íß’tLÇr¨š WÎýùN¨×G„h«BÚÕ™þ‚­MðжåN+_šp#ö2Ó8%’4ü¾°ÀAë§É½ì/Ÿ7DufPT; ‰# hhß¼¶ M%ßò¡„äGí£sGÚ÷kLp'Ñ”4]= ÉsN6Á“I Ÿ‰•Ên“†°ª¶5íˆYf°ŒoýçÔÏ@hb9NòGɼÈùJRa)Ö>áÕ·Àq~'‰ò)‘OZr€\ÖyTßž—‡†‹Fî&®Ÿy¯5js4Gœ_qŽG¨B…½’F«ÒXß—ªXVŽ3T Ù µúüWW,Ø4 ³P¤DÙo…&bü¾õ?›7¯OP‚FO>ï*„ù„Ï7ÌÛ&F³u¾iÌDY[w>ÈŸ’åizºÞ¯’Еß;Ó䊣ñY4ž®ÜØ•«á\E»#RëyȺ–¨ØÍÚ¶éKØÅ»emãÁG”~jÐÀëþVr‹Ä÷ÎÀnÃwwî㈯ã”mbgǤM¤eX [ ªNVÇŽwØQñ69ôÆàxŸ_æioÔíûó„íÏh}×µ´ÐS¶ìѬ¢†ØÏÑæ‚IiØ!ä çî aL•Úº6Éú.?Ù\ð5HQ“ÀbÊ_NCq@ÏÅõØYç1’×OâHgƒNéMKm#ŒÌ.G÷Ô›¸„h¹W¯–Ó…^ì¨åþ´~Êj endstream endobj 92 0 obj << /Length1 2246 /Length2 13619 /Length3 0 /Length 14950 /Filter /FlateDecode >> stream xÚ¶eT›Û.Œ»wVÜÝâîR‚»»»[‹÷b-P(Ü¡¸»»ËM÷>gwŸû}?îÈÉûLÖœs½¡¥TÓd‘°›dÁŽn,¬ì‚)eM%--v;;+;;' -­–›=è…Väâjvü—” è‘IÝ ¦Ê`G€‚»=€ƒ ÀÁ+ÈÁ'ÈÎàdgø¯!ØE ô°±(³ÀŽ WZ)°“·‹•µ$Óôæ >æ¿Ü s #@èf r€d4Ú4Áæ6 7ïÿ A/líææ$ÈÆæééÉ tpe»X‰20V"ZBMV‹){ןJ4Y]]9ÜìÏ'|”äUƒ QW"X°·V}¬pܹxN:¨¬¸‰„R´SH\zƒÌ¯/·2kÊ|ay‘k[¡ØÞ|O40 ÓºW7–RæÄxï‹—Y §š›ÇçdS˜Té:ˆDÿ Á®M‚˜œA™Ãø¶§ICÿíäkÛ¯Zì㌇)©<Ž^ CIײo!¿z[XoÝ‘“‹–^˜PÜ2ñ²´‚Òy{Clé;ã¼>¬¡ÓÉrå ÐñѺ„dD )“CsUNÕuaqiîG›Ûˆ]ÿª^fQSð³¬Å7½#rŸÇ:ÇÂx)É®°¨‰¸&õŸ]i¬6‰e¨ÙšÁ'Û-¶Ge/*í¤yb-Ï•=bEá\46}Ôb`f< § QP:‰dÎ!¸Òê1#Xî¥\«‡_C ·†|a=Û±[Ó .@ôIìáÌÞç8’Ö¿ÜlŒù¨¢Ž™ÆF‰Uý˜p±k!Ï™°gåik2§&¡ÞnŒ*‘-ªÃeÙ¹—]ó3•úV–/¾l(O#¦-å-‰ÙÓwn†!`þF‰C÷’êmQâ5õ¾¦Ø+‚89}—Ór×áù¼Þw"ç•ÛײT?g—yeçѰÏs3 Žëß°úH0OãÂÂ&ý¸Ÿõ0×ÛM¼SÃÖÑNe%÷Ð2ìÞ>©Œ_•W+:[¡/ŽW³¢›*__²Vå>lü¨çìv©~…•¯"Ù*˜ûëÁ‹|œüù¡yˇáéF@Y²Èù-¶¨p?Âêð TÆÓ“ñ57O¾¿!ÝQÝתåëÀ¸vW´‹¯Ç~öN]¤Q)„Þ*! =9>XéÒσ液Œlƒw‹ÙH²††!tFÁ»Îo[’è9°iÍ>< ›Hg4ìKQyˆ«c_åx÷™|¸^Ì¢§d› n#ž½nFÔÀR÷–ª–ÛòL_¡b#(¬Ô2Ü3‡êxe‘¬eg’Iþ·µª H^\îíxc—Éçr·fbî†7œ®ë¡JÏR˜Õ©ûܬGe5Ç»æ%=4ãï4’=b’—d:{,úÔ°ƒC;ðß·v`XOò “ ×Ù‡mM‰šEïa¾ûá;IpÆÐ9f«GÈÒíèr'ñ|V3§Ã#¼„zG~Oœ§=¼·ÇºPà+U3§_v…ßNŽòålá _ÈÏ“v²ÙçàÚÇ#©húI‡’É»!(¨¯9 ì>çÁ'%ã1ã=†’6 (Z%¬mŸñLJÅvã=sïäº(öd”óøâÚ. h?žLÿ´ßfÍì™fjåî‚~súÒéñ‰³{Z¥™tÚlðQx:c§Õ6º×Š®Ô¯Bào,“é—¶_2ä—•#󨮥6ø–s†1{ìÐd{òU‘T‡-^½YÉ(ð™ð ]“‡×“Æz3.<¿‰ö«ÖMGñöÀ¨éGwG4ʈóFïq§U¯y*–fÆóÞ="{Œ%NÆ‹f ³Š°óX>ʪfF8ܦQ ¡‹Jlìn@©vÍ©fš‰º\ëÈœZ–tØcçw Zú¢£ßoVöÁ\á†P¾9D8'ÏkÄïï×,®èê¿e#=ÑÕ*6 jGŸ÷X–‹jí·…_dV Íè”Ò€£UÏ?p6#YASÞµ`½öcŠõº –¹í©‰AéÆkR(+º®Žf/™žoþær¦n¼­×ì3î“W=«:F˜Eñ±`¸+/?áB”*mENZ¤–óË®™€6ó¬L0åZ·j‚ÆÙ[RÅݜ֎i†¾ç”®ŸÞ¼÷3d_ydÊ`‹piˆžÛ—YkÁ,|¥‡U4H^”j¹Ý“³G=[ §Ë›Ë5ù¶<¾ðHùˆ9´Îq$<žƒÙ˜P“Šh7¥òÕ„QQV®t0$Ëk˜'â~í'X¦+B-¦Ä­’¢“Ùçl†—£'Z‘PýŸŒŸº ÿid?­=º š*ÀR©¿T+xèf¶F{ÏþXâkÊ®^š^dsko @¯_:³üÜ%ZØ4Ötc¶èšMZôØJÊ¥êóP°²¸\±^õ/ÐÝP(Ø#+Òåºëm1¢Gl ²H‰ôŸ¬6’ÜÄ ›:MÜñ}eêÈ¿9JkáuÌéÇ Kþæ°‡aý¾Ü¼¨WÅŽ6j77k³Ÿ¡©À…˜=+ê ü„/N¾Üô—t Œ;Ô“A†øÃ€1–ü+‡@‡ÐO›ûL)r&ÜÃU°?™­g I½d€ø/±†ÖoMŒœé̪J¾d´Ë¦].‘$mör'a) ¾¡DŸw©Ø¬RË6«Ð༠:ȯêiËgBæ¦(˜+Œ™^2Äâˆ`#´½©RsÄd*^¿Ÿ˜U×3WvCÍ|+–lEÂÉÇŇ¢Ë• “Ånµ5°Svˆ~{m1)"cR•-É69ÂlðÀåB¢o •>Çt¡<¶UñþûTé"Ý[W³_¬<Ëo(B>ëOîñ2h³¬ÀÞŒu±e´|ÁRa,V=T°×¹ï~Ɖ2~ÍlÞÿlv]æFÖƒŠö­1®¸Ì”$X‰/»¸Hš½)`,®'lk–ÃÇÛ¼ò!b<-/]§‡Ø¤ÀÚ…\‘+ÝàÕWÐÕ‹»¼(BÛHU›ŒÅr©=#’¹éD½ñ@ÂíLêžåb]vf‘ÿ”ÜOéÏUrä‘©ı¸éÌaBåþn?ÙV}°Žã]å<¨•М éô=yBÍç|ËŒÛ|g«\MLÈtdÝŽ__mJG@S{í௅Á…˜•#õ-Édß8ƒüÜnã%ˆ¾§ŠŸ§¥}Yu@ð ú:ÕÞ¸ìB§züŒ¯NÑ ${VÍ{ØÛõ]üòé‘$ q‚»XÝL†Y Ž5‚ËÏ)™{CL«ú>¢i°Ÿûà…¤?nÖwI›ìªÖEñ+@»Ïº0=Àë)uøëD4Õã±·"|šºFvp^î­7aHˆg_³Z,v{6I‘Ò'Ÿ‰hh‚ÏnÉ n&Ù=^ò[¨iü©}A‚’Q5 .B=³áø:Ü7öŃ߿–ßXÜ”_yï{H;É´`~в—ËŸò,+ëÆüÔï ƒ Î+„7’´®äð¥—(ÿv˱ÎÃîQ$—ú9,ä}ß4‹@~}OjfC(<ôVðÐT2ûÜóöËyª’õ­ž^+|ïhóá ¸¬F.whdø(NÇêåLùSºœˆÁT÷W¨W\}¥‘ºÚÓ‡WŽZÔ*ŒXþ†HÛΜ–ǾÝJXèƒf[S?€òÅ”wî×jil EõÛ*°öñ­GϘÑD J^ìˆáÅby›ægSåG}ÛY Öì§™L§¢Ý¦ÈP;K«&É~28‡÷)¶Ç°èj·,Ê<«àìÓé\õ?Võž× tÙ2¯X-“{¹ÀdÁ™‚#‰J€æzÀ´ÝÈ>ÁéÛ&m—$MÉßë¸ËÎZÎÔf°E¿²hXc¾î±Šàä’ æú!õ½»ƒ0 oÆŸBgAnº>ü¦eiu@oƒüÙå {x颵8åâu+øÓ­»Íüèn]+.WîJgÕ4oŒþq ôV ˆþ[gyU 骵aé0r/'ïRÛrÚˆÒÌŒ¾ù]ëe‹§ÅÚÙäz™gÖ*7 ‚{ò|(Ë#‘¡†És ž×LÁEãŽá§ä‹‡‚uÇôÌb?¡| —Ð$KÊŠJ«îIPqÇiè=ÍásT¢¨9:%†ÇÄ€°Öó{‚©öÏ#R»RáÝìŒ]jšÁ#€£|·Î·R‘YúD®ñ¥& ]SGÝ-¢y÷'L©÷+(ªƒ Šù9aúÕJ™rK´_+BuÖ+éú ½Ò„~÷Õ­„Œ6qèvõó#0ß/‡‹Ž˜øW0}ÊÊØàÅ×>Å¿H ¶_m¼÷5bÔ;p¾ˆTcúŽç¹Oí,ñ‹Ì(oÖ{Ï¡î…q†Ê¸ð G‡Mž ôI”„èè(ÝÄO#ŠDć õ‘È奩©ÐÒyZuO&ÉÞ›W×µ+åpunÀ×Èùtj$ÅEŠÅ Á£€ã,•‰DùÆC1þÖAìBÂÞ=»r%¥Š¼¡9ÞÅ™^Y½ ªo°)R ·î6ñ 9’‘E>AE¿%%Û®:Èn‹zÉäügoûK#!éô¯Ð,éÙñ•IÕ7C"ÙÚÔp³#pQGØmM‰Â½¦ânkè1­_ôãöˆ·Ÿù2úr[¹:ÂÇÙ($còàš°Õ6{Ü„‚ÂÆzÔœ\y Æ(ÉzÝÌicï¾7k”5„ÇÍî¡XùÕe4yÏ”yÔ.­1 jE®àÙÌPû2ßFjÂ}¡˜›E‚G¨Îßõô•Âk#:É/ß5r¶pÿ½ bMKÙŒ'«-YéIÄDZ¥’è·1W‡7nÔxý¤“Õ¯{GŒ.I² 8VôîA(òN¢߬™O7N§TÄžú8s´%zhTTÊ‚:/Qýžˆw4~ÍDV6M;\ñ±«QÁ  ¬—v¥drÞäDwÉ~3 {E<„Íxð5xÙ½ÊößKYµch(ù$ ÃRo&$ÇXIdðñÃokÞhì*ÿ"kù:÷SÀ3Öô$YÏ·¯LË ­ÍàÈÅpÁã|»9 üw,#¾Öò"uƒEBÊr§´†,¢ög d“rÍïêKÅ$V؈ ¶áÔ~êN²#ú±ŸZê1ø9ÝaébÎZKò“u# æôÕ-TDyz8r–^Ì¢Qçl‘¢ÜÒÈÂÙÉf–cƒß¹~~ýâHÀõ¸Î\ÛÞÅÓr¤Ò^¨71KÙVyº²OìX?>q*³5s ·×(Ñy@"û$xÖ–‘º¼èš‚´ˆT'ìE\Ý«nëf“z¢À8ÿÈÚ” 0)vçòù&ü|“7‹B ã9˜¤Y‚Zóá•f)@‚a·LëÇ(™P2¬Ž'jUB%—^¯QŠ[pWOtúö|M¤€/¿ì{ÿûK|´h! $aqÂ~öh¼„ÐáðEÕ”Ä:—ˆ„ް…õÀŒ[Û½™X‘&ö‰ê’äë¢x&+QSƒP4è~ sSJ¹5/ä蹪Çþ´ä™.«CÏb¡~ÍÉœŸ8µQdÁ.Hh'-Wi¿E´…¶¯•r*š¯KÒ’i;ˆåc¹è3úô˜ºþ|Ï‚oIàÊbs'z¨hœdËzhTŒ®Ù#·s™#Ë(²Õñs’þÐ㢒@JÒhAIŽôU,G}Þ†o½3”qÇ´“s¦Ö5ÁáÊ Ê'ÄsK¤\d”Ÿ>ý¥ÝȘ¢ÓKèš›(ü)Ñ0'L\Mê)ÜÃDVf ¾0‰Uš3gÌ(®?ÆîuÑ*¤nªçÏÇ`aUû€Ú?odIUæköxkÓr‡µïOŒ£ûÚê:âr“¸¼ÓæÆ„hÜ¡;6CÑJÀc#]øBåâ6oØ´Ýx­¾†éÊ«GÈÙ<››V¾öq÷¯ùlô*ÿÝÄ[1ÝŒù.({tÏÂv}}%xÝ‹&½ÖÀbã××gx!}Ô€ÅùL‹+ÇžÔó6Ûõ&è…èì4ŠÊus}ùL Ý–¨üqÄë¹EþéÁ7ÒP¸èeÂöèŸR› âÆš´-—W©ªM”ts±³s?ÕÃxhdË".UþÄåX™Ná†Lppâ‹Ï=¦×÷ŸMQ–Ò¾æßTZ+,`€oê­À§°~dFÂYC}èÁ{3ÁJµ^¨}G“æû=4AÏb¶/bý=ÚåÊÀÈ–ºhh’P¿7F$C Ó·Œ§Ø‚}"lµäóèÅ)+§t ,>·×/ïîiß$FŽ™Ìî#_ê¶ò‰{GCb ³–¨‚$Ê]£C9?ƒýd,g ràH¶¿ÝFãn•¨RdÔfgçeL†|ŒA ÊV9á8ÎóÞ6mZ_7r?ؽöÉ*¼)Êf%æìånÔ6,lˆi‘¢Û´# E.§¬õÄ\ÔûÕú¦H%ÇxsÈqÔòÓ6|44t‹ß» GM. wÁM&W´‚ÓŽv¿n–i¯¡&Zé¸Ð`®´lühë°Þ·C-rÔ`vù³™‹ŠÕÒÍØÐ™1<9‹/ˆDu‹ê¼?©Š²ÙSÜÜ«x†ÊÆ4³ÍåL>ªå{âw±ƒÈ6 õ¬úÌzš›yÂz0 ÍBVV;x¶ó>Õn(‘ªlùtG&­ª(µ6-ÖVïåÞÜçmx[’T½·rûÈ_‘âE‰ÓÞ£Q‡n+¬ <òµgÅ‘ ÂÌI¦¸F“”]yúÏžˆÛ¼Žéð*l€Ovš3½÷LÓú$ÿ¹«Îcᮬ먶J´gü^ÈÌ;= ­…Ê5³Ì¢§3ª6ÓqäW/ÞE„w¥%LÒ“z²V/Ëëu1ìˆh”hGÁ¥î¿äô+ú—ïô£Òè®vÙ _ØÌKê ý¢§yâ2rù” "Q—D’Ÿ·W¢8Âòs‰ ZVÛé{¶sMü¢¥ì+fY™›;àù^Kʘûž\%›Æ®Sû k·ïfËõƺ)EÂè'¢Ášø¦5®ø¼mdQâ –FUgŠÎV¦éT¯lÊ‹JìÎÜxïaÅÂ6bÒò2ö”ªg}a,ÎÝ,Oé7§°P¶¡üFBy ·)Ë?+meîv·‘0>¿dkÜr¸ï`\Ï;î7{¡Ë)ªöÔ8|’Í„¡~©çuM;( <ÑvÙm0Ëe†SIo#ˆ,af%£Yî…Sïç‰ä˜Lâ>»hU—XÙ:NÆH2Q4K8AœO0ˆ½Òt®ÎÙJç{L+ÛÏQßq¯¬{’ÿX‡ØÔ"Z$úÁ k²âä‹Úþù%CÌf­¾=pûÇy`GÔÔ Th‚#ßt¶•F„Ì‘Jүܥä,Ýv¦òCW+J ÷w´¬± ÄÖlŠýC‹ª\Ô¨‚S³Í‰…Ÿò‹/£?m{oÓ,/yñ’ùÛ¦p-Ë'ˆ¾<Šdá¨l“=$)ËT¿­ìß“çS<ÝÐt3 ?~þ¬^_Ë•¯Hß'µdª™O‹pÏOAÓW×brÆPÇñ„^7“‹ãpieú&Žâºiæõx.v¾&Ôædž*“×ç‚+õ$©È‹œ¨6|•0Ð_Ê'†’<¤®§ª¯3-~BÁI0NÒ4àÇ­û]BçE»ÔuoéOD™³›.×Ô½¦cäK(ÆU—vñ- äREyJËJÁC„ŠSÝöÚ(Ô–eÀš{A…ù~ â9ûjYîV°z72ܪϭÏ}*à„z^˜äþîÇœ9ÎN¦ì1]Ž»úð¼­ì£þê(WzèVÚç¡…H¤€a`(\NdúË‘Ñg_}ksümÝ0þ©ÏMehnY¨VKžjšºL¥8È‹ÜS‘ýåoˆ*y®ÓcV9YX\x†;|ÔMÖ£¤¹O&ã{iN³E„ ÃÀõª§qf¿¼/¼t¬ûíþÜrŸ²•¯î°n!,A_™ec0×ÂÆ(ã>ðÉñu~éX)P U§$[Èž3Ö-~v@hǼaÔ4·)7ã {Õ¹ÃàÛ2[â‹3À'ÂÕÀ|ãßšt®Npµ7Vã5WÌ<’rÀ–¯`«ä5:öEvlöåÍ;›¬Rw„ò}- Iîä÷¨YYIÎ&ÎŽªj}÷ Š(>jÒY*>CåçO!‡éF¹ú¸›E¤Ö&ñÇ>>Æ0óãN*cÔàõµ5£qÕÏVQ^Ú·±SolÔˆ¦£é*¤êÆØNdµ5À˜˜á÷žhÇ?¡‘¢t ÕYèHê6'æ£D–Ôv|Íú +*ÆZè+;/é°y¦ÖaJÞ—’|£$DSv^¥Úœi®öÔÈÅŸñjzSâ¶äÓOâ4óVövÍq]àíÎùñ DΤïuöBßòÞhiÖ…'™V–çÎÜ×ÅS;ÒH‹_ÖëÄ}ò†ò®«xxI„¨è×’eÏeœN¿Ž>â3Ó¿.WqÑ;É”2²™nUŸ5ÑÛBñ+ŸÑ.ý’%†³k–4HZ/‚§]OqïMžšÕ¥û~|[‡§¶ 7S'¼nˆ6úîà:ºšø£3.7z¹oýõø0ñ ƒä ¸É™{ÁUñy‚V ¡‰Ùã“s•Î÷‰ê~CLaþ¾KÿYuË:^ƒ‹¾ F%w¿ÌŒkߪã½|ÑÂ6Ú5÷Þ‘-ïØRËc:î0ƒŠel+žM“¸Öá"k‘£¢²ubÁ‘¿'Àn£E©ó'óz,Óh÷ǽ½,|ã3ÓÅp õ™ƒŸD¾ŠÌ,•H?'Pž’X2<…·g¨P%ئœÙ'±–[ÉÈÓ¡©9®ÊÞQ.a sƒÜÔK§ø³\´ÜÆ*šý´ºTŠíy‡OGiS5g[;”„שn»ò·@¿qgѾ*¯Ë8ƒÊ_Qü×NßÍVÞa¶!}ËôÏãJ£+î°ö‹ˆÄ­ž°š›DÎ휵"jd ŒEÙXâŒÕ¡*0žyÛ•²Èaå.Ì Š€Än‘mc‰½å<¿+¼œDü4B*1¦ج´ŒWìzÃumv7B3wЦóNÎ×Ó»ͺ:T¨N‘ nX‚¬Ðp³Ø'X5š\41›µ aÐ×]}ü”ÿN…üÕ<³V7×ÿ¨Á3tÅGšÏu ¹³Ÿ¬0¬èýrͺOZМ(O¼1¨‘c>\÷ê"äȶã~Ýn®]ŽÕM€S»ú{à“á î“_s8œ$Ÿ01Ne4T¯FÈû¯¶šáæ"EÕøj.$Á`’*-±·ÝòïÊd}Ø×Ëòj„SÛ¤f‡c@ÏôÔnv†3Ä,”9¯`ôÊ\øB\´žÃ§×Í\LP÷q·Þ¸æ\¬‰k(´äöصˆ¥\(~jÞíN»ò¯Ípâ<¤°ÓT[ ±Á ëÆó\Ö26¬šÕ3™RZ·P_ ´o{¼eÅS¼)ì…+îÐ=[ÕÖøÑ”…ÄR¦SýÖ{[xNÓÑM¼ {}‡E¥UÏ•õ˜–© Ø“ÜÐ^ ¯n-k‡Ó6;˜Ât-¿ùJ óGÓ‚iÞé½ ³ŽbÓQïPDøq¡f@BFDth i˜i>ñN#Z°¬¡)Cñ[}¾ŒÔèiÎÃ_U;2È^/¢%” £ñ‰F/Pè`Óº¦ºÿ-ÔY?<"ê‰øÒÓÛSÀ¯wÏšRæaadǰ¹í¾NyhªGÂ"z,;ßrÍšI>…´¿!?d³áêmNÔÍWåéê¶U˜+ŸLamó‚‚›¦çNy3¾ŠãùÐ.æ>ñk6äØéĵÌ×ojÆ#_‡–üm¢°›bš€½² ±ŒdgûUަPÇöüQJD¾ç®vêXJ#1ªX.t_(žœÊW×Üv¨üÊê0·¤<§äIáRÙEŠÌ›_Âæ£AÁAÏËü[™Jg»R¼Ö/± ê’©.LMC>Àâ›BÞ.NÉ`þÎØ¸jòÐzÈqür½šYʨPKFúÏ’ç¯H39Sãð#¢…hµa¥yÒãóÆËÈ͸þþ‡Û4ËOg˜Úk䥩 U;|ì1© ñët?µa«ö‰ÐùBoWæ“Ã÷kg°áÊ¿xGd“ø±EŠW^®aÊ÷YÇ‚RÚÉd%û‰xD=(¨ôãœÝüãÉCen,Í]ŒHâ®–.Xë¾C¥¡è¢ÅL>ºÈ…µjÑÝhÅÅœ”ªãRUgÔšÆë‰ºÂôà3Ù·¥Æ ;Nµ]r;Õík “¸6 Û«GÆjíXC§ä¿' ²´è²4¾_­Zš(åÔU»BǨR±½oQóR‹d6üR¤¸ÜCΪ¾~Çõ È…ÛD[G1„pŸ”3Û# ®Ê_™«¬>Ÿ^Î)ja–_0ÿìØ™¥÷&ÚÅrœ6[™ [-èL_b0FÅ # Ûjú/¶?W€)» Ð2øÄhˆ:©ˆ¹¨0|YŒÝ4î6œ&öª½üäxÐß2Dqø𬺂;µ+ c(‚ãs™Á ^b«ü‰²¦ê¨披«0¤? ˜ÖxÖÒ$ÛGݶ½už;ÜêG«ßÊå1´Ê8ŽíZËEjÑ8øŒÖªKToùnžo´ºuï`m718÷RŽÕ™éžÁÀY5TŸ°4 ü޵o2¿v'ë“;\mUŽLf«…Óůîa$¯Ý,Ž :Þ¢àh„ŠÎvµ!eáXqø”EÀøÙ·×ºã]l×ýG,±|–ØóU´Å/Ù¾€^u½AsmËF4¬ˆ3)t0`™¿(ȼ=æɦ£_=4'¥˜à†¡‰2ýPƒÒ‘¸úŧN2LjmôŽáa§;$õAáép&¬|üõלiKKäf¥üo_µm¸Iùî¿„)DbwWãÕæŒðVŽN³ªáÙ*º¯/ÁScù¯ëå—dí|ˬÿe|¹¡üÞÞ7^ÒOT–š7³ƒ,å›&a¨Eí«!?ÂÈhÄÔ¯]¦É/˜=º»(³¦¨U«^—zàüR‘Xñ@¸"êJc¤^Šçíý„©tÓ—/+ª1@eà{í“ õiœb•îOXK2$ªÅ;>»DAE(¥vKA»(ŽX}ë­]–=‚Fy&ÃÁ…4àæ½ç2⤦­ì³_Æ7Òü£ÜD˜Ùõ—Ãä:´³$›°ÓÍŽ!:;ã´ X¹¬9¾Æ•NÖãÑ7zmÎ÷oÂÈ¿Åi Àø%}·Î W¾goËƒš¡·’Ö™}9ŠÝ—V¿°œ÷GÈÚFýxñ\?!v]ùäa8ýCäÙôúaû Ëû©gÉ ò|"¦ý³p2ÁÍé,Ðn­Ç´6Öæ¶âØà("]ÉkÑ ®H—ÂôhÅÕD(žy¨'„b‘Ïë".^ž0œ× SØôŸù—„þ‰Û~ýëªT¶Š¹¶ ,ðÎßÉ-k÷4•§}^Ú±§~¡´%/xÈÆQ˜KiWh÷BwËõ¶÷ èè‘"Ç5"óÎÕ\4Úe&}ç!®ÑáÒïeÊÈfß«à[.ÈÐGžæV¥Ç¶r~bÆ*/—Ú­›1ýz%pu*QV7Œt;­ôŸ£®Í šßwæã²Í[á1ôÏ$Iyጤì÷J#Ìb„uXî²Á/;¤ŽÊ"ÛÆš‹¯Ñx[óð&*Žkì1~iw̼ô<ítïy`°€Ó²2æäRæX7ØwXï»^ôhHŸTl6¤VM *æäŽ^é§kŠÈ†ÞÈ}`ë½MJXx/0œŒ%om™…#ž ¥øD GH™É´ƒbOâ× ã·ìh¦pž£’¦ŒËpú˜›ÅÄ¿·¨d?:K mo€'ØMwx”f½‘ÉïÁµt榖M?*BÔúVs.1ê+Üè½'ßürêîeÜãGêLj6NŒH¿ J`aÖÏþÒïDÒ]mŽurQD5n\N½`ÝO£*ŒŽ±èn†88%h6è=‡K;?L;Îó|ˆ*Iî.zÑš°ñ€Ë¾ÅíVÏØÔï4 ×uy_éü¤wnï#a íN2¢ëœi¢ýp¤Ú]…e0G¾þlÅÌ¢N,Ïlíe†Í/ Ê: ø¡<ƒÔÝÁ¥¬çéZ²¥?X~$Þj♂ñlQ‘GŒJýŠþÚ,mÂ2*œŠFÌÈYÒ}fíVýeaÇ‚´¹¯Á4°O5À20Ä ÇU22ãd5bæ@8ÂÒb 8¹Ã{«ªxÅŠxL÷ª³åsÞ}¿7g˜D©;ñýˆÏë±ÛüêV4¯¯¸[/É&²„%7²ãM ò°‚”M(í¹¨±Ú[Ãh’ÂŒc0£}¥·£J”WdóYú7Z•íCi¤¯UFâ>ư²’ú0òúžu™½’ŽQ‡„À!-œý{¾qÇÕ~Éhx;ƒ )gŸãè<„¼%ªÐÊ"SÒ¥ <ñ}k¼á®Âi|©Òp¸¨g]¬jgŒü!„,ë4át.*>½Ä.áðÍy®ßÄXè»I!IáB6¿º–ÅüÍÔ',lf¤¾û³‰bº„çToÂ~9¾íV[(ÍŒU• 4Ø¿¦q ~ž¨Fɠ˥J€£¥ùo •#Ë1DÍ–ÆÌ‹ë` ý[m;8³ñy­´L`TŸŒ¯²¯VÚ|<é(p± XS1[‰ŠÄ´sðŒSy…ãäìV¥ŒÖˆ¿3=}z@¸ÖA»³¹x¾ ¿ëËödDs¹íj:í¼W†R:¡[üÎå6Î%2<ü¥˜v”áIÄCtÁªyâׯeT¦õ†¤.ÍÇb š4,êé6y&ôôñÈà+e’'¦ <1‘VÜÆ³PáE ö§"ùt¡°"“¯'^/ˆ 6¾ðcör5j#zNÇ Œ~Îd 9ä ÚéÜpÞ u›É;é!kë~~¬ÅxtîEçâé1(ïI?ȲWšJ»¶l(£&åʽZõˆ!s¼.I0òtg=C“UøÅ|æt•ú8Ù»zûÄy+˜ [|*š3YïzÏ2`=l”¥©8­×…<Æ£¾º#º]B6x­¤Ô€ñì-û¶> Ì>ÃÊÔјa(„z§.ôײ„äJ´nÒ›íëwüáEÎËÔ€]r dâKádž°§ý|Q#ø­ÕzÍ ó‚òÕÙ­xÆ÷e0i0‘ðÑÊ'ák§ÁÁ³rlïãg¡Ùmç›I]Üéy»ýlb£P¿awVƒSÝ4X†·˜ËgßªÄØ\õµC=Õb_+˜N™p‰;]xl’cá œ`Zß.þü…\K+RéÃ)P!LuM£FöܵôíÎÎAgØÛt˜úK‡âW›¨ÑÚÛ×[­ <]¿í“FëOsùê&¾…Ào°ìÞ›“@x|êuî½á9@ýÍz/päÄþ*ö b°Ùjc¤ÞðÈîૉ\Kêøw휄œû¶ü,ŠÖK9˜tádDèYµ`¦Yqë)ï¯VÌ-1Âíâì»{7“h”ocöφ\¸*ü±Ï-Æåɧ‰ŒÔX š ÁÖÍOH d÷C Í$z=F%^øÅWö]|ÞZ¬@‰QJÍ«85åÝ3ƒ×„:ù ~K,òt¸†KIáÏ,B Û—RW´ïï?йÛ*&sm€Å:f+rC¬ê²¼;Ga±Ú¸ÙÄ>1^¤´ôžqU¦4BK˜Ž†ÃˆV&ëó ô¢ç¬¹„#Äø&nÒ” PãB[[HT£Ý1&qõ*[µ’•±fv1‹(´”¿® ðg&ïÆ@%¨‡b& Žñi3>3Úö ´äˆÂHP‹ÿºnaëöA-±üŒž&Cj`d¡,c‘œ¨… _v:öq‡Ýw*ÏAçи¸ëš&äAMs–ˆ|1v¨nDF·úËqsìƒò;X1ÊdY§Ðj³G>J~¼yGFÑÖQ“{l9¼R§ÂˆÙðKæ™ø»Oo°FL„N“½‘¼‰'Ñ0üÀX£‚¿~e3 (Ý*á]„ŽóÌÚ6ã|D6˜º©±Ó”û fÊó=7ɧߴ~¿w²}U×pD/…‰âݺŽ1ÁñìdŸ÷ºzdr\ÖS‡ § ˜0æSžs–˜^êŸRó¿ñ3»a»UOµ(1R»¾s=$âù”(Kª©o7ÙÓà™¥hPòVª½ŠÂȃG‰ž'ýµyù\…¥™ÂÛ w\°…‹\\z /Ï—’C ¡òZ‚25t$9Ø~¶§FýF9CéG†u•-iV·K´û–q÷#òW+ ¹ªïOð©Éû:Ô¼Ýë±¹Œ¶;Ò~ŒQ†%.Ði”%?ÇãNÀ¯´ÈwrO[à½+?¨¢j_{W˜òúíÑJÊ5"µŒ¿øªçþ¯¯)y‡¼ûyżç|þ,ËKïUÊì`Ý´^K‡çF;n5©}žó_^¹Ó¸x¸ûM,÷%]±»ÇÀÄÿ"TdBüKç ¼©×@x Ù+o Ý€k¸áñ;ãz(Aï\‘–\t+C9CצŠI{bãä&\«JtØä|r¾aˆê¾^^嚄ک%¸*p#˜u4/ç†Yîg#oþÏùå×ûú‚:åœËßlœ÷I:_ÕѰð É»ªÖ6}MÔùùvˆKÙ U?3Ÿâîéëfåf±êáRð´ê•WTnGaÎÏŸ8’âæïÕÜ¥ûôµ°…ܯëg^|­eO¢é>ÉäUÝú®?rtÊ'LCÎ.y–Ñë,\1ž“Öç^á¡Ä¤>æÆæÂ’’~ÑzxÀ¨¾yÍðèöí“Í]mUÀ¨`ûhÊFHÓfûao¥L™|á¯6ÔŸ|ß8—Eבã¶ù~Hв‡rf‘k¯-Ó®"+ï`0gùD€^øpx˜J Ó‚}ú¸B^šw=4ÏŽ.ûÃù ˜½ÛÖÈó ¥ w,/]µ‘§l ¬nMè$lìø©35f±”ݨ¢î¬ŠÙ‘®‡–8ÈeÉ–l=K ½óAˆbž‹ÃÁÅš•HBü•‰Ò$†Ó%<€q¹Çl¶î_ƒîß3£|bn˜ux8g³ïÖ,”Ú¬UQ5‘¹ êßa*¥~Œý ›1…+þòî–ö3RJÙ.ì•ÂÌy’"b!bú$z5H¿[]QusjX&V¼³«ƒ…ÁWG )/™„ûü΃çì×4ƒS»·¡Wñ«Äjš™ßIP+3<ŽÛ?‰×ó‡Si–I+5wÖÿ0¦ÅØ(Ò›ÖcZM¬ùÈK'_:æø'aÆÄ?RÝĬ8Òøf»¦½]T‡R&eGÆZêûUÔ¡€é%ûg5¯´…TóF½ÞkÖÔ… …è²Ã ÷—vùd,5nÞê;DÁj«R áÜx†ÚçÔêëZñ‹;¶;ª¥85ïá·ÈuÚàlïö¹á2 E“U¨(føàK„“’„$t ŠGw:¿G$U‚~ÔWCd˜#h)L:r³ž0sïEJ ‘t„7Žÿþ¨æCNî{&w7Ã\î Jð¯­r)ÔzIÐQ}«Áø°”óƒ"/! endstream endobj 94 0 obj << /Length1 1549 /Length2 8928 /Length3 0 /Length 9950 /Filter /FlateDecode >> stream xÚ´TÔß.L7Òˆ0" ÒÒÝ !5ÀCÌC§tH—HHw§H7HKw·tJ^üç9çûÖºwÍZ¿ÙÏ›ûÙûy7Í+U7bfP4{ÃÎÂ&PÒ”cg°±q²°±q`ÐÐh‚a6 ¿í4ï@Ž`(Dà?"$@@Ø“M{ T‚BòN6vN;;¯€ƒÿï@¨ƒ@è 6(±ä¡#ÔÎÍla {êó÷@oÊ`çççeþ# f r›!% ÌdûÔÑhЀš‚A0·ÿ*A/d ƒÙ °²º¸¸°mY " Ì0Ì r98ƒÌ¿)”¶ ¿¨±`Ð4-ÁŽ:4 æ0 ðd°›‚ ŽO)N3à©;@CN b‚ü¬øg3à¯Ã°³°ÿSî¯ìß…À?’¦¦P[; Ä ±˜ƒm@iE˜+Œ„˜ýÚ8BŸòÎ@° Ðä)à­Òbjàÿø9š:€í`Ž,Ž`›ßY—y:f)ˆ™ÔÖ9büÞŸ$Ødútîn¬]®5êñø™ƒ!fæ¿i˜9Ù±jAÀöN 9É¿bžLÿÚ,@07d¹šZ²þn éfúÃÉþÛüÄÁËÃj0¢ò›ƒžþ0<Î ÌÁ äåñŸŽÿFìì3°) `²C0þ­þd™ÿ‰Ÿîßì xÏö$?vÛïß?+ƒ'…™A!6nÿ†ÿqŬbZêJšbLQþÇ).ux¼áä¼áàf°³spxŸ^ÿ]çŸø›ýVU ø¯ÝýGE9ˆ9Àÿ'‰§Óû›ˆó_Ê ÿklÿÝAú¤g€þ_ùë³q³™>}ØÿŸ‡à”ÿ?íÿ®ò•ÿÿîHÚÉÆæ?ýŸÿ?ÐlãöWÄ“ž`O³¡}šÈÿ†jƒþh%ØÉö½r0àÓŒˆA,žtþ†‹…ëO;ØQì 2SÃL-ÿÔÒß—ñÔà ©BÁ¿ß§,6¶ÿñ=ž©õÓÛâøte¸@O“õß}¥ ¦P³ß#ÈÁÍ:8Ý0žð„¸ìO³jrýCâVö”xâè0‡:`ü¾Xî'Uý6ýxy¬Jÿ þ'üñXMÿAìlœV‹ÿ€\VË ×SUK7;˧§åß>«Í¿Àj÷ð)ßá?àSÇ?à±5urpxzþåÓQüÿx}@ W)ÆìÔT0Àª* éºBì…Ë›Ía.ìžÓ°s4í )Rçm5? ¡_gœÙá3bm[á¿Vð÷9 ë­uˆÙ¬ —=“ÈgkšÍMÖ™=Gñ…oö8¶Z[õŒ9!fÄG_Õû\Îߎ3I–Åv]°ì´qõ­)mBá¨îøEšq¨†¿ç|–#ÞØ|ü¾a| Øà1 Z!„Äý®ò'ø1%Ñ&íX;é1ð¥Vå yLf±×H¦}„¡)sàÛ’êžï£eÑ0yÖª¢®jç êøêsp5õI•ÊGŒ¬Ï”_ÞͪňîÃ-î qÀ—pò9åÀ {áW9ygW5Á­Q”®g'ò_´nvV¾R.@5g1Á?ï+^'óiÄ–¡Ǫß/ü¹ñ!s‚J2ûþÜÍ—¢dP.Y_¹š±eçX-cþ€‘P°K†‹ —Ÿ”MžzxwRÇ™ŒQû£cľ*ÒÃ,¤ ÝRçAK,—¥HÉ«ÓûƒÁÃU)Ù}[¶³Us'áÂ*/AÔ÷y×íËÕÏ(†“Š–¥ey·r0b/Ü— 1ÔuBÚ–mf1Õºkõ‹ãŸÊnB_~¥ÕõÑí sÜ05W*S¡qsËÞÊ–¥a4lGÆsÁ’¥›+LÁ‘ö‡'s,ÁÖ“KÚŒ‚T%¸opX.zf`ΣŽwáÉ[TLÔôܓϫåÄÁ`ʵšÿ5|ø¹•WÌh7õ¯/]˜Ø½­—f…£ïV Êê ³u DŽó?Ær § X X¼P³øœ³ D…)¯$öñS5¼Î…—d<¡î-jJÅ_ssÓÏð«ÀåHáz¸QE§©‰¹œ³žŒå3Ș§’¾}Ά«ãááˆÕðÅuxÍQˆŽÉtfpÐÒýÝ™¸$¨êãòþLWûÃ;a,­gÏù¼‡7V#ó§×\ÁTȾÜÛ‚/ψ[­fÖåý˜®g i¯Â·‹òÜbY …ÐÆö¾ï'º1y¥;?¹Ïߨ¢V…2œÀúnÒ¬zµ m±ƒéA|{¨ü—6)­¿Üɑ߹܅]šØE>%cC! “Y¹¢sïÅé¥NNž–u6Ç” ífÌ:Éòu¡‘¦E¾âþLÓ=Ò¹©;¿è‘a͸Û]%½`I&GåÂÁÞùà›™koÞÒçݸ†öJóiÕ¦ÙÞ·¤Œ‰)¤›Oêl‰Ö¹P„ƒ®“·Ž!Z"7G²h¾½§kÓ!õOb!IJ+"±Ô¸Ô ‚AK²¥Å»W¯%"Þ[“=G-3_dÀÐŒ«’’ ò¹ ~J‘s’"ô‡ŠJ¿°ÀçNnwä/ЉªyöÊ÷|TFסÓz*s pôåLq£­ûš°™/ÎR`ßê%=UrÓ”<˜ÏšœåúÐæ ¼ÇÓÆ/«°šµøzá³ ]2=‡ªú*äj¼râÃF¿KânÆwE ;aõc*ç›qG?·@¢)nxÐú€d~<%ïV*td¨Šs.éYn^yÂu[w„ò[¡¯s©Hã+36 ü] ÷ÊÑH«C?ƒ ¼`Ãç±yŽÚ½n,ì¿ÐÖáè@Y騶·áô öð•šaäQ,Ú–{zv¤™lýöâ9§ˆ«  a0…Nꈊ”ÈS¸û~¹Ýâ\ð›H‘ƒª¶¸i]–¡ ›‡Ö÷¥&üß¿.ýRV/thD£aS [9êeYoŠüiÂ×¥™•,áƬJätÀ‰DC…ÑÒ“ÂŽ?Ô5ó ïÜÐOA OnÞ½¡àËì†ù¯Õ*Çmb¸VºÂdi°‹ -Çw“\RI!(œ‹QÙá«VDç‰q¿SL$® S’Ý´«T0ç-ÎÓ~û̆ŽhõŠ^¬ Ç/Ÿã[Y«Pv/ûûÆb#UbÏE ßÏÜ~ïAë*ÕÕK.è¯<£ýí`ÜŸäk›xDègɹÎ)1Ág¸gÅýËóC|×ZÜïŒÆŸía¶1잃P„m¿¯Þ|÷x¼ÿÊ>kR€-™ÇÿÜk@Ú8qªµ”íÊt»~’¥¾àß&wbWãÖtç¶ÅUk˜ÙŸ>‚ÎÁaØjiòïx"Ws’E °;nZŽ““ý,â¦z=íê‡V%5Õ‘¦Á6ýöa—¼ËFÖ3ç·V_…‡WŒÞå^¹t*ÿøŠà%½`¦#ˆÖó=ìÐ%¼wëh˜æP©À´3ÃgŸ5ëüÄÄ„ÂG‰(%…Ã~©ØÜOÍ/2·Ý‰ ²C¨ˆ3 e ¢s‰ØÆD+1dÔ&ÈŠV䦆„BëNnÃV_>KˆÇ±9ä e¨¡Üù3ÍÔ^µX¤Ã?ò˜lű¯¾¥š\ο:’4¿~µ²,ì[¨6¸.pwGߊþ>¬Ó»@/ÂÑ™ÂÊ'ù{œu±*¦ù:ë1Iµ0ÊÎÙe´‘EF]{‚ûe–æ3õ»Â1~<«¡Ãy½åÚó¨GÜ—>Ük-Ëõù°€É5ûÁ²ƒÙä2֦׫‡9ièžùêß~!Ü+Âãbî<ï1 t–³Ü¡îÁ¡çÎtãáÛããƒîá°\ç<«(ê ÍÔø®Ò‡%æ,*žŸ±Ü8‰°ÞóÎÚQØÆÙdi$¯ß³ª¯S¿ÙˆÆãøGAµ-­;¹*QêEÅ3í›wÍ7`-±ˆ£wÙL‹pã±Ô}’^±XM2w;i asEOœÓà 7<ÍPÊø²¾¨~wAÎ9ãÅ!9žBS5“cc¦¤{‡ãI7rÁCÝSû®OKK覀ˆÄÇîF“ujö+­ÎcäDîbæ¼f$ó[Mÿ@A—ḃ«Â Ò/‡Eî}Mãù+Ä#{î É+4ÄEëXSa÷Þã àÆ/YãIcê牗\]x78#á+ø²³2†©¬t04íGíû±ïwÛÃNäÜŒ&݈¨$üwÊkýˆ5´å^sõ¯ÓÑ0¦xo‚„·ƒY=oj%ru8R}'´‰Û^¹ˆ%ý|aÝ×O§©$ôVcÌ/ ¢¬ÙZ•Ïœ´¸AD´xç¬4p°© Çá«ÀZ»ºÝªÐª-²ü2‚:ib¶?lzæ RQC›»CZx‰!´çÕëi>xgÿÌPÜ„EeŠ‘rÙ”ÂW‚‹²Ì‚´|äÔ¸y}-±»ÖHd3¡·FÏ¿×,–c¬¾ TÊXæv‡= (Ù%Ö‚{šåC¦g* ö]À¶í;Šù™—«¦yJõcÖ"±²r¥Ä|Gr£òJ£Û=Ýc8ÖÂÙcÙ4óÐ8#|,ªÀUø)îh&~©Ñøš]¨ƒ_û¶$jŽ#UÞUO”_cŸþ€³ø%,tüv¥šC‘«Ç°±e2‚`Á·BÈØv\üií2OÈ­ÞußlóN³>8“ÞõÞÑ lõu×l5òšnÑeÚ3xG'}º)yh¤Ò>í—Ø",*½¾ò*e†Cý!ÎÐ{åæõ°é¤¦¦È»D0Ûx*°›‡Ë4Íʼn‰j¹–íüyë#F³ûó+ì#—)^»¨Ž”ßj…3ôgr§ ãxÆpOľ:t'”‚ïWDù.øGMÇÜÉrUàx(·40VsûUŠX»½|?RùÜ3äêEdSvæi‘çöFÏÑ…v§±î8wsé…Q;²ú]Ÿñ)‚T‰“lO–ì‘bψÙ#ò@³9 ê„~;nOŸ Ø¨Ú–À«C9š/²{ avóé çš"ṙÿ.ÐíªœR›ö|×_AÈñú-Ñ æB_w7Hæ î&¨ªYÌÝ™^{&ÒØ3DpÍ,½9s30—5º7T~æ&«‹ÌºøšŠbòö別pÀ·°íÕH Ø%Ô5=žô¥‡Ï–›Äù"–„‰gøh I)&n}c²`åz/u{\|ÎFڣ¾ûió§ y ­û¢v›cö@üˆ™d2šŽì ~ª¾Ù|Z¬U‹§ë äžÎ×B䣠’Sn«N¨¿(Çm&Rñæµx«;Ͻ‘ÀD6ÖÁ¿öuº>Ž­¿¦Éšïí³»Ðò~¬ÀË ægö‰býq ’û¡ »\ÊâENh§mën0œQw»’†¾üxªÜÈDÑŽÁرò Ö›…÷6‹´©Û„dø¡êÞQÚ.⯲Ïc¯n!=|LrÜ.º²Î UÍ‚ZT½Ÿ(ÏýW>*“’´/ ã7s¦,2.¢t]{è¥ýÔ≂2)Ò - ßW\Òi«ûýñœ¼Ší+üÚ ˜ÕÖ*¤ËEÕ[dl©È­× à²ÍtQ7,·»}×Qs­çŠÑQÚxjW9oq‚´Þð”æwg¾1ÉW÷$ÀŽ_i›“ºôÖÛŠ)6ù*®ž¯7 ÞëMêŽ)Ϋœäå\¹É—¨Å1·©Â#rÀQ éô6YÒI «PT ’>K=¤|¬&ƒ¼G h‹‰âåX'X@¶ öûIÈ!Å–☂"UèJ6kEsðuL÷ »ãHAû>–ý4%b)q;“U×ö¶%ƒ…߇ûô—‹P§ó©¢çC²Ÿ\¹“–QÔ iAWg)ékTÙö3Á½# [ÙdÒºZNÉÆ’¬¶qÏFèo‘'$=ºæ*I?ŽÁm¤ûà‰<“ß“n1íšS–$’8^šBSî:ƯÔ%T… Œ”ëáó‰ñÄÇ+è)Y¾H´•º’±ÓIŸÈ¸\Ï0l$ÛpzùœfDÛŠÙTU¦¿î—”‘&’úØB’÷`^äòÂÄ@ÄÓøñŽüó`¿´ã¶ÌUäÜDšÇ†ûhq“]Ôä cîçcPSC2»Í” á—kµDVÊXÆ&kv/‘z¬ÂüO8µ·ÚÔŸ#ÝŠœ?He<3 4Ö¯ÏàaÜX«iNß½èsùÞ)50}$æ/Nt´Ö,ËVãáXàcXõÃ`‰$µ–"‡sÀÞÚL9M^Ï\|ÿóÒÖïw{Kóºl`d&|s‹È(‘KÆÁvõ©ÈÀ\°¼$ã€L}Ø$í»Û“æÇ`Hòk^ÂPbîôÖ™ÈáW)yª‡7Â}ÞFáÔð4˪D[z‹éDä*u)8<ÜÕ:‚¢¯_Õiعkñ@Ûsîå@¢9” †õº”PÆ&•õ°3/b£†Ø´Ãô²0}…«EšE//¡r'«X˜R™ß¼w¯ÿ÷  ‡¶qÏüÿ7N÷73dY¸EѾþró‘çÂU„‰t?TKD­/܆ ‰^!ùy…,ïæ&Äh¾x‹ž5mß´»v •Ë»Ô$S Ïxÿf4­;TÕfŒ S$‹»ùh}M¦Zá5œ>"ȧðÂäΔ[Ý\$êaz³ÍWxwºu¼2“´–Í(&ÎRðñ|z‘븧¡(ø/ø*Óü1Õ?B¸÷t9oÎ$®z™]Ý9·±EEeò¢Ñðkz.Å•%»>éÒÅ"§Éfzu†w6N?¼'|Hª2ªœ¶¬ÔÒG(© ùêÜû‚ Ÿ7“ZÈ~w N´jÇŠpÝ÷I&–g‹Œ2ŠóÞZòY˜}ÉÑ¢êä„vW;¥17&ï'0­ÐدóHã…pD=ïUy9çueE"D,û£ÓϘ=ŸF’«ä^zc¥Ó¤öP¿ç`^kdb(XÕáÑí¼x1*ÎPAd®„’¾)±ê»d Ê˜Ùó|i2Õ€ª”¹ð”÷|›²Ä4?¥Ð~zßaá™™¡cI’UŽ6;9f›Å»w3ý1Q:tùÐ&7c@= _x—O$ý©Áø!smF'†Û/¯ ÃL c¡« %%ª5ÃgçH+(^Ρ@‰uDØØ]ºb­Àž).Ë6XT£«VÉLd»}œ„&y?ˆµMni–ˆîŒs9³«cMÃGN;SFe¹bÊâäë´­õErûõ¥Ïh‡5þðg».OÇÕ º[4’ x  +‘€sÀc‘i¬5°ô èLQ0à7 Ò+ÖŽÀ8ñž‘ÛýÀù÷;?ñì…\%" É+Ó¿´Ó¿¤ JZÖçK,_1ßnßAãñQØ8ÍÈDôÙ„=¸oˆ)3ªœ}a^k 0ç?gçRCGVÆÞ¥,Ø<ŽFZ ¤ÑÆ— {@º"Óè¯Å#á¢6i;3EAªV#2b´îø&éžœV»4³E]L}kv0þ1üESù9€NÁEË[Ø!èƒÞÛ@ë‘°ÖÏÏ*Þ»õˆÃÈ”r•$æ vÅ1çBšuaÄ©"šÉÒ–ì"ÌFYWò¤Üq¯9T_Ö$iÕψžOû“|áËÈ뻾ÊH IN¶ìF¾dþB×ܱþV±AG¸æC‘›‡}PÑÑ ЕØ{8¯IpÁ¡}"Qé…0†1qI&Ç$zc¾*»Ú"ž©ù¾æ,Šª¬óXYa«ê™|ÇECë=ï”ßÕ¾d›S+ý%ÛÇXb*­aͯèÜðŽt£ÒìCÜKÁ©y% ®ÔjÝM/âÁ›¶¤jôF~i¹3·pº³…,šç¾eŸqôÝj\sâÏìò9â]´šQ2Ê–~€´¸4©WIò„Ô‰þßLr ˜/²Kå¿ÆÒ›ëímúÅ%`~B’!FHDûc(œªµ^D äœÖ F6‘ »cÿÌzçUL’9£î¯é.X‰ÉTéuM~æe9üÌý“.åë©´eÙ£B•¯´ËÖ£ZŠFãÞÞ«ÏX¶w>ˆÅfFhJXÈœà2E·¯@¢WÓïâüÖøoäÐ RÞ“e0‡Ò fEïµy?ÛÌ9/•’kqtD¡tò˜3ˆ¸mÒ´«"ð—ÆánÕÞyy¤5îilú%©‚ZýúWÂó dZ(-¦~"§GÛ¡îDvàŒv Þ€ï²Q@çìð'£kT(žnÃð\MYó`©6†ÇOžÌ™$†£ÛìJŽI;<ŸM’á#–æÕqßëÎÔQ DäqÝ…1StÎÊJûhã/bU5v"OÁ«_sUtœJðXpëÑ÷ÆMœkÑ£9: šR.ËDZÓÖHª¹I fçÙǨû[eâÒW 稭…‡ïæVA9oäûkùïø •&?cÝF²[QKi\Ë€S­Ø³eò*.W‚(6Ä©ò¦¦<–îl+ œ|ŽBVC,\>B C³A4p¸‹áz<Ë¥Lóâ†fQtQ](&?­¾<ÖKÆ/I­™ºXÏÔtÞ¾y»ªººI›É‡‹ø³ '5Ú WT„<×¢)ó¬u‹CÜBZÙ ×G5èà‚Â1ùö=Òð·ÖC”™[\7À5—¼Ò¬2Ĩ†Œe½µ‡d¿ ±-²}•Ûÿæ¦"n¹‹ÔÛ!³Ò´Ž®¶FæuákñQ…ß6lué{ }L²T]e_°DËea5UÏž^Hº …°Þ¾Ö/ÉZÓYâyKâQ¼–W—G}ÒŠ5Cá]V¾Mõ;Ë„<0•Ï”AHUßÜ{Å»ýw{CÙbu]ÙðUÐvóæÝ„^L ¨c}ßx%ÕÜ©9àÚPLî®üÒñaQ"çäˆÏJ€ð‹x"÷4Vù©ÖΡ‡òy7T¥EŒ|ZLM³Æ}ûqaï2|°$ßvhòÁNe7WudÝåÝAVE¢ÙØàâ›ä¶?ñ¡˜CS X2[D#=Ⱦ€¢?2>¯¢;ÿÆÌùª¹3q$Þ‡(q€æ\Õ’n0Fµž+3¾CÂ.‘kC¸¹A‡´$žX cU<¼Wªi¨Úí›mïˆb‹1–˜Yöuv±³Éo‹Í‰¢ÆoQZí åFêPÏädV/T6Ûu’aIx$žgÜ#oaX.\Ê5œkFA^ò:«»šbm' ý°˜òãðæ"ŒaTØìN]Ô«4!æÎ®Ç%¾ä§È³@4ãˆ×OaËY`øy9ߎWÝPN/À6š´æ© |[×îªÓoÏÖº]-*E&2 IùŽ5‰v ååxQtÿ„-îÀ‹¬¤ó—w]ê2}¬[7¨ÔNh‹f¿æ:—ô,¥¬¿ïÅßÛ‡GBT¢ÑݘI²Š‘ç¢zГαG…ìjûÌ^çmÏ*ð¿%à~½”C‰ÚXJ¾uÓ¥“€ô Þ ô1¸Û·I|ÌBöÜ1÷¥UÄÔPüôþÂmœJ`·ÉkÖaƒÁT›ñå»GsäU[Ϻ`…æFg”<>ÙÐ+ÍÍÌ¡¨otIÙØ«e9­šF)XízD‰›Te‹›Ëú±oü“À€Ø’kà†˜¦Œ2¼uN=–„žs2FD5$P@Pý  ç¼2?ü ë0Þ½lUÊ[¢Y³z⨵G`Ë=xã„Mìâó6FÀObµñR†Q¹ò÷³Ôßñ´’‡‹-¾ôÒ³€JfŽ8¿fïUú¡‰Þúóƒ¾OŠü1/]Ù)5ú˜Ç©AéÄgX¶^¥dãú®¼p‚g^S|»l¦¿ÍH¹Pu~º:¾¡à®bjãZ½íßäðšHß3Ç÷+Šc»îúF™èŠ(ãÒ£ÚÛŽë÷HlúêbM XàR#\=$ž¸¤o3÷¦k¢7 ‡`-9§óZÇPÛ|k¾;2ÃJ'áXùÏ‘éü_uUФŽ_éÆE7.òõC¨îÛÿh£aS0Ó.õÍin¾«Tkk¯Ö®´CŠ4ÎÚ'%í¦#+å«Å¨‚B¬’í=»ñ+²ŽˆDX¢ {ö|æDn¾Ús§"†.d‘šM‹¾´DrFf²<]!{ÞwWÑYŸ®Io­†å4Nå&oNƒ³ë BÚ5ïnÚ¾;QüñyœÞLO‡>?ã£àôôÓ“—b‹së%nµcB9!ïÿqj4 endstream endobj 96 0 obj << /Length1 2116 /Length2 14116 /Length3 0 /Length 15394 /Filter /FlateDecode >> stream xÚõPèÒ ãÁ%Øàî.Á݃»0Øàî\ƒw nÁÝ݃'hp—ݳgwÏ÷ÿU÷ÖT1ó´?ýv7Td*jL¢æ`S ØÞ…‰™• ®¨®ÎÆ `eå`feeG¢¢R¹Øÿ+G¢Ò:9ƒÀöüÿ²wš¸¼É$L\Þ Áö9W[€›Ÿ‡Ÿ•ÀÎÊÊ÷_C°?@ÂÄ dPdÈíÎHTâ`O'¥•Ë[žÿþКÑØøøxÿtˆÚ@f&öE+ Ý[F3[€Ø tñüŸ´‚V..ü,,îîîÌ&vÎÌ`'K!:F€;ÈÅ   t:¹ÍP(™Øÿ¢ÆŒDP·9ÿG¡¶pq7qÞ¶ 3 ½ó›‹«½9Ð ð– &«PvÚÿÇXá?Œ€¿š`cfû;Ü_ÞÙÿélbf¶s0±÷Ù[,@¶@€²”³‹‡ #ÀÄÞüC[g𛿉› ÈÖÄôÍàÏÒMR¢&o ÿâçlærpqfvÙþÁ‘å0om–´7ÛÙí]œ‘þ¨Oä4{ë»'Ë_kcv·÷þ/²Ù›[üAÃÜÕEÃäè ”•øËæM„ôÌèàbeeåå`@3+–?¨{:ÿT²ý!~ãàëívX¼Ñú‚,€o_HÞÎ&n@€‹“+Ð×ûߊÿEHlls™ Àh ²Gú'ú›hñüöþN €ëÛø±XÿøüýËàmÂÌÁö¶žÿ˜ÿùÄ,JZʪºj Qþ[)&öx3q˜Ø98\<n>n€ïÿFù›ÿ¹ÿ)U1ýUÛ¿âÉÚ[€|ÿ¡ðÖ»ÿÒpûk.hÿZ:ÀÿfP¿M3@ûÏðë³r±š½ýaûÿ¼ºüÿ›ü?¢ü¿ÿÿ­HÊÕÖöO=í þô&v [Ï¿,Þ¦ÙÕåm3ÁoûaÿMµ€ÿYgE 9ÈÕîÿje]LÞ6DÔÞÒöïF‚œ¥@@s‹™ÕŸóßgx‹n ²ª€AÜ+ëÿѽ­œ™ÍÛMq~{¬?UÀ·úߌ’öf`ó?V‹`âädâ‰Äú6_ì\\o¶·5zü9Úf{°Ë› à/Àì„ôÇ“rsXDÿýñX$þA|É¿€Eñôf©ô7â{Ó™üƒÞt¦#6vÎ7hâôší ;™˜ÙßN±…Ë?rŽ¿åÿ™š¿ou˜ýï­K,æCî7¶µýW¶·õaþ ßúÂüŸ€Üè]ߦív‹Å?.o¥X€Üþã5Øõß9ÞL,ÿßHZý 9ߺjåé`õvRÿ±x“þßšôïüoíþo[Íò/×[{í߯á_ú7àÒ½9ƒÿGýV®Ã?ê·`o×ßþÚÍÉö—ô›ÍñFÄÑì47ýWyloÒ‘g{ãâüOy  Û¿Èr½™;¿]µÞÞàŸow€ÅÅÊ ø¯þ¾•èâþ—Ãe×Á·n¹ý ¾vÿׄ½Åóü‡Ø›­Ðé?ÁþgYÌ\ÞøºüyÏÞ6é¿øÏZ@ Ð iel&b]òíþ«(¡;ÓÞä‡9ª=­4:&ï§×G4øºš¬ M§[Ñ”‘^ôï»’´7"«¤¿½OZàÃÛ’>¶?ù<%¨Îìµ#-OãNžˆÖ#1©‹ìûüvôÑ ´n…ì’£ÊutåESÉǺwï—ö¨(_[Üû¸_Ã-ü\>Ë£­X2O•gúeŸÎ…‰óÂãÝüÍífÎÔ+©\’ïi G‘·î{ìÂ×z¥:»s7%.>1ô æø µ·Øág9¼%ïÒâèÍKÙ¬tÌ›ã¤>c]d?ùõd1ñXmVø¤Ç)}ÛëYµûP³öÔŒèëNЖð,ÜÝ¥¤ó•[Šû ÷‡Ãï"œÌÝâà•<½÷·W`ntNnäO~ÖMéyêYì "íà|o[—øîè‹­GôkŸ·Û§Ð:³Œ²Ö»ÏzêÔaÎcßC­c°BòÌ ¾0%ý:VaFÕHÂM-§>b _»)¢~ÞÁª”Ƴãåþ çϼqÝ4^ù'/ww¢FOÛä©bY.SÌfRk³„Ÿº8•Ph鑌I<9…‹#åòµü÷"rkæÕ"3íR§Šáw=FåyOæ– u'š…N"aæu¿„›ø·4§jE*Ý`GÊpé°¬î êÖ æ…$AâJNéMRçÆÈ"÷r.ÜÝ¢Fÿ€ûüßÊÁÆ¢9BI¯*‹ WìydôªFªWØR5]¾¬ÞàÓD¼ ÚœJPK÷뻸ʢ7å;zãD}I+_)üÒÆuçzt—=G=†k¢ëÂk‡µ¨%ôæŽ 2©1÷ÚÈùˆÚCU||;6»úfLn­™~OÆä®ŽÉ6®ÛïÇߺÇÌ)6ÏÑ{ص,àîëT§b ~GevÚêŒw°ðf•èöá©8È9ú"`pÌRÓiå35Í|_¢* ³1òU~Ú.ËöÖð;µÖ÷¼¨õ!o’æü‹ßvRýï×Ï+ˆ¿4¤v®.¤pÄKÉûÉâ†ñˆàªóˆ~W|RVA‹dˆ]–e…i×f øÖ%Þgcï[èhßH.¹V~+àjwX‹“ýV¼©À}.ËåqøØÃÉj)“>¿ÀyáªwŠê®ÓÑ÷9#{ï û7=—éÙ‘ÑÏ«Ñ YÂV¿Ò#[L³¶_èWˆ¡(Ì‹Œ#)*¡(¡™ŸøÑɃr/ËèbË|4fÎËN¢-ðà*°$ ]îÑçÍS{Kr?TffqM\óg l*<³æé¡:‰¼¦âî` cÐ@ÎDŒ©³@L;F¼×ø>-uT{ßÊ–ì"94Û¼ž/‚:“€ÇFÐWP'e¨*ü™éKÊ—«ÞbGÜxÃ,²§h(z6K÷»öîŠ_¢?·„‡ÄN(¾Ñ‹$Öñ—ÐjÑì3B‡C¼ˆ H—£09%Ž«ç…¥,àê€`Þ…ˆ1Ú|.= F÷Ÿ¬$Ït½l_ÑÙz,3>˜14&h M©š£³K$F–§y'¿3‡J#”ƒ‘%¹¥¢Äȯxè©Æ!Í®Š&­Ÿ³%Ìt±`ˆ«C°vxã/…Ëìh•Ö{§C˜sõddR^ê>¾¢T­á0Qb\Uõk'C‘¯î‡¶œå¬©;ÙN*Êø7çþÀQõÙdˆ*‰nhÓ ~-G2Ð`ž{{’ñëaa |4Í^¯ñ–•!\/Šºzœl…½Ì' í¦|ŒŽ‰Ä«Ø»¾\cÌõÛÅÝÀ´€Û¥uM)‰CÄ&í˜ ¶ÖýÛŠO¹]3•¥,§Ê°êHTÆÔ§DÞ!´øòüÌâ§  y¾ü.™&,·ÉçyN#.’ˆ½¸Ü•¶çÈŒ~Æ_Ù%æ;¶\4¦c¦ëŽŒŸen™ÊI_y¶•”ìïtû¥¯`á]'Hš‡j“¡:õX>Í›³@C1ÃúÑ÷w|ÆÜnë|7ÚÄv¸kDb;«ó¿ ‡8¥ý|î-ú~ÚYq—ØX€’Ý8æK€îƒy•… Yj8»ZBû´ÊÖå–£©ý¼,jO¦ slÃõáx:S'ïD²â~6æƒWŠÿ%ÌM¼&Jèµ+S»sd,¼#¯LÖ]ñâ5˜7ÔW ÉLÇ[ šåbÌ: >^9NF¨®B öÂ6Þ'óyñ¯2¡¯ž0?Ð@އ§cv‘%²rLXz‰ ¡g…Îu< h« ¨:QÂÒ@à$ŽÛây×À§ìÒ¤ÇásÁåÄ }Ýê0¸üò´Ì ¿™¢•Fä(¡0Ðñ-ÖûûOã:ì¤as÷dBŸ¥Ti¹W/–æ¬CšN]ÊO+éËŠ“…¼1…[±qƒºèã±…‚<›Þ5 }wštTX˜Û‡6£ß9‚CNÓÕÁ…Ïâö¾œBͺ¯NÃ_½Ûðz4t_ù$Ës祫·]8ùV…¶ŒÁŽ,A…Û~Gh;ŸãÔB}²,øH—*…»µ/™]‡Å<,¤M%Ÿ™ÝµžBÓÁŒÝˆxEb 66òÞð|––ÏŒ¶G>ÔßfñчMè æ)o?w¹Q|o:åÑ85;òŸèk‚¯€ i†Â·oQz7>ÉqP¬µ1Xñ_ºòªù¥,MÉŽïuõ'F”§ô;Ú™Þ—ÍMÔÒ@ÔÞîHò*¯Ñ4°r¯Q²O¥™î ‘—Xá~°H³n€(ézçÖˆIÐãó¡©püù$N äë¼NwèùYÖ"Þ§#õbK±[¬•>ßRÇr5Âä˜z½È«°£“VÑË=¹“݉¥—aP¼S I^y aÂõPIxÏü$òQÕ7yZ¯TãÚÉ!70”Ëáüx¦#|» R†æb“$‹rª´ÜzLêô?9ɲbfLi“…fL&Îü’x»k*–359ü¼Äëó}Mz*{cý\_ MÉ~pÎŒ=b³ÆƒT{;—L˜ g£õó:® Iß®0UëÌ]ŠeH¤ZPÏ+#8ê Ý´¢K}”8E¶fz Eé?Uáv»ñr-Œ1 FŒ@y4˜ ®;­aR;u¡¢ÉžÃaÆÄ­¶ a ¢²©«™Ãþ‚ÀßÓ¡< 5¦+ì­º™éÇ_â‡Ä=ëJÁ0@¾WÅ4˜–’­V·ñ¸È´¶4Í–I2G`¦åGêÙ9¯È"bŽž†J¥*tpì*ÿ%„ë_)dxäåÁ¸êm˜8afà”¹Ã ®nkl½ÉÞ¨t‘IRÿ.þ{j ¢,0í¸hÀû@‰íÙÒ,VpB ðþ`ÑÝTIIº𥿠¦z BÃ|,t1wÎÇ͇Tò2kjÏ(y â’ö›ð_îmÉŽÙ£ˆçÍ+ˆ0!#w L½hº†ù÷¦L´DÊÓ…8ñ~Cs¹n~#Q¿z¬J’‰Àä-ÕÙnƵoÁšžò~®e |÷íþ!ÛåuÖWåù4Ù¥'¿DΣ>…wixN•hm›Oß{ÔØuýU'‚´±äÕQ+GODÜs(O¯þ‚“}P˜’iãñKÔÔUúï\©*›Ê:äzØ«Neë®ÔŽ÷Õ›«û ðZÀ÷ ÓÎeŠ š©Qtå÷iŸ¯{¶àËå.u4/Ç2yN»Ùz~ÙSÈ)°á c)6 c‘dš–ŒìA#:ïlµ0kžžËqjè¨A´´õ‹9OMàÒ©‘Ÿú¨¶wipbŽ$Q`ϵ ã¼ôtógð˜åj§-jÜF“hÝußò‡òHÅ3t_NÛ”éä=‘‡š.#eÙÍV‚Ì)ïxC/O&s§ |T ¼ŽqÒGL¹Í™ÅËû¥¹î»µ/e»49ï ½¼ ZOL‹æÌlTLü!–‘Xój{ûî‹'¼weçªÈBPÕƒ[¢TË)ç‹H‚JOYrÅ Ow©%Óàx{êÓ‡žÝ5î²N9S—Wû³¶@Åá:Æ›­ôÀe†Ç_Š …ôÍ_üÚ»½¾· nxjì‹O‹„¥ê„æH´mÚ¹~ ›ä~òU>"dV7mÔÅXhõËÀ0âˆÔÌo8#È…k äT="#Æ-¬›n<¾ØFCC-‡É¥ÆjõPwá´úhéÒ>„OË( Žˆì‡Oò˜+÷ì†8jE…™$\Ô|¯ÂËæwÆ£‚w#¡'W‡#Ió+ò™ü#a²»Ã¤u&NÒ‚•6Û]½ÍMé4lƒa±ã;Á)ÚókÿÇ.énä /ºQ¼É¤!2!©¢y*ƒm…:¹7 ˆû«‘›“¦òn~d¼Ü烜 r«àMK–tö¼¯J3?ç4Ø…¯,Åϰ?V`S8 ùêÈÂËë= D0vÎ݉¦«ªŒ“«؀ï´Ô!÷’ ãQ·NŒ#\&•#U3lÇãnÕ½éõYÕ‘'H¨†ÅV÷r•rQê„aY“S^¾(\4$k7Ô¢®np«á®‡:nËââôKX¨24›}PA½:W¬i'ð¿dÌOÛÙEd¬ HVÕ(÷dÉøT©%õ~­ oPÜ wÁw•\Ü7”ì|ín|Wn{€vSGø¾ ¾+½ QãFÃ}ˆÜ¿žõt‘q@ ˆé¨[¢§ÁÀ­ÂÕúâªç©›¤MFEäTLAYàdÎ[æ·Ï¿\h1¸$³å±Ó‰.¢yo–ÞŸïš/}ÍM¨(õR¡ÿ8V–ª¶¤ºgNOz`«ôo9ÎËz$¼ ʽÃÕh ŸˆuŸ£È¨Ë®ï4Ëá¦ÿÇË_õ®¿vò‘.id•`òÛw„G°­Ë/ÓéFcO2æê²›òD1‡fˆ§òwÚ˸©e¦“Åùíœ`}úxœê0¯¥¨øÃ¯äœ^š7h+,¥ {ûêýj<7~9÷|R‰‹p£I€lW¤ñó´dÐ.‚Ÿ’ qb(_P»+Èlßyâ‡\€;’™®OS6,¥ø°Þ (r xŒU »SVG‡‹¤3Nà]™Çõén^—™ÁÀˆ•KÎ8ãÒ¡q`™é]Z›p…&M‰Ç J/ýö.âPd»_”➸ø¯üOÕÉ7¬³äN„Ι“jâÕûPzg=GQžôæŸæ ɘŠÙ(¿r)$o(b`È2 ½à.$ËžA°…›SdaÊñQ§ËÆA‡RÔ¦,c7›ÌèÛÅ0 J«p¾KiÙ›‡)úN©ê¸¦›ª@7U¹e˜ Y*Úpé‚ûÁëØ?ˆJsêƒg-ràýð6J÷ Í?/7žLD0æ çV¦íZÚŒ@Iòb5 C§å,›D(±;À•¼;˜Ü9bgA—>ºŒ!Ò²èõ‹ìúˆoB˜8qï.hß †hµ0B}Š„€Pƽýôñô“Žq鱜‘X͉Uɼãå/ ™ÀóÕÔa}—‚â]åÐùA¦iWr±¢Svß~F#ÜBè¾`I|őسã“ ÚéH,ŒqQAóXönRíq,»¨©ß¿fZT·ŽŠÑ3ÚÔm4:µ#ª.xIæ*¬)¥Qâu§AÏ Éï9JÝ2W~^æ¿dRì+0¥ƒk\o‡rW;9Œ¹:?/#7uÞ9 1ö¿×µ%î+ÍäØïNÓÕZ.ƒŸŠq¾>Pžª>4¿æ4¾|¯|„­É¡Þ‘ã7³.ç(²`GRJläçPFu#ôÇ®æûÐ5n’8‡?ìýø¨8ÖÙtKí«°oïú¥Ø¿ˆs-GSo|‹9ß(Ôô¸”Òå¶"ží˜¹Éwdqh®Çlæ¹ÆûG… `¦ÛéÝ÷–MÜq¯Å_á‚È—Ÿ‡§ Ö!øÆà6ðɳLƒ\šÒGÓ(=¦Ëó4OZŸñ{gç… ÖwY¡³1nüIU Å›µè‰uÅG3#•³ÕOXëLâðÚ‚&»ÛàöÔBj¹&Sî˜|y>!Ìâ®0õdÒãµÈŠWÇy³ ·†‰F¦mêöÿ@9Tóëæò÷wd8Óq"ŒtôvÇE§Œ8%ë\…£•¨ãð>F¿ßšZ¯L÷°<ÂcãPIþ8nbVˆ8Mj¾Öz<”íØ;/!ÞKþ[ÑÂíUÔ*ª5Z?æ)ß“ÉÒ Ñå°?¥ XVuT¬¸ýr¶ºÑQžuŠÛf¯”**Wœãr–ÆJÀ¯Á)µ-ÎŽS‚”Ü7|\ ¸–Öž1Ô¨ðï—AºŠOÛ\¦ûÑÄT9£ã—Ì2‘Âä<í‚òŸ¶Ú¨œ–ѬÅ"ôMá—Ä˱J¦Ð-j¾ŠÞ}U,7øšCöJü ­›\ÈfI_×±7Fï§[})¢ÇýÇrUâ.p°ì$*\T9Û|œ© úB cF€Ü²æ¡EV4ëΉKy;Îê„q¿#s"j¤ú?n÷a.âÇh=/[O%È-–É÷ù®žÃDâ)V¡“§Ûžï$/ß+äjEÐ:»ÕÄqìæsè›îa"Œõzɱ»†ežRÄÍÎ «ëù‰)kO®«'øjîrùÔökúóñ++&÷’«>ÿÐî œ¶. ?ƒÑð8P¾¯ƒ•Î/ì*ò&5ó„CãV™¨ö/R½IÏ ¸`é•¶ŽðîO^GÀ*Tµç§fðâØ {&¬ãª«ª8ÏFñgB%ÎEég«P5 r2™4>À5™Tâ]uE%s­ãâ'\¼Ü‘£; ¬¼W®?°»Iâ-À4¡á%™ôˆ°êî,g2UÁ]Š©Å0Ët»²0µÅ7kUÈO|c¦ ûlˆÈŠb”£Ë‚Ïœ8Q°t¯ü˜‚ƒ¾èÉkäç¾0ISR‰ LöÁà'hã‰(¯h ï7ëÌ"ã÷ô¦ôÉIYxRrômœy/¹u)Ëöω´ÀÝ&!JL³"çEÑ„yÊFðœøV#4”cüYä[B¾•ª˜—´Ñžký´Fï"ÈH¡Y@õ'üA(·4;zé®’Ú¯ë$gNëø9þPÜÓí ²(J᳤«Îç‘Õ¤fÂAO×üU«.êù•Nëákê“e53’)÷õÈÄüÑ^´ï»ÝØòd;íUü“õ4 s«ƒ5«Œ*l»ÑÚ€¸ŸC… ‘¼C¢T€‰ãø,˜¹ÜWÏFHÊÇ}TÕi_{~h.Hëèh¾â²Ë30ÒŠ,;ÜR?‚qͺ$‘°õ^/©Òüa˜QR¿(®ò뇟M•NWøøplÃØAìT&¦ßÐ ã$D³Ÿ `٠ؕÔ?æ÷xð2ãN̹¯Ê§iÐÝ‚‹Ù~(N+›Yn)¶sB´ ˆ·¸L5zÉm*»|g2òM,ÓðL¸B(d•5!Lwû˵l»_Æ(èô½<Òï°é\ÚÝM.‹¥¢‹)6ûŠüèh­PÙWç'me§èZ’ì‘E°ßÀWV爻.SähÚ&j’óÕóª¤\ëÂâVHÊ dÓž×.„tÖÚ ?|Oo%êQ½„¿cè@ß~t£5PÚ{ò¬Š–*†%…ïhÃî3^G9Ì…MþÚ—âÆ¢>ŽžBt½/_þÚc(Í"ƒUhF«Eö„V²`–…ãñ¡Åœõþ-7ýÓ—Ÿµ$aÃ;Ä÷²,R˜íÌBÎ%Ù4B‘ö 5üþÚNèÚ·ŒM¢ˆG¡§'Ã+T"Î%­‹ËÁÖ~mmœÉ – Ì…C«ér·ÁŸ;‹Ÿ÷Q_öüÇâ |ÝÈ­~O™óÿÜ„ G޶Q6˜DéüþþPŠ!€äŽ}O9zÔ"¯ä€ôÅ/ºbü½¬¹¬›ö| Ð@¶wþ«çöBú—ßQá0S^òm•Œs–HI$PÏÞG¥™…lsª·µ\q…ü¼é?ñÆq½î°ía_`äIî™™’Qªúž4Qyƒƒ¦øUêH|šj¢NG6Aì©?K6o8™öïç<â]øœ"ëkóº£Ï<`™&è²O’&üºbîüÇ" óGrèò™²3fxNµ„BÊêApÍgHÎ ñænæf-TœåþmâcП²K?>r—Ûã›ö+pp¬Ê¸@%ÀúÒèiaü¶!÷<©,R¼Uı,ù¡%ïKÊ[Ó$DÐÊX.Ë@ * †_´þ&Ò8̽·¬l…@ûbi°z3"o€nL·ÄK}ÞÁŸÚXK/° §H?‘¡Ö™’ýå]é\Dæ¶NÉY°û‡n¼õO©MR£«Þ×,Ë­ÅÊíðéî„)k–Äò«Žæ¯­&“¨ÙJ$‹š¸*GG ’:¼Ql&‡ìèÁ§•ºåÏw*ξ%íï °!S®ô×wôÄgÚ¨@¨Ý ß¼˜,‡#ÄœÑzK­Ýb¤ÚîZ$_“ù@]<˜g…ì]Ó¡$´‰Dß\î?\¨•Æ­X¼§Äƒ!‡ÂƤø¦‹&3¬z¦”Ç’ÖHºi(<<`»rS4ü·r´yrk¦öáÓ‚çDâ˜Sh Ud?_ Ðx³ ¨©‚üY?Õÿl:/ÛÓ§-[«Ì955­0 ˜JóñÃCþÚ~›².{ëQËfÊÀÝ[»_œ3wË'ê Y1Â#žHJÜèðû`œÄÇHÕÁE†{mJá|ÞSCíàƒ©èÖ‚|3¡°Âè™àj|$Žg˜ã€¦ž0u¿)6DÉ`Lò|/y¯u´NªÉrüô`ªÐ·'u2}ly ?]ÞZ¬×^ij‹‘d÷^ìPcÉ}]µœ]ϰ22íS@̬Ä[ ê¿úÎBñ³Q-æ!Ëq¥–gQ²™®=ðÝ"ãTü®»± ë’g<àVàÂægû £w›+i® 7ÌÙʆ€ËC|þ°ZeN½òª/Âëu8ªݮ9‹¾]Ù­ª0yÑäÚ7¯¤]™'yq<³HAÛŽ³]šëÙ7ÛFžÊÔú½ÝÿÀÍ<<’Ô¹ÿhC ~)¿¤wD'ùá”BчOÄÀ!÷ÕRÑ•)6^ÿ$W2 ¼—Ú±9×u‰pLŠ}X¡È>ýuI¿ŸÉmA]±F<šG%ð€˜6£$¼¼ï”Ë‚9nMsçW°ÈÑ ¦=Ò„ë ë ¼wǦÍ}ü ˜_¤Æ‹Á©„ŒveÔ9»~ZQFåßb*ÝD§iK'{  h“ëLûyùÚÎU†1š5¤]ՊЖŠ” Ï+TŠC"Xtk¾r™(®x¥Q5!@`»…‹k}ý²Èq ˜u­Û¦PaÏÎýjƒ an˜}ÔDèØ‰8KI_êí™Y݆¹øiôó[6ɯTÂ<t¶Þ0É÷<+´A-R#©ÄèGÀzIùáS?)s{0÷ÓwŸHw9SÿÞ–„Á‚™3ÏòÆü«éšî6s~¶ºzßÂÒ›<:¿neЩ-é0o’Š—°Ë4QüDï±Ú~¤œ¥ýÏ/gmy§æÓð™íƳ~rв»" oƈ+&|ÐbUzªÒ &{äÌŠi÷¥Žû¦f­DZYòò+fó}‡;MÖÈÇ^µÏ¿1›$öGÖÓWr•±„8î’\ŸÐFçï¯NèŽÓ•F¬Ðžò±ò©¨{mÏÇŠÖJ}E™ü«§~ñUrkˆS .æ­ŸøŠiƒÙJ›¯Ôæð9E“ð»ñýðׯf[x¾¼TÃO87Ûɬú…IΘËB}blåüøåiÉÍæm½ß$)Ø?ZØ/ZÈ1p¼RᘞH6ȹ@¹AѦÝoðZ‘ЇpaX¢[/Ýäg± ¡cìWÌ‹Õá~>khÑó¸ø<|ç‹RKp£=•J„9ö¢óŒVù­” §¨ÿSÌ¢½èHbJ—Û›è*½éÙçÓn=²çµzg<’oU¤ œ™;ùΞbÈœ:‰m ÇfoßúTœòŽä÷Á¨ÒIäìK«c|”}“•UdõÔÌÃ+fEAÜþß, {]¢ˆÌ÷”OZíÐóÓ)ÚCܸI3p¨l8¸ž½ô'QèœÞ”lpÒˆÛ¾6=Õ®5—^Aíà ŒHÜ}¿N—ÝÑàcâÂÁŠbºFê©`ë*„ 5WG†á8ûÊý£ôxŠ.œ#Ôóåi¶”,+ueé CxêL ¬ÖóüeAJ´yï(U±LnpЃ­}yæ­ÍÁ; åj)™óÁY×â ‚µÛ1â+Üïi¼üdÃËШVg3f×: qÂò*D¶œN:×dšÐ—ù:õ|N%kþ1`ç²Q{Ÿ#û’ \J˜#m–¨kj ƒØ¸Ö½a+èî×™uƒ˜”:ÁU¶íWỌ?9ŠÜȃÍ®hçôózënþþ{Ê©4WÏ(B”IVµ±¾Gu­šC¨V›Y*ô3…ÛróËè\vb'Œ÷Ñ*¶SB’âjÇÕ>}#µÂ†1ÀÙ¸±Yÿ28w-¬á ®õ¬ˆ©Ä”é*WK\‰ ÂÕ-øeß±ëÔ`¼?bŠ5­cˆ…®à+y ë…rkP£ƒ_²©Ÿ@.ؾò}Î:å+Ó¢x óVŸ NãO6a}‘¡îj 83vn*?nÿKÏI7m¼Š¨®?¯aÖ¢õïñtB“ʦ*MØRÛ2Ò WÆÎÖRòugOÞÚhtËN?Ñì&‘3¨z¡…e;óD”š¸en@è®i‡­|  u•8—²OÝ­jìÝßRÕ—æÍ½È±]ª‘¢­ãŽI ’ºÂ‹Ê5 )3ÀúUðwT¡OzbFœ÷©æä¾žŸ"~ é*é®FlF^;*L‰É¤íE¹?Ÿ¥`ˆ._ZŠ9¢ý’ûzä!“]×çå×Eù a…Óf ½ýc^ˆÙ¦œ5xtøG†ÿ'š{ìlp×µ€Ž”AJ%üívbî¸3ELχ3ú£ /£ѰM_‰W ‘$Ôn0¢¡ëÌ ìËØS‰÷d_Oâî²ás]ÓR¿»ô©¿ä°ßžp.ƒœ*Þ½Ôtn°Ê®¦Q(ùŒ8½ÿqàjvó´=QK‰Ë …™³L.„íŸ6åKie¸‡Ÿ ¯b^pîw”‹:;l=õS{F¥‰%Ýàµ"þdÚƒÒy§D‡‹S÷o/ø]™9 ¹Ÿ‘ ”qcÎD$ú¢/B÷ðÿ°ruF€eèÊõuÇ‹C—ºWhâ•éj'ò ƒ¨·6{ˆé?ùýñN×%6àî/ Y–W±/úhYSªCü“;ºkå¶^FZSV S)Q$¡gàŽ èØÈÒ°"”RG§„ŽÚX¬v:žØB—ê,ÇÜ<Ü^áÁŠŒ}ŒΩôÉ÷½P ½7‰º\ò)JÌÜÖ•_¸9pîÖú'ª3à6MU¼xZ`eBly|J3:bêÄ“r¿·sõ¹¢A3wÑ ´þTIJöä÷‘—‘óªMçç!ë/†Hk¡·K³¼­Øù€9À¡Zª½YœõzòBF†ß› `äiˆˆ€¸c§Ù‰Á¯·’|Щ½Ë´~î%Q~ÙÑçE­{׬‹Z¸kyqÓ`ÅõLãd§ìs©åA†‚€gÕ0E?kB‚t¹Rµ¹åÖÚN”äSà©ãööHÝuÿå/¢ÉÁ㎫…··24ìßl´r©oˆˆªº~iRö)†>ü Þ×Ô¡â…¹mžùcv_ãØM})ïìÍG€î·Õ%[Dþ>ò{ÕºˆºZ†+<}ÁÙfèßkµ¯Á" /!Ù½“ç­#£ºË¦$ÐÉü}¯&½„;2…ãVð°ie×@ƒ þ›±ZÌF•d§_TÇtߺßIá¾è&qÞj)ÂÊ%§ìdÙØ{Òâg¢zĈчÃ\K$ew9>k̪84™Ç­X_Ñ—Üû,h¤ð¡žù~z¬T‘G.aGî ¢[Êçs&jÈ7`Йuܼž–&¯;›”ÕY‹½ðš!R¸l0Zw55XiP?zʶ ÞU«Ô$³û‰škXØáGsϘ?‹PÊéS î©úÓsÀ × #õL¢nVðNãwK :&w¡Áœ ãÒËãÌyᯂ:Ðcbiò°ÿLW[ñƒÞ¯Åæ¶ßBõs…¥{ÑP¾-5[#‡îÞQùÁöW¬F»´#%V:>éG;‡ƒÉ, ×Ú>tY‰¦ª´Ã•|†÷¦iÛ®–M‚ªÖ¯kÄw÷ŽC‹nâš*ƒã×áP³.[ÖZ'”Û¹`¿b¹' 0¶ÊGàp&·Ƽ"Ia¯çs3ML‰øÆ;!ßa*³ž Ø±ßxL¬çШã”X¶BMòâr»#ƒ#ù=¨Ïß¡0ný©ZJ±p”}ÍúF“ךW2³–rCÐN4‡* m¸gwaáYø´{“4-5N3ýÏc¡7QAùî1.üvÑpz€Q>ÈÓ":‹Ã;âäÚ®.u ¬k W|«SºÐ6° ,|xüyG1 æ ‘ŠÎï̺ @@›_Gßן]»`Õ'Ðö&üPto1cîh×ïR|@Á‰Œ„k£‡‚¤Ms›ðœ‘Ðc~Däµ&ñÚæùe(B³?G¯]Ã?â4B"Ý^¥`s‚e› ÈMÖHzý‹án~eG¼ý©; ±ˆ O¨eWÂå`…¬ŠÙ¯! œ‚¤4¨I›|ª¿K8X€(Õ[C†õeÞØB?jæWªôþ‹È~βZ»šf«(’.ÁðâOÄ“”þõ‡6~%œ“×uŒ|©Ú!ž”jšX'#;­ñàB2)qBcÂÎåžodÁQ^kI>–¦vøGßÜøs+Lð›(s¯¹èN.PžÕéÖªwç2x©ëÀì0…“Ý-ÓLÍÕj‡‘ÉVp‹Å[7ÄwW;߆šßác8±@G3•Òw-ª¨¹ZÈLwÕ?òzÉTêLXØmrÓ8¨B ÅŽÚ}/«…3IÐcѶÒ|5r¼@{?®ìèÝVÇ`—5iqŸZ…ŽìH¼Ø*q‚}¯$|b2G1ÎÈÝ¢pƒj¾u…-ZÊ‘¼HMprUªn˜xµchélÐõ„^sUŽÿZ¯¸|­,k$á´¬¿œRÚ£á~¬žWéó©\U'¬ô«QM _K¦7®îi³Ú2ÒÉ ’FœydVÎ|¶a@âe0"n¶¯óò‹ [IÞœ¹Î†[ë·V‡,ãéCV…j¾¼—`§Ù©ù•>FœfrDø³xÜ áâ¥L¼ñ}⯱BwL/4]ÙÕ fi™|½8Q{ŸEÂ(a|æcyÒ‚eTÜó_Φüh¸-&["ÑJâÊ%ÒPkµíÒÖì~Ç—n$’p©/¦ê‰m^¬uUÉÆ>Áy¦û]$7½œ‰;†|‡öøT©ê òìŽ5/D÷Šžûúµûq>ÞãÿX€½Üa]£Çîëî%zÿ%sðù%cx?¦ÎŽÊU+ªe"½—ucQÏ|¦eûÇñƒJ¾MÅ¡»ê1ÕÄdÄ{`(§ÃâüªSÝÎï £””1’%3Ì÷ë_| T'‹ý…|½sÓô>úÃ1²S.ðœúÚÈOn'GsôÕì¼iÒ:ÀÉP¦è›„á‡=0ûë¸>ÄÇÎÆµ/$hIC„^þc×Ù-RLÈg¢æ'4¡+«‘¨Äµï6»˜ ¼q‚ ©igxúW Â¾ÖàuîÁò”ˆo×¢þŽæ4B+~£ò§o_^ÛJt"%´IˆaM¶S?÷2Bb Žk’~ýáñ«áôÂi_¼´˜…=(pË¡òŠ­\k e‚ Ì‹¤b5VÝ/'@™=¸Y7b®½Î —ýÜMök,<{V.¤ÌÇ›²ÃÍwaRv™ƒùùê9‡žæuna Âòå¯LxôcŸ_¼üSÐf? ú2Ü~®ÿ´¢‘fÿ G˰Ä嫹xçAÍw‡‡™=iäOÿŒ”‹_¶êh_¶œjÞÙ꬞DäÞg×q–‹•N±Ð—ñ¸@¬yí˜Ýzôà s/ÐÕ#fU’”©)Áèªï—ôQeܧÉ6Núh,M·½¶ñ±‰º‘sŽD¦äCÇÙM^“ÎŒ”Uٶܹãmí“pÕè[®¼ÄäêB܆×â 7“DúÞTŠ9õ#÷™²š©¨ô5]÷$þ“I\"§(üC¾Ñí}iyú¿¢®W7ÐÝ?–K·ê”ÉhŒ(Fî/’ÄÂÊGML%â¸È†ݘ®ó‚Ù9xº]¤-kçl Ð%ÚY¯´!Êëx‡Iuéfú‰4ø” :‡…°8ã55ÛʾïªÆ3V¦²ò/ó»7„7»Èè)ö,ŒbGÜÃìÆÝ“ýýÂeÁÛPªèœ†Õ›M1þ ?v\ŒK$éÄTžëtnöG—‡Ããp´ž1‡&‡÷Ìn–jŒSÌ^¬Öjs´$ذŸv#È£õî+–6A*ߨ¿_aîyíGoˆrzËýÔ—ª²>kǧOŒ÷Nåe¸EˆQ^'zbg´Æ×Ü¢ÓÔIèe•ŸlþÊüEÝ惶üW½™î™]ÊwËôÕ«‡Ó á"Ós¥—TŠô•|êú³UÒ)QdqÃ[øBPp•œy"^K¤Ú òM9²aÉ4–'N±/&Åq‚qáa3©ÇJ{›î˜às!g-lÅ{ÕÙõ¾‡\¹u¥4u㶡ˆç ¸j%›°Pb¬}bÈZû˜;§n³Ÿ3–†Ž‰’¨‘쩅 ”¤J²á“)Ûº­m—ìÑ,Ú”f!Ìð3;}áýr±{éáÜ¥¬«ÎF9i¥×m;¹þŽÐÓk’—Çîk¾ ¶Ó4¤¼ÑŒð{{å€Hå­g¯î4 zÒûêÐß}|åPs`Þîɯ]‡ÔßÏCo¬Þ»'êIvqеÌ„{}=ÆùU,îùb_ªhÊ GtÌ®“‡jÁšâ…6 ^ yq6¥°„hÇ-¯t÷TNù­r{¦ßzŠº:è·ð`8º¬o½Î?çÒ!@–R±€¢0s!/,ŒX±êXTz€«ßˆöZ ´òÈk¼T4_Z\ÉZåƒ%$íÌ(hmOèfØ×ëV_ËŠú–µS.s¯ hâì-Ÿ7ÞÅðy|¡Àܬeª½òˆÖ9$–Ê4y³ëÆE˜ùaY$íØß°` 0ë£PªR½3:ÇûL§¬ÚŽás§Ï5±5ïªðаœàAKPy†Åôu\𽳏`¤¢Öý ¹ÜShÎ*AZ©½™ò夤7ï5¿5cU»æ$cïê¿I(8Vµs@X±nÇѧƾ¹óå¸T§"7süˆÙŠ-ü¤QÅÿò Be8!>_^= .éÇD§ ÈÎëÕÛ“ÇŸ–î&ÏÔyŸÏ9ECQÎÛŸèèöXm‘¸iˆ  ²v2 ‡C[ú!ñ9 ™ÏcXúQµ“ø±²·ê®M_xføÓƒ¥?²Ø7P /N’µ¼99¶ý¼$¶ endstream endobj 105 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.14)/Keywords() /CreationDate (D:20151013203259-04'00') /ModDate (D:20151013203259-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) kpathsea version 6.1.1) >> endobj 2 0 obj << /Type /ObjStm /N 88 /First 675 /Length 3189 /Filter /FlateDecode >> stream xÚíZÛrÛ8}×Wà1®- ĶRSåØqâš8Îú2É$åZ¢mNdÑ¡¨Lf¿~O”DRRl'»û4•ˆ¾žn4’‚%Ì0•°”iÃ<³†‰„yÅþKÇ„fÂàg™p?&…ÁI“ ¤dÒ¦h‚R¦¤fÒ3egü]v“ø~9­ói=cH9øi>+çÕ(ŸQ=Çù¸È^”ߨ§)Ïzy9€€ œ”Àlo:-!çÕRy9hÔíWyFžduΞüS& -Êfô”ã­cçE=ÁÈ){Ue÷·ÅhÆNæõý¼ÆÐ»“yE£*dC£«¤®AÇÛCø9àgó«:ÜR§ð·ÙÉ‘Ír¢aüu>ùš×Å(ð—ÓQ9&˜Q9ÉGHüÄö÷‰xŒrA—-% ú(nÉÍßÓ½é¬X ××9Ð#˜?¡dð»b:ŸaÆò/ó²Î'ùueAóq ïg³‚ßTÙלg#™Šj4¿»žäßx]LÆ9¿ËFU9åWU°d£ÃÇTÌŠ"0ãüšWÐÍGˆæd’-;oçÓ›¬šßM²yÍË›rš棌äÍî³Q~Ù…1¹…ã›búÞ–Õ8¯BzˆKþšñýO7É%åÓ¨F&zè¨*zÌTb!†NQñÓÃDjõgÀuq3¯òfâ46´òùÃïQÚ‡ÈÅÄ Q§óÉärtÉÐb=zФ~¨ˆ•f(Ñ!´*¬tÚFäÎ!-Ʋ™ðKBl£Së¦íhÅhºA’6mCËÓ¢­hµ 64ð'W¦¤áèN`U[aFŒPÏRüÝÁ!²<ÿV³^{ÓÞ¸þ´7éS¦ý c™Ý÷"³FˆíÆP`Ö=H¨t2ôðlKX¶À¿‚¹¿¦ÍÆO`œª>Æ©ø1ŒSù8Œ;t!©}:TØSnA¤ãúÒÝ. QûQDì"æI‰HÚGtib&Ô›… …±CíÒm·3mãäîB¿‚û1¶b cÿcÛäoI¦–§ONš k¶Z®ÙFGÇ6?äÊ02!ÄðoÕ¾ŒT/‚»tîž[kØuÙ†† ï›tt@_°°mÂþ©šÕû·Y…EzÀßd­›÷Ÿ¾ÑA$ »\öm“ÒDH²A’.·Z q Ú¼yèì°'È|ºDmœ;–bèÄò÷ïÿò»üíÿ= 5ÔÑ³Ž¡ÅCñS×(§}µi_r챘 uM = 'V:Ô‡ ŽûFÂ&kõ:刂¬¶©G*íŽí-IAjäo4Hl+±¹’T?£†H®Þ“œvO*‚¦ Þ6*mŸbÆÊA¿Õ]]õµy¨W²Â B<ÚÕÆ%È“‚hØFÙïÈ"¸âÕ)ê‰WicäÂh’¬ý,–­Ép'‡î}BÓÉ`ݲu%’¨fÕjS)GðÅkßk™·É°m?¹fE”ª­ »‚•äšMB¨£[)y‘ºP4Éã4¥èT!^ù™"¼H›ñ¦/ð6ÒUJðF¾‰pŠD.ÕZÈIôÊÑ~«AÖD£ÕnE/ôvb*W2šP˜.u¤PžrFù /¤5ˆíp¥9/äЄ ü¹k”Ó\µ¤üÄl” áJ÷N{Œ[ïÉ@‹s)…N9Xl“0“.ä5vu@†žm:¾„c <Ij‡¢!p€Î‡B`š¶S£Wë$„ºT:R,ö汯©³K«IO¶GF§¡Ò˜€xø+ª…mè©wáèõt=^Ù†bEǵ!;48Ü *ÄEZz™ÂjiÐø‰+IYü,¦úS‚'^c¥'İj «Ãt@ÅñOE˜U RF…]¼ œ2d?=2 \j!/r6²%M*£—²‰J…G éòÆx×q¸ÛZÝ‘­ ™°lIÎ ËñÀú æ· ÷N4¼Kª8¦Bz)Gæ†6@@ÐòCɘ"ã`%Š7œ’´ OQ2é±x: O¤)$Ñh+(ÁEXn,=mNšqês wÓ†&J¤„R+hht†«‡fÓé1¨l‚žÇ“㕵v»'JÖ %Q»-1\‡¦áý¡ZÆke¨—·-3Ð(X(èe›Ð£—½CÄA>UÅ}]Vñ4gÇ'çgÿØ?~ñAH L²›ÓíóÂ.Ž2»g!(÷ &öfôp x€r?»7·¸u8Û4xTg“b´7½™ä,Á1¦Îï~C®ùÿÐ0¡èÆÓ:žñ=~À_òWüˆ¿åg<ãW|ÄÇ<ç×ü†|§¼äå4ç÷yU”c^ñ¯y}[å9¯ÿ,ù|'š~X@¡Óí3ÜCHœ\œ½~ $NE²œš-9ÉC@¨G‘¶qP¢‹ÃK~ž"¾á'üXœó÷ £rRNq½»Ël®ñ¿Àÿ¯¸ÁaXÝ­?øg v·ÂŒßÓá–¬ÆVEšP~Y“åòoü¯¨éS@ýõ_‡/¨[² å&d—w©ÙŠé!<[bHèå³ÛVbUþWeÇ{÷ï/>¾ømÿ %©Áks®ãä“JõÛ÷'§iÑÚžm:&›Q?•lÉ£síëUÈ­¬ú^~ù¸œL@ƒÔ ]›¬•X±|O $ÔwÓª“Q³ü+˜gÅ· Õ|C~m)èë/ W¯û»†N¤èëðÌoõ¸P· *†ÍóB'ž®¼·P÷tÛ¾nŠðJ·+ÝÉÓu÷Ö³žn¿æ·îø½zNêäÓu÷V“®n/úºi!ÜŒ¹zºîõ ßS¯úê•Þ»uOW߯j=åëùÖõݬ”û§+ïW›žrû€çz¥Ü®+§÷3za1§—þk1ž-_³6ïôšYÍ»–ø"¢÷–àd^OP$f¬y OfÐÇ3ñ|С–Œá£Õn¾¤ ­æÈ‚ë]•¥—m˧ô N™nä|Ko3”ÜÀi–œ²Ãé]K§káº0 :ÔÈlÚ•=éb!]¸Žô¶p‘®›%ì’Qog”-çd²AÊP‘l’7©_™nǤìæЮñ¤P/äKôÅFEAx'Þ´è")Ÿ”£Ý³:«êú\Žr±õ‚ö±ç î“ֽܡ/çV÷j‡>[Ýëú.¤5SÜuOÝ‚ê²oRè7;ôa\ÖúfKu{`‚íöÀ¹ ê}%Ć~H¦oä€>隥ýÏ®„_S¾’vC?T+ÑWÝ—ØgYškР飏øW|ðm²Pù@KßÑ­•²ý ;§òfkÚò“¨EiZ%X@„¾ÀkÒï&?.Ç9¿˜å«2vrŸO÷‚~ú¨³Ñõ§puÓ endstream endobj 106 0 obj << /Type /XRef /Index [0 107] /Size 107 /W [1 3 1] /Root 104 0 R /Info 105 0 R /ID [ ] /Length 262 /Filter /FlateDecode >> stream xÚÒI2ƒA‡ñÿ1ÄDð™¾Ä<Æ<Æ<ÅÓ\š Øp WH)U®`máªlð¼›_=ývuW/Z’~#RDfߢÒpè„S(ƒ(tÁ ”CtÃ1TBdàbP p5P ƒP€:¨‡!8€84@ZLÑwn»Iq¯´ÂlÂ:lÀlÃ.´Á4Bš ÙKø}=ÐaJ>ù2€qÈB¯)øFÃÐg n}Öc0b o|6jÊüxMÀ$ä` ¦afaæaÁ”}õc‹¦bÎkÉô|çµl*½y­˜¾>½VÍÂ’WÞ¬òZƒ}(Â9\À%\ÁµÙýËÿ?xüÐŒ8 Å endstream endobj startxref 103898 %%EOF graph/inst/perf/0000755000175100017510000000000012607264574014621 5ustar00biocbuildbiocbuildgraph/inst/perf/Makefile0000644000175100017510000000035412607321273016251 0ustar00biocbuildbiocbuildBASE = graphperf R ?= R-devel all: $(BASE).pdf @echo "building perf report using $(R)" $(BASE).pdf: $(BASE).tex $(R) CMD texi2dvi --pdf -c -q $< $(BASE).tex: $(BASE).Rnw $(R) CMD Sweave $< clean: @rm -fv $(BASE).pdf $(BASE).tex graph/inst/perf/bgt.R0000644000175100017510000000620212607264574015520 0ustar00biocbuildbiocbuild## Basic Graph Tests ## Each test has: ## - an input graph specified as an edge list ## - an operation name (or should it be the function? ## - an expected result. If the result is a graph object, it will ## be expressed as an edge list. ## ## Do we need a way to indicate nodes with no edges? ## makeFT <- function(from, to) { ord <- order(from) from <- from[ord] to <- to[ord] cbind(from, to) } basicDirected <- function() { from <- c("b", "b", "b", "i", "o", "c", "c", "e") to <- c("e", "i", "s", "o", "c", "i", "o", "c") w <- seq_len(length(to)) list(nodes = letters[1:20], edges = makeFT(from, to), weights = w, edgemode = "directed") } basicUndirected <- function() { from <- c("b", "b", "b", "i", "c", "e") to <- c("e", "i", "s", "o", "o", "c") w <- seq_len(length(to)) list(nodes = letters[1:20], edges = makeFT(from, to), weights = w, edgemode = "undirected") } basic_to_ft <- function(g) { from <- match(g$edges[, 1L], g$nodes) to <- match(g$edges[, 2L], g$nodes) ft <- cbind(from, to) ft } create <- list( "graphAM" = function(gDesc) { ft <- basic_to_ft(gDesc) numNodes <- length(gDesc$nodes) mat <- matrix(0L, nrow = numNodes, ncol = numNodes, dimnames = list(NULL, gDesc$nodes)) coord <- graph:::coordToIndex(ft[, 1L], ft[, 2L], numNodes) w <- gDesc$weights if (gDesc$edgemode == "undirected") { coord <- c(coord, graph:::coordToIndex(ft[, 2L], ft[, 1L], numNodes)) w <- c(w, w) } mat[coord] <- w graphAM(adjMat = mat, edgemode = gDesc$edgemode, values = list(weight = 1L)) }, "graphNEL" = function(gDesc) { edgeL <- split(gDesc$edges[ , 2L], gDesc$edges[ , 1L]) if (gDesc$edgemode == "undirected") { f <- gDesc$edges[, 1L] t <- gDesc$edges[, 2L] ft <- c(f, t) tf <- c(t, f) edgeL <- split(tf, ft) } g <- graphNEL(nodes = gDesc$nodes, edgeL = edgeL, edgemode = gDesc$edgemode) edgeDataDefaults(g, attr = "weight") <- 1L edgeData(g, from = gDesc$edges[, 1L], to = gDesc$edges[, 2L], attr = "weight") <- gDesc$weights g }) graph2desc <- function(g) { nms <- nodes(g) ft <- t(edgeMatrix(g)) from <- nms[ft[, 1L]] to <- nms[ft[, 2L]] list(nodes = nms, edges = makeFT(from, to), weights = unlist(edgeWeights(g), use.names = FALSE), edgemode = edgemode(g)) } toGraphDesc <- list("graphAM" = graph2desc, "graphNEL" = graph2desc) gam <- create$graphAM(basicDirected()) gnel <- create$graphNEL(basicDirected()) gam0 <- toGraphDesc$graphAM(gam) gnel0 <- toGraphDesc$graphNEL(gnel) ugam <- create$graphAM(basicUndirected()) ugnel <- create$graphNEL(basicUndirected()) graph/inst/perf/graphperf.Rnw0000644000175100017510000002475512607264574017304 0ustar00biocbuildbiocbuild\documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \newcommand{\myincfig}[3]{\begin{figure}[htbp] \begin{center} \includegraphics[width=#2]{#1} \caption{\label{#1}#3} \end{center} \end{figure}} \begin{document} \title{Graph Package Performance Report} \author{Seth Falcon} \maketitle \SweaveOpts{keep.source=TRUE} <>= st <- system.time perfRow <- function(g, t, op="") { data.frame(class = class(g), op = op, nodes = numNodes(g), edges = numEdges(g), directed = ifelse(isDirected(g), "T", "F"), user = t[1], sys = t[2], clock = t[3], stringsAsFactors = FALSE) } timeRow <- function(expr, op) { t <- system.time(g <- expr) list(result=g, row=perfRow(g, t, op)) } randNonDiagIndex <- function(n, count) { diagIdx <- 1L + 0L:(n - 1L) * (n + 1L) idx <- seq_len(n^2)[-diagIdx] sample(idx, count) } randAdjMat <- function(nodeCount, edgeCount) { nodes <- paste("graph_node_", seq_len(nodeCount), sep="") am <- matrix(0L, nrow = nodeCount, ncol = nodeCount, dimnames = list(nodes, nodes)) am[randNonDiagIndex(nodeCount, edgeCount)] <- 1L am } randSymAdjMat <- function(nodeCount, edgeCount) { nodes <- paste("graph_node_", seq_len(nodeCount), sep="") am <- matrix(0L, nrow = nodeCount, ncol = nodeCount, dimnames = list(nodes, nodes)) upt <- as.vector(upper.tri(am)) idx1 <- sample(seq_len(nodeCount^2)[upt], edgeCount) am[idx1] <- 1L am <- am + t(am) am } @ \section{Introduction} <>= library("graph") set.seed(0xab34eL) medEdgeCount <- 5000L bigEdgeCount <- 260000L nodeCount <- 2000L bigSymMat <- randSymAdjMat(nodeCount, bigEdgeCount) medSymMat <- randSymAdjMat(nodeCount, medEdgeCount) bigMat <- randAdjMat(nodeCount, bigEdgeCount) medMat <- randAdjMat(nodeCount, medEdgeCount) dim(bigSymMat) dim(medSymMat) @ This document surveys the runtime performance of graph operations believed to be heavily used for common bioinformatic analyses. We use two \Sexpr{nodeCount} node graphs, one with \Sexpr{medEdgeCount} edges and the other with \Sexpr{bigEdgeCount} edges. Both graphs are generated randomly. <>= matDim <- dim(bigSymMat) cntZero <- sum(bigSymMat == 0) cntNonZero <- sum(bigSymMat != 0) pctNonZero <- sum(bigSymMat != 0) / nrow(bigSymMat)^2 @ \section{Timing of Operations} Here we look at the time to construct \Rclass{graphAM} and \Rclass{graphNEL} instances using two adjacency matrices with the same node count, but different number of edges. \subsection{Creating new graph objects} First, we look at the \Rclass{graphAM} representation. We construct directed and undirected graphs with different numbers of edges for the same node set. <>= ## undirected ans <- timeRow(graphAM(adjMat = bigSymMat, edgemode="undirected"), "new") df <- ans$row ans <- timeRow(graphAM(adjMat = medSymMat, edgemode="undirected"), "new") df <- rbind(df, ans$row) ## directed ans <- timeRow(graphAM(adjMat = bigMat, edgemode="directed"), "new") df <- rbind(df, ans$row) g1 <- ans$result ans <- timeRow(graphAM(adjMat = medMat, edgemode="directed"), "new") df <- rbind(df, ans$row) g2 <- ans$result ## using a from/to matrix ftmat1 <- t(edgeMatrix(g1)) ans <- timeRow(graphAM(adjMat = ftM2adjM(ftmat1), edgemode = "directed"), "new f/t") df <- rbind(df, ans$row) ftmat2 <- t(edgeMatrix(g2)) ans <- timeRow(graphAM(adjMat = ftM2adjM(ftmat2), edgemode = "directed"), "new f/t") df <- rbind(df, ans$row) rownames(df) <- NULL df.AM.new <- df df.AM.new @ For \Rclass{graphNEL} we can use the \Rcode{as(matrix, "graphNEL")} coerce method for the undirected case. For a directed graph, we convert the adjacency matrix into a from-to matrix using \Rcode{t(edgeMatrix(g1))} and then use \Rfunction{ftM2graphNEL}. <>= ans <- timeRow(as(bigSymMat, "graphNEL"), "as(m, NEL)") df.NEL.new <- ans$row ans <- timeRow(as(medSymMat, "graphNEL"), "as(m, NEL)") df.NEL.new <- rbind(df.NEL.new, ans$row) ftMat1 <- t(edgeMatrix(g1)) ftMat2 <- t(edgeMatrix(g2)) ## there's a bit of an inconsistency here ## since we aren't using the node labels ans <- timeRow(ftM2graphNEL(ftMat1), "ft2NEL") df.NEL.new <- rbind(df.NEL.new, ans$row) ans <- timeRow(ftM2graphNEL(ftMat2), "ft2NEL") df.NEL.new <- rbind(df.NEL.new, ans$row) rownames(df.NEL.new) <- NULL df.NEL.new @ Here are some notes on the \textit{experimental} \Rclass{graphAM2} class that uses a bit array (backed by a raw vector) to store an adjacency matrix. First, we make a more standard from/to matrix: <>= ft1 <- matrix("", nrow = nrow(ftmat1), ncol = ncol(ftmat2)) ft1[, 1L] <- nodes(g1)[ftmat1[, 1L]] ft1[, 2L] <- nodes(g1)[ftmat1[, 2L]] ft2 <- matrix("", nrow = nrow(ftmat2), ncol = ncol(ftmat2)) ft2[, 1L] <- nodes(g1)[ftmat2[, 1L]] ft2[, 2L] <- nodes(g1)[ftmat2[, 2L]] @ <>= ans <- timeRow(GraphAM2(from = ft1[, 1L], to = ft1[, 2L], nodes = nodes(g1), edgemode = "directed"), "GraphAM2") df.AM2.new <- ans$row gbit1 <- ans$result ans <- timeRow(GraphAM2(from = ft1[, 1L], to = ft1[, 2L], nodes = nodes(g1), edgemode = "undirected"), "GraphAM2") df.AM2.new <- rbind(df.AM2.new, ans$row) ans <- timeRow(GraphAM2(from = ft2[, 1L], to = ft2[, 2L], nodes = nodes(g2), edgemode = "directed"), "GraphAM2") df.AM2.new <- rbind(df.AM2.new, ans$row) gbit2 <- ans$result ans <- timeRow(GraphAM2(from = ft2[, 1L], to = ft2[, 2L], nodes = nodes(g2), edgemode = "undirected"), "GraphAM2") df.AM2.new <- rbind(df.AM2.new, ans$row) rownames(df.AM2.new) <- NULL df.AM2.new @ \subsection{\Rclass{graphAM} to \Rclass{graphNEL} conversion} Convert from \Rclass{graphAM} to \Rclass{graphAM}. <>= ans <- timeRow(as(g1, "graphNEL"), "as(AM, NEL)") df.AM.to.NEL <- ans$row gnel1 <- ans$result ans <- timeRow(as(g2, "graphNEL"), "as(AM, NEL)") df.AM.to.NEL <- rbind(df.AM.to.NEL, ans$row) gnel2 <- ans$result rownames(df.AM.to.NEL) <- NULL df.AM.to.NEL @ \subsection{Size comparison} <>= objType <- sapply(list(g1, gnel1, gbit1), class) Size <- sapply(list(g1, gnel1, gbit1), object.size) data.frame(class=objType, size=Size) @ \subsection{intersection and union} Currently, intersection and union are implemented for the \Rclass{graph} super class using the \Rmethod{nodes}, \Rmethod{edges} methods and constructing a new \Rclass{graphNEL} for the result. This is suboptimal for \Rclass{graphAM} objects. %% TODO: evaluate intersection/union of two random graphs with same %% edge counts as well as the mixed size case <>= ## interesting to note that intersection and union ## are returning graphNEL, even when input is AM ans <- timeRow(intersection(g1, g2), "intersection AM") df.setOps <- ans$row ans <- timeRow(intersection(gnel1, gnel2), "intersection NEL") df.setOps <- rbind(df.setOps, ans$row) ## intersection2 is giving me ## INTEGER() can only be applied to a 'integer', not a 'double' ## ans <- timeRow(intersection2(g1, g2), "intersection2 AM") ## df.setOps <- ans$row ## ans <- timeRow(intersection2(gnel1, gnel2), "intersection2 NEL") ## df.setOps <- rbind(df.setOps, ans$row) ans <- timeRow(union(g1, g2), "union AM") df.setOps <- rbind(df.setOps, ans$row) ans <- timeRow(union(gnel1, gnel2), "union NEL") df.setOps <- rbind(df.setOps, ans$row) ans <- timeRow(graph:::edge_set_intersect(gbit1, gbit2), "AM2 I") df.setOps <- rbind(df.setOps, ans$row) ans <- timeRow(graph:::edge_set_union(gbit1, gbit2), "AM2 U") df.setOps <- rbind(df.setOps, ans$row) rownames(df.setOps) <- NULL df.setOps @ Next we explore some different approaches to thresholding a graph's edges based on edge weight. Below we add random edge weights to a new graph object \Robject{gw} with the same structure as \Robject{g1}. <>= ## creating with edge weights gw <- g1 edgeDataDefaults(gw, "weight") <- 1L W <- abs(rnorm(numEdges(gw))) ## there should be an easier way to do this. ## sadly, it might be easier to extract the matrix ## and set weights on the matrix and create a new graphAM st(emat <- edgeMatrix(gw)) eFrom <- nodes(gw)[emat[1L, ]] eTo <- nodes(gw)[emat[2L, ]] ## setting edge weights for all edges st(edgeData(gw, from = eFrom, to = eTo, attr = "weight") <- W) ## extracting all edge weights st(ew <- edgeData(gw, attr="weight")) @ First approach is to pull out the raw adjacency matrix with values representing edge weights, perform the thresholding via matrix assignment and convert back to a \Rclass{graphAM}. <>= ## edge thresholding. st({ c1 <- function() { M <- as(gw, "matrix") idx = (M > 0) & (M < 0.3) M[idx] <- 0 graphAM(adjMat = M, values = list(weight = 1L), edgemode = "directed") } ewt1 <- c1() }) ewt1 @ Another approach is to extract the edge attributes, identify the edges to be removed (unfortunately, this requires string parsing) and then calling \Rmethod{removeEdge}. <>= st({ c1 <- function() { ew <- unlist(edgeData(gw, attr = "weight")) toRemove <- names(ew[ew < 0.3]) fromTo <- do.call(rbind, strsplit(toRemove, "|", fixed = TRUE)) removeEdge(fromTo[, 1], fromTo[, 2], gw) } ewt2 <- c1() }) ewt2 @ \subsection{Node permutation} Here's one way to permute the node labels of a \Rclass{graphAM} object. <>= permNodesAM <- function(g) { m <- g@adjMat colnames(m) <- sample(colnames(g@adjMat)) graphAM(adjMat = m, edgemode = edgemode(g)) } @ <>= ans <- timeRow(permNodesAM(g1), "permNodesAM") df.node.perm <- ans$row ans <- timeRow(permNodesAM(g2), "permNodesAM") df.node.perm <- rbind(df.node.perm, ans$row) rownames(df.node.perm) <- NULL df.node.perm @ \end{document} graph/inst/perf/multigraphs.Rnw0000644000175100017510000000450112607264574017650 0ustar00biocbuildbiocbuild\documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \newcommand{\myincfig}[3]{\begin{figure}[htbp] \begin{center} \includegraphics[width=#2]{#1} \caption{\label{#1}#3} \end{center} \end{figure}} \begin{document} \title{Experimental Support for Multigraphs} \author{Seth Falcon} \maketitle \SweaveOpts{keep.source=TRUE} <>= st <- system.time @ \section{Introduction} The MultiGraph class represents a single node set and a set of edge sets. Each edge set is either directed or undirected. We can think of an edge in a MultiGraph as a 4-tuple (from-node, to-node, edge-type, weight), where the edge-type field in the tuple identifies the edge set, the weight is a numeric value, and the order of the nodes only matters in the case of a directed edge set. Unlike some of the graph representations, self-loops are allowed (from-node == to-node). There is support for arbitrary edge attributes which is primarily useful for rendering plots of MultiGraphs. These attributes are stored separately from the edge weights to facilitate efficient edge weight computation. <>= library("graph") set.seed(0xab34eL) ft1 <- graph:::randFromTo(10000L, 1e6L) ft2 <- graph:::randFromTo(10000L, 1e6L) ft3 <- graph:::randFromTo(30000L, 1e6L) names(ft1) head(ft1$nodes) head(ft1$ft) esets <- list(e1=ft1$ft, e2=ft2$ft, e3=ft3$ft) ## order(to_i, from_i) is a big factor here st(g <- MultiGraph(esets)) object.size(esets) / 1024^2 object.size(g) / 1024^2 g numNodes(g) ## we should be able to make numEdges faster by ## memoizing and/or just taking length of weight ## vector. st(numEdges(g)) st(lapply(eweights(g), head)) ## this is slow because of string creation, I suspect st(lapply(eweights(g, "=>"), head)) ## a good portion is in new and initialize st(gi <- edgeSetIntersect0(g)) gi st(degree(g)) st(extractFromTo(g)) nds <- nodes(g) subNds <- sample(nds,0.5*length(nds)) st(subGraph(subNds,g)) @ \end{document} graph/inst/unitTests/0000755000175100017510000000000012607264574015667 5ustar00biocbuildbiocbuildgraph/inst/unitTests/MultiGraph_test.R0000644000175100017510000013206612607264574021135 0ustar00biocbuildbiocbuildset.seed(0x12a9b) ## alias subsetEdgeSets; remove once it is exported make_directed_MultiGraph <- function(use.factors = TRUE) { ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x", "c"), to=c("b", "c", "x", "y", "c", "a"), weight=c(3.4, 2.6, 1, 1, 1, 7.9), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g <- MultiGraph(esets) list(esets=esets, g=g) } make_mixed_MultiGraph <- function(use.factors = TRUE) { ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x", "c"), to=c("b", "c", "x", "y", "c", "a"), weight=c(3.4, 2.6, 1, 1, 1, 7.9), stringsAsFactors = use.factors) ft3 <- data.frame(from=c("a", "a", "x", "x", "x"), to =c("b", "c", "a", "y", "c"), weight=c(1:5), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2, e3=ft3, e4=ft2[FALSE, ], e5=ft3[FALSE, ]) g <- MultiGraph(esets, directed = c(TRUE, TRUE, FALSE, TRUE, FALSE)) list(esets=esets, g=g) } randMultiGraph <- function(numNodes, numEdges) { ftlist <- lapply(numEdges, function(ne) { graph:::randFromTo(numNodes, ne) }) nn <- ftlist[[1L]]$nodes edgeSets <- lapply(ftlist, function(x) x[["ft"]]) names(edgeSets) <- paste("e", seq_len(length(edgeSets)), sep="") MultiGraph(edgeSets, nodes = nn) } randFromTo2 <- function(numNodes, numEdges, weightFun = function(N) rep(1L, N), directed = TRUE) { if (numNodes > 2^15) stop("too many nodes: ", numNodes) maxEdges <- numNodes * numNodes nodeNames <- sprintf("%010d", seq_len(numNodes)) x <- c(rep(1L, numEdges), rep(0L, maxEdges - numEdges)) idx <- which(sample(x) == 1L) to_i <- ((idx - 1L) %/% numNodes) + 1L from_i <- ((idx - 1L) %% numNodes) + 1L from <- nodeNames[from_i] to <- nodeNames[to_i] w <- weightFun(length(from)) if (!directed) { tmp <- graph:::.mg_undirectEdges(from, to, w) from <- tmp$from to <- tmp$to w <- tmp$weight df <- data.frame(from = from, to = to, weight = w, stringsAsFactors = FALSE) df <- df[!duplicated(df), ] } else { df <- data.frame(from = from, to = to, weight = w, stringsAsFactors = FALSE) } list(nodes = nodeNames, ft = df) } sort_esets <- function(esets) { ## sorting is based on column major ordering lapply(esets, function(ft) { ft <- ft[order(ft$to, ft$from), ] }) } make_unique_ft <- function(ftdata) { ## ftdata is a list with components $nodes and $ft ## $ft is a data.frame with columns 'from', 'to', and 'weight' ft <- ftdata[["ft"]] el <- paste(ft[["from"]], ft[["to"]], sep = "\t") dups <- duplicated(el) ftdata[["ft"]] <- ft[!dups, ] ftdata } test_basic_accessors <- function() { basic <- make_mixed_MultiGraph() esets <- basic$esets g <- basic$g checkEquals(6L, numNodes(g)) checkEquals(c("a", "b", "c", "d", "x", "y"), nodes(g)) checkEquals(c(e1=5L, e2=6L, e3=5L, e4=0L, e5=0L), numEdges(g)) checkEquals(structure(c(TRUE, TRUE, FALSE, TRUE, FALSE), .Names = paste("e", 1:5, sep="")), isDirected(g)) } test_no_edge_sets <- function() { g1 <- MultiGraph(list(), nodes = letters) g2 <- MultiGraph(list(), nodes = letters, directed = FALSE) for (g in list(g1, g2)) { checkEquals(26L, numNodes(g)) checkEquals(letters, nodes(g)) checkEquals(list(), numEdges(g)) checkEquals(list(), eweights(g)) checkEquals(list(), eweights(g, "=")) checkEquals(list(), isDirected(g)) } tcon = textConnection(NULL, "w") sink(tcon) show(g1) sink() checkEquals("MultiGraph with 26 nodes and 0 edge sets", textConnectionValue(tcon)) close(tcon) } test_create_empty_edgeSets <- function() { df1 <- data.frame(from=c("a", "b"), to=c("b", "c"), weight=c(1, 1)) esets <- list(e1 = df1, empty1 = df1[FALSE, ]) g <- MultiGraph(esets) checkEquals(c(e1=2L, empty1=0L), numEdges(g)) dg <- MultiGraph(esets, directed = FALSE) checkEquals(c(e1=2L, empty1=0L), numEdges(dg)) } test_edgeSets_arg_checking <- function() { ## data.frame's in edgeSets list must have names: ## from, to, weights df0 <- data.frame(fr=c("a", "b"), to=c("b", "c"), weights=c(1, 1)) checkException(MultiGraph(list(e1=df0))) ## edgeSets must be named list or empty list checkException(MultiGraph(NULL)) checkException(MultiGraph(list(data.frame(from=c("a", "b"), to=c("b", "c"), weights=c(1, 1))))) } test_no_nodes <- function() { mg <- MultiGraph(list()) checkEquals(0L, length(nodes(mg))) checkEquals(list(), numEdges(mg)) } test_create_infer_nodes <- function() { basic <- make_directed_MultiGraph() esets <- basic$esets g <- basic$g checkEquals(6L, numNodes(g)) checkEquals(c(e1=5L, e2=6L), numEdges(g)) } ## test constructor with nodes arg given (singleton case) test_bad_nodes_in_create <- function() { basic <- make_directed_MultiGraph() esets <- basic$esets esets[[1]]$to <- as.character(esets[[1]]$to) bad_values <- c(NA, "a\n", "", "z|a", "a\t") for (v in bad_values) { tmp <- esets tmp[[1]]$to[3] <- v checkException(MultiGraph(tmp)) } } test_dup_edges_is_an_error <- function() { ## directed case ft1 <- data.frame(from=c("a", "a", "a"), to=c("b", "c", "b"), weight=c(1, 3.1, 5.4)) checkException(MultiGraph(list(e1=ft1))) ## undirected case ft2 <- data.frame(from=c("a", "a", "b"), to=c("b", "c", "a"), weight=c(1, 3.1, 5.4)) ## ok if directed junk <- MultiGraph(list(e1=ft2)) checkException(MultiGraph(list(e1=ft2), directed = FALSE)) } test_edgeWeights_create <- function() { basic <- make_mixed_MultiGraph() esets <- basic$esets g <- basic$g esets <- sort_esets(esets) got <- eweights(g) checkIdentical(list(e1 = esets[[1L]][, "weight"]), got[1]) checkIdentical(list(e2 = esets[[2L]][, "weight"]), got[2]) ## undirected case normalizes edges by sorting, always putting the ## node that sorts first as from. checkIdentical(list(e3 = c(1L, 2L, 3L, 5L, 4L)), got[3]) } test_edgeWeights_edge_names <- function() { basic <- make_mixed_MultiGraph() esets <- basic$esets g <- basic$g wv <- eweights(g, names.sep = "=>") esets <- sort_esets(esets) want <- paste(esets[[1]]$from, esets[[1]]$to, sep = "=>") checkEquals(want, names(wv[[1]])) want <- c("a|b"=1L, "a|c"=2L, "a|x"=3L, "c|x"=5L, "x|y"=4L) checkIdentical(list(e3 = want), eweights(g, "|")[3]) } test_supports_self_loops <- function() { esets <- list(e1 = data.frame(from = c("a", "a"), to = c("a", "b"), weight = c(1, 2))) g <- MultiGraph(esets) checkEquals(c(e1 = 2), numEdges(g)) } test_isDirected <- function() { g <- make_mixed_MultiGraph()$g checkEquals(c(e1=TRUE, e2=TRUE, e3=FALSE, e4=TRUE, e5=FALSE), isDirected(g)) } test_ugraph_via_isDirected <- function() { g <- make_mixed_MultiGraph()$g ## verify precondition want <- c(TRUE, TRUE, FALSE, TRUE, FALSE) names(want) <- paste("e", 1:5, sep="") checkEquals(want, isDirected(g)) ug <- ugraph(g) want[] <- FALSE checkEquals(want, isDirected(ug)) } test_ugraph_for_undirected_edge_sets <- function() { df1 <- data.frame(from=c("x", "a", "b"), to=c("a", "b", "x"), weight=c(1, 2, 3)) g <- MultiGraph(list(e1=df1), directed=FALSE) ug <- ugraph(g) checkEquals(nodes(g), nodes(ug)) checkEquals(numEdges(g), numEdges(ug)) checkEquals(isDirected(g), isDirected(ug)) ## verify attributes have been dropped checkEquals(rep(1L, 3), eweights(ug)[[1]]) } test_ugraph_for_directed_edge_sets <- function() { df1 <- data.frame(from=c("x", "a", "b", "x", "b", "c"), to=c("a", "x", "x", "b", "a", "x"), weight=1:6) g <- MultiGraph(list(e1=df1), directed=TRUE) checkEquals(6, numEdges(g)[[1]]) ug <- ugraph(g) checkEquals(nodes(g), nodes(ug)) checkTrue(!isDirected(ug)[1]) checkEquals(4, numEdges(ug)[[1]]) checkEquals(rep(1L, 4), eweights(ug)[[1]]) checkEquals(c("a=b", "a=x", "b=x", "c=x"), names(eweights(ug, "=")[[1]])) } mg_equals <- function(g1, g2) { checkEquals(nodes(g1), nodes(g2)) checkEquals(isDirected(g1), isDirected(g2)) checkEquals(numEdges(g1), numEdges(g2)) checkEquals(eweights(g1, "==>"), eweights(g2, "==>")) } test_edgeSetIntersect0_trivial <- function() { ## Verify 0 and 1 edge set cases for directed/undirected df <- data.frame(from="a", to="b", weight=1L) mgs <- list( ## empty edge sets MultiGraph(list(), nodes = letters), MultiGraph(list(), nodes = letters, directed = FALSE), ## single edge set MultiGraph(list(e1=df)), MultiGraph(list(e1=df), directed = FALSE)) for (g in mgs) { mg_equals(g, edgeSetIntersect0(g)) } ## Verify empty intersection for disjoint graphs df1 <- data.frame(from="a", to="b", weight=1L) df2 <- data.frame(from="x", to="y", weight=1L) g <- MultiGraph(list(e1=df1, e2=df2)) gu <- MultiGraph(list(e1=df1, e2=df2), directed = FALSE) want <- MultiGraph(list(), nodes = c("a", "b", "x", "y")) mg_equals(want, edgeSetIntersect0(g)) mg_equals(want, edgeSetIntersect0(gu)) } # test_edgeSetIntersect0_directed_1 <- function() { ## non-trivial directed intersect g <- make_directed_MultiGraph()$g gi <- edgeSetIntersect0(g) ## TODO: do we want the minimal node set or not? ## checkEquals(c("a", "b", "c"), nodes(gi)) checkEquals(nodes(g), nodes(gi)) # original nodes checkEquals(c(e1_e2=2L), numEdges(gi)[1L]) checkEquals("e1_e2", names(numEdges(gi))) w <- c(as.numeric(NA), as.numeric(NA)) names(w) <- c("a=>b", "a=>c") checkEquals(list(e1_e2=w), eweights(gi, "=>")) } test_edgeSetIntersect0_random <- function() { make_data <- function(nsets, nn, ne, ns, type=c("directed", "undirected")) { ## nsets: number of edge sets ## nn: number of nodes ## ne: number of edges ## ns: number of shared edges directed <- switch(match.arg(type), directed=TRUE, undirected=FALSE, mixed=sample(c(TRUE, FALSE), nsets, replace=TRUE)) grouped <- randFromTo2(nn, (ne * nsets) + ns, directed = all(directed))$ft ## for the undirected case, we will end up with fewer edges so ## need to adjust. ne <- (nrow(grouped) - ns) %/% nsets shared <- grouped[1:ns, ] starts <- seq(ns, nrow(grouped) - ne, by = ne) + 1L esets <- vector("list", nsets) names(esets) <- paste("e", 1:nsets, sep = "") for (i in seq_along(esets)) { z <- grouped[seq(starts[[i]], starts[[i]] + ne - 1L), ] z <- rbind(shared, z) esets[[i]] <- z } list(shared=shared, g=MultiGraph(esets, directed = directed), esets = esets) } do_test <- function(d) { gi <- edgeSetIntersect0(d$g) checkEquals(nrow(d$shared), numEdges(gi)[[1]]) all_directed <- all(isDirected(d$g)) checkEquals(all_directed, isDirected(gi)[[1]]) checkEquals(nodes(d$g), nodes(gi)) } for (t in c("directed", "undirected")) { for (i in 1:10) { do_test(make_data(2, 10, 10, 3, type = t)) do_test(make_data(3, 10, 10, 3, type = t)) do_test(make_data(3, 10, 10, 1, type = t)) do_test(make_data(3, 11, 20, 6, type = t)) } } } test_subSetEdgeSets_single <- function(){ g <- make_directed_MultiGraph()$g gi <- subsetEdgeSets(g, "e1") checkEquals(nodes(g), nodes(gi)) checkEquals(c(e1 = 5L), numEdges(gi)[1L]) checkEquals("e1", names(numEdges(gi))) w <- c(1.0, 1.0, 3.1, 5.4, 2.2) names(w) <- c("b=>a", "a=>b", "a=>c", "a=>d", "b=>d") checkEquals(list(e1=w), eweights(gi, "=>")) } test_subSetEdgeSets_multiple <- function() { g <- make_mixed_MultiGraph()$g gi <- subsetEdgeSets(g, c("e1","e3")) checkEquals(nodes(g), nodes(gi)) checkEquals(c(e1 = 5L, e3 = 5L), numEdges(gi)) checkEquals(c("e1", "e3"), names(numEdges(gi))) w1 <- c( 1.0, 1.0, 3.1, 5.4, 2.2) w2 <- c(1, 2, 3, 5, 4) names(w1) <- c("b=>a", "a=>b", "a=>c", "a=>d", "b=>d") names(w2) <- c("a=>b", "a=>c", "a=>x", "c=>x", "x=>y") checkEquals(list(e1 = w1, e3 = w2), eweights(gi, "=>")) } test_subSetEdgeSets_no_duplicate_edgeSets <- function() { g <- make_directed_MultiGraph()$g checkException(subsetEdgeSets(g, c("e1", "e1"))) } test_subSetEdgeSets_no_such_edgeSet <- function() { g <- make_directed_MultiGraph()$g checkException(subsetEdgeSets(g, "notAnEdgeSet")) } test_subSetEdgeSets_empty_edgeSet <- function() { g <- make_directed_MultiGraph()$g gi <- subsetEdgeSets(g, character(0)) checkEquals(nodes(g), nodes(gi)) checkEquals("list", class(numEdges(gi))) checkEquals(0, length(numEdges(gi))) checkEquals(character(0), names(numEdges(gi))) } test_extractFromTo_Directed <- function(use.factors=TRUE){ ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x", "c"), to=c("b", "c", "x", "y", "c", "a"), weight=c(3.4, 2.6, 1, 1, 1, 7.9), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g <- MultiGraph(esets) res <- extractFromTo(g) ft1 <- ft1[do.call(order ,ft1["to"]),] rownames(ft1) <- 1:5 ft2 <- ft2[do.call(order ,ft2["to"]),] rownames(ft2) <- 1:6 checkEquals(list(e1 = ft1, e2 = ft2), res) } test_extractFromTo_UnDirected <- function(use.factors=TRUE){ ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "c", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x", "c"), to=c("b", "a", "x", "y", "c", "a"), weight=c(3.4, 2.6, 1, 1, 1, 7.9), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g <- MultiGraph(esets,directed=c(FALSE,FALSE)) res <- extractFromTo(g) ft1 <- ft1[do.call(order ,ft1["to"]),] rownames(ft1) <- 1:5 ft2["from"] <- factor(c("a", "a", "a", "a", "c", "x")) ft2["to"] <- factor(c("a", "b", "c", "x", "x", "y")) ft2["weight"] <- c(2.6, 3.4, 7.9, 1, 1, 1) checkEquals(list(e1 = ft1, e2 = ft2), res) } test_degree_Mixed <- function(use.factors=TRUE){ ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "c", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x", "c"), to=c("b", "a", "x", "y", "c", "a"), weight=c(3.4, 2.6, 1, 1, 1, 7.9), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g <- MultiGraph(esets,directed=c(FALSE,TRUE)) deg <- degree(g) e1Degree <- as.numeric(c(3, 3, 2, 2, 0, 0)) attributes(e1Degree) <- list(names=c("a","b","c","d","x","y")) inDegree <- as.numeric(c(2, 1, 1, 0, 1, 1)) attributes(inDegree) <- list(names=c("a","b","c","d","x","y")) outDegree <- as.numeric(c(3, 0, 1, 0, 2, 0)) attributes(outDegree) <- list(names=c("a","b","c","d","x","y")) res <- list(e1 = e1Degree, e2 = list(inDegree = inDegree, outDegree=outDegree)) checkEquals(res, deg) } checkSubGraph <- function(g, subG) { nds <- nodes(g) subNodes <- nodes(subG) origFromTo <- extractFromTo(g) subFromTo <- extractFromTo(subG) sapply(names(origFromTo), function(x){ indx <- (origFromTo[[x]]$from %in% subNodes) & (origFromTo[[x]]$to %in% subNodes) origdf = origFromTo[[x]] want <- origdf[(origdf$from %in% subNodes) & (origdf$to %in% subNodes),] subdf <- subFromTo[[x]] checkEquals(as.character(want$from), as.character(subdf$from)) checkEquals(as.character(want$to), as.character(subdf$to)) checkEquals(g@edge_sets[[x]]@weights[indx], subG@edge_sets[[x]]@weights) }) } test_basic_subGraph <- function() { g <- make_mixed_MultiGraph()$g nds <- nodes(g)[1:3] sg <- subGraph(nds, g) checkSubGraph(g,sg) } test_large_subGraph <- function() { df1 <- graph:::randFromTo(1000L, 10001L, directed = TRUE, weightFun = seq_len) df2 <- graph:::randFromTo(1000L, 10001L, directed = FALSE, weightFun = seq_len) g <- MultiGraph(list(e1= df1$ft, e2 = df2$ft)) nds <- sample( graph:::nodes(g), 100) subG <- subGraph(nds, g) checkSubGraph(g, subG) } test_basic_mgToGraphAM <- function() { g <- make_mixed_MultiGraph()$g res <- extractGraphAM(g) checkGraphAMObj(res, g) } test_large_mgToGraphAM <- function() { df1 <- graph:::randFromTo(800L, 90L, directed = TRUE, weightFun = seq_len) df2 <- graph:::randFromTo(800L, 60L, directed = FALSE, weightFun = seq_len) g <- MultiGraph(list(e1= df1$ft, e2 = df2$ft)) res <- extractGraphAM(g) checkGraphAMObj(res,g) } checkGraphAMObj <- function(am, mg){ nds <- nodes(mg) dr <- isDirected(mg) checkEquals(names(mg@edge_sets),names(am)) sapply(names(am), function(x){ mat <- as(am[[x]], "matrix") checkEquals(colnames(mat),rownames(mat)) checkEquals(colnames(mat), nds) wtMg <- graph:::edgeSetToMatrix(nds, mg@edge_sets[[x]], dr[[x]]) checkEquals(mat, wtMg) }) } test_mixed_MultiGraph_Intersect <- function(use.factors=TRUE) { ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x"), to=c("b", "c", "x", "y", "c"), weight=c(3.4, 2.6, 1, 1, 1), stringsAsFactors = use.factors) ft3 <- data.frame(from=c("a", "a", "x", "x", "x"), to =c("b", "c", "a", "y", "c"), weight=c(1:5), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2, e3=ft3, e4=ft2[FALSE, ], e5=ft3[FALSE, ]) g1 <- MultiGraph(esets, directed = c(TRUE, FALSE, TRUE, TRUE, FALSE)) ft1 <- data.frame(from=c("a", "b"), to=c("d", "d"), weight=c(5.4, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a"), to=c("b", "c", "x"), weight=c(3.4, 2.6, 1), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g2 <- MultiGraph(esets, directed = c(TRUE, FALSE)) res <- graphIntersect(g1, g2) checkEquals(nodes(res), c("a", "b", "c", "d", "x")) checkEquals(isDirected(res), structure(c(TRUE, FALSE), names = c("e1", "e2"))) df <- extractFromTo(res) checkEquals(names(df), c("e1", "e2")) df1 <- data.frame(from = c("a", "b"), to = c("d", "d"), weight = c(5.4, 2.2)) checkEquals(df$e1, df1) df2 <- data.frame(from = c("a", "a", "a"), to = c("b", "c", "x"), weight = c(3.4, 2.6, 1)) checkEquals(df$e2, df2) } test_mixed_MultiGraph_Union <- function(use.factors=TRUE) { ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to =c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a"), to=c("b", "c"), weight=c(3.4, 2.6), stringsAsFactors = use.factors) ft3 <- data.frame(from=c("a", "a"), to =c("d", "b"), weight=c(1,2), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2, e3=ft3, e4=ft2[FALSE, ], e5=ft3[FALSE, ]) g1 <- MultiGraph(esets, directed = c(TRUE, FALSE, TRUE, TRUE, FALSE)) ft1 <- data.frame(from=c("a", "a", "b"), to=c("b", "x", "z"), weight=c(6, 5, 2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a"), to=c("a", "x", "y"), weight=c(1, 2, 3), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g2 <- MultiGraph(esets, directed = c(TRUE, FALSE)) res <- graphUnion(g1, g2) checkEquals(nodes(res), c("a", "b", "c", "d", "x", "y", "z")) checkEquals(names(res@edge_sets), c("e1", "e2", "e3", "e4", "e5")) checkEquals(isDirected(res), structure(c(TRUE, FALSE, TRUE, TRUE, FALSE), names = c("e1", "e2", "e3", "e4", "e5"))) df <- extractFromTo(res) checkEquals(names(df), c("e1", "e2", "e3", "e4", "e5")) df1 <- data.frame(from = c("b", "a", "a", "a", "b", "a", "b"), to = c("a", "b", "c", "d", "d", "x", "z"), weight = c(1, NA, 3.1, 5.4, 2.2, 5.0, 2.0)) checkEquals(df$e1, df1) df2 <- data.frame(from = c("a", "a", "a", "a", "a"), to = c("a", "b", "c", "x", "y"), weight = c(1, 3.4, 2.6, 2, 3 )) checkEquals(df$e2, df2) df3 <- data.frame(from = c("a", "a"), to = c("b", "d"), weight = c(2, 1)) checkEquals(df$e3, df3) df4 <- data.frame(from = factor(), to = factor(), weight = numeric()) checkEquals(df$e4, df4) checkEquals(df$e5, df4) } # test_MultiGraph_To_graphBAM <- function(use.factors=TRUE) { ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a", "x", "x"), to=c("b", "c", "x", "y", "c"), weight=c(3.4, 2.6, 1, 1, 1), stringsAsFactors = use.factors) esets <- list(e1 = ft1, e2 = ft2, e3 = ft2[FALSE, ]) g1 <- MultiGraph(esets, directed = c(TRUE, FALSE, TRUE)) res <- extractGraphBAM(g1) checkEquals(names(res), c("e1", "e2", "e3")) bam1 <- graphBAM(ft1, nodes=nodes(g1), edgemode = "directed") checkEquals(bam1, res$e1) bam2 <- graphBAM(ft2, nodes=nodes(g1), edgemode = "undirected") checkEquals(bam2, res$e2) bam3 <- graphBAM( ft2[FALSE, ], nodes=nodes(g1), edgemode = "directed") checkEquals(bam3, res$e3) res <- extractGraphBAM(g1, "e1") checkEquals(bam1, res$e1) res <- extractGraphBAM(g1, c("e2", "e3")) target <- structure(list(bam2, bam3), names = c("e2", "e3")) checkEquals(target, res) } test_MultiGraph_nodeAttributes <- function() { mg <- make_directed_MultiGraph()$g nds <- nodes(mg) checkException(nodeData(mg, n = c("a"), attr = "color")) checkException( nodeData(mg, n = "z", attr = "color") <- "red") nodeDataDefaults(mg, attr = "color") <- "violet" nodeDataDefaults(mg, attr = "class") <- "unknown" nodeData(mg, n = c("a", "x") , attr = "color") <- c("red", "green") nodeData(mg, attr = "class") <- "high" current <- nodeData(mg, attr = "color") target <- structure(list("red", "violet", "violet", "violet", "green", "violet") , names = nds) checkEquals(target, current) current <- nodeData(mg, attr = "class") target <- structure( as.list(rep("high",6)), names = nds) checkEquals(target, current) sg <- subGraph(c("a", "x"), mg) current <- nodeData(sg, attr = "color") target <- structure( list("red","green"), names = c("a", "x")) checkEquals(target, current) nodeDataDefaults(mg, attr="st") <- "unknown" nodeData(mg, n = c("b", "d"), attr = "st") <- mg@edge_sets$e1 current <- nodeData(mg, attr = "st") target <- structure(list("unknown", mg@edge_sets$e1, "unknown", mg@edge_sets$e1, "unknown", "unknown"), names = c( "a", "b", "c", "d", "x", "y")) checkEquals(target, current) } test_MultiGraph_edgeAttributes_directed <- function() { ## Check directed edge mg <- make_mixed_MultiGraph()$g mgEdgeDataDefaults(mg, "e1", attr = "color") <- "violet" mgEdgeData(mg, "e1", from = c("a"), to = c("b"), attr = "color") <- "red" current <- mgEdgeData(mg, "e1", attr = "color") nms <- paste( c("b", "a", "a", "a", "b"), c("a","b", "c", "d", "d"),sep ="|") target <- structure( list( "violet", "red", "violet", "violet", "violet"), names = nms) checkEquals(target, current) mgEdgeData(mg, "e1", to = "d", attr = "color") <- "green" current <- mgEdgeData(mg, "e1", attr = "color") target <- structure( list("violet", "red", "violet", "green", "green"), names = nms) checkEquals(target, current) mgEdgeData(mg, "e1", from = "b", attr = "color") <- c("pink") current <- mgEdgeData(mg, "e1", attr = "color") target <- structure( list("pink", "red", "violet", "green" ,"pink"), names = nms) checkEquals(target, current) checkException(mgEdgeData(mg, "e1", attr = "class")) checkException(mgEdgeData(mg, "e9", attr = "color")) } test_MultiGraph_edgeAttributes_directed_S4 <- function() { ## Check directed edge mg <- make_mixed_MultiGraph()$g df <- extractFromTo(mg)$e1 mgEdgeDataDefaults(mg, "e1", attr = "color") <- "unknown" mgEdgeData(mg, "e1", from = c("a"), to = c("b"), attr = "color") <- df current <- mgEdgeData(mg, "e1", attr = "color") nms <- paste( c("b", "a", "a", "a", "b"), c("a","b", "c", "d", "d"),sep ="|") target <- structure( list( "unknown", df, "unknown", "unknown", "unknown"), names = nms) checkEquals(target, current) mgEdgeData(mg, "e1", to = "d", attr = "color") <- matrix(1) current <- mgEdgeData(mg, "e1", attr = "color") target <- structure( list("unknown", df, "unknown", matrix(1), matrix(1)), names = nms) checkEquals(target, current) mgEdgeData(mg, "e1", from = "b", attr = "color") <- matrix(0) current <- mgEdgeData(mg, "e1", attr = "color") target <- structure( list(matrix(0), df, "unknown", matrix(1), matrix(0)), names = nms) checkEquals(target, current) checkException(mgEdgeData(mg, "e1", attr = "class")) checkException(mgEdgeData(mg, "e9", attr = "color")) } test_MultiGraph_edgeAttributes_undirected <- function() { ## Check undirected edge mg <- make_mixed_MultiGraph()$g mgEdgeDataDefaults(mg, "e3", attr = "color") <- "unknown" mgEdgeData(mg, "e3", from = c("a"), to = c("b"), attr = "color") <- "red" current <- mgEdgeData(mg, "e3", to = "a", attr = "color") nms <- paste( c("b", "c", "x"), rep("a", 3), sep = "|") target <- structure(list("red", "unknown", "unknown"), names = nms) checkEquals(target, current) mgEdgeData(mg, "e3", to = "c", attr = "color") <- "green" current <- mgEdgeData(mg, "e3", to = "c", attr = "color") nms <- paste(c("a", "x"), c("c", "c"), sep = "|") target <- structure( list("green", "green"), names = nms) checkEquals(target, current) mgEdgeData(mg, "e3", from = "b", attr = "color") <- c("pink") current <- mgEdgeData(mg, "e3", attr = "color") nms <- paste(c("a", "a", "a", "c", "x", "b", "c", "x", "x", "y"), c("b", "c", "x", "x", "y", "a", "a", "a", "c", "x"), sep ="|") target <- structure( list("pink", "green", "unknown", "green", "unknown", "pink", "green", "unknown", "green", "unknown"), names = nms) checkEquals(target, current) } test_MultiGraph_edgeAttributes_undirected_S4 <- function() { ## Check undirected edge mg <- make_mixed_MultiGraph()$g mgEdgeDataDefaults(mg, "e3", attr = "color") <- "unknown" mgEdgeData(mg, "e3", from = c("a"), to = c("b"), attr = "color") <- matrix(1) current <- mgEdgeData(mg, "e3", to = "a", attr = "color") nms <- paste( c("b", "c", "x"), rep("a", 3), sep = "|") target <- structure(list(matrix(1), "unknown", "unknown"), names = nms) checkEquals(target, current) df <- data.frame(1:2) mgEdgeData(mg, "e3", to = "c", attr = "color") <- df current <- mgEdgeData(mg, "e3", to = "c", attr = "color") nms <- paste(c("a", "x"), c("c", "c"), sep = "|") target <- structure( list(df, df), names = nms) checkEquals(target, current) mgEdgeData(mg, "e3", from = "b", attr = "color") <- matrix(0) current <- mgEdgeData(mg, "e3", attr = "color") nms <- paste(c("a", "a", "a", "c", "x", "b", "c", "x", "x", "y"), c("b", "c", "x", "x", "y", "a", "a", "a", "c", "x"), sep ="|") target <- structure( list(matrix(0), df, "unknown", df, "unknown", matrix(0), df, "unknown", df, "unknown"), names = nms) checkEquals(target, current) } test_MultiGraph_edgeAttributes_empty <- function() { mg <- make_mixed_MultiGraph()$g checkException(mgEdgeData(mg, "e4", from ="a", attr = "color") <- "green") checkException(mgEdgeData(mg, "e4", attr = "color")) } test_MultiGraph_edgeAttributes_subGraph <- function() { mg <- make_mixed_MultiGraph()$g mgEdgeDataDefaults(mg, "e1", attr = "color") <- "violet" mgEdgeData(mg, "e1", attr = "color") <- "red" mgEdgeData(mg, "e1", from = c("a", "a"), to = c("b", "c"), attr = "color") <- c("yellow", "pink") current <- mgEdgeData(mg,"e1", attr ="color") nms <- paste(c("b", "a", "a", "a", "b"), c("a", "b", "c", "d", "d"), sep = "|") target <- structure(list("red", "yellow", "pink", "red", "red"), names = nms) checkEquals(target, current) sg <- subGraph(c("a","c", "d"), mg) current <- mgEdgeData(sg, "e1", attr = "color") nms <- paste(c("a", "a"), c("c", "d"), sep ="|") target <- structure( list("pink", "red"), names = nms) checkEquals(target, current) } test_MultiGraph_Intersection_Attributes <- function(use.factors=TRUE){ setClass("myType", representation = representation(typ ="character")) myType <- function(typ){ new("myType", typ = typ)} colorFun <- function(x,y) { if(x@typ =="low" || y@typ == "med") return("low") else return("high") } typeFun <- function(x,y) { if(is(x, "myType") && is(y, "myType")){ if(x@typ =="low" || y@typ == "med") return("low") else return("high") } else {return (NA)} } edgeFun <- structure(rep(list(structure( list(colorFun), names = "myType")),2), names = c("e1", "e2")) ft1 <- data.frame(from=c("a", "b", "b", "f"), to=c("b", "c", "d", "g"), weight=c(1, 2, 3, 4), stringsAsFactors = use.factors) ft2 <- data.frame(from =c("e", "f", "a", "b", "f"), to =c( "a", "a", "b", "c", "c"), weight =c(2, 3, 4, 5, 9), stringsAsFactors= use.factors) esets <- list(e1=ft1, e2=ft2) g1 <- MultiGraph(esets) mgEdgeDataDefaults(g1, "e1", attr = "color") <- "violet" mgEdgeData(g1, "e1", from = c("b", "b", "f"), to = c("c", "d", "g"), attr = "color") <- c ("red", "green", "green") mgEdgeDataDefaults(g1, "e2", attr = "color") <- "violet" mgEdgeData(g1, "e2", from = c("b", "f"), to = c("c", "c"), attr = "color") <- c("red", "green") mgEdgeDataDefaults(g1, "e1", attr = "myType") <- "missing" mgEdgeData(g1, "e1", from = c("b", "f"), to = c("c", "g"), attr = "myType") <- c(myType("low"), myType("high")) mgEdgeDataDefaults(g1, "e2", attr = "myType") <- "missing" mgEdgeData(g1, "e2", from = c("a", "f"), to = c("b", "c"), attr = "myType") <- c(myType("high"), myType("low")) ft1 <- data.frame(from=c("b", "f"), to=c("c", "g"), weight=c(2, 3), stringsAsFactors = use.factors) ft2 <- data.frame(from =c("a", "f"), to =c( "b", "c"), weight =c(4, 6), stringsAsFactors= use.factors) esets <- list(e1=ft1, e2=ft2) g2 <- MultiGraph(esets) mgEdgeDataDefaults(g2, "e1", attr = "color") <- "violet" mgEdgeData(g2, "e1", from = c("b", "f"), to = c("c", "g"), attr = "color") <- c ("red", "green") mgEdgeDataDefaults(g2, "e2", attr = "color") <- "violet" mgEdgeData(g2, "e2", from = c("a", "f"), to = c("b", "c"), attr = "color") <- c("red", "green") mgEdgeDataDefaults(g2, "e1", attr="myType") <- "unknown" mgEdgeData(g2, "e1", from = c("b", "f"), to = c("c", "g"), attr = "myType") <- c(myType("med"), myType("high")) mgEdgeDataDefaults(g2, "e2", attr="myType") <- "unknown" mgEdgeData(g2, "e2", from = c("a", "f"), to = c("b", "c"), attr = "myType") <- c(myType("high"), myType("med")) nodeDataDefaults(g1, attr = "color") <- "violet" nodeDataDefaults(g2, attr = "color") <- "violet" nodeDataDefaults(g1, attr= "type") <- "unknown" nodeDataDefaults(g2, attr = "type") <- "unknown" nodeData(g1,n = c("a", "b", "c"), attr ="color") <- c("red", "green", "blue") nodeData(g1,n = c("b", "c"), attr ="type") <- c(myType("low"), myType("high")) nodeData(g2,n = c("a", "b", "c"), attr ="color") <- c("red", "green", "red") nodeData(g2,n = c("b", "c"), attr ="type") <- c(myType("med"), myType("low")) res <- graphIntersect(g1, g2, nodeFun = list(type =typeFun), edgeFun = edgeFun) current <- mgEdgeData(res,"e1", attr = "weight") target <- structure(list(2, as.numeric(NA)), names = paste(c("b", "f"), c("c", "g"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e1", attr = "color") target <- structure(list("red", "green"), names = paste(c("b", "f"), c("c", "g"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e2", attr = "weight") target <- structure(list(4, as.numeric(NA)), names = paste(c("a", "f"), c("b", "c"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e2", attr = "color") target <- structure(list(as.character(NA), "green"), names = paste(c("a", "f"), c("b", "c"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e1", attr = "myType") target <- structure(list("low", "high"), names = paste(c("b", "f"), c("c", "g"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e2", attr = "myType") target <- structure(list("high", "low"), names = paste(c("a", "f"), c("b", "c"), sep="|")) checkEquals(target, current) nodeColor <- nodeData(res, attr = "color") target <- as.list(structure(c("red", "green", NA, "violet", "violet"), names = c("a", "b", "c", "f", "g"))) checkEquals(target, nodeColor) nodeType <- nodeData(res, attr = "type") target <- as.list(structure(c("unknown", "low", "high", "unknown", "unknown"), names = c("a", "b", "c", "f", "g"))) checkEquals(target, nodeType) } test_MultiGraph_Union_Attributes <- function(use.factors=TRUE){ setClass("myType", representation = representation(typ ="character")) myType <- function(typ){ new("myType", typ = typ)} typeFun <- function(x,y) { if(is(x, "myType") && is(y, "myType")){ if(x@typ =="low" || y@typ == "med") return("low") else return("high") } else {return (NA)} } funList <- structure(rep(list(structure( list(typeFun), names = "myType")),2), names = c("e1", "e2")) ft1 <- data.frame(from=c("a", "b", "b", "f"), to=c("b", "c", "d", "g"), weight=c(1, 2, 3, 4), stringsAsFactors = use.factors) ft2 <- data.frame(from =c("e", "f", "a", "b", "f"), to =c( "a", "a", "b", "c", "c"), weight =c(2, 3, 4, 5, 9), stringsAsFactors= use.factors) esets <- list(e1=ft1, e2=ft2) g1 <- MultiGraph(esets) mgEdgeDataDefaults(g1, "e1", attr = "color") <- "violet" mgEdgeData(g1, "e1", from = c("b", "b", "f"), to = c("c", "d", "g"), attr = "color") <- c ("red", "green", "green") mgEdgeDataDefaults(g1, "e2", attr = "color") <- "violet" mgEdgeData(g1, "e2", from = c("b", "f"), to = c("c", "c"), attr = "color") <- c("red", "green") mgEdgeDataDefaults(g1, "e1", attr ="myType") <- "unknown" mgEdgeData(g1, "e1", from = c("b", "f"), to = c("c", "g"), attr = "myType") <- c(myType("low"), myType("high")) mgEdgeDataDefaults(g1, "e2", attr ="myType") <- "unknown" mgEdgeData(g1, "e2", from = c("a", "f"), to = c("b", "c"), attr = "myType") <- c(myType("high"), myType("low")) ft1 <- data.frame(from=c("b", "f"), to=c("c", "g"), weight=c(2, 3), stringsAsFactors = use.factors) ft2 <- data.frame(from =c("a", "f"), to =c( "b", "c"), weight =c(4, 6), stringsAsFactors= use.factors) esets <- list(e1=ft1, e2=ft2) g2 <- MultiGraph(esets) mgEdgeDataDefaults(g2, "e1", attr = "color") <- "violet" mgEdgeData(g2, "e1", from = c("b", "f"), to = c("c", "g"), attr = "color") <- c ("red", "green") mgEdgeDataDefaults(g2, "e2", attr = "color") <- "violet" mgEdgeData(g2, "e2", from = c("a", "f"), to = c("b", "c"), attr = "color") <- c("red", "green") mgEdgeDataDefaults(g2, "e1", attr = "myType") <- "unknown" mgEdgeData(g2, "e1", from = c("b", "f"), to = c("c", "g"), attr = "myType") <- c(myType("med"), myType("high")) mgEdgeDataDefaults(g2, "e2", attr = "myType") <- "unknown" mgEdgeData(g2, "e2", from = c("a", "f"), to = c("b", "c"), attr = "myType") <- c(myType("high"), myType("med")) res <- graphUnion(g1, g2, edgeFun = funList) current <- mgEdgeData(res,"e1", attr = "weight") target <- structure(list(1, 2, 3, as.numeric(NA)), names = paste(c("a", "b", "b", "f"), c( "b", "c", "d", "g"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e1", attr = "color") target <- structure(list("violet", "red", "green", "green"), names = paste(c("a", "b", "b", "f"), c("b", "c", "d", "g"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e2", attr = "weight") target <- structure(list(2, 3, 4, 5, as.numeric(NA)), names = paste(c("e", "f", "a", "b", "f"), c("a", "a", "b", "c", "c"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e2", attr = "color") target <- structure(list( "violet", "violet", as.character(NA), "red", "green"), names = paste(c("e", "f", "a", "b", "f"), c("a", "a", "b", "c", "c"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e1", attr = "myType") target <- structure(list("unknown", "low", "unknown", "high"), names = paste(c("a", "b", "b", "f"), c("b", "c", "d", "g"), sep="|")) checkEquals(target, current) current <- mgEdgeData(res,"e2", attr = "myType") target <- structure(list("unknown", "unknown", "high", "unknown","low"), names = paste(c("e", "f", "a", "b", "f"), c("a", "a", "b", "c", "c"), sep="|")) checkEquals(target, current) } test_MultiGraph_nodeUnion_Attributes <- function(use.factors=TRUE){ setClass("myType", representation = representation(typ ="character")) myType <- function(typ){ new("myType", typ = typ)} testFun <- function(x,y) { if(is(x, "myType") && is(y, "myType")){ if(x@typ =="aa" || y@typ == "ac") return("ax") else return("notype") } else return("ab") } funList <- structure(list(testFun), names ="gene") ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to =c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a"), to=c("b", "c"), weight=c(3.4, 2.6), stringsAsFactors = use.factors) ft3 <- data.frame(from=c("a", "a"), to =c("d", "b"), weight=c(1,2), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2, e3=ft3, e4=ft2[FALSE, ], e5=ft3[FALSE, ]) g1 <- MultiGraph(esets, directed = c(TRUE, FALSE, TRUE, TRUE, FALSE)) nodeDataDefaults(g1, attr = "color") <- "violet" nodeData(g1, n = c("a", "b", "c") , attr = "color") <- c("red", "green", "blue") nodeDataDefaults(g1, attr = "type") <- "unknown" nodeData(g1, n = c("a", "b"), attr = "type") <- c("low", "high") nodeDataDefaults(g1, attr = "kp") <- "kpunknown" nodeData(g1, n = c("a", "b"), attr = "kp") <- c("kplow", "kphigh") nodeDataDefaults(g1, attr = "gene") <- "XX" nodeData(g1, n = c("a", "b"), attr = "gene") <- c(myType("aa"), myType("bt")) ft1 <- data.frame(from=c("a", "a", "b"), to=c("b", "x", "z"), weight=c(6, 5, 2), stringsAsFactors = use.factors) ft2 <- data.frame(from=c("a", "a", "a"), to=c("a", "x", "y"), weight=c(1, 2, 3), stringsAsFactors = use.factors) esets <- list(e1=ft1, e2=ft2) g2 <- MultiGraph(esets, directed = c(TRUE, FALSE)) nodeDataDefaults(g2, attr ="color") <- "violet" nodeData(g2, n = c("a", "b", "x", "y", "z") , attr = "color") <- c("red", "red", "green", "pink", "yellow") nodeDataDefaults(g2, attr ="type") <- "unknown" nodeData(g2, n = c("a", "b"), attr = "type") <- c("low", "high") nodeDataDefaults(g2, attr ="gene") <- "XX" nodeData(g2, n = c("a", "b"), attr = "gene") <- c(myType("at"), myType("kt")) res <- graphUnion(g1, g2, nodeFun = funList ) current <- nodeData(res, attr = "color") target <- as.list( structure(c("red", NA, "blue", "violet", "green", "pink", "yellow"), names = c("a", "b", "c", "d", "x", "y", "z"))) checkEquals(target, current) current <- nodeData(res, attr = "type") target <- as.list( structure(c("low", "high", "unknown", "unknown", "unknown", "unknown", "unknown"), names = c("a", "b", "c", "d", "x", "y", "z"))) checkEquals(target, current) current <- nodeData(res, attr = "kp") cn <- "kpunknown" target <- as.list( structure(c("kplow", "kphigh", cn, cn, cn, cn, cn), names = c("a", "b", "c", "d", "x", "y", "z"))) checkEquals(target, current) current <- nodeData(res, n =c("a", "b"), attr ="gene") target <- as.list( structure(c("ax", "notype"), names = c("a", "b"))) checkEquals(target, current) current <- nodeData(res, n = c("c", "d", "x", "y", "z"), attr ="gene") target <- as.list( structure(c( "XX", "XX", "XX", "XX", "XX"), names = c("c", "d", "x", "y", "z"))) checkEquals(target, current) } graph/inst/unitTests/attrData_test.R0000644000175100017510000001145212607264574020620 0ustar00biocbuildbiocbuildbasicProps <- list(weight=1, color="blue", friends=c("bob", "alice")) testCreation <- function() { aset <- new("attrData", defaults=basicProps) checkEquals(TRUE, is(aset, "attrData")) } testDefaultAttributesGetting <- function() { aset <- new("attrData", defaults=basicProps) ## Get the entire list checkEquals(basicProps, attrDefaults(aset)) ## Get a single attribute checkEquals(basicProps$weight, attrDefaults(aset, attr="weight")) checkEquals(basicProps$friends, attrDefaults(aset, attr="friends")) ## It is an error to ask for an undefined attr checkException(attrDefaults(aset, attr="NOSUCHATTRIBUTE"), silent=TRUE) ## You can only ask for one attr at a time checkException(attrDefaults(aset, attr=c("weight", "friends")), silent=TRUE) } testDefaultAttributesSetting <- function() { aset <- new("attrData", defaults=basicProps) ## Edit default value, type changes are allowed attrDefaults(aset, attr="weight") <- 100 checkEquals(100, attrDefaults(aset, attr="weight")) ## Add a new attribute attrDefaults(aset, attr="size") <- c(1, 2) checkEquals(c(1, 2), attrDefaults(aset, attr="size")) ## This is sort of dangerous, but for now, we'll allow it. ## I would prefer the attributes to be write-once and there ## forever. Or at least a special interface to remove unwanted... newProps <- list(dir="home", size=100) attrDefaults(aset) <- newProps checkEquals(newProps, attrDefaults(aset)) } testItemGettingAndSettingSimple <- function() { aset <- new("attrData", defaults=basicProps) ## access to defaults checkEquals(1, attrDataItem(aset, x="k1", attr="weight")[[1]]) expect <- as.list(rep(1, 3)) names(expect) <- letters[1:3] checkEquals(expect, attrDataItem(aset, x=letters[1:3], attr="weight")) ## mixed custom/defaults attrDataItem(aset, x="k1", attr="weight") <- 900 checkEquals(900, attrDataItem(aset, x="k1", attr="weight")[[1]]) ## Retrieve entire attribute list expect <- basicProps expect[["weight"]] <- 900 checkEquals(expect, attrDataItem(aset, x=c("k1", "newone"))[[1]]) checkEquals(basicProps, attrDataItem(aset, x=c("k1", "newone"))[[2]]) ## error on unknown attrs checkException(attrDataItem(aset, "k1", "UNKNOWN"), silent=TRUE) checkException(attrDataItem(aset, "k1", "UNKNOWN") <- "BAD", silent=TRUE) } testItemGettingAndSettingVectorized <- function() { aset <- new("attrData", defaults=basicProps) keys <- c("k1", "k2", "k3") ## Set multiple with same value 1 attrDataItem(aset, x=keys, attr="weight") <- 222 expectPerElem <- basicProps expectPerElem[["weight"]] <- 222 for(k in keys) checkEquals(expectPerElem, attrDataItem(aset, k)[[1]]) ## Set multiple with same value 2 complexVal <- list(a=as.list(1:3), b="ccc", c=1:5) attrDataItem(aset, x=keys, attr="weight") <- list(complexVal) expectPerElem <- basicProps expectPerElem[["weight"]] <- complexVal checkEquals(expectPerElem, attrDataItem(aset, "k1")[[1]]) checkEquals(expectPerElem, attrDataItem(aset, "k2")[[1]]) checkEquals(expectPerElem, attrDataItem(aset, "k3")[[1]]) ## Set multiple with same value 3 complexVal <- list(a=as.list(1:3), b="ccc", c=1:5, d="extra") attrDataItem(aset, x=keys, attr="weight") <- list(complexVal) expectPerElem <- basicProps expectPerElem[["weight"]] <- complexVal for(k in keys) checkEquals(expectPerElem, attrDataItem(aset, k)[[1]]) ## Set multiple with distinct values 1 wVect <- c(10, 20, 30) attrDataItem(aset, x=keys, attr="weight") <- wVect for (i in 1:length(wVect)) checkEquals(wVect[i], attrDataItem(aset, keys[i], "weight")[[1]]) ## Set multiple with distinct values 2 wVect <- list(list(a=1), list(a=2), list(a=3)) attrDataItem(aset, x=keys, attr="weight") <- wVect for (i in 1:length(wVect)) checkEquals(wVect[[i]], attrDataItem(aset, keys[i], "weight")[[1]]) } testItemRemovalSimple <- function() { aset <- new("attrData", defaults=basicProps) attrDataItem(aset, x="k1", attr="weight") <- 900 checkEquals(900, attrDataItem(aset, x="k1", attr="weight")[[1]]) removeAttrDataItem(aset, x="k1") <- NULL checkEquals(1, attrDataItem(aset, x="k1", attr="weight")[[1]]) } testNames <- function() { aset <- new("attrData", defaults=basicProps) attrDataItem(aset, x=letters, attr="weight") <- 1:26 checkEquals(letters, names(aset)) names(aset) <- LETTERS checkEquals(LETTERS, names(aset)) ## must have right length checkException(names(aset) <- letters[1:4], silent=TRUE) ## can't have NA bad <- letters bad[11] <- NA checkException(names(aset) <- bad, silent=TRUE) ## can't have duplicates bad[11] <- "b" checkException(names(aset) <- bad, silent=TRUE) } graph/inst/unitTests/clusterGraph_test.R0000644000175100017510000000057112607264574021517 0ustar00biocbuildbiocbuildbasicCluserGraph <- function() { new("clusterGraph", clusters=list( a=c(1,2,3), b=c(4,5,6))) } rename_nodes_test <- function() { g <- basicCluserGraph() checkEquals(as.character(1:6), nodes(g)) nodes(g) <- letters[1:6] checkEquals(letters[1:6], nodes(g)) checkEquals(letters[1:6], names(edges(g))) } graph/inst/unitTests/degree_test.R0000644000175100017510000000114712607264574020307 0ustar00biocbuildbiocbuildlibrary("graph") data(graphExamples) data(apopGraph) test_degree_undirected <- function() { g <- graphExamples[[1]] want <- as.integer(c(5, 5, 1, 5, 5, 5, 0, 6, 0, 0)) names(want) <- nodes(g) checkEquals(want, degree(g)) gam <- as(g, "graphAM") checkEquals(want, degree(g)) } test_degree_directed <- function() { want_in <- c(TRF1=1L, "NF-kB"=4L, CASP2=2L, Daxx=0L) want_out <- c(TRF1=1L, "NF-kB"=1L, CASP2=0L, Daxx=1L) got <- degree(apopGraph, c("TRF1", "NF-kB", "CASP2", "Daxx")) checkEquals(want_in, got[["inDegree"]]) checkEquals(want_out, got[["outDegree"]]) } graph/inst/unitTests/edgeWeights_test.R0000644000175100017510000000340512607264574021312 0ustar00biocbuildbiocbuildegGraphAM <- function() { mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- colnames(mat) <- letters[1:4] gam <- graphAM(adjMat=mat, edgemode="directed") } testDefaultIsOnes <- function() { gam <- egGraphAM() expect <- list(a=c(c=1, d=1), b=c(c=1), c=numeric(0), d=c(b=1, c=1)) checkEquals(expect, edgeWeights(gam)) checkEquals(expect[c("a", "d")], edgeWeights(gam, c("a", "d"))) checkEquals(expect[c("a", "d")], edgeWeights(gam, c(1, 4))) ## Also test alternate attr name when undefined checkEquals(expect, edgeWeights(gam, attr="foobar")) } testSettingDefaultValue <- function() { gam <- egGraphAM() expect <- list(a=c(c=4, d=4), b=c(c=4), c=numeric(0), d=c(b=4, c=4)) checkEquals(expect, edgeWeights(gam, default=4)) checkEquals(expect[c("a", "d")], edgeWeights(gam, c("a", "d"), default=4)) checkEquals(expect[c("a", "d")], edgeWeights(gam, c(1, 4), default=4)) } testTypeChecker <- function() { gam <- egGraphAM() simple <- list(a=c(c=1, d=1), b=c(c=1), c=numeric(0), d=c(b=1, c=1)) expect <- list(a=c(c=5:5, d=6:6), b=c(c=4:4), c=numeric(0), d=c(b=4:4, c=4:4)) edgeDataDefaults(gam, attr="foo") <- 4:4 edgeData(gam, from="a", attr="foo") <- c(5:5, 6:6) checkException(edgeWeights(gam, attr="foo", type.checker=is.double), silent=TRUE) checkException(edgeWeights(gam, type.checker=is.integer)) checkEquals(expect, edgeWeights(gam, attr="foo")) checkEquals(expect, edgeWeights(gam, attr="foo", type.checker=is.integer)) checkEquals(simple, edgeWeights(gam)) } graph/inst/unitTests/graphAM_test.R0000644000175100017510000004131412607264574020373 0ustar00biocbuildbiocbuildsimpleAdjMat <- function() { ## Here's a simple graph for testing ## a b ## |\ /| ## | \___c___/ | ## | | | ## \ | / ## \____d____/ ## ## mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] mat } simpleDirectedGraph <- function() { ## Here's a simple graph for testing ## a b ## |\ /^ ## | \__>c<__/ | ## | ^ | ## \ | / ## \___>d____/ ## ## mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] mat graphAM (adjMat=mat, edgemode="directed") } testConstructorFunction <- function() { ## no-argument constructor adjMat <- matrix(integer(), 0, 0) target <- new("graphAM", adjMat=adjMat) checkIdentical(target, graphAM()) ## adjMat constructor adjMat <- simpleAdjMat() target <- new("graphAM", adjMat=adjMat, edgemode="directed") checkIdentical(target, graphAM(adjMat, "directed")) target <- new("graphAM", adjMat=adjMat, edgemode="undirected") checkIdentical(target, graphAM(adjMat, "undirected")) checkIdentical(target, graphAM(adjMat)) ## values: adjacency matrix non-zero (and necessarily positive) values ## will be used as edge weights, an edge attribute. the -1 is ignored ## in all cases, but retrievable via edgeDataDefaults ## values is to contain exactly one name, and one value ## the name indicates the edge attribute, whose values come from the ## elements of the adjacency matrix: often, but not necessarily, set to 1 values <- list(weight=-1) target <- new("graphAM", adjMat=adjMat, edgemode="directed", values=values) checkEquals (edgeData(target, 'a', 'c', attr='weight')[[1]], 1) checkEquals (edgeDataDefaults(target, 'weight'), -1) checkIdentical(target, graphAM(adjMat, "directed", values)) } testInvalidNonSquare <- function() { mat <- cbind(c(0, 0, 1), c(1, 1, 1)) checkException(graphAM (adjMat=mat), silent=TRUE) } testInvalidNegativeValues <- function() { mat <- matrix(c(0, 1, -4, -1), ncol=2) checkException(graphAM (adjMat=mat), silent=TRUE) } testInvalidNonSymmetric <- function() { mat <- matrix(c(0, 1, 1, 0, 0, 1, 0, 0, 0), ncol=3, byrow=TRUE) colnames(mat) <- letters[1:3] checkException(graphAM (adjMat=mat), silent=TRUE) checkException(graphAM (adjMat=mat, edgemode="undirected"), silent=TRUE) g1 <- graphAM (adjMat=mat, edgemode="directed") } testInvalidBadNodeNames <- function() { mat <- simpleAdjMat() n <- paste(letters[1:4], 1:4, sep=graph:::EDGE_KEY_SEP) colnames(mat) <- rownames(mat) <- n checkException(graphAM (adjMat=mat), silent=TRUE) colnames(mat) <- rownames(mat) <- c("a", "b", NA, "c") checkException(graphAM (adjMat=mat), silent=TRUE) colnames(mat) <- rownames(mat) <- c("a", "f", "", "d") checkException(graphAM (adjMat=mat), silent=TRUE) } test_empty_graph <- function() { mat <- matrix(integer(0), nrow=0, ncol=0) g <- graphAM (adjMat = mat) checkEquals(0L, numNodes(g)) checkEquals(0L, numEdges(g)) checkEquals(character(0), nodes(g)) checkEquals(list(), edges(g)) m <- as(g, "matrix") checkEquals(c(0L, 0L), dim(m)) checkEquals(0L, length(m)) g <- graphAM (adjMat = mat, values = list(weight = 1L)) checkEquals(0L, numNodes(g)) checkEquals(0L, numEdges(g)) checkEquals(character(0), nodes(g)) checkEquals(list(), edges(g)) m <- as(g, "matrix") checkEquals(c(0L, 0L), dim(m)) checkEquals(0L, length(m)) } test_no_edge_graph <- function() { mat <- matrix(0L, nrow=3, ncol=3, dimnames=list(letters[1:3], letters[1:3])) g <- graphAM (adjMat = mat) checkEquals(letters[1:3], nodes(g)) checkEquals(0L, numEdges(g)) want <- list(a = character(0), b = character(0), c = character(0)) checkEquals(want, edges(g)) m <- as(g, "matrix") checkEquals(c(3L, 3L), dim(m)) checkTrue(all(m == 0L)) g <- graphAM (adjMat = mat, values = list(weight = 1L)) checkEquals(letters[1:3], nodes(g)) checkEquals(0L, numEdges(g)) checkEquals(want, edges(g)) m <- as(g, "matrix") checkEquals(c(3L, 3L), dim(m)) checkTrue(all(m == 0L)) } testValuesToAttr <- function() { mat <- matrix(c(0, 0, 1, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 4, 5, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] g1 <- graphAM (adjMat=mat, edgemode="directed", values=list(weight=1)) checkEquals(4, edgeData(g1, "d", "b", attr="weight")[[1]]) checkEquals(3, edgeData(g1, "b", "c", attr="weight")[[1]]) checkEquals(2, edgeData(g1, "a", "d", attr="weight")[[1]]) checkEquals(1, edgeData(g1, "a", "c", attr="weight")[[1]]) checkException(graphAM (adjMat=mat, edgemode="directed", values=list(weight=1, not=2)), silent=TRUE) checkException(graphAM (adjMat=mat, edgemode="directed", values=list("must", "name")), silent=TRUE) checkException(graphAM (adjMat=mat, edgemode="directed", values="weight"), silent=TRUE) g1 <- graphAM (adjMat=mat, edgemode="directed", values=list(type=4)) checkEquals(4, edgeData(g1, "d", "b", attr="type")[[1]]) checkEquals(3, edgeData(g1, "b", "c", attr="type")[[1]]) checkEquals(2, edgeData(g1, "a", "d", attr="type")[[1]]) checkEquals(1, edgeData(g1, "a", "c", attr="type")[[1]]) } testEdges <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) got <- edges(g1) expect <- list(a=c("c", "d"), b=c("c", "d"), c=c("a", "b", "d"), d=c("a", "b", "c")) checkEquals(expect, got) got <- edges(g1, c("a", "d")) expect <- expect[c("a", "d")] checkEquals(expect, got) } testEdgesDirected <- function() { g1 <- simpleDirectedGraph() expect <- list(a=c("c", "d"), b="c", c=character(0), d=c("b", "c")) checkEquals(expect, edges(g1)) } testEdgesSubset <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) got <- edges(g1) expect <- list(a=c("c", "d"), d=c("a", "b", "c")) got <- edges(g1, c("a", "d")) checkEquals(expect, got) } testNodeNames <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) got <- nodes(g1) expect <- letters[1:4] checkEquals(expect, got) } testNodeNamesReplace <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) nodes(g1) <- LETTERS[1:4] expect <- LETTERS[1:4] checkEquals(expect, nodes(g1)) } testNumNodes <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) checkEquals(nrow(mat), numNodes(g1)) } testNumEdges <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) checkEquals(5, numEdges(g1)) edgemode(g1) <- "directed" checkEquals(10, numEdges(g1)) } testNumEdgesWithSelfLoop <- function() { mat <- matrix(c(1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0), ncol=4) g1 <- graphAM (adjMat=mat) checkEquals(4, numEdges(g1)) } testIsAdjacent <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) checkEquals(TRUE, isAdjacent(g1, "a", "c")) checkEquals(TRUE, isAdjacent(g1, "c", "a")) checkEquals(FALSE, isAdjacent(g1, "a", "b")) checkEquals(FALSE, isAdjacent(g1, "b", "a")) checkException(isAdjacent(g1, "z", "a"), silent=TRUE) checkException(isAdjacent(g1, "a", "z"), silent=TRUE) } testIsAdjacentVectorized <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) fr <- c("a", "c", "a", "b") to <- c("c", "a", "b", "a") expect <- c(TRUE, TRUE, FALSE, FALSE) checkEquals(expect, isAdjacent(g1, fr, to)) checkEquals(expect, isAdjacent(g1, to, fr)) } ## testSubgraph <- function() { ## mat <- simpleAdjMat() ## g1 <- graphAM (adjMat=mat) ## g2 <- subgraph(c("a", "b", "c"), ffff) ## } testSimpleEdgeWeights <- function() { mat <- simpleAdjMat() g <- graphAM (mat) checkEquals(nodes(g), names(edgeWeights(g))) expect <- c(c=1:1, d=1:1) checkEquals(expect, edgeWeights(g)$a) } testAddNode <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) newNodes <- c("r", "s", "a", "b") checkException(addNode(newNodes, g1), silent=TRUE) newNodes <- c("r", "s") expect <- c(nodes(g1), newNodes) g1 <- addNode(newNodes, g1) checkEquals(expect, nodes(g1)) badNodeName <- paste("foo", graph:::EDGE_KEY_SEP, "bar", sep="") checkException(addNode(badNodeName, g1), silent=TRUE) } testAddEdge <- function() { ## I would like different order of the args in the generic, but not sure it is ## worth it to change... but would seem more consistent. mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) g1 <- addNode("e", g1) checkEquals(FALSE, isAdjacent(g1, "b", "e")) g1 <- addEdge(graph=g1, from="b", to="e") checkEquals(TRUE, isAdjacent(g1, "b", "e")) } testAddEdgeMultiple <- function() { a <- matrix(0L, nrow=8, ncol=8) dimnames(a) <- list(letters[1:8], letters[1:8]) G <- graphAM (adjMat=a, edgemode = "directed") GU <- graphAM (adjMat=a) ## make sure we don't warn for this call tryCatch({ H <- addEdge(from=c("a", "b", "c"), to=c("d", "e", "f"), G) HU <- addEdge(from=c("a", "b", "c"), to=c("d", "e", "f"), GU) }, warning = function(w) stop("unwanted warning message: ", conditionMessage(w))) expect <- a fr <- c("a", "b", "c") to <- c("d", "e", "f") wh <- cbind(match(fr, letters[1:8]), match(to, letters[1:8])) expect[wh] <- 1L checkEquals(expect, as(H, "matrix")) expectU <- expect expectU[wh[ , c(2L, 1L)]] <- 1L checkEquals(expectU, as(HU, "matrix")) } testClearNode <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) edgeDataDefaults(g1, attr="weight") <- 1 edgeData(g1, "a", "c", attr="weight") <- 400 checkEquals(TRUE, isAdjacent(g1, "a", "c")) checkEquals(TRUE, isAdjacent(g1, "a", "d")) checkEquals(400, edgeData(g1, "a", "c", attr="weight")[[1]]) g1 <- clearNode("a", g1) checkEquals(FALSE, isAdjacent(g1, "a", "c")) checkEquals(FALSE, isAdjacent(g1, "a", "d")) checkException(edgeData(g1, "a", "c", attr="weight"), silent=TRUE) } testRemoveNode <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) origNodes <- nodes(g1) checkEquals(TRUE, "b" %in% origNodes) g1 <- removeNode("b", g1) checkEquals(FALSE, "b" %in% nodes(g1)) } testRemoveEdge <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) checkEquals(TRUE, isAdjacent(g1, "a", "c")) g1 <- removeEdge("a", "c", g1) checkEquals(FALSE, isAdjacent(g1, "a", "c")) } testRemoveEdgeWithWeights <- function() { mat <- simpleAdjMat() mat[mat != 0] <- runif(length(mat[mat != 0])) g <- graphAM (adjMat = mat, edgemode = "directed", values = list(weight = 1.0)) weights <- unlist(edgeData(g, attr = "weight")) toRemove <- names(weights[weights < 0.5]) expect <- numEdges(g) - length(toRemove) fromTo <- do.call(rbind, strsplit(toRemove, "|", fixed = TRUE)) g2 <- removeEdge(fromTo[, 1], fromTo[, 2], g) checkEquals(expect, numEdges(g2)) apply(fromTo, 1, function(row) { checkEquals(FALSE, isAdjacent(g2, row[1], row[2])) }) } testGraphAMCloning <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) origNodes <- nodes(g1) g2 <- g1 ## modify g1 g1 <- addNode("NEW", g1) edgeDataDefaults(g1, "weight") <- 2 edgeDataDefaults(g1, "color") <- "green" ## g2 should not have changed checkEquals(list(), edgeDataDefaults(g2)) checkEquals(origNodes, nodes(g2)) } testUndirectedAsGraphNEL <- function() { mat <- simpleAdjMat() g1 <- graphAM (adjMat=mat) gNel <- as(g1, "graphNEL") checkEquals(edges(g1), edges(gNel)) checkEquals(nodes(g1), nodes(gNel)) checkEquals(edgemode(g1), edgemode(gNel)) checkEquals(edgeDataDefaults(g1), edgeDataDefaults(gNel)) checkEquals(nodeDataDefaults(g1), nodeDataDefaults(gNel)) } testDirectedAsGraphNEL <- function() { g1 <- simpleDirectedGraph() gNel <- as(g1, "graphNEL") checkEquals(edges(g1), edges(gNel)) checkEquals(nodes(g1), nodes(gNel)) checkEquals(edgemode(g1), edgemode(gNel)) checkEquals(edgeDataDefaults(g1), edgeDataDefaults(gNel)) checkEquals(nodeDataDefaults(g1), nodeDataDefaults(gNel)) } testDirectedAsGraphAM <- function() { g1 <- simpleDirectedGraph() gNel <- as(g1, "graphNEL") g2 <- as(gNel, "graphAM") checkEquals(edges(g1), edges(g2)) checkEquals(nodes(g1), nodes(g2)) checkEquals(edgemode(g1), edgemode(g2)) checkEquals(edgeDataDefaults(g1), edgeDataDefaults(g2)) checkEquals(nodeDataDefaults(g1), nodeDataDefaults(g2)) } testInEdges <- function() { g1 <- simpleDirectedGraph() expected <- list(a=character(0), b="d", c=c("a", "b", "d"), d="a") checkEquals(expected, inEdges(g1), msg="gramAM") checkEquals(expected, inEdges(object=g1), msg="gramAM") checkEquals(expected, inEdges(node=g1), msg="gramAM") } testNoEdges <- function() { m <- matrix(0, nrow=3, ncol=3) g <- graphAM (m) checkEquals(0, numEdges(g)) checkEquals(3, length(edges(g))) checkEquals(nodes(g), names(edges(g))) checkEquals(0, sum(sapply(edges(g), length))) } testAsMatrix <- function() { mat <- rbind(c(0, 0, 12, 1), c(0, 0, 1, 1), c(12, 1, 0, 1), c(1, 1, 1, 0)) rownames(mat) <- colnames(mat) <- letters[1:4] ## If no values arg, then matrix just converted to 0/1 g1 <- graphAM (adjMat=mat, edgemode="undirected") mat1 <- mat mat1[mat1 != 0] <- 1:1 checkEquals(mat1, as(g1, "matrix")) ## With values arg, matrix values stored as edge attribute ## which gets restored for as(<.>, "matrix") g2 <- graphAM (adjMat=mat, edgemode="undirected", values=list(weight=1)) checkEquals(mat, as(g2, "matrix")) } test_coerce_matrix_to_graphAM <- function() { mat <- matrix(c(0, 0, 1, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 4, 5, 0), byrow=TRUE, ncol=4, dimnames=list(letters[1:4], letters[1:4])) g <- as(mat, "graphAM") checkEquals(mat, as(g, "matrix")) g2 <- graphAM (adjMat=mat, edgemode="directed", values=list("weight"=1)) checkEquals(as(g, "matrix"), as(g2, "matrix")) } test_edgeMatrix <- function() { ugam <- graphAM (adjMat=simpleAdjMat(), edgemode="undirected") gam <- simpleDirectedGraph() expect <- c("1+3", "1+4", "2+3", "2+4", "3+4") got <- edgeMatrix(ugam) checkTrue(setequal(expect, paste(got[1, ], got[2, ], sep="+"))) checkEquals(list(c("from", "to"), NULL), dimnames(got)) expect <- c("1+3", "1+4", "2+3", "4+2", "4+3") got <- edgeMatrix(gam) checkTrue(setequal(expect, paste(got[1, ], got[2, ], sep="+"))) ## duplicates should have no effect on directed graph got <- edgeMatrix(gam, duplicates=TRUE) checkTrue(setequal(expect, paste(got[1, ], got[2, ], sep="+"))) expect <- c("1+3", "1+4", "2+3", "2+4", "3+4", "3+1", "4+1", "3+2", "4+2", "4+3") got <- edgeMatrix(ugam, duplicates=TRUE) checkTrue(setequal(expect, paste(got[1, ], got[2, ], sep="+"))) } test_rename_nodes_edgeWeights <- function() { mat <- matrix(c(0, 0, 1, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 4, 5, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] g <- graphAM (adjMat=mat, edgemode="directed", values=list(weight=1)) ew <- edgeWeights(g) ew <- lapply(ew, function(x) { if (length(x)) names(x) <- toupper(names(x)) x }) names(ew) <- toupper(names(ew)) nodes(g) <- LETTERS[1:4] checkEquals(LETTERS[1:4], nodes(g)) checkEquals(ew, edgeWeights(g)) } test_rename_nodes_nodeData <- function() { g <- simpleDirectedGraph() nodeDataDefaults(g) <- list(type=NA) nodeData(g, n="a", attr="type") <- "the first one" nodeData(g, n="d", attr="type") <- "the last one" ndDef <- nodeDataDefaults(g) nd <- nodeData(g, attr="type") names(nd) <- toupper(names(nd)) nodes(g) <- toupper(nodes(g)) checkEquals(nd, nodeData(g, attr="type")) } graph/inst/unitTests/graphBAM_test.R0000644000175100017510000016646012607264574020507 0ustar00biocbuildbiocbuild## library("graph") set.seed(0x12a9b) library(graph) library(RUnit) randBAMGraph <- function(numNodes = 10 , numEdges = 10) { df <- graph:::randFromTo(numNodes, numEdges) df$ft$weight = seq_len(numNodes) g <- graphBAM(df$ft, nodes = df$nodes, edgemode = "directed") g } make_smallBAM <- function() { from = c("a", "a", "a", "x", "x", "c") to = c("b", "c", "x", "y", "c", "a") weight=c(3.4, 2.6, 1.7, 5.3, 1.6, 7.9) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") g1 } make_unDirectedBAM <- function() { from = c("a", "a", "a", "x", "x", "c") to = c("b", "c", "x", "y", "c", "d") weight=c(3.4, 2.6, 1.7, 5.3, 1.6, 7.9) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "undirected") g1 } create_bigBAM <- function() { r1 <- randFromTo(100, 100) r1$ft$weight <- seq_len(100) g1 <- graphBAM(r1$ft, r1$nodes, edgemode="directed") g1 } test_create_graphBAMSmall <- function() { from = c("a", "d", "d", "b") to = c("b", "a", "d", "c") weight= c(1.5, 3.1, 5.4, 1) nodes = c("a","b","c","d") df <- data.frame(from, to, weight) g1 <- graphBAM(df, nodes, edgemode = "directed") g2 <- graphBAM(df, nodes, edgemode = "undirected") checkEquals(4L, numEdges(g1)) checkEquals(isDirected(g1), TRUE) checkEquals(isAdjacent(g1, c("a", "d", "b"), c("b", "d", "c") ), c(TRUE,TRUE,TRUE)) checkEquals(names(edges(g1)), c("a", "b", "c", "d")) k <- edges(g1) checkEquals(list(k$a, k$b, k$c, k$d), list("b", "c", character(0), c("a", "d"))) w <- edgeWeights(g1) checkEquals(names(w), c("a", "b", "c", "d")) checkEquals(list(w$a, w$b, w$c, w$d), list(structure(1.5, names="b"), structure(1, names="c"), numeric(0), structure(c(3.1, 5.4), names= c("a", "d")))) checkEquals(4L, numNodes(g2)) checkEquals(4L, numEdges(g2)) checkEquals(isDirected(g2), FALSE) checkEquals(isAdjacent(g1, c("a","d","b"), c("b","d","c") ), c(TRUE,TRUE,TRUE)) } test_BAMNodes <- function() { from = c("a", "a", "a", "x", "x", "c") to = c("b", "c", "x", "y", "c", "a") weight=c(3.4, 2.6, 1.7, 5.3, 1.6, 7.9) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") nds <- nodes(g1) checkIdentical(all(nds %in% unique(c(from,to))),TRUE) checkIdentical(isDirected(g1),TRUE) ## node names from = paste0("X", 8:11) to = paste0("X", 8:11) df <- data.frame(from, to, weight=rep(1, 4)) g2 <- graphBAM(df) ## no 'nodes' checkIdentical(nodes(g2), c("X10", "X11", "X8", "X9")) g2 <- graphBAM(df, nodes="X7") ## degree-zero node checkIdentical(nodes(g2), c("X10", "X11", "X7", "X8", "X9")) g2 <- graphBAM(df, nodes=paste0("X", 8:11)) ## forced ordering checkIdentical(nodes(g2), c("X8", "X9", "X10", "X11")) } checkBAMSubGraph <- function(g, subG) { nds <- nodes(g) subNodes <- nodes(subG) w1 <- g@edgeSet@weights ft1 <- .Call(graph:::graph_bitarray_rowColPos, g@edgeSet@bit_vector) origFromTo <- data.frame(from=nds[ft1[,"from"]], to = nds[ft1[,"to"]], weights = w1) w2 <- subG@edgeSet@weights ft2 <- .Call(graph:::graph_bitarray_rowColPos, subG@edgeSet@bit_vector) subFromTo <- data.frame(from = subNodes[ft2[,"from"]], to = subNodes[ft2[,"to"]], weights = w2) indx <- (origFromTo$from %in% subNodes) & (origFromTo$to %in% subNodes) want <- origFromTo[(origFromTo$from %in% subNodes) & (origFromTo$to %in% subNodes),] checkEquals(as.character(want$from), as.character(subFromTo$from)) checkIdentical(as.character(want$to), as.character(subFromTo$to)) checkEquals(g@edgeSet@weights[indx], subG@edgeSet@weights) } test_BAMSubGraph_Small <- function() { g1 <- make_smallBAM() sg <- subGraph(c("a","x", "y"), g1) checkIdentical(isDirected(sg), TRUE) checkIdentical(nodes(sg), c("a", "x", "y")) checkBAMSubGraph(g1,sg) } test_BAMSubGraph_Large <- function() { g1 <- randBAMGraph(100,100) sn <- sample(nodes(g1), 55) sg <- subGraph( sn, g1) checkIdentical(isDirected(sg), TRUE) checkBAMSubGraph(g1,sg) } test_BAM_edgeWeights <- function() { g1 <- make_smallBAM() ew1 <- edgeWeights(g1) checkEquals(names(ew1), c("a", "b", "c", "x", "y")) checkEquals(list(ew1$a, ew1$b, ew1$c, ew1$x, ew1$y), list(structure( c(3.4, 2.6, 1.7), names = c("b","c","x")), numeric(0), structure(c(7.9), names = "a"), structure(c(1.6, 5.3), names= c("c", "y")), numeric(0))) ew2 <- edgeWeights(g1,c("a","b")) ##index = char checkEquals(names(ew2), c("a","b")) checkEquals(list(ew2$a, ew2$b), list(structure( c(3.4, 2.6, 1.7), names = c("b","c","x")), numeric(0))) ew2 <- edgeWeights(g1, 1:2) ##index = numeric checkEquals(names(ew2), c("a","b")) checkEquals(list(ew2$a, ew2$b), list(structure( c(3.4, 2.6, 1.7), names = c("b","c","x")), numeric(0))) } test_BAM_edgeWeights_undirected <- function() { from = c("a", "d", "d", "b", "a") to = c("b", "a", "d", "c", "c") weight = c(1.5, 2.1, 3.4, 4.1, 5.6) df <- data.frame(from, to, weight) gu <- graphBAM(df, nodes="e", edgemode = "undirected") want <- list(a=c(b=1.5, c=5.6, d=2.1), b=c(a=1.5, c=4.1), c=c(a=5.6, b=4.1), d=c(a=2.1, d=3.4), e=numeric(0)) checkEquals(want, edgeWeights(gu)) checkEquals(want[c("c", "a")], edgeWeights(gu, c("c", "a"))) } test_BAM_edges <- function() { g1 <- make_smallBAM() ew1 <- edges(g1) checkEquals(names(ew1), c("a", "b", "c", "x", "y")) checkEquals(list(ew1$a, ew1$b, ew1$c, ew1$x, ew1$y), list( c("b","c","x"), character(0), "a", c("c", "y"), character(0))) ew2 <- edges(g1, c("c", "b")) checkEquals(names(ew2), c("c","b")) checkEquals(list(ew2$c, ew2$b), list("a", character(0))) } test_BAM_adj <- function() { g1 <- make_smallBAM() ew <- adj(g1, c("c", "b")) checkEquals(names(ew), c("c","b")) checkEquals(list(ew$c, ew$b), list("a", character(0))) } test_BAM_edgeMatrix <- function() { g1 <- make_smallBAM() em <- edgeMatrix(g1) checkEquals(em[1,], c(3, 1, 1, 4, 1, 4)) checkEquals(em[2,], c(1, 2, 3, 3, 4, 5)) } test_BAM_adjacencyMatrix <- function() { g1 <- make_smallBAM() checkEquals(edgemode(g1), "directed") checkEquals(nodes(g1), c("a","b","c","x","y")) am <- adjacencyMatrix(g1) checkEquals(rownames(am), nodes(g1)) checkEquals(colnames(am), nodes(g1)) checkEquals(as.integer(am["a",]), c(0, 1, 1, 1, 0)) checkEquals(as.integer(am["b",]), c(0, 0, 0, 0, 0)) checkEquals(as.integer(am["c",]), c(1, 0, 0, 0, 0)) checkEquals(as.integer(am["x",]), c(0, 0, 1, 0, 1)) checkEquals(as.integer(am["y",]), c(0, 0, 0, 0, 0)) } test_BAM_removeEdge_unknown_nodes <- function() { g1 <- make_smallBAM() checkException(removeEdge("a", "q", g1), silent=TRUE) checkException(removeEdge("q", "a", g1), silent=TRUE) checkException(removeEdge("a", c("q", "aa", "tt"), g1), silent=TRUE) checkException(removeEdge(c("a", "q", "tt", "aa"), c("a", "q", "aa", "tt"), g1), silent=TRUE) } test_BAM_removeEdge <- function() { g1 <- make_smallBAM() ## removing nothing does nothing c0 <- character(0) checkEquals(edges(g1), edges(removeEdge(c0, c0, g1))) ## there is no y => a edge, throw error checkException(removeEdge("y", "a", g1), silent=TRUE) g2 <- removeEdge("c", "a", g1) checkEquals(list(c=character(0)), edges(g2, "c")) em <- edgeMatrix(g2) checkEquals(em[1,], c(1, 1, 4, 1, 4)) checkEquals(em[2,], c(2, 3, 3, 4, 5)) g3 <- removeEdge("a", c("b", "x"), g1) checkEquals(list(a="c"), edges(g3, "a")) checkEquals(edges(g1)[-1], edges(g3)[-1]) g4 <- removeEdge(c("a", "x"), "c", g1) checkEquals(list(a=c("b", "x")), edges(g4, "a")) checkEquals(list(x="y"), edges(g4, "x")) } test_BAMSmall_edgeData <- function(){ g1 <- make_smallBAM() eg <- edgeData(g1) tmp <- paste(c("c", "a", "a", "x", "a", "x"), c("a","b","c","c","x","y"),sep="|") checkEquals(names(eg), tmp) vals <- sapply( names(eg),function(k){ eg[[k]]$weight }) checkEquals(names(vals), tmp) checkEquals( as.numeric(vals),c(7.9, 3.4, 2.6, 1.6, 1.7, 5.3)) eg <- edgeData(g1, "a", attr="weight") tmp <- paste( c("a", "a", "a"), c("b", "c", "x"), sep = "|") checkEquals(names(eg), tmp) vals <- sapply( names(eg),function(k){ eg[[k]] }) checkEquals(names(vals), tmp) checkEquals( as.numeric(vals), c(3.4, 2.6, 1.7)) checkException(eg <- edgeData(g1, "a", attr="weightsss"), silent=TRUE) eg <- edgeData(g1, "a", "b", attr="weight") tmp <- paste("a", "b", sep = "|") checkEquals(names(eg), tmp) vals <- sapply( names(eg),function(k){ eg[[k]] }) checkEquals(names(vals), tmp) checkEquals( as.numeric(vals),3.4) } test_BAM_extractFromToUndirected <- function() { g1 <- make_unDirectedBAM() ft <- extractFromTo(g1) checkEquals(as.character(ft$from), c("a", "a", "c", "a", "c", "x")) checkEquals(as.character(ft$to), c("b", "c", "d", "x", "x", "y")) checkEquals(ft$weight, c(3.4, 2.6, 7.9, 1.7, 1.6, 5.3)) } test_BAM_extractFromToDirected <- function() { g1 <- make_smallBAM() ft <- extractFromTo(g1) checkEquals(as.character(ft$from), c("c", "a", "a", "x", "a", "x")) checkEquals(as.character(ft$to), c("a", "b", "c", "c", "x", "y")) checkEquals(ft$weight, c(7.9, 3.4, 2.6, 1.6, 1.7, 5.3)) } test_BAM_bamToMatrix_UnDirected <- function() { g1 <- make_unDirectedBAM() mat <- as(g1, "matrix") checkEquals(isSymmetric(mat), TRUE) checkEquals(mat[upper.tri(mat)], c(3.4, 2.6, 0.0, 0.0, 0.0, 7.9, 1.7, 0.0, 1.6, 0.0, 0.0, 0.0, 0.0, 0.0, 5.3)) checkEquals(rownames(mat),colnames(mat)) checkEquals(rownames(mat), c("a", "b", "c", "d", "x", "y")) } test_BAM_bamToMatrix_Directed <- function() { g1 <- make_smallBAM() mat <- as(g1, "matrix") checkEquals(as.numeric(mat), c(0.0, 0.0, 7.9, 0.0, 0.0, 3.4, 0.0, 0.0, 0.0, 0.0, 2.6, 0.0, 0.0, 1.6, 0.0, 1.7, 0.0, 0.0, 0.0,0.0, 0.0, 0.0, 0.0, 5.3, 0.0)) checkEquals(rownames(mat),colnames(mat)) checkEquals(rownames(mat), c("a","b", "c", "x","y")) } test_BAM_bamTographAM_unDirected <- function() { g1 <- make_unDirectedBAM() am <- as(g1,"graphAM") checkEquals(nodes(g1), nodes(am)) checkEquals(edgemode(g1), edgemode(am)) checkEquals(edges(g1), edges(am)) w1 <- edgeWeights(g1) w2 <- edgeWeights(am) checkEquals(names(w1), names(w2)) checkEquals( w1$a, w2$a) checkEquals( w1$b, w2$b) checkEquals( sort(w1$c), sort(w2$c)) checkEquals( w1$d, w2$d) checkEquals( sort(w1$x), sort(w2$x)) checkEquals( w1$y, w2$y) } test_BAM_bamTographAM_Directed <- function() { g1 <- make_smallBAM() am <- as(g1,"graphAM") checkEquals(nodes(g1), nodes(am)) checkEquals(edgemode(g1), edgemode(am)) checkEquals(edges(g1), edges(am)) w1 <- edgeWeights(g1) w2 <- edgeWeights(am) checkEquals(names(w1), names(w2)) checkEquals( w1$a, w2$a) checkEquals( w1$b, w2$b) checkEquals( sort(w1$c), sort(w2$c)) checkEquals( w1$d, w2$d) checkEquals( sort(w1$x), sort(w2$x)) checkEquals( w1$y, w2$y) } test_BAM_bamTographNEL_UnDirected <- function() { g1 <- make_unDirectedBAM() nel <- as(g1,"graphNEL") checkEquals(nodes(g1), nodes(nel)) checkEquals(edgemode(g1), edgemode(nel)) checkEquals(edges(g1), edges(nel)) w1 <- edgeWeights(g1) w2 <- edgeWeights(nel) checkEquals(names(w1), names(w2)) checkEquals( w1$a, w2$a) checkEquals( w1$b, w2$b) checkEquals( sort(w1$c), sort(w2$c)) checkEquals( w1$d, w2$d) checkEquals( sort(w1$x), sort(w2$x)) checkEquals( w1$y, w2$y) } test_BAM_bamTographNEL_Directed <- function() { g1 <- make_smallBAM() nel <- as(g1,"graphNEL") checkEquals(nodes(g1), nodes(nel)) checkEquals(edgemode(g1), edgemode(nel)) checkEquals(edges(g1), edges(nel)) w1 <- edgeWeights(g1) w2 <- edgeWeights(nel) checkEquals(names(w1), names(w2)) checkEquals( w1$a, w2$a) checkEquals( w1$b, w2$b) checkEquals( sort(w1$c), sort(w2$c)) checkEquals( w1$d, w2$d) checkEquals( sort(w1$x), sort(w2$x)) checkEquals( w1$y, w2$y) } create_GraphNEL_Directed <- function() { set.seed(123) V <- letters[1:4] edL <- vector("list", length=4) names(edL) <- V edL[["a"]] <- list(edges=c(3, 4), weights=c(.13, .14)) edL[["b"]] <- list(edges=c(3), weights=.23) edL[["c"]] <- list(edges=numeric(0), weights=numeric(0)) edL[["d"]] <- list(edges=c(2, 3), weights=c(.42, .43)) gR <- graphNEL(nodes = V, edgeL = edL, edgemode = "directed" ) gR } create_GraphNEL_UnDirected <- function() { set.seed(123) V <- letters[1:4] edL <- vector("list", length=4) names(edL) <- V edL[["a"]] <- list(edges=c(2, 3), weights=c(.13, .14)) edL[["b"]] <- list(edges=c(1), weights=.13) edL[["c"]] <- list(edges=c(1), weights=0.14) edL[["d"]] <- list(edges= numeric(0), weights=numeric(0)) gR <- graphNEL(nodes = V, edgeL = edL, edgemode = "undirected" ) gR } test_graphNEL_Directed_To_graphBAM <-function() { nel <- create_GraphNEL_Directed() bam <- as(nel, "graphBAM") checkEquals(nodes(nel), nodes(bam)) checkEquals(edgemode(nel), edgemode(bam)) checkEquals(edges(nel), edges(bam)) w1 <- edgeWeights(nel) w2 <- edgeWeights(bam) checkEquals(w1,w2) } test_graphNEL_Directed_To_graphBAM <- function() { nel <- create_GraphNEL_Directed() bam <- as(nel, "graphBAM") checkEquals(nodes(nel), nodes(bam)) checkEquals(edgemode(nel), edgemode(bam)) checkEquals(edges(nel), edges(bam)) w1 <- edgeWeights(nel) w2 <- edgeWeights(bam) checkEquals(w1,w2) } test_graphNEL_UnDirected_To_graphBAM <- function() { nel <- create_GraphNEL_UnDirected() bam <- as(nel, "graphBAM") checkEquals(nodes(nel), nodes(bam)) checkEquals(edgemode(nel), edgemode(bam)) checkEquals(edges(nel), edges(bam)) w1 <- edgeWeights(nel) w2 <- edgeWeights(bam) checkEquals(w1,w2) } test_graphAM_Directed_To_graphBAM <- function() { nel <- create_GraphNEL_Directed() am <- as(nel, "graphAM") bam <- as(am, "graphBAM") checkEquals(nodes(am), nodes(bam)) checkEquals(edgemode(am), edgemode(bam)) checkEquals(edges(am), edges(bam)) w1 <- edgeWeights(am) w2 <- edgeWeights(bam) checkEquals(w1,w2) } test_graphAM_UnDirected_To_graphBAM<- function() { nel <- create_GraphNEL_UnDirected() am <- as(nel, "graphAM") bam <- as(am, "graphBAM") checkEquals(nodes(am), nodes(bam)) checkEquals(edgemode(am), edgemode(bam)) checkEquals(edges(am), edges(bam)) w1 <- edgeWeights(am) w2 <- edgeWeights(bam) checkEquals(w1, w2) } test_BAM_set_edge_weights <- function() { getw <- function(x) unlist(edgeWeights(x)) g <- make_smallBAM() weight0 <- unlist(edgeWeights(g)) edgeData(g, "c", "a", attr="weight") <- 123.0 want <- weight0 want["c.a"] <- 123.0 checkEquals(want, getw(g)) g <- make_smallBAM() edgeData(g, "a", c("b", "c", "x"), attr="weight") <- c(10, 11, 12) want <- weight0 want[c("a.b", "a.c", "a.x")] <- c(10, 11, 12) checkEquals(want, getw(g)) } test_BAM_Intersect_UnDirected <- function() { ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "x", "y") weight=c(1.2, 2.4, 3.2, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "undirected") ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(3.2, 1.2, 2.1, 3.2, 3.5) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "undirected") g <- graphIntersect(g1,g2) checkEquals(intersect(nodes(g1), nodes(g2)), nodes(g)) checkEquals(FALSE, isDirected(g)) eg <- edgeData(g) vals <- sapply( names(eg),function(k){ eg[[k]]$weight }) tmp <- paste(c("a", "b", "d", "b", "c", "x"), c("b", "c", "x", "a", "b", "d"), sep= "|") checkEquals(tmp, names(vals)) checkEquals(as.numeric(rep(NA, 6)), as.numeric(vals)) } test_BAM_Intersect_Directed <- function() { ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "x", "y") weight=c(1.2, 2.4, 3.2, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(1.2, 1.2, 2.1, 3.2, 3.5) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") g <- graphIntersect(g1,g2) checkEquals(intersect(nodes(g1), nodes(g2)), nodes(g)) checkEquals(TRUE, isDirected(g)) eg <- edgeData(g) vals <- sapply( names(eg),function(k){ eg[[k]]$weight }) tmp <- paste(c("a", "b", "d"), c("b", "c", "x"), sep= "|") checkEquals(tmp, names(vals)) checkEquals(c(1.2, NA, NA), as.numeric(vals)) } test_BAM_Intersect_UnDirected2 <- function() { ## nodes a b d x y from = c("a", "d", "d") to = c("b", "x", "y") weight=c(1.2, 3.2, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "undirected") ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(3.2, 1.2, 2.1, 5.2, 3.2) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "undirected") g <- graphIntersect(g1,g2) checkEquals(intersect(nodes(g1), nodes(g2)), nodes(g)) checkEquals(FALSE, isDirected(g)) eg <- edgeData(g) vals <- sapply( names(eg),function(k){ eg[[k]]$weight }) tmp <- paste(c("a", "d", "b", "x"), c("b", "x", "a", "d"), sep= "|") checkEquals(tmp, names(vals)) checkEquals(rep(c(NA,3.2),2), as.numeric(vals)) } test_BAM_Intersect_EmptyEdges <- function() { from = c("a", "d", "d") to = c("b", "x", "y") weight=c(1.2, 3.2, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") from = c("h", "i", "j") to = c("b", "x", "y") weight=c(1.2, 3.2, 5.4) df <- data.frame(from, to, weight) g2 <- graphBAM(df, edgemode = "directed") g <- graphIntersect(g1,g2) checkEquals(nodes(g), intersect(nodes(g1), nodes(g2))) checkEquals(isDirected(g), TRUE) eg <- edgeWeights(g) checkEquals(c("b", "x", "y"), names(eg)) checkEquals(list(numeric(0), numeric(0), numeric(0)),list(eg$b, eg$x, eg$y)) } test_BAM_Intersect_EmptyNodes <- function() { from = c("a", "d", "d") to = c("b", "x", "y") weight=c(1.2, 3.2, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "unirected") from = c("h", "i", "j") to = c("s", "h", "l") weight=c(1.2, 3.2, 5.4) df <- data.frame(from, to, weight) g2 <- graphBAM(df, edgemode = "undirected") g <- graphIntersect(g1,g2) checkEquals(intersect(nodes(g1), nodes(g2)), nodes(g)) checkEquals(FALSE, isDirected(g)) eg <- edgeWeights(g) checkEquals(list(), eg) } test_BAM_isAdjacent <- function() { from = c("a", "d", "d", "b", "a") to = c("b", "a", "d", "c", "c") weight= c(1.5, 2.1, 3.4, 4.1, 5.6) df <- data.frame(from, to, weight) gd <- graphBAM(df, nodes="e", edgemode = "directed") ## single edges for (i in seq_len(nrow(df))) { checkEquals(TRUE, isAdjacent(gd, from[i], to[i])) } ## vectorized checkEquals(c(FALSE, TRUE, TRUE, FALSE, FALSE), isAdjacent(gd, "a", letters[1:5])) checkEquals(c(FALSE, FALSE, FALSE, TRUE, FALSE), isAdjacent(gd, letters[1:5], "a")) } test_BAM_Union_UnDirected <- function() { ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "x", "y") weight=c(1.2, 2.4, 3.5, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "undirected") ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(3.2, 1.2, 2.1, 3.2, 3.5) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "undirected") g <- graphUnion(g1,g2) checkEquals(union(nodes(g1), nodes(g2)), nodes(g)) checkEquals(FALSE, isDirected(g)) df <- extractFromTo(g) tmp <- data.frame(from = c("a", "b", "b", "c", "d", "d"), to = c("b", "c", "d", "d", "x", "y"), weight = c( NA, NA, 2.1, 3.2, 3.5, 5.4)) checkEquals(tmp, df) } test_BAM_Union_Directed <- function() { ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "x", "y") weight=c(1.2, 2.4, 3.5, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(1.2, 1.2, 2.1, 3.2, 3.5) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") g <- graphUnion(g1,g2) checkEquals(union(nodes(g1), nodes(g2)), nodes(g)) checkEquals(TRUE, isDirected(g)) df <- extractFromTo(g) tmp <- data.frame(from = c("a", "b", "d", "b", "d", "d"), to = c("b", "c", "c", "d", "x", "y"), weight = c( 1.2, NA, 3.2, 2.1, 3.5, 5.4)) checkEquals(tmp, df) } test_BAM_Union_Mixed <- function() { ## nodes a b d x y from = c("a", "d", "d") to = c("b", "x", "y") weight=c(1.2, 3.2, 5.4) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "undirected") ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(3.2, 1.2, 2.1, 3.2, 3.5) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") checkException(g <- graphUnion(g1,g2), silent=TRUE) } test_BAM_inEdges <- function() { from = c("a", "d", "d", "b", "a") to = c("b", "a", "d", "c", "c") weight = c(1.5, 2.1, 3.4, 4.1, 5.6) df <- data.frame(from, to, weight) ## directed gd <- graphBAM(df, nodes="e", edgemode = "directed") want <- list(a="d", b="a", c=c("a", "b"), d="d", e=character(0)) checkEquals(want, inEdges(nodes(gd), gd)) ## undirected gu <- graphBAM(df, nodes="e", edgemode = "undirected") checkEquals(edges(gu), inEdges(nodes(gu), gu)) } test_BAM_directed_attrs <- function() { from = c("a", "a", "a", "x", "x", "c") to = c("b", "c", "x", "y", "c", "a") weight = c(2, 1, 3, 4, 5, 6) df <- data.frame(from, to, weight) bam <- graphBAM(df, edgemode = "directed") checkException(edgeData(bam,from="a", attr="code"), silent=TRUE) edgeDataDefaults(bam, attr ="weight") <- 1 edgeDataDefaults(bam, attr = "code") <- "plain" res <- unlist(edgeData(bam,from="a", attr="code")) nmres <- paste(c("a","a","a"), c ("b", "c", "x"), sep="|") checkEquals(names(res), nmres) checkEquals(as.character(res), c("plain", "plain", "plain")) edgeData(bam,from = "a", to = "x", attr= "code") <- "red" res <- unlist(edgeData(bam, from = "a", attr = "code")) checkEquals(names(res), nmres) checkEquals(as.character(res), c("plain", "plain", "red")) edgeData(bam,to = "c", attr= "code") <- "yellow" res <- unlist(edgeData(bam, to= "c", attr = "code")) nmres <- paste(c("a", "x"), c("c", "c"), sep = "|") checkEquals(names(res), nmres) checkEquals(as.character(res), c("yellow", "yellow")) } test_BAM_undirected_attrs <- function() { from = c("a", "a", "a", "x", "x") to = c("b", "c", "x", "y", "c") weight = c(2, 1, 3, 4, 5) df <- data.frame(from, to, weight) bam <- graphBAM(df, edgemode = "undirected") checkException(edgeData(bam,from="a", attr="code"), silent=TRUE) edgeDataDefaults(bam, attr = "weight") <- 1 edgeDataDefaults(bam, attr = "code") <- "plain" res <- unlist(edgeData(bam,from="a", attr="code")) nmres <- paste(c("a","a","a"), c ("b", "c", "x"), sep="|") checkEquals(names(res), nmres) checkEquals(as.character(res), c("plain", "plain", "plain")) edgeData(bam,from = "a", to = "x", attr= "code") <- "red" res <- unlist(edgeData(bam, from = "a", attr = "code")) checkEquals(names(res), nmres) checkEquals(as.character(res), c("plain", "plain", "red")) edgeData(bam,to = "c", attr= "code") <- "yellow" res <- unlist(edgeData(bam, to= "c", attr = "code")) nmres <- paste(c("a", "x"), c("c", "c"), sep = "|") checkEquals(names(res), nmres) checkEquals(as.character(res), c("yellow", "yellow")) } test_graphBAM_detailed_Attribute_Intersection <- function() { ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(1.2, 2.4, 5.4, 3.2) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") edgeData(g1, from = from, to = to ,attr = "weight") <- c(1.2, 2.4, 5.4, 3.2) edgeDataDefaults(g1, attr = "color") <- "unknown" edgeDataDefaults(g1, attr ="type") <- "unknown" edgeData(g1, from = from, to = to ,attr = "color") <- c("red", "blue", NA, "green") edgeData(g1, from = from, to = to , attr = "type") <- c("high", "low", "high", NA) ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(1.2, 4.2, 5.6, 2.1, 3.2) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") edgeDataDefaults(g2, attr = "color") <- "unknown" edgeData(g2, from = from, to = to, attr = "color") <- c("red", "blue", NA, "red", "yellow") g <- graphIntersect(g1, g2) df <- extractFromTo(g) tmp <- data.frame( from = c("a", "b", "d"), to = c("b", "c", "x"), weight = c(1.2, NA, 3.2)) checkEquals(tmp, df) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d"), c("b", "c", "x"), sep = "|") target <- structure( c("red", "blue", NA), names = nms) checkEquals(target, unlist(attColor)) checkException(edgeData(g, attr = "type"), silent=TRUE) weightFun <- function(x, y) { return(x +y ) } colorFun <- function(x,y) { if(x=="red" && y == "red") return("white") else return("black") } setClass("myType", representation = representation(typ ="character")) myType <- function(typ){ new("myType", typ = typ)} typeFun <- function(x,y) { if(is(x, "myType") && is(y, "myType")){ if(x@typ =="low" || y@typ == "med") return("low") else return("high") } else {return (NA)} } nodeDataDefaults(g1, attr ="color") <- "unknown" nodeDataDefaults(g1, attr ="type") <- "unknown" nodeDataDefaults(g2, attr ="color") <- "unknown" nodeDataDefaults(g2, attr ="type") <- "unknown" nodeData(g1,n = c("a", "b", "c"), attr ="color") <- c("red", "green", "blue") nodeData(g1,n = c("b", "c"), attr ="type") <- c(myType("low"), myType("high")) nodeData(g2,n = c("a", "b", "c"), attr ="color") <- c("red", "green", "red") nodeData(g2,n = c("b", "c"), attr ="type") <- c(myType("med"), myType("low")) g <- graphIntersect(g1, g2, nodeFun = list(type = typeFun), edgeFun = list(weight = weightFun, color = colorFun)) attWeight <- edgeData(g, attr = "weight") nms <- paste(c("a", "b", "d"), c("b", "c", "x"), sep = "|") target <- structure( c( 2.4, 6.6, 6.4), names = nms) checkEquals(target, unlist(attWeight)) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d"), c("b", "c", "x"), sep = "|") target <- structure( c( 2.4, 6.6, 6.4), names = nms) checkEquals(target, unlist(attWeight)) nodeColor <- nodeData(g, attr = "color") target <- as.list(structure(c("red", "green", NA, "unknown", "unknown", "unknown"), names = c("a", "b", "c", "d", "x", "y"))) checkEquals(target, nodeColor) nodeType <- nodeData(g, attr = "type") target <- as.list(structure(c("unknown", "low", "high", "unknown", "unknown", "unknown"), names = c("a", "b", "c", "d", "x", "y"))) checkEquals(target, nodeType) } test_graphBAM_detailed_Attribute_Union <- function() { ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(1.2, 2.4, 5.4, 3.2) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") edgeData(g1, from = from, to = to ,attr = "weight") <- c(1.2, 2.4, 5.4, 3.2) edgeDataDefaults(g1, attr = "color") <- "cyan" edgeDataDefaults(g1, attr = "type") <- "unknown" edgeData(g1, from = from, to = to ,attr = "color") <- c("red", "blue", NA, "green") edgeData(g1, from = from, to = to , attr = "type") <- c("high", "low", "high", NA) ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(1.2, 4.2, 5.6, 2.1, 3.2) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") edgeDataDefaults(g2, attr = "color") <- "cyan" edgeData(g2, from = from, to = to, attr = "color") <- c("red", "blue", NA, "red", "yellow") g <- graphUnion(g1, g2) df <- extractFromTo(g) tmp <- data.frame( from = c("a", "b", "d", "b", "d", "d"), to = c("b", "c", "c", "d", "x", "y"), weight = c(1.2, NA, 2.1, 5.6, 3.2, 5.4)) checkEquals(tmp, df) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c("red", "blue", "red", NA, NA, NA), names = nms) checkEquals(target, unlist(attColor)) attType <- edgeData(g, attr = "type") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c("high", "low", NA, NA, NA, "high"), names = nms) checkEquals(target, unlist(attType)) weightFun <- function(x, y) { return(x + y ) } colorFun <- function(x,y) { if(x=="red" || y == "red") return("white") else return("black") } setClass("myType", representation = representation(typ ="character")) myType <- function(typ){ new("myType", typ = typ)} typeFun <- function(x,y) { if(is(x, "myType") && is(y, "myType")){ if(x@typ =="low" || y@typ == "med") return("low") else return("high") } else {return (NA)} } nodeDataDefaults(g1, attr ="color") <- "cyan" nodeDataDefaults(g1, attr="type") <- "unknown" nodeData(g1,n = c("a", "b", "c"), attr ="color") <- c("red", "green", "blue") nodeData(g1,n = c("b", "c"), attr ="type") <- c(myType("low"), myType("high")) nodeDataDefaults(g2, attr ="color") <- "cyan" nodeDataDefaults(g2, attr="type") <- "unknown" nodeDataDefaults(g2, attr="test") <- "missing" nodeData(g2,n = c("a", "b", "c", "z"), attr ="color") <- c("red", "green", "red","pink") nodeData(g2,n = c("b", "c"), attr ="type") <- c(myType("med"), myType("low")) nodeData(g2,n = c("a", "b", "c"), attr = "test") <- c("pass", "fail", "pass") g <- graphUnion(g1, g2, edgeFun = list(weight = weightFun, color = colorFun)) attWeight <- edgeData(g, attr = "weight") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c( 2.4, 6.6, 2.1, 5.6, 6.4, 5.4), names = nms) checkEquals(target, unlist(attWeight)) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure(c( "white", "black", "red", NA, "black", NA), names = nms) checkEquals( target, unlist(attColor)) attType <- edgeData(g, attr = "type") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c("high", "low", NA, NA, NA, "high"), names = nms) checkEquals(target, unlist(attType)) attType <- edgeData(g, attr = "type") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c("high", "low", NA, NA, NA, "high"), names = nms) checkEquals(target, unlist(attType)) } test_graphBAM_removeEdgesByWeight <- function() { from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") edgeDataDefaults(g, attr="color") <- "pink" edgeData(g, from = from, to = to ,attr = "color") <- c("red", "blue", NA, "green") res <- removeEdgesByWeight(g, lessThan = 2.0) checkEquals(attr(res@edgeSet@bit_vector, "nbitset"), 2) checkEquals(res@edgeSet@weights, c(2.2, 2.0)) current <- unlist( edgeData(res, attr = "color")) target <- structure(c("red", "blue"), names = paste(c("a", "b"), c("b", "c"), sep = "|")) checkEquals(target, current) res <- removeEdgesByWeight(g, greaterThan = 1.9) checkEquals(attr(res@edgeSet@bit_vector, "nbitset"), 2) checkEquals(res@edgeSet@weights, c(0.2, 0.4)) current <- unlist( edgeData(res, attr = "color")) target <- structure(c("green", NA), names = paste(c("d", "d"), c("x", "y"), sep = "|")) checkEquals(target, current) res <- removeEdgesByWeight(g, lessThan =1.0, greaterThan = 2) checkEquals(res@edgeSet@weights, c(2.0)) current <- unlist( edgeData(res, attr = "color")) target <- structure(c("blue"), names = paste( "b", "c", sep = "|")) checkEquals(target, current) res <- removeEdgesByWeight(g, greaterThan = 0.1) checkEquals(res@edgeSet@weights, numeric(0)) checkEquals(res@edgeSet@edge_attrs$color, character(0)) } test_graphBAM_nodeAttributes <- function(){ from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") nodeDataDefaults(g, attr ="color") <- "blue" sg <- subGraph(c("a", "c"), g) checkIdentical(unname(unlist(nodeData(sg))), c("blue", "blue")) nodeData(g, n = c("d","a"), attr = "color") <- c("red", "green") current <- nodeData(g, attr = "color") target <- as.list(structure( c("green", "blue", "blue", "red", "blue", "blue"), names = c("a", "b", "c", "d", "x", "y"))) checkEquals(target, current) nodeDataDefaults(g, attr="mat") <- NA nodeData(g, n= c("x", "y"), attr = "mat") <- df current <- nodeData(g, n= c("x", "y"), attr = "mat") target <- list(x = df, y = df) checkEquals(target, current) sg <- subGraph(c("d","b"), g) current <- nodeData(sg, attr = "color") target <- as.list(structure(c("blue", "red"), names = c("b", "d"))) checkEquals(target, current) } test_BAM_directed_attrs_s4 <- function() { from = c("a", "a", "a", "x", "x", "c") to = c("b", "c", "x", "y", "c", "a") weight = c(2, 1, 3, 4, 5, 6) df <- data.frame(from, to, weight) bam <- graphBAM(df, edgemode = "directed") edgeDataDefaults(bam, attr = "weight") <- 1.3 edgeDataDefaults (bam, attr = "vals") <- df edgeData(bam, from = "a", attr= "vals") <- "unknown" res <- edgeData(bam, attr="vals") nmres <- c("c|a", "a|b", "a|c", "x|c", "a|x", "x|y") target <- structure(list(df, "unknown", "unknown", df, "unknown",df), names = nmres) checkEquals(res, target) edgeDataDefaults(bam, attr = "mat") <- NA edgeData(bam,from = "a", to = "x", attr= "mat") <- matrix(1) res <- edgeData(bam, from = "a", attr = "mat") nmres <- paste(c("a", "a", "a"), c("b", "c", "x"), sep = "|") target <- structure( list(NA, NA, matrix(1)), names = nmres) checkEquals(res, target) edgeDataDefaults(bam, attr = "mk") <- NA edgeData(bam,to = "c", attr= "mk") <- matrix(1) res <- edgeData(bam, attr = "mk") nmres <- paste(c("c", "a", "a", "x", "a", "x"), c("a", "b", "c", "c", "x", "y"), sep ="|") target <- structure( list(NA, NA, matrix(1), matrix(1), NA ,NA), names = nmres) checkEquals(res, target) } test_BAM_undirected_attrs_s4 <- function() { from = c("a", "a", "a", "x") to = c("b", "c", "x", "y") weight = c(2, 1, 3, 4) df <- data.frame(from, to, weight) bam <- graphBAM(df, edgemode = "undirected") edgeDataDefaults(bam, attr = "weight") <- 1.3 edgeDataDefaults(bam, attr = "vals") <- df # edgeData(bam, attr = "weight") <- 1.3 # edgeData(bam, attr = "vals") <- df edgeData(bam, from = "x", attr = "vals") <- "unknown" res <- edgeData(bam, attr="vals") nmres <- c("a|b", "a|c", "a|x", "x|y", "b|a", "c|a", "x|a", "y|x") target <- structure(list(df, df, "unknown", "unknown", df, df, "unknown", "unknown"), names = nmres) checkEquals(res, target) edgeDataDefaults(bam, attr ="mat") <- NA edgeData(bam,from = "a", to = "x", attr= "mat") <- matrix(1) res <- edgeData(bam, attr = "mat") target <- structure(list(NA, NA, matrix(1), NA, NA, NA, matrix(1), NA), names = nmres) checkEquals(res, target) edgeDataDefaults(bam, attr = "mk") <- NA edgeData(bam,to = "c", attr= "mk") <- matrix(1) res <- edgeData(bam, attr = "mk") target <- structure( list(NA, matrix(1), NA, NA, NA, matrix(1), NA ,NA), names = nmres) checkEquals(res, target) } test_graphBAM_S4_Attribute_Intersection <- function() { setClass("myColor", representation = representation(col ="character")) setClass("myType", representation = representation(typ ="character")) myColor <- function(col){ new("myColor", col = col)} myType <- function(typ){ new("myType", typ = typ)} ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(1.2, 2.4, 5.4, 3.2) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") edgeData(g1, from = from, to = to ,attr = "weight") <- c(1.2, 2.4, 5.4, 3.2) edgeDataDefaults(g1, attr="color") <- "cyan" edgeDataDefaults(g1, attr="type") <- "unknown" edgeData(g1, from = from, to = to ,attr = "color") <- c(myColor("red"), myColor("blue"), NA, myColor("green")) edgeData(g1, from = from, to = to , attr = "type") <- c(myType("high"), myType("low"), myType("high"), NA) ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(1.2, 4.2, 5.6, 2.1, 3.2) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") edgeDataDefaults(g2, attr ="color") <- "cyan" edgeData(g2, from = from, to = to, attr = "color") <- c(myColor("red"), myColor("blue"), NA, myColor("red"), myColor("yellow")) g <- graphIntersect(g1, g2) df <- extractFromTo(g) tmp <- data.frame( from = c("a", "b", "d"), to = c("b", "c", "x"), weight = c(1.2, NA, 3.2)) checkEquals(tmp, df) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d"), c("b", "c", "x"), sep = "|") target <- structure( c(myColor("red"), myColor("blue"), NA), names = nms) checkEquals(target, unlist(attColor)) checkException(edgeData(g, attr = "type"), silent=TRUE) weightFun <- function(x, y) { return(x + y ) } colorFun <- function(x,y) { if(x@col=="red" && y@col == "red") return("white") else return("black") } g <- graphIntersect(g1, g2, edgeFun =list(weight = weightFun, color = colorFun)) df <- extractFromTo(g) tmp <- data.frame( from = c("a", "b", "d"), to = c("b", "c", "x"), weight = c(2.4, 6.6 , 6.4)) checkEquals(tmp, df) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d"), c("b", "c", "x"), sep = "|") target <- structure( c("white", "black", "black"), names = nms) checkEquals(target, unlist(attColor)) checkException(edgeData(g, attr = "type"), silent=TRUE) } test_graphBAM_S4_Attribute_Union <- function() { setClass("myColor", representation = representation(col ="character")) setClass("myType", representation = representation(typ ="character")) myColor <- function(col){ new("myColor", col = col)} myType <- function(typ){ new("myType", typ = typ)} ## nodes a b c d x y from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(1.2, 2.4, 5.4, 3.2) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") edgeData(g1, from = from, to = to ,attr = "weight") <- c(1.2, 2.4, 5.4, 3.2) edgeDataDefaults(g1, attr = "color") <- "cyan" edgeDataDefaults(g1, attr = "type") <- "missing" edgeData(g1, from = from, to = to ,attr = "color") <- c(myColor("red"), myColor("blue"), NA, myColor("green")) edgeData(g1, from = from, to = to , attr = "type") <- c(myType("high"), myType("low"), myType("high"), NA) ## nodes a b c d x y z from = c("a", "b", "b", "d", "d") to = c("b", "c", "d", "c", "x") weight=c(1.2, 4.2, 5.6, 2.1, 3.2) df <- data.frame(from, to, weight) g2 <- graphBAM(df, nodes = c("a","b","c", "d", "x", "y", "z"), edgemode = "directed") edgeDataDefaults(g2, attr = "color") <- "cyan" edgeData(g2, from = from, to = to, attr = "color") <- c(myColor("red"), myColor("blue"), NA, myColor("red"), myColor("yellow")) g <- graphUnion(g1, g2) df <- extractFromTo(g) tmp <- data.frame( from = c("a", "b", "d", "b", "d", "d"), to = c("b", "c", "c", "d", "x", "y"), weight = c(1.2, NA, 2.1, 5.6, 3.2, 5.4)) checkEquals(tmp, df) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c(myColor("red"), myColor("blue"), myColor("red"), NA, NA, NA), names = nms) checkEquals(target, unlist(attColor)) attType <- edgeData(g, attr = "type") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c(myType("high"), myType("low"), NA, NA, NA, myType("high")), names = nms) checkEquals(target, unlist(attType)) weightFun <- function(x, y) { return(x + y ) } colorFun <- function(x,y) { if(x@col =="red" || y@col == "red") return("white") else return("black") } g <- graphUnion(g1, g2, edgeFun = list(weight = weightFun, color = colorFun)) attWeight <- edgeData(g, attr = "weight") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c( 2.4, 6.6, 2.1, 5.6, 6.4, 5.4), names = nms) checkEquals(target, unlist(attWeight)) attColor <- edgeData(g, attr = "color") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure(c( "white", "black", myColor("red"), NA, "black", NA), names = nms) checkEquals( target, unlist(attColor)) attType <- edgeData(g, attr = "type") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure( c(myType("high"), myType("low"), NA, NA, NA, myType("high")), names = nms) checkEquals(target, unlist(attType)) attType <- edgeData(g, attr = "type") nms <- paste(c("a", "b", "d", "b", "d", "d"), c("b", "c", "c", "d", "x", "y"), sep = "|") target <- structure(c( myType("high"), myType("low"), NA, NA, NA, myType("high")), names = nms) checkEquals(target, unlist(attType)) } test_graphBAM_addNode1 <- function(){ from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") nodeDataDefaults(g, attr="color") <- "pink" nodeData(g, n = c("d","a"), attr = "color") <- c("red", "green") nodeDataDefaults(g, attr="type") <- "unknown" nodeData(g, n = c("a", "b", "y", "d"), attr = "type") <- c("high", "med", "high", "low") gr <- addNode(c("q", "ss"), g) current <- nodeData(gr, attr = "color") target <- c("green", "pink", "pink", "red", "pink", "pink", "pink", "pink") names(target) <- c("a", "b", "c", "d", "q", "ss", "x", "y") checkTrue(all(current[sort(names(current))] == target[sort(names(target))])) current <- nodeData(gr, attr = "type") target <- c("high", "med", "unknown", "low", "unknown", "unknown", "unknown", "high") names(target) <- c("a", "b", "c", "d", "q", "ss", "x", "y") checkTrue(all(current[sort(names(current))] == target[sort(names(target))])) } test_graphBAM_addNode1 <- function(){ from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") nodeDataDefaults(g, attr="color") <- "pink" nodeData(g, n = c("d","a"), attr = "color") <- c("red", "green") nodeDataDefaults(g, attr="type") <- "unknown" nodeData(g, n = c("a", "b", "y", "d"), attr = "type") <- c("high", "med", "high", "low") gr <- addNode(c("q", "ss"), g) current <- nodeData(gr, attr = "color") target <- c("green", "pink", "pink", "red", "pink", "pink", "pink", "pink") names(target) <- c("a", "b", "c", "d", "q", "ss", "x", "y") checkTrue(all(current[sort(names(current))] == target[sort(names(target))])) current <- nodeData(gr, attr = "type") target <- c("high", "med", "unknown", "low", "unknown", "unknown", "unknown", "high") names(target) <- c("a", "b", "c", "d", "q", "ss", "x", "y") checkTrue(all(current[sort(names(current))] == target[sort(names(target))])) } test_graphBAM_addNode2 <- function(){ from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") edgeDataDefaults(g, attr="color") <- "blue" edgeDataDefaults(g, attr="type") <- "unknown" edgeData(g, from = c("d","a"), to = c("y", "b"), attr = "color") <- c("red", "green") edgeData(g, from = c("a", "b"), to = c("b", "c") , attr = "type") <- c("low", "high") g1 <- addEdge(from = c("d", "b"), to = c("c", "x"), g, weights = c(4.0, 10.0)) current <- edgeData(g1, attr ="weight") lbl <- paste(c("a", "b", "d", "b", "d", "d"), c( "b", "c", "c", "x", "x", "y") , sep ="|") target <- as.list( structure(c(2.2, 2, 4, 10, 0.2, 0.4), names = lbl)) checkEquals(target, current) current <- edgeData(g1, attr ="color") lbl <- paste(c("a", "b", "d", "b", "d", "d"), c( "b", "c", "c", "x", "x", "y"), sep ="|") target <- as.list( structure(c("green", "blue", "blue", "blue", "blue", "red"), names = lbl)) checkEquals(target, current) current <- edgeData(g1, attr ="type") lbl <- paste(c("a", "b", "d", "b", "d", "d"), c( "b", "c", "c", "x", "x", "y") , sep ="|") target <- as.list( structure(c("low", "high", "unknown", "unknown", "unknown", "unknown"), names = lbl)) checkEquals(target, current) } # in version prior to 1.41.1, the propagation of existing "user" edge attributes, # that is, anything other than weight, failed if a new node is added which is # lexically less than the any nodes already in an edge. # the fix was simple: see arguments to setBitCell in methods-graphBAM.R, # the addNode method. test that fix here test_graphBAM_addNode_outOfAlphabeticalOrder_copyUserEdgeAttributes <- function(){ from = c("a", "b", "m", "m") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") edgeDataDefaults(g, attr="color") <- "blue" edgeDataDefaults(g, attr="type") <- "unknown" edgeData(g, from = c("m","a"), to = c("y", "b"), attr = "color") <- c("red", "green") edgeData(g, from = c("a", "b"), to = c("b", "c") , attr = "type") <- c("low", "high") expected.edge.names <- c("a|b", "b|c", "m|x", "m|y") checkEquals(sort(names(edgeData(g, attr="color"))), expected.edge.names) checkEquals(unlist(edgeData(g, attr="color")[expected.edge.names], use.names=FALSE), c("green", "blue", "blue", "red")) g2 <- addNode("f", g) # make sure that the addition of node f does not disrupt # edgeData retrieval checkEquals(sort(names(edgeData(g2, attr="color"))), expected.edge.names) checkEquals(unlist(edgeData(g, attr="color")[expected.edge.names], use.names=FALSE), c("green", "blue", "blue", "red")) } test_graphBAM_nodeUnion_Attributes <- function(use.factors=TRUE){ setClass("myType", representation = representation(typ ="character")) myType <- function(typ){ new("myType", typ = typ)} testFun <- function(x,y) { if(is(x, "myType") && is(y, "myType")){ if(x@typ =="aa" || y@typ == "ac") return("ax") else return("ab") } else return(as.character(NA)) } funList <- structure(list(testFun), names ="gene") ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to =c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2), stringsAsFactors = use.factors) g1 <- graphBAM(ft1, edgemode="directed") nodeDataDefaults(g1, attr="color") <- "cyan" nodeDataDefaults(g1, attr="type") <- "missing" nodeDataDefaults(g1, attr="kp") <- "missing" nodeDataDefaults(g1, attr="gene") <- "unknown" nodeData(g1, n = c("a", "b", "c") , attr = "color") <- c("red", "green", "blue") nodeData(g1, n = c("a", "b"), attr = "type") <- c("low", "high") nodeData(g1, n = c("a", "b"), attr = "kp") <- c("kplow", "kphigh") nodeData(g1, n = c("a", "b"), attr = "gene") <- c(myType("aa"), myType("bt")) ft1 <- data.frame(from=c("a", "a", "b"), to=c("b", "x", "z"), weight=c(6, 5, 2), stringsAsFactors = use.factors) g2 <- graphBAM(ft1,nodes = c("a","b", "c", "d", "x", "y", "z"), edgemode = "directed") nodeDataDefaults(g2, attr ="color") <- "cyan" nodeDataDefaults(g2, attr="type") <- "missing" nodeDataDefaults(g2, attr="gene") <- "unknown" nodeData(g2, n = c("a", "b", "x", "y", "z") , attr = "color") <- c("red", "red", "green", "pink", "yellow") nodeData(g2, n = c("a", "b"), attr = "type") <- c("low", "high") nodeData(g2, n = c("a", "b"), attr = "gene") <- c(myType("at"), myType("kt")) res <- graphUnion(g1, g2, nodeFun = funList) current <- nodeData(res, attr = "color") cn <- as.character(NA) target <- as.list( structure(c("red", cn, cn, "cyan", "green", "pink", "yellow"), names = c("a", "b", "c", "d", "x", "y", "z"))) checkEquals(target, current) current <- nodeData(res, attr = "type") target <- as.list( structure(c("low", "high", "missing", "missing", "missing", "missing", "missing"), names = c("a", "b", "c", "d", "x", "y", "z"))) checkEquals(target, current) current <- nodeData(res, attr = "kp") target <- as.list( structure(c("kplow", "kphigh", "missing", "missing", "missing", "missing", "missing"), names = c("a", "b", "c", "d", "x", "y", "z"))) checkEquals(target, current) current <- nodeData(res, n = c("a", "b", "c", "d"), attr ="gene") target <- as.list( structure(c("ax", "ab", cn ,cn), names = c("a", "b", "c", "d"))) checkEquals(target, current) current <- nodeData(res, n= c( "x", "y", "z"), attr ="gene") target <- as.list( structure(c("unknown","unknown", "unknown"), names = c("x", "y", "z"))) checkEquals(target, current) } test_graphBAM_removeNode <- function(){ from = c("a", "b", "d", "d") to = c("b", "c", "y", "x") weight=c(2.2, 2.0, 0.4, 0.2) df <- data.frame(from, to, weight) g <- graphBAM(df, edgemode = "directed") nodeDataDefaults(g, attr="name") <- "NN" nodeData(g, n = c("a","b", "c", "d", "x", "y"), attr = "name") <- c("a", "b", "c", "d", "x", "y") edgeDataDefaults(g, attr="name") <- "EE" edgeData(g, from = from, to = to , attr = "name") <- paste(from, to , sep= "") res <- removeNode(c("x","b"), g) current <- nodeData(res, attr = "name") target <- as.list(structure( c("a", "c", "d", "y"), names = c("a", "c", "d", "y"))) checkEquals(target, current) current <- edgeData(res, attr = "name") target <- as.list(structure( "dy", names = paste("d", "y", sep = "|"))) checkEquals(current, target) res <- removeNode(c("x", "a"), g) current <- edgeData(res, attr = "name") target <- as.list(structure( c("bc", "dy"), names = paste(c("b", "d"), c("c","y"), sep = "|"))) checkEquals(target, current) } test_edgeDataUndirectedGraph <- function() { df <- data.frame(from=c("a", "a", "c"), to=c("b", "c", "d"), weight=rep(1, 3), stringsAsFactors=FALSE) g <- graphBAM(df, edgemode="undirected") edgeDataDefaults(g, attr="EDA") <- 0 edgeData(g, from="a", to="b", attr="EDA") <- 1 edgeData(g, from="a", to="c", attr="EDA") <- 2 edgeData(g, attr="EDA", from="a") # for edges where "a" is the source node, and to unspecified checkEquals(edgeData(g, attr="EDA", from="a")[["a|b"]], 1) checkEquals(edgeData(g, attr="EDA", from="a")[["a|c"]], 2) # specify single values for from and to checkEquals(edgeData(g, attr="EDA", from="a", to="b")[[1]], 1) checkEquals(edgeData(g, attr="EDA", from="a", to="c")[[1]], 2) # multiple target nodes x <- edgeData(g, from="a", to=c("b","c"), attr="EDA") checkEquals(length(x), 2) checkEquals(sort(names(x)), c("a|b", "a|c")) checkEquals(as.numeric(edgeData(g, from="a", to=c("b","c"), attr="EDA")), c(1,2)) checkException(edgeData(g, from="a", to="bogus", attr="EDA"), silent=TRUE) checkException(edgeData(g, from=c("a", "c"), to=c("bogus", "bagus"), attr="EDA"), silent=TRUE) } test_edgeMatrix <- function() { g <- graphBAM(data.frame(from="1", to="2", weight=1)) mtx <- edgeMatrix(g, duplicates=FALSE) checkEquals(dim(mtx), c(2,1)) checkEquals(rownames(mtx), c("from", "to")) checkEquals(as.numeric(mtx), c(1, 2)) mtx.dup <- edgeMatrix(g, duplicates=TRUE) checkEquals(dim(mtx.dup), c(2,2)) checkEquals(rownames(mtx.dup), c("from", "to")) checkEquals(as.numeric(mtx.dup), c(1, 2, 2, 1)) } test_removeEdge_from_undirectedGraph <- function() { g <- graphBAM(data.frame(from="A", to="B", weight=1)) g <- removeEdge(from="A", to="B", g=g) checkEquals(numEdges(g), 0) g <- graphBAM(data.frame(from="A", to="B", weight=1)) g <- removeEdge(from="B", to="A", g=g) checkEquals(numEdges(g), 0) } test_AM2BAM <- function(){ # test the fix for a nov 2014 bug, in which MultiGraph::.makeMDEdgeSet # fails to make edge_sets in the graphBAM constructor when only 1 edge # exists. fix is at line 66 in MultiGraph.R: "drop=FALSE" added to the subset operation mtx <- matrix(c(0,1,0,0), ncol=2, byrow=TRUE, dimnames=list(c("A", "B"), c("A", "B"))) # first create and check a simple (non-binary) adjacency matrix graph g.am <- graphAM(mtx, edgemode="directed") checkEquals(nodes(g.am), c("A", "B")) checkEquals(edgemode(g.am), "directed") checkEquals(edgeNames(g.am), "A~B") # now convert to BAM g.bam <- as(g.am, "graphBAM") checkEquals(nodes(g.bam), c("A", "B")) checkEquals(edgemode(g.bam), "directed") checkEquals(edgeNames(g.bam), "A~B") } test_isAdjacent <- function() { am <- adjacencyMatrix # for shorthand g <- graphBAM(data.frame(from="B", to="C", weight=1), edgemode="undirected") checkEquals(rownames(am(g)), c("B", "C")) checkEquals(colnames(am(g)), c("B", "C")) checkEquals(am(g)["B","C"], 1) checkEquals(am(g)["C","B"], 1) checkTrue(isAdjacent(g, "B", "C")) checkTrue(isAdjacent(g, "C", "B")) checkEquals(as.numeric(edgeMatrix(g)), c(1,2)) # reciprocal edges not stored # add a node, then an edge to the undirected graph g g <- addNode("A", g) checkEquals(nodes(g), c("A", "B", "C")) # just one edge checkEquals(sum(am(g)), 2) checkEquals(am(g)["B", "C"], 1) checkEquals(am(g)["C", "B"], 1) checkTrue(isAdjacent(g, "B", "C")) checkTrue(isAdjacent(g, "C", "B")) g <- addEdge(from="C", to="A", graph=g) checkEquals(sum(am(g)), 4) checkEquals(am(g)["B", "C"], 1) checkEquals(am(g)["C", "B"], 1) checkEquals(am(g)["A", "C"], 1) checkEquals(am(g)["C", "A"], 1) # robert's bug: both of these fail though direct inspection # of either edgeMatrix or adjacencyMatrix show correct edges checkTrue(isAdjacent(g, "A", "C")) checkTrue(isAdjacent(g, "C", "A")) # now verify non-reciprocity of B-C edge in a directed graph gd <- graphBAM(data.frame(from="B", to="C", weight=1), edgemode="directed") checkEquals(rownames(am(gd)), c("B", "C")) checkEquals(colnames(am(gd)), c("B", "C")) checkEquals(am(gd)["B","C"], 1) checkTrue(isAdjacent(gd, "B", "C")) checkTrue(!isAdjacent(gd, "C", "B")) # add a node, then an edge to the directed graph gd gd <- addNode("A", gd) checkEquals(nodes(gd), c("A", "B", "C")) # just one edge checkEquals(sum(am(gd)), 1) checkEquals(am(gd)["B", "C"], 1) checkTrue(isAdjacent(gd, "B", "C")) gd <- addEdge(from="C", to="A", graph=gd) checkTrue(isAdjacent(gd, "C", "A")) } # test_isAdjacent # incomplete draft test supplied by Robert Castello (November 2014) test_robertCastelos_addEdge_edgeData_bug <- function() { am <- adjacencyMatrix # for shorthand #Sys.setlocale("LC_ALL", "C") #checkEquals(Sys.getlocale(), "C") g <- graphBAM(data.frame(from="B", to="C", weight=1)) checkEquals(rownames(am(g)), c("B", "C")) checkEquals(colnames(am(g)), c("B", "C")) checkEquals(am(g)["B","C"], 1) edgeDataDefaults(g, "x") <- NA_real_ g <- addNode("A", g) checkEquals(rownames(am(g)), c("A", "B", "C")) checkEquals(colnames(am(g)), c("A", "B", "C")) g <- addEdge(from="C", to="A", graph=g) checkEquals(am(g)["C", "A"], 1) ## this one works fine edgeData(g, from="A", to="C", "x") <- 10 ## however, this one breaks the code: no longer! edgeData(g, from="C", to="A", "x") <- 10 # ensures that no error was found in the above operations checkTrue(TRUE) } # Sys.setlocale("LC_ALL", "C") # checkEquals(Sys.getlocale(), "C") # g <- graphBAM(data.frame(from="B", to="C", weight=1)) # edgeDataDefaults(g, "x") <- NA_real_ # g <- addNode("A", g) # g <- addEdge(from="C", to="A", graph=g) # # ## this one works fine # edgeData(g, from="A", to="C", "x") <- 10 # # ## however, this one breaks the code # edgeData(g, from="C", to="A", "x") <- 10 graph/inst/unitTests/graphNEL_test.R0000644000175100017510000003264112607264574020517 0ustar00biocbuildbiocbuild ##.setUp <- function() RNGkind("default", "default") simpleGraphNEL <- function() { V <- letters[1:4] edL <- vector("list", length=4) names(edL) <- V edL[["a"]] <- list(edges=c(3, 4), weights=c(.13, .14)) edL[["b"]] <- list(edges=c(3, 4), weights=c(.23, .24)) edL[["c"]] <- list(edges=c(1, 2, 4), weights=c(.13, .23, .34)) edL[["d"]] <- list(edges=c(1, 2, 3), weights=c(.14, .24, .34)) gR <- graphNEL(nodes=V, edgeL=edL) gR } simpleDirectedGraphNEL <- function() { set.seed(123) V <- letters[1:4] edL <- vector("list", length=4) names(edL) <- V edL[["a"]] <- list(edges=c(3, 4), weights=c(.13, .14)) edL[["b"]] <- list(edges=c(3), weights=.23) edL[["c"]] <- list(edges=numeric(0), weights=numeric(0)) edL[["d"]] <- list(edges=c(2, 3), weights=c(.42, .43)) gR <- graphNEL(nodes=V, edgeL=edL, edgemode="directed") gR } testConstructorFunction <- function() { nodes <- LETTERS[1:4] edgeL <- list(A=c("B", "C"), B="C", C="D") ## no-argument constructor target <- new("graphNEL") checkIdentical(target, graphNEL()) ## node / edgeList constructor target <- new("graphNEL", nodes=nodes, edgeL=edgeL, edgemode="directed") checkIdentical(target, graphNEL(nodes, edgeL, "directed")) ## edgemode default == "undirected" edgeL2 <- list(A = c("B", "C"), B = c("A", "C"), C = c("A", "B", "D"), D = "C") target <- new("graphNEL", nodes=nodes, edgeL=edgeL2) checkIdentical(target, graphNEL(nodes, edgeL2, "undirected")) } testCreateBadNodeNames <- function() { badNodeName <- paste("foo", graph:::EDGE_KEY_SEP, "bar", sep="") checkException(graphNEL(nodes=badNodeName), silent=TRUE) checkException(graphNEL(nodes=c(NA, "b")), silent=TRUE) checkException(graphNEL(nodes=c("a", "")), silent=TRUE) } testIsAdjacent <- function() { g1 <- simpleGraphNEL() checkEquals(FALSE, isAdjacent(g1, "a", "b")) checkEquals(TRUE, isAdjacent(g1, "a", "c")) expect <- c(FALSE, TRUE, TRUE) got <- isAdjacent(g1, c("a", "a", "a"), c("b", "c", "d")) checkEquals(expect, got) } testNumEdges <- function() { mat <- matrix(c(1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0), ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] g <- as(mat, "graphNEL") checkEquals(4, numEdges(g)) } testInEdges <- function() { g <- simpleDirectedGraphNEL() expectedInEdges <- list(a=character(0), b="d", c=c("a", "b", "d"), d="a") checkEquals(expectedInEdges, inEdges(g)) checkEquals(expectedInEdges, inEdges(object=g)) n <- c("a", "d") checkEquals(expectedInEdges[n], inEdges(n, g)) ## verify unknown node behavior ans <- tryCatch(inEdges("not-a-node", g), error = function(e) e) checkEquals("not a node: 'not-a-node'", conditionMessage(ans)) } testEmptyGraph <- function() { g <- graphNEL() checkEquals(0, numEdges(g)) checkEquals(0, numNodes(g)) } testCreateGraphNoEdges <- function() { g <- graphNEL(nodes=c("a", "b")) checkEquals(0, numEdges(g)) checkEquals(2, numNodes(g)) g <- graphNEL(nodes=c("a", "b"), edgeL=list()) checkEquals(0, numEdges(g)) checkEquals(2, numNodes(g)) checkEquals(2, length(edges(g))) checkEquals(nodes(g), names(edges(g))) checkEquals(0, sum(sapply(edges(g), length))) } testConstructor <- function() { g <- simpleGraphNEL() g2 <- graphNEL(nodes=nodes(g), edgeL=edges(g)) checkEquals(nodes(g), nodes(g2)) checkEquals(edges(g), edges(g2)) ## We also support the more complicated list structure for describing graph ## edges. g2 <- graphNEL(nodes=nodes(g), edgeL=g@edgeL) checkEquals(nodes(g), nodes(g2)) checkEquals(edges(g), edges(g2)) } testNullHandlingInEdgeL <- function() { g <- simpleDirectedGraphNEL() eL <- g@edgeL eL <- c(eL[c("a", "b", "c")], list(d=NULL)) g2 <- graphNEL(nodes(g), eL, "directed") checkTrue(all(sapply(g2@edgeL, function(x) !is.null(x)))) } testCaptureWeightsWithEdgeLUndirected <- function() { g <- simpleGraphNEL() expect <- as.list(c(.13, .14)) names(expect) <- c("a|c", "a|d") checkEquals(expect, edgeData(g, from="a", attr="weight")) } testCaptureWeightsWithEdgeLDirected <- function() { g <- simpleDirectedGraphNEL() expect <- as.list(c(.13, .14)) names(expect) <- c("a|c", "a|d") checkEquals(expect, edgeData(g, from="a", attr="weight")) } testAddNode <- function() { g1 <- simpleGraphNEL() newNodes <- c("r", "s", "a", "b") checkException(addNode(newNodes, g1), silent=TRUE) newNodes <- c("r", "s") expect <- c(nodes(g1), newNodes) g1 <- addNode(newNodes, g1) checkEquals(expect, nodes(g1)) } testAddNodeWithEdges <- function() { g1 <- simpleGraphNEL() newNodes <- c("r", "s", "t") newEdges <- list(r=c("a", "s"), s="b", t=character(0)) g2 <- addNode(newNodes, g1, newEdges) checkEquals(c(nodes(g1), newNodes), nodes(g2)) expect <- list(r=c("a", "s")) checkEquals(expect, edges(g2)["r"]) expectEdges <- edges(g1) expectEdges[["a"]] <- c(expectEdges[["a"]], "r") expectEdges[["b"]] <- c(expectEdges[["b"]], "s") expectEdges[["r"]] <- c("a", "s") expectEdges[["s"]] <- c("r", "b") expectEdges[["t"]] <- character(0) checkEquals(expectEdges, edges(g2)) } testAddNodeWithEdgesAndWeights <- function() { g1 <- simpleGraphNEL() newNodes <- c("r", "s", "t") newEdges <- list(r=c(a=11, s=22), s=c(b=33), t=numeric(0)) g2 <- addNode(newNodes, g1, newEdges) checkEquals(c(nodes(g1), newNodes), nodes(g2)) expect <- list(r=c("a", "s")) checkEquals(expect, edges(g2)["r"]) expectEdges <- edges(g1) expectEdges[["a"]] <- c(expectEdges[["a"]], "r") expectEdges[["b"]] <- c(expectEdges[["b"]], "s") expectEdges[["r"]] <- c("a", "s") expectEdges[["s"]] <- c("r", "b") expectEdges[["t"]] <- character(0) checkEquals(expectEdges, edges(g2)) } testAddNodeBadNodeName <- function() { g1 <- simpleGraphNEL() badNodeName <- paste("foo", graph:::EDGE_KEY_SEP, "bar", sep="") checkException(addNode(badNodeName, g1), silent=TRUE) } testSubGraphNoEdges <- function() { g1 <- simpleGraphNEL() g1 <- removeEdge("a", c("c", "d"), g1) g2 <- subGraph("a", g1) ## g2 has no edges checkEquals(0, numEdges(g2)) checkEquals(1, numNodes(g2)) } testSubGraphNoEdgesDirected <- function() { g1 <- simpleDirectedGraphNEL() g1 <- removeEdge("a", c("c", "d"), g1) g2 <- subGraph("a", g1) ## g2 has no edges checkEquals(0, numEdges(g2)) checkEquals(1, numNodes(g2)) } testSubGraphAttributes <- function() { g1 <- simpleDirectedGraphNEL() nodeDataDefaults(g1) <- list(w=NA, n="") nodeData(g1, n=c("a", "b"), attr="w") <- c(1, 2) nodeData(g1, n=c("a", "b"), attr="n") <- c("A", "B") edgeDataDefaults(g1) <- list(x=NA) edgeData(g1, from="a", to="d", attr="x") <- 6 edgeData(g1, from="a", to="c", attr="x") <- 7 g2 <- subGraph(c("a", "d"), g1) checkEquals("a", names(g2@nodeData)) g3 <- subGraph(c("a", "b", "c"), g1) checkEquals(c("a|c", "b|c"), names(g3@edgeData)) } testRemoveEdgeUndirected <- function() { g <- simpleGraphNEL() g1 <- removeEdge("a", c("c", "d"), g) checkEquals(3, numEdges(g1)) eD <- edges(g1) checkEquals(character(0), eD$a) checkEquals(c("c", "d"), eD$b) g2 <- removeEdge(c("c", "d"), "a", g) checkEquals(3, numEdges(g2)) eD <- edges(g2) checkEquals(character(0), eD$a) checkEquals(c("c", "d"), eD$b) } testRemoveEdgeDirected <- function() { g1 <- simpleDirectedGraphNEL() f <- c("a", "a") t <- c("c", "d") g2 <- removeEdge(from=f, to=t, g1) checkEquals(3, numEdges(g2)) checkTrue(!length(edges(g2)[["a"]])) } testRemoveEdgeLarge <- function() { ## This test is from Denise Scholtens set.seed(678) N <- 500 numEdges <- 2500 nodes <- paste("n", 1:500, sep="") g <- randomEGraph(nodes, edges=numEdges) edgemode(g) <- "directed" checkEquals(numEdges*2, numEdges(g)) from <- c("n1","n2","n2","n3","n5","n7","n7","n8","n8","n8","n9","n9", "n9") to <- c("n255","n383","n261","n381","n234","n225","n315","n38","n296", "n78","n310","n19","n422") g1 <- removeEdge(from, to, g) checkEquals(numEdges*2 - length(from), numEdges(g1)) } testRemoveEdgeLarge2 <- function() { ## This test is from a bug discovered by Dan Bebber From <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 5, 5, 8, 8, 8, 8, 8, 11, 11, 12, 12, 12, 14, 14, 16, 16, 20, 20, 23, 23, 24, 24, 25, 25, 29, 29, 32, 32, 32, 32, 38, 38, 41, 41, 41, 43, 43, 54, 54, 59, 59, 60, 68, 68, 69, 72, 82, 83, 88, 88, 88, 88, 89, 89, 90, 90, 96, 97, 98, 98, 98) To <- c(2, 5, 8, 11, 12, 14, 16, 20, 23, 37, 38, 54, 57, 68, 72, 81, 86, 87, 97, 88, 100, 32, 102, 38, 41, 49, 51, 53, 58, 59, 60, 63, 67, 71, 72, 75, 76, 84, 85, 24, 29, 25, 28, 26, 27, 30, 31, 33, 34, 35, 36, 40, 41, 42, 43, 47, 44, 45, 55, 56, 60, 62, 61, 70, 71, 71, 73, 84, 84, 89, 90, 93, 94, 97, 141, 95, 141, 141, 98, 99, 141, 158) FT <- matrix(c(From, To), ncol=2) #create a 'from-to' matrix g <- ftM2graphNEL(FT, edgemode="undirected") gr <- removeEdge(from=as.character(From[1:2]), to=as.character(To[1:2]), g) checkEquals(numEdges(g) - 2, numEdges(gr)) gr <- removeEdge(from=as.character(From[1:20]), to=as.character(To[1:20]), g) checkEquals(numEdges(g) - 20, numEdges(gr)) } test_eWV <- function() { V <- LETTERS[1:4] gR <- graphNEL(nodes=V) gX <- addEdge("A", "C", gR, 0.2) ans <- eWV(gX, edgeMatrix(gX), useNNames = TRUE) checkEquals(c("A--C"=0.2), ans) } testEdgeWeightsNoEdges <- function() { g <- graphNEL(nodes=letters[1:6]) expect <- lapply(edges(g), as.numeric) checkEquals(expect, edgeWeights(g)) } testRemoveNode1 <- function() { ## using the example from the removeNode help page V <- LETTERS[1:4] edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") gX <- removeNode("C", gR2) checkEquals(c("A", "B", "D"), nodes(gX)) gY <- removeNode(c("A","D"), gX) checkEquals("B", nodes(gY)) gZ <- removeNode(c("A","C","D"), gR2) checkEquals("B", nodes(gZ)) ## XXX: using direct slot access to verify that edge attributes ## have been completely removed. checkTrue(length(gZ@edgeData@data) == 0) } testRemoveNode2 <- function() { g <- simpleDirectedGraphNEL() nds <- nodes(g) for (n in nds) { g2 <- removeNode(n, g) checkEquals(nds[nds != n], nodes(g2)) } } test_ugraph <- function() { g <- simpleDirectedGraphNEL() ug <- ugraph(g) eg <- simpleGraphNEL() checkTrue(isDirected(g)) checkTrue(!isDirected(ug)) checkEquals(nodes(g), nodes(ug)) checkEquals(nodes(eg), nodes(ug)) ## verify edges eGot <- edges(ug)[nodes(g)] eExp <- edges(eg)[nodes(g)] for (n in nodes(g)) { checkTrue(setequal(eExp[[n]], eGot[[n]])) } } test_rename_nodes_edgeWeights <- function() { g <- simpleGraphNEL() ew <- edgeWeights(g) ew <- lapply(ew, function(x) { names(x) <- toupper(names(x)) x }) names(ew) <- toupper(names(ew)) nodes(g) <- LETTERS[1:4] checkEquals(LETTERS[1:4], nodes(g)) checkEquals(ew, edgeWeights(g)) } test_rename_nodes_nodeData <- function() { g <- simpleGraphNEL() nodeDataDefaults(g) <- list(type=NA) nodeData(g, n="a", attr="type") <- "the first one" nodeData(g, n="d", attr="type") <- "the last one" ndDef <- nodeDataDefaults(g) nd <- nodeData(g, attr="type") names(nd) <- toupper(names(nd)) nodes(g) <- toupper(nodes(g)) checkEquals(nd, nodeData(g, attr="type")) } test_subgraph_attrs <- function() { x <- graphNEL(nodes=c("a", "b"), edgeL=list(a="b", b="b"), edgemode="directed") defs <- list(tag="NONE") nodeDataDefaults(x) <- defs edgeDataDefaults(x) <- defs nodeData(x, n="a", attr="tag") <- "zoo" edgeData(x, "a", "b", attr="tag") <- "yes" gg <- subGraph(c("a", "b"), x) checkEquals(defs, nodeDataDefaults(gg)) checkEquals(defs, edgeDataDefaults(gg)) checkEquals("zoo", nodeData(gg, "a", attr="tag")[[1]]) checkEquals("yes", edgeData(gg, "a", "b", attr="tag")[[1]]) } test_ftM2_with_self_edges <- function() { ft <- cbind(c(1:5,1,5),c(1:5,3,2)) W <- c(1:5,7,9) ## this failed till 2008-06-26: gr <- ftM2graphNEL(ft, W, edgemode="undirected") m <- as(gr, "matrix") g2 <- as(m, "graphNEL") m2 <- as(g2, "matrix") checkEquals(m2, m) checkEquals(which(m2 != 0), c(1,3,7,10,11,13,19,22,25)) } test_coerce_matrix_round_trip <- function() { V <- LETTERS[1:4] g <- graphNEL(nodes=V, edgemode="directed") g <- addEdge(V[1+0],V[1+1],g, 3) g <- addEdge(V[1+0],V[2+1],g, 1.5) g <- addEdge(V[1+0],V[3+1],g, 1.8) g <- addEdge(V[1+1],V[2+1],g, 4.3) g <- addEdge(V[1+2],V[3+1],g, 2.2) mat0 <- matrix(c(0, 0, 0, 0, 3, 0, 0, 0, 1.5, 4.3, 0, 0, 1.8, 0, 2.2, 0), ncol=4, dimnames = list(LETTERS[1:4], LETTERS[1:4])) checkEquals(mat0, as(g, "matrix")) checkEquals(mat0, as(as(mat0, "graphNEL"), "matrix")) } graph/inst/unitTests/gxl_test.R0000644000175100017510000000350412607264574017645 0ustar00biocbuildbiocbuildsimpleWithAttributes <- system.file("GXL/attributesExample.gxl", package="graph") if (nchar(simpleWithAttributes) == 0) stop("bad gxl path") testGxlNodes <- function() { con <- file(simpleWithAttributes) tryCatch({ g <- fromGXL(con) eNodes <- c("p", "q", "v", "w") checkEquals(eNodes, nodes(g)) }, finally=close(con)) } testGxlEdges <- function() { con <- file(simpleWithAttributes) tryCatch({ g <- fromGXL(con) eEdges <- list(p=c("v", "q"), q="w", v=character(0), w=character(0)) checkEquals(eEdges, edges(g)) }, finally=close(con)) } testGxlNodeAttrs <- function() { con <- file(simpleWithAttributes) tryCatch({ g <- fromGXL(con) checkEquals(316, nodeData(g, "w", "line")[[1]]) checkEquals(225, nodeData(g, "v", "line")[[1]]) checkEquals("main.c", nodeData(g, "p", "file")[[1]]) checkEquals(555, nodeData(g, "p", "code")[[1]]) checkEquals(1.234, nodeData(g, "p", "rate")[[1]]) checkEquals(TRUE, nodeData(g, "p", "pass")[[1]]) checkEquals(FALSE, nodeData(g, "p", "fail")[[1]]) checkTrue(is.na(nodeData(g, "p", "line")[[1]])) }, finally=close(con)) } testNodeEdgeOrderDoesNotMatter <- function() { gxlFile <- system.file("GXL/outOfOrderExample.gxl", package="graph") con <- file(gxlFile) tryCatch({ g <- fromGXL(con) checkEquals(c("p", "v", "q", "w"), nodes(g)) }, finally=close(con)) } testUndirectedReading <- function() { gxlFileGz <- system.file("GXL/graphExample-02.gxl.gz", package="graph") con <- gzfile(gxlFileGz, open="rb") tryCatch({ g <- fromGXL(con) checkEquals(10, numEdges(g)) checkEquals(9, numNodes(g)) }, finally=close(con)) } graph/inst/unitTests/leaves_test.R0000644000175100017510000000122412607264574020327 0ustar00biocbuildbiocbuildlibrary("graph") data(apopGraph) data(graphExamples) test_leaves_undirected <- function() { want <- "c" checkEquals(want, leaves(graphExamples[[1]])) } test_leaves_directed_in <- function() { want <- c("trkA", "CASP2", "CASP6", "DNA fragmentation", "Nucleus", "CASP9", "TRF3", "CASP10") checkTrue(setequal(want, leaves(apopGraph, degree.dir="out"))) } test_leaves_directed_in <- function() { want <- c("TNFa", "TNFb", "FasL", "CD40L", "FAP-1", "NGF", "Daxx", "Bax", "CASP4", "Glucocorticoid", "Mtd", "Bad", "CASP11", "Bcl-w") checkTrue(setequal(want, leaves(apopGraph, degree.dir="in"))) } graph/inst/unitTests/nodeAndEdgeData_test.R0000644000175100017510000002267212607264574022011 0ustar00biocbuildbiocbuild# # Test setup # simpleInciMat <- function() { ## Here's a simple graph for testing ## a b ## |\ /| ## | \___c___/ | ## | | | ## \ | / ## \____d____/ ## ## mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] mat } simpleDirectedGraph <- function() { ## Here's a simple graph for testing ## a b ## |\ /^ ## | \__>c<__/ | ## | ^ | ## \ | / ## \___>d____/ ## ## mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] mat graphAM(adjMat=mat, edgemode="directed") } testNodeDataDefaults <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) ## If no attributes have been defined, empty list. checkEquals(list(), nodeDataDefaults(g1)) ## Can assign a named list myEdgeAttributes <- list(foo=1, bar="blue") nodeDataDefaults(g1) <- myEdgeAttributes checkEquals(myEdgeAttributes, nodeDataDefaults(g1)) checkEquals(myEdgeAttributes$foo, nodeDataDefaults(g1, attr="foo")) nodeDataDefaults(g1, attr="size") <- 400 checkEquals(400, nodeDataDefaults(g1, attr="size")) checkException(nodeDataDefaults(g1, attr="NOSUCHATTRIBUTE"), silent=TRUE) checkException(nodeDataDefaults(g1) <- list(1, 3, 4), silent=TRUE) ## must have names } testEdgeDataDefaults <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) ## If no attributes have been defined, empty list. checkEquals(list(), edgeDataDefaults(g1)) ## Can assign a named list myEdgeAttributes <- list(foo=1, bar="blue") edgeDataDefaults(g1) <- myEdgeAttributes checkEquals(myEdgeAttributes, edgeDataDefaults(g1)) checkEquals(myEdgeAttributes$foo, edgeDataDefaults(g1, attr="foo")) edgeDataDefaults(g1, attr="size") <- 400 checkEquals(400, edgeDataDefaults(g1, attr="size")) checkException(edgeDataDefaults(g1, attr="NOSUCHATTRIBUTE"), silent=TRUE) checkException(edgeDataDefaults(g1) <- list(1, 3, 4), silent=TRUE) ## must have names } testNodeDataGetting <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) myAttributes <- list(size=1, dim=c(3, 3), name="fred") nodeDataDefaults(g1) <- myAttributes checkEquals("fred", nodeData(g1, "a", attr="name")[[1]]) someNodes <- c("a", "b") expect <- as.list(c(1, 1)) names(expect) <- someNodes checkEquals(expect, nodeData(g1, n=someNodes, attr="size")) expect <- as.list(rep("fred", length(nodes(g1)))) names(expect) <- nodes(g1) checkEquals(expect, nodeData(g1, attr="name")) checkEquals(myAttributes, nodeData(g1, n="a")[[1]]) everything <- nodeData(g1) for (alist in everything) checkEquals(myAttributes, alist) } testNodeDataSetting <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) myAttributes <- list(size=1, dim=c(3, 3), name="fred") nodeDataDefaults(g1) <- myAttributes ## unknown node is error checkException(nodeData(g1, n="UNKNOWN_NODE", attr="size") <- 5, silent=TRUE) ## unknown attr is error checkException(nodeData(g1, n="a", attr="UNKNOWN") <- 5, silent=TRUE) nodeData(g1, n="a", attr="size") <- 5 checkEquals(5, nodeData(g1, n="a", attr="size")[[1]]) nodeData(g1, n=c("a", "b", "c"), attr="size") <- 50 expect <- myAttributes expect[["size"]] <- 50 checkEquals(list(a=expect, b=expect, c=expect), nodeData(g1, n=c("a", "b", "c"))) nodeData(g1, n=c("a", "b", "c"), attr="size") <- c(1, 2, 3) checkEquals(c(1, 2, 3), as.numeric(nodeData(g1, n=c("a", "b", "c"), attr="size"))) nodeData(g1, attr="name") <- "unknown" expect <- as.list(rep("unknown", length(nodes(g1)))) names(expect) <- nodes(g1) checkEquals(expect, nodeData(g1, attr="name")) } testEdgeDataGetting <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) myAttributes <- list(size=1, dim=c(3, 3), name="fred") edgeDataDefaults(g1) <- myAttributes checkEquals("fred", edgeData(g1, from="a", to="d", attr="name")[[1]]) fr <- c("a", "b") to <- c("c", "c") expect <- as.list(c(1, 1)) names(expect) <- c("a|c", "b|c") checkEquals(expect, edgeData(g1, fr, to, attr="size")) expect <- rep("fred", sum(sapply(edges(g1), length))) checkEquals(expect, as.character(edgeData(g1, attr="name"))) checkEquals(myAttributes, edgeData(g1, from="a", to="c")[[1]]) everything <- edgeData(g1) for (alist in everything) checkEquals(myAttributes, alist) got <- edgeData(g1, from="d", attr="size") checkEquals(3, length(got)) checkEquals(rep(1, 3), as.numeric(got)) got <- edgeData(g1, to="d", attr="size") checkEquals(3, length(got)) checkEquals(rep(1, 3), as.numeric(got)) expect <- c("a|c", "a|d", "d|a", "d|b", "d|c") checkEquals(expect, names(edgeData(g1, from=c("a", "d"), attr="name"))) } testEdgeDataToOnlyUndir <- function() { mat <- simpleInciMat() mat[1, 3] <- mat[3, 1] <- 100 mat[1, 4] <- mat[4, 1] <- 200 g1 <- graphAM(adjMat=mat, values=list(weight=1)) got <- edgeData(g1, to=c("a", "b"), attr="weight") expect <- c("c|a", "d|a", "c|b", "d|b") checkEquals(expect, names(got)) } testEdgeDataToOnlyDir <- function() { g1 <- simpleDirectedGraph() edgeDataDefaults(g1, attr="weight") <- 1 edgeData(g1, from=c("a", "b"), to=c("c", "c"), attr="weight") <- c(10, 20) got <- edgeData(g1, to=c("a", "b"), attr="weight") expect <- c("d|b") checkEquals(expect, names(got)) } testEdgeDataSettingDirected <- function() { g1 <- simpleDirectedGraph() myAttributes <- list(size=1, dim=c(3, 3), name="fred") edgeDataDefaults(g1) <- myAttributes edgeData(g1, from="a", to="d", attr="name") <- "Joe" expect <- myAttributes expect[["name"]] <- "Joe" checkEquals(expect, edgeData(g1, from="a", to="d")[[1]]) fr <- c("a", "b") to <- c("c", "c") expect <- as.list(c(5, 5)) names(expect) <- c("a|c", "b|c") edgeData(g1, fr, to, attr="size") <- 5 checkEquals(expect, edgeData(g1, fr, to, attr="size")) expect <- as.list(c(10, 20)) names(expect) <- c("a|c", "b|c") edgeData(g1, fr, to, attr="size") <- c(10, 20) checkEquals(expect, edgeData(g1, fr, to, attr="size")) edgeData(g1, from="a", attr="size") <- 555 checkEquals(rep(555, 2), as.numeric(edgeData(g1, from="a", attr="size"))) edgeData(g1, to="b", attr="size") <- 111 checkEquals(111, as.numeric(edgeData(g1, to="b", attr="size"))) } testEdgeDataSettingUndirected <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) myAttributes <- list(size=1, dim=c(3, 3), name="fred") edgeDataDefaults(g1) <- myAttributes edgeData(g1, from="a", to="d", attr="name") <- "Joe" expect <- myAttributes expect[["name"]] <- "Joe" checkEquals(expect, edgeData(g1, from="a", to="d")[[1]]) ## verify reciprocal edge data was set checkEquals("Joe", edgeData(g1, from="d", to="a", attr="name")[[1]]) fr <- c("a", "b") to <- c("c", "c") expect <- as.list(c(5, 5)) names(expect) <- c("a|c", "b|c") edgeData(g1, fr, to, attr="size") <- 5 checkEquals(expect, edgeData(g1, fr, to, attr="size")) names(expect) <- c("c|a", "c|b") checkEquals(expect, edgeData(g1, to, fr, attr="size")) expect <- as.list(c(10, 20)) names(expect) <- c("a|c", "b|c") edgeData(g1, fr, to, attr="size") <- c(10, 20) checkEquals(expect, edgeData(g1, fr, to, attr="size")) names(expect) <- c("c|a", "c|b") checkEquals(expect, edgeData(g1, to, fr, attr="size")) edgeData(g1, from="a", attr="size") <- 555 checkEquals(rep(555, 2), as.numeric(edgeData(g1, from="a", attr="size"))) checkEquals(555, edgeData(g1, from="c", to="a", attr="size")[[1]]) edgeData(g1, to="b", attr="size") <- 111 checkEquals(rep(111, 2), as.numeric(edgeData(g1, to="b", attr="size"))) checkEquals(111, edgeData(g1, from="c", to="b", attr="size")[[1]]) } testEdgeDataSettingFromOnly <- function() { mat <- simpleInciMat() g1 <- graphAM(adjMat=mat) myAttributes <- list(size=1, dim=c(3, 3), name="fred") edgeDataDefaults(g1) <- myAttributes expect <- rep("fred", 5) got <- unlist(edgeData(g1, from=c("a", "d"), attr="name"), use.names=FALSE) checkEquals(expect, got, "precondition check") edgeData(g1, from=c("a", "d"), attr="name") <- "Sam" expect <- rep("Sam", 5) got <- unlist(edgeData(g1, from=c("a", "d"), attr="name"), use.names=FALSE) checkEquals(expect, got, "use from only in assign") } testNormalizeEdges <- function() { checkException(graph:::.normalizeEdges(c("b", "d"), c("a", "b", "c")), silent=TRUE) checkException(graph:::.normalizeEdges(c("a", "b", "c"), c("a", "e")), silent=TRUE) f <- letters[1:10] t <- letters[11:20] checkEquals(list(from=f, to=t), graph:::.normalizeEdges(f, t)) checkEquals(list(from=c("a", "a", "a"), to=c("a", "b", "c")), graph:::.normalizeEdges("a", c("a", "b", "c"))) checkEquals(list(from=c("a", "b", "c"), to=c("d", "d", "d")), graph:::.normalizeEdges(c("a", "b", "c"), "d")) } graph/inst/unitTests/setbit_test.R0000644000175100017510000000636512607264574020355 0ustar00biocbuildbiocbuild.testbit <- graph:::testbit setbitv <- graph:::setbitv setbit <- graph:::setbit bitToMat <- graph:::bitToMat makebits <- graph:::makebits test_setbitv <- function() { len <- 5L * 8L xx <- makebits(len) for (i in seq_len(len)) { checkEquals(FALSE, .testbit(xx, i)) xx <- setbitv(xx, i, FALSE) checkEquals(FALSE, .testbit(xx, i)) } xx <- makebits(len) for (i in seq_len(len)) { checkEquals(FALSE, .testbit(xx, i)) xx <- setbitv(xx, i, TRUE) checkEquals(TRUE, .testbit(xx, i), msg=paste("iter", i)) } for (i in seq_len(len)) checkEquals(TRUE, .testbit(xx, i)) for (i in seq_len(len)) xx <- setbitv(xx, i, FALSE) for (i in seq_len(len)) checkEquals(FALSE, .testbit(xx, i)) } test_setbitv_vectorized <- function() { len <- 3L * 8L xx <- makebits(len) xxall <- setbitv(xx, 1:10, rep(TRUE, 10)) checkTrue(all(.testbit(xxall, 1:10))) checkTrue(!any(.testbit(xxall, 11:len))) } test_setbit_basics <- function() { xx <- makebits(40L) tf <- function(n) rawToBits(setbit(xx, n)[1]) got <- as.logical(do.call(rbind, lapply(1:8, tf))) dim(got) <- c(8, 8) want <- matrix(FALSE, nrow=8, ncol=8) diag(want) <- TRUE checkEquals(want, got) tf <- function(n) rawToBits(setbit(xx, n)[2]) got <- as.logical(do.call(rbind, lapply(9:16, tf))) dim(got) <- c(8, 8) want <- matrix(FALSE, nrow=8, ncol=8) diag(want) <- TRUE checkEquals(want, got) x2 <- setbit(xx, 38) for (i in 1:4) checkTrue(!as.logical(x2[i])) checkTrue(as.logical(x2[5])) } test_testbit <- function() { xx <- makebits(40) for (i in 1:(5 * 8)) { checkTrue(!.testbit(xx, i)) } checkTrue(!any(.testbit(xx, 1:40))) xx <- as.raw(rep(255L, 5)) for (i in 1:(5 * 8)) { checkTrue(.testbit(xx, i), i) } checkTrue(all(.testbit(xx, 1:40))) xx <- setbit(as.raw(5), 23) checkTrue(.testbit(xx, 23)) checkEquals(c(TRUE, TRUE), .testbit(xx, c(23, 23))) checkEquals(c(FALSE, TRUE), .testbit(xx, c(21, 23))) checkEquals(c(TRUE, FALSE), .testbit(xx, c(23, 24))) } rand_bitarray_matrix <- function(nrow, nset) { bv <- makebits(nrow^2, bitdim=c(nrow, nrow)) idx <- sample(1:(nrow^2), nset) setbitv(bv, idx, rep(1L, length(idx))) } test_bitToMat <- function() { make_mat <- function(nrow) { matrix(sample(c(0L, 1L), nrow^2, replace = TRUE), nrow = nrow) } do_test <- function(nrow) { m <- make_mat(nrow) bv <- makebits(nrow^2, bitdim=c(nrow, nrow)) bv <- setbitv(bv, which(m == 1L), rep(1L, sum(m))) checkEquals(m, bitToMat(bv)) } sizes <- c(1, 2, 5, 13, 26) reps <- c(2, 3, 25, 25, 25) for (i in seq_along(sizes)) { size <- sizes[i] for (j in seq_len(reps[i])) do_test(size) } } test_bitarray_transpose <- function() { nreps <- 25L sizes <- as.integer(c(1, 2, 4, 5, 6, 7, 23, 24)) for (size in sizes) { for (i in seq_len(nreps)) { v0 <- rand_bitarray_matrix(size, ceiling((size^2) %/% 2)) m0 <- bitToMat(v0) want <- t(m0) vt <- .Call(graph:::graph_bitarray_transpose, v0) mt <- bitToMat(vt) checkEquals(want, mt) } } } graph/inst/unitTests/simple_sparse_test.R0000644000175100017510000000141512607264574021720 0ustar00biocbuildbiocbuild.indexToCoord <- graph:::.indexToCoord .coordToIndex <- graph:::.coordToIndex set.seed(0x389d) check_coord_txfm <- function(n) { n <- as.integer(n) seqn <- seq_len(n) seqnn <- seq_len(n * n) coord <- cbind(rep(seqn, n), rep(seqn, each = n)) index <- .coordToIndex(coord[ , 1L], coord[, 2L], n) checkEquals(seqnn, index) got_coord <- .indexToCoord(seqnn, n) checkEquals(coord, got_coord) ## now check order preservation p1 <- sample(seqnn) p1coord <- coord[p1, ] if (n == 1L) { dim(p1coord) <- c(1L, 2L) } checkEquals(p1, .coordToIndex(p1coord[,1L], p1coord[,2L], n)) checkEquals(p1coord, .indexToCoord(p1, n)) } test_coordinate_txfm <- function() { for (i in 1:25) { check_coord_txfm(i) } } graph/man/0000755000175100017510000000000012607264574013463 5ustar00biocbuildbiocbuildgraph/man/DFS.Rd0000644000175100017510000000313312607264574014366 0ustar00biocbuildbiocbuild\name{DFS} \alias{DFS} \alias{DFS,graph,character-method} \title{Depth First Search } \description{ This function implements algorithm 4.2.1 of Gross and Yellen. The input is a \code{graph} and a \code{node} to start from. It returns a standard vertex labeling of \code{graph}. This is a vector with elements corresponding to the nodes of \code{graph} and with values that correspond to point in the depth first search the node is visited. } \usage{ DFS(object, node, checkConn=TRUE) } \arguments{ \item{object}{An instance of the \code{graph} class. } \item{node}{A \code{character} indicating the starting node. } \item{checkConn}{A \code{logical} indicating whether the connectivity of the graph should be checked. } } \details{ This function implements algorithm 4.2.1 of Gross and Yellen. Specific details are given there. It requires that the graph be connected. By default, this is checked, but since the checking can be expensive it is optional. A faster and mostly likely better implementation of depth first searching is given by \code{\link[RBGL:bfs]{dfs}} in the \pkg{RBGL} package. } \value{ A vector with names given by the nodes of \code{graph} whose values are \code{0} to one less than the number of nodes. These indices indicate the point at which the node will be visited. } \references{\emph{Graph Theory and its Applications}, J. Gross and J. Yellen. } \author{R. Gentleman } \seealso{\code{\link{boundary}}} \examples{ RNGkind("Mersenne-Twister") set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p=.3) RNGkind() DFS(g1, "a") } \keyword{manip} graph/man/IMCA.Rd0000644000175100017510000000404512607264574014466 0ustar00biocbuildbiocbuild\name{integrinMediatedCellAdhesion} \alias{IMCA} \alias{IMCAAttrs} \alias{IMCAGraph} \alias{integrinMediatedCellAdhesion} \docType{data} \title{KEGG Integrin Mediated Cell Adhesion graph} \description{ A graph representing the integrin-mediated cell adhesion pathway from KEGG, as well as a list of attributes for use in plotting the graph with \code{Rgraphviz}. } \usage{ data(integrinMediatedCellAdhesion) } \details{ The \code{integrinMediatedCellAdhesion} data set contains two objects: The first is \code{IMCAGraph}, which is an object of class \code{graph-NEL} and represents the hsa04510 graph from \code{KEGG}. The second is \code{IMCAAttrs}, which is a list of four elements. The first element, \code{defAttrs} corresponds to the \code{attrs} arguments of \code{\link[Rgraphviz]{agopen}} and \code{\link[Rgraphviz:plot-methods]{plot.graph}}. The second element is \code{nodeAttrs} which corresponds to the \code{nodeAttrs} argument in the same two functions from \code{Rgraphviz}. The third element, \code{subGList} corresponds to the \code{subGList} argument in those functions. Lastly, the fourth element, \code{LocusLink} provides a named list where the names are the nodes and the values are vectors of LocusLink ID values which correspond to those nodes. The values from \code{defAttrs}, \code{nodeAttrs} and \code{subGList} in the \code{IMCAAttrs} list are part of an ongoing attempt by Bioconductor to provide the set of options to most accurately recreate the actual visual image of the pathway from the KEGG site using \code{Rgraphviz}. Users may try out their own combination of attributes and settings for their own needs, but these represent our own efforts at as closely recreating the image as possible. } \source{ \url{http://www.genome.ad.jp/kegg/pathway/hsa/hsa04510.html} } \examples{ data(integrinMediatedCellAdhesion) if (require("Rgraphviz") & interactive()) plot(IMCAGraph, attrs=IMCAAttrs$defAttrs, nodeAttrs=IMCAAttrs$nodeAttrs, subGList=IMCAAttrs$subGList) } \keyword{datasets} graph/man/MAPKsig.Rd0000644000175100017510000000151212607264574015204 0ustar00biocbuildbiocbuild\name{MAPKsig} \alias{MAPKsig} \non_function{} \title{ A graph encoding parts of the MAPK signaling pathway } \description{ A graph encoding parts of the MAPK signaling pathway } \usage{data(MAPKsig)} \format{ The format is: Formal class 'graphNEL' [package "graph"] with edgemode "directed". } \source{ The KEGG pancreatic cancer pathway was visually inspected on 17 Sept 2007, and the subgraph associated with MAPK signaling was isolated. The HUGO names for each symbol in the KEGG visualization were obtained and checked for existance on hgu95av2. Some abbreviated terms for processes are also included as nodes. } %\references{ % %} \examples{ data(MAPKsig) if (require(Rgraphviz)) { nat = rep(FALSE, length(nodes(MAPKsig))) names(nat) = nodes(MAPKsig) plot(MAPKsig, nodeAttrs=list(fixedsize=nat)) } } \keyword{models} graph/man/MultiGraph-class.Rd0000644000175100017510000002630712607264574017141 0ustar00biocbuildbiocbuild\name{MultiGraph-class} \Rdversion{1.1} \docType{class} \alias{MultiGraph-class} \alias{nodes,MultiGraph-method} \alias{numEdges,MultiGraph-method} \alias{numEdges,MGEdgeSet-method} \alias{numNodes,MultiGraph-method} \alias{show,MultiGraph-method} \alias{MultiGraph} \alias{eweights} \alias{edgeSetIntersect0} \alias{edgeSetUnion0} \alias{subsetEdgeSets} \alias{extractFromTo} \alias{extractFromTo,MultiGraph-method} \alias{extractGraphAM} \alias{extractGraphBAM} \alias{isDirected,MultiGraph-method} \alias{ugraph,MultiGraph-method} % these are not supposed to be publicly available % but aliased here to quiet R CMD check \alias{isDirected,DiEdgeSet-method} \alias{isDirected,UEdgeSet-method} \alias{ugraph,DiEdgeSet-method} \alias{ugraph,UEdgeSet-method} \alias{graphIntersect,MultiGraph,MultiGraph-method} \alias{graphUnion,MultiGraph,MultiGraph-method} \alias{nodeData,MultiGraph,character,character-method} \alias{nodeData,MultiGraph,character,missing-method} \alias{nodeData,MultiGraph,missing,character-method} \alias{nodeData,MultiGraph,missing,missing-method} \alias{nodeData<-,MultiGraph,character,character-method} \alias{nodeData<-,MultiGraph,missing,character-method} \alias{mgEdgeDataDefaults} \alias{mgEdgeDataDefaults<-} \alias{mgEdgeDataDefaults,MultiGraph,character,character-method} \alias{mgEdgeDataDefaults,MultiGraph,character,missing-method} \alias{mgEdgeDataDefaults<-,MultiGraph,character,character,ANY-method} \alias{mgEdgeDataDefaults<-,MultiGraph,character,missing,list-method} \alias{nodeDataDefaults,MultiGraph,character-method} \alias{nodeDataDefaults,MultiGraph,missing-method} \alias{nodeDataDefaults<-,MultiGraph,character,ANY-method} \alias{nodeDataDefaults<-,MultiGraph,missing,list-method} \alias{mgEdgeData} \alias{mgEdgeData<-} \alias{mgEdgeData,MultiGraph,character,character,character,character-method} \alias{mgEdgeData,MultiGraph,character,character,missing,character-method} \alias{mgEdgeData,MultiGraph,character,missing,character,character-method} \alias{mgEdgeData,MultiGraph,character,missing,missing,character-method} \alias{mgEdgeData<-,MultiGraph,character,character,character,character-method} \alias{mgEdgeData<-,MultiGraph,character,character,missing,character-method} \alias{mgEdgeData<-,MultiGraph,character,missing,character,character-method} \alias{mgEdgeData<-,MultiGraph,character,missing,missing,character-method} \alias{edges,MultiGraph,character-method} \alias{edgeNames,MultiGraph-method} \alias{edges,MultiGraph,missing-method} \alias{edgeSets} \alias{edgeSets,MultiGraph-method} \title{EXPERIMENTAL class "MultiGraph"} \description{ The MultiGraph class represents a single node set and a set of edge sets. Each edge set is either directed or undirected. We can think of an edge in a MultiGraph as a 4-tuple (from-node, to-node, edge-type, weight), where the edge-type field in the tuple identifies the edge set, the weight is a numeric value, and the order of the nodes only matters in the case of a directed edge set. Unlike some of the graph representations, self-loops are allowed (from-node == to-node). There is support for arbitrary edge attributes which is primarily useful for rendering plots of MultiGraphs. These attributes are stored separately from the edge weights to facilitate efficient edge weight computation. } \usage{ MultiGraph(edgeSets, nodes = NULL, directed = TRUE, ignore_dup_edges = FALSE) eweights(object, names.sep = NULL) edgeSetIntersect0(g, edgeFun = NULL) edgeSetIntersect0(g, edgeFun = NULL) extractGraphAM(g, edgeSets) extractGraphBAM(g, edgeSets) } \arguments{ \item{edgeSets}{ A named list of \code{data.frame} objects each representing an edge set of the multigraph. Each \code{data.frame} must have three columns: "from", "to", and "weight". Columns "from" and "to" can be either factors or character vectors. The "weight" column must be numeric. } \item{nodes}{ A character vector of node labels. Nodes with zero degree can be included in a graph by specifying the node labels in \code{nodes}. The node set of the resulting multigraph is the union of the node labels found in \code{edgeSets} and \code{nodes}. } \item{directed}{ A logical vector indicating whether the edge sets specified in \code{edgeSets} represent directed edges. If this argument has length one, the value applies to all edge sets in \code{edgeSets}. Otherwise, this argument must have the same length as \code{edgeSets}, values are aligned by position. } \item{object}{ A \code{MultiGraph} instance } \item{g}{ A \code{MultiGraph} instance } \item{names.sep}{ The string to use as a separator between from and to node labels. If \code{NULL} no names will be attached to the returned vector. } \item{ignore_dup_edges}{ If \code{FALSE} (default), specifying duplicate edges in the input is an error. When set to \code{TRUE} duplicate edges are ignored. Edge weight values are ignored when determining duplicates. This is most useful for graph import and conversion. } \item{edgeFun}{ A user specified named list of functions to resolve edge attributes in a union or intersection operation } } \section{Constructors}{ \code{MultiGraph} } \section{Methods}{ \describe{ \item{nodes}{Return the nodes of the multigraph.} \item{numEdges}{Return an integer vector named by edge set containing edge counts for each edge set.} \item{numNodes}{Return the number of nodes in the multigraph.} \item{eweights}{Return a list named by edge set; each element is a numeric vector of edge weights for the corresponding edge set.} \item{isDirected}{Return a logical vector named by the edge sets in \code{object} with a \code{TRUE} indicating a directed edge set and \code{FALSE} for undirected.} \item{edges}{Returns a list named by edge set; for the edges in the MultiGraph} \item{edgeNames}{Returns a list named by the edge set; for the names of the edges in the MultiGraph} \item{extractFromTo}{Return a list named by the edge sets; each element is a data frame with column names from, to and weight corresponding to the connected nodes in the edge set.} \item{subsetEdgeSets}{Return a new \code{MultiGraph} object representing the subset of edge sets from the original \code{MultiGraph}.} \item{extractGraphAM}{Return a named \code{list} of \code{graphAM} objects corresponding to the edge sets from the original \code{MultiGraph}.} \item{extractGraphBAM}{Return a named \code{list} of \code{graphBAM} objects corresponding to the edge sets from the original \code{MultiGraph}.} \item{ugraph}{Return a new \code{MultiGraph} object in which all edge sets have been converted to undirected edge sets. This operation sets all edge weights to one and drops other edge attributes.} \item{edgeSetIntersect0}{Return a new \code{MultiGraph} object representing the intersection of edges across all edge sets within \code{g}. The return value will have a single edge set if the edge sets in \code{g} are disjoint. Otherwise, there will be a single edge set containing the shared edges. The node set is preserved. Edge weights and edge attributes are transferred over to the output if they have the same value, else user has the option of providing a function to resolve the conflict.} \item{edgeSetUnion0}{Return a new \code{MultiGraph} object representing the union of edges across all edge sets within \code{g}. The node set is preserved. Edge weights and edge attributes are transferred over to the output if they have the same value, else user has the option of providing a function to resolve the conflict.} \item{\code{graphIntersect(x, y, nodeFun, edgeFun)}}{ When given two \code{MultiGraph} objects, \code{graphIntersect} returns a new \code{MultiGraph} containing the nodes and edges in common between the two graphs. The intersection is computed by first finding the intersection of the node sets, obtaining the induced subgraphs, and finding the intersection of the resulting edge sets. The corresponding named edgeSets in \code{x} and \code{y} should both be either directed or undirected.Node/Edge attributes that are equal are carried over to the result. Non equal edge/node attributes will result in the corresponding attribute being set to NA. The user has the option of providing a named list(names of edgeSets) of list (names of edge attributes) of edge functions correspoding to the names of the edge attributes for resolving conflicting edge attributes (\code{edgeFun}). For resolving any of the conflicting node attributes, the user has the option of providing a named \code{list} of functions corresponding to the node attribute names (\code{nodeFun}). } \item{\code{graphUnion(x, y, nodeFun, edgeFun)}}{ When given two \code{MultiGraph} objects, \code{graphUnion} returns a new \code{MultiGraph} containing the union of nodes and edges between the two graphs. The corresponding pairs of named edgeSets in \code{x} and \code{y} should both be either directed or undirected. Non equal edge/node attributes will result in the corresponding attribute being set to NA. The user has the option of providing a named list(names of edgeSets) of list (names of edge attributes) of edge functions correspoding to the names of the edge attributes for resolving conflicting edge attributes (\code{edgeFun}). For resolving any of the conflicting node attributes, the user has the option of providing a named \code{list} of functions corresponding to the node attribute names (\code{nodeFun}). } \item{ \code{edgeSets(object, ...)}}{ Returns the names of the edgeSets in the MultiGraph \code{object} as a character vector. } \item{show}{Prints a short summary of a MultiGraph object} } } \author{S. Falcon, Gopalakrishnan N} \examples{ ft1 <- data.frame(from=c("a", "a", "a", "b", "b"), to=c("b", "c", "d", "a", "d"), weight=c(1, 3.1, 5.4, 1, 2.2)) ft2 <- data.frame(from=c("a", "a", "a", "x", "x", "c"), to=c("b", "c", "x", "y", "c", "a"), weight=c(3.4, 2.6, 1, 1, 1, 7.9)) esets <- list(es1=ft1, es2=ft2) g <- MultiGraph(esets) nodes(g) numEdges(g) eweights(g) eweights(g, names.sep = "=>") isDirected(g) edges(g, edgeSet ="es1") edges(g, "a", "es1") edgeNames(g, "es2") edgeSets(g) ug <- ugraph(g) isDirected(ug) numEdges(ug) edgeSetIntersect0(g) subsetEdgeSets(g, "es1") extractFromTo(g) extractGraphAM(g) extractGraphAM(g, "es1") extractGraphBAM(g, "es1") graphIntersect(g, g) graphUnion(g,g) mgEdgeDataDefaults(g, "es1", attr = "color" ) <- "white" mgEdgeData(g, "es1", from = "a", to = c("b", "c"), attr = "color") <- "red" mgEdgeData(g, "es1", from = "a", to = c("b", "c"), attr = "color") nodeDataDefaults(g, attr ="shape") <- "circle" nodeData(g, n = c("a", "b", "c"), attr = "shape") <- "triangle" nodeData(g, n = c("a", "b", "x", "y"), attr = "shape") } \keyword{classes} graph/man/acc-methods.Rd0000644000175100017510000000317112607264574016143 0ustar00biocbuildbiocbuild\name{acc-methods} \docType{methods} \alias{acc-methods} \alias{acc,graph-method} \alias{acc,clusterGraph-method} \alias{acc} \alias{acc,graph,character-method} \alias{acc,clusterGraph,character-method} \title{Methods for Accessibility Lists} \description{ This generic function takes an object that inherits from the \code{graph} class and a node in that graph and returns a vector containing information about all other nodes that are accessible from the given node. The methods are vectorized so that \code{index} can be a vector. } \usage{ \S4method{acc}{graph,character}(object, index) \S4method{acc}{clusterGraph,character}(object, index) } \arguments{ \item{object}{An instance of the appropriate graph class.} \item{index}{A character vector specifying the nodes for which accessibilty information is wanted.} } \value{ The methods should return a named list of integer vectors. The \code{names} of the list correspond to the names of the supplied nodes. For each element of the list the returned vector is named. The names of the vector elements correspond to the nodes that are accessible from the given node. The values in the vector indicate how many edges are between the given node and the node in the return vector. } \section{Methods}{\describe{ \item{object = graph}{An object of class graph.} \item{object = clusterGraph}{An instance of the \code{clusterGraph} class.} \item{index}{A \code{character} vector of indices corresponding to nodes in the graph.} } } \examples{ set.seed(123) gR3 <- randomGraph(LETTERS[1:10], M<-1:2, p=.5) acc(gR3, "A") acc(gR3, c("B", "D")) } \keyword{methods} graph/man/addEdge.Rd0000644000175100017510000000275512607264574015300 0ustar00biocbuildbiocbuild\name{addEdge} \alias{addEdge} \title{ addEdge } \description{ A function to add an edge to a graph. } \usage{ addEdge(from, to, graph, weights) } \arguments{ \item{from}{The node the edge starts at } \item{to}{The node the edge goes to. } \item{graph}{The graph that the edge is being added to. } \item{weights}{A vector of weights, one for each edge. } } \details{ Both \code{from} and \code{to} can be vectors. They need not be the same length (if not the standard rules for replicating the shorter one are used). Edges are added to the graph between the supplied nodes. The \code{weights} are given for each edge. The implementation is a bit too oriented towards the \code{graphNEL} class and will likely change in the next release to accomodate more general graph classes. If the graph is undirected then the edge is bidirectional (and only needs to be added once). For directed graphs the edge is directional. } \value{ A new instance of a graph object with the same class as \code{graph} but with the indicated edges added. } \author{R. Gentleman} \seealso{\code{\link{addNode}},\code{\link{removeEdge}}, \code{\link{removeNode}} } \examples{ V <- LETTERS[1:4] edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") gX <- addEdge("A", "C", gR2, 1) gR3 <- randomEGraph(letters[10:14], .4) gY <- addEdge("n", "l", gR3, 1) } \keyword{ manip } graph/man/addNode.Rd0000644000175100017510000000342712607264574015316 0ustar00biocbuildbiocbuild\name{addNode} \alias{addNode} \alias{addNode,character,graphNEL,missing-method} \alias{addNode,character,graphNEL,list-method} \alias{addNode,character,distGraph,list-method} \alias{addNode,character,graphBAM,missing-method} \title{ addNode } \description{ Add one or more nodes to a graph. } \usage{ addNode(node, object, edges) } \arguments{ \item{node}{A character vector of node names. } \item{object}{A \code{graph} } \item{edges}{A named list of edges.} } \details{ The supplied \code{node}s are added to the set of nodes of the \code{object}. If \code{edges} are provided then their must be the same number as there are \code{node}s and the must be in the same order. The elements of the \code{edges} list are vectors. They can be character vectors of node labels for nodes in \code{object} and if so then they are added with unit weights. If the vector is numeric then it must be named (with labels corresponding to nodes in the \code{object}) and the values are taken to be the edge weights. When the \code{object} is a \code{distGraph} then the \code{edges} must be supplied and they must contain appropriate distances for all nodes both those in \code{object} and those supplied. } \value{ A new graph of the same class as \code{object} with the supplied node added to the set of nodes. } \author{R. Gentleman } \seealso{\code{\link{removeNode}}, \code{\link{removeEdge}}, \code{\link{addEdge}}} \examples{ V <- LETTERS[1:4] edL1 <- vector("list", length=4) names(edL1) <- V for(i in 1:4) edL1[[i]] <- list(edges=c(2,1,4,3)[i], weights=sqrt(i)) gR <- graphNEL(nodes=V, edgeL=edL1) gX <- addNode("X", gR) set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p=.3) g2 <- addNode("z", g1, edges=list(c("a", "h", "g"))) } \keyword{ manip } graph/man/adj-methods.Rd0000644000175100017510000000176412607264574016161 0ustar00biocbuildbiocbuild\name{adj-methods} \docType{methods} \alias{adj} \title{ Methods for finding the adjacency list for selected nodes. } \alias{adj-methods} \description{ This generic function takes an object that inherits from the \code{graph} class and a node in that graph and returns a vector containing information about all other nodes that are adjacent to the given node. This means that they are joined to the given node by an edge. The accessibility list, \code{\link{acc}} is the list of all nodes that can be reached from a specified node. } \value{ The methods return vector of nodes that are adjacent to the specified node. } \section{Methods}{\describe{ \item{object = graph}{An object that inherits from glass \code{graph}} \item{index}{An index (could be multiple) which can be either the integer offset for the node(s) or their labels.} }} \seealso{\code{\link{acc-methods}}} \examples{ set.seed(123) gR3 <- randomGraph(LETTERS[1:4], M<-1:2, p=.5) adj(gR3, "A") adj(gR3, c(2,3)) } \keyword{methods} graph/man/adjacencyMatrix.Rd0000644000175100017510000000210112607264574017052 0ustar00biocbuildbiocbuild\name{adjacencyMatrix} \alias{adjacencyMatrix} \alias{adjacencyMatrix,graphBAM-method} \title{Compute an Adjacency Matrix for a graphBAM object } \description{ Though unwieldy for large matrices, a full adjacency matrix can be useful for debugging and export. If the graph is \dQuote{undirected} then recicprocal edges are explicit in the matrix. } \usage{ adjacencyMatrix(object) } \arguments{ \item{object}{A \code{graphBAM} object. } } \details{ Thus far only implemented for \code{graphBAM} objects. } \value{ \code{adjacencyMatrix} returns an n x n matrix, where n is the number of nodes in the graph, ordered in the same manner as seen in the \code{nodes} method. All cells in the matrix are \code{0} except where edges are found. } \author{P. Shannon} \seealso{ \code{\link{edgeMatrix}} } \examples{ from <- c("a", "a", "a", "x", "x", "c") to <- c("b", "c", "x", "y", "c", "a") weight <- c(3.4, 2.6, 1.7, 5.3, 1.6, 7.9) df <- data.frame(from, to, weight) g1 <- graphBAM(df, edgemode = "directed") adjacencyMatrix(g1) } \keyword{manip } graph/man/apoptosisGraph.Rd0000644000175100017510000000270312607264574016757 0ustar00biocbuildbiocbuild\name{apoptosisGraph} \alias{apopGraph} \alias{apopAttrs} \alias{apopLocusLink} \docType{data} \title{KEGG apoptosis pathway graph} \description{ A graph representing the apoptosis pathway from KEGG, as well as a data.frame of attributes for use in plotting the graph with \code{Rgraphviz} and a list to compare the nodes with their respective LocusLink IDs. } \usage{ data(apopGraph) } \details{ The \code{apopGraph} data set contains three objects: The first is \code{apopGraph}, which is an object of class \code{graph-NEL} and represents the hsa04210 graph from \code{KEGG}. The second is \code{apopAttrs}, which is a data.frame with two columns, and a row for every node in \code{apopGraph}. The first column lists what color the node is represented with on the \code{KEGG} site. The second column lists the type of the node - either \code{genesym} or \code{text}. Most nodes are of type \code{genesym} as they represent genes, but some of the nodes in the \code{KEGG} graph were not genes and thus those nodes are of type \code{text}. The third, \code{apopLocusLink} is a named list where the names correspond to the node names in \code{apopGraph}. The values of the list are the LocusLink IDs that correspond to that node in the KEGG graph. } \source{ \url{http://www.genome.ad.jp/kegg/pathway/hsa/hsa04210.html} } \examples{ data(apopGraph) if (require("Rgraphviz") & interactive()) plot(apopGraph) } \keyword{datasets} graph/man/attrData-class.Rd0000644000175100017510000000566312607264574016633 0ustar00biocbuildbiocbuild\name{attrData-class} \docType{class} \alias{attrData-class} \alias{attrDataItem<-,attrData,character,character-method} \alias{attrDataItem,attrData,character,missing-method} \alias{attrDataItem,attrData,character,character-method} \alias{attrDefaults<-,attrData,character,ANY-method} \alias{attrDefaults<-,attrData,missing,list-method} \alias{attrDefaults,attrData,missing-method} \alias{attrDefaults,attrData,character-method} \alias{initialize,attrData-method} \alias{names,attrData-method} \alias{names<-,attrData,character-method} \alias{removeAttrDataItem<-} \alias{removeAttrDataItem<-,attrData,character,NULL-method} \title{Class "attrData"} \description{A container class to manage generic attributes. Supports named attributes with default values with methods for vectorized access. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("attrData", defaults)}. The \code{defaults} argument should be a named list containing the initial attribute names and default values. } \section{Slots}{ \describe{ \item{\code{data}:}{Where custom attribute data is stored} \item{\code{defaults}:}{A named list of known attribute names and defualt values.} } } \section{Methods}{ \describe{ \item{attrDataItem<-}{\code{signature(self = "attrData", x = "character", attr = "character")}: ... } \item{attrDataItem}{\code{signature(self = "attrData", x = "character", attr = "missing")}: ... } \item{attrDataItem}{\code{signature(self = "attrData", x = "character", attr = "character")}: ... } \item{attrDefaults<-}{\code{signature(self = "attrData", attr = "character", value = "ANY")}: ... } \item{attrDefaults<-}{\code{signature(self = "attrData", attr = "missing", value = "list")}: ... } \item{attrDefaults}{\code{signature(self = "attrData", attr = "missing")}: ... } \item{attrDefaults}{\code{signature(self = "attrData", attr = "character")}: ... } \item{initialize}{\code{signature(.Object = "attrData")}: ... } \item{names}{return the names of the stored attributes} \item{names<-}{set the names of the stored attributes} \item{removeAttrDataItem}{\code{signature(self="attrData", x="character", value="NULL")}: Remove the data associated with the key specified by \code{x}.} } } \author{Seth Falcon} \examples{ defaultProps <- list(weight=1, color="blue", friends=c("Bob", "Alice")) adat <- new("attrData", defaults=defaultProps) ## Get all defaults attrDefaults(adat) ## Or get only a specific attribute attrDefaults(adat, attr="color") ## Update default weight attrDefaults(adat, attr="weight") <- 500 ## Add new attribute attrDefaults(adat, attr="length") <- 0 ## Asking for the attributes of an element you haven't customized ## returns the defaults attrDataItem(adat, x=c("n1", "n2"), attr="length") ## You can customize values attrDataItem(adat, x=c("n1", "n2"), attr="length") <- 5 ## What keys have been customized? names(adat) } \keyword{classes} graph/man/attrDataItem-methods.Rd0000644000175100017510000000245512607264574020004 0ustar00biocbuildbiocbuild\name{attrDataItem-methods} \docType{methods} \alias{attrDataItem-methods} \alias{attrDataItem<--methods} \alias{attrDataItem} \alias{attrDataItem<-} \title{Get and set attributes values for items in an attrData object} \usage{ attrDataItem(self, x, attr) attrDataItem(self, x, attr) <- value } \arguments{ \item{self}{A \code{\link{attrData-class}} instance} \item{x}{A \code{character} vector of item names} \item{attr}{A \code{character} vector of length 1 giving the attribute name to get/set. Note that the attribute name must have already been defined for the \code{attrData} object via \code{\link{attrDefaults}}. If missing, return a list of all attributes for the specified nodes.} \item{value}{An R object to set as the attribute value for the specified items. If the object has length one or does not have a length method defined, it will be assigned to all items in \code{x}. If the length of \code{value} is the same as \code{x}, the corresponding elements will be assigned. We will add an argument to indicate that the \code{value} is to be taken as-is for those cases where the lengths are the same coincidentally.} } \description{ The \code{attrDataItem} method provides get/set access to items stored in a \code{\link{attrData-class}} object. } \keyword{methods} graph/man/attrDefaults-methods.Rd0000644000175100017510000000172612607264574020063 0ustar00biocbuildbiocbuild\name{attrDefaults-methods} \docType{methods} \alias{attrDefaults-methods} \alias{attrDefaults<--methods} \alias{attrDefaults} \alias{attrDefaults<-} \title{Get and set the default attributes of an attrData object} \usage{ attrDefaults(self, attr) attrDefaults(self, attr) <- value } \arguments{ \item{self}{A \code{\link{attrData-class}} instance} \item{attr}{A \code{character} vector of length 1 giving the name of an attribute. Can be missing.} \item{value}{An R object that will be used as the default value of the specified attribute, or a named list of attribute name/default value pairs if \code{attr} is missing.} } \description{ The \code{attrDefaults} method provides access to a \code{\link{attrData-class}} object's default attribute list. The default attribute list of a \code{attrData-class} object defines what attributes can be customized for individual data elements by defining attribute names and default values. } \keyword{methods} graph/man/aveNumEdges.Rd0000644000175100017510000000116712607264574016162 0ustar00biocbuildbiocbuild\name{aveNumEdges} \alias{aveNumEdges} \title{ Calculate the average number of edges in a graph } \description{ aveNumEdges divides the number of edges in the graph by the number of nodes to give the average number of edges. } \usage{ aveNumEdges(objgraph) } \arguments{ \item{objgraph}{ the graph object } } \value{ A double representing the average number of edges will be returned. } \author{ Elizabeth Whalen } \seealso{ \code{\link{numEdges}}, \code{\link{mostEdges}}, \code{\link{numNoEdges}} } \examples{ set.seed(124) g1 <- randomGraph(1:10, letters[7:12], p=.6) aveNumEdges(g1) } \keyword{ manip } graph/man/biocRepos.Rd0000644000175100017510000000073212607264574015701 0ustar00biocbuildbiocbuild\name{biocRepos} \alias{biocRepos} \docType{data} \title{A graph representing the Bioconductor package repository} \description{ This graph is a rendition of the Bioconductor package repository and represents the dependency graph of that repository. An edge between two package denotes a dependency on the 'to' package by the 'from' package. } \usage{data(biocRepos)} \examples{ data(biocRepos) ## An example of usage will be here soon } \keyword{datasets} graph/man/boundary.Rd0000644000175100017510000000271612607264574015603 0ustar00biocbuildbiocbuild\name{boundary} \alias{boundary} \title{ Returns the Boundary between a Graph and a SubGraph } \description{ The boundary of a subgraph is the set of nodes in the original graph that have edges to nodes in the subgraph. The function \code{boundary} computes the boundary and returns it as a list whose length is the same length as the number of nodes in the subgraph. } \usage{ boundary(subgraph, graph) } \arguments{ \item{graph}{ the original graph from which the boundary will be created } \item{subgraph}{ can either be the vector of the node labels or the subgraph itself.} } \details{ The \emph{boundary} of a \emph{subgraph} is the set of nodes in the graph which have an edge that connects them to the specified subgraph but which are themselves not elements of the subgraph. For convenience users can specify the subgraph as either a graph or a vector of node labels. } \value{ This function returns a named list of length equal to the number of nodes in \code{subgraph}. The elements of the list correspond to the nodes in the \code{subgraph}. The elements are lists of the nodes in \code{graph} which share an edge with the respective node in \code{subgraph}. } \author{ Elizabeth Whalen and R. Gentleman } \seealso{ \code{\link{subGraph}}, \code{\link{graph-class}} } \examples{ set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p=.3) ##both should be "a" boundary(c("g", "i"), g1) } \keyword{ manip } graph/man/calcProb.Rd0000644000175100017510000000136612607264574015505 0ustar00biocbuildbiocbuild\name{calcProb} \alias{calcProb} \title{ Calculate the hypergeometric probability of the subgraph's number of edges. } \description{ \code{calcProb} calculates the probability of having the number of edges found in the subgraph given that it was made from \code{origgraph}. The hypergeometric distribution is used to calculate the probability (using the pdf). } \usage{ calcProb(subgraph, origgraph) } \arguments{ \item{subgraph}{ subgraph made from the original graph } \item{origgraph}{ original graph object from which the subgraph was made } } \value{ The probability of the subgraph's number of edges is returned. } \author{ Elizabeth Whalen } \seealso{ \code{\link{calcSumProb}} } \examples{ #none right now } \keyword{ manip } graph/man/calcSumProb.Rd0000644000175100017510000000332512607264574016167 0ustar00biocbuildbiocbuild\name{calcSumProb} \alias{calcSumProb} \title{ Calculate the probability that a subgraph has an unusual number of edges.} \description{ For any graph a set of nodes can be used to obtain an induced subgraph (see \code{\link{subGraph}}). An interesting question is whether that subgraph has an unusually large number of edges. This function computes the probability that a \emph{random} subgraph with the same number of nodes has more edges than the number observed in the presented subgraph. The appropriate probability distribution is the hypergeometric. } \usage{ calcSumProb(sg, g) } \arguments{ \item{sg}{ subgraph made from the original graph } \item{g}{ original graph object from which the subgraph was made } } \value{ The probability of having greater than or equal to the subgraph's number of edges is returned. } \details{ The computation is based on the following argument. In the original graph there are \eqn{n} nodes and hence \eqn{N=n*(n-1)/2} edges in the complete graph. If we consider these \eqn{N} nodes to be of two types, corresponding to those that are either in our graph, \code{g}, or not in it. Then we think of the subgraph which has say \eqn{m} nodes and \eqn{M=m*(m-1)/2} possible edges as representing \eqn{M} draws from an urn containing \eqn{N} balls of which some are white (those in \code{g}) and some are black. We count the number of edges in the subgraph and use a Hypergeomtric distribution to ask whether our subgraph is particularly dense. } \author{ Elizabeth Whalen } \seealso{ \code{\link{calcProb}} } \examples{ set.seed(123) V <- letters[14:22] g1 <- randomEGraph(V, .2) sg1 <- subGraph(letters[c(15,17,20,21,22)], g1) calcSumProb(sg1, g1) } \keyword{ manip } graph/man/clearNode.Rd0000644000175100017510000000141112607264574015643 0ustar00biocbuildbiocbuild\name{clearNode} \alias{clearNode} \title{ clearNode } \description{ This function removes all edges to or from the specified node in the graph. } \usage{ clearNode(node, object) } \arguments{ \item{node}{a node } \item{object}{a \code{graph} } } \details{ All edges to and from \code{node} are removed. \code{node} can be a vector. } \value{ A new instance of the graph with all edges to and from the specified node(s) removed. } \author{R. Gentleman} \seealso{\code{\link{removeNode}}, \code{\link{removeEdge}}} \examples{ V <- LETTERS[1:4] edL3 <- vector("list", length=4) for(i in 1:4) edL3[[i]] <- list(edges=(i\%\%4)+1, weights=i) names(edL3) <- V gR3 <- graphNEL(nodes=V, edgeL=edL3, "directed") g4 <- clearNode("A", gR3) } \keyword{manip } graph/man/clusterGraph-class.Rd0000644000175100017510000000472212607264574017525 0ustar00biocbuildbiocbuild\name{clusterGraph-class} \docType{class} \alias{clusterGraph-class} \alias{clusterGraph-class} \alias{adj,clusterGraph,ANY-method} \alias{coerce,clusterGraph,matrix-method} \alias{connComp,clusterGraph-method} \alias{edges,clusterGraph,missing-method} \alias{edges,clusterGraph,character-method} \alias{edgeL,clusterGraph-method} \alias{edgeWeights,clusterGraph-method} \alias{edgeWeights,clusterGraph,ANY-method} \alias{nodes,clusterGraph-method} \alias{nodes<-,clusterGraph,character-method} \alias{numNodes,clusterGraph-method} \alias{show,clusterGraph-method} \title{Class "clusterGraph" } \description{ A cluster graph is a special sort of graph for clustered data. Each cluster forms a completely connected subgraph. Three are no edges between clusters.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("clusterGraph", ...)}. } \section{Slots}{ \describe{ \item{\code{clusters}:}{Object of class \code{"list"} a list of the labels of the elements, one element of the list for each cluster. } } } \section{Extends}{ Class \code{"graph"}, directly. } \section{Methods}{ \describe{ \item{connComp}{\code{signature(object = "clusterGraph")}: find the connected components; simply the clusters in this case. } \item{acc}{\code{signature(object = "clusterGraph")}: find the accessible nodes from the supplied node. } \item{adj}{\code{signature(object = "clusterGraph")}: find the adjacent nodes to the supplied node. } \item{nodes}{\code{signature(object = "clusterGraph")}: return the nodes. } \item{nodes<-}{\code{signature(object="clusterGraph", value="character")}: replace the node names with the new labels given in \code{value}.} \item{numNodes}{\code{signature(object = "clusterGraph")}: return the number of nodes. } \item{edgeWeights}{Return a list of edge weights in a list format similar to the \code{edges} method.} \item{edgeL}{\code{signature(graph = "clusterGraph")}: A method for obtaining the edge list.} \item{coerce}{\code{signature(from = "clusterGraph", to = "matrix")}: Convert the \code{clusterGraph} to an adjacency matrix. Currently, weights are ignored. The conversion assumes no self-loops.} } } \author{R. Gentleman} \seealso{ \code{\link{graph-class}}, \code{\link{distGraph-class}} } \examples{ cG1 <- new("clusterGraph", clusters=list(a=c(1,2,3), b=c(4,5,6))) cG1 acc(cG1, c("1", "2")) } \keyword{classes} graph/man/clusteringCoefficient-methods.Rd0000644000175100017510000000300112607264574021723 0ustar00biocbuildbiocbuild\name{clusteringCoefficient-methods} \docType{methods} \alias{clusteringCoefficient} \alias{clusteringCoefficient,graph-method} \alias{clusteringCoefficient,graph} \title{Clustering coefficient of a graph} \description{ This generic function takes an object that inherits from the \code{graph} class. The graph needs to have \code{edgemode=="undirected"}. If it has \code{edgemode=="directed"}, the function will return NULL. } \usage{ \S4method{clusteringCoefficient}{graph}(object, selfLoops=FALSE) } \details{For a node with n adjacent nodes, if \code{selfLoops} is \code{FALSE}, the clustering coefficent is N/(n*(n-1)), where N is the number of edges between these nodes. The graph may not have self loops. If \code{selfLoops} is \code{TRUE}, the clustering coefficent is N/(n*n), where N is the number of edges between these nodes, including self loops. } \arguments{ \item{object}{An instance of the appropriate graph class.} \item{selfLoops}{Logical. If true, the calculation takes self loops into account.} } \value{A named numeric vector with the clustering coefficients for each node. For nodes with 2 or more edges, the values are between 0 and 1. For nodes that have no edges, the function returns the value NA. For nodes that have exactly one edge, the function returns NaN. } \author{Wolfgang Huber \url{http://www.dkfz.de/mga/whuber}} \examples{ set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p=.3) clusteringCoefficient(g1) clusteringCoefficient(g1, selfLoops=TRUE) } \keyword{methods} graph/man/combineNodes.Rd0000644000175100017510000000342412607264574016362 0ustar00biocbuildbiocbuild\name{combineNodes} \alias{combineNodes} \alias{combineNodes,character,graphNEL,character-method} \title{ combineNodes } \description{ A function to combine, or collapse, a specified set of nodes in a graph. } \usage{ combineNodes(nodes, graph, newName, \dots) \S4method{combineNodes}{character,graphNEL,character}(nodes, graph, newName, collapseFunction=sum) } \arguments{ \item{nodes}{A set of nodes that are to be collapsed. } \item{graph}{The graph containing the nodes } \item{newName}{The name for the new, collapsed node. } \item{collapseFunction}{Function or character giving the name of a function used to collapse the edge weights after combining nodes. The default is to sum up the weights, but mean would be a useful alternative.} \item{\dots}{Additional arguments for the generic} } \details{ The nodes specified are reduced to a single new node with label given by \code{newName}. The in and out edges of the set of nodes are all made into in and out edges for the new node. } \value{ An new instance of a graph of the same class as \code{graph} is returned. This new graph has the specified nodes reduced to a single node. } \author{R. Gentleman} \seealso{\code{\link{inEdges}}, \code{\link{addNode}}} \examples{ V <- LETTERS[1:4] edL1 <- vector("list", length=4) names(edL1) <- V for(i in 1:4) edL1[[i]] <- list(edges=c(2,1,4,3)[i], weights=sqrt(i)) gR <- graphNEL(nodes=V, edgeL=edL1, edgemode="directed") gR <- addNode("M", gR) gR <- addEdge("M", "A", gR, 1) gR <- addEdge("B", "D", gR, 1) gX <- combineNodes(c("B","D"), gR, "X") gR <- addNode("K", gR) gR <- addEdge(c("K","K"), c("D", "B"), gR, c(5,3)) edgeWeights(combineNodes(c("B","D"), gR, "X"))$K edgeWeights(combineNodes(c("B","D"), gR, "X", mean))$K } \keyword{ manip} graph/man/defunct.Rd0000644000175100017510000000061512607264574015404 0ustar00biocbuildbiocbuild\name{graph-defunct} \alias{graph-defunct} \title{Defunct Functions in Package \pkg{graph}} %------ PLEASE: put \alias{.} here for EACH ! \alias{pkgInstOrder} \alias{buildRepDepGraph} \alias{ugraphOld} % \description{ The functions or variables listed here are no longer part of the graph package. } \usage{ buildRepDepGraph() pkgInstOrder() ugraphOld() } \seealso{ \code{\link{Defunct}} } graph/man/distGraph-class.Rd0000644000175100017510000000452512607264574017010 0ustar00biocbuildbiocbuild\name{distGraph-class} \docType{class} \alias{distGraph-class} \alias{threshold} \alias{Dist} \alias{[.dist} \alias{distGraph-class} \alias{adj,distGraph,ANY-method} \alias{Dist,distGraph-method} \alias{edges,distGraph,missing-method} \alias{edges,distGraph,character-method} \alias{edgeL,distGraph-method} \alias{nodes,distGraph-method} \alias{numNodes,distGraph-method} \alias{show,distGraph-method} \alias{threshold,distGraph-method} \alias{edgeWeights,distGraph-method} \alias{edgeWeights,distGraph,ANY-method} \alias{initialize,distGraph-method} \title{Class "distGraph"} \description{ A class definition for graphs that are based on distances.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("distGraph", ...)}. } \section{Slots}{ \describe{ \item{\code{Dist}:}{Object of class \code{"dist"} that forms the basis for the edge weights used in the \code{distGraph}.} } } \section{Extends}{ Class \code{"graph"}, directly. } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "distGraph")}: a print method} \item{Dist}{\code{signature(object = "distGraph")}: return the dist object. } \item{adj}{\code{signature(object = "distGraph")}: find the nodes adjacent to the supplied node. } \item{nodes}{\code{signature(object = "distGraph")}: return the nodes in the graph. } \item{numNodes}{\code{signature(object = "distGraph")}: return the number of nodes. } \item{threshold}{\code{signature(object = "distGraph", k, value)}: set all distances that are larger than the supplied threshold, \code{k}, to the supplied value. The default is value is zero (and so is appropriate for similarities, rather than distances). } \item{initialize}{\code{signature(object = "distGraph")}: initialize a \code{distGraph} instance. } \item{edgeWeights}{Return a list of edge weights in a list format similar to the \code{edges} method.} \item{edgeL}{\code{signature(graph = "distGraph")}: A method for obtaining the edge list.} } } \references{Shamir's paper and Butte et al} \author{R. Gentleman } \seealso{\code{\link{graph-class}}, \code{\link{clusterGraph-class}}} \examples{ set.seed(123) x <- rnorm(26) names(x) <- letters library(stats) d1 <- dist(x) g1 <- new("distGraph", Dist=d1) } \keyword{classes} graph/man/duplicatedEdges.Rd0000644000175100017510000000153012607264574017037 0ustar00biocbuildbiocbuild\name{duplicatedEdges} \alias{duplicatedEdges} \title{duplicatedEdges } \description{ A multigraph is a graph where edges between nodes can be represented several times. For some algorithms this causes problems. \code{duplicatedEdges} tests an instance of the \code{graphNEL} class to see if it has duplicated edges and returns \code{TRUE} if it does and \code{FALSE} otherwise. } \usage{ duplicatedEdges(graph) } \arguments{ \item{graph}{An instance of the class \code{graphNEL} } } \details{ It would be nice to handle other types of graphs. } \value{ A logical, either \code{TRUE} if the graph has duplicated edges or \code{FALSE} it not. } \author{R. Gentleman } \seealso{ \code{\link{connComp}}, \code{\link{ugraph}} } \examples{ ##---- Should be DIRECTLY executable !! ---- ##-- ==> Define data, use random, } \keyword{manip } graph/man/edgeData-methods.Rd0000644000175100017510000000163412607264574017115 0ustar00biocbuildbiocbuild\name{edgeData-methods} \docType{methods} \alias{edgeData-methods} \alias{edgeData<--methods} \alias{edgeData} \alias{edgeData<-} \title{Get and set attributes for the edges of a graph object} \usage{ edgeData(self, from, to, attr) edgeData(self, from, to, attr) <- value } \arguments{ \item{self}{A \code{graph-class} instance} \item{from}{A \code{character} vector of node names} \item{to}{A \code{character} vector of node names} \item{attr}{A \code{character} vector of length one specifying the name of a node attribute} \item{value}{An R object to store as the attribute value} } \description{ Attributes of the edges of a graph can be accessed using \code{edgeData}. The attributes must be defined using \code{\link{edgeDataDefaults}}. You can ommit the \code{from} or \code{to} argument to retrieve attribute values for all edges to (respectively, from) a given node. } \keyword{methods} graph/man/edgeDataDefaults-methods.Rd0000644000175100017510000000123312607264574020600 0ustar00biocbuildbiocbuild\name{edgeDataDefaults-methods} \docType{methods} \alias{edgeDataDefaults-methods} \alias{edgeDataDefaults<--methods} \alias{edgeDataDefaults} \alias{edgeDataDefaults<-} \title{Get and set default attributes for the edges of a graph} \usage{ edgeDataDefaults(self, attr) edgeDataDefaults(self, attr) <- value } \arguments{ \item{self}{A \code{\link{graph-class}} instance} \item{attr}{A \code{character} vector of length one giving the name of the attribute} \item{value}{An R class to use as the default value for the specified attribute} } \description{ Set default values for attributes associated with the edges of a graph. } \keyword{methods} graph/man/edgeMatrix.Rd0000644000175100017510000000531112607264574016043 0ustar00biocbuildbiocbuild\name{edgeMatrix} \alias{edgeMatrix} \alias{eWV} \alias{pathWeights} \alias{edgeMatrix,graphNEL-method} \alias{edgeMatrix,graphAM-method} \alias{edgeMatrix,clusterGraph-method} \alias{edgeMatrix,distGraph-method} \alias{edgeMatrix,graphBAM-method} \title{Compute an Edge Matrix or weight vector for a Graph } \description{ For our purposes an \emph{edge matrix} is a matrix with two rows and as many columns as there are edges. The entries in the first row are the index of the node the edge is \emph{from}, those in the second row indicate the node the edge is \emph{to}. If the graph is \dQuote{undirected} then the \code{duplicates} option can be used to indicate whether reciprocal edges are wanted. The default is to leave them out. In this case the notions of \emph{from} and \emph{to} are not relevant. } \usage{ edgeMatrix(object, duplicates=FALSE) eWV(g, eM, sep = ifelse(edgemode(g) == "directed", "->", "--"), useNNames=FALSE) pathWeights(g, p, eM=NULL) } \arguments{ \item{object}{An object that inherits from \code{graph}. } \item{g}{An object that inherits from \code{graph}. } \item{duplicates}{Whether or not duplicate edges should be produced for \dQuote{undirected} graphs. } \item{eM}{An edge matrix} \item{sep}{a character string to concatenate node labels in the edge label} \item{useNNames}{a logical; if TRUE, node names are used in the edge label; if FALSE, node indices are used} \item{p}{a vector of node names constituting a path in graph \code{g}} \item{\dots}{arguments passed to \code{edgeMatrix}.} } \details{ Implementations for \code{graphNEL}, \code{clusterGraph} and \code{distGraph} are available. } \value{ \code{edgeMatrix} returns a matrix with two rows, \emph{from} and \emph{to}, and as many columns as there are edges. Entries indicate the index in the node vector that corresponds to the appropriate end of the edge. \code{eWV} uses the edge matrix to create an annotated vector of edge weights. \code{pathWeights} returns an annotated vector of edge weights for a specified path in a graph. } \note{A path through an undirected graph may have several representations as a named vector of edges. Thus in the example, when the weights for path b-a-i are requested, the result is the pair of weights for edges a--b and a--i, as these are the edge labels computed for graph g1.} \author{R. Gentleman } \seealso{ \code{\link{edges}} } \examples{ set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p=.3) edgeMatrix(g1) g2 <- new("clusterGraph", clusters=list(a=c(1,2,3), b=c(4,5,6))) em2 <- edgeMatrix(g2) eWV(g1, edgeMatrix(g1)) eWV(g1, edgeMatrix(g1), useNNames=TRUE) pathWeights(g1, c("b", "a", "i")) } \keyword{manip } graph/man/edgeSets.Rd0000644000175100017510000000146112607264574015517 0ustar00biocbuildbiocbuild\name{edgeSets} \alias{esetsFemale} \alias{esetsMale} \docType{data} \title{MultiGraph edgeSet data} \description{ C57BL/6J and C3H/HeJ mouse strains exhibit different cardiovascular and metabolic phenotypes on the hyperlipidemic apolipoprotein E (Apoe) null background. The interaction data for the genes from adipose, brain, liver and muscle tissue samples from male and female mice are included as a list of \code{data.frame}s. Each \code{data.frame} contains information for the \code{from-gene}, \code{to-gene} and the strength of interaction (\code{weight}) for each of the tissues studied. } \usage{ data(esetsFemale) data(esetsMale) } \source{ Sage Commons Repository \url{http://sagebase.org/commons/dataset1.php#UCLA1} } \examples{ data(esetsFemale) data(esetsMale) } \keyword{datasets} graph/man/edgeWeights.Rd0000644000175100017510000001034212607264574016211 0ustar00biocbuildbiocbuild\name{edgeWeights} \alias{edgeWeights} \title{Retrieve the edge weights of a graph} \description{ A generic function that returns the edge weights of a graph. If \code{index} is specified, only the weights for the edges from the specified nodes are returned. The user can control which edge attribute is interpreted as the weight, see the Details section. } \usage{ edgeWeights(object, index, ..., attr = "weight", default = 1, type.checker = is.numeric) } \arguments{ \item{object}{A graph, any object that inherits from the \code{graph} class.} \item{index}{If supplied, a character or numeric vector of node names or indices.} \item{...}{Unused.} \item{attr}{The name of the edge attribute to use as a weight. You can view the list of defined edge attributes and their default values using \code{edgeDataDefaults}. The default attribute name is \code{"weight"}, see the Details section.} \item{default}{The value to use if \code{object} has no edge attribute named by the value of \code{attr}. The default is the value 1 (double).} \item{type.checker}{A function that will be used to check that the edge weights are of the correct type. This function should return TRUE if the input vector is of the right type and FALSE otherwise. The default is to check for numeric edge weights using \code{is.numeric}. If no type checking is desired, specify \code{NULL}.} } \details{ If \code{index} is suppled, then edge weights from these nodes to all adjacent nodes are returned. If \code{index} is not supplied, then the edge weights for all nodes are returned. The value for nodes without any outgoing edges will be a zero-length vector of the appropriate mode. The \code{edgeWeights} method is a convenience wrapper around \code{edgeData}, the general-purpose way to access edge attribute information for a \code{graph} instance. In general, edge attributes can be arbitary R objects. However, for \code{edgeWeights} to make sense, the values must be vectors of length not more than one. By default, \code{edgeWeights} looks for an edge attribute with name \code{"weight"} and, if found, uses these values to construct the edge weight list. You can make use of attributes stored under a different name by providing a value for the \code{attr} argument. For example, if \code{object} is a graph instance with an edge attribute named \code{"WTS"}, then the call \code{edgeWeights(object, attr="WTS")} will attempt to use those values. The function specified by \code{type.checker} will be given a vector of edge weights; if the return value is not \code{TRUE}, then an error will be signaled indicating that the edge weights in the graph are not of the expected type. Type checking is skipped if \code{type.checker} is \code{NULL}. If the graph instance does not have an edge attribute with name given by the value of the \code{attr} argument, \code{default} will be used as the weight for all edges. Note that if there is an attribute named by \code{attr}, then its default value will be used for edges not specifically customized. See \code{edgeData} and \code{edgeDataDefaults} for more information. Because of their position after the \code{...}, no partial matching is performed for the arguments \code{attr}, \code{default}, and \code{type.checker}. } \value{ A named list of named edge weight vectors. The names on the list are the names of the nodes specified by \code{index}, or all nodes if \code{index} was not provided. The names on the weight vectors are node names to identify the edge to which the weight belongs. } \author{R. Gentleman and S. Falcon} \seealso{ \code{\link{nodes}} \code{\link{edges}} \code{\link{edgeData}} \code{\link{edgeDataDefaults}} \code{\link{is.numeric}} \code{\link{is.integer}} \code{\link{is.character}} } \examples{ V <- LETTERS[1:4] edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") edgeWeights(gR2, "C") edgeWeights(gR2) edgeWeights(gR2, attr="foo", default=5) edgeData(gR2, attr="weight") edgeData(gR2, from="C", attr="weight") } \keyword{manip} graph/man/fromGXL-methods.Rd0000644000175100017510000000636612607264574016744 0ustar00biocbuildbiocbuild\name{fromGXL-methods} \docType{methods} \title{ Methods for GXL manipulations in package graph } \alias{fromGXL-methods} \alias{toGXL-methods} \alias{GXL} \alias{dumpGXL-methods} \alias{dumpGXL} \alias{fromGXL} \alias{gxlTreeNEL} \alias{NELhandler} \alias{toGXL} \alias{validateGXL} \alias{dumpGXL,connection-method} \alias{fromGXL,connection-method} \alias{validateGXL,connection-method} \description{GXL \url{http://www.gupro.de/GXL} is "an XML sublanguage designed to be a standard exchange format for graphs". This document describes tools in the graph package for importing GXL data to R and for writing graph data out as GXL.} \value{ \item{fromGXL}{currently returns a graphNEL when possible. This function is based on \code{\link[XML]{xmlEventParse}} with handlers defined in the function NELhandler. The dump() element of this handler should emit information on all children of nodes and edges; the asGraphNEL() element will return a \code{\linkS4class{graphNEL}} object with weights if child \code{} with name attribute "weights" is present for each edge element.} \item{toGXL}{for an input of class "graphNEL", returns an object of class c("XMLInternalDOM", "XMLOutputStream"); see the example for how to convert this to a text stream encoding XML} \item{dumpGXL}{returns an R list with all the node, edge, and named attribute information specified in the GXL stream} \item{validateGXL}{returns silently (invisibly returns the parsed tree) for a DTD-compliant stream, or is otherwise very noisy} } \section{Methods}{ \describe{ \item{fromGXL}{ con = connection: returns a graphNEL based on a parsing of the GXL stream on the connection } \item{dumpGXL}{ con = connection: returns an R list based on a parsing of the GXL stream on the connection } \item{validateGXL}{ con = connection: checks the GXL stream against its DTD} \item{toGXL}{ object = graphNEL: creates an XMLInternalDOM representing the graph in GXL} } } \author{Vince Carey } \note{At present, toGXL does not return a validating GXL stream because XML package does not properly handle the dtd and namespaces arguments to xmlTree. This is being repaired. To fix the stream, add \code{ } as second record in the output. Some structures in a graphNEL and some tags in GXL may not be handled at this time. } \examples{ sf <- file(system.file("GXL/simpleExample.gxl", package="graph")) show(fromGXL(sf)) print(dumpGXL(sf)) close(sf) #validateGXL(sf) # bad <- file(system.file("GXL/c2.gxl", package="graph")) # here's how you can check if the GXL is well-formed, if # you have a libxml2-based version of R XML package # # try( validateGXL(bad) ) # gR <- graphNEL(nodes=letters[1:4], edgeL=list( a=list(edges=4), b=list(edges=3), c=list(edges=c(2,1)), d=list(edges=1)), edgemode="directed") # # following requires that you are using XML bound with recent libxml2 # #an <- as.numeric #if (an(libxmlVersion()$major)>=2 && an(libxmlVersion()$minor)>=4) ## since toGXL returns an XML object, we need to attach the XML ## package. library("XML") cat(saveXML(toGXL(gR)$value())) wtd <- file(system.file("GXL/kmstEx.gxl", package="graph")) wtdg <- fromGXL(wtd) close(wtd) print(edgeWeights(wtdg)) } \keyword{methods} \keyword{ models } graph/man/graph-class.Rd0000644000175100017510000002315212607264574016161 0ustar00biocbuildbiocbuild\name{graph-class} \docType{class} \alias{graph-class} \alias{graphBase-class} \alias{complement} \alias{complement,graph-method} \alias{connComp} \alias{connComp,graph-method} \alias{degree} \alias{degree,graph,missing-method} \alias{degree,MultiGraph,missing-method} \alias{degree,graph,ANY-method} \alias{dfs,graph-method} \alias{edgeDataDefaults<-,graph,missing,list-method} \alias{edgeDataDefaults<-,graph,character-method} \alias{edgeDataDefaults<-,graph,character,ANY-method} \alias{edgeDataDefaults,graph,missing-method} \alias{edgeDataDefaults,graph,character-method} \alias{edgeData<-,graph,character,character,character-method} \alias{edgeData<-,graph,character,missing,character-method} \alias{edgeData<-,graph,missing,character,character-method} \alias{edgeData<-,graph,character,character,character,ANY-method} \alias{edgeData<-,graph,character,missing,character,ANY-method} \alias{edgeData<-,graph,missing,character,character,ANY-method} \alias{edgeData,graph,character,character,character-method} \alias{edgeData,graph,character,character,missing-method} \alias{edgeData,graph,character,missing,character-method} \alias{edgeData,graph,missing,character,character-method} \alias{edgeData,graph,missing,missing,character-method} \alias{edgeData,graph,missing,missing,missing-method} \alias{edgemode} \alias{edgemode<-} \alias{edgemode,graph-method} \alias{edgemode<-,graph,character-method} \alias{edgeNames} \alias{edgeNames,graph-method} \alias{edgeL,graph-method} \alias{edgeWeights,graph,character-method} \alias{edgeWeights,graph,numeric-method} \alias{edgeWeights,graph,missing-method} \alias{intersection} \alias{intersection,graph,graph-method} \alias{intersection2} \alias{intersection2,graph,graph-method} \alias{isAdjacent,graph,character,character-method} \alias{isConnected} \alias{isConnected,graph-method} \alias{isDirected,graph-method} \alias{join} \alias{join,graph,graph-method} \alias{nodeDataDefaults<-,graph,missing,list-method} \alias{nodeDataDefaults<-,graph,character-method} \alias{nodeDataDefaults<-,graph,character,ANY-method} \alias{nodeDataDefaults,graph,missing-method} \alias{nodeDataDefaults,graph,character-method} \alias{nodeData<-,graph,character,character-method} \alias{nodeData<-,graph,missing,character-method} \alias{nodeData,graph,character,character-method} \alias{nodeData,graph,character,missing-method} \alias{nodeData,graph,missing,character-method} \alias{nodeData,graph,missing,missing-method} \alias{nodes,graph-method} \alias{nodes<-,graph,character-method} \alias{numEdges} \alias{numEdges,graph-method} \alias{numNodes} \alias{numNodes,graph-method} \alias{plot,graph,ANY-method} \alias{show,graph-method} \alias{union,graph,graph-method} \alias{updateGraph} \alias{updateGraph,graph-method} \title{Class "graph" } \description{A virtual class that all graph classes should extend. } \section{Objects from the Class}{ A virtual Class: No objects may be created from it. } \section{Slots}{ \describe{ \item{\code{edgeData}:}{An \code{attrData} instance for edge attributes.} \item{\code{nodeData}:}{An \code{attrData} instance for node attributes.} \item{\code{graphData}:}{A \code{list} for graph-level attributes. Only mandatory list item is \code{edgemode} which indicates whether edges are \code{"directed"} or \code{"undirected"}} \item{\code{renderInfo}:}{A \code{list} of graph rendering information.} } } \section{Methods}{ \describe{ \item{nodes}{return a character vector containing the names of the nodes of the graph} \item{nodes<-}{rename the nodes of the graph} \item{show}{\code{signature(object = "graph")}:A print method for the graph.} \item{acc}{\code{signature(object = "graph")}: find all nodes accessible from the specified node. } \item{complement}{\code{signature(x = "graph")}: compute the complement of the supplied graph. The complement is defined with respect to the complete graph on the nodes in \code{x}. Currently this returns an object of class \code{graphNEL}.} \item{connComp}{\code{signature(object = "graph")}: find the connected components of a graph.} \item{degree}{\code{signature(object = "graph", Nodes = "missing")}: find the \code{degree} of a node (number of coincident edges).} \item{degree}{\code{signature(object = "graph", Nodes = "ANY")}: as above. } \item{degree}{\code{signature(object = "MultiGraph", Nodes = "missing")}: find the \code{degree} of a node (number of coincident edges).} \item{dfs}{\code{signature(object = "graph")}: execute a depth first search on a graph starting with the specified node.} \item{edges}{\code{signature(object="graph", which="character")}: return the edges indicated by \code{which}. \code{which} can be missing in which case all edges are returned or it can be a character vector with the node labels indicating the nodes whose edge lists are wanted.} \item{edgeDataDefaults}{Get and set default attributes for the edges in the graph.} \item{edgeData}{Get and set attributes for edges in the graph} \item{edgemode}{\code{signature(object="graph")}: return the \code{edgemode} for the graph. Currently this can be either \code{directed} or \code{undirected}.} \item{edgemode<-}{\code{signature(object="graph", value="character")}: set the \code{edgemode} for the graph. Currently this can be either \code{directed} or \code{undirected}.} \item{edgeWeights}{Return a list of edge weights in a list format similar to the \code{edges} method.} \item{intersection}{\code{signature(x = "graph", y = "graph")}: compute the intersection of the two supplied graphs. They must have identical nodes. Currently this returns an object of class \code{graphNEL}. With edge weights of 1 for any matching edge.} \item{isAdjacent}{\code{signature(from="character", to="character")}: Determine if edges exists between nodes.} \item{isConnected}{\code{signature(object = "graph")}: A boolean that details if a graph is fully connected or not.} \item{isDirected}{Return \code{TRUE} if the graph object has directed edges and \code{FALSE} otherwise.} \item{join}{\code{signature(x = "graph", y = "graph")}: returns the joining of two graphs. Nodes which are shared by both graphs will have their edges merged. Note that edgeWeights for the resulting graph are all set to 1. Users wishing to preserve weights in a join operation must perform addEdge operations on the resulting graph to restore weights.} \item{nodes<-}{A generic function that allows different implementations of the \code{graph} class to reset the node labels} \item{nodeDataDefaults}{Get/set default attributes for nodes in the graph.} \item{nodeData}{Get/set attributes for nodes in the graph.} \item{numEdges}{\code{signature(object = "graph")}: compute the number of edges in a graph.} \item{numNodes}{\code{signature(object = "graph")}: compute the number of nodes in a graph. } \item{plot}{Please see the help page for the \code{plot,graph-method} method in the \code{Rgraphviz} package} \item{union}{\code{signature(x = "graph", y = "graph")}: compute the union of the two supplied graphs. They must have identical nodes. Currently this returns an object of class \code{graphNEL}.} \item{edgeNames}{\code{signature(object = "graph")}: Returns a vector of the edge names for this graph, using the format \code{tail\~head}, where \code{head} is the name of the tail node and \code{head} is the name of the head node.} \item{updateGraph}{\code{signature(object = "graph")}: Updates old instances of graph objects.} } } \details{ \code{degree} returns either a named vector (names correspond to the nodes in the graph) containing the degree for undirected graphs or a list with two components, \code{inDegree} and \code{outDegree} for directed graphs. \code{connComp} returns a list of the connected components. Each element of this list contains the labels of all nodes in that component. For a \emph{directed graph} or \emph{digraph} the \dfn{underlying graph} is the graph that results from removing all direction from the edges. This can be achieved using the function \code{\link{ugraph}}. A \dfn{weakly connected} component of a \emph{digraph} is one that is a connected component of the underlying graph. This is the default for \code{connComp}. A \emph{digraph} is \dfn{strongly connected} if every two vertices are mutually reachable. A \dfn{strongly connected} component of a \emph{digraph}, \strong{D}, is a maximal \emph{strongly connected} subdigraph of \strong{D}. See the \pkg{RBGL} package for an implementation of Trajan's algorithm to find \emph{strongly connected} components (\code{\link[RBGL]{strongComp}}). In the \pkg{graph} implementation of \code{connComp} \emph{weak connectivity} is used. If the argument to \code{connComp} is a directed graph then \code{\link{ugraph}} is called to create the underlying undirected graph and that is used to compute connected components. Users who want different behavior are encouraged to use \pkg{RBGL}. } \references{ Graph Theory and its Applications, J. Gross and J. Yellen. } \author{R. Gentleman and E. Whalen. } \seealso{\code{\link{graphNEL-class}}, \code{\link{graphAM-class}}, \code{\link{distGraph-class}}. } \examples{ set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p= 0.3) numEdges(g1) edgeNames(g1) edges(g1) edges(g1, c("a","d")) # those incident to 'a' or 'd' } \keyword{graphs} \keyword{classes} graph/man/graph2SparseM.Rd0000644000175100017510000000350512607264574016433 0ustar00biocbuildbiocbuild\name{graph2SparseM} \alias{graph2SparseM} \alias{sparseM2Graph} \title{Coercion methods between graphs and sparse matrices } \description{ These functions provide coercions between objects that inherit from the \code{graph} class to sparse matrices from the \code{SparseM} package. } \usage{ graph2SparseM(g, useweights=FALSE) sparseM2Graph(sM, nodeNames, edgemode=c("directed", "undirected")) } \arguments{ \item{g}{An instance of the \code{graph} class. } \item{useweights}{A logical value indicating whether to use the edge weights in the graph as values in the sparse matrix.} \item{sM}{A sparse matrix.} \item{nodeNames}{A \code{character} vector of the node names.} \item{edgemode}{Specifies whether the graph to be created should have directed (default) or undirected edges. If undirected, the input matrix \code{sM} must be symmetric.} } \details{ A very simple coercion from one representation to another. Currently it is presumed that the matrix is square. For other graph formats, such as bipartite graphs, some improvements will be needed; patches are welcome. } \value{ \code{graph2SparseM} takes as input an instance of a subclass of the \code{graph} class and returns a sparse matrix. \code{sparseM2Graph} takes a sparse matrix as input and returns an instance of the \code{graphNEL} class. By default, the \code{graphNEL} returned will have directed edges. } \author{R. Gentleman } \seealso{ \code{\link{graph-class}}, \code{\link{graphNEL-class}}, and for other conversions, \code{\link{aM2bpG}} and \code{\link{ftM2adjM}} } \examples{ set.seed(123) g1 <- randomGraph(letters[1:10], 1:4, p=.3) s1 <- graph2SparseM(g1, useweights=TRUE) g2 <- sparseM2Graph(s1, letters[1:10], edgemode="undirected") ## consistency check stopifnot(all.equal(g1, g2)) } \keyword{manip} graph/man/graphAM-class.Rd0000644000175100017510000001250012607264574016372 0ustar00biocbuildbiocbuild\name{graphAM-class} \docType{class} \alias{graphAM-class} \alias{graphAM} \alias{addEdge,character,character,graphAM,missing-method} \alias{addNode,character,graphAM,missing-method} \alias{clearNode,character,graphAM-method} \alias{coerce,graphAM,graphNEL-method} \alias{coerce,graphAM,matrix-method} \alias{coerce,matrix,graphAM-method} \alias{coerce,graphAM,graphBAM-method} \alias{edges,graphAM,missing-method} \alias{edges,graphAM,character-method} \alias{initialize,graphAM-method} \alias{inEdges,missing,graphAM-method} \alias{inEdges,character,graphAM-method} \alias{inEdges,graphAM,missing-method} \alias{isAdjacent,graphAM,character,character-method} \alias{nodes<-,graphAM,character-method} \alias{nodes,graphAM-method} \alias{numEdges,graphAM-method} \alias{numNodes,graphAM-method} \alias{removeEdge,character,character,graphAM-method} \alias{removeNode,character,graphAM-method} \title{Class "graphAM"} \description{ A graph class where node and edge information is represented as an adjacency matrix. The adjacency matrix is square and element \code{adjMat[i, j]} is one if there is an edge from node i to node j and zero otherwise. } \details{ The non-zero matrix values can be used to initialize an edge attribute. If this is desired, use the \code{values} argument in the call to \code{new} and provide a list with a single named element. The name determines the attributes and the value provides the default value for that attribute. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{graphAM(adjMat, edgemode, values)}. } \section{Slots}{ \describe{ \item{\code{adjMat}:}{An adjacency \code{"matrix"} describing the graph structure. The \code{\link{colnames}} of the matrix will be used as node names for the graph if present.} \item{\code{edgeData}:}{Storage for edge attributes.} \item{\code{nodeData}:}{Storage for node attributes.} } } \section{Extends}{ Class \code{"graph"}, directly. } \section{Constructor}{ \code{graphAM(adjMat=matrix(integer(), 0, 0), edgemode='undirected', values=NA)} creates a graphAM instance. \describe{ \item{adjMat}{An \code{integer} matrix specifying which nodes have edges between them.} \item{edgemode}{Either "directed" or "undirected".} \item{values}{A named list of length 1, used (rather obscurely) to specify that non-zero adjMat values initialize an edge attribute. The name of the single element in that list becomes the name of that attribute, with the specified default value. This default value is, however, never used: the specified edge attribute always has the value contained in the adjacency matrix, which is traditionally 1, but can be any positive number.} } } \section{Methods}{ \describe{ \item{addEdge}{\code{signature(from = "character", to = "character", graph = "graphAM", weights = "missing")}: ... } \item{addNode}{\code{signature(object = "graphAM", nodes = "character")}: ... } \item{clearNode}{\code{signature(node = "character", object = "graphAM")}: ... } \item{coerce}{\code{signature(from = "graphAM", to = "graphNEL")}: ... } \item{coerce}{\code{signature(from = "graphAM", to = "graphBAM")}: ... } \item{coerce}{\code{signature(from = "graphAM", to = "matrix")}: In converting to a \code{matrix}, if an edge attribute named \code{"weight"} is defined, the non-zero elements of the matrix will contain the corresponding attribute value. For more flexible matrix conversion, see \code{toMatrix}.} \item{coerce}{\code{signature(from = "matrix", to = "graphAM")}: This coerce method exists for symmetry. In most cases, creating a new \code{graphAM} instance using \code{new} gives one more control over the resulting graph.} \item{edges}{\code{signature(object = "graphAM", which = "missing")}: ... } \item{edges}{\code{signature(object = "graphAM", which = "character")}: ... } \item{initialize}{\code{signature(.Object = "graphAM")}: ... } \item{inEdges}{\code{signature(node = "character", object = "graphNEL")}: Return the incoming edges for the specified nodes. See \code{\link{inEdges}}.} \item{isAdjacent}{\code{signature(object = "graphAM", from = "character", to = "character")}: ... } \item{nodes<-}{\code{signature(object = "graphAM", value = "character")}: ... } \item{nodes}{\code{signature(object = "graphAM")}: ... } \item{numEdges}{\code{signature(graph = "graphAM")}: ... } \item{numNodes}{\code{signature(object = "graphAM")}: ... } \item{removeEdge}{\code{signature(from = "character", to = "character", graph = "graphAM")}: ... } \item{removeNode}{\code{signature(node = "character", object = "graphAM")}: ... } } } \author{Seth Falcon} \seealso{ \code{\link{graph-class}}, \code{\link{graphNEL-class}} } \examples{ mat <- rbind(c(0, 0, 1, 1), c(0, 0, 1, 1), c(1, 1, 0, 1), c(1, 1, 1, 0)) rownames(mat) <- colnames(mat) <- letters[1:4] g1 <- graphAM(adjMat=mat) stopifnot(identical(mat, as(g1, "matrix")), validObject(g1)) ## now with weights: mat[1,3] <- mat[3,1] <- 10 gw <- graphAM(adjMat=mat, values=list(weight=1)) ## consistency check: stopifnot(identical(mat, as(gw, "matrix")), validObject(gw), identical(gw, as(as(gw, "graphNEL"), "graphAM"))) } \keyword{graphs} \keyword{classes} graph/man/graphBAM-class.Rd0000644000175100017510000002654712607264574016514 0ustar00biocbuildbiocbuild\name{graphBAM-class} \Rdversion{1.1} \docType{class} \alias{graphBAM-class} \alias{addEdge,character,character,graphBAM,missing-method} \alias{addEdge,character,character,graphBAM,numeric-method} \alias{edgemode<-,graphBAM,character-method} \alias{clearNode,character,graphBAM-method} \alias{edges,graphBAM,missing-method} \alias{edges,graphBAM,character-method} \alias{inEdges,character,graphBAM-method} \alias{initialize,graphBAM-method} \alias{isAdjacent,graphBAM,character,character-method} \alias{nodes,graphBAM-method} \alias{show,graphBAM-method} \alias{numEdges,graphBAM-method} \alias{numNodes,graphBAM-method} \alias{removeEdge,character,character,graphBAM-method} \alias{removeNode,character,graphBAM-method} \alias{edgeWeights,graphBAM-method} \alias{edgeWeights,graphBAM,character-method} \alias{edgeWeights,graphBAM,numeric-method} \alias{edgeWeights,graphBAM,missing-method} \alias{edgeData,graphBAM,character,character,character-method} \alias{edgeData,graphBAM,character,missing,character-method} \alias{edgeData,graphBAM,missing,character,character-method} \alias{edgeData,graphBAM,missing,missing,missing-method} \alias{edgeData,graphBAM,missing,missing,character-method} \alias{edgeData<-,graphBAM,character,character,character-method} \alias{edgeData<-,graphBAM,missing,character,character-method} \alias{edgeData<-,graphBAM,character,missing,character-method} \alias{edgeData<-,graphBAM,missing,missing,character-method} \alias{edgeData<-,graphBAM,character,character,character,ANY-method} \alias{edgeData<-,graphBAM,missing,character,character,ANY-method} \alias{edgeData<-,graphBAM,character,missing,character,ANY-method} \alias{edgeData<-,graphBAM,missing,missing,character,ANY-method} \alias{edgeDataDefaults<-,graphBAM,character,ANY-method} \alias{edgeDataDefaults<-,graphBAM,missing,list-method} \alias{nodeDataDefaults<-,graphBAM,missing,list-method} \alias{graphBAM} \alias{coerce,graphBAM,graphAM-method} \alias{coerce,graphBAM,graphNEL-method} \alias{coerce,graphBAM,matrix-method} \alias{extractFromTo,graphBAM-method} \alias{ugraph,graphBAM-method} \alias{adj,graphBAM,character-method} \alias{graphIntersect} \alias{graphIntersect,graphBAM,graphBAM-method} \alias{graphUnion} \alias{graphUnion,graphBAM,graphBAM-method} \alias{nodes<-,graphBAM,character-method} \alias{removeEdgesByWeight} \alias{removeEdgesByWeight,graphBAM-method} \alias{nodeDataDefaults,graphBAM,character-method} \alias{nodeDataDefaults,graphBAM,missing-method} \alias{nodeDataDefaults<-,graphBAM,character,ANY-method} \alias{nodeDataDefaults<-,graphBAM,missing,ANY-method} \alias{nodeData,graphBAM,character,character-method} \alias{nodeData,graphBAM,character,missing-method} \alias{nodeData,graphBAM,missing,character-method} \alias{nodeData,graphBAM,missing,missing-method} \alias{nodeData<-,graphBAM,character,character-method} \alias{nodeData<-,graphBAM,missing,character-method} \title{EXPERIMENTAL class "graphBAM"} \description{ The graphBAM class represents a graph as an adjacency matrix. The adjacency matrix is stored as a bit array using a \code{raw} vector to reduce the memory footprint and speed operations like \code{graphIntersection}. This class is EXPERIMENTAL and its API is subject to change. } \usage{ graphBAM(df, nodes=NULL, edgemode="undirected", ignore_dup_edges = FALSE) } \arguments{ \item{df}{ A \code{data.frame} with three columns: "from", "to" and "weight". Columns "from" and "to" can be either factors or character vectors. Each row of \code{df} describes an edge in the resulting graph. The "weight" column must be numeric. } \item{nodes}{ A character vector of node labels. Use this to add degree zero nodes to the graph. If \code{NULL}, the set of nodes found in \code{from} and \code{to} will be used. } \item{edgemode}{ A string, one of "directed" or "undirected". } \item{ignore_dup_edges}{ If \code{FALSE} (default), specifying duplicate edges in the input is an error. When set to \code{TRUE} duplicate edges are ignored. Edge weight values are ignored when determining duplicates. This is most useful for graph import and conversion. } } \section{Constructors}{ The \code{GraphBAM} function is used to create new \code{graphBAM} instances. Edges are specified in a \code{data.frame}. For undirected graphs, reciprical edges should not be includes unless \code{ignoe_dup_edges} is \code{TRUE}. } \section{Extends}{ Class \code{"\linkS4class{graph}"}, directly. } \section{Methods for graphBAM objects}{ \describe{ \item{\code{addEdge(from, to, graph, weights)}}{ Return a new \code{graphBAM} object with the specified edge(s) added. The \code{from} and \code{to} arguments must either be the same length or one of them must be of length one. Each time an edge is added, the entire graph is copied. For the purpose of building a graph it will often be more efficient to build up the list of edges and call \code{GraphBAM}. } \item{\code{addNode(node, object)}}{ Return a new \code{graphBAM} object with the specified node(s) added. } \item{\code{clearNode(node, object)}}{ This operation is not currently supported. } \item{\code{edges(object, which)}}{ Returns an adjacency list representation of the graph. The list will have an entry for each node with a vector of adjacent node labels or \code{character(0)}. For undirected graphs, \code{edges} returns the reciprocal edges. The optional argument \code{which} can be a character vector of node labels. When present, only entries for the specified nodes will be returned. } \item{\code{inEdges(node, object)}}{ (Not yet supported) Similar to the \code{edges} function, but the adjacency list maps nodes that have an edge to the given node instead of from the given node. } \item{\code{isAdjacent(object, from, to)}}{ Returns a logical vector indicating whether there is an edge corresponding to the elements in \code{from} and \code{to}. These vectors must have the same length, unless one has length one. } \item{\code{nodes(object)}}{ Return the node labels for the graph } \item{\code{numEdges(object)}}{ Returns the number of edges in the graph. } \item{\code{numNodes(object)}}{ Returns the number of nodes in the graph } \item{\code{removeEdge(from, to, graph)}}{ Return a new \code{graphBAM} object with the specified edges removed. The \code{from} and \code{to} arguments must be the same length unless one of them has length one. } \item{\code{removeNode(node, object)}}{ Returns a new \code{graphBAM} object with the specified node removed. Node and edge attributes corresponding to that node are also removed. } \item{\code{edgeData(self, from, to, attr)}}{ Access edge attributes. See help for \code{edgeData}. } \item{\code{edgeDataDefaults(self, attr)}}{ Access edge data default attributes . } \item{\code{nodeDataDefaults(self, attr)}}{ Access node data default attributes . } \item{\code{edgeWeights(object, index)}}{ Return the edge weights for the graph in adjacency list format. The optional argument \code{index} specified a character vector of nodes. In this case, only the weights for the specified nodes will be returned. } \item{\code{extractFromTo(g)}}{ Returns a data frame with column names "from", "to", and "weight" corresponding to the connected nodes in the graphBAM object. } \item{\code{graphIntersect(x, y, nodeFun, edgeFun)}}{ When given two \code{graphBAM} objects, \code{graphIntersect} returns a new \code{graphBAM} containing the nodes and edges in common between the two graphs. Both x and y should either be directed or undirected. The intersection is computed by first finding the intersection of the node sets, obtaining the resulting subgraphs, and finding the intersection of the resulting edge sets. Node/Edge attributes that are equal are carried over to the result. Non equal edge/node attributes will result in the corresponding attribute being set to NA. The user has the option of providing a named list of functions correspoding to the names of the edge attributes for resolving conflicting edge attributes. For resolving any of the conflicting node attributes the user has the option of providing a named \code{list} of functions corresponding to the node attribute names. } \item{\code{graphUnion(x, y, nodeFun, edgeFun)}}{ When given two \code{graphBAM} objects, \code{graphUnion} returns a new \code{graphBAM} containing the union of nodes and edges between the two graphs. The union is compted by first finding the union of the nodesets. Both x and y should be either directed or undirected. Node/Edge attributes that are equal are carried over to the result. Non equal edge/node attributes will result in the corresponding attribute being set to NA. The user has the option of providing a named list of functions correspoding to the names of the edge attributes for resolving conflicting edge attributes. For resolving any of the conflicting node attributes the user has the option of providing a named \code{list} of functions corresponding to the node attribute names. } \item{\code{edgemode(object) <- value}}{ Set the edgemode for the graph ("directed" or "undirected"). If the specified edgemode is the same, the object is returned without changes. Otherwise, a directed graph is converted to an undirected graph via \code{ugraph} and an undirected graph is returned such that each edge is interpreted as two edges, one in each direction. } \item{\code{ugraph(graph)}}{ Return an undirected version of the current graph. Conceptually, the arrows of a graph's directed edges are removed. } \item{\code{nodes(object) <- value}}{ Replacement of a \code{graphBAM} object's node labels is currently not supported. An error is raised if this method is called. } } } \section{Coercion}{ \code{graphBAM} objects can be coerced to \code{graphAM}, \code{graphNEL}, and \code{matrix} instances via \code{as(g, CLASS)}. } \author{N. Gopalakrishnan, S. Falcon} \examples{ f <- c("a", "a", "b", "c", "d") t <- c("b", "c", "c", "d", "a") weight <- c(2.3, 2.3, 4.3, 1.0, 3.0) df <- data.frame(from=f, to=t, weight= weight) g <- graphBAM(df) nd <- nodes(g) nodeDataDefaults(g, attr ="color") <- "green" nodeData(g,n=c("b", "c"), attr ="color") <- "red" w1 <- edgeWeights(g) w2 <- edgeWeights(g,"a") w3 <- edgeWeights(g,1) d1 <- edges(g) d2 <- edges(g,c("a", "b")) e1 <- edgeData(g) e2 <- edgeData(g, "a", "c",attr="weight") em <- edgeMatrix(g) id <- isDirected(g) sg <- subGraph(c("a","c","d"), g) ft <- extractFromTo(g) am <- as(g,"graphAM") nl <- as(g,"graphNEL") mt <- as(g,"matrix") k <- graphIntersect(g,g) k <- graphUnion(g,g) e <- removeEdgesByWeight(g,lessThan= 3.0) f <- removeNode("a", g) g } \keyword{classes} graph/man/graphExamples.Rd0000644000175100017510000000064512607264574016557 0ustar00biocbuildbiocbuild\name{graphExamples} \alias{graphExamples} \docType{data} \title{A List Of Example Graphs} \description{ This data set contains a list of example \code{graphNEL} objects, which can then be used for plotting. } \usage{data(graphExamples)} \source{ Various sources, primarily from \code{\link{randomGraph}} and \code{\link{randomEGraph}} } \examples{ data(graphExamples) a <- graphExamples[[1]] a } \keyword{datasets} graph/man/graphNEL-class.Rd0000644000175100017510000001457112607264574016525 0ustar00biocbuildbiocbuild\name{graphNEL-class} \docType{class} \alias{graphNEL-class} \alias{graphNEL} \alias{coerce} \alias{edgeL} \alias{edges} \alias{edges} \alias{initialize} \alias{nodes<-} \alias{nodes} \alias{addEdge,character,character,graphNEL,numeric-method} \alias{addEdge,character,character,graphNEL,missing-method} \alias{addNode,character,graphNEL-method} \alias{adj,graphNEL,ANY-method} \alias{clearNode,character,graphNEL-method} \alias{coerce,graphNEL,generalGraph-method} \alias{coerce,graphNEL,graphAM-method} \alias{coerce,graphNEL,graphBAM-method} \alias{edgeL,graphNEL-method} \alias{edges,graphNEL,missing-method} \alias{edges,graphNEL,character-method} \alias{edgeWeights,graphNEL-method} \alias{inEdges,graphNEL,missing-method} \alias{inEdges,missing,graphNEL-method} \alias{inEdges,character,graphNEL-method} \alias{initialize,graphNEL-method} \alias{nodes<-,graphNEL,character-method} \alias{nodes,graphNEL-method} \alias{numNodes,graphNEL-method} \alias{removeEdge,character,character,graphNEL-method} \alias{removeNode,character,graphNEL-method} \alias{toGXL,graphNEL-method} \title{Class "graphNEL"} \description{ This is a class of graphs that are represented in terms of nodes and an edge list. This is a suitable representation for a graph with a large number of nodes and relatively few edges. } \section{Slots}{ \describe{ \item{\code{nodes}:}{Object of class \code{"vector"}.} \item{\code{edgeL}:}{Object of class \code{"list"}. The \code{edgeL} must be the same length as \code{nodes}. The elements of this vector correspond to the same element in \code{nodes}. The elements are themselves lists. If the node has any edges then this list will have an element named \code{edges}. This will eventually change. Since edge weights are now stored in the edge attributes construct, we do not need the extra level of list. } } } \section{Extends}{ Class \code{"graph"}, directly. } \section{Constructor}{ \code{graphNEL(nodes=character(), edgeL=list(), edgemode='undirected')} creates a graphNEL instance. \describe{ \item{nodes}{A character vector of node labels.} \item{edgeL}{A named list either in the format returned by the \code{edges} method or a list of lists where each inner list has an element named \code{edges} and optionally an element named \code{weights}. If \code{weights} is present, it must be the same length as the \code{edges} element.} \item{edgemode}{Either "directed" or "undirected".} } } \section{Methods}{ \describe{ \item{adj}{\code{signature(object = "graphNEL")}: A method for finding nodes adjacent to the suplied node.} \item{edgeL}{\code{signature(graph = "graphNEL")}: A method for obtaining the edge list.} \item{edgeWeights}{\code{signature(object = "graphNEL")}: A method for obtaining the edge weights. } \item{edges}{\code{signature(object = "graphNEL")}: A method for obtaining the edges.} \item{inEdges}{\code{signature(node = "character", object = "graphNEL")}: Return the incoming edges for the specified nodes. See \code{\link{inEdges}}.} \item{nodes}{\code{signature(object = "graphNEL")}: A method for obtaining the nodes. } \item{numNodes}{\code{signature(object = "graphNEL")}:A method for determining how many nodes are in the graph. } \item{subGraph}{\code{signature(snodes="character", graph = "graphNEL")}:A method for obtaining the induced subgraph based on the set of supplied nodes and the supplied graph.} \item{plot}{Please see the help page for \code{plot.graphNEL} in the \code{Rgraphviz} package} \item{graph2graphviz}{\code{signature(object = "graphNEL")}: A method that will convert a \code{graphNEL} object into a matrix suitable for interaction with \code{Rgraphviz}. Not intended to be called directly. This function will insure that no NA's (or other undesired values) are in the graph, or created by coersion.} \item{nodes<-}{\code{signature(object="graphNEL", value="character")}: A method for replacing the nodes in a graph object. It checks to be sure the values are the right length and unique. } \item{coerce}{\code{signature(from = "graphNEL", to = "graphAM")}: Called via \code{as}, the method converts to an adjacency matrix representation. See \code{\link{graphAM-class}}. } \item{coerce}{\code{signature(from = "graphNEL", to = "graphBAM")}: Called via \code{as}, the method converts to an bit array representation. See \code{\link{graphBAM-class}}. } } } \details{ The \code{graphNEL} class provides a very general structure for representing graphs. It will be reasonably efficient for lists with relatively more nodes than edges. Although this representation can support multi-edges, such support is not implemented and instances of \code{graphNEL} are assumed to be simple graphs with at most one edge between any pair of nodes. The \code{edgeL} is a named \code{list} of the same length as the node vector. The names are the names of the nodes. Each element of \code{edgeL} is itself a list. Each element of this (sub)list is a vector (all must be the same length) and each element represents an edge to another node. The sublist named \code{edges} holds index values into the node vector. And each such entry represents an edge from the node which has the same name as the component of \code{edgeL} to the node with index provided. Another component that is often used is named \code{weights}. It represents edge weights. The user can specify any other edge attributes (such as types etc). They are responsible for any special handling that these might require. For an \code{undirected} instance all edges are reciprocated (there is an edge from A to B and from B to A). Note that the reason for using indices to represent the \code{to} end of a node is so that we can easily support permutation of the node labels as a way to generate randomizations of the graph. } \author{R. Gentleman} \seealso{\code{\link{graphAM-class}}, \code{\link{distGraph-class}}, \code{\link{clusterGraph-class}} } \examples{ set.seed(123) V <- LETTERS[1:4] edL <- vector("list", length=4) names(edL) <- V for(i in 1:4) edL[[i]] <- list(edges=5-i, weights=runif(1)) gR <- graphNEL(nodes=V, edgeL=edL) edges(gR) edgeWeights(gR) } \keyword{classes} graph/man/inEdges.Rd0000644000175100017510000000216312607264574015332 0ustar00biocbuildbiocbuild\name{inEdges} \alias{inEdges} \title{Generic Method inEdges} \description{ Returns a list of all incoming edges for the specified nodes. } \usage{ inEdges(node, object) } \arguments{ \item{node}{character vector of node names} \item{object}{a \code{graph} object} } \details{ If no \code{node} argument is specified, \code{inEdges} returns the incoming edges for all nodes in the graph. For an undirected graph, \code{inEdges} returns all edges for the specified nodes. } \value{ A list with length matching the length of \code{node}. If \code{node} was missing, a list containing an element for each node in the graph. Each list element contains a character vector of node names giving the nodes that have outgoing edges to the node given by the name of the list element. } \author{R. Gentleman} \seealso{\code{\link{removeNode}}, \code{\link{clearNode}}} \examples{ V <- LETTERS[1:4] edL3 <- vector("list", length=4) for(i in 1:4) edL3[[i]] <- list(edges=(i\%\%4)+1, weights=i) names(edL3) <- V gR3 <- graphNEL(nodes=V, edgeL=edL3, "directed") inEdges(c("A", "B"), gR3) } \keyword{ manip} graph/man/internal.Rd0000644000175100017510000000037012607264574015566 0ustar00biocbuildbiocbuild\name{internal} \alias{nullgraphID} \title{Variables used for internal purposes} \description{ The \code{nullgraphID} variable is used to store a default identifier. This should not be used by users. } \author{Saikat DebRoy} \keyword{internal} graph/man/isAdjacent-methods.Rd0000644000175100017510000000153412607264574017463 0ustar00biocbuildbiocbuild\name{isAdjacent-methods} \docType{methods} \alias{isAdjacent-methods} \alias{isAdjacent} \title{Determine if nodes share an edge in a graph} \usage{ isAdjacent(object, from, to, ...) } \arguments{ \item{object}{An instance of a subclass of \code{\link{graph-class}}.} \item{from}{A \code{character} vector of nodes in the graph.} \item{to}{A \code{character} vector of nodes in the graph} \item{...}{May be used by methods called on subclasses of \code{graph}} } \description{ For a given subclass of \code{graph-class}, returns \code{TRUE} if the graph contains an edge from node specified by \code{from} to the node specified by \code{to}. The appropriate logical vector will be returned as long as \code{from} and \code{to} have the same length and contain nodes in the graph object specified by \code{object}. } \keyword{methods} graph/man/isDirected-methods.Rd0000644000175100017510000000071012607264574017470 0ustar00biocbuildbiocbuild\name{isDirected-methods} \docType{methods} \alias{isDirected-methods} \alias{isDirected} \title{Determine if a graph has directed or undirected edges} \usage{ isDirected(object) } \arguments{ \item{object}{A \code{graph-class} instance} } \description{ The edges of a \code{\link{graph-class}} object are either directed or undirected. This function returns \code{TRUE} if the edges are directed and \code{FALSE} otherwise. } \keyword{methods} graph/man/leaves.Rd0000644000175100017510000000174412607264574015237 0ustar00biocbuildbiocbuild\name{leaves} \alias{leaves} \alias{leaves,graph-method} \title{Find the leaves of a graph} \description{ A leaf of an undirected graph is a node with degree equal to one. A leaf of a directed graph is defined with respect to in-degree or out-degree. The leaves of a directed graph with respect to in-degree (out-degree) are those nodes with in-degree (out-degree) equal to zero. } \usage{ leaves(object, degree.dir) } \arguments{ \item{object}{A \code{graph} object} \item{degree.dir}{One of \code{"in"} or \code{"out"}. This argument is ignored when \code{object} is undirected and required otherwise. When \code{degree.dir="in"} (\code{degree.dir="out"}), nodes have no in coming (out going) edges will be returned. } } \value{ A character vector giving the node labels of the leaves. } \author{Seth Falcon} \examples{ data(graphExamples) graphExamples[[1]] leaves(graphExamples[[1]]) data(apopGraph) leaves(apopGraph, "in") leaves(apopGraph, "out") } graph/man/listEdges.Rd0000644000175100017510000000223612607264574015700 0ustar00biocbuildbiocbuild\name{listEdges} \alias{listEdges} \title{List the Edges of a Graph } \description{ A list where each element contains all edges between two nodes, regardless of orientation. The list has names which are node pairs, in lexicographic order, and elements all edges between those nodes. } \usage{ listEdges(object, dropNULL=TRUE) } \arguments{ \item{object}{An instance of the \code{\link{graphNEL-class}} class. } \item{dropNULL}{Should those node pairs with no edges be dropped from the returned list. } } \details{ The function is currently only implemented for graphs of the \code{\link{graphNEL-class}}. The edges in the returned list are instances of the \code{\link{simpleEdge-class}}. } \value{ A named list of \code{\link{simpleEdge-class}} objects. } \author{R. Gentleman} \seealso{\code{\link{simpleEdge-class}}, \code{\link{edges}}} \examples{ set.seed(123) V <- LETTERS[1:4] edL <- vector("list", length=4) names(edL) <- V toE <- LETTERS[4:1] for(i in 1:4) edL[[i]] <- list(edges=5-i, weights=runif(1)) gR <- graphNEL(nodes=V, edgeL=edL) listEdges(gR) } \keyword{manip} graph/man/matrix2Graph.Rd0000644000175100017510000000772012607264574016330 0ustar00biocbuildbiocbuild\name{Coercions between matrix and graph representations} \alias{aM2bpG} \alias{ftM2adjM} \alias{ftM2graphNEL} \alias{coerce,matrix,graphNEL-method} \alias{coerce,graphNEL,matrix-method} \title{Coercions between matrix and graph representations} \description{ A collection of functions and methods to convert various forms of matrices into graph objects. } \usage{ aM2bpG(aM) ftM2adjM(ft, W=NULL, V=NULL, edgemode="directed") ftM2graphNEL(ft, W=NULL, V=NULL, edgemode="directed") \S4method{coerce}{graphNEL,matrix}(from,to="matrix",strict=TRUE) \S4method{coerce}{matrix,graphNEL}(from,to="graphNEL",strict=TRUE) } \arguments{ \item{ft}{An nx2 matrix containing the \code{from/to} representation of graph edges.} \item{W}{An optional vector of edge weights.} \item{V}{An optional vector of node names.} \item{aM}{An affiliation matrix for a bipartite graph.} \item{edgemode}{Character. Specifies if the resulting graph is to be directed or undirected.} \item{from}{Object to coerce from, either of type \code{matrix} or \code{grpahNEL}} \item{to}{Character giving class to coerce to. Either "matrix" or "graphNEL".} \item{strict}{Strict object checking.} } \details{ In the functions \code{ftM2adjM} and \code{ftM2graphNEL}, a \code{from/to} matrix \code{ft} is converted into an \code{adjacency} matrix or a \code{graphNEL} object respectively. In \code{ft}, the first column represents the \code{from} nodes and the second column the \code{to} nodes. To have unconnected nodes, use the \code{V} argument (see below). The \code{edgemode} parameter can be used to specify if the desired output is a directed or undirected graph. The same edge must not occur twice in the \code{from/to} matrix. If \code{edgemode} is \code{undirected}, the edge \code{(u,v)} and \code{(v,u)} must only be specified once. \code{W} is an optional vector of edge weights. The order of the edge weights in the vector should correspond to the order of the edges recorded in \code{ft}. If it is not specified, edge weights of 1 are assigned by default. \code{V} is an optional vector of node names. All elements of \code{ft} must be contained in \code{V}, but not all names in \code{V} need to be contained in \code{ft}. If \code{V} is not specified, it is set to all nodes represented in \code{ft}. Specifying \code{V} is most useful for creating a graph that includes nodes with degree 0. \code{aM} is an affiliation matrix as frequently used in social networks analysis. The rows of \code{aM} represent actors, and the columns represent events. An entry of "1" in the ith row and jth column represents affiliation of the ith actor with the jth event. Weighted entries may also be used. \code{aM2bpG} returns a \code{graphNEL} object with nodes consisting of the set of actors and events, and directed (possibly weighted) edges from the actors to their corresponding events. If plotted using \code{Rgraphviz} and the \code{dot} layout, the bipartite structure of the graph returned by \code{aM2bpG} should be evident. An \code{adjacency} matrix can be coerced into a \code{graphNEL} using the \code{as} method. If the matrix is a symmetric matrix, then the resulting graph will be \code{undirected}, otherwise it will be \code{directed}. } \value{ For \code{ftM2graphNEL} and \code{aM2bpG}, an object of class \code{graphNEL}. For \code{ftM2adjM}, a matrix (the adjacency matrix representation). } \author{Denise Scholtens, Wolfgang Huber} \examples{ ## From-To matrix From <- c("A","A","C","C") To <- c("B","C","B","D") L <- cbind(From,To) W <- 1:4 M1 <- ftM2adjM(L, W, edgemode="directed") M2 <- ftM2adjM(L, W, edgemode="undirected") stopifnot(all(M1+t(M1)==M2)) G1 <- ftM2graphNEL(L, W, edgemode="directed") G2 <- ftM2graphNEL(L, W, edgemode="undirected") ## Adjacency matrix From <- matrix(runif(100), nrow=10, ncol=10) From <- (From+t(From)) > pi/4 rownames(From) <- colnames(From) <- LETTERS[1:10] To <- as(From,"graphNEL") Back <- as(To,"matrix") stopifnot(all(From == Back)) } \keyword{graphs } graph/man/mostEdges.Rd0000644000175100017510000000145012607264574015704 0ustar00biocbuildbiocbuild\name{mostEdges} \alias{mostEdges} \title{ Find the node in a graph with the greatest number of edges } \description{ \code{mostEdges} finds the node that has the most edges in the graph. This is the node with the highest degree. } \usage{ mostEdges(objGraph) } \arguments{ \item{objGraph}{ the graph object } } \value{ \item{index}{the index of the node with the most edges} \item{id}{the node value with the most edges; may be affy id, locus link id, or genename depending on the node type} \item{maxLen}{the number of edges for that node} } \author{ Elizabeth Whalen } \seealso{ \code{\link{numEdges}}, \code{\link{aveNumEdges}}, \code{\link{numNoEdges}} } \examples{ set.seed(123) g1 <- randomGraph(11:30, letters[20:26], p=.4) mostEdges(g1) } \keyword{ manip } graph/man/multigraph.Rd0000644000175100017510000000373512607264574016136 0ustar00biocbuildbiocbuild\name{multiGraph-class} \docType{class} \alias{multiGraph-class} \alias{edgeSet-class} \alias{edgeSetNEL-class} \alias{edgeSetAM-class} \alias{show,multiGraph-method} \alias{show,edgeSet-method} \alias{isDirected,multiGraph-method} \alias{isDirected,edgeSet-method} \alias{edgemode,edgeSet-method} \alias{nodes,multiGraph-method} \alias{nodes,edgeSetAM-method} \alias{numNodes,multiGraph-method} \alias{edges,multiGraph,missing-method} \alias{edges,multiGraph,character-method} \alias{edges,edgeSetAM,character-method} \alias{edges,edgeSetNEL,character-method} \alias{numEdges,edgeSetAM-method} \alias{numEdges,multiGraph-method} \title{Class "multiGraph" } \description{A collection of classes to model multigraphs. These include the multiGraph class as well as classes to contain edge sets. } \section{Objects from the Class}{ Objects can be created from the \code{multiGraph} class, the \code{edgeSet} class is virtual, and particular variants should be used. } \section{Slots}{ These slots are for the multiGraph class. \describe{ \item{nodes}{The names of the nodes.} \item{edgeL}{A list of edge lists.} \item{nodeData}{An instance of the \code{attrData} class.} \item{graphData}{A list.} } These slots are for the \code{edgeSet} class, or one of its sublcasses. \describe{ \item{edgeData}{An instance of the \code{attrData} class.} \item{edgemode}{A character vector, one of directed, or undirected.} \item{edgeL}{A list of the edges (graphNEL)} \item{adjMat}{An adjacency matrix (graphAM)} } } \section{Methods}{ \describe{ \item{show}{Print a multigraph.} \item{isDirected}{A vector indicating which of the edgeSets is directed.} \item{nodes}{Retrieve the node names} \item{numNodes}{Return the number of nodes} \item{edges}{Return either all edges, or a subset of them, depending on the arguments supplied.} \item{numEdges}{Return a vector with the number of edges, for each edge set.} } } \keyword{classes} graph/man/nodeData-methods.Rd0000644000175100017510000000155612607264574017141 0ustar00biocbuildbiocbuild\name{nodeData-methods} \docType{methods} \alias{nodeData-methods} \alias{nodeData<--methods} \alias{nodeData} \alias{nodeData<-} \title{Get and set attributes for the nodes of a graph object} \description{ Attributes of the nodes of a graph can be accessed using \code{nodeData}. The attributes must be defined using \code{\link{nodeDataDefaults}}. You can ommit the \code{n} argument to retrieve attributes for all nodes in the graph. You can ommit the \code{attr} argument to retrieve all attributes. } \usage{ nodeData(self, n, attr) nodeData(self, n, attr) <- value } \arguments{ \item{self}{A \code{graph-class} instance} \item{n}{A \code{character} vector of node names} \item{attr}{A \code{character} vector of length one specifying the name of a node attribute} \item{value}{An R object to store as the attribute value} } \keyword{methods} graph/man/nodeDataDefaults-methods.Rd0000644000175100017510000000155112607264574020624 0ustar00biocbuildbiocbuild\name{nodeDataDefaults-methods} \docType{methods} \alias{nodeDataDefaults-methods} \alias{nodeDataDefaults<--methods} \alias{nodeDataDefaults} \alias{nodeDataDefaults<-} \title{Get and set default attributes for the nodes of a graph} \usage{ nodeDataDefaults(self, attr) nodeDataDefaults(self, attr) <- value } \arguments{ \item{self}{A \code{graph-class} instance} \item{attr}{A \code{character} vector of length one giving the name of an attribute} \item{value}{An R object to set as the default value for the given attribute} } \description{ You can associate arbitrary attributes with the nodes of a graph. Use \code{nodeDataDefaults} to specify the set of attributes that describe nodes. Each attribute must have a default value. You can set the attribute for a particular node or set of nodes using \code{\link{nodeData}}. } \keyword{methods} graph/man/numNoEdges.Rd0000644000175100017510000000114412607264574016016 0ustar00biocbuildbiocbuild\name{numNoEdges} \alias{numNoEdges} \title{ Calculate the number of nodes that have an edge list of NULL } \description{ \code{numNoEdges} calculates the number of nodes that have an edge list of NULL (i.e. no edges). } \usage{ numNoEdges(objGraph) } \arguments{ \item{objGraph}{ the graph object } } \value{ An integer representing the number of NULL edge lists in the graph. } \author{ Elizabeth Whalen } \seealso{ \code{\link{numEdges}}, \code{\link{aveNumEdges}}, \code{\link{mostEdges}} } \examples{ set.seed(999) g1 <- randomEGraph(letters, .01) numNoEdges(g1) } \keyword{ manip } graph/man/pancrCaIni.Rd0000644000175100017510000000153112607264574015761 0ustar00biocbuildbiocbuild\name{pancrCaIni} \alias{pancrCaIni} \non_function{} \title{ A graph encoding parts of the pancreatic cancer initiation pathway } \description{ A graph encoding parts of the pancreatic cancer initiation pathway } \usage{data(pancrCaIni)} \format{ The format is: Formal class 'graphNEL' [package "graph"] with edgemode "directed". } \source{ The KEGG pancreatic cancer pathway was visually inspected on 17 Sept 2007 and a subgraph was isolated. The HUGO names for each symbol in the KEGG visualization were obtained and checked for existance on hgu95av2. Some abbreviated terms for processes are also included as nodes. } %\references{ % %} \examples{ data(pancrCaIni) if (require(Rgraphviz)) { nat = rep(FALSE, length(nodes(pancrCaIni))) names(nat) = nodes(pancrCaIni) plot(pancrCaIni, nodeAttrs=list(fixedsize=nat)) } } \keyword{models} graph/man/randomEGraph.Rd0000644000175100017510000000253112607264574016322 0ustar00biocbuildbiocbuild\name{randomEGraph} \alias{randomEGraph} \title{ Random Edge Graph } \description{ A function to create random graphs according to a random edge model. The user supplies the set of nodes for the graph as \code{V} and either a probability, \code{p}, that is used for each edge or the number of edges, \code{edges} they want to have in the resulting graph. } \usage{ randomEGraph(V, p, edges) } \arguments{ \item{V}{The nodes for the graph. } \item{p}{ The probability of an edge being selected. } \item{edges}{ The number of edges wanted. } } \details{ The user must specify the set of nodes and either a probability for edge selection or the number of edges wanted, but not both. Let \code{nV} denote the number of nodes. There are \code{choose(nV, 2)} edges in the complete graph. If \code{p} is specified then a biased coin (probability of heads being \code{p}) is tossed for each edge and if it is heads that edge is selected. If \code{edges} is specified then that many edges are sampled without replacement from the set of possible edges. } \value{ An object of class \code{\link{graphNEL-class}} that contains the nodes and edges. } \author{R. Gentleman } \seealso{\code{\link{randomGraph}}} \examples{ set.seed(123) V <- letters[14:22] g1 <- randomEGraph(V, .2) g2 <- randomEGraph(V, edges=30) } \keyword{ manip } graph/man/randomGraph.Rd0000644000175100017510000000355212607264574016221 0ustar00biocbuildbiocbuild\name{randomGraph} \alias{randomGraph} \title{ Random Graph } \description{ This function generates a random graph according to a model that involves a latent variable. The construction is to randomly assign members of the set \code{M} to the nodes, \code{V}. An edge is assigned between two elements of \code{V} when they both have the same element of \code{M} assigned to them. An object of class \code{graphNEL} is returned. } \usage{ randomGraph(V, M, p, weights=TRUE) } \arguments{ \item{V}{The nodes of the graph. } \item{M}{A set of values used to generate the graph. } \item{p}{A value between 0 and 1 that indicates the probability of selecting an element of \code{M}} \item{weights}{A logical indicating whether to use the number of shared elements of \code{M} as weights. } } \details{ The model is quite simple. To generate a graph, \code{G}, the user supplies the list of nodes, \code{V} and a set of values \code{M} which will be used to create the graph. For each node in \code{V} a logical vector with length equal to the length of \code{M} is generated. The probability of a \code{TRUE} at any position is determined by \code{p}. Once valus from \code{M} have been assigned to each node in \code{V} the result is processed into a graph. This is done by creating an edge between any two elements of \code{V} that share an element of \code{M} (as chosen by the selection process). The sizes of \code{V} and \code{M} and the values of \code{p} determine how dense the graph will be. } \value{ An object of class \code{\link{graphNEL-class}} is returned. } \author{R. Gentleman } \seealso{\code{\link{randomEGraph}}, \code{\link{randomNodeGraph}} } \examples{ set.seed(123) V <- letters[1:10] M <- 1:4 g1 <- randomGraph(V, M, 0.2) numEdges(g1) # 16, in this case edgeNames(g1)# " ~ " since undirected } \keyword{graphs} graph/man/randomNodeGraph.Rd0000644000175100017510000000216512607264574017026 0ustar00biocbuildbiocbuild\name{randomNodeGraph} \alias{randomNodeGraph} \title{Generate Random Graph with Specified Degree Distribution} \description{ \code{randomNodeGraph} generates a random graph with the specified degree distribution. Self-loops are allowed. The resultant graph is directed (but can always be coerced to be undirected). } \usage{ randomNodeGraph(nodeDegree) } \arguments{ \item{nodeDegree}{A named integer vector specifying the node degrees. } } \details{ The input vector must be named, the names are taken to be the names of the nodes. The sum must be even (there is a theorem that says we require that to construct a graph). Self-loops are allowed, although patches to the code that make this a switchable parameter would be welcome. } \value{ An instance of the \code{graphNEL} class. The graph is directed. } \references{Random Graphs as Models of Networks, M. E. J. Newman. } \author{R. Gentleman} \seealso{\code{\link{randomGraph}}, \code{\link{randomEGraph}} } \examples{ set.seed(123) c1 <- c(a = 1, b = 1, c = 2, d = 4) (g1 <- randomNodeGraph(c1)) stopifnot(validObject(g1)) } \keyword{graphs} \keyword{manip} graph/man/removeEdge.Rd0000644000175100017510000000222712607264574016037 0ustar00biocbuildbiocbuild\name{removeEdge} \alias{removeEdge} \title{ removeEdge } \description{ A function to remove the specified edges from a graph. } \usage{ removeEdge(from, to, graph) } \arguments{ \item{from}{from edge labels } \item{to}{ to edge labels} \item{graph}{a \code{graph} object } } \details{ A new graph instance is returned with the edges specified by corresponding elements of the \code{from} and \code{to} vectors removed. If \code{from} and \code{to} are not the same length, one of them should have length one. All edges to be removed must exist in \code{graph}. } \value{ A new instance of a graph with the same class as \code{graph} is returned with the specified edges removed. } \author{R. Gentleman} \seealso{\code{\link{addNode}},\code{\link{addEdge}},\code{\link{removeNode}}} \examples{ V <- LETTERS[1:4] edL1 <- vector("list", length=4) names(edL1) <- V for(i in 1:4) edL1[[i]] <- list(edges=c(2,1,4,3)[i], weights=sqrt(i)) gR <- graphNEL(nodes=V, edgeL=edL1) gX <- removeEdge("A", "B", gR) set.seed(123) g <- randomEGraph(V=letters[1:5],edges=5) g2 <- removeEdge(from=c("a","b"), to=c("d","c"), g) } \keyword{manip} graph/man/removeNode.Rd0000644000175100017510000000220612607264574016055 0ustar00biocbuildbiocbuild\name{removeNode} \alias{removeNode} \title{ removeNode } \description{ A function to remove a node from a graph. All edges to and from the node are also removed. } \usage{ removeNode(node, object) } \arguments{ \item{node}{The label of the node to be removed. } \item{object}{The graph to remove the node from. } } \details{ The specified node is removed from the graph as are all edges to and from that node. A new instance of the same class as \code{object} with the specified node(s) is returned. Note, node can be a vector of labels, in which case all nodes are removed. This is similar to \code{\link{subGraph}}. } \value{ A new instance of a graph of the same class as \code{object} but with all specified nodes removed. } \author{R. Gentleman} \seealso{\code{\link{removeEdge}}, \code{\link{addEdge}}, \code{\link{addNode}},\code{\link{subGraph}} } \examples{ V <- LETTERS[1:4] edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") gX <- removeNode("C", gR2) } \keyword{manip} graph/man/renderInfo-class.Rd0000644000175100017510000001270512607264574017155 0ustar00biocbuildbiocbuild\name{renderInfo-class} \docType{class} \alias{renderInfo-class} \alias{edgeRenderInfo} \alias{edgeRenderInfo<-} \alias{nodeRenderInfo} \alias{nodeRenderInfo<-} \alias{parRenderInfo} \alias{parRenderInfo<-} \alias{graphRenderInfo} \alias{graphRenderInfo<-} \title{Class "renderInfo"} \description{A container class to manage graph rendering attributes. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("renderInfo")} or by using the initializer \code{.renderInfoPrototype}. } \section{Slots}{ \describe{ \item{\code{pars}:}{List of default rendering attributes with two items \code{nodes} and \code{edges}. When not set further down the parameter hierarchy, these defaults will be used for all nodes/edges in the graph. } \item{\code{nodes}:}{Named list of attributes specific to nodes. } \item{\code{edges}:}{Named list of attributes specific to edges. } \item{\code{graph}:}{Named list of graph-wide attributes. } } Each item of \code{nodes} and \code{edges} can take arbitrary vectors, the only restriction is that they have to be of either length 1 or length equal to the number of nodes or edges, respectively. \code{pars} and \code{graph} can take arbitrary skalars, the latter for both edges and nodes. } \section{Methods}{ The following are functions rather than methods and build the API to control the graphical output of a graph when it is plotted using \code{\link[Rgraphviz]{renderGraph}}. \describe{ \item{parRenderInfo, parRenderInfo<-}{getter and setter for items of slot \code{pars}} \item{nodeRenderInfo, nodeRenderInfo<-}{getter and setter for items of slot \code{nodes}} \item{edgeRenderInfo, edgeRenderInfo<-}{getter and setter for items of slot \code{edges}} \item{graphRenderInfo, graphRenderInfo<-}{getter and setter for items of slot \code{graph}} } The getters all take two arguments: \code{g} is a graph object and \code{name} is a character giving the name of one of the item in the respective slot. When \code{name} is missing this will give you the whole list. The setters are a bit more complex: \code{nodeRenderInfo<-} and \code{edgeRenderInfo<-} can take \describe{ \item{named list of named vectors}{where the names have to match the node or edge names. Items in the vector that don't match a valid edge or node name will be silently ignored. For undirected edges the order of head nodes and tail nodes in edge names is ignored, i.e. \code{a~b} is equivalent to code{b~a}} \item{named list of skalars}{which will set all the attribute for all edges or nodes in the graph} \code{parRenderInfo<-}{will only take a list with items \code{nodes}, \code{edges} and \code{graph}. The content of these list items can be arbitrary named vectors.} \code{parRenderInfo<-}{takes an arbitrary list} } Available rendering parameters for nodes are: \describe{ \item{col:}{ the color of the line drawn as node border. Defaults to \code{black}.} \item{lty:}{ the type of the line drawn as node border. Defaults to \code{solid}. Valid values are the same as for the R's base graphic parameter \code{lty}.} \item{lwd:}{ the width of the line drawn as node border. Defaults to \code{1}. Note that the underlying low level plotting functions do not support vectorized \code{lwd} values. Instead, only the first item of the vector will be used. } \item{fill:}{ the color used to fill a node. Defaults to \code{transparent}.} \item{textCol:}{ the font color used for the node labels. Defaults to \code{black}.} \item{fontsize: }{the font size for the node labels in points. Defaults to \code{14}. Note that the fontsize will be automatically adjusted to make sure that all labels fit their respective nodes. You may want to increase the node size by supplying the appropriate layout parameters to \code{Graphviz} in order to allow for larger fontsizes.} \item{cex:}{ Expansion factor to further control the fontsize. As default, this parameter is not set, in which case the fontsize will be clipped to the node size. This mainly exists to for consistency with the base graphic parameters and to override the clipping of fontsize to nodesize.} } Available rendering parameters for edges are: \describe{ \item{col:}{ the color of the edge line. Defaults to \code{black}.} \item{lty:}{ the type of the edge line. Defaults to \code{solid}. Valid values are the same as for the R's base graphic parameter \code{lty}.} \item{lwd:}{ the width of the edge line. Defaults to \code{1}.} \item{textCol:}{ the font color used for the edge labels. Defaults to \code{black}.} \item{fontsize:}{ the font size for the edge labels in points. Defaults to \code{14}.} \item{cex:}{ Expansion factor to further control the fontsize. This mainly exists to be consistent with the base graphic parameters.} } } \author{Deepayan Sarkar, Florian Hahne} \examples{ g <- randomGraph(letters[1:4], 1:3, p=0.8) nodeRenderInfo(g) <- list(fill=c("a"="red", "b"="green")) edgeRenderInfo(g) <- list(lwd=3) edgeRenderInfo(g) <- list(lty=3, col="red") parRenderInfo(g) <- list(edges=list(lwd=2, lty="dashed"), nodes=list(col="gray", fill="gray")) nodeRenderInfo(g) edgeRenderInfo(g, "lwd") edgeRenderInfo(g, c("lwd", "col")) parRenderInfo(g) } \keyword{classes} graph/man/reverseEdgeDirections.Rd0000644000175100017510000000164412607264574020243 0ustar00biocbuildbiocbuild\name{reverseEdgeDirections} \alias{reverseEdgeDirections} \title{Reverse the edges of a directed graph} \description{ Return a new directed graph instance with each edge oriented in the opposite direction relative to the corresponding edge in the input graph. } \usage{ reverseEdgeDirections(g) } \arguments{ \item{g}{A \code{graph} subclass that can be coerced to \code{graphAM}} } \details{ WARNING: this doesn't handle edge attributes properly. It is a preliminary implementation and subject to change. } \value{ A \code{graphNEL} instance } \author{S. Falcon} \examples{ g <- graphNEL(nodes=c("a", "b", "c"), edgeL=list(a=c("b", "c"), b=character(0), c=character(0)), edgemode="directed") stopifnot(isAdjacent(g, "a", "b")) stopifnot(!isAdjacent(g, "b", "a")) grev <- reverseEdgeDirections(g) stopifnot(!isAdjacent(grev, "a", "b")) stopifnot(isAdjacent(grev, "b", "a")) } \keyword{manip} graph/man/settings.Rd0000644000175100017510000000221112607264574015606 0ustar00biocbuildbiocbuild\name{graph.par} \alias{graph.par} \alias{graph.par.get} \title{Graphical parameters and other settings } \description{ Functions providing an interface to persistent graphical parameters and other settings used in the package. } \usage{ graph.par(...) graph.par.get(name) } \arguments{ \item{\dots}{ either character strings naming parameters whose values are to be retrieved, or named arguments giving values that are to be set. } \item{name}{ character string, giving a valid parameter name. } } \details{ \code{graph.par} works sort of like \code{\link{par}}, but the details are yet to be decided. \code{graph.par.get(name)} is equivalent to \code{graph.par(name)[[1]]} } \value{ In query mode, when no parameters are being set, \code{graph.par} returns a list containing the current values of the requested parameters. When called with no arguments, it returns a list with all parameters. When a parameter is set, the return value is a list containing previous values of these parameters. } \seealso{ \code{\link{par}} } \author{ Deepayan Sarkar, \email{deepayan.sarkar@r-project.org} } \keyword{utilities} graph/man/simpleEdge-class.Rd0000644000175100017510000000216712607264574017141 0ustar00biocbuildbiocbuild\name{simpleEdge-class} \docType{class} \alias{simpleEdge-class} \title{Class "simpleEdge".} \description{A simple class for representing edges in graphs.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("simpleEdge", ...)}. } \section{Slots}{ \describe{ \item{\code{edgeType}:}{Object of class \code{"character"}; the type of the edge.} \item{\code{weight}:}{Object of class \code{"numeric"}; the edge weight.} \item{\code{directed}:}{Object of class \code{"logical"}; is the edge directed. } \item{\code{bNode}:}{Object of class \code{"character"}; the beginning node. } \item{\code{eNode}:}{Object of class \code{"character"}; the ending node. } } } \section{Methods}{ No methods defined with class "simpleEdge" in the signature. } \author{R. Gentleman} \note{All slots are length one vectors (this is not currently checked for). If the edge is not directed there is no real meaning to the concepts of beginning node or ending node and these should not be interpreted as such. } \examples{ new("simpleEdge", bNode="A", eNode="D") } \keyword{classes} graph/man/standardLabeling.Rd0000644000175100017510000000251012607264574017206 0ustar00biocbuildbiocbuild\name{Standard labeling of edges with integers} \alias{ftM2int} \alias{int2ftM} \title{Standard labeling of edges with integers} \description{ Functions to convert between from-to representation and standard labeling of the edges for undirected graphs with no self-loops. } \usage{ ftM2int(ft) int2ftM(i) } \arguments{ \item{i}{Numeric vector.} \item{ft}{Numeric nx2 or 2xn matrix.} } \details{A standard 1-based node labeling of a graph G=(V,E) is a one-to-one mapping between the integers from 1 to |V| and the nodes in V. A standard 1-based edge labeling of an undirected graph G=(V,E) with no self-loops is \emph{the} one-to-one mapping between the integers from 1 to |V| choose 2 = |V|*(|V|-1)/2 such that the edge labeled 1 is between nodes 2 and 1, the edge labeled 2 is between nodes 3 and 1, the edge labeled 3 is between nodes 3 and 2, and so on. } \value{ For \code{ftM2int}, a numeric vector of length n. For \code{int2ftM}, a \code{length(i) x 2} matrix. } \author{Wolfgang Huber} \examples{ nNodes <- 200 nEdges <- choose(nNodes, 2) i <- 1:nEdges ft <- int2ftM(i) ft[1:6,] stopifnot(all(ft[,1]>ft[,2])) ## always from higher to lower stopifnot(!any(duplicated(paste(ft[,1], ft[,2])))) stopifnot(ft[nEdges, 1]==nNodes, ft[nEdges, 2]==nNodes-1) j <- ftM2int(ft) stopifnot(all(i==j)) } \keyword{graphs} graph/man/subGraph.Rd0000644000175100017510000000224712607264574015532 0ustar00biocbuildbiocbuild\name{subGraph} \alias{subGraph} \alias{subGraph,character,graphNEL-method} \alias{subGraph,character,clusterGraph-method} \alias{subGraph,character,distGraph-method} \alias{subGraph,character,MultiGraph-method} \alias{subGraph,character,graphBAM-method} \title{Create a Subgraph } \description{ Given a set of nodes and a graph this function creates and returns subgraph with only the supplied nodes and any edges between them. } \usage{ subGraph(snodes, graph) } \arguments{ \item{snodes}{A \code{character} vector of node labels. } \item{graph}{A graph object, it must inherit from the \code{graph} class. } } \details{ The returned subgraph is a copy of the graph. Implementations for Implementations for \code{graphNEL}, \code{distGraph} and \code{clusterGraph}. } \value{ A graph of the same class as the \code{graph} argument but with only the supplied nodes. } \author{R. Gentleman } \seealso{ \code{\link{nodes}},\code{\link{edges}} } \examples{ set.seed(123) x <- rnorm(26) names(x) <- letters library(stats) d1 <- dist(x) g1 <- new("distGraph", Dist=d1) subGraph(letters[1:5], g1) } \keyword{manip} graph/man/toDotR-methods.Rd0000644000175100017510000000620212607264574016626 0ustar00biocbuildbiocbuild\name{toDotR-methods} \docType{methods} \alias{toDotR} \alias{toDotR,graphNEL,character,list,list-method} \alias{toDotR,graphNEL,character,missing,missing-method} \alias{toDotR,graphNEL,character,missing,list-method} \alias{toDotR,graphNEL,missing,missing,missing-method} \alias{toDotR,graphNEL,missing,missing,list-method} \alias{toDotR,graphNEL,missing,character,missing-method} \alias{toDotR,graphNEL,missing,list,list-method} \alias{toDotR,graphNEL,missing,list,missing-method} %\S4method{toDotR,graphNEL,character,list,list-method} %\S4method{toDotR,graphNEL,character,missing,missing-method} %\S4method{toDotR,graphNEL,character,missing,list-method} %\S4method{toDotR,graphNEL,missing,missing,missing-method} %\S4method{toDotR,graphNEL,missing,missing,list-method} %\S4method{toDotR,graphNEL,missing,character,missing-method} %\S4method{toDotR,graphNEL,missing,list,list-method} %\S4method{toDotR,graphNEL,missing,list,missing-method} \title{ Methods for Function toDotR, using R to generate a dot serialization} \description{There are two basic methods of generating dot (\url{http://www.graphviz.org}) language serializations of R \code{\link{graph-class}} structures. First, using the \code{\link[Rgraphviz:toDot-methods]{toDot}} methods of the Rgraphviz package, the native graphviz agraph-associated methods can be employed to create the dot serialization. Second, with the methods described here, R functions can be used to perform the serialization directly from the graph data structure, without Rgraphviz.} \section{Methods}{\describe{ \item{G = "graphNEL", outDotFile = "character", renderList = "list", optList = "list"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "character", renderList = "missing", optList = "missing"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "character", renderList = "missing", optList = "list"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "missing", renderList = "missing", optList = "missing"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "missing", renderList = "missing", optList = "list"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "missing", renderList = "character", optList = "missing"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "missing", renderList = "list", optList = "list"}{ create dot language descriptionof graph } \item{G = "graphNEL", outDotFile = "missing", renderList = "list", optList = "missing"}{ create dot language descriptionof graph } \item{G = "compoundGraph", outDotFile = "character", renderList = "list", optList = "missing"}{ create dot language descriptionof graph } \item{G = "compoundGraph", outDotFile = "character", renderList = "list", optList = "list"}{ create dot language descriptionof graph } \item{G = "compoundGraph", outDotFile = "missing", renderList = "list", optList = "missing"}{ create dot language descriptionof graph } }} \seealso{\code{\link[Rgraphviz]{toDot-methods}}} \examples{ example(randomGraph) tmp <- tempfile() toDotR( g1, tmp ) readLines(tmp) unlink(tmp) } \keyword{methods} graph/man/toDotWithRI.Rd0000644000175100017510000000456312607264574016142 0ustar00biocbuildbiocbuild\name{toDotWithRI} \alias{toDotWithRI} \title{Translate a graph to "dot" including rendering information} \usage{ toDotWithRI(graph, graph_name = NULL, subGraphList = list(), isStrict = TRUE) } \arguments{ \item{graph}{An object of graph \code{graph}} \item{graph_name}{The name of the graph} \item{subGraphList}{A list of objects of class \code{graph}. Each of these is used as a subgraph in the graph. The names in the list are taken as the names of the subgraph. If a graph is to be seen as a cluster (i.e. with a box around it), its name has to start with \code{cluster}.} \item{isStrict}{Should the graph be strict} } \value{ A character vector with the graph in dot format } \description{ The function takes a graph object and translates it into the dot format. All rendering information is written verbatim into the dot graph as well } \details{ Given a graph object, it is translated into the \code{dot} language so that it can be rendered using the \code{graphviz} software. In addition to plotting the graph itself, all the rendering information is being used as well. \code{graphRenderInfo} attributes are written as an attribute list after the \code{graph} statement in dot. \code{nodeRendenInfo} attributes are written as attribute lists after each node. If an attribute is constant across all node, a global node attribute is written instead of many individual ones.##' Newlines ##' in attributes do not lead to newlines in labels. In \code{label}, \code{headlabel} and \code{taillabel}, in order to get a newline, right justification or left justification, the two character sequences \code{\\n}, \code{\\r} and \code{\\l} have to be written (i.e. in order to create this in R, the backslash has to be escaped in a string, that is has to be written as a double-backslash). \code{edgeRenderInfo} attributes as written as attribute lists after each edge, unless an attribute is constant, then it is written as a global edge attribute. In general, all attribute values are being wrapped in double-quotes, unless the attibute value start with a \code{<} and ends with a \code{>}. In this case it is taken as html content and not wrapped in double quotes (nor are contained newlines escaped). The resulting graph in dot format is returned as a character vector. } \author{ Holger Hoefling \email{hhoeflin@gmail.com} }graph/man/ugraph.Rd0000644000175100017510000000233612607264574015244 0ustar00biocbuildbiocbuild\name{ugraph} \alias{ugraph} \alias{ugraph,graph-method} \title{Underlying Graph} \description{ For a \emph{directed} graph the underlying graph is the graph that is constructed where all edge orientation is ignored. This function carries out such a transformation on \code{graphNEL} instances. } \usage{ ugraph(graph) } \arguments{ \item{graph}{a \code{graph} object. } } \details{ If \code{graph} is already \emph{undirected} then it is simply returned. If \code{graph} is a multi-graph (has multiple edges) an error is thrown as it is unclear how to compute the underlying graph in that context. The method will work for any \code{graph} subclass for which an \code{edgeMatrix} method exists. } \value{ An instance of \code{graphNEL} with the same nodes as the input but which is \code{undirected}. } \references{Graph Theory and its Applications, J. Gross and J. Yellen. } \author{R. Gentleman } \seealso{ \code{\link{connComp}} \code{\link{edgeMatrix}} } \examples{ V <- letters[1:4] edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") ugraph(gR2) } \keyword{manip} graph/man/validGraph.Rd0000644000175100017510000000142212607264574016032 0ustar00biocbuildbiocbuild\name{validGraph} \alias{validGraph} \title{ Test whether graph object is valid } \description{ validGraph is a validating function for a graph object. } \usage{ validGraph(object, quietly=FALSE) } \arguments{ \item{object}{ a graph object to be tested } \item{quietly}{ \code{TRUE} or \code{FALSE} indicating whether output should be printed.} } \value{ If the graph object is valid, \code{TRUE} is returned otherwise \code{FALSE} is returned. If \code{object} is not a valid graph and \code{quietly} is set to \code{FALSE} then descriptions of the problems are printed. } \author{ Elizabeth Whalen } \seealso{\code{\link{graph-class}} } \examples{ testGraph<-graphNEL() testGraph@nodes<-c("node1","node2","node3") validGraph(testGraph) } \keyword{ manip} graph/man/write.tlp.Rd0000644000175100017510000000101612607264574015700 0ustar00biocbuildbiocbuild\name{write.tlp} \alias{write.tlp} \title{ Write a graph object in a file in the Tulip format} \description{ Write a graph object in a file in the Tulip format. } \usage{ write.tlp(graph, filename) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{graph}{a \code{graph} object} \item{filename}{ Name of the output file} } \details{ The Tulip format is used by the program Tulip. } \references{http://www.tulip-software.org/} \author{Laurent Gautier } \keyword{ manip } graph/src/0000755000175100017510000000000012607321273013465 5ustar00biocbuildbiocbuildgraph/src/Makevars0000644000175100017510000000031712607321273015162 0ustar00biocbuildbiocbuildafter: $(SHLIB) mv $(SHLIB) BioC_graph$(SHLIB_EXT) # By default, 'R CMD build' won't remove that file so it will end up in the # source tarball (observed with R 2.12.0). clean: rm BioC_graph$(SHLIB_EXT) graph/src/graph.c0000644000175100017510000007221112607321273014735 0ustar00biocbuildbiocbuild#include #include #include #include SEXP R_scalarString(const char *); SEXP intersectStrings(SEXP, SEXP); SEXP graph_intersection(SEXP, SEXP, SEXP, SEXP, SEXP); SEXP checkEdgeList(SEXP, SEXP); SEXP graph_listLen(SEXP); SEXP graph_attrData_lookup(SEXP attrObj, SEXP keys, SEXP attr); SEXP graph_sublist_assign(SEXP x, SEXP subs, SEXP sublist, SEXP values); SEXP graph_is_adjacent(SEXP fromEdges, SEXP to); SEXP graph_bitarray_sum(SEXP bits); SEXP graph_bitarray_set(SEXP bits, SEXP idx, SEXP val); SEXP graph_bitarray_transpose(SEXP bits); SEXP graph_bitarray_undirect(SEXP bits); SEXP graph_bitarray_rowColPos(SEXP bits); SEXP graph_bitarray_subGraph(SEXP bits, SEXP _subIndx); SEXP graph_bitarray_edgeSetToMatrix(SEXP nodes, SEXP bits, SEXP _weights, SEXP _directed); SEXP graph_bitarray_getBitCell(SEXP bits, SEXP _from, SEXP _to); SEXP graph_bitarray_Union_Attrs(SEXP inputBits, SEXP cmnBits, SEXP fromOneBits, SEXP fromTwoBits); SEXP graph_bitarray_Interect_Attrs(SEXP cmnBits, SEXP fromOneBits, SEXP fromTwoBits); SEXP graph_bitarray_removeEdges(SEXP bits, SEXP _indx); SEXP graph_bitarray_getEdgeAttrOrder(SEXP , SEXP , SEXP ); //SEXP graph_bitarray_getEdgeAttrPos(SEXP origBits, SEXP newBits) ; # define graph_duplicated(x) Rf_duplicated(x, FALSE) static const R_CallMethodDef R_CallDef[] = { {"intersectStrings", (DL_FUNC)&intersectStrings, 2}, {"graph_intersection", (DL_FUNC)&graph_intersection, 5}, {"graph_listLen", (DL_FUNC)&graph_listLen, 1}, {"graph_attrData_lookup", (DL_FUNC)&graph_attrData_lookup, 3}, {"graph_sublist_assign", (DL_FUNC)&graph_sublist_assign, 4}, {"graph_is_adjacent", (DL_FUNC)&graph_is_adjacent, 2}, {"graph_bitarray_rowColPos", (DL_FUNC)&graph_bitarray_rowColPos, 1}, {"graph_bitarray_getEdgeAttrOrder", (DL_FUNC)&graph_bitarray_getEdgeAttrOrder, 3}, {NULL, NULL, 0}, }; void R_init_BioC_graph(DllInfo *info) { R_registerRoutines(info, NULL, R_CallDef, NULL, NULL); } SEXP R_scalarString(const char *v) { SEXP ans = allocVector(STRSXP, 1); PROTECT(ans); if(v) SET_STRING_ELT(ans, 0, mkChar(v)); UNPROTECT(1); return(ans); } SEXP intersectStrings(SEXP x, SEXP y) { SEXP ans, matchRes, matched, dup; int i, j, k, n, numZero=0, size; int curEntry=0; PROTECT(matchRes = Rf_match(y, x, 0)); for (i = 0; i < length(matchRes); i++) { if (INTEGER(matchRes)[i] == 0) numZero++; } size = length(matchRes) - numZero; PROTECT(matched = allocVector(STRSXP, size)); for (i = 0; i < length(matchRes); i++) { if (INTEGER(matchRes)[i] != 0) { SET_STRING_ELT(matched, curEntry++, STRING_ELT(y, INTEGER(matchRes)[i]-1)); } } PROTECT(dup = graph_duplicated(matched)); n = length(matched); k = 0; for (j = 0; j < n; j++) if (LOGICAL(dup)[j] == 0) k++; PROTECT(ans = allocVector(STRSXP, k)); k = 0; for (j = 0; j < n; j++) { if (LOGICAL(dup)[j] == 0) { SET_STRING_ELT(ans, k++, STRING_ELT(matched, j)); } } UNPROTECT(4); return(ans); } SEXP graph_intersection(SEXP xN, SEXP yN, SEXP xE, SEXP yE, SEXP edgeMode) { /* edgeMode == 0 implies "undirected" */ SEXP bN, newXE, newYE; SEXP klass, outGraph; SEXP rval, ans, curRval, curWeights, curEdges, newNames, matches; int i, j, curEle=0; klass = MAKE_CLASS("graphNEL"); PROTECT(outGraph = NEW_OBJECT(klass)); if (INTEGER(edgeMode)[0]) SET_SLOT(outGraph, Rf_install("edgemode"), R_scalarString("directed")); else SET_SLOT(outGraph, Rf_install("edgemode"), R_scalarString("undirected")); PROTECT(bN = intersectStrings(xN, yN)); if (length(bN) == 0) { SET_SLOT(outGraph, Rf_install("nodes"), allocVector(STRSXP, 0)); SET_SLOT(outGraph, Rf_install("edgeL"), allocVector(VECSXP, 0)); UNPROTECT(1); return(outGraph); } PROTECT(newXE = checkEdgeList(xE, bN)); PROTECT(newYE = checkEdgeList(yE, bN)); PROTECT(newNames = allocVector(STRSXP, 2)); SET_STRING_ELT(newNames, 0, mkChar("edges")); SET_STRING_ELT(newNames, 1, mkChar("weights")); PROTECT(rval = allocVector(VECSXP, length(newXE))); for (i = 0; i < length(newXE); i++) { PROTECT(curRval = allocVector(VECSXP, 2)); setAttrib(curRval, R_NamesSymbol, newNames); PROTECT(ans = intersectStrings(VECTOR_ELT(newXE, i), VECTOR_ELT(newYE, i))); if (length(ans) == 0) { SET_VECTOR_ELT(curRval, 0, allocVector(INTSXP, 0)); SET_VECTOR_ELT(curRval, 1, allocVector(INTSXP, 0)); } else { PROTECT(curEdges = allocVector(INTSXP, length(ans))); PROTECT(matches = Rf_match(bN, ans, 0)); curEle = 0; for (j = 0; j < length(matches); j++) { if (INTEGER(matches)[j] != 0) INTEGER(curEdges)[curEle++] = INTEGER(matches)[j]; } SET_VECTOR_ELT(curRval, 0, curEdges); PROTECT(curWeights = allocVector(INTSXP, length(ans))); for (j = 0; j < length(ans); j++) INTEGER(curWeights)[j] = 1; SET_VECTOR_ELT(curRval, 1, curWeights); UNPROTECT(3); } SET_VECTOR_ELT(rval, i, curRval); UNPROTECT(2); } setAttrib(rval, R_NamesSymbol, bN); SET_SLOT(outGraph, Rf_install("nodes"), bN); SET_SLOT(outGraph, Rf_install("edgeL"), rval); UNPROTECT(6); return(outGraph); } SEXP checkEdgeList(SEXP eL, SEXP bN) { SEXP newEL, curVec, curMatches, newVec, eleNames; int i, j, k, size, curEle; PROTECT(newEL = allocVector(VECSXP, length(bN))); PROTECT(eleNames = getAttrib(eL, R_NamesSymbol)); for (i = 0; i < length(bN); i++) { for (k = 0; k < length(eL); k++) { if (strcmp(CHAR(STRING_ELT(eleNames, k)), CHAR(STRING_ELT(bN, i))) == 0) break; } if (k < length(eL)) { curVec = VECTOR_ELT(eL, k); PROTECT(curMatches = Rf_match(curVec, bN, 0)); size = length(curMatches); for (j = 0; j < length(curMatches); j++) { if (INTEGER(curMatches)[j] == 0) size--; } PROTECT(newVec = allocVector(STRSXP, size)); curEle = 0; for (j = 0; j < length(curMatches); j++) { if (INTEGER(curMatches)[j] != 0) { SET_STRING_ELT(newVec, curEle++, STRING_ELT(curVec, INTEGER(curMatches)[j]-1)); } } SET_VECTOR_ELT(newEL, i, newVec); UNPROTECT(2); } } setAttrib(newEL, R_NamesSymbol, bN); UNPROTECT(2); return(newEL); } /* Taken from Biobase to avoid depending on it */ SEXP graph_listLen(SEXP x) { SEXP ans; int i; if( !Rf_isNewList(x) ) error("require a list"); PROTECT(ans = allocVector(REALSXP, length(x))); for(i=0; i 1 && ns != numVals) error("invalid args: subs and values must be the same length"); names = GET_NAMES(x); PROTECT(idx = match(names, subs, -1)); PROTECT(newsubs = allocVector(STRSXP, ns)); nnew = 0; for (i = 0; i < ns; i++) { if (INTEGER(idx)[i] == -1) SET_STRING_ELT(newsubs, nnew++, STRING_ELT(subs, i)); } PROTECT(ans = allocVector(VECSXP, origlen + nnew)); PROTECT(ansnames = allocVector(STRSXP, length(ans))); for (i = 0; i < origlen; i++) { SET_VECTOR_ELT(ans, i, duplicate(VECTOR_ELT(x, i))); SET_STRING_ELT(ansnames, i, duplicate(STRING_ELT(names, i))); } j = origlen; for (i = 0; i < nnew; i++) SET_STRING_ELT(ansnames, j++, STRING_ELT(newsubs, i)); SET_NAMES(ans, ansnames); UNPROTECT(1); nextempty = origlen; /* index of next unfilled element of ans */ for (i = 0; i < ns; i++) { if (numVals > 1) PROTECT(val = graph_makeItem(values, i)); else if (numVals == 1 && isVectorList(values)) PROTECT(val = duplicate(VECTOR_ELT(values, 0))); else PROTECT(val = duplicate(values)); j = INTEGER(idx)[i]; if (j < 0) { tmpItem = graph_addItemToList(R_NilValue, val, sublist); SET_VECTOR_ELT(ans, nextempty, tmpItem); nextempty++; } else { tmpItem = VECTOR_ELT(ans, j-1); tmpIdx = graph_getListIndex(tmpItem, sublist); if (tmpIdx == -1) { tmpItem = graph_addItemToList(tmpItem, val, sublist); SET_VECTOR_ELT(ans, j-1, tmpItem); } else SET_VECTOR_ELT(tmpItem, tmpIdx, val); } UNPROTECT(1); } UNPROTECT(3); return ans; } SEXP graph_is_adjacent(SEXP fromEdges, SEXP to) { SEXP ans, frEdges, toEdge, idx; int i, j, lenTo; int found = 0; lenTo = length(to); PROTECT(ans = allocVector(LGLSXP, lenTo)); for (i = 0; i < lenTo; i++) { found = 0; PROTECT(toEdge = ScalarString(STRING_ELT(to, i))); frEdges = VECTOR_ELT(fromEdges, i); idx = match(toEdge, frEdges, 0); for (j = 0; j < length(idx); j++) if ((found = (INTEGER(idx)[j] > 0))) break; LOGICAL(ans)[i] = found; UNPROTECT(1); } UNPROTECT(1); return ans; } SEXP graph_bitarray_sum(SEXP bits) { /* This approach from http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan */ unsigned char *bytes = (unsigned char *) RAW(bits); unsigned char v; int c = 0; int len = length(bits); int i; for (i = 0; i < len; i++) { for (v = bytes[i]; v; c++) { v &= v - 1; /* clear the least significant bit set */ } } return ScalarInteger(c); } SEXP graph_bitarray_rowColPos(SEXP bits) { SEXP ans, matDim, dimNames, colNames; int i, j = 0, k, len = length(bits), *indices, dim = asInteger(getAttrib(bits, install("bitdim"))), edgeCount = asInteger(getAttrib(bits, install("nbitset"))); unsigned char v, *bytes = (unsigned char *) RAW(bits); PROTECT(ans = allocVector(INTSXP, 2 * edgeCount)); indices = INTEGER(ans); for (i = 0; i < len; i++) { for (v = bytes[i], k = 0; v; v >>= 1, k++) { if (v & 1) { int idx = (i * 8) + k; indices[j] = (idx % dim) + 1; /* R is 1-based */ indices[j + edgeCount] = (idx / dim) + 1; j++; } } } PROTECT(matDim = allocVector(INTSXP, 2)); INTEGER(matDim)[0] = edgeCount; INTEGER(matDim)[1] = 2; setAttrib(ans, R_DimSymbol, matDim); PROTECT(colNames = allocVector(STRSXP, 2)); SET_STRING_ELT(colNames, 0, mkChar("from")); SET_STRING_ELT(colNames, 1, mkChar("to")); PROTECT(dimNames = allocVector(VECSXP, 2)); SET_VECTOR_ELT(dimNames, 0, R_NilValue); SET_VECTOR_ELT(dimNames, 1, colNames); setAttrib(ans, R_DimNamesSymbol, dimNames); UNPROTECT(4); return ans; } #define COORD_TO_INDEX(x, y, nrow) ((((y)+1) * (nrow)) - ((nrow) - ((x)+1)) - 1) #define NROW(x) (INTEGER(getAttrib((x), install("bitdim")))[0]) #define INDEX_TO_ROW(i, n) ((i) % (n)) #define INDEX_TO_COL(i, n) ((i) / (n)) #define IS_SET(b, i, bit) ((b)[i] != 0 && ((b)[i] & (1 << (bit)))) SEXP graph_bitarray_transpose(SEXP bits) { SEXP ans; int nrow, i, j, len = length(bits); unsigned char *bytes = RAW(bits), *ans_bytes; ans = PROTECT(duplicate(bits)); /* dup to capture attributes */ ans_bytes = RAW(ans); memset(ans_bytes, 0, len); nrow = NROW(bits); /* FIXME: use a single loop, look at R's array.c */ for (i = 0; i < nrow; i++) { for (j = 0; j < nrow; j++) { int idx = COORD_TO_INDEX(i, j, nrow), tidx = COORD_TO_INDEX(j, i, nrow); int byteIndex = idx / 8, bitIndex = idx % 8, tBitIndex = tidx % 8; if (IS_SET(bytes, byteIndex, bitIndex)) ans_bytes[tidx / 8] |= (1 << tBitIndex); } } UNPROTECT(1); return ans; } /* Given a bit vector representing directed edges, return a new bit vector with the underlying undirected edges. */ SEXP graph_bitarray_undirect(SEXP bits) { int i, j, c = 0, len = length(bits), nrow = NROW(bits); SEXP tbits = PROTECT(graph_bitarray_transpose(bits)), ans = PROTECT(duplicate(bits)); unsigned char *bytes = RAW(bits), *tbytes = RAW(tbits), *abytes = RAW(ans); for (i = 0; i < len; i++) { unsigned char v; if (0 != (abytes[i] = bytes[i] | tbytes[i])) { /* keep track of edge count */ for (v = abytes[i]; v; c++) { v &= v - 1; /* clear the least significant bit set */ } } } /* zero out lower tri */ for (i = 0; i < nrow; i++) { for (j = 0; j < nrow; j++) { if (i > j) { unsigned char v; int idx = COORD_TO_INDEX(i, j, nrow); v = abytes[idx / 8]; if (0 != v) { if (IS_SET(abytes, idx / 8, idx % 8)) c--; abytes[idx / 8] &= ~(1 << (idx % 8)); } } } } INTEGER(getAttrib(ans, install("nbitset")))[0] = c; UNPROTECT(2); return ans; } SEXP graph_bitarray_set(SEXP bits, SEXP idx, SEXP val) { SEXP ans = PROTECT(duplicate(bits)); int *which, *values, i, nVal = length(val), *num_set = INTEGER(getAttrib(ans, install("nbitset"))); unsigned char *bytes = RAW(ans); PROTECT(idx = coerceVector(idx, INTSXP)); PROTECT(val = coerceVector(val, INTSXP)); which = INTEGER(idx); values = INTEGER(val); for (i = 0; i < nVal; i++) { int w = which[i] - 1; int offset = w / 8; unsigned char bit = w % 8; if (values[i]) { if (!IS_SET(bytes, offset, bit)) (*num_set)++; bytes[offset] |= (1 << bit); } else { if (IS_SET(bytes, offset, bit)) (*num_set)--; bytes[offset] &= ~(1 << bit); } } UNPROTECT(3); return ans; } SEXP graph_bitarray_subGraph(SEXP bits, SEXP _subIndx) { SEXP _dim = getAttrib(bits,install("bitdim")), sgVec, btlen, btdim, btcnt, _ftSetPos, res, namesres; int dim, subLen, prevSetPos = 0, sgSetIndx = 0, linIndx = 0, col, subgBitLen, subgBytes, *subIndx, *ftSetPos, edgeCount = 0, ftLen = 256; PROTECT_INDEX pidx; unsigned char *bytes = (unsigned char *) RAW(bits), *sgBits; dim = INTEGER(_dim)[0]; subIndx = INTEGER(_subIndx); subLen = length(_subIndx); subgBitLen = subLen * subLen; subgBytes = subgBitLen / 8; if ((subgBitLen % 8) != 0) { subgBytes++; } PROTECT(sgVec = allocVector(RAWSXP, subgBytes)); sgBits = RAW(sgVec); memset(sgBits, 0, subgBytes); /* TODO: in many cases, this will be more than we need, we should also use the number of edges in the input as a starting point. */ _ftSetPos = allocVector(INTSXP, ftLen); /* FIXME: need better guess */ PROTECT_WITH_INDEX(_ftSetPos, &pidx); ftSetPos = INTEGER(_ftSetPos); for (col = 0; col < subLen; col++) { int col_idx_dim = ((subIndx[col] - 1) * dim) - 1; int row = 0; while (row < subLen) { int setPos = col_idx_dim + subIndx[row]; unsigned char v = bytes[setPos / 8]; if (v != 0 && v & (1 << (setPos % 8))) { int curSetPos = setPos, m = prevSetPos; while (m < curSetPos) { unsigned char tempV = bytes[m / 8]; if (tempV == 0) { m += 8; } else { if (tempV & (1 << (m % 8))) edgeCount++; m++; } } prevSetPos = curSetPos + 1; edgeCount++; /* current edge */ if (sgSetIndx == ftLen) { ftLen *= 2; if (ftLen > subgBitLen) ftLen = subgBitLen; REPROTECT(_ftSetPos = lengthgets(_ftSetPos, ftLen), pidx); ftSetPos = INTEGER(_ftSetPos); } ftSetPos[sgSetIndx] = edgeCount; sgSetIndx++; sgBits[linIndx / 8] |= (1 << (linIndx % 8)); } linIndx++; row++; } } REPROTECT(_ftSetPos = lengthgets(_ftSetPos, sgSetIndx), pidx); PROTECT(btlen = ScalarInteger(subgBitLen)); PROTECT(btcnt = ScalarInteger(sgSetIndx)); PROTECT(btdim = allocVector(INTSXP, 2)); INTEGER(btdim)[0] = subLen; INTEGER(btdim)[1] = subLen; setAttrib(sgVec, install("bitlen"), btlen); setAttrib(sgVec, install("bitdim"), btdim); setAttrib(sgVec, install("nbitset"), btcnt); PROTECT(res = allocVector(VECSXP, 2)); SET_VECTOR_ELT(res, 0, _ftSetPos); SET_VECTOR_ELT(res, 1, sgVec); PROTECT(namesres = allocVector(STRSXP, 2)); SET_STRING_ELT(namesres, 0, mkChar("setPos")); SET_STRING_ELT(namesres, 1, mkChar("bitVec")); setAttrib(res, R_NamesSymbol, namesres); UNPROTECT(7); return res; } SEXP graph_bitarray_edgeSetToMatrix(SEXP nodes, SEXP bits, SEXP _weights, SEXP _directed) { SEXP ans, dnms, _dim = getAttrib(bits, install("bitdim")); unsigned char *bytes = (unsigned char *) RAW(bits); int dim = INTEGER(_dim)[0], num_el = dim * dim, directed = asInteger(_directed), linIndx = 0, wtIndx = 0; double *weights = REAL(_weights), *ftMat; PROTECT(ans = allocVector(REALSXP, num_el)); ftMat = REAL(ans); memset(ftMat, 0, sizeof(double) * num_el); while (linIndx < num_el) { unsigned char v = bytes[linIndx / 8]; if (v == 0) { linIndx += 8; } else { if (v & (1 << (linIndx % 8))) { ftMat[linIndx] = weights[wtIndx]; if (!directed) { ftMat[linIndx/dim + (linIndx % dim)*dim] = weights[wtIndx]; } wtIndx++; } linIndx++; } } SET_NAMED(_dim, 2); setAttrib(ans, R_DimSymbol, _dim); PROTECT(dnms = allocVector(VECSXP, 2)); /* Arguments to .Call have NAMED(x) == 2, so we can reuse here. */ SET_VECTOR_ELT(dnms, 0, nodes); SET_VECTOR_ELT(dnms, 1, nodes); setAttrib(ans, R_DimNamesSymbol, dnms); UNPROTECT(2); return ans; } SEXP graph_bitarray_getBitCell(SEXP bits, SEXP _from, SEXP _to) { int len = length(_to); SEXP ans; PROTECT(ans = allocVector(LGLSXP, len)); unsigned char *bytes = (unsigned char *) RAW(bits); int *from = INTEGER(_from); int *to = INTEGER(_to); int dim = NROW(bits); int i = 0, val, byteIndex, bitIndex, indx; for(i =0; i < len; i++) { indx = COORD_TO_INDEX(from[i]-1, to[i]-1, dim) ; byteIndex = indx / 8 ; bitIndex = indx % 8 ; val = bytes[byteIndex] & (1 << bitIndex); LOGICAL(ans)[i] = 0; if (val) { LOGICAL(ans)[i] = 1; } } UNPROTECT(1); return(ans); } SEXP graph_bitarray_Union_Attrs(SEXP inputBits, SEXP cmnBits, SEXP fromOneBits, SEXP fromTwoBits) { unsigned char *ans = (unsigned char*) RAW(inputBits); unsigned char *cmn = (unsigned char*) RAW(cmnBits); unsigned char *fromOne = (unsigned char *) RAW(fromOneBits); unsigned char *fromTwo = (unsigned char *) RAW(fromTwoBits); int len = length(inputBits) * 8; int i, byteIndex, bitIndex , shft, setIndx = 0; int nn = asInteger(getAttrib(inputBits, install("nbitset"))); SEXP from, indx1, indx2, res, namesres ; PROTECT(from = allocVector(INTSXP, nn)); PROTECT(indx1 = allocVector(INTSXP , nn)); PROTECT(indx2 = allocVector(INTSXP , nn)); int from1Indx = 0; int from2Indx = 0; int cmnIndx = 0; for( i =0 ; i < len; i ++) { byteIndex = i / 8; bitIndex = i % 8; shft = 1 << bitIndex; if(ans[byteIndex] & (shft)) { if(cmn [byteIndex] & (shft)) { cmnIndx++; from1Indx++; from2Indx++; INTEGER(from)[setIndx] = 0; } else if(fromOne[byteIndex] & (shft)) { from1Indx++; INTEGER(from)[setIndx] = 1; } else if(fromTwo[byteIndex] & (shft)) { from2Indx++; INTEGER(from)[setIndx] = 2; } INTEGER(indx1)[setIndx] = from1Indx ; INTEGER(indx2)[setIndx] = from2Indx; setIndx++; } } PROTECT(res = allocVector(VECSXP, 3)); SET_VECTOR_ELT(res, 0, from); SET_VECTOR_ELT(res, 1, indx1); SET_VECTOR_ELT(res, 2, indx2); PROTECT(namesres = allocVector(STRSXP, 3)); SET_STRING_ELT(namesres, 0, mkChar("from")); SET_STRING_ELT(namesres, 1, mkChar("indx1")); SET_STRING_ELT(namesres, 2, mkChar("indx2")); setAttrib(res, R_NamesSymbol, namesres); UNPROTECT(5); return(res); } SEXP graph_bitarray_Intersect_Attrs(SEXP cmnBits, SEXP fromOneBits, SEXP fromTwoBits) { unsigned char *cmn = (unsigned char*) RAW(cmnBits); unsigned char *fromOne = (unsigned char *) RAW(fromOneBits); unsigned char *fromTwo = (unsigned char *) RAW(fromTwoBits); int len = length(cmnBits) * 8; int i, byteIndex, bitIndex , shft, setIndx = 0; int nn = asInteger(getAttrib(cmnBits, install("nbitset"))); SEXP from, indx1, indx2, res, namesres; PROTECT(from = allocVector(INTSXP, nn)); PROTECT(indx1 = allocVector(INTSXP , nn)); PROTECT(indx2 = allocVector(INTSXP , nn)); int from1Indx = 0; int from2Indx = 0; for( i =0 ; i < len; i ++) { byteIndex = i / 8; bitIndex = i % 8; shft = 1 << bitIndex; if(fromOne[byteIndex] & (shft) ) { from1Indx++; } if(fromTwo[byteIndex] & (shft)) { from2Indx++; } if(cmn[byteIndex] & (shft)) { INTEGER(from)[setIndx] = 0; INTEGER(indx1)[setIndx] = from1Indx; INTEGER(indx2)[setIndx] = from2Indx; setIndx++; } } PROTECT(res = allocVector(VECSXP, 3)); SET_VECTOR_ELT(res, 0, from); SET_VECTOR_ELT(res, 1, indx1); SET_VECTOR_ELT(res, 2, indx2); PROTECT(namesres = allocVector(STRSXP, 3)); SET_STRING_ELT(namesres, 0, mkChar("from")); SET_STRING_ELT(namesres, 1, mkChar("indx1")); SET_STRING_ELT(namesres, 2, mkChar("indx2")); setAttrib(res, R_NamesSymbol, namesres); UNPROTECT(5); return(res); } SEXP graph_bitarray_removeEdges(SEXP bits, SEXP _indx) { SEXP ans = PROTECT(duplicate(bits)), btcnt; unsigned char *bytes = (unsigned char *) RAW(ans); int *indx = INTEGER(_indx); int len = length(bits) * 8 ; int i, byteIndex, bitIndex, subIndx =0; int nSet = 0; unsigned char mask; for( i =0 ; i < len; i ++) { byteIndex = i / 8; bitIndex = i % 8; if(IS_SET(bytes, byteIndex, bitIndex)) { if(indx[subIndx] == 0){ mask = ~(1 << bitIndex) ; bytes[byteIndex] = bytes[byteIndex] & mask; } else { nSet++; } subIndx++; } } PROTECT(btcnt = ScalarInteger(nSet)); setAttrib(ans, install("nbitset"), btcnt); UNPROTECT(2); return(ans); } SEXP graph_bitarray_getEdgeAttrOrder(SEXP _bits, SEXP _from, SEXP _to) { unsigned char *bits = (unsigned char*) RAW(_bits); int ns = asInteger(getAttrib(_bits, install("nbitset"))); int len = length(_from); int *from = INTEGER(_from); int *to = INTEGER(_to); int dim = NROW(_bits); int byteIndex, bitIndex, shft, indx, intIndx, i, j; int oindx=0, nindx=0, attrIndx=0, setCount=0; SEXP origRightPos, origLeftPos, newRightPos, newLeftPos, res, namesres; PROTECT(origRightPos = allocVector(INTSXP, ns)); //index into orig attr PROTECT(origLeftPos = allocVector(INTSXP, ns)); PROTECT(newRightPos = allocVector(INTSXP, len)); PROTECT(newLeftPos = allocVector(INTSXP, len)); setCount =1; for(j =0; j < dim ; j ++) { for(i =0; i < dim; i++){ indx = COORD_TO_INDEX(i, j , dim); byteIndex = indx / 8; bitIndex = indx % 8; shft = 1 << bitIndex; intIndx = COORD_TO_INDEX(from[attrIndx]-1, to[attrIndx]-1, dim); if(bits[byteIndex] & (shft) ) { INTEGER(origRightPos)[oindx] = oindx + 1 ; INTEGER(origLeftPos)[oindx] = setCount ; oindx++; if(intIndx != indx){ setCount++; } } if(intIndx == indx) { INTEGER(newRightPos)[nindx] = nindx + 1; INTEGER(newLeftPos)[nindx] = setCount ; nindx++; if(attrIndx < len-1){ attrIndx++; } setCount++; } } } SET_LENGTH(newRightPos, nindx); SET_LENGTH(newLeftPos, nindx); PROTECT(res = allocVector(VECSXP, 4)); SET_VECTOR_ELT(res, 0, newLeftPos); SET_VECTOR_ELT(res, 1, newRightPos); SET_VECTOR_ELT(res, 2, origLeftPos); SET_VECTOR_ELT(res, 3, origRightPos); PROTECT(namesres = allocVector(STRSXP, 4)); SET_STRING_ELT(namesres, 0, mkChar("newLeftPos")); SET_STRING_ELT(namesres, 1, mkChar("newRightPos")); SET_STRING_ELT(namesres, 2, mkChar("origLeftPos")); SET_STRING_ELT(namesres, 3, mkChar("origRightPos")); setAttrib(res, R_NamesSymbol, namesres); UNPROTECT(6); return(res); } graph/tests/0000755000175100017510000000000012607264574014052 5ustar00biocbuildbiocbuildgraph/tests/graph_unit_tests.R0000644000175100017510000000006712607264574017562 0ustar00biocbuildbiocbuildBiocGenerics:::testPackage("graph", pattern="_test.R") graph/vignettes/0000755000175100017510000000000012607321273014706 5ustar00biocbuildbiocbuildgraph/vignettes/GraphClass.Rnw0000644000175100017510000002714112607264574017444 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT GraphClass.Rnw!!! % GraphClass.tex file will get overwritten. % %\VignetteIndexEntry{Graph Design} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \begin{document} \section{Introduction} The purpose of this document is to describe the implementation the classes used to represent graphs in the \Rpackage{graph} package and to discuss design issues for future development. There are many different ways to represent a graph and to deal with the edges and nodes within that graph. Below we discuss the graph representations implemented in the \Rpackage{graph} package and define the set of methods that form the \textit{graph interface} as determined empiracally by the methods used by packages like \Rpackage{RBGL} when interacting with \Robject{graph} objects. A graph is a pair of sets, $G=(V,E)$ where $V$ is the set of nodes and $E$ is the set of edges, which are determined by relationships that exist between the nodes. If we let $n = |V|$, be the number of nodes then, excluding self-loops there are at most $n$ choose 2 edges in $G$. A \textit{simple graph} is a graph with at most one edge between any pair of nodes and no self-loops. \section{The \Rclass{graph} class} The \Rclass{graph} class and its subclasses support simple graphs as well as graphs with at most one self-loop on any given node. Not all graph representations can easily support more general graphs. Limiting to simple graphs with self-loops allows for reversible conversions between different graph representations. Furthermore, this limitation simplifies the interface of edge related methods which would otherwise have to support ways of identifying one of many edges between the same pair of nodes. Arbitrary attributes can be associated with a graph, with a node, or with an edge. For both nodes and edges if one edge or node has a particular attribute then all nodes and edges must have that attribute. Nodes and edges can have more than one attribute associated with them. \textit{This raises the question of whether we should use the \Rclass{AnnotatedDataFrame} class from Biobase here as a way to implement general node and edge attributes.} \textit{However, currently AnnotatedDataFrame is based on a data.frame and cannot easily support arbitrary attributes. Even having a vector of length greater than one as the value of an attribute could cause problems.} The \Rclass{graph} class itself is VIRTUAL and has the following definition: <>= library("graph") getClass("graph") @ The \Robject{edgemode} slot indicates whether the graph is \textit{directed} or \textit{undirected}. Since some graph algorithms only make sense in a directed graph, the edgemode is a property of the entire graph, rather than a property of an edge. The \Robject{graphData} slot was recently added to hold arbitrary attributes for the graph. Although edgemode is such an attribute, it isn't clear whether it should move inside the generic container since edgemode is of such high semantic importance. It probably doesn't matter as long as methods such as \Rfunction{isDirected} do the right thing. The \Robject{edgeData} and \Robject{nodeData} slots store the attributes for the edges and nodes of the graph, respectively. There are currently implementations for the \Rclass{graphNEL} class, where nodes are a vector and edges are a list, each element of the list correspondes to one node and the values are nodes corresponding to the out-edges from that node. If the graph is directed then all edges essentially appear twice. The \Rclass{graphAM} class, which stores the edge information in an adjacency matrix. The matrix must be square and the row names must match the column names. If the graph is undirected then the matrix must also be symmetric. There are two specialized classes, \Rclass{distGraph} which takes a distance matrix directly and has special thresholding capabilities. It is not clear whether this should be a specialization of the \Rclass{graphAM} class or not. The second specialized class is a \Rclass{clusterGraph} which can be used to represent the output of a clustering algorithm as a graph. Samples represent nodes and all samples in the same cluster have edges, while samples in distinct clusters do not. Instances of this class must have their edgemode as \texttt{undirected}, if the edgemode is reset then coercion to some other mode of graph is needed. \subsection{Methods of graphs} Here are some of the methods that all graph-like objects should support: \begin{description} \item[nodes(object)] Return a character vector of the node labels. The order is not defined. \item[nodes<-(object)] Return a new graph object with the node labels set as specified by a character vector. This is slightly fragile since here order does matter, but the order can only really be determined by first calling \Rfunction{nodes}. by providing a character vector of the appropriate length. \item[addNode(node, object, edges)] Return a new graph object with additional nodes and (optionally) edges. The methods that have been implemented expect \Robject{node} to be the node labels of the new nodes specified as a character vector. Optional edges can be specified. \item[removeNode(node, object)] Return a new graph object with nodes (and their incident edges) removed. Current methods are implemented for \Robject{node} being a character vector of node labels to remove. \item[edges(object, which)] Return a list with an element for each node in the graph. The names of the list are the node labels. Each element is a character vector giving the node labels of the nodes which the given element shares an edge with. For undirected graphs, reciprocal edges should be included. This representation is very similar to the NEL edgeL structure. \item[edgeWeights(object, index)] \item[addEdge(from, to, graph, weights)] Return a new graph object with additional edges. \item[removeEdge(from, to, graph)] Return a new graph object with the specified edges removed. \item[numNodes(object)] Return a count of the nodes in the graph. \item[numEdges(object)] Return a count of the edges in the graph. \item[isDirected(object)] Return TRUE if the graph is directed and false otherwise. \item[acc(object, index)] See man page. \item[adj(object, index)] See man page. \item[nodeData] Access to node attributes. See man page. \item[edgeData] Access to edge attributes. See man page. \end{description} \subsection{Some Details} Once both nodes and edges are instances of classes they will be quite large. In order to reduce the storage requirements (especially for large graphs) using integer indices may be beneficial. The minimum amount of storage required is $|V|+|E|$. If we use an incidence matrix representation then the storage is $|V|^2$. If we use a node and edge list representation then the storage requirements are $|V|+2|E|$. When either $|V|$ or $|E|$ are large these mechanisms will not be especially efficient. In some cases it may be better to keep the actual node and edge data stored in hash tables and keep other integer vectors available for accessing the necessary components. \subsubsection{Representation of Edges} \label{sec:edgerep} We have taken the approach of allowing the representation of the edge sets to not contain every node. When the graphs are sparse this can be a fairly large savings in space, but it means that one cannot determine the nodes in a graph from the edges in the graph. Also, for the \Rclass{graphNEL} class we do not store the names of the nodes in the NEL, but rather indexes into a the node vector. This is important for allowing us to perform permutations on the nodes of a graph, but causes a number of problems when subsetting graphs, and means that knowledge of the edges does not provide knowledge of the nodes. \section{Multi-graphs} There are no clear and widely used definitions for multi-graphs, so here we will make clear a definition that we believe will be useful for biological computations. We define a multi-graph to consist of two components, one a set of nodes and the second a list of edge sets. Each edge set corresponds to a potentially different set of relationships between the nodes (which are common to all edge sets). We denote this by $G=(V, E_L)$, where $V$ is the set of nodes and $E_L = (E_1, \ldots, E_L)$ is a collection of $L$ edge sets. Each with a potentially distinct set of relationships. The edge sets are essentially identical to the edge sets for a graph, and hence can have arbitrary attributes associated with them, the edges can be either \textit{directed} or \textit{undirected} and self-loops are allowed. It is not clear whether there should be distinct types of multigraphs as there are graphs. It will surely be more flexible to support a list of edge sets, and to allow these to have different structures. Current definition does not extend the \Rclass{graph} class. The definition is: <>= getClass("multiGraph") @ \begin{description} \item[nodes] A vector of node identifiers. %% FIXME: if these are node identifiers, then shouldn't we use %% "character"? Elsewhere, there seems to be an assumption that %% node labels or identifiers are character. \item[edgeL] A possibly named list of instances of the \Rclass{edgeSet} class. \end{description} The \Rclass{edgeSet} class is a virtual class with several different extensions. These include a \Rclass{edgeSetNEL} and an \Rclass{edgeSetAM}, others will be added once the interface stabilizes. Edge attributes are in the edgeData slot in the edgeSet class. This implies that edgeSets in a multiGraph can have completely unrelated edge attributes. Another approach would be to maintain a list conforming to the edgeSet list containing edge attributes that would enforce the same attributes to be defined for all edges in the multiGraph. \subsection{Methods} In some ways it would be most natural to have \Robject{edges} methods for the \Rclass{edgeSet} class the issues raised in Section~\ref{sec:edgerep} seem to preclude this and it only seems to make sense to have \Robject{node} and \Robject{edges} methods for the \Rclass{multiGraph} class. It will probably make sense to be able to name the edgeSets within a multiGraph and to be able to extract graph objects from the multiGraph representing any of the edgeSets. There should be methods to produce graph objects based on intersection, union, and more complex combination algorithms. The edgeSets may represent interaction data with reliability estimates as edge weights. The user may want to produce a graph object combining the available data to obtain most reliable edges. We may want to consider apply type operations to apply an operation across all edgeSets in a multiGraph. \subsection{Use Cases} An important motivator for the \Rclass{multiGraph} class is the representation of data from protein interaction experiments. Our goal is to represent these data in terms of what interactions were tested, and of those which ones are either positive or negative. \section{Bipartite Graphs} A bipartite graph graph is a graph where the nodes can be divided into two sets, say $V_1$ and $V_2$, such that all edges are between members of $V_1$ and members of $V_2$ and there are no edges between any two elements of $V_1$, nor of $V_2$. \end{document} graph/vignettes/MultiGraphClass.Rnw0000644000175100017510000004412512607264574020460 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{graphBAM and MultiGraph classes} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \begin{document} \title{graphBAM and MultiGraph classes.} \author{N. Gopalakrishnan} \maketitle \section{graphBAM class} \subsection{Introduction} The \Rclass{graphBAM} class has been created as a more efficient replacement for the \Rclass{graphAM} class in the \Rpackage{graph} package. The adjacency matrix in the \Rclass{graphBAM} class is represented as a bit array using a \Rcode{raw} vector. This significantly reduces the memory occupied by graphs having a large number of nodes. The bit vector representation also provides advantages in terms of performing operations such as intersection or union of graphs. We first load the \Rpackage{graph} package which provides the class definition and methods for the \Rclass{graphBAM} class. <>= library(graph) @ One of the arguments \Rcode{df} to the \Rclass{graphBAM} constructor is a \Robject{data.frame} containing three columns: "from","to" and "weight", each row in the \Robject{data.frame} representing an edge in the graph. The \Rcode{from} and \Rcode{to} columns can be character vectors or factors, while the \Rcode{weight} column must be a numeric vector. The argument \Rcode{nodes} are calculated from the unique names in the \Rcode{from} and \Rcode{to} columns of the \Robject{data.frame}. The argument \Rcode{edgeMode} should be a character vector, either "directed" or "undirected" indicating whether the graph represented should be directed or undirected respectively. \subsection{ A simple graph represented using graphBAM class} We proceed to represent a simple graph using the \Rclass{graphBAM} class. Our example is a directed graph representing airlines flying between different cities. In this example, cities represent the nodes of the graph and each edge represents a flight from an originating city (\Rcode{from}) to the destination city (\Rcode{to}). The weight represents the fare for flying between the \Rcode{from} and \Rcode{to} cities. <>= df <- data.frame(from = c("SEA", "SFO", "SEA", "LAX", "SEA"), to = c("SFO", "LAX", "LAX", "SEA", "DEN"), weight = c( 90, 96, 124, 115, 259)) g <- graphBAM(df, edgemode = "directed") g @ The cities (nodes) included in our \Rclass{graph} object as well as the stored fares(\Rcode{weight}) can be obtained using the \Rmethod{nodes} and \Rmethod{edgeWeights} methods respectively. <>= nodes(g) edgeWeights(g, index = c("SEA", "LAX")) @ Additional nodes or edges can be added to our graph using the \Rmethod{addNode} and \Rmethod{addEdge} methods. For our example, we first add a new city "IAH" to our graph. We then add a flight connection between "DEN" and "IAH" having a fare of \$120. <>= g <- addNode("IAH", g) g <- addEdge(from = "DEN", to = "IAH", graph = g, weight = 120) g @ Similarly edges and nodes can be removed from the graph using the \Rmethod{removeNode} and \Rmethod{removeEdge} methods respectively. We proceed to remove the flight connection from "DEN" to "IAH" and subsequently the node "IAH". <>= g <- removeEdge(from ="DEN", to = "IAH", g) g <- removeNode(node = "IAH", g) g @ We can create a subgraph with only the cities "DEN", "LAX" and "SEA" using the \Rmethod{subGraph} method. <>= g <- subGraph(snodes = c("DEN","LAX", "SEA"), g) g @ We can extract the \Rcode{from}-\Rcode{to} relationships for our graph using the \Rmethod{extractFromTo} method. <>= extractFromTo(g) @ \subsection{Mice gene interaction data for brain tissue (SAGE data)} The C57BL/6J and C3H/HeJ mouse strains exhibit different cardiovascular and metabolic phenotypes on the hyperlipidemic apolipoprotein E (Apoe) null background. The interaction data for the genes from adipose, brain, liver and muscle tissue samples from male and female mice were studied. This interaction data for the various genes is included in the \Rpackage{graph} package as a list of \Robject{data.frame}s containing information for \Rcode{from-gene}, \Rcode{to-gene} and the strength of interaction \Rcode{weight} for each of the tissues studied. We proceed to load the data for male and female mice. <>= data("esetsFemale") data("esetsMale") @ We are interested in studying the interaction data for the genes in the brain tissue for male and female mice and hence proceed to represent this data as directed graphs using \Rclass{graphBAM} objects for male and female mice. <>= dfMale <- esetsMale[["brain"]] dfFemale <- esetsFemale[["brain"]] head(dfMale) @ <>= male <- graphBAM(dfMale, edgemode = "directed") female <- graphBAM(dfFemale, edgemode = "directed") @ We are interested in pathways that are common to both male and female graphs for the brain tissue and hence proceed to perform a graph intersection operation using the \Rmethod{graphIntersect} method. Since edges can have different values of the weight attribute, we would like the result to have the sum of the weight attribute in the male and female graphs. We pass in \Rcode{sum} as the function for handling weights to the \Rcode{edgeFun} argument. The \Rcode{edgeFun} argument should be passed a list of named functions corresponding to the edge attributes to be handled during the intersection process. <>= intrsct <- graphIntersect(male, female, edgeFun=list(weight = sum)) intrsct @ If node attributes were present in the \Robject{graphBAM} objects, a list of named function could be passed as input to the \Rcode{graphIntersect} method for handling them during the intersection process. We proceed to remove edges from the \Robject{graphBAM} result we just calculated with a weight attribute less than a numeric value of 0.8 using the \Rmethod{removeEdgesByWeight} method. <>= resWt <- removeEdgesByWeight(intrsct, lessThan = 1.5) @ Once we have narrowed down to the edges that we are interested in, we would like to change the color attribute for these edges in our original \Robject{graphBAM} objects for the male and female graphs to "red". Before an attribute can be added, we have to set its default value using the \Rfunction{edgedataDefaults} method. For our example, we set the default value for the color attribute to white. We first obtain the from - to relationship for the \Rcode{resWt} graph using the \Rmethod{extractFromTo} method and then make use of the \Rmethod{edgeData} method to update the "color" edge attribute. <>= ftSub <- extractFromTo(resWt) edgeDataDefaults(male, attr = "color") <- "white" edgeDataDefaults(female, attr = "color") <- "white" edgeData(male, from = as.character(ftSub[,"from"]), to = as.character(ftSub[,"to"]), attr = "color") <- "red" edgeData(female, from = as.character(ftSub[,"from"]), to = as.character(ftSub[,"to"]), attr = "color") <- "red" @ \section{MultiGraphs} \subsection{Introduction} The \Rclass{MultiGraph} class can be used to represent graphs that share a single node set and have have one or more edge sets, each edge set representing a different type of interaction between the nodes. An \Robject{edgeSet} object can be described as representing the relationship between a set of from-nodes and to-nodes which can either be directed or undirected. A numeric value (weight) indicates the strength of interaction between the connected edges. Self loops are permitted in the \Rclass{MultiGraph} class representation (i.e. the from-node is the same as the to-node). The \Rclass{MultiGraph} class supports the handling of arbitrary node and edge attributes. These attributes are stored separately from the edge weights to facilitate efficient edge weight computation. We shall load the \Rpackage{graph} and \Rpackage{RBGL} packages that we will be using. We will then create a \Rclass{MultiGraph} object and then spend some time examining some of the different functions that can be applied to \Rclass{MultiGraph} objects. <>= library(graph) library(RBGL) @ \subsection{ A simple MultiGraph example} We proceed to construct a \Rclass{MultiGraph} object with directed \Robject{edgeSets} to represent the flight connections of airlines Alaska, Delta, United and American that fly between the cities Baltimore, Denver, Houston, Los Angeles, Seattle and San Francisco. For our example, the cities represent the nodes of the \Rclass{MultiGraph} and we have one \Robject{edgeSet} each for the airlines. Each \Robject{edgeSet} represents the flight connections from an originating city(\Rcode{from}) to the destination city(\Rcode{to}). The weight represents the fare for flying between the \Rcode{from} and \Rcode{to} cities. For each airline, we proceed to create a \Rclass{data.frame} containing the originating city, the destination city and the fare. <>= ft1 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA"), to = c("SFO", "LAX", "LAX", "SEA", "DEN"), weight = c( 90, 96, 124, 115, 259)) ft2 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA", "DEN", "SEA", "IAH", "DEN"), to = c("SFO", "LAX", "LAX", "SEA", "DEN", "IAH", "IAH", "DEN", "BWI"), weight= c(169, 65, 110, 110, 269, 256, 304, 256, 271)) ft3 <- data.frame( from = c("SEA", "SFO", "SEA", "LAX", "SEA", "DEN", "SEA", "IAH", "DEN", "BWI"), to = c("SFO", "LAX", "LAX", "SEA", "DEN", "IAH", "IAH", "DEN", "BWI", "SFO"), weight = c(237, 65, 156, 139, 281, 161, 282, 265, 298, 244)) ft4 <- data.frame( from = c("SEA", "SFO", "SEA", "SEA", "DEN", "SEA", "BWI"), to = c("SFO", "LAX", "LAX", "DEN", "IAH", "IAH", "SFO"), weight = c(237, 60, 125, 259, 265, 349, 191)) @ These data frames are then passed to \Rclass{MultiGraph} class constructor as a named \Robject{list}, each member of the list being a \Robject{data.frame} for an airline. A logical vector passed to the \Rcode{directed} argument of the \Rclass{MultiGraph} constructor indicates whether the \Robject{MultiGraph} to be created should have directed or undirected edge sets. <>= esets <- list(Alaska = ft1, United = ft2, Delta = ft3, American = ft4) mg <- MultiGraph(esets, directed = TRUE) mg @ The nodes (cities) of the \Rclass{MultiGraph} object can be obtained by using the \Rmethod{nodes} method. <>= nodes(mg) @ To find the fares for all the flights that originate from SEA for the Delta airline, we can use the \Rmethod{mgEdgeData} method. <>= mgEdgeData(mg, "Delta", from = "SEA", attr = "weight") @ We proceed to add some node attributes to the \Robject{MultiGraph} using the \Rfunction{nodeData} method. Before node attributes can be added, we have to set a default value for each node attribute using the \Rfunction{nodeDataDefuault} method. For our example, we would like to set a default value of square for the node attribute shape. We would like to set the node attribute "shape" for Seattle to the value \Rcode{"triangle"} and that for the cities that connect with Seattle to the value \Rcode{"circle"}. <>= nodeDataDefaults(mg, attr="shape") <- "square" nodeData(mg, n = c("SEA", "DEN", "IAH", "LAX", "SFO"), attr = "shape") <- c("triangle", "circle", "circle", "circle", "circle") @ The node attribute shape for cities we have not specifically assigned a value (such as BWI) gets assigned the default value of "square". <>= nodeData(mg, attr = "shape") @ We then update the edge attribute \Rcode{color} for the Delta airline flights that connect with Seattle to "green". For the remaining Delta flights that connect to other destination in the MultiGraph, we would like to assign a default color of "red". Before edge attributes can be added to the MultiGraph, their default values must be set using the \Rfunction{mgEdgeDataDefaults} method. Subsequently, the \Rfunction{megEdgeData<-} method can be used to update specific edge attributes. <>= mgEdgeDataDefaults(mg, "Delta", attr = "color") <- "red" mgEdgeData(mg, "Delta", from = c("SEA", "SEA", "SEA", "SEA"), to = c("DEN", "IAH", "LAX", "SFO"), attr = "color") <- "green" @ <>= mgEdgeData(mg, "Delta", attr = "color") @ We are only interested in studying the fares for the airlines Alaska, United and Delta and hence would like to create a smaller \Rclass{MultiGraph} object containing edge sets for only these airlines. This can be achieved using the \Rmethod{subsetEdgeSets} method. <>= g <- subsetEdgeSets(mg, edgeSets = c("Alaska", "United", "Delta")) @ We proceed to find out the lowest fares for Alaska, United and Delta along the routes common to them. To do this, we make use of the \Rmethod{edgeSetIntersect0} method which computes the intersection of all the edgesets in a MultiGraph. While computing the intersection of edge sets, we are interesting in retaining the lowest fares in cases where different airlines flying along a route have different fares. To do this, we pass in a named list containing the \Rmethod{weight} function that calculates the minimum of the fares as the input to the \Rmethod{edgeSetIntersect0} method. (The user has the option of specifying any function for appropriate handling of edge attributes ). <>= edgeFun <- list( weight = min) gInt <- edgeSetIntersect0(g, edgeFun = edgeFun) gInt @ The edge set by the \Rmethod{edgeSetIntersect0} operation is named by concatenating the names of the edgeSets passed as input to the function. <>= mgEdgeData(gInt, "Alaska_United_Delta", attr= "weight") @ \subsection{MultiGraph representation of mice gene interaction data. (SAGE)} The C57BL/6J and C3H/HeJ mouse strains exhibit different cardiovascular and metabolic phenotypes on the hyperlipidemic apolipoprotein E (Apoe) null background. The interaction data for the genes from adipose, brain, liver and muscle tissue samples from male and female mice were studied. This interaction data for the various genes is included in the \Rpackage{graph} package as a list of \Robject{data.frame}s containing information for \Rcode{from-gene}, \Rcode{to-gene} and the strength of interaction \Rcode{weight} for each of the tissues studied. We proceed to load the data for male and female mice. <>= data("esetsFemale") data("esetsMale") names(esetsFemale) head(esetsFemale$brain) @ The \Robject{esetsFemale} and \Robject{esetsMale} objects are a named \Robject{list} of data frames corresponding to the data obtained from adipose, brain, liver and muscle tissues for the male and female mice that were studied. Each data frame has a from, to and a weight column corresponding to the from and to genes that were studied and weight representing the strength of interaction of the corresponding genes. We proceed to create \Rclass{MultiGraph} objects for the male and female data sets by making use of the \Rclass{MultiGraph} constructor, which directly accepts a named list of data frames as the input and returns a MultiGraph with edgeSets corresponding to the names of the data frames. <>= female <- MultiGraph(edgeSets = esetsFemale, directed = TRUE) male <- MultiGraph(edgeSets = esetsMale, directed = TRUE ) male female @ We then select a particular gene of interest in this network and proceed to identify its neighboring genes connected to this gene in terms of the maximum sum of weights along the path that connects the genes for the brain edge set. We are interested in the gene "10024416717" and the sum of the weights along the path that connects this genes to the other genes for the brain tissue. Since the algorithms in the \Rpackage{RBGL} package that we will use to find the edges that are connected to the gene "10024416717" do not work directly with \Rpackage{MultiGraph} objects, we proceed to create \Rcode{graphBAM} objects from the male and female edge sets for the brain tissue. \Rpackage{MultiGraph} objects can be converted to a named list of \Robject{graphBAM} objects using the \Rmethod{graphBAM} method. <>= maleBrain <- extractGraphBAM(male, "brain")[["brain"]] maleBrain femaleBrain <- extractGraphBAM(female, "brain")[["brain"]] @ We then identify the genes connected to gene "10024416717" as well as the sum of the weights along the path that connect the identified genes using the function \Rfunction{bellman.ford.sp} function from the \Rpackage{RBGL} package. <>= maleWt <- bellman.ford.sp(maleBrain, start = c("10024416717"))$distance maleWt <- maleWt[maleWt != Inf & maleWt != 0] maleWt femaleWt <- bellman.ford.sp(femaleBrain, start = c("10024416717"))$distance femaleWt <- femaleWt[femaleWt != Inf & femaleWt != 0] femaleWt @ For the subset of genes we identified, we proceed to add node attributes to our original \Robject{MultiGraph} objects for the male and female data. The node "10024416717" and all its connected nodes are assigned a color attribute "red" while the rest of the nodes are assigned a color color attribute of "gray". <>= nodeDataDefaults(male, attr = "color") <- "gray" nodeData(male , n = c("10024416717", names(maleWt)), attr = "color" ) <- c("red") nodeDataDefaults(female, attr = "color") <- "gray" nodeData(female , n = c("10024416717", names(femaleWt)), attr = "color" ) <- c("red") @ Our \Robject{MultiGraph} objects now contain the required node attributes for the subset of genes that we have narrowed our selection to. For the \Robject{MultiGraph} objects for male and female, we are also interested in the genes that are common to both \Robject{MultiGraph}s. This can be calculated using the \Rfunction{graphIntersect} method. <>= resInt <- graphIntersect(male, female) resInt @ The operations we have dealt with so far only deal with manipulation of \Rclass{MultiGraph} objects. Additional functions will need to be implemented for the visualization of the \Rclass{MultiGraph} objects. \end{document} graph/vignettes/clusterGraph.Rnw0000644000175100017510000000610012607264574020050 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT clusterGraph.Rnw!!! % clusterGraph.tex file will get overwritten. % %\VignetteIndexEntry{clusterGraph and distGraph} %\VignetteDepends{graph, stats} %\VignetteKeywords{Graph, clustering, machine learning} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \begin{document} \title{How To use the clusterGraph and distGraph classes} \maketitle \section*{Introduction} Graphs can be used to help explore different clustering algorithms. While they have not been extensively used in this regard that is probably due to the lack of software rather than for any other reasons. As we demonstrate below, one can easily and naturally compare different aspects of clustering algorithms using these tools. \section*{clusterGraph} A \textit{clusterGraph} is a graph defined on a set of nodes that have been clustered or grouped in some fashion. The grouping must form a partition of the nodes. In this graph all nodes within the same cluster are adjacent while there are no edges between clusters. Thus, each cluster is a complete graph but there are no between cluster edges. <>= library("graph") library("cluster") data(ruspini) pm <- pam(ruspini, 4) cG <- new("clusterGraph", clusters = split(names(pm$clustering), pm$clustering)) nodes(cG) @ We now have a graph that we could perform various operations on. For example, we could try a second clustering algorithm on the same data and see if the two largely agree. <>= library(stats) km = kmeans(ruspini, 4) cG.km = new("clusterGraph", clusters=split(as.character(1:75), km$cluster)) inBoth = intersection(cG.km, cG) @ The graph \Robject{inBoth} is of length \Sexpr{length(inBoth)} indicating that there are that many distinct groups. One could, compute various measures of correspondence between the two clustering algorithms using the graph representation. \section*{distGraph} We use this same data to consider some potential uses for the \Rclass{distGraph} class. Others have considered a similar structure for exploring clustering algorithms. %%FIXME: track down the Butte et al and the Shamir references <<>>= d1 = dist(ruspini) dG = new("distGraph", Dist=d1) rl = NULL j=1 for(i in c(40, 30, 10, 5) ){ nG = threshold(dG, i) rl[[j]] = connComp(nG) j=j+1 } @ We can then examine the components of \Robject{rl} to see how the graph is being reduced. <>= sapply(rl, length) @ <>= dr = range(d1) rl.lens = sapply(rl[[4]], length) @ We see that when we remove all distances that are bigger than 5 units (the range of distances was from \Sexpr{round(dr[1], 3)} to \Sexpr{round(dr[2],3)}) there are still only \Sexpr{length(rl[[4]])} connected components - one of which is of size \Sexpr{max(rl.lens)}. \end{document} graph/vignettes/graph.Rnw0000644000175100017510000003444612607264574016524 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT graph.Rnw!!! % graph.tex file will get overwritten. % %\VignetteIndexEntry{Graph} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \begin{document} \title{How To use the graph package} \maketitle \section{Introduction} The \Rpackage{graph} package provides an implementation of graphs (the kind with nodes and edges) in R. Software infrastructure is provided by three different, but related packages, \begin{description} \item[graph] Provides the basic class definitions and functionality. \item[RBGL] Provides an interface to graph algorithms (such as shortest path, connectivity etc). \item[Rgraphviz] Provides rendering functionality. Different layout algorithms are provided and node plotting, line type, color etc parameters can be controlled by the user. \end{description} A short description of the R classes and methods is given at the end of this document. But here, we begin by creating some graphs and performing different operations on those graphs. The reader will benefit greatly from also have the \Rpackage{Rgraphviz} package available and from using it to render the different graphs as they proceed through these notes. \section{Getting Started} We will first create a graph and then spend some time examining some of the different functions that can be applied to the graph. We will create a random graph as the basis for our explorations (but will delay explaining the creation of this graph until Section~\ref{sec:rg}). First we attach the \Rpackage{graph} package and create a random graph (this is based on the Erdos-Renyi model for random graphs). <>= library(graph) set.seed(123) g1 = randomEGraph(LETTERS[1:15], edges=100) g1 @ We can next list the nodes in our graph, or ask for the degree (since this is an undirected graph we do not distinguish between in-degree and out-degree). For any node in \Robject{g1} we can find out which nodes are adjacent to it using the \Rfunction{adj} function. Or we can find out which nodes are accessible from it using the \Rfunction{acc} function. Both functions are \textit{vectorized}, that is, the user can supply a vector of node names, and each returns a named list. The names of the list elements correspond to the names of the nodes that were supplied. For \Rfunction{acc} the elements of the list are named vectors, the names correspond to the nodes that can be reached and the values correspond to their distance from the starting node. <>= nodes(g1) degree(g1) adj(g1, "A") acc(g1, c("E", "G")) @ One can obtain subgraphs of a given graph by specifying the set of nodes that they are interested in. A subgraph is actually a copy of the relevant part of the original graph. A subgraph is the set of specified nodes plus any edges between them. We can also compute the boundary of a subgraph. The boundary is the set of all nodes in the original graph that have an edge to the specified subgraph. The \Rfunction{boundary} returns a named list with one component for each node in the subgraph. The elements of this list are vectors which contain all nodes in the original graph that have an edge to that element of the subgraph. We also demonstrate two edge related functions in the code chunk below. One retrieves all edges from a graph and is called \Rfunction{edges} while the other retrieves the edge weights and is called \Rfunction{edgeWeights}. <>= sg1 = subGraph(c("A", "E", "F","L"), g1) boundary(sg1, g1) edges(sg1) edgeWeights(sg1) @ \subsection{Some Algebraic Manipulations} The examples here originally came from Chris Volinsky at AT\&T, but have been modified in places as the \Rpackage{graph} package has evolved. In the code chunk below we demonstrate how to create a graph \textit{from scratch}. In this code chunk two graphs are created, \Robject{gR} and \Robject{gR2}, the first is undirected while the second is a directed graph. <>= V <- LETTERS[1:4] edL1 <- vector("list", length=4) names(edL1) <- V for(i in 1:4) edL1[[i]] <- list(edges=c(2,1,4,3)[i], weights=sqrt(i)) gR <- graphNEL(nodes=V, edgeL=edL1) edL2 <- vector("list", length=4) names(edL2) <- V for(i in 1:4) edL2[[i]] <- list(edges=c(2,1,2,1)[i], weights=sqrt(i)) gR2 <- graphNEL(nodes=V, edgeL=edL2, edgemode="directed") @ New graphs can be constructed from these graphs in many different ways but in all cases the existing graph itself is not altered, but rather a copy is made and the changes are carried out on that copy. Nodes and or edges can be added to the graphs using the functions \Rfunction{addNode}, \Rfunction{addEdge}, \Rfunction{removeNode} and \Rfunction{removeEdge}. All functions will take a vector of nodes or edges and add or remove all of them at one time. One other function in this family is \Rfunction{combineNodes}, this function takes a vector of nodes and a graph and combines those nodes into a single new node (the name of which must be supplied). The function \Rfunction{clearNode} removes all edges to the specified nodes. <>= gX = addNode(c("E", "F"), gR) gX gX2 = addEdge(c("E", "F", "F"), c("A", "D", "E"), gX, c(1,2,3)) gX2 gR3 = combineNodes(c("A","B"), gR, "W") gR3 clearNode("A", gX) @ When working with directed graphs it is sometimes of interest to find the \textit{underlying} graph. This is the graph with all edge orientation removed. The function \Rfunction{ugraph} provides this functionality. <>= ##find the underlying graph ugraph(gR2) @ Other operations that can be carried out on graphs, that are of some interest, are unions, intersections and complements. We have take a rather specialized definition of these operations and it is not one that is widely used, but it is very useful for the bioinformatics and computational biology projects that we are working on. For two or more graphs all with \textbf{the same nodes} we define: \begin{description} \item[union] to be the graph with the same set of nodes as the inputs and edges between any two nodes that were connected in any one graph. \item[intersection] to be the graph with the same set of nodes as the inputs and with edges between two nodes if there was an edge in all graphs. \item[complement] to be the graph with the same set of nodes as its input and edges in the complement if there were none in the original graph. \end{description} In the code chunk below we generate a random graph and then demonstrate the concepts of union, intersection and complement. <>= set.seed(123) gR3 <- randomGraph(LETTERS[1:4], M<-1:2, p=.5) x1 <- intersection(gR,gR3) x1 x2 <- union(gR,gR3) x2 x3 <- complement(gR) x3 @ Notice that while the graphs \Robject{gR} and \Robject{gR2} have different sets of edge weights these are lost when the \Rmethod{union}, \Rmethod{intersection} and \Rmethod{complement} are taken. It is not clear how they should be treated and in the current implementation they are ignored and replaced by weight 1 in the output. \section{Random Graphs} \label{sec:rg} Three basic strategies for finding random graphs have been implemented: \begin{description} \item[randomEGraph] A random edge graph. In this graph edges are randomly generated according to a specified probability, or the number of edges can be specified and they are randomly assigned. \item[randomGraph] For this graph the number of nodes is specified as well as some latent factor. The user provides both the node labels and a factor with some fixed number of levels. Each node is randomly assigned levels of the factor and then edges are created between nodes that share the same levels of the factor. \item[randomNodeGraph] A random graph with a pre-specified node distribution is generated. \end{description} The function \Rfunction{randomEGraph} will generate graphs using the random edge model. In the code chunk below we generate a graph, \Robject{g1} on 12 nodes (with labels from the first 12 letters of the alphabet) and specify that the probability of each edge existing is $0.1$. The graph \Robject{g2} is on the same set of nodes but we specify that it will contain 20 edges. <>= set.seed(333) V = letters[1:12] g1 = randomEGraph(V, .1) g1 g2 = randomEGraph(V, edges=20) g2 @ The function \Rfunction{randomGraph} generates graphs according to the latent variable model. In the code chunk bel <>= set.seed(23) V <- LETTERS[1:20] M <- 1:4 g1 <- randomGraph(V, M, .2) @ Our last example involves the generating random graphs with a prespecified node degree distribution. In the example below we require a node degree distribution of 1, 1, 2 and 4. We note that self-loops are allowed (and if someone wants to provide the code to eliminate them, we would be glad to have it). <>= set.seed(123) c1 <- c(1,1,2,4) names(c1) <- letters[1:4] g1 <- randomNodeGraph(c1) @ \section{Some Graph Algorithms} In addition to the simple algebraic operations that we have demonstrated in the preceeding sections of this document we also have available implementations of some more sophisticated graph algorithms. If possible though, one should use the algorithms provided in the \Rpackage{RBGL}. The function \Rfunction{connComp} returns a list of the connected components of the given graph. For a \textit{directed graph} or \textit{digraph} the underlying graph is the graph that results from removing all direction from the edges. This can be achieved using the function \Rfunction{ugraph}. A weakly connected component of a digraph is one that is a connected component of the underlying graph and this is the default behavior of \Rfunction{connComp}. <>= g1 g1cc <- connComp(g1) g1cc g1.sub <- subGraph(g1cc[[2]], g1) g1.sub @ Another useful set of graph algorithms are the so-called searching algorithm. For the \Rpackage{graph} package we have implemented the depth first searching algorithm as described in Algorithm 4.2.1 of \cite{GrossYellen}. More efficient and comprehensive algorithms are available through the \Rpackage{RBGL} package. The returned value is a named vector. The names correspond to the nodes of the graph and the values correspond to the distance (often the number of steps) or sum of the edgeweights along the path to that node. <>= DFS(gX2, "E") @ \section{Special Types of Graphs} We have found it useful to define a few special types or classes of graphs for some bioinformatic problems but they likely have broader applicability. All of the functions described above should have methods for these special types of graphs (although we may not yet have implemented all of them, please let the maintainer know if you detect any omissions). First is the \Robject{clusterGraph}. A cluster graph is a graph where the nodes are separated into groups or clusters. Within a cluster all nodes are connected (a complete graph) but between clusters there are no edges. Such graphs are useful representations of the output of clustering algorithms. <>= cG1 <- new("clusterGraph", clusters=list(a=c(1,2,3), b=c(4,5,6))) cG1 acc(cG1, c("1", "2")) @ The other special type of graph that we have implemented is based on distances. This graph is completely connected but the edge weights come from inter-node distances (perhaps computed from an expression experiment). <>= set.seed(123) x <- rnorm(26) names(x) <- letters library(stats) d1 <- dist(x) g1 <- new("distGraph", Dist=d1) g1 @ \section{Coercion} There are very many different ways to represent graphs. The one chosen for our basic implementation is a node and edge-list representation. However, many others use an adjacency matrix representation. We provide a number of different tools that should help users coerce graphs between the different representations. Coercion from an adjacency matrix to a \Rclass{graphNEL} object requires a numeric matrix with both row and column names. These are taken to define the nodes of the graph and the edge weights in the resultant graph are determined by the values in the array (weights zero are taken to indicate the absence of an edge). The function \Rfunction{ftM2adjM} converts a \textit{from-to} matrix into an adjacency matrix. Conversion to a \Rclass{graphNEL} graph can be carried out using the \Rfunction{as} method for that class. An \texttt{aM} is an affiliation matrix which is frequently used in social networks analysis. The rows of \texttt{aM} represent actors, and the columns represent events. A one, \texttt{1}, in the ith row and jth column represents the affiliation of the ith actor with the jth event. The function \Rfunction{aM2bpG} coerces a \texttt{aM} into an instance of the \Rclass{graphNEL} where the nodes are both the actors and the events (there is currently no bipartite graph representation, although one could be added). The two functions \Rfunction{sparseM2Graph} and \Rfunction{graph2SparseM} provide coercion between \Rclass{graphNEL} instances and sparse matrix representations. Currently we rely on the \Rpackage{SparseM} of Koncker and Ng for the sparse matrix implementation. @ \subsection{Classes} We briefly review some of the class structure here and refer the reader to the technical documentation for this package for more details. The basic class, \Rclass{graph}, is a virtual class and all other classes will extend this class. There are three main implementations available. Which is best will depend on the particular data set and what the user wants to do with it. The only slot defined in the virtual class is \Robject{edgemode} which can be either \textit{directed} or \textit{undirected} indicating whether the edges are directed or not. The class \Rclass{graphNEL} is a node and edge-list representation of a graph. That is the graph is comprised of two components a list of nodes and a list of the out edges for each node. The class \Rclass{graphAM} is an adjacency matrix implementation. It will be developed next and will use the \Rpackage{SparseM} package if it is available. The class \Rclass{clusterGraph} is a special form of graph for clustering. In this graph each cluster is a completely connected component (a clique) and there are no between cluster edges. \end{document} graph/vignettes/graphAttributes.Rnw0000644000175100017510000001367012607264574020567 0ustar00biocbuildbiocbuild% % NOTE -- ONLY EDIT howtogenefilter.Rnw!!! % Biobase.tex file will get overwritten. % %\VignetteIndexEntry{Attributes for Graph Objects} %\VignetteDepends{graph} %\VignetteKeywords{Graph} %\VignettePackage{graph} \documentclass{article} \usepackage{hyperref} \textwidth=6.2in \textheight=8.5in \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\classdef}[1]{% {\em #1} } \newcommand{\myincfig}[3]{\begin{figure}[htbp] \begin{center} \includegraphics[width=#2]{#1} \caption{\label{#1}#3} \end{center} \end{figure}} \begin{document} \title{Attributes for Graph Objects} \author{Seth Falcon} \maketitle \section{Introduction} The \Rpackage{graph} package provides representations of graphs (nodes and edges) as S4 classes. This vignette demonstrates how to add arbitrary node and edge attributes to graph objects. First, we create a graph to use as an example. We will work with a \Rclass{graphAM-class} instance, however, any subclass of \Rclass{graph-class} would work. See Figure~\ref{foo}. <>= library("graph") mat <- matrix(c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0), byrow=TRUE, ncol=4) rownames(mat) <- letters[1:4] colnames(mat) <- letters[1:4] @ <>= g1 <- graphAM(adjMat=mat) @ <>= if (require("Rgraphviz")) { gn = as(g1, "graphNEL") plot(gn, nodeAttrs=makeNodeAttrs(gn, shape="circle", fillcolor="orange")) } else { plot(1, 1, main="Rgraphviz required for this plot") } @ \myincfig{foo}{0.33\textwidth}{The graph \Robject{g1}.} \section{Edge Attributes} \subsection{Default edge attributes} All edges in a graph support the same set of attributes. The set of supported attributes can be defined and accessed using the \Rmethod{edgeDataDefaults} method. A new graph instance will not have any edge attributes defined. % <>= edgeDataDefaults(g1) @ When a new edge attribute is defined, a default value must be specified. Here we will define two edge attributes: \Rcode{weight} and \Rcode{code} and specify a default value for each one. <>= edgeDataDefaults(g1, "weight") <- 1 edgeDataDefaults(g1, "code") <- "plain" edgeDataDefaults(g1) @ The default value for a particular attribute can be obtained by specifying the attribute name in the call to \Rmethod{edgeDataDefaults}. <>= edgeDataDefaults(g1, "weight") @ \subsection{Getting edge attributes} Edge attributes are set and accessed using the \Rmethod{edgeData} method. Only attributes defined using \Rmethod{edgeDataDefaults} can be accessed using \Rmethod{edgeData}. If an attribute has not be set using \Rmethod{edgeData} for a given edge, then the default value is used. <>= edgeData(g1, from="a", to="d", attr="weight") edgeData(g1, from="a", attr="weight") edgeData(g1, to="a", attr="weight") allAttrsAllEdges <- edgeData(g1) weightAttrAllEdges <- edgeData(g1, attr="weight") @ \subsection{Setting edge attributes} Attributes are set using the replacement form of \Rmethod{edgeData}. This method allows the user to update the attribute for single edge, set the attributes for a collection of edges to a single value, and to set the attributes for a collection of edges to different values specified by a vector of values. <>= edgeData(g1, from="a", to="d", attr="weight") <- 2 edgeData(g1, from="a", attr="code") <- "fancy" edgeData(g1, from="a", attr="weight") edgeData(g1, from="a", attr="code") @ We can set the attributes for multiple edges to a single value. <>= f <- c("a", "b") t <- c("c", "c") edgeData(g1, from=f, to=t, attr="weight") <- 10 edgeData(g1, from=f, to=t, attr="weight") @ It is also possible to set multiple attributes to different values in a single call to \Rmethod{edgeData}. <>= edgeData(g1, from=f, to=t, attr="weight") <- c(11, 22) edgeData(g1, from=f, to=t, attr="weight") @ Finally, we can set the an attribute to a vector of values by packing it into a list: % <>= edgeData(g1, from="a", to="d", attr="code") <- list(1:10) edgeData(g1, from=f, to=t, attr="weight") <- mapply(c, f, t, "e", SIMPLIFY=FALSE) edgeData(g1, from="a", to="d", attr="code") edgeData(g1, from=f, to=t, attr="weight") @ \section{Node Attributes} \subsection{Default node attributes} Like edge attributes, all nodes in a graph support the same set of attributes. The supported set of attributes and their default values is accessed using the \Rmethod{nodeDataDefaults} method. The interface is similar to \Rmethod{edgeDataDefaults}. <>= nodeDataDefaults(g1) nodeDataDefaults(g1, attr="weight") <- 1 nodeDataDefaults(g1, attr="type") <- "vital" nodeDataDefaults(g1) nodeDataDefaults(g1, "weight") @ As with edge attributes, default values are required for each node attribute. The default value is used as the node attribute for all nodes in the graph that have not had their attribute value explicitly set. Attribute values can be any R object. \subsection{Getting and setting node attributes} Once a node attribute has been defined and given a default value using \Rmethod{nodeDataDefaults}, individual node attributes can be accessed using \Rmethod{nodeData}. <>= nodeData(g1, n="a") nodeData(g1, n="a", attr="weight") <- 100 nodeData(g1, n=c("a", "b"), attr="weight") nodeData(g1, n=c("a", "b"), attr="weight") <- 500 nodeData(g1, n=c("a", "b"), attr="weight") nodeData(g1, n=c("a", "b"), attr="weight") <- c(11, 22) nodeData(g1, n=c("a", "b"), attr="weight") @ <>= ## We need to reconcile this #g2 <- as(g1, "graphNEL") #edgeWeights(g2) @ \end{document}